[
  {
    "path": ".gitignore",
    "content": "/.idea\n/cache"
  },
  {
    "path": ".htaccess",
    "content": "<IfModule mod_rewrite.c>\n RewriteEngine on\n RewriteBase /\n #RewriteCond %{REQUEST_URI} !((.*).jpg|.jpeg|.bmp|.gif|.png|.js|.css|.tts|.woff )$\n RewriteCond %{REQUEST_FILENAME} !-d\n RewriteCond %{REQUEST_FILENAME} !-f\n RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d\n RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f\n #RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]\n RewriteRule ^(.*)$ index.php [E=PATH_INFO:$1,QSA,PT,L]\n</IfModule>"
  },
  {
    "path": "404.html",
    "content": "<!doctype html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n<title>404</title>\n<style>\n\tbody{\n\t\tbackground-color:#444;\n\t\tfont-size:14px;\n\t}\n\th3{\n\t\tfont-size:60px;\n\t\tcolor:#eee;\n\t\ttext-align:center;\n\t\tpadding-top:30px;\n\t\tfont-weight:normal;\n\t}\n</style>\n</head>\n\n<body>\n<h3>404，您请求的文件不存在!</h3>\n</body>\n</html>\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\r\n\r\nCopyright (c) 2021 如沐春\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n"
  },
  {
    "path": "README.md",
    "content": "[![极致CMS建站系统](https://www.jizhicms.cn/header_1920x700.png)](http://down.jizhicms.cn/jizhicms.zip)\r\n\r\n<h1 align=\"center\">极致CMS建站系统</h1>\r\n\r\n<p align=\"center\">一款免费开源的PHP建站CMS系统，可以免授权商业使用该系统。</p>\r\n\r\n<p align=\"center\">\r\n<img src=\"https://img.shields.io/badge/jizhicms-v2.0-important.svg\" title=\"jizhicms\" />\r\n<img src=\"https://img.shields.io/badge/PHP-5.6+-blue.svg\" title=\"PHP\" />\r\n<img src=\"https://img.shields.io/badge/MySQL-4.8+-red.svg\" title=\"MySQL\" />\r\n</p>\r\n<p align=\"center\">\r\n<img src=\"https://img.shields.io/badge/Apache-green.svg\" title=\"Apache\" />\r\n<img src=\"https://img.shields.io/badge/Linux-success.svg\" title=\"Linux\" />\r\n<img src=\"https://img.shields.io/badge/MIT-brightgreen.svg\" title=\"MIT\" />\r\n</p>\r\n<p align=\"center\">\r\n\t<img src=\"https://gitee.com/Cherry_toto/jizhicms/badge/star.svg?theme=dark\" alt=\"Gitee stars\"/>  \r\n\t<img src=\"https://img.shields.io/github/stars/Cherry-toto/jizhicms\" alt=\"GitHub stars\"/>\r\n</p>\r\n\r\n官网：[www.jizhicms.cn](https://www.jizhicms.cn) | [www.jizhicms.com](https://www.jizhicms.com) | [应用市场](https://app.jizhicms.cn)   \r\n演示：[demo.jizhicms.cn](https://demo.jizhicms.cn)   \r\n后台：[https://demo.jizhicms.cn/admin.php](https://demo.jizhicms.cn/admin.php) [ 账户：test 密码：123456 ]  \r\n单入口后台：[https://demo.jizhicms.cn/index.php/admins](https://demo.jizhicms.cn/index.php/admins) [ 账户：test 密码：123456 ]  \r\n文档：[https://help.jizhicms.cn](https://help.jizhicms.cn)   \r\n工具：[https://h.jizhicms.cn](https://h.jizhicms.cn)   \r\n作者：留恋风（QQ：2581047041 微信：TF-2581047041）  \r\n商务合作：13660240863    \r\nQQ交流群：774764507 , 869094463 , 651403450 [【加群】](https://jq.qq.com/?_wv=1027&k=6zjN1tgq) \r\n\r\n## 极致CMS建站系统2.0 重磅更新！\r\n> 支持后台在线模板，可以下载和更新模板，提供更多免费模板  \r\n> 支持后台多语言本地化配置  \r\n> 更新一套精美模板免费使用  \r\n> 桌面配置更具人性化设定，支持更多图标选择及菜单名称自定义  \r\n> 更具通俗化目录结构，让你一目了然  \r\n> 字段重构，前台发布表单字段设定，列表字段控制，多种类型字段让你自由发挥创作！  \r\n> 后台增加模板自定义方式，让你二开更方便！  \r\n> 后台插件模板接口开放设定，可以自由维护自己的客户进行客制化服务！  \r\n> 免费开源，代码无任何加密，可免费商用，前台界面可以去除版权显示，支持MIT协议，真正开源免费！  \r\n\r\n   \r\n\r\n*****\r\n## 安装环境\r\n* jizhicms的开发语言是PHP，支持PHP5.6+，发布之日起就已经兼容到PHP7.4版本，推荐使用PHP7.0版本以上。\r\n* 安装环境建议Linux服务器，当然Windows也是可以安装的，云服务器建议安装宝塔面板 [查看](http://www.bt.cn/)\r\n* 无论是Windows还是Linux建议安装Apache、mysql、phpMyAdmin配件 \r\n* 本系统当前版本2.0仅支持mysql数据库\r\n\r\n## 安装须知  \r\n* PHP5.6+   \r\n* MySQL4.8+，数据编码 <b>utf-8</b> 或者 <b>utf8-general-ci</b>   \r\n* 部署环境必须支持伪静态  \r\n* 支持Apache、Nginx、IIS     \r\n\r\n## 开始安装  \r\n1. 下载源码并解压源码到空间根目录(www)      \r\n2. 浏览器访问 http://127.0.0.1/install/ (本地环境) http://绑定域名/install/ (空间服务器环境)   \r\n3. 进入安装步骤，逐步进行安装   \r\n4. 初次安装请安装备份或者测试数据    \r\n5. 安装完毕后，为了安全，请删除根目录intall安装文件夹    \r\n\r\n## 网站搬家   \r\n1. 进入后台--【系统扩展】--【数据库列表】，点击 <b>备份数据库</b> 将当前数据库备份    \r\n2. 将cache文件夹下面的缓存文件全部删除，并在根目录放置官方源码里的install文件夹        \r\n3. 将整个根目录打包下载到本地    \r\n4. 将打包后的压缩包上传到新空间   \r\n5. 按照【开始安装】的步骤进行安装程序     \r\n6. 安装第二步填入数据库账号密码后，选择你最新备份的数据库，点击进行安装    \r\n7. 安装完毕，为了安全，请删除根目录intall安装文件夹   \r\n\r\n## 版权声明\r\n![极致CMS 2.0版权证明](https://www.jizhicms.cn/copyright.png)\r\n\r\n## 支持协议  \r\n[MIT](https://gitee.com/Cherry_toto/jizhicms/blob/2.0/LICENSE)\r\n\r\n![极致CMS建站系统](https://www.jizhicms.cn/footer_1920x273.png)\r\n\r\n"
  },
  {
    "path": "SECURITY.md",
    "content": "## Security Policy 安全策略\n\n### Supported Versions 支持的版本\n| Version | Supported          |\n| ------- | ------------------ |\n| 2.0     |    [ ✓ ]           |\n| 1.9.x   |    [ ✓ ]           |\n| < 1.9.x |    [ × ]           |\n\n### Reporting a Vulnerability 报告漏洞\nWe strongly encourage you to report security vulnerabilities to our private security mailing list: ttuuffuu@163.com or 2581047041@qq.com - first, before disclosing them in any public forums.\n\nThis is a private mailing list where only members of the JiZhiCMS internal security team are subscribed to, and is treated as top priority.\n\n我们强烈建议您向我们的私人安全邮件列表报告安全漏洞：`ttuuffuu@163.com` 或 `2581047041@qq.com`，在任何公开论坛上披露之前。\n这是一个私人邮件列表，只有 `JiZhiCMS` 内部安全团队的成员才能订阅，并被视为最高优先级。"
  },
  {
    "path": "app/admin/c/AdminController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass AdminController extends CommonController\n{\n\n\t\n\t\n\tpublic function group(){\n\t\t$page = new Page('Level_group');\n\t\t$sql = ' 1=1 ';\n\t\tif($this->admin['gid']!=1){\n\t\t\t$sql.=\" and id!=1 \";\n\t\t}\n\t\t$data = $page->where($sql)->orderby('id desc')->page($this->frparam('page',0,1))->go();\n\t\t$pages = $page->pageList();\n\t\t\n\t\t$this->pages = $pages;\n\t\t$this->lists = $data;\n\t\t$this->sum = $page->sum;\n\t\t$this->display('group-list');\n\t}\n\tfunction group_del(){\n\t\t\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t//检查是否有管理员\n\t\t\tif(M('level')->getCount(array('gid'=>$id))>0){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('该角色下存在用户，请先移除用户再删除！')));\n\t\t\t}\n\t\t\tif($id==1){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败，该分组不允许删除！')));\n\t\t\t}\n\t\t\t$data = M('level_group')->find(array('id'=>$id));\n\t\t\tif(M('level_group')->delete(array('id'=>$id))){\n\t\t\t\t$w['molds'] = 'level_group';\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['name'];\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\tM('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败，请重试！')));\n\t\t\t}\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t}\n\t\t\n\t\t\n\t}\n\t\n\tfunction groupedit(){\n\t\t$this->fields_biaoshi = 'level_group';\n\t\tif($this->frparam('go')==1){\n\t\t\t$data = $this->frparam();\n\t\t\tif($this->admin['gid']!=1 && $this->frparam('isadmin')==1){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败，您的权限不足！')));\n\t\t\t}\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['ischeck'] = $this->frparam('ischeck');\n\t\t\t$data['description'] = $this->frparam('description',1);\n\t\t\t$data['paction'] = (count($this->frparam('ruler',2))>0)?','.implode(',',$this->frparam('ruler',2)).',':'';\n\t\t\t$data['tids'] = (count($this->frparam('tids',2))>0)?','.implode(',',$this->frparam('tids',2)).',':'';\n\t\t\tif(M('level_group')->update(array('id'=>$data['id']),$data)){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败，请重新提交！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t$this->data = M('level_group')->find(['id'=>$this->frparam('id')]);\n\t\t$rulers = M('ruler')->findAll(null,'id ASC');\n\t\t$ruler_top = array();\n\t\t$ruler_children = array();\n\t\tforeach($rulers as $v){\n\t\t\tif($v['pid']==0){\n\t\t\t\t$ruler_top[]=$v;\n\t\t\t}else{\n\t\t\t\t$ruler_children[$v['pid']][]=$v;\n\t\t\t}\n\t\t}\n\t\t$this->ruler_top = $ruler_top;\n\t\t$this->ruler_children = $ruler_children;\n\t\t\n\t\tif(!$this->data){\n\t\t\tError(JZLANG('没有该角色！'));\n\t\t}\n\t\t\n\t\t$this->display('group-edit');\n\t}\n\t\n\tfunction groupadd(){\n\t\t$this->fields_biaoshi = 'level_group';\n\t\tif($this->frparam('go')==1){\n\t\t\t$data = $this->frparam();\n            if($this->admin['gid']!=1 && $this->frparam('isadmin')==1){\n                JsonReturn(array('code'=>1,'msg'=>JZLANG('您的权限不足！')));\n            }\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['ischeck'] = $this->frparam('ischeck');\n\t\t\t$data['description'] = $this->frparam('description',1);\n\t\t\t$data['paction'] = (count($this->frparam('ruler',2))>0)?','.implode(',',$this->frparam('ruler',2)).',':'';\n\t\t\t$data['tids'] = (count($this->frparam('tids',2))>0)?','.implode(',',$this->frparam('tids',2)).',':'';\n\t\t\tif(M('level_group')->add($data)){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败，请重新提交！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t$rulers = M('ruler')->findAll(null,'id ASC');\n\t\t$ruler_top = array();\n\t\t$ruler_children = array();\n\t\tforeach($rulers as $v){\n\t\t\tif($v['pid']==0){\n\t\t\t\t$ruler_top[]=$v;\n\t\t\t}else{\n\t\t\t\t$ruler_children[$v['pid']][]=$v;\n\t\t\t}\n\t\t}\n\t\t$this->ruler_top = $ruler_top;\n\t\t$this->ruler_children = $ruler_children;\n\t\t\n\t\t\n\t\t\n\t\t$this->display('group-add');\n\t}\n\tpublic function change_group_status(){\n\t\t$id = $this->frparam('id',1);\n\t\tif(!$id){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t}\n\t\tif($id==1){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败，该分组不允许修改！')));\n\t\t}\n\t\t\n\t\t$x = M('Level_group')->find('id='.$id);\n\t\tif($x['isagree']==1){\n\t\t\t$x['isagree']=0;\n\t\t}else{\n\t\t\t$x['isagree']=1;\n\t\t}\n\t\tM('Level_group')->update(array('id'=>$id),array('isagree'=>$x['isagree']));\n\t}\n\t\n\tpublic function adminlist(){\n\t\t\n\t\t$data = $this->frparam();\n\t\t$res = molds_search('level',$data);\n\t\t$get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n\t\t$this->fields_search = $res['fields_search'];\n\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>'level','islist'=>1),'orders desc');\n\t\t$this->username = $this->frparam('username',1);\n\t\t$this->endtime = $this->frparam('end',1);\n\t\t$this->status = $this->frparam('status');\n\t\t$this->starttime = $this->frparam('start',1);\n\t\tif($this->frparam('ajax')){\n\t\t\t $admin = adminInfo($_SESSION['admin']['id']);\n\t\t\t$page = new Page('level');\n\t\t\t$sql = ' 1=1 ';\n\t\t\tif($this->frparam('status')){\n\t\t\t\t$status = $this->frparam('status')==1 ? 1 : 0;\n\t\t\t\t$sql .= ' and status='.$status;\n\t\t\t}\n\t\t\t\n\t\t\tif($this->frparam('username',1)){\n\t\t\t\t$sql .= \" and name like '%\".$this->frparam('username',1).\"%' \";\n\t\t\t}\n\t\t\t\n\t\t\t//只有超级管理员有权限看到整个列表\n\t\t\tif($this->admin['gid']!=1){\n\t\t\t\t$sql.= \" and gid!=1 \";\n\t\t\t}\n\t\t\t\n\t\t   \n\t\t\tif($this->frparam('start',1)){\n\t\t\t\t$time = strtotime($this->frparam('start',1));\n\t\t\t\t\n\t\t\t\t$sql .= \" and regtime >= \".$time;\n\t\t\t\t\n\t\t\t}\n\t\t\tif($this->frparam('end',1)){\n\t\t\t\t$end = strtotime($this->frparam('end',1).' 23:59:59');\n\t\t\t\t$sql .= \" and regtime <= \".$end;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$sql .= $get_sql;\n\t\t\t\n\t\t\t\n\t\t\t$lists = $page->where($sql)->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t$pages = $page->pageList();\n\t\t\t\n\t\t\t$ajaxdata = [];\n\t\t\tforeach($lists as $k=>$v){\n\t\t\t\t$v['group'] = get_info_table('level_group',['id'=>$v['gid']],'name');\n\t\t\t\t$v['new_logintime'] = $v['logintime']!=0 ? date('Y-m-d H:i:s',$v['logintime']) : '-';\n\t\t\t\t$v['new_regtime'] = $v['regtime']!=0 ? date('Y-m-d H:i:s',$v['regtime']) : '-';\n\t\t\t\t$v['edit_url'] = U('Admin/adminedit',array('id'=>$v['id']));\n\t\t\t\tforeach($this->fields_list as $vv){\n\t\t\t\t\t$v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n\t\t\t\t}\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$this->lists = $lists;\n\t\t\t$this->page = $pages;\n\t\t\t$this->sum = $page->sum;\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t}\n\t\t\n       \n\t\t$this->display('admin-list');\n\t}\n\t\n\tpublic function adminedit(){\n\t\t$this->fields_biaoshi = 'level';\n\t\t$id = $this->frparam('id',1);\n\t\tif($this->frparam('go')==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'level');\n\t\t\t$data['gid'] = $this->frparam('gid',0,$this->admin['gid']);\n\t\t\t//防止越权操作\n\t\t\t$change_admin = M('level')->find(['id'=>$id]);\n\t\t\tif($this->admin['gid']!=1 && $change_admin['gid']==1){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('您没有权限操作！')));\n\t\t\t}\n\t\t\t\n\t\t\t//检查token\n\t\t\t$token = getCache('admin_'.$this->admin['id'].'_token');\n\t\t\tif(!isset($_SESSION['token']) || !$token || $token!=$_SESSION['token']){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'非法操作！'));\n\t\t\t}\n\t\t\t\n\t\t\t$data['email'] = $this->frparam('email',1);\n\t\t\t$data['pass'] = $this->frparam('pass',1);\n\t\t\t$data['repass'] = $this->frparam('repass',1);\n\t\t\t\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['tel'] = $this->frparam('tel',1);\n\t\t\t$data['status'] = $this->frparam('status');\n\t\t\t$data['id'] = $id;\n\t\t\tif($data['id']==0){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n            \n\t\t\tif($data['pass']){\n\t\t\t\tif($data['pass']!=$data['repass']){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('两次密码不同！')));\n\t\t\t\t}\n\t\t\t\t$data['pass'] = md5(md5($data['pass']).'YF');\n\t\t\t}else{\n\t\t\t\tunset($data['pass']);\n\t\t\t}\n\n\t\t\t\n          \n           \n\t\t\t\n\t\t\tif($data['tel']){\n\t\t\t\tif(M('level')->find(\"tel='\".$data['tel'].\"' and id!=\".$data['id'])){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('手机号已被注册！')));\n\t\t\t\t}\t\n\t\t\t}\n\t\t\t\n\t\t\tif(M('level')->find(\"name='\".$data['name'].\"' and id!=\".$data['id'])){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('昵称已被使用！')));\n\t\t\t}\n\t\t\t\n\t\t\tif($data['email']){\n\t\t\t\tif(M('level')->find(\"email='\".$data['email'].\"' and id!=\".$data['id'])){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('邮箱已被使用！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$x = M('level')->update(array('id'=>$data['id']),$data);\n\t\t\tif($x){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t$this->member = M('level')->find('id='.$id);\n\t\tif($_SESSION['admin']['isadmin']==1){\n\t\t\t\n\t\t\t$this->isadmin = true;\n\t\t}else{\n\t\t\t$this->isadmin = false;\n\t\t}\n        $this->groups = M('level_group')->findAll();\n\t\t$token = getRandChar(10);\n\t\t$_SESSION['token'] = $token;\n\t\tsetCache('admin_'.$this->admin['id'].'_token',$token);\n\t\t$this->token = $token;\n\t\t$this->display('admin-edit');\n\t}\n\t\n\tpublic function adminadd(){\n\t\t\n\t\t$this->fields_biaoshi = 'level';\n\t\tif($this->frparam('go')==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'level');\n\t\t\t$data['gid'] = $this->frparam('gid',0,$this->admin['gid']);\n\t\t\t//防止越权操作\n\t\t\tif($this->admin['gid']!=1 && $data['gid']==1){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('您没有权限操作！')));\n\t\t\t}\n\t\t\t//检查token\n\t\t\t$token = getCache('admin_'.$this->admin['id'].'_token');\n\t\t\tif(!isset($_SESSION['token']) || !$token || $token!=$_SESSION['token']){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$data['email'] = $this->frparam('email',1);\n\t\t\t$data['pass'] = $this->frparam('pass',1);\n\t\t\t$data['repass'] = $this->frparam('repass',1);\n\t\t\t\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['tel'] = $this->frparam('tel',1);\n\t\t\t$data['status'] = $this->frparam('status');\n\t\t\t\n\t\t\t$data['regtime'] = time();\n\t\t\t$data['logintime'] = time();\n\t\t\t\n            \n\t\t\tif($data['pass']!=$data['repass']){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('两次密码不同！')));\n\t\t\t}\n\t\t\t$data['pass'] = md5(md5($data['pass']).'YF');\n\t\t\tif($data['tel']){\n\t\t\t\tif(M('level')->find(\"tel='\".$data['tel'].\"'\")){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('手机号已被注册！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(M('level')->find(\"name='\".$data['name'].\"'\")){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('昵称已被使用！')));\n\t\t\t}\n\t\t\tif($data['email']){\n\t\t\t\tif(M('level')->find(\"email='\".$data['email'].\"' \")){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('邮箱已被使用！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t$x = M('level')->add($data);\n\t\t\tif($x){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败！')));\n\t\t\t}\n\t\t\t\n\t\t}\n        $this->admin = $_SESSION['admin'];\n        $this->groups = M('level_group')->findAll();\n\t\tif($_SESSION['admin']['isadmin']==1){\n\t\t\t\n\t\t\t$this->isadmin = true;\n\t\t}else{\n\t\t\t$this->isadmin = false;\n\t\t}\n\t\t\n\t\t$token = getRandChar(10);\n\t\t$_SESSION['token'] = $token;\n\t\tsetCache('admin_'.$this->admin['id'].'_token',$token);\n\t\t$this->token = $token;\n\t\t$this->display('admin-add');\n\t\n\t}\n\t\n\tpublic function change_status(){\n\t\t$id = $this->frparam('id',1);\n\t\tif(!$id || $id==1){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t}\n\t\t\n\t\t$x = M('level')->find('id='.$id);\n\t\t\n\t\t\n\t\tif($x['status']==1){\n\t\t\t$x['status']=0;\n\t\t}else{\n\t\t\t$x['status']=1;\n\t\t}\n\t\tM('level')->update(array('id'=>$id),array('status'=>$x['status']));\n\t}\n\tpublic function admindelete(){\n    \t$id = $this->frparam('id',1);\n        if($id==''){\n        \tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n        }\n\t\t\n\t\tif($id==1){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('系统管理员不能删除！')));\n\t\t}\n\t\t\n        $data = M('level')->find(array('id'=>$id));\n        $x = M('level')->delete(array('id'=>$id));\n\t\t  if($x){\n\t\t\t$w['molds'] = 'level';\n\t\t\t$w['data'] = serialize($data);\n\t\t\t$w['title'] = '['.$data['id'].']'.$data['name'];\n\t\t\t$w['addtime'] = time();\n\t\t\tM('recycle')->add($w);\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t  }else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t  }\n    }\n\n\t\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\tif($this->admin['gid']!=1){\n\t\t\t\t$lists = M('level')->findAll('id in('.$data.')');\n\t\t\t\tforeach($lists as $v){\n\t\t\t\t\tif($v['gid']==1){\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t$all = M('level')->findAll('id in('.$data.')');\n\t\t\tif(M('level')->delete('id in('.$data.')')){\n\t\t\t\tforeach($all as $v){\n\t\t\t\t\t$w['molds'] = 'level';\n\t\t\t\t\t$w['data'] = serialize($v);\n\t\t\t\t\t$w['title'] = '['.$v['id'].']'.$v['name'];\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t}"
  },
  {
    "path": "app/admin/c/ArticleController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass ArticleController extends CommonController\n{\n\t\n\t\n\t//内容管理\n\tfunction articlelist(){\n\t\t$page = new Page('Article');\n\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>'article','islist'=>1),'listorders desc');\n\t\t$this->isshow = $this->frparam('isshow');\n\t\t$this->tid=  $this->frparam('tid');\n\t\t$this->title = $this->frparam('title',1);\n\t\t$this->molds = M('molds')->find(['biaoshi'=>'article']);\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$data = $this->frparam();\n\t\t$res = molds_search('article',$data);\n\t\t$get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n\t\t$this->fields_search = $res['fields_search'];\n\t\t\n\t\tif($this->frparam('ajax')){\n\t\t\t$sql = ' 1=1 ';\n\t\t\tif($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['iscontrol']!=0 && $this->molds['isclasstype']==1){\n\t\t\t\t$a1 = explode(',',$this->tids);\n\t\t\t\t$a2 = array_filter($a1);\n\t\t\t\t$tids = implode(',',$a2);\n\t\t\t\t$sql.=' and tid in('.$tids.') ';\n\n\n\t\t\t}\n\t\t\t$sql .= $get_sql;\n\t\t\t$data = $page->where($sql)->orderby('istop desc,orders desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t$ajaxdata = [];\n\t\t\tforeach($data as $k=>$v){\n\t\t\t\t\n\t\t\t\t$v['view_url'] = gourl($v,$v['htmlurl']);\n\t\t\t\t$v['edit_url'] = U('Article/editarticle',array('id'=>$v['id']));\n\t\t\t\n\t\t\t\tforeach($this->fields_list as $vv){\n\t\t\t\t\t$v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n\t\t\t\t}\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\t\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t$this->display('article-list');\n\t\t\n\t\t\n\t}\n\n\tfunction addarticle(){\n\t\t$this->fields_biaoshi = 'article';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'article');\n            check_field_must($data,'article');\n\t\t\tif(!$this->frparam('seo_title',1) && $this->frparam('config_seotitle')==1){\n\t\t\t\t$data['seo_title'] = $data['title'];\n\t\t\t}\n\t\t\tif(!$this->frparam('description',1) && $this->frparam('config_description')==1){\n\t\t\t\t$data['description'] = newstr(strip_tags($_POST['body']),200);\n\t\t\t}\n\t\t\t$water_models = explode(',',$this->webconf['text_molds']);\n\t\t\tif(in_array('article',$water_models)){\n                if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){\n                    $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']);\n                    //存储\n                    $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2);\n                    $pix_arr = explode('.',$data['litpic']);\n                    $pix = end($pix_arr);\n                    M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>'article']);\n                }else if($this->frparam('litpic',1) && $this->webconf['text_waterlitpic']){\n                    $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->frparam('litpic',1),0);\n                }\n            }\n\t\t\t\n\t\t\tif(!$data['litpic'] && $this->frparam('config_litpic')==1){\n\t\t\t\t$pattern='/<img.*?src=\"(.*?)\".*?>/is';\n\t\t\t\tif($this->frparam('body',1)){\n\t\t\t\t\t$r = preg_match($pattern,stripslashes($data['body']),$matchContent);\n\t\t\t\t\tif($r){\n\t\t\t\t\t\t$data['litpic'] = $matchContent[1];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$data['litpic'] = '';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$data['litpic'] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!$this->frparam('tags',1) && $this->frparam('config_tags')==1){\n\t\t\t\t$data['tags'] = str_replace('，',',',$data['keywords']);\n\t\t\t\tif($data['tags']){\n\t\t\t\t\t$data['tags'] = ','.$data['tags'].',';\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$data['userid'] = $_SESSION['admin']['id'];\n\t\t\t$data['htmlurl'] = $data['tid'] ? $this->classtypedata[$data['tid']]['htmlurl'] : null;\n\t\t\t\n\t\t\t//违禁词检测\n\t\t\tif($this->webconf['mingan'] && $this->frparam('config_filter',1)){\n\t\t\t\t$mingan = explode(',',$this->webconf['mingan']);\n\t\t\t\t$filter = explode(',',$this->frparam('config_filter',1));\n\t\t\t\t$fields = $this->getTableFields('article');\n\t\t\t\tforeach($mingan as $s){\n\t\t\t\t\tif(strpos($s,'{xxx}')!==false){\n\t\t\t\t\t\t$pattern = '/'.str_replace('{xxx}','(.*)',$s).'/';\n\t\t\t\t\t\tforeach($filter as $vv){\n\t\t\t\t\t\t\tif($vv && preg_match($pattern, $data[$vv])){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败').'，【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\n\t\t\t\t\t}else{\n\t\t\t\t\t\tforeach($filter as $vv){\n\t\t\t\t\t\t\tif($vv && strpos($data[$vv],$s)!==false ){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败').'，【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t//处理自定义URL\n\t\t\tif($data['ownurl']){\n\t\t\t\tif(M('customurl')->find(['url'=>$data['ownurl']])){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL！')));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){\n\t\t\t\t$data['isshow'] = $this->frparam('isshow',0,1);\n\t\t\t}else{\n\t\t\t\t$data['isshow'] = 0;\n\t\t\t}\n\t\t\t$data['addtime'] = $data['updatetime'] =  isset($data['addtime']) ? $data['addtime'] : time();\n            //检查是否重复\n            if($this->webconf['hidetitleonliy']){\n                $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']);\n                $onliyfield = '';\n                foreach ($hidetitleonly as $s){\n                    $d = explode('-',$s);\n                    if(strtolower($d[0])=='article'){\n                        $onliyfield = strtolower($d[1]);\n                        break;\n                    }\n                }\n                if($onliyfield){\n                    if(M('article')->find([$onliyfield=>$data[$onliyfield]])){\n                        JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复！')));\n                    }\n                }\n            }\n            //推荐置顶热门\n            if(strpos($data['jzattr'],'1')!==false){\n                $data['istop'] = 1;\n            }else{\n                $data['istop'] = 0;\n            }\n            if(strpos($data['jzattr'],'2')!==false){\n                $data['ishot'] = 1;\n            }else{\n                $data['ishot'] = 0;\n            }\n            if(strpos($data['jzattr'],'3')!==false){\n                $data['istuijian'] = 1;\n            }else{\n                $data['istuijian'] = 0;\n            }\n\t\t\t$r = M('Article')->add($data);\n\t\t\tif($r){\n\t\t\t\tif($data['ownurl']){\n\t\t\t\t\tM('customurl')->add(['molds'=>'article','url'=>$data['ownurl'],'tid'=>$data['tid'],'addtime'=>time(),'aid'=>$r]);\n\t\t\t\t}\n\t\t\t\t//tags处理\n\t\t\t\tif($data['tags']){\n\t\t\t\t\t$tags = explode(',',$data['tags']);\n\t\t\t\t\tforeach($tags as $v){\n\t\t\t\t\t\tif($v!=''){\n\t\t\t\t\t\t\t$r = M('tags')->find(['keywords'=>$v]);\n\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\t$w['keywords'] = $v;\n\t\t\t\t\t\t\t\t$w['newname'] = '';\n\t\t\t\t\t\t\t\t$w['url'] = '';\n\t\t\t\t\t\t\t\t$w['num'] = -1;\n\t\t\t\t\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t\t\t\t\t$w['number'] = 1;\n\t\t\t\t\t\t\t\t$w['tids'] = $data['tid'] ? ','.$data['tid'].',' : '';\n\t\t\t\t\t\t\t\t$w['target'] = '_blank';\n\t\t\t\t\t\t\t\tM('tags')->add($w);\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t    $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].',';\n\t\t\t\t\t\t\t    $ww['tids'] = $tags_tids;\n\t\t\t\t\t\t\t    $ww['number'] = $r['number']+1;\n\t\t\t\t\t\t\t\tM('tags')->update(['keywords'=>$v],$ww);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//处理配置信息\n\t\t\t\t$config = $this->webconf['article_config'];\n\t\t\t\t$configdata = json_decode($config,1);\n\t\t\t\tif($configdata['seotitle']!=$this->frparam('config_seotitle') || $configdata['litpic']!=$this->frparam('config_litpic') || $configdata['tags']!=$this->frparam('config_tags') || $configdata['filter']!=$this->frparam('config_filter',1)){\n\t\t\t\t\t$configdata = [\n\t\t\t\t\t\t'seotitle'=>$this->frparam('config_seotitle'),\n\t\t\t\t\t\t'litpic'=>$this->frparam('config_litpic'),\n\t\t\t\t\t\t'description'=>$this->frparam('config_description'),\n\t\t\t\t\t\t'tags'=>$this->frparam('config_tags'),\n\t\t\t\t\t\t'filter'=>$this->frparam('config_filter',1),\n\t\t\t\t\t];\n\t\t\t\t\tM('sysconfig')->update(['field'=>'article_config'],['data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)]);\n\t\t\t\t\tsetCache('webconfig',null);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功,继续添加~'),'url'=>U('addarticle',array('tid'=>$data['tid']))));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$this->molds = M('molds')->find(['biaoshi'=>'article']);\n\t\t$this->tid = $this->frparam('tid');\n\t\t$this->classtypes = $this->classtypetree;\n\t\t\n\t\t$config = $this->webconf['article_config'];\n\t\tif(!$config){\n\t\t\t$configdata = [\n\t\t\t\t'seotitle'=>1,\n\t\t\t\t'litpic'=>1,\n\t\t\t\t'description'=>1,\n\t\t\t\t'tags'=>1,\n\t\t\t\t'filter'=>'title,keywords,body',\n\t\t\t];\n\t\t\tM('sysconfig')->add(['title'=>JZLANG('内容配置'),'field'=>'article_config','type'=>3,'data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),'typeid'=>0]);\n\t\t\tsetCache('webconfig',null);\n\t\t}else{\n\t\t\t$configdata = json_decode($config,1);\n\t\t}\n\t\t$this->configdata = $configdata;\n\t\t\n\t\t$this->display('article-add');\n\t}\n\t\n\tfunction editarticle(){\n\t\t$this->fields_biaoshi = 'article';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'article');\n            check_field_must($data,'article');\n\t\t\tif(!$this->frparam('seo_title',1) && $this->frparam('config_seotitle')==1){\n\t\t\t\t$data['seo_title'] = $data['title'];\n\t\t\t}\n\t\t\tif(!$this->frparam('description',1) && $this->frparam('config_description')==1){\n\t\t\t\t$data['description'] = newstr(strip_tags($_POST['body']),200);\n\t\t\t}\n            $water_models = explode(',',$this->webconf['text_molds']);\n            if(in_array('article',$water_models)){\n                if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){\n                    $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']);\n                    //存储\n                    $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2);\n                    $pix_arr = explode('.',$data['litpic']);\n                    $pix = end($pix_arr);\n                    M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>'article']);\n                }\n            }\n\t\t\tif(!$data['litpic'] && $this->frparam('config_litpic')==1){\n\t\t\t\t$pattern='/<img.*?src=\"(.*?)\".*?>/is';\n\t\t\t\tif($this->frparam('body',1)){\n\t\t\t\t\t$r = preg_match($pattern,stripslashes($data['body']),$matchContent);\n\t\t\t\t\tif($r){\n\t\t\t\t\t\t$data['litpic'] = $matchContent[1];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$data['litpic'] = '';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$data['litpic'] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!$this->frparam('tags',1) && $this->frparam('config_tags')==1){\n\t\t\t\t$data['tags'] = str_replace('，',',',$data['keywords']);\n\t\t\t\tif($data['tags']){\n\t\t\t\t\t$data['tags'] = ','.$data['tags'].',';\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$data['userid'] = $_SESSION['admin']['id'];\n\t\t\t$data['htmlurl'] = $data['tid'] ? $this->classtypedata[$data['tid']]['htmlurl'] : null;\n\t\t\t//违禁词检测\n\t\t\tif($this->webconf['mingan'] && $this->frparam('config_filter',1)){\n\t\t\t\t$mingan = explode(',',$this->webconf['mingan']);\n\t\t\t\t$filter = explode(',',$this->frparam('config_filter',1));\n\t\t\t\t$fields = $this->getTableFields('article');\n\t\t\t\tforeach($mingan as $s){\n\t\t\t\t\tif(strpos($s,'{xxx}')!==false){\n\t\t\t\t\t\t$pattern = '/'.str_replace('{xxx}','(.*)',$s).'/';\n\t\t\t\t\t\tforeach($filter as $vv){\n\t\t\t\t\t\t\tif($vv && preg_match($pattern, $data[$vv])){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败').'，【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\n\t\t\t\t\t}else{\n\t\t\t\t\t\tforeach($filter as $vv){\n\t\t\t\t\t\t\tif($vv && strpos($data[$vv],$s)!==false ){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败').'，【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif($this->frparam('id')){\n\t\t\t\t$old_tags = M('Article')->getField(['id'=>$this->frparam('id')],'tags');\n\t\t\t\t//处理自定义URL\n\t\t\t\t\n\t\t\t\tif($data['ownurl']){\n\t\t\t\t\t$customurl = M('customurl')->find(['url'=>$data['ownurl']]);\n\t\t\t\t\tif($customurl){\n\t\t\t\t\t\tif($customurl['aid']!=$this->frparam('id')){\n\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL！')));\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tM('customurl')->update(['id'=>$customurl['id']],['url'=>$data['ownurl'],'tid'=>$data['tid'],'molds'=>'article']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(M('customurl')->find(['aid'=>$this->frparam('id'),'molds'=>'article'])){\n\t\t\t\t\t\t\tM('customurl')->update(['aid'=>$this->frparam('id'),'molds'=>'article'],['url'=>$data['ownurl'],'molds'=>'article','tid'=>$data['tid']]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tM('customurl')->add(['molds'=>'article','tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$this->frparam('id')]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tM('customurl')->delete(['molds'=>'article','aid'=>$this->frparam('id')]);\n\t\t\t\t}\n\t\t\t\tif($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){\n\t\t\t\t\t$data['isshow'] = $this->frparam('isshow',0,1);\n\t\t\t\t}else{\n\t\t\t\t\t$data['isshow'] = 0;\n\t\t\t\t}\n                //检查是否重复\n                if($this->webconf['hidetitleonliy']){\n                    $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']);\n                    $onliyfield = '';\n                    foreach ($hidetitleonly as $s){\n                        $d = explode('-',$s);\n                        if(strtolower($d[0])=='article'){\n                            $onliyfield = strtolower($d[1]);\n                            break;\n                        }\n                    }\n                    if($onliyfield){\n                        $sql = $onliyfield.\"='\".$this->frparam($onliyfield,1).\"' and id!=\".$this->frparam('id');\n                        if(M('article')->find($sql)){\n                            JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复！')));\n                        }\n                    }\n                }\n                $data['addtime'] = isset($data['addtime']) ? $data['addtime'] : time();\n                $data['updatetime'] = time();\n                //推荐置顶热门\n                if(strpos($data['jzattr'],'1')!==false){\n                    $data['istop'] = 1;\n                }else{\n                    $data['istop'] = 0;\n                }\n                if(strpos($data['jzattr'],'2')!==false){\n                    $data['ishot'] = 1;\n                }else{\n                    $data['ishot'] = 0;\n                }\n                if(strpos($data['jzattr'],'3')!==false){\n                    $data['istuijian'] = 1;\n                }else{\n                    $data['istuijian'] = 0;\n                }\n\t\t\t\tif(M('Article')->update(array('id'=>$this->frparam('id')),$data)){\n\t\t\t\t\tif($old_tags!=$data['tags']){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$a = $old_tags.$data['tags'];\n\t\t\t\t\t\t$new = [];\n\t\t\t\t\t\t$a = explode(',',$a);\n\t\t\t\t\t\tforeach($a as $v){\n\t\t\t\t\t\t\tif($v!='' && !in_array($v,$new)){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t$r = M('tags')->find(['keywords'=>$v]);\n\t\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\t\t$w['keywords'] = $v;\n\t\t\t\t\t\t\t\t\t$w['newname'] = '';\n\t\t\t\t\t\t\t\t\t$w['url'] = '';\n\t\t\t\t\t\t\t\t\t$w['num'] = -1;\n\t\t\t\t\t\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t\t\t\t\t\t$w['number'] = 1;\n                                    $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : '';\n\t\t\t\t\t\t\t\t\t$w['target'] = '_blank';\n\t\t\t\t\t\t\t\t\tM('tags')->add($w);\n\t\t\t\t\t\t\t\t}else{\n\n                                    if(strpos($old_tags,','.$v.',')===false){\n\n                                        if($data['tid']){\n                                            $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].',';\n                                            $ww['tids'] = $tags_tids;\n                                        }\n\n                                        $ww['number'] = $r['number']+1;\n                                        M('tags')->update(['keywords'=>$v],$ww);\n                                    }else if(strpos($data['tags'],','.$v.',')===false && strpos($old_tags,','.$v.',')!==false){\n\n                                        if($data['tid']){\n                                            $tags_tids = str_replace(','.$data['tid'].',',',',$r['tids']);\n                                            $ww['tids'] = $tags_tids==',' ? '' : $tags_tids;\n                                        }\n\n                                        $ww['number'] = $r['number']-1;\n                                        M('tags')->update(['keywords'=>$v],$ww);\n                                    }\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t$new[]=$v;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif($this->webconf['release_award_open']==1 && $data['isshow']==1){\n\t\t\t\t\t\t$award = round($this->webconf['release_award'],2);\n\t\t\t\t\t\t$max_award = round($this->webconf['release_max_award'],2);\n\t\t\t\t\t\t$member_id = M('Article')->getField(['id'=>$this->frparam('id')],'member_id');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>'article','aid'=>$this->frparam('id'),'msg'=>JZLANG('发布奖励')]);\n\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"发布奖励\").\"' \";\n\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\tforeach($all as $v){\n\t\t\t\t\t\t\t\t\t\t$all_jifen+=$v['amount'];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t   \t  \t\t$w['molds'] = 'article';\n\t\t\t\t\t\t   \t  \t\t$w['aid'] = $this->frparam('id');\n\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('发布奖励');\n\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t\t$config = $this->webconf['article_config'];\n\t\t\t\t\t$configdata = json_decode($config,1);\n\t\t\t\t\tif($configdata['seotitle']!=$this->frparam('config_seotitle') || $configdata['litpic']!=$this->frparam('config_litpic') || $configdata['tags']!=$this->frparam('config_tags') || $configdata['filter']!=$this->frparam('config_filter',1)){\n\t\t\t\t\t\t$configdata = [\n\t\t\t\t\t\t\t'seotitle'=>$this->frparam('config_seotitle'),\n\t\t\t\t\t\t\t'litpic'=>$this->frparam('config_litpic'),\n\t\t\t\t\t\t\t'description'=>$this->frparam('config_description'),\n\t\t\t\t\t\t\t'tags'=>$this->frparam('config_tags'),\n\t\t\t\t\t\t\t'filter'=>$this->frparam('config_filter',1),\n\t\t\t\t\t\t];\n\t\t\t\t\t\tM('sysconfig')->update(['field'=>'article_config'],['data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)]);\n\t\t\t\t\t\tsetCache('webconfig',null);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('index')));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('您未做任何修改，不能提交！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\tif($this->frparam('id')){\n\t\t\t$this->data = M('Article')->find(array('id'=>$this->frparam('id')));\n\t\t}\n\t\t$this->molds = M('molds')->find(['biaoshi'=>'article']);\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$config = $this->webconf['article_config'];\n\t\tif(!$config){\n\t\t\t$configdata = [\n\t\t\t\t'seotitle'=>1,\n\t\t\t\t'litpic'=>1,\n\t\t\t\t'description'=>1,\n\t\t\t\t'tags'=>1,\n\t\t\t\t'filter'=>'title,keywords,body',\n\t\t\t];\n\t\t\tM('sysconfig')->add(['title'=>JZLANG('内容配置'),'field'=>'article_config','type'=>3,'data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),'typeid'=>0]);\n\t\t\tsetCache('webconfig',null);\n\t\t}else{\n\t\t\t$configdata = json_decode($config,1);\n\t\t}\n\t\t$this->configdata = $configdata;\n\t\t\n\t\t$this->display('article-edit');\n\t\t\n\t}\n\t\n\tfunction deletearticle(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('article')->find(['id'=>$id]);\n\t\t\tif(M('Article')->delete(['id'=>$id])){\n\t\t\t\t$customurl = M('customurl')->find(['molds'=>'article','aid'=>$id]);\n\t\t\t\tM('customurl')->delete(['molds'=>'article','aid'=>$id]);\n\t\t\t\t$w['molds'] = 'article';\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['title'];\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\t$r = M('recycle')->add($w);\n\t\t\t\tif($customurl){\n\t\t\t\t\t$w['molds'] = 'customurl';\n\t\t\t\t\t$w['data'] = serialize($customurl);\n                    $w['title'] = '['.$customurl['id'].']'.JZLANG('自定义链接');\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t$w['aid'] = $r;\n\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//复制文章\n\tfunction copyarticle(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('article')->find(['id'=>$id]);\n\t\t\tunset($data['id']);\n\t\t\tif(M('Article')->add($data)){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('复制成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('复制失败！')));\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t//批量删除文章\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$all = M('article')->findAll('id in('.$data.')');\n\t\t\tif(M('article')->delete('id in('.$data.')')){\n\t\t\t\t$customurls = M('customurl')->findAll(\" aid in(\".$data.\") and molds='article' \");\n\t\t\t\tM('customurl')->delete(\" aid in(\".$data.\") and molds='article' \");\n\t\t\t\t$newcustomurl = [];\n\t\t\t\tif($customurls){\n\t\t\t\t\tforeach($customurls as $v){\n\t\t\t\t\t\t$newcustomurl[$v['aid']] = $v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tforeach($all as $v){\n\t\t\t\t\t$w['molds'] = 'article';\n\t\t\t\t\t$w['data'] = serialize($v);\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t$w['title'] = '['.$v['id'].']'.$v['title'];\n\t\t\t\t\t$x = M('recycle')->add($w);\n\t\t\t\t\tif($x && $newcustomurl[$v['id']]){\n\t\t\t\t\t\t$w['molds'] = 'customurl';\n\t\t\t\t\t\t$w['data'] = serialize($newcustomurl[$v['id']]);\n\t\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t\t$w['title'] = '['.$newcustomurl[$v['id']]['id'].']自定义链接';\n\t\t\t\t\t\t$w['aid'] = $x;\n\t\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t//批量复制文章\n\tfunction copyAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$list = M('article')->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\tunset($v['id']);\n\t\t\t\tM('Article')->add($v);\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量复制成功！')));\n\t\t\t\t\n\t\t}\n\t}\n\t//批量修改栏目\n\tfunction changeType(){\n\t\t$data = $this->frparam('data',1);\n\t\t$tid = $this->frparam('tid');\n\t\tif($data!=''){\n\t\t\t$list = M('article')->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\t$w['tid'] = $tid;\n\t\t\t\t$type = M('classtype')->find(array('id'=>$tid));\n\t\t\t\t$w['htmlurl'] = $type['htmlurl'];\n\t\t\t\tM('Article')->update(array('id'=>$v['id']),$w);\n\t\t\t\tif($v['ownurl']){\n\t\t\t\t\tM('customurl')->update(['aid'=>$v['id'],'molds'=>'article'],['tid'=>$tid]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功！')));\n\t\t}\n\t}\n\t\n\t//修改排序\n\tfunction editArticleOrders(){\n\t\t$field = $this->frparam('field',1);\n\t\t$w[$field] = $this->frparam('value',1);\n\t\t$r = M('article')->update(array('id'=>$this->frparam('id')),$w);\n\t\tif(!$r){\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\n\t\t}\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\n\t}\n\t//批量修改推荐属性\n\tfunction changeAttribute(){\n\t\t$data = $this->frparam('data',1);\n\t\t$tj = $this->frparam('tj');\n\t\tif($data!=''){\n\t\t\t$list = M('article')->findAll('id in('.$data.')');\n\t\t\t\n\t\t\tforeach($list as $v){\n\t\t\t\tif(strpos($v['jzattr'],','.$tj.',')!==false){\n\t\t\t\t\t$attr = str_replace(','.$tj.',','',$v['jzattr']);\n\t\t\t\t\tif(!$attr){\n\t\t\t\t\t\t$w['jzattr'] = '';\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$w['jzattr'] = ','.trim($attr,',').',';\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tif($v['jzattr']){\n\t\t\t\t\t\t$w['jzattr'] = $v['jzattr'].$tj.',';\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$w['jzattr'] = ','.$tj.',';\n\t\t\t\t\t}\n\t\t\t\t}\n\n                if(strpos($w['jzattr'],'1')!==false){\n                    $w['istop'] = 1;\n                }else{\n                    $w['istop'] = 0;\n                }\n                if(strpos($w['jzattr'],'2')!==false){\n                    $w['ishot'] = 1;\n                }else{\n                    $w['ishot'] = 0;\n                }\n                if(strpos($w['jzattr'],'3')!==false){\n                    $w['istuijian'] = 1;\n                }else{\n                    $w['istuijian'] = 0;\n                }\n\t\t\t\tM('Article')->update(array('id'=>$v['id']),$w);\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功！')));\n\t\t}\n\t}\n\n\t//批量审核\n\tfunction checkAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\tif($this->frparam('isshow')==1){\n\t\t\t\t$isshow = 1;\n\t\t\t}else if($this->frparam('isshow')==2){\n\t\t\t\t$isshow = 0;\n\t\t\t}else{\n\t\t\t\t$isshow = 2;\n\t\t\t}\n\t\t\tif($isshow==1){\n\t\t\t\t$all = M('article')->findAll('id in('.$data.')');\n\t\t\t\t$award = round($this->webconf['release_award'],2);\n\t\t\t\t$max_award = round($this->webconf['release_max_award'],2);\n\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\tforeach ($all as $k => $v) {\n\t\t\t\t\tif($v['isshow']!=1){\n\t\t\t\t\t\t//start\n\t\t\t\t\t\tif($this->webconf['release_award_open']==1){\n\t\t\t\t\t\t\t$member_id = $v['member_id'];\n\t\t\t\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>'article','aid'=>$v['id'],'msg'=>JZLANG('发布奖励')]);\n\t\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"发布奖励\").\"' \";\n\t\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\t\tforeach($all as $vv){\n\t\t\t\t\t\t\t\t\t\t\t$all_jifen+=$vv['amount'];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t\t                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t\t   \t  \t\t$w['molds'] = 'article';\n\t\t\t\t\t\t\t   \t  \t\t$w['aid'] = $v['id'];\n\t\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('发布奖励');\n\t\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//end\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tM('article')->update('id in('.$data.')',['isshow'=>$isshow]);\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量操作成功！')));\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t}\n\t}\n\t\n\tprivate function getTableFields($table){\n\t\t$sql=\"select distinct * from information_schema.columns where table_schema = '\".DB_NAME.\"' and  table_name = '\".DB_PREFIX.$table.\"'\";\n        $list = M()->findSql($sql);\n        $isgo = true;\n        $fields = [];\n\t\t\n        foreach($list as $v){\n\t\t\t$len = 0;\n\t\t\t$s = preg_match('/\\((.*)\\)/',$v['COLUMN_TYPE'],$math);\n\t\t\tif($s){\n\t\t\t\t$len = $math[1];\n\t\t\t}\n\t\t\t$fields[$v['COLUMN_NAME']] = $v['COLUMN_COMMENT'] ? $v['COLUMN_COMMENT'] : $v['COLUMN_NAME'];\n\t\t\t\n            \n\n        }\n        return $fields;\n\n    }\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/admin/c/ClasstypeController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass ClasstypeController extends CommonController\n{\n\n\n\tfunction index(){\n\t\t//$sql = null;\n\t\t//栏目不需要搜索\n\t\t// $data = $this->frparam();\n\t\t// $res = molds_search('classtype',$data);\n\t\t// $sql = ($res['fields_search_check']!='')?$res['fields_search_check']:null;\n\t\t// $this->fields_search = $res['fields_search'];\n\t\t$classtype = M('classtype')->findAll(NULL,'orders desc');\n\t\t$classtype = set_class_haschild($classtype);\n\t\t$classtype = getTree($classtype);\n\t\t$this->classtypes = $classtype;\n\t\t//$this->classtypes = $this->classtypetree;\n\t\t//模块\n\t\t$molds = M('Molds')->findAll(['isopen'=>1]);\n\t\t$fs = array();\n\t\tforeach($molds as $v){\n\t\t\t$fs[$v['biaoshi']] = $v;\n\t\t}\n\t\t$this->molds = M('molds')->find(['biaoshi'=>'classtype']);\n\t\t$this->moldslist = $fs;\n\t\t$this->display('classtype-list');\n\t}\n\t\n\tfunction addclass(){\n\t\t$this->fields_biaoshi = 'classtype';\n\t\t\n\t\tif($this->frparam('go')==1){\n\n\t\t\t$htmlurl = $this->frparam('htmlurl',1);\n\t\t\tif($htmlurl==''){\n\t\t\t\t$htmlurl = str_replace(' ','',pinyin($this->frparam('classname',1)));\n\t\t\t}\n\t\t\tif($this->webconf['islevelurl'] && $this->frparam('pid')!=0){\n\t\t\t\t//层级\n\t\t\t\t$classtypetree = classTypeData();\n\t\t\t\t$htmlurl = $classtypetree[$this->frparam('pid')]['htmlurl'].'/'.$htmlurl;\n\t\t\t}\n\t\t\t\n\t\t\tif(in_array(strtolower($htmlurl),array('message','user','comment','home','common','order','tags','wechat','login'))){\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>JZLANG('URL链接命名不能是').'：message,user,comment,home,common,order,tags,wechat,login,jzpay'));\n\t\t\t}\n\t\t\tif(stripos($htmlurl,'.php')!==false){\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>JZLANG('非法URL')));\n\t\t\t}\n\n\t\t\t$w['pid'] = $this->frparam('pid');\n\t\t\t$w['orders'] = $this->frparam('orders');\n\t\t\t$w['classname'] = $this->frparam('classname',1);\n\t\t\t$w['seo_classname'] = $this->frparam('seo_classname',1) ? $this->frparam('seo_classname',1) : $this->frparam('classname',1);\n\t\t\t$w['molds'] = $this->frparam('molds',1);\n\t\t\t$w['description'] = $this->frparam('description',1);\n\t\t\t$w['keywords'] = $this->frparam('keywords',1);\n\t\t\t$w['litpic'] = $this->frparam('litpic',1);\n            $text = remote_data_local(stripslashes($_POST['body']), 0, $w['molds']);\n\t\t\t$w['body'] = format_param($text,4);\n\t\t\t$w['htmlurl'] = $htmlurl;\n\t\t\t$w['iscover'] = $this->frparam('iscover');\n\t\t\t$w['lists_html'] = $this->frparam('lists_html',1);\n\t\t\t$w['details_html'] = $this->frparam('details_html',1);\n\t\t\t$w['gourl'] = $this->frparam('gourl',1);\n\t\t\t$w['lists_num'] = $this->frparam('lists_num');\n            $w['gids'] = $this->frparam('gids',2) ? implode(',',$this->frparam('gids',2)) : '';\n\n            //检查同级重名\n            if(M('classtype')->find(['classname'=>$w['classname'],'pid'=>$w['pid']])){\n                JsonReturn(array('status'=>0,'info'=>JZLANG('存在同级下重名！')));\n            }\n            \n\t\t\tif($w['pid']){\n\t\t\t\t$parent = M('classtype')->find(array('id'=>$w['pid']));\n\t\t\t\tif($parent['iscover']==1){\n\t\t\t\t\t$w['lists_html']= $w['lists_html'] ? $w['lists_html'] : ($this->frparam('lists_html_write',1) ? $this->frparam('lists_html_write',1) : $parent['lists_html']);\n\t\t\t\t\t$w['details_html']= $w['details_html'] ? $w['details_html'] : ($this->frparam('details_html_write',1) ? $this->frparam('details_html_write',1) : $parent['details_html']);\n\t\t\t\t\t$w['lists_num']=$parent['lists_num'];\n\t\t\t\t}else{\n\t\t\t\t\t$w['lists_html']= $w['lists_html'] ? $w['lists_html'] : $this->frparam('lists_html_write',1);\n\t\t\t\t\t$w['details_html']= $w['details_html'] ? $w['details_html'] : $this->frparam('details_html_write',1);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t$w['lists_html']= $w['lists_html'] ? $w['lists_html'] : $this->frparam('lists_html_write',1);\n\t\t\t\t$w['details_html']= $w['details_html'] ? $w['details_html'] : $this->frparam('details_html_write',1);\n\t\t\t}\n\t\t\t\n\t\t\t//$w['lists_html'] = str_ireplace('.html','',$w['lists_html']);\n\t\t\t//$w['details_html'] = str_ireplace('.html','',$w['details_html']);\n\t\t\t\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'classtype');\n\t\t\t$w = array_merge($data,$w);\n            $w['addtime'] = $w['updatetime'] = isset($w['addtime']) ? $w['addtime'] : time();\n\t\t\t$a = M('classtype')->add($w);\n\t\t\tif($a){\n\t\t\t    if($w['pid']){\n                    $sql = \" tids like '%,\".$w['pid'].\",%' or (molds='\".$w['molds'].\"' and (tids is null or tids='')) \";\n                }else{\n\t\t\t        $sql = \"molds='\".$w['molds'].\"'\";\n                }\n                $fields=M('fields')->findAll($sql);\n                foreach ($fields as $v){\n                    if($v['tids']){\n                        M('fields')->update(array('id'=>$v['id']),array('tids'=>$v['tids'].$a.','));\n                    }else{\n                        M('fields')->update(array('id'=>$v['id']),array('tids'=>','.$a.','));\n                    }\n\n                }\n\n\n\t\t\t\t//这里\n\t\t\t\tsetCache('jzclasstypedata',null);\n\t\t\t\tsetCache('classtypetree',null);\n\t\t\t\tsetCache('classtype',null);\n\t\t\t\tsetCache('mobileclasstype',null);\n\t\t\t\tsetCache('classtypedatamobile',null);\n\t\t\t\tsetCache('classtypedatapc',null);\n\t\t\t\tJsonReturn(array('status'=>1,'info'=>JZLANG('添加栏目成功，继续添加~'),'url'=>U('addclass',array('pid'=>$w['pid'],'biaoshi'=>$w['molds']))));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>JZLANG('新增失败！')));\n\t\t\t}\n\t\t}\n\t\t//模块\n\t\t$this->molds = M('Molds')->findAll(['isopen'=>1]);\n\t\t\n\t\t$this->pid = $this->frparam('pid');\n\t\t$this->biaoshi = $this->frparam('biaoshi',1);\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->display('classtype-add');\n\t\t\n\t}\n\tfunction editclass(){\n\t\t$this->data = M('classtype')->find(array('id'=>$this->frparam('id')));\n\t\t$this->fields_biaoshi = 'classtype';\n\t\tif($this->frparam('go')==1){\n\t\t\t$htmlurl = $this->frparam('htmlurl',1);\n\t\t\tif($htmlurl==''){\n\t\t\t\t$htmlurl = str_replace(' ','',pinyin($this->frparam('classname',1)));\n\t\t\t}\n\t\t\t\n\t\t\tif(in_array(strtolower($htmlurl),array('message','user','comment','home','common','order','tags','wechat','login'))){\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>JZLANG('URL链接命名不能是').'：message,user,comment,home,common,order,tags,wechat,login,jzpay'));\n\t\t\t}\n\t\t\tif(stripos($htmlurl,'.php')!==false){\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>'非法URL'));\n\t\t\t}\n\t\t\t$w['pid'] = $this->frparam('pid');\n\t\t\t$w['orders'] = $this->frparam('orders');\n\t\t\t$w['classname'] = $this->frparam('classname',1);\n\t\t\t$w['molds'] = $this->frparam('molds',1);\n\t\t\tif(!M('molds')->find(['biaoshi'=>$w['molds']])){\n\t\t\t\tJsonReturn(array('status'=>1,'info'=>JZLANG('模型错误！')));\n\t\t\t}\n\t\t\t$w['description'] = $this->frparam('description',1);\n\t\t\t$w['keywords'] = $this->frparam('keywords',1);\n\t\t\t$w['id'] = $this->frparam('id');\n\t\t\t$w['litpic'] = $this->frparam('litpic',1);\n            $text = remote_data_local(stripslashes($_POST['body']), $w['id'], $w['molds']);\n            $w['body'] = format_param($text,4);\n\t\t\t$w['htmlurl'] = $htmlurl;\n\t\t\t$w['iscover'] = $this->frparam('iscover');\n\t\t\t$w['lists_html'] = $this->frparam('lists_html',1) ? $this->frparam('lists_html',1) : $this->frparam('lists_html_write',1);\n\t\t\t$w['details_html'] = $this->frparam('details_html',1) ? $this->frparam('details_html',1) : $this->frparam('details_html_write',1);\n\t\t\t$w['lists_num'] = $this->frparam('lists_num');\n\t\t\t$w['gourl'] = $this->frparam('gourl',1);\n\t\t\t//$w['lists_html'] = str_ireplace('.html','',$w['lists_html']);\n\t\t\t//$w['details_html'] = str_ireplace('.html','',$w['details_html']);\n            $w['gids'] = $this->frparam('gids',2) ? implode(',',$this->frparam('gids',2)) : '';\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'classtype');\n\t\t\t$w = array_merge($data,$w);\n\t\t\t\n\t\t\t//检测pid是否为该栏目下级\n\t\t\tif(checkClass($w['pid'],$this->data['id']) || ($w['pid']==$this->data['id'])){\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>JZLANG('不能选择当前栏目及下级为顶级栏目')));\n\t\t\t}\n\t\t\t\n\t\t\t$w['updatetime'] = time();\n\t\t\t$a = M('classtype')->update(array('id'=>$w['id']),$w);\n\t\t\tif($a){\n\t\t\t\tif($w['iscover']==1){\n\t\t\t\t\t$children = M('classtype')->update(array('pid'=>$w['id']),array('lists_html'=>$w['lists_html'],'details_html'=>$w['details_html'],'lists_num'=>$w['lists_num']));\n\t\t\t\t}\n\t\t\t\t//批量修改栏目对应的模块内容htmlurl\n\t\t\t\tif($this->data['htmlurl']!=$data['htmlurl']){\n\t\t\t\t\tM($data['molds'])->update(array('tid'=>$data['id']),array('htmlurl'=>$data['htmlurl']));\n\t\t\t\n\t\t\t\t}\n\t\t\t\t//批量修改栏目url\n\t\t\t\tif($this->webconf['islevelurl']==1){\n\t\t\t\t\tif( ($this->data['htmlurl']!=$data['htmlurl']) || ($this->data['pid']!=$w['pid'])){\n\t\t\t\t\t\t\n\t\t\t\t\t\t//层级\n\t\t\t\t\t\t$classtypetree = classTypeData();\n\t\t\t\t\t\t$children = get_children($classtypetree[$w['id']],$classtypetree,5);\n\t\t\t\t\t\t//计算当前url\n\t\t\t\t\t\t//以前的url替换成当前的url\n\t\t\t\t\t\t$old_htmlurl = $this->data['htmlurl'];\n\t\t\t\t\t\tif(strpos($w['htmlurl'],'/')!==false){\n\t\t\t\t\t\t\t//获取最后一个\n\t\t\t\t\t\t\t$htl = explode('/',$w['htmlurl']);\n\t\t\t\t\t\t\t$htl_new = end($htl);//最后一个名字\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$htl_new = $w['htmlurl'];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($w['pid']!=0){\n\t\t\t\t\t\t\t$p_html = $classtypetree[$w['pid']]['htmlurl'];\n\t\t\t\t\t\t\t$new_htmlurl = $p_html.'/'.$htl_new;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$new_htmlurl = $htl_new;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//更新栏目及其内容HTML\n\t\t\t\t\t\tM('classtype')->update(['id'=>$data['id']],['htmlurl'=>$new_htmlurl]);\n\t\t\t\t\t\tM($data['molds'])->update(array('tid'=>$data['id']),array('htmlurl'=>$new_htmlurl));\n\t\t\t\t\t\t\n\t\t\t\t\t\tforeach($children as $v){\n\t\t\t\t\t\t\t$html = substr($v['htmlurl'],strlen($old_htmlurl));\n\t\t\t\t\t\t\t$htmlurl_s = $new_htmlurl.$html;\n\t\t\t\t\t\t\tM('classtype')->update(['id'=>$v['id']],['htmlurl'=>$htmlurl_s]);\n\t\t\t\t\t\t\tM($v['molds'])->update(['tid'=>$v['id']],['htmlurl'=>$htmlurl_s]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsetCache('jzclasstypedata',null);\n\t\t\t\tsetCache('classtypetree',null);\n\t\t\t\tsetCache('classtype',null);\n\t\t\t\tsetCache('mobileclasstype',null);\n\t\t\t\tsetCache('classtypedatamobile',null);\n\t\t\t\tsetCache('classtypedatapc',null);\n\t\t\t\tJsonReturn(array('status'=>1));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>JZLANG('您未做任何修改，不能提交！')));\n\t\t\t}\n\t\t}\n\t\t\n\t\t//模块\n\t\t$this->molds = M('Molds')->findAll(['isopen'=>1]);\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->display('classtype-edit');\n\t\t\n\t}\n\t\n\tfunction editClassOrders(){\n\t\t$w['orders'] = $this->frparam('orders');\n\t\t\n\t\t$r = M('classtype')->update(array('id'=>$this->frparam('id')),$w);\n\t\tif(!$r){\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\n\t\t}\n\t\tsetCache('jzclasstypedata',null);\n\t\tsetCache('classtypetree',null);\n\t\tsetCache('classtype',null);\n\t\tsetCache('mobileclasstype',null);\n\t\tsetCache('classtypedatamobile',null);\n\t\tsetCache('classtypedatapc',null);\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\n\t\t\n\t}\n\tfunction deleteclass(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t//检测栏目是否有下级\n\t\t\tif(M('classtype')->find(['pid'=>$id])){\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>JZLANG('该栏目有子栏目，请先删除子栏目！')));\n\t\t\t}\n\t\t\t$data = M('classtype')->find(array('id'=>$id));\n\t\t\t$a = M('classtype')->delete(array('id'=>$id));\n\t\t\tif($a){\n\t\t\t\t$w['molds'] = 'classtype';\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['classname'];\n\t\t\t\tM('recycle')->add($w);\n\t\t\t\tsetCache('jzclasstypedata',null);\n\t\t\t\tsetCache('classtypetree',null);\n\t\t\t\tsetCache('classtype',null);\n\t\t\t\tsetCache('mobileclasstype',null);\n\t\t\t\tsetCache('classtypedatamobile',null);\n\t\t\t\tsetCache('classtypedatapc',null);\n\t\t\t\tJsonReturn(array('status'=>1));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('status'=>0,'info'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\tfunction change_status(){\n\t\t$id = $this->frparam('id',1);\n\t\tif(!$id){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t}\n\t\t\n\t\t$x = M('Classtype')->find('id='.$id);\n\t\tif($x['isshow']==1){\n\t\t\t$x['isshow']=0;\n\t\t}else{\n\t\t\t$x['isshow']=1;\n\t\t}\n\t\tM('Classtype')->update(array('id'=>$id),array('isshow'=>$x['isshow']));\n\t\tsetCache('jzclasstypedata',null);\n\t\tsetCache('classtypetree',null);\n\t\tsetCache('classtype',null);\n\t\tsetCache('mobileclasstype',null);\n\t\tsetCache('classtypedatamobile',null);\n\t\tsetCache('classtypedatapc',null);\n\t}\n\t\n\tfunction get_pinyin(){\n\t\t\n\t\t$classname = $this->frparam('classname',1);\n\t\tif($classname){\n\t\t\t$data = pinyin($classname,'first');\n\t\t\tJsonReturn(['code'=>0,'data'=>$data]);\n\t\t}\n\t\t\n\t}\n    \n    function addmany(){\n        if($_POST){\n            $type = $this->frparam('type',0,1);\n            if($type==1){\n                $molds = $this->frparam('molds',1);\n                $pid = $this->frparam('pid',0,0);\n                $classname = $this->frparam('classname',1);\n                if(!trim($classname)){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('栏目不能为空！')]);\n                }\n                $classname = explode(\"\\n\",trim($classname));\n                $classtypetree = classTypeData();\n                foreach($classname as $k=>$v){\n                    if($v){\n                        if(strpos($v,'|')!==false){\n                            $d = explode('|',$v);\n                        }else{\n                            $d = [$v,pinyin($v,'first')];\n                        }\n                        $w['molds'] = $molds;\n                        $w['classname'] = $d[0];\n                        $w['seo_classname'] = $d[0];\n                        $w['pid'] = $pid;\n                        $d[1] = str_replace(' ','-',$d[1]);\n                        if($this->webconf['islevelurl'] && $w['pid']!=0){\n                            //层级\n                            $html = $classtypetree[$w['pid']]['htmlurl'].'/'.$d[1];\n                        }else{\n                            $html = $d[1];\n                        }\n                        if(stripos($html,'.php')!==false){\n                            JsonReturn(array('code'=>1,'info'=>'非法URL'));\n                        }\n                        $w['htmlurl'] = str_replace(' ','-',$html);\n                        $w['lists_num'] = $this->frparam('lists_num',0,10);\n                        $w['lists_html'] = $this->frparam('lists_html',1);\n                        $w['details_html'] = $this->frparam('details_html',1);\n                        $w['isshow'] =$this->frparam('isshow',0,1);\n                        $w['ishome'] =$this->frparam('ishome',0,1);\n                        $w['addtime'] = $w['updatetime'] = time();\n                        $r = M('classtype')->add($w);\n                        $sql = \"molds='\".$w['molds'].\"'\";\n                        $fields=M('fields')->findAll($sql);\n                        foreach ($fields as $s){\n                            if($s['tids']){\n                                M('fields')->update(array('id'=>$s['id']),array('tids'=>$s['tids'].$r.','));\n                            }else{\n                                M('fields')->update(array('id'=>$s['id']),array('tids'=>','.$r.','));\n                            }\n                            \n                        }\n                        $w = [];\n                    }\n                    \n                    \n                }\n            }else{\n                \n                $data_0 = $this->frparam('data_0',2);\n                $data_1 = $this->frparam('data_1',2);\n                $data_2 = $this->frparam('data_2',2);\n                $data_3 = $this->frparam('data_3',2);\n                $data_4 = $this->frparam('data_4',2);\n                $data_5 = $this->frparam('data_5',2);\n                $data_6 = $this->frparam('data_6',2);\n                $data_7 = $this->frparam('data_7',2);\n                $data_8 = $this->frparam('data_8',2);\n                $classtypetree = classTypeData();\n                foreach($data_1 as $k=>$v){\n                    if($v && $v!=''){\n                        \n                        $w['molds'] = $data_0[$k];\n                        $w['classname'] = $v;\n                        $w['pid'] = $data_2[$k];\n                        $data_3[$k] = $data_3[$k] ? : pinyin($data_3[$k],'first');\n                        if($this->webconf['islevelurl'] && $w['pid']!=0){\n                            //层级\n                            $html = $classtypetree[$w['pid']]['htmlurl'].'/'.$data_3[$k];\n                        }else{\n                            $html = $data_3[$k];\n                        }\n                        \n                        $w['htmlurl'] = $html;\n                        $w['lists_num'] = $data_4[$k];\n                        $w['lists_html'] = $data_5[$k];\n                        $w['details_html'] = $data_6[$k];\n                        $w['isshow'] = $data_7[$k];\n                        $w['orders'] = $data_8[$k];\n                        $w['addtime'] = $w['updatetime'] = time();\n                        $r = M('classtype')->add($w);\n                        \n                        $sql = \"molds='\".$w['molds'].\"'\";\n                        $fields=M('fields')->findAll($sql);\n                        foreach ($fields as $s){\n                            if($s['tids']){\n                                M('fields')->update(array('id'=>$s['id']),array('tids'=>$s['tids'].$r.','));\n                            }else{\n                                M('fields')->update(array('id'=>$s['id']),array('tids'=>','.$r.','));\n                            }\n                            \n                        }\n                        \n                        $w = [];\n                    }\n                    \n                    \n                }\n                \n            }\n            \n            setCache('jzclasstypedata',null);\n            setCache('classtypetree',null);\n            setCache('classtype',null);\n            setCache('mobileclasstype',null);\n            setCache('classtypedatamobile',null);\n            setCache('classtypedatapc',null);\n            JsonReturn(['code'=>0,'msg'=>'success']);\n        }\n        $this->molds = M('molds')->find(['biaoshi'=>'classtype']);\n        $this->moldslist = M('molds')->findAll(['isopen'=>1]);\n        $this->classtypes = $this->classtypetree;;\n        \n        $this->display('classtype-addmany');\n        \n        \n    }\n    \n    public function get_html(){\n        $molds = $this->frparam('molds',1,'article');\n        //获取前台template\n        $dir = APP_PATH.'static/'.$this->webconf['pc_template'].'/'.strtolower($molds);\n        \n        $fileArray=array();\n        if(is_dir($dir)){\n            \n            if (false != ($handle = opendir ( $dir ))) {\n                $i=0;\n                while ( false !== ($file = readdir ( $handle )) ) {\n                    //去掉\"“.”、“..”以及带“.xxx”后缀的文件\n                    if ($file != \".\" && $file != \"..\") {\n                        $fileArray[$i]=['html'=>$file,'value'=>$file];\n                        $i++;\n                        \n                    }\n                    \n                }\n                //关闭句柄\n                closedir ( $handle );\n            }\n        }\n        \n        $m = M('molds')->find(['biaoshi'=>$molds]);\n        if(!count($fileArray)){\n            $fileArray[] = ['html'=>$m['list_html'],'value'=>$m['list_html']];\n            $fileArray[] = ['html'=>$m['details_html'],'value'=>$m['details_html']];\n            \n        }\n        JsonReturn(['code'=>0,'data'=>$fileArray,'path'=>$dir,'lists_html'=>$m['list_html'],'details_html'=>$m['details_html']]);\n        \n    }\n\t\n\t\t\n\tfunction changeClass(){\n\t\t$pid = $this->frparam('pid',0,0);\n\t\t$tids = $this->frparam('tids',1);\n\t\t$tids_arr = explode(',',$tids);\n\t\t\n\t\tforeach($tids_arr as $v){\n\t\t\t//检测pid是否为该栏目下级\n\t\t\tif(checkClass($pid,$v) || ($pid==$v)){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('不能选择当前栏目及下级为顶级栏目')));\n\t\t\t}\n\t\t}\n\t\t\n\t\t//批量修改栏目url\n\t\tif($this->webconf['islevelurl']==1){\n\t\t\t\t//层级\n\t\t\t\t$classtypetree = classTypeData();\n\t\t\tforeach($tids_arr as $v){\t\n\t\t\t\t$children = get_children($classtypetree[$v],$classtypetree,5);\n\t\t\t\t//计算当前url\n\t\t\t\t//以前的url替换成当前的url\n\t\t\t\t$old_htmlurl = $classtypetree[$v]['htmlurl'];\n\t\t\t\tif(strpos($old_htmlurl,'/')!==false){\n\t\t\t\t\t//获取最后一个\n\t\t\t\t\t$htl = explode('/',$old_htmlurl);\n\t\t\t\t\t$htl_new = end($htl);//最后一个名字\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$htl_new = $old_htmlurl;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif($pid!=0){\n\t\t\t\t\t$p_html = $classtypetree[$pid]['htmlurl'];\n\t\t\t\t\t$new_htmlurl = $p_html.'/'.$htl_new;\n\t\t\t\t}else{\n\t\t\t\t\t$new_htmlurl = $htl_new;\n\t\t\t\t}\n\t\t\t\t//更新栏目及其内容HTML\n\t\t\t\tM('classtype')->update(['id'=>$v],['htmlurl'=>$new_htmlurl,'pid'=>$pid]);\n\t\t\t\tM($classtypetree[$v]['molds'])->update(array('tid'=>$v),array('htmlurl'=>$new_htmlurl,'tid'=>$pid));\n\t\t\t\t\n\t\t\t\tforeach($children as $vv){\n\t\t\t\t\t$html = substr($vv['htmlurl'],strlen($old_htmlurl));\n\t\t\t\t\t$htmlurl_s = $new_htmlurl.$html;\n\t\t\t\t\tM('classtype')->update(['id'=>$vv['id']],['htmlurl'=>$htmlurl_s]);\n\t\t\t\t\tM($vv['molds'])->update(['tid'=>$vv['id']],['htmlurl'=>$htmlurl_s]);\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}else{\n\t\t\tM('classtype')->update(' id in('.$tids.')',['pid'=>$pid]);\n\t\t\t\n\t\t}\n\t\tsetCache('jzclasstypedata',null);\n\t\tsetCache('classtypetree',null);\n\t\tsetCache('classtype',null);\n\t\tsetCache('mobileclasstype',null);\n\t\tsetCache('classtypedatamobile',null);\n\t\tsetCache('classtypedatapc',null);\n\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('操作成功！')));\n\t}\n\n    function getchildren(){\n        $id  = $this->frparam('id');\n\n        $this->lists = $this->classtypedata[$id]['children']['list'];\n\n        $molds = M('Molds')->findAll(['isopen'=>1]);\n        $fs = array();\n        foreach($molds as $v){\n            $fs[$v['biaoshi']] = $v;\n        }\n        $this->molds = M('molds')->find(['biaoshi'=>'classtype']);\n        $this->moldslist = $fs;\n\n        $this->display('getchildren');\n    }\n\t\n\t\n}\n\t"
  },
  {
    "path": "app/admin/c/CollectController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/03\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass CollectController extends CommonController\n{\n\t//列表\n\tfunction index(){\n\t\t\t$page = new Page('collect');\n\t\t\t$sql = '1=1';\n\t\t\t\n\t\t\tif($this->frparam('tid')){\n\t\t\t\t$sql .= ' and tid='.$this->frparam('tid');\n\t\t\t}\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$res = molds_search('collect',$data);\n\t\t\t$get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n\t\t\t$sql .= $get_sql;\n\t\t\t\n\t\t\t$this->fields_search = $res['fields_search'];\n\t\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>'collect','islist'=>1),'orders desc');\n\t\t\tif($this->frparam('title',1)!=''){\n\t\t\t\t$sql.=\" and title like '%\".$this->frparam('title',1).\"%' \";\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$data = $page->where($sql)->orderby('id desc')->page($this->frparam('page',0,1))->go();\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\t\n\t\t\t\n\t\t\t$this->tid=  $this->frparam('tid');\n\t\t\t$this->title = $this->frparam('title',1);\n\t\t\t$collect_type = M('collect_type')->findAll();\n\t\t\n\t\t\t$this->collect_type = $collect_type;\n\t\t\t\n\t\t\t\n\t\t\t$this->display('collect-list');\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\tfunction addcollect(){\n\t\t$this->fields_biaoshi = 'collect';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data['addtime'] = strtotime($this->frparam('addtime',1));\n\t\t\t$data['title'] = $this->frparam(\"title\",1);\n\t\t\t$data['description'] = $this->frparam(\"description\",1);\n\t\t\t$data['litpic'] = $this->frparam(\"litpic\",1);\n\t\t\t$data['url'] = $this->frparam(\"url\",1);\n\t\t\t$data['w'] = $this->frparam(\"w\",1);\n\t\t\t$data['h'] = $this->frparam(\"h\",1);\n\t\t\t$data['tid'] = $this->frparam(\"tid\");\n\t\t\t$data['isshow'] = $this->frparam(\"isshow\");\n\t\t\t$data['orders'] = $this->frparam(\"orders\");\n\t\t\tif(!$data['tid']){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('请选择分类！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t$data = get_fields_data($data,'collect');\n\t\t\tif(M('collect')->add($data)){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功！继续添加~'),'url'=>U('addcollect',array('tid'=>$data['tid']))));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t$collect_type = M('collect_type')->findAll(null);\n\t\t$this->tid = $this->frparam('tid') ? $this->frparam('tid') : 0;\n\t\t$this->collect_type = $collect_type;\n\t\t$this->display('collect-add');\n\t}\n\t\n\tfunction copycollect(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('collect')->find(['id'=>$id]);\n\t\t\tunset($data['id']);\n\t\t\tif(M('collect')->add($data)){\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('复制成功！')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('复制失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$all = M('collect')->findAll('id in('.$data.')');\n\t\t\tif(M('collect')->delete('id in('.$data.')')){\n\t\t\t\tforeach($all as $v){\n\t\t\t\t\t$w['molds'] = 'collect';\n\t\t\t\t\t$w['data'] = serialize($v);\n\t\t\t\t\t$w['title'] = '['.$v['id'].']'.$v['title'];\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction editcollect(){\n\t\t$this->fields_biaoshi = 'collect';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data['addtime'] = strtotime($this->frparam('addtime',1));\n\t\t\t$data['title'] = $this->frparam(\"title\",1);\n\t\t\t$data['description'] = $this->frparam(\"description\",1);\n\t\t\t$data['litpic'] = $this->frparam(\"litpic\",1);\n\t\t\t$data['url'] = $this->frparam(\"url\",1);\n\t\t\t$data['w'] = $this->frparam(\"w\",1);\n\t\t\t$data['h'] = $this->frparam(\"h\",1);\n\t\t\t$data['tid'] = $this->frparam(\"tid\");\n\t\t\t$data['isshow'] = $this->frparam(\"isshow\");\n\t\t\t$data['orders'] = $this->frparam(\"orders\");\n\t\t\tif(!$data['tid']){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('请选择分类！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t$data = get_fields_data($data,'collect');\n\t\t\tif($this->frparam('id')){\n\t\t\t\tif(M('collect')->update(array('id'=>$this->frparam('id')),$data)){\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('index')));\n\t\t\t\t\texit;\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t\t\texit;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\tif($this->frparam('id')){\n\t\t\t$this->data = M('collect')->find(array('id'=>$this->frparam('id')));\n\t\t}\n\t\t$collect_type = M('collect_type')->findAll(null);\n\t\t\n\t\t$this->collect_type = $collect_type;\n\t\t$this->display('collect-edit');\n\t\t\n\t}\n\t\n\tfunction deletecollect(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('collect')->find(['id'=>$id]);\n\t\t\tif(M('collect')->delete(['id'=>$id])){\n\t\t\t\t$w['molds'] = 'collect';\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['title'];\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\tM('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction collectType(){\n\t\t$lists = M(\"collect_type\")->findAll();\n\t\t$this->lists = $lists;\n\t\t$this->display('collecttype-list');\n\t}\n\t\n\tfunction collectTypeAdd(){\n\t\tif($this->frparam('go')==1){\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t\t$data['addtime'] = time();\n\t\t\t\tif(M('collect_type')->add($data)){\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功！')));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败！')));\n\t\t\t\t}\n\t\t}\n\t\t$this->display('collecttype-add');\n\t}\n\n\tfunction collectTypeEdit(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\tif($this->frparam('go')==1){\n\t\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t\t$data['addtime'] = time();\n\t\t\t\tif(M('collect_type')->update(array('id'=>$id),$data)){\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t$data =  M(\"collect_type\")->find(array('id'=>$id));\n\t\t\t$this->data = $data;\n\t\t\t$this->display('collecttype-edit');\n\t\t}\n\n\t}\n\n\tfunction collectTypeDelete(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t//检测该分类下是否存在内容\n\t\t\t$r = M('collect')->getCount(array('tid'=>$id));\n\t\t\tif($r){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('该分类下存在内容，请先删除该分类下的内容！')));\n\t\t\t}\n            $data = M('collect_type')->find(['id'=>$id]);\n\t\t\tif(M('collect_type')->delete(['id'=>$id])){\n                $w['molds'] = 'collect_type';\n                $w['data'] = serialize($data);\n                $w['title'] = '['.$data['id'].']'.$data['title'];\n                $w['addtime'] = time();\n                M('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/admin/c/CommentController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass CommentController extends CommonController\n{\n\t\n\n\tfunction addcomment(){\n\t\t$this->fields_biaoshi = 'comment';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data['addtime'] = strtotime($data['addtime']);\n\t\t\t$data['body'] = $this->frparam('body',4);\n\t\t\t$data['reply'] = $this->frparam('reply',4);\n\t\t\t$data['userid'] = $_SESSION['admin']['id'];\n\t\t\t\n\t\t\t\n\t\t\t$data = get_fields_data($data,'comment');\n\t\t\t\n\t\t\tif(M('Comment')->add($data)){\n\t\t\t\t//Success('添加成功！',U('index'));\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功！')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\t//Error('添加失败！');\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t//$classtype = M('classtype')->findAll(null,'orders desc');\n\t\t//$classtype = getTree($classtype);\n\t\n\t\t$this->classtypes = $this->classtypetree;;\n\t\t$this->display('comment-add');\n\t}\n\n\t//批量删除评论\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$all = M('comment')->findAll('id in('.$data.')');\n\t\t\tif(M('comment')->delete('id in('.$data.')')){\n\t\t\t\tforeach($all as $v){\n\t\t\t\t\t$w['molds'] = 'comment';\n\t\t\t\t\t$w['data'] = serialize($v);\n\t\t\t\t\t$w['title'] = '['.$v['id'].']'.newstr($v['body'],40);\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\tM('recycle')->add($w);\n                    if($this->classtypedata[$v['tid']] && $v['aid']){\n                        M($this->classtypedata[$v['tid']]['molds'])->goDec(['id'=>$v['aid']],'comment_num');\n                    }\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//评论管理\n\tfunction commentlist(){\n\t\t\n\t\t$this->tid=  $this->frparam('tid');\n\t\t$this->aid = $this->frparam('aid');\n\t\t$this->isshow = $this->frparam('isshow');\n\t\t$this->userid = $this->frparam('userid');\n\t\t$this->body = $this->frparam('body',1);\n\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>'comment','islist'=>1),'orders desc');\n\t\t$data = $this->frparam();\n\t\t$res = molds_search('comment',$data);\n\t\t$get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n\t\t$this->fields_search = $res['fields_search'];\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->molds = M('molds')->find(['biaoshi'=>'comment']);\n\t\tif($this->frparam('ajax')){\n\t\t\t\n\t\t\t$page = new Page('Comment');\n\t\t\t$sql = '1=1';\n\t\t\tif($this->isshow==1){\n\t\t\t\t$sql .= ' and isshow=1 ';\n\t\t\t}else if($this->isshow==2){\n\t\t\t\t$sql .= ' and isshow=0 ';\n\t\t\t}else if($this->isshow==3){\n\t\t\t\t$sql .= ' and isshow=2 ';\n\t\t\t}\n\t\t\tif($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['iscontrol']!=0 && $this->molds['isclasstype']==1){\n\t\t\t\t$a1 = explode(',',$this->tids);\n\t\t\t\t$a2 = array_filter($a1);\n\t\t\t\t$tids = implode(',',$a2);\n\t\t\t\t$sql.=' and tid in('.$tids.') ';\n\t\t\t}\n\t\t\t\n\t\t\tif($this->frparam('tid')){\n\t\t\t\t$sql .= ' and tid='.$this->frparam('tid');\n\t\t\t}\n\t\t\tif($this->frparam('aid')){\n\t\t\t\t$sql.=\" and aid = \".$this->frparam('aid').\" \";\n\t\t\t}\n\t\t\tif($this->frparam('body',1)){\n\t\t\t\t$sql.=\" and body like  '%\".$this->frparam('body',1).\"%' \";\n\t\t\t}\n\t\t\tif($this->frparam('userid')!=0){\n\t\t\t\t$sql.=\" and userid = \".$this->frparam('userid').\" \";\n\t\t\t}\n\t\t\t$sql .= $get_sql;\n\t\t\t$data = $page->where($sql)->orderby('addtime desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t$ajaxdata = [];\n\t\t\t$classtypedata = classTypeData();\n\t\t\t\n\t\t\tforeach($data as $k=>$v){\n\t\t\t\t$v['new_username'] = $v['userid']!=0 ? get_info_table('member',array('id'=>$v['userid']),'username') : '';\n\t\t\t\t$v['new_user'] = $v['userid']!=0 ? U('Member/memberedit',['id'=>$v['userid']]) : '';\n\t\t\t\tif($v['tid']!=0 && isset($classtypedata[$v['tid']])){\n\t\t\t\t\t$v['new_tid'] = $classtypedata[$v['tid']]['classname'];\n\t\t\t\t}else{\n\t\t\t\t\t$v['new_tid'] =  '';\n\t\t\t\t}\n\t\t\t\tif($v['aid']!=0 && $v['tid']!=0 && isset($classtypedata[$v['tid']])){\n\t\t\t\t\t$adata = M($classtypedata[$v['tid']]['molds'])->find(['id'=>$v['aid']]);\n\t\t\t\t\tif($adata){\n\t\t\t\t\t\t$v['new_aid_url'] = get_domain().'/'.$adata['htmlurl'].'/'.$v['aid'];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$v['new_aid_url'] = '';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$v['new_aid_url'] = '';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$v['new_zid'] = $v['zid']!=0 ? U('Comment/editcomment',array('id'=>$v['zid'])) : '';\n\t\t\t\t$v['new_pid'] = $v['pid']!=0 ? U('Comment/editcomment',array('id'=>$v['pid'])) : '';\n\t\t\t\tif($v['isshow']==1){\n\t\t\t\t\t$v['new_isshow'] = JZLANG('已审核');\n\t\t\t\t}else if($v['isshow']==2){\n\t\t\t\t\t$v['new_isshow'] = JZLANG('被删除');\n\t\t\t\t}else{\n\t\t\t\t\t$v['new_isshow'] = JZLANG('未审核');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$v['new_isread'] = $v['isread']==1 ? JZLANG('已读') : JZLANG('未读');\n\t\t\t\t$v['new_addtime'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t\t$v['edit_url'] = U('Comment/editcomment',array('id'=>$v['id']));\n\t\t\t\t\n\t\t\t\tforeach($this->fields_list as $vv){\n\t\t\t\t\t$v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n\t\t\t\t}\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t$this->display('comment-list');\n\t\t\n\t\t\n\t}\n\t\n\tpublic function editcomment(){\n\t\t$this->fields_biaoshi = 'comment';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n            foreach($data as $k=>$v){\n                $data[$k] = $this->frparam($k,1);\n            }\n\t\t\t$data['addtime'] = strtotime($data['addtime']);\n\t\t\t$data['body'] = $this->frparam('body',4);\n\t\t\t$data['reply'] = $this->frparam('reply',4);\n\t\t\t$data = get_fields_data($data,'comment');\n\t\t\tif($this->frparam('id')){\n\t\t\t\tif(M('Comment')->update(array('id'=>$this->frparam('id')),$data)){\n\t\t\t\t\tif($this->frparam('ismsg') && $data['reply']){\n\t\t\t\t\t\t$task['aid'] = $this->frparam('id');\n\t\t\t\t\t\t$task['tid'] = $data['tid'];\n\t\t\t\t\t\t$task['userid'] = $data['userid'];\n\t\t\t\t\t\t$task['puserid'] = 0;\n\t\t\t\t\t\t$task['molds'] = $this->classtypedata[$data['tid']]['molds'];\n\t\t\t\t\t\t$task['type'] = 'comment';\n\t\t\t\t\t\t$task['addtime'] = time();\n\t\t\t\t\t\t$task['body'] = $data['reply'];\n\t\t\t\t\t\tif(!$data['aid']){\n\t\t\t\t\t\t\t$url = $this->classtypedata[$data['tid']]['url'];\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t//非栏目评论\n\t\t\t\t\t\t\t$res=M($this->classtypedata[$data['tid']]['molds'])->find(['id'=>$data['aid']]);\n\t\t\t\t\t\t\t$url = gourl($res,$res['htmlurl']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$task['url'] = $url;\n\t\t\t\t\t\tM('task')->add($task);\n\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('index')));\n\t\t\t\t\texit;\n\t\t\t\t}else{\n\t\t\t\t\t//Error('修改失败！');\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t\t\texit;\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\tif($this->frparam('id')){\n\t\t\t$this->data = M('Comment')->find(array('id'=>$this->frparam('id')));\n\t\t}\n\t\t//$classtype = M('classtype')->findAll(null,'orders desc');\n\t\t//$classtype = getTree($classtype);\n\t\n\t\t$this->classtypes = $this->classtypetree;;\n\t\t$this->display('comment-details');\n\t\t\n\t}\n\tfunction deletecomment(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('Comment')->find(['id'=>$id]);\n\t\t\tif(M('Comment')->delete(['id'=>$id])){\n\t\t\t\t$w['molds'] = 'comment';\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['title'] = '['.$data['id'].']'.newstr($data['body'],40);\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\tM('recycle')->add($w);\n                //更新统计数\n                if($this->classtypedata[$data['tid']] && $data['aid']){\n                    M($this->classtypedata[$data['tid']]['molds'])->goDec(['id'=>$data['aid']],'comment_num');\n                }\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\t//Error('删除失败！');\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t//批量审核\n\tfunction checkAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$isshow = $this->frparam('isshow')==1 ? 1 : 0;\n\t\t\tM('comment')->update('id in('.$data.')',['isshow'=>$isshow]);\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量审核成功！')));\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量审核失败！')));\n\t\t}\n\t}\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/admin/c/CommonController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\nnamespace app\\admin\\c;\n\nuse frphp\\lib\\Controller;\nclass CommonController extends Controller\n{\n\tfunction _init(){\n        if(class_exists('app\\admin\\plugins\\CommonController')){\n            $extCommonModel = new \\app\\admin\\plugins\\CommonController($this->frparam());\n            if(method_exists($extCommonModel,APP_ACTION)){\n                $action = APP_ACTION;\n                $extCommonModel->$action();\n                exit;\n            }\n            \n        }\n\t    \n      if(!isset($_SESSION['admin']) || !$_SESSION['admin']['id']){\n\t\t   $_SESSION['admin'] = null;\n      \t   Redirect(U('Login/index'));\n        \n      }\n \n      if($_SESSION['admin']['isadmin']!=1){\n\t\tif(strpos($_SESSION['admin']['paction'],','.APP_CONTROLLER.',')!==false){\n        \n        }else{\n\t\t\t$action = APP_CONTROLLER.'/'.APP_ACTION;\n\t\t\tif(strpos($_SESSION['admin']['paction'],','.$action.',')===false){\n\t\t\t   $ac = M('Ruler')->find(array('fc'=>$action));\n\t\t\t   if($this->frparam('ajax')){\n\t\t\t\t   \n\t\t\t\t   JsonReturn(['code'=>1,'msg'=>JZLANG('您没有权限！').'【'.JZLANG($ac['name']).'】','url'=>U('Index/welcome')]);\n\t\t\t   }\n\t\t\t   Error(JZLANG('您没有权限！').'【'.$ac['name'].'】',U('Index/welcome'));\n\t\t\t}\n\t\t}\n      \n      \n      }\n\n\t  \n\t  $this->admin = $_SESSION['admin'];\n\t  \n\t  $webconf = webConf();\n\t  $template = TEMPLATE;\n\t  $this->webconf = $webconf;\n\t  $this->template = $template;\n\t  $this->tpl = Tpl_style.$template.'/';\n\t  $customconf = get_custom();\n\t  $this->customconf = $customconf;\n\t  $this->classtypetree =  get_classtype_tree();\n\t  $m = 1;\n\t\tif(isMobile() && $webconf['iswap']==1){\n\t\t\t$classtypedata = classTypeDataMobile();\n\t\t\t$m = 1;\n\t\t}else{\n\t\t\t$classtypedata = classTypeData();\n\t\t\t$m = 0;\n\t\t}\n\t\t\n\t\t$this->classtypedata = getclasstypedata($classtypedata,$m);\n\t  \n\n\t  if($_SESSION['admin']['isadmin']!=1){\n\t\t\t$tids = $_SESSION['admin']['tids'] ?: '000';\n\t\t\tforeach ($this->classtypetree as $k => $v) {\n\t\t\t\tif($v['pid']==0){\n\t\t\t\t\tif(strpos($_SESSION['admin']['tids'],','.$v['id'].',')!==false){\n\t\t\t\t\t\t$children = get_children($v,$this->classtypetree,5);\n\t\t\t\t\t\tforeach($children as $vv){\n\t\t\t\t\t\t\tif(strpos($_SESSION['admin']['tids'],','.$vv['id'].',')===false){\n\t\t\t\t\t\t\t\t$tids .= ','.$vv['id'].',';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}else{\n\t\t\t$tids = '000';\n\t\t}\n\t\t$this->tids = $tids;\n    \n    }\n\t\n\tfunction uploads(){\n\t\tif ($_FILES[\"file\"][\"error\"] > 0){\n\t\t  $data['error'] =  \"Error: \" . $_FILES[\"file\"][\"error\"];\n\t\t  $data['code'] = 1000;\n\t\t}else{\n\t\t  // echo \"Upload: \" . $_FILES[\"file\"][\"name\"] . \"<br />\";\n\t\t  // echo \"Type: \" . $_FILES[\"file\"][\"type\"] . \"<br />\";\n\t\t  // echo \"Size: \" . ($_FILES[\"file\"][\"size\"] / 1024) . \" Kb<br />\";\n\t\t  // echo \"Stored in: \" . $_FILES[\"file\"][\"tmp_name\"];\n\t\t  $pix = explode('.',$_FILES['file']['name']);\n\t\t  $pix = end($pix);\n\t\t  \n\t\t  \n\t\t    $fileType = $this->webconf['fileType'];\n\t\t\tif(strpos($fileType,strtolower($pix))===false   || stripos($pix,'php')!==false || stripos($pix,'phtml')!==false || stripos($pix,'phar')!==false){\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"文件类型不允许上传！\");\n\t\t\t\t$data['code'] = 1002;\n\t\t\t\tJsonReturn($data);\n\t\t\t}\n\t\t\t$fileSize = (int)webConf('fileSize');\n\t\t\tif($fileSize!=0 && ($_FILES[\"file\"][\"size\"]/1024)>$fileSize){\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"文件大小超过网站内部限制！\");\n\t\t\t\t$data['code'] = 1003;\n\t\t\t\tJsonReturn($data);\n\t\t\t}\n\t\t  if(isset($this->webconf['admin_save_path'])){\n\t\t\t  //替换日期事件\n\t\t\t\t$t = time();\n\t\t\t\t$d = explode('-', date(\"Y-y-m-d-H-i-s\"));\n\t\t\t\t$format = $this->webconf['admin_save_path'];\n\t\t\t\t$format = str_replace(\"{yyyy}\", $d[0], $format);\n\t\t\t\t$format = str_replace(\"{yy}\", $d[1], $format);\n\t\t\t\t$format = str_replace(\"{mm}\", $d[2], $format);\n\t\t\t\t$format = str_replace(\"{dd}\", $d[3], $format);\n\t\t\t\t$format = str_replace(\"{hh}\", $d[4], $format);\n\t\t\t\t$format = str_replace(\"{ii}\", $d[5], $format);\n\t\t\t\t$format = str_replace(\"{ss}\", $d[6], $format);\n\t\t\t\t$format = str_replace(\"{time}\", $t, $format);\n\t\t\t\tif($format!=''){\n\t\t\t\t\t//检查文件是否存在\n\t\t\t\t\tif(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){\n\t\t\t\t\t\t$path = explode('/',$format);\n\t\t\t\t\t\t$path1 = APP_PATH;\n\t\t\t\t\t\tforeach($path as $v){\n\t\t\t\t\t\t\tif($path1==APP_PATH){\n\t\t\t\t\t\t\t\tif(!file_exists($path1.$v)){\n\t\t\t\t\t\t\t\t\tmkdir($path1.$v,0777);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$path1.=$v;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif(!file_exists($path1.'/'.$v)){\n\t\t\t\t\t\t\t\t\tmkdir($path1.'/'.$v,0777);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$path1.='/'.$v;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(!file_exists(APP_PATH.$format)){\n\t\t\t\t\t\tmkdir(APP_PATH.$format,0777);\n\t\t\t\t\t}\n\t\t\t\t\t$admin_save_path = $format;\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$admin_save_path = 'public/Admin';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t  }else{\n\t\t\t $admin_save_path = 'public/Admin';\n\t\t  }\n            \n          if(!isset($this->webconf['upload_file_name']) || (isset($this->webconf['upload_file_name']) && $this->webconf['upload_file_name'])){\n              $filename =  $admin_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix;\n              $filename_x =  $admin_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix;\n          }else{\n\t\t      $name = urldecode($_FILES['file']['name']);\n\t\t      $name = str_ireplace([\"'\",'\"','%','&',' '],'',$name);\n\t\t      $name = format_param($name,6);\n              $filename =  $admin_save_path.'/'.$name;\n              $filename_x =  $admin_save_path.'/'.$name;\n          }\n\t\t  \n\t\t  \n\t\t\tif(move_uploaded_file($_FILES[\"file\"]['tmp_name'],$filename)){\n\t\t\t\n\t\t\t\tif( (strtolower($pix)=='png' && $this->webconf['ispngcompress']==1) || strtolower($pix)=='jpg' || strtolower($pix)=='jpeg'){\n\t\t\t\t\t$imagequlity = (int)$this->webconf['imagequlity'];\n\t\t\t\t\tif($imagequlity!=100){\n\t\t\t\t\t\t$image = new \\compressimage($filename);\n    \t\t\t\t\t$image->percent = 1;\n\t\t\t\t\t\t$image->ispngcompress = $this->webconf['ispngcompress'];\n    \t\t\t\t\t$image->quality = $imagequlity=='' ? 75 : $imagequlity;\n    \t\t\t\t\t$image->openImage();\n    \t\t\t\t\t$image->thumpImage();\n    \t\t\t\t\t//$image->showImage();\n    \t\t\t\t\tunlink($filename);\n    \t\t\t\t\t$image->saveImage($filename_x);\n    \t\t\t\t\t$filename = $filename_x;\n\t\t\t\t\t}\n\t\t\t\t   \n\t\t\t\t}\n\t\t\t\tif( (strtolower($pix)=='png' || strtolower($pix)=='jpg' || strtolower($pix)=='jpeg') && $this->webconf['iswatermark']==1 ){\n                    watermark($filename,APP_PATH.$this->webconf['watermark_file'],$this->webconf['watermark_t'],$this->webconf['watermark_tm'],$this->webconf['text_word']);\n\t\t\t\t}\n\t\t\t\t$data['url'] = '/'.$filename;\n\t\t\t\t$data['code'] = 0;\n\t\t\t\t$filesize = round(filesize(APP_PATH.$filename)/1024,2);\n\t\t\t\tM('pictures')->add(['litpic'=>'/'.$filename,'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid',0,0),'molds'=>$this->frparam('molds',1,null)]);\n\t\t\t\t\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"请检查目录写入权限\").\"[\".$admin_save_path.\"]\";\n\t\t\t\t$data['code'] = 1001;\n\t\t\t\t  \n\t\t\t} \n\n\t\t\t  \n\t\t  \n\t\t  }\n\n\t\t  JsonReturn($data);\n\t\t  \n\t}\n\t\n\t\n\t\n\t\n\n}"
  },
  {
    "path": "app/admin/c/ErrorController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\nuse frphp\\lib\\Controller;\nclass ErrorController extends Controller\n{\n\t//错误处理示例\n    function index($msg=''){\n        header(\"HTTP/1.0 404\");\n        if(APP_DEBUG){\n            $msg = format_param($msg,1);\n            echo JZLANG('错误信息提示').'：<br/>';\n            echo $msg;\n        }else{\n            echo '<!doctype html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n<title>404</title>\n<style>\n\tbody{\n\t\tbackground-color:#444;\n\t\tfont-size:14px;\n\t}\n\th3{\n\t\tfont-size:60px;\n\t\tcolor:#eee;\n\t\ttext-align:center;\n\t\tpadding-top:30px;\n\t\tfont-weight:normal;\n\t}\n</style>\n</head>\n\n<body>\n<h3>404，您请求的文件不存在!</h3>\n</body>\n</html>';\n        }\n        \n        \n    }\n}\n\t"
  },
  {
    "path": "app/admin/c/ExtmoldsController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\nuse frphp\\lib\\Controller;\nuse frphp\\extend\\Page;\n\nclass ExtmoldsController extends Controller\n{\n\tfunction _init(){\n\t\tif(!isset($_SESSION['admin']) || !$_SESSION['admin']['id']){\n\t\t\tRedirect(U('Login/index'));\n\t\t\t\n\t\t}\n\t\t\t\n\t\tif($_SESSION['admin']['isadmin']!=1){\n\t\t\tif(strpos($_SESSION['admin']['paction'],','.APP_CONTROLLER.',')===false){\n\t\t\t\t$molds = $this->frparam('molds',1);\n\t\t\t\t$action = APP_CONTROLLER.'/'.APP_ACTION.'/molds/'.$molds;\n\t\t\t\t\n\t\t\t\tif(strpos($_SESSION['admin']['paction'],','.$action.',')===false){\n\t\t\t\t   $ac = M('Ruler')->find(array('fc'=>$action));\n\t\t\t\t   if($this->frparam('ajax')){\n\t\t\t\t\t   \n\t\t\t\t\t   JsonReturn(['code'=>1,'msg'=>JZLANG('您没有权限！').'【'.JZLANG($ac['name']).'】','url'=>U('Index/welcome')]);\n\t\t\t\t   }\n\t\t\t\t   Error(JZLANG('您没有权限！').'【'.$ac['name'].'】',U('Index/welcome'));\n\t\t\t\t}\n\t\t\t}\n\t\t   \n\t\t  \n\t\t}\n\t\t $this->admin = $_SESSION['admin'];\n\t\t\n\t\t  $webconf = webConf();\n\t\t  $template = TEMPLATE;\n\t\t  $this->webconf = $webconf;\n\t\t  $this->template = $template;\n\t\t  $this->tpl = Tpl_style.$template.'/';\n\t\t  $customconf = get_custom();\n\t\t  $this->customconf = $customconf;\n\t\t  $this->classtypetree =  get_classtype_tree();\n\t\t  $m = 1;\n\t\t\tif(isMobile() && $webconf['iswap']==1){\n\t\t\t\t$classtypedata = classTypeDataMobile();\n\t\t\t\t$m = 1;\n\t\t\t}else{\n\t\t\t\t$classtypedata = classTypeData();\n\t\t\t\t$m = 0;\n\t\t\t}\n\t\t\t\n\t\t\t$this->classtypedata = getclasstypedata($classtypedata,$m);\n\t  \n\t\t  if($_SESSION['admin']['isadmin']!=1){\n\t\t\t$tids = $_SESSION['admin']['tids'] ?: '000';\n\t\t\tforeach ($this->classtypetree as $k => $v) {\n\t\t\t\tif($v['pid']==0){\n\t\t\t\t\tif(strpos($_SESSION['admin']['tids'],','.$v['id'].',')!==false){\n\t\t\t\t\t\t$children = get_children($v,$this->classtypetree,5);\n\t\t\t\t\t\tforeach($children as $vv){\n\t\t\t\t\t\t\tif(strpos($_SESSION['admin']['tids'],','.$vv['id'].',')===false){\n\t\t\t\t\t\t\t\t$tids .= ','.$vv['id'].',';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}else{\n\t\t\t$tids = '000';\n\t\t}\n\t\t$this->tids = $tids;\n\t}\n\tpublic function index(){\n\t\t\n\t\t$classtypedata = $this->classtypedata;\n\t\t$molds = $this->frparam('molds',1);\n\t\tif($molds==''){\n\t\t\tError(JZLANG('模块为空，请选择模块！'));\n\t\t}\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$molds));\n\t\t$data = $this->frparam();\n\t\t$res = molds_search($molds,$data);\n\t\t$this->isshow = $this->frparam('isshow');\n\t\t$this->tid = $this->frparam('tid');\n\t\t$this->fields_search = $res['fields_search'];\n\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>$molds,'islist'=>1),'listorders desc');\n\t\t$this->classtypes = $this->classtypetree;\n\t\tif($this->frparam('ajax')){\n\t\t\t\n\t\t\t$sql = '1=1';\n\t\t\tif($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['isclasstype']==1 && $this->molds['iscontrol']!=0){\n\t\t\t\t$a1 = explode(',',$this->tids);\n\t\t\t\t$a2 = array_filter($a1);\n\t\t\t\t$tids = implode(',',$a2);\n\t\t\t\t$sql.=' and tid in('.$tids.') ';\n\t\t\t}\n\t\t\t\n\t\t\t$get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n\t\t\t$sql .= $get_sql;\n\t\t\t\n\t\t\t\n\t\t\t$page = new Page($molds);\n\t\t\t$data = $page->where($sql)->orderby('istop desc,orders desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t$ajaxdata = [];\n\t\t\tforeach($data as $k=>$v){\n\t\t\t\tif(isset($classtypedata[$v['tid']])){\n\t\t\t\t\t$v['new_tid'] = $v['tid']!=0 ? $classtypedata[$v['tid']]['classname'] : '-';\n\t\t\t\t}else{\n\t\t\t\t\t$v['new_tid'] = '[未分类]';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif($molds=='tags'){\n\t\t\t\t\t$v['view_url'] = get_domain().'/tags/index/id/'.$v['id'];\n\t\t\t\t}else{\n\t\t\t\t\t$v['view_url'] = gourl($v,$v['htmlurl']);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$v['edit_url'] = U('Extmolds/editmolds',array('id'=>$v['id'],'molds'=>$molds));\n\t\t\t\t\n\t\t\t\tforeach($this->fields_list as $vv){\n\t\t\t\t\t$v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n\t\t\t\t}\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\tif(file_exists(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/'.$molds.'-list.html')){\n\t\t\t$this->display($molds.'-list');\n\t\t}else{\n\t\t\t$this->display('extmolds-list');\n\t\t}\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\tpublic function addmolds(){\n\t\t$molds = $this->frparam('molds',5);\n\t\t$this->fields_biaoshi = $molds;\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,$molds);\n            check_field_must($data,$molds);\n\t\t\tif($data['tid']){\n\t\t\t\t$data['htmlurl'] = $this->classtypedata[$data['tid']]['htmlurl'];\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t//处理自定义URL\n\t\t\tif(isset($data['ownurl'])){\n\t\t\t\tif(M('customurl')->find(['molds'=>$molds,'url'=>$data['ownurl']])){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'已存在相同的自定义URL！'));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t$data['userid'] = $this->admin['id'];\n\t\t\t$data['molds'] = $molds;\n\t\t\tif($data['tags']){\n\t\t\t\t$data['tags'] = ','.$data['tags'].',';\n\t\t\t}else if($this->frparam('keywords',1)){\n\t\t\t\t$data['tags'] = ','.str_replace('，',',',$this->frparam('keywords',1)).',';\n\t\t\t}\n\t\t\tif($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){\n\t\t\t\t$data['isshow'] = $this->frparam('isshow',0,1);\n\t\t\t}else{\n\t\t\t\t$data['isshow'] = 0;\n\t\t\t}\n            $data['addtime'] =  isset($data['addtime']) ? $data['addtime'] : time();\n            //检查是否重复\n            if($this->webconf['hidetitleonliy']){\n                $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']);\n                $onliyfield = '';\n                foreach ($hidetitleonly as $s){\n                    $d = explode('-',$s);\n                    if(strtolower($d[0])==$molds){\n                        $onliyfield = strtolower($d[1]);\n                        break;\n                    }\n                }\n                if($onliyfield){\n                    if(M($molds)->find([$onliyfield=>$data[$onliyfield]])){\n                        JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复！')));\n                    }\n                }\n            }\n            \n            $water_models = explode(',',$this->webconf['text_molds']);\n            if(in_array($molds,$water_models)){\n                if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){\n                    $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']);\n                    //存储\n                    $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2);\n                    $pix_arr = explode('.',$data['litpic']);\n                    $pix = end($pix_arr);\n                    M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>$molds]);\n                }else if($this->frparam('litpic',1) && $this->webconf['text_waterlitpic']){\n                    $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->frparam('litpic',1),0);\n                }\n            }\n            //推荐置顶热门\n            if(strpos($data['jzattr'],'1')!==false){\n                $data['istop'] = 1;\n            }else{\n                $data['istop'] = 0;\n            }\n            if(strpos($data['jzattr'],'2')!==false){\n                $data['ishot'] = 1;\n            }else{\n                $data['ishot'] = 0;\n            }\n            if(strpos($data['jzattr'],'3')!==false){\n                $data['istuijian'] = 1;\n            }else{\n                $data['istuijian'] = 0;\n            }\n\t\t\t$r = M($molds)->add($data);\n\t\t\tif($r){\n\t\t\t\tif(isset($data['ownurl'])){\n\t\t\t\t\tM('customurl')->add(['molds'=>$molds,'tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$r]);\n\t\t\t\t}\n\t\t\t\t//tags处理\n\t\t\t\tif($data['tags']){\n\t\t\t\t\t$tags = explode(',',$data['tags']);\n\t\t\t\t\tforeach($tags as $v){\n\t\t\t\t\t\tif($v!=''){\n\t\t\t\t\t\t\t$r = M('tags')->find(['keywords'=>$v]);\n\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\t$w['keywords'] = $v;\n\t\t\t\t\t\t\t\t$w['newname'] = '';\n\t\t\t\t\t\t\t\t$w['url'] = '';\n\t\t\t\t\t\t\t\t$w['num'] = -1;\n\t\t\t\t\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t\t\t\t\t$w['number'] = 1;\n                                $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : '';\n\t\t\t\t\t\t\t\t$w['target'] = '_blank';\n\t\t\t\t\t\t\t\tM('tags')->add($w);\n\t\t\t\t\t\t\t}else{\n                                $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].',';\n                                $ww['tids'] = $tags_tids;\n                                $ww['number'] = $r['number']+1;\n                                M('tags')->update(['keywords'=>$v],$ww);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功,继续添加~'),'url'=>U('Extmolds/addmolds',['tid'=>$data['tid'],'molds'=>$molds])));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败！')));\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->tid =  $this->frparam('tid',0,0);\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$molds));\n\t\tif(file_exists(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/'.$molds.'-add.html')){\n\t\t\t$this->display($molds.'-add');\n\t\t}else{\n\t\t\t$this->display('extmolds-add');\n\t\t}\n\t}\n\t\n\tpublic function editmolds(){\n\t\t$molds = $this->frparam('molds',5);\n\t\t$this->fields_biaoshi = $molds;\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,$molds);\n            check_field_must($data,$molds);\n\t\t\tif($data['tid']){\n\t\t\t\t$data['htmlurl'] = $this->classtypedata[$data['tid']]['htmlurl'];\n\t\t\t}\n\t\t\t\n\t\t\tif($this->frparam('id')){\n\t\t\t\t\n\t\t\t\t//处理自定义URL\n\t\t\t\tif($data['ownurl']){\n\t\t\t\t\t$customurl = M('customurl')->find(['url'=>$data['ownurl']]);\n\t\t\t\t\tif($customurl){\n\t\t\t\t\t\tif($customurl['aid']!=$this->frparam('id')){\n\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL！')));\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tM('customurl')->update(['id'=>$customurl['id']],['url'=>$data['ownurl'],'tid'=>$data['tid'],'molds'=>$molds]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(M('customurl')->find(['aid'=>$this->frparam('id'),'molds'=>$molds])){\n\t\t\t\t\t\t\tM('customurl')->update(['aid'=>$this->frparam('id'),'molds'=>$molds],['url'=>$data['ownurl'],'molds'=>$molds,'tid'=>$data['tid']]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tM('customurl')->add(['molds'=>$molds,'tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$this->frparam('id')]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tM('customurl')->delete(['molds'=>$molds,'aid'=>$this->frparam('id')]);\n\t\t\t\t}\n\t\t\t\tif($data['tags']){\n\t\t\t\t\t$data['tags'] = ','.$data['tags'].',';\n\t\t\t\t}else if($this->frparam('keywords',1)){\n\t\t\t\t\t$data['tags'] = ','.str_replace('，',',',$this->frparam('keywords',1)).',';\n\t\t\t\t}\n\t\t\t\t$old_tags = M($molds)->getField(['id'=>$this->frparam('id')],'tags');\n\t\t\t\tif($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){\n\t\t\t\t\t$data['isshow'] = $this->frparam('isshow',0,1);\n\t\t\t\t}else{\n\t\t\t\t\t$data['isshow'] = 0;\n\t\t\t\t}\n                //检查是否重复\n                if($this->webconf['hidetitleonliy']){\n                    $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']);\n                    $onliyfield = '';\n                    foreach ($hidetitleonly as $s){\n                        $d = explode('-',$s);\n                        if(strtolower($d[0])==$molds){\n                            $onliyfield = strtolower($d[1]);\n                            break;\n                        }\n                    }\n                    if($onliyfield){\n                        $sql = $onliyfield.\"='\".$this->frparam($onliyfield,1).\"' and id!=\".$this->frparam('id');\n                        if(M($molds)->find($sql)){\n                            JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复！')));\n                        }\n                    }\n                }\n                $water_models = explode(',',$this->webconf['text_molds']);\n                if(in_array($molds,$water_models)){\n                    if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){\n                        $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']);\n                        //存储\n                        $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2);\n                        $pix_arr = explode('.',$data['litpic']);\n                        $pix = end($pix_arr);\n                        M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>$molds]);\n                    }\n                }\n                $data['addtime'] = isset($data['addtime']) ? $data['addtime'] : time();\n                $data['updatetime'] = time();\n                //推荐置顶热门\n                if(strpos($data['jzattr'],'1')!==false){\n                    $data['istop'] = 1;\n                }else{\n                    $data['istop'] = 0;\n                }\n                if(strpos($data['jzattr'],'2')!==false){\n                    $data['ishot'] = 1;\n                }else{\n                    $data['ishot'] = 0;\n                }\n                if(strpos($data['jzattr'],'3')!==false){\n                    $data['istuijian'] = 1;\n                }else{\n                    $data['istuijian'] = 0;\n                }\n\t\t\t\tif(M($molds)->update(array('id'=>$this->frparam('id')),$data)){\n\t\t\t\t\t\n\t\t\t\t\tif($old_tags!=$data['tags']){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$a = $old_tags.$data['tags'];\n\t\t\t\t\t\t$new = [];\n\t\t\t\t\t\t$a = explode(',',$a);\n\t\t\t\t\t\tforeach($a as $v){\n\t\t\t\t\t\t\tif($v!='' && !in_array($v,$new)){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t$r = M('tags')->find(['keywords'=>$v]);\n\t\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\t\t$w['keywords'] = $v;\n\t\t\t\t\t\t\t\t\t$w['newname'] = '';\n\t\t\t\t\t\t\t\t\t$w['url'] = '';\n\t\t\t\t\t\t\t\t\t$w['num'] = -1;\n\t\t\t\t\t\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t\t\t\t\t\t$w['number'] = 1;\n                                    $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : '';\n\t\t\t\t\t\t\t\t\t$w['target'] = '_blank';\n\t\t\t\t\t\t\t\t\tM('tags')->add($w);\n\t\t\t\t\t\t\t\t}else{\n\n                                    if(strpos($old_tags,','.$v.',')===false){\n\n                                        if($data['tid']){\n                                            $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].',';\n                                            $ww['tids'] = $tags_tids;\n                                        }\n                                        $ww['number'] = $r['number']+1;\n                                        M('tags')->update(['keywords'=>$v],$ww);\n                                    }else if(strpos($data['tags'],','.$v.',')===false && strpos($old_tags,','.$v.',')!==false){\n                                        if($data['tid']){\n                                            $tags_tids = str_replace(','.$data['tid'].',',',',$r['tids']);\n                                            $ww['tids'] = $tags_tids==',' ? '' : $tags_tids;\n                                        }\n                                        $ww['number'] = $r['number']-1;\n                                        M('tags')->update(['keywords'=>$v],$ww);\n                                    }\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t$new[]=$v;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif($this->webconf['release_award_open']==1 && $data['isshow']==1){\n\t\t\t\t\t\t$award = round($this->webconf['release_award'],2);\n\t\t\t\t\t\t$max_award = round($this->webconf['release_max_award'],2);\n\t\t\t\t\t\t$member_id = M($molds)->getField(['id'=>$this->frparam('id')],'member_id');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$this->frparam('id'),'msg'=>JZLANG('发布奖励')]);\n\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"发布奖励\").\"' \";\n\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\tforeach($all as $v){\n\t\t\t\t\t\t\t\t\t\t$all_jifen+=$v['amount'];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t   \t  \t\t$w['molds'] = $molds;\n\t\t\t\t\t\t   \t  \t\t$w['aid'] = $this->frparam('id');\n\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('发布奖励');\n\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('您未做任何修改，不能提交！')));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('缺少ID')));\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$this->data = M($molds)->find(array('id'=>$this->frparam('id')));\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$molds));\n\t\t$this->tid =  $this->data['tid'];\n\t\t$this->classtypetree =  get_classtype_tree();\n\t\t$this->classtypes = $this->classtypetree;\n\t\tif(file_exists(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/'.$molds.'-edit.html')){\n\t\t\t$this->display($molds.'-edit');\n\t\t}else{\n\t\t\t$this->display('extmolds-edit');\n\t\t}\n\t}\n\t\n\tpublic function  copymolds(){\n\t\t$id = $this->frparam('id');\n\t\t$molds = $this->frparam('molds',1);\n\t\tif($id){\n\t\t\t$data = M($molds)->find(['id'=>$id]);\n\t\t\tunset($data['id']);\n\t\t\tif(M($molds)->add($data)){\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('复制成功！')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('复制失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t}\n\t\n\t//批量删除\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\t$molds = $this->frparam('molds',1);\n\t\tif($data!=''){\n\t\t\t$all = M($molds)->findAll('id in('.$data.')');\n\t\t\tif(M($molds)->delete('id in('.$data.')')){\n\t\t\t\t$customurls = M('customurl')->findAll(\" aid in(\".$data.\") and molds='\".$molds.\"' \");\n\t\t\t\tM('customurl')->delete(\" aid in(\".$data.\") and molds='\".$molds.\"' \");\n\t\t\t\t$newcustomurl = [];\n\t\t\t\tif($customurls){\n\t\t\t\t\tforeach($customurls as $v){\n\t\t\t\t\t\t$newcustomurl[$v['aid']] = $v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tforeach($all as $v){\n\t\t\t\t\t$w['molds'] = $molds;\n\t\t\t\t\t$w['data'] = serialize($v);\n\t\t\t\t\t$w['title'] = '['.$v['id'].']'.$v['title'];\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t$x = M('recycle')->add($w);\n\t\t\t\t\tif($x && $newcustomurl[$v['id']]){\n\t\t\t\t\t\t$w['molds'] = 'customurl';\n                        $w['title'] = '['.$newcustomurl['id'].']'.JZLANG('自定义链接');\n\t\t\t\t\t\t$w['data'] = serialize($newcustomurl[$v['id']]);\n\t\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t\t$w['aid'] = $x;\n\t\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t//单一删除\n\tfunction deletemolds(){\n\t\t$id = $this->frparam('id');\n\t\t$molds = $this->frparam('molds',1);\n\t\tif($id){\n\t\t\t$data = M($molds)->find(['id'=>$id]);\n\t\t\tif(M($molds)->delete(['id'=>$id])){\n\t\t\t\t$customurl = M('customurl')->find(['molds'=>$molds,'aid'=>$id]);\n\t\t\t\tM('customurl')->delete(['molds'=>$molds,'aid'=>$id]);\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['title'];\n\t\t\t\t$w['molds'] = $molds;\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\t$r = M('recycle')->add($w);\n\t\t\t\tif($customurl){\n\t\t\t\t\t$w['molds'] = 'customurl';\n                    $w['title'] = '['.$customurl['id'].']'.JZLANG('自定义链接');\n\t\t\t\t\t$w['data'] = serialize($customurl);\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t$w['aid'] = $r;\n\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\t//修改排序\n\tfunction editOrders(){\n\n\t\t$field = $this->frparam('field',1);\n\t\t$w[$field] = $this->frparam('value',1);\n\t\t$molds = $this->frparam('molds',1);\n\t\t$r = M($molds)->update(array('id'=>$this->frparam('id')),$w);\n\t\tif(!$r){\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\n\t\t}\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\n\n\t}\n\t//批量修改栏目\n\tfunction changeType(){\n\t\t$data = $this->frparam('data',1);\n\t\t$molds = $this->frparam('molds',1);\n\t\t$tid = $this->frparam('tid');\n\t\tif($data!=''){\n\t\t\t$list = M($molds)->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\t$w['tid'] = $tid;\n\t\t\t\t$type = M('classtype')->find(array('id'=>$tid));\n\t\t\t\t$w['htmlurl'] = $type['htmlurl'];\n\t\t\t\tM($molds)->update(array('id'=>$v['id']),$w);\n\t\t\t\tif($v['ownurl']){\n\t\t\t\t\tM('customurl')->update(['aid'=>$v['id'],'molds'=>$molds],['tid'=>$tid]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功！')));\n\t\t}\n\t}\n\n    //批量修改推荐属性\n    function changeAttribute(){\n        $data = $this->frparam('data',1);\n        $molds = $this->frparam('molds',1);\n        $tj = $this->frparam('tj');\n        if($data && $molds){\n            $list = M($molds)->findAll('id in('.$data.')');\n\n            foreach($list as $v){\n                if(strpos($v['jzattr'],','.$tj.',')!==false){\n                    $attr = str_replace(','.$tj.',','',$v['jzattr']);\n                    if(!$attr){\n                        $w['jzattr'] = '';\n                    }else{\n                        $w['jzattr'] = ','.trim($attr,',').',';\n                    }\n                }else{\n                    if($v['jzattr']){\n                        $w['jzattr'] = $v['jzattr'].$tj.',';\n                    }else{\n                        $w['jzattr'] = ','.$tj.',';\n                    }\n                }\n                if(strpos($w['jzattr'],'1')!==false){\n                    $w['istop'] = 1;\n                }else{\n                    $w['istop'] = 0;\n                }\n                if(strpos($w['jzattr'],'2')!==false){\n                    $w['ishot'] = 1;\n                }else{\n                    $w['ishot'] = 0;\n                }\n                if(strpos($w['jzattr'],'3')!==false){\n                    $w['istuijian'] = 1;\n                }else{\n                    $w['istuijian'] = 0;\n                }\n                M($molds)->update(array('id'=>$v['id']),$w);\n            }\n            JsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功！')));\n        }\n    }\n\n\t//批量复制\n\tfunction copyAll(){\n\t\t$data = $this->frparam('data',1);\n\t\t$molds = $this->frparam('molds',1);\n\t\tif($data!=''){\n\t\t\t$list = M($molds)->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\tunset($v['id']);\n\t\t\t\tM($molds)->add($v);\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量复制成功！')));\n\t\t\t\t\n\t\t}\n\t}\n\n\t//批量审核\n\tfunction checkAll(){\n\t\t$data = $this->frparam('data',1);\n\t\t$molds = $this->frparam('molds',1);\n\t\tif($data!=''){\n\t\t\tif($this->frparam('isshow')==1){\n\t\t\t\t$isshow = 1;\n\t\t\t}else if($this->frparam('isshow')==2){\n\t\t\t\t$isshow = 0;\n\t\t\t}else{\n\t\t\t\t$isshow = 2;\n\t\t\t}\n\t\t\tif($isshow==1){\n\t\t\t\t$all = M($molds)->findAll('id in('.$data.')');\n\t\t\t\t$award = round($this->webconf['release_award'],2);\n\t\t\t\t$max_award = round($this->webconf['release_max_award'],2);\n\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\tforeach ($all as $k => $v) {\n\t\t\t\t\tif($v['isshow']!=1){\n\t\t\t\t\t\t//start\n\t\t\t\t\t\tif($this->webconf['release_award_open']==1){\n\t\t\t\t\t\t\t$member_id = $v['member_id'];\n\t\t\t\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$v['id'],'msg'=>JZLANG('发布奖励')]);\n\t\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"发布奖励\").\"' \";\n\t\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\t\tforeach($all as $vv){\n\t\t\t\t\t\t\t\t\t\t\t$all_jifen+=$vv['amount'];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t\t                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t\t   \t  \t\t$w['molds'] = $molds;\n\t\t\t\t\t\t\t   \t  \t\t$w['aid'] = $v['id'];\n\t\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('发布奖励');\n\t\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//end\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tM($molds)->update('id in('.$data.')',['isshow'=>$isshow]);\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量审核成功！')));\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量审核失败！')));\n\t\t}\n\t}\n}"
  },
  {
    "path": "app/admin/c/FieldsController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }\r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2019/01-2019/10\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace app\\admin\\c;\r\n\r\n\r\nuse frphp\\extend\\Page;\r\n\r\nclass FieldsController extends CommonController\r\n{\r\n\t\r\n\tfunction index(){\r\n\t\tif($this->frparam('molds',1)==''){\r\n\t\t\tError(JZLANG('请选择模块！'));\r\n\t\t}\r\n\t\tif($this->frparam('ajax')){\r\n\r\n\t\t\t$data = M('fields')->findAll(array('molds'=>$this->frparam('molds',1)),'orders desc');\r\n\t\t\tforeach($data as &$v){\r\n\t\t\t\t$v['isadmin'] = $v['isadmin']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['isshow'] = $v['isshow']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['ishome'] = $v['ishome']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['islist'] = $v['islist']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['issearch'] = $v['issearch']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['ismust'] = $v['ismust']==1 ? JZLANG('是') : JZLANG('否');\r\n\t\t\t\t$v['isext'] = $v['isext']==1 ? JZLANG('是') : JZLANG('否');\r\n\r\n\t\t\t\tswitch($v['fieldtype']){\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单行文本');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多行文本');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('文本编辑器');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('数字');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 5:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单图片');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 6:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多图片');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 7:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单选下拉');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 8:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多选');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 9:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单附件');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 10:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多附件');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 11:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('时间戳');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 12:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单选按钮');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 13:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单选关联');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 14:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('小数');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 15:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多行录入');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 16:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多选关联');\r\n\t\t\t\t\tbreak;\r\n                    case 17:\r\n                    $v['fieldtypename'] = JZLANG('栏目');\r\n                    break;\r\n                    case 18:\r\n                    $v['fieldtypename'] = JZLANG('副栏目');\r\n                    break;\r\n\t\t\t\t\tcase 19:\r\n                    $v['fieldtypename'] = JZLANG('系统TAG');\r\n                    break;\r\n                    case 20:\r\n                        $v['fieldtypename'] = JZLANG('绑定栏目单选');\r\n                        break;\r\n                    case 21:\r\n                        $v['fieldtypename'] = JZLANG('绑定栏目多选');\r\n                        break;\r\n\t\t\t\t}\r\n\t\t\t\t$v['edit_url'] = U('editFields',['id'=>$v['id']]);\r\n\r\n\t\t\t}\r\n\t\t\tJsonReturn(['code'=>0,'data'=>$data,'count'=>count($data)]);\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$this->frparam('molds',1)));\r\n\t\t\r\n\t\t$this->display('fields-list');\r\n\t\t\r\n\t\t\r\n\t}\r\n\r\n\tfunction addFields(){\r\n\t\t\r\n\t\tif($this->frparam('go',1)==1){\r\n\t\t\t\r\n\t\t\t$data['field'] = strtolower($this->frparam('field',1));\r\n\t\t\t$data['molds'] = strtolower($this->frparam('molds',1));\r\n\t\t\t$data['fieldname'] = $this->frparam('fieldname',1);\r\n\t\t\t$data['tips'] = $this->frparam('tips',1);\r\n\t\t\t$data['fieldtype'] = $this->frparam('fieldtype');\r\n\t\t\t$data['tids'] = $this->frparam('tids',1);\r\n\t\t\t$data['body'] = $this->frparam('body',1);\r\n\t\t\t$data['orders'] = $this->frparam('orders');\r\n\t\t\t$data['ismust'] = $this->frparam('ismust');\r\n\t\t\t$data['isshow'] = $this->frparam('isshow');\r\n\t\t\t$data['ishome'] = $this->frparam('ishome');\r\n\t\t\t$data['isadmin'] = $this->frparam('isadmin');\r\n\t\t\t$data['issearch'] = $this->frparam('issearch');\r\n\t\t\t$data['islist'] = $this->frparam('islist');\r\n\t\t\t$data['format'] = $this->frparam('format',1);\r\n\t\t\t$data['vdata'] = $this->frparam('vdata',1);\r\n\t\t\t$data['isajax'] = $this->frparam('isajax');\r\n\t\t\t$data['listorders'] = $this->frparam('listorders');\r\n\t\t\t$data['isext'] = $this->frparam('isext');\r\n            $data['ldfield'] = $this->frparam('ldfield',1);\r\n            $data['linkfield'] = $this->frparam('linkfield',1);\r\n\t\t\tif($data['fieldname']=='' || $data['field']==''){\r\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段名和字段标识不能为空！')));\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t//检测是否存在该模块\r\n\t\t\tif(M('Fields')->find(array('field'=>$data['field'],'molds'=>$data['molds']))){\r\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段标识已存在！')));\r\n\t\t\t}\r\n\t\t\t//取消保护字段，可以继续创建\r\n\t\t\tif(in_array($data['field'],['sql','jzcache','jzcachetime','table','orderby','limit','ispage','notin','in','empty','notempty','fields','like','day','as','file'])){\r\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('系统保护字段，不允许创建！')));\r\n\t\t\t}\r\n\t\t\t// $sql = \"select count(*) as n from information_schema.columns where table_name = '\".DB_PREFIX.$data['molds'].\"' and TABLE_SCHEMA='\".DB_PREFIX.$data['molds'].\"' and column_name = '\".$data['field'].\"'\";\r\n\t\t\t// $check = M()->findSql($sql);\r\n\t\t\t// if($check[0]['n']){\r\n\t\t\t\t// JsonReturn(array('code'=>1,'msg'=>'字段标识已存在！'));\r\n\t\t\t// }\r\n\t\t\t\r\n\t\t\t$sql = 'SHOW COLUMNS FROM '.DB_PREFIX.$data['molds'];\r\n\t\t\t$list = M()->findSql($sql);\r\n\t\t\t$isgo = true;\r\n\t\t\t//不管存不存在，都可以创建\r\n\t\t\tforeach($list as $v){\r\n\t\t\t\tif($v['Field']==$data['field']){\r\n\t\t\t\t\t$isgo = false;\r\n\t\t\t\t\t//JsonReturn(array('code'=>1,'msg'=>'字段标识已存在！'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t$data['tids'] = ($data['tids']!='')?(','.$data['tids'].','):$data['tids'];\r\n\t\t\t$sql = \"ALTER TABLE \".DB_PREFIX.$data['molds'].\" ADD \".$data['field'].\" \";\r\n\t\t\t$data['fieldlong'] = $this->frparam('fieldlong_'.$data['fieldtype'],1);\r\n            $data['remote'] = $this->frparam('field_remote_'.$data['fieldtype']);\r\n\t\t\tswitch($data['fieldtype']){\r\n\t\t\t\tcase 1:\r\n\t\t\t\tcase 2:\r\n\t\t\t\tcase 18:\r\n\t\t\t\tcase 19:\r\n\t\t\t\t$sql .= \"VARCHAR(\".$data['fieldlong'].\") default \";\r\n\t\t\t\tif($data['vdata'] || $data['vdata']==0){\r\n\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql .= ' NULL ';\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\tcase 15:\r\n\t\t\t\tcase 6:\r\n\t\t\t\tcase 10:\r\n\t\t\t\t$sql .= \"TEXT  default \";\r\n\t\t\t\t$sql .= ' NULL ';\r\n\t\t\t\t\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 4:\r\n\t\t\t\tcase 17:\r\n\t\t\t\tif($data['fieldlong']>11 || $data['fieldlong']<=0){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对！')));\r\n\t\t\t\t}\r\n\t\t\t\t$sql .= \"INT(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql .= \" '0' NOT NULL \";\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 11:\r\n\t\t\t\tif($data['fieldlong']!=11){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对,时间属性必须长度为11')));\r\n\t\t\t\t}\r\n\t\t\t\t$sql .= \"INT(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql .= \" '0' NOT NULL \";\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 5:\r\n\t\t\t\tcase 9:\r\n\t\t\t\t$sql .= \"VARCHAR(\".$data['fieldlong'].\")  default \";\r\n\t\t\t\tif($data['vdata'] || $data['vdata']==0){\r\n\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql .= \" NULL \";\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t\r\n\t\t\t\tcase 7:\r\n\t\t\t\tcase 8:\r\n\t\t\t\tcase 12:\r\n\t\t\t\t$data['body'] = $this->frparam('body_'.$data['fieldtype'],1);\r\n\t\t\t\t$sql .= \"VARCHAR(\".$data['fieldlong'].\")  default \";\r\n\t\t\t\tif($data['vdata'] || $data['vdata']==0){\r\n\t\t\t\t\t$sql .= \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql .= \" NULL \";\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 13:\r\n\t\t\t\tif($data['fieldlong']>11 || $data['fieldlong']<=0){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对！')));\r\n\t\t\t\t}\r\n\t\t\t\t$sql .= \"INT(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql .= \" '0' NOT NULL \";\r\n\t\t\t\t}\r\n\t\t\t\t$data['body'] = $this->frparam('molds_select',1).','.$this->frparam('molds_list_field',1);\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 14:\r\n\t\t\t\tif(strpos($data['fieldlong'],',')===false){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对,decimal字段长度格式[整数位数,小数位数]')));\r\n\t\t\t\t}\r\n\t\t\t\t$sql .= \"DECIMAL(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql .= \" '\".$this->frparam('body_14',1).\"' NOT NULL \";\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 16:\r\n\t\t\t\t$sql .= \"VARCHAR(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\tif($data['vdata'] || $data['vdata']==0){\r\n\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql .= \" NULL \";\r\n\t\t\t\t}\r\n\t\t\t\t$data['body'] = $this->frparam('molds_select_muti',1).','.$this->frparam('molds_list_field_muti',1);\r\n\t\t\t\tbreak;\r\n                case 20:\r\n                    $sql .= \"VARCHAR(\".$data['fieldlong'].\") DEFAULT \";\r\n                    if($data['vdata'] || $data['vdata']==0){\r\n                        $sql .=  \"'\".$data['vdata'].\"'\";\r\n                    }else{\r\n                        $sql .= \" NULL \";\r\n                    }\r\n                    $data['body'] = $this->frparam('molds_select_tid_muti',1).','.$this->frparam('molds_list_field_tid_muti',1);\r\n                    break;\r\n                case 21:\r\n                    if($data['fieldlong']>11 || $data['fieldlong']<=0){\r\n                        JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对！')));\r\n                    }\r\n                    $sql .= \"INT(\".$data['fieldlong'].\") DEFAULT \";\r\n                    if($data['vdata']){\r\n                        $sql .=  \"'\".$data['vdata'].\"'\";\r\n                    }else{\r\n                        $sql .= \" '0' NOT NULL \";\r\n                    }\r\n                    $data['body'] = $this->frparam('molds_select_tid',1).','.$this->frparam('molds_list_field_tid',1);\r\n                    break;\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t//由于已经存在，所以不需要再执行一遍SQL\r\n\t\t\tif($isgo){\r\n\t\t\t\t$x = M()->runSql($sql);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t$n = M('Fields')->add($data);\r\n\t\t\tif(!$n){\r\n\t\t\t\t//新增字段记录失败，删除新增字段--不需要删除\r\n\t\t\t\t//$delsql = \"ALTER TABLE \".DB_PREFIX.$data['molds'].\" DROP COLUMN \".$data['field'];\r\n\t\t\t\t//M()->runSql($delsql);\r\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段创建成功，但是字段表记录失败，请反馈官方解决！')));\r\n\t\t\t}\r\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('字段创建成功！')));\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t$this->classtypes = $this->classtypetree;\r\n\t\t$this->molds = $this->frparam('molds',1);\r\n\t\t$this->display('fields-add');\r\n\t}\r\n\t\r\n\tfunction editFields(){\r\n\t\t\r\n\t\tif($this->frparam('go',1)==1){\r\n\r\n\t\t\tif($this->frparam('id')){\r\n\t\t\t\t$data['field'] = strtolower($this->frparam('field',1));\r\n\t\t\t\t$data['molds'] = strtolower($this->frparam('molds',1));\r\n\t\t\t\t$data['fieldname'] = $this->frparam('fieldname',1);\r\n\t\t\t\t$data['tips'] = $this->frparam('tips',1);\r\n\t\t\t\t$data['fieldtype'] = $this->frparam('fieldtype');\r\n\t\t\t\t$data['tids'] = $this->frparam('tids',1);\r\n\t\t\t\t$data['body'] = $this->frparam('body',1);\r\n\t\t\t\t$data['orders'] = $this->frparam('orders');\r\n\t\t\t\t$data['ismust'] = $this->frparam('ismust');\r\n\t\t\t\t$data['isshow'] = $this->frparam('isshow');\r\n\t\t\t\t$data['ishome'] = $this->frparam('ishome');\r\n\t\t\t\t$data['isadmin'] = $this->frparam('isadmin');\r\n\t\t\t\t$data['issearch'] = $this->frparam('issearch');\r\n\t\t\t\t$data['islist'] = $this->frparam('islist');\r\n\t\t\t\t$data['format'] = $this->frparam('format',1);\r\n\t\t\t\t$data['vdata'] = $this->frparam('vdata',1);\r\n\t\t\t\t$data['isajax'] = $this->frparam('isajax');\r\n\t\t\t\t$data['listorders'] = $this->frparam('listorders');\r\n\t\t\t\t$data['isext'] = $this->frparam('isext');\r\n                $data['ldfield'] = $this->frparam('ldfield',1);\r\n                $data['linkfield'] = $this->frparam('linkfield',1);\r\n\t\t\t\tif($data['fieldname']=='' || $data['field']==''){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段名和字段标识不能为空！')));\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$data['tids'] = ($data['tids']!='')?(','.$data['tids'].','):$data['tids'];\r\n\t\t\t\t$old = M('Fields')->find(array('id'=>$this->frparam('id')));\r\n\t\t\t\t$data['fieldlong'] = $this->frparam('fieldlong_'.$data['fieldtype'],1);\r\n                $data['remote'] = $this->frparam('field_remote_'.$data['fieldtype']);\r\n\t\t\t\t//只是更改样式，不更改字段属性\r\n\t\t\t\tif($old['field']==$data['field']){\r\n\t\t\t\t\t\r\n\t\t\t\t\t//判断长度是否不同\r\n\t\t\t\t\tif($data['fieldlong']!=$old['fieldlong'] || $data['vdata']!=$old['vdata']){\r\n\t\t\t\t\t\t$sql =  \"ALTER TABLE \".DB_PREFIX.$old['molds'].\" modify column \".$old['field'].\"  \";\r\n\t\t\t\t\t\tswitch($data['fieldtype']){\r\n\t\t\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\t\tcase 2:\r\n\t\t\t\t\t\t\tcase 5:\r\n\t\t\t\t\t\t\tcase 7:\r\n\t\t\t\t\t\t\tcase 8:\r\n\t\t\t\t\t\t\tcase 9:\r\n\t\t\t\t\t\t\tcase 12:\r\n\t\t\t\t\t\t\tcase 16:\r\n\t\t\t\t\t\t\tcase 18:\r\n\t\t\t\t\t\t\tcase 19:\r\n\t\t\t\t\t\t\tcase 20:\r\n\t\t\t\t\t\t\t$sql.=\" varchar(\".$data['fieldlong'].\") default\";\r\n\t\t\t\t\t\t\tif($data['vdata'] || $data['vdata']==0){\r\n\t\t\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t$sql .= ' NULL ';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 3:\r\n\t\t\t\t\t\t\tcase 15:\r\n\t\t\t\t\t\t\tcase 6:\r\n\t\t\t\t\t\t\tcase 10:\r\n\t\t\t\t\t\t\t$sql .= \"TEXT  default \";\r\n\t\t\t\t\t\t\t$sql .= ' NULL ';\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 4:\r\n\t\t\t\t\t\t\tcase 11:\r\n\t\t\t\t\t\t\tcase 13:\r\n\t\t\t\t\t\t\tcase 17:\r\n\t\t\t\t\t\t\tcase 21:\r\n\t\t\t\t\t\t\t$sql.=\" int(\".$data['fieldlong'].\") default \";\r\n\t\t\t\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t$sql .= ' 0 ';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 14:\r\n\t\t\t\t\t\t\t$sql.=\" decimal(\".$data['fieldlong'].\") default \";\r\n\t\t\t\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t$sql .= \" '\".$this->frparam('body_14',1).\"' NOT NULL \";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$x = M()->runSql($sql);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif($data['fieldtype']==7 || $data['fieldtype']==8 || $data['fieldtype']==12 || $data['fieldtype']==14){\r\n                    \t$data['body'] = $this->frparam('body_'.$data['fieldtype'],1);\r\n                    }\r\n\t\t\t\t\tif($data['fieldtype']==13){\r\n\t\t\t\t\t\t$data['body'] = $this->frparam('molds_select',1).','.$this->frparam('molds_list_field',1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif($data['fieldtype']==16){\r\n\t\t\t\t\t\t$data['body'] = $this->frparam('molds_select_muti',1).','.$this->frparam('molds_list_field_muti',1);\r\n\t\t\t\t\t}\r\n                    if($data['fieldtype']==20){\r\n                        $data['body'] = $this->frparam('molds_select_tid_muti',1).','.$this->frparam('molds_list_field_tid_muti',1);\r\n                    }\r\n                    if($data['fieldtype']==21){\r\n                        $data['body'] = $this->frparam('molds_select_tid',1).','.$this->frparam('molds_list_field_tid',1);\r\n                    }\r\n\t\t\t\t\tif(M('Fields')->update(array('id'=>$this->frparam('id')),$data)){\r\n\t\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('字段修改成功！')));\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段修改失败！')));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(in_array($data['field'],['id','sql','jzcache','jzcachetime','table','orderby','limit','ispage','notin','in','empty','notempty','fields','like','tids','day','as','istop','istuijian','ishot','isall','file'])){\r\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('系统保护字段，不允许创建！')));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$sql = \"ALTER TABLE \".DB_PREFIX.$old['molds'].\" change \".$old['field'].\" \".$data['field'].\" \";\r\n\t\t\t\t\r\n\t\t\t\tswitch($data['fieldtype']){\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\tcase 2:\r\n                    case 5:\r\n                    case 9:\r\n                    case 18:\r\n                    case 19:\r\n\r\n\t\t\t\t\t$sql .= \"VARCHAR(\".$data['fieldlong'].\") default \";\r\n\t\t\t\t\tif($data['vdata'] || $data['vdata']==0){\r\n\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$sql .= ' NULL ';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\tcase 15:\r\n\t\t\t\t\tcase 6:\r\n\t\t\t\t\tcase 10:\r\n\t\t\t\t\t$sql .= \"TEXT  default \";\r\n\t\t\t\t\t$sql .= ' NULL ';\r\n\t\t\t\t\t\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\tcase 17:\r\n\t\t\t\t\tif($data['fieldlong']>11 || $data['fieldlong']<=0){\r\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对！')));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$sql .= \"INT(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$sql .= \" '0' NOT NULL \";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 11:\r\n\t\t\t\t\tif($data['fieldlong']!=11){\r\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对,时间属性必须长度为11')));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$sql .= \"INT(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$sql .= \" '0' NOT NULL \";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 14:\r\n\t\t\t\t\tif(strpos($data['fieldlong'],',')===false){\r\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对,decimal字段长度格式[整数位数,小数位数]')));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$sql .= \"DECIMAL(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$sql .= \" '\".$this->frparam('body_14',1).\"' NOT NULL \";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\tcase 7:\r\n\t\t\t\t\tcase 8:\r\n\t\t\t\t\tcase 12:\r\n\t\t\t\t\t$sql .= \"VARCHAR(\".$data['fieldlong'].\")  default \";\r\n\t\t\t\t\tif($data['vdata'] || $data['vdata']==0){\r\n\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$sql .= ' NULL ';\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$data['body'] = $this->frparam('body_'.$data['fieldtype'],1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 13:\r\n\t\t\t\t\tif($data['fieldlong']>11 || $data['fieldlong']<=0){\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对！')));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$sql .= \"INT(\".$data['fieldlong'].\") DEFAULT \";\r\n\t\t\t\t\tif($data['vdata']){\r\n\t\t\t\t\t\t$sql .=  \"'\".$data['vdata'].\"'\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$sql .= \" '0' NOT NULL \";\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$data['body'] = $this->frparam('molds_select',1).','.$this->frparam('molds_list_field',1);\r\n\t\t\t\t\tbreak;\r\n                    case 16:\r\n                        if($data['fieldlong']>11 || $data['fieldlong']<=0){\r\n\r\n                            JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对！')));\r\n                        }\r\n                        $sql .= \"VARCHAR(\".$data['fieldlong'].\")  default \";\r\n                        if($data['vdata'] || $data['vdata']==0){\r\n                            $sql .=  \"'\".$data['vdata'].\"'\";\r\n                        }else{\r\n                            $sql .= ' NULL ';\r\n                        }\r\n                        $data['body'] = $this->frparam('molds_select_muti',1).','.$this->frparam('molds_list_field_muti',1);\r\n                        break;\r\n                    case 21:\r\n                        if($data['fieldlong']>11 || $data['fieldlong']<=0){\r\n\r\n                            JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对！')));\r\n                        }\r\n                        $sql .= \"INT(\".$data['fieldlong'].\") DEFAULT \";\r\n                        if($data['vdata']){\r\n                            $sql .=  \"'\".$data['vdata'].\"'\";\r\n                        }else{\r\n                            $sql .= \" '0' NOT NULL \";\r\n                        }\r\n                        $data['body'] = $this->frparam('molds_select_tid',1).','.$this->frparam('molds_list_field_tid',1);\r\n                        break;\r\n                    case 20:\r\n                        if($data['fieldlong']>11 || $data['fieldlong']<=0){\r\n\r\n                            JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对！')));\r\n                        }\r\n                        $sql .= \"VARCHAR(\".$data['fieldlong'].\")  default \";\r\n                        if($data['vdata'] || $data['vdata']==0){\r\n                            $sql .=  \"'\".$data['vdata'].\"'\";\r\n                        }else{\r\n                            $sql .= ' NULL ';\r\n                        }\r\n                        $data['body'] = $this->frparam('molds_select_tid_muti',1).','.$this->frparam('molds_list_field_tid_muti',1);\r\n                        break;\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t$x = M()->runSql($sql);\r\n\t\t\t\t\r\n\t\t\t\tif(M('Fields')->update(array('id'=>$this->frparam('id')),$data)){\r\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('字段修改成功！')));\r\n\t\t\t\t\texit;\r\n\t\t\t\t}else{\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段修改失败！')));\r\n\t\t\t\t\texit;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\tif($this->frparam('id')){\r\n\t\t\t$this->data = M('Fields')->find(array('id'=>$this->frparam('id')));\r\n\t\t}\r\n\t\t\r\n\t\t$this->classtypes = $this->classtypetree;\r\n\t\t$this->display('fields-edit');\r\n\t\t\r\n\t}\r\n    \r\n    function get_fields(){\r\n        $tid = $this->frparam('tid',0,0);\r\n        $isext = $this->frparam('isext',0,0);\r\n        $sql = array();\r\n        $molds = strtolower($this->frparam('molds',5));\r\n        $moldsdata = M('molds')->find(['biaoshi'=>$molds]);\r\n        if($tid  && !in_array($molds,['orders','level','level_group','tags','attr','chain','collect','collect_type','links','link_type','pictures','comment'])){\r\n            $sql[] = \" (tids like '%,\".$tid.\",%' or tids is null) \";\r\n        }\r\n        $id = $this->frparam('id');\r\n        if($id){\r\n            $data = M($molds)->find(array('id'=>$id));\r\n        }else{\r\n            $data = array();\r\n        }\r\n        $sql[] = \" isext=\".$isext;\r\n        $sql[] = \" molds = '\".$molds.\"' and isadmin=1 \";\r\n        $sql = implode(' and ',$sql);\r\n        $fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\r\n        $l = '';\r\n        $isagree = 0;\r\n        if($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){\r\n            $isagree = 1;\r\n        }\r\n        foreach($fields_list as $k=>$v){\r\n            if(($v['field']=='isshow' && $isagree==0) || $v['field']=='tid' || $v['field']=='id'){\r\n                continue;\r\n            }\r\n            if(!array_key_exists($v['field'],$data)){\r\n                //使用默认值\r\n                $data[$v['field']] = $v['vdata'];\r\n            }\r\n            switch($v['fieldtype']){\r\n                case 1:\r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"text\" id=\"'.$v['field'].'\" value=\"'.$data[$v['field']].'\" name=\"'.$v['field'].'\" ';\r\n                    if($v['ismust']==1){\r\n                        $l.=' required=\"\" lay-verify=\"required\" ';\r\n                    }\r\n                    $l .=  'autocomplete=\"off\" class=\"layui-input\">\r\n                    </div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>';\r\n                    break;\r\n                case 2:\r\n                    $l .= '<div class=\"layui-form-item  layui-form-text\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n                    <div class=\"layui-input-block\">\r\n                        <textarea  class=\"layui-textarea\" id=\"'.$v['field'].'\"  name=\"'.$v['field'].'\" ';\r\n                    if($v['ismust']==1){\r\n                        $l.=' required=\"\" lay-verify=\"required\" ';\r\n                    }\r\n                    $l .=  '>'.$data[$v['field']].'</textarea>\r\n                    </div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>';\r\n                    break;\r\n                case 3:\r\n                    $l .= include(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/common/uediter.php');\r\n                    break;\r\n                case 4:\r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"number\" id=\"'.$v['field'].'\" value=\"'.$data[$v['field']].'\" name=\"'.$v['field'].'\" ';\r\n                    if($v['ismust']==1){\r\n                        $l.=' required=\"\" lay-verify=\"required\" ';\r\n                    }\r\n                    $l .=  'autocomplete=\"off\" class=\"layui-input\">\r\n                    </div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>';\r\n                    break;\r\n                \r\n                \r\n                case 5:\r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t<input name=\"'.$v['field'].'\" placeholder=\"'.JZLANG('上传图片').'\" type=\"text\" class=\"layui-input\" id=\"'.$v['field'].'\" ';\r\n                    if($v['ismust']==1){\r\n                        $l.=' required=\"\" lay-verify=\"required\" ';\r\n                    }\r\n                    $l.=' value=\"'.$data[$v['field']].'\" />\r\n                            <div class=\"layui-progress\" id=\"'.$v['field'].'_propress\" style=\"display:none;\" lay-filter=\"'.$v['field'].'_propress\" lay-showPercent=\"yes\">\r\n                          <div class=\"layui-progress-bar layui-bg-green\" lay-percent=\"0%\"></div>\r\n                        </div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t<button class=\"layui-btn layui-btn-primary\" id=\"LAY_'.$v['field'].'_upload\" type=\"button\" >'.JZLANG('选择图片').'</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t<button class=\"layui-btn layui-btn-warm\" id=\"LAY_'.$v['field'].'_gallery\" type=\"button\" >'.JZLANG('图库').'</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t<img id=\"'.$v['field'].'_img\" class=\"img-responsive img-thumbnail\" style=\"max-width: 200px;\" src=\"'.$data[$v['field']].'\" onerror=\"javascipt:this.src=\\''.Tpl_style.'/style/images/nopic.jpg\\'; this.title=\\''.JZLANG('图片未找到').'\\';this.onerror=\\'\\'\">\r\n\t\t\t\t\t\t<button type=\"button\" onclick=\"deleteImage_auto(this,\\''.$v['field'].'\\')\" class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger \" title=\"'.JZLANG('删除这张图片').'\" >'.JZLANG('删除').'</button>\r\n\t\t\t\t\t</div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>\r\n\t\t\t\t<script>\r\n\t\t\t\t\r\n\t\t\t\tlayui.use([\"upload\",\"layer\",\"element\"], function(){\r\n\t\t\t\t\t  var upload_'.$v['field'].' = layui.upload;\r\n\t\t\t\t\t  var layer = layui.layer;\r\n\t\t\t\t\t  var element = layui.element;\r\n\t\t\t\t\t  \r\n\t\t\t\t\t  //执行实例\r\n\t\t\t\t\t  var uploadInst = upload_'.$v['field'].'.render({\r\n\t\t\t\t\t\telem: \"#LAY_'.$v['field'].'_upload\" //绑定元素\r\n\t\t\t\t\t\t,url: \"'.U('Common/uploads').'\" //上传接口\r\n\t\t\t\t\t\t,data:{tid:function(){ return $(\"#tid\").val();},molds:\"'.$molds.'\"}\r\n\t\t\t\t\t\t,accept:\"images\"\r\n\t\t\t\t\t\t,acceptMime:\"image/*\"\r\n\t\t\t\t\t\t,before:function(){\r\n\t\t\t\t\t\t    $(\"#'.$v['field'].'_propress\").show();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t,done: function(res){\r\n\t\t\t\t\t\t \r\n\t\t\t\t\t\t\tif(res.code==0){\r\n\t\t\t\t\t\t\t\t $(\"#'.$v['field'].'_img\").attr(\"src\",res.url);\r\n\t\t\t\t\t\t\t\t $(\"#'.$v['field'].'\").val(res.url);\r\n\t\t\t\t\t\t\t\t setTimeout(function() {\r\n\t\t\t\t\t\t\t\t $(\"#'.$v['field'].'_propress\").hide();\r\n\t\t\t\t\t\t\t\t },2000)\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t,progress: function(n, elem, res, index){\r\n                            var percent = n + \"%\" //获取进度百分比\r\n                            element.progress(\"'.$v['field'].'_propress\", percent);\r\n                          }\r\n\t\t\t\t\t\t,error: function(){\r\n\t\t\t\t\t\t  //请求异常回调\r\n\t\t\t\t\t\t  layer.alert(\"'.JZLANG('上传异常！').'\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t  });\r\n\t\t\t\t\t  \r\n\t\t\t\t\t  //图库按钮点击事件\r\n\t\t\t\t\t  $(\"#LAY_'.$v['field'].'_gallery\").on(\"click\", function(){\r\n\t\t\t\t\t\t  var galleryLayer = layer.open({\r\n\t\t\t\t\t\t\t  type: 1,\r\n\t\t\t\t\t\t\t  title: \"'.JZLANG('选择图片').'\",\r\n\t\t\t\t\t\t\t  area: [\"80%\", \"80%\"],\r\n\t\t\t\t\t\t\t  content: `<div class=\"gallery-container\" style=\"padding: 15px;\">\r\n\t\t\t\t\t\t\t\t  <div class=\"gallery-header\" style=\"margin-bottom: 15px;\">\r\n\t\t\t\t\t\t\t\t\t  <div class=\"layui-btn-group\">\r\n\t\t\t\t\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_prev_'.$v['field'].'\">'.JZLANG('上一页').'</button>\r\n\t\t\t\t\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_next_'.$v['field'].'\">'.JZLANG('下一页').'</button>\r\n\t\t\t\t\t\t\t\t\t  </div>\r\n\t\t\t\t\t\t\t\t\t  <span id=\"gallery_page_info_'.$v['field'].'\" style=\"margin-left: 15px;\"></span>\r\n\t\t\t\t\t\t\t\t  </div>\r\n\t\t\t\t\t\t\t\t  <div id=\"gallery_list_'.$v['field'].'\" class=\"gallery-list\" style=\"min-height: 400px; display: flex; flex-wrap: wrap; gap: 10px;\"></div>\r\n\t\t\t\t\t\t\t\t  <div class=\"gallery-footer\" style=\"margin-top: 15px; text-align: center;\">\r\n\t\t\t\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn\" id=\"gallery_confirm_'.$v['field'].'\">'.JZLANG('确定').'</button>\r\n\t\t\t\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-primary\" onclick=\"layer.closeAll();\">'.JZLANG('取消').'</button>\r\n\t\t\t\t\t\t\t\t  </div>\r\n\t\t\t\t\t\t\t  </div>`,\r\n\t\t\t\t\t\t\t  success: function(layero, index){\r\n\t\t\t\t\t\t\t\t  var currentPage = 1;\r\n\t\t\t\t\t\t\t\t  var pageSize = 12;\r\n\t\t\t\t\t\t\t\t  var selectedImages = [];\r\n\t\t\t\t\t\t\t\t  var totalCount = 0;\r\n\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t  //加载图片列表\r\n\t\t\t\t\t\t\t\t  function loadGallery(page){\r\n\t\t\t\t\t\t\t\t\t  $.ajax({\r\n\t\t\t\t\t\t\t\t\t\t  url: \"'.U('Sys/pictures').'\",\r\n\t\t\t\t\t\t\t\t\t\t  type: \"GET\",\r\n\t\t\t\t\t\t\t\t\t\t  data: {ajax:1, page: page, pageSize: pageSize},\r\n\t\t\t\t\t\t\t\t\t\t  dataType: \"json\",\r\n\t\t\t\t\t\t\t\t\t\t  success: function(res){\r\n\t\t\t\t\t\t\t\t\t\t\t  if(res.code == 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t  var html = \"\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t  if(res.data.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  $.each(res.data, function(i, item){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  var ext = item.filetype.split('.').pop().toLowerCase();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  var imageExts = [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\", \"svg\"];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  var isImage = imageExts.includes(ext);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  var contentHtml = \"\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  if(isImage){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  contentHtml = `<img src=\"${item.litpic}\" style=\"width: 100%; height: 100%; object-fit: cover;\">`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  }else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  contentHtml = `<div style=\"width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; background: #f5f5f5; padding: 10px;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  <i class=\"layui-icon\" style=\"font-size: 40px; color: #999;\">&#xe61e;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  <span style=\"font-size: 12px; color: #666; margin-top: 8px; word-break: break-all; text-align: center;\">${item.fileName}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  </div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  html += `<div class=\"gallery-item\" data-id=\"`+item.id+`\" data-url=\"`+item.litpic+`\" style=\"width: 140px; height: 140px; border: 2px solid #e6e6e6; border-radius: 4px; cursor: pointer; position: relative; overflow: hidden;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  `+contentHtml+`\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  <div class=\"gallery-item-info\" style=\"position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.6); color: #fff; padding: 5px; font-size: 12px; display: none;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  ${item.fileName}<br>${item.size}kb\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  </div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  <div class=\"gallery-item-check\" style=\"position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; border-radius: 50%; border: 2px solid #fff; background: rgba(0,0,0,0.5); display: none;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  <i class=\"layui-icon\" style=\"color: #fff; font-size: 14px; line-height: 16px;\">&#xe605;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  </div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  </div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  });\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_'.$v['field'].'\").html(html);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  totalCount = res.count;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  var totalPages = Math.ceil(totalCount / pageSize);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  $(\"#gallery_page_info_'.$v['field'].'\").text(\"第\"+page+\"页 / 共\"+totalPages+\"页\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  //图片悬停事件\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  $(\".gallery-item\").hover(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-info\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-info\").hide();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  );\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  //图片点击事件\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  $(\".gallery-item\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  var url = $(this).data(\"url\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  var id = $(this).data(\"id\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  var index = selectedImages.indexOf(url);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  if(index > -1){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  selectedImages.splice(index, 1);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#e6e6e6\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").hide();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  }else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  selectedImages.push(url);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#1E9FFF\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  });\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  //恢复已选中的图片\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  $(\".gallery-item\").each(function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  var url = $(this).data(\"url\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  if(selectedImages.indexOf(url) > -1){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#1E9FFF\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  });\r\n\t\t\t\t\t\t\t\t\t\t\t\t  }else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_'.$v['field'].'\").html(\\'<div style=\"width: 100%; text-align: center; padding: 50px; color: #999;\">'.JZLANG('暂无图片').'</div>\\');\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t\t\t\t  }else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t  layer.alert(res.msg || \"'.JZLANG('加载失败').'\", {icon: 5});\r\n\t\t\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t\t\t  },\r\n\t\t\t\t\t\t\t\t\t\t  error: function(){\r\n\t\t\t\t\t\t\t\t\t\t\t  layer.alert(\"'.JZLANG('请求失败').'\", {icon: 5});\r\n\t\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t\t  });\r\n\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t  //上一页\r\n\t\t\t\t\t\t\t\t  $(\"#gallery_prev_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t  if(currentPage > 1){\r\n\t\t\t\t\t\t\t\t\t\t  currentPage--;\r\n\t\t\t\t\t\t\t\t\t\t  loadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t  });\r\n\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t  //下一页\r\n\t\t\t\t\t\t\t\t  $(\"#gallery_next_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t  var totalPages = Math.ceil(totalCount / pageSize);\r\n\t\t\t\t\t\t\t\t\t  if(currentPage < totalPages){\r\n\t\t\t\t\t\t\t\t\t\t  currentPage++;\r\n\t\t\t\t\t\t\t\t\t\t  loadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t  });\r\n\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t  //确定按钮\r\n\t\t\t\t\t\t\t\t  $(\"#gallery_confirm_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t  if(selectedImages.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t  $(\"#'.$v['field'].'\").val(selectedImages.join(\",\"));\r\n\t\t\t\t\t\t\t\t\t\t  $(\"#'.$v['field'].'_img\").attr(\"src\", selectedImages[0]);\r\n\t\t\t\t\t\t\t\t\t\t  layer.close(index);\r\n\t\t\t\t\t\t\t\t\t  }else{\r\n\t\t\t\t\t\t\t\t\t\t  layer.msg(\"'.JZLANG('请至少选择一张图片').'\", {icon: 0});\r\n\t\t\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t\t\t  });\r\n\t\t\t\t\t\t\t\t  \r\n\t\t\t\t\t\t\t\t  //初始加载\r\n\t\t\t\t\t\t\t\t  loadGallery(currentPage);\r\n\t\t\t\t\t\t\t  }\r\n\t\t\t\t\t\t  });\r\n\t\t\t\t\t  });\r\n\t\t\t\t\t});\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t</script>';\r\n                    break;\r\n                case 6:\r\n                    //------\r\n                    $l .= '<fieldset class=\"layui-elem-field\">\r\n\t\t\t\t  <legend>'.$v['fieldname'].'</legend>\r\n\t\t\t\t  <div class=\"layui-field-box\">\r\n\t\t\t\t\t  <div class=\"layui-input-block\">\r\n\t\t\t\t\t\t  <div class=\"site-demo-upbar\">\r\n\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"LAY_'.$v['field'].'_upload\">\r\n\t\t\t\t\t\t  <i class=\"layui-icon\">&#xe67c;</i>'.JZLANG('上传图片').'\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t<button class=\"layui-btn layui-btn-warm\" id=\"LAY_'.$v['field'].'_gallery\" type=\"button\" >'.JZLANG('图库').'</button>\r\n\t\t\t\t\t\t '.$v['tips'].'\r\n\t\t\t\t\t  </div>\r\n\t\t\t\t\t\t \r\n\t\t\t\t\t  </div>\r\n\t\t\t\t\t \r\n\t\t\t\t\t  <div class=\"layui-input-block\">\r\n\t\t\t\t\t  <span class=\"preview_'.$v['field'].'\" >';\r\n                    if($data[$v['field']]!=''){\r\n                        foreach(explode('||',$data[$v['field']]) as $vv){\r\n                            $pic = explode('|',$vv);\r\n                            $l.='<div class=\"upload-icon-img layui-input-inline\" ><div class=\"upload-pre-item\"><img src=\"'.$pic[0].'\" class=\"img\" width=\"200px\" height=\"200px\" ><input name=\"'.$v['field'].'_urls[]\" type=\"text\" class=\"layui-input\"  value=\"'.$pic[0].'\" /><input name=\"'.$v['field'].'_des[]\" type=\"text\" class=\"layui-input\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"'.$pic[1].'\" /><a class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger delete_file\">'.JZLANG('删除').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goleft(this)\">'.JZLANG('左移').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goright(this)\">'.JZLANG('右移').'</a></div></div>';\r\n                            \r\n                        }\r\n                    }\r\n                    $l .= '</span>\r\n\t\t\t\t\t  </div>\r\n\t\t\t\t\t  <div class=\"layui-progress\" id=\"'.$v['field'].'_propress\" style=\"display:none;\" lay-filter=\"'.$v['field'].'_propress\" lay-showPercent=\"yes\">\r\n                          <div class=\"layui-progress-bar layui-bg-green\" lay-percent=\"0%\"></div>\r\n                        </div>\r\n\t\t\t\t  </div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t\t<script>\r\n\t\t\t\t\r\n\t\t\t\tlayui.use(\"upload\", function(){\r\n\t\t\t\t\t  var upload_'.$v['field'].' = layui.upload;\r\n\t\t\t\t\t  \r\n\t\t\t\t\t  //执行实例\r\n\t\t\t\t\t  var uploadInst = upload_'.$v['field'].'.render({\r\n\t\t\t\t\t\telem: \"#LAY_'.$v['field'].'_upload\" //绑定元素\r\n\t\t\t\t\t\t,url: \"'.U('Common/uploads').'\" //上传接口\r\n\t\t\t\t\t\t,data:{tid:function(){ return $(\"#tid\").val();},molds:\"'.$molds.'\"}\r\n\t\t\t\t\t\t,accept:\"images\"\r\n\t\t\t\t\t\t,multiple: true\r\n\t\t\t\t\t\t,acceptMime:\"image/*\"\r\n\t\t\t\t\t\t,before:function(){\r\n\t\t\t\t\t\t    $(\"#'.$v['field'].'_propress\").show();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t,done: function(res){\r\n\t\t\t\t\t\t\tlayer.closeAll(\"loading\"); //关闭loading\r\n\t\t\t\t\t\t\tif(res.code==0){\r\n                                $(\".preview_'.$v['field'].'\").append(\\'<div class=\"upload-icon-img layui-input-inline\" ><div class=\"upload-pre-item\"><img src=\"\\' + res.url + \\'\" class=\"img\" width=\"200px\" height=\"200px\" ><input name=\"'.$v['field'].'_urls[]\" type=\"text\" class=\"layui-input\"  value=\"\\' + res.url + \\'\" /><input name=\"'.$v['field'].'_des[]\" type=\"text\" class=\"layui-input\"  placeholder=\"'.JZLANG('文字描述').'\" value=\"\" /><a class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger delete_file\">'.JZLANG('删除').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goleft(this)\">'.JZLANG('左移').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goright(this)\">'.JZLANG('右移').'</a></div></div>\\');\r\n                                setTimeout(function() {\r\n\t\t\t\t\t\t\t\t $(\"#'.$v['field'].'_propress\").hide();\r\n\t\t\t\t\t\t\t\t },2000)\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n                        ,progress: function(n, elem, res, index){\r\n                            var percent = n + \"%\" //获取进度百分比\r\n                            element.progress(\"'.$v['field'].'_propress\", percent);\r\n                          }\r\n\t\t\t\t\t\t,error: function(){\r\n\t\t\t\t\t\t  //请求异常回调\r\n\t\t\t\t\t\t  layer.alert(\"'.JZLANG('上传异常！').'\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t  });\r\n\t\t\t\t\t  \r\n\t\t\t\t\t\t//图库按钮点击事件\r\n\t\t\t\t\t\t$(\"#LAY_'.$v['field'].'_gallery\").on(\"click\", function(){\r\n\t\t\t\t\t\t\tvar galleryLayer = layer.open({\r\n\t\t\t\t\t\t\t\ttype: 1,\r\n\t\t\t\t\t\t\t\ttitle: \"'.JZLANG('选择图片').'\",\r\n\t\t\t\t\t\t\t\tarea: [\"80%\", \"80%\"],\r\n\t\t\t\t\t\t\t\tcontent: `<div class=\"gallery-container\" style=\"padding: 15px;\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"gallery-header\" style=\"margin-bottom: 15px;\">\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-btn-group\">\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_prev_'.$v['field'].'\">'.JZLANG('上一页').'</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_next_'.$v['field'].'\">'.JZLANG('下一页').'</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<span id=\"gallery_page_info_'.$v['field'].'\" style=\"margin-left: 15px;\"></span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div id=\"gallery_list_'.$v['field'].'\" class=\"gallery-list\" style=\"min-height: 400px; display: flex; flex-wrap: wrap; gap: 10px;\"></div>\r\n\t\t\t\t\t\t\t\t\t<div class=\"gallery-footer\" style=\"margin-top: 15px; text-align: center;\">\r\n\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"gallery_confirm_'.$v['field'].'\">'.JZLANG('确定').'</button>\r\n\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-primary\" onclick=\"layer.closeAll();\">'.JZLANG('取消').'</button>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>`,\r\n\t\t\t\t\t\t\t\tsuccess: function(layero, index){\r\n\t\t\t\t\t\t\t\t\tvar currentPage = 1;\r\n\t\t\t\t\t\t\t\t\tvar pageSize = 12;\r\n\t\t\t\t\t\t\t\t\tvar selectedImages = [];\r\n\t\t\t\t\t\t\t\t\tvar totalCount = 0;\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//加载图片列表\r\n\t\t\t\t\t\t\t\t\tfunction loadGallery(page){\r\n\t\t\t\t\t\t\t\t\t\t$.ajax({\r\n\t\t\t\t\t\t\t\t\t\t\turl: \"'.U('Sys/pictures').'\",\r\n\t\t\t\t\t\t\t\t\t\t\ttype: \"GET\",\r\n\t\t\t\t\t\t\t\t\t\t\tdata: {ajax:1, page: page, pageSize: pageSize},\r\n\t\t\t\t\t\t\t\t\t\t\tdataType: \"json\",\r\n\t\t\t\t\t\t\t\t\t\t\tsuccess: function(res){\r\n\t\t\t\t\t\t\t\t\t\t\t\tif(res.code == 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar html = \"\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(res.data.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$.each(res.data, function(i, item){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar ext = item.filetype.split('.').pop().toLowerCase();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar imageExts = [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\", \"svg\"];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar isImage = imageExts.includes(ext);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar contentHtml = \"\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(isImage){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<img src=\"${item.litpic}\" style=\"width: 100%; height: 100%; object-fit: cover;\">`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<div style=\"width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; background: #f5f5f5; padding: 10px;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"font-size: 40px; color: #999;\">&#xe61e;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style=\"font-size: 12px; color: #666; margin-top: 8px; word-break: break-all; text-align: center;\">${item.fileName}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thtml += `<div class=\"gallery-item\" data-id=\"`+item.id+`\" data-url=\"`+item.litpic+`\" style=\"width: 140px; height: 140px; border: 2px solid #e6e6e6; border-radius: 4px; cursor: pointer; position: relative; overflow: hidden;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`+contentHtml+`\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"gallery-item-info\" style=\"position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.6); color: #fff; padding: 5px; font-size: 12px; display: none;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${item.fileName}<br>${item.size}kb\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"gallery-item-check\" style=\"position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; border-radius: 50%; border: 2px solid #fff; background: rgba(0,0,0,0.5); display: none;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"color: #fff; font-size: 14px; line-height: 16px;\">&#xe605;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_list_'.$v['field'].'\").html(html);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttotalCount = res.count;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_page_info_'.$v['field'].'\").text(\"第\"+page+\"页 / 共\"+totalPages+\"页\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//图片悬停事件\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").hover(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfunction(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-info\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfunction(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-info\").hide();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//图片点击事件\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar url = $(this).data(\"url\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar id = $(this).data(\"id\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar index = selectedImages.indexOf(url);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(index > -1){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedImages.splice(index, 1);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#e6e6e6\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").hide();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedImages.push(url);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#1E9FFF\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//恢复已选中的图片\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").each(function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar url = $(this).data(\"url\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(selectedImages.indexOf(url) > -1){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#1E9FFF\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_list_'.$v['field'].'\").html(\\'<div style=\"width: 100%; text-align: center; padding: 50px; color: #999;\">'.JZLANG('暂无图片').'</div>\\');\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayer.alert(res.msg || \"'.JZLANG('加载失败').'\", {icon: 5});\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\terror: function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\tlayer.alert(\"'.JZLANG('请求失败').'\", {icon: 5});\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//上一页\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_prev_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tif(currentPage > 1){\r\n\t\t\t\t\t\t\t\t\t\t\tcurrentPage--;\r\n\t\t\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//下一页\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_next_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\r\n\t\t\t\t\t\t\t\t\t\tif(currentPage < totalPages){\r\n\t\t\t\t\t\t\t\t\t\t\tcurrentPage++;\r\n\t\t\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//确定按钮\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_confirm_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tif(selectedImages.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t// 将选中的图片添加到预览区域\r\n\t\t\t\t\t\t\t\t\t\t\tfor(var i = 0; i < selectedImages.length; i++){\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar imgHtml = `<div class=\"upload-icon-img layui-input-inline\" ><div class=\"upload-pre-item\"><img src=\"` + selectedImages[i] + `\" class=\"img\" width=\"200px\" height=\"200px\" ><input name=\"'.$v['field'].'_urls[]\" type=\"text\" class=\"layui-input\"  value=\"` + selectedImages[i] + `\" /><input name=\"'.$v['field'].'_des[]\" type=\"text\" class=\"layui-input\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"\" /><a class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger delete_file\">'.JZLANG('删除').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goleft(this)\">'.JZLANG('左移').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goright(this)\">'.JZLANG('右移').'</a></div></div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t$(\".preview_'.$v['field'].'\").append(imgHtml);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tlayer.close(index);\r\n\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(\"'.JZLANG('请至少选择一张图片').'\", {icon: 0});\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//初始加载\r\n\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\t\t});\r\n\t\t\t\t</script>';\r\n                    break;\r\n                case 7:\r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t<select name=\"'.$v['field'].'\" lay-search=\"\" id=\"'.$v['field'].'\" ><option value=\"\">'.JZLANG('请选择').'</option>';\r\n                    foreach(explode(',',$v['body']) as $vv){\r\n                        $s=explode('=',$vv);\r\n                        $l.='<option value=\"'.$s[1].'\" ';\r\n                        if($data[$v['field']]==$s[1]){\r\n                            $l.='selected=\"selected\"';\r\n                        }\r\n                        $l.='>'.$s[0].'</option>';\r\n                    }\r\n                    $l.=  '</select>\r\n                    </div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>\r\n\t\t\t\t<script>\r\n\t\t\t\t\t\t\tlayui.use(\"form\", function () {\r\n\t\t\t\t\t\t\t\tvar form_'.$v['field'].' = layui.form;\r\n\t\t\t\t\t\t\t\tform_'.$v['field'].'.render();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t</script>';\r\n                    break;\r\n                case 8:\r\n                    $l .= '<div class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-input-block\">';\r\n                    foreach(explode(',',$v['body']) as $vv){\r\n                        $s=explode('=',$vv);\r\n                        $l.='<input type=\"checkbox\" title=\"'.$s[0].'\" name=\"'.$v['field'].'[]\" value=\"'.$s[1].'\" ';\r\n                        if(strpos($data[$v['field']],','.$s[1].',')!==false){\r\n                            $l.='checked=\"checked\"';};\r\n                        $l.='>';\r\n                    }\r\n                    $l \t.= '</div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>\r\n\t\t\t\t\t  <script>\r\n\t\t\t\t\t\t\tlayui.use(\"form\", function () {\r\n\t\t\t\t\t\t\t\tvar form_'.$v['field'].' = layui.form;\r\n\t\t\t\t\t\t\t\tform_'.$v['field'].'.render();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t</script>';\r\n                    \r\n                    break;\r\n                case 9:\r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n\t\t\t\t\t\r\n                    <div class=\"layui-input-inline\">\r\n                      <div class=\"site-demo-upbar\">\r\n                      \r\n\t\t\t\t\t  <input name=\"'.$v['field'].'\" type=\"text\" class=\"layui-input\" id=\"'.$v['field'].'\" ';\r\n                    if($v['ismust']==1){\r\n                        $l.=' required=\"\" lay-verify=\"required\" ';\r\n                    }\r\n                    $l  .=\t'value=\"'.$data[$v['field']].'\" />\r\n\t\t\t\t<div class=\"layui-progress\" id=\"'.$v['field'].'_propress\" style=\"display:none;\" lay-filter=\"'.$v['field'].'_propress\" lay-showPercent=\"yes\">\r\n                          <div class=\"layui-progress-bar layui-bg-green\" lay-percent=\"0%\"></div>\r\n                        </div>\r\n\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"LAY_'.$v['field'].'_upload\">\r\n\t\t\t\t\t\t  <i class=\"layui-icon\">&#xe67c;</i>上传附件\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t<button class=\"layui-btn layui-btn-warm\" id=\"LAY_'.$v['field'].'_gallery\" type=\"button\" >'.JZLANG('图库').'</button>\r\n\r\n\t\t\t\t\t  \r\n                      </div>\r\n                    </div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>\r\n\t\t\t\t<script>\r\n\t\t\t\t\r\n\t\t\t\tlayui.use(\"upload\", function(){\r\n\t\t\t\t\t  var upload_'.$v['field'].' = layui.upload;\r\n\t\t\t\t\t  \r\n\t\t\t\t\t  //执行实例\r\n\t\t\t\t\t  var uploadInst = upload_'.$v['field'].'.render({\r\n\t\t\t\t\t\telem: \"#LAY_'.$v['field'].'_upload\" //绑定元素\r\n\t\t\t\t\t\t,url: \"'.U('Common/uploads').'\" //上传接口\r\n\t\t\t\t\t\t,data:{tid:function(){ return $(\"#tid\").val();},molds:\"'.$molds.'\"}\r\n\t\t\t\t\t\t,accept:\"file\"\r\n\t\t\t\t\t\t,exts: \"'.$this->webconf['fileType'].'\"\r\n\t\t\t\t\t\t,before:function(){\r\n\t\t\t\t\t\t    $(\"#'.$v['field'].'_propress\").show();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t,done: function(res){\r\n\t\t\t\t\t\t\tif(res.code==0){\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t $(\"#'.$v['field'].'\").val(res.url);\r\n\t\t\t\t\t\t\t\t setTimeout(function() {\r\n\t\t\t\t\t\t\t\t $(\"#'.$v['field'].'_propress\").hide();\r\n\t\t\t\t\t\t\t\t },2000)\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t,progress: function(n, elem, res, index){\r\n                            var percent = n + \"%\" //获取进度百分比\r\n                            element.progress(\"'.$v['field'].'_propress\", percent);\r\n                          }\r\n\t\t\t\t\t\t,error: function(){\r\n\t\t\t\t\t\t  //请求异常回调\r\n\t\t\t\t\t\t  layer.alert(\"'.JZLANG('上传异常！').'\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t  });\r\n\t\t\t\t\t  //图库按钮点击事件\r\n\t\t\t\t\t\t$(\"#LAY_'.$v['field'].'_gallery\").on(\"click\", function(){\r\n\t\t\t\t\t\t\tvar galleryLayer = layer.open({\r\n\t\t\t\t\t\t\t\ttype: 1,\r\n\t\t\t\t\t\t\t\ttitle: \"'.JZLANG('选择文件').'\",\r\n\t\t\t\t\t\t\t\tarea: [\"80%\", \"80%\"],\r\n\t\t\t\t\t\t\t\tcontent: `<div class=\"gallery-container\" style=\"padding: 15px;\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"gallery-header\" style=\"margin-bottom: 15px;\">\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-btn-group\">\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_prev_'.$v['field'].'\">'.JZLANG('上一页').'</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_next_'.$v['field'].'\">'.JZLANG('下一页').'</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<span id=\"gallery_page_info_'.$v['field'].'\" style=\"margin-left: 15px;\"></span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div id=\"gallery_list_'.$v['field'].'\" class=\"gallery-list\" style=\"min-height: 400px; display: flex; flex-wrap: wrap; gap: 10px;\"></div>\r\n\t\t\t\t\t\t\t\t\t<div class=\"gallery-footer\" style=\"margin-top: 15px; text-align: center;\">\r\n\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"gallery_confirm_'.$v['field'].'\">'.JZLANG('确定').'</button>\r\n\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-primary\" onclick=\"layer.closeAll();\">'.JZLANG('取消').'</button>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>`,\r\n\t\t\t\t\t\t\t\tsuccess: function(layero, index){\r\n\t\t\t\t\t\t\t\t\tvar currentPage = 1;\r\n\t\t\t\t\t\t\t\t\tvar pageSize = 12;\r\n\t\t\t\t\t\t\t\t\tvar selectedFiles = [];\r\n\t\t\t\t\t\t\t\t\tvar totalCount = 0;\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//加载文件列表\r\n\t\t\t\t\t\t\t\t\tfunction loadGallery(page){\r\n\t\t\t\t\t\t\t\t\t\t$.ajax({\r\n\t\t\t\t\t\t\t\t\t\t\turl: \"'.U('Sys/pictures').'\",\r\n\t\t\t\t\t\t\t\t\t\t\ttype: \"GET\",\r\n\t\t\t\t\t\t\t\t\t\t\tdata: {ajax:1, page: page, pageSize: pageSize},\r\n\t\t\t\t\t\t\t\t\t\t\tdataType: \"json\",\r\n\t\t\t\t\t\t\t\t\t\t\tsuccess: function(res){\r\n\t\t\t\t\t\t\t\t\t\t\t\tif(res.code == 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar html = \"\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(res.data.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$.each(res.data, function(i, item){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar ext = item.filetype.split('.').pop().toLowerCase();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar imageExts = [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\", \"svg\"];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar isImage = imageExts.includes(ext);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar contentHtml = \"\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(isImage){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<img src=\"${item.litpic}\" style=\"width: 100%; height: 100%; object-fit: cover;\">`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<div style=\"width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; background: #f5f5f5; padding: 10px;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"font-size: 40px; color: #999;\">&#xe61e;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style=\"font-size: 12px; color: #666; margin-top: 8px; word-break: break-all; text-align: center;\">${item.fileName}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thtml += `<div class=\"gallery-item\" data-id=\"`+item.id+`\" data-url=\"`+item.litpic+`\" style=\"width: 140px; height: 140px; border: 2px solid #e6e6e6; border-radius: 4px; cursor: pointer; position: relative; overflow: hidden;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`+contentHtml+`\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"gallery-item-info\" style=\"position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.6); color: #fff; padding: 5px; font-size: 12px; display: none;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${item.fileName}<br>${item.size}kb\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"gallery-item-check\" style=\"position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; border-radius: 50%; border: 2px solid #fff; background: rgba(0,0,0,0.5); display: none;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"color: #fff; font-size: 14px; line-height: 16px;\">&#xe605;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_list_'.$v['field'].'\").html(html);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttotalCount = res.count;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_page_info_'.$v['field'].'\").text(\"第\"+page+\"页 / 共\"+totalPages+\"页\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//文件悬停事件\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").hover(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfunction(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-info\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfunction(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-info\").hide();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//文件点击事件（单选模式）\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 清除之前的选择\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").each(function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#e6e6e6\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").hide();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar url = $(this).data(\"url\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar id = $(this).data(\"id\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 设置当前选择\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedFiles = [url];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#1E9FFF\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//恢复已选中的文件\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").each(function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar url = $(this).data(\"url\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(selectedFiles.indexOf(url) > -1){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#1E9FFF\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_list_'.$v['field'].'\").html(\\'<div style=\"width: 100%; text-align: center; padding: 50px; color: #999;\">'.JZLANG('暂无文件').'</div>\\');\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayer.alert(res.msg || \"'.JZLANG('加载失败').'\", {icon: 5});\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\terror: function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\tlayer.alert(\"'.JZLANG('请求失败').'\", {icon: 5});\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//上一页\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_prev_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tif(currentPage > 1){\r\n\t\t\t\t\t\t\t\t\t\t\tcurrentPage--;\r\n\t\t\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//下一页\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_next_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\r\n\t\t\t\t\t\t\t\t\t\tif(currentPage < totalPages){\r\n\t\t\t\t\t\t\t\t\t\t\tcurrentPage++;\r\n\t\t\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//确定按钮（单选）\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_confirm_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tif(selectedFiles.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t$(\"#'.$v['field'].'\").val(selectedFiles[0]);\r\n\t\t\t\t\t\t\t\t\t\t\tlayer.close(index);\r\n\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(\"'.JZLANG('请选择一个文件').'\", {icon: 0});\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//初始加载\r\n\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t});\r\n\t\t\t\t</script>';\r\n                    break;\r\n                case 10:\r\n                    $l .= '<fieldset class=\"layui-elem-field\">\r\n\t\t\t\t  <legend>'.$v['fieldname'].'</legend>\r\n\t\t\t\t  <div class=\"layui-field-box\">\r\n\t\t\t\t\t  <div class=\"layui-input-block\">\r\n\t\t\t\t\t\t  <div class=\"site-demo-upbar\">\r\n\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"LAY_'.$v['field'].'_upload\">\r\n\t\t\t\t\t\t  <i class=\"layui-icon\">&#xe67c;</i>'.JZLANG('上传附件').'\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t<button class=\"layui-btn layui-btn-warm\" id=\"LAY_'.$v['field'].'_gallery\" type=\"button\" >'.JZLANG('图库').'</button>\r\n\t\t\t\t\t\t '.$v['tips'].'\r\n\t\t\t\t\t  </div>\r\n\t\t\t\t\t\t \r\n\t\t\t\t\t  </div>\r\n\t\t\t\t\t \r\n\t\t\t\t\t  <div class=\"layui-input-block\">\r\n\t\t\t\t\t  <span class=\"preview_'.$v['field'].'\" >';\r\n                    if($data[$v['field']]!=''){\r\n                        foreach(explode('||',$data[$v['field']]) as $vv){\r\n                            $pic = explode('|',$vv);\r\n                            $l.='<div class=\"upload-icon-img layui-input-inline\" ><div class=\"upload-pre-item\"><input name=\"'.$v['field'].'_urls[]\" type=\"text\" class=\"layui-input\"  value=\"'.$pic[0].'\" /><input name=\"'.$v['field'].'_des[]\" type=\"text\" class=\"layui-input\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"'.$pic[1].'\" /><a class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger delete_file\">'.JZLANG('删除').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goleft(this)\">'.JZLANG('左移').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goright(this)\">'.JZLANG('右移').'</a></div></div>';\r\n                            \r\n                        }\r\n                    }\r\n                    $l .= '</span>\r\n\t\t\t\t\t  </div>\r\n\t\t\t\t\t  <div class=\"layui-progress\" id=\"'.$v['field'].'_propress\" style=\"display:none;\" lay-filter=\"'.$v['field'].'_propress\" lay-showPercent=\"yes\">\r\n                          <div class=\"layui-progress-bar layui-bg-green\" lay-percent=\"0%\"></div>\r\n                        </div>\r\n\t\t\t\t  </div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t\t<script>\r\n\t\t\t\t\r\n\t\t\t\tlayui.use(\"upload\", function(){\r\n\t\t\t\t\t  var upload_'.$v['field'].' = layui.upload;\r\n\t\t\t\t\t  \r\n\t\t\t\t\t  //执行实例\r\n\t\t\t\t\t  var uploadInst = upload_'.$v['field'].'.render({\r\n\t\t\t\t\t\telem: \"#LAY_'.$v['field'].'_upload\" //绑定元素\r\n\t\t\t\t\t\t,url: \"'.U('Common/uploads').'\" //上传接口\r\n\t\t\t\t\t\t,data:{tid:function(){ return $(\"#tid\").val();},molds:\"'.$molds.'\"}\r\n\t\t\t\t\t\t,multiple: true\r\n\t\t\t\t\t\t,accept:\"file\"\r\n\t\t\t\t\t\t,exts: \"'.$this->webconf['fileType'].'\"\r\n\t\t\t\t\t\t,before:function(){\r\n\t\t\t\t\t\t    $(\"#'.$v['field'].'_propress\").show();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t,done: function(res){\r\n\t\t\t\t\t\t\tlayer.closeAll(\"loading\"); //关闭loading\r\n\t\t\t\t\t\t\tif(res.code==0){\r\n                                $(\".preview_'.$v['field'].'\").append(\\'<div class=\"upload-icon-img layui-input-inline\" ><div class=\"upload-pre-item\"><input name=\"'.$v['field'].'_urls[]\" type=\"text\" class=\"layui-input\"  value=\"\\' + res.url + \\'\" /><input name=\"'.$v['field'].'_des[]\" type=\"text\" class=\"layui-input\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"\" /><a class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger delete_file\">'.JZLANG('删除').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goleft(this)\">'.JZLANG('左移').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goright(this)\">'.JZLANG('右移').'</a></div></div>\\');\r\n\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\t $(\"#'.$v['field'].'_propress\").hide();\r\n\t\t\t\t\t\t\t\t },2000)\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t,progress: function(n, elem, res, index){\r\n                            var percent = n + \"%\" //获取进度百分比\r\n                            element.progress(\"'.$v['field'].'_propress\", percent);\r\n                          }\r\n\t\t\t\t\t\t,error: function(){\r\n\t\t\t\t\t\t  //请求异常回调\r\n\t\t\t\t\t\t  layer.alert(\"'.JZLANG('上传异常！').'\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t  });\r\n\t\t\t\t\t  \r\n\t\t\t\t\t\t//图库按钮点击事件\r\n\t\t\t\t\t\t$(\"#LAY_'.$v['field'].'_gallery\").on(\"click\", function(){\r\n\t\t\t\t\t\t\tvar galleryLayer = layer.open({\r\n\t\t\t\t\t\t\t\ttype: 1,\r\n\t\t\t\t\t\t\t\ttitle: \"'.JZLANG('选择文件').'\",\r\n\t\t\t\t\t\t\t\tarea: [\"80%\", \"80%\"],\r\n\t\t\t\t\t\t\t\tcontent: `<div class=\"gallery-container\" style=\"padding: 15px;\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"gallery-header\" style=\"margin-bottom: 15px;\">\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-btn-group\">\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_prev_'.$v['field'].'\">'.JZLANG('上一页').'</button>\r\n\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_next_'.$v['field'].'\">'.JZLANG('下一页').'</button>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<span id=\"gallery_page_info_'.$v['field'].'\" style=\"margin-left: 15px;\"></span>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div id=\"gallery_list_'.$v['field'].'\" class=\"gallery-list\" style=\"min-height: 400px; display: flex; flex-wrap: wrap; gap: 10px;\"></div>\r\n\t\t\t\t\t\t\t\t\t<div class=\"gallery-footer\" style=\"margin-top: 15px; text-align: center;\">\r\n\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"gallery_confirm_'.$v['field'].'\">'.JZLANG('确定').'</button>\r\n\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-primary\" onclick=\"layer.closeAll();\">'.JZLANG('取消').'</button>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>`,\r\n\t\t\t\t\t\t\t\tsuccess: function(layero, index){\r\n\t\t\t\t\t\t\t\t\tvar currentPage = 1;\r\n\t\t\t\t\t\t\t\t\tvar pageSize = 12;\r\n\t\t\t\t\t\t\t\t\tvar selectedFiles = [];\r\n\t\t\t\t\t\t\t\t\tvar totalCount = 0;\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//加载文件列表\r\n\t\t\t\t\t\t\t\t\tfunction loadGallery(page){\r\n\t\t\t\t\t\t\t\t\t\t$.ajax({\r\n\t\t\t\t\t\t\t\t\t\t\turl: \"'.U('Sys/pictures').'\",\r\n\t\t\t\t\t\t\t\t\t\t\ttype: \"GET\",\r\n\t\t\t\t\t\t\t\t\t\t\tdata: {ajax:1, page: page, pageSize: pageSize},\r\n\t\t\t\t\t\t\t\t\t\t\tdataType: \"json\",\r\n\t\t\t\t\t\t\t\t\t\t\tsuccess: function(res){\r\n\t\t\t\t\t\t\t\t\t\t\t\tif(res.code == 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar html = \"\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(res.data.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$.each(res.data, function(i, item){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar ext = item.filetype.split('.').pop().toLowerCase();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar imageExts = [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\", \"svg\"];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar isImage = imageExts.includes(ext);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar contentHtml = \"\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(isImage){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<img src=\"${item.litpic}\" style=\"width: 100%; height: 100%; object-fit: cover;\">`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<div style=\"width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; background: #f5f5f5; padding: 10px;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"font-size: 40px; color: #999;\">&#xe61e;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style=\"font-size: 12px; color: #666; margin-top: 8px; word-break: break-all; text-align: center;\">${item.fileName}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thtml += `<div class=\"gallery-item\" data-id=\"`+item.id+`\" data-url=\"`+item.litpic+`\" style=\"width: 140px; height: 140px; border: 2px solid #e6e6e6; border-radius: 4px; cursor: pointer; position: relative; overflow: hidden;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`+contentHtml+`\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"gallery-item-info\" style=\"position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.6); color: #fff; padding: 5px; font-size: 12px; display: none;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${item.fileName}<br>${item.size}kb\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"gallery-item-check\" style=\"position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; border-radius: 50%; border: 2px solid #fff; background: rgba(0,0,0,0.5); display: none;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"color: #fff; font-size: 14px; line-height: 16px;\">&#xe605;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_list_'.$v['field'].'\").html(html);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttotalCount = res.count;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_page_info_'.$v['field'].'\").text(\"第\"+page+\"页 / 共\"+totalPages+\"页\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//文件悬停事件\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").hover(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfunction(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-info\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfunction(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-info\").hide();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//文件点击事件（多选模式）\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar url = $(this).data(\"url\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar id = $(this).data(\"id\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar index = selectedFiles.indexOf(url);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(index > -1){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedFiles.splice(index, 1);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#e6e6e6\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").hide();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedFiles.push(url);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#1E9FFF\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//恢复已选中的文件\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\".gallery-item\").each(function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar url = $(this).data(\"url\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(selectedFiles.indexOf(url) > -1){\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).css(\"border-color\", \"#1E9FFF\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(this).find(\".gallery-item-check\").show();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$(\"#gallery_list_'.$v['field'].'\").html(\\'<div style=\"width: 100%; text-align: center; padding: 50px; color: #999;\">'.JZLANG('暂无文件').'</div>\\');\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayer.alert(res.msg || \"'.JZLANG('加载失败').'\", {icon: 5});\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\terror: function(){\r\n\t\t\t\t\t\t\t\t\t\t\t\tlayer.alert(\"'.JZLANG('请求失败').'\", {icon: 5});\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//上一页\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_prev_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tif(currentPage > 1){\r\n\t\t\t\t\t\t\t\t\t\t\tcurrentPage--;\r\n\t\t\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//下一页\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_next_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\r\n\t\t\t\t\t\t\t\t\t\tif(currentPage < totalPages){\r\n\t\t\t\t\t\t\t\t\t\t\tcurrentPage++;\r\n\t\t\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//确定按钮（多选）\r\n\t\t\t\t\t\t\t\t\t$(\"#gallery_confirm_'.$v['field'].'\").on(\"click\", function(){\r\n\t\t\t\t\t\t\t\t\t\tif(selectedFiles.length > 0){\r\n\t\t\t\t\t\t\t\t\t\t\t// 将选中的文件添加到预览区域\r\n\t\t\t\t\t\t\t\t\t\t\tfor(var i = 0; i < selectedFiles.length; i++){\r\n\t\t\t\t\t\t\t\t\t\t\t\tvar fileHtml = `<div class=\"upload-icon-img layui-input-inline\" ><div class=\"upload-pre-item\"><input name=\"'.$v['field'].'_urls[]\" type=\"text\" class=\"layui-input\"  value=\"` + selectedFiles[i] + `\" /><input name=\"'.$v['field'].'_des[]\" type=\"text\" class=\"layui-input\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"\" /><a class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger delete_file\">'.JZLANG('删除').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goleft(this)\">'.JZLANG('左移').'</a><a class=\"layui-btn layui-btn-sm layui-btn-radius imgorder \" onclick=\"goright(this)\">'.JZLANG('右移').'</a></div></div>`;\r\n\t\t\t\t\t\t\t\t\t\t\t\t$(\".preview_'.$v['field'].'\").append(fileHtml);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tlayer.close(index);\r\n\t\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(\"'.JZLANG('请至少选择一个文件').'\", {icon: 0});\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t//初始加载\r\n\t\t\t\t\t\t\t\t\tloadGallery(currentPage);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t</script>';\r\n                    break;\r\n                case 11:\r\n                    $laydate = ($data[$v['field']]=='' || $data[$v['field']]==0)?time():$data[$v['field']];\r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input id=\"laydate_'.$v['field'].'\" value=\"'.date('Y-m-d H:i:s',$laydate).'\" name=\"'.$v['field'].'\" ';\r\n                    if($v['ismust']==1){\r\n                        $l.=' required=\"\" lay-verify=\"required\" ';\r\n                    }\r\n                    $l .=  'autocomplete=\"off\" class=\"layui-input\">\r\n                    </div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $randt = getRandChar(5);\r\n                    $l.='</div>\r\n\t\t\t\t\t<script>\r\n\t\t\t\t\tlayui.use(\"laydate\", function(){\r\n\t\t\t\t\tvar laydate'.$randt.' = layui.laydate;\r\n\t\t\t\t\tlaydate'.$randt.'.render({elem: \"#laydate_'.$v['field'].'\",type:\"datetime\",trigger: \"click\" });});</script>';\r\n                    break;\r\n                case 12:\r\n                    $l .= '<div class=\"layui-form-item\" pane>\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">';\r\n                    foreach(explode(',',$v['body']) as $vv){\r\n                        $s=explode('=',$vv);\r\n                        $l.='<input type=\"radio\" name=\"'.$v['field'].'\" value=\"'.$s[1].'\" title=\"'.$s[0].'\" ';\r\n                        if($data[$v['field']]==$s[1]){\r\n                            $l.='checked=\"checked\"';\r\n                        }\r\n                        $l.=' >';\r\n                    }\r\n                    $l.='</div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>\r\n\t\t\t\t\t<script>\r\n\t\t\t\t\t\t\tlayui.use(\"form\", function () {\r\n\t\t\t\t\t\t\t\tvar form_'.$v['field'].' = layui.form;\r\n\t\t\t\t\t\t\t\tform_'.$v['field'].'.render();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t</script>';\r\n                    break;\r\n                \r\n                case 13:\r\n                case 21:\r\n                    //tid,field\r\n                    \r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t<input type=\"hidden\" id=\"'.$v['field'].'\" name=\"'.$v['field'].'\" value=\"\">\r\n\t\t\t\t\t<div id=\"'.$v['field'].'_xmselect\"></div>\r\n\t\t\t\t\t<script>\r\n\t\t\t\t\tvar '.$v['field'].'_xmselect = xmSelect.render({\r\n\t\t\t\t\t\t\tel: \"#'.$v['field'].'_xmselect\",\r\n\t\t\t\t\t\t\tautoRow: true,\r\n\t\t\t\t\t\t\ttoolbar: { show: true },\r\n\t\t\t\t\t\t\tlist: [ \"ALL\", \"CLEAR\"],\r\n\t\t\t\t\t\t\tfilterable: true,\r\n\t\t\t\t\t\t\tradio:true,';\r\n                    if($v['remote']){\r\n                        $l.='remoteSearch: true,\r\n                                        remoteMethod: function(val, cb, show){\r\n            //\t\t\t\t\t\t\t\tif(!val){\r\n            //\t\t\t\t\t\t\t\t\treturn cb([]);\r\n            //\t\t\t\t\t\t\t\t}\r\n                                            $.get(\"'.U('Fields/getSelect').'\",{id:\"'.$v['id'].'\",key:val},function(res){\r\n                                                if(res.code==0){\r\n                                                    cb(res.data)\r\n                                                }else{\r\n                                                    layer.alert(res.msg)\r\n                                                    \r\n                                                }\r\n                                                \r\n                                            },\"json\")\r\n                                            \r\n                                        },';\r\n                    }\r\n                    $l.='\r\n\t\t\t\t\t\t\ton:function(r){\r\n\t\t\t\t\t\t\t\tif(r[\"arr\"].length>0){\r\n\t\t\t\t\t\t\t\t\t$(\"#'.$v['field'].'\").val(r[\"arr\"][0].value)';\r\n                    if($v['ldfield'] && $v['linkfield']){\r\n                        $ldfields = explode('|',$v['ldfield']);\r\n                        $linkfields = explode('|',$v['linkfield']);\r\n                        foreach($ldfields as $lk=>$ld){\r\n                            $fx = M('fields')->find(['field'=>$ld]);\r\n                            $l.='\r\n                                        $.get(\"'.U('Fields/getliandong').'\",\r\n                                        {id:\"'.$fx['id'].'\",key:r[\"arr\"][0].value,field:\"'.$linkfields[$lk].'\"},\r\n                                        function(res){\r\n                                                    if(res.code==0){\r\n                                                        '.$ld.'_xmselect.update({\r\n                                                            data:res.data\r\n                                                        });\r\n                                                        '.$ld.'_xmselect.setValue(['.trim($data[$ld],',').']);\r\n                                                         $(\"#'.$ld.'\").val('.trim($data[$ld],',').')\r\n                                                        \r\n                                                    }else{\r\n                                                        //layer.alert(res.msg)\r\n                                                        \r\n                                                    }\r\n                                                    \r\n                                        },\"json\")\r\n                                        ';\r\n                        }\r\n                    }\r\n                    $l.='\r\n\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t$(\"#'.$v['field'].'\").val(\"\")\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});';\r\n                    if($v['remote']){\r\n                        \r\n                        $l.=' $.get(\"'.U('Fields/getSelect').'\",{id:\"'.$v['id'].'\",value:\"'.$data[$v['field']].'\",check:1},function(res){\r\n                                if(res.code==0){\r\n                                    '.$v['field'].'_xmselect.setValue(res.data);\r\n                                    $(\"#'.$v['field'].'\").val(\"'.$data[$v['field']].'\");\r\n                                }else{\r\n                                    //layer.alert(res.msg)\r\n                                    \r\n                                }\r\n                                \r\n                            },\"json\");';\r\n                        \r\n                    }else{\r\n                        $l.=' '.$v['field'].'_xmselect.setValue(['.$data[$v['field']].']);\r\n                            $(\"#'.$v['field'].'\").val(\"'.$data[$v['field']].'\");';\r\n                    }\r\n                    $l.='\r\n\t\t\t\t\t\t \r\n\t\t\t\t\t\t</script>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t';\r\n                    \r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>\r\n\t\t\t\t<script>\r\n\t\t\t\t\t\t\tlayui.use(\"form\", function () {\r\n\t\t\t\t\t\t\t\tvar form_'.$v['field'].' = layui.form;\r\n\t\t\t\t\t\t\t\tform_'.$v['field'].'.render();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t</script>';\r\n                    break;\r\n                case 14:\r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"text\" id=\"'.$v['field'].'\" value=\"'.$data[$v['field']].'\" name=\"'.$v['field'].'\" ';\r\n                    if($v['ismust']==1){\r\n                        $l.=' required=\"\" lay-verify=\"required\" ';\r\n                    }\r\n                    $l .=  'autocomplete=\"off\" class=\"layui-input\">\r\n                    </div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>';\r\n                    break;\r\n                case 15:\r\n                    $l .= '<fieldset class=\"layui-elem-field\">\r\n\t\t\t\t  <legend>'.$v['fieldname'].'</legend>\r\n\t\t\t\t  <div class=\"layui-field-box\">\r\n\t\t\t\t\t  <div class=\"layui-input-block\" id=\"'.$v['field'].'_space\">';\r\n                    if($data[$v['field']]){\r\n                        $rs = explode('||',$data[$v['field']]);\r\n                        foreach($rs as $vv){\r\n                            $l.='<div class=\"layui-input-block\"><input type=\"text\"  style=\"width:500px;\" value=\"'.$vv.'\" name=\"'.$v['field'].'[]\" autocomplete=\"off\" class=\"layui-input layui-input-inline\"><button type=\"button\" class=\"layui-btn layui-btn-danger layui-btn-sm  layui-input-inline '.$v['field'].'_del\" >'.JZLANG('删除').'</button></div>';\r\n                        }\r\n                    }else{\r\n                        $l .='<div class=\"layui-input-block\">\r\n\t\t\t\t\t\t\t<input type=\"text\"  style=\"width:500px;\" value=\"'.$data[$v['field']].'\" name=\"'.$v['field'].'[]\" autocomplete=\"off\" class=\"layui-input\">\r\n\t\t\t\t\t\t</div>';\r\n                    }\r\n                    $l\t.=  '</div>\r\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn\" id=\"'.$v['field'].'_add\">新增</button>'.$v['tips'].'\r\n\t\t\t\t      </div>\r\n\t\t\t\t  </div>\r\n\t\t\t\t</fieldset>\r\n\t\t\t\t<script>\r\n\t\t\t\t$(document).ready(function(){\r\n\t\t\t\t\t$(\"#'.$v['field'].'_add\").click(function(){\r\n\t\t\t\t\t\tvar html = \\'<div class=\"layui-input-block\"><input type=\"text\"  style=\"width:500px;\" value=\"\" name=\"'.$v['field'].'[]\" autocomplete=\"off\" class=\"layui-input layui-input-inline\"><button type=\"button\" class=\"layui-btn layui-btn-danger layui-btn-sm  layui-input-inline '.$v['field'].'_del\" >'.JZLANG('删除').'</button></div>\\';\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t$(\"#'.$v['field'].'_space\").append(html);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t});\r\n\t\t\t\t\t$(document).on(\"click\",\".'.$v['field'].'_del\",function(){\r\n\t\t\t\t\t\t$(this).parent().remove();\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t})\r\n\t\t\t\t</script>';\r\n                    break;\r\n                case 16:\r\n                case 20:\r\n                    \r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t<input type=\"hidden\" id=\"'.$v['field'].'\" name=\"'.$v['field'].'\" value=\"\">\r\n\t\t\t\t\t<div id=\"'.$v['field'].'_xmselect\"></div>\r\n\t\t\t\t\t<script>\r\n\t\t\t\t\tvar '.$v['field'].'_xmselect = xmSelect.render({\r\n\t\t\t\t\t\t\tel: \"#'.$v['field'].'_xmselect\",\r\n\t\t\t\t\t\t\tautoRow: true,\r\n\t\t\t\t\t\t\ttoolbar: { show: true },\r\n\t\t\t\t\t\t\tlist: [ \"ALL\", \"CLEAR\"],\r\n\t\t\t\t\t\t\tfilterable: true,';\r\n                    if($v['remote']){\r\n                        $l.='remoteSearch: true,\r\n                                        remoteMethod: function(val, cb, show){\r\n            //\t\t\t\t\t\t\t\tif(!val){\r\n            //\t\t\t\t\t\t\t\t\treturn cb([]);\r\n            //\t\t\t\t\t\t\t\t}\r\n                                            $.get(\"'.U('Fields/getSelect').'\",{id:\"'.$v['id'].'\",key:val},function(res){\r\n                                                if(res.code==0){\r\n                                                    cb(res.data)\r\n                                                }else{\r\n                                                    layer.alert(res.msg)\r\n                                                    \r\n                                                }\r\n                                                \r\n                                            },\"json\")\r\n                                            \r\n                                        },';\r\n                    }\r\n                    $l.='\r\n\t\t\t\t\t\t\ton:function(r){\r\n\t\t\t\t\t\t\t\tvar s = [];\r\n\t\t\t\t\t\t\t\tfor(var i=0;i<r[\"arr\"].length;i++){\r\n\t\t\t\t\t\t\t\t\ts.push(r[\"arr\"][i].value)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t$(\"#'.$v['field'].'\").val(s.join(\",\"))\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});';\r\n                    if($v['remote']) {\r\n                        $l .= '\r\n\t\t\t\t\t\t$.get(\"' . U('Fields/getSelect') . '\",{id:\"' . $v['id'] . '\",value:\"' . trim($data[$v['field']], ',') . '\",check:1},function(res){\r\n\t\t\t\t\t\t\t\t\tif(res.code==0){\r\n\t\t\t\t\t\t\t\t\t\t' . $v['field'] . '_xmselect.setValue(res.data);\r\n\t\t\t\t\t\t\t\t\t\t$(\"#' . $v['field'] . '\").val(\"' . trim($data[$v['field']], ',') . '\");\r\n\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\t//layer.alert(res.msg)\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t},\"json\");';\r\n                    }\r\n                    $l.='\r\n\t\t\t\t\t\t</script>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t';\r\n                    \r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $l.='</div>\r\n\t\t\t\t<script>\r\n\t\t\t\t\t\t\tlayui.use(\"form\", function () {\r\n\t\t\t\t\t\t\t\tvar form_'.$v['field'].' = layui.form;\r\n\t\t\t\t\t\t\t\tform_'.$v['field'].'.render();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t</script>';\r\n                    break;\r\n                \r\n                case 18:\r\n                    $l.='<div class=\"layui-form-item\">\r\n                    <label for=\"tids\" class=\"layui-form-label\">\r\n                        '.JZLANG('副栏目').'\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                       <div id=\"tids\" ></div>\r\n                    </div>\r\n                  \r\n                </div>\r\n                <script>\r\n                var tids_obj = xmSelect.render({\r\n        \t\tel: \"#tids\",\r\n        \t\tlanguage: \"zn\",\r\n        \t\ttoolbar: { show: true },\r\n\t\t\t\tlist: [ \"ALL\", \"CLEAR\"],\r\n        \t\tdata: [';\r\n                    foreach($this->classtypetree as $vv){\r\n                        if($vv['molds']==$molds){\r\n                            if($this->admin['classcontrol']==0 || $this->admin['isadmin']==1 || strpos($this->tids,','.$vv['id'].',')!==false || $moldsdata['iscontrol']==0){\r\n                                $l.='{name: \"'.str_repeat('--', $vv['level']).$vv['classname'].'\", value: '.$vv['id'].'},';\r\n                            }\r\n                            \r\n                        }\r\n                        \r\n                    }\r\n                    $l.=']\r\n              })\r\n                tids_obj.setValue([';\r\n                    \r\n                    foreach($this->classtypetree as $vv){\r\n                        if(strpos($data['tids'],','.$vv['id'].',')!==false){\r\n                            $l.='{name: \"'.str_repeat('--', $vv['level']).$vv['classname'].'\", value: '.$vv['id'].'},';\r\n                        }\r\n                    }\r\n                    $l.=' ])\r\n                    </script>';\r\n                    break;\r\n                case 19:\r\n                    $l.='<div class=\"layui-form-item layui-form-text\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">\r\n                        '.JZLANG('TAG标签').' [ '.JZLANG('按Enter回车自动添加').' ]\r\n                    </label>\r\n                    <div class=\"layui-input-block\">\r\n\t\t\t\t\t\t <input id=\"'.$v['field'].'\" type=\"text\" class=\"'.$v['field'].'\" name=\"'.$v['field'].'\" value=\"'.trim($data[$v['field']],','). '\"  autocomplete=\"off\" class=\"layui-input\"  />\r\n                    </div>\r\n                </div>\r\n                <script>\r\n                $(function() {\r\n\t\t\t  $(\"#'.$v['field'].'\").tagsInput({\r\n\t\t\t\t\twidth:\"auto\",\r\n\t\t\t\t\tdefaultText:\"'.JZLANG('添加一个标签').'\",\r\n                    });\r\n                })</script>';\r\n                    break;\r\n                case 20:\r\n                    $laydate = ($data[$v['field']]=='' || $data[$v['field']]==0)?time():$data[$v['field']];\r\n                    $l .= '<div class=\"layui-form-item\">\r\n                    <label for=\"'.$v['field'].'\" class=\"layui-form-label\">';\r\n                    if($v['ismust']==1){\r\n                        $l .= '<span class=\"x-red\">*</span>';\r\n                    }\r\n                    $l .= $v['fieldname'].'\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input id=\"laydate_'.$v['field'].'\" value=\"'.date('Y-m-d H:i:s',$laydate).'\" name=\"'.$v['field'].'\" ';\r\n                    if($v['ismust']==1){\r\n                        $l.=' required=\"\" lay-verify=\"required\" ';\r\n                    }\r\n                    $l .=  'autocomplete=\"off\" class=\"layui-input\">\r\n                    </div>';\r\n                    if($v['tips']){\r\n                        $l.='<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  <i data-info=\"'.$v['tips'].'\" data-field=\"f'.$v['id'].'\" class=\"layui-sys-icon layui-icon layui-icon-about f'.$v['id'].'\"></i>\r\n\t\t\t\t\t</div>';\r\n                    }\r\n                    $randt = getRandChar(5);\r\n                    $l.='</div>\r\n\t\t\t\t\t<script>\r\n\t\t\t\t\tlayui.use(\"laydate\", function(){\r\n\t\t\t\t\tvar laydate'.$randt.' = layui.laydate;\r\n\t\t\t\t\tlaydate'.$randt.'.render({elem: \"#laydate_'.$v['field'].'\",type:\"datetime\",trigger: \"click\",range:\"~\" });});</script>';\r\n                    break;\r\n                \r\n                \r\n                \r\n                \r\n            }\r\n            \r\n        }\r\n        echo $l;\r\n    }\r\n    \r\n    function getliandong(){\r\n\r\n        $id = $this->frparam('id');\r\n        if(!$id){\r\n            JsonReturn(['code'=>1,'msg'=>'ID错误！']);\r\n        }\r\n        $fields = M('fields')->find(['id'=>$id]);\r\n        if(!$fields){\r\n            JsonReturn(['code'=>1,'msg'=>'未找到字段！']);\r\n        }\r\n\r\n        $body = explode(',',$fields['body']);\r\n        $key = $this->frparam('key',1);\r\n        $field = $this->frparam('field',1);\r\n        $field_show = strtolower($body[1]);\r\n        switch($fields['fieldtype']){\r\n            case 13:\r\n            case 16:\r\n                $molds = M('molds')->getField(['id'=>$body[0]],'biaoshi');\r\n                if(!$molds){\r\n                    JsonReturn(['code'=>1,'msg'=>'关联绑定配置错误！']);\r\n                }\r\n                $sql = \"$field='$key'\";\r\n                break;\r\n            case 20:\r\n            case 21:\r\n                $tid = (int)$body[0];\r\n                $molds = $this->classtypedata[$tid]['molds'];\r\n                $tids = array_column($this->classtypedata[$tid]['children']['lists'],'id');\r\n                $tids[]=$tid;\r\n\r\n                $sql = \"$field='$key'\";\r\n                break;\r\n        }\r\n        $limit = $key ? null : 10;\r\n        $lists = M($molds)->findAll($sql,'id desc','id ,'.$field_show,$limit);\r\n\r\n        foreach($lists as $k=>$v){\r\n            $lists[$k]['value'] = $v['id'];\r\n            $lists[$k]['name'] = $v[$field_show];\r\n\r\n        }\r\n\r\n        JsonReturn(['code'=>0,'data'=>$lists]);\r\n\r\n    }\r\n\r\n    function getSelect(){\r\n        $id = $this->frparam('id');\r\n        if(!$id){\r\n            JsonReturn(['code'=>1,'msg'=>'ID错误！']);\r\n        }\r\n        $fields = M('fields')->find(['id'=>$id]);\r\n        if(!$fields){\r\n            JsonReturn(['code'=>1,'msg'=>'未找到字段！']);\r\n        }\r\n\r\n        $body = explode(',',$fields['body']);\r\n        $field = strtolower($body[1]);\r\n\r\n        $value = $this->frparam('value',1);\r\n        if($this->frparam('check')){\r\n\r\n            switch($fields['fieldtype']){\r\n                case 13:\r\n                    $molds = M('molds')->getField(['id'=>$body[0]],'biaoshi');\r\n                    if(!$molds){\r\n                        JsonReturn(['code'=>1,'msg'=>$field.JZLANG('字段关联绑定失败，请重新绑定！')]);\r\n                    }\r\n                    if($value){\r\n                        $lists = M($molds)->findAll(['id'=>$value],'id desc','id ,'.$field);\r\n                    }else{\r\n                        $lists = [];\r\n                    }\r\n\r\n                    foreach($lists as $k=>$v){\r\n                        $lists[$k]['value'] = $v['id'];\r\n                        $lists[$k]['name'] = $v[$field];\r\n                        $lists[$k]['selected'] = true;\r\n                    }\r\n                    JsonReturn(['code'=>0,'data'=>$lists]);\r\n\r\n                    break;\r\n\r\n                case 16:\r\n                    $molds = M('molds')->getField(['id'=>$body[0]],'biaoshi');\r\n                    if(!$molds){\r\n                        JsonReturn(['code'=>1,'msg'=>$field.JZLANG('字段关联绑定失败，请重新绑定！')]);\r\n                    }\r\n                    if($value){\r\n                        $ids = $value;\r\n                        $sql=\" id in(\".$ids.\") \";\r\n                        $lists = M($molds)->findAll($sql,'id desc','id ,'.$field);\r\n                    }else{\r\n                        $lists = [];\r\n                    }\r\n                    break;\r\n                case 20:\r\n                    $tid = (int)$body[0];\r\n                    $molds = $this->classtypedata[$tid]['molds'];\r\n                    if(!$molds){\r\n                        JsonReturn(['code'=>1,'msg'=>$field.JZLANG('字段关联绑定失败，请重新绑定！')]);\r\n                    }\r\n                    if($value){\r\n                        $ids = $value;\r\n                        $sql=\" id in(\".$ids.\") \";\r\n                        $lists = M($molds)->findAll($sql,'id desc','id ,'.$field);\r\n                    }else{\r\n                        $lists = [];\r\n                    }\r\n                    break;\r\n                case 21:\r\n\r\n                    $tid = (int)$body[0];\r\n                    $molds = $this->classtypedata[$tid]['molds'];\r\n                    if(!$molds){\r\n                        JsonReturn(['code'=>1,'msg'=>$field.JZLANG('字段关联绑定失败，请重新绑定！')]);\r\n                    }\r\n                    if($value){\r\n                        $tids = array_column($this->classtypedata[$tid]['children']['lists'],'id');\r\n                        $tids[]=$tid;\r\n                        if(in_array($molds,['orders','attr','page','member','member_group','level','level_group','message','comment'])){\r\n                            $sql = \" id=\".$value.\" \";\r\n                        }else{\r\n                            $sql = \" id=\".$value.\" and tid in(\".implode(',',$tids).\")\";\r\n                        }\r\n                        \r\n                        $lists = M($molds)->findAll(['id'=>$value],'id desc','id ,'.$field);\r\n                    }else{\r\n                        $lists = [];\r\n                    }\r\n\r\n                    break;\r\n\r\n            }\r\n            foreach($lists as $k=>$v){\r\n                $lists[$k]['value'] = $v['id'];\r\n                $lists[$k]['name'] = $v[$field];\r\n                $lists[$k]['selected'] = true;\r\n            }\r\n            JsonReturn(['code'=>0,'data'=>$lists]);\r\n\r\n\r\n\r\n        }\r\n\r\n        $key = $this->frparam('key',1);\r\n        if(!$key){\r\n           // JsonReturn(['code'=>1,'msg'=>'关键词错误！']);\r\n        }\r\n        switch($fields['fieldtype']){\r\n            case 13:\r\n            case 16:\r\n                $molds = M('molds')->getField(['id'=>$body[0]],'biaoshi');\r\n                if(!$molds){\r\n                    JsonReturn(['code'=>1,'msg'=>'关联绑定配置错误！']);\r\n                }\r\n                $sql = $key ? $field.\" like '%\".$key.\"%' and isshow=1\" : \"isshow=1\";\r\n                break;\r\n            case 20:\r\n            case 21:\r\n                $tid = (int)$body[0];\r\n                $molds = $this->classtypedata[$tid]['molds'];\r\n                $tids = array_column($this->classtypedata[$tid]['children']['lists'],'id');\r\n                $tids[]=$tid;\r\n                \r\n                if(in_array($molds,['orders','attr','page','member','member_group','level','level_group','message','comment'])){\r\n                    $sql = $key ? $field.\" like '%\".$key.\"%'  and isshow=1\" : \" isshow=1\";\r\n                }else{\r\n                    $sql = $key ? $field.\" like '%\".$key.\"%' and tid in(\".implode(',',$tids).\") and isshow=1\" : \"tid in(\".implode(',',$tids).\") and isshow=1\";\r\n                }\r\n\r\n                break;\r\n        }\r\n        $limit = $key ? null : 10;\r\n        $lists = M($molds)->findAll($sql,'id desc','id ,'.$field,$limit);\r\n\r\n        foreach($lists as $k=>$v){\r\n            $lists[$k]['value'] = $v['id'];\r\n            $lists[$k]['name'] = $v[$field];\r\n\r\n        }\r\n\r\n        JsonReturn(['code'=>0,'data'=>$lists]);\r\n    }\r\n\r\n\tfunction deleteFields(){\r\n\t\t$id = $this->frparam('id');\r\n\t\tif($id){\r\n\t\t\t\r\n\t\t\t$fields = M('fields')->find(array('id'=>$id));\r\n\t\t\t//不允许删除字段\r\n\t\t\t$noallow = ['addtime','updatetime','tags','orders','isshow','member_id','hits','target','ownurl','id','molds','htmlurl','jzattr','tids','tid','litpic','title','keywords','seo_title','body'];\r\n\t\t\tif(in_array($fields['field'],$noallow)){\r\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('系统字段不允许删除！')));\r\n\t\t\t}\r\n\t\t\tif(M('Fields')->delete('id='.$id)){\r\n\t\t\t\t$sql = \"ALTER TABLE \".DB_PREFIX.$fields['molds'].\" DROP COLUMN \".$fields['field'];\r\n\t\t\t\t$x = M()->runSql($sql);\r\n\t\t\t\t\r\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\r\n\t\t\t}else{\r\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\tfunction changeOrders(){\r\n\t\t\r\n\t\t$w['orders'] = $this->frparam('orders',0,0);\r\n\t\t$r = M('fields')->update(array('id'=>$this->frparam('id')),$w);\r\n\t\tif(!$r){\r\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\r\n\t\t}\r\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\r\n\t}\r\n\t\r\n\tfunction changeTid(){\r\n\t\t$ids = $this->frparam('data',1);\r\n\t\tif(!$ids){\r\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请选择字段！')]);\r\n\t\t}\r\n\t\t$tid = $this->frparam('tid');\r\n\t\tif(!$tid){\r\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请选择栏目！')]);\r\n\t\t}\r\n\t\t$sql = 'id in('.$ids.') ';\r\n\t\t$lists = M('fields')->findAll($sql);\r\n\t\tforeach($lists as $v){\r\n\t\t\tif(strpos($v['tids'],','.$tid.',')===false){\r\n\t\t\t\tif($v['tids']){\r\n\t\t\t\t\t$v['tids'] .= $tid.',';\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$v['tids'] = ','.$tid.',';\r\n\t\t\t\t}\r\n\t\t\t\tM('fields')->update(['id'=>$v['id']],['tids'=>$v['tids']]);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('操作成功！')]);\r\n\t}\r\n\r\n\tfunction editFieldsValue(){\r\n\t\t$field = $this->frparam('field',1);\r\n\t\t$w[$field] = $this->frparam('value',1);\r\n\t\t$r = M('fields')->update(array('id'=>$this->frparam('id')),$w);\r\n\t\tif(!$r){\r\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\r\n\t\t}\r\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\r\n\t}\r\n\r\n\tfunction fieldsList(){\r\n\t\t\r\n\t\tif(!$this->frparam('molds',1)){\r\n\t\t\tError(JZLANG('请选择模块！'));\r\n\t\t}\r\n\t\tif($this->frparam('ajax')){\r\n\r\n\t\t\t$data = M('fields')->findAll(array('molds'=>$this->frparam('molds',5)),'islist desc,listorders desc');\r\n\t\t\tforeach($data as &$v){\r\n\t\t\t\t$v['isadmin'] = $v['isadmin']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['isshow'] = $v['isshow']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['islist'] = $v['islist']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['issearch'] = $v['issearch']==1 ? JZLANG('显示') : JZLANG('隐藏');\r\n\t\t\t\t$v['ismust'] = $v['ismust']==1 ? JZLANG('是') : JZLANG('否');\r\n\t\t\t\t$v['isext'] = $v['isext']==1 ? JZLANG('是') : JZLANG('否');\r\n\t\t\t\tswitch($v['fieldtype']){\r\n\t\t\t\t\tcase 1:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单行文本');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 2:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多行文本');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 3:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('文本编辑器');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 4:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('数字');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 5:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单图片');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 6:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多图片');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 7:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单选下拉');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 8:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多选');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 9:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单附件');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 10:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多附件');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 11:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('时间戳');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 12:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单选按钮');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 13:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('单选关联');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 14:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('小数');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 15:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多行录入');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 16:\r\n\t\t\t\t\t$v['fieldtypename'] = JZLANG('多选关联');\r\n\t\t\t\t\tbreak;\r\n                    case 17:\r\n                    $v['fieldtypename'] = JZLANG('栏目');\r\n                    break;\r\n                    case 18:\r\n                    $v['fieldtypename'] = JZLANG('副栏目');\r\n                    break;\r\n\t\t\t\t\tcase 19:\r\n                    $v['fieldtypename'] = JZLANG('系统TAG');\r\n                    break;\r\n                    case 20:\r\n                        $v['fieldtypename'] = JZLANG('绑定栏目多选');\r\n                        break;\r\n                    case 21:\r\n                        $v['fieldtypename'] = JZLANG('绑定栏目单选');\r\n                        break;\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\r\n\t\t\t\t$v['edit_url'] = U('editFields',['id'=>$v['id']]);\r\n\t\t\t}\r\n\t\t\tJsonReturn(['code'=>0,'data'=>$data,'count'=>count($data)]);\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$this->frparam('molds',5)));\r\n\t\t\r\n\t\t$this->display('fields-list-show');\r\n\t}\r\n\t\r\n\tfunction changeFieldList(){\r\n\t\t$field = $this->frparam('field',1);\r\n\t\t$w[$field] = $this->frparam('value',1);\r\n\t\tif(in_array($field,['issearch','islist','width','listorders'])){\r\n\t\t\t$r = M('fields')->update(array('id'=>$this->frparam('id')),$w);\r\n\t\t\tif(!$r){\r\n\t\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\r\n\t\t\t}\r\n\t\t}else{\r\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('非法操作！')));\r\n\t\t}\r\n\t\t\r\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\r\n\t\t\r\n\t}\r\n\t\r\n\t\r\n}\r\n"
  },
  {
    "path": "app/admin/c/IndexController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\nclass IndexController extends CommonController\n{\n\tpublic function index(){\n\t\t$this->admin = $_SESSION['admin'];\n\t\t$desktop = M('Layout')->find(array('gid'=>$_SESSION['admin']['gid']));\n\t\tif(!$desktop){\n\t\t\t$desktop = M('Layout')->find(array('isdefault'=>1));\n\t\t}\n\t\t\n\t\t$this->left_layout = json_decode($desktop['left_layout'],true);\n\t\t$this->top_layout = json_decode($desktop['top_layout'],true);\n\t\t$this->top_num = count($this->top_layout);\n\t\t$rulers = M('Ruler')->findAll(array('isdesktop'=>1));\n\t\t$actions = array();\n\t\tforeach($rulers as $k=>$v){\n\t\t\t$actions[$v['id']] = $v;\n\t\t}\n\t\t$this->actions = $actions;\n\t\t$classnav = [];\n\t\tforeach($this->classtypetree as $v){\n\t\t\t$k = 'class_'.$v['id'];\n\t\t\tif($v['molds']=='page'){\n\t\t\t\t$v['act'] = U('classtype/editclass',['id'=>$v['id']]);\n\t\t\t}else if($v['molds']=='article'){\n\t\t\t\t$v['act'] = U('article/articlelist',['tid'=>$v['id']]);\n\t\t\t}else if($v['molds']=='product'){\n\t\t\t\t$v['act'] = U('product/productlist',['tid'=>$v['id']]);\n\t\t\t}else if($v['molds']=='message'){\n\t\t\t\t$v['act'] = U('message/messagelist',['tid'=>$v['id']]);\n\t\t\t}else{\n\t\t\t\t$v['act'] = U('extmolds/index',['molds'=>$v['molds'],'tid'=>$v['id']]);\n\t\t\t}\n\t\t\t$classnav[$k] = $v;\n\t\t}\n\t\t$this->classnav = $classnav;\n\t\t$this->display('index');\n\t}\n\tpublic function details(){\n\t\t$this->fields_biaoshi = 'level';\n\t\t$id = $this->admin['id'];\n\t\tif($this->frparam('go')==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'level');\n\t\t\t\n\t\t\t$data['gid'] = $this->frparam('gid',0,$this->admin['gid']);\n\t\t\t//防止越权操作\n\t\t\tif($this->admin['gid']!=1 && $data['gid']==1){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('您没有权限操作！')));\n\t\t\t}\n\t\t\t\n\t\t\t//检查token\n\t\t\t$token = getCache('admin_'.$this->admin['id'].'_token');\n\t\t\tif(!isset($_SESSION['token']) || !$token || $token!=$_SESSION['token']){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t\t}\n\t\t\t$data['email'] = $this->frparam('email',1);\n\t\t\t$data['pass'] = $this->frparam('pass',1);\n\t\t\t$data['repass'] = $this->frparam('repass',1);\n\t\t\t\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['tel'] = $this->frparam('tel',1);\n\t\t\t$data['status'] = $this->frparam('status');\n\t\t\t$data['id'] = $this->admin['id'];\n\t\t\tif($data['id']==0){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n            \n\t\t\tif($data['pass']!=''){\n\t\t\t\tif($data['pass']!=$data['repass']){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('两次密码不同！')));\n\t\t\t\t}\n\t\t\t\t$data['pass'] = md5(md5($data['pass']).'YF');\n\t\t\t}else{\n\t\t\t\tunset($data['pass']);\n\t\t\t}\n\n\t\t\t\n          \n           \n\t\t\t\n\t\t\tif($data['tel']!=''){\n\t\t\t\tif(M('level')->find(\"tel='\".$data['tel'].\"' and id!=\".$data['id'])){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('手机号已被注册！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(M('level')->find(\"name='\".$data['name'].\"' and id!=\".$data['id'])){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('昵称已被使用！')));\n\t\t\t}\n\t\t\tif($data['email']!=''){\n\t\t\t\tif(M('level')->find(\"email='\".$data['email'].\"' and id!=\".$data['id'])){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('邮箱已被使用！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$x = M('level')->update(array('id'=>$data['id']),$data);\n\t\t\tif($x){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t$this->member = M('level')->find('id='.$id);\n\t\tif($_SESSION['admin']['isadmin']==1){\n\t\t\t\n\t\t\t$this->isadmin = true;\n\t\t}else{\n\t\t\t$this->isadmin = false;\n\t\t}\n       \n        $this->groups = M('level_group')->findAll();\n\t\t$token = getRandChar(10);\n\t\t$_SESSION['token'] = $token;\n\t\tsetCache('admin_'.$this->admin['id'].'_token',$token);\n\t\t$this->token = $token;\n\t\t$this->display('admin');\n\t}\n\n\tpublic function welcome(){\n\t\t//var_dump($_SERVER);\n\t\t\n        $this->isadmin = $_SESSION['admin']['isadmin'];\n      \n\t\t//计算站内信息\n\t\t$member_count = M('member')->getCount();\n\t\t$this->member_count = $member_count;\n\t\t\n\t\t$this->article_num = M('article')->getCount();\n\t\t$this->product_num = M('product')->getCount();\n\t\t$this->message_num = M('message')->getCount();\n\t\tif(defined('TPL_PATH')){\n\t\t\t$path = TPL_PATH;\n\t\t}else{\n\t\t\t$path = APP_HOME;\n\t\t}\n\t\t$includefile = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.Tpl_template.'/custom.html');\n\t\tif(file_exists($includefile)){\n\t\t\t$this->display('custom');\n\t\t}else{\n\t\t\t$this->display('welcome');\n\t\t}\n\t}\n\t\n\tfunction beifen(){\n\t\t\n\t\t//读取备份数据库\n\t\t$dir = APP_PATH.'backup';\n\t\t$fileArray=array();\n\t\tif (false != ($handle = opendir ( $dir ))) {\n\t\t\t$i=0;\n\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\n\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\n\t\t\t\tif ($file != \".\" && $file != \"..\" && strpos($file,\".php\")!==false && strpos($file,\"_v\")===false) {\n\t\t\t\t\t$fileArray[$i]=$file;\n\t\t\t\t\t\n\t\t\t\t\t$i++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//关闭句柄\n\t\t\tclosedir ( $handle );\n\t\t}\n\t\t//var_dump($fileArray);\n\t\t$this->lists = $fileArray;\n\t\t$this->display('beifen');\n\t}\n\t\n\tfunction backup(){\n\t\t\n\t\t$pconfig = array(\n\t\t\t'host' =>DB_HOST,\n\t\t\t'port' =>DB_PORT,\n\t\t\t'user' =>DB_USER,\n\t\t\t'password' =>DB_PASS,\n\t\t\t'database' =>DB_NAME,\n            'prefix' =>DB_PREFIX,\n\t\t);\n\t\t$database = new \\DatabaseTool($pconfig);\n\n\t\t$database->backup();\n\t\t//$this->beifen();\n\t}\n\t\n\tfunction huanyuan(){\n\t\t$file = trim($this->frparam('file',1));\n\t\tif($file==''){\n\t\t\tError(JZLANG('非法操作！'));\n\t\t}\n\t\t\n\t\t$pconfig = array(\n\t\t\t'host' =>DB_HOST,\n\t\t\t'port' =>DB_PORT,\n\t\t\t'user' =>DB_USER,\n\t\t\t'password' =>DB_PASS,\n\t\t\t'database' =>DB_NAME\n\t\t);\n\t\t$database = new \\DatabaseTool($pconfig);\n\t\t$file = APP_PATH.'backup/'.$file;\n\t\t$database->restore($file);\n\t}\n\t\n\tfunction shanchu(){\n\t\t$file = trim($this->frparam('file',1));\n\t\tif($file==''){\n\t\t\tError(JZLANG('非法操作！'));\n\t\t}\n\t\t$f = explode('.php',$file);\n\t\t$filename = $f[0];\n\t\tif($filename==''){\n\t\t\tError(JZLANG('非法操作！'));\n\t\t}\n\t\t//读取备份数据库\n\t\t$dir = APP_PATH.'backup';\n\t\t$fileArray=array();\n\t\tif (false != ($handle = opendir ( $dir ))) {\n\t\t\t$i=0;\n\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\n\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\n\t\t\t\tif ($file != \".\" && $file != \"..\"&& strpos($file,$filename)!==false) {\n\t\t\t\t\tunlink(APP_PATH.'backup/'.$file);\n\t\t\t\t\t$i++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//关闭句柄\n\t\t\tclosedir ( $handle );\n\t\t}\n\t\t\n\t\tSuccess('删除成功！',U('beifen'));\n\t\t\n\t}\n\t\n\t//桌面设置\n\tfunction desktop(){\n\t\t$page = new Page('Layout');\n\t\t$sql = null;\n\n\t\t$data = $page->where($sql)->orderby('id ASC')->page($this->frparam('page',0,1))->go();\n\t\t$pages = $page->pageList();\n\t\t\n\t\t$this->pages = $pages;\n\t\t$this->lists = $data;\n\t\t$this->sum = $page->sum;\n\t\t$this->display('desktop');\n\t}\n\t\n\tfunction viewPower(){\n\t\t$rulers = M('ruler')->findAll(null,'id ASC');\n\t\t$ruler_top = array();\n\t\t$ruler_children = array();\n\t\tforeach($rulers as $v){\n\t\t\tif($v['pid']==0){\n\t\t\t\t$ruler_top[]=$v;\n\t\t\t}else{\n\t\t\t\t$ruler_children[$v['pid']][]=$v;\n\t\t\t}\n\t\t}\n\t\t$this->ruler_top = $ruler_top;\n\t\t$this->ruler_children = $ruler_children;\n\t\t$this->display('power-tree');\n\t}\n\t\n\tfunction getNav(){\n\t\t$ids = $this->frparam('ids',1);\n\t\t$idsArr = explode(',',$ids);\n\t\tif(!$ids || !count($idsArr)){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数有误！')]);\n\t\t}\n\t\t\n\t\tforeach($this->classtypetree as $v){\n\t\t\t$k = 'class_'.$v['id'];\n\t\t\t$classnav[$k] = $v;\n\t\t}\n\t\t$rulers = M('ruler')->findAll(null,'id ASC');\n\t\t$rulerArr = [];\n\t\tforeach($rulers as $v){\n\t\t\t$rulerArr[$v['id']] = $v;\n\t\t}\n\t\t$nav = [];\n\t\tforeach($idsArr as $v){\n\t\t\tif(strpos($v,'class')!==false){\n\t\t\t\t$nav[] = ['id'=>$v,'title'=>$classnav[$v]['classname']];\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$nav[] = ['id'=>$v,'title'=>$rulerArr[$v]['name']];\n\t\t\t}\n\t\t\t\n\t\t}\n\t\tJsonReturn(['code'=>0,'msg'=>'success','data'=>$nav]);\n\t\t\n\t\t\n\t}\n\t\n\tfunction desktop_add(){\n\t\tif($this->frparam('go')==1){\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t\n\t\t\t$leftNav = $this->frparam('leftNav',2);\n\t\t\t$topNav = $this->frparam('topNav',2);\n\t\t\t$left_layout = array();\n\t\t\t$top_layout = array();\n\t\t\tforeach($leftNav as $v){\n\t\t\t\tif($v['title'] && count($v['children'])>0){\n\t\t\t\t\t$left_layout[] = array('name'=>$v['title'],'icon'=>$v['icon'],'nav'=>$v['children']);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tforeach($topNav as $v){\n\t\t\t\tif($v['title'] && count($v['children'])>0){\n\t\t\t\t\t$top_layout[] = array('name'=>$v['title'],'icon'=>$v['icon'],'nav'=>$v['children']);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$data['left_layout'] = json_encode($left_layout,JSON_UNESCAPED_UNICODE);\n\t\t\t$data['top_layout'] = json_encode($top_layout,JSON_UNESCAPED_UNICODE);\n\t\t\t$data['gid'] = $this->frparam('gid');\n\t\t\t$data['isdefault'] = $this->frparam('isdefault');\n\t\t\t$data['ext'] = $this->frparam('ext',1);\n\t\t\t$n = M('Layout')->add($data);\n\t\t\tif($n){\n\t\t\t\tif($data['isdefault']==1){\n\t\t\t\t\tM('Layout')->update('id!='.$n,array('isdefault'=>0));\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败！')));\n\t\t\t\t\n\t\t\t}\n\t\t\texit;\n\t\t}\n\t\t$lists = M('Ruler')->findAll(null,'id asc');\n\t\t$lists = getTree($lists);\n\t\t$this->lists = $lists;\n\t\t$this->display('desktop-add');\n\t}\n\t\n\tfunction desktop_edit(){\n\t\t$id = $this->frparam('id');\n\t\tif(!$id){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('请选择桌面配置！')));\n\t\t}\n\t\tif($this->frparam('go')==1){\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t\n\t\t\t$leftNav = $this->frparam('leftNav',2);\n\t\t\t$topNav = $this->frparam('topNav',2);\n\t\t\t$left_layout = array();\n\t\t\t$top_layout = array();\n\t\t\tforeach($leftNav as $v){\n\t\t\t\tif($v['title'] && count($v['children'])>0){\n\t\t\t\t\t$left_layout[] = array('name'=>$v['title'],'icon'=>$v['icon'],'nav'=>$v['children']);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tforeach($topNav as $v){\n\t\t\t\tif($v['title'] && count($v['children'])>0){\n\t\t\t\t\t$top_layout[] = array('name'=>$v['title'],'icon'=>$v['icon'],'nav'=>$v['children']);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t$data['left_layout'] = json_encode($left_layout,JSON_UNESCAPED_UNICODE);\n\t\t\t$data['top_layout'] = json_encode($top_layout,JSON_UNESCAPED_UNICODE);\n\t\t\t$data['gid'] = $this->frparam('gid');\n\t\t\t$data['isdefault'] = $this->frparam('isdefault');\n\t\t\t$data['ext'] = $this->frparam('ext',1);\n\t\t\t$type = $this->frparam('type',1,'edit');\n\t\t\tif($type=='copy'){\n\t\t\t\tunset($data['id']);\n\t\t\t\t$n = M('Layout')->add($data);\n\t\t\t\tif($n){\n\t\t\t\t\tif($data['isdefault']==1){\n\t\t\t\t\t\tM('Layout')->update('id!='.$n,array('isdefault'=>0));\n\t\t\t\t\t}\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功！')));\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败！')));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t$n = M('Layout')->update(array('id'=>$id),$data);\n\t\t\t\tif($n){\n\t\t\t\t\tif($data['isdefault']==1){\n\t\t\t\t\t\tM('Layout')->update('id!='.$id,array('isdefault'=>0));\n\t\t\t\t\t}\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$data = M('Layout')->find(array('id'=>$id));\n\t\t$this->data = $data;\n\t\t$this->type = $this->frparam('type',1,'edit');\n\t\t$top_layout = json_decode($data['top_layout'],1);\n\t\t$left_layout = json_decode($data['left_layout'],1);\n\t\t$this->top_layout = $top_layout;\n\t\t$this->left_layout = $left_layout;\n\t\t$this->top_num = count($top_layout);\n\t\t$this->left_num = count($left_layout);\n\t\t$lists = M('Ruler')->findAll(null,'id asc');\n\t\t$rulers = [];\n\t\tforeach($lists as $v){\n\t\t\t$rulers[$v['id']] = $v;\n\t\t}\n\t\t$this->rulers = $rulers;\n\t\t\n\t\t\n\t\tforeach($this->classtypetree as $v){\n\t\t\t$k = 'class_'.$v['id'];\n\t\t\t$classnav[$k] = $v;\n\t\t}\n\t\t$this->classnav = $classnav;\n\t\t$this->display('desktop-edit');\n\t}\n\t\n\tfunction desktop_del(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t//判断是否系统\n\t\t\t$layout = M('Layout')->find(array('id'=>$id));\n\t\t\tif($layout['sys']==1){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('系统默认不可删除！')));\n\t\t\t}\n\t\t\tif(M('Layout')->delete('id='.$id)){\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\tfunction unicode(){\n\t\t$this->display('unicode');\n\t}\n\t\n\t //更新session的过期时间\n    function update_session_maxlifetime(){\n\t  $cache_time = SessionTime;\n\t  setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + $cache_time,'/',null,null,null,true);\n\t  \n    }\n\t//清空缓存\n\tfunction cleanCache(){\n\t\tif($_POST){\n\t\t\t\n\t\t\t$_SESSION['terminal'] = null;\n\t\t\t$cache =$this->frparam('cache_data',2);\n\t\t\tforeach($cache as $v){\n\t\t\t\tswitch($v){\n\t\t\t\t\tcase 'log':\n\t\t\t\t\tif(is_dir(APP_PATH.'cache/log')){\n\t\t\t\t\t\tif($handle = opendir(APP_PATH.'cache/log')){\n\t\t\t\n\t\t\t\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t\t\t\t if($file!='.' && $file!='..'){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tunlink(APP_PATH.'cache/log/'.$file);\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t  }\n\t\t\t\t\t\t  closedir($handle);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'image':\n\t\t\t\t\tif(is_dir(APP_PATH.'cache/image')){\n\t\t\t\t\t\tif($handle = opendir(APP_PATH.'cache/image')){\n\t\t\t\n\t\t\t\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t\t\t\t if($file!='.' && $file!='..'){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tunlink(APP_PATH.'cache/image/'.$file);\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t  }\n\t\t\t\t\t\t  closedir($handle);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'tpl':\n\t\t\t\t\tif(is_dir(APP_PATH.'cache')){\n\t\t\t\t\t\tif($handle = opendir(APP_PATH.'cache')){\n\t\t\t\n\t\t\t\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t\t\t\t if($file!='.' && $file!='..' && $file!='tmp' && $file!='log' && $file!='data'){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tunlink(APP_PATH.'cache/'.$file);\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t  }\n\t\t\t\t\t\t  closedir($handle);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'login':\n\t\t\t\t\tif(is_dir(APP_PATH.'cache/tmp')){\n\t\t\t\t\t\tif($handle = opendir(APP_PATH.'cache/tmp')){\n\t\t\t\n\t\t\t\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t\t\t\t if($file!='.' && $file!='..' && $file!='sess_'.$_COOKIE['PHPSESSID'] && $file!='.htaccess' && $file!='web.config'){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tunlink(APP_PATH.'cache/tmp/'.$file);\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t  }\n\t\t\t\t\t\t  closedir($handle);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'data':\n\t\t\t\t\t$ip = getCache(session_id());\n\t\t\t\t\tif(is_dir(APP_PATH.'cache/data')){\n\t\t\t\t\t\tif($handle = opendir(APP_PATH.'cache/data')){\n\t\t\t\n\t\t\t\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t\t\t\t if($file!='.' && $file!='..' ){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tunlink(APP_PATH.'cache/data/'.$file);\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t  }\n\t\t\t\t\t\t  closedir($handle);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$datacache = M('cachedata')->findAll();\n\t\t\t\t\tif($datacache){\n\t\t\t\t\t\tforeach($datacache as $v){\n\t\t\t\t\t\t\t$tid = $v['tid'] ? ($v['isall']==1 ? ' and tid in ('.implode(',',$this->classtypedata[$v['tid']]['children']['ids']).') ' : ' and tid='.$v['tid']) : '';\n\t\t\t\t\t\t\t$sqls = $v['sqls'] ? ' and '.$v['sqls'] : '';\n\t\t\t\t\t\t\t$orderby = $v['orders'] ? ' order by '.$v['orders'] : '';\n\t\t\t\t\t\t\t$limit = $v['limits'] ? ' limit '.$v['limits'] : '';\n\t\t\t\t\t\t\tif($tid || $sqls){\n\t\t\t\t\t\t\t\t$where = ' where 1=1 '.$tid.htmlspecialchars_decode($sqls,ENT_QUOTES);\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t$where = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$sql = \"select * from \".DB_PREFIX.$v['molds'].$where.$orderby.$limit;\n\t\t\t\t\t\t\t$result = M()->findSql($sql);\n\t\t\t\t\t\t\tif($result){\n\t\t\t\t\t\t\t\tforeach($result as $kk=>$vv){\n\t\t\t\t\t\t\t\t\tif(isset($vv['htmlurl'])){\n\t\t\t\t\t\t\t\t\t\t$result[$kk]['url'] = gourl($vv,$vv['htmlurl']);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$time = $v['times']*60;\n\t\t\t\t\t\t\tsetCache('jzcache_'.$v['field'],$result,$time);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tsetCache(session_id(),$ip);\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'pc_html':\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\tJsonReturn(['code'=>0,'msg'=>'success']);\n\t\t\t\n\t\t\t\n\t\t}\n\t\t//计算缓存数据大小\n\t\t$datacache = 0;\n\t\tif(is_dir(APP_PATH.'cache/data')){\n\t\t\tif($handle = opendir(APP_PATH.'cache/data')){\n\t\t\t\n\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t if($file!='.' && $file!='..'){\n\t\t\t\t\t\n\t\t\t\t\t $datacache+=round(filesize(APP_PATH.'cache/data/'.$file)/1024,2);\n\t\t\t\t }\n\t\t\t  }\n\t\t\t  closedir($handle);\n\t\t\t}\n\t\t}\n\t\t//登录缓存\n\t\t$logincache = 0;\n\t\tif(is_dir(APP_PATH.'cache/tmp')){\n\t\t\tif($handle = opendir(APP_PATH.'cache/tmp')){\n\t\t\t\n\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t if($file!='.' && $file!='..' && $file!='.htaccess' && $file!='web.config'){\n\t\t\t\t\t $logincache+=round(filesize(APP_PATH.'cache/tmp/'.$file)/1024,2);\n\t\t\t\t }\n\t\t\t  }\n\t\t\t  closedir($handle);\n\t\t\t}\n\t\t}\n\t\t//日志缓存\n\t\t$logcache = 0;\n\t\tif(is_dir(APP_PATH.'cache/log')){\n\t\t\tif($handle = opendir(APP_PATH.'cache/log')){\n\t\t\t\n\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t if($file!='.' && $file!='..'){\n\t\t\t\t\t $logcache+=round(filesize(APP_PATH.'cache/log/'.$file)/1024,2);\n\t\t\t\t }\n\t\t\t  }\n\t\t\t  closedir($handle);\n\t\t\t}\t\n\t\t}\n\t\t\n\t\t//缩略图缓存\n\t\t$imagecache = 0;\n\t\tif(is_dir(APP_PATH.'cache/image')){\n\t\t\tif($handle = opendir(APP_PATH.'cache/image')){\n\t\t\t\n\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t if($file!='.' && $file!='..'){\n\t\t\t\t\t $imagecache+=round(filesize(APP_PATH.'cache/image/'.$file)/1024,2);\n\t\t\t\t }\n\t\t\t  }\n\t\t\t  closedir($handle);\n\t\t\t}\t\n\t\t}\n\t\t\n\t\t//模板缓存\n\t\t$tplcache = 0;\n\t\tif(is_dir(APP_PATH.'cache')){\n\t\t\tif($handle = opendir(APP_PATH.'cache')){\n\t\t\t\n\t\t\t  while (false !== ($file = readdir($handle))){\n\t\t\t\t if($file!='.' && $file!='..' && $file!='tmp' && $file!='log' && $file!='data'){\n\t\t\t\t\t $tplcache+=round(filesize(APP_PATH.'cache/'.$file)/1024,2);\n\t\t\t\t }\n\t\t\t  }\n\t\t\t  closedir($handle);\n\t\t\t}\n\t\t}\n\t\t$this->datacache = $datacache;\n\t\t$this->imagecache = $imagecache;\n\t\t$this->logcache = $logcache;\n\t\t$this->tplcache = $tplcache;\n\t\t$this->logincache = $logincache;\n\t\t$this->display('cache');\n\t\t\n\t\t\n\t}\n\n\t//模板标签生成\n\tfunction showlabel(){\n\t\t\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->display('showlabel');\n\t}\n\t\n\t//网站地图XML\n    function sitemap(){\n        $cachedata = getCache('sitemapdata');\n        if($_POST || $cachedata){\n            if($_POST){\n                $sitemap_config = [\n                    'page_size'=>$this->frparam('page_size'),\n                    'tagsurl'=>$this->frparam('tagsurl',1),\n                    'filetype'=>$this->frparam('filetype',1),\n                ];\n                $str = serialize($sitemap_config);\n                M('sysconfig')->update(['field'=>'sitemap_config'],['data'=>$str]);\n                setCache('webconfig',null);\n            }\n            $model = !$cachedata ? $this->frparam('model',2) : $cachedata['model'];\n            $isshow = !$cachedata ? $this->frparam('isshow',2) : $cachedata['isshow'];\n            $freq = !$cachedata ? $this->frparam('freq',2) : $cachedata['frep'];\n            $priority = !$cachedata ? $this->frparam('priority',2) : $cachedata['priority'];\n            $www = ($this->webconf['domain']=='') ? get_domain() : $this->webconf['domain'];\n            $number = !$cachedata ? $this->frparam('page_size',0,10000) : $cachedata['page_size'];\n            $filetype = !$cachedata ? $this->frparam('filetype',1,'xml') : $cachedata['filetype'];\n            $tagsurl = !$cachedata ? $this->frparam('tagsurl',1) : $cachedata['tagsurl'];\n            if($filetype=='xml'){\n                $l_pre = '<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">';\n                //首页\n                $l_pre.='<url>\n<loc>'.$www.'/</loc>\n<lastmod>'.date('Y-m-d\\TH:i:sP', time()).'</lastmod>\n<changefreq>always</changefreq>\n<priority>1.00</priority>\n</url>';\t\t$l_next = '</urlset>';\n            }else{\n                $l_pre = $www.\"\\n\";\n                $l_next = '';\n            }\n            \n            \n            $l_pc = getCache('l_pc') ? getCache('l_pc') : '';\n            $l_mobile = getCache('l_mobile') ? getCache('l_mobile') : '';\n            $classtypedataMobile = classTypeDataMobile();\n            $classtypedataMobile = getclasstypedata($classtypedataMobile,1);\n            $num = 0;//统计数量\n            $page = !$cachedata ? 1 : $cachedata['page'];\n            $pre = ($page-1)*$number;\n            $limit = $pre.','.$number;//每页sitemap最大条数为1000\n            $isover = 1;//是否结束\n            $sitemap_page = !$cachedata ? 1 : $cachedata['sitemap_page'];\n            $sitemap_xml = !$cachedata ? [] : $cachedata['sitemap_xml'];\n            if($cachedata){\n                echo JZLANG('正在创建sitemap，请勿关闭浏览器！').'<br>';\n            }\n            $urls = [];\n            foreach($model as $k=>$v){\n                if($v=='classtype'){\n                    if($isshow[$k]==1){\n                        $list = M($v)->findAll(['isshow'=>1],null,'id',$limit);\n                    }else{\n                        $list = M($v)->findAll(null,null,'id',$limit);\n                    }\n                }else if($v=='tags'){\n                    if($isshow[$k]==1){\n                        $list = M($v)->findAll(['isshow'=>1],null,'id,molds,htmlurl,ownurl,target,addtime,keywords',$limit);\n                    }else{\n                        $list = M($v)->findAll(null,null,'id,molds,htmlurl,target,addtime,keywords',$limit);\n                    }\n                }else{\n                    if($isshow[$k]==1){\n                        $list = M($v)->findAll(['isshow'=>1],null,'id,molds,htmlurl,ownurl,target,addtime',$limit);\n                    }else{\n                        $list = M($v)->findAll(null,null,'id,molds,htmlurl,target,addtime',$limit);\n                    }\n                }\n                if(!$list){\n                    \n                    continue;\n                }\n                if($v=='classtype'){\n                    foreach($list as $s){\n                        if($this->classtypedata[$s['id']]['url']){\n                            if($cachedata){\n                                echo $this->classtypedata[$s['id']]['url'].'<br>';\n                            }\n                            if($filetype=='xml'){\n                                $l_pc.='<url>\n\t\t\t\t\t\t\t\t  <loc>'.$this->classtypedata[$s['id']]['url'].'</loc>\n\t\t\t\t\t\t\t\t  <lastmod>'.date('Y-m-d\\TH:i:sP', $s['updatetime'] ?? time()).'</lastmod>\n\t\t\t\t\t\t\t\t  <changefreq>'.$freq[$k].'</changefreq>\n\t\t\t\t\t\t\t\t  <priority>'.$priority[$k].'</priority>\n\t\t\t\t\t\t\t\t</url>';\n                                if($this->webconf['iswap']==1){\n                                    $l_mobile.='<url>\n\t\t\t\t\t\t\t\t\t  <loc>'.$classtypedataMobile[$s['id']]['url'].'</loc>\n\t\t\t\t\t\t\t\t\t  <lastmod>'.date('Y-m-d\\TH:i:sP', $s['updatetime'] ?? time()).'</lastmod>\n\t\t\t\t\t\t\t\t\t  <changefreq>'.$freq[$k].'</changefreq>\n\t\t\t\t\t\t\t\t\t  <priority>'.$priority[$k].'</priority>\n\t\t\t\t\t\t\t\t\t</url>';\n                                    if($cachedata){\n                                        echo $classtypedataMobile[$s['id']]['url'].'<br>';\n                                    }\n                                }\n                            }else{\n                                $l_pc.=$this->classtypedata[$s['id']]['url'].\"\\n\";\n                                if($this->webconf['iswap']==1){\n                                    $l_mobile.=$classtypedataMobile[$s['id']]['url'].\"\\n\";\n                                    if($cachedata){\n                                        echo $classtypedataMobile[$s['id']]['url'].'<br>';\n                                    }\n                                }\n                            }\n                            \n                            \n                            $num+=1;\n                            if($num>=$number){\n                                $l = $l_pre.$l_pc.$l_next;\n                                $l_m = $l_pre.$l_mobile.$l_next;\n                                $name = $sitemap_page==1 ? 'sitemap.'.$filetype : 'sitemap'.$sitemap_page.'.'.$filetype;\n                                $name_m = $sitemap_page==1 ? 'mobile_sitemap.'.$filetype : 'mobile_sitemap'.$sitemap_page.'.'.$filetype;\n                                $n = file_put_contents(APP_PATH.$name,$l);\n                                if(!$n){\n                                    JsonReturn(['code'=>1,'msg'=>JZLANG('网站地图创建失败，请检查根目录权限！'.$name)]);\n                                }\n                                if($cachedata){\n                                    echo $name.JZLANG('创建成功！').'<br>';\n                                }\n                                $_pc = '';\n                                if($this->webconf['iswap']==1){\n                                    $m = file_put_contents(APP_PATH.$name_m,$l_m);\n                                    if(!$m){\n                                        JsonReturn(['code'=>1,'msg'=>JZLANG('网站地图创建失败，请检查根目录权限！'.$name_m)]);\n                                    }\n                                    $sitemap_xml[]=$name_m;//记录生成的xml页面\n                                    if($cachedata){\n                                        echo $name_m.JZLANG('创建成功！').'<br>';\n                                    }\n                                    $l_mobile = '';\n                                }\n                                \n                                $sitemap_page+=1;//分页+1\n                                $num=0;//重置数量\n                                $sitemap_xml[]=$name;\n                                \n                                $isover = 0;//只要有一个模块大于1500，说明就需要再次执行生成sitemap程序\n                                \n                            }\n                            \n                            \n                        }\n                    }\n                    \n                }else{\n                    \n                    foreach($list as $s){\n                        $s['addtime'] = (isset($s['addtime']) && $s['addtime']!=0) ? $s['addtime'] : time();\n                        $url = $s['molds']=='tags' ? $www.str_replace(['{keywords}','{id}'],[$s['keywords'],$s['id']],$tagsurl) :gourl($s);\n                        if($url){\n                            if($filetype=='xml'){\n                                $l_pc.='<url>\n\t\t\t\t\t\t\t  <loc>'.$url.'</loc>\n\t\t\t\t\t\t\t  <lastmod>'.date('Y-m-d\\TH:i:sP', $s['updatetime'] ?? time()).'</lastmod>\n\t\t\t\t\t\t\t  <changefreq>'.$freq[$k].'</changefreq>\n\t\t\t\t\t\t\t  <priority>'.$priority[$k].'</priority>\n\t\t\t\t\t\t\t</url>';\n                            }else{\n                                $l_pc.=$url.\"\\n\";\n                            }\n                            \n                            if($cachedata){\n                                echo $url.'<br>';\n                            }\n                            if($this->webconf['iswap']==1){\n                                $murl = $s['molds']=='tags' ? $www.str_replace(['{keywords}','{id}'],[$s['keywords'],$s['id']],$tagsurl) : $this->murl($s);\n                                if($murl){\n                                    if($filetype=='xml'){\n                                        $l_mobile.='<url>\n\t\t\t\t\t\t\t\t\t  <loc>'.$murl.'</loc>\n\t\t\t\t\t\t\t\t\t  <lastmod>'.date('Y-m-d\\TH:i:sP', $s['updatetime'] ?? time()).'</lastmod>\n\t\t\t\t\t\t\t\t\t  <changefreq>'.$freq[$k].'</changefreq>\n\t\t\t\t\t\t\t\t\t  <priority>'.$priority[$k].'</priority>\n\t\t\t\t\t\t\t\t\t</url>';\n                                    }else{\n                                        $l_mobile.=$murl.\"\\n\";\n                                    }\n                                    \n                                    if($cachedata){\n                                        echo $murl.'<br>';\n                                    }\n                                }\n                                \n                            }\n                            $num+=1;\n                            if($num>=$number){\n                                $l = $l_pre.$l_pc.$l_next;\n                                $l_m = $l_pre.$l_mobile.$l_next;\n                                $name = $sitemap_page==1 ? 'sitemap.'.$filetype : 'sitemap'.$sitemap_page.'.'.$filetype;\n                                $name_m = $sitemap_page==1 ? 'mobile_sitemap.'.$filetype : 'mobile_sitemap'.$sitemap_page.'.'.$filetype;\n                                $n = file_put_contents(APP_PATH.$name,$l);\n                                if(!$n){\n                                    JsonReturn(['code'=>1,'msg'=>JZLANG('网站地图创建失败，请检查根目录权限！'.$name)]);\n                                }\n                                if($cachedata){\n                                    echo $name.JZLANG('创建成功！').'<br>';\n                                }\n                                $l_pc = '';\n                                if($this->webconf['iswap']==1){\n                                    $m = file_put_contents(APP_PATH.$name_m,$l_m);\n                                    if(!$m){\n                                        JsonReturn(['code'=>1,'msg'=>JZLANG('网站地图创建失败，请检查根目录权限！'.$name_m)]);\n                                    }\n                                    $sitemap_xml[]=$name_m;//记录生成的xml页面\n                                    if($cachedata){\n                                        echo $name_m.JZLANG('创建成功！').'<br>';\n                                    }\n                                    $l_mobile = '';\n                                }\n                                \n                                $sitemap_page+=1;//分页+1\n                                $num=0;//重置数量\n                                $sitemap_xml[]=$name;\n                                \n                                $isover = 0;//只要有一个模块大于1500，说明就需要再次执行生成sitemap程序\n                                \n                            }\n                            \n                            \n                        }\n                        \n                        \n                        \n                    }\n                    \n                }\n                \n                \n            }\n            \n            \n            if(!$isover){\n                \n                //记录相关数据\n                $cdata['model'] = $model;\n                $cdata['isshow'] = $isshow;\n                $cdata['freq'] = $freq;\n                $cdata['priority'] = $priority;\n                $cdata['page'] = $page+1;\n                $cdata['sitemap_page'] = $sitemap_page;\n                $cdata['sitemap_xml'] = $sitemap_xml;\n                $cdata['filetype'] = $filetype;\n                $cdata['page_size'] = $number;\n                $cdata['tagsurl'] = $tagsurl;\n                setCache('sitemapdata',$cdata);\n                setCache('l_pc',$l_pc);\n                setCache('l_mobile',$l_mobile);\n                if(!$cachedata){\n                    JsonReturn(['code'=>2,'msg'=>JZLANG('网站地图正在创建，请勿关闭浏览器！')]);\n                }else{\n                    Redirect(U('index/sitemap'),JZLANG('网站地图正在创建，请勿关闭浏览器！'),2);\n                }\n                \n            }else{\n                //已更新完毕\n                if($l_pc){\n                    $l = $l_pre.$l_pc.$l_next;\n                    $name = $sitemap_page==1 ? 'sitemap.'.$filetype : 'sitemap'.$sitemap_page.'.'.$filetype;\n                    $n = file_put_contents(APP_PATH.$name,$l);\n                    if(!$n){\n                        JsonReturn(['code'=>1,'msg'=>JZLANG('网站地图创建失败，请检查根目录权限！'.$name)]);\n                    }\n                    \n                    $sitemap_xml[]=$name;\n                    if($cachedata){\n                        echo $name.JZLANG('创建成功！').'<br>';\n                    }\n                    $l_pc = '';\n                }\n                if($l_mobile){\n                    $l_m = $l_pre.$l_mobile.$l_next;\n                    $name_m = $sitemap_page==1 ? 'mobile_sitemap.'.$filetype : 'mobile_sitemap'.$sitemap_page.'.'.$filetype;\n                    \n                    if($this->webconf['iswap']==1){\n                        $m = file_put_contents(APP_PATH.$name_m,$l_m);\n                        if(!$m){\n                            JsonReturn(['code'=>1,'msg'=>JZLANG('网站地图创建失败，请检查根目录权限！'.$name_m)]);\n                        }\n                        $sitemap_xml[]=$name_m;//记录生成的xml页面\n                        if($cachedata){\n                            echo $name_m.JZLANG('创建成功！').'<br>';\n                        }\n                    }\n                    $l_mobile = '';\n                    \n                }\n                \n                setCache('l_pc',null);\n                setCache('l_mobile',null);\n                setCache('sitemapdata',null);\n                if($cachedata){\n                    echo JZLANG('已生成的网站'.$filetype.'文件如下：').'<br>';\n                    foreach($sitemap_xml as $v){\n                        echo get_domain().'/'.$v.'<br>';\n                    }\n                    exit;\n                }\n            }\n            \n            if(!$cachedata){\n                JsonReturn(['code'=>0,'msg'=>JZLANG('网站地图创建成功！')]);\n            }\n            \n            \n            \n            \n        }\n        $sitemap_config = $this->webconf['sitemap_config'] ?? '';\n        if($sitemap_config){\n            $sitemap_config = unserialize($sitemap_config);\n        }else{\n            $sitemap_config = [\n                'page_size'=>10000,\n                'tagsurl'=>'/tags/index?id={id}',\n                'filetype'=>'xml',\n            ];\n        }\n        $this->sitemap_conf = $sitemap_config;\n        $this->display('sitemap');\n    }\n    \n    function murl($id,$htmlurl=null,$molds='article'){\n\t    $www = get_domain();\n\t\tif(is_array($id)){\n\t\t\t$value = $id;\n\t\t\tif($value['target']){\n\t\t\t\treturn $value['target'];\n\t\t\t}else{\n\t\t\t\tif($value['ownurl']){\n\t\t\t\t\treturn $www.'/'.$value['ownurl'];\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t$id = $value['id'];\n\t\t}\n\t\tif(!$id){Error_msg('缺少ID！');}\n\t\t$htmlpath = $this->webconf['iswap']==1 ? $this->webconf['mobile_html'] : $this->webconf['pc_html'];\n\t\t$htmlpath = ($htmlpath=='' || $htmlpath=='/') ? '' : '/'.$htmlpath; \n\t\tif($htmlurl!=null){\n\t\t\treturn $www.$htmlpath.'/'.$htmlurl.'/'.$id.'.html';\n\t\t}\n\t\t\n\t\t$tid = M($molds)->getField(array('id'=>$id),'tid');\n\t\t$htmlurl = M('classtype')->getField(array('id'=>$tid),'htmlurl');\n\t\treturn $www.$htmlpath.'/'.$htmlurl.'/'.$id.'.html';\n\t}\n\t\n\t//生成静态文件\n\tfunction tohtml(){\n\t\t\n\t\t$maxlimit = 500;\n\t\t$sleep = 2;//最小填0，立即跳转。\n\t\tif($_POST){\n\t\t\t$_SESSION['terminal'] = $this->frparam('terminal',1,'pc');\n\t\t\t$terminal_path = $_SESSION['terminal']=='pc' ? $this->webconf['pc_html'] : $this->webconf['mobile_html'];\n\t\t\t$terminal_path = ($terminal_path=='' || $terminal_path=='/') ? '' : $terminal_path.'/';\n\t\t\t\n\t\t\t$type = $this->frparam('type');\n\t\t\tsetCache('tohtmlurl',null);\n\t\t\tif($this->frparam('clearhtml')){\n\t\t\t\tsetCache('clearhtml',1);\n\t\t\t}\n\n\t\t\t$classtypedata = $this->classtypedata;\n\n\t\t\t//echo '提交成功！';\n\t\t\tif($type==1){\n\t\t\t\t//有选择的更新HTML\n\t\t\t\t$model = $this->frparam('model',1);\n\t\t\t\t$isshow = $this->frparam('isshow');\n\t\t\t\t$tid = $this->frparam('tid');\n\t\t\t\t$www = get_domain();\n\t\t\t\t$sql = ' 1=1 ';\n\t\t\t\tif($isshow!=2){\n\t\t\t\t\t$sql.=' and isshow=1 ';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//单独更新\n\t\t\t\t$modelname = get_info_table('molds',['biaoshi'=>$model],'name');\n\t\t\t\t$urls = [];\n\t\t\t\tswitch($model){\n\t\t\t\t\tcase 'classtype':\n\t\t\t\t\t\tif($tid){\n\t\t\t\t\t\t\t$sql.=' and id in('.implode(\",\",$classtypedata[$tid][\"children\"][\"ids\"]).') ';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t$urls = $this->html_classtype($sql);//获取所有的更新静态链接\n\t\t\t\t\t\t$urls[]= ['url'=>$www,'html'=>APP_PATH.$terminal_path.'index.html'];\n\t\t\t\t\t\t\n\t\t\t\t\t\tsetCache('tohtmlurl',$urls,86400);\n\t\t\t\t\t\t//$_SESSION['terminal'] = null;\n\t\t\t\t\t\t\n\t\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>'success']);\n\t\t\t\t\tbreak;\n\t\t\t\t\t//文章商品模块是同样的\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif($tid){\n\t\t\t\t\t\t\t$sql.=' and tid in('.implode(\",\",$classtypedata[$tid][\"children\"][\"ids\"]).') ' ;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t$urls = $this->html_molds($model,$sql);\n\t\t\t\t\t\t$urls[]= ['url'=>$www,'html'=>APP_PATH.$terminal_path.'index.html'];\n\t\t\t\t\t\tsetCache('tohtmlurl',$urls,86400);\n\t\t\t\t\t\t\n\t\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>'success']);\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t//批量更新\n\t\t\t\t//以防内容过多，更新不过来\n\t\t\t\t$model = $this->frparam('model',2);\n\t\t\t\t$isshow = $this->frparam('isshow',2);\n\t\t\t\t$tid = $this->frparam('tid',2);\n\t\t\t\t$www = get_domain();\n\t\t\t\tset_time_limit(0);\n\t\t\t\tif($model && $isshow){\n\t\t\t\t\t$urls = [];\n\t\t\t\t\tforeach($model as $k=>$v){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$sql = ' 1=1 ';\n\t\t\t\t\t\tif($isshow[$k]!=2){\n\t\t\t\t\t\t\t$sql.=' and isshow=1 ';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\tif($v=='classtype'){\n\t\t\t\t\t\t\tif($tid[$k]){\n\t\t\t\t\t\t\t\t$sql.=' and id in('.implode(\",\",$classtypedata[$tid[$k]][\"children\"][\"ids\"]).') ';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t$urls1 = $this->html_classtype($sql);\n\t\t\t\t\t\t\t$urls = count($urls1)>0 ? array_merge($urls,$urls1) : $urls;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tif($tid[$k]){\n\t\t\t\t\t\t\t\t$sql.=' and tid in('.implode(\",\",$classtypedata[$tid[$k]][\"children\"][\"ids\"]).') ';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t$urls2 = $this->html_molds($v,$sql);\n\t\t\t\t\t\t\t$urls = count($urls2)>0 ? array_merge($urls,$urls2) : $urls;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t$urls[]= ['url'=>$www,'html'=>APP_PATH.$terminal_path.'index.html'];\n\t\t\t\t\tsetCache('tohtmlurl',$urls,86400);\n\t\t\t\t\t\n\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>'success','urls'=>$urls]);\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\n\n\t\t$tohtmlurl = getCache('tohtmlurl');\n\n\t\tif($tohtmlurl){\n\n\t\t\t$clearhtml = getCache('clearhtml');\n\n\t\t\t\n\t\t\t$max = count($tohtmlurl);\n\t\t\t$start_time = getCache('start_time');\n\t\t\tif(!$start_time){\n\t\t\t\t$start_time = time();\n\t\t\t\tsetCache('start_time',$start_time,86400);\n\t\t\t\tsetCache('allpage',$max);\n\t\t\t}\n\n\t\t\t$count = 0;\n\t\t\tforeach ($tohtmlurl as $key => $value) {\n\t\t\t\tif($key<$maxlimit){\n\t\t\t\t\tif($clearhtml){\n\n\t\t\t\t\t\t//清理HTML\n\t\t\t\t\t\tif(file_exists($value['html'])){\n\t\t\t\t\t\t\t$r = unlink($value['html']);\n\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\techo $value['html'].JZLANG('清除失败！').'<br/>';\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\techo $value['html'].JZLANG('清除成功！').'<br/>';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\techo $value['html'].JZLANG('清除成功！').'<br/>';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\n\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif($_SESSION['terminal']=='pc'){\n\t\t\t\t\t\t\t$data = curl_http($value['url']);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$data = $this->mhtml($value['url']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t$f = @fopen($value['html'],'w');\n\t\t\t\t\t\t$r = @fwrite($f,$data);\n\t\t\t\t\t\t@fclose($f);\n\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\techo $value['html'].JZLANG('生成失败！').'<br/>';\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\techo $value['html'].JZLANG('生成成功！').'<br/>';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t\t$count++;\n\t\t\t\t}else{\n\t\t\t\t\t$tohtmlurl = array_slice($tohtmlurl,$maxlimit);\n\t\t\t\t\tsetCache('tohtmlurl',$tohtmlurl,86400);\n\t\t\t\t\tif($clearhtml){\n\t\t\t\t\t\techo JZLANG('已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~');\n\t\t\t\t\t}else{\n\t\t\t\t\t\techo JZLANG('已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\techo '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><meta http-equiv=\"refresh\" content=\"'.$sleep.';URL='.U('tohtml').'\">';\n\t\t\t\t\texit;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tif($count>=$max){\n\t\t\t\tsetCache('tohtmlurl',false);\n\t\t\t\tif($clearhtml){\n\t\t\t\t\t\n\t\t\t\t\t$terminal_path = $_SESSION['terminal']=='pc' ? $this->webconf['pc_html'] : $this->webconf['mobile_html'];\n\t\t\t\t\t$terminal_path = ($terminal_path=='' || $terminal_path=='/') ? '' : $terminal_path.'/';\n\t\t\t\t\t$notpath = ['/','a','public','home','frphp','cache','conf','backup','static'];\n\t\t\t\t\tforeach($this->classtypedata as $vv){\n\t\t\t\t\t\t$path = strtolower($vv['htmlurl']);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($vv['htmlurl'] && !in_array($path,$notpath) && strpos($path,'.')===false){\n\t\t\t\t\t\t\t$this->removeDir(APP_PATH.$terminal_path.$vv['htmlurl']);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t//检查分页\n\t\t\t\t\t\t\t$sql = 'tid in('.implode(\",\",$this->classtypedata[$vv['id']][\"children\"][\"ids\"]).') ';\n\t\t\t\t\t\t\t$count = M($vv['molds'])->getCount($sql);\n\t\t\t\t\t\t\t$pagenum = ceil($count/$vv['lists_num']);\n\t\t\t\t\t\t\tif($pagenum>1){\n\t\t\t\t\t\t\t\tfor($i=1;$i<=$pagenum;$i++){\n\t\t\t\t\t\t\t\t\t$filename = $vv['htmlurl'].'-'.$i;\n\t\t\t\t\t\t\t\t\tif(file_exists(APP_PATH.$terminal_path.$filename)){\n\t\t\t\t\t\t\t\t\t\trmdir(APP_PATH.$terminal_path.$filename);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\techo JZLANG('静态HTML页面已全部清理完毕！').'<br/>';\n\t\t\t\t\t$end_time = time();\n\t\t\t\t\t$start_time = getCache('start_time');\n\t\t\t\t\t$allpage = getCache('allpage');\n\t\t\t\t\techo JZLANG('总共清理页面数：').$allpage.' '.JZLANG('每次清理页面数：').$maxlimit.','.JZLANG('停顿时间：').$sleep.'s,'.JZLANG('开始时间：').date('Y-m-d H:i:s',$start_time).' ,'.JZLANG('结束时间：').date('Y-m-d H:i:s',$end_time).', '.JZLANG('总共花费时间：').($end_time-$start_time).'s';\n\t\t\t\t\tsetCache('clearhtml',false);\n\t\t\t\t}else{\n\t\t\t\t\techo '页面已全部生成完毕！<br/>';\n\t\t\t\t\t$end_time = time();\n\t\t\t\t\t$start_time = getCache('start_time');\n\t\t\t\t\t$allpage = getCache('allpage');\n\t\t\t\t\techo JZLANG('总共生成页面数：').$allpage.' '.JZLANG('每次生成页面数：').$maxlimit.','.JZLANG('停顿时间：').$sleep.'s,'.JZLANG('开始时间：').date('Y-m-d H:i:s',$start_time).' ,'.JZLANG('结束时间：').date('Y-m-d H:i:s',$end_time).', '.JZLANG('总共花费时间：').($end_time-$start_time).'s';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsetCache('start_time',false);\n\t\t\t\tsetCache('allpage',false);\n\t\t\t\t$_SESSION['terminal'] = null;\n\t\t\t\t//echo '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><meta http-equiv=\"refresh\" content=\"2;URL='.U('tohtml').'\">';\n\t\t\t\texit;\n\t\t\t}else{\n\n\t\t\t}\n\t\t\t\n\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t$this->display('tohtml');\n\t}\n\t\n\tfunction removeDir($dirName) \n\t{ \n\t\tif(! is_dir($dirName)) \n\t\t{ \n\t\t\treturn false; \n\t\t} \n\t\t$handle = @opendir($dirName); \n\t\twhile(($file = @readdir($handle)) !== false) \n\t\t{ \n\t\t\tif($file != '.' && $file != '..') \n\t\t\t{ \n\t\t\t\t$dir = $dirName . '/' . $file; \n\t\t\t\tis_dir($dir) ? $this->removeDir($dir) : @unlink($dir); \n\t\t\t} \n\t\t} \n\t\tclosedir($handle); \n\t\t  \n\t\treturn rmdir($dirName) ; \n\t} \n\tfunction mhtml($url){\n\t\t$ch = curl_init();\n        curl_setopt($ch,CURLOPT_URL,$url);\n        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);\n        if (strpos($url, 'https://') !== false) {\n            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        }\n        $h=array('User-Agent:Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',\n        'HTTP_ACCEPT:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n        curl_setopt($ch,CURLOPT_HTTPHEADER,$h);\n        $data = curl_exec($ch);\n        curl_close($ch);\n\t\t\n\t\treturn $data;\n\t}\n\tfunction html_classtype($sql,$limit=null){\n\t\t$terminal_path = $_SESSION['terminal']=='pc' ? $this->webconf['pc_html'] : $this->webconf['mobile_html'];\n\t\t$terminal_path = ($terminal_path=='' || $terminal_path=='/') ? '' : $terminal_path.'/';\n\t\t\n\t\t$www = get_domain();\n\t\t\n\t\t\n\t\t$lists = M('classtype')->findAll($sql,' id asc ',null,$limit);\n\t\t\n\t\t$classtypedata = $this->classtypedata;\n\n\t\t$urls = [];\n\t\tif($lists){\n\t\t\t//更新静态注意事项：\n\t\t\t//1 创建目录文件夹--权限问题\n\t\t\t//2 栏目在根目录中\n\t\t\t//3 从缓存中抓取是最快的\n\t\t\t\n\t\t\tforeach($lists as $v){\n\t\t\t\t\n\t\t\t\tif($v['gourl']){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$filename = $v['htmlurl'];\n\t\t\t\t//创建文件夹\n\t\t\t\tif(!is_dir(APP_PATH.$terminal_path)){\n\t\t\t\t\t$r = mkdir(APP_PATH.$terminal_path,0777,true);\n\t\t\t\t\tif(!$r){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('系统创建目录失败!').' [ '.str_replace('/','\\\\',APP_PATH.$terminal_path).' ]']);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(strpos($filename,'/')!==false){\n\t\t\t\t\t$filepath = explode('/',$filename);\n\t\t\t\t\tarray_pop($filepath);\n\t\t\t\t\t$dir = APP_PATH.$terminal_path.implode('/',$filepath);\n\t\t\t\t\t$create_dir = APP_PATH.$terminal_path;\n\t\t\t\t\tforeach($filepath as $vv){\n\t\t\t\t\t\t$create_dir.=$vv;\n\t\t\t\t\t\tif(!is_dir($create_dir)){\n\t\t\t\t\t\t\t$r = mkdir($create_dir,0777,true);\n\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('系统创建目录失败!').' ['.str_replace('/','\\\\',$create_dir).']']);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$create_dir.='/';\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(File_TXT_HIDE){\n\t\t\t\t\tif(!file_exists(APP_PATH.$terminal_path.$filename)){\n\t\t\t\t\t\t$r = mkdir(APP_PATH.$terminal_path.$filename,0777);\n\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('系统创建目录失败!').'['.str_replace('/','\\\\',APP_PATH.$terminal_path.$filename).']']);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$url = APP_PATH.$terminal_path.$filename.'/index.html';\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$url = APP_PATH.$terminal_path.$filename.'.html';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t$urls[] = ['url'=>$www.'/'.$terminal_path.$filename.'.html','html'=>$url];\n\n\n\t\t\t\t//检查分页\n\t\t\t\t$sql = 'tid in('.implode(\",\",$classtypedata[$v['id']][\"children\"][\"ids\"]).') ';\n\t\t\t\t$count = M($v['molds'])->getCount($sql);\n\t\t\t\t$pagenum = ceil($count/$v['lists_num']);\n\t\t\t\tif($pagenum>1){\n\t\t\t\t\tfor($i=1;$i<=$pagenum;$i++){\n\t\t\t\t\t\t$filename = $v['htmlurl'].'-'.$i;\n\t\t\t\t\t\tif(File_TXT_HIDE){\n\t\t\t\t\t\t\t$url = APP_PATH.$terminal_path.$filename.'/index.html';\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$url = APP_PATH.$terminal_path.$filename.'.html';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(File_TXT_HIDE){\n\t\t\t\t\t\t\tif(!file_exists(APP_PATH.$terminal_path.$filename)){\n\t\t\t\t\t\t\t\tmkdir(APP_PATH.$terminal_path.$filename,0777);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$urls[] = ['url'=>$www.'/'.$terminal_path.$filename.'.html','html'=>$url];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\treturn $urls;\n\t\t\n\t}\n\t\n\tfunction html_molds($model,$sql=null,$limit=null){\n\t\t$terminal_path = $_SESSION['terminal']=='pc' ? $this->webconf['pc_html'] : $this->webconf['mobile_html'];\n\t\t$terminal_path = ($terminal_path=='' || $terminal_path=='/') ? '' : $terminal_path.'/';\n\t\t$modelname = get_info_table('molds',['biaoshi'=>$model],'name');\n\t\t\n\t\t\n\t\t$lists = M($model)->findAll($sql,' id asc ','id,htmlurl,tid,target,ownurl,molds',$limit);\n\t\t$www = get_domain();\n\t\t$urls=[];//存储更新url链接\n\t\tif($lists && is_array($lists)){\n\t\t\t//更新静态注意事项：\n\t\t\t//1 创建目录文件夹--权限问题\n\t\t\t//2 栏目在根目录中\n\t\t\t//3 从缓存中抓取是最快的\n\t\t\t\n\t\t\tforeach($lists as $v){\n\t\t\t\tif($v['target']){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif($v['ownurl']){\n\t\t\t\t\t$htmlurl = $v['ownurl'];\n\t\t\t\t}else{\n\t\t\t\t\t$htmlurl = $v['htmlurl'];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t//检测htmlurl是否为空\n\t\t\t\tif(trim($htmlurl)==''){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>$modelname.JZLANG('模块未绑定栏目，无法生存HTML！')]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t//需要检测文件夹是否存在\n\t\t\t\t//创建文件夹\n\t\t\t\tif(!is_dir(APP_PATH.$terminal_path)){\n\t\t\t\t\t$r = mkdir(APP_PATH.$terminal_path,0777,true);\n\t\t\t\t\tif(!$r){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('系统创建目录失败!').' [ '.str_replace('/','\\\\',APP_PATH.$terminal_path).' ]']);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(strpos($htmlurl,'/')!==false){\n\t\t\t\t\t$filepath = explode('/',$htmlurl);\n\t\t\t\t\t//array_pop($filepath);\n\t\t\t\t\t$dir = APP_PATH.$terminal_path.implode('/',$filepath);\n\t\t\t\t\t$create_dir = APP_PATH.$terminal_path;\n\t\t\t\t\tforeach($filepath as $vv){\n\t\t\t\t\t\tif(strpos($vv,'.')===false){\n\t\t\t\t\t\t\t$create_dir.=$vv;\n\t\t\t\t\t\t\tif(!is_dir($create_dir)){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t$r = mkdir($create_dir,0777,true);\n\t\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('系统创建目录失败!').' [ '.str_replace('/','\\\\',$create_dir).' ]']);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$create_dir.='/';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tif(!is_dir(APP_PATH.$terminal_path.$htmlurl) && strpos($htmlurl,'.')===false){\n\t\t\t\t\t\t$r = mkdir(APP_PATH.$terminal_path.$htmlurl,0777,true);\n\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('系统创建目录失败!').' [ '.str_replace('/','\\\\',APP_PATH.$terminal_path.$htmlurl).' ]']);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif($v['ownurl']){\n\t\t\t\t\t$url = get_domain().'/'.$v['ownurl'];\n\t\t\t\t\t$filename = APP_PATH.$terminal_path.$htmlurl;\n\t\t\t\t}else{\n\t\t\t\t\t$url = gourl($v);\n\t\t\t\t\t$filename = APP_PATH.$terminal_path.$v['htmlurl'].'/'.$v['id'].'.html';\n\t\t\t\t}\n\t\t\t\t$urls[] = ['url'=>$url,'html'=>$filename];\n\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\treturn $urls;\n\t\t\n\t}\n\t\n\t// 导航\n\tpublic function menu(){\n\t\t\n\t\t$this->lists = M('menu')->findAll();\n\t\t\n\t\t$this->display('menu');\n\t}\n\t\n\tpublic function addmenu(){\n\t\tif($this->frparam('go',1)==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data['name'] = $this->frparam(\"name\",1);\n\t\t\t$data['isshow'] = $this->frparam(\"isshow\");\n\t\t\t$tid = $this->frparam('tid',2);\n\t\t\t$title = $this->frparam('title',2);\n\t\t\t$gourl = $this->frparam('gourl',2);\n\t\t\t$target = $this->frparam('target',2);\n\t\t\t$status = $this->frparam('status',2);\n            $litpic = $this->frparam('litpic',2);\n\t\t\t\n\t\t\t$data = get_fields_data($data,'menu');\n\t\t\t$nav = [];\n\t\t\tforeach($tid as $k=>$v){\n\t\t\t\t$nav[] = [\n\t\t\t\t\t'tid'=>$v,\n\t\t\t\t\t'title'=>$title[$k],\n\t\t\t\t\t'gourl'=>$gourl[$k],\n\t\t\t\t\t'target'=>$target[$k],\n\t\t\t\t\t'status'=>$status[$k],\n\t\t\t\t\t'litpic'=>$litpic[$k],\n\t\t\t\t];\n\t\t\t\t\n\t\t\t}\n\t\t\t$data['nav'] = serialize($nav);\n\t\t\t\n\t\t\t\n\t\t\tif(M('menu')->add($data)){\n\t\t\t\tsetCache('jznav',null);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功！继续添加~'),'url'=>U('index/addmenu')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\t$this->display('addmenu');\n\t}\n\t\n\tpublic function editmenu(){\n\t\t$id = $this->frparam('id');\n\t\t$menu = M('menu')->find(['id'=>$id]);\n\t\tif(!$id || !$menu){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('缺少ID')]);\n\t\t\t}\n\t\t\tError(JZLANG('链接错误！'));\n\t\t}\n\t\tif($this->frparam('go',1)==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data['name'] = $this->frparam(\"name\",1);\n\t\t\t$data['isshow'] = $this->frparam(\"isshow\");\n\t\t\t$tid = $this->frparam('tid',2);\n\t\t\t$title = $this->frparam('title',2);\n\t\t\t$gourl = $this->frparam('gourl',2);\n\t\t\t$target = $this->frparam('target',2);\n\t\t\t$status = $this->frparam('status',2);\n            $litpic = $this->frparam('litpic',2);\n\t\t\t\n\t\t\t$data = get_fields_data($data,'menu');\n\t\t\t$nav = [];\n\t\t\tforeach($tid as $k=>$v){\n\t\t\t\t$nav[] = [\n\t\t\t\t\t'tid'=>$v,\n\t\t\t\t\t'title'=>$title[$k],\n\t\t\t\t\t'gourl'=>$gourl[$k],\n\t\t\t\t\t'target'=>$target[$k],\n\t\t\t\t\t'status'=>$status[$k],\n\t\t\t\t\t'litpic'=>$litpic[$k],\n\t\t\t\t];\n\t\t\t\t\n\t\t\t}\n\t\t\t$data['nav'] = serialize($nav);\n\t\t\t\n\t\t\t\n\t\t\tif(M('menu')->update(['id'=>$id],$data)){\n\t\t\t\tsetCache('jznav',null);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('index/menu')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$menu['nav'] = unserialize($menu['nav']);\n\t\t$this->data = $menu;\n\t\t\n\t\t$this->display('editmenu');\n\t}\n\t\n\tpublic function delmenu(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\tif(M('menu')->delete('id='.$id)){\n\t\t\t\tsetCache('jznav',null);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/admin/c/JzattrController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\nuse frphp\\extend\\Page;\n\nclass JzattrController extends CommonController\n{\n\t\n\tpublic function index(){\n\t\t$molds = 'attr';\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$molds));\n\t\t$data = $this->frparam();\n\t\tif($this->frparam('ajax')){\n\t\t\t\n\t\t\t$page = new Page($molds);\n\t\t\t$sql = null;\n\t\t\t$data = $page->where($sql)->orderby('id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t$ajaxdata = [];\n\t\t\tforeach($data as $k=>$v){\n\t\t\t\t\n\t\t\t\t$v['new_isshow'] = $v['isshow']==1 ? JZLANG('显示') : JZLANG('隐藏');\n\t\t\t\t\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t$this->display('attr-list');\n\t\t\n\t}\n\t\n\tpublic function addAttr(){\n\t\t$w['name'] = $this->frparam('v',1);\n\t\tif(!$w['name']){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请输入属性名称！')]);\n\t\t}\n\t\tif(M('attr')->find(['name'=>$w['name']])){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('属性已存在！')]);\n\t\t\t\n\t\t}\n\t\t$w['isshow'] = 1;\n\t\tM('attr')->add($w);\n\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('添加成功！')]);\n\t\t\n\t\t\n\t}\n\tpublic function editAttr(){\n\t\t$id = $this->frparam('id');\n\t\t$w['name'] = $this->frparam('v',1);\n\t\tif(!$id){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数错误！')]);\n\t\t}\n\t\tif(!$w['name']){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请输入属性名称！')]);\n\t\t}\n\t\t$sql = \" name='\".$w['name'].\"' and id!=\".$id;\n\t\tif(M('attr')->find($sql)){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('属性已存在！')]);\n\t\t\t\n\t\t}\n\t\t\n\t\tM('attr')->update(['id'=>$id],$w);\n\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('添加成功！')]);\n\t\t\n\t\t\n\t}\n\t\n\t\n\t//单一删除\n\tfunction delAttr(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\tif($id<=3){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('系统属性只允许修改和隐藏，不允许删除！')));\n\t\t\t}\n\t\t\tif(M('attr')->delete(['id'=>$id])){\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction changeStatus(){\n\n\t\t$w['isshow'] = $this->frparam('value',0,0);\n\t\t$r = M('attr')->update(array('id'=>$this->frparam('id',0,0)),$w);\n\t\tif(!$r){\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\n\t\t}\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\n\n\t}\n\t\n\n\n\n}"
  },
  {
    "path": "app/admin/c/JzchainController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\nuse frphp\\extend\\Page;\n\nclass JzchainController extends CommonController\n{\n\t\n\tpublic function index(){\n\t\t$molds = 'chain';\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$molds));\n\t\t$data = $this->frparam();\n\t\t$this->title = $this->frparam('title',1);\n\t\t$this->url = $this->frparam('url',1);\n\t\t$this->isshow = $this->frparam('isshow');\n\t\tif($this->frparam('ajax')){\n\n\t\t\t$page = new Page($molds);\n\t\t\t$sql = ' 1=1 ';\n\t\t\tif($this->frparam('title',1)){\n\t\t\t\t$sql.=\" and title like '%\".$this->frparam('title',1).\"%' \";\n\t\t\t}\n\t\t\tif($this->frparam('url',1)){\n\t\t\t\t$sql.=\" and url like '%\".$this->frparam('url',1).\"%' \";\n\t\t\t}\n\t\t\t\n\t\t\tif($this->frparam('isshow')){\n\t\t\t\t$t = $this->frparam('isshow')==2 ? 0 : 1;\n\t\t\t\t$sql.=\" and isshow=\".$t;\n\t\t\t}\n\t\t\t\n\t\t\t$data = $page->where($sql)->orderby('id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t$ajaxdata = [];\n\t\t\tforeach($data as $k=>$v){\n\t\t\t\t\n\t\t\t\t$v['isshow'] = $v['isshow']==1 ? JZLANG('显示') : JZLANG('隐藏');\n\t\t\t\t$v['newtitle'] = $v['newtitle'] ? $v['newtitle'] : '';\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t$this->display('chain-list');\n\t\t\n\t}\n\t\n\tpublic function addchain(){\n\t\t$w['title'] = $this->frparam('title',1);\n\t\tif(!$w['title']){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请输入内链词！')]);\n\t\t}\n\t\t$w['newtitle'] = $this->frparam('newtitle',1);\n\t\t$w['url'] = $this->frparam('url',1);\n\t\tif(!$w['url']){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请输入内链！')]);\n\t\t}\n\t\t$w['num'] = ($this->frparam('num')<=-1 || $this->frparam('num',1)=='' ) ? -1 : $this->frparam('num');\n\t\tif(M('chain')->find(['title'=>$w['title']])){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('内链词已存在！')]);\n\t\t\t\n\t\t}\n\t\t$w['isshow'] = 1;\n\t\tM('chain')->add($w);\n\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('添加成功！')]);\n\t\t\n\t\t\n\t}\n\tpublic function editchain(){\n\t\t$id = $this->frparam('id');\n\t\tif(!$id){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数错误！')]);\n\t\t}\n\t\t$w['title'] = $this->frparam('title',1);\n\t\tif(!$w['title']){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请输入内链词！')]);\n\t\t}\n\t\t$w['newtitle'] = $this->frparam('newtitle',1);\n\t\t$w['url'] = $this->frparam('url',1);\n\t\tif(!$w['url']){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请输入内链！')]);\n\t\t}\n\t\t$w['num'] = ($this->frparam('num')<=-1 || $this->frparam('num',1)=='' ) ? -1 : $this->frparam('num');\n\t\t$sql = \" title='\".$w['title'].\"' and id!=\".$id;\n\t\tif(M('chain')->find($sql)){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('属性已存在！')]);\n\t\t\t\n\t\t}\n\t\t\n\t\tM('chain')->update(['id'=>$id],$w);\n\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('修改成功！')]);\n\t\t\n\t\t\n\t}\n\t\n\t\n\t//单一删除\n\tfunction delchain(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t    $data = M('chain')->find(['id'=>$id]);\n\t\t\tif(M('chain')->delete(['id'=>$id])){\n                $w['molds'] = 'chain';\n                $w['data'] = serialize($data);\n                $w['title'] = '['.$data['id'].']'.$data['title'];\n                $w['addtime'] = time();\n                M('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction changeStatus(){\n\n\t\t$w['isshow'] = $this->frparam('value',0,0);\n\t\t$r = M('chain')->update(array('id'=>$this->frparam('id',0,0)),$w);\n\t\tif(!$r){\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\n\t\t}\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\n\n\t}\n\t\n\tfunction delAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t    $list = M('chain')->findAll('id in('.$data.')');\n\t\t\tif(M('chain')->delete('id in('.$data.')')){\n\t\t\t    foreach ($list as $v){\n                    $w['molds'] = 'chain';\n                    $w['data'] = serialize($v);\n                    $w['title'] = '['.$v['id'].']'.$v['title'];\n                    $w['addtime'] = time();\n                    M('recycle')->add($w);\n                }\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\n\n\n}"
  },
  {
    "path": "app/admin/c/LinksController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\nuse frphp\\extend\\Page;\n\nclass LinksController extends CommonController\n{\n\t\n\tpublic function index(){\n\t\t\n\t\t$classtypedata = $this->classtypedata;\n\t\t$molds = 'links';\n\t\tif($molds==''){\n\t\t\tError(JZLANG('模块为空，请选择模块！'));\n\t\t}\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$molds));\n\t\t$data = $this->frparam();\n\t\t$res = molds_search($molds,$data);\n\t\t$this->isshow = $this->frparam('isshow');\n\t\t$this->tid = $this->frparam('tid');\n\t\t$this->fields_search = $res['fields_search'];\n\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>$molds,'islist'=>1),'orders desc,id asc');\n\t\t$this->classtypes = $this->classtypetree;\n\t\tif($this->frparam('ajax')){\n\t\t\t\n\t\t\t$sql = '1=1';\n\t\t\tif($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['isclasstype']==1 && $this->molds['iscontrol']!=0){\n\t\t\t\t$a1 = explode(',',$this->tids);\n\t\t\t\t$a2 = array_filter($a1);\n\t\t\t\t$tids = implode(',',$a2);\n\t\t\t\t$sql.=' and tid in('.$tids.') ';\n\t\t\t}\n\t\t\tif($this->frparam('isshow')){\n\t\t\t\tif($this->frparam('isshow')==1){\n\t\t\t\t\t$isshow=1;\n\t\t\t\t}else if($this->frparam('isshow')==2){\n\t\t\t\t\t$isshow=0;\n\t\t\t\t}else{\n\t\t\t\t\t$isshow = 2;\n\t\t\t\t}\n\t\t\t\t$sql .= ' and isshow='.$isshow;\n\t\t\t}\n\t\t\t$get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n\t\t\t$sql .= $get_sql;\n\t\t\tif($this->frparam('tid')){\n                $sql .= ' and tid in('.$this->frparam('tid').')';\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$page = new Page($molds);\n\t\t\t$data = $page->where($sql)->orderby('orders desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t$ajaxdata = [];\n\t\t\tforeach($data as $k=>$v){\n\t\t\t\t$v['new_tid'] = get_info_table('link_type',array('id'=>$v['tid']),'name');\n\t\t\t\t$v['new_isshow'] = $v['isshow']==1 ? JZLANG('已审') : ($v['isshow']==2 ? JZLANG('退回') : JZLANG('未审'));\n\t\t\t\t$v['view_url'] = $v['htmlurl']!='' ? get_domain().'/'.$v['htmlurl'].'/'.$v['id'] : '';\n\t\t\t\t$v['edit_url'] = U('Links/editlinks',array('id'=>$v['id'],'molds'=>$molds));\n\t\t\t\t\n\t\t\t\tforeach($this->fields_list as $vv){\n\t\t\t\t\t$v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n\t\t\t\t}\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t$this->display('links-list');\n\t\t\n\t}\n\t\n\tpublic function addlinks(){\n\t\t$molds = 'links';\n\t\t$this->fields_biaoshi = $molds;\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data['tid'] = $this->frparam('tid',0,0);\n\t\t\t\n\t\t\t\n\t\t\t$data = get_fields_data($data,$molds);\n\t\t\t\n\t\t\t//处理自定义URL\n\t\t\tif(isset($data['ownurl'])){\n\t\t\t\tif(M('customurl')->find(['molds'=>$molds,'url'=>$data['ownurl']])){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL！')));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t$data['userid'] = $this->admin['id'];\n\t\t\t$data['molds'] = $molds;\n            $data['addtime'] = $data['updatetime'] = time();\n\t\t\t$r = M($molds)->add($data);\n\t\t\tif($r){\n\t\t\t\tif(isset($data['ownurl'])){\n\t\t\t\t\tM('customurl')->add(['molds'=>$molds,'tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$r]);\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功,继续添加~'),'url'=>U('Links/addlinks',['tid'=>$data['tid'],'molds'=>$molds])));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败！')));\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->tid =  $this->frparam('tid',0,0);\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$molds));\n\t\t\n\t\t$this->display('links-add');\n\t}\n\t\n\tpublic function editlinks(){\n\t\t$molds = 'links';\n\t\t$this->fields_biaoshi = $molds;\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data['tid'] = $this->frparam('tid',0,0);\n\t\t\t\n\t\t\t$data = get_fields_data($data,$molds);\n\t\t\tif($this->frparam('id')){\n\t\t\t\t\n\t\t\t\t//处理自定义URL\n\t\t\t\tif($data['ownurl']){\n\t\t\t\t\t$customurl = M('customurl')->find(['url'=>$data['ownurl']]);\n\t\t\t\t\tif($customurl){\n\t\t\t\t\t\tif($customurl['aid']!=$this->frparam('id')){\n\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL！')));\n\t\t\t\t\t\t}else if($customurl['url']!=$data['ownurl']){\n\t\t\t\t\t\t\tM('customurl')->update(['molds'=>$molds,'tid'=>$data['tid'],'aid'=>$this->frparam('id')],['url'=>$data['ownurl']]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(M('customurl')->find(['aid'=>$this->frparam('id')])){\n\t\t\t\t\t\t\tM('customurl')->update(['molds'=>$molds,'tid'=>$data['tid'],'aid'=>$this->frparam('id')],['url'=>$data['ownurl']]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tM('customurl')->add(['molds'=>$molds,'tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$this->frparam('id')]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tM('customurl')->delete(['molds'=>$molds,'aid'=>$this->frparam('id')]);\n\t\t\t\t}\n                $data['updatetime'] = time();\n\t\t\t\tif(M($molds)->update(array('id'=>$this->frparam('id')),$data)){\n\t\t\t\t\tif($this->webconf['release_award_open']==1 && $data['isshow']==1){\n\t\t\t\t\t\t$award = round($this->webconf['release_award'],2);\n\t\t\t\t\t\t$max_award = round($this->webconf['release_max_award'],2);\n\t\t\t\t\t\t$member_id = M($molds)->getField(['id'=>$this->frparam('id')],'member_id');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$this->frparam('id'),'msg'=>JZLANG('发布奖励')]);\n\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"发布奖励\").\"' \";\n\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\tforeach($all as $v){\n\t\t\t\t\t\t\t\t\t\t$all_jifen+=$v['amount'];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t   \t  \t\t$w['molds'] = $molds;\n\t\t\t\t\t\t   \t  \t\t$w['aid'] = $this->frparam('id');\n\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('发布奖励');\n\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('您未做任何修改，不能提交！')));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('缺少ID')));\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$this->data = M($molds)->find(array('id'=>$this->frparam('id')));\n\t\t$this->molds = M('Molds')->find(array('biaoshi'=>$molds));\n\t\t$this->tid =  $this->data['tid'];\n\t\t$this->classtypetree =  get_classtype_tree();\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->display('links-edit');\n\t}\n\t\n\tpublic function  copylinks(){\n\t\t$id = $this->frparam('id');\n\t\t$molds = 'links';\n\t\tif($id){\n\t\t\t$data = M($molds)->find(['id'=>$id]);\n\t\t\tunset($data['id']);\n\t\t\tif(M($molds)->add($data)){\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('复制成功！')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('复制失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t}\n\t\n\t//批量删除\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\t$molds = 'links';\n\t\tif($data!=''){\n\t\t    $list = M($molds)->findAll('id in('.$data.')');\n\t\t\tif(M($molds)->delete('id in('.$data.')')){\n\t\t\t    foreach ($list as $v){\n                    $w['molds'] = 'links';\n                    $w['data'] = serialize($v);\n                    $w['title'] = '['.$v['id'].']'.$v['title'];\n                    $w['addtime'] = time();\n                    M('recycle')->add($w);\n                }\n\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t//单一删除\n\tfunction deletelinks(){\n\t\t$id = $this->frparam('id');\n\t\t$molds = 'links';\n\t\tif($id){\n\t\t    $data = M($molds)->find(['id'=>$id]);\n\t\t\tif(M($molds)->delete(['id'=>$id])){\n                $w['molds'] = 'links';\n                $w['data'] = serialize($data);\n                $w['title'] = '['.$data['id'].']'.$data['title'];\n                $w['addtime'] = time();\n                M('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\t//修改排序\n\tfunction editOrders(){\n\n\t\t$field = $this->frparam('field',1);\n\t\t$w[$field] = $this->frparam('value',1);\n\t\t$molds = 'links';\n\t\t$r = M($molds)->update(array('id'=>$this->frparam('id')),$w);\n\t\tif(!$r){\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\n\t\t}\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\n\n\t}\n\t//批量修改栏目\n\tfunction changeType(){\n\t\t$data = $this->frparam('data',1);\n\t\t$molds = $this->frparam('molds',1);\n\t\t$tid = $this->frparam('tid');\n\t\tif($data!=''){\n\t\t\t$list = M($molds)->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\t$w['tid'] = $tid;\n\t\t\t\tM($molds)->update(array('id'=>$v['id']),$w);\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功！')));\n\t\t}\n\t}\n\t//批量复制\n\tfunction copyAll(){\n\t\t$data = $this->frparam('data',1);\n\t\t$molds = 'links';\n\t\tif($data!=''){\n\t\t\t$list = M($molds)->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\tunset($v['id']);\n\t\t\t\tM($molds)->add($v);\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量复制成功！')));\n\t\t\t\t\n\t\t}\n\t}\n\n\t//批量审核\n\tfunction checkAll(){\n\t\t$data = $this->frparam('data',1);\n\t\t$molds = $this->frparam('molds',1);\n\t\tif($data!=''){\n\t\t\tif($this->frparam('isshow')==1){\n\t\t\t\t$isshow = 1;\n\t\t\t}else if($this->frparam('isshow')==2){\n\t\t\t\t$isshow = 0;\n\t\t\t}else{\n\t\t\t\t$isshow = 2;\n\t\t\t}\n\t\t\tif($isshow==1){\n\t\t\t\t$all = M($molds)->findAll('id in('.$data.')');\n\t\t\t\t$award = round($this->webconf['release_award'],2);\n\t\t\t\t$max_award = round($this->webconf['release_max_award'],2);\n\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\tforeach ($all as $k => $v) {\n\t\t\t\t\tif($v['isshow']!=1){\n\t\t\t\t\t\t//start\n\t\t\t\t\t\tif($this->webconf['release_award_open']==1){\n\t\t\t\t\t\t\t$member_id = $v['member_id'];\n\t\t\t\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$v['id'],'msg'=>JZLANG('发布奖励')]);\n\t\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"发布奖励\").\"' \";\n\t\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\t\tforeach($all as $vv){\n\t\t\t\t\t\t\t\t\t\t\t$all_jifen+=$vv['amount'];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t\t                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t\t   \t  \t\t$w['molds'] = $molds;\n\t\t\t\t\t\t\t   \t  \t\t$w['aid'] = $v['id'];\n\t\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('发布奖励');\n\t\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//end\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tM($molds)->update('id in('.$data.')',['isshow'=>$isshow]);\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量审核成功！')));\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量审核失败！')));\n\t\t}\n\t}\n\n\tfunction linktype(){\n\t\t$lists = M(\"link_type\")->findAll();\n\t\t$this->lists = $lists;\n\t\t$this->display('linktype-list');\n\t}\n\t\n\tfunction linktypeadd(){\n\t\tif($this->frparam('go')==1){\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t\t$data['addtime'] = time();\n\t\t\t\tif(M('link_type')->add($data)){\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功！')));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败！')));\n\t\t\t\t}\n\t\t}\n\t\t$this->display('linktype-add');\n\t}\n\n\tfunction linktypeedit(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\tif($this->frparam('go')==1){\n\t\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t\t$data['addtime'] = time();\n\t\t\t\tif(M('link_type')->update(array('id'=>$id),$data)){\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t$data =  M(\"link_type\")->find(array('id'=>$id));\n\t\t\t$this->data = $data;\n\t\t\t$this->display('linktype-edit');\n\t\t}\n\n\t}\n\n\tfunction linktypedelete(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t//检测该分类下是否存在内容\n\t\t\t$r = M('links')->getCount(array('tid'=>$id));\n\t\t\tif($r){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('该分类下存在内容，请先删除该分类下的内容！')));\n\t\t\t}\n\n\t\t\tif(M('link_type')->delete('id='.$id)){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\n}"
  },
  {
    "path": "app/admin/c/LoginController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2019/01-2019/02\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace app\\admin\\c;\r\n\r\n\r\nuse frphp\\lib\\Controller;\r\nclass LoginController extends Controller\r\n{\r\n\tpublic function _init(){\r\n\t\t  $webconf = webConf();\r\n\t\t  $template = TEMPLATE;\r\n\t\t  $this->webconf = $webconf;\r\n\t\t  $this->template = $template;\r\n\t\t  $this->tpl = Tpl_style.$template.'/';\r\n\t\t  $customconf = get_custom();\r\n\t\t  $this->customconf = $customconf;\r\n\t\t\r\n\t}\r\n\tpublic function index(){\r\n\t\t\r\n\t\tif($_POST){\r\n\t\t\t//$data = $this->frparam();//去除全局获取\r\n\t\t\t$data['username'] = str_replace(\"'\",'',$this->frparam('username',1));//进行二次过滤校验\r\n\t\t\t$data['password'] = str_replace(\"'\",'',$this->frparam('password',1));\r\n\t\t\t\r\n\t\t\tif($data['username']=='' || $data['password']==''){\r\n\t\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('账户密码不能为空！'));\r\n\t\t\t\tJsonReturn($xdata);\r\n\t\t\t}\r\n\t\t\tif(!isset($this->webconf['closeadminvercode']) || $this->webconf['closeadminvercode']!=1){\r\n\t\t\t\tif(md5(md5(strtolower($this->frparam('vercode',1))))!=$_SESSION['frcode']){\r\n\t\t\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('验证码错误！'));\r\n\t\t\t\t\tJsonReturn($xdata);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t$_SESSION['frcode'] = getRandChar(32);\r\n\t\t\t$where['pass'] = md5($data['password'].'YF');\r\n\t\t\t$where['name'] = $data['username'];\r\n\t\t\t\r\n\t\t\t$res1 = M('level')->find($where);\r\n\t\t\tunset($where['name']);\r\n\t\t\t$where['tel'] = $data['username'];\r\n\t\t\t$res2 = M('level')->find($where);\r\n\t\t\tunset($where['tel']);\r\n\t\t\t$where['email'] = $data['username'];\r\n\t\t\t$res3 = M('level')->find($where);\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tif($res1 || $res2 || $res3){\r\n\t\t\t\r\n\t\t\t\t$res = ($res1) ? $res1 :($res2 ? $res2 : $res3);\r\n\t\t\t\tunset($res['pass']);\r\n\t\t\t\tif($res['status']==0){\r\n\t\t\t\t\t$data = array('code'=>1,'msg'=>JZLANG('该账户已被封禁！'));\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$group = M('level_group')->find(array('id'=>$res['gid']));\r\n\t\t\t\t\tif($group['isagree']==0){\r\n\t\t\t\t\t\t$data = array('code'=>1,'msg'=>JZLANG('该账户已被封禁！'));\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tunset($group['id']);\r\n\t\t\t\t\t\t$group['group_name'] = $group['name'];\r\n\t\t\t\t\t\tunset($group['name']);\r\n\t\t\t\t\t\t$_SESSION['admin'] = array_merge($res,$group);\r\n\t\t\t\t\t\tM('level')->update(array('id'=>$res['id']),array('logintime'=>time()));\r\n\t\t\t\t\t\tsetCache(session_id(),GetIP());\r\n\t\t\t\t\t\t//写入日志\r\n\t\t\t\t\t\tif(!StopLog){\r\n\t\t\t\t\t\t\t$log['user'] = $_SESSION['admin']['name'];\r\n\t\t\t\t\t\t\t$log['userid'] = $_SESSION['admin']['id'];\r\n\t\t\t\t\t\t\tregister_log($_SESSION['admin'],'login');\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$data = array('code'=>0,'msg'=>JZLANG('登录成功！'));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n               \r\n\t\t\t}else{\r\n\t\t\t\t$data = array('code'=>1,'msg'=>JZLANG('账户密码错误！'));\r\n\t\t\t}\r\n\t\t\tJsonReturn($data);\r\n\t\t}\r\n\t\t\r\n     \r\n      \r\n\t\t$this->display('login');\r\n\t}\r\n\r\n  function vercode(){\r\n\t\t$w = $this->frparam('w',0,160);\r\n\t\t$h = $this->frparam('h',0,50);\r\n\t\t$n = $this->frparam('n',0,4);\r\n\t\t//frcode\r\n\t\t$name = $this->frparam('name',1,$this->frparam('code_name',1,'frcode'));\r\n\t\t\r\n\t\t$imagecode=new \\Imagecode($w,$h,$n,$name,APP_PATH.\"frphp/extend/AdobeGothicStd-Bold.ttf\");\r\n\t\t$imagecode->imageout();\r\n  }\r\n  \r\n  \r\n  function loginout(){\r\n  \t  $_SESSION['admin'] = null;\r\n      Error(JZLANG('安全退出~'),U('index'));\r\n  }\r\n  \r\n}\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "app/admin/c/MemberController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass MemberController extends CommonController\n{\n\n    function index(){\n        $this->username  = $this->frparam('username',1);\n        $this->starttime  = $this->frparam('start',1);\n        $this->endtime  = $this->frparam('end',1);\n        $this->tel  = $this->frparam('tel',1);\n        $this->isshow  = $this->frparam('isshow');\n        $data = $this->frparam();\n        $res = molds_search('member',$data);\n        $this->fields_search = $res['fields_search'];\n        $this->fields_list = M('Fields')->findAll(array('molds'=>'member','islist'=>1),'listorders desc');\n        if($this->frparam('ajax')){\n\n            $page = new Page('member');\n            $sql='1=1';\n\n            $get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n            $sql .= $get_sql;\n            $lists = $page->where($sql)->orderby('id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n            $ajaxdata = [];\n            foreach($lists as $k=>$v){\n\n\n                $v['edit_url'] = U('Member/memberedit',['id'=>$v['id']]);\n\n                foreach($this->fields_list as $vv){\n                    $v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n                }\n                $ajaxdata[]=$v;\n\n            }\n\n            $pages = $page->pageList();\n            $this->num = $page->sum;\n            $this->lists = $lists;\n            $this->pages = $pages;\n            JsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\n        }\n\n\n\n        $this->display('member-list');\n\n\n    }\n\n    function memberadd(){\n        $this->fields_biaoshi = 'member';\n        if($this->frparam('go')==1){\n            $data = $this->frparam();\n            $data = get_fields_data($data,'member');\n\n            //检查是否邮箱/手机号重复\n            if(M('member')->find(['email'=>$data['email']])){\n                JsonReturn(array('code'=>1,'msg'=>JZLANG('邮箱已被注册！')));\n            }\n            if(M('member')->find(['tel'=>$data['tel']]) && $data['tel']!=''){\n                JsonReturn(array('code'=>1,'msg'=>JZLANG('手机号已被注册！')));\n            }\n            $data['pass'] = md5(md5($this->frparam('pass',1)).md5($this->frparam('pass',1)));\n            if(M('member')->add($data)){\n                JsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功！')));\n            }else{\n                JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败，请重新提交！')));\n            }\n\n\n\n        }\n\n\n        $this->display('member-add');\n    }\n\n    function memberedit(){\n        $this->fields_biaoshi = 'member';\n        if($this->frparam('go')==1){\n            $data = $this->frparam();\n            $data = get_fields_data($data,'member');\n\n            if($this->frparam('pass',1)){\n                if($this->frparam('pass',1)!=$this->frparam('repass',1)){\n                    JsonReturn(array('code'=>1,'msg'=>JZLANG('两次密码不同！')));\n                }\n                $data['pass']  =  md5(md5($this->frparam('pass',1)).md5($this->frparam('pass',1)));\n            }else{\n                unset($data['pass']);\n            }\n\n            //检查是否邮箱/手机号重复\n            if($data['email']){\n                if(M('member')->find(\"email='\".$data['email'].\"' and id!=\".$data['id'])){\n                    JsonReturn(array('code'=>1,'msg'=>JZLANG('邮箱已被注册！')));\n                }\n            }\n            if($data['tel']){\n                if(M('member')->find(\"tel='\".$data['tel'].\"' and id!=\".$data['id'])){\n                    JsonReturn(array('code'=>1,'msg'=>JZLANG('手机号已被注册！')));\n                }\n            }\n\n\n            if(M('member')->update(array('id'=>$data['id']),$data)){\n                JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n            }else{\n                JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败，请重新提交！')));\n            }\n\n\n\n        }\n\n        $this->data = M('member')->find(['id'=>$this->frparam('id')]);\n        if(!$this->data){\n            Error(JZLANG('没有找到该用户！'));\n        }\n\n        $this->display('member-edit');\n    }\n\n    function member_del(){\n\t\t\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('member')->find(array('id'=>$id));\n\t\t\tif(M('member')->delete(array('id'=>$id))){\n\t\t\t\t$w['molds'] = 'member';\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['username'];\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\tM('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t}\n\t\n\t//批量删除会员\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$all = M('Member')->findAll('id in('.$data.')');\n\t\t\tif(M('Member')->delete('id in('.$data.')')){\n\t\t\t\tforeach($all as $v){\n\t\t\t\t\t$w['molds'] = 'member';\n\t\t\t\t\t$w['data'] = serialize($v);\n                    $w['title'] = '['.$v['id'].']'.$v['username'];\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function change_status(){\n\t\t$id = $this->frparam('id',1);\n\t\tif(!$id){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t}\n\t\t\n\t\t$x = M('member')->find('id='.$id);\n\t\tif($x['isshow']==1){\n\t\t\t$x['isshow']=0;\n\t\t}else{\n\t\t\t$x['isshow']=1;\n\t\t}\n\t\tM('member')->update(array('id'=>$id),array('isshow'=>$x['isshow']));\n\t}\n\n\tpublic function membergroup(){\n\t\t\n\t\t$list = M('member_group')->findAll(null,'orders desc');\n\t\t$list = set_class_haschild($list);\n\t\t$lists = getTree($list);\n        $this->fields_list = M('Fields')->findAll(array('molds'=>'member_group','islist'=>1),'orders desc');\n\t\t$this->lists = $lists;\n\t\t$this->display('membergroup-list');\n\t}\n\t\n\tfunction editOrders(){\n\t\t$w['orders'] = $this->frparam('orders');\n\t\t\n\t\t$r = M('member_group')->update(array('id'=>$this->frparam('id')),$w);\n\t\tif(!$r){\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\n\t\t}\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\n\t\t\n\t}\n\n\tfunction groupadd(){\n\t\t$this->fields_biaoshi = 'member_group';\n\t\tif($this->frparam('go')==1){\n\t\t\t$data = $this->frparam();\n            $data = get_fields_data($data,'member_group');\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['description'] = $this->frparam('description',1);\n\t\t\tif($this->frparam('ruler',2)){\n\t\t\t\t$data['paction'] = (count($this->frparam('ruler',2))>0)?','.implode(',',$this->frparam('ruler',2)).',':'';\n\t\t\t}else{\n\t\t\t\t$data['paction'] ='';\n\t\t\t}\n\t\t\t\n\t\t\tif(M('member_group')->add($data)){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败，请重新提交！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\n\t\t$rulers = M('power')->findAll(null,'id ASC');\n\t\t$ruler_top = array();\n\t\t$ruler_children = array();\n\t\tforeach($rulers as $v){\n\t\t\tif($v['pid']==0){\n\t\t\t\t$ruler_top[]=$v;\n\t\t\t}else{\n\t\t\t\t$ruler_children[$v['pid']][]=$v;\n\t\t\t}\n\t\t}\n\t\t$this->ruler_top = $ruler_top;\n\t\t$this->ruler_children = $ruler_children;\n\t\t\n\t\t\n\t\t\n\t\t$this->display('membergroup-add');\n\t}\n\tfunction groupedit(){\n\t\t$this->fields_biaoshi = 'member_group';\n\t\tif($this->frparam('go')==1){\n\t\t\t$data = $this->frparam();\n            $data = get_fields_data($data,'member_group');\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['description'] = $this->frparam('description',1);\n\t\t\tif($this->frparam('ruler',2)){\n\t\t\t\t$data['paction'] = (count($this->frparam('ruler',2))>0)?','.implode(',',$this->frparam('ruler',2)).',':'';\n\t\t\t}else{\n\t\t\t\t$data['paction'] ='';\n\t\t\t}\n\t\t\tif(M('member_group')->update(array('id'=>$data['id']),$data)){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败，请重新提交！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t$this->data = M('member_group')->find(['id'=>$this->frparam('id')]);\n\t\t$rulers = M('power')->findAll(null,'id ASC');\n\t\t$ruler_top = array();\n\t\t$ruler_children = array();\n\t\tforeach($rulers as $v){\n\t\t\tif($v['pid']==0){\n\t\t\t\t$ruler_top[]=$v;\n\t\t\t}else{\n\t\t\t\t$ruler_children[$v['pid']][]=$v;\n\t\t\t}\n\t\t}\n\t\t$this->ruler_top = $ruler_top;\n\t\t$this->ruler_children = $ruler_children;\n\t\t\n\t\tif(!$this->data){\n\t\t\tError(JZLANG('没有该角色！'));\n\t\t}\n\t\t\n\t\t$this->display('membergroup-edit');\n\t}\n\n\tpublic function change_group_status(){\n\t\t$id = $this->frparam('id',1);\n\t\tif(!$id || ($id==1)){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t}\n\t\t\n\t\t$x = M('member_group')->find('id='.$id);\n\t\tif($x['isagree']==1){\n\t\t\t$x['isagree']=0;\n\t\t}else{\n\t\t\t$x['isagree']=1;\n\t\t}\n\t\tM('member_group')->update(array('id'=>$id),array('isagree'=>$x['isagree']));\n\t}\n\tfunction group_del(){\n\t\t\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t//检查是否有管理员\n\t\t\tif(M('member')->getCount(array('gid'=>$id))>0){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('该分组下存在用户，请先移除用户再删除！')));\n\t\t\t}\n\t\t\t$data = M('member_group')->find(array('id'=>$id));\n\t\t\tif(M('member_group')->delete(array('id'=>$id))){\n\t\t\t\t$w['molds'] = 'member_group';\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['name'];\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\tM('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败，请重试！')));\n\t\t\t}\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作！')));\n\t\t}\n\t\t\n\t\t\n\t}\n\t\n\tpublic function power(){\n\t\t\n\t\t$rulers = M('power')->findAll();\n\t\t$rulers = set_class_haschild($rulers);\n\t\t$rulers = getTree($rulers);\n\t\t\n\t\t$this->lists = $rulers;\n\t\t$this->display('power-list');\n\t}\n\t\n\tpublic function addrulers(){\n\t\t\n\t\t$this->fields_biaoshi = 'power';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['action'] = $this->frparam('action',1);\n\t\t\t$data['pid'] = $this->frparam('pid');\n\t\t\t\n\t\t\tif(M('power')->add($data)){\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功！')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\t//Error('添加失败！');\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t$rulers = M('power')->findAll('pid=0');\n\t\t//$rulers = getTree($rulers);\n\t\t$this->pid = $this->frparam('pid');\n\t\t$this->rulers = $rulers;\n\t\t\n\t\t$this->display('power-add');\n\t}\n\t\n\tpublic function editrulers(){\n\n\t\t$this->fields_biaoshi = 'power';\n\t\tif($this->frparam('go')==1){\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['action'] = $this->frparam('action',1);\n\t\t\t$data['pid'] = $this->frparam('pid');\n\t\t\t\n\t\t\t$a = M('power')->update(array('id'=>$this->frparam('id')),$data);\n\t\t\tif($a){\n\t\t\t\tJsonReturn(array('status'=>1));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('status'=>1,'info'=>JZLANG('修改失败！')));\n\t\t\t}\n\t\t}\n\t\t$this->data = M('power')->find(array('id'=>$this->frparam('id')));\n\t\t\n\t\t$rulers = M('power')->findAll('pid=0');\n\t\t//$rulers = getTree($rulers);\n\t\n\t\t$this->rulers = $rulers;\n\t\t\n\t\t$this->display('power-edit');\n\t}\n\t\n\tpublic function deleterulers(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$ruler = M('power')->find(array('id'=>$id));\n\t\t\t$n = M('power')->find(array('pid'=>$id));\n\t\t\tif($n){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败，该分类有下级功能，请先删除下级功能！')));\n\t\t\t}else{\n\t\t\t\t$m = M('power')->delete(array('id'=>$id));\n\t\t\t\tif($m){\n                    $w['molds'] = 'power';\n                    $w['data'] = serialize($ruler);\n                    $w['title'] = '['.$ruler['id'].']'.$ruler['name'];\n                    $w['addtime'] = time();\n                    M('recycle')->add($w);\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('未选择删除对象！')));\n\t\t}\n\t}\n\n\n\n\n\n\n\n\n\n}"
  },
  {
    "path": "app/admin/c/MessageController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass MessageController extends CommonController\n{\n\n\t//批量删除留言\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$all = M('message')->findAll('id in('.$data.')');\n\t\t\tif(M('message')->delete('id in('.$data.')')){\n\t\t\t\tforeach($all as $v){\n\t\t\t\t\t$w['molds'] = 'message';\n\t\t\t\t\t$w['data'] = serialize($v);\n\t\t\t\t\t$w['title'] = '['.$v['id'].']'.$v['title'];\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//留言管理\n    function messagelist(){\n        $this->tid=  $this->frparam('tid');\n        $this->aid = $this->frparam('aid');\n        $this->classtypes = $this->classtypetree;\n        $this->isshow = $this->frparam('isshow');\n        $data = $this->frparam();\n        $res = molds_search('message',$data);\n        $this->fields_search = $res['fields_search'];\n        $this->fields_list = M('Fields')->findAll(array('molds'=>'message','islist'=>1),'listorders desc');\n        $this->molds = M('molds')->find(['biaoshi'=>'message']);\n        if($this->frparam('ajax')){\n            $page = new Page('Message');\n            $sql = ' 1=1 ';\n            if($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['iscontrol']!=0 && $this->molds['isclasstype']==1){\n                $a1 = explode(',',$this->tids);\n                $a2 = array_filter($a1);\n                $tids = implode(',',$a2);\n                $sql.=' and tid in('.$tids.') ';\n\n\n            }\n\n            $get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n            $sql .= $get_sql;\n            $data = $page->where($sql)->orderby('id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n            $ajaxdata = [];\n            foreach($data as $k=>$v){\n\n                $v['edit_url'] = U('Message/editmessage',array('id'=>$v['id']));\n                foreach($this->fields_list as $vv){\n                    $v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n                }\n                $ajaxdata[]=$v;\n\n            }\n\n            $pages = $page->pageList();\n            $this->pages = $pages;\n            $this->lists = $data;\n            $this->sum = $page->sum;\n            JsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n        }\n\n        $this->display('message-list');\n\n\n    }\n\n    function editmessage(){\n        $this->fields_biaoshi = 'message';\n        if($this->frparam('go',1)==1){\n            $data = $this->frparam();\n            $data = get_fields_data($data,'message');\n            check_field_must($data,'message');\n            if($this->frparam('id')){\n                $data['updatetime'] = time();\n                if(M('Message')->update(array('id'=>$this->frparam('id')),$data)){\n                    JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！')));\n                }else{\n                    JsonReturn(array('code'=>1,'msg'=>JZLANG('您未做任何修改，不能提交！')));\n                }\n            }\n\n        }\n        if($this->frparam('id')){\n            $this->data = M('Message')->find(array('id'=>$this->frparam('id')));\n        }\n        $this->molds = M('molds')->find(['biaoshi'=>'message']);\n        $this->classtypes = $this->classtypetree;\n        $this->display('message-details');\n\n    }\n\n    function deletemessage(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('Message')->find(['id'=>$id]);\n\t\t\tif(M('Message')->delete(['id'=>$id])){\n\t\t\t\t$w['molds'] = 'message';\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['title'];\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\tM('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\t//Error('删除失败！');\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//批量审核\n\tfunction checkAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$isshow = $this->frparam('isshow')==1 ? 1 : 0;\n\t\t\tM('message')->update('id in('.$data.')',['isshow'=>$isshow]);\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量审核成功！')));\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量审核失败！')));\n\t\t}\n\t}\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/admin/c/MoldsController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass MoldsController extends CommonController\n{\n\t\n\tfunction index(){\n\t\t$page = new Page('Molds');\n\t\t$sql = ' 1=1 ';\n\n\t\t$data = $page->where($sql)->orderby('orders desc')->page($this->frparam('page',0,1))->go();\n\t\t$pages = $page->pageList();\n\t\t$this->pages = $pages;\n\t\t$this->lists = $data;\n\t\t$this->sum = $page->sum;\n\t\t$this->display('molds-list');\n\t\t\n\t\t\n\t}\n\n\tfunction addMolds(){\n\t\tif($this->frparam('go',1)==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data['biaoshi'] = $this->frparam('biaoshi',1);\n\t\t\tif(!$data['name'] || !$data['biaoshi']){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('模块名和标识不能为空！')));\n\t\t\t}\n\t\t\t//检查是否已存在表\n\t\t\tif(M('molds')->find(['biaoshi'=>strtolower($data['biaoshi'])])){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('模型已添加不能重复添加！')));\n\t\t\t}\n\t\t\t$w = [];\n\t\t\t$w['name'] = $this->frparam('name',1);\n\t\t\t$w['biaoshi'] = $this->frparam('biaoshi',1);\n\t\t\t$w['orders'] = $this->frparam('orders');\n\t\t\t$w['iscontrol'] = $this->frparam('iscontrol');\n\t\t\t$w['ishome'] = $this->frparam('ishome');\n\t\t\t$w['isopen'] = $this->frparam('isopen');\n\t\t\t$w['ismust'] = $this->frparam('ismust');\n\t\t\t$w['ispreview'] = $this->frparam('ispreview',0,1);\n\t\t\t$w['isclasstype'] = $this->frparam('isclasstype');\n\t\t\t$w['isshowclass'] = $this->frparam('isshowclass');\n\t\t\t$w['list_html'] = $this->frparam('list_html',1);\n\t\t\t$w['details_html'] = $this->frparam('details_html',1);\n\t\t\tif($this->frparam('hastable')){\n\t\t\t\t\n\t\t\t\t$n = M('molds')->add($w);\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$sql = \"SHOW TABLES\";\n\t\t\t\t$tables = M()->findSql($sql);\n\t\t\t\t$ttable = array();\n\t\t\t\tforeach($tables as $value){\n\t\t\t\t\tforeach($value as $vv){\n\t\t\t\t\t\t$ttable[] = $vv;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(in_array(DB_PREFIX.strtolower($data['biaoshi']),$ttable)){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('该表已存在！')));\n\t\t\t\t}\n\t\t\t\t$n = M('Molds')->add($w);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tif($n){\n\t\t\t\t$sql = \"CREATE TABLE IF NOT EXISTS `\".DB_PREFIX.$data['biaoshi'].\"` (\n\t\t\t\t`id` int(11) unsigned NOT NULL auto_increment,\n\t\t\t\t`tid` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"所属栏目\").\"',\n\t\t\t\t`tids` varchar(255) DEFAULT NULL COMMENT '\".JZLANG(\"副栏目\").\"',\n\t\t\t\t`title` varchar(255) DEFAULT NULL COMMENT '\".JZLANG(\"标题\").\"',\n\t\t\t\t`litpic` varchar(255) DEFAULT NULL COMMENT '\".JZLANG(\"缩略图\").\"',\n\t\t\t\t`keywords` varchar(255) DEFAULT NULL COMMENT '\".JZLANG(\"关键词\").\"',\n\t\t\t\t`description` varchar(500) DEFAULT NULL COMMENT '\".JZLANG(\"简介\").\"',\n\t\t\t\t`body` text DEFAULT NULL COMMENT '\".JZLANG(\"内容\").\"',\n\t\t\t\t`molds` varchar(50) DEFAULT '\".$data['biaoshi'].\"' COMMENT '\".JZLANG(\"模型标识\").\"',\n\t\t\t\t`userid` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"发布管理员\").\"',\n\t\t\t\t`orders` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"排序\").\"',\n\t\t\t\t`member_id` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"前台用户\").\"',\n\t\t\t\t`comment_num` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"评论数\").\"',\n\t\t\t\t`htmlurl` varchar(100) DEFAULT NULL COMMENT '\".JZLANG(\"栏目链接\").\"',\n\t\t\t\t`isshow` tinyint(1) DEFAULT 1 COMMENT '\".JZLANG(\"是否显示\").\"',\n\t\t\t\t`target` varchar(255) DEFAULT NULL COMMENT '\".JZLANG(\"外链\").\"',\n\t\t\t\t`ownurl` varchar(255) DEFAULT NULL COMMENT '\".JZLANG(\"自定义URL\").\"',\n\t\t\t\t`jzattr` varchar(50) DEFAULT NULL COMMENT '\".JZLANG(\"推荐属性\").\"',\n\t\t\t\t`hits` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"点击量\").\"',\n\t\t\t\t`zan` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"点赞数\").\"',\n\t\t\t\t`tags` varchar(255) DEFAULT NULL COMMENT 'TAG',\n\t\t\t\t`istop` tinyint(1) DEFAULT 0 COMMENT '\".JZLANG(\"是否置顶\").\"',\n\t\t\t\t`ishot` tinyint(1) DEFAULT 0 COMMENT '\".JZLANG(\"是否热门\").\"',\n\t\t\t\t`istuijian` tinyint(1) DEFAULT 0 COMMENT '\".JZLANG(\"是否推荐\").\"',\n\t\t\t\t`addtime` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"发布时间\").\"',\n\t\t\t\t`updatetime` int(11) DEFAULT 0 COMMENT '\".JZLANG(\"更新时间\").\"',\n\t\t\t\tPRIMARY \n\t\t\t\tKEY  (`id`)\n\t\t\t\t) ENGINE=MyISAM  DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1\";\n\t\t\t\t\n\t\t\t\t$x = M()->runSql($sql);\n\t\t\t\t$w['field'] = 'title';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('标题');\n\t\t\t\t$w['tips'] = JZLANG('默认为空');\n\t\t\t\t$w['fieldtype'] = 1;\n\t\t\t\t$w['fieldlong'] = 255;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 1;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'tid';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('所属栏目');\n\t\t\t\t$w['tips'] = JZLANG('选择栏目');\n\t\t\t\t$w['fieldtype'] = 17;\n\t\t\t\t$w['fieldlong'] = 11;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 1;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = 0;\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'tids';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('副栏目');\n\t\t\t\t$w['tips'] = JZLANG('绑定后可以在当前模型的其他栏目中显示');\n\t\t\t\t$w['fieldtype'] = 18;\n\t\t\t\t$w['fieldlong'] = 255;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'keywords';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('关键词');\n\t\t\t\t$w['tips'] = JZLANG('每个词用英文逗号(,)拼接');\n\t\t\t\t$w['fieldtype'] = 1;\n\t\t\t\t$w['fieldlong'] = 255;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'tags';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = 'TAG';\n\t\t\t\t$w['tips'] = JZLANG('每个词用英文逗号(,)拼接');\n\t\t\t\t$w['fieldtype'] = 19;\n\t\t\t\t$w['fieldlong'] = 255;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'litpic';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('缩略图');\n\t\t\t\t$w['tips'] = JZLANG('可留空');\n\t\t\t\t$w['fieldtype'] = 5;\n\t\t\t\t$w['fieldlong'] = 255;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'description';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('简介');\n\t\t\t\t$w['tips'] = JZLANG('可留空');\n\t\t\t\t$w['fieldtype'] = 2;\n\t\t\t\t$w['fieldlong'] = 500;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'body';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('内容');\n\t\t\t\t$w['tips'] = JZLANG('可留空');\n\t\t\t\t$w['fieldtype'] = 3;\n\t\t\t\t$w['fieldlong'] = 500;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'member_id';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('发布会员');\n\t\t\t\t$w['tips'] = JZLANG('前台发布会员ID记录');\n\t\t\t\t$w['fieldtype'] = 13;\n\t\t\t\t$w['fieldlong'] = 11;\n\t\t\t\t$w['body'] = '3,username';\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 0;\n\t\t\t\t$w['isadmin'] = 0;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '0';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'userid';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('管理员');\n\t\t\t\t$w['tips'] = JZLANG('后台发布管理员ID记录');\n\t\t\t\t$w['fieldtype'] = 13;\n\t\t\t\t$w['fieldlong'] = 11;\n\t\t\t\t$w['body'] = '11,name';\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 0;\n\t\t\t\t$w['isadmin'] = 0;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '0';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'target';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('外链URL');\n\t\t\t\t$w['tips'] = JZLANG('默认为空，系统访问内容则直接跳转到此链接');\n\t\t\t\t$w['fieldtype'] = 1;\n\t\t\t\t$w['fieldlong'] = 255;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 0;\n\t\t\t\t$w['isadmin'] = 0;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'ownurl';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('自定义URL');\n\t\t\t\t$w['tips'] = JZLANG('默认为空，自定义URL');\n\t\t\t\t$w['fieldtype'] = 1;\n\t\t\t\t$w['fieldlong'] = 255;\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 0;\n\t\t\t\t$w['isadmin'] = 0;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'hits';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('点击量');\n\t\t\t\t$w['tips'] = JZLANG('系统自动添加');\n\t\t\t\t$w['fieldtype'] = 4;\n\t\t\t\t$w['fieldlong'] = 11;\n\t\t\t\t$w['body'] = '';\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 0;\n\t\t\t\t$w['isadmin'] = 0;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '0';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'comment_num';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('评论数');\n\t\t\t\t$w['tips'] = JZLANG('系统自带');\n\t\t\t\t$w['fieldtype'] = 4;\n\t\t\t\t$w['fieldlong'] = 11;\n\t\t\t\t$w['body'] = '';\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 0;\n\t\t\t\t$w['isadmin'] = 0;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '0';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'zan';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('点赞数');\n\t\t\t\t$w['tips'] = JZLANG('系统自带');\n\t\t\t\t$w['fieldtype'] = 4;\n\t\t\t\t$w['fieldlong'] = 11;\n\t\t\t\t$w['body'] = '';\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 0;\n\t\t\t\t$w['isadmin'] = 0;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '0';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'orders';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('排序');\n\t\t\t\t$w['tips'] = JZLANG('系统自带');\n\t\t\t\t$w['fieldtype'] = 4;\n\t\t\t\t$w['fieldlong'] = 11;\n\t\t\t\t$w['body'] = '';\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = '0';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'addtime';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('添加时间');\n\t\t\t\t$w['tips'] = JZLANG('选择时间');\n\t\t\t\t$w['fieldtype'] = 11;\n\t\t\t\t$w['fieldlong'] = 11;\n\t\t\t\t$w['format'] = 'date_2';\n\t\t\t\t$w['body'] = '';\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = '0';\n\t\t\t\tM('fields')->add($w);\n                $w['field'] = 'updatetime';\n                $w['molds'] = $data['biaoshi'];\n                $w['fieldname'] = JZLANG('更新时间');\n                $w['tips'] = JZLANG('选择时间');\n                $w['fieldtype'] = 11;\n                $w['fieldlong'] = 11;\n                $w['format'] = 'date_2';\n                $w['body'] = '';\n                $w['ismust'] = 0;\n                $w['isshow'] = 1;\n                $w['isadmin'] = 1;\n                $w['issearch'] = 0;\n                $w['islist'] = 1;\n                $w['vdata'] = '0';\n                M('fields')->add($w);\n                $id = M('molds')->getField(['biaoshi'=>'attr'],'id');\n\t\t\t\t$w['field'] = 'jzattr';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('推荐属性');\n\t\t\t\t$w['tips'] = JZLANG('1置顶2热点3推荐');\n\t\t\t\t$w['fieldtype'] = 16;\n\t\t\t\t$w['fieldlong'] = 50;\n\t\t\t\t$w['format'] = NULL;\n\t\t\t\t$w['body'] = $id.',name';\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 0;\n\t\t\t\t$w['islist'] = 0;\n\t\t\t\t$w['vdata'] = '0';\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'isshow';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('是否显示');\n\t\t\t\t$w['tips'] = JZLANG('显示隐藏');\n\t\t\t\t$w['fieldtype'] = 7;\n\t\t\t\t$w['fieldlong'] = 1;\n\t\t\t\t$w['format'] = NULL;\n\t\t\t\t$w['body'] = JZLANG('显示=1,未审=0,退回=2');\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 1;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = 1;\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'istop';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('是否置顶');\n\t\t\t\t$w['tips'] = JZLANG('置顶显示');\n\t\t\t\t$w['fieldtype'] = 7;\n\t\t\t\t$w['fieldlong'] = 1;\n\t\t\t\t$w['format'] = NULL;\n\t\t\t\t$w['body'] = JZLANG('是=1,否=0');\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 1;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = 0;\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'ishot';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('是否热门');\n\t\t\t\t$w['tips'] = JZLANG('热门显示');\n\t\t\t\t$w['fieldtype'] = 7;\n\t\t\t\t$w['fieldlong'] = 1;\n\t\t\t\t$w['format'] = NULL;\n\t\t\t\t$w['body'] = JZLANG('是=1,否=0');\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 1;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = 0;\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t$w['field'] = 'istuijian';\n\t\t\t\t$w['molds'] = $data['biaoshi'];\n\t\t\t\t$w['fieldname'] = JZLANG('是否推荐');\n\t\t\t\t$w['tips'] = JZLANG('推荐显示');\n\t\t\t\t$w['fieldtype'] = 7;\n\t\t\t\t$w['fieldlong'] = 1;\n\t\t\t\t$w['format'] = NULL;\n\t\t\t\t$w['body'] = JZLANG('是=1,否=0');\n\t\t\t\t$w['ismust'] = 0;\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t$w['isadmin'] = 1;\n\t\t\t\t$w['issearch'] = 1;\n\t\t\t\t$w['islist'] = 1;\n\t\t\t\t$w['vdata'] = 0;\n\t\t\t\tM('fields')->add($w);\n\t\t\t\t\n\t\t\t\t//添加权限管理\n\t\t\t\tif(strlen($data['name'])>12){\n\t\t\t\t\t$ruler['name'] = $data['name'];\n\t\t\t\t}else{\n\t\t\t\t\t$ruler['name'] = $data['name'].JZLANG('列表');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$ruler['fc'] = 'Extmolds/index/molds/'.$data['biaoshi'];\n\t\t\t\t$ruler['pid'] = 77;\n\t\t\t\t$ruler['isdesktop'] = 1;\n\t\t\t\t$m_id = M('Ruler')->add($ruler);\n\t\t\t\t$ruler['isdesktop'] = 0;\n\t\t\t\t$ruler['name'] = JZLANG('新增').$data['name'];\n\t\t\t\t$ruler['fc'] = 'Extmolds/addmolds/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t$ruler['name'] = JZLANG('修改').$data['name'];\n\t\t\t\t$ruler['fc'] = 'Extmolds/editmolds/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t$ruler['name'] = JZLANG('复制').$data['name'];\n\t\t\t\t$ruler['fc'] = 'Extmolds/copymolds/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t$ruler['name'] = JZLANG('删除').$data['name'];\n\t\t\t\t$ruler['fc'] = 'Extmolds/deletemolds/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t$ruler['name'] = JZLANG('批量删除').$data['name'];\n\t\t\t\t$ruler['fc'] = 'Extmolds/deleteAll/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t$ruler['name'] = JZLANG('批量修改').$data['name'].JZLANG('栏目');\n\t\t\t\t$ruler['fc'] = 'Extmolds/changeType/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t$ruler['name'] = JZLANG('批量复制').$data['name'];\n\t\t\t\t$ruler['fc'] = 'Extmolds/copyAll/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\tif(strlen($data['name'])>12){\n\t\t\t\t\t$ruler['name'] = JZLANG('批量修改').$data['name'];\n\t\t\t\t}else{\n\t\t\t\t\t$ruler['name'] = JZLANG('批量修改').$data['name'].JZLANG('列表');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$ruler['fc'] = 'Extmolds/editOrders/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t$ruler['name'] = JZLANG('批量审核').$data['name'];\n\t\t\t\t$ruler['fc'] = 'Extmolds/checkAll/molds/'.$data['biaoshi'];\n\t\t\t\tM('Ruler')->add($ruler);\n                $ruler['name'] = JZLANG('批量修改推荐属性').$data['name'];\n                $ruler['fc'] = 'Extmolds/changeAttribute/molds/'.$data['biaoshi'];\n                M('Ruler')->add($ruler);\n\t\t\t\t\n\t\t\t\t//写入左侧导航栏\n\t\t\t\t$dao = M('Layout')->find(array('gid'=>$_SESSION['admin']['gid']));\n\t\t\t\tif(!$dao){\n\t\t\t\t\t$dao = M('Layout')->find(array('isdefault'=>1));\n\t\t\t\t}\n\t\t\t\t$left_layout = json_decode($dao['left_layout'],1);\n\t\t\t\t$left_layout[]=[\n\t\t\t\t\t\"name\" => $data['name'].JZLANG('管理'),\n\t\t\t\t\t\"icon\" => '&amp;#xe6cb;',\n\t\t\t\t\t\"nav\" => array([\n\t\t\t\t\t\t\"title\"=>$data['name'],\n\t\t\t\t\t\t\"icon\"=>'',\n\t\t\t\t\t\t\"value\"=>$m_id,\n\t\t\t\t\t\t\n\t\t\t\t\t])\n\t\t\t\t];\n\t\t\t\t$left_layout = json_encode($left_layout,JSON_UNESCAPED_UNICODE);\n\t\t\t\tM('layout')->update(['id'=>$dao['id']],['left_layout'=>$left_layout]);\n\t\t\t\tif($data['ismust']==1 && $data['isshowclass']==1){\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增模型成功，快去创建对应的栏目吧！'),'url'=>U('Classtype/addclass',['biaoshi'=>$data['biaoshi']])));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('新增模型成功，快去设置表字段吧！'),'url'=>U('Fields/index',['molds'=>$data['biaoshi']])));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('新增模型失败！')));\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t$this->display('molds-add');\n\t}\n\n\tfunction editMolds(){\n\t\t$this->data = M('Molds')->find(array('id'=>$this->frparam('id')));\n\t\tif($this->frparam('go',1)==1){\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['orders'] = $this->frparam('orders');\n\t\t\t$data['iscontrol'] = $this->frparam('iscontrol');\n\t\t\t$data['isopen'] = $this->frparam('isopen');\n\t\t\t$data['ismust'] = $this->frparam('ismust');\n\t\t\t$data['isclasstype'] = $this->frparam('isclasstype');\n\t\t\t$data['isshowclass'] = $this->frparam('isshowclass');\n\t\t\t$data['list_html'] = $this->frparam('list_html',1);\n\t\t\t$data['details_html'] = $this->frparam('details_html',1);\n\t\t\t\n\t\t\t$data['biaoshi'] = $this->frparam('biaoshi',1);\n\t\t\t$data['ispreview'] = $this->frparam('ispreview',0,1);\n\t\t\t$data['ishome'] = $this->frparam('ishome');\n\t\t\tif($this->frparam('id')){\n\t\t\t\tif(!$data['biaoshi']){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('标识不能为空！')));\n\t\t\t\t\texit;\n\t\t\t\t}\n\t\t\t\t$molds = $this->data;\n\t\t\t\tif($molds['sys']==1 && $data['biaoshi']!=$molds['biaoshi']){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('系统模型标识不允许修改！')));\n\t\t\t\t\texit;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$data['biaoshi'] = strtolower($data['biaoshi']);\n\t\t\t\tif(M('Molds')->update(array('id'=>$this->frparam('id')),$data)){\n\t\t\t\t\t//检测是否表名改变\n\t\t\t\t\tif($this->data['biaoshi']!=$data['biaoshi']){\n\t\t\t\t\t\t//修改表名\n\t\t\t\t\t\t$sql = \"RENAME TABLE `\".DB_PREFIX.$molds['biaoshi'].\"` TO `\".DB_PREFIX.$data['biaoshi'].\"` \";\n\t\t\t\t\t\t$x = M()->runSql($sql);\n\t\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('index')));\n\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('index')));\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('页面有错误，缺少模块ID！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t$this->display('molds-edit');\n\t\t\n\t}\n\n\tfunction deleteMolds(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t\n\t\t\t//检查表里面是否有数据\n\t\t\t$molds = M('Molds')->find(['id'=>$id]);\n\t\t\t$nums = M($molds['biaoshi'])->getCount();\n\t\t\tif($nums){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>$molds['name'].JZLANG('里面存在数据，请先清空表内数据！')));\n\t\t\t}\n\t\t\tif($molds['sys']==1){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>$molds['name'].JZLANG('是系统模型，不允许删除！')));\n\t\t\t}\n\t\t\tif(M('Molds')->delete('id='.$id)){\n\t\t\t\t//删除表\n\t\t\t\t$sql = \"DROP TABLE IF EXISTS `\".DB_PREFIX.$molds['biaoshi'].\"`\";\n\t\t\t\t$x = M()->runSql($sql);\n\t\t\t\t\n\t\t\t\t//清空字段管理中的字段\n\t\t\t\tif(M('Fields')->find(array('molds'=>$molds['biaoshi']))){\n\t\t\t\t\t$re = M('Fields')->delete(array('molds'=>$molds['biaoshi']));\n\t\t\t\t\tif(!$re){\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('字段表记录未清除，请手动清除！')));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t//删除权限管理\n\t\t\t\t$ruler['fc'] = 'Extmolds/index/molds/'.$molds['biaoshi'];\n\t\t\t\t//$ruler['pid'] = 77;\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/addmolds/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/editmolds/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/copymolds/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/deletemolds/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/deleteAll/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/editOrders/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/changeType/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/copyAll/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t$ruler['fc'] = 'Extmolds/checkAll/molds/'.$molds['biaoshi'];\n\t\t\t\tM('Ruler')->delete($ruler);\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction restrucFields(){\n\t\t\n\t\t$molds = $this->frparam('molds',1);\n        //默认数据类型\n        $default = [\n            'title'=>[\n                'field'=>'title',\n                'title'=>JZLANG('标题'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>1,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(255)',\n            ],\n            'tid'=>[\n                'field'=>'tid',\n                'title'=>JZLANG('所属栏目'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>17,\n                'length'=>11,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'int(11)',\n            ],\n\t\t\t'tids'=>[\n                'field'=>'tids',\n                'title'=>JZLANG('副栏目'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>0,\n                'fieldtype'=>18,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(255)',\n            ],\n            'body'=>[\n                'field'=>'body',\n                'title'=>JZLANG('内容'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>0,\n                'fieldtype'=>3,\n                'length'=>0,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'mediumtext',\n            ],\n            'keywords'=>[\n                'field'=>'keywords',\n                'title'=>JZLANG('关键词'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>0,\n                'fieldtype'=>1,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(255)',\n            ],\n            'litpic'=>[\n                'field'=>'litpic',\n                'title'=>JZLANG('缩略图'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>5,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(255)',\n            ],\n            'description'=>[\n                'field'=>'description',\n                'title'=>JZLANG('简介'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>0,\n                'fieldtype'=>2,\n                'length'=>0,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(1000)',\n            ],\n            'molds'=>[\n                'field'=>'molds',\n                'title'=>JZLANG('模型'),\n                'isshow'=>1,\n                'isadmin'=>0,\n                'islist'=>0,\n                'fieldtype'=>15,\n                'length'=>50,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(50)',\n            ],\n            'userid'=>[\n                'field'=>'userid',\n                'title'=>JZLANG('管理员'),\n                'isshow'=>1,\n                'isadmin'=>0,\n                'islist'=>0,\n                'fieldtype'=>15,\n                'length'=>11,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'int(11)',\n            ],\n            'orders'=>[\n                'field'=>'orders',\n                'title'=>JZLANG('排序'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>4,\n                'length'=>4,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'int(4)',\n            ],\n            'member_id'=>[\n                'field'=>'member_id',\n                'title'=>JZLANG('用户'),\n                'isshow'=>1,\n                'isadmin'=>0,\n                'islist'=>0,\n                'fieldtype'=>15,\n                'length'=>11,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'int(11)',\n            ],\n            'comment_num'=>[\n                'field'=>'comment_num',\n                'title'=>JZLANG('评论数'),\n                'isshow'=>1,\n                'isadmin'=>0,\n                'islist'=>0,\n                'fieldtype'=>4,\n                'length'=>11,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'int(11)',\n            ],\n            'htmlurl'=>[\n                'field'=>'htmlurl',\n                'title'=>JZLANG('栏目链接'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>0,\n                'fieldtype'=>1,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(255)',\n            ],\n            'isshow'=>[\n                'field'=>'isshow',\n                'title'=>JZLANG('是否显示'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>7,\n                'length'=>1,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'tinyint(1)',\n            ],\n\t\t\t'istop'=>[\n                'field'=>'istop',\n                'title'=>JZLANG('是否置顶'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>7,\n                'length'=>1,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'tinyint(1)',\n            ],\n\t\t\t'ishot'=>[\n                'field'=>'ishot',\n                'title'=>JZLANG('是否热门'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>7,\n                'length'=>1,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'tinyint(1)',\n            ],\n\t\t\t'istuijian'=>[\n                'field'=>'istuijian',\n                'title'=>JZLANG('是否推荐'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>7,\n                'length'=>1,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'tinyint(1)',\n            ],\n            'target'=>[\n                'field'=>'target',\n                'title'=>JZLANG('外链'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>0,\n                'fieldtype'=>1,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(255)',\n            ],\n            'ownurl'=>[\n                'field'=>'ownurl',\n                'title'=>JZLANG('自定义链接'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>0,\n                'fieldtype'=>1,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(255)',\n            ],\n            'hits'=>[\n                'field'=>'hits',\n                'title'=>JZLANG('点击量'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>4,\n                'length'=>11,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'int(11)',\n            ],\n            'zan'=>[\n                'field'=>'zan',\n                'title'=>JZLANG('点赞数'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>4,\n                'length'=>11,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'int(11)',\n            ],\n            'tags'=>[\n                'field'=>'tags',\n                'title'=>'Tags',\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>0,\n                'fieldtype'=>19,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(255)',\n            ],\n            'jzattr'=>[\n                'field'=>'jzattr',\n                'title'=>JZLANG('推荐属性'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>16,\n                'length'=>255,\n\t\t\t\t'default'=>null,\n\t\t\t\t'type'=>'varchar(50)',\n            ],\n\t\t\t'addtime'=>[\n                'field'=>'addtime',\n                'title'=>JZLANG('发布时间'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>11,\n                'length'=>11,\n\t\t\t\t'default'=>0,\n\t\t\t\t'type'=>'int(11)',\n            ],\n            'updatetime'=>[\n                'field'=>'updatetime',\n                'title'=>JZLANG('更新时间'),\n                'isshow'=>1,\n                'isadmin'=>1,\n                'islist'=>1,\n                'fieldtype'=>11,\n                'length'=>11,\n                'default'=>0,\n                'type'=>'int(11)',\n            ],\n        ];\n        $default_fields = array_column($default,'field');\n        if($_POST){\n            $field = $this->frparam('field',2);\n            $len = $this->frparam('len',2);\n            $title = $this->frparam('title',2);\n            $fieldtype = $this->frparam('fieldtype',2);\n            $isshow = $this->frparam('isshow',2);\n            $isadmin = $this->frparam('isadmin',2);\n            $islist = $this->frparam('islist',2);\n            $old = M('fields')->findAll(['molds'=>$molds]);\n            $ids = [];\n            if($old){\n                foreach ($old as $v){\n                    foreach ($field as $k=>$vv){\n                        if($vv==$v['field']){\n                            $ids[$k] = $v;\n                            $len[$k] = $v['fieldlong'];\n                        }\n                    }\n                }\n            }\n            $newfields = [];\n            foreach ($title as $k=>$v){\n                if(!$v){\n                    JsonReturn(['code'=>1,'msg'=>$field[$k]].JZLANG('字段名称不能为空！'));\n                }\n                $w = [];\n                $w['molds'] = $molds;\n                $w['field'] = $field[$k];\n                $w['fieldname'] = $v;\n                $w['fieldtype'] = $fieldtype[$k];\n                $w['fieldlong'] = $len[$k];\n                $w['isshow'] = $isshow[$k];\n                $w['isadmin'] = $isadmin[$k];\n                $w['islist'] = $islist[$k];\n                if(isset($ids[$k])){\n                    M('fields')->update(['id'=>$ids[$k]['id']],$w);\n                }else{\n                    switch ($w['field']){\n                        case 'isshow':\n                            $w['body'] = JZLANG('显示=1,未审=0,退回=2');\n                            break;\n                        case 'islist':\n                        case 'isadmin':\n                            $w['body'] = JZLANG('显示=1,隐藏=0');\n                            break;\n                        case 'jzattr':\n                            $id = M('molds')->getField(['biaoshi'=>'attr'],'id');\n                            if($id){\n                                $w['body'] = $id.',name';\n                            }\n                            break;\n                        case 'member_id':\n                            $id = M('molds')->getField(['biaoshi'=>'member'],'id');\n                            if($id){\n                                $w['body'] = $id.','.'username';\n                            }\n                            break;\n                        case 'userid':\n                            $id = M('molds')->getField(['biaoshi'=>'level'],'id');\n                            if($id){\n                                $w['body'] = $id.','.'name';\n                            }\n                            break;\n\n                    }\n\n                    M('fields')->add($w);\n                }\n\n                if(!in_array($field[$k],$default_fields)){\n                    $newfields = $default[$field[$k]];\n                }\n\n            }\n            if(count($newfields)){\n                foreach ($newfields as $v){\n                    $w = [];\n                    $w['molds'] = $molds;\n                    $w['field'] = $v['field'];\n                    $w['fieldname'] = $v['title'];\n                    $w['fieldtype'] = $v['fieldtype'];\n                    $w['fieldlong'] = $v['length'];\n                    $w['isshow'] = $v['isshow'];\n                    $w['isadmin'] = $v['isadmin'];\n                    $w['islist'] = $v['islist'];\n                    $w['tips'] = $v['title'];\n\t\t\t\t\t$w['vdata'] = $v['default'];\n                    switch ($w['field']){\n                        case 'isshow':\n                            $w['body'] = JZLANG('显示=1,隐藏=0,退回=2');\n                            break;\n                        case 'islist':\n                        case 'isadmin':\n                            $w['body'] = JZLANG('显示=1,隐藏=0');\n                            break;\n                        case 'jzattr':\n                            $id = M('molds')->getField(['biaoshi'=>'attr'],'id');\n                            if($id){\n                                $w['body'] = $id.',name';\n                            }\n                            break;\n                        case 'istop':\n                            $w['body'] = JZLANG('是=1,否=0');\n                            break;\n                        case 'member_id':\n                            $id = M('molds')->getField(['biaoshi'=>'member'],'id');\n                            if($id){\n                                $w['body'] = $id.','.'username';\n                            }\n                            break;\n                        case 'userid':\n                            $id = M('molds')->getField(['biaoshi'=>'level'],'id');\n                            if($id){\n                                $w['body'] = $id.','.'name';\n                            }\n                            break;\n\n                    }\n                    M('fields')->add($w);\n                }\n            }\n\t\t\t$fields = $this->getTableFields($molds);\n\t\t\t\n\t\t\t$nowfields = array_column($fields,'field');\n\t\t\t$res = array_diff($default_fields,$nowfields);\n\t\t\t$sqls = '';\n\t\t\tforeach($res as $vv){\n\t\t\t\tif($vv){\n\t\t\t\t\t\n\t\t\t\t\t//添加字段\n\t\t\t\t\t$sql=\"ALTER TABLE \".DB_PREFIX.$molds.\" ADD \".$default[$vv]['field'].\" \".$default[$vv]['type'].\" DEFAULT \";\n\t\t\t\t\tif(strpos($default[$vv]['type'],'int')!==false){\n\t\t\t\t\t\t$sql.=\" 0;\";\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$sql.=\" NULL; \";\n\t\t\t\t\t}\n\t\t\t\t\t$sqls.=$sql;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tif($sqls){\n\t\t\t\t\n\t\t\t\tM()->runSql($sqls);\n\t\t\t}\n\t\t\t\n\t\t\t//权限检查\n\t\t\tif(!in_array($molds,['article','product','tags'])){\n\t\t\t\tif(!M('ruler')->find(['fc'=>'Extmolds/index/molds/'.$molds])){\n\t\t\t\t\t//添加权限管理\n\t\t\t\t\t$data = M('molds')->find(['biaoshi'=>$molds]);\n\t\t\t\t\t$ruler['name'] = $data['name'].JZLANG('列表');\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/index/molds/'.$data['biaoshi'];\n\t\t\t\t\t$ruler['pid'] = 77;\n\t\t\t\t\t$ruler['isdesktop'] = 1;\n\t\t\t\t\t$m_id = M('Ruler')->add($ruler);\n\t\t\t\t\t$ruler['isdesktop'] = 0;\n\t\t\t\t\t$ruler['name'] = JZLANG('新增').$data['name'];\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/addmolds/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t\t$ruler['name'] = JZLANG('修改').$data['name'];\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/editmolds/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t\t$ruler['name'] = JZLANG('复制').$data['name'];\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/copymolds/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t\t$ruler['name'] = JZLANG('删除').$data['name'];\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/deletemolds/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t\t$ruler['name'] = JZLANG('批量删除').$data['name'];\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/deleteAll/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t\t$ruler['name'] = JZLANG('批量修改').$data['name'].JZLANG('栏目');\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/changeType/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t\t$ruler['name'] = JZLANG('批量复制').$data['name'];\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/copyAll/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t\tif(strlen($data['name'])>12){\n\t\t\t\t\t\t$ruler['name'] = JZLANG('批量修改').$data['name'];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$ruler['name'] = JZLANG('批量修改').$data['name'].JZLANG('列表');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/editOrders/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t\t$ruler['name'] = JZLANG('批量审核').$data['name'];\n\t\t\t\t\t$ruler['fc'] = 'Extmolds/checkAll/molds/'.$data['biaoshi'];\n\t\t\t\t\tM('Ruler')->add($ruler);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n            JsonReturn(['code'=>0,'msg'=>JZLANG('重构成功！'),'url'=>U('Fields/index',['molds'=>$molds])]);\n\n\n\n        }\n        $fields = $this->getTableFields($molds);\n\n\t\tforeach ($fields as &$v){\n\t\t    foreach ($default as $kk=>$vv){\n\t\t        if($kk==$v['field']){\n\t\t            $v = array_merge($v,$vv);\n                }\n            }\n        }\n\t\t\n\t\t$nowfields = array_column($fields,'field');\n\t\t$res = array_diff($default_fields,$nowfields);\n\t\t\n\t\tforeach($res as $vv){\n\t\t\t$fields[]=$default[$vv];\n\t\t\t\n\t\t}\n\t\t\n        $fieldstype = [\n            1=>JZLANG('单行文本'),\n            2=>JZLANG('多行文本'),\n            3=>JZLANG('文本编辑器'),\n            4=>JZLANG('数字'),\n            5=>JZLANG('单图片'),\n            6=>JZLANG('多图片'),\n            7=>JZLANG('单选下拉'),\n            8=>JZLANG('多选'),\n            9=>JZLANG('单附件'),\n            10=>JZLANG('多附件'),\n            11=>JZLANG('时间戳'),\n            12=>JZLANG('单选按钮'),\n            13=>JZLANG('单选关联'),\n            14=>JZLANG('小数'),\n            15=>JZLANG('多行录入'),\n            16=>JZLANG('多选关联'),\n            17=>JZLANG('系统栏目'),\n            18=>JZLANG('系统副栏目'),\n            19=>JZLANG('系统TAG'),\n            20=>JZLANG('栏目绑定多选'),\n            21=>JZLANG('栏目绑定单选'),\n        ];\n\t\t$this->molds = $molds;\n        $this->fieldstype = $fieldstype;\n        $this->fields = $fields;\n        $this->display('restrucfields');\n\t\t\n\t}\n\n    private function getTableFields($table){\n\t\t$sql=\"select distinct * from information_schema.columns where table_schema = '\".DB_NAME.\"' and  table_name = '\".DB_PREFIX.$table.\"'\";\n       // $sql = 'SHOW COLUMNS FROM '.DB_PREFIX.$table;\n        $list = M()->findSql($sql);\n        $isgo = true;\n        $fields = [];\n\t\t\n        foreach($list as $v){\n\t\t\t$len = 0;\n\t\t\t$s = preg_match('/\\((.*)\\)/',$v['COLUMN_TYPE'],$math);\n\t\t\tif($s){\n\t\t\t\t$len = $math[1];\n\t\t\t}\n\t\t\tif($v['COLUMN_NAME']!='id'){\n\t\t\t\t$fields[]=[\n\t\t\t\t\t'field'=>$v['COLUMN_NAME'],\n\t\t\t\t\t'type'=>$v['COLUMN_TYPE'],\n\t\t\t\t\t'datatype'=>$v['DATA_TYPE'],\n\t\t\t\t\t'fieldtype'=>1,\n\t\t\t\t\t'comment'=>$v['COLUMN_COMMENT'],\n\t\t\t\t\t'title' => $v['COLUMN_COMMENT'] ? $v['COLUMN_COMMENT'] : $v['COLUMN_NAME'],\n\t\t\t\t\t'isshow'=>1,\n\t\t\t\t\t'isadmin'=>1,\n\t\t\t\t\t'islist'=>1,\n\t\t\t\t\t'default'=>$v['COLUMN_DEFAULT'],\n\t\t\t\t\t'length'=>$len\n\t\t\t\t ];\n\t\t\t}\n            \n\n        }\n        return $fields;\n\n    }\n\n\n\n\n\n\n\n\n\n\n}"
  },
  {
    "path": "app/admin/c/OrderController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass OrderController extends CommonController\n{\n\n\n\tfunction index(){\n\t\t\n\t\t$this->endtime = $this->frparam('end',1);\n\t\t$this->starttime = $this->frparam('start',1);\n\t\t$this->orderno = $this->frparam('orderno',1);\n\t\t$this->username = $this->frparam('username',1);\t\n\t\t$this->tel = $this->frparam('tel',1);\n\t\t$this->isshow = $this->frparam('isshow');\n\t\t$this->tid = $this->frparam('tid');\n\t\t$this->paytype = $this->frparam('paytype',1);\n\t\t\n        $this->classtypes = $this->classtypetree;\n\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>'orders','islist'=>1),'orders desc');\n\t\t$data = $this->frparam();\n\t\t$res = molds_search('orders',$data);\n\t\t$get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n\t\t$this->fields_search = $res['fields_search'];\n\t\t\n\t\tif($this->frparam('ajax')){\n\t\t\t$sql = ' 1=1 and ptype=1 ';\n\t\t\t$classtypedata = $this->classtypedata;\n\t\t\tif($this->frparam('start',1)){\n\t\t\t\t$starttime = strtotime($this->frparam('start',1));\n\t\t\t\t$sql .= \" and addtime >= \".$starttime;\n\t\t\t}\n\t\t\tif($this->frparam('end',1)){\n\t\t\t\t$endtime = strtotime($this->frparam('end',1).' 23:59:59');\n\t\t\t\t$sql .=\" and addtime <= \".$endtime;\n\t\t\t}\n\t\t\tif($this->frparam('orderno',1)){\n\t\t\t\t$sql .= \" and orderno like '%\".$this->frparam('orderno',1).\"%' \";\n\t\t\t}\n\t\t\t\n\t\t\tif($this->frparam('username',1)){\n\t\t\t\t$sql .= \" and username like '%\".$this->frparam('username',1).\"%' \";\n\t\t\t}\n\t\t\tif($this->frparam('tid')){\n\t\t\t\t$sql .= \" and tid=\".$this->frparam('tid').\" \";\n\t\t\t}\n\t\t\tif($this->frparam('paytype',1)){\n\t\t\t\t$sql .= \" and paytype='\".$this->frparam('paytype',1).\"' \";\n\t\t\t}\n\t\t\tif($this->frparam('isshow')){\n\t\t\t\t$isshow = $this->frparam('isshow')==7 ? 0 : $this->frparam('isshow');\n\t\t\t\t$sql .= \" and isshow=\".$isshow.\" \";\n\t\t\t}\n\t\t\tif($this->frparam('tel',1)){\n\t\t\t\t$sql .= \" and tel like '%\".$this->frparam('tel',1).\"%' \";\n\t\t\t}\n\t\t\t$sql .= $get_sql;\n\t\t\t\n\t\t\t$page = new Page('Orders');\n\t\t\t$pagelist = $page->where($sql)->orderby('addtime desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t\n\t\t\t$ajaxdata = [];\n\t\t\t$overpay_num = 0;\n\t\t\t$notpay_num = 0;\n\t\t\t$allmoney = 0.00;\n\t\t\t$newdata = M('orders')->findAll($sql);\n\t\t\tforeach($newdata as $v){\n\t\t\t\tif($v['ispay']==1){\n\t\t\t\t\t$overpay_num+=1;\n\t\t\t\t\t$allmoney+=$v['price'];\n\t\t\t\t}else{\n\t\t\t\t\t$notpay_num+=1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tforeach($pagelist as $k=>$v){\n\t\t\t\t\n\t\t\t\t$v['new_tid'] = $v['tid']!=0 ? $classtypedata[$v['tid']]['classname']:'-';\n\t\t\t\tswitch($v['isshow']){\n\t\t\t\t\tcase 1:\n\t\t\t\t\t$v['new_isshow'] = '<span class=\"layui-badge\">'.JZLANG('待付款').'</span>';\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t$v['new_isshow'] = '<span class=\"layui-badge layui-bg-green\">'.JZLANG('已付').'</span>';\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t$v['new_isshow'] = '<span class=\"layui-badge layui-bg-orange\">'.JZLANG('超时').'</span>';\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t$v['new_isshow'] = '<span class=\"layui-badge\">'.JZLANG('待审核待支付').'</span>';\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t$v['new_isshow'] = '<span class=\"layui-badge layui-bg-black\">'.JZLANG('已发货').'</span>';\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 6:\n\t\t\t\t\t$v['new_isshow'] = '<span class=\"layui-badge layui-bg-gray\">'.JZLANG('已废弃').'</span>';\n\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t$v['new_isshow'] = '<span class=\"layui-badge layui-bg-blue\">'.JZLANG('被删除').'</span>';\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$v['new_addtime'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t\t$v['new_ispay'] = $v['ispay']==1 ? '<span class=\"layui-badge layui-bg-green\">'.JZLANG('已付').'</span>' : '<span class=\"layui-badge\">'.JZLANG('未付').'</span>';\n\t\t\t\t\n\t\t\t\t$v['edit_url'] = U('details',array('id'=>$v['id']));\n\t\t\t\t$v['new_paytime'] = $v['paytime']==0?'-':date('Y-m-d H:i:s',$v['paytime']);\n\t\t\t\tforeach($this->fields_list as $vv){\n\t\t\t\t\t$v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n\t\t\t\t}\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->lists = $pagelist;\n\t\t\t$this->pages = $pages;\n\t\t\t$this->sum = $page->sum;\n\t\t\t//统计\n\t\t\t$all = $page->sum;\n\t\t\t\n\t\t\t$this->all = $all;\n\t\t\t$this->overpay_num = $overpay_num;\n\t\t\t$this->notpay_num = $notpay_num;\n\t\t\t$this->allmoney = round($allmoney,2);\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum,'overpay_num'=>$this->overpay_num,'notpay_num'=>$this->notpay_num,'allmoney'=>$this->allmoney,'all'=>$this->all]);\n\t\t}\n\t\t\n\t\t\n\t\t\n        \n    \t$this->display('order-list');\n    \n    }\n\t\n\tfunction details(){\n\t\t$this->fields_biaoshi = 'orders';\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('Orders')->find(['id'=>$id]);\n\t\t\tif($_POST){\n\t\t\t\t//检测更改状态\n\t\t\t\t$isshow = $this->frparam('isshow');\n\t\t\t\tif($data['isshow']!=$isshow && $isshow==5){\n\t\t\t\t\t//更改为已发货状态\n\t\t\t\t\t//检查邮件配置\n\t\t\t\t\tif($this->webconf['email_server'] && $this->webconf['email_port'] &&  $this->webconf['send_email'] &&  $this->webconf['send_pass'] && $this->webconf['isopenemail']==1){\n\t\t\t\t\t\t//检查客户是否提交邮箱\n\t\t\t\t\t\tif($data['receive_email']!=''){\n\t\t\t\t\t\t\t$title = JZLANG('您的订单发货通知').'-'.$this->webconf['web_name'];\n\t\t\t\t\t\t\tif($this->webconf['send_msg']!=''){\n\t\t\t\t\t\t\t\t$body = str_replace('{xxx}',$data['receive_username'],$this->webconf['send_msg']);\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t$body = JZLANG('尊敬的').$data['receive_username'].'，'.JZLANG('您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t$body.='<br/>'.JZLANG('订单详细信息如下：').'<br/>';\n\t\t\t\t\t\t\t$body.='<table style=\"min-width:500px\">\n\t\t\t\t\t\t\t<tr><th width=\"20%\">'.JZLANG('主图').'</th><th width=\"20%\">商品</th><th width=\"20%\">'.JZLANG('价格').'</th><th width=\"20%\">'.JZLANG('购买数量').'</th><th width=\"20%\">'.JZLANG('总价').'</th></tr>';\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tforeach(explode('||',$data['body']) as $v){\n\t\t\t\t\t\t\t\tif($v!=''){\n\t\t\t\t\t\t\t\t\t$d = explode('-',$v);\n\t\t\t\t\t\t\t\t\t//tid-id-num-price\n\t\t\t\t\t\t\t\t\tif($d[0]!=''){\n\t\t\t\t\t\t\t\t\t\t$type = $this->classtypedata[$d[0]];//栏目\n\t\t\t\t\t\t\t\t\t\t$product = M($type['molds'])->find(['id'=>$d[1]]);\n\t\t\t\t\t\t\t\t\t\t$body.='<tr><td width=\"20%\"><img width=\"200px\" src=\"'.get_domain().$product['litpic'].'\" /></td><td width=\"20%\">'.$product['title'].'</td><td width=\"20%\">￥'.$d[3].'元</td><td width=\"20%\">'.$d[2].'</td><td width=\"20%\">￥'.($d[3]*$d[2]).'元</td></tr>';\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t$body.='<tr><td>'.JZLANG('折扣：').'</td><td colspan=\"4\">￥'.$data['discount'].JZLANG('元').'</td></tr><tr><td>'.JZLANG('运费：').'</td><td colspan=\"4\">'.JZLANG('￥').$data['yunfei'].JZLANG('元').'</td></tr><tr><td>'.JZLANG('合计：').'</td><td colspan=\"4\">￥'.$data['price'].'元</td></tr></table><br/>';\n\t\t\t\t\t\t\t$body.=JZLANG('收件地址：').$data['receive_address'].' '.JZLANG('联系电话：').$data['receive_tel'];\n\t\t\t\t\t\t\tif($this->webconf['send_email']!=''){\n\t\t\t\t\t\t\t\tsend_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$data['receive_email'],$title,$body);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$paytime = $this->frparam('paytime',1)=='-' ? '-' : strtotime($this->frparam('paytime',1));\n\t\t\t\t$addtime = strtotime($this->frparam('addtime',1));\n\t\t\t\t\t$ww = $this->frparam();\n\t\t\t\t\t$ww['paytime'] = $ww['paytime']!='-' ? strtotime($ww['paytime']) : 0;\n\t\t\t\t\t$ww['addtime'] = strtotime($ww['addtime']);\n\t\t\t\t\t$ww['send_time'] = strtotime($ww['send_time']);\n\t\t\t\t\t$w = get_fields_data($ww,'orders');\n\t\t\t\t\t$w['ispay'] = $this->frparam('ispay',0,0);\n\t\t\t\t\t$w['isshow'] = $isshow;\n\t\t\t\t\t\n\t\t\t\t\tM('orders')->update(['id'=>$data['id']],$w);\n\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('操作成功！'),'paytime'=>$paytime,'addtime'=>$addtime]);\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t$this->data = $data;\n\t\t\t$this->display('order-details');\n\t\t}\n\t\t\n\t\t\n\t}\n\tfunction deleteorder(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t    $data = M('orders')->find(['id'=>$id]);\n\t\t\tif(M('orders')->delete(['id'=>$id])){\n                $w['molds'] = 'orders';\n                $w['data'] = serialize($data);\n                $w['title'] = '['.$data['id'].']'.$data['orderno'];\n                $w['addtime'] = time();\n                M('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\n//批量删除\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t    $list = M('Orders')->findAll('id in('.$data.')');\n\t\t\tif(M('Orders')->delete('id in('.$data.')')){\n                foreach ($list as $v) {\n                    $w['molds'] = 'orders';\n                    $w['data'] = serialize($v);\n                    $w['title'] = '['.$v['id'].']'.$v['orderno'];\n                    $w['addtime'] = time();\n                    M('recycle')->add($w);\n\t\t\t    }\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\n//充值列表\n   function czlist(){\n\n\t\t$this->endtime = $this->frparam('end',1);\n\t\t$this->starttime = $this->frparam('start',1);\n\t\t$this->orderno = $this->frparam('orderno',1);\n\t\t$this->username = $this->frparam('username',1);\t\n\t\t$this->tel = $this->frparam('tel',1);\t\n\t\t$this->type = $this->frparam('type');\t\n\t\t$this->buytype = $this->frparam('buytype',1);\t\n\t\t\n        $this->classtypes = $this->classtypetree;\n\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>'orders','islist'=>1),'orders desc');\n\t\t$data = $this->frparam();\n\t\t$get_sql = '';\n\t\t\n\t\tif($this->frparam('ajax')){\n\t\t\t$sql = ' 1=1 ';\n\t\t\t$classtypedata = $this->classtypedata;\n\t\t\tif($this->frparam('start',1)){\n\t\t\t\t$starttime = strtotime($this->frparam('start',1));\n\t\t\t\t$sql .= \" and addtime >= \".$starttime;\n\t\t\t}\n\t\t\tif($this->frparam('end',1)){\n\t\t\t\t$endtime = strtotime($this->frparam('end',1).' 23:59:59');\n\t\t\t\t$sql .=\" and addtime <= \".$endtime;\n\t\t\t}\n\t\t\tif($this->frparam('orderno',1)){\n\t\t\t\t$sql .= \" and orderno like '%\".$this->frparam('orderno',1).\"%' \";\n\t\t\t}\n\t\t\tif($this->frparam('buytype',1)){\n\t\t\t\t$sql .= \" and buytype='\".$this->frparam('buytype',1).\"' \";\n\t\t\t}\n\t\t\tif($this->frparam('username',1)){\n\t\t\t\t$userid = M('member')->getField(['username'=>$this->frparam('username',1)],'id');\n\t\t\t\tif($userid){\n\t\t\t\t\t$sql.= \" and userid=\".$userid;\n\t\t\t\t}else{\n\t\t\t\t\t$sql.=\" and userid=0 \";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif($this->frparam('tel',1)){\n\t\t\t\t$userid = M('member')->getField(['tel'=>$this->frparam('tel',1)],'id');\n\t\t\t\tif($userid){\n\t\t\t\t\t$sql.= \" and userid=\".$userid;\n\t\t\t\t}else{\n\t\t\t\t\t$sql.=\" and userid=0 \";\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$sql .= $get_sql;\n\t\t\t\n\t\t\t$page = new Page('buylog');\n\t\t\t$pagelist = $page->where($sql)->orderby('addtime desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t$ajaxdata = [];\n\t\t\t$chongzhi_num = 0;\n\t\t\t$rechange_num = 0;\n\t\t\t$allmoney = 0.00;\n\t\t\tforeach($pagelist as $k=>$v){\n\t\t\t\t$v['new_addtime'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t\tif($v['type']==1){\n\t\t\t\t\t$chongzhi_num += $v['money'];\n\t\t\t\t}\n\t\t\t\tif($v['type']==2){\n\t\t\t\t\t$rechange_num += $v['money'];\n\t\t\t\t}\n\t\t\t\tif($v['type']==3){\n\t\t\t\t\t$allmoney += $v['money'];\n\t\t\t\t}\n\t\t\t\t$v['username']  = memberInfo($v['userid'],'username');\n\t\t\t\t$v['new_buytype'] = $v['buytype']=='money'?JZLANG('钱包'):JZLANG('积分');\n\t\t\t\tif($v['type']==1){\n\t\t\t\t\t$v['new_type'] = JZLANG('充值');\n\t\t\t\t}else if($v['type']==2){\n\t\t\t\t\t$v['new_type'] = JZLANG('兑换');\n\t\t\t\t}else{\n\t\t\t\t\t$v['new_type'] = JZLANG('奖励');\n\t\t\t\t}\n \t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->lists = $pagelist;\n\t\t\t$this->pages = $pages;\n\t\t\t$this->sum = $page->sum;\n\t\t\t//统计\n\t\t\t$all = $page->sum;\n\t\t\t$this->all = $all;\n\t\t\t$this->chongzhi_num = round($chongzhi_num,2);\n\t\t\t$this->rechange_num = round($rechange_num,2);\n\t\t\t$this->allmoney = round($allmoney,2);\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum,'chongzhi_num'=>$this->chongzhi_num,'rechange_num'=>$this->rechange_num,'allmoney'=>$this->allmoney,'all'=>$this->all]);\n\t\t}\n\t\t\n\t\t\n\t\t$this->display('chongzhi-list');\n   }\n\n   function chongzhi(){\n\n   \t  if($_POST){\n   \t  \t\t$w['userid'] = $this->frparam('userid');\n   \t  \t\tif(!M('member')->find(['id'=>$w['userid']])){\n   \t  \t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('该用户不存在！')));\n   \t  \t\t}\n   \t  \t\t$w['buytype'] = $this->frparam('buytype',1);\n   \t  \t\t$w['type'] = $this->frparam('type');\n   \t  \t\t$w['msg'] = $this->frparam('msg',1);\n   \t  \t\t$w['addtime'] = time();\n   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n   \t  \t\t$w['amount'] = $this->frparam('amount');\n   \t  \t\tif($w['amount']<=0){\n   \t  \t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('充值数量不对！')));\n   \t  \t\t}\n   \t  \t\tif($w['buytype']=='money'){\n   \t  \t\t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n   \t  \t\t}else{\n   \t  \t\t\t$w['money'] = $w['amount']/($this->webconf['jifen_exchange']);\n   \t  \t\t}\n   \t  \t\t$r = M('buylog')->add($w);\n   \t  \t\tif($r){\n   \t  \t\t\tM('member')->goInc(['id'=>$w['userid']],$w['buytype'],$w['amount']);\n   \t  \t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('操作成功！')));\n   \t  \t\t}else{\n   \t  \t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('操作失败！')));\n   \t  \t\t}\n   \t  }\n   \t  $this->display('chongzhi-add');\n   }\n\n   function delbuylog(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t    $data = M('buylog')->find('id='.$id);\n\t\t\tif(M('buylog')->delete('id='.$id)){\n                $w['molds'] = 'buylog';\n                $w['data'] = serialize($data);\n                $w['title'] = '['.$data['id'].']'.$data['orderno'];\n                $w['addtime'] = time();\n                M('recycle')->add($w);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\n//批量删除\n\tfunction delAllbuylog(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t    $list = M('buylog')->delete('id in('.$data.')');\n\t\t\tif(M('buylog')->delete('id in('.$data.')')){\n\t\t\t    foreach ($list as $v){\n                    $w['molds'] = 'buylog';\n                    $w['data'] = serialize($v);\n                    $w['title'] = '['.$v['id'].']'.$v['orderno'];\n                    $w['addtime'] = time();\n                    M('recycle')->add($w);\n                }\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "app/admin/c/PluginsController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2019/08\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace app\\admin\\c;\r\n\r\n\r\nuse frphp\\extend\\Page;\r\nclass PluginsController extends CommonController\r\n{\r\n\t\r\n\tpublic function index(){\r\n\t\t//检查更新链接是否可以访问\r\n\t\t$webapi = $this->webconf['plugins_config'];\r\n\t\tif(!$webapi){\r\n\t\t\t$webapi = 'http://api.jizhicms.cn/plugins.php';\r\n\t\t\tif(!M('sysconfig')->find(['field'=>'plugins_config'])){\r\n\t\t\t\tM('sysconfig')->add(['title'=>JZLANG('插件配置'),'field'=>'plugins_config','type'=>2,'data'=>$webapi,'typeid'=>0]);\r\n\t\t\t\tsetCache('webconfig',null);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif($this->frparam('set')){\r\n            if($this->admin['isadmin']!=1){\r\n                JsonReturn(['code'=>1,'msg'=>JZLANG('非超级管理员无法设置！')]);\r\n            }\r\n\t\t\t$webapi = $this->frparam('webapi',1);\r\n\t\t\tM('sysconfig')->update(['field'=>'plugins_config'],['data'=>$webapi]);\r\n\t\t\tsetCache('webconfig',null);\r\n\t\t\tJsonReturn(['code'=>0,'msg'=>'配置成功！']);\r\n\t\t}\r\n\t\t$this->webapi = $webapi;\r\n\t\t$api = $webapi.'?version='.$this->webconf['web_version'];\r\n\t\t$ch = curl_init();\r\n\t\t$timeout = 5;\r\n\t\tcurl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);\r\n\t\tcurl_setopt($ch,CURLOPT_RETURNTRANSFER,1);\r\n\t\tcurl_setopt($ch, CURLOPT_HEADER, false);\r\n\t\tcurl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);\r\n\t\tcurl_setopt($ch,CURLOPT_URL,$api);\r\n\t\t$res = curl_exec($ch);\r\n\t\t$httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE);\r\n\t\tcurl_close($ch);\r\n\t\tif($httpcode==200){\r\n\t\t\t$isok = true;\r\n\t\t\t$res1 = json_decode($res,1);\r\n\t\t\tif($res1['code']!=0){\r\n\t\t\t\t$isok = false;\r\n\t\t\t}else{\r\n\t\t\t\t$allplugins = $res1['data'];\r\n\t\t\t}\r\n\t\t}else{\r\n\t\t\t$isok = false;\r\n\t\t}\r\n\t\t$this->title = $this->frparam('title',1,'');\r\n\t\tif($this->frparam('isdown')){\r\n\t\t\t$isdown = $this->frparam('isdown');\r\n\t\t\tswitch($isdown){\r\n\t\t\t\tcase 1:\r\n\t\t\t\t//本地-已下载\r\n\t\t\t\t\t$dir = APP_PATH.APP_HOME.'/exts';\r\n\t\t\t\t\t$fileArray=array();\r\n\t\t\t\t\tif (false != ($handle = opendir ( $dir ))) {\r\n\t\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\t\t\t\tif ($file != \".\" && $file != \"..\"  && strpos($file,'.')===false) {\r\n\t\t\t\t\t\t\t\t$fileArray[]=$file;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//关闭句柄\r\n\t\t\t\t\t\tclosedir ( $handle );\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$arraypage = new \\ArrayPage($fileArray);\r\n\t\t\t\t\t$data = $arraypage->query(['page'=>$this->frparam('page',0,1),'title'=>$this->title,'isdown'=>$this->frparam('isdown')])->setPage(['limit'=>$this->frparam('limit',0,10)])->go();\r\n                    $pls = M('plugins')->findAll();\r\n                    $plugins = [];\r\n                    foreach($pls as $k=>$v){\r\n                        $plugins[$v['filepath']] = $v;\r\n                    }\r\n\t\t\t\t\tforeach($data as $k=>$v){\r\n\t\t\t\t\t\t//已下载该插件\r\n\t\t\t\t\t\tif(!file_exists($dir.'/'.$v.'/config.php')){\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$config = require_once($dir.'/'.$v.'/config.php');\r\n                        if(isset($plugins[$v])){\r\n                            $data[$k] = $plugins[$v];\r\n                            $data[$k]['isinstall'] = true;\r\n                        }else{\r\n                            $data[$k] = ['name'=>$config['name'],'filepath'=>$v,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'config'=>'','isinstall'=>false];\r\n\r\n                        }\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif($isok && array_key_exists($v,$allplugins) && version_compare($config['version'],$allplugins[$v]['version'],'<')){\r\n\t\t\t\t\t\t\t//有更新\r\n\t\t\t\t\t\t\t$data[$k]['isupdate'] = true;\r\n\t\t\t\t\t\t\t$data[$k]['official'] = $allplugins[$v]['official'];\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t//无更新\r\n\t\t\t\t\t\t\t$data[$k]['isupdate'] = false;\r\n\t\t\t\t\t\t\t$data[$k]['official'] =  array_key_exists($v,$allplugins) ? $allplugins[$v]['official'] : 0;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$data[$k]['exists'] = true;\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t$this->pages = $arraypage->pageList();\r\n\t\t\t\t\t$this->sum = $arraypage->sum;//总数据\r\n\t\t\t\t\t$this->listpage = $arraypage->listpage;//分页数组-自定义分页可用\r\n\t\t\t\t\t$this->prevpage = $arraypage->prevpage;//上一页\r\n\t\t\t\t\t$this->nextpage = $arraypage->nextpage;//下一页\r\n\t\t\t\t\t$this->allpage = $arraypage->allpage;//总页数\r\n\t\t\t\t\t$this->lists = $data;\r\n\t\t\t\t\t$this->display('plugins-list');\r\n\t\t\t\t\texit;\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\tbreak;\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\r\n\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t$dir = APP_PATH.'app/admin/exts';\r\n\t\t$fileArray=array();\r\n\t\tif (false !== ($handle = opendir ( $dir ))) {\r\n\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\tif ($file != \".\" && $file != \"..\"  && strpos($file,'.')===false) {\r\n\t\t\t\t\t$fileArray[]=$file;\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//关闭句柄\r\n\t\t\tclosedir ( $handle );\r\n\t\t}\r\n\t\t$pls = M('plugins')->findAll();\r\n\t\t$plugins = [];\r\n\t\tforeach($pls as $k=>$v){\r\n\t\t\t$plugins[$v['filepath']] = $v;\r\n\t\t}\r\n\t\t$lists = [];\r\n\t\t\r\n\t\tif($isok){\r\n\t\t\tforeach($allplugins as $k=>$v){\r\n\t\t\t\tif(in_array($k,$fileArray)){\r\n\t\t\t\t\t//已下载该插件\r\n\t\t\t\t\tif(!file_exists($dir.'/'.$k.'/config.php')){\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$config = require_once($dir.'/'.$k.'/config.php');\r\n\t\t\t\t\tif(isset($plugins[$k])){\r\n\t\t\t\t\t\t$lists[$k] = $plugins[$k];\r\n\t\t\t\t\t\t$lists[$k]['isinstall'] = true;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$lists[$k] = ['name'=>$config['name'],'filepath'=>$k,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'config'=>'','isinstall'=>false];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(version_compare($config['version'],$v['version'],'<')){\r\n\t\t\t\t\t\t//有更新\r\n\t\t\t\t\t\t$lists[$k]['isupdate'] = true;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t//无更新\r\n\t\t\t\t\t\t$lists[$k]['isupdate'] = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$lists[$k]['exists'] = true;\r\n\t\t\t\t\t$lists[$k]['official'] = $v['official'];\r\n\t\t\t\t\t\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$lists[$k] = $v;\r\n\t\t\t\t\t$lists[$k]['exists'] = false;\r\n\t\t\t\t\t$lists[$k]['description'] = $v['desc'];\r\n\t\t\t\t\t$lists[$k]['isinstall'] = false;\r\n\t\t\t\t\t$lists[$k]['isupdate'] = false;\r\n\t\t\t\t\t$lists[$k]['official'] = $v['official'];\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t//检查软件是否还有自定义软件未加入进去\r\n\t\t\tforeach($fileArray as $v){\r\n\t\t\t\tif(!isset($lists[$v])){\r\n\t\t\t\t\t//已下载该插件\r\n\t\t\t\t\tif(!file_exists($dir.'/'.$v.'/config.php')){\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$config = require_once($dir.'/'.$v.'/config.php');\r\n\t\t\t\t\tif(isset($plugins[$v])){\r\n\t\t\t\t\t\t$lists[$v] = $plugins[$v];\r\n\t\t\t\t\t\t$lists[$v]['isinstall'] = true;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$lists[$v] = ['name'=>$config['name'],'filepath'=>$v,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'config'=>'','isinstall'=>false];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$lists[$v]['isupdate'] = false;\r\n\t\t\t\t\t$lists[$v]['exists'] = true;\r\n\t\t\t\t\t$lists[$v]['official'] = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\t\r\n\t\t\tforeach($fileArray as $k=>$v){\r\n\r\n\t\t\t\t//检查是否安装\r\n\t\t\t\tif(strpos($v,'.')===false){\r\n\t\t\t\t\tif(!file_exists($dir.'/'.$v.'/config.php')){\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$config = require_once($dir.'/'.$v.'/config.php');\r\n\t\t\t\t\tif(isset($plugins[$v])){\r\n\t\t\t\t\t\t$lists[$k] = $plugins[$v];\r\n\t\t\t\t\t\t$lists[$k]['isinstall'] = true;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$lists[] = ['name'=>$config['name'],'filepath'=>$v,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'config'=>'','isinstall'=>false];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$lists[$k]['isupdate'] = false;\r\n\t\t\t\t\t$lists[$k]['exists'] = true;\r\n\t\t\t\t\t$lists[$k]['official'] = 2;//本地\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\tif($this->title){\r\n\t\t\t$newlist = [];\r\n\t\t\tforeach($lists as $v){\r\n\t\t\t\tif(strpos($v['name'],$this->title)!==false){\r\n\t\t\t\t\t$newlist[]=$v;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t$lists  = $newlist;\r\n\t\t}\r\n\t\t\r\n\t\t$arraypage = new \\ArrayPage($lists);\r\n\t\t$data = $arraypage->query(['page'=>$this->frparam('page',0,1),'title'=>$this->title,'isdown'=>$this->frparam('isdown')])->setPage(['limit'=>$this->frparam('limit',0,10),'page'=>$this->frparam('page',0,1)])->go();\r\n\t\t$this->pages = $arraypage->pageList();\r\n\t\t$this->sum = $arraypage->sum;//总数据\r\n\t\t$this->listpage = $arraypage->listpage;//分页数组-自定义分页可用\r\n\t\t$this->prevpage = $arraypage->prevpage;//上一页\r\n\t\t$this->nextpage = $arraypage->nextpage;//下一页\r\n\t\t$this->allpage = $arraypage->allpage;//总页数\r\n\t\t$this->lists = $data;\r\n\t\t\r\n\t\t$this->display('plugins-list');\r\n\t\t\r\n\t\t\r\n\t}\r\n\t\r\n\t//更改软件状态\r\n\tfunction change_status(){\r\n\t\t$filepath = $this->frparam('filepath',1);\r\n\t\tif($filepath){\r\n\t\t\t$plugins = M('plugins')->find(['filepath'=>$filepath]);\r\n\t\t\tif($plugins['isopen']==1){\r\n\t\t\t\t$isopen = 0;\r\n\t\t\t}else{\r\n\t\t\t\t$isopen = 1;\r\n\t\t\t}\r\n\t\t\tM('plugins')->update(['id'=>$plugins['id']],['isopen'=>$isopen]);\r\n\t\t\t\r\n\t\t\t//检测插件是否注册hook\r\n\t\t\tif(M('hook')->find(['plugins_name'=>$filepath])){\r\n\t\t\t\tM('hook')->update(['plugins_name'=>$filepath],['isopen'=>$isopen]);\r\n\t\t\t}\r\n\t\t\tsetCache('hook',null);\r\n\t\t\tJsonReturn(array('code'=>0,'msg'=>'success'));\r\n\t\t}\r\n\t\tJsonReturn(array('code'=>1,'msg'=>'参数错误！'));\r\n\t\t\r\n\t\t\r\n\t}\r\n\t\r\n\t//打包下载\r\n\tfunction output(){\r\n\t\t$filepath = $this->frparam('filepath',1);\r\n\t\tif(strpos($filepath,'.')!==false){\r\n\t\t\tJsonReturn(array('code'=>1,'msg'=>'参数存在安全隐患！'));\r\n\t\t}\r\n\t\tif(!$filepath){\r\n\t\t\tError('链接错误！');\r\n\t\t}\r\n\t\t$zip = new \\ZipArchive();\r\n\r\n\t\tif ($zip->open($filepath.'.zip', \\ZipArchive::CREATE|\\ZipArchive::OVERWRITE) === TRUE) {\r\n\t\t\t$this->addFileToZip(APP_PATH.'app/admin/exts/'.$filepath.'/', $zip); //调用方法，对要打包的根目录进行操作，并将ZipArchive的对象传递给方法\r\n\t\t\t$zip->close(); //关闭处理的zip文件\r\n\t\t\t\r\n\t\t\t$zip = $filepath.'.zip';\r\n\t\t\t$zipname = date('YmdHis');\r\n\t\t\t//打开文件\r\n\t\t\t$file = fopen($zip,\"r\");\r\n\t\t\t//返回的文件类型\r\n\t\t\tHeader(\"Content-type: application/octet-stream\");\r\n\t\t\t//按照字节大小返回\r\n\t\t\tHeader(\"Accept-Ranges: bytes\");\r\n\t\t\t//返回文件的大小\r\n\t\t\tHeader(\"Accept-Length: \".filesize($zip));\r\n\t\t\t//这里对客户端的弹出对话框，对应的文件名\r\n\t\t\tHeader(\"Content-Disposition: attachment; filename=\".$zip);\r\n\t\t\t//修改之前，一次性将数据传输给客户端\r\n\t\t\techo fread($file, filesize($zip));\r\n\t\t\t//修改之后，一次只传输1024个字节的数据给客户端\r\n\t\t\t//向客户端回送数据\r\n\t\t\t$buffer=1024;//\r\n\t\t\t//判断文件是否读完\r\n\t\t\twhile (!feof($file)) {\r\n\t\t\t\t//将文件读入内存\r\n\t\t\t\t$file_data=fread($file,$buffer);\r\n\t\t\t\t//每次向客户端回送1024个字节的数据\r\n\t\t\t\techo $file_data;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfclose($file);\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\texit('无法打开文件，或者文件创建失败');\r\n\t\t}\r\n\t}\r\n\t\r\n\tfunction addFileToZip($path, $zip) {\r\n\t\t$handler = opendir($path); //打开当前文件夹由$path指定。\r\n\t\t/*\r\n\t\t循环的读取文件夹下的所有文件和文件夹\r\n\t\t其中$filename = readdir($handler)是每次循环的时候将读取的文件名赋值给$filename，\r\n\t\t为了不陷于死循环，所以还要让$filename !== false。\r\n\t\t一定要用!==，因为如果某个文件名如果叫'0'，或者某些被系统认为是代表false，用!=就会停止循环\r\n\t\t*/\r\n\t\twhile (($filename = readdir($handler)) !== false) {\r\n\t\t\tif ($filename != \".\" && $filename != \"..\") {//文件夹文件名字为'.'和‘..’，不要对他们进行操作\r\n\t\t\t\tif (is_dir($path . \"/\" . $filename)) {// 如果读取的某个对象是文件夹，则递归\r\n\t\t\t\t\t$this->addFileToZip($path . \"/\" . $filename, $zip);\r\n\t\t\t\t} else { //将文件加入zip对象\r\n\t\t\t\t\t$zip->addFile($path . \"/\" . $filename);\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t}\r\n\t\t@closedir($path);\r\n\t}\r\n\r\n\t\r\n\t//安装下载\r\n\tfunction action_do(){\r\n\t\t$filepath = $this->frparam('path',1);\r\n\t\tif(strpos($filepath,'.')!==false){\r\n\t\t\tJsonReturn(array('code'=>1,'msg'=>'参数存在安全隐患！'));\r\n\t\t}\r\n\t\t$type = $this->frparam('type');\r\n\t\t$dir = APP_PATH.APP_HOME.'/exts';\r\n\t\tif($filepath){\r\n\t\t\tif($type==1){\r\n\t\t\t\t//安装\r\n\t\t\t\t//执行插件控制器安装程序\r\n\t\t\t\trequire_once($dir.'/'.$filepath.'/PluginsController.php');\r\n\t\t\t\t$plg = new \\app\\admin\\exts\\PluginsController($this->frparam());\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t$step1 = $plg->install();//执行安装\r\n\t\t\t\tif(!$step1){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'执行插件安装程序失败！'));\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$config = require_once($dir.'/'.$filepath.'/config.php');\r\n\t\t\t\t$w = ['name'=>format_param($config['name'],1),'filepath'=>$filepath,'description'=>format_param($config['desc'],1),'version'=>$config['version'],'author'=>format_param($config['author'],1),'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'config'=>'','addtime'=>time()];\r\n\t\t\t\tif(M('plugins')->find(['filepath'=>$w['filepath']])){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'插件已安装，请勿重复操作！'));\r\n\t\t\t\t}\r\n\t\t\t\t//复制文件到对应文件夹\r\n\t\t\t\t//移动前台插件控制器\r\n\t\t\t\t$sourcefile = $dir.'/'.$filepath.'/controller/home';\r\n\t\t\t\t$target = APP_PATH.'app/home/plugins';\r\n\t\t\t\tif(!is_dir($target)){\r\n\t\t\t\t\tmkdir($target,0777);\r\n\t\t\t\t}\r\n\t\t\t\tif(is_dir($sourcefile) && is_dir($target)){\r\n\t\t\t\t\tif (false != ($handle = opendir ( $sourcefile ))) {\r\n\t\t\t\t\t\r\n\t\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\t\t\t\tif ($file != \".\" && $file != \"..\") {\r\n\t\t\t\t\t\t\t\t$fs = $sourcefile.'/'.$file;\r\n\t\t\t\t\t\t\t\t$ft = $target.'/'.$file;\r\n\t\t\t\t\t\t\t\t$r = $this->file2dir($fs,$ft);\r\n\t\t\t\t\t\t\t\tif(!$r){\r\n\t\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'插件安装失败！sourcefile:'.$fs.' targetfile:'.$ft));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//关闭句柄\r\n\t\t\t\t\t\tclosedir ( $handle );\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t//移动后台插件控制器\r\n\t\t\t\t$sourcefile = $dir.'/'.$filepath.'/controller/admin';\r\n\t\t\t\t$target = APP_PATH.'app/admin/plugins';\r\n\t\t\t\tif(!is_dir($target)){\r\n\t\t\t\t\tmkdir($target,0777);\r\n\t\t\t\t}\r\n\t\t\t\tif(is_dir($sourcefile) && is_dir($target)){\r\n\t\t\t\t\tif (false != ($handle = opendir ( $sourcefile ))) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\t\t\t\tif ($file != \".\" && $file != \"..\") {\r\n\t\t\t\t\t\t\t\t$fs = $sourcefile.'/'.$file;\r\n\t\t\t\t\t\t\t\t$ft = $target.'/'.$file;\r\n\t\t\t\t\t\t\t\t$r = $this->file2dir($fs,$ft);\r\n\t\t\t\t\t\t\t\tif(!$r){\r\n\t\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'插件安装失败！sourcefile:'.$fs.' targetfile:'.$ft));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//关闭句柄\r\n\t\t\t\t\t\tclosedir ( $handle );\r\n\t\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t//移动扩展类文件\r\n\t\t\t\t$src = $dir.'/'.$filepath.'/class';\r\n\t\t\t\t$dst = APP_PATH.'frphp/extend';\r\n\t\t\t\tif(is_dir($src)){\r\n\t\t\t\t\t$this->recurse_copy($src,$dst);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$res = M('plugins')->add($w);\r\n\t\t\t\t\r\n\t\t\t\tsetCache('hook',null);\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>'安装成功！'));\r\n\t\t\t}else{\r\n\t\t\t\t//卸载\r\n\t\t\t\tif(stripos($filepath,'/')!==false){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'非法操作！'));\r\n\t\t\t\t}\r\n\t\t\t\t$config = require_once($dir.'/'.$filepath.'/config.php');\r\n\t\t\t\t$w = ['filepath'=>$filepath];\r\n\t\t\t\t$plugins = M('plugins')->find($w);\r\n\t\t\t\tif(!$plugins){\r\n\t\t\t\t\tif($type==2){\r\n\t\t\t\t\t\t//批量删除文件\r\n\t\t\t\t\t\tif(is_dir(APP_PATH.'app/admin/exts/'.$filepath)){\r\n\t\t\t\t\t\t\tdeldir(APP_PATH.'app/admin/exts/'.$filepath);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>'删除成功！'));\r\n\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'插件已移除，请勿重复操作！'));\r\n\t\t\t\t}\r\n\t\t\t\t//移除文件夹\r\n\t\t\t\t$target = APP_PATH.'app/home/plugins';\r\n\t\t\t\t$sourcefile = $dir.'/'.$filepath.'/controller/home';\r\n\t\t\t\tif(is_dir($sourcefile) && is_dir($target)){\r\n\t\t\t\t\tif (false != ($handle = opendir ( $sourcefile ))) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\t\t\t\tif ($file != \".\" && $file != \"..\") {\r\n\t\t\t\t\t\t\t\t$ft = $target.'/'.$file;\r\n\t\t\t\t\t\t\t\tif(file_exists($ft)){\r\n\t\t\t\t\t\t\t\t\tunlink($ft);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//关闭句柄\r\n\t\t\t\t\t\tclosedir ( $handle );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t$target = APP_PATH.'app/admin/plugins';\r\n\t\t\t\t$sourcefile = $dir.'/'.$filepath.'/controller/admin';\r\n\t\t\t\tif(is_dir($sourcefile) && is_dir($target)){\r\n\t\t\t\t\tif (false != ($handle = opendir ( $sourcefile ))) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\t\t\t\tif ($file != \".\" && $file != \"..\") {\r\n\t\t\t\t\t\t\t\t$ft = $target.'/'.$file;\r\n\t\t\t\t\t\t\t\tif(file_exists($ft)){\r\n\t\t\t\t\t\t\t\t\tunlink($ft);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//关闭句柄\r\n\t\t\t\t\t\tclosedir ( $handle );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t//移动扩展类文件\r\n\t\t\t\t$src = $dir.'/'.$filepath.'/class';\r\n\t\t\t\t$dst = APP_PATH.'frphp/extend';\r\n\t\t\t\tif(is_dir($src)){\r\n\t\t\t\t\t$this->recurse_copy($src,$dst);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t//执行插件控制器卸载程序\r\n\t\t\t\trequire_once($dir.'/'.$filepath.'/PluginsController.php');\r\n\t\t\t\t$plg = new \\app\\admin\\exts\\PluginsController($this->frparam());\r\n\t\t\t\t\r\n\t\t\t\t$step1 = $plg->uninstall();//执行安装\r\n\t\t\t\tif(!$step1){\r\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'执行插件卸载程序失败！'));\r\n\t\t\t\t}\r\n\t\t\t\t$res = M('plugins')->delete(['id'=>$plugins['id']]);\r\n\t\t\t\t\r\n\t\t\t\tsetCache('hook',null);\r\n\t\t\t\tif($type==2){\r\n\t\t\t\t\t//批量删除文件\r\n\t\t\t\t\tif(is_dir(APP_PATH.'app/admin/exts/'.$filepath)){\r\n\t\t\t\t\t\tdeldir(APP_PATH.'app/admin/exts/'.$filepath);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>'删除成功！'));\r\n\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>'卸载成功！'));\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\tJsonReturn(array('code'=>1,'msg'=>'参数错误！'));\r\n\t}\r\n\r\n\t//复制图片  file2dir(\"01/5.jpg\", \"01/successImg/a.jpg\");\r\n\tfunction file2dir($sourcefile, $filename){\r\n\t\t if( !file_exists($sourcefile)){\r\n\t\t\t return false;\r\n\t\t }\r\n\t\t //$filename = basename($sourcefile);\r\n\t\t return copy($sourcefile,  $filename);\r\n\t}\r\n\t// 原目录，复制到的目录\r\n\tfunction recurse_copy($src,$dst) {  \r\n\t \r\n\t\t$dir = opendir($src);\r\n\t\t@mkdir($dst);\r\n\t\twhile(false !== ( $file = readdir($dir)) ) {\r\n\t\t\tif (( $file != '.' ) && ( $file != '..' )) {\r\n\t\t\t\tif ( is_dir($src . '/' . $file) ) {\r\n\t\t\t\t\t$this->recurse_copy($src . '/' . $file,$dst . '/' . $file);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcopy($src . '/' . $file,$dst . '/' . $file);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tclosedir($dir);\r\n\t}\r\n\r\n\t\r\n\t//配置信息\r\n\tfunction setconf(){\r\n\t\t$id = $this->frparam('id');\r\n\t\t$plugins = M('plugins')->find(['id'=>$id]);\r\n\t\tif($id && $plugins){\r\n\t\t\t\r\n\t\t\t//执行插件控制器卸载程序\r\n\t\t\t$dir = APP_PATH.APP_HOME.'/exts';\r\n\t\t\trequire_once($dir.'/'.$plugins['filepath'].'/PluginsController.php');\r\n\t\t\t$plg = new \\app\\admin\\exts\\PluginsController($this->frparam());\r\n\t\t\t//转入插件内部处理\r\n\t\t\tif($_POST){\r\n\t\t\t\t$plg->setconfigdata($_POST);//传入插件内部处理\r\n\t\t\t\texit;\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t$plg->setconf($plugins);\r\n\t\t\texit;\r\n\t\t}\r\n\t\tJsonReturn(array('code'=>1,'msg'=>'参数错误,必须携带插件ID！'));\r\n\t\t\r\n\t\t//Error('参数错误！');\r\n\t\t\r\n\t}\r\n\t\r\n\t//安装说明\r\n\tfunction desc(){\r\n\t\t$filepath = $this->frparam('filepath',1);\r\n\t\tif(strpos($filepath,'.')!==false){\r\n\t\t\tJsonReturn(array('code'=>1,'msg'=>'参数存在安全隐患！'));\r\n\t\t}\r\n\t\tif($filepath){\r\n\t\t\t\r\n\t\t\t//执行插件控制器卸载程序\r\n\t\t\t$dir = APP_PATH.APP_HOME.'/exts';\r\n\t\t\trequire_once($dir.'/'.$filepath.'/PluginsController.php');\r\n\t\t\t$plg = new \\app\\admin\\exts\\PluginsController($this->frparam());\r\n\t\t\t\r\n\t\t\t$plg->desc();\r\n\t\t\texit;\r\n\t\t}\r\n\t\tJsonReturn(array('code'=>1,'msg'=>'参数错误,必须携带插件ID！'));\r\n\t}\r\n\t\r\n\t//更新插件\r\n\tfunction update(){\r\n\t\t$filepath = $this->frparam('filepath',1);\r\n\t\tif(strpos($filepath,'.')!==false){\r\n\t\t\tJsonReturn(array('code'=>1,'msg'=>'参数存在安全隐患！'));\r\n\t\t}\r\n\t\tif($filepath){\r\n\t\t\tif($this->frparam('action',1)){\r\n\t\t\t\t$action = $this->frparam('action',1);\r\n\t\t\t\t// 自己获取这些信息\r\n\t\t\t\t$remote_url  = urldecode($this->frparam('download_url',1));\r\n\t\t\t\t$remote_url = strpos($remote_url,'?')!==false ? $remote_url.'&version='.$this->webconf['web_version'] : $remote_url.'?version='.$this->webconf['web_version'];\r\n\t\t\t\t$file_size   = $this->frparam('filesize',1);\r\n\t\t\t\t$tmp_path    = Cache_Path.\"/update_\".$filepath.\".zip\";//临时下载文件路径\r\n\t\t\t\tswitch ($action) {\r\n\t\t\t\t    case 'prepare-download':\r\n\t\t\t\t    \t$code = 0;\r\n\t\t\t\t\t\tob_start(); \r\n\t\t\t\t\t\t$ch=curl_init($remote_url); \r\n\t\t\t\t\t\tcurl_setopt($ch,CURLOPT_HEADER,1); \r\n\t\t\t\t\t\tcurl_setopt($ch,CURLOPT_NOBODY,1); \r\n\t\t\t\t\t\t$okay=curl_exec($ch); \r\n\t\t\t\t\t\tcurl_close($ch); \r\n\t\t\t\t\t\t$head=ob_get_contents(); \r\n\t\t\t\t\t\tob_end_clean(); \r\n\t\t\t\t\t\t$regex='/Content-Length:\\s([0-9].+?)\\s/'; \r\n\t\t\t\t\t\t$count=preg_match($regex,$head,$matches); \r\n\t\t\t\t\t\t$filesize = isset($matches[1])&&is_numeric($matches[1])?$matches[1]:0; \r\n\r\n\t\t\t\t        JsonReturn(array('code'=>0,'size'=>$filesize));\r\n\t\t\t\t        break;\r\n\t\t\t\t    case 'start-download':\r\n\t\t\t\t        // 这里检测下 tmp_path 是否存在\r\n\t\t\t\t        try {\r\n\t\t\t\t            set_time_limit(0);\r\n\t\t\t\t            touch($tmp_path);\r\n\t\t\t\t            // 做些日志处理\r\n\t\t\t\t            if ($fp = fopen($remote_url, \"rb\")) {\r\n\t\t\t\t                if (!$download_fp = fopen($tmp_path, \"wb\")) {\r\n\t\t\t\t                    exit;\r\n\t\t\t\t                }\r\n\t\t\t\t                while (!feof($fp)) {\r\n\t\t\t\t                    if (!file_exists($tmp_path)) {\r\n\t\t\t\t                        // 如果临时文件被删除就取消下载\r\n\t\t\t\t                        fclose($download_fp);\r\n\t\t\t\t                        exit;\r\n\t\t\t\t                    }\r\n\t\t\t\t                    fwrite($download_fp, fread($fp, 1024 * 8 ), 1024 * 8);\r\n\t\t\t\t                }\r\n\t\t\t\t                fclose($download_fp);\r\n\t\t\t\t                fclose($fp);\r\n\t\t\t\t            } else {\r\n\t\t\t\t                exit;\r\n\t\t\t\t            }\r\n\t\t\t\t        } catch (Exception $e) {\r\n\t\t\t\t            Storage::remove($tmp_path);\r\n\t\t\t\t            JsonReturn(['code'=>1,'msg'=>'发生错误：'.$e->getMessage()]);\r\n\t\t\t\t        }\r\n\r\n\t\t\t\t        JsonReturn(['code'=>0,'tmp_path'=>$tmp_path]);\r\n\t\t\t\t        break;\r\n\t\t\t\t    case 'get-file-size':\r\n\t\t\t\t        // 这里检测下 tmp_path 是否存在\r\n\t\t\t\t        if (file_exists($tmp_path)) {\r\n\t\t\t\t            \r\n\t\t\t\t            JsonReturn(['code'=>0,'size'=>filesize($tmp_path)]);\r\n\t\t\t\t        }\r\n\t\t\t\t        break;\r\n\t\t\t\t    case 'file-upzip':\r\n\t\t\t\t    \tif (!file_exists($tmp_path)) {//先判断待解压的文件是否存在\r\n\t\t\t\t\t\t   JsonReturn(['code'=>1,'msg'=>'下载缓存文件不存在！']);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$path = APP_PATH.'app/admin/exts/';\r\n\t\t\t\t\t\t$msg = $this->get_zip_originalsize($tmp_path,$path);\r\n\t\t\t\t\t\tif($filepath=='jizhicmsupdate'){\r\n\t\t\t\t\t\t\t$isinstall = true;\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\tif(M('plugins')->find(['filepath'=>$filepath])){\r\n\t\t\t\t\t\t\t\t$isinstall = true;\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t$isinstall = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>$msg,'isinstall'=>$isinstall]);\r\n\t\t\t\t    \tbreak;\r\n\t\t\t\t    case 'plugin-install':\r\n\t\t\t\t    \t$dir = APP_PATH.'app/admin/exts';\r\n\t\t\t\t    \trequire_once($dir.'/'.$filepath.'/PluginsController.php');\r\n\t\t\t\t\t\t$plg = new \\app\\admin\\exts\\PluginsController($this->frparam());\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t$step1 = $plg->install();//执行安装\r\n\t\t\t\t\t\tif(!$step1){\r\n\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'执行插件安装程序失败！'));\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$config = require_once($dir.'/'.$filepath.'/config.php');\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t$plg_old = M('plugins')->find(['filepath'=>$filepath]);\r\n\t\t\t\t\t\tif($plg_old){\r\n\t\t\t\t\t\t\t//保存原配置\r\n\t\t\t\t\t\t\t$w = ['name'=>$config['name'],'filepath'=>$filepath,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'config'=>$plg_old['config'],'addtime'=>time()];\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t$w = ['name'=>$config['name'],'filepath'=>$filepath,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'config'=>'','addtime'=>time()];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//复制文件到对应文件夹\r\n\t\t\t\t\t\t//移动前台插件控制器\r\n\t\t\t\t\t\t$sourcefile = $dir.'/'.$filepath.'/controller/home';\r\n\t\t\t\t\t\t$target = APP_PATH.'app/home/plugins';\r\n\t\t\t\t\t\tif(is_dir($sourcefile) && is_dir($target)){\r\n\t\t\t\t\t\t\tif (false != ($handle = opendir ( $sourcefile ))) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\t\t\t\t\t\tif ($file != \".\" && $file != \"..\") {\r\n\t\t\t\t\t\t\t\t\t\t$fs = $sourcefile.'/'.$file;\r\n\t\t\t\t\t\t\t\t\t\t$ft = $target.'/'.$file;\r\n\t\t\t\t\t\t\t\t\t\t$r = $this->file2dir($fs,$ft);\r\n\t\t\t\t\t\t\t\t\t\tif(!$r){\r\n\t\t\t\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'插件安装失败！sourcefile:'.$fs.' targetfile:'.$ft));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t//关闭句柄\r\n\t\t\t\t\t\t\t\tclosedir ( $handle );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t//移动后台插件控制器\r\n\t\t\t\t\t\t$sourcefile = $dir.'/'.$filepath.'/controller/admin';\r\n\t\t\t\t\t\t$target = APP_PATH.'app/admin/plugins';\r\n\t\t\t\t\t\tif(is_dir($sourcefile) && is_dir($target)){\r\n\t\t\t\t\t\t\tif (false != ($handle = opendir ( $sourcefile ))) {\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\t\t\t\t\t\tif ($file != \".\" && $file != \"..\") {\r\n\t\t\t\t\t\t\t\t\t\t$fs = $sourcefile.'/'.$file;\r\n\t\t\t\t\t\t\t\t\t\t$ft = $target.'/'.$file;\r\n\t\t\t\t\t\t\t\t\t\t$r = $this->file2dir($fs,$ft);\r\n\t\t\t\t\t\t\t\t\t\tif(!$r){\r\n\t\t\t\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'插件安装失败！sourcefile:'.$fs.' targetfile:'.$ft));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t//关闭句柄\r\n\t\t\t\t\t\t\t\tclosedir ( $handle );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t//移动扩展类文件\r\n\t\t\t\t\t\t$src = $dir.'/'.$filepath.'/class';\r\n\t\t\t\t\t\t$dst = APP_PATH.'frphp/extend';\r\n\t\t\t\t\t\tif(is_dir($src)){\r\n\t\t\t\t\t\t\t$this->recurse_copy($src,$dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t$res = M('plugins')->update(['filepath'=>$filepath],$w);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tsetCache('hook',null);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>'安装成功！'));\r\n\t\t\t\t    \tbreak;\r\n\t\t\t\t    default:\r\n\t\t\t\t        # code...\r\n\t\t\t\t        break;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t$config = require_once(APP_PATH.'app/admin/exts/'.$filepath.'/config.php');\r\n\t\t\t$webapi = $this->webconf['plugins_config'];\r\n\t\t\t$r = file_get_contents($webapi.'?name='.$filepath.'&v='.$config['version'].'&version='.$this->webconf['web_version']);\r\n\t\t\t$rr = json_decode($r,1);\r\n\t\t\tif($rr['code']==0){\r\n\t\t\t\t$this->plugin = $config;\r\n\t\t\t\t$this->data = $rr['data'];\r\n\t\t\t\t//获取远程文件大小\r\n\t\t\t\t$downurl = $rr['data']['url'];\r\n\t\t\t\tob_start(); \r\n\t\t\t\t$ch=curl_init($downurl); \r\n\t\t\t\tcurl_setopt($ch,CURLOPT_HEADER,1); \r\n\t\t\t\tcurl_setopt($ch,CURLOPT_NOBODY,1); \r\n\t\t\t\t$okay=curl_exec($ch); \r\n\t\t\t\tcurl_close($ch); \r\n\t\t\t\t$head=ob_get_contents(); \r\n\t\t\t\tob_end_clean(); \r\n\t\t\t\t$regex='/Content-Length:\\s([0-9].+?)\\s/'; \r\n\t\t\t\t$count=preg_match($regex,$head,$matches); \r\n\t\t\t\t$filesize = isset($matches[1])&&is_numeric($matches[1])?$matches[1]:0; \r\n\t\t\t\t$this->filesize = $filesize;\r\n\t\t\t\t$this->filepath = $filepath;\r\n\t\t\t\t$this->display('plugins-update');exit;\r\n\t\t\t}else{\r\n\t\t\t\t//JsonReturn(array('code'=>1,'msg'=>'该插件暂无更新！'));\r\n\t\t\t\texit('该插件暂无更新！');\r\n\t\t\t}\r\n\r\n\t\t\t\r\n\t\t}\r\n\t\tJsonReturn(array('code'=>1,'msg'=>'参数错误,必须携带插件ID！'));\r\n\t}\r\n\t\r\n\tfunction get_zip_originalsize($filename, $path) {\r\n\t  //先判断待解压的文件是否存在\r\n\t  if(!file_exists($filename)){\r\n\t\t //die(\"文件 $filename 不存在！\");\r\n\t\t JsonReturn(['code'=>1,'msg'=>'文件'.$filename.'不存在！']);\r\n\t  }\r\n\t  $starttime = explode(' ',microtime()); //解压开始的时间\r\n\r\n\t  //将文件名和路径转成windows系统默认的gb2312编码，否则将会读取不到\r\n\t  //$filename = iconv(\"utf-8\",\"gb2312\",$filename);\r\n\t  //$path = iconv(\"utf-8\",\"gb2312\",$path);\r\n\t  //打开压缩包\r\n\t  $resource = zip_open($filename);\r\n\t  $i = 1;\r\n\t  //获取目标目录的真实路径用于后续验证\r\n\t  $real_base_path = realpath($path);\r\n\t  if($real_base_path === false){\r\n\t   JsonReturn(['code'=>1,'msg'=>'目标目录不存在！']);\r\n\t  }\r\n\t  //遍历读取压缩包里面的一个个文件\r\n\t  while ($dir_resource = zip_read($resource)) {\r\n\t\t//如果能打开则继续\r\n\t\tif (zip_entry_open($resource,$dir_resource)) {\r\n\t\t  //获取当前项目的名称,即压缩包里面当前对应的文件名\r\n\t\t  $entry_name = zip_entry_name($dir_resource);\r\n\t\t  \r\n\t\t  //防止路径穿越攻击：移除所有 ../ 和 ..\\ 序列\r\n\t\t  $entry_name = str_replace(['../', '..\\\\'], '', $entry_name);\r\n\t\t  \r\n\t\t  //检查文件名是否为空\r\n\t\t  if(empty(trim($entry_name, '/'))){\r\n\t\t\t  zip_entry_close($dir_resource);\r\n\t\t\t  continue;\r\n\t\t  }\r\n\t\t  \r\n\t\t  //构建完整的文件路径\r\n\t\t  $file_name = $path . $entry_name;\r\n\t\t  //以最后一个“/”分割,再用字符串截取出路径部分\r\n\t\t  $file_path = substr($file_name,0,strrpos($file_name, \"/\"));\r\n\t\t  \r\n\t\t  //验证路径是否在目标目录内\r\n\t\t  //对于不存在的目录，检查其最近的已存在父目录\r\n\t\t  $check_path = $file_path;\r\n\t\t  while(!is_dir($check_path) && $check_path !== ''){\r\n\t\t\t  $check_path = dirname($check_path);\r\n\t\t  }\r\n\t\t  \r\n\t\t  if(is_dir($check_path)){\r\n\t\t\t  $real_check_path = realpath($check_path);\r\n\t\t\t  if($real_check_path === false || strpos($real_check_path, $real_base_path) !== 0){\r\n\t\t\t\t  //路径逃逸，跳过该条目\r\n\t\t\t\t  zip_entry_close($dir_resource);\r\n\t\t\t\t  continue;\r\n\t\t\t  }\r\n\t\t  }\r\n\t\t  \r\n\t\t  //如果路径不存在，则创建一个目录，true表示可以创建多级目录\r\n\t\t  if(!is_dir($file_path)){\r\n\t\t\tmkdir($file_path,0777,true);\r\n\t\t  }\r\n\t\t  //如果不是目录，则写入文件\r\n\t\t  if(!is_dir($file_name)){\r\n\t\t\t//读取这个文件\r\n\t\t\t$file_size = zip_entry_filesize($dir_resource);\r\n\t\t\t//最大读取6M，如果文件过大，跳过解压，继续下一个\r\n\t\t\t$file_content = zip_entry_read($dir_resource,$file_size);\r\n\t\t\tfile_put_contents($file_name,$file_content);\r\n\t\t  }\r\n\t\t  //关闭当前\r\n\t\t  zip_entry_close($dir_resource);\r\n\t\t}\r\n\t  }\r\n\t  //关闭压缩包\r\n\t  zip_close($resource);\r\n\t  $endtime = explode(' ',microtime()); //解压结束的时间\r\n\t  $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);\r\n\t  $thistime = round($thistime,3); //保留3为小数\r\n\t  $msg = \"解压完毕！本次解压花费：$thistime 秒。\";\r\n\t  return $msg;\r\n\t}\r\n\t\r\n\r\n\t\r\n}"
  },
  {
    "path": "app/admin/c/ProductController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/08\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass ProductController extends CommonController\n{\n\t\n\t\n\tfunction productlist(){\n\t\t\n\t\t$classtypedata = $this->classtypedata;\n\t\t$this->molds = M('molds')->find(['biaoshi'=>'product']);\n\t\t$this->tid=  $this->frparam('tid');\n\t\t$this->title = $this->frparam('title',1);\n\t\t$this->isshow = $this->frparam('isshow');\n\t\t$data = $this->frparam();\n\t\t$res = molds_search('product',$data);\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->fields_search = $res['fields_search'];\n\t\t$this->fields_list = M('Fields')->findAll(array('molds'=>'product','islist'=>1),'listorders desc');\n\t\tif($this->frparam('ajax')){\n\t\t\t\n\t\t\t$page = new Page('product');\n\t\t\t$sql = ' 1=1 ';\n\t\t\tif($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['iscontrol']!=0 && $this->molds['isclasstype']==1){\n\t\t\t\t$a1 = explode(',',$this->tids);\n\t\t\t\t$a2 = array_filter($a1);\n\t\t\t\t$tids = implode(',',$a2);\n\t\t\t\t$sql.=' and tid in('.$tids.') ';\n\n\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : '';\n\t\t\t$sql .= $get_sql;\n\t\t\t\n\t\t\t\n\t\t\t$data = $page->where($sql)->orderby('istop desc,orders desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go();\n\t\t\t\n\t\t\t$ajaxdata = [];\n\t\t\tforeach($data as $k=>$v){\n\t\t\t\t\n\t\t\t\tif(isset($classtypedata[$v['tid']])){\n\t\t\t\t\t$v['new_tid'] = $classtypedata[$v['tid']]['classname'];\n\t\t\t\t}else{\n\t\t\t\t\t$v['new_tid'] = '['.JZLANG('未分类').']';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$v['view_url'] = gourl($v,$v['htmlurl']);\n\t\t\t\t$v['edit_url'] = U('Product/editproduct',array('id'=>$v['id']));\n\t\t\t\t\n\t\t\t\tforeach($this->fields_list as $vv){\n\t\t\t\t\t$v[$vv['field']] = format_fields($vv,$v[$vv['field']]);\n\t\t\t\t}\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t\t\n\t\t\t}\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t$this->display('product-list');\n\t\t\n\t\t\n\t}\n\n\tfunction addproduct(){\n\t\t$this->fields_biaoshi = 'product';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'product');\n            check_field_must($data,'product');\n\t\t\tif(!$this->frparam('seo_title',1) && $this->frparam('config_seotitle')==1){\n\t\t\t\t$data['seo_title'] = $data['title'];\n\t\t\t}\n\t\t\tif(!$this->frparam('description',1) && $this->frparam('config_description')==1){\n\t\t\t\t$data['description'] = newstr(strip_tags($_POST['body']),200);\n\t\t\t}\n            $water_models = explode(',',$this->webconf['text_molds']);\n            if(in_array('product',$water_models)){\n                if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){\n                    $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']);\n                    //存储\n                    $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2);\n                    $pix_arr = explode('.',$data['litpic']);\n                    $pix = end($pix_arr);\n                    M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>'product']);\n                }else if($this->frparam('litpic',1) && $this->webconf['text_waterlitpic']){\n                    $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->frparam('litpic',1),0);\n                }\n            }\n            \n            if(!$data['litpic'] && $this->frparam('config_litpic')==1){\n\t\t\t\t$pattern='/<img.*?src=\"(.*?)\".*?>/is';\n\t\t\t\tif($this->frparam('body',1)){\n\t\t\t\t\t$r = preg_match($pattern,stripslashes($data['body']),$matchContent);\n\t\t\t\t\tif($r){\n\t\t\t\t\t\t$data['litpic'] = $matchContent[1];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$data['litpic'] = '';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$data['litpic'] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!$this->frparam('tags',1) && $this->frparam('config_tags')==1){\n\t\t\t\t$data['tags'] = str_replace('，',',',$data['keywords']);\n\t\t\t\tif($data['tags']){\n\t\t\t\t\t$data['tags'] = ','.$data['tags'].',';\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$data['userid'] = $_SESSION['admin']['id'];\n\t\t\t$data['htmlurl'] = $data['tid'] ? $this->classtypedata[$data['tid']]['htmlurl'] : null;\n\t\t\t\n\t\t\t//违禁词检测\n\t\t\tif($this->webconf['mingan'] && $this->frparam('config_filter',1)){\n\t\t\t\t$mingan = explode(',',$this->webconf['mingan']);\n\t\t\t\t$filter = explode(',',$this->frparam('config_filter',1));\n\t\t\t\t$fields = $this->getTableFields('product');\n\t\t\t\tforeach($mingan as $s){\n\t\t\t\t\tif(strpos($s,'{xxx}')!==false){\n\t\t\t\t\t\t$pattern = '/'.str_replace('{xxx}','(.*)',$s).'/';\n\t\t\t\t\t\tforeach($filter as $vv){\n\t\t\t\t\t\t\tif($vv && preg_match($pattern, $data[$vv])){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败').'，【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\n\t\t\t\t\t}else{\n\t\t\t\t\t\tforeach($filter as $vv){\n\t\t\t\t\t\t\tif($vv && strpos($data[$vv],$s)!==false ){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败').'，【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//处理自定义URL\n\t\t\tif($data['ownurl']){\n\t\t\t\tif(M('customurl')->find(['molds'=>'product','url'=>$data['ownurl']])){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL！')));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tif($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){\n\t\t\t\t$data['isshow'] = $this->frparam('isshow',0,1);\n\t\t\t}else{\n\t\t\t\t$data['isshow'] = 0;\n\t\t\t}\n            //检查是否重复\n            if($this->webconf['hidetitleonliy']){\n                $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']);\n                $onliyfield = '';\n                foreach ($hidetitleonly as $s){\n                    $d = explode('-',$s);\n                    if(strtolower($d[0])=='product'){\n                        $onliyfield = strtolower($d[1]);\n                        break;\n                    }\n                }\n                if($onliyfield){\n                    if(M('product')->find([$onliyfield=>$data[$onliyfield]])){\n                        JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复！')));\n                    }\n                }\n            }\n            $data['addtime'] = $data['updatetime'] =  isset($data['addtime']) ? $data['addtime'] : time();\n\t\t\t //推荐置顶热门\n            if(strpos($data['jzattr'],'1')!==false){\n                $data['istop'] = 1;\n            }else{\n                $data['istop'] = 0;\n            }\n            if(strpos($data['jzattr'],'2')!==false){\n                $data['ishot'] = 1;\n            }else{\n                $data['ishot'] = 0;\n            }\n            if(strpos($data['jzattr'],'3')!==false){\n                $data['istuijian'] = 1;\n            }else{\n                $data['istuijian'] = 0;\n            }\n\t\t\t$r = M('product')->add($data);\n\t\t\tif($r){\n\t\t\t\tif($data['ownurl']){\n\t\t\t\t\tM('customurl')->add(['molds'=>'product','tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$r]);\n\t\t\t\t}\n\t\t\t\t//tags处理\n\t\t\t\tif($data['tags']!=''){\n\t\t\t\t\t$tags = explode(',',$data['tags']);\n\t\t\t\t\tforeach($tags as $v){\n\t\t\t\t\t\tif($v!=''){\n\t\t\t\t\t\t\t$r = M('tags')->find(['keywords'=>$v]);\n\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\t$w['keywords'] = $v;\n\t\t\t\t\t\t\t\t$w['newname'] = '';\n\t\t\t\t\t\t\t\t$w['url'] = '';\n\t\t\t\t\t\t\t\t$w['num'] = -1;\n\t\t\t\t\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t\t\t\t\t$w['number'] = 1;\n                                $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : '';\n\t\t\t\t\t\t\t\t$w['target'] = '_blank';\n\t\t\t\t\t\t\t\tM('tags')->add($w);\n\t\t\t\t\t\t\t}else{\n                                $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].',';\n                                $ww['tids'] = $tags_tids;\n                                $ww['number'] = $r['number']+1;\n                                M('tags')->update(['keywords'=>$v],$ww);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$config = $this->webconf['product_config'];\n\t\t\t\t$configdata = json_decode($config,1);\n\t\t\t\tif($configdata['seotitle']!=$this->frparam('config_seotitle') || $configdata['litpic']!=$this->frparam('config_litpic') || $configdata['tags']!=$this->frparam('config_tags') || $configdata['filter']!=$this->frparam('config_filter',1)){\n\t\t\t\t\t$configdata = [\n\t\t\t\t\t\t'seotitle'=>$this->frparam('config_seotitle'),\n\t\t\t\t\t\t'litpic'=>$this->frparam('config_litpic'),\n\t\t\t\t\t\t'description'=>$this->frparam('config_description'),\n\t\t\t\t\t\t'tags'=>$this->frparam('config_tags'),\n\t\t\t\t\t\t'filter'=>$this->frparam('config_filter',1),\n\t\t\t\t\t];\n\t\t\t\t\tM('sysconfig')->update(['field'=>'product_config'],['data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)]);\n\t\t\t\t\tsetCache('webconfig',null);\n\t\t\t\t}\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功,继续添加~'),'url'=>U('addproduct',array('tid'=>$data['tid']))));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$this->molds = M('molds')->find(['biaoshi'=>'product']);\n\t\t$config = $this->webconf['product_config'];\n\t\tif(!$config){\n\t\t\t$configdata = [\n\t\t\t\t'seotitle'=>1,\n\t\t\t\t'litpic'=>1,\n\t\t\t\t'description'=>1,\n\t\t\t\t'tags'=>1,\n\t\t\t\t'filter'=>'title,keywords,body',\n\t\t\t];\n\t\t\tM('sysconfig')->add(['title'=>JZLANG('商品配置'),'field'=>'product_config','type'=>3,'data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),'typeid'=>0]);\n\t\t\tsetCache('webconfig',null);\n\t\t}else{\n\t\t\t$configdata = json_decode($config,1);\n\t\t}\n\t\t$this->configdata = $configdata;\n\t\t$this->tid = $this->frparam('tid');\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->display('product-add');\n\t}\n\tfunction editproduct(){\n\t\t$this->fields_biaoshi = 'product';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data = $this->frparam();\n\t\t\t$data = get_fields_data($data,'product');\n            check_field_must($data,'product');\n\t\t\tif(!$this->frparam('seo_title',1) && $this->frparam('config_seotitle')==1){\n\t\t\t\t$data['seo_title'] = $data['title'];\n\t\t\t}\n\t\t\tif(!$this->frparam('description',1) && $this->frparam('config_description')==1){\n\t\t\t\t$data['description'] = newstr(strip_tags($_POST['body']),200);\n\t\t\t}\n            $water_models = explode(',',$this->webconf['text_molds']);\n            if(in_array('product',$water_models)){\n                if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){\n                    $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']);\n                    //存储\n                    $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2);\n                    $pix_arr = explode('.',$data['litpic']);\n                    $pix = end($pix_arr);\n                    M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>'product']);\n                }\n            }\n\t\t\tif(!$data['litpic'] && $this->frparam('config_litpic')==1){\n\t\t\t\t$pattern='/<img.*?src=\"(.*?)\".*?>/is';\n\t\t\t\tif($this->frparam('body',1)){\n\t\t\t\t\t$r = preg_match($pattern,stripslashes($data['body']),$matchContent);\n\t\t\t\t\tif($r){\n\t\t\t\t\t\t$data['litpic'] = $matchContent[1];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$data['litpic'] = '';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$data['litpic'] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!$this->frparam('tags',1) && $this->frparam('config_tags')==1){\n\t\t\t\t$data['tags'] = str_replace('，',',',$data['keywords']);\n\t\t\t\tif($data['tags']){\n\t\t\t\t\t$data['tags'] = ','.$data['tags'].',';\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$data['userid'] = $_SESSION['admin']['id'];\n\t\t\t$data['htmlurl'] = $data['tid'] ? $this->classtypedata[$data['tid']]['htmlurl'] : null;\n\t\t\t\n\t\t\t//违禁词检测\n\t\t\tif($this->webconf['mingan'] && $this->frparam('config_filter',1)){\n\t\t\t\t$mingan = explode(',',$this->webconf['mingan']);\n\t\t\t\t$filter = explode(',',$this->frparam('config_filter',1));\n\t\t\t\t$fields = $this->getTableFields('product');\n\t\t\t\tforeach($mingan as $s){\n\t\t\t\t\tif(strpos($s,'{xxx}')!==false){\n\t\t\t\t\t\t$pattern = '/'.str_replace('{xxx}','(.*)',$s).'/';\n\t\t\t\t\t\tforeach($filter as $vv){\n\t\t\t\t\t\t\tif($vv && preg_match($pattern, $data[$vv])){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败').'，【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\n\t\t\t\t\t}else{\n\t\t\t\t\t\tforeach($filter as $vv){\n\t\t\t\t\t\t\tif($vv && strpos($data[$vv],$s)!==false ){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败').'，【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]'));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif($this->frparam('id')){\n\t\t\t\t\n\t\t\t\t$old_tags = M('product')->getField(['id'=>$this->frparam('id')],'tags');\n\t\t\t\t//处理自定义URL\n\t\t\t\t\n\t\t\t\tif($data['ownurl']){\n\t\t\t\t\t$customurl = M('customurl')->find(['url'=>$data['ownurl']]);\n\t\t\t\t\tif($customurl){\n\t\t\t\t\t\tif($customurl['aid']!=$this->frparam('id')){\n\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL！')));\n\t\t\t\t\t\t}else if($customurl['url']!=$data['ownurl']){\n\t\t\t\t\t\t\tM('customurl')->update(['id'=>$customurl['id']],['url'=>$data['ownurl'],'tid'=>$data['tid'],'molds'=>'product']);\n\t\t\t\t\t\t}else if($customurl['url']==$data['ownurl'] && $customurl['tid']!=$data['tid']){\n\t\t\t\t\t\t\tM('customurl')->update(['id'=>$customurl['id']],['tid'=>$data['tid']]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tif(M('customurl')->find(['aid'=>$this->frparam('id'),'molds'=>'product'])){\n\t\t\t\t\t\t\tM('customurl')->update(['aid'=>$this->frparam('id'),'molds'=>'product'],['url'=>$data['ownurl'],'molds'=>'product','tid'=>$data['tid']]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tM('customurl')->add(['molds'=>'product','tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$this->frparam('id')]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tM('customurl')->delete(['molds'=>'product','aid'=>$this->frparam('id')]);\n\t\t\t\t}\n\t\t\t\tif($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){\n\t\t\t\t\t$data['isshow'] = $this->frparam('isshow',0,1);\n\t\t\t\t}else{\n\t\t\t\t\t$data['isshow'] = 0;\n\t\t\t\t}\n                //检查是否重复\n                if($this->webconf['hidetitleonliy']){\n                    $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']);\n                    $onliyfield = '';\n                    foreach ($hidetitleonly as $s){\n                        $d = explode('-',$s);\n                        if(strtolower($d[0])=='product'){\n                            $onliyfield = strtolower($d[1]);\n                            break;\n                        }\n                    }\n                    if($onliyfield){\n                        $sql = $onliyfield.\"='\".$this->frparam($onliyfield,1).\"' and id!=\".$this->frparam('id');\n                        if(M('product')->find($sql)){\n                            JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复！')));\n                        }\n                    }\n                }\n                $data['addtime'] = isset($data['addtime']) ? $data['addtime'] : time();\n                $data['updatetime'] = time();\n\t\t\t\t //推荐置顶热门\n                if(strpos($data['jzattr'],'1')!==false){\n                    $data['istop'] = 1;\n                }else{\n                    $data['istop'] = 0;\n                }\n                if(strpos($data['jzattr'],'2')!==false){\n                    $data['ishot'] = 1;\n                }else{\n                    $data['ishot'] = 0;\n                }\n                if(strpos($data['jzattr'],'3')!==false){\n                    $data['istuijian'] = 1;\n                }else{\n                    $data['istuijian'] = 0;\n                }\n\t\t\t\tif(M('product')->update(array('id'=>$this->frparam('id')),$data)){\n\t\t\t\t\t//tags处理\n\t\t\t\t\tif($old_tags!=$data['tags']){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$a = $old_tags.$data['tags'];\n\t\t\t\t\t\t$new = [];\n\t\t\t\t\t\t$a = explode(',',$a);\n\t\t\t\t\t\tforeach($a as $v){\n\t\t\t\t\t\t\tif($v!='' && !in_array($v,$new)){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t$r = M('tags')->find(['keywords'=>$v]);\n\t\t\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\t\t\t$w['keywords'] = $v;\n\t\t\t\t\t\t\t\t\t$w['newname'] = '';\n\t\t\t\t\t\t\t\t\t$w['url'] = '';\n\t\t\t\t\t\t\t\t\t$w['num'] = -1;\n\t\t\t\t\t\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t\t\t\t\t\t$w['number'] = 1;\n                                    $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : '';\n\t\t\t\t\t\t\t\t\t$w['target'] = '_blank';\n\t\t\t\t\t\t\t\t\tM('tags')->add($w);\n\t\t\t\t\t\t\t\t}else{\n                                    if(strpos($old_tags,','.$v.',')===false){\n                                        if($data['tid']){\n                                            $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].',';\n                                            $ww['tids'] = $tags_tids;\n                                        }\n\n                                        $ww['number'] = $r['number']+1;\n                                        M('tags')->update(['keywords'=>$v],$ww);\n                                    }else if(strpos($data['tags'],','.$v.',')===false && strpos($old_tags,','.$v.',')!==false){\n                                        if($data['tid']){\n                                            $tags_tids = str_replace(','.$data['tid'].',',',',$r['tids']);\n                                            $ww['tids'] = $tags_tids==',' ? '' : $tags_tids;\n                                        }\n\n                                        $ww['number'] = $r['number']-1;\n                                        M('tags')->update(['keywords'=>$v],$ww);\n                                    }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t$new[]=$v;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif($this->webconf['release_award_open']==1 && $data['isshow']==1){\n\t\t\t\t\t\t$award = round($this->webconf['release_award'],2);\n\t\t\t\t\t\t$max_award = round($this->webconf['release_max_award'],2);\n\t\t\t\t\t\t$member_id = M('product')->getField(['id'=>$this->frparam('id')],'member_id');\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>'product','aid'=>$this->frparam('id'),'msg'=>JZLANG('发布奖励')]);\n\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"发布奖励\").\"' \";\n\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\tforeach($all as $v){\n\t\t\t\t\t\t\t\t\t\t$all_jifen+=$v['amount'];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t   \t  \t\t$w['molds'] = 'product';\n\t\t\t\t\t\t   \t  \t\t$w['aid'] = $this->frparam('id');\n\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('发布奖励');\n\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$config = $this->webconf['product_config'];\n\t\t\t\t\t$configdata = json_decode($config,1);\n\t\t\t\t\tif($configdata['seotitle']!=$this->frparam('config_seotitle') || $configdata['litpic']!=$this->frparam('config_litpic') || $configdata['tags']!=$this->frparam('config_tags') || $configdata['filter']!=$this->frparam('config_filter',1)){\n\t\t\t\t\t\t$configdata = [\n\t\t\t\t\t\t\t'seotitle'=>$this->frparam('config_seotitle'),\n\t\t\t\t\t\t\t'litpic'=>$this->frparam('config_litpic'),\n\t\t\t\t\t\t\t'description'=>$this->frparam('config_description'),\n\t\t\t\t\t\t\t'tags'=>$this->frparam('config_tags'),\n\t\t\t\t\t\t\t'filter'=>$this->frparam('config_filter',1),\n\t\t\t\t\t\t];\n\t\t\t\t\t\tM('sysconfig')->update(['field'=>'product_config'],['data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)]);\n\t\t\t\t\t\tsetCache('webconfig',null);\n\t\t\t\t\t}\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('index')));\n\t\t\t\t\texit;\n\t\t\t\t}else{\n\t\t\t\t\t\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('您未做任何修改，不能提交！')));\n\t\t\t\t\texit;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$this->data = M('product')->find(array('id'=>$this->frparam('id')));\n\t\t$config = $this->webconf['product_config'];\n\t\tif(!$config){\n\t\t\t$configdata = [\n\t\t\t\t'seotitle'=>1,\n\t\t\t\t'litpic'=>1,\n\t\t\t\t'description'=>1,\n\t\t\t\t'tags'=>1,\n\t\t\t\t'filter'=>'title,keywords,body',\n\t\t\t];\n\t\t\tM('sysconfig')->add(['title'=>JZLANG('内容配置'),'field'=>'product_config','type'=>3,'data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),'typeid'=>0]);\n\t\t\tsetCache('webconfig',null);\n\t\t}else{\n\t\t\t$configdata = json_decode($config,1);\n\t\t}\n\t\t$this->configdata = $configdata;\n\t\t$this->molds = M('molds')->find(['biaoshi'=>'product']);\n\t\t$this->classtypes = $this->classtypetree;\n\t\t$this->display('product-edit');\n\t\t\n\t}\n\tfunction deleteproduct(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('product')->find(['id'=>$id]);\n\t\t\tif(M('product')->delete(['id'=>$id])){\n\t\t\t\t$customurl = M('customurl')->find(['molds'=>'product','aid'=>$id]);\n\t\t\t\tM('customurl')->delete(['molds'=>'product','aid'=>$id]);\n\t\t\t\t$w['title'] = '['.$data['id'].']'.$data['title'];\n\t\t\t\t$w['molds'] = 'product';\n\t\t\t\t$w['data'] = serialize($data);\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\t$r = M('recycle')->add($w);\n\t\t\t\tif($customurl){\n\t\t\t\t\t$w['molds'] = 'customurl';\n\t\t\t\t\t$w['title'] = '['.$customurl['id'].']'.JZLANG('自定义链接');\n\t\t\t\t\t$w['data'] = serialize($customurl);\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t$w['aid'] = $r;\n\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\t//Error('删除失败！');\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//复制文章\n\tfunction copyproduct(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('product')->find(['id'=>$id]);\n\t\t\tunset($data['id']);\n\t\t\tif(M('product')->add($data)){\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('复制成功！')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('复制失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t}\n\t//批量删除\n\tfunction deleteAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$all = M('product')->findAll('id in('.$data.')');\n\t\t\tif(M('product')->delete('id in('.$data.')')){\n\t\t\t\t$customurls = M('customurl')->findAll(\" aid in(\".$data.\") and molds='product' \");\n\t\t\t\tM('customurl')->delete(\" aid in(\".$data.\") and molds='product' \");\n\t\t\t\t$newcustomurl = [];\n\t\t\t\tif($customurls){\n\t\t\t\t\tforeach($customurls as $v){\n\t\t\t\t\t\t$newcustomurl[$v['aid']] = $v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tforeach($all as $v){\n\t\t\t\t\t$w['molds'] = 'product';\n\t\t\t\t\t$w['data'] = serialize($v);\n\t\t\t\t\t$w['title'] = '['.$v['id'].']'.$v['title'];\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t$x = M('recycle')->add($w);\n\t\t\t\t\tif($x && $newcustomurl[$v['id']]){\n\t\t\t\t\t\t$w['molds'] = 'customurl';\n\t\t\t\t\t\t$w['title'] = '['.$newcustomurl['id'].']'.JZLANG('自定义链接');\n\t\t\t\t\t\t$w['data'] = serialize($newcustomurl[$v['id']]);\n\t\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t\t$w['aid'] = $x;\n\t\t\t\t\t\tM('recycle')->add($w);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t//批量复制\n\tfunction copyAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t$list = M('product')->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\tunset($v['id']);\n\t\t\t\tif(!M('product')->add($v)){\n\t\t\t\t\t$r = false;break;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif($r){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量复制成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量复制失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t//批量修改\n\tfunction changeType(){\n\t\t$data = $this->frparam('data',1);\n\t\t$tid = $this->frparam('tid');\n\t\tif($data!=''){\n\t\t\t$list = M('product')->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\t$w['tid'] = $tid;\n\t\t\t\t$type = M('classtype')->find(array('id'=>$tid));\n\t\t\t\t$w['htmlurl'] = $type['htmlurl'];\n\t\t\t\tM('product')->update(array('id'=>$v['id']),$w);\n\t\t\t\tif($v['ownurl']){\n\t\t\t\t\tM('customurl')->update(['aid'=>$v['id'],'molds'=>'product'],['tid'=>$tid]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功！')));\n\t\t}\n\t}\n\t//修改排序\n\tfunction editProductOrders(){\n\t\t$field = $this->frparam('field',1);\n\t\t$w[$field] = $this->frparam('value',1);\n\t\t$r = M('product')->update(array('id'=>$this->frparam('id')),$w);\n\t\tif(!$r){\n\t\t\tJsonReturn(array('code'=>1,'info'=>JZLANG('修改失败！')));\n\t\t}\n\t\tJsonReturn(array('code'=>0,'info'=>JZLANG('修改成功！')));\n\t}\n\n\t//批量修改推荐属性\n\tfunction changeAttribute(){\n\t\t$data = $this->frparam('data',1);\n\t\t$tj = $this->frparam('tj');\n\t\tif($data!=''){\n\t\t\t$list = M('Product')->findAll('id in('.$data.')');\n\t\t\t$r = true;\n\t\t\tforeach($list as $v){\n\t\t\t\tif(strpos($v['jzattr'],','.$tj.',')!==false){\n\t\t\t\t\t$attr = str_replace(','.$tj.',','',$v['jzattr']);\n\t\t\t\t\tif(!$attr){\n\t\t\t\t\t\t$w['jzattr'] = '';\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$w['jzattr'] = ','.trim($attr,',').',';\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tif($v['jzattr']){\n\t\t\t\t\t\t$w['jzattr'] = $v['jzattr'].$tj.',';\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$w['jzattr'] = ','.$tj.',';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t if(strpos($w['jzattr'],'1')!==false){\n                    $w['istop'] = 1;\n                }else{\n                    $w['istop'] = 0;\n                }\n                if(strpos($w['jzattr'],'2')!==false){\n                    $w['ishot'] = 1;\n                }else{\n                    $w['ishot'] = 0;\n                }\n                if(strpos($w['jzattr'],'3')!==false){\n                    $w['istuijian'] = 1;\n                }else{\n                    $w['istuijian'] = 0;\n                }\n\t\t\t\tM('Product')->update(array('id'=>$v['id']),$w);\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功！')));\n\t\t}\n\t}\n\n\t//批量审核\n\tfunction checkAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\tif($this->frparam('isshow')==1){\n\t\t\t\t$isshow = 1;\n\t\t\t}else if($this->frparam('isshow')==2){\n\t\t\t\t$isshow = 0;\n\t\t\t}else{\n\t\t\t\t$isshow = 2;\n\t\t\t}\n\t\t\tif($isshow==1){\n\t\t\t\t$all = M('product')->findAll('id in('.$data.')');\n\t\t\t\t$award = round($this->webconf['release_award'],2);\n\t\t\t\t$max_award = round($this->webconf['release_max_award'],2);\n\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\tforeach ($all as $k => $v) {\n\t\t\t\t\tif($v['isshow']!=1){\n\t\t\t\t\t\t//start\n\t\t\t\t\t\tif($this->webconf['release_award_open']==1){\n\t\t\t\t\t\t\t$member_id = $v['member_id'];\n\t\t\t\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>'product','aid'=>$v['id'],'msg'=>JZLANG('发布奖励')]);\n\t\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"发布奖励\").\"' \";\n\t\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\t\tforeach($all as $vv){\n\t\t\t\t\t\t\t\t\t\t\t$all_jifen+=$vv['amount'];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t\t                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t\t   \t  \t\t$w['molds'] = 'product';\n\t\t\t\t\t\t\t   \t  \t\t$w['aid'] = $v['id'];\n\t\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('发布奖励');\n\t\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//end\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tM('product')->update('id in('.$data.')',['isshow'=>$isshow]);\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量操作成功！')));\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t}\n\t}\n\n\n\t\n\tprivate function getTableFields($table){\n\t\t$sql=\"select distinct * from information_schema.columns where table_schema = '\".DB_NAME.\"' and  table_name = '\".DB_PREFIX.$table.\"'\";\n        $list = M()->findSql($sql);\n        $isgo = true;\n        $fields = [];\n\t\t\n        foreach($list as $v){\n\t\t\t$len = 0;\n\t\t\t$s = preg_match('/\\((.*)\\)/',$v['COLUMN_TYPE'],$math);\n\t\t\tif($s){\n\t\t\t\t$len = $math[1];\n\t\t\t}\n\t\t\t$fields[$v['COLUMN_NAME']] = $v['COLUMN_COMMENT'] ? $v['COLUMN_COMMENT'] : $v['COLUMN_NAME'];\n\t\t\t\n            \n\n        }\n        return $fields;\n\n    }\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/admin/c/RecycleController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2022/01\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass RecycleController extends CommonController\n{\n\tpublic function index(){\n\t\t\n\t\tif($this->frparam('ajax',1)){\n\t\t\t$page = new Page('recycle');\n\t\t\t$sql = '1=1';\n\t\t\t$data = $this->frparam();\n\t\t\tif($this->frparam('molds',1)){\n\t\t\t\t$sql.=\" and molds='\".$this->frparam('molds',1).\"'\";\n\t\t\t}\n\t\t\t$data = $page->where($sql)->limit($this->frparam('limit',0,10))->orderby('id desc')->page($this->frparam('page',0,1))->go();\n\t\t\t$ajaxdata = [];\n\t\t\t$molds = M('molds')->findAll();\n\t\t\t$moldsname = [];\n\t\t\tforeach($molds as $v){\n\t\t\t\t$moldsname[$v['biaoshi']] = $v['name'];\n\t\t\t}\n\t\t\tforeach($data as $v){\n\t\t\t\t$v['moldsname'] = $moldsname[$v['molds']];\n\t\t\t\t$ajaxdata[]=$v;\n\t\t\t}\n\t\t\t$pages = $page->pageList();\n\t\t\t$this->pages = $pages;\n\t\t\t$this->lists = $data;\n\t\t\t$this->sum = $page->sum;\n\t\t\tJsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]);\n\t\t\t\n\t\t}\n\t\t\n\t\t$this->molds = $this->frparam('molds',1);\n\t\t\n\t\t\n\t\t$this->display('recycle-list');\n\t\n\t\t\n\t}\n\n\tpublic function restore(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$recycle = M('recycle')->find(['id'=>$id]);\n\t\t\tif($recycle){\n\t\t\t\t$data = unserialize($recycle['data']);\n\t\t\t\t$r = M($recycle['molds'])->add($data);\n\t\t\t\tif($r){\n\t\t\t\t\tM('recycle')->delete(['id'=>$id]);\n\t\t\t\t\t$relative = M('recycle')->findAll(['aid'=>$id]);\n\t\t\t\t\t$ids = [];\n\t\t\t\t\tforeach($relative as $v){\n\t\t\t\t\t\t$d = unserialize($v['data']);\n\t\t\t\t\t\t$rr = M($v['molds'])->add($d);\n\t\t\t\t\t\tif($rr){\n\t\t\t\t\t\t\tM('recycle')->delete(['id'=>$v['id']]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$ids[]=$v['id'];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(count($ids)){\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('部分未执行成功！').'['.implode(',',$ids).']'));\n\t\t\t\t\t}\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('操作成功！')));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('还原失败，可能是ID已经存在！')));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('数据不存在！')));\n\t\t\t}\n\t\t\t\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('参数错误！')));\n\t\t}\n\t\t\n\t\t\n\t}\n\t\n\tpublic function restoreAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data){\n\t\t\t$recycles = M('recycle')->findAll('id in('.$data.')');\n\t\t\t$ids = [];\n\t\t\tforeach($recycles as $v){\n\t\t\t\t$data = unserialize($v['data']);\n\t\t\t\t$r = M($v['molds'])->add($data);\n\t\t\t\tif($r){\n\t\t\t\t\tM('recycle')->delete(['id'=>$v['id']]);\n\t\t\t\t\t$relative = M('recycle')->findAll(['aid'=>$v['id']]);\n\t\t\t\t\tforeach($relative as $vv){\n\t\t\t\t\t\t$d = unserialize($vv['data']);\n\t\t\t\t\t\t$rr = M($vv['molds'])->add($d);\n\t\t\t\t\t\tif($rr){\n\t\t\t\t\t\t\tM('recycle')->delete(['id'=>$vv['id']]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$ids[]=$vv['id'];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$ids[]=$v['id'];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif(count($ids)){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('部分未执行成功！').'['.implode(',',$ids).']'));\n\t\t\t}\n\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('操作成功！')));\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n\tpublic function del(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t$data = M('recycle')->find(['id'=>$id]);\n\t\t\tif(M('recycle')->delete(['id'=>$id])){\n\t\t\t\tM('recycle')->delete(['aid'=>$id]);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t}\n\t\n\tpublic function delAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data){\n\t\t\tif(M('recycle')->delete('id in('.$data.')')){\n\t\t\t\tM('recycle')->delete('aid in('.$data.')');\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\n}"
  },
  {
    "path": "app/admin/c/RulersController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass RulersController extends CommonController\n{\n\tpublic function index(){\n\t\t\n\t\t$rulers = M('Ruler')->findAll();\n\t\t$rulers = set_class_haschild($rulers);\n\t\t$rulers = getTree($rulers);\n\t\t\n\t\t$this->lists = $rulers;\n\t\t$this->display('ruler-list');\n\t}\n\t\n\tpublic function addrulers(){\n\t\t\n\t\t$this->fields_biaoshi = 'ruler';\n\t\tif($this->frparam('go',1)==1){\n\t\t\t\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['fc'] = $this->frparam('fc',1);\n\t\t\t$data['pid'] = $this->frparam('pid');\n\t\t\t$data['sys'] = $this->frparam('sys');\n\t\t\t$data['isdesktop'] = $this->frparam('isdesktop');\n\t\t\t\n\t\t\tif(M('Ruler')->add($data)){\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功！')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\t//Error('添加失败！');\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t$rulers = M('Ruler')->findAll('pid=0');\n\t\t//$rulers = getTree($rulers);\n\t\t$this->pid = $this->frparam('pid');\n\t\t$this->rulers = $rulers;\n\t\t\n\t\t$this->display('ruler-add');\n\t}\n\t\n\tpublic function editrulers(){\n\n\t\t$this->fields_biaoshi = 'ruler';\n\t\tif($this->frparam('go')==1){\n\t\t\t$data['name'] = $this->frparam('name',1);\n\t\t\t$data['fc'] = $this->frparam('fc',1);\n\t\t\t$data['pid'] = $this->frparam('pid');\n\t\t\t$data['sys'] = $this->frparam('sys');\n\t\t\t$data['isdesktop'] = $this->frparam('isdesktop');\n\t\t\t\n\t\t\t$a = M('Ruler')->update(array('id'=>$this->frparam('id')),$data);\n\t\t\tif($a){\n\t\t\t\tJsonReturn(array('status'=>1));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('status'=>1,'info'=>JZLANG('修改失败！')));\n\t\t\t}\n\t\t}\n\t\t$this->data = M('Ruler')->find(array('id'=>$this->frparam('id')));\n\t\t\n\t\t$rulers = M('Ruler')->findAll('pid=0');\n\t\t//$rulers = getTree($rulers);\n\t\n\t\t$this->rulers = $rulers;\n\t\t\n\t\t$this->display('ruler-edit');\n\t}\n\t\n\tpublic function deleterulers(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t//判断是否为系统功能，系统功能不能删除\n\t\t\t$ruler = M('Ruler')->find(array('id'=>$id));\n\t\t\tif($ruler['sys']==1){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败，系统功能不能删除！')));\n\t\t\t}\n\t\t\t$n = M('Ruler')->find(array('pid'=>$id));\n\t\t\tif($n){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败，该分类有下级功能，请先删除下级功能！')));\n\t\t\t}else{\n\t\t\t\t$m = M('Ruler')->delete(array('id'=>$id));\n\t\t\t\tif($m){\n                    $w['molds'] = 'ruler';\n                    $w['data'] = serialize($ruler);\n                    $w['title'] = '['.$ruler['id'].']'.$ruler['name'];\n                    $w['addtime'] = time();\n                    $x = M('recycle')->add($w);\n\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}else{\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('未选择删除对象！')));\n\t\t}\n\t}\n\t\n\t\n}"
  },
  {
    "path": "app/admin/c/SysController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }\n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass SysController extends CommonController\n{\n\n\n\n    public function index(){\n\n        $web_config = $this->webconf;\n        $custom = M('sysconfig')->findAll('type!=0');\n        if($_POST){\n            $data = $this->frparam();\n            //检查redis配置问题\n            if(isset($data['openredis']) && $data['openredis']){\n                $config = require(APP_PATH . 'Conf/config.php');\n                $redis = new \\Redis();\n                $res = $redis->connect($config['redis']['HOST'],$config['redis']['PORT']);\n                if(!$res){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('Redis连接失败！请先检查conf/config.php里面redis配置！')]);\n                }\n                if($config['redis']['AUTH']){\n                    $r = $redis->auth($config['redis']['AUTH']);\n                    if(!$r){\n                        JsonReturn(['code'=>1,'msg'=>JZLANG('Redis开启了密码验证，并且验证失败！请先检查conf/config.php里面redis中AUTH配置是否正确！如果没有设置密码，请将值设置成null')]);\n                    }\n                }\n\n\n\n            }\n            //删除自定义栏目\n            if($this->frparam('deltype')){\n                $ctype = $this->frparam('ctype');\n                $aid = $this->frparam('aid');\n                if($ctype){\n                    $isok = M('sysconfig')->find(['typeid'=>$ctype]);\n                    if($isok){\n                        JsonReturn(['code'=>1,'msg'=>JZLANG('配置栏下有自定义配置，无法删除配置栏')]);\n                    }\n                    $old = M('ctype')->find(['id'=>$ctype]);\n                    //删除相关权限\n                    M('ruler')->delete(['fc'=>'Sys/ctype/type/'.$old['action']]);\n                    M('ctype')->delete(['id'=>$ctype]);\n                    JsonReturn(['code'=>0,'msg'=>JZLANG('操作成功！')]);\n\n                }\n                JsonReturn(['code'=>1,'msg'=>JZLANG('操作失败！')]);\n            }\n            $whereArr = [];\n            $valueArr = [];\n            $lists = M('sysconfig')->findAll();\n            $orders = $this->frparam('orders',2);\n            foreach($lists as $k=>$v){\n                if (array_key_exists($v['field'],$data)) {\n                    if($v['type']==9 || $v['type']==8){\n                        $value = $_POST[$v['field']];\n                        $value=htmlspecialchars(trim($value), ENT_QUOTES);\n                        $value = addslashes($value);\n\n                    }else if($v['type']==4){\n                        $value = $this->frparam($v['field'],4);\n                    }else{\n                        $value = $this->frparam($v['field'],1);\n                    }\n                    $whereArr[]=['field'=>$v['field']];\n                    if($this->frparam('isorder')){\n                        $valueArr[]=['data'=>$value,'orders'=>intval($orders[$v['field']])];\n                    }else{\n                        $valueArr[]=['data'=>$value];\n                    }\n                }\n\n\n\n\n            }\n            if(count($whereArr) && count($valueArr)){\n                M('sysconfig')->updateMuti($whereArr,$valueArr);\n            }\n\n\n            //检测是否有新增\n            if($this->frparam('custom_title',1) && $this->frparam('custom_type')){\n                $new['title'] = $this->frparam('custom_title',1);\n                $new['data'] = '';\n                $new['tip'] = $this->frparam('custom_tips',1);\n                $new['type'] = $this->frparam('custom_type');\n                $new['typeid'] = $this->frparam('custom_ctype',0,1);\n                $new['orders'] = 0;\n                $new['sys'] = 0;\n                $new['config'] = str_replace('，',',',$this->frparam('custom_config',1));\n                if($this->frparam('custom_fields',1)){\n                    $new['field'] = $this->frparam('custom_fields',1);\n                    $n = M('sysconfig')->add($new);\n                }else{\n                    $new['field'] = 'jizhi_demo';\n                    $n = M('sysconfig')->add($new);\n                    if($n){\n                        M('sysconfig')->update(['id'=>$n],['field'=>'jz_'.$n]);\n                    }\n                }\n            }\n            if($this->frparam('custom_new_title',1) && $this->frparam('custom_new_fields',1)){\n                $ww['action'] = $this->frparam('custom_new_fields',1);\n                if(M('ctype')->find($ww)){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('已存在配置标识，请重新设置！')]);\n                }\n                $ww['title'] = $this->frparam('custom_new_title',1);\n                M('ctype')->add($ww);\n                //新增系统配置权限\n                $con['name'] = $ww['title'];\n                $con['fc'] = 'Sys/'.$ww['action'];\n                $con['pid'] = 39;\n                $con['isdesktop'] = 0;\n                $con['sys'] = 0;\n                M('ruler')->add($con);\n\n            }\n            $config = include(APP_PATH.'conf/config.php');\n            if(checkAction('Sys/ctype/type/high-level')){\n                if($this->frparam('isdebug')){\n                    $config['APP_DEBUG'] = true;\n                }else{\n                    $config['APP_DEBUG'] = false;\n                }\n                if($this->frparam('hideclasspath')){\n                    $config['File_TXT_HIDE'] = true;\n                }else{\n                    $config['File_TXT_HIDE'] = false;\n                }\n            }\n\n\n            $ress = file_put_contents(APP_PATH.'conf/config.php', '<?php return ' . var_export($config, true) . '; ?>');\n\n            if($this->webconf['pc_html']!=$this->frparam('pc_html',1) || $this->webconf['mobile_html']!=$this->frparam('mobile_html',1)){\n                setCache('classtype',null);\n                setCache('mobileclasstype',null);\n                setCache('classtypedatamobile',null);\n                setCache('classtypedatapc',null);\n            }\n            setCache('webconfig',null);\n            setCache('hometpl',null);\n            setCache('wxhometpl',null);\n            setCache('mobilehometpl',null);\n\n            JsonReturn(['code'=>0,'msg'=>JZLANG('提交成功！')]);\n\n        }\n        //获取前台template\n        $indexdata = file_get_contents(APP_PATH.'index.php');\n        $r = preg_match(\"/define\\('HOME_VIEW',[\\'|\\\"](.*?)[\\'|\\\"]\\)/\",$indexdata,$matches);\n        if($r){\n            $template = $matches[1];\n        }else{\n            $template = 'template';\n        }\n        $rr = preg_match(\"/define\\('TPL_PATH',[\\'|\\\"](.*?)[\\'|\\\"]\\)/\",$indexdata,$matches);\n        if($rr){\n            $tplpath = $matches[1];\n        }else{\n            $tplpath = 'Home';\n        }\n        $dir = APP_PATH.$tplpath.'/'.$template;\n        $fileArray=array();\n        if(is_dir($dir)){\n\n            if (false != ($handle = opendir ( $dir ))) {\n                $i=0;\n                while ( false !== ($file = readdir ( $handle )) ) {\n                    //去掉\"“.”、“..”以及带“.xxx”后缀的文件\n                    if ($file != \".\" && $file != \"..\"&& strpos($file,\".html\")===false) {\n                        $fileArray[]=$file;\n                        $i++;\n                    }\n                }\n                //关闭句柄\n                closedir ( $handle );\n            }\n        }\n        $this->templatelist = $fileArray;\n        $this->config = $web_config;\n        $this->custom =\t$custom;\n        $this->admin = $_SESSION['admin'];\n        $this->display('sys');\n\n    }\n\n    public function custom_del(){\n\t   $field = $this->frparam('field',1);\n\t   if($field){\n\t\t    $r = M('sysconfig')->delete(\" sys!=1 and field='\".$field.\"'\");\n\t\t\tif($r){\n\t\t\t\tsetCache('webconfig',null);\n\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('删除成功！')]);\n\t\t\t}else{\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('删除失败！系统字段不允许删除！')]);\n\t\t\t}\n\t\t  \n\t   }\n\t    JsonReturn(['code'=>1,'msg'=>JZLANG('删除失败！')]);\n\t   \n    }\n\t//登录日志\n\tpublic function loginlog(){\n\t\t\n\t\tif($this->frparam('ajax')){\n\t\t\t$res = show_log('login');\n\t\t\tif(!$res){\n\t\t\t\tJsonReturn(['code'=>0,'data'=>array(),'count'=>0]);\n\t\t\t}\n\t\t\tif($this->admin['isadmin']!=1){\n\t\t\t\t$admins = M('level')->findAll(['gid'=>1]);\n\t\t\t\t$ids = [];\n\t\t\t\tforeach($admins as $v){\n\t\t\t\t\t$ids[]=$v['id'];\n\t\t\t\t}\n\t\t\t\t$new = [];\n\t\t\t\tforeach($res as $v){\n\t\t\t\t\tif(!in_array($v['data']['id'],$ids)){\n\t\t\t\t\t\t$new[]=$v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$res = $new;\n\t\t\t}\n\t\t\t\n\t\t\trsort($res);\n\t\t\t$page = new \\ArrayPage($res);\n\t\t\t\n\t\t\tif(isset($_GET['limit'])){\n\t\t\t\t$_SESSION['limit'] = $_GET['limit'];\n\t\t\t}\n\n\t\t\tif(isset($_SESSION['limit'])){\n\t\t\t\t$limit = $_SESSION['limit'];\n\t\t\t}else{\n\t\t\t\t$limit = 10;\n\t\t\t}\n\t\t\t$count = count($res);\n\t\t\t\n\t\t\t\n\t\t\t$lists = $page->query(['page'=>$this->frparam('page',0,1)])->setPage(['limit'=>$limit])->go();\n\t\t\tforeach($lists as $k=>$v){\n\t\t\t\t$lists[$k]['id'] = $v['data']['id'];\n\t\t\t\t$lists[$k]['username'] = $v['data']['name'];\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tJsonReturn(['code'=>0,'data'=>$lists,'count'=>$count]);\n\t\t}\n\t\t\n\t\t$this->display('loginlog');\n\t\t\n\t}\n\t//图片库\n\tpublic function pictures(){\n\t\t$page = new Page('pictures');\n\t\t$sql = ' 1=1 ';\n\t\tif($this->frparam('molds',1)){\n\t\t\tif($this->frparam('molds',1)=='other'){\n\t\t\t\t$sql .= \" and (molds='' || molds is null) \";\n\t\t\t}else{\n\t\t\t\t$sql .= \" and molds='\".$this->frparam('molds',1).\"' \";\n\t\t\t}\n\t\t\t\n\t\t}\n\t\tif($this->frparam('path',1)){\n\t\t\t$sql .= \" and path='\".$this->frparam('path',1).\"' \";\n\t\t}\n\t\tif($this->frparam('tid')){\n\t\t\t$sql .= ' and tid='.$this->frparam('tid');\n\t\t}\n\t\t$this->tid = $this->frparam('tid');\n\t\t$this->path = $this->frparam('path',1);\n\t\t$this->molds = $this->frparam('molds',1);\n\t\t\n\t\t$data = $page->where($sql)->orderby('addtime desc,id desc')->page($this->frparam('page',0,1))->go();\n\t\t$pages = $page->pageList();\n\t\t$this->pages = $pages;\n\t\t$this->lists = $data;\n\t\t$this->sum = $page->sum;\n\t\t\n\t\t$this->tid=  $this->frparam('tid');\n\t\t//$classtype = M('classtype')->findAll(null,'orders desc');\n\t\t//$classtype = getTree($classtype);\n\t\t$this->classtypes = $this->classtypetree;\n        if($this->frparam('ajax')){\n            foreach($data as $k=>$v){\n                $data[$k]['fileName'] = basename($v['litpic']);\n            }\n            \n            $res = ['code'=>0,'data'=>$data,'count'=>$this->sum];\n            JsonReturn($res);\n            \n        }\n\t\t$this->display('pictures');\n\t\t\n\t}\n\t//删除图片\n\tpublic function deletePic(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\t\n\t\t\t$pic = M('pictures')->find(['id'=>$id]);\n\t\t\tif(strpos($pic['litpic'],'http')===false){\n\t\t\t\tif(file_exists('.'.$pic['litpic'])){\n\t\t\t\t\tunlink('.'.$pic['litpic']);\n\t\t\t\t\t$r = M('pictures')->delete(['id'=>$id]);\n\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('删除成功！')]);\n\t\t\t\t}else{\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('图片不存在，删除失败！')]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('远程存储图片无法删除！')]);\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}else{\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('图片ID错误！')]);\n\t\t}\n\t\t\n\t}\n\t//批量删除\n\tpublic function deletePicAll(){\n\t\t$data = $this->frparam('data',1);\n\t\tif($data!=''){\n\t\t\t\n\t\t\t$pictures = M('pictures')->findAll('id in('.$data.')');\n\t\t\t$isall = true;\n\t\t\tforeach($pictures as $v){\n\t\t\t\tif(strpos($v['litpic'],'http')===false){\n\t\t\t\t\tif(file_exists('.'.$v['litpic'])){\n\t\t\t\t\t\tunlink('.'.$v['litpic']);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$isall = false;\n\t\t\t\t}\n\t\t\t\tM('pictures')->delete(['id'=>$v['id']]);\n\t\t\t}\n\t\t\t\n\t\t\tif($isall){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('部分删除成功，存在远程链接无法删除！')));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t}\n\t//上传证书\n\tpublic function uploadcert(){\n\t\tif ($_FILES[\"file\"][\"error\"] > 0){\n\t\t  $data['error'] =  \"Error: \" . $_FILES[\"file\"][\"error\"];\n\t\t  $data['code'] = 1000;\n\t\t}else{\n\t\t  // echo \"Upload: \" . $_FILES[\"file\"][\"name\"] . \"<br />\";\n\t\t  // echo \"Type: \" . $_FILES[\"file\"][\"type\"] . \"<br />\";\n\t\t  // echo \"Size: \" . ($_FILES[\"file\"][\"size\"] / 1024) . \" Kb<br />\";\n\t\t  // echo \"Stored in: \" . $_FILES[\"file\"][\"tmp_name\"];\n\t\t\t$pix = explode('.',$_FILES['file']['name']);\n\t\t\t$pix = end($pix);\n\t\t\t\n\t\t\t$fileType = webConf('fileType');\n\t\t\tif(strpos($fileType,strtolower($pix))===false  || stripos($pix,'php')!==false){\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"文件类型不允许上传！\");\n\t\t\t\t$data['code'] = 1002;\n\t\t\t\tJsonReturn($data);\n\t\t\t}\n\t\t\t$fileSize = (int)webConf('fileSize');\n\t\t\tif($fileSize!=0 && $_FILES[\"file\"][\"size\"]/(1024*1024)>$fileSize){\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"文件大小超过网站内部限制！\");\n\t\t\t\t$data['code'] = 1003;\n\t\t\t\tJsonReturn($data);\n\t\t\t}\n\t\t\tif(!is_dir('static/upload')){\n\t\t\t\tmkdir('static/upload',0777);\n\t\t\t}\n\t\t\tif(!is_dir('static/upload/cert')){\n\t\t\t\tmkdir('static/upload/cert',0777);\n\t\t\t}\n\t\t    $filename =  'static/upload/cert/'.date('Ymd').rand(1000,9999).'.'.$pix;\n\t\t  \n\t\t\tif(move_uploaded_file($_FILES[\"file\"]['tmp_name'],$filename)){\n\t\t\t\t$data['url'] = $filename;\n\t\t\t\t$data['code'] = 0;\n\t\t\t\t$filesize = round(filesize(APP_PATH.$filename)/1024,2);\n\t\t\t\tM('pictures')->add(['litpic'=>'/'.$filename,'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid',0,0),'molds'=>$this->frparam('molds',1,null)]);\n\t\t\t}else{\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"请检查目录\").\"[static/upload/cert]\".JZLANG(\"写入权限\");\n\t\t\t\t$data['code'] = 1001;\n\t\t\t\t\n\t\t\t}\n\n\t\t\t\n\t\t \n\t\t}\n\n\t\tJsonReturn($data);\n\t\t\n\t}\n\n\tpublic function datacache(){\n\t\t$this->lists = M('cachedata')->findAll();\n\t\t$this->display('datacache');\n\t}\n\t\n\tpublic function addcache(){\n\t\tif($this->frparam('go',1)==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data['title'] = $this->frparam(\"title\",1);\n\t\t\t$data['limits'] = $this->frparam(\"limits\");\n\t\t\t$data['orders'] = $this->frparam(\"orders\",1);\n\t\t\t$data['tid'] = $this->frparam('tid');\n\t\t\t$data['isall'] = $this->frparam('isall');\n\t\t\t$data['sqls'] = $this->frparam('sqls',1);\n\t\t\t$data['field'] = $this->frparam('field',1);\n\t\t\t$data['times'] = $this->frparam('times',0,10);\n\t\t\t$data['molds'] = $this->frparam('molds',1);\n\t\t\t\n\t\t\tif(stripos($data['sqls'],'update')!==false || stripos($data['sqls'],'delete')!==false || stripos($data['sqls'],'insert')!==false || stripos($data['sqls'],'drop')!==false || stripos($data['sqls'],'truncate')!==false){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作')));\n\t\t\t}\n\t\t\t$tid = $data['tid'] ? ($data['isall']==1 ? ' and tid in ('.implode(',',$this->classtypedata[$data['tid']]['children']['ids']).') ' : ' and tid='.$data['tid']) : '';\n\t\t\t$sqls = $data['sqls'] ? ' and '.$data['sqls'] : '';\n\t\t\t$orderby = $data['orders'] ? ' order by '.$data['orders'] : '';\n\t\t\t$limit = $data['limits'] ? ' limit '.$data['limits'] : '';\n\t\t\tif($tid || $sqls){\n\t\t\t\t$where = ' where 1=1 '.$tid.htmlspecialchars_decode($sqls,ENT_QUOTES);\n\t\t\t}else{\n\t\t\t\t$where = '';\n\t\t\t}\n\t\t\t$sql = \"select * from \".DB_PREFIX.$data['molds'].$where.$orderby.$limit;\n\t\t\t$result = M()->findSql($sql);\n\t\t\tif($result){\n\t\t\t\tforeach($result as $k=>$v){\n\t\t\t\t\tif(isset($v['htmlurl'])){\n\t\t\t\t\t\t$result[$k]['url'] = gourl($v,$v['htmlurl']);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(M('cachedata')->add($data)){\n\t\t\t\t\n\t\t\t\t$time = $data['times']*60;\n\t\t\t\tsetCache('jzcache_'.$data['field'],$result,$time);\n\t\t\t\t\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功！继续添加~'),'url'=>U('sys/addcache')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\t$this->display('addcache');\n\t}\n\t\n\tpublic function editcache(){\n\t\t$id = $this->frparam('id');\n\t\t$res = M('cachedata')->find(['id'=>$id]);\n\t\tif(!$id || !$res){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('缺少ID')]);\n\t\t\t}\n\t\t\tError(JZLANG('链接错误！'));\n\t\t}\n\t\tif($this->frparam('go',1)==1){\n\t\t\t$data = $this->frparam();\n\t\t\t$data['title'] = $this->frparam(\"title\",1);\n\t\t\t$data['limits'] = $this->frparam(\"limits\");\n\t\t\t$data['orders'] = $this->frparam(\"orders\",1);\n\t\t\t$data['tid'] = $this->frparam('tid');\n\t\t\t$data['isall'] = $this->frparam('isall');\n\t\t\t$data['sqls'] = $this->frparam('sqls',1);\n\t\t\t$data['field'] = $this->frparam('field',1);\n\t\t\t$data['times'] = $this->frparam('times',0,10);\n\t\t\t$data['molds'] = $this->frparam('molds',1);\n\t\t\tif(stripos($data['sqls'],'update')!==false || stripos($data['sqls'],'delete')!==false || stripos($data['sqls'],'insert')!==false || stripos($data['sqls'],'drop')!==false || stripos($data['sqls'],'truncate')!==false){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作')));\n\t\t\t}\n\t\t\t$tid = $data['tid'] ? ($data['isall']==1 ? ' and tid in ('.implode(',',$this->classtypedata[$data['tid']]['children']['ids']).') ' : ' and tid='.$data['tid']) : '';\n\t\t\t$sqls = $data['sqls'] ? ' and '.$data['sqls'] : '';\n\t\t\t$orderby = $data['orders'] ? ' order by '.$data['orders'] : '';\n\t\t\t$limit = $data['limits'] ? ' limit '.$data['limits'] : '';\n\t\t\tif($tid || $sqls){\n\t\t\t\t$where = ' where 1=1 '.$tid.htmlspecialchars_decode($sqls,ENT_QUOTES);\n\t\t\t}else{\n\t\t\t\t$where = '';\n\t\t\t}\n\t\t\t$sql = \"select * from \".DB_PREFIX.$data['molds'].$where.$orderby.$limit;\n\t\t\t$result = M()->findSql($sql);\n\t\t\tif($result){\n\t\t\t\tforeach($result as $k=>$v){\n\t\t\t\t\tif(isset($v['htmlurl'])){\n\t\t\t\t\t\t$result[$k]['url'] = gourl($v,$v['htmlurl']);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(M('cachedata')->update(['id'=>$id],$data)){\n\t\t\t\t\n\t\t\t\t$time = $data['times']*60;\n\t\t\t\tsetCache('jzcache_'.$data['field'],$result,$time);\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('sys/datacache')));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败！')));\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t$this->data = $res;\n\t\t\n\t\t$this->display('editcache');\n\t}\n\t\n\tpublic function delcache(){\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\tif(M('cachedata')->delete('id='.$id)){\n\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功！')));\n\t\t\t}else{\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败！')));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic function viewcache(){\n\t\t$id = $this->frparam('id');\n\t\t$res = M('cachedata')->find(['id'=>$id]);\n\t\tif(!$id || !$res){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('缺少ID')]);\n\t\t\t}\n\t\t\tError(JZLANG('链接错误！'));\n\t\t}\n\t\t\n\t\t\n\t\t$tid = $res['tid'] ? ($res['isall']==1 ? ' and tid in ('.implode(',',$this->classtypedata[$res['tid']]['children']['ids']).') ' : ' and tid='.$res['tid']) : '';\n\t\t$sqls = $res['sqls'] ? ' and '.$res['sqls'] : '';\n\t\t$orderby = $res['orders'] ? ' order by '.$res['orders'] : '';\n\t\t$limit = $res['limits'] ? ' limit '.$res['limits'] : '';\n\t\tif($tid || $sqls){\n\t\t\t$where = ' where 1=1 '.$tid.htmlspecialchars_decode($sqls,ENT_QUOTES);\n\t\t}else{\n\t\t\t$where = '';\n\t\t}\n\t\t$sql = \"select * from \".DB_PREFIX.$res['molds'].$where.$orderby.$limit;\n\t\techo 'SQL:'.$sql.'<br>';\n\t\t\n\t\t\n\t}\n\n    public function systype(){\n\n        $this->lists = M('ctype')->findAll(null,'id asc');\n        $this->display('systype');\n    }\n\n    public function systypestatus(){\n        $id = $this->frparam('id');\n        $x = M('ctype')->find(['id'=>$id]);\n        if($x['isopen']==1){\n            $x['isopen']=0;\n        }else{\n            $x['isopen']=1;\n        }\n        M('ctype')->update(array('id'=>$id),array('isopen'=>$x['isopen']));\n\n    }\n\n    public function editctype(){\n        $id = $this->frparam('id');\n        $title = $this->frparam('title',1);\n        $action = $this->frparam('action',1);\n        if(!$id){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('链接错误！')));\n        }\n        if(!$title || !$action){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('配置栏名称和配置标识不能为空！')));\n        }\n        $r = M('ctype')->find(\"id!=\".$id.\" and title='\".$title.\"'\");\n        if($r){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('配置栏名称已存在！')));\n        }\n        $r = M('ctype')->find(\"id!=\".$id.\" and action='\".$action.\"'\");\n        if($r){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('配置标识已存在！')));\n        }\n        $old = M('ctype')->find(['id'=>$id]);\n        //更新权限\n        M('Ruler')->update(['fc'=>'Sys/ctype/type/'.$old['action']],['fc'=>'Sys/ctype/type/'.$action,'name'=>$title]);\n        M('ctype')->update(['id'=>$id],['title'=>$title,'action'=>$action]);\n\n        JsonReturn(array('code'=>0,'msg'=>JZLANG('操作成功！')));\n\n\n\n    }\n\n    public function addctype(){\n\n        $title = $this->frparam('title',1);\n        $action = $this->frparam('action',1);\n\n        if(!$title || !$action){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('配置栏名称和配置标识不能为空！')));\n        }\n        $r = M('ctype')->find(['title'=>$title]);\n        if($r){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('配置栏名称已存在！')));\n        }\n        $r = M('ctype')->find(['action'=>$action]);\n        if($r){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('配置标识已存在！')));\n        }\n        $id = M('ctype')->add(['title'=>$title,'action'=>$action,'sys'=>0,'isopen'=>1]);\n        //增加配置权限\n        $ruler['name'] = $title;\n        $ruler['fc'] = 'Sys/ctype/type/'.$action;\n        $ruler['pid'] = 39;\n        $ruler['isdesktop'] = 1;\n        $m_id = M('Ruler')->add($ruler);\n        JsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功！')));\n\n    }\n\n    public function ctype(){\n        $action = $this->frparam('type',1);\n        $ctype = M('ctype')->find(['action'=>$action]);\n        if(!$ctype){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('没有找打相关配置！')));\n        }\n\n        $this->ctypedata = $ctype;\n\n        $this->display('ctype');\n\n    }\n\n    public function setfield(){\n        $id = $this->frparam('id');\n        $field = $this->frparam('field',1);\n        $title = $this->frparam('title',1);\n        $type = $this->frparam('type',1);\n        $typeid = $this->frparam('typeid');\n        if(!$id || !$field || !$title || !$type || !$typeid){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('参数错误！')));\n        }\n        $r = M('sysconfig')->find(\"id!=\".$id.\" and field='\".$field.\"'\");\n        if($r){\n            JsonReturn(array('code'=>1,'msg'=>JZLANG('配置字段已存在！')));\n        }\n\n        M('sysconfig')->update(['id'=>$id],['field'=>$field,'title'=>$title,'tip'=>$this->frparam('tip',1),'orders'=>$this->frparam('orders'),'type'=>$this->frparam('type'),'config'=>$this->frparam('config',1),'typeid'=>$typeid]);\n        setCache('webconfig',null);\n        setCache('hometpl',null);\n        setCache('wxhometpl',null);\n        setCache('mobilehometpl',null);\n\n        JsonReturn(array('code'=>0,'msg'=>JZLANG('操作成功！')));\n\n\n    }\n\n\n\n\n}\n"
  },
  {
    "path": "app/admin/c/TemplateController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2022/01\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\c;\n\n\nuse frphp\\extend\\Page;\nclass TemplateController extends CommonController\n{\n\t\n\tprivate $backupPath = '';\n\tprivate $tables = array();\n\tprivate $handler;\n\tprivate $config = array(\n\t  'host' => 'localhost',\n\t  'port' => 3306,\n\t  'user' => 'root',\n\t  'password' => 'root',\n\t  'database' => 'test',\n\t  'charset' => 'utf-8',\n\t  'target' => ''\n\t );\n\tprivate $limit = 300;//每个备份文件存储的sql条数\n    private $template_name = '';//模板文件夹\n\t\n\tpublic function index(){\n\t\t//检查更新链接是否可以访问\n\t\t$webapi = $this->webconf['template_config'];\n\t\tif(!$webapi){\n\t\t\t$webapi = 'http://api.jizhicms.cn/template.php';\n\t\t\tif(!M('sysconfig')->find(['field'=>'template_config'])){\n\t\t\t\tM('sysconfig')->add(['title'=>JZLANG('插件配置'),'field'=>'template_config','type'=>2,'data'=>$webapi,'typeid'=>0]);\n\t\t\t\tsetCache('webconfig',null);\n\t\t\t}\n\t\t}\n\t\tif($this->frparam('set')){\n            if($this->admin['isadmin']!=1){\n                JsonReturn(['code'=>1,'msg'=>JZLANG('非超级管理员无法设置！')]);\n            }\n\t\t\t$webapi = $this->frparam('webapi',1);\n\t\t\tM('sysconfig')->update(['field'=>'template_config'],['data'=>$webapi]);\n\t\t\tsetCache('webconfig',null);\n\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('配置成功！')]);\n\t\t}\n\t\t$this->webapi = $webapi;\n\t\t$api = $webapi.'?version='.$this->webconf['web_version'];\n\t\t$templates = getCache('templatelist');\n\t\tif(!$templates){\n\t\t\t$ch = curl_init();\n\t\t\t$timeout = 5;\n\t\t\tcurl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);\n\t\t\tcurl_setopt($ch,CURLOPT_RETURNTRANSFER,1);\n\t\t\tcurl_setopt($ch, CURLOPT_HEADER, false);\n\t\t\tcurl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);\n\t\t\tcurl_setopt($ch,CURLOPT_URL,$api);\n\t\t\t$res = curl_exec($ch);\n\t\t\t$httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE);\n\t\t\tcurl_close($ch);\n\t\t\tif($httpcode==200){\n\t\t\t\t$isok = true;\n\t\t\t\t$res1 = json_decode($res,1);\n\t\t\t\tif($res1['code']!=0){\n\t\t\t\t\t$isok = false;\n\t\t\t\t}else{\n\t\t\t\t\t$templates = $res1['data'];\n\t\t\t\t\tsetCache('templatelist',$templates,86400);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t$isok = false;\n\t\t\t}\n\t\t}else{\n\t\t\t$isok = true;\n\t\t}\n\t\t\n\t\t$this->title = $this->frparam('title',1,'');\n\t\t$dir = APP_PATH.'static';\n\t\t$isdown = $this->frparam('isdown');\n\t\t$pc_template = $this->webconf['pc_template'];\n\t\t$iswap = $this->webconf['iswap'];\n\t\t$wap_template = $iswap ? $this->webconf['wap_template'] : $pc_template;\n\t\t$weixin_template = $iswap ? $this->webconf['weixin_template'] : $pc_template;\n\t\t$installtemplate = [$pc_template,$wap_template,$weixin_template];\n\t\tswitch($isdown){\n\t\t\tcase 1:\n\t\t\t//本地-已下载\n\t\t\t\t$fileArray=array();\n\t\t\t\tif (false != ($handle = opendir ( $dir ))) {\n\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\n\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\n\t\t\t\t\t\tif ($file != \".\" && $file != \"..\"  && strpos($file,'.')===false && file_exists($dir.'/'.$file.'/info.php')) {\n\t\t\t\t\t\t\t$fileArray[]=$file;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//关闭句柄\n\t\t\t\t\tclosedir ( $handle );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$lists = $fileArray;\n\t\t\t\tforeach($lists as $k=>$v){\n\t\t\t\t\t//已下载该插件\n\t\t\t\t\tif(!file_exists($dir.'/'.$v.'/info.php')){\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t$config = require_once($dir.'/'.$v.'/info.php');\n\t\t\t\t\t$lists[$k] = ['name'=>$config['name'],'template'=>$v,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'web'=>$config['web'],'isinstall'=>false,'thumbnail'=>$config['thumbnail']];\n\t\t\t\t\t\n\t\t\t\t\tif($isok && array_key_exists($v,$templates) && version_compare($config['version'],$templates[$v]['version'],'<')){\n\t\t\t\t\t\t//有更新\n\t\t\t\t\t\t$lists[$k]['isupdate'] = true;\n\t\t\t\t\t\t$lists[$k]['official'] = 2;//本地\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//无更新\n\t\t\t\t\t\t$lists[$k]['isupdate'] = false;\n\t\t\t\t\t\t$lists[$k]['official'] =  2;\n\t\t\t\t\t}\n\t\t\t\t\t$lists[$k]['exists'] = true;\n\t\t\t\t\t$lists[$k]['install'] = in_array($v,$installtemplate);\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$fileArray=array();\n\t\t\t\tif (false !== ($handle = opendir ( $dir ))) {\n\t\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\n\t\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\n\t\t\t\t\t\tif ($file != \".\" && $file != \"..\"  && strpos($file,'.')===false) {\n\t\t\t\t\t\t\t$fileArray[]=$file;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//关闭句柄\n\t\t\t\t\tclosedir ( $handle );\n\t\t\t\t}\n\t\t\t\t$lists = [];\t\t\n\t\t\t\tif($isok){\n\t\t\t\t\tforeach($templates as $k=>$v){\n\t\t\t\t\t\tif(in_array($k,$fileArray)){\n\t\t\t\t\t\t\t//已下载该插件\n\t\t\t\t\t\t\tif(!file_exists($dir.'/'.$k.'/info.php')){\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$config = require_once($dir.'/'.$k.'/info.php');\n\t\t\t\t\t\t\t$lists[$k] = ['name'=>$config['name'],'template'=>$k,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'web'=>$config['web'],'isinstall'=>false,'thumbnail'=>$config['thumbnail']];\n\t\t\t\t\t\t\tif(version_compare($config['version'],$v['version'],'<')){\n\t\t\t\t\t\t\t\t//有更新\n\t\t\t\t\t\t\t\t$lists[$k]['isupdate'] = true;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t//无更新\n\t\t\t\t\t\t\t\t$lists[$k]['isupdate'] = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$lists[$k]['exists'] = true;\n\t\t\t\t\t\t\t$lists[$k]['official'] = 2;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$lists[$k] = $v;\n\t\t\t\t\t\t\t$lists[$k]['exists'] = false;\n\t\t\t\t\t\t\t$lists[$k]['description'] = $v['desc'];\n\t\t\t\t\t\t\t$lists[$k]['isinstall'] = false;\n\t\t\t\t\t\t\t$lists[$k]['isupdate'] = false;\n\t\t\t\t\t\t\t$lists[$k]['official'] = $v['official'];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$lists[$k]['install'] = in_array($k,$installtemplate);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t//检查软件是否还有自定义软件未加入进去\n\t\t\t\t\tforeach($fileArray as $v){\n\t\t\t\t\t\tif(!isset($lists[$v])){\n\t\t\t\t\t\t\t//已下载该插件\n\t\t\t\t\t\t\tif(!file_exists($dir.'/'.$v.'/info.php')){\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$config = require_once($dir.'/'.$v.'/info.php');\n\t\t\t\t\t\t\t$lists[$v] = ['name'=>$config['name'],'template'=>$v,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'web'=>$config['web'],'isinstall'=>false,'thumbnail'=>$config['thumbnail']];\n\t\t\t\t\t\t\t$lists[$v]['isupdate'] = false;\n\t\t\t\t\t\t\t$lists[$v]['exists'] = true;\n\t\t\t\t\t\t\t$lists[$v]['official'] = 2;\n\t\t\t\t\t\t\t$lists[$v]['install'] = in_array($v,$installtemplate);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t\n\t\t\t\t\tforeach($fileArray as $k=>$v){\n\n\t\t\t\t\t\t//检查是否安装\n\t\t\t\t\t\tif(strpos($v,'.')===false){\n\t\t\t\t\t\t\tif(!file_exists($dir.'/'.$v.'/info.php')){\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$config = require_once($dir.'/'.$v.'/info.php');\n\t\t\t\t\t\t\t$lists[] = ['name'=>$config['name'],'template'=>$v,'description'=>$config['desc'],'version'=>$config['version'],'author'=>$config['author'],'update_time'=>strtotime($config['update_time']),'module'=>$config['module'],'isopen'=>0,'web'=>$config['web'],'isinstall'=>false];\n\t\t\t\t\t\t\t$lists[$k]['isupdate'] = false;\n\t\t\t\t\t\t\t$lists[$k]['exists'] = true;\n\t\t\t\t\t\t\t$lists[$k]['official'] = 2;//本地\n\t\t\t\t\t\t\t$lists[$k]['install'] = in_array($v,$installtemplate);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\n\t\t\tbreak;\n\t\t\t\n\t\t\t\n\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t\tif($this->title){\n\t\t\t\t$newlist = [];\n\t\t\t\tforeach($lists as $v){\n\t\t\t\t\tif(stripos($v['name'],$this->title)!==false){\n\t\t\t\t\t\t$newlist[]=$v;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$lists  = $newlist;\n\t\t\t}\n\t\t\t$arraypage = new \\ArrayPage($lists);\n\t\t\t$data = $arraypage->query(['page'=>$this->frparam('page',0,1),'title'=>$this->title,'isdown'=>$this->frparam('isdown')])->setPage(['limit'=>$this->frparam('limit',0,12),'page'=>$this->frparam('page',0,1)])->go();\n\t\t\t$this->pages = $arraypage->pageList();\n\t\t\t$this->sum = $arraypage->sum;//总数据\n\t\t\t$this->listpage = $arraypage->listpage;//分页数组-自定义分页可用\n\t\t\t$this->prevpage = $arraypage->prevpage;//上一页\n\t\t\t$this->nextpage = $arraypage->nextpage;//下一页\n\t\t\t$this->allpage = $arraypage->allpage;//总页数\n\t\t\t$this->lists = $data;\n\t\t\t\n\t\t\t\n\t\t\t$this->display('template-list');\n\t\t\n\t\t\n\t\t\n\t\t\n\t}\n\n\t//复制图片  file2dir(\"01/5.jpg\", \"01/successImg/a.jpg\");\n\tfunction file2dir($sourcefile, $filename){\n\t\t if( !file_exists($sourcefile)){\n\t\t\t return false;\n\t\t }\n\t\t //$filename = basename($sourcefile);\n\t\t return copy($sourcefile,  $filename);\n\t}\n\t// 原目录，复制到的目录\n\tfunction recurse_copy($src,$dst) {  \n\t \n\t\t$dir = opendir($src);\n\t\t@mkdir($dst);\n\t\twhile(false !== ( $file = readdir($dir)) ) {\n\t\t\tif (( $file != '.' ) && ( $file != '..' )) {\n\t\t\t\tif ( is_dir($src . '/' . $file) ) {\n\t\t\t\t\t$this->recurse_copy($src . '/' . $file,$dst . '/' . $file);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcopy($src . '/' . $file,$dst . '/' . $file);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tclosedir($dir);\n\t}\n\n\t//安装说明\n\tfunction desc(){\n\t\t$filepath = $this->frparam('filepath',1);\n\t\tif(strpos($filepath,'.')!==false){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('参数存在安全隐患！')));\n\t\t}\n\t\tif($filepath){\n\t\t\t//忽略Notice报错\n\t\t\terror_reporting(E_ALL^E_NOTICE);\n\t\t\t\n\t\t\t//执行插件控制器卸载程序\n\t\t\t$dir = APP_PATH.APP_HOME.'/exts';\n\t\t\trequire_once($dir.'/'.$filepath.'/PluginsController.php');\n\t\t\t$plg = new \\A\\exts\\PluginsController($this->frparam());\n\t\t\t\n\t\t\t$plg->desc();\n\t\t\texit;\n\t\t}\n\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('参数错误,必须携带插件ID！')));\n\t}\n\t\n\t//下载安装更新\n\tfunction update(){\n\t\t$template = $this->frparam('template',1);\n\t\tif(strpos($template,'.')!==false){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('参数存在安全隐患！')));\n\t\t}\n        $this->template_name = $template;\n\t\t$dir = APP_PATH.'static';\n\t\tif($template){\n\t\t\tif($this->frparam('action',1)){\n\t\t\t\t$action = $this->frparam('action',1);\n\t\t\t\t// 自己获取这些信息\n\t\t\t\t$remote_url  = urldecode($this->frparam('download_url',1));\n\t\t\t\t$remote_url = strpos($remote_url,'?')!==false ? $remote_url.'&version='.$this->webconf['web_version'] : $remote_url.'?version='.$this->webconf['web_version'];\n\t\t\t\t$file_size   = $this->frparam('filesize',1);\n\t\t\t\t$tmp_path    = Cache_Path.\"/update_\".$template.\".zip\";//临时下载文件路径\n\t\t\t\tswitch ($action) {\n\t\t\t\t    case 'prepare-download':\n\t\t\t\t    \t$code = 0;\n\t\t\t\t\t\tob_start(); \n\t\t\t\t\t\t$ch=curl_init($remote_url); \n\t\t\t\t\t\tcurl_setopt($ch,CURLOPT_HEADER,1); \n\t\t\t\t\t\tcurl_setopt($ch,CURLOPT_NOBODY,1); \n\t\t\t\t\t\t$okay=curl_exec($ch); \n\t\t\t\t\t\tcurl_close($ch); \n\t\t\t\t\t\t$head=ob_get_contents(); \n\t\t\t\t\t\tob_end_clean(); \n\t\t\t\t\t\t$regex='/Content-Length:\\s([0-9].+?)\\s/'; \n\t\t\t\t\t\t$count=preg_match($regex,$head,$matches); \n\t\t\t\t\t\t$filesize = isset($matches[1])&&is_numeric($matches[1])?$matches[1]:0; \n\n\t\t\t\t        JsonReturn(array('code'=>0,'size'=>$filesize));\n\t\t\t\t        break;\n\t\t\t\t    case 'start-download':\n\t\t\t\t        // 这里检测下 tmp_path 是否存在\n\t\t\t\t        try {\n\t\t\t\t            set_time_limit(0);\n\t\t\t\t            touch($tmp_path);\n\t\t\t\t            if ($fp = fopen($remote_url, \"rb\")) {\n\t\t\t\t                if (!$download_fp = fopen($tmp_path, \"wb\")) {\n\t\t\t\t                    exit;\n\t\t\t\t                }\n\t\t\t\t                while (!feof($fp)) {\n\t\t\t\t                    if (!file_exists($tmp_path)) {\n\t\t\t\t                        // 如果临时文件被删除就取消下载\n\t\t\t\t                        fclose($download_fp);\n\t\t\t\t                        exit;\n\t\t\t\t                    }\n\t\t\t\t                    fwrite($download_fp, fread($fp, 1024 * 8 ), 1024 * 8);\n\t\t\t\t                }\n\t\t\t\t                fclose($download_fp);\n\t\t\t\t                fclose($fp);\n\t\t\t\t            } else {\n\t\t\t\t                exit;\n\t\t\t\t            }\n\t\t\t\t        } catch (Exception $e) {\n\t\t\t\t            Storage::remove($tmp_path);\n\t\t\t\t            JsonReturn(['code'=>1,'msg'=>JZLANG('发生错误').'：'.$e->getMessage()]);\n\t\t\t\t        }\n\n\t\t\t\t        JsonReturn(['code'=>0,'tmp_path'=>$tmp_path]);\n\t\t\t\t        break;\n\t\t\t\t    case 'get-file-size':\n\t\t\t\t        // 这里检测下 tmp_path 是否存在\n\t\t\t\t        if (file_exists($tmp_path)) {\n\t\t\t\t            \n\t\t\t\t            JsonReturn(['code'=>0,'size'=>filesize($tmp_path)]);\n\t\t\t\t        }\n\t\t\t\t        break;\n\t\t\t\t    case 'file-upzip':\n\t\t\t\t    \tif (!file_exists($tmp_path)) {//先判断待解压的文件是否存在\n\t\t\t\t\t\t   JsonReturn(['code'=>1,'msg'=>JZLANG('下载缓存文件不存在！')]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//$msg = $this->upzip($tmp_path,$dir);\n\t\t\t\t\t\t$msg = $this->get_zip_originalsize($tmp_path,$dir.'/');\n                        setCache('templatelist',null);\n\t\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>$msg,'isinstall'=>true]);\n\t\t\t\t    \tbreak;\n\t\t\t\t    case 'template-install':\n\t\t\t\t\t\n\t\t\t\t\t\t$tpl = $this->frparam('tpl',2);\n\t\t\t\t\t\tif(!count($tpl)){\n\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('请选择使用场景！')));\n\t\t\t\t\t\t}\n\t\t\t\t    \tif(file_exists($dir.'/'.$template.'/install/TemplateController.php')){\n\t\t\t\t\t\t\t//直接设置模板\n\t\t\t\t\t\t\trequire_once($dir.'/'.$template.'/install/TemplateController.php');\n\t\t\t\t\t\t\t$plg = new \\TemplateController($this->frparam());\n\t\t\t\t\t\t\t$step1 = $plg->install();//执行安装\n\t\t\t\t\t\t\tif(!$step1){\n\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('执行插件安装程序失败！')));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(in_array('pc',$tpl)){\n\t\t\t\t\t\t\tM('sysconfig')->update(['field'=>'pc_template'],['data'=>$template]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(in_array('wap',$tpl)){\n\t\t\t\t\t\t\tM('sysconfig')->update(['field'=>'wap_template'],['data'=>$template]);\n\t\t\t\t\t\t\tM('sysconfig')->update(['field'=>'iswap'],['data'=>1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(in_array('wechat',$tpl)){\n\t\t\t\t\t\t\tM('sysconfig')->update(['field'=>'weixin_template'],['data'=>$template]);\n\t\t\t\t\t\t\tM('sysconfig')->update(['field'=>'iswap'],['data'=>1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tsetCache('webconfig',null);\n                        setCache('hometpl',null);\n                        setCache('wxhometpl',null);\n                        setCache('mobilehometpl',null);\n                        setCache('templatelist',null);\n\t\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('安装成功！')));\n\t\t\t\t    \tbreak;\n\t\t\t\t\tcase 'backup':\n\t\t\t\t\t\tif(!is_dir(APP_PATH.'static/'.$template.'/backup')){\n\t\t\t\t\t\t\tmkdir(APP_PATH.'static/'.$template.'/backup',0777);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$this->backupPath = APP_PATH.'static/'.$template.'/backup';\n\t\t\t\t\t\t$this->toBackup();\n\t\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('备份成功！')));\n\t\t\t\t\t\tbreak;\n\t\t\t\t    default:\n\t\t\t\t        # code...\n\t\t\t\t        break;\n\t\t\t\t}\n\t\t\t}\n\t\t\t$config = require_once(APP_PATH.'static/'.$template.'/info.php');\n\t\t\t$webapi = $this->webconf['template_config'];\n\t\t\t$r = file_get_contents($webapi.'?name='.$template.'&v='.$config['version']);\n\t\t\t$rr = json_decode($r,1);\n\t\t\tif($rr['code']==0){\n\t\t\t\t$this->templatedata = $config;\n\t\t\t\t$this->data = $rr['data'];\n\t\t\t\t//获取远程文件大小\n\t\t\t\t$downurl = $rr['data']['url'];\n\t\t\t\tob_start(); \n\t\t\t\t$ch=curl_init($downurl); \n\t\t\t\tcurl_setopt($ch,CURLOPT_HEADER,1); \n\t\t\t\tcurl_setopt($ch,CURLOPT_NOBODY,1); \n\t\t\t\t$okay=curl_exec($ch); \n\t\t\t\tcurl_close($ch); \n\t\t\t\t$head=ob_get_contents(); \n\t\t\t\tob_end_clean(); \n\t\t\t\t$regex='/Content-Length:\\s([0-9].+?)\\s/'; \n\t\t\t\t$count=preg_match($regex,$head,$matches); \n\t\t\t\t$filesize = isset($matches[1])&&is_numeric($matches[1])?$matches[1]:0; \n\t\t\t\t$this->filesize = $filesize;\n\t\t\t\t$this->filepath = $template;\n\t\t\t\t$this->display('template-update');exit;\n\t\t\t}else{\n\t\t\t\texit(JZLANG('该插件暂无更新！'));\n\t\t\t}\n\n\t\t\t\n\t\t}\n\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('参数错误,请选择对应模板！')));\n\t}\n\t\n\tfunction upzip($filename,$path){\n\t\t//先判断待解压的文件是否存在\n\t\tif(!file_exists($filename)){\n\t\t\tJsonReturn(['code'=>1,'msg'=>$filename.JZLANG('文件不存在！')]);\n\t\t}\n\t\t$zip = new \\ZipArchive;\n\t\t$starttime = explode(' ',microtime()); //解压开始的时间\n\t\tif ($zip->open($filename) === TRUE) {//中文文件名要使用ANSI编码的文件格式\n\t\t  $zip->extractTo($path);//提取全部文件\n\t\t  //$zip->extractTo('/my/destination/dir/', array('pear_item.gif', 'testfromfile.php'));//提取部分文件\n\t\t  $zip->close();\n\t\t  $endtime = explode(' ',microtime()); //解压结束的时间\n\t\t  $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);\n\t\t  $thistime = round($thistime,3); //保留3为小数\n\t\t  $msg = JZLANG(\"解压完毕！本次解压花费\").\"：$thistime \".JZLANG(\"秒\").\"。\";\n\t\t  return $msg;\n\t\t} else {\n\t\t  return JZLANG('解压失败！');\n\t\t  \n\t\t}\n\t\t\n\t}\n\t\n\tfunction get_zip_originalsize($filename, $path) {\n\t  //先判断待解压的文件是否存在\n\t  if(!file_exists($filename)){\n\t\t //die(\"文件 $filename 不存在！\");\n\t\t JsonReturn(['code'=>1,'msg'=>$filename.JZLANG('文件不存在！')]);\n\t  }\n\t  $starttime = explode(' ',microtime()); //解压开始的时间\n\n\t  //将文件名和路径转成windows系统默认的gb2312编码，否则将会读取不到\n\t  //$filename = iconv(\"utf-8\",\"gb2312\",$filename);\n\t  //$path = iconv(\"utf-8\",\"gb2312\",$path);\n\t  //打开压缩包\n\t  $resource = zip_open($filename);\n\t  $i = 1;\n\t  //遍历读取压缩包里面的一个个文件\n\t  while ($dir_resource = zip_read($resource)) {\n\t\t//如果能打开则继续\n\t\tif (zip_entry_open($resource,$dir_resource)) {\n\t\t  //获取当前项目的名称,即压缩包里面当前对应的文件名\n\t\t  $file_name = $path.zip_entry_name($dir_resource);\n\t\t  //以最后一个“/”分割,再用字符串截取出路径部分\n\t\t  $file_path = substr($file_name,0,strrpos($file_name, \"/\"));\n\t\t  //如果路径不存在，则创建一个目录，true表示可以创建多级目录\n\t\t  if(!is_dir($file_path)){\n\t\t\tmkdir($file_path,0777,true);\n\t\t  }\n\t\t  //如果不是目录，则写入文件\n\t\t  if(!is_dir($file_name)){\n\t\t\t//读取这个文件\n\t\t\t$file_size = zip_entry_filesize($dir_resource);\n\t\t\t//最大读取6M，如果文件过大，跳过解压，继续下一个\n\t\t\t$file_content = zip_entry_read($dir_resource,$file_size);\n\t\t\tfile_put_contents($file_name,$file_content);\n\t\t  }\n\t\t  //关闭当前\n\t\t  zip_entry_close($dir_resource);\n\t\t}\n\t  }\n\t  //关闭压缩包\n\t  zip_close($resource);\n\t  $endtime = explode(' ',microtime()); //解压结束的时间\n\t  $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);\n\t  $thistime = round($thistime,3); //保留3为小数\n\t  $msg = JZLANG(\"解压完毕！本次解压花费\").\"：$thistime \".JZLANG(\"秒\").\"。\";\n\t  return $msg;\n\t}\n\t\n\n\t//备份数据库\n\tprivate function toBackup(){\n\t\t$pconfig = array(\n\t\t\t'host' =>DB_HOST,\n\t\t\t'port' =>DB_PORT,\n\t\t\t'user' =>DB_USER,\n\t\t\t'password' =>DB_PASS,\n\t\t\t'database' =>DB_NAME\n\t\t);\n\t\t$this->config = array_merge($this->config, $pconfig);\n\t\t$this->handler = new \\PDO(\"mysql:host=\".$this->config['host'].\";port={$this->config['port']};dbname={$this->config['database']}\", $this->config['user'], $this->config['password']);\n\t\t$this->handler->query(\"set names utf8\");\n\t\t$this->backup();\n\t}\n\t/**\n\t  * 备份当前数据库\n\t  * @param array $tables\n\t  * @return bool\n\t  */\n\t private function backup($tables = array())\n\t {\n\t  //存储表定义语句的数组\n\t  $ddl = array();\n\t  //存储数据的数组\n\t  $data = array();\n\t  $this->setTables($tables);\n\t  if (!empty($this->tables))\n\t  {\n\t   foreach ($this->tables as $table)\n\t   {\n\t\t$ddl[] = $this->getDDL($table);\n\t\t$data[] = $this->getData($table);\n\t   }\n\t   //开始写入\n\t   $this->writeToFile($this->tables, $ddl, $data);\n\t  }\n\t  else\n\t  {\n\t   $this->error = JZLANG('数据库中没有表!');\n\t   return false;\n\t  }\n\t }\n\t /**\n\t  * 设置要备份的表\n\t  * @param array $tables\n\t  */\n\t private function setTables($tables = array())\n\t {\n\t  if (!empty($tables) && is_array($tables))\n\t  {\n\t   //备份指定表\n\t   $this->tables = $tables;\n\t  }\n\t  else\n\t  {\n\t   //备份全部表\n\t   $this->tables = $this->getTables();\n\t  }\n\t }\n\t /**\n\t  * 查询\n\t  * @param string $sql\n\t  * @return mixed\n\t  */\n\t private function query($sql = '')\n\t {\n\t  $stmt = $this->handler->query($sql);\n\t  $stmt->setFetchMode(\\PDO::FETCH_NUM);\n\t  $list = $stmt->fetchAll();\n\t  return $list;\n\t }\n\t /**\n\t  * 获取全部表\n\t  * @return array\n\t  */\n\t private function getTables()\n\t {\n\t  $sql = 'SHOW TABLES';\n\t  $list = $this->query($sql);\n\t  $tables = array();\n\t  foreach ($list as $value)\n\t  {\n\t   $tables[] = $value[0];\n\t  }\n\t  return $tables;\n\t }\n\t /**\n\t  * 获取表定义语句\n\t  * @param string $table\n\t  * @return mixed\n\t  */\n\t private function getDDL($table = '')\n\t {\n\t  $sql = \"SHOW CREATE TABLE `{$table}`\";\n\t  $ddl = $this->query($sql)[0][1] . ';';\n\t  return $ddl;\n\t }\n\t /**\n\t  * 获取表数据\n\t  * @param string $table\n\t  * @return mixed\n\t  */\n\t private function getData($table = '')\n\t {\n\t  $sql = \"SHOW COLUMNS FROM `{$table}`\";\n\t  $list = $this->query($sql);\n\t  //字段\n\t  $columns = '';\n\t  //需要返回的SQL\n\t  $query = [];\n\t  foreach ($list as $value)\n\t  {\n\t   $columns .= \"`{$value[0]}`,\";\n\t  }\n\t  $columns = substr($columns, 0, -1);\n\t  $data = $this->query(\"SELECT * FROM `{$table}`\");\n\t  foreach ($data as $value)\n\t  {\n\t   $dataSql = '';\n\t   foreach ($value as $v)\n\t   {\n\t\tif($v==='' || $v===null){\n\t\t  $dataSql .= \" NULL,\";\n\t\t}else{\n\t\t  $dataSql .= \"'{$v}',\";\n\t\t}\n\t\t\n\t   }\n\t   $dataSql = substr($dataSql, 0, -1);\n\t   $query[]= \"INSERT INTO `{$table}` ({$columns}) VALUES ({$dataSql});\\r\\n\";\n\t  }\n\t  return $query;\n\t }\n\t /**\n\t  * 写入文件\n\t  * @param array $tables\n\t  * @param array $ddl\n\t  * @param array $data\n\t  */\n\t private function writeToFile($tables = array(), $ddl = array(), $data = array())\n\t {\n\t  $public_str = \"/*\\r\\nMySQL Database Backup Tools\\r\\n\";\n\t  $public_str .= \"Server:{$this->config['host']}:{$this->config['port']}\\r\\n\";\n\t  $public_str .= \"Database:{$this->config['database']}\\r\\n\";\n\t  $public_str .= \"Data:\" . date('Y-m-d H:i:s', time()) . \"\\r\\n*/\\r\\n\";\n\t  $i = 0;\n\t  //echo '备份数据库-'.$this->config['database'].'<br />';\n\t  $countsql = 0;//记录sql数\n\t  $filenum = 0;//文件序号\n\t  $backfile = $this->config['target']==''? $this->template_name.'-'.$this->config['database'].'_'.date('Y_m_d_H_i_s').'_'.rand(100000,999999): $this->config['target'].date('YmdHis');//文件名\n\t  $str = $public_str.\"SET FOREIGN_KEY_CHECKS=0;\\r\\n\";\n\t  foreach ($tables as $table)\n\t  {\n\t  // echo '备份表：'.$table.'<br>';\n\t   $str .= \"-- ----------------------------\\r\\n\";\n\t   $str .= \"-- Table structure for {$table}\\r\\n\";\n\t   $str .= \"-- ----------------------------\\r\\n\";\n\t   $str .= \"DROP TABLE IF EXISTS `{$table}`;\\r\\n\";\n\t   $str .= $ddl[$i] . \"\\r\\n\";\n\t  \n\t   $i++;\n\t   //echo '备份成功！<br/>'; \n\t   \n\t  }\n\t  $i = 0;\n\t  foreach($tables as $table){\n\t\t//echo '备份表数据：'.$table.' <br>';\n\t\t$str .= \"-- ----------------------------\\r\\n\";\n\t\t$str .= \"-- Records of {$table}\\r\\n\";\n\t\t$str .= \"-- ----------------------------\\r\\n\";\n\t\t//$str .= $data[$i] . \"\\r\\n\";\n\t\tforeach ($data[$i] as $v){\n\t\t\t$str .= $v;\n\t\t\t$countsql++;\n\t\t\tif($countsql%($this->limit)==0){\n\t\t\t\t$str = '<?php die();?>'.$str;\n\t\t\t\tif($filenum==0){\n\t\t\t\t\t$isok = file_put_contents($this->backupPath.'/'.$backfile.'.php', $str);\n\t\t\t\t\tif(!$isok){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'.php ] '.JZLANG('写入文件失败！')]);\n\t\t\t\t\t}\n\t\t\t\t\t$filenum++;\n\t\t\t\t}else{\n\t\t\t\t\t$isok = file_put_contents($this->backupPath.'/'.$backfile.'_v'.$filenum.'.php', $str);\n\t\t\t\t\tif(!$isok){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'_v'.$filenum.'.php ]'.JZLANG(' 写入文件失败！')]);\n\t\t\t\t\t}\n\t\t\t\t\t$filenum++;\n\t\t\t\t}\n\t\t\t\t$str = $public_str;\n\t\t\t}\t\n\t\t}\n\t\t$i++;\n\t\t\n\t\t\n\t  }\n\t  if($str!='' && $str != $public_str){\n\t\t\t$str = '<?php die();?>'.$str;\n\t\t\tif($filenum==0){\n\t\t\t\t$isok = file_put_contents($this->backupPath.'/'.$backfile.'.php', $str);\n\t\t\t\tif(!$isok){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'.php ] '.JZLANG('写入文件失败！')]);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t$isok = file_put_contents($this->backupPath.'/'.$backfile.'_v'.$filenum.'.php', $str);\n\t\t\t\tif(!$isok){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'_v'.$filenum.'.php ] '.JZLANG('写入文件失败！')]);\n\t\t\t\t}\n\t\t\t}\n\t  }\n\n\t }\n\t\n\n\n\n}"
  },
  {
    "path": "app/admin/c/UploadsController.php",
    "content": "<?php\n\n\nnamespace app\\admin\\c;\n\n\nclass UploadsController extends CommonController\n{\n    function index(){\n        \n        $filepath = $this->webconf['admin_save_path'];\n        $paths = explode('/',$filepath);\n        $allowpath = (count($paths)>=2 && strpos($paths[1],'{')===false) ? '/'.$paths[0].'/'.$paths[1].'/' : '/'.$paths[0].'/';\n        if(strpos($filepath,'{')===false){\n            $filepath.='/{yyyy}/{mm}/{dd}';\n        }\n        if(strpos($filepath,'rand')===false){\n            $filepath.='/{rand:8}';\n        }\n        //$CONFIG = json_decode(preg_replace(\"/\\/\\*[\\s\\S]+?\\*\\//\", \"\", file_get_contents(\"config.json\")), true);\n        $CONFIG = [\n            /* 上传图片配置项 */\n            \"imageActionName\"=>\"uploadimage\", /* 执行上传图片的action名称 */\n            \"imageFieldName\"=>\"upfile\", /* 提交的图片表单名称 */\n            \"imageMaxSize\"=>512000000, /* 上传大小限制，单位B 500M*/\n            \"imageAllowFiles\"=>[\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\".webp\"], /* 上传图片格式显示 */\n            \"imageCompressEnable\"=>true, /* 是否压缩图片,默认是true */\n            \"imageCompressBorder\"=>1600, /* 图片压缩最长边限制 */\n            \"imageInsertAlign\"=>\"none\", /* 插入的图片浮动方式 */\n            \"imageUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"imagePathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */\n            /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */\n            /* {time} 会替换成时间戳 */\n            /* {yyyy} 会替换成四位年份 */\n            /* {yy} 会替换成两位年份 */\n            /* {mm} 会替换成两位月份 */\n            /* {dd} 会替换成两位日期 */\n            /* {hh} 会替换成两位小时 */\n            /* {ii} 会替换成两位分钟 */\n            /* {ss} 会替换成两位秒 */\n            /* 非法字符 \\ =>* ? \" < > | */\n            /* 具请体看线上文档=>fex.baidu.com/ueditor/#use-format_upload_filename */\n\n            /* 涂鸦图片上传配置项 */\n            \"scrawlActionName\"=>\"uploadscrawl\", /* 执行上传涂鸦的action名称 */\n            \"scrawlFieldName\"=>\"upfile\", /* 提交的图片表单名称 */\n            \"scrawlPathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"scrawlMaxSize\"=>2048000, /* 上传大小限制，单位B */\n            \"scrawlUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"scrawlInsertAlign\"=>\"none\",\n\n            /* 截图工具上传 */\n            \"snapscreenActionName\"=>\"uploadimage\", /* 执行上传截图的action名称 */\n            \"snapscreenPathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"snapscreenUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"snapscreenInsertAlign\"=>\"none\", /* 插入的图片浮动方式 */\n\n            /* 抓取远程图片配置 */\n            \"catcherLocalDomain\"=>[\"127.0.0.1\", \"localhost\", \"img.baidu.com\"],\n            \"catcherActionName\"=>\"catchimage\", /* 执行抓取远程图片的action名称 */\n            \"catcherFieldName\"=>\"source\", /* 提交的图片列表表单名称 */\n            \"catcherPathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"catcherUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"catcherMaxSize\"=>2048000, /* 上传大小限制，单位B */\n            \"catcherAllowFiles\"=>[\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\" ,\".webp\"], /* 抓取图片格式显示 */\n\n            /* 上传视频配置 */\n            \"videoActionName\"=>\"uploadvideo\", /* 执行上传视频的action名称 */\n            \"videoFieldName\"=>\"upfile\", /* 提交的视频表单名称 */\n            \"videoPathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"videoUrlPrefix\"=>\"\", /* 视频访问路径前缀 */\n            \"videoMaxSize\"=>1024000000, /* 上传大小限制，单位B，默认1000MB */\n            \"videoAllowFiles\"=>[\n                \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n                \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\"], /* 上传视频格式显示 */\n\n            /* 上传文件配置 */\n            \"fileActionName\"=>\"uploadfile\", /* controller里,执行上传视频的action名称 */\n            \"fileFieldName\"=>\"upfile\", /* 提交的文件表单名称 */\n            \"filePathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"fileUrlPrefix\"=>\"\", /* 文件访问路径前缀 */\n            \"fileMaxSize\"=>512000000, /* 上传大小限制，单位B，默认500MB */\n            \"fileAllowFiles\"=>[\n                \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\n                \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n                \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\",\n                \".rar\", \".zip\", \".tar\", \".gz\", \".7z\", \".bz2\", \".cab\", \".iso\",\n                \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".pdf\", \".txt\", \".md\", \".xml\"\n            ], /* 上传文件格式显示 */\n\n            /* 列出指定目录下的图片 */\n            \"imageManagerActionName\"=>\"listimage\", /* 执行图片管理的action名称 */\n            \"imageManagerListPath\"=>$allowpath, /* 指定要列出图片的目录 */\n            \"imageManagerListSize\"=>20, /* 每次列出文件数量 */\n            \"imageManagerUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"imageManagerInsertAlign\"=>\"none\", /* 插入的图片浮动方式 */\n            \"imageManagerAllowFiles\"=>[\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\" ,\".webp\"], /* 列出的文件类型 */\n\n            /* 列出指定目录下的文件 */\n            \"fileManagerActionName\"=>\"listfile\", /* 执行文件管理的action名称 */\n            \"fileManagerListPath\"=>$allowpath, /* 指定要列出文件的目录 */\n            \"fileManagerUrlPrefix\"=>\"\", /* 文件访问路径前缀 */\n            \"fileManagerListSize\"=>20, /* 每次列出文件数量 */\n            \"fileManagerAllowFiles\"=>[\n                \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\n                \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n                \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\",\n                \".rar\", \".zip\", \".tar\", \".gz\", \".7z\", \".bz2\", \".cab\", \".iso\",\n                \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".pdf\", \".txt\", \".md\", \".xml\"\n            ] /* 列出的文件类型 */\n        ];\n        $action = $_GET['action'];\n\n        // 安全加固:禁止通过GET参数覆盖关键配置\n        // 防止攻击者通过GET参数修改fileAllowFiles、filePathFormat、fileMaxSize等\n        $dangerousBaseKeys = ['fileAllowFiles', 'imageAllowFiles', 'videoAllowFiles', \n                             'catcherAllowFiles', 'fileManagerAllowFiles', 'imageManagerAllowFiles',\n                             'filePathFormat', 'imagePathFormat', 'videoPathFormat', 'scrawlPathFormat',\n                             'catcherPathFormat', 'fileManagerListPath', 'imageManagerListPath',\n                             'fileMaxSize', 'imageMaxSize', 'videoMaxSize', 'scrawlMaxSize', 'catcherMaxSize',\n                             'fileFieldName', 'imageFieldName', 'videoFieldName', 'scrawlFieldName',\n                             'fileActionName', 'imageActionName', 'videoActionName',\n                             'imageManagerActionName', 'fileManagerActionName', 'catcherActionName',\n                             'scrawlActionName', 'snapscreenActionName', 'catcherLocalDomain',\n                             'imageCompressEnable', 'imageCompressBorder', 'imageInsertAlign',\n                             'imageUrlPrefix', 'scrawlUrlPrefix', 'snapscreenUrlPrefix',\n                             'videoUrlPrefix', 'fileUrlPrefix', 'imageManagerUrlPrefix',\n                             'fileManagerUrlPrefix', 'snapscreenPathFormat', 'imageManagerListSize',\n                             'fileManagerListSize', 'scrawlInsertAlign', 'snapscreenInsertAlign'];\n        \n        foreach ($dangerousBaseKeys as $baseKey) {\n            if (isset($_GET[$baseKey])) {\n                unset($_GET[$baseKey]);\n            }\n        }\n\n        switch ($action) {\n            case 'config':\n                $result =  json_encode($CONFIG);\n                break;\n\n            /* 上传图片 */\n            case 'uploadimage':\n                /* 上传涂鸦 */\n            case 'uploadscrawl':\n                /* 上传视频 */\n            case 'uploadvideo':\n                /* 上传文件 */\n            case 'uploadfile':\n                //$result = include(\"action_upload.php\");\n                $result = $this->uploadfile($CONFIG);\n                break;\n\n            /* 列出图片 */\n            case 'listimage':\n                //$result = include(\"action_list.php\");\n                $result = $this->listfile($CONFIG);\n                break;\n            /* 列出文件 */\n            case 'listfile':\n                // $result = include(\"action_list.php\");\n                $result = $this->listfile($CONFIG);\n                break;\n\n            /* 抓取远程文件 */\n            case 'catchimage':\n                //$result = include(\"action_crawler.php\");\n                $result = $this->catchimage($CONFIG);\n                break;\n\n            default:\n                $result = json_encode(array(\n                    'state'=> '请求地址出错'\n                ));\n                break;\n        }\n\n        /* 输出结果 */\n        if (isset($_GET[\"callback\"])) {\n            if (preg_match(\"/^[\\w_]+$/\", $_GET[\"callback\"])) {\n                echo htmlspecialchars($_GET[\"callback\"]) . '(' . $result . ')';\n            } else {\n                echo json_encode(array(\n                    'state'=> 'callback参数不合法'\n                ));\n            }\n        } else {\n            /*\n            {\"state\":\"SUCCESS\",\"url\":\"\\/static\\/upload\\/20230103\\/1672756587221260.jpeg\",\"title\":\"1672756587221260.jpeg\",\"original\":\"6.jpeg\",\"type\":\".jpeg\",\"size\":34255}\n            */\n            echo $result;\n        }\n    }\n\n    function catchimage($CONFIG){\n        set_time_limit(0);\n\n        /* 上传配置 */\n        $config = array(\n            \"pathFormat\" => $CONFIG['catcherPathFormat'],\n            \"maxSize\" => $CONFIG['catcherMaxSize'],\n            \"allowFiles\" => $CONFIG['catcherAllowFiles'],\n            \"oriName\" => \"remote.png\"\n        );\n        $fieldName = $CONFIG['catcherFieldName'];\n\n        /* 抓取远程图片 */\n        $list = array();\n        if (isset($_POST[$fieldName])) {\n            $source = $_POST[$fieldName];\n        } else {\n            $source = $_GET[$fieldName];\n        }\n        foreach ($source as $imgUrl) {\n            $item = new \\Uploader($imgUrl, $config, \"remote\");\n            $info = $item->getFileInfo();\n            array_push($list, array(\n                \"state\" => $info[\"state\"],\n                \"url\" => $info[\"url\"],\n                \"size\" => $info[\"size\"],\n                \"title\" => htmlspecialchars($info[\"title\"]),\n                \"original\" => htmlspecialchars($info[\"original\"]),\n                \"source\" => htmlspecialchars_decode($imgUrl)\n            ));\n        }\n\n        /* 返回抓取数据 */\n        return json_encode(array(\n            'state'=> count($list) ? 'SUCCESS':'ERROR',\n            'list'=> $list\n        ));\n    }\n\n    function listfile($CONFIG){\n\n        /* 判断类型 */\n        switch ($_GET['action']) {\n            /* 列出文件 */\n            case 'listfile':\n                $allowFiles = $CONFIG['fileManagerAllowFiles'];\n                $listSize = $CONFIG['fileManagerListSize'];\n                $path = $CONFIG['fileManagerListPath'];\n                break;\n            /* 列出图片 */\n            case 'listimage':\n            default:\n                $allowFiles = $CONFIG['imageManagerAllowFiles'];\n                $listSize = $CONFIG['imageManagerListSize'];\n                $path = $CONFIG['imageManagerListPath'];\n        }\n        $allowFiles = substr(str_replace(\".\", \"|\", join(\"\", $allowFiles)), 1);\n\n        /* 获取参数 */\n        $size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize;\n        $start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0;\n        $end = $start + $size;\n\n        /* 获取文件列表 */\n        $path = $_SERVER['DOCUMENT_ROOT'] . (substr($path, 0, 1) == \"/\" ? \"\":\"/\") . $path;\n        $files = $this->getfiles($path, $allowFiles);\n        if (!count($files)) {\n            return json_encode(array(\n                \"state\" => \"no match file\",\n                \"list\" => array(),\n                \"start\" => $start,\n                \"total\" => count($files)\n            ));\n        }\n\n        /* 获取指定范围的列表 */\n        $files=$this->array_sort($files,'mtime','desc');\n        $len = count($files);\n        for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--){\n            $list[] = $files[$i];\n        }\n        //倒序\n        //for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){\n        //    $list[] = $files[$i];\n        //}\n\n        /* 返回数据 */\n        $result = json_encode(array(\n            \"state\" => \"SUCCESS\",\n            \"list\" => $list,\n            \"start\" => $start,\n            \"total\" => count($files)\n        ));\n\n        return $result;\n\n\n    }\n\n\n    /**\n     * 遍历获取目录下的指定类型的文件\n     * @param $path\n     * @param array $files\n     * @return array\n     */\n    function getfiles($path, $allowFiles, &$files = array())\n    {\n        if (!is_dir($path)) return null;\n        if(substr($path, strlen($path) - 1) != '/') $path .= '/';\n        $handle = opendir($path);\n        while (false !== ($file = readdir($handle))) {\n            if ($file != '.' && $file != '..') {\n                $path2 = $path . $file;\n                if (is_dir($path2)) {\n                    $this->getfiles($path2, $allowFiles, $files);\n                } else {\n                    if (preg_match(\"/\\.(\".$allowFiles.\")$/i\", $file)) {\n                        $files[] = array(\n                            'url'=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])),\n                            'mtime'=> filemtime($path2)\n                        );\n                    }\n                }\n            }\n        }\n        return $files;\n    }\n\n    function array_sort($array,$row,$type){\n        $array_temp = array();\n        $arr=array();\n        foreach($array as $v){\n            $array_temp[$v[$row]] = $v;\n        }\n        if($type == 'asc'){\n            ksort($array_temp);\n        }elseif($type='desc'){\n            krsort($array_temp);\n        }else{\n        }\n        $i=0;\n        foreach ($array_temp as $vd){\n            $arr[$i]=$vd;\n            $i++;\n        }\n        return $arr;\n    }\n\n    function uploadfile($CONFIG){\n\n        /* 上传配置 */\n        $base64 = \"upload\";\n        switch (htmlspecialchars($_GET['action'])) {\n            case 'uploadimage':\n                $config = array(\n                    \"pathFormat\" => $CONFIG['imagePathFormat'],\n                    \"maxSize\" => $CONFIG['imageMaxSize'],\n                    \"allowFiles\" => $CONFIG['imageAllowFiles']\n                );\n                $fieldName = $CONFIG['imageFieldName'];\n                break;\n            case 'uploadscrawl':\n                $config = array(\n                    \"pathFormat\" => $CONFIG['scrawlPathFormat'],\n                    \"maxSize\" => $CONFIG['scrawlMaxSize'],\n                    \"allowFiles\" => $CONFIG['scrawlAllowFiles'],\n                    \"oriName\" => \"scrawl.png\"\n                );\n                $fieldName = $CONFIG['scrawlFieldName'];\n                $base64 = \"base64\";\n                break;\n            case 'uploadvideo':\n                $config = array(\n                    \"pathFormat\" => $CONFIG['videoPathFormat'],\n                    \"maxSize\" => $CONFIG['videoMaxSize'],\n                    \"allowFiles\" => $CONFIG['videoAllowFiles']\n                );\n                $fieldName = $CONFIG['videoFieldName'];\n                break;\n            case 'uploadfile':\n            default:\n                $config = array(\n                    \"pathFormat\" => $CONFIG['filePathFormat'],\n                    \"maxSize\" => $CONFIG['fileMaxSize'],\n                    \"allowFiles\" => $CONFIG['fileAllowFiles']\n                );\n                $fieldName = $CONFIG['fileFieldName'];\n                break;\n        }\n\n        /* 生成上传实例对象并完成上传 */\n        $up = new \\Uploader($fieldName, $config, $base64);\n\n        /**\n         * 得到上传文件所对应的各个参数,数组结构\n         * array(\n         *     \"state\" => \"\",          //上传状态，上传成功时必须返回\"SUCCESS\"\n         *     \"url\" => \"\",            //返回的地址\n         *     \"title\" => \"\",          //新文件名\n         *     \"original\" => \"\",       //原始文件名\n         *     \"type\" => \"\"            //文件类型\n         *     \"size\" => \"\",           //文件大小\n         * )\n         */\n\n        /* 返回数据 */\n        return json_encode($up->getFileInfo());\n\n\n\n    }\n}"
  },
  {
    "path": "app/admin/c/WechatController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2024/06\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace app\\admin\\c;\r\n\r\n\r\n\r\nclass WechatController extends CommonController\r\n{\r\n    public function wxcaidan(){\r\n        if($this->frparam('go')==1){\r\n            $caidan = $this->frparam('caidan_name',2);\r\n            $caidan_type = $this->frparam('caidan_type',2);\r\n            $caidan_key = $this->frparam('caidan_key',2);\r\n            $caidan_url = $this->frparam('caidan_url',2);\r\n            $caidan_media_id = $this->frparam('caidan_media_id',2);\r\n            $caidan_sort = $this->frparam('caidan_sort',2);\r\n            \r\n            //格式化数据\r\n            asort($caidan_sort);\r\n            $i = 0;\r\n            foreach ($caidan_sort as $k=>$v){\r\n                $new_caidan[$i] = $caidan[$k];\r\n                $new_caidan_type[$i] = $caidan_type[$k];\r\n                $new_caidan_key[$i] = $caidan_key[$k];\r\n                $new_caidan_url[$i] = $caidan_url[$k];\r\n                $new_caidan_media_id[$i] = $caidan_media_id[$k];\r\n                //  $caidan_sort[$i] = $caidan_sort[$k];\r\n                \r\n                $i+=1;\r\n                \r\n                \r\n            }\r\n            //dump($new_caidan);exit;\r\n            $caidan = $new_caidan;\r\n            $caidan_type = $new_caidan_type;\r\n            $caidan_key = $new_caidan_key;\r\n            $caidan_url = $new_caidan_url;\r\n            $caidan_media_id = $new_caidan_media_id;\r\n            \r\n            \r\n            $datas = $this->frparam();\r\n            foreach($caidan as $k=>$v){\r\n                if($v!=''){\r\n                    $data['button'][$k] = array(\r\n                        \"type\"=>$caidan_type[$k],\r\n                        \"name\"=>$v,\r\n                    \r\n                    );\r\n                    if($caidan_type[$k]=='miniprogram'){\r\n                        \r\n                        $data['button'][$k]['appid'] =  $caidan_key[$k];\r\n                        $data['button'][$k]['pagepath'] =  $caidan_url[$k];\r\n                        $data['button'][$k]['url'] = 'https://mp.weixin.qq.com/';\r\n                        \r\n                    }else{\r\n                        if($caidan_key[$k]!=''){\r\n                            $data['button'][$k]['key'] = $caidan_key[$k];\r\n                        }\r\n                        if($caidan_url[$k]!=''){\r\n                            $data['button'][$k]['url'] = $caidan_url[$k];\r\n                        }\r\n                        if($caidan_media_id[$k]!=''){\r\n                            $data['button'][$k]['media_id'] = $caidan_media_id[$k];\r\n                        }\r\n                    }\r\n                    \r\n                    $ks = 'caidan_name_'.($k+1);\r\n                    if(array_key_exists($ks,$datas)){\r\n                        $sub_button_name = $this->frparam($ks,2);\r\n                        $sub_button_type = $this->frparam('caidan_type_'.($k+1),2);\r\n                        $sub_button_key = $this->frparam('caidan_key_'.($k+1),2);\r\n                        $sub_button_url = $this->frparam('caidan_url_'.($k+1),2);\r\n                        $sub_button_media_id = $this->frparam('caidan_media_id_'.($k+1),2);\r\n                        $sub_button_sort = $this->frparam('caidan_sort_'.($k+1),2);\r\n                        \r\n                        \r\n                        asort($sub_button_sort);\r\n                        $i = 0;\r\n                        $new_sub_button_name = [];\r\n                        $new_sub_button_type = [];\r\n                        $new_sub_button_url = [];\r\n                        $new_sub_button_media_id = [];\r\n                        foreach ($sub_button_sort as $xk=>$xx){\r\n                            \r\n                            $new_sub_button_name[$i] = $sub_button_name[$xk];\r\n                            $new_sub_button_type[$i] = $sub_button_type[$xk];\r\n                            $new_sub_button_key[$i] = $sub_button_key[$xk];\r\n                            $new_sub_button_url[$i] = $sub_button_url[$xk];\r\n                            $new_sub_button_media_id[$i] = $sub_button_media_id[$xk];\r\n                            // echo $i;\r\n                            $i+=1;\r\n                            \r\n                            \r\n                        }\r\n                        \r\n                        \r\n                        $sub_button_name = $new_sub_button_name;\r\n                        $sub_button_type = $new_sub_button_type;\r\n                        $sub_button_key = $new_sub_button_key;\r\n                        $sub_button_url = $new_sub_button_url;\r\n                        $sub_button_media_id = $new_sub_button_media_id;\r\n                        \r\n                        \r\n                        \r\n                        foreach($sub_button_name as $kk=>$vv){\r\n                            $data['button'][$k]['sub_button'][$kk] = array(\r\n                                \"type\"=>$sub_button_type[$kk],\r\n                                \"name\"=>$vv\r\n                            \r\n                            );\r\n                            if($sub_button_type[$kk]=='miniprogram'){\r\n                                \r\n                                $data['button'][$k]['sub_button'][$kk]['appid'] = $sub_button_key[$kk];\r\n                                $data['button'][$k]['sub_button'][$kk]['pagepath'] = $sub_button_url[$kk];\r\n                                $data['button'][$k]['sub_button'][$kk]['url'] = 'https://mp.weixin.qq.com/';\r\n                            }else{\r\n                                if($sub_button_key[$kk]!=''){\r\n                                    $data['button'][$k]['sub_button'][$kk]['key'] = $sub_button_key[$kk];\r\n                                }\r\n                                if($sub_button_url[$kk]!=''){\r\n                                    $data['button'][$k]['sub_button'][$kk]['url'] = $sub_button_url[$kk];\r\n                                }\r\n                                if($sub_button_media_id[$kk]!=''){\r\n                                    $data['button'][$k]['sub_button'][$kk]['media_id'] = $sub_button_media_id[$kk];\r\n                                }\r\n                            }\r\n                            \r\n                            \r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            //dump($data);exit;\r\n            \r\n            $api = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->getAccessToken();\r\n            $data = json_encode($data,JSON_UNESCAPED_UNICODE);\r\n            //echo $data;exit;\r\n            $res = curl_http($api,$data,'post');\r\n            $re = json_decode($res,1);\r\n            if($re['errcode']==0){\r\n                Success(JZLANG('更新成功！'),U('wxcaidan'));\r\n            }else{\r\n                exit($re['errcode'].':'.$re['errmsg']);\r\n            }\r\n            \r\n            \r\n        }\r\n        $api  = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='.$this->getAccessToken();\r\n        $weixincaidan_json = file_get_contents($api);\r\n        if(strpos($weixincaidan_json,'errcode')!==false){\r\n            //创建菜单\r\n            $api = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->getAccessToken();\r\n            //自定根据栏目创建\r\n            \r\n            $a1 = array(\r\n                \"type\"=>\"view\",\r\n                \"name\"=>JZLANG(\"网站首页\"),\r\n                \"url\"=>get_domain(),\r\n                \"sub_button\"=>[\r\n                \r\n                ]\r\n            \r\n            );\r\n            $a2 = array('type'=>\"view\",\"name\"=>JZLANG('个人中心'),'url'=>get_domain().'/login.html',\"sub_button\"=>[]\r\n            );\r\n            $a3 =  array('type'=>\"\",\"name\"=>JZLANG('测试1'),'url'=>'',\"sub_button\"=>[\r\n                ['type'=>'view','name'=>JZLANG('测试2'),'url'=>'xxxx'],\r\n                ['type'=>'view','name'=>JZLANG('测试3'),'url'=>'xxxx']]\r\n            );\r\n            \r\n            $data['button'][] = $a1;\r\n            //$data['button'][] = $a2;\r\n            //$data['button'][] = $a3;\r\n            $data = json_encode($data,JSON_UNESCAPED_UNICODE);\r\n            $res = curl_http($api,$data,'POST');\r\n            //var_dump($res);\r\n            $api  = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='.$this->getAccessToken();\r\n            $weixincaidan_json = file_get_contents($api);\r\n        }\r\n        //echo $weixincaidan_json;exit;\r\n        $lists = json_decode($weixincaidan_json,true);\r\n        \r\n        $buttons = [];\r\n        foreach ($lists['menu']['button'] as $k=>$v){\r\n            \r\n            if(count($v['sub_button'])){\r\n                \r\n                foreach($v['sub_button'] as $kk=>$vv){\r\n                    $v['sub_button'][$kk]['sort'] = $kk+1;\r\n                }\r\n                \r\n            }\r\n            $v['sort'] = $k+1;\r\n            \r\n            $buttons[] = $v;\r\n            \r\n            \r\n        }\r\n        \r\n        $lists['menu']['button'] = $buttons;\r\n        //\tdump($buttons);exit;\r\n        \r\n        \r\n        $this->lists = $lists;\r\n        ///dump($this->lists);exit;\r\n        $this->display('wechat-caidan');\r\n        \r\n    }\r\n    public function sucai(){\r\n        $api = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token='.$this->getAccessToken();\r\n        $data['type'] = ($this->frparam('type',1))?($this->frparam('type',1)):'news';\r\n        $data['offset'] = ($this->frparam('offset'))?($this->frparam('offset')):0;\r\n        $data['count'] = 20;\r\n        $this->data = $data;\r\n        //var_dump($data);exit;\r\n        $data =  json_encode($data,JSON_UNESCAPED_UNICODE);\r\n        $res = curl_http($api,$data,'post');\r\n        //var_dump($res);\r\n        $lists = json_decode($res,true);\r\n        //var_dump($lists);\r\n        if(isset($lists['errcode'])){\r\n            echo JZLANG('接口报错').'['.$res.']';exit;\r\n        }\r\n        $this->total_count = $lists['total_count'];\r\n        $this->item_count = $lists['item_count'];\r\n        $clists = array();\r\n        if($this->data['type']=='news'){\r\n            foreach($lists['item'] as $k=>$v){\r\n                $clists[$k]=$v;\r\n                $clists[$k]['count'] = count($v['content']['news_item']);\r\n                $clists[$k]['news_item'] = $v['content']['news_item'];\r\n            }\r\n        }else{\r\n            \r\n            foreach($lists as $k=>$v){\r\n                $clists[$k] = $v;\r\n                $clists[$k]['count'] = count($v['item']);\r\n            }\r\n        }\r\n        \r\n        $this->lists = $clists;\r\n        $this->display('wechat-sucai');\r\n        \r\n    }\r\n    public function getAccessToken(){\r\n        \r\n        $url = \"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=\".$this->webconf['wx_login_appid'].\"&secret=\".$this->webconf['wx_login_appsecret'];\r\n        $json = file_get_contents($url);\r\n        //解析json\r\n        //var_dump($json);\r\n        $obj = json_decode($json,1);\r\n        if(isset($obj['errcode'])){\r\n            exit(JZLANG('微信配置错误！').$obj['errcode'].$obj['errmsg']);\r\n        }\r\n        return  $obj['access_token'];\r\n    }\r\n    \r\n    \r\n}"
  },
  {
    "path": "app/admin/exts/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/PluginsController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2022/02/10\r\n// +----------------------------------------------------------------------\r\n\r\nnamespace app\\admin\\exts;\r\n\r\nuse frphp\\lib\\Controller;\r\nclass PluginsController extends Controller {\r\n\t\r\n\tprivate $tables = array();\r\n\tprivate $handler;\r\n\tprivate $config = array(\r\n\t  'host' => 'localhost',\r\n\t  'port' => 3306,\r\n\t  'user' => 'root',\r\n\t  'password' => 'root',\r\n\t  'database' => 'test',\r\n\t  'charset' => 'utf-8',\r\n\t  'target' => ''\r\n\t );\r\n\tprivate $limit = 300;//每个备份文件存储的sql条数\r\n\t//自动执行\r\n\tpublic function _init(){\r\n\t\t/**\r\n\t\t\t继承系统默认配置\r\n\t\t\r\n\t\t**/\r\n\t\t\r\n\t\t//检查当前账户是否合乎操作\r\n\t\tif(!isset($_SESSION['admin']) || $_SESSION['admin']['id']==0){\r\n\t\t\tRedirect(U('Login/index'));\r\n\t\t\t\r\n\t\t}\r\n \r\n\t    if($_SESSION['admin']['isadmin']!=1){\r\n\t\t\tif(strpos($_SESSION['admin']['paction'],','.APP_CONTROLLER.',')!==false){\r\n\t\t\t   \r\n\t\t\t}else{\r\n\t\t\t\t$action = APP_CONTROLLER.'/'.APP_ACTION;\r\n\t\t\t\tif(strpos($_SESSION['admin']['paction'],','.$action.',')===false){\r\n\t\t\t\t   $ac = M('Ruler')->find(array('fc'=>$action));\r\n\t\t\t\t   if($this->frparam('ajax')){\r\n\t\t\t\t\t   \r\n\t\t\t\t\t   JsonReturn(['code'=>1,'msg'=>'您没有【'.$ac['name'].'】的权限！','url'=>U('Index/index')]);\r\n\t\t\t\t   }\r\n\t\t\t\t   Error('您没有【'.$ac['name'].'】的权限！',U('Index/index'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t   \r\n\t\t  \t\r\n\t\t}\r\n\t  \t\r\n\t    $webconf = webConf();\r\n\t    $this->webconf = $webconf;\r\n\t    $customconf = get_custom();\r\n\t    $this->customconf = $customconf;\r\n\t\t\r\n\t\t//插件模板页目录\r\n\t\t\r\n\t\t$this->tpl = '@'.dirname(__FILE__).'/tpl/';\r\n\t\t\r\n\t\t/**\r\n\t\t\t在下面添加自定义操作\r\n\t\t**/\r\n\t\t\r\n\t\t\r\n\t}\r\n\t\r\n\t//执行SQL语句在此处处理,或者移动文件也可以在此处理\r\n\tpublic  function install(){\r\n\t\t//下面是新增test表的SQL操作\r\n\t\t\r\n\t\r\n\t\treturn true;\r\n\t\t\r\n\t}\r\n\t\r\n\t//mysql版本\r\n\tprivate function JZ_mysql(){\r\n        \r\n  \r\n        \r\n\t\t/**\r\n\t\t\t文件转移\r\n\t\t**/\r\n\t\t\r\n\t\t\r\n        \r\n\t}\r\n\t\r\n\t//批量转移文件\r\n\tprivate function removeFile($from,$to){\r\n\t\t//移动后台插件控制器\r\n\t\t$sourcefile = $from;\r\n\t\t$target = $to;\r\n\t\tif(is_dir($sourcefile) && is_dir($target)){\r\n\t\t\tif (false != ($handle = opendir ( $sourcefile ))) {\r\n\t\t\t\t\r\n\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\t\tif ($file != \".\" && $file != \"..\" && !is_dir($sourcefile.'/'.$file) ) {\r\n\t\t\t\t\t\t$fs = $sourcefile.'/'.$file;\r\n\t\t\t\t\t\t$ft = $target.'/'.$file;\r\n\t\t\t\t\t\t //备份源文件以防更新覆盖\r\n\t\t\t\t\t\tcopy($ft,  $sourcefile.'/back/'.$file);\r\n\t\t\t\t\t\t$r = $this->file2dir($fs,$ft);\r\n\t\t\t\t\t\tif(!$r){\r\n\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'文件转移失败！sourcefile:'.$fs.' targetfile:'.$ft));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t//关闭句柄\r\n\t\t\t\tclosedir ( $handle );\r\n\t\t\t}\r\n\t\t\r\n\t\t}\r\n\t\t\t\t\r\n\t}\r\n\t\r\n\t// 原目录，复制到的目录\r\n\tfunction recurse_copy($src,$dst) {  \r\n\t \r\n\t\t$dir = opendir($src);\r\n\t\t@mkdir($dst);\r\n\t\twhile(false !== ( $file = readdir($dir)) ) {\r\n\t\t\tif (( $file != '.' ) && ( $file != '..' )) {\r\n\t\t\t\tif ( is_dir($src . '/' . $file) ) {\r\n\t\t\t\t\t$this->recurse_copy($src . '/' . $file,$dst . '/' . $file);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcopy($src . '/' . $file,$dst . '/' . $file);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tclosedir($dir);\r\n\t}\r\n\t//复制文件并转移\r\n\tfunction file2dir($sourcefile, $filename){\r\n\t\t if( !file_exists($sourcefile)){\r\n\t\t\t return false;\r\n\t\t }\r\n\t\t //$filename = basename($sourcefile);\r\n\t\t\r\n\t\t return copy($sourcefile,  $filename);\r\n\t}\r\n\t\r\n\t//返回表字段\r\n\tprivate function getTableFields($table){\r\n\t\tif(defined('DB_TYPE') && DB_TYPE=='sqlite'){\r\n\t\t\t$sql = \"pragma table_info(\".DB_PREFIX.$table.\")\";\r\n\t\t\t\r\n\t\t\t$list = M()->findSql($sql);\r\n\t\t\t$fields = [];\r\n\t\t\tforeach($list as $v){\r\n\t\t\t\t$fields[]=$v['name'];\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}else{\r\n\t\t\t$sql = 'SHOW COLUMNS FROM '.DB_PREFIX.$table;\r\n\t\t\t$list = M()->findSql($sql);\r\n\t\t\t$isgo = true;\r\n\t\t\t$fields = [];\r\n\t\t\tforeach($list as $v){\r\n\t\t\t\t$fields[]=$v['Field'];\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\treturn $fields;\r\n\t\t\r\n\t}\r\n\t//返回数据库表\r\n\tprivate function getTableData(){\r\n\t\tif(defined('DB_TYPE') && DB_TYPE=='sqlite'){\r\n\t\t\t$sql = \"select name from sqlite_master where type='table' order by name\";\r\n\t\t}else{\r\n\t\t\t$sql = \"SHOW TABLES\";\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t$tables = M()->findSql($sql);\r\n\t\t$ttable = array();\r\n\t\tforeach($tables as $value){\r\n\t\t\tforeach($value as $vv){\r\n\t\t\t\t$ttable[] = $vv;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\treturn $ttable;\r\n\t}\r\n\t\r\n\t//备份数据库\r\n\tprivate function JZ_backup(){\r\n\t\t$pconfig = array(\r\n\t\t\t'host' =>DB_HOST,\r\n\t\t\t'port' =>DB_PORT,\r\n\t\t\t'user' =>DB_USER,\r\n\t\t\t'password' =>DB_PASS,\r\n\t\t\t'database' =>DB_NAME\r\n\t\t);\r\n\t\t$this->config = array_merge($this->config, $pconfig);\r\n\t\t$this->handler = new \\PDO(\"mysql:host=\".$this->config['host'].\";port={$this->config['port']};dbname={$this->config['database']}\", $this->config['user'], $this->config['password']);\r\n\t\t$this->handler->query(\"set names utf8\");\r\n\t\t\r\n\t\t$this->backup();\r\n\t}\r\n\t\r\n\t//卸载程序,对新增字段、表等进行删除SQL操作，或者其他操作\r\n\tpublic function uninstall(){\r\n\t\t//下面是删除test表的SQL操作\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t//安装页面介绍,操作说明\r\n\tpublic function desc(){\r\n\t\t$this->display($this->tpl.'plugins-description.html');\r\n\t}\r\n\t\r\n\t//配置文件,插件相关账号密码等操作\r\n\tpublic  function setconf($plugins){\r\n\t\t//将插件赋值到模板中\r\n\t\t$this->plugins = $plugins;\r\n\t\t$this->config = json_decode($plugins['config'],1);\r\n\t\t\r\n\t\t$this->display($this->tpl.'plugins-body.html');\r\n\t}\r\n\t\r\n\t//获取插件内提交的数据处理\r\n\tpublic function setconfigdata($data){\r\n\t\t//ids\r\n\t\t\r\n\t\t$config = $data;\r\n\r\n\t\tM('plugins')->update(['id'=>$data['id']],['config'=>json_encode($config,JSON_UNESCAPED_UNICODE)]);\r\n\t\tsetCache('hook',null);//清空hook缓存\r\n\t\tJsonReturn(['code'=>0,'msg'=>'设置成功！']);\r\n\t}\r\n\t\r\n\t /**\r\n\t  * 备份\r\n\t  * @param array $tables\r\n\t  * @return bool\r\n\t  */\r\n\t private function backup($tables = array())\r\n\t {\r\n\t  //存储表定义语句的数组\r\n\t  $ddl = array();\r\n\t  //存储数据的数组\r\n\t  $data = array();\r\n\t  $this->setTables($tables);\r\n\t  if (!empty($this->tables))\r\n\t  {\r\n\t   foreach ($this->tables as $table)\r\n\t   {\r\n\t\t$ddl[] = $this->getDDL($table);\r\n\t\t$data[] = $this->getData($table);\r\n\t   }\r\n\t   //开始写入\r\n\t   $this->writeToFile($this->tables, $ddl, $data);\r\n\t  }\r\n\t  else\r\n\t  {\r\n\t   $this->error = '数据库中没有表!';\r\n\t   return false;\r\n\t  }\r\n\t }\r\n\t /**\r\n\t  * 设置要备份的表\r\n\t  * @param array $tables\r\n\t  */\r\n\t private function setTables($tables = array())\r\n\t {\r\n\t  if (!empty($tables) && is_array($tables))\r\n\t  {\r\n\t   //备份指定表\r\n\t   $this->tables = $tables;\r\n\t  }\r\n\t  else\r\n\t  {\r\n\t   //备份全部表\r\n\t   $this->tables = $this->getTables();\r\n\t  }\r\n\t }\r\n\t /**\r\n\t  * 查询\r\n\t  * @param string $sql\r\n\t  * @return mixed\r\n\t  */\r\n\t private function query($sql = '')\r\n\t {\r\n\t  $stmt = $this->handler->query($sql);\r\n\t  $stmt->setFetchMode(\\PDO::FETCH_NUM);\r\n\t  $list = $stmt->fetchAll();\r\n\t  return $list;\r\n\t }\r\n\t /**\r\n\t  * 获取全部表\r\n\t  * @return array\r\n\t  */\r\n\t private function getTables()\r\n\t {\r\n\t  $sql = 'SHOW TABLES';\r\n\t  $list = $this->query($sql);\r\n\t  $tables = array();\r\n\t  foreach ($list as $value)\r\n\t  {\r\n\t   $tables[] = $value[0];\r\n\t  }\r\n\t  return $tables;\r\n\t }\r\n\t /**\r\n\t  * 获取表定义语句\r\n\t  * @param string $table\r\n\t  * @return mixed\r\n\t  */\r\n\t private function getDDL($table = '')\r\n\t {\r\n\t  $sql = \"SHOW CREATE TABLE `{$table}`\";\r\n\t  $ddl = $this->query($sql)[0][1] . ';';\r\n\t  return $ddl;\r\n\t }\r\n\t /**\r\n\t  * 获取表数据\r\n\t  * @param string $table\r\n\t  * @return mixed\r\n\t  */\r\n\t private function getData($table = '')\r\n\t {\r\n\t  $sql = \"SHOW COLUMNS FROM `{$table}`\";\r\n\t  $list = $this->query($sql);\r\n\t  //字段\r\n\t  $columns = '';\r\n\t  //需要返回的SQL\r\n\t  $query = [];\r\n\t  foreach ($list as $value)\r\n\t  {\r\n\t   $columns .= \"`{$value[0]}`,\";\r\n\t  }\r\n\t  $columns = substr($columns, 0, -1);\r\n\t  $data = $this->query(\"SELECT * FROM `{$table}`\");\r\n\t  foreach ($data as $value)\r\n\t  {\r\n\t   $dataSql = '';\r\n\t   foreach ($value as $v)\r\n\t   {\r\n\t\tif($v==='' || $v===null){\r\n\t\t  $dataSql .= \" NULL,\";\r\n\t\t}else{\r\n\t\t  $dataSql .= \"'{$v}',\";\r\n\t\t}\r\n\t\t\r\n\t   }\r\n\t   $dataSql = substr($dataSql, 0, -1);\r\n\t   $query[]= \"INSERT INTO `{$table}` ({$columns}) VALUES ({$dataSql});\\r\\n\";\r\n\t  }\r\n\t  return $query;\r\n\t }\r\n\t /**\r\n\t  * 写入文件\r\n\t  * @param array $tables\r\n\t  * @param array $ddl\r\n\t  * @param array $data\r\n\t  */\r\n\t private function writeToFile($tables = array(), $ddl = array(), $data = array())\r\n\t {\r\n\t  $public_str = \"/*\\r\\nMySQL Database Backup Tools\\r\\n\";\r\n\t  $public_str .= \"Server:{$this->config['host']}:{$this->config['port']}\\r\\n\";\r\n\t  $public_str .= \"Database:{$this->config['database']}\\r\\n\";\r\n\t  $public_str .= \"Data:\" . date('Y-m-d H:i:s', time()) . \"\\r\\n*/\\r\\n\";\r\n\t  $i = 0;\r\n\t  //echo '备份数据库-'.$this->config['database'].'<br />';\r\n\t  $countsql = 0;//记录sql数\r\n\t  $filenum = 0;//文件序号\r\n\t  $backfile = $this->config['target']==''? $this->config['database'].'_'.date('Y_m_d_H_i_s').'_'.rand(100000,999999): $this->config['target'].date('YmdHis');//文件名\r\n\t  $str = $public_str.\"SET FOREIGN_KEY_CHECKS=0;\\r\\n\";\r\n\t  foreach ($tables as $table)\r\n\t  {\r\n\t  // echo '备份表：'.$table.'<br>';\r\n\t   $str .= \"-- ----------------------------\\r\\n\";\r\n\t   $str .= \"-- Table structure for {$table}\\r\\n\";\r\n\t   $str .= \"-- ----------------------------\\r\\n\";\r\n\t   $str .= \"DROP TABLE IF EXISTS `{$table}`;\\r\\n\";\r\n\t   $str .= $ddl[$i] . \"\\r\\n\";\r\n\t  \r\n\t   $i++;\r\n\t   //echo '备份成功！<br/>'; \r\n\t   \r\n\t  }\r\n\t  $i = 0;\r\n\t  foreach($tables as $table){\r\n\t\t//echo '备份表数据：'.$table.' <br>';\r\n\t\t$str .= \"-- ----------------------------\\r\\n\";\r\n\t\t$str .= \"-- Records of {$table}\\r\\n\";\r\n\t\t$str .= \"-- ----------------------------\\r\\n\";\r\n\t\t//$str .= $data[$i] . \"\\r\\n\";\r\n\t\tforeach ($data[$i] as $v){\r\n\t\t\t$str .= $v;\r\n\t\t\t$countsql++;\r\n\t\t\tif($countsql%($this->limit)==0){\r\n\t\t\t\t$str = '<?php die();?>'.$str;\r\n\t\t\t\tif($filenum==0){\r\n\t\t\t\t\t$isok = file_put_contents('backup/'.$backfile.'.php', $str);\r\n\t\t\t\t\tif(!$isok){\r\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ backup/'.$backfile.'.php ] 写入文件失败！']);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$filenum++;\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$isok = file_put_contents('backup/'.$backfile.'_v'.$filenum.'.php', $str);\r\n\t\t\t\t\tif(!$isok){\r\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ backup/'.$backfile.'_v'.$filenum.'.php ] 写入文件失败！']);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$filenum++;\r\n\t\t\t\t}\r\n\t\t\t\t$str = $public_str;\r\n\t\t\t}\t\r\n\t\t}\r\n\t\t$i++;\r\n\t\t\r\n\t\t\r\n\t  }\r\n\t  if($str!='' && $str != $public_str){\r\n\t\t\t$str = '<?php die();?>'.$str;\r\n\t\t\tif($filenum==0){\r\n\t\t\t\t$isok = file_put_contents('backup/'.$backfile.'.php', $str);\r\n\t\t\t\tif(!$isok){\r\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ backup/'.$backfile.'.php ] 写入文件失败！']);\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\t$isok = file_put_contents('backup/'.$backfile.'_v'.$filenum.'.php', $str);\r\n\t\t\t\tif(!$isok){\r\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ backup/'.$backfile.'_v'.$filenum.'.php ] 写入文件失败！']);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t  }\r\n\r\n\t }\r\n\t\r\n}\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/config.php",
    "content": "<?php\n\nreturn [\n\t'name'=>'在线升级插件',//插件名,必须与插件文件夹名字相同\n\t'desc'=>'实现极致CMS后台在线升级',//插件介绍\n\t'author'=>'留恋风2581047041@qq.com',//作者介绍,这里可以把自己的联系方式带上去,方便用户沟通\n\t'version'=>'9.3',//插件版本,默认1.0为最低版本\n\t'update_time'=>'2026-04-08',//插件更新时间,格式：Y-m-d\n\t'module'=>'Admin',//插件应用的模块,Home表示前台模块,Admin表示后台模块.插件安装的时候会据此加载控制器到对应的目录中\n];\n\n\n\n\n"
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/conf/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/mysql/admin/c/back/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/mysql/admin/tpl/back/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/mysql/frphp/back/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/mysql/frphp/common/back/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/mysql/frphp/extend/back/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/mysql/frphp/lib/back/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/mysql/home/back/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/file/mysql/static/.gitkeep",
    "content": ""
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/tpl/plugins-body.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  {include=\"style\"}\n\n</head>\n<body >\n\n  <div class=\"layui-rows\" style=\"    margin: 10px;\">\n    <form class=\"layui-form layui-form-pane\" action=\"\">\n  <!--表单必须要携带ID-->\n  <blockquote class=\"layui-elem-quote\">暂时无需配置，如果有特殊情况，更新时会通知。</blockquote>\n  \n   \n    \n   \n  \n</form>\n</div>\n\n\n\n\n\n    <script>\n        $(function  () {\n      \n            layui.use('form', function(){\n              var form = layui.form;\n             \n              //监听提交\n              form.on('submit(formDemo)', function(data){\n           \n        $.post(\"{fun U('setconf')}\",data.field,function(res){\n            //console.log(res);return false;\n           var res = JSON.parse(res);\n           if(res.code==1){\n            layer.msg(res.msg);\n           }else{\n            layer.msg(res.msg, {icon: 6,time: 2000},function(){\n            window.location.reload();\n            });\n                     \n            \n             \n           }\n        })\n        \n                return false;\n              });\n            });\n        })\n\n        \n    </script>\n\n    \n \n</body>\n</html>"
  },
  {
    "path": "app/admin/exts/jizhicmsupdate/tpl/plugins-description.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t{include=\"style\"}\n\t<style>\n\tblockquote.layui-elem-quote {\n\t\tfont-size: 14px;\n\t}\n\t</style>\n\n</head>\n<body >\n <div class=\"layui-rows\" style=\"    margin: 10px;\">\n    <h1 style=\"text-align:center\">极致CMS在线升级插件</h1>\n    <div class=\"layui-content\" style=\"margin: 20px 40px;text-align: center;\"><p style=\"font-size: 16px;\">作者：留恋风2581047041@qq.com&nbsp;&nbsp;</span></p>\n    </div>\n    \n\t<div style=\" margin: 25px; font-size: 20px;\">\n\t\t<fieldset class=\"layui-elem-field\" style=\"border: none;padding: 0;border-top: 1px solid #eee;\">\n\t\t  <legend>插件功能</legend>\n\t\t  <div class=\"layui-field-box\">\n\t\t    <blockquote class=\"layui-elem-quote\">为了方便用户无需手动下载升级文件到系统，可以通过此插件进行升级，以及修复一些紧急的bug。<br/>随着时间推移，该插件会根据不同的情况进行升级，但不会强制使用者升级系统，只有你需要升级的时候，有选择的进行升级。<br/>如果要使用该升级插件，请先安装，安装后无需开启，在下次有修复或者更新的时候，点击“版本”栏下的 <span class=\"layui-badge\">新</span> 即可主动升级。[ 如未安装插件，则需要点击“安装”插件才会进行处理 ]\n\t\t\t</blockquote>\n\t\t  </div>\n\t\t</fieldset>\n\t\t<fieldset class=\"layui-elem-field\" style=\"border: none;padding: 0;border-top: 1px solid #eee;\">\n\t\t  <legend>如何找回升级前的文件？</legend>\n\t\t  <div class=\"layui-field-box\">\n\t\t    <blockquote class=\"layui-elem-quote\">\n\t\t\tv2.0+版本在线升级的文件都会被存储到更新插件文件备份目录（back）内。<br/>\n\t\t\t文件对应目录如下：<br/>\n\t\t\tmysql版本：app/admin/exts/jizhiupdate/file/mysql/<br/>\n\t\t\tsqlite版本：app/admin/exts/jizhiupdate/file/sqlite/<br/>\n\t\t\t系统文件目录：frphp<br/>\n\t\t\t后台文件目录：admin<br/>\n\t\t\t前台文件目录：home<br/>\n\t\t\t系统配置文件目录：app/admin/exts/jizhiupdate/file/conf/<br/>\n\t\t\t系统公共资源文件目录：app/admin/exts/jizhiupdate/file/static/<br/>\n\t\t\t<span style=\"color:#f00;\">每次升级，系统将自动为您执行备份数据库操作</span><br/>\n\t\t\t举个例子：<br/>\n\t\t\t假设：app/admin/t/tpl/article-add.html升级时被覆盖了<br/>\n\t\t\t源文件备份路径[mysql版本]：app/admin/exts/jizhiupdate/file/mysql/admin/tpl/back/article-add.html<br/>\n\t\t\t源文件备份路径[sqlite版本]：app/admin/exts/jizhiupdate/file/sqlite/admin/tpl/back/article-add.html\n\t\t\t</blockquote>\n\t\t  </div>\n\t\t</fieldset>\n\t\t\n\t\t\n\t</div>\n\t\n\t\n  </div>\n  </div>\n\n  \n    <script>\n\tlayui.use('code', function(){ //加载code模块\n\t\t  layui.code({'encode':true}); //引用code方法\n\t\t});\n    </script>\n \n</body>\n</html>"
  },
  {
    "path": "app/admin/lang/back.php",
    "content": "<?php return array (\n  '该角色下存在用户，请先移除用户再删除！' => '',\n  '删除失败，该分组不允许删除！' => '',\n  '删除成功！' => '',\n  '删除失败，请重试！' => '',\n  '非法操作！' => '',\n  '修改失败，您的权限不足！' => '',\n  '修改成功！' => '',\n  '修改失败，请重新提交！' => '',\n  '没有该角色！' => '',\n  '新增成功！' => '',\n  '新增失败，请重新提交！' => '',\n  '修改失败，该分组不允许修改！' => '',\n  '您没有权限操作！' => '',\n  '两次密码不同！' => '',\n  '手机号已被注册！' => '',\n  '昵称已被使用！' => '',\n  '邮箱已被使用！' => '',\n  '修改失败！' => '',\n  '新增失败！' => '',\n  '系统管理员不能删除！' => '',\n  '删除失败！' => '',\n  '批量操作失败！' => '',\n  '批量删除成功！' => '',\n  '添加失败' => '',\n  '存在敏感词' => '',\n  '已存在相同的自定义URL！' => '',\n  '添加成功,继续添加~' => '',\n  '内容配置' => '',\n  '修改失败' => '',\n  '发布奖励' => '',\n  '您未做任何修改，不能提交！' => '',\n  '复制成功！' => '',\n  '复制失败！' => '',\n  '批量复制成功！' => '',\n  '批量修改成功！' => '',\n  '批量操作成功！' => '',\n  'URL链接命名不能是' => '',\n  '非法URL' => '',\n  '添加栏目成功，继续添加~' => '',\n  '模型错误！' => '',\n  '不能选择当前栏目及下级为顶级栏目' => '',\n  '该栏目有子栏目，请先删除子栏目！' => '',\n  '栏目不能为空！' => '',\n  '操作成功！' => '',\n  '请选择分类！' => '',\n  '添加成功！继续添加~' => '',\n  '添加失败！' => '',\n  '该分类下存在内容，请先删除该分类下的内容！' => '',\n  '添加成功！' => '',\n  '已审核' => '',\n  '被删除' => '',\n  '未审核' => '',\n  '已读' => '',\n  '未读' => '',\n  '批量审核成功！' => '',\n  '批量审核失败！' => '',\n  '您没有权限！' => '',\n  '文件类型不允许上传！' => '',\n  '文件大小超过网站内部限制！' => '',\n  '请检查目录写入权限' => '',\n  '错误信息提示' => '',\n  '模块为空，请选择模块！' => '',\n  '缺少ID' => '',\n  '请选择模块！' => '',\n  '显示' => '',\n  '隐藏' => '',\n  '是' => '',\n  '否' => '',\n  '单行文本' => '',\n  '多行文本' => '',\n  '文本编辑器' => '',\n  '数字' => '',\n  '单图片' => '',\n  '多图片' => '',\n  '单选下拉' => '',\n  '多选' => '',\n  '单附件' => '',\n  '多附件' => '',\n  '时间戳' => '',\n  '单选按钮' => '',\n  '单选关联' => '',\n  '小数' => '',\n  '多行录入' => '',\n  '多选关联' => '',\n  '栏目' => '',\n  '副栏目' => '',\n  '系统TAG' => '',\n  '字段名和字段标识不能为空！' => '',\n  '字段标识已存在！' => '',\n  '系统保护字段，不允许创建！' => '',\n  '字段长度不对！' => '',\n  '字段长度不对,时间属性必须长度为11' => '',\n  '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '',\n  '字段创建成功，但是字段表记录失败，请反馈官方解决！' => '',\n  '字段创建成功！' => '',\n  '字段修改成功！' => '',\n  '字段修改失败！' => '',\n  '上传图片' => '',\n  '选择图片' => '',\n  '图片未找到' => '',\n  '删除这张图片' => '',\n  '删除' => '',\n  '上传异常！' => '',\n  '文字描述' => '',\n  '左移' => '',\n  '右移' => '',\n  '请选择' => '',\n  '上传附件' => '',\n  '字段关联绑定失败，请重新绑定！' => '',\n  '请选择关联项' => '',\n  'TAG标签' => '',\n  '按Enter回车自动添加' => '',\n  '添加一个标签' => '',\n  '系统字段不允许删除！' => '',\n  '请选择字段！' => '',\n  '请选择栏目！' => '',\n  '参数有误！' => '',\n  '请选择桌面配置！' => '',\n  '系统默认不可删除！' => '',\n  '网站地图创建成功！' => '',\n  '网站地图创建失败，请检查根目录权限！' => '',\n  '清除失败！' => '',\n  '清除成功！' => '',\n  '生成失败！' => '',\n  '生成成功！' => '',\n  '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~' => '',\n  '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~' => '',\n  '静态HTML页面已全部清理完毕！' => '',\n  '总共清理页面数：' => '',\n  '每次清理页面数：' => '',\n  '停顿时间：' => '',\n  '开始时间：' => '',\n  '结束时间：' => '',\n  '总共花费时间：' => '',\n  '总共生成页面数：' => '',\n  '每次生成页面数：' => '',\n  '系统创建目录失败!' => '',\n  '模块未绑定栏目，无法生存HTML！' => '',\n  '链接错误！' => '',\n  '请输入属性名称！' => '',\n  '属性已存在！' => '',\n  '参数错误！' => '',\n  '系统属性只允许修改和隐藏，不允许删除！' => '',\n  '请输入内链词！' => '',\n  '请输入内链！' => '',\n  '内链词已存在！' => '',\n  '已审' => '',\n  '退回' => '',\n  '未审' => '',\n  '账户密码不能为空！' => '',\n  '验证码错误！' => '',\n  '该账户已被封禁！' => '',\n  '登录成功！' => '',\n  '账户密码错误！' => '',\n  '安全退出~' => '',\n  '无' => '',\n  '不显示' => '',\n  '邮箱已被注册！' => '',\n  '添加失败，请重新提交！' => '',\n  '没有找到该用户！' => '',\n  '该分组下存在用户，请先移除用户再删除！' => '',\n  '删除失败，该分类有下级功能，请先删除下级功能！' => '',\n  '未选择删除对象！' => '',\n  '模块名和标识不能为空！' => '',\n  '模型已添加不能重复添加！' => '',\n  '该表已存在！' => '',\n  '标题' => '',\n  '默认为空' => '',\n  '所属栏目' => '',\n  '选择栏目' => '',\n  '绑定后可以在当前模型的其他栏目中显示' => '',\n  '关键词' => '',\n  '每个词用英文逗号(,)拼接' => '',\n  '缩略图' => '',\n  '可留空' => '',\n  '简介' => '',\n  '内容' => '',\n  '发布会员' => '',\n  '前台发布会员ID记录' => '',\n  '管理员' => '',\n  '后台发布管理员ID记录' => '',\n  '外链URL' => '',\n  '默认为空，系统访问内容则直接跳转到此链接' => '',\n  '自定义URL' => '',\n  '默认为空，自定义URL' => '',\n  '点击量' => '',\n  '系统自动添加' => '',\n  '评论数' => '',\n  '系统自带' => '',\n  '点赞数' => '',\n  '排序' => '',\n  '添加时间' => '',\n  '选择时间' => '',\n  '推荐属性' => '',\n  '1置顶2热点3推荐' => '',\n  '置顶=1,热点=2,推荐=3' => '',\n  '是否显示' => '',\n  '显示隐藏' => '',\n  '显示=1,未审=0,退回=2' => '',\n  '列表' => '',\n  '新增' => '',\n  '修改' => '',\n  '复制' => '',\n  '批量删除' => '',\n  '批量修改' => '',\n  '批量复制' => '',\n  '批量审核' => '',\n  '管理' => '',\n  '新增模型成功，快去创建对应的栏目吧！' => '',\n  '新增模型成功，快去设置表字段吧！' => '',\n  '新增模型失败！' => '',\n  '标识不能为空！' => '',\n  '系统模型标识不允许修改！' => '',\n  '页面有错误，缺少模块ID！' => '',\n  '里面存在数据，请先清空表内数据！' => '',\n  '是系统模型，不允许删除！' => '',\n  '字段表记录未清除，请手动清除！' => '',\n  '模型' => '',\n  '用户' => '',\n  '栏目链接' => '',\n  '外链' => '',\n  '自定义链接' => '',\n  '发布时间' => '',\n  '字段名称不能为空！' => '',\n  '显示=1,隐藏=0' => '',\n  '显示=1,隐藏=0,退回=2' => '',\n  '是=1,否=0' => '',\n  '重构成功！' => '',\n  '系统栏目' => '',\n  '系统副栏目' => '',\n  '模型标识' => '',\n  '发布管理员' => '',\n  '前台用户' => '',\n  '待付款' => '',\n  '已付' => '',\n  '超时' => '',\n  '待审核待支付' => '',\n  '已发货' => '',\n  '已废弃' => '',\n  '未付' => '',\n  '您的订单发货通知' => '',\n  '尊敬的' => '',\n  '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！' => '',\n  '订单详细信息如下：' => '',\n  '主图' => '',\n  '价格' => '',\n  '购买数量' => '',\n  '总价' => '',\n  '折扣：' => '',\n  '元' => '',\n  '运费：' => '',\n  '￥' => '',\n  '合计：' => '',\n  '收件地址：' => '',\n  '联系电话：' => '',\n  '钱包' => '',\n  '积分' => '',\n  '充值' => '',\n  '兑换' => '',\n  '奖励' => '',\n  '该用户不存在！' => '',\n  '充值数量不对！' => '',\n  '操作失败！' => '',\n  '插件配置' => '',\n  '未分类' => '',\n  '商品配置' => '',\n  '批量复制失败！' => '',\n  '部分未执行成功！' => '',\n  '还原失败，可能是ID已经存在！' => '',\n  '数据不存在！' => '',\n  '删除失败，系统功能不能删除！' => '',\n  '配置栏下有自定义配置，无法删除配置栏' => '',\n  '已存在配置标识，请重新设置！' => '',\n  '提交成功！' => '',\n  '删除失败！系统字段不允许删除！' => '',\n  '图片不存在，删除失败！' => '',\n  '远程存储图片无法删除！' => '',\n  '图片ID错误！' => '',\n  '部分删除成功，存在远程链接无法删除！' => '',\n  '非法操作' => '',\n  '请检查目录' => '',\n  '写入权限' => '',\n  '配置成功！' => '',\n  '参数存在安全隐患！' => '',\n  '参数错误,必须携带插件ID！' => '',\n  '发生错误' => '',\n  '下载缓存文件不存在！' => '',\n  '请选择使用场景！' => '',\n  '执行插件安装程序失败！' => '',\n  '安装成功！' => '',\n  '备份成功！' => '',\n  '该插件暂无更新！' => '',\n  '参数错误,请选择对应模板！' => '',\n  '文件不存在！' => '',\n  '解压失败！' => '',\n  '数据库中没有表!' => '',\n  '写入文件失败！' => '',\n  ' 写入文件失败！' => '',\n  '解压完毕！本次解压花费' => '',\n  '秒' => '',\n  '更新成功！' => '',\n  '个人中心' => '',\n  '测试1' => '',\n  '测试2' => '',\n  '测试3' => '',\n  '接口报错' => '',\n  '微信配置错误！' => '',\n  '网站首页' => '',\n  '首页' => '',\n  '碎片化管理' => '',\n  '新增碎片' => '',\n  '刷新' => '',\n  '基本信息' => '',\n  '使用说明' => '',\n  '指定几个id或者几个tid的内容输出' => '',\n  'SQL中输入' => '',\n  '或者' => '',\n  '模糊查询，查询标题跟 “网站建设” 相关的内容' => '',\n  '网站建设' => '',\n  '模糊查询，查询标题/内容跟 “网站建设” 相关的内容' => '',\n  '不支持联表查询' => '',\n  '注意字符串都要使用英文单引号' => '',\n  '如' => '',\n  '碎片名称' => '',\n  '碎片标识' => '',\n  '建议英文，不要重复' => '',\n  '不限栏目' => '',\n  '子栏目包含' => '',\n  '包含' => '',\n  '不包含' => '',\n  '输出条数' => '',\n  '0表示输出所有' => '',\n  '更新周期' => '',\n  '单位' => '',\n  '分钟' => '',\n  '保存' => '',\n  '返回' => '',\n  '确定' => '',\n  '导航管理' => '',\n  '新增导航' => '',\n  '导航名称' => '',\n  '导航菜单' => '',\n  '链接' => '',\n  '打开' => '',\n  '操作' => '',\n  '不填默认栏目名称' => '',\n  '自定义链接则需要填写' => '',\n  '本页面' => '',\n  '新页面' => '',\n  '管理员管理' => '',\n  '新增管理员信息' => '',\n  '基本' => '',\n  '扩展' => '',\n  '登录名' => '',\n  '将会成为您唯一的登入名' => '',\n  '手机' => '',\n  '邮箱' => '',\n  '角色' => '',\n  '选择角色' => '',\n  '密码' => '',\n  '6到16个字符,不改请留空' => '',\n  '确认密码' => '',\n  '状态' => '',\n  '正常' => '',\n  '禁用' => '',\n  '增加成功' => '',\n  '修改管理员信息' => '',\n  '管理员列表' => '',\n  '搜索' => '',\n  '是否封禁' => '',\n  '封禁' => '',\n  '开始日' => '',\n  '截止日' => '',\n  '请输入用户名' => '',\n  '编辑' => '',\n  '添加管理员' => '',\n  '正常|封禁' => '',\n  '所属角色' => '',\n  '登录时间' => '',\n  '注册时间' => '',\n  '确认要删除吗？' => '',\n  '请选择对象！' => '',\n  '批量删除成功' => '',\n  '个人信息' => '',\n  '基础' => '',\n  '设置' => '',\n  '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！' => '',\n  '恢复数据' => '',\n  '此规则配置仅在不填留空的情况下才会触发' => '',\n  'SEO标题' => '',\n  '等于内容标题' => '',\n  '不填则留空' => '',\n  '缩略图规则' => '',\n  '自动获取内容第一张图片' => '',\n  '不自动获取' => '',\n  '简介规则' => '',\n  '自动获取内容前200字符' => '',\n  'TAG规则' => '',\n  '同步关键词' => '',\n  '不同步关键词' => '',\n  '敏感词过滤字段' => '',\n  '需要过滤敏感词在系统配置中进行设置' => '',\n  '请输入需要过滤的字段' => '',\n  '返回列表' => '',\n  '取消' => '',\n  '预览' => '',\n  '批量修改栏目' => '',\n  '修改推荐属性' => '',\n  '审核' => '',\n  '列表字段设置' => '',\n  '顶' => '',\n  '热' => '',\n  '荐' => '',\n  '请选择修改栏目！' => '',\n  '确认要批量修改内容分类吗？' => '',\n  '批量修改成功' => '',\n  '请选择修改属性！' => '',\n  '请选择修改对象！' => '',\n  '请选择审核选项！' => '',\n  '请选择审核对象！' => '',\n  '确认要批量处理吗？' => '',\n  '批量审核成功' => '',\n  '确认要复制吗？' => '',\n  '批量复制成功' => '',\n  '添加属性' => '',\n  '名称' => '',\n  '修改属性' => '',\n  '新增属性' => '',\n  '系统设置' => '',\n  '数据库管理' => '',\n  '备份数据库' => '',\n  '备份数：' => '',\n  '数据库备份名' => '',\n  '大小' => '',\n  '备份副本' => '',\n  '还原数据' => '',\n  '删除备份' => '',\n  '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？' => '',\n  '您确定要删除备份数据库吗？删除后将不可找回！' => '',\n  '数据缓存' => '',\n  '文件夹cache/data，主要是网站内容缓存，栏目，详情页等' => '',\n  '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空' => '',\n  '日志缓存' => '',\n  '文件夹cache/log，包括错误日志、支付日志、登录日志等' => '',\n  '模板缓存' => '',\n  '文件夹cache，主要是程序执行时生成的模板编译文件' => '',\n  '缩略图缓存' => '',\n  '文件夹image，主要是程序执行时生成的自定义缩略图' => '',\n  '立即清空' => '',\n  '请选择清空目标！' => '',\n  '清理成功！' => '',\n  '内链管理' => '',\n  '添加内链' => '',\n  '内链词' => '',\n  '内链' => '',\n  '替换词' => '',\n  '替换次数' => '',\n  '替换词，可为空！' => '',\n  '请填写内链' => '',\n  '替换次数，默认-1，替换全部，可不写。' => '',\n  '提交' => '',\n  '修改内链' => '',\n  '内链词和内链不能为空！' => '',\n  '充值类型' => '',\n  '当前兑换率：' => '',\n  '兑换率指1元相当于多少钱包/积分' => '',\n  '交易类型' => '',\n  '赠送' => '',\n  '充值数量' => '',\n  '用户ID' => '',\n  '备注' => '',\n  '添加' => '',\n  '充值管理' => '',\n  '充值列表' => '',\n  '选择交易类型' => '',\n  '买入' => '',\n  '选择交易种类' => '',\n  '请输入前台用户手机号' => '',\n  '请输入用户昵称' => '',\n  '请输入订单号' => '',\n  '会员充值' => '',\n  '总订单' => '',\n  '已充值' => '',\n  '已兑换' => '',\n  '总赠送' => '',\n  '尾页' => '',\n  '订单号' => '',\n  '类型' => '',\n  '交易' => '',\n  '用户名' => '',\n  '数量' => '',\n  '金额' => '',\n  '时间' => '',\n  '查看' => '',\n  '选择模块' => '',\n  '选择上级' => '',\n  '顶级栏目' => '',\n  '分类名' => '',\n  '图片  ' => '',\n  '择图片' => '',\n  '排序规则' => '',\n  '组合：排序倒序，时间倒序，ID倒序' => '',\n  '组合：排序倒序，ID正序' => '',\n  '排序正序' => '',\n  '时间倒序' => '',\n  'ID正序' => '',\n  '点击量倒序' => '',\n  '时间正序' => '',\n  '默认不需要更改' => '',\n  'URL命名' => '',\n  '请填写文件名，如:index，不填请留空' => '',\n  '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：' => '',\n  '多个相同URL，将覆盖前面的栏目' => '',\n  '列表显示' => '',\n  '设置列表页显示的内容条数' => '',\n  '栏目模板' => '',\n  '手动填写，不填请留空' => '',\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '',\n  '详情页模板' => '',\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。' => '',\n  '栏目外链' => '',\n  '栏目外链，如:htt://xxx.com/abc，不填请留空' => '',\n  '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！' => '',\n  '发布显示' => '',\n  '勾选后，前台会员发布会显示该栏目' => '',\n  '导航显示' => '',\n  '模板覆盖' => '',\n  '覆盖' => '',\n  '不覆盖' => '',\n  '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => '',\n  '访问限制' => '',\n  '是否关闭' => '',\n  '关闭' => '',\n  '开启' => '',\n  '栏目关闭后，前台不显示，也无法访问！' => '',\n  '增加' => '',\n  '请选择模板页面/使用自定义' => '',\n  '批量新增' => '',\n  '添加栏目' => '',\n  '格式：栏目名|栏目URL，一行一个，如：关于我们|about' => '',\n  '格式：栏目名|栏目URL，一行一个' => '',\n  '请选择模板页面' => '',\n  '图片 ' => '',\n  '请填写完整文件名，如:index，不填请留空' => '',\n  ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => '',\n  '请选择栏目' => '',\n  '顶级' => '',\n  '展开|折叠' => '',\n  '模块名' => '',\n  '快捷操作' => '',\n  '显示|隐藏' => '',\n  '添加下级' => '',\n  '字段管理' => '',\n  '新增文章' => '',\n  '新增商品' => '',\n  '新增内容' => '',\n  '请选择对象' => '',\n  '已删除!' => '',\n  '删除成功' => '',\n  '扩展管理' => '',\n  '新增轮播图' => '',\n  '所属分类' => '',\n  '图片' => '',\n  '图片高' => '',\n  '0表示不限制' => '',\n  '图片宽' => '',\n  '跳转链接' => '',\n  '不填请留空' => '',\n  '数字越大越靠前' => '',\n  '修改轮播图' => '',\n  '选择分类' => '',\n  '更新时间' => '',\n  '轮播图列表' => '',\n  '请选择分类' => '',\n  '请输入标题' => '',\n  '新增图片' => '',\n  '分类列表' => '',\n  '添加分类' => '',\n  '共有数据：' => '',\n  '条' => '',\n  '长' => '',\n  '宽' => '',\n  '轮播图分类' => '',\n  '评论管理' => '',\n  '添加评论' => '',\n  '评论栏目' => '',\n  '文章ID' => '',\n  '主回复ID' => '',\n  '同属于一个评论的ID，如果没有评论中的评论，则为0' => '',\n  '回复帖子ID' => '',\n  '评论内容' => '',\n  '管理员回复' => '',\n  '是否提醒回复' => '',\n  '提醒' => '',\n  '不提醒' => '',\n  '喜欢/点赞' => '',\n  '是否已读' => '',\n  '是否删除' => '',\n  '已删除' => '',\n  '未删除' => '',\n  '只能管理员删除评论，用户只能软删除评论' => '',\n  '查看评论' => '',\n  '评论列表' => '',\n  '请输入评论内容' => '',\n  '查看相关内容' => '',\n  '查看用户' => '',\n  '所属文章' => '',\n  '评论时间' => '',\n  '请选择审核选项' => '',\n  '批量处理成功' => '',\n  '调用方式' => '',\n  '这里输出想要的内容，如：' => '',\n  '查看SQL' => '',\n  '系统扩展' => '',\n  '桌面管理' => '',\n  '新增配置' => '',\n  '配置名称' => '',\n  '左侧菜单栏' => '',\n  '没有二级菜单不会生效' => '',\n  '顶部菜单栏' => '',\n  '适用角色' => '',\n  '默认所有' => '',\n  '系统默认' => '',\n  '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置' => '',\n  '一个菜单名称' => '',\n  '顶级菜单' => '',\n  '菜单图标' => '',\n  '二级菜单' => '',\n  '图标' => '',\n  '修改菜单名称' => '',\n  '确定要删除吗？' => '',\n  '最后一个索引不能删除！' => '',\n  '添加菜单名称' => '',\n  '菜单选择' => '',\n  '图标选择' => '',\n  '修改配置' => '',\n  '桌面名称' => '',\n  '系统' => '',\n  '是否默认' => '',\n  '所有角色' => '',\n  '复制配置' => '',\n  '修改碎片' => '',\n  '指定几个id或者几个tid的内容输出(栏目：不限制栏目)' => '',\n  'SQL中输入：' => '',\n  'SQL中输入： ' => '',\n  '如： ' => '',\n  '单位：分钟' => '',\n  '修改导航' => '',\n  '扩展模型管理' => '',\n  '模块管理' => '',\n  '新增字段' => '',\n  '角色绑定' => '',\n  '目绑定' => '',\n  '字段名称' => '',\n  '简短的名称' => '',\n  '字段标识' => '',\n  '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短' => '',\n  '字段类型' => '',\n  '选择' => '',\n  '长度' => '',\n  '说明' => '',\n  '不限' => '',\n  '带编辑器文本' => '',\n  '只能填写数字，长度不能超过11位' => '',\n  '金钱，小数等，保留2位' => '',\n  '时间日期' => '',\n  '多图，图集' => '',\n  '红=1,黄=2' => '',\n  '单项选择，下拉选择，如：红=1,黄=2,蓝=3' => '',\n  '单项选择，按钮选择，如：红=1,黄=2,蓝=3' => '',\n  '多项选择，如：红=1,黄=2,蓝=3' => '',\n  '一个附件，压缩包，Excel，Word文档' => '',\n  '多个附件，压缩包，Excel，Word文档' => '',\n  '请选择关联模块' => '',\n  '列表显示字段' => '',\n  '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '',\n  '多行录入，可以在页面动态新增内容输入框' => '',\n  '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '',\n  '系统栏目，不可修改' => '',\n  '系统副栏目，不可修改' => '',\n  '系统TAG，不可修改' => '',\n  '默认值' => '',\n  '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1' => '',\n  '字段提示' => '',\n  '用于填写时的提示信息，50字以内' => '',\n  '表单排序' => '',\n  '是否必填' => '',\n  '必填' => '',\n  '非必填' => '',\n  '带有文本框编辑器的除外' => '',\n  '前台显示' => '',\n  '前台表单' => '',\n  '后台显示' => '',\n  '后台搜索' => '',\n  '仅用于后台列表头部带有该字段搜索' => '',\n  '列表中显示' => '',\n  '仅用于后台列表显示该字段' => '',\n  '显示格式化' => '',\n  '不做处理' => '',\n  '仅用于后台列表显示该字段内容处理' => '',\n  'ajax可访问' => '',\n  '不能' => '',\n  '能' => '',\n  '由于本系统对json数据封装，限制访问可以提高安全性' => '',\n  '角色名' => '',\n  '栏目名' => '',\n  '修改字段' => '',\n  '栏目绑定' => '',\n  '红=1,黄=2,蓝=3' => '',\n  '关联模块内容ID' => '',\n  '可以在页面动态新增内容输入框' => '',\n  '温馨提示：排序和宽度在列表点击也可以更改。' => '',\n  '排序：当前列表显示排序，不会影响录入排序，越大越靠前。' => '',\n  '搜索：在列表顶部的搜索中，可以搜索该字段。' => '',\n  '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。' => '',\n  '宽度' => '',\n  '批量绑定栏目' => '',\n  '字段' => '',\n  '后台' => '',\n  '确认要删除吗？删除的同时将删除对应的表内容！' => '',\n  '角色管理' => '',\n  '角色修改' => '',\n  '是否超管' => '',\n  '不是' => '',\n  '超级管理员拥有无上权利，无视下面权限限制' => '',\n  '发布审核' => '',\n  '超级管理员除外，发布的内容是否需要审核' => '',\n  '栏目权限' => '',\n  '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效' => '',\n  '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目' => '',\n  '子栏目' => '',\n  '拥有权限' => '',\n  '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块' => '',\n  '主模块' => '',\n  '子模块' => '',\n  '描述' => '',\n  '请输入内容' => '',\n  '关闭后，该分组管理员将不能登录' => '',\n  '添加角色' => '',\n  '后台管理' => '',\n  '展开左侧栏' => '',\n  '清理缓存' => '',\n  '退出' => '',\n  '前台首页' => '',\n  '后台首页' => '',\n  '我的桌面' => '',\n  '关闭当前' => '',\n  '关闭其他' => '',\n  '关闭所有' => '',\n  '扩展模块管理' => '',\n  '批量修改分类' => '',\n  '批量处理' => '',\n  '友情链接分类' => '',\n  '分类' => '',\n  '后台管理登录' => '',\n  '验证码' => '',\n  '登录' => '',\n  '登录ID' => '',\n  '登录用户' => '',\n  '模块' => '',\n  '方法' => '',\n  '操作时间' => '',\n  '会员管理' => '',\n  '新增会员' => '',\n  '用于找回密码' => '',\n  '手机号' => '',\n  '必须唯一' => '',\n  '昵称' => '',\n  '分组' => '',\n  '头像' => '',\n  '生日' => '',\n  '个性签名' => '',\n  '省份' => '',\n  '城市' => '',\n  '详细地址' => '',\n  '6到16个字符' => '',\n  '添加成功' => '',\n  '会员修' => '',\n  '6到16个字符,不修改请留空' => '',\n  '修改成功' => '',\n  '会员列表' => '',\n  '请输入手机号' => '',\n  '余额' => '',\n  '加入时间' => '',\n  '分组管理' => '',\n  '分组修改' => '',\n  '分组名' => '',\n  '折扣类型' => '',\n  '无折扣' => '',\n  '现金折扣' => '',\n  '百分比折扣' => '',\n  '折扣金额' => '',\n  '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效' => '',\n  '登录状态' => '',\n  '请选择所属单位！' => '',\n  '用户管理' => '',\n  '会员分组' => '',\n  '添加分组' => '',\n  '温馨提示：前台权限已关闭，设置权限不会生效。' => '',\n  '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！' => '',\n  '留言管理' => '',\n  '查看留言' => '',\n  '问题描述' => '',\n  '用户昵称' => '',\n  '留言栏目' => '',\n  '不指定栏目' => '',\n  '联系电话' => '',\n  '留言IP' => '',\n  '留言内容' => '',\n  '是否审核' => '',\n  '提交时间' => '',\n  '修改保存' => '',\n  '留言列表' => '',\n  '请输入相关内容ID' => '',\n  '内容ID' => '',\n  '模型管理' => '',\n  '新增模型' => '',\n  '模型名称' => '',\n  '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名' => '',\n  '是否必选栏目' => '',\n  '新增修改内容时必选' => '',\n  '是否显示栏目' => '',\n  '列表展示、录入内容、修改内容三个页面是否展示栏目' => '',\n  '是否受权限控制' => '',\n  '不同角色可以通过控制栏目权限来限制查看内容' => '',\n  '栏目绑定显示' => '',\n  '栏目绑定时是否显示该模型' => '',\n  '前台发布' => '',\n  '前台是否允许发布' => '',\n  '列表模板' => '',\n  '默认列表模板' => '',\n  '详情模板' => '',\n  '默认详情模板' => '',\n  '是否开启' => '',\n  '数值越小越靠前' => '',\n  '已有表' => '',\n  '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"' => '',\n  '是否可以预览' => '',\n  '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]' => '',\n  '修改模型' => '',\n  '模型状态' => '',\n  '模型分类' => '',\n  '允许' => '',\n  '已停用' => '',\n  '已启用' => '',\n  '重构字段' => '',\n  '确认要删除吗？删除的同时将删除对应的表！' => '',\n  '订单列表' => '',\n  '订单详情' => '',\n  '姓名' => '',\n  '是否支付' => '',\n  '已支付' => '',\n  '未支付' => '',\n  '支付时间' => '',\n  '存储内容' => '',\n  '订单内容' => '',\n  '商品' => '',\n  '商品已删除' => '',\n  '收货信息：' => '',\n  '收件人：' => '',\n  '联系手机：' => '',\n  '联系邮箱：' => '',\n  '收货地址：' => '',\n  '订单状态' => '',\n  '订单已删除' => '',\n  '已提交未支付' => '',\n  '超时订单' => '',\n  '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '',\n  '发货时间' => '',\n  '确定修改' => '',\n  '订单管理' => '',\n  '选择状态' => '',\n  '支付方式' => '',\n  '线下支付' => '',\n  '钱包支付' => '',\n  '积分兑换' => '',\n  '支付宝支付' => '',\n  '微信支付' => '',\n  '微信H5支付' => '',\n  '微信扫码支付' => '',\n  '支付宝H5支付' => '',\n  '总收入' => '',\n  '付款方式' => '',\n  '是否付款' => '',\n  '付款时间' => '',\n  '图库管理' => '',\n  '筛选上传入口' => '',\n  '前台' => '',\n  '筛选模块' => '',\n  '其他杂项' => '',\n  '系统配置' => '',\n  '筛选栏目' => '',\n  '上传前台' => '',\n  '所属模块' => '',\n  '本地文件' => '',\n  '文件大小' => '',\n  '其他' => '',\n  '插件管理' => '',\n  '插件列表' => '',\n  '全部' => '',\n  '本地' => '',\n  '请输入插件名字' => '',\n  '插件名' => '',\n  '版本' => '',\n  '作者' => '',\n  '平台' => '',\n  '插件文件' => '',\n  '开关' => '',\n  '安装说明' => '',\n  '点击查看' => '',\n  '更新说明' => '',\n  '新' => '',\n  '官方' => '',\n  '第三方' => '',\n  '开|停' => '',\n  '配置' => '',\n  '导出' => '',\n  '卸载' => '',\n  '安装' => '',\n  '下载' => '',\n  '获取文件大小失败，请检查网络！' => '',\n  '正在安装中，请稍等~' => '',\n  '正在删除中，请稍等~' => '',\n  '正在卸载中，请稍等~' => '',\n  '设置接口' => '',\n  '当前版本：' => '',\n  '最新版本：' => '',\n  '作者：' => '',\n  '更新时间：' => '',\n  '更新内容' => '',\n  '正在下载文件' => '',\n  '升级插件' => '',\n  '文件下载完成！正在解压~' => '',\n  '文件解压完成！正在进行安装~' => '',\n  '插件升级成功！' => '',\n  '插件已升级完毕！' => '',\n  '功能' => '',\n  '函数名' => '',\n  '对应的控制器/函数，如果是顶级，则只需要写控制器名' => '',\n  '权限列表' => '',\n  '添加权限' => '',\n  '控制器/方法' => '',\n  '添加子功能' => '',\n  '权限管理' => '',\n  '栏目选择' => '',\n  '权限选择' => '',\n  '不能选择的权限是非独立功能' => '',\n  '请先勾选菜单!' => '',\n  '扩展信息' => '',\n  '回收站' => '',\n  '还原' => '',\n  '批量恢复' => '',\n  '确认要删除吗？删除后就彻底无法恢复了！' => '',\n  '确认要删除吗？删除后不可恢复！' => '',\n  '确认要还原吗？' => '',\n  '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。' => '',\n  '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '',\n  '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '',\n  '数据类型' => '',\n  '录入类型' => '',\n  '归属' => '',\n  '插件' => '',\n  '独立功能' => '',\n  '桌面管理配置时，将调用独立功能' => '',\n  '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录' => '',\n  '如果不生成静态文件，请改为' => '',\n  '手机端未开启，sitemap不会包含手机端URL' => '',\n  'PC端网站地图：' => '',\n  '手机端网站地图：' => '',\n  '网站地图' => '',\n  '模块名称' => '',\n  '更新频率' => '',\n  '站内权重' => '',\n  '输出范围' => '',\n  '栏目模块' => '',\n  '显示的栏目' => '',\n  '所有的栏目' => '',\n  '文章模块' => '',\n  '显示的文章' => '',\n  '所有的文章' => '',\n  '商品模块' => '',\n  '显示的商品' => '',\n  '所有的商品' => '',\n  '显示的' => '',\n  '所有的' => '',\n  '立即生成' => '',\n  '网站设置' => '',\n  '自定义配置' => '',\n  '点击复制' => '',\n  '上传文件' => '',\n  '不选' => '',\n  '删除配置栏' => '',\n  '选择类型' => '',\n  '编辑器' => '',\n  '文件上传' => '',\n  '下拉选项' => '',\n  '栏目选项' => '',\n  '代码' => '',\n  '请填写配置名(中文)' => '',\n  '配置标识(字母或数字)' => '',\n  '配置栏目' => '',\n  '提示信息' => '',\n  '自定义配置可以配置对应配置栏下的自定义内容' => '',\n  '下拉选项配置，如：开启=1,关闭=0' => '',\n  '自定义配置栏' => '',\n  '请填写配置栏名(中文)' => '',\n  '配置标识(必须是字母)' => '',\n  '配置标识用于权限控制，必填且不能与原系统配置栏重复' => '',\n  '失败！' => '',\n  '模板管理' => '',\n  '模板列表' => '',\n  '请输入模板名字' => '',\n  '有更新' => '',\n  '已使用' => '',\n  '备份数据' => '',\n  '安装模板' => '',\n  '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？' => '',\n  '提示' => '',\n  '安装提示' => '',\n  '该模板用于：' => '',\n  'PC端' => '',\n  '手机端' => '',\n  '微信端' => '',\n  '升级模板' => '',\n  '模板升级成功！' => '',\n  '模板已升级完毕！' => '',\n  '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！' => '',\n  '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '',\n  '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！' => '',\n  '指定栏目' => '',\n  '所有栏目' => '',\n  '生成电脑静态' => '',\n  '生成手机静态' => '',\n  '清理电脑静态HTML' => '',\n  '清理手机静态HTML' => '',\n  '批量生成电脑静态' => '',\n  '批量生成手机静态' => '',\n  '批量清理电脑静态' => '',\n  '批量清理手机静态' => '',\n  '正在处理~' => '',\n  '正在准备生成静态，请不要关闭页面~' => '',\n  '正在准备清理电脑端静态HTML，请不要关闭页面~' => '',\n  '正在准备清理手机端静态HTML，请不要关闭页面~' => '',\n  '欢迎管理员：' => '',\n  '当前时间' => '',\n  '站内用户' => '',\n  '人' => '',\n  '站内文章' => '',\n  '篇' => '',\n  '站内产品' => '',\n  '件' => '',\n  '站内留言' => '',\n  '最近更新' => '',\n  '全部文章' => '',\n  '阅读量' => '',\n  '最新评论' => '',\n  '在' => '',\n  '发布了评论' => '',\n  '版本信息' => '',\n  '当前版本' => '',\n  '项目地址' => '',\n  '服务器' => '',\n  '操作系统' => '',\n  '运行环境' => '',\n  'PHP版本' => '',\n  '运行方式' => '',\n  '上传限制' => '',\n  '用户留言' => '',\n  '回复' => '',\n  '星期天' => '',\n  '星期一' => '',\n  '星期二' => '',\n  '星期三' => '',\n  '星期四' => '',\n  '星期五' => '',\n  '星期六' => '',\n  '评论模块未开启！' => '',\n  '您的操作过于频繁，请十分钟后再试~' => '',\n  '评论内容不能为空！' => '',\n  '请提交栏目ID' => '',\n  '栏目ID不能为空！' => '',\n  '评论奖励' => '',\n  '评价成功！' => '',\n  '您未登录，请重新登录~' => '',\n  '您没有' => '',\n  '的权限！' => '',\n  '您还未登录，请重新登录！' => '',\n  '上传成功！' => '',\n  '已关闭前台上传文件功能' => '',\n  '上传错误！' => '',\n  '对不起，您没有访问权限！' => '',\n  '输入url错误！' => '',\n  '缺少ID！' => '',\n  '未找到相应内容！' => '',\n  '请输入关键词搜索！' => '',\n  '搜索超出设定范围！' => '',\n  '您的搜索超出设定范围！' => '',\n  '系统创建' => '',\n  '目录失败!' => '',\n  '支付成功，但是系统内没有找到相应的订单！' => '',\n  '支付失败' => '',\n  '订单号错误！' => '',\n  '会员中心已关闭！' => '',\n  '您的账户已被冻结！' => '',\n  '未找到您所在分组，请联系管理员处理！' => '',\n  '您所在的分组被限制登录！' => '',\n  '登录奖励' => '',\n  '系统已关闭会员注册！' => '',\n  '您的邀请链接不合法！' => '',\n  '手机号格式不正确！' => '',\n  '您的邮箱已注册！' => '',\n  '您的手机号码已注册！' => '',\n  '邀请奖励' => '',\n  '注册成功，等待审核！' => '',\n  '注册成功！' => '',\n  '注册失败，请重试~' => '',\n  '必须通过邀请链接进行注册！' => '',\n  '请输入账号和邮箱！' => '',\n  '图形验证码错误！' => '',\n  '找回密码' => '',\n  '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击' => '',\n  '立即找回密码' => '',\n  '过期失效！' => '',\n  '您操作过于频繁，请10分钟后再尝试！' => '',\n  '找回密码邮件已发送，请到您的邮箱查看！' => '',\n  '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！' => '',\n  '输入的信息有误！' => '',\n  'token已失效！' => '',\n  '密码重置成功,请重新登录！' => '',\n  '新密码不能与旧密码相同！' => '',\n  '标题不能为空！' => '',\n  '称呼不能为空！' => '',\n  '您的手机号格式不正确！' => '',\n  '不能为空！' => '',\n  '提交成功！我们会尽快回复您！' => '',\n  '提交失败，请重试！' => '',\n  '链接错误' => '',\n  '留言未找到或者未审核' => '',\n  '匿名' => '',\n  '缺少id参数！' => '',\n  '缺少tid参数！' => '',\n  '未找到商品或者已下架！' => '',\n  '该模块缺少price价格参数！' => '',\n  '您的订单提交成功通知' => '',\n  '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！' => '',\n  '订单详细信息如下' => '',\n  '折扣' => '',\n  '运费' => '',\n  '合计' => '',\n  '收件地址' => '',\n  '您的订单' => '',\n  '已经提交，我们会尽快给您发货！' => '',\n  '订单已支付！' => '',\n  '已经提交，请尽快支付！' => '',\n  '支付订单' => '',\n  '电脑支付宝支付' => '',\n  '微信内支付' => '',\n  '未开启钱包支付！' => '',\n  '您未登录，无法支付！' => '',\n  '钱包金额不足，请充值！' => '',\n  '未开启积分支付！' => '',\n  '积分不足，请充值！' => '',\n  '支付宝当面付' => '',\n  '其他平台支付' => '',\n  '在线充值' => '',\n  '交易创建，等待买家付款' => '',\n  '未付款交易超时关闭，或支付完成后全额退款' => '',\n  '支付成功' => '',\n  '交易结束，不可退款' => '',\n  '未知状态' => '',\n  '订单号错误或订单被删除！' => '',\n  '订单未支付或订单号错误！' => '',\n  '创建订单失败！' => '',\n  '订单号不存在或已被删除！' => '',\n  '收件人、手机号和收货地址不能为空！' => '',\n  '未开启在线支付！' => '',\n  '获取openid失败' => '',\n  '非法参数！' => '',\n  '标签未找到或已删除！' => '',\n  '手机号码格式错误！' => '',\n  '账户不能为空！' => '',\n  '订单已过期，不可支付！' => '',\n  '订单已支付，请勿重复操作！' => '',\n  '缺少订单号！' => '',\n  '网络错误，请刷新后重试！' => '',\n  '未找到评论！' => '',\n  '已取消点赞！' => '',\n  '点赞成功！' => '',\n  '栏目未绑定模型，无法喜欢！' => '',\n  '取消点赞' => '',\n  '点赞奖励' => '',\n  '已被删除 ' => '',\n  '栏目未绑定模型，无法收藏！' => '',\n  '取消收藏' => '',\n  '收藏奖励' => '',\n  '收藏成功！' => '',\n  '已被删除' => '',\n  '库存不足！' => '',\n  '该模块不允许发布！' => '',\n  '添加失败，存在敏感词' => '',\n  '分类错误！' => '',\n  '该分类不允许发布！' => '',\n  '您没有权限在该分类发布内容！' => '',\n  '内容不能为空！' => '',\n  '库存不能为0！' => '',\n  '未修改内容，不能提交！' => '',\n  '发布失败，请重试！' => '',\n  '发布成功！' => '',\n  '未找到您要的文章！' => '',\n  '您已经关注了该用户！' => '',\n  '您不能关注自己！' => '',\n  '关注奖励' => '',\n  '关注成功！' => '',\n  '您没有关注该用户，无法操作！' => '',\n  '取关成功！' => '',\n  '消息已被删除！' => '',\n  '用户未找到！' => '',\n  '未分类 ' => '',\n  '设置成功' => '',\n  '设置成功！' => '',\n  '记录不存在！' => '',\n  '缺少栏目ID！' => '',\n  '系统未配置微信登录！' => '',\n  '微信已绑定！' => '',\n  '您的微信已被绑定，不能再绑定！' => '',\n  '系统版号' => '',\n  '版本号是系统自带，请勿改动' => '',\n  '网站SEO名称' => '',\n  '控制在25个字、50个字节以内' => '',\n  '网站SEO关键词' => '',\n  '5个左右，8汉字以内，用英文逗号隔开' => '',\n  '网站SEO描述' => '',\n  '控制在80个汉字，160个字符以内' => '',\n  '统计代码' => '',\n  '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '',\n  '底部版权' => '',\n  '如：&copy; 2016 xxx版权' => '',\n  '备案号' => '',\n  '如：京ICP备00000000号' => '',\n  '网站电话' => '',\n  '网站联系电话' => '',\n  '400电话' => '',\n  '网站QQ' => '',\n  '网站邮箱' => '',\n  '公司地址' => '',\n  'PC网站模板' => '',\n  '将模板名称填写到此处' => '',\n  'WAP网站模板' => '',\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板' => '',\n  '微信网站模板' => '',\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板' => '',\n  '是否开启手机端' => '',\n  '如果不开启手机端，则默认调用电脑端模板' => '',\n  '是否开启前台上传' => '',\n  '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。' => '',\n  '是否开启前台权限' => '',\n  '开启后前台用户权限可以在后台控制' => '',\n  '缓存时间' => '',\n  '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。' => '',\n  '限制上传文件大小' => '',\n  '0代表不限，单位kb' => '',\n  '允许上传文件类型' => '',\n  '请用|分割，如：pdf|jpg|png' => '',\n  '前台UEditor编辑器导航条配置' => '',\n  '允许前台搜索的表' => '',\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product' => '',\n  '上传图片压缩比例' => '',\n  '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80' => '',\n  'PNG是否压缩' => '',\n  'PNG压缩后容易变成背景黑色，关闭后，不会压缩。' => '',\n  '邮件服务器' => '',\n  'smtp.163.com,smtp.qq.com' => '',\n  '邮件收发端口' => '',\n  '163、126邮件端口(465)，QQ邮件端口(587)' => '',\n  '收件人Email地址' => '',\n  '发件人Email地址' => '',\n  '指邮件服务器发件邮箱' => '',\n  '发件人Email秘钥' => '',\n  '这个秘钥不是登录密码' => '',\n  '发件人昵称' => '',\n  '发件邮箱会带一个昵称' => '',\n  '客户订单通知' => '',\n  '购买商品的时候会发送的一条邮件信息' => '',\n  '订单出货通知' => '',\n  '发货的时候发送给客户的通知' => '',\n  '订单运费' => '',\n  '购物下单时会加上这个运费' => '',\n  '在线支付' => '',\n  '0关闭支付，1自主平台支付' => '',\n  '极致平台接口' => '',\n  '极致平台商户' => '',\n  '极致平台应用appid' => '',\n  '极致平台应用秘钥' => '',\n  '支付宝APPID' => '',\n  '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID' => '',\n  '支付宝key' => '',\n  'MD5密钥，安全检验码，由数字和字母组成的32位字符串' => '',\n  '支付宝私钥' => '',\n  '支付宝公钥' => '',\n  '微信商户mchid' => '',\n  '支付相关' => '',\n  '微信商户key' => '',\n  '微信公众号appid' => '',\n  '微信公众号appsecret' => '',\n  '微信apiclient_cert' => '',\n  '微信apiclient_key' => '',\n  '公众号appid' => '',\n  '用户登录相关，如果跟支付的一样，那就再填写一遍' => '',\n  '公众号appsecret' => '',\n  '公众号token' => '',\n  '公众号关注欢迎语' => '',\n  '公众号关注时发送的第一句推送' => '',\n  '网站LOGO' => '',\n  '后台模板风格' => '',\n  '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。' => '',\n  '是否绑定多域名' => '',\n  '开启绑定多域名后，需要到插件中配置' => '',\n  '网站SEO网址' => '',\n  '一般不填，全局网址，最后不带/,如：http://www.xxx.com' => '',\n  '基本信息下扩展' => '',\n  '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下' => '',\n  '订单超时' => '',\n  '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制' => '',\n  '开启层级URL' => '',\n  '默认关闭层级URL，开启后URL会按照父类层级展现' => '',\n  '缓存完整页面' => '',\n  '前台完整页面缓存，结合缓存时间，可以提高访问速度' => '',\n  '自动生成静态HTML' => '',\n  '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面' => '',\n  'PC静态文件目录' => '',\n  '电脑端静态HTML存放目录，默认根目录[ / ]' => '',\n  'WAP静态文件目录' => '',\n  '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱' => '',\n  '是否留言自动审核' => '',\n  '开启后，留言自动审核（显示）' => '',\n  '是否评论自动审核' => '',\n  '开启后评论自动审核（显示）' => '',\n  '网站敏感词过滤' => '',\n  '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容' => '',\n  '是否开启水印' => '',\n  '开启水印需要上传水印图片' => '',\n  '水印图片' => '',\n  '水印图片在250px以内' => '',\n  '水印位置' => '',\n  '参考键盘九宫格1-9' => '',\n  '水印透明度' => '',\n  '透明度越大，越难看清楚水印' => '',\n  '钱包兑换率' => '',\n  '站内钱包与RMB的兑换率，即1元=多少金币' => '',\n  '积分兑换率' => '',\n  '站内积分与RMB的兑换率，即1元=多少积分' => '',\n  '积分支付' => '',\n  '开启积分支付后，商品可以用积分支付' => '',\n  '开启钱包支付后，商品可以用钱包支付' => '',\n  '开启微信支付后，商品可以用微信支付' => '',\n  '开启支付宝支付后，商品可以用支付宝支付' => '',\n  '每次登录奖励' => '',\n  '每天登录奖励积分数，最小为0，每天登录只奖励一次' => '',\n  '开启登录奖励后，登录后就会获得积分奖励' => '',\n  '开启后，发布内容会奖励积分' => '',\n  '每次发布奖励' => '',\n  '每次发布内容奖励积分数' => '',\n  '每天发布最高奖励' => '',\n  '每天奖励不超过积分上限，设置0则无上限' => '',\n  '开启后，发布内容被收藏会奖励积分' => '',\n  '每次收藏奖励' => '',\n  '每次发布内容被收藏奖励积分数' => '',\n  '每天收藏最高奖励' => '',\n  '开启后，发布内容被点赞会奖励积分' => '',\n  '每次点赞奖励' => '',\n  '每次发布内容被点赞奖励积分数' => '',\n  '每天点赞最高奖励' => '',\n  '开启后，发布内容被评论会奖励积分' => '',\n  '每次评论奖励' => '',\n  '每次发布内容被评论奖励积分数' => '',\n  '每天评论最高奖励' => '',\n  '开启后，用户被粉丝关注会奖励积分' => '',\n  '每次关注奖励' => '',\n  '每次被关注奖励积分数' => '',\n  '每天关注最高奖励' => '',\n  '每天关注奖励不超过积分上限，设置0则无上限' => '',\n  '发送邮件' => '',\n  '是否开启邮件发送' => '',\n  '关闭网站' => '',\n  '关闭网站后，前台无法访问，后台可以进入' => '',\n  '关站提示' => '',\n  '后台文件存储路径' => '',\n  '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]' => '',\n  '前台文件存储路径' => '',\n  '是否开启前台AJAX' => '',\n  '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据' => '',\n  '自动生成sitemap' => '',\n  '开启后，前台访问每天会自动生成1次sitemap' => '',\n  '是否开启邀请奖励' => '',\n  '开启邀请后则会奖励' => '',\n  '邀请奖励类型' => '',\n  '邀请奖励数量' => '',\n  '网站手机' => '',\n  '站长微信' => '',\n  '开启多图描述' => '',\n  '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)' => '',\n  '前台用户注册' => '',\n  '关闭前台注册后，前台无法进入注册页面' => '',\n  '仅邀请码注册' => '',\n  '开启后，必须通过邀请链接才能注册！' => '',\n  '允许前台发布模块' => '',\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '',\n  '前台搜索的字段' => '',\n  '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '',\n  '前台验证码' => '',\n  '关闭后，登录注册不需要验证码' => '',\n  '后台验证码' => '',\n  '关闭后，后台管理员登录不需要验证码' => '',\n  'TAG包含模型' => '',\n  '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product' => '',\n  '支付配置' => '',\n  '前台多模块搜索的字段' => '',\n  '多个模块直接必须都有相同的字段，否则会报错' => '',\n  '多模块允许搜索的表' => '',\n  '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product' => '',\n  '允许查询显示的字段' => '',\n  '多模块搜索允许查询显示的字段' => '',\n  '前台编辑器设置' => '',\n  '前台的编辑器功能菜单设置' => '',\n  'PHP调试' => '',\n  '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。' => '',\n  '前台SESSION' => '',\n  '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭' => '',\n  '留言验证码' => '',\n  '开启后，前台留言需要填写验证码' => '',\n  '前台发布审核' => '',\n  '开启后需要后台审核，关闭则不需要' => '',\n  '公共权限' => '',\n  '前台网站' => '',\n  '会员登录' => '',\n  '会员评论' => '',\n  '网站筛选' => '',\n  '会员下单' => '',\n  '网站支付' => '',\n  '极致支付' => '',\n  '微信模块' => '',\n  '验证码生成' => '',\n  '检查是否登录' => '',\n  '多附件上传' => '',\n  '单附件上传' => '',\n  '二维码生成' => '',\n  '获取扩展信息' => '',\n  '链接错误提示' => '',\n  '报错提示' => '',\n  '网站内容' => '',\n  '详情内容' => '',\n  '网站搜索' => '',\n  '网站多模块搜索' => '',\n  '开启网站缓存' => '',\n  '输出缓存' => '',\n  '个人中心首页' => '',\n  '会员资料' => '',\n  '订单记录' => '',\n  '订单支付' => '',\n  '删除订单' => '',\n  '上传头像' => '',\n  '删除评论' => '',\n  '点赞文章' => '',\n  '点赞列表' => '',\n  '收藏文章' => '',\n  '收藏列表' => '',\n  '删除收藏' => '',\n  '购物车' => '',\n  '添加购物车' => '',\n  '删除购物车' => '',\n  '发布管理' => '',\n  '会员发布' => '',\n  '删除发布' => '',\n  '会员上传附件' => '',\n  '404提示' => '',\n  '关注用户' => '',\n  '取消关注' => '',\n  '粉丝列表' => '',\n  '消息提醒' => '',\n  '查看消息' => '',\n  '删除消息' => '',\n  '公共主页' => '',\n  '消息提醒设置' => '',\n  '获取栏目列表' => '',\n  '用户钱包' => '',\n  '交易详情' => '',\n  '登录首页' => '',\n  '注册页面' => '',\n  '忘记密码' => '',\n  '未登录页面' => '',\n  '退出登录' => '',\n  '发送留言' => '',\n  '发表评论' => '',\n  '筛选列表' => '',\n  '创建订单' => '',\n  'TAG标签列表' => '',\n  '会员' => '',\n  '订单' => '',\n  '评论' => '',\n  '留言' => '',\n  '轮播图' => '',\n  '友情链接' => '',\n  'TAG' => '',\n  '单页' => '',\n  '用户评价' => '',\n  '添加会员' => '',\n  '修改会员' => '',\n  '删除会员' => '',\n  '修改状态' => '',\n  '内容管理' => '',\n  '内容列表' => '',\n  '添加内容' => '',\n  '修改内容' => '',\n  '删除内容' => '',\n  '复制内容' => '',\n  '修改评论' => '',\n  '修改留言' => '',\n  '删除留言' => '',\n  '字段列表' => '',\n  '删除字段' => '',\n  '获取字段' => '',\n  '基本功能' => '',\n  '系统界面' => '',\n  '数据库备份' => '',\n  '数据库还原' => '',\n  '数据库删除' => '',\n  '系统功能' => '',\n  '栏目管理' => '',\n  '栏目列表' => '',\n  '新增栏目' => '',\n  '修改栏目' => '',\n  '删除栏目' => '',\n  '修改排序' => '',\n  '栏目隐藏' => '',\n  '新增角色' => '',\n  '修改角色' => '',\n  '删除角色' => '',\n  '角色状态' => '',\n  '新增管理员' => '',\n  '修改管理员' => '',\n  '管理员状态' => '',\n  '删除管理员' => '',\n  '模型列表' => '',\n  '删除模型' => '',\n  '新增权限' => '',\n  '修改权限' => '',\n  '删除权限' => '',\n  '桌面设置' => '',\n  '新增桌面' => '',\n  '修改桌面' => '',\n  '删除桌面' => '',\n  '图标库' => '',\n  '模块扩展' => '',\n  '删除轮播图' => '',\n  '复制轮播图' => '',\n  '批量删除轮播图' => '',\n  '新增轮播图分类' => '',\n  '修改轮播图分类' => '',\n  '删除轮播图分类' => '',\n  '新增友链' => '',\n  '修改友链' => '',\n  '复制友链' => '',\n  '删除友链' => '',\n  '批量删除友链' => '',\n  '通用模块' => '',\n  '更新cookie' => '',\n  '商品管理' => '',\n  '商品列表' => '',\n  '修改商品' => '',\n  '删除商品' => '',\n  '复制商品' => '',\n  '登录日志' => '',\n  '新增分组' => '',\n  '修改分组' => '',\n  '更改分组状态' => '',\n  '删除分组' => '',\n  '会员权限' => '',\n  '修改分组排序' => '',\n  '上传支付证书' => '',\n  '更改状态' => '',\n  '安装卸载' => '',\n  '删除图库图片' => '',\n  '批量删除图库' => '',\n  '微信公众号' => '',\n  '公众号菜单' => '',\n  '公众号素材' => '',\n  '模板制作' => '',\n  '获取首字母拼音' => '',\n  '批量新增栏目' => '',\n  '自定义配置删除' => '',\n  'TAG列表' => '',\n  '新增TAG' => '',\n  '修改TAG' => '',\n  '复制TAG' => '',\n  '删除TAG' => '',\n  '批量删除TAG' => '',\n  '生成静态文件' => '',\n  '更新栏目HTML' => '',\n  '更新模块HTML' => '',\n  '批量修改推荐属性' => '',\n  '批量修改友链栏目' => '',\n  '批量修改TAG栏目' => '',\n  '批量复制友链' => '',\n  '批量复制TAG' => '',\n  '批量修改友链排序' => '',\n  '批量修改TAG排序' => '',\n  '高级设置' => '',\n  '邮箱订单' => '',\n  '公众号配置' => '',\n  '批量审核友链' => '',\n  '批量审核TAG' => '',\n  '手动充值' => '',\n  '删除记录' => '',\n  '批量删除记录' => '',\n  '积分配置' => '',\n  '插件更新' => '',\n  '获取栏目模板' => '',\n  '友链分类' => '',\n  '新增友链分类' => '',\n  '修改友链分类' => '',\n  '删除友链分类' => '',\n  '导航设置' => '',\n  '删除导航' => '',\n  '碎片化' => '',\n  '删除碎片' => '',\n  '预览SQL' => '',\n  '搜索配置' => '',\n  '修改字段属性' => '',\n  '新增推荐属性' => '',\n  '删除推荐属性' => '',\n  '列表设置' => '',\n  '获取列表字段' => '',\n  '内链模块' => '',\n  '内链列表' => '',\n  '新增内链' => '',\n  '删除内链' => '',\n  '删除数据' => '',\n  '模板更新' => '',\n  '用户评价列表' => '',\n  '新增用户评价' => '',\n  '修改用户评价' => '',\n  '复制用户评价' => '',\n  '删除用户评价' => '',\n  '批量删除用户评价' => '',\n  '批量修改用户评价栏目' => '',\n  '批量复制用户评价' => '',\n  '批量修改用户评价列表' => '',\n  '批量审核用户评价' => '',\n  '基本设置' => '',\n  '邮件订单' => '',\n  '非超级管理员无法设置！' => '',\n  '你确定要还原吗？' => '',\n); ?>"
  },
  {
    "path": "app/admin/lang/cht.php",
    "content": "<?php return array (\n  '该角色下存在用户，请先移除用户再删除！' => '該角色下存在用戶，請先移除用戶再刪除！',\n  '删除失败，该分组不允许删除！' => '刪除失敗，該分組不允許刪除！',\n  '删除成功！' => '刪除成功！',\n  '删除失败，请重试！' => '刪除失敗，請重試！',\n  '非法操作！' => '非法操作！',\n  '修改失败，您的权限不足！' => '修改失敗，您的權限不足！',\n  '修改成功！' => '修改成功！',\n  '修改失败，请重新提交！' => '修改失敗，請重新提交！',\n  '没有该角色！' => '沒有該角色！',\n  '新增成功！' => '新增成功！',\n  '新增失败，请重新提交！' => '新增失敗，請重新提交！',\n  '修改失败，该分组不允许修改！' => '修改失敗，該分組不允許修改！',\n  '您没有权限操作！' => '您沒有權限操作！',\n  '两次密码不同！' => '兩次密碼不同！',\n  '手机号已被注册！' => '手機號已被註冊！',\n  '昵称已被使用！' => '暱稱已被使用！',\n  '邮箱已被使用！' => '郵箱已被使用！',\n  '修改失败！' => '修改失敗！',\n  '新增失败！' => '新增失敗！',\n  '系统管理员不能删除！' => '系統管理員不能刪除！',\n  '删除失败！' => '刪除失敗！',\n  '批量操作失败！' => '批量操作失敗！',\n  '批量删除成功！' => '批量刪除成功！',\n  '添加失败' => '添加失敗',\n  '存在敏感词' => '存在敏感詞',\n  '已存在相同的自定义URL！' => '已存在相同的自定義URL！',\n  '添加成功,继续添加~' => '添加成功,繼續添加~',\n  '内容配置' => '內容配置',\n  '修改失败' => '修改失敗',\n  '发布奖励' => '發布獎勵',\n  '您未做任何修改，不能提交！' => '您未做任何修改，不能提交！',\n  '复制成功！' => '複製成功！',\n  '复制失败！' => '複製失敗！',\n  '批量复制成功！' => '批量複製成功！',\n  '批量修改成功！' => '批量修改成功！',\n  '批量操作成功！' => '批量操作成功！',\n  'URL链接命名不能是' => 'URL連結命名不能是',\n  '非法URL' => '非法URL',\n  '添加栏目成功，继续添加~' => '添加欄目成功，繼續添加~',\n  '模型错误！' => '模型錯誤！',\n  '不能选择当前栏目及下级为顶级栏目' => '不能選擇當前欄目及下級為頂級欄目',\n  '该栏目有子栏目，请先删除子栏目！' => '該欄目有子欄目，請先刪除子欄目！',\n  '栏目不能为空！' => '欄目不能為空！',\n  '操作成功！' => '操作成功！',\n  '请选择分类！' => '請選擇分類！',\n  '添加成功！继续添加~' => '添加成功！繼續添加~',\n  '添加失败！' => '添加失敗！',\n  '该分类下存在内容，请先删除该分类下的内容！' => '該分類下存在內容，請先刪除該分類下的內容！',\n  '添加成功！' => '添加成功！',\n  '已审核' => '已審核',\n  '被删除' => '被刪除',\n  '未审核' => '未審核',\n  '已读' => '已讀',\n  '未读' => '未讀',\n  '批量审核成功！' => '批量審核成功！',\n  '批量审核失败！' => '批量審核失敗！',\n  '您没有权限！' => '您沒有權限！',\n  '文件类型不允许上传！' => '文件類型不允許上傳！',\n  '文件大小超过网站内部限制！' => '文件大小超過網站內部限制！',\n  '请检查目录写入权限' => '請檢查目錄寫入權限',\n  '错误信息提示' => '錯誤信息提示',\n  '模块为空，请选择模块！' => '模塊為空，請選擇模塊！',\n  '缺少ID' => '缺少ID',\n  '请选择模块！' => '請選擇模塊！',\n  '显示' => '顯示',\n  '隐藏' => '隱藏',\n  '是' => '是',\n  '否' => '否',\n  '单行文本' => '單行文本',\n  '多行文本' => '多行文本',\n  '文本编辑器' => '文本編輯器',\n  '数字' => '數字',\n  '单图片' => '單圖片',\n  '多图片' => '多圖片',\n  '单选下拉' => '單選下拉',\n  '多选' => '多選',\n  '单附件' => '單附件',\n  '多附件' => '多附件',\n  '时间戳' => '時間戳',\n  '单选按钮' => '單選按鈕',\n  '单选关联' => '單選關聯',\n  '小数' => '小數',\n  '多行录入' => '多行錄入',\n  '多选关联' => '多選關聯',\n  '栏目' => '欄目',\n  '副栏目' => '副欄目',\n  '系统TAG' => '系統TAG',\n  '字段名和字段标识不能为空！' => '欄位名和欄位標識不能為空！',\n  '字段标识已存在！' => '欄位標識已存在！',\n  '系统保护字段，不允许创建！' => '系統保護欄位，不允許創建！',\n  '字段长度不对！' => '欄位長度不對！',\n  '字段长度不对,时间属性必须长度为11' => '欄位長度不對,時間屬性必須長度為11',\n  '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '欄位長度不對,decimal欄位長度格式[整數位數,小數位數]',\n  '字段创建成功，但是字段表记录失败，请反馈官方解决！' => '欄位創建成功，但是欄位表記錄失敗，請反饋官方解決！',\n  '字段创建成功！' => '欄位創建成功！',\n  '字段修改成功！' => '欄位修改成功！',\n  '字段修改失败！' => '欄位修改失敗！',\n  '上传图片' => '上傳圖片',\n  '选择图片' => '選擇圖片',\n  '图片未找到' => '圖片未找到',\n  '删除这张图片' => '刪除這張圖片',\n  '删除' => '刪除',\n  '上传异常！' => '上傳異常！',\n  '文字描述' => '文字描述',\n  '左移' => '左移',\n  '右移' => '右移',\n  '请选择' => '請選擇',\n  '上传附件' => '上傳附件',\n  '字段关联绑定失败，请重新绑定！' => '欄位關聯綁定失敗，請重新綁定！',\n  '请选择关联项' => '請選擇關聯項',\n  'TAG标签' => 'TAG標籤',\n  '按Enter回车自动添加' => '按Enter回車自動添加',\n  '添加一个标签' => '添加一個標籤',\n  '系统字段不允许删除！' => '系統欄位不允許刪除！',\n  '请选择字段！' => '請選擇欄位！',\n  '请选择栏目！' => '請選擇欄目！',\n  '参数有误！' => '參數有誤！',\n  '请选择桌面配置！' => '請選擇桌面配置！',\n  '系统默认不可删除！' => '系統默認不可刪除！',\n  '网站地图创建成功！' => '網站地圖創建成功！',\n  '网站地图创建失败，请检查根目录权限！' => '網站地圖創建失敗，請檢查根目錄權限！',\n  '清除失败！' => '清除失敗！',\n  '清除成功！' => '清除成功！',\n  '生成失败！' => '生成失敗！',\n  '生成成功！' => '生成成功！',\n  '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~' => '已清理一部分頁面，請不要關閉當前頁面，還需要繼續清理HTML~',\n  '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~' => '已生成一部分頁面，請不要關閉當前頁面，還需要繼續生成HTML~',\n  '静态HTML页面已全部清理完毕！' => '靜態HTML頁面已全部清理完畢！',\n  '总共清理页面数：' => '總共清理頁面數：',\n  '每次清理页面数：' => '每次清理頁面數：',\n  '停顿时间：' => '停頓時間：',\n  '开始时间：' => '開始時間：',\n  '结束时间：' => '結束時間：',\n  '总共花费时间：' => '總共花費時間：',\n  '总共生成页面数：' => '總共生成頁面數：',\n  '每次生成页面数：' => '每次生成頁面數：',\n  '系统创建目录失败!' => '系統創建目錄失敗!',\n  '模块未绑定栏目，无法生存HTML！' => '模塊未綁定欄目，無法生存HTML！',\n  '链接错误！' => '連結錯誤！',\n  '请输入属性名称！' => '請輸入屬性名稱！',\n  '属性已存在！' => '屬性已存在！',\n  '参数错误！' => '參數錯誤！',\n  '系统属性只允许修改和隐藏，不允许删除！' => '系統屬性只允許修改和隱藏，不允許刪除！',\n  '请输入内链词！' => '請輸入內鏈詞！',\n  '请输入内链！' => '請輸入內鏈！',\n  '内链词已存在！' => '內鏈詞已存在！',\n  '已审' => '已審',\n  '退回' => '退回',\n  '未审' => '未審',\n  '账户密码不能为空！' => '帳戶密碼不能為空！',\n  '验证码错误！' => '驗證碼錯誤！',\n  '该账户已被封禁！' => '該帳戶已被封禁！',\n  '登录成功！' => '登錄成功！',\n  '账户密码错误！' => '帳戶密碼錯誤！',\n  '安全退出~' => '安全退出~',\n  '无' => '無',\n  '不显示' => '不顯示',\n  '邮箱已被注册！' => '郵箱已被註冊！',\n  '添加失败，请重新提交！' => '添加失敗，請重新提交！',\n  '没有找到该用户！' => '沒有找到該用戶！',\n  '该分组下存在用户，请先移除用户再删除！' => '該分組下存在用戶，請先移除用戶再刪除！',\n  '删除失败，该分类有下级功能，请先删除下级功能！' => '刪除失敗，該分類有下級功能，請先刪除下級功能！',\n  '未选择删除对象！' => '未選擇刪除對象！',\n  '模块名和标识不能为空！' => '模塊名和標識不能為空！',\n  '模型已添加不能重复添加！' => '模型已添加不能重複添加！',\n  '该表已存在！' => '該表已存在！',\n  '标题' => '標題',\n  '默认为空' => '默認為空',\n  '所属栏目' => '所屬欄目',\n  '选择栏目' => '選擇欄目',\n  '绑定后可以在当前模型的其他栏目中显示' => '綁定後可以在當前模型的其他欄目中顯示',\n  '关键词' => '關鍵詞',\n  '每个词用英文逗号(,)拼接' => '每個詞用英文逗號(,)拼接',\n  '缩略图' => '縮略圖',\n  '可留空' => '可留空',\n  '简介' => '簡介',\n  '内容' => '內容',\n  '发布会员' => '發布會員',\n  '前台发布会员ID记录' => '前台發布會員ID記錄',\n  '管理员' => '管理員',\n  '后台发布管理员ID记录' => '後台發布管理員ID記錄',\n  '外链URL' => '外鏈URL',\n  '默认为空，系统访问内容则直接跳转到此链接' => '默認為空，系統訪問內容則直接跳轉到此連結',\n  '自定义URL' => '自定義URL',\n  '默认为空，自定义URL' => '默認為空，自定義URL',\n  '点击量' => '點擊量',\n  '系统自动添加' => '系統自動添加',\n  '评论数' => '評論數',\n  '系统自带' => '系統自帶',\n  '点赞数' => '點讚數',\n  '排序' => '排序',\n  '添加时间' => '添加時間',\n  '选择时间' => '選擇時間',\n  '推荐属性' => '推薦屬性',\n  '1置顶2热点3推荐' => '1置頂2熱點3推薦',\n  '置顶=1,热点=2,推荐=3' => '置頂=1,熱點=2,推薦=3',\n  '是否显示' => '是否顯示',\n  '显示隐藏' => '顯示隱藏',\n  '显示=1,未审=0,退回=2' => '顯示=1,未審=0,退回=2',\n  '列表' => '列表',\n  '新增' => '新增',\n  '修改' => '修改',\n  '复制' => '複製',\n  '批量删除' => '批量刪除',\n  '批量修改' => '批量修改',\n  '批量复制' => '批量複製',\n  '批量审核' => '批量審核',\n  '管理' => '管理',\n  '新增模型成功，快去创建对应的栏目吧！' => '新增模型成功，快去創建對應的欄目吧！',\n  '新增模型成功，快去设置表字段吧！' => '新增模型成功，快去設置表欄位吧！',\n  '新增模型失败！' => '新增模型失敗！',\n  '标识不能为空！' => '標識不能為空！',\n  '系统模型标识不允许修改！' => '系統模型標識不允許修改！',\n  '页面有错误，缺少模块ID！' => '頁面有錯誤，缺少模塊ID！',\n  '里面存在数据，请先清空表内数据！' => '裡面存在數據，請先清空表內數據！',\n  '是系统模型，不允许删除！' => '是系統模型，不允許刪除！',\n  '字段表记录未清除，请手动清除！' => '欄位表記錄未清除，請手動清除！',\n  '模型' => '模型',\n  '用户' => '用戶',\n  '栏目链接' => '欄目連結',\n  '外链' => '外鏈',\n  '自定义链接' => '自定義連結',\n  '发布时间' => '發布時間',\n  '字段名称不能为空！' => '欄位名稱不能為空！',\n  '显示=1,隐藏=0' => '顯示=1,隱藏=0',\n  '显示=1,隐藏=0,退回=2' => '顯示=1,隱藏=0,退回=2',\n  '是=1,否=0' => '是=1,否=0',\n  '重构成功！' => '重構成功！',\n  '系统栏目' => '系統欄目',\n  '系统副栏目' => '系統副欄目',\n  '模型标识' => '模型標識',\n  '发布管理员' => '發布管理員',\n  '前台用户' => '前台用戶',\n  '待付款' => '待付款',\n  '已付' => '已付',\n  '超时' => '超時',\n  '待审核待支付' => '待審核待支付',\n  '已发货' => '已發貨',\n  '已废弃' => '已廢棄',\n  '未付' => '未付',\n  '您的订单发货通知' => '您的訂單發貨通知',\n  '尊敬的' => '尊敬的',\n  '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！' => '您的訂單已發貨了，這幾天請您留意一下快遞，謝謝您的惠顧！期待再次為您服務！',\n  '订单详细信息如下：' => '訂單詳細信息如下：',\n  '主图' => '主圖',\n  '价格' => '價格',\n  '购买数量' => '購買數量',\n  '总价' => '總價',\n  '折扣：' => '折扣：',\n  '元' => '元',\n  '运费：' => '運費：',\n  '￥' => '￥',\n  '合计：' => '合計：',\n  '收件地址：' => '收件地址：',\n  '联系电话：' => '聯繫電話：',\n  '钱包' => '錢包',\n  '积分' => '積分',\n  '充值' => '充值',\n  '兑换' => '兌換',\n  '奖励' => '獎勵',\n  '该用户不存在！' => '該用戶不存在！',\n  '充值数量不对！' => '充值數量不對！',\n  '操作失败！' => '操作失敗！',\n  '插件配置' => '插件配置',\n  '未分类' => '未分類',\n  '商品配置' => '商品配置',\n  '批量复制失败！' => '批量複製失敗！',\n  '部分未执行成功！' => '部分未執行成功！',\n  '还原失败，可能是ID已经存在！' => '還原失敗，可能是ID已經存在！',\n  '数据不存在！' => '數據不存在！',\n  '删除失败，系统功能不能删除！' => '刪除失敗，系統功能不能刪除！',\n  '配置栏下有自定义配置，无法删除配置栏' => '配置欄下有自定義配置，無法刪除配置欄',\n  '已存在配置标识，请重新设置！' => '已存在配置標識，請重新設置！',\n  '提交成功！' => '提交成功！',\n  '删除失败！系统字段不允许删除！' => '刪除失敗！系統欄位不允許刪除！',\n  '图片不存在，删除失败！' => '圖片不存在，刪除失敗！',\n  '远程存储图片无法删除！' => '遠程存儲圖片無法刪除！',\n  '图片ID错误！' => '圖片ID錯誤！',\n  '部分删除成功，存在远程链接无法删除！' => '部分刪除成功，存在遠程連結無法刪除！',\n  '非法操作' => '非法操作',\n  '请检查目录' => '請檢查目錄',\n  '写入权限' => '寫入權限',\n  '配置成功！' => '配置成功！',\n  '参数存在安全隐患！' => '參數存在安全隱患！',\n  '参数错误,必须携带插件ID！' => '參數錯誤,必須攜帶插件ID！',\n  '发生错误' => '發生錯誤',\n  '下载缓存文件不存在！' => '下載緩存文件不存在！',\n  '请选择使用场景！' => '請選擇使用場景！',\n  '执行插件安装程序失败！' => '執行插件安裝程序失敗！',\n  '安装成功！' => '安裝成功！',\n  '备份成功！' => '備份成功！',\n  '该插件暂无更新！' => '該插件暫無更新！',\n  '参数错误,请选择对应模板！' => '參數錯誤,請選擇對應模板！',\n  '文件不存在！' => '文件不存在！',\n  '解压失败！' => '解壓失敗！',\n  '数据库中没有表!' => '資料庫中沒有表!',\n  '写入文件失败！' => '寫入文件失敗！',\n  ' 写入文件失败！' => ' 寫入文件失敗！',\n  '解压完毕！本次解压花费' => '解壓完畢！本次解壓花費',\n  '秒' => '秒',\n  '更新成功！' => '更新成功！',\n  '个人中心' => '個人中心',\n  '测试1' => '測試1',\n  '测试2' => '測試2',\n  '测试3' => '測試3',\n  '接口报错' => '接口報錯',\n  '微信配置错误！' => '微信配置錯誤！',\n  '网站首页' => '網站首頁',\n  '首页' => '首頁',\n  '碎片化管理' => '碎片化管理',\n  '新增碎片' => '新增碎片',\n  '刷新' => '刷新',\n  '基本信息' => '基本信息',\n  '使用说明' => '使用說明',\n  '指定几个id或者几个tid的内容输出' => '指定幾個id或者幾個tid的內容輸出',\n  'SQL中输入' => 'SQL中輸入',\n  '或者' => '或者',\n  '模糊查询，查询标题跟 “网站建设” 相关的内容' => '模糊查詢，查詢標題跟 「網站建設」 相關的內容',\n  '网站建设' => '網站建設',\n  '模糊查询，查询标题/内容跟 “网站建设” 相关的内容' => '模糊查詢，查詢標題/內容跟 「網站建設」 相關的內容',\n  '不支持联表查询' => '不支持聯表查詢',\n  '注意字符串都要使用英文单引号' => '注意字符串都要使用英文單引號',\n  '如' => '如',\n  '碎片名称' => '碎片名稱',\n  '碎片标识' => '碎片標識',\n  '建议英文，不要重复' => '建議英文，不要重複',\n  '不限栏目' => '不限欄目',\n  '子栏目包含' => '子欄目包含',\n  '包含' => '包含',\n  '不包含' => '不包含',\n  '输出条数' => '輸出條數',\n  '0表示输出所有' => '0表示輸出所有',\n  '更新周期' => '更新周期',\n  '单位' => '單位',\n  '分钟' => '分鐘',\n  '保存' => '保存',\n  '返回' => '返回',\n  '确定' => '確定',\n  '导航管理' => '導航管理',\n  '新增导航' => '新增導航',\n  '导航名称' => '導航名稱',\n  '导航菜单' => '導航菜單',\n  '链接' => '連結',\n  '打开' => '打開',\n  '操作' => '操作',\n  '不填默认栏目名称' => '不填默認欄目名稱',\n  '自定义链接则需要填写' => '自定義連結則需要填寫',\n  '本页面' => '本頁面',\n  '新页面' => '新頁面',\n  '管理员管理' => '管理員管理',\n  '新增管理员信息' => '新增管理員信息',\n  '基本' => '基本',\n  '扩展' => '擴展',\n  '登录名' => '登錄名',\n  '将会成为您唯一的登入名' => '將會成為您唯一的登入名',\n  '手机' => '手機',\n  '邮箱' => '郵箱',\n  '角色' => '角色',\n  '选择角色' => '選擇角色',\n  '密码' => '密碼',\n  '6到16个字符,不改请留空' => '6到16個字符,不改請留空',\n  '确认密码' => '確認密碼',\n  '状态' => '狀態',\n  '正常' => '正常',\n  '禁用' => '禁用',\n  '增加成功' => '增加成功',\n  '修改管理员信息' => '修改管理員信息',\n  '管理员列表' => '管理員列表',\n  '搜索' => '搜索',\n  '是否封禁' => '是否封禁',\n  '封禁' => '封禁',\n  '开始日' => '開始日',\n  '截止日' => '截止日',\n  '请输入用户名' => '請輸入用戶名',\n  '编辑' => '編輯',\n  '添加管理员' => '添加管理員',\n  '正常|封禁' => '正常|封禁',\n  '所属角色' => '所屬角色',\n  '登录时间' => '登錄時間',\n  '注册时间' => '註冊時間',\n  '确认要删除吗？' => '確認要刪除嗎？',\n  '请选择对象！' => '請選擇對象！',\n  '批量删除成功' => '批量刪除成功',\n  '个人信息' => '個人信息',\n  '基础' => '基礎',\n  '设置' => '設置',\n  '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！' => '填寫內容時，請先選擇欄目，否則切換欄目後，數據會丟失！',\n  '恢复数据' => '恢復數據',\n  '此规则配置仅在不填留空的情况下才会触发' => '此規則配置僅在不填留空的情況下才會觸發',\n  'SEO标题' => 'SEO標題',\n  '等于内容标题' => '等於內容標題',\n  '不填则留空' => '不填則留空',\n  '缩略图规则' => '縮略圖規則',\n  '自动获取内容第一张图片' => '自動獲取內容第一張圖片',\n  '不自动获取' => '不自動獲取',\n  '简介规则' => '簡介規則',\n  '自动获取内容前200字符' => '自動獲取內容前200字符',\n  'TAG规则' => 'TAG規則',\n  '同步关键词' => '同步關鍵詞',\n  '不同步关键词' => '不同步關鍵詞',\n  '敏感词过滤字段' => '敏感詞過濾欄位',\n  '需要过滤敏感词在系统配置中进行设置' => '需要過濾敏感詞在系統配置中進行設置',\n  '请输入需要过滤的字段' => '請輸入需要過濾的欄位',\n  '返回列表' => '返回列表',\n  '取消' => '取消',\n  '预览' => '預覽',\n  '批量修改栏目' => '批量修改欄目',\n  '修改推荐属性' => '修改推薦屬性',\n  '审核' => '審核',\n  '列表字段设置' => '列表欄位設置',\n  '顶' => '頂',\n  '热' => '熱',\n  '荐' => '薦',\n  '请选择修改栏目！' => '請選擇修改欄目！',\n  '确认要批量修改内容分类吗？' => '確認要批量修改內容分類嗎？',\n  '批量修改成功' => '批量修改成功',\n  '请选择修改属性！' => '請選擇修改屬性！',\n  '请选择修改对象！' => '請選擇修改對象！',\n  '请选择审核选项！' => '請選擇審核選項！',\n  '请选择审核对象！' => '請選擇審核對象！',\n  '确认要批量处理吗？' => '確認要批量處理嗎？',\n  '批量审核成功' => '批量審核成功',\n  '确认要复制吗？' => '確認要複製嗎？',\n  '批量复制成功' => '批量複製成功',\n  '添加属性' => '添加屬性',\n  '名称' => '名稱',\n  '修改属性' => '修改屬性',\n  '新增属性' => '新增屬性',\n  '系统设置' => '系統設置',\n  '数据库管理' => '資料庫管理',\n  '备份数据库' => '備份資料庫',\n  '备份数：' => '備份數：',\n  '数据库备份名' => '資料庫備份名',\n  '大小' => '大小',\n  '备份副本' => '備份副本',\n  '还原数据' => '還原數據',\n  '删除备份' => '刪除備份',\n  '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？' => '還原資料庫將覆蓋現有的資料庫，您確認要還原資料庫嗎？',\n  '您确定要删除备份数据库吗？删除后将不可找回！' => '您確定要刪除備份資料庫嗎？刪除後將不可找回！',\n  '数据缓存' => '數據緩存',\n  '文件夹cache/data，主要是网站内容缓存，栏目，详情页等' => '文件夾cache/data，主要是網站內容緩存，欄目，詳情頁等',\n  '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空' => '文件夾cache/tmp，主要是伺服器session文件緩存，當前session將不會被清空',\n  '日志缓存' => '日誌緩存',\n  '文件夹cache/log，包括错误日志、支付日志、登录日志等' => '文件夾cache/log，包括錯誤日誌、支付日誌、登錄日誌等',\n  '模板缓存' => '模板緩存',\n  '文件夹cache，主要是程序执行时生成的模板编译文件' => '文件夾cache，主要是程序執行時生成的模板編譯文件',\n  '缩略图缓存' => '縮略圖緩存',\n  '文件夹image，主要是程序执行时生成的自定义缩略图' => '文件夾image，主要是程序執行時生成的自定義縮略圖',\n  '立即清空' => '立即清空',\n  '请选择清空目标！' => '請選擇清空目標！',\n  '清理成功！' => '清理成功！',\n  '内链管理' => '內鏈管理',\n  '添加内链' => '添加內鏈',\n  '内链词' => '內鏈詞',\n  '内链' => '內鏈',\n  '替换词' => '替換詞',\n  '替换次数' => '替換次數',\n  '替换词，可为空！' => '替換詞，可為空！',\n  '请填写内链' => '請填寫內鏈',\n  '替换次数，默认-1，替换全部，可不写。' => '替換次數，默認-1，替換全部，可不寫。',\n  '提交' => '提交',\n  '修改内链' => '修改內鏈',\n  '内链词和内链不能为空！' => '內鏈詞和內鏈不能為空！',\n  '充值类型' => '充值類型',\n  '当前兑换率：' => '當前兌換率：',\n  '兑换率指1元相当于多少钱包/积分' => '兌換率指1元相當於多少錢包/積分',\n  '交易类型' => '交易類型',\n  '赠送' => '贈送',\n  '充值数量' => '充值數量',\n  '用户ID' => '用戶ID',\n  '备注' => '備註',\n  '添加' => '添加',\n  '充值管理' => '充值管理',\n  '充值列表' => '充值列表',\n  '选择交易类型' => '選擇交易類型',\n  '买入' => '買入',\n  '选择交易种类' => '選擇交易種類',\n  '请输入前台用户手机号' => '請輸入前台用戶手機號',\n  '请输入用户昵称' => '請輸入用戶暱稱',\n  '请输入订单号' => '請輸入訂單號',\n  '会员充值' => '會員充值',\n  '总订单' => '總訂單',\n  '已充值' => '已充值',\n  '已兑换' => '已兌換',\n  '总赠送' => '總贈送',\n  '尾页' => '尾頁',\n  '订单号' => '訂單號',\n  '类型' => '類型',\n  '交易' => '交易',\n  '用户名' => '用戶名',\n  '数量' => '數量',\n  '金额' => '金額',\n  '时间' => '時間',\n  '查看' => '查看',\n  '选择模块' => '選擇模塊',\n  '选择上级' => '選擇上級',\n  '顶级栏目' => '頂級欄目',\n  '分类名' => '分類名',\n  '图片  ' => '圖片  ',\n  '择图片' => '擇圖片',\n  '排序规则' => '排序規則',\n  '组合：排序倒序，时间倒序，ID倒序' => '組合：排序倒序，時間倒序，ID倒序',\n  '组合：排序倒序，ID正序' => '組合：排序倒序，ID正序',\n  '排序正序' => '排序正序',\n  '时间倒序' => '時間倒序',\n  'ID正序' => 'ID正序',\n  '点击量倒序' => '點擊量倒序',\n  '时间正序' => '時間正序',\n  '默认不需要更改' => '默認不需要更改',\n  'URL命名' => 'URL命名',\n  '请填写文件名，如:index，不填请留空' => '請填寫文件名，如:index，不填請留空',\n  '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：' => '填寫欄目命名後，系統將自動用作該欄目URL連結，如：news，訪問該欄目連結：',\n  '多个相同URL，将覆盖前面的栏目' => '多個相同URL，將覆蓋前面的欄目',\n  '列表显示' => '列表顯示',\n  '设置列表页显示的内容条数' => '設置列表頁顯示的內容條數',\n  '栏目模板' => '欄目模板',\n  '手动填写，不填请留空' => '手動填寫，不填請留空',\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '請將模板文件放到對應的模塊文件夾下面，如文章(article)模塊，那麼就要在當前模板目錄的article文件夾下面。默認欄目首頁',\n  '详情页模板' => '詳情頁模板',\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。' => '請將模板文件放到對應的模塊文件夾下面，如文章(article)模塊，那麼就要在當前模板目錄的article文件夾下面，列表內的詳情頁。',\n  '栏目外链' => '欄目外鏈',\n  '栏目外链，如:htt://xxx.com/abc，不填请留空' => '欄目外鏈，如:htt://xxx.com/abc，不填請留空',\n  '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！' => '填寫欄目外鏈後，訪問欄目連結將會跳到外鏈，不填請留空！',\n  '发布显示' => '發布顯示',\n  '勾选后，前台会员发布会显示该栏目' => '勾選後，前台會員發布會顯示該欄目',\n  '导航显示' => '導航顯示',\n  '模板覆盖' => '模板覆蓋',\n  '覆盖' => '覆蓋',\n  '不覆盖' => '不覆蓋',\n  '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => '模板覆蓋指：顯示數量及使用模板文件下級一樣，減少同步操作。如果上級勾選了覆蓋下級，那麼下級默認調用上級填寫的模板。',\n  '访问限制' => '訪問限制',\n  '是否关闭' => '是否關閉',\n  '关闭' => '關閉',\n  '开启' => '開啟',\n  '栏目关闭后，前台不显示，也无法访问！' => '欄目關閉後，前台不顯示，也無法訪問！',\n  '增加' => '增加',\n  '请选择模板页面/使用自定义' => '請選擇模板頁面/使用自定義',\n  '批量新增' => '批量新增',\n  '添加栏目' => '添加欄目',\n  '格式：栏目名|栏目URL，一行一个，如：关于我们|about' => '格式：欄目名|欄目URL，一行一個，如：關於我們|about',\n  '格式：栏目名|栏目URL，一行一个' => '格式：欄目名|欄目URL，一行一個',\n  '请选择模板页面' => '請選擇模板頁面',\n  '图片 ' => '圖片 ',\n  '请填写完整文件名，如:index，不填请留空' => '請填寫完整文件名，如:index，不填請留空',\n  ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => ' 模板覆蓋指：顯示數量及使用模板文件下級一樣，減少同步操作。如果上級勾選了覆蓋下級，那麼下級默認調用上級填寫的模板。',\n  '请选择栏目' => '請選擇欄目',\n  '顶级' => '頂級',\n  '展开|折叠' => '展開|摺疊',\n  '模块名' => '模塊名',\n  '快捷操作' => '快捷操作',\n  '显示|隐藏' => '顯示|隱藏',\n  '添加下级' => '添加下級',\n  '字段管理' => '欄位管理',\n  '新增文章' => '新增文章',\n  '新增商品' => '新增商品',\n  '新增内容' => '新增內容',\n  '请选择对象' => '請選擇對象',\n  '已删除!' => '已刪除!',\n  '删除成功' => '刪除成功',\n  '扩展管理' => '擴展管理',\n  '新增轮播图' => '新增輪播圖',\n  '所属分类' => '所屬分類',\n  '图片' => '圖片',\n  '图片高' => '圖片高',\n  '0表示不限制' => '0表示不限制',\n  '图片宽' => '圖片寬',\n  '跳转链接' => '跳轉連結',\n  '不填请留空' => '不填請留空',\n  '数字越大越靠前' => '數字越大越靠前',\n  '修改轮播图' => '修改輪播圖',\n  '选择分类' => '選擇分類',\n  '更新时间' => '更新時間',\n  '轮播图列表' => '輪播圖列表',\n  '请选择分类' => '請選擇分類',\n  '请输入标题' => '請輸入標題',\n  '新增图片' => '新增圖片',\n  '分类列表' => '分類列表',\n  '添加分类' => '添加分類',\n  '共有数据：' => '共有數據：',\n  '条' => '條',\n  '长' => '長',\n  '宽' => '寬',\n  '轮播图分类' => '輪播圖分類',\n  '评论管理' => '評論管理',\n  '添加评论' => '添加評論',\n  '评论栏目' => '評論欄目',\n  '文章ID' => '文章ID',\n  '主回复ID' => '主回復ID',\n  '同属于一个评论的ID，如果没有评论中的评论，则为0' => '同屬於一個評論的ID，如果沒有評論中的評論，則為0',\n  '回复帖子ID' => '回覆帖子ID',\n  '评论内容' => '評論內容',\n  '管理员回复' => '管理員回復',\n  '是否提醒回复' => '是否提醒回復',\n  '提醒' => '提醒',\n  '不提醒' => '不提醒',\n  '喜欢/点赞' => '喜歡/點讚',\n  '是否已读' => '是否已讀',\n  '是否删除' => '是否刪除',\n  '已删除' => '已刪除',\n  '未删除' => '未刪除',\n  '只能管理员删除评论，用户只能软删除评论' => '只能管理員刪除評論，用戶只能軟刪除評論',\n  '查看评论' => '查看評論',\n  '评论列表' => '評論列表',\n  '请输入评论内容' => '請輸入評論內容',\n  '查看相关内容' => '查看相關內容',\n  '查看用户' => '查看用戶',\n  '所属文章' => '所屬文章',\n  '评论时间' => '評論時間',\n  '请选择审核选项' => '請選擇審核選項',\n  '批量处理成功' => '批量處理成功',\n  '调用方式' => '調用方式',\n  '这里输出想要的内容，如：' => '這裡輸出想要的內容，如：',\n  '查看SQL' => '查看SQL',\n  '系统扩展' => '系統擴展',\n  '桌面管理' => '桌面管理',\n  '新增配置' => '新增配置',\n  '配置名称' => '配置名稱',\n  '左侧菜单栏' => '左側菜單欄',\n  '没有二级菜单不会生效' => '沒有二級菜單不會生效',\n  '顶部菜单栏' => '頂部菜單欄',\n  '适用角色' => '適用角色',\n  '默认所有' => '默認所有',\n  '系统默认' => '系統默認',\n  '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置' => '系統默認指沒有指定桌面配置的管理員，進入後台後默認的配置',\n  '一个菜单名称' => '一個菜單名稱',\n  '顶级菜单' => '頂級菜單',\n  '菜单图标' => '菜單圖標',\n  '二级菜单' => '二級菜單',\n  '图标' => '圖標',\n  '修改菜单名称' => '修改菜單名稱',\n  '确定要删除吗？' => '確定要刪除嗎？',\n  '最后一个索引不能删除！' => '最後一個索引不能刪除！',\n  '添加菜单名称' => '添加菜單名稱',\n  '菜单选择' => '菜單選擇',\n  '图标选择' => '圖標選擇',\n  '修改配置' => '修改配置',\n  '桌面名称' => '桌面名稱',\n  '系统' => '系統',\n  '是否默认' => '是否默認',\n  '所有角色' => '所有角色',\n  '复制配置' => '複製配置',\n  '修改碎片' => '修改碎片',\n  '指定几个id或者几个tid的内容输出(栏目：不限制栏目)' => '指定幾個id或者幾個tid的內容輸出(欄目：不限制欄目)',\n  'SQL中输入：' => 'SQL中輸入：',\n  'SQL中输入： ' => 'SQL中輸入： ',\n  '如： ' => '如： ',\n  '单位：分钟' => '單位：分鐘',\n  '修改导航' => '修改導航',\n  '扩展模型管理' => '擴展模型管理',\n  '模块管理' => '模塊管理',\n  '新增字段' => '新增欄位',\n  '角色绑定' => '角色綁定',\n  '目绑定' => '目綁定',\n  '字段名称' => '欄位名稱',\n  '简短的名称' => '簡短的名稱',\n  '字段标识' => '欄位標識',\n  '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短' => '只能英文字母[或者後面+數字]，必須含有英文字母，小寫字母，簡短',\n  '字段类型' => '欄位類型',\n  '选择' => '選擇',\n  '长度' => '長度',\n  '说明' => '說明',\n  '不限' => '不限',\n  '带编辑器文本' => '帶編輯器文本',\n  '只能填写数字，长度不能超过11位' => '只能填寫數字，長度不能超過11位',\n  '金钱，小数等，保留2位' => '金錢，小數等，保留2位',\n  '时间日期' => '時間日期',\n  '多图，图集' => '多圖，圖集',\n  '红=1,黄=2' => '紅=1,黃=2',\n  '单项选择，下拉选择，如：红=1,黄=2,蓝=3' => '單項選擇，下拉選擇，如：紅=1,黃=2,藍=3',\n  '单项选择，按钮选择，如：红=1,黄=2,蓝=3' => '單項選擇，按鈕選擇，如：紅=1,黃=2,藍=3',\n  '多项选择，如：红=1,黄=2,蓝=3' => '多項選擇，如：紅=1,黃=2,藍=3',\n  '一个附件，压缩包，Excel，Word文档' => '一個附件，壓縮包，Excel，Word文檔',\n  '多个附件，压缩包，Excel，Word文档' => '多個附件，壓縮包，Excel，Word文檔',\n  '请选择关联模块' => '請選擇關聯模塊',\n  '列表显示字段' => '列表顯示欄位',\n  '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '單選關聯，可以直接調用關聯模塊內容列表，列表顯示對應欄位內容',\n  '多行录入，可以在页面动态新增内容输入框' => '多行錄入，可以在頁面動態新增內容輸入框',\n  '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '多選關聯，可以直接調用關聯模塊內容列表，列表顯示對應欄位內容',\n  '系统栏目，不可修改' => '系統欄目，不可修改',\n  '系统副栏目，不可修改' => '系統副欄目，不可修改',\n  '系统TAG，不可修改' => '系統TAG，不可修改',\n  '默认值' => '默認值',\n  '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1' => '默認欄位值，不填默認int類型的值是0，string類型的值是null。多選參數的值是兩邊帶【,】，如【,1,】表示值為1',\n  '字段提示' => '欄位提示',\n  '用于填写时的提示信息，50字以内' => '用於填寫時的提示信息，50字以內',\n  '表单排序' => '表單排序',\n  '是否必填' => '是否必填',\n  '必填' => '必填',\n  '非必填' => '非必填',\n  '带有文本框编辑器的除外' => '帶有文本框編輯器的除外',\n  '前台显示' => '前台顯示',\n  '前台表单' => '前台表單',\n  '后台显示' => '後台顯示',\n  '后台搜索' => '後台搜索',\n  '仅用于后台列表头部带有该字段搜索' => '僅用於後台列表頭部帶有該欄位搜索',\n  '列表中显示' => '列表中顯示',\n  '仅用于后台列表显示该字段' => '僅用於後台列表顯示該欄位',\n  '显示格式化' => '顯示格式化',\n  '不做处理' => '不做處理',\n  '仅用于后台列表显示该字段内容处理' => '僅用於後台列表顯示該欄位內容處理',\n  'ajax可访问' => 'ajax可訪問',\n  '不能' => '不能',\n  '能' => '能',\n  '由于本系统对json数据封装，限制访问可以提高安全性' => '由於本系統對json數據封裝，限制訪問可以提高安全性',\n  '角色名' => '角色名',\n  '栏目名' => '欄目名',\n  '修改字段' => '修改欄位',\n  '栏目绑定' => '欄目綁定',\n  '红=1,黄=2,蓝=3' => '紅=1,黃=2,藍=3',\n  '关联模块内容ID' => '關聯模塊內容ID',\n  '可以在页面动态新增内容输入框' => '可以在頁面動態新增內容輸入框',\n  '温馨提示：排序和宽度在列表点击也可以更改。' => '溫馨提示：排序和寬度在列表點擊也可以更改。',\n  '排序：当前列表显示排序，不会影响录入排序，越大越靠前。' => '排序：當前列表顯示排序，不會影響錄入排序，越大越靠前。',\n  '搜索：在列表顶部的搜索中，可以搜索该字段。' => '搜索：在列表頂部的搜索中，可以搜索該欄位。',\n  '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。' => '寬度：列表顯示的寬度。由於屏幕寬度問題，可以根據自己關注的欄位在列表中顯示更清晰，默認100。',\n  '宽度' => '寬度',\n  '批量绑定栏目' => '批量綁定欄目',\n  '字段' => '欄位',\n  '后台' => '後台',\n  '确认要删除吗？删除的同时将删除对应的表内容！' => '確認要刪除嗎？刪除的同時將刪除對應的表內容！',\n  '角色管理' => '角色管理',\n  '角色修改' => '角色修改',\n  '是否超管' => '是否超管',\n  '不是' => '不是',\n  '超级管理员拥有无上权利，无视下面权限限制' => '超級管理員擁有無上權利，無視下面權限限制',\n  '发布审核' => '發布審核',\n  '超级管理员除外，发布的内容是否需要审核' => '超級管理員除外，發布的內容是否需要審核',\n  '栏目权限' => '欄目權限',\n  '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效' => '是否設置欄目權限，默認不設置。開啟後下面的欄目權限設置才有效',\n  '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目' => '選中頂級欄目，則默認子欄目也選中。如果只需要子欄目權限，請不要選中頂級欄目',\n  '子栏目' => '子欄目',\n  '拥有权限' => '擁有權限',\n  '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块' => '選中主模塊，則默認子模塊也選中。如果只需要子模塊權限，請不要選中主模塊',\n  '主模块' => '主模塊',\n  '子模块' => '子模塊',\n  '描述' => '描述',\n  '请输入内容' => '請輸入內容',\n  '关闭后，该分组管理员将不能登录' => '關閉後，該分組管理員將不能登錄',\n  '添加角色' => '添加角色',\n  '后台管理' => '後台管理',\n  '展开左侧栏' => '展開左側欄',\n  '清理缓存' => '清理緩存',\n  '退出' => '退出',\n  '前台首页' => '前台首頁',\n  '后台首页' => '後台首頁',\n  '我的桌面' => '我的桌面',\n  '关闭当前' => '關閉當前',\n  '关闭其他' => '關閉其他',\n  '关闭所有' => '關閉所有',\n  '扩展模块管理' => '擴展模塊管理',\n  '批量修改分类' => '批量修改分類',\n  '批量处理' => '批量處理',\n  '友情链接分类' => '友情連結分類',\n  '分类' => '分類',\n  '后台管理登录' => '後台管理登錄',\n  '验证码' => '驗證碼',\n  '登录' => '登錄',\n  '登录ID' => '登錄ID',\n  '登录用户' => '登錄用戶',\n  '模块' => '模塊',\n  '方法' => '方法',\n  '操作时间' => '操作時間',\n  '会员管理' => '會員管理',\n  '新增会员' => '新增會員',\n  '用于找回密码' => '用於找回密碼',\n  '手机号' => '手機號',\n  '必须唯一' => '必須唯一',\n  '昵称' => '暱稱',\n  '分组' => '分組',\n  '头像' => '頭像',\n  '生日' => '生日',\n  '个性签名' => '個性簽名',\n  '省份' => '省份',\n  '城市' => '城市',\n  '详细地址' => '詳細地址',\n  '6到16个字符' => '6到16個字符',\n  '添加成功' => '添加成功',\n  '会员修' => '會員修',\n  '6到16个字符,不修改请留空' => '6到16個字符,不修改請留空',\n  '修改成功' => '修改成功',\n  '会员列表' => '會員列表',\n  '请输入手机号' => '請輸入手機號',\n  '余额' => '餘額',\n  '加入时间' => '加入時間',\n  '分组管理' => '分組管理',\n  '分组修改' => '分組修改',\n  '分组名' => '分組名',\n  '折扣类型' => '折扣類型',\n  '无折扣' => '無折扣',\n  '现金折扣' => '現金折扣',\n  '百分比折扣' => '百分比折扣',\n  '折扣金额' => '折扣金額',\n  '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效' => '百分比折扣請填寫0.01-1之間的小數(如5折,填0.5)，無折扣時，該參數設置無效',\n  '登录状态' => '登錄狀態',\n  '请选择所属单位！' => '請選擇所屬單位！',\n  '用户管理' => '用戶管理',\n  '会员分组' => '會員分組',\n  '添加分组' => '添加分組',\n  '温馨提示：前台权限已关闭，设置权限不会生效。' => '溫馨提示：前台權限已關閉，設置權限不會生效。',\n  '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！' => '溫馨提示：前台權限已開啟，權限設置將直接影響前台訪問，請謹慎操作！',\n  '留言管理' => '留言管理',\n  '查看留言' => '查看留言',\n  '问题描述' => '問題描述',\n  '用户昵称' => '用戶暱稱',\n  '留言栏目' => '留言欄目',\n  '不指定栏目' => '不指定欄目',\n  '联系电话' => '聯繫電話',\n  '留言IP' => '留言IP',\n  '留言内容' => '留言內容',\n  '是否审核' => '是否審核',\n  '提交时间' => '提交時間',\n  '修改保存' => '修改保存',\n  '留言列表' => '留言列表',\n  '请输入相关内容ID' => '請輸入相關內容ID',\n  '内容ID' => '內容ID',\n  '模型管理' => '模型管理',\n  '新增模型' => '新增模型',\n  '模型名称' => '模型名稱',\n  '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名' => '必須是英文字母，且不能是已存在的標識，標識即是資料庫里的表名',\n  '是否必选栏目' => '是否必選欄目',\n  '新增修改内容时必选' => '新增修改內容時必選',\n  '是否显示栏目' => '是否顯示欄目',\n  '列表展示、录入内容、修改内容三个页面是否展示栏目' => '列表展示、錄入內容、修改內容三個頁面是否展示欄目',\n  '是否受权限控制' => '是否受權限控制',\n  '不同角色可以通过控制栏目权限来限制查看内容' => '不同角色可以通過控制欄目權限來限制查看內容',\n  '栏目绑定显示' => '欄目綁定顯示',\n  '栏目绑定时是否显示该模型' => '欄目綁定時是否顯示該模型',\n  '前台发布' => '前台發布',\n  '前台是否允许发布' => '前台是否允許發布',\n  '列表模板' => '列表模板',\n  '默认列表模板' => '默認列表模板',\n  '详情模板' => '詳情模板',\n  '默认详情模板' => '默認詳情模板',\n  '是否开启' => '是否開啟',\n  '数值越小越靠前' => '數值越小越靠前',\n  '已有表' => '已有表',\n  '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"' => '如果資料庫已經有這個表了，就選擇\"是\"，否則就選\"不是\"',\n  '是否可以预览' => '是否可以預覽',\n  '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]' => '如果後台無法預覽，則選擇 「否」 ，列表中將不會出現 [預覽]',\n  '修改模型' => '修改模型',\n  '模型状态' => '模型狀態',\n  '模型分类' => '模型分類',\n  '允许' => '允許',\n  '已停用' => '已停用',\n  '已启用' => '已啟用',\n  '重构字段' => '重構欄位',\n  '确认要删除吗？删除的同时将删除对应的表！' => '確認要刪除嗎？刪除的同時將刪除對應的表！',\n  '订单列表' => '訂單列表',\n  '订单详情' => '訂單詳情',\n  '姓名' => '姓名',\n  '是否支付' => '是否支付',\n  '已支付' => '已支付',\n  '未支付' => '未支付',\n  '支付时间' => '支付時間',\n  '存储内容' => '存儲內容',\n  '订单内容' => '訂單內容',\n  '商品' => '商品',\n  '商品已删除' => '商品已刪除',\n  '收货信息：' => '收貨信息：',\n  '收件人：' => '收件人：',\n  '联系手机：' => '聯繫手機：',\n  '联系邮箱：' => '聯繫郵箱：',\n  '收货地址：' => '收貨地址：',\n  '订单状态' => '訂單狀態',\n  '订单已删除' => '訂單已刪除',\n  '已提交未支付' => '已提交未支付',\n  '超时订单' => '超時訂單',\n  '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '訂單更改為『已出貨』，點『確定修改』後，將發送一封郵件通知客戶。訂單未變化狀態則不會發送郵件',\n  '发货时间' => '發貨時間',\n  '确定修改' => '確定修改',\n  '订单管理' => '訂單管理',\n  '选择状态' => '選擇狀態',\n  '支付方式' => '支付方式',\n  '线下支付' => '線下支付',\n  '钱包支付' => '錢包支付',\n  '积分兑换' => '積分兌換',\n  '支付宝支付' => '支付寶支付',\n  '微信支付' => '微信支付',\n  '微信H5支付' => '微信H5支付',\n  '微信扫码支付' => '微信掃碼支付',\n  '支付宝H5支付' => '支付寶H5支付',\n  '总收入' => '總收入',\n  '付款方式' => '付款方式',\n  '是否付款' => '是否付款',\n  '付款时间' => '付款時間',\n  '图库管理' => '圖庫管理',\n  '筛选上传入口' => '篩選上傳入口',\n  '前台' => '前台',\n  '筛选模块' => '篩選模塊',\n  '其他杂项' => '其他雜項',\n  '系统配置' => '系統配置',\n  '筛选栏目' => '篩選欄目',\n  '上传前台' => '上傳前台',\n  '所属模块' => '所屬模塊',\n  '本地文件' => '本地文件',\n  '文件大小' => '文件大小',\n  '其他' => '其他',\n  '插件管理' => '插件管理',\n  '插件列表' => '插件列表',\n  '全部' => '全部',\n  '本地' => '本地',\n  '请输入插件名字' => '請輸入插件名字',\n  '插件名' => '插件名',\n  '版本' => '版本',\n  '作者' => '作者',\n  '平台' => '平台',\n  '插件文件' => '插件文件',\n  '开关' => '開關',\n  '安装说明' => '安裝說明',\n  '点击查看' => '點擊查看',\n  '更新说明' => '更新說明',\n  '新' => '新',\n  '官方' => '官方',\n  '第三方' => '第三方',\n  '开|停' => '開|停',\n  '配置' => '配置',\n  '导出' => '導出',\n  '卸载' => '卸載',\n  '安装' => '安裝',\n  '下载' => '下載',\n  '获取文件大小失败，请检查网络！' => '獲取文件大小失敗，請檢查網絡！',\n  '正在安装中，请稍等~' => '正在安裝中，請稍等~',\n  '正在删除中，请稍等~' => '正在刪除中，請稍等~',\n  '正在卸载中，请稍等~' => '正在卸載中，請稍等~',\n  '设置接口' => '設置接口',\n  '当前版本：' => '當前版本：',\n  '最新版本：' => '最新版本：',\n  '作者：' => '作者：',\n  '更新时间：' => '更新時間：',\n  '更新内容' => '更新內容',\n  '正在下载文件' => '正在下載文件',\n  '升级插件' => '升級插件',\n  '文件下载完成！正在解压~' => '文件下載完成！正在解壓~',\n  '文件解压完成！正在进行安装~' => '文件解壓完成！正在進行安裝~',\n  '插件升级成功！' => '插件升級成功！',\n  '插件已升级完毕！' => '插件已升級完畢！',\n  '功能' => '功能',\n  '函数名' => '函數名',\n  '对应的控制器/函数，如果是顶级，则只需要写控制器名' => '對應的控制器/函數，如果是頂級，則只需要寫控制器名',\n  '权限列表' => '權限列表',\n  '添加权限' => '添加權限',\n  '控制器/方法' => '控制器/方法',\n  '添加子功能' => '添加子功能',\n  '权限管理' => '權限管理',\n  '栏目选择' => '欄目選擇',\n  '权限选择' => '權限選擇',\n  '不能选择的权限是非独立功能' => '不能選擇的權限是非獨立功能',\n  '请先勾选菜单!' => '請先勾選菜單!',\n  '扩展信息' => '擴展信息',\n  '回收站' => '回收站',\n  '还原' => '還原',\n  '批量恢复' => '批量恢復',\n  '确认要删除吗？删除后就彻底无法恢复了！' => '確認要刪除嗎？刪除後就徹底無法恢復了！',\n  '确认要删除吗？删除后不可恢复！' => '確認要刪除嗎？刪除後不可恢復！',\n  '确认要还原吗？' => '確認要還原嗎？',\n  '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。' => '重構欄位可以快速將外部表引入CMS內，使其兼容CMS模型。',\n  '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '重構欄位 => 簡單選擇錄入類型 => 欄位列表 => 詳細欄位修改',\n  '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '溫馨提示：外部表必須有個欄位為id，且必須是自增主鍵。如果沒有，請先在資料庫手動增加這個欄位或者把已有的自增欄位改成id。',\n  '数据类型' => '數據類型',\n  '录入类型' => '錄入類型',\n  '归属' => '歸屬',\n  '插件' => '插件',\n  '独立功能' => '獨立功能',\n  '桌面管理配置时，将调用独立功能' => '桌面管理配置時，將調用獨立功能',\n  '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录' => '手機端已開啟，sitemap將包含手機端URL，請注意【手機靜態目錄',\n  '如果不生成静态文件，请改为' => '如果不生成靜態文件，請改為',\n  '手机端未开启，sitemap不会包含手机端URL' => '手機端未開啟，sitemap不會包含手機端URL',\n  'PC端网站地图：' => 'PC端網站地圖：',\n  '手机端网站地图：' => '手機端網站地圖：',\n  '网站地图' => '網站地圖',\n  '模块名称' => '模塊名稱',\n  '更新频率' => '更新頻率',\n  '站内权重' => '站內權重',\n  '输出范围' => '輸出範圍',\n  '栏目模块' => '欄目模塊',\n  '显示的栏目' => '顯示的欄目',\n  '所有的栏目' => '所有的欄目',\n  '文章模块' => '文章模塊',\n  '显示的文章' => '顯示的文章',\n  '所有的文章' => '所有的文章',\n  '商品模块' => '商品模塊',\n  '显示的商品' => '顯示的商品',\n  '所有的商品' => '所有的商品',\n  '显示的' => '顯示的',\n  '所有的' => '所有的',\n  '立即生成' => '立即生成',\n  '网站设置' => '網站設置',\n  '自定义配置' => '自定義配置',\n  '点击复制' => '點擊複製',\n  '上传文件' => '上傳文件',\n  '不选' => '不選',\n  '删除配置栏' => '刪除配置欄',\n  '选择类型' => '選擇類型',\n  '编辑器' => '編輯器',\n  '文件上传' => '文件上傳',\n  '下拉选项' => '下拉選項',\n  '栏目选项' => '欄目選項',\n  '代码' => '代碼',\n  '请填写配置名(中文)' => '請填寫配置名(中文)',\n  '配置标识(字母或数字)' => '配置標識(字母或數字)',\n  '配置栏目' => '配置欄目',\n  '提示信息' => '提示信息',\n  '自定义配置可以配置对应配置栏下的自定义内容' => '自定義配置可以配置對應配置欄下的自定義內容',\n  '下拉选项配置，如：开启=1,关闭=0' => '下拉選項配置，如：開啟=1,關閉=0',\n  '自定义配置栏' => '自定義配置欄',\n  '请填写配置栏名(中文)' => '請填寫配置欄名(中文)',\n  '配置标识(必须是字母)' => '配置標識(必須是字母)',\n  '配置标识用于权限控制，必填且不能与原系统配置栏重复' => '配置標識用於權限控制，必填且不能與原系統配置欄重複',\n  '失败！' => '失敗！',\n  '模板管理' => '模板管理',\n  '模板列表' => '模板列表',\n  '请输入模板名字' => '請輸入模板名字',\n  '有更新' => '有更新',\n  '已使用' => '已使用',\n  '备份数据' => '備份數據',\n  '安装模板' => '安裝模板',\n  '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？' => '如果數據量較大，不建議通過此方法備份資料庫，可以從資料庫中直接導出。確定要備份資料庫嗎？',\n  '提示' => '提示',\n  '安装提示' => '安裝提示',\n  '该模板用于：' => '該模板用於：',\n  'PC端' => 'PC端',\n  '手机端' => '手機端',\n  '微信端' => '微信端',\n  '升级模板' => '升級模板',\n  '模板升级成功！' => '模板升級成功！',\n  '模板已升级完毕！' => '模板已升級完畢！',\n  '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！' => '您已開啟【緩存完整頁面】，更新靜態HTML需要預留足夠的空間，如：總內存500M，已用280M（過半），不建議生成HMTL，可能會導致內存不夠！',\n  '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '可以去【系統設置】-【高級設置】-【緩存完整頁面】進行關閉',\n  '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！' => '請確定空間內存是否足夠，如果不夠，可以開啟【緩存完整頁面】，也能達到靜態訪問打開頁面速度！',\n  '指定栏目' => '指定欄目',\n  '所有栏目' => '所有欄目',\n  '生成电脑静态' => '生成電腦靜態',\n  '生成手机静态' => '生成手機靜態',\n  '清理电脑静态HTML' => '清理電腦靜態HTML',\n  '清理手机静态HTML' => '清理手機靜態HTML',\n  '批量生成电脑静态' => '批量生成電腦靜態',\n  '批量生成手机静态' => '批量生成手機靜態',\n  '批量清理电脑静态' => '批量清理電腦靜態',\n  '批量清理手机静态' => '批量清理手機靜態',\n  '正在处理~' => '正在處理~',\n  '正在准备生成静态，请不要关闭页面~' => '正在準備生成靜態，請不要關閉頁面~',\n  '正在准备清理电脑端静态HTML，请不要关闭页面~' => '正在準備清理電腦端靜態HTML，請不要關閉頁面~',\n  '正在准备清理手机端静态HTML，请不要关闭页面~' => '正在準備清理手機端靜態HTML，請不要關閉頁面~',\n  '欢迎管理员：' => '歡迎管理員：',\n  '当前时间' => '當前時間',\n  '站内用户' => '站內用戶',\n  '人' => '人',\n  '站内文章' => '站內文章',\n  '篇' => '篇',\n  '站内产品' => '站內產品',\n  '件' => '件',\n  '站内留言' => '站內留言',\n  '最近更新' => '最近更新',\n  '全部文章' => '全部文章',\n  '阅读量' => '閱讀量',\n  '最新评论' => '最新評論',\n  '在' => '在',\n  '发布了评论' => '發布了評論',\n  '版本信息' => '版本信息',\n  '当前版本' => '當前版本',\n  '项目地址' => '項目地址',\n  '服务器' => '伺服器',\n  '操作系统' => '作業系統',\n  '运行环境' => '運行環境',\n  'PHP版本' => 'PHP版本',\n  '运行方式' => '運行方式',\n  '上传限制' => '上傳限制',\n  '用户留言' => '用戶留言',\n  '回复' => '回復',\n  '星期天' => '星期天',\n  '星期一' => '星期一',\n  '星期二' => '星期二',\n  '星期三' => '星期三',\n  '星期四' => '星期四',\n  '星期五' => '星期五',\n  '星期六' => '星期六',\n  '评论模块未开启！' => '評論模塊未開啟！',\n  '您的操作过于频繁，请十分钟后再试~' => '您的操作過於頻繁，請十分鐘後再試~',\n  '评论内容不能为空！' => '評論內容不能為空！',\n  '请提交栏目ID' => '請提交欄目ID',\n  '栏目ID不能为空！' => '欄目ID不能為空！',\n  '评论奖励' => '評論獎勵',\n  '评价成功！' => '評價成功！',\n  '您未登录，请重新登录~' => '您未登錄，請重新登錄~',\n  '您没有' => '您沒有',\n  '的权限！' => '的權限！',\n  '您还未登录，请重新登录！' => '您還未登錄，請重新登錄！',\n  '上传成功！' => '上傳成功！',\n  '已关闭前台上传文件功能' => '已關閉前台上傳文件功能',\n  '上传错误！' => '上傳錯誤！',\n  '对不起，您没有访问权限！' => '對不起，您沒有訪問權限！',\n  '输入url错误！' => '輸入url錯誤！',\n  '缺少ID！' => '缺少ID！',\n  '未找到相应内容！' => '未找到相應內容！',\n  '请输入关键词搜索！' => '請輸入關鍵詞搜索！',\n  '搜索超出设定范围！' => '搜索超出設定範圍！',\n  '您的搜索超出设定范围！' => '您的搜索超出設定範圍！',\n  '系统创建' => '系統創建',\n  '目录失败!' => '目錄失敗!',\n  '支付成功，但是系统内没有找到相应的订单！' => '支付成功，但是系統內沒有找到相應的訂單！',\n  '支付失败' => '支付失敗',\n  '订单号错误！' => '訂單號錯誤！',\n  '会员中心已关闭！' => '會員中心已關閉！',\n  '您的账户已被冻结！' => '您的帳戶已被凍結！',\n  '未找到您所在分组，请联系管理员处理！' => '未找到您所在分組，請聯繫管理員處理！',\n  '您所在的分组被限制登录！' => '您所在的分組被限制登錄！',\n  '登录奖励' => '登錄獎勵',\n  '系统已关闭会员注册！' => '系統已關閉會員註冊！',\n  '您的邀请链接不合法！' => '您的邀請連結不合法！',\n  '手机号格式不正确！' => '手機號格式不正確！',\n  '您的邮箱已注册！' => '您的郵箱已註冊！',\n  '您的手机号码已注册！' => '您的手機號碼已註冊！',\n  '邀请奖励' => '邀請獎勵',\n  '注册成功，等待审核！' => '註冊成功，等待審核！',\n  '注册成功！' => '註冊成功！',\n  '注册失败，请重试~' => '註冊失敗，請重試~',\n  '必须通过邀请链接进行注册！' => '必須通過邀請連結進行註冊！',\n  '请输入账号和邮箱！' => '請輸入帳號和郵箱！',\n  '图形验证码错误！' => '圖形驗證碼錯誤！',\n  '找回密码' => '找回密碼',\n  '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击' => '您的帳號正在進行找回密碼操作，如果確定是本人操作，請在10分鐘內點擊',\n  '立即找回密码' => '立即找回密碼',\n  '过期失效！' => '過期失效！',\n  '您操作过于频繁，请10分钟后再尝试！' => '您操作過於頻繁，請10分鐘後再嘗試！',\n  '找回密码邮件已发送，请到您的邮箱查看！' => '找回密碼郵件已發送，請到您的郵箱查看！',\n  '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！' => '郵箱伺服器未配置，無法發送郵件，請聯繫管理員找回密碼！',\n  '输入的信息有误！' => '輸入的信息有誤！',\n  'token已失效！' => 'token已失效！',\n  '密码重置成功,请重新登录！' => '密碼重置成功,請重新登錄！',\n  '新密码不能与旧密码相同！' => '新密碼不能與舊密碼相同！',\n  '标题不能为空！' => '標題不能為空！',\n  '称呼不能为空！' => '稱呼不能為空！',\n  '您的手机号格式不正确！' => '您的手機號格式不正確！',\n  '不能为空！' => '不能為空！',\n  '提交成功！我们会尽快回复您！' => '提交成功！我們會儘快回復您！',\n  '提交失败，请重试！' => '提交失敗，請重試！',\n  '链接错误' => '連結錯誤',\n  '留言未找到或者未审核' => '留言未找到或者未審核',\n  '匿名' => '匿名',\n  '缺少id参数！' => '缺少id參數！',\n  '缺少tid参数！' => '缺少tid參數！',\n  '未找到商品或者已下架！' => '未找到商品或者已下架！',\n  '该模块缺少price价格参数！' => '該模塊缺少price價格參數！',\n  '您的订单提交成功通知' => '您的訂單提交成功通知',\n  '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！' => '我們已經收到您的訂單，我們會儘快給你發貨，請密切關注您的郵箱以獲得訂單的最新消息，謝謝合作！',\n  '订单详细信息如下' => '訂單詳細信息如下',\n  '折扣' => '折扣',\n  '运费' => '運費',\n  '合计' => '合計',\n  '收件地址' => '收件地址',\n  '您的订单' => '您的訂單',\n  '已经提交，我们会尽快给您发货！' => '已經提交，我們會儘快給您發貨！',\n  '订单已支付！' => '訂單已支付！',\n  '已经提交，请尽快支付！' => '已經提交，請儘快支付！',\n  '支付订单' => '支付訂單',\n  '电脑支付宝支付' => '電腦支付寶支付',\n  '微信内支付' => '微信內支付',\n  '未开启钱包支付！' => '未開啟錢包支付！',\n  '您未登录，无法支付！' => '您未登錄，無法支付！',\n  '钱包金额不足，请充值！' => '錢包金額不足，請充值！',\n  '未开启积分支付！' => '未開啟積分支付！',\n  '积分不足，请充值！' => '積分不足，請充值！',\n  '支付宝当面付' => '支付寶當面付',\n  '其他平台支付' => '其他平台支付',\n  '在线充值' => '在線充值',\n  '交易创建，等待买家付款' => '交易創建，等待買家付款',\n  '未付款交易超时关闭，或支付完成后全额退款' => '未付款交易超時關閉，或支付完成後全額退款',\n  '支付成功' => '支付成功',\n  '交易结束，不可退款' => '交易結束，不可退款',\n  '未知状态' => '未知狀態',\n  '订单号错误或订单被删除！' => '訂單號錯誤或訂單被刪除！',\n  '订单未支付或订单号错误！' => '訂單未支付或訂單號錯誤！',\n  '创建订单失败！' => '創建訂單失敗！',\n  '订单号不存在或已被删除！' => '訂單號不存在或已被刪除！',\n  '收件人、手机号和收货地址不能为空！' => '收件人、手機號和收貨地址不能為空！',\n  '未开启在线支付！' => '未開啟在線支付！',\n  '获取openid失败' => '獲取openid失敗',\n  '非法参数！' => '非法參數！',\n  '标签未找到或已删除！' => '標籤未找到或已刪除！',\n  '手机号码格式错误！' => '手機號碼格式錯誤！',\n  '账户不能为空！' => '帳戶不能為空！',\n  '订单已过期，不可支付！' => '訂單已過期，不可支付！',\n  '订单已支付，请勿重复操作！' => '訂單已支付，請勿重複操作！',\n  '缺少订单号！' => '缺少訂單號！',\n  '网络错误，请刷新后重试！' => '網絡錯誤，請刷新後重試！',\n  '未找到评论！' => '未找到評論！',\n  '已取消点赞！' => '已取消點讚！',\n  '点赞成功！' => '點讚成功！',\n  '栏目未绑定模型，无法喜欢！' => '欄目未綁定模型，無法喜歡！',\n  '取消点赞' => '取消點讚',\n  '点赞奖励' => '點讚獎勵',\n  '已被删除 ' => '已被刪除 ',\n  '栏目未绑定模型，无法收藏！' => '欄目未綁定模型，無法收藏！',\n  '取消收藏' => '取消收藏',\n  '收藏奖励' => '收藏獎勵',\n  '收藏成功！' => '收藏成功！',\n  '已被删除' => '已被刪除',\n  '库存不足！' => '庫存不足！',\n  '该模块不允许发布！' => '該模塊不允許發布！',\n  '添加失败，存在敏感词' => '添加失敗，存在敏感詞',\n  '分类错误！' => '分類錯誤！',\n  '该分类不允许发布！' => '該分類不允許發布！',\n  '您没有权限在该分类发布内容！' => '您沒有權限在該分類發布內容！',\n  '内容不能为空！' => '內容不能為空！',\n  '库存不能为0！' => '庫存不能為0！',\n  '未修改内容，不能提交！' => '未修改內容，不能提交！',\n  '发布失败，请重试！' => '發布失敗，請重試！',\n  '发布成功！' => '發布成功！',\n  '未找到您要的文章！' => '未找到您要的文章！',\n  '您已经关注了该用户！' => '您已經關注了該用戶！',\n  '您不能关注自己！' => '您不能關注自己！',\n  '关注奖励' => '關注獎勵',\n  '关注成功！' => '關注成功！',\n  '您没有关注该用户，无法操作！' => '您沒有關注該用戶，無法操作！',\n  '取关成功！' => '取關成功！',\n  '消息已被删除！' => '消息已被刪除！',\n  '用户未找到！' => '用戶未找到！',\n  '未分类 ' => '未分類 ',\n  '设置成功' => '設置成功',\n  '设置成功！' => '設置成功！',\n  '记录不存在！' => '記錄不存在！',\n  '缺少栏目ID！' => '缺少欄目ID！',\n  '系统未配置微信登录！' => '系統未配置微信登錄！',\n  '微信已绑定！' => '微信已綁定！',\n  '您的微信已被绑定，不能再绑定！' => '您的微信已被綁定，不能再綁定！',\n  '系统版号' => '系統版號',\n  '版本号是系统自带，请勿改动' => '版本號是系統自帶，請勿改動',\n  '网站SEO名称' => '網站SEO名稱',\n  '控制在25个字、50个字节以内' => '控制在25個字、50個字節以內',\n  '网站SEO关键词' => '網站SEO關鍵詞',\n  '5个左右，8汉字以内，用英文逗号隔开' => '5個左右，8漢字以內，用英文逗號隔開',\n  '网站SEO描述' => '網站SEO描述',\n  '控制在80个汉字，160个字符以内' => '控制在80個漢字，160個字符以內',\n  '统计代码' => '統計代碼',\n  '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '將百度統計、cnzz等平台的流量統計JS代碼放到這裡',\n  '底部版权' => '底部版權',\n  '如：&copy; 2016 xxx版权' => '如：&copy; 2016 xxx版權',\n  '备案号' => '備案號',\n  '如：京ICP备00000000号' => '如：京ICP備00000000號',\n  '网站电话' => '網站電話',\n  '网站联系电话' => '網站聯繫電話',\n  '400电话' => '400電話',\n  '网站QQ' => '網站QQ',\n  '网站邮箱' => '網站郵箱',\n  '公司地址' => '公司地址',\n  'PC网站模板' => 'PC網站模板',\n  '将模板名称填写到此处' => '將模板名稱填寫到此處',\n  'WAP网站模板' => 'WAP網站模板',\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板' => '開啟了手機端，這個設置才會生效，否則調用電腦端模板',\n  '微信网站模板' => '微信網站模板',\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板' => '開啟了手機端，這個設置才會生效，否則調用電腦端模板。由於微信內有一些特殊的js，所以可以在這裡單獨設置微信模板',\n  '是否开启手机端' => '是否開啟手機端',\n  '如果不开启手机端，则默认调用电脑端模板' => '如果不開啟手機端，則默認調用電腦端模板',\n  '是否开启前台上传' => '是否開啟前台上傳',\n  '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。' => '關閉後，前台無法上傳文件。如果網站沒有使用會員，建議關閉前台上傳。',\n  '是否开启前台权限' => '是否開啟前台權限',\n  '开启后前台用户权限可以在后台控制' => '開啟後前台用戶權限可以在後台控制',\n  '缓存时间' => '緩存時間',\n  '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。' => '單位：分鐘，留空或0則不設置緩存。如果生成靜態文件，靜態文件清空後才生效。此設置與緩存完整頁面，模板緩存有關。',\n  '限制上传文件大小' => '限制上傳文件大小',\n  '0代表不限，单位kb' => '0代表不限，單位kb',\n  '允许上传文件类型' => '允許上傳文件類型',\n  '请用|分割，如：pdf|jpg|png' => '請用|分割，如：pdf|jpg|png',\n  '前台UEditor编辑器导航条配置' => '前台UEditor編輯器導航條配置',\n  '允许前台搜索的表' => '允許前台搜索的表',\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product' => '防止數據泄露,填寫允許發布模塊標識,留空表示不允許發布,多個表可用|分割,如：article|product',\n  '上传图片压缩比例' => '上傳圖片壓縮比例',\n  '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80' => '100%則不壓縮，如果PNG是透明圖，壓縮後背景變黑色。格式如：80',\n  'PNG是否压缩' => 'PNG是否壓縮',\n  'PNG压缩后容易变成背景黑色，关闭后，不会压缩。' => 'PNG壓縮後容易變成背景黑色，關閉後，不會壓縮。',\n  '邮件服务器' => '郵件伺服器',\n  'smtp.163.com,smtp.qq.com' => 'smtp.163.com,smtp.qq.com',\n  '邮件收发端口' => '郵件收發埠',\n  '163、126邮件端口(465)，QQ邮件端口(587)' => '163、126郵件埠(465)，QQ郵件埠(587)',\n  '收件人Email地址' => '收件人Email地址',\n  '发件人Email地址' => '發件人Email地址',\n  '指邮件服务器发件邮箱' => '指郵件伺服器發件郵箱',\n  '发件人Email秘钥' => '發件人Email秘鑰',\n  '这个秘钥不是登录密码' => '這個秘鑰不是登錄密碼',\n  '发件人昵称' => '發件人暱稱',\n  '发件邮箱会带一个昵称' => '發件郵箱會帶一個暱稱',\n  '客户订单通知' => '客戶訂單通知',\n  '购买商品的时候会发送的一条邮件信息' => '購買商品的時候會發送的一條郵件信息',\n  '订单出货通知' => '訂單出貨通知',\n  '发货的时候发送给客户的通知' => '發貨的時候發送給客戶的通知',\n  '订单运费' => '訂單運費',\n  '购物下单时会加上这个运费' => '購物下單時會加上這個運費',\n  '在线支付' => '在線支付',\n  '0关闭支付，1自主平台支付' => '0關閉支付，1自主平台支付',\n  '极致平台接口' => '極致平台接口',\n  '极致平台商户' => '極致平台商戶',\n  '极致平台应用appid' => '極致平台應用appid',\n  '极致平台应用秘钥' => '極致平台應用秘鑰',\n  '支付宝APPID' => '支付寶APPID',\n  '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID' => '帳戶中心->密鑰管理->開放平台密鑰，填寫添加了電腦網站支付的應用的APPID',\n  '支付宝key' => '支付寶key',\n  'MD5密钥，安全检验码，由数字和字母组成的32位字符串' => 'MD5密鑰，安全檢驗碼，由數字和字母組成的32位字符串',\n  '支付宝私钥' => '支付寶私鑰',\n  '支付宝公钥' => '支付寶公鑰',\n  '微信商户mchid' => '微信商戶mchid',\n  '支付相关' => '支付相關',\n  '微信商户key' => '微信商戶key',\n  '微信公众号appid' => '微信公眾號appid',\n  '微信公众号appsecret' => '微信公眾號appsecret',\n  '微信apiclient_cert' => '微信apiclient_cert',\n  '微信apiclient_key' => '微信apiclient_key',\n  '公众号appid' => '公眾號appid',\n  '用户登录相关，如果跟支付的一样，那就再填写一遍' => '用戶登錄相關，如果跟支付的一樣，那就再填寫一遍',\n  '公众号appsecret' => '公眾號appsecret',\n  '公众号token' => '公眾號token',\n  '公众号关注欢迎语' => '公眾號關注歡迎語',\n  '公众号关注时发送的第一句推送' => '公眾號關注時發送的第一句推送',\n  '网站LOGO' => '網站LOGO',\n  '后台模板风格' => '後台模板風格',\n  '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。' => '內頁彈窗：點擊新增/修改等操作，頁面是一個彈出層，更美觀。內嵌頁面：點擊新增/修改等操作，頁面直接進入新頁面，不會彈出層。',\n  '是否绑定多域名' => '是否綁定多域名',\n  '开启绑定多域名后，需要到插件中配置' => '開啟綁定多域名後，需要到插件中配置',\n  '网站SEO网址' => '網站SEO網址',\n  '一般不填，全局网址，最后不带/,如：http://www.xxx.com' => '一般不填，全局網址，最後不帶/,如：http://www.xxx.com',\n  '基本信息下扩展' => '基本信息下擴展',\n  '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下' => '新增欄位是否顯示在【基本信息】底部，默認在【擴展信息】下',\n  '订单超时' => '訂單超時',\n  '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制' => '按小時計算，超過該小時訂單過期，僅限於開啟支付後，0代表不限制',\n  '开启层级URL' => '開啟層級URL',\n  '默认关闭层级URL，开启后URL会按照父类层级展现' => '默認關閉層級URL，開啟後URL會按照父類層級展現',\n  '缓存完整页面' => '緩存完整頁面',\n  '前台完整页面缓存，结合缓存时间，可以提高访问速度' => '前台完整頁面緩存，結合緩存時間，可以提高訪問速度',\n  '自动生成静态HTML' => '自動生成靜態HTML',\n  '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面' => '前台訪問網站頁面，將自動生成靜態HTML，下次訪問直接進入靜態HTML頁面',\n  'PC静态文件目录' => 'PC靜態文件目錄',\n  '电脑端静态HTML存放目录，默认根目录[ / ]' => '電腦端靜態HTML存放目錄，默認根目錄[ / ]',\n  'WAP静态文件目录' => 'WAP靜態文件目錄',\n  '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱' => '手機端靜態HTML存放目錄，默認[ m ]，PC和WAP靜態目錄不能相同，否則文件會混亂',\n  '是否留言自动审核' => '是否留言自動審核',\n  '开启后，留言自动审核（显示）' => '開啟後，留言自動審核（顯示）',\n  '是否评论自动审核' => '是否評論自動審核',\n  '开启后评论自动审核（显示）' => '開啟後評論自動審核（顯示）',\n  '网站敏感词过滤' => '網站敏感詞過濾',\n  '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容' => '將敏感詞放到裡面，用「,」分隔，用{xxx}代替通配內容',\n  '是否开启水印' => '是否開啟水印',\n  '开启水印需要上传水印图片' => '開啟水印需要上傳水印圖片',\n  '水印图片' => '水印圖片',\n  '水印图片在250px以内' => '水印圖片在250px以內',\n  '水印位置' => '水印位置',\n  '参考键盘九宫格1-9' => '參考鍵盤九宮格1-9',\n  '水印透明度' => '水印透明度',\n  '透明度越大，越难看清楚水印' => '透明度越大，越難看清楚水印',\n  '钱包兑换率' => '錢包兌換率',\n  '站内钱包与RMB的兑换率，即1元=多少金币' => '站內錢包與RMB的兌換率，即1元=多少金幣',\n  '积分兑换率' => '積分兌換率',\n  '站内积分与RMB的兑换率，即1元=多少积分' => '站內積分與RMB的兌換率，即1元=多少積分',\n  '积分支付' => '積分支付',\n  '开启积分支付后，商品可以用积分支付' => '開啟積分支付後，商品可以用積分支付',\n  '开启钱包支付后，商品可以用钱包支付' => '開啟錢包支付後，商品可以用錢包支付',\n  '开启微信支付后，商品可以用微信支付' => '開啟微信支付後，商品可以用微信支付',\n  '开启支付宝支付后，商品可以用支付宝支付' => '開啟支付寶支付後，商品可以用支付寶支付',\n  '每次登录奖励' => '每次登錄獎勵',\n  '每天登录奖励积分数，最小为0，每天登录只奖励一次' => '每天登錄獎勵積分數，最小為0，每天登錄只獎勵一次',\n  '开启登录奖励后，登录后就会获得积分奖励' => '開啟登錄獎勵後，登錄後就會獲得積分獎勵',\n  '开启后，发布内容会奖励积分' => '開啟後，發布內容會獎勵積分',\n  '每次发布奖励' => '每次發布獎勵',\n  '每次发布内容奖励积分数' => '每次發布內容獎勵積分數',\n  '每天发布最高奖励' => '每天發布最高獎勵',\n  '每天奖励不超过积分上限，设置0则无上限' => '每天獎勵不超過積分上限，設置0則無上限',\n  '开启后，发布内容被收藏会奖励积分' => '開啟後，發布內容被收藏會獎勵積分',\n  '每次收藏奖励' => '每次收藏獎勵',\n  '每次发布内容被收藏奖励积分数' => '每次發布內容被收藏獎勵積分數',\n  '每天收藏最高奖励' => '每天收藏最高獎勵',\n  '开启后，发布内容被点赞会奖励积分' => '開啟後，發布內容被點讚會獎勵積分',\n  '每次点赞奖励' => '每次點讚獎勵',\n  '每次发布内容被点赞奖励积分数' => '每次發布內容被點讚獎勵積分數',\n  '每天点赞最高奖励' => '每天點讚最高獎勵',\n  '开启后，发布内容被评论会奖励积分' => '開啟後，發布內容被評論會獎勵積分',\n  '每次评论奖励' => '每次評論獎勵',\n  '每次发布内容被评论奖励积分数' => '每次發布內容被評論獎勵積分數',\n  '每天评论最高奖励' => '每天評論最高獎勵',\n  '开启后，用户被粉丝关注会奖励积分' => '開啟後，用戶被粉絲關注會獎勵積分',\n  '每次关注奖励' => '每次關注獎勵',\n  '每次被关注奖励积分数' => '每次被關注獎勵積分數',\n  '每天关注最高奖励' => '每天關注最高獎勵',\n  '每天关注奖励不超过积分上限，设置0则无上限' => '每天關注獎勵不超過積分上限，設置0則無上限',\n  '发送邮件' => '發送郵件',\n  '是否开启邮件发送' => '是否開啟郵件發送',\n  '关闭网站' => '關閉網站',\n  '关闭网站后，前台无法访问，后台可以进入' => '關閉網站後，前台無法訪問，後台可以進入',\n  '关站提示' => '關站提示',\n  '后台文件存储路径' => '後台文件存儲路徑',\n  '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]' => '默認static/upload/{yyyy}/{mm}/{dd}，存儲路徑相對於根目錄，最後不能帶斜槓[ / ]',\n  '前台文件存储路径' => '前台文件存儲路徑',\n  '是否开启前台AJAX' => '是否開啟前台AJAX',\n  '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据' => '開啟後AJAX，前台可以通過欄目連結+ajax=1獲取JSON數據',\n  '自动生成sitemap' => '自動生成sitemap',\n  '开启后，前台访问每天会自动生成1次sitemap' => '開啟後，前台訪問每天會自動生成1次sitemap',\n  '是否开启邀请奖励' => '是否開啟邀請獎勵',\n  '开启邀请后则会奖励' => '開啟邀請後則會獎勵',\n  '邀请奖励类型' => '邀請獎勵類型',\n  '邀请奖励数量' => '邀請獎勵數量',\n  '网站手机' => '網站手機',\n  '站长微信' => '站長微信',\n  '开启多图描述' => '開啟多圖描述',\n  '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)' => '開啟後圖集每張圖可以添加描述，注意模板輸出需要更改輸出方式！(附件同理)',\n  '前台用户注册' => '前台用戶註冊',\n  '关闭前台注册后，前台无法进入注册页面' => '關閉前台註冊後，前台無法進入註冊頁面',\n  '仅邀请码注册' => '僅邀請碼註冊',\n  '开启后，必须通过邀请链接才能注册！' => '開啟後，必須通過邀請連結才能註冊！',\n  '允许前台发布模块' => '允許前台發布模塊',\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '防止數據泄露,填寫允許發布模塊標識,留空表示不允許發布,多個表可用|分割',\n  '前台搜索的字段' => '前台搜索的欄位',\n  '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '可以設置搜索表中的相關欄位進行模糊查詢,多個欄位可用|分割',\n  '前台验证码' => '前台驗證碼',\n  '关闭后，登录注册不需要验证码' => '關閉後，登錄註冊不需要驗證碼',\n  '后台验证码' => '後台驗證碼',\n  '关闭后，后台管理员登录不需要验证码' => '關閉後，後台管理員登錄不需要驗證碼',\n  'TAG包含模型' => 'TAG包含模型',\n  '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product' => '在tag列表上查詢的相關模型,多個模型標識可用|分割,如：article|product',\n  '支付配置' => '支付配置',\n  '前台多模块搜索的字段' => '前台多模塊搜索的欄位',\n  '多个模块直接必须都有相同的字段，否则会报错' => '多個模塊直接必須都有相同的欄位，否則會報錯',\n  '多模块允许搜索的表' => '多模塊允許搜索的表',\n  '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product' => '防止數據泄露,填寫允許搜索的表名,留空表示不允許搜索,多個表可用|分割,如：article|product',\n  '允许查询显示的字段' => '允許查詢顯示的欄位',\n  '多模块搜索允许查询显示的字段' => '多模塊搜索允許查詢顯示的欄位',\n  '前台编辑器设置' => '前台編輯器設置',\n  '前台的编辑器功能菜单设置' => '前台的編輯器功能菜單設置',\n  'PHP调试' => 'PHP調試',\n  '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。' => '測試環境，開啟調試，提示錯誤，實時更新模板。正式上線，請關閉調試，打開頁面更快。',\n  '前台SESSION' => '前台SESSION',\n  '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭' => '關閉前台SESSION後，前台會員模塊無法使用，但是可以減少session緩存文件。純內容網站可以開啟，使用會員支付等必須關閉',\n  '留言验证码' => '留言驗證碼',\n  '开启后，前台留言需要填写验证码' => '開啟後，前台留言需要填寫驗證碼',\n  '前台发布审核' => '前台發布審核',\n  '开启后需要后台审核，关闭则不需要' => '開啟後需要後台審核，關閉則不需要',\n  '公共权限' => '公共權限',\n  '前台网站' => '前台網站',\n  '会员登录' => '會員登錄',\n  '会员评论' => '會員評論',\n  '网站筛选' => '網站篩選',\n  '会员下单' => '會員下單',\n  '网站支付' => '網站支付',\n  '极致支付' => '極致支付',\n  '微信模块' => '微信模塊',\n  '验证码生成' => '驗證碼生成',\n  '检查是否登录' => '檢查是否登錄',\n  '多附件上传' => '多附件上傳',\n  '单附件上传' => '單附件上傳',\n  '二维码生成' => '二維碼生成',\n  '获取扩展信息' => '獲取擴展信息',\n  '链接错误提示' => '連結錯誤提示',\n  '报错提示' => '報錯提示',\n  '网站内容' => '網站內容',\n  '详情内容' => '詳情內容',\n  '网站搜索' => '網站搜索',\n  '网站多模块搜索' => '網站多模塊搜索',\n  '开启网站缓存' => '開啟網站緩存',\n  '输出缓存' => '輸出緩存',\n  '个人中心首页' => '個人中心首頁',\n  '会员资料' => '會員資料',\n  '订单记录' => '訂單記錄',\n  '订单支付' => '訂單支付',\n  '删除订单' => '刪除訂單',\n  '上传头像' => '上傳頭像',\n  '删除评论' => '刪除評論',\n  '点赞文章' => '點讚文章',\n  '点赞列表' => '點讚列表',\n  '收藏文章' => '收藏文章',\n  '收藏列表' => '收藏列表',\n  '删除收藏' => '刪除收藏',\n  '购物车' => '購物車',\n  '添加购物车' => '添加購物車',\n  '删除购物车' => '刪除購物車',\n  '发布管理' => '發布管理',\n  '会员发布' => '會員發布',\n  '删除发布' => '刪除發布',\n  '会员上传附件' => '會員上傳附件',\n  '404提示' => '404提示',\n  '关注用户' => '關注用戶',\n  '取消关注' => '取消關注',\n  '粉丝列表' => '粉絲列表',\n  '消息提醒' => '消息提醒',\n  '查看消息' => '查看消息',\n  '删除消息' => '刪除消息',\n  '公共主页' => '公共主頁',\n  '消息提醒设置' => '消息提醒設置',\n  '获取栏目列表' => '獲取欄目列表',\n  '用户钱包' => '用戶錢包',\n  '交易详情' => '交易詳情',\n  '登录首页' => '登錄首頁',\n  '注册页面' => '註冊頁面',\n  '忘记密码' => '忘記密碼',\n  '未登录页面' => '未登錄頁面',\n  '退出登录' => '退出登錄',\n  '发送留言' => '發送留言',\n  '发表评论' => '發表評論',\n  '筛选列表' => '篩選列表',\n  '创建订单' => '創建訂單',\n  'TAG标签列表' => 'TAG標籤列表',\n  '会员' => '會員',\n  '订单' => '訂單',\n  '评论' => '評論',\n  '留言' => '留言',\n  '轮播图' => '輪播圖',\n  '友情链接' => '友情連結',\n  'TAG' => 'TAG',\n  '单页' => '單頁',\n  '用户评价' => '用戶評價',\n  '添加会员' => '添加會員',\n  '修改会员' => '修改會員',\n  '删除会员' => '刪除會員',\n  '修改状态' => '修改狀態',\n  '内容管理' => '內容管理',\n  '内容列表' => '內容列表',\n  '添加内容' => '添加內容',\n  '修改内容' => '修改內容',\n  '删除内容' => '刪除內容',\n  '复制内容' => '複製內容',\n  '修改评论' => '修改評論',\n  '修改留言' => '修改留言',\n  '删除留言' => '刪除留言',\n  '字段列表' => '欄位列表',\n  '删除字段' => '刪除欄位',\n  '获取字段' => '獲取欄位',\n  '基本功能' => '基本功能',\n  '系统界面' => '系統界面',\n  '数据库备份' => '資料庫備份',\n  '数据库还原' => '資料庫還原',\n  '数据库删除' => '資料庫刪除',\n  '系统功能' => '系統功能',\n  '栏目管理' => '欄目管理',\n  '栏目列表' => '欄目列表',\n  '新增栏目' => '新增欄目',\n  '修改栏目' => '修改欄目',\n  '删除栏目' => '刪除欄目',\n  '修改排序' => '修改排序',\n  '栏目隐藏' => '欄目隱藏',\n  '新增角色' => '新增角色',\n  '修改角色' => '修改角色',\n  '删除角色' => '刪除角色',\n  '角色状态' => '角色狀態',\n  '新增管理员' => '新增管理員',\n  '修改管理员' => '修改管理員',\n  '管理员状态' => '管理員狀態',\n  '删除管理员' => '刪除管理員',\n  '模型列表' => '模型列表',\n  '删除模型' => '刪除模型',\n  '新增权限' => '新增權限',\n  '修改权限' => '修改權限',\n  '删除权限' => '刪除權限',\n  '桌面设置' => '桌面設置',\n  '新增桌面' => '新增桌面',\n  '修改桌面' => '修改桌面',\n  '删除桌面' => '刪除桌面',\n  '图标库' => '圖標庫',\n  '模块扩展' => '模塊擴展',\n  '删除轮播图' => '刪除輪播圖',\n  '复制轮播图' => '複製輪播圖',\n  '批量删除轮播图' => '批量刪除輪播圖',\n  '新增轮播图分类' => '新增輪播圖分類',\n  '修改轮播图分类' => '修改輪播圖分類',\n  '删除轮播图分类' => '刪除輪播圖分類',\n  '新增友链' => '新增友鏈',\n  '修改友链' => '修改友鏈',\n  '复制友链' => '複製友鏈',\n  '删除友链' => '刪除友鏈',\n  '批量删除友链' => '批量刪除友鏈',\n  '通用模块' => '通用模塊',\n  '更新cookie' => '更新cookie',\n  '商品管理' => '商品管理',\n  '商品列表' => '商品列表',\n  '修改商品' => '修改商品',\n  '删除商品' => '刪除商品',\n  '复制商品' => '複製商品',\n  '登录日志' => '登錄日誌',\n  '新增分组' => '新增分組',\n  '修改分组' => '修改分組',\n  '更改分组状态' => '更改分組狀態',\n  '删除分组' => '刪除分組',\n  '会员权限' => '會員權限',\n  '修改分组排序' => '修改分組排序',\n  '上传支付证书' => '上傳支付證書',\n  '更改状态' => '更改狀態',\n  '安装卸载' => '安裝卸載',\n  '删除图库图片' => '刪除圖庫圖片',\n  '批量删除图库' => '批量刪除圖庫',\n  '微信公众号' => '微信公眾號',\n  '公众号菜单' => '公眾號菜單',\n  '公众号素材' => '公眾號素材',\n  '模板制作' => '模板製作',\n  '获取首字母拼音' => '獲取首字母拼音',\n  '批量新增栏目' => '批量新增欄目',\n  '自定义配置删除' => '自定義配置刪除',\n  'TAG列表' => 'TAG列表',\n  '新增TAG' => '新增TAG',\n  '修改TAG' => '修改TAG',\n  '复制TAG' => '複製TAG',\n  '删除TAG' => '刪除TAG',\n  '批量删除TAG' => '批量刪除TAG',\n  '生成静态文件' => '生成靜態文件',\n  '更新栏目HTML' => '更新欄目HTML',\n  '更新模块HTML' => '更新模塊HTML',\n  '批量修改推荐属性' => '批量修改推薦屬性',\n  '批量修改友链栏目' => '批量修改友鏈欄目',\n  '批量修改TAG栏目' => '批量修改TAG欄目',\n  '批量复制友链' => '批量複製友鏈',\n  '批量复制TAG' => '批量複製TAG',\n  '批量修改友链排序' => '批量修改友鏈排序',\n  '批量修改TAG排序' => '批量修改TAG排序',\n  '高级设置' => '高級設置',\n  '邮箱订单' => '郵箱訂單',\n  '公众号配置' => '公眾號配置',\n  '批量审核友链' => '批量審核友鏈',\n  '批量审核TAG' => '批量審核TAG',\n  '手动充值' => '手動充值',\n  '删除记录' => '刪除記錄',\n  '批量删除记录' => '批量刪除記錄',\n  '积分配置' => '積分配置',\n  '插件更新' => '插件更新',\n  '获取栏目模板' => '獲取欄目模板',\n  '友链分类' => '友鏈分類',\n  '新增友链分类' => '新增友鏈分類',\n  '修改友链分类' => '修改友鏈分類',\n  '删除友链分类' => '刪除友鏈分類',\n  '导航设置' => '導航設置',\n  '删除导航' => '刪除導航',\n  '碎片化' => '碎片化',\n  '删除碎片' => '刪除碎片',\n  '预览SQL' => '預覽SQL',\n  '搜索配置' => '搜索配置',\n  '修改字段属性' => '修改欄位屬性',\n  '新增推荐属性' => '新增推薦屬性',\n  '删除推荐属性' => '刪除推薦屬性',\n  '列表设置' => '列表設置',\n  '获取列表字段' => '獲取列表欄位',\n  '内链模块' => '內鏈模塊',\n  '内链列表' => '內鏈列表',\n  '新增内链' => '新增內鏈',\n  '删除内链' => '刪除內鏈',\n  '删除数据' => '刪除數據',\n  '模板更新' => '模板更新',\n  '用户评价列表' => '用戶評價列表',\n  '新增用户评价' => '新增用戶評價',\n  '修改用户评价' => '修改用戶評價',\n  '复制用户评价' => '複製用戶評價',\n  '删除用户评价' => '刪除用戶評價',\n  '批量删除用户评价' => '批量刪除用戶評價',\n  '批量修改用户评价栏目' => '批量修改用戶評價欄目',\n  '批量复制用户评价' => '批量複製用戶評價',\n  '批量修改用户评价列表' => '批量修改用戶評價列表',\n  '批量审核用户评价' => '批量審核用戶評價',\n  '基本设置' => '基本設置',\n  '邮件订单' => '郵件訂單',\n  '非超级管理员无法设置！' => '非超級管理員無法設定！',\n  '你确定要还原吗？' => '你確定要還原嗎？',\n  '重复！' => '重複！',\n    '创建成功！' => '創建成功！',\n    '正在创建sitemap，请勿关闭浏览器！'=>'正在創建sitemap，請勿關閉瀏覽器！',\n); ?>"
  },
  {
    "path": "app/admin/lang/common.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/09/10\n// +----------------------------------------------------------------------\n\n\n/**\n\t\n\t公共语言包\n\t\n\t如果系统有多个语言包，但是有些部分是一样的、重复的，可以放到这里存放，减少重复内容\n\t如果当前语言包里有同个字符，但是内容不同，公共语言包里的内容将被覆盖\n\n**/\n\nreturn [\n\t\n\t\n];"
  },
  {
    "path": "app/admin/lang/en.php",
    "content": "<?php\nreturn array(\n    '该角色下存在用户，请先移除用户再删除！' =>'There are users under this role,please remove the users before deleting',\n    '删除失败，该分组不允许删除！' => 'Delete failed,this group is not allowed to be deleted!',\n    '删除成功！' => 'Delete successful!',\n    '删除失败，请重试！' => 'Delete failed,please try again!',\n    '非法操作！' => 'Illegal operation!',\n    '修改失败，您的权限不足！' => 'Modification failed,you do not have enough permissions!',\n    '修改成功！' => 'Modification successful!',\n    '修改失败，请重新提交！' => 'Modification failed,please resubmit!',\n    '没有该角色！' => 'Role does not exist!',\n    '新增成功！' => 'Addition successful!',\n    '新增失败，请重新提交！' => 'Addition failed,please resubmit!',\n    '修改失败，该分组不允许修改！' => 'Modification failed,this group is not allowed to be modified!',\n    '您没有权限操作！' => 'You do not have permission to operate!',\n    '两次密码不同！' => 'The passwords do not match!',\n    '手机号已被注册！' => 'The phone number has been registered!',\n    '昵称已被使用！' => 'The nickname has been used!',\n    '邮箱已被使用！' => 'The email has been used!',\n    '修改失败！' => 'Modification failed!',\n    '新增失败！' => 'Addition failed!',\n    '系统管理员不能删除！' => 'System administrators cannot be deleted!',\n    '删除失败！' => 'Delete failed!',\n    '批量操作失败！' => 'Batch operation failed!',\n    '批量删除成功！' => 'Batch delete successful!',\n    '添加失败' => 'Addition failed',\n    '存在敏感词' => 'Sensitive words exist',\n    '已存在相同的自定义URL！' => 'The same custom URL already exists!',\n    '添加成功,继续添加~' => 'Addition successful,continue to add~',\n    '内容配置' => 'Content configuration',\n    '修改失败' => 'Modification failed',\n    '发布奖励' => 'Publish rewards',\n    '您未做任何修改，不能提交！' => 'You have not made any changes,cannot submit!',\n    '复制成功！' => 'Copy successful!',\n    '复制失败！' => 'Copy failed!',\n    '批量复制成功！' => 'Batch copy successful!',\n    '批量修改成功！' => 'Batch modification successful!',\n    '批量操作成功！' => 'Batch operation successful!',\n    'URL链接命名不能是' => 'URL link name cannot be',\n    '非法URL' => 'Illegal URL',\n    '添加栏目成功，继续添加~' => 'Column added successfully,continue to add~',\n    '模型错误！' => 'Model error!',\n    '不能选择当前栏目及下级为顶级栏目' => 'Cannot select the current column and its sub-column as the top-level column',\n    '该栏目有子栏目，请先删除子栏目！' => 'This column has sub-columns,please delete the sub-columns first!',\n    '栏目不能为空！' => 'Column cannot be empty!',\n    '操作成功！' => 'Operation successful!',\n    '请选择分类！' => 'Please select a category!',\n    '添加成功！继续添加~' => 'Addition successful! Continue to add~',\n    '添加失败！' => 'Addition failed!',\n    '该分类下存在内容，请先删除该分类下的内容！' => 'There is content under this category,please delete this category first',\n    '添加成功！' => 'Addition successful!',\n    '已审核' => 'Reviewed',\n    '被删除' => 'Deleted',\n    '未审核' => 'Not reviewed',\n    '已读' => 'Read',\n    '未读' => 'Unread',\n    '批量审核成功！' => 'Batch review successful!',\n    '批量审核失败！' => 'Batch review failed!',\n    '您没有权限！' => 'You do not have permission!',\n    '文件类型不允许上传！' => 'File type is not allowed to upload!',\n    '文件大小超过网站内部限制！' => 'File size exceeds the internal limit of the website!',\n    '请检查目录写入权限' => 'Please check directory write permissions',\n    '错误信息提示' => 'Error message prompt',\n    '模块为空，请选择模块！' => 'Module is empty,please select a module!',\n    '缺少ID' => 'ID is missing',\n    '请选择模块！' => 'Please select a module!',\n    '显示' => 'Show',\n    '隐藏' => 'Hide',\n    '是' => 'Yes',\n    '否' => 'No',\n    '单行文本' => 'Single-line text',\n    '多行文本' => 'Multi-line text',\n    '文本编辑器' => 'Text editor',\n    '数字' => 'Number',\n    '单图片' => 'Single image',\n    '多图片' => 'Multiple images',\n    '单选下拉' => 'Single selection dropdown',\n    '多选' => 'Multiple selections',\n    '单附件' => 'Single attachment',\n    '多附件' => 'Multiple attachments',\n    '时间戳' => 'Timestamp',\n    '单选按钮' => 'Radio button',\n    '单选关联' => 'Single selection association',\n    '小数' => 'Decimal',\n    '多行录入' => 'Multi-line entry',\n    '多选关联' => 'Multiple selection association',\n    '栏目' => 'Column',\n    '副栏目' => 'Sub-column',\n    '系统TAG' => 'System TAG',\n    '字段名和字段标识不能为空！' => 'Field name and field identifier cannot be empty!',\n    '字段标识已存在！' => 'Field identifier already exists!',\n    '系统保护字段，不允许创建！' => 'System protected field,creation not allowed!',\n    '字段长度不对！' => 'Field length is incorrect!',\n    '字段长度不对,时间属性必须长度为11' => 'Field length is incorrect,the length of the time attribute must be 11',\n    '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => 'Field length is incorrect,decimal field length format [integer digits,decimal digits]',\n    '字段创建成功，但是字段表记录失败，请反馈官方解决！' => 'Field creation successful,but failed to record in the field table,please report to the official for resolution!',\n    '字段创建成功！' => 'Field creation successful!',\n    '字段修改成功！' => 'Field modification successful!',\n    '字段修改失败！' => 'Field modification failed!',\n    '上传图片' => 'Upload image',\n    '选择图片' => 'Select image',\n    '图片未找到' => 'Image not found',\n    '删除这张图片' => 'Delete this image',\n    '删除' => 'Delete',\n    '上传异常！' => 'Upload exception!',\n    '文字描述' => 'Text description',\n    '左移' => 'Move left',\n    '右移' => 'Move right',\n    '请选择' => 'Please select',\n    '上传附件' => 'Upload attachment',\n    '字段关联绑定失败，请重新绑定！' => 'Field association binding failed,please rebind',\n    '请选择关联项' => 'Please select an association item',\n    'TAG标签' => 'TAG label',\n    '按Enter回车自动添加' => 'Press Enter to automatically add',\n    '添加一个标签' => 'Add a tag',\n    '系统字段不允许删除！' => 'System fields are not allowed to be deleted!',\n    '请选择字段！' => 'Please select a field!',\n    '请选择栏目！' => 'Please select a column!',\n    '参数有误！' => 'Parameter error!',\n    '请选择桌面配置！' => 'Please select a desktop configuration!',\n    '系统默认不可删除！' => 'System default cannot be deleted!',\n    '网站地图创建成功！' => 'Site map created successfully!',\n    '网站地图创建失败，请检查根目录权限！' => 'Site map creation failed,please check root directory permissions!',\n    '清除失败！' => 'Clear failed!',\n    '清除成功！' => 'Clear successful!',\n    '生成失败！' => 'Generation failed!',\n    '生成成功！' => 'Generation successful!',\n    '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~' => 'Part of the pages have been cleaned,please do not close the current',\n    '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~' => 'Part of the pages have been generated,please do not close the current page,HTML generation needs to continue~',\n    '静态HTML页面已全部清理完毕！' => 'All static HTML pages have been cleaned!',\n    '总共清理页面数：' => 'Total pages cleaned:',\n    '每次清理页面数：' => 'Pages cleaned each time:',\n    '停顿时间：' => 'Pause time:',\n    '开始时间：' => 'Start time:',\n    '结束时间：' => 'End time:',\n    '总共花费时间：' => 'Total time spent:',\n    '总共生成页面数：' => 'Total pages generated:',\n    '每次生成页面数：' => 'Pages generated each time:',\n    '系统创建目录失败!' => 'System failed to create directory!',\n    '模块未绑定栏目，无法生存HTML！' => 'Module not bound to column,cannot generate HTML!',\n    '链接错误！' => 'Link error!',\n    '请输入属性名称！' => 'Please enter an attribute name!',\n    '属性已存在！' => 'Attribute already exists!',\n    '参数错误！' => 'Parameter error!',\n    '系统属性只允许修改和隐藏，不允许删除！' => 'System attributes can only be modified and hidden,not allowed',\n    '请输入内链词！' => 'Please enter an internal link word!',\n    '请输入内链！' => 'Please enter an internal link!',\n    '内链词已存在！' => 'Internal link word already exists!',\n    '已审' => 'Reviewed',\n    '退回' => 'Returned',\n    '未审' => 'Not reviewed',\n    '账户密码不能为空！' => 'Account password cannot be empty!',\n    '验证码错误！' => 'Verification code error!',\n    '该账户已被封禁！' => 'This account has been banned!',\n    '登录成功！' => 'Login successful!',\n    '账户密码错误！' => 'Account password error!',\n    '安全退出~' => 'Secure logout~',\n    '无' => 'None',\n    '不显示' => 'Do not display',\n    '邮箱已被注册！' => 'Email has been registered!',\n    '添加失败，请重新提交！' => 'Addition failed,please resubmit!',\n    '没有找到该用户！' => 'User not found!',\n    '该分组下存在用户，请先移除用户再删除！' => 'There are users under this group,please remove the users before deleting!',\n    '删除失败，该分类有下级功能，请先删除下级功能！' => 'Delete failed,this category has sub-functions,please delete the sub-functions first!',\n    '未选择删除对象！' => 'No deletion object selected!',\n    '模块名和标识不能为空！' => 'Module name and identifier cannot be empty!',\n    '模型已添加不能重复添加！' => 'Model has been added,cannot be added again!',\n    '该表已存在！' => 'This table already exists!',\n    '标题' => 'Title',\n    '默认为空' => 'Default is empty',\n    '所属栏目' => 'Belonging column',\n    '选择栏目' => 'Select column',\n    '绑定后可以在当前模型的其他栏目中显示' => 'After binding,it can be used in other columns of the current model',\n    '关键词' => 'Keywords',\n    '每个词用英文逗号(,)拼接' => 'Each word is separated by a comma (,)',\n    '缩略图' => 'Thumbnail',\n    '可留空' => 'Can be left blank',\n    '简介' => 'Introduction',\n    '内容' => 'Content',\n    '发布会员' => 'Publishing member',\n    '前台发布会员ID记录' => 'Frontend publishing member ID record',\n    '管理员' => 'Administrator',\n    '后台发布管理员ID记录' => 'Backend publishing administrator ID record',\n    '外链URL' => 'External link URL',\n    '默认为空，系统访问内容则直接跳转到此链接' => 'Default is empty,the system will redirect to this URL when accessing the content',\n    '自定义URL' => 'Custom URL',\n    '默认为空，自定义URL' => 'Default is empty,custom URL',\n    '点击量' => 'Click count',\n    '系统自动添加' => 'System automatically adds',\n    '评论数' => 'Comment count',\n    '系统自带' => 'System built-in',\n    '点赞数' => 'Like count',\n    '排序' => 'Sort',\n    '添加时间' => 'Addition time',\n    '选择时间' => 'Select time',\n    '推荐属性' => 'Recommended attributes',\n    '1置顶2热点3推荐' => '1 top 2 hot 3 recommend',\n    '置顶=1,热点=2,推荐=3' => 'Top = 1,Hot = 2,Recommend = 3',\n    '是否显示' => 'Whether to display',\n    '显示隐藏' => 'Display hide',\n    '显示=1,未审=0,退回=2' => 'Display = 1,Not reviewed = 0,Returned = 2',\n    '列表' => 'List',\n    '新增' => 'Add',\n    '修改' => 'Modify',\n    '复制' => 'Copy',\n    '批量删除' => 'Batch delete',\n    '批量修改' => 'Batch modify',\n    '批量复制' => 'Batch copy',\n    '批量审核' => 'Batch review',\n    '管理' => 'Manage',\n    '新增模型成功，快去创建对应的栏目吧！' => 'New model added successfully,go create',\n    '新增模型成功，快去设置表字段吧！' => 'New model added successfully,go set up table fields!',\n    '新增模型失败！' => 'New model addition failed!',\n    '标识不能为空！' => 'Identifier cannot be empty!',\n    '系统模型标识不允许修改！' => 'System model identifier cannot be modified!',\n    '页面有错误，缺少模块ID！' => 'There is an error on the page,missing module ID!',\n    '里面存在数据，请先清空表内数据！' => 'There is data in the table,please clear the data first!',\n    '是系统模型，不允许删除！' => 'It is a system model,deletion is not allowed!',\n    '字段表记录未清除，请手动清除！' => 'Field table records not cleared,please clear manually!',\n    '模型' => 'Model',\n    '用户' => 'User',\n    '栏目链接' => 'Column link',\n    '外链' => 'External link',\n    '自定义链接' => 'Custom link',\n    '发布时间' => 'Release time',\n    '字段名称不能为空！' => 'Field name cannot be empty!',\n    '显示=1,隐藏=0' => 'Display = 1,Hide = 0',\n    '显示=1,隐藏=0,退回=2' => 'Display = 1,Hide = 0,Return = 2',\n    '是=1,否=0' => 'Yes = 1,No = 0',\n    '重构成功！' => 'Reconstruction successful!',\n    '系统栏目' => 'System column',\n    '系统副栏目' => 'System sub-column',\n    '模型标识' => 'Model identifier',\n    '发布管理员' => 'Publishing administrator',\n    '前台用户' => 'Frontend user',\n    '待付款' => 'Pending payment',\n    '已付' => 'Paid',\n    '超时' => 'Timed out',\n    '待审核待支付' => 'Pending review pending payment',\n    '已发货' => 'Shipped',\n    '已废弃' => 'Discarded',\n    '未付' => 'Unpaid',\n    '您的订单发货通知' => 'Your order shipping notification',\n    '尊敬的' => 'Dear',\n    '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！' => 'Your order has been shipped,these days',\n    '订单详细信息如下：' => 'Order details are as follows:',\n    '主图' => 'Main image',\n    '价格' => 'Price',\n    '购买数量' => 'Purchase quantity',\n    '总价' => 'Total price',\n    '折扣：' => 'Discount:',\n    '元' => 'Yuan',\n    '运费：' => 'Shipping cost:',\n    '￥' => '￥',\n    '合计：' => 'Total:',\n    '收件地址：' => 'Recipient address:',\n    '联系电话：' => 'Contact number:',\n    '钱包' => 'Wallet',\n    '积分' => 'Points',\n    '充值' => 'Recharge',\n    '兑换' => 'Exchange',\n    '奖励' => 'Reward',\n    '该用户不存在！' => 'This user does not exist!',\n    '充值数量不对！' => 'Recharge quantity is incorrect!',\n    '操作失败！' => 'Operation failed!',\n    '插件配置' => 'Plugin configuration',\n    '未分类' => 'Uncategorized',\n    '商品配置' => 'Product configuration',\n    '批量复制失败！' => 'Batch copy failed!',\n    '部分未执行成功！' => 'Some were not executed successfully!',\n    '还原失败，可能是ID已经存在！' => 'Restore failed,the ID may already exist!',\n    '数据不存在！' => 'Data does not exist!',\n    '删除失败，系统功能不能删除！' => 'Delete failed,system functions cannot be deleted!',\n    '配置栏下有自定义配置，无法删除配置栏' => 'There are custom configurations under the configuration bar,unable to delete the configuration bar',\n    '已存在配置标识，请重新设置！' => 'Configuration identifier already exists,please reset!',\n    '提交成功！' => 'Submission successful! We will get',\n    '删除失败！系统字段不允许删除！' => 'Delete failed! System fields are not allowed to be deleted!',\n    '图片不存在，删除失败！' => 'Image does not exist,delete failed!',\n    '远程存储图片无法删除！' => 'Remote storage image cannot be deleted!',\n    '图片ID错误！' => 'Image ID error!',\n    '部分删除成功，存在远程链接无法删除！' => 'Partial deletion successful,remote links cannot be deleted!',\n    '非法操作' => 'Illegal operation',\n    '请检查目录' => 'Please check the directory',\n    '写入权限' => 'Write permissions',\n    '配置成功！' => 'Configuration successful!',\n    '参数存在安全隐患！' => 'Parameters have security risks!',\n    '参数错误,必须携带插件ID！' => 'Parameter error,must carry plugin ID!',\n    '发生错误' => 'An error occurred',\n    '下载缓存文件不存在！' => 'Download cache file does not exist!',\n    '请选择使用场景！' => 'Please select usage scenario!',\n    '执行插件安装程序失败！' => 'Execution of plugin installation program failed!',\n    '安装成功！' => 'Installation successful!',\n    '备份成功！' => 'Backup successful!',\n    '该插件暂无更新！' => 'This plugin has no updates!',\n    '参数错误,请选择对应模板！' => 'Parameter error,please select the corresponding template!',\n    '文件不存在！' => 'File does not exist!',\n    '解压失败！' => 'Unzip failed!',\n    '数据库中没有表!' => 'No tables in the database!',\n    '写入文件失败！' => 'Failed to write file!',\n    ' 写入文件失败！' => 'Failed to write file!',\n    '解压完毕！本次解压花费' => 'Unzipping complete! This unzipping took',\n    '秒' => 'Seconds',\n    '更新成功！' => 'Update successful!',\n    '个人中心' => 'Personal center',\n    '测试1' => 'Test1',\n    '测试2' => 'Test2',\n    '测试3' => 'Test3',\n    '接口报错' => 'Interface error',\n    '微信配置错误！' => 'WeChat configuration error!',\n    '网站首页' => 'Website homepage',\n    '首页' => 'Home',\n    '碎片化管理' => 'Fragment management',\n    '新增碎片' => 'Add fragment',\n    '刷新' => 'Refresh',\n    '基本信息' => 'Basic information',\n    '使用说明' => 'Instructions for use',\n    '指定几个id或者几个tid的内容输出' => 'Specify several IDs or several TIDs',\n    'SQL中输入' => 'Enter in SQL',\n    '或者' => 'Or',\n    '模糊查询，查询标题跟 “网站建设” 相关的内容' => 'Fuzzy query,query title and',\n    '网站建设' => 'Website construction',\n    '模糊查询，查询标题/内容跟 “网站建设” 相关的内容' => 'Fuzzy query,query title/content and',\n    '不支持联表查询' => 'Joint table queries are not supported',\n    '注意字符串都要使用英文单引号' => 'Note that strings must use single quotation marks in English',\n    '如' => 'Such as',\n    '碎片名称' => 'Fragment name',\n    '碎片标识' => 'Fragment identifier',\n    '建议英文，不要重复' => 'Suggest English,do not repeat',\n    '不限栏目' => 'Unlimited column',\n    '子栏目包含' => 'Include sub-columns',\n    '包含' => 'Include',\n    '不包含' => 'Do not include',\n    '输出条数' => 'Output number of items',\n    '0表示输出所有' => '0 means output all',\n    '更新周期' => 'Update cycle',\n    '单位' => 'Unit',\n    '分钟' => 'Minutes',\n    '保存' => 'Save',\n    '返回' => 'Return',\n    '确定' => 'Confirm',\n    '导航管理' => 'Navigation management',\n    '新增导航' => 'Add navigation',\n    '导航名称' => 'Navigation name',\n    '导航菜单' => 'Navigation menu',\n    '链接' => 'Link',\n    '打开' => 'Open',\n    '操作' => 'Operation',\n    '不填默认栏目名称' => 'Do not fill in default column name',\n    '自定义链接则需要填写' => 'Custom link needs to be filled in',\n    '本页面' => 'This page',\n    '新页面' => 'New page',\n    '管理员管理' => 'Administrator management',\n    '新增管理员信息' => 'Add administrator information',\n    '基本' => 'Basic',\n    '扩展' => 'Extended',\n    '登录名' => 'Login name',\n    '将会成为您唯一的登入名' => 'Will become your unique login name',\n    '手机' => 'Phone',\n    '邮箱' => 'Email',\n    '角色' => 'Role',\n    '选择角色' => 'Select role',\n    '密码' => 'Password',\n    '6到16个字符,不改请留空' => '6 to 16 characters,do not change',\n    '确认密码' => 'Confirm password',\n    '状态' => 'Status',\n    '正常' => 'Normal',\n    '禁用' => 'Disabled',\n    '增加成功' => 'Addition successful',\n    '修改管理员信息' => 'Modify administrator information',\n    '管理员列表' => 'Administrator list',\n    '搜索' => 'Search',\n    '是否封禁' => 'Whether to ban',\n    '封禁' => 'Ban',\n    '开始日' => 'Start date',\n    '截止日' => 'End date',\n    '请输入用户名' => 'Please enter username',\n    '编辑' => 'Edit',\n    '添加管理员' => 'Add administrator',\n    '正常|封禁' => 'Normal|Banned',\n    '所属角色' => 'Belonging role',\n    '登录时间' => 'Login time',\n    '注册时间' => 'Registration time',\n    '确认要删除吗？' => 'Confirm deletion?',\n    '请选择对象！' => 'Please select an object!',\n    '批量删除成功' => 'Batch delete successful',\n    '个人信息' => 'Personal information',\n    '基础' => 'Basic',\n    '设置' => 'Settings',\n    '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！' => 'When filling in content,please select first',\n    '恢复数据' => 'Restore data',\n    '此规则配置仅在不填留空的情况下才会触发' => 'This rule configuration is only applicable when not filled in and left blank',\n    'SEO标题' => 'SEO title',\n    '等于内容标题' => 'Equals content title',\n    '不填则留空' => 'Leave blank if not filled in',\n    '缩略图规则' => 'Thumbnail rules',\n    '自动获取内容第一张图片' => 'Automatically get the first image in the content',\n    '不自动获取' => 'Do not automatically get',\n    '简介规则' => 'Introduction rules',\n    '自动获取内容前200字符' => 'Automatically get the first 200 characters of the content',\n    'TAG规则' => 'TAG rules',\n    '同步关键词' => 'Synchronize keywords',\n    '不同步关键词' => 'Do not synchronize keywords',\n    '敏感词过滤字段' => 'Sensitive word filter field',\n    '需要过滤敏感词在系统配置中进行设置' => 'Set the fields that need to be filtered for sensitive words in system configuration',\n    '请输入需要过滤的字段' => 'Please enter the fields to be filtered',\n    '返回列表' => 'Return to list',\n    '取消' => 'Cancel',\n    '预览' => 'Preview',\n    '批量修改栏目' => 'Batch modify column',\n    '修改推荐属性' => 'Modify recommended attributes',\n    '审核' => 'Review',\n    '列表字段设置' => 'List field settings',\n    '顶' => 'Top',\n    '热' => 'Hot',\n    '荐' => 'Recommended',\n    '请选择修改栏目！' => 'Please select a column to modify!',\n    '确认要批量修改内容分类吗？' => 'Confirm batch modification of content categories?',\n    '批量修改成功' => 'Batch modification successful',\n    '请选择修改属性！' => 'Please select an attribute to modify!',\n    '请选择修改对象！' => 'Please select an object to modify!',\n    '请选择审核选项！' => 'Please select a review option!',\n    '请选择审核对象！' => 'Please select an object to review!',\n    '确认要批量处理吗？' => 'Confirm batch processing?',\n    '批量审核成功' => 'Batch review successful',\n    '确认要复制吗？' => 'Confirm copy?',\n    '批量复制成功' => 'Batch copy successful',\n    '添加属性' => 'Add attribute',\n    '名称' => 'Name',\n    '修改属性' => 'Modify attribute',\n    '新增属性' => 'Add attribute',\n    '系统设置' => 'System settings',\n    '数据库管理' => 'Database management',\n    '备份数据库' => 'Backup database',\n    '备份数：' => 'Number of backups:',\n    '数据库备份名' => 'Database backup name',\n    '大小' => 'Size',\n    '备份副本' => 'Backup copy',\n    '还原数据' => 'Restore data',\n    '删除备份' => 'Delete backup',\n    '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？' => 'Restoring the database will overwrite the existing database',\n    '您确定要删除备份数据库吗？删除后将不可找回！' => 'Are you sure you want to delete the backup database? It will not be recoverable after deletion!',\n    '数据缓存' => 'Data cache',\n    '文件夹cache/data，主要是网站内容缓存，栏目，详情页等' => 'Folder cache/data',\n    '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空' => 'Folder cache/tmp,mainly server session file cache,the current session will not be cleared',\n    '日志缓存' => 'Log cache',\n    '文件夹cache/log，包括错误日志、支付日志、登录日志等' => 'Folder cache/log,including',\n    '模板缓存' => 'Template cache',\n    '文件夹cache，主要是程序执行时生成的模板编译文件' => 'Folder cache,mainly program',\n    '缩略图缓存' => 'Thumbnail cache',\n    '文件夹image，主要是程序执行时生成的自定义缩略图' => 'Folder image,mainly program execution',\n    '立即清空' => 'Clear immediately',\n    '请选择清空目标！' => 'Please select a target to clear!',\n    '清理成功！' => 'Clear successful!',\n    '内链管理' => 'Internal link management',\n    '添加内链' => 'Add internal link',\n    '内链词' => 'Internal link word',\n    '内链' => 'Internal link',\n    '替换词' => 'Replacement word',\n    '替换次数' => 'Number of replacements',\n    '替换词，可为空！' => 'Replacement word,can be empty!',\n    '请填写内链' => 'Please fill in internal link',\n    '替换次数，默认-1，替换全部，可不写。' => 'Number of replacements,default is -1,replace all,can',\n    '提交' => 'Submit',\n    '修改内链' => 'Modify internal link',\n    '内链词和内链不能为空！' => 'Internal link word and internal link cannot be empty!',\n    '充值类型' => 'Recharge type',\n    '当前兑换率：' => 'Current exchange rate:',\n    '兑换率指1元相当于多少钱包/积分' => 'Exchange rate refers to how much money per yuan for wallet/points',\n    '交易类型' => 'Transaction type',\n    '赠送' => 'Gift',\n    '充值数量' => 'Recharge quantity',\n    '用户ID' => 'User ID',\n    '备注' => 'Remarks',\n    '添加' => 'Add',\n    '充值管理' => 'Recharge management',\n    '充值列表' => 'Recharge list',\n    '选择交易类型' => 'Select transaction type',\n    '买入' => 'Buy',\n    '选择交易种类' => 'Select transaction category',\n    '请输入前台用户手机号' => 'Please enter the frontend user\\'s phone number',\n    '请输入用户昵称' => 'Please enter the user nickname',\n    '请输入订单号' => 'Please enter the order number',\n    '会员充值' => 'Member recharge',\n    '总订单' => 'Total orders',\n    '已充值' => 'Recharged',\n    '已兑换' => 'Exchanged',\n    '总赠送' => 'Total gifts',\n    '尾页' => 'Last page',\n    '订单号' => 'Order number',\n    '类型' => 'Type',\n    '交易' => 'Transaction',\n    '用户名' => 'Username',\n    '数量' => 'Quantity',\n    '金额' => 'Amount',\n    '时间' => 'Time',\n    '查看' => 'View',\n    '选择模块' => 'Select module',\n    '选择上级' => 'Select superior',\n    '顶级栏目' => 'Top-level column',\n    '分类名' => 'Category name',\n    '图片 ' => 'Image',\n    '择图片' => 'Select image',\n    '排序规则' => 'Sorting rule',\n    '组合：排序倒序，时间倒序，ID倒序' => 'Combination: Sort descending,Time descending,ID ascending',\n    '组合：排序倒序，ID正序' => 'Combination: Sort descending,ID ascending',\n    '排序正序' => 'Sort ascending',\n    '时间倒序' => 'Time descending',\n    'ID正序' => 'ID ascending',\n    '点击量倒序' => 'Click volume descending',\n    '时间正序' => 'Time ascending',\n    '默认不需要更改' => 'Default does not need to be changed',\n    'URL命名' => 'URL naming',\n    '请填写文件名，如:index，不填请留空' => 'Please fill in the file name,such as: index,do not',\n    '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：' => 'After filling in the column name,the system will automatically use it as the URL link of the column,such as: news,access the column link:',\n    '多个相同URL，将覆盖前面的栏目' => 'Multiple identical URLs will overwrite the previous columns',\n    '列表显示' => 'List display',\n    '设置列表页显示的内容条数' => 'Set the number of content items displayed on the list page',\n    '栏目模板' => 'Column template',\n    '手动填写，不填请留空' => 'Manually fill in, leave blank if not filled',\n    '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页' => 'Please put the template file in the corresponding module folder, such as article (art',\n    '详情页模板' => 'Details page template',\n    '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。' => 'Please put the template file in the corresponding module folder',\n    '栏目外链' => 'Column external link',\n    '栏目外链，如:htt://xxx.com/abc，不填请留空' => 'Column external link, such as: http://x',\n    '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！' => 'After filling in the column external link, accessing the column link will jump to the external link, leave blank if not filled!',\n    '发布显示' => 'Publishing display',\n    '勾选后，前台会员发布会显示该栏目' => 'Check this, the frontend member publishing will display this',\n    '导航显示' => 'Navigation display',\n    '模板覆盖' => 'Template override',\n    '覆盖' => 'Override',\n    '不覆盖' => 'Do not override',\n    '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => 'Template override means: display quantity and use',\n    '访问限制' => 'Access restriction',\n    '是否关闭' => 'Whether to close',\n    '关闭' => 'Close',\n    '开启' => 'Open',\n    '栏目关闭后，前台不显示，也无法访问！' => 'After closing the column, it will not be displayed in the frontend',\n    '增加' => 'Add',\n    '请选择模板页面/使用自定义' => 'Please select template page/use',\n    '批量新增' => 'Batch add',\n    '添加栏目' => 'Add column',\n    '格式：栏目名|栏目URL，一行一个，如：关于我们|about' => 'Format: Column name|Column URL, one',\n    '格式：栏目名|栏目URL，一行一个' => 'Format: Column name|Column URL, one per line',\n    '请选择模板页面' => 'Please select a template page',\n    '请填写完整文件名，如:index，不填请留空' => 'Please fill in the complete file name, such as: index',\n    ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => 'Template override means: display quantity and use the same template file as the sub-level, reducing synchronization operations. If the superior is checked to override the sub-level, then the sub-level will default to calling',\n    '请选择栏目' => 'Please select a column',\n    '顶级' => 'Top-level',\n    '展开|折叠' => 'Expand|Collapse',\n    '模块名' => 'Module name',\n    '快捷操作' => 'Quick operation',\n    '显示|隐藏' => 'Show|Hide',\n    '添加下级' => 'Add sub-level',\n    '字段管理' => 'Field management',\n    '新增文章' => 'Add article',\n    '新增商品' => 'Add product',\n    '新增内容' => 'Add content',\n    '请选择对象' => 'Please select an object',\n    '已删除!' => 'Deleted!',\n    '删除成功' => 'Delete successful',\n    '扩展管理' => 'Extended management',\n    '新增轮播图' => 'Add new carousel image',\n    '所属分类' => 'Category',\n    '图片' => 'Image',\n    '图片高' => 'Image height',\n    '0表示不限制' => '0 means no limit',\n    '图片宽' => 'Image width',\n    '跳转链接' => 'Redirect link',\n    '不填请留空' => 'Leave blank if not filled',\n    '数字越大越靠前' => 'The larger the number, the higher the priority',\n    '修改轮播图' => 'Modify carousel image',\n    '选择分类' => 'Select category',\n    '更新时间' => 'Update time',\n    '轮播图列表' => 'Carousel image list',\n    '请选择分类' => 'Please select a category',\n    '请输入标题' => 'Please enter a title',\n    '新增图片' => 'Add new image',\n    '分类列表' => 'Category list',\n    '添加分类' => 'Add category',\n    '共有数据：' => 'Total data:',\n    '条' => 'Items',\n    '长' => 'Length',\n    '宽' => 'Width',\n    '轮播图分类' => 'Carousel image category',\n    '评论管理' => 'Comment management',\n    '添加评论' => 'Add comment',\n    '评论栏目' => 'Comment column',\n    '文章ID' => 'Article ID',\n    '主回复ID' => 'Main reply ID',\n    '同属于一个评论的ID，如果没有评论中的评论，则为0' => 'ID belonging to the same comment, if no comment',\n    '回复帖子ID' => 'Reply post ID',\n    '评论内容' => 'Comment content',\n    '管理员回复' => 'Administrator reply',\n    '是否提醒回复' => 'Whether to notify reply',\n    '提醒' => 'Notify',\n    '不提醒' => 'Do not notify',\n    '喜欢/点赞' => 'Like/Thumb up',\n    '是否已读' => 'Whether read',\n    '是否删除' => 'Whether deleted',\n    '已删除' => 'Deleted',\n    '未删除' => 'Not deleted',\n    '只能管理员删除评论，用户只能软删除评论' => 'Only administrators can delete comments, users',\n    '查看评论' => 'View comment',\n    '评论列表' => 'Comment list',\n    '请输入评论内容' => 'Please enter the comment content',\n    '查看相关内容' => 'View related content',\n    '查看用户' => 'View user',\n    '所属文章' => 'Belonging article',\n    '评论时间' => 'Comment time',\n    '请选择审核选项' => 'Please select a review option',\n    '批量处理成功' => 'Batch processing successful',\n    '调用方式' => 'Call method',\n    '这里输出想要的内容，如：' => 'Output the desired content here, such as:',\n    '查看SQL' => 'View SQL',\n    '系统扩展' => 'System extension',\n    '桌面管理' => 'Desktop management',\n    '新增配置' => 'Add new configuration',\n    '配置名称' => 'Configuration name',\n    '左侧菜单栏' => 'Left menu bar',\n    '没有二级菜单不会生效' => 'Will not take effect without a secondary menu',\n    '顶部菜单栏' => 'Top menu bar',\n    '适用角色' => 'Applicable roles',\n    '默认所有' => 'Default all',\n    '系统默认' => 'System default',\n    '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置' => 'System default means no specific desktop configuration',\n    '一个菜单名称' => 'A menu name',\n    '顶级菜单' => 'Top-level menu',\n    '菜单图标' => 'Menu icon',\n    '二级菜单' => 'Secondary menu',\n    '图标' => 'Icon',\n    '修改菜单名称' => 'Modify menu name',\n    '确定要删除吗？' => 'Are you sure you want to delete?',\n    '最后一个索引不能删除！' => 'The last index cannot be deleted!',\n    '添加菜单名称' => 'Add menu name',\n    '菜单选择' => 'Menu selection',\n    '图标选择' => 'Icon selection',\n    '修改配置' => 'Modify configuration',\n    '桌面名称' => 'Desktop name',\n    '系统' => 'System',\n    '是否默认' => 'Is default',\n    '所有角色' => 'All roles',\n    '复制配置' => 'Copy configuration',\n    '修改碎片' => 'Modify fragment',\n    '指定几个id或者几个tid的内容输出(栏目：不限制栏目)' => 'Specify several IDs or TIDs',\n    'SQL中输入：' => 'Enter in SQL:',\n    'SQL中输入： ' => 'Enter in SQL:',\n    '如： ' => 'Such as:',\n    '单位：分钟' => 'Unit: minute',\n    '修改导航' => 'Modify navigation',\n    '扩展模型管理' => 'Extended model management',\n    '模块管理' => 'Module management',\n    '新增字段' => 'Add new field',\n    '角色绑定' => 'Role binding',\n    '目绑定' => 'Target binding',\n    '字段名称' => 'Field name',\n    '简短的名称' => 'Short name',\n    '字段标识' => 'Field identifier',\n    '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短' => 'Only English letters [or later + numbers]',\n    '字段类型' => 'Field type',\n    '选择' => 'Select',\n    '长度' => 'Length',\n    '说明' => 'Description',\n    '不限' => 'No limit',\n    '带编辑器文本' => 'Text with editor',\n    '只能填写数字，长度不能超过11位' => 'Can only enter numbers, length not exceeding 11 digits',\n    '金钱，小数等，保留2位' => 'Money, decimal, etc., retain 2 digits',\n    '时间日期' => 'Date and time',\n    '多图，图集' => 'Multiple images, gallery',\n    '红=1,黄=2' => 'Red=1, Yellow=2',\n    '单项选择，下拉选择，如：红=1,黄=2,蓝=3' => 'Single choice, dropdown selection, such as: Red=1, Yellow=2',\n    '单项选择，按钮选择，如：红=1,黄=2,蓝=3' => 'Single choice, button selection, such as: Red=1, Yellow=2, Blue=3',\n    '多项选择，如：红=1,黄=2,蓝=3' => 'Multiple choices, such as: Red=1, Yellow=2, Blue=3',\n    '一个附件，压缩包，Excel，Word文档' => 'An attachment, compressed file, Excel, Word document',\n    '多个附件，压缩包，Excel，Word文档' => 'Multiple attachments, compressed file, Excel, Word document',\n    '请选择关联模块' => 'Please select the associated module',\n    '列表显示字段' => 'List display field',\n    '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => 'Single choice association, can directly call the associated module content column',\n    '多行录入，可以在页面动态新增内容输入框' => 'Multi-line input, can dynamically add content input box on the page',\n    '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => 'Multiple choices association, can directly call the associated module content list, list display corresponding field content',\n    '系统栏目，不可修改' => 'System column, not modifiable',\n    '系统副栏目，不可修改' => 'System sub-column, not modifiable',\n    '系统TAG，不可修改' => 'System TAG, not modifiable',\n    '默认值' => 'Default value',\n    '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1' => 'Default field value, leave blank by default',\n    '字段提示' => 'Field prompt',\n    '用于填写时的提示信息，50字以内' => 'Prompt information when filling in, 50 characters',\n    '表单排序' => 'Form sorting',\n    '是否必填' => 'Is it required',\n    '必填' => 'Required',\n    '非必填' => 'Not required',\n    '带有文本框编辑器的除外' => 'Except for text box with editor',\n    '前台显示' => 'Frontend display',\n    '前台表单' => 'Frontend form',\n    '后台显示' => 'Backend display',\n    '后台搜索' => 'Backend search',\n    '仅用于后台列表头部带有该字段搜索' => 'Only used for backend list header with this field',\n    '列表中显示' => 'Display in list',\n    '仅用于后台列表显示该字段' => 'Only used for backend list display of this field',\n    '显示格式化' => 'Display formatted',\n    '不做处理' => 'No processing',\n    '仅用于后台列表显示该字段内容处理' => 'Only used for backend list display of this field content',\n    'ajax可访问' => 'Ajax accessible',\n    '不能' => 'No',\n    '能' => 'Yes',\n    '由于本系统对json数据封装，限制访问可以提高安全性' => \"Due to the system's JS\",\n    '角色名' => 'Role name',\n    '栏目名' => 'Column name',\n    '修改字段' => 'Modify field',\n    '栏目绑定' => 'Column binding',\n    '红=1,黄=2,蓝=3' => 'Red=1, Yellow=2, Blue=3',\n    '关联模块内容ID' => 'Associated module content ID',\n    '可以在页面动态新增内容输入框' => 'Can dynamically add content input box on the page',\n    '温馨提示：排序和宽度在列表点击也可以更改。' => 'Warm reminder: sorting and width can also be changed by clicking in the list.',\n    '排序：当前列表显示排序，不会影响录入排序，越大越靠前。' => 'Sorting: current list display sorting, does not affect input sorting, the larger the number, the higher the priority.',\n    '搜索：在列表顶部的搜索中，可以搜索该字段。' => 'Search: can search this field in the list top search.',\n    '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。' => 'Width: the width of the list display. Due to screen width issues, it can be displayed more clearly in the list according to the fields you care about, default is 100.',\n    '宽度' => 'Width',\n    '批量绑定栏目' => 'Batch bind columns',\n    '字段' => 'Field',\n    '后台' => 'Backend',\n    '确认要删除吗？删除的同时将删除对应的表内容！' => 'Are you sure you want to delete?',\n    '角色管理' => 'Role management',\n    '角色修改' => 'Role modification',\n    '是否超管' => 'Is it super admin',\n    '不是' => 'No',\n    '超级管理员拥有无上权利，无视下面权限限制' => 'Super administrators have supreme authority and ignore the following permission restrictions',\n    '发布审核' => 'Publish review',\n    '超级管理员除外，发布的内容是否需要审核' => 'Except for super administrators, does the published content need to be reviewed?',\n    '栏目权限' => 'Column permissions',\n    '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效' => 'Whether to set column permissions, not set by default. When enabled, the following column permission settings take effect',\n    '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目' => 'Selecting the top-level column will default to selecting sub-columns. If only sub-column permissions are needed, do not select the top-level column',\n    '子栏目' => 'Sub-column',\n    '拥有权限' => 'Have permission',\n    '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块' => 'If the main module is selected, the sub-modules are also selected by default. If only sub-module permissions are needed, do not select the main module',\n    '主模块' => 'Main module',\n    '子模块' => 'Sub-module',\n    '描述' => 'Description',\n    '请输入内容' => 'Please enter content',\n    '关闭后，该分组管理员将不能登录' => 'After closing, administrators in this group will not be able to log in',\n    '添加角色' => 'Add role',\n    '后台管理' => 'Backend management',\n    '展开左侧栏' => 'Expand left column',\n    '清理缓存' => 'Clear cache',\n    '退出' => 'Logout',\n    '前台首页' => 'Frontend homepage',\n    '后台首页' => 'Backend homepage',\n    '我的桌面' => 'My desktop',\n    '关闭当前' => 'Close current',\n    '关闭其他' => 'Close others',\n    '关闭所有' => 'Close all',\n    '扩展模块管理' => 'Extended module management',\n    '批量修改分类' => 'Batch modify category',\n    '批量处理' => 'Batch processing',\n    '友情链接分类' => 'Friendship link category',\n    '分类' => 'Category',\n    '后台管理登录' => 'Backend management login',\n    '验证码' => 'Verification code',\n    '登录' => 'Login',\n    '登录ID' => 'Login ID',\n    '登录用户' => 'Login user',\n    '模块' => 'Module',\n    '方法' => 'Method',\n    '操作时间' => 'Operation time',\n    '会员管理' => 'Member management',\n    '新增会员' => 'Add new member',\n    '用于找回密码' => 'Used for password recovery',\n    '手机号' => 'Phone number',\n    '必须唯一' => 'Must be unique',\n    '昵称' => 'Nickname',\n    '分组' => 'Group',\n    '头像' => 'Avatar',\n    '生日' => 'Birthday',\n    '个性签名' => 'Personal signature',\n    '省份' => 'Province',\n    '城市' => 'City',\n    '详细地址' => 'Detailed address',\n    '6到16个字符' => '6 to 16 characters',\n    '添加成功' => 'Addition successful',\n    '会员修' => 'Member repair',\n    '6到16个字符,不修改请留空' => '6 to 16 characters, leave blank if not modifying',\n    '修改成功' => 'Modification successful',\n    '会员列表' => 'Member list',\n    '请输入手机号' => 'Please enter phone number',\n    '余额' => 'Balance',\n    '加入时间' => 'Join time',\n    '分组管理' => 'Group management',\n    '分组修改' => 'Group modification',\n    '分组名' => 'Group name',\n    '折扣类型' => 'Discount type',\n    '无折扣' => 'No discount',\n    '现金折扣' => 'Cash discount',\n    '百分比折扣' => 'Percentage discount',\n    '折扣金额' => 'Discount amount',\n    '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效' => 'Percentage discount please fill in 0.01-1',\n    '登录状态' => 'Login status',\n    '请选择所属单位！' => 'Please select the affiliated unit!',\n    '用户管理' => 'User management',\n    '会员分组' => 'Member group',\n    '添加分组' => 'Add group',\n    '温馨提示：前台权限已关闭，设置权限不会生效。' => 'Warm reminder: frontend permissions are closed, set',\n    '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！' => 'Warm reminder: frontend permissions are open, permission settings will directly affect frontend access, please operate with caution!',\n    '留言管理' => 'Message management',\n    '查看留言' => 'View message',\n    '问题描述' => 'Problem description',\n    '用户昵称' => 'User nickname',\n    '留言栏目' => 'Message column',\n    '不指定栏目' => 'No specific column',\n    '联系电话' => 'Contact number',\n    '留言IP' => 'Message IP',\n    '留言内容' => 'Message content',\n    '是否审核' => 'Whether reviewed',\n    '提交时间' => 'Submission time',\n    '修改保存' => 'Modify save',\n    '留言列表' => 'Message list',\n    '请输入相关内容ID' => 'Please enter the related content ID',\n    '内容ID' => 'Content ID',\n    '模型管理' => 'Model management',\n    '新增模型' => 'Add new model',\n    '模型名称' => 'Model name',\n    '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名' => 'Must be English letters, and cannot be already existing',\n    '是否必选栏目' => 'Is it a required column',\n    '新增修改内容时必选' => 'Must select when adding or modifying content',\n    '是否显示栏目' => 'Whether to display column',\n    '列表展示、录入内容、修改内容三个页面是否展示栏目' => 'Whether to display the column on the list display, content entry, and content modification pages',\n    '是否受权限控制' => 'Whether under permission control',\n    '不同角色可以通过控制栏目权限来限制查看内容' => 'Different roles can restrict viewing through controlling column permissions',\n    '栏目绑定显示' => 'Column binding display',\n    '栏目绑定时是否显示该模型' => 'Whether to display the model when binding columns',\n    '前台发布' => 'Frontend publish',\n    '前台是否允许发布' => 'Whether frontend publishing is allowed',\n    '列表模板' => 'List template',\n    '默认列表模板' => 'Default list template',\n    '详情模板' => 'Detail template',\n    '默认详情模板' => 'Default detail template',\n    '是否开启' => 'Whether to enable',\n    '数值越小越考前' => 'The smaller the value, the higher the priority',\n    '已有表' => 'Existing table',\n    '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"' => 'If the database already has this table',\n    '是否可以预览' => 'Whether preview is allowed',\n    '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]' => 'If preview is not allowed in the backend, select \"No\"',\n    '修改模型' => 'Modify model',\n    '模型状态' => 'Model status',\n    '模型分类' => 'Model category',\n    '允许' => 'Allowed',\n    '已停用' => 'Disabled',\n    '已启用' => 'Enabled',\n    '重构字段' => 'Reconstruct field',\n    '确认要删除吗？删除的同时将删除对应的表！' => 'Are you sure you want to delete? Deleting will also delete the corresponding table!',\n    '订单列表' => 'Order list',\n    '订单详情' => 'Order details',\n    '姓名' => 'Name',\n    '是否支付' => 'Whether paid',\n    '已支付' => 'Paid',\n    '未支付' => 'Unpaid',\n    '支付时间' => 'Payment time',\n    '存储内容' => 'Store content',\n    '订单内容' => 'Order content',\n    '商品' => 'Product',\n    '商品已删除' => 'Product deleted',\n    '收货信息：' => 'Shipping information:',\n    '收件人：' => 'Recipient:',\n    '联系手机：' => 'Contact phone:',\n    '联系邮箱：' => 'Contact email:',\n    '收货地址：' => 'Shipping address:',\n    '订单状态' => 'Order status',\n    '订单已删除' => 'Order deleted',\n    '已提交未支付' => 'Submitted but not paid',\n    '超时订单' => 'Timeout order',\n    '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => 'Order status changed to \"shipped\". After clicking \"confirm modification\", an email will be sent to notify the customer. If the order status does not change, no email will be sent',\n    '发货时间' => 'Shipping time',\n    '确定修改' => 'Confirm modification',\n    '订单管理' => 'Order management',\n    '选择状态' => 'Select status',\n    '支付方式' => 'Payment method',\n    '线下支付' => 'Offline payment',\n    '钱包支付' => 'Wallet payment',\n    '积分兑换' => 'Points exchange',\n    '支付宝支付' => 'Alipay payment',\n    '微信支付' => 'WeChat payment',\n    '微信H5支付' => 'WeChat H5 payment',\n    '微信扫码支付' => 'WeChat scan payment',\n    '支付宝H5支付' => 'Alipay H5 payment',\n    '总收入' => 'Total revenue',\n    '付款方式' => 'Payment method',\n    '是否付款' => 'Whether paid',\n    '付款时间' => 'Payment time',\n    '图库管理' => 'Gallery management',\n    '筛选上传入口' => 'Filter upload entrance',\n    '前台' => 'Frontend',\n    '筛选模块' => 'Filter module',\n    '其他杂项' => 'Other miscellaneous items',\n    '系统配置' => 'System configuration',\n    '筛选栏目' => 'Filter column',\n    '上传前台' => 'Upload frontend',\n    '所属模块' => 'Belonging module',\n    '本地文件' => 'Local file',\n    '文件大小' => 'File size',\n    '其他' => 'Other',\n    '插件管理' => 'Plugin management',\n    '插件列表' => 'Plugin list',\n    '全部' => 'All',\n    '本地' => 'Local',\n    '请输入插件名字' => 'Please enter the plugin name',\n    '插件名' => 'Plugin name',\n    '版本' => 'Version',\n    '作者' => 'Author',\n    '平台' => 'Platform',\n    '插件文件' => 'Plugin file',\n    '开关' => 'Switch',\n    '安装说明' => 'Installation instructions',\n    '点击查看' => 'Click to view',\n    '更新说明' => 'Update instructions',\n    '新' => 'New',\n    '官方' => 'Official',\n    '第三方' => 'Third party',\n    '开|停' => 'On|Off',\n    '配置' => 'Configuration',\n    '导出' => 'Export',\n    '卸载' => 'Uninstall',\n    '安装' => 'Install',\n    '下载' => 'Download',\n    '获取文件大小失败，请检查网络！' => 'Failed to get file size, please check the network!',\n    '正在安装中，请稍等~' => 'Installing, please wait~',\n    '正在删除中，请稍等~' => 'Deleting, please wait~',\n    '正在卸载中，请稍等~' => 'Uninstalling, please wait~',\n    '设置接口' => 'Set interface',\n    '当前版本：' => 'Current version:',\n    '最新版本：' => 'Latest version:',\n    '作者：' => 'Author:',\n    '更新时间：' => 'Update time:',\n    '更新内容' => 'Update content',\n    '正在下载文件' => 'Downloading file',\n    '升级插件' => 'Upgrade plugin',\n    '文件下载完成！正在解压~' => 'File download complete! Unzipping~',\n    '文件解压完成！正在进行安装~' => 'File unzipped! Installing~',\n    '插件升级成功！' => 'Plugin upgrade successful!',\n    '插件已升级完毕！' => 'Plugin has been upgraded!',\n    '功能' => 'Function',\n    '函数名' => 'Function name',\n    '对应的控制器/函数，如果是顶级，则只需要写控制器名' => 'Corresponding controller/function, if it is top-level, only the controller name is needed',\n    '权限列表' => 'Permission list',\n    '添加权限' => 'Add permission',\n    '控制器/方法' => 'Controller/method',\n    '添加子功能' => 'Add sub-function',\n    '权限管理' => 'Permission management',\n    '栏目选择' => 'Column selection',\n    '权限选择' => 'Permission selection',\n    '不能选择的权限是非独立功能' => 'Cannot select permissions that are not independent functions',\n    '请先勾选菜单!' => 'Please check the menu first!',\n    '扩展信息' => 'Extended information',\n    '回收站' => 'Recycle bin',\n    '还原' => 'Restore',\n    '批量恢复' => 'Batch restore',\n    '确认要删除吗？删除后就彻底无法恢复了！' => 'Are you sure you want to delete? Once deleted, it cannot be',\n    '确认要删除吗？删除后不可恢复！' => 'Are you sure you want to delete? This action is irreversible!',\n    '确认要还原吗？' => 'Are you sure you want to restore?',\n    '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。' => 'Reconstructing fields can quickly import external tables into the CMS, making them compatible with the CMS model.',\n    '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => 'Warm reminder: The external table must have a field named id, and it must be an auto-increment primary key. If not, please manually add this field in the database or change the existing auto-increment field to id.',\n    '数据类型' => 'Data type',\n    '录入类型' => 'Input type',\n    '归属' => 'Belonging',\n    '插件' => 'Plugin',\n    '独立功能' => 'Independent function',\n    '桌面管理配置时，将调用独立功能' => 'When configuring desktop management, the independent function will be called',\n    '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录' => 'Mobile terminal enabled, sitemap will include mobile terminal URL, please note 【Mobile static directory',\n    '如果不生成静态文件，请改为' => 'If no static files are generated, change to',\n    '手机端未开启，sitemap不会包含手机端URL' => 'Mobile terminal not enabled, sitemap will not include mobile terminal URL',\n    'PC端网站地图：' => 'PC site map:',\n    '手机端网站地图：' => 'Mobile site map:',\n    '网站地图' => 'Site map',\n    '模块名称' => 'Module name',\n    '更新频率' => 'Update frequency',\n    '站内权重' => 'Internal weight',\n    '输出范围' => 'Output range',\n    '栏目模块' => 'Column module',\n    '显示的栏目' => 'Displayed columns',\n    '所有的栏目' => 'All columns',\n    '文章模块' => 'Article module',\n    '显示的文章' => 'Displayed articles',\n    '所有的文章' => 'All articles',\n    '商品模块' => 'Product module',\n    '显示的商品' => 'Displayed products',\n    '所有的商品' => 'All products',\n    '显示的' => 'Displayed',\n    '所有的' => 'All',\n    '立即生成' => 'Generate immediately',\n    '网站设置' => 'Site settings',\n    '自定义配置' => 'Custom configuration',\n    '点击复制' => 'Click to copy',\n    '上传文件' => 'Upload file',\n    '不选' => 'Not selected',\n    '删除配置栏' => 'Delete configuration bar',\n    '选择类型' => 'Select type',\n    '编辑器' => 'Editor',\n    '文件上传' => 'File upload',\n    '下拉选项' => 'Dropdown option',\n    '栏目选项' => 'Column option',\n    '代码' => 'Code',\n    '请填写配置名(中文)' => 'Please fill in the configuration name (in Chinese)',\n    '配置标识(字母或数字)' => 'Configuration identifier (letters or numbers)',\n    '配置栏目' => 'Configuration column',\n    '提示信息' => 'Prompt information',\n    '自定义配置可以配置对应配置栏下的自定义内容' => 'Custom configuration can configure the corresponding configuration bar',\n    '下拉选项配置，如：开启=1,关闭=0' => 'Dropdown option configuration, such as: enable=1, disable=0',\n    '自定义配置栏' => 'Custom configuration bar',\n    '请填写配置栏名(中文)' => 'Please fill in the configuration bar name (in Chinese)',\n    '配置标识(必须是字母)' => 'Configuration identifier (must be letters)',\n    '配置标识用于权限控制，必填且不能与原系统配置栏重复' => 'Configuration identifier is used for permission control, it must be filled and cannot duplicate the original system configuration bar',\n    '失败！' => 'Failed!',\n    '模板管理' => 'Template management',\n    '模板列表' => 'Template list',\n    '请输入模板名字' => 'Please enter the template name',\n    '有更新' => 'Has updates',\n    '已使用' => 'In use',\n    '备份数据' => 'Backup data',\n    '安装模板' => 'Install template',\n    '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？' => 'If the data volume is large, it is not recommended to use this',\n    '提示' => 'Prompt',\n    '安装提示' => 'Installation prompt',\n    '该模板用于：' => 'This template is used for:',\n    'PC端' => 'PC terminal',\n    '手机端' => 'Mobile terminal',\n    '微信端' => 'WeChat terminal',\n    '升级模板' => 'Upgrade template',\n    '模板升级成功！' => 'Template upgrade successful!',\n    '模板已升级完毕！' => 'Template has been upgraded!',\n    '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！' => 'You have enabled 【cache full page】. Updating static HTML requires sufficient space, such as: total memory 500M, used 280M (more than half). Generating HTML is not recommended, as it may cause insufficient memory!',\n    '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => 'You can go to 【System Settings】-【Advanced Settings】-【cache full page】 to disable it',\n    '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！' => 'Please ensure sufficient memory space. If insufficient, you can enable 【cache full page】, which also achieves the speed of opening static pages!',\n    '指定栏目' => 'Specify column',\n    '所有栏目' => 'All columns',\n    '生成电脑静态' => 'Generate PC static',\n    '生成手机静态' => 'Generate mobile static',\n    '清理电脑静态HTML' => 'Clear PC static HTML',\n    '清理手机静态HTML' => 'Clear mobile static HTML',\n    '批量生成电脑静态' => 'Batch generate PC static',\n    '批量生成手机静态' => 'Batch generate mobile static',\n    '批量清理电脑静态' => 'Batch clear PC static',\n    '批量清理手机静态' => 'Batch clear mobile static',\n    '正在处理~' => 'Processing~',\n    '正在准备生成静态，请不要关闭页面~' => 'Preparing to generate static, please do not close the page~',\n    '正在准备清理电脑端静态HTML，请不要关闭页面~' => 'Preparing to clear PC static HTML, please do not close the page~',\n    '正在准备清理手机端静态HTML，请不要关闭页面~' => 'Preparing to clear mobile static HTML, please do not close the page~',\n    '欢迎管理员：' => 'Welcome administrator:',\n    '当前时间' => 'Current time',\n    '站内用户' => 'Internal users',\n    '人' => 'People',\n    '站内文章' => 'Internal articles',\n    '篇' => 'Articles',\n    '站内产品' => 'Internal products',\n    '件' => 'Items',\n    '站内留言' => 'Internal messages',\n    '最近更新' => 'Latest updates',\n    '全部文章' => 'All articles',\n    '阅读量' => 'Read volume',\n    '最新评论' => 'Latest comments',\n    '在' => 'In',\n    '发布了评论' => 'Posted a comment',\n    '版本信息' => 'Version information',\n    '当前版本' => 'Current version',\n    '项目地址' => 'Project address',\n    '服务器' => 'Server',\n    '操作系统' => 'Operating system',\n    '运行环境' => 'Running environment',\n    'PHP版本' => 'PHP version',\n    '运行方式' => 'Running mode',\n    '上传限制' => 'Upload limit',\n    '用户留言' => 'User message',\n    '回复' => 'Reply',\n    '星期天' => 'Sunday',\n    '星期一' => 'Monday',\n    '星期二' => 'Tuesday',\n    '星期三' => 'Wednesday',\n    '星期四' => 'Thursday',\n    '星期五' => 'Friday',\n    '星期六' => 'Saturday',\n    '评论模块未开启！' => 'Comment module not enabled!',\n    '您的操作过于频繁，请十分钟后再试~' => 'Your operations are too frequent, please try again in ten minutes~',\n    '评论内容不能为空！' => 'Comment content cannot be empty!',\n    '请提交栏目ID' => 'Please submit column ID',\n    '栏目ID不能为空！' => 'Column ID cannot be empty!',\n    '评论奖励' => 'Comment reward',\n    '评价成功！' => 'Review successful!',\n    '您未登录，请重新登录~' => 'You are not logged in, please log in again~',\n    '您没有' => 'You do not have',\n    '的权限！' => 'Permission!',\n    '您还未登录，请重新登录！' => 'You are not logged in, please log in again!',\n    '上传成功！' => 'Upload successful!',\n    '已关闭前台上传文件功能' => 'Frontend file upload function has been disabled',\n    '上传错误！' => 'Upload error!',\n    '对不起，您没有访问权限！' => 'Sorry, you do not have access rights!',\n    '输入url错误！' => 'Invalid URL entered!',\n    '缺少ID！' => 'Missing ID!',\n    '未找到相应内容！' => 'No corresponding',\n    '请输入关键词搜索！' => 'Please enter keywords to search!',\n    '搜索超出设定范围！' => 'Search exceeds specified limits!',\n    '您的搜索超出设定范围！' => 'Your search exceeds the set limits!',\n    '系统创建' => 'System creation',\n    '目录失败!' => 'Directory failed!',\n    '支付成功，但是系统内没有找到相应的订单！' => 'Payment successful, but no corresponding order was found in the system!',\n    '支付失败' => 'Payment failed',\n    '订单号错误！' => 'Order number error!',\n    '会员中心已关闭！' => 'Member center has been closed!',\n    '您的账户已被冻结！' => 'Your account has been frozen!',\n    '未找到您所在分组，请联系管理员处理！' => 'No group found, please contact administrator!',\n    '您所在的分组被限制登录！' => 'Your group has been restricted from logging in!',\n    '登录奖励' => 'Login reward',\n    '系统已关闭会员注册！' => 'Member registration has been closed by the system!',\n    '您的邀请链接不合法！' => 'Your invitation link is invalid!',\n    '手机号格式不正确！' => 'Incorrect phone number format!',\n    '您的邮箱已注册！' => 'Your email has been registered!',\n    '您的手机号码已注册！' => 'Your phone number has been registered!',\n    '邀请奖励' => 'Invitation reward',\n    '注册成功，等待审核！' => 'Registration successful, awaiting review!',\n    '注册成功！' => 'Registration successful!',\n    '注册失败，请重试~' => 'Registration failed, please try again~',\n    '必须通过邀请链接进行注册！' => 'Registration must be through invitation link!',\n    '请输入账号和邮箱！' => 'Please enter account and email!',\n    '图形验证码错误！' => 'Graphic verification code error!',\n    '找回密码' => 'Retrieve password',\n    '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击' => 'Your account is undergoing a password recovery operation. If it is you, please click within 10 minutes',\n    '立即找回密码' => 'Retrieve password immediately',\n    '过期失效！' => 'Expired!',\n    '您操作过于频繁，请10分钟后再尝试！' => 'Your operations are too frequent, please try again in 10 minutes',\n    '找回密码邮件已发送，请到您的邮箱查看！' => 'Password retrieval email has been sent, please check your email!',\n    '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！' => 'Email server not configured, unable to send email, please contact administrator to retrieve password!',\n    '输入的信息有误！' => 'Entered information is incorrect!',\n    'token已失效！' => 'Token has expired!',\n    '密码重置成功,请重新登录！' => 'Password reset successful, please log in again!',\n    '新密码不能与旧密码相同！' => 'New password cannot be the same as the old password!',\n    '标题不能为空！' => 'Title cannot be empty!',\n    '称呼不能为空！' => 'Salutation cannot be empty!',\n    '您的手机号格式不正确！' => 'Your phone number format is incorrect!',\n    '不能为空！' => 'Cannot be empty!',\n    '提交成功！我们会尽快回复您！' => 'Submission successful!',\n    '提交失败，请重试！' => 'Submission failed, please try again!',\n    '链接错误' => 'Link error',\n    '留言未找到或者未审核' => 'Message not found or not reviewed',\n    '匿名' => 'Anonymous',\n    '缺少id参数！' => 'Missing id parameter!',\n    '缺少tid参数！' => 'Missing tid parameter!',\n    '未找到商品或者已下架！' => 'Product not found or has been taken off the shelf!',\n    '该模块缺少price价格参数！' => 'Module missing price parameter!',\n    '您的订单提交成功通知' => 'Your order submission successful notification',\n    '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！' => 'We have received your order. We will ship it as soon as possible. Please check your email for the latest updates on your order. Thank you for your cooperation!',\n    '订单详细信息如下' => 'Order details are as follows',\n    '折扣' => 'Discount',\n    '运费' => 'Shipping cost',\n    '合计' => 'Total',\n    '收件地址' => 'Recipient address',\n    '您的订单' => 'Your order',\n    '已经提交，我们会尽快给您发货！' => 'Submitted, we will ship your order as soon as possible!',\n    '订单已支付！' => 'Order has been paid!',\n    '已经提交，请尽快支付！' => 'Submitted, please pay as soon as possible!',\n    '支付订单' => 'Pay order',\n    '电脑支付宝支付' => 'PC Alipay payment',\n    '微信内支付' => 'WeChat in-app payment',\n    '未开启钱包支付！' => 'Wallet payment not enabled!',\n    '您未登录，无法支付！' => 'You are not logged in, unable to pay!',\n    '钱包金额不足，请充值！' => 'Insufficient wallet balance, please recharge!',\n    '未开启积分支付！' => 'Points payment not enabled!',\n    '积分不足，请充值！' => 'Insufficient points, please recharge!',\n    '支付宝当面付' => 'Alipay face-to-face payment',\n    '其他平台支付' => 'Other platform payments',\n    '在线充值' => 'Online recharge',\n    '交易创建，等待买家付款' => 'Transaction created, waiting for buyer payment',\n    '未付款交易超时关闭，或支付完成后全额退款' => 'Unpaid transaction timed out, or full refund after payment completion',\n    '支付成功' => 'Payment successful',\n    '交易结束，不可退款' => 'Transaction ended, no refund',\n    '未知状态' => 'Unknown status',\n    '订单号错误或订单被删除！' => 'Order number error or order has been deleted!',\n    '订单未支付或订单号错误！' => 'Order not paid or order number error!',\n    '创建订单失败！' => 'Order creation failed!',\n    '订单号不存在或已被删除！' => 'Order number does not exist or has been deleted!',\n    '收件人、手机号和收货地址不能为空！' => 'Recipient, phone number, and shipping address cannot be empty!',\n    '未开启在线支付！' => 'Online payment not enabled!',\n    '获取openid失败' => 'Failed to get openid',\n    '非法参数！' => 'Illegal parameter!',\n    '标签未找到或已删除！' => 'Tag not found or deleted!',\n    '手机号码格式错误！' => 'Phone number format error!',\n    '账户不能为空！' => 'Account cannot be empty!',\n    '订单已过期，不可支付！' => 'Order has expired, cannot pay!',\n    '订单已支付，请勿重复操作！' => 'Order has been paid, please do not repeat the operation!',\n    '缺少订单号！' => 'Missing order number!',\n    '网络错误，请刷新后重试！' => 'Network error, please refresh and try again!',\n    '未找到评论！' => 'Comment not found!',\n    '已取消点赞！' => 'Like canceled!',\n    '点赞成功！' => 'Like successful!',\n    '栏目未绑定模型，无法喜欢！' => 'Column not bound to model, unable to like!',\n    '取消点赞' => 'Unlike',\n    '点赞奖励' => 'Like reward',\n    '已被删除 ' => 'Deleted',\n    '栏目未绑定模型，无法收藏！' => 'Column not bound to model, unable to favorite!',\n    '取消收藏' => 'Unfavorite',\n    '收藏奖励' => 'Favorite reward',\n    '收藏成功！' => 'Favorite successful!',\n    '已被删除' => 'Deleted',\n    '库存不足！' => 'Insufficient stock!',\n    '该模块不允许发布！' => 'Module does not allow posting!',\n    '添加失败，存在敏感词' => 'Addition failed, sensitive words detected',\n    '分类错误！' => 'Category error!',\n    '该分类不允许发布！' => 'This category does not allow posting!',\n    '您没有权限在该分类发布内容！' => 'You do not have permission to post content in this category!',\n    '内容不能为空！' => 'Content cannot be empty!',\n    '库存不能为0！' => 'Stock cannot be zero!',\n    '未修改内容，不能提交！' => 'No content modified, cannot submit!',\n    '发布失败，请重试！' => 'Posting failed, please try again!',\n    '发布成功！' => 'Posting successful!',\n    '未找到您要的文章！' => 'Article not found!',\n    '您已经关注了该用户！' => 'You have already followed this user!',\n    '您不能关注自己！' => 'You cannot follow yourself!',\n    '关注奖励' => 'Follow reward',\n    '关注成功！' => 'Follow successful!',\n    '您没有关注该用户，无法操作！' => 'You are not following this user, unable to operate!',\n    '取关成功！' => 'Unfollow successful!',\n    '消息已被删除！' => 'Message has been deleted!',\n    '用户未找到！' => 'User not found!',\n    '未分类 ' => 'Uncategorized',\n    '设置成功' => 'Setting successful',\n    '设置成功！' => 'Setting successful!',\n    '记录不存在！' => 'Record does not exist!',\n    '缺少栏目ID！' => 'Missing column ID!',\n    '系统未配置微信登录！' => 'System not configured for WeChat login!',\n    '微信已绑定！' => 'WeChat already bound!',\n    '您的微信已被绑定，不能再绑定！' => 'Your WeChat has been bound, cannot bind again!',\n    '系统版号' => 'System version number',\n    '版本号是系统自带，请勿改动' => 'Version number is system-built, please do not modify',\n    '网站SEO名称' => 'Website SEO name',\n    '控制在25个字、50个字节以内' => 'Control within 25 characters, 50 bytes',\n    '网站SEO关键词' => 'Website SEO keywords',\n    '5个左右，8汉字以内，用英文逗号隔开' => 'Around 5, within 8 Chinese characters, separated by commas in English',\n    '网站SEO描述' => 'Website SEO description',\n    '控制在80个汉字，160个字符以内' => 'Control within 80 Chinese characters, 160 characters',\n    '统计代码' => 'Statistics code',\n    '将百度统计、cnzz等平台的流量统计JS代码放到这里' => 'Place the traffic statistics JS code from platforms such as Baidu Statistics and cnzz here',\n    '底部版权' => 'Footer copyright',\n    '如：© 2016 xxx版权' => 'Such as: © 2016 xxx copyright',\n    '备案号' => 'Filing number',\n    '如：京ICP备00000000号' => 'Such as: Beijing ICP No. 00000000',\n    '网站电话' => 'Website phone',\n    '网站联系电话' => 'Website contact number',\n    '400电话' => '400 phone',\n    '网站QQ' => 'Website QQ',\n    '网站邮箱' => 'Website email',\n    '公司地址' => 'Company address',\n    'PC网站模板' => 'PC website template',\n    '将模板名称填写到此处' => 'Enter the template name here',\n    'WAP网站模板' => 'WAP website template',\n    '开启了手机端，这个设置才会生效，否则调用电脑端模板' => 'This setting will take effect if the mobile terminal is enabled, otherwise the PC terminal template will be used',\n    '微信网站模板' => 'WeChat website template',\n    '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板' => 'This setting will take effect if the mobile terminal is enabled, otherwise the PC terminal template will be used. Due to some special JS in WeChat, a separate WeChat template can be set here',\n    '是否开启手机端' => 'Whether to enable mobile terminal',\n    '如果不开启手机端，则默认调用电脑端模板' => 'If the mobile terminal is not enabled, the PC terminal template will be called by default',\n    '是否开启前台上传' => 'Whether to enable frontend upload',\n    '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。' => 'If closed, the frontend will not be able to upload files. If the website does not use',\n    '是否开启前台权限' => 'Whether to enable frontend permissions',\n    '开启后前台用户权限可以在后台控制' => 'After enabling, frontend user permissions can be controlled in the backend',\n    '缓存时间' => 'Cache time',\n    '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。' => 'Unit: minute, leave blank or 0 for no setting',\n    '限制上传文件大小' => 'Limit upload file size',\n    '0代表不限，单位kb' => '0 means no limit, unit: kb',\n    '允许上传文件类型' => 'Allowed file types for upload',\n    '请用|分割，如：pdf|jpg|png' => 'Use | to separate, such as: pdf|jpg|png',\n    '前台UEditor编辑器导航条配置' => 'Frontend UEditor editor toolbar configuration',\n    '允许前台搜索的表' => 'Allowed frontend search tables',\n    '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product' => 'To prevent data leakage, enter the allowed publishing module identifiers, leave blank for',\n    '上传图片压缩比例' => 'Image upload compression ratio',\n    '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80' => '100% means no compression, if PNG is a transparent image, compression',\n    'PNG是否压缩' => 'Whether to compress PNG',\n    'PNG压缩后容易变成背景黑色，关闭后，不会压缩。' => 'PNG compression easily turns the background black, if closed,',\n    '邮件服务器' => 'Mail server',\n    'smtp.163.com,smtp.qq.com' => 'smtp.163.com, smtp',\n    '邮件收发端口' => 'Mail sending and receiving ports',\n    '163、126邮件端口(465)，QQ邮件端口(587)' => '163, 126 mail port (465), QQ mail port (25)',\n    '收件人Email地址' => 'Recipient email address',\n    '发件人Email地址' => 'Sender email address',\n    '指邮件服务器发件邮箱' => 'Refers to the email address used by the mail server',\n    '发件人Email秘钥' => 'Sender email key',\n    '这个秘钥不是登录密码' => 'This key is not the login password',\n    '发件人昵称' => 'Sender nickname',\n    '发件邮箱会带一个昵称' => \"The sender's email will have a nickname\",\n    '客户订单通知' => 'Customer order notification',\n    '购买商品的时候会发送的一条邮件信息' => 'An email message sent when a product is purchased',\n    '订单出货通知' => 'Order shipment notification',\n    '发货的时候发送给客户的通知' => 'A notification sent to the customer when the order is shipped',\n    '订单运费' => 'Order shipping cost',\n    '购物下单时会加上这个运费' => 'This shipping cost will be added when placing an order',\n    '在线支付' => 'Online payment',\n    '0关闭支付，1自主平台支付' => '0 to close payment, 1 for independent platform payment',\n    '极致平台接口' => 'Ultimate platform interface',\n    '极致平台商户' => 'Ultimate platform merchant',\n    '极致平台应用appid' => 'Ultimate platform application appid',\n    '极致平台应用秘钥' => 'Ultimate platform application secret key',\n    '支付宝APPID' => 'Alipay APPID',\n    '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID' => 'Account Center -> Key Management -> Open Platform Key, fill in the',\n    '支付宝key' => 'Alipay key',\n    'MD5密钥，安全检验码，由数字和字母组成的32位字符串' => 'MD5 key, security verification code, composed of numbers and letters',\n    '支付宝私钥' => 'Alipay private key',\n    '支付宝公钥' => 'Alipay public key',\n    '微信商户mchid' => 'WeChat merchant mchid',\n    '支付相关' => 'Payment related',\n    '微信商户key' => 'WeChat merchant key',\n    '微信公众号appid' => 'WeChat official account appid',\n    '微信公众号appsecret' => 'WeChat official account appsecret',\n    '微信apiclient_cert' => 'WeChat apiclient_cert',\n    '微信apiclient_key' => 'WeChat apiclient_key',\n    '公众号appid' => 'Public account appid',\n    '用户登录相关，如果跟支付的一样，那就再填写一遍' => 'For user login related, if the same as payment, fill in again',\n    '公众号appsecret' => 'Public account appsecret',\n    '公众号token' => 'Public account token',\n    '公众号关注欢迎语' => 'Public account follow welcome message',\n    '公众号关注时发送的第一句推送' => 'The first message pushed when following the public account',\n    '网站LOGO' => 'Website LOGO',\n    '后台模板风格' => 'Backend template style',\n    '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。' => 'Popup window on the inner page: click add/modify, etc., the page',\n    '是否绑定多域名' => 'Whether to bind multiple domains',\n    '开启绑定多域名后，需要到插件中配置' => 'After enabling multiple domain bindings, you need to configure in the plugin',\n    '网站SEO网址' => 'Website SEO URL',\n    '一般不填，全局网址，最后不带/,如：http://www.xxx.com' => 'Generally not filled, global URL, without the trailing /, such as: http',\n    '基本信息下扩展' => 'Basic information extension',\n    '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下' => 'Whether to display new fields at the bottom of 【Basic Information】, default',\n    '订单超时' => 'Order timeout',\n    '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制' => 'Calculated by hour, if the order exceeds this hour',\n    '开启层级URL' => 'Enable hierarchical URL',\n    '默认关闭层级URL，开启后URL会按照父类层级展现' => 'Hierarchical URL is disabled by default, after enabling, the URL will follow the parent',\n    '缓存完整页面' => 'Cache full page',\n    '前台完整页面缓存，结合缓存时间，可以提高访问速度' => 'Frontend full page cache, combined with cache time, can',\n    '自动生成静态HTML' => 'Automatically generate static HTML',\n    '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面' => 'Frontend access to website pages will automatically generate static HTML, the next visit will directly',\n    'PC静态文件目录' => 'PC static file directory',\n    '电脑端静态HTML存放目录，默认根目录[ / ]' => 'Directory for storing PC static HTML, default root directory [ /',\n    'WAP静态文件目录' => 'WAP static file directory',\n    '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱' => 'Directory for storing mobile static HTML, default [ m ], PC',\n    '是否留言自动审核' => 'Whether to automatically review messages',\n    '开启后，留言自动审核（显示）' => 'After enabling, messages will be automatically reviewed (displayed)',\n    '是否评论自动审核' => 'Whether to automatically review comments',\n    '开启后评论自动审核（显示）' => 'After enabling, comments will be automatically reviewed (displayed)',\n    '网站敏感词过滤' => 'Website sensitive word filter',\n    '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容' => 'Put sensitive words inside, separated by commas, use {xx}',\n    '是否开启水印' => 'Whether to enable watermark',\n    '开启水印需要上传水印图片' => 'Enable watermark requires uploading watermark image',\n    '水印图片' => 'Watermark image',\n    '水印图片在250px以内' => 'Watermark image should be within 250px',\n    '水印位置' => 'Watermark position',\n    '参考键盘九宫格1-9' => 'Refer to the nine-key keyboard positions 1-9',\n    '水印透明度' => 'Watermark transparency',\n    '透明度越大，越难看清楚水印' => 'The greater the transparency, the harder it is to see the watermark',\n    '钱包兑换率' => 'Wallet exchange rate',\n    '站内钱包与RMB的兑换率，即1元=多少金币' => 'Exchange rate between the site wallet and RMB, 1 yuan',\n    '积分兑换率' => 'Points exchange rate',\n    '站内积分与RMB的兑换率，即1元=多少积分' => 'Exchange rate between site points and RMB, 1 yuan',\n    '积分支付' => 'Points payment',\n    '开启积分支付后，商品可以用积分支付' => 'After enabling points payment, products can be purchased with points',\n    '开启钱包支付后，商品可以用钱包支付' => 'After enabling wallet payment, products can be purchased with the wallet',\n    '开启微信支付后，商品可以用微信支付' => 'After enabling WeChat payment, products can be purchased with WeChat',\n    '开启支付宝支付后，商品可以用支付宝支付' => 'After enabling Alipay payment, products can be purchased with Alipay',\n    '每次登录奖励' => 'Login reward each time',\n    '每天登录奖励积分数，最小为0，每天登录只奖励一次' => 'Daily login reward points, minimum is 0, daily login',\n    '开启登录奖励后，登录后就会获得积分奖励' => 'After enabling login reward, points will be rewarded after login',\n    '开启后，发布内容会奖励积分' => 'After enabling, content publication will reward points',\n    '每次发布奖励' => 'Publication reward each time',\n    '每次发布内容奖励积分数' => 'Points rewarded for each content publication',\n    '每天发布最高奖励' => 'Daily publication maximum reward',\n    '每天奖励不超过积分上限，设置0则无上限' => 'Daily reward will not exceed the points limit, set 0 for no limit',\n    '开启后，发布内容被收藏会奖励积分' => 'After enabling, content being favorited will reward points',\n    '每次收藏奖励' => 'Favorite reward each time',\n    '每次发布内容被收藏奖励积分数' => 'Points rewarded for each content being favorited',\n    '每天收藏最高奖励' => 'Daily favorite maximum reward',\n    '开启后，发布内容被点赞会奖励积分' => 'After enabling, content being liked will reward points',\n    '每次点赞奖励' => 'Like reward each time',\n    '每次发布内容被点赞奖励积分数' => 'Points rewarded for each content being liked',\n    '每天点赞最高奖励' => 'Daily like maximum reward',\n    '开启后，发布内容被评论会奖励积分' => 'After enabling, content being commented on will reward points',\n    '每次评论奖励' => 'Comment reward each time',\n    '每次发布内容被评论奖励积分数' => 'Points rewarded for each content being commented on',\n    '每天评论最高奖励' => 'Daily comment maximum reward',\n    '开启后，用户被粉丝关注会奖励积分' => 'After enabling, users being followed by fans will reward points',\n    '每次关注奖励' => 'Follow reward each time',\n    '每次被关注奖励积分数' => 'Points rewarded each time for being followed',\n    '每天关注最高奖励' => 'Daily follow maximum reward',\n    '每天关注奖励不超过积分上限，设置0则无上限' => 'Daily follow reward will not exceed the points limit, set 0 for no limit',\n    '发送邮件' => 'Send email',\n    '是否开启邮件发送' => 'Whether to enable email sending',\n    '关闭网站' => 'Close website',\n    '关闭网站后，前台无法访问，后台可以进入' => 'After closing the website, the frontend cannot be accessed, the backend',\n    '关站提示' => 'Close site prompt',\n    '后台文件存储路径' => 'Backend file storage path',\n    '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]' => 'Default is static/upload/{yyyy}',\n    '前台文件存储路径' => 'Frontend file storage path',\n    '是否开启前台AJAX' => 'Whether to enable frontend AJAX',\n    '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据' => 'After enabling AJAX, the frontend can get',\n    '自动生成sitemap' => 'Automatically generate sitemap',\n    '开启后，前台访问每天会自动生成1次sitemap' => 'After enabling, a sitemap will be automatically generated once a day when the frontend is accessed',\n    '是否开启邀请奖励' => 'Whether to enable invitation reward',\n    '开启邀请后则会奖励' => 'After enabling invitation, rewards will be given',\n    '邀请奖励类型' => 'Invitation reward type',\n    '邀请奖励数量' => 'Invitation reward quantity',\n    '网站手机' => 'Website mobile',\n    '站长微信' => \"Site owner's WeChat\",\n    '开启多图描述' => 'Enable multiple image descriptions',\n    '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)' => 'After enabling, each image in the gallery can have a description, note',\n    '前台用户注册' => 'Frontend user registration',\n    '关闭前台注册后，前台无法进入注册页面' => 'After closing frontend registration, the frontend cannot enter the registration page',\n    '仅邀请码注册' => 'Only invitation code registration',\n    '开启后，必须通过邀请链接才能注册！' => 'After enabling, registration must be through an invitation link!',\n    '允许前台发布模块' => 'Allowed frontend publishing modules',\n    '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => 'To prevent data leakage, enter the allowed publishing module identifiers, leave blank for',\n    '前台搜索的字段' => 'Frontend search fields',\n    '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => 'You can set related fields in the search table for fuzzy query',\n    '前台验证码' => 'Frontend verification code',\n    '关闭后，登录注册不需要验证码' => 'After closing, login registration does not require verification code',\n    '后台验证码' => 'Backend verification code',\n    '关闭后，后台管理员登录不需要验证码' => 'After closing, backend administrator login does not require verification',\n    'TAG包含模型' => 'TAG includes model',\n    '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product' => 'Query related models in the tag list, multiple model identifiers',\n    '支付配置' => 'Payment configuration',\n    '前台多模块搜索的字段' => 'Frontend multi-module search fields',\n    '多个模块直接必须都有相同的字段，否则会报错' => 'Multiple modules must have the same fields, otherwise there will be an error',\n    '多模块允许搜索的表' => 'Allowed multi-module search tables',\n    '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product' => 'To prevent data leakage, enter the allowed search table names, leave blank for',\n    '允许查询显示的字段' => 'Allowed query display fields',\n    '多模块搜索允许查询显示的字段' => 'Allowed query display fields for multi-module search',\n    '前台编辑器设置' => 'Frontend editor settings',\n    '前台的编辑器功能菜单设置' => 'Frontend editor function menu settings',\n    'PHP调试' => 'PHP debugging',\n    '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。' => 'Test environment, enable debugging, display errors, real',\n    '前台SESSION' => 'Frontend SESSION',\n    '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭' => 'After closing frontend SESSION, frontend member module cannot be used',\n    '留言验证码' => 'Message verification code',\n    '开启后，前台留言需要填写验证码' => 'After enabling, frontend message requires verification code',\n    '前台发布审核' => 'Frontend publishing review',\n    '开启后需要后台审核，关闭则不需要' => 'After enabling, backend review is required, if closed, review is not needed',\n    '公共权限' => 'Public permissions',\n    '前台网站' => 'Frontend website',\n    '会员登录' => 'Member login',\n    '会员评论' => 'Member comments',\n    '网站筛选' => 'Website filter',\n    '会员下单' => 'Member order',\n    '网站支付' => 'Website payment',\n    '极致支付' => 'Ultimate payment',\n    '微信模块' => 'WeChat module',\n    '验证码生成' => 'Generate verification code',\n    '检查是否登录' => 'Check if logged in',\n    '多附件上传' => 'Multi-attachment upload',\n    '单附件上传' => 'Single attachment upload',\n    '二维码生成' => 'Generate QR code',\n    '获取扩展信息' => 'Get extended information',\n    '链接错误提示' => 'Link error prompt',\n    '报错提示' => 'Error prompt',\n    '网站内容' => 'Website content',\n    '详情内容' => 'Detail content',\n    '网站搜索' => 'Website search',\n    '网站多模块搜索' => 'Website multi-module search',\n    '开启网站缓存' => 'Enable website cache',\n    '输出缓存' => 'Output cache',\n    '个人中心首页' => 'Personal center homepage',\n    '会员资料' => 'Member information',\n    '订单记录' => 'Order records',\n    '订单支付' => 'Order payment',\n    '删除订单' => 'Delete order',\n    '上传头像' => 'Upload avatar',\n    '删除评论' => 'Delete comment',\n    '点赞文章' => 'Like article',\n    '点赞列表' => 'Like list',\n    '收藏文章' => 'Favorite article',\n    '收藏列表' => 'Favorite list',\n    '删除收藏' => 'Delete favorite',\n    '购物车' => 'Shopping cart',\n    '添加购物车' => 'Add to shopping cart',\n    '删除购物车' => \"Delete from shopping cart\",\n    '发布管理' => 'Publishing management',\n    '会员发布' => 'Member publishing',\n    '删除发布' => 'Delete publishing',\n    '会员上传附件' => 'Member upload attachment',\n    '404提示' => '404 prompt',\n    '关注用户' => 'Follow user',\n    '取消关注' => 'Unfollow',\n    '粉丝列表' => 'Fan list',\n    '消息提醒' => 'Message notification',\n    '查看消息' => 'View message',\n    '删除消息' => 'Delete message',\n    '公共主页' => 'Public homepage',\n    '消息提醒设置' => 'Message notification settings',\n    '获取栏目列表' => 'Get column list',\n    '用户钱包' => 'User wallet',\n    '交易详情' => 'Transaction details',\n    '登录首页' => 'Login homepage',\n    '注册页面' => 'Registration page',\n    '忘记密码' => 'Forgot password',\n    '未登录页面' => 'Not logged in page',\n    '退出登录' => 'Logout',\n    '发送留言' => 'Send message',\n    '发表评论' => 'Post comment',\n    '筛选列表' => 'Filter list',\n    '创建订单' => 'Create order',\n    'TAG标签列表' => 'TAG list',\n    '会员' => 'Member',\n    '订单' => 'Order',\n    '评论' => 'Comment',\n    '留言' => 'Message',\n    '轮播图' => 'Carousel image',\n    '友情链接' => 'Friendship link',\n    'TAG' => 'TAG',\n    '单页' => 'Single page',\n    '用户评价' => 'User evaluation',\n    '添加会员' => 'Add member',\n    '修改会员' => 'Modify member',\n    '删除会员' => 'Delete member',\n    '修改状态' => 'Modify status',\n    '内容管理' => 'Content management',\n    '内容列表' => 'Content list',\n    '添加内容' => 'Add content',\n    '修改内容' => 'Modify content',\n    '删除内容' => 'Delete content',\n    '复制内容' => 'Copy content',\n    '修改评论' => 'Modify comment',\n    '修改留言' => 'Modify message',\n    '删除留言' => 'Delete message',\n    '字段列表' => 'Field list',\n    '删除字段' => 'Delete field',\n    '获取字段' => 'Get field',\n    '基本功能' => 'Basic functions',\n    '系统界面' => 'System interface',\n    '数据库备份' => 'Database backup',\n    '数据库还原' => 'Database restore',\n    '数据库删除' => 'Database delete',\n    '系统功能' => 'System functions',\n    '栏目管理' => 'Column management',\n    '栏目列表' => 'Column list',\n    '新增栏目' => 'Add column',\n    '修改栏目' => 'Modify column',\n    '删除栏目' => 'Delete column',\n    '修改排序' => 'Modify sorting',\n    '栏目隐藏' => 'Hide column',\n    '新增角色' => 'Add role',\n    '修改角色' => 'Modify role',\n    '删除角色' => 'Delete role',\n    '角色状态' => 'Role status',\n    '新增管理员' => 'Add administrator',\n    '修改管理员' => 'Modify administrator',\n    '管理员状态' => 'Administrator status',\n    '删除管理员' => 'Delete administrator',\n    '模型列表' => 'Model list',\n    '删除模型' => 'Delete model',\n    '新增权限' => 'Add permission',\n    '修改权限' => 'Modify permission',\n    '删除权限' => 'Delete permission',\n    '桌面设置' => 'Desktop settings',\n    '新增桌面' => 'Add desktop',\n    '修改桌面' => 'Modify desktop',\n    '删除桌面' => 'Delete desktop',\n    '图标库' => 'Icon library',\n    '模块扩展' => 'Module extension',\n    '删除轮播图' => 'Delete carousel image',\n    '复制轮播图' => 'Copy carousel image',\n    '批量删除轮播图' => 'Batch delete carousel images',\n    '新增轮播图分类' => 'Add carousel image category',\n    '修改轮播图分类' => 'Modify carousel image category',\n    '删除轮播图分类' => 'Delete carousel image category',\n    '新增友链' => 'Add friendship link',\n    '修改友链' => 'Modify friendship link',\n    '复制友链' => 'Copy friendship link',\n    '删除友链' => 'Delete friendship link',\n    '批量删除友链' => 'Batch delete friendship links',\n    '通用模块' => 'General module',\n    '更新cookie' => 'Update cookie',\n    '商品管理' => 'Product management',\n    '商品列表' => 'Product list',\n    '修改商品' => 'Modify product',\n    '删除商品' => 'Delete product',\n    '复制商品' => 'Copy product',\n    '登录日志' => 'Login log',\n    '新增分组' => 'Add group',\n    '修改分组' => 'Modify group',\n    '更改分组状态' => 'Change group status',\n    '删除分组' => 'Delete group',\n    '会员权限' => 'Member permissions',\n    '修改分组排序' => 'Modify group sorting',\n    '上传支付证书' => 'Upload payment certificate',\n    '更改状态' => 'Change status',\n    '安装卸载' => 'Install/Uninstall',\n    '删除图库图片' => 'Delete gallery image',\n    '批量删除图库' => 'Batch delete gallery',\n    '微信公众号' => 'WeChat official account',\n    '公众号菜单' => 'Official account menu',\n    '公众号素材' => 'Official account material',\n    '模板制作' => 'Template making',\n    '获取首字母拼音' => 'Get first letter of pinyin',\n    '批量新增栏目' => 'Batch add columns',\n    '自定义配置删除' => 'Delete custom configuration',\n    'TAG列表' => 'TAG list',\n    '新增TAG' => 'Add TAG',\n    '修改TAG' => 'Modify TAG',\n    '复制TAG' => 'Copy TAG',\n    '删除TAG' => 'Delete TAG',\n    '批量删除TAG' => 'Batch delete TAGs',\n    '生成静态文件' => 'Generate static files',\n    '更新栏目HTML' => 'Update column HTML',\n    '更新模块HTML' => 'Update module HTML',\n    '批量修改推荐属性' => 'Batch modify recommended attributes',\n    '批量修改友链栏目' => 'Batch modify friendship link columns',\n    '批量修改TAG栏目' => 'Batch modify TAG columns',\n    '批量复制友链' => 'Batch copy friendship links',\n    '批量复制TAG' => 'Batch copy TAGs',\n    '批量修改友链排序' => 'Batch modify friendship link sorting',\n    '批量修改TAG排序' => 'Batch modify TAG sorting',\n    '高级设置' => 'Advanced settings',\n    '邮箱订单' => 'Email order',\n    '公众号配置' => 'Official account configuration',\n    '批量审核友链' => 'Batch review friendship links',\n    '批量审核TAG' => 'Batch review TAGs',\n    '手动充值' => 'Manual recharge',\n    '删除记录' => 'Delete record',\n    '批量删除记录' => 'Batch delete records',\n    '积分配置' => 'Points configuration',\n    '插件更新' => 'Plugin update',\n    '获取栏目模板' => 'Get column template',\n    '友链分类' => 'Friendship link category',\n    '新增友链分类' => 'Add friendship link category',\n    '修改友链分类' => 'Modify friendship link category',\n    '删除友链分类' => 'Delete friendship link category',\n    '导航设置' => 'Navigation settings',\n    '删除导航' => 'Delete navigation',\n    '碎片化' => 'Fragmented content',\n    '删除碎片' => 'Delete fragment',\n    '预览SQL' => 'Preview SQL',\n    '搜索配置' => 'Search configuration',\n    '修改字段属性' => 'Modify field attributes',\n    '新增推荐属性' => 'Add recommended attribute',\n    '删除推荐属性' => 'Delete recommended attribute',\n    '列表设置' => 'List settings',\n    '获取列表字段' => 'Get list fields',\n    '内链模块' => 'Internal link module',\n    '内链列表' => 'Internal link list',\n    '新增内链' => 'Add internal link',\n    '删除内链' => 'Delete internal link',\n    '删除数据' => 'Delete data',\n    '模板更新' => 'Template update',\n    '用户评价列表' => 'User evaluation list',\n    '新增用户评价' => 'Add user evaluation',\n    '修改用户评价' => 'Modify user evaluation',\n    '复制用户评价' => 'Copy user evaluation',\n    '删除用户评价' => 'Delete user evaluation',\n    '批量删除用户评价' => 'Batch delete user evaluations',\n    '批量修改用户评价栏目' => 'Batch modify user evaluation columns',\n    '批量复制用户评价' => 'Batch copy user evaluations',\n    '批量修改用户评价列表' => 'Batch modify user evaluation list',\n    '批量审核用户评价' => 'Batch review user evaluations',\n    '基本设置' => 'Basic settings',\n    '邮件订单' => 'Email order',\n    '非超级管理员无法设置！' => 'Non-super administrators cannot set!',\n    '你确定要还原吗？' => 'Are you sure you want to restore?',\n);"
  },
  {
    "path": "app/admin/lang/zh.php",
    "content": "<?php return array (\n  '该角色下存在用户，请先移除用户再删除！' => '该角色下存在用户，请先移除用户再删除！',\n  '删除失败，该分组不允许删除！' => '删除失败，该分组不允许删除！',\n  '删除成功！' => '删除成功！',\n  '删除失败，请重试！' => '删除失败，请重试！',\n  '非法操作！' => '非法操作！',\n  '修改失败，您的权限不足！' => '修改失败，您的权限不足！',\n  '修改成功！' => '修改成功！',\n  '修改失败，请重新提交！' => '修改失败，请重新提交！',\n  '没有该角色！' => '没有该角色！',\n  '新增成功！' => '新增成功！',\n  '新增失败，请重新提交！' => '新增失败，请重新提交！',\n  '修改失败，该分组不允许修改！' => '修改失败，该分组不允许修改！',\n  '您没有权限操作！' => '您没有权限操作！',\n  '两次密码不同！' => '两次密码不同！',\n  '手机号已被注册！' => '手机号已被注册！',\n  '昵称已被使用！' => '昵称已被使用！',\n  '邮箱已被使用！' => '邮箱已被使用！',\n  '修改失败！' => '修改失败！',\n  '新增失败！' => '新增失败！',\n  '系统管理员不能删除！' => '系统管理员不能删除！',\n  '删除失败！' => '删除失败！',\n  '批量操作失败！' => '批量操作失败！',\n  '批量删除成功！' => '批量删除成功！',\n  '添加失败' => '添加失败',\n  '存在敏感词' => '存在敏感词',\n  '已存在相同的自定义URL！' => '已存在相同的自定义URL！',\n  '添加成功,继续添加~' => '添加成功,继续添加~',\n  '内容配置' => '内容配置',\n  '修改失败' => '修改失败',\n  '发布奖励' => '发布奖励',\n  '您未做任何修改，不能提交！' => '您未做任何修改，不能提交！',\n  '复制成功！' => '复制成功！',\n  '复制失败！' => '复制失败！',\n  '批量复制成功！' => '批量复制成功！',\n  '批量修改成功！' => '批量修改成功！',\n  '批量操作成功！' => '批量操作成功！',\n  'URL链接命名不能是' => 'URL链接命名不能是',\n  '非法URL' => '非法URL',\n  '添加栏目成功，继续添加~' => '添加栏目成功，继续添加~',\n  '模型错误！' => '模型错误！',\n  '不能选择当前栏目及下级为顶级栏目' => '不能选择当前栏目及下级为顶级栏目',\n  '该栏目有子栏目，请先删除子栏目！' => '该栏目有子栏目，请先删除子栏目！',\n  '栏目不能为空！' => '栏目不能为空！',\n  '操作成功！' => '操作成功！',\n  '请选择分类！' => '请选择分类！',\n  '添加成功！继续添加~' => '添加成功！继续添加~',\n  '添加失败！' => '添加失败！',\n  '该分类下存在内容，请先删除该分类下的内容！' => '该分类下存在内容，请先删除该分类下的内容！',\n  '添加成功！' => '添加成功！',\n  '已审核' => '已审核',\n  '被删除' => '被删除',\n  '未审核' => '未审核',\n  '已读' => '已读',\n  '未读' => '未读',\n  '批量审核成功！' => '批量审核成功！',\n  '批量审核失败！' => '批量审核失败！',\n  '您没有权限！' => '您没有权限！',\n  '文件类型不允许上传！' => '文件类型不允许上传！',\n  '文件大小超过网站内部限制！' => '文件大小超过网站内部限制！',\n  '请检查目录写入权限' => '请检查目录写入权限',\n  '错误信息提示' => '错误信息提示',\n  '模块为空，请选择模块！' => '模块为空，请选择模块！',\n  '缺少ID' => '缺少ID',\n  '请选择模块！' => '请选择模块！',\n  '显示' => '显示',\n  '隐藏' => '隐藏',\n  '是' => '是',\n  '否' => '否',\n  '单行文本' => '单行文本',\n  '多行文本' => '多行文本',\n  '文本编辑器' => '文本编辑器',\n  '数字' => '数字',\n  '单图片' => '单图片',\n  '多图片' => '多图片',\n  '单选下拉' => '单选下拉',\n  '多选' => '多选',\n  '单附件' => '单附件',\n  '多附件' => '多附件',\n  '时间戳' => '时间戳',\n  '单选按钮' => '单选按钮',\n  '单选关联' => '单选关联',\n  '小数' => '小数',\n  '多行录入' => '多行录入',\n  '多选关联' => '多选关联',\n  '栏目' => '栏目',\n  '副栏目' => '副栏目',\n  '系统TAG' => '系统TAG',\n  '字段名和字段标识不能为空！' => '字段名和字段标识不能为空！',\n  '字段标识已存在！' => '字段标识已存在！',\n  '系统保护字段，不允许创建！' => '系统保护字段，不允许创建！',\n  '字段长度不对！' => '字段长度不对！',\n  '字段长度不对,时间属性必须长度为11' => '字段长度不对,时间属性必须长度为11',\n  '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '字段长度不对,decimal字段长度格式[整数位数,小数位数]',\n  '字段创建成功，但是字段表记录失败，请反馈官方解决！' => '字段创建成功，但是字段表记录失败，请反馈官方解决！',\n  '字段创建成功！' => '字段创建成功！',\n  '字段修改成功！' => '字段修改成功！',\n  '字段修改失败！' => '字段修改失败！',\n  '上传图片' => '上传图片',\n  '选择图片' => '选择图片',\n  '图片未找到' => '图片未找到',\n  '删除这张图片' => '删除这张图片',\n  '删除' => '删除',\n  '上传异常！' => '上传异常！',\n  '文字描述' => '文字描述',\n  '左移' => '左移',\n  '右移' => '右移',\n  '请选择' => '请选择',\n  '上传附件' => '上传附件',\n  '字段关联绑定失败，请重新绑定！' => '字段关联绑定失败，请重新绑定！',\n  '请选择关联项' => '请选择关联项',\n  'TAG标签' => 'TAG标签',\n  '按Enter回车自动添加' => '按Enter回车自动添加',\n  '添加一个标签' => '添加一个标签',\n  '系统字段不允许删除！' => '系统字段不允许删除！',\n  '请选择字段！' => '请选择字段！',\n  '请选择栏目！' => '请选择栏目！',\n  '参数有误！' => '参数有误！',\n  '请选择桌面配置！' => '请选择桌面配置！',\n  '系统默认不可删除！' => '系统默认不可删除！',\n  '网站地图创建成功！' => '网站地图创建成功！',\n  '网站地图创建失败，请检查根目录权限！' => '网站地图创建失败，请检查根目录权限！',\n  '清除失败！' => '清除失败！',\n  '清除成功！' => '清除成功！',\n  '生成失败！' => '生成失败！',\n  '生成成功！' => '生成成功！',\n  '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~' => '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~',\n  '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~' => '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~',\n  '静态HTML页面已全部清理完毕！' => '静态HTML页面已全部清理完毕！',\n  '总共清理页面数：' => '总共清理页面数：',\n  '每次清理页面数：' => '每次清理页面数：',\n  '停顿时间：' => '停顿时间：',\n  '开始时间：' => '开始时间：',\n  '结束时间：' => '结束时间：',\n  '总共花费时间：' => '总共花费时间：',\n  '总共生成页面数：' => '总共生成页面数：',\n  '每次生成页面数：' => '每次生成页面数：',\n  '系统创建目录失败!' => '系统创建目录失败!',\n  '模块未绑定栏目，无法生存HTML！' => '模块未绑定栏目，无法生存HTML！',\n  '链接错误！' => '链接错误！',\n  '请输入属性名称！' => '请输入属性名称！',\n  '属性已存在！' => '属性已存在！',\n  '参数错误！' => '参数错误！',\n  '系统属性只允许修改和隐藏，不允许删除！' => '系统属性只允许修改和隐藏，不允许删除！',\n  '请输入内链词！' => '请输入内链词！',\n  '请输入内链！' => '请输入内链！',\n  '内链词已存在！' => '内链词已存在！',\n  '已审' => '已审',\n  '退回' => '退回',\n  '未审' => '未审',\n  '账户密码不能为空！' => '账户密码不能为空！',\n  '验证码错误！' => '验证码错误！',\n  '该账户已被封禁！' => '该账户已被封禁！',\n  '登录成功！' => '登录成功！',\n  '账户密码错误！' => '账户密码错误！',\n  '安全退出~' => '安全退出~',\n  '无' => '无',\n  '不显示' => '不显示',\n  '邮箱已被注册！' => '邮箱已被注册！',\n  '添加失败，请重新提交！' => '添加失败，请重新提交！',\n  '没有找到该用户！' => '没有找到该用户！',\n  '该分组下存在用户，请先移除用户再删除！' => '该分组下存在用户，请先移除用户再删除！',\n  '删除失败，该分类有下级功能，请先删除下级功能！' => '删除失败，该分类有下级功能，请先删除下级功能！',\n  '未选择删除对象！' => '未选择删除对象！',\n  '模块名和标识不能为空！' => '模块名和标识不能为空！',\n  '模型已添加不能重复添加！' => '模型已添加不能重复添加！',\n  '该表已存在！' => '该表已存在！',\n  '标题' => '标题',\n  '默认为空' => '默认为空',\n  '所属栏目' => '所属栏目',\n  '选择栏目' => '选择栏目',\n  '绑定后可以在当前模型的其他栏目中显示' => '绑定后可以在当前模型的其他栏目中显示',\n  '关键词' => '关键词',\n  '每个词用英文逗号(,)拼接' => '每个词用英文逗号(,)拼接',\n  '缩略图' => '缩略图',\n  '可留空' => '可留空',\n  '简介' => '简介',\n  '内容' => '内容',\n  '发布会员' => '发布会员',\n  '前台发布会员ID记录' => '前台发布会员ID记录',\n  '管理员' => '管理员',\n  '后台发布管理员ID记录' => '后台发布管理员ID记录',\n  '外链URL' => '外链URL',\n  '默认为空，系统访问内容则直接跳转到此链接' => '默认为空，系统访问内容则直接跳转到此链接',\n  '自定义URL' => '自定义URL',\n  '默认为空，自定义URL' => '默认为空，自定义URL',\n  '点击量' => '点击量',\n  '系统自动添加' => '系统自动添加',\n  '评论数' => '评论数',\n  '系统自带' => '系统自带',\n  '点赞数' => '点赞数',\n  '排序' => '排序',\n  '添加时间' => '添加时间',\n  '选择时间' => '选择时间',\n  '推荐属性' => '推荐属性',\n  '1置顶2热点3推荐' => '1置顶2热点3推荐',\n  '置顶=1,热点=2,推荐=3' => '置顶=1,热点=2,推荐=3',\n  '是否显示' => '是否显示',\n  '显示隐藏' => '显示隐藏',\n  '显示=1,未审=0,退回=2' => '显示=1,未审=0,退回=2',\n  '列表' => '列表',\n  '新增' => '新增',\n  '修改' => '修改',\n  '复制' => '复制',\n  '批量删除' => '批量删除',\n  '批量修改' => '批量修改',\n  '批量复制' => '批量复制',\n  '批量审核' => '批量审核',\n  '管理' => '管理',\n  '新增模型成功，快去创建对应的栏目吧！' => '新增模型成功，快去创建对应的栏目吧！',\n  '新增模型成功，快去设置表字段吧！' => '新增模型成功，快去设置表字段吧！',\n  '新增模型失败！' => '新增模型失败！',\n  '标识不能为空！' => '标识不能为空！',\n  '系统模型标识不允许修改！' => '系统模型标识不允许修改！',\n  '页面有错误，缺少模块ID！' => '页面有错误，缺少模块ID！',\n  '里面存在数据，请先清空表内数据！' => '里面存在数据，请先清空表内数据！',\n  '是系统模型，不允许删除！' => '是系统模型，不允许删除！',\n  '字段表记录未清除，请手动清除！' => '字段表记录未清除，请手动清除！',\n  '模型' => '模型',\n  '用户' => '用户',\n  '栏目链接' => '栏目链接',\n  '外链' => '外链',\n  '自定义链接' => '自定义链接',\n  '发布时间' => '发布时间',\n  '字段名称不能为空！' => '字段名称不能为空！',\n  '显示=1,隐藏=0' => '显示=1,隐藏=0',\n  '显示=1,隐藏=0,退回=2' => '显示=1,隐藏=0,退回=2',\n  '是=1,否=0' => '是=1,否=0',\n  '重构成功！' => '重构成功！',\n  '系统栏目' => '系统栏目',\n  '系统副栏目' => '系统副栏目',\n  '模型标识' => '模型标识',\n  '发布管理员' => '发布管理员',\n  '前台用户' => '前台用户',\n  '待付款' => '待付款',\n  '已付' => '已付',\n  '超时' => '超时',\n  '待审核待支付' => '待审核待支付',\n  '已发货' => '已发货',\n  '已废弃' => '已废弃',\n  '未付' => '未付',\n  '您的订单发货通知' => '您的订单发货通知',\n  '尊敬的' => '尊敬的',\n  '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！' => '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！',\n  '订单详细信息如下：' => '订单详细信息如下：',\n  '主图' => '主图',\n  '价格' => '价格',\n  '购买数量' => '购买数量',\n  '总价' => '总价',\n  '折扣：' => '折扣：',\n  '元' => '元',\n  '运费：' => '运费：',\n  '￥' => '￥',\n  '合计：' => '合计：',\n  '收件地址：' => '收件地址：',\n  '联系电话：' => '联系电话：',\n  '钱包' => '钱包',\n  '积分' => '积分',\n  '充值' => '充值',\n  '兑换' => '兑换',\n  '奖励' => '奖励',\n  '该用户不存在！' => '该用户不存在！',\n  '充值数量不对！' => '充值数量不对！',\n  '操作失败！' => '操作失败！',\n  '插件配置' => '插件配置',\n  '未分类' => '未分类',\n  '商品配置' => '商品配置',\n  '批量复制失败！' => '批量复制失败！',\n  '部分未执行成功！' => '部分未执行成功！',\n  '还原失败，可能是ID已经存在！' => '还原失败，可能是ID已经存在！',\n  '数据不存在！' => '数据不存在！',\n  '删除失败，系统功能不能删除！' => '删除失败，系统功能不能删除！',\n  '配置栏下有自定义配置，无法删除配置栏' => '配置栏下有自定义配置，无法删除配置栏',\n  '已存在配置标识，请重新设置！' => '已存在配置标识，请重新设置！',\n  '提交成功！' => '提交成功！',\n  '删除失败！系统字段不允许删除！' => '删除失败！系统字段不允许删除！',\n  '图片不存在，删除失败！' => '图片不存在，删除失败！',\n  '远程存储图片无法删除！' => '远程存储图片无法删除！',\n  '图片ID错误！' => '图片ID错误！',\n  '部分删除成功，存在远程链接无法删除！' => '部分删除成功，存在远程链接无法删除！',\n  '非法操作' => '非法操作',\n  '请检查目录' => '请检查目录',\n  '写入权限' => '写入权限',\n  '配置成功！' => '配置成功！',\n  '参数存在安全隐患！' => '参数存在安全隐患！',\n  '参数错误,必须携带插件ID！' => '参数错误,必须携带插件ID！',\n  '发生错误' => '发生错误',\n  '下载缓存文件不存在！' => '下载缓存文件不存在！',\n  '请选择使用场景！' => '请选择使用场景！',\n  '执行插件安装程序失败！' => '执行插件安装程序失败！',\n  '安装成功！' => '安装成功！',\n  '备份成功！' => '备份成功！',\n  '该插件暂无更新！' => '该插件暂无更新！',\n  '参数错误,请选择对应模板！' => '参数错误,请选择对应模板！',\n  '文件不存在！' => '文件不存在！',\n  '解压失败！' => '解压失败！',\n  '数据库中没有表!' => '数据库中没有表!',\n  '写入文件失败！' => '写入文件失败！',\n  ' 写入文件失败！' => ' 写入文件失败！',\n  '解压完毕！本次解压花费' => '解压完毕！本次解压花费',\n  '秒' => '秒',\n  '更新成功！' => '更新成功！',\n  '个人中心' => '个人中心',\n  '测试1' => '测试1',\n  '测试2' => '测试2',\n  '测试3' => '测试3',\n  '接口报错' => '接口报错',\n  '微信配置错误！' => '微信配置错误！',\n  '网站首页' => '网站首页',\n  '首页' => '首页',\n  '碎片化管理' => '碎片化管理',\n  '新增碎片' => '新增碎片',\n  '刷新' => '刷新',\n  '基本信息' => '基本信息',\n  '使用说明' => '使用说明',\n  '指定几个id或者几个tid的内容输出' => '指定几个id或者几个tid的内容输出',\n  'SQL中输入' => 'SQL中输入',\n  '或者' => '或者',\n  '模糊查询，查询标题跟 “网站建设” 相关的内容' => '模糊查询，查询标题跟 “网站建设” 相关的内容',\n  '网站建设' => '网站建设',\n  '模糊查询，查询标题/内容跟 “网站建设” 相关的内容' => '模糊查询，查询标题/内容跟 “网站建设” 相关的内容',\n  '不支持联表查询' => '不支持联表查询',\n  '注意字符串都要使用英文单引号' => '注意字符串都要使用英文单引号',\n  '如' => '如',\n  '碎片名称' => '碎片名称',\n  '碎片标识' => '碎片标识',\n  '建议英文，不要重复' => '建议英文，不要重复',\n  '不限栏目' => '不限栏目',\n  '子栏目包含' => '子栏目包含',\n  '包含' => '包含',\n  '不包含' => '不包含',\n  '输出条数' => '输出条数',\n  '0表示输出所有' => '0表示输出所有',\n  '更新周期' => '更新周期',\n  '单位' => '单位',\n  '分钟' => '分钟',\n  '保存' => '保存',\n  '返回' => '返回',\n  '确定' => '确定',\n  '导航管理' => '导航管理',\n  '新增导航' => '新增导航',\n  '导航名称' => '导航名称',\n  '导航菜单' => '导航菜单',\n  '链接' => '链接',\n  '打开' => '打开',\n  '操作' => '操作',\n  '不填默认栏目名称' => '不填默认栏目名称',\n  '自定义链接则需要填写' => '自定义链接则需要填写',\n  '本页面' => '本页面',\n  '新页面' => '新页面',\n  '管理员管理' => '管理员管理',\n  '新增管理员信息' => '新增管理员信息',\n  '基本' => '基本',\n  '扩展' => '扩展',\n  '登录名' => '登录名',\n  '将会成为您唯一的登入名' => '将会成为您唯一的登入名',\n  '手机' => '手机',\n  '邮箱' => '邮箱',\n  '角色' => '角色',\n  '选择角色' => '选择角色',\n  '密码' => '密码',\n  '6到16个字符,不改请留空' => '6到16个字符,不改请留空',\n  '确认密码' => '确认密码',\n  '状态' => '状态',\n  '正常' => '正常',\n  '禁用' => '禁用',\n  '增加成功' => '增加成功',\n  '修改管理员信息' => '修改管理员信息',\n  '管理员列表' => '管理员列表',\n  '搜索' => '搜索',\n  '是否封禁' => '是否封禁',\n  '封禁' => '封禁',\n  '开始日' => '开始日',\n  '截止日' => '截止日',\n  '请输入用户名' => '请输入用户名',\n  '编辑' => '编辑',\n  '添加管理员' => '添加管理员',\n  '正常|封禁' => '正常|封禁',\n  '所属角色' => '所属角色',\n  '登录时间' => '登录时间',\n  '注册时间' => '注册时间',\n  '确认要删除吗？' => '确认要删除吗？',\n  '请选择对象！' => '请选择对象！',\n  '批量删除成功' => '批量删除成功',\n  '个人信息' => '个人信息',\n  '基础' => '基础',\n  '设置' => '设置',\n  '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！' => '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！',\n  '恢复数据' => '恢复数据',\n  '此规则配置仅在不填留空的情况下才会触发' => '此规则配置仅在不填留空的情况下才会触发',\n  'SEO标题' => 'SEO标题',\n  '等于内容标题' => '等于内容标题',\n  '不填则留空' => '不填则留空',\n  '缩略图规则' => '缩略图规则',\n  '自动获取内容第一张图片' => '自动获取内容第一张图片',\n  '不自动获取' => '不自动获取',\n  '简介规则' => '简介规则',\n  '自动获取内容前200字符' => '自动获取内容前200字符',\n  'TAG规则' => 'TAG规则',\n  '同步关键词' => '同步关键词',\n  '不同步关键词' => '不同步关键词',\n  '敏感词过滤字段' => '敏感词过滤字段',\n  '需要过滤敏感词在系统配置中进行设置' => '需要过滤敏感词在系统配置中进行设置',\n  '请输入需要过滤的字段' => '请输入需要过滤的字段',\n  '返回列表' => '返回列表',\n  '取消' => '取消',\n  '预览' => '预览',\n  '批量修改栏目' => '批量修改栏目',\n  '修改推荐属性' => '修改推荐属性',\n  '审核' => '审核',\n  '列表字段设置' => '列表字段设置',\n  '顶' => '顶',\n  '热' => '热',\n  '荐' => '荐',\n  '请选择修改栏目！' => '请选择修改栏目！',\n  '确认要批量修改内容分类吗？' => '确认要批量修改内容分类吗？',\n  '批量修改成功' => '批量修改成功',\n  '请选择修改属性！' => '请选择修改属性！',\n  '请选择修改对象！' => '请选择修改对象！',\n  '请选择审核选项！' => '请选择审核选项！',\n  '请选择审核对象！' => '请选择审核对象！',\n  '确认要批量处理吗？' => '确认要批量处理吗？',\n  '批量审核成功' => '批量审核成功',\n  '确认要复制吗？' => '确认要复制吗？',\n  '批量复制成功' => '批量复制成功',\n  '添加属性' => '添加属性',\n  '名称' => '名称',\n  '修改属性' => '修改属性',\n  '新增属性' => '新增属性',\n  '系统设置' => '系统设置',\n  '数据库管理' => '数据库管理',\n  '备份数据库' => '备份数据库',\n  '备份数：' => '备份数：',\n  '数据库备份名' => '数据库备份名',\n  '大小' => '大小',\n  '备份副本' => '备份副本',\n  '还原数据' => '还原数据',\n  '删除备份' => '删除备份',\n  '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？' => '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？',\n  '您确定要删除备份数据库吗？删除后将不可找回！' => '您确定要删除备份数据库吗？删除后将不可找回！',\n  '数据缓存' => '数据缓存',\n  '文件夹cache/data，主要是网站内容缓存，栏目，详情页等' => '文件夹cache/data，主要是网站内容缓存，栏目，详情页等',\n  '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空' => '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空',\n  '日志缓存' => '日志缓存',\n  '文件夹cache/log，包括错误日志、支付日志、登录日志等' => '文件夹cache/log，包括错误日志、支付日志、登录日志等',\n  '模板缓存' => '模板缓存',\n  '文件夹cache，主要是程序执行时生成的模板编译文件' => '文件夹cache，主要是程序执行时生成的模板编译文件',\n  '缩略图缓存' => '缩略图缓存',\n  '文件夹image，主要是程序执行时生成的自定义缩略图' => '文件夹image，主要是程序执行时生成的自定义缩略图',\n  '立即清空' => '立即清空',\n  '请选择清空目标！' => '请选择清空目标！',\n  '清理成功！' => '清理成功！',\n  '内链管理' => '内链管理',\n  '添加内链' => '添加内链',\n  '内链词' => '内链词',\n  '内链' => '内链',\n  '替换词' => '替换词',\n  '替换次数' => '替换次数',\n  '替换词，可为空！' => '替换词，可为空！',\n  '请填写内链' => '请填写内链',\n  '替换次数，默认-1，替换全部，可不写。' => '替换次数，默认-1，替换全部，可不写。',\n  '提交' => '提交',\n  '修改内链' => '修改内链',\n  '内链词和内链不能为空！' => '内链词和内链不能为空！',\n  '充值类型' => '充值类型',\n  '当前兑换率：' => '当前兑换率：',\n  '兑换率指1元相当于多少钱包/积分' => '兑换率指1元相当于多少钱包/积分',\n  '交易类型' => '交易类型',\n  '赠送' => '赠送',\n  '充值数量' => '充值数量',\n  '用户ID' => '用户ID',\n  '备注' => '备注',\n  '添加' => '添加',\n  '充值管理' => '充值管理',\n  '充值列表' => '充值列表',\n  '选择交易类型' => '选择交易类型',\n  '买入' => '买入',\n  '选择交易种类' => '选择交易种类',\n  '请输入前台用户手机号' => '请输入前台用户手机号',\n  '请输入用户昵称' => '请输入用户昵称',\n  '请输入订单号' => '请输入订单号',\n  '会员充值' => '会员充值',\n  '总订单' => '总订单',\n  '已充值' => '已充值',\n  '已兑换' => '已兑换',\n  '总赠送' => '总赠送',\n  '尾页' => '尾页',\n  '订单号' => '订单号',\n  '类型' => '类型',\n  '交易' => '交易',\n  '用户名' => '用户名',\n  '数量' => '数量',\n  '金额' => '金额',\n  '时间' => '时间',\n  '查看' => '查看',\n  '选择模块' => '选择模块',\n  '选择上级' => '选择上级',\n  '顶级栏目' => '顶级栏目',\n  '分类名' => '分类名',\n  '图片  ' => '图片  ',\n  '择图片' => '择图片',\n  '排序规则' => '排序规则',\n  '组合：排序倒序，时间倒序，ID倒序' => '组合：排序倒序，时间倒序，ID倒序',\n  '组合：排序倒序，ID正序' => '组合：排序倒序，ID正序',\n  '排序正序' => '排序正序',\n  '时间倒序' => '时间倒序',\n  'ID正序' => 'ID正序',\n  '点击量倒序' => '点击量倒序',\n  '时间正序' => '时间正序',\n  '默认不需要更改' => '默认不需要更改',\n  'URL命名' => 'URL命名',\n  '请填写文件名，如:index，不填请留空' => '请填写文件名，如:index，不填请留空',\n  '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：' => '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：',\n  '多个相同URL，将覆盖前面的栏目' => '多个相同URL，将覆盖前面的栏目',\n  '列表显示' => '列表显示',\n  '设置列表页显示的内容条数' => '设置列表页显示的内容条数',\n  '栏目模板' => '栏目模板',\n  '手动填写，不填请留空' => '手动填写，不填请留空',\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页',\n  '详情页模板' => '详情页模板',\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。' => '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。',\n  '栏目外链' => '栏目外链',\n  '栏目外链，如:htt://xxx.com/abc，不填请留空' => '栏目外链，如:htt://xxx.com/abc，不填请留空',\n  '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！' => '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！',\n  '发布显示' => '发布显示',\n  '勾选后，前台会员发布会显示该栏目' => '勾选后，前台会员发布会显示该栏目',\n  '导航显示' => '导航显示',\n  '模板覆盖' => '模板覆盖',\n  '覆盖' => '覆盖',\n  '不覆盖' => '不覆盖',\n  '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。',\n  '访问限制' => '访问限制',\n  '是否关闭' => '是否关闭',\n  '关闭' => '关闭',\n  '开启' => '开启',\n  '栏目关闭后，前台不显示，也无法访问！' => '栏目关闭后，前台不显示，也无法访问！',\n  '增加' => '增加',\n  '请选择模板页面/使用自定义' => '请选择模板页面/使用自定义',\n  '批量新增' => '批量新增',\n  '添加栏目' => '添加栏目',\n  '格式：栏目名|栏目URL，一行一个，如：关于我们|about' => '格式：栏目名|栏目URL，一行一个，如：关于我们|about',\n  '格式：栏目名|栏目URL，一行一个' => '格式：栏目名|栏目URL，一行一个',\n  '请选择模板页面' => '请选择模板页面',\n  '图片 ' => '图片 ',\n  '请填写完整文件名，如:index，不填请留空' => '请填写完整文件名，如:index，不填请留空',\n  ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。',\n  '请选择栏目' => '请选择栏目',\n  '顶级' => '顶级',\n  '展开|折叠' => '展开|折叠',\n  '模块名' => '模块名',\n  '快捷操作' => '快捷操作',\n  '显示|隐藏' => '显示|隐藏',\n  '添加下级' => '添加下级',\n  '字段管理' => '字段管理',\n  '新增文章' => '新增文章',\n  '新增商品' => '新增商品',\n  '新增内容' => '新增内容',\n  '请选择对象' => '请选择对象',\n  '已删除!' => '已删除!',\n  '删除成功' => '删除成功',\n  '扩展管理' => '扩展管理',\n  '新增轮播图' => '新增轮播图',\n  '所属分类' => '所属分类',\n  '图片' => '图片',\n  '图片高' => '图片高',\n  '0表示不限制' => '0表示不限制',\n  '图片宽' => '图片宽',\n  '跳转链接' => '跳转链接',\n  '不填请留空' => '不填请留空',\n  '数字越大越靠前' => '数字越大越靠前',\n  '修改轮播图' => '修改轮播图',\n  '选择分类' => '选择分类',\n  '更新时间' => '更新时间',\n  '轮播图列表' => '轮播图列表',\n  '请选择分类' => '请选择分类',\n  '请输入标题' => '请输入标题',\n  '新增图片' => '新增图片',\n  '分类列表' => '分类列表',\n  '添加分类' => '添加分类',\n  '共有数据：' => '共有数据：',\n  '条' => '条',\n  '长' => '长',\n  '宽' => '宽',\n  '轮播图分类' => '轮播图分类',\n  '评论管理' => '评论管理',\n  '添加评论' => '添加评论',\n  '评论栏目' => '评论栏目',\n  '文章ID' => '文章ID',\n  '主回复ID' => '主回复ID',\n  '同属于一个评论的ID，如果没有评论中的评论，则为0' => '同属于一个评论的ID，如果没有评论中的评论，则为0',\n  '回复帖子ID' => '回复帖子ID',\n  '评论内容' => '评论内容',\n  '管理员回复' => '管理员回复',\n  '是否提醒回复' => '是否提醒回复',\n  '提醒' => '提醒',\n  '不提醒' => '不提醒',\n  '喜欢/点赞' => '喜欢/点赞',\n  '是否已读' => '是否已读',\n  '是否删除' => '是否删除',\n  '已删除' => '已删除',\n  '未删除' => '未删除',\n  '只能管理员删除评论，用户只能软删除评论' => '只能管理员删除评论，用户只能软删除评论',\n  '查看评论' => '查看评论',\n  '评论列表' => '评论列表',\n  '请输入评论内容' => '请输入评论内容',\n  '查看相关内容' => '查看相关内容',\n  '查看用户' => '查看用户',\n  '所属文章' => '所属文章',\n  '评论时间' => '评论时间',\n  '请选择审核选项' => '请选择审核选项',\n  '批量处理成功' => '批量处理成功',\n  '调用方式' => '调用方式',\n  '这里输出想要的内容，如：' => '这里输出想要的内容，如：',\n  '查看SQL' => '查看SQL',\n  '系统扩展' => '系统扩展',\n  '桌面管理' => '桌面管理',\n  '新增配置' => '新增配置',\n  '配置名称' => '配置名称',\n  '左侧菜单栏' => '左侧菜单栏',\n  '没有二级菜单不会生效' => '没有二级菜单不会生效',\n  '顶部菜单栏' => '顶部菜单栏',\n  '适用角色' => '适用角色',\n  '默认所有' => '默认所有',\n  '系统默认' => '系统默认',\n  '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置' => '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置',\n  '一个菜单名称' => '一个菜单名称',\n  '顶级菜单' => '顶级菜单',\n  '菜单图标' => '菜单图标',\n  '二级菜单' => '二级菜单',\n  '图标' => '图标',\n  '修改菜单名称' => '修改菜单名称',\n  '确定要删除吗？' => '确定要删除吗？',\n  '最后一个索引不能删除！' => '最后一个索引不能删除！',\n  '添加菜单名称' => '添加菜单名称',\n  '菜单选择' => '菜单选择',\n  '图标选择' => '图标选择',\n  '修改配置' => '修改配置',\n  '桌面名称' => '桌面名称',\n  '系统' => '系统',\n  '是否默认' => '是否默认',\n  '所有角色' => '所有角色',\n  '复制配置' => '复制配置',\n  '修改碎片' => '修改碎片',\n  '指定几个id或者几个tid的内容输出(栏目：不限制栏目)' => '指定几个id或者几个tid的内容输出(栏目：不限制栏目)',\n  'SQL中输入：' => 'SQL中输入：',\n  'SQL中输入： ' => 'SQL中输入： ',\n  '如： ' => '如： ',\n  '单位：分钟' => '单位：分钟',\n  '修改导航' => '修改导航',\n  '扩展模型管理' => '扩展模型管理',\n  '模块管理' => '模块管理',\n  '新增字段' => '新增字段',\n  '角色绑定' => '角色绑定',\n  '目绑定' => '目绑定',\n  '字段名称' => '字段名称',\n  '简短的名称' => '简短的名称',\n  '字段标识' => '字段标识',\n  '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短' => '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短',\n  '字段类型' => '字段类型',\n  '选择' => '选择',\n  '长度' => '长度',\n  '说明' => '说明',\n  '不限' => '不限',\n  '带编辑器文本' => '带编辑器文本',\n  '只能填写数字，长度不能超过11位' => '只能填写数字，长度不能超过11位',\n  '金钱，小数等，保留2位' => '金钱，小数等，保留2位',\n  '时间日期' => '时间日期',\n  '多图，图集' => '多图，图集',\n  '红=1,黄=2' => '红=1,黄=2',\n  '单项选择，下拉选择，如：红=1,黄=2,蓝=3' => '单项选择，下拉选择，如：红=1,黄=2,蓝=3',\n  '单项选择，按钮选择，如：红=1,黄=2,蓝=3' => '单项选择，按钮选择，如：红=1,黄=2,蓝=3',\n  '多项选择，如：红=1,黄=2,蓝=3' => '多项选择，如：红=1,黄=2,蓝=3',\n  '一个附件，压缩包，Excel，Word文档' => '一个附件，压缩包，Excel，Word文档',\n  '多个附件，压缩包，Excel，Word文档' => '多个附件，压缩包，Excel，Word文档',\n  '请选择关联模块' => '请选择关联模块',\n  '列表显示字段' => '列表显示字段',\n  '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容',\n  '多行录入，可以在页面动态新增内容输入框' => '多行录入，可以在页面动态新增内容输入框',\n  '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容',\n  '系统栏目，不可修改' => '系统栏目，不可修改',\n  '系统副栏目，不可修改' => '系统副栏目，不可修改',\n  '系统TAG，不可修改' => '系统TAG，不可修改',\n  '默认值' => '默认值',\n  '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1' => '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1',\n  '字段提示' => '字段提示',\n  '用于填写时的提示信息，50字以内' => '用于填写时的提示信息，50字以内',\n  '表单排序' => '表单排序',\n  '是否必填' => '是否必填',\n  '必填' => '必填',\n  '非必填' => '非必填',\n  '带有文本框编辑器的除外' => '带有文本框编辑器的除外',\n  '前台显示' => '前台显示',\n  '前台表单' => '前台表单',\n  '后台显示' => '后台显示',\n  '后台搜索' => '后台搜索',\n  '仅用于后台列表头部带有该字段搜索' => '仅用于后台列表头部带有该字段搜索',\n  '列表中显示' => '列表中显示',\n  '仅用于后台列表显示该字段' => '仅用于后台列表显示该字段',\n  '显示格式化' => '显示格式化',\n  '不做处理' => '不做处理',\n  '仅用于后台列表显示该字段内容处理' => '仅用于后台列表显示该字段内容处理',\n  'ajax可访问' => 'ajax可访问',\n  '不能' => '不能',\n  '能' => '能',\n  '由于本系统对json数据封装，限制访问可以提高安全性' => '由于本系统对json数据封装，限制访问可以提高安全性',\n  '角色名' => '角色名',\n  '栏目名' => '栏目名',\n  '修改字段' => '修改字段',\n  '栏目绑定' => '栏目绑定',\n  '红=1,黄=2,蓝=3' => '红=1,黄=2,蓝=3',\n  '关联模块内容ID' => '关联模块内容ID',\n  '可以在页面动态新增内容输入框' => '可以在页面动态新增内容输入框',\n  '温馨提示：排序和宽度在列表点击也可以更改。' => '温馨提示：排序和宽度在列表点击也可以更改。',\n  '排序：当前列表显示排序，不会影响录入排序，越大越靠前。' => '排序：当前列表显示排序，不会影响录入排序，越大越靠前。',\n  '搜索：在列表顶部的搜索中，可以搜索该字段。' => '搜索：在列表顶部的搜索中，可以搜索该字段。',\n  '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。' => '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。',\n  '宽度' => '宽度',\n  '批量绑定栏目' => '批量绑定栏目',\n  '字段' => '字段',\n  '后台' => '后台',\n  '确认要删除吗？删除的同时将删除对应的表内容！' => '确认要删除吗？删除的同时将删除对应的表内容！',\n  '角色管理' => '角色管理',\n  '角色修改' => '角色修改',\n  '是否超管' => '是否超管',\n  '不是' => '不是',\n  '超级管理员拥有无上权利，无视下面权限限制' => '超级管理员拥有无上权利，无视下面权限限制',\n  '发布审核' => '发布审核',\n  '超级管理员除外，发布的内容是否需要审核' => '超级管理员除外，发布的内容是否需要审核',\n  '栏目权限' => '栏目权限',\n  '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效' => '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效',\n  '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目' => '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目',\n  '子栏目' => '子栏目',\n  '拥有权限' => '拥有权限',\n  '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块' => '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块',\n  '主模块' => '主模块',\n  '子模块' => '子模块',\n  '描述' => '描述',\n  '请输入内容' => '请输入内容',\n  '关闭后，该分组管理员将不能登录' => '关闭后，该分组管理员将不能登录',\n  '添加角色' => '添加角色',\n  '后台管理' => '后台管理',\n  '展开左侧栏' => '展开左侧栏',\n  '清理缓存' => '清理缓存',\n  '退出' => '退出',\n  '前台首页' => '前台首页',\n  '后台首页' => '后台首页',\n  '我的桌面' => '我的桌面',\n  '关闭当前' => '关闭当前',\n  '关闭其他' => '关闭其他',\n  '关闭所有' => '关闭所有',\n  '扩展模块管理' => '扩展模块管理',\n  '批量修改分类' => '批量修改分类',\n  '批量处理' => '批量处理',\n  '友情链接分类' => '友情链接分类',\n  '分类' => '分类',\n  '后台管理登录' => '后台管理登录',\n  '验证码' => '验证码',\n  '登录' => '登录',\n  '登录ID' => '登录ID',\n  '登录用户' => '登录用户',\n  '模块' => '模块',\n  '方法' => '方法',\n  '操作时间' => '操作时间',\n  '会员管理' => '会员管理',\n  '新增会员' => '新增会员',\n  '用于找回密码' => '用于找回密码',\n  '手机号' => '手机号',\n  '必须唯一' => '必须唯一',\n  '昵称' => '昵称',\n  '分组' => '分组',\n  '头像' => '头像',\n  '生日' => '生日',\n  '个性签名' => '个性签名',\n  '省份' => '省份',\n  '城市' => '城市',\n  '详细地址' => '详细地址',\n  '6到16个字符' => '6到16个字符',\n  '添加成功' => '添加成功',\n  '会员修' => '会员修',\n  '6到16个字符,不修改请留空' => '6到16个字符,不修改请留空',\n  '修改成功' => '修改成功',\n  '会员列表' => '会员列表',\n  '请输入手机号' => '请输入手机号',\n  '余额' => '余额',\n  '加入时间' => '加入时间',\n  '分组管理' => '分组管理',\n  '分组修改' => '分组修改',\n  '分组名' => '分组名',\n  '折扣类型' => '折扣类型',\n  '无折扣' => '无折扣',\n  '现金折扣' => '现金折扣',\n  '百分比折扣' => '百分比折扣',\n  '折扣金额' => '折扣金额',\n  '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效' => '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效',\n  '登录状态' => '登录状态',\n  '请选择所属单位！' => '请选择所属单位！',\n  '用户管理' => '用户管理',\n  '会员分组' => '会员分组',\n  '添加分组' => '添加分组',\n  '温馨提示：前台权限已关闭，设置权限不会生效。' => '温馨提示：前台权限已关闭，设置权限不会生效。',\n  '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！' => '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！',\n  '留言管理' => '留言管理',\n  '查看留言' => '查看留言',\n  '问题描述' => '问题描述',\n  '用户昵称' => '用户昵称',\n  '留言栏目' => '留言栏目',\n  '不指定栏目' => '不指定栏目',\n  '联系电话' => '联系电话',\n  '留言IP' => '留言IP',\n  '留言内容' => '留言内容',\n  '是否审核' => '是否审核',\n  '提交时间' => '提交时间',\n  '修改保存' => '修改保存',\n  '留言列表' => '留言列表',\n  '请输入相关内容ID' => '请输入相关内容ID',\n  '内容ID' => '内容ID',\n  '模型管理' => '模型管理',\n  '新增模型' => '新增模型',\n  '模型名称' => '模型名称',\n  '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名' => '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名',\n  '是否必选栏目' => '是否必选栏目',\n  '新增修改内容时必选' => '新增修改内容时必选',\n  '是否显示栏目' => '是否显示栏目',\n  '列表展示、录入内容、修改内容三个页面是否展示栏目' => '列表展示、录入内容、修改内容三个页面是否展示栏目',\n  '是否受权限控制' => '是否受权限控制',\n  '不同角色可以通过控制栏目权限来限制查看内容' => '不同角色可以通过控制栏目权限来限制查看内容',\n  '栏目绑定显示' => '栏目绑定显示',\n  '栏目绑定时是否显示该模型' => '栏目绑定时是否显示该模型',\n  '前台发布' => '前台发布',\n  '前台是否允许发布' => '前台是否允许发布',\n  '列表模板' => '列表模板',\n  '默认列表模板' => '默认列表模板',\n  '详情模板' => '详情模板',\n  '默认详情模板' => '默认详情模板',\n  '是否开启' => '是否开启',\n  '数值越小越靠前' => '数值越小越靠前',\n  '已有表' => '已有表',\n  '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"' => '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"',\n  '是否可以预览' => '是否可以预览',\n  '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]' => '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]',\n  '修改模型' => '修改模型',\n  '模型状态' => '模型状态',\n  '模型分类' => '模型分类',\n  '允许' => '允许',\n  '已停用' => '已停用',\n  '已启用' => '已启用',\n  '重构字段' => '重构字段',\n  '确认要删除吗？删除的同时将删除对应的表！' => '确认要删除吗？删除的同时将删除对应的表！',\n  '订单列表' => '订单列表',\n  '订单详情' => '订单详情',\n  '姓名' => '姓名',\n  '是否支付' => '是否支付',\n  '已支付' => '已支付',\n  '未支付' => '未支付',\n  '支付时间' => '支付时间',\n  '存储内容' => '存储内容',\n  '订单内容' => '订单内容',\n  '商品' => '商品',\n  '商品已删除' => '商品已删除',\n  '收货信息：' => '收货信息：',\n  '收件人：' => '收件人：',\n  '联系手机：' => '联系手机：',\n  '联系邮箱：' => '联系邮箱：',\n  '收货地址：' => '收货地址：',\n  '订单状态' => '订单状态',\n  '订单已删除' => '订单已删除',\n  '已提交未支付' => '已提交未支付',\n  '超时订单' => '超时订单',\n  '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件',\n  '发货时间' => '发货时间',\n  '确定修改' => '确定修改',\n  '订单管理' => '订单管理',\n  '选择状态' => '选择状态',\n  '支付方式' => '支付方式',\n  '线下支付' => '线下支付',\n  '钱包支付' => '钱包支付',\n  '积分兑换' => '积分兑换',\n  '支付宝支付' => '支付宝支付',\n  '微信支付' => '微信支付',\n  '微信H5支付' => '微信H5支付',\n  '微信扫码支付' => '微信扫码支付',\n  '支付宝H5支付' => '支付宝H5支付',\n  '总收入' => '总收入',\n  '付款方式' => '付款方式',\n  '是否付款' => '是否付款',\n  '付款时间' => '付款时间',\n  '图库管理' => '图库管理',\n  '筛选上传入口' => '筛选上传入口',\n  '前台' => '前台',\n  '筛选模块' => '筛选模块',\n  '其他杂项' => '其他杂项',\n  '系统配置' => '系统配置',\n  '筛选栏目' => '筛选栏目',\n  '上传前台' => '上传前台',\n  '所属模块' => '所属模块',\n  '本地文件' => '本地文件',\n  '文件大小' => '文件大小',\n  '其他' => '其他',\n  '插件管理' => '插件管理',\n  '插件列表' => '插件列表',\n  '全部' => '全部',\n  '本地' => '本地',\n  '请输入插件名字' => '请输入插件名字',\n  '插件名' => '插件名',\n  '版本' => '版本',\n  '作者' => '作者',\n  '平台' => '平台',\n  '插件文件' => '插件文件',\n  '开关' => '开关',\n  '安装说明' => '安装说明',\n  '点击查看' => '点击查看',\n  '更新说明' => '更新说明',\n  '新' => '新',\n  '官方' => '官方',\n  '第三方' => '第三方',\n  '开|停' => '开|停',\n  '配置' => '配置',\n  '导出' => '导出',\n  '卸载' => '卸载',\n  '安装' => '安装',\n  '下载' => '下载',\n  '获取文件大小失败，请检查网络！' => '获取文件大小失败，请检查网络！',\n  '正在安装中，请稍等~' => '正在安装中，请稍等~',\n  '正在删除中，请稍等~' => '正在删除中，请稍等~',\n  '正在卸载中，请稍等~' => '正在卸载中，请稍等~',\n  '设置接口' => '设置接口',\n  '当前版本：' => '当前版本：',\n  '最新版本：' => '最新版本：',\n  '作者：' => '作者：',\n  '更新时间：' => '更新时间：',\n  '更新内容' => '更新内容',\n  '正在下载文件' => '正在下载文件',\n  '升级插件' => '升级插件',\n  '文件下载完成！正在解压~' => '文件下载完成！正在解压~',\n  '文件解压完成！正在进行安装~' => '文件解压完成！正在进行安装~',\n  '插件升级成功！' => '插件升级成功！',\n  '插件已升级完毕！' => '插件已升级完毕！',\n  '功能' => '功能',\n  '函数名' => '函数名',\n  '对应的控制器/函数，如果是顶级，则只需要写控制器名' => '对应的控制器/函数，如果是顶级，则只需要写控制器名',\n  '权限列表' => '权限列表',\n  '添加权限' => '添加权限',\n  '控制器/方法' => '控制器/方法',\n  '添加子功能' => '添加子功能',\n  '权限管理' => '权限管理',\n  '栏目选择' => '栏目选择',\n  '权限选择' => '权限选择',\n  '不能选择的权限是非独立功能' => '不能选择的权限是非独立功能',\n  '请先勾选菜单!' => '请先勾选菜单!',\n  '扩展信息' => '扩展信息',\n  '回收站' => '回收站',\n  '还原' => '还原',\n  '批量恢复' => '批量恢复',\n  '确认要删除吗？删除后就彻底无法恢复了！' => '确认要删除吗？删除后就彻底无法恢复了！',\n  '确认要删除吗？删除后不可恢复！' => '确认要删除吗？删除后不可恢复！',\n  '确认要还原吗？' => '确认要还原吗？',\n  '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。' => '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。',\n  '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改',\n  '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。',\n  '数据类型' => '数据类型',\n  '录入类型' => '录入类型',\n  '归属' => '归属',\n  '插件' => '插件',\n  '独立功能' => '独立功能',\n  '桌面管理配置时，将调用独立功能' => '桌面管理配置时，将调用独立功能',\n  '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录' => '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录',\n  '如果不生成静态文件，请改为' => '如果不生成静态文件，请改为',\n  '手机端未开启，sitemap不会包含手机端URL' => '手机端未开启，sitemap不会包含手机端URL',\n  'PC端网站地图：' => 'PC端网站地图：',\n  '手机端网站地图：' => '手机端网站地图：',\n  '网站地图' => '网站地图',\n  '模块名称' => '模块名称',\n  '更新频率' => '更新频率',\n  '站内权重' => '站内权重',\n  '输出范围' => '输出范围',\n  '栏目模块' => '栏目模块',\n  '显示的栏目' => '显示的栏目',\n  '所有的栏目' => '所有的栏目',\n  '文章模块' => '文章模块',\n  '显示的文章' => '显示的文章',\n  '所有的文章' => '所有的文章',\n  '商品模块' => '商品模块',\n  '显示的商品' => '显示的商品',\n  '所有的商品' => '所有的商品',\n  '显示的' => '显示的',\n  '所有的' => '所有的',\n  '立即生成' => '立即生成',\n  '网站设置' => '网站设置',\n  '自定义配置' => '自定义配置',\n  '点击复制' => '点击复制',\n  '上传文件' => '上传文件',\n  '不选' => '不选',\n  '删除配置栏' => '删除配置栏',\n  '选择类型' => '选择类型',\n  '编辑器' => '编辑器',\n  '文件上传' => '文件上传',\n  '下拉选项' => '下拉选项',\n  '栏目选项' => '栏目选项',\n  '代码' => '代码',\n  '请填写配置名(中文)' => '请填写配置名(中文)',\n  '配置标识(字母或数字)' => '配置标识(字母或数字)',\n  '配置栏目' => '配置栏目',\n  '提示信息' => '提示信息',\n  '自定义配置可以配置对应配置栏下的自定义内容' => '自定义配置可以配置对应配置栏下的自定义内容',\n  '下拉选项配置，如：开启=1,关闭=0' => '下拉选项配置，如：开启=1,关闭=0',\n  '自定义配置栏' => '自定义配置栏',\n  '请填写配置栏名(中文)' => '请填写配置栏名(中文)',\n  '配置标识(必须是字母)' => '配置标识(必须是字母)',\n  '配置标识用于权限控制，必填且不能与原系统配置栏重复' => '配置标识用于权限控制，必填且不能与原系统配置栏重复',\n  '失败！' => '失败！',\n  '模板管理' => '模板管理',\n  '模板列表' => '模板列表',\n  '请输入模板名字' => '请输入模板名字',\n  '有更新' => '有更新',\n  '已使用' => '已使用',\n  '备份数据' => '备份数据',\n  '安装模板' => '安装模板',\n  '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？' => '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？',\n  '提示' => '提示',\n  '安装提示' => '安装提示',\n  '该模板用于：' => '该模板用于：',\n  'PC端' => 'PC端',\n  '手机端' => '手机端',\n  '微信端' => '微信端',\n  '升级模板' => '升级模板',\n  '模板升级成功！' => '模板升级成功！',\n  '模板已升级完毕！' => '模板已升级完毕！',\n  '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！' => '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！',\n  '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭',\n  '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！' => '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！',\n  '指定栏目' => '指定栏目',\n  '所有栏目' => '所有栏目',\n  '生成电脑静态' => '生成电脑静态',\n  '生成手机静态' => '生成手机静态',\n  '清理电脑静态HTML' => '清理电脑静态HTML',\n  '清理手机静态HTML' => '清理手机静态HTML',\n  '批量生成电脑静态' => '批量生成电脑静态',\n  '批量生成手机静态' => '批量生成手机静态',\n  '批量清理电脑静态' => '批量清理电脑静态',\n  '批量清理手机静态' => '批量清理手机静态',\n  '正在处理~' => '正在处理~',\n  '正在准备生成静态，请不要关闭页面~' => '正在准备生成静态，请不要关闭页面~',\n  '正在准备清理电脑端静态HTML，请不要关闭页面~' => '正在准备清理电脑端静态HTML，请不要关闭页面~',\n  '正在准备清理手机端静态HTML，请不要关闭页面~' => '正在准备清理手机端静态HTML，请不要关闭页面~',\n  '欢迎管理员：' => '欢迎管理员：',\n  '当前时间' => '当前时间',\n  '站内用户' => '站内用户',\n  '人' => '人',\n  '站内文章' => '站内文章',\n  '篇' => '篇',\n  '站内产品' => '站内产品',\n  '件' => '件',\n  '站内留言' => '站内留言',\n  '最近更新' => '最近更新',\n  '全部文章' => '全部文章',\n  '阅读量' => '阅读量',\n  '最新评论' => '最新评论',\n  '在' => '在',\n  '发布了评论' => '发布了评论',\n  '版本信息' => '版本信息',\n  '当前版本' => '当前版本',\n  '项目地址' => '项目地址',\n  '服务器' => '服务器',\n  '操作系统' => '操作系统',\n  '运行环境' => '运行环境',\n  'PHP版本' => 'PHP版本',\n  '运行方式' => '运行方式',\n  '上传限制' => '上传限制',\n  '用户留言' => '用户留言',\n  '回复' => '回复',\n  '星期天' => '星期天',\n  '星期一' => '星期一',\n  '星期二' => '星期二',\n  '星期三' => '星期三',\n  '星期四' => '星期四',\n  '星期五' => '星期五',\n  '星期六' => '星期六',\n  '评论模块未开启！' => '评论模块未开启！',\n  '您的操作过于频繁，请十分钟后再试~' => '您的操作过于频繁，请十分钟后再试~',\n  '评论内容不能为空！' => '评论内容不能为空！',\n  '请提交栏目ID' => '请提交栏目ID',\n  '栏目ID不能为空！' => '栏目ID不能为空！',\n  '评论奖励' => '评论奖励',\n  '评价成功！' => '评价成功！',\n  '您未登录，请重新登录~' => '您未登录，请重新登录~',\n  '您没有' => '您没有',\n  '的权限！' => '的权限！',\n  '您还未登录，请重新登录！' => '您还未登录，请重新登录！',\n  '上传成功！' => '上传成功！',\n  '已关闭前台上传文件功能' => '已关闭前台上传文件功能',\n  '上传错误！' => '上传错误！',\n  '对不起，您没有访问权限！' => '对不起，您没有访问权限！',\n  '输入url错误！' => '输入url错误！',\n  '缺少ID！' => '缺少ID！',\n  '未找到相应内容！' => '未找到相应内容！',\n  '请输入关键词搜索！' => '请输入关键词搜索！',\n  '搜索超出设定范围！' => '搜索超出设定范围！',\n  '您的搜索超出设定范围！' => '您的搜索超出设定范围！',\n  '系统创建' => '系统创建',\n  '目录失败!' => '目录失败!',\n  '支付成功，但是系统内没有找到相应的订单！' => '支付成功，但是系统内没有找到相应的订单！',\n  '支付失败' => '支付失败',\n  '订单号错误！' => '订单号错误！',\n  '会员中心已关闭！' => '会员中心已关闭！',\n  '您的账户已被冻结！' => '您的账户已被冻结！',\n  '未找到您所在分组，请联系管理员处理！' => '未找到您所在分组，请联系管理员处理！',\n  '您所在的分组被限制登录！' => '您所在的分组被限制登录！',\n  '登录奖励' => '登录奖励',\n  '系统已关闭会员注册！' => '系统已关闭会员注册！',\n  '您的邀请链接不合法！' => '您的邀请链接不合法！',\n  '手机号格式不正确！' => '手机号格式不正确！',\n  '您的邮箱已注册！' => '您的邮箱已注册！',\n  '您的手机号码已注册！' => '您的手机号码已注册！',\n  '邀请奖励' => '邀请奖励',\n  '注册成功，等待审核！' => '注册成功，等待审核！',\n  '注册成功！' => '注册成功！',\n  '注册失败，请重试~' => '注册失败，请重试~',\n  '必须通过邀请链接进行注册！' => '必须通过邀请链接进行注册！',\n  '请输入账号和邮箱！' => '请输入账号和邮箱！',\n  '图形验证码错误！' => '图形验证码错误！',\n  '找回密码' => '找回密码',\n  '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击' => '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击',\n  '立即找回密码' => '立即找回密码',\n  '过期失效！' => '过期失效！',\n  '您操作过于频繁，请10分钟后再尝试！' => '您操作过于频繁，请10分钟后再尝试！',\n  '找回密码邮件已发送，请到您的邮箱查看！' => '找回密码邮件已发送，请到您的邮箱查看！',\n  '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！' => '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！',\n  '输入的信息有误！' => '输入的信息有误！',\n  'token已失效！' => 'token已失效！',\n  '密码重置成功,请重新登录！' => '密码重置成功,请重新登录！',\n  '新密码不能与旧密码相同！' => '新密码不能与旧密码相同！',\n  '标题不能为空！' => '标题不能为空！',\n  '称呼不能为空！' => '称呼不能为空！',\n  '您的手机号格式不正确！' => '您的手机号格式不正确！',\n  '不能为空！' => '不能为空！',\n  '提交成功！我们会尽快回复您！' => '提交成功！我们会尽快回复您！',\n  '提交失败，请重试！' => '提交失败，请重试！',\n  '链接错误' => '链接错误',\n  '留言未找到或者未审核' => '留言未找到或者未审核',\n  '匿名' => '匿名',\n  '缺少id参数！' => '缺少id参数！',\n  '缺少tid参数！' => '缺少tid参数！',\n  '未找到商品或者已下架！' => '未找到商品或者已下架！',\n  '该模块缺少price价格参数！' => '该模块缺少price价格参数！',\n  '您的订单提交成功通知' => '您的订单提交成功通知',\n  '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！' => '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！',\n  '订单详细信息如下' => '订单详细信息如下',\n  '折扣' => '折扣',\n  '运费' => '运费',\n  '合计' => '合计',\n  '收件地址' => '收件地址',\n  '您的订单' => '您的订单',\n  '已经提交，我们会尽快给您发货！' => '已经提交，我们会尽快给您发货！',\n  '订单已支付！' => '订单已支付！',\n  '已经提交，请尽快支付！' => '已经提交，请尽快支付！',\n  '支付订单' => '支付订单',\n  '电脑支付宝支付' => '电脑支付宝支付',\n  '微信内支付' => '微信内支付',\n  '未开启钱包支付！' => '未开启钱包支付！',\n  '您未登录，无法支付！' => '您未登录，无法支付！',\n  '钱包金额不足，请充值！' => '钱包金额不足，请充值！',\n  '未开启积分支付！' => '未开启积分支付！',\n  '积分不足，请充值！' => '积分不足，请充值！',\n  '支付宝当面付' => '支付宝当面付',\n  '其他平台支付' => '其他平台支付',\n  '在线充值' => '在线充值',\n  '交易创建，等待买家付款' => '交易创建，等待买家付款',\n  '未付款交易超时关闭，或支付完成后全额退款' => '未付款交易超时关闭，或支付完成后全额退款',\n  '支付成功' => '支付成功',\n  '交易结束，不可退款' => '交易结束，不可退款',\n  '未知状态' => '未知状态',\n  '订单号错误或订单被删除！' => '订单号错误或订单被删除！',\n  '订单未支付或订单号错误！' => '订单未支付或订单号错误！',\n  '创建订单失败！' => '创建订单失败！',\n  '订单号不存在或已被删除！' => '订单号不存在或已被删除！',\n  '收件人、手机号和收货地址不能为空！' => '收件人、手机号和收货地址不能为空！',\n  '未开启在线支付！' => '未开启在线支付！',\n  '获取openid失败' => '获取openid失败',\n  '非法参数！' => '非法参数！',\n  '标签未找到或已删除！' => '标签未找到或已删除！',\n  '手机号码格式错误！' => '手机号码格式错误！',\n  '账户不能为空！' => '账户不能为空！',\n  '订单已过期，不可支付！' => '订单已过期，不可支付！',\n  '订单已支付，请勿重复操作！' => '订单已支付，请勿重复操作！',\n  '缺少订单号！' => '缺少订单号！',\n  '网络错误，请刷新后重试！' => '网络错误，请刷新后重试！',\n  '未找到评论！' => '未找到评论！',\n  '已取消点赞！' => '已取消点赞！',\n  '点赞成功！' => '点赞成功！',\n  '栏目未绑定模型，无法喜欢！' => '栏目未绑定模型，无法喜欢！',\n  '取消点赞' => '取消点赞',\n  '点赞奖励' => '点赞奖励',\n  '已被删除 ' => '已被删除 ',\n  '栏目未绑定模型，无法收藏！' => '栏目未绑定模型，无法收藏！',\n  '取消收藏' => '取消收藏',\n  '收藏奖励' => '收藏奖励',\n  '收藏成功！' => '收藏成功！',\n  '已被删除' => '已被删除',\n  '库存不足！' => '库存不足！',\n  '该模块不允许发布！' => '该模块不允许发布！',\n  '添加失败，存在敏感词' => '添加失败，存在敏感词',\n  '分类错误！' => '分类错误！',\n  '该分类不允许发布！' => '该分类不允许发布！',\n  '您没有权限在该分类发布内容！' => '您没有权限在该分类发布内容！',\n  '内容不能为空！' => '内容不能为空！',\n  '库存不能为0！' => '库存不能为0！',\n  '未修改内容，不能提交！' => '未修改内容，不能提交！',\n  '发布失败，请重试！' => '发布失败，请重试！',\n  '发布成功！' => '发布成功！',\n  '未找到您要的文章！' => '未找到您要的文章！',\n  '您已经关注了该用户！' => '您已经关注了该用户！',\n  '您不能关注自己！' => '您不能关注自己！',\n  '关注奖励' => '关注奖励',\n  '关注成功！' => '关注成功！',\n  '您没有关注该用户，无法操作！' => '您没有关注该用户，无法操作！',\n  '取关成功！' => '取关成功！',\n  '消息已被删除！' => '消息已被删除！',\n  '用户未找到！' => '用户未找到！',\n  '未分类 ' => '未分类 ',\n  '设置成功' => '设置成功',\n  '设置成功！' => '设置成功！',\n  '记录不存在！' => '记录不存在！',\n  '缺少栏目ID！' => '缺少栏目ID！',\n  '系统未配置微信登录！' => '系统未配置微信登录！',\n  '微信已绑定！' => '微信已绑定！',\n  '您的微信已被绑定，不能再绑定！' => '您的微信已被绑定，不能再绑定！',\n  '系统版号' => '系统版号',\n  '版本号是系统自带，请勿改动' => '版本号是系统自带，请勿改动',\n  '网站SEO名称' => '网站SEO名称',\n  '控制在25个字、50个字节以内' => '控制在25个字、50个字节以内',\n  '网站SEO关键词' => '网站SEO关键词',\n  '5个左右，8汉字以内，用英文逗号隔开' => '5个左右，8汉字以内，用英文逗号隔开',\n  '网站SEO描述' => '网站SEO描述',\n  '控制在80个汉字，160个字符以内' => '控制在80个汉字，160个字符以内',\n  '统计代码' => '统计代码',\n  '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '将百度统计、cnzz等平台的流量统计JS代码放到这里',\n  '底部版权' => '底部版权',\n  '如：&copy; 2016 xxx版权' => '如：&copy; 2016 xxx版权',\n  '备案号' => '备案号',\n  '如：京ICP备00000000号' => '如：京ICP备00000000号',\n  '网站电话' => '网站电话',\n  '网站联系电话' => '网站联系电话',\n  '400电话' => '400电话',\n  '网站QQ' => '网站QQ',\n  '网站邮箱' => '网站邮箱',\n  '公司地址' => '公司地址',\n  'PC网站模板' => 'PC网站模板',\n  '将模板名称填写到此处' => '将模板名称填写到此处',\n  'WAP网站模板' => 'WAP网站模板',\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板' => '开启了手机端，这个设置才会生效，否则调用电脑端模板',\n  '微信网站模板' => '微信网站模板',\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板' => '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板',\n  '是否开启手机端' => '是否开启手机端',\n  '如果不开启手机端，则默认调用电脑端模板' => '如果不开启手机端，则默认调用电脑端模板',\n  '是否开启前台上传' => '是否开启前台上传',\n  '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。' => '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。',\n  '是否开启前台权限' => '是否开启前台权限',\n  '开启后前台用户权限可以在后台控制' => '开启后前台用户权限可以在后台控制',\n  '缓存时间' => '缓存时间',\n  '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。' => '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。',\n  '限制上传文件大小' => '限制上传文件大小',\n  '0代表不限，单位kb' => '0代表不限，单位kb',\n  '允许上传文件类型' => '允许上传文件类型',\n  '请用|分割，如：pdf|jpg|png' => '请用|分割，如：pdf|jpg|png',\n  '前台UEditor编辑器导航条配置' => '前台UEditor编辑器导航条配置',\n  '允许前台搜索的表' => '允许前台搜索的表',\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product' => '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product',\n  '上传图片压缩比例' => '上传图片压缩比例',\n  '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80' => '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80',\n  'PNG是否压缩' => 'PNG是否压缩',\n  'PNG压缩后容易变成背景黑色，关闭后，不会压缩。' => 'PNG压缩后容易变成背景黑色，关闭后，不会压缩。',\n  '邮件服务器' => '邮件服务器',\n  'smtp.163.com,smtp.qq.com' => 'smtp.163.com,smtp.qq.com',\n  '邮件收发端口' => '邮件收发端口',\n  '163、126邮件端口(465)，QQ邮件端口(587)' => '163、126邮件端口(465)，QQ邮件端口(587)',\n  '收件人Email地址' => '收件人Email地址',\n  '发件人Email地址' => '发件人Email地址',\n  '指邮件服务器发件邮箱' => '指邮件服务器发件邮箱',\n  '发件人Email秘钥' => '发件人Email秘钥',\n  '这个秘钥不是登录密码' => '这个秘钥不是登录密码',\n  '发件人昵称' => '发件人昵称',\n  '发件邮箱会带一个昵称' => '发件邮箱会带一个昵称',\n  '客户订单通知' => '客户订单通知',\n  '购买商品的时候会发送的一条邮件信息' => '购买商品的时候会发送的一条邮件信息',\n  '订单出货通知' => '订单出货通知',\n  '发货的时候发送给客户的通知' => '发货的时候发送给客户的通知',\n  '订单运费' => '订单运费',\n  '购物下单时会加上这个运费' => '购物下单时会加上这个运费',\n  '在线支付' => '在线支付',\n  '0关闭支付，1自主平台支付' => '0关闭支付，1自主平台支付',\n  '极致平台接口' => '极致平台接口',\n  '极致平台商户' => '极致平台商户',\n  '极致平台应用appid' => '极致平台应用appid',\n  '极致平台应用秘钥' => '极致平台应用秘钥',\n  '支付宝APPID' => '支付宝APPID',\n  '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID' => '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID',\n  '支付宝key' => '支付宝key',\n  'MD5密钥，安全检验码，由数字和字母组成的32位字符串' => 'MD5密钥，安全检验码，由数字和字母组成的32位字符串',\n  '支付宝私钥' => '支付宝私钥',\n  '支付宝公钥' => '支付宝公钥',\n  '微信商户mchid' => '微信商户mchid',\n  '支付相关' => '支付相关',\n  '微信商户key' => '微信商户key',\n  '微信公众号appid' => '微信公众号appid',\n  '微信公众号appsecret' => '微信公众号appsecret',\n  '微信apiclient_cert' => '微信apiclient_cert',\n  '微信apiclient_key' => '微信apiclient_key',\n  '公众号appid' => '公众号appid',\n  '用户登录相关，如果跟支付的一样，那就再填写一遍' => '用户登录相关，如果跟支付的一样，那就再填写一遍',\n  '公众号appsecret' => '公众号appsecret',\n  '公众号token' => '公众号token',\n  '公众号关注欢迎语' => '公众号关注欢迎语',\n  '公众号关注时发送的第一句推送' => '公众号关注时发送的第一句推送',\n  '网站LOGO' => '网站LOGO',\n  '后台模板风格' => '后台模板风格',\n  '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。' => '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。',\n  '是否绑定多域名' => '是否绑定多域名',\n  '开启绑定多域名后，需要到插件中配置' => '开启绑定多域名后，需要到插件中配置',\n  '网站SEO网址' => '网站SEO网址',\n  '一般不填，全局网址，最后不带/,如：http://www.xxx.com' => '一般不填，全局网址，最后不带/,如：http://www.xxx.com',\n  '基本信息下扩展' => '基本信息下扩展',\n  '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下' => '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下',\n  '订单超时' => '订单超时',\n  '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制' => '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制',\n  '开启层级URL' => '开启层级URL',\n  '默认关闭层级URL，开启后URL会按照父类层级展现' => '默认关闭层级URL，开启后URL会按照父类层级展现',\n  '缓存完整页面' => '缓存完整页面',\n  '前台完整页面缓存，结合缓存时间，可以提高访问速度' => '前台完整页面缓存，结合缓存时间，可以提高访问速度',\n  '自动生成静态HTML' => '自动生成静态HTML',\n  '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面' => '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面',\n  'PC静态文件目录' => 'PC静态文件目录',\n  '电脑端静态HTML存放目录，默认根目录[ / ]' => '电脑端静态HTML存放目录，默认根目录[ / ]',\n  'WAP静态文件目录' => 'WAP静态文件目录',\n  '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱' => '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱',\n  '是否留言自动审核' => '是否留言自动审核',\n  '开启后，留言自动审核（显示）' => '开启后，留言自动审核（显示）',\n  '是否评论自动审核' => '是否评论自动审核',\n  '开启后评论自动审核（显示）' => '开启后评论自动审核（显示）',\n  '网站敏感词过滤' => '网站敏感词过滤',\n  '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容' => '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容',\n  '是否开启水印' => '是否开启水印',\n  '开启水印需要上传水印图片' => '开启水印需要上传水印图片',\n  '水印图片' => '水印图片',\n  '水印图片在250px以内' => '水印图片在250px以内',\n  '水印位置' => '水印位置',\n  '参考键盘九宫格1-9' => '参考键盘九宫格1-9',\n  '水印透明度' => '水印透明度',\n  '透明度越大，越难看清楚水印' => '透明度越大，越难看清楚水印',\n  '钱包兑换率' => '钱包兑换率',\n  '站内钱包与RMB的兑换率，即1元=多少金币' => '站内钱包与RMB的兑换率，即1元=多少金币',\n  '积分兑换率' => '积分兑换率',\n  '站内积分与RMB的兑换率，即1元=多少积分' => '站内积分与RMB的兑换率，即1元=多少积分',\n  '积分支付' => '积分支付',\n  '开启积分支付后，商品可以用积分支付' => '开启积分支付后，商品可以用积分支付',\n  '开启钱包支付后，商品可以用钱包支付' => '开启钱包支付后，商品可以用钱包支付',\n  '开启微信支付后，商品可以用微信支付' => '开启微信支付后，商品可以用微信支付',\n  '开启支付宝支付后，商品可以用支付宝支付' => '开启支付宝支付后，商品可以用支付宝支付',\n  '每次登录奖励' => '每次登录奖励',\n  '每天登录奖励积分数，最小为0，每天登录只奖励一次' => '每天登录奖励积分数，最小为0，每天登录只奖励一次',\n  '开启登录奖励后，登录后就会获得积分奖励' => '开启登录奖励后，登录后就会获得积分奖励',\n  '开启后，发布内容会奖励积分' => '开启后，发布内容会奖励积分',\n  '每次发布奖励' => '每次发布奖励',\n  '每次发布内容奖励积分数' => '每次发布内容奖励积分数',\n  '每天发布最高奖励' => '每天发布最高奖励',\n  '每天奖励不超过积分上限，设置0则无上限' => '每天奖励不超过积分上限，设置0则无上限',\n  '开启后，发布内容被收藏会奖励积分' => '开启后，发布内容被收藏会奖励积分',\n  '每次收藏奖励' => '每次收藏奖励',\n  '每次发布内容被收藏奖励积分数' => '每次发布内容被收藏奖励积分数',\n  '每天收藏最高奖励' => '每天收藏最高奖励',\n  '开启后，发布内容被点赞会奖励积分' => '开启后，发布内容被点赞会奖励积分',\n  '每次点赞奖励' => '每次点赞奖励',\n  '每次发布内容被点赞奖励积分数' => '每次发布内容被点赞奖励积分数',\n  '每天点赞最高奖励' => '每天点赞最高奖励',\n  '开启后，发布内容被评论会奖励积分' => '开启后，发布内容被评论会奖励积分',\n  '每次评论奖励' => '每次评论奖励',\n  '每次发布内容被评论奖励积分数' => '每次发布内容被评论奖励积分数',\n  '每天评论最高奖励' => '每天评论最高奖励',\n  '开启后，用户被粉丝关注会奖励积分' => '开启后，用户被粉丝关注会奖励积分',\n  '每次关注奖励' => '每次关注奖励',\n  '每次被关注奖励积分数' => '每次被关注奖励积分数',\n  '每天关注最高奖励' => '每天关注最高奖励',\n  '每天关注奖励不超过积分上限，设置0则无上限' => '每天关注奖励不超过积分上限，设置0则无上限',\n  '发送邮件' => '发送邮件',\n  '是否开启邮件发送' => '是否开启邮件发送',\n  '关闭网站' => '关闭网站',\n  '关闭网站后，前台无法访问，后台可以进入' => '关闭网站后，前台无法访问，后台可以进入',\n  '关站提示' => '关站提示',\n  '后台文件存储路径' => '后台文件存储路径',\n  '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]' => '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]',\n  '前台文件存储路径' => '前台文件存储路径',\n  '是否开启前台AJAX' => '是否开启前台AJAX',\n  '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据' => '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据',\n  '自动生成sitemap' => '自动生成sitemap',\n  '开启后，前台访问每天会自动生成1次sitemap' => '开启后，前台访问每天会自动生成1次sitemap',\n  '是否开启邀请奖励' => '是否开启邀请奖励',\n  '开启邀请后则会奖励' => '开启邀请后则会奖励',\n  '邀请奖励类型' => '邀请奖励类型',\n  '邀请奖励数量' => '邀请奖励数量',\n  '网站手机' => '网站手机',\n  '站长微信' => '站长微信',\n  '开启多图描述' => '开启多图描述',\n  '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)' => '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)',\n  '前台用户注册' => '前台用户注册',\n  '关闭前台注册后，前台无法进入注册页面' => '关闭前台注册后，前台无法进入注册页面',\n  '仅邀请码注册' => '仅邀请码注册',\n  '开启后，必须通过邀请链接才能注册！' => '开启后，必须通过邀请链接才能注册！',\n  '允许前台发布模块' => '允许前台发布模块',\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割',\n  '前台搜索的字段' => '前台搜索的字段',\n  '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割',\n  '前台验证码' => '前台验证码',\n  '关闭后，登录注册不需要验证码' => '关闭后，登录注册不需要验证码',\n  '后台验证码' => '后台验证码',\n  '关闭后，后台管理员登录不需要验证码' => '关闭后，后台管理员登录不需要验证码',\n  'TAG包含模型' => 'TAG包含模型',\n  '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product' => '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product',\n  '支付配置' => '支付配置',\n  '前台多模块搜索的字段' => '前台多模块搜索的字段',\n  '多个模块直接必须都有相同的字段，否则会报错' => '多个模块直接必须都有相同的字段，否则会报错',\n  '多模块允许搜索的表' => '多模块允许搜索的表',\n  '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product' => '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product',\n  '允许查询显示的字段' => '允许查询显示的字段',\n  '多模块搜索允许查询显示的字段' => '多模块搜索允许查询显示的字段',\n  '前台编辑器设置' => '前台编辑器设置',\n  '前台的编辑器功能菜单设置' => '前台的编辑器功能菜单设置',\n  'PHP调试' => 'PHP调试',\n  '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。' => '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。',\n  '前台SESSION' => '前台SESSION',\n  '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭' => '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭',\n  '留言验证码' => '留言验证码',\n  '开启后，前台留言需要填写验证码' => '开启后，前台留言需要填写验证码',\n  '前台发布审核' => '前台发布审核',\n  '开启后需要后台审核，关闭则不需要' => '开启后需要后台审核，关闭则不需要',\n  '公共权限' => '公共权限',\n  '前台网站' => '前台网站',\n  '会员登录' => '会员登录',\n  '会员评论' => '会员评论',\n  '网站筛选' => '网站筛选',\n  '会员下单' => '会员下单',\n  '网站支付' => '网站支付',\n  '极致支付' => '极致支付',\n  '微信模块' => '微信模块',\n  '验证码生成' => '验证码生成',\n  '检查是否登录' => '检查是否登录',\n  '多附件上传' => '多附件上传',\n  '单附件上传' => '单附件上传',\n  '二维码生成' => '二维码生成',\n  '获取扩展信息' => '获取扩展信息',\n  '链接错误提示' => '链接错误提示',\n  '报错提示' => '报错提示',\n  '网站内容' => '网站内容',\n  '详情内容' => '详情内容',\n  '网站搜索' => '网站搜索',\n  '网站多模块搜索' => '网站多模块搜索',\n  '开启网站缓存' => '开启网站缓存',\n  '输出缓存' => '输出缓存',\n  '个人中心首页' => '个人中心首页',\n  '会员资料' => '会员资料',\n  '订单记录' => '订单记录',\n  '订单支付' => '订单支付',\n  '删除订单' => '删除订单',\n  '上传头像' => '上传头像',\n  '删除评论' => '删除评论',\n  '点赞文章' => '点赞文章',\n  '点赞列表' => '点赞列表',\n  '收藏文章' => '收藏文章',\n  '收藏列表' => '收藏列表',\n  '删除收藏' => '删除收藏',\n  '购物车' => '购物车',\n  '添加购物车' => '添加购物车',\n  '删除购物车' => '删除购物车',\n  '发布管理' => '发布管理',\n  '会员发布' => '会员发布',\n  '删除发布' => '删除发布',\n  '会员上传附件' => '会员上传附件',\n  '404提示' => '404提示',\n  '关注用户' => '关注用户',\n  '取消关注' => '取消关注',\n  '粉丝列表' => '粉丝列表',\n  '消息提醒' => '消息提醒',\n  '查看消息' => '查看消息',\n  '删除消息' => '删除消息',\n  '公共主页' => '公共主页',\n  '消息提醒设置' => '消息提醒设置',\n  '获取栏目列表' => '获取栏目列表',\n  '用户钱包' => '用户钱包',\n  '交易详情' => '交易详情',\n  '登录首页' => '登录首页',\n  '注册页面' => '注册页面',\n  '忘记密码' => '忘记密码',\n  '未登录页面' => '未登录页面',\n  '退出登录' => '退出登录',\n  '发送留言' => '发送留言',\n  '发表评论' => '发表评论',\n  '筛选列表' => '筛选列表',\n  '创建订单' => '创建订单',\n  'TAG标签列表' => 'TAG标签列表',\n  '会员' => '会员',\n  '订单' => '订单',\n  '评论' => '评论',\n  '留言' => '留言',\n  '轮播图' => '轮播图',\n  '友情链接' => '友情链接',\n  'TAG' => 'TAG',\n  '单页' => '单页',\n  '用户评价' => '用户评价',\n  '添加会员' => '添加会员',\n  '修改会员' => '修改会员',\n  '删除会员' => '删除会员',\n  '修改状态' => '修改状态',\n  '内容管理' => '内容管理',\n  '内容列表' => '内容列表',\n  '添加内容' => '添加内容',\n  '修改内容' => '修改内容',\n  '删除内容' => '删除内容',\n  '复制内容' => '复制内容',\n  '修改评论' => '修改评论',\n  '修改留言' => '修改留言',\n  '删除留言' => '删除留言',\n  '字段列表' => '字段列表',\n  '删除字段' => '删除字段',\n  '获取字段' => '获取字段',\n  '基本功能' => '基本功能',\n  '系统界面' => '系统界面',\n  '数据库备份' => '数据库备份',\n  '数据库还原' => '数据库还原',\n  '数据库删除' => '数据库删除',\n  '系统功能' => '系统功能',\n  '栏目管理' => '栏目管理',\n  '栏目列表' => '栏目列表',\n  '新增栏目' => '新增栏目',\n  '修改栏目' => '修改栏目',\n  '删除栏目' => '删除栏目',\n  '修改排序' => '修改排序',\n  '栏目隐藏' => '栏目隐藏',\n  '新增角色' => '新增角色',\n  '修改角色' => '修改角色',\n  '删除角色' => '删除角色',\n  '角色状态' => '角色状态',\n  '新增管理员' => '新增管理员',\n  '修改管理员' => '修改管理员',\n  '管理员状态' => '管理员状态',\n  '删除管理员' => '删除管理员',\n  '模型列表' => '模型列表',\n  '删除模型' => '删除模型',\n  '新增权限' => '新增权限',\n  '修改权限' => '修改权限',\n  '删除权限' => '删除权限',\n  '桌面设置' => '桌面设置',\n  '新增桌面' => '新增桌面',\n  '修改桌面' => '修改桌面',\n  '删除桌面' => '删除桌面',\n  '图标库' => '图标库',\n  '模块扩展' => '模块扩展',\n  '删除轮播图' => '删除轮播图',\n  '复制轮播图' => '复制轮播图',\n  '批量删除轮播图' => '批量删除轮播图',\n  '新增轮播图分类' => '新增轮播图分类',\n  '修改轮播图分类' => '修改轮播图分类',\n  '删除轮播图分类' => '删除轮播图分类',\n  '新增友链' => '新增友链',\n  '修改友链' => '修改友链',\n  '复制友链' => '复制友链',\n  '删除友链' => '删除友链',\n  '批量删除友链' => '批量删除友链',\n  '通用模块' => '通用模块',\n  '更新cookie' => '更新cookie',\n  '商品管理' => '商品管理',\n  '商品列表' => '商品列表',\n  '修改商品' => '修改商品',\n  '删除商品' => '删除商品',\n  '复制商品' => '复制商品',\n  '登录日志' => '登录日志',\n  '新增分组' => '新增分组',\n  '修改分组' => '修改分组',\n  '更改分组状态' => '更改分组状态',\n  '删除分组' => '删除分组',\n  '会员权限' => '会员权限',\n  '修改分组排序' => '修改分组排序',\n  '上传支付证书' => '上传支付证书',\n  '更改状态' => '更改状态',\n  '安装卸载' => '安装卸载',\n  '删除图库图片' => '删除图库图片',\n  '批量删除图库' => '批量删除图库',\n  '微信公众号' => '微信公众号',\n  '公众号菜单' => '公众号菜单',\n  '公众号素材' => '公众号素材',\n  '模板制作' => '模板制作',\n  '获取首字母拼音' => '获取首字母拼音',\n  '批量新增栏目' => '批量新增栏目',\n  '自定义配置删除' => '自定义配置删除',\n  'TAG列表' => 'TAG列表',\n  '新增TAG' => '新增TAG',\n  '修改TAG' => '修改TAG',\n  '复制TAG' => '复制TAG',\n  '删除TAG' => '删除TAG',\n  '批量删除TAG' => '批量删除TAG',\n  '生成静态文件' => '生成静态文件',\n  '更新栏目HTML' => '更新栏目HTML',\n  '更新模块HTML' => '更新模块HTML',\n  '批量修改推荐属性' => '批量修改推荐属性',\n  '批量修改友链栏目' => '批量修改友链栏目',\n  '批量修改TAG栏目' => '批量修改TAG栏目',\n  '批量复制友链' => '批量复制友链',\n  '批量复制TAG' => '批量复制TAG',\n  '批量修改友链排序' => '批量修改友链排序',\n  '批量修改TAG排序' => '批量修改TAG排序',\n  '高级设置' => '高级设置',\n  '邮箱订单' => '邮箱订单',\n  '公众号配置' => '公众号配置',\n  '批量审核友链' => '批量审核友链',\n  '批量审核TAG' => '批量审核TAG',\n  '手动充值' => '手动充值',\n  '删除记录' => '删除记录',\n  '批量删除记录' => '批量删除记录',\n  '积分配置' => '积分配置',\n  '插件更新' => '插件更新',\n  '获取栏目模板' => '获取栏目模板',\n  '友链分类' => '友链分类',\n  '新增友链分类' => '新增友链分类',\n  '修改友链分类' => '修改友链分类',\n  '删除友链分类' => '删除友链分类',\n  '导航设置' => '导航设置',\n  '删除导航' => '删除导航',\n  '碎片化' => '碎片化',\n  '删除碎片' => '删除碎片',\n  '预览SQL' => '预览SQL',\n  '搜索配置' => '搜索配置',\n  '修改字段属性' => '修改字段属性',\n  '新增推荐属性' => '新增推荐属性',\n  '删除推荐属性' => '删除推荐属性',\n  '列表设置' => '列表设置',\n  '获取列表字段' => '获取列表字段',\n  '内链模块' => '内链模块',\n  '内链列表' => '内链列表',\n  '新增内链' => '新增内链',\n  '删除内链' => '删除内链',\n  '删除数据' => '删除数据',\n  '模板更新' => '模板更新',\n  '用户评价列表' => '用户评价列表',\n  '新增用户评价' => '新增用户评价',\n  '修改用户评价' => '修改用户评价',\n  '复制用户评价' => '复制用户评价',\n  '删除用户评价' => '删除用户评价',\n  '批量删除用户评价' => '批量删除用户评价',\n  '批量修改用户评价栏目' => '批量修改用户评价栏目',\n  '批量复制用户评价' => '批量复制用户评价',\n  '批量修改用户评价列表' => '批量修改用户评价列表',\n  '批量审核用户评价' => '批量审核用户评价',\n  '基本设置' => '基本设置',\n  '邮件订单' => '邮件订单',\n  '非超级管理员无法设置！' => '非超级管理员无法设置！',\n  '你确定要还原吗？' => '你确定要还原吗？',\n  '重复！' => '重复！',\n  '创建成功！' => '创建成功！',\n    '正在创建sitemap，请勿关闭浏览器！'=>'正在创建sitemap，请勿关闭浏览器！',\n); ?>"
  },
  {
    "path": "app/admin/plugins/IndexController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/08\n// +----------------------------------------------------------------------\n\n\nnamespace app\\admin\\plugins;\n\nuse app\\admin\\c\\CommonController;\nuse frphp\\extend\\Page;\nclass IndexController extends CommonController\n{\n\t\n\tpublic function test(){\n\t\techo '小伙子，你真棒！';\n\t}\n\t\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/admin/t/tpl/addcache.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('碎片化管理')}</cite></a>\n\t\t\t  <a><cite>{fun JZLANG('新增碎片')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\t\t\t<div class=\"layui-collapse\">\n\t\t        <div class=\"layui-colla-item\">\n\t\t\t    <h2 class=\"layui-colla-title\">{fun JZLANG('使用说明')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t<p>1. {fun JZLANG('指定几个id或者几个tid的内容输出')}(栏目：不限制栏目)</p>\n\t\t\t\t<p>{fun JZLANG('SQL中输入')}：  id in(1,2,3)  {fun JZLANG('或者')}  tid in(2,3,4)</p>\n\t\t\t\t<p>2. {fun JZLANG('模糊查询，查询标题跟 “网站建设” 相关的内容')}</p>\n\t\t\t\t<p>{fun JZLANG('SQL中输入')}： title like '%{fun JZLANG('网站建设')}%' </p>\n\t\t\t\t<p>3. {fun JZLANG('模糊查询，查询标题/内容跟 “网站建设” 相关的内容')}</p>\n\t\t\t\t<p>{fun JZLANG('SQL中输入')}： (title like '%{fun JZLANG('网站建设')}%' or body like '%{fun JZLANG('网站建设')}%' ) </p>\n\t\t\t\t<p>4. {fun JZLANG('不支持联表查询')} </p>\n\t\t\t\t<p>5. {fun JZLANG('注意字符串都要使用英文单引号')}</p>\n\t\t\t\t<p>{fun JZLANG('如')}：  title='{fun JZLANG('网站建设')}' </p>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('碎片名称')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"title\" value=\"\" style=\"width:500px;\" name=\"title\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('碎片标识')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"field\" value=\"\"  name=\"field\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('建议英文，不要重复')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t  <label class=\"layui-form-label\">{fun JZLANG('模型')}</label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select class=\"layui-input\" name=\"molds\" lay-filter=\"molds\">\n\t\t\t\t\t\t{loop table=\"molds\" isopen=\"1\" orderby=\"id asc\" as=\"v\"}\n\t\t\t\t\t\t<option value=\"{$v['biaoshi']}\">{$v['name']}</option>\n\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t  <label class=\"layui-form-label\">{fun JZLANG('栏目')}</label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select class=\"layui-input\" name=\"tid\" lay-filter=\"tid\">\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t{foreach $classtypetree as $v}\n\t\t\t\t\t\t<option value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\n\t\t\t\t\t\t</select>\n\t\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isall\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('子栏目包含')}\n                    </label>\n                    <div class=\"layui-input-block\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isall\" value=\"1\" title=\"{fun JZLANG('包含')}\" checked>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isall\" value=\"0\" title=\"{fun JZLANG('不包含')}\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t<label for=\"sql\" class=\"layui-form-label\">\n\t\t\t\t\t\t<span class=\"x-red\"></span>SQL\n\t\t\t\t\t</label>\n\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t<textarea  name=\"sqls\" placeholder=\"{fun JZLANG('可留空')}\" class=\"layui-textarea\"></textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('排序')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"orders\" value=\"id desc\" style=\"width:500px;\" name=\"orders\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('输出条数')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"limits\" value=\"10\"  name=\"limits\"  \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('0表示输出所有')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('更新周期')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"times\" value=\"720\"  name=\"times\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('单位')}：{fun JZLANG('分钟')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\t\t\t\t\t\t\n               \n                \n                <div class=\"layui-form-item\"   style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form,layer = layui.layer,laydate = layui.laydate;\n\t\t\t \n\t\t\t   form.on('select(tid)', function(data){\n\t\t\t \n\t\t\t \n\t\t\t  \n\t\t\t});\n\t\t\t\t\n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\t$.post(\"{fun U('sys/addcache')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('sys/datacache')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t  \n\t\t\t\n\n              \n            });\n\t\t\n\t\t\t\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/addmenu.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t<style>\n\t\t.preview{\n\t\t\twidth:100px;\n\t\t}\n\t\t</style>\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('导航管理')}</cite></a>\n\t\t\t  <a><cite>{fun JZLANG('新增导航')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"name\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('导航名称')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"name\" value=\"\" style=\"width:500px;\" name=\"name\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('导航菜单')}\n                    </label>\n                    <div class=\"layui-input-block\">\n\t\t\t\t\t\n                        <table class=\"layui-table\">\n\t\t\t\t\t\t  <thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('栏目')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('标题')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('图片')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('链接')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('打开')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('显示')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('操作')}</th>\n\t\t\t\t\t\t\t</tr> \n\t\t\t\t\t\t  </thead>\n\t\t\t\t\t\t  <tbody>\n\t\t\t\t\t\t  \n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"tid[]\" lay-filter=\"tid\">\n\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $v}\n\t\t\t\t\t\t\t\t\t <option  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('自定义链接')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"title[]\"  placeholder=\"{fun JZLANG('不填默认栏目名称')}\" autocomplete=\"off\" class=\"layui-input\"></td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"litpic[]\"  placeholder=\"{fun JZLANG('不填默认空')}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t\t<img class=\"preview\" onerror=\"this.src='{__Tpl_style__}/style/images/nopic.jpg'\" src=\"\">\n\t\t\t\t\t\t\t    <button type=\"button\" class=\"layui-btn layui-btn-sm uploadimg\">\n\t\t\t\t\t\t\t\t  <i class=\"layui-icon\">&#xe67c;</i>{fun JZLANG('上传图片')}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"gourl[]\"  placeholder=\"{fun JZLANG('自定义链接则需要填写')}\" autocomplete=\"off\" class=\"layui-input\"></td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"target[]\" >\n\t\t\t\t\t\t\t\t\t<option value=\"_self\">{fun JZLANG('本页面')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"_blank\">{fun JZLANG('新页面')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"status[]\" >\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不显示')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t  <a class=\"layui-btn layui-btn-xs\" onclick=\"add(this)\" >{fun JZLANG('新增')}</a>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t  </tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否显示')}\n                    </label>\n                    <div class=\"layui-input-block\">\n                        <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('不显示')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\t\t\t\t\t\t\n               \n                \n                <div class=\"layui-form-item\"   style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\n\t\t$(function(){\n\t\t\t$(\".preview\").click(function(){\n\t\t\t\tvar url = $(this).attr('src');\n\t\t\t\twindow.open(url)\n\t\t\t\n\t\t\t})\n\t\t\t\n\n\t\t})\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form,layer = layui.layer,laydate = layui.laydate;\n\t\t\t var upload = layui.upload;\n\t\t\t   \n\t\t\t  //执行实例\n\t\t\t  var uploadInst = upload.render({\n\t\t\t\telem: '.uploadimg' //绑定元素\n\t\t\t\t,url: '{fun U('common/uploads')}' //上传接口\n\t\t\t\t,done: function(res, index, upload){\n\t\t\t\t  //上传完毕回调\n\t\t\t\t  $(this.item).parent().children('.layui-input').val(res.url)\n\t\t\t\t  $(this.item).parent().children('.preview').attr('src',res.url)\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,error: function(){\n\t\t\t\t  //请求异常回调\n\t\t\t\t}\n\t\t\t  });\n\t\t\t \n\t\t\t   form.on('select(tid)', function(data){\n\t\t\t \n\t\t\t\t \n\t\t\t\t  \n\t\t\t\t});\n\t\t\t\t\n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\t$.post(\"{fun U('index/addmenu')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('index/menu')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t  \n\t\t\t\n\n              \n            });\n\t\t\tfunction renderForm(a){\n\t\t\t\tlayui.use(['laydate','form','layer','upload'], function(){\n\t\t\t\t  $ = layui.jquery;\n\t\t\t\t  var form = layui.form,layer = layui.layer,laydate = layui.laydate,upload = layui.upload;\n\n\t\t\t\t  upload.render({\n\t\t\t\t\telem: '.uploadimg_'+a //绑定元素\n\t\t\t\t\t,url: '{fun U('common/uploads')}' //上传接口\n\t\t\t\t\t,done: function(res, index, upload){\n\t\t\t\t\t  //上传完毕回调\n\t\t\t\t\t  $(this.item).parent().children('.layui-input').val(res.url)\n\t\t\t\t\t  $(this.item).parent().children('.preview').attr('src',res.url)\n\t\t\t\t\t  \n\t\t\t\t\t}\n\t\t\t\t\t,error: function(){\n\t\t\t\t\t  //请求异常回调\n\t\t\t\t\t}\n\t\t\t\t  });\n\t\t\t\t  form.render();\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\tfunction randomString(e) {  \n\t\t\t  e = e || 32;\n\t\t\t  var t = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\",\n\t\t\t  a = t.length,\n\t\t\t  n = \"\";\n\t\t\t  for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));\n\t\t\t  return n\n\t\t\t}\n\n\n\n\t\t\tfunction add(a){\n\t\t\t\tvar rand = randomString(6);\n\t\t\t\tvar html = '<tr>'+\n\t\t\t\t\t\t\t  '<td>'+\n\t\t\t\t\t\t\t\t'<select name=\"tid[]\" lay-filter=\"tid\">'+\n\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $v}\n\t\t\t\t\t\t\t\t\t '<option  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>'+\n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t'<option value=\"0\">{fun JZLANG('自定义链接')}</option>'+\n\t\t\t\t\t\t\t\t'</select>'+\n\t\t\t\t\t\t\t  '</td>'+\n\t\t\t\t\t\t\t  '<td><input type=\"text\" name=\"title[]\"  placeholder=\"{fun JZLANG('不填默认栏目名称')}\" autocomplete=\"off\" class=\"layui-input\"></td>'+\n\t\t\t\t\t\t\t  '<td><input type=\"text\" name=\"litpic[]\"  placeholder=\"{fun JZLANG('不填默认空')}\" autocomplete=\"off\" class=\"layui-input\"><img class=\"preview\" onerror=\"this.src=\\'{__Tpl_style__}/style/images/nopic.jpg\\'\" src=\"\"><button type=\"button\" class=\"layui-btn layui-btn-sm uploadimg_'+rand+'\"><i class=\"layui-icon\">&#xe67c;</i>{fun JZLANG('上传图片')}</button></td>'+\n\t\t\t\t\t\t\t  '<td><input type=\"text\" name=\"gourl[]\"  placeholder=\"{fun JZLANG('自定义链接则需要填写')}\" autocomplete=\"off\" class=\"layui-input\"></td>'+\n\t\t\t\t\t\t\t  '<td>'+\n\t\t\t\t\t\t\t\t'<select name=\"target[]\" >'+\n\t\t\t\t\t\t\t\t\t'<option value=\"_self\">{fun JZLANG('本页面')}</option>'+\n\t\t\t\t\t\t\t\t\t'<option value=\"_blank\">{fun JZLANG('新页面')}</option>'+\n\t\t\t\t\t\t\t\t'</select>'+\n\t\t\t\t\t\t\t ' </td>'+\n\t\t\t\t\t\t\t  '<td>'+\n\t\t\t\t\t\t\t\t'<select name=\"status[]\" >'+\n\t\t\t\t\t\t\t\t\t'<option value=\"1\">{fun JZLANG('显示')}</option>'+\n\t\t\t\t\t\t\t\t\t'<option value=\"0\">{fun JZLANG('不显示')}</option>'+\n\t\t\t\t\t\t\t\t'</select>'+\n\t\t\t\t\t\t\t  '</td>'+\n\t\t\t\t\t\t\t  '<td>'+\n\t\t\t\t\t\t\t  '<a class=\"layui-btn layui-btn-xs layui-btn-danger\" onclick=\"del(this)\" >{fun JZLANG('删除')}</a>'+\n\t\t\t\t\t\t\t  '<a class=\"layui-btn layui-btn-xs\" onclick=\"add(this)\" >{fun JZLANG('新增')}</a>'+\n\t\t\t\t\t\t\t  '</td>'+\n\t\t\t\t\t\t\t'</tr>';\n\t\t\t\t$(a).parent().parent().after(html);\n\t\t\t\trenderForm(rand);\n\t\t\t}\n\t\t\tfunction del(a){\n\t\t\t\t$(a).parent().parent().remove();\n\t\t\t}\n\t\t\t\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/admin-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n   {include=\"edit\"}\n  </head>\n  \n  <body>\n\t<div class=\"x-nav\">\n\t\t<span class=\"layui-breadcrumb\">\n\t\t  <a><cite>{fun JZLANG('首页')}</cite></a>\n\t\t  <a><cite>{fun JZLANG('管理员管理')}</cite></a>\n\t\t  <a><cite>{fun JZLANG('新增管理员信息')}</cite></a>\n\t\t</span>\n\t\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n\t</div>\n    <div class=\"x-body\">\n\t<div class=\"layui-card\">\n\t    <div class=\"layui-card-body\">\n\t\t<form class=\"layui-form layui-form-pane\">\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t   <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t    <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"name\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\">*</span>{fun JZLANG('登录名')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\n\t\t\t\t\t\t  autocomplete=\"off\" value=\"\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  <span class=\"x-red\">*</span>{fun JZLANG('将会成为您唯一的登入名')}\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"tel\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('手机')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"text\" value=\"\" id=\"tel\" name=\"tel\" required=\"\" lay-verify=\"tel\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t  </div>\n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"email\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('邮箱')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"text\" value=\"\" id=\"email\" name=\"email\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t\n\t\t\t\t \n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label class=\"layui-form-label\"><span class=\"x-red\">*</span>{fun JZLANG('角色')}</label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t  \n\t\t\t\t\t\t<select class=\"layui-input\" name=\"gid\" lay-filter=\"gid\" lay-verify=\"required\">\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择角色')}</option>\n\t\t\t\t\t\t{foreach $groups as $v}\n\t\t\t\t\t\t {if($isadmin)}\n\t\t\t\t\t\t <option value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\t {else}\n\t\t\t\t\t\t {if($v['id']!=1)}\n\t\t\t\t\t\t <option value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\t {/if}\n\t\t\t\t\t\t {/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\n\t\t\t\t\t\t</select>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t\n\t\t\t\t \n\t\t\t\t\t<span id=\"content_fields\"></span>\t\n\t\t\t\t  \n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"L_pass\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\">*</span>{fun JZLANG('密码')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"password\" id=\"L_pass\" name=\"pass\" required=\"\" lay-verify=\"pass\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  {fun JZLANG('6到16个字符,不改请留空')}\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"L_repass\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\">*</span>{fun JZLANG('确认密码')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"password\" id=\"L_repass\" name=\"repass\" required=\"\" lay-verify=\"repass\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  {fun JZLANG('6到16个字符,不改请留空')}\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('状态')}</label>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"status\" lay-verify=\"required\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('正常')}</option>\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('禁用')}</option>\n\t\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t <span id=\"ext_fields\"></span>\t\n\t\t\t\t</div>\n\t\t\t   </div>\n\t\t</div>\n\t\t\n\t\t\n          \n\t\t   <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n\t\t   <input type=\"hidden\" name=\"token\" value=\"{$token}\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('新增')}\n              </button>\n          </div>\n      </form>\n\t\t</div>\n    </div>\n    </div>\n    <script>\n\t{include=\"fields\"}\n\t\t\t$(function() {\n\t\t\t \n\t\t\t  get_fields({$tid});\n\t\t\t  get_fields_ext({$tid});\n\n\t\t\t})\n        layui.use(['form','layer'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n        \n         \n\n          //监听提交\n          form.on('submit(add)', function(data){\n\t\t  \n\t\t\n           $.post(\"{fun U('adminadd')}\",data.field,function(res){\n\t\t\t\t var res = JSON.parse(res);\n\t\t\t\t\n\t\t\t\t if(res.code==1){\n\t\t\t\t\tlayer.msg(res.msg);\n\t\t\t\t }else{\n\t\t\t\t\t layer.msg(\"{fun JZLANG('增加成功')}\", {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.href=\"{fun U('adminlist')}\";\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t  var index = parent.layer.getFrameIndex(window.name);\n\t\t\t\t\t\t\t//关闭当前frame\n\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\tparent.location.href=\"{fun U('adminlist')}\";\n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t }\n\t\t\t\t \n\t\t\t});\n            return false;\n          });\n          \n\t\t\tform.on('select(gid)', function(data){\n\t\t\t  \n\t\t\t  get_fields(data.value);\n\t\t\t  get_fields_ext(data.value);\n\t\t\t  \n\t\t\t  \n\t\t\t});\n\t\t\t\n\n          \n        });\n    </script>\n   \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/admin-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n   {include=\"edit\"}\n  </head>\n  \n  <body>\n\t<div class=\"x-nav\">\n\t\t<span class=\"layui-breadcrumb\">\n\t\t  <a><cite>{fun JZLANG('首页')}</cite></a>\n\t\t  <a><cite>{fun JZLANG('管理员管理')}</cite></a>\n\t\t  <a><cite>{fun JZLANG('修改管理员信息')}</cite></a>\n\t\t</span>\n\t\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n\t</div>\n    <div class=\"x-body\">\n\t<div class=\"layui-card\">\n\t    <div class=\"layui-card-body\">\n        <form class=\"layui-form layui-form-pane\">\n\t\t\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t<div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"name\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\">*</span>{fun JZLANG('登录名')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\n\t\t\t\t\t\t  autocomplete=\"off\" value=\"{$member['name']}\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  <span class=\"x-red\">*</span>{fun JZLANG('将会成为您唯一的登入名')}\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"tel\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('手机')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"text\" value=\"{$member['tel']}\" id=\"tel\" name=\"tel\" required=\"\" lay-verify=\"tel\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t  </div>\n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"email\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('邮箱')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"text\" value=\"{$member['email']}\" id=\"email\" name=\"email\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label class=\"layui-form-label\"><span class=\"x-red\">*</span>{fun JZLANG('角色')}</label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t  \n\t\t\t\t\t\t<select class=\"layui-input\" name=\"gid\" lay-filter=\"gid\" lay-verify=\"required\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t{foreach $groups as $v}\n\t\t\t\t\t\t {if($isadmin)}\n\t\t\t\t\t\t <option value=\"{$v['id']}\" {if($v['id']==$member['gid'])} selected {/if}>{$v['name']}</option>\n\t\t\t\t\t\t {else}\n\t\t\t\t\t\t {if($v['id']!=1)}\n\t\t\t\t\t\t <option value=\"{$v['id']}\" {if($v['id']==$member['gid'])} selected {/if}>{$v['name']}</option>\n\t\t\t\t\t\t {/if}\n\t\t\t\t\t\t {/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\n\t\t\t\t\t\t</select>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t \n\t\t\t\t  <span id=\"content_fields\"></span>\t\n\t\t\t\t  \n\n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"L_pass\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('密码')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"password\" id=\"L_pass\" name=\"pass\" lay-verify=\"pass\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  {fun JZLANG('6到16个字符,不改请留空')}\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t  \n\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"L_repass\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('确认密码')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"password\" id=\"L_repass\" name=\"repass\"  lay-verify=\"repass\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  {fun JZLANG('6到16个字符,不改请留空')}\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t   <div class=\"layui-form-item\">\n\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('状态')}</label>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"status\" lay-verify=\"required\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<option {if($member['status']==1)}selected=\"selected\"{/if}value=\"1\">{fun JZLANG('正常')}</option>\n\t\t\t\t\t\t<option {if($member['status']==0)}selected=\"selected\"{/if} value=\"0\">{fun JZLANG('禁用')}</option>\n\t\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t  </div>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t\n         \n\t\t  <input type=\"hidden\" name=\"token\" value=\"{$token}\">\n\t\t  <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <input type=\"hidden\" id=\"id\" name=\"id\" value=\"{$member['id']}\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('保存')}\n              </button>\n          </div>\n\t\t</form>\n\t\t</div>\n\t</div>\n    </div>\n    <script>\n\t{include=\"fields\"}\n        layui.use(['form','layer'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n        \n         \n        \n          //监听提交\n          form.on('submit(add)', function(data){\n           \n\t\t\t$.post(\"{fun U('adminedit')}\",data.field,function(res){\n\t\t\n\t\t\t\t var res = JSON.parse(res);\n\t\t\t\t \n\t\t\t\t if(res.code==1){\n\t\t\t\t layer.msg(res.msg);\n\t\t\t\t }else{\n\t\t\t\t\t layer.msg(\"{fun JZLANG('修改成功！')}\", {icon: 6},function () {\n\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\tvar index = parent.layer.getFrameIndex(window.name);\n\t\t\t\t\t\t//关闭当前frame\n\t\t\t\t\t\t\n\t\t\t\t\t\t {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.href=\"{fun U('adminlist')}\";\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t   parent.layer.close(index);\n\t\t\t\t\t\t   parent.location.href=\"{fun U('adminlist')}\";\n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t }\n\t\t\t\t \n\t\t\t});\n           \n            return false;\n          });\n      \n\t\t\tget_fields({$member['gid']},{$member['id']});\n            get_fields_ext({$member['gid']},{$member['id']});\n\t\t\tform.on('select(gid)', function(data){\n\t\t\t \n\t\t\t  get_fields(data.value,{$member['id']}); \n\t\t\t  get_fields_ext(data.value,{$member['id']});\n\t\t\t  \n\t\t\t  \n\t\t\t});\n\t\t\t\n          \n        });\n    </script>\n \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/admin-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('管理员管理')}</cite></a>\n              <a><cite>{fun JZLANG('管理员列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"刷新\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t  <div class=\"layui-card-body\">\n\t\t  <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"status\" lay-filter=\"isshow\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('是否封禁')}</option>\n\t\t\t\t\t   \n\t\t\t\t\t   <option {if($status==1)} selected=\"selected\" {/if}value=\"1\">{fun JZLANG('正常')}</option>\n\t\t\t\t\t   <option {if($status==2)} selected=\"selected\" {/if}value=\"2\">{fun JZLANG('封禁')}</option>\n\t\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<input class=\"layui-input\" placeholder=\"{fun JZLANG('开始日')}\" value=\"{$starttime}\" name=\"start\" id=\"start\">\n\t\t\t\t    <input class=\"layui-input\" placeholder=\"{fun JZLANG('截止日')}\" value=\"{$endtime}\" name=\"end\" id=\"end\">\n\t\t\t\t    <input type=\"text\" name=\"username\"  placeholder=\"{fun JZLANG('请输入用户名')}\" value=\"{$username}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t    {$fields_search}\n\t\t\t\t\t<button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t\n\t\t  </div>\n\t\t</div>\n\t\t\n        \n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t{if(checkAction('Admin/adminedit'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs\" lay-event=\"edit\">{fun JZLANG('编辑')}</a>\n\t\t{/if}\t\n\t\t{if(checkAction('Admin/admindelete'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\t\n\t\t\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t {if(checkAction('Admin/deleteAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}\t  \n\t\t {if(checkAction('Admin/adminadd'))}\n\t\t\t   <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('添加管理员')}','{fun U('adminadd')}')\">{fun JZLANG('添加管理员')}</a>\n\t\t {/if}  \n\t\t\t\n\t\t </div>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"isshow\">\n\t\t{if(checkAction('Admin/change_status'))}\n\t\t<input type=\"checkbox\" value=\"{{d.id}}\" name=\"switch\" lay-filter=\"status\"   lay-text=\"{fun JZLANG('正常|封禁')}\"  lay-skin=\"switch\" {{#  if(d.status == 1){ }}checked{{#  } }}>\n\t\t{else}\n\t\t{{#  if(d.status == 1){ }}<span class=\"layui-badge layui-bg-green\">{fun JZLANG('正常')}</span>{{# }else{ }}<span class=\"layui-badge\">{fun JZLANG('封禁')}</span>{{#  } }}\n\t\t{/if}\n\t\t</script>\n\t \n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  //执行一个laydate实例\n\t\t\t\tlaydate.render({\n\t\t\t\t  elem: '#start' //指定元素\n\t\t\t\t});\n\n\t\t\t\t//执行一个laydate实例\n\t\t\t\tlaydate.render({\n\t\t\t\t  elem: '#end' //指定元素\n\t\t\t\t});\n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '首页' //不显示首页\n\t\t\t\t  ,last: '尾页' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  ,{field: 'name', title: '{fun JZLANG('登录名')}',edit:'text'}\n\t\t\t\t  ,{field: 'group', title: '{fun JZLANG('所属角色')}',width: 150}\n\t\t\t\t  ,{field: 'tel', title: '{fun JZLANG('手机')}'}\n\t\t\t\t  ,{field: 'email', title: '{fun JZLANG('邮箱')}',width:200}\n\t\t\t\t  ,{field: 'isshow', title: '{fun JZLANG('状态')}',width: 100,templet:'#isshow'}\n\t\t\t\t  {foreach $fields_list as $v},{field: '{$v['field']}', title: '{$v['fieldname']}'  {if($v['fieldtype']==1 || $v['fieldtype']==2)},edit:'text'{/if}   }{/foreach}\n\t\t\t\t \n\t\t\t\t  ,{field: 'new_logintime', title: '{fun JZLANG('登录时间')}',width:160}\n\t\t\t\t  ,{field: 'new_regtime', title: '{fun JZLANG('注册时间')}',width:160}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:160, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t    form.on('switch(status)', function (data) {\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('change_status')}\",{id:data.elem.value},function(r){ });\n\t\t\t\t});\n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('编辑')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t  \n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Admin/admindelete')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t // console.log(obj.checked); //当前是否选中状态\n\t\t\t\t // console.log(obj.data); //选中行的相关数据\n\t\t\t\t // console.log(obj.type); //如果触发的是全选，则为：all，如果触发的是单选，则为：one\n\t\t\t\t /*\n\t\t\t\t\tconsole.log(checkStatus.data) //获取选中行的数据\n\t\t\t\t\tconsole.log(checkStatus.data.length) //获取选中行数量，可作为是否有选中行的条件\n\t\t\t\t\tconsole.log(checkStatus.isAll ) //表格是否全选\n\t\t\t\t */\n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\n\t\t\t\t\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Admin/deleteAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/admin.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n   {include=\"edit\"}\n  </head>\n  \n  <body>\n  <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a href=\"\">{fun JZLANG('首页')}</a>\n        <a href=\"\">{fun JZLANG('管理员管理')}</a>\n        <a><cite>{fun JZLANG('个人信息')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"刷新\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t<div class=\"layui-card\">\n\t    <div class=\"layui-card-body\">\n        <form class=\"layui-form  layui-form-pane\">\n\t\t<input name=\"go\" value=\"1\" type=\"hidden\">\n\t\t <input type=\"hidden\" name=\"token\" value=\"{$token}\">\n\t\t<input name=\"id\" value=\"{fun frencode($member['id'])}\" type=\"hidden\">\n          <div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('登录名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" value=\"{$member['name']}\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('将会成为您唯一的登入名')}\n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"tel\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('手机')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" value=\"{$member['tel']}\" id=\"tel\" name=\"tel\" required=\"\" lay-verify=\"tel\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              \n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"email\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('邮箱')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" value=\"{$member['email']}\" id=\"email\" name=\"email\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  <span class=\"x-red\"></span>\n              </div>\n          </div>\n\t\t  {if($isadmin)}\n\t\t    <div class=\"layui-form-item\">\n              <label class=\"layui-form-label\"><span class=\"x-red\">*</span>{fun JZLANG('角色')}</label>\n              <div class=\"layui-input-inline\">\n\t\t\t  \n                <select class=\"layui-input\" name=\"gid\"  lay-filter=\"gid\" lay-verify=\"required\">\n\t\t\t\t{foreach $groups as $v}\n\t\t\t\t<option value=\"{$v['id']}\" {if($member['gid']==$v['id'])}selected{/if}>{$v['name']}</option>\n\t\t\t\t{/foreach}\n\t\t\t\t\n\t\t\t\t</select>\n              </div>\n          </div>\n\t\t  {else}\n\t\t  <input name=\"gid\" value=\"{$member['gid']}\" type=\"hidden\" /> \n\t\t  {/if}\n\t\t   <span id=\"ext_fields\"></span>\n\n          <div class=\"layui-form-item\">\n              <label for=\"L_pass\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('密码')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"password\" id=\"L_pass\" name=\"pass\" required=\"\" lay-verify=\"pass\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  {fun JZLANG('6到16个字符,不改请留空')}\n              </div>\n          </div>\n\t\t  \n          <div class=\"layui-form-item\">\n              <label for=\"L_repass\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('确认密码')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"password\" id=\"L_repass\" name=\"repass\" required=\"\" lay-verify=\"repass\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n                  {fun JZLANG('6到16个字符,不改请留空')}\n              </div>\n          </div>\n\t\t   <div class=\"layui-form-item\">\n\t\t\t<label class=\"layui-form-label\">{fun JZLANG('状态')}</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t  <select name=\"status\" lay-verify=\"required\">\n\t\t\t\t\n\t\t\t\t<option {if($member['status']==1)}selected=\"selected\"{/if}value=\"1\">{fun JZLANG('正常')}</option>\n\t\t\t\t<option {if($member['status']==0)}selected=\"selected\"{/if} value=\"0\">{fun JZLANG('禁用')}</option>\n\t\t\t\t\n\t\t\t  </select>\n\t\t\t</div>\n\t\t  </div>\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n             \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('保存')}\n              </button>\n          </div>\n      </form>\n    </div>\n    </div>\n    </div>\n    <script>\n\t{include=\"fields\"}\n        layui.use(['form','layer'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n        \n         \n          //监听提交\n          form.on('submit(add)', function(data){\n           \n\t\t\t$.post(\"{fun U('Index/details')}\",data.field,function(res){\n\t\t\t\t// console.log(res);\n\t\t\t\t var res = JSON.parse(res);\n\t\t\t\t \n\t\t\t\t if(res.code==1){\n\t\t\t\t layer.msg(res.msg);\n\t\t\t\t }else{\n\t\t\t\t\t layer.alert(\"{fun JZLANG('提交成功！')}\", {icon: 6},function () {\n\t\t\t\t\t\t\n\t\t\t\t\t\t  {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.reload();\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t  var index = parent.layer.getFrameIndex(window.name);\n\t\t\t\t\t\t   //关闭当前frame\n\t\t\t\t\t\t   parent.layer.close(index);\n\t\t\t\t\t\t   parent.location.reload();\n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t }\n\t\t\t\t \n\t\t\t});\n           \n            return false;\n          });\n             get_fields({$member['gid']},{$member['id']});\n          form.on('select(gid)', function(data){\n\t\t\t  /*\n\t\t\t  console.log(data.elem); //得到select原始DOM对象\n\t\t\t  console.log(data.value); //得到被选中的值\n\t\t\t  console.log(data.othis); //得到美化后的DOM对象\n\t\t\t  */\n\t\t\t  get_fields(data.value,{$member['id']});\n\t\t\t});\n          \n        });\n    </script>\n \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/article-add.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\n\t\t{include=\"edit\"}\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('管理')}</cite></a>\n             \n\t\t\t <a><cite>{fun JZLANG('新增')}{$molds['name']}</cite></a>\n            </span>\n            \n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" lay-filter=\"jizhiform\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基础')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t<li>{fun JZLANG('设置')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\n\t\t\t\t{if($molds['isclasstype']==1)}\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" {if($molds['ismust']==1)} lay-verify=\"required\" {/if} lay-filter=\"tid\" id=\"tid\" >\n\t\t\t\t\t\t{if($molds['ismust']==1)}\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t   {if($v['molds']=='article')}\n\t\t\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t\t\t   <option {if($tid==$v['id'])}selected{/if} value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t  \n\t\t\t\t\t   </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<button type=\"button\" id=\"resetdata\" class=\"layui-btn layui-btn-sm\">{fun JZLANG('恢复数据')}</button>\n                    </div>\n                </div>\n\t\t\t\t{else}\n\t\t\t\t<input type=\"hidden\" name=\"tid\" value=\"0\" />\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<blockquote class=\"layui-elem-quote\">{fun JZLANG('此规则配置仅在不填留空的情况下才会触发')}</blockquote>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('SEO标题')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_seotitle\" >\n\t\t\t\t\t\t\t<option {if($configdata['seotitle']==1)}selected{/if} value=\"1\">{fun JZLANG('等于内容标题')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['seotitle']==2)}selected{/if} value=\"2\">{fun JZLANG('不填则留空')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('缩略图规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_litpic\" >\n\t\t\t\t\t\t\t<option {if($configdata['litpic']==1)}selected{/if} value=\"1\">{fun JZLANG('自动获取内容第一张图片')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['litpic']==2)}selected{/if} value=\"2\">{fun JZLANG('不自动获取')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('简介规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_description\" >\n\t\t\t\t\t\t\t<option {if($configdata['description']==1)}selected{/if} value=\"1\">{fun JZLANG('自动获取内容前200字符')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['description']==2)}selected{/if} value=\"2\">{fun JZLANG('不自动获取')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('TAG规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_tags\" >\n\t\t\t\t\t\t\t<option {if($configdata['tags']==1)}selected{/if} value=\"1\">{fun JZLANG('同步关键词')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['tags']==2)}selected{/if} value=\"2\">{fun JZLANG('不同步关键词')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item  layui-form-text\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('敏感词过滤字段')} <span class=\"x-red\">{fun JZLANG('需要过滤敏感词在系统配置中进行设置')}</span></label>\n\t\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t  <textarea placeholder=\"{fun JZLANG('请输入需要过滤的字段')}\" name=\"config_filter\" class=\"layui-textarea\">{$configdata['filter']}</textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\t\t\t\t\t\t\n\n                <div class=\"layui-form-item\" id=\"jizhitj\" style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n\t\t\t$(function() {\n\t\t\t \n\t\t\t  get_fields({$tid});\n\t\t\t  get_fields_ext({$tid});\n\n\t\t\t})\n\t\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t  var upload = layui.upload;\n\t\t\t  \n\t\t\t\n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\tif($(\"#tids\").length>0){\n\t\t\t\t\tvar tids_str = tids_obj.getValue('valueStr');\n\t\t\t\t\tif(tids_str!=''){\n\t\t\t\t\tdata.field.tids = ','+tids_str+',';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('addarticle')}\",data.field,function(r){\n\t\t\t\t\tlocalStorage.setItem('cachedata', '');\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   \n\t\t\t\t\t\t   {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.href=\"{fun U('Article/articlelist')}\";\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t   parent.location.reload();\n\t\t\t\t\t\t   parent.layer.close(index);\n\t\t\t\t\t\t   \n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t   \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            form.on('select(tid)', function(data){\n\t\t\t  var alldata = form.val(\"jizhiform\");\n\t\t\t  localStorage.setItem('cachedata', JSON.stringify(alldata));\n\t\t\t  get_fields(data.value);\n\t\t\t  get_fields_ext(data.value);\n\t\t\t  \n\t\t\t});\n\t\t\t\n\t\t\t$(\"#resetdata\").click(function(){\n\t\t\t\tvar alldata = localStorage.getItem('cachedata');\n\t\t\t\tif(alldata!=''){\n\t\t\t\t\tform.val(\"jizhiform\",JSON.parse(alldata));\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/article-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"{__Tpl_style__}/style/tags/jquery.tagsinput.css\" />\n\t\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"{__Tpl_style__}/style/tags/jquery.tagsinput.js\"></script>\n\t\t\n\t\t{include=\"edit\"}\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('管理')}</cite></a>\n             \n\t\t\t <a><cite>{fun JZLANG('修改')}{$molds['name']}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" lay-filter=\"jizhiform\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基础')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t<li>{fun JZLANG('设置')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\t\t\t{if($molds['isclasstype']==1)}\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" lay-filter=\"tid\" {if($molds['ismust']==1)}lay-verify=\"required\"{/if} id=\"tid\" >\n\t\t\t\t\t\t{if($molds['ismust']==1)}\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t   {if($v['molds']=='article')}\n\t\t\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t\t\t   <option {if($data['tid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t   \n\t\t\t\t\t   </select>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<button type=\"button\" id=\"resetdata\" class=\"layui-btn layui-btn-sm\">{fun JZLANG('恢复数据')}</button>\n                    </div>\n                </div>\n\t\t\t\t{else}\n\t\t\t\t<input type=\"hidden\" name=\"tid\" value=\"{$data['tid']}\" />\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<blockquote class=\"layui-elem-quote\">{fun JZLANG('此规则配置仅在不填留空的情况下才会触发')}</blockquote>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('SEO标题')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_seotitle\" >\n\t\t\t\t\t\t\t<option {if($configdata['seotitle']==1)}selected{/if} value=\"1\">{fun JZLANG('等于内容标题')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['seotitle']==2)}selected{/if} value=\"2\">{fun JZLANG('不填则留空')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('缩略图规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_litpic\" >\n\t\t\t\t\t\t\t<option {if($configdata['litpic']==1)}selected{/if} value=\"1\">{fun JZLANG('自动获取内容第一张图片')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['litpic']==2)}selected{/if} value=\"2\">{fun JZLANG('不自动获取')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('简介规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_description\" >\n\t\t\t\t\t\t\t<option {if($configdata['description']==1)}selected{/if} value=\"1\">{fun JZLANG('自动获取内容前200字符')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['description']==2)}selected{/if} value=\"2\">{fun JZLANG('不自动获取')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('TAG规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_tags\" >\n\t\t\t\t\t\t\t<option {if($configdata['tags']==1)}selected{/if} value=\"1\">{fun JZLANG('同步关键词')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['tags']==2)}selected{/if} value=\"2\">{fun JZLANG('不同步关键词')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item  layui-form-text\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('敏感词过滤字段')} <span class=\"x-red\">{fun JZLANG('需要过滤敏感词在系统配置中进行设置')}</span></label>\n\t\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t  <textarea placeholder=\"{fun JZLANG('请输入需要过滤的字段')}\" name=\"config_filter\" class=\"layui-textarea\">{$configdata['filter']}</textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\n                <div class=\"layui-form-item\" id=\"jizhitj\"  style=\"text-align:center;\">\n                   \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n\t\t\t\n\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t   var upload = layui.upload;\n\n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                if($(\"#tids\").length>0){\n\t\t\t\t\tvar tids_str = tids_obj.getValue('valueStr');\n\t\t\t\t\tif(tids_str!=''){\n\t\t\t\t\tdata.field.tids = ','+tids_str+',';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('editarticle')}\",data.field,function(r){\n\t\t\t\t\tlocalStorage.setItem('cachedata', '');\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回列表')}','{fun JZLANG('取消')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t  // 获得frame索引\n\t\t\t\t\t\t  {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.href=\"{fun U('Article/articlelist')}\";\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t   parent.location.reload();\n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\tparent.layer.closeAll();\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            get_fields({$data['tid']},{$data['id']});\n            get_fields_ext({$data['tid']},{$data['id']});\n\t\t\tform.on('select(tid)', function(data){\n\t\t\t  var alldata = form.val(\"jizhiform\");\n\t\t\t  localStorage.setItem('cachedata', JSON.stringify(alldata));\n\t\t\t  get_fields(data.value,{$data['id']}); \n\t\t\t  get_fields_ext(data.value,{$data['id']});\n\t\t\t  \n\t\t\t  \n\t\t\t});\n\t\t\t$(\"#resetdata\").click(function(){\n\t\t\t\tvar alldata = localStorage.getItem('cachedata');\n\t\t\t\tif(alldata!=''){\n\t\t\t\t\tform.val(\"jizhiform\",JSON.parse(alldata));\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/article-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('管理')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        \n\t\t<div class=\"layui-card\">\n\t\t  <div class=\"layui-card-body\">\n\t\t    <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t\n\t\t\t\t\t  {$fields_search}\n\t\t\t\t\t  <a class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</a>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t\n\t\t\n\t\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t  </div>\n\t\t</div>  \n\t\t\n\t\t\n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t <a class=\"layui-btn layui-btn-xs layui-btn-normal\" lay-event=\"view\">{fun JZLANG('预览')}</a>\n\t\t {if(checkAction('Article/editarticle'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-primary\" lay-event=\"edit\">{fun JZLANG('编辑')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Article/deletearticle'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Article/copyarticle'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-warm\" lay-event=\"copy\">{fun JZLANG('复制')}</a>\n\t\t {/if}\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t\n\t\t {if(checkAction('Article/deleteAll'))}\t\n\t\t\t   <a class=\"layui-btn layui-btn-danger layui-btn-sm\" title=\"{fun JZLANG('批量删除')}\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t     {/if}\n\t\t {if(checkAction('Article/copyAll'))}\t\n\t\t\t   <a class=\"layui-btn layui-btn-warm layui-btn-sm\" title=\"{fun JZLANG('批量复制')}\" onclick=\"copyAll()\">{fun JZLANG('批量复制')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Article/addarticle'))}\n\t\t\t\t{if($tid)}\n\t\t\t\t<a class=\"layui-btn layui-btn-sm\" title=\"{fun JZLANG('新增')}\" onclick=\"x_admin_show('{fun JZLANG('新增')}','{fun U('Article/addarticle',['tid'=>$tid])}')\">{fun JZLANG('新增')}</a>\n\t\t\t\t{else}\n\t\t\t   <a class=\"layui-btn layui-btn-sm\" title=\"{fun JZLANG('新增')}\" onclick=\"x_admin_show('{fun JZLANG('新增')}','{fun U('Article/addarticle')}')\">{fun JZLANG('新增')}</a>\n\t\t\t   {/if}\n\t\t {/if} \n\t\t {if(checkAction('Article/changeType'))}\t\n\t\t\t   <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;\">\n\t\t\t   <select class=\"\" id=\"change_tid\" lay-search=\"\"  lay-filter=\"change_tid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量修改栏目')}</option>\n\t\t\t   {foreach $classtypes as $v}\n\t\t\t   {if($v['molds']=='article')}\n\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t   <option   value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t   {/if}\n\t\t\t   {/if}\n\t\t\t   {/foreach}\n\t\t\t   </select>\n\t\t\t   </div>\n\t\t {/if}\n\t\t {if(checkAction('Article/changeAttribute'))}\t\n\t\t\t   <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;\">\n\t\t\t   <select class=\"\" id=\"change_tuijian\"  lay-filter=\"change_tuijian\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('修改推荐属性')}</option>\n\t\t\t   {loop table=\"attr\" isshow=\"1\" as=\"v\"}\n\t\t\t   <option   value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t   {/loop}\n\t\t\t   \n\t\t\t   </select>\n\t\t\t   </div>\n\t\t {/if}\n\t\t {if(checkAction('Article/checkAll'))}\t\n\t\t  <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;width:150px;\">\n\t\t\t   <select class=\"\" id=\"change_isshow\"  lay-filter=\"change_isshow\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量审核')}</option>\n\t\t\t   <option   value=\"1\">{fun JZLANG('审核')}</option>\n\t\t\t   <option   value=\"2\">{fun JZLANG('未审')}</option>\n\t\t\t   <option   value=\"3\">{fun JZLANG('退回')}</option>\n\t\t\t  \n\t\t\t   </select>\n\t\t\t   </div>\n\t\t {/if}\n\t\t  <a class=\"layui-btn layui-btn-warm layui-btn-sm\" title=\"{fun JZLANG('设置')}\" onclick=\"x_admin_show('{fun JZLANG('列表字段设置')}','{fun U('Fields/fieldsList',['molds'=>'article'])}')\"><i class=\"iconfont\">&#xe6ae;</i></a>\n\t\t\t\n\t\t </div>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"tuijian\">\n\t\t\t{{#  if(d.istop ==1){ }}\n\t\t\t<span class=\"layui-badge layui-bg-black\">{fun JZLANG('顶')}}</span>\n\t\t\t{{#  } }}\n\t\t\t{{#  if(d.ishot==1){ }}\n\t\t        <span class=\"layui-badge\">{fun JZLANG('热')}}</span>\n\t\t    {{#  } }}\n\t\t    {{#  if(d.istuijian==1){ }}\n\t\t        <span class=\"layui-badge layui-bg-green\">{fun JZLANG('荐')}}</span>\n\t\t    {{#  } }}\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"isshow\">\n\t\t\t{{#  if(d.isshow ==1){ }}\n\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('已审')}}</span>\n\t\t    {{#  } else if(d.isshow ==2){ }}\n\t\t    <span class=\"layui-badge layui-bg-black\">{fun JZLANG('退回')}}</span>\n\t\t    {{#  } else{ }}\n\t\t    <span class=\"layui-badge\">{fun JZLANG('未审')}}</span>\n\t\t    {{#  } }}\n\t\t</script>\n\t \t\n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  \n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,cellMinWidth: 80\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '首页' //不显示首页\n\t\t\t\t  ,last: '尾页' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  {foreach $fields_list as $v}\n\t\t\t\t  ,{field: '{$v['field']}',width:{if(!$v['width'])}100{else}{$v['width']}{/if}, title: '{$v['fieldname']}' {if($v['fieldtype']==1 || $v['fieldtype']==2 || $v['fieldtype']==4 || $v['fieldtype']==14)},edit:'text'{/if} }\n\t\t\t\t  {/foreach}\n\t\t\t\t  {if(checkAction('Article/editarticle') || checkAction('Article/deletearticle') || checkAction('Article/copyarticle'))}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:240, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t  {/if}\n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('编辑')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t    var a = $('<a href=\"'+data.view_url+'\" target=\"_blank\">{fun JZLANG('预览')}</a>').get(0);\n\t\t\t\t\t\t\tvar e = document.createEvent('MouseEvents');\n\t\t\t\t\t\t\te.initEvent( 'click', true, true );\n\t\t\t\t\t\t\ta.dispatchEvent(e);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Article/deletearticle')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t\t\t$.post(\"{fun U('Article/copyarticle')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t  \n\t\t\t\t\t\t \n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t\n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\ttable.on('edit(jizhi_table)', function(obj){ \n\t\t\t\t  var id = obj.data.id;\n\t\t\t\t  var value = obj.value;\n\t\t\t\t  var field = obj.field;\n\t\t\t\t  $.post(\"{fun U('Article/editArticleOrders')}\",{'id':id,'value':value,'field':field},function(r){\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg(r.info,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t});\n\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\t\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t    form.on('select(change_tid)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar tid = parseInt(data.value);\n\t\t\t\t\tif(tid==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择修改栏目！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量修改内容分类吗？')}['+datas+']=>['+tid+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Article/changeType')}\",{tid:tid,data:datas},function(r){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量修改成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\t\t\t\tform.on('select(change_tuijian)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar tj = parseInt(data.value);\n\t\t\t\t\tif(tj==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择修改属性！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择修改对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\t$.post(\"{fun U('Article/changeAttribute')}\",{data:datas,tj:tj},function(r){\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量修改成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\n\t\t\t    form.on('select(change_isshow)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar isshow = parseInt(data.value);\n\t\t\t\t\tif(isshow==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核选项！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(isshow==1){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('显示')}';\n\t\t\t\t\t}else if(isshow==2){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('不显示')}';\n\t\t\t\t\t}else{\n\t\t\t\t\t\tvar tip = '{fun JZLANG('退回')}';\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量处理吗？')}['+datas+']=>['+tip+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Article/checkAll')}\",{data:datas,isshow:isshow},function(r){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量审核成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Article/deleteAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t function copyAll(){\n\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要复制吗？')}['+data+']',function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Article/copyAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量复制成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t  \n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/attr-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('推荐属性')}</cite></a>\n             \n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        <div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t<xblock>\n\t\t\t\n\t\t    {if(checkAction('Jzattr/addAttr'))}\n\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-sm\"  onclick=\"addAttr()\">{fun JZLANG('添加属性')}</button>\n\t\t    {/if}\n\t\t\t\n\t\t\n\t\t    <table id=\"fieldtable\" lay-filter=\"fieldtable\"></table>\n\t\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\n\t\t\t</div>\n\t\t</div>\n          \n        </div>\n\t\t\n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t \n\t\t {if(checkAction('Jzattr/editAttr'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-primary\" lay-event=\"edit\">{fun JZLANG('修改')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Jzattr/delAttr'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t {/if}\n\t\t \n\t\t\n\t\t</script>\n\t\t <script type=\"text/html\" id=\"isshowbar\">\n\t\t\t<input type=\"checkbox\" name=\"isshow\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.isshow==1){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }} value=\"1\" lay-skin=\"switch\">\n\t\t</script>\n\t\t \n       <script>\n\t   $(document).ready(function(){\n\t\t\t\n\t   \n\t   });\n\t   \n\t    layui.use(['laydate','element','table','form','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n             var  laydate = layui.laydate;//日期插件\n             var  lement = layui.element;//面包导航\n             var  layer = layui.layer;//弹出层\n\t\t\t var  form = layui.form;\n\t\t\t var  table = layui.table;\n\t\t\t\n\t\t\t\n\t\t\t  table.render({\n\t\t\t\telem: '#fieldtable'\n\t\t\t\t,height: 500\n\t\t\t\t,url: '{fun U('Jzattr/index')}?ajax=1' //数据接口\n\t\t\t\t,page: false //开启分页\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:150}\n\t\t\t\t  ,{field: 'name', title: '{fun JZLANG('名称')}'}\n\t\t\t\t  ,{field: 'isshow', title: '{fun JZLANG('显示')}',toolbar:\"#isshowbar\"}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:200, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t  table.on('tool(fieldtable)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t layer.prompt({\n\t\t\t\t\t\t\t  formType: 0,\n\t\t\t\t\t\t\t  value: data.name,\n\t\t\t\t\t\t\t  title: '{fun JZLANG('修改属性')}',\n\t\t\t\t\t\t\t  area: ['800px', '350px'] //自定义文本域宽高\n\t\t\t\t\t\t\t}, function(value, index, elem){\n\t\t\t\t\t\t\t  $.post(\"{fun U('Jzattr/editAttr')}\",{id:data.id,v:value},function(res){\n\t\t\t\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('修改成功！')}',{icon:6},function(){\n\t\t\t\t\t\t\t\t\t  table.reload('fieldtable', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} \n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tlayer.msg(res.msg,{icon:5});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t  },'json')\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t  layer.close(index);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t \n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Jzattr/delAttr')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t  ,where: {} \n\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  form.on('switch(sw)', function(data){\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tvar id = $(data.elem).attr('data-id');\n\t\t\t\t\t$.post('{fun U('changeStatus')}',{id:id,value:data.value},function(res){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t},'json')\n\t\t\t\t\treturn false;\n\t\t\t  });\n\t\t\t  \n\t\t\t  \n\t\t});\n\t\t\tfunction addAttr(){\n\t\t\t\tlayer.prompt({\n\t\t\t\t  formType: 0,\n\t\t\t\t  value: '',\n\t\t\t\t  title: '{fun JZLANG('新增属性')}',\n\t\t\t\t  area: ['800px', '350px'] //自定义文本域宽高\n\t\t\t\t}, function(value, index, elem){\n\t\t\t\t  $.post(\"{fun U('Jzattr/addAttr')}\",{v:value},function(res){\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('新增成功！')}',{icon:6},function(){\n\t\t\t\t\t\t  location.reload();\n\t\t\t\t\t\t})\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg(res.msg,{icon:5});\n\t\t\t\t\t}\n\t\t\t\t  },'json')\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t  layer.close(index);\n\t\t\t\t});\n\t\t\t\n\t\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/beifen.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n    <head>\r\n      \r\n      <meta charset=\"UTF-8\">\r\n        {include=\"style\"}\r\n    </head>\r\n    <body>\r\n        <div class=\"x-nav\">\r\n            <span class=\"layui-breadcrumb\">\r\n              <a><cite>{fun JZLANG('首页')}</cite></a>\r\n              <a><cite>{fun JZLANG('系统设置')}</cite></a>\r\n              <a><cite>{fun JZLANG('数据库管理')}</cite></a>\r\n            </span>\r\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\r\n        </div>\r\n        <div class=\"x-body\">\r\n            <div class=\"layui-card\">\r\n\t\t    <div class=\"layui-card-body\">\r\n            <xblock>\r\n\t\t\t {if(checkAction('Index/backup'))}\r\n\t\t\t<button class=\"layui-btn\" onclick=\"beifen();\"><i class=\"layui-icon\">&#xe608;</i>{fun JZLANG('备份数据库')}</button>\r\n\t\t\t{/if}\r\n\t\t\t<span class=\"x-right\" style=\"line-height:40px\">{fun JZLANG('备份数：')}{fun count($lists)} </span></xblock>\r\n            <table class=\"layui-table\">\r\n                <thead>\r\n                    <tr>\r\n                        \r\n                        <th>\r\n                            {fun JZLANG('数据库备份名')}\r\n                        </th>\r\n                        <th>\r\n                            {fun JZLANG('大小')}\r\n                        </th>\r\n                        <th>\r\n                            {fun JZLANG('操作')}\r\n                        </th>\r\n                    </tr>\r\n                </thead>\r\n                <tbody>\r\n\t\t\t\t{foreach $lists as $v}\r\n                    <tr>\r\n                       <td>{$v}</td>\r\n                       {php\r\n\t\t\t\t\t    $filename_arr = explode('.php',$v);\r\n\t\t\t\t\t\t$filename = $filename_arr[0];\r\n\t\t\t\t\t    $dir = APP_PATH.'backup';\r\n\t\t\t\t\t\t$filesize = filesize($dir.'/'.$filename.'.php');\r\n\t\t\t\t\t\tfor($i=1;file_exists($dir.'/'.$filename.'_v'.$i.'.php')===true;$i++){\r\n\t\t\t\t\t\t   $filesize+=filesize($dir.'/'.$filename.'_v'.$i.'.php');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t    $filesize = round($filesize/1024,2).'KB';\r\n\t\t\t\t\t   /}\r\n                       <td>{$filesize}</td>\r\n                       \r\n                        <td class=\"td-manage\">\r\n                        {if(strpos($v,'_v')!==false)}\r\n                            <a title=\"{fun JZLANG('备份副本')}\"  href=\"javascript:;\"\r\n                            class=\"ml-5\" style=\"text-decoration:none\">\r\n                                <button class=\"layui-btn layui-btn-disabled\">{fun JZLANG('备份副本')}</button>\r\n                            </a>\r\n                        {else}\r\n\t\t\t\t\t\t{if(checkAction('Index/huanyuan'))}\r\n                            <a title=\"{fun JZLANG('还原数据')}\" onclick=\"huanyuan('{$v}')\" href=\"javascript:;\"\r\n                            class=\"ml-5\" style=\"text-decoration:none\">\r\n                                <button class=\"layui-btn\">{fun JZLANG('还原数据')}</button>\r\n                            </a>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{if(checkAction('Index/shanchu'))}\r\n                            <a title=\"{fun JZLANG('删除备份')}\" onclick=\"shanchu('{$v}')\"  href=\"javascript:;\"\r\n                            style=\"text-decoration:none\">\r\n                               <button class=\"layui-btn layui-btn-danger\">{fun JZLANG('删除备份')}</button>\r\n                            </a>\r\n\t\t\t\t\t\t{/if}\r\n                        {/if}\r\n                        </td>\r\n                    </tr>\r\n\t\t\t\t{/foreach}\r\n                </tbody>\r\n            </table>\r\n\t\t\t</div>\r\n\t\t\t</div>\r\n            \r\n        </div>\r\n       \r\n        <script>\r\n            layui.use(['laydate','element','laypage','layer'], function(){\r\n                $ = layui.jquery;//jquery\r\n              laydate = layui.laydate;//日期插件\r\n              lement = layui.element;//面包导航\r\n              laypage = layui.laypage;//分页\r\n              layer = layui.layer;//弹出层\r\n\r\n            });\r\n\r\n           \r\n\t\t\t \r\n\t\t\t function huanyuan(file){\r\n\t\t\t\tlayer.confirm('{fun JZLANG('还原数据库将覆盖现有的数据库，您确认要还原数据库吗？')}',function(index){\r\n                    //捉到所有被选中的，发异步进行删除\r\n                   // layer.msg('删除成功', {icon: 1});\r\n\t\t\t\t  // console.log(file);\r\n\t\t\t\t  window.location.href=\"{fun U('Index/huanyuan')}?file=\"+file;\r\n                });\r\n\t\t\t }\r\n\t\t\t  function shanchu(file){\r\n\t\t\t\tlayer.confirm('{fun JZLANG('您确定要删除备份数据库吗？删除后将不可找回！')}',function(index){\r\n                    //捉到所有被选中的，发异步进行删除\r\n                   // layer.msg('删除成功', {icon: 1});\r\n\t\t\t\t   //console.log(file);\r\n\t\t\t\t    window.location.href=\"{fun U('Index/shanchu')}?file=\"+file;\r\n                });\r\n\t\t\t }\r\n\t\t\t \r\n\t\t\t \r\n\t\t\t function beifen(){\r\n\t\t\t\twindow.location.href=\"{fun U('Index/backup')}\";\r\n\t\t\t }\r\n\r\n            \r\n            </script>\r\n           \r\n    </body>\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/cache.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\">\n       {include=\"style\"}\n\t   <style>\n\t   .cache-s{\n\t   width:6rem !important;\n\t   }\n\t   .layui-form-label{width:150px;text-align:left;}\n\t   </style>\n    </head>\n    <body>\n    <div class=\"x-body layui-anim layui-anim-up\">\n       <div class=\"layui-card\">\n\t   <div class=\"layui-card-body\">\n        <fieldset class=\"layui-elem-field\">\n            <div class=\"layui-field-box\">\n                <div class=\"layui-col-md12\">\n                    <form class=\"layui-form \" action=\"\">\n\t\t\t\t\t  \n\t\t\t\t\t  <div class=\"layui-form-item\" >\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('数据缓存')}</label>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux cache-s\">\n\t\t\t\t\t\t\t{$datacache} kb\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"layui-input-inline  cache-s\">\n\t\t\t\t\t\t<input lay-skin=\"primary\"   type=\"checkbox\" name=\"cache_data[]\" value=\"data\"   checked>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t\t  {fun JZLANG('文件夹cache/data，主要是网站内容缓存，栏目，详情页等')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t  </div>\n\t\t\t\t\t   <div class=\"layui-form-item\" >\n\t\t\t\t\t\t<label class=\"layui-form-label\">Session</label>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux  cache-s\">\n\t\t\t\t\t\t\t{$logincache} kb\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"layui-input-inline  cache-s\">\n\t\t\t\t\t\t\t<input lay-skin=\"primary\"  type=\"checkbox\" name=\"cache_data[]\" value=\"login\"   >\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t\t  {fun JZLANG('文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t  </div>\n\t\t\t\t\t   <div class=\"layui-form-item\" >\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('日志缓存')}</label>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux  cache-s\">\n\t\t\t\t\t\t\t {$logcache} kb\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-input-inline  cache-s\">\n\t\t\t\t\t\t\t<input lay-skin=\"primary\"  type=\"checkbox\" name=\"cache_data[]\" value=\"log\">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t\t  {fun JZLANG('文件夹cache/log，包括错误日志、支付日志、登录日志等')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t\t  <div class=\"layui-form-item\" >\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('模板缓存')}</label>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux  cache-s\">\n\t\t\t\t\t\t\t {$tplcache} kb\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-input-inline  cache-s\">\n\t\t\t\t\t\t\t<input lay-skin=\"primary\"  type=\"checkbox\" name=\"cache_data[]\" value=\"tpl\"   checked>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t\t  {fun JZLANG('文件夹cache，主要是程序执行时生成的模板编译文件')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t\t  <div class=\"layui-form-item\" >\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('缩略图缓存')}</label>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux  cache-s\">\n\t\t\t\t\t\t\t {$imagecache} kb\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-input-inline  cache-s\">\n\t\t\t\t\t\t\t<input lay-skin=\"primary\"  type=\"checkbox\" name=\"cache_data[]\" value=\"image\"   >\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t\t  {fun JZLANG('文件夹image，主要是程序执行时生成的自定义缩略图')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t\t\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t  <button class=\"layui-btn\" lay-submit lay-filter=\"formDemo\">{fun JZLANG('立即清空')}</button>\n\t\t\t\t\t\t \n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t</form>\n                </div>\n            </div>\n        </fieldset>\n        </div>\n\t\t</div>\n       \n    </div>\n        <script>\n\t\tlayui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t  var upload = layui.upload;\n\t\t\t  form.render();\n\t\t\t     //监听提交\n              form.on('submit(formDemo)', function(data){\n\t\t\t\tif(JSON.stringify(data.field)==\"{}\"){\n\t\t\t\t\tlayer.msg('{fun JZLANG('请选择清空目标！')}');\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('Index/cleanCache')}\",data.field,function(r){\n\t\t\t\t\t//console.log(r);return false;\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm('{fun JZLANG('清理成功！')}', function(){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t})\n\n        </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/chain-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<style>\n\t\t.m-form{\n\t\t    padding: 25px;\n\t\t}\n\t\t.m-form input{\n\t\t\tmargin:5px 0px;\n\t\t}\n\t\t</style>\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('内链管理')}</cite></a>\n             \n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        <div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t<xblock>\n\t\t\t{if(checkAction('Jzchain/delAll'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-danger layui-btn-sm\" title=\"{fun JZLANG('批量删除')}\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t        {/if}\n\t\t    {if(checkAction('Jzchain/addchain'))}\n\t\t\t<button type=\"button\" class=\"layui-btn layui-btn-sm\"  onclick=\"addchain()\">{fun JZLANG('添加内链')}</button>\n\t\t    {/if}\n\t\t\t\n\t\t\t\n\t\t\n\t\t    <table id=\"fieldtable\" lay-filter=\"fieldtable\"></table>\n\t\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\n\t\t\t</div>\n\t\t</div>\n          \n        </div>\n\t\t\n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t \n\t\t {if(checkAction('Jzchain/editchain'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-primary\" lay-event=\"edit\">{fun JZLANG('修改')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Jzchain/delAll'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t {/if}\n\t\t \n\t\t\n\t\t</script>\n\t\t <script type=\"text/html\" id=\"isshowbar\">\n\t\t\t<input type=\"checkbox\" name=\"isshow\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.isshow=='{fun JZLANG('显示')}}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }} value=\"1\" lay-skin=\"switch\">\n\t\t</script>\n\t\t \n       <script>\n\t   $(document).ready(function(){\n\t\t\t\n\t   \n\t   });\n\t   \n\t    layui.use(['laydate','element','table','form','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n             var  laydate = layui.laydate;//日期插件\n             var  lement = layui.element;//面包导航\n             var  layer = layui.layer;//弹出层\n\t\t\t var  form = layui.form;\n\t\t\t var  table = layui.table;\n\t\t\t\n\t\t\t\n\t\t\t  table.render({\n\t\t\t\telem: '#fieldtable'\n\t\t\t\t,height: 500\n\t\t\t\t,url: '{fun U('Jzchain/index')}?ajax=1' //数据接口\n\t\t\t\t,page: {\n\t\t\t\tlayout: ['limit', 'count', 'prev', 'page', 'next', 'skip']\n\t\t\t\t\t\t,groups: 5\n\t\t\t\t\t\t,first: true\n\t\t\t\t\t\t,last: true\n\t\t\t\t\t\t,count:500\n\t\t\t\t\t\t,limit:10\n\t\t\t\t\t\t,first: '首页'\n\t\t\t\t\t\t,last: '尾页'\n\n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:100}\n\t\t\t\t   ,{type:'checkbox'}\n\t\t\t\t  ,{field: 'title', title: '{fun JZLANG('内链词')}', width:150}\n\t\t\t\t  ,{field: 'url', title: '{fun JZLANG('内链')}', width:200}\n\t\t\t\t  ,{field: 'newtitle', title: '{fun JZLANG('替换词')}'}\n\t\t\t\t  ,{field: 'num', title: '{fun JZLANG('替换次数')}'}\n\t\t\t\t  ,{field: 'isshow', title: '{fun JZLANG('显示')}',toolbar:\"#isshowbar\"}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:200, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t  table.on('tool(fieldtable)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\tvar html = '<div class=\"m-form\"><input type=\"hidden\" id=\"id\" value=\\\"'+data.id+'\\\">{fun JZLANG('内链词')}<input type=\\\"text\\\" autocomplete=\"off\" id= \\\"title\\\" value=\\\"'+data.title+'\\\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('内链词')}\\\"/>'\n\t\t\t\t\t\t\t+'{fun JZLANG('替换词')}<input type=\\\"text\\\" value=\\\"'+data.newtitle+'\\\" id= \\\"newtitle\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('替换词，可为空！')}\\\"/>'\n\t\t\t\t\t\t\t+'{fun JZLANG('内链')}<input type=\\\"text\\\" value=\\\"'+data.url+'\\\" id= \\\"url\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('请填写内链')}\\\"/>'\n\t\t\t\t\t\t\t+'{fun JZLANG('替换次数')}<input type=\\\"text\\\" value=\\\"'+data.num+'\\\" id= \\\"num\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('替换次数，默认-1，替换全部，可不写。')}\\\"/>'\n\t\t\t\t\t\t\t+'<button type=\"button\" style=\"margin-left: 45%;\" class=\"layui layui-btn layui-btn-sm\" onclick=\"update()\">{fun JZLANG('提交')}</button></div>';\n\t\t\t\t\t\t\tlayer.open({\n\t\t\t\t\t\t\t  type: 1,\n\t\t\t\t\t\t\t  title:'{fun JZLANG('修改内链')}',\n\t\t\t\t\t\t\t  skin: 'layui-layer-rim', //加上边框\n\t\t\t\t\t\t\t  area: ['800px', '400px'], //宽高\n\t\t\t\t\t\t\t  content: html\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t  break;\n\t\t\t\t\t \n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Jzchain/delchain')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\ttable.reload('fieldtable', {\n\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t  ,where: {} \n\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttable.on('checkbox(fieldtable)', function(obj){\n\t\t\t\t\n\t\t\t\t   var checkStatus = table.checkStatus('fieldtable'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  \n\t\t\t  form.on('switch(sw)', function(data){\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tvar id = $(data.elem).attr('data-id');\n\t\t\t\t\t$.post('{fun U('changeStatus')}',{id:id,value:data.value},function(res){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t},'json')\n\t\t\t\t\treturn false;\n\t\t\t  });\n\t\t\t  \n\t\t\t  \n\t\t});\n\t\t     function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Jzchain/delAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\tfunction addchain(){\n\t\t\t\tvar html = '<div class=\"m-form\">{fun JZLANG('内链词')}<input type=\\\"text\\\" autocomplete=\"off\" id= \\\"title\\\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('内链词')}\\\"/>'\n\t\t\t\t+'{fun JZLANG('替换词')}<input type=\\\"text\\\" id= \\\"newtitle\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('替换词，可为空！')}\\\"/>'\n\t\t\t\t+'{fun JZLANG('内链')}<input type=\\\"text\\\" id= \\\"url\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('请填写内链')}\\\"/>'\n\t\t\t\t+'{fun JZLANG('替换次数')}<input type=\\\"text\\\" id= \\\"num\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('替换次数，默认-1，替换全部，可不写。')}\\\"/>'\n\t\t\t\t+'<button type=\"button\" style=\"margin-left: 45%;\" class=\"layui layui-btn layui-btn-sm\" onclick=\"tj()\">{fun JZLANG('提交')}</button></div>';\n\t\t\t\tlayer.open({\n\t\t\t\t  type: 1,\n\t\t\t\t  title:'{fun JZLANG('添加内链')}',\n\t\t\t\t  skin: 'layui-layer-rim', //加上边框\n\t\t\t\t  area: ['800px', '400px'], //宽高\n\t\t\t\t  content: html\n\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction tj(){\n\t\t\t\t var title = $(\"#title\").val();\n\t\t\t\t  var newtitle = $(\"#newtitle\").val();\n\t\t\t\t  var url = $(\"#url\").val();\n\t\t\t\t  var num = $(\"#num\").val();\n\t\t\t\t  if(title=='' || url==''){\n\t\t\t\t\tlayer.msg('{fun JZLANG('内链词和内链不能为空！')}',{icon:5})\n\t\t\t\t\treturn false;\n\t\t\t\t  }\n\t\t\t\t  $.post(\"{fun U('Jzchain/addchain')}\",{title:title,newtitle:newtitle,url:url,num:num},function(res){\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('新增成功！')}',{icon:6},function(){\n\t\t\t\t\t\t\tlayer.closeAll();\n\t\t\t\t\t\t    location.reload();\n\t\t\t\t\t\t})\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg(res.msg,{icon:5});\n\t\t\t\t\t}\n\t\t\t\t  },'json')\n\t\t\t}\n\t\t\tfunction update(){\n\t\t\t\t var title = $(\"#title\").val();\n\t\t\t\t var id = $(\"#id\").val();\n\t\t\t\t  var newtitle = $(\"#newtitle\").val();\n\t\t\t\t  var url = $(\"#url\").val();\n\t\t\t\t  var num = $(\"#num\").val();\n\t\t\t\t  if(title=='' || url==''){\n\t\t\t\t\tlayer.msg('{fun JZLANG('内链词和内链不能为空！')}',{icon:5})\n\t\t\t\t\treturn false;\n\t\t\t\t  }\n\t\t\t\t  $.post(\"{fun U('Jzchain/editchain')}\",{id:id,title:title,newtitle:newtitle,url:url,num:num},function(res){\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('修改成功！')}',{icon:6},function(){\n\t\t\t\t\t\t\tlayer.closeAll();\n\t\t\t\t\t\t    location.reload();\n\t\t\t\t\t\t})\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg(res.msg,{icon:5});\n\t\t\t\t\t}\n\t\t\t\t  },'json')\n\t\t\t}\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/chongzhi-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n\t  {include=\"style\"}\n\t  \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\">\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\n\t\t\t<div class=\"layui-form-item\">\n              <label for=\"buytype\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('充值类型')}\n              </label>\n              <div class=\"layui-input-inline\">\n                 <select name=\"buytype\" lay-search=\"\" lay-filter=\"buytype\" id=\"buytype\" >\n\t\t\t\t\t\t<option value=\"money\">{fun JZLANG('钱包')}（{fun JZLANG('当前兑换率：')}{$webconf['money_exchange']}）</option>\n\t\t\t\t\t\t<option value=\"jifen\">{fun JZLANG('积分')}（{fun JZLANG('当前兑换率：')}{$webconf['jifen_exchange']}）</option>\n\t\t\t\t </select>\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  {fun JZLANG('兑换率指1元相当于多少钱包/积分')}\n              </div>\n\t\t\t</div>\n\t\t\t<div class=\"layui-form-item\">\n              <label for=\"type\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('交易类型')}\n              </label>\n              <div class=\"layui-input-inline\">\n                 <select name=\"type\" lay-search=\"\" lay-filter=\"type\" id=\"type\" >\n\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('充值')}</option>\n\t\t\t\t\t\t<option value=\"3\">{fun JZLANG('赠送')}</option>\n\t\t\t\t </select>\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n\t\t\t</div>\n\t\t    <div class=\"layui-form-item\">\n              <label for=\"amount\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('充值数量')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"number\" id=\"amount\" name=\"amount\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n\t\t\t</div>\n\t\t\t<div class=\"layui-form-item\">\n              <label for=\"userid\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('用户ID')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"number\" id=\"userid\" name=\"userid\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n\t\t\t</div>\n\t\t   <div class=\"layui-form-item layui-form-text\">\n                        <label for=\"msg\" class=\"layui-form-label\">\n                            <span class=\"x-red\"></span>{fun JZLANG('备注')}\n                        </label>\n                        <div class=\"layui-input-block\">\n                            <textarea  name=\"msg\" class=\"layui-textarea\"></textarea>\n                        </div>\n                    </div>\n\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t</div>\n\t\t\t\t\n\t\t\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <div class=\"layui-form-item\"  style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('添加')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n         \n\t\t\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t\t\t$.post('{fun U('Order/chongzhi')}',data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('操作成功！')}', {\n\t\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t\twindow.location.href=\"{fun U('Order/czlist')}\";\n\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// \n\t\t\t\t\t\t}\n\t\t\t\t\t});\n                return false;\n          });\n\t\t  \n\t\t  \n\t\t\t\n          \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/chongzhi-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('充值管理')}</cite></a>\n              <a><cite>{fun JZLANG('充值列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\"> <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"type\" lay-filter=\"type\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t   <option value=\"\">{fun JZLANG('选择交易类型')}</option>\n\t\t\t\t\t   <option value=\"1\" {if($type==1)}selected{/if}>{fun JZLANG('买入')}</option>\n\t\t\t\t\t   <option value=\"2\" {if($type==2)}selected{/if}>{fun JZLANG('兑换')}</option>\n\t\t\t\t\t   <option value=\"3\" {if($type==3)}selected{/if}>{fun JZLANG('奖励')}</option>\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"buytype\" lay-filter=\"buytype\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t   <option value=\"\">{fun JZLANG('选择交易种类')}</option>\n\t\t\t\t\t   <option value=\"money\" {if($buytype=='money')}selected{/if}>{fun JZLANG('钱包')}</option>\n\t\t\t\t\t   <option value=\"jifen\" {if($buytype=='jifen')}selected{/if}>{fun JZLANG('积分')}</option>\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t  <input class=\"layui-input\" value=\"{$starttime}\" placeholder=\"{fun JZLANG('开始日')}\" name=\"start\" id=\"start\">\n\t\t\t\t\t  <input class=\"layui-input\" value=\"{$endtime}\" placeholder=\"{fun JZLANG('截止日')}\" name=\"end\" id=\"end\">\n\t\t\t\t\t  \n\t\t\t\t\t  <input type=\"text\" name=\"tel\"  style=\"width:200px\" placeholder=\"{fun JZLANG('请输入前台用户手机号')}\" value=\"{$tel}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  \n\t\t\t\t\t  <input type=\"text\" name=\"username\" style=\"width:200px\"   placeholder=\"{fun JZLANG('请输入用户昵称')}\"  value=\"{$username}\"  autocomplete=\"off\" class=\"layui-input\"><br/>\n\t\t\t\t\t \n\t\t\t\t\t  <input type=\"text\" name=\"orderno\" style=\"width:200px\"   placeholder=\"{fun JZLANG('请输入订单号')}\"  value=\"{$orderno}\"  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t \n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t\t</div>\n\t\t</div>\n\t\t\n        \n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t{if(checkAction('Order/delbuylog'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\t\n\t\t\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t {if(checkAction('Order/delAllbuylog'))}\n\t\t\t   <a class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}\t  \n\t\t\t  <a class=\"layui-btn layui-btn-sm layui-btn-info\" onclick=\"x_admin_show('{fun JZLANG('会员充值')}','{fun U('Order/chongzhi')}')\">{fun JZLANG('会员充值')}</a>\n\t\t\t  <a class=\"layui-btn layui-btn-sm\">{fun JZLANG('总订单')}<span id=\"all_num\" class=\"layui-badge layui-bg-gray\"></span></a>\n\t\t\t  <a class=\"layui-btn layui-btn-sm\">{fun JZLANG('已充值')}<span id=\"chongzhi_num\" class=\"layui-badge layui-bg-blue\"></span></a>\n\t\t\t  <a class=\"layui-btn layui-btn-sm\">{fun JZLANG('已兑换')}<span id=\"rechange_num\" class=\"layui-badge \"></span></a>\n\t\t\t  <a class=\"layui-btn layui-btn-sm\">{fun JZLANG('总赠送')}<span id=\"allmoney\" class=\"layui-badge layui-bg-orange\"></span></a>\n\t\t\t\t  \n\t\t\t  \n\t\t\t\n\t\t </div>\n\t\t</script>\n\t\t\n\t \n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  //执行一个laydate实例\n\t\t\tlaydate.render({\n\t\t\t  elem: '#start' //指定元素\n\t\t\t});\n\n\t\t\t//执行一个laydate实例\n\t\t\tlaydate.render({\n\t\t\t  elem: '#end' //指定元素\n\t\t\t});\n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '{fun JZLANG('首页')}' //不显示首页\n\t\t\t\t  ,last: '{fun JZLANG('尾页')}' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,done: function(res, curr, count){\n\t\t\t\t\t//如果是异步请求数据方式，res即为你接口返回的信息。\n\t\t\t\t\t//如果是直接赋值的方式，res即为：{data: [], count: 99} data为当前页数据、count为数据总长度\n\t\t\t\t\tconsole.log(res);\n\t\t\t\t\t$(\"#all_num\").html(res.all);\n\t\t\t\t\t$(\"#chongzhi_num\").html(res.chongzhi_num);\n\t\t\t\t\t$(\"#rechange_num\").html(res.rechange_num);\n\t\t\t\t\t$(\"#allmoney\").html(res.allmoney);\n\t\t\t\t  }\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {type:'checkbox'}\n\t\t\t\t  ,{field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{field: 'orderno', title: '{fun JZLANG('订单号')}'}\n\t\t\t\t  ,{field: 'new_type', title: '{fun JZLANG('类型')}',width:150}\n\t\t\t\t  ,{field: 'new_buytype', title: '{fun JZLANG('交易')}',width:150}\n\t\t\t\t  ,{field: 'username', title: '{fun JZLANG('用户名')}',width:150}\n\t\t\t\t  ,{field: 'amount', title: '{fun JZLANG('数量')}',width:150}\n\t\t\t\t  ,{field: 'money', title: '{fun JZLANG('金额')}',width:150}\n\t\t\t\t  ,{field: 'msg', title: '{fun JZLANG('备注')}'}\n\t\t\t\t  ,{field: 'new_addtime', title: '{fun JZLANG('时间')}',width:160}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:160, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('查看')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t    \n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Order/delbuylog')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t \n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t \n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\t\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t  \n\t\t\t\t\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Order/delAllbuylog')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\n\t\t\t  \n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/classtype-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n\t{include=\"style\"}\n\t{include=\"edit\"}\n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\"  lay-filter=\"jizhiform\">\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t<label for=\"molds\" class=\"layui-form-label\">\n\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择模块')}\n\t\t\t</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<select name=\"molds\" id=\"molds\" lay-filter=\"molds\" >\n\t\t\t   \n\t\t\t   {foreach $molds as $v}\n\t\t\t   {if($v['biaoshi']!='classtype' && $v['isshowclass']==1)}\n\t\t\t   <option {if($biaoshi==$v['biaoshi'])} selected=\"selected\" {/if}  value=\"{$v['biaoshi']}\">{$v['name']}</option>\n\t\t\t   {/if}\n\t\t\t   {/foreach}\n\t\t\t\n\t\t\t   </select>\n\t\t\t</div>\n        </div>\n\t\t<div class=\"layui-form-item\">\n\t\t\t<label for=\"pid\" class=\"layui-form-label\">\n\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择上级')}\n\t\t\t</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<select name=\"pid\" lay-search=\"\" id=\"pid\"  lay-filter=\"pid\">\n\t\t\t   <option value=\"0\">{fun JZLANG('顶级栏目')}</option>\n\t\t\t   {foreach $classtypes as $v}\n\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t   <option {if($pid==$v['id'])}selected{/if}  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t   {/if}\n\t\t\t   {/foreach}\n\t\t\t\n\t\t\t   </select>\n\t\t\t</div>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n\t\t\t</div>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<button type=\"button\" id=\"resetdata\" class=\"layui-btn layui-btn-sm\">{fun JZLANG('恢复数据')}</button>\n\t\t\t</div>\n        </div>\n          <div class=\"layui-form-item\">\n              <label for=\"classname\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('分类名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"classname\" name=\"classname\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"seo_classname\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('SEO标题')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"seo_classname\" name=\"seo_classname\" \n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"keywords\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('关键词')}\n              </label>\n              <div  style=\"width:500px\"  class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"keywords\" name=\"keywords\" \n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n          </div>\n\t\t  \n\t\t\t\n\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t<label for=\"litpic\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('缩略图')}\n\t\t\t\t</label>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<input name=\"litpic\" placeholder=\"{fun JZLANG('上传图片')}\" type=\"text\" class=\"layui-input\" id=\"litpic\"  value=\"\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<button class=\"layui-btn layui-btn-primary\" id=\"litpic_upload\" type=\"button\" >{fun JZLANG('选择图片')}</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<button class=\"layui-btn layui-btn-warm\" id=\"litpic_gallery\" type=\"button\" >{fun JZLANG('图库')}</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<img id=\"litpic_img\" class=\"img-responsive img-thumbnail\" style=\"max-width: 200px;\" src=\"\" onerror=\"javascipt:this.src='{__Tpl_style__}/style/images/nopic.jpg'; this.title='{fun JZLANG('图片未找到')}';this.onerror=''\">\n\t\t\t\t\t<button type=\"button\" onclick=\"deleteImage(this)\" class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger \" title=\"{fun JZLANG('删除这张图片')}\" >{fun JZLANG('删除')}</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n                        <label for=\"description\" class=\"layui-form-label\">\n                            <span class=\"x-red\"></span>{fun JZLANG('简介')}\n                        </label>\n                        <div class=\"layui-input-block\">\n                            <textarea  name=\"description\" class=\"layui-textarea\"></textarea>\n                        </div>\n                    </div>\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label for=\"body\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('内容')}\n                    </label>\n                    <div class=\"layui-input-block\" style=\"clear:both;\" >\n\t\t\t\t\t   {include=\"content\"}\n                    </div>\n                </div>\n\t\t\t\t \n\t\t\t\t\n\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"orders\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('排序')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"number\" id=\"orders\" name=\"orders\" value=\"0\" \n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t   <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"orderstype\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('排序规则')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"orderstype\" id=\"orderstype\">\n\t\t\t\t\t\t  <option value=\"1\">{fun JZLANG('组合：排序倒序，时间倒序，ID倒序')}</option>\n\t\t\t\t\t\t  <option value=\"2\">{fun JZLANG('组合：排序倒序，ID正序')}</option>\n\t\t\t\t\t\t  <option value=\"3\">{fun JZLANG('排序正序')}</option>\n\t\t\t\t\t\t  <option value=\"4\">{fun JZLANG('时间倒序')}</option>\n\t\t\t\t\t\t  <option value=\"5\">{fun JZLANG('ID正序')}</option>\n\t\t\t\t\t\t  <option value=\"6\">{fun JZLANG('点击量倒序')}</option>\n\t\t\t\t\t\t  <option value=\"7\">{fun JZLANG('时间正序')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  <span class=\"x-red\">{fun JZLANG('默认不需要更改')}</span>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t   <div class=\"layui-form-item\">\n              <label for=\"htmlurl\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('URL命名')}\n              </label>\n              <div class=\"layui-input-block\">\n                  <input type=\"text\" placeholder=\"{fun JZLANG('请填写文件名，如:index，不填请留空')}\" style=\"width:350px\"  id=\"htmlurl\" name=\"htmlurl\" value=\"\" autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG('填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：')}{fun get_domain()}/news.html。{fun JZLANG('多个相同URL，将覆盖前面的栏目')}\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"lists_num\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('列表显示')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"number\" id=\"lists_num\" name=\"lists_num\" value=\"10\" \n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  {fun JZLANG('设置列表页显示的内容条数')}\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"lists_html\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('栏目模板')}\n              </label>\n              <div  style=\"width:350px\"  class=\"layui-input-inline\">\n              \t<select name=\"lists_html\" lay-search=\"\" id=\"lists_html\"  >\n\t\t\t\t\n              \t</select>\n                  \n              </div>\n\t\t\t  <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"lists_html_write\" name=\"lists_html_write\" placeholder=\"{fun JZLANG('手动填写，不填请留空')}\" value=\"\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                 {fun JZLANG('请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页')}\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"details_html\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('详情页模板')}\n              </label>\n              <div  style=\"width:350px\"  class=\"layui-input-inline\">\n              \t<select name=\"details_html\" lay-search=\"\" id=\"details_html\"  >\n              \t</select>\n                \n              </div>\n\t\t\t  <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"details_html_write\" name=\"details_html_write\" placeholder=\"{fun JZLANG('手动填写，不填请留空')}\" value=\"\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                 {fun JZLANG('请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。')}\n              </div>\n          </div>\n\t\t   <div class=\"layui-form-item\">\n              <label for=\"gourl\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('栏目外链')}\n              </label>\n              <div class=\"layui-input-block\">\n                  <input type=\"text\" placeholder=\"{fun JZLANG('栏目外链，如:htt://xxx.com/abc，不填请留空')}\" style=\"width:350px\"  id=\"gourl\" name=\"gourl\" value=\"\" autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n               {fun JZLANG('填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！')}\n              </div>\n          </div>\n\t\t   <div class=\"layui-form-item\" pane>\n\t\t\t\t\t<label for=\"ishome\" class=\"layui-form-label\">\n\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('发布显示')}\n\t\t\t\t\t</label>\n\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"0\" title=\"{fun JZLANG('不显示')}\" >\n\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t {fun JZLANG('勾选后，前台会员发布会显示该栏目')}\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t  </div>\n\t\t  <div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('导航显示')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('隐藏')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\n                    </div>\n\t\t\t</div>\n\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t<label for=\"iscover\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('模板覆盖')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t<input type=\"radio\" name=\"iscover\" value=\"1\" title=\"{fun JZLANG('覆盖')}\">\n\t\t\t\t\t<input type=\"radio\" name=\"iscover\" value=\"0\" title=\"{fun JZLANG('不覆盖')}\" checked >\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n                 {fun JZLANG('模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。')}\n                </div>\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t<label for=\"gid\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('访问限制')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\n\t\t\t\t   {loop table=\"member_group\" as=\"v\"}\n\t\t\t\t   <input type=\"checkbox\" value=\"{$v['id']}\" name=\"gids[]\" title=\"{$v['name']}\">\n\t\t\t\t   {/loop}\n\t\t\t\t\n\t\t\t\t  \n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\t\n\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"isclose\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否关闭')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isclose\" value=\"1\" title=\"{fun JZLANG('关闭')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isclose\" value=\"0\" title=\"{fun JZLANG('开启')}\" checked>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t {fun JZLANG('栏目关闭后，前台不显示，也无法访问！')}\n\t\t\t\t\t</div>\n\t\t\t</div>\t\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t</div>\n\t\t\t\t\n\t\t\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('增加')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\t{include=\"fields\"}\n\t\t$(function() {\n\t\t\t \n\t\t\t  get_fields({$pid});\n\t\t\t  get_fields_ext({$pid});\n\n\t\t\t})\n\t\tfunction deleteImage(elm){\n\t\t\t$(elm).prev().attr(\"src\", \"{__Tpl_style__}/style/images/nopic.jpg\");\n\t\t\t$('#litpic').val(\"\");\n\t\t}\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n          var upload = layui.upload;\n\t\t\tform.render();\n\t\t  upload.render({\n\t\t\telem: '#litpic_upload',\n\t\t\turl: \"{fun U('Common/uploads')}\" //上传接口\n\t\t\t,done: function(res){ //上传成功后的回调\n\t\t\t \n\t\t\t\tif(res.code==0){\n\t\t\t\t\t $('#litpic_img').attr('src',res.url);\n\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t}else{\n\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t}\n\t\t\t \n\t\t\t}\n\t\t  });\n\n\t\t  //图库按钮点击事件\n\t\t  $(\"#litpic_gallery\").on(\"click\", function(){\n\t\t\t  var galleryLayer = layer.open({\n\t\t\t\t  type: 1,\n\t\t\t\t  title: \"{fun JZLANG('选择图片')}\",\n\t\t\t\t  area: [\"80%\", \"80%\"],\n\t\t\t\t  content: `<div class=\"gallery-container\" style=\"padding: 15px;\">\n\t\t\t\t\t  <div class=\"gallery-header\" style=\"margin-bottom: 15px;\">\n\t\t\t\t\t\t  <div class=\"layui-btn-group\">\n\t\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_prev_litpic\">{fun JZLANG('上一页')}</button>\n\t\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_next_litpic\">{fun JZLANG('下一页')}</button>\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t  <span id=\"gallery_page_info_litpic\" style=\"margin-left: 15px;\"></span>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div id=\"gallery_list_litpic\" class=\"gallery-list\" style=\"min-height: 400px; display: flex; flex-wrap: wrap; gap: 10px;\"></div>\n\t\t\t\t\t  <div class=\"gallery-footer\" style=\"margin-top: 15px; text-align: center;\">\n\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn\" id=\"gallery_confirm_litpic\">{fun JZLANG('确定')}</button>\n\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-primary\" onclick=\"layer.closeAll();\">{fun JZLANG('取消')}</button>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>`,\n\t\t\t\t  success: function(layero, index){\n\t\t\t\t\t  var currentPage = 1;\n\t\t\t\t\t  var pageSize = 12;\n\t\t\t\t\t  var selectedImages = [];\n\t\t\t\t\t  var totalCount = 0;\n\t\t\t\t\t  \n\t\t\t\t\t  //加载图片列表\n\t\t\t\t\t  function loadGallery(page){\n\t\t\t\t\t\t  $.ajax({\n\t\t\t\t\t\t\t  url: \"{fun U('Sys/pictures')}\",\n\t\t\t\t\t\t\t  type: \"GET\",\n\t\t\t\t\t\t\t  data: {ajax: 1, page: page, pageSize: pageSize},\n\t\t\t\t\t\t\t  dataType: \"json\",\n\t\t\t\t\t\t\t  success: function(res){\n\t\t\t\t\t\t\t\t  if(res.code == 0){\n\t\t\t\t\t\t\t\t\t  var html = \"\";\n\t\t\t\t\t\t\t\t\t  if(res.data.length > 0){\n\t\t\t\t\t\t\t\t\t\t$.each(res.data, function(i, item){\n\t\t\t\t\t\t\t\t\t\t\tvar ext = item.filetype.split('.').pop().toLowerCase();\n\t\t\t\t\t\t\t\t\t\t\tvar imageExts = [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\", \"svg\"];\n\t\t\t\t\t\t\t\t\t\t\tvar isImage = imageExts.includes(ext);\n\t\t\t\t\t\t\t\t\t\t\tvar contentHtml = \"\";\n\t\t\t\t\t\t\t\t\t\t\tif(isImage){\n\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<img src=\"${item.litpic}\" style=\"width: 100%; height: 100%; object-fit: cover;\">`;\n\t\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<div style=\"width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; background: #f5f5f5; padding: 10px;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"font-size: 40px; color: #999;\">&#xe61e;</i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span style=\"font-size: 12px; color: #666; margin-top: 8px; word-break: break-all; text-align: center;\">${item.fileName}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>`;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\thtml += `<div class=\"gallery-item\" data-id=\"`+item.id+`\" data-url=\"`+item.litpic+`\" style=\"width: 140px; height: 140px; border: 2px solid #e6e6e6; border-radius: 4px; cursor: pointer; position: relative; overflow: hidden;\">\n\t\t\t\t\t\t\t\t\t\t\t\t`+contentHtml+\n\t\t\t\t\t\t\t\t\t\t\t\t`<div class=\"gallery-item-info\" style=\"position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.6); color: #fff; padding: 5px; font-size: 12px; display: none;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t${item.fileName}<br>${item.size}kb\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"gallery-item-check\" style=\"position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; border-radius: 50%; border: 2px solid #fff; background: rgba(0,0,0,0.5); display: none;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"color: #fff; font-size: 14px; line-height: 16px;\">&#xe605;</i>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>`;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t$(\"#gallery_list_litpic\").html(html);\n\t\t\t\t\t\t\t\t\t\ttotalCount = res.count;\n\t\t\t\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\n\t\t\t\t\t\t\t\t\t\t$(\"#gallery_page_info_litpic\").text(\"第\"+page+\"页 / 共\"+totalPages+\"页\");\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t  //图片悬停事件\n\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_litpic .gallery-item\").hover(\n\t\t\t\t\t\t\t\t\t\t  function(){\n\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-info\").show();\n\t\t\t\t\t\t\t\t\t\t  },\n\t\t\t\t\t\t\t\t\t\t  function(){\n\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-info\").hide();\n\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t  );\n\t\t\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t\t\t  //图片点击事件\n\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_litpic .gallery-item\").on(\"click\", function(){\n\t\t\t\t\t\t\t\t\t\t  var url = $(this).data(\"url\");\n\t\t\t\t\t\t\t\t\t\t  var id = $(this).data(\"id\");\n\t\t\t\t\t\t\t\t\t\t  var index = selectedImages.indexOf(url);\n\t\t\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t\t\t\t  if(index > -1){\n\t\t\t\t\t\t\t\t\t\t\t  selectedImages.splice(index, 1);\n\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#e6e6e6\");\n\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").hide();\n\t\t\t\t\t\t\t\t\t\t  }else{\n\t\t\t\t\t\t\t\t\t\t\t  selectedImages.push(url);\n\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#1E9FFF\");\n\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").show();\n\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t\t\t  //恢复已选中的图片\n\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_litpic .gallery-item\").each(function(){\n\t\t\t\t\t\t\t\t\t\t  var url = $(this).data(\"url\");\n\t\t\t\t\t\t\t\t\t\t  if(selectedImages.indexOf(url) > -1){\n\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#1E9FFF\");\n\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").show();\n\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t\t  }else{\n\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_litpic\").html('<div style=\"width: 100%; text-align: center; padding: 50px; color: #999;\">{fun JZLANG('暂无图片')}</div>');\n\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t  }else{\n\t\t\t\t\t\t\t\t  layer.alert(res.msg || \"{fun JZLANG('加载失败')}\", {icon: 5});\n\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t  },\n\t\t\t\t\t\t  error: function(){\n\t\t\t\t\t\t\t  layer.alert(\"{fun JZLANG('请求失败')}\", {icon: 5});\n\t\t\t\t\t\t  }\n\t\t\t\t\t  });\n\t\t\t\t  \t  }\n\t\t\t\t  \n\t\t\t\t\t\t//上一页\n\t\t\t\t\t\t$(\"#gallery_prev_litpic\").on(\"click\", function(){\n\t\t\t\t\t\t\tif(currentPage > 1){\n\t\t\t\t\t\t\t\tcurrentPage--;\n\t\t\t\t\t\t\t\tloadGallery(currentPage);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\t//下一页\n\t\t\t\t\t\t$(\"#gallery_next_litpic\").on(\"click\", function(){\n\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\n\t\t\t\t\t\t\tif(currentPage < totalPages){\n\t\t\t\t\t\t\t\tcurrentPage++;\n\t\t\t\t\t\t\t\tloadGallery(currentPage);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\t//确定按钮\n\t\t\t\t\t\t$(\"#gallery_confirm_litpic\").on(\"click\", function(){\n\t\t\t\t\t\t\tif(selectedImages.length > 0){\n\t\t\t\t\t\t\t\t$(\"#litpic\").val(selectedImages.join(\",\"));\n\t\t\t\t\t\t\t\t$(\"#litpic_img\").attr(\"src\", selectedImages[0]);\n\t\t\t\t\t\t\t\tlayer.closeAll();\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tlayer.alert(\"{fun JZLANG('请选择至少一张图片')}\", {icon: 5});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t  \n\t\t\t\t\t\t//初始加载\n\t\t\t\t\t\tloadGallery(currentPage);\n\t\t\t  \t\t}\n\t\t  });\n\t\t  })\n\n\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t\t\t$.post('{fun U('Classtype/addclass')}',data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tlayer.confirm(r.info, {\n\t\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t   {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t   window.location.href=\"{fun U('Classtype/index')}\";\n\t\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t\t   parent.location.reload();\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n                return false;\n          });\n\t\t \n\t\t  \n\t\t    form.on('select(pid)', function(data){\n\t\t\t  var alldata = form.val(\"jizhiform\");\n\t\t\t  localStorage.setItem('cachedata', JSON.stringify(alldata));\n\t\t\t  get_fields(data.value);\n\t\t\t  get_fields_ext(data.value);\n\t\t\t  \n\t\t\t  \n\t\t\t});\n\t\t\t$(\"#resetdata\").click(function(){\n\t\t\t\tvar alldata = localStorage.getItem('cachedata');\n\t\t\t\tif(alldata!=''){\n\t\t\t\t\tform.val(\"jizhiform\",JSON.parse(alldata));\n\t\t\t\t}\n\t\t\t})\n\t\t    form.on('select(molds)', function(data){\n\t\t\t  \n\t\t\t get_molds_html($(\"#molds\").val());\n\t\t\t form.render('select');\n\t\t\t  \n\t\t\t});\n\t\t\t\n           $(\"#classname\").blur(function(){\n\t\t\t\tvar classname = $(\"#classname\").val();\n\t\t\t\t\n\t\t\t\t$.post(\"{fun U('get_pinyin')}\",{'classname':classname},function(r){\n\t\t\t\t\tvar res = JSON.parse(r);\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\t$(\"#htmlurl\").val(res.data);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t})\n\t\t\t\n\t\t\t\n\t\t\t});\n          \n        });\n\n        function get_molds_html(molds){\n        \t$.ajax({\n\t\t\t\t url:\"{fun U('Classtype/get_html')}\",//请求的url地址\n\t\t\t\t dataType:\"json\",//返回格式为json\n\t\t\t\t async:false,\n\t\t\t\t data:{molds:molds},//参数值\n\t\t\t\t type:\"POST\",//请求方式\n\t\t\t\t beforeSend:function(){\n\t\t\t\t\t//请求前的处理\n\t\t\t\t\t},\n\t\t\t\t success:function(r){\n\t\t\t\t\t \tvar t = '<option value=\"\">{fun JZLANG('请选择模板页面/使用自定义')}</option>';var tt = '<option value=\"\">{fun JZLANG('请选择模板页面/使用自定义')}</option>';\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\tvar len = r.data.length;\n\t\t\t\t\t\t\tif(len>0){\n\t\t\t\t\t\t\t\tvar lists_html = r['lists_html'];\n\t\t\t\t\t\t\t\tvar details_html = r['details_html'];\n\t\t\t\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\t\t\t\tvar isok = 0;\n\t\t\t\t\t\t\t\t\tif(lists_html==r.data[i].value){\n\t\t\t\t\t\t\t\t\t\tt+='<option value=\"'+r.data[i].value+'\" selected>'+r.data[i].html+'</option>';\n\t\t\t\t\t\t\t\t\t\tisok = 1;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\tt+='<option value=\"'+r.data[i].value+'\">'+r.data[i].html+'</option>';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\t\t\t\tvar isok = 0;\n\t\t\t\t\t\t\t\t\tif(details_html==r.data[i].value){\n\t\t\t\t\t\t\t\t\t\ttt+='<option value=\"'+r.data[i].value+'\" selected>'+r.data[i].html+'</option>';\n\t\t\t\t\t\t\t\t\t\tisok = 1;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\ttt+='<option value=\"'+r.data[i].value+'\">'+r.data[i].html+'</option>';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(\"#lists_html\").html(t);\n\t\t\t\t\t\t$(\"#details_html\").html(tt);\n\t\t\t\t\t\tlayui.use(['form'], function(){\n\t\t\t\t\t\t\tvar form = layui.form;\n\t\t\t\t\t\t\tform.render('select');\n\t\t\t\t\t\t })\n\t\t\t\t\t},\n\t\t\t\t\t complete:function(){\n\t\t\t\t\t//请求完成的处理\n\t\t\t\t\t},\n\t\t\t\t\t error:function(){\n\t\t\t\t\t//请求出错处理\n\t\t\t\t\t}\n\n\t\t\t})\n        \t}\n\n\n        $(document).ready(function(){\n\n        \t\n        \tget_molds_html($(\"#molds\").val());\n        })\n\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/classtype-addmany.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n\t<meta charset=\"UTF-8\">\r\n\t{include=\"style\"}\r\n\r\n</head>\r\n\r\n<body>\r\n<div class=\"x-nav\">\r\n      <span class=\"layui-breadcrumb\">\r\n        <a>{fun JZLANG('首页')}</a>\r\n        <a>{$molds['name']}{fun JZLANG('管理')}</a>\r\n        <a><cite>{fun JZLANG('批量新增')}{$molds['name']}</cite></a>\r\n      </span>\r\n\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\r\n\t\t<i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\r\n</div>\r\n<div class=\"x-body\">\r\n\r\n\t<div class=\"layui-tab\">\r\n\t\t<ul class=\"layui-tab-title\">\r\n\t\t\t<li class=\"layui-this\">{fun JZLANG('基础')}</li>\r\n\t\t\t<li>{fun JZLANG('高级')}</li>\r\n\t\t</ul>\r\n\t\t<div class=\"layui-tab-content\">\r\n\t\t\t<div class=\"layui-tab-item layui-show\">\r\n\r\n\t\t\t\t<form class=\"layui-form layui-form-pane\"   id=\"myform2\">\r\n\t\t\t\t\t<input type=\"hidden\" name=\"type\" value=\"1\" >\r\n\t\t\t\t\t<div class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label for=\"molds\" class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择模块')}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<select name=\"molds\" id=\"molds\" lay-filter=\"molds\" >\r\n\r\n\t\t\t\t\t\t\t\t{foreach $moldslist as $v}\r\n\t\t\t\t\t\t\t\t{if($v['isshowclass']==1)}\r\n\t\t\t\t\t\t\t\t<option   value=\"{$v['biaoshi']}\">{$v['name']}</option>\r\n\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t{/foreach}\r\n\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label for=\"pid\" class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择上级')}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<select name=\"pid\" lay-search=\"\" id=\"pid\"  lay-filter=\"pid\">\r\n\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('顶级栏目')}</option>\r\n\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\r\n\t\t\t\t\t\t\t\t<option   value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\r\n\t\t\t\t\t\t\t\t{/foreach}\r\n\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-form-item layui-form-text\">\r\n\t\t\t\t\t\t<label class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t<span class='x-red'>*</span>{fun JZLANG('添加栏目')} <span class=\"x-red\">{fun JZLANG('格式：栏目名|栏目URL，一行一个，如：关于我们|about')}</span>\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-input-block\">\r\n\t\t\t\t\t\t\t<textarea placeholder=\"{fun JZLANG('格式：栏目名|栏目URL，一行一个')}\" lay-verify=\"required\" name=\"classname\" class=\"layui-textarea\"></textarea>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label for=\"lists_html\" class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('栏目模板')}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div  style=\"width:350px\"  class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<select name=\"lists_html\" lay-search=\"\" id=\"lists_html\"  >\r\n\r\n\t\t\t\t\t\t\t</select>\r\n\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t\t\t{fun JZLANG('请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页')}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label for=\"details_html\" class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('详情页模板')}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div  style=\"width:350px\"  class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<select name=\"details_html\" lay-search=\"\" id=\"details_html\"  >\r\n\t\t\t\t\t\t\t</select>\r\n\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t\t\t{fun JZLANG('请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。')}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label for=\"lists_num\" class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('列表显示')}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<input type=\"number\" id=\"lists_num\" name=\"lists_num\" value=\"10\"\r\n\t\t\t\t\t\t\t\t   autocomplete=\"off\" class=\"layui-input\">\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t\t\t{fun JZLANG('设置列表页显示的内容条数')}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-form-item\" pane>\r\n\t\t\t\t\t\t<label for=\"ishome\" class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('发布显示')}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"0\" title=\"{fun JZLANG('不显示')}\" >\r\n\t\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t\t\t{fun JZLANG('勾选后，前台会员发布会显示该栏目')}\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"layui-form-item\" pane>\r\n\t\t\t\t\t\t<label for=\"isshow\" class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('导航显示')}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('隐藏')}\">\r\n\t\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\r\n\t\t\t\t\t<div class=\"layui-form-item\" style=\"text-align:center;\">\r\n\r\n\t\t\t\t\t\t<button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\r\n\t\t\t\t\t\t\t{fun JZLANG('增加')}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t</form>\r\n\r\n\r\n\t\t\t</div>\r\n\t\t\t<div class=\"layui-tab-item\">\r\n\r\n\t\t\t\t<form class=\"layui-form \" method=\"post\" id=\"myform2\">\r\n\r\n\t\t\t\t\t<div style=\"width:100%;  overflow:scroll;overflow-y: hidden\">\r\n\t\t\t\t\t\t<table border=\"1\" rules=\"all\" style=\"width:100%; height:100px; white-space:nowrap\" class=\"layui-table layui-form\">\r\n\t\t\t\t\t\t\t<input type=\"hidden\" name=\"type\" class=\"layui-input \"  value=\"2\" >\r\n\t\t\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('模型')}</th>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('栏目名')}</th>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('栏目上级')}</th>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('栏目URL')}</th>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('列表条数')}</th>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('栏目模板')}</th>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('详情页模板')}</th>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('导航是否显示')}</th>\r\n\t\t\t\t\t\t\t\t<th >{fun JZLANG('排序')}</th>\r\n\r\n\r\n\t\t\t\t\t\t\t</thead>\r\n\t\t\t\t\t\t\t<tbody class=\"x-cate\">\r\n\r\n\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_0[]\" >\r\n\r\n\t\t\t\t\t\t\t\t\t{foreach $moldslist as $v}\r\n\t\t\t\t\t\t\t\t\t{if($v['isshowclass']==1)}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['biaoshi']}\">{$v['name']}</option>\r\n\t\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input classname\"  name=\"data_1[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_2[]\" lay-search=\"\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('顶级')}</option>\r\n\t\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{fun str_repeat('--', $v['level']), $v['classname']}</option>\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input htmlurl\"  name=\"data_3[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"  name=\"data_4[]\" value=\"10\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"  name=\"data_5[]\" value=\"lists.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"   name=\"data_6[]\" value=\"details.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_7[]\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不显示')}</option>\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"   name=\"data_8[]\" value=\"0\"></td>\r\n\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_0[]\" >\r\n\r\n\t\t\t\t\t\t\t\t\t{foreach $moldslist as $v}\r\n\t\t\t\t\t\t\t\t\t{if($v['isshowclass']==1)}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['biaoshi']}\">{$v['name']}</option>\r\n\t\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input classname\"  name=\"data_1[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_2[]\" lay-search=\"\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('顶级')}</option>\r\n\t\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{fun str_repeat('--', $v['level']), $v['classname']}</option>\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input htmlurl\"  name=\"data_3[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"  name=\"data_4[]\" value=\"10\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"  name=\"data_5[]\" value=\"lists.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"   name=\"data_6[]\" value=\"details.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_7[]\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不显示')}</option>\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"   name=\"data_8[]\" value=\"0\"></td>\r\n\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_0[]\" >\r\n\r\n\t\t\t\t\t\t\t\t\t{foreach $moldslist as $v}\r\n\t\t\t\t\t\t\t\t\t{if($v['isshowclass']==1)}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['biaoshi']}\">{$v['name']}</option>\r\n\t\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input classname\"  name=\"data_1[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_2[]\" lay-search=\"\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('顶级')}</option>\r\n\t\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{fun str_repeat('--', $v['level']), $v['classname']}</option>\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input htmlurl\"  name=\"data_3[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"  name=\"data_4[]\" value=\"10\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"  name=\"data_5[]\" value=\"lists.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"   name=\"data_6[]\" value=\"details.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_7[]\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不显示')}</option>\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"   name=\"data_8[]\" value=\"0\"></td>\r\n\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_0[]\" >\r\n\r\n\t\t\t\t\t\t\t\t\t{foreach $moldslist as $v}\r\n\t\t\t\t\t\t\t\t\t{if($v['isshowclass']==1)}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['biaoshi']}\">{$v['name']}</option>\r\n\t\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input classname\"  name=\"data_1[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_2[]\" lay-search=\"\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('顶级')}</option>\r\n\t\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{fun str_repeat('--', $v['level']), $v['classname']}</option>\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input htmlurl\"  name=\"data_3[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"  name=\"data_4[]\" value=\"10\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"  name=\"data_5[]\" value=\"lists.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"   name=\"data_6[]\" value=\"details.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_7[]\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不显示')}</option>\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"   name=\"data_8[]\" value=\"0\"></td>\r\n\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_0[]\" >\r\n\r\n\t\t\t\t\t\t\t\t\t{foreach $moldslist as $v}\r\n\t\t\t\t\t\t\t\t\t{if($v['isshowclass']==1)}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['biaoshi']}\">{$v['name']}</option>\r\n\t\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input classname\"  name=\"data_1[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_2[]\" lay-search=\"\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('顶级')}</option>\r\n\t\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{fun str_repeat('--', $v['level']), $v['classname']}</option>\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input htmlurl\"  name=\"data_3[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"  name=\"data_4[]\" value=\"10\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"  name=\"data_5[]\" value=\"lists.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"   name=\"data_6[]\" value=\"details.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_7[]\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不显示')}</option>\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"   name=\"data_8[]\" value=\"0\"></td>\r\n\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_0[]\" >\r\n\r\n\t\t\t\t\t\t\t\t\t{foreach $moldslist as $v}\r\n\t\t\t\t\t\t\t\t\t{if($v['isshowclass']==1)}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['biaoshi']}\">{$v['name']}</option>\r\n\t\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input classname\"  name=\"data_1[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_2[]\" lay-search=\"\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('顶级')}</option>\r\n\t\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{fun str_repeat('--', $v['level']), $v['classname']}</option>\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input htmlurl\"  name=\"data_3[]\" value=\"\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"  name=\"data_4[]\" value=\"10\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"  name=\"data_5[]\" value=\"lists.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input \"   name=\"data_6[]\" value=\"details.html\"></td>\r\n\t\t\t\t\t\t\t\t<td><select name=\"data_7[]\" lay-search=\"\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不显示')}</option>\r\n\t\t\t\t\t\t\t\t</select></td>\r\n\t\t\t\t\t\t\t\t<td><input type=\"number\" class=\"layui-input \"   name=\"data_8[]\" value=\"0\"></td>\r\n\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t<tr  class=\"addone\"><td colspan=\"9\" style=\"text-align:center;\"><button type=\"button\" class=\"layui-btn layui-btn-normal \" onclick=\"addone()\">{fun JZLANG('新增')}+</button>\r\n\t\t\t\t\t\t\t\t<button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">{fun JZLANG('提交')}</button>\r\n\t\t\t\t\t\t\t</td></tr>\r\n\r\n\r\n\t\t\t\t\t\t\t</tbody>\r\n\t\t\t\t\t\t</table>\r\n\t\t\t\t</form>\r\n\r\n\r\n\t\t\t</div>\r\n\r\n\r\n\t\t</div>\r\n\r\n\r\n\t</div>\r\n</div>\r\n\r\n<script>\r\n\tlayui.use(['form','element'], function(){\r\n\t\tvar  form = layui.form;\r\n\t\tvar element = layui.element;\r\n\r\n\t\tform.on('select(molds)', function(data){\r\n\r\n\t\t\tget_molds_html($(\"#molds\").val());\r\n\t\t\tform.render('select');\r\n\r\n\t\t});\r\n\r\n\t\t//监听提交\r\n\t\tform.on('submit(add)', function(data){\r\n\r\n\t\t\t$.post(\"{fun U('addmany')}\",data.field,function(r){\r\n\r\n\t\t\t\tvar r = JSON.parse(r);\r\n\t\t\t\tif(r.code==0){\r\n\r\n\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\r\n\t\t\t\t\twindow.location.href=\"{fun U('Classtype/index')}\";\r\n\t\t\t\t\t{else}\r\n\t\t\t\t\tparent.location.reload();\r\n\t\t\t\t\tparent.layer.close(index);\r\n\r\n\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\r\n\r\n\t\t\tform.on('submit(save)', function(data){\r\n\r\n\t\t\t\t$.post(\"{fun U('addmany')}\",data.field,function(r){\r\n\r\n\t\t\t\t\tvar r = JSON.parse(r);\r\n\t\t\t\t\tif(r.code==0){\r\n\r\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\r\n\t\t\t\t\t\twindow.location.href=\"{fun U('Classtype/index')}\";\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\tparent.location.reload();\r\n\t\t\t\t\t\tparent.layer.close(index);\r\n\r\n\t\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t});\r\n\r\n\r\n\r\n\t\t\t});\r\n\r\n\t\t\tfunction get_molds_html(molds){\r\n\t\t\t\t$.ajax({\r\n\t\t\t\t\turl:\"{fun U('Classtype/get_html')}\",//请求的url地址\r\n\t\t\t\t\tdataType:\"json\",//返回格式为json\r\n\t\t\t\t\tasync:false,\r\n\t\t\t\t\tdata:{molds:molds},//参数值\r\n\t\t\t\t\ttype:\"POST\",//请求方式\r\n\t\t\t\t\tbeforeSend:function(){\r\n\t\t\t\t\t\t//请求前的处理\r\n\t\t\t\t\t},\r\n\t\t\t\t\tsuccess:function(r){\r\n\t\t\t\t\t\tvar t = '<option value=\"\">{fun JZLANG('请选择模板页面')}</option>';var tt = '<option value=\"\">{fun JZLANG('请选择模板页面')}</option>';\r\n\t\t\t\t\t\tif(r.code==0){\r\n\t\t\t\t\t\t\tvar len = r.data.length;\r\n\t\t\t\t\t\t\tif(len>0){\r\n\t\t\t\t\t\t\t\tvar lists_html = r['lists_html'];\r\n\t\t\t\t\t\t\t\tvar details_html = r['details_html'];\r\n\t\t\t\t\t\t\t\tfor(var i=0;i<len;i++){\r\n\t\t\t\t\t\t\t\t\tvar isok = 0;\r\n\t\t\t\t\t\t\t\t\tif(lists_html==r.data[i].value){\r\n\t\t\t\t\t\t\t\t\t\tt+='<option value=\"'+r.data[i].value+'\" selected>'+r.data[i].html+'</option>';\r\n\t\t\t\t\t\t\t\t\t\tisok = 1;\r\n\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\tt+='<option value=\"'+r.data[i].value+'\">'+r.data[i].html+'</option>';\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif(!isok){\r\n\t\t\t\t\t\t\t\t\tt+='<option value=\"'+lists_html+'\" selected>'+lists_html+'</option>';\r\n\t\t\t\t\t\t\t\t\tisok = 1;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tfor(var i=0;i<len;i++){\r\n\t\t\t\t\t\t\t\t\tvar isok = 0;\r\n\t\t\t\t\t\t\t\t\tif(details_html==r.data[i].value){\r\n\t\t\t\t\t\t\t\t\t\ttt+='<option value=\"'+r.data[i].value+'\" selected>'+r.data[i].html+'</option>';\r\n\t\t\t\t\t\t\t\t\t\tisok = 1;\r\n\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\ttt+='<option value=\"'+r.data[i].value+'\">'+r.data[i].html+'</option>';\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif(!isok){\r\n\t\t\t\t\t\t\t\t\ttt+='<option value=\"'+details_html+'\" selected>'+details_html+'</option>';\r\n\t\t\t\t\t\t\t\t\tisok = 1;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlayui.use(['form'], function(){\r\n\t\t\t\t\t\t\t\tvar form = layui.form;\r\n\t\t\t\t\t\t\t\tform.render();\r\n\t\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$(\"#lists_html\").html(t);\r\n\t\t\t\t\t\t$(\"#details_html\").html(tt);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tcomplete:function(){\r\n\t\t\t\t\t\t//请求完成的处理\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror:function(){\r\n\t\t\t\t\t\t//请求出错处理\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t})\r\n\t\t\t}\r\n\r\n\r\n\t\t\t$(document).ready(function(){\r\n\r\n\r\n\t\t\t\tget_molds_html($(\"#molds\").val());\r\n\t\t\t})\r\n\r\n\r\n\r\n\r\n\t\t\tfunction addone(){\r\n\t\t\t\tvar html='<tr><td><select name=\"data_0[]\" >'+\r\n\t\t\t\t\t{foreach $moldslist as $v}\r\n\t\t\t\t{if($v['isshowclass']==1)}\r\n\t\t\t\t'<option value=\"{$v['biaoshi']}\">{$v['name']}</option>'+\r\n\t\t\t\t{/if}\r\n\t\t\t\t{/foreach}\r\n\t\t\t\t\t'</select></td><td><input type=\"text\" class=\"layui-input classname\"  name=\"data_1[]\" value=\"\"></td><td><select name=\"data_2[]\" lay-search=\"\" ><option value=\"0\">{fun JZLANG('顶级')}</option>'+\r\n\t\t\t\t\t{foreach $classtypes as $v}\r\n\t\t\t\t\t'<option value=\"{$v['id']}\">{fun str_repeat('--', $v['level']), $v['classname']}</option>'+\r\n\t\t\t\t{/foreach}\r\n\t\t\t\t\t'</select></td><td><input type=\"text\" class=\"layui-input htmlurl\"  name=\"data_3[]\" value=\"\"></td><td><input type=\"number\" class=\"layui-input \"  name=\"data_4[]\" value=\"10\"></td><td><input type=\"text\" class=\"layui-input \"  name=\"data_5[]\" value=\"lists.html\"></td><td><input type=\"text\" class=\"layui-input \"   name=\"data_6[]\" value=\"details.html\"></td><td><select name=\"data_7[]\" ><option value=\"1\">{fun JZLANG('显示')}</option><option value=\"0\">{fun JZLANG('不显示')}</option></select></td><td><input type=\"number\" class=\"layui-input \"   name=\"data_8[]\" value=\"0\"></td></tr>';\r\n\r\n\t\t\t\t\t$(\".addone\").before(html);\r\n\r\n\t\t\t\t\tlayui.use(['form'], function(){\r\n\t\t\t\t\t\tvar form = layui.form;\r\n\t\t\t\t\t\tform.render();\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\r\n\r\n</script>\r\n\r\n</body>\r\n\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/classtype-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n\t{include=\"style\"}\n    {include=\"edit\"}\n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\"  lay-filter=\"jizhiform\">\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t<label for=\"molds\" class=\"layui-form-label\">\n\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择模块')}\n\t\t\t</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<select name=\"molds\" id=\"molds\" lay-filter=\"molds\" >\n\t\t\t   \n\t\t\t   {foreach $molds as $v}\n\t\t\t   {if($v['biaoshi']!='classtype' && $v['isshowclass']==1)}\n\t\t\t   <option {if($data['molds']==$v['biaoshi'])} selected=\"selected\" {/if}  value=\"{$v['biaoshi']}\">{$v['name']}</option>\n\t\t\t   {/if}\n\t\t\t   {/foreach}\n\t\t\t\n\t\t\t   </select>\n\t\t\t</div>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<button type=\"button\" id=\"resetdata\" class=\"layui-btn layui-btn-sm\">{fun JZLANG('恢复数据')}</button>\n\t\t\t\t</div>\n        </div>\n\t\t<div class=\"layui-form-item\">\n\t\t\t<label for=\"pid\" class=\"layui-form-label\">\n\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择上级')}\n\t\t\t</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<select name=\"pid\" id=\"pid\" lay-search=\"\" lay-filter=\"pid\">\n\t\t\t   <option value=\"0\">{fun JZLANG('顶级栏目')}</option>\n\t\t\t   {foreach $classtypes as $v}\n\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t   <option {if($data['pid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t   {/if}\n\t\t\t   {/foreach}\n\t\t\t\n\t\t\t   </select>\n\t\t\t</div>\n        </div>\n          <div class=\"layui-form-item\">\n              <label for=\"classname\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('分类名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"classname\" name=\"classname\" value=\"{$data['classname']}\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  <span class=\"x-red\"></span>\n              </div>\n          </div>\n\t\t   <div class=\"layui-form-item\">\n              <label for=\"seo_classname\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('SEO标题')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"seo_classname\" name=\"seo_classname\" value=\"{$data['seo_classname']}\" \n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  <span class=\"x-red\"></span>\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"keywords\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('关键词')}\n              </label>\n              <div  style=\"width:500px\"  class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"keywords\" name=\"keywords\" value=\"{$data['keywords']}\" \n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n          </div>\n\t\t <div class=\"layui-form-item\">\n\t\t\t\t<label for=\"litpic\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('缩略图')}\n\t\t\t\t</label>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<input name=\"litpic\" placeholder=\"{fun JZLANG('上传图片')}\" type=\"text\" class=\"layui-input\" id=\"litpic\"  value=\"{$data['litpic']}\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<button class=\"layui-btn layui-btn-primary\" id=\"litpic_upload\" type=\"button\" >{fun JZLANG('选择图片')}</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<button class=\"layui-btn layui-btn-warm\" id=\"litpic_gallery\" type=\"button\" >{fun JZLANG('图库')}</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<img id=\"litpic_img\" class=\"img-responsive img-thumbnail\" style=\"max-width: 200px;\" src=\"{$data['litpic']}\" onerror=\"javascipt:this.src='{__Tpl_style__}/style/images/nopic.jpg'; this.title='{fun JZLANG('图片未找到')}';this.onerror=''\">\n\t\t\t\t\t<button type=\"button\" onclick=\"deleteImage(this)\" class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger \" title=\"{fun JZLANG('删除这张图片')}\" >{fun JZLANG('删除')}</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                        <label for=\"description\" class=\"layui-form-label\">\n                            <span class=\"x-red\"></span>{fun JZLANG('简介')}\n                        </label>\n                        <div class=\"layui-input-block\">\n                            <textarea  name=\"description\" class=\"layui-textarea\">{$data['description']}</textarea>\n                        </div>\n                    </div>\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label for=\"body\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('内容')}\n                    </label>\n                    <div class=\"layui-input-block\" style=\"clear:both;\" >\n\t\t\t\t\t   {include=\"content\"}\n                    </div>\n                </div>\n\t\t\t\t \n\t\t\t\t\n\t\t \n\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"orders\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('排序')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <input type=\"number\" id=\"orders\" name=\"orders\" value=\"{$data['orders']}\"\n\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t  <label for=\"orderstype\" class=\"layui-form-label\">\n\t\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('排序规则')}\n\t\t\t\t\t  </label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"orderstype\" id=\"orderstype\">\n\t\t\t\t\t\t  <option value=\"1\" {if($data['orderstype']==1)}selected{/if}>{fun JZLANG('组合：排序倒序，时间倒序，ID倒序')}</option>\n\t\t\t\t\t\t  <option value=\"2\" {if($data['orderstype']==2)}selected{/if}>{fun JZLANG('组合：排序倒序，ID正序')}</option>\n\t\t\t\t\t\t  <option value=\"3\" {if($data['orderstype']==3)}selected{/if}>{fun JZLANG('排序正序')}</option>\n\t\t\t\t\t\t  <option value=\"4\" {if($data['orderstype']==4)}selected{/if}>{fun JZLANG('时间倒序')}</option>\n\t\t\t\t\t\t  <option value=\"5\" {if($data['orderstype']==5)}selected{/if}>{fun JZLANG('ID正序')}</option>\n\t\t\t\t\t\t  <option value=\"6\" {if($data['orderstype']==6)}selected{/if}>{fun JZLANG('点击量倒序')}</option>\n\t\t\t\t\t\t  <option value=\"7\" {if($data['orderstype']==7)}selected{/if}>{fun JZLANG('时间正序')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t  <span class=\"x-red\">{fun JZLANG('默认不需要更改')}</span>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>\n\t\t  \n\t\t  <div class=\"layui-form-item\">\n              <label for=\"htmlurl\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('URL命名')}\n              </label>\n              <div class=\"layui-input-block\">\n                  <input type=\"text\" placeholder=\"{fun JZLANG('请填写完整文件名，如:index，不填请留空')}\" style=\"width:350px\"  id=\"htmlurl\" name=\"htmlurl\" value=\"{$data['htmlurl']}\" autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG('填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：')}{fun get_domain()}/news.html。{fun JZLANG('多个相同URL，将覆盖前面的栏目')}\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"lists_num\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('列表显示')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"number\" id=\"lists_num\" name=\"lists_num\" \n                  autocomplete=\"off\" value=\"{$data['lists_num']}\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  {fun JZLANG('设置列表页显示的内容条数')}\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"lists_html\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('栏目模板')}\n              </label>\n              <div  style=\"width:350px\"  class=\"layui-input-inline\">\n                 <select name=\"lists_html\" lay-search=\"\" id=\"lists_html\"  >\n              \t </select>\n              </div>\n\t\t\t   <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"lists_html_write\" name=\"lists_html_write\" placeholder=\"{fun JZLANG('手动填写，不填请留空')}\" value=\"{$data['lists_html']}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                 {fun JZLANG('请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页')}\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"details_html\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('详情页模板')}\n              </label>\n              <div  style=\"width:350px\"  class=\"layui-input-inline\">\n                  <select name=\"details_html\" lay-search=\"\" id=\"details_html\"  >\n              \t  </select>\n              </div>\n\t\t\t  <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"details_html_write\" name=\"details_html_write\" placeholder=\"{fun JZLANG('手动填写，不填请留空')}\" value=\"{$data['details_html']}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                 {fun JZLANG('请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。')}\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"gourl\" class=\"layui-form-label\">\n                  <span class=\"x-red\"></span>{fun JZLANG('栏目外链')}\n              </label>\n              <div class=\"layui-input-block\">\n                  <input type=\"text\" placeholder=\"{fun JZLANG('栏目外链，如:htt://xxx.com/abc，不填请留空')}\" style=\"width:350px\"  id=\"gourl\" name=\"gourl\" value=\"{$data['gourl']}\" autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n               {fun JZLANG('填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！')}\n              </div>\n          </div>\n\t\t  <div class=\"layui-form-item\" pane>\n\t\t\t\t<label for=\"ishome\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('发布显示')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['ishome']==0)}checked{/if}>\n\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['ishome']==1)}checked{/if}>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t {fun JZLANG('勾选后，前台会员发布会显示该栏目')}\n\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t</div>\n\t\t  <div class=\"layui-form-item\" pane>\n\t\t\t\t<label for=\"isshow\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('导航显示')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['isshow']==0)}checked{/if}>\n\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['isshow']==1)}checked{/if}>\n\t\t\t\t</div>\n\t\t\t\t \n\t\t\t\t\n\t\t  </div>\n\t\t\t\n\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t<label for=\"iscover\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('模板覆盖')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t<input type=\"radio\" name=\"iscover\" value=\"0\" title=\"{fun JZLANG('不覆盖')}\" checked>\n\t\t\t\t\t<input type=\"radio\" name=\"iscover\" value=\"1\" title=\"{fun JZLANG('覆盖')}\" >\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG(' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。')}\n                </div>\n\t\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t<label for=\"gid\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('访问限制')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t{php\n\t\t\t\t$gids = explode(',',$data['gids']);\n\t\t\t\t/}\n\t\t\t\t\t{loop table=\"member_group\" as=\"v\"}\n\t\t\t\t   <input type=\"checkbox\" {if(in_array($v['id'],$gids))}checked{/if} value=\"{$v['id']}\" name=\"gids[]\" title=\"{$v['name']}\">\n\t\t\t\t   {/loop}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"isclose\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否关闭')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isclose\" value=\"1\" title=\"{fun JZLANG('关闭')}\"  {if($data['isclose']==1)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isclose\" value=\"0\" title=\"{fun JZLANG('开启')}\"  {if($data['isclose']==0)}checked{/if}>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t {fun JZLANG('栏目关闭后，前台不显示，也无法访问！')}\n\t\t\t\t\t</div>\n\t\t\t</div>\t\t\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t</div>\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <input type=\"hidden\" id=\"id\" name=\"id\" value=\"{$data['id']}\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('修改')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\t{include=\"fields\"}\n\t\n\t\t\n\t\tfunction deleteImage(elm){\n\t\t\t$(elm).prev().attr(\"src\", \"{__Tpl_style__}/style/images/nopic.jpg\");\n\t\t\t$('#litpic').val(\"\");\n\t\t}\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n\t\t\tform.render();\n\t\t//图片上传接口\n\t\t  upload.render({\n\t\t\telem: '#litpic_upload',\n\t\t\turl: \"{fun U('Common/uploads')}\" //上传接口\n\t\t\t,done: function(res){ //上传成功后的回调\n\t\t\t \n\t\t\t\tif(res.code==0){\n\t\t\t\t\t $('#litpic_img').attr('src',res.url);\n\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t}else{\n\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t}\n\t\t\t \n\t\t\t}\n\t\t  });\n\n\t\t  //图库按钮点击事件\n\t\t  $(\"#litpic_gallery\").on(\"click\", function(){\n\t\t\t  var galleryLayer = layer.open({\n\t\t\t\t  type: 1,\n\t\t\t\t  title: \"{fun JZLANG('选择图片')}\",\n\t\t\t\t  area: [\"80%\", \"80%\"],\n\t\t\t\t  content: `<div class=\"gallery-container\" style=\"padding: 15px;\">\n\t\t\t\t\t  <div class=\"gallery-header\" style=\"margin-bottom: 15px;\">\n\t\t\t\t\t\t  <div class=\"layui-btn-group\">\n\t\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_prev_litpic\">{fun JZLANG('上一页')}</button>\n\t\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary\" id=\"gallery_next_litpic\">{fun JZLANG('下一页')}</button>\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t  <span id=\"gallery_page_info_litpic\" style=\"margin-left: 15px;\"></span>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div id=\"gallery_list_litpic\" class=\"gallery-list\" style=\"min-height: 400px; display: flex; flex-wrap: wrap; gap: 10px;\"></div>\n\t\t\t\t\t  <div class=\"gallery-footer\" style=\"margin-top: 15px; text-align: center;\">\n\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn\" id=\"gallery_confirm_litpic\">{fun JZLANG('确定')}</button>\n\t\t\t\t\t\t  <button type=\"button\" class=\"layui-btn layui-btn-primary\" onclick=\"layer.closeAll();\">{fun JZLANG('取消')}</button>\n\t\t\t\t\t  </div>\n\t\t\t\t  </div>`,\n\t\t\t\t  success: function(layero, index){\n\t\t\t\t\t  var currentPage = 1;\n\t\t\t\t\t  var pageSize = 12;\n\t\t\t\t\t  var selectedImages = [];\n\t\t\t\t\t  var totalCount = 0;\n\t\t\t\t\t  \n\t\t\t\t\t  //加载图片列表\n\t\t\t\t\t  function loadGallery(page){\n\t\t\t\t\t\t  $.ajax({\n\t\t\t\t\t\t\t  url: \"{fun U('Sys/pictures')}\",\n\t\t\t\t\t\t\t  type: \"GET\",\n\t\t\t\t\t\t\t  data: {ajax: 1, page: page, pageSize: pageSize},\n\t\t\t\t\t\t\t  dataType: \"json\",\n\t\t\t\t\t\t\t  success: function(res){\n\t\t\t\t\t\t\t\t  if(res.code == 0){\n\t\t\t\t\t\t\t\t\t  var html = \"\";\n\t\t\t\t\t\t\t\t\t  if(res.data.length > 0){\n\t\t\t\t\t\t\t\t\t\t$.each(res.data, function(i, item){\n\t\t\t\t\t\t\t\t\t\t\tvar ext = item.filetype.split('.').pop().toLowerCase();\n\t\t\t\t\t\t\t\t\t\t\tvar imageExts = [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\", \"svg\"];\n\t\t\t\t\t\t\t\t\t\t\tvar isImage = imageExts.includes(ext);\n\t\t\t\t\t\t\t\t\t\t\tvar contentHtml = \"\";\n\t\t\t\t\t\t\t\t\t\t\tif(isImage){\n\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<img src=\"${item.litpic}\" style=\"width: 100%; height: 100%; object-fit: cover;\">`;\n\t\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\tcontentHtml = `<div style=\"width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; background: #f5f5f5; padding: 10px;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"font-size: 40px; color: #999;\">&#xe61e;</i>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span style=\"font-size: 12px; color: #666; margin-top: 8px; word-break: break-all; text-align: center;\">${item.fileName}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>`;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\thtml += `<div class=\"gallery-item\" data-id=\"`+item.id+`\" data-url=\"`+item.litpic+`\" style=\"width: 140px; height: 140px; border: 2px solid #e6e6e6; border-radius: 4px; cursor: pointer; position: relative; overflow: hidden;\">\n\t\t\t\t\t\t\t\t\t\t\t\t`+contentHtml+\n\t\t\t\t\t\t\t\t\t\t\t\t`<div class=\"gallery-item-info\" style=\"position: absolute; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,0.6); color: #fff; padding: 5px; font-size: 12px; display: none;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t${item.fileName}<br>${item.size}kb\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"gallery-item-check\" style=\"position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; border-radius: 50%; border: 2px solid #fff; background: rgba(0,0,0,0.5); display: none;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon\" style=\"color: #fff; font-size: 14px; line-height: 16px;\">&#xe605;</i>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>`;\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t$(\"#gallery_list_litpic\").html(html);\n\t\t\t\t\t\t\t\t\t\ttotalCount = res.count;\n\t\t\t\t\t\t\t\t\t\tvar totalPages = Math.ceil(totalCount / pageSize);\n\t\t\t\t\t\t\t\t\t\t$(\"#gallery_page_info_litpic\").text(\"第\"+page+\"页 / 共\"+totalPages+\"页\");\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t  //图片悬停事件\n\t\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_litpic .gallery-item\").hover(\n\t\t\t\t\t\t\t\t\t\t\t  function(){\n\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-info\").show();\n\t\t\t\t\t\t\t\t\t\t\t  },\n\t\t\t\t\t\t\t\t\t\t\t  function(){\n\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-info\").hide();\n\t\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t  );\n\t\t\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t\t\t\t  //图片点击事件\n\t\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_litpic .gallery-item\").on(\"click\", function(){\n\t\t\t\t\t\t\t\t\t\t\t  var url = $(this).data(\"url\");\n\t\t\t\t\t\t\t\t\t\t\t  var id = $(this).data(\"id\");\n\t\t\t\t\t\t\t\t\t\t\t  var index = selectedImages.indexOf(url);\n\t\t\t\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t\t\t\t\t  if(index > -1){\n\t\t\t\t\t\t\t\t\t\t\t\t  selectedImages.splice(index, 1);\n\t\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#e6e6e6\");\n\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").hide();\n\t\t\t\t\t\t\t\t\t\t\t  }else{\n\t\t\t\t\t\t\t\t\t\t\t\t  selectedImages.push(url);\n\t\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#1E9FFF\");\n\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").show();\n\t\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t\t\t\t  //恢复已选中的图片\n\t\t\t\t\t\t\t\t\t\t  $(\"#gallery_list_litpic .gallery-item\").each(function(){\n\t\t\t\t\t\t\t\t\t\t\t  var url = $(this).data(\"url\");\n\t\t\t\t\t\t\t\t\t\t\t  if(selectedImages.indexOf(url) > -1){\n\t\t\t\t\t\t\t\t\t\t\t\t  $(this).css(\"border-color\", \"#1E9FFF\");\n\t\t\t\t\t\t\t\t\t\t\t\t  $(this).find(\".gallery-item-check\").show();\n\t\t\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t $(\"#gallery_list_litpic\").html(`<div style=\"width: 100%; text-align: center; padding: 50px; color: #999;\">{fun JZLANG('暂无图片')}</div>`);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t error: function(){\n\t\t\t\t\t\t\t\t\t\t layer.alert(\"{fun JZLANG('请求失败')}\", {icon: 5});\n\t\t\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t  }\n\t\t\t\t\t  \n\t\t\t\t\t\t  //上一页\n\t\t\t\t\t  $(\"#gallery_prev_litpic\").on(\"click\", function(){\n\t\t\t\t\t\t  if(currentPage > 1){\n\t\t\t\t\t\t\t  currentPage--;\n\t\t\t\t\t\t\t  loadGallery(currentPage);\n\t\t\t\t\t\t  }\n\t\t\t\t\t  });\n\t\t\t\t\t  \n\t\t\t\t\t  //下一页\n\t\t\t\t\t  $(\"#gallery_next_litpic\").on(\"click\", function(){\n\t\t\t\t\t\t  var totalPages = Math.ceil(totalCount / pageSize);\n\t\t\t\t\t\t  if(currentPage < totalPages){\n\t\t\t\t\t\t\t  currentPage++;\n\t\t\t\t\t\t\t  loadGallery(currentPage);\n\t\t\t\t\t\t  }\n\t\t\t\t\t  });\n\t\t\t\t\t  \n\t\t\t\t\t  //确定按钮\n\t\t\t\t\t  $(\"#gallery_confirm_litpic\").on(\"click\", function(){\n\t\t\t\t\t\t  if(selectedImages.length > 0){\n\t\t\t\t\t\t\t  $(\"#litpic\").val(selectedImages.join(\",\"));\n\t\t\t\t\t\t\t  $(\"#litpic_img\").attr(\"src\", selectedImages[0]);\n\t\t\t\t\t\t\t  layer.closeAll();\n\t\t\t\t\t\t  }else{\n\t\t\t\t\t\t\t  layer.alert(\"{fun JZLANG('请选择至少一张图片')}\", {icon: 5});\n\t\t\t\t\t\t  }\n\t\t\t\t\t  });\n\t\t\t\t  \n\t\t\t\t  //初始加载\n\t\t\t\t  loadGallery(currentPage);\n\t\t\t\t  }\n\t\t\t  });\n\t\t  });\n\t \n\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t$.post('{fun U('Classtype/editclass')}',data.field,function(r){\n\t\t\t\n\t\t\t\t\n\t\t\t\tr = JSON.parse(r);\n\t\t\t\t\n\t\t\t\tif(r.status==0){\n\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t  icon:5\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\n\t\t\t\t\tlayer.confirm('{fun JZLANG('修改成功！')}', {\n\t\t\t\t\t  btn: ['{fun JZLANG('返回列表')}','{fun JZLANG('取消')}'] //按钮\n\t\t\t\t\t}, function(){\n\t\t\t\t\t  // 获得frame索引\n\t\t\t\t\t  {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t   window.location.href=\"{fun U('Classtype/index')}\";\n\t\t\t\t\t  {else}\n\t\t\t\t\t   parent.location.reload();\n\t\t\t\t\t \n\t\t\t\t\t  {/if}\n\t\t\t\t\t  \n\t\t\t\t\t}, function(){\n\t\t\t\t\t  \n\t\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn false;\n          });\n\t\t\t\n\t\t\tget_fields({$data['id']},{$data['id']});\n            get_fields_ext({$data['id']},{$data['id']});\n\t\t\tform.on('select(pid)', function(data){\n\t\t\t  var alldata = form.val(\"jizhiform\");\n\t\t\t  localStorage.setItem('cachedata', JSON.stringify(alldata));\n\t\t\t  get_fields(data.value,{$data['id']}); \n\t\t\t  get_fields_ext(data.value,{$data['id']});\n\t\t\t  \n\t\t\t  \n\t\t\t});\n\t\t\t$(\"#resetdata\").click(function(){\n\t\t\t\tvar alldata = localStorage.getItem('cachedata');\n\t\t\t\tif(alldata!=''){\n\t\t\t\t\tform.val(\"jizhiform\",JSON.parse(alldata));\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tform.on('select(molds)', function(data){\n\t\t\t  \n\t\t\t get_molds_html($(\"#molds\").val());\n\t\t\t form.render('select');\n\t\t\t  \n\t\t\t});\n\t\t\t\n          \n        });\n\n        function get_molds_html(molds){\n        \t$.ajax({\n\t\t\t\t url:\"{fun U('Classtype/get_html')}\",//请求的url地址\n\t\t\t\t dataType:\"json\",//返回格式为json\n\t\t\t\t async:false,\n\t\t\t\t data:{molds:molds},//参数值\n\t\t\t\t type:\"POST\",//请求方式\n\t\t\t\t beforeSend:function(){\n\t\t\t\t\t//请求前的处理\n\t\t\t\t\t},\n\t\t\t\t\t success:function(r){\n\t\t\t\t\t \tvar t = '<option value=\"\">{fun JZLANG('请选择模板页面/使用自定义')}</option>';var tt = '<option value=\"\">{fun JZLANG('请选择模板页面/使用自定义')}</option>';\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\tvar len = r.data.length;\n\t\t\t\t\t\t\tif(len>0){\n\t\t\t\t\t\t\t\tvar lists_html = \"{$data['lists_html']}\";\n\t\t\t\t\t\t\t\tvar details_html = \"{$data['details_html']}\";\n\t\t\t\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\t\t\t\tif(lists_html==r.data[i].value){\n\t\t\t\t\t\t\t\t\t\tt+='<option value=\"'+r.data[i].value+'\" selected>'+r.data[i].html+'</option>';\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\tt+='<option value=\"'+r.data[i].value+'\">'+r.data[i].html+'</option>';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\t\t\t\tif(details_html==r.data[i].value){\n\t\t\t\t\t\t\t\t\t\ttt+='<option value=\"'+r.data[i].value+'\" selected>'+r.data[i].html+'</option>';\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\ttt+='<option value=\"'+r.data[i].value+'\">'+r.data[i].html+'</option>';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(\"#lists_html\").html(t);\n\t\t\t\t\t\t$(\"#details_html\").html(tt);\n\t\t\t\t\t\t layui.use(['form'], function(){\n\t\t\t\t\t\t\tvar form = layui.form;\n\t\t\t\t\t\t\tform.render('select');\n\t\t\t\t\t\t })\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\t\t\t\t\t complete:function(){\n\t\t\t\t\t//请求完成的处理\n\t\t\t\t\t},\n\t\t\t\t\t error:function(){\n\t\t\t\t\t//请求出错处理\n\t\t\t\t\t}\n\n\t\t\t})\n        \t}\n\n\n        $(document).ready(function(){\n\n        \t\n        \tget_molds_html($(\"#molds\").val());\n        })\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/classtype-list.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t{include=\"style\"}\n\n</head>\n\n<body>\n<div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a>{fun JZLANG('首页')}</a>\n        <a>{$molds['name']}{fun JZLANG('管理')}</a>\n        <a><cite>{$molds['name']}{fun JZLANG('列表')}</cite></a>\n      </span>\n\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n\t\t<i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n</div>\n<div class=\"x-body\">\n\n\t<div class=\"layui-card\">\n\t\t<div class=\"layui-card-body\">\n\t\t\t<form class=\"layui-form\" action=\"\">\n\t\t\t\t<xblock>\n\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t{if(checkAction('Classtype/changeClass'))}\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t<select name=\"tid\" lay-filter=\"tid\" lay-search=\"\" class=\"layui-inline autosubmit layui-btn-sm\">\n\t\t\t\t\t\t\t\t<option value=\"\">{fun JZLANG('请选择栏目')}</option>\n\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('顶级')}</option>\n\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\n\t\t\t\t\t\t\t\t<option {if($tid==$v['id'])} selected=\"selected\" {/if}value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])} {$v['classname']}</option>\n\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{if(checkAction('Classtype/addclass'))}\n\t\t\t\t\t\t<div class=\"layui-input-inline\"  style=\"width:auto;\">\n\t\t\t\t\t\t\t<a class=\"layui-btn layui-btn-sm\"  onclick=\"x_admin_show('{fun JZLANG('新增')}','{fun U('Classtype/addclass')}')\" >{fun JZLANG('新增')}</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{if(checkAction('Classtype/addmany'))}\n\t\t\t\t\t\t<div class=\"layui-input-inline\"  style=\"width:auto;\">\n\t\t\t\t\t\t\t<a class=\"layui-btn layui-btn-sm\"  onclick=\"x_admin_show('{fun JZLANG('批量新增')}','{fun U('Classtype/addmany')}')\" >{fun JZLANG('批量新增')}</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\n\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<span class=\"x-right\" style=\"line-height:40px\"></span>\n\t\t\t\t</xblock>\n\t\t\t\t<div class=\"row\" style=\"overflow-x: auto;\">\n\t\t\t\t\t<table border=\"1\" rules=\"all\" style=\"width:100%; height:100px; white-space:nowrap\" class=\"layui-table layui-form\">\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>\n\t\t\t\t\t\t\t\t<div class=\"layui-unselect header layui-form-checkbox\" lay-skin=\"primary\"><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th width=\"70\">ID</th>\n\t\t\t\t\t\t\t<th width=\"50\">{fun JZLANG('排序')}</th>\n\n\t\t\t\t\t\t\t<th >{$molds['name']}</th>\n\t\t\t\t\t\t\t<th width=\"100\">{fun JZLANG('模块名')}</th>\n\t\t\t\t\t\t\t<th width=\"100\">{fun JZLANG('导航显示')}</th>\n\t\t\t\t\t\t\t<th >{fun JZLANG('快捷操作')}</th>\n\t\t\t\t\t\t\t<th >{fun JZLANG('操作')}</th>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody class=\"x-cate\">\n\t\t\t\t\t\t{loop table=\"classtype\" pid=\"0\" orderby=\"orders desc\" as=\"v\"}\n\t\t\t\t\t\t<tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\" {if($v['pid']!=0)}style=\"display:none;\"{/if}>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div class=\"layui-unselect layui-form-checkbox\" lay-skin=\"primary\" data-id=\"{$v['id']}\"><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>{$v['id']}</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t{if(checkAction('Classtype/editClassOrders'))}\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input x-sort\"  name=\"order\" value=\"{$v['orders']}\">\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t{$v['orders']}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</td>\n\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t{fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n\t\t\t\t\t\t\t{if($classtypedata[$v['id']]['haschild'])}\n\t\t\t\t\t\t\t<i class=\"layui-icon x-show\" onclick=\"getchildren({$v['id']},this)\" status=\"true\">&#xe623;</i>\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t{if($v['level'])}|——{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{$v['classname']}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>{$moldslist[$v['molds']]['name']}</td>\n\t\t\t\t\t\t{if($admin['classcontrol']==0 ||$admin['isadmin'] || strpos($tids,','.$v['id'].',')!==false)}\n\t\t\t\t\t\t<td class=\"td-status\" >\n\t\t\t\t\t\t\t{if($v['isclose']==0)}\n\t\t\t\t\t\t\t{if(checkAction('Classtype/change_status'))}\n\t\t\t\t\t\t\t<input type=\"checkbox\" value=\"{$v['id']}\" name=\"switch\" lay-filter=\"status\"   lay-text=\"{fun JZLANG('显示|隐藏')}\"  lay-skin=\"switch\" {if($v['isshow']==1)}checked{/if}>\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t{if($v['isshow']==1)}\n\t\t\t\t\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('显示')}</span>\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t<span class=\"layui-badge\">{fun JZLANG('隐藏')}</span>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t已关闭\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</td>\n\n\t\t\t\t\t\t<td class=\"td-manage\">\n\t\t\t\t\t\t\t{if(checkAction('Classtype/addclass'))}\n\t\t\t\t\t\t\t<a  class=\"layui-btn layui-btn-warm layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('添加下级')}','{fun U('Classtype/addclass',array('pid'=>$v['id'],'biaoshi'=>$v['molds']))}')\" >{fun JZLANG('添加下级')}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if(checkAction('Fields/index'))}\n\t\t\t\t\t\t\t<a class=\"layui-btn layui-btn-normal layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('字段管理')}','{fun U('Fields/index',array('molds'=>$v['molds']))}')\" >{fun JZLANG('字段管理')}</a>\n\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t{if($v['molds']=='article')}\n\t\t\t\t\t\t\t{if(checkAction('Article/addarticle'))}\n\t\t\t\t\t\t\t<a  class=\"layui-btn  layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('新增文章')}','{fun U('Article/addarticle',['tid'=>$v['id']])}')\" >{fun JZLANG('新增文章')}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{else if($v['molds']=='product')}\n\t\t\t\t\t\t\t{if(checkAction('Product/addproduct'))}\n\t\t\t\t\t\t\t<a  class=\"layui-btn  layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('新增商品')}','{fun U('Product/addproduct',['tid'=>$v['id']])}')\" >{fun JZLANG('新增商品')}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t{if($v['molds']!='message' && $v['molds']!='page')}\n\t\t\t\t\t\t\t{if(checkAction('Extmolds/addmolds/molds/'.$v['molds']))}\n\t\t\t\t\t\t\t<a  class=\"layui-btn  layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('新增内容')}','{fun U('Extmolds/addmolds',array('molds'=>$v['molds'],'tid'=>$v['id']))}')\" >{fun JZLANG('新增内容')}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td class=\"td-manage\">\n\t\t\t\t\t\t\t{if(checkAction('Classtype/editclass'))}\n\t\t\t\t\t\t\t<a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Classtype/editclass',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t<a href=\"{$classtypedata[$v['id']]['url']}\" class=\"layui-btn layui-btn-normal layui-btn layui-btn-xs\"  target=\"_blank\">{fun JZLANG('预览')}</a>\n\t\t\t\t\t\t\t{if(checkAction('Classtype/deleteclass'))}\n\t\t\t\t\t\t\t<a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"member_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<td class=\"td-status\" >\n\t\t\t\t\t\t\t{if($v['isshow']==1)}\n\t\t\t\t\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('显示')}</span>\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t<span class=\"layui-badge\">{fun JZLANG('隐藏')}</span>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td class=\"td-manage\">-</td>\n\t\t\t\t\t\t<td class=\"td-manage\">-</td>\n\n\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t{/loop}\n\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n\t<input type=\"hidden\" value=\"\" id=\"changeids\">\n\n</div>\n<style type=\"text/css\">\n\n</style>\n<script>\n\tlayui.use(['form'], function(){\n\t\tform = layui.form;\n\t\tform.on('switch(status)', function (data) {\n\t\t\t$.post(\"{fun U('change_status')}\",{id:data.elem.value},function(r){ });\n\t\t});\n\t\tform.on('switch(type)', function(data){\n\t\t\tif(!data.elem.checked){\n\t\t\t\t$(\".x-cate tr\").each(function(){\n\t\t\t\t\tif($(this).attr('fid')!=0){\n\t\t\t\t\t\t$(this).css('display','none');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t$(\".x-show\").attr('status','true').html('&#xe623;');\n\t\t\t}else{\n\n\t\t\t\t$(\".x-cate tr\").each(function(){\n\t\t\t\t\tif($(this).attr('fid')!=0){\n\t\t\t\t\t\t$(this).css('display','table-row');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t$(\".x-show\").attr('status','false').html('&#xe625;');\n\t\t\t}\n\t\t});\n\t\tform.on('select(tid)',function(data){\n\t\t\tif(data.value!=''){\n\t\t\t\tvar tids = tableCheck.getData().join(',');\n\t\t\t\tif(tids==''){\n\t\t\t\t\tlayer.alert('{fun JZLANG('请选择对象')}！');return false;\n\t\t\t\t}\n\t\t\t\t$.post('{fun U('Classtype/changeClass')}',{pid:data.value,tids:tids},function(r){\n\t\t\t\t\tconsole.log(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('操作成功！')}', {\n\t\t\t\t\t\t\ttime:1000,icon:6\n\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t})\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg);\n\t\t\t\t\t}\n\n\n\t\t\t\t},'json');\n\n\n\t\t\t}\n\t\t\treturn false;\n\t\t})\n\n\t});\n\n\t$(document).ready(function(){\n\n\t\t$(document).on(\"change\",\".x-sort\",function(){\n\t\t\tvar id = $(this).parent().parent().attr('cate-id');\n\t\t\tvar order = $(this).val();\n\n\t\t\t$.post('{fun U('Classtype/editClassOrders')}',{id:id,orders:order},function(r){\n\t\t\t\twindow.location.reload();\n\t\t\t});\n\t\t})\n\n\t});\n\n\n\tfunction getchildren(id,t){\n\n\t\t//layer.alert(id)\n\n\t\tvar status = $(t).attr('status');\n\t\tvar ids = $(\"#changeids\").val()\n\t\tvar ids_arr = ids!='' ? ids.split(',') : []\n\t\tid = id+''\n\t\tconsole.log(status)\n\t\tif(status=='true' && ids_arr.indexOf(id)==-1){\n\t\t\tvar index = layer.load();\n\t\t\t$.post('{fun U('Classtype/getchildren')}',{id:id},function(res){\n\t\t\t\tlayer.close(index);\n\t\t\t\t$(t).parent().parent().after(res)\n\t\t\t\tids_arr.push(id)\n\t\t\t\t$(\"#changeids\").val(ids_arr.join(','))\n\t\t\t\tlayui.use(['form'], function(){\n\t\t\t\t\tform = layui.form;\n\t\t\t\t\tform.render()\n\t\t\t\t})\n\t\t\t})\n\n\t\t}\n\n\n\t}\n\n\t/*用户-删除*/\n\tfunction member_del(obj,id){\n\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t//发异步删除数据\n\t\t\t$.post('{fun U('Classtype/deleteclass')}',{id:id},function(r){\n\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\tif(r.status==0){\n\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\ticon:5\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\tlayer.msg('{fun JZLANG('删除成功！')}', {\n\t\t\t\t\t\ttime:1000,icon:6\n\t\t\t\t\t},function(){\n\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('已删除!')}',{icon:1,time:1000});\n\t\t\t\t\t});\n\n\t\t\t\t}\n\n\t\t\t});\n\n\n\n\n\t\t});\n\t}\n\n\n\n\tfunction delAll (argument) {\n\n\t\tvar data = tableCheck.getData();\n\n\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t//捉到所有被选中的，发异步进行删除\n\t\t\tlayer.msg('{fun JZLANG('删除成功')}', {icon: 1});\n\t\t\t$(\".layui-form-checked\").not('.header').parents('tr').remove();\n\t\t});\n\t}\n</script>\n\n</body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/collect-add.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展管理')}</cite></a>\n             \n\t\t\t <a><cite>{fun JZLANG('新增轮播图')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"title\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('标题')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"title\" value=\"\" style=\"width:500px;\" name=\"title\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('所属分类')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-filter=\"tid\" lay-search=\"\" id=\"tid\" >\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t   {foreach $collect_type as $v}\n\t\t\t\t\t   <option {if($tid==$v['id'])}selected{/if}  value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t   </select>\n                    </div>\n                </div>\n\t\t\t\t \n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"litpic\" class=\"layui-form-label\">\n\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('图片')}\n                    </label>\n                    \n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<input name=\"litpic\" placeholder=\"{fun JZLANG('上传图片')}\" type=\"text\" class=\"layui-input\" id=\"litpic\"  value=\"\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<button class=\"layui-btn layui-btn-primary\" id=\"litpic_upload\" type=\"button\" >{fun JZLANG('选择图片')}</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<img id=\"litpic_img\" class=\"img-responsive img-thumbnail\" style=\"max-width: 200px;\" src=\"\" onerror=\"javascipt:this.src='{__Tpl_style__}/style/images/nopic.jpg'; this.title='{fun JZLANG('图片未找到')}';this.onerror=''\">\n\t\t\t\t\t\t<button type=\"button\" onclick=\"deleteImage(this)\" class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger \" title=\"{fun JZLANG('删除这张图片')}\" >{fun JZLANG('删除')}</button>\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"h\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('图片高')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\"  placeholder=\"{fun JZLANG('0表示不限制')}\" value=\"0\" style=\"width:500px;\" name=\"h\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"w\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('图片宽')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\"  placeholder=\"{fun JZLANG('0表示不限制')}\" value=\"0\" style=\"width:500px;\" name=\"w\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"url\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('跳转链接')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"url\" placeholder=\"{fun JZLANG('不填请留空')}\" value=\"\" style=\"width:500px;\" name=\"url\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n                        <label for=\"description\" class=\"layui-form-label\">\n                            <span class=\"x-red\"></span>{fun JZLANG('简介')}\n                        </label>\n                        <div class=\"layui-input-block\">\n                            <textarea  name=\"description\" class=\"layui-textarea\"></textarea>\n                        </div>\n                </div>\n\t\t\t\t\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"orders\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('排序')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"orders\" value=\"0\" name=\"orders\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('数字越大越靠前')}\n\t\t\t\t  </div>\n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否显示')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('不显示')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"addtime\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('添加时间')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                      <input class=\"layui-input\" value=\"{fun date('Y-m-d H:i:s')}\" name=\"addtime\" placeholder=\"{fun JZLANG('选择时间')}\" id=\"LAY_demorange_s\">\n                    </div>\n                   \n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t<!--end tab1-->\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\t\t\t\t\t\t\n               \n                \n                <div class=\"layui-form-item\"   style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n\t\tfunction deleteImage(elm){\n\t\t\t$(elm).prev().attr(\"src\", \"{__Tpl_style__}/style/images/nopic.jpg\");\n\t\t\t$('#litpic').val(\"\");\n\t\t}\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t \n\t\t\t  laydate.render({\n\t\t\t\telem: '#LAY_demorange_s', //指定元素\n\t\t\t\ttype:'datetime'\n\t\t\t  });\n\t\t\t  var upload = layui.upload;\n\t\t\t  \n             //图片上传接口\n              upload.render({\n\t\t\t    elem: '#litpic_upload',\n                url: \"{fun U('Common/uploads')}\" //上传接口\n                ,data:{tid:function(){ return $(\"#tid\").val();},molds:'collect'}\n                ,done: function(res){ //上传成功后的回调\n                 \n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\t $('#litpic_img').attr('src',res.url);\n\t\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t\t}\n                 \n                }\n              });\n\t\t\t  \n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\t$.post(\"{fun U('addcollect')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('Collect/index')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t  \n\t\t\t\tget_fields(0);\n\t\t\t\tget_fields_ext(0);\n            \n\t\t\t\n\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/collect-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展管理')}</cite></a>\n             \n\t\t\t <a><cite>{fun JZLANG('修改轮播图')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"title\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('标题')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"title\" value=\"{$data['title']}\" style=\"width:500px;\"  name=\"title\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('所属分类')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" id=\"tid\" lay-search=\"\" >\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('选择分类')}</option>\n\t\t\t\t\t   {foreach $collect_type as $v}\n\t\t\t\t\t   <option {if($data['tid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t   </select>\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n                        <label for=\"description\" class=\"layui-form-label\">\n                            <span class=\"x-red\"></span>{fun JZLANG('简介')}\n                        </label>\n                        <div class=\"layui-input-block\">\n                            <textarea  name=\"description\" class=\"layui-textarea\">{$data['description']}</textarea>\n                        </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"litpic\" class=\"layui-form-label\">\n\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('图片')}\n                    </label>\n                    \n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<input name=\"litpic\" placeholder=\"{fun JZLANG('上传图片')}\" type=\"text\" class=\"layui-input\" id=\"litpic\"  value=\"{$data['litpic']}\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<button class=\"layui-btn layui-btn-primary\" id=\"litpic_upload\" type=\"button\" >{fun JZLANG('选择图片')}</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<img id=\"litpic_img\" class=\"img-responsive img-thumbnail\" style=\"max-width: 200px;\" src=\"{$data['litpic']}\" onerror=\"javascipt:this.src='{__Tpl_style__}/style/images/nopic.jpg'; this.title='{fun JZLANG('图片未找到')}';this.onerror=''\">\n\t\t\t\t\t\t<button type=\"button\" onclick=\"deleteImage(this)\" class=\"layui-btn layui-btn-sm layui-btn-radius layui-btn-danger \" title=\"{fun JZLANG('删除这张图片')}\" >{fun JZLANG('删除')}</button>\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"h\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('图片高')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\"  placeholder=\"{fun JZLANG('0表示不限制')}\" value=\"{$data['h']}\" style=\"width:500px;\" name=\"h\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"w\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('图片宽')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\"  placeholder=\"{fun JZLANG('0表示不限制')}\" value=\"{$data['w']}\" style=\"width:500px;\" name=\"w\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"url\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('跳转链接')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"url\" value=\"{$data['url']}\" style=\"width:500px;\"  name=\"url\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"orders\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('排序')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"orders\" value=\"{$data['orders']}\" name=\"orders\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('数字越大越靠前')}\n\t\t\t\t  </div>\n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否显示')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['isshow']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['isshow']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"addtime\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('更新时间')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                      <input class=\"layui-input\" value=\"{if($data)}{fun date('Y-m-d H:i:s',$data['addtime'])}{else}{fun date('Y-m-d H:i:s')}{/if}\" name=\"addtime\" placeholder=\"{fun JZLANG('选择时间')}\" id=\"LAY_demorange_s\">\n                    </div>\n                   \n                </div>\n\t\t\t\t\n\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t\t</div>\n               \n                <div class=\"layui-form-item\" style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t\t{include=\"fields\"}\n\t\t\tfunction deleteImage(elm){\n\t\t\t\t$(elm).prev().attr(\"src\", \"{__Tpl_style__}/style/images/nopic.jpg\");\n\t\t\t\t$('#litpic').val(\"\");\n\t\t\t}\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer,laydate = layui.laydate;\n\t\t\n\t\t\t  laydate.render({\n\t\t\t\telem: '#LAY_demorange_s', //指定元素\n\t\t\t\ttype:'datetime'\n\t\t\t  });\n\t\t\t  var upload = layui.upload;\n\t\t\t\n              //图片上传接口\n              upload.render({\n\t\t\t    elem: '#litpic_upload',\n                url: \"{fun U('Common/uploads')}\" //上传接口\n                ,data:{tid:function(){ return $(\"#tid\").val();},molds:'collect'}\n                ,done: function(res){ //上传成功后的回调\n                 \n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\t $('#litpic_img').attr('src',res.url);\n\t\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t\t}\n                 \n                }\n              });\n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                \n\t\t\t\t$.post(\"{fun U('editcollect')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('Collect/index')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            get_fields(0,{$data['id']});\n            get_fields_ext(0,{$data['id']});\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/collect-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展管理')}</cite></a>\n              <a><cite>{fun JZLANG('轮播图列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        <div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t    <div class=\"layui-collapse\">\n\t\t\t  <div class=\"layui-colla-item\">\n\t\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"tid\" lay-filter=\"tid\" lay-search=\"\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('请选择分类')}</option>\n\t\t\t\t\t   {foreach $collect_type as $v}\n\t\t\t\t\t   <option {if($tid==$v['id'])} selected=\"selected\" {/if}value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t  <input type=\"text\" name=\"title\" value=\"{$title}\" placeholder=\"{fun JZLANG('请输入标题')}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  {$fields_search}\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"sreach\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t    </div>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t\t</div>\n\n          <xblock>\n\t\t  {if(checkAction('Collect/deleteAll'))}\n\t\t  <a class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t  {/if}\n\t\t  {if(checkAction('Collect/addcollect'))}\n\t\t  <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增图片')}','{fun U('Collect/addcollect')}')\">{fun JZLANG('新增图片')}</a>\n\t\t  {/if}\n\t\t  {if(checkAction('Collect/collectType'))}\n\t\t  <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('分类列表')}','{fun U('Collect/collectType')}')\">{fun JZLANG('分类列表')}</a>\n\t\t  {/if}\n\t\t  {if(checkAction('Collect/collectTypeAdd'))}\n\t\t\t<a class=\"layui-btn layui-btn-sm\"  onclick=\"x_admin_show('{fun JZLANG('添加分类')}','{fun U('Collect/collectTypeAdd')}')\" >{fun JZLANG('添加分类')}</a>\n\t\t  {/if}\n\t\t   <span class=\"x-right\" style=\"line-height:40px\">{fun JZLANG('共有数据：')}{$sum} {fun JZLANG('条')}</span>\n\t\t  </xblock>\n           <div style=\"width:100%;  overflow:scroll;overflow-y: hidden\">\n        <table border=\"1\" rules=\"all\" style=\"width:100%; height:100px; text-align:center;white-space:nowrap\" class=\"layui-table layui-form\">\n                <thead>\n                    <tr>\n                        <th>\n\t\t\t\t\t\t  <div class=\"layui-unselect header layui-form-checkbox\" lay-skin=\"primary\"><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t</th>\n                        <th>\n                            ID\n                        </th>\n                        <th>\n                            {fun JZLANG('排序')}\n                        </th>\n                        <th>\n                            {fun JZLANG('标题')}\n                        </th>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('图片')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('所属分类')}\n                        </th>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{foreach $fields_list as $v}\n\t\t\t\t\t\t<th>\n                            {$v['fieldname']}\n                        </th>\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('长')}\n                        </th>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('宽')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('是否显示')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('时间')}\n                        </th>\n\t\t\t\t\t\t\n                        <th>\n                            {fun JZLANG('操作')}\n                        </th>\n                    </tr>\n                </thead>\n                <tbody id=\"x-link\">\n\t\t\t\t  {foreach $lists as $v}\n                    <tr>\n                     <td>\n\t\t\t\t\t  <div class=\"layui-unselect layui-form-checkbox\" lay-skin=\"primary\" data-id='{$v['id']}'><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t</td>\n                        <td>\n                            {$v['id']}\n                        </td>\n                        <td>\n                            {$v['orders']}\n                        </td>\n                        <td>\n                            {fun newstr($v['title'],30)}\n                        </td>\n\t\t\t\t\t\t\n\t\t\t\t\t\t <td>\n                            <a href=\"{$v['litpic']}\" target=\"_blank\"><img src=\"{$v['litpic']}\" width=\"100px\" /></a>\n                        </td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t{fun get_info_table('collect_type',array('id'=>$v['tid']),'name')}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{foreach $fields_list as $vv}\n                        <td>\n                            {fun format_fields($vv,$v[$vv['field']])}\n                        </td>\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t <td>\n                            {$v['h']}\n                        </td>\n\t\t\t\t\t\t <td>\n                            {$v['w']}\n                        </td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t{if($v['isshow']==1)}<span class=\"layui-badge layui-bg-green\">{fun JZLANG('显示')}</span>{else}<span class=\"layui-badge\">{fun JZLANG('不显示')}</span>{/if}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n                            {fun date('Y-m-d H:i:s',$v['addtime'])} \n                        </td>\n                        <td class=\"td-manage\">\n\t\t\t\t\t\t{if(checkAction('Collect/editcollect'))}\n\t\t\t\t\t\t\t<a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Collect/editcollect',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{if(checkAction('Collect/deletecollect'))}\n\t\t\t\t\t\t\t<a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"collect_del(this,'{$v['id']}')\" href=\"javascript:;\"> {fun JZLANG('删除')}</a>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{if(checkAction('Collect/copycollect'))}\n\t\t\t\t\t\t\t<a class=\"layui-btn layui-btn-warm layui-btn-xs\"  onclick=\"collect_copy(this,'{$v['id']}')\" >{fun JZLANG('复制')}</a>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\n                        </td>\n\t\t\t\t\t\t\n                    </tr>\n\t\t\t\t\t{/foreach}\n                </tbody>\n            </table>\n\t\t\t</div>\n            <div class=\"page\">\n\t\t\t\t{$pages}\n\t\t\t  </div>\n        </div>\n     \n\t\t\t</div>\n\t\t</div> \n\t\t\n       <script>\n\t  \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n              laydate = layui.laydate;//日期插件\n              lement = layui.element;//面包导航\n            //  laypage = layui.laypage;//分页\n              layer = layui.layer;//弹出层\n\t\t\t  form = layui.form;\n              //以上模块根据需要引入\n              form.on('select(tid)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t$(\"#myform\").submit();\n\t\t\t\t\n\t\t\t });\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t /*删除*/\n            function collect_del(obj,id){\n                layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t$.get(\"{__APP_URL__}/Collect/deletecollect/id/\"+id,{},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000});\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n                   \n                });\n            }\n\t\t\t\n\t\t\t function collect_copy(obj,id){\n                $.get(\"{__APP_URL__}/Collect/copycollect/id/\"+id,{},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000});\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n            }\n\t\t\t\n\t\t\t function delAll (argument) {\n\n\t\t\t\tvar data = tableCheck.getData();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.get(\"{__APP_URL__}/Collect/deleteAll/data/\"+data,{},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('删除成功')}', {icon: 1});\n\t\t\t\t\t\t\t  $(\".layui-form-checked\").not('.header').parents('tr').remove();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/collecttype-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n\t  {include=\"style\"}\n\t  \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\">\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\n\t\t\t<div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('分类名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n\t\t\t</div>\n\t\t  \n\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t</div>\n\t\t\t\t\n\t\t\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <div class=\"layui-form-item\"  style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('添加')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n         \n\t\t\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t\t\t$.post('{fun U('Collect/collectTypeAdd')}',data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('添加成功！')}', {\n\t\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t\t//window.location.href='{fun U('Index/classtype')}';\n\t\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t\twindow.location.href=\"{fun U('Collect/collectType')}\";\n\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// \n\t\t\t\t\t\t}\n\t\t\t\t\t});\n                return false;\n          });\n\t\t  \n\t\t  \n\t\t\t\n          \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/collecttype-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n\t  {include=\"style\"}\n\t  \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form  layui-form-pane\">\n\t\t<input name=\"go\" type=\"hidden\" value=\"1\" />\n\t\t<input name=\"id\" type=\"hidden\" value=\"{$data['id']}\" />\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\n          <div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('分类名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" value=\"{$data['name']}\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n\t\t\t</div>\n\t\t  \n\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t</div>\n\t\t\t\t\n\t\t\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('修改')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n         \n\t\t\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t\t\t$.post('{fun U('Collect/collectTypeEdit')}',data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('修改成功！')}', {\n\t\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t\twindow.location.href=\"{fun U('Collect/collectType')}\";\n\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// parent.layer.close(index);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n                return false;\n          });\n\t\t  \n\t\t  \n\t\t\t\n          \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/collecttype-list.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a >{fun JZLANG('首页')}</a>\n        <a >{fun JZLANG('扩展管理')}</a>\n        <a><cite>{fun JZLANG('轮播图分类')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n     \t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t  <xblock>\n\t  <a class=\"layui-btn layui-btn-sm\"  onclick=\"x_admin_show('{fun JZLANG('返回列表')}','{fun U('Collect/index')}')\" >{fun JZLANG('返回列表')}</a>\n\t  {if(checkAction('Collect/collectTypeAdd'))}\n\t\t<a class=\"layui-btn layui-btn-sm\"  onclick=\"x_admin_show('{fun JZLANG('添加分类')}','{fun U('Collect/collectTypeAdd')}')\" >{fun JZLANG('添加分类')}</a>\n\t  {/if}\n        <span class=\"x-right\" style=\"line-height:40px\"></span>\n      </xblock>\n      <table class=\"layui-table layui-form\">\n        <thead>\n          <tr>\n           \n            <th width=\"70\">ID</th>\n            <th width=\"300\">{fun JZLANG('分类名')}</th>\n            <th width=\"150\">{fun JZLANG('时间')}</th>\n            <th >{fun JZLANG('操作')}</th>\n        </thead>\n        <tbody class=\"x-cate\">\n\t\t{foreach $lists as $v}\n          <tr cate-id=\"{$v['id']}\" fid=\"0\" >\n\t\t\t\n            <td>{$v['id']}</td>\n            <td>{$v['name']}</td>\n\t\t\t<td>{fun date('Y-m-d H:i:s',$v['addtime'])}</td>\n\t\t\t\n            <td class=\"td-manage\">\n\t\t\t{if(checkAction('Collect/collectTypeEdit'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Collect/collectTypeEdit',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t{/if}\n\t\t\t{if(checkAction('Collect/collectTypeDelete'))}\n              <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"collectType_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t{/if}  \n            </td>\n          </tr>\n\t\t {/foreach}\n         \n        </tbody>\n      </table>\n\t\t\t</div>\n\t\t</div>\n     \n    \n    </div>\n    \n\t\n    <script>\n      layui.use(['form'], function(){\n        form = layui.form;\n       \n      });\n\t\n\n      /*用户-删除*/\n      function collectType_del(obj,id){\n          layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n              //发异步删除数据\n\t\t\t  $.post('{fun U('Collect/collectTypeDelete')}',{id:id},function(r){\n\t\t\t\t\tr = JSON.parse(r);\n\t\t\t\t\tif(r.code==1){\n\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg(r.msg, {\n\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t $(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('已删除!')}',{icon:1,time:1000});\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t  });\n\t\t\n\t\t\t  \n\t\t\t  \n              \n          });\n      }\n\n\t\t\n\t\t\t\n    \n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/comment-add.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t<style>\n\t\t.layui-form-select.layui-form-selected {\n\t\t\tz-index: 9999;\n\t\t}\n\t\t</style>\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('评论管理')}</cite></a>\n             \n\t\t\t  <a><cite>{fun JZLANG('添加评论')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"userid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('用户ID')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"userid\" value=\"\"  name=\"userid\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('评论栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" id=\"tid\" >\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t   <option   value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t   </select>\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"aid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('文章ID')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"aid\" value=\"\"   name=\"aid\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"zid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('主回复ID')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"zid\" value=\"\" name=\"zid\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('同属于一个评论的ID，如果没有评论中的评论，则为0')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"pid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('回复帖子ID')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"pid\" value=\"\" name=\"pid\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('回复帖子ID')}\n\t\t\t\t    </div>\n                </div>\n             \n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label for=\"body\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('评论内容')}\n                    </label>\n                    <div class=\"layui-input-block\" style=\"clear:both;\" >\n\t\t\t\t\t{include=\"content\"}\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label for=\"reply\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('管理员回复')}\n                    </label>\n                    <div class=\"layui-input-block\" style=\"clear:both;\" >\n\t\t\t\t\t<textarea  name=\"reply\" class=\"layui-textarea\"></textarea>\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"ismsg\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否提醒回复')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"ismsg\" value=\"1\" title=\"{fun JZLANG('提醒')}\" >\n\t\t\t\t\t\t<input type=\"radio\" name=\"ismsg\" value=\"0\" title=\"{fun JZLANG('不提醒')}\" checked>\n                    </div>\n\t\t\t\t\t\n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"likes\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('喜欢/点赞')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"likes\" value=\"0\" name=\"likes\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isread\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否已读')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isread\" value=\"0\" title=\"{fun JZLANG('未读')}\" checked>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isread\" value=\"1\" title=\"{fun JZLANG('已读')}\" >\n                    </div>\n\t\t\t\t\t\n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否删除')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('已删除')}\" >\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('未删除')}\"  checked>\n                    </div>\n\t\t\t\t\t <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t {fun JZLANG('只能管理员删除评论，用户只能软删除评论')}\n\t\t\t\t     </div>\n\t\t\t\t\t\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"addtime\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('更新时间')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                      <input class=\"layui-input\" value=\"{fun date('Y-m-d H:i:s')}\" name=\"addtime\" placeholder=\"{fun JZLANG('选择时间')}\" id=\"LAY_demorange_s\">\n                    </div>\n                   \n                </div>\n\t\t\t\t\n\t\t\t\t<span id=\"content_fields\"></span>\n\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t\t</div>\n               \n                <div class=\"layui-form-item\" style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n\t\t\t$(function() {\n\t\t\t \n\t\t\t  get_fields(0);\n\t\t\t  get_fields_ext(0);\n\n\t\t\t})\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t   var upload = layui.upload;\n\t\t\t     laydate.render({\n\t\t\t\telem: '#LAY_demorange_s', //指定元素\n\t\t\t\ttype:'datetime'\n\t\t\t  });\n              //图片上传接口\n              upload.render({\n\t\t\t    elem: '#LAY_demo_upload',\n                url: '{fun U('Common/uploads')}' //上传接口\n                ,done: function(res){ //上传成功后的回调\n                   // console.log(res);\n\t\t\t\t\t\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\t $('#fileimg').attr('src',res.url);\n\t\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t\t}\n                 \n                }\n              });\n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                \n\t\t\t\t$.post(\"{fun U('addcomment')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('commentlist')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n          \n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/comment-details.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t<style>\n\t\t.layui-form-select.layui-form-selected {\n\t\t\tz-index: 9999;\n\t\t}\n\t\t</style>\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('评论管理')}</cite></a>\n             \n\t\t\t  <a><cite>{fun JZLANG('查看评论')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"userid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('用户ID')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"userid\" value=\"{$data['userid']}\"  name=\"userid\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('评论栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" id=\"tid\" >\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t   <option {if($data['tid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t   </select>\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"aid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('文章ID')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"aid\" value=\"{$data['aid']}\"   name=\"aid\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"zid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('主回复ID')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"zid\" value=\"{$data['zid']}\" name=\"zid\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('同属于一个评论的ID，如果没有评论中的评论，则为0')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"pid\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('回复帖子ID')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"pid\" value=\"{$data['pid']}\" name=\"pid\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  <span class=\"x-red\"></span>{fun JZLANG('回复帖子ID')}\n\t\t\t\t    </div>\n                </div>\n             \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label for=\"body\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('评论内容')}\n                    </label>\n                    <div class=\"layui-input-block\" style=\"clear:both;\" >\n\t\t\t\t\t{include=\"content\"}\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label for=\"reply\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('管理员回复')}\n                    </label>\n                    <div class=\"layui-input-block\" style=\"clear:both;\" >\n\t\t\t\t\t<textarea  name=\"reply\" class=\"layui-textarea\">{$data['reply']}</textarea>\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"ismsg\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否提醒回复')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"ismsg\" value=\"1\" title=\"{fun JZLANG('提醒')}\" >\n\t\t\t\t\t\t<input type=\"radio\" name=\"ismsg\" value=\"0\" title=\"{fun JZLANG('不提醒')}\" checked>\n                    </div>\n\t\t\t\t\t\n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"likes\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('喜欢/点赞')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"likes\" value=\"{$data['likes']}\" name=\"likes\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isread\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否已读')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isread\" value=\"0\" title=\"{fun JZLANG('未读')}\" {if($data['isread']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isread\" value=\"1\" title=\"{fun JZLANG('已读')}\" {if($data['isread']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t\n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否删除')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('已删除')}\" {if($data['isshow']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('未删除')}\" {if($data['isshow']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t {fun JZLANG('只能管理员删除评论，用户只能软删除评论')}\n\t\t\t\t     </div>\n\t\t\t\t\t\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"addtime\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('更新时间')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                      <input class=\"layui-input\" value=\"{if($data)}{fun date('Y-m-d H:i:s',$data['addtime'])}{else}{fun date('Y-m-d H:i:s')}{/if}\" name=\"addtime\" placeholder=\"{fun JZLANG('选择时间')}\" id=\"LAY_demorange_s\">\n                    </div>\n                   \n                </div>\n\t\t\t\t<span id=\"content_fields\"></span>\n\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t\t</div>\n               \n                <div class=\"layui-form-item\" style=\"text-align:center;\">\n                   \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t  var upload = layui.upload;\n\t\t\t   laydate.render({\n\t\t\t\telem: '#LAY_demorange_s', //指定元素\n\t\t\t\ttype:'datetime'\n\t\t\t  });\n              //图片上传接口\n              upload.render({\n\t\t\t    elem: '#LAY_demo_upload',\n                url: \"{fun U('Common/uploads')}\" //上传接口\n                ,done: function(res){ //上传成功后的回调\n                   // console.log(res);\n\t\t\t\t\t\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\t $('#fileimg').attr('src',res.url);\n\t\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t\t}\n                 \n                }\n              });\n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                //console.log(data);\n                //发异步，把数据提交给php\n\t\t\t\t$.post(\"{fun U('editcomment')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('Comment/commentlist')}\";\n\t\t\t\t\t\t\t{else}\n                             parent.layer.closeAll();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\n\t\t\tget_fields(0,{$data['id']});\n            get_fields_ext(0,{$data['id']});\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/comment-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('评论管理')}</cite></a>\n              <a><cite>{fun JZLANG('评论列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t\n         <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"isshow\" lay-filter=\"isshow\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('状态')}</option>\n\t\t\t\t\t   \n\t\t\t\t\t   <option {if($isshow==1)} selected=\"selected\" {/if}value=\"1\">{fun JZLANG('已审核')}</option>\n\t\t\t\t\t   <option {if($isshow==2)} selected=\"selected\" {/if}value=\"2\">{fun JZLANG('未审核')}</option>\n\t\t\t\t\t   <option {if($isshow==3)} selected=\"selected\" {/if}value=\"3\">{fun JZLANG('被删除')}</option>\n\t\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"tid\" lay-filter=\"tid\" lay-search class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('请选择栏目')}</option>\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t  \n\t\t\t\t\t   <option {if($tid==$v['id'])} selected=\"selected\" {/if}value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t \n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t  <input type=\"text\" name=\"body\" value=\"{$body}\" placeholder=\"{fun JZLANG('请输入评论内容')}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t  {$fields_search}\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t\t</div>\n\t\t</div>\n\t\t\n\t\t\n\t\t\n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t{if(checkAction('Comment/editcomment'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs\" lay-event=\"edit\">{fun JZLANG('查看')}</a>\n\t\t\n\t\t{/if}\n\t\t{if(checkAction('Comment/deletecomment'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t  {if(checkAction('Comment/checkAll'))}\t\n\t\t  <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;width:150px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_isshow\"  lay-filter=\"change_isshow\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量审核')}</option>\n\t\t\t   <option   value=\"1\">{fun JZLANG('审核')}</option>\n\t\t\t   <option   value=\"2\">{fun JZLANG('未审核')}</option>\n\t\t\t   </select>\n\t\t\t   </div>\n\t\t  {/if}\n\t\t {if(checkAction('Comment/deleteAll'))}\n\t\t\t   <a class=\"layui-btn  layui-btn-sm layui-btn-danger\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}\t \n\t\t {if(checkAction('Comment/addcomment'))}\t   \n\t\t\t   <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('添加评论')}','{fun U('Comment/addcomment')}')\">{fun JZLANG('添加评论')}</a>\n\t\t {/if}\n\t\t\t\n\t\t </div>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"aid\">\n\t\t{{#  if(d.new_aid_url == ''){ }}\n\t\t-\n\t\t{{#  } else  { }}\n\t\t<a onclick=\"x_all_show('{fun JZLANG('查看相关内容')}','{{d.new_aid_url}}')\"><button class=\"layui-btn layui-btn-xs\" >{fun JZLANG('查看')}</button></a>\n\t\t{{#  } }}\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"user\">\n\t\t{{#  if(d.new_user == ''){ }}\n\t\t-\n\t\t{{#  } else  { }}\n\t\t{if(checkAction('Member/memberedit'))}\t\n\t\t<a onclick=\"x_all_show('{fun JZLANG('查看用户')}','{{d.new_user}}')\"><button class=\"layui-btn layui-btn-xs\" >{{d.new_username}}</button></a>\n\t\t{else}\n\t\t{{d.new_username}}\n\t\t{/if}\n\t\t{{#  } }}\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"isshow\">\n\t\t\t{{#  if(d.isshow ==1){ }}\n\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('已审')}</span>\n\t\t    {{#  } else{ }}\n\t\t    <span class=\"layui-badge\">{fun JZLANG('未审')}</span>\n\t\t    {{#  } }}\n\t\t</script>\n\t\t\n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  \n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,cellMinWidth: 80\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '{fun JZLANG('首页')}' //不显示首页\n\t\t\t\t  ,last: '{fun JZLANG('尾页')}' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  ,{field: 'new_username', title: '{fun JZLANG('用户名')}',width: 150,templet:'#user'}\n\t\t\t\t  ,{field: 'new_tid', title: '{fun JZLANG('所属栏目')}'}\n\t\t\t\t  ,{field: 'new_aid', title: '{fun JZLANG('所属文章')}',templet:'#aid' }\n\t\t\t\t  ,{field: 'body', title: '{fun JZLANG('评论内容')}'}\n\t\t\t\t  {foreach $fields_list as $v},{field: '{$v['field']}', title: '{$v['fieldname']}'}{/foreach}\n\t\t\t\t  ,{field: 'new_isshow', title: '{fun JZLANG('显示')}', width: 100,templet: '#isshow'}\n\t\t\t\t  ,{field: 'new_addtime', title: '{fun JZLANG('评论时间')}',width:160}\n\t\t\t\t \n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:160, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t\n\t\t\t\t  \n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('编辑')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t    \n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Comment/deletecomment')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t\t\t\n\t\t\t\t\t  \n\t\t\t\t\t\t \n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t    table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t // console.log(obj.checked); //当前是否选中状态\n\t\t\t\t // console.log(obj.data); //选中行的相关数据\n\t\t\t\t // console.log(obj.type); //如果触发的是全选，则为：all，如果触发的是单选，则为：one\n\t\t\t\t /*\n\t\t\t\t\tconsole.log(checkStatus.data) //获取选中行的数据\n\t\t\t\t\tconsole.log(checkStatus.data.length) //获取选中行数量，可作为是否有选中行的条件\n\t\t\t\t\tconsole.log(checkStatus.isAll ) //表格是否全选\n\t\t\t\t */\n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tform.on('select(change_isshow)', function(data){\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar isshow = parseInt(data.value);\n\t\t\t\t\tif(isshow==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核选项')}！');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(isshow==1){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('已审核')}';\n\t\t\t\t\t}else if(isshow==2){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('未审核')}';\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量处理吗？')}['+datas+']=>['+tip+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Comment/checkAll')}\",{data:datas,isshow:isshow},function(r){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量处理成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\t\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t\t\n\t\t\t    \n\t\t\t\t\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Comment/deleteAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t\n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/common/content.html",
    "content": "<div class=\"layui-input-block\" style=\"width:100%;\">\n\t\t\n    <div style=\"border: 1px solid #ccc;\">\n       <div id=\"editor-toolbar-body\" style=\"border-bottom: 1px solid #ccc;\"></div>\n       <div id=\"editor-text-area-body\" style=\"height: 350px\"></div>\n     </div>\n     <!-- 显示内容 -->\n     <div style=\"margin-top: 20px;\">\n        {if($data)}\n       <textarea id=\"editor-content-textarea-body\" style=\"display:none\" name=\"body\">{$data['body']}</textarea>\n       {else}\n       <textarea id=\"editor-content-textarea-body\" style=\"display:none\" name=\"body\"></textarea>\n       {/if}\n     </div>\n     \n     <!-- 图库模态框 -->\n     <div id=\"image-library-modal-body\" style=\"display:none; position:fixed; top:0; left:0; right:0; bottom:0; background:rgba(0,0,0,0.5); z-index:1000;\">\n       <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); width:80%; height:80%; background:white; border-radius:5px; overflow:hidden;\">\n         <div style=\"padding:20px; border-bottom:1px solid #eee; display:flex; justify-content:space-between; align-items:center;\">\n           <h3>本地图库</h3>\n           <button id=\"close-library-modal-body\" type=\"button\" style=\"padding:5px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer;\">关闭</button>\n         </div>\n         <div id=\"image-library-content-body\" style=\"padding:20px; height:calc(100% - 170px); overflow-y:auto;\">\n           <div id=\"image-list-body\" style=\"display:grid; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr)); gap:15px;\">\n             <!-- 图片将通过JS动态加载 -->\n           </div>\n         </div>\n         <div style=\"padding:15px 20px; border-top:1px solid #eee; display:flex; justify-content:space-between; align-items:center;\">\n           <div id=\"gallery-page-info-body\" style=\"color:#666; font-size:14px;\">第1页 / 共1页</div>\n           <div style=\"display:flex; gap:10px;\">\n             <button id=\"gallery-prev-page-body\" type=\"button\" style=\"padding:6px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer; color:#666;\">上一页</button>\n             <button id=\"gallery-next-page-body\" type=\"button\" style=\"padding:6px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer; color:#666;\">下一页</button>\n             <button id=\"insert-selected-images-body\" type=\"button\" style=\"padding:6px 20px; background:#1890ff; color:white; border:none; border-radius:3px; cursor:pointer;\">插入选中图片</button>\n           </div>\n         </div>\n       </div>\n     </div>\n\n   \n   \n</div>\n\n<script>\n\t\t\t\n           \n\t$(document).ready(function (){\n    var html = document.getElementById(\"editor-content-textarea-body\").value\n     var E_body = window.wangEditor\n    // 切换语言\n    E_body.i18nChangeLanguage(\"zh-CN\")\n    window.editor = E_body.createEditor({\n      selector: \"#editor-text-area-body\",\n      html: html,\n      config: {\n        placeholder: \"请输入内容...\",\n        MENU_CONF: {\n            uploadImage: {\n                fieldName: \"file\",\n                server: \"{fun U('common/uploads')}\",\n                 // 单个文件的最大体积限制，默认为 2M\n                maxFileSize: 100 * 1024 * 1024, // 1M\n            \n                // 最多可上传几个文件，默认为 100\n                maxNumberOfFiles: 100,\n           \n                allowedFileTypes: [\"image/*\"],\n                // 超时时间，默认为 10 秒\n                timeout: 10 * 60 * 1000, // 5 秒\n                 // 单个文件上传成功之后\n                //onSuccess(file: File, res: any) {  // TS 语法\n                onSuccess(file, res) {          // JS 语法\n                    console.log(`${file.name} 上传成功`, res)\n                    if(res.code!=0){\n                        alert(res.error)\n                    }\n                },\n            \n                // 单个文件上传失败\n                //onFailed(file: File, res: any) {   // TS 语法\n                onFailed(file, res) {           // JS 语法\n                    console.log(`${file.name} 上传失败`, res)\n                },\n            \n                // 上传错误，或者触发 timeout 超时\n                //onError(file: File, err: any, res: any) {  // TS 语法\n                onError(file, err, res) {               // JS 语法\n                    console.log(`${file.name} 上传出错`, err, res)\n                },\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\n                customInsert(res, insertFn) {                  // JS 语法\n                    // res 即服务端的返回结果\n                    console.log(res,insertFn)\n                    // 从 res 中找到 url alt href ，然后插入图片\n                    insertFn(res.url)\n                },\n          },\n            uploadVideo: {\n                fieldName: \"file\",\n                server: \"{fun U('common/uploads')}\",\n                 // 单个文件的最大体积限制，默认为 2M\n                maxFileSize: 10000 * 1024 * 1024 * 1024, // 1M\n            \n                // 最多可上传几个文件，默认为 100\n                maxNumberOfFiles: 100,\n     \n                allowedFileTypes: [\"video/*\"],\n                // 超时时间，默认为 10 秒\n                timeout: 30 * 60 * 1000, // 5 秒\n                 // 单个文件上传成功之后\n                //onSuccess(file: File, res: any) {  // TS 语法\n                onSuccess(file, res) {          // JS 语法\n                    console.log(`${file.name} 上传成功`, res)\n                    if(res.code!=0){\n                        alert(res.error)\n                    }\n                },\n            \n                // 单个文件上传失败\n                //onFailed(file: File, res: any) {   // TS 语法\n                onFailed(file, res) {           // JS 语法\n                    console.log(`${file.name} 上传失败`, res)\n                },\n            \n                // 上传错误，或者触发 timeout 超时\n                //onError(file: File, err: any, res: any) {  // TS 语法\n                onError(file, err, res) {               // JS 语法\n                    console.log(`${file.name} 上传出错`, err, res)\n                },\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\n                customInsert(res, insertFn) {                  // JS 语法\n                    // res 即服务端的返回结果\n                    console.log(res,insertFn)\n                    // 从 res 中找到 url alt href ，然后插入图片\n                    insertFn(res.url)\n                },\n          },\n        },\n        onChange(editor) {\n          var html = editor.getHtml()\n          var num = 0,\n            reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\n            while (num < html.length && html != \"\")\n            {\n                num++;\n                let k = html.match(reg);\n                if (k) {\n                html = html.replace(k[0], \"\");\n                }\n            } \n          document.getElementById(\"editor-content-textarea-body\").value = html\n        }\n      }\n    })\n    class MyMenuBody {\n        constructor() {\n            this.title = \"源码\"\n            this.tag = \"button\"\n            this.sourceActive = false\n        }\n        getValue(editor) {\n            if (this.sourceActive) {\n                return editor.getText()\n            } else {\n                return editor.getHtml()\n            }\n\n        }\n        isActive(editor) {\n            return this.sourceActive\n        }\n        isDisabled(editor) {\n            return false // or true\n        }\n        exec(editor, value) {\n            this.sourceActive = !this.sourceActive\n            editor.clear()\n            E_body.SlateTransforms.setNodes(editor, { type: \"paragraph\" }, { mode: \"highest\"})\n            var num = 0,\n            reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\n            while (num < value.length && value != \"\")\n            {\n                num++;\n                let k = value.match(reg);\n                if (k) {\n                    value = value.replace(k[0], \"\");\n                }\n            } \n            if (this.isActive()) {\n                editor.insertText(value)\n            } else {\n                editor.dangerouslyInsertHtml(value)\n            }\n\n\n\n        }\n    }\n    \n    // 图库菜单类\n    class MyGalleryMenuBody {\n      constructor() {\n        this.title = \"图库\"\n        this.tag = \"button\"\n      }\n      getValue(editor) {\n        return \"\"\n      }\n      isActive(editor) {\n        return false\n      }\n      isDisabled(editor) {\n        return false\n      }\n      exec(editor, value) {\n        // 显示图库模态框\n        document.getElementById(\"image-library-modal-body\").style.display = \"block\"\n        // 加载图片列表\n        loadImageLibrary(\"body\")\n      }\n    }\n    \n    const myMenuConfBody = {\n        key: \"bodyhtml\",\n        factory() {\n            return new MyMenuBody()\n        }\n    }\n    \n    const myGalleryMenuConfBody = {\n        key: \"bodygallery\",\n        factory() {\n            return new MyGalleryMenuBody()\n        }\n    }\n    \n    E_body.Boot.registerMenu(myMenuConfBody)\n    E_body.Boot.registerMenu(myGalleryMenuConfBody)\n    window.toolbar = E_body.createToolbar({\n        editor,\n        selector: \"#editor-toolbar-body\",\n        config: {\n            insertKeys: {\n                index: 0,\n                keys: [\"bodyhtml\", \"bodygallery\"],\n            }\n        }\n    })\n\n\n        \n\t})\n\t\n\t// 加载图片库函数\n\tvar galleryPageBody = 1;\n\tvar galleryPageSizeBody = 20;\n\tvar galleryTotalCountBody = 0;\n\t\n\tfunction loadImageLibrary(fieldRd, page) {\n\t\tif(page) galleryPageBody = page;\n\t\tvar imageList = document.getElementById(\"image-list-\"+fieldRd);\n\t\timageList.innerHTML = `<div style=\"text-align:center; padding:50px;\">加载中...</div>`;\n\t\t\n\t\t// 模拟加载图片，实际项目中应该从服务器获取已上传的图片列表\n\t\t// 这里假设服务器返回JSON格式的图片列表\n\t\t$.ajax({\n\t\t\turl: \"{fun U('Sys/pictures')}\",\n\t\t\ttype: \"GET\",\n\t\t\tdata: {ajax:1, page: galleryPageBody, pageSize: galleryPageSizeBody},\n\t\t\tdataType: \"json\",\n\t\t\tsuccess: function(res) {\n\t\t\t\tif(res.code == 0 && res.data && res.data.length > 0) {\n\t\t\t\t\timageList.innerHTML = \"\";\n\t\t\t\t\tres.data.forEach(function(image) {\n\t\t\t\t\t\tvar imageItem = document.createElement(\"div\");\n\t\t\t\t\t\timageItem.style.cssText = \"position:relative; border:2px solid transparent; cursor:pointer; transition:all 0.3s;\";\n\t\t\t\t\t\timageItem.innerHTML = `\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"position:absolute; top:5px; left:5px; z-index:10;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"custom-checkbox\" style=\"width:20px; height:20px; border:2px solid #ccc; border-radius:3px; background:white; display:flex; align-items:center; justify-content:center; cursor:pointer;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"checkmark\" style=\"display:none; color:#1890ff; font-size:14px; font-weight:bold;\">✓</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"checkbox\" style=\"display:none;\" data-src=\"${image.litpic}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img src=\"${image.litpic}\" style=\"width:100%; height:120px; object-fit:cover; border-radius:3px;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t`;\n\t\t\t\t\t\t\n\t\t\t\t\t\t// 点击图片切换选中状态\n\t\t\t\t\t\timageItem.addEventListener(\"click\", function(e) {\n\t\t\t\t\t\t\tvar checkbox = this.querySelector(\"input[type=\\\"checkbox\\\"]\");\n\t\t\t\t\t\t\tvar customCheckbox = this.querySelector(\".custom-checkbox\");\n\t\t\t\t\t\t\tvar checkmark = this.querySelector(\".checkmark\");\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tcheckbox.checked = !checkbox.checked;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// 更新自定义复选框显示\n\t\t\t\t\t\t\tif(checkbox.checked) {\n\t\t\t\t\t\t\t\tcustomCheckbox.style.borderColor = \"#1890ff\";\n\t\t\t\t\t\t\t\tcustomCheckbox.style.backgroundColor = \"#1890ff\";\n\t\t\t\t\t\t\t\tcheckmark.style.display = \"block\";\n\t\t\t\t\t\t\t\tcheckmark.style.color = \"white\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcustomCheckbox.style.borderColor = \"#ccc\";\n\t\t\t\t\t\t\t\tcustomCheckbox.style.backgroundColor = \"white\";\n\t\t\t\t\t\t\t\tcheckmark.style.display = \"none\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// 更新边框样式\n\t\t\t\t\t\t\tthis.style.borderColor = checkbox.checked ? \"#1890ff\" : \"transparent\";\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\timageList.appendChild(imageItem);\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t// 更新分页信息\n\t\t\t\t\tgalleryTotalCountBody = res.count;\n\t\t\t\t\tvar totalPages = Math.ceil(galleryTotalCountBody / galleryPageSizeBody);\n\t\t\t\t\tdocument.getElementById(\"gallery-page-info-body\").textContent = \"第\"+galleryPageBody+\"页 / 共\"+totalPages+\"页\";\n\t\t\t\t\t\n\t\t\t\t\t// 更新按钮状态\n\t\t\t\t\tdocument.getElementById(\"gallery-prev-page-body\").disabled = galleryPageBody <= 1;\n\t\t\t\t\tdocument.getElementById(\"gallery-next-page-body\").disabled = galleryPageBody >= totalPages;\n\t\t\t\t} else {\n\t\t\t\t\timageList.innerHTML = \"<div style=\\\"text-align:center; padding:50px;\\\">暂无图片</div>\";\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function() {\n\t\t\t\timageList.innerHTML = \"<div style=\\\"text-align:center; padding:50px; color:red;\\\">加载失败</div>\";\n\t\t\t}\n\t\t});\n\t}\n\t\n\t// 关闭模态框\n\tdocument.getElementById(\"close-library-modal-body\").addEventListener(\"click\", function() {\n\t\tdocument.getElementById(\"image-library-modal-body\").style.display = \"none\";\n\t});\n\t\n\t// 分页控制函数\n\tdocument.getElementById(\"gallery-prev-page-body\").addEventListener(\"click\", function() {\n\t\tif(galleryPageBody > 1) {\n\t\t\tloadImageLibrary(\"body\", galleryPageBody - 1);\n\t\t}\n\t});\n\t\n\tdocument.getElementById(\"gallery-next-page-body\").addEventListener(\"click\", function() {\n\t\tvar totalPages = Math.ceil(galleryTotalCountBody / galleryPageSizeBody);\n\t\tif(galleryPageBody < totalPages) {\n\t\t\tloadImageLibrary(\"body\", galleryPageBody + 1);\n\t\t}\n\t});\n\t\n\t// 插入选中图片\n\tdocument.getElementById(\"insert-selected-images-body\").addEventListener(\"click\", function() {\n\t\tvar selectedCheckboxes = document.querySelectorAll(\"#image-list-body input[type=\\\"checkbox\\\"]:checked\");\n\t\tvar selectedImages = [];\n\t\t\n\t\tselectedCheckboxes.forEach(function(checkbox) {\n\t\t\tselectedImages.push(checkbox.dataset.src);\n\t\t});\n\t\t\n\t\tif(selectedImages.length > 0) {\n\t\t\t// 插入图片到编辑器\n\t\t\tselectedImages.forEach(function(imageUrl) {\n\t\t\t\t// 使用 wangEditor 的 API 插入图片\n\t\t\t\twindow.editor.dangerouslyInsertHtml('<img src=\"' + imageUrl + '\" alt=\"\" style=\"width: 200px;\">');\n\t\t\t});\n\t\t\t\n\t\t\t// 关闭模态框\n\t\t\tdocument.getElementById(\"image-library-modal-body\").style.display = \"none\";\n\t\t} else {\n\t\t\talert(\"请先选择要插入的图片\");\n\t\t}\n\t});\n\n</script>"
  },
  {
    "path": "app/admin/t/tpl/common/edit.html",
    "content": "<script type=\"text/javascript\" charset=\"utf-8\" src=\"/static/common/wangeditor/wangeditor.min.js\"></script>\r\n<link rel=\"stylesheet\" href=\"/static/common/wangeditor/wangeditor.css\">\r\n"
  },
  {
    "path": "app/admin/t/tpl/common/fields.html",
    "content": "$(function(){\n\t$(document).on('click','.delete_file',function(){\n\t\t//删除页面信息\n\t\t\n\t\t$(this).parent().remove();\n\t})\n\t\n\t\n\t$(document).on(\"click\",\".layui-sys-icon\",function(){\n\t\tvar fclass = $(this).attr('data-field');\n\t\tlayer.tips($(this).attr('data-info'), '.'+fclass);\n\t})\n\t$(document).on(\"mouseover\",\".layui-sys-icon\",function(){\n\t\tvar fclass = $(this).attr('data-field');\n\t\tlayer.tips($(this).attr('data-info'), '.'+fclass);\n\t})\n\t\n\n})\n\nfunction get_fields(tid,id){\n\tvar id = arguments[1]?arguments[1]:0;\n\t$.post(\"{fun U('Fields/get_fields')}\",{molds:'{$fields_biaoshi}',tid:tid,id:id},function(r){\n\t\t$(\"#content_fields\").html(r);\n\t});\n}\nfunction get_fields_ext(tid,id){\n\tvar id = arguments[1]?arguments[1]:0;\n\t$.post(\"{fun U('Fields/get_fields')}\",{molds:'{$fields_biaoshi}',tid:tid,id:id,isext:1},function(r){\n\t\t$(\"#ext_fields\").html(r);\n\t});\n}\nfunction deleteImage_auto(elm,field){\n\t$(elm).prev().attr(\"src\", \"{__Tpl_style__}/style/images/nopic.jpg\");\n\t$('#'+field).val(\"\");\n}\n\nfunction goleft(a){\n\tvar str = $(a).parent().parent().parent().attr('class');\n\tvar arr = $(\".\"+str+\" .upload-icon-img\").toArray();\n\tvar index = $('.'+str+' .upload-icon-img').index($(a).closest('.upload-icon-img'));\n\tvar temp;\n\tif(index-1>=0){\n\t\ttemp = arr[index];\n\t\tarr[index] = arr[index-1];\n\t\tarr[index-1] = temp;\n\t\t$(a).parent().parent().parent().html(arr)\n\t}\n}\nfunction goright(a){\n\tvar str = $(a).parent().parent().parent().attr('class');\n\tvar arr = $(\".\"+str+\" .upload-icon-img\").toArray();\n\tvar index = $('.'+str+' .upload-icon-img').index($(a).closest('.upload-icon-img'));\n\tvar temp;\n\tif(index+1<arr.length){\n\t\ttemp = arr[index];\n\t\tarr[index] = arr[index+1];\n\t\tarr[index+1] = temp;\n\t\t$(a).parent().parent().parent().html(arr)\n\t}\n}\n"
  },
  {
    "path": "app/admin/t/tpl/common/footer.html",
    "content": "\n\t\n\t\t <script>\n $(function(){\n/*\n\tvar interval =  setInterval(function(){\n\t$.ajax({\n\t\t url:\"{fun U('Index/update_session_maxlifetime')}\",//请求的url地址\n\t\t dataType:\"json\",//返回格式为json\n\t\t async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n\t\t data:{},//参数值\n\t\t type:\"GET\",//请求方式\n\t\t beforeSend:function(){\n\t\t\t//请求前的处理\n\t\t\t},\n\t\t\t success:function(r){\n\t\t\t//请求成功时处理\n\t\t\t\t\tconsole.log(r);\n\t\t\t},\n\t\t\t complete:function(){\n\t\t\t//请求完成的处理\n\t\t\t},\n\t\t\t error:function(){\n\t\t\t//请求出错处理\n\t\t\t}\n\n\n\n\t})\n\t},30000);\n*/\n })\n \n\n \n </script>"
  },
  {
    "path": "app/admin/t/tpl/common/style.html",
    "content": "\t<title>{fun webConf('web_name')}</title>\n\t<meta name=\"renderer\" content=\"webkit|ie-comp|ie-stand\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi\" />\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\" />\n\t<meta name=\"author\" content=\"留恋风,2581047041@qq.com\"> \n    <link rel=\"shortcut icon\" href=\"/favicon.ico\" type=\"image/x-icon\" />\n    <link rel=\"stylesheet\" href=\"{__Tpl_style__}/style/fonts/iconfont.css?v=1\">\n\t<link rel=\"stylesheet\" href=\"{__Tpl_style__}/style/css/xadmin.css?v=3\">\n\t<link rel=\"stylesheet\" href=\"{__Tpl_style__}/style/css/style.css?v=1\">\n    <script type=\"text/javascript\" src=\"{__Tpl_style__}/style/js/jquery.min.js\"></script>\n    <script src=\"/static/common/layui/layui.js?v=2.6.8\" charset=\"utf-8\"></script>\n\t<script type=\"text/javascript\" src=\"{__Tpl_style__}/style/js/xadmin.js?v=2.1\"></script>\n\t<script type=\"text/javascript\" src=\"/static/common/clipboard.js\"></script>\n\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"{__Tpl_style__}/style/js/xm-select.js\"></script>\n\t<link rel=\"stylesheet\" type=\"text/css\" href=\"{__Tpl_style__}/style/tags/jquery.tagsinput.css\" />\n\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"{__Tpl_style__}/style/tags/jquery.tagsinput.js\"></script>\n\t{php\n\t\n\tswitch($webconf['admintpl']){\n\t\tcase 'tpl':\n\t\techo '<script type=\"text/javascript\" src=\"'.Tpl_style.'/style/js/target_page.js\"></script>';\n\t\tbreak;\n\t\tcase 'default':\n\t\techo '<script type=\"text/javascript\" src=\"'.Tpl_style.'/style/js/target_window.js\"></script>';\n\t\tbreak;\n\t}\n\t\n\t\n\t/}\n\t<style>\n\t.layui-form-item .layui-input-inline {\n\t\tfloat: left;\n\t\twidth: 250px;\n\t\tmargin-right: 10px;\n\t}\n\t</style>\n"
  },
  {
    "path": "app/admin/t/tpl/common/uediter.php",
    "content": "<?php\r\n\r\n$rd = getRandChar(6);\r\nif(APP_CONTROLLER=='Sys'){\r\n    return '<div class=\"layui-collapse\">\r\n\t\t  <div class=\"layui-colla-item\">\r\n\t\t\t<h2 class=\"layui-colla-title\">'.$v['title'].'</h2>\r\n\t\t\t<div class=\"layui-colla-content\">\r\n\r\n\t\t\t\t <div style=\"border: 1px solid #ccc;\">\r\n                    <div id=\"editor-toolbar-'.$v['field'].$rd.'\" style=\"border-bottom: 1px solid #ccc;\"></div>\r\n                    <div id=\"editor-text-area-'.$v['field'].$rd.'\" style=\"height: 350px\"></div>\r\n                  </div>\r\n                  <!-- 显示内容 -->\r\n                  <div style=\"margin-top: 20px;\">\r\n                    <textarea id=\"editor-content-textarea-'.$v['field'].$rd.'\" style=\"display:none\" name=\"'.$v['field'].'\">'.$v['data'].'</textarea>\r\n                  </div>\r\n                  \r\n                  <!-- 图库模态框 -->\r\n                  <div id=\"image-library-modal-'.$v['field'].$rd.'\" style=\"display:none; position:fixed; top:0; left:0; right:0; bottom:0; background:rgba(0,0,0,0.5); z-index:1000;\">\r\n                    <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); width:80%; height:80%; background:white; border-radius:5px; overflow:hidden;\">\r\n                      <div style=\"padding:20px; border-bottom:1px solid #eee; display:flex; justify-content:space-between; align-items:center;\">\r\n                        <h3>本地图库</h3>\r\n                        <button id=\"close-library-modal-'.$v['field'].$rd.'\" type=\"button\" style=\"padding:5px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer;\">关闭</button>\r\n                      </div>\r\n                      <div id=\"image-library-content-'.$v['field'].$rd.'\" style=\"padding:20px; height:calc(100% - 170px); overflow-y:auto;\">\r\n                        <div id=\"image-list-'.$v['field'].$rd.'\" style=\"display:grid; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr)); gap:15px;\">\r\n                          <!-- 图片将通过JS动态加载 -->\r\n                        </div>\r\n                      </div>\r\n                      <div style=\"padding:15px 20px; border-top:1px solid #eee; display:flex; justify-content:space-between; align-items:center;\">\r\n                        <div id=\"gallery-page-info-'.$v['field'].$rd.'\" style=\"color:#666; font-size:14px;\">第1页 / 共1页</div>\r\n                        <div style=\"display:flex; gap:10px;\">\r\n                          <button id=\"gallery-prev-page-'.$v['field'].$rd.'\" type=\"button\" style=\"padding:6px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer; color:#666;\">上一页</button>\r\n                          <button id=\"gallery-next-page-'.$v['field'].$rd.'\" type=\"button\" style=\"padding:6px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer; color:#666;\">下一页</button>\r\n                          <button id=\"insert-selected-images-'.$v['field'].$rd.'\" type=\"button\" style=\"padding:6px 20px; background:#1890ff; color:white; border:none; border-radius:3px; cursor:pointer;\">插入选中图片</button>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  \r\n\t\t\t\t\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<script>\r\n\t\r\n  \r\n\t$(document).ready(function (){\r\n     var html = document.getElementById(\"editor-content-textarea-'.$v['field'].$rd.'\").value\r\n     var E_'.$v['field'].$rd.' = window.wangEditor\r\n    // 切换语言\r\n    E_'.$v['field'].$rd.'.i18nChangeLanguage(\"zh-CN\")\r\n    window.editor = E_'.$v['field'].$rd.'.createEditor({\r\n      selector: \"#editor-text-area-'.$v['field'].$rd.'\",\r\n      html: html,\r\n      config: {\r\n        placeholder: \"请输入内容...\",\r\n        MENU_CONF: {\r\n            uploadImage: {\r\n                fieldName: \"file\",\r\n                server: \"'.U('common/uploads').'\",\r\n                 // 单个文件的最大体积限制，默认为 2M\r\n                maxFileSize: 100 * 1024 * 1024, // 1M\r\n            \r\n                // 最多可上传几个文件，默认为 100\r\n                maxNumberOfFiles: 100,\r\n           \r\n                allowedFileTypes: [\"image/*\"],\r\n                // 超时时间，默认为 10 秒\r\n                timeout: 10 * 60 * 1000, // 5 秒\r\n                 // 单个文件上传成功之后\r\n                //onSuccess(file: File, res: any) {  // TS 语法\r\n                onSuccess(file, res) {          // JS 语法\r\n                    console.log(`${file.name} 上传成功`, res)\r\n                    if(res.code!=0){\r\n                        alert(res.error)\r\n                    }\r\n                },\r\n            \r\n                // 单个文件上传失败\r\n                //onFailed(file: File, res: any) {   // TS 语法\r\n                onFailed(file, res) {           // JS 语法\r\n                    console.log(`${file.name} 上传失败`, res)\r\n                },\r\n            \r\n                // 上传错误，或者触发 timeout 超时\r\n                //onError(file: File, err: any, res: any) {  // TS 语法\r\n                onError(file, err, res) {               // JS 语法\r\n                    console.log(`${file.name} 上传出错`, err, res)\r\n                },\r\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\r\n                customInsert(res, insertFn) {                  // JS 语法\r\n                    // res 即服务端的返回结果\r\n                    console.log(res,insertFn)\r\n                    // 从 res 中找到 url alt href ，然后插入图片\r\n                    insertFn(res.url)\r\n                },\r\n          },\r\n            uploadVideo: {\r\n                fieldName: \"file\",\r\n                server: \"'.U('common/uploads').'\",\r\n                 // 单个文件的最大体积限制，默认为 2M\r\n                maxFileSize: 10000 * 1024 * 1024 * 1024, // 1M\r\n            \r\n                // 最多可上传几个文件，默认为 100\r\n                maxNumberOfFiles: 100,\r\n     \r\n                allowedFileTypes: [\"video/*\"],\r\n                // 超时时间，默认为 10 秒\r\n                timeout: 30 * 60 * 1000, // 5 秒\r\n                 // 单个文件上传成功之后\r\n                //onSuccess(file: File, res: any) {  // TS 语法\r\n                onSuccess(file, res) {          // JS 语法\r\n                    console.log(`${file.name} 上传成功`, res)\r\n                    if(res.code!=0){\r\n                        alert(res.error)\r\n                    }\r\n                },\r\n            \r\n                // 单个文件上传失败\r\n                //onFailed(file: File, res: any) {   // TS 语法\r\n                onFailed(file, res) {           // JS 语法\r\n                    console.log(`${file.name} 上传失败`, res)\r\n                },\r\n            \r\n                // 上传错误，或者触发 timeout 超时\r\n                //onError(file: File, err: any, res: any) {  // TS 语法\r\n                onError(file, err, res) {               // JS 语法\r\n                    console.log(`${file.name} 上传出错`, err, res)\r\n                },\r\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\r\n                customInsert(res, insertFn) {                  // JS 语法\r\n                    // res 即服务端的返回结果\r\n                    console.log(res,insertFn)\r\n                    // 从 res 中找到 url alt href ，然后插入图片\r\n                    insertFn(res.url)\r\n                },\r\n          },\r\n        },\r\n        onChange(editor) {\r\n          var html = editor.getHtml()\r\n          var num = 0,\r\n            reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\r\n            while (num < html.length && html != \"\")\r\n            {\r\n              num++;\r\n              let k = html.match(reg);\r\n              if (k) {\r\n                html = html.replace(k[0], \"\");\r\n              }\r\n            } \r\n          document.getElementById(\"editor-content-textarea-'.$v['field'].$rd.'\").value = html\r\n        }\r\n      }\r\n    })\r\n     class MyMenu'.$v['field'].$rd.' {\r\n      constructor() {\r\n        this.title = \"HTML\"\r\n        this.tag = \"button\"\r\n        this.sourceActive = false\r\n      }\r\n      getValue(editor) {\r\n        if (this.sourceActive) {\r\n            return editor.getText()\r\n        } else {\r\n            return editor.getHtml()\r\n        }\r\n    \r\n      }\r\n      isActive(editor) {\r\n         return this.sourceActive\r\n      }\r\n      isDisabled(editor) {\r\n        return false // or true\r\n      }\r\n      exec(editor, value) {\r\n            this.sourceActive = !this.sourceActive\r\n            editor.clear()\r\n            E_'.$v['field'].$rd.'.SlateTransforms.setNodes(editor, { type: \"paragraph\" }, { mode: \"highest\"})\r\n            var num = 0,\r\n            reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\r\n            while (num < value.length && value != \"\")\r\n            {\r\n              num++;\r\n              let k = value.match(reg);\r\n              if (k) {\r\n                value = value.replace(k[0], \"\");\r\n              }\r\n            } \r\n            if (this.isActive()) {\r\n                editor.insertText(value)\r\n            } else {\r\n                editor.dangerouslyInsertHtml(value)\r\n            }\r\n        \r\n\r\n\r\n      }\r\n    }\r\n    \r\n    // 图库菜单类\r\n    class MyGalleryMenu'.$v['field'].$rd.' {\r\n      constructor() {\r\n        this.title = \"图库\"\r\n        this.tag = \"button\"\r\n      }\r\n      getValue(editor) {\r\n        return \"\"\r\n      }\r\n      isActive(editor) {\r\n        return false\r\n      }\r\n      isDisabled(editor) {\r\n        return false\r\n      }\r\n      exec(editor, value) {\r\n        // 显示图库模态框\r\n        document.getElementById(\"image-library-modal-'.$v['field'].$rd.'\").style.display = \"block\"\r\n        // 加载图片列表\r\n        loadImageLibrary('.$v['field'].$rd.')\r\n      }\r\n    }\r\n    \r\n    const myMenuConf'.$v['field'].$rd.' = {\r\n      key: \"'.$v['field'].$rd.'html\",\r\n      factory() {\r\n        return new MyMenu'.$v['field'].$rd.'()\r\n      }\r\n    }\r\n    \r\n    const myGalleryMenuConf'.$v['field'].$rd.' = {\r\n      key: \"'.$v['field'].$rd.'gallery\",\r\n      factory() {\r\n        return new MyGalleryMenu'.$v['field'].$rd.'()\r\n      }\r\n    }\r\n    \r\n     E_'.$v['field'].$rd.'.Boot.registerMenu(myMenuConf'.$v['field'].$rd.')\r\n     E_'.$v['field'].$rd.'.Boot.registerMenu(myGalleryMenuConf'.$v['field'].$rd.')\r\n    window.toolbar = E_'.$v['field'].$rd.'.createToolbar({\r\n      editor,\r\n      selector: \"#editor-toolbar-'.$v['field'].$rd.'\",\r\n      config: {\r\n      \tinsertKeys: {\r\n          index: 0,\r\n          keys: [\"'.$v['field'].$rd.'html\", \"'.$v['field'].$rd.'gallery\"],\r\n        }\r\n      }\r\n    })\r\n        \r\n\t})\r\n\t\r\n\t// 加载图片库函数\r\n\tvar galleryPage'.$v['field'].$rd.' = 1;\r\n\tvar galleryPageSize'.$v['field'].$rd.' = 20;\r\n\tvar galleryTotalCount'.$v['field'].$rd.' = 0;\r\n\t\r\n\tfunction loadImageLibrary(fieldRd, page) {\r\n\t\tif(page) galleryPage'.$v['field'].$rd.' = page;\r\n\t\tvar imageList = document.getElementById(\"image-list-\"+fieldRd);\r\n\t\timageList.innerHTML = `<div style=\"text-align:center; padding:50px;\">加载中...</div>`;\r\n\t\t\r\n\t\t// 模拟加载图片，实际项目中应该从服务器获取已上传的图片列表\r\n\t\t// 这里假设服务器返回JSON格式的图片列表\r\n\t\t$.ajax({\r\n\t\t\turl: \"'.U('Sys/pictures').'\",\r\n\t\t\ttype: \"GET\",\r\n\t\t\tdata: {ajax:1, page: galleryPage'.$v['field'].$rd.', pageSize: galleryPageSize'.$v['field'].$rd.'},\r\n\t\t\tdataType: \"json\",\r\n\t\t\tsuccess: function(res) {\r\n\t\t\t\tif(res.code == 0 && res.data && res.data.length > 0) {\r\n\t\t\t\t\timageList.innerHTML = \"\";\r\n\t\t\t\t\tres.data.forEach(function(image) {\r\n\t\t\t\t\t\tvar imageItem = document.createElement(\"div\");\r\n\t\t\t\t\t\timageItem.style.cssText = \"position:relative; border:2px solid transparent; cursor:pointer; transition:all 0.3s;\";\r\n\t\t\t\t\t\timageItem.innerHTML = `\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"position:absolute; top:5px; left:5px; z-index:10;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"custom-checkbox\" style=\"width:20px; height:20px; border:2px solid #ccc; border-radius:3px; background:white; display:flex; align-items:center; justify-content:center; cursor:pointer;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"checkmark\" style=\"display:none; color:#1890ff; font-size:14px; font-weight:bold;\">✓</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"checkbox\" style=\"display:none;\" data-src=\"${image.litpic}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img src=\"${image.litpic}\" style=\"width:100%; height:120px; object-fit:cover; border-radius:3px;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t`;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// 点击图片切换选中状态\r\n\t\t\t\t\t\timageItem.addEventListener(\"click\", function(e) {\r\n\t\t\t\t\t\t\tvar checkbox = this.querySelector(\"input[type=\\\"checkbox\\\"]\");\r\n\t\t\t\t\t\t\tvar customCheckbox = this.querySelector(\".custom-checkbox\");\r\n\t\t\t\t\t\t\tvar checkmark = this.querySelector(\".checkmark\");\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tcheckbox.checked = !checkbox.checked;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// 更新自定义复选框显示\r\n\t\t\t\t\t\t\tif(checkbox.checked) {\r\n\t\t\t\t\t\t\t\tcustomCheckbox.style.borderColor = \"#1890ff\";\r\n\t\t\t\t\t\t\t\tcustomCheckbox.style.backgroundColor = \"#1890ff\";\r\n\t\t\t\t\t\t\t\tcheckmark.style.display = \"block\";\r\n\t\t\t\t\t\t\t\tcheckmark.style.color = \"white\";\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tcustomCheckbox.style.borderColor = \"#ccc\";\r\n\t\t\t\t\t\t\t\tcustomCheckbox.style.backgroundColor = \"white\";\r\n\t\t\t\t\t\t\t\tcheckmark.style.display = \"none\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// 更新边框样式\r\n\t\t\t\t\t\t\tthis.style.borderColor = checkbox.checked ? \"#1890ff\" : \"transparent\";\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\timageList.appendChild(imageItem);\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 更新分页信息\r\n\t\t\t\t\tgalleryTotalCount'.$v['field'].$rd.' = res.count;\r\n\t\t\t\t\tvar totalPages = Math.ceil(galleryTotalCount'.$v['field'].$rd.' / galleryPageSize'.$v['field'].$rd.');\r\n\t\t\t\t\tdocument.getElementById(\"gallery-page-info-'.$v['field'].$rd.'\").textContent = \"第\"+galleryPage'.$v['field'].$rd.'+\"页 / 共\"+totalPages+\"页\";\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 更新按钮状态\r\n\t\t\t\t\tdocument.getElementById(\"gallery-prev-page-'.$v['field'].$rd.'\").disabled = galleryPage'.$v['field'].$rd.' <= 1;\r\n\t\t\t\t\tdocument.getElementById(\"gallery-next-page-'.$v['field'].$rd.'\").disabled = galleryPage'.$v['field'].$rd.' >= totalPages;\r\n\t\t\t\t} else {\r\n\t\t\t\t\timageList.innerHTML = \"<div style=\\\"text-align:center; padding:50px;\\\">暂无图片</div>\";\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\terror: function() {\r\n\t\t\t\timageList.innerHTML = \"<div style=\\\"text-align:center; padding:50px; color:red;\\\">加载失败</div>\";\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\t    // 关闭模态框\r\n\t\t\tdocument.getElementById(\"close-library-modal-'.$v['field'].$rd.'\").addEventListener(\"click\", function() {\r\n\t\t\t\tdocument.getElementById(\"image-library-modal-'.$v['field'].$rd.'\").style.display = \"none\";\r\n\t\t\t});\r\n\r\n\t\t\t// 插入选中图片\r\n\t\t\tdocument.getElementById(\"insert-selected-images-'.$v['field'].$rd.'\").addEventListener(\"click\", function() {\r\n\t\t\t\tvar selectedCheckboxes = document.querySelectorAll(\"#image-list-'.$v['field'].$rd.' input[type=\\\"checkbox\\\"]:checked\");\r\n\t\t\t\tvar selectedImages = [];\r\n\t\t\t\t\r\n\t\t\t\tselectedCheckboxes.forEach(function(checkbox) {\r\n\t\t\t\t\tselectedImages.push(checkbox.dataset.src);\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\tif(selectedImages.length > 0) {\r\n\t\t\t\t\t// 插入图片到编辑器\r\n\t\t\t\t\tselectedImages.forEach(function(imageUrl) {\r\n\t\t\t\t\t\t// 使用 wangEditor 的 API 插入图片\r\n\t\t\t\t\t\twindow.editor.dangerouslyInsertHtml(`<img src=\"${imageUrl}\" alt=\"\" style=\"width: 200px;\">`);\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 关闭模态框\r\n\t\t\t\t\tdocument.getElementById(\"image-library-modal-'.$v['field'].$rd.'\").style.display = \"none\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\talert(\"请先选择图片\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t// 分页控制函数\r\n\tdocument.getElementById(\"gallery-prev-page-'.$v['field'].$rd.'\").addEventListener(\"click\", function() {\r\n\t\tif(galleryPage'.$v['field'].$rd.' > 1) {\r\n\t\t\tloadImageLibrary(\"'.$v['field'].$rd.'\", galleryPage'.$v['field'].$rd.' - 1);\r\n\t\t}\r\n\t});\r\n\t\r\n\tdocument.getElementById(\"gallery-next-page-'.$v['field'].$rd.'\").addEventListener(\"click\", function() {\r\n\t\tvar totalPages = Math.ceil(galleryTotalCount'.$v['field'].$rd.' / galleryPageSize'.$v['field'].$rd.');\r\n\t\tif(galleryPage'.$v['field'].$rd.' < totalPages) {\r\n\t\t\tloadImageLibrary(\"'.$v['field'].$rd.'\", galleryPage'.$v['field'].$rd.' + 1);\r\n\t\t}\r\n\t});\r\n\r\n\t\t   </script>';\r\n}else{\r\n    $html = '<div class=\"layui-form-item layui-form-text\">\r\n\t\t\t<label for=\"'.$v['field'].'\" class=\"layui-form-label\">\r\n\t\t\t\t'.$v['fieldname'].'\r\n\t\t\t</label>\r\n\t\t\t<div class=\"layui-input-block\" style=\"width:100%;\">\r\n\t\t\r\n\t\t\t\t <div style=\"border: 1px solid #ccc;\">\r\n                    <div id=\"editor-toolbar-'.$v['field'].$rd.'\" style=\"border-bottom: 1px solid #ccc;\"></div>\r\n                    <div id=\"editor-text-area-'.$v['field'].$rd.'\" style=\"height: 350px\"></div>\r\n                  </div>\r\n                  <!-- 显示内容 -->\r\n                  <div style=\"margin-top: 20px;\">\r\n                    <textarea id=\"editor-content-textarea-'.$v['field'].$rd.'\" style=\"display:none\" name=\"'.$v['field'].'\">'.$data[$v['field']].'</textarea>\r\n                  </div>\r\n                  \r\n                  <!-- 图库模态框 -->\r\n                  <div id=\"image-library-modal-'.$v['field'].$rd.'\" style=\"display:none; position:fixed; top:0; left:0; right:0; bottom:0; background:rgba(0,0,0,0.5); z-index:1000;\">\r\n                    <div style=\"position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); width:80%; height:80%; background:white; border-radius:5px; overflow:hidden;\">\r\n                      <div style=\"padding:20px; border-bottom:1px solid #eee; display:flex; justify-content:space-between; align-items:center;\">\r\n                        <h3>本地图库</h3>\r\n                        <button id=\"close-library-modal-'.$v['field'].$rd.'\" type=\"button\" style=\"padding:5px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer;\">关闭</button>\r\n                      </div>\r\n                      <div id=\"image-library-content-'.$v['field'].$rd.'\" style=\"padding:20px; height:calc(100% - 170px); overflow-y:auto;\">\r\n                        <div id=\"image-list-'.$v['field'].$rd.'\" style=\"display:grid; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr)); gap:15px;\">\r\n                          <!-- 图片将通过JS动态加载 -->\r\n                        </div>\r\n                      </div>\r\n                      <div style=\"padding:15px 20px; border-top:1px solid #eee; display:flex; justify-content:space-between; align-items:center;\">\r\n                        <div id=\"gallery-page-info-'.$v['field'].$rd.'\" style=\"color:#666; font-size:14px;\">第1页 / 共1页</div>\r\n                        <div style=\"display:flex; gap:10px;\">\r\n                          <button id=\"gallery-prev-page-'.$v['field'].$rd.'\" type=\"button\" style=\"padding:6px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer; color:#666;\">上一页</button>\r\n                          <button id=\"gallery-next-page-'.$v['field'].$rd.'\" type=\"button\" style=\"padding:6px 15px; background:#f0f0f0; border:none; border-radius:3px; cursor:pointer; color:#666;\">下一页</button>\r\n                          <button id=\"insert-selected-images-'.$v['field'].$rd.'\" type=\"button\" style=\"padding:6px 20px; background:#1890ff; color:white; border:none; border-radius:3px; cursor:pointer;\">插入选中图片</button>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n           \r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<script>\r\n\t\t\t\r\n           \r\n\t$(document).ready(function (){\r\n    var html = document.getElementById(\"editor-content-textarea-'.$v['field'].$rd.'\").value\r\n     var E_'.$v['field'].$rd.' = window.wangEditor\r\n    // 切换语言\r\n    E_'.$v['field'].$rd.'.i18nChangeLanguage(\"zh-CN\")\r\n    window.editor = E_'.$v['field'].$rd.'.createEditor({\r\n      selector: \"#editor-text-area-'.$v['field'].$rd.'\",\r\n      html: html,\r\n      config: {\r\n        placeholder: \"请输入内容...\",\r\n        MENU_CONF: {\r\n            uploadImage: {\r\n                fieldName: \"file\",\r\n                server: \"'.U('common/uploads').'\",\r\n                 // 单个文件的最大体积限制，默认为 2M\r\n                maxFileSize: 100 * 1024 * 1024, // 1M\r\n            \r\n                // 最多可上传几个文件，默认为 100\r\n                maxNumberOfFiles: 100,\r\n           \r\n                allowedFileTypes: [\"image/*\"],\r\n                // 超时时间，默认为 10 秒\r\n                timeout: 10 * 60 * 1000, // 5 秒\r\n                 // 单个文件上传成功之后\r\n                //onSuccess(file: File, res: any) {  // TS 语法\r\n                onSuccess(file, res) {          // JS 语法\r\n                    console.log(`${file.name} 上传成功`, res)\r\n                    if(res.code!=0){\r\n                        alert(res.error)\r\n                    }\r\n                },\r\n            \r\n                // 单个文件上传失败\r\n                //onFailed(file: File, res: any) {   // TS 语法\r\n                onFailed(file, res) {           // JS 语法\r\n                    console.log(`${file.name} 上传失败`, res)\r\n                },\r\n            \r\n                // 上传错误，或者触发 timeout 超时\r\n                //onError(file: File, err: any, res: any) {  // TS 语法\r\n                onError(file, err, res) {               // JS 语法\r\n                    console.log(`${file.name} 上传出错`, err, res)\r\n                },\r\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\r\n                customInsert(res, insertFn) {                  // JS 语法\r\n                    // res 即服务端的返回结果\r\n                    console.log(res,insertFn)\r\n                    // 从 res 中找到 url alt href ，然后插入图片\r\n                    insertFn(res.url)\r\n                },\r\n          },\r\n            uploadVideo: {\r\n                fieldName: \"file\",\r\n                server: \"'.U('common/uploads').'\",\r\n                 // 单个文件的最大体积限制，默认为 2M\r\n                maxFileSize: 10000 * 1024 * 1024 * 1024, // 1M\r\n            \r\n                // 最多可上传几个文件，默认为 100\r\n                maxNumberOfFiles: 100,\r\n     \r\n                allowedFileTypes: [\"video/*\"],\r\n                // 超时时间，默认为 10 秒\r\n                timeout: 30 * 60 * 1000, // 5 秒\r\n                 // 单个文件上传成功之后\r\n                //onSuccess(file: File, res: any) {  // TS 语法\r\n                onSuccess(file, res) {          // JS 语法\r\n                    console.log(`${file.name} 上传成功`, res)\r\n                    if(res.code!=0){\r\n                        alert(res.error)\r\n                    }\r\n                },\r\n            \r\n                // 单个文件上传失败\r\n                //onFailed(file: File, res: any) {   // TS 语法\r\n                onFailed(file, res) {           // JS 语法\r\n                    console.log(`${file.name} 上传失败`, res)\r\n                },\r\n            \r\n                // 上传错误，或者触发 timeout 超时\r\n                //onError(file: File, err: any, res: any) {  // TS 语法\r\n                onError(file, err, res) {               // JS 语法\r\n                    console.log(`${file.name} 上传出错`, err, res)\r\n                },\r\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\r\n                customInsert(res, insertFn) {                  // JS 语法\r\n                    // res 即服务端的返回结果\r\n                    console.log(res,insertFn)\r\n                    // 从 res 中找到 url alt href ，然后插入图片\r\n                    insertFn(res.url)\r\n                },\r\n          },\r\n        },\r\n        onChange(editor) {\r\n          var html = editor.getHtml()\r\n          var num = 0,\r\n          reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\r\n          while (num < html.length && html != \"\")\r\n          {\r\n            num++;\r\n            let k = html.match(reg);\r\n            if (k) {\r\n              html = html.replace(k[0], \"\");\r\n            }\r\n          } \r\n          document.getElementById(\"editor-content-textarea-'.$v['field'].$rd.'\").value = html\r\n        }\r\n      }\r\n    })\r\n    class MyMenu'.$v['field'].$rd.' {\r\n      constructor() {\r\n        this.title = \"源码\"\r\n        this.tag = \"button\"\r\n        this.sourceActive = false\r\n      }\r\n      getValue(editor) {\r\n        if (this.sourceActive) {\r\n            return editor.getText()\r\n        } else {\r\n            return editor.getHtml()\r\n        }\r\n    \r\n      }\r\n      isActive(editor) {\r\n         return this.sourceActive\r\n      }\r\n      isDisabled(editor) {\r\n        return false // or true\r\n      }\r\n      exec(editor, value) {\r\n            this.sourceActive = !this.sourceActive\r\n            editor.clear()\r\n            E_'.$v['field'].$rd.'.SlateTransforms.setNodes(editor, { type: \"paragraph\" }, { mode: \"highest\"})\r\n            var num = 0,\r\n            reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\r\n            while (num < value.length && value != \"\")\r\n            {\r\n              num++;\r\n              let k = value.match(reg);\r\n              if (k) {\r\n                value = value.replace(k[0], \"\");\r\n              }\r\n            } \r\n            if (this.isActive()) {\r\n                editor.insertText(value)\r\n            } else {\r\n                editor.dangerouslyInsertHtml(value)\r\n            }\r\n        \r\n\r\n\r\n      }\r\n    }\r\n    \r\n    // 图库菜单类\r\n    class MyGalleryMenu'.$v['field'].$rd.' {\r\n      constructor() {\r\n        this.title = \"图库\"\r\n        this.tag = \"button\"\r\n      }\r\n      getValue(editor) {\r\n        return \"\"\r\n      }\r\n      isActive(editor) {\r\n        return false\r\n      }\r\n      isDisabled(editor) {\r\n        return false\r\n      }\r\n      exec(editor, value) {\r\n        // 显示图库模态框\r\n        document.getElementById(\"image-library-modal-'.$v['field'].$rd.'\").style.display = \"block\"\r\n        // 加载图片列表\r\n        loadImageLibrary(\"'.$v['field'].$rd.'\")\r\n      }\r\n    }\r\n    \r\n    const myMenuConf'.$v['field'].$rd.' = {\r\n      key: \"'.$v['field'].$rd.'html\",\r\n      factory() {\r\n        return new MyMenu'.$v['field'].$rd.'()\r\n      }\r\n    }\r\n    \r\n    const myGalleryMenuConf'.$v['field'].$rd.' = {\r\n      key: \"'.$v['field'].$rd.'gallery\",\r\n      factory() {\r\n        return new MyGalleryMenu'.$v['field'].$rd.'()\r\n      }\r\n    }\r\n    \r\n     E_'.$v['field'].$rd.'.Boot.registerMenu(myMenuConf'.$v['field'].$rd.')\r\n     E_'.$v['field'].$rd.'.Boot.registerMenu(myGalleryMenuConf'.$v['field'].$rd.')\r\n    window.toolbar = E_'.$v['field'].$rd.'.createToolbar({\r\n      editor,\r\n      selector: \"#editor-toolbar-'.$v['field'].$rd.'\",\r\n      config: {\r\n      \tinsertKeys: {\r\n          index: 0,\r\n          keys: [\"'.$v['field'].$rd.'html\", \"'.$v['field'].$rd.'gallery\"],\r\n        }\r\n      }\r\n    })\r\n        \r\n\r\n        \r\n\t})\r\n\r\n\t\t\t// 加载图片库函数\r\n\t\t\tvar galleryPage'.$v['field'].$rd.' = 1;\r\n\t\t\tvar galleryPageSize'.$v['field'].$rd.' = 20;\r\n\t\t\tvar galleryTotalCount'.$v['field'].$rd.' = 0;\r\n\t\t\t\r\n\t\t\tfunction loadImageLibrary(fieldRd, page) {\r\n\t\t\t\tif(page) galleryPage'.$v['field'].$rd.' = page;\r\n\t\t\t\tvar imageList = document.getElementById(\"image-list-\"+fieldRd);\r\n\t\t\t\timageList.innerHTML = `<div style=\"text-align:center; padding:50px;\">加载中...</div>`;\r\n\t\t\t\t\r\n\t\t\t\t// 模拟加载图片，实际项目中应该从服务器获取已上传的图片列表\r\n\t\t\t\t// 这里假设服务器返回JSON格式的图片列表\r\n\t\t\t\t$.ajax({\r\n\t\t\t\t\turl: \"'.U('Sys/pictures').'\",\r\n\t\t\t\t\ttype: \"GET\",\r\n\t\t\t\t\tdata: {ajax:1, page: galleryPage'.$v['field'].$rd.', pageSize: galleryPageSize'.$v['field'].$rd.'},\r\n\t\t\t\t\tdataType: \"json\",\r\n\t\t\t\t\tsuccess: function(res) {\r\n\t\t\t\t\t\tif(res.code == 0 && res.data && res.data.length > 0) {\r\n\t\t\t\t\t\t\timageList.innerHTML = \"\";\r\n\t\t\t\t\t\t\tres.data.forEach(function(image) {\r\n\t\t\t\t\t\t\t\tvar imageItem = document.createElement(\"div\");\r\n\t\t\t\t\t\t\t\timageItem.style.cssText = \"position:relative; border:2px solid transparent; cursor:pointer; transition:all 0.3s;\";\r\n\t\t\t\t\t\t\t\timageItem.innerHTML = `\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div style=\"position:absolute; top:5px; left:5px; z-index:10;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"custom-checkbox\" style=\"width:20px; height:20px; border:2px solid #ccc; border-radius:3px; background:white; display:flex; align-items:center; justify-content:center; cursor:pointer;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"checkmark\" style=\"display:none; color:#1890ff; font-size:14px; font-weight:bold;\">✓</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"checkbox\" style=\"display:none;\" data-src=\"${image.litpic}\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img src=\"${image.litpic}\" style=\"width:100%; height:120px; object-fit:cover; border-radius:3px;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t`;\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t// 点击图片切换选中状态\r\n\t\t\t\t\t\t\t\timageItem.addEventListener(\"click\", function(e) {\r\n\t\t\t\t\t\t\t\t\tvar checkbox = this.querySelector(\"input[type=\\\"checkbox\\\"]\");\r\n\t\t\t\t\t\t\t\t\tvar customCheckbox = this.querySelector(\".custom-checkbox\");\r\n\t\t\t\t\t\t\t\t\tvar checkmark = this.querySelector(\".checkmark\");\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tcheckbox.checked = !checkbox.checked;\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t// 更新自定义复选框显示\r\n\t\t\t\t\t\t\t\t\tif(checkbox.checked) {\r\n\t\t\t\t\t\t\t\t\t\tcustomCheckbox.style.borderColor = \"#1890ff\";\r\n\t\t\t\t\t\t\t\t\t\tcustomCheckbox.style.backgroundColor = \"#1890ff\";\r\n\t\t\t\t\t\t\t\t\t\tcheckmark.style.display = \"block\";\r\n\t\t\t\t\t\t\t\t\t\tcheckmark.style.color = \"white\";\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tcustomCheckbox.style.borderColor = \"#ccc\";\r\n\t\t\t\t\t\t\t\t\t\tcustomCheckbox.style.backgroundColor = \"white\";\r\n\t\t\t\t\t\t\t\t\t\tcheckmark.style.display = \"none\";\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t// 更新边框样式\r\n\t\t\t\t\t\t\t\t\tthis.style.borderColor = checkbox.checked ? \"#1890ff\" : \"transparent\";\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\timageList.appendChild(imageItem);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// 更新分页信息\r\n\t\t\t\t\t\t\tgalleryTotalCount'.$v['field'].$rd.' = res.count;\r\n\t\t\t\t\t\t\tvar totalPages = Math.ceil(galleryTotalCount'.$v['field'].$rd.' / galleryPageSize'.$v['field'].$rd.');\r\n\t\t\t\t\t\t\tdocument.getElementById(\"gallery-page-info-'.$v['field'].$rd.'\").textContent = \"第\"+galleryPage'.$v['field'].$rd.'+\"页 / 共\"+totalPages+\"页\";\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// 更新按钮状态\r\n\t\t\t\t\t\t\tdocument.getElementById(\"gallery-prev-page-'.$v['field'].$rd.'\").disabled = galleryPage'.$v['field'].$rd.' <= 1;\r\n\t\t\t\t\t\t\tdocument.getElementById(\"gallery-next-page-'.$v['field'].$rd.'\").disabled = galleryPage'.$v['field'].$rd.' >= totalPages;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\timageList.innerHTML = \"<div style=\\\"text-align:center; padding:50px;\\\">暂无图片</div>\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror: function() {\r\n\t\t\t\t\t\timageList.innerHTML = \"<div style=\\\"text-align:center; padding:50px; color:red;\\\">加载失败</div>\";\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// 关闭模态框\r\n\t\t\tdocument.getElementById(\"close-library-modal-'.$v['field'].$rd.'\").addEventListener(\"click\", function() {\r\n\t\t\t\tdocument.getElementById(\"image-library-modal-'.$v['field'].$rd.'\").style.display = \"none\";\r\n\t\t\t});\r\n\r\n\t\t\t// 插入选中图片\r\n\t\t\tdocument.getElementById(\"insert-selected-images-'.$v['field'].$rd.'\").addEventListener(\"click\", function() {\r\n\t\t\t\tvar selectedCheckboxes = document.querySelectorAll(\"#image-list-'.$v['field'].$rd.' input[type=\\\"checkbox\\\"]:checked\");\r\n\t\t\t\tvar selectedImages = [];\r\n\t\t\t\t\r\n\t\t\t\tselectedCheckboxes.forEach(function(checkbox) {\r\n\t\t\t\t\tselectedImages.push(checkbox.dataset.src);\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\tif(selectedImages.length > 0) {\r\n\t\t\t\t\t// 插入图片到编辑器\r\n\t\t\t\t\tselectedImages.forEach(function(imageUrl) {\r\n\t\t\t\t\t\t// 使用 wangEditor 的 API 插入图片\r\n\t\t\t\t\t\twindow.editor.dangerouslyInsertHtml(`<img src=\"${imageUrl}\" alt=\"\" style=\"width: 200px;\">`);\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\t// 关闭模态框\r\n\t\t\t\t\tdocument.getElementById(\"image-library-modal-'.$v['field'].$rd.'\").style.display = \"none\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\talert(\"请先选择图片\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// 分页控制函数\r\n\t\t\tdocument.getElementById(\"gallery-prev-page-'.$v['field'].$rd.'\").addEventListener(\"click\", function() {\r\n\t\t\t\tif(galleryPage'.$v['field'].$rd.' > 1) {\r\n\t\t\t\t\tloadImageLibrary(\"'.$v['field'].$rd.'\", galleryPage'.$v['field'].$rd.' - 1);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\tdocument.getElementById(\"gallery-next-page-'.$v['field'].$rd.'\").addEventListener(\"click\", function() {\r\n\t\t\t\tvar totalPages = Math.ceil(galleryTotalCount'.$v['field'].$rd.' / galleryPageSize'.$v['field'].$rd.');\r\n\t\t\t\tif(galleryPage'.$v['field'].$rd.' < totalPages) {\r\n\t\t\t\t\tloadImageLibrary(\"'.$v['field'].$rd.'\", galleryPage'.$v['field'].$rd.' + 1);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t</script>';\r\n    return $html;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "app/admin/t/tpl/ctype.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n    <meta charset=\"UTF-8\">\n    {include=\"style\"}\n\t{include=\"edit\"}\n\t<style>\n\tbody .layui-layer-demo .layui-layer-title{background:#009688; color:#fff; border: none;}\n\tbody .layui-layer-demo .layui-layer-content{padding:20px;line-height: 24px;}\n\t.layui-sys-icon {\n\t\tfont-size: 20px;\n\t\tcursor: pointer;\n\t\tcolor: #01AAED;\n\t}\n\t\n\t.layui-form-pane .layui-form-label {\n\t\tmin-width: 150px;\n\t\twidth: auto;\n\t}\n\t@media screen and (max-width: 900px) {\n\t\t.layui-form-item .layui-input-inline {\n\t\t\twidth: 100%;\n\t\t}\n\t\t.layui-form-item.layui-form-text{\n\t\t\twidth:100%;\n\t\t}\n\t}\n\t@media screen and (min-width: 900px) {\n\t\t.layui-form-item .layui-input-inline {\n\t\t\twidth: 45%;\n\t\t}\n\t\t.layui-form-item.layui-form-text{\n\t\t\twidth:60%;\n\t\t}\n\t}\n\t.copy{ cursor:pointer;}\n\t.m-form{\n\t\tpadding: 25px;\n\t}\n\t.m-form input{\n\t\tmargin:5px 0px;\n\t}\n\t.m-form .layui-input-block{\n\t\tmargin-left:0px;\n\t}\n\t</style>\n\n  </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统设置')}</cite></a>\n              <a><cite>{$ctypedata['title']}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-sm\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <form class=\"layui-form layui-form-pane\" >\n\t\t<input name=\"isorder\" value=\"1\" type=\"hidden\">\n        <div class=\"x-body\">\n            <div class=\"layui-tab layui-tab-brief\" lay-filter=\"docDemoTabBrief\">\n              <ul class=\"layui-tab-title\">\n\t\t\t  \n\t\t\t  <li>{$ctypedata['title']}</li>\n\t\t\t  {if($admin['gid']==1)}\n\t\t\t  <li>{fun JZLANG('自定义配置')}</li>\n              {/if}\n              </ul>\n\n              <div class=\"layui-tab-content\" >\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\t\t{loop table=\"sysconfig\" typeid=\"$ctypedata['id']\" orderby=\"orders desc,id asc\" as=\"v\"}\n\t\t\t\t\t\t{if($v['type']==1)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"layui-form-item\" >\n                            <label  class=\"layui-form-label\">\n                                {fun JZLANG($v['title'])}\n                            </label>\n                            <div class=\"layui-inline\">\n                              <input name=\"{$v['field']}\" type=\"text\" class=\"layui-input\" id=\"{$v['field']}\" value=\"{$v['data']}\">\n                            </div>\n                             <div class=\"layui-inline\">\n                                <button type=\"button\" class=\"layui-btn\" id=\"{$v['field']}_upload\">\n                                <i class=\"layui-icon layui-icon-add-circle\"></i>{fun JZLANG('上传图片')}\n                                </button><input class=\"layui-upload-file\" type=\"file\" accept=\"image/*\" name=\"file\">\n                             </div>\n\t\t\t\t\t\t\t{if($v['tip'])}\n\t\t\t\t\t\t\t<i data-info=\"{fun JZLANG($v['tip'])}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t\t<input name=\"orders[{$v['field']}]\" type=\"text\" class=\"layui-input\" value=\"{$v['orders']}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\n\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-xs\" type=\"button\" onclick=\"edit({$v['id']},'{$v['field']}',{$v['type']},'{$v['title']}','{$v['tip']}','{$v['typeid']}','{$v['config']}',{$v['orders']})\">{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{if($v['sys']!=1)}\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t \n                            <div class=\"layui-block\">\n                            <img src=\"{$v['data']}\"  id=\"{$v['field']}_img\">\n                            </div>\n\t\t\t\t\t\t\t\n                        </div>\n\t\t\t\t\t\t<script>\n                \n                        layui.use(\"upload\", function(){\n                              var upload_{$v['field']} = layui.upload;\n                               \n                              //执行实例\n                              var uploadInst = upload_{$v['field']}.render({\n                                elem: \"#{$v['field']}_upload\" //绑定元素\n                                ,url: \"{fun U('Common/uploads')}\" //上传接口\n                                ,accept:\"images\"\n                                ,acceptMime:\"image/*\"\n                                ,data:{molds:\"sysconfig\"}\n                                ,done: function(res){\n                                  \n                                    if(res.code==0){\n                                         $(\"#{$v['field']}_img\").attr(\"src\",res.url);\n                                         $(\"#{$v['field']}\").val(res.url);\n                                    }else{\n                                         layer.alert(res.error, {icon: 5});\n                                    }\n                                }\n                                ,error: function(){\n                                  //请求异常回调\n                                  layer.alert(\"{fun JZLANG('上传异常！')}\");\n                                }\n                              });\n                            });\n                        </script>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{else if($v['type']==2)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n                            <label class=\"layui-form-label\">\n                                {$v['title']}\n                            </label>\n                            <div  class=\"layui-input-inline\">\n                                <input type=\"text\" name=\"{$v['field']}\" value=\"{$v['data']}\" autocomplete=\"off\" \n                                class=\"layui-input\">\n\t\t\t\t\t\t\t\t\n                            </div>\n\t\t\t\t\t\t\t{if($v['tip'])}\n\t\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t\t<input name=\"orders[{$v['field']}]\" type=\"text\" class=\"layui-input\" value=\"{$v['orders']}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\n\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-xs\" type=\"button\" onclick=\"edit({$v['id']},'{$v['field']}',{$v['type']},'{$v['title']}','{$v['tip']}','{$v['typeid']}','{$v['config']}',{$v['orders']})\">{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{if($v['sys']!=1)}\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\n                        </div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{else if($v['type']==3)}\n\t\t\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n                            <label  class=\"layui-form-label\">\n                                {$v['title']}  {if($v['tip'])}\n\t\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\n\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-xs\" type=\"button\" onclick=\"edit({$v['id']},'{$v['field']}',{$v['type']},'{$v['title']}','{$v['tip']}','{$v['typeid']}','{$v['config']}',{$v['orders']})\">{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t\t{/if}\n                            </label>\n\t\t\t\t\t\t\t\n                            <div class=\"layui-input-block\">\n                                <textarea  name=\"{$v['field']}\" class=\"layui-textarea\">{$v['data']}</textarea>\n\t\t\t\t\t\t\t\t\n                            </div>\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t\t<input name=\"orders[{$v['field']}]\" type=\"text\" class=\"layui-input\" value=\"{$v['orders']}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if($v['sys']!=1 && $admin['gid']==1)}\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n                        </div>\n\t\t\t\t\t\t{else if($v['type']==4)}\n\t\t\t\t\t\t{php\n\t\t\t\t\t\t$edit = require(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/common/uediter.php');\n\t\t\t\t\t\techo $edit;\n\t\t\t\t\t\t/}\n\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\n\t\t\t\t\t\t<button class=\"layui-btn layui-btn-xs\" type=\"button\" onclick=\"edit({$v['id']},'{$v['field']}',{$v['type']},'{$v['title']}','{$v['tip']}','{$v['typeid']}','{$v['config']}',{$v['orders']})\">{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{if($v['sys']!=1)}\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button></div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{else if($v['type']==5)}\n\t\t\t\t\t\t<div class=\"layui-form-item\" >\n                            <label  class=\"layui-form-label\">\n                                {$v['title']}\n                            </label>\n                            <div class=\"layui-inline\">\n                               \n                              <input name=\"{$v['field']}\" type=\"text\" class=\"layui-input\" id=\"{$v['field']}\" value=\"{$v['data']}\">\n                            </div>\n                             <div class=\"layui-inline\">\n                                <button type=\"button\" class=\"layui-btn\" id=\"{$v['field']}_upload\">\n                                <i class=\"layui-icon layui-icon-add-circle\"></i>{fun JZLANG('上传文件')}\n                                </button><input class=\"layui-upload-file\" type=\"file\" name=\"file\">\n                             </div>\n\t\t\t\t\t\t\t{if($v['tip'])}\n\t\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t\t<input name=\"orders[{$v['field']}]\" type=\"text\" class=\"layui-input\" value=\"{$v['orders']}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\n\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-xs\" type=\"button\" onclick=\"edit({$v['id']},'{$v['field']}',{$v['type']},'{$v['title']}','{$v['tip']}','{$v['typeid']}','{$v['config']}',{$v['orders']})\">{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{if($v['sys']!=1)}\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n                            \n                        </div>\n\t\t\t\t\t\t<script>\n                \n                        layui.use(\"upload\", function(){\n                              var upload_{$v['field']} = layui.upload;\n                               \n                              //执行实例\n                              var uploadInst = upload_{$v['field']}.render({\n                                elem: \"#{$v['field']}_upload\" //绑定元素\n                                ,url: \"{fun U('Common/uploads')}\" //上传接口\n                                ,accept:\"file\"\n\t\t\t\t\t\t\t\t,exts: \"{$webconf['fileType']}\"\n                                ,data:{molds:\"sysconfig\"}\n                                ,done: function(res){\n                                  \n                                    if(res.code==0){\n                                        \n                                         $(\"#{$v['field']}\").val(res.url);\n                                    }else{\n                                         layer.alert(res.error, {icon: 5});\n                                    }\n                                }\n                                ,error: function(){\n                                  //请求异常回调\n                                  layer.alert(\"{fun JZLANG('上传异常！')}\");\n                                }\n                              });\n                            });\n                        </script>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{else if($v['type']==6)}\n\t\t\t\t\t\t<div  class=\"layui-form-item\">\n                            <label   class=\"layui-form-label\">\n                                {$v['title']}\n                            </label>\n                            <div  class=\"layui-input-inline\">\n\t\t\t\t\t\t\t<select name=\"{$v['field']}\" class=\"layui-btn layui-btn-normal\">\n\t\t\t\t\t\t\t<option value=\"\">{fun JZLANG('请选择')}</option>\n\t\t\t\t\t\t\t{php\n\t\t\t\t\t\t\t$v['config'] = str_replace('，',',',$v['config']);\n\t\t\t\t\t\t\t$select = explode(',',$v['config']);\n\t\t\t\t\t\t\t/}\n\t\t\t\t\t\t\t{foreach $select as $vv}\n\t\t\t\t\t\t\t{php\n\t\t\t\t\t\t\t$d = explode('=',$vv);\n\t\t\t\t\t\t\t/}\n\t\t\t\t\t\t\t<option value=\"{$d[1]}\" {if($v['data']==$d[1])}selected{/if}>{$d[0]}</option>\n\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</select>\n                            </div>\n\t\t\t\t\t\t\t{if($v['tip'])}\n\t\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t\t<input name=\"orders[{$v['field']}]\" type=\"text\" class=\"layui-input\" value=\"{$v['orders']}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\n\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-xs\" type=\"button\" onclick=\"edit({$v['id']},'{$v['field']}',{$v['type']},'{$v['title']}','{$v['tip']}','{$v['typeid']}','{$v['config']}',{$v['orders']})\">{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{if($v['sys']!=1)}\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n                        </div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{else if($v['type']==7)}\n\t\t\t\t\t\t<div  class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label   class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t{$v['title']}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div  class=\"layui-input-inline\">\n\t\t\t\t\t\t\t<select name=\"{$v['field']}\" id=\"{$v['field']}\" class=\"layui-btn layui-btn-normal\">\n\t\t\t\t\t\t\t<option value=\"0\" >{fun JZLANG('不选')}</option>\n\t\t\t\t\t\t\t{foreach $classtypetree as $vv}\n\t\t\t\t\t\t\t{if($vv['id']==$v['data'])}\n\t\t\t\t\t\t\t<option selected value=\"{$vv['id']}\">{fun str_repeat('--', $vv['level']).$vv['classname']}</option>\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t<option  value=\"{$vv['id']}\">{fun str_repeat('--', $vv['level']).$vv['classname']}</option>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{if($v['tip'])}\n\t\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t\t<input name=\"orders[{$v['field']}]\" type=\"text\" class=\"layui-input\" value=\"{$v['orders']}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\n\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-xs\" type=\"button\" onclick=\"edit({$v['id']},'{$v['field']}',{$v['type']},'{$v['title']}','{$v['tip']}','{$v['typeid']}','{$v['config']}',{$v['orders']})\">{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{if($v['sys']!=1)}\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{else if($v['type']==8)}\n\t\t\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n                            <label  class=\"layui-form-label\">\n                                {$v['title']}  <span class=\"x-red\">{$v['tip']}</span>\n\t\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\n\t\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-xs\" type=\"button\" onclick=\"edit({$v['id']},'{$v['field']}',{$v['type']},'{$v['title']}','{$v['tip']}','{$v['typeid']}','{$v['config']}',{$v['orders']})\">{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t\t\t{/if}\n                            </label>\n                            <div class=\"layui-input-block\">\n                                <textarea  name=\"{$v['field']}\" class=\"layui-textarea\">{$v['data']}</textarea>\n\t\t\t\t\t\t\t\t\n                            </div>\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\n\t\t\t\t\t\t\t<div  class=\"layui-inline\">\n\t\t\t\t\t\t\t\t<input name=\"orders[{$v['field']}]\" type=\"text\" class=\"layui-input\" value=\"{$v['orders']}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if($v['sys']!=1 && $admin['gid']==1)}\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n                        </div>\n\n\t\t\t\t\t\t{/if}\n                        \n                        {/loop}\n                        \n                       \n                     {if($v['id']>7 && $admin['gid']==1)}\n\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t<button type=\"button\" lay-filter=\"delconfig\" data=\"{$s['id']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除配置栏')}</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t {/if}\n                    \n                    <div style=\"height:100px;\"></div>\n                </div>\n                \n\t\t\t\t\n\t\t\t\t<div class=\"layui-tab-item \">\n\t\t\t\t {if($admin['gid']==1)}\n\t\t\t\t\t\t\n\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t  <legend>{fun JZLANG('自定义配置')}</legend>\n\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t\t<label  class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t\t{fun JZLANG('新增配置')}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<div class=\"layui-inline\" >\n\t\t\t\t\t\t\t\t\t<select class=\"layui-btn layui-btn-normal\" name=\"custom_type\" id=\"custom_type\" >\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('选择类型')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('图片')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('单行文本')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"3\">{fun JZLANG('多行文本')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"4\">{fun JZLANG('编辑器')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"5\">{fun JZLANG('文件上传')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"6\">{fun JZLANG('下拉选项')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"7\">{fun JZLANG('栏目选项')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"8\">{fun JZLANG('代码')}</option>\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t\t\t<input type=\"text\" id=\"custom_title\" name=\"custom_title\" autocomplete=\"off\" placeholder=\"{fun JZLANG('请填写配置名(中文)')}\"\n\t\t\t\t\t\t\t\t\tclass=\"layui-input\">\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t\t\t<input type=\"text\" id=\"custom_fields\" name=\"custom_fields\" autocomplete=\"off\" placeholder=\"{fun JZLANG('配置标识(字母或数字)')}\"\n\t\t\t\t\t\t\t\t\tclass=\"layui-input\">\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t\t <button lay-filter=\"*\" lay-submit=\"\" class=\"layui-btn\"><i class=\"iconfont\">&#xe6b9;</i>{fun JZLANG('添加')}</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t<label  class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t\t{fun JZLANG('配置栏目')}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<div class=\"layui-inline\" >\n\t\t\t\t\t\t\t\t\t<select class=\"layui-btn layui-btn-normal\" name=\"custom_ctype\" id=\"custom_ctype\" >\n\t\t\t\t\t\t\t\t\t{loop table=\"ctype\"  as=\"v\"}\n\t\t\t\t\t\t\t\t\t<option {if($ctypedata['id']==$v['id'])}selected{/if} value=\"{$v['id']}\">{$v['title']}</option>\n\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"layui-inline\">\n\t\t\t\t\t\t\t\t\t<input type=\"text\" id=\"custom_tips\" name=\"custom_tips\" autocomplete=\"off\" placeholder=\"{fun JZLANG('提示信息')}\"\n\t\t\t\t\t\t\t\t\tclass=\"layui-input\">\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<i data-info=\"{fun JZLANG('自定义配置可以配置对应配置栏下的自定义内容')}\" data-field=\"fcustom\" class=\"layui-sys-icon layui-icon layui-icon-about fcustom\"></i>\n\t\t\t\t\t\t\t\t<br/>\n\t\t\t\t\t\t\t\t<div class=\"layui-input-block\" style=\"margin-left:0;\">\n                                <textarea  name=\"custom_config\" placeholder=\"{fun JZLANG('下拉选项配置，如：开启=1,关闭=0')}\" class=\"layui-textarea\"></textarea>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\n                        {/if}\n\t\t\t\t<div style=\"height:100px;\"></div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\n                        \n\t\t\t\t\t\t\n                        <div class=\"layui-form-item\">\n                            <button class=\"layui-btn\" lay-submit=\"\" lay-filter=\"*\">\n                                {fun JZLANG('保存')}\n                            </button>\n                        </div>\n\t\t\t\t\n                \n              </div>\n            </div> \n            \n        </div>\n        </form>\n     \n        <script>\n\t\t\n            layui.use(['element','layer','form','upload'], function(){\n                $ = layui.jquery;//jquery\n            var  lement = layui.element;//面包导航\n            var  layer = layui.layer;//弹出层\n            var  form = layui.form;\n             var upload = layui.upload;\n            \n           \n\t\t\t\n          \n             //监听提交\n              form.on('submit(*)', function(data){\n            \n                $.post(\"{fun U('Sys/index')}\",data.field,function(r){\n                    //console.log(r);\n                    var r = JSON.parse(r);\n                    if(r.code==0){\n                         layer.alert(r.msg, {icon: 6},function(){\n                             \n                             window.location.reload();\n                             \n                             });\n                        \n                    }else{\n                         layer.alert(r.msg, {icon: 5});\n                         \n                    }\n                \n                });\n                \n                return false;\n               \n                \n              });\n              \n               form.on('submit(del)', function(data){\n               \n                var s = $(this).attr('data');\n                layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n                     $(\"#\"+s).remove();\n                     layer.close(index);\n                     var ss = s.split('custom_');\n                    $.post(\"{fun U('Sys/custom_del')}\",{field:ss[1]},function(r){\n                        var r = JSON.parse(r);\n                        if(r.code==0){\n                             layer.alert(r.msg, {icon: 6},function(){\n                             window.location.reload();\n                             });\n                             \n                        }else{\n                             layer.alert(r.msg, {icon: 5});\n                             \n                        }\n                    \n                    });\n                    \n                });\n\t\t\t\t\n                return false;\n\n              });\n\t\t\t  \n\t\t\t  form.on('submit(delconfig)', function(data){\n               \n                var ctype = $(this).attr('data');\n                layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n                     \n                     layer.close(index);\n                     \n                    $.post(\"{fun U('Sys/index')}\",{ctype:ctype,deltype:1},function(r){\n                        var r = JSON.parse(r);\n                        if(r.code==0){\n                             layer.alert(r.msg, {icon: 6},function(){\n                             window.location.reload();\n                             });\n                             \n                        }else{\n                             layer.alert(r.msg, {icon: 5});\n                             \n                        }\n                    \n                    });\n                    \n                });\n\t\t\t\treturn false;\n                });\n\t\t\t  \n              \n\t\t\t  \n              $(\".layui-sys-icon\").click(function(){\n\t\t\t\t\tvar fclass = $(this).attr('data-field');\n\t\t\t\t\tlayer.tips($(this).attr('data-info'), '.'+fclass);\n\t\t\t\t})\n\n              })\n              \n              function custom_delete(s){\n                layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n                     $(\"#\"+s).remove();\n                     layer.close(index);\n                    \n            \n                });\n              }\n\t\t\t  var clipboard = new ClipboardJS('.copy');\n\t\t\t\tclipboard.on('success', function(e) {\n\t\t\t\t\tlayer.msg('{fun JZLANG('复制成功！')}', {icon: 6,time: 1000});\n\t\t\t\t\te.clearSelection();\n\t\t\t\t});\n\n\t\t\t\tclipboard.on('error', function(e) {\n\t\t\t\t\t\n\t\t\t\t\tlayer.alert('{fun JZLANG('失败！')}');\n\t\t\t\t});\n\t\t\tfunction edit(id,field,type,title,tips,typeid,config,orders){\n\t\t\t\tvar html = '<div class=\"m-form\"><form class=\"layui-form\" lay-filter=\"newform\"><input name=\"id\" type=\"hidden\" id=\"id\" value=\\\"'+id+'\\\">{fun JZLANG('配置名称')}<input type=\\\"text\\\" autocomplete=\"off\" name=\"title\" id= \\\"title\\\" value=\\\"'+title+'\\\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('配置名称')}\\\"/>'\n\t\t\t\t+'{fun JZLANG('配置字段')}<input type=\\\"text\\\" name=\"field\" value=\\\"'+field+'\\\" id= \\\"field\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('配置字段')}\\\"/>'\n\t\t\t\t+'{fun JZLANG('配置栏目')}<div class=\"layui-input-block\" ><select class=\"layui-btn layui-btn-normal\" name=\"typeid\" id=\"typeid\" >'\n\t\t\t\t\t\t\t\t\t{loop table=\"ctype\"  as=\"v\"}\n\t\t\t\t\t\t\t\t\t+'<option {if($ctypedata['id']==$v['id'])}selected{/if} value=\"{$v['id']}\">{$v['title']}</option>'\n\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t+'</select></div>'\n\t\t\t\t+'{fun JZLANG('配置类型')}<div class=\"layui-input-block\" >'\n\t\t\t\t\t\t\t\t\t+'<select class=\"layui-btn layui-btn-normal\" name=\"type\"  >'\n\t\t\t\t\t\t\t\t\t+'<option value=\"0\">{fun JZLANG('选择类型')}</option>'\n\t\t\t\t\t\t\t\t\t+'<option value=\"1\">{fun JZLANG('图片')}</option>'\n\t\t\t\t\t\t\t\t\t+'<option value=\"2\">{fun JZLANG('单行文本')}</option>'\n\t\t\t\t\t\t\t\t\t+'<option value=\"3\">{fun JZLANG('多行文本')}</option>'\n\t\t\t\t\t\t\t\t\t+'<option value=\"4\">{fun JZLANG('编辑器')}</option>'\n\t\t\t\t\t\t\t\t\t+'<option value=\"5\">{fun JZLANG('文件上传')}</option>'\n\t\t\t\t\t\t\t\t\t+'<option value=\"6\">{fun JZLANG('下拉选项')}</option>'\n\t\t\t\t\t\t\t\t\t+'<option value=\"7\">{fun JZLANG('栏目选项')}</option>'\n\t\t\t\t\t\t\t\t\t+'<option value=\"8\">{fun JZLANG('代码')}</option>'\n\t\t\t\t\t\t\t\t\t+'</select></div>'\n\t\t\t\t+'{fun JZLANG('提示信息')}<input type=\\\"text\\\" value=\\\"'+tips+'\\\" name=\"tip\" id= \\\"tip\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('提示信息')}\\\"/>'\n\t\t\t\t+'{fun JZLANG('配置内容')}<textarea  name=\"config\" placeholder=\"{fun JZLANG('下拉选项配置，如：开启=1,关闭=0')}\" class=\"layui-textarea\">'+config+'</textarea>'\n\t\t\t\t+'{fun JZLANG('排序')}<input type=\\\"text\\\" value=\\\"'+orders+'\\\" name=\"orders\" id= \\\"orders\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('排序')}\\\"/>'\n\t\t\t\t+'<button type=\"button\" style=\"margin-left: 45%;\" class=\"layui layui-btn layui-btn-sm\" lay-submit lay-filter=\"update\">{fun JZLANG('提交')}</button></form></div>';\n\t\t\t\tlayer.open({\n\t\t\t\t  type: 1,\n\t\t\t\t  title:'{fun JZLANG('修改信息')}',\n\t\t\t\t  skin: 'layui-layer-rim', //加上边框\n\t\t\t\t  area: ['650px', '80%'], //宽高\n\t\t\t\t  content: html\n\t\t\t\t});\n\t\t\t\tlayui.use(['form','layer'], function(){\n\t\t\t\t\tvar form = layui.form,layer = layui.layer;\n\t\t\t\t\tform.val(\"newform\", {\"type\":type,\"typeid\":typeid});\n\t\t\t\t\tform.on('submit(update)', function(data){\n\t\t\t\t\t\t$.post(\"{fun U('Sys/setfield')}\",data.field,function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\tlayer.alert(r.msg, {icon: 6},function(){\n\t\t\t\t\t\t\t\t\t window.location.reload();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t layer.alert(r.msg, {icon: 5});\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t   \n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t  \n\t\t\t\t  })\n\t\t\t\t  \n\t\t\t  \n\t\t\t  \n\t\t\t  }\t\t \n              \n            </script>\n            \n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/datacache.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a>{fun JZLANG('首页')}</a>\n        <a><cite>{fun JZLANG('碎片化管理')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\n\t<div class=\"layui-card\">\n\t\t<div class=\"layui-card-body\">\n\t\t<form class=\"layui-form\" action=\"\">\n\t\t<xblock>\n\t\t<div class=\"layui-form-item\">\n\t    \n        {if(checkAction('sys/addcache'))}\t\n\t\t<div class=\"layui-input-inline\"  style=\"width:auto;\">\n\t\t<a class=\"layui-btn layui-btn-sm\"  onclick=\"x_admin_show('{fun JZLANG('新增碎片')}','{fun U('sys/addcache')}')\" >{fun JZLANG('新增碎片')}</a>\n\t\t</div>\n\t\t{/if}\n\n\t\t</div>\n\t\t\n\t\t</xblock>\n\t\t\n\t\t<div class=\"layui-collapse\">\n\t\t<div class=\"layui-colla-item\">\n\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('调用方式')}</h2>\n\t\t<div class=\"layui-colla-content\">\n\t\t<div class=\"row\">\n\n\t\t<p>{!--php $jzdata=jzcachedata('碎片标识');/--}</p>\n\t\t<p>{!--foreach $jzdata as $v--}</p>\n\t\t<p>{fun JZLANG('这里输出想要的内容，如：')}{!--$v['title']--}</p>\n\t\t<p>{!--/foreach--}</p>\n\t\t\n\n\t\t</div>\n\t\t</div>\n\t\t</div>\n\t\t</div>\n\t\t\n\t\t\n\t\t\n       \n        <table border=\"1\" rules=\"all\" style=\"width:100%; height:100px; white-space:nowrap\" class=\"layui-table layui-form\">\n        <thead>\n          <tr>\n            <th width=\"70\">ID</th>\n            <th >{fun JZLANG('碎片名称')}</th>\n            <th >{fun JZLANG('碎片标识')}</th>\n            <th >{fun JZLANG('更新周期')}</th>\n            <th >{fun JZLANG('操作')}</th>\n        </thead>\n        <tbody class=\"x-cate\">\n\t\t{foreach $lists as $v}\n          <tr >\n\t\t    <td>\n\t\t\t{$v['id']}\n\t\t\t</td>\n            <td>{$v['title']}</td>\n\t\t\t<td>\n\t\t\t{$v['field']}\n\t\t\t</td>\n\t\t\t<td>{$v['times']}{fun JZLANG('分钟')}</td>\n           \n\t\t\t\n            <td class=\"td-manage\">\n\t\t\t{if(checkAction('sys/viewcache'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('查看SQL')}','{fun U('sys/viewcache',array('id'=>$v['id']))}')\"  >{fun JZLANG('查看SQL')}</a>\n\t\t\t{/if}\n\t\t\t{if(checkAction('sys/editcache'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('sys/editcache',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t{/if}\n\t\t\t{if(checkAction('sys/delcache'))}\n              <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"cache_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t{/if}\n            </td>\n\n\n          </tr>\n\t\t {/foreach}\n         \n        </tbody>\n\t\t</table>\n \n\t\t</form>\n\t\t\n\t\t</div>\n\n\t</div>\n    </div>\n\n    <script>\n      layui.use(['form'], function(){\n        form = layui.form;\n\n\t\t\n      });\n\t\t\n      function cache_del(obj,id){\n          layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n              //发异步删除数据\n\t\t\t  $.post('{fun U('sys/delcache')}',{id:id},function(r){\n\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('删除成功！')}', {\n\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t $(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('已删除!')}',{icon:1,time:1000});\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\n\t\t\t  });\n\t\t\n\t\t\t  \n\t\t\t  \n              \n          });\n      }\n\t  \n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/desktop-add.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<style>\n\t\t.nav li {\n    list-style: none;\n    margin: 5px;\n}\n\t.nav li span {\n    margin: 0 10px;\n}\n\t\t</style>\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('桌面管理')}</cite></a>\n              <a><cite>{fun JZLANG('新增配置')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form  class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" id=\"left_num\" name=\"left_num\" value=\"1\" />\n\t\t\t<input type=\"hidden\" id=\"top_num\" name=\"top_num\" value=\"1\" />\n\t\t\t\n\t\t\t\n\t\t\t\n                 <div class=\"layui-form-item\">\n                    <label for=\"name\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('配置名称')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"name\" required=\"\" lay-verify=\"required\"   name=\"name\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label class=\"layui-form-label\">\n                        {fun JZLANG('左侧菜单栏')} <span class=\"x-red\">{fun JZLANG('没有二级菜单不会生效')}</span>\n                    </label>\n                    <table  class=\"layui-table layui-input-block\">\n                        <tbody id=\"leftNav\">\n\t\t\t\t\t\t\n                           \n                           \n                        </tbody>\n                    </table>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label class=\"layui-form-label\">\n                        {fun JZLANG('顶部菜单栏')} <span class=\"x-red\">{fun JZLANG('没有二级菜单不会生效')}</span>\n                    </label>\n                    <table  class=\"layui-table layui-input-block\">\n                        <tbody id=\"topNav\">\n\t\t\t\t\t\t\n                        </tbody>\n                    </table>\n                </div>\n\t\t\t\t\n\t\t\t\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t<label class=\"layui-form-label\">\n\t\t\t\t\t\t<span class='x-red'>*</span>{fun JZLANG('备注')}\n\t\t\t\t\t</label>\n\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t<textarea placeholder=\"{fun JZLANG('备注')}\"  name=\"ext\" class=\"layui-textarea\"></textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"isopen\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('适用角色')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"gid\" lay-filter=\"gid\" id=\"gid\" >\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('默认所有')}</option>\n\t\t\t\t\t   {foreach get_all_info_table('level_group') as $v}\n\t\t\t\t\t   <option  value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t   </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isdefault\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('系统默认')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isdefault\" value=\"0\" title=\"{fun JZLANG('否')}\" checked>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isdefault\" value=\"1\" title=\"{fun JZLANG('是')}\" >\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('系统默认指没有指定桌面配置的管理员，进入后台后默认的配置')}\n\t\t\t\t\t</div>\n\t\t\t\t\t\n                </div>\n                \n                <div class=\"layui-form-item\" style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n\t\t\t\t<input type=\"hidden\" id=\"savekey\" value=\"1\">\n\t\t\t\t<input type=\"hidden\" id=\"currentNav\" value=\"1\">\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t\n\t\t\tvar topNav = [\n\t\t\t\t{\n\t\t\t\t\tkey:1,\n\t\t\t\t\ttitle:'{fun JZLANG('一个菜单名称')}',\n\t\t\t\t\tvalue:'',\n\t\t\t\t\ticon:'',\n\t\t\t\t\tchildren:[\n\t\t\t\t\t\t\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\n\t\t\t];\n\t\t\tvar leftNav = [\n\t\t\t\t{\n\t\t\t\t\tkey:1,\n\t\t\t\t\ttitle:'{fun JZLANG('一个菜单名称')}',\n\t\t\t\t\tvalue:'',\n\t\t\t\t\ticon:'',\n\t\t\t\t\tchildren:[\n\t\t\t\t\t\t\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\n\t\t\t];\n\t\t\t\n\t\t\tfunction getCurrentNav(n){\n\t\t\t\tvar n = parseInt(n);\n\t\t\t\tif(n==1){\n\t\t\t\t\treturn leftNav;\n\t\t\t\t}else{\n\t\t\t\t\treturn topNav;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tfunction createNavHtml(n){\n\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\tvar len = obj.length;\n\t\t\t\tvar html = '<tr><td>{fun JZLANG('顶级菜单')}</td><td>{fun JZLANG('菜单图标')}</td><td>{fun JZLANG('二级菜单')}</td><td>{fun JZLANG('操作')}</td></tr>';\n\t\t\t\tvar children = [];\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\thtml+='<tr>';\n                    html+='<td>'+obj[i].title+'</td>';\n\t\t\t\t\thtml+='<td><i class=\"iconfont\">'+obj[i].icon+'</i></td>';\n                    html+='<td>';\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tchildren =  obj[i].children;\n\t\t\t\t\thtml+='<ul class=\"nav\">';\n\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\thtml+='<li><span><i class=\"iconfont\">'+children[ii].icon+'</i></span>';\n\t\t\t\t\t\thtml+='<span>'+children[ii].title+'</span>';\n\t\t\t\t\t\thtml+='<div class=\"layui-btn-group\"><button type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"selectIcon('+n+','+children[ii].key+')\">{fun JZLANG('图标')}</button><button  type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"editNav('+n+','+children[ii].key+',1)\">{fun JZLANG('修改')}</button><button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delNav('+n+','+children[ii].key+',1)\">{fun JZLANG('删除')}</button></div>';\n\t\t\t\t\t\thtml+='</li>';\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\thtml+='<li><button type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"addNav('+n+','+obj[i].key+',1)\">{fun JZLANG('新增')}</button></li>';\n\t\t\t\t\thtml+='</ul>';\n\t\t\t\t\thtml+='</td>';\n\t\t\t\t\thtml+='<td><button type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"addNav('+n+','+obj[i].key+',0)\">{fun JZLANG('新增')}</button><button type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"selectIcon('+n+','+obj[i].key+')\">{fun JZLANG('图标')}</button><button  type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"editNav('+n+','+obj[i].key+',0)\">{fun JZLANG('修改')}</button><button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delNav('+n+','+obj[i].key+',0)\">{fun JZLANG('删除')}</button></td>';\n\t\t\t\t\thtml+='</tr>';\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tif(parseInt(n)==1){\n\t\t\t\t$(\"#leftNav\").html(html);\n\t\t\t\tleftNav = obj;\n\t\t\t\t}else{\n\t\t\t\t$(\"#topNav\").html(html);\n\t\t\t\ttopNav = obj;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t}\n\t\t\tfunction changeNav(n,key,type,value){\n\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\tvar len = obj.length;\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\tobj[i][type] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tif(llen>0){\n\t\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\t\tif(obj[i].children[ii].key==key){\n\t\t\t\t\t\t\t\tobj[i].children[ii][type] = value;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcreateNavHtml(n);\n\t\t\t\t\n\t\t\t}\n\t\t\tfunction getNav(n,key,type){\n\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\tvar len = obj.length;\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\treturn obj[i][type];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tif(llen>0){\n\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\tif(obj[i].children[ii].key==key){\n\t\t\t\t\t\t\treturn obj[i].children[ii][type];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction newKey(obj){\n\t\t\t\t//理论上是一个随机的key\n\t\t\t\tvar k = Math.round(Math.random()*10000);\n\t\t\t\tif(checkKey(k,obj)){\n\t\t\t\t\treturn newKey(obj);\n\t\t\t\t}\n\t\t\t\treturn k;\n\t\t\t\t\n\t\t\t}\n\t\t\tfunction checkKey(key,obj){\n\t\t\t\tvar len = obj.length;\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tvar children = obj[i].children;\n\t\t\t\t\tif(llen>0){\n\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\tif(children[ii].key==key){\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfunction editNav(n,key,t){\n\t\t\t\tvar t = parseInt(t);\n\t\t\t\t$(\"#savekey\").val(key);\n\t\t\t\tvar old = getNav(n,key,'title');\n\t\t\t\tlayer.prompt({\n\t\t\t\t  formType: 0,\n\t\t\t\t  value: old,\n\t\t\t\t  title: '{fun JZLANG('修改菜单名称')}',\n\t\t\t\t  area: ['800px', '350px'] //自定义文本域宽高\n\t\t\t\t}, function(value, index, elem){\n\t\t\t\t  //alert(value); //得到value\n\t\t\t\t  changeNav(n,key,'title',value);\n\t\t\t\t  layer.close(index);\n\t\t\t\t});\n\t\t\t}\n\t\t\tfunction delNav(n,key,t){\n\t\t\t\tvar i=layer.confirm('{fun JZLANG('确定要删除吗？')}', {\n\t\t\t\t  btn: ['{fun JZLANG('取消')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t}, function(){\n\t\t\t\t  layer.close(i);\n\t\t\t\t}, function(){\n\t\t\t\t    var tt = parseInt(t);\n\t\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\t\tvar len = obj.length;\n\t\t\t\t\tvar newNav = [];\n\t\t\t\t\tconsole.log(tt);\n\t\t\t\t\tif(len==1 && tt!=1){\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('最后一个索引不能删除！')}',{icon:5});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\t\tobj[i] = [];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(obj[i].key){\n\t\t\t\t\t\t\tnewNav[i] = obj[i];\n\t\t\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\t\t\tif(llen>0){\n\t\t\t\t\t\t\t\tvar children = [];\n\t\t\t\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\t\t\t\tif(obj[i].children[ii].key==key){\n\t\t\t\t\t\t\t\t\t\tobj[i].children[ii] = [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif(obj[i].children[ii].key){\n\t\t\t\t\t\t\t\t\t\tchildren.push(obj[i].children[ii]);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tnewNav[i].children = children;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvar newNav=$.grep(newNav,function(n,i){  \n\t\t\t\t\t\treturn n;  \n\t\t\t\t\t},false);  \n\t\t\t\t\tif(parseInt(n)==1){\n\t\t\t\t\t\tleftNav = newNav;\n\t\t\t\t\t}else{\n\t\t\t\t\t\ttopNav = newNav;\n\t\t\t\t\t}\n\t\t\t\t\tcreateNavHtml(n);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t//获取key对应的索引\n\t\t\tfunction getNavS(key,obj){\n\t\t\t\tvar len = obj.length;\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\treturn i;\n\t\t\t\t\t}\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tif(llen>0){\n\t\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\t\tif(obj[i].children[ii].key==key){\n\t\t\t\t\t\t\t\treturn i;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t//根据数组索引，数组中间插入一个值\n\t\t\tfunction getNewNav(arrayList,index,value){\n\t\t\t\tarrayList.splice(index,0,value);\n\t\t\t\treturn arrayList;\n\t\t\t}\n\t\t\tfunction addNav(n,key,t){\n\t\t\t\tvar t = parseInt(t);\n\t\t\t\t$(\"#savekey\").val(key);\n\t\t\t\tif(t==0){\n\t\t\t\t\t//顶级菜单\n\t\t\t\t\t\n\t\t\t\t\tlayer.prompt({\n\t\t\t\t\t  formType: 0,\n\t\t\t\t\t  value: '',\n\t\t\t\t\t  title: '{fun JZLANG('添加菜单名称')}',\n\t\t\t\t\t  area: ['800px', '350px'] //自定义文本域宽高\n\t\t\t\t\t}, function(title, index, elem){\n\t\t\t\t\t  //alert(value); //得到value\n\t\t\t\t\t  var obj = getCurrentNav(n);\n\t\t\t\t\t  var nkey = newKey(obj);\n\t\t\t\t\t  var len = obj.length;\n\t\t\t\t\t  var newNav = [];\n\t\t\t\t\t  var ikey = getNavS(key,obj)+1;//获取key对应的索引+1向下一位\n\t\t\t\t\t  var nav = {\n\t\t\t\t\t\t\tkey:nkey,\n\t\t\t\t\t\t\ttitle:title,\n\t\t\t\t\t\t\tvalue:'',\n\t\t\t\t\t\t\ticon:'',\n\t\t\t\t\t\t\tchildren:[]\n\t\t\t\t\t\t};\n\t\t\t\t\t\tobj = getNewNav(obj,ikey,nav);\n\t\t\t\t\t\tif(parseInt(n)==1){\n\t\t\t\t\t\t\tleftNav = obj;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\ttopNav = obj;\n\t\t\t\t\t\t}\n\t\t\t\t\t  createNavHtml(n);\n\t\t\t\t\t  layer.close(index);\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t//二级菜单\n\t\t\t\t\t$(\"#currentNav\").val(n);\n\t\t\t\t\tvar addnav = layer.open({\n\t\t\t\t\t  type: 2,\n\t\t\t\t\t  title: '{fun JZLANG('菜单选择')}',\n\t\t\t\t\t  shadeClose: true,\n\t\t\t\t\t  shade: 0.8,\n\t\t\t\t\t  area: ['80%', '90%'],\n\t\t\t\t\t  content: '{fun U('viewPower')}' //iframe的url\n\t\t\t\t\t}); \n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction setNavChildren(nav){\n\t\t\t\t$.post(\"{fun U('getNav')}\",{ids:nav},function(res){\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\tvar n = $(\"#currentNav\").val();\n\t\t\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\t\t\tvar key = $(\"#savekey\").val();\n\t\t\t\t\t\tvar len = obj.length;\n\t\t\t\t\t\tvar children = [];\n\t\t\t\t\t\tvar m = 0;\n\t\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\t\tif(key==obj[i].key){\n\t\t\t\t\t\t\t\tchildren = obj[i].children;\n\t\t\t\t\t\t\t\tm = i;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar ll = res.data.length;\n\t\t\t\t\t\tfor(var i=0;i<ll;i++){\n\t\t\t\t\t\t\tvar nkey = newKey(obj);\n\t\t\t\t\t\t\tchildren.push({\n\t\t\t\t\t\t\t\tkey:nkey,\n\t\t\t\t\t\t\t\ttitle:res.data[i].title,\n\t\t\t\t\t\t\t\tvalue:res.data[i].id,\n\t\t\t\t\t\t\t\ticon:'',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tobj[m].children = children;\n\t\t\t\t\t\tif(parseInt(n)==1){\n\t\t\t\t\t\t\tleftNav = obj;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\ttopNav = obj;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcreateNavHtml(n);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(res.msg)\n\t\t\t\t\t}\n\t\t\t\t},'json')\n\t\t\t}\n\t\t\t\n\t\t\tfunction selectIcon(n,key){\n\t\t\t\t$(\"#savekey\").val(key);\n\t\t\t\t$(\"#currentNav\").val(n);\n\t\t\t\tvar iconiframe = layer.open({\n\t\t\t\t  type: 2,\n\t\t\t\t  title: '{fun JZLANG('图标选择')}',\n\t\t\t\t  shadeClose: true,\n\t\t\t\t  shade: 0.8,\n\t\t\t\t  area: ['80%', '90%'],\n\t\t\t\t  content: '{fun U('unicode')}' //iframe的url\n\t\t\t\t}); \n\t\t\t}\n\t\t\t\n\t\t\tfunction getSelectIcon(icon){\n\n\t\t\t\tvar key = $(\"#savekey\").val();\n\t\t\t\tvar n = $(\"#currentNav\").val();\n\t\t\t\tchangeNav(n,key,'icon',icon);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction closeiframe(){\n\t\t\t\tlayer.closeAll();\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$(function(){\n\t\t\t\n\t\t\t\tcreateNavHtml(1);\n\t\t\t\tcreateNavHtml(2);\n\t\t\t})\n\t\t\t   \n\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t\n\t\t\t  var iconinput = 0;\n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\tdata.field.topNav = topNav;\n\t\t\t\tdata.field.leftNav = leftNav;\n                \n\t\t\t\t$.post(\"{fun U('desktop_add')}\",data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('Index/desktop')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// parent.layer.close(index);\n\t\t\t\t\t\t \n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            \n\t\t\t\n              \n              \n            });\n\t\t\t//重新渲染表单\n\t\t\tfunction renderForm(){\n\t\t\t\tlayui.use('form', function(){\n\t\t\t\tvar form = layui.form; //只有执行了这一步，部分表单元素才会自动修饰成功\n\t\t\t\t  form.render();\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/desktop-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<style>\n\t\t.nav li {\n    list-style: none;\n    margin: 5px;\n}\n\t.nav li span {\n    margin: 0 10px;\n}\n\t\t</style>\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('桌面管理')}</cite></a>\n              <a><cite>{fun JZLANG('修改配置')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form  class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"type\" value=\"{$type}\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t<input type=\"hidden\" name=\"left_num\" id=\"left_num\" value=\"{if($left_num==0)}1{else}{$left_num}{/if}\" />\n\t\t\t<input type=\"hidden\" name=\"top_num\" id=\"top_num\" value=\"{if($top_num==0)}1{else}{$top_num}{/if}\" />\n\t\t\t\n\t\t\t\n                 <div class=\"layui-form-item\">\n                    <label for=\"name\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('配置名称')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"name\" value=\"{if($type=='edit')}{$data['name']}{/if}\" required=\"\" lay-verify=\"required\"   name=\"name\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n                    <label class=\"layui-form-label\">\n                        {fun JZLANG('左侧菜单栏')} <span class=\"x-red\">{fun JZLANG('没有二级菜单不会生效')}</span>\n                    </label>\n                    <table  class=\"layui-table layui-input-block\">\n                        <tbody id=\"leftNav\">\n\t\t\t\t\t\t\n                           \n                           \n                        </tbody>\n                    </table>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label class=\"layui-form-label\">\n                        {fun JZLANG('顶部菜单栏')} <span class=\"x-red\">{fun JZLANG('没有二级菜单不会生效')}</span>\n                    </label>\n                    <table  class=\"layui-table layui-input-block\">\n                        <tbody id=\"topNav\">\n\t\t\t\t\t\t\n                        </tbody>\n                    </table>\n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t<label class=\"layui-form-label\">\n\t\t\t\t\t\t<span class='x-red'>*</span>{fun JZLANG('备注')}\n\t\t\t\t\t</label>\n\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t<textarea placeholder=\"{fun JZLANG('备注')}\"  name=\"ext\" class=\"layui-textarea\">{$data['ext']}</textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"isopen\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('适用角色')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"gid\" lay-filter=\"gid\" id=\"gid\" >\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('默认所有')}</option>\n\t\t\t\t\t   {foreach get_all_info_table('level_group') as $v}\n\t\t\t\t\t   <option  value=\"{$v['id']}\" {if($data['gid']==$v['id'])}selected{/if}>{$v['name']}</option>\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t   </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isdefault\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('系统默认')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isdefault\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['isdefault']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isdefault\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['isdefault']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('系统默认指没有指定桌面配置的管理员，进入后台后默认的配置')}\n\t\t\t\t\t</div>\n\t\t\t\t\t\n                </div>\n                \n                <div class=\"layui-form-item\" style=\"text-align:center;\">\n                   \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n\t\t\t\t\t<input type=\"hidden\" id=\"savekey\" value=\"1\">\n\t\t\t\t<input type=\"hidden\" id=\"currentNav\" value=\"1\">\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t\t{if($top_num)}\n\t\t\t\n\t\t\tvar topNav = [\n\t\t\t\t{foreach $top_layout as $k=>$v}\n\t\t\t\t{\n\t\t\t\t\tkey:{$k+1},\n\t\t\t\t\ttitle:'{$v['name']}',\n\t\t\t\t\tvalue:'',\n\t\t\t\t\ticon:'{fun htmlspecialchars_decode($v['icon'])}',\n\t\t\t\t\tchildren:[\n\t\t\t\t\t\t{foreach $v['nav'] as $kk=>$vv}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{if(!is_array($vv) && $vv)}\n\t\t\t\t\t\t\t{if(strpos($vv,'class')!==false)}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey:{$k+10000+rand(500,10000)},\n\t\t\t\t\t\t\t\t\ttitle:'{$classnav[$vv]['classname']}',\n\t\t\t\t\t\t\t\t\tvalue:'{$vv}',\n\t\t\t\t\t\t\t\t\ticon:''\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey:{$k+10000+rand(500,10000)},\n\t\t\t\t\t\t\t\t\ttitle:'{$rulers[$vv]['name']}',\n\t\t\t\t\t\t\t\t\tvalue:'{$vv}',\n\t\t\t\t\t\t\t\t\ticon:''\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{else if(is_array($vv))}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey:{$k+10000+rand(500,10000)},\n\t\t\t\t\t\t\t\t\ttitle:'{$vv['title']}',\n\t\t\t\t\t\t\t\t\tvalue:'{$vv['value']}',\n\t\t\t\t\t\t\t\t\ticon:'{fun htmlspecialchars_decode($vv['icon'])}'\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\t{/foreach}\n\t\t\t];\n\t\t\t\n\t\t\t\n\t\t\t{else}\n\t\t\tvar topNav = [\n\t\t\t\t{\n\t\t\t\t\tkey:1,\n\t\t\t\t\ttitle:'{fun JZLANG('一个菜单名称')}',\n\t\t\t\t\tvalue:'',\n\t\t\t\t\ticon:'',\n\t\t\t\t\tchildren:[\n\t\t\t\t\t\t\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\n\t\t\t];\n\t\t\t{/if}\n\t\t\t{if($left_num)}\n\t\t\tvar leftNav = [\n\t\t\t\t{foreach $left_layout as $k=>$v}\n\t\t\t\t{\n\t\t\t\t\tkey:{$k+1},\n\t\t\t\t\ttitle:'{$v['name']}',\n\t\t\t\t\tvalue:'',\n\t\t\t\t\ticon:'{fun htmlspecialchars_decode($v['icon'])}',\n\t\t\t\t\tchildren:[\n\t\t\t\t\t\t{foreach $v['nav'] as $kk=>$vv}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{if(!is_array($vv) && $vv)}\n\t\t\t\t\t\t\t{if(strpos($vv,'class')!==false)}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey:{$k+10000+rand(500,10000)},\n\t\t\t\t\t\t\t\t\ttitle:'{$classnav[$vv]['classname']}',\n\t\t\t\t\t\t\t\t\tvalue:'{$vv}',\n\t\t\t\t\t\t\t\t\ticon:''\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey:{$k+10000+rand(500,10000)},\n\t\t\t\t\t\t\t\t\ttitle:'{$rulers[$vv]['name']}',\n\t\t\t\t\t\t\t\t\tvalue:'{$vv}',\n\t\t\t\t\t\t\t\t\ticon:''\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{else if(is_array($vv))}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey:{$k+10000+rand(500,10000)},\n\t\t\t\t\t\t\t\t\ttitle:'{$vv['title']}',\n\t\t\t\t\t\t\t\t\tvalue:'{$vv['value']}',\n\t\t\t\t\t\t\t\t\ticon:'{fun htmlspecialchars_decode($vv['icon'])}'\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\t{/foreach}\n\t\t\t];\n\t\t\t\n\t\t\t{else}\n\t\t\tvar leftNav = [\n\t\t\t\t{\n\t\t\t\t\tkey:1,\n\t\t\t\t\ttitle:'{fun JZLANG('一个菜单名称')}',\n\t\t\t\t\tvalue:'',\n\t\t\t\t\ticon:'',\n\t\t\t\t\tchildren:[\n\t\t\t\t\t\t\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\n\t\t\t];\n\t\t\t{/if}\n\t\t\t\n\t\t\tfunction getCurrentNav(n){\n\t\t\t\tvar n = parseInt(n);\n\t\t\t\tif(n==1){\n\t\t\t\t\treturn leftNav;\n\t\t\t\t}else{\n\t\t\t\t\treturn topNav;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tfunction createNavHtml(n){\n\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\tvar len = obj.length;\n\t\t\t\tvar html = '<tr><td>{fun JZLANG('顶级菜单')}</td><td>{fun JZLANG('菜单图标')}</td><td>{fun JZLANG('二级菜单')}</td><td>{fun JZLANG('操作')}</td></tr>';\n\t\t\t\tvar children = [];\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\thtml+='<tr>';\n                    html+='<td>'+obj[i].title+'</td>';\n\t\t\t\t\thtml+='<td><i class=\"iconfont\">'+obj[i].icon+'</i></td>';\n                    html+='<td>';\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tchildren =  obj[i].children;\n\t\t\t\t\thtml+='<ul class=\"nav\">';\n\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\thtml+='<li><span><i class=\"iconfont\">'+children[ii].icon+'</i></span>';\n\t\t\t\t\t\thtml+='<span>'+children[ii].title+'</span>';\n\t\t\t\t\t\thtml+='<div class=\"layui-btn-group\"><button type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"selectIcon('+n+','+children[ii].key+')\">{fun JZLANG('图标')}</button><button  type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"editNav('+n+','+children[ii].key+',1)\">{fun JZLANG('修改')}</button><button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delNav('+n+','+children[ii].key+',1)\">{fun JZLANG('删除')}</button></div>';\n\t\t\t\t\t\thtml+='</li>';\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\thtml+='<li><button type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"addNav('+n+','+obj[i].key+',1)\">{fun JZLANG('新增')}</button></li>';\n\t\t\t\t\thtml+='</ul>';\n\t\t\t\t\thtml+='</td>';\n\t\t\t\t\thtml+='<td><button type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"addNav('+n+','+obj[i].key+',0)\">{fun JZLANG('新增')}</button><button type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"selectIcon('+n+','+obj[i].key+')\">{fun JZLANG('图标')}</button><button  type=\"button\" class=\"layui-btn layui-btn-sm\" onclick=\"editNav('+n+','+obj[i].key+',0)\">{fun JZLANG('修改')}</button><button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delNav('+n+','+obj[i].key+',0)\">{fun JZLANG('删除')}</button></td>';\n\t\t\t\t\thtml+='</tr>';\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\tif(parseInt(n)==1){\n\t\t\t\t$(\"#leftNav\").html(html);\n\t\t\t\tleftNav = obj;\n\t\t\t\t}else{\n\t\t\t\t$(\"#topNav\").html(html);\n\t\t\t\ttopNav = obj;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t}\n\t\t\tfunction changeNav(n,key,type,value){\n\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\tvar len = obj.length;\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\tobj[i][type] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tif(llen>0){\n\t\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\t\tif(obj[i].children[ii].key==key){\n\t\t\t\t\t\t\t\tobj[i].children[ii][type] = value;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcreateNavHtml(n);\n\t\t\t\t\n\t\t\t}\n\t\t\tfunction getNav(n,key,type){\n\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\tvar len = obj.length;\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\treturn obj[i][type];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tif(llen>0){\n\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\tif(obj[i].children[ii].key==key){\n\t\t\t\t\t\t\treturn obj[i].children[ii][type];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction newKey(obj){\n\t\t\t\t//理论上是一个随机的key\n\t\t\t\tvar k = Math.round(Math.random()*10000);\n\t\t\t\tif(checkKey(k,obj)){\n\t\t\t\t\treturn newKey(obj);\n\t\t\t\t}\n\t\t\t\treturn k;\n\t\t\t\t\n\t\t\t}\n\t\t\tfunction checkKey(key,obj){\n\t\t\t\tvar len = obj.length;\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tvar children = obj[i].children;\n\t\t\t\t\tif(llen>0){\n\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\tif(children[ii].key==key){\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfunction editNav(n,key,t){\n\t\t\t\tvar t = parseInt(t);\n\t\t\t\t$(\"#savekey\").val(key);\n\t\t\t\tvar old = getNav(n,key,'title');\n\t\t\t\tlayer.prompt({\n\t\t\t\t  formType: 0,\n\t\t\t\t  value: old,\n\t\t\t\t  title: '{fun JZLANG('修改菜单名称')}',\n\t\t\t\t  area: ['800px', '350px'] //自定义文本域宽高\n\t\t\t\t}, function(value, index, elem){\n\t\t\t\t  //alert(value); //得到value\n\t\t\t\t  changeNav(n,key,'title',value);\n\t\t\t\t  layer.close(index);\n\t\t\t\t});\n\t\t\t}\n\t\t\tfunction delNav(n,key,t){\n\t\t\t\tvar i=layer.confirm('{fun JZLANG('确定要删除吗？')}', {\n\t\t\t\t  btn: ['{fun JZLANG('取消')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t}, function(){\n\t\t\t\t  layer.close(i);\n\t\t\t\t}, function(){\n\t\t\t\t    var tt = parseInt(t);\n\t\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\t\tvar len = obj.length;\n\t\t\t\t\tvar newNav = [];\n\t\t\t\t\tconsole.log(tt);\n\t\t\t\t\tif(len==1 && tt!=1){\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('最后一个索引不能删除！')}',{icon:5});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\t\tobj[i] = [];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(obj[i].key){\n\t\t\t\t\t\t\tnewNav[i] = obj[i];\n\t\t\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\t\t\tif(llen>0){\n\t\t\t\t\t\t\t\tvar children = [];\n\t\t\t\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\t\t\t\tif(obj[i].children[ii].key==key){\n\t\t\t\t\t\t\t\t\t\tobj[i].children[ii] = [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif(obj[i].children[ii].key){\n\t\t\t\t\t\t\t\t\t\tchildren.push(obj[i].children[ii]);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tnewNav[i].children = children;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvar newNav=$.grep(newNav,function(n,i){  \n\t\t\t\t\t\treturn n;  \n\t\t\t\t\t},false);  \n\t\t\t\t\tif(parseInt(n)==1){\n\t\t\t\t\t\tleftNav = newNav;\n\t\t\t\t\t}else{\n\t\t\t\t\t\ttopNav = newNav;\n\t\t\t\t\t}\n\t\t\t\t\tcreateNavHtml(n);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t//获取key对应的索引\n\t\t\tfunction getNavS(key,obj){\n\t\t\t\tvar len = obj.length;\n\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\tif(obj[i].key==key){\n\t\t\t\t\t\treturn i;\n\t\t\t\t\t}\n\t\t\t\t\tvar llen = obj[i].children.length;\n\t\t\t\t\tif(llen>0){\n\t\t\t\t\t\tfor(var ii=0;ii<llen;ii++){\n\t\t\t\t\t\t\tif(obj[i].children[ii].key==key){\n\t\t\t\t\t\t\t\treturn i;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t//根据数组索引，数组中间插入一个值\n\t\t\tfunction getNewNav(arrayList,index,value){\n\t\t\t\tarrayList.splice(index,0,value);\n\t\t\t\treturn arrayList;\n\t\t\t}\n\t\t\tfunction addNav(n,key,t){\n\t\t\t\tvar t = parseInt(t);\n\t\t\t\t$(\"#savekey\").val(key);\n\t\t\t\tif(t==0){\n\t\t\t\t\t//顶级菜单\n\t\t\t\t\t\n\t\t\t\t\tlayer.prompt({\n\t\t\t\t\t  formType: 0,\n\t\t\t\t\t  value: '',\n\t\t\t\t\t  title: '{fun JZLANG('添加菜单名称')}',\n\t\t\t\t\t  area: ['800px', '350px'] //自定义文本域宽高\n\t\t\t\t\t}, function(title, index, elem){\n\t\t\t\t\t  //alert(value); //得到value\n\t\t\t\t\t  var obj = getCurrentNav(n);\n\t\t\t\t\t  var nkey = newKey(obj);\n\t\t\t\t\t  var len = obj.length;\n\t\t\t\t\t  var newNav = [];\n\t\t\t\t\t  var ikey = getNavS(key,obj)+1;//获取key对应的索引+1向下一位\n\t\t\t\t\t  var nav = {\n\t\t\t\t\t\t\tkey:nkey,\n\t\t\t\t\t\t\ttitle:title,\n\t\t\t\t\t\t\tvalue:'',\n\t\t\t\t\t\t\ticon:'',\n\t\t\t\t\t\t\tchildren:[]\n\t\t\t\t\t\t};\n\t\t\t\t\t\tobj = getNewNav(obj,ikey,nav);\n\t\t\t\t\t\tif(parseInt(n)==1){\n\t\t\t\t\t\t\tleftNav = obj;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\ttopNav = obj;\n\t\t\t\t\t\t}\n\t\t\t\t\t  createNavHtml(n);\n\t\t\t\t\t  layer.close(index);\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t//二级菜单\n\t\t\t\t\t$(\"#currentNav\").val(n);\n\t\t\t\t\tvar addnav = layer.open({\n\t\t\t\t\t  type: 2,\n\t\t\t\t\t  title: '{fun JZLANG('菜单选择')}',\n\t\t\t\t\t  shadeClose: true,\n\t\t\t\t\t  shade: 0.8,\n\t\t\t\t\t  area: ['80%', '90%'],\n\t\t\t\t\t  content: '{fun U('viewPower')}' //iframe的url\n\t\t\t\t\t}); \n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction setNavChildren(nav){\n\t\t\t\t$.post(\"{fun U('getNav')}\",{ids:nav},function(res){\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\tvar n = $(\"#currentNav\").val();\n\t\t\t\t\t\tvar obj = getCurrentNav(n);\n\t\t\t\t\t\tvar key = $(\"#savekey\").val();\n\t\t\t\t\t\tvar len = obj.length;\n\t\t\t\t\t\tvar children = [];\n\t\t\t\t\t\tvar m = 0;\n\t\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\t\tif(key==obj[i].key){\n\t\t\t\t\t\t\t\tchildren = obj[i].children;\n\t\t\t\t\t\t\t\tm = i;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar ll = res.data.length;\n\t\t\t\t\t\tfor(var i=0;i<ll;i++){\n\t\t\t\t\t\t\tvar nkey = newKey(obj);\n\t\t\t\t\t\t\tchildren.push({\n\t\t\t\t\t\t\t\tkey:nkey,\n\t\t\t\t\t\t\t\ttitle:res.data[i].title,\n\t\t\t\t\t\t\t\tvalue:res.data[i].id,\n\t\t\t\t\t\t\t\ticon:'',\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tobj[m].children = children;\n\t\t\t\t\t\tif(parseInt(n)==1){\n\t\t\t\t\t\t\tleftNav = obj;\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\ttopNav = obj;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcreateNavHtml(n);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(res.msg)\n\t\t\t\t\t}\n\t\t\t\t},'json')\n\t\t\t}\n\t\t\t\n\t\t\tfunction selectIcon(n,key){\n\t\t\t\t$(\"#savekey\").val(key);\n\t\t\t\t$(\"#currentNav\").val(n);\n\t\t\t\tvar iconiframe = layer.open({\n\t\t\t\t  type: 2,\n\t\t\t\t  title: '{fun JZLANG('图标选择')}',\n\t\t\t\t  shadeClose: true,\n\t\t\t\t  shade: 0.8,\n\t\t\t\t  area: ['80%', '90%'],\n\t\t\t\t  content: '{fun U('unicode')}' //iframe的url\n\t\t\t\t}); \n\t\t\t}\n\t\t\t\n\t\t\tfunction getSelectIcon(icon){\n\t\t\t\tconsole.log('获取'+icon);\n\t\t\t\tvar key = $(\"#savekey\").val();\n\t\t\t\tvar n = $(\"#currentNav\").val();\n\t\t\t\tchangeNav(n,key,'icon',icon);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction closeiframe(){\n\t\t\t\tlayer.closeAll();\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$(function(){\n\t\t\t\n\t\t\t\tcreateNavHtml(1);\n\t\t\t\tcreateNavHtml(2);\n\t\t\t})\n\t\t\t   \n\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t\n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                \n                data.field.topNav = topNav;\n\t\t\t\tdata.field.leftNav = leftNav;\n\t\t\t\t$.post(\"{fun U('desktop_edit')}\",data.field,function(r){\n\t\t\t\t\t//console.log(r);return false;\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('Index/desktop')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// parent.layer.close(index);\n\t\t\t\t\t\t \n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            \n\t\t\t\n              \n              \n            });\n\t\t\t//重新渲染表单\n\t\t\tfunction renderForm(){\n\t\t\t\tlayui.use('form', function(){\n\t\t\t\tvar form = layui.form; //只有执行了这一步，部分表单元素才会自动修饰成功\n\t\t\t\t  form.render();\n\t\t\t\t});\n\t\t\t}\n\t\t\n\t\t\t\n\t\t\t\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/desktop.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('桌面管理')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        \n          <xblock>\n\t\t  {if(checkAction('Index/desktop_add'))}\n\t\t <button class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增配置')}','{fun U('Index/desktop_add')}')\"><i class=\"layui-icon\"></i>{fun JZLANG('新增配置')}</button>\n\t\t  {/if}\n\t\t   <span class=\"x-right\" style=\"line-height:40px\">{fun JZLANG('共有数据：')}{$sum} {fun JZLANG('条')}</span>\n\t\t  </xblock>\n            <table class=\"layui-table\">\n                <thead>\n                    <tr>\n                        \n                        <th>\n                            ID\n                        </th>\n                       \n                        <th>\n                            {fun JZLANG('桌面名称')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('适用角色')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('系统')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('是否默认')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('备注')}\n                        </th>\n                        <th width=\"240px\">\n                            {fun JZLANG('操作')}\n                        </th>\n                    </tr>\n                </thead>\n                <tbody id=\"x-link\">\n\t\t\t\t  {foreach $lists as $v}\n                    <tr>\n                     \n                        <td>\n                            {$v['id']}\n                        </td>\n                        \n                        <td>\n                            {$v['name']}\n                        </td>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<td>\n                         {if($v['gid']==0)}{fun JZLANG('所有角色')}{else}{fun get_info_table('level_group',array('id'=>$v['gid']),'name')}\n\t\t\t\t\t\t {/if}\n                        </td>\n\t\t\t\t\t\t<td class=\"td-status\" >\n\t\t\t\t\t\t{if($v['sys']==1)}<span class=\"layui-badge layui-bg-gray\">{fun JZLANG('是')}</span>{else}<span class=\"layui-badge layui-bg-orange\">{fun JZLANG('否')}</span>{/if}\n\t\t\t\t\t\t </td>\n\t\t\t\t\t\t<td class=\"td-status\" >\n\t\t\t\t\t\t{if($v['isdefault']==1)}<span class=\"layui-badge layui-bg-gray\">{fun JZLANG('是')}</span>{else}<span class=\"layui-badge layui-bg-orange\">{fun JZLANG('否')}</span>{/if}\n\t\t\t\t\t\t </td>\n\t\t\t\t\t\t<td>\n                            {$v['ext']}\n                        </td>\n                        <td class=\"td-manage\">\n                        \n\t\t\t\t\t\t\t{if(checkAction('Index/desktop_edit'))}\n\t\t\t\t\t\t\t <button class=\"layui-btn layui-btn layui-btn-xs\"  onClick=\"x_admin_show('{fun JZLANG('修改配置')}','{fun U('Index/desktop_edit',array('id'=>$v['id']))}')\" ><i class=\"layui-icon\">&#xe642;</i>{fun JZLANG('修改')}</button>\n\t\t\t\t\t\t\t <button class=\"layui-btn layui-btn  layui-btn-warm layui-btn-xs\"  onClick=\"x_admin_show('{fun JZLANG('复制配置')}','{fun U('Index/desktop_edit',array('id'=>$v['id'],'type'=>'copy'))}')\" ><i class=\"layui-icon\">&#xe655;</i>{fun JZLANG('复制')}</button>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if(checkAction('Index/desktop_del'))}\n\t\t\t\t\t\t\t <button class=\"layui-btn-danger layui-btn layui-btn-xs\"  onClick=\"desktop_del(this,'{$v['id']}')\" href=\"javascript:;\" ><i class=\"layui-icon\">&#xe640;</i>{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t{/if}\n                        </td>\n\t\t\t\t\t\t\n                    </tr>\n\t\t\t\t\t{/foreach}\n                </tbody>\n            </table>\n\t\t\t\n            <div class=\"page\">\n\t\t\t\t{$pages}\n\t\t\t  </div>\n        </div>\n     \n       <script>\n\t   \n\t   \n\t    layui.use(['laydate','element','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n              laydate = layui.laydate;//日期插件\n              lement = layui.element;//面包导航\n            //  laypage = layui.laypage;//分页\n              layer = layui.layer;//弹出层\n\n              //以上模块根据需要引入\n             \n             \n              \n            });\n\t\t /*删除*/\n            function desktop_del(obj,id){\n                layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t$.get(\"{fun U('desktop_del')}?id=\"+id,{},function(s){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(s);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n                   \n                });\n            }\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/editcache.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('碎片化管理')}</cite></a>\n\t\t\t  <a><cite>{fun JZLANG('修改碎片')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\t\t\t<div class=\"layui-collapse\">\n\t\t        <div class=\"layui-colla-item\">\n\t\t\t    <h2 class=\"layui-colla-title\">{fun JZLANG('使用说明')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t<p>1. {fun JZLANG('指定几个id或者几个tid的内容输出(栏目：不限制栏目)')}</p>\n\t\t\t\t<p>{fun JZLANG('SQL中输入：')}  id in(1,2,3)  {fun JZLANG('或者')}  tid in(2,3,4)</p>\n\t\t\t\t<p>2. {fun JZLANG('模糊查询，查询标题跟 “网站建设” 相关的内容')}</p>\n\t\t\t\t<p>{fun JZLANG('SQL中输入： ')}title like '%网站建设%' </p>\n\t\t\t\t<p>3. {fun JZLANG('模糊查询，查询标题/内容跟 “网站建设” 相关的内容')}</p>\n\t\t\t\t<p>{fun JZLANG('SQL中输入：')} (title like '%网站建设%' or body like '%网站建设%' ) </p>\n\t\t\t\t<p>4. {fun JZLANG('不支持联表查询')} </p>\n\t\t\t\t<p>5. {fun JZLANG('注意字符串都要使用英文单引号')}</p>\n\t\t\t\t<p>{fun JZLANG('如： ')} title='网站建设' </p>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('碎片名称')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"title\" value=\"{$data['title']}\" style=\"width:500px;\" name=\"title\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('碎片标识')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"field\" value=\"{$data['field']}\"  name=\"field\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('建议英文，不要重复')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t  <label class=\"layui-form-label\">{fun JZLANG('模型')}</label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select class=\"layui-input\" name=\"molds\" lay-filter=\"molds\">\n\t\t\t\t\t\t{loop table=\"molds\" isopen=\"1\" orderby=\"id asc\" as=\"v\"}\n\t\t\t\t\t\t<option {if($data['molds']==$v['biaoshi'])}selected{/if} value=\"{$v['biaoshi']}\">{$v['name']}</option>\n\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t  <label class=\"layui-form-label\">{fun JZLANG('栏目')}</label>\n\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select class=\"layui-input\" name=\"tid\" lay-filter=\"tid\">\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t{foreach $classtypetree as $v}\n\t\t\t\t\t\t<option {if($data['tid']==$v['id'])}selected{/if} value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\n\t\t\t\t\t\t</select>\n\t\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isall\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('子栏目包含')}\n                    </label>\n                    <div class=\"layui-input-block\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isall\" value=\"1\" title=\"{fun JZLANG('包含')}\" {if($data['isall']==1)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isall\" value=\"0\" title=\"{fun JZLANG('不包含')}\" {if($data['isall']==0)}checked{/if}>\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t<label for=\"sql\" class=\"layui-form-label\">\n\t\t\t\t\t\t<span class=\"x-red\"></span>SQL\n\t\t\t\t\t</label>\n\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t<textarea  name=\"sqls\" placeholder=\"{fun JZLANG('可留空')}\" class=\"layui-textarea\">{$data['sqls']}</textarea>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('排序')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"orders\"  value=\"{$data['orders']}\" style=\"width:500px;\" name=\"orders\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('输出条数')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"limits\" value=\"{$data['limits']}\"  name=\"limits\"  \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('0表示输出所有')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label  class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('更新周期')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"number\" id=\"times\" value=\"{$data['times']}\"  name=\"times\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('单位：分钟')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\t\t\t\t\t\t\n               \n                \n                <div class=\"layui-form-item\"   style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form,layer = layui.layer,laydate = layui.laydate;\n\t\t\t \n\t\t\t   form.on('select(tid)', function(data){\n\t\t\t \n\t\t\t \n\t\t\t  \n\t\t\t});\n\t\t\t\t\n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\t$.post(\"{fun U('sys/editcache')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('sys/datacache')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t  \n\t\t\t\n\n              \n            });\n\t\t\n\t\t\t\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/editmenu.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('导航管理')}</cite></a>\n\t\t\t  <a><cite>{fun JZLANG('修改导航')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"name\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('导航名称')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"name\" value=\"{$data['name']}\" style=\"width:500px;\" name=\"name\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('导航菜单')}\n                    </label>\n                    <div class=\"layui-input-block\">\n\t\t\t\t\t\n                        <table class=\"layui-table\">\n\t\t\t\t\t\t  <thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('栏目')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('标题')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('图片')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('链接')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('打开')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('显示')}</th>\n\t\t\t\t\t\t\t  <th>{fun JZLANG('操作')}</th>\n\t\t\t\t\t\t\t</tr> \n\t\t\t\t\t\t  </thead>\n\t\t\t\t\t\t  <tbody>\n\t\t\t\t\t\t\t{if(count($data['nav']))}\n\t\t\t\t\t\t\t{foreach $data['nav'] as $s}\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"tid[]\" lay-filter=\"tid\">\n\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $v}\n\t\t\t\t\t\t\t\t\t <option {if($s['tid']==$v['id'])} selected{/if}  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t<option value=\"0\" {if($s['tid']==0)}selected{/if}>{fun JZLANG('自定义链接')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"title[]\" value=\"{$s['title']}\" placeholder=\"{fun JZLANG('不填默认栏目名称')}\" autocomplete=\"off\" class=\"layui-input\"></td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"litpic[]\" value=\"{$s['litpic']}\"  placeholder=\"{fun JZLANG('不填默认空')}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t\t<img class=\"preview\" onerror=\"this.src='{__Tpl_style__}/style/images/nopic.jpg'\" src=\"{$s['litpic']}\">\n\t\t\t\t\t\t\t    <button type=\"button\" class=\"layui-btn layui-btn-sm uploadimg\">\n\t\t\t\t\t\t\t\t  <i class=\"layui-icon\">&#xe67c;</i>{fun JZLANG('上传图片')}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"gourl[]\" value=\"{$s['gourl']}\"  placeholder=\"{fun JZLANG('自定义链接则需要填写')}\" autocomplete=\"off\" class=\"layui-input\"></td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"target[]\" >\n\t\t\t\t\t\t\t\t\t<option {if($s['target']=='_self')}selected{/if} value=\"_self\">{fun JZLANG('本页面')}</option>\n\t\t\t\t\t\t\t\t\t<option {if($s['target']=='_blank')}selected{/if} value=\"_blank\">{fun JZLANG('新页面')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"status[]\" >\n\t\t\t\t\t\t\t\t\t<option {if($s['status']==1)}selected{/if}  value=\"1\">{fun JZLANG('显示')}</option>\n\t\t\t\t\t\t\t\t\t<option {if($s['status']==0)}selected{/if} value=\"0\">{fun JZLANG('不显示')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t  <a class=\"layui-btn layui-btn-xs layui-btn-danger\" onclick=\"del(this)\" >{fun JZLANG('删除')}</a>\n\t\t\t\t\t\t\t  <a class=\"layui-btn layui-btn-xs\" onclick=\"add(this)\" >{fun JZLANG('新增')}</a>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"tid[]\" lay-filter=\"tid\">\n\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $v}\n\t\t\t\t\t\t\t\t\t <option  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('自定义链接')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"title[]\"  placeholder=\"{fun JZLANG('不填默认栏目名称')}\" autocomplete=\"off\" class=\"layui-input\"></td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"litpic[]\"  placeholder=\"{fun JZLANG('不填默认空')}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t\t<img class=\"preview\" onerror=\"this.src='{__Tpl_style__}/style/images/nopic.jpg'\" src=\"\">\n\t\t\t\t\t\t\t    <button type=\"button\" class=\"layui-btn layui-btn-sm uploadimg\">\n\t\t\t\t\t\t\t\t  <i class=\"layui-icon\">&#xe67c;</i>{fun JZLANG('上传图片')}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td><input type=\"text\" name=\"gourl[]\"  placeholder=\"{fun JZLANG('自定义链接则需要填写')}\" autocomplete=\"off\" class=\"layui-input\"></td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"target[]\" >\n\t\t\t\t\t\t\t\t\t<option value=\"_self\">{fun JZLANG('本页面')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"_blank\">{fun JZLANG('新页面')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t\t<select name=\"status[]\" >\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示')}</option>\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不显示')}</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t  <td>\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  <a class=\"layui-btn layui-btn-xs\" onclick=\"add(this)\" >{fun JZLANG('新增')}</a>\n\t\t\t\t\t\t\t  </td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t  </tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('是否显示')}\n                    </label>\n                    <div class=\"layui-input-block\">\n                        <input type=\"radio\" name=\"isshow\" {if($data['isshow']==0)}checked{/if}   value=\"0\" title=\"{fun JZLANG('不显示')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['isshow']==1)}checked{/if}  >\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\t\t\t\t\t\t\n               \n                \n                <div class=\"layui-form-item\"   style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form,layer = layui.layer,laydate = layui.laydate;\n\t\t\t var upload = layui.upload;\n\t\t\t   \n\t\t\t  //执行实例\n\t\t\t  var uploadInst = upload.render({\n\t\t\t\telem: '.uploadimg' //绑定元素\n\t\t\t\t,url: '{fun U('common/uploads')}' //上传接口\n\t\t\t\t,done: function(res, index, upload){\n\t\t\t\t  //上传完毕回调\n\t\t\t\t  $(this.item).parent().children('.layui-input').val(res.url)\n\t\t\t\t  $(this.item).parent().children('.preview').attr('src',res.url)\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,error: function(){\n\t\t\t\t  //请求异常回调\n\t\t\t\t}\n\t\t\t  });\n\t\t\t   form.on('select(tid)', function(data){\n\t\t\t \n\t\t\n\t\t\t  \n\t\t\t});\n\t\t\t\t\n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\t$.post(\"{fun U('index/editmenu')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('index/menu')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t  \n\t\t\t\n\n              \n            });\n\t\t\tfunction renderForm(a){\n\t\t\t\tlayui.use(['laydate','form','layer','upload'], function(){\n\t\t\t\t  $ = layui.jquery;\n\t\t\t\t  var form = layui.form,layer = layui.layer,laydate = layui.laydate,upload = layui.upload;\n\n\t\t\t\t  upload.render({\n\t\t\t\t\telem: '.uploadimg_'+a //绑定元素\n\t\t\t\t\t,url: '{fun U('common/uploads')}' //上传接口\n\t\t\t\t\t,done: function(res, index, upload){\n\t\t\t\t\t  //上传完毕回调\n\t\t\t\t\t  $(this.item).parent().children('.layui-input').val(res.url)\n\t\t\t\t\t  $(this.item).parent().children('.preview').attr('src',res.url)\n\t\t\t\t\t  \n\t\t\t\t\t}\n\t\t\t\t\t,error: function(){\n\t\t\t\t\t  //请求异常回调\n\t\t\t\t\t}\n\t\t\t\t  });\n\t\t\t\t  form.render();\n\t\t\t\t});\n\t\t\t}\n\t\t\tfunction randomString(e) {  \n\t\t\t  e = e || 32;\n\t\t\t  var t = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\",\n\t\t\t  a = t.length,\n\t\t\t  n = \"\";\n\t\t\t  for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));\n\t\t\t  return n\n\t\t\t}\n\t\t\tfunction add(a){\n\t\t\t\tvar rand = randomString(6);\n\t\t\t\tvar html = '<tr>'+\n\t\t\t\t\t\t\t  '<td>'+\n\t\t\t\t\t\t\t\t'<select name=\"tid[]\" lay-filter=\"tid\">'+\n\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $v}\n\t\t\t\t\t\t\t\t\t '<option  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>'+\n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t'<option value=\"0\">{fun JZLANG('自定义链接')}</option>'+\n\t\t\t\t\t\t\t\t'</select>'+\n\t\t\t\t\t\t\t  '</td>'+\n\t\t\t\t\t\t\t  '<td><input type=\"text\" name=\"title[]\"  placeholder=\"{fun JZLANG('不填默认栏目名称')}\" autocomplete=\"off\" class=\"layui-input\"></td>'+\n\t\t\t\t\t\t\t  '<td><input type=\"text\" name=\"litpic[]\"  placeholder=\"{fun JZLANG('不填默认空')}\" autocomplete=\"off\" class=\"layui-input\"><img class=\"preview\" onerror=\"this.src=\\'{__Tpl_style__}/style/images/nopic.jpg\\'\" src=\"\"><button type=\"button\" class=\"layui-btn layui-btn-sm uploadimg_'+rand+'\"><i class=\"layui-icon\">&#xe67c;</i>{fun JZLANG('上传图片')}</button></td>'+\n\t\t\t\t\t\t\t  '<td><input type=\"text\" name=\"gourl[]\"  placeholder=\"{fun JZLANG('自定义链接则需要填写')}\" autocomplete=\"off\" class=\"layui-input\"></td>'+\n\t\t\t\t\t\t\t  '<td>'+\n\t\t\t\t\t\t\t\t'<select name=\"target[]\" >'+\n\t\t\t\t\t\t\t\t\t'<option value=\"_self\">{fun JZLANG('本页面')}</option>'+\n\t\t\t\t\t\t\t\t\t'<option value=\"_blank\">{fun JZLANG('新页面')}</option>'+\n\t\t\t\t\t\t\t\t'</select>'+\n\t\t\t\t\t\t\t ' </td>'+\n\t\t\t\t\t\t\t  '<td>'+\n\t\t\t\t\t\t\t\t'<select name=\"status[]\" >'+\n\t\t\t\t\t\t\t\t\t'<option value=\"1\">{fun JZLANG('显示')}</option>'+\n\t\t\t\t\t\t\t\t\t'<option value=\"0\">{fun JZLANG('不显示')}</option>'+\n\t\t\t\t\t\t\t\t'</select>'+\n\t\t\t\t\t\t\t  '</td>'+\n\t\t\t\t\t\t\t  '<td>'+\n\t\t\t\t\t\t\t  '<a class=\"layui-btn layui-btn-xs layui-btn-danger\" onclick=\"del(this)\" >{fun JZLANG('删除')}</a>'+\n\t\t\t\t\t\t\t  '<a class=\"layui-btn layui-btn-xs\" onclick=\"add(this)\" >{fun JZLANG('新增')}</a>'+\n\t\t\t\t\t\t\t  '</td>'+\n\t\t\t\t\t\t\t'</tr>';\n\t\t\t\t$(a).parent().parent().after(html);\n\t\t\t\trenderForm(rand);\n\t\t\t}\n\t\t\tfunction del(a){\n\t\t\t\t$(a).parent().parent().remove();\n\t\t\t}\n\t\t\t\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/extmolds-add.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n        {include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展模型管理')}</cite></a>\n              <a><cite>{fun JZLANG('新增')}{$molds['name']}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" lay-filter=\"jizhiform\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t{if($molds['isclasstype']==1)}\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('所属栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" {if($molds['ismust']==1)}lay-verify=\"required\"{/if} lay-filter=\"tid\" id=\"tid\" >\n\t\t\t\t\t\t{if($molds['ismust']==1)}\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t   {if($v['molds']==$molds['biaoshi'])}\n\t\t\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t\t\t   <option {if($tid==$v['id'])}selected{/if} value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t   \n\t\t\t\t\t   </select>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<button type=\"button\" id=\"resetdata\" class=\"layui-btn layui-btn-sm\">{fun JZLANG('恢复数据')}</button>\n                    </div>\n\t\t\t\t\t\n                </div>\n\t\t\t\t{else}\n\t\t\t\t<input type=\"hidden\" name=\"tid\" value=\"0\" />\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t <span id=\"content_fields\"></span>\n\t\t\t\t\n\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\n                <div class=\"layui-form-item\" id=\"jizhitj\"  style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n\t\t\t$(function() {\n\t\t\t   get_fields({$tid});\n\t\t\t   get_fields_ext({$tid});\t\n\t\t\t})\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\t\n\t\t\t\tif($(\"#tids\").length>0){\n\t\t\t\t\tvar tids_str = tids_obj.getValue('valueStr');\n\t\t\t\t\tif(tids_str!=''){\n\t\t\t\t\tdata.field.tids = ','+tids_str+',';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n                //发异步，把数据提交给php\n\t\t\t\t$.post(\"{fun U('Extmolds/addmolds',array('molds'=>$molds['biaoshi']))}\",data.field,function(r){\n\t\t\t\t\tlocalStorage.setItem('cachedata', '');\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   \n\t\t\t\t\t\t   {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.href=\"{fun U('Extmolds/index',['molds'=>$molds['biaoshi']])}\";\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t   parent.location.reload();\n\t\t\t\t\t\t   parent.layer.close(index);\n\t\t\t\t\t\t   \n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t   \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\n\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t\n            form.on('select(tid)', function(data){\n\t\t\t  var alldata = form.val(\"jizhiform\");\n\t\t\t  localStorage.setItem('cachedata', JSON.stringify(alldata));\n\t\t\t  get_fields(data.value);\n\t\t\t  get_fields_ext(data.value);\n\t\t\t  \n\t\t\t});\n\t\t\t\n\t\t\t$(\"#resetdata\").click(function(){\n\t\t\t\tvar alldata = localStorage.getItem('cachedata');\n\t\t\t\tif(alldata!=''){\n\t\t\t\t\tform.val(\"jizhiform\",JSON.parse(alldata));\n\t\t\t\t}\n\t\t\t})\n\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/extmolds-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展模型管理')}</cite></a>\n              <a><cite>{fun JZLANG('修改')}{$molds['name']}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" lay-filter=\"jizhiform\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t{if($molds['isclasstype']==1)}\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('所属栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" lay-filter=\"tid\" {if($molds['ismust']==1)}lay-verify=\"required\"{/if} id=\"tid\" >\n\t\t\t\t\t\t{if($molds['ismust']==1)}\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t   {if($v['molds']==$molds['biaoshi'])}\n\t\t\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t\t\t   <option {if($data['tid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t  \n\t\t\t\t\t   </select>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<button type=\"button\" id=\"resetdata\" class=\"layui-btn layui-btn-sm\">{fun JZLANG('恢复数据')}</button>\n                    </div>\n                </div>\n\t\t\t\t{else}\n\t\t\t\t<input type=\"hidden\" name=\"tid\" value=\"{$data['tid']}\" />\n\t\t\t\t{/if}\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\t\n\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n                <div class=\"layui-form-item\" id=\"jizhitj\"  style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n\t\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t  \n\t\t\t  var upload = layui.upload;\n\t\t\t \n\t\t\t     //监听提交\n              form.on('submit(save)', function(data){\n                if($(\"#tids\").length>0){\n\t\t\t\t\tvar tids_str = tids_obj.getValue('valueStr');\n\t\t\t\t\tif(tids_str!=''){\n\t\t\t\t\tdata.field.tids = ','+tids_str+',';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('Extmolds/editmolds',array('molds'=>$molds['biaoshi']))}\",data.field,function(r){\n\t\t\t\t\tlocalStorage.setItem('cachedata', '');\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回列表')}','{fun JZLANG('取消')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('Extmolds/index',['molds'=>$molds['biaoshi']])}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.layer.closeAll();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\tparent.layer.closeAll();\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n           \n\t\t\t  \n\t\t\tget_fields({$data['tid']},{$data['id']});\n            get_fields_ext({$data['tid']},{$data['id']});\n\t\t\tform.on('select(tid)', function(data){\n\t\t\t  var alldata = form.val(\"jizhiform\");\n\t\t\t  localStorage.setItem('cachedata', JSON.stringify(alldata));\n\t\t\t  get_fields(data.value,{$data['id']}); \n\t\t\t  get_fields_ext(data.value,{$data['id']});\n\t\t\t  \n\t\t\t  \n\t\t\t});\n\t\t\t$(\"#resetdata\").click(function(){\n\t\t\t\tvar alldata = localStorage.getItem('cachedata');\n\t\t\t\tif(alldata!=''){\n\t\t\t\t\tform.val(\"jizhiform\",JSON.parse(alldata));\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/extmolds-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展模型管理')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t\n\t\t\t\t\t  {$fields_search}\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t\t</div>\n\t\t</div>\n\t\t\n\t\t\n        \n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t{if($molds['ispreview']==1)}\n\t\t<a class=\"layui-btn layui-btn-xs layui-btn-normal\" lay-event=\"view\">{fun JZLANG('预览')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Extmolds/editmolds/molds/'.$molds['biaoshi']))}\n\t\t\t<a class=\"layui-btn layui-btn-xs\" lay-event=\"edit\">{fun JZLANG('编辑')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Extmolds/deletemolds/molds/'.$molds['biaoshi']))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Extmolds/copymolds/molds/'.$molds['biaoshi']))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-warm\" lay-event=\"copy\">{fun JZLANG('复制')}</a>\n\t\t{/if}\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t {if(checkAction('Extmolds/deleteAll/molds/'.$molds['biaoshi']))}\n\t\t\t   <a class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Extmolds/copyAll/molds/'.$molds['biaoshi']))}\n\t\t\t   <a class=\"layui-btn layui-btn-sm layui-btn-warm\" onclick=\"copyAll()\">{fun JZLANG('批量复制')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Extmolds/addmolds/molds/'.$molds['biaoshi']))}\n\t\t\t{if($tid)}\n\t\t\t\t<a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增')}{$molds['name']}','{fun U('Extmolds/addmolds',array('molds'=>$molds['biaoshi'],'tid'=>$tid))}')\"><i class=\"layui-icon\">&#xe608;</i>{fun JZLANG('新增')}</a>\n\t\t\t{else}\n\t\t\t   <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增')}{$molds['name']}','{fun U('Extmolds/addmolds',array('molds'=>$molds['biaoshi']))}')\"><i class=\"layui-icon\">&#xe608;</i>{fun JZLANG('新增')}</a>\n\t\t\t{/if}\n\t\t {/if}\n\t\t {if(checkAction('Extmolds/changeType/molds/'.$molds['biaoshi']))}\n\t\t\t   {if($molds['isclasstype'])}\n\t\t\t   <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_tid\"  lay-search=\"\" lay-filter=\"change_tid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量修改栏目')}</option>\n\t\t\t   {foreach $classtypes as $v}\n\t\t\t   {if($v['molds']==$molds['biaoshi'])}\n\t\t\t   <option   value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t   {/if}\n\t\t\t   {/foreach}\n\t\t\t   </select>\n\t\t\t   </div>\n\t\t\t   {/if}\n\t\t {/if}\n\t\t {if(checkAction('Extmolds/changeAttribute/molds/'.$molds['biaoshi']))}\n\t\t <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;\">\n\t\t\t <select class=\"\" id=\"change_tuijian\"  lay-filter=\"change_tuijian\" >\n\t\t\t\t <option value=\"0\">{fun JZLANG('修改推荐属性')}</option>\n\t\t\t\t {loop table=\"attr\" isshow=\"1\" as=\"v\"}\n\t\t\t\t <option   value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t {/loop}\n\n\t\t\t </select>\n\t\t </div>\n\t\t {/if}\n\t\t {if(checkAction('Extmolds/checkAll/molds/'.$molds['biaoshi']))}\n\t\t  <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;width:150px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_isshow\"  lay-filter=\"change_isshow\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量审核')}</option>\n\t\t\t   <option   value=\"1\">{fun JZLANG('审核')}</option>\n\t\t\t   <option   value=\"2\">{fun JZLANG('未审核')}</option>\n\t\t\t   <option   value=\"3\">{fun JZLANG('退回')}</option>\n\t\t\t   </select>\n\t\t  </div>\n\t\t {/if}\n\t\t \t \n\t\t <a class=\"layui-btn layui-btn-warm layui-btn-sm\" title=\"{fun JZLANG('设置')}\" onclick=\"x_admin_show('{fun JZLANG('列表字段设置')}','{fun U('Fields/fieldsList',['molds'=>$molds['biaoshi']])}')\"><i class=\"iconfont\">&#xe6ae;</i></a>\n\t\t\t\n\t\t </div>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"isshow\">\n\t\t\t{{#  if(d.isshow ==1){ }}\n\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('显示')}}</span>\n\t\t    {{#  } else{ }}\n\t\t    <span class=\"layui-badge\">{fun JZLANG('不显示')}}</span>\n\t\t    {{#  } }}\n\t\t</script>\n\t \n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  \n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 650\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '{fun JZLANG('首页')}' //不显示首页\n\t\t\t\t  ,last: '{fun JZLANG('尾页')}' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  {foreach $fields_list as $v}\n\t\t\t\t  ,{field: '{$v['field']}',width:{if(!$v['width'])}100{else}{$v['width']}{/if}, title: '{$v['fieldname']}' {if($v['fieldtype']==1 || $v['fieldtype']==2 || $v['fieldtype']==4 || $v['fieldtype']==14)},edit:'text'{/if} }\n\t\t\t\t  {/foreach}\n\t\t\t\t  {if(checkAction('Extmolds/copymolds/molds/'.$molds['biaoshi']) || checkAction('Extmolds/deletemolds/molds/'.$molds['biaoshi']) || checkAction('Extmolds/editmolds/molds/'.$molds['biaoshi']))}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}', toolbar: '#rightbar',width:240, fixed:'right'}\n\t\t\t\t  {/if}\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('编辑')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t    var a = $('<a href=\"'+data.view_url+'\" target=\"_blank\">{fun JZLANG('预览')}</a>').get(0);\n\t\t\t\t\t\t\tvar e = document.createEvent('MouseEvents');\n\t\t\t\t\t\t\te.initEvent( 'click', true, true );\n\t\t\t\t\t\t\ta.dispatchEvent(e);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Extmolds/deletemolds')}\",{molds:\"{$molds['biaoshi']}\",id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t\t\t$.post(\"{fun U('Extmolds/copymolds')}\",{molds:\"{$molds['biaoshi']}\",id:data.id},function(r){\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t  \n\t\t\t\t\t\t \n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t\n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\ttable.on('edit(jizhi_table)', function(obj){ //注：edit是固定事件名，test是table原始容器的属性 lay-filter=\"对应的值\"\n\t\t\t\t\n\t\t\t\t  var id = obj.data.id;\n\t\t\t\t  var value = obj.value;\n\t\t\t\t  var field = obj.field;\n\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Extmolds/editOrders')}\",{'id':id,'field':field,'value':value,'molds':'{$molds['biaoshi']}'},function(r){\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg(r.info,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\t\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t    form.on('select(change_tid)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar tid = parseInt(data.value);\n\t\t\t\t\tif(tid==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择修改栏目！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量修改内容分类吗？')}['+datas+']=>['+tid+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Extmolds/changeType')}\",{molds:\"{$molds['biaoshi']}\",data:datas,tid:tid},function(r){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量修改成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\n\t\t\t    form.on('select(change_isshow)', function(data){\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar isshow = parseInt(data.value);\n\t\t\t\t\tif(isshow==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核选项！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(isshow==1){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('已审核')}';\n\t\t\t\t\t}else if(isshow==2){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('未审核')}';\n\t\t\t\t\t}else{\n\t\t\t\t\t\tvar tip = '{fun JZLANG('退回')}';\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量处理吗？')}['+datas+']=>['+tip+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Extmolds/checkAll')}\",{molds:\"{$molds['biaoshi']}\",data:datas,isshow:isshow},function(r){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量处理成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\n\t\t\tform.on('select(change_tuijian)', function(data){\n\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\tvar tj = parseInt(data.value);\n\t\t\t\tif(tj==0){\n\t\t\t\t\talert('{fun JZLANG('请选择修改属性！')}');return false;\n\t\t\t\t}\n\t\t\t\tif(datas==''){\n\t\t\t\t\talert('{fun JZLANG('请选择修改对象！')}');return false;\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('Extmolds/changeAttribute')}\",{molds:\"{$molds['biaoshi']}\",data:datas,tj:tj},function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量修改成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\turl: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t,where: {} //设定异步数据接口的额外参数\n\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\n\t\t\t\t\t}else{\n\n\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t}\n\t\t\t\t})\n\n\n\t\t\t});\n\t\t\t\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Extmolds/deleteAll')}\",{molds:\"{$molds['biaoshi']}\",data:data},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t function copyAll(){\n\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要复制吗？')}['+data+']',function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Extmolds/copyAll')}\",{molds:\"{$molds['biaoshi']}\",data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量复制成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t  \n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/fields-add.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t{include=\"style\"}\n\t<style>\n\t\t.layui-form-item .layui-input-inline {\n\t\t\twidth: 210px;\n\t\t}\n\n\t\tinput:read-only:not(.layui-unselect) {\n\t\t\tbackground-color: #eee;\n\t\t}\n\n\t\ttd div:not(:first-child) .layui-input {\n\t\t\tmargin-top: 10px;\n\t\t}\n\n\t\t.layui-input:not(:first-child) {\n\t\t\tmargin-top: 10px;\n\t\t}\n\n\t\t.layui-textarea {\n\t\t\tmargin-top: 10px;\n\t\t}\n\n\t\ttd label {\n\t\t\tvertical-align: -3px;\n\t\t}\n\t</style>\n</head>\n\n<body>\n\t<div class=\"x-nav\">\n\t\t<span class=\"layui-breadcrumb\">\n\t\t\t<a><cite>{fun JZLANG('首页')}</cite></a>\n\t\t\t<a><cite>{fun JZLANG('系统扩展')}</cite></a>\n\t\t\t<a><cite>{fun JZLANG('模块管理')}</cite></a>\n\t\t\t<a><cite>{fun JZLANG('字段管理')}</cite></a>\n\t\t\t<a><cite>{fun JZLANG('新增字段')}</cite></a>\n\t\t</span>\n\t\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n\t</div>\n\t<div class=\"x-body\">\n\t\t<form class=\"layui-form layui-form-pane\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"molds\" value=\"{$molds}\" />\n\n\t\t\t<div class=\"layui-tab\">\n\t\t\t\t<ul class=\"layui-tab-title\">\n\t\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t\t{if($molds=='level')}\n\t\t\t\t\t<li>{fun JZLANG('角色绑定')}</li>\n\t\t\t\t\t{else}\n\t\t\t\t\t<li>栏{fun JZLANG('目绑定')}</li>\n\t\t\t\t\t{/if}\n\t\t\t\t</ul>\n\t\t\t\t<div class=\"layui-tab-content\">\n\t\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"fieldname\" class=\"layui-form-label\"><span class=\"x-red\">*</span>{fun JZLANG('字段名称')}</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"fieldname\" name=\"fieldname\" required=\"\" lay-verify=\"required\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('简短的名称')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"field\" class=\"layui-form-label\"><span class=\"x-red\">*</span>{fun JZLANG('字段标识')}</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"field\" name=\"field\" autocomplete=\"off\" required=\"\" lay-verify=\"required\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"fieldtxt\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('字段类型')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-block\" style=\"padding:0 10px;\">\n\t\t\t\t\t\t\t\t<table class=\"layui-table\">\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('选择')}</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('内容')}</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('说明')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" checked value=\"1\" /><label>{fun JZLANG('单行文本')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_1\" value=\"255\"></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单行文本')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"2\" /><label>{fun JZLANG('多行文本')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_2\" value=\"500\"></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多行文本')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"3\" /><label>{fun JZLANG('带编辑器文本')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_3\" value=\"{fun JZLANG('不限')}\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('带编辑器文本')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"15\" /><label>{fun JZLANG('多行动态新增')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_15\" value=\"{fun JZLANG('不限')}\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('可以在页面动态新增内容输入框')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"4\" /><label>{fun JZLANG('11位数字')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_4\" value=\"11\"></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('只能填写数字，长度不能超过11位')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"14\" /><label>{fun JZLANG('两位小数')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_14\" value=\"10,2\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"body_14\" value=\"0.00\"></div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('金钱，小数等，保留2位')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"11\" /><label>{fun JZLANG('日期时间')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_11\" value=\"11\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('时间日期')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"5\" /><label>{fun JZLANG('单图')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_5\" value=\"255\"></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单图片')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"6\" /><label>{fun JZLANG('多图')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_6\" value=\"{fun JZLANG('不限')}\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多图片，图集')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"7\" /><label>{fun JZLANG('单选下拉')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_7\" value=\"500\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><textarea placeholder=\"{fun JZLANG('红=1,黄=2')}\" name=\"body_7\" class=\"layui-textarea\"></textarea></div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单项选择，下拉选择，如：红=1,黄=2,蓝=3')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"12\" /><label>{fun JZLANG('单选按钮')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_12\" value=\"500\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><textarea placeholder=\"{fun JZLANG('红=1,黄=2')}\" name=\"body_12\" class=\"layui-textarea\"></textarea></div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单项选择，按钮选择，如：红=1,黄=2,蓝=3')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"8\" /><label>{fun JZLANG('多选按钮')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_8\" value=\"500\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><textarea placeholder=\"{fun JZLANG('红=1,黄=2')}\" name=\"body_8\" class=\"layui-textarea\"></textarea><div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多项选择，如：红=1,黄=2,蓝=3')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"9\" /><label>{fun JZLANG('单文件')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_9\" value=\"255\"></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('一个附件，压缩包，Excel，Word文档')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"10\" /><label>{fun JZLANG('多文件')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_10\" value=\"{fun JZLANG('不限')}\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多个附件，压缩包，Excel，Word文档')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"13\" /><label>{fun JZLANG('模块内容关联')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_13\" value=\"11\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select\" id=\"molds_select\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('请选择关联模块')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{loop table=\"molds\" as=\"v\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field\" id=\"molds_list_field\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"field_remote_13\" >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('是否远程数据')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option selected=\"selected\" value=\"1\">是</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"0\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"16\" /><label>{fun JZLANG('模块内容关联（多选）')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_16\" value=\"255\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_muti\" id=\"molds_select_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('请选择关联模块')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{loop table=\"molds\" as=\"v\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_muti\" id=\"molds_list_field_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"field_remote_16\" >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('是否远程数据')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option selected=\"selected\" value=\"1\">是</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"0\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"21\" /><label>{fun JZLANG('栏目内容关联')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_21\" value=\"11\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_tid\" lay-search id=\"molds_select_tid\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('请选择关联栏目')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $vs}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"{$vs['id']}\">{fun str_repeat('&nbsp;&nbsp;',$vs['level'])}{if($vs['haschild'])}|——{else}{if($vs['level'])}|——{/if}{/if}{$vs['classname']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_tid\" id=\"molds_list_field_tid\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"field_remote_21\" >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('是否远程数据')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option selected=\"selected\" value=\"1\">是</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"0\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('栏目关联单选，可以直接绑定某个栏目下的内容，包括子栏目')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"20\" /><label>{fun JZLANG('栏目内容关联（多选）')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_20\" value=\"255\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_tid_muti\" lay-search id=\"molds_select_tid_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('请选择关联栏目')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $vs}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"{$vs['id']}\">{fun str_repeat('&nbsp;&nbsp;',$vs['level'])}{if($vs['haschild'])}|——{else}{if($vs['level'])}|——{/if}{/if}{$vs['classname']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_tid_muti\" id=\"molds_list_field_tid_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"field_remote_20\" >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('是否远程数据')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option selected=\"selected\" value=\"1\">是</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"0\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('栏目关联多选，可以直接绑定某个栏目下的多个内容，包括子栏目')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"17\" /><label>{fun JZLANG('系统栏目')} [ tid ]</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_17\" value=\"11\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('系统栏目，不可修改')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"18\" /><label>{fun JZLANG('系统副栏目')} [ tids ]</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_18\" value=\"255\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('系统副栏目，不可修改')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"19\" /><label>{fun JZLANG('系统TAG')} [ tags ]</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_19\" value=\"255\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('系统TAG，不可修改')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"vdata\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('默认值')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"vdata\" name=\"vdata\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"tips\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('字段提示')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\" style=\"width:600px;\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"tips\" name=\"tips\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('用于填写时的提示信息，50字以内')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"orders\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('表单排序')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"number\" id=\"orders\" value=\"100\" name=\"orders\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('数字越大越靠前')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"ismust\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('是否必填')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"ismust\" value=\"1\" title=\"{fun JZLANG('必填')}\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"ismust\" value=\"0\" title=\"{fun JZLANG('非必填')}\" checked>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('带有文本框编辑器的除外')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"isshow\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('前台显示')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('不显示')}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"ishome\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('前台表单')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"0\" title=\"{fun JZLANG('不显示')}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"isadmin\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('后台显示')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isadmin\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isadmin\" value=\"0\" title=\"{fun JZLANG('不显示')}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"issearch\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('后台搜索')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"issearch\" value=\"1\" title=\"{fun JZLANG('显示')}\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"issearch\" value=\"0\" title=\"{fun JZLANG('不显示')}\" checked>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('仅用于后台列表头部带有该字段搜索')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"islist\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('列表中显示')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"islist\" value=\"1\" title=\"{fun JZLANG('显示')}\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"islist\" value=\"0\" title=\"{fun JZLANG('不显示')}\" checked>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('仅用于后台列表显示该字段')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"format\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('显示格式化')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<select name=\"format\" lay-filter=\"format\" id=\"format\">\n\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('不做处理')}</option>\n\t\t\t\t\t\t\t\t\t{foreach format_fields() as $k=>$v}\n\t\t\t\t\t\t\t\t\t<option value=\"{$k}\">{$v}</option>\n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('仅用于后台列表显示该字段内容处理')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"isajax\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('ajax可访问')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isajax\" value=\"1\" title=\"{fun JZLANG('可以')}\" checked>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isajax\" value=\"0\" title=\"{fun JZLANG('不可以')}\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('由于本系统对json数据封装，限制访问可以提高安全性')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"ldfield\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('联动关联')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"ldfield\" placeholder=\"联动字段\" value=\"\" name=\"ldfield\" autocomplete=\"off\" class=\"layui-input\">\n\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"linkfield\" placeholder=\"联动字段之关联字段\" value=\"\" name=\"linkfield\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('填写联动字段，可以关联多个，用|分隔')}</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t\t{if($molds=='level')}\n\t\t\t\t\t\t<table class=\"layui-table layui-form\">\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th width=\"20\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-unselect header layui-form-checkbox layui-form-checked\" lay-skin=\"primary\"><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t<th>{fun JZLANG('角色名')}</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody class=\"x-cate\">\n\t\t\t\t\t\t\t\t{php\n\t\t\t\t\t\t\t\t\tif($admin['gid']!=1){\n\t\t\t\t\t\t\t\t\t\t$levelgroup = M('level_group')->findAll('id!=1');\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t$levelgroup = M('level_group')->findAll();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$levelgroup = set_class_haschild($levelgroup);\n\t\t\t\t\t\t\t\t\t$levelgroup = getTree($levelgroup);\n\t\t\t\t\t\t\t\t/}\n\t\t\t\t\t\t\t\t{foreach $levelgroup as $v}\n\t\t\t\t\t\t\t\t<tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\">\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-unselect layui-form-checkbox layui-form-checked\" lay-skin=\"primary\" data-id='{$v['id']}'><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t{fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n\t\t\t\t\t\t\t\t\t\t{if($v['haschild'])}\n\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon x-show\" status='false'>&#xe625;</i>\n\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t\t{if($v['level'])}|——{/if}\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t{$v['name']}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<table class=\"layui-table layui-form\">\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th width=\"20\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-unselect header layui-form-checkbox layui-form-checked\" lay-skin=\"primary\"><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t<th>{fun JZLANG('栏目名')}</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody class=\"x-cate\">\n\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\n\t\t\t\t\t\t\t\t{if($v['molds']==$molds || $molds=='classtype')}\n\t\t\t\t\t\t\t\t<tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\">\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-unselect layui-form-checkbox layui-form-checked\" lay-skin=\"primary\" data-id='{$v['id']}'><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t{fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n\t\t\t\t\t\t\t\t\t\t{if($v['haschild'])}\n\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon x-show\" status='false'>&#xe625;</i>\n\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t\t{if($v['level'])}|——{/if}\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t{$v['classname']}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"layui-form-item\" style=\"text-align:center;\">\n\t\t\t\t<button class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">{fun JZLANG('保存')}</button>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n\n\t<script>\t\t\t\n\t\tlayui.use(['laydate','form','layer','upload'], function(){\n\t\t\t$ = layui.jquery;\n\t\t\tvar form = layui.form\n\t\t\t\t,layer = layui.layer\n\t\t\t\t,laydate = layui.laydate;\t\n\t\t\t\n\t\t\t//监听提交\n\t\t\tform.on('submit(save)', function(data){\n\t\t\t\tvar tids = tableCheck.getData().join(',');\n\t\t\t\tif(tids==''){\n\t\t\t\t\t//layer.alert('请选择绑定栏目！', {icon: 5});\n\t\t\t\t\t//return false;\n\t\t\t\t\ttids = 0;\n\t\t\t\t}\n\t\t\t\tdata.field.tids = tids;\n\t\t\t\tdata.field.field = data.field.field.toLowerCase()\n\t\t\t\t//发异步，把数据提交给php\n\t\t\t\t$.post(\"{fun U('Fields/addFields')}\",data.field,function(r){\t\t\t\t\t\n\t\t\t\t\t//console.log(r);return false;\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\twindow.location.href=\"{fun U('Fields/index',['molds'=>$molds])}\";\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\tvar index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引\n\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t});\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/fields-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t{include=\"style\"}\n\t<style>\n\t\t.layui-form-item .layui-input-inline {\n\t\t\twidth: 210px;\n\t\t}\n\n\t\tinput:read-only:not(.layui-unselect) {\n\t\t\tbackground-color: #eee;\n\t\t}\n\n\t\ttd div:not(:first-child) .layui-input {\n\t\t\tmargin-top: 10px;\n\t\t}\n\n\t\t.layui-input:not(:first-child) {\n\t\t\tmargin-top: 10px;\n\t\t}\n\n\t\t.layui-textarea {\n\t\t\tmargin-top: 10px;\n\t\t}\n\n\t\ttd label {\n\t\t\tvertical-align: -3px;\n\t\t}\n\t</style>\n</head>\n\n<body>\n\t<div class=\"x-nav\">\n\t\t<span class=\"layui-breadcrumb\">\n\t\t\t<a><cite>{fun JZLANG('首页')}</cite></a>\n\t\t\t<a><cite>{fun JZLANG('系统扩展')}</cite></a>\n\t\t\t<a><cite>{fun JZLANG('模块管理')}</cite></a>\n\t\t\t<a><cite>{fun JZLANG('字段管理')}</cite></a>\n\t\t\t<a><cite>{fun JZLANG('修改字段')}</cite></a>\n\t\t</span>\n\t\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n\t</div>\n\t<div class=\"x-body\">\n\t\t<form class=\"layui-form layui-form-pane\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t<input type=\"hidden\" name=\"molds\" value=\"{$data['molds']}\" />\n\n\t\t\t<div class=\"layui-tab\">\n\t\t\t\t<ul class=\"layui-tab-title\">\n\t\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t\t{if($data['molds']=='level')}\n\t\t\t\t\t<li>{fun JZLANG('角色绑定')}</li>\n\t\t\t\t\t{else}\n\t\t\t\t\t<li>{fun JZLANG('栏目绑定')}</li>\n\t\t\t\t\t{/if}\n\t\t\t\t</ul>\n\t\t\t\t<div class=\"layui-tab-content\">\n\t\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"fieldname\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('字段名称')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"fieldname\" value=\"{$data['fieldname']}\" name=\"fieldname\" required=\"\" lay-verify=\"required\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('简短的名称')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"field\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('字段标识')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"field\" value=\"{$data['field']}\" name=\"field\" autocomplete=\"off\" required=\"\" lay-verify=\"required\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"fieldtxt\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('字段类型')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-block\" style=\"padding:0 10px;\">\n\t\t\t\t\t\t\t\t<table class=\"layui-table\">\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('选择')}</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('内容')}</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('说明')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==1)} checked {/if} value=\"1\" /><label>{fun JZLANG('单行文本')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input\" name=\"fieldlong_1\" value=\"{if($data['fieldtype']==1)}{$data['fieldlong']}{else}255{/if}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单行文本')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==2)} checked {/if} value=\"2\" /><label>{fun JZLANG('多行文本')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input\" name=\"fieldlong_2\" value=\"{if($data['fieldtype']==2)}{$data['fieldlong']}{else}500{/if}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多行文本')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==3)} checked {/if} value=\"3\" /><label>{fun JZLANG('带编辑器文本')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" name=\"fieldlong_3\" class=\"layui-input\" value=\"不限\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('带编辑器文本')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==15)} checked {/if} value=\"15\" /><label>{fun JZLANG('多行动态新增')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\"  name=\"fieldlong_15\" class=\"layui-input\" value=\"不限\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('可以在页面动态新增内容输入框')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==4)} checked {/if} value=\"4\" /><label>{fun JZLANG('11位数字')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_4\" value=\"{if($data['fieldtype']==4)}{$data['fieldlong']}{else}11{/if}\"></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('只能填写数字，长度不能超过11位')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==14)} checked {/if} value=\"14\" /><label>{fun JZLANG('两位小数')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_14\" value=\"{if($data['fieldtype']==14)}{$data['fieldlong']}{else}10,2{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"body_14\" value=\"{if($data['fieldtype']==14)}{$data['body']}{else}0.00{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('金钱，小数等，保留2位')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==11)} checked {/if} value=\"11\" /><label>{fun JZLANG('日期时间')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_11\" value=\"{if($data['fieldtype']==11)}{$data['fieldlong']}{else}11{/if}\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('时间日期')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==5)} checked {/if} value=\"5\" /><label>{fun JZLANG('单图')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"text\" class=\"layui-input\" name=\"fieldlong_5\" value=\"{if($data['fieldtype']==5)}{$data['fieldlong']}{else}255{/if}\"></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单图片')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==6)} checked {/if} value=\"6\" /><label>{fun JZLANG('多图')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_6\"  value=\"不限\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多图片，图集')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==7)} checked {/if} value=\"7\" /><label>{fun JZLANG('单选下拉')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_7\" value=\"{if($data['fieldtype']==7)}{$data['fieldlong']}{else}500{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><textarea placeholder=\"{fun JZLANG('红=1,黄=2,蓝=3')}\" name=\"body_7\" class=\"layui-textarea\">{if($data['fieldtype']==7)}{$data['body']}{else}{/if}</textarea></div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单项选择，下拉选择，如：红=1,黄=2,蓝=3')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==12)} checked {/if} value=\"12\" /><label>{fun JZLANG('单选按钮')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_12\" value=\"{if($data['fieldtype']==12)}{$data['fieldlong']}{else}500{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><textarea placeholder=\"{fun JZLANG('红=1,黄=2,蓝=3')}\" name=\"body_12\" class=\"layui-textarea\">{if($data['fieldtype']==12)}{$data['body']}{else}{/if}</textarea></div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('单项选择，按钮选择，如：红=1,黄=2,蓝=3')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==8)} checked {/if} value=\"8\" /><label>{fun JZLANG('多选按钮')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_8\" value=\"{if($data['fieldtype']==8)}{$data['fieldlong']}{else}500{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><textarea placeholder=\"{fun JZLANG('红=1,黄=2,蓝=3')}\" name=\"body_8\" class=\"layui-textarea\">{if($data['fieldtype']==8)}{$data['body']}{else}{/if}</textarea></div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多项选择，如：红=1,黄=2,蓝=3')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==9)} checked {/if} value=\"9\" /><label>{fun JZLANG('单文件')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_9\" value=\"{if($data['fieldtype']==9)}{$data['fieldlong']}{else}255{/if}\"></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('一个附件，压缩包，Excel，Word文档')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==10)} checked {/if} value=\"10\" /><label>{fun JZLANG('多文件')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_10\"  value=\"不限\" readonly></div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多个附件，压缩包，Excel，Word文档')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==13)} checked {/if} value=\"13\" /><label>{fun JZLANG('模块内容关联')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_13\" value=\"{if($data['fieldtype']==13)}{$data['fieldlong']}{else}11{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{if($data['fieldtype']==13)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{php $vdata = explode(',',$data['body']) /}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{loop table=\"molds\" as=\"v\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($vdata[0]==$v['id'])}selected{/if} value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field\" value=\"{$vdata[1]}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{loop table=\"molds\" as=\"v\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"field_remote_13\" >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('是否远程数据')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($data['remote']==1)}selected{/if} value=\"1\">是</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($data['remote']==0)}selected{/if} value=\"0\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('关联模块内容ID')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" value=\"16\" {if($data['fieldtype']==16)} checked {/if} /><label>{fun JZLANG('模块内容关联（多选）')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_16\" value=\"{if($data['fieldtype']==16)}{$data['fieldlong']}{else}255{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{if($data['fieldtype']==16)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{php $vdata = explode(',',$data['body']) /}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_muti\" id=\"molds_select_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('请选择关联模块')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{loop table=\"molds\" as=\"v\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($vdata[0]==$v['id'])}selected{/if} value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select><input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_muti\" id=\"molds_list_field_muti\" value=\"{$vdata[1]}\">{else}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_muti\" id=\"molds_select_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('请选择关联模块')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{loop table=\"molds\" as=\"v\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select><input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_muti\" id=\"molds_list_field_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"field_remote_16\" >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('是否远程数据')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($data['remote']==1)}selected{/if} value=\"1\">是</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($data['remote']==0)}selected{/if} value=\"0\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==21)} checked {/if} value=\"21\" /><label>{fun JZLANG('栏目内容关联')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_21\" value=\"{if($data['fieldtype']==21)}{$data['fieldlong']}{else}11{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{if($data['fieldtype']==21)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{php $vdata = explode(',',$data['body']) /}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_tid\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $vs}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($vdata[0]==$vs['id'])}selected{/if} value=\"{$vs['id']}\">{fun str_repeat('&nbsp;&nbsp;',$vs['level'])}{if($vs['haschild'])}|——{else}{if($vs['level'])}|——{/if}{/if}{$vs['classname']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_tid\" value=\"{$vdata[1]}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_tid\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $vs}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"{$vs['id']}\">{fun str_repeat('&nbsp;&nbsp;',$vs['level'])}{if($vs['haschild'])}|——{else}{if($vs['level'])}|——{/if}{/if}{$vs['classname']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_tid\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"field_remote_21\" >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('是否远程数据')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($data['remote']==1)}selected{/if} value=\"1\">是</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($data['remote']==0)}selected{/if} value=\"0\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('栏目关联单选，关联模块内容ID')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==20)} checked {/if} value=\"20\" /><label>{fun JZLANG('栏目内容关联（多选）')}</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t\t<div><input type=\"text\" class=\"layui-input\" name=\"fieldlong_20\" value=\"{if($data['fieldtype']==20)}{$data['fieldlong']}{else}255{/if}\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{if($data['fieldtype']==20)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{php $vdata = explode(',',$data['body']) /}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_tid_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $vs}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($vdata[0]==$vs['id'])}selected{/if} value=\"{$vs['id']}\">{fun str_repeat('&nbsp;&nbsp;',$vs['level'])}{if($vs['haschild'])}|——{else}{if($vs['level'])}|——{/if}{/if}{$vs['classname']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_tid_muti\" value=\"{$vdata[1]}\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"molds_select_tid_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{foreach $classtypetree as $vs}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"{$vs['id']}\">{fun str_repeat('&nbsp;&nbsp;',$vs['level'])}{if($vs['haschild'])}|——{else}{if($vs['level'])}|——{/if}{/if}{$vs['classname']}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"{fun JZLANG('列表显示字段')}\" class=\"layui-input\" name=\"molds_list_field_tid_muti\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<select name=\"field_remote_20\" >\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('是否远程数据')}</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($data['remote']==1)}selected{/if} value=\"1\">是</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<option {if($data['remote']==0)}selected{/if} value=\"0\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('栏目关联多选，关联多个模块内容ID')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==17)} checked {/if} value=\"17\" /><label>{fun JZLANG('系统栏目')} [ tid ]</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"hidden\" class=\"layui-input\" name=\"fieldlong_17\" value=\"{if($data['fieldtype']==17)}{$data['fieldlong']}{else}11{/if}\">{if($data['fieldtype']==17)}{$data['fieldlong']}{else}11{/if}</div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('系统栏目，不可修改')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==18)} checked {/if} value=\"18\" /><label>{fun JZLANG('系统副栏目')} [ tids ]</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"hidden\" class=\"layui-input\" name=\"fieldlong_18\" value=\"{if($data['fieldtype']==18)}{$data['fieldlong']}{else}255{/if}\">{if($data['fieldtype']==18)}{$data['fieldlong']}{else}255{/if}</div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('系统副栏目，不可修改')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td><input type=\"radio\" name=\"fieldtype\" {if($data['fieldtype']==19)} checked {/if} value=\"19\" /><label>{fun JZLANG('系统TAG')} [ tags ]</label></td>\n\t\t\t\t\t\t\t\t\t\t\t<td><div><input type=\"hidden\" class=\"layui-input\" name=\"fieldlong_19\" value=\"{if($data['fieldtype']==19)}{$data['fieldlong']}{else}255{/if}\">{if($data['fieldtype']==19)}{$data['fieldlong']}{else}255{/if}</div></td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('系统TAG，不可修改')}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"vdata\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('默认值')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"vdata\" value=\"{$data['vdata']}\" name=\"vdata\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"tips\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('字段提示')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\" style=\"width:600px;\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"tips\" value=\"{$data['tips']}\" name=\"tips\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('用于填写时的提示信息，50字以内')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"orders\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('表单排序')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"number\" id=\"orders\" value=\"{$data['orders']}\" name=\"orders\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('数字越大越靠前')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"ismust\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('是否必填')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"ismust\" value=\"1\" title=\"{fun JZLANG('必填')}\" {if($data['ismust']==1)}checked{/if}>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"ismust\" value=\"0\" title=\"{fun JZLANG('非必填')}\" {if($data['ismust']==0)}checked{/if}>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"isshow\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('前台显示')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['isshow']==1)}checked{/if}>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['isshow']==0)}checked{/if}>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"ishome\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('前台表单')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['ishome']==1)}checked{/if}>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['ishome']==0)}checked{/if}>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"isadmin\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('后台显示')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isadmin\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['isadmin']==1)}checked{/if}>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isadmin\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['isadmin']==0)}checked{/if}>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"issearch\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('后台搜索')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"issearch\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['issearch']==1)}checked{/if}>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"issearch\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['issearch']==0)}checked{/if}>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('仅用于后台列表头部带有该字段搜索')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"islist\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('列表中显示')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"islist\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['islist']==1)}checked{/if}>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"islist\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['islist']==0)}checked{/if}>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('仅用于后台列表显示该字段')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"format\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('显示格式化')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<select name=\"format\" lay-filter=\"format\" id=\"format\">\n\t\t\t\t\t\t\t\t\t<option>{fun JZLANG('不做处理')}</option>\n\t\t\t\t\t\t\t\t\t{foreach format_fields() as $k=>$v}\n\t\t\t\t\t\t\t\t\t<option value=\"{$k}\" {if($data['format']==$k)} selected {/if}>{$v}</option>\n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('仅用于后台列表显示该字段内容处理')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\" pane>\n\t\t\t\t\t\t\t<label for=\"isajax\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('ajax可访问')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isajax\" value=\"1\" title=\"{fun JZLANG('可以')}\" {if($data['isajax']==1)}checked{/if}>\n\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"isajax\" value=\"0\" title=\"{fun JZLANG('不可以')}\" {if($data['isajax']==0)}checked{/if}>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('由于本系统对json数据封装，限制访问可以提高安全性')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t<label for=\"ldfield\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('联动关联')}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"ldfield\" placeholder=\"联动字段\" value=\"{$data['ldfield']}\" name=\"ldfield\" autocomplete=\"off\" class=\"layui-input\">\n\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"linkfield\" placeholder=\"联动字段之关联字段\" value=\"{$data['linkfield']}\" name=\"linkfield\" autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">{fun JZLANG('填写联动字段，可以关联多个，用|分隔')}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t\t{if($data['molds']=='level')}\n\t\t\t\t\t\t<table class=\"layui-table layui-form\">\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th width=\"20\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-unselect header layui-form-checkbox\" lay-skin=\"primary\"><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t\t\t</th>\n\n\t\t\t\t\t\t\t\t\t<th>{fun JZLANG('角色名')}</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody class=\"x-cate\">\n\t\t\t\t\t\t\t\t{php\n\n\t\t\t\t\t\t\t\t\tif($admin['gid']!=1){\n\t\t\t\t\t\t\t\t\t\t$levelgroup = M('level_group')->findAll('id!=1');\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t$levelgroup = M('level_group')->findAll();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$levelgroup = set_class_haschild($levelgroup);\n\t\t\t\t\t\t\t\t\t$levelgroup = getTree($levelgroup);\n\t\t\t\t\t\t\t\t/}\n\t\t\t\t\t\t\t\t{foreach $levelgroup as $v}\n\t\t\t\t\t\t\t\t<tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\">\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-unselect layui-form-checkbox {if(strpos($data['tids'],','.$v['id'].',')!==false)} layui-form-checked {/if}\" lay-skin=\"primary\" data-id='{$v['id']}'><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t{fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n\t\t\t\t\t\t\t\t\t\t{if($v['haschild'])}\n\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon x-show\" status='false'>&#xe625;</i>\n\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t\t{if($v['level'])}|——{/if}\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t{$v['name']}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<table class=\"layui-table layui-form\">\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th width=\"20\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-unselect header layui-form-checkbox\" lay-skin=\"primary\"><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t\t<th>{fun JZLANG('栏目名')}</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody class=\"x-cate\">\n\t\t\t\t\t\t\t\t{foreach $classtypes as $v}\n\t\t\t\t\t\t\t\t{if($v['molds']==$data['molds'] || $data['molds']=='classtype')}\n\t\t\t\t\t\t\t\t<tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\">\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<div class=\"layui-unselect layui-form-checkbox {if(strpos($data['tids'],','.$v['id'].',')!==false)} layui-form-checked {/if}\" lay-skin=\"primary\" data-id='{$v['id']}'><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t{fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n\t\t\t\t\t\t\t\t\t\t{if($v['haschild'])}\n\t\t\t\t\t\t\t\t\t\t\t<i class=\"layui-icon x-show\" status='false'>&#xe625;</i>\n\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t\t{if($v['level'])}|——{/if}\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t{$v['classname']}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"layui-form-item\" style=\"text-align:center;\">\n\t\t\t\t<button class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n\t\t\t\t\t{fun JZLANG('保存')}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n\n\t<script>\n\t\tlayui.use(['laydate','form','layer','upload'], function(){\n\t\t\t$ = layui.jquery;\n\t\t\tvar form = layui.form\n\t\t\t\t, layer = layui.layer\n\t\t\t\t, laydate = layui.laydate;\n\t\t\n\t\t\t//监听提交\n\t\t\tform.on('submit(save)', function(data){\n\t\t\t\tvar tids = tableCheck.getData().join(',');\n\t\t\t\tif(tids==''){\n\t\t\t\t\t//layer.alert('请选择绑定栏目！', {icon: 5});\n\t\t\t\t\t//return false;\n\t\t\t\t\ttids = 0;\n\t\t\t\t}\n\t\t\t\tdata.field.tids = tids;\n\t\t\t\tdata.field.field = data.field.field.toLowerCase()\n\t\t\t\t//发异步，把数据提交给php\n\t\t\t\t$.post(\"{fun U('Fields/editFields')}\",data.field,function(r){\n\t\t\t\t\t//console.log(r);return false;\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('Fields/index',['molds'=>$data['molds']])}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.layer.close();\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t{/if}\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t});\n\t\t});\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/fields-list-show.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('模块管理')}</cite></a>\n              <a><cite>{fun JZLANG('字段管理')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        <div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t<blockquote class=\"layui-elem-quote\">\n\t\t\t{fun JZLANG('温馨提示：排序和宽度在列表点击也可以更改。')}<br/>\n\t\t\t{fun JZLANG('排序：当前列表显示排序，不会影响录入排序，越大越靠前。')}<br/>\n\t\t\t{fun JZLANG('搜索：在列表顶部的搜索中，可以搜索该字段。')}<br/>\n\t\t\t{fun JZLANG('宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。')}<br/>\n\t\t\t</blockquote>\n\t\t    <table id=\"fieldtable\" lay-filter=\"fieldtable\"></table>\n\t\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\n\t\t\t</div>\n\t\t</div>\n          \n        </div>\n\t\t<script type=\"text/html\" id=\"adminbar\">\n\t\t\t<input type=\"checkbox\" name=\"isadmin\" data-id=\"{{d.id}}\" lay-filter=\"sw\" {{#if(d.isadmin=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\" {{# } }}  lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"homebar\">\n\t\t\t<input type=\"checkbox\" name=\"isshow\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.isshow=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }} value=\"1\" lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"searchbar\">\n\t\t\t<input type=\"checkbox\" name=\"issearch\" data-id=\"{{d.id}}\" lay-filter=\"sw\"  {{#if(d.issearch=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }} value=\"1\" lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"listbar\">\n\t\t\t<input type=\"checkbox\" name=\"islist\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.islist=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }} value=\"1\" lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"mustbar\">\n\t\t\t<input type=\"checkbox\" name=\"ismust\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.ismust=='{fun JZLANG('是')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }} value=\"1\" lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"extbar\">\n\t\t\t<input type=\"checkbox\" name=\"isext\" data-id=\"{{d.id}}\" lay-filter=\"sw\"  {{#if(d.isext=='{fun JZLANG('是')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }} value=\"1\" lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t \n\t\t {if(checkAction('Fields/editFields'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-primary\" lay-event=\"edit\">{fun JZLANG('设置')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Fields/deleteFields'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t {/if}\n\t\t \n\t\t</script>\n       <script>\n\t   $(document).ready(function(){\n\t\t\t\n\t   \n\t   });\n\t   \n\t    layui.use(['laydate','element','table','form','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n             var  laydate = layui.laydate;//日期插件\n             var  lement = layui.element;//面包导航\n             var  layer = layui.layer;//弹出层\n\t\t\t var  form = layui.form;\n\t\t\t var  table = layui.table;\n\t\t\t\n\t\t\t\n\t\t\t  table.render({\n\t\t\t\telem: '#fieldtable'\n\t\t\t\t,height: 500\n\t\t\t\t,url: \"{fun U('Fields/fieldsList')}?molds={$molds['biaoshi']}&ajax=1\" //数据接口\n\t\t\t\t,page: false //开启分页\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'listorders', title: '{fun JZLANG('排序')}', width:80, edit: 'text'}\n\t\t\t\t  ,{field: 'fieldname', title: '{fun JZLANG('名称')}',width:150}\n\t\t\t\t  ,{field: 'issearch', title: '{fun JZLANG('搜索')}', toolbar: '#searchbar'}\n\t\t\t\t  ,{field: 'islist', title: '{fun JZLANG('列表')}' , toolbar: '#listbar'}\n\t\t\t\t  ,{field: 'width', title: '{fun JZLANG('宽度')}' , edit: 'text'}\n\t\t\t\t  ,{field: 'fieldtypename', title: '{fun JZLANG('类型')}'}\n\n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t  table.on('tool(fieldtable)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('设置')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t    var a = $('<a href=\"'+data.view_url+'\" target=\"_blank\">{fun JZLANG('预览')}</a>').get(0);\n\t\t\t\t\t\t\tvar e = document.createEvent('MouseEvents');\n\t\t\t\t\t\t\te.initEvent( 'click', true, true );\n\t\t\t\t\t\t\ta.dispatchEvent(e);\n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('edit(fieldtable)', function(obj){ \n\t\t\t\t  var id = obj.data.id;\n\t\t\t\t  var value = obj.value;\n\t\t\t\t  var field = obj.field;\n\t\t\t\t  $.post(\"{fun U('Fields/changeFieldList')}\",{id:id,value:value,field:field},function(r){\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\ttable.reload('fieldtable', {\n\t\t\t\t\t\t\t  url: '{fun U('Fields/fieldsList')}?molds={$molds['biaoshi']}&ajax=1'\n\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg(r.info,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t});\n\t\t\t\t\t\t\n              form.on('select(change_tid)', function(data){\n\t\t\t  \n\t\t\t  \tvar datas =  $(\"#select_data\").val();\n\t\t\t\tif(datas==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('changeTid')}\",{data:datas,tid:data.value},function(r){\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t},'json')\n\t\t\n\t\t\t\t});\n\n\t\t\t  form.on('switch(sw)', function(data){\n\t\t\t\tconsole.log(data.value)\n\t\t\t\tvar field = $(data.elem).attr('name');\n\t\t\t\tvar id = $(data.elem).attr('data-id');\n\t\t\t\t\t$.post(\"{fun U('changeFieldList')}\",{id:id,field:field,value:data.value},function(res){\n\t\t\t\t\t\n\t\t\t\t\t\ttable.reload('fieldtable', {\n\t\t\t\t\t\t\t  url: '{fun U('Fields/fieldsList')}?molds={$molds['biaoshi']}&ajax=1'\n\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t},'json')\n\t\t\t\t\treturn false;\n\t\t\t  });\n\t\t});\n\t\t \n\t\t\t$(document).ready(function(){\n\t\t\t$(\".orderchange\").bind('input propertychange',function(){\n\t\t\t\tif($(this).val()!=''){\n\t\t\t\t\tvar orders = $(this).val();\n\t\t\t\t\tvar id = $(this).attr('data-id');\n\t\t\t\t\t$.get(\"{fun U('changeListOrders')}\",{id:id,orders:orders},function(r){\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t//window.location.reload();\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t},'json')\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t})\n\t\t\n\t\t})\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/fields-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('模块管理')}</cite></a>\n              <a><cite>{fun JZLANG('字段管理')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        <div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t<xblock>\n\t\t    <form class=\"layui-form \" method=\"get\" id=\"myform\"> \n\t\t\t   <div class=\"layui-input-inline\" >\n\t\t\t   <select class=\"layui-btn-sm\" id=\"change_tid\" lay-search=\"\"  lay-filter=\"change_tid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量绑定栏目')}</option>\n\t\t\t   {foreach $classtypetree as $v}\n\t\t\t   {if($molds['biaoshi']==$v['molds'])}\n\t\t\t   <option   value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t   {/if}\n\t\t\t   {/foreach}\n\t\t\t   </select>\n\t\t\t   </div>\n\t\t\t   {if(checkAction('Fields/addFields'))}\t\n\t\t\t   <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{$molds['name']}-{fun JZLANG('新增字段')}','{fun U('Fields/addFields',array('molds'=>$molds['biaoshi']))}')\">{fun JZLANG('新增字段')}</a>\n\t\t\t   {/if}\n\t\t    </form>\t\n\t\t\t\n\n\t\t  </xblock>\n\t\t    <table id=\"fieldtable\" lay-filter=\"fieldtable\"></table>\n\t\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\n\t\t\t</div>\n\t\t</div>\n          \n        </div>\n\t\t<script type=\"text/html\" id=\"adminbar\">\n\t\t\t<input type=\"checkbox\" name=\"isadmin\" data-id=\"{{d.id}}\" lay-filter=\"sw\" {{#if(d.isadmin=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\" {{# } }}  lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"homebar\">\n\t\t\t<input type=\"checkbox\" name=\"isshow\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.isshow=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }}  lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"ishome\">\n\t\t\t<input type=\"checkbox\" name=\"ishome\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.ishome=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }}  lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"searchbar\">\n\t\t\t<input type=\"checkbox\" name=\"issearch\" data-id=\"{{d.id}}\" lay-filter=\"sw\"  {{#if(d.issearch=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }}  lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"listbar\">\n\t\t\t<input type=\"checkbox\" name=\"islist\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.islist=='{fun JZLANG('显示')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }}  lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"mustbar\">\n\t\t\t<input type=\"checkbox\" name=\"ismust\" data-id=\"{{d.id}}\"  lay-filter=\"sw\"  {{#if(d.ismust=='{fun JZLANG('是')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }} lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"extbar\">\n\t\t\t<input type=\"checkbox\" name=\"isext\" data-id=\"{{d.id}}\" lay-filter=\"sw\"  {{#if(d.isext=='{fun JZLANG('是')}'){ }}checked value=\"0\" {{# }else{ }} value=\"1\"{{# } }}  lay-skin=\"switch\">\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t \n\t\t {if(checkAction('Fields/editFields'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-primary\" lay-event=\"edit\">{fun JZLANG('设置')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Fields/deleteFields'))}\t\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t {/if}\n\t\t \n\t\t</script>\n       <script>\n\t   $(document).ready(function(){\n\t\t\t\n\t   \n\t   });\n\t   \n\t    layui.use(['laydate','element','table','form','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n             var  laydate = layui.laydate;//日期插件\n             var  lement = layui.element;//面包导航\n             var  layer = layui.layer;//弹出层\n\t\t\t var  form = layui.form;\n\t\t\t var  table = layui.table;\n\t\t\t\n\t\t\t\n\t\t\t  table.render({\n\t\t\t\telem: '#fieldtable'\n\t\t\t\t,height: 500\n\t\t\t\t,url: '{fun U('fields/index')}?molds={$molds['biaoshi']}&ajax=1' //数据接口\n\t\t\t\t,page: false //开启分页\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {type:'checkbox',fixed: 'left'}\n\t\t\t\t  ,{field: 'field', title: '{fun JZLANG('字段')}', width:150}\n\t\t\t\t  ,{field: 'orders', title: '{fun JZLANG('排序')}', width:80,edit:'text'}\n\t\t\t\t  ,{field: 'fieldname', title: '{fun JZLANG('名称')}',width:150,edit:'text'}\n\t\t\t\t  ,{field: 'isadmin', title: '{fun JZLANG('后台')}', toolbar: '#adminbar'}\n\t\t\t\t  ,{field: 'isshow', title: '{fun JZLANG('前台显示')}', toolbar: '#homebar'}\n\t\t\t\t  ,{field: 'ishome', title: '{fun JZLANG('前台表单')}', toolbar: '#ishome'}\n\t\t\t\t  ,{field: 'issearch', title: '{fun JZLANG('搜索')}', toolbar: '#searchbar'}\n\t\t\t\t  ,{field: 'islist', title: '{fun JZLANG('列表')}' , toolbar: '#listbar'}\n\t\t\t\t  ,{field: 'ismust', title: '{fun JZLANG('必填')}' , toolbar: '#mustbar'}\n\t\t\t\t  ,{field: 'isext', title: '{fun JZLANG('扩展')}' , toolbar: '#extbar'}\n\t\t\t\t  ,{field: 'fieldtypename', title: '{fun JZLANG('类型')}'}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:200, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t  table.on('tool(fieldtable)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('设置')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Fields/deleteFields')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('fieldtable', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: '{fun U('fields/index')}?molds={$molds['biaoshi']}&ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('edit(fieldtable)', function(obj){ \n\t\t\t\t  var id = obj.data.id;\n\t\t\t\t  var value = obj.value;\n\t\t\t\t  var field = obj.field;\n\t\t\t\t  $.post(\"{fun U('Fields/editFieldsValue')}\",{'id':id,'value':value,'field':field},function(r){\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg(r.info,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t});\n\t\t\t\t\t\t\n              form.on('select(change_tid)', function(data){\n\t\t\t\tvar checkStatus = table.checkStatus('fieldtable'); \n\t\t\t\tvar datas = checkStatus.data;\n\t\t\t\tvar ids = [];\n\t\t\t\tfor(var i=0;i<datas.length;i++){\n\t\t\t\t\tids.push(datas[i].id);\n\t\t\t\t}\n\t\t\t\tif(ids.length==0){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('changeTid')}\",{data:ids.join(','),tid:data.value},function(r){\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t},'json')\n\t\t\n\t\t\t\t});\n\n\t\t\t  form.on('switch(sw)', function(data){\n\t\t\t\tvar field = $(data.elem).attr('name');\n\t\t\t\tvar id = $(data.elem).attr('data-id');\n\t\t\t\t\t$.post('{fun U('editFieldsValue')}',{id:id,field:field,value:data.value},function(res){\n\t\t\t\t\t  window.location.reload();\n\t\t\t\t\t\n\t\t\t\t\t},'json')\n\t\t\t\t\treturn false;\n\t\t\t  });\n\t\t});\n\t\t /*删除*/\n            function molds_del(obj,id){\n                layer.confirm('{fun JZLANG('确认要删除吗？删除的同时将删除对应的表内容！')}',function(index){\n\t\t\t\t\n\t\t\t\t\t$.get(\"{fun U('deleteFields')}?id=\"+id,{},function(s){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(s);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000});\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n                   \n                });\n            }\n\t\t\t\n\t\t\t$(document).ready(function(){\n\t\t\t$(\".orderchange\").bind('input propertychange',function(){\n\t\t\t\tif($(this).val()!=''){\n\t\t\t\t\tvar orders = $(this).val();\n\t\t\t\t\tvar id = $(this).attr('data-id');\n\t\t\t\t\t$.get(\"{fun U('changeOrders')}\",{id:id,orders:orders},function(r){\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t//window.location.reload();\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t},'json')\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t})\n\t\t\n\t\t})\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/getchildren.html",
    "content": "{foreach $lists as $v}\n<tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\" >\n  <td>\n    <div class=\"layui-unselect layui-form-checkbox\" lay-skin=\"primary\" data-id=\"{$v['id']}\"><i class=\"layui-icon\">&#xe605;</i></div>\n  </td>\n  <td>{$v['id']}</td>\n  <td>\n    {if(checkAction('Classtype/editClassOrders'))}\n    <input type=\"text\" class=\"layui-input x-sort\"  name=\"order\" value=\"{$v['orders']}\">\n    {else}\n    {$v['orders']}\n    {/if}\n  </td>\n\n  <td>\n    {fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n    {if($classtypedata[$v['id']]['haschild'])}\n    <i class=\"layui-icon x-show\" onclick=\"getchildren({$v['id']},this)\" status=\"true\">&#xe623;</i>\n    {else}\n    {if($v['level'])}|——{/if}\n    {/if}\n    {$v['classname']}\n  </td>\n  <td>{$moldslist[$v['molds']]['name']}</td>\n  {if($admin['classcontrol']==0 ||$admin['isadmin'] || strpos($tids,','.$v['id'].',')!==false)}\n  <td class=\"td-status\" >\n    {if($v['isclose']==0)}\n    {if(checkAction('Classtype/change_status'))}\n    <input type=\"checkbox\" value=\"{$v['id']}\" name=\"switch\" lay-filter=\"status\"   lay-text=\"{fun JZLANG('显示|隐藏')}\"  lay-skin=\"switch\" {if($v['isshow']==1)}checked{/if}>\n    {else}\n    {if($v['isshow']==1)}\n    <span class=\"layui-badge layui-bg-green\">{fun JZLANG('显示')}</span>\n    {else}\n    <span class=\"layui-badge\">{fun JZLANG('隐藏')}</span>\n    {/if}\n    {/if}\n    {else}\n    已关闭\n    {/if}\n  </td>\n\n  <td class=\"td-manage\">\n    {if(checkAction('Classtype/addclass'))}\n    <a  class=\"layui-btn layui-btn-warm layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('添加下级')}','{fun U('Classtype/addclass',array('pid'=>$v['id'],'biaoshi'=>$v['molds']))}')\" >{fun JZLANG('添加下级')}</a>\n    {/if}\n    {if(checkAction('Fields/index'))}\n    <a class=\"layui-btn layui-btn-normal layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('字段管理')}','{fun U('Fields/index',array('molds'=>$v['molds']))}')\" >{fun JZLANG('字段管理')}</a>\n    {/if}\n\n    {if($v['molds']=='article')}\n    {if(checkAction('Article/addarticle'))}\n    <a  class=\"layui-btn  layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('新增文章')}','{fun U('Article/addarticle',['tid'=>$v['id']])}')\" >{fun JZLANG('新增文章')}</a>\n    {/if}\n    {else if($v['molds']=='product')}\n    {if(checkAction('Product/addproduct'))}\n    <a  class=\"layui-btn  layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('新增商品')}','{fun U('Product/addproduct',['tid'=>$v['id']])}')\" >{fun JZLANG('新增商品')}</a>\n    {/if}\n    {else}\n    {if($v['molds']!='message' && $v['molds']!='page')}\n    {if(checkAction('Extmolds/addmolds/molds/'.$v['molds']))}\n    <a  class=\"layui-btn  layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('新增内容')}','{fun U('Extmolds/addmolds',array('molds'=>$v['molds'],'tid'=>$v['id']))}')\" >{fun JZLANG('新增内容')}</a>\n    {/if}\n    {/if}\n    {/if}\n\n  </td>\n  <td class=\"td-manage\">\n    {if(checkAction('Classtype/editclass'))}\n    <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Classtype/editclass',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n    {/if}\n\n    <a href=\"{$classtypedata[$v['id']]['url']}\" class=\"layui-btn layui-btn-normal layui-btn layui-btn-xs\"  target=\"_blank\">{fun JZLANG('预览')}</a>\n    {if(checkAction('Classtype/deleteclass'))}\n    <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"member_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n    {/if}\n  </td>\n  {else}\n  <td class=\"td-status\" >\n    {if($v['isshow']==1)}\n    <span class=\"layui-badge layui-bg-green\">{fun JZLANG('显示')}</span>\n    {else}\n    <span class=\"layui-badge\">{fun JZLANG('隐藏')}</span>\n    {/if}\n  </td>\n  <td class=\"td-manage\">-</td>\n  <td class=\"td-manage\">-</td>\n\n\n  {/if}\n\n</tr>\n{/foreach}"
  },
  {
    "path": "app/admin/t/tpl/group-add.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n  \r\n  <head>\r\n    <meta charset=\"UTF-8\">\r\n    {include=\"style\"}\r\n  </head>\r\n  \r\n  <body>\r\n\t<div class=\"x-nav\">\r\n            <span class=\"layui-breadcrumb\">\r\n              <a><cite>{fun JZLANG('首页')}</cite></a>\r\n              <a><cite>{fun JZLANG('管理员管理')}</cite></a>\r\n             \r\n\t\t\t <a><cite>{fun JZLANG('角色管理')}</cite></a>\r\n\t\t\t <a><cite>{fun JZLANG('角色修改')}</cite></a>\r\n            </span>\r\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\r\n    </div>\r\n    <div class=\"x-body\">\r\n\t\t<div class=\"layui-card\">\r\n\t\t<div class=\"layui-card-body\">\r\n        <form  method=\"post\" class=\"layui-form layui-form-pane\">\r\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\r\n                <div class=\"layui-form-item\">\r\n                    <label for=\"name\" class=\"layui-form-label\">\r\n                        {fun JZLANG('角色名')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\r\n                        autocomplete=\"off\" class=\"layui-input\">\r\n                    </div>\r\n                </div>\r\n\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t<div class=\"layui-form-item\" pane>\r\n                    <label for=\"isadmin\" class=\"layui-form-label\">\r\n                        <span class=\"x-red\"></span>{fun JZLANG('是否超管')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"radio\" name=\"isadmin\" value=\"0\" title=\"{fun JZLANG('不是')}\" checked>\r\n\t\t\t\t\t\t<input type=\"radio\" name=\"isadmin\" value=\"1\" title=\"{fun JZLANG('是')}\" >\r\n                    </div>\r\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  {fun JZLANG('超级管理员拥有无上权利，无视下面权限限制')}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n                </div>\r\n\t\t\t{else}\r\n\t\t\t<input type=\"hidden\" name=\"isadmin\" value=\"0\">\r\n\t\t\t{/if}\r\n\t\t\t\t<div class=\"layui-form-item\" pane>\r\n                    <label for=\"ischeck\" class=\"layui-form-label\">\r\n                        <span class=\"x-red\"></span>{fun JZLANG('发布审核')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"radio\" name=\"ischeck\" value=\"0\" title=\"{fun JZLANG('否')}\" checked>\r\n\t\t\t\t\t\t<input type=\"radio\" name=\"ischeck\" value=\"1\" title=\"{fun JZLANG('是')}\" >\r\n                    </div>\r\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  {fun JZLANG('超级管理员除外，发布的内容是否需要审核')}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n                </div>\r\n\t\t\t\t<div class=\"layui-form-item\" pane>\r\n                    <label for=\"classcontrol\" class=\"layui-form-label\">\r\n                        <span class=\"x-red\"></span>{fun JZLANG('栏目权限')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"radio\" name=\"classcontrol\" value=\"0\" title=\"{fun JZLANG('否')}\" checked>\r\n\t\t\t\t\t\t<input type=\"radio\" name=\"classcontrol\" value=\"1\" title=\"{fun JZLANG('是')}\" >\r\n                    </div>\r\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  {fun JZLANG('是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效')}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n                </div>\r\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\r\n                    <label class=\"layui-form-label\">\r\n                        {fun JZLANG('栏目权限')} <span class=\"x-red\">{fun JZLANG('选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目')}</span>\r\n                    </label>\r\n                    <table  class=\"layui-table layui-input-block\">\r\n                        <tbody>\r\n\t\t\t\t\t\t\t<tr>\r\n                                <th>\r\n                                   {fun JZLANG('顶级栏目')}\r\n                                </th>\r\n                                <th>\r\n                                   {fun JZLANG('子栏目')}\r\n                                </th>\r\n                            </tr>\r\n\t\t\t\t\t\t{foreach $classtypetree as $v}\r\n\t\t\t\t\t\t{if($v['pid']==0)}\r\n                            <tr>\r\n                                <td>\r\n                                    <input type=\"checkbox\" name=\"tids[]\" lay-skin=\"primary\" value=\"{$v['id']}\" title=\"{$v['classname']}\" checked>\r\n                                </td>\r\n                                <td>\r\n                                    <div class=\"layui-input-block\">\r\n                                    {php $children = get_children($v,$classtypetree,5);/}\r\n\t\t\t\t\t\t\t\t\t{foreach $children as $vv}\r\n                                        <input name=\"tids[]\" lay-skin=\"primary\" type=\"checkbox\" title=\"{$vv['classname']}\" value=\"{$vv['id']}\" > \r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n                                        \r\n                                    </div>\r\n                                </td>\r\n                            </tr>\r\n                        {/if}\r\n\t\t\t\t\t\t{/foreach}\r\n                           \r\n                        </tbody>\r\n                    </table>\r\n                </div>\r\n                <div class=\"layui-form-item layui-form-text\">\r\n                    <label class=\"layui-form-label\">\r\n                        {fun JZLANG('拥有权限')}  <span class=\"x-red\">{fun JZLANG('选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块')}</span>\r\n                    </label>\r\n                    <table  class=\"layui-table layui-input-block\">\r\n                        <tbody>\r\n\t\t\t\t\t\t\t<tr>\r\n                                <th>\r\n                                   {fun JZLANG('主模块')}\r\n                                </th>\r\n                                <th>\r\n                                   {fun JZLANG('子模块')}\r\n                                </th>\r\n                            </tr>\r\n\t\t\t\t\t\t{foreach $ruler_top as $v}\r\n                            <tr>\r\n                                <td>\r\n                                    <input type=\"checkbox\" name=\"ruler[]\" lay-skin=\"primary\" value=\"{$v['fc']}\" title=\"{$v['name']}\" checked>\r\n                                </td>\r\n                                <td>\r\n                                    <div class=\"layui-input-block\">\r\n\t\t\t\t\t\t\t\t\t{foreach $ruler_children[$v['id']] as $vv}\r\n                                        <input name=\"ruler[]\" lay-skin=\"primary\" type=\"checkbox\" title=\"{$vv['name']}\" value=\"{$vv['fc']}\" > \r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n                                        \r\n                                    </div>\r\n                                </td>\r\n                            </tr>\r\n\t\t\t\t\t\t{/foreach}\r\n                           \r\n                        </tbody>\r\n                    </table>\r\n                </div>\r\n                <div class=\"layui-form-item layui-form-text\">\r\n                    <label for=\"description\" class=\"layui-form-label\">\r\n                        {fun JZLANG('描述')}\r\n                    </label>\r\n                    <div class=\"layui-input-block\">\r\n                        <textarea placeholder=\"{fun JZLANG('请输入内容')}\" id=\"description\" name=\"description\" class=\"layui-textarea\"></textarea>\r\n                    </div>\r\n                </div>\r\n\t\t\t\t<div class=\"layui-form-item\" pane>\r\n                    <label for=\"isagree\" class=\"layui-form-label\">\r\n                        <span class=\"x-red\"></span>{fun JZLANG('状态')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"radio\" name=\"isagree\" value=\"0\" title=\"{fun JZLANG('关闭')}\" >\r\n\t\t\t\t\t\t<input type=\"radio\" name=\"isagree\" value=\"1\" title=\"{fun JZLANG('开启')}\" checked>\r\n                    </div>\r\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  {fun JZLANG('关闭后，该分组管理员将不能登录')}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n                </div>\r\n\t\t\t\t\r\n                <div class=\"layui-form-item\" style=\"text-align:center;\">\r\n                <button class=\"layui-btn\" lay-submit=\"\" lay-filter=\"add\">{fun JZLANG('添加')}</button>\r\n              </div>\r\n            </form>\r\n\t\t\t</div>\r\n\t\t\t</div>\r\n    </div>\r\n    <script>\r\n        layui.use(['form','layer'], function(){\r\n            $ = layui.jquery;\r\n          var form = layui.form\r\n          ,layer = layui.layer;\r\n        \r\n          form.render();\r\n\r\n          //监听提交\r\n          form.on('submit(add)', function(data){\r\n            $.post(\"{fun U('Admin/groupadd')}\",data.field,function(r){\r\n\t\t\t\tvar r = JSON.parse(r);\r\n\t\t\t\tif(r.code==0){\r\n\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\r\n\t\t\t\t\t\t// 获得frame索引\r\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\r\n\t\t\t\t\t\twindow.location.href=\"{fun U('Admin/group')}\";\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\tparent.location.reload();\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t});\r\n\t\t\t\t}else{\r\n\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t\r\n            return false;\r\n          });\r\n          \r\n          \r\n        });\r\n    </script>\r\n    \r\n  </body>\r\n\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/group-edit.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n  \r\n  <head>\r\n    <meta charset=\"UTF-8\">\r\n    {include=\"style\"}\r\n  </head>\r\n  \r\n  <body>\r\n\t<div class=\"x-nav\">\r\n            <span class=\"layui-breadcrumb\">\r\n              <a><cite>{fun JZLANG('首页')}</cite></a>\r\n              <a><cite>{fun JZLANG('管理员管理')}</cite></a>\r\n             \r\n\t\t\t <a><cite>{fun JZLANG('角色管理')}</cite></a>\r\n\t\t\t <a><cite>{fun JZLANG('角色修改')}</cite></a>\r\n            </span>\r\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\r\n    </div>\r\n    <div class=\"x-body\">\r\n\t\t<div class=\"layui-card\">\r\n\t\t<div class=\"layui-card-body\">\r\n        <form  method=\"post\" class=\"layui-form layui-form-pane\">\r\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\r\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\r\n                <div class=\"layui-form-item\">\r\n                    <label for=\"name\" class=\"layui-form-label\">\r\n                        {fun JZLANG('角色名')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"text\" id=\"name\" name=\"name\" value=\"{$data['name']}\" required=\"\" lay-verify=\"required\"\r\n                        autocomplete=\"off\" class=\"layui-input\">\r\n                    </div>\r\n                </div>\r\n\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t<div class=\"layui-form-item\" pane>\r\n                    <label for=\"isadmin\" class=\"layui-form-label\">\r\n                        <span class=\"x-red\"></span>{fun JZLANG('是否超管')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"radio\" name=\"isadmin\" value=\"0\" title=\"{fun JZLANG('不是')}\" {if($data['isadmin']==0)}checked{/if}>\r\n\t\t\t\t\t\t<input type=\"radio\" name=\"isadmin\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['isadmin']==1)}checked{/if}>\r\n                    </div>\r\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  {fun JZLANG('超级管理员拥有无上权利，无视下面权限限制')}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n                </div>\r\n\t\t\t{else}\r\n\t\t\t<input type=\"hidden\" name=\"isadmin\" value=\"0\">\r\n\t\t\t{/if}\r\n\t\t\t\t<div class=\"layui-form-item\" pane>\r\n                    <label for=\"ischeck\" class=\"layui-form-label\">\r\n                        <span class=\"x-red\"></span>{fun JZLANG('发布审核')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"radio\" name=\"ischeck\" value=\"0\" title=\"{fun JZLANG('不是')}\" {if($data['ischeck']==0)}checked{/if}>\r\n\t\t\t\t\t\t<input type=\"radio\" name=\"ischeck\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['ischeck']==1)}checked{/if}>\r\n                    </div>\r\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  {fun JZLANG('超级管理员除外，发布的内容是否需要审核')}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n                </div>\r\n\t\t\t\t<div class=\"layui-form-item\" pane>\r\n                    <label for=\"classcontrol\" class=\"layui-form-label\">\r\n                        <span class=\"x-red\"></span>{fun JZLANG('栏目权限')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"radio\" name=\"classcontrol\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['classcontrol']==0)}checked{/if}>\r\n\t\t\t\t\t\t<input type=\"radio\" name=\"classcontrol\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['classcontrol']==1)}checked{/if}>\r\n                    </div>\r\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  {fun JZLANG('是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效')}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n                </div>\r\n\t\t\t\t<div class=\"layui-form-item layui-form-text\">\r\n                    <label class=\"layui-form-label\">\r\n                        {fun JZLANG('栏目权限')} <span class=\"x-red\">{fun JZLANG('选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目')}</span>\r\n                    </label>\r\n                    <table  class=\"layui-table layui-input-block\">\r\n                        <tbody>\r\n\t\t\t\t\t\t\t<tr>\r\n                                <th>\r\n                                   {fun JZLANG('顶级栏目')}\r\n                                </th>\r\n                                <th>\r\n                                   {fun JZLANG('子栏目')}\r\n                                </th>\r\n                            </tr>\r\n                        {foreach $classtypetree as $v}\r\n                        {if($v['pid']==0)}\r\n                            <tr>\r\n                                <td>\r\n                                    <input type=\"checkbox\" name=\"tids[]\" lay-skin=\"primary\" value=\"{$v['id']}\" title=\"{$v['classname']}\" {if(strpos($data['tids'],','.$v['id'].',')!==false)}checked{/if}>\r\n                                </td>\r\n                                <td>\r\n                                    <div class=\"layui-input-block\">\r\n                                    {php $children = get_children($v,$classtypetree,5);/}\r\n                                    {foreach $children as $vv}\r\n                                        <input name=\"tids[]\" lay-skin=\"primary\" type=\"checkbox\" title=\"{$vv['classname']}\" value=\"{$vv['id']}\" {if(strpos($data['tids'],','.$vv['id'].',')!==false)}checked{/if}> \r\n                                    {/foreach}\r\n                                        \r\n                                    </div>\r\n                                </td>\r\n                            </tr>\r\n                        {/if}\r\n                        {/foreach}\r\n                           \r\n                        </tbody>\r\n                    </table>\r\n                </div>\r\n                <div class=\"layui-form-item layui-form-text\">\r\n                    <label class=\"layui-form-label\">\r\n                        {fun JZLANG('拥有权限')}  <span class=\"x-red\">{fun JZLANG('选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块')}</span>\r\n                    </label>\r\n                    <table  class=\"layui-table layui-input-block\">\r\n                        <tbody>\r\n\t\t\t\t\t\t\t<tr>\r\n                                <th>\r\n                                   {fun JZLANG('主模块')}\r\n                                </th>\r\n                                <th>\r\n                                   {fun JZLANG('子模块')}\r\n                                </th>\r\n                            </tr>\r\n\t\t\t\t\t\t{foreach $ruler_top as $v}\r\n                            <tr>\r\n                                <td>\r\n                                    <input type=\"checkbox\" name=\"ruler[]\" lay-skin=\"primary\" value=\"{$v['fc']}\" title=\"{$v['name']}\" {if(strpos($data['paction'],','.$v['fc'].',')!==false)}checked{/if}>\r\n                                </td>\r\n                                <td>\r\n                                    <div class=\"layui-input-block\">\r\n\t\t\t\t\t\t\t\t\t{foreach $ruler_children[$v['id']] as $vv}\r\n                                        <input name=\"ruler[]\" lay-skin=\"primary\" type=\"checkbox\" title=\"{$vv['name']}\" value=\"{$vv['fc']}\" {if(strpos($data['paction'],','.$vv['fc'].',')!==false)}checked{/if}> \r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n                                        \r\n                                    </div>\r\n                                </td>\r\n                            </tr>\r\n\t\t\t\t\t\t{/foreach}\r\n                           \r\n                        </tbody>\r\n                    </table>\r\n                </div>\r\n                <div class=\"layui-form-item layui-form-text\">\r\n                    <label for=\"description\" class=\"layui-form-label\">\r\n                        {fun JZLANG('描述')}\r\n                    </label>\r\n                    <div class=\"layui-input-block\">\r\n                        <textarea placeholder=\"{fun JZLANG('请输入内容')}\" id=\"description\" name=\"description\" class=\"layui-textarea\">{$data['description']}</textarea>\r\n                    </div>\r\n                </div>\r\n\t\t\t\t<div class=\"layui-form-item\" pane>\r\n                    <label for=\"isagree\" class=\"layui-form-label\">\r\n                        <span class=\"x-red\"></span>{fun JZLANG('状态')}\r\n                    </label>\r\n                    <div class=\"layui-input-inline\">\r\n                        <input type=\"radio\" name=\"isagree\" value=\"0\" title=\"{fun JZLANG('关闭')}\" {if($data['isagree']==0)}checked{/if}>\r\n\t\t\t\t\t\t<input type=\"radio\" name=\"isagree\" value=\"1\" title=\"{fun JZLANG('开启')}\" {if($data['isagree']==1)}checked{/if}>\r\n                    </div>\r\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\r\n\t\t\t\t\t  {fun JZLANG('关闭后，该分组管理员将不能登录')}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n                </div>\r\n\t\t\t\t\r\n                <div class=\"layui-form-item\" style=\"text-align:center;\">\r\n                <button class=\"layui-btn\" lay-submit=\"\" lay-filter=\"save\">{fun JZLANG('修改')}</button>\r\n              </div>\r\n            </form>\r\n\t\t\t</div>\r\n\t\t\t</div>\r\n    </div>\r\n    <script>\r\n        layui.use(['form','layer'], function(){\r\n            $ = layui.jquery;\r\n          var form = layui.form\r\n          ,layer = layui.layer;\r\n          form.render();\r\n          \r\n\r\n          //监听提交\r\n          form.on('submit(save)', function(data){\r\n            $.post(\"{fun U('Admin/groupedit')}\",data.field,function(r){\r\n\t\t\t\tvar r = JSON.parse(r);\r\n\t\t\t\tif(r.code==0){\r\n\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\r\n\t\t\t\t\t\t// 获得frame索引\r\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\r\n\t\t\t\t\t\twindow.location.href=\"{fun U('Admin/group')}\";\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\tparent.location.reload();\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t});\r\n\t\t\t\t}else{\r\n\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t\r\n            return false;\r\n          });\r\n          \r\n          \r\n        });\r\n    </script>\r\n    \r\n  </body>\r\n\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/group-list.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a href=\"/\">{fun JZLANG('首页')}</a>\n        <a >{fun JZLANG('管理员管理')}</a>\n        <a><cite>{fun JZLANG('角色管理')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t<xblock>\n\t\t    {if(checkAction('Admin/groupadd'))}\n\t\t\t<a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('添加角色')}','{fun U('Admin/groupadd')}')\">{fun JZLANG('添加角色')}</a>\n\t\t    {/if}\n\t\t\t<span class=\"x-right\" style=\"line-height:40px\">{fun JZLANG('共有数据：')}{$sum} {fun JZLANG('条')}</span>\n\t\t    </xblock>\n      <table class=\"layui-table layui-form\">\n        <thead>\n          <tr>\n           \n            <th>ID</th>\n            <th>{fun JZLANG('角色名')}</th>\n            <th>{fun JZLANG('描述')}</th>\n            <th>{fun JZLANG('状态')}</th>\n            <th>{fun JZLANG('操作')}</th>\n        </thead>\n        <tbody>\n\t\t {foreach $lists as $v}\n          <tr>\n           \n            <td>{$v['id']}</td>\n            <td>{$v['name']}</td>\n            <td>{$v['description']}</td>\n           \n            <td class=\"td-status\">\n\t\t\t{if(checkAction('Admin/change_group_status'))}\n              <input type=\"checkbox\" value=\"{$v['id']}\" name=\"switch\" lay-filter=\"status\"   lay-text=\"{fun JZLANG('正常|封禁')}\"  lay-skin=\"switch\" {if($v['isagree']==1)}checked{/if}></td>\n\t\t\t{else}\n\t\t\t\t{if($v['isagree']==1)}\n\t\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('正常')}</span>\n\t\t\t\t{else}\n\t\t\t\t<span class=\"layui-badge\">{fun JZLANG('封禁')}</span>\n\t\t\t\t{/if}\n\t\t\t{/if}\n            <td class=\"td-manage\">\n              {if(checkAction('Admin/groupedit'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Admin/groupedit',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t  {/if}\n\t\t\t  {if(checkAction('Admin/group_del'))}\n              <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"member_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t  {/if}\n              </a>\n            </td>\n          </tr>\n\t\t  {/foreach}\n        </tbody>\n      </table>\n      <div class=\"page\">\n         {$pages}\n      </div>\n\t\t\t</div>\n\t\t</div>\n    </div>\n    <script>\n      layui.use(['laydate','form'], function(){\n        var laydate = layui.laydate;\n        var form = layui.form;\n       \n\t\tform.on('switch(status)', function (data) {\n\t\t\t$.post(\"{fun U('change_group_status')}\",{id:data.elem.value},function(r){ });\n\t\t});\n      });\n\n    \n\n      /*用户-删除*/\n      function member_del(obj,id){\n          layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n              //发异步删除数据\n\t\t\t  \n\t\t\t  $.post(\"{fun U('Admin/group_del')}\",{id:id},function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('已删除!')}',{icon:1,time:1000});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg(r.msg,{icon:5,time:1000});\n\t\t\t\t\t}\n\t\t\t\t \n\t\t\t  });\n\t\t\t  \n             \n          });\n      }\n\n\n\n    </script>\n   \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/index.html",
    "content": "<!doctype html>\r\n<html >\r\n<head>\r\n\t<meta charset=\"UTF-8\">\r\n\t{include=\"style\"}\r\n  <style type=\"text/css\">\r\n  html{ overflow-y:hidden;}\r\n  i.jzicon {\r\n\t\tfont-size: 18px;\r\n\t\tmargin-right: 10px;\r\n\t}\r\n\r\n\r\n  </style>\r\n</head>\r\n<body>\r\n    <!-- 顶部开始 -->\r\n    <div class=\"container\">\r\n        <div class=\"logo\"><a href=\"{fun U('Index/index')}\">{fun JZLANG('后台管理')}</a></div>\r\n        <div class=\"left_open\">\r\n            <i title=\"{fun JZLANG('展开左侧栏')}\" class=\"iconfont\">&#xe699;</i>\r\n        </div>\r\n\t\t{if($top_num>0)}\r\n        <ul class=\"layui-nav left fast-add\" lay-filter=\"\">\r\n\t\t {if(is_array($top_layout))}\r\n\t\t {foreach $top_layout as $v}\r\n\t\t\t<li class=\"layui-nav-item\">\r\n\t\t\t\t<a href=\"javascript:;\"><i class=\"iconfont\">{fun htmlspecialchars_decode($v['icon'])}</i>{fun JZLANG($v['name'])}</a>\r\n\t\t\t\t<dl class=\"layui-nav-child\">\r\n\r\n\t\t\t\t\t{foreach $v['nav'] as $vv}\r\n\t\t\t\t\t{if(!is_array($vv) && $vv)}\r\n\t\t\t\t\t{if(strpos($vv,'class')!==false)}\r\n\t\t\t\t\t<dd class=\"top-nav\"><a x_href=\"{$classnav[$vv]['act']}\" class=\"top_nav\">{$classnav[$vv]['classname']}</a></dd>\r\n\t\t\t\t\t{else}\r\n\t\t\t\t\t<dd class=\"top-nav\"><a x_href=\"{fun U($actions[$vv]['fc'])}\" class=\"top_nav\">{fun JZLANG($actions[$vv]['name'])}</a></dd>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{else if(is_array($vv))}\r\n\r\n\t\t\t\t\t{if(strpos($vv['value'],'class')!==false)}\r\n\t\t\t\t\t<dd class=\"top-nav\"><a x_href=\"{$classnav[$vv['value']]['act']}\" class=\"top_nav\">{if($vv['icon'])}<i class=\"iconfont\">{fun htmlspecialchars_decode($vv['icon'])}</i>{/if}{fun JZLANG($vv['title'])}</a></dd>\r\n\t\t\t\t\t{else}\r\n\t\t\t\t\t<dd class=\"top-nav\"><a x_href=\"{fun U($actions[$vv['value']]['fc'])}\" class=\"top_nav\">{if($vv['icon'])}<i class=\"iconfont\">{fun htmlspecialchars_decode($vv['icon'])}</i>{/if}{fun JZLANG($vv['title'])}</a></dd>\r\n\t\t\t\t\t{/if}\r\n\r\n\r\n\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{/foreach}\r\n\t\t\t\t  \r\n\t\t\t\t</dl>\r\n\t\t\t</li>\r\n\t\t {/foreach} \r\n\t\t {/if}\r\n\t\t  \r\n        </ul>\r\n\t\t{/if}\r\n        <ul class=\"layui-nav right\" lay-filter=\"\">\r\n\t\t\t<li class=\"layui-nav-item\">\r\n            <a class=\"top_nav_right\"  x_href=\"{fun U('index/cleanCache')}\"><i class=\"layui-icon layui-icon-refresh-3 jzicon\"></i>{fun JZLANG('清理缓存')}</a>\r\n            \r\n          </li>\r\n          <li class=\"layui-nav-item\">\r\n            <a href=\"javascript:;\"><i class=\"layui-icon layui-icon-username jzicon\"></i>{$admin['name']}</a>\r\n            <dl class=\"layui-nav-child\"> <!-- 二级菜单 -->\r\n              <dd><a x_href=\"{fun U('Index/details',['id'=>frencode($admin['id'])])}\" class=\"top_nav_right\"      >{fun JZLANG('个人信息')}</a></dd>\r\n              \r\n              <dd><a href=\"{fun U('Login/loginout')}\">{fun JZLANG('退出')}</a></dd>\r\n            </dl>\r\n          </li>\r\n\r\n          <li class=\"layui-nav-item to-index\"><a target=\"_blank\" href=\"/\"><i class=\"layui-icon layui-icon-home jzicon\"></i>{fun JZLANG('前台首页')}</a></li>\r\n        </ul>\r\n        \r\n    </div>\r\n    <!-- 顶部结束 -->\r\n    <!-- 中部开始 -->\r\n     <!-- 左侧菜单开始 -->\r\n    <div class=\"left-nav layui-side layui-bg-black\">\r\n      <div id=\"side-nav\" class=\"layui-side-scroll\">\r\n        <ul id=\"nav\" class=\"layui-nav-tree\">\r\n\t\t\t<li>\r\n                <a  _href=\"{fun U('Index/welcome')}\">\r\n                    <i class=\"layui-icon layui-icon-home\"></i>\r\n                    <cite>{fun JZLANG('后台首页')}</cite>\r\n                    \r\n                </a>\r\n               \r\n            </li>\r\n\t\t\r\n\t\t\t\t\r\n\t\t{if(is_array($left_layout))}\r\n\t\t{foreach $left_layout as $v}\r\n            <li>\r\n                <a href=\"javascript:;\">\r\n                    <i class=\"iconfont\">{fun htmlspecialchars_decode($v['icon'])}</i>\r\n                    {fun JZLANG($v['name'])}\r\n                    <i class=\"iconfont nav_right\">&#xe6a7;</i>\r\n                </a>\r\n                <ul class=\"sub-menu\">\r\n\t\t\t\t{foreach $v['nav'] as $vv}\r\n\t\t\t\t{if(!is_array($vv) && $vv)}\r\n                    <li>\r\n\t\t\t\t\t\t{if(strpos($vv,'class')!==false)}\r\n\t\t\t\t\t\t<a _href=\"{$classnav[$vv]['act']}\" >{$classnav[$vv]['classname']}</a>\r\n\t\t\t\t\t\t{else}\r\n                        <a _href=\"{fun U($actions[$vv]['fc'])}\">{fun JZLANG($actions[$vv]['name'])}</a>\r\n\t\t\t\t\t\t{/if}\r\n                    </li >\r\n\t\t\t\t{else if(is_array($vv))}\r\n\t\t\t\t\t\r\n\t\t\t\t\t<li>\r\n\t\t\t\t\t\t{if(strpos($vv['value'],'class')!==false)}\r\n\t\t\t\t\t\t<a _href=\"{$classnav[$vv['value']]['act']}\" >{if($vv['icon'])}<i class=\"iconfont\">{fun htmlspecialchars_decode($vv['icon'])}</i>{/if}{fun JZLANG($vv['title'])}</a>\r\n\t\t\t\t\t\t{else}\r\n                        <a _href=\"{fun U($actions[$vv['value']]['fc'])}\">{if($vv['icon'])}<i class=\"iconfont\">{fun htmlspecialchars_decode($vv['icon'])}</i>{/if}{fun JZLANG($vv['title'])}</a>\r\n\t\t\t\t\t\t{/if}\r\n                    </li >\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t{/if}\r\n                {/foreach}    \r\n                    \r\n                </ul>\r\n            </li>\r\n\t\t\t\r\n\t\t{/foreach}\t\r\n\t\t{/if}\t\t\r\n          \r\n           \r\n        </ul>\r\n      </div>\r\n    </div>\r\n    <!-- <div class=\"x-slide_left\"></div> -->\r\n    <!-- 左侧菜单结束 -->\r\n    <!-- 右侧主体开始 -->\r\n    <div class=\"page-content\">\r\n        <div class=\"layui-tab tab\" lay-filter=\"xbs_tab\" lay-allowclose=\"false\">\r\n          <ul class=\"layui-tab-title\">\r\n            <li class=\"home\"><i class=\"layui-icon\">&#xe68e;</i>{fun JZLANG('我的桌面')}</li>\r\n          </ul>\r\n          <div class=\"layui-tab-content\">\r\n            <div class=\"layui-tab-item layui-show\">\r\n                <iframe src=\"{fun U('Index/welcome')}\" name=\"x-iframe\" frameborder=\"0\" scrolling=\"auto\" class=\"x-iframe\"></iframe>\r\n            </div>\r\n          </div>\r\n        </div>\r\n    </div>\r\n     <ul class=\"rightmenu\">\r\n        <li data-type=\"closethis\">{fun JZLANG('关闭当前')}</li>\r\n        <li data-type=\"closeother\">{fun JZLANG('关闭其他')}</li>\r\n        <li data-type=\"closeall\">{fun JZLANG('关闭所有')}</li>\r\n    </ul>\r\n    <div class=\"page-content-bg\"></div>\r\n    <!-- 右侧主体结束 -->\r\n    <!-- 中部结束 -->\r\n    <!-- 底部开始 -->\r\n {include=\"footer\"}\r\n    <!-- 底部结束 -->\r\n   \r\n</body>\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/links-add.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n        {include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展模块管理')}</cite></a>\n              <a><cite>{fun JZLANG('新增')}{$molds['name']}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('所属分类')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" lay-verify=\"required\" lay-filter=\"tid\" id=\"tid\" >\n\t\t\t\t\t\t\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择分类')}</option>\n\t\t\t\t\t\t\n\t\t\t\t\t  {loop table=\"link_type\" as=\"v\"}\n\t\t\t\t\t   <option {if($tid==$v['id'])}selected{/if} value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\n\t\t\t\t\t   {/loop}\n\t\t\t\t\t   \n\t\t\t\t\t   </select>\n                    </div>\n\t\t\t\t\t\n                </div>\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('是否显示')}\n                    </label>\n                    <div class=\"layui-input-block\">\n                        <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('不显示')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" checked>\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n                 </div>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t \n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\t\t\t\t\t\t\n               \n                \n                <div class=\"layui-form-item\" id=\"jizhitj\"  style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\t\n\t\t\t\t\n                //发异步，把数据提交给php\n\t\t\t\t$.post(\"{fun U('Links/addlinks',array('molds'=>$molds['biaoshi']))}\",data.field,function(r){\n\t\t\t\t\t//console.log(r);return false;\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   \n\t\t\t\t\t\t   {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.href=\"{fun U('Links/index',['molds'=>$molds['biaoshi']])}\";\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t   parent.location.reload();\n\t\t\t\t\t\t   parent.layer.close(index);\n\t\t\t\t\t\t   \n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t   \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\n\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t\n            get_fields(0);\n            get_fields_ext(0);\n\t\t\n\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/links-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展模块管理')}</cite></a>\n              <a><cite>{fun JZLANG('修改')}{$molds['name']}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('所属分类')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" lay-verify=\"required\" lay-filter=\"tid\" id=\"tid\" >\n\t\t\t\t\t\t\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择分类')}</option>\n\t\t\t\t\t\t\n\t\t\t\t\t  {loop table=\"link_type\" as=\"v\"}\n\t\t\t\t\t   <option {if($data['tid']==$v['id'])}selected{/if} value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t\n\t\t\t\t\t   {/loop}\n\t\t\t\t\t   \n\t\t\t\t\t   </select>\n                    </div>\n\t\t\t\t\t\n                </div>\n\t\t\t\t\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshow\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('是否显示')}\n                    </label>\n                    <div class=\"layui-input-block\">\n                        <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('不显示')}\" {if($data['isshow']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('显示')}\" {if($data['isshow']==1)}checked{/if}>\n\t\t\t\t\t\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n                </div>\n\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\t\t\t\t\t\t\n               \n                \n                <div class=\"layui-form-item\" id=\"jizhitj\"  style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t  \n\t\t\t  var upload = layui.upload;\n\t\t\t \n\t\t\t     //监听提交\n              form.on('submit(save)', function(data){\n                \n\t\t\t\t$.post(\"{fun U('Links/editlinks',array('molds'=>$molds['biaoshi']))}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回列表')}','{fun JZLANG('取消')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\twindow.location.href=\"{fun U('Links/index',['molds'=>$molds['biaoshi']])}\";\n\t\t\t\t\t\t\t{else}\n                            parent.layer.closeAll();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n                             parent.layer.closeAll();\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            get_fields(0,{$data['id']});\n            get_fields_ext(0,{$data['id']});\n\t\t\t\n\t\t\t  \n\t\t\t\n\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/links-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展模块管理')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t  <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content layui-show\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"isshow\" lay-filter=\"isshow\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('是否显示')}</option>\n\t\t\t\t\t   \n\t\t\t\t\t   <option {if($isshow==1)} selected=\"selected\" {/if}value=\"1\">{fun JZLANG('显示')}</option>\n\t\t\t\t\t   <option {if($isshow==2)} selected=\"selected\" {/if}value=\"2\">{fun JZLANG('不显示')}</option>\n\t\t\t\t\t   \n\t\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"tid\" lay-filter=\"tid\" lay-search class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('请选择分类')}</option>\n\t\t\t\t\t   {loop table=\"link_type\"  as=\"v\"}\n\t\t\t\t\t \n\t\t\t\t\t   <option {if($tid==$v['id'])} selected=\"selected\" {/if}value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t\t\t  \n\t\t\t\t\t   {/loop}\n\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t  {$fields_search}\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n       \n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t{if(checkAction('Links/editlinks'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs\" lay-event=\"edit\">{fun JZLANG('编辑')}</a>\n\t\t{/if}\n\t\t\n\t\t\n\t\t{if(checkAction('Links/deletelinks'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Links/copylinks'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-warm\" lay-event=\"copy\">{fun JZLANG('复制')}</a>\n\t\t{/if}\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t {if(checkAction('Links/deleteAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-danger layui-btn-sm\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Links/copyAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-warm  layui-btn-sm\" onclick=\"copyAll()\">{fun JZLANG('批量复制')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Links/changeType'))}\n\t\t\t\n\t\t\t   <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_tid\"  lay-search=\"\" lay-filter=\"change_tid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量修改分类')}</option>\n\t\t\t   \n\t\t\t   {loop table=\"link_type\"  as=\"v\"}\n\t\t\t   <option value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t   {/loop}\n\t\t\t   </select>\n\t\t\t   </div>\n\t\t\t  \n\t\t {/if}\n\t\t {if(checkAction('Links/checkAll'))}\n\t\t  <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;width:150px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_isshow\"  lay-filter=\"change_isshow\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量处理')}</option>\n\t\t\t   <option   value=\"1\">{fun JZLANG('显示')}</option>\n\t\t\t   <option   value=\"2\">{fun JZLANG('不显示')}</option>\n\t\t\t  \n\t\t\t   </select>\n\t\t  </div>\n\t\t {/if}\n\t\t {if(checkAction('Links/addlinks'))}\n\t\t\t   <a class=\"layui-btn  layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增')}','{fun U('Links/addlinks',array('molds'=>$molds['biaoshi']))}')\">{fun JZLANG('新增')}</a>\n\t\t {/if}\t  \n\t\t {if(checkAction('Links/linktype'))}\n\t\t  <a class=\"layui-btn  layui-btn-sm\" href=\"{fun U('Links/linktype')}\" >{fun JZLANG('友情链接分类')}</a>\n\t\t {/if}\t  \n\t\t\t\n\t\t </div>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"isshow\">\n\t\t\t{{#  if(d.isshow ==1){ }}\n\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('显示')}</span>\n\t\t    {{#  } else{ }}\n\t\t    <span class=\"layui-badge\">{fun JZLANG('不显示')}</span>\n\t\t    {{#  } }}\n\t\t</script>\n\t \n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  \n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  ,{field: 'orders', title: '{fun JZLANG('排序')}',width: 100, edit:'text'}\n\t\t\t\t  ,{field: 'new_tid', title: '{fun JZLANG('分类')}'}\n\t\t\t\t  {foreach $fields_list as $k=>$v}\n\t\t\t\t  ,{field: '{$v['field']}', title: '{$v['fieldname']}'{if($v['fieldtype']==1 || $v['fieldtype']==2)},edit:'text'{/if}}\n\t\t\t\t  {/foreach}\n\t\t\t\t  ,{field: 'new_isshow', title: '{fun JZLANG('审核')}', width: 100,templet:'#isshow'}\n\t\t\t\t  {if(checkAction('Links/copylinks') || checkAction('Links/deletelinks') || checkAction('Links/editlinks'))}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}', toolbar: '#rightbar',width:200, fixed:'right'}\n\t\t\t\t  {/if}\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('编辑')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t    var a = $('<a href=\"'+data.view_url+'\" target=\"_blank\">{fun JZLANG('预览')}</a>').get(0);\n\t\t\t\t\t\t\tvar e = document.createEvent('MouseEvents');\n\t\t\t\t\t\t\te.initEvent( 'click', true, true );\n\t\t\t\t\t\t\ta.dispatchEvent(e);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Links/deletelinks')}\",{molds:\"{$molds['biaoshi']}\",id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t\t\t$.post(\"{fun U('Links/copylinks')}\",{molds:\"{$molds['biaoshi']}\",id:data.id},function(r){\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t  \n\t\t\t\t\t\t \n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t\n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\ttable.on('edit(jizhi_table)', function(obj){ //注：edit是固定事件名，test是table原始容器的属性 lay-filter=\"对应的值\"\n\t\t\t\t\n\t\t\t\t  var id = obj.data.id;\n\t\t\t\t  var value = obj.value;\n\t\t\t\t  var field = obj.field;\n\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Links/editOrders')}\",{'id':id,'field':field,'value':value,'molds':'{$molds['biaoshi']}'},function(r){\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg(r.info,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\t\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t    form.on('select(change_tid)', function(data){\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar tid = parseInt(data.value);\n\t\t\t\t\tif(tid==0){\n\t\t\t\t\t\tlayer.alert('{fun JZLANG('请选择修改栏目！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\tlayer.alert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量修改内容分类吗？')}['+datas+']=>['+tid+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Links/changeType')}\",{molds:\"{$molds['biaoshi']}\",data:datas,tid:tid},function(r){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量修改成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\n\t\t\t    form.on('select(change_isshow)', function(data){\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar isshow = parseInt(data.value);\n\t\t\t\t\tif(isshow==0){\n\t\t\t\t\t\tlayer.alert('{fun JZLANG('请选择审核选项！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\tlayer.alert('{fun JZLANG('请选择审核对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(isshow==1){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('已审核')}';\n\t\t\t\t\t}else if(isshow==2){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('未审核')}';\n\t\t\t\t\t}else{\n\t\t\t\t\t\tvar tip = '{fun JZLANG('退回')}';\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量处理吗？')}['+datas+']=>['+tip+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Links/checkAll')}\",{molds:\"{$molds['biaoshi']}\",data:datas,isshow:isshow},function(r){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量处理成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\t\t\t\t\n\n\t\t\t\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Links/deleteAll')}\",{molds:\"{$molds['biaoshi']}\",data:data},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t function copyAll(){\n\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要复制吗？')}['+data+']',function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Links/copyAll')}\",{molds:\"{$molds['biaoshi']}\",data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量复制成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t  \n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/linktype-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n\t  {include=\"style\"}\n\t  \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\">\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\n\t\t\t<div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('分类名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n\t\t\t</div>\n\t\t  \n\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t</div>\n\t\t\t\t\n\t\t\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <div class=\"layui-form-item\"  style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('添加')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n         \n\t\t\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t\t\t$.post('{fun U('Links/linktypeadd')}',data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('添加成功！')}', {\n\t\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t\t//window.location.href='{fun U('Index/classtype')}';\n\t\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t\twindow.location.href=\"{fun U('Links/linktype')}\";\n\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// \n\t\t\t\t\t\t}\n\t\t\t\t\t});\n                return false;\n          });\n\t\t  \n\t\t  \n\t\t\t\n          \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/linktype-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n\t  {include=\"style\"}\n\t  \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form  layui-form-pane\">\n\t\t<input name=\"go\" type=\"hidden\" value=\"1\" />\n\t\t<input name=\"id\" type=\"hidden\" value=\"{$data['id']}\" />\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\n          <div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('分类名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" value=\"{$data['name']}\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  \n              </div>\n\t\t\t</div>\n\t\t  \n\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t  </div>\n\t\t</div>\n\t\t\t\t\n\t\t\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('修改')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n         \n\t\t\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t\t\t$.post('{fun U('Links/linktypeedit')}',data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('修改成功！')}', {\n\t\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t\twindow.location.href=\"{fun U('Links/linktype')}\";\n\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t\tparent.layer.close(index);\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// parent.layer.close(index);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n                return false;\n          });\n\t\t  \n\t\t  \n\t\t\t\n          \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/linktype-list.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a >{fun JZLANG('首页')}</a>\n        <a >{fun JZLANG('扩展管理')}</a>\n        <a><cite>{fun JZLANG('友情链接分类')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t\n\t\t\t    <xblock>\n\t  {if(checkAction('Links/linktypeadd'))}\n\t\t<a class=\"layui-btn layui-btn-sm\"  onclick=\"x_admin_show('{fun JZLANG('添加分类')}','{fun U('Links/linktypeadd')}')\" >{fun JZLANG('添加分类')}</a>\n\t  {/if}\n        <span class=\"x-right\" style=\"line-height:40px\"></span>\n      </xblock>\n      <table class=\"layui-table layui-form\">\n        <thead>\n          <tr>\n           \n            <th width=\"70\">ID</th>\n            <th width=\"300\">{fun JZLANG('分类名')}</th>\n            <th width=\"150\">{fun JZLANG('时间')}</th>\n            <th >{fun JZLANG('操作')}</th>\n        </thead>\n        <tbody class=\"x-cate\">\n\t\t{foreach $lists as $v}\n          <tr cate-id=\"{$v['id']}\" fid=\"0\" >\n\t\t\t\n            <td>{$v['id']}</td>\n            <td>{$v['name']}</td>\n\t\t\t<td>{fun date('Y-m-d H:i:s',$v['addtime'])}</td>\n\t\t\t\n            <td class=\"td-manage\">\n\t\t\t{if(checkAction('Links/linktypeedit'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Links/linktypeedit',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t{/if}\n\t\t\t{if(checkAction('Links/linktypedelete'))}\n              <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"linkdel(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t{/if}  \n            </td>\n          </tr>\n\t\t {/foreach}\n         \n        </tbody>\n      </table>\n    </div>\n    \n\t\t\t\n\t\t\t</div>\n\t\t</div>\n     \n  \n    <script>\n      layui.use(['form'], function(){\n        form = layui.form;\n       \n      });\n\t\n\n      /*用户-删除*/\n      function linkdel(obj,id){\n          layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n              //发异步删除数据\n\t\t\t  $.post('{fun U('Links/linktypedelete')}',{id:id},function(r){\n\t\t\t\t\tr = JSON.parse(r);\n\t\t\t\t\tif(r.code==1){\n\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg(r.msg, {\n\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t $(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('已删除!')}',{icon:1,time:1000});\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t  });\n\t\t\n\t\t\t  \n\t\t\t  \n              \n          });\n      }\n\n\t\t\n\t\t\t\n    \n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/login.html",
    "content": "<!doctype html>\r\n<html>\r\n<head>\r\n\t<meta charset=\"UTF-8\">\r\n\t{include=\"style\"}\r\n\t<script src=\"/static/common/md5.js\" charset=\"utf-8\"></script>\r\n</head>\r\n<body class=\"login-bg\">\r\n    \r\n    <div class=\"login layui-anim layui-anim-up\">\r\n        <div class=\"message\">{fun JZLANG('后台管理登录')}</div>\r\n        <div id=\"darkbannerwrap\"></div>\r\n        \r\n        <form method=\"post\" class=\"layui-form\" onsubmit=\"return false;\"  >\r\n            <input name=\"cache\" id=\"cache\" type=\"hidden\" value=\"\" />\r\n\t\t\t<select name=\"lang\"  lay-filter=\"lang\">\r\n\t\t\t\t<option value=\"\">选择语言</option>\r\n\t\t\t\t<option {if(LANG=='zh')} selected {/if} value=\"zh\">中文简体</option>\r\n\t\t\t\t<option {if(LANG=='cht')} selected {/if} value=\"cht\">中文繁体</option>\r\n\t\t\t\t<option {if(LANG=='en')} selected {/if} value=\"en\">English</option>\r\n\r\n\t\t\t</select>\r\n\t\t\t<hr class=\"hr15\">\r\n            <input name=\"username\" placeholder=\"{fun JZLANG('用户名')}\"  type=\"text\" lay-verify=\"required\" class=\"layui-input\" >\r\n            <hr class=\"hr15\">\r\n            <input name=\"password\" lay-verify=\"required\" placeholder=\"{fun JZLANG('密码')}\"  type=\"password\" class=\"layui-input\">\r\n            <hr class=\"hr15\">\r\n\t\t\t{if($webconf['closeadminvercode']!=1)}\r\n\t\t\t<input name=\"vercode\" style=\"width:50%;float:left;\" lay-verify=\"required\" placeholder=\"{fun JZLANG('验证码')}\"  type=\"text\" class=\"layui-input\">\r\n\t\t\t<img id=\"vercodeimg\"  src=\"{fun U('vercode')}\" style=\"width:40%;float:right;\" onclick=\"this.src=this.src+'?'+Math.random()\" />\r\n            <hr class=\"hr15\">\r\n\t\t\t{/if}\r\n            <input value=\"{fun JZLANG('登录')}\" lay-submit lay-filter=\"login\" style=\"width:100%;\" type=\"submit\">\r\n            <hr class=\"hr20\" >\r\n        </form>\r\n    </div>\r\n\r\n    <script>\r\n        $(function  () {\r\n\t\t\tif (top.location != self.location){\r\n\t\t\ttop.location = self.location;\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\t$(\"#cache\").val(Math.random());\r\n\t\t\r\n\t\t\t\r\n            layui.use('form', function(){\r\n              var form = layui.form;\r\n\t\t\t\tform.on('select(lang)', function(data){\r\n\t\t\t\t\tvar url = window.location.href;\r\n\t\t\t\t\tvar url_ = url.split('?');\r\n\t\t\t\t\tvar aurl = url_[0];\r\n\t\t\t\t\tif(data.value!=''){\r\n\t\t\t\t\t\twindow.location.href=aurl+'?l='+data.value;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n              //监听提交\r\n              form.on('submit(login)', function(data){\r\n           \t\tdata.field.password = hex_md5(data.field.password)\r\n\t\t\t\t$.post(\"{fun U('Login/index')}\",data.field,function(res){\r\n\t\t\t\t    \r\n\t\t\t\t\t var res = JSON.parse(res);\r\n\t\t\t\t\t if(res.code==1){\r\n\t\t\t\t\t\tvar src = '{fun U('vercode')}?'+Math.random();\r\n\t\t\t\t\t\t$(\"#vercodeimg\").attr('src',src);\r\n\t\t\t\t\t\tlayer.msg(res.msg);\r\n\t\t\t\t\t }else{\r\n\t\t\t\t\t\tlayer.msg(res.msg, {icon: 6,time: 2000},function(){\r\n\t\t\t\t\t\twindow.location.href=\"{fun U('Index/index')}\";\r\n\t\t\t\t\t\t});\r\n                     \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t \r\n\t\t\t\t\t }\r\n\t\t\t\t})\r\n\t\t\t\t\r\n                return false;\r\n              });\r\n            });\r\n        })\r\n\r\n        \r\n    </script>\r\n\r\n    \r\n \r\n</body>\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/loginlog.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\">\n       {include=\"style\"}\n\t   <style>\n\t   \n\t   </style>\n    </head>\n    <body>\n    <div class=\"x-body layui-anim layui-anim-up\">\n    <div class=\"layui-card\">\n\t\t<div class=\"layui-card-body\">\n        <table class=\"layui-hide\" id=\"xdata\" lay-filter=\"xdata\"></table>\n\t\t</div>\n\t</div>\t\t\n       \n       \n    </div>\n        <script>\n\t\tlayui.use(['table','form'], function(){\n                $ = layui.jquery;\n              var form = layui.form,table = layui.table;\n              \n\t\t\t  \n\t\t\t  //第一个实例\n\t\t\t  table.render({\n\t\t\t\telem: '#xdata'\n\t\t\t\t,height: 500 //高度最大化减去差值\n\t\t\t\t,url: \"?ajax=1\" //数据接口\n\t\t\t\t,toolbar: false\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  //,groups: 1 //只显示 1 个连续页码\n\t\t\t\t  ,first: false //不显示首页\n\t\t\t\t  ,last: false //不显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '{fun JZLANG('首页')}' //不显示首页\n\t\t\t\t  ,last: '{fun JZLANG('尾页')}' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: '{fun JZLANG('登录ID')}', fixed: 'left',  sort: true}\n\t\t\t\t  ,{field: 'username', title: '{fun JZLANG('登录用户')}'}\n\t\t\t\t  ,{field: 'ip', title: 'IP'}\n\t\t\t\t  ,{field: 'm', title: '{fun JZLANG('模块')}'}\n\t\t\t\t  ,{field: 'a', title: '{fun JZLANG('方法')}'}\n\t\t\t\t  ,{field: 't', title: '{fun JZLANG('操作时间')}', sort: true}\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t})\n\n        </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/member-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n    {include=\"style\"}\n    {include=\"edit\"}\n  </head>\n  \n  <body>\n   <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a href=\"/\" target=\"main\">{fun JZLANG('首页')}</a>\n        <a href=\"{fun U('Member/index')}\" >{fun JZLANG('会员管理')}</a>\n        <a><cite>{fun JZLANG('新增会员')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body layui-anim layui-anim-up\">\n        <form class=\"layui-form layui-form-pane\">\n\t\t<input name=\"go\" value=\"1\" type=\"hidden\">\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\t<span id=\"content_fields\"></span>\n\t\t  \n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t  <label for=\"L_pass\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t  <span class=\"x-red\">*</span>{fun JZLANG('密码')}\n\t\t\t\t\t\t  </label>\n\t\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t  <input type=\"password\" id=\"L_pass\" name=\"pass\" required lay-verify=\"pass\"\n\t\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t\t  {fun JZLANG('6到16个字符')}\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n                    \n\t\t  \n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n                    <span id=\"ext_fields\"></span>\n\t\t\t\t</div>\n\t\t      </div>\n\t\t</div>\n\t\t\n          \n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('添加')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\t{include=\"fields\"}\n\t\tfunction deleteImage(elm){\n\t\t\t$(elm).prev().attr(\"src\", \"{__Tpl_style__}/style/images/nopic.jpg\");\n\t\t\t$('#litpic').val(\"\");\n\t\t}\n        layui.use(['form','layer','upload','laydate'], function(){\n            $ = layui.jquery;\n          var form = layui.form,\n          layer = layui.layer,\n          laydate = layui.laydate,\n\t\t      upload = layui.upload;\n          laydate.render({\n            elem: '#birthday' //指定元素\n          });\n          upload.render({\n\t\t\telem: '#litpic_upload',\n\t\t\turl: \"{fun U('Common/uploads')}\" //上传接口\n      ,data:{molds:'member'}\n\t\t\t,done: function(res){ //上传成功后的回调\n\t\t\t \n\t\t\t\tif(res.code==0){\n\t\t\t\t\t $('#litpic_img').attr('src',res.url);\n\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t}else{\n\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t}\n\t\t\t \n\t\t\t}\n\t\t  });\n          \n\n          //监听提交\n          form.on('submit(add)', function(data){\n            //console.log(data);\n\t\t\t$.post(\"{fun U('Member/memberadd')}\",data.field,function(res){\n\t\t\t\tvar r = JSON.parse(res);\n\t\t\t\t\n\t\t\t\tif(r.code==0){\n\t\t\t\t\t //发异步，把数据提交给php\n\t\t\t\t\tlayer.msg(\"{fun JZLANG('添加成功')}\", {icon: 6,time:2000},function () {\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\twindow.location.href=\"{fun U('Member/index')}\";\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\tlayer.msg(r.msg);\n\t\t\t\t}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t})\n           \n            return false;\n          });\n          get_fields(0);\n          get_fields_ext(0);\n          \n        });\n    </script>\n   \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/member-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n    {include=\"style\"}\n    {include=\"edit\"}\n  </head>\n  \n  <body>\n   <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a href=\"/\" target=\"main\">{fun JZLANG('首页')}</a>\n        <a href=\"{fun U('Member/index')}\" >{fun JZLANG('会员管理')}</a>\n        <a>\n          <cite>{fun JZLANG('会员修')}改</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body layui-anim layui-anim-up\">\n        <form class=\"layui-form  layui-form-pane\">\n\t\t<input name=\"go\" value=\"1\" type=\"hidden\">\n\t\t<input name=\"id\" value=\"{$data['id']}\" type=\"hidden\">\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\t  <span id=\"content_fields\"></span>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t  <label for=\"L_pass\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t  {fun JZLANG('密码')}\n\t\t\t\t\t\t  </label>\n\t\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t  <input type=\"password\" id=\"L_pass\" name=\"pass\"  lay-verify=\"pass\"\n\t\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t  <div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t\t  {fun JZLANG('6到16个字符,不修改请留空')}\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t  <label for=\"L_repass\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t  {fun JZLANG('确认密码')}\n\t\t\t\t\t\t  </label>\n\t\t\t\t\t\t  <div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t  <input type=\"password\" id=\"L_repass\" name=\"repass\"  lay-verify=\"repass\"\n\t\t\t\t\t\t\t  autocomplete=\"off\" class=\"layui-input\">\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t  </div>\n\n                   \n\t  \n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n                    <span id=\"ext_fields\"></span>\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t</div>\n\t\t\n          \n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('修改')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\t{include=\"fields\"}\n\t\tfunction deleteImage(elm){\n\t\t\t$(elm).prev().attr(\"src\", \"{__Tpl_style__}/style/images/nopic.jpg\");\n\t\t\t$('#litpic').val(\"\");\n\t\t}\n        layui.use(['form','layer','upload','laydate'], function(){\n            $ = layui.jquery;\n          var form = layui.form,\n          layer = layui.layer,\n          laydate = layui.laydate,\n\t\t      upload = layui.upload;\n\t\t  laydate.render({\n            elem: '#birthday' //指定元素\n          });\n        //图片上传接口\n\t\t  upload.render({\n\t\t\telem: '#litpic_upload',\n\t\t\turl: \"{fun U('Common/uploads')}\" //上传接口\n\t\t\t,data:{molds:'member'}\n\t\t\t,done: function(res){ //上传成功后的回调\n\t\t\t \n\t\t\t\tif(res.code==0){\n\t\t\t\t\t $('#litpic_img').attr('src',res.url);\n\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t}else{\n\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t}\n\t\t\t \n\t\t\t}\n\t\t  });\n        \n\n          //监听提交\n          form.on('submit(add)', function(data){\n            console.log(data);\n\t\t\t$.post(\"{fun U('Member/memberedit')}\",data.field,function(res){\n\t\t\t\tvar r = JSON.parse(res);\n\t\t\t\t\n\t\t\t\tif(r.code==0){\n\t\t\t\t\t //发异步，把数据提交给php\n\t\t\t\t\tlayer.msg(\"{fun JZLANG('修改成功')}\", {icon: 6,time:2000},function () {\n\t\t\t\t\t\t\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t window.location.href=\"{fun U('Member/index')}\";\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\tparent.layer.closeAll();\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\tlayer.msg(r.msg);\n\t\t\t\t}\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t})\n           \n            return false;\n          });\n          \n              get_fields(0,{$data['id']});\n              get_fields_ext(0,{$data['id']});\n        });\n    </script>\n   \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/member-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('会员管理')}</cite></a>\n              <a><cite>{fun JZLANG('会员列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t\n\t\t\t<div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content layui-show\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t\n\t\t\t\t\t  {$fields_search}\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n\t\t\n       \n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t{if(checkAction('Member/memberedit'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs\" lay-event=\"edit\">{fun JZLANG('编辑')}</a>\n\t\t{/if}\t\n\t\t{if(checkAction('Member/member_del'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\t\n\t\t\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t {if(checkAction('Member/deleteAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-danger layui-btn-sm\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}\t \n         {if(checkAction('Member/memberadd'))}\t\t \n\t\t\t   <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增会员')}','{fun U('Member/memberadd')}')\">{fun JZLANG('新增会员')}</a>\n\t\t {/if}  \n\t\t\t<a class=\"layui-btn layui-btn-warm layui-btn-sm\" title=\"{fun JZLANG('设置')}\" onclick=\"x_admin_show('{fun JZLANG('列表字段设置')}','{fun U('Fields/fieldsList',['molds'=>'member'])}')\"><i class=\"iconfont\">&#xe6ae;</i></a>\n\t\t </div>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"isshow\">\n\t\t{if(checkAction('Member/change_status'))}\n\t\t<input type=\"checkbox\" value=\"{{d.id}}\" name=\"switch\" lay-filter=\"status\"   lay-text=\"{fun JZLANG('正常|封禁')}\"  lay-skin=\"switch\" {{#  if(d.isshow == 1){ }}checked{{#  } }}>\n\t\t{else}\n\t\t{{#  if(d.isshow == 1){ }}<span class=\"layui-badge layui-bg-green\">{fun JZLANG('正常')}</span>{{# }else{ }}<span class=\"layui-badge\">{fun JZLANG('封禁')}</span>{{#  } }}\n\t\t{/if}\n\t\t</script>\n\n\t \n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\tlaydate.render({\n\t\t\t\telem: '#start' //指定元素\n\t\t\t\t,type: 'datetime'\n\t\t\t});\n\t\t\tlaydate.render({\n\t\t\t\telem: '#end' //指定元素\n\t\t\t\t,type: 'datetime'\n\t\t\t});\n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '{fun JZLANG('首页')}' //不显示首页\n\t\t\t\t  ,last: '{fun JZLANG('尾页')}' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  {foreach $fields_list as $v},{field: '{$v['field']}', title: '{$v['fieldname']}'}{/foreach}\n\t\t\t\t  {if(checkAction('Member/memberedit') || checkAction('Member/member_del'))}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:200, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t  {/if}\n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('查看')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t  \n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Member/member_del')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t\t\n\t\t\t\t\t  \n\t\t\t\t\t\t \n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t  \n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t\n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\t\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t\tform.on('switch(status)', function (data) {\n\t\t\t\t\t$.post(\"{fun U('change_status')}\",{id:data.elem.value},function(r){ });\n\t\t\t\t});\n\t\t\t\t\t \n\t\t\t\t\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Member/deleteAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t\n\t\t\t \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/membergroup-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n    {include=\"style\"}\n  </head>\n  \n  <body>\n\t<div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('会员管理')}</cite></a>\n             \n\t\t\t <a><cite>{fun JZLANG('分组管理')}</cite></a>\n\t\t\t <a><cite>{fun JZLANG('分组修改')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\t<div class=\"layui-card\">\n\t\t<div class=\"layui-card-body\">\n        <form  method=\"post\" class=\"layui-form layui-form-pane\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n                <div class=\"layui-form-item\">\n                    <label for=\"name\" class=\"layui-form-label\">\n                        {fun JZLANG('分组名')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t\n                <div class=\"layui-form-item layui-form-text\">\n                    <label class=\"layui-form-label\">\n                        {fun JZLANG('拥有权限')} <span class=\"x-red\">{fun JZLANG('选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块')}</span>\n                    </label>\n                    <table  class=\"layui-table layui-input-block\">\n                        <tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th>\n                                   {fun JZLANG('主模块')}\n                                </th>\n                                <th>\n                                   {fun JZLANG('子模块')}\n                                </div>\n                                </th>\n                            </tr>\n\t\t\t\t\t\t{foreach $ruler_top as $v}\n                            <tr>\n                                <td>\n                                    <input type=\"checkbox\" name=\"ruler[]\" lay-skin=\"primary\" value=\"{$v['action']}\" title=\"{$v['name']}\" checked>\n                                </td>\n                                <td>\n                                    <div class=\"layui-input-block\">\n\t\t\t\t\t\t\t\t\t{if(isset($ruler_children[$v['id']]))}\n\t\t\t\t\t\t\t\t\t{foreach $ruler_children[$v['id']] as $vv}\n                                        <input name=\"ruler[]\" lay-skin=\"primary\" type=\"checkbox\" title=\"{$vv['name']}\" value=\"{$vv['action']}\" > \n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t{/if}\n                                        \n                                    </div>\n                                </td>\n                            </tr>\n\t\t\t\t\t\t{/foreach}\n                           \n                        </tbody>\n                    </table>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"discount_type\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('折扣类型')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"discount_type\" lay-filter=\"discount_type\" id=\"discount_type\" >\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('无折扣')}</option>\n\t\t\t\t\t    <option value=\"1\">{fun JZLANG('现金折扣')}</option>\n\t\t\t\t\t    <option value=\"2\">{fun JZLANG('百分比折扣')}</option>\n\t\t\t\t\t    </select>\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"discount\" class=\"layui-form-label\">\n                        {fun JZLANG('折扣金额')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" value=\"0.00\" id=\"discount\" name=\"discount\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t\n                <div class=\"layui-form-item layui-form-text\">\n                    <label for=\"description\" class=\"layui-form-label\">\n                        {fun JZLANG('描述')}\n                    </label>\n                    <div class=\"layui-input-block\">\n                        <textarea placeholder=\"{fun JZLANG('请输入内容')}\" id=\"description\" name=\"description\" class=\"layui-textarea\"></textarea>\n                    </div>\n                </div>\n            <span id=\"content_fields\"></span>\n            <span id=\"ext_fields\"></span>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isagree\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('登录状态')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isagree\" value=\"0\" title=\"{fun JZLANG('封禁')}\" >\n\t\t\t\t\t\t<input type=\"radio\" name=\"isagree\" value=\"1\" title=\"{fun JZLANG('正常')}\" checked>\n                    </div>\n\t\t\t\t\t\n\t\t\t\t\t\n                </div>\n\t\t\t\t\n                <div class=\"layui-form-item\" style=\"text-align:center\">\n                <button class=\"layui-btn\" lay-submit=\"\" lay-filter=\"add\">{fun JZLANG('添加')}</button>\n              </div>\n            </form>\n\t\t\t</div>\n\t\t\t</div>\n    </div>\n    <script>\n        {include=\"fields\"}\n        layui.use(['form','layer'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n        \n          form.render();\n\n          //监听提交\n          form.on('submit(add)', function(data){\n\t\t\tif(data.field.danwei==''){\n\t\t\t\talert('{fun JZLANG('请选择所属单位！')}');return false;\n\t\t\t}\n            $.post(\"{fun U('groupadd')}\",data.field,function(r){\n\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\tif(r.code==0){\n\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t window.location.href=\"{fun U('Member/membergroup')}\";\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n            return false;\n          });\n            get_fields(0);\n            get_fields_ext(0);\n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/membergroup-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n    {include=\"style\"}\n  </head>\n  \n  <body>\n\t<div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('用户管理')}</cite></a>\n             \n\t\t\t <a><cite>{fun JZLANG('分组管理')}</cite></a>\n\t\t\t <a><cite>{fun JZLANG('分组修改')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\t<div class=\"layui-card\">\n\t\t<div class=\"layui-card-body\">\n        <form  method=\"post\" class=\"layui-form layui-form-pane\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n                <div class=\"layui-form-item\">\n                    <label for=\"name\" class=\"layui-form-label\">\n                        {fun JZLANG('分组名')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"name\" name=\"name\" value=\"{$data['name']}\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t\n                <div class=\"layui-form-item layui-form-text\">\n                    <label class=\"layui-form-label\">\n                        {fun JZLANG('拥有权限')} <span class=\"x-red\">{fun JZLANG('选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块')}</span>\n                    </label>\n                    <table  class=\"layui-table layui-input-block\">\n                        <tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th>\n                                   {fun JZLANG('主模块')}\n                                </th>\n                                <th>\n                                   {fun JZLANG('子模块')}\n                                </div>\n                                </th>\n                            </tr>\n\t\t\t\t\t\t{foreach $ruler_top as $v}\n                            <tr>\n                                <td>\n                                    <input type=\"checkbox\" name=\"ruler[]\" lay-skin=\"primary\" value=\"{$v['action']}\" title=\"{$v['name']}\" {if(strpos($data[\"paction\"],','.$v[\"action\"].',')!==false)}checked{/if}>\n                                </td>\n                                <td>\n                                    <div class=\"layui-input-block\">\n\t\t\t\t\t\t\t\t\t{if(isset($ruler_children[$v['id']]))}\n\t\t\t\t\t\t\t\t\t{foreach $ruler_children[$v['id']] as $vv}\n                                        <input name=\"ruler[]\" lay-skin=\"primary\" type=\"checkbox\" title=\"{$vv['name']}\" value=\"{$vv['action']}\" {if(strpos($data[\"paction\"],','.$vv[\"action\"].',')!==false)}checked{/if}> \n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t{/if}\n                                        \n                                    </div>\n                                </td>\n                            </tr>\n\t\t\t\t\t\t{/foreach}\n                           \n                        </tbody>\n                    </table>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"discount_type\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('折扣类型')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"discount_type\" lay-filter=\"discount_type\" id=\"discount_type\" >\n\t\t\t\t\t\t<option {if($data['discount_type']==0)}selected{/if} value=\"0\">{fun JZLANG('无折扣')}</option>\n\t\t\t\t\t    <option {if($data['discount_type']==1)}selected{/if} value=\"1\">{fun JZLANG('现金折扣')}</option>\n\t\t\t\t\t    <option {if($data['discount_type']==2)}selected{/if} value=\"2\">{fun JZLANG('百分比折扣')}</option>\n\t\t\t\t\t    </select>\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"discount\" class=\"layui-form-label\">\n                        {fun JZLANG('折扣金额')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" value=\"{$data['discount']}\" id=\"discount\" name=\"discount\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效')}\n\t\t\t\t\t</div>\n                </div>\n\t\t\t\t\n                <div class=\"layui-form-item layui-form-text\">\n                    <label for=\"description\" class=\"layui-form-label\">\n                        {fun JZLANG('描述')}\n                    </label>\n                    <div class=\"layui-input-block\">\n                        <textarea placeholder=\"{fun JZLANG('请输入内容')}\" id=\"description\" name=\"description\" class=\"layui-textarea\">{$data['description']}</textarea>\n                    </div>\n                </div>\n            <span id=\"content_fields\"></span>\n            <span id=\"ext_fields\"></span>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isagree\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('登录状态')}\n                    </label>\n                    <div class=\"layui-input-block\">\n                        <input type=\"radio\" name=\"isagree\" value=\"0\" title=\"{fun JZLANG('封禁')}\" {if($data['isagree']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isagree\" value=\"1\" title=\"{fun JZLANG('正常')}\" {if($data['isagree']==1)}checked{/if}>\n\t\t\t\t\t\t\n                    </div>\n\t\t\t\t\t\n\t\t\t\t\t\n                </div>\n\t\t\t\t\n                <div class=\"layui-form-item\" style=\"text-align:center\"> \n                <button class=\"layui-btn\" lay-submit=\"\" lay-filter=\"save\">{fun JZLANG('修改')}</button>\n              </div>\n            </form>\n\t\t\t</div>\n\t\t\t</div>\n    </div>\n    <script>\n        {include=\"fields\"}\n        layui.use(['form','layer'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n          form.render();\n          \n\n          //监听提交\n          form.on('submit(save)', function(data){\n            $.post(\"{fun U('Member/groupedit')}\",data.field,function(r){\n\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\tif(r.code==0){\n\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t window.location.href=\"{fun U('Member/membergroup')}\";\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n            return false;\n          });\n            get_fields(0,{$data['id']});\n            get_fields_ext(0,{$data['id']});\n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/membergroup-list.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a href=\"/\">{fun JZLANG('首页')}</a>\n        <a >{fun JZLANG('会员管理')}</a>\n        <a><cite>{fun JZLANG('会员分组')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n      \n\t  \t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t <xblock>\n       {if(checkAction('Member/groupadd'))}\n        <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('添加分组')}','{fun U('Member/groupadd')}')\">{fun JZLANG('添加分组')}</a>\n\t   {/if}\n         {if($webconf['isopenhomepower']==0)}<a class=\"layui-btn layui-btn-sm\">{fun JZLANG('温馨提示：前台权限已关闭，设置权限不会生效。')}</a>{else}<a class=\"layui-btn layui-btn-sm layui-btn-danger\">{fun JZLANG('温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！')}</a>{/if}\n      </xblock>\n      <table class=\"layui-table layui-form\">\n        <thead>\n          <tr>\n           \n            <th>ID</th>\n\t\t\t<th width=\"50\">{fun JZLANG('排序')}</th>\n            <th>{fun JZLANG('分组名')}</th>\n            <th>{fun JZLANG('描述')}</th>\n              {foreach $fields_list as $v}\n              <th>{$v['fieldname']}</th>\n              {/foreach}\n            <th>{fun JZLANG('状态')}</th>\n            <th>{fun JZLANG('操作')}</th>\n        </thead>\n        <tbody class=\"x-cate\">\n\t\t\n\t\t{foreach $lists as $v}\n          <tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\" >\n            <td>{$v['id']}</td>\n\t\t\t<td><input type=\"text\" class=\"layui-input x-sort\"  name=\"order\" value=\"{$v['orders']}\"></td>\n            <td>\n\t\t\t  {fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n\t\t\t  {if($v['haschild'])}\n\t\t\t  <i class=\"layui-icon x-show\" status='false'>&#xe625;</i>\n\t\t\t  {else}\n\t\t\t  {if($v['level'])}|——{/if}\n\t\t\t  {/if}\n\t\t\t  {$v['name']}\n            </td>\n\t\t\t <td>{$v['description']}</td>\n              {foreach $fields_list as $vv}\n              <td>{$v[$vv['field']]}</td>\n              {/foreach}\n\t\t\t <td class=\"td-status\">\n\t\t\t {if(checkAction('Member/change_group_status'))}\n             <input type=\"checkbox\" value=\"{$v['id']}\" name=\"switch\" lay-filter=\"status\"   lay-text=\"{fun JZLANG('正常|封禁')}\"  lay-skin=\"switch\" {if($v['isagree']==1)}checked{/if}>\n\t\t\t {else}\n\t\t\t\t{if($v['isagree']==1)}\n\t\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('正常')}</span>\n\t\t\t\t{else}\n\t\t\t\t<span class=\"layui-badge\">{fun JZLANG('封禁')}</span>\n\t\t\t\t{/if}\n\t\t\t {/if}\n\t\t\t </td>\n\t\t\t\n           \n            <td class=\"td-manage\">\n\t\t\t {if(checkAction('Member/groupedit'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Member/groupedit',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t {/if}\n\t\t\t {if(checkAction('Member/group_del'))}\n              <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"member_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t {/if}\n            </td>\n          </tr>\n\t\t {/foreach}\n\t\t\n\t\t\n\t\t \n        </tbody>\n      </table>\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t  \n     \n     \n\n    </div>\n\n\t<script>\n      layui.use(['laydate','form'], function(){\n        var laydate = layui.laydate;\n        var form = layui.form;\n       \n\t\tform.on('switch(status)', function (data) {\n\t\t\t$.post(\"{fun U('change_group_status')}\",{id:data.elem.value},function(r){ });\n\t\t});\n      });\n\n    $(document).ready(function(){\n\t\t$(\".x-sort\").change(function(){\n\t\t\t//alert($(this).val());\n\t\t\tvar id = $(this).parent().parent().attr('cate-id');\n\t\t\tvar order = $(this).val();\n\t\t\n\t\t\t$.post(\"{fun U('Member/editOrders')}\",{id:id,orders:order},function(r){\n\t\t\t\twindow.location.reload();\n\t\t\t});\n\t\t\n\t\t})\n\t});\n\n      /*用户-删除*/\n      function member_del(obj,id){\n          layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n              //发异步删除数据\n\t\t\t  \n\t\t\t  $.post(\"{fun U('group_del')}\",{id:id},function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('已删除!')}',{icon:1,time:1000});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg(r.msg,{icon:5,time:1000});\n\t\t\t\t\t}\n\t\t\t\t \n\t\t\t  });\n\t\t\t  \n             \n          });\n      }\n\n\n\n    </script>\n   \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/menu.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a>{fun JZLANG('首页')}</a>\n        <a><cite>{fun JZLANG('导航管理')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\n\t<div class=\"layui-card\">\n\t\t<div class=\"layui-card-body\">\n\t\t<form class=\"layui-form\" action=\"\">\n\t\t<xblock>\n\t\t<div class=\"layui-form-item\">\n\t    \n        {if(checkAction('index/addmenu'))}\t\n\t\t<div class=\"layui-input-inline\"  style=\"width:auto;\">\n\t\t<a class=\"layui-btn layui-btn-sm\"  onclick=\"x_admin_show('{fun JZLANG('新增导航')}','{fun U('index/addmenu')}')\" >{fun JZLANG('新增导航')}</a>\n\t\t</div>\n\t\t{/if}\n\n\t\t</div>\n\t\t\n\t\t</xblock>\n      \n        <table border=\"1\" rules=\"all\" style=\"width:100%; height:100px;\" class=\"layui-table layui-form\">\n        <thead>\n          <tr>\n            <th width=\"70\">ID</th>\n            <th >{fun JZLANG('导航名称')}</th>\n            <th >{fun JZLANG('导航菜单')}</th>\n            <th >{fun JZLANG('显示')}</th>\n            <th >{fun JZLANG('操作')}</th>\n        </thead>\n        <tbody class=\"x-cate\">\n\t\t{foreach $lists as $v}\n          <tr >\n\t\t    <td>\n\t\t\t{$v['id']}\n\t\t\t</td>\n            <td>{$v['name']}</td>\n\t\t\t<td>\n\t\t\t{php \n\t\t\t$nav = unserialize($v['nav']);\n\t\t\t/}\n\t\t\t{foreach $nav as $vv}\n\t\t\t{if($vv['tid'])}\n\t\t\t<a class=\"layui-btn {if($vv['status']!=1)}layui-btn-disabled{/if} layui-btn-xs\" href=\"{$classtypedata[$vv['tid']]['url']}\" target=\"_blank\" >{if($vv['title'])}{$vv['title']}{else}{$classtypedata[$vv['tid']]['classname']}{/if}</a>\n\t\t\t{else}\n\t\t\t<a class=\"layui-btn {if($vv['status']!=1)}layui-btn-disabled{/if} layui-btn-xs\" href=\"{$vv['gourl']}\" target=\"_blank\" >{$vv['title']}</a>\n\t\t\t{/if}\n\t\t\t{/foreach}\n\t\t\t</td>\n            <td>\n\t\t\t{if($v['isshow']==1)}<span class=\"layui-badge layui-bg-green\">{fun JZLANG('显示')}</span>{else}<span class=\"layui-badge\">{fun JZLANG('隐藏')}</span>{/if}\n\t\t\t</td>\n            \n\t\t\t\n            <td class=\"td-manage\" style=\"width: 90px;\">\n\t\t\t{if(checkAction('index/editmenu'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('index/editmenu',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t{/if}\n\t\t\t{if(checkAction('index/delmenu'))}\n              <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"menu_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t{/if}\n            </td>\n\n\n          </tr>\n\t\t {/foreach}\n         \n        </tbody>\n\t\t</table>\n \n\t\t</form>\n\t\t\n\t\t</div>\n\n\t</div>\n    </div>\n\n    <script>\n      layui.use(['form'], function(){\n        form = layui.form;\n\n\t\t\n      });\n\t\t\n      function menu_del(obj,id){\n          layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n              //发异步删除数据\n\t\t\t  $.post('{fun U('index/delmenu')}',{id:id},function(r){\n\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('删除成功！')}', {\n\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t $(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('已删除!')}',{icon:1,time:1000});\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\n\t\t\t  });\n\t\t\n\t\t\t  \n\t\t\t  \n              \n          });\n      }\n\n\n\n     \n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/message-details.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t{include=\"edit\"}\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('留言管理')}</cite></a>\n             \n\t\t\t  <a><cite>{fun JZLANG('查看留言')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form  layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\t{if($molds['isclasstype']==1)}\n\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t<label for=\"tid\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('栏目')}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" lay-filter=\"tid\" {if($molds['ismust']==1)}lay-verify=\"required\"{/if} id=\"tid\" >\n\t\t\t\t\t\t\t{if($molds['ismust']==1)}\n\t\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{foreach $classtypes as $v}\n\t\t\t\t\t\t\t{if($v['molds']=='message')}\n\t\t\t\t\t\t\t{if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t\t\t\t\t<option {if($data['tid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/foreach}\n\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</div>\n\t\t\t\t\t{else}\n\t\t\t\t\t<input type=\"hidden\" name=\"tid\" value=\"{$data['tid']}\" />\n\t\t\t\t\t{/if}\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t\t</div>\n               \n                <div class=\"layui-form-item\" style=\"text-align:center;\">\n                   \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('修改保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form,layer = layui.layer,laydate = layui.laydate;\n\t\t\t  var upload = layui.upload;\n\t\t\t laydate.render({\n\t\t\t\telem: '#addtime', //指定元素\n\t\t\t\ttype:'datetime'\n\t\t\t  });\n\t\t\t\n              //图片上传接口\n              upload.render({\n\t\t\t    elem: '#LAY_demo_upload',\n                url: '{fun U('Common/uploads')}' //上传接口\n                ,done: function(res){ //上传成功后的回调\n                   // console.log(res);\n\t\t\t\t\t\n\t\t\t\t\tif(res.code==0){\n\t\t\t\t\t\t $('#fileimg').attr('src',res.url);\n\t\t\t\t\t\t $('#litpic').val(res.url);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t layer.alert(res.error, {icon: 5});\n\t\t\t\t\t}\n                 \n                }\n              });\n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                //console.log(data);\n                //发异步，把数据提交给php\n\t\t\t\t$.post(\"{fun U('editmessage')}\",data.field,function(r){\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t window.location.href=\"{fun U('messagelist')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            get_fields({$data['tid']},{$data['id']});\n            get_fields_ext({$data['tid']},{$data['id']});\n\t\t\t\tform.on('select(tid)', function(data){\n\t\t\t\t \n\t\t\t\t  get_fields(data.value,{$data['id']}); \n\t\t\t\t  get_fields_ext(data.value,{$data['id']});\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t});\n\t\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/message-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('留言管理')}</cite></a>\n              <a><cite>{fun JZLANG('留言列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t\n\t\t\t  <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t\n\t\t\t\t\t  {$fields_search}\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t\n\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n       \n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t{if(checkAction('Message/editmessage'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs\" lay-event=\"edit\">{fun JZLANG('编辑')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Message/deletemessage'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t {if(checkAction('Message/deleteAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-danger layui-btn-sm\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}   \n\t\t\t\n\t\t {if(checkAction('Message/checkAll'))}\t\n\t\t  <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;width:150px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_isshow\"  lay-filter=\"change_isshow\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量审核')}</option>\n\t\t\t   <option   value=\"1\">{fun JZLANG('审核')}</option>\n\t\t\t   <option   value=\"2\">{fun JZLANG('未审核')}</option>\n\t\t\t  \n\t\t\t   </select>\n\t\t\t   </div>\n\t\t  {/if}\n\t\t\t<a class=\"layui-btn layui-btn-warm layui-btn-sm\" title=\"{fun JZLANG('设置')}\" onclick=\"x_admin_show('{fun JZLANG('列表字段设置')}','{fun U('Fields/fieldsList',['molds'=>'message'])}')\"><i class=\"iconfont\">&#xe6ae;</i></a>\n\t\t </div>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"isshow\">\n\t\t\t{{#  if(d.isshow ==1){ }}\n\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('已审核')}</span>\n\t\t    {{#  } else{ }}\n\t\t    <span class=\"layui-badge\">{fun JZLANG('未审核')}</span>\n\t\t    {{#  } }}\n\t\t</script>\n\t \n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  \n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,cellMinWidth: 80\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '{fun JZLANG('首页')}' //不显示首页\n\t\t\t\t  ,last: '{fun JZLANG('尾页')}' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  {foreach $fields_list as $k=>$v},{field: '{$v['field']}', title: '{$v['fieldname']}'}{/foreach}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:160, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('编辑')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t    \n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Message/deletemessage')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t\t\t\n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t\n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tform.on('select(change_isshow)', function(data){\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar isshow = parseInt(data.value);\n\t\t\t\t\tif(isshow==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核选项！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(isshow==1){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('已审核')}';\n\t\t\t\t\t}else if(isshow==2){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('未审核')}';\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量处理吗？')}['+datas+']=>['+tip+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Message/checkAll')}\",{data:datas,isshow:isshow},function(r){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量处理成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\t\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t   \n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Message/deleteAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t \n\t\t\t  \n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/molds-add.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<style>\n\t\t.layui-form-pane .layui-form-label {\n\t\t\twidth: 150px;\n\t\t\t}\n\t\t.layui-form-pane .layui-form-item[pane] .layui-input-inline {\n\t\t\tmargin-left: 150px;\n\t\t}\n\t\t</style>\n\t\t\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('模型管理')}</cite></a>\n\t\t\t  <a><cite>{fun JZLANG('新增模型')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\n                 <div class=\"layui-form-item \">\n                    <label for=\"name\" class=\"layui-form-label\">\n                        {fun JZLANG('模型名称')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"name\"   name=\"name\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"biaoshi\" class=\"layui-form-label\">\n                        {fun JZLANG('模型标识')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"biaoshi\"    name=\"biaoshi\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名')}\n\t\t\t\t    </div>\n                </div>\n\t\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"ismust\" class=\"layui-form-label\">\n                        {fun JZLANG('是否必选栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"ismust\" value=\"0\" title=\"{fun JZLANG('否')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"ismust\" value=\"1\" title=\"{fun JZLANG('是')}\" checked>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('新增修改内容时必选')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"isclasstype\" class=\"layui-form-label\">\n                        {fun JZLANG('是否显示栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isclasstype\" value=\"0\" title=\"{fun JZLANG('否')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isclasstype\" value=\"1\" title=\"{fun JZLANG('是')}\" checked>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('列表展示、录入内容、修改内容三个页面是否展示栏目')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"iscontrol\" class=\"layui-form-label\">\n                        {fun JZLANG('是否受权限控制')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"iscontrol\" value=\"0\" title=\"{fun JZLANG('否')}\" checked>\n\t\t\t\t\t\t<input type=\"radio\" name=\"iscontrol\" value=\"1\" title=\"{fun JZLANG('是')}\" >\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('不同角色可以通过控制栏目权限来限制查看内容')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshowclass\" class=\"layui-form-label\">\n                        {fun JZLANG('栏目绑定显示')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isshowclass\" value=\"0\" title=\"{fun JZLANG('否')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"isshowclass\" value=\"1\" title=\"{fun JZLANG('是')}\" checked>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('栏目绑定时是否显示该模型')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"ishome\" class=\"layui-form-label\">\n                        {fun JZLANG('前台发布')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"ishome\" value=\"0\" title=\"{fun JZLANG('否')}\">\n\t\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"1\" title=\"{fun JZLANG('是')}\" checked>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('前台是否允许发布')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"list_html\" class=\"layui-form-label\">\n                        {fun JZLANG('列表模板')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"list_html\" value=\"lists.html\"    name=\"list_html\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('默认列表模板')}\n\t\t\t\t    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"details_html\" class=\"layui-form-label\">\n                        {fun JZLANG('详情模板')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"details_html\" value=\"details.html\"    name=\"details_html\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('默认详情模板')}\n\t\t\t\t    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isopen\" class=\"layui-form-label\">\n                        {fun JZLANG('是否开启')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isopen\" value=\"0\" title=\"{fun JZLANG('否')}\" >\n\t\t\t\t\t\t<input type=\"radio\" name=\"isopen\" value=\"1\" title=\"{fun JZLANG('是')}\" checked>\n                    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"orders\" class=\"layui-form-label\">\n                        {fun JZLANG('排序')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"orders\" value=\"100\"    name=\"orders\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('数值越小越靠前')}\n\t\t\t\t    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"hastable\" class=\"layui-form-label\">\n                        {fun JZLANG('已有表')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"hastable\" value=\"0\" title=\"{fun JZLANG('否')}\" checked>\n\t\t\t\t\t\t<input type=\"radio\" name=\"hastable\" value=\"1\" title=\"{fun JZLANG('是')}\" >\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"hastable\" class=\"layui-form-label\">\n                        {fun JZLANG('是否可以预览')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"ispreview\" value=\"0\" title=\"{fun JZLANG('否')}\" >\n\t\t\t\t\t\t<input type=\"radio\" name=\"ispreview\" value=\"1\" title=\"{fun JZLANG('是')}\" checked>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n                \n                <div class=\"layui-form-item\" style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t\n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                //console.log(data);\n                //发异步，把数据提交给php\n\t\t\t\t$.post(\"{fun U('Molds/addMolds')}\",data.field,function(r){\n\t\t\t\t\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t window.location.href=\"{fun U('Molds/index')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t parent.location.reload();\n\t\t\t\t\t\t     parent.layer.close(index);\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t   \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            \n\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/molds-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<style>\n\t\t.layui-form-pane .layui-form-label {\n\t\t\twidth: 150px;\n\t\t\t}\n\t\t.layui-form-pane .layui-form-item[pane] .layui-input-inline {\n\t\t\tmargin-left: 150px;\n\t\t}\n\t\t</style>\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('模型管理')}</cite></a>\n              <a><cite>{fun JZLANG('修改模型')}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" >\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t<input type=\"hidden\" name=\"sys\" value=\"{$data['sys']}\" />\n\t\t\t\n\t\t\t\n\t\t\t\n                <div class=\"layui-form-item\">\n                    <label for=\"name\" class=\"layui-form-label\">\n                        {fun JZLANG('模型名称')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"name\" value=\"{$data['name']}\"   name=\"name\" required=\"\" lay-verify=\"required\"\n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\">\n                    <label for=\"biaoshi\" class=\"layui-form-label\">\n                        {fun JZLANG('模型标识')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"biaoshi\" value=\"{$data['biaoshi']}\"   name=\"biaoshi\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名')}\n\t\t\t\t    </div>\n                </div>\n\t\t\t\t\n\t\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"ismust\" class=\"layui-form-label\">\n                        {fun JZLANG('是否必选栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"ismust\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['ismust']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"ismust\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['ismust']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('新增修改内容时必选')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"isclasstype\" class=\"layui-form-label\">\n                        {fun JZLANG('是否显示栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isclasstype\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['isclasstype']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isclasstype\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['isclasstype']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('列表展示、录入内容、修改内容三个页面是否展示栏目')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t <div class=\"layui-form-item\" pane>\n                    <label for=\"iscontrol\" class=\"layui-form-label\">\n                        {fun JZLANG('是否受权限控制')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"iscontrol\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['iscontrol']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"iscontrol\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['iscontrol']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('不同角色可以通过控制栏目权限来限制查看内容')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isshowclass\" class=\"layui-form-label\">\n                        {fun JZLANG('栏目绑定显示')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\n\t\t\t\t\t<input type=\"radio\" name=\"isshowclass\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['isshowclass']==0)}checked{/if}>\n\t\t\t\t\t<input type=\"radio\" name=\"isshowclass\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['isshowclass']==1)}checked{/if}>\n\t\t\t\t\t\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('栏目绑定时是否显示该模型')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"ishome\" class=\"layui-form-label\">\n                        {fun JZLANG('前台发布')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\n\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['ishome']==0)}checked{/if}>\n\t\t\t\t\t<input type=\"radio\" name=\"ishome\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['ishome']==1)}checked{/if}>\n\t\t\t\t\t\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  \n\t\t\t\t\t  {fun JZLANG('前台是否允许发布')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div> \n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"list_html\" class=\"layui-form-label\">\n                        {fun JZLANG('列表模板')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"list_html\" value=\"{$data['list_html']}\"    name=\"list_html\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('默认列表模板')}\n\t\t\t\t    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"details_html\" class=\"layui-form-label\">\n                        {fun JZLANG('详情模板')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"details_html\" value=\"{$data['details_html']}\"    name=\"details_html\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('默认详情模板')}\n\t\t\t\t    </div>\n                </div>\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"isopen\" class=\"layui-form-label\">\n                        {fun JZLANG('是否开启')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"isopen\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['isopen']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"isopen\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['isopen']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t \n                </div>\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"orders\" class=\"layui-form-label\">\n                        {fun JZLANG('排序')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"text\" id=\"orders\" value=\"{$data['orders']}\"    name=\"orders\" \n                        autocomplete=\"off\" class=\"layui-input\">\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('数值越小越靠前')}\n\t\t\t\t    </div>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" pane>\n                    <label for=\"hastable\" class=\"layui-form-label\">\n                        {fun JZLANG('是否可以预览')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"ispreview\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['ispreview']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"ispreview\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['ispreview']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t  {fun JZLANG('如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]')}\n\t\t\t\t    </div>\n\t\t\t\t\t\n                 </div>\n\t\t\t\t\n                <div class=\"layui-form-item\" style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\n             \n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                //console.log(data);\n                //发异步，把数据提交给php\n\t\t\t\t$.post(\"{fun U('Molds/editMolds')}\",data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t layer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t window.location.href=\"{fun U('Molds/index')}\";\n\t\t\t\t\t\t\t{else}\n                             parent.layer.closeAll();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            \n\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/molds-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('模型管理')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        \n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t<xblock>\n\t\t   {if(checkAction('Molds/addMolds'))}\n\t\t   <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增模型')}','{fun U('Molds/addMolds')}')\">{fun JZLANG('新增模型')}</a>\n\t\t   {/if}\n\t\t   <span class=\"x-right\" style=\"line-height:40px\">{fun JZLANG('共有数据：')}{$sum} {fun JZLANG('条')}</span>\n\t\t  </xblock>\n            <table class=\"layui-table\">\n                <thead>\n                    <tr>\n                        \n                        <th>\n                            ID\n                        </th>\n                        <th>\n                            {fun JZLANG('排序')}\n                        </th>\n                        <th>\n                            {fun JZLANG('模型名称')}\n                        </th>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('模型标识')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('前台发布')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('模型状态')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('模型分类')}\n                        </th>\n                        <th>\n                            {fun JZLANG('操作')}\n                        </th>\n                    </tr>\n                </thead>\n                <tbody id=\"x-link\">\n\t\t\t\t  {foreach $lists as $v}\n                    <tr>\n                     \n                        <td>\n                            {$v['id']}\n                        </td>\n                        <td>\n                            {$v['orders']}\n                        </td>\n                        <td>\n                            {fun JZLANG($v['name'])}\n                        </td>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<td>\n                           {$v['biaoshi']}\n                        </td>\n\t\t\t\t\t\t<td>\n                            {if($v['ishome']==0)}\n                            <span class=\"layui-badge layui-bg-gray\">{fun JZLANG('隐藏')}</span>\n\t\t\t\t\t\t\t{else}\n                            <span class=\"layui-badge layui-bg-green\">{fun JZLANG('允许')}</span>\n\t\t\t\t\t\t\t{/if}\n              \n                        </td>\n\t\t\t\t\t\t <td>\n                            {if($v['isopen']==0)}\n                            <span class=\"layui-badge layui-bg-gray\">{fun JZLANG('已停用')}</span>\n\t\t\t\t\t\t\t{else}\n                            <span class=\"layui-badge layui-bg-green\">{fun JZLANG('已启用')}</span>\n\t\t\t\t\t\t\t{/if}\n              \n                        </td>\n\t\t\t\t\t\t<td class=\"td-status\" >\n\t\t\t\t\t\t{if($v['sys']==1)}<span class=\"layui-badge layui-bg-gray\">{fun JZLANG('系统')}</span>{else}<span class=\"layui-badge layui-bg-orange\">{fun JZLANG('扩展')}</span>{/if}\n\t\t\t\t\t\t </td>\n\t\t\t\t\t\n                        <td class=\"td-manage\">\n                        \n\t\t\t\t\t\t\t{if(checkAction('Molds/editMolds'))}\n\t\t\t\t\t\t\t <a class=\"layui-btn layui-btn layui-btn-xs\"  onClick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Molds/editMolds',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if(checkAction('Fields/index'))}\n\t\t\t\t\t\t\t <a class=\"layui-btn layui-btn-warm layui-btn-xs\"  onClick=\"x_admin_show('{$v['name']}-{fun JZLANG('字段管理')}','{fun U('Fields/index',array('molds'=>$v['biaoshi']))}')\" >{fun JZLANG('字段管理')}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if(checkAction('Molds/deleteMolds'))}\n\t\t\t\t\t\t\t <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onClick=\"molds_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{if( (in_array($v['biaoshi'],['article','product']) || $v['sys']==0) && checkAction('Molds/restrucFields'))}\n\t\t\t\t\t\t\t<a class=\"layui-btn layui-btn layui-btn-xs\"  onClick=\"x_admin_show('{fun JZLANG('重构字段')}','{fun U('Molds/restrucFields',array('molds'=>$v['biaoshi']))}')\" >{fun JZLANG('重构字段')}</a>\n\t\t\t\t\t\t\t{/if}\n                        </td>\n\t\t\t\t\t\t\n                    </tr>\n\t\t\t\t\t{/foreach}\n                </tbody>\n            </table>\n\t\t\t\n            <div class=\"page\">\n\t\t\t\t{$pages}\n\t\t\t  </div>\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n          \n        </div>\n     \n       <script>\n\t  \n\t    layui.use(['laydate','element','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n              laydate = layui.laydate;//日期插件\n              lement = layui.element;//面包导航\n            //  laypage = layui.laypage;//分页\n              layer = layui.layer;//弹出层\n\n              //以上模块根据需要引入\n             \n             \n              \n            });\n\t\t /*删除*/\n            function molds_del(obj,id){\n                layer.confirm('{fun JZLANG('确认要删除吗？删除的同时将删除对应的表！')}',function(index){\n\t\t\t\t\n\t\t\t\t\t$.get(\"{fun U('deleteMolds')}?id=\"+id,{},function(s){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(s);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\tlayer.alert(r.msg, {icon: 1,time:1000},function () {\n\t\t\t\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n                   \n                });\n            }\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/order-details.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n  </head>\n  \n  <body>\n\t<div class=\"x-nav\">\n\t\t<span class=\"layui-breadcrumb\">\n\t\t  <a><cite>{fun JZLANG('首页')}</cite></a>\n\t\t  <a><cite>{fun JZLANG('订单列表')}</cite></a>\n\t\t \n\t\t  <a><cite>{fun JZLANG('订单详情')}</cite></a>\n\t\t</span>\n\t\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n\t</div>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\" >\n\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n          <div class=\"layui-form-item\">\n              <label for=\"orderno\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('订单号')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"orderno\" value=\"{$data['orderno']}\" name=\"orderno\" \n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n          </div>\n\t\t  <input name=\"tid\" value=\"{$data['tid']}\" type=\"hidden\">\n\t\t  <div class=\"layui-form-item\">\n           <label for=\"tid\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('所属栏目')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"tids\" name=\"tids\" value=\"{if($data['tid'])}{$classtypedata[$data['tid']]['classname']}{else}无{/if}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"username\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('姓名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"username\" value=\"{$data['username']}\" name=\"username\" \n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"tel\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('手机')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"tel\" name=\"tel\" value=\"{$data['tel']}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n          </div>\n\t\t    <div class=\"layui-form-item\">\n              <label for=\"price\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('金额')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"price\" name=\"price\" value=\"{$data['price']}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n          </div>\n\t\t   <div class=\"layui-form-item\">\n              <label for=\"jifen\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('积分')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"jifen\" name=\"jifen\" value=\"{$data['jifen']}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"ispay\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('是否支付')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <select name=\"ispay\">\n                    <option value=\"1\" {if($data['ispay']==1)}selected{/if}>{fun JZLANG('已支付')}</option>\n                    <option value=\"0\" {if($data['ispay']==0)}selected{/if}>{fun JZLANG('未支付')}</option>\n                    \n                  </select>\n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"paytime\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('支付时间')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"paytime\" name=\"paytime\" value=\"{if($data['paytime']==0)}-{else}{fun date('Y-m-d H:i:s',$data['paytime'])}{/if}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  <span class=\"x-red\"></span>\n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"addtime\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('提交时间')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"addtime\" name=\"addtime\" value=\"{fun date('Y-m-d H:i:s',$data['addtime'])}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  <span class=\"x-red\"></span>\n              </div>\n          </div>\n\t\t  {if($admin['gid']==1)}\n          <div class=\"layui-form-item layui-form-text\">\n              <label for=\"body\" class=\"layui-form-label\">\n                 {fun JZLANG('存储内容')}\n              </label>\n              <div class=\"layui-input-block\">\n                  <textarea placeholder=\"{fun JZLANG('请输入内容')}\" id=\"body\" name=\"body\" class=\"layui-textarea\">{$data['body']}</textarea>\n              </div>\n          </div>\n\t\t  {/if}\n\t\t   <div class=\"layui-form-item layui-form-text\">\n              <label for=\"desc\" class=\"layui-form-label\">\n                  {fun JZLANG('订单内容')}\n              </label>\n              <div class=\"layui-input-block\">\n                  <table class=\"layui-table\">\n                    <tbody>\n\t\t\t\t\t <tr>\n                        <td>{fun JZLANG('主图')}</div></td>\n                        <td>{fun JZLANG('商品')}</div></td>\n                        <td>{fun JZLANG('价格')}</div></td>\n                        <td>{fun JZLANG('购买数量')}</div></td>\n                        <td>{fun JZLANG('总价')}</td>\n                        \n                      </tr>\n\t\t\t\t\t{php $body = explode('||',$data['body'])/}\n\t\t\t\t\t\n\t\t\t\t\t<?php\t\t\t\t\t\n\t\t\t\t\t$new = [];\n\t\t\t\t\tforeach($body as $v){\n\t\t\t\t\t\tif($v!=''){\n\t\t\t\t\t\t\t$d = explode('-',$v);\n\t\t\t\t\t\t\t//兼容历史订单，可能出现栏目被删除的情况，防止报错\n\t\t\t\t\t\t\tif(isset($classtypedata[$d[0]])){\n\t\t\t\t\t\t\t\t$type = $classtypedata[$d[0]];//栏目\n\t\t\t\t\t\t\t\t$new[]=['info'=>M($type['molds'])->find(['id'=>$d[1]]),'num'=>$d[2],'price'=>$d[3],'tid'=>$d[0]];\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t$new[]=['info'=>false,'num'=>$d[2],'price'=>$d[3],'tid'=>$d[0]];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t\t{foreach $new as $v}\n\t\t\t\t\t{if($v['info'])}\n                      <tr>\n                        <td><img src=\"{$v['info']['litpic']}\" width=\"100px\" /></div></td>\n                        <td>{$v['info']['title']}</div></td>\n                        <td>{fun JZLANG('￥')}{$v['price']}{fun JZLANG('元')}</div></td>\n                        <td>{$v['num']}</div></td>\n                        <td>{fun JZLANG('￥')}{$v['price']*$v['num']}{fun JZLANG('元')}</td>\n                        \n                      </tr>\n\t\t\t\t\t{else}\n\t\t\t\t\t  <tr>\n                        <td>[{fun JZLANG('商品已删除')}]</div></td>\n                        <td>[{fun JZLANG('商品已删除')}]</div></td>\n                        <td>{fun JZLANG('￥')}{$v['price']}{fun JZLANG('元')}</div></td>\n                        <td>{$v['num']}</div></td>\n                        <td>{fun JZLANG('￥')}{$v['price']*$v['num']}{fun JZLANG('元')}</td>\n                        \n                      </tr>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{/foreach}\n\t\t\t\t\t<tr>\n                        <td>{fun JZLANG('收货信息：')}</div></td>\n                        <td colspan=\"4\">{fun JZLANG('收件人：')}{$data['receive_username']}{fun JZLANG('联系手机：')}{$data['receive_tel']}{fun JZLANG('联系邮箱：')}{$data['receive_email']}{fun JZLANG('收货地址：')}{$data['receive_address']}</div></td>\n                        \n                      </tr>\n\t\t\t\t\t<tr>\n                        <td>{fun JZLANG('折扣：')}</div></td>\n                        <td colspan=\"4\">-{fun JZLANG('￥')}{$data['discount']}{fun JZLANG('元')}</div></td>\n                        \n                      </tr>\n\t\t\t\t\t  <tr>\n                        <td>{fun JZLANG('运费：')}</div></td>\n                        <td colspan=\"4\">+{fun JZLANG('￥')}{$data['yunfei']}{fun JZLANG('元')}</div></td>\n                        \n                      </tr>\n                     <tr>\n                        <td>{fun JZLANG('合计：')}</div></td>\n                        <td colspan=\"4\">{fun JZLANG('￥')}{$data['price']-$data['discount']+$data['yunfei']}{fun JZLANG('元')}</div></td>\n                        \n                      </tr>\n                    </tbody>\n                  </table>\n              </div>\n          </div>\n\t\t  \n\t\t   <div class=\"layui-form-item\" pane>\n              <label for=\"isshow\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('订单状态')}\n              </label>\n\t\t\t  <!--1提交订单,2已支付,3超时,4待审核待支付,5已发货,6已废弃失效,0删除订单-->\n              <div class=\"layui-input-inline\">\n                 <input type=\"radio\" name=\"isshow\" value=\"0\" title=\"{fun JZLANG('订单已删除')}\" {if($data['isshow']==0)}checked{/if}>\n\t\t\t\t <input type=\"radio\" name=\"isshow\" value=\"1\" title=\"{fun JZLANG('已提交未支付')}\"  {if($data['isshow']==1)}checked{/if}>\n\t\t\t\t <input type=\"radio\" name=\"isshow\" value=\"2\" title=\"{fun JZLANG('已支付')}\"  {if($data['isshow']==2)}checked{/if}>\n\t\t\t\t <input type=\"radio\" name=\"isshow\" value=\"3\" title=\"{fun JZLANG('超时订单')}\"  {if($data['isshow']==3)}checked{/if}>\n\t\t\t\t <input type=\"radio\" name=\"isshow\" value=\"4\" title=\"{fun JZLANG('待审核待支付')}\"  {if($data['isshow']==4)}checked{/if}>\n\t\t\t\t <input type=\"radio\" name=\"isshow\" value=\"5\" title=\"{fun JZLANG('已发货')}\"  {if($data['isshow']==5)}checked{/if}>\n\t\t\t\t <input type=\"radio\" name=\"isshow\" value=\"6\" title=\"{fun JZLANG('已废弃')}\"  {if($data['isshow']==6)}checked{/if}>\n\t\t\t\t   \n              </div>\n\t\t\t  <div class=\"layui-form-mid layui-word-aux \">\n\t\t\t\t{fun JZLANG('订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件')}\n\t\t\t  </div>\n          </div>\n\t\t  <div class=\"layui-form-item\">\n              <label for=\"send_time\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('发货时间')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"send_time\" name=\"send_time\" value=\"{if($data['send_time']!=0)}{fun date('Y-m-d H:i:s',$data['send_time'])}{else}{fun date('Y-m-d H:i:s')}{/if}\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                  <span class=\"x-red\"></span>\n              </div>\n          </div>\n\n          <span id=\"content_fields\"></span>\n\t\t  \n\t\t  \n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n             \n              <button  class=\"layui-btn\" lay-filter=\"close\" lay-submit=\"\">\n                  {fun JZLANG('关闭')}\n              </button>\n\t\t\t   <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                  {fun JZLANG('确定修改')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\t\n\t{include=\"fields\"}\n\t\n        layui.use(['form','layer'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n        \n         \n\n          //监听提交\n          form.on('submit(close)', function(data){\n            // console.log(data);\n\t\t\t\n\t\t\t    var index = parent.layer.getFrameIndex(window.name);\n                //关闭当前frame\n               \n\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t window.location.href=\"{fun U('Order/index')}\";\n\t\t\t\t{else}\n                 parent.layer.close(index);\n\t\t\t\t{/if}\n            \n            return false;\n          });\n\t\t   get_fields({$data['tid']},{$data['id']});\n\t\t   form.on('select(tid)', function(data){\n\t\t\t \n\t\t\t  get_fields(data.value,{$data['id']});\n\t\t\t  \n\t\t\t  \n\t\t\t});\n\t\t\t\n\t\t     //监听提交\n           form.on('submit(save)', function(data){\n\n\t\t\t\t$.post(\"{fun U('Order/details')}\",data.field,function(r){\n\t\t\t\t//console.log(r);return false;\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.msg(r.msg, {icon: 6,time: 2000},function () {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t window.location.href=\"{fun U('Order/index')}\";\n\t\t\t\t\t\t\t{else}\n                             parent.layer.closeAll();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n          \n          \n        });\n    </script>\n   \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/order-list.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"UTF-8\">\n\t{include=\"style\"}\n</head>\n<body>\n<div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('订单管理')}</cite></a>\n              <a><cite>{fun JZLANG('订单列表')}</cite></a>\n              \n            </span>\n\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n</div>\n<div class=\"x-body\">\n\n\t<div class=\"layui-card\">\n\t\t<div class=\"layui-card-body\">\n\t\t\t<div class=\"layui-collapse\">\n\t\t\t\t<div class=\"layui-colla-item\">\n\t\t\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t\t<select name=\"isshow\" lay-filter=\"isshow\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择状态')}</option>\n\n\t\t\t\t\t\t\t\t\t\t<option {if($isshow==1)} selected=\"selected\" {/if}value=\"1\">{fun JZLANG('待付款')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($isshow==2)} selected=\"selected\" {/if}value=\"2\">{fun JZLANG('已付')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($isshow==3)} selected=\"selected\" {/if}value=\"3\">{fun JZLANG('超时')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($isshow==4)} selected=\"selected\" {/if}value=\"4\">{fun JZLANG('待审核待支付')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($isshow==5)} selected=\"selected\" {/if}value=\"5\">{fun JZLANG('已发货')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($isshow==6)} selected=\"selected\" {/if}value=\"6\">{fun JZLANG('已废弃')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($isshow==7)} selected=\"selected\" {/if}value=\"7\">{fun JZLANG('被删除')}</option>\n\n\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t\t<select name=\"paytype\" lay-filter=\"paytype\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t\t\t\t\t\t<option value=\"\">{fun JZLANG('支付方式')}</option>\n\n\t\t\t\t\t\t\t\t\t\t<option {if($paytype==JZLANG('线下支付'))} selected=\"selected\" {/if}value=\"{fun JZLANG('线下支付')}\">{fun JZLANG('线下支付')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($paytype==JZLANG('钱包支付'))} selected=\"selected\" {/if}value=\"{fun JZLANG('钱包支付')}\">{fun JZLANG('钱包支付')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($paytype==JZLANG('积分兑换'))} selected=\"selected\" {/if}value=\"{fun JZLANG('积分兑换')}\">{fun JZLANG('积分兑换')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($paytype==JZLANG('支付宝支付'))} selected=\"selected\" {/if}value=\"{fun JZLANG('支付宝支付')}\">{fun JZLANG('支付宝支付')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($paytype==JZLANG('微信支付'))} selected=\"selected\" {/if}value=\"{fun JZLANG('微信支付')}\">{fun JZLANG('微信支付')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($paytype==JZLANG('微信H5支付'))} selected=\"selected\" {/if}value=\"{fun JZLANG('微信H5支付')}\">{fun JZLANG('微信H5支付')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($paytype==JZLANG('微信扫码支付'))} selected=\"selected\" {/if}value=\"{fun JZLANG('微信扫码支付')}\">{fun JZLANG('微信扫码支付')}</option>\n\t\t\t\t\t\t\t\t\t\t<option {if($paytype==JZLANG('支付宝H5支付'))} selected=\"selected\" {/if}value=\"{fun JZLANG('支付宝H5支付')}\">{fun JZLANG('支付宝H5支付')}</option>\n\n\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<input class=\"layui-input\" value=\"{$starttime}\" placeholder=\"{fun JZLANG('开始日')}\" name=\"start\" id=\"start\">\n\t\t\t\t\t\t\t\t<input class=\"layui-input\" value=\"{$endtime}\" placeholder=\"{fun JZLANG('截止日')}\" name=\"end\" id=\"end\">\n\n\t\t\t\t\t\t\t\t<input type=\"text\" name=\"tel\"  style=\"width:200px\" placeholder=\"{fun JZLANG('请输入前台用户手机号')}\" value=\"{$tel}\" autocomplete=\"off\" class=\"layui-input\">\n\n\t\t\t\t\t\t\t\t<input type=\"text\" name=\"username\" style=\"width:200px\"   placeholder=\"{fun JZLANG('请输入用户昵称')}\"  value=\"{$username}\"  autocomplete=\"off\" class=\"layui-input\"><br/>\n\n\t\t\t\t\t\t\t\t<input type=\"text\" name=\"orderno\" style=\"width:200px\"   placeholder=\"{fun JZLANG('请输入订单号')}\"  value=\"{$orderno}\"  autocomplete=\"off\" class=\"layui-input\">\n\n\t\t\t\t\t\t\t\t{$fields_search}\n\t\t\t\t\t\t\t\t<button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t</div>\n\t</div>\n\n\n\t<script type=\"text/html\" id=\"rightbar\">\n\t\t{if(checkAction('Order/details'))}\n\t\t<a class=\"layui-btn layui-btn-xs\" lay-event=\"edit\">{fun JZLANG('查看')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Order/deleteorder'))}\n\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\n\n\t</script>\n\t<script type=\"text/html\" id=\"toolbar\">\n\t\t<div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t\t{if(checkAction('Order/deleteAll'))}\n\t\t\t<a class=\"layui-btn layui-btn-sm layui-btn-danger\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t\t{/if}\n\n\t\t\t<a class=\"layui-btn layui-btn-sm\">{fun JZLANG('总订单')}<span id=\"all_num\" class=\"layui-badge layui-bg-gray\"></span></a>\n\t\t\t<a class=\"layui-btn layui-btn-sm\">{fun JZLANG('已支付')}<span id=\"overpay_num\" class=\"layui-badge layui-bg-blue\"></span></a>\n\t\t\t<a class=\"layui-btn layui-btn-sm\">{fun JZLANG('未支付')}<span id=\"notpay_num\" class=\"layui-badge \"></span></a>\n\t\t\t<a class=\"layui-btn layui-btn-sm\">{fun JZLANG('总收入')}<span id=\"allmoney\" class=\"layui-badge layui-bg-orange\"></span></a>\n\n\t\t</div>\n\t</script>\n\t<script type=\"text/html\" id=\"ispay\">\n\t\t{{#  if(d.ispay ==1){ }}\n\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('已付')}</span>\n\t\t{{#  } else{ }}\n\t\t<span class=\"layui-badge\">{fun JZLANG('未付')}</span>\n\t\t{{#  } }}\n\t</script>\n\t<script type=\"text/html\" id=\"isshow\">\n\t\t{{#  if(d.isshow ==1){ }}\n\t\t<span class=\"layui-badge\">{fun JZLANG('待付款')}</span>\n\t\t{{#  } else if(d.isshow ==2){ }}\n\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('已付')}</span>\n\t\t{{#  } else if(d.isshow ==3){ }}\n\t\t<span class=\"layui-badge layui-bg-orange\">{fun JZLANG('超时')}</span>\n\t\t{{#  } else if(d.isshow ==4){ }}\n\t\t<span class=\"layui-badge\">{fun JZLANG('待审核待支付')}</span>\n\t\t{{#  } else if(d.isshow ==5){ }}\n\t\t<span class=\"layui-badge layui-bg-black\">{fun JZLANG('已发货')}</span>\n\t\t{{#  } else if(d.isshow ==6){ }}\n\t\t<span class=\"layui-badge layui-bg-gray\">{fun JZLANG('已废弃')}</span>\n\t\t{{#  } else{ }}\n\t\t<span class=\"layui-badge layui-bg-blue\">{fun JZLANG('被删除')}</span>\n\t\t{{#  } }}\n\t</script>\n\n\t<script>\n\n\n\t\tlayui.use(['laydate','form','element','laypage','layer','table'], function(){\n\t\t\t$ = layui.jquery;//jquery\n\t\t\tvar laydate = layui.laydate;//日期插件\n\t\t\tvar lement = layui.element;//面包导航\n\t\t\tvar layer = layui.layer;//弹出层\n\t\t\tvar form = layui.form;\n\t\t\tvar table = layui.table;\n\t\t\t//执行一个laydate实例\n\t\t\tlaydate.render({\n\t\t\t\telem: '#start' //指定元素\n\t\t\t});\n\n\t\t\t//执行一个laydate实例\n\t\t\tlaydate.render({\n\t\t\t\telem: '#end' //指定元素\n\t\t\t});\n\t\t\ttable.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t\tlayout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t\t//,curr: 5 //设定初始在第 5 页\n\t\t\t\t\t,groups: 5 //只显示 1 个连续页码\n\t\t\t\t\t,first: true //显示首页\n\t\t\t\t\t,last: true //显示尾页\n\t\t\t\t\t,count:500\n\t\t\t\t\t,limit:10\n\t\t\t\t\t,first: '{fun JZLANG('首页')}' //不显示首页\n\t\t\t\t\t,last: '{fun JZLANG('尾页')}' //不显示尾页\n\n\t\t\t\t}\n\t\t\t\t,done: function(res, curr, count){\n\t\t\t\t\t//如果是异步请求数据方式，res即为你接口返回的信息。\n\t\t\t\t\t//如果是直接赋值的方式，res即为：{data: [], count: 99} data为当前页数据、count为数据总长度\n\t\t\t\t\tconsole.log(res);\n\t\t\t\t\t$(\"#all_num\").html(res.all);\n\t\t\t\t\t$(\"#overpay_num\").html(res.overpay_num);\n\t\t\t\t\t$(\"#notpay_num\").html(res.notpay_num);\n\t\t\t\t\t$(\"#allmoney\").html(res.allmoney);\n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t\t{type:'checkbox'}\n\t\t\t\t\t,{field: 'id', title: 'ID', width:60}\n\t\t\t\t\t,{field: 'isshow', title: '{fun JZLANG('状态')}', width: 100, templet: '#isshow'}\n\t\t\t\t\t,{field: 'orderno', title: '{fun JZLANG('订单号')}'}\n\t\t\t\t\t,{field: 'paytype', title: '{fun JZLANG('付款方式')}'}\n\t\t\t\t\t,{field: 'username', title: '{fun JZLANG('用户昵称')}'}\n\t\t\t\t\t,{field: 'tel', title: '{fun JZLANG('手机号')}',width:150}\n\t\t\t\t\t,{field: 'price', title: '{fun JZLANG('金额')}',width:150}\n\t\t\t\t\t,{field: 'jifen', title: '{fun JZLANG('积分')}',width:150}\n\n\t\t\t\t\t{foreach $fields_list as $v},{field: '{$v['field']}', title: '{$v['fieldname']}'}{/foreach}\n\n\t\t\t\t\t,{field: 'ispay', title: '{fun JZLANG('是否付款')}', width: 100, templet: '#ispay'}\n\t\t\t\t\t,{field: 'new_paytime', title: '{fun JZLANG('付款时间')}',width:160}\n\t\t\t\t\t,{field: 'new_addtime', title: '{fun JZLANG('提交时间')}',width:160}\n\t\t\t\t\t,{field: '', title: '{fun JZLANG('操作')}',width:160, toolbar: '#rightbar', fixed:'right'}\n\n\t\t\t\t]]\n\t\t\t});\n\n\t\t\ttable.on('tool(jizhi_table)', function(obj){\n\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\n\t\t\t\tswitch(layEvent){\n\t\t\t\t\tcase 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\tx_admin_show('{fun JZLANG('查看')}',data.edit_url);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'view':\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\n\t\t\t\t\t\t$.post(\"{fun U('Order/deleteorder')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t//发异步删除数据\n\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\turl: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t,where: {} //设定异步数据接口的额外参数\n\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t});\n\n\n\n\t\t\t\t\t\t\t}else{\n\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\n\n\n\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'copy':\n\n\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttable.on('checkbox(jizhi_table)', function(obj){\n\n\t\t\t\tvar checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\tvar len = checkStatus.data.length;\n\t\t\t\tvar arr=[];\n\t\t\t\tif(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$(\"#select_data\").val(arr);\n\n\n\t\t\t});\n\n\n\n\t\t\tform.on('submit(search)', function(data){\n\n\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\turl: window.location.href+'?ajax=1'\n\t\t\t\t\t,where: data.field //设定异步数据接口的额外参数\n\n\t\t\t\t});\n\n\t\t\t\treturn false;\n\t\t\t});\n\n\n\n\n\n\t\t});\n\n\n\n\n\n\n\n\t\t\tfunction delAll () {\n\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\n\t\t\t\t\t$.post(\"{fun U('Order/deleteAll')}\",{data:data},function(r){\n\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t}else{\n\n\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\n\n\t\t\t\t});\n\t\t\t}\n\n\n\n\n\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/pictures.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('图库管理')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t<div class=\"layui-card\">\n\t\t  <div class=\"layui-card-body\">\n          <div class=\"layui-row\">\n\t\t\t<div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content layui-show\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"path\" lay-filter=\"path\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('筛选上传入口')}</option>\n\t\t\t\t\t   <option {if($path=='Admin')} selected=\"selected\" {/if}value=\"Admin\">{fun JZLANG('后台')}</option>\n\t\t\t\t\t   <option {if($path=='Home')} selected=\"selected\" {/if}value=\"Home\">{fun JZLANG('前台')}</option>\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"molds\" lay-filter=\"molds\" lay-search=\"\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t   <option value=\"\">{fun JZLANG('筛选模块')}</option>\n\t\t\t\t\t   <option value=\"other\" {if($molds=='other')} selected=\"selected\" {/if}>{fun JZLANG('其他杂项')}</option>\n\t\t\t\t\t   <option value=\"sysconfig\" {if($molds=='sysconfig')} selected=\"selected\" {/if}>{fun JZLANG('系统配置')}</option>\n\t\t\t\t\t   {loop table=\"molds\" orderby=\"id asc\" isopen=\"1\" as=\"v\"}\n\t\t\t\t\t   <option {if($molds==$v['biaoshi'])} selected=\"selected\" {/if}value=\"{$v['biaoshi']}\">{$v['name']}</option>\n\t\t\t\t\t   {/loop}\n\t\t\t\t\t  \n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"tid\" lay-filter=\"tid\" lay-search=\"\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('筛选栏目')}</option>\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t \n\t\t\t\t\t   <option {if($tid==$v['id'])} selected=\"selected\" {/if}value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t  \n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\"><i class=\"layui-icon\">&#xe615;</i></button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t  </div>\n          <xblock>\n\t\t  <a class=\"layui-btn layui-btn-danger layui-btn-sm\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t  \n\t\t\n\t\t   <span class=\"x-right\" style=\"line-height:40px\">{fun JZLANG('共有数据：')}{$sum} {fun JZLANG('条')}</span>\n\t\t  </xblock>\n          \n        <table border=\"1\" rules=\"all\" style=\"width:100%; height:100px; text-align:center;white-space:nowrap\" class=\"layui-table layui-form\">\n                <thead>\n                    <tr>\n                        <th>\n\t\t\t\t\t\t  <div class=\"layui-unselect header layui-form-checkbox\" lay-skin=\"primary\"><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t\t</th>\n                        <th>\n                            ID\n                        </th>\n                        <th>\n                            {fun JZLANG('上传前台')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('缩略图')}\n                        </th>\n                        <th>\n                            {fun JZLANG('所属栏目')}\n                        </th>\n                        <th>\n                            {fun JZLANG('所属模块')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('本地文件')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('文件大小')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('添加时间')}\n                        </th>\n\t\t\t\t\t\t\n                        <th>\n                            {fun JZLANG('操作')}\n                        </th>\n                    </tr>\n                </thead>\n                <tbody  class=\"x-cate\">\n\t\t\t\t  {foreach $lists as $v}\n                    <tr>\n                     <td>\n\t\t\t\t\t  <div class=\"layui-unselect layui-form-checkbox\" lay-skin=\"primary\" data-id='{$v['id']}'><i class=\"layui-icon\">&#xe605;</i></div>\n\t\t\t\t\t</td>\n                        <td>\n                            {$v['id']}\n                        </td>\n                        <td>\n                            {if($v['path']=='Home')}{fun JZLANG('前台')}{else}{fun JZLANG('后台')}{/if}\n                        </td>\n                        \n\t\t\t\t\t\t<td>\n                           {if(in_array($v['filetype'],['png','gif','jpg','jpeg']))}<img src=\"{$v['litpic']}\" width=\"100px\" />{else}{$v['filetype']}{/if}\n                        </td>\n                        <td>\n\t\t\t\t\t\t {if($v['tid']==0)}-{else}{$classtypedata[$v['tid']]['classname']}{/if}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t <td>\n\t\t\t\t\t\t {if($v['molds']=='' || empty($v['molds']))}{fun JZLANG('其他')}{else}{if($v['molds']=='sysconfig')}{fun JZLANG('系统配置')}{else}{fun get_info_table('molds',['biaoshi'=>$v['molds']],'name')}{/if}{/if}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t{$v['litpic']}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t{$v['size']} kb\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t<td>\n                            {fun date('Y-m-d H:i:s',$v['addtime'])} \n                        </td>\n                        <td class=\"td-manage\">\n\t\t\t\t\t\t\t<button class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"article_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</button>\n                        </td>\n\t\t\t\t\t\t\n                    </tr>\n\t\t\t\t\t{/foreach}\n                </tbody>\n            </table>\n\t\t \n            <div class=\"page\">\n\t\t\t\t{$pages}\n\t\t\t  </div>\n        </div>\n        </div>\n        </div>\n       <script>\n\t  \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n              laydate = layui.laydate;//日期插件\n              lement = layui.element;//面包导航\n              layer = layui.layer;//弹出层\n\t\t\t  form = layui.form;\n              //以上模块根据需要引入\n              form.on('select(tid)', function(data){\n\t\t\t\t$(\"#myform\").submit();\n\t\t\t  });\n\t\t\t  form.on('select(molds)', function(data){\n\t\t\t\t$(\"#myform\").submit();\n\t\t\t  });\n\t\t\t  form.on('select(path)', function(data){\n\t\t\t\t$(\"#myform\").submit();\n\t\t\t  });\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t  \n\t\t\t\n\t\t /*删除*/\n            function article_del(obj,id){\n                layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t$.get(\"{__APP_URL__}/Sys/deletePic/id/\"+id,{},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000});\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n                   \n                });\n            }\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\n\t\t\t\tvar data = tableCheck.getData();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.get(\"{__APP_URL__}/Sys/deletePicAll/data/\"+data,{},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1});\n\t\t\t\t\t\t\t  $(\".layui-form-checked\").not('.header').parents('tr').remove();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t\n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/plugins-list.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n   <style>\n\t.btn-jz{\n\t\tmargin-left:0px !important;\n\t}\n\tspan.jzspan {\n\t\twidth: 45px;\n\t}\n\n   </style>\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a href=\"/\">{fun JZLANG('首页')}</a>\n        <a >{fun JZLANG('插件管理')}</a>\n        <a><cite>{fun JZLANG('插件列表')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t\n\t\t\t  <div class=\"layui-row\">\n\t    <form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t    <a href=\"{fun U('plugins/index')}\" class=\"layui-btn layui-btn-primary\">{fun JZLANG('全部')}</a>\n\t\t<a href=\"{fun U('plugins/index',['isdown'=>1])}\" class=\"layui-btn  layui-btn-normal\">{fun JZLANG('本地')}</a>\n\t\t\n\t\t<input type=\"text\" name=\"title\" value=\"{$title}\" placeholder=\"{fun JZLANG('请输入插件名字')}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"sreach\"><i class=\"layui-icon\">&#xe615;</i></button>\n\t\t<a class=\"layui-btn layui-btn-warm layui-btn-sm\" style=\"float: right;\" title=\"{fun JZLANG('设置')}\" onclick=\"setconf()\"><i class=\"iconfont\">&#xe6ae;</i></a>\n\t\t</form>\n      </div>\n\t\t\n      \n\t\t\n        <table border=\"1\" rules=\"all\"  class=\"layui-table layui-form\">\n        <thead>\n          <tr>\n            \n            <th>{fun JZLANG('插件名')}</th>\n            <th>{fun JZLANG('版本')}</th>\n            <th >{fun JZLANG('作者')}</th>\n\t\t\t<th >{fun JZLANG('平台')}</th>\n            <th style=\"width:200px;\">{fun JZLANG('简介')}</th>\n            <th>{fun JZLANG('插件文件')}</th>\n            <th>{fun JZLANG('开关')}</th>\n            <th>{fun JZLANG('安装说明')}</th>\n            <th style=\"width:150px;\">{fun JZLANG('操作')}</th>\n        </thead>\n        <tbody>\n\t\t {foreach $lists as $v}\n          <tr>\n            <td>{$v['name']}</td>\n            <td>v{$v['version']}{if($v['isupdate'])}<span style=\"cursor:pointer;\" title=\"{fun JZLANG('点击查看')}\" onclick=\"x_all_show('{fun JZLANG('更新说明')}','{fun U('Plugins/update',array('filepath'=>$v['filepath']))}')\" class=\"layui-badge\">{fun JZLANG('新')}</span>{/if}</td>\n            <td>{$v['author']}</td>\n\t\t\t<td>{if($v['official']==1)}<span class=\"layui-badge layui-bg-green jzspan\">{fun JZLANG('官方')}</span>{else if($v['official']==2)}<span class=\"layui-badge layui-bg-orange jzspan\">{fun JZLANG('本地')}</span>{else}<span class=\"layui-badge layui-bg-orange jzspan\">{fun JZLANG('第三方')}</span>{/if}</td>\n            <td >{$v['description']}</td>\n\t\t\t\n            <td>{$v['filepath']}</td>\n           \n            <td class=\"td-status\">\n\t\t\t{if(checkAction('Plugins/change_status'))}\n\t\t\t\t{if($v['isinstall'])}\n\t\t\t\t<input type=\"checkbox\" value=\"{$v['filepath']}\" name=\"switch\" lay-filter=\"status\"   lay-text=\"{fun JZLANG('开|停')}\"  lay-skin=\"switch\" {if($v['isopen']==1)}checked{/if}>\n\t\t\t\t{else}\n\t\t\t\t-\n\t\t\t\t{/if}\n\t\t\t{else}\n\t\t\t\t-\n\t\t\t{/if}\n\t\t\t\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t{if(checkAction('Plugins/desc') && $v['exists'])}\n\t\t\t<button type=\"button\" onclick=\"x_all_show('{fun JZLANG('安装说明')}','{fun U('Plugins/desc',array('filepath'=>$v['filepath']))}')\" class=\"layui-btn  layui-btn-xs\">{fun JZLANG('安装说明')}</button>\n\t\t\t{else}\n\t\t\t-\n\t\t\t{/if}\n\t\t\t</td>\n            <td class=\"td-manage\">\n\t\t\t{if(checkAction('Plugins/action_do'))}\n\t\t\t\t{if($v['isinstall'])}\n\t\t\t\t<a onclick=\"x_all_show('{fun JZLANG('配置')}','{fun U('Plugins/setconf',array('id'=>$v['id']))}')\" class=\"layui-btn layui-btn-normal layui-btn-xs btn-jz\">{fun JZLANG('配置')}</a>\n\t\t\t\t<a href=\"{fun U('plugins/output',['filepath'=>$v['filepath']])}\" class=\"layui-btn btn-jz  layui-btn-xs\">{fun JZLANG('导出')}</a>\n\t\t\t\t<a onclick=\"actionDo('{$v['filepath']}',0)\" class=\"layui-btn layui-btn-warm btn-jz layui-btn-xs\">{fun JZLANG('卸载')}</a>\n\t\t\t\t<a onclick=\"actionDo('{$v['filepath']}',2)\" class=\"layui-btn layui-btn-danger  btn-jz layui-btn-xs\">{fun JZLANG('删除')}</a>\n\t\t\t\t\t\t\t\t\n\t\t\t\t{else if($v['exists'])}\n\t\t\t\t<a onclick=\"actionDo('{$v['filepath']}',1)\" class=\"layui-btn  layui-btn-xs\">{fun JZLANG('安装')}</a>\n\t\t\t\t<a onclick=\"actionDo('{$v['filepath']}',2)\" class=\"layui-btn layui-btn-danger  layui-btn-xs\">{fun JZLANG('删除')}</a>\n\t\t\t\t{else}\n\t\t\t\t<form class=\"layui-form\" action=\"\">\n\t\t\t\t<a lay-submit  lay-filter=\"down\" data-{$v['filepath']}-size=\"0\" data-{$v['filepath']}-url=\"{$v['downurl']}\" data=\"{$v['filepath']}\" id=\"{$v['filepath']}-downbutton\" class=\"layui-btn  layui-btn-xs layui-btn-warm\">{fun JZLANG('下载')}</a>\n\t\t\t\t<div class=\"layui-progress  layui-progress-big\"   id=\"{$v['filepath']}-down-action\" lay-showpercent=\"true\" lay-filter=\"demo-{$v['filepath']}-progress\" style=\"margin: 30px;display:none;\">\n\t\t\t\t  <div class=\"layui-progress-bar\" lay-percent=\"0%\"></div>\n\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t\t{/if}\n\t\t\t{else}\n\t\t\t-\n\t\t\t{/if}\n\t\t\t\n             \n              </a>\n            </td>\n          </tr>\n\t\t  {/foreach}\n        </tbody>\n      </table>\n\t  <div class=\"page\">\n\t\t{$pages}\n\t  </div>\n \n\t\t\t\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t\n\t\n     \n    </div>\n    <script>\n      layui.use(['laydate','form'], function(){\n        var laydate = layui.laydate;\n        var form = layui.form;\n       \n\t\tform.on('switch(status)', function (data) {\n\t\t\n\t\t\t$.post(\"{fun U('change_status')}\",{filepath:data.elem.value},function(r){});\n\t\t});\n\t\tform.on('submit(down)', function (data) {\n\t\t\tvar filepath = $(data.elem).attr('data');\n\t\t\tvar download_url = $(data.elem).attr('data-'+filepath+'-url');\n\t\t\t$(\"#\"+filepath+\"-downbutton\").hide();\n\t\t\t$(\"#\"+filepath+\"-down-action\").show();\n\t\t\tvar othis = $(\"#\"+filepath+\"-down-action\");\n          \tvar DISABLED = 'layui-btn-disabled';\n\t\t    if(othis.hasClass(DISABLED)) return;\n\t\t\t//获取文件大小\n\t\t\t$.ajax({\n\t\t\t\turl:\"{fun U('plugins/update')}\",\n\t\t\t\tdata:{action:'prepare-download',filepath:filepath,download_url:download_url},\n\t\t\t\tasync : false,\n\t\t\t\ttype : \"POST\",\n\t\t\t\tdataType:'json',\n\t\t\t\tsuccess:function(res){\n\t\t\t\t\t if(res.code==0){\n\t\t\t\t\t\t$(data.elem).attr('data-'+filepath+'-size',res.size);\n\t\t\t\t\t }else{\n\t\t\t\t\t  layer.alert('{fun JZLANG('获取文件大小失败，请检查网络！')}');return false;\n\t\t\t\t\t }\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t    $.post(\"{fun U('plugins/update')}\",{action:'start-download',filepath:filepath,download_url:download_url},function(res){\n\t\t\t    //开始下载\n\t\t\t    console.log(res);\n\t\t\t},'json');\n\t\t\t\n\t\t      //模拟loading\n\t\t    var n = 0, timer = setInterval(function(){ \n\t\t        $.post(\"{fun U('plugins/update')}\",{action:'get-file-size',filepath:filepath,download_url:download_url},function(res){\n\t\t        \tconsole.log(res);\n\t\t\t\t    var cur_size = parseInt(res.size);\n\t\t\t\t    console.log(cur_size);\n\t\t\t\t    var filesize = parseInt($(data.elem).attr('data-'+filepath+'-size'));\n\t\t\t\t    n = Math.round(cur_size/filesize)*100;\n\t\t\t\t    if(filesize==cur_size){\n\t\t\t\t\t  n = 90;//只加载到90%，剩下10%解压\n\t\t\t          //$(\"#down-text\").html('插件下载完成');\n\t\t\t\t\t  console.log('插件下载完成，正在解压~');\n\t\t\t          clearInterval(timer);\n\t\t\t          othis.removeClass(DISABLED);\n\t\t\t          element.progress('demo-'+filepath+'-progress', n+'%');\n\t\t\t\t\t  $.post(\"{fun U('plugins/update')}\",{filepath:filepath,download_url:download_url,'filesize':$(data.elem).attr('data-'+filepath+'-size'),'action':'file-upzip'},function(res){\n\t\t\t\t        \tif(res.code==0){\n\t\t\t\t        \t\t//$(\"#down-text\").html('插件已下载完毕！');\n\t\t\t\t\t\t\t\tconsole.log('插件已解压完毕！');\n\t\t\t\t        \t\telement.progress('demo-'+filepath+'-progress', '100%');\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t        \t}else{\n\t\t\t\t        \t\t\n\t\t\t\t        \t\tlayer.msg(res.msg);return false;\n\t\t\t\t        \t}\n\n\t\t\t\t\t\t   \n\t\t\t\t\t\t},'json');\n\t\t\t          \n\n\t\t\t        }\n\t\t\t        element.progress('demo-'+filepath+'-progress', n+'%');\n\t\t\t\t},'json');\n\n\t\t       \n\t\t    }, 1000);\n\t\t\t\n\t\t\t return false;\n\t\t\t})\n\t\t\n\t\t\n      });\n\n\t  function actionDo(path,type){\n\t\t  var type = parseInt(type);\n\t\t  var msg = '';\n\t\t  if(type==0){\n\t\t\t  msg = '{fun JZLANG('确定要卸载？')}';\n\t\t  }else if(type==1){\n\t\t\t  msg = '{fun JZLANG('确定要安装？')}';\n\t\t  }else{\n\t\t\t  msg = '{fun JZLANG('确定要删除？')}';\n\t\t  }\n\t\t  layer.confirm(msg,function(index){\n\t\t\t  $.ajax({\n\t\t\t\t  url:\"{fun U('action_do')}\",\n\t\t\t\t  dataType:\"json\",\n\t\t\t\t  async:true,\n\t\t\t\t  data:{path:path,type:type},\n\t\t\t\t  type:\"POST\",\n\t\t\t\t  beforeSend:function(){\n\t\t\t\t\t  //请求前的处理\n\t\t\t\t\t  if(parseInt(type)==1){\n\t\t\t\t\t\t  layer.msg('{fun JZLANG('正在安装中，请稍等~')}');\n\t\t\t\t\t  }else if(parseInt(type)==-1){\n\t\t\t\t\t\t  layer.msg('{fun JZLANG('正在删除中，请稍等~')}');\n\t\t\t\t\t  }else{\n\t\t\t\t\t\t  layer.msg('{fun JZLANG('正在卸载中，请稍等~')}');\n\t\t\t\t\t  }\n\n\t\t\t\t  },\n\t\t\t\t  success:function(res){\n\t\t\t\t\t  layer.closeAll();\n\t\t\t\t\t  //请求成功时处理\n\t\t\t\t\t  if(res.code==0){\n\t\t\t\t\t\t  layer.msg(res.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t  window.location.reload();\n\t\t\t\t\t\t  })\n\t\t\t\t\t  }else{\n\t\t\t\t\t\t  layer.alert(res.msg);\n\n\t\t\t\t\t  }\n\t\t\t\t  },\n\t\t\t\t  complete:function(){\n\t\t\t\t\t  //请求完成的处理\n\t\t\t\t  },\n\t\t\t\t  error:function(){\n\t\t\t\t\t  //请求出错处理\n\t\t\t\t  }\n\n\n\n\t\t\t  })\n\n\n\t\t  })\n\n\n\n\n\t  }\n\n\t  function setconf(){\n\t\t layer.prompt({\n\t\t  formType: 0,\n\t\t  value: '{$webapi}',\n\t\t  title: '{fun JZLANG('设置接口')}',\n\t\t  area: ['800px', '400px']\n\t\t}, function(value, index, elem){\n\t\t  $.post(\"{fun U('plugins/index')}\",{set:1,webapi:value},function(r){\n\t\t\tif(r.code==0){\n\t\t\t\tlayer.msg(r.msg,{icon: 6},function(){\n\t\t\t\tlocation.reload();\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}\n\t\t  },'json')\n\t\t  \n\t\t  \n\t\t  layer.close(index);\n\t\t});\n\t\t\t  \n\t  \n\t  }\n\n\n\n    </script>\n   \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/plugins-update.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t{include=\"style\"}\n\n</head>\n<body >\n  <div class=\"layui-rows\" style=\"    margin-top: 10px;\">\n    <h1 style=\"text-align:center\">{$plugin['name']}</h1>\n    <div class=\"layui-content\" style=\"margin: 20px 40px;text-align: center;\"><p style=\"font-size: 16px;\">{fun JZLANG('当前版本：')}<span class=\"layui-badge layui-bg-gray\">v{$plugin['version']}</span>&nbsp;&nbsp;{fun JZLANG('最新版本：')}<span class=\"layui-badge layui-bg-green\">v{$data['version']}</span>&nbsp;&nbsp;{fun JZLANG('作者：')}{$plugin['author']}&nbsp;&nbsp;{fun JZLANG('更新时间：')}{$data['time']}</span></p>\n    </div>\n    \n\t<div style=\" margin: 25px; font-size: 20px;\">\n\t\t<fieldset class=\"layui-elem-field\" style=\"border: none;padding: 0;border-top: 1px solid #eee;\">\n\t\t  <legend>{fun JZLANG('更新内容')}</legend>\n\t\t  <div class=\"layui-field-box\">\n\t\t    <blockquote class=\"layui-elem-quote\">{fun nl2br($data['data'])}</blockquote>\n\t\t  </div>\n\t\t</fieldset>\n\t\t\n\t\t\n\t</div>\n\t<form class=\"layui-form layui-form-pane\" action=\"\">\n\t<div id=\"update-plugins\" style=\"display: none;\"><h3  style=\"text-align:center\" id=\"down-text\">{fun JZLANG('正在下载文件')}</h3>\n\t<div class=\"layui-progress  layui-progress-big\"   id=\"down-action\" lay-showpercent=\"true\" lay-filter=\"demo-progress\" style=\"margin: 30px;\">\n\t  <div class=\"layui-progress-bar\" lay-percent=\"0%\"></div>\n\t</div>\n\t</div>\n\t<input type=\"hidden\" name=\"filepath\" id=\"filepath\" value=\"{$filepath}\">\n\t<input type=\"hidden\" name=\"download_url\" id=\"download_url\" value=\"{$data['url']}\">\n\t<input type=\"hidden\" name=\"filesize\" id=\"filesize\" value=\"{$filesize}\">\n\t<input type=\"hidden\" name=\"action\" id=\"action\" value=\"start-download\">\n\t\t<div class=\"layui-form-item\" >\n\t\t<div  style=\"text-align:center;\">\n\t\t  <button class=\"layui-btn\" id=\"update-submit\" lay-submit lay-filter=\"formDemo\">{fun JZLANG('升级插件')}</button>\n\n\t\t</div>\n\t\t</div>\n\t</form>\n  </div>\n\n  \n    <script>\n\tlayui.use(['code','form','element'], function(){ //加载code模块\n\t\t  layui.code({'encode':true}); //引用code方法\n\t\t  var form = layui.form;\n\t\t  var element = layui.element;\n\t\t  var $ = layui.jquery;\n\t\t  //监听提交\n          form.on('submit(formDemo)', function(data){\n       \t\t$(\"#update-submit\").addClass('layui-btn-disabled');\n       \t\t$(\"#update-plugins\").show();\n       \t\tvar othis = $(\"#down-action\");\n          \tvar DISABLED = 'layui-btn-disabled';\n\t\t    if(othis.hasClass(DISABLED)) return;\n\t\t    $.post(\"{fun U('plugins/update')}\",data.field,function(res){\n\t\t\t    //开始下载\n\t\t\t    console.log(res);\n\t\t\t},'json');\n\t\t\t\n\t\t      //模拟loading\n\t\t    var n = 0, timer = setInterval(function(){\n\t\t        //n = n + Math.random()*10|0;  \n\t\t        data.field.action = 'get-file-size';\n\t\t        $.post(\"{fun U('plugins/update')}\",data.field,function(res){\n\t\t        \tconsole.log(res);\n\t\t\t\t    var cur_size = parseInt(res.size);\n\t\t\t\t    console.log(cur_size);\n\t\t\t\t    var filesize = parseInt($(\"#filesize\").val());\n\t\t\t\t    n = Math.round(cur_size/filesize)*100;\n\t\t\t\t    if(cur_size==filesize){\n\t\t\t          $(\"#down-text\").html('{fun JZLANG('文件下载完成！正在解压~')}');\n\t\t\t          clearInterval(timer);\n\t\t\t          othis.removeClass(DISABLED);\n\t\t\t          element.progress('demo-progress', n+'%');\n\t\t\t           $.post(\"{fun U('plugins/update')}\",{filepath:$(\"#filepath\").val(),download_url:$(\"#download_url\").val(),'filesize':$(\"#filesize\").val(),'action':'file-upzip'},function(res){\n\t\t\t\t        \tif(res.code==0){\n\t\t\t\t        \t\tif(res.isinstall){\n\t\t\t\t        \t\t\t$(\"#down-text\").html('{fun JZLANG('文件解压完成！正在进行安装~')}');\n\t\t\t\t\t        \t\t//element.progress('demo-progress', '80%');\n\t\t\t\t\t        \t\t$.post(\"{fun U('plugins/update')}\",{filepath:$(\"#filepath\").val(),download_url:$(\"#download_url\").val(),'filesize':$(\"#filesize\").val(),'action':'plugin-install'},function(res){\n\t\t\t\t\t\t\t        \tif(res.code==0){\n\t\t\t\t\t\t\t        \t\t$(\"#down-text\").html('{fun JZLANG('插件升级成功！')}');\n\t\t\t\t\t\t\t        \t\telement.progress('demo-progress', '100%');\n\t\t\t\t\t\t\t        \t\t\n\t\t\t\t\t\t\t        \t}else{\n\t\t\t\t\t\t\t        \t\t\n\t\t\t\t\t\t\t        \t\tlayer.msg(res.msg);return false;\n\t\t\t\t\t\t\t        \t}\n\n\n\t\t\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t\t\t},'json');\n\t\t\t\t        \t\t}else{\n\t\t\t\t        \t\t\t$(\"#down-text\").html('{fun JZLANG('插件已升级完毕！')}');\n\t\t\t\t        \t\t\telement.progress('demo-progress', '100%');\n\t\t\t\t        \t\t}\n\t\t\t\t        \t\t\n\t\t\t\t        \t\t\n\n\t\t\t\t        \t}else{\n\t\t\t\t        \t\t\n\t\t\t\t        \t\tlayer.msg(res.msg);return false;\n\t\t\t\t        \t}\n\n\t\t\t\t\t\t   \n\t\t\t\t\t\t},'json');\n\n\t\t\t        }\n\t\t\t        //升级分三步，70%下载，10%解压，20%安装\n\t\t\t        n = Math.round(n*0.7);\n\t\t\t        element.progress('demo-progress', n+'%');\n\t\t\t\t},'json');\n\n\t\t       \n\t\t    }, 1000);\n\n\t\t\t\n\t\t\t\n            return false;\n          });\n\n\n\n\t\t});\n\n    </script>\n \n</body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/power-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n  {include=\"style\"}\n  \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\">\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t<!--li>扩展信息</li-->\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\t<div class=\"layui-form-item\">\n\t\t\t<label for=\"pid\" class=\"layui-form-label\">\n\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择上级')}\n\t\t\t</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<select name=\"pid\" id=\"pid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('顶级')}</option>\n\t\t\t   {foreach $rulers as $v}\n\t\t\t   <option {if($pid==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t   {/foreach}\n\t\t\t\n\t\t\t   </select>\n\t\t\t</div>\n        </div>\n\t\t <div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('功能')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                 \n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"action\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('函数名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"action\" name=\"action\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG('对应的控制器/函数，如果是顶级，则只需要写控制器名')}\n              </div>\n          </div>\n\t\t  {if($webconf['isrelative']==1)}\n\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t{/if}\n\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\n\t\t\t\t{if($webconf['isrelative']==0)}\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t</div>\n\t\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('增加')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\t{include=\"fields\"}\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n\t    get_fields(0);\n\t\t\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t\t\t$.post('{fun U('Member/addrulers')}',data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('添加成功！')}', {\n\t\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t\t window.location.href=\"{fun U('Member/power')}\";\n\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\tparent.location.reload();\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t parent.layer.close(index);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n                return false;\n          });\n\t\t  \n\t\t   \n          \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/power-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n  {include=\"style\"}\n    \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form  layui-form-pane\">\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t<!--li>扩展信息</li-->\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t<label for=\"pid\" class=\"layui-form-label\">\n\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择上级')}\n\t\t\t</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<select name=\"pid\" id=\"pid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('顶级')}</option>\n\t\t\t   {foreach $rulers as $v}\n\t\t\t   <option {if($data['pid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t   {/foreach}\n\t\t\t\n\t\t\t   </select>\n\t\t\t</div>\n        </div>\n\t\t <div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('功能')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" value=\"{$data['name']}\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                 \n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"action\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('函数名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"action\" name=\"action\" value=\"{$data['action']}\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG('对应的控制器/函数，如果是顶级，则只需要写控制器名')}\n              </div>\n          </div>\n\t\t  \n\t\t{if($webconf['isrelative']==1)}\n\t\t<span id=\"ext_fields\"></span>\n\t\t{/if}\n\t\t \n\t\t  \n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t{if($webconf['isrelative']==0)}\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t</div>\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <input type=\"hidden\" id=\"id\" name=\"id\" value=\"{$data['id']}\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('修改')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n{include=\"fields\"}\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n         \n\t\tget_fields(0,{$data['id']});\n\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t$.post('{fun U('Member/editrulers')}',data.field,function(r){\n\t\t\t\n\t\t\t\t\n\t\t\t\tr = JSON.parse(r);\n\t\t\t\t\n\t\t\t\tif(r.status==0){\n\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t  icon:5\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\tlayer.msg('{fun JZLANG('修改成功！')}', {\n\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t},function(){\n\t\t\t\t\t\t\n\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t window.location.href=\"{fun U('Member/power')}\";\n\t\t\t\t\t\t{else}\n                        parent.layer.closeAll();\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn false;\n          });\n\t\t \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/power-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('分组管理')}</cite></a>\n              <a><cite>{fun JZLANG('权限列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n          \n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t\n\t\t\t<xblock>\n\t\t\t<form class=\"layui-form\" action=\"\">\n\t\t\t  {if(checkAction('Member/addrulers'))}\n\t\t\t  <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('添加权限','{fun U('Member/addrulers')}')\">{fun JZLANG('添加权限')}</a>\n\t\t\t  {/if}\n\t\t\t  {if($webconf['isopenhomepower']==0)}<a class=\"layui-btn layui-btn-sm\">{fun JZLANG('温馨提示：前台权限已关闭，设置权限不会生效。')}</a>{else}<a class=\"layui-btn layui-btn-sm layui-btn-danger\">{fun JZLANG('温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！')}</a>{/if}\n\t\t\t  <div class=\"layui-input-inline\" style=\"float: right;\">\n\t\t\t\t  <input type=\"checkbox\" value=\"1\" name=\"switch\" lay-filter=\"type\"  lay-text=\"{fun JZLANG('展开|折叠')}\" checked lay-skin=\"switch\">\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</form>\n\t\t    </xblock>\n            <table class=\"layui-table\">\n                <thead>\n                    <tr>\n                        \n                        <th>\n                            ID\n                        </th>\n                       \n                        <th>\n                            {fun JZLANG('功能')}\n                        </th>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('控制器/方法')}\n                        </th>\n\t\t\t\t\t\t\n                        <th>\n                            {fun JZLANG('操作')}\n                        </th>\n                    </tr>\n                </thead>\n                <tbody class=\"x-cate\">\n\t\t{foreach $lists as $v}\n          <tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\" >\n            \n\t\t\t\n            <td>{$v['id']}</td>\n            <td>\n\t\t\t  {fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n\t\t\t  {if($v['haschild'])}\n\t\t\t  <i class=\"layui-icon x-show\" status='false'>&#xe625;</i>\n\t\t\t  {else}\n\t\t\t  {if($v['level'])}|——{/if}\n\t\t\t  {/if}\n\t\t\t  {fun JZLANG($v['name'])}\n            </td>\n\t\t\t<td>{$v['action']}</td>\n\t\t\t\n            <td class=\"td-manage\">\n\t\t\t {if(checkAction('Member/editrulers'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Member/editrulers',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t {/if}\n\t\t\t  {if(checkAction('Member/addrulers'))}\n\t\t\t\t{if($v['pid']==0)}\n\t\t\t\t<a class=\"layui-btn layui-btn-warm layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('添加子功能')}','{fun U('Member/addrulers',array('pid'=>$v['id']))}')\" >{fun JZLANG('添加子功能')}</a>\n\t\t\t\t{/if}\n\t\t\t  {/if}\n\t\t\t  {if(checkAction('Member/deleterulers'))}\n              <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"ruler_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t  {/if}\n            </td>\n          </tr>\n\t\t {/foreach}\n         \n        </tbody>\n            </table>\n\t\t\t\n\t\t\t\n\t\t\t</div>\n\t\t</div>  \n\t\t  \n         \n            \n        </div>\n     \n       <script>\n\t  \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n              laydate = layui.laydate;//日期插件\n              lement = layui.element;//面包导航\n            //  laypage = layui.laypage;//分页\n              layer = layui.layer;//弹出层\n\t\t\t  form = layui.form;\n             \n              form.on('select(tid)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t$(\"#myform\").submit();\n\t\t\t\t\n\t\t\t });\n             form.on('switch(type)', function(data){\n\t\t\t\tif(!data.elem.checked){\n\t\t\t\t\t$(\".x-cate tr\").each(function(){\n\t\t\t\t\t\tif($(this).attr('fid')!=0){\n\t\t\t\t\t\t\t$(this).css('display','none');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t$(\".x-show\").attr('status','true').html('&#xe623;');\n\t\t\t\t}else{\n\t\t\t\t\t\n\t\t\t\t\t$(\".x-cate tr\").each(function(){\n\t\t\t\t\t\tif($(this).attr('fid')!=0){\n\t\t\t\t\t\t\t$(this).css('display','table-row');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t$(\".x-show\").attr('status','false').html('&#xe625;');\n\t\t\t\t}\n\t\t\t});  \n              \n            });\n\t\t /*删除*/\n            function ruler_del(obj,id){\n                layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t$.get(\"{__APP_URL__}/Member/deleterulers/id/\"+id,{},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000});\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n                   \n                });\n            }\n\t\t\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/power-tree.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a >{fun JZLANG('首页')}</a>\n        <a >{fun JZLANG('权限管理')}</a>\n        <a><cite>{fun JZLANG('权限列表')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t<form  method=\"post\" class=\"layui-form layui-form-pane\">\n\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n                    <label class=\"layui-form-label\">\n                        {fun JZLANG('栏目选择')}\n                    </label>\n                    <table  class=\"layui-table layui-input-block\">\n                        <tbody>\n\t\t\t\t\t\t\t<tr>\n                                <th>\n                                   {fun JZLANG('顶级栏目')}\n                                </th>\n                                <th>\n                                   {fun JZLANG('子栏目')}\n                                </th>\n                            </tr>\n\t\t\t\t\t\t{foreach $classtypetree as $v}\n\t\t\t\t\t\t{if($v['pid']==0)}\n                            <tr>\n                                <td>\n                                    <input type=\"checkbox\" name=\"ruler[]\" lay-skin=\"primary\" value=\"class_{$v['id']}\" title=\"{$v['classname']}\" >\n                                </td>\n                                <td>\n                                    <div class=\"layui-input-block\">\n                                    {php $children = get_children($v,$classtypetree,5);/}\n\t\t\t\t\t\t\t\t\t{foreach $children as $vv}\n                                        <input name=\"ruler[]\" lay-skin=\"primary\" type=\"checkbox\" title=\"{$vv['classname']}\" value=\"class_{$vv['id']}\" > \n\t\t\t\t\t\t\t\t\t{/foreach}\n                                        \n                                    </div>\n                                </td>\n                            </tr>\n                        {/if}\n\t\t\t\t\t\t{/foreach}\n                           \n                        </tbody>\n                    </table>\n                </div>\n                <div class=\"layui-form-item layui-form-text\">\n                    <label class=\"layui-form-label\">\n                        {fun JZLANG('权限选择')}  <span class=\"x-red\">{fun JZLANG('不能选择的权限是非独立功能')}</span>\n                    </label>\n                    <table  class=\"layui-table layui-input-block\">\n                        <tbody>\n\t\t\t\t\t\t\t<tr>\n                                <th>\n                                   {fun JZLANG('主模块')}\n                                </th>\n                                <th>\n                                   {fun JZLANG('子模块')}\n                                \n                                </th>\n                            </tr>\n\t\t\t\t\t\t{foreach $ruler_top as $v}\n                            <tr>\n                                <td style=\"width:100px\">\n                                    {$v['name']}\n                                </td>\n                                <td>\n                                    <div class=\"layui-input-block\">\n\t\t\t\t\t\t\t\t\t{foreach $ruler_children[$v['id']] as $vv}\n\t\t\t\t\t\t\t\t\t\t\n                                        <input name=\"ruler[]\" {if($vv['isdesktop']!=1)}disabled{/if} lay-skin=\"primary\" type=\"checkbox\" title=\"{$vv['name']}\" value=\"{$vv['id']}\" > \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{/foreach}\n                                        \n                                    </div>\n                                </td>\n                            </tr>\n\t\t\t\t\t\t{/foreach}\n                           \n                        </tbody>\n                    </table>\n                </div>\n\t\t\t\t<div class=\"layui-form-item\" style=\"text-align:center;\">\n                <button class=\"layui-btn\" lay-submit=\"\" lay-filter=\"add\">{fun JZLANG('添加')}</button>\n\t\t\t\t</div>\n\t\n\t\t\t</div>\n\t\t</form>\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n     \n  \n    <script>\n\tlayui.use(['form','layer'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n\t\t  \n\t\t  form.render();\n          //监听提交\n          form.on('submit(add)', function(data){\n           \n\t\t\t//var ruler = JSON.stringify(data.field);\n\t\t\tvar ruler = [];\n\t\t\tfor( item in data.field){\n\t\t\t\truler.push(data.field[item])\n\t\t\t}\n\t\t\tif(ruler.length==0){\n\t\t\t\tlayer.alert('{fun JZLANG('请先勾选菜单!')}');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\twindow.parent.setNavChildren(ruler.join(','));\n\t\t\twindow.parent.closeiframe();\n\t\t\t\n            return false;\n          });\n\t   \n      });\n\t\n\n     \n\t\t\n\t\t\t\n    \n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/product-add.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"{__Tpl_style__}/style/tags/jquery.tagsinput.css\" />\n\t\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"{__Tpl_style__}/style/tags/jquery.tagsinput.js\"></script>\n\t\t{include=\"edit\"}\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('管理')}</cite></a>\n             \n\t\t\t  <a><cite>{fun JZLANG('新增')}{$molds['name']}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form layui-form-pane\" lay-filter=\"jizhiform\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基础')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展')}</li>\n\t\t\t\t<li>{fun JZLANG('设置')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\n\t\t\t\t{if($molds['isclasstype']==1)}\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t\t<select name=\"tid\" lay-search=\"\" {if($molds['ismust']==1)} lay-verify=\"required\" {/if} lay-filter=\"tid\" id=\"tid\" >\n\t\t\t\t\t\t{if($molds['ismust']==1)}\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t   {if($v['molds']=='product')}\n\t\t\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t\t\t   <option {if($tid==$v['id'])}selected{/if} value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/foreach}\n\t\t\t\t\t  \n\t\t\t\t\t   </select>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<button type=\"button\" id=\"resetdata\" class=\"layui-btn layui-btn-sm\">{fun JZLANG('恢复数据')}</button>\n                    </div>\n                </div>\n\t\t\t\t{else}\n\t\t\t\t<input type=\"hidden\" name=\"tid\" value=\"0\" />\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t<span id=\"content_fields\"></span>\n\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<blockquote class=\"layui-elem-quote\">{fun JZLANG('此规则配置仅在不填留空的情况下才会触发')}</blockquote>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('SEO标题')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_seotitle\" >\n\t\t\t\t\t\t\t<option {if($configdata['seotitle']==1)}selected{/if} value=\"1\">{fun JZLANG('等于内容标题')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['seotitle']==2)}selected{/if} value=\"2\">{fun JZLANG('不填则留空')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('缩略图规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_litpic\" >\n\t\t\t\t\t\t\t<option {if($configdata['litpic']==1)}selected{/if} value=\"1\">{fun JZLANG('自动获取内容第一张图片')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['litpic']==2)}selected{/if} value=\"2\">{fun JZLANG('不自动获取')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('简介规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_description\" >\n\t\t\t\t\t\t\t<option {if($configdata['description']==1)}selected{/if} value=\"1\">{fun JZLANG('自动获取内容前200字符')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['description']==2)}selected{/if} value=\"2\">{fun JZLANG('不自动获取')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('TAG规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_tags\" >\n\t\t\t\t\t\t\t<option {if($configdata['tags']==1)}selected{/if} value=\"1\">{fun JZLANG('同步关键词')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['tags']==2)}selected{/if} value=\"2\">{fun JZLANG('不同步关键词')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item  layui-form-text\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('敏感词过滤字段')} <span class=\"x-red\">{fun JZLANG('需要过滤敏感词在系统配置中进行设置')}</span></label>\n\t\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t  <textarea placeholder=\"{fun JZLANG('请输入需要过滤的字段')}\" name=\"config_filter\" class=\"layui-textarea\">{$configdata['filter']}</textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\n                <div class=\"layui-form-item\" id=\"jizhitj\"  style=\"text-align:center\">\n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n\t\t\n\t\t\t$(function() {\n\t\t\t  \n\t\t\t   get_fields({$tid});\n\t\t\t   get_fields_ext({$tid});\n\t\t\t})\n\t\t\t\n\t\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t  var upload = layui.upload;\n\t\t\t  \n\t\t\t  \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n\t\t\t\tif($(\"#tids\").length>0){\n\t\t\t\t\tvar tids_str = tids_obj.getValue('valueStr');\n\t\t\t\t\tif(tids_str!=''){\n\t\t\t\t\tdata.field.tids = ','+tids_str+',';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('addproduct')}\",data.field,function(r){\n\t\t\t\t\tlocalStorage.setItem('cachedata', '');\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回')}','{fun JZLANG('确定')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t  {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.href=\"{fun U('Product/productlist')}\";\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t   parent.location.reload();\n\t\t\t\t\t\t   parent.layer.close(index);\n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t   window.location.href=r.url;\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t  \n            form.on('select(tid)', function(data){\n\t\t\t  var alldata = form.val(\"jizhiform\");\n\t\t\t  localStorage.setItem('cachedata', JSON.stringify(alldata));\n\t\t\t  get_fields(data.value);\n\t\t\t  get_fields_ext(data.value);\n\t\t\t  \n\t\t\t});\n\t\t\t\n\t\t\t$(\"#resetdata\").click(function(){\n\t\t\t\tvar alldata = localStorage.getItem('cachedata');\n\t\t\t\tif(alldata!=''){\n\t\t\t\t\tform.val(\"jizhiform\",JSON.parse(alldata));\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/product-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"{__Tpl_style__}/style/tags/jquery.tagsinput.css\" />\n\t\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"{__Tpl_style__}/style/tags/jquery.tagsinput.js\"></script>\n\t\t{include=\"edit\"}\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('管理')}</cite></a>\n             \n\t\t\t <a><cite>{fun JZLANG('修改')}{$molds['name']}</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n            <form class=\"layui-form  layui-form-pane\" lay-filter=\"jizhiform\">\n\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t<input type=\"hidden\" name=\"id\" value=\"{$data['id']}\" />\n\t\t\t\n\t\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t<li>{fun JZLANG('扩展信息')}</li>\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t \n\t\t\t\t{if($molds['isclasstype']==1)}\n\t\t\t\t<div class=\"layui-form-item\">\n                    <label for=\"tid\" class=\"layui-form-label\">\n                        <span class=\"x-red\">*</span>{fun JZLANG('栏目')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n\t\t\t\t\t<select name=\"tid\" lay-search=\"\" lay-filter=\"tid\" {if($molds['ismust']==1)}lay-verify=\"required\"{/if} id=\"tid\" >\n\t\t\t\t\t   {if($molds['ismust']==1)}\n\t\t\t\t\t\t<option value=\"\">{fun JZLANG('选择栏目')}</option>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('不限栏目')}</option>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t   {if($v['molds']=='product')}\n\t\t\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t\t\t   <option {if($data['tid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t   {/if}\n\t\t\t\t\t   {/if}\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t   \n\t\t\t\t\t</select>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<span class=\"x-red\">{fun JZLANG('填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！')}</span>\n                    </div>\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t<button type=\"button\" id=\"resetdata\" class=\"layui-btn layui-btn-sm\">{fun JZLANG('恢复数据')}</button>\n                    </div>\n                </div>\n\t\t\t\t{else}\n\t\t\t\t<input type=\"hidden\" name=\"tid\" value=\"{$data['tid']}\" />\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t<span id=\"content_fields\"></span>\n\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t<blockquote class=\"layui-elem-quote\">{fun JZLANG('此规则配置仅在不填留空的情况下才会触发')}</blockquote>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('SEO标题')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_seotitle\" >\n\t\t\t\t\t\t\t<option {if($configdata['seotitle']==1)}selected{/if} value=\"1\">{fun JZLANG('等于内容标题')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['seotitle']==2)}selected{/if} value=\"2\">{fun JZLANG('不填则留空')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('缩略图规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_litpic\" >\n\t\t\t\t\t\t\t<option {if($configdata['litpic']==1)}selected{/if} value=\"1\">{fun JZLANG('自动获取内容第一张图片')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['litpic']==2)}selected{/if} value=\"2\">{fun JZLANG('不自动获取')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('简介规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_description\" >\n\t\t\t\t\t\t\t<option {if($configdata['description']==1)}selected{/if} value=\"1\">{fun JZLANG('自动获取内容前200字符')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['description']==2)}selected{/if} value=\"2\">{fun JZLANG('不自动获取')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('TAG规则')}</label>\n\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t  <select name=\"config_tags\" >\n\t\t\t\t\t\t\t<option {if($configdata['tags']==1)}selected{/if} value=\"1\">{fun JZLANG('同步关键词')}</option>\n\t\t\t\t\t\t\t<option {if($configdata['tags']==2)}selected{/if} value=\"2\">{fun JZLANG('不同步关键词')}</option>\n\t\t\t\t\t\t  </select>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"layui-form-item  layui-form-text\">\n\t\t\t\t\t\t<label class=\"layui-form-label\">{fun JZLANG('敏感词过滤字段')} <span class=\"x-red\">{fun JZLANG('需要过滤敏感词在系统配置中进行设置')}</span></label>\n\t\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t  <textarea placeholder=\"{fun JZLANG('请输入需要过滤的字段')}\" name=\"config_filter\" class=\"layui-textarea\">{$configdata['filter']}</textarea>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  \n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t  </div>\n\t\t\t</div>\n\n                <div class=\"layui-form-item\" id=\"jizhitj\"  style=\"text-align:center;\">\n                    \n                     <button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\n                        {fun JZLANG('保存')}\n                    </button>\n                </div>\n            </form>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t{include=\"fields\"}\n\t\t\t\n\t\t\t\n            layui.use(['laydate','form','layer','upload'], function(){\n              $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t  var upload = layui.upload;\n\t\t\t \n              \n\t\t\t    //监听提交\n              form.on('submit(save)', function(data){\n                if($(\"#tids\").length>0){\n\t\t\t\t\tvar tids_str = tids_obj.getValue('valueStr');\n\t\t\t\t\tif(tids_str!=''){\n\t\t\t\t\tdata.field.tids = ','+tids_str+',';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$.post(\"{fun U('editproduct')}\",data.field,function(r){\n\t\t\t\t\tlocalStorage.setItem('cachedata', '');\n\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\n\t\t\t\t\t\tlayer.confirm(r.msg, {\n\t\t\t\t\t\t  btn: ['{fun JZLANG('返回列表')}','{fun JZLANG('取消')}'] //按钮\n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\t// 获得frame索引\n\t\t\t\t\t\t\t{if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t window.location.href=\"{fun U('Product/productlist')}\";\n\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\tparent.layer.closeAll();\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t  \n\t\t\t\t\t\t}, function(){\n\t\t\t\t\t\t\tparent.layer.closeAll();\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n               \n                return false;\n              });\n            get_fields({$data['tid']},{$data['id']});\n            get_fields_ext({$data['tid']},{$data['id']});\n\t\t\tform.on('select(tid)', function(data){\n\t\t\t  var alldata = form.val(\"jizhiform\");\n\t\t\t  localStorage.setItem('cachedata', JSON.stringify(alldata));\n\t\t\t  get_fields(data.value,{$data['id']}); \n\t\t\t  get_fields_ext(data.value,{$data['id']});\n\t\t\t  \n\t\t\t  \n\t\t\t});\n\t\t\t$(\"#resetdata\").click(function(){\n\t\t\t\tvar alldata = localStorage.getItem('cachedata');\n\t\t\t\tif(alldata!=''){\n\t\t\t\t\tform.val(\"jizhiform\",JSON.parse(alldata));\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n\t\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/product-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('管理')}</cite></a>\n              <a><cite>{$molds['name']}{fun JZLANG('列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t\n\t\t\t <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t\n\t\t\t\t\t  {$fields_search}\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\"><i class=\"layui-icon\">&#xe615;</i></button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n        \n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t<a class=\"layui-btn layui-btn-xs layui-btn-normal\" lay-event=\"view\">{fun JZLANG('预览')}</a>\n\t\t{if(checkAction('Product/editproduct'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs\" lay-event=\"edit\">{fun JZLANG('编辑')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Product/deleteproduct'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Product/copyproduct'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-warm\" lay-event=\"copy\">{fun JZLANG('复制')}</a>\n\t\t{/if}\n\t\t\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t {if(checkAction('Product/deleteAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-danger layui-btn-sm \" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Product/copyAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-warm layui-btn-sm \" onclick=\"copyAll()\">{fun JZLANG('批量复制')}</a>\n\t\t {/if}\n\t\t {if(checkAction('Product/addproduct'))}\n\t\t\t{if($tid)}\n\t\t\t\t<a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增')}','{fun U('Product/addproduct',['tid'=>$tid])}')\">{fun JZLANG('新增')}</a>\n\t\t\t{else}\n\t\t\t   <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('新增')}','{fun U('Product/addproduct')}')\">{fun JZLANG('新增')}</a>\n\t\t\t{/if}\n\t\t\t{/if}  \n\t\t {if(checkAction('Product/changeType'))}\n\t\t\t   <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_tid\" lay-search=\"\"  lay-filter=\"change_tid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量修改栏目')}</option>\n\t\t\t   {foreach $classtypes as $v}\n\t\t\t   {if($v['molds']=='product')}\n\t\t\t   {if($admin['classcontrol']==0 || $admin['isadmin']==1 || strpos($tids,','.$v['id'].',')!==false || $molds['iscontrol']==0)}\n\t\t\t   <option   value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t   {/if}\n\t\t\t   {/if}\n\t\t\t   {/foreach}\n\t\t\t   </select>\n\t\t\t   </div>\n\t\t {/if}\n\t\t  {if(checkAction('Product/changeAttribute'))}\n\t\t\t   <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_tuijian\"  lay-filter=\"change_tuijian\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('修改推荐属性')}</option>\n\t\t\t   {loop table=\"attr\" isshow=\"1\" as=\"v\"}\n\t\t\t   <option   value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t   {/loop}\n\t\t\t   </select>\n\t\t\t   </div>\n\t\t  {/if}\n\t\t  {if(checkAction('Product/checkAll'))}\t\n\t\t  <div class=\"layui-input-inline\" style=\"margin-right: 10px;margin-bottom: 10px;width:150px;\">\n\t\t\t   <select class=\"layui-btn\" id=\"change_isshow\"  lay-filter=\"change_isshow\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('批量审核')}</option>\n\t\t\t   <option   value=\"1\">{fun JZLANG('已审')}</option>\n\t\t\t   <option   value=\"2\">{fun JZLANG('未审')}</option>\n\t\t\t   <option   value=\"3\">{fun JZLANG('退回')}</option>\n\t\t\t  \n\t\t\t   </select>\n\t\t\t   </div>\n\t\t {/if}\n\t\t    \n\t\t\t<a class=\"layui-btn layui-btn-warm layui-btn-sm\" title=\"{fun JZLANG('设置')}\" onclick=\"x_admin_show('{fun JZLANG('列表字段设置')}','{fun U('Fields/fieldsList',['molds'=>'product'])}')\"><i class=\"iconfont\">&#xe6ae;</i></a>\n\t\t\t\n\t\t </div>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"tuijian\">\n\t\t\t{{#  if(d.istop ==1){ }}\n\t\t\t<span class=\"layui-badge layui-bg-black\">{fun JZLANG('顶')}}</span>\n\t\t\t{{#  } }}\n\t\t\t{{#  if(d.ishot==1){ }}\n\t\t        <span class=\"layui-badge\">{fun JZLANG('热')}}</span>\n\t\t    {{#  } }}\n\t\t    {{#  if(d.istuijian==1){ }}\n\t\t        <span class=\"layui-badge layui-bg-green\">{fun JZLANG('荐')}}</span>\n\t\t    {{#  } }}\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"isshow\">\n\t\t\t{{#  if(d.isshow ==1){ }}\n\t\t\t<span class=\"layui-badge layui-bg-green\">{fun JZLANG('已审')}}</span>\n\t\t\t{{#  } else if(d.isshow ==2){ }}\n\t\t    <span class=\"layui-badge layui-bg-black\">{fun JZLANG('退回')}}</span>\n\t\t    {{#  } else{ }}\n\t\t    <span class=\"layui-badge\">{fun JZLANG('未审')}}</span>\n\t\t    {{#  } }}\n\t\t</script>\n\t \t\n\n\t \n\t\t<script>\n\t \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  \n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,cellMinWidth: 80\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  ,first: '{fun JZLANG('首页')}' //不显示首页\n\t\t\t\t  ,last: '{fun JZLANG('尾页')}' //不显示尾页\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  {foreach $fields_list as $v}\n\t\t\t\t  ,{field: '{$v['field']}',width:{if(!$v['width'])}100{else}{$v['width']}{/if}, title: '{$v['fieldname']}' {if($v['fieldtype']==1 || $v['fieldtype']==2 || $v['fieldtype']==4 || $v['fieldtype']==14)},edit:'text'{/if} }\n\t\t\t\t  {/foreach}\n\t\t\t\t  {if(checkAction('Product/editproduct') || checkAction('Product/deleteproduct') || checkAction('Product/copyproduct'))}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG('操作')}',width:240, toolbar: '#rightbar', fixed:'right'}\n\t\t\t\t  {/if}\n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'edit':\n\t\t\t\t\t\t//console.log(data);\n\t\t\t\t\t\t x_admin_show('{fun JZLANG('编辑')}',data.edit_url);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'view':\n\t\t\t\t\t\t    var a = $('<a href=\"'+data.view_url+'\" target=\"_blank\">{fun JZLANG('预览')}</a>').get(0);\n\t\t\t\t\t\t\tvar e = document.createEvent('MouseEvents');\n\t\t\t\t\t\t\te.initEvent( 'click', true, true );\n\t\t\t\t\t\t\ta.dispatchEvent(e);\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Product/deleteproduct')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t  case 'copy':\n\t\t\t\t\t  \n\t\t\t\t\t\t\t$.post(\"{fun U('Product/copyproduct')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t  \n\t\t\t\t\t\t \n\t\t\t\t\t  break;\n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t \n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table');\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\ttable.on('edit(jizhi_table)', function(obj){ \n\t\t\t\t  var id = obj.data.id;\n\t\t\t\t  var value = obj.value;\n\t\t\t\t  var field = obj.field;\n\t\t\t\t  $.post(\"{fun U('Product/editProductOrders')}\",{'id':id,'value':value,'field':field},function(r){\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t  ,where: {} \n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg(r.info,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t    form.on('select(change_tid)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar tid = parseInt(data.value);\n\t\t\t\t\tif(tid==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择修改栏目！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量修改内容分类吗？')}['+datas+']=>['+tid+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Product/changeType')}\",{data:datas,tid:tid},function(r){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量修改成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tform.on('select(change_tuijian)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar tj = parseInt(data.value);\n\t\t\t\t\tif(tj==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择修改属性！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择修改对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\t$.post(\"{fun U('Product/changeAttribute')}\",{data:datas,tj:tj},function(r){\n\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量修改成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\t\t\t\t\n\t\t\t\t form.on('select(change_isshow)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tvar datas =  $(\"#select_data\").val();\n\t\t\t\t\tvar isshow = parseInt(data.value);\n\t\t\t\t\tif(isshow==0){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核选项！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(datas==''){\n\t\t\t\t\t\talert('{fun JZLANG('请选择审核对象！')}');return false;\n\t\t\t\t\t}\n\t\t\t\t\tif(isshow==1){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('显示')}';\n\t\t\t\t\t}else if(isshow==2){\n\t\t\t\t\t\tvar tip = '{fun JZLANG('不显示')}';\n\t\t\t\t\t}else{\n\t\t\t\t\t\tvar tip = '{fun JZLANG('退回')}';\n\t\t\t\t\t}\n\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要批量处理吗？')}['+datas+']=>['+tip+']',function(index){\n\t\t\t\t\t\t\n\t\t\t\t\t\t$.post(\"{fun U('Product/checkAll')}\",{data:datas,isshow:isshow},function(r){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t$(\"#select_data\").val('');\n\t\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('批量审核成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t    });\n\t\t\t\t\n\t\t\t\t\n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t function delAll () {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}'+data,function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Product/deleteAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t function copyAll(){\n\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\talert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要复制吗？')}['+data+']',function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Product/copyAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量复制成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t  \n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/recycle-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('回收站')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t  <div class=\"layui-collapse\">\n\t\t    <div class=\"layui-colla-item\">\n\t\t\t<h2 class=\"layui-colla-title\">{fun JZLANG('搜索')}</h2>\n\t\t\t\t<div class=\"layui-colla-content layui-show\">\n\t\t\t\t<div class=\"layui-row\">\n\t\t\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t  <select name=\"molds\" lay-filter=\"molds\" class=\"layui-inline autosubmit\">\n\t\t\t\t\t  <option value=\"\">{fun JZLANG('模型')}</option>\n\t\t\t\t\t   {loop table=\"molds\" isopen=\"1\" as=\"v\"}\n\t\t\t\t\t   <option value=\"{$v['biaoshi']}\">{$v['name']}</option>\n\t\t\t\t\t   {/loop}\n\t\t\t\t\t  </select>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"search\">{fun JZLANG('搜索')}</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t    </div>\n         </div> \n\t\t  \n\t\t<table class=\"layui-hide\" lay-data=\"{id: 'jizhi_table'}\" id=\"jizhi_table\" lay-filter=\"jizhi_table\"></table>\n\t\t<input id=\"select_data\" type=\"hidden\" value=\"\" />\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t\n       \n\t\t<script type=\"text/html\" id=\"rightbar\">\n\t\t\n\t\t{if(checkAction('Recycle/restore'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-primary\" lay-event=\"restore\">{fun JZLANG('还原')}</a>\n\t\t{/if}\n\t\t{if(checkAction('Recycle/del'))}\n\t\t\t<a class=\"layui-btn layui-btn-xs layui-btn-danger\" lay-event=\"delete\">{fun JZLANG('删除')}</a>\n\t\t{/if}\n\t\t\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"toolbar\">\n\t\t <div class=\"layui-btn-container\" style=\"font-size:15px;\">\n\t\t {if(checkAction('Recycle/delAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-danger layui-btn-sm\" onclick=\"delAll()\">{fun JZLANG('批量删除')}</a>\n\t\t {/if}\n\t\t \n\t\t {if(checkAction('Recycle/restoreAll'))}\n\t\t\t   <a class=\"layui-btn layui-btn-warming layui-btn-sm\" onclick=\"restoreAll()\">{fun JZLANG('批量恢复')}</a>\n\t\t {/if}\n\t\t \n\t\t\n\t\t\t\n\t\t </div>\n\t\t</script>\n\t\t\n\t \n\t\t<script>\n\t    layui.use(['laydate','form','element','laypage','layer','table'], function(){\n                $ = layui.jquery;//jquery\n              var laydate = layui.laydate;//日期插件\n              var lement = layui.element;//面包导航\n              var layer = layui.layer;//弹出层\n\t\t\t  var form = layui.form;\n\t\t\t  var table = layui.table;\n\t\t\t  \n\t\t\t  table.render({\n\t\t\t\telem: '#jizhi_table'\n\t\t\t\t,height: 700\n\t\t\t\t,url: window.location.href+'?ajax=1' //数据接口\n\t\t\t\t,page: true //开启分页\n\t\t\t\t,size:'lg'\n\t\t\t\t,count:100\n\t\t\t\t,toolbar:\"#toolbar\"\n\t\t\t\t,data:{}\n\t\t\t\t,page: { //支持传入 laypage 组件的所有参数（某些参数除外，如：jump/elem） - 详见文档\n\t\t\t\t  layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'] //自定义分页布局\n\t\t\t\t  //,curr: 5 //设定初始在第 5 页\n\t\t\t\t  ,groups: 5 //只显示 1 个连续页码\n\t\t\t\t  ,first: true //显示首页\n\t\t\t\t  ,last: true //显示尾页\n\t\t\t\t  ,count:500\n\t\t\t\t  ,limit:10\n\t\t\t\t  \n\t\t\t\t}\n\t\t\t\t,cols: [[ //表头\n\t\t\t\t  {field: 'id', title: 'ID', width:60}\n\t\t\t\t  ,{type:'checkbox'}\n\t\t\t\t  ,{field: 'title', title: '{fun JZLANG(\"标记\")}'}\n\t\t\t\t  ,{field: 'moldsname', title: '{fun JZLANG(\"模型\")}'}\n\t\t\t\t  {if(checkAction('Recycle/restore') || checkAction('Recycle/del'))}\n\t\t\t\t  ,{field: '', title: '{fun JZLANG(\"操作\")}', toolbar: '#rightbar',width:200, fixed:'right'}\n\t\t\t\t  {/if}\n\t\t\t\t \n\t\t\t\t \n\t\t\t\t]]\n\t\t\t  });\n\t\t\t  \n\t\t\t    table.on('tool(jizhi_table)', function(obj){\n\t\t\t\t\tvar data = obj.data; //获得当前行数据\n\t\t\t\t\tvar layEvent = obj.event; //获得 lay-event 对应的值（也可以是表头的 event 参数对应的值）\n\t\t\t\t\tvar tr = obj.tr; //获得当前行 tr 的DOM对象\n\t\t\t\t\t \n\t\t\t\t\tswitch(layEvent){\n\t\t\t\t\t  case 'restore':\n\t\t\t\t\t\tlayer.confirm('{fun JZLANG('你确定要还原吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Recycle/restore')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t \n\t\t\t\t\t  case 'delete':\n\t\t\t\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？删除后就彻底无法恢复了！')}',function(index){\n\t\t\t\t\n\t\t\t\t\t\t\t\t$.post(\"{fun U('Recycle/del')}\",{id:data.id},function(r){\n\t\t\t\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t\t\t\t$(tr).remove();\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t\t\t\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t\t\t\t\t\t\t\t  ,where: {} //设定异步数据接口的额外参数\n\t\t\t\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t});\n\t\t\t\t\t  break;\n\t\t\t\t\t \n\t\t\t\t\t  \n\t\t\t\t\t \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t  \n\t\t\t  table.on('checkbox(jizhi_table)', function(obj){\n\t\t\t\t\n\t\t\t\t   var checkStatus = table.checkStatus('jizhi_table'); //idTest 即为基础参数 id 对应的值\n\t\t\t\t   var len = checkStatus.data.length;\n\t\t\t\t   var arr=[];\n\t\t\t\t   if(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tarr.push(checkStatus.data[i].id);\n\t\t\t\t\t}\n\t\t\t\t   }\n\t\t\t\t   $(\"#select_data\").val(arr);\n\t\t\t\t   \n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tform.on('submit(search)', function(data){\n\t\t\t\t\t\n\t\t\t\t\ttable.reload('jizhi_table', {\n\t\t\t\t\t  url: window.location.href+'?ajax=1'\n\t\t\t\t\t  ,where: data.field //设定异步数据接口的额外参数\n\t\t\t\t\t \n\t\t\t\t\t});\n\t\t\t\t   \n\t\t\t\t\treturn false;\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t   \n\t\t\t  \n\t\t\t \n              \n            });\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t function delAll() {\n\t\t\t\t\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\tlayer.alert('{fun JZLANG('请选择对象！')}');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？删除后不可恢复！')}',function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Recycle/delAll')}\",{data:data},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('批量删除成功')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t function restoreAll(){\n\n\t\t\t\tvar data = $(\"#select_data\").val();\n\t\t\t\tif(data==''){\n\t\t\t\t\tlayer.alert('{fun JZLANG('请选择对象')}！');return false;\n\t\t\t\t}\n\t\t\t\tlayer.confirm('{fun JZLANG('确认要还原吗？')}['+data+']',function(index){\n\t\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Recycle/restoreAll')}\",{data:data},function(r){\n\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  layer.msg('{fun JZLANG('操作成功！')}', {icon: 1,time:1000},function(){\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t  });\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t});\n\t\t\t  }\n\t\t\t  \n\t\t\t  \n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/restrucfields.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('系统扩展')}</cite></a>\n              <a><cite>{fun JZLANG('模型管理')}</cite></a>\n              <a><cite>{fun JZLANG('重构字段')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n        \n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t<blockquote class=\"layui-elem-quote\">\n\t\t\t{fun JZLANG('重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。')}<br/>\n\t\t\t{fun JZLANG('重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改')}<br/>\n\t\t\t{fun JZLANG('温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。')}\n\t\t\t</blockquote>\n                <form class=\"layui-form\">\n            <table class=\"layui-table\">\n                <thead>\n                    <tr>\n                        \n                        <th>\n                            {fun JZLANG('字段标识')}\n                        </th>\n                        <th>\n                            {fun JZLANG('数据类型')}\n                        </th>\n                        <th>\n                            {fun JZLANG('字段名称')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('录入类型')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('前台显示')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('后台显示')}\n                        </th>\n                        <th>\n                            {fun JZLANG('列表显示')}\n                        </th>\n                    </tr>\n                </thead>\n                <tbody id=\"x-link\">\n\t\t\t\t  {foreach $fields as $v}\n                    <tr>\n                        <input name=\"len[]\"  type=\"hidden\"  value=\"{$v['length']}\" />\n                        <input name=\"molds\"  type=\"hidden\"  value=\"{$molds}\" />\n                        <td>\n                            {$v['field']}\n                            <input name=\"field[]\"  type=\"hidden\"  value=\"{$v['field']}\" />\n                        </td>\n                        <td>\n                            {$v['type']}\n\n                        </td>\n                        <td>\n                            <input name=\"title[]\"  class=\"layui layui-input\"type=\"text\"  value=\"{$v['title']}\" />\n                        </td>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<td>\n                           <select name=\"fieldtype[]\" >\n\t\t\t\t\t\t   {foreach $fieldstype as $sk=>$s}\n\t\t\t\t\t\t   <option {if($v['fieldtype']==$sk)}selected{/if} value=\"{$sk}\">{$s}</option>\n\t\t\t\t\t\t   {/foreach}\n\t\t\t\t\t\t   </select>\n                        </td>\n\t\t\t\t\t\t<td>\n                           <select name=\"isshow[]\" >\n\t\t\t\t\t\t   <option {if($v['isshow']==1)}selected{/if} value=\"1\">{fun JZLANG('显示')}</option>\n\t\t\t\t\t\t   <option {if($v['isshow']==0)}selected{/if} value=\"0\">{fun JZLANG('隐藏')}</option>\n\t\t\t\t\t\t   </select>\n              \n                        </td>\n\t\t\t\t\t\t<td>\n                           <select name=\"isadmin[]\" >\n\t\t\t\t\t\t   <option {if($v['isadmin']==1)}selected{/if} value=\"1\">{fun JZLANG('显示')}</option>\n\t\t\t\t\t\t   <option {if($v['isadmin']==0)}selected{/if} value=\"0\">{fun JZLANG('隐藏')}</option>\n\t\t\t\t\t\t   </select>\n              \n                        </td>\n\t\t\t\t\t\t<td>\n                           <select name=\"islist[]\" >\n\t\t\t\t\t\t   <option {if($v['islist']==1)}selected{/if} value=\"1\">{fun JZLANG('显示')}</option>\n\t\t\t\t\t\t   <option {if($v['islist']==0)}selected{/if} value=\"0\">{fun JZLANG('隐藏')}</option>\n\t\t\t\t\t\t   </select>\n              \n                        </td>\n\t\t\t\t\t\t\n                    </tr>\n\t\t\t\t\t{/foreach}\n                </tbody>\n            </table>\n                    <button class=\"layui-btn\" lay-submit type=\"button\" lay-filter=\"tj\">{fun JZLANG('提交')}</button>\n                </form>\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n          \n        </div>\n     \n       <script>\n\t  \n\t    layui.use(['laydate','element','laypage','layer','form'], function(){\n                $ = layui.jquery;//jquery\n             var laydate = layui.laydate;//日期插件\n             var lement = layui.element;//面包导航\n             var layer = layui.layer;//弹出层\n             var form = layui.form;\n\n              //以上模块根据需要引入\n            form.on('submit(tj)', function(data){\n                $.post(\"{fun U('restrucfields')}\",data.field,function(r){\n                    if(r.code==0){\n                        layer.msg(r.msg,{icon: 6,time: 2000},function(){\n                            window.location.href=r.url;\n                        })\n                    }else{\n                        layer.alert(r.msg);\n                    }\n                },'json')\n            })\n             \n              \n            });\n\t\t /*删除*/\n            function molds_del(obj,id){\n                layer.confirm('{fun JZLANG('确认要删除吗？删除的同时将删除对应的表！')}',function(index){\n\t\t\t\t\n\t\t\t\t\t$.get(\"{fun U('deleteMolds')}?id=\"+id,{},function(s){\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar r = JSON.parse(s);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\tlayer.alert(r.msg, {icon: 1,time:1000},function () {\n\t\t\t\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n                   \n                });\n            }\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/ruler-add.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n  {include=\"style\"}\n \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\">\n\t\t\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t<!--li>扩展信息</li-->\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t\n\t\t<div class=\"layui-form-item\">\n\t\t\t<label for=\"pid\" class=\"layui-form-label\">\n\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择上级')}\n\t\t\t</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<select name=\"pid\" id=\"pid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('顶级')}</option>\n\t\t\t   {foreach $rulers as $v}\n\t\t\t   <option {if($pid==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t   {/foreach}\n\t\t\t\n\t\t\t   </select>\n\t\t\t</div>\n        </div>\n\t\t <div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('功能')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                 \n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"fc\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('函数名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"fc\" name=\"fc\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG('对应的控制器/函数，如果是顶级，则只需要写控制器名')}\n              </div>\n          </div>\n\t\t  \n\t\t\n\t\t  <div class=\"layui-form-item\" pane>\n\t\t\t\t<label for=\"sys\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('归属')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<input type=\"radio\" name=\"sys\" value=\"0\" title=\"{fun JZLANG('插件')}\" checked>\n\t\t\t\t\t<input type=\"radio\" name=\"sys\" value=\"1\" title=\"{fun JZLANG('系统')}\" >\n\t\t\t\t</div>\n\t\t\t\t \n\t\t\t\t\n\t\t  </div>\n\t\t  <div class=\"layui-form-item\" pane>\n\t\t\t\t<label for=\"isdesktop\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('独立功能')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<input type=\"radio\" name=\"isdesktop\" value=\"0\" title=\"{fun JZLANG('否')}\" checked>\n\t\t\t\t\t<input type=\"radio\" name=\"isdesktop\" value=\"1\" title=\"{fun JZLANG('是')}\" >\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG('桌面管理配置时，将调用独立功能')}\n\t\t\t\t</div>\n\t\t\t\t\n\t\t  </div>\n\t\t  \n\t\t  {if($webconf['isrelative']==1)}\n\t\t\t<span id=\"ext_fields\"></span>\n\t\t  {/if}\n\t\t  \n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\n\t\t\t\t{if($webconf['isrelative']==0)}\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t</div>\n\t\t\t\t\n\t\t\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n              \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('添加')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n\t{include=\"fields\"}\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n         get_fields(0);\n\t\t\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t\t\t$.post('{fun U('Rulers/addrulers')}',data.field,function(r){\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\tr = JSON.parse(r);\n\n\t\t\t\t\t\tif(r.status==0){\n\t\t\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t\t\t  icon:5\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('添加成功！')}', {\n\t\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t\t  {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t\t\t  window.location.href=\"{fun U('Rulers/index')}\";\n\t\t\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t  parent.location.reload();\n\t\t\t\t\t\t\t\t  parent.layer.close(index);\n\t\t\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t}\n\t\t\t\t\t});\n                return false;\n          });\n\t\t  \n\t\t   \n          \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/ruler-edit.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n  {include=\"style\"}\n    \n  </head>\n  \n  <body>\n    <div class=\"x-body\">\n        <form class=\"layui-form layui-form-pane\">\n\t\t<div class=\"layui-tab\">\n\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t<li class=\"layui-this\">{fun JZLANG('基本信息')}</li>\n\t\t\t\t<!--li>扩展信息</li-->\n\t\t\t\t\n\t\t\t  </ul>\n\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t<div class=\"layui-tab-item layui-show\">\n\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t<label for=\"pid\" class=\"layui-form-label\">\n\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('选择上级')}\n\t\t\t</label>\n\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t<select name=\"pid\" id=\"pid\" >\n\t\t\t   <option value=\"0\">{fun JZLANG('顶级')}</option>\n\t\t\t   {foreach $rulers as $v}\n\t\t\t   <option {if($data['pid']==$v['id'])} selected=\"selected\" {/if}  value=\"{$v['id']}\">{$v['name']}</option>\n\t\t\t   {/foreach}\n\t\t\t\n\t\t\t   </select>\n\t\t\t</div>\n        </div>\n\t\t <div class=\"layui-form-item\">\n              <label for=\"name\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('功能')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"name\" name=\"name\" value=\"{$data['name']}\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                 \n              </div>\n          </div>\n          <div class=\"layui-form-item\">\n              <label for=\"fc\" class=\"layui-form-label\">\n                  <span class=\"x-red\">*</span>{fun JZLANG('函数名')}\n              </label>\n              <div class=\"layui-input-inline\">\n                  <input type=\"text\" id=\"fc\" name=\"fc\" value=\"{$data['fc']}\" required=\"\" lay-verify=\"required\"\n                  autocomplete=\"off\" class=\"layui-input\">\n              </div>\n              <div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG('对应的控制器/函数，如果是顶级，则只需要写控制器名')}\n              </div>\n          </div>\n\t\t  \n\t\t\n\t\t  <div class=\"layui-form-item\" pane>\n                    <label for=\"sys\" class=\"layui-form-label\">\n                        <span class=\"x-red\"></span>{fun JZLANG('归属')}\n                    </label>\n                    <div class=\"layui-input-inline\">\n                        <input type=\"radio\" name=\"sys\" value=\"0\" title=\"{fun JZLANG('插件')}\" {if($data['sys']==0)}checked{/if}>\n\t\t\t\t\t\t<input type=\"radio\" name=\"sys\" value=\"1\" title=\"{fun JZLANG('系统')}\" {if($data['sys']==1)}checked{/if}>\n                    </div>\n\t\t\t\t\t \n\t\t\t\t\t\n          </div>\n\t\t   <div class=\"layui-form-item\" pane>\n\t\t\t\t<label for=\"isdesktop\" class=\"layui-form-label\">\n\t\t\t\t\t<span class=\"x-red\"></span>{fun JZLANG('独立功能')}\n\t\t\t\t</label>\n\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t<input type=\"radio\" name=\"isdesktop\" value=\"0\" title=\"{fun JZLANG('否')}\" {if($data['isdesktop']==0)}checked{/if}>\n\t\t\t\t\t<input type=\"radio\" name=\"isdesktop\" value=\"1\" title=\"{fun JZLANG('是')}\" {if($data['isdesktop']==1)}checked{/if}>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n                {fun JZLANG('桌面管理配置时，将调用独立功能')}\n\t\t\t\t</div>\n\t\t\t\t\n\t\t  </div>\n\t\t\t\t{if($webconf['isrelative']==1)}\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t{if($webconf['isrelative']==0)}\n\t\t\t\t<span id=\"ext_fields\"></span>\n\t\t\t\t{/if}\n\t\t\t\t\n\t\t\t\t</div>\n\t\t\t  </div>\n\t\t</div>\n\t\t\n\t\t\n          <input type=\"hidden\" id=\"go\" name=\"go\" value=\"1\">\n          <input type=\"hidden\" id=\"id\" name=\"id\" value=\"{$data['id']}\">\n          <div class=\"layui-form-item\" style=\"text-align:center;\">\n            \n              <button  class=\"layui-btn\" lay-filter=\"add\" lay-submit=\"\">\n                  {fun JZLANG('修改')}\n              </button>\n          </div>\n      </form>\n    </div>\n    <script>\n{include=\"fields\"}\n        layui.use(['form','layer','upload'], function(){\n            $ = layui.jquery;\n          var form = layui.form\n          ,layer = layui.layer;\n         var upload = layui.upload;\n         \n\t\t\n\t\tget_fields(0,{$data['id']});\n          //监听提交\n          form.on('submit(add)', function(data){\n            \n\t\t\t$.post('{fun U('Rulers/editrulers')}',data.field,function(r){\n\t\t\t\n\t\t\t\t\n\t\t\t\tr = JSON.parse(r);\n\t\t\t\t\n\t\t\t\tif(r.status==0){\n\t\t\t\t\tlayer.msg(r.info, {\n\t\t\t\t\t  icon:5\n\t\t\t\t\t});\n\t\t\t\t}else{\n\t\t\t\t\tlayer.msg('{fun JZLANG('修改成功！')}', {\n\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t},function(){\n\t\t\t\t\t\t  {if($webconf['admintpl']=='tpl')}\n\t\t\t\t\t\t   window.location.href=\"{fun U('Rulers/index')}\";\n\t\t\t\t\t\t  {else}\n\n                           parent.layer.closeAll();\n\t\t\t\t\t\t  {/if}\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn false;\n          });\n\t\t \n          \n        });\n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/ruler-list.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n\t<meta charset=\"UTF-8\">\n        {include=\"style\"}\n    </head>\n    <body>\n        <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>{fun JZLANG('首页')}</cite></a>\n              <a><cite>{fun JZLANG('扩展管理')}</cite></a>\n              <a><cite>{fun JZLANG('权限列表')}</cite></a>\n              \n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n          \n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t <xblock>\n\t\t\t<form class=\"layui-form\" action=\"\">\n\t\t\t {if(checkAction('Rulers/addrulers'))}\n\t\t\t <a class=\"layui-btn layui-btn-sm\" onclick=\"x_admin_show('{fun JZLANG('添加权限')}','{fun U('Rulers/addrulers')}')\">{fun JZLANG('添加权限')}</a>\n\t\t\t {/if}\n\t\t\t  <div class=\"layui-input-inline\" style=\"float: right;\">\n\t\t\t\t  <input type=\"checkbox\" value=\"1\" name=\"switch\" lay-filter=\"type\"  lay-text=\"{fun JZLANG('展开|折叠')}\" lay-skin=\"switch\">\n\t\t\t  </div>\n\t\t\t</form>\n\t\t\t</xblock>\n            <table class=\"layui-table\">\n                <thead>\n                    <tr>\n                        \n                        <th>\n                            ID\n                        </th>\n                       \n                        <th>\n                            {fun JZLANG('功能')}\n                        </th>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('控制器/方法')}\n                        </th>\n\t\t\t\t\t\t<th>\n                            {fun JZLANG('归属')}\n                        </th>\n                        <th>\n                            {fun JZLANG('操作')}\n                        </th>\n                    </tr>\n                </thead>\n                <tbody class=\"x-cate\">\n\t\t{foreach $lists as $v}\n          <tr cate-id=\"{$v['id']}\" fid=\"{$v['pid']}\" {if($v['pid']!=0)}style=\"display:none;\"{/if}>\n            \n\t\t\t\n            <td>{$v['id']}</td>\n            <td>\n\t\t\t  {fun str_repeat('&nbsp;&nbsp;&nbsp;',$v['level'])}\n\t\t\t  {if($v['haschild'])}\n\t\t\t  <i class=\"layui-icon x-show\" status='true'>&#xe623;</i>\n\t\t\t  {else}\n\t\t\t  {if($v['level'])}|——{/if}\n\t\t\t  {/if}\n\t\t\t  {fun JZLANG($v['name'])}\n            </td>\n\t\t\t<td>{$v['fc']}</td>\n\t\t\t<td class=\"td-status\" >\n\t\t\t{if($v['sys']==1)}<span class=\"layui-badge layui-bg-gray\">{fun JZLANG('系统')}</span>{else}<span class=\"layui-badge layui-bg-orange\">{fun JZLANG('插件')}</span>{/if}\n             </td>\n            <td class=\"td-manage\">\n\t\t\t{if(checkAction('Rulers/editrulers'))}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('编辑')}','{fun U('Rulers/editrulers',array('id'=>$v['id']))}')\" >{fun JZLANG('编辑')}</a>\n\t\t\t{/if}\n\t\t\t{if(checkAction('Rulers/addrulers'))}\n\t\t\t\t{if($v['pid']==0)}\n\t\t\t\t<a class=\"layui-btn layui-btn-warm layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('添加子功能')}','{fun U('Rulers/addrulers',array('pid'=>$v['id']))}')\" >{fun JZLANG('添加子功能')}</a>\n\t\t\t\t{/if}\n\t\t\t{/if}\n\t\t\t{if(checkAction('Rulers/deleterulers'))}\n              <a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"ruler_del(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t{/if}\n            </td>\n          </tr>\n\t\t {/foreach}\n         \n        </tbody>\n            </table>\n\t\t\t\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t\t  \n         \n\t\t\t\n            \n        </div>\n     \n       <script>\n\t  \n\t   \n\t    layui.use(['laydate','form','element','laypage','layer'], function(){\n                $ = layui.jquery;//jquery\n              laydate = layui.laydate;//日期插件\n              lement = layui.element;//面包导航\n            //  laypage = layui.laypage;//分页\n              layer = layui.layer;//弹出层\n\t\t\t  form = layui.form;\n             \n              form.on('select(tid)', function(data){\n\t\t\t\t\t\n\t\t\t\t\t$(\"#myform\").submit();\n\t\t\t\t\n\t\t\t });\n              form.on('switch(type)', function(data){\n\t\t\t\tif(!data.elem.checked){\n\t\t\t\t\t$(\".x-cate tr\").each(function(){\n\t\t\t\t\t\tif($(this).attr('fid')!=0){\n\t\t\t\t\t\t\t$(this).css('display','none');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t$(\".x-show\").attr('status','true').html('&#xe623;');\n\t\t\t\t}else{\n\t\t\t\t\t\n\t\t\t\t\t$(\".x-cate tr\").each(function(){\n\t\t\t\t\t\tif($(this).attr('fid')!=0){\n\t\t\t\t\t\t\t$(this).css('display','table-row');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t$(\".x-show\").attr('status','false').html('&#xe625;');\n\t\t\t\t}\n\t\t\t});  \n              \n            });\n\t\t /*删除*/\n            function ruler_del(obj,id){\n                layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t\t\n\t\t\t\t\t$.post(\"{fun U('Rulers/deleterulers')}\",{id:id},function(r){\n\t\t\t\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t //发异步删除数据\n\t\t\t\t\t\t\t\t$(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 1,time:1000});\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\n                   \n                });\n            }\n\t\t\t\n\t\t\t\n\t\t\t\n       </script>\n    </body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/showlabel.html",
    "content": "<!DOCTYPE html>\n<html>\n    \n    <head>\n       <meta charset=\"UTF-8\">\n        {include=\"style\"}\n\t\t<style>\n\t\t.layui-code-view .layui-code-ol li{\n\t\t    font-size: 15px;\n/*line-height: 40px !important;*/\n\t\t}\n\t\t</style>\n    </head>\n    \n    <body>\n\t <div class=\"x-nav\">\n            <span class=\"layui-breadcrumb\">\n              <a><cite>首页</cite></a>\n              <a><cite>系统扩展</cite></a>\n             \n\t\t\t <a><cite>模板制作手册</cite></a>\n            </span>\n            <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"刷新\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n        </div>\n        <div class=\"x-body\">\n\t\t\t<div class=\"layui-row\">\n\t\t\t\t<form class=\"layui-form\" >\n\t\t\t\t<div class=\"layui-tab-content\">\n\t\t\t\t<input type=\"hidden\" name=\"go\" value=\"1\" />\n\t\t\t\t\n\t\t\t\t<div class=\"layui-tab\">\n\t\t\t\t\t  <ul class=\"layui-tab-title\">\n\t\t\t\t\t    <li class=\"layui-this\">标签生成</li>\n\t\t\t\t\t\t<li>公共配置输出</li>\n\t\t\t\t\t\t<li>栏目相关输出</li>\n\t\t\t\t\t\t<li>文章详情输出</li>\n\t\t\t\t\t\t<li>商品详情输出</li>\n\t\t\t\t\t\t<li>友情链接输出</li>\n\t\t\t\t\t\t<li>轮播图输出</li>\n\t\t\t\t\t\t<li>loop标签解析</li>\n\t\t\t\t\t\t<li>常用标签</li>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t  </ul>\n\t\t\t\t\t  <div class=\"layui-tab-content\">\n\t\t\t\t\t   <!--标签生成-->\n\t\t\t\t\t  <div class=\"layui-tab-item  layui-show\">\n\t\t\t\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t\t\t文章模块标签生成\n\t\t\t\t\t\t\t  <div class=\"layui-input-block\" style=\"margin-left:0;\">\n\t\t\t\t\t\t\t\t  <table class=\"layui-table\">\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t  <tr>\n\t\t\t\t\t\t\t\t\t\t<td>选择栏目</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>是否分页</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>输出子类数据</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>排序</td>\n\t\t\t\t\t\t\t\t\t\t<td>输出条数</td>\n\t\t\t\t\t\t\t\t\t\t<td>操作</td>\n\t\t\t\t\t\t\t\t\t  </tr>\n\t\t\t\t\t\t\t\t\t  <tr>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<select name=\"type_tid\" lay-filter=\"type_tid\" id=\"type_tid\" >\n\t\t\t\t\t\t\t\t\t\t<option value=\"\">选择栏目</option>\n\t\t\t\t\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t\t\t\t\t\t{if($v['molds']=='article')}\n\t\t\t\t\t\t\t\t\t   <option  value=\"{$v['id']}-{$v['molds']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t   {/foreach}\n\t\t\t\t\t\t\t\t\t   </select>\n\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<select name=\"type_ispage\" lay-filter=\"type_ispage\"  >\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">是否分页</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"1\" selected>否</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"2\">是</option>\n\t\t\t\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<select name=\"type_isall\" lay-filter=\"type_isall\"  >\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">输出子类</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"1\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"2\" selected>是</option>\n\t\t\t\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<select name=\"type_orderby\" lay-filter=\"type_orderby\">\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">排序</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">默认</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"id desc\">ID倒序(大靠前)</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"id asc\">ID正序(小靠前)</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"addtime desc\">时间倒序(新靠前)</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"addtime asc\">时间正序(新靠后)</option>\n\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td><input type=\"text\" id=\"type_limit\" value=\"10\" placeholder=\"条数\" name=\"type_limit\" autocomplete=\"off\" class=\"layui-input\"></td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<button  class=\"layui-btn\" lay-filter=\"type_save\" lay-submit=\"\">生成</button></td>\n\t\t\t\t\t\t\t\t\t  </tr>\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t  </table>\n\t\t\t\t\t\t\t\t  <pre id=\"lable_type\" ></pre>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t 商品模块标签生成\n\t\t\t\t\t\t\t  <div class=\"layui-input-block\" style=\"margin-left:0;\">\n\t\t\t\t\t\t\t\t  <table class=\"layui-table\">\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t  <tr>\n\t\t\t\t\t\t\t\t\t\t<td>选择栏目</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>是否分页</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>输出子类数据</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>排序</td>\n\t\t\t\t\t\t\t\t\t\t<td>输出条数</td>\n\t\t\t\t\t\t\t\t\t\t<td>操作</td>\n\t\t\t\t\t\t\t\t\t  </tr>\n\t\t\t\t\t\t\t\t\t  <tr>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<select name=\"product_tid\" lay-filter=\"product_tid\" id=\"product_tid\" >\n\t\t\t\t\t\t\t\t\t\t<option value=\"\">选择栏目</option>\n\t\t\t\t\t\t\t\t\t   {foreach $classtypes as $v}\n\t\t\t\t\t\t\t\t\t\t{if($v['molds']=='product')}\n\t\t\t\t\t\t\t\t\t   <option  value=\"{$v['id']}-{$v['molds']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t   {/foreach}\n\t\t\t\t\t\t\t\t\t   </select>\n\t\t\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t\t\t\t</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<select name=\"product_ispage\" lay-filter=\"product_ispage\"  >\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">是否分页</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"1\" selected>否</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"2\">是</option>\n\t\t\t\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<select name=\"product_isall\" lay-filter=\"product_isall\"  >\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">输出子类</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"1\">否</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"2\" selected>是</option>\n\t\t\t\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t</div></td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<select name=\"product_orderby\" lay-filter=\"product_orderby\">\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">排序</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">默认</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"id desc\">ID倒序(大靠前)</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"id asc\">ID正序(小靠前)</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"addtime desc\">时间倒序(新靠前)</option>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"addtime asc\">时间正序(新靠后)</option>\n\t\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td><input type=\"text\" id=\"product_limit\" value=\"10\" placeholder=\"条数\" name=\"product_limit\" autocomplete=\"off\" class=\"layui-input\"></td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t<button  class=\"layui-btn\" lay-filter=\"product_save\" lay-submit=\"\">生成</button></td>\n\t\t\t\t\t\t\t\t\t  </tr>\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t  </table>\n\t\t\t\t\t\t\t\t  <pre id=\"lable_product\" ></pre>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t    </div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t  <blockquote class=\"layui-elem-quote\">扩展配置统一使用规则：      标签值{!--$customconf[配置参数]--}  或者    通过方法获取标签值{!--fun get_custom(配置参数)--}</blockquote>\n\t\t\t\t\t\t    \t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t\t<legend>自定义配置</legend>\n\t\t\t\t\t\t\t\t\t<div class=\"layui-field-box\">\n\t\t\t\t\t\t\t\t\t{loop table=\"sysconfig\" orderby=\"id asc\" notin=\"type|0\" as=\"v\"}\n\t\t\t\t\t\t\t\t\t{$v['title']}<pre class=\"layui-code\">{!--$customconf['{$v['field']}']--}</pre>\n\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t\t<blockquote class=\"layui-elem-quote\">系统配置统一使用规则：{!--$webconf[配置参数]--}  或者    通过方法获取{!--fun webConf(配置参数)--}\n\t\t\t\t\t\t\t\t</blockquote>\n\t\t\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t\t<legend>系统配置</legend>\n\t\t\t\t\t\t\t\t\t<div class=\"layui-field-box\">\n\t\t\t\t\t\t\t\t\t{loop table=\"sysconfig\" orderby=\"id asc\" type=\"0\" as=\"v\"}\n\t\t\t\t\t\t\t\t\t{$v['title']}<pre class=\"layui-code\">{!--$webconf['{$v['field']}']--}</pre>\n\t\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>全局栏目属性输出</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t  所谓全局也就是整个前台模板体系里都能够使用的标签\n\t\t\t\t\t\t\t  <pre class=\"layui-code\">{!--$classtypedata[$id][$str]--}\n\t\t\t\t\t\t\t  $id:栏目的ID\n\t\t\t\t\t\t\t  $str:栏目对应的字段参数\n\t\t\t\t\t\t\t  如：针对于栏目ID等于1的栏目，我们可以这样输出以下内容：\n\t\t\t\t\t\t\t  栏目名：{!--$classtypedata[1]['classname']--}\n\t\t\t\t\t\t\t\t模块标识：{!--$classtypedata[1]['molds']--}\n\t\t\t\t\t\t\t\t缩略图：{!--$classtypedata[1]['litpic']--}\n\t\t\t\t\t\t\t\t当前栏目URL：{!--$classtypedata[1]['url']--}\n\t\t\t\t\t\t\t\t描述：{!--$classtypedata[1]['description']--}\n\t\t\t\t\t\t\t\t关键词：{!--$classtypedata[1]['keywords']--}\n\t\t\t\t\t\t\t\t内容：{!--$classtypedata[1]['body']--}\n\t\t\t\t\t\t\t\t列表输出条数：{!--$classtypedata[1]['lists_num']--}\n\t\t\t\t\t\t\t\t栏目评论数：{!--$classtypedata[1]['comment_num']--}\n\t\t\t\t\t\t\t\t上级栏目ID：{!--$classtypedata[1]['pid']--}\n\t\t\t\t\t\t\t\t上级栏目名：{!--$classtypedata[$classtypedata[1]['pid']]['classname']--}\n\t\t\t\t\t\t\t\t上级栏目URL：{!--$classtypedata[$classtypedata[1]['pid']]['url']--}</pre>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>导航高亮及输出</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t  推荐使用，执行速度快，性能高\n\t\t\t\t\t\t\t  <pre class=\"layui-code\">//判断是否首页，输出高亮代码\n\t\t\t\t\t\t\t\t<li><a class=\"a1 {!--if(!isset($type))--}color{!--/if--}\" href=\"/\">首页</a></li>\n\t\t\t\t\t\t\t\t{!--foreach $classtypedata as $v--} \n\t\t\t\t\t\t\t\t//判断输出可显示的栏目\n\t\t\t\t\t\t\t\t{!--if($v['isshow']==1)--}\n\t\t\t\t\t\t\t\t//输出一级栏目\n\t\t\t\t\t\t\t\t{!--if($v['pid']==0)--}  \n\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t//判断是否当前栏目，输出高亮代码\n\t\t\t\t\t\t\t\t<a class=\"a1 {!--if(isset($type) && in_array($type['id'],$v['children']['ids']))--}color{!--/if--}\" href=\"{!--$v['url']--}\">{!--$v['classname']--}</a>\n\t\t\t\t\t\t\t\t//判断是否有下级，输出下级分类\n\t\t\t\t\t\t\t\t{!--if($v['haschild'])--}\n\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t{!--foreach $v['children']['list'] as $vv--}\n\t\t\t\t\t\t\t\t<li><a href=\"{!--$vv['url']--}\">{!--$vv['classname']--}</a></li>\n\t\t\t\t\t\t\t\t{!--/foreach--}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t\t{!--/foreach--}</pre>\n\t\t\t\t\t\t\t\t不推荐使用，但也能实现.【loop遍历】\n\t\t\t\t\t\t\t\t<pre class=\"layui-code\">{!--loop table=\"classtype\" isshow=\"1\" pid=\"0\" as=\"v\"--}\n\t\t\t\t\t\t\t\t栏目名：{!--$v['classname']--}\n\t\t\t\t\t\t\t\t栏目URL：{!--$v['url']--}\n\t\t\t\t\t\t\t\t栏目简介：{!--$v['description']--}\n\t\t\t\t\t\t\t\t栏目缩略图[banner]：{!--$v['litpic']--}\n\t\t\t\t\t\t\t\t判断是否有下级：\n\t\t\t\t\t\t\t\t{!--if(haschild($classtypedata,$v['id']))--}\n\t\t\t\t\t\t\t\t有下级则输出，输出下级栏目\n\t\t\t\t\t\t\t\t{!--foreach $classtypedata[$v['id']]['children']['list'] as $vv--}\n\t\t\t\t\t\t\t\t\t栏目名：{!--$vv['classname']--}\n\t\t\t\t\t\t\t\t\t栏目URL：{!--$vv['url']--}\n\t\t\t\t\t\t\t\t\t栏目简介：{!--$vv['description']--}\n\t\t\t\t\t\t\t\t\t栏目缩略图[banner]：{!--$vv['litpic']--}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{!--/foreach--}\n\t\t\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t\t\t没有下级则输出\n\t\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t\t{!--/loop--}</pre>\n\t\t\t\t\t\t\t\t输出下级栏目的方式（两种）\n\t\t\t\t\t\t\t\t<pre class=\"layui-code\">①推荐使用.如输出栏目ID为1的下级栏目\n\t\t\t\t\t\t\t\t{!--foreach $classtypedata[1]['children']['list'] as $v--}\n\t\t\t\t\t\t\t\t{!--/foreach--}\n\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t\t<pre class=\"layui-code\">②不推荐，但是也能输出loop\n\t\t\t\t\t\t\t\t{!--loop table=\"classtype\" pid=\"2\" isshow=\"1\" as=\"v\"}\n\t\t\t\t\t\t\t\t栏目名：{!--$v['classname']--}\n\t\t\t\t\t\t\t\t栏目URL：{!--$v['url']--}\n\t\t\t\t\t\t\t\t栏目简介：{!--$v['description']--}\n\t\t\t\t\t\t\t\t栏目缩略图[banner]：{!--$v['litpic']--}\n\t\t\t\t\t\t\t\t{!--/loop--}</pre>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>输出当前栏目下的同级分类</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t  <pre class=\"layui-code\">{!--foreach $classtypedata as $v--}\n\t\t\t\t\t\t\t  {!--if($type['pid']==$v['pid'])--}//父类相同，那么他们就是同级了，需要注意的是当前栏目为顶级栏目(pid=0)的时候是输出所有顶级栏目的\n\t\t\t\t\t\t\t  栏目名：{!--$v['classname']--}   栏目链接：{!--$v['url']--}\n\t\t\t\t\t\t\t  {!--/if--}\n\t\t\t\t\t\t\t  {!--/foreach--}</pre>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>输出当前栏目下的直系上级同级分类</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t  <pre class=\"layui-code\">{!--foreach $classtypedata as $v--}\n\t\t\t\t\t\t\t  {!--if($classtypedata[$type['pid']]['pid']==$v['pid'])--}//父类相同，那么他们就是同级了，需要注意的是当前栏目为顶级栏目(pid=0)的时候是输出所有顶级栏目的\n\t\t\t\t\t\t\t  栏目名：{!--$v['classname']--}   栏目链接：{!--$v['url']--}\n\t\t\t\t\t\t\t  {!--/if--}\n\t\t\t\t\t\t\t  {!--/foreach--}</pre>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>栏目详情页输出</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t  基本信息输出\n\t\t\t\t\t\t\t\t<pre class=\"layui-code\">ID：{!--$type['id']--}\n\t\t\t\t\t\t\t\t当前位置：{!--$positions--}\n\t\t\t\t\t\t\t\t栏目名：{!--$type['classname']--}\n\t\t\t\t\t\t\t\t模块标识：{!--$type['molds']--}\n\t\t\t\t\t\t\t\t缩略图：{!--$type['litpic']--}\n\t\t\t\t\t\t\t\t当前栏目URL：{!--$type['url']--} 或 {!--$classtypedata[type['id']]['url']--}\n\t\t\t\t\t\t\t\t描述：{!--$type['description']--}\n\t\t\t\t\t\t\t\t关键词：{!--$type['keywords']--}\n\t\t\t\t\t\t\t\t内容：{!--$type['body']--}\n\t\t\t\t\t\t\t\t列表输出条数：{!--$type['lists_num']--}\n\t\t\t\t\t\t\t\t栏目评论数：{!--$type['comment_num']--}\n\t\t\t\t\t\t\t\t上级栏目ID：{!--$type['pid']--}\n\t\t\t\t\t\t\t\t上级栏目名：{!--$classtypedata[$type['pid']]['classname']--}\n\t\t\t\t\t\t\t\t上级栏目URL：{!--$classtypedata[$type['pid']]['url']--}</pre>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>栏目列表输出</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<pre class=\"layui-code\">{!--foreach $lists as $v--}\n\t\t\t\t\t\t\t\t内容输出规则：{!--$v[字段名]--}\n\t\t\t\t\t\t\t\t标题：{!--$v['title']--}\n\t\t\t\t\t\t\t\t内容链接:{!--$v['url']--}\n\t\t\t\t\t\t\t\t热度/点击量:{!--$v['hits']--}\n\t\t\t\t\t\t\t\t评论数:{!--$v['comment_num']--}\n\t\t\t\t\t\t\t\t所属栏目id:{!--$v['tid']--}\n\t\t\t\t\t\t\t\t所属栏目名:{!--$classtypedata[$v['tid']]['classname']--}\n\t\t\t\t\t\t\t\t所属栏目URL:{!--$classtypedata[$v['tid']]['url']--}\n\t\t\t\t\t\t\t\t简介：{!--$v['description']--}\n\t\t\t\t\t\t\t\t链接：{!--$v['url']--}\n\t\t\t\t\t\t\t\t缩略图：{!--$v['litpic']--}\n\t\t\t\t\t\t\t\t内容：{!--$v['body']--}\n\t\t\t\t\t\t\t\t时间：[了解更多日期格式请查看底部附录]\n\t\t\t\t\t\t\t\t\t格式：年-月-日：{!--fun date('Y-m-d',$v['addtime'])--}\n\t\t\t\t\t\t\t\t\t格式：年-月-日 时:分:秒：{!--fun date('Y-m-d H:i:s',$v['addtime'])--}\n\t\t\t\t\t\t\t\t\t格式：年/月/日：{!--fun date('Y/m/d',$v['addtime'])--}\n\t\t\t\t\t\t\t\t{!--/foreach--}</pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>栏目分页输出</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<pre class=\"layui-code\">默认输出:\n\t\t\t\t\t\t\t\t{!--$pages--}\n\t\t\t\t\t\t\t\t自定义输出：\n\t\t\t\t\t\t\t\t{!--if($listpage['list'])--}//判断是否有分页数据\n\t\t\t\t\t\t\t\t<ul class=\"pagination\">\n\t\t\t\t\t\t<li class=\"page-item {!--if(!$listpage['prev'])--}disabled{!--/if--}\"><a class=\"page-link\" href=\"{!--$listpage['prev']--}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n\t\t\t\t\t\t{!--foreach $listpage['list'] as $ss--}\n\t\t\t\t\t\t<li class=\"page-item {!--if($ss['num']==$listpage['current_num'])--}active background{!--/if--}\"><a href=\"{!--$ss['url']--}\" class=\"page-link\">{!--$ss['num']--}</a></li>\n\t\t\t\t\t\t{!--/foreach--}\n\t\t\t\t\t\t<li class=\"page-item {!--if(!$listpage['next'])--}disabled{!--/if--}\"><a class=\"page-link\" href=\"{!--$listpage['next']--}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <!--文章-->\n\t\t\t\t\t  <div class=\"layui-tab-item\">\n\t\t\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t\t <blockquote class=\"layui-elem-quote\">$jz变量可以输出所有内容</blockquote>\n\t\t\t\t\t\t <blockquote class=\"layui-elem-quote\">内容页也可以使用$type调用栏目所有内容的哦~</blockquote>\n\t\t\t\t\t\t <pre class=\"layui-code\">文章标题：{!--$jz['title']--}\n\t\t\t\t\t\t 当前位置：{!--$positions--}\n\t\t\t\t\t\t 文章SEO标题：{!--$jz['seo_title']--}\n\t\t\t\t\t\t 文章关键词：{!--$jz['keywords']--}\n\t\t\t\t\t\t 文章点击量：{!--$jz['hits']--}自增操作{!--fun incrData('article',$jz['id'],'hits')--}\n\t\t\t\t\t\t 文章缩略图：{!--$jz['litpic']--}\n\t\t\t\t\t\t 文章简介：{!--$jz['description']--}\n\t\t\t\t\t\t 文章内容：{!--$jz['body']--}\n\t\t\t\t\t\t 文章作者：{!--fun adminInfo($jz['userid'],'name')--}\n\t\t\t\t\t\t 文章更新时间：{!--fun date('Y-m-d',$jz['addtime'])--}\n\t\t\t\t\t\t 其他字段内容统一输出：{!--$v[字段参数]--}\n\t\t\t\t\t\t *自定义当前位置：【不要求完全掌握，知道可以遍历输出面包屑导航即可】\n\t\t\t\t\t\t {!--loop $positions_data as $v--}\n\t\t\t\t\t\t {!--php echo '<a href=\"'.$v['url'].'\">'.$v['classname'].'</a>'/--}\n\t\t\t\t\t\t {!--/loop--}</pre>\n\t\t\t\t\t\t 上一页\n\t\t\t\t\t\t\t<pre class=\"layui-code\">判断是否有上一篇\n\t\t\t\t\t\t\t{!--if($aprev)--}\n\t\t\t\t\t\t\t上一篇链接：{!--$aprev['url']--}\n\t\t\t\t\t\t\t上一篇标题：{!--$aprev['title']--}\n\t\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t\t如果没有上一篇，则输出这里的内容\n\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t下一页\n\t\t\t\t\t\t<pre class=\"layui-code\">判断是否有下一篇\n\t\t\t\t\t\t{!--if($anext)--}\n\t\t\t\t\t\t\t下一篇的链接：{!--$anext['url']--}\n\t\t\t\t\t\t\t下一篇的标题：{!--$anext['title']--}\n\t\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t\t如果没有下一篇，则输出这里的内容\n\t\t\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\t点赞\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--if(checkLikes($type['id'],$jz['id']))--}\n\t\t\t\t\t\t<span style=\"color:#f00;cursor:pointer;\" onclick=\"likes({!--$type['id']--},{!--$jz['id']--})\" class=\"icon-like\">已点赞</span>\n\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t<span style=\"color:gray;cursor:pointer;\" onclick=\"likes({!--$type['id']--},{!--$jz['id']--})\" class=\"icon-like\">点赞</span>\n\t\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\t相关点赞js\n\t\t\t\t\t\t<pre class=\"layui-code\">function likes(tid,id){\n\t\t$.ajax({\n\t\t\t\t url:\"{!--fun U('user/likesAction')--}\",//请求的url地址\n\t\t\t\t dataType:\"json\",//返回格式为json\n\t\t\t\t async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n\t\t\t\t data:{tid:tid,id:id,ajax:1},//参数值\n\t\t\t\t type:\"POST\",//请求方式\n\t\t\t\t beforeSend:function(){\n\t\t\t\t\t//请求前的处理\n\t\t\t\t\t},\n\t\t\t\t\t success:function(r){\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t},\n\t\t\t\t\t complete:function(){\n\t\t\t\t\t//请求完成的处理\n\t\t\t\t\t},\n\t\t\t\t\t error:function(){\n\t\t\t\t\t//请求出错处理\n\t\t\t\t\t\talert('网络错误');\n\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t})\n\t}</pre>\n\t\t\t\t\t\t收藏\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--if(checkCollect($type['id'],$jz['id']))--}\n\t\t\t\t\t\t<span style=\"color:#f00;cursor:pointer;\" onclick=\"collect({!--$type['id']--},{!--$jz['id']--})\"  >已收藏</span>\n\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t<span style=\"color:gray;cursor:pointer;\" onclick=\"collect({!--$type['id']--},{!--$jz['id']--})\" >收藏</span>\n\t\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\t相关收藏js\n\t\t\t\t\t\t<pre class=\"layui-code\">function collect(tid,id){\n\t\t$.ajax({\n\t\t\t\t url:\"{!--fun U('user/collectAction')--}\",//请求的url地址\n\t\t\t\t dataType:\"json\",//返回格式为json\n\t\t\t\t async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n\t\t\t\t data:{tid:tid,id:id,ajax:1},//参数值\n\t\t\t\t type:\"POST\",//请求方式\n\t\t\t\t beforeSend:function(){\n\t\t\t\t\t//请求前的处理\n\t\t\t\t\t},\n\t\t\t\t\t success:function(r){\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t},\n\t\t\t\t\t complete:function(){\n\t\t\t\t\t//请求完成的处理\n\t\t\t\t\t},\n\t\t\t\t\t error:function(){\n\t\t\t\t\t//请求出错处理\n\t\t\t\t\t\talert('网络错误');\n\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t})\n\t}</pre>\n\t\t\t\t\t\t\n\t\t\t\t\t\t </div>\n\t\t\t\t\t   </div>\n\t\t\t\t\t    <!--商品-->\n\t\t\t\t\t  <div class=\"layui-tab-item\">\n\t\t\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t\t  <blockquote class=\"layui-elem-quote\">$jz变量可以输出所有内容</blockquote>\n\t\t\t\t\t\t  <blockquote class=\"layui-elem-quote\">内容页也可以使用$type调用栏目所有内容的哦~</blockquote>\n\t\t\t\t\t\t <pre class=\"layui-code\">商品标题：{!--$jz['title']--}\n\t\t\t\t\t\t 当前位置：{!--$positions--}\n\t\t\t\t\t\t 商品SEO标题：{!--$jz['seo_title']--}\n\t\t\t\t\t\t 商品关键词：{!--$jz['keywords']--}\n\t\t\t\t\t\t 商品点击量：{!--$jz['hits']--}自增操作{!--fun incrData('product',$jz['id'],'hits')--}\n\t\t\t\t\t\t 商品主图：{!--$jz['litpic']--}\n\t\t\t\t\t\t 商品价格：{!--$jz['price']--}\n\t\t\t\t\t\t 商品库存：{!--$jz['stock_num']--}\n\t\t\t\t\t\t 商品简介：{!--$jz['description']--}\n\t\t\t\t\t\t 商品内容：{!--$jz['body']--}\n\t\t\t\t\t\t 商品上传管理员：{!--fun adminInfo($jz['userid'],'name')--}\n\t\t\t\t\t\t 商品更新时间：{!--fun date('Y-m-d',$jz['addtime'])--}\n\t\t\t\t\t\t 其他字段内容统一输出：{!--$v[字段参数]--}\n\t\t\t\t\t\t *自定义当前位置：【不要求完全掌握，知道可以遍历输出面包屑导航即可】\n\t\t\t\t\t\t {!--loop $position_data as $v--}\n\t\t\t\t\t\t {!--php echo '<a href=\"'.$v['url'].'\">'.$v['classname'].'</a>'/--}\n\t\t\t\t\t\t {!--/loop--}</pre>\n\t\t\t\t\t\t 商品图集\n\t\t\t\t\t\t  <pre class=\"layui-code\">{!--php $pictures = explode('||',$jz['pictures'])/--}\n\t\t\t\t\t\t\t\t\t{!--foreach $pictures as $v--}\n\t\t\t\t\t\t\t\t\t{!--if($v!='')--}\n\t\t\t\t\t\t\t\t\t图片链接：{!--$v--}\t\n\t\t\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t\t\t{!--/foreach--}</pre>\n\t\t\t\t\t\t 商品属性\n\t\t\t\t\t\t <pre class=\"layui-code\">{!--php $product_fields = get_fields_show($jz['tid'],$type['molds'])/--}\n\t\t\t\t\t\t{!--foreach $product_fields as $v--}\n\t\t\t\t\t\t属性名：{!--$v['fieldname']--}\n\t\t\t\t\t\t{!--if($v['fieldtype']==7)--}\n\t\t\t\t\t\t<!--单选-->\n\t\t\t\t\t\t输出单选值：{!--fun get_key_field_select($jz[$v['field']],$type['molds'],$v['field'])--}\n\t\t\t\t\t\t{!--else if($v['fieldtype']==8)--}\n\t\t\t\t\t\t<!--多选-->\n\t\t\t\t\t\t输出多选值，并用空格分隔：{!--fun implode(' ',get_key_field_select($jz[$v['field']],$type['molds'],$v['field']))--}\n\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t<!--默认值-->\n\t\t\t\t\t\t输出原值：{!--$jz[$v['field']]--}\n\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t{!--/foreach--}</pre>\n\t\t\t\t\t\t点评/星星数【五颗星为满分，评分数为总星数/投票数，点了星星并提交评论才算评分成功】\n\t\t\t\t\t\t<pre class=\"layui-code\"><div class=\"rating\">\n\t\t\t\t\t\t\t\t\t<!--获取当前商品的点评数据-->\n\t\t\t\t\t\t\t\t\t{!--php $comment = show_comment($jz['tid'],$jz['id'])/--}\n\t\t\t\t\t\t\t\t\t<!--判断是否有评论-->\n\t\t\t\t\t\t\t\t\t{!--php $star_num = $comment['average']/--}\n\t\t\t\t\t\t\t\t\t{!--if($comment['data'])--}\n\t\t\t\t\t\t\t\t\t{!--for $i=1;$i<=$star_num;$i++--}\n\t\t\t\t\t\t\t\t\t<!--输出满星-->\n\t\t\t\t\t\t\t\t\t<img src=\"assets/img/star.svg\">\n\t\t\t\t\t\t\t\t\t{!--/for--}\n\t\t\t\t\t\t\t\t\t{!--if(round($star_num)!=$star_num)--}\n\t\t\t\t\t\t\t\t\t<!--输出半星-->\n\t\t\t\t\t\t\t\t\t<img src=\"assets/img/star-half-empty.svg\">\n\t\t\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t\t\t{!--if($star_num<5)--}\n\t\t\t\t\t\t\t\t\t{!--for $i=1;$i<=(5-$star_num);$i++--}\n\t\t\t\t\t\t\t\t\t<!--输出空星-->\n\t\t\t\t\t\t\t\t\t<img src=\"assets/img/star-empty.svg\">\n\t\t\t\t\t\t\t\t\t{!--/for--}\n\t\t\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t\t\t\t{!--$star_num--} - {!--$comment['count']--} 票\n\t\t\t\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t\t\t\t<img src=\"assets/img/star-empty.svg\">\n\t\t\t\t\t\t\t\t\t<img src=\"assets/img/star-empty.svg\">\n\t\t\t\t\t\t\t\t\t<img src=\"assets/img/star-empty.svg\">\n\t\t\t\t\t\t\t\t\t<img src=\"assets/img/star-empty.svg\">\n\t\t\t\t\t\t\t\t\t<img src=\"assets/img/star-empty.svg\">\n\t\t\t\t\t\t\t\t\t0 - 0 票\n\t\t\t\t\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\t加入购物车\n\t\t\t\t\t\t<pre class=\"layui-code\"><button onclick=\"addcart({!--$type['id']--},{!--$jz['id']--},1)\" class=\"btn btn-primary\" type=\"button\"><i class=\"icon-basket\"></i>加入购物车</button></pre>\n\t\t\t\t\t\t加入购物车JS\n\t\t\t\t\t\t<pre class=\"layui-code\">function addcart(tid,id,num){\n\t\t\t\t\t\t\t\t$.ajax({\n\t\t\t\t\t\t\t\t\t url:\"{!--fun U('user/addcart')--}\",//请求的url地址\n\t\t\t\t\t\t\t\t\t dataType:\"json\",//返回格式为json\n\t\t\t\t\t\t\t\t\t async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n\t\t\t\t\t\t\t\t\t data:{tid:tid,id:id,num:num,ajax:1},//参数值\n\t\t\t\t\t\t\t\t\t type:\"POST\",//请求方式\n\t\t\t\t\t\t\t\t\t beforeSend:function(){\n\t\t\t\t\t\t\t\t\t\t//请求前的处理\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t success:function(r){\n\t\t\t\t\t\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\t\t\t\t\t\twindow.location.href=r.url;\n\t\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t complete:function(){\n\t\t\t\t\t\t\t\t\t\t//请求完成的处理\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t error:function(){\n\t\t\t\t\t\t\t\t\t\t//请求出错处理\n\t\t\t\t\t\t\t\t\t\t\talert('网络错误');\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t   }\n\t\t\t\t\t\t   </pre>\n\t\t\t\t\t\t   相关产品\n\t\t\t\t\t\t   <pre class=\"layui-code\">{!--loop table=\"$type['molds']\" notin=\"id|$jz['id']\" limit=\"3\" as=\"v\"--}\n\t\t\t\t\t\t   notin：表示除当前ID外的产品\n\t\t\t\t\t\t   {!--/loop--}</pre>\n\t\t\t\t\t\t  上一个\n\t\t\t\t\t\t\t<pre class=\"layui-code\">判断是否有上一个\n\t\t\t\t\t\t\t{!--if($aprev)--}\n\t\t\t\t\t\t\t上一个链接：{!--$aprev['url']--}\n\t\t\t\t\t\t\t上一个标题：{!--$aprev['title']--}\n\t\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t\t如果没有上一个，则输出这里的内容\n\t\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t下一个\n\t\t\t\t\t\t<pre class=\"layui-code\">判断是否有下一个\n\t\t\t\t\t\t{!--if($anext)--}\n\t\t\t\t\t\t\t下一个的链接：{!--$anext['url']--}\n\t\t\t\t\t\t\t下一个的标题：{!--$anext['title']--}\n\t\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t\t如果没有下一个，则输出这里的内容\n\t\t\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\t点赞\n\t\t\t\t\t\t<pre class=\"layui-code\">判断是否有点赞\n\t\t\t\t\t\t{!--if(checkLikes($type['id'],$jz['id']))--}\n\t\t\t\t\t\t有点赞，则输出这里\n\t\t\t\t\t\t<span style=\"color:#f00;cursor:pointer;\" onclick=\"likes({!--$type['id']--},{!--$jz['id']--})\" class=\"icon-like\">已点赞</span>\n\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t没有点赞则输出这里\n\t\t\t\t\t\t<span style=\"color:gray;cursor:pointer;\" onclick=\"likes({!--$type['id']--},{!--$jz['id']--})\" class=\"icon-like\">点赞</span>\n\t\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\t相关点赞js\n\t\t\t\t\t\t<pre class=\"layui-code\">function likes(tid,id){\n\t\t$.ajax({\n\t\t\t\t url:\"{!--fun U('user/likesAction')--}\",//请求的url地址\n\t\t\t\t dataType:\"json\",//返回格式为json\n\t\t\t\t async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n\t\t\t\t data:{tid:tid,id:id,ajax:1},//参数值\n\t\t\t\t type:\"POST\",//请求方式\n\t\t\t\t beforeSend:function(){\n\t\t\t\t\t//请求前的处理\n\t\t\t\t\t},\n\t\t\t\t\t success:function(r){\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t},\n\t\t\t\t\t complete:function(){\n\t\t\t\t\t//请求完成的处理\n\t\t\t\t\t},\n\t\t\t\t\t error:function(){\n\t\t\t\t\t//请求出错处理\n\t\t\t\t\t\talert('网络错误');\n\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t})\n\t}</pre>\n\t\t\t\t\t\t收藏\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--if(checkCollect($type['id'],$jz['id']))--}\n\t\t\t\t\t\t<span style=\"color:#f00;cursor:pointer;\" onclick=\"collect({!--$type['id']--},{!--$jz['id']--})\"  >已收藏</span>\n\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t<span style=\"color:gray;cursor:pointer;\" onclick=\"collect({!--$type['id']--},{!--$jz['id']--})\" >收藏</span>\n\t\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\t相关收藏js\n\t\t\t\t\t\t<pre class=\"layui-code\">function collect(tid,id){\n\t\t$.ajax({\n\t\t\t\t url:\"{!--fun U('user/collectAction')--}\",//请求的url地址\n\t\t\t\t dataType:\"json\",//返回格式为json\n\t\t\t\t async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n\t\t\t\t data:{tid:tid,id:id,ajax:1},//参数值\n\t\t\t\t type:\"POST\",//请求方式\n\t\t\t\t beforeSend:function(){\n\t\t\t\t\t//请求前的处理\n\t\t\t\t\t},\n\t\t\t\t\t success:function(r){\n\t\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\talert(r.msg);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t},\n\t\t\t\t\t complete:function(){\n\t\t\t\t\t//请求完成的处理\n\t\t\t\t\t},\n\t\t\t\t\t error:function(){\n\t\t\t\t\t//请求出错处理\n\t\t\t\t\t\talert('网络错误');\n\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t})\n\t}</pre>\t\n\t\t\t\t\t\t \n\t\t\t\t\t\t </div>\n\t\t\t\t\t   </div>\n\t\t\t\t\t  \n\t\t\t\t\t  <!--友情链接-->\n\t\t\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t\t\t <pre class=\"layui-code\">{!--loop table=\"links\" isshow=\"1\" orderby=\"orders desc\" as=\"v\"--}\n\t\t\t\t\t\t\t 链接名：{!--$v['title']--}\n\t\t\t\t\t\t\t 链接URL：{!--$v['url']--}\n\t\t\t\t\t\t\t {!--/loop--}</pre>\n\t\t\t\t\t\t\t </div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  <!--轮播图-->\n\t\t\t\t\t\t<div class=\"layui-tab-item\">\n\t\t\t\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t\t\t <fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>轮播图分类输出</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t  <pre class=\"layui-code\">{!--loop table=\"collect_type\" as=\"v\"--}\n\t\t\t\t\t\t\t 轮播图分类名字：{!--$v['name']--}\n\t\t\t\t\t\t\t 创建时间：{!--fun date('Y-m-d',$v['addtime'])--}\n\t\t\t\t\t\t\t {!--/loop--}</pre>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t </fieldset>\n\t\t\t\t\t\t\t  <fieldset class=\"layui-elem-field\">\n\t\t\t\t\t\t\t  <legend>根据分类输出轮播图</legend>\n\t\t\t\t\t\t\t  <div class=\"layui-field-box\">\n\t\t\t\t\t\t\t  <pre class=\"layui-code\">{!--loop table=\"collect\" orderby=\"orders desc\" tid=\"1\" isshow=\"1\" as=\"v\"--}\n\t\t\t\t\t\t\t 轮播图标题：{!--$v['title']--}\n\t\t\t\t\t\t\t 轮播图描述：{!--$v['description']--}\n\t\t\t\t\t\t\t 轮播图图片：{!--$v['litpic']--}\n\t\t\t\t\t\t\t 轮播图链接：{!--$v['url']--}\n\t\t\t\t\t\t\t 创建时间：{!--fun date('Y-m-d',$v['addtime'])--}\n\t\t\t\t\t\t\t {!--/loop--}</pre>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t </fieldset>\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\t </div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  \n\t\t\t\t\t  <!--loop-->\n\t\t\t\t\t  <div class=\"layui-tab-item\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t <div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t\t 通用说明\n\t\t\t\t\t\t <pre class=\"layui-code\">{!--loop table=\"表名\" tid=\"栏目ID\" limit=\"输出条数\" ispage=\"值1\" isall=\"值1\" notin=\"字段|值\" like=\"字段|值,字段2|值2\" as=\"变量标签,默认v\"--}\n\t\t\t\t\t\t 这里面输出内容格式：{!--$v[字段参数]--}\n\t\t\t\t\t\t {!--$v_n--}：计数，从1开始计(v1.6更改)\n\t\t\t\t\t\t table：数据库的表名\n\t\t\t\t\t\t tid：对应表中的栏目ID，默认每条数据都会有tid字段，可以根据此值输出对应的栏目数据\n\t\t\t\t\t\t limit：输出的条数\n\t\t\t\t\t\t ispage：数值可以是非0的任何数字，如果填写了该参数，则loop循环结束后可以调出分页\n\t\t\t\t\t\t isall：数值可以是非0的任何数字，如果填写了该参数，则查询数据的时候会调用tid栏目的下级数据（如果没有tid，则忽略）\n\t\t\t\t\t\t notin：表示查询除某个字段值意外的数据，如:id|1，表示除id=1以外的数据 as：默认循环变量为小写字母v，可以自定义非数字开头的字母（严格意义上说，不能出现PHP的关键字）\n\t\t\t\t\t\t like：表示查询存在某个值的数据，目前仅支持的形式有:[字段|值],[字段1|值1,字段2|值2],[字段|变量] 如:title|测试，表示title中含有‘测试’这个单词的数据。\n\t\t\t\t\t\t as：默认循环变量为小写字母v，可以自定义非数字开头的字母（严格意义上说，不能出现PHP的关键字）\n\t\t\t\t\t\t {!--/loop--}</pre>\n\t\t\t\t\t\t 如果有ispage参数，那么loop后面可以调用分页【特别说明：$v是loop里面的as=\"v\"里面的v，要灵活转换】\n\t\t\t\t\t\t <pre class=\"layui-code\">默认tpl模板输出：{!--$v_pages--}\n\t\t\t\t\t\t 总条数：{!--$v_sum--}\n\t\t\t\t\t\t 总页数：{!--$v_allpage--}\n\t\t\t\t\t\t 分页列表：{!--$v_listpage--}\n\t\t\t\t\t\t 分页前一条：{!--$v_prevpage--}\n\t\t\t\t\t\t 分页后一条：{!--$v_nextpage--}\n\t\t\t\t\t\t 自定义输出：\n\t\t\t\t\t\t <ul class=\"pagination\">\n\t\t\t\t{!--if($v_listpage['list'])--}\n\t\t\t\t\t<li class=\"page-item {!--if(!$v_listpage['prev'])--}disabled{!--/if--}\"><a class=\"page-link\" href=\"{!--$v_listpage['prev']--}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n\t\t\t\t\t{!--foreach $v_listpage['list'] as $ss--}\n\t\t\t\t\t<li class=\"page-item {!--if($ss['num']==$v_listpage['current_num'])--}active background{!--/if--}\"><a href=\"{!--$ss['url']--}\" class=\"page-link\">{!--$ss['num']--}</a></li>\n\t\t\t\t\t{!--/foreach--}\n\t\t\t\t\t<li class=\"page-item {!--if(!$v_listpage['next'])--}disabled{!--/if--}\"><a class=\"page-link\" href=\"{!--$v_listpage['next']--}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n\t\t\t\t{!--/if--}\n\t\t\t\t</ul></pre>\n\t\t\t\t\t\t 举例说明：输出文章栏目ID为2,3,4的所有数据，并输出分页，每页10条，变量为v\n\t\t\t\t\t\t <pre class=\"layui-code\">{!--loop table=\"article\" tid=\"2,3,4\" isall=\"1\" ispage=\"1\" limit=\"10\" as=\"v\"--}\n\t\t\t\t\t\t 标题:{!--$v['title']--}\n\t\t\t\t\t\t 简介:{!--$v['description']--} 截取20个字：{!--fun newstr($v['description'],40)--}\n\t\t\t\t\t\t 缩略图:{!--$v['litpic']--}\n\t\t\t\t\t\t 时间:{!--fun date('Y-m-d',$v['addtime'])--}\n\t\t\t\t\t\t 内容:{!--$v['body']--}\n\t\t\t\t\t\t 其余内容按照统一规则：{!--$v[字段参数]--}\n\t\t\t\t\t\t {!--/loop--}\n\t\t\t\t\t\t 输出分页\n\t\t\t\t\t\t <ul class=\"pagination\">\n\t\t\t\t\t\t{!--if($v_listpage['list'])--}\n\t\t\t\t\t\t\t<li class=\"page-item {!--if(!$v_listpage['prev'])--}disabled{!--/if--}\"><a class=\"page-link\" href=\"{!--$v_listpage['prev']--}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n\t\t\t\t\t\t\t{!--foreach $v_listpage['list'] as $ss--}\n\t\t\t\t\t\t\t<li class=\"page-item {!--if($ss['num']==$v_listpage['current_num'])--}active background{!--/if--}\"><a href=\"{!--$ss['url']--}\" class=\"page-link\">{!--$ss['num']--}</a></li>\n\t\t\t\t\t\t\t{!--/foreach--}\n\t\t\t\t\t\t\t<li class=\"page-item {!--if(!$v_listpage['next'])--}disabled{!--/if--}\"><a class=\"page-link\" href=\"{!--$v_listpage['next']--}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n\t\t\t\t\t\t{!--/if--}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t </pre>\n\t\t\t\t\t\t \n\t\t\t\t\t\t </div>\n\t\t\t\t      </div>\n\t\t\t\t\t  <!--常用标签-->\n\t\t\t\t\t  <div class=\"layui-tab-item\">\n\t\t\t\t\t\t<div class=\"layui-form-item layui-form-text\">\n\t\t\t\t\t\t输出任何一条数据的万能标签【一条数据】\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--fun get_info_table($table,$where=null,$str=null)--}\n\t\t\t\t\t\t$table:表名，模块名，从数据库或模块列表可查看\n\t\t\t\t\t\t$where:查询条件。如：['id'=>1],表示查询条件为id=1\n\t\t\t\t\t\t$str:获取字段，默认null，返回数组，如果有对应的字段，则返回查询得到的数据的对应字段值。字段可以从数据库中查看。</pre>\n\t\t\t\t\t\t输出任意多条数据的万能标签【多条数据】\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--fun get_all_info_table($table,$where=null,$order=null,$limit=null,$field=null)--}\n\t\t\t\t\t\t$table:表名，模块名，从数据库或模块列表可查看\n\t\t\t\t\t\t$where:查询条件。如：['id'=>1],表示查询条件为id=1\n\t\t\t\t\t\t$order:查询排序，默认null，表示按系统排序ID正序。如：'id desc'表示ID倒序，'addtime desc,id desc'表示按最新时间，并且ID倒序\n\t\t\t\t\t\t$limit:查询条数，默认null，表示查询所有数据。\n\t\t\t\t\t\t$field:查询字段，默认null，表示可以输出哪些字段。</pre>\n\t\t\t\t\t\tIF逻辑判断\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--if(判断1)--}\n\t\t\t\t\t\t//如果判断1为真，则输出这里\n\t\t\t\t\t\t{!--else if(判断2)--}\n\t\t\t\t\t\t//如果判断1为假，判断2为真，则输出这里\n\t\t\t\t\t\t{!--else--}\n\t\t\t\t\t\t//否则输出这里（判断1、判断2都为假）\n\t\t\t\t\t\t{!--/if--}</pre>\n\t\t\t\t\t\tForeach循环输出\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--foreach $lists as $v--}\n\t\t\t\t\t\t这里循环输出{!--$v--}对应的参数值\n\t\t\t\t\t\t{!--/foreach--}</pre>\n\t\t\t\t\t\tFor循环输出\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--for $i=1;$i<5;$i++--}\n\t\t\t\t\t\t这里输出{!--$i--}从1开始递增\n\t\t\t\t\t\t{!--/for--}</pre>\n\t\t\t\t\t\t使用PHP函数/方法【要求一定要掌握的技能】\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--fun 函数--}   如输出当前日期函数：{!--fun date('Y-m-d',time())--}</pre>\n\t\t\t\t\t\t通过函数方式获取默认配置参数\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--fun webConf(配置参数)--}</pre>\n\t\t\t\t\t\t通过函数方式获取自定义配置参数值【只能获取值或者数组】\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--fun get_custom(配置参数=null)--}  如果没有输入配置参数，则返回自定义配置数组</pre>\n\t\t\t\t\t\t各种端口检测【手机端检测】【微信端检测】\n\t\t\t\t\t\t<pre class=\"layui-code\">判断是否为手机端：{!--if(isMobile())--}如果真，这里输出手机端内容{!--/if--}\n\t\t\t\t\t\t判断是否为微信端：{!--if(isWeixin())--}如果真，这里输出微信端内容{!--/if--}</pre>\n\t\t\t\t\t\t各种链接创建【链接生成】\n\t\t\t\t\t\t<pre class=\"layui-code\">指定一个模块的一条数据链接生成：{!--fun gourl($id,$htmlurl=null,$molds='article')--}这里的$id指内容ID，$htmlurl指栏目静态链接名，$molds指模块标识\n\t\t\t\t\t\t指定一个栏目的URL链接：{!--$classtypedata[$id]['url']--}这里的$id指栏目的ID值\n\t\t\t\t\t\t创建一个自定义URL：{!--fun U($action)--}这里的$action可以是一个方法名，也可以是控制器+方法\n\t\t\t\t\t\t如：{!--fun U('index')--}则输出当前页面控制器下面的index方法的执行链接\n\t\t\t\t\t\t如：{!--fun U('Home/index')--}则输出Home控制器下面的index方法的执行链接</pre>\n\t\t\t\t\t\t通过函数方式获取文章作者，上传商品管理员信息\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--fun adminInfo($str=null)--}默认传入字段参数为null，返回数组\n\t\t\t\t\t\t{!--fun adminInfo('name')--}管理员姓名\n\t\t\t\t\t\t{!--fun adminInfo('tel')--}管理员电话\n\t\t\t\t\t\t{!--fun adminInfo('email')--}管理员邮箱</pre>\n\t\t\t\t\t\t字符串截取【默认字符集为UTF-8,且中文为2个字符一个汉字】\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--fun newstr($data,20)--}表示截取$data中的前20个字符</pre>\n\t\t\t\t\t\t检查后台管理员的某个操作权限\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--if( checkAction($action))--}如果真，则执行这里{!--/if--}$action可以是整个模块的控制器名，也可以是单独某个操作名。\n\t\t\t\t\t\t如：{!--if(checkAction('Article'))--}如果返回真，则只需这里的代码{!--/if--}检查用户对文章模块是否有操作权限。\n\t\t\t\t\t\t{!--if(checkAction('Article/addarticle'))--}如果返回真，则只需这里的代码{!--/if--}单独检查用户是否有新增文章的权限</pre>\n\t\t\t\t\t\tPHP变量输出\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--$v--}输出$v变量的值</pre>\n\t\t\t\t\t\t模板执行PHP语句【注意中间的空格】\n\t\t\t\t\t\t<pre class=\"layui-code\">{!--php 这里写PHP的内容/--}</pre>\n\t\t\t\t\t\t模板输出原生标签\n\t\t\t\t\t\t<pre class=\"layui-code\">用{!--!------}代替{}</pre>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t</div>\n\t\t\t\t      </div>\n\t\t\t\t\t \n\t\t\t\t\t</div>\n\t\t\t\t\t  \n\t\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t  <fieldset  class=\"layui-elem-field\">\n\t\t\t\t\t\t\t <legend>附录</legend>\n\t\t\t\t\t\t\t<pre id=\"lable_1\" class=\"layui-code\">时间参数表：\n\t\t\t\t\t\t\t格式：年-月-日：{!--fun date('Y-m-d',$v['addtime'])--}\n格式：年-月-日 时:分:秒：{!--fun date('Y-m-d H:i:s',$v['addtime'])--}\n格式：年/月/日：{!--fun date('Y/m/d',$v['addtime'])--}\n\t\t\t\t\t\t\ta - \"am\" 或是 \"pm\"\nA - \"AM\" 或是 \"PM\"\nd - 几日，二位数字，若不足二位则前面补零; 如: \"01\" 至 \"31\"\nD - 星期几，三个英文字母; 如: \"Fri\"\nF - 月份，英文全名; 如: \"January\"\nh - 12 小时制的小时; 如: \"01\" 至 \"12\"\nH - 24 小时制的小时; 如: \"00\" 至 \"23\"\ng - 12 小时制的小时，不足二位不补零; 如: \"1\" 至 12\"\nG - 24 小时制的小时，不足二位不补零; 如: \"0\" 至 \"23\"\ni - 分钟; 如: \"00\" 至 \"59\"\nj - 几日，二位数字，若不足二位不补零; 如: \"1\" 至 \"31\"\nl - 星期几，英文全名; 如: \"Friday\"\nm - 月份，二位数字，若不足二位则在前面补零; 如: \"01\" 至 \"12\"\nn - 月份，二位数字，若不足二位则不补零; 如: \"1\" 至 \"12\"\nM - 月份，三个英文字母; 如: \"Jan\"\ns - 秒; 如: \"00\" 至 \"59\"\nS - 字尾加英文序数，二个英文字母; 如: \"th\"，\"nd\"\nt - 指定月份的天数; 如: \"28\" 至 \"31\"\nU - 总秒数\nw - 数字型的星期几，如: \"0\" (星期日) 至 \"6\" (星期六)\nY - 年，四位数字; 如: \"1999\"\ny - 年，二位数字; 如: \"99\"\nz - 一年中的第几天; 如: \"0\" 至 \"365\" </pre>\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n              \n\t\t\t\t\n\t\t\t\t</div>\n            </form>\n\t\t\t</div>\n        </div>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n\t\t<br/>\n      \n        <script>\n\t\t\n            layui.use(['laydate','code','form','layer','upload'], function(){\n                $ = layui.jquery;\n              var form = layui.form\n              ,layer = layui.layer;\n\t\t\t  laydate = layui.laydate;\n\t\t\t  var upload = layui.upload;\n\t\t\t  layui.code({\n\t\t\t\t encode: true //是否转义html标签。默认不开启\n\t\t\t\t ,about:false\n\t\t\t\t ,skin: 'notepad'\n\t\t\t\t});\n\t\t\t  \n\t\t\t  form.on('select(type_tid)', function(data){\n\t\t\t\t  /*\n\t\t\t\t  console.log(data.elem); //得到select原始DOM对象\n\t\t\t\t  console.log(data.value); //得到被选中的值\n\t\t\t\t  console.log(data.othis); //得到美化后的DOM对象\n\t\t\t\t  */\n\t\t\t\t  //console.log(data);\n\t\t\t\t // $(\"#type_molds\").val(data.othis.attr('data-molds'));\n\t\t\t\t  \n\t\t\t\t  \n\t\t\t\t});\n              \n\t\t\t    //监听提交\n              form.on('submit(type_save)', function(data){\n\t\t\t\t\n\t\t\t\tif(data.field.type_tid==''){\n\t\t\t\t\tlayer.msg('请选择栏目！');return false;\n\t\t\t\t}\n\t\t\t\tvar tid_molds = data.field.type_tid.split('-');\n\t\t\t\tvar html=`<fieldset class=\"layui-elem-field\"><div class=\"layui-field-box\">{!--loop table=\"`+tid_molds[1]+`\" tid=\"`+tid_molds[0]+`\"  isshow=\"1\"   `;\n\t\t\t\t\n\t\t\t\tif(data.field.type_ispage==2){\n\t\t\t\t\thtml+=` ispage=\"1\" `;\n\t\t\t\t}\n\t\t\t\tif(data.field.type_isall==2){\n\t\t\t\t\thtml+=` isall=\"1\" `;\n\t\t\t\t}\n\t\t\t\tif(data.field.type_orderby!=''){\n\t\t\t\t\thtml+= `  orderby=\"`+data.field.type_orderby+`\"  `;\n\t\t\t\t}\n\t\t\t\thtml+=` limit=\"`+data.field.type_limit+`\" as=\"v\"--}\n计数器:{!--$n--} 从1开始计\n标题:{!--$v['title']--}\n内容链接:{!--$v['url']--}\n热度/点击量:{!--$v['hits']--}\n评论数:{!--$v['comment_num']--}\n所属栏目id:{!--$v['tid']--}\n所属栏目名:{!--$classtypedata[$v['tid']]['classname']--}\n所属栏目URL:{!--$classtypedata[$v['tid']]['url']--}\n简介:{!--$['description']--} 截取20个字：{!--fun newstr($v['description'],40)--}\n缩略图:{!--$v['litpic']--}\n时间:{!--fun date('Y-m-d',$v['addtime'])--}\n内容:{!--$v['body']--}\n其余内容按照统一规则：{!--$v[字段参数]--}\n{!--/loop--}</div></fieldset>`;\n\t\t\t\t$(\"#lable_type\").html(html);\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t   //监听提交\n              form.on('submit(product_save)', function(data){\n\t\t\t\t\n\t\t\t\tif(data.field.product_tid==''){\n\t\t\t\t\tlayer.msg('请选择栏目！');return false;\n\t\t\t\t}\n\t\t\t\tvar tid_molds = data.field.product_tid.split('-');\n\t\t\t\tvar html=`<fieldset class=\"layui-elem-field\"><div class=\"layui-field-box\">{!--loop table=\"`+tid_molds[1]+`\" tid=\"`+tid_molds[0]+`\"  isshow=\"1\"   `;\n\t\t\t\t\n\t\t\t\tif(data.field.product_ispage==2){\n\t\t\t\t\thtml+=` ispage=\"1\" `;\n\t\t\t\t}\n\t\t\t\tif(data.field.product_isall==2){\n\t\t\t\t\thtml+=` isall=\"1\" `;\n\t\t\t\t}\n\t\t\t\tif(data.field.product_orderby!=''){\n\t\t\t\t\thtml+= `  orderby=\"`+data.field.product_orderby+`\"  `;\n\t\t\t\t}\n\t\t\t\thtml+=` limit=\"`+data.field.product_limit+`\" as=\"v\"--}\n计数器:{!--$n--} 从1开始计\n标题:{!--$v['title']--}\n内容链接:{!--$v['url']--}\n热度/点击量:{!--$v['hits']--}\n价格:{!--$v['price']--}\n库存:{!--$v['stock_num']--}\n评论数:{!--$v['comment_num']--}\n所属栏目id:{!--$v['tid']--}\n所属栏目名:{!--$classtypedata[$v['tid']]['classname']--}\n所属栏目URL:{!--$classtypedata[$v['tid']]['url']--}\n简介:{!--$['description']--} 截取20个字：{!--fun newstr($v['description'],40)--}\n主图/缩略图:{!--$v['litpic']--}\n时间:{!--fun date('Y-m-d',$v['addtime'])--}\n内容:{!--$v['body']--}\n图集：\n{!--php $pictures = explode('||',$v['pictures'])/--}\n{!--foreach $pictures as $v--}\n{!--if($v!='')--}\n图片链接{!--$v--}\n{!--/if--}\n{!--/foreach--}\n其余内容按照统一规则：{!--$v[字段参数]--}\n{!--/loop--}</div></fieldset>`;\n\t\t\t\t$(\"#lable_product\").html(html);\n\t\t\t\t\n               \n                return false;\n              });\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n           \n              \n              \n            });\n        </script>\n      \n    </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/sitemap.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"UTF-8\">\n\t{include=\"style\"}\n\t<style>\n\t\t.cache-s{\n\t\t\twidth:6rem !important;\n\t\t}\n\t\t.layui-form-label{\n\t\t\twidth:100px;\n\t\t}\n\t\t.layui-input-block{\n\t\t\tmargin-left:150px;\n\t\t}\n\t</style>\n</head>\n<body>\n<div class=\"x-body layui-anim layui-anim-up\">\n\t<div class=\"layui-card\">\n\t\t<div class=\"layui-card-body\">\n\t\t\t<blockquote class=\"layui-elem-quote\">{if($webconf['iswap']==1)}{fun JZLANG('手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录')}-[ {$webconf['mobile_html']} ]】{if($webconf['mobile_html']!='/')}，{fun JZLANG('如果不生成静态文件，请改为')}[ / ]{/if}{else}{fun JZLANG('手机端未开启，sitemap不会包含手机端URL')}{/if}<br/>\n\t\t\t\t{fun JZLANG('PC端网站地图：')}sitemap.xml<br/>\n\t\t\t\t{fun JZLANG('手机端网站地图：')}mobile_sitemap.xml<br/>\n\t\t\t\t如果是txt类型文件，则生成如下文件：<br/>\n\t\t\t\t{fun JZLANG('PC端网站地图：')}sitemap.txt<br/>\n\t\t\t\t{fun JZLANG('手机端网站地图：')}mobile_sitemap.txt<br/>\n\n\t\t\t</blockquote>\n\t\t\t<fieldset class=\"layui-elem-field\">\n\t\t\t\t<legend>{fun JZLANG('网站地图')}</legend>\n\t\t\t\t<div class=\"layui-field-box\">\n\t\t\t\t\t<div class=\"layui-col-md12\">\n\t\t\t\t\t\t<form class=\"layui-form \" action=\"\">\n\n\t\t\t\t\t\t\t<table class=\"layui-table\">\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th>{fun JZLANG('模块名称')}</th>\n\t\t\t\t\t\t\t\t\t<th>{fun JZLANG('更新频率')}</th>\n\t\t\t\t\t\t\t\t\t<th>{fun JZLANG('站内权重')}</th>\n\t\t\t\t\t\t\t\t\t<th>{fun JZLANG('输出范围')}</th>\n\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('栏目模块')}<input name=\"model[]\" value=\"classtype\" type=\"hidden\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"freq[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"always\">经常(always)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"hourly\">每时(hourly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"daily\">每天(daily)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"weekly\">每周(weekly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"monthly\">每月(monthly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"yearly\">每年(yearly)</option>\n\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td><input name=\"priority[]\" type=\"number\" class=\"layui-input\" value=\"0.90\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"isshow[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的栏目')}</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的栏目')}</option>\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-danger\" type=\"button\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('文章模块')}<input name=\"model[]\" value=\"article\" type=\"hidden\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"freq[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"always\">经常(always)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"hourly\">每时(hourly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"daily\">每天(daily)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"weekly\">每周(weekly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"monthly\">每月(monthly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"yearly\">每年(yearly)</option>\n\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td><input name=\"priority[]\" type=\"number\" class=\"layui-input\" value=\"0.80\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"isshow[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的文章')}</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的文章')}</option>\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-danger\" type=\"button\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td>{fun JZLANG('商品模块')}<input name=\"model[]\" value=\"product\" type=\"hidden\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"freq[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"always\">经常(always)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"hourly\">每时(hourly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"daily\">每天(daily)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"weekly\">每周(weekly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"monthly\">每月(monthly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"yearly\">每年(yearly)</option>\n\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td><input name=\"priority[]\" type=\"number\" class=\"layui-input\" value=\"0.80\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"isshow[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的商品')}</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的商品')}</option>\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-danger\" type=\"button\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\n\t\t\t\t\t\t\t\t{loop table=\"molds\" sys=\"0\" ismust=\"1\" as=\"v\"}\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td>{$v['name']}{fun JZLANG('模块')}<input name=\"model[]\" value=\"{$v['biaoshi']}\" type=\"hidden\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"freq[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"always\">经常(always)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"hourly\">每时(hourly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"daily\">每天(daily)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"weekly\">每周(weekly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"monthly\">每月(monthly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"yearly\">每年(yearly)</option>\n\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td><input name=\"priority[]\" type=\"number\" class=\"layui-input\" value=\"0.80\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"isshow[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的')}{$v['name']}</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的')}{$v['name']}</option>\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-danger\" type=\"button\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td>TAGS{fun JZLANG('模块')}<input name=\"model[]\" value=\"tags\" type=\"hidden\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"freq[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"always\">经常(always)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"hourly\">每时(hourly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"daily\">每天(daily)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"weekly\">每周(weekly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"monthly\">每月(monthly)</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"yearly\">每年(yearly)</option>\n\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td><input name=\"priority[]\" type=\"number\" class=\"layui-input\" value=\"0.80\"></td>\n\t\t\t\t\t\t\t\t\t<td><select name=\"isshow[]\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的')}</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的')}</option>\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-danger\" type=\"button\">{fun JZLANG('删除')}</button>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\n\n\t\t\t\t\t\t\t</table>\n\n\n\t\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t\t<label for=\"page_size\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('每页链接数')}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t\t<input name=\"page_size\" value=\"{$sitemap_conf['page_size']}\" class=\"layui-input\">\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t\t<label for=\"filetype\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('TAGS链接类型')}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t\t<input name=\"tagsurl\" value=\"{$sitemap_conf['tagsurl']}\" class=\"layui-input\">\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"layui-form-mid layui-word-aux\">\n\t\t\t\t\t\t\t\t\t{id}，{keywords}自动替换变量，链接必须 / 开头，否则出错\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t\t<label for=\"filetype\" class=\"layui-form-label\">\n\t\t\t\t\t\t\t\t\t<span class=\"x-red\">*</span>{fun JZLANG('生成文件类型')}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<div class=\"layui-input-inline\">\n\t\t\t\t\t\t\t\t\t<select name=\"filetype\"  >\n\t\t\t\t\t\t\t\t\t\t<option value=\"xml\" {if($sitemap_conf['filetype']=='xml')}selected{/if}>xml</option>\n\t\t\t\t\t\t\t\t\t\t<option value=\"txt\" {if($sitemap_conf['filetype']=='txt')}selected{/if}>txt</option>\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"layui-form-item\">\n\t\t\t\t\t\t\t\t<div class=\"layui-input-block\">\n\t\t\t\t\t\t\t\t\t<button class=\"layui-btn\" lay-submit lay-filter=\"formDemo\">{fun JZLANG('立即生成')}</button>\n\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</form>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</fieldset>\n\t\t</div>\n\t</div>\n\n</div>\n<script>\n\tlayui.use(['laydate','form','layer','upload'], function(){\n\t\t$ = layui.jquery;\n\t\tvar form = layui.form\n\t\t\t,layer = layui.layer;\n\t\tlaydate = layui.laydate;\n\t\tvar upload = layui.upload;\n\t\t//监听提交\n\t\tform.on('submit(formDemo)', function(data){\n\t\t\t//console.log(data.field);return false;\n\t\t\t$.post(\"{fun U('Index/sitemap')}\",data.field,function(r){\n\t\t\t\t//console.log(r);return false;\n\t\t\t\tvar r = JSON.parse(r);\n\t\t\t\tif(r.code!=1){\n\n\t\t\t\t\tlayer.msg(r.msg,{icon:6},function(){\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t})\n\t\t\t\t\t\n\n\t\t\t\t}else{\n\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\n\t\t\t\t}\n\t\t\t});\n\n\n\t\t\treturn false;\n\t\t});\n\t})\n\tfunction del(a){\n\t\t$(a).parent().parent().remove();\n\t}\n</script>\n</body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/style/css/font.css",
    "content": "/*\n@font-face {\n  font-family: 'iconfont';\n  src: url('../fonts/iconfont.eot');\n  src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'),\n  url('../fonts/iconfont.woff') format('woff'),\n  url('../fonts/iconfont.ttf') format('truetype'),\n  url('../fonts/iconfont.svg#iconfont') format('svg');\n}\n.iconfont{\n  font-family:\"iconfont\" !important;\n  font-size:16px;font-style:normal;\n  -webkit-font-smoothing: antialiased;\n  -webkit-text-stroke-width: 0.2px;\n  -moz-osx-font-smoothing: grayscale;\n}\n*/\n\n@font-face {\n  font-family: 'iconfont';\n  src: url('../fonts/iconfont.eot');\n  src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'),\n      url('../fonts/iconfont.woff2') format('woff2'),\n      url('../fonts/iconfont.woff') format('woff'),\n      url('../fonts/iconfont.ttf') format('truetype'),\n      url('../fonts/iconfont.svg#iconfont') format('svg');\n}\n.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n"
  },
  {
    "path": "app/admin/t/tpl/style/css/iconfont.css",
    "content": "@font-face {\n  font-family: \"iconfont\"; /* Project id 1357552 */\n  src: url('iconfont.woff2?t=1638967197290') format('woff2'),\n       url('iconfont.woff?t=1638967197290') format('woff'),\n       url('iconfont.ttf?t=1638967197290') format('truetype');\n}\n\n.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-xiangshangshouqi:before {\n  content: \"\\e964\";\n}\n\n.icon-zhixiangxia:before {\n  content: \"\\e965\";\n}\n\n.icon-diyiye:before {\n  content: \"\\e966\";\n}\n\n.icon-zuihouye:before {\n  content: \"\\e967\";\n}\n\n.icon-biaotou-zhengxu:before {\n  content: \"\\e968\";\n}\n\n.icon-biaotou-kepaixu:before {\n  content: \"\\e969\";\n}\n\n.icon-biaotou-daoxu:before {\n  content: \"\\e96a\";\n}\n\n.icon-huidingbu:before {\n  content: \"\\e96b\";\n}\n\n.icon-xiangzuojiaohuan:before {\n  content: \"\\e96c\";\n}\n\n.icon-xianghujiaohuan:before {\n  content: \"\\e96d\";\n}\n\n.icon-xiangyoujiaohuan:before {\n  content: \"\\e96e\";\n}\n\n.icon-shuzhixiajiang:before {\n  content: \"\\e96f\";\n}\n\n.icon-quanping:before {\n  content: \"\\e970\";\n}\n\n.icon-hengxiangzhankai:before {\n  content: \"\\e971\";\n}\n\n.icon-shuzhishangsheng:before {\n  content: \"\\e972\";\n}\n\n.icon-tuichuquanping:before {\n  content: \"\\e973\";\n}\n\n.icon-hengxiangshouqi:before {\n  content: \"\\e974\";\n}\n\n.icon-shuaxin:before {\n  content: \"\\e975\";\n}\n\n.icon-tongbu:before {\n  content: \"\\e976\";\n}\n\n.icon-jiazailoading-A:before {\n  content: \"\\e977\";\n}\n\n.icon-jiazailoading-B:before {\n  content: \"\\e978\";\n}\n\n.icon-weizhi-xianxing:before {\n  content: \"\\e979\";\n}\n\n.icon-weizhi:before {\n  content: \"\\e97a\";\n}\n\n.icon-daohang:before {\n  content: \"\\e97b\";\n}\n\n.icon-dingwei:before {\n  content: \"\\e97c\";\n}\n\n.icon-jiankongshexiangtou-xianxing:before {\n  content: \"\\e97d\";\n}\n\n.icon-tuodiantu:before {\n  content: \"\\e97e\";\n}\n\n.icon-jiankongshexiangtou:before {\n  content: \"\\e97f\";\n}\n\n.icon-leidatance:before {\n  content: \"\\e980\";\n}\n\n.icon-baobiao:before {\n  content: \"\\e981\";\n}\n\n.icon-bingtu-xianxing:before {\n  content: \"\\e982\";\n}\n\n.icon-baobiao-xianxing:before {\n  content: \"\\e983\";\n}\n\n.icon-bingtu:before {\n  content: \"\\e984\";\n}\n\n.icon-tiaoxingtu:before {\n  content: \"\\e985\";\n}\n\n.icon-tiaoxingtu-xianxing:before {\n  content: \"\\e986\";\n}\n\n.icon-zhexiantu:before {\n  content: \"\\e987\";\n}\n\n.icon-zhexiantu-xianxing:before {\n  content: \"\\e988\";\n}\n\n.icon-zhinanzhidao-xianxing:before {\n  content: \"\\e989\";\n}\n\n.icon-ditu:before {\n  content: \"\\e98a\";\n}\n\n.icon-zhinanzhidao:before {\n  content: \"\\e98b\";\n}\n\n.icon-tousu:before {\n  content: \"\\e98c\";\n}\n\n.icon-xunjianjianyan:before {\n  content: \"\\e98d\";\n}\n\n.icon-dianpu:before {\n  content: \"\\e98e\";\n}\n\n.icon-yunshuzhongwuliu-xianxing:before {\n  content: \"\\e88f\";\n}\n\n.icon-dianpu-xianxing:before {\n  content: \"\\e98f\";\n}\n\n.icon-yunshuzhongwuliu:before {\n  content: \"\\e890\";\n}\n\n.icon-kuaidiyuan:before {\n  content: \"\\e990\";\n}\n\n.icon-baoguofahuo:before {\n  content: \"\\e891\";\n}\n\n.icon-kuaidiyuan-xianxing:before {\n  content: \"\\e991\";\n}\n\n.icon-baoguofahuo-xianxing:before {\n  content: \"\\e892\";\n}\n\n.icon-daikuan-xianxing:before {\n  content: \"\\e992\";\n}\n\n.icon-chaibaoguoqujian:before {\n  content: \"\\e893\";\n}\n\n.icon-huankuan-xianxing:before {\n  content: \"\\e993\";\n}\n\n.icon-chaibaoguoqujian-xianxing:before {\n  content: \"\\e894\";\n}\n\n.icon-tuikuan-xi:before {\n  content: \"\\e994\";\n}\n\n.icon-zitigui:before {\n  content: \"\\e895\";\n}\n\n.icon-rili-xianxing-xi:before {\n  content: \"\\e995\";\n}\n\n.icon-zitigui-xianxing:before {\n  content: \"\\e896\";\n}\n\n.icon-jisuanqilishuai-xianxing-xi:before {\n  content: \"\\e996\";\n}\n\n.icon-caigou-xianxing:before {\n  content: \"\\e897\";\n}\n\n.icon-yonghuziliao:before {\n  content: \"\\e997\";\n}\n\n.icon-caigou:before {\n  content: \"\\e898\";\n}\n\n.icon-yonghuziliao-xianxing:before {\n  content: \"\\e998\";\n}\n\n.icon-shangpin:before {\n  content: \"\\e899\";\n}\n\n.icon-pifuzhuti:before {\n  content: \"\\e999\";\n}\n\n.icon-shangpin-xianxing:before {\n  content: \"\\e89a\";\n}\n\n.icon-pifuzhuti-xianxing:before {\n  content: \"\\e99a\";\n}\n\n.icon-peizaizhuangche:before {\n  content: \"\\e89b\";\n}\n\n.icon-diamond:before {\n  content: \"\\e99b\";\n}\n\n.icon-peizaizhuangche-xianxing:before {\n  content: \"\\e89c\";\n}\n\n.icon-diamond-o:before {\n  content: \"\\e99c\";\n}\n\n.icon-zhiliang-xianxing:before {\n  content: \"\\e89d\";\n}\n\n.icon-sheji-xianxing:before {\n  content: \"\\e99d\";\n}\n\n.icon-zhiliang:before {\n  content: \"\\e89e\";\n}\n\n.icon-kaifa-xianxing:before {\n  content: \"\\e99e\";\n}\n\n.icon-anquanbaozhang:before {\n  content: \"\\e89f\";\n}\n\n.icon-yinhangqia:before {\n  content: \"\\e99f\";\n}\n\n.icon-anquanbaozhang-xianxing:before {\n  content: \"\\e8a0\";\n}\n\n.icon-yinhangqia-xianxing:before {\n  content: \"\\e9a0\";\n}\n\n.icon-cangkucangchu:before {\n  content: \"\\e8a1\";\n}\n\n.icon-hongbao-xianxing:before {\n  content: \"\\e9a1\";\n}\n\n.icon-cangkucangchu-xianxing:before {\n  content: \"\\e8a2\";\n}\n\n.icon-hongbao:before {\n  content: \"\\e9a2\";\n}\n\n.icon-zhongzhuanzhan-xianxing:before {\n  content: \"\\e8a3\";\n}\n\n.icon-aixin:before {\n  content: \"\\e9a3\";\n}\n\n.icon-zhongzhuanzhan:before {\n  content: \"\\e8a4\";\n}\n\n.icon-bianji:before {\n  content: \"\\e9a4\";\n}\n\n.icon-kucun-xianxing:before {\n  content: \"\\e8a5\";\n}\n\n.icon-Dyanjing:before {\n  content: \"\\e9a5\";\n}\n\n.icon-kucun:before {\n  content: \"\\e8a6\";\n}\n\n.icon-caidan:before {\n  content: \"\\e9a6\";\n}\n\n.icon-moduanwangdian-xianxing:before {\n  content: \"\\e8a7\";\n}\n\n.icon-anquan:before {\n  content: \"\\e9a7\";\n}\n\n.icon-moduanwangdian:before {\n  content: \"\\e8a8\";\n}\n\n.icon-bangzhu:before {\n  content: \"\\e9a8\";\n}\n\n.icon-qianshoushenpitongguo-xianxing:before {\n  content: \"\\e8a9\";\n}\n\n.icon-buganxingqu:before {\n  content: \"\\e9a9\";\n}\n\n.icon-qianshoushenpitongguo:before {\n  content: \"\\e8aa\";\n}\n\n.icon-bofangjilu:before {\n  content: \"\\e9aa\";\n}\n\n.icon-juqianshou-xianxing:before {\n  content: \"\\e8ab\";\n}\n\n.icon-chuangzuo:before {\n  content: \"\\e9ab\";\n}\n\n.icon-juqianshou:before {\n  content: \"\\e8ac\";\n}\n\n.icon-chenggong:before {\n  content: \"\\e9ac\";\n}\n\n.icon-jijianfasong-xianxing:before {\n  content: \"\\e8ad\";\n}\n\n.icon-ceshi:before {\n  content: \"\\e9ad\";\n}\n\n.icon-jijianfasong:before {\n  content: \"\\e8ae\";\n}\n\n.icon-dianhua1:before {\n  content: \"\\e9ae\";\n}\n\n.icon-qiyeyuanquwuye:before {\n  content: \"\\e8af\";\n}\n\n.icon-dianzan:before {\n  content: \"\\e9af\";\n}\n\n.icon-qiyeyuanquwuye-xianxing:before {\n  content: \"\\e8b0\";\n}\n\n.icon-dingwei1:before {\n  content: \"\\e9b0\";\n}\n\n.icon-jiesuan-xianxing:before {\n  content: \"\\e8b1\";\n}\n\n.icon-diantong_guan:before {\n  content: \"\\e9b1\";\n}\n\n.icon-jiesuan:before {\n  content: \"\\e8b2\";\n}\n\n.icon-dianying:before {\n  content: \"\\e9b2\";\n}\n\n.icon-jifen1:before {\n  content: \"\\e8b3\";\n}\n\n.icon-ditu1:before {\n  content: \"\\e9b3\";\n}\n\n.icon-jifen-xianxing:before {\n  content: \"\\e8b4\";\n}\n\n.icon-diantong_kai:before {\n  content: \"\\e9b4\";\n}\n\n.icon-youhuijuan-xianxing:before {\n  content: \"\\e8b5\";\n}\n\n.icon-dianyingpiao:before {\n  content: \"\\e9b5\";\n}\n\n.icon-ziliaoshouce:before {\n  content: \"\\e8b6\";\n}\n\n.icon-dingdan:before {\n  content: \"\\e9b6\";\n}\n\n.icon-ziliaoshouce-xianxing:before {\n  content: \"\\e8b7\";\n}\n\n.icon-gengduo:before {\n  content: \"\\e9b7\";\n}\n\n.icon-youhuijuan:before {\n  content: \"\\e8b8\";\n}\n\n.icon-fanbei:before {\n  content: \"\\e9b8\";\n}\n\n.icon-guize:before {\n  content: \"\\e8b9\";\n}\n\n.icon-faxian:before {\n  content: \"\\e9b9\";\n}\n\n.icon-danju-xianxing:before {\n  content: \"\\e8ba\";\n}\n\n.icon-ertongpiao:before {\n  content: \"\\e9ba\";\n}\n\n.icon-zuzhijiagoujiekou:before {\n  content: \"\\e8bb\";\n}\n\n.icon-gongyi:before {\n  content: \"\\e9bb\";\n}\n\n.icon-danju:before {\n  content: \"\\e8bc\";\n}\n\n.icon-hongbao1:before {\n  content: \"\\e9bc\";\n}\n\n.icon-chuangjiandanju-xianxing:before {\n  content: \"\\e8bd\";\n}\n\n.icon-fuzhi:before {\n  content: \"\\e9bd\";\n}\n\n.icon-chuangjiandanju:before {\n  content: \"\\e8be\";\n}\n\n.icon-fenxiang:before {\n  content: \"\\e9be\";\n}\n\n.icon-zhangdan-xianxing:before {\n  content: \"\\e8bf\";\n}\n\n.icon-huatifuhao:before {\n  content: \"\\e9bf\";\n}\n\n.icon-zhangdan:before {\n  content: \"\\e8c0\";\n}\n\n.icon-huiyuan:before {\n  content: \"\\e9c0\";\n}\n\n.icon-tijikongjian:before {\n  content: \"\\e8c1\";\n}\n\n.icon-aliyu:before {\n  content: \"\\e9c1\";\n}\n\n.icon-tijikongjian-xianxing:before {\n  content: \"\\e8c2\";\n}\n\n.icon-jiju:before {\n  content: \"\\e9c2\";\n}\n\n.icon-yewu-xianxing:before {\n  content: \"\\e8c3\";\n}\n\n.icon-jianshao:before {\n  content: \"\\e9c3\";\n}\n\n.icon-yewu:before {\n  content: \"\\e8c4\";\n}\n\n.icon-kabao:before {\n  content: \"\\e9c4\";\n}\n\n.icon-yingyongchengxu-xianxing:before {\n  content: \"\\e8c5\";\n}\n\n.icon-huati:before {\n  content: \"\\e9c5\";\n}\n\n.icon-yingyongchengxu:before {\n  content: \"\\e8c6\";\n}\n\n.icon-guanzhu:before {\n  content: \"\\e9c6\";\n}\n\n.icon-biaozhun:before {\n  content: \"\\e8c7\";\n}\n\n.icon-maiyizengyi:before {\n  content: \"\\e9c7\";\n}\n\n.icon-biaozhun-xianxing:before {\n  content: \"\\e8c8\";\n}\n\n.icon-mima:before {\n  content: \"\\e9c8\";\n}\n\n.icon-quanxianyuechi:before {\n  content: \"\\e8c9\";\n}\n\n.icon-nan:before {\n  content: \"\\e9c9\";\n}\n\n.icon-quanxianyuechi-xianxing:before {\n  content: \"\\e8ca\";\n}\n\n.icon-nv:before {\n  content: \"\\e9ca\";\n}\n\n.icon-ziyuan:before {\n  content: \"\\e8cb\";\n}\n\n.icon-lihe:before {\n  content: \"\\e9cb\";\n}\n\n.icon-ziyuan-xianxing:before {\n  content: \"\\e8cc\";\n}\n\n.icon-paihangbang:before {\n  content: \"\\e9cc\";\n}\n\n.icon-mobankuangjia-xianxing:before {\n  content: \"\\e8cd\";\n}\n\n.icon-lipinka:before {\n  content: \"\\e9cd\";\n}\n\n.icon-mobankuangjia:before {\n  content: \"\\e8ce\";\n}\n\n.icon-pengyouquan:before {\n  content: \"\\e9ce\";\n}\n\n.icon-xinwenzixun:before {\n  content: \"\\e8cf\";\n}\n\n.icon-mingxinghuodong:before {\n  content: \"\\e9cf\";\n}\n\n.icon-xinwenzixun-xianxing:before {\n  content: \"\\e8d0\";\n}\n\n.icon-qupiao:before {\n  content: \"\\e9d0\";\n}\n\n.icon-hezuoguanxi-xianxing:before {\n  content: \"\\e8d1\";\n}\n\n.icon-saoyisao:before {\n  content: \"\\e9d1\";\n}\n\n.icon-hezuoguanxi:before {\n  content: \"\\e8d2\";\n}\n\n.icon-rili1:before {\n  content: \"\\e9d2\";\n}\n\n.icon-xianlu:before {\n  content: \"\\e8d3\";\n}\n\n.icon-pinglun:before {\n  content: \"\\e9d3\";\n}\n\n.icon--fuwu-xianxing:before {\n  content: \"\\e8d4\";\n}\n\n.icon-qinghuiyuan:before {\n  content: \"\\e9d4\";\n}\n\n.icon--fuwu:before {\n  content: \"\\e8d5\";\n}\n\n.icon-riqian:before {\n  content: \"\\e9d5\";\n}\n\n.icon--kefu-xianxing:before {\n  content: \"\\e8d6\";\n}\n\n.icon-shandian:before {\n  content: \"\\e9d6\";\n}\n\n.icon--kefu:before {\n  content: \"\\e8d7\";\n}\n\n.icon-shaixuan:before {\n  content: \"\\e9d7\";\n}\n\n.icon--guoji-xianxing:before {\n  content: \"\\e8d8\";\n}\n\n.icon-shangquan:before {\n  content: \"\\e9d8\";\n}\n\n.icon--guoji:before {\n  content: \"\\e8d9\";\n}\n\n.icon-shanchu:before {\n  content: \"\\e9d9\";\n}\n\n.icon-haiguan-xianxing:before {\n  content: \"\\e8da\";\n}\n\n.icon-shezhi1:before {\n  content: \"\\e9da\";\n}\n\n.icon-haiguan:before {\n  content: \"\\e8db\";\n}\n\n.icon-shangchuan:before {\n  content: \"\\e9db\";\n}\n\n.icon-touchengkongyun:before {\n  content: \"\\e8dc\";\n}\n\n.icon-shequ:before {\n  content: \"\\e9dc\";\n}\n\n.icon-weicheng:before {\n  content: \"\\e8dd\";\n}\n\n.icon-shengyinguanbi:before {\n  content: \"\\e9dd\";\n}\n\n.icon-caiwu:before {\n  content: \"\\e8de\";\n}\n\n.icon-shibai:before {\n  content: \"\\e9de\";\n}\n\n.icon-caiwu-xianxing:before {\n  content: \"\\e8df\";\n}\n\n.icon-shijian1:before {\n  content: \"\\e9df\";\n}\n\n.icon-mianfei:before {\n  content: \"\\e8e0\";\n}\n\n.icon-shengyin:before {\n  content: \"\\e9e0\";\n}\n\n.icon-mianfei-xianxing:before {\n  content: \"\\e8e1\";\n}\n\n.icon-shoucang1:before {\n  content: \"\\e9e1\";\n}\n\n.icon-tuikuan:before {\n  content: \"\\e8e2\";\n}\n\n.icon-shouji:before {\n  content: \"\\e9e2\";\n}\n\n.icon-jisuanqilishuai:before {\n  content: \"\\e8e3\";\n}\n\n.icon-shouye1:before {\n  content: \"\\e9e3\";\n}\n\n.icon-jisuanqilishuai-xianxing:before {\n  content: \"\\e8e4\";\n}\n\n.icon-shuju:before {\n  content: \"\\e9e4\";\n}\n\n.icon-checkbox-weixuan:before {\n  content: \"\\e8e5\";\n}\n\n.icon-shuaxin1:before {\n  content: \"\\e9e5\";\n}\n\n.icon-checkbox-xuanzhong:before {\n  content: \"\\e8e6\";\n}\n\n.icon-sousuo1:before {\n  content: \"\\e9e6\";\n}\n\n.icon-Raidobox-weixuan:before {\n  content: \"\\e8e7\";\n}\n\n.icon-tanhao:before {\n  content: \"\\e9e7\";\n}\n\n.icon-Raidobox-xuanzhong:before {\n  content: \"\\e8e8\";\n}\n\n.icon-taolunqu:before {\n  content: \"\\e9e8\";\n}\n\n.icon-checkbox-xuanzhongbufen:before {\n  content: \"\\e8e9\";\n}\n\n.icon-tianjiayouhuiquan:before {\n  content: \"\\e9e9\";\n}\n\n.icon-youxiajiaogouxuan:before {\n  content: \"\\e8ea\";\n}\n\n.icon-tishi:before {\n  content: \"\\e9ea\";\n}\n\n.icon-sousuo-xianxing:before {\n  content: \"\\e8eb\";\n}\n\n.icon-tupian1:before {\n  content: \"\\e9eb\";\n}\n\n.icon-shezhi-xianxing:before {\n  content: \"\\e8ec\";\n}\n\n.icon-tuipiao:before {\n  content: \"\\e9ec\";\n}\n\n.icon-shezhi:before {\n  content: \"\\e8ed\";\n}\n\n.icon-weixuanzhong:before {\n  content: \"\\e9ed\";\n}\n\n.icon-shouye:before {\n  content: \"\\e8ee\";\n}\n\n.icon-weibo:before {\n  content: \"\\e9ee\";\n}\n\n.icon-shouye-xianxing:before {\n  content: \"\\e8ef\";\n}\n\n.icon-wenjuan:before {\n  content: \"\\e9ef\";\n}\n\n.icon-sousuo:before {\n  content: \"\\e8f0\";\n}\n\n.icon-wode:before {\n  content: \"\\e9f0\";\n}\n\n.icon-wenti-xianxing:before {\n  content: \"\\e8f1\";\n}\n\n.icon-weixin3:before {\n  content: \"\\e9f1\";\n}\n\n.icon-wenti:before {\n  content: \"\\e8f2\";\n}\n\n.icon-wodeguanzhu:before {\n  content: \"\\e9f2\";\n}\n\n.icon-dianhua-xianxingyuankuang:before {\n  content: \"\\e8f3\";\n}\n\n.icon-xiami:before {\n  content: \"\\e9f3\";\n}\n\n.icon-liaotianduihua:before {\n  content: \"\\e8f4\";\n}\n\n.icon-xiangkan:before {\n  content: \"\\e9f4\";\n}\n\n.icon-liaotianduihua-xianxing:before {\n  content: \"\\e8f5\";\n}\n\n.icon-xiangji:before {\n  content: \"\\e9f5\";\n}\n\n.icon-dianhua:before {\n  content: \"\\e8f6\";\n}\n\n.icon-xiaoxi:before {\n  content: \"\\e9f6\";\n}\n\n.icon-dianhua-yuankuang:before {\n  content: \"\\e8f7\";\n}\n\n.icon-xiazai:before {\n  content: \"\\e9f7\";\n}\n\n.icon-xin-xianxing:before {\n  content: \"\\e8f8\";\n}\n\n.icon-xiaojuchang:before {\n  content: \"\\e9f8\";\n}\n\n.icon-lingdang:before {\n  content: \"\\e8f9\";\n}\n\n.icon-xiaoshi:before {\n  content: \"\\e9f9\";\n}\n\n.icon-lingdang-xianxing:before {\n  content: \"\\e8fa\";\n}\n\n.icon-xiaoxizhongxin:before {\n  content: \"\\e9fa\";\n}\n\n.icon-xin:before {\n  content: \"\\e8fb\";\n}\n\n.icon-yinhangka:before {\n  content: \"\\e9fb\";\n}\n\n.icon-laba-xianxing:before {\n  content: \"\\e8fc\";\n}\n\n.icon-yanjing:before {\n  content: \"\\e9fc\";\n}\n\n.icon-laba:before {\n  content: \"\\e8fd\";\n}\n\n.icon-yingchengka:before {\n  content: \"\\e9fd\";\n}\n\n.icon-maikefeng-xianxing:before {\n  content: \"\\e8fe\";\n}\n\n.icon-yixiangkan:before {\n  content: \"\\e9fe\";\n}\n\n.icon-shoucang:before {\n  content: \"\\e8ff\";\n}\n\n.icon-yingpingmoban:before {\n  content: \"\\e9ff\";\n}\n\n.icon-maikefeng:before {\n  content: \"\\e900\";\n}\n\n.icon-yanchu:before {\n  content: \"\\ea00\";\n}\n\n.icon-xihuan-xianxing:before {\n  content: \"\\e901\";\n}\n\n.icon-xiaomi:before {\n  content: \"\\ea01\";\n}\n\n.icon-shoucang-xianxing:before {\n  content: \"\\e902\";\n}\n\n.icon-yingyuan:before {\n  content: \"\\ea02\";\n}\n\n.icon-xihuan:before {\n  content: \"\\e903\";\n}\n\n.icon-zengjia:before {\n  content: \"\\ea03\";\n}\n\n.icon-gengduo-hengxiang:before {\n  content: \"\\e904\";\n}\n\n.icon-yuyin:before {\n  content: \"\\ea04\";\n}\n\n.icon-gengduo-shuxiang:before {\n  content: \"\\e905\";\n}\n\n.icon-youhuiquan:before {\n  content: \"\\ea05\";\n}\n\n.icon-shijian-xianxing:before {\n  content: \"\\e906\";\n}\n\n.icon-WIFI:before {\n  content: \"\\ea06\";\n}\n\n.icon-shengboyuyinxiaoxi:before {\n  content: \"\\e907\";\n}\n\n.icon-zhibo:before {\n  content: \"\\ea07\";\n}\n\n.icon-shijian:before {\n  content: \"\\e908\";\n}\n\n.icon-youkuhuiyuan:before {\n  content: \"\\ea08\";\n}\n\n.icon-shangchuandaochu:before {\n  content: \"\\e909\";\n}\n\n.icon-yulebao:before {\n  content: \"\\ea09\";\n}\n\n.icon-xiazaidaoru:before {\n  content: \"\\e90a\";\n}\n\n.icon-zhiwen:before {\n  content: \"\\ea0a\";\n}\n\n.icon-baocun-xianxing:before {\n  content: \"\\e90b\";\n}\n\n.icon-aixin1:before {\n  content: \"\\ea0b\";\n}\n\n.icon-shanguangdeng:before {\n  content: \"\\e90c\";\n}\n\n.icon-chenggong1:before {\n  content: \"\\ea0c\";\n}\n\n.icon-shanguangdeng-zidong:before {\n  content: \"\\e90d\";\n}\n\n.icon-dianzan1:before {\n  content: \"\\ea0d\";\n}\n\n.icon-shanguangdeng-guanbi:before {\n  content: \"\\e90e\";\n}\n\n.icon-dianhua2:before {\n  content: \"\\ea0e\";\n}\n\n.icon-baocun:before {\n  content: \"\\e90f\";\n}\n\n.icon-bangzhu1:before {\n  content: \"\\ea0f\";\n}\n\n.icon-yonghu-xianxing:before {\n  content: \"\\e910\";\n}\n\n.icon-dianyingpiao1:before {\n  content: \"\\ea10\";\n}\n\n.icon-yonghu:before {\n  content: \"\\e911\";\n}\n\n.icon-faxian1:before {\n  content: \"\\ea11\";\n}\n\n.icon-jiaosequnti:before {\n  content: \"\\e912\";\n}\n\n.icon-dingwei2:before {\n  content: \"\\ea12\";\n}\n\n.icon-morentouxiang:before {\n  content: \"\\e913\";\n}\n\n.icon-gonggao:before {\n  content: \"\\ea13\";\n}\n\n.icon-zhucetianjiahaoyou:before {\n  content: \"\\e914\";\n}\n\n.icon-huati1:before {\n  content: \"\\ea14\";\n}\n\n.icon-renwu:before {\n  content: \"\\e915\";\n}\n\n.icon-jianshao1:before {\n  content: \"\\ea15\";\n}\n\n.icon-zhongwenmoshi:before {\n  content: \"\\e916\";\n}\n\n.icon-huiyuan1:before {\n  content: \"\\ea16\";\n}\n\n.icon-fujian:before {\n  content: \"\\e917\";\n}\n\n.icon-pinglun1:before {\n  content: \"\\ea17\";\n}\n\n.icon-bianjishuru-xianxing:before {\n  content: \"\\e918\";\n}\n\n.icon-shequ1:before {\n  content: \"\\ea18\";\n}\n\n.icon-bianjishuru:before {\n  content: \"\\e919\";\n}\n\n.icon-shibai1:before {\n  content: \"\\ea19\";\n}\n\n.icon-yingwenmoshi:before {\n  content: \"\\e91a\";\n}\n\n.icon-shijian2:before {\n  content: \"\\ea1a\";\n}\n\n.icon-jianpan-xianxing:before {\n  content: \"\\e91b\";\n}\n\n.icon-shandian1:before {\n  content: \"\\ea1b\";\n}\n\n.icon-jianpan:before {\n  content: \"\\e91c\";\n}\n\n.icon-wode1:before {\n  content: \"\\ea1c\";\n}\n\n.icon-rili:before {\n  content: \"\\e91d\";\n}\n\n.icon-shouye2:before {\n  content: \"\\ea1d\";\n}\n\n.icon-weichuqin:before {\n  content: \"\\e91e\";\n}\n\n.icon-shouji1:before {\n  content: \"\\ea1e\";\n}\n\n.icon-kaoqinchuqin:before {\n  content: \"\\e91f\";\n}\n\n.icon-tanhao1:before {\n  content: \"\\ea1f\";\n}\n\n.icon-paizhao:before {\n  content: \"\\e920\";\n}\n\n.icon-shoucang2:before {\n  content: \"\\ea20\";\n}\n\n.icon-paizhao-xianxing:before {\n  content: \"\\e921\";\n}\n\n.icon-shuju1:before {\n  content: \"\\ea21\";\n}\n\n.icon-tupian-xianxing:before {\n  content: \"\\e922\";\n}\n\n.icon-wenda:before {\n  content: \"\\ea22\";\n}\n\n.icon-tupian:before {\n  content: \"\\e923\";\n}\n\n.icon-yanjing1:before {\n  content: \"\\ea23\";\n}\n\n.icon-saomiao:before {\n  content: \"\\e924\";\n}\n\n.icon-yingchengka1:before {\n  content: \"\\ea24\";\n}\n\n.icon-xianshikejian:before {\n  content: \"\\e925\";\n}\n\n.icon-xiangji1:before {\n  content: \"\\ea25\";\n}\n\n.icon-suoding:before {\n  content: \"\\e926\";\n}\n\n.icon-yingyuan1:before {\n  content: \"\\ea26\";\n}\n\n.icon-yincangbukejian:before {\n  content: \"\\e927\";\n}\n\n.icon-yinhangyouhui:before {\n  content: \"\\ea27\";\n}\n\n.icon-jiesuo:before {\n  content: \"\\e928\";\n}\n\n.icon-xiaoshi1:before {\n  content: \"\\ea28\";\n}\n\n.icon-anzhuangshigong-xianxing:before {\n  content: \"\\e929\";\n}\n\n.icon-yanchu1:before {\n  content: \"\\ea29\";\n}\n\n.icon-shaixuanguolv:before {\n  content: \"\\e92a\";\n}\n\n.icon-zengjia1:before {\n  content: \"\\ea2a\";\n}\n\n.icon-anzhuangshigong:before {\n  content: \"\\e92b\";\n}\n\n.icon-dianying1:before {\n  content: \"\\ea2b\";\n}\n\n.icon-zhuxiaoguanji:before {\n  content: \"\\e92c\";\n}\n\n.icon-youhuiquan1:before {\n  content: \"\\ea2c\";\n}\n\n.icon-haoping-yuankuang:before {\n  content: \"\\e92d\";\n}\n\n.icon-remen:before {\n  content: \"\\ea2d\";\n}\n\n.icon-chaping-yuankuang:before {\n  content: \"\\e92e\";\n}\n\n.icon-chuangzuo1:before {\n  content: \"\\ea2e\";\n}\n\n.icon-chaping:before {\n  content: \"\\e92f\";\n}\n\n.icon-haoping:before {\n  content: \"\\e930\";\n}\n\n.icon-yiban:before {\n  content: \"\\e931\";\n}\n\n.icon-manyi:before {\n  content: \"\\e932\";\n}\n\n.icon-bumanyi:before {\n  content: \"\\e933\";\n}\n\n.icon-liebiaoshitucaidan:before {\n  content: \"\\e934\";\n}\n\n.icon-gonggeshitu:before {\n  content: \"\\e935\";\n}\n\n.icon-Phoneshouji:before {\n  content: \"\\e936\";\n}\n\n.icon-PCtaishiji:before {\n  content: \"\\e937\";\n}\n\n.icon-PDAshouchigongzuoshebei:before {\n  content: \"\\e938\";\n}\n\n.icon-jia-fangkuang:before {\n  content: \"\\e939\";\n}\n\n.icon-jia-xianxingfangkuang:before {\n  content: \"\\e93a\";\n}\n\n.icon-jia-xianxingyuankuang:before {\n  content: \"\\e93b\";\n}\n\n.icon-jia-yuankuang:before {\n  content: \"\\e93c\";\n}\n\n.icon-jian-fangkuang:before {\n  content: \"\\e93d\";\n}\n\n.icon-jia:before {\n  content: \"\\e93e\";\n}\n\n.icon-jian-yuankuang:before {\n  content: \"\\e93f\";\n}\n\n.icon-jian:before {\n  content: \"\\e940\";\n}\n\n.icon-jian-xianxingfangkuang:before {\n  content: \"\\e941\";\n}\n\n.icon-zhengquewancheng-xianxingyuankuang:before {\n  content: \"\\e942\";\n}\n\n.icon-zhengquewancheng-yuankuang:before {\n  content: \"\\e943\";\n}\n\n.icon-zhengquewancheng:before {\n  content: \"\\e944\";\n}\n\n.icon-jian-xianxingyuankuang:before {\n  content: \"\\e945\";\n}\n\n.icon-cuowuguanbiquxiao-xianxingfangkuang:before {\n  content: \"\\e946\";\n}\n\n.icon-cuowuguanbiquxiao-yuankuang:before {\n  content: \"\\e947\";\n}\n\n.icon-cuowuguanbiquxiao-xianxingyuankuang:before {\n  content: \"\\e948\";\n}\n\n.icon-cuowuguanbiquxiao:before {\n  content: \"\\e949\";\n}\n\n.icon-cuowuguanbiquxiao-fangkuang:before {\n  content: \"\\e94a\";\n}\n\n.icon-xinxi-xianxingyuankuang:before {\n  content: \"\\e94b\";\n}\n\n.icon-xinxi:before {\n  content: \"\\e94c\";\n}\n\n.icon-wenhao-xianxingyuankuang:before {\n  content: \"\\e94d\";\n}\n\n.icon-wenhao:before {\n  content: \"\\e94e\";\n}\n\n.icon-wenhao-yuankuang:before {\n  content: \"\\e94f\";\n}\n\n.icon-xinxi-yuankuang:before {\n  content: \"\\e950\";\n}\n\n.icon-gantanhao-sanjiaokuang:before {\n  content: \"\\e951\";\n}\n\n.icon-gantanhao-yuankuang:before {\n  content: \"\\e952\";\n}\n\n.icon-gantanhao-xianxingyuankuang:before {\n  content: \"\\e953\";\n}\n\n.icon-gantanhao-xianxingsanjiaokuang:before {\n  content: \"\\e954\";\n}\n\n.icon-gantanhao:before {\n  content: \"\\e955\";\n}\n\n.icon-shangyiyehoutuifanhui-xianxingyuankuang:before {\n  content: \"\\e956\";\n}\n\n.icon-shangyiyehoutuifanhui-yuankuang:before {\n  content: \"\\e957\";\n}\n\n.icon-xiayiyeqianjinchakangengduo-xianxingyuankuang:before {\n  content: \"\\e958\";\n}\n\n.icon-xiayiyeqianjinchakangengduo-yuankuang:before {\n  content: \"\\e959\";\n}\n\n.icon-shangyiyehoutuifanhui:before {\n  content: \"\\e95a\";\n}\n\n.icon-xiayiyeqianjinchakangengduo:before {\n  content: \"\\e95b\";\n}\n\n.icon-xiangxiazhankai-xianxingyuankuang:before {\n  content: \"\\e95c\";\n}\n\n.icon-xiangxiazhankai-yuankuang:before {\n  content: \"\\e95d\";\n}\n\n.icon-xiangxiazhankai:before {\n  content: \"\\e95e\";\n}\n\n.icon-xiangshangshouqi-yuankuang:before {\n  content: \"\\e95f\";\n}\n\n.icon-xiangshangshouqi-xianxingyuankuang:before {\n  content: \"\\e960\";\n}\n\n.icon-zhixiangzuo:before {\n  content: \"\\e961\";\n}\n\n.icon-zhixiangyou:before {\n  content: \"\\e962\";\n}\n\n.icon-zhixiangshang:before {\n  content: \"\\e963\";\n}\n\n.icon-weixin2:before {\n  content: \"\\e601\";\n}\n\n.icon-zhifubao:before {\n  content: \"\\e600\";\n}\n\n.icon-qq:before {\n  content: \"\\e62e\";\n}\n\n.icon-weixin:before {\n  content: \"\\e60e\";\n}\n\n.icon-weixin1:before {\n  content: \"\\e621\";\n}\n\n.icon-qq1:before {\n  content: \"\\e607\";\n}\n\n.icon-qq2:before {\n  content: \"\\e66a\";\n}\n\n.icon-umidd17:before {\n  content: \"\\e603\";\n}\n\n.icon-electrical:before {\n  content: \"\\e6d4\";\n}\n\n.icon-home:before {\n  content: \"\\e6d7\";\n}\n\n.icon-electronics:before {\n  content: \"\\e6da\";\n}\n\n.icon-gifts:before {\n  content: \"\\e6db\";\n}\n\n.icon-lights:before {\n  content: \"\\e6de\";\n}\n\n.icon-sports:before {\n  content: \"\\e6e0\";\n}\n\n.icon-toys:before {\n  content: \"\\e6e1\";\n}\n\n.icon-auto:before {\n  content: \"\\e6e3\";\n}\n\n.icon-jewelry:before {\n  content: \"\\e6e4\";\n}\n\n.icon-trade-assurance:before {\n  content: \"\\e6e5\";\n}\n\n.icon-browse:before {\n  content: \"\\e6e6\";\n}\n\n.icon-rfqqm:before {\n  content: \"\\e6e7\";\n}\n\n.icon-rfqquantity:before {\n  content: \"\\e6e8\";\n}\n\n.icon-atmaway:before {\n  content: \"\\e6e9\";\n}\n\n.icon-rfq1:before {\n  content: \"\\e6eb\";\n}\n\n.icon-scanning:before {\n  content: \"\\e6ec\";\n}\n\n.icon-compare:before {\n  content: \"\\e6ee\";\n}\n\n.icon-filter:before {\n  content: \"\\e6f1\";\n}\n\n.icon-pin:before {\n  content: \"\\e6f2\";\n}\n\n.icon-history:before {\n  content: \"\\e6f3\";\n}\n\n.icon-productfeatures:before {\n  content: \"\\e6f4\";\n}\n\n.icon-supplierfeatures:before {\n  content: \"\\e6f5\";\n}\n\n.icon-similarproduct:before {\n  content: \"\\e6f6\";\n}\n\n.icon-link:before {\n  content: \"\\e6f7\";\n}\n\n.icon-cut:before {\n  content: \"\\e6f8\";\n}\n\n.icon-navlist:before {\n  content: \"\\e6fa\";\n}\n\n.icon-imagetext:before {\n  content: \"\\e6fb\";\n}\n\n.icon-text:before {\n  content: \"\\e6fc\";\n}\n\n.icon-move:before {\n  content: \"\\e6fd\";\n}\n\n.icon-subtract:before {\n  content: \"\\e6fe\";\n}\n\n.icon-dollar:before {\n  content: \"\\e702\";\n}\n\n.icon-raw:before {\n  content: \"\\e704\";\n}\n\n.icon-office:before {\n  content: \"\\e705\";\n}\n\n.icon-agriculture:before {\n  content: \"\\e707\";\n}\n\n.icon-machinery:before {\n  content: \"\\e709\";\n}\n\n.icon-assessedbadge:before {\n  content: \"\\e70a\";\n}\n\n.icon-gerenzhongxin:before {\n  content: \"\\e70b\";\n}\n\n.icon-jifen:before {\n  content: \"\\e70c\";\n}\n\n.icon-operation:before {\n  content: \"\\e70e\";\n}\n\n.icon-remind1:before {\n  content: \"\\e713\";\n}\n\n.icon-icondownload:before {\n  content: \"\\e714\";\n}\n\n.icon-map:before {\n  content: \"\\e715\";\n}\n\n.icon-bad:before {\n  content: \"\\e716\";\n}\n\n.icon-good:before {\n  content: \"\\e717\";\n}\n\n.icon-skip:before {\n  content: \"\\e718\";\n}\n\n.icon-iconfontplay2:before {\n  content: \"\\e719\";\n}\n\n.icon-iconfontstop:before {\n  content: \"\\e71a\";\n}\n\n.icon-compass:before {\n  content: \"\\e71b\";\n}\n\n.icon-security:before {\n  content: \"\\e71c\";\n}\n\n.icon-share:before {\n  content: \"\\e71d\";\n}\n\n.icon-store:before {\n  content: \"\\e722\";\n}\n\n.icon-manageorder:before {\n  content: \"\\e723\";\n}\n\n.icon-rejectedorder:before {\n  content: \"\\e724\";\n}\n\n.icon-phone:before {\n  content: \"\\e725\";\n}\n\n.icon-bussinessman:before {\n  content: \"\\e726\";\n}\n\n.icon-shoes:before {\n  content: \"\\e728\";\n}\n\n.icon-mobilephone:before {\n  content: \"\\e72a\";\n}\n\n.icon-emailfilling:before {\n  content: \"\\e72d\";\n}\n\n.icon-favoritesfilling:before {\n  content: \"\\e730\";\n}\n\n.icon-accountfilling:before {\n  content: \"\\e732\";\n}\n\n.icon-creditlevel:before {\n  content: \"\\e735\";\n}\n\n.icon-creditlevelfilling:before {\n  content: \"\\e736\";\n}\n\n.icon-exl:before {\n  content: \"\\e73f\";\n}\n\n.icon-pdf:before {\n  content: \"\\e740\";\n}\n\n.icon-zip:before {\n  content: \"\\e741\";\n}\n\n.icon-sorting:before {\n  content: \"\\e743\";\n}\n\n.icon-copy:before {\n  content: \"\\e744\";\n}\n\n.icon-save:before {\n  content: \"\\e747\";\n}\n\n.icon-inquirytemplate:before {\n  content: \"\\e749\";\n}\n\n.icon-templatedefault:before {\n  content: \"\\e74a\";\n}\n\n.icon-libra:before {\n  content: \"\\e74c\";\n}\n\n.icon-survey1:before {\n  content: \"\\e74e\";\n}\n\n.icon-ship:before {\n  content: \"\\e74f\";\n}\n\n.icon-bussinesscard:before {\n  content: \"\\e753\";\n}\n\n.icon-hot:before {\n  content: \"\\e756\";\n}\n\n.icon-data:before {\n  content: \"\\e757\";\n}\n\n.icon-trade:before {\n  content: \"\\e758\";\n}\n\n.icon-onepage48:before {\n  content: \"\\e75a\";\n}\n\n.icon-signboard:before {\n  content: \"\\e75c\";\n}\n\n.icon-shuffling-banner:before {\n  content: \"\\e75e\";\n}\n\n.icon-component:before {\n  content: \"\\e75f\";\n}\n\n.icon-component-filling:before {\n  content: \"\\e760\";\n}\n\n.icon-color:before {\n  content: \"\\e761\";\n}\n\n.icon-color-filling:before {\n  content: \"\\e7cd\";\n}\n\n.icon-favorites:before {\n  content: \"\\e7ce\";\n}\n\n.icon-pic-filling:before {\n  content: \"\\e802\";\n}\n\n.icon-RFQ:before {\n  content: \"\\e803\";\n}\n\n.icon-RFQ-filling:before {\n  content: \"\\e804\";\n}\n\n.icon-originalimage:before {\n  content: \"\\e806\";\n}\n\n.icon-logistic:before {\n  content: \"\\e811\";\n}\n\n.icon-Calculator:before {\n  content: \"\\e812\";\n}\n\n.icon-video:before {\n  content: \"\\e820\";\n}\n\n.icon-earth:before {\n  content: \"\\e828\";\n}\n\n.icon-task-management:before {\n  content: \"\\e829\";\n}\n\n.icon-trust:before {\n  content: \"\\e82a\";\n}\n\n.icon-password:before {\n  content: \"\\e82b\";\n}\n\n.icon-column:before {\n  content: \"\\e839\";\n}\n\n.icon-apparel:before {\n  content: \"\\e83a\";\n}\n\n.icon-bags:before {\n  content: \"\\e83b\";\n}\n\n.icon-folder:before {\n  content: \"\\e83c\";\n}\n\n.icon-column1:before {\n  content: \"\\e83d\";\n}\n\n.icon-code:before {\n  content: \"\\e842\";\n}\n\n.icon-RFQ-filling1:before {\n  content: \"\\e843\";\n}\n\n.icon-customs-clearance:before {\n  content: \"\\e863\";\n}\n\n.icon-good-filling:before {\n  content: \"\\e866\";\n}\n\n.icon-camera:before {\n  content: \"\\e86e\";\n}\n\n.icon-pin-fill:before {\n  content: \"\\e87a\";\n}\n\n.icon-help-fill:before {\n  content: \"\\e87b\";\n}\n\n.icon-add-account:before {\n  content: \"\\e87c\";\n}\n\n.icon-listing-content:before {\n  content: \"\\e87d\";\n}\n\n.icon-warehouse-delivery:before {\n  content: \"\\e87e\";\n}\n\n.icon-customization:before {\n  content: \"\\e87f\";\n}\n\n.icon-inspection:before {\n  content: \"\\e880\";\n}\n\n.icon-packing-labeling:before {\n  content: \"\\e881\";\n}\n\n.icon-online-tracking:before {\n  content: \"\\e882\";\n}\n\n.icon-play-filling:before {\n  content: \"\\e883\";\n}\n\n.icon-nosound-filling:before {\n  content: \"\\e884\";\n}\n\n.icon-sound-filling:before {\n  content: \"\\e885\";\n}\n\n.icon-electrical-equipment:before {\n  content: \"\\e886\";\n}\n\n.icon-home-appliances:before {\n  content: \"\\e887\";\n}\n\n.icon-furniture:before {\n  content: \"\\e888\";\n}\n\n.icon-fashion-accessories:before {\n  content: \"\\e889\";\n}\n\n.icon-security-protection:before {\n  content: \"\\e88a\";\n}\n\n.icon-textile-products:before {\n  content: \"\\e88b\";\n}\n\n.icon-tools-hardware:before {\n  content: \"\\e88c\";\n}\n\n.icon-office-supplies:before {\n  content: \"\\e88d\";\n}\n\n.icon-vehicles:before {\n  content: \"\\e88e\";\n}\n\n.icon-all:before {\n  content: \"\\e696\";\n}\n\n.icon-back:before {\n  content: \"\\e697\";\n}\n\n.icon-cart:before {\n  content: \"\\e698\";\n}\n\n.icon-category:before {\n  content: \"\\e699\";\n}\n\n.icon-close:before {\n  content: \"\\e69a\";\n}\n\n.icon-comments:before {\n  content: \"\\e69b\";\n}\n\n.icon-cry:before {\n  content: \"\\e69c\";\n}\n\n.icon-delete:before {\n  content: \"\\e69d\";\n}\n\n.icon-edit:before {\n  content: \"\\e69e\";\n}\n\n.icon-email:before {\n  content: \"\\e69f\";\n}\n\n.icon-favorite:before {\n  content: \"\\e6a0\";\n}\n\n.icon-form:before {\n  content: \"\\e6a2\";\n}\n\n.icon-help:before {\n  content: \"\\e6a3\";\n}\n\n.icon-information:before {\n  content: \"\\e6a4\";\n}\n\n.icon-less:before {\n  content: \"\\e6a5\";\n}\n\n.icon-moreunfold:before {\n  content: \"\\e6a6\";\n}\n\n.icon-more:before {\n  content: \"\\e6a7\";\n}\n\n.icon-pic:before {\n  content: \"\\e6a8\";\n}\n\n.icon-qrcode:before {\n  content: \"\\e6a9\";\n}\n\n.icon-refresh:before {\n  content: \"\\e6aa\";\n}\n\n.icon-rfq:before {\n  content: \"\\e6ab\";\n}\n\n.icon-search:before {\n  content: \"\\e6ac\";\n}\n\n.icon-selected:before {\n  content: \"\\e6ad\";\n}\n\n.icon-set:before {\n  content: \"\\e6ae\";\n}\n\n.icon-smile:before {\n  content: \"\\e6af\";\n}\n\n.icon-success:before {\n  content: \"\\e6b1\";\n}\n\n.icon-survey:before {\n  content: \"\\e6b2\";\n}\n\n.icon-training:before {\n  content: \"\\e6b3\";\n}\n\n.icon-viewgallery:before {\n  content: \"\\e6b4\";\n}\n\n.icon-viewlist:before {\n  content: \"\\e6b5\";\n}\n\n.icon-warning:before {\n  content: \"\\e6b6\";\n}\n\n.icon-wrong:before {\n  content: \"\\e6b7\";\n}\n\n.icon-account:before {\n  content: \"\\e6b8\";\n}\n\n.icon-add:before {\n  content: \"\\e6b9\";\n}\n\n.icon-atm:before {\n  content: \"\\e6ba\";\n}\n\n.icon-clock:before {\n  content: \"\\e6bb\";\n}\n\n.icon-remind:before {\n  content: \"\\e6bc\";\n}\n\n.icon-calendar:before {\n  content: \"\\e6bf\";\n}\n\n.icon-attachment:before {\n  content: \"\\e6c0\";\n}\n\n.icon-discount:before {\n  content: \"\\e6c5\";\n}\n\n.icon-service:before {\n  content: \"\\e6c7\";\n}\n\n.icon-print:before {\n  content: \"\\e6c9\";\n}\n\n.icon-box:before {\n  content: \"\\e6cb\";\n}\n\n.icon-process:before {\n  content: \"\\e6ce\";\n}\n\n.icon-beauty:before {\n  content: \"\\e6d2\";\n}\n\n"
  },
  {
    "path": "app/admin/t/tpl/style/css/style.css",
    "content": ""
  },
  {
    "path": "app/admin/t/tpl/style/css/xadmin.css",
    "content": "@charset \"utf-8\";\n@import url(/static/common/layui/css/layui.css);\n*{\n    margin: 0px;\n    padding: 0px;\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\na{\n    text-decoration: none;\n}\nhtml{\n    width: 100%;\n    height: 100%;\n    overflow-x:hidden; \n    overflow-y:auto;\n}\nbody{\n    width: 100%;\n    min-height: 100%;\n}\n.login-bg{\n    /*background: #eeeeee url() 0 0 no-repeat;*/\n     background:url(../images/bg.png) no-repeat center;\n    background-size: cover;\n    overflow: hidden;\n}\n.login{\n    margin: 120px auto 0 auto;\n    min-height: 420px;\n    max-width: 420px;\n    padding: 40px;\n    background-color: #ffffff;\n    margin-left: auto;\n    margin-right: auto;\n    border-radius: 4px;\n    /* overflow-x: hidden; */\n    box-sizing: border-box;\n}\n.login a.logo{\n    display: block;\n    height: 58px;\n    width: 167px;\n    margin: 0 auto 30px auto;\n    background-size: 167px 42px;\n}\n.login .message {\n    margin: 10px 0 0 -58px;\n    padding: 18px 10px 18px 60px;\n    background: #189F92;\n    position: relative;\n    color: #fff;\n    font-size: 16px;\n}\n.login #darkbannerwrap {\n    background: url(../images/aiwrap.png);\n    width: 18px;\n    height: 10px;\n    margin: 0 0 20px -58px;\n    position: relative;\n}\n\n.login input[type=text],\n.login input[type=file],\n.login input[type=password],\n.login input[type=email], select {\n    border: 1px solid #DCDEE0;\n    vertical-align: middle;\n    border-radius: 3px;\n    height: 50px;\n    padding: 0px 16px;\n    font-size: 14px;\n    color: #555555;\n    outline:none;\n    width:100%;\n    box-sizing: border-box;\n}\n.login input[type=text]:focus,\n.login input[type=file]:focus,\n.login input[type=password]:focus,\n.login input[type=email]:focus, select:focus {\n    border: 1px solid #27A9E3;\n}\n.login input[type=submit],\n.login input[type=button]{\n    display: inline-block;\n    vertical-align: middle;\n    padding: 12px 24px;\n    margin: 0px;\n    font-size: 18px;\n    line-height: 24px;\n    text-align: center;\n    white-space: nowrap;\n    vertical-align: middle;\n    cursor: pointer;\n    color: #ffffff;\n    background-color: #189F92;\n    border-radius: 3px;\n    border: none;\n    -webkit-appearance: none;\n    outline:none;\n    width:100%;\n}\n.login hr {\n    background: #fff url() 0 0 no-repeat;\n}\n.login hr.hr15 {\n    height: 15px;\n    border: none;\n    margin: 0px;\n    padding: 0px;\n    width: 100%;\n}\n.login hr.hr20 {\n    height: 20px;\n    border: none;\n    margin: 0px;\n    padding: 0px;\n    width: 100%;\n}\n.x-body{\n    padding: 20px;\n}\n.x-nav{\n    padding: 0 20px;\n    position: relative;\n    z-index: 99;\n    border-bottom: 1px solid #e5e5e5;\n    line-height: 39px;\n    height: 39px;\n    overflow: hidden;\n}\nxblock{\n    display: block;\n    padding: 5px;\n    line-height: 22px;\n    border-radius: 0 2px 2px 0;\n    background-color: #f2f2f2;\n}\n.x-right{\n  float: right;\n}\n.x-so{\n    /*text-align: center;*/\n    /*background: #f2f2f2 url() 0 0 no-repeat;*/\n    margin-bottom: 20px;\n}\n.x-so input.layui-input{\n    width: 150px;\n}\n.x-so .layui-form-label{\n    display: inline-block;\n}\n.x-so input.layui-input,.x-so input.layui-btn{\n    display: inline-block;\n}\n.x-red{\n    color: red;\n}\n.x-a{\n    color: #1AA093;\n}\n.x-a:hover{\n    color: #127F74;\n}\n.x-sort{\n    height: 30px;\n}\n.x-show{\n    cursor: pointer;\n}\n.layui-form-switch{\n    margin-top: 0px;\n}\n.layui-input:focus, .layui-textarea:focus {\n    border-color: #189f92!important;\n}\n\n.page{\n    margin-top: 20px;\n    text-align: center;\n\n}\n.page a{\n    display: inline-block;\n    background: #fff url() 0 0 no-repeat;\n    color: #888;\n    padding: 5px 10px;\n\theight: 20px;\n    line-height: 20px;\n    min-width: 15px;\n    border: 1px solid #E2E2E2;\n\n}\n.page span{\n    display: inline-block;\n    padding: 10px;\n    min-width: 15px;\n    border: 1px solid #E2E2E2;\n}\n.page span.current{\n    display: inline-block;\n    background: #009688 url() 0 0 no-repeat;\n    color: #fff;\n    padding: 10px;\n    min-width: 15px;\n    border: 1px solid #009688;\n}\n.page .pagination li{\n    display: inline-block;\n    margin-right: 5px;\n    text-align: center;\n}\n.page .pagination li.active span{\n    background: #009688 url() 0 0 no-repeat;\n    color: #fff;\n    border: 1px solid #009688;\n\n}\n\n/*登录样式*/\n/*头部*/\n.container{\n    width: 100%;\n    height: 60px;\n    background-color: #009688;\n    border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n}\n.container .logo a{\n    float: left;\n    color: #fff;\n    font-size: 18px;\n    padding-left: 30px;\n    line-height: 60px;\n    width: 170px;\n}\n.container .right{\n    background-color:rgba(0,0,0,0);\n    float: right;\n\n}\n.container .left_open{\n    height: 60px;\n    float: left;\n}\n.container .left_open i{\n    display: block;\n    background: rgba(255,255,255,0.1) url() 0 0 no-repeat;\n    color: #fff;\n    width: 32px;\n    height: 32px;\n    line-height: 32px;\n    border-radius: 3px;\n    text-align: center;\n    margin-top: 15px;\n    cursor: pointer;\n}\n.container .left_open i:hover{\n    background: rgba(255,255,255,0.3) url() 0 0 no-repeat;\n}\n\n.container .left{\n    background-color:rgba(0,0,0,0);\n    float: left;\n\n}\n.container .layui-nav-item{\n    line-height: 60px;\n}\n.container .layui-nav-item a i.iconfont{\n    padding-right:10px;\n}\n.container .layui-nav-child{\n    top: 60px;\n}\n.container .layui-nav-child i{\n    margin-right: 10px;\n}\n.layui-nav .layui-nav-item a{\n    color: #fff;\n    cursor: pointer;\n}\n.layui-nav .layui-nav-child a{\n    color: #333;\n    cursor: pointer;\n}\n.left-nav{\n    position: absolute;\n    top: 60px;\n    left: 0;\n    z-index: 2;\n    background-color: #393D49;\n    color: #fff;\n    width: 200px;\n    max-width: 200px;\n    overflow-x:hidden;\n    border-right: 1px solid #e5e5e5;\n    overflow:hidden;\n\n    /*width: 0px;*/\n}\n\n.left-nav #nav li{\n    display: block;\n    width: 100%;\n   /* line-height: 45px;*/\n}\nul.sub-menu li:hover {\n    background-color: #4E5465;\n}\n\n\n.sub-menu li a{\n    color: rgba(255,255,255,.7);\n}\n\n.left-nav #nav li:hover > a{\n   /*color: blue;*/\n}\n.left-nav #nav .current{\n    background-color: #009688;\n    color: #fff;\n}\n.left-nav #nav .current a{\n    color: #fff;\n}\n.sub-menu li{\n    background-color: rgba(0, 0, 0, 0.3);\n}\nli.open a {\n    color: #fff;\n}\n.left-nav #nav li a{\n    font-size: 14px;\n    padding: 12px 5px 12px 30px;\n    display: block;\n    cursor: pointer;\n    color: rgba(255,255,255,.7);\n}\n\n.left-nav #nav li a cite{\n    font-size: 14px;\n}\n\n.left-nav #nav li .sub-menu{\n    display: none;\n    background-color: rgba(0,0,0,.3)!important;\n}\n.left-nav #nav li .opened{\n    display: block;\n}\n.left-nav #nav li .opened:hover{\n    /*background: #fff url() 0 0 no-repeat;*/\n}\n.left-nav #nav li .opened .current{\n    \n}\n.left-nav #nav li .sub-menu li:hover{\n    /*color: blue;*/\n     /*background: #fff url() 0 0 no-repeat;*/\n}\n.left-nav #nav li .sub-menu li a{\n    padding: 12px 15px 12px 60px;\n    font-size: 14px;\n    cursor: pointer;\n}\n.left-nav #nav li .sub-menu li .sub-menu li a{\n    padding-left: 60px;\n}\n.left-nav #nav li .sub-menu li a:hover{\n  /*  color: #009688;*/\n}\n.left-nav #nav li .sub-menu li a i{\n    font-size: 12px;\n}\n.left-nav #nav li a i{\n    padding-right: 10px;\n    line-height: 14px;\n}\n.left-nav #nav li .nav_right{\n    float: right;\n    font-size: 16px;\n   padding-right: 10px;\n}\n.x-slide_left {\n    width: 17px;\n    height: 61px;\n    background: url(../images/icon.png) 0 0 no-repeat;\n    position: absolute;\n    top: 200px;\n    left: 221px;\n    cursor: pointer;\n    z-index: 3;\n}\n.page-content{\n    position: absolute;\n    top: 60px;\n    right: 0;\n    bottom: 42px;\n    left: 200px;\n    overflow: hidden;\n    z-index: 1;\n}\n.page-content-bg{\n    position: absolute;\n    top: 60px;\n    right: 0;\n    bottom: 42px;\n    left: 221px;\n    background: rgba(0,0,0,0.5); url() 0 0 no-repeat;\n    overflow: hidden;\n    z-index: 100;\n    display: none;\n}\n\n.page-content .tab{\n    height: 100%;\n    width: 100%;\n    background: #EFEEF0 url() 0 0 no-repeat;\n    margin: 0px;\n}\n.page-content .layui-tab-title{\n    /*padding-top: 5px;*/\n    height: 35px;\n    background: #EFEEF0 url() 0 0 no-repeat;\n    position: relative;\n    z-index: 100;\n}\n.page-content .layui-tab-title li.home i{\n    padding-right: 5px;\n}\n.page-content .layui-tab-title li.home .layui-tab-close{\n    display: none;\n}\n.page-content .layui-tab-title li{\n    line-height: 35px;\n}\n.page-content .layui-tab-title .layui-this:after{\n    height: 36px;\n}\n.page-content .layui-tab-title li .layui-tab-close{\n    border-radius: 50%;\n}\n.page-content .layui-tab-title .layui-this{\n    background: #fff;\n}\n.page-content .layui-tab-bar{\n    height:34px;\n    line-height: 35px;\n}\n.page-content .layui-tab-content{\n    position: absolute;\n    top: 36px;\n    bottom: 0px;\n    width: 100%;\n    background: #fff;\n    padding: 0px;\n    overflow: hidden;\n}\n.page-content .layui-tab-content .layui-tab-item{\n    width: 100%;\n    height: 100%;\n    \n}\n.page-content .layui-tab-content .layui-tab-item iframe{\n    width: 100%;\n    height: 100%;\n\n}\n.x-admin-carousel,.layui-carousel,.x-admin-carousel>[carousel-item]>* {\n    background-color:#fff\n}\n\n.x-admin-backlog .x-admin-backlog-body {\n    display:block;\n    padding:10px 15px;\n    background-color:#f8f8f8;\n    color:#999;\n    border-radius:2px;\n    transition:all .3s;\n    -webkit-transition:all .3s\n}\n.x-admin-backlog-body h3 {\n    padding-bottom:10px;\n    font-size:12px\n}\n.x-admin-backlog-body p cite {\n    font-style:normal;\n    font-size:30px;\n    font-weight:300;\n    color:#009688\n}\n.x-admin-backlog-body:hover {\n    background-color:#CFCFCF;\n    color:#888\n}\n\n.welcome-footer{padding: 30px 0; line-height: 30px; text-align: center; background-color: #eee; color: #666; font-weight: 300;}\nbody .layui-layout-admin .footer-demo{height: auto; padding: 15px 0; line-height: 26px;}\n.welcome-footer a{padding: 0 5px;}\n\ntable th, table td {\n    word-break: break-all;\n}\n\n.footer{\n    position: fixed;\n    bottom: 0px;\n    width: 100%;\n    background-color: #009688;\n    border-top: 1px solid rgba(255, 255, 255, 0.2);\n    line-height: 41px;\n    color: #fff;\n    /*padding-left: 10px;*/\n}\n.footer .copyright{\n    margin-left: 10px;\n}\n\n@media screen and (max-width: 768px){\n    .fast-add{\n        display: none;\n    }\n    .layui-nav .to-index{\n        display: none;\n    }\n    .container .logo a{\n        width: 140px;\n    }\n    .container .left_open {\n        /*float: right;*/\n    }\n    .left-nav{\n        left: -221px;\n    }\n    .page-content{\n        left: 0px;\n    }\n    .page-content .layui-tab-content .layui-tab-item{\n        -webkit-overflow-scrolling: touch; \n        overflow-y: scroll; \n    }\n    .x-so input.layui-input{\n        width: 100%;\n        margin: 10px;\n    }\n}\n\n@media screen and (min-width:768px){\n\tth {\n\t\twhite-space: nowrap;\n\t}\n}\n\n/**右键菜单*/\n.rightmenu {\n    position: absolute;\n    width: 110px;\n    z-index: 9999;\n    display: none;\n    background-color: #fff;\n    padding: 2px;\n    color: #333;\n    border: 1px solid #eee;\n    border-radius: 2px;\n    cursor: pointer;\n}\n\n.rightmenu li {\n    text-align: center;\n    display: block;\n    height: 30px;\n    line-height: 32px;\n}\n\n.rightmenu li:hover {\n    background-color: #666;\n    color: #fff;\n}\n.cmdlist-container img {\n    width: 100%;\n}\n.cmdlist-text .txteax {\n    font-size: 14px;\n}\n.cmdlist-text .txteax b {\n    margin-right: 20px;\n}\n.cmdlist-text .txteax p {\n    display: inline-block;\n}\n.cmdlist-text .flow {\n    text-align: right;\n    float: right;\n}\n.layui-card-header .layui-a-tips {\n    position: absolute;\n    right: 15px;\n    color: #01AAED;\n}\n.layuiadmin-card-status dd {\n    padding: 15px 0;\n    border-bottom: 1px solid #EEE;\n    display: -webkit-flex;\n    display: flex;\n}\n.layuiadmin-card-status dd div.layui-status-img, .layuiadmin-card-team .layui-team-img {\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n    background-color: #009688;\n    margin-right: 15px;\n}\n.layuiadmin-card-status dd div.layui-status-img a {\n    width: 100%;\n    height: 100%;\n    display: inline-block;\n    text-align: center;\n    line-height: 32px;\n}\n.layuiadmin-card-status dd div.layui-status-img img, .layuiadmin-card-team .layui-team-img img {\n    width: 50%;\n    height: 50%;\n}\n.layuiadmin-card-status dd div a {\n    color: #01AAED;\n}\n.layuiadmin-card-status {\n    padding: 0 10px 10px;\n}\n.layuiadmin-card-status li {\n    position: relative;\n    padding: 10px 0;\n    border-bottom: 1px solid #EEE;\n}\n.layuiadmin-card-status li h3 {\n    padding-bottom: 5px;\n    font-weight: 700;\n}\n.layuiadmin-card-status li p {\n    padding-bottom: 10px;\n}\n.layuiadmin-card-status li>span {\n    color: #999;\n}\n.layuiadmin-home2-usernote .layuiadmin-reply {\n    position: absolute;\n    right: 0;\n    bottom: 12px;\n}\n.cmdlist-text .info {\n    height: 40px;\n    font-size: 14px;\n    line-height: 20px;\n    width: 100%;\n    overflow: hidden;\n    color: #666;\n    margin-bottom: 10px;\n}\n\n.layui-nav-bar {height: 3px;}\n.page-content .layui-tab-content,.x-body {background: #f7fcff!important ;}\n.page-content .tab {background: #f7fcff!important ;}\n.layui-bg-black {\tbackground: #333951!important ;}\n.left-nav { top:60px!important ;border: none!important;}\n.left-nav #nav li .sub-menu {background: #333951!important ;}\nul.sub-menu li:hover {background: #02072c!important ;}\n.container .logo a{\tbackground: #212844 ;}\n.left-nav #nav li a {color: #fff;}\n\n.container{    background-color: #212844;}\n.container .left_open {margin-left: 20px;}\n.page-content .layui-tab-title  { padding-top: 10px;padding-left: 15px;}\n.layui-tab-title li {background: #d8e1f4;border-top-left-radius: 6px!important;border-top-right-radius: 6px!important;border: none;margin-right: 8px;}\n.layui-tab-title .layui-this:after {border-top-left-radius: 6px!important;border-top-right-radius: 6px!important;}\n.layui-tab-title .layui-this {background: #f6f7f9!important;}\n.x-nav {background:  #f6f7f9!important;}\n.page-content .layui-tab-title{background: #28304e;}\n.page-content  { top:60px;bottom: 0;}\n.x-admin-backlog-body p cite {color: #2b9ef7;}\n.page-content .layui-tab-content {top:50px}\n.left-nav #nav .current {background: #02072c;}\n.layui-form-onswitch {background: #10d0b7;border-color: #10d0b7;}\nxblock  {background: none;}\nxblock .layui-form-item {margin-bottom: 0;}\nxblock .layui-form-item .layui-form-switch {margin-top: 6px;}\n\n.layui-bg-green {background: #10d0bb!important;}\n.active a {background-color: #2b9ef7!important;}\n.layui-btn-primary ,.layui-btn-primary:hover{color: #fff!important;}\n.layui-table-cell .layui-badge {background: #f76f63 !important;}\n.layui-table-cell .layui-bg-black {background: #b690f3 !important;}\n.layui-table-cell .layui-bg-green {background: #10d0bb !important;}\n\n.layui-laypage .layui-laypage-curr .layui-laypage-em {background-color: #2b9ef7!important;}\n\n.layui-form-item .layui-input-inline {\n\tfloat: left;\n\tmargin-right: 10px;\n}\n#jizhitj{\n\tposition: fixed;\n\tbottom: 10px;\n\tz-index: 9999;\n\twidth: 100%;\n\tmargin-bottom: 10px;\n}\n.layui-form-select dl {\n\tz-index: 999999;\n}\n#jizhitj .layui-btn{padding:0 40px;border-radius: 6px;}\n\n.x-body\t.layui-tab-content {background: #fff;padding:20px 30px;}\n.x-body\t.layui-tab-title .layui-this {background: #fff !important;}\n.x-body\t.layui-tab-title  {border: none!important;}\n.x-body .layui-tab-content\t,.layui-card {box-shadow: 2px 2px 10px rgba(0,0,0,.1)!important;}\n.x-body .layui-fluid {padding: 0;}\n.x-nav .layui-btn {    line-height: 38px!important;margin-top: 0!important;}\n.layui-card .layui-card  {box-shadow:none!important;}\n.x-so {margin-bottom: 0;}\n.layui-collapse {margin-bottom: 20px;background: #fff;}\n\n.layui-btn {background: #2b9ef7;}\n.layui-btn-warm {background: #fdad4e;}\n.layui-btn-danger {background: #f46f5e;}\n.layui-btn-normal {background: #10d0bb;}\n.layui-colla-title,.layui-table tbody tr:hover, .layui-table thead tr, .layui-table-click, .layui-table-header, .layui-table-hover, .layui-table-mend, .layui-table-patch, .layui-table-tool, .layui-table-total, .layui-table-total tr, .layui-table[lay-even] tr:nth-child(even) {background: #f7f8fa;}\n.x-admin-backlog-body {border-radius: 6px!important;}\n.x-admin-backlog-body:hover {background: #2b9ef7;color: #fff;}\n.x-admin-backlog-body:hover p cite {color: #fff;}\n.layui-tab-brief>.layui-tab-title .layui-this {color: #000;}\n.layui-tab-brief>.layui-tab-title .layui-this::after {display: none;}\n.layui-btn-primary {border: none;}\n.layui-form-select dl dd.layui-this {background: #2b9ef7;}\n.layui-input:focus, .layui-textarea:focus {    border-color: #2b9ef7!important;}\n.layui-colla-item input {margin-left: 5px;}\n.layui-colla-item br {display: none;}\n.layui-tab-title li .layui-tab-close {    color: #848484;}\n.login-bg {    \n\tposition: relative;\n\t/* 美女大图背景\n\tbackground: url(http://api.btstu.cn/sjbz/?lx=meizi) no-repeat center; background-size: cover;\n */\n    background: -webkit-gradient(linear, left bottom, left top, from(#3a485a), to(#607089));\n    background: linear-gradient(0deg, #3a485a 0%, #607089 100%);\n\t/* 灰色渐变大背景 */\n}\n/* 美女大图虚化 */\n.login-bg:after{    content: \"\";    width:100%;    height:100%;    position: absolute;    left:0;    top:0;    background: inherit;    filter: blur(10px);    z-index: 2;}\n\n.login {z-index: 999;position: relative;-webkit-box-shadow: 0px 20px 80px 0px rgba(0,0,0,0.3);    box-shadow: 0px 20px 80px 0px rgba(0,0,0,0.3);}\n.login #darkbannerwrap {background: none;}\n.login .message { padding: 0 10px; margin:0;text-align: center;background: none;color: #000;font-weight: bold;font-size: 22px;}\n.login hr {background: none;\t}\n.login input[type=text], .login input[type=file], .login input[type=password], .login input[type=email], select {border-radius: 6px;}\n.login input[type=submit] {background: #2b9ef7;}\n.login { min-height: 300px;border-radius: 6px;}\nul#nav {\n    margin-top: 16px;\n}\n.layui-table-tool .layui-input{\n    height: 32px;\n    line-height: 32px;\n    border-width: 1px;\n    border-style: solid;\n    background-color: #fff;\n    border-radius: 2px;\n\tfont-size:12px;\n}\n.active a{   \n\tbackground: #f00;\n    color: #fff;}\n.upload-icon-img {\n    padding-right: 8px;\n}"
  },
  {
    "path": "app/admin/t/tpl/style/fonts/demo.css",
    "content": "/* Logo 字体 */\n@font-face {\n  font-family: \"iconfont logo\";\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');\n}\n\n.logo {\n  font-family: \"iconfont logo\";\n  font-size: 160px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n/* tabs */\n.nav-tabs {\n  position: relative;\n}\n\n.nav-tabs .nav-more {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  height: 42px;\n  line-height: 42px;\n  color: #666;\n}\n\n#tabs {\n  border-bottom: 1px solid #eee;\n}\n\n#tabs li {\n  cursor: pointer;\n  width: 100px;\n  height: 40px;\n  line-height: 40px;\n  text-align: center;\n  font-size: 16px;\n  border-bottom: 2px solid transparent;\n  position: relative;\n  z-index: 1;\n  margin-bottom: -1px;\n  color: #666;\n}\n\n\n#tabs .active {\n  border-bottom-color: #f00;\n  color: #222;\n}\n\n.tab-container .content {\n  display: none;\n}\n\n/* 页面布局 */\n.main {\n  padding: 30px 100px;\n  width: 960px;\n  margin: 0 auto;\n}\n\n.main .logo {\n  color: #333;\n  text-align: left;\n  margin-bottom: 30px;\n  line-height: 1;\n  height: 110px;\n  margin-top: -50px;\n  overflow: hidden;\n  *zoom: 1;\n}\n\n.main .logo a {\n  font-size: 160px;\n  color: #333;\n}\n\n.helps {\n  margin-top: 40px;\n}\n\n.helps pre {\n  padding: 20px;\n  margin: 10px 0;\n  border: solid 1px #e7e1cd;\n  background-color: #fffdef;\n  overflow: auto;\n}\n\n.icon_lists {\n  width: 100% !important;\n  overflow: hidden;\n  *zoom: 1;\n}\n\n.icon_lists li {\n  width: 100px;\n  margin-bottom: 10px;\n  margin-right: 20px;\n  text-align: center;\n  list-style: none !important;\n  cursor: default;\n}\n\n.icon_lists li .code-name {\n  line-height: 1.2;\n}\n\n.icon_lists .icon {\n  display: block;\n  height: 100px;\n  line-height: 100px;\n  font-size: 42px;\n  margin: 10px auto;\n  color: #333;\n  -webkit-transition: font-size 0.25s linear, width 0.25s linear;\n  -moz-transition: font-size 0.25s linear, width 0.25s linear;\n  transition: font-size 0.25s linear, width 0.25s linear;\n}\n\n.icon_lists .icon:hover {\n  font-size: 100px;\n}\n\n.icon_lists .svg-icon {\n  /* 通过设置 font-size 来改变图标大小 */\n  width: 1em;\n  /* 图标和文字相邻时，垂直对齐 */\n  vertical-align: -0.15em;\n  /* 通过设置 color 来改变 SVG 的颜色/fill */\n  fill: currentColor;\n  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示\n      normalize.css 中也包含这行 */\n  overflow: hidden;\n}\n\n.icon_lists li .name,\n.icon_lists li .code-name {\n  color: #666;\n}\n\n/* markdown 样式 */\n.markdown {\n  color: #666;\n  font-size: 14px;\n  line-height: 1.8;\n}\n\n.highlight {\n  line-height: 1.5;\n}\n\n.markdown img {\n  vertical-align: middle;\n  max-width: 100%;\n}\n\n.markdown h1 {\n  color: #404040;\n  font-weight: 500;\n  line-height: 40px;\n  margin-bottom: 24px;\n}\n\n.markdown h2,\n.markdown h3,\n.markdown h4,\n.markdown h5,\n.markdown h6 {\n  color: #404040;\n  margin: 1.6em 0 0.6em 0;\n  font-weight: 500;\n  clear: both;\n}\n\n.markdown h1 {\n  font-size: 28px;\n}\n\n.markdown h2 {\n  font-size: 22px;\n}\n\n.markdown h3 {\n  font-size: 16px;\n}\n\n.markdown h4 {\n  font-size: 14px;\n}\n\n.markdown h5 {\n  font-size: 12px;\n}\n\n.markdown h6 {\n  font-size: 12px;\n}\n\n.markdown hr {\n  height: 1px;\n  border: 0;\n  background: #e9e9e9;\n  margin: 16px 0;\n  clear: both;\n}\n\n.markdown p {\n  margin: 1em 0;\n}\n\n.markdown>p,\n.markdown>blockquote,\n.markdown>.highlight,\n.markdown>ol,\n.markdown>ul {\n  width: 80%;\n}\n\n.markdown ul>li {\n  list-style: circle;\n}\n\n.markdown>ul li,\n.markdown blockquote ul>li {\n  margin-left: 20px;\n  padding-left: 4px;\n}\n\n.markdown>ul li p,\n.markdown>ol li p {\n  margin: 0.6em 0;\n}\n\n.markdown ol>li {\n  list-style: decimal;\n}\n\n.markdown>ol li,\n.markdown blockquote ol>li {\n  margin-left: 20px;\n  padding-left: 4px;\n}\n\n.markdown code {\n  margin: 0 3px;\n  padding: 0 5px;\n  background: #eee;\n  border-radius: 3px;\n}\n\n.markdown strong,\n.markdown b {\n  font-weight: 600;\n}\n\n.markdown>table {\n  border-collapse: collapse;\n  border-spacing: 0px;\n  empty-cells: show;\n  border: 1px solid #e9e9e9;\n  width: 95%;\n  margin-bottom: 24px;\n}\n\n.markdown>table th {\n  white-space: nowrap;\n  color: #333;\n  font-weight: 600;\n}\n\n.markdown>table th,\n.markdown>table td {\n  border: 1px solid #e9e9e9;\n  padding: 8px 16px;\n  text-align: left;\n}\n\n.markdown>table th {\n  background: #F7F7F7;\n}\n\n.markdown blockquote {\n  font-size: 90%;\n  color: #999;\n  border-left: 4px solid #e9e9e9;\n  padding-left: 0.8em;\n  margin: 1em 0;\n}\n\n.markdown blockquote p {\n  margin: 0;\n}\n\n.markdown .anchor {\n  opacity: 0;\n  transition: opacity 0.3s ease;\n  margin-left: 8px;\n}\n\n.markdown .waiting {\n  color: #ccc;\n}\n\n.markdown h1:hover .anchor,\n.markdown h2:hover .anchor,\n.markdown h3:hover .anchor,\n.markdown h4:hover .anchor,\n.markdown h5:hover .anchor,\n.markdown h6:hover .anchor {\n  opacity: 1;\n  display: inline-block;\n}\n\n.markdown>br,\n.markdown>p>br {\n  clear: both;\n}\n\n\n.hljs {\n  display: block;\n  background: white;\n  padding: 0.5em;\n  color: #333333;\n  overflow-x: auto;\n}\n\n.hljs-comment,\n.hljs-meta {\n  color: #969896;\n}\n\n.hljs-string,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-strong,\n.hljs-emphasis,\n.hljs-quote {\n  color: #df5000;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-type {\n  color: #a71d5d;\n}\n\n.hljs-literal,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-attribute {\n  color: #0086b3;\n}\n\n.hljs-section,\n.hljs-name {\n  color: #63a35c;\n}\n\n.hljs-tag {\n  color: #333333;\n}\n\n.hljs-title,\n.hljs-attr,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #795da3;\n}\n\n.hljs-addition {\n  color: #55a532;\n  background-color: #eaffea;\n}\n\n.hljs-deletion {\n  color: #bd2c00;\n  background-color: #ffecec;\n}\n\n.hljs-link {\n  text-decoration: underline;\n}\n\n/* 代码高亮 */\n/* PrismJS 1.15.0\nhttps://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */\n/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n  color: black;\n  background: none;\n  text-shadow: 0 1px white;\n  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n  text-align: left;\n  white-space: pre;\n  word-spacing: normal;\n  word-break: normal;\n  word-wrap: normal;\n  line-height: 1.5;\n\n  -moz-tab-size: 4;\n  -o-tab-size: 4;\n  tab-size: 4;\n\n  -webkit-hyphens: none;\n  -moz-hyphens: none;\n  -ms-hyphens: none;\n  hyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection,\npre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection,\ncode[class*=\"language-\"] ::-moz-selection {\n  text-shadow: none;\n  background: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection,\npre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection,\ncode[class*=\"language-\"] ::selection {\n  text-shadow: none;\n  background: #b3d4fc;\n}\n\n@media print {\n\n  code[class*=\"language-\"],\n  pre[class*=\"language-\"] {\n    text-shadow: none;\n  }\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n  padding: 1em;\n  margin: .5em 0;\n  overflow: auto;\n}\n\n:not(pre)>code[class*=\"language-\"],\npre[class*=\"language-\"] {\n  background: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre)>code[class*=\"language-\"] {\n  padding: .1em;\n  border-radius: .3em;\n  white-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n  color: slategray;\n}\n\n.token.punctuation {\n  color: #999;\n}\n\n.namespace {\n  opacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n  color: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n  color: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n  color: #9a6e3a;\n  background: hsla(0, 0%, 100%, .5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n  color: #07a;\n}\n\n.token.function,\n.token.class-name {\n  color: #DD4A68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n  color: #e90;\n}\n\n.token.important,\n.token.bold {\n  font-weight: bold;\n}\n\n.token.italic {\n  font-style: italic;\n}\n\n.token.entity {\n  cursor: help;\n}\n"
  },
  {
    "path": "app/admin/t/tpl/style/fonts/iconfont.css",
    "content": "@font-face {\n  font-family: \"iconfont\"; /* Project id 1357552 */\n  src: url('iconfont.woff2?t=1638967197290') format('woff2'),\n       url('iconfont.woff?t=1638967197290') format('woff'),\n       url('iconfont.ttf?t=1638967197290') format('truetype');\n}\n\n.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-xiangshangshouqi:before {\n  content: \"\\e964\";\n}\n\n.icon-zhixiangxia:before {\n  content: \"\\e965\";\n}\n\n.icon-diyiye:before {\n  content: \"\\e966\";\n}\n\n.icon-zuihouye:before {\n  content: \"\\e967\";\n}\n\n.icon-biaotou-zhengxu:before {\n  content: \"\\e968\";\n}\n\n.icon-biaotou-kepaixu:before {\n  content: \"\\e969\";\n}\n\n.icon-biaotou-daoxu:before {\n  content: \"\\e96a\";\n}\n\n.icon-huidingbu:before {\n  content: \"\\e96b\";\n}\n\n.icon-xiangzuojiaohuan:before {\n  content: \"\\e96c\";\n}\n\n.icon-xianghujiaohuan:before {\n  content: \"\\e96d\";\n}\n\n.icon-xiangyoujiaohuan:before {\n  content: \"\\e96e\";\n}\n\n.icon-shuzhixiajiang:before {\n  content: \"\\e96f\";\n}\n\n.icon-quanping:before {\n  content: \"\\e970\";\n}\n\n.icon-hengxiangzhankai:before {\n  content: \"\\e971\";\n}\n\n.icon-shuzhishangsheng:before {\n  content: \"\\e972\";\n}\n\n.icon-tuichuquanping:before {\n  content: \"\\e973\";\n}\n\n.icon-hengxiangshouqi:before {\n  content: \"\\e974\";\n}\n\n.icon-shuaxin:before {\n  content: \"\\e975\";\n}\n\n.icon-tongbu:before {\n  content: \"\\e976\";\n}\n\n.icon-jiazailoading-A:before {\n  content: \"\\e977\";\n}\n\n.icon-jiazailoading-B:before {\n  content: \"\\e978\";\n}\n\n.icon-weizhi-xianxing:before {\n  content: \"\\e979\";\n}\n\n.icon-weizhi:before {\n  content: \"\\e97a\";\n}\n\n.icon-daohang:before {\n  content: \"\\e97b\";\n}\n\n.icon-dingwei:before {\n  content: \"\\e97c\";\n}\n\n.icon-jiankongshexiangtou-xianxing:before {\n  content: \"\\e97d\";\n}\n\n.icon-tuodiantu:before {\n  content: \"\\e97e\";\n}\n\n.icon-jiankongshexiangtou:before {\n  content: \"\\e97f\";\n}\n\n.icon-leidatance:before {\n  content: \"\\e980\";\n}\n\n.icon-baobiao:before {\n  content: \"\\e981\";\n}\n\n.icon-bingtu-xianxing:before {\n  content: \"\\e982\";\n}\n\n.icon-baobiao-xianxing:before {\n  content: \"\\e983\";\n}\n\n.icon-bingtu:before {\n  content: \"\\e984\";\n}\n\n.icon-tiaoxingtu:before {\n  content: \"\\e985\";\n}\n\n.icon-tiaoxingtu-xianxing:before {\n  content: \"\\e986\";\n}\n\n.icon-zhexiantu:before {\n  content: \"\\e987\";\n}\n\n.icon-zhexiantu-xianxing:before {\n  content: \"\\e988\";\n}\n\n.icon-zhinanzhidao-xianxing:before {\n  content: \"\\e989\";\n}\n\n.icon-ditu:before {\n  content: \"\\e98a\";\n}\n\n.icon-zhinanzhidao:before {\n  content: \"\\e98b\";\n}\n\n.icon-tousu:before {\n  content: \"\\e98c\";\n}\n\n.icon-xunjianjianyan:before {\n  content: \"\\e98d\";\n}\n\n.icon-dianpu:before {\n  content: \"\\e98e\";\n}\n\n.icon-yunshuzhongwuliu-xianxing:before {\n  content: \"\\e88f\";\n}\n\n.icon-dianpu-xianxing:before {\n  content: \"\\e98f\";\n}\n\n.icon-yunshuzhongwuliu:before {\n  content: \"\\e890\";\n}\n\n.icon-kuaidiyuan:before {\n  content: \"\\e990\";\n}\n\n.icon-baoguofahuo:before {\n  content: \"\\e891\";\n}\n\n.icon-kuaidiyuan-xianxing:before {\n  content: \"\\e991\";\n}\n\n.icon-baoguofahuo-xianxing:before {\n  content: \"\\e892\";\n}\n\n.icon-daikuan-xianxing:before {\n  content: \"\\e992\";\n}\n\n.icon-chaibaoguoqujian:before {\n  content: \"\\e893\";\n}\n\n.icon-huankuan-xianxing:before {\n  content: \"\\e993\";\n}\n\n.icon-chaibaoguoqujian-xianxing:before {\n  content: \"\\e894\";\n}\n\n.icon-tuikuan-xi:before {\n  content: \"\\e994\";\n}\n\n.icon-zitigui:before {\n  content: \"\\e895\";\n}\n\n.icon-rili-xianxing-xi:before {\n  content: \"\\e995\";\n}\n\n.icon-zitigui-xianxing:before {\n  content: \"\\e896\";\n}\n\n.icon-jisuanqilishuai-xianxing-xi:before {\n  content: \"\\e996\";\n}\n\n.icon-caigou-xianxing:before {\n  content: \"\\e897\";\n}\n\n.icon-yonghuziliao:before {\n  content: \"\\e997\";\n}\n\n.icon-caigou:before {\n  content: \"\\e898\";\n}\n\n.icon-yonghuziliao-xianxing:before {\n  content: \"\\e998\";\n}\n\n.icon-shangpin:before {\n  content: \"\\e899\";\n}\n\n.icon-pifuzhuti:before {\n  content: \"\\e999\";\n}\n\n.icon-shangpin-xianxing:before {\n  content: \"\\e89a\";\n}\n\n.icon-pifuzhuti-xianxing:before {\n  content: \"\\e99a\";\n}\n\n.icon-peizaizhuangche:before {\n  content: \"\\e89b\";\n}\n\n.icon-diamond:before {\n  content: \"\\e99b\";\n}\n\n.icon-peizaizhuangche-xianxing:before {\n  content: \"\\e89c\";\n}\n\n.icon-diamond-o:before {\n  content: \"\\e99c\";\n}\n\n.icon-zhiliang-xianxing:before {\n  content: \"\\e89d\";\n}\n\n.icon-sheji-xianxing:before {\n  content: \"\\e99d\";\n}\n\n.icon-zhiliang:before {\n  content: \"\\e89e\";\n}\n\n.icon-kaifa-xianxing:before {\n  content: \"\\e99e\";\n}\n\n.icon-anquanbaozhang:before {\n  content: \"\\e89f\";\n}\n\n.icon-yinhangqia:before {\n  content: \"\\e99f\";\n}\n\n.icon-anquanbaozhang-xianxing:before {\n  content: \"\\e8a0\";\n}\n\n.icon-yinhangqia-xianxing:before {\n  content: \"\\e9a0\";\n}\n\n.icon-cangkucangchu:before {\n  content: \"\\e8a1\";\n}\n\n.icon-hongbao-xianxing:before {\n  content: \"\\e9a1\";\n}\n\n.icon-cangkucangchu-xianxing:before {\n  content: \"\\e8a2\";\n}\n\n.icon-hongbao:before {\n  content: \"\\e9a2\";\n}\n\n.icon-zhongzhuanzhan-xianxing:before {\n  content: \"\\e8a3\";\n}\n\n.icon-aixin:before {\n  content: \"\\e9a3\";\n}\n\n.icon-zhongzhuanzhan:before {\n  content: \"\\e8a4\";\n}\n\n.icon-bianji:before {\n  content: \"\\e9a4\";\n}\n\n.icon-kucun-xianxing:before {\n  content: \"\\e8a5\";\n}\n\n.icon-Dyanjing:before {\n  content: \"\\e9a5\";\n}\n\n.icon-kucun:before {\n  content: \"\\e8a6\";\n}\n\n.icon-caidan:before {\n  content: \"\\e9a6\";\n}\n\n.icon-moduanwangdian-xianxing:before {\n  content: \"\\e8a7\";\n}\n\n.icon-anquan:before {\n  content: \"\\e9a7\";\n}\n\n.icon-moduanwangdian:before {\n  content: \"\\e8a8\";\n}\n\n.icon-bangzhu:before {\n  content: \"\\e9a8\";\n}\n\n.icon-qianshoushenpitongguo-xianxing:before {\n  content: \"\\e8a9\";\n}\n\n.icon-buganxingqu:before {\n  content: \"\\e9a9\";\n}\n\n.icon-qianshoushenpitongguo:before {\n  content: \"\\e8aa\";\n}\n\n.icon-bofangjilu:before {\n  content: \"\\e9aa\";\n}\n\n.icon-juqianshou-xianxing:before {\n  content: \"\\e8ab\";\n}\n\n.icon-chuangzuo:before {\n  content: \"\\e9ab\";\n}\n\n.icon-juqianshou:before {\n  content: \"\\e8ac\";\n}\n\n.icon-chenggong:before {\n  content: \"\\e9ac\";\n}\n\n.icon-jijianfasong-xianxing:before {\n  content: \"\\e8ad\";\n}\n\n.icon-ceshi:before {\n  content: \"\\e9ad\";\n}\n\n.icon-jijianfasong:before {\n  content: \"\\e8ae\";\n}\n\n.icon-dianhua1:before {\n  content: \"\\e9ae\";\n}\n\n.icon-qiyeyuanquwuye:before {\n  content: \"\\e8af\";\n}\n\n.icon-dianzan:before {\n  content: \"\\e9af\";\n}\n\n.icon-qiyeyuanquwuye-xianxing:before {\n  content: \"\\e8b0\";\n}\n\n.icon-dingwei1:before {\n  content: \"\\e9b0\";\n}\n\n.icon-jiesuan-xianxing:before {\n  content: \"\\e8b1\";\n}\n\n.icon-diantong_guan:before {\n  content: \"\\e9b1\";\n}\n\n.icon-jiesuan:before {\n  content: \"\\e8b2\";\n}\n\n.icon-dianying:before {\n  content: \"\\e9b2\";\n}\n\n.icon-jifen1:before {\n  content: \"\\e8b3\";\n}\n\n.icon-ditu1:before {\n  content: \"\\e9b3\";\n}\n\n.icon-jifen-xianxing:before {\n  content: \"\\e8b4\";\n}\n\n.icon-diantong_kai:before {\n  content: \"\\e9b4\";\n}\n\n.icon-youhuijuan-xianxing:before {\n  content: \"\\e8b5\";\n}\n\n.icon-dianyingpiao:before {\n  content: \"\\e9b5\";\n}\n\n.icon-ziliaoshouce:before {\n  content: \"\\e8b6\";\n}\n\n.icon-dingdan:before {\n  content: \"\\e9b6\";\n}\n\n.icon-ziliaoshouce-xianxing:before {\n  content: \"\\e8b7\";\n}\n\n.icon-gengduo:before {\n  content: \"\\e9b7\";\n}\n\n.icon-youhuijuan:before {\n  content: \"\\e8b8\";\n}\n\n.icon-fanbei:before {\n  content: \"\\e9b8\";\n}\n\n.icon-guize:before {\n  content: \"\\e8b9\";\n}\n\n.icon-faxian:before {\n  content: \"\\e9b9\";\n}\n\n.icon-danju-xianxing:before {\n  content: \"\\e8ba\";\n}\n\n.icon-ertongpiao:before {\n  content: \"\\e9ba\";\n}\n\n.icon-zuzhijiagoujiekou:before {\n  content: \"\\e8bb\";\n}\n\n.icon-gongyi:before {\n  content: \"\\e9bb\";\n}\n\n.icon-danju:before {\n  content: \"\\e8bc\";\n}\n\n.icon-hongbao1:before {\n  content: \"\\e9bc\";\n}\n\n.icon-chuangjiandanju-xianxing:before {\n  content: \"\\e8bd\";\n}\n\n.icon-fuzhi:before {\n  content: \"\\e9bd\";\n}\n\n.icon-chuangjiandanju:before {\n  content: \"\\e8be\";\n}\n\n.icon-fenxiang:before {\n  content: \"\\e9be\";\n}\n\n.icon-zhangdan-xianxing:before {\n  content: \"\\e8bf\";\n}\n\n.icon-huatifuhao:before {\n  content: \"\\e9bf\";\n}\n\n.icon-zhangdan:before {\n  content: \"\\e8c0\";\n}\n\n.icon-huiyuan:before {\n  content: \"\\e9c0\";\n}\n\n.icon-tijikongjian:before {\n  content: \"\\e8c1\";\n}\n\n.icon-aliyu:before {\n  content: \"\\e9c1\";\n}\n\n.icon-tijikongjian-xianxing:before {\n  content: \"\\e8c2\";\n}\n\n.icon-jiju:before {\n  content: \"\\e9c2\";\n}\n\n.icon-yewu-xianxing:before {\n  content: \"\\e8c3\";\n}\n\n.icon-jianshao:before {\n  content: \"\\e9c3\";\n}\n\n.icon-yewu:before {\n  content: \"\\e8c4\";\n}\n\n.icon-kabao:before {\n  content: \"\\e9c4\";\n}\n\n.icon-yingyongchengxu-xianxing:before {\n  content: \"\\e8c5\";\n}\n\n.icon-huati:before {\n  content: \"\\e9c5\";\n}\n\n.icon-yingyongchengxu:before {\n  content: \"\\e8c6\";\n}\n\n.icon-guanzhu:before {\n  content: \"\\e9c6\";\n}\n\n.icon-biaozhun:before {\n  content: \"\\e8c7\";\n}\n\n.icon-maiyizengyi:before {\n  content: \"\\e9c7\";\n}\n\n.icon-biaozhun-xianxing:before {\n  content: \"\\e8c8\";\n}\n\n.icon-mima:before {\n  content: \"\\e9c8\";\n}\n\n.icon-quanxianyuechi:before {\n  content: \"\\e8c9\";\n}\n\n.icon-nan:before {\n  content: \"\\e9c9\";\n}\n\n.icon-quanxianyuechi-xianxing:before {\n  content: \"\\e8ca\";\n}\n\n.icon-nv:before {\n  content: \"\\e9ca\";\n}\n\n.icon-ziyuan:before {\n  content: \"\\e8cb\";\n}\n\n.icon-lihe:before {\n  content: \"\\e9cb\";\n}\n\n.icon-ziyuan-xianxing:before {\n  content: \"\\e8cc\";\n}\n\n.icon-paihangbang:before {\n  content: \"\\e9cc\";\n}\n\n.icon-mobankuangjia-xianxing:before {\n  content: \"\\e8cd\";\n}\n\n.icon-lipinka:before {\n  content: \"\\e9cd\";\n}\n\n.icon-mobankuangjia:before {\n  content: \"\\e8ce\";\n}\n\n.icon-pengyouquan:before {\n  content: \"\\e9ce\";\n}\n\n.icon-xinwenzixun:before {\n  content: \"\\e8cf\";\n}\n\n.icon-mingxinghuodong:before {\n  content: \"\\e9cf\";\n}\n\n.icon-xinwenzixun-xianxing:before {\n  content: \"\\e8d0\";\n}\n\n.icon-qupiao:before {\n  content: \"\\e9d0\";\n}\n\n.icon-hezuoguanxi-xianxing:before {\n  content: \"\\e8d1\";\n}\n\n.icon-saoyisao:before {\n  content: \"\\e9d1\";\n}\n\n.icon-hezuoguanxi:before {\n  content: \"\\e8d2\";\n}\n\n.icon-rili1:before {\n  content: \"\\e9d2\";\n}\n\n.icon-xianlu:before {\n  content: \"\\e8d3\";\n}\n\n.icon-pinglun:before {\n  content: \"\\e9d3\";\n}\n\n.icon--fuwu-xianxing:before {\n  content: \"\\e8d4\";\n}\n\n.icon-qinghuiyuan:before {\n  content: \"\\e9d4\";\n}\n\n.icon--fuwu:before {\n  content: \"\\e8d5\";\n}\n\n.icon-riqian:before {\n  content: \"\\e9d5\";\n}\n\n.icon--kefu-xianxing:before {\n  content: \"\\e8d6\";\n}\n\n.icon-shandian:before {\n  content: \"\\e9d6\";\n}\n\n.icon--kefu:before {\n  content: \"\\e8d7\";\n}\n\n.icon-shaixuan:before {\n  content: \"\\e9d7\";\n}\n\n.icon--guoji-xianxing:before {\n  content: \"\\e8d8\";\n}\n\n.icon-shangquan:before {\n  content: \"\\e9d8\";\n}\n\n.icon--guoji:before {\n  content: \"\\e8d9\";\n}\n\n.icon-shanchu:before {\n  content: \"\\e9d9\";\n}\n\n.icon-haiguan-xianxing:before {\n  content: \"\\e8da\";\n}\n\n.icon-shezhi1:before {\n  content: \"\\e9da\";\n}\n\n.icon-haiguan:before {\n  content: \"\\e8db\";\n}\n\n.icon-shangchuan:before {\n  content: \"\\e9db\";\n}\n\n.icon-touchengkongyun:before {\n  content: \"\\e8dc\";\n}\n\n.icon-shequ:before {\n  content: \"\\e9dc\";\n}\n\n.icon-weicheng:before {\n  content: \"\\e8dd\";\n}\n\n.icon-shengyinguanbi:before {\n  content: \"\\e9dd\";\n}\n\n.icon-caiwu:before {\n  content: \"\\e8de\";\n}\n\n.icon-shibai:before {\n  content: \"\\e9de\";\n}\n\n.icon-caiwu-xianxing:before {\n  content: \"\\e8df\";\n}\n\n.icon-shijian1:before {\n  content: \"\\e9df\";\n}\n\n.icon-mianfei:before {\n  content: \"\\e8e0\";\n}\n\n.icon-shengyin:before {\n  content: \"\\e9e0\";\n}\n\n.icon-mianfei-xianxing:before {\n  content: \"\\e8e1\";\n}\n\n.icon-shoucang1:before {\n  content: \"\\e9e1\";\n}\n\n.icon-tuikuan:before {\n  content: \"\\e8e2\";\n}\n\n.icon-shouji:before {\n  content: \"\\e9e2\";\n}\n\n.icon-jisuanqilishuai:before {\n  content: \"\\e8e3\";\n}\n\n.icon-shouye1:before {\n  content: \"\\e9e3\";\n}\n\n.icon-jisuanqilishuai-xianxing:before {\n  content: \"\\e8e4\";\n}\n\n.icon-shuju:before {\n  content: \"\\e9e4\";\n}\n\n.icon-checkbox-weixuan:before {\n  content: \"\\e8e5\";\n}\n\n.icon-shuaxin1:before {\n  content: \"\\e9e5\";\n}\n\n.icon-checkbox-xuanzhong:before {\n  content: \"\\e8e6\";\n}\n\n.icon-sousuo1:before {\n  content: \"\\e9e6\";\n}\n\n.icon-Raidobox-weixuan:before {\n  content: \"\\e8e7\";\n}\n\n.icon-tanhao:before {\n  content: \"\\e9e7\";\n}\n\n.icon-Raidobox-xuanzhong:before {\n  content: \"\\e8e8\";\n}\n\n.icon-taolunqu:before {\n  content: \"\\e9e8\";\n}\n\n.icon-checkbox-xuanzhongbufen:before {\n  content: \"\\e8e9\";\n}\n\n.icon-tianjiayouhuiquan:before {\n  content: \"\\e9e9\";\n}\n\n.icon-youxiajiaogouxuan:before {\n  content: \"\\e8ea\";\n}\n\n.icon-tishi:before {\n  content: \"\\e9ea\";\n}\n\n.icon-sousuo-xianxing:before {\n  content: \"\\e8eb\";\n}\n\n.icon-tupian1:before {\n  content: \"\\e9eb\";\n}\n\n.icon-shezhi-xianxing:before {\n  content: \"\\e8ec\";\n}\n\n.icon-tuipiao:before {\n  content: \"\\e9ec\";\n}\n\n.icon-shezhi:before {\n  content: \"\\e8ed\";\n}\n\n.icon-weixuanzhong:before {\n  content: \"\\e9ed\";\n}\n\n.icon-shouye:before {\n  content: \"\\e8ee\";\n}\n\n.icon-weibo:before {\n  content: \"\\e9ee\";\n}\n\n.icon-shouye-xianxing:before {\n  content: \"\\e8ef\";\n}\n\n.icon-wenjuan:before {\n  content: \"\\e9ef\";\n}\n\n.icon-sousuo:before {\n  content: \"\\e8f0\";\n}\n\n.icon-wode:before {\n  content: \"\\e9f0\";\n}\n\n.icon-wenti-xianxing:before {\n  content: \"\\e8f1\";\n}\n\n.icon-weixin3:before {\n  content: \"\\e9f1\";\n}\n\n.icon-wenti:before {\n  content: \"\\e8f2\";\n}\n\n.icon-wodeguanzhu:before {\n  content: \"\\e9f2\";\n}\n\n.icon-dianhua-xianxingyuankuang:before {\n  content: \"\\e8f3\";\n}\n\n.icon-xiami:before {\n  content: \"\\e9f3\";\n}\n\n.icon-liaotianduihua:before {\n  content: \"\\e8f4\";\n}\n\n.icon-xiangkan:before {\n  content: \"\\e9f4\";\n}\n\n.icon-liaotianduihua-xianxing:before {\n  content: \"\\e8f5\";\n}\n\n.icon-xiangji:before {\n  content: \"\\e9f5\";\n}\n\n.icon-dianhua:before {\n  content: \"\\e8f6\";\n}\n\n.icon-xiaoxi:before {\n  content: \"\\e9f6\";\n}\n\n.icon-dianhua-yuankuang:before {\n  content: \"\\e8f7\";\n}\n\n.icon-xiazai:before {\n  content: \"\\e9f7\";\n}\n\n.icon-xin-xianxing:before {\n  content: \"\\e8f8\";\n}\n\n.icon-xiaojuchang:before {\n  content: \"\\e9f8\";\n}\n\n.icon-lingdang:before {\n  content: \"\\e8f9\";\n}\n\n.icon-xiaoshi:before {\n  content: \"\\e9f9\";\n}\n\n.icon-lingdang-xianxing:before {\n  content: \"\\e8fa\";\n}\n\n.icon-xiaoxizhongxin:before {\n  content: \"\\e9fa\";\n}\n\n.icon-xin:before {\n  content: \"\\e8fb\";\n}\n\n.icon-yinhangka:before {\n  content: \"\\e9fb\";\n}\n\n.icon-laba-xianxing:before {\n  content: \"\\e8fc\";\n}\n\n.icon-yanjing:before {\n  content: \"\\e9fc\";\n}\n\n.icon-laba:before {\n  content: \"\\e8fd\";\n}\n\n.icon-yingchengka:before {\n  content: \"\\e9fd\";\n}\n\n.icon-maikefeng-xianxing:before {\n  content: \"\\e8fe\";\n}\n\n.icon-yixiangkan:before {\n  content: \"\\e9fe\";\n}\n\n.icon-shoucang:before {\n  content: \"\\e8ff\";\n}\n\n.icon-yingpingmoban:before {\n  content: \"\\e9ff\";\n}\n\n.icon-maikefeng:before {\n  content: \"\\e900\";\n}\n\n.icon-yanchu:before {\n  content: \"\\ea00\";\n}\n\n.icon-xihuan-xianxing:before {\n  content: \"\\e901\";\n}\n\n.icon-xiaomi:before {\n  content: \"\\ea01\";\n}\n\n.icon-shoucang-xianxing:before {\n  content: \"\\e902\";\n}\n\n.icon-yingyuan:before {\n  content: \"\\ea02\";\n}\n\n.icon-xihuan:before {\n  content: \"\\e903\";\n}\n\n.icon-zengjia:before {\n  content: \"\\ea03\";\n}\n\n.icon-gengduo-hengxiang:before {\n  content: \"\\e904\";\n}\n\n.icon-yuyin:before {\n  content: \"\\ea04\";\n}\n\n.icon-gengduo-shuxiang:before {\n  content: \"\\e905\";\n}\n\n.icon-youhuiquan:before {\n  content: \"\\ea05\";\n}\n\n.icon-shijian-xianxing:before {\n  content: \"\\e906\";\n}\n\n.icon-WIFI:before {\n  content: \"\\ea06\";\n}\n\n.icon-shengboyuyinxiaoxi:before {\n  content: \"\\e907\";\n}\n\n.icon-zhibo:before {\n  content: \"\\ea07\";\n}\n\n.icon-shijian:before {\n  content: \"\\e908\";\n}\n\n.icon-youkuhuiyuan:before {\n  content: \"\\ea08\";\n}\n\n.icon-shangchuandaochu:before {\n  content: \"\\e909\";\n}\n\n.icon-yulebao:before {\n  content: \"\\ea09\";\n}\n\n.icon-xiazaidaoru:before {\n  content: \"\\e90a\";\n}\n\n.icon-zhiwen:before {\n  content: \"\\ea0a\";\n}\n\n.icon-baocun-xianxing:before {\n  content: \"\\e90b\";\n}\n\n.icon-aixin1:before {\n  content: \"\\ea0b\";\n}\n\n.icon-shanguangdeng:before {\n  content: \"\\e90c\";\n}\n\n.icon-chenggong1:before {\n  content: \"\\ea0c\";\n}\n\n.icon-shanguangdeng-zidong:before {\n  content: \"\\e90d\";\n}\n\n.icon-dianzan1:before {\n  content: \"\\ea0d\";\n}\n\n.icon-shanguangdeng-guanbi:before {\n  content: \"\\e90e\";\n}\n\n.icon-dianhua2:before {\n  content: \"\\ea0e\";\n}\n\n.icon-baocun:before {\n  content: \"\\e90f\";\n}\n\n.icon-bangzhu1:before {\n  content: \"\\ea0f\";\n}\n\n.icon-yonghu-xianxing:before {\n  content: \"\\e910\";\n}\n\n.icon-dianyingpiao1:before {\n  content: \"\\ea10\";\n}\n\n.icon-yonghu:before {\n  content: \"\\e911\";\n}\n\n.icon-faxian1:before {\n  content: \"\\ea11\";\n}\n\n.icon-jiaosequnti:before {\n  content: \"\\e912\";\n}\n\n.icon-dingwei2:before {\n  content: \"\\ea12\";\n}\n\n.icon-morentouxiang:before {\n  content: \"\\e913\";\n}\n\n.icon-gonggao:before {\n  content: \"\\ea13\";\n}\n\n.icon-zhucetianjiahaoyou:before {\n  content: \"\\e914\";\n}\n\n.icon-huati1:before {\n  content: \"\\ea14\";\n}\n\n.icon-renwu:before {\n  content: \"\\e915\";\n}\n\n.icon-jianshao1:before {\n  content: \"\\ea15\";\n}\n\n.icon-zhongwenmoshi:before {\n  content: \"\\e916\";\n}\n\n.icon-huiyuan1:before {\n  content: \"\\ea16\";\n}\n\n.icon-fujian:before {\n  content: \"\\e917\";\n}\n\n.icon-pinglun1:before {\n  content: \"\\ea17\";\n}\n\n.icon-bianjishuru-xianxing:before {\n  content: \"\\e918\";\n}\n\n.icon-shequ1:before {\n  content: \"\\ea18\";\n}\n\n.icon-bianjishuru:before {\n  content: \"\\e919\";\n}\n\n.icon-shibai1:before {\n  content: \"\\ea19\";\n}\n\n.icon-yingwenmoshi:before {\n  content: \"\\e91a\";\n}\n\n.icon-shijian2:before {\n  content: \"\\ea1a\";\n}\n\n.icon-jianpan-xianxing:before {\n  content: \"\\e91b\";\n}\n\n.icon-shandian1:before {\n  content: \"\\ea1b\";\n}\n\n.icon-jianpan:before {\n  content: \"\\e91c\";\n}\n\n.icon-wode1:before {\n  content: \"\\ea1c\";\n}\n\n.icon-rili:before {\n  content: \"\\e91d\";\n}\n\n.icon-shouye2:before {\n  content: \"\\ea1d\";\n}\n\n.icon-weichuqin:before {\n  content: \"\\e91e\";\n}\n\n.icon-shouji1:before {\n  content: \"\\ea1e\";\n}\n\n.icon-kaoqinchuqin:before {\n  content: \"\\e91f\";\n}\n\n.icon-tanhao1:before {\n  content: \"\\ea1f\";\n}\n\n.icon-paizhao:before {\n  content: \"\\e920\";\n}\n\n.icon-shoucang2:before {\n  content: \"\\ea20\";\n}\n\n.icon-paizhao-xianxing:before {\n  content: \"\\e921\";\n}\n\n.icon-shuju1:before {\n  content: \"\\ea21\";\n}\n\n.icon-tupian-xianxing:before {\n  content: \"\\e922\";\n}\n\n.icon-wenda:before {\n  content: \"\\ea22\";\n}\n\n.icon-tupian:before {\n  content: \"\\e923\";\n}\n\n.icon-yanjing1:before {\n  content: \"\\ea23\";\n}\n\n.icon-saomiao:before {\n  content: \"\\e924\";\n}\n\n.icon-yingchengka1:before {\n  content: \"\\ea24\";\n}\n\n.icon-xianshikejian:before {\n  content: \"\\e925\";\n}\n\n.icon-xiangji1:before {\n  content: \"\\ea25\";\n}\n\n.icon-suoding:before {\n  content: \"\\e926\";\n}\n\n.icon-yingyuan1:before {\n  content: \"\\ea26\";\n}\n\n.icon-yincangbukejian:before {\n  content: \"\\e927\";\n}\n\n.icon-yinhangyouhui:before {\n  content: \"\\ea27\";\n}\n\n.icon-jiesuo:before {\n  content: \"\\e928\";\n}\n\n.icon-xiaoshi1:before {\n  content: \"\\ea28\";\n}\n\n.icon-anzhuangshigong-xianxing:before {\n  content: \"\\e929\";\n}\n\n.icon-yanchu1:before {\n  content: \"\\ea29\";\n}\n\n.icon-shaixuanguolv:before {\n  content: \"\\e92a\";\n}\n\n.icon-zengjia1:before {\n  content: \"\\ea2a\";\n}\n\n.icon-anzhuangshigong:before {\n  content: \"\\e92b\";\n}\n\n.icon-dianying1:before {\n  content: \"\\ea2b\";\n}\n\n.icon-zhuxiaoguanji:before {\n  content: \"\\e92c\";\n}\n\n.icon-youhuiquan1:before {\n  content: \"\\ea2c\";\n}\n\n.icon-haoping-yuankuang:before {\n  content: \"\\e92d\";\n}\n\n.icon-remen:before {\n  content: \"\\ea2d\";\n}\n\n.icon-chaping-yuankuang:before {\n  content: \"\\e92e\";\n}\n\n.icon-chuangzuo1:before {\n  content: \"\\ea2e\";\n}\n\n.icon-chaping:before {\n  content: \"\\e92f\";\n}\n\n.icon-haoping:before {\n  content: \"\\e930\";\n}\n\n.icon-yiban:before {\n  content: \"\\e931\";\n}\n\n.icon-manyi:before {\n  content: \"\\e932\";\n}\n\n.icon-bumanyi:before {\n  content: \"\\e933\";\n}\n\n.icon-liebiaoshitucaidan:before {\n  content: \"\\e934\";\n}\n\n.icon-gonggeshitu:before {\n  content: \"\\e935\";\n}\n\n.icon-Phoneshouji:before {\n  content: \"\\e936\";\n}\n\n.icon-PCtaishiji:before {\n  content: \"\\e937\";\n}\n\n.icon-PDAshouchigongzuoshebei:before {\n  content: \"\\e938\";\n}\n\n.icon-jia-fangkuang:before {\n  content: \"\\e939\";\n}\n\n.icon-jia-xianxingfangkuang:before {\n  content: \"\\e93a\";\n}\n\n.icon-jia-xianxingyuankuang:before {\n  content: \"\\e93b\";\n}\n\n.icon-jia-yuankuang:before {\n  content: \"\\e93c\";\n}\n\n.icon-jian-fangkuang:before {\n  content: \"\\e93d\";\n}\n\n.icon-jia:before {\n  content: \"\\e93e\";\n}\n\n.icon-jian-yuankuang:before {\n  content: \"\\e93f\";\n}\n\n.icon-jian:before {\n  content: \"\\e940\";\n}\n\n.icon-jian-xianxingfangkuang:before {\n  content: \"\\e941\";\n}\n\n.icon-zhengquewancheng-xianxingyuankuang:before {\n  content: \"\\e942\";\n}\n\n.icon-zhengquewancheng-yuankuang:before {\n  content: \"\\e943\";\n}\n\n.icon-zhengquewancheng:before {\n  content: \"\\e944\";\n}\n\n.icon-jian-xianxingyuankuang:before {\n  content: \"\\e945\";\n}\n\n.icon-cuowuguanbiquxiao-xianxingfangkuang:before {\n  content: \"\\e946\";\n}\n\n.icon-cuowuguanbiquxiao-yuankuang:before {\n  content: \"\\e947\";\n}\n\n.icon-cuowuguanbiquxiao-xianxingyuankuang:before {\n  content: \"\\e948\";\n}\n\n.icon-cuowuguanbiquxiao:before {\n  content: \"\\e949\";\n}\n\n.icon-cuowuguanbiquxiao-fangkuang:before {\n  content: \"\\e94a\";\n}\n\n.icon-xinxi-xianxingyuankuang:before {\n  content: \"\\e94b\";\n}\n\n.icon-xinxi:before {\n  content: \"\\e94c\";\n}\n\n.icon-wenhao-xianxingyuankuang:before {\n  content: \"\\e94d\";\n}\n\n.icon-wenhao:before {\n  content: \"\\e94e\";\n}\n\n.icon-wenhao-yuankuang:before {\n  content: \"\\e94f\";\n}\n\n.icon-xinxi-yuankuang:before {\n  content: \"\\e950\";\n}\n\n.icon-gantanhao-sanjiaokuang:before {\n  content: \"\\e951\";\n}\n\n.icon-gantanhao-yuankuang:before {\n  content: \"\\e952\";\n}\n\n.icon-gantanhao-xianxingyuankuang:before {\n  content: \"\\e953\";\n}\n\n.icon-gantanhao-xianxingsanjiaokuang:before {\n  content: \"\\e954\";\n}\n\n.icon-gantanhao:before {\n  content: \"\\e955\";\n}\n\n.icon-shangyiyehoutuifanhui-xianxingyuankuang:before {\n  content: \"\\e956\";\n}\n\n.icon-shangyiyehoutuifanhui-yuankuang:before {\n  content: \"\\e957\";\n}\n\n.icon-xiayiyeqianjinchakangengduo-xianxingyuankuang:before {\n  content: \"\\e958\";\n}\n\n.icon-xiayiyeqianjinchakangengduo-yuankuang:before {\n  content: \"\\e959\";\n}\n\n.icon-shangyiyehoutuifanhui:before {\n  content: \"\\e95a\";\n}\n\n.icon-xiayiyeqianjinchakangengduo:before {\n  content: \"\\e95b\";\n}\n\n.icon-xiangxiazhankai-xianxingyuankuang:before {\n  content: \"\\e95c\";\n}\n\n.icon-xiangxiazhankai-yuankuang:before {\n  content: \"\\e95d\";\n}\n\n.icon-xiangxiazhankai:before {\n  content: \"\\e95e\";\n}\n\n.icon-xiangshangshouqi-yuankuang:before {\n  content: \"\\e95f\";\n}\n\n.icon-xiangshangshouqi-xianxingyuankuang:before {\n  content: \"\\e960\";\n}\n\n.icon-zhixiangzuo:before {\n  content: \"\\e961\";\n}\n\n.icon-zhixiangyou:before {\n  content: \"\\e962\";\n}\n\n.icon-zhixiangshang:before {\n  content: \"\\e963\";\n}\n\n.icon-weixin2:before {\n  content: \"\\e601\";\n}\n\n.icon-zhifubao:before {\n  content: \"\\e600\";\n}\n\n.icon-qq:before {\n  content: \"\\e62e\";\n}\n\n.icon-weixin:before {\n  content: \"\\e60e\";\n}\n\n.icon-weixin1:before {\n  content: \"\\e621\";\n}\n\n.icon-qq1:before {\n  content: \"\\e607\";\n}\n\n.icon-qq2:before {\n  content: \"\\e66a\";\n}\n\n.icon-umidd17:before {\n  content: \"\\e603\";\n}\n\n.icon-electrical:before {\n  content: \"\\e6d4\";\n}\n\n.icon-home:before {\n  content: \"\\e6d7\";\n}\n\n.icon-electronics:before {\n  content: \"\\e6da\";\n}\n\n.icon-gifts:before {\n  content: \"\\e6db\";\n}\n\n.icon-lights:before {\n  content: \"\\e6de\";\n}\n\n.icon-sports:before {\n  content: \"\\e6e0\";\n}\n\n.icon-toys:before {\n  content: \"\\e6e1\";\n}\n\n.icon-auto:before {\n  content: \"\\e6e3\";\n}\n\n.icon-jewelry:before {\n  content: \"\\e6e4\";\n}\n\n.icon-trade-assurance:before {\n  content: \"\\e6e5\";\n}\n\n.icon-browse:before {\n  content: \"\\e6e6\";\n}\n\n.icon-rfqqm:before {\n  content: \"\\e6e7\";\n}\n\n.icon-rfqquantity:before {\n  content: \"\\e6e8\";\n}\n\n.icon-atmaway:before {\n  content: \"\\e6e9\";\n}\n\n.icon-rfq1:before {\n  content: \"\\e6eb\";\n}\n\n.icon-scanning:before {\n  content: \"\\e6ec\";\n}\n\n.icon-compare:before {\n  content: \"\\e6ee\";\n}\n\n.icon-filter:before {\n  content: \"\\e6f1\";\n}\n\n.icon-pin:before {\n  content: \"\\e6f2\";\n}\n\n.icon-history:before {\n  content: \"\\e6f3\";\n}\n\n.icon-productfeatures:before {\n  content: \"\\e6f4\";\n}\n\n.icon-supplierfeatures:before {\n  content: \"\\e6f5\";\n}\n\n.icon-similarproduct:before {\n  content: \"\\e6f6\";\n}\n\n.icon-link:before {\n  content: \"\\e6f7\";\n}\n\n.icon-cut:before {\n  content: \"\\e6f8\";\n}\n\n.icon-navlist:before {\n  content: \"\\e6fa\";\n}\n\n.icon-imagetext:before {\n  content: \"\\e6fb\";\n}\n\n.icon-text:before {\n  content: \"\\e6fc\";\n}\n\n.icon-move:before {\n  content: \"\\e6fd\";\n}\n\n.icon-subtract:before {\n  content: \"\\e6fe\";\n}\n\n.icon-dollar:before {\n  content: \"\\e702\";\n}\n\n.icon-raw:before {\n  content: \"\\e704\";\n}\n\n.icon-office:before {\n  content: \"\\e705\";\n}\n\n.icon-agriculture:before {\n  content: \"\\e707\";\n}\n\n.icon-machinery:before {\n  content: \"\\e709\";\n}\n\n.icon-assessedbadge:before {\n  content: \"\\e70a\";\n}\n\n.icon-gerenzhongxin:before {\n  content: \"\\e70b\";\n}\n\n.icon-jifen:before {\n  content: \"\\e70c\";\n}\n\n.icon-operation:before {\n  content: \"\\e70e\";\n}\n\n.icon-remind1:before {\n  content: \"\\e713\";\n}\n\n.icon-icondownload:before {\n  content: \"\\e714\";\n}\n\n.icon-map:before {\n  content: \"\\e715\";\n}\n\n.icon-bad:before {\n  content: \"\\e716\";\n}\n\n.icon-good:before {\n  content: \"\\e717\";\n}\n\n.icon-skip:before {\n  content: \"\\e718\";\n}\n\n.icon-iconfontplay2:before {\n  content: \"\\e719\";\n}\n\n.icon-iconfontstop:before {\n  content: \"\\e71a\";\n}\n\n.icon-compass:before {\n  content: \"\\e71b\";\n}\n\n.icon-security:before {\n  content: \"\\e71c\";\n}\n\n.icon-share:before {\n  content: \"\\e71d\";\n}\n\n.icon-store:before {\n  content: \"\\e722\";\n}\n\n.icon-manageorder:before {\n  content: \"\\e723\";\n}\n\n.icon-rejectedorder:before {\n  content: \"\\e724\";\n}\n\n.icon-phone:before {\n  content: \"\\e725\";\n}\n\n.icon-bussinessman:before {\n  content: \"\\e726\";\n}\n\n.icon-shoes:before {\n  content: \"\\e728\";\n}\n\n.icon-mobilephone:before {\n  content: \"\\e72a\";\n}\n\n.icon-emailfilling:before {\n  content: \"\\e72d\";\n}\n\n.icon-favoritesfilling:before {\n  content: \"\\e730\";\n}\n\n.icon-accountfilling:before {\n  content: \"\\e732\";\n}\n\n.icon-creditlevel:before {\n  content: \"\\e735\";\n}\n\n.icon-creditlevelfilling:before {\n  content: \"\\e736\";\n}\n\n.icon-exl:before {\n  content: \"\\e73f\";\n}\n\n.icon-pdf:before {\n  content: \"\\e740\";\n}\n\n.icon-zip:before {\n  content: \"\\e741\";\n}\n\n.icon-sorting:before {\n  content: \"\\e743\";\n}\n\n.icon-copy:before {\n  content: \"\\e744\";\n}\n\n.icon-save:before {\n  content: \"\\e747\";\n}\n\n.icon-inquirytemplate:before {\n  content: \"\\e749\";\n}\n\n.icon-templatedefault:before {\n  content: \"\\e74a\";\n}\n\n.icon-libra:before {\n  content: \"\\e74c\";\n}\n\n.icon-survey1:before {\n  content: \"\\e74e\";\n}\n\n.icon-ship:before {\n  content: \"\\e74f\";\n}\n\n.icon-bussinesscard:before {\n  content: \"\\e753\";\n}\n\n.icon-hot:before {\n  content: \"\\e756\";\n}\n\n.icon-data:before {\n  content: \"\\e757\";\n}\n\n.icon-trade:before {\n  content: \"\\e758\";\n}\n\n.icon-onepage48:before {\n  content: \"\\e75a\";\n}\n\n.icon-signboard:before {\n  content: \"\\e75c\";\n}\n\n.icon-shuffling-banner:before {\n  content: \"\\e75e\";\n}\n\n.icon-component:before {\n  content: \"\\e75f\";\n}\n\n.icon-component-filling:before {\n  content: \"\\e760\";\n}\n\n.icon-color:before {\n  content: \"\\e761\";\n}\n\n.icon-color-filling:before {\n  content: \"\\e7cd\";\n}\n\n.icon-favorites:before {\n  content: \"\\e7ce\";\n}\n\n.icon-pic-filling:before {\n  content: \"\\e802\";\n}\n\n.icon-RFQ:before {\n  content: \"\\e803\";\n}\n\n.icon-RFQ-filling:before {\n  content: \"\\e804\";\n}\n\n.icon-originalimage:before {\n  content: \"\\e806\";\n}\n\n.icon-logistic:before {\n  content: \"\\e811\";\n}\n\n.icon-Calculator:before {\n  content: \"\\e812\";\n}\n\n.icon-video:before {\n  content: \"\\e820\";\n}\n\n.icon-earth:before {\n  content: \"\\e828\";\n}\n\n.icon-task-management:before {\n  content: \"\\e829\";\n}\n\n.icon-trust:before {\n  content: \"\\e82a\";\n}\n\n.icon-password:before {\n  content: \"\\e82b\";\n}\n\n.icon-column:before {\n  content: \"\\e839\";\n}\n\n.icon-apparel:before {\n  content: \"\\e83a\";\n}\n\n.icon-bags:before {\n  content: \"\\e83b\";\n}\n\n.icon-folder:before {\n  content: \"\\e83c\";\n}\n\n.icon-column1:before {\n  content: \"\\e83d\";\n}\n\n.icon-code:before {\n  content: \"\\e842\";\n}\n\n.icon-RFQ-filling1:before {\n  content: \"\\e843\";\n}\n\n.icon-customs-clearance:before {\n  content: \"\\e863\";\n}\n\n.icon-good-filling:before {\n  content: \"\\e866\";\n}\n\n.icon-camera:before {\n  content: \"\\e86e\";\n}\n\n.icon-pin-fill:before {\n  content: \"\\e87a\";\n}\n\n.icon-help-fill:before {\n  content: \"\\e87b\";\n}\n\n.icon-add-account:before {\n  content: \"\\e87c\";\n}\n\n.icon-listing-content:before {\n  content: \"\\e87d\";\n}\n\n.icon-warehouse-delivery:before {\n  content: \"\\e87e\";\n}\n\n.icon-customization:before {\n  content: \"\\e87f\";\n}\n\n.icon-inspection:before {\n  content: \"\\e880\";\n}\n\n.icon-packing-labeling:before {\n  content: \"\\e881\";\n}\n\n.icon-online-tracking:before {\n  content: \"\\e882\";\n}\n\n.icon-play-filling:before {\n  content: \"\\e883\";\n}\n\n.icon-nosound-filling:before {\n  content: \"\\e884\";\n}\n\n.icon-sound-filling:before {\n  content: \"\\e885\";\n}\n\n.icon-electrical-equipment:before {\n  content: \"\\e886\";\n}\n\n.icon-home-appliances:before {\n  content: \"\\e887\";\n}\n\n.icon-furniture:before {\n  content: \"\\e888\";\n}\n\n.icon-fashion-accessories:before {\n  content: \"\\e889\";\n}\n\n.icon-security-protection:before {\n  content: \"\\e88a\";\n}\n\n.icon-textile-products:before {\n  content: \"\\e88b\";\n}\n\n.icon-tools-hardware:before {\n  content: \"\\e88c\";\n}\n\n.icon-office-supplies:before {\n  content: \"\\e88d\";\n}\n\n.icon-vehicles:before {\n  content: \"\\e88e\";\n}\n\n.icon-all:before {\n  content: \"\\e696\";\n}\n\n.icon-back:before {\n  content: \"\\e697\";\n}\n\n.icon-cart:before {\n  content: \"\\e698\";\n}\n\n.icon-category:before {\n  content: \"\\e699\";\n}\n\n.icon-close:before {\n  content: \"\\e69a\";\n}\n\n.icon-comments:before {\n  content: \"\\e69b\";\n}\n\n.icon-cry:before {\n  content: \"\\e69c\";\n}\n\n.icon-delete:before {\n  content: \"\\e69d\";\n}\n\n.icon-edit:before {\n  content: \"\\e69e\";\n}\n\n.icon-email:before {\n  content: \"\\e69f\";\n}\n\n.icon-favorite:before {\n  content: \"\\e6a0\";\n}\n\n.icon-form:before {\n  content: \"\\e6a2\";\n}\n\n.icon-help:before {\n  content: \"\\e6a3\";\n}\n\n.icon-information:before {\n  content: \"\\e6a4\";\n}\n\n.icon-less:before {\n  content: \"\\e6a5\";\n}\n\n.icon-moreunfold:before {\n  content: \"\\e6a6\";\n}\n\n.icon-more:before {\n  content: \"\\e6a7\";\n}\n\n.icon-pic:before {\n  content: \"\\e6a8\";\n}\n\n.icon-qrcode:before {\n  content: \"\\e6a9\";\n}\n\n.icon-refresh:before {\n  content: \"\\e6aa\";\n}\n\n.icon-rfq:before {\n  content: \"\\e6ab\";\n}\n\n.icon-search:before {\n  content: \"\\e6ac\";\n}\n\n.icon-selected:before {\n  content: \"\\e6ad\";\n}\n\n.icon-set:before {\n  content: \"\\e6ae\";\n}\n\n.icon-smile:before {\n  content: \"\\e6af\";\n}\n\n.icon-success:before {\n  content: \"\\e6b1\";\n}\n\n.icon-survey:before {\n  content: \"\\e6b2\";\n}\n\n.icon-training:before {\n  content: \"\\e6b3\";\n}\n\n.icon-viewgallery:before {\n  content: \"\\e6b4\";\n}\n\n.icon-viewlist:before {\n  content: \"\\e6b5\";\n}\n\n.icon-warning:before {\n  content: \"\\e6b6\";\n}\n\n.icon-wrong:before {\n  content: \"\\e6b7\";\n}\n\n.icon-account:before {\n  content: \"\\e6b8\";\n}\n\n.icon-add:before {\n  content: \"\\e6b9\";\n}\n\n.icon-atm:before {\n  content: \"\\e6ba\";\n}\n\n.icon-clock:before {\n  content: \"\\e6bb\";\n}\n\n.icon-remind:before {\n  content: \"\\e6bc\";\n}\n\n.icon-calendar:before {\n  content: \"\\e6bf\";\n}\n\n.icon-attachment:before {\n  content: \"\\e6c0\";\n}\n\n.icon-discount:before {\n  content: \"\\e6c5\";\n}\n\n.icon-service:before {\n  content: \"\\e6c7\";\n}\n\n.icon-print:before {\n  content: \"\\e6c9\";\n}\n\n.icon-box:before {\n  content: \"\\e6cb\";\n}\n\n.icon-process:before {\n  content: \"\\e6ce\";\n}\n\n.icon-beauty:before {\n  content: \"\\e6d2\";\n}\n\n"
  },
  {
    "path": "app/admin/t/tpl/style/fonts/iconfont.js",
    "content": "!function(a){var h,c,l,o,i,v='<svg><symbol id=\"icon-xiangshangshouqi\" viewBox=\"0 0 1024 1024\"><path d=\"M852 660L557.6 365.6 512 320l-45.6 45.6L176 656l45.6 44.8L512 410.4l294.4 294.4z\"  ></path></symbol><symbol id=\"icon-zhixiangxia\" viewBox=\"0 0 1024 1024\"><path d=\"M544 128v645.6l242.4-242.4L832 576l-274.4 274.4L512 896l-45.6-45.6L192 576l45.6-45.6L480 773.6V128h64z\"  ></path></symbol><symbol id=\"icon-diyiye\" viewBox=\"0 0 1024 1024\"><path d=\"M812.8 237.6L768 192 493.6 466.4 448 512l45.6 45.6L768 832l44.8-45.6L538.4 512zM320 128h64v768h-64z\"  ></path></symbol><symbol id=\"icon-zuihouye\" viewBox=\"0 0 1024 1024\"><path d=\"M211.2 237.6L256 192l274.4 274.4L576 512l-45.6 45.6L256 832l-44.8-45.6L485.6 512zM640 128h64v768h-64z\"  ></path></symbol><symbol id=\"icon-biaotou-zhengxu\" viewBox=\"0 0 1024 1024\"><path d=\"M256 640l256-256 256 256z\"  ></path></symbol><symbol id=\"icon-biaotou-kepaixu\" viewBox=\"0 0 1024 1024\"><path d=\"M256 448l256-256 256 256zM256 576l256 256 256-256z\"  ></path></symbol><symbol id=\"icon-biaotou-daoxu\" viewBox=\"0 0 1024 1024\"><path d=\"M256 384l256 256 256-256z\"  ></path></symbol><symbol id=\"icon-huidingbu\" viewBox=\"0 0 1024 1024\"><path d=\"M696 512H544v320h-64V512H328l184-192 184 192zM192 192v64h640v-64H192z\"  ></path></symbol><symbol id=\"icon-xiangzuojiaohuan\" viewBox=\"0 0 1024 1024\"><path d=\"M896 512v64H128v-64h1.6l211.2-211.2 45.6 45.6L220 512H896z\"  ></path></symbol><symbol id=\"icon-xianghujiaohuan\" viewBox=\"0 0 1024 1024\"><path d=\"M896 384v64H128v-64h1.6l211.2-211.2 45.6 45.6L220 384H896zM128 640h676.8l-166.4 166.4 45.6 45.6L895.2 640h0.8v-64H128v64z\"  ></path></symbol><symbol id=\"icon-xiangyoujiaohuan\" viewBox=\"0 0 1024 1024\"><path d=\"M804 512L637.6 345.6l45.6-45.6L894.4 512h1.6v64H128v-64h676z\"  ></path></symbol><symbol id=\"icon-shuzhixiajiang\" viewBox=\"0 0 1024 1024\"><path d=\"M768 640l-256 256-256-256h192V128h128v512z\"  ></path></symbol><symbol id=\"icon-quanping\" viewBox=\"0 0 1024 1024\"><path d=\"M240.8 196l178.4 178.4-45.6 45.6-177.6-179.2-68 68V128h180.8l-68 68z m133.6 408.8L196 783.2 128 715.2V896h180.8l-68-68 178.4-178.4-44.8-44.8zM715.2 128l68 68-178.4 178.4 45.6 45.6 178.4-178.4 68 68V128H715.2z m-65.6 476.8l-45.6 45.6 178.4 178.4-68 68H896V715.2l-68 68-178.4-178.4z\"  ></path></symbol><symbol id=\"icon-hengxiangzhankai\" viewBox=\"0 0 1024 1024\"><path d=\"M256 384L128 512l128 128V544h192v-64H256zM896 512L768 384v96H576v64h192v96z\"  ></path></symbol><symbol id=\"icon-shuzhishangsheng\" viewBox=\"0 0 1024 1024\"><path d=\"M768 384L512 128 256 384h192v512h128V384z\"  ></path></symbol><symbol id=\"icon-tuichuquanping\" viewBox=\"0 0 1024 1024\"><path d=\"M142.4 96.8l-44.8 44.8 173.6 174.4-68 68H384V203.2l-67.2 67.2zM752.8 316l173.6-174.4-44.8-44.8-174.4 173.6-67.2-67.2V384h180.8zM270.4 707.2l-169.6 170.4 44.8 49.6 170.4-174.4 68 68V640H203.2zM820.8 640H640v180.8l68-68 170.4 174.4 44.8-49.6-169.6-170.4z\"  ></path></symbol><symbol id=\"icon-hengxiangshouqi\" viewBox=\"0 0 1024 1024\"><path d=\"M320 480H128v64h192v96l128-128-128-128zM896 480H704V384L576 512l128 128V544h192z\"  ></path></symbol><symbol id=\"icon-shuaxin\" viewBox=\"0 0 1024 1024\"><path d=\"M896.8 512.8v-2.4c0-210.4-172-382.4-384-382.4H512c-210.4 0-382.4 172-382.4 384s172 384 384 384c17.6 0 32-14.4 32-32s-14.4-32-32-32c-176 0-320-144-320-320C193.6 335.2 336 192 512 192h0.8c176.8 0 320 142.4 320 318.4v2.4h-64l97.6 96.8 94.4-96.8h-64z\"  ></path></symbol><symbol id=\"icon-tongbu\" viewBox=\"0 0 1024 1024\"><path d=\"M180 427.2c14.4 0 26.4-9.6 30.4-23.2C255.2 280.8 373.6 192 512 192c154.4 0 284 110.4 313.6 256H768l97.6 96.8L960 448h-69.6C860 266.4 702.4 128 512 128c-167.2 0-309.6 107.2-362.4 256.8-0.8 3.2-1.6 6.4-1.6 10.4 0 17.6 14.4 32 32 32zM844 596.8c-14.4 0-26.4 9.6-30.4 23.2C768.8 743.2 650.4 832 512 832c-154.4 0-284-110.4-313.6-256h56.8L158.4 479.2 64 576h69.6c30.4 181.6 188 320 378.4 320 167.2 0 309.6-107.2 362.4-256.8 0.8-3.2 1.6-6.4 1.6-10.4 0-17.6-14.4-32-32-32z\"  ></path></symbol><symbol id=\"icon-jiazailoading-A\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64c247.2 0 448 200.8 448 448h-64c0-212-172-384-384-384V64z m0 832c-212 0-384-172-384-384H64c0 247.2 200.8 448 448 448v-64z\"  ></path></symbol><symbol id=\"icon-jiazailoading-B\" viewBox=\"0 0 1024 1024\"><path d=\"M270.4 214.4C336 160 420 128 512 128c212 0 384 172 384 384h64c0-247.2-200.8-448-448-448-107.2 0-205.6 37.6-282.4 100l40.8 50.4z\"  ></path></symbol><symbol id=\"icon-weizhi-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c169.6 0 308 138.4 308 308 0 81.6-31.2 158.4-88.8 216l-4.8 4L512 869.6 298.4 656.8l-4.8-4.8c-57.6-57.6-88.8-134.4-88.8-216C204 266.4 342.4 128 512 128m0-64C306.4 64 140 230.4 140 436c0 101.6 40.8 194.4 107.2 261.6L512 960l264-263.2c66.4-67.2 107.2-159.2 107.2-261.6C884 230.4 717.6 64 512 64z m0 192c73.6 0 132.8 62.4 128 137.6-4.8 63.2-55.2 113.6-118.4 118.4-74.4 5.6-137.6-53.6-137.6-128 0-70.4 57.6-128 128-128\"  ></path></symbol><symbol id=\"icon-weizhi\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C306.4 64 140 230.4 140 436c0 101.6 40.8 194.4 107.2 261.6L512 960l264-263.2c66.4-67.2 107.2-159.2 107.2-261.6C884 230.4 717.6 64 512 64z m128 331.2c-4.8 62.4-54.4 112-116.8 116.8-75.2 6.4-138.4-53.6-138.4-127.2 0-70.4 57.6-128 128-128 73.6 0 133.6 63.2 127.2 138.4z\"  ></path></symbol><symbol id=\"icon-daohang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64L158.4 926.4 192 960l320-141.6 320.8 141.6 33.6-33.6L512 64z\"  ></path></symbol><symbol id=\"icon-dingwei\" viewBox=\"0 0 1024 1024\"><path d=\"M960 480h-65.6C879.2 293.6 730.4 144.8 544 129.6V64h-64v65.6C293.6 144.8 144.8 293.6 129.6 480H64v64h65.6c15.2 186.4 164 335.2 350.4 350.4v65.6h64v-65.6c186.4-15.2 335.2-164 350.4-350.4h65.6v-64z m-448 352c-176.8 0-320-143.2-320-320s143.2-320 320-320 320 143.2 320 320-143.2 320-320 320z m128-320c0 70.4-57.6 128-128 128s-128-57.6-128-128 57.6-128 128-128 128 57.6 128 128z\"  ></path></symbol><symbol id=\"icon-jiankongshexiangtou-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 208c-132.8 0-240 107.2-240 240s107.2 240 240 240 240-107.2 240-240-107.2-240-240-240z m0 416c-96.8 0-176-79.2-176-176s79.2-176 176-176 176 79.2 176 176-79.2 176-176 176z m384-176c0-212-172-384-384-384S128 236 128 448c0 192.8 142.4 352.8 328 380l-4 68H256v64h512v-64H573.6l-4-68C754.4 800 896 640.8 896 448zM512 768c-176.8 0-320-143.2-320-320s143.2-320 320-320 320 143.2 320 320-143.2 320-320 320z m128-352c0 52.8-43.2 96-96 96s-96-43.2-96-96 43.2-96 96-96 96 43.2 96 96z\"  ></path></symbol><symbol id=\"icon-tuodiantu\" viewBox=\"0 0 1024 1024\"><path d=\"M392.8 809.6l53.6 53.6-61.6-10.4-219.2 36.8c-19.2 3.2-37.6-12-37.6-31.2V198.4c0-16 12-29.6 28-32L256 155.2c0 4-0.8 8.8-0.8 12.8 0 17.6 2.4 34.4 8 51.2l-56.8 4.8c-8 0.8-14.4 7.2-14.4 16v562.4c0 9.6 8.8 17.6 18.4 16l163.2-27.2h0.8c6.4 5.6 12 12 18.4 18.4z m246.4-640l-45.6-15.2c0 4 0.8 8.8 0.8 12.8 0 17.6-2.4 34.4-8 51.2l42.4 14.4 10.4 1.6 10.4-1.6 163.2-27.2c9.6-1.6 18.4 5.6 18.4 16v564c0 8-5.6 14.4-13.6 16l-79.2 13.6-78.4 78.4 208-35.2c15.2-2.4 26.4-16 26.4-31.2V164.8c0-20-17.6-35.2-37.6-31.2l-217.6 36zM424.8 318.4l75.2-74.4c19.2-19.2 30.4-44.8 30.4-74.4C530.4 111.2 483.2 64 424.8 64S320 111.2 320 169.6c0 28.8 12 55.2 30.4 74.4l74.4 74.4z m0-190.4c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m176 480c0 17.6-14.4 32-32 32s-32-14.4-32-32 14.4-32 32-32 32 14.4 32 32z m150.4 24c0 50.4-20 99.2-52.8 132.8L568 891.2 436.8 764.8C404 731.2 384 682.4 384 632c0-101.6 82.4-183.2 183.2-183.2s184 81.6 184 183.2z m-64 0c0-65.6-53.6-119.2-119.2-119.2S448 566.4 448 632c0 31.2 12 64.8 34.4 87.2L567.2 800l84.8-80.8c23.2-22.4 35.2-56 35.2-87.2z\"  ></path></symbol><symbol id=\"icon-jiankongshexiangtou\" viewBox=\"0 0 1024 1024\"><path d=\"M896 448c0-212-172-384-384-384S128 236 128 448c0 192.8 142.4 352.8 328 380l-4 68H256v64h512v-64H573.6l-4-68C754.4 800 896 640.8 896 448zM512 768c-176.8 0-320-143.2-320-320s143.2-320 320-320 320 143.2 320 320-143.2 320-320 320z m0-560c-132.8 0-240 107.2-240 240s107.2 240 240 240 240-107.2 240-240-107.2-240-240-240zM416 512c-52.8 0-96-43.2-96-96s43.2-96 96-96 96 43.2 96 96-43.2 96-96 96z\"  ></path></symbol><symbol id=\"icon-leidatance\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m-16 831.2c-199.2-8-359.2-168.8-367.2-367.2h128C264.8 656.8 368 759.2 496 767.2v128z m0-192c-92.8-8-167.2-82.4-175.2-175.2h129.6c5.6 22.4 23.2 40 45.6 45.6v129.6z m0-252.8c-22.4 5.6-39.2 23.2-45.6 45.6H320.8c8-92.8 82.4-167.2 175.2-175.2v129.6z m0-193.6C367.2 264.8 264.8 368 256.8 496h-128c8-199.2 168.8-359.2 367.2-367.2v128z m32 64c17.6 1.6 34.4 5.6 49.6 11.2 4.8-22.4 17.6-41.6 35.2-55.2-26.4-11.2-55.2-18.4-84.8-20.8V128c92 4 176 40 240 97.6L722.4 272c8.8 5.6 17.6 12.8 24 21.6l44.8-44.8c61.6 64.8 100.8 152 104.8 247.2H768c-1.6-29.6-8.8-58.4-20-84.8-13.6 17.6-32.8 30.4-55.2 35.2 5.6 16 9.6 32 11.2 49.6H574.4c-2.4-8-5.6-14.4-10.4-20.8l47.2-47.2c-8-6.4-15.2-15.2-21.6-24l-50.4 50.4c-4-1.6-7.2-3.2-12-4V320.8z m0 253.6c22.4-5.6 40.8-23.2 46.4-46.4h128.8c-8 92.8-82.4 167.2-175.2 175.2V574.4z m0 320.8v-128C656.8 759.2 759.2 656 767.2 528h128c-8 199.2-168 359.2-367.2 367.2z m143.2-478.4c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z\"  ></path></symbol><symbol id=\"icon-baobiao\" viewBox=\"0 0 1024 1024\"><path d=\"M960 672V160c0-17.6-14.4-32-32-32H544V64h-64v64H96c-17.6 0-32 14.4-32 32v512c0 17.6 14.4 32 32 32h384v50.4l-152.8 89.6 32 56 144-84h19.2l144 84 32-56L544 754.4V704h384c17.6 0 32-14.4 32-32zM790.4 256l41.6 48.8-316.8 270.4L352 437.6 233.6 536.8 192.8 488l160-133.6 163.2 137.6L790.4 256z\"  ></path></symbol><symbol id=\"icon-bingtu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m311.2 223.2L576 451.2V133.6c100.8 16.8 188.8 73.6 247.2 153.6zM512 896c-212 0-384-172-384-384s172-384 384-384v442.4l344-228.8c25.6 51.2 40 108.8 40 170.4 0 212-172 384-384 384z\"  ></path></symbol><symbol id=\"icon-baobiao-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M928 128H544V64h-64v64H96c-17.6 0-32 14.4-32 32v512c0 17.6 14.4 32 32 32h384v50.4l-152.8 89.6 32 56 144-84h19.2l144 84 32-56L544 754.4V704h384c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32z m-32 512H128V192h768v448zM790.4 256l41.6 48-316.8 271.2L352 437.6 233.6 536.8 192.8 488l160-133.6 163.2 137.6L790.4 256z\"  ></path></symbol><symbol id=\"icon-bingtu\" viewBox=\"0 0 1024 1024\"><path d=\"M912.8 311.2C943.2 372 960 440 960 512c0 247.2-200.8 448-448 448S64 759.2 64 512 264 64 512 64v478.4l400.8-231.2zM576 62.4v363.2l304-175.2c-69.6-99.2-178.4-169.6-304-188z\"  ></path></symbol><symbol id=\"icon-tiaoxingtu\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM704 320h64v384h-64V320zM576 512h64v192h-64V512z m-128-64h64v256h-64V448zM320 576h64v128h-64V576z m512 256H192V192h64v576h576v64z\"  ></path></symbol><symbol id=\"icon-tiaoxingtu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M128 128h64v768h-64zM320 512h64v256h-64zM576 448h64v320h-64zM704 256h64v512h-64zM448 384h64v384h-64z\"  ></path><path d=\"M128 896v-64h768v64z\"  ></path></symbol><symbol id=\"icon-zhexiantu\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM448 418.4l128 128 209.6-209.6 45.6 45.6L576 637.6l-128-128-81.6 80.8-45.6-45.6L448 418.4z m384 413.6H192V192h64v576h576v64z\"  ></path></symbol><symbol id=\"icon-zhexiantu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M192 832V128h-64v768h768v-64z\"  ></path><path d=\"M605.6 640l-184-161.6L299.2 632l-50.4-40 164.8-206.4 184.8 163.2 248.8-296.8 48.8 40.8z\"  ></path></symbol><symbol id=\"icon-zhinanzhidao-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 832c-212 0-384-172-384-384s172-384 384-384 384 172 384 384-172 384-384 384zM256 768c7.2-7.2 356-156 356-156S760 263.2 767.2 256c7.2-7.2-356 155.2-356 155.2S252 768 256 768z m296-205.6c-26.4 11.2-160.8 72.8-165.6 75.2 13.6-29.6 56-137.6 70.4-170.4L552 562.4z\"  ></path></symbol><symbol id=\"icon-ditu\" viewBox=\"0 0 1024 1024\"><path d=\"M357.6 832l-255.2 56c-20 4.8-39.2-10.4-39.2-31.2V569.6c0-15.2 10.4-28 24.8-31.2L243.2 504l53.6 53.6L139.2 592c-7.2 1.6-12.8 8-12.8 16v188c0 10.4 9.6 17.6 19.2 16l192.8-42.4 12.8-3.2 12.8 2.4 306.4 60.8 210.4-47.2c7.2-1.6 12.8-8 12.8-16V580c0-10.4-9.6-17.6-19.2-16L688 606.4l-12 2.4L760 524.8l160.8-36c20-4.8 39.2 10.4 39.2 31.2v286.4c0 15.2-10.4 28-24.8 31.2L672.8 896M512 128c-115.2 0-206.4 101.6-190.4 220 5.6 41.6 26.4 80 56 109.6l0.8 0.8L512 591.2l133.6-132.8 0.8-0.8c29.6-29.6 49.6-68 56-109.6C719.2 229.6 627.2 128 512 128m0-64c141.6 0 256 114.4 256 256 0 70.4-28 133.6-74.4 180L512 681.6 330.4 500C284.8 453.6 256 390.4 256 320 256 178.4 371.2 64 512 64z m64.8 193.6c0-35.2-28.8-64-64-64s-64 28.8-64 64 28.8 64 64 64 64-28 64-64z\"  ></path></symbol><symbol id=\"icon-zhinanzhidao\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m256 192c-7.2 7.2-155.2 356-155.2 356S264 760 256.8 767.2c-4 0 156-356 156-356S775.2 248.8 768 256zM386.4 638.4c13.6-29.6 56-137.6 70.4-170.4L552 562.4c-26.4 12-160 73.6-165.6 76z\"  ></path></symbol><symbol id=\"icon-tousu\" viewBox=\"0 0 1024 1024\"><path d=\"M863.2 128H160.8c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32H864c17.6 0 32-14.4 32-32V160c-0.8-17.6-15.2-32-32.8-32zM333.6 256.8c26.4 30.4 51.2 60.8 72 92.8l-48.8 32c-2.4-4-7.2-10.4-12.8-17.6-24-32.8-43.2-59.2-57.6-77.6l47.2-29.6zM352 699.2c-4 3.2-10.4 9.6-19.2 19.2-3.2 4-4.8 7.2-6.4 8.8l-36-40.8c12.8-16 18.4-32.8 16.8-52v-160H256v-53.6h106.4v189.6l48.8-47.2c1.6 4 2.4 12 4 21.6 3.2 18.4 5.6 32 8.8 40.8-26.4 23.2-50.4 48-72 73.6z m402.4-30.4l-78.4-28v128h-57.6V621.6L528 588.8l21.6-49.6 70.4 24v-88H512.8V488c0 68.8-4.8 122.4-14.4 160-8.8 38.4-26.4 79.2-52.8 120.8-3.2-3.2-8.8-8-16.8-15.2-14.4-12.8-24-21.6-29.6-25.6 24-32 40-63.2 46.4-95.2 7.2-31.2 10.4-80 10.4-144.8V293.6c117.6-7.2 212-16.8 284-28l21.6 53.6c-95.2 11.2-177.6 19.2-248 24v77.6H768v53.6H676v108L776 616.8l-21.6 52z\"  ></path></symbol><symbol id=\"icon-xunjianjianyan\" viewBox=\"0 0 1024 1024\"><path d=\"M724.8 448H490.4c46.4-37.6 84-78.4 113.6-121.6 29.6 43.2 70.4 84 120.8 121.6zM896 160v704c0 17.6-14.4 32-32 32H160c-17.6 0-32-14.4-32-32V160c0-17.6 14.4-32 32-32h704c17.6 0 32 14.4 32 32zM768 720h-72.8c10.4-27.2 24.8-70.4 40.8-121.6 8.8-25.6 16-45.6 20-59.2l-53.6-13.6c-3.2 8-6.4 20.8-11.2 39.2-19.2 68.8-36 122.4-48 156H416v48h352V720z m-277.6-21.6l51.2-13.6c-13.6-50.4-28-98.4-44.8-143.2L448 552.8c14.4 48 28.8 96 42.4 145.6z m102.4-24.8l48.8-8.8c-8.8-46.4-19.2-92-31.2-136l-51.2 8.8c15.2 52 26.4 97.6 33.6 136z m198.4-250.4c-61.6-32.8-116.8-79.2-162.4-140.8L640 256h-66.4c-33.6 69.6-76.8 121.6-142.4 164V368h-56V256h-56v112h-64v48H320c-17.6 60-42.4 116-73.6 168.8 5.6 31.2 10.4 57.6 13.6 79.2 26.4-43.2 47.2-87.2 60-130.4V768h55.2l0.8-225.6 42.4 42.4 28.8-49.6c-25.6-20.8-48.8-40.8-71.2-58.4V416h52.8c-5.6 4.8-12.8 8-20 11.2 10.4 17.6 20 35.2 28.8 53.6 3.2-1.6 6.4-4 11.2-6.4 13.6-10.4 24-18.4 31.2-24.8V496h240v-46.4c1.6 1.6 3.2 2.4 6.4 4 16 12 29.6 20 40 24.8 7.2-17.6 16-37.6 24.8-55.2z\"  ></path></symbol><symbol id=\"icon-dianpu\" viewBox=\"0 0 1024 1024\"><path d=\"M832 474.4c37.6-12.8 64-48.8 64-90.4 0-5.6-30.4-241.6-30.4-241.6-0.8-8-8-14.4-16-14.4H174.4c-8 0-15.2 6.4-16 14.4 0 0-30.4 236.8-30.4 241.6 0 41.6 26.4 77.6 64 90.4V880c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V474.4zM720.8 192l21.6 192h-32l-21.6-192h32zM592 192l7.2 192h-32L560 192h32z m-160 0h32l-7.2 192h-32l7.2-192z m-128.8 0h32l-21.6 192h-32l21.6-192zM608 832H416V672h192v160z m160-288H256v-69.6c15.2-5.6 29.6-15.2 40-27.2 17.6 20 43.2 32.8 72 32.8s54.4-12.8 72-32.8c17.6 20 43.2 32.8 72 32.8s54.4-12.8 72-32.8c17.6 20 43.2 32.8 72 32.8s54.4-12.8 72-32.8c10.4 12 24.8 21.6 40 27.2V544z\"  ></path></symbol><symbol id=\"icon-yunshuzhongwuliu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M957.6 572.8l-120.8-181.6c-3.2-4.8-8-7.2-13.6-7.2H704V224c0-17.6-14.4-32-32-32H96c-17.6 0-32 14.4-32 32v448c0 17.6 14.4 32 32 32h32c0 70.4 57.6 128 128 128s128-57.6 128-128h256c0 70.4 57.6 128 128 128s128-57.6 128-128h32c17.6 0 32-14.4 32-32V581.6c0-3.2-0.8-6.4-2.4-8.8zM256 768c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z m384-128H366.4c-22.4-38.4-63.2-64-110.4-64s-88.8 25.6-110.4 64H128V256h512v384z m128 128c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z m128-128h-17.6c-22.4-38.4-63.2-64-110.4-64-23.2 0-44.8 6.4-64 17.6V448h95.2c5.6 0 10.4 2.4 12.8 7.2l80.8 116.8c1.6 2.4 3.2 5.6 3.2 8.8V640z\"  ></path></symbol><symbol id=\"icon-dianpu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M865.6 142.4c-0.8-8-8-14.4-16-14.4H174.4c-8 0-15.2 6.4-16 14.4 0 0-30.4 236.8-30.4 241.6 0 41.6 26.4 77.6 64 90.4V880c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V474.4c37.6-12.8 64-48.8 64-90.4 0-5.6-30.4-241.6-30.4-241.6zM424 385.6c-12.8 3.2-24 9.6-32 19.2-3.2 4-11.2 11.2-24 11.2s-20-7.2-24-11.2c-8-8.8-18.4-16-30.4-19.2L335.2 192H432l-8 193.6zM560 192l8 193.6a66.4 66.4 0 0 0-32 19.2c-3.2 4-11.2 11.2-24 11.2s-20-7.2-24-11.2c-8-9.6-19.2-16-32-19.2l8-192.8 96-0.8z m40 193.6L592 192h96.8l21.6 193.6c-12 3.2-22.4 9.6-30.4 19.2-3.2 4-11.2 11.2-24 11.2s-20-7.2-24-11.2a66.4 66.4 0 0 0-32-19.2z m-352 19.2c-4 4-11.2 11.2-24 11.2-16.8 0-30.4-12.8-32-29.6 2.4-19.2 14.4-115.2 24-194.4h87.2l-21.6 192.8c-12.8 3.2-24.8 10.4-33.6 20zM576 832H448V704h128v128z m192 0H640V640H384v192H256V474.4c15.2-5.6 29.6-15.2 40-27.2 17.6 20 43.2 32.8 72 32.8s54.4-12.8 72-32.8c17.6 20 43.2 32.8 72 32.8s54.4-12.8 72-32.8c17.6 20 43.2 32.8 72 32.8s54.4-12.8 72-32.8c10.4 12 24.8 21.6 40 27.2V832z m32-416c-12.8 0-20-7.2-24-11.2a68.96 68.96 0 0 0-33.6-20L720.8 192H808c10.4 78.4 22.4 175.2 24 194.4-0.8 16.8-15.2 29.6-32 29.6z\"  ></path></symbol><symbol id=\"icon-yunshuzhongwuliu\" viewBox=\"0 0 1024 1024\"><path d=\"M823.2 384H704V224c0-17.6-14.4-32-32-32H96c-17.6 0-32 14.4-32 32v448c0 17.6 14.4 32 32 32h32c0 70.4 57.6 128 128 128s128-57.6 128-128h256c0 70.4 57.6 128 128 128s128-57.6 128-128h32c17.6 0 32-14.4 32-32V581.6c0-3.2-0.8-6.4-2.4-8.8l-120.8-181.6c-3.2-4.8-8-7.2-13.6-7.2zM268.8 766.4c-44.8 8.8-84-30.4-75.2-75.2 4.8-24.8 24.8-45.6 50.4-50.4 44.8-8.8 84 30.4 75.2 75.2-5.6 25.6-25.6 45.6-50.4 50.4z m512 0c-44.8 8.8-84-30.4-75.2-75.2 4.8-24.8 24.8-45.6 50.4-50.4 44.8-8.8 84 30.4 75.2 75.2-5.6 25.6-25.6 45.6-50.4 50.4zM704 576V448h95.2c5.6 0 10.4 2.4 12.8 7.2L896 576H704z\"  ></path></symbol><symbol id=\"icon-kuaidiyuan\" viewBox=\"0 0 1024 1024\"><path d=\"M895.2 767.2V864c0 17.6-14.4 32-32 32h-160V720c0-8.8-7.2-16-16-16h-352c-8.8 0-16 7.2-16 16v176H160.8c-17.6 0-32-14.4-32-32V768c0-128 256-192 383.2-192s383.2 64 383.2 191.2z m-384 128.8h128v-32h-128v32z m64-64h64v-32h-64v32z m-288-544c0 124 100 224 224 224s224-100 224-224-100-224-224-224c-101.6 0-187.2 67.2-214.4 160H191.2v32h98.4c-1.6 10.4-2.4 20.8-2.4 32z\"  ></path></symbol><symbol id=\"icon-baoguofahuo\" viewBox=\"0 0 1024 1024\"><path d=\"M128 864c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V320H128v544z m447.2-288H768v64H575.2v-64z m-64 128H768v64H511.2v-64z m-16-416h-368l76.8-135.2c12-16 30.4-24.8 50.4-24.8h240.8v160z m401.6 0h-368V128h240.8c20 0 38.4 9.6 50.4 24.8l76.8 135.2z\"  ></path></symbol><symbol id=\"icon-kuaidiyuan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512.8 576c-128 0-383.2 64-383.2 192v96c0 17.6 14.4 32 32 32h191.2V736h320v160h192c17.6 0 32-14.4 32-32V767.2C896 640 640.8 576 512.8 576z m319.2 256H704V720c0-8.8-7.2-16-16-16H336c-8.8 0-16 7.2-16 16v112H192.8v-64.8c0-26.4 40-58.4 103.2-84 75.2-29.6 162.4-43.2 216-43.2 53.6 0 140.8 13.6 216 43.2 64 25.6 103.2 57.6 103.2 84l0.8 64.8z m-256-32h64v32h-64v-32z m-64 64h128v32H512v-32zM512 64c-101.6 0-187.2 67.2-214.4 160H192v32h98.4c-1.6 10.4-2.4 20.8-2.4 32 0 124 100 224 224 224s224-100 224-224S636 64 512 64z m0 64c63.2 0 116.8 36.8 143.2 89.6C622.4 204.8 574.4 192 512 192c-60 0-108 11.2-142.4 23.2C396 164 449.6 128 512 128z m0 320c-88 0-160-72-160-160 0-11.2 0.8-21.6 3.2-32 30.4-13.6 84-32 156.8-32 78.4 0 132 21.6 156.8 34.4 1.6 9.6 3.2 19.2 3.2 29.6 0 88-72 160-160 160z\"  ></path></symbol><symbol id=\"icon-baoguofahuo-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M768 768H512v-64h256v64z m0-192H576v64h192v-64z m128-288v576c0 17.6-14.4 32-32 32H160c-17.6 0-32-14.4-32-32V288h-0.8l70.4-124.8c11.2-21.6 32.8-35.2 57.6-35.2H768c24 0 46.4 13.6 57.6 35.2L896 288zM528 192v96h304.8l-44.8-77.6c-4-9.6-12.8-16.8-23.2-18.4m-505.6 0c-10.4 1.6-19.2 8.8-23.2 18.4L191.2 288H496V192m336 128H192v512h640V320z\"  ></path></symbol><symbol id=\"icon-daikuan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M896 512h64c0 247.2-200.8 448-448 448S64 759.2 64 512 264.8 64 512 64v64c-212 0-384 172-384 384s172 384 384 384 384-172 384-384zM640 608v-64H531.2l107.2-107.2-45.6-44.8-112 112L368 392l-45.6 45.6L429.6 544H320v64h128.8v32H320v64h128.8v96h64V704H640v-64H512.8v-32H640z m247.2-516.8l-136 136-109.6-109.6-2.4 268.8 268.8-2.4-111.2-112 136-136-45.6-44.8z\"  ></path></symbol><symbol id=\"icon-chaibaoguoqujian\" viewBox=\"0 0 1024 1024\"><path d=\"M896 320v544c0 17.6-14.4 32-32 32H160c-17.6 0-32-14.4-32-32V320h12.8l360-257.6 37.6 52L251.2 320h447.2l-181.6-65.6 21.6-60L884.8 320h11.2zM768 704H512v64h256v-64z m0-128H576v64h192v-64z\"  ></path></symbol><symbol id=\"icon-huankuan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64v64c212 0 384 172 384 384s-172 384-384 384-384-172-384-384H64c0 247.2 200.8 448 448 448s448-200.8 448-448S759.2 64 512 64z m144 328L544 504 432 392l-45.6 45.6L492.8 544H384v64h127.2v32H384v64h127.2v96h64V704H704v-64H575.2v-32H704v-64H594.4l107.2-107.2L656 392z\"  ></path><path d=\"M358.4 309.6l-136-136L332.8 64H64v264l113.6-108.8 136 135.2z\"  ></path></symbol><symbol id=\"icon-chaibaoguoqujian-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 704h256v64H512zM576 576h192v64H576z\"  ></path><path d=\"M885.6 320L539.2 193.6l-21.6 60L698.4 320H251.2l287.2-206.4-37.6-52L141.6 320H128v544c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V320h-10.4z m-53.6 512H192V352h640v480z\"  ></path></symbol><symbol id=\"icon-tuikuan-xi\" viewBox=\"0 0 1024 1024\"><path d=\"M528.8 480v96H704v32H528.8v224h-32V608H320v-32h176.8V480H320v-32h156.8L331.2 302.4l22.4-22.4 159.2 159.2L672 280l22.4 22.4L548 448H704v32H528.8z m400.8-131.2C864 182.4 701.6 64 512 64 264.8 64 64 264.8 64 512s200.8 448 448 448c109.6 0 210.4-39.2 288-104.8v72.8h32v-128H704v32h73.6c-72 60-164.8 96-265.6 96-229.6 0-416-186.4-416-416s186.4-416 416-416c176.8 0 328 110.4 388 266.4 1.6 6.4 8 12 15.2 12 8.8 0 16-7.2 16-16 0.8-4 0-7.2-1.6-9.6z\"  ></path></symbol><symbol id=\"icon-zitigui\" viewBox=\"0 0 1024 1024\"><path d=\"M128 384h240v224H128V384z m528 256.8V896h208c17.6 0 32-14.4 32-32V640.8H656zM896 384H656v224.8h240V384zM400 480h224V128H400v352z m224 32H400v384h224V512z m32-160h240V160c0-17.6-14.4-32-32-32H656v224zM368 640H128v224c0 17.6 14.4 32 32 32h208V640z m0-288V128H160c-17.6 0-32 14.4-32 32v192h240z\"  ></path></symbol><symbol id=\"icon-rili-xianxing-xi\" viewBox=\"0 0 1024 1024\"><path d=\"M352 128h32v128h-32zM640 576h128v32H640zM416 192h192v32H416zM640 128h32v128h-32zM448 448h128v32H448zM640 448h128v32H640zM448 576h128v32H448zM256 576h128v32H256z\"  ></path><path d=\"M864 192H704v32h160v64H160v-64h160v-32H160c-17.6 0-32 14.4-32 32v640c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m0 672H160V320h704v544z\"  ></path><path d=\"M256 704h128v32H256zM256 448h128v32H256zM448 704h128v32H448z\"  ></path></symbol><symbol id=\"icon-zitigui-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM624 480H400V192h224v288zM368 608H192V384h176v224z m32-96h224v320H400V512z m256-128h176v224.8H656V384z m176-32H656V192h176v160zM368 192v160H192V192h176zM192 640h176v192H192V640z m464 192V640.8h176V832H656z\"  ></path></symbol><symbol id=\"icon-jisuanqilishuai-xianxing-xi\" viewBox=\"0 0 1024 1024\"><path d=\"M800 96v832H224V96h576m0-32H224c-17.6 0-32 14.4-32 32v832c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V96c0-17.6-14.4-32-32-32zM672 224v64H352v-64h320m32-32H320v128h384V192zM384 448h-64v32h64v-32z m160 0h-64v32h64v-32z m160 0h-64v32h64v-32zM384 608h-64v32h64v-32z m160 0h-64v32h64v-32z m160 0h-64v32h64v-32zM384 768h-64v32h64v-32z m160 0h-64v32h64v-32z m160 0h-64v32h64v-32z\"  ></path></symbol><symbol id=\"icon-caigou-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M821.6 256l-78.4 256H342.4L272 256h549.6M216 64H64v64h104.8l18.4 64 100 361.6c1.6 4.8 4 8.8 7.2 12l-52 83.2c-6.4 5.6-10.4 14.4-10.4 23.2 0 17.6 14.4 32 32 32h568v-64H323.2l40-64H768c13.6 0 24.8-8.8 29.6-22.4l97.6-318.4c6.4-20.8-8-43.2-29.6-43.2H252.8l-18.4-64L216 64z\"  ></path><path d=\"M320 832m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z\"  ></path><path d=\"M768 832m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z\"  ></path></symbol><symbol id=\"icon-yonghuziliao\" viewBox=\"0 0 1024 1024\"><path d=\"M928 192H96c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32zM288 409.6c3.2-48 42.4-86.4 90.4-89.6 56-3.2 102.4 40.8 102.4 96 0 52.8-43.2 96-96 96-56 0.8-100.8-46.4-96.8-102.4zM576 688c0 8.8-7.2 16-16 16H208c-8.8 0-16-7.2-16-16v-48c0-64 128-96 192-96s192 32 192 96v48z m256-208H704v-32h128v32z m0-64H576v-32h256v32z m0-64H576v-32h256v32z\"  ></path></symbol><symbol id=\"icon-caigou\" viewBox=\"0 0 1024 1024\"><path d=\"M768 576c13.6 0 24.8-8.8 29.6-22.4l97.6-318.4c6.4-20.8-8-43.2-29.6-43.2H252.8l-18.4-64L216 64H64v64h104.8l18.4 64 100 361.6c1.6 4.8 4 8.8 7.2 12l-52 83.2c-6.4 5.6-10.4 14.4-10.4 23.2 0 17.6 14.4 32 32 32h568v-64H323.2l40-64H768z\"  ></path><path d=\"M320 832m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z\"  ></path><path d=\"M768 832m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z\"  ></path></symbol><symbol id=\"icon-yonghuziliao-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M896 256v512H128V256h768m32-64H96c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32zM378.4 320c-48 2.4-87.2 41.6-90.4 89.6-4 56 40.8 103.2 96 103.2 53.6 0 96-43.2 96-96 0.8-55.2-45.6-100-101.6-96.8z m5.6 223.2c-64 0-192 32-192 96v48c0 8.8 7.2 16 16 16h352c8.8 0 16-7.2 16-16v-48.8c0-63.2-128-95.2-192-95.2zM832 384H576v32h256v-32z m0-64H576v32h256v-32z m0 128H704v32h128v-32z\"  ></path></symbol><symbol id=\"icon-shangpin\" viewBox=\"0 0 1024 1024\"><path d=\"M832 256H640V160.8c0-17.6-14.4-32.8-32.8-32.8H416c-17.6 0-32.8 14.4-32.8 32.8V256H192l-64 576c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64l-64-576z m-384-64h128v64H448v-64z m-0.8 192H384v-63.2h63.2V384zM640 384h-63.2v-63.2H640V384z\"  ></path></symbol><symbol id=\"icon-pifuzhuti\" viewBox=\"0 0 1024 1024\"><path d=\"M768 388v475.2c0 17.6-14.4 32-32 32H288c-17.6 0-32-14.4-32-32V390.4l-72.8 40c-8 4-17.6 1.6-21.6-6.4L72 268c-4.8-8-1.6-17.6 6.4-21.6l216-117.6h46.4c6.4 0 12.8 4 15.2 10.4 19.2 51.2 82.4 89.6 156.8 89.6 75.2 0 137.6-37.6 156.8-89.6 2.4-6.4 8-10.4 15.2-10.4h46.4l214.4 117.6c8 4 10.4 14.4 5.6 21.6l-88 156c-4 8-14.4 10.4-21.6 5.6L768 388z\"  ></path></symbol><symbol id=\"icon-shangpin-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M832 256H640V160.8c0-17.6-14.4-32.8-32.8-32.8H416c-17.6 0-32.8 14.4-32.8 32.8V256H192l-64 576c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64l-64-576z m-384-64h128v64H448v-64z m326.4 128l56.8 512H192l56.8-512\"  ></path><path d=\"M447.2 352.8H384V416h63.2v-63.2zM640 352.8h-63.2V416H640v-63.2z\"  ></path></symbol><symbol id=\"icon-pifuzhuti-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M715.2 192.8L872 278.4l-40.8 71.2-32-18.4-96-54.4v553.6h-384V282.4l-94.4 52-31.2 17.6-40.8-72 158.4-86.4c38.4 60.8 115.2 100 201.6 100 86.4-1.6 163.2-40 202.4-100.8m16-64h-46.4c-6.4 0-12.8 4-15.2 10.4-19.2 51.2-82.4 89.6-156.8 89.6-75.2 0-137.6-37.6-156.8-89.6-2.4-6.4-8-10.4-15.2-10.4h-46.4l-216 117.6c-8 4-10.4 14.4-6.4 21.6L160.8 424c3.2 4.8 8 8 13.6 8 2.4 0 5.6-0.8 8-1.6l72.8-40v472.8c0 17.6 14.4 32 32 32h448c17.6 0 32-14.4 32-32V388l73.6 41.6c2.4 1.6 5.6 2.4 8 2.4 5.6 0 11.2-3.2 13.6-8L952 268c4-8 1.6-17.6-5.6-21.6L731.2 128.8z\"  ></path></symbol><symbol id=\"icon-peizaizhuangche\" viewBox=\"0 0 1024 1024\"><path d=\"M448 864c0 42.4-28 81.6-71.2 92.8-51.2 13.6-104-16.8-117.6-68-9.6-35.2 1.6-71.2 26.4-94.4L155.2 307.2l-88-50.4 32-55.2 110.4 64L344 768.8c31.2-2.4 61.6 11.2 80.8 35.2L945.6 664l16.8 61.6L448 864z m447.2-252.8L435.2 734.4c-16.8 4.8-34.4-5.6-39.2-22.4L272.8 252c-4.8-16.8 5.6-34.4 22.4-39.2l460-123.2c16.8-4.8 34.4 5.6 39.2 22.4l123.2 460c4.8 17.6-5.6 35.2-22.4 39.2zM568.8 368l16.8 61.6 185.6-49.6-16.8-61.6L568.8 368z m235.2 135.2l-16.8-61.6-308.8 82.4 16.8 61.6 308.8-82.4z\"  ></path></symbol><symbol id=\"icon-diamond\" viewBox=\"0 0 1024 1024\"><path d=\"M512.8 216l185.6 200H327.2l185.6-200z m273.6 200h172.8l-224-288h-56l107.2 288z m-273.6 413.6L732 448H292.8l220 381.6zM647.2 128H377.6L276 412.8 512.8 168l236.8 245.6L647.2 128z m121.6 320l-256 450.4-256-450.4H87.2L512 963.2 933.6 448H768.8z m-530.4-32l107.2-288h-56L68 416h170.4z\"  ></path></symbol><symbol id=\"icon-peizaizhuangche-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M448 863.2c0 42.4-28 81.6-71.2 92.8-51.2 13.6-104-16.8-117.6-68-9.6-35.2 1.6-71.2 26.4-94.4L155.2 307.2l-88-50.4 32-55.2 110.4 64L344.8 768c31.2-2.4 61.6 11.2 80.8 35.2L944.8 664l16.8 61.6L448 863.2zM272.8 252c-4.8-16.8 5.6-34.4 22.4-39.2l460-123.2c2.4-0.8 5.6-0.8 8-0.8 14.4 0 27.2 9.6 31.2 24l123.2 460c4.8 16.8-5.6 34.4-22.4 39.2L435.2 734.4c-2.4 0.8-5.6 0.8-8 0.8-14.4 0-27.2-9.6-31.2-24L272.8 252z m70.4 14.4L449.6 664 848 557.6 740.8 160 343.2 266.4z m152 319.2l308.8-83.2-16.8-61.6-308.8 83.2 16.8 61.6z m90.4-156.8l185.6-49.6-16.8-61.6-185.6 49.6 16.8 61.6z\"  ></path></symbol><symbol id=\"icon-diamond-o\" viewBox=\"0 0 1024 1024\"><path d=\"M736 126.4H290.4L64.8 419.2 512 961.6l447.2-546.4L736 126.4z m-461.6 288l81.6-224h149.6l-231.2 224z m476 0l-231.2-224h148.8l82.4 224z m-18.4 32l-219.2 382.4-220-382.4h439.2z m-404.8-32l185.6-185.6 185.6 185.6H327.2z m-70.4 32l192 337.6-278.4-337.6h86.4z m512 0h82.4L580.8 776l188-329.6z m108.8-32l-91.2 0.8-85.6-224h3.2l173.6 223.2z m-556-224h3.2l-85.6 224H148.8l172.8-224z\"  ></path></symbol><symbol id=\"icon-zhiliang-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 134.4l289.6 133.6V472c0 96.8-31.2 193.6-88.8 272.8-52.8 73.6-124 126.4-200.8 150.4-77.6-24-148-76.8-200.8-150.4-57.6-79.2-88.8-176-88.8-272.8V268L512 134.4m0-71.2L158.4 226.4v244.8c0 226.4 151.2 437.6 353.6 489.6 203.2-51.2 353.6-263.2 353.6-489.6V226.4L512 63.2z m191.2 447.2c0-106.4-85.6-192-192-192s-192 85.6-192 192 85.6 192 192 192c24 0 46.4-4.8 68-12l58.4 58.4 45.6-45.6-47.2-47.2c40.8-35.2 67.2-87.2 67.2-145.6z m-192 128c-70.4 0-128-57.6-128-128s57.6-128 128-128 128 57.6 128 128c0 40.8-19.2 76.8-48.8 100l-43.2-43.2-45.6 45.6 24.8 24.8c-4.8 0-10.4 0.8-15.2 0.8z\"  ></path></symbol><symbol id=\"icon-sheji-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M772.8 124c-4.8 0-10.4 2.4-14.4 6.4L184 704.8l-56 192 192-56 460-460L800 360l94.4-94.4c7.2-7.2 8-18.4 2.4-24.8L783.2 128c-2.4-3.2-6.4-4-10.4-4z m4.8 213.6L687.2 247.2l85.6-85.6 90.4 90.4-85.6 85.6z m-602.4 512l37.6-128 454.4-454.4 90.4 90.4-454.4 454.4-128 37.6z m84-725.6l-136 136 234.4 234.4 22.4-22.4-211.2-212 90.4-90.4 53.6 53.6-22.4 22.4 22.4 22.4 22.4-22.4 45.6 45.6-22.4 22.4 22.4 22.4 22.4-22.4 45.6 45.6-45.6 45.6 22.4 22.4 68-68-234.4-235.2z m415.2 415.2l-22.4 22.4-22.4 22.4 22.4 22.4 22.4-22.4 45.6 45.6-45.6 45.6 22.4 22.4 45.6-45.6 45.6 45.6-22.4 22.4 22.4 22.4 22.4-22.4 53.6 53.6L772.8 864 560.8 652.8l-22.4 22.4 234.4 234.4 136-136-234.4-234.4z\"  ></path></symbol><symbol id=\"icon-zhiliang\" viewBox=\"0 0 1024 1024\"><path d=\"M640 512c0 40.8-19.2 76.8-48.8 100l-43.2-43.2-45.6 45.6 24.8 24.8c-4.8 0.8-10.4 0.8-15.2 0.8-70.4 0-128-57.6-128-128s57.6-128 128-128 128 57.6 128 128z m226.4-283.2v244.8c0 226.4-151.2 437.6-353.6 489.6-203.2-51.2-354.4-263.2-354.4-489.6V228.8L512.8 65.6l353.6 163.2zM636.8 657.6C677.6 622.4 704 570.4 704 512c0-106.4-85.6-192-192-192S320 406.4 320 512s85.6 192 192 192c24 0 46.4-4.8 68-12l58.4 58.4 45.6-45.6-47.2-47.2z\"  ></path></symbol><symbol id=\"icon-kaifa-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M256 604.8v-24.8l144-56V552l-67.2 24-44.8 16v0.8l44.8 16 67.2 24v27.2l-144-55.2zM536.8 472H560l-79.2 272h-23.2l79.2-272zM624 633.6l67.2-24 44.8-16V592l-44.8-16.8-67.2-24v-28l144 56v24.8l-144 56v-26.4zM864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32z m0 736H160V352h704v512zM160 320V160h704v160H160z m96-112c-17.6 0-32 14.4-32 32s14.4 32 32 32 32-14.4 32-32-14.4-32-32-32z m96 0c-17.6 0-32 14.4-32 32s14.4 32 32 32 32-14.4 32-32-14.4-32-32-32z m96 0c-17.6 0-32 14.4-32 32s14.4 32 32 32 32-14.4 32-32-14.4-32-32-32z\"  ></path></symbol><symbol id=\"icon-anquanbaozhang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 63.2L160.8 226.4v244.8c0 226.4 149.6 437.6 351.2 489.6 201.6-51.2 351.2-263.2 351.2-489.6V226.4L512 63.2z m-8 574.4l-45.6 45.6-45.6-45.6-90.4-90.4 45.6-45.6L458.4 592l204-204 45.6 45.6L504 637.6z\"  ></path></symbol><symbol id=\"icon-yinhangqia\" viewBox=\"0 0 1024 1024\"><path d=\"M960 256v64H64v-64c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64z m0 128v384c0 35.2-28.8 64-64 64H128c-35.2 0-64-28.8-64-64V384h896zM256 640H128v32h128v-32z m128-64H128v32h256v-32z\"  ></path></symbol><symbol id=\"icon-anquanbaozhang-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 63.2L160.8 226.4v244.8c0 226.4 149.6 437.6 351.2 489.6 201.6-51.2 351.2-263.2 351.2-489.6V226.4L512 63.2z m287.2 408c0 96.8-31.2 193.6-88 272.8-52.8 73.6-122.4 126.4-199.2 149.6-76-24-146.4-76-199.2-149.6-56.8-79.2-88-176.8-88-272.8V267.2L512 134.4l287.2 133.6v203.2zM458.4 592l204-204 45.6 45.6L504 637.6l-45.6 45.6-45.6-45.6-90.4-90.4 45.6-45.6L458.4 592z\"  ></path></symbol><symbol id=\"icon-yinhangqia-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M896 192H128c-35.2 0-64 28.8-64 64v512c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m0 576H128V384h768v384zM128 320v-64h768v64H128z m320 288H192v-32h256v32z m-128 64H192v-32h128v32z\"  ></path></symbol><symbol id=\"icon-cangkucangchu\" viewBox=\"0 0 1024 1024\"><path d=\"M920 355.2L531.2 77.6c-11.2-8-26.4-8-36.8 0L104 355.2c-12.8 8.8-6.4 28.8 9.6 28.8H192v496c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V384h78.4c15.2 0 21.6-20 9.6-28.8zM640 768H384v-64h256v64z m0-128H384v-64h256v64z m0-128H384v-64h256v64z\"  ></path></symbol><symbol id=\"icon-hongbao-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M768 64H256c-35.2 0-64 28.8-64 64v768c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V128c0-35.2-28.8-64-64-64z m0 64v53.6L512 224l-256-42.4V128h512z m-512 768V213.6L512 256l256-42.4V896H256z m393.6-406.4L563.2 576H640v64H544v32h96v64H544v96h-64V736H384v-64h96v-32H384v-64h76.8L374.4 489.6l45.6-45.6L512 536.8l92-92 45.6 44.8z\"  ></path></symbol><symbol id=\"icon-cangkucangchu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512.8 142.4L768 325.6V832H256V325.6l256.8-183.2m0-71.2c-6.4 0-12.8 1.6-18.4 5.6L104 355.2c-12.8 8.8-6.4 28.8 9.6 28.8H192v496c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V384h78.4c15.2 0 21.6-20 9.6-28.8L531.2 77.6c-5.6-4-12-6.4-18.4-6.4zM640 448H384v64h256v-64z m0 128H384v64h256v-64z m0 128H384v64h256v-64z\"  ></path></symbol><symbol id=\"icon-hongbao\" viewBox=\"0 0 1024 1024\"><path d=\"M192 202.4V896c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V202.4L512 256l-320-53.6z m412.8 242.4l45.6 45.6L563.2 576H640v64H544v32h96v64H544v96h-64V736H384v-64h96v-32H384v-64h76.8L374.4 489.6l45.6-45.6L512 536.8l92.8-92zM768 64H256c-35.2 0-64 28.8-64 64v42.4L512 224l320-53.6V128c0-35.2-28.8-64-64-64z\"  ></path></symbol><symbol id=\"icon-zhongzhuanzhan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512.8 142.4L768 325.6V832H256V325.6l256.8-183.2m0-71.2c-6.4 0-12.8 1.6-18.4 5.6L104 355.2c-12.8 8.8-6.4 28.8 9.6 28.8H192v496c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V384h78.4c15.2 0 21.6-20 9.6-28.8L531.2 77.6c-5.6-4-12-6.4-18.4-6.4z m144 483.2L570.4 640h52c-22.4 38.4-63.2 64-110.4 64-32 0-61.6-12-84-32l-57.6 32.8C405.6 744 456 768 512 768c83.2 0 154.4-53.6 180.8-128h50.4L656.8 554.4zM401.6 512c22.4-38.4 63.2-64 110.4-64 32.8 0 62.4 12.8 84.8 32.8l57.6-32.8c-35.2-39.2-85.6-64-142.4-64-83.2 0-154.4 53.6-180.8 128h-50.4l86.4 85.6L453.6 512h-52z\"  ></path></symbol><symbol id=\"icon-aixin\" viewBox=\"0 0 1024 1024\"><path d=\"M667.786667 117.333333C832.864 117.333333 938.666667 249.706667 938.666667 427.861333c0 138.250667-125.098667 290.506667-371.573334 461.589334a96.768 96.768 0 0 1-110.186666 0C210.432 718.368 85.333333 566.112 85.333333 427.861333 85.333333 249.706667 191.136 117.333333 356.213333 117.333333c59.616 0 100.053333 20.832 155.786667 68.096C567.744 138.176 608.170667 117.333333 667.786667 117.333333z m0 63.146667c-41.44 0-70.261333 15.189333-116.96 55.04-2.165333 1.845333-14.4 12.373333-17.941334 15.381333a32.32 32.32 0 0 1-41.770666 0c-3.541333-3.018667-15.776-13.536-17.941334-15.381333-46.698667-39.850667-75.52-55.04-116.96-55.04C230.186667 180.48 149.333333 281.258667 149.333333 426.698667 149.333333 537.6 262.858667 675.242667 493.632 834.826667a32.352 32.352 0 0 0 36.736 0C761.141333 675.253333 874.666667 537.6 874.666667 426.698667c0-145.44-80.853333-246.218667-206.88-246.218667z\"  ></path></symbol><symbol id=\"icon-zhongzhuanzhan\" viewBox=\"0 0 1024 1024\"><path d=\"M919.2 355.2L531.2 77.6c-11.2-8-26.4-8-36.8 0L104 355.2c-12.8 8.8-6.4 28.8 9.6 28.8H192v496c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V384h78.4c15.2 0 21.6-20 8.8-28.8zM280.8 512h51.2c26.4-74.4 97.6-127.2 180.8-127.2 56.8 0 107.2 24.8 142.4 64l-57.6 32.8c-22.4-20-52.8-32.8-84.8-32.8-47.2 0-88 25.6-110.4 63.2h51.2L367.2 597.6 280.8 512z m412 128C665.6 714.4 595.2 767.2 512 767.2c-56 0-106.4-24-141.6-63.2l57.6-32.8c22.4 20 52 32 84 32 47.2 0 88-25.6 110.4-63.2h-51.2l86.4-85.6L743.2 640h-50.4z\"  ></path></symbol><symbol id=\"icon-bianji\" viewBox=\"0 0 1024 1024\"><path d=\"M862.709333 116.042667a32 32 0 1 1 45.248 45.248L455.445333 613.813333a32 32 0 1 1-45.258666-45.258666L862.709333 116.053333zM853.333333 448a32 32 0 0 1 64 0v352c0 64.8-52.533333 117.333333-117.333333 117.333333H224c-64.8 0-117.333333-52.533333-117.333333-117.333333V224c0-64.8 52.533333-117.333333 117.333333-117.333333h341.333333a32 32 0 0 1 0 64H224a53.333333 53.333333 0 0 0-53.333333 53.333333v576a53.333333 53.333333 0 0 0 53.333333 53.333333h576a53.333333 53.333333 0 0 0 53.333333-53.333333V448z\"  ></path></symbol><symbol id=\"icon-kucun-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512.8 142.4L768 325.6V832H256V325.6l256.8-183.2m0-71.2c-6.4 0-12.8 1.6-18.4 5.6L104 355.2c-12.8 8.8-6.4 28.8 9.6 28.8H192v496c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V384h78.4c15.2 0 21.6-20 9.6-28.8L531.2 77.6c-5.6-4-12-6.4-18.4-6.4zM704 640H576v128h128V640z m-256 0H320v128h128V640z m128-192H448v128h128V448z\"  ></path></symbol><symbol id=\"icon-Dyanjing\" viewBox=\"0 0 1024 1024\"><path d=\"M705.941333 173.258667l74.666667 32a32 32 0 0 1 16.202667 15.466666l160 330.666667c0.362667 0.757333 0.693333 1.525333 0.992 2.293333a74.453333 74.453333 0 0 1 7.168 41.536l-22.154667 192A74.666667 74.666667 0 0 1 868.64 853.333333h-243.946667a74.666667 74.666667 0 0 1-74.176-66.112L543.370667 725.333333h-62.752l-7.146667 61.898667A74.666667 74.666667 0 0 1 399.317333 853.333333h-243.946666a74.666667 74.666667 0 0 1-74.176-66.112l-22.154667-192a74.314667 74.314667 0 0 1 7.114667-41.408l0.256-0.64 0.8-1.781333 160-330.666667a32 32 0 0 1 14.112-14.485333l2.08-0.981333 74.666666-32a32 32 0 0 1 26.922667 58.026666l-1.706667 0.789334-63.68 27.296-122.24 252.618666 264.106667 0.010667a74.666667 74.666667 0 0 1 74.176 83.221333L488 661.333333h47.978667l-7.616-66.101333A74.666667 74.666667 0 0 1 602.538667 512h264.106666l-122.24-252.629333-63.68-27.296a32 32 0 0 1 25.216-58.816zM421.461333 576H133.205333a10.666667 10.666667 0 0 0-10.592 11.893333l22.154667 192a10.666667 10.666667 0 0 0 10.592 9.44h243.946667a10.666667 10.666667 0 0 0 10.592-9.44l22.154666-192A10.666667 10.666667 0 0 0 421.461333 576z m469.333334 0H602.538667a10.666667 10.666667 0 0 0-10.592 11.893333l22.154666 192a10.666667 10.666667 0 0 0 10.592 9.44h243.946667a10.666667 10.666667 0 0 0 10.592-9.44l22.154667-192A10.666667 10.666667 0 0 0 890.794667 576z\"  ></path></symbol><symbol id=\"icon-kucun\" viewBox=\"0 0 1024 1024\"><path d=\"M919.2 355.2L531.2 77.6c-11.2-8-26.4-8-36.8 0L104 355.2c-12.8 8.8-6.4 28.8 9.6 28.8H192v496c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V384h78.4c15.2 0 21.6-20 8.8-28.8zM448 768H320V640h128v128z m0-320h128v128H448V448z m256 320H576V640h128v128z\"  ></path></symbol><symbol id=\"icon-caidan\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c71.477333 0 159.68 57.546667 229.258667 147.018667C817.845333 330.826667 864 455.978667 864 586.666667c0 211.808-148.501333 352-352 352S160 798.474667 160 586.666667c0-130.688 46.144-255.84 122.741333-354.314667C352.32 142.88 440.522667 85.333333 512 85.333333z m0 64c-48.213333 0-120.096 46.912-178.741333 122.314667C265.109333 359.253333 224 470.762667 224 586.666667c0 175.616 119.050667 288 288 288s288-112.384 288-288c0-115.904-41.109333-227.402667-109.258667-315.018667C632.096 196.234667 560.213333 149.333333 512 149.333333z m-74.666667 522.666667a53.333333 53.333333 0 1 1 0 106.666667 53.333333 53.333333 0 0 1 0-106.666667z m-96-128a42.666667 42.666667 0 1 1 0 85.333333 42.666667 42.666667 0 0 1 0-85.333333z\"  ></path></symbol><symbol id=\"icon-moduanwangdian-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M758.4 192l76.8 192H768v448H256V384h-68l80-192h490.4m32-64H236c-6.4 0-12 4-14.4 9.6l-120 288c-4 10.4 3.2 22.4 14.4 22.4H192v432c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V448h73.6c11.2 0 19.2-11.2 15.2-21.6l-115.2-288c-2.4-6.4-8.8-10.4-15.2-10.4zM640 448H384v64h256v-64z m0 128H384v64h256v-64z m0 128H384v64h256v-64z\"  ></path></symbol><symbol id=\"icon-anquan\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c72.533333 0 139.808 8.362667 200.202667 22.325334 21.258667 4.906667 40.192 10.208 56.586666 15.52 9.301333 3.018667 16.106667 5.472 20.245334 7.114666C831.733333 144.906667 864 192.106667 864 238.624v385.034667c0 43.402667-25.130667 95.52-58.837333 121.109333l-227.626667 172.810667c-36.992 28.085333-94.005333 28.149333-131.072 0l-227.626667-172.810667C185.28 719.285333 160 666.912 160 623.658667V238.624c0-46.826667 32.170667-94.218667 75.157333-108.405333 4.16-1.642667 10.901333-4.074667 20.053334-7.04a684.437333 684.437333 0 0 1 56.586666-15.52C372.192 93.685333 439.466667 85.333333 512 85.333333z m0 64c-67.456 0-129.930667 7.765333-185.781333 20.682667-19.424 4.48-36.586667 9.28-51.274667 14.048-5.056 1.632-9.418667 3.146667-13.056 4.48-2.058667 0.746667-3.349333 1.248-3.84 1.450667a32 32 0 0 1-2.485333 0.885333c-16.074667 5.034667-31.562667 27.626667-31.562667 47.744v385.034667c0 23.498667 16.128 56.917333 33.536 70.133333l227.626667 172.810667c14.176 10.773333 39.530667 10.741333 53.674666 0l227.626667-172.810667C784 680.469333 800 647.306667 800 623.658667V238.624c0-19.84-15.626667-42.506667-32-47.882667l-2.048-0.746666a143.829333 143.829333 0 0 0-3.84-1.450667c-3.637333-1.333333-8-2.848-13.056-4.48a620.778667 620.778667 0 0 0-51.274667-14.048C641.930667 157.098667 579.456 149.333333 512 149.333333z m137.354667 190.72a32 32 0 0 1 45.290666 45.226667l-213.013333 213.333333a32 32 0 0 1-45.226667 0.064l-106.986666-106.549333a32 32 0 1 1 45.162666-45.344l84.341334 83.989333z\"  ></path></symbol><symbol id=\"icon-moduanwangdian\" viewBox=\"0 0 1024 1024\"><path d=\"M920.8 426.4l-115.2-288c-2.4-6.4-8-10.4-15.2-10.4H236c-6.4 0-12 4-14.4 9.6l-120 288c-4 10.4 3.2 22.4 14.4 22.4H192v432c0 8.8 7.2 16 16 16h608c8.8 0 16-7.2 16-16V448h73.6c11.2 0 19.2-11.2 15.2-21.6zM640 768H384v-64h256v64z m0-128H384v-64h256v64z m0-128H384v-64h256v64z\"  ></path></symbol><symbol id=\"icon-bangzhu\" viewBox=\"0 0 1024 1024\"><path d=\"M878.08 731.274667a32 32 0 0 1-54.88-32.938667A360.789333 360.789333 0 0 0 874.666667 512c0-200.298667-162.368-362.666667-362.666667-362.666667S149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667a360.789333 360.789333 0 0 0 186.314667-51.445334 32 32 0 0 1 32.928 54.88A424.778667 424.778667 0 0 1 512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667c0 78.293333-21.152 153.568-60.586667 219.274667zM650.666667 437.333333c0 65.898667-46.72 120.853333-109.194667 135.082667V608a32 32 0 0 1-64 0v-64a32 32 0 0 1 32-32C552.266667 512 586.666667 478.4 586.666667 437.333333s-34.4-74.666667-77.194667-74.666666c-26.773333 0-51.082667 13.248-65.173333 34.624a73.088 73.088 0 0 0-8.522667 17.717333 32 32 0 0 1-60.885333-19.690667c3.797333-11.754667 9.173333-22.933333 15.978666-33.237333 25.856-39.253333 70.186667-63.413333 118.613334-63.413333C587.274667 298.666667 650.666667 360.576 650.666667 437.333333zM512 736a32 32 0 1 1 0-64 32 32 0 0 1 0 64z\"  ></path></symbol><symbol id=\"icon-qianshoushenpitongguo-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M768 192H640c0-70.4-57.6-128-128-128s-128 57.6-128 128H256c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m-256-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m256 736H256V256h64v64h384v-64h64v640z m-59.2-404.8L459.2 740l-45.6-45.6 248.8-248.8 46.4 45.6z m-340 68l136 136-45.6 45.6-136-136 45.6-45.6z\"  ></path></symbol><symbol id=\"icon-buganxingqu\" viewBox=\"0 0 1024 1024\"><path d=\"M413.749333 565.045333a32 32 0 1 0 47.168 43.242667l105.088-114.634667a53.333333 53.333333 0 0 0 2.88-68.672 920.672 920.672 0 0 1-61.44-89.44c-17.077333-28.458667 0.821333-73.226667 37.845334-110.250666 10.901333-10.88 17.045333-16.565333 25.813333-23.210667C597.472 182.048 628.074667 170.666667 667.776 170.666667 793.813333 170.666667 874.666667 272.810667 874.666667 420.213333c0 112.405333-113.525333 251.904-344.298667 413.653334a32 32 0 0 1-36.736 0C262.858667 672.106667 149.333333 532.608 149.333333 420.202667 149.333333 272.810667 230.186667 170.666667 356.213333 170.666667c13.781333 0 26.592 2.026667 38.933334 5.930666a32 32 0 0 0 19.36-60.992A191.093333 191.093333 0 0 0 356.213333 106.666667C191.136 106.666667 85.333333 240.32 85.333333 420.213333 85.333333 559.786667 210.432 713.536 456.906667 886.272a96 96 0 0 0 110.186666 0C813.568 713.536 938.666667 559.786667 938.666667 420.213333 938.666667 240.32 832.864 106.666667 667.786667 106.666667c-54.442667 0-98.378667 16.341333-135.392 44.437333-11.669333 8.864-19.541333 16.128-32.352 28.938667-55.424 55.413333-84.16 127.274667-47.477334 188.416a975.872 975.872 0 0 0 60.213334 88.544L413.76 565.045333z\"  ></path></symbol><symbol id=\"icon-qianshoushenpitongguo\" viewBox=\"0 0 1024 1024\"><path d=\"M800 192H640c0-70.4-57.6-128-128-128s-128 57.6-128 128H224c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-288-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m-7.2 535.2l-45.6 45.6-45.6-45.6-89.6-90.4 45.6-45.6 90.4 90.4L664 445.6l45.6 45.6-204.8 204z\"  ></path></symbol><symbol id=\"icon-bofangjilu\" viewBox=\"0 0 1024 1024\"><path d=\"M822.496 473.152l52.053333 29.290667C869.461333 306.56 709.098667 149.333333 512 149.333333c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667c122.538667 0 234.645333-61.194667 301.578667-161.152a32 32 0 1 1 53.173333 35.616C788.064 866.634667 656.117333 938.666667 512 938.666667 276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667c0 10.954667-0.853333 26.357333-2.517334 46.528-1.930667 23.242667-27.274667 36.682667-47.594666 25.248l-97.450667-54.848a32 32 0 1 1 31.392-55.786667z m-493.12 176.213333L480 498.762667V320a32 32 0 0 1 64 0v192a32 32 0 0 1-9.376 22.624l-160 160a32 32 0 1 1-45.248-45.248z\"  ></path></symbol><symbol id=\"icon-juqianshou-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M256 678.4V256h64v64h288l128-128H640c0-70.4-57.6-128-128-128s-128 57.6-128 128H256c-35.2 0-64 28.8-64 64v480l64-57.6zM512 160c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m396 43.2l-45.6-45.6-753.6 753.6 45.6 45.6 40.8-40.8c8 25.6 32.8 44.8 60.8 44.8h512c35.2 0 64-28.8 64-64V278.4l76-75.2zM768 896H256v-40l512-519.2V896z\"  ></path></symbol><symbol id=\"icon-chuangzuo\" viewBox=\"0 0 1024 1024\"><path d=\"M896 864a32 32 0 0 1 0 64H128a32 32 0 0 1 0-64z m-60.16-733.621333l15.093333 15.093333c45.866667 45.834667 45.866667 120.16 0 166.005333L418.794667 743.338667a160.192 160.192 0 0 1-78.122667 42.986666l-152.245333 34.197334c-23.84 5.365333-44.661333-16.853333-37.749334-40.288l43.338667-146.88a160.042667 160.042667 0 0 1 40.373333-67.925334l435.328-435.050666c45.866667-45.834667 120.245333-45.834667 166.112 0zM636.32 254.304L279.68 610.709333a96.021333 96.021333 0 0 0-24.213333 40.746667l-27.946667 94.656 99.093333-22.261333a96.117333 96.117333 0 0 0 46.869334-25.781334L726.933333 344.842667l-90.602666-90.538667z m78.698667-78.656l-33.397334 33.386667 90.602667 90.538666 33.386667-33.376a53.333333 53.333333 0 0 0 0-75.456l-15.093334-15.093333a53.408 53.408 0 0 0-75.498666 0z\"  ></path></symbol><symbol id=\"icon-juqianshou\" viewBox=\"0 0 1024 1024\"><path d=\"M736.8 192h-96c0-70.4-57.6-128-128-128s-128 57.6-128 128h-128c-35.2 0-64 28.8-64 64v480l544-544z m-224-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 13.6-32 32-32z m350.4-2.4l45.6 45.6-76.8 75.2V896c0 35.2-28.8 64-64 64H256c-28.8 0-52.8-18.4-60.8-44.8l-40.8 40.8-45.6-45.6\"  ></path></symbol><symbol id=\"icon-chenggong\" viewBox=\"0 0 1024 1024\"><path d=\"M878.08 731.274667a32 32 0 0 1-54.88-32.938667A360.789333 360.789333 0 0 0 874.666667 512c0-200.298667-162.368-362.666667-362.666667-362.666667S149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667a360.789333 360.789333 0 0 0 186.314667-51.445334 32 32 0 0 1 32.928 54.88A424.778667 424.778667 0 0 1 512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667c0 78.293333-21.152 153.568-60.586667 219.274667zM374.581333 489.450667l84.341334 83.989333 190.432-190.72a32 32 0 0 1 45.290666 45.226667l-213.013333 213.333333a32 32 0 0 1-45.226667 0.064l-106.986666-106.549333a32 32 0 1 1 45.162666-45.344z\"  ></path></symbol><symbol id=\"icon-jijianfasong-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M926.4 560L152 147.2c-11.2-5.6-24.8 3.2-23.2 15.2l60 714.4c0.8 11.2 12 17.6 22.4 13.6l249.6-104.8 136.8 155.2c8.8 9.6 24 5.6 27.2-6.4L689.6 688l235.2-99.2c12-4.8 12.8-22.4 1.6-28.8z m-688.8 266.4l-56-544 256 456-200 88z m-80-656l488 504-48 192m88-232l-400-384 560 320-160 64z\"  ></path></symbol><symbol id=\"icon-ceshi\" viewBox=\"0 0 1024 1024\"><path d=\"M704 128a32 32 0 0 1 0 64h-21.333333v160.789333a10.666667 10.666667 0 0 0 1.088 4.693334l180.874666 369.6c28.48 58.218667 4.384 128.490667-53.813333 156.970666A117.333333 117.333333 0 0 1 759.242667 896H264.746667c-64.8 0-117.333333-52.533333-117.333334-117.333333a117.333333 117.333333 0 0 1 11.946667-51.573334l180.874667-369.621333a10.666667 10.666667 0 0 0 1.088-4.693333V192h-21.333334a32 32 0 0 1-31.946666-30.122667L288 160a32 32 0 0 1 32-32z m51.968 522.666667H268.010667l-51.157334 104.554666A53.333333 53.333333 0 0 0 264.757333 832H759.253333a53.333333 53.333333 0 0 0 47.893334-76.778667L755.978667 650.666667zM618.666667 192H405.333333v160.789333a74.666667 74.666667 0 0 1-7.594666 32.821334L299.328 586.666667h425.322667l-98.389334-201.066667A74.666667 74.666667 0 0 1 618.666667 352.8V192z\"  ></path></symbol><symbol id=\"icon-jijianfasong\" viewBox=\"0 0 1024 1024\"><path d=\"M925.6 559.2L152 145.6c-11.2-5.6-24.8 3.2-23.2 15.2l60 714.4c0.8 11.2 12 17.6 22.4 13.6L460.8 784l136.8 155.2c8.8 9.6 24 5.6 27.2-6.4l65.6-245.6 235.2-99.2c11.2-5.6 12-22.4 0-28.8z m-328 305.6l-72-128-368-568 488 504-48 192z\"  ></path></symbol><symbol id=\"icon-dianhua1\" viewBox=\"0 0 1024 1024\"><path d=\"M446.272 573.44a509.653333 509.653333 0 0 1-81.92-100.650667c67.786667-30.474667 112.138667-93.461333 112.138667-169.792C476.48 194.592 388.96 106.666667 280.906667 106.666667 170.058667 106.666667 85.333333 188.746667 85.333333 302.997333c0 158.250667 82.56 328.554667 200.618667 439.658667 100.010667 94.122667 258.986667 161.738667 413.461333 174.570667 0.832 0.074667 1.674667 0.106667 2.517334 0.106666h41.162666a30.517333 30.517333 0 0 0 0-61.045333h-39.872c-140.672-11.978667-286.026667-73.930667-375.456-158.090667-106.410667-100.16-181.408-254.837333-181.408-395.2 0-80.106667 56.981333-135.285333 134.549334-135.285333 74.282667 0 134.549333 60.533333 134.549333 135.285333 0 60.309333-40.896 107.989333-103.008 123.349334a30.517333 30.517333 0 0 0-19.786667 43.658666c27.573333 53.312 66.037333 104.426667 111.573334 147.690667 51.264 48.693333 109.941333 86.112 172.053333 108.16a30.506667 30.506667 0 0 0 40.362667-24.064c10.453333-67.093333 61.621333-114.026667 126.442666-114.026667 74.272 0 134.549333 60.544 134.549334 135.285334 0 25.578667-7.04 50.026667-20.149334 71.253333a30.528 30.528 0 0 0 51.925334 32.074667A196.096 196.096 0 0 0 938.666667 723.050667c0-108.394667-87.530667-196.330667-195.573334-196.330667-83.072 0-151.210667 52.384-177.621333 128.864-42.368-19.552-82.773333-47.541333-119.2-82.144z\"  ></path></symbol><symbol id=\"icon-qiyeyuanquwuye\" viewBox=\"0 0 1024 1024\"><path d=\"M832 896V212.8c0-8.8-7.2-16-16-16H640V80c0-8.8-7.2-16-16-16H208c-8.8 0-16 7.2-16 16v816h-64v64h768v-64h-64zM384 768h-64v-64h64v64z m0-128h-64v-64h64v64z m0-128h-64v-64h64v64z m0-128h-64v-64h64v64z m0-128h-64v-64h64v64z m128 512h-64v-64h64v64z m0-128h-64v-64h64v64z m0-128h-64v-64h64v64z m0-128h-64v-64h64v64z m0-128h-64v-64h64v64z m192 512h-64v-64h64v64z m0-128h-64v-64h64v64z m0-128h-64v-64h64v64z m0-128h-64v-64h64v64z\"  ></path></symbol><symbol id=\"icon-dianzan\" viewBox=\"0 0 1024 1024\"><path d=\"M621.674667 408.021333c16.618667-74.24 28.224-127.936 34.837333-161.194666C673.152 163.093333 629.941333 85.333333 544.298667 85.333333c-77.226667 0-116.010667 38.378667-138.88 115.093334l-0.586667 2.24c-13.728 62.058667-34.72 110.165333-62.506667 144.586666a158.261333 158.261333 0 0 1-119.733333 58.965334l-21.909333 0.469333C148.437333 407.808 106.666667 450.816 106.666667 503.498667V821.333333c0 64.8 52.106667 117.333333 116.394666 117.333334h412.522667c84.736 0 160.373333-53.568 189.12-133.92l85.696-239.584c21.802667-60.96-9.536-128.202667-70.005333-150.186667a115.552 115.552 0 0 0-39.488-6.954667H621.674667zM544.256 149.333333c39.253333 0 59.498667 36.48 49.888 84.928-7.573333 38.144-21.984 104.426667-43.221333 198.666667-4.512 20.021333 10.56 39.093333 30.912 39.093333h218.666666c6.101333 0 12.16 1.066667 17.909334 3.168 27.445333 9.984 41.674667 40.554667 31.776 68.266667l-85.568 239.573333C744.981333 838.026667 693.301333 874.666667 635.402667 874.666667H223.498667C194.314667 874.666667 170.666667 850.784 170.666667 821.333333V503.498667c0-17.866667 14.144-32.448 31.829333-32.821334l21.866667-0.469333a221.12 221.12 0 0 0 167.381333-82.56c34.346667-42.602667 59.146667-99.306667 74.869333-169.877333C482.101333 166.336 499.552 149.333333 544.266667 149.333333z\"  ></path></symbol><symbol id=\"icon-qiyeyuanquwuye-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M832 896V212.8c0-8.8-7.2-16-16-16H640V80c0-8.8-7.2-16-16-16H208c-8.8 0-16 7.2-16 16v816h-64v64h768v-64h-64z m-64-635.2V864H640V768h64v-64h-64v-64h64v-64h-64v-64h64v-64h-64v-64h64v-64h-64v-59.2h128zM256 128h320v736H256V128z m64 64h64v64h-64v-64z m128 0h64v64h-64v-64zM320 320h64v64h-64v-64z m128 0h64v64h-64v-64zM320 448h64v64h-64v-64z m128 0h64v64h-64v-64zM320 576h64v64h-64v-64z m128 0h64v64h-64v-64zM320 704h64v64h-64v-64z m128 0h64v64h-64v-64z\"  ></path></symbol><symbol id=\"icon-dingwei1\" viewBox=\"0 0 1024 1024\"><path d=\"M648.256 850.272a32 32 0 1 1-40.704-49.386667C758.304 676.693333 832 566.037333 832 471.072 832 293.344 688.693333 149.333333 512 149.333333c-176.693333 0-320 144.010667-320 321.738667 0 115.232 108.416 253.045333 329.173333 409.493333a32 32 0 0 1-37.013333 52.213334C248.021333 765.429333 128 612.853333 128 471.072 128 258.069333 299.882667 85.333333 512 85.333333s384 172.736 384 385.738667c0 118.378667-83.701333 244.053333-247.744 379.2zM512 618.666667c-82.474667 0-149.333333-66.858667-149.333333-149.333334s66.858667-149.333333 149.333333-149.333333 149.333333 66.858667 149.333333 149.333333-66.858667 149.333333-149.333333 149.333334z m0-64a85.333333 85.333333 0 1 0 0-170.666667 85.333333 85.333333 0 0 0 0 170.666667z\"  ></path></symbol><symbol id=\"icon-jiesuan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M832 192v640H192V192h640m32-64H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM768 384H256v64h512v-64z m0 192H256v64h512v-64z\"  ></path></symbol><symbol id=\"icon-diantong_guan\" viewBox=\"0 0 1024 1024\"><path d=\"M352 633.386667l-123.264-105.653334A74.666667 74.666667 0 0 1 202.666667 471.04V320a74.666667 74.666667 0 0 1 74.666666-74.666667h469.333334a74.666667 74.666667 0 0 1 74.666666 74.666667v151.04a74.666667 74.666667 0 0 1-26.069333 56.693333L672 633.386667V896a74.666667 74.666667 0 0 1-74.666667 74.666667H426.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V633.386667zM277.333333 309.333333a10.666667 10.666667 0 0 0-10.666666 10.666667v151.04a10.666667 10.666667 0 0 0 3.733333 8.106667l126.976 108.842666A53.333333 53.333333 0 0 1 416 628.48V896a10.666667 10.666667 0 0 0 10.666667 10.666667h170.666666a10.666667 10.666667 0 0 0 10.666667-10.666667V628.48a53.333333 53.333333 0 0 1 18.624-40.490667L753.610667 479.146667a10.666667 10.666667 0 0 0 3.722666-8.106667V320a10.666667 10.666667 0 0 0-10.666666-10.666667H277.333333z m202.666667 320a32 32 0 0 1 64 0v85.333334a32 32 0 0 1-64 0v-85.333334z\"  ></path></symbol><symbol id=\"icon-jiesuan\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM768 640H256v-64h512v64z m0-192H256v-64h512v64z\"  ></path></symbol><symbol id=\"icon-dianying\" viewBox=\"0 0 1024 1024\"><path d=\"M844.832 885.344c-30.485333-20.714667-77.781333-18.965333-144.053333 9.386667A425.024 425.024 0 0 1 512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667a425.013333 425.013333 0 0 1-44.405334 189.717333 32 32 0 0 1-57.301333-28.490666A361.013333 361.013333 0 0 0 874.666667 512c0-200.298667-162.368-362.666667-362.666667-362.666667S149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667c56.704 0 111.488-13.013333 161.12-37.653334l1.6-0.746666c84.746667-36.437333 154.176-39.125333 206.08-3.861334a32 32 0 1 1-35.968 52.938667zM512 416a64 64 0 1 1 0-128 64 64 0 0 1 0 128z m160 160a64 64 0 1 1 0-128 64 64 0 0 1 0 128zM512 736a64 64 0 1 1 0-128 64 64 0 0 1 0 128zM352 576a64 64 0 1 1 0-128 64 64 0 0 1 0 128z\"  ></path></symbol><symbol id=\"icon-jifen1\" viewBox=\"0 0 1024 1024\"><path d=\"M179.2 182.4c-34.4 16.8-51.2 35.2-51.2 55.2v55.2c0 20 16.8 38.4 51.2 55.2 34.4 16.8 80.8 30.4 140 40 59.2 9.6 123.2 14.4 192.8 14.4s133.6-4.8 192.8-14.4c59.2-9.6 105.6-23.2 140-40 34.4-16.8 51.2-35.2 51.2-55.2v-55.2c0-20-16.8-38.4-51.2-55.2-34.4-16.8-80.8-30.4-140-40C645.6 132.8 581.6 128 512 128s-133.6 4.8-192.8 14.4c-58.4 10.4-105.6 23.2-140 40M128 552v69.6c0 20 16.8 38.4 51.2 55.2s80.8 30.4 140 40c59.2 9.6 123.2 14.4 192.8 14.4s133.6-4.8 192.8-14.4c59.2-9.6 105.6-23.2 140-40 34.4-16.8 51.2-35.2 51.2-55.2v-72.8c-40 24-93.6 42.4-162.4 54.4-68.8 12.8-142.4 18.4-221.6 18.4s-152.8-5.6-221.6-18.4C221.6 591.2 168 572.8 128 548.8M128 712v74.4c0 20 16.8 38.4 51.2 55.2s80.8 30.4 140 40c59.2 9.6 123.2 14.4 192.8 14.4s133.6-4.8 192.8-14.4c59.2-9.6 105.6-23.2 140-40 34.4-16.8 51.2-35.2 51.2-55.2v-72.8c-40 24-93.6 42.4-162.4 54.4-68.8 12-142.4 18.4-221.6 18.4s-152.8-6.4-221.6-18.4C221.6 756 168 737.6 128 713.6M128 384v72.8c0 20 16.8 38.4 51.2 55.2s80.8 30.4 140 40c59.2 9.6 123.2 14.4 192.8 14.4s133.6-4.8 192.8-14.4c59.2-9.6 105.6-23.2 140-40 34.4-16.8 51.2-35.2 51.2-55.2V384c-40 24-93.6 42.4-162.4 54.4-68.8 12-142.4 18.4-221.6 18.4s-152.8-6.4-221.6-18.4C221.6 426.4 168 408 128 384\"  ></path></symbol><symbol id=\"icon-ditu1\" viewBox=\"0 0 1024 1024\"><path d=\"M85.333333 469.717333C85.333333 451.829333 99.658667 437.333333 117.333333 437.333333s32 14.506667 32 32.384V786.133333c0 5.962667 4.778667 10.794667 10.666667 10.794667a10.56 10.56 0 0 0 5.045333-1.28l154.848-84.021333a73.898667 73.898667 0 0 1 72.853334 1.290666l252.544 148.842667a10.56 10.56 0 0 0 10.122666 0.341333l213.333334-107.264c3.626667-1.824 5.92-5.568 5.92-9.664V469.717333C874.666667 451.829333 888.992 437.333333 906.666667 437.333333s32 14.506667 32 32.384V745.173333c0 28.682667-16.053333 54.890667-41.44 67.658667l-213.333334 107.264a73.898667 73.898667 0 0 1-70.805333-2.378667L360.533333 768.896a10.56 10.56 0 0 0-10.410666-0.192l-154.848 84.032a73.973333 73.973333 0 0 1-35.285334 8.96c-41.237333 0-74.666667-33.813333-74.666666-75.552V469.717333z m672-132.266666c0 87.808-73.173333 192.917333-217.056 320.288a42.666667 42.666667 0 0 1-56.554666 0C339.829333 530.378667 266.666667 425.258667 266.666667 337.450667 266.666667 203.968 376.64 96 512 96s245.333333 107.968 245.333333 241.450667z m-426.666666 0c0 61.514667 59.712 149.557333 181.333333 259.701333 121.621333-110.144 181.333333-198.186667 181.333333-259.701333C693.333333 239.584 612.277333 160 512 160s-181.333333 79.573333-181.333333 177.450667zM512 405.333333a64 64 0 1 1 0-128 64 64 0 0 1 0 128z\"  ></path></symbol><symbol id=\"icon-jifen-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M844.8 182.4c-34.4-16.8-80.8-30.4-140-40C645.6 132.8 581.6 128 512 128c-69.6 0-133.6 4.8-192.8 14.4-59.2 9.6-105.6 23.2-140 40-34.4 16.8-51.2 35.2-51.2 55.2v103.2c0 20 16.8 38.4 51.2 55.2 34.4 16.8 80.8 30.4 140 40 59.2 9.6 123.2 14.4 192.8 14.4 69.6 0 133.6-4.8 192.8-14.4 59.2-9.6 105.6-23.2 140-40 34.4-16.8 51.2-35.2 51.2-55.2V237.6c0-20-16.8-38.4-51.2-55.2zM832 328.8c-3.2 2.4-8 5.6-16 8.8-28.8 14.4-69.6 25.6-122.4 34.4-55.2 9.6-116.8 13.6-181.6 13.6-65.6 0-126.4-4.8-181.6-13.6-52.8-8.8-94.4-20-122.4-34.4-8-4-12.8-7.2-16-8.8v-80c3.2-2.4 8-5.6 16-8.8 28.8-14.4 69.6-25.6 122.4-34.4C385.6 196 447.2 192 512 192c65.6 0 126.4 4.8 181.6 13.6 52.8 8.8 93.6 20.8 122.4 34.4 8 4 12.8 7.2 16 8.8v80zM128 760v26.4c0 20 16.8 38.4 51.2 55.2s80.8 30.4 140 40c59.2 9.6 123.2 14.4 192.8 14.4s133.6-4.8 192.8-14.4c59.2-9.6 105.6-23.2 140-40 34.4-16.8 51.2-35.2 51.2-55.2v-32.8c-40 24-93.6 42.4-162.4 54.4-68.8 12-142.4 18.4-221.6 18.4s-152.8-6.4-221.6-18.4C221.6 795.2 168 777.6 128 753.6M128 608v29.6c0 20 16.8 38.4 51.2 55.2 34.4 16.8 80.8 30.4 140 40 59.2 9.6 123.2 14.4 192.8 14.4s133.6-4.8 192.8-14.4c59.2-9.6 105.6-23.2 140-40 34.4-16.8 51.2-35.2 51.2-55.2v-32.8c-40 24-93.6 42.4-162.4 54.4-68.8 12-142.4 18.4-221.6 18.4s-152.8-6.4-221.6-18.4C221.6 646.4 168 628.8 128 604.8M128 456v29.6c0 20 16.8 38.4 51.2 55.2 34.4 16.8 80.8 30.4 140 40 59.2 9.6 123.2 14.4 192.8 14.4s133.6-4.8 192.8-14.4c59.2-9.6 105.6-23.2 140-40 34.4-16.8 51.2-35.2 51.2-55.2v-32.8c-40 24-93.6 42.4-162.4 54.4-68.8 12-142.4 18.4-221.6 18.4s-152.8-6.4-221.6-18.4C221.6 494.4 168 476.8 128 452.8\"  ></path></symbol><symbol id=\"icon-diantong_kai\" viewBox=\"0 0 1024 1024\"><path d=\"M352 633.386667l-123.264-105.653334A74.666667 74.666667 0 0 1 202.666667 471.04V320a74.666667 74.666667 0 0 1 74.666666-74.666667h469.333334a74.666667 74.666667 0 0 1 74.666666 74.666667v151.04a74.666667 74.666667 0 0 1-26.069333 56.693333L672 633.386667V896a74.666667 74.666667 0 0 1-74.666667 74.666667H426.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V633.386667zM277.333333 309.333333a10.666667 10.666667 0 0 0-10.666666 10.666667v151.04a10.666667 10.666667 0 0 0 3.733333 8.106667l126.976 108.842666A53.333333 53.333333 0 0 1 416 628.48V896a10.666667 10.666667 0 0 0 10.666667 10.666667h170.666666a10.666667 10.666667 0 0 0 10.666667-10.666667V628.48a53.333333 53.333333 0 0 1 18.624-40.490667L753.610667 479.146667a10.666667 10.666667 0 0 0 3.722666-8.106667V320a10.666667 10.666667 0 0 0-10.666666-10.666667H277.333333z m202.666667 320a32 32 0 0 1 64 0v85.333334a32 32 0 0 1-64 0v-85.333334z m0-544a32 32 0 0 1 64 0v85.333334a32 32 0 0 1-64 0V85.333333z m260.288 11.050667a32 32 0 1 1 55.424 32l-42.666667 73.898667a32 32 0 1 1-55.424-32l42.666667-73.898667z m-456.576 0l42.666667 73.898667a32 32 0 1 1-55.424 32l-42.666667-73.898667a32 32 0 0 1 55.424-32z\"  ></path></symbol><symbol id=\"icon-youhuijuan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M896 256v113.6c-40 36-64 88-64 143.2 0 55.2 24 107.2 64 143.2v112H128V655.2c40-36 64-88 64-143.2 0-55.2-24-107.2-64-143.2V256h768m32-64H96c-17.6 0-32 14.4-32 32v178.4c38.4 22.4 64 63.2 64 110.4s-25.6 88.8-64 110.4V800c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V623.2c-38.4-22.4-64-63.2-64-110.4s25.6-88.8 64-110.4V224c0-17.6-14.4-32-32-32zM640 448v64H544v64h96v64H544v96h-64V640H384v-64h96v-64H384v-64h95.2L371.2 340.8l45.6-45.6 96 96L608 296l45.6 45.6L547.2 448H640z\"  ></path></symbol><symbol id=\"icon-dianyingpiao\" viewBox=\"0 0 1024 1024\"><path d=\"M640 394.666667a32 32 0 0 1 0 64H384a32 32 0 0 1 0-64h256z m0 170.666666a32 32 0 0 1 0 64H384a32 32 0 0 1 0-64h256zM117.333333 437.333333a32 32 0 0 1-32-32V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v149.333333a32 32 0 0 1-32 32 74.666667 74.666667 0 0 0 0 149.333334 32 32 0 0 1 32 32v149.333333c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V618.666667a32 32 0 0 1 32-32 74.666667 74.666667 0 0 0 0-149.333334z m138.666667 74.666667c0 65.568-45.514667 120.512-106.666667 134.954667V768a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V646.954667C813.514667 632.512 768 577.568 768 512c0-65.568 45.514667-120.512 106.666667-134.954667V256a53.333333 53.333333 0 0 0-53.333334-53.333333H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v121.045333C210.485333 391.488 256 446.432 256 512z\"  ></path></symbol><symbol id=\"icon-ziliaoshouce\" viewBox=\"0 0 1024 1024\"><path d=\"M896 192v704H256.8c-71.2 0-128.8-57.6-128.8-128.8V256.8C128 185.6 185.6 128 256.8 128H768v512H257.6c-36 0-65.6 29.6-65.6 65.6v60.8c0 36 29.6 65.6 65.6 65.6H832V192h64zM768 704H256v64h512v-64z\"  ></path></symbol><symbol id=\"icon-dingdan\" viewBox=\"0 0 1024 1024\"><path d=\"M821.333333 256a32 32 0 0 1 64 0v565.333333c0 64.8-52.533333 117.333333-117.333333 117.333334H256c-64.8 0-117.333333-52.533333-117.333333-117.333334V202.666667c0-64.8 52.533333-117.333333 117.333333-117.333334h597.333333a32 32 0 0 1 0 64H256a53.333333 53.333333 0 0 0-53.333333 53.333334v618.666666a53.333333 53.333333 0 0 0 53.333333 53.333334h512a53.333333 53.333333 0 0 0 53.333333-53.333334V256zM341.333333 437.333333a32 32 0 0 1 0-64h341.333334a32 32 0 0 1 0 64H341.333333z m0 170.666667a32 32 0 0 1 0-64h213.333334a32 32 0 0 1 0 64H341.333333z\"  ></path></symbol><symbol id=\"icon-ziliaoshouce-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M704 192v384H257.6c-24 0-46.4 6.4-65.6 17.6V256.8c0-36 28.8-64.8 64.8-64.8H704m64-64H256.8C185.6 128 128 185.6 128 256.8v510.4c0 71.2 57.6 128.8 128.8 128.8H896V192h-64v640H257.6c-36 0-65.6-29.6-65.6-65.6v-60.8c0-36 29.6-65.6 65.6-65.6H768V128z m0 576H256v64h512v-64z\"  ></path></symbol><symbol id=\"icon-gengduo\" viewBox=\"0 0 1024 1024\"><path d=\"M298.666667 586.666667a74.666667 74.666667 0 1 1 0-149.333334 74.666667 74.666667 0 0 1 0 149.333334z m213.333333 0a74.666667 74.666667 0 1 1 0-149.333334 74.666667 74.666667 0 0 1 0 149.333334z m213.333333 0a74.666667 74.666667 0 1 1 0-149.333334 74.666667 74.666667 0 0 1 0 149.333334z\"  ></path></symbol><symbol id=\"icon-youhuijuan\" viewBox=\"0 0 1024 1024\"><path d=\"M960 401.6V224c0-17.6-14.4-32-32-32H96c-17.6 0-32 14.4-32 32v178.4c38.4 22.4 64 63.2 64 110.4s-25.6 88.8-64 110.4V800c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V623.2c-38.4-22.4-64-63.2-64-110.4s25.6-88.8 64-111.2z m-320 47.2v64H544v64h96v64H544v96h-64v-96H384v-64h96v-64H384v-64h95.2L371.2 341.6l45.6-45.6 96 96L608 296.8l45.6 45.6-106.4 106.4H640z\"  ></path></symbol><symbol id=\"icon-fanbei\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 64c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667 362.666667-162.368 362.666667-362.666667-162.368-362.666667-362.666667-362.666667z m117.333333 202.666667c58.912 0 106.666667 47.754667 106.666667 106.666667a98.581333 98.581333 0 0 1-37.002667 76.981333L635.221333 586.666667H714.666667a32 32 0 0 1 0 64H544c-30.250667 0-43.605333-38.090667-19.989333-56.992l135.008-108.010667A34.581333 34.581333 0 0 0 672 458.666667a42.666667 42.666667 0 1 0-85.333333 0 32 32 0 0 1-64 0c0-58.912 47.754667-106.666667 106.666666-106.666667zM286.709333 468.042667a32 32 0 0 1 45.248 0L373.333333 509.408l41.376-41.365333a32 32 0 0 1 43.712-1.44l1.536 1.44a32 32 0 0 1 0 45.248L418.592 554.666667l41.365333 41.376a32 32 0 0 1 1.44 43.712l-1.44 1.536a32 32 0 0 1-45.248 0L373.333333 599.925333l-41.376 41.365334a32 32 0 0 1-43.712 1.44l-1.536-1.44a32 32 0 0 1 0-45.248L328.074667 554.666667l-41.365334-41.376a32 32 0 0 1-1.44-43.712z\"  ></path></symbol><symbol id=\"icon-guize\" viewBox=\"0 0 1024 1024\"><path d=\"M896 192v64H384v-64h512zM224 320c52.8 0 96-43.2 96-96s-43.2-96-96-96-96 43.2-96 96 43.2 96 96 96z m128 160H128v64h224v-64z m320 64h224v-64H672v64z m-64-32c0-52.8-43.2-96-96-96s-96 43.2-96 96 43.2 96 96 96 96-43.2 96-96z m-480 320h512v-64H128v64z m672-128c-52.8 0-96 43.2-96 96s43.2 96 96 96 96-43.2 96-96-43.2-96-96-96z\"  ></path></symbol><symbol id=\"icon-faxian\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 64c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667 362.666667-162.368 362.666667-362.666667-162.368-362.666667-362.666667-362.666667z m149.162667 158.901334a42.666667 42.666667 0 0 1 54.602666 54.602666L637.642667 579.84a96 96 0 0 1-57.813334 57.802667l-216.992 78.122666a42.666667 42.666667 0 0 1-54.602666-54.602666l78.122666-217.002667a96 96 0 0 1 57.813334-57.802667z m-20.970667 75.573333l-174.346667 62.762667a32 32 0 0 0-19.274666 19.274666l-62.762667 174.346667 174.346667-62.762667a32 32 0 0 0 19.274666-19.274666l62.762667-174.346667z\"  ></path></symbol><symbol id=\"icon-danju-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M800 192H640c0-70.4-57.6-128-128-128s-128 57.6-128 128H224c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-288-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m256 736H256V256h64v64h384v-64h64v640z m-64-384H320v-64h384v64z m0 128H320v-64h384v64zM576 768H320v-64h256v64z\"  ></path></symbol><symbol id=\"icon-ertongpiao\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c162.666667 0 305.568 102.058667 360.458667 251.328A138.741333 138.741333 0 0 1 970.666667 512a138.741333 138.741333 0 0 1-98.208 132.672C817.568 793.941333 674.677333 896 512 896c-162.666667 0-305.568-102.058667-360.458667-251.328A138.741333 138.741333 0 0 1 53.333333 512a138.741333 138.741333 0 0 1 98.208-132.672C206.432 230.058667 349.322667 128 512 128z m0 64c-140.832 0-263.893333 91.808-305.386667 224.096a32 32 0 0 1-25.802666 22.069333 74.688 74.688 0 0 0 0 147.669334 32 32 0 0 1 25.802666 22.08C248.106667 740.181333 371.168 832 512 832s263.893333-91.808 305.386667-224.096a32 32 0 0 1 25.802666-22.069333 74.688 74.688 0 0 0 0-147.669334 32 32 0 0 1-25.802666-22.08 319.808 319.808 0 0 0-128.714667-170.922666c-16.704 69.589333-77.621333 99.477333-170.88 85.130666a32 32 0 0 1 9.738667-63.253333c69.216 10.645333 97.728-4.981333 101.386666-52.949333A319.221333 319.221333 0 0 0 512 192zM364.714667 639.253333a32 32 0 0 1 45.066666-4.16A159.189333 159.189333 0 0 0 512 672c37.888 0 73.674667-13.173333 102.186667-36.885333a32 32 0 0 1 40.917333 49.216A223.178667 223.178667 0 0 1 512 736a223.178667 223.178667 0 0 1-143.136-51.690667 32 32 0 0 1-4.149333-45.066666zM384 405.333333a42.666667 42.666667 0 0 1 42.666667 42.666667v42.666667a42.666667 42.666667 0 1 1-85.333334 0v-42.666667a42.666667 42.666667 0 0 1 42.666667-42.666667z m256 0a42.666667 42.666667 0 0 1 42.666667 42.666667v42.666667a42.666667 42.666667 0 1 1-85.333334 0v-42.666667a42.666667 42.666667 0 0 1 42.666667-42.666667z\"  ></path></symbol><symbol id=\"icon-zuzhijiagoujiekou\" viewBox=\"0 0 1024 1024\"><path d=\"M256 640h-64V448h288V320h64v128h288v192h-64V512H544v128h-64V512H256v128z m256-384c52.8 0 96-43.2 96-96S564.8 64 512 64s-96 43.2-96 96 43.2 96 96 96z m0 448c-52.8 0-96 43.2-96 96s43.2 96 96 96 96-43.2 96-96-43.2-96-96-96z m-288 0c-52.8 0-96 43.2-96 96s43.2 96 96 96 96-43.2 96-96-43.2-96-96-96z m576 0c-52.8 0-96 43.2-96 96s43.2 96 96 96 96-43.2 96-96-43.2-96-96-96z\"  ></path></symbol><symbol id=\"icon-gongyi\" viewBox=\"0 0 1024 1024\"><path d=\"M366.624 117.333333c119.594667 0 216.565333 97.002667 217.290667 216.853334a287.477333 287.477333 0 0 1 26.528-1.216C768.181333 332.970667 896 461.44 896 619.818667 896 778.208 768.181333 906.666667 610.442667 906.666667h-78.026667a32 32 0 0 1 0-64h78.026667C732.768 842.666667 832 742.933333 832 619.818667s-99.232-222.848-221.557333-222.848c-18.528 0-36.736 2.282667-54.336 6.741333-22.826667 5.792-43.882667-14.24-39.232-37.333333 2.026667-10.048 3.050667-20.352 3.050666-30.816C519.925333 250.346667 451.253333 181.333333 366.613333 181.333333 282.005333 181.333333 213.333333 250.346667 213.333333 335.573333v186.229334a32 32 0 1 1-64 0v-186.24C149.333333 215.072 246.581333 117.333333 366.624 117.333333zM180.992 640A32 32 0 0 1 213.333333 671.658667L215.136 842.666667H384a32 32 0 0 1 0 64H183.466667a32 32 0 0 1-32-31.658667l-2.133334-202.666667A32 32 0 0 1 180.992 640z\"  ></path></symbol><symbol id=\"icon-danju\" viewBox=\"0 0 1024 1024\"><path d=\"M800 192H640c0-70.4-57.6-128-128-128s-128 57.6-128 128H224c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-288-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m64 608H320v-64h256v64z m128-128H320v-64h384v64z m0-128H320v-64h384v64z\"  ></path></symbol><symbol id=\"icon-hongbao1\" viewBox=\"0 0 1024 1024\"><path d=\"M380.48 563.925333C398.901333 508.949333 450.826667 469.333333 512 469.333333s113.098667 39.616 131.52 94.592A709.162667 709.162667 0 0 0 821.333333 505.781333V202.666667a53.333333 53.333333 0 0 0-53.333333-53.333334H256a53.333333 53.333333 0 0 0-53.333333 53.333334v303.114666a709.152 709.152 0 0 0 177.813333 58.144z m268.768 64.010667C639.573333 695.072 581.813333 746.666667 512 746.666667c-69.813333 0-127.573333-51.594667-137.248-118.72A773.109333 773.109333 0 0 1 202.666667 576.117333V821.333333a53.333333 53.333333 0 0 0 53.333333 53.333334h512a53.333333 53.333333 0 0 0 53.333333-53.333334V576.128a773.12 773.12 0 0 1-172.085333 51.808zM256 85.333333h512c64.8 0 117.333333 52.533333 117.333333 117.333334v618.666666c0 64.8-52.533333 117.333333-117.333333 117.333334H256c-64.8 0-117.333333-52.533333-117.333333-117.333334V202.666667c0-64.8 52.533333-117.333333 117.333333-117.333334z m256 597.333334a74.666667 74.666667 0 1 0 0-149.333334 74.666667 74.666667 0 0 0 0 149.333334z\"  ></path></symbol><symbol id=\"icon-chuangjiandanju-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M768 192H640c0-70.4-57.6-128-128-128s-128 57.6-128 128H256c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m-256-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m256 736H256V256h64v64h384v-64h64v640zM672 640H544v128h-64V640H352v-64h128V448h64v128h128v64z\"  ></path></symbol><symbol id=\"icon-fuzhi\" viewBox=\"0 0 1024 1024\"><path d=\"M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z\"  ></path></symbol><symbol id=\"icon-chuangjiandanju\" viewBox=\"0 0 1024 1024\"><path d=\"M768 192H640c0-70.4-57.6-128-128-128s-128 57.6-128 128H256c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m-256-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m160 480H544v128h-64V640H352v-64h128V448h64v128h128v64z\"  ></path></symbol><symbol id=\"icon-fenxiang\" viewBox=\"0 0 1024 1024\"><path d=\"M853.333333 533.333333a32 32 0 0 1 64 0v266.666667c0 64.8-52.533333 117.333333-117.333333 117.333333H224c-64.8 0-117.333333-52.533333-117.333333-117.333333V256c0-64.8 52.533333-117.333333 117.333333-117.333333h277.333333a32 32 0 0 1 0 64H224a53.333333 53.333333 0 0 0-53.333333 53.333333v544a53.333333 53.333333 0 0 0 53.333333 53.333333h576a53.333333 53.333333 0 0 0 53.333333-53.333333V533.333333z m-42.058666-277.333333l-89.792-95.402667a32 32 0 0 1 46.613333-43.861333l140.544 149.333333C927.861333 286.485333 913.376 320 885.333333 320H724.704C643.029333 320 576 391.210667 576 480v192a32 32 0 1 1-64 0V480c0-123.296 94.784-224 212.704-224h86.570667z\"  ></path></symbol><symbol id=\"icon-zhangdan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M800 192H640c0-70.4-57.6-128-128-128s-128 56.8-128 128H224c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-288-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m256 736H256V256h64v64h384v-64h64v640zM589.6 512H672v64H544v64h128v64H544v128h-64V704H352v-64h128v-64H352v-64h82.4L352 429.6l45.6-45.6L512 498.4 626.4 384l45.6 45.6L589.6 512z\"  ></path></symbol><symbol id=\"icon-huatifuhao\" viewBox=\"0 0 1024 1024\"><path d=\"M651.424 217.066667a32 32 0 0 1 62.485333 13.866666L682.261333 373.333333H800a32 32 0 0 1 31.946667 30.122667L832 405.333333a32 32 0 0 1-32 32H668.032l-33.184 149.333334H800a32 32 0 0 1 31.946667 30.122666L832 618.666667a32 32 0 0 1-32 32H620.629333l-34.72 156.266666a32 32 0 0 1-36.341333 24.661334l-1.845333-0.352a32 32 0 0 1-24.298667-38.186667L555.061333 650.666667H407.296l-34.72 156.288a32 32 0 0 1-36.341333 24.64l-1.845334-0.341334a32 32 0 0 1-24.298666-38.186666L341.728 650.666667 224 650.666667a32 32 0 0 1-31.946667-30.122667L192 618.666667a32 32 0 0 1 32-32h131.957333l33.184-149.333334H224a32 32 0 0 1-31.946667-30.122666L192 405.333333a32 32 0 0 1 32-32h179.36l34.730667-156.266666a32 32 0 0 1 36.341333-24.661334l1.845333 0.352a32 32 0 0 1 24.298667 38.186667l-31.648 142.378667h147.765333zM602.474667 437.333333H454.698667l-33.184 149.333334h147.776l33.184-149.333334z\"  ></path></symbol><symbol id=\"icon-zhangdan\" viewBox=\"0 0 1024 1024\"><path d=\"M800 192H640c0-70.4-57.6-128-128-128s-128 56.8-128 128H224c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-288-32c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m160 416H544v64h128v64H544v128h-64V704H352v-64h128v-64H352v-64h82.4L352 429.6l45.6-45.6L512 498.4 626.4 384l45.6 45.6L589.6 512H672v64z\"  ></path></symbol><symbol id=\"icon-huiyuan\" viewBox=\"0 0 1024 1024\"><path d=\"M311.114667 371.242667L471.146667 169.098667a52.106667 52.106667 0 0 1 81.706666 0l160.032 202.144 153.152-65.632a52.106667 52.106667 0 0 1 71.541334 58.474666l-89.44 430.933334a112.416 112.416 0 0 1-110.08 89.568H285.941333a112.416 112.416 0 0 1-110.08-89.568l-89.429333-430.933334a52.106667 52.106667 0 0 1 71.541333-58.474666l153.152 65.632zM512 220.608L355.648 418.101333a52.106667 52.106667 0 0 1-61.376 15.552l-140.544-60.234666 84.8 408.586666a48.416 48.416 0 0 0 47.402667 38.581334h452.138666a48.416 48.416 0 0 0 47.402667-38.581334l84.8-408.586666-140.544 60.234666a52.106667 52.106667 0 0 1-61.376-15.552L512 220.608z\"  ></path></symbol><symbol id=\"icon-tijikongjian\" viewBox=\"0 0 1024 1024\"><path d=\"M496 895.2L138.4 771.2c-6.4-2.4-10.4-8-10.4-15.2V287.2l368 112v496z m32 0l357.6-124c6.4-2.4 10.4-8 10.4-15.2V287.2l-368 112v496z m-400-640l384 112 384-112-379.2-125.6c-3.2-0.8-7.2-0.8-10.4 0L128 255.2z\"  ></path></symbol><symbol id=\"icon-aliyu\" viewBox=\"0 0 1024 1024\"><path d=\"M340.554667 202.666667c124.309333 0 251.584 86.048 383.626666 254.890666C766.784 402.336 812.373333 373.333333 861.866667 373.333333 934.357333 373.333333 992 435.989333 992 512s-57.642667 138.666667-130.133333 138.666667c-49.493333 0-95.082667-29.013333-137.685334-84.224C592.128 735.296 464.874667 821.333333 340.554667 821.333333 170.133333 821.333333 32 682.816 32 512s138.133333-309.333333 308.554667-309.333333z m0 64C205.514667 266.666667 96 376.490667 96 512s109.514667 245.333333 244.554667 245.333333c103.84 0 219.434667-80.597333 344.8-245.333333C560 347.264 444.394667 266.666667 340.554667 266.666667z m44.288 263.413333a32 32 0 1 1 40.981333 49.173333L391.317333 608l34.506667 28.746667a32 32 0 1 1-40.981333 49.173333l-64-53.333333a32 32 0 0 1 0-49.173334z m-138.666667-96a32 32 0 1 1 40.981333 49.173333L252.650667 512l34.506666 28.746667a32 32 0 1 1-40.981333 49.173333l-64-53.333333a32 32 0 0 1 0-49.173334zM861.866667 437.333333c-29.610667 0-62.528 23.36-97.525334 73.653334l0.746667 1.013333-0.746667 1.013333C799.338667 563.296 832.256 586.666667 861.866667 586.666667c35.904 0 66.133333-32.853333 66.133333-74.666667s-30.229333-74.666667-66.133333-74.666667z m-477.013334-99.253333a32 32 0 1 1 40.96 49.173333L391.328 416l34.506667 28.746667a32 32 0 1 1-40.981334 49.173333l-64-53.333333a32 32 0 0 1 0-49.173334z\"  ></path></symbol><symbol id=\"icon-tijikongjian-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M884.8 252.8L517.6 130.4c-1.6-0.8-3.2-0.8-4.8-0.8-1.6 0-3.2 0-4.8 0.8L139.2 254.4c-6.4 2.4-11.2 8-11.2 15.2v486.4c0 7.2 4.8 12.8 11.2 15.2l368.8 122.4c1.6 0.8 3.2 0.8 4.8 0.8 1.6 0 3.2 0 4.8-0.8l367.2-122.4c6.4-2.4 11.2-8 11.2-15.2v-488c0-7.2-4.8-12.8-11.2-15.2z m-372-56.8l269.6 89.6L512 384 244 286.4l268.8-90.4zM192 304l3.2-0.8L496 412v410.4L192 721.6V304z m640 417.6l-304 101.6V412l303.2-109.6h0.8v419.2z\"  ></path></symbol><symbol id=\"icon-jiju\" viewBox=\"0 0 1024 1024\"><path d=\"M768 85.333333c64.8 0 117.333333 52.533333 117.333333 117.333334v618.666666c0 64.8-52.533333 117.333333-117.333333 117.333334H256c-64.8 0-117.333333-52.533333-117.333333-117.333334V202.666667c0-64.8 52.533333-117.333333 117.333333-117.333334h512z m0 64H256a53.333333 53.333333 0 0 0-53.333333 53.333334v618.666666a53.333333 53.333333 0 0 0 53.333333 53.333334h512a53.333333 53.333333 0 0 0 53.333333-53.333334V202.666667a53.333333 53.333333 0 0 0-53.333333-53.333334zM608 725.333333a32 32 0 0 1 0 64H416a32 32 0 0 1 0-64z m74.666667-512a74.666667 74.666667 0 0 1 74.666666 74.666667v277.333333a74.666667 74.666667 0 0 1-74.666666 74.666667H341.333333a74.666667 74.666667 0 0 1-74.666666-74.666667V288a74.666667 74.666667 0 0 1 74.666666-74.666667h341.333334z m0 64H341.333333a10.666667 10.666667 0 0 0-10.666666 10.666667v277.333333a10.666667 10.666667 0 0 0 10.666666 10.666667h341.333334a10.666667 10.666667 0 0 0 10.666666-10.666667V288a10.666667 10.666667 0 0 0-10.666666-10.666667z\"  ></path></symbol><symbol id=\"icon-yewu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M607.2 128H416.8c-17.6 0-32.8 14.4-32.8 32.8V256H160c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V288c0-17.6-14.4-32-32-32H640V160.8c0-18.4-14.4-32.8-32.8-32.8zM448 256v-64h128v64H448z m64 256l-320-53.6V320h640v138.4L512 512z m0 32l320-53.6V832H192V490.4L512 544z m48-160H464c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h96c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16z\"  ></path></symbol><symbol id=\"icon-jianshao\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667-191.029333 426.666667-426.666667 426.666667z m0-64c200.298667 0 362.666667-162.368 362.666667-362.666667S712.298667 149.333333 512 149.333333 149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667zM352 480h320a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64z\"  ></path></symbol><symbol id=\"icon-yewu\" viewBox=\"0 0 1024 1024\"><path d=\"M864 256H640V160.8c0-17.6-14.4-32.8-32.8-32.8H416.8c-17.6 0-32.8 14.4-32.8 32.8V256H160c-17.6 0-32 14.4-32 32v160l384 64 384-64V288c0-17.6-14.4-32-32-32z m-416-64h128v64H448v-64z m128 240c0 8.8-7.2 16-16 16H464c-8.8 0-16-7.2-16-16v-32c0-8.8 7.2-16 16-16h96c8.8 0 16 7.2 16 16v32z m-64 112l384-64v384c0 17.6-14.4 32-32 32H160c-17.6 0-32-14.4-32-32V480l384 64z\"  ></path></symbol><symbol id=\"icon-kabao\" viewBox=\"0 0 1024 1024\"><path d=\"M832 394.666667H192v160h213.333333a32 32 0 0 1 32 32 74.666667 74.666667 0 0 0 149.333334 0 32 32 0 0 1 32-32h213.333333V394.666667z m0-64V224a53.333333 53.333333 0 0 0-53.333333-53.333333H245.333333a53.333333 53.333333 0 0 0-53.333333 53.333333v106.666667h640z m0 288H646.954667C632.512 679.818667 577.568 725.333333 512 725.333333c-65.568 0-120.512-45.514667-134.954667-106.666666H192v181.333333a53.333333 53.333333 0 0 0 53.333333 53.333333h533.333334a53.333333 53.333333 0 0 0 53.333333-53.333333V618.666667zM245.333333 106.666667h533.333334c64.8 0 117.333333 52.533333 117.333333 117.333333v576c0 64.8-52.533333 117.333333-117.333333 117.333333H245.333333c-64.8 0-117.333333-52.533333-117.333333-117.333333V224c0-64.8 52.533333-117.333333 117.333333-117.333333z\"  ></path></symbol><symbol id=\"icon-yingyongchengxu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M416 192v224H192V192h224m48-64H144c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16V144c0-8.8-7.2-16-16-16z m-48 480v224H192V608h224m48-64H144c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16z m368-352v224H608V192h224m48-64H560c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16V144c0-8.8-7.2-16-16-16z m-48 480v224H608V608h224m48-64H560c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16z\"  ></path></symbol><symbol id=\"icon-huati\" viewBox=\"0 0 1024 1024\"><path d=\"M476.021333 544h63.424l8.533334-64h-63.424l-8.533334 64z m-8.533333 64l-9.098667 68.224a32 32 0 0 1-63.445333-8.448L402.912 608H352a32 32 0 0 1 0-64h59.445333l8.533334-64H352a32 32 0 0 1 0-64h76.512l9.098667-68.224a32 32 0 0 1 63.445333 8.448L493.088 416h63.424l9.098667-68.224a32 32 0 0 1 63.445333 8.448L621.088 416H672a32 32 0 0 1 0 64h-59.445333l-8.533334 64H672a32 32 0 0 1 0 64h-76.512l-9.098667 68.224a32 32 0 0 1-63.445333-8.448L530.912 608h-63.424zM157.568 751.296c-11.008-18.688-18.218667-31.221333-21.802667-37.909333A424.885333 424.885333 0 0 1 85.333333 512C85.333333 276.362667 276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667-191.029333 426.666667-426.666667 426.666667a424.778667 424.778667 0 0 1-219.125333-60.501334 2786.56 2786.56 0 0 0-20.053334-11.765333l-104.405333 28.48c-23.893333 6.506667-45.802667-15.413333-39.285333-39.296l28.437333-104.288z m65.301333 3.786667l-17.258666 63.306666 63.306666-17.258666a32 32 0 0 1 24.522667 3.210666 4515.84 4515.84 0 0 1 32.352 18.944A360.789333 360.789333 0 0 0 512 874.666667c200.298667 0 362.666667-162.368 362.666667-362.666667S712.298667 149.333333 512 149.333333 149.333333 311.701333 149.333333 512c0 60.586667 14.848 118.954667 42.826667 171.136 3.712 6.912 12.928 22.826667 27.370667 47.232a32 32 0 0 1 3.338666 24.714667z\"  ></path></symbol><symbol id=\"icon-yingyongchengxu\" viewBox=\"0 0 1024 1024\"><path d=\"M464 480H144c-8.8 0-16-7.2-16-16V144c0-8.8 7.2-16 16-16h320c8.8 0 16 7.2 16 16v320c0 8.8-7.2 16-16 16z m16 400V560c0-8.8-7.2-16-16-16H144c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16z m352-688H608v224h224V192m48-64c8.8 0 16 7.2 16 16v320c0 8.8-7.2 16-16 16H560c-8.8 0-16-7.2-16-16V144c0-8.8 7.2-16 16-16h320z m16 752V560c0-8.8-7.2-16-16-16H560c-8.8 0-16 7.2-16 16v320c0 8.8 7.2 16 16 16h320c8.8 0 16-7.2 16-16z\"  ></path></symbol><symbol id=\"icon-guanzhu\" viewBox=\"0 0 1024 1024\"><path d=\"M790.976 190.72a32 32 0 0 1 45.258667-0.021333A457.248 457.248 0 0 1 970.666667 515.114667a457.248 457.248 0 0 1-134.293334 324.277333 32 32 0 1 1-45.258666-45.248A393.258667 393.258667 0 0 0 906.666667 515.114667a393.258667 393.258667 0 0 0-115.68-279.146667 32 32 0 0 1 0-45.258667z m-603.36 0.128a32 32 0 0 1 45.269333 45.248A393.258667 393.258667 0 0 0 117.333333 515.114667a393.258667 393.258667 0 0 0 115.466667 278.944 32 32 0 0 1-45.28 45.237333A457.248 457.248 0 0 1 53.333333 515.114667a457.248 457.248 0 0 1 134.293334-324.266667zM330.794667 285.866667a32 32 0 0 1 0.032 45.248A255.04 255.04 0 0 0 256 512a255.050667 255.050667 0 0 0 75.146667 181.184 32 32 0 1 1-45.216 45.301333A319.04 319.04 0 0 1 192 512a319.04 319.04 0 0 1 93.546667-226.090667 32 32 0 0 1 45.248-0.032z m407.36-0.266667A319.04 319.04 0 0 1 832 512a319.04 319.04 0 0 1-93.653333 226.208 32 32 0 0 1-45.28-45.237333A255.050667 255.050667 0 0 0 768 512a255.050667 255.050667 0 0 0-75.072-181.12 32 32 0 1 1 45.226667-45.269333zM566.752 384C637.408 384 682.666667 441.173333 682.666667 514.922667c0 58.005333-47.946667 116.789333-140.096 181.237333a53.333333 53.333333 0 0 1-61.141334 0C389.28 631.712 341.333333 572.928 341.333333 514.922667 341.333333 441.173333 386.592 384 457.258667 384c21.632 0 37.514667 5.994667 54.741333 18.421333C529.226667 389.994667 545.109333 384 566.741333 384z m0 64c-8.32 0-14.56 3.328-27.52 14.538667l-6.336 5.504a32 32 0 0 1-41.770667 0l-6.336-5.504c-12.96-11.2-19.2-14.538667-27.52-14.538667C425.653333 448 405.333333 473.674667 405.333333 514.922667c0 29.941333 34.410667 72.938667 106.666667 124.48 72.256-51.541333 106.666667-94.538667 106.666667-124.48C618.666667 473.674667 598.346667 448 566.741333 448z\"  ></path></symbol><symbol id=\"icon-biaozhun\" viewBox=\"0 0 1024 1024\"><path d=\"M896 656v224c0 8.8-7.2 16-16 16H144c-8.8 0-16-7.2-16-16V144c0-8.8 7.2-16 16-16h224c8.8 0 16 7.2 16 16v48H256v32h128v64h-48v32h48v64h-48v32h48v64h-48v32h48v64H256v32h128v32h32v128h32V640h64v48h32v-48h64v48h32v-48h64v48h32v-48h64v128h32V640h48c8.8 0 16 7.2 16 16z\"  ></path></symbol><symbol id=\"icon-maiyizengyi\" viewBox=\"0 0 1024 1024\"><path d=\"M220.544 194.613333c22.72-62.4 98.858667-88.885333 168.618667-63.498666L790.848 277.333333 821.333333 277.333333c64.8 0 117.333333 52.533333 117.333334 117.333334v117.333333a32 32 0 0 1-32 32 64 64 0 1 0 0 128 32 32 0 0 1 32 32v117.333333c0 64.8-52.533333 117.333333-117.333334 117.333334H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333334V704a32 32 0 0 1 32-32 64 64 0 1 0 0-128 32 32 0 0 1-32-32V394.666667c0-60.586667 45.92-110.453333 104.853334-116.682667zM821.333333 341.333333h-41.226666l-0.064 0.16-0.469334-0.170666L202.666667 341.333333a53.333333 53.333333 0 0 0-53.333334 53.333334v89.365333c55.210667 14.208 96 64.32 96 123.968s-40.789333 109.76-96 123.968V821.333333a53.333333 53.333333 0 0 0 53.333334 53.333334h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333334v-89.365333c-55.210667-14.208-96-64.32-96-123.968s40.789333-109.76 96-123.968V394.666667a53.333333 53.333333 0 0 0-53.333334-53.333334zM640.042667 646.72a32 32 0 0 1 0 64h-256a32 32 0 0 1 0-64z m0-149.333333a32 32 0 0 1 0 64h-256a32 32 0 0 1 0-64z m-272.778667-306.133334c-38.933333-14.165333-77.056-0.917333-86.581333 25.248l-22.144 60.821334H603.733333z\"  ></path></symbol><symbol id=\"icon-biaozhun-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M880 896c8.8 0 16-7.2 16-16V656c0-8.8-7.2-16-16-16H384V144c0-8.8-7.2-16-16-16H144c-8.8 0-16 7.2-16 16v736c0 8.8 7.2 16 16 16m48-64V192h128v64h-64v32h64v64h-32v32h32v64h-32v32h32v64h-32v32h32v64h-64v32h64v32h64v64h32v-64h64v32h32v-32h64v32h32v-32h64v32h32v-32h64v64h32v-64h32v128\"  ></path></symbol><symbol id=\"icon-mima\" viewBox=\"0 0 1024 1024\"><path d=\"M288 384v-74.666667c0-123.722667 100.266667-224 224-224s224 100.224 224 224v74.666667h10.677333C811.445333 384 864 436.597333 864 501.333333v320c0 64.821333-52.469333 117.333333-117.322667 117.333334H277.333333C212.554667 938.666667 160 886.069333 160 821.333333V501.333333c0-64.821333 52.469333-117.333333 117.322667-117.333333H288z m64 0h320v-74.666667c0-88.426667-71.605333-160-160-160-88.384 0-160 71.626667-160 160v74.666667zM224 501.333333v320c0 29.397333 23.914667 53.333333 53.322667 53.333334H746.666667A53.269333 53.269333 0 0 0 800 821.333333V501.333333c0-29.397333-23.914667-53.333333-53.322667-53.333333H277.333333A53.269333 53.269333 0 0 0 224 501.333333z\"  ></path></symbol><symbol id=\"icon-quanxianyuechi\" viewBox=\"0 0 1024 1024\"><path d=\"M830.4 513.6c-72-72-180-84.8-264.8-38.4L335.2 244.8 448 132l-45.6-45.6-144.8 80.8L154.4 64 64 154.4l411.2 411.2c-45.6 84.8-32.8 192.8 38.4 264.8 87.2 87.2 229.6 87.2 316.8 0 88-87.2 88-228.8 0-316.8zM740 740c-37.6 37.6-98.4 37.6-136 0s-37.6-98.4 0-136 98.4-37.6 136 0 37.6 98.4 0 136z\"  ></path></symbol><symbol id=\"icon-nan\" viewBox=\"0 0 1024 1024\"><path d=\"M795.189333 176.917333H682.666667a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V219.946667l-105.866667 105.866666A350.613333 350.613333 0 0 1 821.333333 554.666667c0 194.4-157.6 352-352 352S117.333333 749.066667 117.333333 554.666667s157.6-352 352-352a350.538667 350.538667 0 0 1 221.6 78.506666l104.256-104.256zM469.333333 842.666667c159.061333 0 288-128.938667 288-288S628.394667 266.666667 469.333333 266.666667 181.333333 395.605333 181.333333 554.666667s128.938667 288 288 288z\"  ></path></symbol><symbol id=\"icon-quanxianyuechi-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M830.4 513.6C786.4 469.6 729.6 448 672 448c-48.8 0-96.8 16-136.8 47.2L277.6 237.6 384 131.2l-29.6-29.6L224 184 128.8 88.8l-44 44 406.4 406.4c-64.8 88-56.8 212 22.4 291.2 44 44 100.8 65.6 158.4 65.6s114.4-21.6 158.4-65.6c87.2-87.2 87.2-229.6 0-316.8z m-45.6 271.2c-30.4 30.4-70.4 47.2-112.8 47.2-42.4 0-83.2-16.8-112.8-47.2-62.4-62.4-62.4-164 0-226.4C588.8 528.8 629.6 512 672 512s83.2 16.8 112.8 47.2c62.4 62.4 62.4 163.2 0 225.6z\"  ></path></symbol><symbol id=\"icon-nv\" viewBox=\"0 0 1024 1024\"><path d=\"M485.333333 768v-43.765333C321.077333 710.688 192 573.088 192 405.333333 192 228.597333 335.264 85.333333 512 85.333333c176.736 0 320 143.264 320 320 0 164.106667-123.52 299.349333-282.666667 317.845334V768H640a32 32 0 0 1 0 64h-90.666667v77.333333a32 32 0 0 1-64 0V832H384a32 32 0 0 1 0-64h101.333333zM512 661.333333c141.386667 0 256-114.613333 256-256S653.386667 149.333333 512 149.333333 256 263.946667 256 405.333333s114.613333 256 256 256z\"  ></path></symbol><symbol id=\"icon-ziyuan\" viewBox=\"0 0 1024 1024\"><path d=\"M896 256v32L512 416 128 288v-32l384-128 384 128zM512 480L224 384l-96 32v32l384 128 384-128v-32l-96-32-288 96z m0 160L224 544l-96 32v32l384 128 384-128v-32l-96-32-288 96z m0 160L224 704l-96 32v32l384 128 384-128v-32l-96-32-288 96z\"  ></path></symbol><symbol id=\"icon-lihe\" viewBox=\"0 0 1024 1024\"><path d=\"M558.954667 157.354667a101.333333 101.333333 0 1 1 175.509333 101.333333l-19.072 33.034667H864a74.666667 74.666667 0 0 1 74.624 72.106666l0.042667 2.56v85.333334a74.666667 74.666667 0 0 1-74.666667 74.666666h-10.666667v288c0 64.810667-52.533333 117.333333-117.333333 117.333334H309.333333c-64.8 0-117.333333-52.522667-117.333333-117.333334v-288h-10.666667a74.666667 74.666667 0 0 1-74.624-72.096L106.666667 451.733333v-85.333333a74.666667 74.666667 0 0 1 74.666666-74.666667l142.122667-0.010666-19.072-33.034667a101.333333 101.333333 0 1 1 175.509333-101.333333l39.530667 68.448zM789.333333 526.4H256v288a53.333333 53.333333 0 0 0 53.333333 53.333333h426.666667a53.333333 53.333333 0 0 0 53.333333-53.333333v-288z m74.666667-170.666667H181.333333a10.666667 10.666667 0 0 0-10.666666 10.666667v85.333333a10.666667 10.666667 0 0 0 10.666666 10.666667h682.666667a10.666667 10.666667 0 0 0 10.666667-10.666667v-85.333333a10.666667 10.666667 0 0 0-10.666667-10.666667zM373.472 175.68a37.333333 37.333333 0 0 0-13.653333 51.008l37.536 65.034667h84.010666l1.109334-1.92-58.005334-100.448a37.333333 37.333333 0 0 0-50.986666-13.674667z m291.904 0a37.333333 37.333333 0 0 0-50.986667 13.674667L556.373333 289.813333l1.098667 1.909334h84.021333l37.546667-65.034667a37.333333 37.333333 0 0 0-11.861333-49.888z\"  ></path></symbol><symbol id=\"icon-ziyuan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 195.2L741.6 272 512 348.8 282.4 272 512 195.2m0-67.2L128 256v32l384 128 384-128v-32L512 128z m0 389.6l-320-104h-64v32l384 128 384-128v-32h-64l-320 104zM512 680L192 576h-64v32l384 128 384-128v-32h-64L512 680z m0 160L192 736h-64v32l384 128 384-128v-32h-64l-320 104z\"  ></path></symbol><symbol id=\"icon-paihangbang\" viewBox=\"0 0 1024 1024\"><path d=\"M544 661.333333a32 32 0 0 1-64 0V362.666667a32 32 0 0 1 64 0v298.666666z m160 0a32 32 0 0 1-64 0V490.666667a32 32 0 0 1 64 0v170.666666z m-320 0a32 32 0 0 1-64 0V448a32 32 0 0 1 64 0v213.333333zM202.666667 138.666667h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v512c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V256c0-64.8 52.533333-117.333333 117.333334-117.333333z m0 64a53.333333 53.333333 0 0 0-53.333334 53.333333v512a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V256a53.333333 53.333333 0 0 0-53.333334-53.333333H202.666667z\"  ></path></symbol><symbol id=\"icon-mobankuangjia-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32z m-32 64v128H192V192h640zM192 384h128v448H192V384z m192 448V384h448v448H384z\"  ></path></symbol><symbol id=\"icon-lipinka\" viewBox=\"0 0 1024 1024\"><path d=\"M384 592.021333c-15.402667 16.426667-36.832 33.834667-64.426667 52.949334a32 32 0 1 1-36.448-52.608c23.957333-16.597333 41.6-31.114667 52.8-42.592-22.4-4.341333-42.453333-11.232-58.08-20.693334-57.322667-34.688-56.362667-111.989333-4.48-143.978666C307.2 364.234667 346.325333 370.24 384 400.32V202.666667H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v512a53.333333 53.333333 0 0 0 53.333334 53.333333h181.333333V592.021333z m64-12.885333V821.333333h373.333333a53.333333 53.333333 0 0 0 53.333334-53.333333V256a53.333333 53.333333 0 0 0-53.333334-53.333333H448v187.509333c39.893333-23.370667 83.232-18.506667 114.592 12.992l1.92 1.92 1.568 2.24c23.498667 33.386667 22.005333 69.269333-3.296 96.629333-14.325333 15.488-35.456 27.370667-61.418667 35.893334 20.373333 15.114667 45.578667 28.693333 75.765334 40.672a32 32 0 0 1-23.594667 59.498666c-42.368-16.810667-77.621333-37.056-105.536-60.885333z m0-100.693333c1.472 2.528 2.933333 5.098667 4.394667 7.701333l0.074666 0.149333c3.605333-0.661333 7.178667-1.408 10.688-2.208 25.546667-5.888 44.48-14.762667 52.64-23.573333 3.936-4.266667 4.394667-6.634667-0.373333-13.888-16.874667-14.698667-41.92-6.773333-67.424 29.226667v2.592zM202.666667 138.666667h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v512c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V256c0-64.8 52.533333-117.333333 117.333334-117.333333z m108.309333 335.669333c12.821333 7.754667 32.864 13.002667 55.957333 15.413333 1.728-3.626667 3.477333-7.168 5.258667-10.634666-28.32-38.186667-51.968-47.712-65.237333-39.530667-11.626667 7.157333-11.84 25.141333 4.021333 34.752z\"  ></path></symbol><symbol id=\"icon-mobankuangjia\" viewBox=\"0 0 1024 1024\"><path d=\"M896 320H128V160c0-17.6 14.4-32 32-32h704c17.6 0 32 14.4 32 32v160zM320 896H160c-17.6 0-32-14.4-32-32V384h192v512zM864 896H384V384h512v480c0 17.6-14.4 32-32 32z\"  ></path></symbol><symbol id=\"icon-pengyouquan\" viewBox=\"0 0 1024 1024\"><path d=\"M177.738667 652.949333A364.074667 364.074667 0 0 0 331.306667 826.517333v-310.826666L192.490667 645.152c-4.298667 4.010667-9.397333 6.613333-14.752 7.808z m-19.989334-62.922666l209.706667-195.562667H170.666667c-0.618667 0-1.237333-0.010667-1.845334-0.053333A362.186667 362.186667 0 0 0 149.333333 512c0 26.784 2.901333 52.906667 8.416 78.026667z m302.08-195.562667a32.064 32.064 0 0 1-5.152 6.186667l-62.112 57.909333c1.76 3.957333 2.730667 8.341333 2.730667 12.949333v79.541334c3.584 1.642667 6.912 3.978667 9.802667 7.008l67.573333 70.848h90.570667l68.298666-72.938667v-95.872l-68.181333-66.826667c-2.773333 0.778667-5.685333 1.194667-8.693333 1.194667h-94.837334zM395.232 855.466667A362.218667 362.218667 0 0 0 512 874.666667c32.768 0 64.522667-4.341333 94.72-12.490667l-211.413333-221.653333V853.333333c0 0.714667-0.032 1.418667-0.074667 2.133334z m275.466667-17.269334a364.266667 364.266667 0 0 0 155.690666-145.28H533.706667l131.946666 138.346667c2.026667 2.133333 3.712 4.469333 5.045334 6.933333z m184.693333-209.216A362.208 362.208 0 0 0 874.666667 512c0-36.661333-5.44-72.053333-15.552-105.408L650.912 628.906667H853.333333c0.693333 0 1.376 0.021333 2.058667 0.064zM197.962667 330.464h301.312l-139.733334-136.938667a31.978667 31.978667 0 0 1-5.898666-7.893333A364.266667 364.266667 0 0 0 197.973333 330.474667z m220.373333-168.917333l213.205333 208.938666v-195.2c0-1.92 0.170667-3.786667 0.490667-5.621333A362.112 362.112 0 0 0 512 149.333333c-32.384 0-63.786667 4.245333-93.653333 12.213334zM695.552 446.613333V487.637333l134.432-143.573333c0.746667-0.8 1.546667-1.557333 2.346667-2.261333a364.373333 364.373333 0 0 0-136.778667-142.666667v247.488zM512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667-191.029333 426.666667-426.666667 426.666667z\"  ></path></symbol><symbol id=\"icon-xinwenzixun\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM512 704H256V512h256v192z m256 0H576v-64h192v64z m0-128H576v-64h192v64z m0-128H256V320h512v128z\"  ></path></symbol><symbol id=\"icon-mingxinghuodong\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 64c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667 362.666667-162.368 362.666667-362.666667-162.368-362.666667-362.666667-362.666667z m21.141333 132.298667a54.762667 54.762667 0 0 1 29.312 29.749333l37.365334 91.456 96.693333 7.893334c30.122667 2.453333 52.352 29.013333 49.984 59.125333a55.104 55.104 0 0 1-18.677333 37.205333l-74.08 64.597334 22.666666 96.746666c6.88 29.333333-11.008 58.944-40.309333 66.058667a54.218667 54.218667 0 0 1-41.44-6.656L512 676.416l-82.666667 51.392a54.325333 54.325333 0 0 1-75.338666-18.346667 55.317333 55.317333 0 0 1-6.4-41.056l22.666666-96.746666-74.08-64.597334a55.253333 55.253333 0 0 1-5.909333-77.098666 54.421333 54.421333 0 0 1 37.216-19.242667l96.693333-7.893333 37.365334-91.445334c11.498667-28.128 43.584-41.6 71.594666-29.749333zM512 357.109333l-30.72 75.178667a54.592 54.592 0 0 1-46.037333 33.856l-81.024 6.613333 62.165333 54.197334a55.210667 55.210667 0 0 1 17.386667 54.186666l-18.805334 80.234667 68.373334-42.506667a54.218667 54.218667 0 0 1 57.312 0l68.373333 42.506667-18.794667-80.234667a55.210667 55.210667 0 0 1 17.386667-54.186666l62.165333-54.197334-81.024-6.613333a54.592 54.592 0 0 1-46.048-33.856L512 357.109333z\"  ></path></symbol><symbol id=\"icon-xinwenzixun-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M832 192v640H192V192h640m32-64H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM768 640H576v64h192v-64zM512 512H256v192h256V512z m256 0H576v64h192v-64z m0-192H256v128h512V320z\"  ></path></symbol><symbol id=\"icon-qupiao\" viewBox=\"0 0 1024 1024\"><path d=\"M821.333333 85.333333c64.8 0 117.333333 52.533333 117.333334 117.333334v149.333333c0 64.8-52.533333 117.333333-117.333334 117.333333h-21.333333v437.333334c0 26.368-30.101333 41.418667-51.2 25.6L682.666667 882.666667l-59.733334 44.8a42.666667 42.666667 0 0 1-51.2 0l-59.733333-44.8-59.733333 44.8a42.666667 42.666667 0 0 1-51.2 0l-59.733334-44.8-66.133333 49.6c-21.098667 15.818667-51.2 0.768-51.2-25.6V469.333333h-21.333333c-63.776 0-115.658667-50.88-117.290667-114.261333L85.333333 352V202.666667c0-64.8 52.533333-117.333333 117.333334-117.333334z m-96 213.333334H298.666667a10.666667 10.666667 0 0 0-10.666667 10.666666v533.333334l27.733333-20.8a42.666667 42.666667 0 0 1 51.2 0l59.733334 44.8 59.733333-44.8a42.666667 42.666667 0 0 1 51.2 0l59.733333 44.8 59.733334-44.8a42.666667 42.666667 0 0 1 51.2 0L736 842.666667V309.333333a10.666667 10.666667 0 0 0-10.666667-10.666666zM543.978667 588.981333a32 32 0 1 1 0 64h-128a32 32 0 1 1 0-64z m64.032-138.666666a32 32 0 0 1 0 64H415.989333a32 32 0 0 1 0-64zM821.333333 149.333333H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333334v149.333333a53.333333 53.333333 0 0 0 53.333334 53.333333h21.333333v-96a74.666667 74.666667 0 0 1 74.666667-74.666666h426.666666a74.666667 74.666667 0 0 1 74.666667 74.666666v96h21.333333a53.333333 53.333333 0 0 0 53.28-51.018666L874.666667 352V202.666667a53.333333 53.333333 0 0 0-53.333334-53.333334z\"  ></path></symbol><symbol id=\"icon-hezuoguanxi-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M768.8 192c35.2 0 64 28.8 64 64s-28.8 64-64 64-64-28.8-64-64 28.8-64 64-64m-513.6 0c35.2 0 64 28.8 64 64s-28.8 64-64 64-64-28.8-64-64 28.8-64 64-64M768 512c35.2 0 64 28.8 64 64v256H704V576c0-35.2 28.8-64 64-64m-512 0c35.2 0 64 28.8 64 64v256H192V576c0-35.2 28.8-64 64-64m512.8-384c-70.4 0-128 57.6-128 128s57.6 128 128 128 128-57.6 128-128-57.6-128-128-128z m-513.6 0c-70.4 0-128 57.6-128 128s57.6 128 128 128 128-57.6 128-128-56.8-128-128-128zM768 448c-70.4 0-128 57.6-128 128v51.2l-128.8 74.4L384 628v-48.8c0-62.4-43.2-117.6-104-128.8-80.8-15.2-152 47.2-152 125.6v288c0 17.6 14.4 32 32 32h192c17.6 0 32-14.4 32-32V701.6l110.4 64c0.8 0 0.8 0.8 1.6 0.8 4.8 3.2 10.4 4 16 4s10.4-1.6 16-4l112-65.6V864c0 17.6 14.4 32 32 32h192c17.6 0 32-14.4 32-32V576c0-70.4-57.6-128-128-128z\"  ></path></symbol><symbol id=\"icon-saoyisao\" viewBox=\"0 0 1024 1024\"><path d=\"M693.333333 170.666667a32 32 0 0 1 0-64h149.333334a74.666667 74.666667 0 0 1 74.666666 74.666666v149.333334a32 32 0 0 1-64 0V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H693.333333z m160 522.666666a32 32 0 0 1 64 0v149.333334a74.666667 74.666667 0 0 1-74.666666 74.666666H693.333333a32 32 0 0 1 0-64h149.333334a10.666667 10.666667 0 0 0 10.666666-10.666666V693.333333zM330.666667 853.333333a32 32 0 0 1 0 64H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V693.333333a32 32 0 0 1 64 0v149.333334a10.666667 10.666667 0 0 0 10.666666 10.666666h149.333334zM170.666667 330.666667a32 32 0 0 1-64 0V181.333333a74.666667 74.666667 0 0 1 74.666666-74.666666h149.333334a32 32 0 0 1 0 64H181.333333a10.666667 10.666667 0 0 0-10.666666 10.666666v149.333334z m629.333333 149.333333a32 32 0 0 1 0 64H224a32 32 0 0 1 0-64h576z\"  ></path></symbol><symbol id=\"icon-hezuoguanxi\" viewBox=\"0 0 1024 1024\"><path d=\"M127.2 256c0-70.4 57.6-128 128-128s128 57.6 128 128-57.6 128-128 128-128-57.6-128-128z m641.6 128c70.4 0 128-57.6 128-128s-57.6-128-128-128-128 57.6-128 128 56.8 128 128 128z m0 64c-70.4 0-128 57.6-128 128v51.2L512 701.6l-128-74.4V576c0-70.4-57.6-128-128-128s-128 57.6-128 128v288c0 17.6 14.4 32 32 32h192c17.6 0 32-14.4 32-32V701.6l110.4 64c0.8 0 0.8 0.8 1.6 0.8 9.6 5.6 21.6 6.4 32 0l112.8-65.6V864c0 17.6 14.4 32 32 32h192c17.6 0 32-14.4 32-32V576c0-70.4-57.6-128-128-128z\"  ></path></symbol><symbol id=\"icon-rili1\" viewBox=\"0 0 1024 1024\"><path d=\"M725.333333 170.666667h74.709334C864.853333 170.666667 917.333333 223.189333 917.333333 288.096V799.893333C917.333333 864.757333 864.832 917.333333 800.042667 917.333333H223.957333C159.146667 917.333333 106.666667 864.810667 106.666667 799.904V288.106667C106.666667 223.242667 159.168 170.666667 223.957333 170.666667H298.666667v-32a32 32 0 0 1 64 0v32h298.666666v-32a32 32 0 0 1 64 0v32z m0 64v32a32 32 0 0 1-64 0v-32H362.666667v32a32 32 0 0 1-64 0v-32h-74.709334A53.354667 53.354667 0 0 0 170.666667 288.096V799.893333A53.301333 53.301333 0 0 0 223.957333 853.333333h576.085334A53.354667 53.354667 0 0 0 853.333333 799.904V288.106667A53.301333 53.301333 0 0 0 800.042667 234.666667H725.333333z m-10.666666 224a32 32 0 0 1 0 64H309.333333a32 32 0 0 1 0-64h405.333334zM586.666667 618.666667a32 32 0 0 1 0 64H309.333333a32 32 0 0 1 0-64h277.333334z\"  ></path></symbol><symbol id=\"icon-xianlu\" viewBox=\"0 0 1024 1024\"><path d=\"M719.2 480H305.6c-57.6 0-108-41.6-114.4-99.2-7.2-67.2 45.6-124.8 112-124.8H728v64l166.4-96L728 128v64H303.2c-97.6 0-176 78.4-176 176s78.4 176 176 176h413.6c57.6 0 108 41.6 114.4 99.2 8 67.2-45.6 124.8-111.2 124.8H296v-64l-168 98.4L296 896v-64h423.2c97.6 0 176-78.4 176-176s-78.4-176-176-176z\"  ></path></symbol><symbol id=\"icon-pinglun\" viewBox=\"0 0 1024 1024\"><path d=\"M157.568 751.296c-11.008-18.688-18.218667-31.221333-21.802667-37.909333A424.885333 424.885333 0 0 1 85.333333 512C85.333333 276.362667 276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667-191.029333 426.666667-426.666667 426.666667a424.778667 424.778667 0 0 1-219.125333-60.501334 2786.56 2786.56 0 0 0-20.053334-11.765333l-104.405333 28.48c-23.893333 6.506667-45.802667-15.413333-39.285333-39.296l28.437333-104.288z m65.301333 3.786667l-17.258666 63.306666 63.306666-17.258666a32 32 0 0 1 24.522667 3.210666 4515.84 4515.84 0 0 1 32.352 18.944A360.789333 360.789333 0 0 0 512 874.666667c200.298667 0 362.666667-162.368 362.666667-362.666667S712.298667 149.333333 512 149.333333 149.333333 311.701333 149.333333 512c0 60.586667 14.848 118.954667 42.826667 171.136 3.712 6.912 12.928 22.826667 27.370667 47.232a32 32 0 0 1 3.338666 24.714667z m145.994667-70.773334a32 32 0 1 1 40.917333-49.205333A159.189333 159.189333 0 0 0 512 672c37.888 0 73.674667-13.173333 102.186667-36.885333a32 32 0 0 1 40.917333 49.216A223.178667 223.178667 0 0 1 512 736a223.178667 223.178667 0 0 1-143.136-51.690667z\"  ></path></symbol><symbol id=\"icon--fuwu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M384 896h-64v-70.4c0-15.2-10.4-28-24.8-31.2C159.2 768 64 644.8 64 496v-32h64v32c0 118.4 73.6 215.2 179.2 236 44.8 8.8 76.8 48 76.8 94.4v69.6z m320 0h-64v-70.4c0-45.6 32-85.6 76.8-94.4C822.4 711.2 896 614.4 896 496v-32h64v32c0 148.8-95.2 272-231.2 298.4-14.4 3.2-24.8 16-24.8 31.2v70.4z m-62.4-703.2c52.8 0 92.8 40 92.8 92.8 0 65.6-58.4 121.6-180.8 231.2-12.8 12-26.4 24-40.8 36.8-14.4-13.6-28.8-26.4-42.4-38.4C349.6 406.4 291.2 352 291.2 285.6c0-52.8 40-92.8 92.8-92.8 29.6 0 60.8 14.4 80 37.6l48.8 57.6 48.8-57.6c19.2-23.2 50.4-37.6 80-37.6m0-64C592 128.8 544 152 512.8 188.8c-31.2-36.8-79.2-60-128.8-60-88 0-156.8 68.8-156.8 156.8 0 108.8 96.8 183.2 244 316.8l41.6 37.6 41.6-37.6c147.2-133.6 244-208.8 244-316.8 0-88-68.8-156.8-156.8-156.8z\"  ></path></symbol><symbol id=\"icon-qinghuiyuan\" viewBox=\"0 0 1024 1024\"><path d=\"M267.210667 165.002667c32.106667-55.594667 102.976-74.88 158.901333-43.488L760.501333 278.506667H821.333333c64.8 0 117.333333 52.448 117.333334 117.12v404.586666C938.666667 864.896 886.133333 917.333333 821.333333 917.333333H202.666667c-64.8 0-117.333333-52.437333-117.333334-117.12V395.626667c0-64.341333 51.989333-116.565333 116.330667-117.109334zM821.333333 342.389333l-63.658666 0.021334a31.872 31.872 0 0 1-7.594667 0L202.666667 342.4c-29.450667 0-53.333333 23.829333-53.333334 53.226667v404.586666a53.28 53.28 0 0 0 53.333334 53.237334h618.666666c29.450667 0 53.333333-23.829333 53.333334-53.226667V395.626667a53.28 53.28 0 0 0-53.333334-53.237334zM589.536 478.250667a32.021333 32.021333 0 0 1 42.368-15.861334 31.914667 31.914667 0 0 1 15.893333 42.293334l-106.666666 234.24c-11.370667 24.96-46.890667 24.96-58.261334 0l-106.666666-234.24a31.914667 31.914667 0 0 1 15.893333-42.293334 32.021333 32.021333 0 0 1 42.368 15.861334L512 648.501333zM395.445333 177.568a53.28 53.28 0 0 0-72.810666 19.434667l-47.061334 81.504h334.613334l-212.341334-99.68a32.064 32.064 0 0 1-1.216-0.608z\"  ></path></symbol><symbol id=\"icon--fuwu\" viewBox=\"0 0 1024 1024\"><path d=\"M384 896h-64v-70.4c0-15.2-10.4-28-24.8-31.2C159.2 768 64 644.8 64 496v-32h64v32c0 118.4 73.6 215.2 179.2 236 44.8 8.8 76.8 48 76.8 94.4v69.6zM704 896h-64v-70.4c0-45.6 32-85.6 76.8-94.4C822.4 711.2 896 614.4 896 496v-32h64v32c0 148.8-95.2 272-231.2 298.4-14.4 3.2-24.8 16-24.8 31.2v70.4zM512.8 640l-41.6-37.6c-147.2-133.6-244-208-244-316.8 0-88 68.8-156.8 156.8-156.8 49.6 0 97.6 23.2 128.8 60C544 152 592 128.8 641.6 128.8c88 0 156.8 68.8 156.8 156.8 0 108-96.8 183.2-244 316.8L512.8 640z\"  ></path></symbol><symbol id=\"icon-riqian\" viewBox=\"0 0 1024 1024\"><path d=\"M725.333333 170.666667h74.709334C864.853333 170.666667 917.333333 223.189333 917.333333 288.096V799.893333C917.333333 864.757333 864.832 917.333333 800.042667 917.333333H223.957333C159.146667 917.333333 106.666667 864.810667 106.666667 799.904V288.106667C106.666667 223.242667 159.168 170.666667 223.957333 170.666667H298.666667v-32a32 32 0 0 1 64 0v32h298.666666v-32a32 32 0 0 1 64 0v32z m0 64v32a32 32 0 0 1-64 0v-32H362.666667v32a32 32 0 0 1-64 0v-32h-74.709334A53.354667 53.354667 0 0 0 170.666667 288.096V799.893333A53.301333 53.301333 0 0 0 223.957333 853.333333h576.085334A53.354667 53.354667 0 0 0 853.333333 799.904V288.106667A53.301333 53.301333 0 0 0 800.042667 234.666667H725.333333z\"  ></path></symbol><symbol id=\"icon--kefu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 192c61.6 0 118.4 36 144.8 91.2l2.4 4.8H608v64c0 52.8-43.2 96-96 96s-96-43.2-96-96v-64h-50.4l2.4-4.8C393.6 228 450.4 192 512 192m0-64c-88.8 0-166.4 52-202.4 128H256v128h80v-32h16c0 88 72 160 160 160s160-72 160-160h16v32h16.8c-10.4 82.4-75.2 148-157.6 160-7.2-8.8-18.4-14.4-30.4-14.4-21.6 0-39.2 17.6-39.2 39.2s17.6 39.2 39.2 39.2c19.2 0 35.2-14.4 38.4-32.8 96-16 170.4-93.6 181.6-191.2H768V256h-53.6C678.4 180 600.8 128 512 128zM385.6 656c35.2 30.4 80 48 126.4 48 48 0 92.8-16.8 127.2-48 52 12 100 28.8 134.4 48 17.6 9.6 58.4 36 58.4 62.4v64.8H192v-64c0-27.2 41.6-53.6 59.2-63.2 35.2-19.2 82.4-36 134.4-48M616 586.4c-23.2 32.8-60.8 53.6-104 53.6s-80.8-21.6-104-53.6C280 608.8 128 669.6 128 768v96c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V767.2c0.8-98.4-151.2-158.4-280-180.8z\"  ></path></symbol><symbol id=\"icon-shandian\" viewBox=\"0 0 1024 1024\"><path d=\"M395.765333 586.570667h-171.733333c-22.421333 0-37.888-22.442667-29.909333-43.381334L364.768 95.274667A32 32 0 0 1 394.666667 74.666667h287.957333c22.72 0 38.208 23.018667 29.632 44.064l-99.36 243.882666h187.050667c27.509333 0 42.186667 32.426667 24.042666 53.098667l-458.602666 522.56c-22.293333 25.408-63.626667 3.392-54.976-29.28l85.354666-322.421333zM416.714667 138.666667L270.453333 522.581333h166.869334a32 32 0 0 1 30.933333 40.181334l-61.130667 230.954666 322.176-367.114666H565.312c-22.72 0-38.208-23.018667-29.632-44.064l99.36-243.882667H416.714667z\"  ></path></symbol><symbol id=\"icon--kefu\" viewBox=\"0 0 1024 1024\"><path d=\"M336 352h16c0 88 72 160 160 160s160-72 160-160h16v32h16.8c-10.4 82.4-75.2 148-157.6 160-7.2-8.8-18.4-14.4-30.4-14.4-21.6 0-39.2 17.6-39.2 39.2s17.6 39.2 39.2 39.2c19.2 0 35.2-14.4 38.4-32.8 96-16 170.4-93.6 181.6-191.2H768V256h-53.6C678.4 180 600.8 128 512 128s-166.4 52-202.4 128H256v128h80v-32z\"  ></path><path d=\"M616 586.4c-23.2 32.8-60.8 53.6-104 53.6s-80.8-21.6-104-53.6C280 608.8 128 669.6 128 768v96c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V767.2c0.8-98.4-151.2-158.4-280-180.8z\"  ></path></symbol><symbol id=\"icon-shaixuan\" viewBox=\"0 0 1024 1024\"><path d=\"M646.037333 511.509333l224.874667-307.381333a74.741333 74.741333 0 0 0-16.074667-104.362667A74.485333 74.485333 0 0 0 810.773333 85.333333H213.226667C172.053333 85.333333 138.666667 118.762667 138.666667 160c0 15.872 5.045333 31.328 14.410666 44.128l224.885334 307.381333V906.666667c0 17.674667 14.304 32 31.957333 32a31.978667 31.978667 0 0 0 31.946667-32V501.034667c0-6.794667-2.165333-13.418667-6.176-18.912L204.629333 166.304A10.677333 10.677333 0 0 1 213.226667 149.333333h597.546666a10.666667 10.666667 0 0 1 8.586667 16.970667L588.298667 482.122667a32.032 32.032 0 0 0-6.176 18.912v315.413333c0 17.674667 14.304 32 31.957333 32a31.978667 31.978667 0 0 0 31.957333-32V511.509333z\"  ></path></symbol><symbol id=\"icon--guoji-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c28 0 55.2 3.2 81.6 8.8V174.4c0 18.4-15.2 33.6-33.6 33.6H401.6v144h-152v96l-64-64-25.6-25.6C219.2 223.2 355.2 128 512 128m81.6 448v192h112c14.4 0 25.6 8.8 30.4 21.6l8.8 28c-60 45.6-134.4 74.4-214.4 77.6V737.6h-64c-17.6 0-32-14.4-32-32V632L416 613.6 377.6 576h216M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM313.6 512V416h103.2c27.2 0 48.8-21.6 48.8-48.8V272H560c53.6 0 97.6-44 97.6-97.6v-18.4c140.8 56.8 240 194.4 240 356 0 100-37.6 190.4-100.8 259.2-12-39.2-48-67.2-91.2-67.2h-48V560.8c0-27.2-21.6-48.8-48.8-48.8H313.6z m152 383.2c-189.6-23.2-336-184.8-336-380.8 0-29.6 4-58.4 10.4-85.6l229.6 229.6v48c0 52.8 43.2 96 96 96v92.8z\"  ></path></symbol><symbol id=\"icon-shangquan\" viewBox=\"0 0 1024 1024\"><path d=\"M149.333333 874.666667V202.666667c0-64.8 52.533333-117.333333 117.333334-117.333334h277.333333c64.8 0 117.333333 52.533333 117.333333 117.333334v65.866666l149.952 77.653334A117.333333 117.333333 0 0 1 874.666667 450.378667V874.666667h32a32 32 0 0 1 0 64H117.333333a32 32 0 0 1 0-64h32z m512 0h149.333334V450.378667a53.333333 53.333333 0 0 0-28.8-47.36L661.333333 340.608V874.666667z m-448 0h384V202.666667a53.333333 53.333333 0 0 0-53.333333-53.333334H266.666667a53.333333 53.333333 0 0 0-53.333334 53.333334v672z\"  ></path></symbol><symbol id=\"icon--guoji\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m-46.4 831.2c-189.6-23.2-336-184.8-336-380.8 0-29.6 4-58.4 10.4-85.6l229.6 229.6v48c0 52.8 43.2 96 96 96v92.8z m331.2-124c-12-39.2-48-67.2-91.2-67.2h-48V560.8c0-27.2-21.6-48.8-48.8-48.8H313.6V416h103.2c27.2 0 48.8-21.6 48.8-48.8V272H560c53.6 0 97.6-44 97.6-97.6v-18.4c140.8 56.8 240 194.4 240 356 0 100-37.6 190.4-100.8 259.2z\"  ></path></symbol><symbol id=\"icon-shanchu\" viewBox=\"0 0 1024 1024\"><path d=\"M202.666667 256h-42.666667a32 32 0 0 1 0-64h704a32 32 0 0 1 0 64H266.666667v565.333333a53.333333 53.333333 0 0 0 53.333333 53.333334h384a53.333333 53.333333 0 0 0 53.333333-53.333334V352a32 32 0 0 1 64 0v469.333333c0 64.8-52.533333 117.333333-117.333333 117.333334H320c-64.8 0-117.333333-52.533333-117.333333-117.333334V256z m224-106.666667a32 32 0 0 1 0-64h170.666666a32 32 0 0 1 0 64H426.666667z m-32 288a32 32 0 0 1 64 0v256a32 32 0 0 1-64 0V437.333333z m170.666666 0a32 32 0 0 1 64 0v256a32 32 0 0 1-64 0V437.333333z\"  ></path></symbol><symbol id=\"icon-haiguan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m244.8 464.8s-12-32.8-12-77.6c0 0-2.4-8-4.8-0.8 0 0-1.6 41.6 0 44.8 0 0-11.2 0-14.4-48.8 0 0-0.8-8-2.4 0 0 0 0 42.4-7.2 16.8 0 0-6.4-23.2-7.2-37.6 0 0-4 2.4-6.4 13.6 0 0-7.2 0.8-9.6-29.6 0 0-2.4-7.2-4.8 0 0 0-3.2 11.2-1.6 16.8 0 0-10.4-1.6-9.6-32.8 0 0-6.4 3.2-4.8 14.4 0 0 0 7.2-4.8 0 0 0-13.6-12-28-7.2 0 0-4-0.8-14.4 10.4L589.6 448s11.2 22.4 35.2 12.8c0 0 5.6-0.8 12-6.4 0 0 0.8-16 10.4-18.4 0 0 12.8-2.4 23.2 9.6 0 0 11.2 14.4-0.8 27.2 0 0-13.6 37.6-83.2 13.6 0 0 8.8 33.6-34.4 45.6l-2.4 4 61.6 52s12 11.2 26.4 0.8c0 0 41.6-26.4 77.6-3.2 0 0 53.6 35.2 31.2 107.2 0 0-27.2 88-112 73.6 0 0-73.6-31.2-56-96.8l6.4-20s8-12-8-22.4l-61.6-55.2s-12 32.8-62.4 33.6c0 0 4 61.6-64 51.2L291.2 766.4l-4-3.2 87.2-120s-16-64.8 46.4-64l4-4s-15.2-42.4 28-60l-192-166.4s-11.2-8.8 0.8-27.2c0 0 16-8.8 29.6 4l192 153.6 4.8-4.8s3.2-38.4 45.6-42.4c0 0 3.2-12.8-6.4-28.8 0 0-12.8-22.4 0-40.8 0 0 10.4-16.8 32.8-8 0 0 21.6 9.6 10.4 23.2 0 0-8.8 8-13.6 8.8 0 0-3.2 34.4 18.4 32l36.8-40.8s10.4-12-4.8-24c0 0-13.6-7.2 3.2-12 0 0 6.4 0.8 7.2-4.8 0 0 1.6-3.2-12-3.2 0 0-21.6 2.4-20-5.6l19.2-3.2s7.2-3.2-2.4-3.2l-21.6-0.8s-11.2 0.8-16-6.4l24-0.8s6.4 0 4.8-5.6c0 0 0-2.4-8-2.4L536 304s-3.2-4.8 10.4-5.6l24.8-0.8s6.4-0.8-0.8-4.8c0 0 1.6-0.8-9.6-2.4l-46.4-2.4s-11.2-6.4-0.8-8l50.4-1.6s6.4-4 0-7.2H478.4s-4.8 1.6-9.6-6.4c0 0-1.6-4.8 7.2-6.4l114.4-2.4s37.6 0.8 44 36.8c0 0 2.4 11.2 1.6 27.2 0 0 4 11.2 12 8.8 0 0 8 3.2 17.6-9.6 0 0 2.4-8 3.2-13.6 0 0 0.8-16.8 25.6-15.2 0 0 17.6 7.2 25.6 23.2 0 0 8.8 9.6-3.2 20 0 0-7.2 10.4-21.6 10.4 0 0-15.2 4-14.4 18.4 0 0 0.8 21.6 24.8 18.4 0 0 17.6-12 31.2-4.8 0 0 21.6 8.8 21.6 46.4L768 539.2s-5.6 7.2-11.2-10.4z\"  ></path></symbol><symbol id=\"icon-shezhi1\" viewBox=\"0 0 1024 1024\"><path d=\"M944.48 552.458667l-182.357333 330.666666a73.792 73.792 0 0 1-64.565334 38.325334h-362.133333a73.792 73.792 0 0 1-64.565333-38.325334l-182.357334-330.666666a75.338667 75.338667 0 0 1 0-72.682667l182.357334-330.666667a73.792 73.792 0 0 1 64.565333-38.325333h362.133333a73.792 73.792 0 0 1 64.565334 38.325333l182.357333 330.666667a75.338667 75.338667 0 0 1 0 72.682667z m-55.989333-31.146667a10.773333 10.773333 0 0 0 0-10.378667l-182.037334-330.666666a10.517333 10.517333 0 0 0-9.205333-5.482667H335.733333a10.517333 10.517333 0 0 0-9.205333 5.482667l-182.037333 330.666666a10.773333 10.773333 0 0 0 0 10.378667l182.037333 330.666667a10.517333 10.517333 0 0 0 9.205333 5.472h361.514667a10.517333 10.517333 0 0 0 9.205333-5.472l182.037334-330.666667zM513.738667 682.666667c-94.261333 0-170.666667-76.405333-170.666667-170.666667s76.405333-170.666667 170.666667-170.666667c94.250667 0 170.666667 76.405333 170.666666 170.666667s-76.416 170.666667-170.666666 170.666667z m0-64c58.912 0 106.666667-47.754667 106.666666-106.666667s-47.754667-106.666667-106.666666-106.666667-106.666667 47.754667-106.666667 106.666667 47.754667 106.666667 106.666667 106.666667z\"  ></path></symbol><symbol id=\"icon-haiguan\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m244.8 465.6s-12-32.8-12-77.6c0 0-2.4-8-4.8-0.8 0 0-1.6 41.6 0 44.8 0 0-11.2 0-14.4-48.8 0 0-0.8-8-2.4 0 0 0 0 42.4-7.2 16.8 0 0-6.4-23.2-7.2-37.6 0 0-4 2.4-6.4 13.6 0 0-7.2 0.8-9.6-29.6 0 0-2.4-7.2-4.8 0 0 0-3.2 11.2-1.6 16.8 0 0-10.4-1.6-9.6-32.8 0 0-6.4 3.2-4.8 14.4 0 0 0 7.2-4.8 0 0 0-13.6-12-28-7.2 0 0-4-0.8-14.4 10.4l-35.2 36.8s11.2 22.4 35.2 12.8c0 0 5.6-0.8 12-6.4 0 0 0.8-16 10.4-18.4 0 0 12.8-2.4 23.2 9.6 0 0 11.2 14.4-0.8 27.2 0 0-13.6 37.6-83.2 13.6 0 0 8.8 33.6-34.4 45.6l-3.2 3.2 61.6 52s12 11.2 26.4 0.8c0 0 41.6-26.4 77.6-3.2 0 0 53.6 35.2 31.2 107.2 0 0-27.2 88-112 73.6 0 0-73.6-31.2-56-96.8l6.4-20s8-12-8-22.4l-61.6-55.2s-12 32.8-62.4 33.6c0 0 4 61.6-64 51.2L291.2 767.2l-4-3.2 87.2-120s-16-64.8 46.4-64l4-4s-15.2-42.4 28-60l-192-166.4s-11.2-8.8 0.8-27.2c0 0 16-8.8 29.6 4l192 153.6 4.8-4.8s3.2-38.4 45.6-42.4c0 0 3.2-12.8-6.4-28.8 0 0-12.8-22.4 0-40.8 0 0 10.4-16.8 32.8-8 0 0 21.6 9.6 10.4 23.2 0 0-8.8 8-13.6 8.8 0 0-3.2 34.4 18.4 32l36.8-40.8s10.4-12-4.8-24c0 0-13.6-7.2 3.2-12 0 0 6.4 0.8 7.2-4.8 0 0 1.6-3.2-12-3.2 0 0-21.6 2.4-20-5.6l19.2-3.2s7.2-3.2-2.4-3.2l-21.6-0.8s-11.2 0.8-16-6.4l24-0.8s6.4 0 4.8-5.6c0 0 0-2.4-8-2.4l-49.6-1.6s-3.2-4.8 10.4-5.6l24.8-0.8s6.4-0.8-0.8-4.8c0 0 1.6-0.8-9.6-2.4l-46.4-3.2s-11.2-6.4-0.8-8l50.4-1.6s6.4-4 0-7.2H478.4s-4.8 1.6-9.6-6.4c0 0-1.6-4.8 7.2-6.4l114.4-2.4s37.6 0.8 44 36.8c0 0 2.4 11.2 1.6 27.2 0 0 4 11.2 12 8.8 0 0 8 3.2 17.6-9.6 0 0 2.4-8 3.2-13.6 0 0 0.8-16.8 25.6-15.2 0 0 17.6 7.2 25.6 23.2 0 0 8.8 9.6-3.2 20 0 0-7.2 10.4-21.6 10.4 0 0-15.2 4-14.4 18.4 0 0 0.8 21.6 24.8 18.4 0 0 17.6-12 31.2-4.8 0 0 21.6 8.8 21.6 46.4L768 540s-5.6 6.4-11.2-10.4z\"  ></path></symbol><symbol id=\"icon-shangchuan\" viewBox=\"0 0 1024 1024\"><path d=\"M565.333333 779.914667l51.445334-54.912a31.733333 31.733333 0 0 1 45.226666-1.226667 32.64 32.64 0 0 1 1.216 45.770667l-97.418666 104a37.034667 37.034667 0 0 1-52.821334 1.397333l-108.362666-104.202667a32.64 32.64 0 0 1-1.152-45.770666 31.733333 31.733333 0 0 1 45.248-1.173334L501.333333 774.421333V512.074667c0-17.877333 14.325333-32.373333 32-32.373334s32 14.506667 32 32.373334v267.84zM512 138.666667c123.018667 0 228.213333 86.709333 259.424 206.88C864.298667 347.146667 938.666667 426.090667 938.666667 522.688c0 97.6-75.914667 177.173333-170.133334 177.173333-17.674667 0-32-14.496-32-32.373333 0-17.877333 14.325333-32.373333 32-32.373333 58.357333 0 106.133333-50.08 106.133334-112.426667 0-62.336-47.776-112.416-106.133334-112.416-5.856 0-11.626667 0.501333-17.301333 1.482667-17.621333 3.050667-34.304-9.098667-37.024-26.986667C698.346667 280.693333 612.714667 203.424 512 203.424c-73.834667 0-140.928 41.536-177.376 107.861333a31.914667 31.914667 0 0 1-30.122667 16.576 140.373333 140.373333 0 0 0-9.568-0.32c-80.149333 0-145.6 68.586667-145.6 153.781334 0 85.184 65.450667 153.792 145.6 153.792 17.674667 0 32 14.496 32 32.373333 0 17.877333-14.325333 32.373333-32 32.373333C178.912 699.861333 85.333333 601.770667 85.333333 481.322667c0-118.314667 90.293333-215.061333 203.456-218.453334C338.090667 186.24 421.013333 138.666667 512 138.666667z\"  ></path></symbol><symbol id=\"icon-touchengkongyun\" viewBox=\"0 0 1024 1024\"><path d=\"M64 768h896v64H64v-64z m893.6-337.6c-9.6-32-45.6-51.2-81.6-42.4l-221.6 52.8c-8.8 2.4-17.6 0.8-24.8-4l-376-244c-4-2.4-8-3.2-12.8-2.4l-51.2 12c-12 3.2-16.8 17.6-8 26.4l213.6 224c16.8 17.6 8 47.2-16 52.8L228.8 544c-8.8 2.4-18.4 0-25.6-4.8l-69.6-48.8c-4-2.4-8.8-3.2-12.8-2.4l-35.2 8.8c-10.4 2.4-16 15.2-9.6 24L144 627.2l21.6 33.6c7.2 11.2 20.8 16.8 34.4 13.6l48.8-12 234.4-56 192-46.4 234.4-56c36.8-8.8 57.6-41.6 48-73.6z\"  ></path></symbol><symbol id=\"icon-shequ\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667-191.029333 426.666667-426.666667 426.666667z m0-64c200.298667 0 362.666667-162.368 362.666667-362.666667S712.298667 149.333333 512 149.333333 149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667zM368.864 684.309333a32 32 0 1 1 40.917333-49.205333A159.189333 159.189333 0 0 0 512 672c37.888 0 73.674667-13.173333 102.186667-36.885333a32 32 0 0 1 40.917333 49.216A223.178667 223.178667 0 0 1 512 736a223.178667 223.178667 0 0 1-143.136-51.690667z\"  ></path></symbol><symbol id=\"icon-weicheng\" viewBox=\"0 0 1024 1024\"><path d=\"M64 768h896v64H64v-64z m868-121.6c2.4-32.8-25.6-63.2-61.6-67.2l-240-27.2-277.6-369.6c-2.4-3.2-6.4-5.6-11.2-6.4l-52.8-6.4c-12-1.6-21.6 11.2-16.8 22.4l146.4 335.2-224-25.6-56.8-81.6c-2.4-4-6.4-6.4-11.2-6.4l-36-4c-11.2-1.6-20 8.8-17.6 19.2L100.8 552l8.8 39.2c3.2 13.6 14.4 23.2 28 24.8l49.6 5.6 240 27.2L623.2 672l240 27.2c36 4 67.2-20 68.8-52.8z\"  ></path></symbol><symbol id=\"icon-shengyinguanbi\" viewBox=\"0 0 1024 1024\"><path d=\"M257.493333 322.4l215.573334-133.056c24.981333-15.413333 57.877333-7.914667 73.493333 16.746667 5.301333 8.373333 8.106667 18.048 8.106667 27.914666v555.989334C554.666667 819.093333 530.784 842.666667 501.333333 842.666667c-9.994667 0-19.786667-2.773333-28.266666-8L257.493333 701.6H160c-41.237333 0-74.666667-33.013333-74.666667-73.738667V396.138667c0-40.725333 33.429333-73.738667 74.666667-73.738667h97.493333z m26.133334 58.4a32.298667 32.298667 0 0 1-16.96 4.8H160c-5.888 0-10.666667 4.714667-10.666667 10.538667v231.733333c0 5.813333 4.778667 10.538667 10.666667 10.538667h106.666667c5.994667 0 11.872 1.664 16.96 4.8L490.666667 770.986667V253.013333L283.626667 380.8zM832.565333 518.4l86.474667 86.474667a30.570667 30.570667 0 1 1-43.232 43.242666L789.333333 561.653333l-86.474666 86.474667a30.570667 30.570667 0 1 1-43.232-43.242667l86.474666-86.474666-86.474666-86.474667a30.570667 30.570667 0 1 1 43.232-43.232L789.333333 475.178667l86.474667-86.474667a30.570667 30.570667 0 1 1 43.232 43.232l-86.474667 86.474667z\"  ></path></symbol><symbol id=\"icon-caiwu\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m36 384H704v64H544.8v64H704v64H544.8v193.6h-64V640H320v-64h160.8v-64H320v-64h157.6L332 302.4l45.6-45.6 136 136 136-136 45.6 45.6L548 448z\"  ></path></symbol><symbol id=\"icon-shibai\" viewBox=\"0 0 1024 1024\"><path d=\"M878.08 731.274667a32 32 0 0 1-54.88-32.938667A360.789333 360.789333 0 0 0 874.666667 512c0-200.298667-162.368-362.666667-362.666667-362.666667S149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667a360.789333 360.789333 0 0 0 186.314667-51.445334 32 32 0 0 1 32.928 54.88A424.778667 424.778667 0 0 1 512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667c0 78.293333-21.152 153.568-60.586667 219.274667zM555.232 512l86.474667 86.474667a30.570667 30.570667 0 1 1-43.232 43.232L512 555.232l-86.474667 86.474667a30.570667 30.570667 0 1 1-43.232-43.232L468.768 512l-86.474667-86.474667a30.570667 30.570667 0 1 1 43.232-43.232L512 468.768l86.474667-86.474667a30.570667 30.570667 0 1 1 43.232 43.232L555.232 512z\"  ></path></symbol><symbol id=\"icon-caiwu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 832c-212 0-384-172-384-384s172-384 384-384 384 172 384 384-172 384-384 384z m36-448H704v64H544.8v64H704v64H544.8v193.6h-64V640H320v-64h160.8v-64H320v-64h157.6L332 302.4l45.6-45.6 136 136 136-136 45.6 45.6L548 448z\"  ></path></symbol><symbol id=\"icon-shijian1\" viewBox=\"0 0 1024 1024\"><path d=\"M878.08 731.274667a32 32 0 0 1-54.88-32.938667A360.789333 360.789333 0 0 0 874.666667 512c0-200.298667-162.368-362.666667-362.666667-362.666667S149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667a360.789333 360.789333 0 0 0 186.314667-51.445334 32 32 0 0 1 32.928 54.88A424.778667 424.778667 0 0 1 512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667c0 78.293333-21.152 153.568-60.586667 219.274667z m-548.704-81.898667L480 498.741333V320a32 32 0 0 1 64 0v192a32 32 0 0 1-9.376 22.624l-160 160a32 32 0 1 1-45.248-45.248z\"  ></path></symbol><symbol id=\"icon-mianfei\" viewBox=\"0 0 1024 1024\"><path d=\"M383.2 512H320v-64h127.2l16-16-130.4-129.6 45.6-45.6 130.4 130.4 249.6-249.6C688 91.2 604 64 512.8 64c-247.2 0-448 200.8-448 448 0 90.4 27.2 174.4 73.6 245.6L383.2 512zM115.2 872l45.6 45.6 63.2-63.2C301.6 920 403.2 960 512.8 960c247.2 0 448-200.8 448-448 0-110.4-40-211.2-106.4-289.6l58.4-58.4-45.6-45.6M704 640H545.6v193.6h-64V640h-44l108-108V576H704v64z m0-128H565.6l64-64H704v64z\"  ></path></symbol><symbol id=\"icon-shengyin\" viewBox=\"0 0 1024 1024\"><path d=\"M257.493333 322.4l215.573334-133.056c24.981333-15.413333 57.877333-7.914667 73.493333 16.746667 5.301333 8.373333 8.106667 18.048 8.106667 27.914666v555.989334C554.666667 819.093333 530.784 842.666667 501.333333 842.666667c-9.994667 0-19.786667-2.773333-28.266666-8L257.493333 701.6H160c-41.237333 0-74.666667-33.013333-74.666667-73.738667V396.138667c0-40.725333 33.429333-73.738667 74.666667-73.738667h97.493333z m26.133334 58.4a32.298667 32.298667 0 0 1-16.96 4.8H160c-5.888 0-10.666667 4.714667-10.666667 10.538667v231.733333c0 5.813333 4.778667 10.538667 10.666667 10.538667h106.666667c5.994667 0 11.872 1.664 16.96 4.8L490.666667 770.986667V253.013333L283.626667 380.8zM800.906667 829.653333a32.288 32.288 0 0 1-45.248-0.757333 31.317333 31.317333 0 0 1 0.768-44.693333c157.653333-150.464 157.653333-393.962667 0-544.426667a31.317333 31.317333 0 0 1-0.768-44.682667 32.288 32.288 0 0 1 45.248-0.757333c183.68 175.306667 183.68 460.010667 0 635.317333z m-106.901334-126.186666a32.288 32.288 0 0 1-45.248-1.216 31.328 31.328 0 0 1 1.237334-44.672c86.229333-80.608 86.229333-210.56 0-291.178667a31.328 31.328 0 0 1-1.237334-44.672 32.288 32.288 0 0 1 45.248-1.216c112.885333 105.546667 112.885333 277.418667 0 382.965333z\"  ></path></symbol><symbol id=\"icon-mianfei-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M137.6 756C91.2 685.6 64 601.6 64 511.2c0-247.2 200.8-448 448-448 90.4 0 174.4 27.2 245.6 73.6l-46.4 46.4c-58.4-35.2-126.4-56-198.4-56-212 0-384 172-384 384 0 72.8 20 140.8 56 198.4l-47.2 46.4zM320 448v64h62.4l64-64H320z m56.8-192l-45.6 45.6L461.6 432l45.6-45.6L376.8 256z m490.4-138.4l45.6 45.6-58.4 58.4C920 300 960 400.8 960 511.2c0 247.2-200.8 448-448 448-110.4 0-211.2-40-289.6-106.4l-63.2 63.2-45.6-45.6M896 511.2c0-92.8-32.8-177.6-87.2-244L628.8 448H704v64H564.8l-20 20V576H704v64H544.8v192h-64V640h-44l-168.8 167.2c66.4 54.4 151.2 87.2 244 87.2 212 0.8 384-172 384-383.2z\"  ></path></symbol><symbol id=\"icon-shoucang1\" viewBox=\"0 0 1024 1024\"><path d=\"M335.008 916.629333c-35.914667 22.314667-82.88 10.773333-104.693333-25.557333a77.333333 77.333333 0 0 1-8.96-57.429333l46.485333-198.24a13.141333 13.141333 0 0 0-4.021333-12.864l-152.16-132.586667c-31.605333-27.52-35.253333-75.648-8.234667-107.733333a75.68 75.68 0 0 1 51.733333-26.752L354.848 339.2c4.352-0.362667 8.245333-3.232 10.026667-7.594667l76.938666-188.170666c16.032-39.2 60.618667-57.92 99.52-41.461334a76.309333 76.309333 0 0 1 40.832 41.461334l76.938667 188.16c1.781333 4.373333 5.674667 7.253333 10.026667 7.605333l199.712 16.277333c41.877333 3.413333 72.885333 40.458667 69.568 82.517334a76.938667 76.938667 0 0 1-26.08 51.978666l-152.16 132.586667c-3.541333 3.082667-5.141333 8.074667-4.021334 12.853333l46.485334 198.24c9.621333 41.013333-15.36 82.336-56.138667 92.224a75.285333 75.285333 0 0 1-57.525333-9.237333l-170.976-106.24a11.296 11.296 0 0 0-12.010667 0l-170.986667 106.24zM551.786667 756.032l170.976 106.24c2.624 1.621333 5.717333 2.122667 8.650666 1.408 6.410667-1.557333 10.56-8.426667 8.928-15.424l-46.485333-198.24a77.141333 77.141333 0 0 1 24.277333-75.733333L870.293333 441.706667c2.485333-2.165333 4.053333-5.312 4.330667-8.746667 0.565333-7.136-4.490667-13.173333-10.976-13.696l-199.712-16.288a75.989333 75.989333 0 0 1-64.064-47.168l-76.938667-188.16a12.309333 12.309333 0 0 0-6.538666-6.741333c-5.898667-2.496-12.725333 0.373333-15.328 6.741333l-76.949334 188.16a75.989333 75.989333 0 0 1-64.064 47.168l-199.701333 16.288a11.68 11.68 0 0 0-7.978667 4.181333 13.226667 13.226667 0 0 0 1.333334 18.261334l152.16 132.586666a77.141333 77.141333 0 0 1 24.277333 75.733334l-46.485333 198.229333a13.333333 13.333333 0 0 0 1.514666 9.877333c3.488 5.792 10.581333 7.530667 16.064 4.128l170.986667-106.229333a75.296 75.296 0 0 1 79.562667 0z\"  ></path></symbol><symbol id=\"icon-tuikuan\" viewBox=\"0 0 1024 1024\"><path d=\"M933.6 360.8c0 17.6-14.4 32-32 32-13.6 0-25.6-8.8-29.6-20.8C815.2 229.6 676 128 513.6 128c-212 0-384 172-384 384s172 384 384 384c80.8 0 156.8-25.6 218.4-68.8L674.4 768h159.2v163.2l-56-56.8C704 928 612.8 960 513.6 960c-247.2 0-448-200.8-448-448s200.8-448 448-448c189.6 0 351.2 117.6 416.8 283.2 0.8 0.8 0.8 1.6 0.8 2.4 0 0.8 0.8 1.6 0.8 2.4 0.8 3.2 1.6 5.6 1.6 8.8zM704 512v-64H548l145.6-145.6-45.6-45.6-136 136-136-136-45.6 45.6L477.6 448H320v64h160v64H320v64h160v192h64V640h160v-64H544v-64h160z\"  ></path></symbol><symbol id=\"icon-shouji\" viewBox=\"0 0 1024 1024\"><path d=\"M256 85.333333h512c64.8 0 117.333333 52.533333 117.333333 117.333334v618.666666c0 64.8-52.533333 117.333333-117.333333 117.333334H256c-64.8 0-117.333333-52.533333-117.333333-117.333334V202.666667c0-64.8 52.533333-117.333333 117.333333-117.333334z m0 64a53.333333 53.333333 0 0 0-53.333333 53.333334v618.666666a53.333333 53.333333 0 0 0 53.333333 53.333334h512a53.333333 53.333333 0 0 0 53.333333-53.333334V202.666667a53.333333 53.333333 0 0 0-53.333333-53.333334H256z m170.666667 618.666667a32 32 0 0 1 0-64h170.666666a32 32 0 0 1 0 64H426.666667z\"  ></path></symbol><symbol id=\"icon-jisuanqilishuai\" viewBox=\"0 0 1024 1024\"><path d=\"M800 64H224c-17.6 0-32 14.4-32 32v832c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V96c0-17.6-14.4-32-32-32z m-416 768h-64v-64h64v64z m0-160h-64v-64h64v64z m0-160h-64v-64h64v64z m160 320h-64v-64h64v64z m0-160h-64v-64h64v64z m0-160h-64v-64h64v64z m160 320h-64v-64h64v64z m0-160h-64v-64h64v64z m0-160h-64v-64h64v64z m0-192H320V192h384v128z\"  ></path></symbol><symbol id=\"icon-shouye1\" viewBox=\"0 0 1024 1024\"><path d=\"M155.584 342.56l312.874667-224.565333a74.666667 74.666667 0 0 1 87.082666 0l312.874667 224.565333A117.333333 117.333333 0 0 1 917.333333 437.866667V800c0 64.8-52.533333 117.333333-117.333333 117.333333H224c-64.8 0-117.333333-52.533333-117.333333-117.333333V437.877333a117.333333 117.333333 0 0 1 48.917333-95.317333z m37.322667 51.989333A53.333333 53.333333 0 0 0 170.666667 437.877333V800a53.333333 53.333333 0 0 0 53.333333 53.333333h576a53.333333 53.333333 0 0 0 53.333333-53.333333V437.877333a53.333333 53.333333 0 0 0-22.24-43.328L518.218667 169.984a10.666667 10.666667 0 0 0-12.437334 0L192.906667 394.56z\"  ></path></symbol><symbol id=\"icon-jisuanqilishuai-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M768 128v768H256V128h512m32-64H224c-17.6 0-32 14.4-32 32v832c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V96c0-17.6-14.4-32-32-32zM704 192H320v128h384V192zM384 448h-64v64h64v-64z m160 0h-64v64h64v-64z m160 0h-64v64h64v-64zM384 608h-64v64h64v-64z m160 0h-64v64h64v-64z m160 0h-64v64h64v-64zM384 768h-64v64h64v-64z m160 0h-64v64h64v-64z m160 0h-64v64h64v-64z\"  ></path></symbol><symbol id=\"icon-shuju\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667-191.029333 426.666667-426.666667 426.666667z m0-64c200.298667 0 362.666667-162.368 362.666667-362.666667S712.298667 149.333333 512 149.333333 149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667z m8.213333-265.674667l-81.429333-88.704-95.754667 99.264a32 32 0 1 1-46.058666-44.437333l119.36-123.733334a32 32 0 0 1 46.613333 0.576l81.792 89.109334 136.608-136.992a32 32 0 1 1 45.312 45.184l-160.213333 160.682666a32 32 0 0 1-46.24-0.96z\"  ></path></symbol><symbol id=\"icon-checkbox-weixuan\" viewBox=\"0 0 1024 1024\"><path d=\"M832 192v640H192V192h640m32-64H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32z\"  ></path></symbol><symbol id=\"icon-shuaxin1\" viewBox=\"0 0 1024 1024\"><path d=\"M822.496 473.152a32 32 0 0 0-31.392 55.776l97.450667 54.848c20.32 11.434667 45.653333-2.005333 47.594666-25.248 1.674667-20.16 2.517333-35.573333 2.517334-46.528C938.666667 276.362667 747.637333 85.333333 512 85.333333S85.333333 276.362667 85.333333 512s191.029333 426.666667 426.666667 426.666667c144.106667 0 276.053333-72.032 354.752-189.536a32 32 0 1 0-53.173333-35.616C746.645333 813.461333 634.538667 874.666667 512 874.666667c-200.298667 0-362.666667-162.368-362.666667-362.666667s162.368-362.666667 362.666667-362.666667c197.098667 0 357.472 157.226667 362.538667 353.109334l-52.042667-29.290667z\"  ></path></symbol><symbol id=\"icon-checkbox-xuanzhong\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM428 718.4l-45.6 45.6-45.6-45.6-116-117.6 45.6-45.6L383.2 672l367.2-367.2 45.6 45.6-368 368z\"  ></path></symbol><symbol id=\"icon-sousuo1\" viewBox=\"0 0 1024 1024\"><path d=\"M797.525333 752.266667c62.069333-72.736 97.28-165.002667 97.28-262.186667C894.816 266.528 713.621333 85.333333 490.08 85.333333 266.538667 85.333333 85.333333 266.538667 85.333333 490.069333 85.333333 713.610667 266.538667 894.826667 490.069333 894.826667a404.693333 404.693333 0 0 0 118.208-17.546667 32 32 0 0 0-18.666666-61.216 340.693333 340.693333 0 0 1-99.541334 14.762667C301.888 830.816 149.333333 678.261333 149.333333 490.069333 149.333333 301.888 301.888 149.333333 490.069333 149.333333 678.261333 149.333333 830.826667 301.888 830.826667 490.069333c0 89.28-35.381333 173.696-97.141334 237.322667a36.992 36.992 0 0 0 0.384 51.925333l149.973334 149.973334a32 32 0 0 0 45.258666-45.248L797.525333 752.266667z\"  ></path></symbol><symbol id=\"icon-Raidobox-weixuan\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z\"  ></path></symbol><symbol id=\"icon-tanhao\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667 0 78.293333-21.152 153.568-60.586667 219.274667a32 32 0 0 1-54.88-32.938667A360.789333 360.789333 0 0 0 874.666667 512c0-200.298667-162.368-362.666667-362.666667-362.666667S149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667a360.789333 360.789333 0 0 0 186.314667-51.445334 32 32 0 0 1 32.928 54.88A424.778667 424.778667 0 0 1 512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333z m0 565.333334a42.666667 42.666667 0 1 1 0 85.333333 42.666667 42.666667 0 0 1 0-85.333333z m0-362.666667a42.666667 42.666667 0 0 1 42.666667 42.666667v234.666666a42.666667 42.666667 0 1 1-85.333334 0V330.666667a42.666667 42.666667 0 0 1 42.666667-42.666667z\"  ></path></symbol><symbol id=\"icon-Raidobox-xuanzhong\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 640c-106.4 0-192-85.6-192-192s85.6-192 192-192 192 85.6 192 192-85.6 192-192 192z\"  ></path><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 640c-106.4 0-192-85.6-192-192s85.6-192 192-192 192 85.6 192 192-85.6 192-192 192z\"  ></path></symbol><symbol id=\"icon-taolunqu\" viewBox=\"0 0 1024 1024\"><path d=\"M518.965333 847.498667c-21.290667 3.84-43.232 5.834667-65.632 5.834666a366.4 366.4 0 0 1-189.002666-52.181333 2118.4 2118.4 0 0 0-15.306667-8.981333l-86.944 23.712c-23.893333 6.506667-45.813333-15.402667-39.296-39.296l23.68-86.848c-8.821333-15.008-14.656-25.152-17.632-30.709334A366.485333 366.485333 0 0 1 85.333333 485.333333C85.333333 282.090667 250.090667 117.333333 453.333333 117.333333c185.514667 0 338.965333 137.269333 364.32 315.776A255.850667 255.850667 0 0 1 938.666667 650.666667c0 42.709333-10.496 83.978667-30.261334 120.842666-1.792 3.338667-4.992 8.928-9.696 16.96l14.613334 53.557334c6.506667 23.893333-15.402667 45.813333-39.296 39.296l-53.642667-14.634667-6.229333 3.669333A254.933333 254.933333 0 0 1 682.666667 906.666667a255.061333 255.061333 0 0 1-163.701334-59.168z m79.861334-24.042667A191.36 191.36 0 0 0 682.666667 842.666667a190.933333 190.933333 0 0 0 98.570666-27.2c2.208-1.322667 8.288-4.874667 18.517334-10.837334a32 32 0 0 1 24.522666-3.210666l12.565334 3.424-3.424-12.565334a32 32 0 0 1 3.338666-24.725333 996.672 996.672 0 0 0 15.242667-26.293333A190.997333 190.997333 0 0 0 874.666667 650.666667a191.68 191.68 0 0 0-54.634667-134.186667C808.458667 654.570667 720.650667 770.965333 598.826667 823.466667z m-387.050667-129.92l-12.512 45.866667 45.866667-12.512a32 32 0 0 1 24.522666 3.221333c15.253333 8.885333 24.373333 14.218667 27.594667 16.149333A302.4 302.4 0 0 0 453.333333 789.333333C621.226667 789.333333 757.333333 653.226667 757.333333 485.333333S621.226667 181.333333 453.333333 181.333333 149.333333 317.44 149.333333 485.333333c0 50.794667 12.448 99.712 35.904 143.456 3.104 5.792 10.933333 19.306667 23.2 40.021334a32 32 0 0 1 3.338667 24.725333zM586.666667 373.333333a32 32 0 0 1 0 64H320a32 32 0 0 1 0-64h266.666667zM458.666667 533.333333a32 32 0 0 1 0 64H320a32 32 0 0 1 0-64h138.666667z\"  ></path></symbol><symbol id=\"icon-checkbox-xuanzhongbufen\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM768 544H256v-64h512v64z\"  ></path></symbol><symbol id=\"icon-tianjiayouhuiquan\" viewBox=\"0 0 1024 1024\"><path d=\"M821.333333 138.666667c64.8 0 117.333333 52.533333 117.333334 117.333333v149.333333a32 32 0 0 1-32 32 74.666667 74.666667 0 0 0 0 149.333334 32 32 0 0 1 32 32v149.333333c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V618.666667a32 32 0 0 1 32-32 74.666667 74.666667 0 0 0 0-149.333334 32 32 0 0 1-32-32V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666z m0 64H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v121.045333C210.485333 391.488 256 446.432 256 512c0 65.568-45.514667 120.512-106.666667 134.954667V768a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V646.954667C813.514667 632.512 768 577.568 768 512c0-65.568 45.514667-120.512 106.666667-134.954667V256a53.333333 53.333333 0 0 0-53.333334-53.333333zM512 378.666667a32 32 0 0 1 32 32l-0.010667 74.666666H618.666667a32 32 0 0 1 31.946666 30.122667L650.666667 517.333333a32 32 0 0 1-32 32h-74.666667v74.666667a32 32 0 0 1-30.122667 31.946667L512 656a32 32 0 0 1-32-32v-74.666667h-74.666667a32 32 0 0 1-31.946666-30.122666L373.333333 517.333333a32 32 0 0 1 32-32h74.656l0.010667-74.666666a32 32 0 0 1 30.122667-31.946667z\"  ></path></symbol><symbol id=\"icon-youxiajiaogouxuan\" viewBox=\"0 0 1024 1024\"><path d=\"M256 1024h768V256l-768 768z m493.6-108.8L704 960l-45.6-45.6L576 832l45.6-45.6L704 869.6l210.4-210.4 45.6 45.6-210.4 210.4z\"  ></path></symbol><symbol id=\"icon-tishi\" viewBox=\"0 0 1024 1024\"><path d=\"M544 789.333333h105.173333a10.666667 10.666667 0 0 0 10.666667-10.666666v-0.362667l-3.232-94.304a32 32 0 0 1 14.293333-27.765333C750.933333 603.189333 800 513.792 800 416c0-159.061333-128.938667-288-288-288S224 256.938667 224 416c0 97.813333 49.098667 187.232 129.141333 240.266667a32 32 0 0 1 14.314667 25.578666l3.338667 97.184a10.666667 10.666667 0 0 0 10.666666 10.304H480V572.693333l-76.64-81.429333a32 32 0 0 1 46.613333-43.861333l63.36 67.328 72.693334-68.661334a32 32 0 0 1 43.946666 46.528L544 573.792V789.333333z m320-373.333333a351.530667 351.530667 0 0 1-142.826667 283.146667l2.634667 76.96A74.666667 74.666667 0 0 1 649.173333 853.333333h-267.733333a74.666667 74.666667 0 0 1-74.624-72.106666l-2.784-81.194667A351.541333 351.541333 0 0 1 160 416C160 221.6 317.6 64 512 64s352 157.6 352 352zM416 960a32 32 0 0 1 0-64h192a32 32 0 0 1 0 64H416z\"  ></path></symbol><symbol id=\"icon-sousuo-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M384 128c140.8 0 256 115.2 256 256S524.8 640 384 640 128 524.8 128 384s115.2-256 256-256m0-64C207.2 64 64 207.2 64 384s143.2 320 320 320 320-143.2 320-320S560.8 64 384 64z m294.4 569.6l-45.6 45.6 272 272 45.6-45.6-272-272z\"  ></path></symbol><symbol id=\"icon-tupian1\" viewBox=\"0 0 1024 1024\"><path d=\"M938.666667 553.92V768c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v297.92z m-64-74.624V256a53.333333 53.333333 0 0 0-53.333334-53.333333H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v344.48A290.090667 290.090667 0 0 1 192 597.333333a286.88 286.88 0 0 1 183.296 65.845334C427.029333 528.384 556.906667 437.333333 704 437.333333c65.706667 0 126.997333 16.778667 170.666667 41.962667z m0 82.24c-5.333333-8.32-21.130667-21.653333-43.648-32.917333C796.768 511.488 753.045333 501.333333 704 501.333333c-121.770667 0-229.130667 76.266667-270.432 188.693334-2.730667 7.445333-7.402667 20.32-13.994667 38.581333-7.68 21.301333-34.453333 28.106667-51.370666 13.056-16.437333-14.634667-28.554667-25.066667-36.138667-31.146667A222.890667 222.890667 0 0 0 192 661.333333c-14.464 0-28.725333 1.365333-42.666667 4.053334V768a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V561.525333zM320 480a96 96 0 1 1 0-192 96 96 0 0 1 0 192z m0-64a32 32 0 1 0 0-64 32 32 0 0 0 0 64z\"  ></path></symbol><symbol id=\"icon-shezhi-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M588.8 128l12 83.2 4.8 34.4 31.2 14.4c12.8 6.4 26.4 13.6 38.4 21.6l28 18.4 31.2-12 81.6-32 76 127.2-67.2 51.2-28 21.6 3.2 35.2c0.8 7.2 0.8 14.4 0.8 20.8s0 13.6-0.8 20.8l-3.2 35.2 28 21.6 67.2 51.2-75.2 127.2-82.4-32-31.2-12-28 18.4c-12.8 8.8-25.6 16-38.4 21.6l-31.2 14.4-4.8 33.6-12 84H435.2l-12-83.2-4.8-34.4-31.2-14.4c-12.8-6.4-26.4-13.6-38.4-21.6l-28-18.4-31.2 12L208 768l-76-127.2 67.2-51.2 28-21.6-3.2-35.2c-0.8-7.2-0.8-14.4-0.8-20.8s0-13.6 0.8-20.8l3.2-35.2-28-21.6-67.2-51.2L207.2 256l82.4 32 31.2 12 28-18.4c12.8-8.8 25.6-16 38.4-21.6l31.2-14.4 4.8-33.6L435.2 128h153.6m8.8-64H426.4c-27.2 0-49.6 19.2-53.6 44.8L360 201.6c-16 7.2-31.2 16-47.2 26.4l-90.4-35.2c-6.4-2.4-12.8-3.2-19.2-3.2-19.2 0-37.6 9.6-46.4 26.4L71.2 360c-13.6 22.4-8 52 12.8 68l76 57.6c-0.8 9.6-1.6 18.4-1.6 26.4s0 16.8 1.6 26.4l-76 57.6c-20.8 16-26.4 44-12.8 68l84.8 143.2c9.6 16.8 28 27.2 47.2 27.2 6.4 0 12-0.8 18.4-3.2L312 796c15.2 10.4 31.2 19.2 47.2 26.4l13.6 92c3.2 25.6 26.4 45.6 53.6 45.6h171.2c27.2 0 49.6-19.2 53.6-44.8l13.6-92.8c16-7.2 31.2-16 47.2-26.4l90.4 35.2c6.4 2.4 12.8 3.2 19.2 3.2 19.2 0 37.6-9.6 46.4-26.4l85.6-144.8c12.8-23.2 7.2-51.2-13.6-67.2l-76-57.6c0.8-8 1.6-16.8 1.6-26.4 0-9.6-0.8-18.4-1.6-26.4l76-57.6c20.8-16 26.4-44 12.8-68l-84.8-143.2c-9.6-16.8-28-27.2-47.2-27.2-6.4 0-12 0.8-18.4 3.2L712 228c-15.2-10.4-31.2-19.2-47.2-26.4l-13.6-92c-4-26.4-26.4-45.6-53.6-45.6zM512 384c70.4 0 128 57.6 128 128s-57.6 128-128 128-128-57.6-128-128 57.6-128 128-128m0-64c-105.6 0-192 86.4-192 192s86.4 192 192 192 192-86.4 192-192-86.4-192-192-192z\"  ></path></symbol><symbol id=\"icon-tuipiao\" viewBox=\"0 0 1024 1024\"><path d=\"M485.333333 565.333333v-42.666666H405.333333a32 32 0 1 1 0-64h47.232l-71.818666-86.186667a32 32 0 1 1 49.173333-40.96L512 430.005333l82.08-98.506666a32 32 0 1 1 49.173333 40.981333L571.434667 458.666667H618.666667a32 32 0 1 1 0 64h-69.333334v42.666666H618.666667a32 32 0 1 1 0 64h-69.333334v42.666667a32 32 0 0 1-64 0v-42.666667H405.333333a32 32 0 1 1 0-64h80z m337.162667-92.181333l52.053333 29.290667C869.461333 306.56 709.098667 149.333333 512 149.333333c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667c122.538667 0 234.645333-61.194667 301.578667-161.152a32 32 0 1 1 53.173333 35.616C788.064 866.634667 656.117333 938.666667 512 938.666667 276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667c0 10.954667-0.853333 26.357333-2.517334 46.528-1.930667 23.242667-27.274667 36.682667-47.594666 25.248l-97.450667-54.848a32 32 0 1 1 31.392-55.786667z\"  ></path></symbol><symbol id=\"icon-shezhi\" viewBox=\"0 0 1024 1024\"><path d=\"M940 596l-76-57.6c0.8-8 1.6-16.8 1.6-26.4s-0.8-18.4-1.6-26.4l76-57.6c20.8-16 26.4-44 12.8-68l-84.8-143.2c-9.6-16.8-28-27.2-47.2-27.2-6.4 0-12 0.8-18.4 3.2L712 228c-15.2-10.4-31.2-19.2-47.2-26.4l-13.6-92c-4-26.4-26.4-45.6-53.6-45.6H426.4c-27.2 0-49.6 19.2-53.6 44.8L360 201.6c-16 7.2-31.2 16-47.2 26.4l-90.4-35.2c-6.4-2.4-12.8-3.2-19.2-3.2-19.2 0-37.6 9.6-46.4 26.4L71.2 360c-13.6 22.4-8 52 12.8 68l76 57.6c-0.8 9.6-1.6 18.4-1.6 26.4s0 16.8 1.6 26.4l-76 57.6c-20.8 16-26.4 44-12.8 68l84.8 143.2c9.6 16.8 28 27.2 47.2 27.2 6.4 0 12-0.8 18.4-3.2L312 796c15.2 10.4 31.2 19.2 47.2 26.4l13.6 92c3.2 25.6 26.4 45.6 53.6 45.6h171.2c27.2 0 49.6-19.2 53.6-44.8l13.6-92.8c16-7.2 31.2-16 47.2-26.4l90.4 35.2c6.4 2.4 12.8 3.2 19.2 3.2 19.2 0 37.6-9.6 46.4-26.4l85.6-144.8c12.8-23.2 7.2-51.2-13.6-67.2zM704 512c0 105.6-86.4 192-192 192S320 617.6 320 512s86.4-192 192-192 192 86.4 192 192z\"  ></path></symbol><symbol id=\"icon-weixuanzhong\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667-191.029333 426.666667-426.666667 426.666667z m0-64c200.298667 0 362.666667-162.368 362.666667-362.666667S712.298667 149.333333 512 149.333333 149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667z\"  ></path></symbol><symbol id=\"icon-shouye\" viewBox=\"0 0 1024 1024\"><path d=\"M919.2 419.2L531.2 141.6c-11.2-8-26.4-8-36.8 0L104 419.2c-12.8 8.8-6.4 28.8 9.6 28.8H192v432c0 8.8 7.2 16 16 16h192c8.8 0 16-7.2 16-16V640h192v240c0 8.8 7.2 16 16 16h192c8.8 0 16-7.2 16-16V448h78.4c15.2 0 21.6-20 8.8-28.8z\"  ></path></symbol><symbol id=\"icon-weibo\" viewBox=\"0 0 1024 1024\"><path d=\"M507.722667 393.525333c3.018667-0.202667 5.685333-0.618667 7.594666-1.141333 15.626667-12.458667 47.68-28.864 76.8-37.802667 48-14.72 90.24-12.16 118.421334 18.688 8.490667 9.301333 14.346667 19.562667 17.386666 30.698667 6.314667 23.04 2.453333 37.184-11.754666 69.248-10.506667 23.722667-11.146667 29.888-3.808 39.530667 4.896 6.410667 10.432 8.917333 22.293333 10.24 3.157333 0.362667 5.749333 0.554667 12.373333 0.96 57.472 3.605333 84.970667 26.922667 84.970667 98.538666 0 86.901333-60.821333 158.005333-160.138667 208.64C592.554667 871.530667 491.818667 896 415.072 896c-90.773333 0-175.872-18.026667-237.312-59.882667C93.546667 778.752 63.68 683.445333 101.514667 553.536c30.154667-103.541333 158.357333-246.88 279.114666-298.4 27.082667-11.562667 61.685333-13.962667 86.709334-1.706667 38.378667 18.773333 44.693333 61.184 20.128 111.946667-9.525333 19.68-8.576 22.368-0.426667 25.525333 5.514667 2.133333 13.226667 3.104 20.682667 2.624z m-77.866667-56.021333c6.293333-13.013333 8.597333-22.101333 8.341333-27.018667-6.613333-2.368-21.568-1.130667-32.458666 3.52C302.528 358.026667 187.733333 486.4 162.965333 571.424c-30.368 104.245333-9.557333 170.656 50.826667 211.786667C262.56 816.448 335.978667 832 415.072 832c66.592 0 157.365333-22.048 227.722667-57.898667C722.944 733.248 768 680.565333 768 622.485333c0-12.224-1.12-21.141333-2.986667-27.029333-1.002667-3.168-1.76-4.373333-2.24-4.768-1.226667-1.056-5.418667-1.962667-19.744-2.858667a283.594667 283.594667 0 0 1-15.498666-1.237333c-27.701333-3.093333-49.088-12.768-66.069334-35.061333-25.749333-33.781333-22.901333-61.141333-3.808-104.234667 7.904-17.856 9.397333-23.317333 8.544-26.432-0.277333-1.034667-1.056-2.4-2.912-4.426667-7.125333-7.797333-25.525333-8.917333-52.384-0.672-12.373333 3.797333-25.301333 9.258667-37.130666 15.445334-9.12 4.768-16.714667 9.578667-18.837334 11.445333-19.178667 16.821333-60.981333 19.541333-90.986666 7.936-44.064-17.056-59.456-60.672-34.08-113.088z m505.834667 85.610667a32 32 0 1 1-63.253334-9.706667C873.92 403.733333 874.666667 393.92 874.666667 384c0-106.037333-85.962667-192-192-192-2.794667 0-5.578667 0.064-8.352 0.181333a32 32 0 1 1-2.730667-63.946666c3.690667-0.16 7.381333-0.234667 11.082667-0.234667 141.386667 0 256 114.613333 256 256 0 13.173333-1.002667 26.24-2.976 39.114667z m-104.288-14.976a32 32 0 1 1-63.744-5.717334A85.333333 85.333333 0 0 0 682.666667 309.333333a32 32 0 0 1 0-64c82.474667 0 149.333333 66.858667 149.333333 149.333334 0 4.512-0.202667 9.013333-0.597333 13.472z\"  ></path></symbol><symbol id=\"icon-shouye-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512.8 206.4L768 389.6V832H640V576H384v256H256V389.6l256.8-183.2m0-71.2c-6.4 0-12.8 1.6-18.4 5.6L104 419.2c-12.8 8.8-6.4 28.8 9.6 28.8H192v432c0 8.8 7.2 16 16 16h224c8.8 0 16-7.2 16-16V640h128v240c0 8.8 7.2 16 16 16h224c8.8 0 16-7.2 16-16V448h78.4c15.2 0 21.6-20 9.6-28.8L531.2 141.6c-5.6-4-12-6.4-18.4-6.4z\"  ></path></symbol><symbol id=\"icon-wenjuan\" viewBox=\"0 0 1024 1024\"><path d=\"M895.946667 734.048l1.066666 1.013333a29.824 29.824 0 0 1 0 43.413334l-162.261333 152.96a31.925333 31.925333 0 0 1-22.762667 8.704 31.925333 31.925333 0 0 1-22.773333-8.704l-93.184-87.84a29.824 29.824 0 0 1 0-43.413334l1.077333-1.013333a32 32 0 0 1 43.904 0l70.976 66.901333 140.053334-132.021333a32 32 0 0 1 43.904 0zM768 85.333333c64.8 0 117.333333 52.533333 117.333333 117.333334v394.666666a32 32 0 0 1-64 0V202.666667a53.333333 53.333333 0 0 0-53.333333-53.333334H256a53.333333 53.333333 0 0 0-53.333333 53.333334v618.666666a53.333333 53.333333 0 0 0 53.333333 53.333334h234.666667a32 32 0 0 1 0 64H256c-64.8 0-117.333333-52.533333-117.333333-117.333334V202.666667c0-64.8 52.533333-117.333333 117.333333-117.333334zM554.666667 544a32 32 0 0 1 0 64H341.333333a32 32 0 0 1 0-64z m128-170.666667a32 32 0 0 1 0 64H341.333333a32 32 0 0 1 0-64z\"  ></path></symbol><symbol id=\"icon-sousuo\" viewBox=\"0 0 1024 1024\"><path d=\"M704 627.2h-40.8l-14.4-14.4c50.4-58.4 80-133.6 80-216C728.8 212.8 580 64 396 64S64.8 213.6 64.8 396.8s148.8 332.8 332.8 332.8c82.4 0 158.4-30.4 216-80l14.4 14.4v40l256 255.2 76-76c-0.8 0-256-256-256-256z m-307.2 0c-127.2 0-230.4-103.2-230.4-230.4s103.2-230.4 230.4-230.4 230.4 103.2 230.4 230.4-103.2 230.4-230.4 230.4z\"  ></path></symbol><symbol id=\"icon-wode\" viewBox=\"0 0 1024 1024\"><path d=\"M885.333333 96c23.786667 0 39.253333 25.034667 28.618667 46.314667a7024.8 7024.8 0 0 0-56.917333 116.234666A424.853333 424.853333 0 0 1 938.666667 509.589333c0 235.637333-191.029333 426.666667-426.666667 426.666667s-426.666667-191.029333-426.666667-426.666667c0-235.648 191.029333-426.666667 426.666667-426.666666a424.938667 424.938667 0 0 1 196.544 47.872C762.453333 107.573333 821.482667 96 885.333333 96z m-164.234666 99.381333a32 32 0 0 1-29.696-1.066666A360.821333 360.821333 0 0 0 512 146.933333c-200.298667 0-362.666667 162.368-362.666667 362.666667 0 200.288 162.368 362.666667 362.666667 362.666667s362.666667-162.378667 362.666667-362.666667a360.96 360.96 0 0 0-79.850667-227.061333 32 32 0 0 1-4-33.706667 5870.922667 5870.922667 0 0 1 41.322667-85.589333c-39.786667 4.970667-76.768 15.701333-111.04 32.149333zM330.666667 362.666667a42.666667 42.666667 0 0 1 42.666666 42.666666v64a42.666667 42.666667 0 1 1-85.333333 0v-64a42.666667 42.666667 0 0 1 42.666667-42.666666z m170.666666 0a42.666667 42.666667 0 0 1 42.666667 42.666666v64a42.666667 42.666667 0 1 1-85.333333 0v-64a42.666667 42.666667 0 0 1 42.666666-42.666666z\"  ></path></symbol><symbol id=\"icon-wenti-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 127.2c176.8 0 320 143.2 320 320C832 596.8 725.6 728 580 760l-28 5.6-14.4 24.8-24.8 42.4-24-42.4-14.4-24.8-28-5.6C299.2 729.6 192 597.6 192 447.2c0-176.8 143.2-320 320-320m0-64c-212 0-384 172-384 384 0 184.8 131.2 340 305.6 376l80 138.4 80-138.4c172.8-38.4 302.4-192 302.4-376 0-212-172-384-384-384z m0 128c-71.2 0-128.8 58.4-128.8 128.8H448c0-35.2 28.8-64.8 64-64.8s64 28.8 64 64c0 17.6-7.2 33.6-18.4 44.8l-39.2 40c-23.2 23.2-37.6 56.8-37.6 92v80h64v-64c0-47.2 14.4-67.2 37.6-91.2l28.8-29.6c18.4-18.4 29.6-44 29.6-72-0.8-70.4-58.4-128-128.8-128zM480 704h64v-64h-64v64z\"  ></path></symbol><symbol id=\"icon-weixin3\" viewBox=\"0 0 1024 1024\"><path d=\"M767.818667 409.173333C867.338667 444.266667 938.666667 539.136 938.666667 650.666667c0 42.709333-10.496 83.978667-30.261334 120.842666-1.792 3.338667-4.992 8.928-9.696 16.96l14.613334 53.557334c6.506667 23.893333-15.402667 45.813333-39.296 39.296l-53.642667-14.634667-6.229333 3.669333A254.933333 254.933333 0 0 1 682.666667 906.666667c-77.994667 0-147.84-34.88-194.805334-89.888a352.608 352.608 0 0 1-56.64 4.554666c-63.338667 0-124.266667-16.853333-177.472-48.298666-1.834667-1.088-6.410667-3.733333-13.632-7.893334l-80.544 21.653334c-23.914667 6.432-45.76-15.573333-39.146666-39.434667l21.792-78.752a961.205333 961.205333 0 0 1-15.904-27.317333A336.384 336.384 0 0 1 85.333333 480c0-188.618667 154.965333-341.333333 345.888-341.333333 159.914667 0 297.984 108.010667 335.818667 259.296 0.949333 3.765333 1.173333 7.552 0.778667 11.2z m-68.106667-13.952C662.88 282.037333 555.178667 202.666667 431.221333 202.666667 275.434667 202.666667 149.333333 326.933333 149.333333 480c0 46.272 11.498667 90.837333 33.194667 130.698667 2.88 5.290667 10.176 17.706667 21.621333 36.746666a32 32 0 0 1 3.413334 25.013334l-10.517334 37.994666 39.232-10.549333a32 32 0 0 1 24.234667 3.146667c14.272 8.192 22.773333 13.098667 25.802667 14.890666A283.882667 283.882667 0 0 0 431.221333 757.333333c6.154667 0 12.288-0.192 18.389334-0.576A255.061333 255.061333 0 0 1 426.666667 650.666667c0-141.386667 114.613333-256 256-256 5.728 0 11.413333 0.192 17.045333 0.554666z m133.706667 397.056a32 32 0 0 1 3.338666-24.725333 996.672 996.672 0 0 0 15.242667-26.293333A190.997333 190.997333 0 0 0 874.666667 650.666667c0-106.037333-85.962667-192-192-192s-192 85.962667-192 192 85.962667 192 192 192a190.933333 190.933333 0 0 0 98.570666-27.2c2.208-1.322667 8.288-4.874667 18.517334-10.837334a32 32 0 0 1 24.522666-3.210666l12.565334 3.424-3.424-12.565334zM330.666667 426.666667a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z m192 0a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z m85.333333 202.666666a32 32 0 1 1 0-64 32 32 0 0 1 0 64z m149.333333 0a32 32 0 1 1 0-64 32 32 0 0 1 0 64z\"  ></path></symbol><symbol id=\"icon-wenti\" viewBox=\"0 0 1024 1024\"><path d=\"M512 63.2c-212 0-384 172-384 384 0 184.8 131.2 340 305.6 376l80 138.4 80-138.4c172.8-38.4 302.4-192 302.4-376 0-212-172-384-384-384zM544 704h-64v-64h64v64z m66.4-312.8l-28.8 29.6c-22.4 24-37.6 44-37.6 91.2v64h-64v-79.2c0-35.2 14.4-68.8 37.6-92l40-40.8c12-11.2 19.2-27.2 19.2-45.6 0-35.2-28.8-64-64-64S448 284 448 319.2h-64c0-71.2 57.6-128.8 128.8-128.8 71.2 0 128.8 57.6 128.8 128.8-0.8 28-12.8 54.4-31.2 72z\"  ></path></symbol><symbol id=\"icon-wodeguanzhu\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c129.6 0 234.666667 105.066667 234.666667 234.666667 0 84.256-44.394667 158.133333-111.072 199.52a425.28 425.28 0 0 1 152.853333 83.466667 32 32 0 1 1-41.493333 48.736A361.045333 361.045333 0 0 0 512 565.333333c-188.672 0-345.429333 144.672-361.344 331.413334a32 32 0 0 1-63.765333-5.429334c15.114667-177.322667 138.048-322.346667 301.546666-371.786666C321.76 478.165333 277.333333 404.266667 277.333333 320c0-129.6 105.066667-234.666667 234.666667-234.666667z m415.946667 627.381334l1.066666 1.013333a29.824 29.824 0 0 1 0 43.413333l-162.261333 152.96a31.925333 31.925333 0 0 1-22.762667 8.704 31.925333 31.925333 0 0 1-22.773333-8.704l-93.184-87.84a29.824 29.824 0 0 1 0-43.413333l1.077333-1.013333a32 32 0 0 1 43.904 0l70.976 66.901333 140.053334-132.021333a32 32 0 0 1 43.904 0zM512 149.333333c-94.261333 0-170.666667 76.405333-170.666667 170.666667s76.405333 170.666667 170.666667 170.666667 170.666667-76.405333 170.666667-170.666667-76.405333-170.666667-170.666667-170.666667z\"  ></path></symbol><symbol id=\"icon-dianhua-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M375.2 480.8c36 72.8 94.4 132.8 165.6 169.6l55.2-56.8c6.4-7.2 16.8-9.6 25.6-6.4 28 9.6 58.4 14.4 89.6 14.4 13.6 0 24.8 12 24.8 25.6v89.6c0 14.4-11.2 25.6-24.8 25.6-236 0-427.2-196-427.2-438.4 0-14.4 11.2-25.6 24.8-25.6h88c13.6 0 24.8 11.2 24.8 25.6 0 32 4.8 63.2 14.4 92.8 2.4 8.8 0.8 19.2-6.4 26.4l-54.4 57.6zM512 128c-212 0-384 172-384 384s172 384 384 384 384-172 384-384-172-384-384-384m0-64c247.2 0 448 200.8 448 448s-200.8 448-448 448S64 759.2 64 512 264.8 64 512 64z\"  ></path></symbol><symbol id=\"icon-xiami\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 64c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667 362.666667-162.368 362.666667-362.666667-162.368-362.666667-362.666667-362.666667z m-72 113.216l78.464 59.765334a32 32 0 1 1-38.784 50.912l-27.072-20.618667v39.978667a74.666667 74.666667 0 0 1 68.618667 74.432v89.962666a74.666667 74.666667 0 0 1-68.608 74.432v39.978667L479.808 650.666667a32 32 0 0 1 38.784 50.912l-78.602667 59.872c-21.056 16.053333-51.392 1.024-51.392-25.450667v-104.586667A74.666667 74.666667 0 0 1 320 556.981333v-89.962666a74.666667 74.666667 0 0 1 68.608-74.432V288c0-26.474667 30.336-41.493333 51.392-25.450667z m105.6 145.045334c0-26.485333 30.325333-41.514667 51.392-25.461334l137.066667 104.416a32 32 0 0 1 0 50.901334L597.013333 641.845333c-21.066667 16.042667-51.392 1.024-51.392-25.450666z m-99.04 48.746666H394.666667a10.666667 10.666667 0 0 0-10.666667 10.666667v89.973333a10.666667 10.666667 0 0 0 10.666667 10.666667h51.893333a10.666667 10.666667 0 0 0 10.666667-10.666667v-89.962666a10.666667 10.666667 0 0 0-10.666667-10.666667zM609.6 472.213333l0.010667 79.594667L661.856 512l-52.245333-39.797333z\"  ></path></symbol><symbol id=\"icon-liaotianduihua\" viewBox=\"0 0 1024 1024\"><path d=\"M510.4 63.2c-212 0-384 172-384 384 0 184.8 131.2 340 305.6 376l80 138.4 80-138.4C764.8 785.6 894.4 632 894.4 448c0-212.8-172-384.8-384-384.8zM319.2 512c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64zM512 512c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z m191.2 0c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z\"  ></path></symbol><symbol id=\"icon-xiangkan\" viewBox=\"0 0 1024 1024\"><path d=\"M512 185.493333C567.786667 138.176 608.213333 117.333333 667.786667 117.333333c126.229333 0 212.714667 76.736 248.341333 202.848a32 32 0 0 1-61.589333 17.386667C826.208 237.312 763.125333 181.333333 667.786667 181.333333c-41.514667 0-70.357333 15.253333-117.077334 55.253334-2.165333 1.856-14.4 12.416-17.952 15.434666a32 32 0 0 1-41.514666 0c-3.552-3.018667-15.786667-13.578667-17.952-15.434666-46.72-40-75.562667-55.253333-117.077334-55.253334C230.112 181.333333 149.333333 282.368 149.333333 428.096c0 110.965333 113.269333 248.885333 343.573334 408.8a32.522667 32.522667 0 0 0 37.205333-0.16c47.445333-33.536 78.997333-56.426667 94.282667-68.373333a32 32 0 1 1 39.413333 50.432c-16.362667 12.778667-48.48 36.085333-96.746667 70.208a96.522667 96.522667 0 0 1-110.666666 0.458666C210.272 718.56 85.333333 566.432 85.333333 428.096 85.333333 249.770667 191.221333 117.333333 356.213333 117.333333 415.786667 117.333333 456.213333 138.176 512 185.493333zM821.333333 554.666667h85.333334a32 32 0 0 1 0 64h-85.333334v85.333333a32 32 0 0 1-64 0v-85.333333h-85.333333a32 32 0 0 1 0-64h85.333333v-85.333334a32 32 0 0 1 64 0v85.333334z\"  ></path></symbol><symbol id=\"icon-liaotianduihua-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M511.2 127.2c176.8 0 320 143.2 320 320 0 149.6-106.4 281.6-252 312.8l-28 5.6-14.4 24.8-24.8 42.4-24-42.4-14.4-24.8-28-5.6c-147.2-30.4-254.4-162.4-254.4-313.6 0-176 143.2-319.2 320-319.2m0-64c-212 0-384 172-384 384 0 184.8 131.2 340 305.6 376l80 138.4 80-138.4C765.6 785.6 895.2 632 895.2 448c0-212.8-172-384.8-384-384.8zM320 384c-35.2 0-64 28.8-64 64s28.8 64 64 64 64-28.8 64-64-28.8-64-64-64z m192 0c-35.2 0-64 28.8-64 64s28.8 64 64 64 64-28.8 64-64-28.8-64-64-64z m192 0c-35.2 0-64 28.8-64 64s28.8 64 64 64 64-28.8 64-64-28.8-64-64-64z\"  ></path></symbol><symbol id=\"icon-xiangji\" viewBox=\"0 0 1024 1024\"><path d=\"M269.44 256l23.296-75.381333A74.666667 74.666667 0 0 1 364.074667 128h295.850666a74.666667 74.666667 0 0 1 71.338667 52.618667L754.56 256H821.333333c64.8 0 117.333333 52.533333 117.333334 117.333333v426.666667c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V373.333333c0-64.8 52.533333-117.333333 117.333334-117.333333h66.773333z m23.605333 64H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v426.666667a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V373.333333a53.333333 53.333333 0 0 0-53.333334-53.333333h-90.378666a32 32 0 0 1-30.570667-22.549333l-30.272-97.930667a10.666667 10.666667 0 0 0-10.186667-7.52H364.074667a10.666667 10.666667 0 0 0-10.186667 7.52l-30.272 97.92A32 32 0 0 1 293.045333 320zM512 725.333333c-88.362667 0-160-71.637333-160-160 0-88.362667 71.637333-160 160-160 88.362667 0 160 71.637333 160 160 0 88.362667-71.637333 160-160 160z m0-64a96 96 0 1 0 0-192 96 96 0 0 0 0 192z\"  ></path></symbol><symbol id=\"icon-dianhua\" viewBox=\"0 0 1024 1024\"><path d=\"M282.4 460C344 580.8 443.2 680 564 741.6L657.6 648c11.2-11.2 28.8-15.2 43.2-10.4 48 16 100 24 152.8 24 23.2 0 42.4 19.2 42.4 42.4v148.8c0 23.2-19.2 42.4-42.4 42.4C452.8 896 128 571.2 128 170.4c0-23.2 19.2-42.4 42.4-42.4H320c23.2 0 42.4 18.4 42.4 41.6 0 53.6 8.8 104.8 24 152.8 4.8 15.2 1.6 31.2-10.4 43.2L282.4 460z\"  ></path></symbol><symbol id=\"icon-xiaoxi\" viewBox=\"0 0 1024 1024\"><path d=\"M821.333333 800H547.584l-86.464 96.074667a32 32 0 1 1-47.573333-42.816l96-106.666667A32 32 0 0 1 533.333333 736h288a53.333333 53.333333 0 0 0 53.333334-53.333333V234.666667a53.333333 53.333333 0 0 0-53.333334-53.333334H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333334v448a53.333333 53.333333 0 0 0 53.333334 53.333333h138.666666a32 32 0 0 1 0 64H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V234.666667c0-64.8 52.533333-117.333333 117.333334-117.333334h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333334v448c0 64.8-52.533333 117.333333-117.333334 117.333333zM704 341.333333a32 32 0 0 1 0 64H320a32 32 0 0 1 0-64h384zM512 512a32 32 0 0 1 0 64H320a32 32 0 0 1 0-64h192z\"  ></path></symbol><symbol id=\"icon-dianhua-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m224 654.4c0 14.4-11.2 25.6-24.8 25.6-236 0-427.2-196-427.2-438.4 0-14.4 11.2-25.6 24.8-25.6h88c13.6 0 24.8 11.2 24.8 25.6 0 32 4.8 63.2 14.4 92.8 2.4 8.8 0.8 19.2-6.4 26.4l-55.2 56.8c36 72.8 94.4 132.8 165.6 169.6l55.2-56.8c6.4-7.2 16.8-9.6 25.6-6.4 28 9.6 58.4 14.4 89.6 14.4 13.6 0 24.8 12 24.8 25.6v90.4z\"  ></path></symbol><symbol id=\"icon-xiazai\" viewBox=\"0 0 1024 1024\"><path d=\"M507.136 514.944c3.072-4.362667 7.210667-7.925333 12.032-10.314667a37.365333 37.365333 0 0 1 46.634667 6.144l97.418666 102.794667a32 32 0 0 1-46.442666 44.021333L565.333333 603.317333V853.333333a32 32 0 1 1-64 0V608.757333l-52.618666 50.016a32 32 0 0 1-44.096-46.4l102.517333-97.429333zM512 138.666667c123.018667 0 228.213333 85.696 259.424 204.469333C864.298667 344.736 938.666667 422.752 938.666667 518.218667 938.666667 614.688 862.752 693.333333 768.533333 693.333333a32 32 0 0 1 0-64C826.890667 629.333333 874.666667 579.84 874.666667 518.218667c0-61.610667-47.776-111.104-106.133334-111.104-5.856 0-11.626667 0.490667-17.301333 1.461333a32 32 0 0 1-37.024-26.666667C698.346667 279.04 612.714667 202.666667 512 202.666667c-73.834667 0-140.928 41.066667-177.376 106.613333a32 32 0 0 1-30.122667 16.373333c-3.168-0.213333-6.357333-0.32-9.568-0.32C214.784 325.333333 149.333333 393.141333 149.333333 477.333333S214.784 629.333333 294.933333 629.333333a32 32 0 1 1 0 64C178.912 693.333333 85.333333 596.373333 85.333333 477.333333c0-116.938667 90.293333-212.554667 203.456-215.904C338.090667 185.696 421.013333 138.666667 512 138.666667z\"  ></path></symbol><symbol id=\"icon-xin-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M928 192H96c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-32 576H128V320l384 192 384-192v448zM512 448L128 256h768L512 448z\"  ></path></symbol><symbol id=\"icon-xiaojuchang\" viewBox=\"0 0 1024 1024\"><path d=\"M372.554667 164.021333a32 32 0 0 1 22.613333 59.861334C267.541333 272.106667 181.333333 394.613333 181.333333 533.333333a32 32 0 0 1-64 0c0-165.557333 102.890667-311.776 255.221334-369.312zM232.469333 811.946667a32 32 0 1 1 45.333334-45.173334A329.472 329.472 0 0 0 512 864a329.472 329.472 0 0 0 234.090667-97.12 32 32 0 0 1 45.301333 45.194667A393.461333 393.461333 0 0 1 512 928a393.461333 393.461333 0 0 1-279.530667-116.053333zM906.666667 533.333333a32 32 0 0 1-64 0c0-138.538667-85.984-260.928-213.365334-309.269333a32 32 0 1 1 22.709334-59.84C804.042667 221.941333 906.666667 368 906.666667 533.333333zM512 234.666667a64 64 0 1 1 0-128 64 64 0 0 1 0 128z m341.333333 501.333333a64 64 0 1 1 0-128 64 64 0 0 1 0 128z m-682.666666 0a64 64 0 1 1 0-128 64 64 0 0 1 0 128z\"  ></path></symbol><symbol id=\"icon-lingdang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 960c49.6 0 88-38.4 88-88H424c0 49.6 38.4 88 88 88z m288.8-286.4V444.8c0-137.6-97.6-252.8-224.8-283.2v-28.8c0-32-17.6-60.8-48-67.2-44-10.4-80 23.2-80 66.4v30.4C320.8 192 223.2 307.2 223.2 444.8v228.8L136 763.2v44.8h752v-44.8l-87.2-89.6z\"  ></path></symbol><symbol id=\"icon-xiaoshi\" viewBox=\"0 0 1024 1024\"><path d=\"M204.949333 362.666667h-11.52C163.626667 362.666667 138.666667 339.264 138.666667 309.333333v-85.333333c0-29.930667 24.96-53.333333 54.752-53.333333h4.266666a32 32 0 0 0 32-32c0-29.930667 24.96-53.333333 54.762667-53.333334h455.104c29.802667 0 54.762667 23.402667 54.762667 53.333334a32 32 0 0 0 32 32h4.266666C860.373333 170.666667 885.333333 194.069333 885.333333 224v85.333333c0 29.930667-24.96 53.333333-54.752 53.333334H269.12l34.272 462.613333A53.333333 53.333333 0 0 0 356.576 874.666667h310.848a53.333333 53.333333 0 0 0 53.184-49.386667l27.328-368.896a32 32 0 1 1 63.818667 4.725333l-27.317334 368.896A117.333333 117.333333 0 0 1 667.413333 938.666667H356.576a117.333333 117.333333 0 0 1-117.013333-108.661334L204.949333 362.666667zM821.333333 298.666667v-64.128A96.021333 96.021333 0 0 1 730.901333 149.333333H293.098667A96.021333 96.021333 0 0 1 202.666667 234.538667V298.666667h618.666666z\"  ></path></symbol><symbol id=\"icon-lingdang-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 212l48.8 12c101.6 24.8 176 117.6 176 220.8v254.4l18.4 18.4 24.8 25.6h-536l24.8-25.6 18.4-18.4V444.8c0-103.2 73.6-196.8 176-220.8l48.8-12M512 64c-36.8 0-64 30.4-64 68v30.4C320.8 192 223.2 307.2 223.2 444.8v228.8L136 763.2v44.8h752v-44.8l-87.2-89.6V444.8c0-137.6-97.6-252.8-224.8-283.2v-28.8c0-32-17.6-60.8-48-67.2-5.6-1.6-11.2-1.6-16-1.6z m88 808H424c0 49.6 38.4 88 88 88s88-38.4 88-88z\"  ></path></symbol><symbol id=\"icon-xiaoxizhongxin\" viewBox=\"0 0 1024 1024\"><path d=\"M192.032 631.402667V404.725333C192.032 228.330667 335.285333 85.333333 512 85.333333s319.968 142.997333 319.968 319.392v226.677334l60.608 121.013333c10.645333 21.237333-4.832 46.218667-28.618667 46.218667H160.042667c-23.786667 0-39.253333-24.981333-28.618667-46.218667l60.608-121.013333z m620.16 103.36l-40.842667-81.536a31.893333 31.893333 0 0 1-3.381333-14.282667V404.725333c0-141.12-114.602667-255.509333-255.968-255.509333S256.032 263.605333 256.032 404.725333V638.933333c0 4.96-1.162667 9.845333-3.381333 14.293334l-40.842667 81.525333h600.384z m-443.306667 152.32a31.893333 31.893333 0 0 1-4.149333-44.981334 32.032 32.032 0 0 1 45.056-4.138666A159.36 159.36 0 0 0 512 874.773333a159.36 159.36 0 0 0 102.186667-36.8 32.032 32.032 0 0 1 45.056 4.138667 31.893333 31.893333 0 0 1-4.16 44.981333A223.402667 223.402667 0 0 1 512 938.666667c-52.981333 0-103.2-18.453333-143.114667-51.594667z\"  ></path></symbol><symbol id=\"icon-xin\" viewBox=\"0 0 1024 1024\"><path d=\"M928 192H96c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-32 128L512 512 128 320v-64l384 192 384-192v64z\"  ></path></symbol><symbol id=\"icon-yinhangka\" viewBox=\"0 0 1024 1024\"><path d=\"M874.666667 394.666667H149.333333v373.333333a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V394.666667z m-725.333334-64h725.333334v-74.666667a53.333333 53.333333 0 0 0-53.333334-53.333333H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v74.666667z m608 341.333333a32 32 0 0 1 0 64H650.666667a32 32 0 0 1 0-64h106.666666zM202.666667 138.666667h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v512c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V256c0-64.8 52.533333-117.333333 117.333334-117.333333z\"  ></path></symbol><symbol id=\"icon-laba-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M448 282.4v459.2L301.6 594.4 282.4 576H192V448h90.4l18.4-18.4L448 282.4M512 128L256 384H128v256h128l256 256V128z m64 5.6v64.8c145.6 29.6 256 159.2 256 313.6s-110.4 284-256 313.6v64.8c181.6-30.4 320-188 320-378.4S757.6 164 576 133.6z m0 188.8v65.6c55.2 14.4 96 64 96 124s-40.8 109.6-96 124v65.6C666.4 686.4 736 607.2 736 512s-69.6-174.4-160-189.6z\"  ></path></symbol><symbol id=\"icon-yanjing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 832c-156.448 0-296.021333-98.730667-418.410667-291.605333a52.938667 52.938667 0 0 1 0-56.789334C215.978667 290.730667 355.552 192 512 192c156.448 0 296.021333 98.730667 418.410667 291.605333a52.938667 52.938667 0 0 1 0 56.789334C808.021333 733.269333 668.448 832 512 832z m0-576c-129.514667 0-249.461333 83.850667-360.117333 256C262.538667 684.149333 382.485333 768 512 768c129.514667 0 249.461333-83.850667 360.117333-256C761.461333 339.850667 641.514667 256 512 256z m0 405.333333c-83.210667 0-150.666667-66.858667-150.666667-149.333333S428.789333 362.666667 512 362.666667s150.666667 66.858667 150.666667 149.333333S595.210667 661.333333 512 661.333333z m0-64c47.552 0 86.101333-38.208 86.101333-85.333333S559.552 426.666667 512 426.666667c-47.552 0-86.101333 38.208-86.101333 85.333333s38.549333 85.333333 86.101333 85.333333z\"  ></path></symbol><symbol id=\"icon-laba\" viewBox=\"0 0 1024 1024\"><path d=\"M576 701.6v-65.6c55.2-14.4 96-64 96-124s-40.8-109.6-96-124v-65.6C666.4 337.6 736 416.8 736 512s-69.6 174.4-160 189.6z m0-568v64.8c145.6 29.6 256 159.2 256 313.6 0 154.4-110.4 284-256 313.6v64.8c181.6-30.4 320-188 320-378.4S757.6 164 576 133.6zM256 384H128v256h128l256 256V128L256 384z\"  ></path></symbol><symbol id=\"icon-yingchengka\" viewBox=\"0 0 1024 1024\"><path d=\"M202.666667 138.666667h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v512c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V256c0-64.8 52.533333-117.333333 117.333334-117.333333z m0 64a53.333333 53.333333 0 0 0-53.333334 53.333333v512a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V256a53.333333 53.333333 0 0 0-53.333334-53.333333H202.666667z m160 287.381333l22.794666-72.928a32 32 0 1 1 61.077334 19.093333l-53.333334 170.666667c-9.354667 29.941333-51.733333 29.941333-61.077333 0l-53.333333-170.666667a32 32 0 1 1 61.077333-19.093333L362.666667 490.048zM480 426.666667a32 32 0 0 1 64 0v170.666666a32 32 0 0 1-64 0V426.666667z m160 117.333333v53.333333a32 32 0 0 1-64 0V426.666667a32 32 0 0 1 32-32h64a74.666667 74.666667 0 0 1 0 149.333333h-32z m0-64h32a10.666667 10.666667 0 0 0 0-21.333333h-32v21.333333z\"  ></path></symbol><symbol id=\"icon-maikefeng-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c35.2 0 64 28.8 64 64v320c0 35.2-28.8 64-64 64s-64-28.8-64-64V192c0-35.2 28.8-64 64-64m0-64c-70.4 0-128 57.6-128 128v320c0 70.4 57.6 128 128 128s128-57.6 128-128V192c0-70.4-57.6-128-128-128z m320 448h-64c0 140.8-115.2 256-256 256S256 652.8 256 512h-64c0 165.6 126.4 302.4 288 318.4V960h64v-129.6c161.6-16 288-152.8 288-318.4z\"  ></path></symbol><symbol id=\"icon-yixiangkan\" viewBox=\"0 0 1024 1024\"><path d=\"M356.266667 117.333333c59.584 0 100.021333 20.842667 155.818666 68.16C567.872 138.176 608.32 117.333333 667.904 117.333333c126.261333 0 212.746667 76.736 248.384 202.848a32 32 0 1 1-61.6 17.386667C826.357333 237.312 763.274667 181.333333 667.914667 181.333333c-41.536 0-70.389333 15.253333-117.12 55.253334-2.165333 1.856-14.4 12.416-17.941334 15.434666a32.010667 32.010667 0 0 1-41.536 0c-3.541333-3.018667-15.786667-13.578667-17.952-15.434666C426.645333 196.586667 397.792 181.333333 356.266667 181.333333 230.133333 181.333333 149.333333 282.368 149.333333 428.096c0 110.965333 113.290667 248.885333 343.637334 408.8a32.533333 32.533333 0 0 0 37.216-0.16c47.456-33.536 79.018667-56.426667 94.293333-68.373333a32.010667 32.010667 0 0 1 39.424 50.432c-16.352 12.778667-48.48 36.085333-96.768 70.208a96.554667 96.554667 0 0 1-110.677333 0.458666C210.293333 718.56 85.333333 566.432 85.333333 428.096 85.333333 249.770667 191.242667 117.333333 356.266667 117.333333z m388 555.392a31.925333 31.925333 0 0 1-22.773334-8.704l-93.184-87.84a29.824 29.824 0 0 1 0-43.413333l1.077334-1.013333a32 32 0 0 1 43.904 0l70.976 66.912 140.053333-132.021334a32 32 0 0 1 43.904 0l1.066667 1.013334a29.824 29.824 0 0 1 0 43.413333L767.04 664.032a31.925333 31.925333 0 0 1-22.762667 8.693333z\"  ></path></symbol><symbol id=\"icon-shoucang\" viewBox=\"0 0 1024 1024\"><path d=\"M519.2 807.2l255.2 133.6c12 6.4 25.6-4 23.2-16.8L748.8 640c-0.8-4.8 0.8-10.4 4.8-14.4L960 424.8c9.6-9.6 4-25.6-8.8-27.2l-284.8-41.6c-5.6-0.8-9.6-4-12-8.8l-128-257.6c-5.6-12-23.2-12-28.8 0L370.4 348c-2.4 4.8-7.2 8-12 8.8L73.6 398.4c-13.6 1.6-18.4 17.6-8.8 27.2l206.4 200.8c4 4 5.6 8.8 4.8 14.4l-48.8 284c-2.4 12.8 11.2 23.2 23.2 16.8L505.6 808c4-3.2 8.8-3.2 13.6-0.8z\"  ></path></symbol><symbol id=\"icon-yingpingmoban\" viewBox=\"0 0 1024 1024\"><path d=\"M778.666667 117.333333c64.8 0 117.333333 52.533333 117.333333 117.333334v640c0 25.557333-28.48 40.8-49.749333 26.624l-77.162667-51.434667L708.266667 895.466667a42.666667 42.666667 0 0 1-51.2 0l-59.733334-44.8-59.733333 44.8a42.666667 42.666667 0 0 1-51.2 0l-59.733333-44.8-59.733334 44.8a42.666667 42.666667 0 0 1-51.2 0l-60.821333-45.610667-77.162667 51.434667C156.48 915.477333 128 900.224 128 874.666667V234.666667c0-64.8 52.533333-117.333333 117.333333-117.333334h533.333334z m0 64H245.333333a53.333333 53.333333 0 0 0-53.333333 53.333334v580.202666l39.968-26.645333a42.666667 42.666667 0 0 1 49.269333 1.376L341.333333 834.666667l59.733334-44.8a42.666667 42.666667 0 0 1 51.2 0l59.733333 44.8 59.733333-44.8a42.666667 42.666667 0 0 1 51.2 0l59.733334 44.8 60.096-45.066667a42.666667 42.666667 0 0 1 49.269333-1.376L832 814.869333V234.666667a53.333333 53.333333 0 0 0-53.333333-53.333334zM565.333333 522.666667a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64z m106.666667-170.666667a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64z\"  ></path></symbol><symbol id=\"icon-maikefeng\" viewBox=\"0 0 1024 1024\"><path d=\"M544 830.4V960h-64v-129.6c-161.6-16-288-152.8-288-318.4h64c0 140.8 115.2 256 256 256s256-115.2 256-256h64c0 165.6-126.4 302.4-288 318.4zM512 640c70.4 0 128-57.6 128-128V192c0-70.4-57.6-128-128-128s-128 57.6-128 128v320c0 70.4 57.6 128 128 128z\"  ></path></symbol><symbol id=\"icon-yanchu\" viewBox=\"0 0 1024 1024\"><path d=\"M608 383.989333c38.858667 29.194667 64 75.669333 64 128.010667 0 88.362667-71.637333 160-160 160-88.362667 0-160-71.637333-160-160 0-88.362667 71.637333-160 160-160 36.021333 0 69.258667 11.904 96 31.989333V181.333333a32 32 0 0 1 64 0v330.666667a32 32 0 0 1-64 0V383.989333zM512 85.333333a32 32 0 0 1 0 64c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667 362.666667-162.368 362.666667-362.666667a360.938667 360.938667 0 0 0-40.448-166.613333 32 32 0 1 1 56.821333-29.44A424.938667 424.938667 0 0 1 938.666667 512c0 235.637333-191.029333 426.666667-426.666667 426.666667S85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 522.666667a96 96 0 1 0 0-192 96 96 0 0 0 0 192z m213.333333-330.666667c-61.802667 0-117.333333-43.157333-117.333333-96s55.530667-96 117.333333-96c63.125333 0 117.333333 40.650667 117.333334 96s-54.208 96-117.333334 96z m0-64c31.125333 0 53.333333-16.650667 53.333334-32s-22.208-32-53.333334-32c-29.482667 0-53.333333 18.538667-53.333333 32s23.850667 32 53.333333 32z\"  ></path></symbol><symbol id=\"icon-xihuan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M700 192c92.8 0 166.4 72.8 166.4 166.4 0 129.6-133.6 251.2-336.8 435.2l-17.6 16-17.6-16C291.2 609.6 157.6 488 157.6 358.4c0-92.8 72.8-166.4 166.4-166.4 52.8 0 104.8 24 140 64.8l48.8 56.8 48.8-56.8c33.6-40 86.4-64.8 138.4-64.8m0-64c-72.8 0-142.4 33.6-188 87.2C466.4 162.4 396.8 128 324 128c-128.8 0-230.4 100.8-230.4 230.4 0 157.6 142.4 287.2 357.6 482.4L512 896l60.8-55.2c215.2-196 357.6-324.8 357.6-482.4 0-128.8-100.8-230.4-230.4-230.4z\"  ></path></symbol><symbol id=\"icon-xiaomi\" viewBox=\"0 0 1024 1024\"><path d=\"M512 864c-194.602667 0-352.362667-157.6-352.362667-352S317.397333 160 512 160c194.592 0 352.352 157.6 352.352 352S706.592 864 512 864z m0-64c159.210667 0 288.288-128.938667 288.288-288S671.221333 224 512 224c-159.221333 0-288.298667 128.938667-288.298667 288S352.768 800 512 800zM368.714667 684.309333a31.978667 31.978667 0 0 1-4.149334-45.066666 32.053333 32.053333 0 0 1 45.12-4.138667A159.456 159.456 0 0 0 512 672c37.930667 0 73.738667-13.173333 102.293333-36.885333a32.053333 32.053333 0 0 1 45.12 4.16 31.978667 31.978667 0 0 1-4.16 45.056A223.541333 223.541333 0 0 1 512 736a223.541333 223.541333 0 0 1-143.285333-51.690667zM75.477333 383.978667a32.042667 32.042667 0 0 1 60.373334 21.376 317.152 317.152 0 0 0-18.453334 106.485333c0 36.458667 6.282667 72.256 18.56 106.773333a32.042667 32.042667 0 0 1-60.373333 21.44 381.12 381.12 0 0 1-22.250667-128.213333c0-43.701333 7.509333-86.624 22.144-127.861333z m873.045334 0A381.088 381.088 0 0 1 970.666667 511.84a381.12 381.12 0 0 1-22.261334 128.213333 32.042667 32.042667 0 0 1-60.373333-21.44 317.184 317.184 0 0 0 18.56-106.773333c0-36.362667-6.24-72.053333-18.453333-106.485333a32.042667 32.042667 0 0 1 60.384-21.386667zM629.418667 362.666667h0.064a32 32 0 0 1 32 32v42.666666a32 32 0 0 1-32 32h-0.064a32 32 0 0 1-32-32v-42.666666a32 32 0 0 1 32-32z m-234.912 0h0.064a32 32 0 0 1 32 32v42.666666a32 32 0 0 1-32 32h-0.064a32 32 0 0 1-32-32v-42.666666a32 32 0 0 1 32-32z\"  ></path></symbol><symbol id=\"icon-shoucang-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 205.6L596 376c12 24 34.4 40 60 44l188.8 27.2-136 133.6c-19.2 18.4-27.2 44.8-23.2 71.2l32 188-168-89.6c-11.2-6.4-24-8.8-37.6-8.8-12.8 0-25.6 3.2-37.6 8.8l-168.8 88.8 32-188c4.8-25.6-4-52.8-23.2-71.2l-136-132.8 188.8-27.2C393.6 416 416 400 428 376L512 205.6m0-124.8c-5.6 0-11.2 3.2-14.4 8.8L370.4 348c-2.4 4.8-7.2 8-12 8.8L73.6 398.4c-13.6 1.6-18.4 17.6-8.8 27.2l206.4 200.8c4 4 5.6 8.8 4.8 14.4l-48.8 284c-1.6 10.4 6.4 18.4 16 18.4 2.4 0 4.8-0.8 7.2-1.6L505.6 808c2.4-1.6 4.8-1.6 7.2-1.6s4.8 0.8 7.2 1.6l255.2 133.6c2.4 1.6 4.8 1.6 7.2 1.6 9.6 0 17.6-8 16-18.4l-48.8-284c-0.8-4.8 0.8-10.4 4.8-14.4l206.4-200.8c9.6-9.6 4-25.6-8.8-27.2l-284.8-41.6c-5.6-0.8-9.6-4-12-8.8L526.4 89.6c-3.2-5.6-8.8-8.8-14.4-8.8z\"  ></path></symbol><symbol id=\"icon-yingyuan\" viewBox=\"0 0 1024 1024\"><path d=\"M864 853.333333a32 32 0 0 1 0 64H160a32 32 0 0 1 0-64z m-42.666667-746.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v540.309333a42.666667 42.666667 0 0 1-78.336 23.402667L672.405333 501.344C628.48 522.816 574.912 533.333333 512 533.333333s-116.48-10.517333-160.405333-31.989333L163.669333 787.712A42.666667 42.666667 0 0 1 85.333333 764.309333V224c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666z m0 64H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v468.906667l165.248-251.797334a32 32 0 0 1 44.501334-9.066666C395.978667 456.64 446.762667 469.333333 512 469.333333s116.021333-12.693333 152.917333-37.290666a32 32 0 0 1 44.501334 9.066666L874.666667 692.917333V224a53.333333 53.333333 0 0 0-53.333334-53.333333z\"  ></path></symbol><symbol id=\"icon-xihuan\" viewBox=\"0 0 1024 1024\"><path d=\"M512 896l-60.8-55.2C236 645.6 93.6 516 93.6 358.4 93.6 229.6 194.4 128 324 128c72.8 0 142.4 33.6 188 87.2C557.6 162.4 627.2 128 700 128c128.8 0 230.4 100.8 230.4 230.4 0 157.6-142.4 287.2-357.6 482.4L512 896z\"  ></path></symbol><symbol id=\"icon-zengjia\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333s426.666667 191.029333 426.666667 426.666667-191.029333 426.666667-426.666667 426.666667z m0-64c200.298667 0 362.666667-162.368 362.666667-362.666667S712.298667 149.333333 512 149.333333 149.333333 311.701333 149.333333 512s162.368 362.666667 362.666667 362.666667z m32-394.666667h128a32 32 0 0 1 0 64H544v128a32 32 0 0 1-64 0V544H352a32 32 0 0 1 0-64h128V352a32 32 0 0 1 64 0v128z\"  ></path></symbol><symbol id=\"icon-gengduo-hengxiang\" viewBox=\"0 0 1024 1024\"><path d=\"M320 512c0 35.2-28.8 64-64 64s-64-28.8-64-64 28.8-64 64-64 64 28.8 64 64z m192-64c-35.2 0-64 28.8-64 64s28.8 64 64 64 64-28.8 64-64-28.8-64-64-64z m256 0c-35.2 0-64 28.8-64 64s28.8 64 64 64 64-28.8 64-64-28.8-64-64-64z\"  ></path></symbol><symbol id=\"icon-yuyin\" viewBox=\"0 0 1024 1024\"><path d=\"M544 851.946667V906.666667a32 32 0 0 1-64 0v-54.72C294.688 835.733333 149.333333 680.170667 149.333333 490.666667v-21.333334a32 32 0 0 1 64 0v21.333334c0 164.949333 133.717333 298.666667 298.666667 298.666666s298.666667-133.717333 298.666667-298.666666v-21.333334a32 32 0 0 1 64 0v21.333334c0 189.514667-145.354667 345.066667-330.666667 361.28zM298.666667 298.56C298.666667 180.8 394.165333 85.333333 512 85.333333c117.781333 0 213.333333 95.541333 213.333333 213.226667v192.213333C725.333333 608.533333 629.834667 704 512 704c-117.781333 0-213.333333-95.541333-213.333333-213.226667V298.56z m64 0v192.213333C362.666667 573.12 429.557333 640 512 640c82.496 0 149.333333-66.805333 149.333333-149.226667V298.56C661.333333 216.213333 594.442667 149.333333 512 149.333333c-82.496 0-149.333333 66.805333-149.333333 149.226667z\"  ></path></symbol><symbol id=\"icon-gengduo-shuxiang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 704c35.2 0 64 28.8 64 64s-28.8 64-64 64-64-28.8-64-64 28.8-64 64-64z m-64-192c0 35.2 28.8 64 64 64s64-28.8 64-64-28.8-64-64-64-64 28.8-64 64z m0-256c0 35.2 28.8 64 64 64s64-28.8 64-64-28.8-64-64-64-64 28.8-64 64z\"  ></path></symbol><symbol id=\"icon-youhuiquan\" viewBox=\"0 0 1024 1024\"><path d=\"M821.333333 138.666667c64.8 0 117.333333 52.533333 117.333334 117.333333v149.333333a32 32 0 0 1-32 32 74.666667 74.666667 0 0 0 0 149.333334 32 32 0 0 1 32 32v149.333333c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V618.666667a32 32 0 0 1 32-32 74.666667 74.666667 0 0 0 0-149.333334 32 32 0 0 1-32-32V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666z m0 64H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v121.045333C210.485333 391.488 256 446.432 256 512c0 65.568-45.514667 120.512-106.666667 134.954667V768a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V646.954667C813.514667 632.512 768 577.568 768 512c0-65.568 45.514667-120.512 106.666667-134.954667V256a53.333333 53.333333 0 0 0-53.333334-53.333333zM384.853333 327.413333a32 32 0 0 1 45.066667 4.096L512 430.016l82.08-98.506667a32 32 0 1 1 49.173333 40.981334L571.413333 458.666667H618.666667a32 32 0 0 1 31.946666 30.122666L650.666667 490.666667a32 32 0 0 1-32 32h-69.333334v42.666666H618.666667a32 32 0 0 1 31.946666 30.122667L650.666667 597.333333a32 32 0 0 1-32 32h-69.333334v42.666667a32 32 0 0 1-30.122666 31.946667L517.333333 704a32 32 0 0 1-32-32v-42.666667H405.333333a32 32 0 0 1-31.946666-30.122666L373.333333 597.333333a32 32 0 0 1 32-32h80v-42.666666H405.333333a32 32 0 0 1-31.946666-30.122667L373.333333 490.666667a32 32 0 0 1 32-32h47.232l-71.818666-86.186667a32 32 0 0 1 2.581333-43.722667z\"  ></path></symbol><symbol id=\"icon-shijian-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 832c-212 0-384-172-384-384s172-384 384-384 384 172 384 384-172 384-384 384z m32-393.6l191.2 110.4-32 55.2L488.8 544H480V256h64v246.4z\"  ></path></symbol><symbol id=\"icon-WIFI\" viewBox=\"0 0 1024 1024\"><path d=\"M926.634667 294.912a32 32 0 1 1-39.936 50.005333C780.512 260.128 649.824 213.333333 512.053333 213.333333c-137.813333 0-268.544 46.826667-374.752 131.669334a32 32 0 1 1-39.936-50.005334C214.784 201.194667 359.562667 149.333333 512.053333 149.333333c152.437333 0 297.173333 51.818667 414.581334 145.578667z m-235.413334 298.133333a32 32 0 0 1-38.442666 51.178667A233.418667 233.418667 0 0 0 512.021333 597.333333c-51.541333 0-100.48 16.629333-140.8 46.912a32 32 0 1 1-38.442666-51.157333A297.408 297.408 0 0 1 512.021333 533.333333c65.504 0 127.893333 21.184 179.2 59.722667z m128-149.344a32 32 0 0 1-38.442666 51.168C703.829333 437.066667 610.378667 405.333333 512.032 405.333333c-98.368 0-191.850667 31.754667-268.8 89.578667a32 32 0 1 1-38.453333-51.157333C292.736 377.664 399.669333 341.333333 512.032 341.333333c112.32 0 219.242667 36.309333 307.189333 102.368zM512 853.333333a64 64 0 1 1 0-128 64 64 0 0 1 0 128z\"  ></path></symbol><symbol id=\"icon-shengboyuyinxiaoxi\" viewBox=\"0 0 1024 1024\"><path d=\"M160 640h-64V384h64v256z m768-256h-64v256h64V384z m-576-64h-64v384h64V320z m384 0h-64v384h64V320zM544 192h-64v640h64V192z\"  ></path></symbol><symbol id=\"icon-zhibo\" viewBox=\"0 0 1024 1024\"><path d=\"M725.333333 364.32l105.386667-52.458667A74.666667 74.666667 0 0 1 938.666667 378.698667v270.186666a74.666667 74.666667 0 0 1-109.194667 66.197334L725.333333 660.778667V704c0 64.8-52.533333 117.333333-117.333333 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V320c0-64.8 52.533333-117.333333 117.333334-117.333333h405.333333c64.8 0 117.333333 52.533333 117.333333 117.333333v44.32z m0 71.498667V588.586667l133.738667 69.738666A10.666667 10.666667 0 0 0 874.666667 648.874667V378.698667a10.666667 10.666667 0 0 0-15.424-9.546667L725.333333 435.818667zM661.333333 704V320a53.333333 53.333333 0 0 0-53.333333-53.333333H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v384a53.333333 53.333333 0 0 0 53.333334 53.333333h405.333333a53.333333 53.333333 0 0 0 53.333333-53.333333zM288 469.333333a64 64 0 1 1 0-128 64 64 0 0 1 0 128z\"  ></path></symbol><symbol id=\"icon-shijian\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m191.2 604L488.8 544H480V256h64v246.4l191.2 110.4-32 55.2z\"  ></path></symbol><symbol id=\"icon-youkuhuiyuan\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 64c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667 362.666667-162.368 362.666667-362.666667-162.368-362.666667-362.666667-362.666667z m182.933333 503.328l1.141334 0.074667a9.173333 9.173333 0 0 1 7.850666 8.032l0.074667 1.152v37.045333l-0.053333 2.026667c-0.992 18.837333-15.765333 33.930667-34.208 34.954667L667.733333 736l-1.984-0.053333c-18.442667-1.024-33.205333-16.106667-34.208-34.954667l-0.053333-2.026667v-37.045333l0.074667-1.152a9.173333 9.173333 0 0 1 7.850666-8.032l1.130667-0.074667 1.141333 0.074667a9.173333 9.173333 0 0 1 7.861334 8.032l0.064 1.152v37.045333l0.064 1.6c0.746667 8.949333 7.733333 16.074667 16.501333 16.853334l1.557333 0.064 1.568-0.074667c8.757333-0.768 15.744-7.893333 16.490667-16.853333l0.074667-1.6v-37.034667c0-5.109333 4.053333-9.258667 9.066666-9.258667z m-157.472-0.021333l1.141334 0.074667a9.173333 9.173333 0 0 1 7.861333 8.032l0.064 1.162666v37.034667l-0.053333 2.026667c-0.992 18.837333-15.765333 33.930667-34.208 34.954666l-1.984 0.053334-1.994667-0.053334c-18.432-1.024-33.216-16.117333-34.208-34.954666l-0.053333-2.026667v-37.034667l0.064-1.173333a9.173333 9.173333 0 0 1 7.861333-8.021333l1.141333-0.074667 1.141334 0.074667a9.173333 9.173333 0 0 1 7.850666 8.032l0.064 1.162666v37.034667l0.064 1.6c0.746667 8.949333 7.744 16.085333 16.501334 16.853333l1.568 0.064 1.557333-0.064c8.768-0.768 15.754667-7.904 16.501333-16.853333l0.064-1.6v-37.034667c0-5.12 4.053333-9.269333 9.066667-9.269333z m-208.394666 0l1.184 0.074667c1.568 0.213333 3.061333 0.832 4.341333 1.834666l0.906667 0.810667 23.008 23.573333 23.008-23.573333 0.928-0.821333a8.917333 8.917333 0 0 1 10.976 0l0.928 0.842666 0.810666 0.949334c2.432 3.274667 2.453333 7.818667 0.053334 11.104l-0.885334 1.045333-26.709333 27.370667v30.869333l-0.074667 1.162667a9.173333 9.173333 0 0 1-7.850666 8.021333l-1.141334 0.074667-1.130666-0.074667a9.162667 9.162667 0 0 1-7.861334-8.021333l-0.064-1.162667v-30.784l-26.805333-27.456-0.8-0.917333a9.418667 9.418667 0 0 1-1.813333-6.826667l0.234666-1.216 0.384-1.173333a9.098667 9.098667 0 0 1 8.373334-5.717334z m104.181333 0l1.984 0.064c18.442667 1.013333 33.216 16.106667 34.218667 34.944l0.053333 2.037333v9.258667l-0.053333 2.026667c-1.002667 18.837333-15.776 33.930667-34.218667 34.954666l-1.984 0.053334-1.994667-0.053334c-18.432-1.024-33.216-16.117333-34.208-34.954666l-0.053333-2.026667v-9.258667c0-20.458667 16.234667-37.045333 36.256-37.045333z m131.413333 0l1.130667 0.074667a9.173333 9.173333 0 0 1 7.861333 8.032l0.064 1.162666v64.810667l-0.064 1.162667a9.162667 9.162667 0 0 1-7.861333 8.021333l-1.130667 0.074667-1.141333-0.074667a9.162667 9.162667 0 0 1-7.850667-8.021333l-0.074666-1.162667v-64.810667c0-5.12 4.053333-9.269333 9.066666-9.269333z m51.850667-0.010667l1.109333 0.064c1.770667 0.213333 3.488 0.970667 4.906667 2.261334l0.992 1.066666 0.736 1.056a9.728 9.728 0 0 1-0.768 10.656l-0.842667 0.981334-25.002666 25.546666 25.258666 25.802667 0.64 0.704 0.554667 0.768 0.48 0.832 0.522667 1.28a9.429333 9.429333 0 0 1-1.354667 8.565333l-0.821333 0.96-0.949334 0.853334a8.938667 8.938667 0 0 1-8.394666 1.376l-1.248-0.533334-0.810667-0.48-0.746667-0.586666-0.693333-0.64-28.672-29.301334-0.970667-1.098666a13.802667 13.802667 0 0 1 0-17.002667l0.970667-1.098667 28.693333-29.333333a8.938667 8.938667 0 0 1 6.410667-2.698667z m-183.264 18.538667l-1.568 0.064c-8.757333 0.768-15.754667 7.893333-16.501333 16.853333l-0.064 1.6v9.258667c0 9.685333 7.285333 17.642667 16.565333 18.453333l1.568 0.064 1.557333-0.064c8.768-0.768 15.744-7.904 16.490667-16.853333l0.074667-1.6v-9.258667l-0.074667-1.6c-0.789333-9.482667-8.565333-16.917333-18.048-16.917333z m48.672-375.733333l2.176 1.226666L620.586667 377.173333c55.317333 32.629333 56.170667 113.450667 2.56 147.562667l-2.56 1.557333-5.44-3.2 5.44 3.210667-136.48 80.512c-30.229333 17.834667-68.885333 7.242667-86.346667-23.637333-17.034667-30.154667-7.573333-68.512 21.013333-86.912l2.133334-1.312 56.672-33.429334 111.168 45.994667-94.581334-55.786667-73.28-43.221333c-30.218667-17.834667-40.586667-57.301333-23.125333-88.202667 17.045333-30.144 54.282667-40.96 84.16-24.853333z\"  ></path></symbol><symbol id=\"icon-shangchuandaochu\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128l184 192H544v448h-64V320H328l184-192z m384 384h-64v320H192V512h-64v384h768V512z\"  ></path></symbol><symbol id=\"icon-yulebao\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 64c-200.298667 0-362.666667 162.368-362.666667 362.666667s162.368 362.666667 362.666667 362.666667 362.666667-162.368 362.666667-362.666667-162.368-362.666667-362.666667-362.666667zM384.853333 338.08a32 32 0 0 1 45.066667 4.096L512 440.682667l82.08-98.506667a32 32 0 1 1 49.173333 40.981333L571.413333 469.333333H618.666667a32 32 0 0 1 31.946666 30.122667L650.666667 501.333333a32 32 0 0 1-32 32h-69.333334v42.666667H618.666667a32 32 0 0 1 31.946666 30.122667L650.666667 608a32 32 0 0 1-32 32h-69.333334v42.666667a32 32 0 0 1-30.122666 31.946666L517.333333 714.666667a32 32 0 0 1-32-32v-42.666667H405.333333a32 32 0 0 1-31.946666-30.122667L373.333333 608a32 32 0 0 1 32-32h80v-42.666667H405.333333a32 32 0 0 1-31.946666-30.122666L373.333333 501.333333a32 32 0 0 1 32-32h47.232l-71.818666-86.186666a32 32 0 0 1 2.581333-43.722667z\"  ></path></symbol><symbol id=\"icon-xiazaidaoru\" viewBox=\"0 0 1024 1024\"><path d=\"M328 576h152V128h64v448h152L512 768 328 576z m568-64h-64v320H192V512h-64v384h768V512z\"  ></path></symbol><symbol id=\"icon-zhiwen\" viewBox=\"0 0 1024 1024\"><path d=\"M749.290667 780.8a32 32 0 0 1-64.021334 0V646.4c0-98.965333-80.266667-179.2-179.274666-179.2-99.008 0-179.264 80.234667-179.264 179.2v115.2a32 32 0 0 1-64.032 0V646.4c0-134.314667 108.928-243.2 243.306666-243.2 134.357333 0 243.285333 108.885333 243.285334 243.2v134.4z m149.930666-500.906667a32 32 0 0 1-4.042666 45.077334 32.021333 32.021333 0 0 1-45.088-4.032C765.418667 219.626667 640.608 160 505.994667 160 377.386667 160 257.6 214.4 173.12 308.032a32.021333 32.021333 0 0 1-45.226667 2.325333 32 32 0 0 1-2.314666-45.194666C222.08 158.229333 359.072 96 505.994667 96c153.792 0 296.512 68.202667 393.226666 183.893333zM883.733333 627.2a32 32 0 0 1-64.032 0c0-130.218667-80.128-245.461333-199.402666-292.138667a32 32 0 1 1 23.338666-59.594666C787.264 331.658667 883.733333 470.421333 883.733333 627.2zM505.994667 249.6a32 32 0 1 1 0 64c-173.258667 0-313.717333 140.405333-313.717334 313.6a32 32 0 0 1-64.021333 0c0-208.533333 169.12-377.6 377.738667-377.6z m0 371.2a25.6 25.6 0 0 0-25.6 25.066667l0.192 5.152a1953.109333 1953.109333 0 0 1 1.205333 61.845333c0.010667 19.882667-0.448 36.48-1.525333 49.066667-3.573333 41.877333-15.082667 78.410667-32.106667 109.493333a222.293333 222.293333 0 0 1-23.584 35.061333c-5.173333 6.229333-9.472 10.666667-12.437333 13.333334a32.021333 32.021333 0 0 1-45.205334-2.442667 32 32 0 0 1 2.432-45.184c-0.074667 0.064 0.256-0.245333 0.938667-0.96 1.429333-1.461333 3.093333-3.328 4.96-5.568a158.602667 158.602667 0 0 0 16.746667-24.970667c12.864-23.488 21.674667-51.477333 24.469333-84.202666 0.885333-10.378667 1.301333-25.386667 1.290667-43.594667a1643.466667 1643.466667 0 0 0-1.173334-59.573333l-0.213333-5.578667-0.021333-1.344c0-49.493333 40.128-89.6 89.632-89.6a89.621333 89.621333 0 0 1 89.632 89.6v171.050667a32 32 0 0 1-64.021334 0V646.4a25.6 25.6 0 0 0-25.6-25.6z\"  ></path></symbol><symbol id=\"icon-baocun-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M677.6 192L832 346.4V832H192V192h485.6m26.4-64H192c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64V320L704 128zM256 256h320v128H256V256z m256 512c-70.4 0-128-57.6-128-128s57.6-128 128-128 128 57.6 128 128-57.6 128-128 128z\"  ></path></symbol><symbol id=\"icon-aixin1\" viewBox=\"0 0 1024 1024\"><path d=\"M667.786667 117.333333C832.864 117.333333 938.666667 249.706667 938.666667 427.861333c0 138.250667-125.098667 290.506667-371.573334 461.589334a96.768 96.768 0 0 1-110.186666 0C210.432 718.368 85.333333 566.112 85.333333 427.861333 85.333333 249.706667 191.136 117.333333 356.213333 117.333333c59.616 0 100.053333 20.832 155.786667 68.096C567.744 138.176 608.170667 117.333333 667.786667 117.333333z\"  ></path></symbol><symbol id=\"icon-shanguangdeng\" viewBox=\"0 0 1024 1024\"><path d=\"M320 128v448h128v384l296-512H577.6L744 128H320z\"  ></path></symbol><symbol id=\"icon-chenggong1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m182.613333 297.354667a32 32 0 0 0-45.258666 0.032L458.922667 573.44l-84.341334-83.989333a32 32 0 0 0-45.162666 45.344l106.986666 106.549333a32 32 0 0 0 45.226667-0.064l213.013333-213.333333a32 32 0 0 0-0.032-45.258667z\"  ></path></symbol><symbol id=\"icon-shanguangdeng-zidong\" viewBox=\"0 0 1024 1024\"><path d=\"M692.8 128H768l113.6 320h-72.8l-20.8-64H670.4l-21.6 64h-70.4l114.4-320z m-5.6 192h80l-36.8-118.4L687.2 320zM128 128v448h128v384l296-512H385.6L552 128H128z\"  ></path></symbol><symbol id=\"icon-dianzan1\" viewBox=\"0 0 1024 1024\"><path d=\"M621.674667 408.021333c16.618667-74.24 28.224-127.936 34.837333-161.194666C673.152 163.093333 629.941333 85.333333 544.298667 85.333333c-77.226667 0-116.010667 38.378667-138.88 115.093334l-0.586667 2.24c-13.728 62.058667-34.72 110.165333-62.506667 144.586666a158.261333 158.261333 0 0 1-119.733333 58.965334l-21.909333 0.469333C148.437333 407.808 106.666667 450.816 106.666667 503.498667V821.333333c0 64.8 52.106667 117.333333 116.394666 117.333334h412.522667c84.736 0 160.373333-53.568 189.12-133.92l85.696-239.584c21.802667-60.96-9.536-128.202667-70.005333-150.186667a115.552 115.552 0 0 0-39.488-6.954667H621.674667z\"  ></path></symbol><symbol id=\"icon-shanguangdeng-guanbi\" viewBox=\"0 0 1024 1024\"><path d=\"M716.8 180.8L744 128H320v448h1.6zM141.6 847.2l45.6 45.6L448 631.2V960l296-512H631.2l269.6-268.8-45.6-45.6\"  ></path></symbol><symbol id=\"icon-dianhua2\" viewBox=\"0 0 1024 1024\"><path d=\"M742.218667 526.666667c107.637333 0 194.848 87.573333 194.848 195.552V725.333333c0 103.168-93.578667 190.4-190.4 190.4h-45.44a30.4 30.4 0 0 1-2.517334-0.106666c-153.898667-12.778667-312.266667-80.128-411.914666-173.888C169.184 631.082667 86.933333 461.44 86.933333 303.818667c0-113.802667 84.405333-195.552 194.848-195.552 107.626667 0 194.837333 87.573333 194.837334 195.552 0 76.032-44.181333 138.773333-111.701334 169.12a507.658667 507.658667 0 0 0 81.6 100.266666c36.288 34.453333 76.544 62.336 118.752 81.813334 26.304-76.170667 94.186667-128.352 176.96-128.352z\"  ></path></symbol><symbol id=\"icon-baocun\" viewBox=\"0 0 1024 1024\"><path d=\"M704 128H192c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64V320L704 128zM256 256h320v128H256V256z m256 512c-70.4 0-128-57.6-128-128s57.6-128 128-128 128 57.6 128 128-57.6 128-128 128z\"  ></path></symbol><symbol id=\"icon-bangzhu1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 586.666667a32 32 0 1 0 0 64 32 32 0 0 0 0-64z m-2.517333-373.333333c-48.416 0-92.746667 24.16-118.613334 63.413333a137.088 137.088 0 0 0-15.978666 33.237333 32 32 0 0 0 60.906666 19.690667c2.016-6.24 4.885333-12.202667 8.522667-17.717333C458.4 375.914667 482.709333 362.666667 509.482667 362.666667 552.277333 362.666667 586.666667 396.266667 586.666667 437.333333s-34.4 74.666667-77.194667 74.666667a32 32 0 0 0-32 32v64a32 32 0 0 0 64 0v-35.584C603.946667 558.197333 650.666667 503.232 650.666667 437.333333c0-76.757333-63.381333-138.666667-141.194667-138.666666z\"  ></path></symbol><symbol id=\"icon-yonghu-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 192.8c70.4 0 128 57.6 128 128s-57.6 128-128 128c-36 0-68.8-14.4-93.6-40.8-24.8-26.4-36.8-60-34.4-96 4-63.2 56.8-115.2 120-118.4 2.4-0.8 4.8-0.8 8-0.8M512 640c53.6 0 140.8 13.6 216 43.2 64 25.6 104 57.6 104 84v64.8H192v-64.8c0-26.4 40-58.4 104-84 75.2-29.6 162.4-43.2 216-43.2m0-511.2h-11.2c-96 5.6-174.4 83.2-180.8 178.4-7.2 112 80.8 204.8 191.2 204.8 105.6 0 192-86.4 192-192S617.6 128.8 512 128.8zM512 576c-128 0-384 64-384 191.2v96c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V766.4C896 640 640 576 512 576z\"  ></path></symbol><symbol id=\"icon-dianyingpiao1\" viewBox=\"0 0 1024 1024\"><path d=\"M821.333333 138.666667c64.8 0 117.333333 52.533333 117.333334 117.333333v149.333333a32 32 0 0 1-32 32 74.666667 74.666667 0 0 0 0 149.333334 32 32 0 0 1 32 32v149.333333c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V618.666667a32 32 0 0 1 32-32 74.666667 74.666667 0 0 0 0-149.333334 32 32 0 0 1-32-32V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666zM640 565.333333H384a32 32 0 0 0 0 64h256a32 32 0 0 0 0-64z m0-170.666666H384a32 32 0 0 0 0 64h256a32 32 0 0 0 0-64z\"  ></path></symbol><symbol id=\"icon-yonghu\" viewBox=\"0 0 1024 1024\"><path d=\"M500 128.8c-95.2 5.6-173.6 83.2-180 178.4-7.2 112 80.8 205.6 191.2 205.6 106.4 0 192-86.4 192-192 0.8-110.4-92-198.4-203.2-192zM512 575.2c-128 0-383.2 64-383.2 192v96c0 17.6 14.4 32 32 32h702.4c17.6 0 32-14.4 32-32V766.4c0-127.2-255.2-191.2-383.2-191.2z\"  ></path></symbol><symbol id=\"icon-faxian1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m149.162667 222.901334L444.16 386.357333a96 96 0 0 0-57.802667 57.813334l-78.122666 216.992a42.666667 42.666667 0 0 0 54.602666 54.602666l217.002667-78.122666a96 96 0 0 0 57.802667-57.813334l78.122666-216.992a42.666667 42.666667 0 0 0-54.602666-54.602666zM512 565.333333a53.333333 53.333333 0 1 0 0-106.666666 53.333333 53.333333 0 0 0 0 106.666666z\"  ></path></symbol><symbol id=\"icon-jiaosequnti\" viewBox=\"0 0 1024 1024\"><path d=\"M663.2 447.2c84 10.4 153.6-60.8 142.4-144-7.2-57.6-52.8-103.2-109.6-110.4-84-10.4-154.4 60-143.2 144 7.2 57.6 53.6 103.2 110.4 110.4z m-326.4 0c84 10.4 153.6-60.8 142.4-144-7.2-57.6-53.6-103.2-110.4-110.4-84-10.4-154.4 60-143.2 144 8 57.6 53.6 103.2 111.2 110.4z m11.2 64.8C253.6 512 64 560.8 64 657.6V816c0 8.8 7.2 16 16 16h536c8.8 0 16-7.2 16-16V657.6C632 560.8 442.4 512 348 512z m322.4 0c-12 0-25.6 0.8-40 2.4 48 34.4 81.6 81.6 81.6 143.2V816c0 8.8 7.2 16 16 16h216c8.8 0 16-7.2 16-16V657.6C960 560.8 767.2 512 670.4 512z\"  ></path></symbol><symbol id=\"icon-dingwei2\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667c-53.333333 0-384-257.258667-384-469.333334S299.925333 85.333333 512 85.333333s384 171.925333 384 384-330.666667 469.333333-384 469.333334z m0-352c64.8 0 117.333333-52.533333 117.333333-117.333334s-52.533333-117.333333-117.333333-117.333333-117.333333 52.533333-117.333333 117.333333 52.533333 117.333333 117.333333 117.333334z\"  ></path></symbol><symbol id=\"icon-morentouxiang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM384.8 376c4-64 56-115.2 120-119.2 74.4-4 135.2 55.2 135.2 128 0 70.4-57.6 128-128 128-73.6 0-132-62.4-127.2-136.8zM768 746.4c0 12-9.6 21.6-21.6 21.6H278.4c-12 0-21.6-9.6-21.6-21.6v-64c0-84.8 170.4-128 255.2-128 84.8 0 255.2 42.4 255.2 128l0.8 64z\"  ></path></symbol><symbol id=\"icon-gonggao\" viewBox=\"0 0 1024 1024\"><path d=\"M694.368 117.28a67.957333 67.957333 0 0 1 10.336 36.021333v717.408a67.957333 67.957333 0 0 1-103.978667 57.632L326.026667 756.650667H180.48A95.146667 95.146667 0 0 1 85.333333 661.504V362.506667a95.146667 95.146667 0 0 1 95.146667-95.146667h145.546667L600.725333 95.68a67.957333 67.957333 0 0 1 93.653334 21.610667z m120.330667 133.525333a32 32 0 0 1 44.533333 8.042667 443.114667 443.114667 0 0 1 0.117333 506.133333 32 32 0 0 1-52.586666-36.458666 379.114667 379.114667 0 0 0-0.106667-433.184 32 32 0 0 1 8.042667-44.533334z\"  ></path></symbol><symbol id=\"icon-zhucetianjiahaoyou\" viewBox=\"0 0 1024 1024\"><path d=\"M320 307.2c6.4-95.2 84.8-172.8 180-178.4 111.2-6.4 204 81.6 204 192 0 105.6-85.6 192-192 192-110.4 0-199.2-93.6-192-205.6zM575.2 768c0-72.8 40.8-136.8 100.8-168.8C616 584 556 576 511.2 576 384 576 128 640 128 768v96c0 17.6 14.4 32 32 32h464c-30.4-33.6-48.8-78.4-48.8-128z m320.8-32h-96V640h-64v96H640v64h96v96h64v-96h96v-64z\"  ></path></symbol><symbol id=\"icon-huati1\" viewBox=\"0 0 1024 1024\"><path d=\"M476.021333 544h63.424l8.533334-64h-63.424l-8.533334 64zM512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667a424.778667 424.778667 0 0 1-219.125333-60.501334 2786.56 2786.56 0 0 0-20.053334-11.765333l-104.405333 28.48c-23.893333 6.506667-45.802667-15.413333-39.285333-39.296l28.437333-104.288c-11.008-18.688-18.218667-31.221333-21.802667-37.909333A424.885333 424.885333 0 0 1 85.333333 512C85.333333 276.362667 276.362667 85.333333 512 85.333333z m89.557333 234.944a32 32 0 0 0-35.946666 27.498667L556.512 416h-63.424l7.968-59.776a32 32 0 0 0-63.445333-8.448L428.512 416H352a32 32 0 0 0 0 64h67.978667l-8.533334 64H352a32 32 0 0 0 0 64h50.912l-7.968 59.776a32 32 0 0 0 63.445333 8.448L467.488 608h63.424l-7.968 59.776a32 32 0 0 0 63.445333 8.448L595.488 608H672a32 32 0 0 0 0-64h-67.978667l8.533334-64H672a32 32 0 0 0 0-64h-50.912l7.968-59.776a32 32 0 0 0-27.498667-35.946667z\"  ></path></symbol><symbol id=\"icon-renwu\" viewBox=\"0 0 1024 1024\"><path d=\"M128 160v192h768V160H128z m704 128H512v-64h320v64zM128 672v192h768V672H128z m704 128H576v-64h256v64zM128 416v192h768V416H128z m704 128H384v-64h448v64z\"  ></path></symbol><symbol id=\"icon-jianshao1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667c235.637333 0 426.666667-191.029333 426.666667-426.666667S747.637333 85.333333 512 85.333333 85.333333 276.362667 85.333333 512s191.029333 426.666667 426.666667 426.666667zM352 480h320a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64z\"  ></path></symbol><symbol id=\"icon-zhongwenmoshi\" viewBox=\"0 0 1024 1024\"><path d=\"M544 416h160v128H544V416z m352-256v704c0 17.6-14.4 32-32 32H160c-17.6 0-32-14.4-32-32V160c0-17.6 14.4-32 32-32h704c17.6 0 32 14.4 32 32zM768 352H544V256h-64v96H256v256h224v160h64V608h224V352zM320 544h160V416H320v128z\"  ></path></symbol><symbol id=\"icon-huiyuan1\" viewBox=\"0 0 1024 1024\"><path d=\"M495.274667 170.453333a21.333333 21.333333 0 0 1 33.450666 0L704.533333 392.533333a21.333333 21.333333 0 0 0 25.130667 6.368l171.392-73.450666a21.333333 21.333333 0 0 1 29.301333 23.946666l-94.912 457.28A85.333333 85.333333 0 0 1 751.893333 874.666667H272.106667a85.333333 85.333333 0 0 1-83.552-67.989334l-94.912-457.28a21.333333 21.333333 0 0 1 29.290666-23.946666l171.402667 73.450666a21.333333 21.333333 0 0 0 25.130667-6.368l175.808-222.08z\"  ></path></symbol><symbol id=\"icon-fujian\" viewBox=\"0 0 1024 1024\"><path d=\"M960 448c0 88-72 160-160 160H352c-52.8 0-96-43.2-96-96s43.2-96 96-96h416v64H352c-17.6 0-32 14.4-32 32s14.4 32 32 32h448c52.8 0 96-43.2 96-96s-43.2-96-96-96H288c-88 0-160 72-160 160s72 160 160 160h352v64H288C164 736 64 636 64 512s100-224 224-224h512c88 0 160 72 160 160z\"  ></path></symbol><symbol id=\"icon-pinglun1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667a424.778667 424.778667 0 0 1-219.125333-60.501334 2786.56 2786.56 0 0 0-20.053334-11.765333l-104.405333 28.48c-23.893333 6.506667-45.802667-15.413333-39.285333-39.296l28.437333-104.288c-11.008-18.688-18.218667-31.221333-21.802667-37.909333A424.885333 424.885333 0 0 1 85.333333 512C85.333333 276.362667 276.362667 85.333333 512 85.333333z m-102.218667 549.76a32 32 0 1 0-40.917333 49.216A223.178667 223.178667 0 0 0 512 736c52.970667 0 103.189333-18.485333 143.104-51.669333a32 32 0 1 0-40.906667-49.216A159.189333 159.189333 0 0 1 512 672a159.189333 159.189333 0 0 1-102.218667-36.906667z\"  ></path></symbol><symbol id=\"icon-bianjishuru-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M960 960H64v-64h896v64z m-73.6-686.4l-84 84-45.6 45.6L384 776l-192 56 56-192 502.4-502.4c4-4 9.6-6.4 14.4-6.4 4 0 8 1.6 10.4 4L888 248c7.2 7.2 5.6 17.6-1.6 25.6zM712 357.6L666.4 312 304.8 673.6l-18.4 64 64-18.4L712 357.6z m97.6-97.6l-45.6-45.6-52 52 45.6 45.6 52-52z\"  ></path></symbol><symbol id=\"icon-shequ1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m143.381333 497.781334A159.978667 159.978667 0 0 1 512 672a159.978667 159.978667 0 0 1-143.36-88.853333 32 32 0 1 0-57.301333 28.490666A223.968 223.968 0 0 0 512 736a223.968 223.968 0 0 0 200.682667-124.394667 32 32 0 0 0-57.301334-28.490666z\"  ></path></symbol><symbol id=\"icon-bianjishuru\" viewBox=\"0 0 1024 1024\"><path d=\"M686.4 224c-6.4-6.4-6.4-16 0-22.4l68-68c6.4-6.4 16-6.4 22.4 0l112.8 112.8c6.4 6.4 6.4 16 0 22.4l-68 68c-6.4 6.4-16 6.4-22.4 0L686.4 224zM384 776l372-372c5.6-5.6 4.8-15.2-1.6-20.8L641.6 269.6c-6.4-6.4-16-7.2-20.8-1.6L248 640l-56 192 192-56zM64 896v64h896v-64H64z\"  ></path></symbol><symbol id=\"icon-shibai1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m-86.474667 296.96a30.570667 30.570667 0 1 0-43.232 43.232L468.768 512l-86.474667 86.474667a30.570667 30.570667 0 1 0 43.232 43.232L512 555.232l86.474667 86.474667a30.570667 30.570667 0 1 0 43.232-43.232L555.232 512l86.474667-86.474667a30.570667 30.570667 0 1 0-43.232-43.232L512 468.768z\"  ></path></symbol><symbol id=\"icon-yingwenmoshi\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM480 320H288v160h192v64H288v160h192v64H224V256h256v64z m320 224v224h-64V544H608v224h-64V480h256v64z\"  ></path></symbol><symbol id=\"icon-shijian2\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667c235.637333 0 426.666667-191.029333 426.666667-426.666667S747.637333 85.333333 512 85.333333 85.333333 276.362667 85.333333 512s191.029333 426.666667 426.666667 426.666667zM329.376 649.376L480 498.741333V320a32 32 0 0 1 64 0v192a32 32 0 0 1-9.376 22.624l-160 160a32 32 0 1 1-45.248-45.248z\"  ></path></symbol><symbol id=\"icon-jianpan-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M928 192H96c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-32 576H128V256h768v512zM320 384H192v-64h128v64z m448 192V448h64v192H640v-64h128z m-192 64H192v-64h384v64zM448 384h-64v-64h64v64z m128 0h-64v-64h64v64z m128 0h-64v-64h64v64z m128 0h-64v-64h64v64zM256 512h-64v-64h64v64z m64-64h64v64h-64v-64z m128 0h64v64h-64v-64z m128 0h64v64h-64v-64z\"  ></path></symbol><symbol id=\"icon-shandian1\" viewBox=\"0 0 1024 1024\"><path d=\"M395.765333 586.570667h-171.733333c-22.421333 0-37.888-22.442667-29.909333-43.381334L364.768 95.274667A32 32 0 0 1 394.666667 74.666667h287.957333c22.72 0 38.208 23.018667 29.632 44.064l-99.36 243.882666h187.050667c27.509333 0 42.186667 32.426667 24.042666 53.098667l-458.602666 522.56c-22.293333 25.408-63.626667 3.392-54.976-29.28l85.354666-322.421333z\"  ></path></symbol><symbol id=\"icon-jianpan\" viewBox=\"0 0 1024 1024\"><path d=\"M928 192H96c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32zM640 320h64v64h-64v-64z m-128 0h64v64h-64v-64z m-128 0h64v64h-64v-64z m128 128v64h-64v-64h64zM192 320h128v64H192v-64z m192 128v64h-64v-64h64z m-192 0h64v64h-64v-64z m384 192H192v-64h384v64z m0-192h64v64h-64v-64z m256 192H640v-64h128V448h64v192z m0-256h-64v-64h64v64z\"  ></path></symbol><symbol id=\"icon-wode1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 82.922667a424.938667 424.938667 0 0 1 196.544 47.872C762.453333 107.573333 821.482667 96 885.333333 96c23.786667 0 39.253333 25.034667 28.618667 46.314667a7024.8 7024.8 0 0 0-56.917333 116.234666A424.853333 424.853333 0 0 1 938.666667 509.589333c0 235.637333-191.029333 426.666667-426.666667 426.666667s-426.666667-191.029333-426.666667-426.666667c0-235.648 191.029333-426.666667 426.666667-426.666666zM330.666667 362.666667a42.666667 42.666667 0 0 0-42.666667 42.666666v64a42.666667 42.666667 0 1 0 85.333333 0v-64a42.666667 42.666667 0 0 0-42.666666-42.666666z m170.666666 0a42.666667 42.666667 0 0 0-42.666666 42.666666v64a42.666667 42.666667 0 1 0 85.333333 0v-64a42.666667 42.666667 0 0 0-42.666667-42.666666z\"  ></path></symbol><symbol id=\"icon-rili\" viewBox=\"0 0 1024 1024\"><path d=\"M864 192H704v-64h-64v64H384v-64h-64v64H160c-17.6 0-32 14.4-32 32v640c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-32 640H192V384h640v448zM384 512H256v-64h128v64z m192 0H448v-64h128v64z m192 0H640v-64h128v64zM384 640H256v-64h128v64z m192 0H448v-64h128v64z m192 0H640v-64h128v64zM384 768H256v-64h128v64z m192 0H448v-64h128v64z\"  ></path></symbol><symbol id=\"icon-shouye2\" viewBox=\"0 0 1024 1024\"><path d=\"M555.541333 117.994667l312.874667 224.565333A117.333333 117.333333 0 0 1 917.333333 437.866667V800c0 64.8-52.533333 117.333333-117.333333 117.333333H640V746.666667c0-70.688-57.312-128-128-128s-128 57.312-128 128v170.666666H224c-64.8 0-117.333333-52.533333-117.333333-117.333333V437.877333a117.333333 117.333333 0 0 1 48.917333-95.317333l312.874667-224.565333a74.666667 74.666667 0 0 1 87.082666 0z\"  ></path></symbol><symbol id=\"icon-weichuqin\" viewBox=\"0 0 1024 1024\"><path d=\"M864 192H704v-64h-64v64H384v-64h-64v64H160c-17.6 0-32 14.4-32 32v640c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-32 640H192V384h640v448zM347.2 723.2L464 605.6 355.2 496.8l45.6-45.6L509.6 560l108.8-108.8 45.6 45.6-109.6 108.8L672 723.2 626.4 768 509.6 651.2 392 768l-44.8-44.8z\"  ></path></symbol><symbol id=\"icon-shouji1\" viewBox=\"0 0 1024 1024\"><path d=\"M746.666667 85.333333c64.8 0 117.333333 52.533333 117.333333 117.333334v618.666666c0 64.8-52.533333 117.333333-117.333333 117.333334H277.333333c-64.8 0-117.333333-52.533333-117.333333-117.333334V202.666667c0-64.8 52.533333-117.333333 117.333333-117.333334h469.333334zM597.333333 778.666667H426.666667a32 32 0 0 0 0 64h170.666666a32 32 0 0 0 0-64z m149.333334-629.333334H277.333333a53.333333 53.333333 0 0 0-53.333333 53.333334v480h576V202.666667a53.333333 53.333333 0 0 0-53.333333-53.333334z\"  ></path></symbol><symbol id=\"icon-kaoqinchuqin\" viewBox=\"0 0 1024 1024\"><path d=\"M864 192H704v-64h-64v64H384v-64h-64v64H160c-17.6 0-32 14.4-32 32v640c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-32 640H192V384h640v448zM403.2 707.2L320.8 624.8l45.6-45.6L448 661.6l210.4-210.4 45.6 45.6-210.4 210.4L448 752l-44.8-44.8z\"  ></path></symbol><symbol id=\"icon-tanhao1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 544a42.666667 42.666667 0 1 0 0 85.333334 42.666667 42.666667 0 0 0 0-85.333334z m0-362.666666a42.666667 42.666667 0 0 0-42.666667 42.666666v234.666667a42.666667 42.666667 0 1 0 85.333334 0V309.333333a42.666667 42.666667 0 0 0-42.666667-42.666666z\"  ></path></symbol><symbol id=\"icon-paizhao\" viewBox=\"0 0 1024 1024\"><path d=\"M640 576c0 70.4-57.6 128-128 128s-128-57.6-128-128 57.6-128 128-128 128 57.6 128 128z m320-224v480c0 35.2-28.8 64-64 64H128c-35.2 0-64-28.8-64-64V352c0-35.2 28.8-64 64-64h167.2L376 192h256l80.8 96H896c35.2 0 64 28.8 64 64zM704 576c0-106.4-85.6-192-192-192S320 469.6 320 576s85.6 192 192 192 192-85.6 192-192z\"  ></path></symbol><symbol id=\"icon-shoucang2\" viewBox=\"0 0 1024 1024\"><path d=\"M335.008 916.629333c-35.914667 22.314667-82.88 10.773333-104.693333-25.557333a77.333333 77.333333 0 0 1-8.96-57.429333l46.485333-198.24a13.141333 13.141333 0 0 0-4.021333-12.864l-152.16-132.586667c-31.605333-27.52-35.253333-75.648-8.234667-107.733333a75.68 75.68 0 0 1 51.733333-26.752L354.848 339.2c4.352-0.362667 8.245333-3.232 10.026667-7.594667l76.938666-188.170666c16.032-39.2 60.618667-57.92 99.52-41.461334a76.309333 76.309333 0 0 1 40.832 41.461334l76.938667 188.16c1.781333 4.373333 5.674667 7.253333 10.026667 7.605333l199.712 16.277333c41.877333 3.413333 72.885333 40.458667 69.568 82.517334a76.938667 76.938667 0 0 1-26.08 51.978666l-152.16 132.586667c-3.541333 3.082667-5.141333 8.074667-4.021334 12.853333l46.485334 198.24c9.621333 41.013333-15.36 82.336-56.138667 92.224a75.285333 75.285333 0 0 1-57.525333-9.237333l-170.976-106.24a11.296 11.296 0 0 0-12.010667 0l-170.986667 106.24z\"  ></path></symbol><symbol id=\"icon-paizhao-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M601.6 256l76.8 96H896v480H128V352h201.6l76.8-96h195.2m30.4-64H376l-76.8 96H128c-35.2 0-64 28.8-64 64v480c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V352c0-35.2-28.8-64-64-64H708.8L632 192zM512 384c-106.4 0-192 85.6-192 192s85.6 192 192 192 192-85.6 192-192-85.6-192-192-192z m0 320c-70.4 0-128-57.6-128-128s57.6-128 128-128 128 57.6 128 128-57.6 128-128 128z\"  ></path></symbol><symbol id=\"icon-shuju1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m214.592 318.677334a32 32 0 0 0-45.248 0.064L544.736 541.066667l-81.792-89.109334a32 32 0 0 0-46.613333-0.576l-119.36 123.733334a32 32 0 1 0 46.058666 44.437333l95.754667-99.264 81.418667 88.704a32 32 0 0 0 46.24 0.96l160.213333-160.693333a32 32 0 0 0-0.064-45.248z\"  ></path></symbol><symbol id=\"icon-tupian-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M928 192H96c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32z m-32 576H128V256h768v512zM447.2 480L520 607.2l128-221.6L832 704H317.6l129.6-224zM192 416c0-52.8 43.2-96 96-96s96 43.2 96 96-43.2 96-96 96-96-43.2-96-96z\"  ></path></symbol><symbol id=\"icon-wenda\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667a424.778667 424.778667 0 0 1-219.125333-60.501334 2786.56 2786.56 0 0 0-20.053334-11.765333l-104.405333 28.48c-23.893333 6.506667-45.802667-15.413333-39.285333-39.296l28.437333-104.288c-11.008-18.688-18.218667-31.221333-21.802667-37.909333A424.885333 424.885333 0 0 1 85.333333 512C85.333333 276.362667 276.362667 85.333333 512 85.333333z m0 586.666667a32 32 0 1 0 0 64 32 32 0 0 0 0-64z m-2.517333-373.333333c-48.416 0-92.746667 24.16-118.613334 63.413333a137.088 137.088 0 0 0-15.978666 33.237333 32 32 0 0 0 60.906666 19.690667c2.016-6.24 4.885333-12.202667 8.522667-17.717333C458.4 375.914667 482.709333 362.666667 509.482667 362.666667 552.277333 362.666667 586.666667 396.266667 586.666667 437.333333s-34.4 74.666667-77.194667 74.666667a32 32 0 0 0-32 32v64a32 32 0 0 0 64 0v-35.584C603.946667 558.197333 650.666667 503.232 650.666667 437.333333c0-76.757333-63.381333-138.666667-141.194667-138.666666z\"  ></path></symbol><symbol id=\"icon-tupian\" viewBox=\"0 0 1024 1024\"><path d=\"M928 192H96c-17.6 0-32 14.4-32 32v576c0 17.6 14.4 32 32 32h832c17.6 0 32-14.4 32-32V224c0-17.6-14.4-32-32-32zM192 416c0-52.8 43.2-96 96-96s96 43.2 96 96-43.2 96-96 96-96-43.2-96-96z m384 288H317.6l128.8-224L520 607.2l128-221.6L832 704H576z\"  ></path></symbol><symbol id=\"icon-yanjing1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 192c156.448 0 296.021333 98.730667 418.410667 291.605333a52.938667 52.938667 0 0 1 0 56.789334C808.021333 733.269333 668.448 832 512 832c-156.448 0-296.021333-98.730667-418.410667-291.605333a52.938667 52.938667 0 0 1 0-56.789334C215.978667 290.730667 355.552 192 512 192z m0 128c-106.037333 0-192 85.962667-192 192s85.962667 192 192 192 192-85.962667 192-192-85.962667-192-192-192z m0 320c70.688 0 128-57.312 128-128s-57.312-128-128-128-128 57.312-128 128 57.312 128 128 128z\"  ></path></symbol><symbol id=\"icon-saomiao\" viewBox=\"0 0 1024 1024\"><path d=\"M128 384V160c0-17.6 14.4-32 32-32h224v64H192v192h-64z m512-192h192v192h64V160c0-17.6-14.4-32-32-32H640v64z m192 448v192H640v64h224c17.6 0 32-14.4 32-32V640h-64z m-448 192H192V640h-64v224c0 17.6 14.4 32 32 32h224v-64z m512-352H128v64h768v-64z\"  ></path></symbol><symbol id=\"icon-yingchengka1\" viewBox=\"0 0 1024 1024\"><path d=\"M821.333333 138.666667c64.8 0 117.333333 52.533333 117.333334 117.333333v512c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666zM425.546667 396.128a32 32 0 0 0-40.085334 20.992L362.666667 490.048l-22.794667-72.928a32 32 0 1 0-61.077333 19.093333l53.333333 170.666667c9.354667 29.941333 51.733333 29.941333 61.077333 0l53.333334-170.666667a32 32 0 0 0-20.992-40.085333zM512 394.666667a32 32 0 0 0-32 32v170.666666a32 32 0 0 0 64 0V426.666667a32 32 0 0 0-32-32z m160 0h-64a32 32 0 0 0-32 32v170.666666a32 32 0 0 0 64 0v-53.333333h32a74.666667 74.666667 0 0 0 0-149.333333z m0 64a10.666667 10.666667 0 0 1 0 21.333333h-32v-21.333333z\"  ></path></symbol><symbol id=\"icon-xianshikejian\" viewBox=\"0 0 1024 1024\"><path d=\"M512 256c-168 0-329.6 106.4-384 256 54.4 149.6 216 256 384 256 167.2 0 330.4-106.4 384.8-256-55.2-149.6-217.6-256-384.8-256z m0 416c-88 0-160-72-160-160s72-160 160-160 160 72 160 160-72 160-160 160z m96-160c0 52.8-43.2 96-96 96s-96-43.2-96-96 43.2-96 96-96 96 43.2 96 96z\"  ></path></symbol><symbol id=\"icon-xiangji1\" viewBox=\"0 0 1024 1024\"><path d=\"M659.925333 128a74.666667 74.666667 0 0 1 71.338667 52.618667L754.56 256H821.333333c64.8 0 117.333333 52.533333 117.333334 117.333333v426.666667c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V373.333333c0-64.8 52.533333-117.333333 117.333334-117.333333h66.773333l23.296-75.381333A74.666667 74.666667 0 0 1 364.074667 128h295.850666zM512 405.333333c-88.362667 0-160 71.637333-160 160 0 88.362667 71.637333 160 160 160 88.362667 0 160-71.637333 160-160 0-88.362667-71.637333-160-160-160z m0 256a96 96 0 1 0 0-192 96 96 0 0 0 0 192z\"  ></path></symbol><symbol id=\"icon-suoding\" viewBox=\"0 0 1024 1024\"><path d=\"M800 448H704V320c0-106.4-85.6-192-192-192S320 213.6 320 320v128H224c-17.6 0-32 14.4-32 32v384c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V480c0-17.6-14.4-32-32-32zM512 736c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z m128-288H384V320c0-70.4 57.6-128 128-128s128 57.6 128 128v128z\"  ></path></symbol><symbol id=\"icon-yingyuan1\" viewBox=\"0 0 1024 1024\"><path d=\"M864 853.333333a32 32 0 0 1 0 64H160a32 32 0 0 1 0-64z m-42.666667-746.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v540.309333a42.666667 42.666667 0 0 1-78.336 23.402667L672.405333 501.344C628.48 522.816 574.912 533.333333 512 533.333333s-116.48-10.517333-160.405333-31.989333L163.669333 787.712A42.666667 42.666667 0 0 1 85.333333 764.309333V224c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666z\"  ></path></symbol><symbol id=\"icon-yincangbukejian\" viewBox=\"0 0 1024 1024\"><path d=\"M253.6 679.2l109.6-109.6C356 552 352 532.8 352 512c0-88 72-160 160-160 20.8 0 40 4 57.6 11.2l82.4-82.4C607.2 264.8 560 256 512 256c-168 0-329.6 106.4-384 256 24 65.6 68.8 123.2 125.6 167.2z\"  ></path><path d=\"M416 512v4.8L516.8 416H512c-52.8 0-96 43.2-96 96zM770.4 344.8l163.2-163.2L888 136l-753.6 753.6 45.6 45.6 192.8-192.8A390.4 390.4 0 0 0 512 768c167.2 0 330.4-106.4 384.8-256-24-65.6-69.6-123.2-126.4-167.2zM512 672c-20 0-40-4-57.6-11.2l53.6-53.6h4.8c52.8 0 96-43.2 96-96v-4.8l53.6-53.6C668 472 672 492 672 512c0 88-72 160-160 160z\"  ></path></symbol><symbol id=\"icon-yinhangyouhui\" viewBox=\"0 0 1024 1024\"><path d=\"M938.666667 330.666667H85.333333v-74.666667c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v74.666667z m0 64v373.333333c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V394.666667h853.333334zM757.333333 672H650.666667a32 32 0 0 0 0 64h106.666666a32 32 0 0 0 0-64z\"  ></path></symbol><symbol id=\"icon-jiesuo\" viewBox=\"0 0 1024 1024\"><path d=\"M800 448H704V320c0-106.4-85.6-192-192-192S320 213.6 320 320h64c0-70.4 57.6-128 128-128s128 57.6 128 128v128H224c-17.6 0-32 14.4-32 32v384c0 17.6 14.4 32 32 32h576c17.6 0 32-14.4 32-32V480c0-17.6-14.4-32-32-32zM512 736c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z\"  ></path></symbol><symbol id=\"icon-xiaoshi1\" viewBox=\"0 0 1024 1024\"><path d=\"M739.552 85.333333c29.802667 0 54.762667 23.402667 54.762667 53.333334a32 32 0 0 0 32 32h4.266666C860.373333 170.666667 885.333333 194.069333 885.333333 224v85.333333c0 29.930667-24.96 53.333333-54.752 53.333334h-11.541333l-34.602667 467.338666A117.333333 117.333333 0 0 1 667.413333 938.666667H356.576a117.333333 117.333333 0 0 1-117.013333-108.661334L204.949333 362.666667h-11.52C163.626667 362.666667 138.666667 339.264 138.666667 309.333333v-85.333333c0-29.930667 24.96-53.333333 54.752-53.333333h4.266666a32 32 0 0 0 32-32c0-29.930667 24.96-53.333333 54.762667-53.333334h455.104zM512 458.666667a96 96 0 1 0 0 192 96 96 0 0 0 0-192z\"  ></path></symbol><symbol id=\"icon-anzhuangshigong-xianxing\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM128 512c0-212 172-384 384-384s384 172 384 384c0 83.2-26.4 159.2-71.2 222.4L620.8 530.4c34.4-71.2 21.6-159.2-37.6-218.4-52.8-52.8-128-68-193.6-47.2-2.4 12-3.2 15.2-5.6 27.2l64 60v56l-40 40h-56l-60-64c-12 2.4-15.2 3.2-27.2 5.6C244 456 260 531.2 312 584c59.2 59.2 147.2 71.2 218.4 37.6l204 204c-62.4 44.8-139.2 71.2-222.4 71.2C300 896 128 724 128 512z\"  ></path></symbol><symbol id=\"icon-yanchu1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c33.173333 0 65.472 3.786667 96.48 10.954667-0.32 2.154667-0.48 4.373333-0.48 6.634667l0.010667 281.066666A159.296 159.296 0 0 0 512 352c-88.362667 0-160 71.637333-160 160 0 88.362667 71.637333 160 160 160 88.362667 0 160-71.637333 160-160 0-1.493333-0.021333-2.986667-0.064-4.458667 0.042667-0.810667 0.064-1.632 0.064-2.453333V116.341333C828.373333 179.648 938.666667 332.938667 938.666667 512c0 235.637333-191.029333 426.666667-426.666667 426.666667S85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z\"  ></path></symbol><symbol id=\"icon-shaixuanguolv\" viewBox=\"0 0 1024 1024\"><path d=\"M874.4 219.2L576 576.8v208c0 4.8-2.4 9.6-5.6 12.8l-96 78.4c-10.4 8.8-26.4 0.8-26.4-12.8V576.8L149.6 219.2c-8.8-10.4-1.6-26.4 12-26.4h700c13.6 0 21.6 16 12.8 26.4z\"  ></path></symbol><symbol id=\"icon-zengjia1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m0 234.666667a32 32 0 0 0-32 32v128H352a32 32 0 0 0 0 64h128v128a32 32 0 0 0 64 0V544h128a32 32 0 0 0 0-64H544V352a32 32 0 0 0-32-32z\"  ></path></symbol><symbol id=\"icon-anzhuangshigong\" viewBox=\"0 0 1024 1024\"><path d=\"M530.4 620.8C459.2 655.2 371.2 643.2 312 584c-52.8-52.8-68-128-47.2-193.6 12-2.4 15.2-3.2 27.2-5.6l60 64h56l40-40v-56l-64-60c2.4-12 3.2-15.2 5.6-27.2C456 244 531.2 260 584 312c59.2 59.2 71.2 147.2 37.6 218.4l249.6 249.6c56-74.4 88.8-168 88.8-268 0-247.2-200.8-448-448-448S64 264.8 64 512s200.8 448 448 448c100.8 0 193.6-32.8 268-88.8L530.4 620.8z\"  ></path></symbol><symbol id=\"icon-dianying1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667a432.554667 432.554667 0 0 1-4.490667 62.112 423.36 423.36 0 0 1-8.789333 43.914667l-0.458667 1.749333-0.330667 1.301333-1.418666 5.216a423.210667 423.210667 0 0 1-9.365334 29.546667l-1.066666 2.944a426.698667 426.698667 0 0 1-94.357334 150.154667c22.986667 3.082667 43.818667 10.837333 62.4 23.466666a32 32 0 1 1-35.957333 52.938667c-30.485333-20.714667-77.781333-18.965333-144.053333 9.386667a343.68 343.68 0 0 1-5.706667 2.773333l-1.834667 0.853333c-1.568 0.746667-3.136 1.472-4.704 2.186667l-0.874666 0.394667c-1.834667 0.832-3.68 1.653333-5.525334 2.453333l-0.778666 0.330667c-1.706667 0.746667-3.413333 1.472-5.12 2.197333-0.533333 0.202667-1.034667 0.416-1.546667 0.629333-3.658667 1.514667-7.349333 2.986667-11.061333 4.394667l-2.250667 0.832a278.826667 278.826667 0 0 1-3.914667 1.450667l-2.453333 0.874666c-1.6 0.576-3.232 1.152-4.853333 1.706667a322.752 322.752 0 0 1-6.08 2.026667l-1.941334 0.618666c-1.781333 0.576-3.573333 1.130667-5.365333 1.685334l-0.693333 0.202666c-1.717333 0.533333-3.445333 1.034667-5.173334 1.536l-2.101333 0.597334c-1.248 0.362667-2.485333 0.704-3.733333 1.045333l-3.082667 0.832c-1.173333 0.32-2.346667 0.629333-3.530667 0.928l-2.922666 0.736c-1.706667 0.426667-3.434667 0.853333-5.162667 1.258667l-1.173333 0.266666c-10.346667 2.410667-20.821333 4.448-31.424 6.08l-2.592 0.394667-0.746667 0.106667A426.250667 426.250667 0 0 1 512 938.666667C276.362667 938.666667 85.333333 747.637333 85.333333 512S276.362667 85.333333 512 85.333333z m0 522.666667a64 64 0 1 0 0 128 64 64 0 0 0 0-128z m160-160a64 64 0 1 0 0 128 64 64 0 0 0 0-128z m-320 0a64 64 0 1 0 0 128 64 64 0 0 0 0-128z m160-160a64 64 0 1 0 0 128 64 64 0 0 0 0-128z\"  ></path></symbol><symbol id=\"icon-zhuxiaoguanji\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m-32 128h64v384h-64V192z m32 640c-176.8 0-320-143.2-320-320 0-131.2 79.2-244 192-293.6v72C307.2 334.4 256 417.6 256 512c0 140.8 115.2 256 256 256s256-115.2 256-256c0-94.4-51.2-177.6-128-221.6v-72c112.8 49.6 192 162.4 192 293.6 0 176.8-143.2 320-320 320z\"  ></path></symbol><symbol id=\"icon-youhuiquan1\" viewBox=\"0 0 1024 1024\"><path d=\"M821.333333 138.666667c64.8 0 117.333333 52.533333 117.333334 117.333333v149.333333a32 32 0 0 1-32 32 74.666667 74.666667 0 0 0 0 149.333334 32 32 0 0 1 32 32v149.333333c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V618.666667a32 32 0 0 1 32-32 74.666667 74.666667 0 0 0 0-149.333334 32 32 0 0 1-32-32V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666zM428.576 329.994667a32 32 0 0 0-43.733333-2.581334l-1.514667 1.344a32 32 0 0 0-2.581333 43.733334L452.565333 458.666667H405.333333l-1.877333 0.053333A32 32 0 0 0 373.333333 490.666667l0.053334 1.877333A32 32 0 0 0 405.333333 522.666667h80v42.666666H405.333333l-1.877333 0.053334A32 32 0 0 0 373.333333 597.333333l0.053334 1.877334A32 32 0 0 0 405.333333 629.333333h80v42.666667l0.053334 1.877333A32 32 0 0 0 517.333333 704l1.877334-0.053333A32 32 0 0 0 549.333333 672v-42.666667H618.666667l1.877333-0.053333A32 32 0 0 0 650.666667 597.333333l-0.053334-1.877333A32 32 0 0 0 618.666667 565.333333h-69.333334v-42.666666H618.666667l1.877333-0.053334A32 32 0 0 0 650.666667 490.666667l-0.053334-1.877334A32 32 0 0 0 618.666667 458.666667h-47.253334l71.84-86.186667 1.248-1.589333a32 32 0 0 0-50.421333-39.381334L512 430.016l-82.08-98.506667z\"  ></path></symbol><symbol id=\"icon-haoping-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM340.8 695.2c0 4.8-4 9.6-8.8 10.4l-64 2.4c-6.4 0.8-12.8-4-12.8-10.4v-240c0-6.4 5.6-11.2 12-10.4l64 2.4c4.8 0.8 8.8 5.6 8.8 10.4v235.2zM720 677.6s-14.4 49.6-32 49.6c0 0-224-21.6-284-21.6-10.4 0-19.2-8.8-19.2-19.2V458.4c0-7.2 3.2-13.6 9.6-16.8 52.8-32 145.6-112 145.6-180 0-3.2-4-44 27.2-44 0 0 78.4 18.4 29.6 212h136.8s31.2-3.2 31.2 32.8c0 0 1.6 44-44.8 215.2z\"  ></path></symbol><symbol id=\"icon-remen\" viewBox=\"0 0 1024 1024\"><path d=\"M423.477333 938.666667S45.045333 855.424 214.186667 442.282667c0 0 38.4 45.909333 33.12 68 0 0 30.101333-104.277333 95.072-166.570667C398.165333 290.186667 454.848 139.712 402.570667 85.333333c0 0 258.933333 54.378667 287.754666 326.378667 0 0 33.12-86.666667 101.12-95.232 0 0-20.906667 47.616 0 119.04 0 0 214.485333 367.146667-155.157333 491.242667 0 0 110.805333-125.813333-124.181333-341.717334 0 0-55.402667 115.626667-88.533334 156.373334-0.096 0.106667-92.522667 103.722667-0.096 197.248z\"  ></path></symbol><symbol id=\"icon-chaping-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM340.8 525.6c0 4.8-4 9.6-8.8 10.4l-64 2.4c-5.6 0.8-12-4-12-10.4V288c0-6.4 5.6-11.2 12.8-10.4l64 2.4c4.8 0.8 8.8 5.6 8.8 10.4v235.2z m424-2.4c0 35.2-31.2 32.8-31.2 32.8H596C644.8 749.6 566.4 768 566.4 768c-30.4 0-27.2-40.8-27.2-44C539.2 656 446.4 576 393.6 544c-5.6-3.2-9.6-9.6-9.6-16.8V299.2c0-10.4 8.8-19.2 19.2-19.2 60 0 284-21.6 284-21.6 17.6 0 32 49.6 32 49.6 47.2 171.2 45.6 215.2 45.6 215.2z\"  ></path></symbol><symbol id=\"icon-chuangzuo1\" viewBox=\"0 0 1024 1024\"><path d=\"M896 874.218667c17.674667 0 32 14.432 32 32.224A32.106667 32.106667 0 0 1 896 938.666667H128a32.106667 32.106667 0 0 1-32-32.213334 32.106667 32.106667 0 0 1 32-32.234666zM597.898667 238.325333l0.106666 0.106667 150.944 152a21.333333 21.333333 0 0 1 0 30.069333l-324.8 327.061334a159.690667 159.690667 0 0 1-78.048 43.264l-152.085333 34.432c-23.808 5.386667-44.608-16.981333-37.706667-40.554667l43.296-147.84a161.344 161.344 0 0 1 40.32-68.373333l327.797334-330.058667a21.333333 21.333333 0 0 1 30.176-0.106667zM840.746667 130.602667l15.082666 15.189333c45.824 46.144 45.824 120.949333 0 167.082667l-31.552 31.786666a21.333333 21.333333 0 0 1-30.176 0.106667l-0.106666-0.106667-150.944-152a21.333333 21.333333 0 0 1 0-30.08l31.754666-31.978666a116.768 116.768 0 0 1 165.941334 0z\"  ></path></symbol><symbol id=\"icon-chaping\" viewBox=\"0 0 1024 1024\"><path d=\"M320 189.6v343.2c0 10.4 5.6 20 14.4 25.6 80 48 220.8 168.8 220.8 271.2 0 4.8-5.6 66.4 40.8 66.4 0 0 118.4-28 44.8-320h208s48 4 48-48.8c0 0 2.4-66.4-68-324.8 0 0-21.6-74.4-48.8-74.4 0 0-340 32-430.4 32-16.8 0-29.6 12.8-29.6 29.6zM146.4 155.2l96 4c8 1.6 13.6 8 13.6 16v355.2c0 8-5.6 14.4-13.6 16l-96 3.2c-9.6 1.6-18.4-5.6-18.4-16V171.2c0-10.4 8.8-17.6 18.4-16z\"  ></path></symbol><symbol id=\"icon-haoping\" viewBox=\"0 0 1024 1024\"><path d=\"M320 834.4V491.2c0-10.4 5.6-20 14.4-25.6 79.2-48 220-168.8 220-271.2 0-4.8-5.6-66.4 40.8-66.4 0 0 118.4 28 44.8 320h208s47.2-4 47.2 48.8c0 0 2.4 66.4-67.2 324.8 0 0-21.6 74.4-48.8 74.4 0 0-340-32-431.2-32-15.2 0-28-13.6-28-29.6z m-173.6 34.4l96-4c8-1.6 13.6-8 13.6-16V494.4c0-8-5.6-14.4-13.6-16l-96-3.2c-9.6-1.6-18.4 5.6-18.4 16v361.6c-0.8 10.4 8 17.6 18.4 16z\"  ></path></symbol><symbol id=\"icon-yiban\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c52 0 102.4 10.4 149.6 30.4 45.6 19.2 86.4 47.2 122.4 82.4s63.2 76 82.4 122.4c20 47.2 30.4 97.6 30.4 149.6s-10.4 102.4-30.4 149.6c-19.2 45.6-47.2 86.4-82.4 122.4s-76.8 63.2-122.4 82.4c-47.2 20-97.6 30.4-149.6 30.4s-102.4-10.4-149.6-30.4c-45.6-19.2-86.4-47.2-122.4-82.4s-63.2-76.8-82.4-122.4C138.4 614.4 128 564 128 512s10.4-102.4 30.4-149.6C177.6 316.8 204.8 276 240 240s76-63.2 122.4-82.4C409.6 138.4 460 128 512 128m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM288 384c0 35.2 28.8 64 64 64s64-28.8 64-64-28.8-64-64-64-64 28-64 64z m320 0c0 35.2 28.8 64 64 64s64-28.8 64-64-28.8-64-64-64-64 28.8-64 64z m96 288c0-17.6-14.4-32-32-32H352c-17.6 0-32 14.4-32 32s14.4 32 32 32h320c17.6 0 32-14.4 32-32z\"  ></path></symbol><symbol id=\"icon-manyi\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c52 0 102.4 10.4 149.6 30.4 45.6 19.2 86.4 47.2 122.4 82.4s63.2 76 82.4 122.4c20 47.2 30.4 97.6 30.4 149.6s-10.4 102.4-30.4 149.6c-19.2 45.6-47.2 86.4-82.4 122.4s-76.8 63.2-122.4 82.4c-47.2 20-97.6 30.4-149.6 30.4s-102.4-10.4-149.6-30.4c-45.6-19.2-86.4-47.2-122.4-82.4s-63.2-76.8-82.4-122.4C138.4 614.4 128 564 128 512s10.4-102.4 30.4-149.6C177.6 316.8 204.8 276 240 240s76-63.2 122.4-82.4C409.6 138.4 460 128 512 128m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM288 384c0 35.2 28.8 64 64 64s64-28.8 64-64-28.8-64-64-64-64 28.8-64 64z m320 0.8c0 35.2 28.8 64 64 64s64-28.8 64-64-28.8-64-64-64-64 28-64 64zM512 768c46.4 0 92-15.2 132-44.8 37.6-28 68.8-67.2 91.2-114.4 8-16 0.8-35.2-15.2-42.4-16-8-35.2-0.8-42.4 15.2-17.6 37.6-43.2 68.8-72 90.4-28 20.8-60.8 32-93.6 32s-64.8-11.2-93.6-32.8c-28.8-21.6-53.6-52.8-72-90.4-8-16-27.2-22.4-42.4-15.2-16 8-22.4 26.4-15.2 42.4 22.4 47.2 54.4 86.4 91.2 114.4 40 30.4 85.6 45.6 132 45.6z\"  ></path></symbol><symbol id=\"icon-bumanyi\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c52 0 102.4 10.4 149.6 30.4 45.6 19.2 86.4 47.2 122.4 82.4s63.2 76 82.4 122.4c20 47.2 30.4 97.6 30.4 149.6s-10.4 102.4-30.4 149.6c-19.2 45.6-47.2 86.4-82.4 122.4s-76.8 63.2-122.4 82.4c-47.2 20-97.6 30.4-149.6 30.4s-102.4-10.4-149.6-30.4c-45.6-19.2-86.4-47.2-122.4-82.4s-63.2-76.8-82.4-122.4C138.4 614.4 128 564 128 512s10.4-102.4 30.4-149.6C177.6 316.8 204.8 276 240 240s76-63.2 122.4-82.4C409.6 138.4 460 128 512 128m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z\"  ></path><path d=\"M288 384c0 35.2 28.8 64 64 64s64-28.8 64-64-28.8-64-64-64-64 28.8-64 64zM608 384c0 35.2 28.8 64 64 64s64-28.8 64-64-28.8-64-64-64-64 28.8-64 64zM513.6 512.8c-46.4 0-92 15.2-132 44.8C344 585.6 312 624.8 289.6 672c-8 16-0.8 35.2 15.2 42.4 16 7.2 35.2 0.8 42.4-15.2 17.6-37.6 42.4-68.8 72-90.4C448 587.2 480 576 512.8 576s64.8 11.2 93.6 32.8c28.8 21.6 53.6 52.8 72 90.4 7.2 16 26.4 22.4 42.4 15.2 16-7.2 22.4-26.4 15.2-42.4-22.4-47.2-54.4-86.4-91.2-114.4-39.2-29.6-84.8-44.8-131.2-44.8z\"  ></path></symbol><symbol id=\"icon-liebiaoshitucaidan\" viewBox=\"0 0 1024 1024\"><path d=\"M896 256H128V128h768v128z m0 192H128v128h768V448z m0 320H128v128h768V768z\"  ></path></symbol><symbol id=\"icon-gonggeshitu\" viewBox=\"0 0 1024 1024\"><path d=\"M320 320H128V128h192v192z m288-192H416v192h192V128z m288 0H704v192h192V128zM320 416H128v192h192V416z m288 0H416v192h192V416z m288 0H704v192h192V416zM320 704H128v192h192V704z m288 0H416v192h192V704z m288 0H704v192h192V704z\"  ></path></symbol><symbol id=\"icon-Phoneshouji\" viewBox=\"0 0 1024 1024\"><path d=\"M704 128v768H320V128h384m0-64H320c-35.2 0-64 28.8-64 64v768c0 35.2 28.8 64 64 64h384c35.2 0 64-28.8 64-64V128c0-35.2-28.8-64-64-64zM272 192v64h480v-64H272z m0 576h480v-64H272v64z m176 96h128v-64H448v64z\"  ></path></symbol><symbol id=\"icon-PCtaishiji\" viewBox=\"0 0 1024 1024\"><path d=\"M640 896H384v-64h256v64z m320-704v512c0 35.2-28.8 64-64 64H128c-35.2 0-64-28.8-64-64V192c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64zM128 192v384h768V192H128z m768 512v-64H128v64h768z\"  ></path></symbol><symbol id=\"icon-PDAshouchigongzuoshebei\" viewBox=\"0 0 1024 1024\"><path d=\"M736 64H288c-35.2 0-64 28.8-64 64v128h-32v128h32v512c0 35.2 28.8 64 64 64h448c35.2 0 64-28.8 64-64V384h32V256h-32V128c0-35.2-28.8-64-64-64zM288 512V128h448v384H288z m0 384V576h448v320H288z m384-288h-64v64h64v-64z m-128 0h-64v64h64v-64z m-128 0h-64v64h64v-64z m256 96h-64v64h64v-64z m-128 0h-64v64h64v-64z m-128 0h-64v64h64v-64z m256 96h-64v64h64v-64z m-128 0h-64v64h64v-64z m-128 0h-64v64h64v-64z\"  ></path></symbol><symbol id=\"icon-jia-fangkuang\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM768 547.2H544.8V768h-65.6V547.2H256v-65.6h223.2V256h65.6v225.6H768v65.6z\"  ></path></symbol><symbol id=\"icon-jia-xianxingfangkuang\" viewBox=\"0 0 1024 1024\"><path d=\"M832 192v640H192V192h640m32-64H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM768 481.6H544.8V256h-65.6v225.6H256v65.6h223.2V768h65.6V547.2H768v-65.6z\"  ></path></symbol><symbol id=\"icon-jia-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z\"  ></path><path d=\"M768 481.6H544.8V256h-65.6v225.6H256v65.6h223.2V768h65.6V547.2H768z\"  ></path></symbol><symbol id=\"icon-jia-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m256 483.2H544.8V768h-65.6V547.2H256v-65.6h223.2V256h65.6v225.6H768v65.6z\"  ></path></symbol><symbol id=\"icon-jian-fangkuang\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM768 544H256v-64h512v64z\"  ></path></symbol><symbol id=\"icon-jia\" viewBox=\"0 0 1024 1024\"><path d=\"M896 480H544.8V128h-65.6v352H128v66.4h351.2V896h65.6V546.4H896z\"  ></path></symbol><symbol id=\"icon-jian-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m256 480H256v-64h512v64z\"  ></path></symbol><symbol id=\"icon-jian\" viewBox=\"0 0 1024 1024\"><path d=\"M128 479.2h768v65.6H128z\"  ></path></symbol><symbol id=\"icon-jian-xianxingfangkuang\" viewBox=\"0 0 1024 1024\"><path d=\"M832 192v640H192V192h640m32-64H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM768 480H256v64h512v-64z\"  ></path></symbol><symbol id=\"icon-zhengquewancheng-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 832c-212 0-384-172-384-384s172-384 384-384 384 172 384 384-172 384-384 384z\"  ></path><path d=\"M750.4 305.6L383.2 672.8 265.6 556l-44.8 44.8 116.8 117.6 45.6 44.8 44.8-44.8 367.2-367.2z\"  ></path></symbol><symbol id=\"icon-zhengquewancheng-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM428 718.4l-45.6 45.6-45.6-45.6-116-117.6 45.6-45.6L383.2 672l367.2-367.2 45.6 45.6-368 368z\"  ></path></symbol><symbol id=\"icon-zhengquewancheng\" viewBox=\"0 0 1024 1024\"><path d=\"M219.952 512.576l210.432 210.432-45.248 45.256-210.432-210.432z\"  ></path><path d=\"M799.672 262.264l45.256 45.256-460.464 460.464-45.256-45.256z\"  ></path></symbol><symbol id=\"icon-jian-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m256 416H256v64h512v-64z\"  ></path></symbol><symbol id=\"icon-cuowuguanbiquxiao-xianxingfangkuang\" viewBox=\"0 0 1024 1024\"><path d=\"M832 192v640H192V192h640m32-64H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM750.4 318.4l-45.6-45.6L512 467.2 318.4 273.6l-45.6 45.6L467.2 512 273.6 705.6l45.6 45.6L512 557.6l193.6 193.6 45.6-45.6L557.6 512l192.8-193.6z\"  ></path></symbol><symbol id=\"icon-cuowuguanbiquxiao-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m238.4 641.6l-45.6 45.6L512 557.6 318.4 750.4l-45.6-45.6L467.2 512 273.6 318.4l45.6-45.6L512 467.2l193.6-193.6 45.6 45.6L557.6 512l192.8 193.6z\"  ></path></symbol><symbol id=\"icon-cuowuguanbiquxiao-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m238.4 254.4l-45.6-45.6L512 467.2 318.4 273.6l-45.6 45.6L467.2 512 273.6 705.6l45.6 45.6L512 557.6l193.6 193.6 45.6-45.6L557.6 512l192.8-193.6z\"  ></path></symbol><symbol id=\"icon-cuowuguanbiquxiao\" viewBox=\"0 0 1024 1024\"><path d=\"M806.4 263.2l-45.6-45.6L512 467.2 263.2 217.6l-45.6 45.6L467.2 512 217.6 760.8l45.6 45.6L512 557.6l248.8 248.8 45.6-45.6L557.6 512z\"  ></path></symbol><symbol id=\"icon-cuowuguanbiquxiao-fangkuang\" viewBox=\"0 0 1024 1024\"><path d=\"M864 128H160c-17.6 0-32 14.4-32 32v704c0 17.6 14.4 32 32 32h704c17.6 0 32-14.4 32-32V160c0-17.6-14.4-32-32-32zM750.4 705.6l-45.6 45.6L512 557.6 318.4 750.4l-45.6-45.6L467.2 512 273.6 318.4l45.6-45.6L512 467.2l193.6-193.6 45.6 45.6L557.6 512l192.8 193.6z\"  ></path></symbol><symbol id=\"icon-xinxi-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m32 192h-64v64h64v-64z m0 448V384h-32.8L384 418.4l16.8 61.6 79.2-21.6V704H384v64h256v-64H544z\"  ></path></symbol><symbol id=\"icon-xinxi\" viewBox=\"0 0 1024 1024\"><path d=\"M480 128h64v64h-64zM544 832V256h-32.8L384 290.4l16.8 61.6 79.2-21.6V832H384v64h256v-64z\"  ></path></symbol><symbol id=\"icon-wenhao-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m32 704h-64v-64h64v64z m11.2-203.2l-5.6 4.8c-3.2 2.4-5.6 8-5.6 12.8v58.4h-64v-58.4c0-24.8 11.2-48 29.6-63.2l5.6-4.8c56-44.8 83.2-68 83.2-108C598.4 358.4 560 320 512 320c-49.6 0-86.4 36.8-86.4 86.4h-64C361.6 322.4 428 256 512 256c83.2 0 150.4 67.2 150.4 150.4 0 72.8-49.6 112.8-107.2 158.4z\"  ></path></symbol><symbol id=\"icon-wenhao\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c-117.6 0-209.6 92-209.6 209.6h64C366.4 254.4 428.8 192 512 192c80 0 145.6 65.6 145.6 145.6 0 68-42.4 104.8-130.4 174.4l-8.8 7.2c-24 19.2-39.2 52-39.2 84.8V768h64V604c0-12.8 6.4-28 15.2-34.4l8.8-7.2c86.4-68.8 154.4-123.2 154.4-224.8C721.6 222.4 628 128 512 128zM479.2 832h64v64h-64z\"  ></path></symbol><symbol id=\"icon-wenhao-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m32 704h-64v-64h64v64z m11.2-203.2l-5.6 4.8c-3.2 2.4-5.6 8-5.6 12.8v58.4h-64v-58.4c0-24.8 11.2-48 29.6-63.2l5.6-4.8c56-44.8 83.2-68 83.2-108C598.4 358.4 560 320 512 320c-49.6 0-86.4 36.8-86.4 86.4h-64C361.6 322.4 428 256 512 256c83.2 0 150.4 67.2 150.4 150.4 0 72.8-49.6 112.8-107.2 158.4z\"  ></path></symbol><symbol id=\"icon-xinxi-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m-32 192h64v64h-64v-64z m160 512H384v-64h96V458.4L400.8 480 384 418.4 511.2 384H544v320h96v64z\"  ></path></symbol><symbol id=\"icon-gantanhao-sanjiaokuang\" viewBox=\"0 0 1024 1024\"><path d=\"M957.6 872l-432-736c-6.4-10.4-21.6-10.4-27.2 0l-432 736c-6.4 10.4 1.6 24 13.6 24h864c12 0 20-13.6 13.6-24z m-416-104h-64v-64h64v64z m-63.2-128V384h64v256h-64z\"  ></path></symbol><symbol id=\"icon-gantanhao-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m32 704h-64v-64h64v64z m-64-128V256h64v384h-64z\"  ></path></symbol><symbol id=\"icon-gantanhao-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z\"  ></path><path d=\"M480 704h64v64h-64zM480 256h64v384h-64z\"  ></path></symbol><symbol id=\"icon-gantanhao-xianxingsanjiaokuang\" viewBox=\"0 0 1024 1024\"><path d=\"M957.6 872l-432-736c-3.2-5.6-8.8-8-13.6-8s-10.4 2.4-13.6 8l-432 736c-6.4 10.4 1.6 24 13.6 24h864c12 0 20-13.6 13.6-24z m-793.6-40L512 239.2l348 592.8h-696zM480 704h64v64h-64v-64z m0-320h64v256h-64V384z\"  ></path></symbol><symbol id=\"icon-gantanhao\" viewBox=\"0 0 1024 1024\"><path d=\"M544 896h-64v-64h64v64z m-64-128h64V128h-64v640z\"  ></path></symbol><symbol id=\"icon-shangyiyehoutuifanhui-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 832c-212 0-384-172-384-384s172-384 384-384 384 172 384 384-172 384-384 384z m158.4-610.4L444 512l226.4 226.4-44.8 45.6-272-272 272-272 44.8 45.6z\"  ></path></symbol><symbol id=\"icon-shangyiyehoutuifanhui-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m158.4 674.4L625.6 784l-272-272 272-272 45.6 45.6L444 512l226.4 226.4z\"  ></path></symbol><symbol id=\"icon-xiayiyeqianjinchakangengduo-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM398.4 240l-45.6 45.6L580 512 353.6 738.4l45.6 45.6 272-272-272.8-272z\"  ></path></symbol><symbol id=\"icon-xiayiyeqianjinchakangengduo-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64zM398.4 784l-45.6-45.6L580 512 353.6 285.6l45.6-45.6 272 272-272.8 272z\"  ></path></symbol><symbol id=\"icon-shangyiyehoutuifanhui\" viewBox=\"0 0 1024 1024\"><path d=\"M319.64 512.016l336.016-336.008 45.248 45.248L364.896 557.28z\"  ></path><path d=\"M365.216 466.464l339.976 339.968-45.256 45.256-339.976-339.976z\"  ></path></symbol><symbol id=\"icon-xiayiyeqianjinchakangengduo\" viewBox=\"0 0 1024 1024\"><path d=\"M658.56 557.392L322.536 221.384l45.248-45.256 336.016 336.008z\"  ></path><path d=\"M704.088 512.2L364.12 852.16l-45.256-45.248 339.976-339.976z\"  ></path></symbol><symbol id=\"icon-xiangxiazhankai-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m226.4 322.4L512 613.6 285.6 386.4 240 432l226.4 226.4L512 704l45.6-45.6L784 432l-45.6-45.6z\"  ></path></symbol><symbol id=\"icon-xiangxiazhankai-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m0 640L240 432l45.6-45.6L512 613.6l226.4-226.4 45.6 45.6L512 704z\"  ></path></symbol><symbol id=\"icon-xiangxiazhankai\" viewBox=\"0 0 1024 1024\"><path d=\"M806.4 319.2L512 613.6 221.6 323.2 176 368l290.4 290.4L512 704l45.6-45.6 294.4-294.4z\"  ></path></symbol><symbol id=\"icon-xiangshangshouqi-yuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m226.4 573.6L512 410.4 285.6 637.6 240 592l272-272 272 272-45.6 45.6z\"  ></path></symbol><symbol id=\"icon-xiangshangshouqi-xianxingyuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M512 128c212 0 384 172 384 384s-172 384-384 384-384-172-384-384 172-384 384-384m0-64C264.8 64 64 264.8 64 512s200.8 448 448 448 448-200.8 448-448S759.2 64 512 64z m272 530.4L557.6 368 512 322.4 466.4 368 240 594.4l45.6 45.6L512 413.6 738.4 640l45.6-45.6z\"  ></path></symbol><symbol id=\"icon-zhixiangzuo\" viewBox=\"0 0 1024 1024\"><path d=\"M896 544H250.4l242.4 242.4L448 832 173.6 557.6 128 512l45.6-45.6L448 192l45.6 45.6L250.4 480H896v64z\"  ></path></symbol><symbol id=\"icon-zhixiangyou\" viewBox=\"0 0 1024 1024\"><path d=\"M128 480h645.6L530.4 237.6 576 192l274.4 274.4L896 512l-45.6 45.6L576 832l-45.6-45.6L773.6 544H128v-64z\"  ></path></symbol><symbol id=\"icon-zhixiangshang\" viewBox=\"0 0 1024 1024\"><path d=\"M480 896V250.4L237.6 493.6 192 448l274.4-274.4L512 128l45.6 45.6L832 448l-45.6 45.6L544 250.4V896h-64z\"  ></path></symbol><symbol id=\"icon-weixin2\" viewBox=\"0 0 1024 1024\"><path d=\"M669.103 367.838c10.238 0 20.366 0.75 30.413 1.87-27.328-127.25-163.368-221.792-318.656-221.792-173.605 0-315.816 118.336-315.816 268.6 0 86.735 47.312 157.962 126.375 213.206l-31.587 95.004 110.404-55.364c39.504 7.82 71.2 15.861 110.623 15.861 9.91 0 19.74-0.491 29.485-1.257-6.17-21.116-9.746-43.231-9.746-66.175 0.001-137.978 118.486-249.953 268.505-249.953z m-169.81-85.63c23.778 0 39.53 15.644 39.53 39.41 0 23.669-15.752 39.531-39.53 39.531-23.672 0-47.423-15.86-47.423-39.531 0-23.765 23.751-39.41 47.422-39.41zM278.263 361.15c-23.67 0-47.558-15.86-47.558-39.531 0-23.766 23.887-39.41 47.558-39.41 23.67 0 39.422 15.644 39.422 39.41 0 23.67-15.753 39.531-39.422 39.531z\" fill=\"\" ></path><path d=\"M957.344 613.996c0-126.267-126.347-229.19-268.257-229.19-150.265 0-268.612 102.924-268.612 229.19 0 126.485 118.347 229.19 268.612 229.19 31.451 0 63.174-7.93 94.762-15.847l86.624 47.434-23.752-78.925c63.393-47.56 110.623-110.625 110.623-181.852z m-355.348-39.518c-15.725 0-31.586-15.643-31.586-31.602 0-15.737 15.861-31.586 31.586-31.586 23.891 0 39.534 15.849 39.534 31.586 0 15.959-15.643 31.602-39.534 31.602z m173.717 0c-15.617 0-31.369-15.643-31.369-31.602 0-15.737 15.753-31.586 31.369-31.586 23.669 0 39.531 15.849 39.531 31.586 0 15.959-15.862 31.602-39.531 31.602z\" fill=\"\" ></path></symbol><symbol id=\"icon-zhifubao\" viewBox=\"0 0 1024 1024\"><path d=\"M266.2 569.2c-10.6 8.5-21.9 20.9-25.1 36.6-4.5 21.5-0.9 48.5 19.8 69.6 25.2 25.6 63.4 32.6 79.9 33.8 44.9 3.2 92.7-19 128.7-44.4 14.1-10 38.3-30 61.4-60.9-51.8-26.8-116.5-56.3-185.7-53.5-35.2 1.7-60.5 9-79 18.8z m657.1 118.3c22.9-53.7 35.6-112.7 35.6-174.6C958.9 266.5 758.4 66 512 66S65.1 266.4 65.1 512.8 265.6 959.7 512 959.7c148.7 0 280.6-73.1 361.9-185.2-76.8-38.2-203.4-101-281.4-139-37.2 42.5-92.2 85-154.3 103.5-39 11.6-74.2 16-111 8.5-36.4-7.5-63.3-24.5-78.9-41.6-8-8.7-17.1-19.8-23.7-33 0.3 0.9 0.7 1.8 1 2.7 0 0-3.8-6.6-6.7-17-1.5-5.2-2.5-10.5-2.9-15.8-0.3-3.8-0.4-7.6-0.2-11.4-0.3-6.7-0.1-13.8 1.5-21 3.7-17.7 11.2-38.2 30.7-57.3 42.8-41.9 100.2-44.2 129.9-44 44 0.3 120.5 19.5 184.9 42.3 17.8-38 29.3-78.6 36.7-105.7H331.6v-29h137.5v-57.9H302.6v-29H469v-57.9c0-7.9 1.6-14.5 14.5-14.5h65.1v72.4h180.9v29H548.7v57.9h144.7s-14.5 81-60 160.9c100.9 35.9 242.8 91.4 289.9 109.9z\"  ></path></symbol><symbol id=\"icon-qq\" viewBox=\"0 0 1024 1024\"><path d=\"M887.428531 543.528064c-12.153808-38.698371-33.228799-69.700455-51.265594-91.02411-0.438998-23.011086-6.102998-45.387723-16.864086-66.665329-4.049223-153.764036-130.456191-277.602506-285.258882-277.602506-155.062612 0-281.637402 124.245745-285.296745 278.353612-10.403954 20.827351-15.937994 42.691311-16.479323 65.150836-18.268062 21.442358-39.626509 52.68492-51.90823 91.814102-13.059434 41.636283-17.987676 86.085634-13.521968 121.9474 5.585205 44.86072 25.566282 76.464509 56.604182 89.861634-3.691065 10.339486-5.589298 21.231557-5.589298 32.508391 0 37.323047 20.611433 70.454632 58.036811 93.293803 33.164331 20.237927 76.710103 30.93557 125.931131 30.93557 48.819892 0 94.601588-11.68104 127.661541-32.31601 2.899026 0.049119 5.808286 0.052189 8.740058 0.00307 33.066093 20.6319 78.852906 32.31294 127.663588 32.31294 49.221028 0 92.768847-10.69662 125.937271-30.934546 37.433564-22.839171 58.049091-55.971779 58.049091-93.294826 0-11.260461-1.896186-22.138206-5.582135-32.467459 31.061436-13.366426 51.086515-44.995797 56.681954-89.908706C905.432581 629.623931 900.499222 585.170486 887.428531 543.528064zM818.435181 699.610912c-2.099824 0.704035-4.176113 1.044796-6.347568 1.044796-5.408173 0-11.362792-2.229784-17.223267-6.445806l-26.166963-18.833951-0.099261 0.153496c-5.212722-3.428076-11.44875-5.429663-18.153452-5.429663-18.273179 0-33.086559 14.813381-33.086559 33.086559 0 13.175067 7.701402 24.549116 18.847254 29.871331l23.526833 14.263865c13.110599 7.949043 28.737508 21.435195 28.737508 40.549531 0 35.232432-53.846372 62.831001-122.587989 62.831001-40.189328 0-77.81425-9.984399-100.646258-26.707268l-8.837272-6.473435-10.939143 0.584308c-8.136308 0.433882-15.32708 0.425695-23.091928-0.01535l-11.005658-0.626263-8.890484 6.51846c-22.819728 16.731056-60.446697 26.718525-100.653421 26.718525-68.730361 0-122.568547-27.599591-122.568547-62.831001 0-19.188015 15.699564-32.69361 28.870538-40.645722l27.476795-16.588817-0.177032-0.26606c8.598842-5.975085 14.233166-15.919575 14.233166-27.184129 0-18.273179-14.813381-33.086559-33.086559-33.086559-8.623401 0-16.473183 3.301186-22.36231 8.705266l-21.208021 15.338337c-5.864568 4.242627-11.853979 6.483668-17.320481 6.483668-2.181689 0-4.264117-0.341784-6.311753-1.02433-25.377994-8.526187-30.344099-74.146721-10.42135-137.668453 10.80509-34.421974 31.392988-61.366649 46.763047-77.908394l9.147334-9.845229-1.028423-13.400195c-0.134053-1.74883-0.202615-3.557012-0.202615-5.373381 0-15.732309 4.212952-31.220049 12.520151-46.036499l3.922333-6.995321 0-8.928347c0-123.411751 100.476389-223.813438 223.979214-223.813438 123.492592 0 223.959771 100.401688 223.959771 223.813438l0 8.376785 3.999081 7.04751c8.489348 14.95869 12.793374 30.616298 12.793374 46.535873 0 1.986237-0.076748 3.929496-0.23536 5.939269l-1.058099 13.375635 9.099239 9.861602c15.190981 16.463973 35.545564 43.246967 46.251394 77.336366C848.791559 625.449865 843.814198 691.082678 818.435181 699.610912z\"  ></path></symbol><symbol id=\"icon-weixin\" viewBox=\"0 0 1103 1024\"><path d=\"M541.627 342.015c26.887 0 44.851-18.817 44.851-46.841 0-28.34-17.938-46.683-44.851-46.683-26.913 0-53.918 18.345-53.918 46.683 0.025 28.023 27.047 46.841 53.918 46.841zM290.811 248.495c-26.874 0-54.051 18.345-54.051 46.683 0 28.023 27.173 46.841 54.051 46.841 26.781 0 44.721-18.817 44.721-46.841-0.039-28.34-17.938-46.683-44.721-46.683zM926.073 844.057c-5.455 4.307-7.772 11.709-5.81 18.538l15.439 53.71-63.389-36.269c-2.421-1.399-5.13-2.109-7.838-2.109-1.347 0-2.683 0.17-3.993 0.535-34.004 8.989-69.174 18.241-103.441 18.241-159.127 0-288.579-114.314-288.579-254.823 0-140.509 129.453-254.8 288.579-254.8 156.093 0 287.99 116.669 287.99 254.8 0 70.064-42.236 141.869-118.958 202.175zM439.325 707.92c-10.61 0.955-21.392 1.428-32.070 1.428-36.061 0-66.572-6.516-101.847-14.131l-20.517-4.33c-3.518-0.783-7.248-0.274-10.48 1.465l-90.119 47.155 23.421-73.545c2.29-7.209-0.222-15.060-6.137-19.403-90.542-65.968-136.438-146.343-136.438-238.848 0-166.283 153.461-301.598 342.078-301.598 166.755 0 314.38 106.047 344.866 247.103-174.854 2.395-316.318 130.88-316.318 288.697 0 22.95 3.338 45.179 8.95 66.622-1.7-0.447-3.493-0.783-5.39-0.618zM1077.688 641.911c0-148.187-131.495-274.461-292.91-287.598 0.222-1.845 0.314-3.753-0.065-5.679-32.371-157.74-194.649-276.673-377.494-276.673-206.623 0-374.736 150.608-374.736 335.747 0 99.334 48.501 188.828 140.417 259.401l-32.042 100.695c-2.054 6.555-0.195 13.765 4.801 18.307 3.036 2.735 6.858 4.158 10.717 4.158 2.489 0 4.996-0.602 7.315-1.806l120.292-62.931 14.837 3.153c37.038 7.955 69.018 14.85 108.401 14.85 11.607 0 23.357-0.547 34.895-1.57 4.669-0.421 8.622-2.866 11.291-6.427 43.386 113.465 162.919 195.382 303.613 195.382 36.018 0 72.511-9.079 105.233-17.65l92.726 52.99c2.46 1.399 5.169 2.118 7.838 2.118 3.664 0 7.326-1.294 10.257-3.794 5.169-4.37 7.287-11.579 5.364-18.16l-23.682-82.324c79.405-65.603 122.935-144.065 122.935-222.192zM622.302 557.718c0 18.843 17.938 37.461 35.865 37.461 26.953 0 44.747-18.62 44.747-37.461 0-18.751-17.793-37.602-44.747-37.602-17.925 0-35.865 18.895-35.865 37.602zM819.597 557.718c0 18.843 17.925 37.461 35.602 37.461 26.848 0 44.969-18.62 44.969-37.461 0-18.751-18.096-37.602-44.969-37.602-17.676 0-35.602 18.895-35.602 37.602z\"  ></path></symbol><symbol id=\"icon-weixin1\" viewBox=\"0 0 1024 1024\"><path d=\"M311.149 313.435c-20.548 0-41.271 13.59-41.271 34.191 0 20.576 20.722 34.313 41.271 34.313 20.556 0 34.214-13.735 34.214-34.313 0-20.627-13.685-34.191-34.214-34.191M592.137 512.261c-13.662 0-27.418 13.729-27.418 27.417 0 13.853 13.757 27.418 27.418 27.418 20.72 0 34.312-13.564 34.312-27.418 0.001-13.685-13.59-27.417-34.312-27.417M972.047 191.648c0-77.52-62.846-140.37-140.37-140.37h-641.318c-77.519 0-140.37 62.845-140.37 140.37v641.318c0 77.52 62.846 140.37 140.37 140.37h641.318c77.519 0 140.37-62.845 140.37-140.37v-641.318M400.205 663.237c-34.21 0-61.729-6.991-96.015-13.764l-95.822 48.048 27.42-82.454c-68.623-47.972-109.703-109.751-109.703-185.067 0-130.446 123.434-233.139 274.119-233.139 134.79 0 252.861 82.064 276.569 192.514-8.714-0.971-17.522-1.601-26.405-1.601-130.207 0-233.037 97.18-233.037 216.927 0 19.92 3.112 39.119 8.474 57.432-8.474 0.657-17.013 1.097-25.602 1.097M804.55 759.249l20.597 68.496-75.196-41.175c-27.418 6.867-54.959 13.761-82.256 13.761-130.422 0-233.137-89.147-233.137-198.918 0-109.606 102.711-198.923 233.137-198.923 123.166 0 232.842 89.346 232.842 198.923 0.021 61.828-40.983 116.566-95.987 157.844M742.918 512.261c-13.563 0-27.224 13.729-27.224 27.417 0 13.853 13.661 27.418 27.224 27.418 20.549 0 34.313-13.564 34.313-27.418 0.001-13.685-13.783-27.417-34.313-27.417M502.99 381.933c20.648 0 34.308-13.735 34.308-34.313 0-20.627-13.661-34.191-34.308-34.191-20.556 0-41.155 13.59-41.155 34.191 0 20.576 20.597 34.313 41.155 34.313M502.99 381.933z\" fill=\"#12D21F\" ></path></symbol><symbol id=\"icon-qq1\" viewBox=\"0 0 1024 1024\"><path d=\"M960.1 512c0-247.4-200.5-447.9-447.9-447.9S64.3 264.6 64.3 512s200.5 447.9 447.9 447.9S960.1 759.3 960.1 512z\" fill=\"#04ACEE\" ></path><path d=\"M690.8 445.2c0-185.5-96.1-241.6-178.6-241.6s-180.5 55.3-180.5 241.6c0 0-62.6 140.2-62.6 207.5s56.5-32.7 56.5-32.7-1.8 67.2 56.5 113.8c0 0-70.8 28.4-47.3 42.3 23.5 13.9 170.6 2.4 170.6 2.4h10s142.1 9.1 169.1 0-16.4-38.7-44.4-44.7c56.6-50.4 56.6-113.8 56.6-113.8s55.9 101.8 55.9 34.4-61.8-209.2-61.8-209.2z\" fill=\"#FFFFFF\" ></path></symbol><symbol id=\"icon-qq2\" viewBox=\"0 0 1024 1024\"><path d=\"M505.152 933.76c0 49.728-72.768 90.112-162.496 90.112s-162.368-40.384-162.368-90.112 72.768-89.984 162.496-89.984 162.496 40.384 162.496 90.112l-0.128-0.128z m175.488-89.984c-89.728 0-162.496 40.384-162.496 90.112S590.848 1024 680.64 1024s162.496-40.384 162.496-90.112-72.896-90.112-162.496-90.112z\" fill=\"#FFC716\" ></path><path d=\"M870.848 501.376s-12.16-12.224-25.408-24.448V333.44a333.44 333.44 0 1 0-666.88 0v143.424c-13.376 12.288-25.536 24.512-25.536 24.512-21.696 33.024-73.408 117.248-73.408 196.864s21.76 93.12 29.952 93.76 35.584-6.912 68.864-58.304c45.12 149.952 177.216 258.496 333.184 258.496 156.032 0 288.576-108.544 333.44-258.496 33.536 51.648 61.76 59.328 69.376 58.56 7.552-0.768 29.952-14.272 29.952-93.76s-51.712-163.904-73.344-196.544l-0.192-0.576z\" fill=\"#37464F\" ></path><path d=\"M266.688 558.848c-2.56 19.392-3.776 38.912-3.648 58.432 0 182.144 113.408 330.176 253.312 330.176 139.968 0 253.376-147.584 253.376-330.176 0.064-19.52-1.28-39.04-3.904-58.432H266.688zM424.32 152.96c-36.672 0-67.264 40.832-67.264 91.2s30.08 91.264 67.264 91.264 67.264-40.896 67.264-91.264S461.504 152.96 424.32 152.96z m11.136 128.32c-13.568 0-24.448-16.768-24.448-37.376s11.008-37.44 24.448-37.44 24.512 16.704 24.512 37.376-11.072 37.44-24.512 37.44zM601.728 152.96c-36.672 0-67.264 40.832-67.264 91.2s30.08 91.264 67.264 91.264 67.264-40.896 67.264-91.264-30.08-91.2-67.264-91.2z m11.392 94.656a1.856 1.856 0 0 1-1.792 1.856 1.728 1.728 0 0 1-1.728-1.344 24.32 24.32 0 0 0-20.608-17.856 24.32 24.32 0 0 0-20.224 18.112 1.728 1.728 0 0 1-1.6 1.088 1.792 1.792 0 0 1-1.792-1.856v-3.072c0-20.672 11.008-37.376 24.448-37.376s24.512 16.768 24.512 37.376v3.2l-1.216-0.128z\" fill=\"#FFFFFF\" ></path><path d=\"M248 540.48c-6.144 30.592-19.072 167.872-12.992 198.528 6.144 30.528 31.808 25.344 68.736 25.728s77.504 10.112 78.144-34.752 0.768-133.248 10.88-165.888c10.176-32.64-144.768-23.616-144.768-23.616z\" fill=\"#FF3A2F\" ></path><path d=\"M239.936 606.016l143.552 46.528c0-29.632 3.136-59.2 9.344-88.128 10.176-32.64-144.768-23.872-144.768-23.872a937.6 937.6 0 0 0-8.128 65.472z\" fill=\"#DD2C00\" ></path><path d=\"M512.64 462.272c111.872 0 202.88-40.768 202.88-65.92 0-19.072-90.752-38.72-202.624-38.72-111.936 0-202.624 17.728-202.624 38.72 0 23.872 90.688 65.92 202.624 65.92H512.64z\" fill=\"#FFC716\" ></path><path d=\"M514.688 486.784s128.512 1.344 231.104-42.176c102.592-43.52 101.632-48.896 112.896-48.896s24.448 16.128 30.08 45.248c5.632 29.12 12.224 52.096-12.224 66.432-24.448 14.336-180.928 106.56-357.888 106.56h-8.832c-176.96 0-334.016-92.352-357.952-106.56-23.936-14.208-17.344-36.736-12.224-66.432 5.184-29.696 18.88-45.248 30.144-45.248s10.112 4.864 112.896 48.896c102.656 44.032 231.04 42.176 231.04 42.176h0.96z\" fill=\"#FF3A2F\" ></path></symbol><symbol id=\"icon-umidd17\" viewBox=\"0 0 1024 1024\"><path d=\"M938.7008 669.525333L938.7008 249.412267c0-90.555733-73.5232-164.078933-164.1472-164.078933L249.378133 85.333333c-90.555733 0-164.078933 73.48906699-164.078933 164.078933l0 525.2096c0 90.555733 73.454933 164.078933 164.07893301 164.078933l525.20959999 0c80.725333 0 147.8656-58.368 161.553067-135.099733-43.52-18.8416-232.106667-100.283733-330.376533-147.182933-74.786133 90.589867-153.088 144.930133-271.121067 144.930133s-196.81279999-72.704-187.357867-161.655467c6.2464-58.402133 46.2848-153.9072 220.296533-137.5232 91.682133 8.6016 133.666133 25.736533 208.418133 50.414933 19.3536-35.4304 35.4304-74.513067 47.616-116.0192L292.0448 436.565333l0-32.8704 164.0448 0 0-58.9824L256 344.712533l1e-8-36.181333 200.12373299 0L456.123733 223.3344c0 0 1.809067-13.312 16.520533-13.31200001l82.056533 1e-8 0 98.474667 213.333333 0 0 36.181333-213.333333 1e-8 0 58.98239999 174.045867 0c-16.00853301 65.1264-40.277333 124.962133-70.690133 177.220267C708.608 599.176533 938.7008 669.525333 938.7008 669.525333L938.7008 669.525333 938.7008 669.525333 938.7008 669.525333zM321.57013299 744.994133c-124.7232 0-144.452267-78.7456-137.83039999-111.65013299 6.5536-32.733867 42.666667-75.502933 112.0256-75.50293301 79.6672 0 151.04 20.445867 236.714667 62.088533C472.302933 698.333867 398.370133 744.994133 321.57013299 744.994133L321.57013299 744.994133 321.57013299 744.994133zM321.57013299 744.994133\" fill=\"#1296db\" ></path></symbol><symbol id=\"icon-electrical\" viewBox=\"0 0 1024 1024\"><path d=\"M370.99187 770.601626 670.699187 770.601626 645.723578 745.626016 645.723578 845.528454 670.699187 820.552845 370.99187 820.552845 395.967479 845.528454 395.967479 745.626016 370.99187 770.601626 370.99187 770.601626ZM370.99187 720.650406 346.01626 720.650406 346.01626 745.626016 346.01626 845.528454 346.01626 870.504064 370.99187 870.504064 670.699187 870.504064 695.674797 870.504064 695.674797 845.528454 695.674797 745.626016 695.674797 720.650406 670.699187 720.650406 370.99187 720.650406 370.99187 720.650406Z\"  ></path><path d=\"M271.089431 246.113822 271.089431 46.308943 246.113822 71.284553 395.967479 71.284553 370.99187 46.308943 370.99187 246.113822 420.943089 246.113822 420.943089 46.308943 420.943089 21.333333 395.967479 21.333333 246.113822 21.333333 221.138211 21.333333 221.138211 46.308943 221.138211 246.113822 271.089431 246.113822 271.089431 246.113822Z\"  ></path><path d=\"M670.699187 246.113822 670.699187 46.308943 645.723578 71.284553 795.577235 71.284553 770.601626 46.308943 770.601626 246.113822 820.552845 246.113822 820.552845 46.308943 820.552845 21.333333 795.577235 21.333333 645.723578 21.333333 620.747968 21.333333 620.747968 46.308943 620.747968 246.113822 670.699187 246.113822 670.699187 246.113822Z\"  ></path><path d=\"M518.451452 283.577235 920.455262 283.577235 923.213357 283.424478C937.807279 281.802931 941.097152 283.844623 942.987091 291.362852 945.984582 303.286959 943.254669 324.456107 934.89696 351.4887 921.442901 395.00519 893.19792 452.711247 874.363055 482.533118 860.952322 503.766778 840.537295 529.450351 814.418007 558.432548 802.468169 571.692196 789.457762 585.494204 775.552122 599.715902 749.051078 626.819283 720.601165 654.146697 692.145451 680.300023 682.182899 689.456493 672.935959 697.80781 664.645611 705.181888 659.693062 709.587066 656.176173 712.673604 654.335411 714.270039L670.699187 708.162603 520.845527 708.162603 520.845527 758.113822 670.699187 758.113822 680.020811 758.113822 687.062963 752.006383C689.056909 750.277097 692.730099 747.053385 697.843661 742.504988 706.330161 734.956439 715.777427 726.424196 725.947095 717.07737 755.012011 690.364132 784.082726 662.440407 811.267603 634.637653 825.625463 619.953455 839.095669 605.663674 851.523968 591.873122 879.378679 560.965282 901.420233 533.235424 916.596256 509.20672 937.611232 475.933007 967.7329 414.392777 982.619403 366.243119 993.455917 331.192945 997.202187 302.142458 991.43111 279.184954 983.167678 246.312789 956.096139 229.512221 917.697167 233.778774L920.455262 233.626016 518.451452 233.626016 518.451452 283.577235 518.451452 283.577235Z\"  ></path><path d=\"M519.564585 233.626016 117.560772 233.626016 120.318867 233.778774C81.919896 229.512221 54.848356 246.312789 46.584924 279.184954 40.813847 302.142458 44.560117 331.192945 55.396632 366.243119 70.283135 414.392777 100.404802 475.933007 121.419778 509.20672 136.595803 533.235424 158.637355 560.965282 186.492066 591.873122 198.920365 605.663674 212.39057 619.953455 226.748431 634.637653 253.933308 662.440407 283.004023 690.364132 312.068939 717.07737 322.238607 726.424196 331.685873 734.956439 340.172373 742.504988 345.285937 747.053385 348.959125 750.277097 350.953073 752.006383L357.995223 758.113822 367.316847 758.113822 542.146116 758.113822 542.146116 708.162603 367.316847 708.162603 383.680623 714.270039C381.839861 712.673604 378.322972 709.587066 373.370423 705.181888 365.080075 697.80781 355.833135 689.456493 345.870583 680.300023 317.414869 654.146697 288.964958 626.819283 262.463913 599.715902 248.558272 585.494204 235.547866 571.692196 223.598028 558.432548 197.47874 529.450351 177.063713 503.766778 163.65298 482.533118 144.818114 452.711247 116.573134 395.00519 103.119074 351.4887 94.761367 324.456107 92.031452 303.286959 95.028944 291.362852 96.918883 283.844623 100.208756 281.802931 114.802678 283.424478L117.560772 283.577235 519.564585 283.577235 519.564585 233.626016 519.564585 233.626016Z\"  ></path><path d=\"M395.967479 858.01626 395.967479 995.382114C395.967479 1009.175763 407.14944 1020.357724 420.943089 1020.357724 434.736738 1020.357724 445.918699 1009.175763 445.918699 995.382114L445.918699 858.01626C445.918699 844.222611 434.736738 833.040651 420.943089 833.040651 407.14944 833.040651 395.967479 844.222611 395.967479 858.01626L395.967479 858.01626Z\"  ></path><path d=\"M595.772358 858.01626 595.772358 995.382114C595.772358 1009.175763 606.954319 1020.357724 620.747968 1020.357724 634.541615 1020.357724 645.723578 1009.175763 645.723578 995.382114L645.723578 858.01626C645.723578 844.222611 634.541615 833.040651 620.747968 833.040651 606.954319 833.040651 595.772358 844.222611 595.772358 858.01626L595.772358 858.01626Z\"  ></path></symbol><symbol id=\"icon-home\" viewBox=\"0 0 1028 1024\"><path d=\"M888.069936 858.261269C888.32491 856.20874 888.914598 852.094677 889.885241 846.21821 891.526956 836.278925 893.64231 825.167356 896.275784 813.1847 903.790514 778.991659 913.909985 744.828819 926.92488 713.152495 929.368089 707.206091 931.895969 701.396115 934.509141 695.733175 942.165136 679.142061 953.450406 661.170575 968.046999 641.505564 974.458728 632.867471 1017.424626 580.788316 1020.344142 572.029764 1055.52539 466.486027 958.563564 369.524201 830.766591 420.642989 826.82772 422.218539 823.371255 424.80013 820.742542 428.129835L638.92436 658.432866 657.95182 649.212122 367.04273 649.212122C353.654009 649.212122 342.800304 660.065824 342.800304 673.454545 342.800304 686.843266 353.654009 697.696971 367.04273 697.696971L657.95182 697.696971C665.371135 697.696971 672.381947 694.299516 676.979282 688.476226L858.797463 458.173195 848.773414 465.660041C937.426657 430.198743 996.741887 489.513975 974.347376 556.697508 974.866139 555.14122 969.739613 561.855821 962.139777 571.067616 945.255206 591.533481 938.832814 599.51565 929.114997 612.607814 912.696166 634.727808 899.74491 655.352326 890.485409 675.418359 887.579581 681.715511 884.777966 688.154628 882.077913 694.726159 867.889685 729.258197 856.99655 766.03289 848.921077 802.77738 846.097979 815.622859 843.824317 827.565986 842.048554 838.316815 840.96871 844.854417 840.287423 849.607546 839.954918 852.284186 838.304392 865.570782 847.73729 877.67971 861.023886 879.330236 874.31048 880.980762 886.41941 871.547863 888.069936 858.261269L888.069936 858.261269Z\"  ></path><path d=\"M187.673502 852.284186C187.340997 849.607546 186.659709 844.854417 185.579865 838.316815 183.804103 827.565986 181.530441 815.622859 178.707342 802.77738 170.631869 766.03289 159.738735 729.258197 145.550507 694.726159 142.850454 688.154628 140.048839 681.715511 137.143009 675.418359 127.883509 655.352326 114.932254 634.727808 98.513423 612.607814 88.795605 599.51565 82.373214 591.533481 65.488642 571.067616 57.888805 561.855821 52.76228 555.14122 53.281043 556.697508 30.886531 489.513975 90.201763 430.198743 178.855007 465.660041L168.830956 458.173195 275.147743 592.841124C283.443989 603.3497 298.688306 605.143151 309.196885 596.846906 319.705461 588.55066 321.498909 573.306342 313.202666 562.797764L206.885879 428.129835C204.257164 424.80013 200.800701 422.218539 196.861828 420.642989 69.064856 369.524201-27.89697 466.486027 7.284277 572.029764 10.203794 580.788316 53.169693 632.867471 59.581422 641.505564 74.178015 661.170575 85.463284 679.142061 93.11928 695.733175 95.732451 701.396115 98.260331 707.206091 100.703538 713.152495 113.718434 744.828819 123.837904 778.991659 131.352636 813.1847 133.986109 825.167356 136.101464 836.278925 137.743179 846.21821 138.713821 852.094677 139.303509 856.20874 139.558484 858.261269 141.209009 871.547863 153.317939 880.980762 166.604534 879.330236 179.89113 877.67971 189.324028 865.570782 187.673502 852.284186L187.673502 852.284186Z\"  ></path><path d=\"M197.345759 964.363637 197.345759 867.393939 173.103336 891.636363 864.118745 891.636363 839.876321 867.393939 839.876321 964.363695C839.876321 977.752416 850.730024 988.606118 864.118745 988.606118 877.507466 988.606118 888.361168 977.752416 888.361168 964.363695L888.361168 867.393939C888.361168 854.005218 877.507466 843.151516 864.118745 843.151516L173.103336 843.151516C159.714614 843.151516 148.860911 854.005218 148.860911 867.393939L148.860911 964.363637C148.860911 977.752358 159.714614 988.606061 173.103336 988.606061 186.492057 988.606061 197.345759 977.752358 197.345759 964.363637L197.345759 964.363637Z\"  ></path><path d=\"M173.103336 418.90909 173.103336 249.269563C173.103336 209.075596 205.692857 176.484848 245.876149 176.484848L754.875978 176.484848C795.067558 176.484848 827.648791 209.069516 827.648791 249.269563L827.648791 418.90909 876.133638 418.90909 876.133638 249.269563C876.133638 182.293217 821.846143 128 754.875978 128L245.876149 128C178.915006 128 124.618487 182.298562 124.618487 249.269563L124.618487 418.90909 173.103336 418.90909 173.103336 418.90909Z\"  ></path></symbol><symbol id=\"icon-electronics\" viewBox=\"0 0 1024 1024\"><path d=\"M66.133333 153.6 864.120998 153.6C902.909732 153.6 934.4 185.131266 934.4 223.964112L934.4 763.733333 957.866667 740.266667 159.879001 740.266667C121.090268 740.266667 89.6 708.735401 89.6 669.902556L89.6 130.133333 66.133333 153.6 66.133333 153.6ZM66.133333 106.666667 42.666667 106.666667 42.666667 130.133333 42.666667 669.902556C42.666667 734.642304 95.156023 787.2 159.879001 787.2L957.866667 787.2 981.333333 787.2 981.333333 763.733333 981.333333 223.964112C981.333333 159.224362 928.843977 106.666667 864.120998 106.666667L66.133333 106.666667 66.133333 106.666667Z\"  ></path><path d=\"M408.297397 766.222694 337.897397 930.489361C332.792092 942.401739 338.310315 956.197297 350.222694 961.302603 362.135072 966.407908 375.93063 960.889685 381.035936 948.977306L451.435936 784.710639C456.541242 772.798261 451.023019 759.002703 439.110639 753.897397 427.198261 748.792092 413.402703 754.310315 408.297397 766.222694L408.297397 766.222694Z\"  ></path><path d=\"M587.343202 848.540474 669.476535 954.140474C677.433378 964.370701 692.176913 966.213643 702.40714 958.256798 712.637367 950.299955 714.480309 935.55642 706.523465 925.326193L624.390131 819.726193C616.433289 809.495966 601.689754 807.653024 591.459526 815.609869 581.229299 823.566711 579.386357 838.310246 587.343202 848.540474L587.343202 848.540474Z\"  ></path><path d=\"M242.133333 974.933333 805.455541 974.933333C818.415825 974.933333 828.922208 964.426948 828.922208 951.466667 828.922208 938.506385 818.415825 928 805.455541 928L242.133333 928C229.173051 928 218.666667 938.506385 218.666667 951.466667 218.666667 964.426948 229.173051 974.933333 242.133333 974.933333L242.133333 974.933333Z\"  ></path></symbol><symbol id=\"icon-gifts\" viewBox=\"0 0 1024 1024\"><path d=\"M151.31783 556.31747 151.31783 883.907454C151.31783 920.029577 180.635004 949.418204 216.629434 949.418204L784.642673 949.418204C820.737084 949.418204 849.954278 920.237995 849.954278 884.101732L849.954278 567.069766 806.295364 567.069766 806.295364 884.101732C806.295364 896.113453 796.637303 905.759287 784.642673 905.759287L216.629434 905.759287C204.770979 905.759287 194.976744 895.941182 194.976744 883.907454L194.976744 556.31747 151.31783 556.31747 151.31783 556.31747Z\"  ></path><path d=\"M544.248062 927.255814 544.248062 305.116279 500.589148 305.116279 500.589148 927.255814 544.248062 927.255814 544.248062 927.255814Z\"  ></path><path d=\"M85.829457 326.945737 828.143565 326.945737C864.241261 326.945737 893.519379 356.278505 893.519379 392.485833L893.519379 545.240309 915.348836 523.410852 173.03473 523.410852C136.937034 523.410852 107.658915 494.078084 107.658915 457.870756L107.658915 305.116279 85.829457 326.945737 85.829457 326.945737ZM85.829457 283.286822 64 283.286822 64 305.116279 64 457.870756C64 518.17203 112.806637 567.069766 173.03473 567.069766L915.348836 567.069766 937.178295 567.069766 937.178295 545.240309 937.178295 392.485833C937.178295 332.184559 888.371659 283.286822 828.143565 283.286822L85.829457 283.286822 85.829457 283.286822Z\"  ></path><path d=\"M456.930234 261.457365 587.906976 261.457365 566.077519 239.627906 566.077519 305.116279 587.906976 283.286822 456.930234 283.286822 478.759691 305.116279 478.759691 239.627906 456.930234 261.457365 456.930234 261.457365ZM456.930234 217.79845 435.100774 217.79845 435.100774 239.627906 435.100774 305.116279 435.100774 326.945737 456.930234 326.945737 587.906976 326.945737 609.736433 326.945737 609.736433 305.116279 609.736433 239.627906 609.736433 217.79845 587.906976 217.79845 456.930234 217.79845 456.930234 217.79845Z\"  ></path><path d=\"M551.660693 251.486788C552.55357 250.106889 554.286927 247.460145 556.764205 243.728553 560.914573 237.47673 565.616813 230.502266 570.773873 222.987694 585.499725 201.530022 600.893771 180.079304 616.162106 160.113019 624.310061 149.458001 632.211424 139.508136 639.79069 130.397706 667.823241 96.702015 691.414249 75.906977 697.054263 75.906977 731.078613 75.906977 790.860256 113.663803 821.48217 154.493023 826.567552 161.273533 823.726334 180.275765 811.048563 206.999126 805.881086 217.891608 810.522118 230.910777 821.414601 236.078255 832.307083 241.245732 845.326251 236.6047 850.49373 225.712218 869.606571 185.424421 874.534694 152.464863 856.409301 128.297674 818.268427 77.443174 746.7095 32.248062 697.054263 32.248062 672.038714 32.248062 644.340604 56.663432 606.227876 102.475701 598.243548 112.073026 589.974942 122.485343 581.481306 133.592407 565.71088 154.21527 549.895622 176.252924 534.776514 198.283624 529.487838 205.989982 524.661009 213.149239 520.390835 219.581526 517.815787 223.460397 515.989067 226.2497 515.005973 227.769026 508.456493 237.890948 511.352531 251.40579 521.474453 257.955268 531.596375 264.504747 545.111215 261.60871 551.660693 251.486788L551.660693 251.486788Z\"  ></path><path d=\"M537.988958 227.769026C537.005865 226.2497 535.179145 223.460397 532.604096 219.581526 528.333922 213.149239 523.507093 205.989982 518.218415 198.283624 503.099307 176.252924 487.284049 154.21527 471.513626 133.592407 463.019987 122.485343 454.751383 112.073026 446.767055 102.475701 408.654327 56.663432 380.956218 32.248062 355.940668 32.248062 306.285431 32.248062 234.726504 77.443174 196.585628 128.297674 178.612682 152.261603 183.326064 184.892714 202.033209 224.720828 208.2705 238.000222 216.033171 251.855612 224.982418 266.060766 233.201436 279.106825 241.973779 291.750138 250.747785 303.541662 256.034751 310.646895 260.185632 315.936681 262.642498 318.939516L296.432634 291.293041C294.378822 288.782827 290.636015 284.013082 285.773954 277.478882 277.632915 266.538016 269.490213 254.802185 261.921855 242.788919 253.864791 229.999929 246.954809 217.666482 241.55017 206.159831 229.189078 179.842667 226.494032 161.18466 231.51276 154.493023 262.134675 113.663803 321.916316 75.906977 355.940668 75.906977 361.580681 75.906977 385.171691 96.702015 413.204241 130.397706 420.783505 139.508136 428.68487 149.458001 436.832823 160.113019 452.101161 180.079304 467.495204 201.530022 482.221058 222.987694 487.378116 230.502266 492.080356 237.47673 496.230726 243.728553 498.708002 247.460145 500.441361 250.106889 501.334236 251.486788L537.988958 227.769026 537.988958 227.769026Z\"  ></path></symbol><symbol id=\"icon-lights\" viewBox=\"0 0 1024 1024\"><path d=\"M679.665263 962.872969C675.413163 963.001581 667.598765 963.2272 656.935307 963.517485 639.154961 964.001508 619.950714 964.48557 600.03657 964.937329 574.44019 965.51799 549.558818 966.001798 526.108928 966.356444 483.043249 967.00775 447.182615 967.188531 421.024495 966.792926 406.443524 966.57241 395.149568 966.173867 387.624841 965.604864 384.224145 965.34771 381.80234 965.066908 380.72791 964.855669 381.194349 964.947373 381.890485 965.140388 383.258458 965.740358 390.735245 969.01955 397.00813 974.806517 397.00813 987.317073 397.00813 946.892646 397.00813 946.892646 397.00813 894.103904 397.00813 852.327012 397.00813 852.327012 397.00813 816.678624 397.00813 783.725284 397.00813 783.725284 397.00813 775.357623 397.00813 768.300672 393.959659 761.587733 388.646061 756.943787 387.096252 755.589293 384.043748 752.848371 379.704591 748.83335 372.388975 742.064213 364.215511 734.243153 355.400661 725.483543 330.191165 700.432021 304.977793 672.961018 281.499353 644.006176 238.026531 590.393216 205.693847 538.062669 189.10623 490.052535 181.047142 466.726829 176.910569 444.910645 176.910569 424.845527 176.910569 229.004458 335.671125 70.243903 531.512194 70.243903 727.353265 70.243903 886.113822 229.004458 886.113822 424.845527 886.113822 442.854963 882.465941 462.234505 875.316446 482.83136 857.948181 532.867281 820.944222 587.726451 770.158263 643.857971 744.062129 672.700896 716.032405 700.0032 688.004092 724.852435 678.2009 733.543708 669.109867 741.297751 660.971618 748.004448 656.141248 751.985137 652.740241 754.702895 651.008689 756.048719 645.047855 760.681692 641.560975 767.808055 641.560975 775.357621L641.560975 889.495936 666.01626 865.040651 384.780489 865.040651C371.274208 865.040651 360.325203 875.989653 360.325203 889.495936 360.325203 903.002217 371.274208 913.951219 384.780489 913.951219L666.01626 913.951219C679.522541 913.951219 690.471546 903.002217 690.471546 889.495936L690.471546 775.357621 681.023831 794.666526C683.113419 793.042423 686.877045 790.034895 692.077163 785.7495 700.656395 778.67939 710.193408 770.544956 720.451194 761.45065 749.739953 735.483936 779.027302 706.95664 806.427104 676.672828 861.228109 616.103652 901.60938 556.237542 921.522494 498.870214 930.372414 473.374637 935.02439 448.660785 935.02439 424.845527 935.02439 201.991897 754.365826 21.333333 531.512194 21.333333 308.658563 21.333333 128 201.991897 128 424.845527 128 450.733632 133.140183 477.842833 142.877122 506.024804 161.629467 560.300386 196.757585 617.155351 243.508777 674.811369 268.176678 705.233116 294.548672 733.966485 320.924541 760.177071 330.16457 769.359198 338.75635 777.580538 346.486466 784.73321 351.174748 789.071275 354.570415 792.120333 356.459629 793.771458L348.097562 775.357621C348.097562 783.725284 348.097562 783.725284 348.097562 816.678624 348.097559 852.32701 348.097559 852.32701 348.097559 894.103904 348.097559 946.892646 348.097559 946.892646 348.097562 987.317073 348.097562 1000.40506 354.962325 1006.738057 363.613472 1010.532303 366.137018 1011.639087 368.552418 1012.308794 371.29242 1012.847494 374.652378 1013.508083 378.769417 1013.985442 383.936862 1014.376192 392.646507 1015.034797 404.802199 1015.46375 420.284879 1015.697903 447.038784 1016.102517 483.33091 1015.919563 526.848544 1015.261421 550.431567 1014.904762 575.433585 1014.418609 601.145837 1013.835317 621.138404 1013.381779 640.415629 1012.895878 658.266276 1012.409941 668.981414 1012.118251 676.844655 1011.891221 681.143991 1011.761178 694.644098 1011.352838 705.257071 1000.077815 704.848732 986.577709 704.440393 973.077602 693.16537 962.464629 679.665263 962.872969L679.665263 962.872969Z\"  ></path><path d=\"M379.715633 552.186807 501.992055 674.46323C511.189239 683.660414 525.97641 684.04928 535.644275 675.348201L657.920698 565.299422C667.959838 556.264196 668.77367 540.801367 659.738445 530.762229 650.703219 520.723089 635.240393 519.909257 625.201252 528.944482L502.92483 638.993261 536.57705 639.878234 414.300627 517.601811C404.750244 508.051428 389.266016 508.051428 379.715633 517.601811 370.16525 527.152194 370.16525 542.636425 379.715633 552.186807L379.715633 552.186807Z\"  ></path><path d=\"M494.829269 669.398374 494.829269 877.268292 543.739838 877.268292 543.739838 669.398374 494.829269 669.398374 494.829269 669.398374Z\"  ></path></symbol><symbol id=\"icon-sports\" viewBox=\"0 0 1024 1024\"><path d=\"M89.619174 149.37178 304.171556 352.128083C309.603234 357.261129 316.793295 360.121009 324.266667 360.121009L732.101412 360.121009C748.259686 360.121009 761.358554 347.02214 761.358554 330.863866 761.358554 314.705591 748.259686 301.606722 732.101412 301.606722L324.266667 301.606722 344.361777 309.599648 129.809397 106.843346C118.065494 95.745123 99.548292 96.268549 88.450069 108.012452 77.351846 119.756354 77.875272 138.273556 89.619174 149.37178L89.619174 149.37178Z\"  ></path><path d=\"M102.35341 621.81072 317.324429 838.506108C328.704322 849.977282 347.228772 850.051281 358.699949 838.671388 370.171123 827.291497 370.245122 808.767046 358.865229 797.29587L143.894209 580.600484C132.514317 569.12931 113.989866 569.055309 102.518691 580.435202 91.047516 591.815095 90.973517 610.339546 102.35341 621.81072L102.35341 621.81072Z\"  ></path><path d=\"M186.715947 231.611784 27.864669 809.727189C22.747211 828.351411 36.761689 846.736134 56.076191 846.736134L981.430498 846.736134C997.588772 846.736134 1010.687642 833.637265 1010.687642 817.478991 1010.687642 801.320717 997.588772 788.22185 981.430498 788.22185L56.076191 788.22185 84.287712 825.230795 243.138991 247.115388C247.420192 231.534595 238.260064 215.433266 222.67927 211.152064 207.098477 206.870862 190.997149 216.03099 186.715947 231.611784L186.715947 231.611784Z\"  ></path><path d=\"M42.666667 954.87283 391.314285 954.87283C407.472559 954.87283 420.571428 941.773961 420.571428 925.615686 420.571428 909.457412 407.472559 896.358543 391.314285 896.358543L42.666667 896.358543C26.508393 896.358543 13.409524 909.457412 13.409524 925.615686 13.409524 941.773961 26.508393 954.87283 42.666667 954.87283L42.666667 954.87283Z\"  ></path></symbol><symbol id=\"icon-toys\" viewBox=\"0 0 1024 1024\"><path d=\"M522.666667 843.340951 522.666667 843.340951C640.39033 843.340951 731.078095 775.325129 731.078095 699.565715 731.078095 623.8063 640.39033 555.790477 522.666667 555.790477 404.943004 555.790477 314.255238 623.8063 314.255238 699.565715 314.255238 775.325129 404.943004 843.340951 522.666667 843.340951L522.666667 843.340951ZM522.666667 893.474285 522.666667 893.474285C379.876337 893.474285 264.121905 806.658462 264.121905 699.565715 264.121905 592.472966 379.876337 505.657143 522.666667 505.657143 665.456996 505.657143 781.211428 592.472966 781.211428 699.565715 781.211428 806.658462 665.456996 893.474285 522.666667 893.474285L522.666667 893.474285Z\"  ></path><path d=\"M328.758095 498.405715C378.299616 498.405715 418.460951 458.244378 418.460951 408.702857 418.460951 359.161338 378.299616 319 328.758095 319 279.216576 319 239.055238 359.161338 239.055238 408.702857 239.055238 458.244378 279.216576 498.405715 328.758095 498.405715L328.758095 498.405715ZM328.758095 448.272382C306.90445 448.272382 289.188572 430.556501 289.188572 408.702857 289.188572 386.849212 306.90445 369.133333 328.758095 369.133333 350.61174 369.133333 368.327618 386.849212 368.327618 408.702857 368.327618 430.556501 350.61174 448.272382 328.758095 448.272382L328.758095 448.272382Z\"  ></path><path d=\"M716.575238 498.405715C766.116757 498.405715 806.278095 458.244378 806.278095 408.702857 806.278095 359.161338 766.116757 319 716.575238 319 667.033717 319 626.872382 359.161338 626.872382 408.702857 626.872382 458.244378 667.033717 498.405715 716.575238 498.405715L716.575238 498.405715ZM716.575238 448.272382C694.721594 448.272382 677.005715 430.556501 677.005715 408.702857 677.005715 386.849212 694.721594 369.133333 716.575238 369.133333 738.428883 369.133333 756.144762 386.849212 756.144762 408.702857 756.144762 430.556501 738.428883 448.272382 716.575238 448.272382L716.575238 448.272382Z\"  ></path><path d=\"M932.149018 767.159371C976.421003 698.533801 1000.186667 619.863132 1000.186667 537.975238 1000.186667 291.664954 785.995691 92.773333 522.666667 92.773333 259.337643 92.773333 45.146667 291.664954 45.146667 537.975238 45.146667 784.285523 259.337643 983.177143 522.666667 983.177143 644.527081 983.177143 759.341054 940.422944 847.029762 864.729043 857.509376 855.682921 858.67145 839.854187 849.625327 829.374573 840.579204 818.894961 824.75047 817.732885 814.270857 826.779008 735.681237 894.618468 632.492169 933.04381 522.666667 933.04381 286.229538 933.04381 95.28 755.733523 95.28 537.975238 95.28 320.216954 286.229538 142.906667 522.666667 142.906667 759.103795 142.906667 950.053333 320.216954 950.053333 537.975238 950.053333 610.099727 929.130844 679.358735 890.021425 739.981858 882.516563 751.615072 885.863251 767.129549 897.496465 774.634411 909.129679 782.139273 924.644154 778.792585 932.149018 767.159371L932.149018 767.159371Z\"  ></path><path d=\"M933.297446 341.144591C975.279191 307.223305 1000.186667 256.222566 1000.186667 201.186667 1000.186667 101.856413 919.663586 21.333333 820.333333 21.333333 747.438752 21.333333 682.608077 65.107606 654.660928 131.084833L700.82362 150.638785C720.985726 103.040372 767.747089 71.466667 820.333333 71.466667 891.975712 71.466667 950.053333 129.544289 950.053333 201.186667 950.053333 240.914944 932.114135 277.647383 901.789532 302.14969L933.297446 341.144591 933.297446 341.144591Z\"  ></path><path d=\"M131.926076 302.14969C101.601472 277.647383 83.662274 240.914944 83.662274 201.186667 83.662274 129.544289 141.739897 71.466667 213.382274 71.466667 265.968518 71.466667 312.729882 103.040372 332.891987 150.638785L379.054679 131.084833C351.107531 65.107606 286.276855 21.333333 213.382274 21.333333 114.052021 21.333333 33.528941 101.856413 33.528941 201.186667 33.528941 256.222566 58.436416 307.223305 100.418161 341.144591L131.926076 302.14969 131.926076 302.14969Z\"  ></path><path d=\"M534.522306 692.21223C572.762722 692.21223 603.762705 661.212245 603.762705 622.971829 603.762705 584.731411 572.762722 553.731428 534.522306 553.731428 496.281888 553.731428 465.281905 584.731411 465.281905 622.971829 465.281905 661.212245 496.281888 692.21223 534.522306 692.21223L534.522306 692.21223ZM534.522306 642.078897C523.969764 642.078897 515.415238 633.524371 515.415238 622.971829 515.415238 612.419287 523.969764 603.864762 534.522306 603.864762 545.074848 603.864762 553.629372 612.419287 553.629372 622.971829 553.629372 633.524371 545.074848 642.078897 534.522306 642.078897L534.522306 642.078897Z\"  ></path></symbol><symbol id=\"icon-auto\" viewBox=\"0 0 1024 1024\"><path d=\"M243.809523 920.380951C311.135665 920.380951 365.714285 865.802332 365.714285 798.47619 365.714285 731.15005 311.135665 676.571428 243.809523 676.571428 176.483383 676.571428 121.904762 731.15005 121.904762 798.47619 121.904762 865.802332 176.483383 920.380951 243.809523 920.380951L243.809523 920.380951ZM243.809523 871.619049C203.413839 871.619049 170.666667 838.871874 170.666667 798.47619 170.666667 758.080506 203.413839 725.333333 243.809523 725.333333 284.205207 725.333333 316.952382 758.080506 316.952382 798.47619 316.952382 838.871874 284.205207 871.619049 243.809523 871.619049L243.809523 871.619049Z\"  ></path><path d=\"M804.571428 920.380951C871.89757 920.380951 926.47619 865.802332 926.47619 798.47619 926.47619 731.15005 871.89757 676.571428 804.571428 676.571428 737.245289 676.571428 682.666667 731.15005 682.666667 798.47619 682.666667 865.802332 737.245289 920.380951 804.571428 920.380951L804.571428 920.380951ZM804.571428 871.619049C764.175744 871.619049 731.428572 838.871874 731.428572 798.47619 731.428572 758.080506 764.175744 725.333333 804.571428 725.333333 844.967113 725.333333 877.714285 758.080506 877.714285 798.47619 877.714285 838.871874 844.967113 871.619049 804.571428 871.619049L804.571428 871.619049Z\"  ></path><path d=\"M1011.809523 810.666667 1011.809523 578.894285C1011.809523 511.523072 957.296806 456.822276 890.130281 456.822276L36.489124 456.822276C23.023896 456.822276 12.108172 467.738001 12.108172 481.20323L12.108172 701.322112C12.108172 768.56387 66.730801 823.199588 133.826317 823.199588 147.291545 823.199588 158.207269 812.283863 158.207269 798.818635 158.207269 785.353408 147.291545 774.437683 133.826317 774.437683 93.663873 774.437683 60.870076 741.63603 60.870076 701.322112L60.870076 481.20323 36.489124 505.584181 890.130281 505.584181C930.328683 505.584181 963.047618 538.416004 963.047618 578.894285L963.047618 810.666667C963.047618 824.131895 973.963343 835.047618 987.428572 835.047618 1000.893801 835.047618 1011.809523 824.131895 1011.809523 810.666667L1011.809523 810.666667ZM359.909427 823.199588 694.774837 823.199588C708.240066 823.199588 719.155791 812.283863 719.155791 798.818635 719.155791 785.353408 708.240066 774.437683 694.774837 774.437683L359.909427 774.437683C346.444198 774.437683 335.528474 785.353408 335.528474 798.818635 335.528474 812.283863 346.444198 823.199588 359.909427 823.199588L359.909427 823.199588Z\"  ></path><path d=\"M288.80963 241.582246 268.190477 252.952381 621.924403 252.952381 604.684467 245.811365 836.513681 477.640578 895.999964 473.411465 639.164341 211.331492 632.023326 204.190476 621.924403 204.190476 268.190477 204.190476 254.74595 204.190476 247.571324 215.560611 85.333333 473.411465 142.523915 473.411465 288.80963 241.582246Z\"  ></path><path d=\"M463.238095 228.571428 463.238095 472.685523 512 472.685523 512 228.571428 463.238095 228.571428 463.238095 228.571428Z\"  ></path></symbol><symbol id=\"icon-jewelry\" viewBox=\"0 0 1028 1024\"><path d=\"M793.353159 127.013285C788.757212 120.978393 781.606701 117.435964 774.021014 117.435964L526.327177 117.435964C518.583824 117.435964 483.890627 117.435964 475.060807 117.435964 466.230987 117.435964 482.176626 161.803936 483.890627 169.360544 484.416564 171.679277 503.502676 167.131636 504.788585 169.360544L666.818369 433.880875 665.166215 413.067087 478.578795 901.572521C476.722143 906.433431 475.512321 910.817907 475.060807 915.080171 473.971201 925.365995 476.431723 935.280759 487.711307 941.927533 498.610029 948.349873 508.106155 946.053523 516.598194 940.610133 520.169202 938.32112 523.548263 935.307471 527.069865 931.519855L946.940048 525.074423C956.582134 515.739556 956.831186 500.355693 947.496316 490.713604 938.161447 481.071516 922.777584 480.822466 913.135497 490.157335L492.371361 897.514955C500.172997 889.074709 528.908982 906.008098 523.97964 918.913632L710.56706 430.408196C713.176959 423.575209 712.570104 415.930089 708.914906 409.594411L547.375448 129.592684 526.327179 166.035869 774.021014 166.035869 754.688869 156.458548 959.305532 425.138701C967.436617 435.81555 982.683459 437.879298 993.360308 429.748213 1004.037157 421.617129 1006.100905 406.370287 997.96982 395.693438L793.353159 127.013285Z\"  ></path><path d=\"M773.224427 175.240885 676.300754 401.396124 661.784107 435.268299 698.635935 435.268297 990.787629 435.268294 990.787629 386.668388 698.635935 386.668393 720.971115 420.540565 817.894789 194.385325 773.224427 175.240885 773.224427 175.240885Z\"  ></path><path d=\"M451.432425 129.592684 289.892969 409.594411 284.288295 419.309178 288.044944 429.876896 461.582175 918.049299C457.173579 905.64761 485.619836 888.843351 494.238928 898.385182L48.971945 405.449026 50.918742 435.569419 244.766091 155.567692 224.786859 166.035869 472.480694 166.035869 451.432425 129.592684 451.432425 129.592684ZM493.528963 153.879148 514.553876 117.435964 472.480694 117.435964 224.786859 117.435964 212.054827 117.435964 204.807629 127.904141 10.96028 407.905867 0 423.737382 12.907077 438.026257 458.174059 930.962415C461.700269 934.866131 465.088402 937.968009 468.692781 940.328418 477.198497 945.898577 486.86492 948.259213 497.834403 941.779134 508.86517 935.26285 511.441311 925.577137 510.594149 915.413478 510.236741 911.125527 509.123525 906.690182 507.374761 901.77079L333.83753 413.598387 331.989505 433.880875 493.528963 153.879148 493.528963 153.879148Z\"  ></path><path d=\"M191.682382 194.385325 288.606057 420.540565 310.941236 386.668393 52.478105 386.668393 52.478105 435.268297 310.941236 435.268297 347.793063 435.268297 333.276417 401.396124 236.352743 175.240885 191.682382 194.385325 191.682382 194.385325Z\"  ></path><path d=\"M310.388965 422.56605 966.487683 422.56605C979.908178 422.56605 990.787636 411.68659 990.787636 398.266097 990.787636 384.845604 979.908178 373.966144 966.487683 373.966144L310.388965 373.966144C296.968472 373.966144 286.089012 384.845604 286.089012 398.266097 286.089012 411.68659 296.968472 422.56605 310.388965 422.56605L310.388965 422.56605Z\"  ></path></symbol><symbol id=\"icon-trade-assurance\" viewBox=\"0 0 1024 1024\"><path d=\"M534.373984 770.601626 534.373984 716.466991C557.788619 713.048454 593.730082 702.277724 612.297886 684.037724 630.865692 665.844553 640.278374 640.931381 640.278374 609.39187 640.278374 577.454308 631.333984 552.75187 613.211057 535.237724 595.08813 517.770406 566.779838 502.129431 528.192521 488.314797 502.717397 479.323578 485.367155 470.168454 476.024715 460.732358 466.729105 451.319676 462.022765 438.699187 462.022765 422.917724 462.022765 406.082603 466.494959 392.829918 475.486178 383.253333 484.453984 373.676749 498.268619 368.829918 516.930082 368.829918 534.865692 368.829918 548.773984 375.807479 558.654959 388.638699 568.489105 401.423089 573.453009 419.382114 573.453009 442.796749L638.569105 442.796749C638.569105 395.967479 626.978861 377.001626 610.003251 355.741139 593.097886 334.480651 581.203251 321.040651 534.373984 316.357724L534.373984 255.479676 487.544715 255.479676 487.544715 315.795772C464.130082 319.588943 436.290082 330.851381 418.44813 349.583089 400.559349 368.338212 394.167155 392.946991 394.167155 423.432845 394.167155 455.534308 404.680324 480.470895 423.271546 498.219187 441.839349 515.967479 471.037397 531.421139 509.624715 544.509918 533.484228 552.939187 550.553495 562.024064 560.22374 571.811381 569.917397 581.598699 574.92813 594.289431 574.92813 609.883578 574.92813 626.929431 569.636422 640.205527 558.865692 649.71187 548.094959 659.218212 532.594473 663.971381 512.340813 663.971381 493.32813 663.971381 477.710569 653.809431 465.394473 643.108943 453.125203 632.478699 447.013984 630.113822 447.013984 583.284553L381.640324 583.284553C381.640324 630.113822 389.577886 657.672845 410.089105 677.341139 430.62374 696.939187 464.130082 713.329431 487.544715 716.724553L487.544715 770.601626 534.373984 770.601626 534.373984 770.601626Z\"  ></path><path d=\"M941.788619 166.035772 800.832521 123.116748C793.691057 120.986016 784.980813 122.297236 779.033495 126.699187 773.086178 131.101138 768.520324 138.102114 768.520324 145.524553L768.520324 255.479676 674.861788 255.479676 674.861788 104.783089C674.861788 94.059187 670.834473 84.693333 660.414959 82.070894L516.321301 45.450406C512.574959 44.490406 509.437397 44.490406 505.691057 45.450406L362.346667 82.070894C351.950569 84.693333 347.056911 94.059187 347.056911 104.783089L347.056911 255.479676 253.398374 255.479676 253.398374 145.524553C253.398374 138.102114 250.096911 131.101138 244.149594 126.699187 238.178862 122.297236 230.63935 121.009431 223.544716 123.116748L82.612032 166.035772C72.286179 169.173333 65.495935 178.96065 66.104716 189.754797L102.842276 839.019187C103.380813 848.759676 109.960325 857.142114 119.255935 860.045527L505.246178 980.279676C507.540813 980.982114 509.882276 981.333333 512.247155 981.333333 514.612032 981.333333 516.930082 980.982114 519.224715 980.279676L905.191546 860.045527C914.487155 857.142114 921.043251 848.759676 921.581788 839.019187L924.06374 794.788943C924.087155 794.507968 924.227642 794.297235 924.227642 794.01626 924.227642 781.091381 913.737886 770.601626 900.813009 770.601626 887.88813 770.601626 877.398374 781.091381 877.398374 794.01626L877.234473 794.01626 875.759349 820.146991 512.247155 933.380162 148.68813 820.146991 113.683252 205.466016 206.569106 177.110894 206.569106 269.762603C206.569106 282.710895 217.527155 302.308943 230.475447 302.308943L366.514473 302.308943C379.439349 302.308943 393.886178 282.710895 393.886178 269.762603L393.886178 123.046504 510.959349 92.326504 628.032521 123.046504 628.032521 269.762603C628.032521 282.710895 645.031546 302.308943 657.956422 302.308943L794.018861 302.308943C806.967155 302.308943 815.349594 282.710895 815.349594 269.762603L815.349594 177.110894 909.499838 205.466016 883.860813 676.170406C883.860813 676.451381 883.720324 676.662114 883.720324 676.943089 883.720324 689.867968 894.210082 700.357724 907.134959 700.357724 920.059838 700.357724 930.549594 689.867968 930.549594 676.943089L930.760324 676.943089 958.366178 189.754797C958.974959 178.96065 952.137886 169.173333 941.788619 166.035772L941.788619 166.035772Z\"  ></path></symbol><symbol id=\"icon-browse\" viewBox=\"0 0 1024 1024\"><path d=\"M1012.444444 500.673015 1010.920636 498.133333C865.193651 280.838095 701.536508 170.666667 524.419049 170.666667 226.48889 170.666667 13.180952 497.498413 11.580952 500.673015 1.549206 520.152382 1.549206 540.8 11.580952 560.355556L13.866667 564.012698C175.568254 779.504762 338.514285 884.266667 512 884.266667 588.393651 884.266667 658.082539 863.263492 719.847618 831.568254 752.101587 815.034921 788.190477 793.701587 809.828572 774.653969 814.349205 770.641269 816.761905 763.682539 816.761905 756.825397 816.761905 742.780951 805.384128 731.428572 791.365079 731.428572 785.777777 731.428572 780.901587 733.612698 776.71111 736.634921 776.71111 736.634921 716.469841 777.371428 682.844444 793.244444 631.11111 817.726985 573.841269 833.447618 512 833.447618 356.114285 833.447618 206.958731 735.974603 56.025397 535.542857 54.323809 531.453969 54.526984 528.203174 56.533333 524.317461 58.260317 521.295238 256.812698 221.460317 524.419049 221.460317 683.174603 221.460317 832.304762 323.580952 967.796826 525.003174 968.380951 526.32381 968.71111 527.441269 968.914285 528.253969L966.679364 531.606349C949.942857 557.003174 879.009523 643.530159 871.314285 651.961905 863.619049 660.393651 860.419049 663.746031 860.419049 672.253969 860.419049 686.298413 871.796826 697.650795 885.815872 697.650795 893.079364 697.650795 898.793651 695.009523 904.177777 689.625397 909.561905 684.266667 990.907936 587.149205 1009.092064 559.568254L1009.879364 558.374603C1022.247618 544.07619 1023.339682 521.879364 1012.444444 500.673015L1012.444444 500.673015Z\"  ></path><path d=\"M393.498413 524.393651C393.498413 586.539682 448.88889 641.041269 512 641.041269 576.203174 641.041269 630.47619 587.606349 630.47619 524.393651 630.47619 461.180951 576.203174 407.796826 512 407.796826 448.88889 407.796826 393.498413 462.273015 393.498413 524.393651L393.498413 524.393651ZM579.682539 524.393651C579.682539 558.857143 547.403174 590.247618 512 590.247618 476.546031 590.247618 444.292064 558.857143 444.292064 524.393651 444.292064 489.955556 476.571428 458.590477 512 458.590477 547.428572 458.590477 579.682539 489.955556 579.682539 524.393651L579.682539 524.393651Z\"  ></path></symbol><symbol id=\"icon-rfqqm\" viewBox=\"0 0 1024 1024\"><path d=\"M647.349867 812.6816C653.312533 791.032533 656.3168 767.8928 656.3168 743.2624 656.3168 713.861867 651.202667 685.447467 640.9744 658.042133 630.746133 630.6368 615.426667 609.492267 594.9472 594.539733 574.467733 579.5872 551.144533 572.133867 524.84 572.133867 512.157867 572.133867 500.0032 573.968533 488.4448 577.614933 476.8864 581.261333 465.9472 586.7424 455.6272 594.081067 445.3072 601.419733 435.835733 611.326933 427.189867 623.871467 418.544 636.416 411.297067 653.501333 405.472 675.1504 399.646933 696.799467 396.7344 720.9024 396.7344 747.482133 396.7344 777.203733 401.4816 805.709867 410.953067 833.023467 420.424533 860.337067 435.285333 881.321067 455.512533 895.952533 475.739733 910.584 499.223467 917.899733 525.9408 917.899733 539.058667 917.899733 550.892267 916.1568 561.326933 912.648 571.7616 909.1392 583.411733 903.130667 596.2544 894.6224L630.081067 933.586133 659.642133 895.746133 627.6272 859.4656C636.479467 843.664533 643.015467 828.069867 647.349867 812.6816L647.349867 812.6816ZM596.506667 783.120533C594.855467 791.926933 591.897067 801.857067 587.539733 812.910933L561.326933 782.6848 532.2016 819.859733 557.061333 849.879467C551.098667 853.181867 545.869867 855.429333 541.374933 856.7136 536.88 857.997867 532.064 858.617067 526.812267 858.617067 511.446933 858.617067 497.916267 853.457067 486.266133 843.16 474.616 832.862933 466.199467 818.690133 460.947733 800.618667 455.696 782.5472 453.173333 764.017067 453.173333 745.0512 453.173333 723.837867 456.154667 704.000533 462.140267 685.4704 465.717867 674.714667 470.648533 665.312 476.932267 657.2624 483.216 649.2128 490.3024 642.8832 498.2144 638.3424 506.1264 633.8016 515.322667 631.508267 525.757333 631.508267 541.306133 631.508267 554.882667 636.599467 566.509867 646.736 578.137067 656.872533 586.6224 670.999467 591.92 689.070933 597.2176 707.1424 599.877867 725.6496 599.877867 744.615467 599.877867 758.3296 598.754133 771.1952 596.506667 783.120533L596.506667 783.120533Z\"  ></path><path d=\"M878.2656 580.458667 829.876267 838.229333 828.981867 838.229333 780.615467 580.458667 699.3168 580.458667 699.3168 909.666667 751.2608 909.666667 751.2608 634.4208 751.9488 634.4208 801.2096 909.666667 856.089067 909.666667 907.368 634.4208 908.033067 634.4208 908.033067 909.666667 960 909.666667 960 580.458667 878.2656 580.458667Z\"  ></path><path d=\"M785.133333 70.696533C779.4 65.284267 765.4336 62.784533 757.819733 64.7568 753.485333 65.903467 424.139733 158.6688 296.1488 449.4176 190.563733 364.151467 75.897067 335.461867 70.714133 334.223467 62.848 332.365867 54.637867 334.705067 49.065067 340.484267 43.4464 346.263467 41.359467 354.6112 43.538133 362.362667 48.2624 379.081067 158.663467 773.717867 287.571733 920.124267 312.821333 965.4864 344.1024 981.333333 365.797333 981.333333L368.067733 981.333333C385.886933 981.333333 403.3392 976.173333 420.4016 967 428.841067 963.6288 434.826667 955.4416 434.826667 945.786667 434.826667 933.104533 424.552533 922.853333 411.893333 922.853333 407.88 922.853333 407.788267 922.601067 400.977067 925.9952 394.165867 929.389333 386.506133 932.026667 381.277333 932.233067 369.994133 932.714667 362.724267 925.2384 353.894933 917.5328 335.066667 901.066667 318.5088 871.528533 313.7616 858.0896 305.666133 833.184 298.465067 800.6416 294.681067 758.696533 255.786133 328.6048 624.3248 162.911467 742.7984 120.2784 713.650133 251.319467 659 458.659733 633.452267 519.8688 630.631467 526.634133 619.348267 550.324267 619.348267 556.080533 619.348267 568.762667 629.599467 579.0368 642.2816 579.0368 651.3632 579.0368 658.954133 575.986667 662.784 565.941867 725.437867 400.684267 781.372267 142.2944 790.385067 99.3632 791.9904 91.6576 790.866667 76.1088 785.133333 70.696533L785.133333 70.696533ZM247.874133 764.062933C248.172267 767.250667 248.4704 770.392533 248.8144 773.557333 180.404267 643.594133 123.277333 469.048533 99.289067 390.8688 141.945067 406.4864 212.465067 437.8592 276.5408 491.981867 248.768533 575.642667 239.1136 667.077867 247.874133 764.062933L247.874133 764.062933Z\"  ></path></symbol><symbol id=\"icon-rfqquantity\" viewBox=\"0 0 1024 1024\"><path d=\"M933.12 879.36C933.12 879.36 879.36 877.12 803.2 854.72 899.52 771.84 960 650.88 960 514.24 960 265.6 758.4 64 512 64 265.6 64 64 265.6 64 512 64 637.44 117.76 758.4 209.6 843.52L209.6 843.52 209.6 843.52C214.08 848 220.8 850.24 225.28 850.24 238.72 850.24 247.68 841.28 247.68 827.84 247.68 821.12 245.44 816.64 240.96 812.16L240.96 812.16C155.84 733.76 108.8 626.24 108.8 512 108.8 290.24 290.24 108.8 512 108.8 733.76 108.8 915.2 290.24 915.2 512 915.2 644.16 850.24 762.88 751.68 836.8 733.76 830.08 718.08 821.12 700.16 812.16 576.96 744.96 422.4 758.4 355.2 814.4 321.6 843.52 317.12 868.16 321.6 886.08 328.32 915.2 357.44 933.12 382.08 942.08 422.4 953.28 467.2 960 512 960 603.84 960 691.2 933.12 762.88 886.08 856.96 919.68 906.24 921.92 935.36 924.16 951.04 924.16 960 915.2 960 901.76 957.76 888.32 951.04 879.36 933.12 879.36L933.12 879.36ZM512 915.2C471.68 915.2 433.6 908.48 395.52 897.28 379.84 892.8 368.64 883.84 366.4 874.88 364.16 868.16 373.12 856.96 384.32 848 408.96 827.84 460.48 812.16 520.96 812.16 570.24 812.16 626.24 823.36 680 852.48 688.96 856.96 697.92 861.44 706.88 865.92 648.64 897.28 581.44 915.2 512 915.2L512 915.2Z\"  ></path></symbol><symbol id=\"icon-atmaway\" viewBox=\"0 0 1024 1024\"><path d=\"M784.130082 627.2 784.130082 627.2C763.43961 627.2 746.666667 582.309084 746.666667 526.933333 746.666667 471.557583 763.43961 426.666667 784.130082 426.666667 804.820555 426.666667 821.593495 471.557583 821.593495 526.933333 821.593495 582.309084 804.820555 627.2 784.130082 627.2L784.130082 627.2Z\"  ></path><path d=\"M506.796749 666.133333 506.796749 666.133333C486.106276 666.133333 469.333333 626.853781 469.333333 578.4 469.333333 529.946219 486.106276 490.666667 506.796749 490.666667 527.487221 490.666667 544.260162 529.946219 544.260162 578.4 544.260162 626.853781 527.487221 666.133333 506.796749 666.133333L506.796749 666.133333Z\"  ></path><path d=\"M298.176058 170.679793C148.903723 243.807857 52.325153 380.784905 47.795479 533.899838 47.683821 537.67418 47.627907 541.454551 47.627907 545.240309 47.627907 558.392393 58.289777 569.054263 71.44186 569.054263 84.593944 569.054263 95.255814 558.392393 95.255814 545.240309 95.255814 541.924122 95.304783 538.613263 95.402558 535.308222 99.385529 400.673301 185.092659 279.115179 319.12951 213.450932 330.940433 207.664797 335.824491 193.399561 330.038353 181.588637 324.252218 169.777713 309.986982 164.893657 298.176058 170.679793L298.176058 170.679793ZM495.752687 972.469122C509.028354 973.415674 522.389387 973.891473 535.813954 973.891473 804.760642 973.891473 1024 782.759725 1024 545.240309 1024 307.720894 804.760642 116.589147 535.813954 116.589147 539.293886 116.589147 540.530596 117.143252 540.453681 117.087011 538.422812 115.602003 536.101914 113.576604 529.892474 107.917904 512.620427 92.177777 501.81277 83.341593 485.099902 72.691983 433.740934 39.965525 366.37498 21.333334 273.860465 21.333334 260.708382 21.333334 250.046511 31.995204 250.046511 45.147288 250.046511 58.299371 260.708382 68.961241 273.860465 68.961241 357.524284 68.961241 415.995189 85.133224 459.505449 112.858405 471.051998 120.215985 519.335509 164.217054 535.813954 164.217054 779.798515 164.217054 976.372094 335.588892 976.372094 545.240309 976.372094 754.891729 779.798515 926.263567 535.813954 926.263567 523.519644 926.263567 511.288412 925.828 499.139945 924.961818 486.021165 924.026453 474.628028 933.903061 473.692663 947.021843 472.757297 960.140623 482.633907 971.533758 495.752687 972.469122L495.752687 972.469122Z\"  ></path><path d=\"M238.139535 1021.519379C369.660369 1021.519379 476.27907 914.900678 476.27907 783.379844 476.27907 651.859012 369.660369 545.240309 238.139535 545.240309 106.618701 545.240309 0 651.859012 0 783.379844 0 914.900678 106.618701 1021.519379 238.139535 1021.519379L238.139535 1021.519379ZM238.139535 973.891473C132.922868 973.891473 47.627907 888.596512 47.627907 783.379844 47.627907 678.163179 132.922868 592.868218 238.139535 592.868218 343.356203 592.868218 428.651164 678.163179 428.651164 783.379844 428.651164 888.596512 343.356203 973.891473 238.139535 973.891473L238.139535 973.891473Z\"  ></path><path d=\"M214.325581 678.598449 214.325581 821.48217C214.325581 834.634255 224.987452 845.296124 238.139535 845.296124 251.291618 845.296124 261.953489 834.634255 261.953489 821.48217L261.953489 678.598449C261.953489 665.446366 251.291618 654.784497 238.139535 654.784497 224.987452 654.784497 214.325581 665.446366 214.325581 678.598449L214.325581 678.598449Z\"  ></path><path d=\"M303.689267 834.377316 237.010199 758.172666C228.349491 748.274714 213.304725 747.271729 203.406774 755.932437 193.508823 764.593146 192.505838 779.637909 201.166546 789.535861L267.845615 865.740512C276.506323 875.638464 291.551089 876.641449 301.449039 867.98074 311.346991 859.320034 312.349975 844.275268 303.689267 834.377316L303.689267 834.377316Z\"  ></path></symbol><symbol id=\"icon-rfq1\" viewBox=\"0 0 1024 1024\"><path d=\"M95.626718 342.011827C226.725812 796.475733 373.457047 950.361353 373.457047 950.361353 354.007987 919.039507 336.150869 869.63037 328.843074 791.354558 317.833444 672.837897 333.638238 571.334353 365.880738 484.600036 243.010105 376.93933 95.626718 342.011827 95.626718 342.011827M154.453485 402.085357C200.141559 420.287526 262.516736 450.592617 320.940715 497.02874 295.910059 574.000546 284.689446 656.534415 287.432249 743.345606 229.430272 623.31373 180.999358 484.063004 154.453485 402.085357\"  ></path><path d=\"M642.80007 215.333547C454.312695 361.52775 369.803151 555.00231 391.669001 790.385929 404.577508 929.521664 446.065058 979.659625 480.570786 980.177502L464.592593 980.196693C662.690323 980.196693 842.6807 354.373404 906.39853 73.934696 854.821926 91.619176 746.413321 134.966993 642.80007 215.333547ZM479.957143 1018.538624C448.174914 1018.059108 372.143181 995.215068 353.461325 793.934317 298.259684 199.18355 921.148303 28.802844 927.439454 27.134104L957.62963 19.212516 951.05062 49.728853C950.53293 52.12653 898.438257 291.99853 817.05529 528.76326 705.328546 853.758483 592.719644 1018.557805 482.393126 1018.557805L479.957143 1018.538624Z\"  ></path></symbol><symbol id=\"icon-scanning\" viewBox=\"0 0 1024 1024\"><path d=\"M910.390485 419.06176C898.522325 419.06176 888.928939 409.46816 888.928939 397.6L888.928939 139.115947C888.928939 121.36704 874.485205 106.92352 856.736469 106.92352 845.340331 106.92352 612.760491 107.1808 598.960683 107.610027 588.315605 108.2112 578.121429 100.76416 576.297259 89.754027 574.344149 78.057813 582.220672 67.004587 593.895723 65.0304 599.862059 64.02176 854.182528 64 856.736469 64 898.157525 64 931.852245 97.695147 931.852245 139.115947L931.852245 397.6C931.852245 409.46816 922.258859 419.06176 910.390485 419.06176L910.390485 419.06176Z\"  ></path><path d=\"M85.461632 419.06176C73.593387 419.06176 64 409.46816 64 397.6L64 139.115947C64 97.695147 97.694805 64 139.115819 64 141.669717 64 395.990187 64.02176 401.956565 65.0304 413.631659 67.004587 421.508139 78.057813 419.555072 89.754027 417.709355 100.76416 407.686699 108.189867 396.891605 107.610027 383.091755 107.1808 150.511915 106.92352 139.115819 106.92352 121.366912 106.92352 106.923307 121.36704 106.923307 139.115947L106.923307 397.6C106.923307 409.46816 97.329963 419.06176 85.461632 419.06176L85.461632 419.06176Z\"  ></path><path d=\"M856.736469 973.728C854.182528 973.728 599.862059 973.70624 593.895723 972.698027 582.220672 970.72384 574.344149 959.670613 576.297259 947.973973 578.121429 936.964267 588.315605 929.62432 598.960683 930.117973 612.696192 930.5472 845.340331 930.804907 856.736469 930.804907 874.485205 930.804907 888.928939 916.361387 888.928939 898.612907L888.928939 640.128427C888.928939 628.25984 898.522325 618.666667 910.390485 618.666667 922.258859 618.666667 931.852245 628.25984 931.852245 640.128427L931.852245 898.612907C931.852245 940.033707 898.157525 973.728 856.736469 973.728L856.736469 973.728Z\"  ></path><path d=\"M139.115819 973.728C97.694805 973.728 64 940.033707 64 898.612907L64 640.128427C64 628.25984 73.593387 618.666667 85.461632 618.666667 97.329963 618.666667 106.923307 628.25984 106.923307 640.128427L106.923307 898.612907C106.923307 916.361387 121.366912 930.804907 139.115819 930.804907 150.511915 930.804907 383.156139 930.5472 396.891605 930.117973 407.708245 929.64608 417.709355 936.964267 419.555072 947.973973 421.508139 959.670613 413.631659 970.72384 401.956565 972.698027 395.990187 973.70624 141.669717 973.728 139.115819 973.728L139.115819 973.728Z\"  ></path><path d=\"M983.5232 533.590187 42.794965 533.590187C30.926592 533.590187 21.333333 523.996587 21.333333 512.128 21.333333 500.260267 30.926592 490.666667 42.794965 490.666667L983.5232 490.666667C995.391488 490.666667 1004.984832 500.260267 1004.984832 512.128 1004.984832 523.996587 995.391488 533.590187 983.5232 533.590187L983.5232 533.590187Z\"  ></path></symbol><symbol id=\"icon-compare\" viewBox=\"0 0 1024 1024\"><path d=\"M247.1424 794.9824c-1.0752 0-2.176-0.0768-3.2768-0.2304-10.8032-1.3568-19.6096-9.3952-21.9648-20.0448L112.64 282.112c-3.0976-13.952 5.7088-27.7504 19.6608-30.848 13.8752-3.1232 27.7504 5.7088 30.848 19.6608l93.6704 422.3232 218.5472-428.4928c6.5024-12.7232 22.016-17.792 34.7904-11.2896 12.7232 6.5024 17.7664 22.0672 11.2896 34.7904l-251.2384 492.6208C265.7024 789.6064 256.768 794.9824 247.1424 794.9824z\"  ></path><path d=\"M669.184 793.7792c-4.8128 0-9.7024-0.128-14.6176-0.3584-58.4448-3.0976-104.9344-22.912-134.4-57.3696-24.1664-28.2112-34.8416-63.7696-30.848-102.784l0.5888-5.0176c1.9712-14.1568 14.9248-24.0128 29.2096-22.0672 14.1568 1.9712 24.0128 15.0272 22.0672 29.2096l-0.3584 3.1488c-2.5088 24.576 3.9424 46.6432 18.6624 63.8208 20.0704 23.424 53.888 37.0432 97.8432 39.3728 85.9648 4.48 151.8848-41.9584 169.9584-87.9616 18.0736-45.9776-27.6992-74.7776-48.1792-85.0176-10.3424-5.1712-31.4624-10.9056-53.7856-16.9984-65.3312-17.7664-146.6368-39.8848-174.8736-95.0784-12.1088-23.6288-12.8256-49.9968-2.176-78.336 19.0208-50.56 51.1488-86.2464 95.488-106.0096 51.5072-22.9632 119.8848-22.0416 182.8608 2.5344 75.8016 29.568 89.7792 108.3136 86.5792 145.8176-1.2032 14.2336-13.568 24.8064-27.9808 23.6032-14.208-1.2032-24.7296-13.6448-23.6032-27.8528l0 0c0.2304-2.8672 4.5568-70.5792-53.7856-93.3376-50.3552-19.6352-103.7824-20.9664-142.976-3.4816-31.2576 13.9264-54.1696 39.8592-68.1472 76.9792-7.1936 19.072-3.5584 30.0032-0.2048 36.5568 17.792 34.816 92.7488 55.1936 142.3872 68.7104 26.0096 7.0656 48.4352 13.1584 63.36 20.6336 68.1728 34.0992 96.2304 91.648 73.1904 150.2208C851.2256 734.2848 773.4272 793.7792 669.184 793.7792z\"  ></path><path d=\"M1024 214.6048 1024 732.928c0 14.08-11.52 25.6-25.6 25.6s-25.6-11.52-25.6-25.6L972.8 214.6048c0-33.536-28.416-60.928-61.952-60.928L112.128 153.6768C78.592 153.6768 51.2 178.2528 51.2 211.7888l0 597.8624c0 33.536 27.392 60.928 60.928 60.928l742.7584 0c14.08 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6L112.128 921.7792c-61.952 0-112.128-50.176-112.128-112.128L0 211.7888c0-61.952 50.176-109.312 112.128-109.312l798.72 0C972.544 102.4768 1024 152.6528 1024 214.6048z\"  ></path></symbol><symbol id=\"icon-filter\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 119.552c0 32-12.544 61.952-35.072 84.48L665.6 511.5136 665.6 998.4c0 14.08-11.52 25.6-25.6 25.6s-25.6-11.52-25.6-25.6L614.4 500.5056c0-6.912 2.816-13.824 7.936-18.432L953.088 167.424c12.544-12.544 19.712-29.696 19.712-47.872 0-37.632-30.72-68.352-68.352-68.352 0 0-784.128 0-784.896 0C81.92 51.2 51.2 81.92 51.2 119.552c0 18.176 7.168 35.328 19.968 48.384l305.152 314.88c4.864 4.864 7.68 11.52 7.68 18.432L384 870.4c0 14.336-11.52 25.6-25.6 25.6s-25.6-11.264-25.6-25.6l0-358.4L35.328 204.288C12.544 181.504 0 151.552 0 119.552c0-66.048 53.76-119.552 119.552-119.552 0.768 0 784.896 0 784.896 0C970.496 0 1024 53.504 1024 119.552z\"  ></path></symbol><symbol id=\"icon-pin\" viewBox=\"0 0 1025 1024\"><path d=\"M51.196068 1024c-13.021992 0-26.0184-5.091113-36.021541-15.094254-18.113104-18.164271-20.262117-46.050265-5.091113-66.337966l213.059228-288.325828-166.983379-166.983379C39.862586 470.961896 36.639068 445.48075 48.305135 425.2698c7.982046-12.612656 76.699275-112.82315 229.483822-75.010766 2.532765 0.307002 5.270197 0.537253 8.212297 0.793088 6.267953 0.537253 13.277827 1.17684 20.87612 2.404847 32.33752 5.244614 89.516599-20.722619 139.148552-63.037697 47.559691-40.49865 78.285451-87.751339 78.285451-120.344693 0-7.57271-0.179084-15.631507-0.358169-23.536802-1.279174-30.623426-3.223519-77.697031 31.979351-112.874317 41.649907-41.701074 107.552953-45.05251 153.270633-7.854129 0.921005 0.741921 1.76526 1.535009 2.583932 2.379264l-0.025583 0c24.585725 24.048472 276.608594 275.815506 279.243692 278.476188 21.694792 21.694792 33.642277 50.527374 33.693444 81.176384 0.025583 30.674593-11.896319 59.456009-33.539943 81.099634-35.023785 35.049369-82.353225 33.053857-113.565071 31.723516-7.393626-0.153501-15.478006-0.332585-23.025133-0.332585-30.828094 0-67.69389 21.592458-103.715431 60.760767-50.808793 55.260318-82.09739 126.63823-79.411124 158.617581 1.125673 10.258976 3.223519 28.37208 3.607271 30.930428 36.891379 149.612195-63.114447 217.843339-74.627013 225.109047-20.697036 12.484739-46.357267 9.389137-63.012113-7.240125l-178.393611-178.393611c-10.003141-10.003141-10.003141-26.171901 0-36.175042s26.171901-10.003141 36.175042 0l178.393611 178.393611c7.854129-5.091113 80.101878-54.646315 51.320462-171.76749-0.51167-2.35368-3.044434-23.562386-4.374775-35.970374-4.298025-51.115795 35.586622-136.027367 92.688951-198.118475 32.439854-35.254036 83.27423-77.287695 141.348731-77.287695 7.905296 0 16.399011 0.179084 24.662475 0.358169 32.41427 1.355924 58.048918 0.972172 75.77827-16.782763 11.973069-11.973069 18.548024-27.885994 18.548024-44.847842-0.025583-17.013015-6.677288-33.00269-18.701524-45.05251C952.220677 340.23031 683.849964 72.243349 675.944668 64.645055c-24.278723-19.724864-60.7096-17.882853-83.785899 5.21903-17.908437 17.908437-18.317772 43.491917-17.013015 75.087516 0.204668 8.800717 0.383752 17.243266 0.383752 25.148562 0 48.378362-35.995957 107.936705-96.270638 159.282751-49.478452 42.135993-122.979792 83.811483-180.491457 74.60143-6.293536-1.023339-12.049819-1.509425-17.192099-1.944345-3.325852-0.281418-6.421454-0.562837-9.312387-0.921005-2.456014-0.07675-4.860861-0.537253-7.188958-1.304758-117.760762-29.037251-167.597382 43.44075-172.893163 51.806549l182.742803 182.026466c8.954218 8.954218 10.028724 23.101883 2.481598 33.309692L51.170485 973.114457l238.617125-174.530506c11.435816-8.365798 27.425491-5.80745 35.740123 5.602782s5.80745 27.399908-5.602782 35.714539l-238.821793 174.12117C72.148939 1020.699731 61.685295 1024 51.196068 1024z\"  ></path></symbol><symbol id=\"icon-history\" viewBox=\"0 0 1024 1024\"><path d=\"M65.770667 385.770667c-11.776 0-21.333333-9.557333-21.333333-21.333333l0-256c0-11.776 9.557333-21.333333 21.333333-21.333333s21.333333 9.557333 21.333333 21.333333l0 256C87.104 376.213333 77.546667 385.770667 65.770667 385.770667z\"  ></path><path d=\"M300.437333 385.770667l-234.666667 0c-11.776 0-21.333333-9.557333-21.333333-21.333333s9.557333-21.333333 21.333333-21.333333l234.666667 0c11.776 0 21.333333 9.557333 21.333333 21.333333S312.213333 385.770667 300.437333 385.770667z\"  ></path><path d=\"M513.770667 620.437333c-11.776 0-21.333333-9.557333-21.333333-21.333333l0-384c0-11.776 9.557333-21.333333 21.333333-21.333333s21.333333 9.557333 21.333333 21.333333l0 384C535.104 610.88 525.546667 620.437333 513.770667 620.437333z\"  ></path><path d=\"M634.965333 684.885333c-5.952 0-11.861333-2.474667-16.064-7.296l-185.6-212.266667c-7.744-8.874667-6.848-22.336 2.026667-30.101333 8.896-7.744 22.357333-6.826667 30.101333 2.026667l185.6 212.266667c7.744 8.874667 6.848 22.336-2.026667 30.101333C644.949333 683.114667 639.936 684.885333 634.965333 684.885333z\"  ></path><path d=\"M513.770667 983.104c-258.794667 0-469.333333-210.538667-469.333333-469.333333 0-11.776 9.557333-21.333333 21.333333-21.333333s21.333333 9.557333 21.333333 21.333333c0 235.264 191.402667 426.666667 426.666667 426.666667 235.264 0 426.666667-191.402667 426.666667-426.666667 0-235.264-191.402667-426.666667-426.666667-426.666667-173.568 0-328.448 103.68-394.624 264.128-4.458667 10.88-16.896 16.085333-27.861333 11.584-10.88-4.48-16.085333-16.96-11.584-27.861333C152.469333 158.485333 322.858667 44.437333 513.770667 44.437333c258.794667 0 469.333333 210.538667 469.333333 469.333333S772.565333 983.104 513.770667 983.104z\"  ></path></symbol><symbol id=\"icon-productfeatures\" viewBox=\"0 0 1025 1024\"><path d=\"M302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM458.999525 1020.8768c5.888 1.792 12.544 1.28 18.688-2.304C472.055525 1021.6448 465.399525 1022.6688 458.999525 1020.8768zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808z\"  ></path><path d=\"M477.687525 1018.5472c-6.144 3.584-12.8 4.096-18.688 2.304C465.399525 1022.6688 472.055525 1021.6448 477.687525 1018.5472z\"  ></path><path d=\"M857.284325 968.6784c-14.1568 0-25.6-11.4432-25.6-25.6l0-192.1792c0-6.9888 2.8672-13.7216 7.9616-18.56l127.616-121.3696c3.712-3.712 5.888-8.9856 5.888-14.7968 0-11.904-9.7024-21.5808-21.6064-21.5808L641.757925 574.592c-11.904 0-21.6064 9.6768-21.6064 21.5808 0 5.8368 2.2272 11.136 6.4512 15.36l117.7344 121.7792c4.6336 4.7872 7.1936 11.1616 7.1936 17.792l0 141.44c0 14.1568-11.4432 25.6-25.6 25.6s-25.6-11.4432-25.6-25.6l0-131.0976-110.2336-114.0224c-13.5168-13.5168-21.1456-31.8208-21.1456-51.2512 0-40.1152 32.64-72.7808 72.8064-72.7808l309.8112 0c40.1408 0 72.8064 32.64 72.8064 72.7808 0 19.4304-7.5776 37.6832-21.3504 51.456l-120.1152 114.2528 0 181.1968C882.884325 957.2352 871.441125 968.6784 857.284325 968.6784z\"  ></path><path d=\"M920.157925 266.3936c7.9872-5.1968 9.4976-11.8016 10.5472-16.5376 1.024-9.728-3.584-19.968-13.568-25.088l-440.32-220.16c-7.168-3.584-15.36-3.584-22.528 0l-440.32 220.16C-2.414875 235.52 0.145125 259.328 0.145125 261.888l0 469.76c0 8.704 4.608 16.896 12.032 21.504 0 0 430.848 260.352 438.272 263.68 15.104 7.424 24.576 5.376 31.744 1.792l143.36-82.944c12.288-7.168 16.384-22.784 9.216-35.072-6.912-12.288-22.784-16.384-34.816-9.472l-99.072 57.6 0-0.256-10.24 5.632L490.641125 511.744l389.632-221.184L920.157925 266.3936zM440.465125 511.744l0 441.088L50.065125 717.568l0-427.52L440.465125 511.744zM465.553125 468.224 78.225125 248.576l387.328-193.536 387.328 193.536L465.553125 468.224z\"  ></path></symbol><symbol id=\"icon-supplierfeatures\" viewBox=\"0 0 1024 1024\"><path d=\"M463.027961 556.126968c-153.338036 0-278.088918-124.725448-278.088918-278.063484S309.689925 0 463.027961 0s278.063484 124.750882 278.063484 278.088918S616.365997 556.126968 463.027961 556.126968zM463.027961 50.993989c-125.208683 0-227.069495 101.860812-227.069495 227.069495s101.860812 227.044061 227.069495 227.044061 227.044061-101.860812 227.044061-227.044061C690.097456 152.854801 588.236644 50.993989 463.027961 50.993989z\"  ></path><path d=\"M33.991749 920.002782c-1.831206 0-3.662411-0.203467-5.51905-0.610402-13.759475-3.026576-22.432269-16.658884-19.405693-30.41836 27.13745-122.741642 99.724405-229.282202 204.408325-299.987085 11.673936-7.833491 27.544384-4.781481 35.403308 6.867021 7.884357 11.673936 4.806915 27.518951-6.867021 35.428742-93.79842 63.329194-158.831653 158.780786-183.12056 268.703989C56.245983 911.914957 45.691118 920.002782 33.991749 920.002782z\"  ></path><path d=\"M609.397243 920.028215 34.042615 920.028215c-14.09011 0-25.509711-11.419602-25.509711-25.509711s11.419602-25.509711 25.509711-25.509711l575.329194 0c14.09011 0 25.509711 11.419602 25.509711 25.509711S623.487352 920.028215 609.397243 920.028215z\"  ></path><path d=\"M854.67706 1024c-14.064676 0-25.433411-11.368735-25.433411-25.433411l0-190.928618c0-6.943321 2.848542-13.632308 7.909791-18.439223l126.785555-120.579802c3.687845-3.687845 5.849685-8.927127 5.849685-14.700512 0-11.826536-9.639263-21.440366-21.465799-21.440366L640.553171 632.478069c-11.826536 0-21.465799 9.613829-21.465799 21.440366 0 5.798818 2.212707 11.063534 6.40922 15.260047l116.968258 120.986737c4.603447 4.756048 7.146789 11.088967 7.146789 17.676221l0 140.519597c0 14.064676-11.368735 25.433411-25.433411 25.433411s-25.433411-11.368735-25.433411-25.433411l0-130.244499-109.516268-113.280413c-13.428841-13.428841-21.007998-31.61373-21.007998-50.917689 0-39.854155 32.427599-72.307188 72.332621-72.307188l307.795142 0c39.879589 0 72.332621 32.427599 72.332621 72.307188 0 19.303959-7.52829 37.437981-21.211465 51.121156l-119.333565 113.509314 0 180.017684C880.110471 1012.605832 868.716303 1024 854.67706 1024z\"  ></path></symbol><symbol id=\"icon-similarproduct\" viewBox=\"0 0 1025 1024\"><path d=\"M302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM458.999525 1020.8768c5.888 1.792 12.544 1.28 18.688-2.304C472.055525 1021.6448 465.399525 1022.6688 458.999525 1020.8768zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808zM302.327525 504.7808l-146.944-88.064c-11.776-7.168-27.136-3.328-34.048 8.448-7.168 11.776-3.328 27.136 8.448 34.304l146.944 88.064c11.776 7.168 27.136 3.328 34.048-8.704C317.943525 527.0272 314.103525 511.6672 302.327525 504.7808z\"  ></path><path d=\"M477.687525 1018.5472c-6.144 3.584-12.8 4.096-18.688 2.304C465.399525 1022.6688 472.055525 1021.6448 477.687525 1018.5472z\"  ></path><path d=\"M490.641125 954.112 490.641125 511.744l389.632-221.184 39.8848-24.1664c7.9872-5.1968 9.4976-11.8016 10.5472-16.5376 1.024-9.728-3.584-19.968-13.568-25.088l-440.32-220.16c-7.168-3.584-15.36-3.584-22.528 0l-440.32 220.16C-2.414875 235.52 0.145125 259.328 0.145125 261.888l0 469.76c0 8.704 4.608 16.896 12.032 21.504 0 0 430.848 260.352 438.272 263.68 15.104 7.424 24.576 5.376 31.744 1.792l143.36-82.944c12.288-7.168 16.384-22.784 9.216-35.072-6.912-12.288-22.784-16.384-34.816-9.472l-99.072 57.6 0-0.256L490.641125 954.112M440.465125 511.744l0 441.088L50.065125 717.568l0-427.52L440.465125 511.744zM465.553125 468.224 78.225125 248.576l387.328-193.536 387.328 193.536L465.553125 468.224z\"  ></path><path d=\"M812.945125 917.376l201.984-121.344c5.632-3.584 9.216-9.728 9.216-16.64l0-222.464c0-7.8336-5.888-13.312-12.288-16.384l-5.12-2.56c-0.512-0.256-1.28-0.256-1.792-0.256l1.536 0-196.352-98.048c-5.376-2.56-11.776-2.56-17.152 0l-196.096 98.048c-14.336 5.504-17.92 17.792-17.92 24.704l0 216.96c0 6.912 3.584 13.056 9.472 16.64 0 0 200.1664 120.0896 201.1904 120.3456C789.623525 916.4032 801.553125 925.2352 812.945125 917.376zM782.481125 868.224l-165.12-99.584 0-178.944 165.12 93.44L782.481125 868.224zM801.681125 650.112l-161.024-91.392 161.024-80.384 160.768 80.384L801.681125 650.112zM985.745125 768.64l-164.864 99.328 0-184.832 164.864-93.44L985.745125 768.64z\"  ></path></symbol><symbol id=\"icon-link\" viewBox=\"0 0 1025 1024\"><path d=\"M331.502964 331.496564c-11.110365 11.110365-11.110365 29.107109 0 40.191874l321.816594 321.790994c11.110365 11.161565 29.107109 11.110365 40.191874 0.0256 11.110365-11.110365 11.110365-29.081509 0-40.191874L371.720439 331.496564C360.610073 320.411799 342.61333 320.411799 331.502964 331.496564z\"  ></path><path d=\"M96.2141 59.958213 59.990213 96.2077c-79.97415 79.97415-79.99975 209.637745 0 289.611895l126.719604 126.719604c62.668604 62.719804 155.749913 75.878163 231.602476 40.243074 0.281599-0.128 0.537598-0.230399 0.844797-0.332799 0.537598-0.255999 1.177596-0.486398 1.715195-0.742398-0.0512-0.128 0.0512 0.128 0 0 2.713592-1.356796 5.171184-3.07199 7.449577-5.350383 11.238365-11.238365 11.238365-29.491108 0-40.755073-9.036772-9.011172-22.24633-10.598367-33.049497-5.171184-0.0512-0.1536 0.0768 0.1536 0 0-56.575823 25.72792-125.849207 15.180753-172.364261-31.359902L103.433277 349.621308c-59.980613-60.006212-59.980613-157.234709 0-217.215321L132.386787 103.426877c59.980613-59.980613 157.234709-59.955013 217.215321 0l119.474827 119.474827c47.283052 47.257452 57.292621 117.810832 30.131106 174.847454 0 0 0.0256-0.0256 0 0-0.0768 0.204799 0.1024-0.204799 0 0 0.0512 0.0256-0.0256-0.0256 0 0-3.839988 10.239968-2.227193 22.707129 6.015981 30.950303 11.238365 11.238365 29.491108 11.263965 40.755073 0 2.303993-2.303993 4.377586-4.915185 5.759982-7.679976 0.1536 0.0256-0.179199-0.0256 0 0 37.196684-76.313361 24.217524-170.905066-39.167878-234.316068l-126.719604-126.719604C305.851844-19.990337 176.16265-19.990337 96.2141 59.958213z\"  ></path><path d=\"M963.411389 927.155503l-36.249487 36.223887c-79.97415 79.97415-209.637745 79.97415-289.611895-0.0256l-126.719604-126.694004c-62.668604-62.668604-75.878163-155.775513-40.217474-231.602476 0.128-0.281599 0.230399-0.537598 0.332799-0.844797 0.255999-0.537598 0.511998-1.203196 0.742398-1.715195 0.128 0.0512-0.128-0.0512 0 0 1.356796-2.713592 3.07199-5.171184 5.350383-7.449577 11.238365-11.238365 29.491108-11.238365 40.780673 0 8.985572 9.011172 10.572767 22.220731 5.119984 33.049497 0.179199 0.0768-0.128-0.0768 0 0-25.72792 56.601423-15.155153 125.823607 31.385502 172.364261l119.474827 119.449227c60.006212 60.006212 157.234709 60.006212 217.215321 0l28.95351-28.95351c60.006212-60.006212 59.980613-157.234709 0-217.189721l-119.449227-119.474827c-47.283052-47.257452-117.810832-57.292621-174.847454-30.131106-0.0256 0 0.0256 0 0 0-0.204799 0.128 0.230399-0.0768 0 0-0.0256 0 0.0256 0.0256 0 0-10.239968 3.865588-22.707129 2.252793-30.950303-6.015981-11.238365-11.263965-11.238365-29.491108-0.0256-40.755073 2.303993-2.278393 4.889585-4.351986 7.705576-5.734382-0.0256-0.128 0.0256 0.179199 0 0 76.313361-37.222284 170.905066-24.217524 234.290468 39.167878l126.719604 126.719604C1043.359939 717.492158 1043.359939 847.181353 963.411389 927.155503z\"  ></path></symbol><symbol id=\"icon-cut\" viewBox=\"0 0 1024 1024\"><path d=\"M995.5584 839.0912 896 839.0912 896 355.5584c0-15.6928-12.7488-28.4416-28.4416-28.4416s-28.4416 12.7488-28.4416 28.4416l0 483.5584L225.1008 839.1168 930.3552 133.888c11.1104-11.1104 11.1104-29.1072 0-40.2176-11.136-11.1104-29.1584-11.1104-40.2432 0L184.8832 798.8992 184.8832 184.8832l469.3248 0c15.7184 0 28.416-12.7488 28.416-28.4416C682.6496 140.7488 669.952 128 654.2336 128L184.8832 128 184.8832 28.4416C184.8832 12.7488 172.16 0 156.4416 0 140.7488 0 128 12.7488 128 28.4416L128 128 28.4416 128C12.7488 128 0 140.7488 0 156.4416c0 15.6928 12.7488 28.4416 28.4416 28.4416L128 184.8832l0 682.6752C128 883.2512 140.7488 896 156.4416 896l682.6496 0 0 99.5584c0 15.6928 12.7488 28.4416 28.4416 28.4416S896 1011.2512 896 995.5584L896 896l99.5584 0C1011.2512 896 1024 883.2512 1024 867.5584S1011.2512 839.0912 995.5584 839.0912z\"  ></path></symbol><symbol id=\"icon-navlist\" viewBox=\"0 0 1024 1024\"><path d=\"M284.416 118.016l711.168 0C1011.2768 118.016 1024 105.2928 1024 89.6c0-15.6928-12.7232-28.416-28.416-28.416L284.416 61.184C268.7232 61.184 256 73.9072 256 89.6 256 105.2928 268.7232 118.016 284.416 118.016z\"  ></path><path d=\"M125.184 61.184 28.416 61.184C12.7232 61.184 0 73.9072 0 89.6c0 15.6928 12.7232 28.416 28.416 28.416l96.768 0C140.8768 118.016 153.6 105.2928 153.6 89.6 153.6 73.9072 140.8768 61.184 125.184 61.184z\"  ></path><path d=\"M995.584 342.784 284.416 342.784c-15.6928 0-28.416 12.7232-28.416 28.416 0 15.6928 12.7232 28.416 28.416 28.416l711.168 0c15.6928 0 28.416-12.7232 28.416-28.416C1024 355.5072 1011.2768 342.784 995.584 342.784z\"  ></path><path d=\"M125.184 342.784 28.416 342.784C12.7232 342.784 0 355.5072 0 371.2c0 15.6928 12.7232 28.416 28.416 28.416l96.768 0C140.8768 399.616 153.6 386.8928 153.6 371.2 153.6 355.5072 140.8768 342.784 125.184 342.784z\"  ></path><path d=\"M585.984 905.984 284.416 905.984c-15.6928 0-28.416 12.7232-28.416 28.3904 0 15.6928 12.7232 28.4416 28.416 28.4416l301.568 0c15.6928 0 28.416-12.7488 28.416-28.4416C614.4 918.7072 601.6768 905.984 585.984 905.984z\"  ></path><path d=\"M125.184 905.984 28.416 905.984C12.7232 905.984 0 918.7072 0 934.3744c0 15.6928 12.7232 28.4416 28.416 28.4416l96.768 0c15.6928 0 28.416-12.7488 28.416-28.4416C153.6 918.7072 140.8768 905.984 125.184 905.984z\"  ></path><path d=\"M585.984 624.384 284.416 624.384c-15.6928 0-28.416 12.7232-28.416 28.3904 0 15.6928 12.7232 28.4416 28.416 28.4416l301.568 0c15.6928 0 28.416-12.7488 28.416-28.4416C614.4 637.1072 601.6768 624.384 585.984 624.384z\"  ></path><path d=\"M125.184 624.384 28.416 624.384C12.7232 624.384 0 637.1072 0 652.7744c0 15.6928 12.7232 28.4416 28.416 28.4416l96.768 0c15.6928 0 28.416-12.7488 28.416-28.4416C153.6 637.1072 140.8768 624.384 125.184 624.384z\"  ></path><path d=\"M995.584 729.6256l-122.368 0 0-122.368c0-15.6928-12.7232-28.416-28.3904-28.416-15.6928 0-28.416 12.7232-28.416 28.416l0 122.368L694.016 729.6256c-15.6928 0-28.416 12.7232-28.416 28.416 0 15.6672 12.7232 28.3904 28.416 28.3904l122.3424 0L816.3584 908.8c0 15.6928 12.7232 28.416 28.416 28.416 15.6672 0 28.3904-12.7232 28.3904-28.416l0-122.3424 122.368 0c15.6928 0 28.416-12.7232 28.416-28.3904C1024 742.3488 1011.2768 729.6256 995.584 729.6256z\"  ></path></symbol><symbol id=\"icon-imagetext\" viewBox=\"0 0 1024 1024\"><path d=\"M608 293.1968c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.336-11.4432-25.9328-25.6-25.9328l-140.8 0c-14.1312 0-25.6 11.6224-25.6 25.9328 0 14.336 11.4688 25.9584 25.6 25.9584L608 293.1968 608 293.1968z\"  ></path><path d=\"M864 293.1968c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.336-11.4432-25.9328-25.6-25.9328l-140.8 0c-14.1568 0-25.6 11.6224-25.6 25.9328 0 14.336 11.4432 25.9584 25.6 25.9584L864 293.1968 864 293.1968z\"  ></path><path d=\"M608 448.8448c14.1568 0 25.6-11.5968 25.6-25.9328s-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.6224-25.6 25.9584s11.4688 25.9328 25.6 25.9328L608 448.8448 608 448.8448z\"  ></path><path d=\"M864 448.8448c14.1568 0 25.6-11.5968 25.6-25.9328s-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1568 0-25.6 11.6224-25.6 25.9584s11.4432 25.9328 25.6 25.9328L864 448.8448 864 448.8448z\"  ></path><path d=\"M608 604.544c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4688 25.9584 25.6 25.9584L608 604.544 608 604.544z\"  ></path><path d=\"M864 604.544c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1568 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4432 25.9584 25.6 25.9584L864 604.544 864 604.544z\"  ></path><path d=\"M864 604.544\"  ></path><path d=\"M608 760.2688c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4688 25.9584 25.6 25.9584L608 760.2688 608 760.2688z\"  ></path><path d=\"M864 760.2688c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1568 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4432 25.9584 25.6 25.9584L864 760.2688 864 760.2688z\"  ></path><path d=\"M864 760.2688\"  ></path><path d=\"M881.7664 64 28.4416 64 0 64l0 28.9024 0 722.5344C0 895.2576 63.6928 960 142.2336 960l853.3248 0L1024 960l0-28.9024L1024 670.976c0-15.9744-12.7232-28.9024-28.4416-28.9024-15.6928 0-28.4416 12.928-28.4416 28.9024l0 231.2192L142.2336 902.1952c-47.104 0-85.3248-38.8608-85.3248-86.784L56.9088 121.8048l824.8832 0c47.104 0 85.3248 38.912 85.3248 86.8864l0.2304 259.9424c0.4608 15.3088 12.8512 27.648 28.2624 27.648s27.8016-12.3392 28.2624-27.648L1024 208.6912C1024 128.7936 960.3328 64 881.7664 64z\"  ></path><path d=\"M142.2336 338.5856c0 55.8848 44.5696 101.1712 99.5584 101.1712 54.9888 0 99.5584-45.312 99.5584-101.1712 0-55.8592-44.5696-101.1712-99.5584-101.1712C186.8032 237.4144 142.2336 282.7008 142.2336 338.5856zM284.4416 338.5856c0 23.9616-19.0976 43.3664-42.6752 43.3664s-42.6752-19.4304-42.6752-43.3664c0-23.936 19.0976-43.3408 42.6752-43.3408S284.4416 314.6496 284.4416 338.5856z\"  ></path></symbol><symbol id=\"icon-text\" viewBox=\"0 0 1024 1024\"><path d=\"M608 293.1968c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.336-11.4432-25.9328-25.6-25.9328l-140.8 0c-14.1312 0-25.6 11.6224-25.6 25.9328 0 14.336 11.4688 25.9584 25.6 25.9584L608 293.1968 608 293.1968z\"  ></path><path d=\"M864 293.1968c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.336-11.4432-25.9328-25.6-25.9328l-140.8 0c-14.1568 0-25.6 11.6224-25.6 25.9328 0 14.336 11.4432 25.9584 25.6 25.9584L864 293.1968 864 293.1968z\"  ></path><path d=\"M608 448.8448c14.1568 0 25.6-11.5968 25.6-25.9328s-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.6224-25.6 25.9584s11.4688 25.9328 25.6 25.9328L608 448.8448 608 448.8448z\"  ></path><path d=\"M864 448.8448c14.1568 0 25.6-11.5968 25.6-25.9328s-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1568 0-25.6 11.6224-25.6 25.9584s11.4432 25.9328 25.6 25.9328L864 448.8448 864 448.8448z\"  ></path><path d=\"M608 604.544c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4688 25.9584 25.6 25.9584L608 604.544 608 604.544z\"  ></path><path d=\"M864 604.544c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1568 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4432 25.9584 25.6 25.9584L864 604.544 864 604.544z\"  ></path><path d=\"M864 604.544\"  ></path><path d=\"M608 760.2688c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4688 25.9584 25.6 25.9584L608 760.2688 608 760.2688z\"  ></path><path d=\"M864 760.2688c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1568 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4432 25.9584 25.6 25.9584L864 760.2688 864 760.2688z\"  ></path><path d=\"M864 760.2688\"  ></path><path d=\"M352 293.1968c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.336-11.4432-25.9328-25.6-25.9328l-140.8 0c-14.1312 0-25.6 11.6224-25.6 25.9328 0 14.336 11.4688 25.9584 25.6 25.9584L352 293.1968 352 293.1968z\"  ></path><path d=\"M352 448.8448c14.1568 0 25.6-11.5968 25.6-25.9328s-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.6224-25.6 25.9584s11.4688 25.9328 25.6 25.9328L352 448.8448 352 448.8448z\"  ></path><path d=\"M352 604.544c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4688 25.9584 25.6 25.9584L352 604.544 352 604.544z\"  ></path><path d=\"M608 604.544\"  ></path><path d=\"M352 760.2688c14.1568 0 25.6-11.6224 25.6-25.9584 0-14.3616-11.4432-25.9584-25.6-25.9584l-140.8 0c-14.1312 0-25.6 11.5968-25.6 25.9584 0 14.336 11.4688 25.9584 25.6 25.9584L352 760.2688 352 760.2688z\"  ></path><path d=\"M608 760.2688\"  ></path><path d=\"M881.7664 64 28.4416 64 0 64l0 28.9024 0 722.5344C0 895.2576 63.6928 960 142.2336 960l853.3248 0L1024 960l0-28.9024L1024 670.976c0-15.9744-12.7232-28.9024-28.4416-28.9024-15.6928 0-28.4416 12.928-28.4416 28.9024l0 231.2192L142.2336 902.1952c-47.104 0-85.3248-38.8608-85.3248-86.784L56.9088 121.8048l824.8832 0c47.104 0 85.3248 38.912 85.3248 86.8864l0.2304 259.9424c0.4608 15.3088 12.8512 27.648 28.2624 27.648s27.8016-12.3392 28.2624-27.648L1024 208.6912C1024 128.7936 960.3328 64 881.7664 64z\"  ></path></symbol><symbol id=\"icon-move\" viewBox=\"0 0 1024 1024\"><path d=\"M501.0944 1021.824c6.9376 2.8928 14.8224 2.8928 21.8112 0 3.4304-1.4336 6.528-3.4816 9.1136-6.0672 0.0256 0 0.0768-0.0256 0.0768-0.0256l158.9248-158.9248c11.1104-11.1104 11.1104-29.1328 0-40.2176-11.0848-11.0848-29.0816-11.0848-40.1664 0.0256l-110.4384 110.4128 0.0256-335.36c0-15.6928-12.7232-28.416-28.416-28.416s-28.416 12.6976-28.416 28.3904l0 335.3856-110.4128-110.4128c-11.1104-11.0848-29.1072-11.0848-40.1408 0-11.1104 11.1104-11.136 29.1072-0.0512 40.192l158.9504 158.9248c0.8192 0.8192 1.8944 1.1776 2.816 1.8688C496.7168 1019.1872 498.688 1020.8256 501.0944 1021.824z\"  ></path><path d=\"M522.9056 2.176c-6.9376-2.8928-14.8224-2.8928-21.7856 0C497.6896 3.584 494.592 5.632 491.9808 8.2176c-0.0256 0-0.0768 0.0512-0.0768 0.0512L332.9792 167.168c-11.1104 11.1104-11.1104 29.1328 0 40.2176 11.0848 11.0848 29.0816 11.0848 40.1664-0.0256l110.4384-110.4128-0.0256 335.36c0 15.6928 12.7232 28.416 28.416 28.416 15.6928 0 28.4416-12.6976 28.4416-28.3904L540.416 96.9472l110.4128 110.4128c11.1104 11.0848 29.1072 11.0848 40.1408 0 11.1104-11.1104 11.1616-29.1072 0.0512-40.192l-158.9504-158.8992c-0.8192-0.8448-1.8944-1.2032-2.816-1.8944C527.2832 4.8128 525.312 3.1744 522.9056 2.176z\"  ></path><path d=\"M1021.824 522.9056c2.8928-6.9376 2.8928-14.8224 0-21.8112-1.408-3.4304-3.456-6.528-6.0416-9.1136 0-0.0256-0.0512-0.0768-0.0512-0.0768l-158.8992-158.9248c-11.1104-11.1104-29.1584-11.1104-40.2432 0-11.0592 11.0848-11.0592 29.0816 0.0512 40.1664l110.3872 110.4384-335.36-0.0256c-15.6928 0-28.3904 12.7232-28.3904 28.416s12.6976 28.416 28.3904 28.416l335.36 0-110.3872 110.4128c-11.1104 11.1104-11.1104 29.1072 0 40.1408 11.1104 11.1104 29.1072 11.136 40.192 0.0512l158.8992-158.9504c0.8448-0.8192 1.2032-1.8944 1.8944-2.816C1019.1872 527.2832 1020.8256 525.312 1021.824 522.9056z\"  ></path><path d=\"M2.176 501.0944c-2.8928 6.9376-2.8928 14.8224 0 21.7856 1.408 3.456 3.456 6.5536 6.0416 9.1392l0.0512 0.0512 158.8992 158.9504c11.1104 11.1104 29.1584 11.1104 40.2432 0 11.0592-11.1104 11.0592-29.1072-0.0512-40.192l-110.3872-110.4384 335.36 0.0512c15.6928 0 28.3904-12.7488 28.3904-28.416 0-15.6928-12.6976-28.4416-28.3904-28.4416l-335.36 0.0256 110.3872-110.4128c11.1104-11.1104 11.1104-29.1072 0-40.1408-11.1104-11.1104-29.1072-11.1616-40.192-0.0512l-158.8992 158.9504c-0.8448 0.8192-1.2032 1.8944-1.8944 2.816C4.8128 496.7168 3.1744 498.688 2.176 501.0944z\"  ></path></symbol><symbol id=\"icon-subtract\" viewBox=\"0 0 1024 1024\"><path d=\"M853.333333 533.333333C865.115407 533.333333 874.666667 523.782075 874.666667 512 874.666667 500.217925 865.115407 490.666667 853.333333 490.666667L170.666667 490.666667C158.884592 490.666667 149.333333 500.217925 149.333333 512 149.333333 523.782075 158.884592 533.333333 170.666667 533.333333L853.333333 533.333333Z\"  ></path></symbol><symbol id=\"icon-dollar\" viewBox=\"0 0 1024 1024\"><path d=\"M818.688 587.52c-16.128-29.952-38.912-55.04-67.072-73.984-29.696-19.968-62.208-34.56-96.768-43.52-54.016-13.568-93.184-15.36-130.56-16.64L524.288 125.952c27.136 1.024 52.992 4.864 77.056 11.008 29.184 7.424 54.528 19.712 75.52 36.096 20.736 16.384 37.12 37.376 49.152 62.72 11.776 25.344 17.92 57.344 17.92 94.72 0 14.08 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6c0-44.8-7.68-83.968-22.784-116.48-15.36-32.768-36.864-59.904-63.744-81.152-26.624-20.992-58.624-36.096-94.72-45.568-28.16-7.168-58.112-11.52-89.6-12.8L524.288 26.112c0-14.08-11.264-25.6-25.344-25.6-14.336 0-25.6 11.52-25.6 25.6l0 48.384c-26.368 1.28-49.152 4.352-70.144 9.216-133.12 31.232-184.832 127.488-188.672 200.192-2.56 48.384 7.936 164.608 160.768 203.008 38.912 9.728 70.144 13.568 98.048 15.616l0 375.3216c-28.416-2.304-55.296-7.168-80.384-14.848-34.816-10.752-65.536-27.136-91.392-48.896-25.344-21.248-45.824-47.872-60.416-79.104-14.848-31.232-22.784-68.352-23.552-110.592-0.512-14.08-12.032-25.6-26.112-24.832-14.08 0.256-25.344 12.032-25.088 26.112 1.024 49.152 10.752 93.44 28.416 131.072 17.92 37.888 42.752 70.4 73.984 96.512 30.976 26.112 67.84 45.824 109.056 58.624 29.952 8.96 61.952 14.848 95.488 17.152l0 68.8384c0 14.336 11.264 25.6 25.6 25.6 14.08 0 25.344-11.264 25.344-25.344l0-68.0704c31.488-0.512 64-4.096 96.768-9.984 38.912-7.168 74.752-19.968 106.752-37.888 32.512-18.688 60.16-43.52 81.664-74.24 22.272-31.744 33.792-72.192 33.792-120.064C843.264 643.0976 834.816 617.728 818.688 587.52zM473.344 451.328c-24.832-2.048-51.968-5.632-85.504-14.08-106.24-26.624-125.184-96.512-122.112-150.528 1.024-19.968 13.056-121.088 149.248-153.088 17.408-4.096 36.352-6.656 58.368-7.68L473.344 451.328zM767.488 778.5216c-16.896 24.32-38.912 44.288-65.024 59.136-26.88 15.104-57.344 26.112-90.624 32.256-29.696 5.376-59.136 8.448-87.552 9.216L524.288 504.576c35.328 1.024 69.888 2.816 118.016 15.104 28.672 7.168 55.808 19.456 80.64 36.096 21.504 14.336 38.4 33.28 50.688 56.064 12.288 22.528 18.432 39.7056 18.432 75.8016C792.064 725.0176 783.872 755.4816 767.488 778.5216z\"  ></path></symbol><symbol id=\"icon-raw\" viewBox=\"0 0 1024 1024\"><path d=\"M539.151516 470.894308C580.924324 470.894308 614.787878 437.348425 614.787878 395.967479 614.787878 354.586534 580.924324 321.040651 539.151516 321.040651 497.378705 321.040651 463.515151 354.586534 463.515151 395.967479 463.515151 437.348425 497.378705 470.894308 539.151516 470.894308L539.151516 470.894308ZM539.151516 420.943089C525.227245 420.943089 513.939394 409.761129 513.939394 395.967479 513.939394 382.17383 525.227245 370.99187 539.151516 370.99187 553.075785 370.99187 564.363637 382.17383 564.363637 395.967479 564.363637 409.761129 553.075785 420.943089 539.151516 420.943089L539.151516 420.943089Z\"  ></path><path d=\"M435.304267 228.731223C247.753485 265.454739 110.545455 429.085807 110.545455 620.747968 110.545455 841.446342 291.151073 1020.357724 513.939394 1020.357724 736.727714 1020.357724 917.333333 841.446342 917.333333 620.747968 917.333333 439.751991 790.466897 281.451823 614.578714 234.713325L601.514526 282.958931C755.689673 323.927657 866.90909 462.703942 866.90909 620.747968 866.90909 813.859044 708.879174 970.406505 513.939394 970.406505 318.999614 970.406505 160.969697 813.859044 160.969697 620.747968 160.969697 453.051149 281.04344 309.854029 445.081946 277.734351L435.304267 228.731223 435.304267 228.731223Z\"  ></path><path d=\"M362.666667 645.723578C418.363746 645.723578 463.515151 600.995731 463.515151 545.821139 463.515151 490.646545 418.363746 445.918699 362.666667 445.918699 306.969587 445.918699 261.818182 490.646545 261.818182 545.821139 261.818182 600.995731 306.969587 645.723578 362.666667 645.723578L362.666667 645.723578ZM362.666667 595.772358C334.818127 595.772358 312.242423 573.408435 312.242423 545.821139 312.242423 518.233841 334.818127 495.869918 362.666667 495.869918 390.515206 495.869918 413.09091 518.233841 413.09091 545.821139 413.09091 573.408435 390.515206 595.772358 362.666667 595.772358L362.666667 595.772358Z\"  ></path><path d=\"M118.336328 613.826406C133.425252 628.114569 161.465796 648.583947 201.858288 668.805011 268.590074 702.211906 346.276843 722.231443 434.022231 722.23145 514.003603 722.231454 572.571484 709.604454 639.028858 683.904301 648.371872 680.291204 677.180911 668.650494 679.666547 667.668493 693.997408 662.006803 704.553047 658.248459 714.596041 655.369997 734.812975 649.575539 752.32589 647.709033 771.083349 649.85405 784.915759 651.435861 797.423597 641.609982 799.020388 627.907332 800.61718 614.204683 790.698251 601.814178 776.865841 600.232367 751.016318 597.276331 726.88307 599.848429 700.581677 607.386775 688.670974 610.80055 676.714903 615.057519 660.987473 621.27095 658.174426 622.3823 629.605316 633.926065 620.692019 637.372983 559.708732 660.956218 507.184486 672.280235 434.022236 672.28023 354.560674 672.280224 284.56814 654.243458 224.601289 624.223187 203.727373 613.773402 185.640133 602.614946 170.445517 591.522995 161.566625 585.041472 155.775729 580.177397 153.178823 577.718308 143.113425 568.187076 127.15405 568.543561 117.53256 578.514537 107.911071 588.485513 108.27093 604.295174 118.336328 613.826406L118.336328 613.826406Z\"  ></path><path d=\"M465.243565 277.264804 465.243565 145.31032 465.243565 120.330825 440.027522 120.33471 367.813557 120.345836 393.0296 145.321446 393.0296 55.804914 367.817478 80.780524 653.550573 80.780524 628.338451 55.804912 628.338447 147.102255 654.251853 122.13631 589.647977 120.355498 563.734571 119.641192 563.734571 145.321444 563.734571 283.089261 614.158814 283.089261 614.158814 145.321444 588.245408 170.28739 652.849284 172.068202 678.762688 172.782508 678.76269 147.102257 678.762694 55.804915 678.762697 30.829304 653.550573 30.829304 367.817478 30.829304 342.605357 30.829304 342.605357 55.804914 342.605357 145.321446 342.605357 170.30094 367.821399 170.297055 440.035364 170.285929 414.819324 145.310319 414.819322 277.264802 465.243565 277.264804 465.243565 277.264804Z\"  ></path></symbol><symbol id=\"icon-office\" viewBox=\"0 0 1024 1024\"><path d=\"M335.282306 183.504536C399.587328 182.548893 442.778899 199.117283 470.183494 226.629346 479.127332 235.60826 485.691302 245.142637 490.241971 254.557311 492.795622 259.840447 494.049041 263.561299 494.358795 264.925906L493.723712 259.259077 493.723706 699.099804C493.723706 696.981894 495.816045 692.079345 503.591595 688.635633 511.039185 685.337167 515.68422 686.834726 517.176538 688.093387L500.671543 707.66237 521.297207 692.498532C514.140179 682.763631 499.631258 670.285491 476.134074 658.64086 439.577969 640.524544 390.86048 629.894921 328.491925 629.894918 265.860796 629.894918 219.424582 640.28182 186.827162 658.258419 164.977332 670.308013 152.538132 683.718827 147.220271 694.69113L170.257196 705.856258 151.035786 688.947757C152.884078 686.846639 158.307299 684.196634 167.849005 687.949566 177.092077 691.585039 179.2 696.799883 179.2 699.335548L179.2 398.950257 179.2 259.259077 175.817447 271.976979C177.078908 269.773279 180.088681 265.192189 184.828724 259.034371 192.95423 248.478476 202.792594 237.872508 214.297641 227.992039 247.526453 199.455319 287.381649 182.790944 334.514421 183.504429L335.282306 183.504536ZM335.289387 132.310295C274.661039 131.392517 223.081402 152.95915 180.940156 189.149816 156.32698 210.287473 139.975514 231.529763 131.382553 246.541175L128 252.450301 128 259.259077 128 398.950257 128 699.335548C128 736.73895 164.542545 751.111817 189.478606 722.764759L191.776657 720.152358 193.294121 717.021387C194.07832 715.403356 199.156367 709.928666 211.552092 703.092757 236.030601 689.593519 274.024879 681.094918 328.491925 681.094918 383.221547 681.094921 424.163878 690.02809 453.399258 704.516431 469.376966 712.434594 477.614626 719.519247 480.045882 722.82621L481.844905 725.27322 484.166551 727.231356C511.279708 750.0993 544.923706 735.198707 544.923706 699.099804L544.923712 259.259078 544.288627 253.592249C540.427211 236.580977 529.175531 213.302876 506.45814 190.496398 468.987716 152.87903 412.352271 131.153539 334.521502 132.310188L335.289387 132.310295Z\"  ></path><path d=\"M0 389.973306 0 868.143132C0 904.875637 34.793167 919.400433 61.4635 894.751492L63.46242 892.684141C65.301149 890.555164 69.655573 886.137687 76.498228 880.179637 88.306297 869.898093 102.566352 859.53706 119.251411 849.825615 167.295691 821.861709 224.90855 805.049818 292.337329 805.049818 358.378978 805.04982 409.459345 824.330434 448.125308 856.35226 461.506042 867.433726 472.380655 879.265242 480.912593 891.002999 485.832384 897.771373 488.762874 902.741986 489.872527 905.022522 496.058545 917.735902 511.379537 923.027375 524.092917 916.841355 536.806298 910.655337 542.097771 895.334345 535.91175 882.620964 527.471002 865.273707 509.777717 840.932282 480.782336 816.9193 433.134118 777.458677 370.586889 753.84982 292.337329 753.849818 215.474895 753.849815 149.074727 773.225916 93.495781 805.575332 59.761154 825.210385 36.872315 845.140198 24.713677 859.218116L44.088049 875.95113 26.712598 857.150765C28.162783 855.810492 32.877261 854.053882 40.792576 857.358219 49.035365 860.799264 51.2 865.870108 51.2 868.143132L51.2 389.973306C51.2 375.834816 39.73849 364.373306 25.6 364.373306 11.46151 364.373306 0 375.834816 0 389.973306L0 389.973306Z\"  ></path><path d=\"M696.80221 132.310188C618.971441 131.153539 562.335996 152.87903 524.86557 190.496398 502.148181 213.302876 490.896501 236.580977 487.035083 253.592249L486.4 259.259078 486.400004 699.099804C486.400006 735.198707 520.044004 750.0993 547.157161 727.231356L549.478807 725.27322 551.27783 722.82621C553.709086 719.519247 561.946746 712.434594 577.924452 704.516431 607.159834 690.02809 648.102165 681.094921 702.831787 681.094918 757.298833 681.094918 795.293111 689.593519 819.77162 703.092757 832.167345 709.928666 837.245391 715.403356 838.029591 717.021387L839.547055 720.152358 841.845105 722.764759C866.781167 751.111817 903.323712 736.73895 903.323712 699.335548L903.323712 398.950257 903.323712 259.259077 903.323712 252.450301 899.941158 246.541175C891.348196 231.529763 874.996732 210.287473 850.383556 189.149816 808.24231 152.95915 756.662673 131.392517 696.034325 132.310295L696.80221 132.310188ZM696.809291 183.504429C743.942063 182.790944 783.797257 199.455319 817.026071 227.992039 828.531119 237.872508 838.369481 248.478476 846.494989 259.034371 851.235031 265.192189 854.244804 269.773279 855.506263 271.976979L852.123712 259.259077 852.123712 398.950257 852.123712 699.335548C852.123712 696.799883 854.231635 691.585039 863.474707 687.949566 873.016412 684.196634 878.439633 686.846639 880.287925 688.947757L861.066515 705.856258 884.103441 694.69113C878.785579 683.718827 866.346381 670.308013 844.49655 658.258419 811.89913 640.28182 765.462916 629.894918 702.831785 629.894918 640.463232 629.894921 591.745741 640.524544 555.189638 658.64086 531.692454 670.285491 517.183533 682.763631 510.026502 692.498532L530.652166 707.66237 514.147172 688.093387C515.63949 686.834726 520.284527 685.337167 527.732117 688.635633 535.507665 692.079345 537.600004 696.981894 537.600004 699.099804L537.6 259.259077 536.964917 264.925906C537.274671 263.561299 538.52809 259.840447 541.081741 254.557311 545.63241 245.142637 552.196378 235.60826 561.140218 226.629346 588.544813 199.117283 631.736384 182.548893 696.041406 183.504536L696.809291 183.504429Z\"  ></path><path d=\"M972.799998 389.973306 972.799998 868.143132C972.799998 865.870108 974.964631 860.799264 983.207422 857.358219 991.122737 854.053882 995.837214 855.810492 997.287401 857.150765L979.911949 875.95113 999.286321 859.218116C987.127682 845.140198 964.238844 825.210385 930.504218 805.575332 874.925269 773.225916 808.525103 753.849815 731.662669 753.849818 653.132708 753.84982 590.55104 778.737178 543.127755 820.261999 514.370099 845.442805 496.945662 870.897404 488.705389 888.977229 482.841769 901.842485 488.517717 917.025242 501.382974 922.888862 514.248233 928.752482 529.430987 923.076533 535.294607 910.211275 536.420563 907.740836 539.350332 902.450639 544.25735 895.282189 552.731727 882.902347 563.54464 870.438419 576.856734 858.782071 615.190044 825.216625 665.901421 805.04982 731.662669 805.049818 799.091447 805.049818 856.704307 821.861709 904.748587 849.825615 921.433645 859.53706 935.6937 869.898093 947.501771 880.179637 954.344425 886.137687 958.698848 890.555164 960.537577 892.684141L962.536497 894.751492C989.206831 919.400433 1023.999998 904.875637 1023.999998 868.143132L1023.999998 389.973306C1023.999998 375.834816 1012.538487 364.373306 998.399998 364.373306 984.261508 364.373306 972.799998 375.834816 972.799998 389.973306L972.799998 389.973306Z\"  ></path></symbol><symbol id=\"icon-agriculture\" viewBox=\"0 0 1024 1024\"><path d=\"M693.837946 426.762174C757.656311 362.424623 781.490225 279.539168 737.526153 238.206722 693.562078 196.874274 609.307957 222.956186 545.489591 287.293737 481.671223 351.631285 457.837312 434.51674 501.801385 475.849188 545.765457 517.181636 630.019578 491.099723 693.837946 426.762174L693.837946 426.762174ZM657.808403 392.889308C610.655398 440.425918 554.662603 457.759185 536.594707 440.772809 518.526814 423.786432 534.366127 368.703213 581.519132 321.166601 628.672139 273.62999 684.664934 256.296723 702.732828 273.2831 720.800723 290.269476 704.96141 345.352698 657.808403 392.889308L657.808403 392.889308Z\"  ></path><path d=\"M720.133598 606.411296C783.951964 542.073745 807.785877 459.188292 763.821805 417.855844 719.85773 376.523396 635.60361 402.605308 571.785244 466.942859 507.966876 531.28041 484.132964 614.165862 528.097037 655.49831 572.061109 696.830758 656.31523 670.748847 720.133598 606.411296L720.133598 606.411296ZM684.104055 572.53843C636.951051 620.075042 580.958255 637.408309 562.890359 620.421933 544.822466 603.435554 560.661779 548.352335 607.814784 500.815725 654.967791 453.279113 710.960587 435.945845 729.02848 452.932222 747.096375 469.918598 731.257062 525.00182 684.104055 572.53843L684.104055 572.53843Z\"  ></path><path d=\"M650.472081 888.457933C674.792501 876.438007 698.775307 858.920787 720.133598 837.38874 783.951964 773.051189 807.785877 690.165734 763.821805 648.833289 719.85773 607.500841 635.60361 633.582752 571.785244 697.920303 507.966876 762.257852 484.132964 845.143307 528.097037 886.475755 538.046319 895.829487 553.900559 895.560073 563.508469 885.873997 573.11638 876.187923 572.839644 860.753109 562.890359 851.399375 544.822466 834.412998 560.661779 779.329779 607.814784 731.793167 654.967791 684.256557 710.960587 666.92329 729.02848 683.909666 747.096375 700.896043 731.257062 755.979264 684.104055 803.515874 666.535275 821.227584 647.033545 835.471793 627.799177 844.978029 615.466266 851.073346 610.543968 865.747883 616.804917 877.754526 623.065867 889.761171 638.13917 894.553248 650.472081 888.457933L650.472081 888.457933Z\"  ></path><path d=\"M318.562611 392.889308C271.409605 345.352698 255.570292 290.269476 273.638186 273.2831 291.706081 256.296723 347.698877 273.62999 394.851882 321.166601 442.004887 368.703213 457.844201 423.786432 439.776307 440.772809 421.708412 457.759185 365.715616 440.425918 318.562611 392.889308L318.562611 392.889308ZM282.533069 426.762174C346.351436 491.099723 430.605557 517.181636 474.56963 475.849188 518.533702 434.51674 494.699791 351.631285 430.881423 287.293737 367.063057 222.956186 282.808936 196.874274 238.844863 238.206722 194.88079 279.539168 218.714703 362.424623 282.533069 426.762174L282.533069 426.762174Z\"  ></path><path d=\"M435.158223 165.180952C435.158223 99.097287 463.068177 48.761905 488.185508 48.761905 513.302837 48.761905 541.212791 99.097287 541.212791 165.180952 541.212791 231.264619 513.302837 281.6 488.185508 281.6 463.068177 281.6 435.158223 231.264619 435.158223 165.180952L435.158223 165.180952ZM385.071267 165.180952C385.071267 254.620672 427.068254 330.361905 488.185508 330.361905 549.302761 330.361905 591.299748 254.620672 591.299748 165.180952 591.299748 75.741232 549.302761 0 488.185508 0 427.068254 0 385.071267 75.741232 385.071267 165.180952L385.071267 165.180952Z\"  ></path><path d=\"M344.858263 572.53843C297.705257 525.00182 281.865944 469.918598 299.933839 452.932222 318.001733 435.945845 373.994529 453.279113 421.147534 500.815725 468.30054 548.352335 484.139853 603.435554 466.071959 620.421933 448.004064 637.408309 392.011268 620.075042 344.858263 572.53843L344.858263 572.53843ZM308.828721 606.411296C372.647088 670.748847 456.90121 696.830758 500.865282 655.49831 544.829355 614.165862 520.995443 531.28041 457.177075 466.942859 393.358709 402.605308 309.104588 376.523396 265.140515 417.855844 221.176442 459.188292 245.010355 542.073745 308.828721 606.411296L308.828721 606.411296Z\"  ></path><path d=\"M344.858263 803.515874C297.705257 755.979264 281.865944 700.896043 299.933839 683.909666 318.001733 666.92329 373.994529 684.256557 421.147534 731.793167 468.30054 779.329779 484.139853 834.412998 466.071959 851.399375 448.004064 868.385751 392.011268 851.052484 344.858263 803.515874L344.858263 803.515874ZM308.828721 837.38874C372.647088 901.726289 456.90121 927.808203 500.865282 886.475755 544.829355 845.143307 520.995443 762.257852 457.177075 697.920303 393.358709 633.582752 309.104588 607.500841 265.140515 648.833289 221.176442 690.165734 245.010355 773.051189 308.828721 837.38874L308.828721 837.38874Z\"  ></path><path d=\"M526.376811 993.283714 526.376811 312.339334C526.376811 298.874108 515.164465 287.958383 501.333333 287.958383 487.502202 287.958383 476.289856 298.874108 476.289856 312.339334L476.289856 993.283714C476.289856 1006.748943 487.502202 1017.664668 501.333333 1017.664668 515.164465 1017.664668 526.376811 1006.748943 526.376811 993.283714L526.376811 993.283714Z\"  ></path></symbol><symbol id=\"icon-machinery\" viewBox=\"0 0 1024 1024\"><path d=\"M1013.342765 771.306451 1017.427407 514.478016 1017.739181 494.874829 998.944783 489.824625 911.908109 466.437188 930.393933 490.688288 930.393933 121.707091 930.393933 96.872116 905.756591 96.610444 551.467575 92.847571 531.226001 92.632587 526.884847 112.56181 455.019706 442.477924 479.340079 422.762291 378.060235 422.762291 360.478925 422.762291 354.595908 439.462084 213.530519 839.896508 201.730419 873.392791 236.994844 873.392796 404.799686 873.392813C418.551407 873.392815 429.699383 862.156041 429.699383 848.294778 429.699386 834.433513 418.551413 823.196736 404.799691 823.196736L236.994848 823.196717 260.459174 856.693005 401.524563 456.258579 378.060235 472.95837 479.340079 472.95837 499.365828 472.95837 503.660454 453.242737 575.525598 123.326624 550.942869 143.040863 905.231885 146.803737 880.594541 121.707091 880.594541 490.688288 880.594541 509.9721 899.080365 514.939386 986.117039 538.326825 967.634413 513.673434 963.549771 770.501869C963.329346 784.361353 974.297201 795.776796 988.047155 795.998974 1001.797111 796.221154 1013.122342 785.165935 1013.342765 771.306451L1013.342765 771.306451Z\"  ></path><path d=\"M488.656535 938.666667C550.539285 938.666667 600.705167 888.10118 600.705167 825.725491 600.705167 763.349801 550.539285 712.784314 488.656535 712.784314 426.773783 712.784314 376.607902 763.349801 376.607902 825.725491 376.607902 888.10118 426.773783 938.666667 488.656535 938.666667L488.656535 938.666667ZM488.656535 888.470588C454.277229 888.470588 426.407294 860.378652 426.407294 825.725491 426.407294 791.072329 454.277229 762.980393 488.656535 762.980393 523.03584 762.980393 550.905775 791.072329 550.905775 825.725491 550.905775 860.378652 523.03584 888.470588 488.656535 888.470588L488.656535 888.470588Z\"  ></path><path d=\"M787.452887 938.666667C849.335637 938.666667 899.501519 888.10118 899.501519 825.725491 899.501519 763.349801 849.335637 712.784314 787.452887 712.784314 725.570138 712.784314 675.404256 763.349801 675.404256 825.725491 675.404256 888.10118 725.570138 938.666667 787.452887 938.666667L787.452887 938.666667ZM787.452887 888.470588C753.073581 888.470588 725.203648 860.378652 725.203648 825.725491 725.203648 791.072329 753.073581 762.980393 787.452887 762.980393 821.832194 762.980393 849.702127 791.072329 849.702127 825.725491 849.702127 860.378652 821.832194 888.470588 787.452887 888.470588L787.452887 888.470588Z\"  ></path><path d=\"M363.387354 108.04366 107.605789 817.761867 135.181 801.588051 30.730849 783.695345C17.173521 781.372924 4.315319 790.568162 2.011251 804.233483-0.292817 817.898803 8.829753 830.85943 22.387081 833.181852L126.837231 851.074558 147.318927 854.583149 154.412442 834.900745 410.194007 125.182537C414.889376 112.154278 408.217698 97.756119 395.292397 93.023349 382.367098 88.290579 368.082722 95.015401 363.387354 108.04366L363.387354 108.04366Z\"  ></path><path d=\"M584.132527 467.052237 824.399761 467.052237 847.616186 467.052237 846.627697 443.6721 836.906871 213.750942 835.987266 192 814.390445 192.2823 626.06217 194.744013 607.834276 194.982276 604.481973 213.043549 562.263838 440.502993 557.336105 467.052237 584.132527 467.052237 584.132527 467.052237ZM584.132527 422.201572 606.001216 448.750816 648.219349 221.29137 626.639153 239.590906 814.967428 237.129194 792.450999 215.660553 802.171825 445.581709 824.399761 422.201572 584.132527 422.201572 584.132527 422.201572Z\"  ></path><path d=\"M282.679221 692.068597 189.300603 664.548501 175.325083 712.727409 268.703701 740.247505 282.679221 692.068597 282.679221 692.068597Z\"  ></path><path d=\"M591.36064 863.372548 714.137312 863.372548 714.137312 813.176471 591.36064 813.176471 591.36064 863.372548 591.36064 863.372548Z\"  ></path></symbol><symbol id=\"icon-assessedbadge\" viewBox=\"0 0 1026 1024\"><path d=\"M704.533333 341.333333c0 4.266667-2.133333 8.533333-4.266667 12.8l-183.466667 341.333333c-8.533333 17.066667-27.733333 27.733333-49.066667 27.733333-17.066667 0-32-6.4-40.533333-19.2l-100.266667-115.2c-4.266667-4.266667-6.4-10.666667-6.4-17.066667 0-14.933333 12.8-27.733333 27.733333-27.733333 4.266667 0 8.533333 2.133333 12.8 4.266667l91.733333 49.066667 200.533333-273.066667c6.4-6.4 12.8-10.666667 23.466667-10.666667C691.733333 315.733333 704.533333 326.4 704.533333 341.333333z\"  ></path><path d=\"M512.533333 42.666667c21.333333 0 42.666667 8.533333 57.6 23.466667l89.6 89.6 125.866667 0c44.8 0 83.2 36.266667 83.2 83.2l0 125.866667 89.6 89.6c32 32 32 85.333333 0 117.333333l-89.6 89.6 0 125.866667c0 44.8-36.266667 83.2-83.2 83.2l-125.866667 0-89.6 89.6C555.2 972.8 533.866667 981.333333 512.533333 981.333333s-42.666667-8.533333-57.6-23.466667l-89.6-89.6-125.866667 0c-44.8 0-83.2-36.266667-83.2-83.2l0-125.866667-89.6-89.6c-32-32-32-85.333333 0-117.333333l89.6-89.6 0-125.866667C156.266667 192 192.533333 155.733333 239.466667 155.733333l125.866667 0 89.6-89.6C469.866667 51.2 491.2 42.666667 512.533333 42.666667M512.533333 0c-34.133333 0-66.133333 12.8-87.466667 36.266667l-76.8 76.8-108.8 0c-68.266667 0-125.866667 55.466667-125.866667 125.866667l0 108.8-76.8 76.8c-49.066667 49.066667-49.066667 128 0 177.066667l76.8 76.8 0 108.8c0 68.266667 55.466667 125.866667 125.866667 125.866667l108.8 0 76.8 76.8C448.533333 1011.2 478.4 1024 512.533333 1024c34.133333 0 64-12.8 87.466667-36.266667l76.8-76.8 108.8 0c68.266667 0 125.866667-55.466667 125.866667-125.866667l0-108.8 76.8-76.8c49.066667-49.066667 49.066667-128 0-177.066667l-76.8-76.8 0-108.8c0-68.266667-55.466667-125.866667-125.866667-125.866667l-108.8 0-76.8-76.8C578.666667 12.8 546.666667 0 512.533333 0L512.533333 0z\"  ></path></symbol><symbol id=\"icon-gerenzhongxin\" viewBox=\"0 0 1025 1024\"><path d=\"M690.366075 350.568358c0-98.876614-79.937349-179.048571-178.558027-179.048571-98.59935 0-178.515371 80.150629-178.515371 179.048571 0 98.833958 79.916021 178.963259 178.515371 178.963259C610.428726 529.531617 690.366075 449.380988 690.366075 350.568358M376.140632 350.568358c0-75.159877 60.72082-136.072649 135.667416-136.072649 74.989253 0 135.667416 60.912772 135.667416 136.072649 0 75.117221-60.678164 136.029993-135.667416 136.029993C436.861451 486.577022 376.140632 425.664251 376.140632 350.568358M197.284012 762.923936 197.284012 778.472049l15.526785 0 291.255186 0.127968L819.784387 778.472049l15.569441 0 0-15.548113c0-139.783721-136.413897-285.581938-311.026243-273.275681-10.002833 0.703824-24.740482 9.128385-34.658002 9.938849-8.573857 0.74648 13.692577 8.232609 14.396401 16.827793 9.021745-0.789136 6.313088 13.095393 15.505457 13.095393 150.597017 0 263.14488 103.07823 263.14488 224.62651l15.441473-15.590769-285.816546-0.042656-278.991585 1.81288 15.526785 15.612097c0-82.752645 75.095893-152.70849 136.861785-191.824044 7.25152-4.58552 8.659169-17.659585 4.862784-22.906273-6.846288-9.426977-19.877697-8.701825-28.046322-6.014496C285.262018 560.521203 197.284012 667.758394 197.284012 762.923936\"  ></path><path d=\"M512.31992 1.535616c-282.766642 0-512.021328 228.89211-512.021328 511.210864 0 282.46805 229.254686 511.25352 512.021328 511.25352 117.431975 0 228.828126-39.606098 318.810964-111.204199 10.791969-8.488545 12.540865-24.22861 3.988336-34.99925-8.616513-10.770641-24.356578-12.540865-35.127218-3.94568-81.174373 64.538532-181.586603 100.241606-287.650754 100.241606-255.210864 0-462.028493-206.561693-462.028493-461.367325 0-254.762976 206.817629-461.303341 462.028493-461.303341 255.210864 0 462.092477 206.561693 462.092477 461.303341 0 87.380821-24.33525 171.093227-69.614596 243.651087-7.272848 11.645089-3.668416 27.086562 8.040657 34.35941 11.709073 7.272848 27.10789 3.62576 34.402066-7.976672 50.184787-80.406565 77.143381-173.247355 77.143381-270.055153C1024.383904 230.427726 795.10789 1.535616 512.31992 1.535616z\"  ></path></symbol><symbol id=\"icon-jifen\" viewBox=\"0 0 1024 1024\"><path d=\"M512.469333 493.781333c289.130667 0 507.136-93.333333 507.136-217.173333S801.6 59.392 512.469333 59.392C223.338667 59.392 5.333333 152.768 5.333333 276.608S223.338667 493.781333 512.469333 493.781333M512.469333 114.218667c266.581333 0 452.330667 85.589333 452.330667 162.389333 0 76.8-185.749333 162.368-452.330667 162.368-266.602667 0-452.352-85.589333-452.352-162.368C60.138667 199.786667 245.888 114.218667 512.469333 114.218667M512.469333 723.904c288.341333 0 505.749333-92.8 505.749333-215.829333 0-32.490667-15.68-62.698667-43.328-89.856-0.192-0.170667-0.362667-0.405333-0.512-0.554667-0.213333-0.170667-0.341333-0.426667-0.533333-0.597333l-0.128 0.149333c-4.458667-4.074667-10.261333-6.698667-16.746667-6.698667-13.824 0-25.024 11.2-25.024 25.002667 0 7.338667 3.264 13.76 8.277333 18.282667l-0.085333 0.128c16.661333 16.746667 26.090667 37.248 26.090667 54.165333 0 77.504-186.346667 163.797333-453.738667 163.797333-267.392 0-453.738667-86.293333-453.738667-163.797333 0-19.285333 5.418667-35.818667 26.709333-54.634667 0.256-0.213333 0.512-0.448 0.768-0.682667 0.170667-0.149333 0.277333-0.277333 0.448-0.448l-0.106667-0.106667c4.096-4.416 6.72-10.261333 6.72-16.768 0-13.802667-11.178667-25.002667-25.002667-25.002667-6.912 0-13.141333 2.794667-17.664 7.338667l-0.149333-0.170667c-28.010667 27.285333-43.776 57.749333-43.776 90.453333C6.698667 631.104 224.149333 723.904 512.469333 723.904M974.634667 646.72c-0.170667-0.213333-0.341333-0.426667-0.490667-0.576l-0.170667 0.128c-4.416-4.074667-10.261333-6.698667-16.746667-6.698667-13.824 0-25.024 11.157333-25.024 24.96 0 7.338667 3.264 13.781333 8.298667 18.325333l-0.128 0.085333c16.682667 16.789333 26.112 37.290667 26.112 54.165333 0 77.504-186.346667 163.797333-453.738667 163.797333-267.392 0-453.738667-86.293333-453.738667-163.797333 0-19.242667 5.44-35.797333 26.688-54.592 0.277333-0.256 0.512-0.448 0.768-0.704 0.170667-0.128 0.298667-0.298667 0.448-0.426667L86.826667 681.322667c4.074667-4.458667 6.72-10.282667 6.72-16.832 0-13.781333-11.2-24.96-24.981333-24.96-6.890667 0-13.141333 2.794667-17.685333 7.338667l-0.128-0.170667c-28.010667 27.242667-43.754667 57.706667-43.754667 90.410667 0 123.050667 217.429333 215.872 505.749333 215.872 288.341333 0 505.749333-92.842667 505.749333-215.872 0-32.448-15.68-62.698667-43.306667-89.792C974.997333 647.104 974.826667 646.933333 974.634667 646.72\"  ></path></symbol><symbol id=\"icon-operation\" viewBox=\"0 0 1024 1024\"><path d=\"M548.906667 472.170667c-3.349333-3.029333-7.296-5.482667-11.584-7.232l-140.117333-87.36 88.597333 139.370667c1.770667 4.266667 4.266667 8.149333 7.296 11.477333l1.109333 1.792 0.32-0.32c7.210667 7.146667 17.130667 11.52 28.074667 11.477333 21.930667-0.064 39.594667-17.941333 39.488-39.829333-0.042667-10.965333-4.501333-20.864-11.712-27.989333l0.256-0.256L548.906667 472.170667z\"  ></path><path d=\"M521.088 196.8l-0.170667 0-12.501333 0.064 0.682667 151.68 0.106667 0c0.554667 13.76 11.861333 24.746667 25.770667 24.746667 14.250667 0 25.813333-11.562667 25.813333-25.792 0-0.533333-0.042667-1.045333-0.085333-1.578667l1.173333-95.488c129.088 17.984 217.344 117.141333 217.898667 251.285333 0.661333 147.136-110.144 256-257.301333 256.618667-147.157333 0.661333-254.656-109.482667-255.296-256.618667-0.341333-74.688 27.797333-141.312 77.077333-189.909333l-0.021333-0.021333c0.789333-0.618667 1.536-1.322667 2.24-2.090667 6.976-7.722667 3.84-20.266667-4.117333-27.456-7.232-6.528-24.277333-5.930667-31.402667-0.128l-0.021333-0.042667c-0.128 0.128-0.256 0.256-0.384 0.384-0.576 0.490667-1.130667 1.002667-1.642667 1.578667-0.042667 0.064-0.085333 0.128-0.128 0.170667-56.618667 55.658667-91.605333 133.184-91.242667 218.837333 0.768 168.426667 137.877333 304.32 306.304 303.573333 168.384-0.789333 304.298667-137.877333 303.552-306.282667C826.624 331.968 689.493333 196.053333 521.088 196.8z\"  ></path><path d=\"M511.978667 11.114667C235.370667 11.114667 11.093333 235.370667 11.093333 511.978667c0 276.778667 224.277333 500.885333 500.885333 500.885333 114.88 0 223.872-38.784 311.914667-108.885333 10.517333-8.362667 12.266667-23.765333 3.904-34.304-8.448-10.538667-23.786667-12.288-34.368-3.882667-79.424 63.296-177.664 98.282667-281.408 98.282667-249.642667 0-451.989333-202.410667-451.989333-452.096 0-249.6 202.325333-451.989333 451.989333-451.989333 249.685333 0 452.032 202.389333 452.032 451.989333 0 85.589333-23.786667 167.637333-68.074667 238.72-7.082667 11.413333-3.584 26.538667 7.850667 33.664 11.434667 7.168 26.474667 3.584 33.6-7.829333 49.152-78.741333 75.498667-169.706667 75.498667-264.554667C1012.906667 235.370667 788.672 11.114667 511.978667 11.114667z\"  ></path></symbol><symbol id=\"icon-remind1\" viewBox=\"0 0 1024 1024\"><path d=\"M538.566466 1023.088677C536.442301 1023.088677 534.296495 1023.023404 532.085637 1022.915658 453.644248 1018.970174 421.998927 952.558642 416.233425 918.008283 414.28268 906.196423 422.259039 895.03283 434.050197 893.061207 445.754623 890.980048 456.938872 898.999774 458.976262 910.7477 459.474802 913.435546 471.374332 976.44435 534.296495 979.608784 596.069881 983.532361 611.155621 913.196806 611.740847 910.227299 614.038393 898.479817 625.504392 890.741755 637.208818 893.19086 648.95661 895.510313 656.586167 906.932765 654.245257 918.658784 646.962498 955.441417 613.474848 1023.088677 538.566466 1023.088677L538.566466 1023.088677 538.566466 1023.088677ZM57.238985 822.166923C57.304035 822.166923 57.412408 823.856889 58.582842 825.092617 60.663619 827.26051 66.819288 829.60142 77.851798 829.60142L950.850912 829.60142C961.710045 829.60142 966.283453 827.325335 967.063743 826.54518L966.110074 823.445575 966.131714 779.748846 967.367175 777.191547C967.540597 772.487369 965.524846 743.638623 900.998697 683.68606 808.577021 597.831903 751.355358 380.042583 751.355358 227.472879 751.355358 104.749804 551.079467 86.716376 549.042032 86.564816L472.724766 86.629643C472.464656 86.716376 272.167125 104.749804 272.167125 227.472879 272.167125 361.185187 227.365126 591.133746 127.704015 683.68606 61.573964 745.112647 57.195664 774.980288 56.935551 779.748846L57.434073 781.179502 57.195664 822.275117C57.217324 822.210291 57.217324 822.166923 57.238985 822.166923L57.238985 822.166923ZM77.851798 872.950767C54.507951 872.950767 36.929651 866.318332 25.63703 853.270294 15.753293 841.825937 13.239004 827.585537 14.084298 818.004607L14.084298 787.009876C11.439979 770.797407 16.07841 728.227767 98.204521 651.932186 178.878427 576.980527 228.817333 373.25814 228.817333 227.472879 228.817333 64.889919 461.085347 44.146738 470.969083 43.345123L480.023302 43.337722 480.023302 18.029115C480.023302 8.560067 487.691443 0.883887 497.162607 0.883887L519.306723 0.883887C528.7725 0.883887 536.446027 8.563604 536.446027 18.025761L536.446027 43.291599 550.819354 43.27985C562.480459 44.146738 794.705104 64.889919 794.705104 227.472879 794.705104 371.545823 849.282468 576.482033 930.498212 651.932186 1011.86574 727.51244 1013.989862 770.732132 1009.481507 788.20224L1009.481507 816.617765C1011.453889 826.610008 1010.478541 840.67694 1001.851903 852.381501 991.751467 866.015212 974.584928 872.950767 950.850912 872.950767L77.851798 872.950767Z\"  ></path></symbol><symbol id=\"icon-icondownload\" viewBox=\"0 0 1024 1024\"><path d=\"M995.84 1024 28.16 1024C12.8 1024 0 1011.2 0 995.84l0 0c0-15.36 12.8-28.16 28.16-28.16l967.68 0c15.36 0 28.16 12.8 28.16 28.16l0 0C1024 1011.2 1011.2 1024 995.84 1024z\"  ></path><path d=\"M926.72 376.32 926.72 376.32c-10.24-10.24-30.72-10.24-40.96 0L537.6 721.92 537.6 28.16C537.6 12.8 527.36 0 512 0s-25.6 12.8-25.6 28.16l0 693.76L138.24 376.32c-10.24-10.24-30.72-10.24-40.96 0-10.24 10.24-10.24 28.16 0 40.96l394.24 394.24c2.56 2.56 2.56 2.56 5.12 2.56 0 0 2.56 2.56 2.56 2.56 7.68 2.56 15.36 2.56 23.04 0 2.56 0 2.56-2.56 2.56-2.56 2.56 0 5.12-2.56 5.12-2.56l394.24-394.24C936.96 404.48 936.96 386.56 926.72 376.32z\"  ></path></symbol><symbol id=\"icon-map\" viewBox=\"0 0 1024 1024\"><path d=\"M451.673935 994.395699C478.883834 1025.019147 524.254807 1024.808979 551.400292 993.928851 553.755808 991.387908 558.821323 985.796762 565.872444 977.84835 577.572838 964.659017 590.597131 949.62432 604.615947 932.998315 644.662065 885.504506 684.708678 834.717818 722.129538 782.646447 759.658524 730.424619 792.492213 679.709274 819.314991 631.458462 868.685946 542.646317 896 465.543426 896 402.285715 896 180.109449 719.301715 0 501.333333 0 283.364952 0 106.666667 180.109449 106.666667 402.285715 106.666667 465.598716 134.05152 542.80573 183.54613 631.762622 210.371803 679.976529 243.193308 730.651876 280.699364 782.833154 318.155192 834.94455 358.239268 885.77421 398.322835 933.311031 412.354743 949.952073 425.391185 965.00073 437.102468 978.202579 444.160087 986.158466 449.230214 991.754921 451.982775 994.736706L451.673935 994.395699ZM486.822684 961.321348C484.281231 958.568254 479.425084 953.207989 472.585916 945.498359 461.135889 932.591017 448.364015 917.847761 434.602351 901.527215 395.275714 854.888073 355.949587 805.019548 319.289224 754.014863 282.808749 703.260452 250.983685 654.123578 225.158316 607.707522 179.388826 525.445805 154.50505 455.290161 154.50505 402.285715 154.50505 207.039905 309.785362 48.761905 501.333333 48.761905 692.881306 48.761905 848.161617 207.039905 848.161617 402.285715 848.161617 455.246022 823.345286 525.298263 777.693969 607.419251 751.873483 653.867066 720.038415 703.039925 683.537446 753.831262 646.912604 804.794967 607.624538 854.619674 568.335977 901.215038 554.587654 917.520243 541.828177 932.24925 530.389289 945.143797 523.556841 952.845711 518.705521 958.200435 516.166694 960.950526 507.543772 970.748911 495.255793 970.80583 487.131524 961.662353L486.822684 961.321348Z\"  ></path><path d=\"M714.955981 467.028806C723.919106 442.627955 728.565658 416.668998 728.565658 390.095238 728.565658 268.908183 632.184774 170.666667 513.29293 170.666667 394.401086 170.666667 298.020202 268.908183 298.020202 390.095238 298.020202 511.282291 394.401086 609.52381 513.29293 609.52381 549.003859 609.52381 583.510052 600.631947 614.373097 583.874409 626.032316 577.543868 630.449257 562.77782 624.238611 550.893519 618.027966 539.009218 603.541579 534.507006 591.882359 540.837549 567.900883 553.858639 541.111735 560.761905 513.29293 560.761905 420.821495 560.761905 345.858586 484.351836 345.858586 390.095238 345.858586 295.838641 420.821495 219.428572 513.29293 219.428572 605.764365 219.428572 680.727273 295.838641 680.727273 390.095238 680.727273 410.807981 677.117041 430.977316 670.154965 449.930592 665.522846 462.540883 671.796821 476.591108 684.168282 481.312651 696.53974 486.034191 710.323861 479.639095 714.955981 467.028806L714.955981 467.028806Z\"  ></path></symbol><symbol id=\"icon-bad\" viewBox=\"0 0 1024 1024\"><path d=\"M743.328 31.04c71.232 0 127.008 32.96 157.568 93.632 2.784 5.504 3.872 10.944 4.928 16.256 2.24 11.04 5.6 27.776 30.432 57.536 36.32 43.52 29.984 90.08 24.896 127.488-1.312 9.76-2.656 19.456-3.232 29.024-1.856 31.648 3.968 41.184 19.488 66.656 3.136 5.216 6.592 10.848 10.272 17.184 23.68 40.896 22.752 90.912-2.464 133.792-28.96 49.248-82.624 78.624-143.488 78.624-51.552 0-108.256-1.12-141.408-1.952 8.64 50.048 25.44 154.528 25.44 210.656 0 92.64-67.04 125.504-124.448 125.504-63.68 0-113.536-58.688-113.536-133.6 0-57.92 0-65.344-22.976-97.088-60.608-83.776-122.464-142.272-150.304-142.272L117.76 612.48c-49.056 0-88.992-39.392-88.992-87.776L28.768 118.848c0-48.416 39.904-87.808 88.992-87.808l133.888 0c12.896 0 23.392 10.368 23.392 23.104l0 512.224 39.424 0c62.176 0 144.704 101.28 188.416 161.632 31.68 43.744 31.68 63.968 31.68 123.904 0 48.192 29.92 87.424 66.784 87.424 23.296 0 77.632-7.712 77.632-79.328 0-69.824-29.344-228.704-29.664-230.304-1.28-6.848 0.64-13.92 5.28-19.2 4.608-5.28 10.688-8.288 18.464-8 0.864 0 90.72 2.656 168.672 2.656 44.032 0 82.528-20.832 103.008-55.648 16.768-28.48 17.632-61.28 2.304-87.712-3.456-6.016-6.72-11.392-9.792-16.32-16.704-27.456-28.736-47.264-26.048-93.12 0.608-10.752 2.08-21.6 3.552-32.512 4.672-34.368 8.704-64.064-14.624-92.032-32.352-38.784-37.28-63.296-40.192-77.92-0.416-1.984-0.672-3.712-1.408-5.568-15.392-30.624-47.872-67.136-115.168-67.136l-316.704 0c-12.896 0-23.392-10.336-23.392-23.072 0-12.768 10.496-23.104 23.392-23.104L743.328 31.008 743.328 31.04zM117.76 566.368l110.496 0L228.256 77.248 117.76 77.248c-23.232 0-42.176 18.656-42.176 41.632L75.584 524.8C75.552 547.712 94.496 566.368 117.76 566.368L117.76 566.368zM117.76 566.368\"  ></path></symbol><symbol id=\"icon-good\" viewBox=\"0 0 1024 1024\"><path d=\"M743.328 985.536l-316.704 0c-12.896 0-23.392-10.368-23.392-23.104s10.496-23.072 23.392-23.072l316.704 0c67.296 0 99.808-36.512 115.168-67.136 0.768-1.856 1.024-3.552 1.408-5.568 2.912-14.624 7.84-39.168 40.192-77.92 23.328-27.968 19.328-57.664 14.624-92.032-1.472-10.912-2.944-21.76-3.552-32.512-2.688-45.856 9.344-65.664 26.048-93.12 3.04-4.928 6.304-10.304 9.792-16.32 15.328-26.432 14.464-59.232-2.304-87.712-20.48-34.816-59.008-55.648-103.008-55.648-77.952 0-167.808 2.656-168.672 2.656-7.776 0.288-13.888-2.72-18.464-8-4.64-5.28-6.528-12.352-5.28-19.2 0.32-1.6 29.664-160.48 29.664-230.304 0-71.616-54.336-79.328-77.632-79.328-36.832 0-66.784 39.2-66.784 87.424 0 59.936 0 80.16-31.68 123.904-43.712 60.352-126.24 161.632-188.416 161.632L275.04 450.176l0 512.224c0 12.768-10.496 23.104-23.392 23.104L117.76 985.504c-49.056 0-88.992-39.392-88.992-87.808L28.768 491.808c0-48.384 39.904-87.776 88.992-87.776l196.704 0c27.84 0 89.696-58.496 150.304-142.272 22.976-31.712 22.976-39.168 22.976-97.088 0-74.944 49.856-133.6 113.536-133.6 57.408 0 124.448 32.896 124.448 125.504 0 56.128-16.8 160.576-25.44 210.656 33.184-0.8 89.856-1.952 141.408-1.952 60.864 0 114.56 29.376 143.488 78.624 25.216 42.88 26.144 92.928 2.464 133.792-3.68 6.336-7.104 11.968-10.272 17.184-15.52 25.472-21.344 35.008-19.488 66.656 0.576 9.568 1.952 19.296 3.232 29.024 5.088 37.408 11.424 83.968-24.896 127.488-24.832 29.792-28.192 46.496-30.432 57.536-1.056 5.28-2.176 10.752-4.928 16.256C870.336 952.544 814.56 985.536 743.328 985.536L743.328 985.536zM117.76 450.208c-23.232 0-42.176 18.656-42.176 41.6l0 405.952c0 22.976 18.944 41.632 42.176 41.632l110.496 0L228.256 450.208 117.76 450.208 117.76 450.208zM117.76 450.208\"  ></path></symbol><symbol id=\"icon-skip\" viewBox=\"0 0 1024 1024\"><path d=\"M1011.168 487.136c0-10.368-4.512-19.648-11.552-26.208L605.6 120.64c-6.272-5.344-14.272-8.672-23.104-8.672-19.776 0-35.744 15.968-35.744 35.712l0 150.624C245.568 346.944 33.504 568.352 12.832 852.544c0.992 12.064 10.848 21.632 23.136 21.632 4.736 0 9.184-1.44 12.896-3.872 0.064-0.064 0 0.192 0.064 0.192 52.032-36.928 96.992-64.48 132.096-83.008 63.968-35.2 154.464-65.28 258.368-84.544l0-0.16c14.848 0 26.88-12.288 26.88-27.488 0-15.168-12.032-27.488-26.88-27.488-3.456 0-6.752 0.672-9.792 1.888-166.4 32.608-275.936 85.664-361.92 147.2 55.488-204.096 191.808-387.584 512.16-447.936l0 0c14.144-2.304 24.992-14.912 24.992-30.144 0-0.384 0-0.8-0.032-1.184L604.8 317.6 604.8 202.752l331.84 284.544-328.192 280.864-2.432 0 0-138.592-0.064 0c-0.928-16-13.824-28.672-29.568-28.672-16.352 0-29.632 13.664-29.632 30.528 0 0 0 0 0 0 0 0 0 0 0 0l0 56.128 0 75.2 0 64.352c0 19.776 15.936 35.712 35.712 35.712 8.416 0 16-3.168 22.144-8.064L998.72 514.432c0-0.032-0.128-0.064-0.064-0.096C1006.304 507.808 1011.168 498.016 1011.168 487.136z\"  ></path></symbol><symbol id=\"icon-iconfontplay2\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0C230.4 0 0 230.4 0 512c0 281.6 230.4 512 512 512 117.76 0 227.84-38.4 320-110.08 10.24-7.68 12.8-23.04 5.12-35.84-7.68-10.24-23.04-12.8-35.84-5.12C719.36 939.52 616.96 972.8 512 972.8 256 972.8 51.2 768 51.2 512 51.2 256 256 51.2 512 51.2 768 51.2 972.8 256 972.8 512c0 87.04-25.6 171.52-69.12 243.2-7.68 12.8-2.56 28.16 7.68 33.28 12.8 7.68 28.16 2.56 33.28-7.68 51.2-79.36 76.8-174.08 76.8-271.36C1024 230.4 793.6 0 512 0z\"  ></path><path d=\"M714.24 458.24c-17.92-15.36-245.76-222.72-245.76-222.72-10.24-10.24-25.6-7.68-35.84 2.56-5.12 5.12-7.68 12.8-7.68 17.92 0 0 0 0 0 0 0 0 0 499.2 0 512 0 15.36 10.24 25.6 25.6 25.6 5.12 0 12.8-2.56 15.36-7.68 2.56-2.56 217.6-186.88 240.64-207.36 23.04-20.48 33.28-38.4 33.28-64C742.4 491.52 732.16 473.6 714.24 458.24zM680.96 535.04c-7.68 5.12-204.8 176.64-204.8 176.64l0-399.36c0 0 186.88 166.4 202.24 181.76C696.32 512 698.88 519.68 680.96 535.04z\"  ></path></symbol><symbol id=\"icon-iconfontstop\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0C230.4 0 0 230.4 0 512c0 281.6 230.4 512 512 512 117.76 0 227.84-38.4 320-110.08 10.24-7.68 12.8-23.04 5.12-35.84-7.68-10.24-23.04-12.8-35.84-5.12C719.36 939.52 616.96 972.8 512 972.8 256 972.8 51.2 768 51.2 512 51.2 256 256 51.2 512 51.2 768 51.2 972.8 256 972.8 512c0 87.04-25.6 171.52-69.12 243.2-7.68 12.8-2.56 28.16 7.68 33.28 12.8 7.68 28.16 2.56 33.28-7.68 51.2-79.36 76.8-174.08 76.8-271.36C1024 230.4 793.6 0 512 0z\"  ></path><path d=\"M686.08 307.2 337.92 307.2c-17.92 0-30.72 12.8-30.72 30.72l0 348.16c0 17.92 12.8 30.72 30.72 30.72l348.16 0c17.92 0 30.72-12.8 30.72-30.72L716.8 337.92C716.8 320 704 307.2 686.08 307.2zM665.6 657.92c0 5.12-2.56 7.68-7.68 7.68L366.08 665.6c-5.12 0-7.68-2.56-7.68-7.68L358.4 366.08c0-5.12 2.56-7.68 7.68-7.68l291.84 0c5.12 0 7.68 2.56 7.68 7.68L665.6 657.92z\"  ></path></symbol><symbol id=\"icon-compass\" viewBox=\"0 0 1024 1024\"><path d=\"M512 1024C230.4 1024 0 793.6 0 512S230.4 0 512 0s512 230.4 512 512S793.6 1024 512 1024zM512 42.666667C253.866667 42.666667 42.666667 253.866667 42.666667 512s211.2 469.333333 469.333333 469.333333 469.333333-211.2 469.333333-469.333333S770.133333 42.666667 512 42.666667z\"  ></path><path d=\"M266.666667 778.666667c-6.4 0-10.666667-2.133333-14.933333-6.4-6.4-6.4-8.533333-14.933333-4.266667-23.466667l138.666667-352c2.133333-6.4 6.4-10.666667 12.8-12.8l352-138.666667c8.533333-2.133333 17.066667-2.133333 23.466667 4.266667s8.533333 14.933333 4.266667 23.466667L640 625.066667c-4.266667 10.666667-17.066667 17.066667-27.733333 12.8-10.666667-4.266667-17.066667-17.066667-12.8-27.733333l121.6-307.2-296.533333 117.333333-117.333333 296.533333 217.6-85.333333c10.666667-4.266667 23.466667 2.133333 27.733333 12.8 4.266667 10.666667 0 23.466667-12.8 27.733333L277.333333 776.533333C270.933333 778.666667 268.8 778.666667 266.666667 778.666667z\"  ></path><path d=\"M512 512m-36.266667 0a1.7 1.7 0 1 0 72.533333 0 1.7 1.7 0 1 0-72.533333 0Z\"  ></path></symbol><symbol id=\"icon-security\" viewBox=\"0 0 1024 1024\"><path d=\"M516.266667 1024l-8.533333 0C253.866667 1024 49.066667 819.2 49.066667 565.333333L49.066667 119.466667c0-12.8 8.533333-21.333333 21.333333-21.333333l106.666667 0c87.466667 0 174.933333-21.333333 253.866667-59.733333l72.533333-36.266667c6.4-2.133333 12.8-2.133333 19.2 0l72.533333 36.266667c78.933333 38.4 166.4 59.733333 253.866667 59.733333l106.666667 0c12.8 0 21.333333 8.533333 21.333333 21.333333s-8.533333 21.333333-21.333333 21.333333l-106.666667 0c-93.866667 0-187.733333-21.333333-273.066667-64l-64-32-61.866667 32c-85.333333 42.666667-179.2 64-273.066667 64l-85.333333 0 0 424.533333C91.733333 795.733333 277.333333 981.333333 507.733333 981.333333l8.533333 0c228.266667 0 416-185.6 416-416l0-298.666667-405.333333 390.4c-8.533333 8.533333-21.333333 8.533333-29.866667 0l-200.533333-200.533333c-8.533333-8.533333-8.533333-21.333333 0-29.866667s21.333333-8.533333 29.866667 0l185.6 185.6L938.666667 202.666667c6.4-6.4 14.933333-8.533333 23.466667-4.266667 8.533333 4.266667 12.8 10.666667 12.8 19.2l0 347.733333C974.933333 819.2 770.133333 1024 516.266667 1024z\"  ></path></symbol><symbol id=\"icon-share\" viewBox=\"0 0 1024 1024\"><path d=\"M697.15674 422.956522 847.731148 422.956522C884.876874 422.956522 915.087718 452.959788 915.087718 489.801828L915.087718 912.632955 915.087718 1001.739129 937.543859 979.47826 847.939848 979.47826 218.726818 979.47826C181.707983 979.47826 151.578948 949.486546 151.578948 912.632955L151.578948 489.801828C151.578948 472.785796 151.578948 472.785796 151.578948 450.127108 151.578948 442.919656 151.578948 442.919656 151.578948 435.893809 151.578948 408.715613 151.578948 408.715613 151.578948 400.695652L129.122807 422.956522C137.296139 422.956522 137.296139 422.956522 164.865734 422.956522 171.618554 422.956522 171.618554 422.956522 178.53178 422.956522 201.762058 422.956522 201.762058 422.956522 218.906254 422.956522L354.437705 422.956522C366.839887 422.956522 376.893843 412.98999 376.893843 400.695652 376.893843 388.401314 366.839887 378.434781 354.437705 378.434781L218.906254 378.434781C201.762058 378.434781 201.762058 378.434781 178.53178 378.434781 171.618554 378.434781 171.618554 378.434781 164.865734 378.434781 137.296139 378.434781 137.296139 378.434781 129.122807 378.434781 116.720624 378.434781 106.666667 388.401314 106.666667 400.695652 106.666667 408.715613 106.666667 408.715613 106.666667 435.893809 106.666667 442.919656 106.666667 442.919656 106.666667 450.127108 106.666667 472.785796 106.666667 472.785796 106.666667 489.801828L106.666667 912.632955C106.666667 974.033806 156.86164 1023.999999 218.726818 1023.999999L847.939848 1023.999999 937.543859 1023.999999C949.946043 1023.999999 960 1014.033469 960 1001.739129L960 912.632955 960 489.801828C960 428.38942 909.69975 378.434781 847.731148 378.434781L697.15674 378.434781C684.754556 378.434781 674.700599 388.401314 674.700599 400.695652 674.700599 412.98999 684.754556 422.956522 697.15674 422.956522L697.15674 422.956522Z\"  ></path><path d=\"M347.996815 282.764936 548.760439 59.327972 515.337485 59.454466 715.839402 279.198683C724.158863 288.316569 738.359462 289.022466 747.557327 280.775347 756.755193 272.52823 757.467283 258.451114 749.147821 249.333231L548.645903 29.589012 531.863345 11.19582 515.22295 29.715506 314.459326 253.152471C306.210339 262.333062 307.030836 276.404377 316.291958 284.581634 325.55308 292.75889 339.747827 291.945527 347.996815 282.764936L347.996815 282.764936Z\"  ></path><path d=\"M511.087716 78.416783 510.666677 782.242894C510.659322 794.53723 520.707315 804.50967 533.109495 804.516961 545.511678 804.524251 555.571595 794.563632 555.57895 782.269296L555.999989 78.443185C556.007345 66.148848 545.959351 56.176409 533.557171 56.169118 521.154989 56.161828 511.095072 66.122446 511.087716 78.416783L511.087716 78.416783Z\"  ></path></symbol><symbol id=\"icon-store\" viewBox=\"0 0 1024 1024\"><path d=\"M957.866667 170.666667c-2.133333-59.733333-51.2-106.666667-110.933333-106.666667 0 0-2.133333 0-2.133333 0 0 0-2.133333 0-2.133333 0L83.2 64C78.933333 64 72.533333 66.133333 68.266667 70.4 66.133333 74.666667 61.866667 78.933333 61.866667 85.333333l0 761.6c0 0 0 0 0 0C64 908.8 113.066667 960 174.933333 960c0 0 2.133333 0 2.133333 0 0 0 2.133333 0 2.133333 0l362.666667 0c25.6 0 29.866667-10.666667 29.866667-21.333333L571.733333 554.666667l172.8 0 0 381.866667c0 6.4 4.266667 12.8 8.533333 17.066667 4.266667 4.266667 8.533333 6.4 14.933333 6.4l168.533333 0c10.666667 0 21.333333-8.533333 21.333333-21.333333 0 0 0 0 0 0 0 0 0-2.133333 0-2.133333L957.866667 172.8C957.866667 172.8 957.866667 172.8 957.866667 170.666667zM915.2 174.933333C915.2 177.066667 917.333333 177.066667 915.2 174.933333l0 134.4C915.2 354.133333 874.666667 384 829.866667 384c-44.8 0-83.2-29.866667-83.2-72.533333 0 0 0 0 0-2.133333l0 0L746.666667 106.666667l-42.666667 0 0 202.666667 0 0c0 0 0 0 0 2.133333-2.133333 44.8-42.666667 72.533333-87.466667 72.533333-44.8 0-83.2-29.866667-83.2-72.533333 0 0 0 0 0-2.133333l0 0L533.333333 106.666667l-42.666667 0 0 202.666667 0 0c0 0 0 0 0 2.133333-2.133333 44.8-42.666667 72.533333-87.466667 72.533333-44.8 0-81.066667-27.733333-83.2-72.533333L320 106.666667l-42.666667 0 0 204.8c-2.133333 44.8-42.666667 72.533333-87.466667 72.533333-46.933333 0-83.2-29.866667-83.2-74.666667L106.666667 106.666667l736 0c0 0 2.133333 0 2.133333 0 2.133333 0 2.133333 0 4.266667 0C883.2 106.666667 915.2 138.666667 915.2 174.933333zM104.533333 846.933333 104.533333 396.8C128 416 157.866667 426.666667 189.866667 426.666667c44.8 0 83.2-19.2 106.666667-51.2 23.466667 32 61.866667 51.2 106.666667 51.2 44.8 0 83.2-19.2 106.666667-51.2 23.466667 32 61.866667 51.2 106.666667 51.2 44.8 0 83.2-19.2 106.666667-51.2 23.466667 32 61.866667 51.2 106.666667 51.2 34.133333 0 64-10.666667 87.466667-29.866667L917.333333 917.333333l-128 0L789.333333 533.333333c0-12.8-8.533333-21.333333-21.333333-21.333333l-213.333333 0c-12.8 0-21.333333 8.533333-21.333333 21.333333 0 0 0 0 0 0 0 0 0 0 0 0L533.333333 917.333333 179.2 917.333333c0 0-2.133333 0-2.133333 0-2.133333 0-2.133333 0-2.133333 0C138.666667 917.333333 104.533333 885.333333 104.533333 846.933333z\"  ></path></symbol><symbol id=\"icon-manageorder\" viewBox=\"0 0 1024 1024\"><path d=\"M760.832 348.16 201.728 348.16c-12.288 0-23.552 10.24-23.552 23.552s10.24 23.552 23.552 23.552l559.104 0c12.288 0 23.552-10.24 23.552-23.552S773.12 348.16 760.832 348.16z\"  ></path><path d=\"M762.88 200.704 203.776 200.704c-12.288 0-23.552 10.24-23.552 23.552 0 12.288 10.24 23.552 23.552 23.552l559.104 0c12.288 0 23.552-10.24 23.552-23.552C788.48 212.992 775.168 200.704 762.88 200.704z\"  ></path><path d=\"M790.528 917.504l0-27.648c10.24-2.048 29.696-8.192 35.84-15.36 10.24-10.24 12.288-21.504 12.288-35.84s-4.096-27.648-12.288-33.792c-10.24-8.192-23.552-15.36-40.96-23.552-10.24-4.096-21.504-10.24-25.6-12.288-4.096-4.096-6.144-10.24-6.144-17.408 0-8.192 2.048-15.36 6.144-19.456 4.096-4.096 10.24-8.192 19.456-8.192s15.36 4.096 19.456 10.24c4.096 6.144 8.192 15.36 8.192 27.648l29.696 0c0-23.552-6.144-29.696-12.288-43.008-8.192-10.24-12.288-17.408-35.84-19.456l0-29.696-23.552 0 0 29.696c-10.24 2.048-25.6 8.192-31.744 15.36-8.192 10.24-10.24 21.504-10.24 33.792 0 15.36 6.144 27.648 12.288 35.84 10.24 8.192 23.552 15.36 43.008 23.552 10.24 4.096 19.456 8.192 25.6 12.288 4.096 4.096 8.192 10.24 8.192 17.408 0 8.192-2.048 15.36-8.192 19.456-6.144 4.096-12.288 8.192-23.552 8.192-10.24 0-17.408-6.144-23.552-10.24-6.144-6.144-10.24-6.144-10.24-29.696l-29.696 0c0 23.552 4.096 35.84 12.288 45.056 10.24 10.24 25.6 17.408 35.84 19.456l0 27.648L790.528 917.504 790.528 917.504zM984.064 626.688l-68.608-21.504c-4.096-2.048-8.192 0-10.24 2.048-2.048 2.048-6.144 6.144-6.144 10.24l0 51.2-45.056 0 0-72.704c0-6.144-2.048-10.24-8.192-10.24l-63.488-19.456c-2.048 0-4.096 0-6.144 0l-68.608 17.408c-6.144 2.048-8.192 6.144-8.192 10.24l0 72.704-45.056 0 0-51.2c0-4.096-2.048-8.192-4.096-10.24-2.048-2.048-6.144-2.048-10.24-2.048L570.368 624.64c-2.048 2.048-4.096 6.144-4.096 12.288L583.68 949.248c0 4.096 4.096 10.24 8.192 10.24l183.296 57.344c2.048 0 2.048 0 4.096 0 2.048 0 2.048 0 4.096 0l183.296-57.344c4.096-2.048 8.192-6.144 8.192-10.24l2.048-21.504 0 0c0-6.144-6.144-10.24-10.24-10.24-4.096 0-10.24 6.144-10.24 10.24l0 0 0 12.288-177.152 53.248-175.104-53.248-17.408-294.912 45.056-12.288 0 45.056c0 6.144 6.144 15.36 10.24 15.36l66.56 0c6.144 0 12.288-10.24 12.288-15.36l0-70.656 55.296-15.36 55.296 15.36 0 70.656c0 6.144 8.192 15.36 12.288 15.36l68.608 0c6.144 0 10.24-10.24 10.24-15.36l0-45.056 45.056 12.288-10.24 224.256 0 0c0 6.144 6.144 10.24 10.24 10.24 6.144 0 10.24-6.144 10.24-10.24l0 0L993.28 635.904C993.28 631.808 991.232 626.688 984.064 626.688L984.064 626.688 984.064 626.688z\"  ></path><path d=\"M773.12 6.144 54.272 6.144 30.72 6.144l0 23.552 0 836.608c0 76.8 59.392 138.24 136.192 138.24l325.632 0 0 0c12.288-1.024 21.504-11.264 21.504-23.552 0-12.288-9.216-22.528-21.504-23.552l0 0-4.096 0L164.864 957.44c-47.104 0-87.04-40.96-87.04-90.112L77.824 55.296l695.296 0c47.104 0 87.04 40.96 87.04 90.112l0 360.448 0 0c0 13.312 11.264 24.576 24.576 24.576 13.312 0 24.576-11.264 24.576-24.576L909.312 145.408C910.336 68.608 849.92 6.144 773.12 6.144z\"  ></path></symbol><symbol id=\"icon-rejectedorder\" viewBox=\"0 0 1024 1024\"><path d=\"M796.672 1006.592c-108.544 0-196.608-87.04-196.608-196.608S688.128 614.4 796.672 614.4 993.28 701.44 993.28 809.984C991.232 919.552 903.168 1006.592 796.672 1006.592zM796.672 658.432c-84.992 0-153.6 68.608-153.6 153.6 0 84.992 68.608 153.6 153.6 153.6s153.6-68.608 153.6-153.6C948.224 727.04 880.64 658.432 796.672 658.432z\"  ></path><path d=\"M884.736 835.584c12.288 0 23.552-10.24 23.552-23.552 0-12.288-10.24-23.552-23.552-23.552L709.632 788.48c-12.288 0-23.552 10.24-23.552 23.552 0 12.288 10.24 23.552 23.552 23.552L884.736 835.584 884.736 835.584z\"  ></path><path d=\"M760.832 351.232 201.728 351.232c-12.288 0-23.552 10.24-23.552 23.552s10.24 23.552 23.552 23.552l559.104 0c12.288 0 23.552-10.24 23.552-23.552S773.12 351.232 760.832 351.232z\"  ></path><path d=\"M910.336 148.48C910.336 71.68 847.872 10.24 773.12 10.24L54.272 10.24 30.72 10.24l0 23.552L30.72 870.4c0 76.8 59.392 138.24 136.192 138.24l417.792 0 0 0c13.312-1.024 22.528-11.264 22.528-24.576 0-13.312-10.24-23.552-22.528-24.576l0 0-419.84 0c-47.104 0-87.04-40.96-87.04-90.112L77.824 59.392l695.296 0c47.104 0 87.04 40.96 87.04 90.112l0 406.528 0 0c0 0 0 0 0 0 0 13.312 11.264 24.576 24.576 24.576 13.312 0 24.576-11.264 24.576-24.576 0 0 0 0 0 0l0 0L909.312 148.48z\"  ></path><path d=\"M762.88 204.8 203.776 204.8c-12.288 0-23.552 10.24-23.552 23.552s10.24 23.552 23.552 23.552l559.104 0c12.288 0 23.552-10.24 23.552-23.552C788.48 215.04 778.24 204.8 762.88 204.8z\"  ></path></symbol><symbol id=\"icon-phone\" viewBox=\"0 0 1024 1024\"><path d=\"M942.08 738.304c-25.6-23.552-55.296-47.104-76.8-61.44-27.648-19.456-57.344-38.912-84.992-51.2-43.008-21.504-59.392-25.6-70.656-25.6-19.456 0-35.84 10.24-51.2 29.696-8.192 12.288-17.408 29.696-23.552 45.056-4.096 10.24-12.288 27.648-17.408 33.792-8.192-2.048-31.744-12.288-70.656-37.888-35.84-25.6-74.752-57.344-104.448-84.992-29.696-29.696-59.392-68.608-84.992-104.448-25.6-37.888-35.84-61.44-37.888-70.656 6.144-4.096 23.552-12.288 33.792-17.408 15.36-6.144 31.744-12.288 45.056-23.552 21.504-15.36 29.696-31.744 29.696-51.2 0-10.24-2.048-27.648-25.6-70.656-12.288-25.6-31.744-55.296-51.2-84.992-15.36-21.504-38.912-51.2-61.44-76.8-27.648-27.648-47.104-40.96-66.56-40.96-47.104 0-100.352 68.608-114.688 87.04-19.456 25.6-66.56 96.256-66.56 159.744 0 59.392 40.96 138.24 74.752 194.56 45.056 72.704 108.544 153.6 177.152 224.256l21.504 21.504 0 0c70.656 68.608 149.504 132.096 224.256 177.152 23.552 15.36 51.2 29.696 78.848 43.008l0 0c4.096 2.048 6.144 2.048 10.24 2.048 15.36 0 27.648-12.288 27.648-27.648 0-10.24-6.144-21.504-17.408-25.6-21.504-10.24-45.056-23.552-70.656-38.912-70.656-43.008-145.408-102.4-212.992-168.96l-21.504-21.504c-66.56-68.608-125.952-143.36-168.96-212.992-43.008-68.608-66.56-128-66.56-163.84 0-31.744 19.456-78.848 53.248-123.904 15.36-19.456 29.696-37.888 45.056-51.2 15.36-13.312 23.552-17.408 27.648-17.408 10.24 4.096 43.008 31.744 87.04 98.304 17.408 25.6 33.792 51.2 45.056 74.752 15.36 27.648 17.408 40.96 17.408 43.008 0 0-4.096 4.096-10.24 8.192-8.192 4.096-21.504 10.24-31.744 15.36-15.36 6.144-27.648 12.288-40.96 19.456-19.456 12.288-27.648 27.648-27.648 45.056 0 8.192 0 33.792 49.152 104.448 25.6 37.888 59.392 80.896 92.16 112.64l0 0c31.744 31.744 74.752 66.56 112.64 92.16 70.656 47.104 96.256 49.152 104.448 49.152l0 0c17.408 0 31.744-8.192 45.056-27.648 8.192-10.24 12.288-25.6 19.456-40.96 4.096-10.24 10.24-23.552 15.36-31.744 6.144-4.096 10.24-6.144 10.24-6.144 2.048 0 15.36 2.048 43.008 17.408 21.504 12.288 49.152 27.648 74.752 45.056 63.488 45.056 94.208 76.8 98.304 87.04-2.048 4.096-6.144 12.288-17.408 27.648-12.288 15.36-31.744 31.744-51.2 45.056-29.696 21.504-61.44 38.912-87.04 47.104l0 0c-10.24 4.096-17.408 15.36-17.408 25.6 0 15.36 12.288 27.648 27.648 27.648 2.048 0 4.096 0 6.144-2.048l0 0c2.048 0 2.048 0 4.096-2.048l0 0c45.056-15.36 82.944-40.96 102.4-55.296 21.504-15.36 87.04-70.656 87.04-115.712C982.016 785.408 969.728 765.952 942.08 738.304z\"  ></path></symbol><symbol id=\"icon-bussinessman\" viewBox=\"0 0 1024 1024\"><path d=\"M496.64 956.416l-106.496-100.352L429.056 634.88l130.048 0 29.696 222.208L496.64 956.416zM433.152 835.584l61.44 59.392 55.296-57.344-21.504-161.792-70.656 0L433.152 835.584z\"  ></path><path d=\"M642.048 566.272c92.16-51.2 153.6-147.456 153.6-260.096 0-163.84-132.096-296.96-293.888-296.96s-293.888 132.096-293.888 296.96 132.096 296.96 293.888 296.96c4.096 0 6.144 0 10.24 0l2.048 0c236.544 0 441.344 168.96 458.752 360.448L486.4 963.584 53.248 963.584c10.24-128 94.208-240.64 222.208-307.2 12.288-6.144 17.408-21.504 10.24-33.792s-21.504-17.408-33.792-10.24C96.256 688.128 0 830.464 0 989.184l0 25.6 25.6 0 460.8 0 512 0 25.6 0 0-25.6C1024 792.576 858.112 617.472 642.048 566.272zM256 306.176C256 172.032 364.544 62.464 499.712 62.464s243.712 108.544 243.712 242.688S633.856 548.864 499.712 548.864 256 440.32 256 306.176z\"  ></path></symbol><symbol id=\"icon-shoes\" viewBox=\"0 0 1229 1024\"><path d=\"M1041.842629 983.992148C1041.574671 981.125315 1041.096008 975.625377 1040.476664 967.855506 1039.439588 954.844997 1038.401431 940.287388 1037.432102 924.54711 1034.417649 875.597343 1032.726697 826.424701 1033.041608 780.698452 1033.595712 700.240102 1040.539249 639.832622 1053.710848 612.106217 1054.575258 610.28662 1055.494344 608.442785 1056.468567 606.573292 1069.325504 581.901366 1079.541729 568.682391 1129.130509 509.15957 1199.865997 424.253752 1228.799992 373.908777 1228.8 307.108111 1228.800015 166.431798 1151.172884 9.473942 1054.290068 9.473941 1027.320425 9.47394 1020.494518 17.745794 943.645847 122.560421 865.553546 229.07125 828.143122 277.945769 772.255767 342.619052 759.180938 357.749343 746.130808 372.398403 733.069425 386.581716 622.283628 506.883661 444.325788 642.066094 386.69782 660.177172 359.410447 668.752932 337.251346 675.245932 316.579446 680.86273 305.590316 683.848607 276.836124 691.287278 273.941709 692.062861 269.993324 693.120863 266.423439 694.108255 262.964977 695.103631 240.935593 701.443889 220.249322 709.124252 186.750361 723.649347 136.419494 745.47273 80.689269 781.327368 45.237294 817.250276-5.609663 868.772667-18.137835 924.294405 31.22404 965.446623L34.244045 967.964352 37.812642 969.614961C106.845435 1001.545188 458.018816 1001.296253 577.50006 971.486451 641.39968 955.543905 663.400584 922.66282 680.645786 848.471301 697.993516 773.838684 707.996403 747.489152 742.255811 708.356882 782.727985 662.128174 818.636375 634.721574 849.143867 621.686118 858.822139 617.55072 866.903613 615.342648 873.361915 614.519572 875.221893 614.282527 876.654451 614.200223 877.656689 614.210954 877.960827 614.218844 877.960827 614.218844 877.820946 614.210819 877.667264 614.198282 877.667264 614.198282 877.40151 614.170721 877.247534 614.153436 877.247534 614.153436 877.065308 614.131021 876.968865 614.118761 876.968865 614.118761 876.865183 614.105024 876.80801 614.097321 876.80801 614.097321 876.780124 614.093504L876.719086 614.085074C892.981158 616.391352 908.102239 605.026358 910.418924 588.690245 912.735608 572.354132 901.370614 557.233052 885.034499 554.916367L884.957614 554.905567C884.85922 554.892012 884.85922 554.892012 884.791631 554.882908 884.66145 554.865656 884.66145 554.865656 884.52341 554.848102 884.235377 554.812618 884.235377 554.812618 883.915494 554.77665 883.228065 554.704794 883.228065 554.704794 882.414625 554.637455 880.60042 554.516029 880.60042 554.516029 878.296463 554.464169 874.567969 554.424246 870.397914 554.663826 865.808159 555.248765 853.838666 556.774216 840.400965 560.44575 825.666742 566.741491 786.424266 583.509289 743.386163 616.35755 697.299825 668.998948 654.603279 717.76841 641.913705 751.195195 622.447107 834.943501 609.737966 889.620193 599.905884 904.314568 563.03614 913.513331 455.550428 940.330324 117.346311 940.570066 62.896093 915.384822L69.484695 919.55316C54.166367 906.782513 58.12056 889.258514 87.764912 859.220375 117.379371 829.212529 166.76305 797.441006 210.519721 778.468186 241.820793 764.896092 260.166646 758.084675 279.490796 752.523008 282.571448 751.63637 285.793469 750.745193 289.406692 749.776998 291.92748 749.101532 320.818563 741.627448 332.246262 738.522409 353.674109 732.700209 376.582413 725.987681 404.612009 717.178657 474.269619 695.286956 659.787564 554.361623 777.021791 427.057354 790.519375 412.400369 803.987213 397.282424 817.464632 381.686249 874.728174 315.420434 912.812252 265.665823 991.832087 157.889923 1020.894784 118.251037 1034.13195 100.642716 1046.128689 86.10469 1052.847462 77.962667 1058.146598 72.16276 1061.926211 68.737964 1062.091387 68.588292 1061.01237 69.224151 1054.290068 69.224151 1106.729395 69.224151 1169.049802 195.232643 1169.049789 307.108106 1169.049784 355.006057 1145.165757 396.564119 1083.22398 470.914593 1030.081779 534.702689 1019.223457 548.752481 1003.481403 578.960829 1002.171738 581.474022 1000.924938 583.975304 999.741002 586.467512 981.526835 624.808594 973.907036 691.099436 973.292815 780.286971 972.967386 827.540362 974.703086 878.014221 977.79487 928.219727 978.787156 944.332805 979.850726 959.246781 980.915377 972.603185 981.557071 980.65346 982.059213 986.423191 982.351718 989.552643 983.887206 1005.980605 998.449459 1018.05334 1014.87742 1016.517852 1031.305382 1014.982364 1043.378117 1000.420109 1041.842629 983.992148L1041.842629 983.992148Z\"  ></path></symbol><symbol id=\"icon-mobilephone\" viewBox=\"0 0 1024 1024\"><path d=\"M849.52381 974.048781 296.519747 974.048781C254.7965 974.048781 220.952381 940.537079 220.952381 899.361596L220.952381 24.97561 195.809524 49.951219 748.813585 49.951219C790.518054 49.951219 824.380951 83.595356 824.380951 124.977297L824.380951 877.099467C824.380951 890.893116 835.637792 902.075076 849.52381 902.075076 863.409826 902.075076 874.666667 890.893116 874.666667 877.099467L874.666667 124.977297C874.666667 56.010216 818.292258 0 748.813585 0L195.809524 0 170.666667 0 170.666667 24.97561 170.666667 899.361596C170.666667 968.160181 227.060385 1024 296.519747 1024L849.52381 1024C863.409826 1024 874.666667 1012.818039 874.666667 999.02439 874.666667 985.230741 863.409826 974.048781 849.52381 974.048781L849.52381 974.048781Z\"  ></path><path d=\"M325.488889 178.210097C325.488889 165.120605 336.197087 154.501897 349.448428 154.501897L686.773794 154.501897C699.931341 154.501897 710.733333 165.242514 710.733333 178.210097L710.733333 752.651691C710.733333 765.741184 700.025135 776.359891 686.773794 776.359891L349.448428 776.359891C336.290881 776.359891 325.488889 765.619275 325.488889 752.651691L325.488889 178.210097 325.488889 178.210097ZM277.333333 178.210097 277.333333 752.651691C277.333333 792.027497 309.684774 824.195121 349.448428 824.195121L686.773794 824.195121C726.60221 824.195121 758.88889 792.178268 758.88889 752.651691L758.88889 178.210097C758.88889 138.834292 726.537449 106.666667 686.773794 106.666667L349.448428 106.666667C309.620012 106.666667 277.333333 138.68352 277.333333 178.210097L277.333333 178.210097Z\"  ></path><path d=\"M522.666667 949.073171C550.438701 949.073171 572.952382 926.709248 572.952382 899.121952 572.952382 871.534654 550.438701 849.170731 522.666667 849.170731 494.894633 849.170731 472.380951 871.534654 472.380951 899.121952 472.380951 926.709248 494.894633 949.073171 522.666667 949.073171L522.666667 949.073171ZM522.666667 899.121952C522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952 522.666667 899.121952L522.666667 899.121952Z\"  ></path></symbol><symbol id=\"icon-emailfilling\" viewBox=\"0 0 1024 1024\"><path d=\"M1023.999996 243.058404 1023.999996 192.457355C1023.999996 133.350934 976.054238 85.333333 916.910148 85.333333L5.333333 85.333333 5.333333 835.815684C5.333333 895.199398 53.279091 943.15789 112.423181 943.15789L1023.999996 943.15789 1023.999996 446.546103 1023.999996 298.302321 543.765807 562.266963C534.759245 567.206035 523.722317 566.564235 515.348943 560.614513L150.648242 301.475533C138.579558 292.900098 135.747719 276.164736 144.323152 264.096051 152.898585 252.027366 169.633949 249.195529 181.702633 257.770961L532.052621 507.75001C532.052621 507.75001 538.767125 504.064926 542.12438 502.222385 691.83606 420.056992 1008.43715 251.349911 1024 243.058402Z\"  ></path></symbol><symbol id=\"icon-favoritesfilling\" viewBox=\"0 0 1024 1024\"><path d=\"M339.651042 341.097655 469.110756 58.828865C491.707678 8.534076 527.371795 8.880086 548.770042 59.60466L679.364582 341.097655M679.452297 340.474423 964.078942 371.359074C1018.894963 377.308079 1029.586705 411.333594 987.95719 447.35929L772.020879 666.738278M771.548333 663.5201 830.440373 945.270172C841.721615 999.241649 812.665359 1019.924563 765.538658 991.465092L517.688802 846.872395M517.485225 846.453572 267.723625 989.528794C219.879795 1016.935996 191.230298 995.693225 203.733911 942.078609L269.450995 660.288365M270.301116 660.710236 28.962399 447.35929C-12.667117 411.333594-1.975373 377.308079 52.840647 371.359074L338.533536 342.523883 336.275211 353.151657 338.788109 341.437007 679.762863 341.437007 771.253818 663.747471 517.557926 846.731194 270.278963 660.81351 270.301116 660.710236Z\"  ></path></symbol><symbol id=\"icon-accountfilling\" viewBox=\"0 0 1024 1024\"><path d=\"M621.855287 587.643358C708.573965 540.110571 768 442.883654 768 330.666667 768 171.608659 648.609267 42.666667 501.333333 42.666667 354.057399 42.666667 234.666667 171.608659 234.666667 330.666667 234.666667 443.22333 294.453005 540.699038 381.59961 588.07363 125.9882 652.794383 21.333333 855.35859 21.333333 1002.666667L486.175439 1002.666667 1002.666667 1002.666667C1002.666667 815.459407 839.953126 634.458526 621.855287 587.643358Z\"  ></path></symbol><symbol id=\"icon-creditlevel\" viewBox=\"0 0 1024 1024\"><path d=\"M998.4 369.066667 797.866667 93.866667c-4.266667-6.4-12.8-10.666667-19.2-10.666667L243.2 83.2c0 0-14.933333 2.133333-23.466667 17.066667C194.133333 142.933333 32 384 32 384L21.333333 401.066667l12.8 14.933333L469.333333 923.733333c4.266667 4.266667 6.4 6.4 10.666667 8.533333 6.4 4.266667 32 10.666667 46.933333 0 4.266667-2.133333 6.4-6.4 10.666667-8.533333l409.6-420.266667c10.666667-8.533333 10.666667-25.6 0-34.133333-8.533333-10.666667-23.466667-10.666667-32 0L561.066667 834.133333l153.6-422.4 0 0 251.733333 0c2.133333 0 19.2 0 23.466667-4.266667l2.133333-2.133333C1004.8 398.933333 1006.933333 384 998.4 369.066667zM782.933333 132.266667l-96 226.133333L341.333333 358.4l-85.333333-226.133333L782.933333 132.266667zM221.866667 181.333333l72.533333 179.2-192 0L221.866667 181.333333zM91.733333 407.466667l215.466667 0 138.666667 416L91.733333 407.466667zM503.466667 851.2l-147.2-443.733333 307.2 0L503.466667 851.2zM736 360.533333 810.666667 194.133333l119.466667 168.533333L736 362.666667z\"  ></path></symbol><symbol id=\"icon-creditlevelfilling\" viewBox=\"0 0 1024 1024\"><path d=\"M1002.666667 384 812.8 119.466667 723.2 384Z\"  ></path><path d=\"M362.666667 426.666667 512 859.733333 659.2 426.666667Z\"  ></path><path d=\"M678.4 384 772.266667 85.333333 678.4 85.333333 362.666667 85.333333 251.733333 85.333333 347.733333 384Z\"  ></path><path d=\"M535.466667 934.4 537.6 936.533333 1000.533333 426.666667 708.266667 426.666667Z\"  ></path><path d=\"M209.066667 117.333333 21.333333 384 300.8 384Z\"  ></path><path d=\"M21.333333 426.666667 486.4 940.8 486.4 932.266667 315.733333 426.666667Z\"  ></path></symbol><symbol id=\"icon-exl\" viewBox=\"0 0 1024 1024\"><path d=\"M905.185809 178.844158C898.576738 172.685485 891.19337 165.824412 883.21687 158.436127 860.422682 137.322863 837.434925 116.207791 815.697647 96.487895 813.243072 94.261877 813.243072 94.261877 810.786411 92.037081 781.783552 65.781062 757.590948 44.376502 739.713617 29.293612 729.254178 20.469111 721.020606 13.860686 714.970549 9.501727 710.955023 6.608611 707.690543 4.524745 704.47155 2.998714 700.417679 1.07689 696.638044-0.094029 691.307277 0.005928 677.045677 0.273349 665.6 11.769337 665.6 26.182727L665.6 77.352844 665.6 128.522961 665.6 230.863194 665.6 256.448252 691.2 256.448252 896 256.448252 870.4 230.863194 870.4 998.414942 896 972.829884 230.381436 972.829884C187.90385 972.829884 153.6 938.623723 153.6 896.20663L153.6 26.182727 128 51.767786 588.8 51.767786C602.93849 51.767786 614.4 40.312965 614.4 26.182727 614.4 12.05249 602.93849 0.597669 588.8 0.597669L128 0.597669 102.4 0.597669 102.4 26.182727 102.4 896.20663C102.4 966.91021 159.652833 1024 230.381436 1024L896 1024 921.6 1024 921.6 998.414942 921.6 230.863194 921.6 205.278135 896 205.278135 691.2 205.278135 716.8 230.863194 716.8 128.522961 716.8 77.352844 716.8 26.182727C716.8 39.813762 705.748075 50.91427 692.267725 51.167041 687.705707 51.252584 685.069822 50.435995 682.52845 49.231204 682.259458 49.103682 683.344977 49.796618 685.029451 51.010252 689.779394 54.432502 697.145822 60.34494 706.686383 68.394196 724.009052 83.009121 747.816448 104.072869 776.413589 129.961594 778.850014 132.168064 778.850014 132.168064 781.285216 134.376514 802.876774 153.964212 825.739479 174.96442 848.413564 195.966437 856.350957 203.3185 863.697005 210.144893 870.269888 216.269843 874.209847 219.941299 877.019309 222.565641 878.499674 223.951409 888.81866 233.610931 905.019017 233.081212 914.684179 222.768247 924.349344 212.455283 923.819315 196.264383 913.500326 186.604861 911.981323 185.182945 909.155025 182.542876 905.185809 178.844158ZM102.4 461.128719 0 461.128719 0 896.074709 512 896.074709 1024 896.074709 1024 461.128719 153.6 461.128719 153.6 460.531049 102.4 460.531049 102.4 461.128719ZM349.4 673.2 229.8 673.2 229.8 762.8 369.6 762.8 369.6 803.2 179.2 803.2 179.2 512 368.2 512 368.2 552.8 229.8 552.8 229.8 633.2 349.4 633.2 349.4 673.2ZM511 617.2 572.2 512 630.6 512 542.6 656.4 632.6 803.2 573.6 803.2 511 696.4 448.2 803.2 389.4 803.2 479.6 656.4 391.4 512 449.8 512 511 617.2ZM720.6 762.8 852.8 762.8 852.8 803.2 670 803.2 670 512 720.6 512 720.6 762.8Z\"  ></path></symbol><symbol id=\"icon-pdf\" viewBox=\"0 0 1024 1024\"><path d=\"M905.185809 178.844158C898.576738 172.685485 891.19337 165.824412 883.21687 158.436127 860.422682 137.322863 837.434925 116.207791 815.697647 96.487895 813.243072 94.261877 813.243072 94.261877 810.786411 92.037081 781.783552 65.781062 757.590948 44.376502 739.713617 29.293612 729.254178 20.469111 721.020606 13.860686 714.970549 9.501727 710.955023 6.608611 707.690543 4.524745 704.47155 2.998714 700.417679 1.07689 696.638044-0.094029 691.307277 0.005928 677.045677 0.273349 665.6 11.769337 665.6 26.182727L665.6 77.352844 665.6 128.522961 665.6 230.863194 665.6 256.448252 691.2 256.448252 896 256.448252 870.4 230.863194 870.4 998.414942 896 972.829884 230.381436 972.829884C187.90385 972.829884 153.6 938.623723 153.6 896.20663L153.6 26.182727 128 51.767786 588.8 51.767786C602.93849 51.767786 614.4 40.312965 614.4 26.182727 614.4 12.05249 602.93849 0.597669 588.8 0.597669L128 0.597669 102.4 0.597669 102.4 26.182727 102.4 896.20663C102.4 966.91021 159.652833 1024 230.381436 1024L896 1024 921.6 1024 921.6 998.414942 921.6 230.863194 921.6 205.278135 896 205.278135 691.2 205.278135 716.8 230.863194 716.8 128.522961 716.8 77.352844 716.8 26.182727C716.8 39.813762 705.748075 50.91427 692.267725 51.167041 687.705707 51.252584 685.069822 50.435995 682.52845 49.231204 682.259458 49.103682 683.344977 49.796618 685.029451 51.010252 689.779394 54.432502 697.145822 60.34494 706.686383 68.394196 724.009052 83.009121 747.816448 104.072869 776.413589 129.961594 778.850014 132.168064 778.850014 132.168064 781.285216 134.376514 802.876774 153.964212 825.739479 174.96442 848.413564 195.966437 856.350957 203.3185 863.697005 210.144893 870.269888 216.269843 874.209847 219.941299 877.019309 222.565641 878.499674 223.951409 888.81866 233.610931 905.019017 233.081212 914.684179 222.768247 924.349344 212.455283 923.819315 196.264383 913.500326 186.604861 911.981323 185.182945 909.155025 182.542876 905.185809 178.844158ZM102.4 461.128719 0 461.128719 0 896.074709 512 896.074709 1024 896.074709 1024 461.128719 153.6 461.128719 153.6 460.531049 102.4 460.531049 102.4 461.128719ZM208.2 711 208.2 819.2 157.6 819.2 157.6 528 269 528C301.533495 528 327.366571 536.466581 346.5 553.4 365.633429 570.333419 375.2 592.733195 375.2 620.6 375.2 649.133476 365.833427 671.333254 347.1 687.2 328.366573 703.066746 302.133502 711 268.4 711L208.2 711ZM208.2 670.4 269 670.4C287.00009 670.4 300.733286 666.166709 310.2 657.7 319.666714 649.233291 324.4 637.000079 324.4 621 324.4 605.266588 319.600047 592.700047 310 583.3 300.399951 573.899953 287.200083 569.066669 270.4 568.8L208.2 568.8 208.2 670.4ZM419.4 819.2 419.4 528 505.4 528C531.133461 528 553.966566 533.733276 573.9 545.2 593.833434 556.666724 609.266611 572.933229 620.2 594 631.133389 615.066771 636.6 639.199863 636.6 666.4L636.6 681C636.6 708.600139 631.100055 732.866562 620.1 753.8 609.099945 774.733438 593.433436 790.866609 573.1 802.2 552.766564 813.533391 529.466799 819.2 503.2 819.2L419.4 819.2ZM470 568.8 470 778.8 503 778.8C529.533466 778.8 549.89993 770.500083 564.1 753.9 578.30007 737.299917 585.533331 713.466822 585.8 682.4L585.8 666.2C585.8 634.599842 578.933402 610.46675 565.2 593.8 551.466598 577.13325 531.533463 568.8 505.4 568.8L470 568.8ZM854.8 695.8 737.6 695.8 737.6 819.2 687 819.2 687 528 872 528 872 568.8 737.6 568.8 737.6 655.4 854.8 655.4 854.8 695.8Z\"  ></path></symbol><symbol id=\"icon-zip\" viewBox=\"0 0 1024 1024\"><path d=\"M905.185809 178.844158C898.576738 172.685485 891.19337 165.824412 883.21687 158.436127 860.422682 137.322863 837.434925 116.207791 815.697647 96.487895 813.243072 94.261877 813.243072 94.261877 810.786411 92.037081 781.783552 65.781062 757.590948 44.376502 739.713617 29.293612 729.254178 20.469111 721.020606 13.860686 714.970549 9.501727 710.955023 6.608611 707.690543 4.524745 704.47155 2.998714 700.417679 1.07689 696.638044-0.094029 691.307277 0.005928 677.045677 0.273349 665.6 11.769337 665.6 26.182727L665.6 77.352844 665.6 128.522961 665.6 230.863194 665.6 256.448252 691.2 256.448252 896 256.448252 870.4 230.863194 870.4 998.414942 896 972.829884 230.381436 972.829884C187.90385 972.829884 153.6 938.623723 153.6 896.20663L153.6 26.182727 128 51.767786 588.8 51.767786C602.93849 51.767786 614.4 40.312965 614.4 26.182727 614.4 12.05249 602.93849 0.597669 588.8 0.597669L128 0.597669 102.4 0.597669 102.4 26.182727 102.4 896.20663C102.4 966.91021 159.652833 1024 230.381436 1024L896 1024 921.6 1024 921.6 998.414942 921.6 230.863194 921.6 205.278135 896 205.278135 691.2 205.278135 716.8 230.863194 716.8 128.522961 716.8 77.352844 716.8 26.182727C716.8 39.813762 705.748075 50.91427 692.267725 51.167041 687.705707 51.252584 685.069822 50.435995 682.52845 49.231204 682.259458 49.103682 683.344977 49.796618 685.029451 51.010252 689.779394 54.432502 697.145822 60.34494 706.686383 68.394196 724.009052 83.009121 747.816448 104.072869 776.413589 129.961594 778.850014 132.168064 778.850014 132.168064 781.285216 134.376514 802.876774 153.964212 825.739479 174.96442 848.413564 195.966437 856.350957 203.3185 863.697005 210.144893 870.269888 216.269843 874.209847 219.941299 877.019309 222.565641 878.499674 223.951409 888.81866 233.610931 905.019017 233.081212 914.684179 222.768247 924.349344 212.455283 923.819315 196.264383 913.500326 186.604861 911.981323 185.182945 909.155025 182.542876 905.185809 178.844158ZM102.4 461.128719 0 461.128719 0 896.074709 512 896.074709 1024 896.074709 1024 461.128719 153.6 461.128719 153.6 460.531049 102.4 460.531049 102.4 461.128719ZM282 778.8 437.6 778.8 437.6 819.2 220.8 819.2 220.8 786.4 371.4 568.8 221.8 568.8 221.8 528 432.8 528 432.8 560 282 778.8ZM534.4 819.2 484 819.2 484 528 534.4 528 534.4 819.2ZM647.2 711 647.2 819.2 596.6 819.2 596.6 528 708 528C740.533495 528 766.366571 536.466581 785.5 553.4 804.633429 570.333419 814.2 592.733195 814.2 620.6 814.2 649.133476 804.833427 671.333254 786.1 687.2 767.366573 703.066746 741.133502 711 707.4 711L647.2 711ZM647.2 670.4 708 670.4C726.00009 670.4 739.733286 666.166709 749.2 657.7 758.666714 649.233291 763.4 637.000079 763.4 621 763.4 605.266588 758.600047 592.700047 749 583.3 739.399951 573.899953 726.200083 569.066669 709.4 568.8L647.2 568.8 647.2 670.4Z\"  ></path></symbol><symbol id=\"icon-sorting\" viewBox=\"0 0 1024 1024\"><path d=\"M280.862942 274.570551 457.233498 99.774732C456.884459 100.120655 455.897694 100.817298 453.852297 101.634582 448.964578 103.587578 442.709018 103.852274 436.383616 101.196511 430.07642 98.54839 425.906586 93.926764 423.887388 89.116756 423.062084 87.150771 422.879851 86.052216 422.879851 85.679799L422.879851 956.425024C422.879851 973.127021 436.419497 986.666667 453.121495 986.666667 469.823492 986.666667 483.363138 973.127021 483.363138 956.425024L483.363138 85.679799C483.363138 45.207303 443.329783 28.399023 414.657568 56.815236L238.287012 231.611055C226.424075 243.368073 226.33821 262.515829 238.09523 274.378767 249.852247 286.241705 269.000004 286.327569 280.862942 274.570551L280.862942 274.570551Z\"  ></path></symbol><symbol id=\"icon-copy\" viewBox=\"0 0 1024 1024\"><path d=\"M746.932 698.108\"  ></path><path d=\"M925.731 288.698c-1.261-1.18-3.607-3.272-6.902-6.343-5.486-5.112-11.615-10.758-18.236-16.891-18.921-17.526-38.003-35.028-56.046-51.397-2.038-1.848-2.038-1.835-4.077-3.682-24.075-21.795-44.156-39.556-58.996-52.076-8.682-7.325-15.517-12.807-20.539-16.426-3.333-2.402-6.043-4.13-8.715-5.396-3.365-1.595-6.48-2.566-10.905-2.483C729.478 134.227 720 143.77 720 155.734l0 42.475 0 42.475 0 84.95L720 347l21.205 0L890 347l0 595L358.689 942C323.429 942 295 913.132 295 877.922L295 177l361.205 0c11.736 0 21.25-9.771 21.25-21.5s-9.514-21.5-21.25-21.5l-382.5 0L252 134l0 21.734L252 813l-52.421 0C166.646 813 140 786.928 140 754.678L140 72l566.286 0C739.29 72 766 98.154 766 130.404L766 134l40 0 0-3.596C806 76.596 761.271 33 706.286 33L119.958 33 100 33l0 19.506 0 702.172C100 808.463 144.642 852 199.579 852L252 852l0 25.922C252 936.612 299.979 984 358.689 984l552.515 0L932 984l0-21.237L932 325.635 932 304l0.433 0C932.432 299 930.196 292.878 925.731 288.698zM762 304l0-63.315L762 198.21l0-0.273c14 11.479 30.3 26.369 49.711 43.942 2.022 1.832 2.136 1.832 4.157 3.665 17.923 16.259 36.957 33.492 55.779 50.926 2.878 2.666 5.713 5.531 8.391 7.531L762 304.001z\"  ></path><path d=\"M816.936 436 407.295 436c-10.996 0-19.91 8.727-19.91 19.5 0 10.77 8.914 19.5 19.91 19.5l409.641 0c11 0 19.914-8.73 19.914-19.5C836.85 444.727 827.936 436 816.936 436z\"  ></path><path d=\"M816.936 553 407.295 553c-10.996 0-19.91 8.727-19.91 19.5 0 10.774 8.914 19.5 19.91 19.5l409.641 0c11 0 19.914-8.726 19.914-19.5C836.85 561.727 827.936 553 816.936 553z\"  ></path><path d=\"M816.936 689 407.295 689c-10.996 0-19.91 8.729-19.91 19.503 0 10.769 8.914 19.497 19.91 19.497l409.641 0c11 0 19.914-8.729 19.914-19.497C836.85 697.729 827.936 689 816.936 689z\"  ></path></symbol><symbol id=\"icon-save\" viewBox=\"0 0 1024 1024\"><path d=\"M665.6 332.8 665.6 128C665.6 113.86151 654.13849 102.4 640 102.4 625.86151 102.4 614.4 113.86151 614.4 128L614.4 332.8C614.4 346.93849 625.86151 358.4 640 358.4 654.13849 358.4 665.6 346.93849 665.6 332.8L665.6 332.8ZM640 51.2 819.2 51.2 793.6 25.6 793.6 384.133545C793.6 426.406699 759.102946 460.8 716.727898 460.8L281.672102 460.8C239.236715 460.8 204.8 426.413438 204.8 384.133545L204.8 25.6C204.8 11.46151 193.33849 0 179.2 0 165.06151 0 153.6 11.46151 153.6 25.6L153.6 384.133545C153.6 454.707134 210.976425 512 281.672102 512L716.727898 512C787.345461 512 844.8 454.718257 844.8 384.133545L844.8 25.6 844.8 0 819.2 0 640 0C625.86151 0 614.4 11.46151 614.4 25.6 614.4 39.73849 625.86151 51.2 640 51.2L640 51.2Z\"  ></path><path d=\"M844.8 972.8 128.081132 972.8C85.544157 972.8 51.2 938.575806 51.2 896.163853L51.2 100.711064 51.2 25.6 25.6 51.2 102.4 51.2 896.233363 51.2C938.580175 51.2 972.8 85.414085 972.8 127.868001L972.8 998.4C972.8 1012.53849 984.26151 1024 998.4 1024 1012.53849 1024 1024 1012.53849 1024 998.4L1024 127.868001C1024 57.135182 966.85523 0 896.233363 0L102.4 0 25.6 0 0 0 0 25.6 0 100.711064 0 896.163853C0 966.892966 57.307204 1024 128.081132 1024L844.8 1024C858.93849 1024 870.4 1012.53849 870.4 998.4 870.4 984.26151 858.93849 972.8 844.8 972.8L844.8 972.8Z\"  ></path></symbol><symbol id=\"icon-inquirytemplate\" viewBox=\"0 0 1024 1024\"><path d=\"M393.383795 974.048781 159.97786 974.048781C111.196085 974.048781 71.284553 932.770882 71.284553 881.485869L71.284553 24.97561 46.308943 49.951219 781.65338 49.951219C830.474699 49.951219 870.504064 91.403498 870.504064 142.743289L870.504064 490.133325C870.504064 503.926972 881.686027 515.108934 895.479676 515.108934 909.273323 515.108934 920.455285 503.926972 920.455285 490.133325L920.455285 142.743289C920.455285 64.199067 858.459947 0 781.65338 0L46.308943 0 21.333333 0 21.333333 24.97561 21.333333 881.485869C21.333333 959.988932 83.22553 1024 159.97786 1024L393.383795 1024C407.177444 1024 418.359405 1012.818039 418.359405 999.02439 418.359405 985.230741 407.177444 974.048781 393.383795 974.048781L393.383795 974.048781Z\"  ></path><path d=\"M197.162104 374.634146 768.260691 374.634146C782.05434 374.634146 793.236301 363.452186 793.236301 349.658537 793.236301 335.864887 782.05434 324.682927 768.260691 324.682927L197.162104 324.682927C183.368455 324.682927 172.186494 335.864887 172.186494 349.658537 172.186494 363.452186 183.368455 374.634146 197.162104 374.634146L197.162104 374.634146Z\"  ></path><path d=\"M199.955658 224.780489 771.054246 224.780489C784.847893 224.780489 796.029856 213.598526 796.029856 199.804878 796.029856 186.01123 784.847893 174.829268 771.054246 174.829268L199.955658 174.829268C186.16201 174.829268 174.980048 186.01123 174.980048 199.804878 174.980048 213.598526 186.16201 224.780489 199.955658 224.780489L199.955658 224.780489Z\"  ></path><path d=\"M970.406505 798.458935 970.406505 999.02439 995.382114 974.048781 565.935198 974.048781C551.735753 974.048781 540.46042 963.003313 540.46042 949.570613L540.46042 603.814846 515.484811 628.790455 944.931725 628.790455C959.111287 628.790455 970.406505 639.844066 970.406505 653.168102L970.406505 684.232055C970.406505 698.025705 981.588465 709.207665 995.382114 709.207665 1009.175763 709.207665 1020.357724 698.025705 1020.357724 684.232055L1020.357724 653.168102C1020.357724 612.012141 986.459738 578.839236 944.931725 578.839236L515.484811 578.839236 490.509199 578.839236 490.509199 603.814846 490.509199 949.570613C490.509199 990.823518 524.376117 1024 565.935198 1024L995.382114 1024 1020.357724 1024 1020.357724 999.02439 1020.357724 798.458935C1020.357724 784.665289 1009.175763 773.483326 995.382114 773.483326 981.588465 773.483326 970.406505 784.665289 970.406505 798.458935L970.406505 798.458935Z\"  ></path><path d=\"M613.935418 711.683334 768.879164 821.778995C776.680484 827.322242 786.96339 827.920196 795.354639 823.318551L1001.262532 710.40154C1013.356979 703.769114 1017.784823 688.587983 1011.152397 676.493536 1004.51997 664.399087 989.338839 659.971245 977.244393 666.603671L771.336499 779.520683 797.811974 781.060241 642.868228 670.96458C631.624053 662.975006 616.032021 665.613378 608.042447 676.857553 600.05287 688.101726 602.691245 703.693758 613.935418 711.683334L613.935418 711.683334Z\"  ></path></symbol><symbol id=\"icon-templatedefault\" viewBox=\"0 0 1024 1024\"><path d=\"M468.310626 974.048781 159.97786 974.048781C111.196085 974.048781 71.284553 932.770882 71.284553 881.485869L71.284553 24.97561 46.308943 49.951219 781.65338 49.951219C830.474699 49.951219 870.504064 91.403498 870.504064 142.743289L870.504064 490.133325C870.504064 503.926972 881.686027 515.108934 895.479676 515.108934 909.273323 515.108934 920.455285 503.926972 920.455285 490.133325L920.455285 142.743289C920.455285 64.199067 858.459947 0 781.65338 0L46.308943 0 21.333333 0 21.333333 24.97561 21.333333 881.485869C21.333333 959.988932 83.22553 1024 159.97786 1024L468.310626 1024C482.104273 1024 493.286236 1012.818039 493.286236 999.02439 493.286236 985.230741 482.104273 974.048781 468.310626 974.048781L468.310626 974.048781Z\"  ></path><path d=\"M197.162104 374.634146 768.260691 374.634146C782.05434 374.634146 793.236301 363.452186 793.236301 349.658537 793.236301 335.864887 782.05434 324.682927 768.260691 324.682927L197.162104 324.682927C183.368455 324.682927 172.186494 335.864887 172.186494 349.658537 172.186494 363.452186 183.368455 374.634146 197.162104 374.634146L197.162104 374.634146Z\"  ></path><path d=\"M199.955658 224.780489 771.054246 224.780489C784.847893 224.780489 796.029856 213.598526 796.029856 199.804878 796.029856 186.01123 784.847893 174.829268 771.054246 174.829268L199.955658 174.829268C186.16201 174.829268 174.980048 186.01123 174.980048 199.804878 174.980048 213.598526 186.16201 224.780489 199.955658 224.780489L199.955658 224.780489Z\"  ></path><path d=\"M770.601626 1024C908.53811 1024 1020.357724 912.180386 1020.357724 774.243902 1020.357724 636.307418 908.53811 524.487806 770.601626 524.487806 632.665141 524.487806 520.845527 636.307418 520.845527 774.243902 520.845527 912.180386 632.665141 1024 770.601626 1024L770.601626 1024ZM770.601626 974.048781C660.252439 974.048781 570.796749 884.59309 570.796749 774.243902 570.796749 663.894716 660.252439 574.439025 770.601626 574.439025 880.950814 574.439025 970.406505 663.894716 970.406505 774.243902 970.406505 884.59309 880.950814 974.048781 770.601626 974.048781L770.601626 974.048781Z\"  ></path><path d=\"M628.063155 791.904326 698.708245 862.549417C718.235857 882.077028 749.784966 882.10759 769.3688 862.523757L914.030005 717.862551C923.783586 708.108969 923.783586 692.295287 914.030005 682.541705 904.276422 672.788124 888.462741 672.788124 878.709158 682.541705L734.047953 827.20291C733.98662 827.264243 734.064841 827.26432 734.029092 827.228572L663.384 756.583479C653.630417 746.829897 637.816736 746.829897 628.063155 756.583479 618.309572 766.337062 618.309572 782.150743 628.063155 791.904326L628.063155 791.904326Z\"  ></path></symbol><symbol id=\"icon-libra\" viewBox=\"0 0 1025 1024\"><path d=\"M588.1088 490.3424c12.81024 109.23008 105.63072 193.9968 218.30144 193.9968s205.4912-84.76672 218.30144-193.9968c0 0-0.35328 0-0.3584 0 0.52224-4.92032-0.37376-10.04032-2.87744-14.73024l-189.68064-355.2256c-1.65376-6.85568-6.02112-13.02528-12.73344-16.60928-2.29888-1.2288-4.70528-1.9456-7.13728-2.42176-0.2048-0.04608-0.41472-0.0768-0.61952-0.11776-1.17248-0.19968-2.33472-0.3328-3.5072-0.36864-0.3584-0.01536-0.6912-0.11264-1.0496-0.11264l-269.2864 0 0-38.63552c0-17.3312-11.46368-31.38048-25.6-31.38048s-25.6 14.04928-25.6 31.38048l0 38.63552L216.97024 100.75648c-0.35328 0-0.68096 0.09216-1.02912 0.10752-0.31232 0.0256-0.62464 0.06144-0.93696 0.09728-5.10464 0.43008-9.72288 2.46784-13.4656 5.67296-0.04096 0.03584-0.0768 0.06656-0.11776 0.1024-0.9984 0.86528-1.92512 1.792-2.78016 2.816-0.50176 0.57344-0.95744 1.16736-1.40288 1.77664-0.31232 0.45056-0.61952 0.90112-0.90624 1.37216-1.5104 2.3808-2.6112 4.95616-3.27168 7.67488L3.3792 475.61728c-2.24256 4.20352-3.09248 8.74496-2.8928 13.184C0.4608 489.3184 0.3584 489.81504 0.3584 490.3424l-0.35328 0c12.81024 109.23008 105.63072 193.9968 218.30144 193.9968s205.4912-84.76672 218.30144-193.9968c0 0-0.35328 0-0.3584 0 0.52224-4.92032-0.37376-10.04032-2.87744-14.73024L260.54656 151.95648l225.7152 0 0 790.45632L216.97024 942.4128c-13.51168 0-24.46848 11.46368-24.46848 25.6s10.9568 25.6 24.46848 25.6l589.78304 0c13.51168 0 24.46848-11.46368 24.46848-25.6 0-14.14144-10.9568-25.6-24.4736-25.6l-269.2864 0L537.46176 151.95648l226.85184 0-172.8256 323.65568c-2.24256 4.20352-3.0976 8.74496-2.89792 13.184-0.0256 0.52224-0.128 1.01888-0.128 1.54624L588.1088 490.3424zM218.30656 633.1392c-75.19744 0-138.85952-49.22368-160.62464-117.1968l265.5488 0c11.60704 0 21.02272-11.46368 21.02272-25.6 0-14.14144-9.41056-25.6-21.02272-25.6l-256 0 151.1424-283.0592 166.17472 311.1936C371.04128 572.49792 301.7728 633.1392 218.30656 633.1392zM806.41024 633.1392c-75.19744 0-138.85952-49.22368-160.62464-117.1968l267.8016 0c11.68896 0 21.16608-11.46368 21.16608-25.6 0-14.14144-9.47712-25.6-21.16608-25.6l-258.25792 0 151.14752-283.0592 166.1696 311.19872C959.14496 572.49792 889.87648 633.1392 806.41024 633.1392z\"  ></path></symbol><symbol id=\"icon-survey1\" viewBox=\"0 0 1024 1024\"><path d=\"M731.499531 47.014558C770.629127 47.014558 802.392705 78.618418 802.392705 117.545505L802.392744 446.638311 412.872048 846.262065 423.917326 846.262039 139.970966 846.262039C100.8091 846.262039 69.096657 814.801393 69.096657 775.971075L69.096655 47.014558 45.441945 47.014558 731.499531 47.014558ZM21.787234 0 21.787234 23.507279 21.787234 775.971075C21.787234 840.784929 74.69902 893.276596 139.970966 893.276596L423.917326 893.276596 433.836385 893.276596 440.788839 886.246008 842.918932 479.596694 849.702128 472.737265 849.702128 463.120003 849.702128 117.545505C849.702128 52.665733 796.770234 0 731.499531 0L45.441945 0 21.787234 0Z\"  ></path><path d=\"M778.22803 636.420841 866.898308 725.091119 885.125447 744.577647 982.593479 646.374481 855.512968 518.560378 759.89601 618.825996 778.22803 636.420841ZM917.371009 643.055851 882.031912 678.622341 822.728724 621.430852 856.902924 584.309841 917.371009 643.055851Z\"  ></path><path d=\"M772.341518 604.741944 515.869818 861.213644 510.878071 866.205391 509.49361 873.127701 486.177999 989.705748 479.319149 1024 513.613401 1017.14115 630.191448 993.825539 637.113758 992.441078 642.105505 987.449331 898.577205 730.977631 915.06383 714.491006 898.577205 698.00438 805.314769 604.741944 788.828143 588.255319 772.341518 604.741944 772.341518 604.741944 772.341518 604.741944ZM788.548057 654.71881 849.238319 714.613627 613.059177 948.099878 537.423434 964.538791 556.253326 886.787689 788.548057 654.71881Z\"  ></path><path d=\"M154.380179 392.170213 695.321949 392.170213C708.387226 392.170213 718.978723 382.415735 718.978723 370.382979 718.978723 358.350223 708.387226 348.595745 695.321949 348.595745L154.380179 348.595745C141.314903 348.595745 130.723404 358.350223 130.723404 370.382979 130.723404 382.415735 141.314903 392.170213 154.380179 392.170213L154.380179 392.170213 154.380179 392.170213Z\"  ></path><path d=\"M154.380179 239.659574 695.321949 239.659574C708.387226 239.659574 718.978723 229.905096 718.978723 217.87234 718.978723 205.839583 708.387226 196.085106 695.321949 196.085106L154.380179 196.085106C141.314903 196.085106 130.723404 205.839583 130.723404 217.87234 130.723404 229.905096 141.314903 239.659574 154.380179 239.659574L154.380179 239.659574 154.380179 239.659574Z\"  ></path></symbol><symbol id=\"icon-ship\" viewBox=\"0 0 1024 1024\"><path d=\"M254.094204 888.715204 105.38434 479.399307 95.298022 505.547191 531.981478 274.863088 511.246884 274.415218 927.896762 518.087563 919.147567 491.063287 823.569182 707.765783C818.814532 718.545884 823.699125 731.13929 834.479226 735.893939 845.259328 740.648591 857.852732 735.763998 862.607381 724.983895L958.185766 508.281402C962.562163 498.358908 958.797909 486.731985 949.436572 481.257126L532.786694 237.584782C526.417653 233.85993 518.576041 233.69055 512.0521 237.136912L75.368645 467.821013C65.95003 472.796529 61.644922 483.957137 65.282327 493.968898L213.992191 903.284796C218.015472 914.35866 230.254127 920.074289 241.327993 916.051006 252.401858 912.027725 258.117485 899.789071 254.094204 888.715204L254.094204 888.715204Z\"  ></path><path d=\"M501.333333 277.333333 501.333333 853.333333C501.333333 865.115407 510.884593 874.666667 522.666667 874.666667 534.44874 874.666667 544 865.115407 544 853.333333L544 277.333333C544 265.551259 534.44874 256 522.666667 256 510.884593 256 501.333333 265.551259 501.333333 277.333333L501.333333 277.333333Z\"  ></path><path d=\"M234.666667 403.821225 234.666667 192 213.30699 213.333317 810.640322 214.070941 789.333333 192.737624 789.333333 426.666667C789.333333 438.44874 798.884593 448 810.666667 448 822.44874 448 832 438.44874 832 426.666667L832 192.737624C832 180.965836 822.464789 171.418844 810.693011 171.404307L213.359677 170.666683C201.567322 170.652121 192 180.207636 192 192L192 403.821225C192 415.603298 201.551259 425.154558 213.333333 425.154558 225.115408 425.154558 234.666667 415.603298 234.666667 403.821225L234.666667 403.821225Z\"  ></path><path d=\"M50.808629 885.090656C59.57446 891.98755 74.359082 901.898603 93.457074 911.777417 125.833244 928.524631 158.87312 938.666667 191.200647 938.666667 194.159993 938.666667 197.125968 938.490381 200.101743 938.143554 215.160419 936.388463 229.750682 930.546782 246.981287 920.516474 253.290676 916.843642 259.67245 912.800755 268.51965 906.963369 270.933897 905.370447 279.678588 899.563123 279.334447 899.791241 283.686688 896.906313 287.021523 894.717329 290.313331 892.593978 349.341858 854.518165 394.110662 842.971332 458.251198 861.801203 499.945909 874.041609 531.81113 885.915846 562.013282 899.523206 564.427757 900.611029 610.274961 922.482718 622.334739 927.069694 643.349741 935.062818 663.178867 938.666667 689.241841 938.666667 716.338238 938.666665 728.977969 934.064819 791.184625 906.613628 871.129935 871.334541 915.734313 866.539106 969.593022 902.038165 979.430453 908.522161 992.661587 905.803663 999.145581 895.966229 1005.629577 886.128796 1002.911078 872.897664 993.073645 866.413668 923.841726 820.781903 865.884521 827.012905 773.958923 867.578775 719.179394 891.752448 707.512794 895.999998 689.241837 896 668.334466 896 653.646641 893.330558 637.503006 887.190274 627.363543 883.333696 583.439821 862.379616 579.539729 860.62246 547.579132 846.222844 513.877129 833.664147 470.269737 820.862236 392.284911 797.968066 335.65418 812.574345 267.185634 856.739356 203.418324 897.871874 210.013117 894.032902 195.162376 895.763757 193.807429 895.921677 192.489657 896 191.200647 896 166.730635 896 139.899367 887.76378 113.059968 873.88057 103.454075 868.911733 94.55576 863.578065 86.625828 858.262138 81.957097 855.132397 78.730138 852.769342 77.191371 851.558652 67.931764 844.273259 54.519391 845.873675 47.233998 855.133282 39.948604 864.39289 41.549021 877.805263 50.808629 885.090656L50.808629 885.090656Z\"  ></path><path d=\"M362.666667 185.139587 362.666667 106.666667 341.333333 128 704 128 682.666667 106.666667 682.666667 192C682.666667 203.782075 692.217926 213.333333 704 213.333333 715.782074 213.333333 725.333333 203.782075 725.333333 192L725.333333 106.666667C725.333333 94.884592 715.782074 85.333333 704 85.333333L341.333333 85.333333C329.55126 85.333333 320 94.884592 320 106.666667L320 185.139587C320 196.921662 329.55126 206.47292 341.333333 206.47292 353.115407 206.47292 362.666667 196.921662 362.666667 185.139587L362.666667 185.139587Z\"  ></path></symbol><symbol id=\"icon-bussinesscard\" viewBox=\"0 0 1025 1024\"><path d=\"M448 405.333333C448 334.640885 390.692448 277.333333 320 277.333333 249.307552 277.333333 192 334.640885 192 405.333333 192 476.025781 249.307552 533.333333 320 533.333333 390.692448 533.333333 448 476.025781 448 405.333333ZM243.2 405.333333C243.2 362.917865 277.584531 328.533333 320 328.533333 362.415469 328.533333 396.8 362.917865 396.8 405.333333 396.8 447.748802 362.415469 482.133333 320 482.133333 277.584531 482.133333 243.2 447.748802 243.2 405.333333Z\"  ></path><path d=\"M130.808907 668.800009 130.808907 695.466675 156.69817 695.466675 328.38486 695.466675 519.147849 695.466675 545.037111 695.466675 545.037111 668.800009C545.037111 569.359543 449.055298 482.133342 337.923008 482.133342 331.301828 482.133342 324.715537 482.413289 318.179253 482.969794 303.929606 484.183021 293.332828 497.06503 294.510686 511.742569 295.688544 526.420105 300.838539 531.468314 315.088186 530.255087 320.205801 529.819369 332.725555 535.466675 337.923008 535.466675 421.801824 535.466675 493.258586 580.78224 493.258586 642.133342L328.38486 642.133342 182.587432 642.133342C182.587432 623.249623 202.863759 588.315287 240.911324 563.27005 252.959405 555.339264 256.484561 538.849914 248.784979 526.440051 241.085397 514.030191 225.076753 510.399181 213.028673 518.329967 160.669895 552.795721 130.808907 604.231546 130.808907 668.800009Z\"  ></path><path d=\"M128.186836 824.380951C85.627327 824.380951 51.233488 790.647147 51.233488 748.813585L51.233488 178.285714 896.718133 178.285714C939.035972 178.285714 973.436282 212.088034 973.436282 253.608631L973.436282 747.054095C973.436282 760.940111 984.905289 772.196951 999.053026 772.196951 1013.200762 772.196951 1024.669769 760.940111 1024.669769 747.054095L1024.669769 253.608631C1024.669769 184.328784 967.344489 128 896.718133 128L25.616744 128 0 128 0 153.142857 0 748.813585C0 818.427115 57.33993 874.666667 128.186836 874.666667L912.213943 874.666667C926.361679 874.666667 937.830686 863.409826 937.830686 849.52381 937.830686 835.637792 926.361679 824.380951 912.213943 824.380951L128.186836 824.380951Z\"  ></path><path d=\"M871.607934 405.333333C885.0793 405.333333 896 395.782074 896 384 896 372.217926 885.0793 362.666667 871.607934 362.666667L579.058733 362.666667C565.587366 362.666667 554.666667 372.217926 554.666667 384 554.666667 395.782074 565.587366 405.333333 579.058733 405.333333L871.607934 405.333333Z\"  ></path><path d=\"M807.058613 512C820.833361 512 832 502.44874 832 490.666667 832 478.884593 820.833361 469.333333 807.058613 469.333333L579.608053 469.333333C565.833306 469.333333 554.666667 478.884593 554.666667 490.666667 554.666667 502.44874 565.833306 512 579.608053 512L807.058613 512Z\"  ></path></symbol><symbol id=\"icon-hot\" viewBox=\"0 0 1024 1024\"><path d=\"M890.059904 543.80051C845.890699 437.043294 840.554889 347.504845 857.396326 277.57286 859.144623 270.313269 860.991676 264.022321 862.858846 258.574818 863.763607 255.935159 865.906573 250.340111 866.16406 249.467349L880.890349 199.551892 833.062903 220.069003C832.106692 220.4792 830.618069 221.105284 827.426684 222.449508 824.667648 223.619034 822.310677 224.645978 819.868514 225.755191 813.291441 228.742455 807.049466 231.909062 800.697749 235.587155 784.089623 245.204435 768.486253 257.343104 753.86285 272.966404 727.630498 300.992437 706.526618 338.233645 691.78157 386.286769 675.041103 440.842839 671.516484 484.53994 673.004574 548.060166 673.477918 568.265231 673.463923 573.802417 672.83965 577.675785 673.779618 571.843661 684.455526 562.321801 696.104608 566.804324 693.056849 565.631558 685.695898 556.987172 676.314007 534.631661 660.550914 497.07079 646.834249 435.829728 636.817284 346.649532 625.445924 245.411232 630.103925 161.271948 644.646978 94.661372 647.677924 80.778935 650.899934 68.917565 654.086773 59.095391 655.91465 53.461684 657.254607 49.905343 657.880284 48.445615L678.645286 0 628.243642 15.421969C617.409833 18.736913 599.94569 26.47761 578.105438 40.154777 542.547644 62.422374 507.199569 93.614964 474.400401 135.163224 447.596676 169.116772 423.611383 208.69939 403.118547 254.298381 378.907516 308.170805 363.003277 353.201056 353.158029 392.761538 349.274261 408.367415 346.433259 422.676373 344.1945 437.074844 343.334411 442.60647 342.592734 447.936766 341.804612 454.088156 341.502524 456.446003 340.356619 465.670449 340.073506 467.854496 337.596047 486.966707 335.848224 491.64663 329.235273 497.687132 336.081933 491.433152 343.232634 491.901773 346.608002 493.913244 344.852318 492.866987 341.598345 489.506349 337.991853 484.112851 327.030897 467.720774 317.980358 441.116838 313.690598 406.660405 311.250185 387.058402 310.203772 356.91373 310.370048 319.454675 310.480474 294.577862 311.113088 267.877521 312.099068 241.022112 312.481453 230.606987 312.891081 220.894534 313.30045 212.150825 313.545346 206.920081 313.735044 203.186895 313.84201 201.216597L317.55517 132.820512 271.360516 183.395861C270.467691 184.373355 268.852992 186.162958 266.618705 188.673705 262.927895 192.821195 258.823678 197.506249 254.407949 202.638531 241.78797 217.306394 229.164348 232.659575 217.341267 247.995964 211.724185 255.282197 206.411389 262.408655 201.450577 269.336162 176.017063 304.852695 156.617347 340.597472 138.122768 383.844503 90.841957 494.404188 76.97672 596.351294 99.261816 707.865107 126.80821 845.706261 188.553235 933.644222 278.8297 980.690336 344.19104 1014.752337 408.837235 1024 507.940695 1024 525.713007 1024 557.977207 1021.567138 590.857378 1016.462159 641.152493 1008.653331 687.496192 995.789323 726.063273 976.591044 738.155853 970.571488 743.07901 955.888702 737.059454 943.796122 731.039898 931.703543 716.357111 926.780384 704.264531 932.79994 670.855859 949.430419 629.092954 961.022897 583.352478 968.12457 552.984316 972.839535 523.228215 975.083275 507.940695 975.083275 416.16215 975.083275 357.934257 966.753754 301.436271 937.310746 224.830174 897.388723 171.977796 822.11577 147.230072 698.279055 126.99711 597.034048 139.514783 504.995189 183.099329 403.078716 200.282663 362.89785 218.020237 330.215642 241.22153 297.816282 245.831691 291.378441 250.802959 284.710101 256.082244 277.862039 267.31885 263.286404 279.402035 248.590513 291.488864 234.542319 298.732051 226.123757 304.338773 219.823287 307.478705 216.385594L264.997214 198.564858C264.883874 200.652555 264.688038 204.506489 264.43725 209.86312 264.020474 218.765035 263.603959 228.640719 263.215279 239.227375 262.21142 266.569788 261.566827 293.775586 261.453805 319.237542 261.278897 358.641182 262.385015 390.50582 265.148621 412.703791 276.058157 500.331917 322.627019 569.975503 362.226031 533.804382 379.341732 518.170302 384.756649 503.671477 388.584361 474.142814 397.932742 402.025286 407.332926 364.253175 447.736538 274.35034 466.587287 232.405182 488.484326 196.268782 512.795234 165.473004 542.034492 128.434251 573.156162 100.971215 604.068111 81.613016 614.696751 74.956971 624.472062 69.798572 633.124687 65.963437 638.02329 63.792212 641.258688 62.595009 642.556233 62.197984L612.91959 29.174337C608.658554 39.115516 602.686705 57.521384 596.856038 84.227201 581.186705 155.996406 576.231674 245.501015 588.206246 352.109655 607.295279 522.057739 638.819345 597.17443 678.537329 612.457766 701.302332 621.217655 717.731637 606.564331 721.133156 585.4593 722.475759 577.129001 722.489387 571.736597 721.907881 546.914509 720.532565 488.208147 723.691247 449.047827 738.546223 400.63645 751.151827 359.55562 768.544047 328.864237 789.576147 306.394033 809.230566 285.39571 821.725461 278.160284 852.347733 265.023883L842.705318 242.546443 819.246577 235.625536C822.235501 225.494436 813.450321 251.12537 809.839253 266.119881 790.647573 345.810953 796.611315 445.8865 844.8591 562.501668 883.105728 654.943983 874.587669 769.935076 824.002925 834.602871 815.680378 845.242455 817.558709 860.6143 828.198295 868.936847 838.837879 877.259392 854.209724 875.38106 862.532269 864.741476 924.762731 785.185737 934.658528 651.595637 890.059904 543.80051Z\"  ></path></symbol><symbol id=\"icon-data\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 625.686419 1024 733.786972 986.820171 822.292028 919.295213 832.066406 911.83785 833.944717 897.868762 826.487354 888.094383 819.029988 878.320004 805.0609 876.441692 795.286522 883.899057 714.473916 945.555057 615.842022 979.478261 512 979.478261 253.818886 979.478261 44.521739 770.181114 44.521739 512 44.521739 253.818886 253.818886 44.521739 512 44.521739 770.181114 44.521739 979.478261 253.818886 979.478261 512 979.478261 599.047373 955.670714 682.541024 911.318368 755.201306 904.912864 765.695127 908.227102 779.394737 918.720924 785.800239 929.214746 792.205743 942.914355 788.891505 949.319857 778.397683 997.906701 698.800235 1024 607.290394 1024 512Z\"  ></path><path d=\"M368.901888 475.575945 338.700849 478.186135 563.838502 653.907211 581.396516 667.61133 595.091066 650.045847 840.321161 335.498406C847.880329 325.802545 846.148198 311.814579 836.452335 304.255411 826.756474 296.696243 812.768508 298.428375 805.20934 308.124237L559.979243 622.671678 591.231806 618.810315 366.094153 443.089239 349.780358 430.356241 335.893114 445.699433 176.846524 621.420518C168.596353 630.535639 169.297534 644.61299 178.412655 652.863162 187.527777 661.113333 201.605128 660.412151 209.855299 651.29703L368.901888 475.575945Z\"  ></path></symbol><symbol id=\"icon-trade\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 625.686419 1024 733.786972 986.820171 822.292028 919.295213 832.066406 911.83785 833.944717 897.868762 826.487354 888.094383 819.029988 878.320004 805.0609 876.441692 795.286522 883.899057 714.473916 945.555057 615.842022 979.478261 512 979.478261 253.818886 979.478261 44.521739 770.181114 44.521739 512 44.521739 253.818886 253.818886 44.521739 512 44.521739 770.181114 44.521739 979.478261 253.818886 979.478261 512 979.478261 599.047373 955.670714 682.541024 911.318368 755.201306 904.912864 765.695127 908.227102 779.394737 918.720924 785.800239 929.214746 792.205743 942.914355 788.891505 949.319857 778.397683 997.906701 698.800235 1024 607.290394 1024 512Z\"  ></path><path d=\"M551.801933 843.859904C551.801933 843.859904 551.910146 860.977865 529.538995 860.977865 507.167844 860.977865 503.178743 843.859904 503.178743 843.859904L503.178743 766.939614C414.434338 757.374349 357.575004 715.792638 332.599034 642.193237 332.599034 642.193237 321.314219 616.817284 346.988612 607.420567 372.663008 598.023853 386.403381 621.070048 386.403381 621.070048 407.128124 677.133131 446.052855 707.555531 503.178743 712.338163L503.178743 527.410628C441.270221 512.531326 401.083426 493.135386 382.61715 469.222223 364.150874 445.309058 354.917875 418.739277 354.917875 389.512077 354.917875 312.458551 404.33767 265.695735 503.178743 249.222223L503.178743 183.461353C503.178743 183.461353 508.270528 165.816358 526.337227 165.816358 544.403925 165.816358 551.801933 183.461353 551.801933 183.461353L551.801933 249.222223C630.183966 256.130468 681.596497 291.202581 706.041062 354.439614 706.041062 354.439614 706.041062 374.760719 686.661534 380.219202 667.282005 385.677687 651.838163 371.975846 651.838163 371.975846 637.224565 328.666449 603.879488 305.285041 551.801933 301.830918L551.801933 472.410628C661.536781 492.072561 716.403381 541.492358 716.403381 620.671497 716.403381 654.681329 703.915584 686.232947 678.939614 715.327294 653.963644 744.421643 611.584841 761.625577 551.801933 766.939614L551.801933 843.859904ZM503.178743 301.830918C475.811458 303.956533 453.957811 312.326014 437.61715 326.939614 421.276489 341.553214 413.106281 360.019213 413.106281 382.338163 413.106281 426.178963 443.130135 453.811537 503.178743 465.236715L503.178743 301.830918ZM551.801933 712.338163C584.217553 711.009655 609.525271 702.108779 627.725845 685.635266 645.926419 669.161754 655.026571 649.367266 655.026571 626.251209 655.026571 577.096373 620.618701 547.736764 551.801933 538.171497L551.801933 712.338163Z\"  ></path></symbol><symbol id=\"icon-onepage48\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0C229.25 0 0 229.25 0 512c0 155.458333 69.25 294.658333 178.625 388.608333l-55.9375 96.833333 0 0.0625c-1.854167 2.6875-2.879167 6.016667-2.879167 9.470833 0 9.345833 7.4875 16.833333 16.704167 17.025l0.704167 0 374.783333 0c282.754167 0 512-229.25 512-512S794.754167 0 512 0zM297.216667 639.683333c-7.425 0-14.270833-3.904167-17.983333-10.304167-2.75-4.8625-3.520833-10.495833-2.05-15.870833 1.470833-5.3125 4.8625-9.729167 9.6625-12.479167l180.416667-104.191667c9.5375-5.566667 22.85-1.983333 28.2875 7.616667 2.75 4.8 3.520833 10.366667 2.1125 15.679167-1.408333 5.375-4.8625 9.854167-9.6625 12.608333l-180.416667 104.129167C304.45 638.720833 300.866667 639.683333 297.216667 639.683333zM353.408333 737.025c-7.425 0-14.270833-3.904167-17.983333-10.304167-5.695833-9.920833-2.304167-22.720833 7.616667-28.416667l180.479167-104.129167c9.5375-5.633333 22.720833-2.05 28.2875 7.55 2.816667 4.8 3.520833 10.433333 2.1125 15.808333-1.470833 5.3125-4.8625 9.791667-9.729167 12.545833l-180.354167 104.191667C360.641667 736.066667 357.058333 737.025 353.408333 737.025zM877.825 567.295833l-457.920833 264.258333c-3.1375 1.854167-6.720833 2.75-10.304167 2.75-7.425 0-14.270833-3.904167-17.983333-10.304167-2.75-4.8-3.520833-10.433333-2.1125-15.808333 1.408333-5.3125 4.8625-9.791667 9.6625-12.545833l428.545833-247.4875c6.975-4.033333 11.904167-10.433333 13.8875-18.1125 2.1125-7.679167 1.025-15.679167-2.945833-22.591667l-117.954167-204.416667c-5.375-9.216667-15.295833-14.9125-25.920833-14.9125-5.183333 0-10.366667 1.345833-14.85 3.966667L251.329167 539.520833c-9.470833 5.566667-22.85 1.983333-28.2875-7.616667-2.75-4.8-3.520833-10.366667-2.1125-15.679167 1.470833-5.3125 4.929167-9.791667 9.729167-12.545833l181.566667-105.345833c5.25-3.966667 6.85-10.945833 3.583333-16.575-0.833333-1.470833-1.920833-2.6875-3.329167-3.7125l-0.641667-0.383333-117.375-67.775c-4.545833-2.625-9.729167-3.966667-14.9125-3.966667-10.625 0-20.545833 5.695833-25.854167 14.9125l-2.558333 4.35-0.0625-0.0625-84.354167 146.241667c-5.504167 9.470833-18.75 13.054167-28.35 7.55-4.7375-2.75-8.191667-7.233333-9.6625-12.545833-1.408333-5.375-0.641667-11.008333 2.1125-15.808333l104.129167-180.416667c1.5375-2.495833 3.520833-4.670833 6.079167-6.4625 0-0.254167 0.254167-0.5125 0.575-0.833333 9.15-8.704167 21.8875-12.095833 34.175-9.216667 3.583333 0.833333 6.975 1.6625 10.175 3.454167l170.495833 98.433333 0.254167-0.320833 2.816667 1.345833c8 3.775 16.833333 3.904167 24.766667 0.320833l2.945833-1.345833 201.216667-116.158333c3.2-1.854167 6.654167-2.625 9.6-3.329167 3.454167-0.833333 6.4625-1.216667 9.345833-1.216667 9.408333 0 18.433333 3.65 25.345833 10.241667 2.625 2.495833 5.25 4.8625 7.104167 8.0625l151.745833 262.783333c1.983333 3.391667 2.6875 6.975 3.454167 10.175 2.879167 12.225-0.5125 25.025-9.0875 34.1125C883.266667 562.883333 881.025 565.379167 877.825 567.295833z\"  ></path></symbol><symbol id=\"icon-signboard\" viewBox=\"0 0 1024 1024\"><path d=\"M127.905952 837.407788c-42.886113 0-76.743571-33.857458-76.743571-75.238795V191.858927h844.931667c42.133725 0 76.743571 33.857458 76.743571 75.238795V759.91183c0 13.542983 11.285819 24.828802 25.581191 24.828802s25.58119-11.285819 25.58119-24.828802V267.097722c0-69.219691-57.181484-125.648788-127.905952-125.648787H0V761.416605c0 69.219691 57.181484 125.648788 127.905952 125.648788h783.235855c14.295371 0 25.58119-11.285819 25.581191-24.828802 0-13.542983-11.285819-24.828802-25.581191-24.828803H127.905952z\"  ></path><path d=\"M889.322557 469.490081H134.677443V277.631154h754.645114v191.858927zM188.096988 416.070536h647.806024V331.050698H188.096988v85.019838z\"  ></path></symbol><symbol id=\"icon-shuffling-banner\" viewBox=\"0 0 1024 1024\"><path d=\"M127.905952 834.398237c-42.886113 0-76.743571-33.857458-76.743571-75.238795V188.849375h844.931667c42.133725 0 76.743571 33.857458 76.743571 75.238795v492.814108c0 13.542983 11.285819 24.828802 25.581191 24.828802s25.58119-11.285819 25.58119-24.828802V264.08817c0-69.219691-57.181484-125.648788-127.905952-125.648787H0V758.407054c0 69.219691 57.181484 125.648788 127.905952 125.648787h783.235855c14.295371 0 25.58119-11.285819 25.581191-24.828802 0-13.542983-11.285819-24.828802-25.581191-24.828802H127.905952z\"  ></path><path d=\"M564.290963 682.415871c19.562087 0 34.609846 15.800147 34.609845 34.609845 0 19.562087-15.800147 34.609846-34.609845 34.609846-19.562087 0-34.609846-15.800147-34.609846-34.609846s15.047759-34.609846 34.609846-34.609845z\"  ></path><path d=\"M457.451874 717.778104m-34.609846 0a34.609846 34.609846 0 1 0 69.219691 0 34.609846 34.609846 0 1 0-69.219691 0Z\"  ></path><path d=\"M351.365173 717.778104m-34.609846 0a34.609846 34.609846 0 1 0 69.219691 0 34.609846 34.609846 0 1 0-69.219691 0Z\"  ></path><path d=\"M672.634827 682.415871c19.562087 0 34.609846 15.800147 34.609846 34.609845 0 19.562087-15.800147 34.609846-34.609846 34.609846-19.562087 0-34.609846-15.800147-34.609845-34.609846-0.752388-18.809699 15.047759-34.609846 34.609845-34.609845z\"  ></path></symbol><symbol id=\"icon-component\" viewBox=\"0 0 1024 1024\"><path d=\"M632.404396 789.192674H330.830769c-16.504029 0-32.257875-6.001465-44.260806-18.004396-12.00293-12.00293-18.754579-27.006593-18.754578-44.260805l0.750183-72.767766c3.000733-13.503297 9.752381-24.756044 19.504762-31.507692 12.753114-9.752381 30.007326-9.752381 48.761904 1.500366l4.501099 2.250549 5.251282 1.500367c15.753846 7.501832 30.757509 6.751648 44.260806 1.500366 6.751648-3.000733 12.753114-6.751648 18.004396-12.00293 5.251282-5.251282 9.002198-11.252747 12.00293-18.004396 3.000733-6.751648 4.501099-13.503297 4.501099-21.755311 0-8.252015-1.500366-15.003663-4.501099-21.755312-3.000733-6.751648-6.751648-12.753114-12.00293-18.004395-6.001465-5.251282-11.252747-9.752381-18.754579-12.002931-13.503297-6.001465-28.50696-6.001465-44.260806 0.750183l-5.251282 2.25055c-5.251282 2.250549-10.502564 5.251282-15.003663 7.501831-6.751648 3.000733-13.503297 4.501099-19.504762 4.501099h-4.501099c-10.502564-0.750183-19.504762-6.751648-25.506227-15.753846-5.251282-7.501832-7.501832-16.504029-8.252014-30.007326v-65.265934c0-17.254212 6.751648-32.257875 18.754578-44.260806 12.00293-12.00293 27.756777-18.754579 44.260806-18.754579h57.01392c-3.750916-11.252747-6.001465-24.005861-6.001466-36.758974 0-16.504029 3.000733-32.257875 9.752381-46.511355 6.001465-14.25348 15.003663-27.006593 25.506228-37.509158s23.255678-18.754579 37.509157-25.506227c28.50696-12.753114 63.015385-12.753114 92.272527 0 14.25348 6.001465 27.006593 15.003663 37.509158 25.506227s18.754579 23.255678 25.506227 37.509158c6.001465 14.25348 9.752381 30.007326 9.752381 46.511355 0 12.753114-2.250549 24.756044-6.001465 36.758974h19.504762c17.254212 0 32.257875 6.751648 44.260806 18.754579 12.00293 12.00293 18.004396 27.756777 18.004395 44.260806v42.010256c26.25641-9.752381 57.013919-9.002198 83.27033 2.25055 14.25348 6.001465 26.25641 14.25348 36.758974 24.756044 10.502564 10.502564 18.754579 23.255678 24.756044 36.758974 6.001465 14.25348 9.002198 29.257143 9.002198 45.010989s-3.000733 31.507692-9.002198 45.761172c-6.001465 13.503297-14.25348 26.25641-24.756044 36.758975-10.502564 10.502564-23.255678 18.754579-36.758974 24.756044-26.25641 11.252747-57.013919 12.00293-83.27033 2.250549v36.758975c0 17.254212-6.001465 32.257875-18.004395 44.260805-12.753114 11.252747-28.50696 18.004396-45.010989 18.004396zM313.576557 662.411722v63.765567c0 4.501099 1.500366 8.252015 5.251282 12.002931 3.750916 3.750916 7.501832 5.251282 12.753113 5.251282h300.823444c5.251282 0 8.252015-1.500366 12.00293-5.251282 3.750916-3.750916 5.251282-6.751648 5.251282-12.002931V600.896703l37.509158 32.257876c6.001465 5.251282 13.503297 9.752381 21.755311 12.753113 15.753846 6.751648 35.258608 6.001465 51.762637-0.750183 9.002198-3.750916 16.504029-9.002198 22.505495-15.003663 6.751648-6.751648 12.00293-14.25348 15.753846-22.505494s5.251282-17.254212 5.251282-27.006594c0-9.752381-1.500366-18.754579-5.251282-27.006593-3.750916-9.002198-9.002198-16.504029-15.003663-22.505495-6.751648-6.751648-14.25348-11.252747-22.505495-15.003663-16.504029-6.751648-36.008791-7.501832-51.762637-0.750183-8.252015 3.000733-15.753846 7.501832-21.755311 12.753114l-37.509158 31.507692V429.104762c0-5.251282-1.500366-9.002198-5.251282-12.753114-3.750916-3.750916-6.751648-5.251282-12.00293-5.251282H525.128205l32.257876-37.509157c10.502564-12.753114 15.753846-27.006593 15.753846-44.260806 0-10.502564-2.250549-19.504762-6.001465-28.50696-3.750916-9.002198-9.002198-16.504029-15.753847-23.255677-6.751648-6.751648-14.25348-12.00293-23.255677-15.753847-17.254212-7.501832-38.259341-7.501832-55.513553 0-9.002198 3.750916-16.504029 9.002198-23.255678 15.753847-6.751648 6.751648-12.00293 14.25348-15.753846 23.255677-3.750916 9.002198-6.001465 18.004396-6.001465 28.50696 0 9.002198 1.500366 16.504029 4.501099 24.005861 3.000733 7.501832 6.751648 15.003663 12.00293 21.005128l29.257143 36.758974h-142.534799c-5.251282 0-9.002198 1.500366-12.00293 5.251282-3.750916 3.750916-5.251282 7.501832-5.251282 12.002931v63.015384c2.250549-1.500366 5.251282-2.250549 7.501831-3.750915 2.250549-0.750183 5.251282-2.250549 9.002198-3.750916 22.505495-10.502564 54.013187-10.502564 78.019048 0 12.00293 5.251282 23.255678 12.753114 32.257875 21.755311 9.002198 9.002198 16.504029 20.254945 21.755312 32.257876 5.251282 12.00293 8.252015 25.506227 8.252014 39.759707s-3.000733 27.756777-8.252014 39.759707c-5.251282 12.00293-12.753114 22.505495-21.755312 31.507692-9.002198 9.002198-20.254945 16.504029-32.257875 21.755311-24.756044 10.502564-53.263004 11.252747-80.269597-1.500366-3.750916-1.500366-8.252015-3.750916-14.25348-6.751648z\"  ></path><path d=\"M1021.749451 513.875458c0-282.068864-228.805861-510.124542-510.124543-510.124542-282.068864 0-510.124542 228.055678-510.124542 510.124542s228.805861 510.124542 510.124542 510.124542c115.528205 0 221.304029-39.759707 307.575092-104.275458 3.750916-3.750916 6.001465-9.002198 6.001465-15.003663 0-12.753114-9.752381-22.505495-22.505494-22.505494-6.751648 0-12.00293 2.250549-16.50403 6.751648-76.518681 56.263736-171.041758 90.021978-273.066666 90.021978-255.062271 0-462.112821-207.050549-462.112821-462.112821S258.063004 54.76337 513.125275 54.76337 975.238095 261.813919 975.238095 516.87619c0 78.019048-18.004396 151.536996-52.51282 216.052748v0.750183c-0.750183 2.250549-1.500366 4.501099-1.500367 6.751648 0 12.753114 10.502564 22.505495 22.505495 22.505495 9.752381 0 18.004396-6.001465 21.005128-15.003663 35.258608-70.517216 57.013919-150.03663 57.01392-234.057143z\"  ></path></symbol><symbol id=\"icon-component-filling\" viewBox=\"0 0 1024 1024\"><path d=\"M511.249268 510.873074m-510.873074 0a510.873074 510.873074 0 1 0 1021.746148 0 510.873074 510.873074 0 1 0-1021.746148 0Z\"  ></path><path d=\"M632.957265 786.594277H330.941124c-16.528247 0-32.305209-6.010271-44.325752-18.030814-12.020543-12.020543-18.782098-27.046222-18.782098-44.325752l0.751284-72.874542c3.005136-13.523111 9.766691-24.79237 19.533382-31.553925 12.771827-9.766691 30.051357-9.766691 48.833456 1.502568l4.507703 2.253852 5.258988 1.502568c15.776963 7.512839 30.802641 6.761555 44.325752 1.502568 6.761555-3.005136 12.771827-6.761555 18.030814-12.020543 5.258988-5.258988 9.015407-11.269259 12.020543-18.030815 3.005136-6.761555 4.507704-13.523111 4.507704-21.787234 0-8.264123-1.502568-15.025679-4.507704-21.787234-3.005136-6.761555-6.761555-12.771827-12.020543-18.030814-5.258988-5.258988-11.269259-9.015407-18.030814-12.020543-13.523111-6.010271-28.548789-6.010271-44.325752 0.751284l-5.258988 2.253852c-5.258988 2.253852-10.517975 5.258988-15.025678 7.512839-6.761555 3.005136-13.523111 4.507704-19.533383 4.507704h-4.507703c-10.517975-0.751284-19.533382-6.761555-25.543654-15.776963-5.258988-7.512839-7.512839-16.528247-8.264123-30.051357v-65.361702c0-17.27953 6.761555-32.305209 18.782098-44.325752 12.020543-12.020543 27.797506-18.782098 44.325752-18.782099h57.097579c-3.75642-11.269259-6.010271-24.041086-6.010271-36.812912 0-16.528247 3.005136-32.305209 9.766691-46.579604 6.010271-14.274395 15.025679-27.046222 25.543653-37.564197s23.289802-18.782098 37.564197-25.543654c28.548789-12.771827 63.10785-12.771827 92.407924 0 14.274395 6.010271 27.046222 15.025679 37.564196 25.543654s18.782098 23.289802 25.543654 37.564197c6.010271 14.274395 9.766691 30.051357 9.766691 46.579604 0 12.771827-2.253852 24.79237-6.010271 36.812912h19.533382c17.27953 0 32.305209 6.761555 44.325752 18.782099 12.020543 12.020543 18.030814 27.797506 18.030814 44.325752v42.0719c26.294938-9.766691 57.097579-9.015407 83.392517 2.253852 14.274395 6.010271 26.294938 14.274395 36.812913 24.792369 10.517975 10.517975 18.782098 23.289802 24.792369 36.812913 6.010271 14.274395 9.015407 29.300073 9.015408 45.077036s-3.005136 31.553925-9.015408 45.82832c-6.010271 13.523111-14.274395 26.294938-24.792369 36.812913-10.517975 10.517975-23.289802 18.782098-36.812913 24.792369-26.294938 11.269259-57.097579 12.020543-83.392517 2.253852v36.812913c0 17.27953-6.010271 32.305209-18.030814 44.325752-13.523111 12.020543-29.300073 18.030814-45.82832 18.030814zM313.661594 660.378577v63.859134c0 4.507704 1.502568 8.264123 5.258987 12.020543 3.75642 3.75642 7.512839 5.258988 12.771827 5.258987h301.264857c5.258988 0 8.264123-1.502568 12.020543-5.258987 3.75642-3.75642 5.258988-6.761555 5.258988-12.020543V598.773294l37.564196 32.305209c6.010271 5.258988 13.523111 9.766691 21.787234 12.771827 15.776963 6.761555 35.310345 6.010271 51.838592-0.751284 9.015407-3.75642 16.528247-9.015407 22.538518-15.025678 6.761555-6.761555 12.020543-14.274395 15.776962-22.538518s5.258988-17.27953 5.258988-27.046222c0-9.766691-1.502568-18.782098-5.258988-27.046222-3.75642-9.015407-9.015407-16.528247-15.025678-22.538518-6.761555-6.761555-14.274395-11.269259-22.538518-15.025678-16.528247-6.761555-36.061629-7.512839-51.838592-0.751284-8.264123 3.005136-15.776963 7.512839-21.787234 12.771827l-37.564196 31.553925V426.729274c0-5.258988-1.502568-9.015407-5.258988-12.771827-3.75642-3.75642-6.761555-5.258988-12.020543-5.258988H525.523663l32.305209-37.564196c10.517975-12.771827 15.776963-27.046222 15.776962-44.325752 0-10.517975-2.253852-19.533382-6.010271-28.54879-3.75642-9.015407-9.015407-16.528247-15.776963-23.289802-6.761555-6.761555-14.274395-12.020543-23.289801-15.776962-17.27953-7.512839-38.315481-7.512839-55.595011 0-9.015407 3.75642-16.528247 9.015407-23.289802 15.776962-6.761555 6.761555-12.020543 14.274395-15.776963 23.289802-3.75642 9.015407-6.010271 18.030814-6.010271 28.54879 0 9.015407 1.502568 16.528247 4.507703 24.041085 3.005136 7.512839 6.761555 15.025679 12.020543 21.035951l29.300073 36.812912h-142.743947c-5.258988 0-9.015407 1.502568-12.020543 5.258988-3.75642 3.75642-5.258988 7.512839-5.258987 12.020543v63.10785c2.253852-1.502568 5.258988-2.253852 7.512839-3.75642 2.253852-0.751284 5.258988-2.253852 9.015407-3.756419 22.538518-10.517975 54.092443-10.517975 78.133529 0 12.020543 5.258988 23.289802 12.771827 32.305209 21.787234 9.015407 9.015407 16.528247 20.284666 21.787234 32.305209 5.258988 12.020543 8.264123 25.543654 8.264124 39.818048s-3.005136 27.797506-8.264124 39.818049c-5.258988 12.020543-12.771827 22.538518-21.787234 31.553925-9.015407 9.015407-20.284666 16.528247-32.305209 21.787234-24.79237 10.517975-53.341159 11.269259-80.38738-1.502568-3.75642-1.502568-9.015407-3.75642-14.274395-6.761555z\"  ></path></symbol><symbol id=\"icon-color\" viewBox=\"0 0 1026 1024\"><path d=\"M811.984589 328.552129c-57.139501 0-101.497797 44.358297-101.497798 101.497798s44.358297 101.497797 101.497798 101.497797 101.497797-44.358297 101.497797-101.497797c0.751836-57.139501-44.358297-101.497797-101.497797-101.497798z m0 163.900147c-35.33627 0-62.402349-27.066079-62.40235-62.402349 0-35.33627 27.066079-62.402349 62.40235-62.40235 35.33627 0 62.402349 27.066079 62.402349 62.40235 0 35.33627-26.314244 62.402349-62.402349 62.402349zM211.267995 328.552129c-57.139501 0-101.497797 44.358297-101.497797 101.497798s44.358297 101.497797 101.497797 101.497797 101.497797-44.358297 101.497798-101.497797-44.358297-101.497797-101.497798-101.497798z m0 163.900147c-35.33627 0-62.402349-27.066079-62.402349-62.402349 0-35.33627 27.066079-62.402349 62.402349-62.40235 35.33627 0 62.402349 27.066079 62.40235 62.40235 0 35.33627-27.066079 62.402349-62.40235 62.402349zM750.334075 211.265786c0-57.139501-44.358297-101.497797-101.497798-101.497798s-101.497797 44.358297-101.497797 101.497798 44.358297 101.497797 101.497797 101.497797c56.387665 0 101.497797-44.358297 101.497798-101.497797z m-102.249633 62.402349c-35.33627 0-62.402349-27.066079-62.40235-62.402349 0-35.33627 27.066079-62.402349 62.40235-62.40235s62.402349 27.066079 62.402349 62.40235c0 35.33627-26.314244 62.402349-62.402349 62.402349zM375.168142 109.767988c-57.139501 0-101.497797 44.358297-101.497797 101.497798s44.358297 101.497797 101.497797 101.497797S476.665939 268.405286 476.665939 211.265786s-44.358297-101.497797-101.497797-101.497798z m0 163.900147c-35.33627 0-62.402349-27.066079-62.402349-62.402349 0-35.33627 27.066079-62.402349 62.402349-62.40235 35.33627 0 62.402349 27.066079 62.40235 62.40235 0 35.33627-27.066079 62.402349-62.40235 62.402349z\"  ></path><path d=\"M272.166674 921.750367l62.402349 27.817915c54.883994 22.555066 115.030837 34.584435 177.433187 34.584435 35.33627 0 62.402349-27.066079 62.402349-62.40235 0-15.788546-6.014684-30.073421-15.788546-40.599119-18.044053-18.044053-27.817915-42.10279-27.817915-68.417034 0-57.139501 44.358297-101.497797 101.497797-101.497797h98.490456c139.84141 0 253.368576-113.527166 253.368575-253.368576 0-230.061674-212.017621-417.268722-472.152716-417.268722C251.115279 39.847283 39.849493 251.864905 39.849493 512c0 124.052863 43.606461 231.565345 121.797357 316.522761 3.759178 15.036711-3.007342 25.562408-16.540382 26.314243-9.022026 0.751836-18.795888-8.270191-18.795888-8.27019l-4.511014-3.759178c-4.511013-5.262849-8.270191-9.773862-12.781204-15.036711-67.665198-87.212922-109.016153-196.98091-109.016152-315.770925 0-281.938326 229.309838-511.248164 511.248164-511.248164s511.248164 205.251101 511.248165 457.116005c0 161.64464-131.571219 293.215859-293.215859 293.215859H632.295895c-35.33627 0-62.402349 27.066079-62.402349 62.40235 0 15.788546 6.014684 30.073421 15.788546 40.599119 18.044053 18.044053 27.817915 42.10279 27.817915 68.417034 0 57.139501-44.358297 101.497797-101.497797 101.497797-93.227606 0-180.440529-24.810573-255.624083-68.417034-0.751836-0.751836-17.292217-28.56975 15.788547-33.832599z\"  ></path></symbol><symbol id=\"icon-color-filling\" viewBox=\"0 0 1024 1024\"><path d=\"M21.333333 512c0 270.592 219.925333 490.666667 490.304 490.666667 54.784 0 97.344-42.581333 97.344-97.408 0-25.258667-9.365333-48.341333-26.688-65.664-10.090667-10.112-15.125333-23.829333-15.125333-38.976 0-33.92 25.941333-59.882667 59.84-59.882667h94.442667C876.48 740.736 1002.666667 614.464 1002.666667 459.328 1002.666667 217.6 782.762667 21.333333 511.637333 21.333333 241.258667 21.333333 21.333333 241.408 21.333333 512z m202.666667 21.333333a53.333333 53.333333 0 1 0 0-106.666666 53.333333 53.333333 0 0 0 0 106.666666z m0 42.666667a96 96 0 1 1 0-192 96 96 0 0 1 0 192z m149.333333-256a53.333333 53.333333 0 1 0 0-106.666667 53.333333 53.333333 0 0 0 0 106.666667z m0 42.666667a96 96 0 1 1 0-192 96 96 0 0 1 0 192z m277.333334-42.666667a53.333333 53.333333 0 1 0 0-106.666667 53.333333 53.333333 0 0 0 0 106.666667z m0 42.666667a96 96 0 1 1 0-192 96 96 0 0 1 0 192z m149.333333 170.666666a53.333333 53.333333 0 1 0 0-106.666666 53.333333 53.333333 0 0 0 0 106.666666z m0 42.666667a96 96 0 1 1 0-192 96 96 0 0 1 0 192z\"  ></path></symbol><symbol id=\"icon-favorites\" viewBox=\"0 0 1143 1024\"><path d=\"M840.870698 8.239628c-80.634047 0-153.790512 31.672558-207.967256 83.134512a24.957023 24.957023 0 0 0-9.287442 19.33693 25.099907 25.099907 0 0 0 42.984186 17.598511l0.047628 0.023814c45.246512-43.341395 106.61507-69.989209 174.222884-69.989209 139.240186 0 252.094512 112.87814 252.094511 252.094512 0 67.631628-26.671628 128.952558-69.989209 174.246697l-451.322047 451.750698-451.560186-451.750698a251.165767 251.165767 0 0 1-70.013023-174.246697C50.080744 171.222326 162.958884 58.344186 302.19907 58.344186c66.917209 0 127.690419 26.171535 172.841674 68.72707l150.599442 150.456558a24.909395 24.909395 0 0 0 35.244651-35.244651l-149.14679-149.265861 0.119069-0.095255A301.127442 301.127442 0 0 0 302.19907 8.239628C135.263256 8.239628 0 143.550512 0 310.438698c0 81.443721 32.267907 155.314605 84.658605 209.658046l486.995348 486.828651 487.042977-487.138232A301.103628 301.103628 0 0 0 1143.069767 310.462512C1143.069767 143.526698 1007.782698 8.239628 840.870698 8.239628\"  ></path></symbol><symbol id=\"icon-pic-filling\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 506.453333v452.288H120.469333A120.533333 120.533333 0 0 1 0 838.208V85.333333h903.530667A120.597333 120.597333 0 0 1 1024 205.994667v225.216L691.413333 681.493333l-244.010666-152.533333-257.877334 257.92a30.122667 30.122667 0 0 0 42.602667 42.581333l224-224 237.866667 148.650667L1024 506.453333z m-798.122667-59.712a105.408 105.408 0 1 0 0-210.816 105.408 105.408 0 0 0 0 210.816z m0-60.224a45.184 45.184 0 1 0 0-90.368 45.184 45.184 0 0 0 0 90.368z\"  ></path></symbol><symbol id=\"icon-RFQ\" viewBox=\"0 0 1024 1024\"><path d=\"M929.375 193.336l-4.875-1.333c-269.75-73.542-555-73.583-825 0l-4.875 1.333C38.917 208.544 0 259.461 0 317.211v389.583c0 57.75 38.917 108.667 94.625 123.875l4.875 1.333c134.958 36.792 273.708 55.167 412.542 55.167 138.75 0 277.542-18.375 412.417-55.167l4.917-1.333c11.375-3.083 18.083-14.792 15-26.167-3.083-11.333-14.583-17.958-26.167-15l-4.958 1.333c-262.417 71.583-539.917 71.583-802.5 0l-4.875-1.333c-37.208-10.167-63.208-44.167-63.208-82.708V317.211c0-38.542 26-72.542 63.208-82.708l4.875-1.333c262.5-71.583 540.042-71.583 802.542 0l4.875 1.333c37.208 10.125 63.167 44.167 63.167 82.708v389.583c0 11.792 9.542 21.333 21.333 21.333 11.792 0 21.333-9.542 21.333-21.333V317.211c-0.001-57.75-38.918-108.667-94.626-123.875z\"  ></path><path d=\"M444.797 548.427H553.51c17 78.539 87.01 137.594 170.552 137.594 8.87 0 17.562-0.659 26.073-1.945V612.94a105.63 105.63 0 0 1-26.073 3.258c-57.823 0-104.703-46.883-104.703-104.706 0-57.846 46.88-104.732 104.703-104.732 57.849 0 104.734 46.885 104.734 104.732 0 8.992-1.141 17.708-3.286 26.044h71.135a173.161 173.161 0 0 0 1.948-26.044c0-96.245-78.281-174.526-174.531-174.526-44.833 0-85.766 17.008-116.708 44.898v-44.909H374.99v325.193L290.823 556.18c35.823-19.214 60.188-57.008 60.188-100.505v-2.326c0-64.245-52.068-116.331-116.312-116.352l-135.819-0.041V686.01h69.812V569.659h47.255l83.635 116.357h94.354v-0.005h50.859V548.427z m0-141.659h139.75c-16.818 22.349-28.396 48.849-32.901 77.664H444.797v-77.664z m-163.932 52.357c0 25.703-20.833 46.542-46.542 46.542h-65.63v-98.898h65.63c25.708 0 46.542 20.836 46.542 46.539v5.817z\"  ></path><path d=\"M851.172 739.628V638.583h101.042l-64.297-64.299h-75.073l-75.781-75.789c-7.177-7.177-18.802-7.177-25.979 0s-7.177 18.802 0 25.979l75.786 75.792v75.06l64.302 64.302z\"  ></path></symbol><symbol id=\"icon-RFQ-filling\" viewBox=\"0 0 1024 1024\"><path d=\"M0 715.259V308.741c0-50.375 33.716-94.518 82.316-107.773l5.12-1.396a1613.589 1613.589 0 0 1 849.127 0l5.12 1.396c48.6 13.255 82.316 57.398 82.316 107.773v406.518c0 50.375-33.716 94.518-82.316 107.773l-5.12 1.396a1613.589 1613.589 0 0 1-849.127 0l-5.12-1.396C33.716 809.777 0 765.634 0 715.259z\"  ></path><path d=\"M745.619 335.403c-45.436 0-86.919 17.237-118.281 45.502v-45.511H391.854v329.558L306.559 557.56c36.304-19.472 61-57.773 61-101.852v-2.358c0-65.107-52.769-117.893-117.876-117.914l-137.641-0.042v353.741h70.748V571.222h47.889l84.759 117.917h95.626l-0.003-0.003h51.541V549.704h110.172c17.229 79.595 88.177 139.44 172.845 139.44 8.986 0 17.793-0.665 26.419-1.971v-72.09a107.037 107.037 0 0 1-26.419 3.302c-58.598 0-106.112-47.514-106.112-106.112 0-58.624 47.514-106.138 106.112-106.138 58.624 0 106.138 47.514 106.138 106.138 0 9.114-1.152 17.946-3.328 26.394h72.089a175.938 175.938 0 0 0 1.971-26.394c0.001-97.535-79.334-176.87-176.87-176.87z m-562.829 70.74h66.516c26.049 0 47.166 21.117 47.166 47.165v5.896c0 26.049-21.117 47.165-47.166 47.165H182.79V406.143z m279.812 0h141.626c-17.044 22.649-28.778 49.504-33.344 78.709H462.602v-78.709z\"  ></path><path d=\"M911.668 575.907H835.59l-76.799-76.806c-7.273-7.273-19.055-7.273-26.328 0s-7.273 19.055 0 26.327l76.804 76.81v76.068l65.163 65.164v-102.4h102.4l-65.162-65.163z\"  ></path></symbol><symbol id=\"icon-originalimage\" viewBox=\"0 0 1024 1024\"><path d=\"M988.362258 979.361919c-1.581185-4.743556-1.581185-4.743556-2.797482-6.932889-1.094667-1.946074-2.310963-3.648889-3.892149-5.716594-2.189334-2.797482-5.108445-6.324742-9.122223-10.703409-6.93289-7.784297-17.028151-18.609336-30.529042-32.475116-20.920299-21.893337-41.962228-43.300154-93.04668-95.114384-50.476304-51.327711-71.761492-72.977788-92.438532-94.627865-13.014372-13.62252-22.866374-23.961041-29.312745-31.25882-3.162371-3.648889-5.473334-6.324742-6.81126-7.905927 0.851408 1.581185 0.851408 1.581185 2.189334 5.473334 2.067704 7.297779 2.067704 7.297779-6.81126 24.082671C795.944156 646.826464 842.163422 539.914004 842.163422 425.460506c0-226.960922-180.741656-410.986578-403.810429-410.986578S34.542564 198.499584 34.542564 425.460506 215.28422 836.447084 438.352993 836.447084c4.865186 0 9.973631-0.243259 15.568595-0.608148 4.013778-0.364889 7.541038-0.608148 13.86578-1.337926 12.892743-1.337926 17.636299-1.702815 23.109633-1.702815 9.243853 0 23.961041-3.284 45.732747-9.365483 2.554223-0.729778 5.230075-1.459556 7.905927-2.189334 8.270816-2.310963 16.784891-4.865186 24.934078-7.419408 4.986816-1.581185 8.635705-2.675852 10.825038-3.405631 12.892743-4.135408 20.068892-18.122817 15.933484-31.258819-4.013778-13.136002-17.757928-20.433781-30.650671-16.298373-1.946074 0.608148-5.594964 1.824445-10.33852 3.284001-7.905927 2.432593-16.055113 4.865186-23.96104 7.176149-2.554223 0.729778-4.986816 1.459556-7.419409 2.067704-16.784891 4.621927-29.920893 7.541038-32.840005 7.541038-7.784297 0-13.257632 0.486519-28.096448 1.946075-5.959853 0.608148-9.243853 0.973037-12.649483 1.216296-4.500297 0.364889-8.392446 0.486519-11.919706 0.486519-195.945362 0-354.915311-161.767431-354.91531-361.240053S242.286002 64.098824 438.352993 64.098824s354.915311 161.767431 354.915311 361.240052c0 100.587718-40.624302 194.485806-110.926238 262.355149-9.000594 17.14978-9.000594 17.14978-6.811261 24.934078 1.581185 4.500297 1.581185 4.500297 2.797482 6.689631 1.094667 1.946074 2.310963 3.648889 3.892149 5.716593 2.189334 2.797482 5.108445 6.324742 9.122223 10.703409 6.93289 7.784297 17.028151 18.609336 30.529042 32.596746 20.920299 21.893337 42.205488 43.543414 92.92505 95.114384 50.841193 51.6926 71.761492 73.099418 92.560162 94.749495 13.014372 13.62252 22.866374 23.961041 29.312745 31.258819 3.162371 3.648889 5.473334 6.324742 6.68963 7.905927-0.973037-1.702815-0.973037-1.702815-2.310963-5.838223-2.067704-7.905927-2.067704-7.905927 7.905927-24.690818-10.33852 8.878964-11.554816 24.569189-2.919111 35.150968 8.757335 10.46015 24.2043 11.798076 34.54282 2.919111 9.852001-17.028151 9.852001-17.028151 7.784297-25.542226z\"  ></path><path d=\"M435.677141 653.394465c127.954389 0 231.704478-103.750089 231.704478-231.704478S563.63153 189.985509 435.677141 189.985509 203.972663 293.735598 203.972663 421.689987c-0.12163 127.954389 103.628459 231.704478 231.704478 231.704478z m0-46.340896c-102.412163 0-185.363582-82.951419-185.363582-185.363582s82.951419-185.363582 185.363582-185.363582 185.363582 82.951419 185.363582 185.363582-83.073049 185.363582-185.363582 185.363582z\"  ></path></symbol><symbol id=\"icon-logistic\" viewBox=\"0 0 1024 1024\"><path d=\"M723.2 0c-83.2 0-151.466667 68.266667-151.466667 151.466667 0 83.2 151.466667 296.533333 151.466667 296.533333S874.666667 236.8 874.666667 151.466667C874.666667 68.266667 806.4 0 723.2 0z m0 192c-36.266667 0-64-27.733333-64-64s27.733333-64 64-64 64 27.733333 64 64-29.866667 64-64 64z\"  ></path><path d=\"M800 320s0 2.133333-2.133333 2.133333c2.133333 0 2.133333-2.133333 2.133333-2.133333z\"  ></path><path d=\"M887.466667 247.466667c-6.4 14.933333-14.933333 29.866667-21.333334 44.8 6.4 8.533333 10.666667 19.2 17.066667 27.733333h-32c-8.533333 14.933333-17.066667 29.866667-25.6 42.666667h78.933333c19.2 46.933333 29.866667 96 34.133334 149.333333h-170.666667c0-19.2-2.133333-36.266667-4.266667-55.466667-2.133333 2.133333-4.266667 4.266667-4.266666 6.4L723.2 512H512v-149.333333h108.8c-8.533333-12.8-17.066667-27.733333-25.6-42.666667H512V110.933333c6.4 2.133333 12.8 2.133333 19.2 4.266667 4.266667-23.466667 10.666667-46.933333 21.333333-66.133333-21.333333-2.133333-40.533333-4.266667-61.866666-4.266667C219.733333 44.8 0 264.533333 0 533.333333c0 270.933333 219.733333 490.666667 490.666667 490.666667s490.666667-219.733333 490.666666-490.666667c-2.133333-106.666667-36.266667-204.8-93.866666-285.866666zM386.133333 100.266667c-61.866667 42.666667-113.066667 121.6-142.933333 219.733333H98.133333c59.733333-108.8 164.266667-189.866667 288-219.733333zM76.8 362.666667h155.733333c-10.666667 46.933333-17.066667 96-19.2 149.333333H42.666667c4.266667-53.333333 14.933333-102.4 34.133333-149.333333zM42.666667 554.666667h170.666666c2.133333 53.333333 8.533333 102.4 19.2 149.333333H76.8c-19.2-46.933333-29.866667-96-34.133333-149.333333z m53.333333 192h147.2c29.866667 100.266667 81.066667 179.2 142.933333 221.866666C262.4 938.666667 155.733333 857.6 96 746.666667zM469.333333 957.866667c-76.8-12.8-142.933333-96-181.333333-211.2H469.333333v211.2zM469.333333 704h-192c-10.666667-46.933333-19.2-96-19.2-149.333333h213.333334v149.333333z m0-192H256c2.133333-53.333333 8.533333-102.4 19.2-149.333333h192v149.333333z m0-192h-179.2c38.4-115.2 104.533333-196.266667 179.2-209.066667V320z m42.666667 234.666667h211.2c-2.133333 53.333333-8.533333 102.4-19.2 149.333333h-192v-149.333333z m0 192h179.2c-38.4 115.2-104.533333 198.4-179.2 211.2V746.666667z m81.066667 221.866666c61.866667-42.666667 113.066667-121.6 142.933333-221.866666h147.2c-59.733333 110.933333-164.266667 192-290.133333 221.866666zM746.666667 704c10.666667-46.933333 17.066667-96 19.2-149.333333h170.666666c-2.133333 53.333333-12.8 102.4-32 149.333333H746.666667z\"  ></path><path d=\"M753.066667 394.666667s0 2.133333-2.133334 2.133333l2.133334-2.133333z\"  ></path></symbol><symbol id=\"icon-Calculator\" viewBox=\"0 0 1024 1024\"><path d=\"M864.128 46.549333c38.698667 0 70.272 31.36 70.272 69.738667v764.522667c0 12.842667 10.496 23.253333 23.466667 23.253333 12.970667 0 23.466667-10.410667 23.466666-23.253333V116.266667C981.333333 52.245333 928.789333 0 864.128 0H42.666667v907.456C42.666667 971.861333 95.082667 1024 159.850667 1024H870.186667c12.970667 0 23.466667-10.410667 23.466666-23.253333 0-12.864-10.496-23.296-23.466666-23.296H159.850667A70.08 70.08 0 0 1 89.6 907.456V46.549333h774.528z\"  ></path><path d=\"M197.696 170.666667h628.608v64H197.696V170.666667zM874.666667 128H149.333333v149.333333h725.333334V128zM174.08 469.333333h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333333s-11.093333-21.333333-24.746667-21.333333H174.08C160.426667 426.666667 149.333333 436.224 149.333333 448s11.093333 21.333333 24.746667 21.333333zM430.08 469.333333h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333333s-11.093333-21.333333-24.746667-21.333333h-163.84c-13.653333 0-24.746667 9.557333-24.746667 21.333333s11.093333 21.333333 24.746667 21.333333zM174.08 640h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333333s-11.093333-21.333333-24.746667-21.333334H174.08C160.426667 597.333333 149.333333 606.890667 149.333333 618.666667s11.093333 21.333333 24.746667 21.333333zM430.08 640h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333333s-11.093333-21.333333-24.746667-21.333334h-163.84c-13.653333 0-24.746667 9.557333-24.746667 21.333334s11.093333 21.333333 24.746667 21.333333zM174.08 746.666667h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333334s-11.093333-21.333333-24.746667-21.333333H174.08C160.426667 704 149.333333 713.557333 149.333333 725.333333s11.093333 21.333333 24.746667 21.333334zM430.08 746.666667h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333334s-11.093333-21.333333-24.746667-21.333333h-163.84c-13.653333 0-24.746667 9.557333-24.746667 21.333333s11.093333 21.333333 24.746667 21.333334zM174.08 874.666667h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333334s-11.093333-21.333333-24.746667-21.333333H174.08C160.426667 832 149.333333 841.557333 149.333333 853.333333s11.093333 21.333333 24.746667 21.333334zM430.08 874.666667h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333334s-11.093333-21.333333-24.746667-21.333333h-163.84c-13.653333 0-24.746667 9.557333-24.746667 21.333333s11.093333 21.333333 24.746667 21.333334zM686.08 469.333333h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333333s-11.093333-21.333333-24.746667-21.333333h-163.84c-13.653333 0-24.746667 9.557333-24.746667 21.333333s11.093333 21.333333 24.746667 21.333333zM686.08 640h163.84c13.653333 0 24.746667-9.557333 24.746667-21.333333s-11.093333-21.333333-24.746667-21.333334h-163.84c-13.653333 0-24.746667 9.557333-24.746667 21.333334s11.093333 21.333333 24.746667 21.333333zM708.736 752.746667c0-0.106667 118.464 0 118.464 0 0.085333 0 0.064 73.173333 0.064 73.173333 0 0.106667-118.464 0-118.464 0-0.085333 0-0.064-73.173333-0.064-73.173333z m-47.402667 0v73.173333C661.333333 852.906667 682.581333 874.666667 708.8 874.666667h118.4C853.610667 874.666667 874.666667 852.906667 874.666667 825.92v-73.173333C874.666667 725.76 853.418667 704 827.2 704h-118.4C682.389333 704 661.333333 725.76 661.333333 752.746667z\"  ></path></symbol><symbol id=\"icon-video\" viewBox=\"0 0 1024 1024\"><path d=\"M49.770667 199.104H658.773333c19.925333 5.674667 33.493333 14.336 42.24 25.024 8.448 10.24 11.157333 20.117333 11.157334 25.066667v214.250666l262.357333-168.682666v414.826666l-262.357333-168.661333v148.096a24.896 24.896 0 1 0 49.770666 0v-62.442667l262.378667 174.186667V203.605333L761.92 372.266667v-123.093334c0-15.488-5.696-36.266667-22.464-56.661333-16-19.477333-39.573333-34.133333-71.104-42.368L665.258667 149.333333H0v608.96l0.768 3.029334c2.986667 11.669333 9.173333 27.989333 19.690667 44.629333 18.730667 29.653333 44.906667 48.725333 79.146666 49.066667h637.44a24.896 24.896 0 0 0 0-49.770667H99.84c-14.4-0.149333-26.752-9.130667-37.333333-25.877333a120.213333 120.213333 0 0 1-12.757334-27.690667V199.104z\"  ></path><path d=\"M205.909333 324.48a46.506667 46.506667 0 1 1-92.992-0.042667 46.506667 46.506667 0 0 1 92.992 0.021334z\"  ></path></symbol><symbol id=\"icon-earth\" viewBox=\"0 0 1024 1024\"><path d=\"M996.352 354.304c-88.064-267.776-376.832-412.672-644.096-325.12-267.776 88.064-413.184 376.32-325.12 644.096 88.064 267.776 376.832 412.672 644.096 325.12 109.568-36.352 197.632-107.008 259.584-195.072 2.56-4.608 3.072-10.24 1.024-16.384-4.096-12.288-16.384-18.432-28.672-14.336-6.656 2.048-10.752 6.144-13.312 11.776-55.296 77.312-134.144 139.264-231.424 171.008-155.136 51.2-318.464 15.36-436.224-80.896l23.04-155.648-90.624-84.992h-87.552c-21.504-82.432-19.968-165.888 2.048-243.2l131.584-22.016 41.472-103.936 82.944-41.472 19.456-137.728c8.192-3.072 16.384-6.144 24.576-8.704 93.696-30.72 189.952-30.208 277.504-3.584l-17.92 106.496-157.696 137.728-150.528 258.048 201.728 179.712 186.88-70.144-19.968-138.752 132.096-32.768 81.92 81.92 70.144-29.184c-1.024 9.216-2.048 17.92-4.096 27.136v0.512c0 2.56 0 4.608 0.512 6.656 4.096 12.288 16.896 17.92 28.672 14.336 9.216-3.072 15.36-11.264 15.36-20.992 12.8-77.824 8.704-159.744-17.408-239.616z m-793.6 378.368l-16.384 109.568c-46.08-46.592-82.944-103.424-107.008-168.448h58.368l65.024 58.88z m85.504-535.552l-77.824 38.912-38.912 96.768-88.064 14.848c39.936-101.888 115.712-189.44 217.6-241.664l-12.8 91.136zM834.56 469.504l-188.928 47.104 20.48 142.336-134.144 50.176-159.232-141.824 130.56-223.744 163.328-142.848 18.944-113.664c122.368 49.152 223.232 149.504 267.264 284.672 16.384 49.664 24.576 100.352 24.064 150.016l-63.488 26.624-78.848-78.848z\"  ></path></symbol><symbol id=\"icon-task-management\" viewBox=\"0 0 1024 1024\"><path d=\"M37.298973 205.897502c6.293019 0 12.587044-2.297707 17.549971-7.001864L218.590269 44.346147c10.246041-9.644932 10.740421-25.8195 1.0532-36.086686-9.666077-10.246041-25.883941-10.761565-36.086686-1.031048L19.771154 161.777904c-10.267186 9.666077-10.740421 25.840645-1.052192 36.129982 5.047504 5.284122 11.834903 7.990623 18.580011 7.990623zM986.425141 205.897502a25.375465 25.375465 0 0 1-17.549971-7.001864L805.131831 44.346147c-10.246041-9.644932-10.739414-25.8195-1.052193-36.086686 9.666077-10.246041 25.883941-10.761565 36.086686-1.031048L1003.95296 161.777904c10.267186 9.666077 10.739414 25.840645 1.052192 36.129982-5.047504 5.284122-11.83591 7.990623-18.580011 7.990623zM514.029876 43.872912c-270.542411 0-489.898918 219.3555-489.898918 489.876767 0 270.672299 219.334356 489.920063 489.898918 489.920063 112.340956 0 218.926568-37.955461 305.040236-106.541309 10.310482-8.1628 12.028224-23.220735 3.779839-33.552362s-23.263025-12.029231-33.573507-3.780846c-77.650816 61.841746-173.773908 96.102954-275.225423 96.102954-244.165097 0-442.083052-197.961251-442.083052-442.1485 0-244.121801 197.89681-442.061908 442.083052-442.061907 244.187249 0 442.105204 197.940106 442.105203 442.061907 0 83.730376-23.284169 163.958812-66.588193 233.490124-6.938431 11.169353-3.523084 25.947375 7.668421 32.929102 11.190498 6.959575 25.905086 3.479788 32.90695-7.647277 47.987036-77.049707 73.827681-166.019902 73.827682-258.771949-0.021145-270.521266-219.3555-489.876767-489.941208-489.876767z\"  ></path><path d=\"M816.4059 510.056716c-0.472228 0-0.966608 0.043296-1.459981 0.043296-0.215473 0-0.429939-0.021145-0.579964-0.021145H530.483351V226.19727c0-0.451084-0.021145-0.902167-0.06444-1.35325 0.043296-0.451084 0.064441-0.945463 0.06444-1.396547 0-14.52026-11.620437-26.269577-25.969526-26.269577-14.370234 0-25.990671 11.749318-25.990671 26.269577 0 0.451084 0.043296 0.923312 0.064441 1.374395-0.043296 0.451084-0.085585 0.902167-0.085585 1.375402v283.602691c-14.477971 0-26.227288 11.577141-26.24944 25.905085-0.021145 12.973687 9.516051 23.714108 22.038655 25.711764a12.898171 12.898171 0 0 0 4.081904 0.66555h0.085585v0.128881c0 0.579965 0.064441 1.267666 0.151032 1.782183 1.030041 13.597955 12.200401 24.316224 25.92623 24.316224 14.348083 0 25.947375-11.770462 25.969526-26.227288h283.860453c0.515524 0 0.987752 0 1.39554-0.043296h0.537675c14.52026 0.043296 26.291729-11.577141 26.356169-25.882934-0.022151-14.392385-11.728173-26.056118-26.249439-26.098407z\"  ></path></symbol><symbol id=\"icon-trust\" viewBox=\"0 0 1024 1024\"><path d=\"M776.682667 93.589333l-151.701334 76.394667 36.693334 72.938667c-1.728 0.64-3.029333 1.728-4.522667 2.816-4.970667 3.882667-20.501333 14.250667-33.450667 16.618666-25.216 3.136-40.832-9.685333-62.592-2.581333-12.309333 3.029333-30.869333 14.250667-51.370666 29.354667-18.773333-10.581333-50.709333-27.2-69.056-29.568-15.573333-1.877333-42.517333 3.029333-49.642667 2.368-11.008-0.874667-25.472-9.28-31.722667-13.589334l39.488-78.336-151.488-76.394666L0 584.533333l151.722667 76.181334 188.181333-373.568c10.368 6.464 32.170667 17.898667 51.2 17.898666 16.170667 0 25.642667-5.013333 43.754667-2.773333 6.464 0.853333 21.589333 7.552 37.76 15.744a1837.546667 1837.546667 0 0 0-85.461334 75.541333c-30.549333 32.746667-31.018667 73.109333-7.552 100.736 27.328 34.005333 59.882667 25.621333 88.277334 13.866667l80.448-41.536c11.669333-6.165333 19.776-10.432 19.882666-10.261333l170.261334 147.178666c5.824 5.184 9.493333 12.074667 10.133333 19.861334 0.64 7.978667-1.728 15.530667-6.912 21.354666-18.346667 21.589333-31.722667 10.133333-31.722667 10.133334l-32.810666-25.237334-26.538667 34.090667s24.768 18.709333 32.597333 25.472c4.736 4.074667 5.184 7.765333 4.757334 10.794667-0.426667 6.037333-4.309333 13.376-10.794667 20.928-9.92 11.648-17.258667 14.890667-22.656 14.890666-4.970667 0-8.192-2.816-9.92-4.309333a7153.130667 7153.130667 0 0 0-38.848-28.48l-25.898667 34.538667 37.973334 28.266666c4.522667 4.309333 4.970667 7.765333 4.757333 11.008-0.64 5.824-4.757333 13.589333-11.221333 21.354667-6.912 7.765333-13.802667 13.162667-20.074667 14.890667-3.648 0.981333-6.656 1.322667-12.074667-2.816l-46.186666-37.546667-27.2 33.450667 44.245333 36.032c5.824 4.757333 6.250667 8.64 5.824 12.074666-0.64 6.037333-4.757333 13.589333-11.434667 21.376a29.184 29.184 0 0 1-19.648 10.133334c-7.765333 0.64-15.317333-1.941333-22.442666-7.765334l-206.4-173.909333c-9.706667-7.125333-23.082667-5.184-30.208 4.309333s-5.184 23.082667 4.309333 30.208l205.525333 173.056a71.594667 71.594667 0 0 0 46.613334 17.258667c26.325333-1.066667 41.6-11.605333 55.253333-25.258667 19.2-19.2 21.589333-47.04 21.589333-48.128 1.301333-0.426667 32.597333-14.890667 45.098667-29.568 18.261333-20.416 21.568-41.728 21.589333-48.341333 15.317333-3.242667 30.656-12.736 44.245334-28.693333 13.162667-15.530667 20.288-32.149333 21.141333-47.701334 0.853333-0.213333 26.88-7.829333 43.584-28.48 7.125333-8.426667 12.074667-18.133333 14.677333-28.693333 0.853333-0.426667 55.68-37.333333 55.68-37.333333l27.2 53.952L1024 584.533333 776.682667 93.589333zM132.501333 602.88l-74.453333-37.546667 208.256-413.909333 74.666667 37.546667L132.501333 602.88z m652.608-7.765333a72.704 72.704 0 0 0-18.56-24.384l-180.842666-156.458667a21.781333 21.781333 0 0 0-23.744-3.029333c-3.242667 1.514667-80.597333 42.069333-107.754667 57.792-14.72 8.448-32.277333 9.770667-42.453333-5.525334-9.770667-14.442667-5.482667-27.989333 4.117333-37.589333 59.562667-56.106667 135.914667-119.509333 155.370667-124.096 20.522667-5.696 32.234667 5.994667 60.202666 2.816 21.632-1.813333 42.944-18.133333 49.856-23.082667l144.149334 286.165334-40.341334 27.392zM683.029333 188.970667l74.453334-37.546667L965.952 565.333333l-74.666667 37.546667-208.256-413.909333z\" fill=\"#4D4D4D\" ></path></symbol><symbol id=\"icon-password\" viewBox=\"0 0 1024 1024\"><path d=\"M136.533568 460.565045V947.412741A25.599984 25.599984 0 0 0 162.176219 972.799392h691.114234c14.335991 0 25.642651-11.30666 25.642651-25.365317V460.586379a25.599984 25.599984 0 0 0-25.642651-25.365318H162.176219c-14.335991 0-25.642651 11.30666-25.642651 25.365318z m-51.199968 0A76.543952 76.543952 0 0 1 162.176219 383.99976h691.114234a76.799952 76.799952 0 0 1 76.842619 76.565285V947.412741A76.543952 76.543952 0 0 1 853.290453 1023.99936H162.176219A76.799952 76.799952 0 0 1 85.3336 947.434075V460.586379z\"  ></path><path d=\"M290.133472 217.599864c0-91.733276 74.60262-166.399896 166.421229-166.399896H546.133312a166.442563 166.442563 0 0 1 166.421229 166.399896v91.519943s7.082662 17.557322 27.221317 17.557322c20.159987 0 23.978652-17.535989 23.978651-17.535989V217.599864C763.733176 97.429272 666.239904 0 546.111979 0H456.533368C336.362776 0 238.933504 97.663939 238.933504 217.599864v191.99988l51.199968-9.813327V217.599864z m0 0c0-91.733276 74.60262-166.399896 166.421229-166.399896H546.133312a166.442563 166.442563 0 0 1 166.421229 166.399896v91.519943h51.199968V217.599864C763.733176 97.429272 666.239904 0 546.111979 0H456.533368C336.362776 0 238.933504 97.663939 238.933504 217.599864v191.99988l51.199968-9.813327V217.599864zM495.829343 576.831639v241.130516a25.599984 25.599984 0 1 0 51.199968 0V576.831639a25.599984 25.599984 0 1 0-51.199968 0z\"  ></path></symbol><symbol id=\"icon-column\" viewBox=\"0 0 1024 1024\"><path d=\"M307.2 908.8h51.2V115.2h-51.2v793.6z m332.8 0h51.2V115.2H640v793.6z m-512.021333 0A76.885333 76.885333 0 0 1 51.2 832.085333V89.6L25.6 115.2h870.528A76.672 76.672 0 0 1 972.8 192.192V846.506667a25.6 25.6 0 1 0 51.2 0V192.213333A127.872 127.872 0 0 0 896.128 64H25.6A25.6 25.6 0 0 0 0 89.6v742.485333A128.085333 128.085333 0 0 0 127.978667 960H896a25.6 25.6 0 1 0 0-51.2H127.978667z\"  ></path></symbol><symbol id=\"icon-apparel\" viewBox=\"0 0 1024 1024\"><path d=\"M367.701333 415.04l4.074667 18.304-11.392 20.096 217.386667 3.669333a20.757333 20.757333 0 0 0 0.533333-41.536l-210.602667-0.533333z m301.056 11.136l-1.408 7.274667 3.52 6.528 299.242667 556.373333 18.282667-30.613333H35.648l18.090667 30.976 314.176-556.373334 3.946666-6.976-1.770666-7.808-87.978667-387.648-20.245333 25.344h87.978666l-17.493333-9.536c0.768 1.152 2.090667 3.2 4.010667 5.952a483.157333 483.157333 0 0 0 48.917333 60.074667c40.768 42.410667 82.197333 68.48 123.946667 69.184h3.136c42.282667-0.661333 82.944-26.944 121.92-69.589333a446.442667 446.442667 0 0 0 49.834666-66.282667l-17.877333 10.197333h98.304l-20.373333-24.725333-75.413334 387.648zM789.76 21.76H654.4l-6.037333 10.197333a405.504 405.504 0 0 1-44.736 59.392C571.669333 126.293333 539.690667 146.986667 511.701333 147.413333c-29.610667-0.469333-62.72-21.333333-96.512-56.469333a442.218667 442.218667 0 0 1-47.893333-59.669333l-6.122667-9.536h-125.312l5.76 25.344 87.957334 387.669333 2.176-14.805333L17.578667 976.32l-17.493334 30.954667H1023.146667l-16.469334-30.592-299.242666-556.373334 2.090666 13.802667 75.413334-387.648 4.8-24.746667z\"  ></path></symbol><symbol id=\"icon-bags\" viewBox=\"0 0 1024 1024\"><path d=\"M311.616042 316.949267h389.909252c121.322641 0 219.519954 98.090646 219.519954 219.434621V951.039802c0 13.418664-10.815998 24.213328-24.362661 24.213328H116.458749a24.405328 24.405328 0 0 1-24.362662-24.213328V536.383888c0-121.109308 98.410646-219.434621 219.519955-219.434621zM43.328098 951.039802A73.173318 73.173318 0 0 0 116.480082 1023.999787h780.223838a72.959985 72.959985 0 0 0 73.130651-72.959985V536.362555c0-148.266636-120.042642-268.202611-268.287944-268.202611H311.616042c-148.053302 0-268.287944 120.149308-268.287944 268.202611V951.039802z m268.20261-512.17056c13.567997 0 24.383995 10.815998 24.383995 24.533328v72.853318c0 13.65333-10.837331 24.533328-24.383995 24.533329a24.277328 24.277328 0 0 1-24.383994-24.533329v-72.853318c0-13.65333 10.815998-24.533328 24.383994-24.533328z m-73.151984 97.386646a73.045318 73.045318 0 0 0 73.151984 73.279985c40.533325 0 73.130651-32.767993 73.130652-73.279985v-72.853318a73.045318 73.045318 0 0 0-73.130652-73.279985 73.087985 73.087985 0 0 0-73.151984 73.279985v72.853318z m438.869242-97.386646c13.567997 0 24.362662 10.815998 24.362661 24.533328v72.853318c0 13.65333-10.815998 24.533328-24.362661 24.533329a24.277328 24.277328 0 0 1-24.383995-24.533329v-72.853318c0-13.65333 10.815998-24.533328 24.383995-24.533328z m-73.151985 97.386646a73.045318 73.045318 0 0 0 73.151985 73.279985c40.533325 0 73.130651-32.767993 73.130651-73.279985v-72.853318a73.045318 73.045318 0 0 0-73.130651-73.279985 73.087985 73.087985 0 0 0-73.151985 73.279985v72.853318z m-268.181278-316.799934c0-94.186647 76.543984-170.666631 170.666631-170.666631 94.165314 0 170.666631 76.543984 170.666632 170.666631v195.050626h48.746656v-195.050626C725.994622 98.389313 627.690643 0 506.581334 0 385.536026 0 287.146714 98.30398 287.146714 219.434621v195.050626h48.767989v-195.050626zM762.666614 853.333156a24.383995 24.383995 0 1 0 0-48.76799H92.096087V853.333156h670.591861z\"  ></path></symbol><symbol id=\"icon-folder\" viewBox=\"0 0 1228 1024\"><path d=\"M1228.544 306.304a153.6256 153.6256 0 0 0-153.6256-153.9072h-460.032l21.4272 8.7808L481.024 8.96 472.064 0.256H0.9472v863.36c0 85.248 68.6592 154.368 153.2928 154.368h906.4448c16.9472 0 30.72-13.824 30.72-30.8224 0-17.0496-13.7728-30.848-30.72-30.848H154.2144c-50.688 0-91.904-41.4976-91.904-92.672V31.0784l-30.72 30.8224h428.032l-21.4272-8.7552 155.264 152.192 8.9344 8.7552h472.5248a92.1088 92.1088 0 0 1 92.2368 92.2112V849.92c0 17.024 13.7216 30.8224 30.6688 30.8224 16.9728 0 30.72-13.7984 30.72-30.8224V306.304z m-61.3888 172.032l0.2048-61.696H62.4128v61.696h1104.7424z\"  ></path></symbol><symbol id=\"icon-column1\" viewBox=\"0 0 1024 1024\"><path d=\"M127.978667 908.8A76.885333 76.885333 0 0 1 51.2 832.085333V89.6L25.6 115.2h870.528A76.672 76.672 0 0 1 972.8 192.192V846.506667a25.6 25.6 0 1 0 51.2 0V192.213333A127.872 127.872 0 0 0 896.128 64H25.6A25.6 25.6 0 0 0 0 89.6v742.485333A128.085333 128.085333 0 0 0 127.978667 960H896a25.6 25.6 0 1 0 0-51.2H127.978667z m102.421333 0h51.2V115.2h-51.2v793.6z m256 0h51.2V115.2h-51.2v793.6z m256 0h51.2V115.2h-51.2v793.6z\"  ></path></symbol><symbol id=\"icon-code\" viewBox=\"0 0 1024 1024\"><path d=\"M335.168 520.416m-50.528 0a50.528 50.528 0 1 0 101.056 0 50.528 50.528 0 1 0-101.056 0Z\"  ></path><path d=\"M537.248 520.416m-50.528 0a50.528 50.528 0 1 0 101.056 0 50.528 50.528 0 1 0-101.056 0Z\"  ></path><path d=\"M739.36 520.416m-50.528 0a50.528 50.528 0 1 0 101.056 0 50.528 50.528 0 1 0-101.056 0Z\"  ></path><path d=\"M548.192 823.232h-187.776a302.816 302.816 0 1 1 0-605.632h303.168a302.816 302.816 0 0 1 302.816 302.816v3.712a299.104 299.104 0 0 1-299.104 299.104 25.6 25.6 0 1 0 0 51.2c193.472 0 350.304-156.8 350.304-350.304v-3.712C1017.6 324.896 859.104 166.4 663.584 166.4h-303.168C164.896 166.4 6.4 324.896 6.4 520.416s158.496 354.016 354.016 354.016h187.776a25.6 25.6 0 1 0 0-51.2z\"  ></path></symbol><symbol id=\"icon-RFQ-filling1\" viewBox=\"0 0 1416 1024\"><path d=\"M0 793.266508V230.733492c0-69.708108 46.655654-130.792476 113.907546-149.13453l7.084973-1.931762a2232.858292 2232.858292 0 0 1 1175.008173 0l7.084973 1.931762c67.251892 18.342054 113.907546 79.426422 113.907546 149.13453v562.533016c0 69.708108-46.655654 130.792476-113.907546 149.13453l-7.084973 1.931762a2232.858292 2232.858292 0 0 1-1175.008173 0l-7.084973-1.931762C46.655654 924.058984 0 862.974616 0 793.266508z m1031.775481-525.638573c-62.8736 0-120.277103 23.852281-163.67533 62.96493v-62.977384H542.241211v456.037016L424.211373 575.045189c50.236886-26.945038 84.410811-79.945341 84.410811-140.941146v-3.262962c0-90.094011-73.020886-163.138422-163.114898-163.167481l-190.465383-0.058119v489.50106h97.899935V593.950443h66.268021l117.28813 163.171633h132.325708l-0.004151-0.004152h71.3216V564.174184h152.454227c23.841211 110.14227 122.017903 192.954811 239.180108 192.954811 12.434681 0 24.621665-0.920216 36.558184-2.727438v-99.756973a148.116065 148.116065 0 0 1-36.558184 4.569254c-81.086962 0-146.836065-65.749103-146.836065-146.836065 0-81.122941 65.749103-146.872043 146.836065-146.872043 81.122941 0 146.872043 65.749103 146.872043 146.872043 0 12.611805-1.594119 24.833384-4.605232 36.523589h99.755589a243.460151 243.460151 0 0 0 2.727438-36.523589c0.001384-134.967351-109.781103-244.749838-244.749838-244.749838z m229.775914 332.805535H1156.275892l-106.273211-106.282897c-10.064259-10.064259-26.368-10.064259-36.432259 0s-10.064259 26.368 0 36.430876l106.280129 106.288432v105.261665l90.171503 90.172886v-141.699459h141.69946l-90.170119-90.171503z\"  ></path><path d=\"M252.941838 365.5168h92.043762c36.046184 0 65.267546 29.221362 65.267546 65.266162v8.158789c0 36.046184-29.221362 65.266162-65.267546 65.266163H252.941838V365.5168zM640.141146 365.5168h195.979762c-23.585211 31.341319-39.82253 68.502832-46.140886 108.916238H640.141146v-108.916238z\"  ></path></symbol><symbol id=\"icon-customs-clearance\" viewBox=\"0 0 1024 1024\"><path d=\"M504.128 943.264l-1.968 1.968c-84.688-88.624-141.792-179.2-173.296-273.728h126.032c3.936-13.776 7.872-27.568 13.776-39.376h-151.632c-9.84-43.328-15.744-88.624-15.744-133.92 1.968-45.28 7.872-86.64 17.712-128h362.352c5.904 25.6 11.808 51.2 13.776 76.8 11.824-1.968 25.6-3.936 39.392-3.936-1.968-25.6-7.888-49.232-13.792-72.864h210.72c11.808 41.36 19.68 84.688 19.68 129.984v9.84c13.792 9.84 25.6 23.632 37.424 35.44 1.968-15.744 1.968-29.536 1.968-45.28 0-55.152-9.856-108.32-25.6-157.552v-1.968C901.904 149.664 718.768 9.84 502.16 9.84c-216.624 0-399.76 139.824-466.72 332.8v1.968c-15.744 49.232-25.6 102.4-25.6 157.552 0 55.136 9.856 108.304 25.6 157.536v1.968c66.96 192.976 250.096 332.8 466.72 332.8 15.744 0 31.504 0 45.28-1.968a516.32 516.32 0 0 1-43.312-49.232zM921.6 332.8H712.864c-41.36-129.968-118.16-230.4-161.472-279.632 167.376 17.728 309.168 128 370.208 279.632z m-250.08 0H332.8c47.264-139.808 135.872-240.24 169.36-273.728 33.472 33.488 122.08 133.92 169.344 273.728zM452.912 51.2c-45.296 51.2-122.096 149.664-161.488 279.632H82.72C143.76 181.168 285.536 70.88 452.928 51.2zM49.232 502.16c0-45.296 5.92-88.624 19.68-129.968h210.72c-9.84 39.376-15.76 82.704-17.728 126.016-1.968 45.296 3.936 90.592 13.792 135.888H68.928c-13.792-43.328-19.696-86.656-19.696-131.936z m33.472 169.344h204.8C317.04 768 372.192 862.528 454.896 951.136c-169.36-15.744-311.136-128-372.192-279.632z\" fill=\"#666666\" ></path><path d=\"M758.16 502.16c-141.792 0-256 114.208-256 256 0 141.776 114.208 256 256 256 141.776 0 256-114.224 256-256 0-141.792-114.224-256-256-256z m0 472.608a216 216 0 0 1-216.624-216.608 216 216 0 0 1 216.624-216.624 216 216 0 0 1 216.608 216.624 216 216 0 0 1-216.608 216.608z\" fill=\"#666666\" ></path><path d=\"M917.664 754.208a15.04 15.04 0 0 0-3.936-9.84V742.4L807.392 640a19.04 19.04 0 0 0-27.584 0 19.04 19.04 0 0 0 0 27.568l68.928 68.928H602.592c-11.824 0-19.696 7.872-19.696 19.68 0 11.824 7.872 19.696 19.68 19.696H850.72l-70.88 70.896c-3.952 3.936-5.92 7.872-5.92 13.792 0 5.904 1.968 9.84 5.92 13.776 3.936 3.936 7.872 5.92 13.776 5.92 5.92 0 9.84-1.984 13.792-5.92l102.4-104.368c3.936-3.936 5.904-7.872 5.904-11.808 1.968 0 1.968-1.968 1.968-3.952z\" fill=\"#666666\" ></path></symbol><symbol id=\"icon-good-filling\" viewBox=\"0 0 1024 1024\"><path d=\"M224.16 391.36v610.08H93.44C41.92 1001.44 0 960 0 909.28V483.36c0-50.72 41.92-92 93.44-92h130.72zM1006.08 573.44c-3.84 6.72-7.52 12.64-10.88 18.08-16.16 26.72-22.4 36.8-20.32 69.92 0.48 10.08 1.92 20.32 3.36 30.4 5.28 39.36 12 88.16-26.24 133.76-25.92 31.36-29.44 48.8-31.84 60.48-1.12 5.44-2.24 11.2-5.12 16.96-32.16 63.68-90.56 98.4-165.28 98.4H272.16V391.36h27.52c29.28 0 94.24-61.44 157.76-149.28 24.16-33.28 24.16-41.12 24.16-101.92C481.6 61.6 533.92 0 600.64 0c60.32 0 130.56 34.56 130.56 131.68 0 58.88-17.6 168.48-26.72 220.96 34.88-0.8 94.4-1.92 148.48-1.92 63.84 0 120.16 30.72 150.56 82.4 26.4 44.96 27.36 97.44 2.56 140.32z\"  ></path></symbol><symbol id=\"icon-camera\" viewBox=\"0 0 1024 1024\"><path d=\"M917.333333 759.466667a21.333333 21.333333 0 0 0 21.333334-21.333334V328.085333a104.384 104.384 0 0 0-104.256-104.256h-114.282667l-52.821333-106.666666H349.226667l-55.914667 106.666666H85.333333v563.648a104.362667 104.362667 0 0 0 104.234667 104.234667H917.333333a21.333333 21.333333 0 1 0 0-42.666667H189.568A61.653333 61.653333 0 0 1 128 787.477333v-520.96h191.146667l55.914666-106.666666H640.853333l52.821334 106.666666h140.757333a61.653333 61.653333 0 0 1 61.589333 61.589334V738.133333a21.290667 21.290667 0 0 0 21.312 21.333334z\"  ></path><path d=\"M637.589333 369.408A211.669333 211.669333 0 0 0 512 328.533333c-117.632 0-213.333333 95.701333-213.333333 213.333334s95.701333 213.333333 213.333333 213.333333 213.333333-95.701333 213.333333-213.333333a214.186667 214.186667 0 0 0-87.744-172.458667zM512 712.533333c-94.101333 0-170.666667-76.565333-170.666667-170.666666s76.565333-170.666667 170.666667-170.666667c36.416 0 71.146667 11.285333 100.437333 32.661333A171.370667 171.370667 0 0 1 682.666667 541.866667c0 94.101333-76.565333 170.666667-170.666667 170.666666z\"  ></path></symbol><symbol id=\"icon-pin-fill\" viewBox=\"0 0 1025 1024\"><path d=\"M320 839.68l-238.592 174.08c-8.704 6.656-19.456 9.728-29.696 9.728-12.8 0-26.112-5.12-35.84-14.848-17.92-17.92-20.48-46.08-5.12-66.56l212.992-288.256L56.32 487.424C39.936 471.04 36.864 445.44 48.128 425.472c8.192-12.8 76.8-112.64 229.376-75.264 2.56 0.512 5.12 0.512 8.192 1.024 6.144 0.512 13.312 1.024 20.992 2.56 32.256 5.12 89.6-20.48 139.264-62.976 47.616-40.448 78.336-87.552 78.336-120.32 0-7.68 0-15.872-0.512-23.552-1.024-30.72-3.072-77.824 31.744-112.64 41.472-41.472 107.52-45.056 153.088-7.68 1.024 0.512 1.536 1.536 2.56 2.56 24.576 24.064 276.48 275.968 279.04 278.528 21.504 21.504 33.792 50.688 33.792 81.408s-11.776 59.392-33.792 80.896c-34.816 34.816-82.432 33.28-113.664 31.744-7.168 0-15.36-0.512-23.04-0.512-30.72 0-67.584 21.504-103.936 60.928-50.688 55.296-81.92 126.464-79.36 158.72 1.024 10.24 3.072 28.16 3.584 30.72 36.864 149.504-62.976 217.6-74.752 225.28-20.48 12.288-46.592 9.216-62.976-7.168l-165.376-165.376-50.688 35.328z\"  ></path></symbol><symbol id=\"icon-help-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512c0 282.624-229.376 512-512 512S0 794.624 0 512 229.376 0 512 0s512 229.376 512 512z m-510.464 209.408c-23.552 0-43.008 19.456-43.008 43.008v9.728c0 23.552 19.456 42.496 43.008 42.496 23.552 0 43.008-18.944 43.008-42.496v-9.728c0-23.552-19.456-43.008-43.008-43.008z m10.24-481.792c-56.32-1.024-99.84 13.312-129.536 42.496-32.256 31.744-48.64 81.408-48.64 147.456v0.512c1.024 10.752 10.752 30.72 37.376 30.72 26.624 0 35.328-20.48 35.84-31.232-1.024-40.96 8.192-71.168 27.136-89.6 17.92-17.408 45.568-25.6 81.92-23.552 49.664 5.632 74.752 32.768 76.8 82.944-3.584 22.528-23.04 52.224-57.344 88.576C500.224 536.576 476.16 580.608 476.16 619.52v39.424c1.536 9.728 10.752 27.648 35.328 27.648 24.064 0 33.792-17.92 35.328-27.648v-27.648c0-29.696 22.016-66.56 66.048-108.544 48.128-44.032 72.192-85.504 72.192-123.392-4.608-101.888-58.368-155.648-161.28-159.744z\"  ></path></symbol><symbol id=\"icon-add-account\" viewBox=\"0 0 1024 1024\"><path d=\"M524.8 21.504C361.984 21.504 230.4 153.6 230.4 316.928c0 111.616 61.952 209.408 153.088 259.584C166.912 628.224 0 804.352 0 998.4c0 0 0 25.6 26.624 25.6s24.576-25.6 24.576-25.6c0-200.704 212.48-385.536 460.8-385.536h12.8c162.816 0 294.4-132.608 294.4-295.936S687.616 21.504 524.8 21.504z m0 539.648C390.656 561.152 281.6 452.096 281.6 316.928c0-134.656 109.056-244.224 243.2-244.224S768 182.272 768 316.928c0 135.168-109.056 244.224-243.2 244.224zM1024.512 809.984c0 13.312-10.752 24.576-24.576 24.576h-163.84v163.84c0 13.312-10.752 24.576-24.576 24.576s-24.576-11.264-24.576-24.576v-163.84h-163.84c-13.312 0-24.576-11.264-24.576-24.576 0-13.312 11.264-24.576 24.576-24.576h163.84v-163.84c0-13.312 11.264-24.576 24.576-24.576s24.576 11.264 24.576 24.576v163.84h163.84c13.824 0 24.576 11.264 24.576 24.576z\"  ></path></symbol><symbol id=\"icon-listing-content\" viewBox=\"0 0 1030 1024\"><path d=\"M366.954667 281.578667c0-55.936-44.778667-101.269333-100.010667-101.269334-55.232 0-100.010667 45.333333-100.010667 101.269334s44.778667 101.269333 100.010667 101.269333c55.232 0 100.010667-45.333333 100.010667-101.269333z m-142.869334 0c0-23.978667 19.2-43.392 42.858667-43.392 23.68 0 42.858667 19.434667 42.858667 43.392s-19.2 43.392-42.858667 43.392c-23.68 0.021333-42.858667-19.413333-42.858667-43.392zM847.914667 706.112l-107.285334-102.485333a19.306667 19.306667 0 0 0-27.818666 0 19.008 19.008 0 0 0-5.952 13.802666l0.021333 206.954667c0 5.909333 1.984 9.856 5.973333 13.781333a18.069333 18.069333 0 0 0 13.909334 5.930667c5.973333 0 9.92-1.984 13.909333-5.930667l103.317333-104.469333c3.968-3.946667 5.952-7.872 5.952-11.818667 1.984 0 1.984-1.962667 1.984-3.946666a15.061333 15.061333 0 0 0-3.989333-9.856v-1.962667z\"  ></path><path d=\"M948.928 525.76l59.925333-48.96 11.776-8.661333V193.194667c0-79.978667-63.978667-144.853333-142.869333-144.853334H0v752.192c0 79.914667 63.978667 144.725333 142.869333 144.725334h329.792a28.928 28.928 0 1 0 0-57.856H142.869333c-47.317333 0-85.738667-38.890667-85.738666-86.848V106.197333h820.608c47.317333 0 85.717333 38.954667 85.717333 86.976v245.482667l-60.053333 48.341333a272.298667 272.298667 0 0 0-153.237334-47.018666c-90.282667 0-170.453333 43.946667-220.373333 111.530666l-57.493333-35.861333-19.264-12.181333-16.064 16.277333-228.586667 231.466667a29.184 29.184 0 0 0 0 40.917333c11.157333 11.306667 29.248 11.306667 40.405333 0l212.522667-215.189333 39.296 24.469333a271.978667 271.978667 0 0 0-24.234667 112.405333c0 150.976 122.837333 273.813333 273.813334 273.813334S1024 864.789333 1024 713.792c0-72.768-28.608-138.944-75.072-188.032z m-198.741333 405.674667c-120 0-217.642667-97.642667-217.642667-217.642667s97.642667-217.642667 217.642667-217.642667 217.642667 97.621333 217.642666 217.642667-97.642667 217.642667-217.642666 217.642667z\"  ></path></symbol><symbol id=\"icon-warehouse-delivery\" viewBox=\"0 0 1024 1024\"><path d=\"M814.420577 649.150377h-161.17293a29.610593 29.610593 0 0 1-29.589259-29.589259v-161.172931c0-16.319959 13.2693-29.589259 29.589259-29.589259h161.17293c16.319959 0 29.589259 13.2693 29.58926 29.589259v161.172931c0 16.298626-13.2693 29.589259-29.58926 29.589259z m-145.578302-45.183887h129.983675v-129.983675h-129.983675v129.983675zM814.420577 903.464408h-161.17293a29.610593 29.610593 0 0 1-29.589259-29.589259v-161.172931c0-16.319959 13.2693-29.589259 29.589259-29.589259h161.17293c16.319959 0 29.589259 13.2693 29.58926 29.589259v161.172931c0 16.319959-13.2693 29.589259-29.58926 29.589259z m-145.578302-45.183887h129.983675v-129.983675h-129.983675v129.983675zM560.618545 903.464408h-161.17293a29.610593 29.610593 0 0 1-29.58926-29.589259v-161.172931c0-16.319959 13.2693-29.589259 29.58926-29.589259h161.17293c16.319959 0 29.589259 13.2693 29.589259 29.589259v161.172931c0 16.319959-13.2693 29.589259-29.589259 29.589259z m-145.578303-45.183887h129.983675v-129.983675h-129.983675v129.983675z\"  ></path><path d=\"M948.03091 323.135192v-0.234666h-0.319999L519.530648 5.589319a27.946597 27.946597 0 0 0-33.514583 0L1.686609 378.196388l34.069248 44.138556 43.007893-32.938584v558.057271A76.458476 76.458476 0 0 0 155.862224 1023.99744h715.624877a76.565142 76.565142 0 0 0 76.543809-76.543809l-0.085333-454.548197a27.925264 27.925264 0 1 0-55.850527 0v115.903711c0 0.319999 0.085333 0.597332 0.085333 0.917331v337.727155a20.693282 20.693282 0 0 1-21.226614 20.117283H155.862224a20.671948 20.671948 0 0 1-21.226614-20.117283V346.644467L502.784023 64.810505l361.983095 265.791335v-0.405332l100.501082 73.386483v0.810665l25.215937 18.517287 31.850587-44.693222-74.303814-55.082529z\"  ></path></symbol><symbol id=\"icon-customization\" viewBox=\"0 0 1024 1024\"><path d=\"M845.162667 368.597333l-200-201.642666a25.728 25.728 0 0 0-18.56-7.786667c-6.912 0-13.674667 2.88-18.56 7.786667L217.109333 561.109333a26.197333 26.197333 0 0 0-7.744 18.709334c0 6.954667 2.858667 13.802667 7.744 18.709333l200.106667 201.642667c4.885333 5.034667 11.541333 7.786667 18.56 7.786666 6.912 0 13.674667-2.88 18.56-7.786666l390.826667-394.026667c10.24-10.432 10.24-27.221333 0-37.546667zM435.669333 743.786667l-162.752-164.074667 353.706667-356.608 162.752 164.096-353.706667 356.586667zM184.512 628.288a26.282667 26.282667 0 0 0-37.226667 0l-29.738666 29.866667a27.221333 27.221333 0 0 0-6.656 11.157333L27.114667 950.954667c-2.730667 9.365333-0.362667 19.306667 6.421333 26.282666 4.992 5.162667 11.776 7.914667 18.794667 7.914667 2.368 0 4.757333-0.234667 7.018666-0.96L343.466667 903.936c4.394667-1.322667 8.341333-3.605333 11.541333-6.826667l29.397333-29.632c10.24-10.432 10.24-27.221333 0-37.546666l-199.893333-201.642667z m138.133333 226.453333L91.242667 920.128l68.16-229.098667 6.421333-6.485333 162.752 164.202667-5.930667 5.994666zM873.237333 339.093333c4.885333 5.034667 11.541333 7.786667 18.56 7.786667 6.890667 0 13.674667-2.752 18.56-7.786667l56.874667-57.322666c20.949333-21.12 42.24-46.890667 42.24-79.04 0-32.149333-21.290667-57.941333-42.24-79.04l-80.426667-81.088C865.877333 21.461333 840.298667 0 808.405333 0 776.533333 0 750.933333 21.461333 730.005333 42.581333l-56.874666 57.450667a26.794667 26.794667 0 0 0 0 37.546667l200.106666 201.514666zM767.36 80.128c18.090667-18.112 31.530667-26.986667 41.173333-26.986667s23.082667 8.746667 41.173334 26.986667l80.426666 81.088c17.962667 18.24 26.773333 31.786667 26.773334 41.493333 0 9.706667-8.682667 23.274667-26.773334 41.493334l-38.314666 38.634666-162.752-164.096 38.293333-38.613333zM985.450667 654.314667l-142.293334-143.573334a23.424 23.424 0 0 0-17.493333-7.786666c-12.970667 0-23.552 10.666667-23.552 23.744 0 6.954667 2.965333 13.312 7.850667 17.621333l132.650666 133.738667c46.037333 46.421333 46.037333 74.133333 0 120.554666l-157.056 158.208-50.090666-50.496 66.624-67.178666c4.288-4.309333 7.018667-10.304 7.018666-16.917334a23.68 23.68 0 0 0-23.552-23.744c-6.549333 0-12.373333 2.645333-16.661333 6.954667l-66.752 67.285333 25.365333 25.578667-58.666666-59.157333 83.285333-83.968c4.288-4.309333 6.890667-10.197333 6.890667-16.789334a23.68 23.68 0 0 0-23.552-23.744c-6.549333 0-12.373333 2.645333-16.661334 6.954667l-83.285333 83.968-42.944-43.306667a23.36 23.36 0 0 0-16.896-7.189333c-12.970667 0-23.552 10.666667-23.552 23.744 0 6.592 2.624 12.48 6.890667 16.789333l193.088 194.794667L785.450667 1024l200-201.642667a119.488 119.488 0 0 0 0-168.042666zM229.717333 461.312c12.970667 0 23.552-10.666667 23.552-23.744 0-6.485333-2.624-12.352-6.784-16.682667l-25.941333-26.154666 82.794667-83.477334a23.808 23.808 0 0 0-16.170667-41.024c-6.549333 0-12.373333 2.645333-16.661333 6.954667L187.242667 361.173333l-33.301334-33.578666L203.797333 277.333333c4.394667-4.330667 7.018667-10.325333 7.018667-16.917333a23.68 23.68 0 0 0-23.552-23.744c-6.549333 0-12.48 2.752-16.768 7.082667l-49.856 50.261333-49.962667-50.368 156.928-158.208c46.037333-46.421333 73.536-46.421333 119.573334 0l116.117333 117.056 0.106667-0.128c4.288 4.202667 10.112 6.826667 16.533333 6.826667a23.701333 23.701333 0 0 0 14.4-42.453334l-123.733333-124.736a117.141333 117.141333 0 0 0-166.677334 0L4.053333 243.52l208.32 210.026667c4.266667 4.778667 10.453333 7.765333 17.344 7.765333z\"  ></path></symbol><symbol id=\"icon-inspection\" viewBox=\"0 0 1024 1024\"><path d=\"M973.482667 230.4c0-12.8-6.421333-19.2-19.221334-25.6L524.821333 0h-25.642666L69.738667 204.8c-6.421333 6.4-12.821333 12.8-19.242667 25.6-6.4 57.6-12.821333 166.4 12.821333 294.4 51.285333 236.8 198.698667 403.2 435.84 499.2H524.8c70.506667-32 134.592-64 192.277333-108.8 12.821333-12.8 19.221333-32 6.4-44.8-12.821333-12.8-32.042667-19.2-44.864-6.4-51.242667 38.4-102.528 70.4-166.613333 96-205.098667-89.6-339.712-236.8-384.576-448-25.642667-108.8-19.221333-198.4-12.821333-256L512 70.4 909.397333 256c6.4 57.6 12.821333 153.6-12.821333 256-6.4 38.4-19.221333 76.8-38.464 115.2-6.421333 19.2 0 32 19.221333 44.8 19.221333 6.4 32.042667 0 44.864-19.2 19.221333-38.4 32.042667-83.2 38.464-121.6 25.642667-134.4 19.221333-243.2 12.821334-300.8z\"  ></path><path d=\"M691.456 633.6c57.685333-83.2 51.285333-198.4-19.221333-268.8-83.328-83.2-211.52-83.2-294.826667 0-83.328 83.2-83.328 211.2 0 294.4 38.464 38.4 96.149333 64 147.413333 64 44.864 0 83.328-12.8 121.770667-38.4l128.192 128c6.4 6.4 12.821333 6.4 25.642667 6.4s19.221333 0 25.642666-6.4c12.821333-12.8 12.821333-32 0-44.8l-134.613333-134.4z m-64.085333-19.2c-57.685333 51.2-147.413333 51.2-205.098667 0-57.685333-57.6-57.685333-147.2 0-204.8 25.642667-25.6 64.085333-44.8 102.549333-44.8 38.464 0 76.906667 12.8 102.549334 44.8 57.685333 57.6 57.685333 147.2 0 204.8z\"  ></path></symbol><symbol id=\"icon-packing-labeling\" viewBox=\"0 0 1024 1024\"><path d=\"M495.744677 662.991042c0 13.311445 10.836882 24.212324 24.08433 24.212325h187.960168l-95.484021 94.524061a23.081705 23.081705 0 0 0 0 33.68393 23.679013 23.679013 0 0 0 34.025249 0l135.482355-134.095746c0.447981-0.383984 0.938628-0.703971 1.365276-1.13062 1.279947-1.301279 2.367901-2.687888 3.327862-4.117161 6.741052-9.5996 5.84509-22.783051-2.815883-30.270739a24.95896 24.95896 0 0 0-4.330486-3.413191l-132.538478-134.309071a23.252364 23.252364 0 0 0-33.790592 0 24.95896 24.95896 0 0 0 0 35.155869l95.164035 95.590683h-188.344152a24.148327 24.148327 0 0 0-24.105663 24.16966z\"  ></path><path d=\"M1016.064331 303.176701L835.058539 11.050206a24.468314 24.468314 0 0 0-22.420399-10.879546C812.019499 0.149327 811.443523 0 810.80355 0H211.575184c-10.111579 0-18.793884 6.357068-22.356401 15.295363L10.836882 303.176701a26.921545 26.921545 0 0 0-2.325237 5.055789 24.020332 24.020332 0 0 0-4.309153 13.716762v96.827966c0 13.311445 10.858214 24.212324 24.105662 24.212324 13.26878 0 24.105662-10.900879 24.105662-24.212324v-60.520145c0-7.253031 4.821132-12.095496 12.052831-12.095496h892.208158c7.231699 0 12.052831 4.842465 12.052831 12.095496v605.180117c0 7.253031-4.821132 12.095496-12.052831 12.095496H64.48798c-7.231699 0-12.052831-4.842465-12.052831-12.095496v-60.520145c0-13.311445-10.858214-24.212324-24.105663-24.212324-13.26878 0-24.105662 10.900879-24.105662 24.212324v96.827966c0 13.311445 10.858214 24.212324 24.105662 24.212324h964.546478c13.26878 0 24.105662-10.900879 24.105662-24.212324V327.879672a25.172284 25.172284 0 0 0-0.917295-24.702971z m-60.925462-5.439773H71.762343L226.251906 48.424649h574.3974l154.489563 249.312279z\"  ></path><path d=\"M36.883797 566.141744h337.223282a24.212324 24.212324 0 0 0 0-48.424649H36.883797a24.212324 24.212324 0 0 0 0 48.424649zM36.883797 687.182034h192.695971a24.212324 24.212324 0 0 0 0-48.424649H36.883797a24.212324 24.212324 0 0 0 0 48.424649zM36.883797 808.243657h72.252989a24.212324 24.212324 0 0 0 0-48.424649H36.883797a24.212324 24.212324 0 0 0 0 48.424649z\"  ></path></symbol><symbol id=\"icon-online-tracking\" viewBox=\"0 0 1024 1024\"><path d=\"M761.066667 127.04c-120.704 0-218.901333 99.776-218.901334 222.421333 0 88.362667 105.877333 227.562667 168.981334 302.677334a64.981333 64.981333 0 0 0 49.92 23.424h0.021333c19.242667 0 37.44-8.533333 49.92-23.402667 63.104-75.114667 169.002667-214.336 169.002667-302.698667-0.021333-122.645333-98.218667-222.421333-218.944-222.421333z m5.056 486.592c-2.346667 2.773333-7.744 2.752-10.048 0.021333-95.616-113.792-155.008-215.04-155.008-264.192 0-89.834667 71.786667-162.922667 160.021333-162.922666v0.021333c88.213333 0 160.021333 73.088 160.042667 162.922667 0 49.152-59.413333 150.378667-155.008 264.149333z\"  ></path><path d=\"M761.066667 233.941333a84.437333 84.437333 0 0 0-84.309334 84.330667 84.437333 84.437333 0 0 0 84.330667 84.309333h0.021333a84.501333 84.501333 0 0 0 84.288-84.330666 84.416 84.416 0 0 0-84.330666-84.309334z m0.021333 119.253334a34.944 34.944 0 0 1-0.021333-69.845334 35.029333 35.029333 0 0 1 34.944 34.922667c0 19.242667-15.658667 34.922667-34.922667 34.922667z\"  ></path><path d=\"M1024 179.029333V141.184c0-60.544-52.714667-113.514667-112.938667-113.514667H112.938667C52.714667 27.669333 0 80.64 0 141.184v560c0 60.544 52.714667 113.514667 112.938667 113.514667h798.122666c60.245333 0 112.938667-52.970667 112.938667-113.514667v-67.968c0-15.146667-15.061333-30.272-30.122667-30.272s-30.122667 7.573333-30.122666 30.272v67.968c0 30.272-22.592 52.970667-52.714667 52.970667H112.938667c-30.122667 0-52.714667-22.698667-52.714667-52.970667V141.184c0-30.272 22.592-52.970667 52.714667-52.970667h798.122666c30.122667 0 52.714667 22.698667 52.714667 52.970667v30.272c0 15.146667 15.061333 30.272 30.122667 30.272 15.04 0 30.101333-7.573333 30.101333-22.698667z\"  ></path><path d=\"M163.477333 649.002667h301.184c15.061333 0 30.122667-15.125333 30.122667-30.272 0-15.146667-15.061333-30.272-30.122667-30.272H163.477333c-15.061333 0-30.122667 15.125333-30.122666 30.272 0 15.146667 15.061333 30.272 30.122666 30.272zM335.082667 470.570667c15.061333 0 30.122667-15.125333 30.122666-30.272 0-15.125333-15.061333-30.272-30.122666-30.272H160.597333c-15.061333 0-30.122667 15.125333-30.122666 30.272 0 15.146667 15.061333 30.272 30.122666 30.272h174.485334zM813.184 935.786667H210.816c-15.061333 0-30.122667 15.125333-30.122667 30.272 0 15.146667 15.061333 30.272 30.122667 30.272h602.346667c15.061333 0 30.122667-15.125333 30.122666-30.272 0-15.146667-15.04-30.272-30.101333-30.272z\"  ></path></symbol><symbol id=\"icon-play-filling\" viewBox=\"0 0 1024 1024\"><path d=\"M374.272 333.312v355.328c0 30.208 20.992 40.448 45.568 26.112l288.768-175.104c25.088-15.872 25.088-40.448 0-54.784L419.84 309.76c-7.68-5.12-14.336-6.656-20.992-6.656-14.336-2.56-24.576 9.216-24.576 30.208zM1024 512c0 282.624-229.376 512-512 512S0 794.624 0 512 229.376 0 512 0s512 229.376 512 512z\"  ></path></symbol><symbol id=\"icon-nosound-filling\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0z m42.496 728.576c0 9.216-5.632 17.92-13.824 22.016-3.072 1.536-6.656 2.048-10.24 2.048-5.632 0-10.752-2.048-15.36-5.632l-137.728-114.688H266.24c-6.144 0-12.288-2.56-16.896-7.168-4.608-4.608-7.168-10.752-7.168-16.896l0.512-192.512c0-6.144 2.56-12.288 7.168-16.896 4.608-4.608 10.752-7.168 16.896-7.168l110.08 0.512 138.24-115.2c7.168-6.144 16.896-7.168 25.6-3.072 8.704 4.096 13.824 12.288 13.824 22.016v432.64z m243.2-166.4c10.24 10.24 10.24 26.112 0 36.352-5.12 5.12-11.776 7.68-17.92 7.68-6.656 0-13.312-2.56-17.92-7.68l-50.176-50.176-50.176 50.176c-5.12 5.12-11.264 7.68-17.92 7.68-6.656 0-13.312-2.56-17.92-7.68-10.24-10.24-10.24-26.112 0-36.352l50.176-50.176-50.176-50.176c-10.24-9.728-10.24-26.112 0-36.352 9.728-10.24 26.112-10.24 36.352 0l50.176 50.176 50.176-50.176c10.24-10.24 26.112-10.24 36.352 0 10.24 9.728 10.24 26.112 0 36.352l-51.2 50.176 50.176 50.176z\"  ></path></symbol><symbol id=\"icon-sound-filling\" viewBox=\"0 0 1024 1024\"><path d=\"M540.672 273.92c-8.192-4.096-18.432-2.56-25.6 3.072l-138.24 115.2-110.08-0.512c-6.144 0-12.288 2.56-16.896 7.168-4.608 4.608-7.168 10.752-7.168 16.896l-0.512 192.512c0 6.144 2.56 12.288 7.168 16.896 4.608 4.608 10.752 7.168 16.896 7.168h111.616l137.728 114.688c4.608 3.584 9.728 5.632 15.36 5.632 3.584 0 7.168-0.512 10.24-2.048 8.192-4.096 13.824-12.288 13.824-22.016V295.424c-0.512-9.216-5.632-17.408-14.336-21.504zM633.856 394.24c-11.776-5.632-26.112-0.512-31.744 11.264-5.632 11.776-1.024 26.112 10.752 32.256 1.536 1.024 37.376 19.456 37.376 72.704 0 56.832-33.792 75.776-34.816 76.288-11.776 6.144-16.896 20.48-10.752 32.256 4.096 8.192 12.8 13.312 21.504 13.312 3.584 0 7.168-1.024 10.752-2.56 2.56-1.024 61.44-31.744 61.44-119.296 0.512-84.992-61.952-115.2-64.512-116.224z m74.752-70.656c-11.264-7.168-25.6-4.096-33.28 7.168-7.168 11.264-4.096 26.112 7.168 33.28 2.56 1.536 64 43.52 64 147.968s-58.88 146.432-61.44 148.48c-11.264 7.168-13.824 22.528-6.656 33.28 4.608 7.168 12.288 10.752 19.968 10.752 4.608 0 9.216-1.536 13.312-4.096 3.584-2.048 82.944-56.832 82.944-188.416 0.512-132.096-82.432-186.368-86.016-188.416zM1024 512c0 282.624-229.376 512-512 512S0 794.624 0 512 229.376 0 512 0s512 229.376 512 512z\"  ></path></symbol><symbol id=\"icon-electrical-equipment\" viewBox=\"0 0 1024 1024\"><path d=\"M219.429 146.286v755.81a73.143 73.143 0 0 0 73.142 73.142h512v-755.81a73.143 73.143 0 0 0-73.142-73.142h-512z m170.666-48.762V56.88C390.095 27.063 408.137 0 436.151 0h151.698c28.038 0 46.056 27.063 46.056 56.88v40.644h97.524a121.905 121.905 0 0 1 121.904 121.905V1024H292.571a121.905 121.905 0 0 1-121.904-121.905V97.524h219.428z m48.762 0h146.286V56.88a20.431 20.431 0 0 0-1.536-8.12H440.393a20.431 20.431 0 0 0-1.536 8.12v40.643z m-48.762 482.06h208.799L462.019 790.016a24.381 24.381 0 0 0 40.863 26.575l161.401-248.076a24.381 24.381 0 0 0-20.455-37.693H433.664l123.49-201.118a24.381 24.381 0 1 0-41.546-25.503l-146.285 238.25a24.381 24.381 0 0 0 20.772 37.133z\"  ></path></symbol><symbol id=\"icon-home-appliances\" viewBox=\"0 0 1024 1024\"><path d=\"M243.81 48.762v853.333a73.143 73.143 0 0 0 73.142 73.143H780.19V121.905a73.143 73.143 0 0 0-73.142-73.143H243.81zM219.429 0h487.619a121.905 121.905 0 0 1 121.904 121.905v877.714a24.381 24.381 0 0 1-24.38 24.381h-487.62a121.905 121.905 0 0 1-121.904-121.905V24.381A24.381 24.381 0 0 1 219.428 0z m0 451.048a24.381 24.381 0 0 1 0-48.762h463.238a24.381 24.381 0 0 1 0 48.762H219.429z m121.904-268.19a24.381 24.381 0 1 1 48.762 0v97.523a24.381 24.381 0 0 1-48.762 0v-97.524z m0 414.475a24.381 24.381 0 0 1 48.762 0v121.905a24.381 24.381 0 0 1-48.762 0V597.333z\"  ></path></symbol><symbol id=\"icon-furniture\" viewBox=\"0 0 1024 1024\"><path d=\"M170.667 48.762V780.19a73.143 73.143 0 0 0 73.143 73.143h331.044a24.381 24.381 0 1 1 0 48.762H243.81A121.905 121.905 0 0 1 121.905 780.19V0H780.19a121.905 121.905 0 0 1 121.905 121.905v780.19H696.32a24.381 24.381 0 0 1 0-48.762h157.013V121.905a73.143 73.143 0 0 0-73.143-73.143H170.667z m534.479 955.928l-31.549-117.76c-8.411-31.402 38.693-44.007 47.104-12.629l31.549 117.76c8.411 31.403-38.693 44.032-47.104 12.63zM499.81 719.238V48.762h48.761v670.476h353.524V768H138.533v-48.762H499.81zM271.75 992.061l31.549-117.76c8.411-31.378 55.515-18.773 47.104 12.63l-31.549 117.76c-8.411 31.402-55.515 18.773-47.104-12.63z m362.155-541.013a24.381 24.381 0 0 1 0-48.762h48.762a24.381 24.381 0 0 1 0 48.762h-48.762z m-268.19 0a24.381 24.381 0 0 1 0-48.762h48.761a24.381 24.381 0 0 1 0 48.762h-48.762z\"  ></path></symbol><symbol id=\"icon-fashion-accessories\" viewBox=\"0 0 1024 1024\"><path d=\"M242.084 343.356a26.256 26.256 0 0 1 35.971 38.23 340.256 340.256 0 0 0-107.388 248.568c0 188.521 152.812 341.333 341.332 341.333s341.333-152.812 341.333-341.333c0-32.164-4.463-63.698-13.102-93.997a341.202 341.202 0 0 0-93.262-153.6 26.256 26.256 0 0 1 36.155-38.072A393.714 393.714 0 0 1 890.72 521.742c9.978 34.973 15.124 71.391 15.124 108.412 0 217.508-176.338 393.846-393.846 393.846-217.507 0-393.845-176.338-393.845-393.846 0-110.014 45.37-212.86 123.93-286.798z\"  ></path><path d=\"M347.897 52.514l-91.635 152.051L515.02 464.897l252.849-260.122-91.766-152.26H347.897zM333.062 0.002h357.875a26.256 26.256 0 0 1 22.475 12.708l109.883 182.298a26.256 26.256 0 0 1-3.65 31.849l-285.59 293.808a26.256 26.256 0 0 1-37.442 0.21L204.537 227.067a26.256 26.256 0 0 1-3.86-32.06L310.588 12.71A26.256 26.256 0 0 1 333.062 0.002zM223.18 236.519a26.256 26.256 0 1 1 0-52.513h551.384a26.256 26.256 0 0 1 0 52.513H223.18z m164.759-16.437a26.256 26.256 0 0 1-40.697-33.188L491.65 9.664a26.256 26.256 0 0 1 40.697 33.188l-144.41 177.23z m104.448-176.39a26.256 26.256 0 0 1 39.227-34.868l157.538 177.23a26.256 26.256 0 0 1-39.227 34.869L492.386 43.693zM345.193 236.86a26.256 26.256 0 0 1 44.793-27.359l144.41 236.307a26.256 26.256 0 1 1-44.793 27.36L345.193 236.86z m301.974-47.13a26.256 26.256 0 1 1 44.741 27.517l-157.538 256a26.256 26.256 0 1 1-44.741-27.517l157.538-256z\"  ></path></symbol><symbol id=\"icon-security-protection\" viewBox=\"0 0 1024 1024\"><path d=\"M512 799.22c-220.71 0-399.61-178.9-399.61-399.61S291.29 0 512 0s399.61 178.9 399.61 399.61S732.71 799.22 512 799.22z m0-49.952c193.111 0 349.659-156.547 349.659-349.658S705.11 49.95 512 49.95 162.341 206.498 162.341 399.61 318.89 749.268 512 749.268zM335.422 961.561h377.282l-71.056-97.705a24.976 24.976 0 0 1 40.41-29.37l88.14 121.18a25.475 25.475 0 0 1 3.172 5.895h88.289a24.976 24.976 0 0 1 0 49.951H162.34a24.976 24.976 0 0 1 0-49.951h111.941l142.386-201.728a24.976 24.976 0 0 1 40.81 28.822L335.422 961.56zM512 574.439a174.83 174.83 0 1 1 0-349.659 174.83 174.83 0 0 1 0 349.659z m0-49.951a124.878 124.878 0 1 0 0-249.756 124.878 124.878 0 0 0 0 249.756z m0-349.659a37.463 37.463 0 1 1 0-74.927 37.463 37.463 0 0 1 0 74.927z\"  ></path></symbol><symbol id=\"icon-textile-products\" viewBox=\"0 0 1024 1024\"><path d=\"M733.71 836.398V125.453a72.94 72.94 0 0 0-72.915-72.94H91.897v841.675a72.94 72.94 0 0 0 72.94 72.914h767.266v-745.21c0-38.596-32.48-70.182-72.94-70.182h-72.941v697.002h-1.103c-6.721 36.917-43.323 63.54-85.622 63.54H215.565c-46.894 0-86.751-32.689-86.751-75.88V705.51c0-47.367 38.964-85.57 86.751-85.57h383.081c47.787 0 86.751 38.203 86.751 85.57 0 47.366-38.964 85.543-86.75 85.543H252.874a26.256 26.256 0 0 1 0-52.513h345.771c19.036 0 34.239-14.913 34.239-33.03s-15.23-33.057-34.239-33.057H215.591c-19.01 0-34.238 14.914-34.238 33.057v130.888c0 11.605 14.31 23.342 34.238 23.342h483.906c19.929 0 34.212-11.737 34.212-23.368z m26.256 183.217H164.838A125.453 125.453 0 0 1 39.385 894.188V0h621.41a125.506 125.506 0 0 1 122.696 99.197h75.671c69.133 0 125.453 54.744 125.453 122.67v797.722h-224.65z\"  ></path></symbol><symbol id=\"icon-tools-hardware\" viewBox=\"0 0 1024 1024\"><path d=\"M344.792 518.575L303.4 477.184a26.947 26.947 0 0 1 38.13-38.13l60.174 60.173a26.947 26.947 0 0 1 0.27 37.834L114.392 833.16a26.947 26.947 0 0 0 0.27 37.834l68.984 68.958a26.947 26.947 0 0 0 38.077 0l291.301-291.3a26.947 26.947 0 0 1 38.104 0l146.324 146.323a26.947 26.947 0 1 1-38.104 38.13L532.076 705.833 259.853 978.055a80.842 80.842 0 0 1-114.337 0L76.53 909.096a80.842 80.842 0 0 1-0.809-113.475l269.043-277.046z m473.546 155.54a26.947 26.947 0 1 1-38.104 38.104L597.288 529.273a26.947 26.947 0 0 1 0-38.103l148.13-148.103a26.947 26.947 0 0 1 15.36-7.653l88.603-12.18 89.627-170.927-56.697-60.39-167.37 97.254-16.546 85.53a26.947 26.947 0 0 1-7.384 13.96l-148.13 148.102a26.947 26.947 0 0 1-38.103 0l-77.474-77.474a26.947 26.947 0 1 1 38.104-38.103l58.422 58.422 123.23-123.23 17.273-89.466a26.947 26.947 0 0 1 12.935-18.19l196.5-114.175a26.947 26.947 0 0 1 33.173 4.85l84.48 90.004a26.947 26.947 0 0 1 4.203 30.963l-104.96 200.165a26.947 26.947 0 0 1-20.21 14.201l-93.346 12.854-122.637 122.637 163.867 163.894z\"  ></path><path d=\"M610.816 784.573a26.947 26.947 0 0 1 38.104-38.104l52.089 52.09a26.947 26.947 0 0 1-38.104 38.103l-52.089-52.09zM368.371 543.42a26.947 26.947 0 1 1 37.995-38.185L705.671 803.22a26.947 26.947 0 0 1 7.814 21.45 111.373 111.373 0 0 0 31.475 87.471 107.79 107.79 0 1 0 68.662-183.727c-2.129 0.135-3.934 0.081-5.578-0.054a26.947 26.947 0 0 1-19.537-7.868L485.24 417.954a26.947 26.947 0 1 1 38.05-38.158l295.181 294.481A161.684 161.684 0 1 1 706.83 950.272a165.16 165.16 0 0 1-47.642-117.275L368.37 543.421z\"  ></path><path d=\"M783.076 874.036a53.895 53.895 0 1 0 76.22-76.219 53.895 53.895 0 1 0-76.22 76.219zM421.807 588.989a26.947 26.947 0 0 1 38.104 38.13L221.723 865.28a26.947 26.947 0 1 1-38.104-38.104L421.807 588.99z m81.597-229.808a26.947 26.947 0 1 1-38.104 38.104l-37.996-37.996a26.947 26.947 0 0 1-5.847-29.345c0.808-1.914 1.05-2.426 3.368-7.06l0.189-0.432c0.754-1.509 1.24-2.506 1.159-2.263a188.632 188.632 0 0 0-43.601-198.818 187.877 187.877 0 0 0-129.698-55.215 189.736 189.736 0 0 0-73.135 13.15l-2.506 0.97-1.752 0.728a26.947 26.947 0 0 1-21.073-49.61c1.887-0.809 1.887-0.809 3.423-1.402l2.102-0.808a242.068 242.068 0 0 1 93.992-16.896 241.772 241.772 0 0 1 166.723 70.98 242.526 242.526 0 0 1 57.722 250.88l25.007 25.033zM25.869 160.013a26.947 26.947 0 0 1 49.61 21.02 187.284 187.284 0 0 0-14.74 65.374 188.039 188.039 0 0 0 55.054 141.743 188.632 188.632 0 0 0 44.463 33.037 26.947 26.947 0 1 1-25.411 47.536 242.526 242.526 0 0 1-57.129-42.47A241.907 241.907 0 0 1 6.9 244.035a243.443 243.443 0 0 1 18.97-84.022z m224.337 337.274a26.947 26.947 0 0 1-0.215-53.895 189.17 189.17 0 0 0 61.79-10.644c4.366-1.51 7.168-2.21 10.94-1.563a26.947 26.947 0 0 1 18.81 7.895l33.145 33.146a26.947 26.947 0 0 1-38.103 38.13l-21.99-22.016a243.308 243.308 0 0 1-64.377 8.947z\"  ></path><path d=\"M148.48 77.824a26.947 26.947 0 1 1 38.104-38.104l161.792 161.82a26.947 26.947 0 0 1 7.087 25.6l-22.986 91.35a26.947 26.947 0 0 1-19.564 19.565L221.56 361.04a26.947 26.947 0 0 1-25.6-7.06L30.343 188.362a26.947 26.947 0 1 1 38.13-38.103L223.26 305.044l60.901-15.306 15.306-60.9L148.48 77.823z\"  ></path></symbol><symbol id=\"icon-office-supplies\" viewBox=\"0 0 1024 1024\"><path d=\"M832.122 46.348H128v857.454c0 18.53 6.754 36.279 18.749 49.347a61.001 61.001 0 0 0 45.105 20.358h645.778c11.776 0 21.333 10.386 21.333 23.186s-9.557 23.162-21.333 23.162H191.854c-58.88 0-106.52-51.931-106.52-116.053V0h746.788c58.758 0 106.545 52.029 106.545 115.81v761.417c0 12.8-9.533 23.162-21.334 23.162S896 890.027 896 877.227V115.81c0-38.205-28.696-69.462-63.878-69.462zM256 170.667v195.047h512V170.667H256z m560.762-48.762v292.571H207.238V121.905h609.524zM768 560.762h-48.762v292.571H768V560.762z m48.762 0v292.571A48.762 48.762 0 0 1 768 902.095h-48.762a48.762 48.762 0 0 1-48.762-48.762V560.762A48.762 48.762 0 0 1 719.238 512H768a48.762 48.762 0 0 1 48.762 48.762zM256 572.952a24.381 24.381 0 0 1 0-48.762h97.524a24.381 24.381 0 0 1 0 48.762H256z m219.429 0a24.381 24.381 0 0 1 0-48.762h97.523a24.381 24.381 0 0 1 0 48.762H475.43zM256 719.238a24.381 24.381 0 0 1 0-48.762h97.524a24.381 24.381 0 0 1 0 48.762H256z m219.429 0a24.381 24.381 0 0 1 0-48.762h97.523a24.381 24.381 0 0 1 0 48.762H475.43zM256 865.524a24.381 24.381 0 0 1 0-48.762h97.524a24.381 24.381 0 0 1 0 48.762H256z m219.429 0a24.381 24.381 0 0 1 0-48.762h97.523a24.381 24.381 0 0 1 0 48.762H475.43zM664.38 201.143h36.571v121.905h-36.571V201.143z\"  ></path></symbol><symbol id=\"icon-vehicles\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.23 794.77 0 512 0S0 229.23 0 512s229.23 512 512 512c117.419 0 228.815-39.668 318.757-111.323a24.966 24.966 0 1 0-31.11-39.059A459.922 459.922 0 0 1 512 974.068C256.829 974.043 49.957 767.147 49.957 512 49.957 256.829 256.829 49.957 512 49.957S974.043 256.829 974.043 512c0 87.503-24.332 171.325-69.583 243.956a24.966 24.966 0 0 0 42.423 26.429A509.66 509.66 0 0 0 1024 512z\"  ></path><path d=\"M512 877.714c-201.972 0-365.714-163.742-365.714-365.714S310.028 146.286 512 146.286 877.714 310.028 877.714 512 713.972 877.714 512 877.714z m0-48.762c175.055 0 316.952-141.897 316.952-316.952S687.055 195.048 512 195.048 195.048 336.945 195.048 512 336.945 828.952 512 828.952zM420.669 431.25a121.783 121.783 0 0 1 67.048-38.741 24.674 24.674 0 0 1-0.098-2.414V195.048a24.381 24.381 0 0 1 48.762 0v195.047c0 0.805-0.049 1.61-0.122 2.414 26.478 5.364 49.835 19.26 67.072 38.766a22.74 22.74 0 0 1 2.048-1.341L774.29 332.41a24.381 24.381 0 0 1 24.381 42.228L629.76 472.162a24.674 24.674 0 0 1-2.146 1.097 122.054 122.054 0 0 1 6.29 38.741c0 13.531-2.194 26.575-6.29 38.741 0.732 0.317 1.463 0.683 2.146 1.097l168.911 97.524a24.381 24.381 0 1 1-24.38 42.228l-168.912-97.524a24.674 24.674 0 0 1-2.048-1.316 121.783 121.783 0 0 1-67.048 38.741c0.05 0.805 0.098 1.61 0.098 2.414v195.047a24.381 24.381 0 0 1-48.762 0V633.905c0-0.805 0.049-1.61 0.122-2.414a121.783 121.783 0 0 1-67.072-38.766 22.74 22.74 0 0 1-2.048 1.341L249.71 691.59a24.381 24.381 0 0 1-24.381-42.228l168.911-97.524c0.707-0.414 1.414-0.78 2.146-1.097a121.783 121.783 0 0 1-6.29-38.741c0-13.531 2.194-26.575 6.29-38.741a24.674 24.674 0 0 1-2.146-1.097l-168.911-97.524a24.381 24.381 0 1 1 24.38-42.228l168.912 97.524c0.731 0.414 1.39 0.853 2.048 1.316zM512 585.143a73.143 73.143 0 1 0 0-146.286 73.143 73.143 0 0 0 0 146.286z\"  ></path></symbol><symbol id=\"icon-all\" viewBox=\"0 0 1024 1024\"><path d=\"M460.8 486.4 486.4 486.4 486.4 460.8 486.4 243.2C486.4 108.884349 377.51565 0 243.2 0 108.884349 0 0 108.884349 0 243.2 0 377.51565 108.884349 486.4 243.2 486.4L460.8 486.4ZM51.2 243.2C51.2 137.161328 137.161328 51.2 243.2 51.2 349.238671 51.2 435.2 137.161328 435.2 243.2L435.2 460.8 460.8 435.2 243.2 435.2C137.161328 435.2 51.2 349.238671 51.2 243.2Z\"  ></path><path d=\"M460.8 588.8 435.2 563.2 435.2 780.8C435.2 886.838671 349.238671 972.8 243.2 972.8 137.161328 972.8 51.2 886.838671 51.2 780.8 51.2 674.761329 137.161328 588.8 243.2 588.8L460.8 588.8ZM0 780.8C0 915.11565 108.884349 1024 243.2 1024 377.51565 1024 486.4 915.11565 486.4 780.8L486.4 563.2 486.4 537.6 460.8 537.6 243.2 537.6C108.884349 537.6 0 646.48435 0 780.8Z\"  ></path><path d=\"M563.2 435.2 588.8 460.8 588.8 243.2C588.8 137.161328 674.761329 51.2 780.8 51.2 886.838671 51.2 972.8 137.161328 972.8 243.2 972.8 349.238671 886.838671 435.2 780.8 435.2L563.2 435.2ZM1024 243.2C1024 108.884349 915.11565 0 780.8 0 646.48435 0 537.6 108.884349 537.6 243.2L537.6 460.8 537.6 486.4 563.2 486.4 780.8 486.4C915.11565 486.4 1024 377.51565 1024 243.2Z\"  ></path><path d=\"M1024 780.8C1024 646.48435 915.11565 537.6 780.8 537.6L563.2 537.6 537.6 537.6 537.6 563.2 537.6 780.8C537.6 915.11565 646.48435 1024 780.8 1024 818.513163 1024 855.051123 1015.390662 888.179087 999.065099 900.861235 992.815296 906.075682 977.467919 899.825882 964.785773 893.576079 952.103625 878.228702 946.889178 865.546554 953.138978 839.420429 966.014014 810.620764 972.8 780.8 972.8 674.761329 972.8 588.8 886.838671 588.8 780.8L588.8 563.2 563.2 588.8 780.8 588.8C886.838671 588.8 972.8 674.761329 972.8 780.8 972.8 799.469549 970.142607 817.755731 964.968006 835.279443 960.963957 848.839106 968.71031 863.07731 982.269973 867.081361 995.829636 871.085412 1010.06784 863.339057 1014.071891 849.779394 1020.63305 827.560122 1024 804.391296 1024 780.8Z\"  ></path></symbol><symbol id=\"icon-back\" viewBox=\"0 0 1024 1024\"><path d=\"M363.840919 472.978737C336.938714 497.358861 337.301807 537.486138 364.730379 561.486138L673.951902 832.05497C682.818816 839.813519 696.296418 838.915012 704.05497 830.048098 711.813519 821.181184 710.915012 807.703582 702.048098 799.94503L392.826577 529.376198C384.59578 522.174253 384.502227 511.835287 392.492414 504.59418L702.325747 223.807723C711.056111 215.895829 711.719614 202.404616 703.807723 193.674252 695.895829 184.943889 682.404617 184.280386 673.674253 192.192278L363.840919 472.978737Z\"  ></path></symbol><symbol id=\"icon-cart\" viewBox=\"0 0 1024 1024\"><path d=\"M235.097303 699.133018C247.384597 735.582848 286.382106 763.623932 324.772759 763.623932L861.658537 763.623932 880.429732 763.623932 885.649214 745.458146 1009.08775 315.845043C1021.388907 273.032339 993.187631 235.213675 949.051586 235.213675L424.585365 235.213675C410.791718 235.213675 399.609756 246.479262 399.609756 260.376068 399.609756 274.272875 410.791718 285.538462 424.585365 285.538462L949.051586 285.538462C959.924 285.538462 964.161052 291.220461 961.106394 301.851829L837.667859 731.464932 861.658537 713.299145 324.772759 713.299145C307.742153 713.299145 287.789837 698.952471 282.395194 682.949451L73.600164 63.566336C69.16437 50.407706 54.980454 43.363344 41.919502 47.832313 28.858551 52.301281 21.86648 66.591273 26.302275 79.749903L235.097303 699.133018Z\"  ></path><path d=\"M399.609756 902.017094C399.609756 846.429871 354.881911 801.367522 299.707317 801.367522 244.532723 801.367522 199.804878 846.429871 199.804878 902.017094 199.804878 957.604318 244.532723 1002.666667 299.707317 1002.666667 354.881911 1002.666667 399.609756 957.604318 399.609756 902.017094ZM249.756098 902.017094C249.756098 874.223482 272.120021 851.692307 299.707317 851.692307 327.294613 851.692307 349.658537 874.223482 349.658537 902.017094 349.658537 929.810705 327.294613 952.341879 299.707317 952.341879 272.120021 952.341879 249.756098 929.810705 249.756098 902.017094Z\"  ></path><path d=\"M924.097562 902.017094C924.097562 846.429871 879.369715 801.367522 824.195121 801.367522 769.020529 801.367522 724.292683 846.429871 724.292683 902.017094 724.292683 957.604318 769.020529 1002.666667 824.195121 1002.666667 879.369715 1002.666667 924.097562 957.604318 924.097562 902.017094ZM774.243902 902.017094C774.243902 874.223482 796.607825 851.692307 824.195121 851.692307 851.782419 851.692307 874.146342 874.223482 874.146342 902.017094 874.146342 929.810705 851.782419 952.341879 824.195121 952.341879 796.607825 952.341879 774.243902 929.810705 774.243902 902.017094Z\"  ></path></symbol><symbol id=\"icon-category\" viewBox=\"0 0 1024 1024\"><path d=\"M134.095238 256C147.560466 256 158.476191 246.448741 158.476191 234.666667 158.476191 222.884592 147.560466 213.333333 134.095238 213.333333L36.571428 213.333333C23.1062 213.333333 12.190476 222.884592 12.190476 234.666667 12.190476 246.448741 23.1062 256 36.571428 256L134.095238 256Z\"  ></path><path d=\"M134.095238 533.333333C147.560466 533.333333 158.476191 523.782074 158.476191 512 158.476191 500.217926 147.560466 490.666667 134.095238 490.666667L36.571428 490.666667C23.1062 490.666667 12.190476 500.217926 12.190476 512 12.190476 523.782074 23.1062 533.333333 36.571428 533.333333L134.095238 533.333333Z\"  ></path><path d=\"M134.095238 810.666667C147.560466 810.666667 158.476191 801.115407 158.476191 789.333333 158.476191 777.55126 147.560466 768 134.095238 768L36.571428 768C23.1062 768 12.190476 777.55126 12.190476 789.333333 12.190476 801.115407 23.1062 810.666667 36.571428 810.666667L134.095238 810.666667Z\"  ></path><path d=\"M987.428572 256C1000.893801 256 1011.809523 246.448741 1011.809523 234.666667 1011.809523 222.884592 1000.893801 213.333333 987.428572 213.333333L280.380951 213.333333C266.915725 213.333333 256 222.884592 256 234.666667 256 246.448741 266.915725 256 280.380951 256L987.428572 256Z\"  ></path><path d=\"M993.52381 533.333333C1006.989037 533.333333 1017.904762 523.782074 1017.904762 512 1017.904762 500.217926 1006.989037 490.666667 993.52381 490.666667L286.47619 490.666667C273.010963 490.666667 262.095238 500.217926 262.095238 512 262.095238 523.782074 273.010963 533.333333 286.47619 533.333333L993.52381 533.333333Z\"  ></path><path d=\"M996.571428 810.666667C1010.036657 810.666667 1020.952382 801.115407 1020.952382 789.333333 1020.952382 777.55126 1010.036657 768 996.571428 768L289.52381 768C276.058581 768 265.142857 777.55126 265.142857 789.333333 265.142857 801.115407 276.058581 810.666667 289.52381 810.666667L996.571428 810.666667Z\"  ></path></symbol><symbol id=\"icon-close\" viewBox=\"0 0 1024 1024\"><path d=\"M176.661601 817.172881C168.472798 825.644055 168.701706 839.149636 177.172881 847.338438 185.644056 855.527241 199.149636 855.298332 207.338438 846.827157L826.005105 206.827157C834.193907 198.355983 833.964998 184.850403 825.493824 176.661601 817.02265 168.472798 803.517069 168.701706 795.328267 177.172881L176.661601 817.172881Z\"  ></path><path d=\"M795.328267 846.827157C803.517069 855.298332 817.02265 855.527241 825.493824 847.338438 833.964998 839.149636 834.193907 825.644055 826.005105 817.172881L207.338438 177.172881C199.149636 168.701706 185.644056 168.472798 177.172881 176.661601 168.701706 184.850403 168.472798 198.355983 176.661601 206.827157L795.328267 846.827157Z\"  ></path></symbol><symbol id=\"icon-comments\" viewBox=\"0 0 1024 1024\"><path d=\"M131.253515 789.333333C87.810305 789.333333 52.51282 753.473975 52.51282 709.41763L52.51282 69.333333 26.25641 96 892.853331 96C936.231586 96 971.487179 131.853286 971.487179 175.915703L971.487179 816 997.74359 789.333333 525.128205 789.333333 517.234323 789.333333 510.649171 793.754413 285.912493 944.636066C273.815607 952.757562 270.491629 969.301024 278.488179 981.586923 286.484727 993.872821 302.773675 997.248736 314.87056 989.127241L539.607238 838.245587 525.128205 842.666667 997.74359 842.666667 1024 842.666667 1024 816 1024 175.915703C1024 102.41369 965.24899 42.666667 892.853331 42.666667L26.25641 42.666667 0 42.666667 0 69.333333 0 709.41763C0 782.925715 58.804881 842.666667 131.253515 842.666667L268.117303 842.666667C282.618319 842.666667 294.373713 830.727593 294.373713 816 294.373713 801.272407 282.618319 789.333333 268.117303 789.333333L131.253515 789.333333Z\"  ></path><path d=\"M367.589743 442.666667C367.589743 383.756294 320.568162 336 262.564102 336 204.560043 336 157.538461 383.756294 157.538461 442.666667 157.538461 501.577039 204.560043 549.333333 262.564102 549.333333 320.568162 549.333333 367.589743 501.577039 367.589743 442.666667ZM210.051282 442.666667C210.051282 413.211479 233.562074 389.333333 262.564102 389.333333 291.566133 389.333333 315.076924 413.211479 315.076924 442.666667 315.076924 472.121854 291.566133 496 262.564102 496 233.562074 496 210.051282 472.121854 210.051282 442.666667Z\"  ></path><path d=\"M630.153845 442.666667C630.153845 383.756294 583.132265 336 525.128205 336 467.124145 336 420.102564 383.756294 420.102564 442.666667 420.102564 501.577039 467.124145 549.333333 525.128205 549.333333 583.132265 549.333333 630.153845 501.577039 630.153845 442.666667ZM472.615386 442.666667C472.615386 413.211479 496.126176 389.333333 525.128205 389.333333 554.130236 389.333333 577.641026 413.211479 577.641026 442.666667 577.641026 472.121854 554.130236 496 525.128205 496 496.126176 496 472.615386 472.121854 472.615386 442.666667Z\"  ></path><path d=\"M892.717948 442.666667C892.717948 383.756294 845.696367 336 787.692307 336 729.688247 336 682.666667 383.756294 682.666667 442.666667 682.666667 501.577039 729.688247 549.333333 787.692307 549.333333 845.696367 549.333333 892.717948 501.577039 892.717948 442.666667ZM735.179488 442.666667C735.179488 413.211479 758.690278 389.333333 787.692307 389.333333 816.694338 389.333333 840.205129 413.211479 840.205129 442.666667 840.205129 472.121854 816.694338 496 787.692307 496 758.690278 496 735.179488 472.121854 735.179488 442.666667Z\"  ></path></symbol><symbol id=\"icon-cry\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512Z\"  ></path><path d=\"M337.170731 499.512194C371.654852 499.512194 399.609756 471.557291 399.609756 437.073171 399.609756 402.58905 371.654852 374.634146 337.170731 374.634146 302.686611 374.634146 274.731708 402.58905 274.731708 437.073171 274.731708 471.557291 302.686611 499.512194 337.170731 499.512194ZM711.804879 499.512194C746.288998 499.512194 774.243902 471.557291 774.243902 437.073171 774.243902 402.58905 746.288998 374.634146 711.804879 374.634146 677.320757 374.634146 649.365854 402.58905 649.365854 437.073171 649.365854 471.557291 677.320757 499.512194 711.804879 499.512194Z\"  ></path><path d=\"M352.788105 704.784525C396.165222 670.082831 453.151987 649.360371 524.487806 649.360371 595.823622 649.360371 652.810387 670.082831 696.187505 704.784525 722.700531 725.994946 738.882517 747.570927 746.631548 763.068988 752.800254 775.406402 747.799529 790.408576 735.462114 796.577284 723.124702 802.74599 708.122526 797.745265 701.953818 785.407851 701.03616 783.572535 698.492224 779.382524 694.165854 773.614029 686.602473 763.529523 676.927317 753.345148 664.983226 743.789875 630.311565 716.052544 584.273939 699.31159 524.487806 699.31159 464.70167 699.31159 418.664045 716.052544 383.992384 743.789875 372.048292 753.345148 362.373137 763.529523 354.809756 773.614029 350.483386 779.382524 347.93945 783.572535 347.021792 785.407851 340.853084 797.745265 325.850908 802.74599 313.513495 796.577284 301.176081 790.408576 296.175356 775.406402 302.344062 763.068988 310.093092 747.570927 326.275078 725.994946 352.788105 704.784525Z\"  ></path></symbol><symbol id=\"icon-delete\" viewBox=\"0 0 1024 1024\"><path d=\"M972.657609 209.348408C987.158609 209.36839 998.930114 197.571202 998.949999 182.99865 998.969882 168.426097 987.230618 156.59651 972.729617 156.576528L32.457975 155.280806C17.956974 155.260823 6.18547 167.058012 6.165585 181.630564 6.1457 196.203116 17.884965 208.032703 32.385966 208.052686L972.657609 209.348408Z\"  ></path><path d=\"M180.466902 992.356169 180.466902 1019.014859 206.993296 1018.74074 833.361858 1012.267947 859.348284 1011.999407 859.348284 985.883377 859.348284 289.397297C859.348284 274.824732 847.59289 263.011332 833.091874 263.011332 818.590859 263.011332 806.835465 274.824732 806.835465 289.397297L806.835465 985.883377 832.82189 959.498805 206.453329 965.971599 232.979723 992.356169 232.979723 282.67005C232.979723 268.097483 221.224329 256.284085 206.723313 256.284085 192.222298 256.284085 180.466902 268.097483 180.466902 282.67005L180.466902 992.356169Z\"  ></path><path d=\"M656.410257 847.079027C656.410257 861.651593 668.165651 873.464992 682.666667 873.464992 697.167682 873.464992 708.923076 861.651593 708.923076 847.079027L708.923076 372.131659C708.923076 357.559091 697.167682 345.745694 682.666667 345.745694 668.165651 345.745694 656.410257 357.559091 656.410257 372.131659L656.410257 847.079027Z\"  ></path><path d=\"M341.333333 847.079027C341.333333 861.651593 353.08873 873.464992 367.589743 873.464992 382.090758 873.464992 393.846155 861.651593 393.846155 847.079027L393.846155 372.131659C393.846155 357.559091 382.090758 345.745694 367.589743 345.745694 353.08873 345.745694 341.333333 357.559091 341.333333 372.131659L341.333333 847.079027Z\"  ></path><path d=\"M498.871795 847.079027C498.871795 861.651593 510.627189 873.464992 525.128205 873.464992 539.62922 873.464992 551.384614 861.651593 551.384614 847.079027L551.384614 372.131659C551.384614 357.559091 539.62922 345.745694 525.128205 345.745694 510.627189 345.745694 498.871795 357.559091 498.871795 372.131659L498.871795 847.079027Z\"  ></path><path d=\"M392.147755 116.721777C392.147755 102.063669 403.758665 90.363507 418.40134 90.363507L622.925796 90.363507C637.408947 90.363507 649.179381 102.1619 649.179381 116.549585L649.179381 171.644875 701.692203 171.644875 701.692203 116.549585C701.692203 72.986607 666.38105 37.591577 622.925796 37.591577L418.40134 37.591577C374.724427 37.591577 339.634933 72.950804 339.634933 116.721777L339.634933 165.310801 392.147755 165.310801 392.147755 116.721777Z\"  ></path></symbol><symbol id=\"icon-edit\" viewBox=\"0 0 1024 1024\"><path d=\"M34.155089 230.940227 9.17948 230.940227 9.17948 256.203386 9.17948 854.158012C9.17948 923.769568 65.248004 980.289737 134.081773 980.289737L927.938515 980.289737 952.914125 980.289737 952.914125 955.026579 952.914125 471.100561C952.914125 457.148105 941.732164 445.837402 927.938515 445.837402 914.144868 445.837402 902.962906 457.148105 902.962906 471.100561L902.962906 955.026579 927.938515 929.76342 134.081773 929.76342C92.797081 929.76342 59.130699 895.825847 59.130699 854.158012L59.130699 256.203386 34.155089 281.466543 598.93821 281.466543C612.731859 281.466543 623.91382 270.155842 623.91382 256.203386 623.91382 242.250928 612.731859 230.940227 598.93821 230.940227L34.155089 230.940227Z\"  ></path><path d=\"M437.016339 593.503789 431.876019 600.104892 431.668623 608.505214 427.984924 757.709741 427.077935 794.446421 461.312335 782.146455 605.005395 730.519447 611.980762 728.013291 616.479561 722.067243 1003.181673 210.964228 1018.529978 190.678421 998.306108 175.379305 869.49174 77.932781 849.985487 63.176536 834.913446 82.53177 437.016339 593.503789ZM839.575373 118.395018 968.389739 215.841542 963.514174 180.256619 576.81206 691.359633 588.286225 682.907428 444.593165 734.534436 477.920574 758.971151 481.604275 609.766622 476.256559 624.768047 874.153664 113.79603 839.575373 118.395018Z\"  ></path><path d=\"M891.217762 310.505713 920.474916 269.553252 808.309143 187.564266 779.051989 228.516725 891.217762 310.505713Z\"  ></path></symbol><symbol id=\"icon-email\" viewBox=\"0 0 1024 1024\"><path d=\"M972.8 934.274509 998.4 908.54902 127.868001 908.54902C85.502225 908.54902 51.2 874.019706 51.2 831.263017L51.2 111.058823 25.6 136.784314 896.131998 136.784314C938.452011 136.784314 972.8 171.324278 972.8 213.860934L972.8 278.566694C972.8 292.77449 984.26151 304.292183 998.4 304.292183 1012.53849 304.292183 1024 292.77449 1024 278.566694L1024 213.860934C1024 142.916556 966.736828 85.333333 896.131998 85.333333L25.6 85.333333 0 85.333333 0 111.058823 0 831.263017C0 902.415639 57.205646 960 127.868001 960L998.4 960 1024 960 1024 934.274509 1024 457.69849C1024 443.490694 1012.53849 431.973001 998.4 431.973001 984.26151 431.973001 972.8 443.490694 972.8 457.69849L972.8 934.274509Z\"  ></path><path d=\"M512.651558 567.164817C520.64791 572.874498 531.187889 573.490406 539.788919 568.750601L1002.624789 313.693694C1015.021598 306.862133 1019.560139 291.225196 1012.761901 278.767619 1005.963665 266.310041 990.403006 261.749254 978.006197 268.580816L515.170327 523.637722 542.307689 525.223505 194.028065 276.539467C182.502788 268.310009 166.520953 271.027598 158.331639 282.609372 150.142325 294.191146 152.846657 310.251322 164.371935 318.480781L512.651558 567.164817Z\"  ></path></symbol><symbol id=\"icon-favorite\" viewBox=\"0 0 1024 1024\"><path d=\"M471.86368 72.097804C485.674955 41.934476 493.044868 42.004821 506.088062 72.343455L619.745431 336.711942C625.163575 349.314613 639.967742 355.221257 652.81146 349.9048 665.655179 344.588341 671.674797 330.062018 666.256653 317.459345L552.599283 53.090859C522.392994-17.169354 457.679046-17.787043 425.817282 51.79791L306.603706 312.156098C300.890827 324.632819 306.56746 339.291488 319.282822 344.89715 331.998182 350.50281 346.937225 344.932715 352.650101 332.455991L471.86368 72.097804ZM946.32909 396.483296C979.832725 400.051098 982.041973 406.950494 956.666908 428.497651L735.550581 616.257899C725.009777 625.208591 723.85952 640.849199 732.981408 651.192177 742.103296 661.535153 758.043057 662.663823 768.583861 653.713133L989.700188 465.952885C1048.465438 416.052555 1029.066423 355.470148 951.775584 347.23945L662.585148 316.443567C648.726743 314.967787 636.273047 324.79504 634.769039 338.393355 633.265033 351.991667 643.28025 364.211635 657.138652 365.687415L946.32909 396.483296ZM789.29175 946.034577C796.186861 978.402929 790.182336 982.596644 761.456491 965.574886L511.141715 817.248614C499.208996 810.177775 483.693933 813.937557 476.487851 825.646327 469.281769 837.355095 473.113466 852.578978 485.046185 859.649818L735.36096 1007.97609C801.886172 1047.396203 854.610867 1010.571904 838.704265 935.9001L779.188324 656.509011C776.336237 643.120205 762.962797 634.535115 749.317907 637.333673 735.673018 640.132233 726.923723 653.254684 729.775808 666.643488L789.29175 946.034577ZM232.773805 963.365201C203.531582 979.802142 197.611334 975.494605 205.23285 943.427422L271.646138 663.996497C274.812115 650.675787 266.373538 637.358852 252.798046 634.252292 239.222554 631.145732 225.65091 639.425937 222.484932 652.746647L156.071644 932.177572C138.421236 1006.440873 190.405906 1044.264612 257.865924 1006.345598L510.273487 864.46829C522.369205 857.669333 526.55766 842.536203 519.628661 830.667492 512.699663 818.798784 497.277084 814.688939 485.181367 821.487893L232.773805 963.365201ZM129.994101 501.287629C82.102458 458.686274 82.102458 458.686274 42.192755 423.185148 31.865104 413.998327 15.903056 414.766027 6.540523 424.899851-2.82201 435.033675-2.039628 450.696151 8.288022 459.88297 48.197725 495.384098 48.197725 495.384098 96.089368 537.985451L223.800416 651.58906C234.128066 660.775881 250.090114 660.008181 259.452649 649.874357 268.815181 639.740533 268.0328 624.078057 257.705148 614.891236 225.777387 586.490334 225.777387 586.490334 129.994101 501.287629ZM180.395462 382.262878C190.366845 381.267631 200.661419 380.210295 211.223313 379.09885 236.673773 376.420659 262.52381 373.552395 287.435772 370.684164 296.155283 369.680247 304.136079 368.747883 311.210485 367.910867 315.461207 367.40794 318.460849 367.049069 320.067674 366.854942 333.902965 365.183369 343.73769 352.823061 342.034144 339.247426 340.330596 325.671791 327.733879 316.021643 313.898586 317.693216 312.350014 317.880324 309.374861 318.236267 305.16739 318.734078 298.144806 319.56496 290.21721 320.49111 281.552922 321.48867 256.796887 324.338946 231.109284 327.189188 205.840444 329.848269 195.367057 330.950398 185.163505 331.998385 175.286984 332.984164 154.745362 335.034432 135.924256 336.785406 119.20766 338.183706 105.318259 339.345517 95.018524 351.33562 96.202557 364.964348 97.386591 378.593077 109.606024 388.699509 123.495425 387.537698 140.511074 386.114383 159.598349 384.338647 180.395462 382.262878Z\"  ></path></symbol><symbol id=\"icon-form\" viewBox=\"0 0 1024 1024\"><path d=\"M835.55027 48.761905C876.805122 48.761905 910.222223 81.441158 910.222223 121.753604L910.222223 834.966428 917.178886 818.05911 755.401109 982.711731 773.333333 975.238095 188.412988 975.238095C147.247907 975.238095 113.777778 942.409011 113.777778 902.094615L113.777778 24.380952 88.888889 48.761905 835.55027 48.761905ZM64 0 64 24.380952 64 902.094615C64 969.325498 119.742117 1024 188.412988 1024L773.333333 1024 783.922411 1024 791.265557 1016.526364 953.043334 851.873745 960 844.793457 960 834.966428 960 121.753604C960 54.49204 904.277615 0 835.55027 0L88.888889 0 64 0Z\"  ></path><path d=\"M736.080945 707.047618C694.76038 707.047618 661.333333 739.619379 661.333333 780.144186L661.333333 926.47619C661.333333 939.941419 672.476469 950.857143 686.222223 950.857143 699.967977 950.857143 711.11111 939.941419 711.11111 926.47619L711.11111 780.144186C711.11111 766.607861 722.192996 755.809523 736.080945 755.809523L848 755.809523C861.745754 755.809523 872.88889 744.893801 872.88889 731.428572 872.88889 717.963343 861.745754 707.047618 848 707.047618L736.080945 707.047618Z\"  ></path><path d=\"M775.164361 219.428572C788.910114 219.428572 800.05325 208.512847 800.05325 195.047619 800.05325 181.582391 788.910114 170.666667 775.164361 170.666667L263.111111 170.666667C249.365357 170.666667 238.222222 181.582391 238.222222 195.047619 238.222222 208.512847 249.365357 219.428572 263.111111 219.428572L775.164361 219.428572Z\"  ></path><path d=\"M775.164361 365.714285C788.910114 365.714285 800.05325 354.798562 800.05325 341.333333 800.05325 327.868105 788.910114 316.952382 775.164361 316.952382L263.111111 316.952382C249.365357 316.952382 238.222222 327.868105 238.222222 341.333333 238.222222 354.798562 249.365357 365.714285 263.111111 365.714285L775.164361 365.714285Z\"  ></path><path d=\"M775.164361 536.380951C788.910114 536.380951 800.05325 525.465229 800.05325 512 800.05325 498.534771 788.910114 487.619049 775.164361 487.619049L263.111111 487.619049C249.365357 487.619049 238.222222 498.534771 238.222222 512 238.222222 525.465229 249.365357 536.380951 263.111111 536.380951L775.164361 536.380951Z\"  ></path></symbol><symbol id=\"icon-help\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512Z\"  ></path><path d=\"M533.078812 691.418556C551.918022 691.418556 567.190219 706.673952 567.190219 725.511386L567.190219 734.541728C567.190219 753.370677 552.049365 768.634558 533.078812 768.634558L533.078812 768.634558C514.239601 768.634558 498.967405 753.379162 498.967405 734.541728L498.967405 725.511386C498.967405 706.682436 514.108258 691.418556 533.078812 691.418556L533.078812 691.418556ZM374.634146 418.654985C374.634146 418.654985 377.308518 442.210609 403.631972 442.210609 429.955424 442.210609 431.511799 418.654985 431.511799 418.654985 429.767552 342.380653 465.107535 306.162338 537.45591 309.760186 585.612324 315.19693 610.562654 342.380653 612.231066 391.391309 608.894242 413.21824 590.617557 441.441342 558.083539 475.90071 515.008196 519.47462 493.470524 558.49126 493.470524 592.950626L493.470524 628.289468C493.470524 628.289468 496.775846 649.365867 520.582206 649.365867 544.388565 649.365867 547.693888 628.289468 547.693888 628.289468L547.693888 603.744164C547.693888 574.961397 568.321517 540.342125 609.652612 500.28611 652.879629 460.469948 674.341463 424.091729 674.341463 391.391309 670.777131 300.725594 623.530758 253.473886 532.223166 249.796087 427.189099 248.037141 374.634146 304.323439 374.634146 418.654985Z\"  ></path></symbol><symbol id=\"icon-information\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512Z\"  ></path><path d=\"M499.512194 743.02439C499.512194 756.818039 510.694157 768 524.487806 768 538.281453 768 549.463415 756.818039 549.463415 743.02439L549.463415 424.585365C549.463415 410.791718 538.281453 399.609756 524.487806 399.609756 510.694157 399.609756 499.512194 410.791718 499.512194 424.585365L499.512194 743.02439Z\"  ></path><path d=\"M499.512194 318.439025C499.512194 332.232672 510.694157 343.414635 524.487806 343.414635 538.281453 343.414635 549.463415 332.232672 549.463415 318.439025L549.463415 274.731708C549.463415 260.938059 538.281453 249.756098 524.487806 249.756098 510.694157 249.756098 499.512194 260.938059 499.512194 274.731708L499.512194 318.439025Z\"  ></path></symbol><symbol id=\"icon-less\" viewBox=\"0 0 1024 1024\"><path d=\"M509.927514 387.159081C517.168621 379.168894 527.507586 379.262447 534.709532 387.493244L805.278364 696.714765C813.036915 705.581679 826.514517 706.480186 835.381431 698.721636 844.248346 690.963085 845.146852 677.485483 837.388303 668.618569L566.819471 359.397045C542.819471 331.968474 502.692194 331.60538 478.31207 358.507586L197.525612 668.340919C189.61372 677.071283 190.277222 690.562496 199.007586 698.474389 207.737949 706.386281 221.229163 705.722778 229.141056 696.992414L509.927514 387.159081Z\"  ></path></symbol><symbol id=\"icon-moreunfold\" viewBox=\"0 0 1024 1024\"><path d=\"M478.31207 644.159081C502.692194 671.061286 542.819471 670.698193 566.819471 643.269621L837.388303 334.048098C845.146852 325.181184 844.248346 311.703582 835.381431 303.94503 826.514517 296.186481 813.036915 297.084988 805.278364 305.951902L534.709532 615.173423C527.507586 623.40422 517.168621 623.497773 509.927514 615.507586L229.141056 305.674253C221.229163 296.943889 207.737949 296.280386 199.007586 304.192277 190.277222 312.104171 189.61372 325.595383 197.525612 334.325747L478.31207 644.159081Z\"  ></path></symbol><symbol id=\"icon-more\" viewBox=\"0 0 1024 1024\"><path d=\"M642.174253 504.59418C650.164439 511.835287 650.070886 522.174253 641.84009 529.376198L332.618569 799.94503C323.751654 807.703582 322.853148 821.181184 330.611697 830.048098 338.370249 838.915012 351.847851 839.813519 360.714765 832.05497L669.936288 561.486138C697.36486 537.486138 697.727953 497.358861 670.825747 472.978737L360.992414 192.192278C352.26205 184.280386 338.770837 184.943889 330.858944 193.674252 322.947053 202.404616 323.610556 215.895829 332.340919 223.807723L642.174253 504.59418Z\"  ></path></symbol><symbol id=\"icon-pic\" viewBox=\"0 0 1024 1024\"><path d=\"M475.224371 575.792506 440.035586 579.864725 667.59114 724.380853 683.870889 734.719806 699.396883 723.24605 1012.285773 492.020243 1024 483.363394 1024 468.645161 1024 208.704131C1024 128.805961 960.311036 64 881.771738 64L28.444444 64 0 64 0 92.903226 0 815.429577C0 895.261382 63.696326 960 142.228263 960L995.555556 960 1024 960 1024 931.096774 1024 670.967742C1024 655.00493 1011.264988 642.064516 995.555556 642.064516 979.846123 642.064516 967.11111 655.00493 967.11111 670.967742L967.11111 931.096774 995.555556 902.193549 142.228263 902.193549C95.11813 902.193549 56.888889 863.338746 56.888889 815.429577L56.888889 92.903226 28.444444 121.806452 881.771738 121.806452C928.874507 121.806452 967.11111 160.713662 967.11111 208.704131L967.11111 468.645161 978.825338 445.27008 665.93645 676.495887 697.742193 675.361082 470.186637 530.844951 450.998204 518.65875 434.997852 534.917171 207.442296 766.142978C196.334049 777.430389 196.334049 795.730901 207.442296 807.018313 218.550543 818.305724 236.56057 818.305724 247.668815 807.018313L475.224371 575.792506Z\"  ></path><path d=\"M341.333333 338.580644C341.333333 282.710807 296.760794 237.419355 241.777777 237.419355 186.794763 237.419355 142.222222 282.710807 142.222222 338.580644 142.222222 394.450483 186.794763 439.741935 241.777777 439.741935 296.760794 439.741935 341.333333 394.450483 341.333333 338.580644ZM199.111111 338.580644C199.111111 314.636429 218.213628 295.225807 241.777777 295.225807 265.341926 295.225807 284.444444 314.636429 284.444444 338.580644 284.444444 362.524862 265.341926 381.935484 241.777777 381.935484 218.213628 381.935484 199.111111 362.524862 199.111111 338.580644Z\"  ></path></symbol><symbol id=\"icon-qrcode\" viewBox=\"0 0 1024 1024\"><path d=\"M390.095238 70.243903 365.714285 45.788618 365.714285 388.162603 390.095238 363.707317 48.761905 363.707317 73.142857 388.162603 73.142857 45.788618 48.761905 70.243903 390.095238 70.243903ZM24.380952 21.333333 24.380952 45.788618 24.380952 388.162603 24.380952 412.617886 48.761905 412.617886 390.095238 412.617886 414.47619 412.617886 414.47619 388.162603 414.47619 45.788618 414.47619 21.333333 390.095238 21.333333 48.761905 21.333333 24.380952 21.333333Z\"  ></path><path d=\"M390.095238 657.170731 365.714285 632.715447 365.714285 975.089431 390.095238 950.634146 97.666649 950.634146C84.112298 950.634146 73.142857 939.635025 73.142857 926.035586L73.142857 632.715447 48.761905 657.170731 390.095238 657.170731ZM24.380952 608.260162 24.380952 632.715447 24.380952 926.035586C24.380952 966.651334 57.185576 999.544715 97.666649 999.544715L390.095238 999.544715 414.47619 999.544715 414.47619 975.089431 414.47619 632.715447 414.47619 608.260162 390.095238 608.260162 48.761905 608.260162 24.380952 608.260162Z\"  ></path><path d=\"M926.33335 70.243903C939.887701 70.243903 950.857143 81.243023 950.857143 94.842462L950.857143 388.162603 975.238095 363.707317 633.904762 363.707317 658.285715 388.162603 658.285715 45.788618 633.904762 70.243903 926.33335 70.243903ZM609.52381 21.333333 609.52381 45.788618 609.52381 388.162603 609.52381 412.617886 633.904762 412.617886 975.238095 412.617886 999.619049 412.617886 999.619049 388.162603 999.619049 94.842462C999.619049 54.226715 966.814423 21.333333 926.33335 21.333333L633.904762 21.333333 609.52381 21.333333Z\"  ></path><path d=\"M975.238095 657.170731 950.857143 632.715447 950.857143 975.089431 975.238095 950.634146 633.904762 950.634146 658.285715 975.089431 658.285715 632.715447 633.904762 657.170731 975.238095 657.170731ZM609.52381 608.260162 609.52381 632.715447 609.52381 975.089431 609.52381 999.544715 633.904762 999.544715 975.238095 999.544715 999.619049 999.544715 999.619049 975.089431 999.619049 632.715447 999.619049 608.260162 975.238095 608.260162 633.904762 608.260162 609.52381 608.260162Z\"  ></path><path d=\"M487.619049 388.440358C487.619049 401.946639 498.534771 412.895644 512 412.895644 525.465229 412.895644 536.380951 401.946639 536.380951 388.440358L536.380951 119.154471C536.380951 105.648191 525.465229 94.699187 512 94.699187 498.534771 94.699187 487.619049 105.648191 487.619049 119.154471L487.619049 388.440358Z\"  ></path><path d=\"M585.142857 681.371383C585.142857 667.865103 574.227134 656.9161 560.761905 656.9161 547.296676 656.9161 536.380951 667.865103 536.380951 681.371383L536.380951 975.089431C536.380951 988.595712 547.296676 999.544715 560.761905 999.544715 574.227134 999.544715 585.142857 988.595712 585.142857 975.089431L585.142857 681.371383Z\"  ></path><path d=\"M487.619049 779.447155C487.619049 765.940875 476.703324 754.99187 463.238095 754.99187 449.772866 754.99187 438.857143 765.940875 438.857143 779.447155L438.857143 975.089431C438.857143 988.595712 449.772866 999.544715 463.238095 999.544715 476.703324 999.544715 487.619049 988.595712 487.619049 975.089431L487.619049 779.447155Z\"  ></path><path d=\"M999.619049 534.894308C1013.084275 534.894308 1024 523.945306 1024 510.439025 1024 496.932745 1013.084275 485.98374 999.619049 485.98374L24.380952 485.98374C10.915724 485.98374 0 496.932745 0 510.439025 0 523.945306 10.915724 534.894308 24.380952 534.894308L999.619049 534.894308Z\"  ></path></symbol><symbol id=\"icon-refresh\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0C229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 761.325865 1024 973.201958 844.559514 1016.153097 601.764678 1018.151127 590.470182 1019.771663 579.089182 1021.010022 567.635639 1022.492753 553.921916 1012.577574 541.602754 998.863851 540.120021 985.150125 538.637291 972.830963 548.552469 971.348233 562.266193 970.230573 572.603369 968.768273 582.873092 966.965602 593.063262 928.217702 812.097967 736.992706 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 698.044361 49.951219 863.703281 160.916567 936.293348 328.7543 941.768939 341.414579 956.470965 347.238921 969.131243 341.763332 981.791522 336.287742 987.615863 321.585717 982.140273 308.925438 901.710383 122.961007 718.143277 0 512 0Z\"  ></path><path d=\"M958.442797 350.246554 983.418406 325.270944 724.292683 325.270944C710.499034 325.270944 699.317073 336.452907 699.317073 350.246554 699.317073 364.040203 710.499034 375.222163 724.292683 375.222163L983.418406 375.222163C997.212055 375.222163 1008.394016 364.040203 1008.394016 350.246554L1008.394016 74.926829C1008.394016 61.133181 997.212055 49.951219 983.418406 49.951219 969.624757 49.951219 958.442797 61.133181 958.442797 74.926829L958.442797 350.246554Z\"  ></path></symbol><symbol id=\"icon-rfq\" viewBox=\"0 0 1024 1024\"><path d=\"M797.970974 491.89619 761.457982 491.073534 951.72983 727.092303 970.333549 688.354662 850.968469 688.354662 827.095452 688.354662 827.095452 712.168617 827.095452 976.372094 850.968471 952.55814 683.857357 952.558118 707.73037 976.372073 707.73037 809.674398C707.73037 796.522315 697.042057 785.860444 683.857355 785.860444 670.672651 785.860444 659.984337 796.522315 659.984337 809.674398L659.984337 976.372073 659.984337 1000.186022 683.85735 1000.186025 850.968465 1000.186046 874.841485 1000.18605 874.841485 976.372094 874.841485 712.168617 850.968469 735.982569 970.333549 735.982569 1020.166487 735.982569 988.937265 697.244928 798.665419 461.226157 780.898613 439.187693 762.152427 460.403501 552.503424 697.671663C543.785389 707.53821 544.736282 722.586507 554.6273 731.282974 564.518319 739.979439 579.603938 739.030899 588.321973 729.164352L797.970974 491.89619Z\"  ></path><path d=\"M153.857145 928.744186C107.228929 928.744186 69.079365 889.386191 69.079365 840.486526L69.079365 23.813953 45.206349 47.627907 748.087665 47.627907C794.753677 47.627907 833.015872 87.152172 833.015872 136.104066L833.015872 562.592239 880.761905 562.592239 880.761905 136.104066C880.761905 61.213064 821.503465 0 748.087665 0L45.206349 0 21.333333 0 21.333333 23.813953 21.333333 840.486526C21.333333 915.338285 80.493186 976.372094 153.857145 976.372094L687.308156 976.372094 687.308156 928.744186 153.857145 928.744186Z\"  ></path><path d=\"M735.286219 381.023255C748.470923 381.023255 759.159236 370.361387 759.159236 357.209301 759.159236 344.057218 748.470923 333.395349 735.286219 333.395349L189.399822 333.395349C176.215119 333.395349 165.526806 344.057218 165.526806 357.209301 165.526806 370.361387 176.215119 381.023255 189.399822 381.023255L735.286219 381.023255Z\"  ></path><path d=\"M737.956448 238.139535C751.14115 238.139535 761.829463 227.477664 761.829463 214.325581 761.829463 201.173498 751.14115 190.511628 737.956448 190.511628L192.070049 190.511628C178.885347 190.511628 168.197034 201.173498 168.197034 214.325581 168.197034 227.477664 178.885347 238.139535 192.070049 238.139535L737.956448 238.139535Z\"  ></path></symbol><symbol id=\"icon-search\" viewBox=\"0 0 1024 1024\"><path d=\"M1001.526404 991.699618C999.922771 986.822379 999.922771 986.822379 998.661741 984.531443 997.556333 982.547938 996.293839 980.724943 994.702325 978.653549 992.500075 975.787264 989.423708 972.169135 985.358477 967.619563 978.223881 959.634933 967.82403 948.546074 954.04227 934.18551 932.495573 911.733901 910.909628 889.684252 858.479859 836.391998 806.561909 783.619985 784.782022 761.370402 763.425645 739.113463 750.035742 725.158933 739.986204 714.441517 733.331893 706.993367 730.0273 703.294545 727.65239 700.501581 726.365602 698.828322 727.222236 700.438869 727.222236 700.438869 728.57702 704.41879 730.685899 711.913483 730.685899 711.913483 721.610157 729.174018 803.853596 649.91606 851.33145 539.987051 851.33145 422.399774 851.33145 189.11482 665.530044 0 436.332393 0 207.134741 0 21.333333 189.11482 21.333333 422.399774 21.333333 655.684727 207.134741 844.799548 436.332393 844.799548 441.356706 844.799548 446.556279 844.56416 452.347883 844.11767 456.487002 843.798575 460.079727 843.454155 466.651669 842.776804 479.958906 841.405269 484.804847 841.014569 490.397372 841.014558 499.896397 841.014541 514.964663 837.646929 537.39015 831.429666 540.021178 830.700239 542.719546 829.938705 545.476431 829.148403 553.976567 826.711712 562.667765 824.108471 571.097184 821.505798 576.160226 819.942528 580.026436 818.721914 582.233225 818.013231 595.480279 813.759108 602.830912 799.380094 598.651326 785.896804 594.471738 772.413515 580.344653 764.931795 567.097598 769.18592 565.058735 769.840674 561.367413 771.006074 556.494825 772.510539 548.364858 775.020755 539.986116 777.530404 531.839533 779.865745 529.217662 780.617342 526.657771 781.339795 524.170112 782.029476 506.936476 786.807345 493.480702 789.814579 490.397278 789.814586 482.458716 789.814601 476.720548 790.277235 461.583853 791.837329 455.416051 792.473024 452.140828 792.787008 448.548723 793.063932 443.933724 793.419714 439.960704 793.599575 436.332393 793.599575 234.916275 793.599575 71.63625 627.407763 71.63625 422.399774 71.63625 217.391785 234.916275 51.199973 436.332393 51.199973 637.74851 51.199973 801.028533 217.391785 801.028533 422.399774 801.028533 525.775443 759.336083 622.309077 687.025254 691.994987 677.769918 709.563029 677.769918 709.563029 679.976768 717.62707 681.566101 722.305182 681.566101 722.305182 682.808947 724.550298 683.910231 726.511657 685.170219 728.326692 686.754421 730.386692 688.964348 733.260343 692.047349 736.886044 696.115554 741.439575 703.261474 749.437982 713.66454 760.532418 727.438434 774.887134 749.001325 797.359294 770.84669 819.675765 822.916311 872.601946 875.194278 925.7399 896.716879 947.724843 918.057933 969.962174 931.455439 983.922347 941.502012 994.634524 948.144469 1002.068378 951.440527 1005.757135 953.805218 1008.538259 955.077419 1010.194061 954.139053 1008.441707 954.139053 1008.441707 952.75811 1004.249822 950.686453 996.172693 950.686453 996.172693 960.850534 978.849743 950.24269 987.977788 948.913429 1004.130236 957.881542 1014.927251 966.849655 1025.724265 982.719104 1027.077231 993.326948 1017.949188 1003.683753 1000.332838 1003.683753 1000.332838 1001.526404 991.699618Z\"  ></path></symbol><symbol id=\"icon-selected\" viewBox=\"0 0 1024 1024\"><path d=\"M464.247574 677.487844C474.214622 686.649009 489.665824 686.201589 499.086059 676.479029L798.905035 367.037898C808.503379 357.131511 808.253662 341.319801 798.347275 331.721456 788.44089 322.12311 772.62918 322.372828 763.030833 332.279215L463.211858 641.720346 498.050342 640.711531 316.608839 473.940462C306.453341 464.606085 290.653676 465.271736 281.319299 475.427234 271.984922 485.582733 272.650573 501.382398 282.806071 510.716775L464.247574 677.487844Z\"  ></path></symbol><symbol id=\"icon-set\" viewBox=\"0 0 1024 1024\"><path d=\"M825.606018 647.538283 819.263571 660.258455 827.207981 672.04471 905.327294 787.941807 908.52362 756.858321 769.540324 892.373873 799.04025 888.884996 671.47766 812.883319 660.919793 806.592954 649.583401 811.338837C641.524386 814.712674 633.321491 817.795042 625.041941 820.560337L611.811631 824.979142 608.915804 838.623962 580.996546 970.176486 604.846304 950.857143 408.272431 950.857141 431.938677 969.378097 397.841517 831.672939 394.800523 819.391548 383.007648 814.808062C375.650317 811.948518 368.359849 808.829278 361.19018 805.473457L349.017562 799.775966 337.701214 807.026784 217.88134 883.799985 248.055031 886.871665 109.071736 751.363721 112.710251 781.768288 190.651237 657.409417 197.546671 646.407394 192.26576 634.545545C188.597667 626.306366 185.255827 617.89434 182.266902 609.377882L177.674889 596.293685 164.082002 593.552105 29.201333 566.347718 48.761905 590.247401 48.761905 398.59747 29.96636 422.330022 171.221091 389.086012 183.450436 386.207861 188.204044 374.578423C191.634415 366.18621 195.421037 357.903851 199.530538 349.803328L205.959792 337.130182 198.101254 325.29011 124.686421 214.679584 121.526273 245.488151 259.687038 108.701216 229.912147 112.235203 352.693357 186.524314 363.287226 192.934163 374.712497 188.161388C381.330477 185.396804 388.053308 182.826231 394.835279 180.46681L407.314641 176.12529 410.490432 163.299629 443.437389 30.241004 419.771153 48.761905 616.327194 48.761905 592.477417 29.442474 621.325088 165.37204 624.105103 178.471403 636.651202 183.152979C646.841886 186.955632 656.865493 191.232395 666.627682 195.943104L678.796045 201.814904 690.225485 194.609697 803.674639 123.090468 773.791902 120.057533 914.162801 254.754833 910.479401 224.06547 834.210227 343.81367 827.217813 354.792273 832.449542 366.710857C836.047972 374.908567 839.325363 383.281107 842.252943 391.75287L846.63933 404.446089 859.712006 407.52234 994.034289 439.130935 975.238095 415.398229 975.238095 607.04816 994.798163 583.14858 852.982818 611.75475 840.250379 614.323063 835.279123 626.322974C832.31875 633.468898 829.086927 640.557101 825.606018 647.538283ZM857.803703 635.65433 862.624587 659.553909 1004.439932 630.94774 1024 627.002195 1024 607.04816 1024 415.398229 1024 396.088627 1005.203806 391.665525 870.881523 360.056928 865.296766 383.789634 888.340587 375.826398C884.98377 366.112521 881.22675 356.514699 877.099219 347.111631L854.774381 356.911245 875.338534 370.008819 951.607706 250.260619 962.34231 233.406505 947.924307 219.571255 807.553406 84.873956 793.797813 71.674344 777.670669 81.841021 664.221513 153.36025 677.223499 173.984973 687.819315 152.026842C676.702449 146.662439 665.295885 141.79561 653.698526 137.468057L645.174865 160.310518 669.02464 155.248996 640.176969 19.31943 636.0769 0 616.327194 0 419.771153 0 400.690923 0 396.104919 18.520901 363.157965 151.579527 386.824198 157.439578 378.813118 134.412346C371.096704 137.096855 363.448934 140.021092 355.916838 143.167538L365.314667 165.664463 377.935979 144.804613 255.154767 70.515502 238.88953 60.674174 225.379878 74.049489 87.219113 210.836425 72.972426 224.941449 84.058966 241.644992 157.473798 352.255518 177.787526 338.772813 156.044514 327.742298C151.336434 337.02272 146.99905 346.509743 143.067323 356.128497L165.635683 365.353459 160.050276 341.620907 18.795545 374.864917 0 379.28841 0 398.59747 0 590.247401 0 610.201867 19.560572 614.147083 154.441241 641.351467 159.261622 617.451787 136.256342 625.52569C139.682853 635.288979 143.513008 644.930182 147.71909 654.377779L169.992425 644.461662 149.333613 631.513907 71.392628 755.872779 60.94464 772.543085 75.031143 786.277348 214.014438 921.785293 227.881289 935.305393 244.18813 924.856971 364.008004 848.08377 350.854609 827.555277 340.519036 849.637097C348.675428 853.454763 356.968563 857.002997 365.342891 860.257811L374.17527 837.532937 350.509022 843.392932 384.606182 981.098091 389.192156 999.619046 408.272431 999.619046 604.846304 999.619049 624.595936 999.619049 628.696062 980.299706 656.615319 848.747183 632.765562 843.685572 640.489184 866.810807C649.912247 863.663588 659.243565 860.157199 668.413638 856.318227L658.998519 833.828531 646.519381 854.773745 774.081971 930.775422 790.172006 940.36185 803.581897 927.286545 942.565193 791.770995 957.136469 777.563281 945.761519 760.687509 867.642208 644.790413 847.425094 658.417562 869.244171 669.296841C873.230259 661.302494 876.932843 653.181798 880.328282 644.985685L857.803703 635.65433Z\"  ></path><path d=\"M731.428572 499.809523C731.428572 385.355085 638.644915 292.571428 524.190477 292.571428 409.736036 292.571428 316.952382 385.355085 316.952382 499.809523 316.952382 614.263964 409.736036 707.047618 524.190477 707.047618 553.504879 707.047618 582.005801 700.942889 608.253005 689.28262 620.558583 683.815889 626.102566 669.408589 620.635836 657.10301 615.169107 644.797434 600.761807 639.253451 588.456228 644.720179 568.411953 653.624811 546.651767 658.285715 524.190477 658.285715 436.666494 658.285715 365.714285 587.333506 365.714285 499.809523 365.714285 412.28554 436.666494 341.333333 524.190477 341.333333 611.71446 341.333333 682.666667 412.28554 682.666667 499.809523 682.666667 511.374255 681.431994 522.7624 679.007782 533.847245 676.130985 547.001574 684.462569 559.997374 697.616898 562.874172 710.77123 565.75097 723.767027 557.419386 726.643825 544.265056 729.815238 529.763582 731.428572 514.882835 731.428572 499.809523Z\"  ></path></symbol><symbol id=\"icon-smile\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512Z\"  ></path><path d=\"M337.170731 499.512194C371.654852 499.512194 399.609756 471.557291 399.609756 437.073171 399.609756 402.58905 371.654852 374.634146 337.170731 374.634146 302.686611 374.634146 274.731708 402.58905 274.731708 437.073171 274.731708 471.557291 302.686611 499.512194 337.170731 499.512194ZM711.804879 499.512194C746.288998 499.512194 774.243902 471.557291 774.243902 437.073171 774.243902 402.58905 746.288998 374.634146 711.804879 374.634146 677.320757 374.634146 649.365854 402.58905 649.365854 437.073171 649.365854 471.557291 677.320757 499.512194 711.804879 499.512194Z\"  ></path><path d=\"M352.788105 768.770967C396.165222 803.472661 453.151987 824.195121 524.487806 824.195121 595.823622 824.195121 652.810387 803.472661 696.187505 768.770967 722.700531 747.560546 738.882517 725.984565 746.631548 710.486505 752.800254 698.149092 747.799529 683.146916 735.462114 676.978208 723.124702 670.809502 708.122526 675.810227 701.953818 688.147642 701.03616 689.982957 698.492224 694.172969 694.165854 699.941463 686.602473 710.025971 676.927317 720.210345 664.983226 729.765617 630.311565 757.502948 584.273939 774.243902 524.487806 774.243902 464.70167 774.243902 418.664045 757.502948 383.992384 729.765617 372.048292 720.210345 362.373137 710.025971 354.809756 699.941463 350.483386 694.172969 347.93945 689.982957 347.021792 688.147642 340.853084 675.810227 325.850908 670.809502 313.513495 676.978208 301.176081 683.146916 296.175356 698.149092 302.344062 710.486505 310.093092 725.984565 326.275078 747.560546 352.788105 768.770967Z\"  ></path></symbol><symbol id=\"icon-success\" viewBox=\"0 0 1024 1024\"><path d=\"M464.247573 677.487844C474.214622 686.649009 489.665824 686.201589 499.086059 676.479029L798.905035 367.037897C808.503379 357.131511 808.253662 341.319802 798.347275 331.721455 788.44089 322.12311 772.62918 322.372828 763.030833 332.279215L463.211857 641.720346 498.050342 640.711531 316.608838 473.940461C306.453342 464.606084 290.653675 465.271735 281.319298 475.427234 271.984922 485.582733 272.650573 501.382398 282.806071 510.716774L464.247573 677.487844Z\"  ></path><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512Z\"  ></path></symbol><symbol id=\"icon-survey\" viewBox=\"0 0 1024 1024\"><path d=\"M722.355804 46.545455C761.006291 46.545455 792.380951 77.833977 792.380951 116.372656L792.380951 458.499072 799.081094 442.186782 401.874746 844.77862 418.539682 837.818182 138.070006 837.818182C99.387643 837.818182 68.063492 806.671445 68.063492 768.228572L68.063492 23.272727 44.698413 46.545455 722.355804 46.545455ZM21.333333 0 21.333333 23.272727 21.333333 768.228572C21.333333 832.395723 73.59726 884.363637 138.070006 884.363637L418.539682 884.363637 428.337293 884.363637 435.204619 877.403198 832.410967 474.81136 839.11111 468.020375 839.11111 458.499072 839.11111 116.372656C839.11111 52.140243 786.827324 0 722.355804 0L44.698413 0 21.333333 0Z\"  ></path><path d=\"M775.859347 588.634605 759.337741 605.09091 775.859347 621.547213 869.319663 714.638121 885.841269 731.094426 902.362876 714.638121 972.458114 644.81994 988.979721 628.363637 972.458114 611.907332 878.997796 518.816425 862.47619 502.360122 845.954583 518.816425 775.859347 588.634605ZM845.954583 551.72903 939.414901 644.81994 939.414901 611.907332 869.319663 681.725515 902.362876 681.725515 808.902558 588.634605 808.902558 621.547213 878.997796 551.72903 845.954583 551.72903Z\"  ></path><path d=\"M518.843473 844.634605 513.841133 849.617173 512.453734 856.526752 489.088655 972.890387 482.215251 1007.121568 516.58227 1000.275332 633.407665 977.002605 640.344663 975.620689 645.347004 970.638121 902.362876 714.638121 918.884482 698.181818 902.362876 681.725515 808.902558 588.634605 792.380951 572.178302 775.859347 588.634605 518.843473 844.634605ZM775.859347 621.547213 869.319663 714.638121 869.319663 681.725515 612.303791 937.725515 624.243127 931.361033 507.41773 954.633758 534.911345 982.018703 558.276425 865.655066 551.886686 877.547213 808.902558 621.547213 775.859347 621.547213Z\"  ></path><path d=\"M426.576706 597.730927C444.201086 597.730927 458.488469 611.946185 458.488469 629.499247L458.488469 637.913884C458.488469 655.459042 444.323959 669.682203 426.576706 669.682203L426.576706 669.682203C408.952326 669.682203 394.664943 655.466946 394.664943 637.913884L394.664943 629.499247C394.664943 611.954089 408.829453 597.730927 426.576706 597.730927L426.576706 597.730927ZM278.349205 343.564873C278.349205 343.564873 280.851125 365.514432 305.477133 365.514432 330.103138 365.514432 331.559155 343.564873 331.559155 343.564873 329.927383 272.491063 362.988497 238.74218 430.67155 242.094718 475.722639 247.160777 499.06407 272.491063 500.624896 318.160083 497.503245 338.498816 480.405116 364.797615 449.969026 396.907479 409.671358 437.510443 389.522524 473.866857 389.522524 505.976721L389.522524 538.906097C389.522524 538.906097 392.614705 558.545468 414.885933 558.545468 437.157161 558.545468 440.249342 538.906097 440.249342 538.906097L440.249342 516.034336C440.249342 489.214031 459.546816 456.955164 498.21271 419.630238 538.652271 382.528817 558.730159 348.630931 558.730159 318.160083 555.395669 233.676122 511.195938 189.646123 425.776235 186.219083 327.515198 184.580064 278.349205 237.028661 278.349205 343.564873Z\"  ></path></symbol><symbol id=\"icon-training\" viewBox=\"0 0 1024 1024\"><path d=\"M887.286976 122.88C927.302833 122.88 959.646052 155.814754 959.646052 196.762688L959.646052 663.552 983.843138 638.976 136.713024 638.976C96.697168 638.976 64.353947 606.041246 64.353947 565.093312L64.353947 98.304 40.156863 122.88 887.286976 122.88ZM15.959779 73.728 15.959779 98.304 15.959779 565.093312C15.959779 633.158735 69.941754 688.128 136.713024 688.128L983.843138 688.128 1008.040222 688.128 1008.040222 663.552 1008.040222 196.762688C1008.040222 128.697264 954.058246 73.728 887.286976 73.728L40.156863 73.728 15.959779 73.728Z\"  ></path><path d=\"M195.578315 964.786556C186.532947 974.777739 187.174803 990.32474 197.011941 999.511755 206.849078 1008.698769 222.156373 1008.046863 231.201741 998.05568L450.40665 755.929948C459.452017 745.938765 458.810161 730.391763 448.973022 721.204749 439.135885 712.017734 423.828591 712.669643 414.783221 722.660826L195.578315 964.786556Z\"  ></path><path d=\"M798.39181 998.05568C807.437178 1008.046863 822.744474 1008.698769 832.581611 999.511755 842.418748 990.32474 843.060604 974.777739 834.015236 964.786556L614.81033 722.660826C605.76496 712.669643 590.457666 712.017734 580.620529 721.204749 570.78339 730.391763 570.141534 745.938765 579.186903 755.929948L798.39181 998.05568Z\"  ></path><path d=\"M441.76944 103.615949C441.76944 114.25519 452.602844 122.88 465.966524 122.88 479.330204 122.88 490.163607 114.25519 490.163607 103.615949L490.163607 19.264051C490.163607 8.62481 479.330204 0 465.966524 0 452.602844 0 441.76944 8.62481 441.76944 19.264051L441.76944 103.615949Z\"  ></path><path d=\"M514.796777 307.058758C528.160457 307.058758 538.99386 296.055708 538.99386 282.482758 538.99386 268.909809 528.160457 257.906758 514.796777 257.906758L158.588801 257.906758C145.225121 257.906758 134.391718 268.909809 134.391718 282.482758 134.391718 296.055708 145.225121 307.058758 158.588801 307.058758L514.796777 307.058758Z\"  ></path><path d=\"M514.796777 465.249103C528.160457 465.249103 538.99386 454.246054 538.99386 440.673103 538.99386 427.100154 528.160457 416.097103 514.796777 416.097103L158.588801 416.097103C145.225121 416.097103 134.391718 427.100154 134.391718 440.673103 134.391718 454.246054 145.225121 465.249103 158.588801 465.249103L514.796777 465.249103Z\"  ></path><path d=\"M680.30294 552.391044C728.899441 514.220079 758.198767 456.685922 758.198767 378.258908L758.198767 216.841754C758.198767 203.268804 747.365363 192.265754 734.001683 192.265754 720.638003 192.265754 709.804599 203.268804 709.804599 216.841754L709.804599 378.258908C709.804599 441.071906 687.727774 484.423469 650.697359 513.509651 637.686323 523.729393 623.667934 531.437086 609.678551 536.931187 601.472998 540.153783 595.348683 541.871802 592.405429 542.44976 579.284725 545.026231 570.704734 557.917867 573.241481 571.244036 575.778227 584.570204 588.471098 593.284557 601.591802 590.708085 622.119765 586.677073 651.18515 575.262118 680.30294 552.391044Z\"  ></path><path d=\"M752.643211 232.510336C761.163307 222.053681 759.724115 206.561827 749.428683 197.908309 739.133252 189.254791 723.880252 190.716521 715.360156 201.173174L605.757702 335.687469C597.237604 346.144122 598.676798 361.635977 608.972228 370.289495 619.267661 378.943012 634.520659 377.481284 643.040757 367.024629L752.643211 232.510336Z\"  ></path><path d=\"M752.643211 201.173174C744.123113 190.716521 728.870114 189.254791 718.574682 197.908309 708.279251 206.561827 706.84006 222.053681 715.360156 232.510336L824.962609 367.024629C833.482707 377.481284 848.735706 378.943012 859.031136 370.289495 869.326569 361.635977 870.76576 346.144122 862.245664 335.687469L752.643211 201.173174Z\"  ></path></symbol><symbol id=\"icon-viewgallery\" viewBox=\"0 0 1024 1024\"><path d=\"M147.04975 49.951219 348.539994 49.951219C390.229001 49.951219 423.931625 83.45593 423.931625 125.058766L423.931625 349.47782C423.931625 390.977141 390.167209 424.585365 348.539994 424.585365L147.04975 424.585365C105.360742 424.585365 71.65812 391.080655 71.65812 349.47782L71.65812 125.058766C71.65812 83.559445 105.422534 49.951219 147.04975 49.951219ZM21.333333 349.47782C21.333333 418.650511 77.549527 474.536585 147.04975 474.536585L348.539994 474.536585C417.992574 474.536585 474.25641 418.533018 474.25641 349.47782L474.25641 125.058766C474.25641 55.886075 418.040215 0 348.539994 0L147.04975 0C77.597169 0 21.333333 56.003567 21.333333 125.058766L21.333333 349.47782Z\"  ></path><path d=\"M675.460006 49.951219 876.950251 49.951219C918.639258 49.951219 952.341879 83.45593 952.341879 125.058766L952.341879 349.47782C952.341879 390.977141 918.577466 424.585365 876.950251 424.585365L675.460006 424.585365C633.770999 424.585365 600.068375 391.080655 600.068375 349.47782L600.068375 125.058766C600.068375 83.559445 633.832791 49.951219 675.460006 49.951219ZM549.74359 349.47782C549.74359 418.650511 605.959785 474.536585 675.460006 474.536585L876.950251 474.536585C946.402831 474.536585 1002.666667 418.533018 1002.666667 349.47782L1002.666667 125.058766C1002.666667 55.886075 946.450473 0 876.950251 0L675.460006 0C606.007426 0 549.74359 56.003567 549.74359 125.058766L549.74359 349.47782Z\"  ></path><path d=\"M147.04975 599.414635 348.539994 599.414635C390.229001 599.414635 423.931625 632.919345 423.931625 674.52218L423.931625 898.941233C423.931625 940.440555 390.167209 974.048781 348.539994 974.048781L147.04975 974.048781C105.360742 974.048781 71.65812 940.54407 71.65812 898.941233L71.65812 674.52218C71.65812 633.022859 105.422534 599.414635 147.04975 599.414635ZM21.333333 898.941233C21.333333 968.113924 77.549527 1024 147.04975 1024L348.539994 1024C417.992574 1024 474.25641 967.996433 474.25641 898.941233L474.25641 674.52218C474.25641 605.349489 418.040215 549.463415 348.539994 549.463415L147.04975 549.463415C77.597169 549.463415 21.333333 605.466982 21.333333 674.52218L21.333333 898.941233Z\"  ></path><path d=\"M874.686701 974.048781 868.289711 974.048781 845.457374 974.048781 776.173041 974.048781 675.395834 974.048781C633.745909 974.048781 600.068375 940.547631 600.068375 898.941233L600.068375 674.52218C600.068375 633.022859 633.832791 599.414635 675.460006 599.414635L876.950251 599.414635C918.642281 599.414635 952.341879 632.88393 952.341879 674.420529L952.341879 869.021858 952.341879 899.065886C952.341879 912.859535 963.607467 924.041495 977.504273 924.041495 991.401079 924.041495 1002.666667 912.859535 1002.666667 899.065886L1002.666667 869.021858 1002.666667 674.420529C1002.666667 605.303266 946.442579 549.463415 876.950251 549.463415L675.460006 549.463415C606.007426 549.463415 549.74359 605.466982 549.74359 674.52218L549.74359 898.941233C549.74359 968.110364 605.927488 1024 675.395834 1024L776.173041 1024 845.457374 1024 868.289711 1024 874.686701 1024 876.37206 1024C890.847055 1024 902.112642 1012.818039 902.112642 999.02439 902.112642 985.230741 890.847055 974.048781 876.950251 974.048781L874.686701 974.048781Z\"  ></path></symbol><symbol id=\"icon-viewlist\" viewBox=\"0 0 1024 1024\"><path d=\"M146.571481 49.951219 347.295185 49.951219C388.825594 49.951219 422.4 83.45593 422.4 125.058766L422.4 349.47782C422.4 390.977141 388.764036 424.585365 347.295185 424.585365L146.571481 424.585365C105.041073 424.585365 71.466667 391.080655 71.466667 349.47782L71.466667 125.058766C71.466667 83.559445 105.10263 49.951219 146.571481 49.951219ZM21.333333 349.47782C21.333333 418.650511 77.335661 474.536585 146.571481 474.536585L347.295185 474.536585C416.483543 474.536585 472.533333 418.533018 472.533333 349.47782L472.533333 125.058766C472.533333 55.886075 416.531006 0 347.295185 0L146.571481 0C77.383122 0 21.333333 56.003567 21.333333 125.058766L21.333333 349.47782Z\"  ></path><path d=\"M146.571481 599.414635 347.295185 599.414635C388.825594 599.414635 422.4 632.919345 422.4 674.52218L422.4 898.941233C422.4 940.440555 388.764036 974.048781 347.295185 974.048781L146.571481 974.048781C105.041073 974.048781 71.466667 940.54407 71.466667 898.941233L71.466667 674.52218C71.466667 633.022859 105.10263 599.414635 146.571481 599.414635ZM21.333333 898.941233C21.333333 968.113924 77.335661 1024 146.571481 1024L347.295185 1024C416.483543 1024 472.533333 967.996433 472.533333 898.941233L472.533333 674.52218C472.533333 605.349489 416.531006 549.463415 347.295185 549.463415L146.571481 549.463415C77.383122 549.463415 21.333333 605.466982 21.333333 674.52218L21.333333 898.941233Z\"  ></path><path d=\"M998.933333 149.853658C1012.777271 149.853658 1024 138.671697 1024 124.878049 1024 111.0844 1012.777271 99.902439 998.933333 99.902439L572.8 99.902439C558.956062 99.902439 547.733333 111.0844 547.733333 124.878049 547.733333 138.671697 558.956062 149.853658 572.8 149.853658L998.933333 149.853658Z\"  ></path><path d=\"M998.933333 274.731708C1012.777271 274.731708 1024 263.549745 1024 249.756098 1024 235.962449 1012.777271 224.780489 998.933333 224.780489L572.8 224.780489C558.956062 224.780489 547.733333 235.962449 547.733333 249.756098 547.733333 263.549745 558.956062 274.731708 572.8 274.731708L998.933333 274.731708Z\"  ></path><path d=\"M998.933333 399.609756C1012.777271 399.609756 1024 388.427795 1024 374.634146 1024 360.840497 1012.777271 349.658537 998.933333 349.658537L572.8 349.658537C558.956062 349.658537 547.733333 360.840497 547.733333 374.634146 547.733333 388.427795 558.956062 399.609756 572.8 399.609756L998.933333 399.609756Z\"  ></path><path d=\"M998.933333 674.341463C1012.777271 674.341463 1024 663.159503 1024 649.365854 1024 635.572205 1012.777271 624.390244 998.933333 624.390244L572.8 624.390244C558.956062 624.390244 547.733333 635.572205 547.733333 649.365854 547.733333 663.159503 558.956062 674.341463 572.8 674.341463L998.933333 674.341463Z\"  ></path><path d=\"M998.933333 799.219511C1012.777271 799.219511 1024 788.037551 1024 774.243902 1024 760.450255 1012.777271 749.268292 998.933333 749.268292L572.8 749.268292C558.956062 749.268292 547.733333 760.450255 547.733333 774.243902 547.733333 788.037551 558.956062 799.219511 572.8 799.219511L998.933333 799.219511Z\"  ></path><path d=\"M998.933333 924.097562C1012.777271 924.097562 1024 912.915599 1024 899.121952 1024 885.328303 1012.777271 874.146342 998.933333 874.146342L572.8 874.146342C558.956062 874.146342 547.733333 885.328303 547.733333 899.121952 547.733333 912.915599 558.956062 924.097562 572.8 924.097562L998.933333 924.097562Z\"  ></path></symbol><symbol id=\"icon-warning\" viewBox=\"0 0 1024 1024\"><path d=\"M598.272514 158.17909C545.018272 71.994036 451.264177 71.951401 397.724122 158.397341L25.049726 760.118586C-28.93569 847.283607 14.324655 927.325257 116.435565 929.308966L891.057077 929.313666C993.88467 931.315989 1036.926865 868.038259 983.25955 781.189694 980.374633 776.521099 980.374633 776.521099 971.719878 762.515313 967.393745 755.514432 967.393745 755.514432 963.78822 749.679695 956.511588 737.90409 941.113263 734.285867 929.3951 741.59817 917.676937 748.910473 914.076365 764.384279 921.352996 776.159885 924.958522 781.994622 924.958522 781.994622 929.284655 788.995503 937.939409 803.001289 937.939409 803.001289 940.824326 807.669884 972.284602 858.581314 957.441559 880.402549 891.539823 879.122276L116.918309 879.117577C54.037254 877.891296 33.95555 840.735497 67.458075 786.642217L440.132471 184.920971C474.112981 130.055931 522.112175 130.077759 556.029583 184.965509L857.08969 656.83971C864.534622 668.508595 879.98329 671.9032 891.595253 664.421773 903.207217 656.940343 906.585263 641.415949 899.140331 629.747063L598.272514 158.17909Z\"  ></path><path d=\"M474.536585 619.793346C474.536585 633.654611 485.718547 644.891386 499.512194 644.891386 513.305843 644.891386 524.487806 633.654611 524.487806 619.793346L524.487806 299.793346C524.487806 285.932082 513.305843 274.695307 499.512194 274.695307 485.718547 274.695307 474.536585 285.932082 474.536585 299.793346L474.536585 619.793346Z\"  ></path><path d=\"M474.465781 776.736145C474.565553 790.597047 485.828105 801.75225 499.621393 801.651987 513.414679 801.551725 524.515467 790.233967 524.415695 776.373065L523.955031 712.375667C523.855258 698.514767 512.592708 687.359563 498.79942 687.459825 485.006133 687.560087 473.905346 698.877847 474.005118 712.738748L474.465781 776.736145Z\"  ></path></symbol><symbol id=\"icon-wrong\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 629.410831 1024 740.826187 984.331046 830.768465 912.686662 841.557579 904.092491 843.33693 888.379234 834.742758 877.590121 826.148587 866.801009 810.43533 865.021658 799.646219 873.615827 718.470035 938.277495 618.001779 974.048781 512 974.048781 256.817504 974.048781 49.951219 767.182496 49.951219 512 49.951219 256.817504 256.817504 49.951219 512 49.951219 767.182496 49.951219 974.048781 256.817504 974.048781 512 974.048781 599.492834 949.714859 683.336764 904.470807 755.960693 897.177109 767.668243 900.755245 783.071797 912.462793 790.365493 924.170342 797.659191 939.573897 794.081058 946.867595 782.373508 997.013826 701.880796 1024 608.898379 1024 512Z\"  ></path><path d=\"M331.838918 663.575492C322.174057 673.416994 322.317252 689.230029 332.158756 698.894891 342.000258 708.559753 357.813293 708.416557 367.478155 698.575053L717.473766 342.182707C727.138628 332.341205 726.995433 316.528171 717.153931 306.863309 707.312427 297.198447 691.499394 297.341643 681.834532 307.183147L331.838918 663.575492Z\"  ></path><path d=\"M681.834532 698.575053C691.499394 708.416557 707.312427 708.559753 717.153931 698.894891 726.995433 689.230029 727.138628 673.416994 717.473766 663.575492L367.478155 307.183147C357.813293 297.341643 342.000258 297.198447 332.158756 306.863309 322.317252 316.528171 322.174057 332.341205 331.838918 342.182707L681.834532 698.575053Z\"  ></path></symbol><symbol id=\"icon-account\" viewBox=\"0 0 1024 1024\"><path d=\"M793.6 316.991454C793.6 153.703982 661.792629 21.333333 499.2 21.333333 336.607371 21.333333 204.8 153.703982 204.8 316.991454 204.8 480.278923 336.607371 612.649572 499.2 612.649572 661.792629 612.649572 793.6 480.278923 793.6 316.991454ZM256 316.991454C256 182.101803 364.88435 72.752137 499.2 72.752137 633.51565 72.752137 742.4 182.101803 742.4 316.991454 742.4 451.881103 633.51565 561.230769 499.2 561.230769 364.88435 561.230769 256 451.881103 256 316.991454Z\"  ></path><path d=\"M0 998.290598 0 1024 25.6 1024 486.4 1024 998.4 1024 1024 1024 1024 998.290598C1024 767.462671 787.090923 561.230769 512 561.230769 495.448045 561.230769 478.989086 561.900892 462.660538 563.232578 448.568439 564.381869 485.255599 576.786276 486.4 590.938596 501.350035 589.719337 496.831226 612.649572 512 612.649572 760.310844 612.649572 972.8 797.623669 972.8 998.290598L998.4 972.581197 486.4 972.581197 25.6 972.581197 51.2 998.290598C51.2 861.757427 137.013906 736.945338 275.263548 667.439085 287.906261 661.082846 293.024384 645.637353 286.695191 632.94061 280.366001 620.243866 264.986234 615.103872 252.34352 621.460111 97.581613 699.268053 0 841.195691 0 998.290598Z\"  ></path></symbol><symbol id=\"icon-add\" viewBox=\"0 0 1024 1024\"><path d=\"M853.333333 533.333333C865.115407 533.333333 874.666667 523.782074 874.666667 512 874.666667 500.217926 865.115407 490.666667 853.333333 490.666667L170.666667 490.666667C158.884592 490.666667 149.333333 500.217926 149.333333 512 149.333333 523.782074 158.884592 533.333333 170.666667 533.333333L853.333333 533.333333Z\"  ></path><path d=\"M490.666667 853.333333C490.666667 865.115407 500.217926 874.666667 512 874.666667 523.782074 874.666667 533.333333 865.115407 533.333333 853.333333L533.333333 170.666667C533.333333 158.884592 523.782074 149.333333 512 149.333333 500.217926 149.333333 490.666667 158.884592 490.666667 170.666667L490.666667 853.333333Z\"  ></path></symbol><symbol id=\"icon-atm\" viewBox=\"0 0 1024 1024\"><path d=\"M786.731708 648C807.42218 648 824.195121 603.109084 824.195121 547.733333 824.195121 492.357583 807.42218 447.466667 786.731708 447.466667 766.041235 447.466667 749.268292 492.357583 749.268292 547.733333 749.268292 603.109084 766.041235 648 786.731708 648ZM462.048781 698.133333C482.739253 698.133333 499.512194 658.853781 499.512194 610.4 499.512194 561.946217 482.739253 522.666667 462.048781 522.666667 441.358308 522.666667 424.585365 561.946217 424.585365 610.4 424.585365 658.853781 441.358308 698.133333 462.048781 698.133333ZM0 572.8C0 822.813926 229.933961 1024 512 1024 794.066039 1024 1024 822.813926 1024 572.8 1024 322.786074 794.066039 121.599999 512 121.599999 515.649685 121.599999 516.946722 122.183253 516.866057 122.124053 514.736119 120.560928 512.302005 118.428984 505.789668 112.472612 487.675081 95.904489 476.340222 86.603485 458.812092 75.393661 404.94781 40.945655 334.29571 21.333333 237.268292 21.333333 223.474645 21.333333 212.292683 32.556062 212.292683 46.4 212.292683 60.243938 223.474645 71.466667 237.268292 71.466667 325.013274 71.466667 386.336418 88.489363 431.969129 117.673005 444.078925 125.417623 494.717728 171.733333 512 171.733333 767.886246 171.733333 974.048781 352.120043 974.048781 572.8 974.048781 793.479955 767.886246 973.866667 512 973.866667 256.113754 973.866667 49.951219 793.479955 49.951219 572.8 49.951219 427.029845 140.536466 294.462295 284.745583 223.557118 297.132651 217.466607 302.254953 202.450961 296.186566 190.018733 290.11818 177.586505 275.157079 172.445527 262.770012 178.536038 102.138268 257.515945 0 406.990833 0 572.8Z\"  ></path></symbol><symbol id=\"icon-clock\" viewBox=\"0 0 1024 1024\"><path d=\"M1024 512C1024 229.230208 794.769792 0 512 0 229.230208 0 0 229.230208 0 512 0 794.769792 229.230208 1024 512 1024 625.316262 1024 733.09232 987.060258 821.44823 919.93747 832.170355 911.792017 834.259159 896.496821 826.113707 885.774697 817.968254 875.052572 802.67306 872.963767 791.950935 881.10922 712.006355 941.842033 614.569408 975.238095 512 975.238095 256.160663 975.238095 48.761905 767.839337 48.761905 512 48.761905 256.160663 256.160663 48.761905 512 48.761905 767.839337 48.761905 975.238095 256.160663 975.238095 512 975.238095 606.738266 946.765111 697.157764 894.355733 773.603714 886.741822 784.709602 889.572629 799.884996 900.678517 807.498908 911.784403 815.112819 926.959799 812.282012 934.573709 801.176124 992.505146 716.675526 1024 616.659703 1024 512Z\"  ></path><path d=\"M487.619049 609.52381C487.619049 622.989037 498.534771 633.904762 512 633.904762 525.465229 633.904762 536.380951 622.989037 536.380951 609.52381L536.380951 243.809523C536.380951 230.344297 525.465229 219.428572 512 219.428572 498.534771 219.428572 487.619049 230.344297 487.619049 243.809523L487.619049 609.52381Z\"  ></path><path d=\"M481.586633 471.564079C472.719716 461.430462 457.316742 460.403597 447.183125 469.270511 437.049508 478.137425 436.022643 493.540401 444.889559 503.674018L615.556226 698.721636C624.42314 708.855253 639.826114 709.882118 649.959731 701.015204 660.093348 692.148288 661.120213 676.745314 652.253299 666.611697L481.586633 471.564079Z\"  ></path></symbol><symbol id=\"icon-remind\" viewBox=\"0 0 1024 1024\"><path d=\"M0 435.309237 0 610.024096C0 645.308043 28.657739 674 63.838605 674L228.9009 674 213.800267 667.735906 469.201726 923.669451C499.273171 953.803546 535.639639 938.646511 535.639639 895.975706L535.639639 149.357629C535.639639 106.839052 499.309939 91.492944 469.201726 121.663883L213.800267 377.597427 228.9009 371.333333 63.838605 371.333333C28.573201 371.333333 0 400.011223 0 435.309237ZM228.9009 414 237.750464 414 244.001534 407.735906 499.402993 151.802362C501.578012 149.62281 503.223142 148.452401 503.936853 148.166441 502.587712 148.706997 500.074389 148.808867 497.235991 147.609892 494.446571 146.431607 492.826063 144.636013 492.299426 143.387549 492.628553 144.167789 492.972973 146.225184 492.972973 149.357629L492.972973 895.975706C492.972973 899.146332 492.625939 901.221845 492.296619 902.001423 492.834735 900.727578 494.485777 898.907403 497.311223 897.729796 500.154871 896.544602 502.647469 896.657431 503.972905 897.192945 503.239477 896.896619 501.582121 895.714639 499.402993 893.530972L244.001534 637.597427 237.750464 631.333333 228.9009 631.333333 63.838605 631.333333C52.233293 631.333333 42.666667 621.755283 42.666667 610.024096L42.666667 435.309237C42.666667 423.540514 52.172352 414 63.838605 414L228.9009 414Z\"  ></path><path d=\"M821.045045 535.666667C821.045045 416.514537 730.531159 319.333333 618.090091 319.333333 606.308015 319.333333 596.756757 328.884593 596.756757 340.666667 596.756757 352.44874 606.308015 362 618.090091 362 706.262724 362 778.378379 439.427744 778.378379 535.666667 778.378379 631.905589 706.262724 709.333333 618.090091 709.333333 606.308015 709.333333 596.756757 718.884593 596.756757 730.666667 596.756757 742.44874 606.308015 752 618.090091 752 730.531159 752 821.045045 654.818797 821.045045 535.666667Z\"  ></path><path d=\"M1002.666667 527.293033C1002.666667 369.877487 905.044211 229.428404 756.28896 165.086453 745.475106 160.409076 732.916983 165.383673 728.239605 176.197526 723.562229 187.011379 728.536826 199.569503 739.350679 204.24688 872.873312 262.000181 960 387.349039 960 527.293033 960 660.177203 881.48423 780.22717 758.227616 841.567753 747.679578 846.81715 743.384179 859.623501 748.633577 870.171539 753.882974 880.719578 766.689325 885.014976 777.237363 879.765581 914.638133 811.385935 1002.666667 676.791034 1002.666667 527.293033Z\"  ></path></symbol><symbol id=\"icon-calendar\" viewBox=\"0 0 1024 1024\"><path d=\"M128.194764 929.441442C85.742288 929.441442 51.2 894.408934 51.2 851.471951L51.2 151.063063 25.6 177.009009 896.131998 177.009009C938.35962 177.009009 972.8 211.994665 972.8 254.743324L972.8 838.63063C972.8 852.960181 984.26151 864.576576 998.4 864.576576 1012.53849 864.576576 1024 852.960181 1024 838.63063L1024 254.743324C1024 183.362078 966.662825 125.117117 896.131998 125.117117L25.6 125.117117C11.46151 125.117117 0 136.733513 0 151.063063L0 851.471951C0 923.060267 57.457637 981.333333 128.194764 981.333333L883.2 981.333333C897.33849 981.333333 908.8 969.716939 908.8 955.387388 908.8 941.057837 897.33849 929.441442 883.2 929.441442L128.194764 929.441442Z\"  ></path><path d=\"M281.6 254.846846C281.6 269.176397 293.06151 280.792794 307.2 280.792794 321.33849 280.792794 332.8 269.176397 332.8 254.846846L332.8 60.252252C332.8 45.922702 321.33849 34.306306 307.2 34.306306 293.06151 34.306306 281.6 45.922702 281.6 60.252252L281.6 254.846846Z\"  ></path><path d=\"M716.8 241.873873C716.8 256.203424 728.26151 267.819821 742.4 267.819821 756.53849 267.819821 768 256.203424 768 241.873873L768 47.279279C768 32.949729 756.53849 21.333333 742.4 21.333333 728.26151 21.333333 716.8 32.949729 716.8 47.279279L716.8 241.873873Z\"  ></path><path d=\"M332.8 410.522522C346.93849 410.522522 358.4 398.906127 358.4 384.576576 358.4 370.247027 346.93849 358.63063 332.8 358.63063L192 358.63063C177.86151 358.63063 166.4 370.247027 166.4 384.576576 166.4 398.906127 177.86151 410.522522 192 410.522522L332.8 410.522522Z\"  ></path><path d=\"M614.4 410.522522C628.53849 410.522522 640 398.906127 640 384.576576 640 370.247027 628.53849 358.63063 614.4 358.63063L473.6 358.63063C459.46151 358.63063 448 370.247027 448 384.576576 448 398.906127 459.46151 410.522522 473.6 410.522522L614.4 410.522522Z\"  ></path><path d=\"M870.4 410.522522C884.53849 410.522522 896 398.906127 896 384.576576 896 370.247027 884.53849 358.63063 870.4 358.63063L729.6 358.63063C715.46151 358.63063 704 370.247027 704 384.576576 704 398.906127 715.46151 410.522522 729.6 410.522522L870.4 410.522522Z\"  ></path><path d=\"M332.8 566.198197C346.93849 566.198197 358.4 554.581803 358.4 540.252252 358.4 525.922703 346.93849 514.306306 332.8 514.306306L192 514.306306C177.86151 514.306306 166.4 525.922703 166.4 540.252252 166.4 554.581803 177.86151 566.198197 192 566.198197L332.8 566.198197Z\"  ></path><path d=\"M614.4 566.198197C628.53849 566.198197 640 554.581803 640 540.252252 640 525.922703 628.53849 514.306306 614.4 514.306306L473.6 514.306306C459.46151 514.306306 448 525.922703 448 540.252252 448 554.581803 459.46151 566.198197 473.6 566.198197L614.4 566.198197Z\"  ></path><path d=\"M870.4 566.198197C884.53849 566.198197 896 554.581803 896 540.252252 896 525.922703 884.53849 514.306306 870.4 514.306306L729.6 514.306306C715.46151 514.306306 704 525.922703 704 540.252252 704 554.581803 715.46151 566.198197 729.6 566.198197L870.4 566.198197Z\"  ></path><path d=\"M332.8 721.873873C346.93849 721.873873 358.4 710.257478 358.4 695.927927 358.4 681.598379 346.93849 669.981982 332.8 669.981982L192 669.981982C177.86151 669.981982 166.4 681.598379 166.4 695.927927 166.4 710.257478 177.86151 721.873873 192 721.873873L332.8 721.873873Z\"  ></path><path d=\"M614.4 721.873873C628.53849 721.873873 640 710.257478 640 695.927927 640 681.598379 628.53849 669.981982 614.4 669.981982L473.6 669.981982C459.46151 669.981982 448 681.598379 448 695.927927 448 710.257478 459.46151 721.873873 473.6 721.873873L614.4 721.873873Z\"  ></path><path d=\"M870.4 721.873873C884.53849 721.873873 896 710.257478 896 695.927927 896 681.598379 884.53849 669.981982 870.4 669.981982L729.6 669.981982C715.46151 669.981982 704 681.598379 704 695.927927 704 710.257478 715.46151 721.873873 729.6 721.873873L870.4 721.873873Z\"  ></path></symbol><symbol id=\"icon-attachment\" viewBox=\"0 0 1024 1024\"><path d=\"M472.153474 119.228972 92.638513 517.750743C-3.525822 618.731164-2.288327 780.624077 95.536728 880.163189L99.321659 884.014438C197.267042 983.675987 357.082027 984.489975 455.906639 885.911622L955.925037 387.139215C1034.944759 308.316403 1036.587465 179.168202 959.634413 98.61339L941.34458 116.085449 923.054748 133.557508 927.277389 137.977788 945.567221 120.505729 963.857054 103.03367C886.268179 21.813275 760.692811 22.649855 683.951435 104.944905L209.92702 613.273856C171.75695 654.206246 173.954266 718.232602 214.90487 756.419659L226.383979 767.1241C267.274317 805.254957 331.360614 803.034336 369.461105 762.176561L738.140738 366.81606C747.66794 356.599386 747.109013 340.593813 736.892339 331.066609 726.675665 321.539407 710.670091 322.098334 701.142889 332.315008L332.463258 727.675509C313.421342 748.095465 281.346492 749.206871 260.88503 730.126253L249.405922 719.421811C228.898628 700.298449 227.799923 668.2839 246.924868 647.774908L720.949284 139.445957C777.863249 78.413202 869.791012 77.800782 927.277389 137.977788 950.573468 162.364232 987.153133 127.420114 963.857054 103.03367L959.634413 98.61339C936.338334 74.226946 899.758669 109.171065 923.054748 133.557508 980.99271 194.207237 979.749843 291.920378 920.198449 351.323377L420.180051 850.095785C341.242127 928.837003 213.662948 928.187202 135.402204 848.5552L131.617273 844.703949C52.922438 764.630251 51.922852 633.86137 129.272687 552.637713L508.787648 154.115942C518.421419 143.999694 518.030293 127.989141 507.914046 118.35537 497.797798 108.7216 481.787245 109.112724 472.153474 119.228972L472.153474 119.228972Z\"  ></path></symbol><symbol id=\"icon-discount\" viewBox=\"0 0 1024 1024\"><path d=\"M855.903027 561.400463 457.002421 933.283098C427.000478 961.36995 378.630415 961.004819 349.185589 932.452262L87.045522 678.255834C58.072052 650.160348 57.513624 603.882908 85.796115 574.971917L565.999763 84.097076 548.571428 91.428572 877.886948 91.428572C918.232493 91.428572 950.857143 124.131073 950.857143 164.747843L950.857143 481.52381C950.857143 494.989037 961.772866 505.904762 975.238095 505.904762 988.703324 505.904762 999.619049 494.989037 999.619049 481.52381L999.619049 164.747843C999.619049 97.226599 945.189001 42.666667 877.886948 42.666667L548.571428 42.666667C542.012309 42.666667 535.729847 45.30948 531.143093 49.998162L50.939447 540.873001C3.783193 589.077171 4.715564 666.343661 53.100125 713.262025L315.240192 967.458453C363.379925 1014.139405 441.35376 1014.728006 490.290377 968.915004L889.153871 597.067042C899.002925 587.885075 899.543706 572.457385 890.361739 562.608331 881.179772 552.759277 865.752081 552.218496 855.903027 561.400463L855.903027 561.400463Z\"  ></path><path d=\"M743.619049 408.380951C804.212574 408.380951 853.333333 359.260194 853.333333 298.666667 853.333333 238.07314 804.212574 188.952381 743.619049 188.952381 683.025521 188.952381 633.904762 238.07314 633.904762 298.666667 633.904762 359.260194 683.025521 408.380951 743.619049 408.380951L743.619049 408.380951ZM743.619049 359.619049C709.955977 359.619049 682.666667 332.329737 682.666667 298.666667 682.666667 265.003597 709.955977 237.714286 743.619049 237.714286 777.282118 237.714286 804.571428 265.003597 804.571428 298.666667 804.571428 332.329737 777.282118 359.619049 743.619049 359.619049L743.619049 359.619049Z\"  ></path></symbol><symbol id=\"icon-service\" viewBox=\"0 0 1024 1024\"><path d=\"M537.676629 572.777016C667.27978 572.777016 772.259879 466.772722 772.259879 336.112332 772.259879 205.451942 667.27978 99.447648 537.676629 99.447648 408.073477 99.447648 303.093381 205.451942 303.093381 336.112332 303.093381 466.772722 408.073477 572.777016 537.676629 572.777016L537.676629 572.777016ZM537.676629 530.304582C431.623156 530.304582 345.565814 443.407655 345.565814 336.112332 345.565814 228.817008 431.623156 141.920082 537.676629 141.920082 643.730103 141.920082 729.787446 228.817008 729.787446 336.112332 729.787446 443.407655 643.730103 530.304582 537.676629 530.304582L537.676629 530.304582Z\"  ></path><path d=\"M1001.664066 1024.000004C1001.664066 751.431228 782.755985 530.387459 512.615542 530.387459 242.4751 530.387459 23.567019 751.431228 23.567019 1024.000004L66.039452 1024.000004C66.039452 774.796294 266.024779 572.859892 512.615542 572.859892 759.206306 572.859892 959.191633 774.796294 959.191633 1024.000004L1001.664066 1024.000004 1001.664066 1024.000004Z\"  ></path><path d=\"M233.809816 572.859892C281.846495 572.859892 320.7039 533.623389 320.7039 485.325241 320.7039 437.027096 281.846495 397.790593 233.809816 397.790593 185.773138 397.790593 146.915732 437.027096 146.915732 485.325241 146.915732 533.623389 185.773138 572.859892 233.809816 572.859892L233.809816 572.859892ZM233.809816 530.387459C209.322817 530.387459 189.388166 510.258322 189.388166 485.325241 189.388166 460.392163 209.322817 440.263026 233.809816 440.263026 258.296816 440.263026 278.231467 460.392163 278.231467 485.325241 278.231467 510.258322 258.296816 530.387459 233.809816 530.387459L233.809816 530.387459Z\"  ></path><path d=\"M830.543236 520.287306C838.435011 517.213408 856.420583 512.250861 869.738118 507.413846 871.10678 506.916965 871.10678 506.916965 872.477119 506.42035 883.299946 502.499785 894.907365 498.352896 906.516385 494.244034 913.482439 491.778488 918.897025 489.874927 921.981649 488.795985L936.206384 483.820443 936.206384 468.750633 936.206384 282.286293 936.206384 269.008648 924.26945 263.194403C922.053561 262.115087 918.144366 260.19565 913.109699 257.697247 904.720115 253.534 896.333421 249.310732 888.525544 245.293116 886.929012 244.470731 886.929012 244.470731 885.338411 243.647696 876.494909 239.066281 869.177034 235.138507 863.892556 232.110649 861.160872 230.54547 859.071734 229.275744 857.78666 228.410362 859.888255 229.825599 860.115079 230.016911 862.214218 234.916219 804.257697 99.647907 670.564953 0 531.990097 0 337.403916 0 179.744666 159.197389 179.744666 355.474788 179.744666 378.590106 181.933686 401.433919 186.246239 423.785122L227.949506 415.738687C224.147939 396.035838 222.2171 375.886294 222.2171 355.474788 222.2171 182.562455 360.953596 42.472433 531.990097 42.472433 652.531844 42.472433 771.567984 131.196039 823.17426 251.643123 827.282349 261.231249 830.445679 263.043749 865.801418 281.359942 867.446153 282.210985 867.446153 282.210985 869.092686 283.059126 877.10527 287.182075 885.669071 291.494531 894.229978 295.742796 899.365609 298.291301 903.366644 300.255832 905.670886 301.378183L893.733951 282.286293 893.733951 468.750633 907.958689 448.705284C904.827575 449.800489 899.364613 451.721059 892.345253 454.205469 880.645251 458.346535 868.943646 462.527074 858.011386 466.48728 856.62458 466.989862 856.62458 466.989862 855.238611 467.493025 841.640096 472.432095 830.384497 476.618365 822.125588 479.835263 817.286018 481.720307 813.48815 483.267063 810.712137 484.49784 808.902954 485.299962 807.434242 486.005276 806.123281 486.734668 804.750891 487.504549 804.750891 487.504549 802.39627 489.219923 797.915841 491.325505 788.070803 499.05109 795.378771 512.767063 802.686739 526.483036 826.258515 521.956233 830.543236 520.287306Z\"  ></path></symbol><symbol id=\"icon-print\" viewBox=\"0 0 1024 1024\"><path d=\"M24.380952 265.886178 902.094615 265.886178C942.428977 265.886178 975.238095 298.903371 975.238095 339.485775L975.238095 779.447155 999.619049 754.99187 853.333333 754.99187 877.714285 779.447155 877.714285 681.626016 877.714285 657.170731 853.333333 657.170731 170.666667 657.170731 146.285714 657.170731 146.285714 681.626016 146.285714 779.447155 170.666667 754.99187 121.955642 754.99187C81.590725 754.99187 48.761905 721.971868 48.761905 681.392275L48.761905 241.430895 24.380952 265.886178 24.380952 265.886178ZM24.380952 216.97561 0 216.97561 0 241.430895 0 681.392275C0 748.954229 54.630068 803.902438 121.955642 803.902438L170.666667 803.902438 195.047619 803.902438 195.047619 779.447155 195.047619 681.626016 170.666667 706.081301 853.333333 706.081301 828.952382 681.626016 828.952382 779.447155 828.952382 803.902438 853.333333 803.902438 999.619049 803.902438 1024 803.902438 1024 779.447155 1024 339.485775C1024 271.92663 969.395277 216.97561 902.094615 216.97561L24.380952 216.97561 24.380952 216.97561Z\"  ></path><path d=\"M755.809523 999.544715 780.190477 975.089431 243.809523 975.089431 268.190477 999.544715 268.190477 776.325203C268.190477 762.818923 257.274752 751.869918 243.809523 751.869918 230.344297 751.869918 219.428572 762.818923 219.428572 776.325203L219.428572 999.544715C219.428572 1013.050995 230.344297 1024 243.809523 1024L780.190477 1024C793.655703 1024 804.571428 1013.050995 804.571428 999.544715L804.571428 776.325203C804.571428 762.818923 793.655703 751.869918 780.190477 751.869918 766.725248 751.869918 755.809523 762.818923 755.809523 776.325203L755.809523 999.544715Z\"  ></path><path d=\"M207.238095 437.073171 524.190477 437.073171 524.190477 388.162603 207.238095 388.162603 207.238095 437.073171 207.238095 437.073171Z\"  ></path><path d=\"M219.428572 241.430895 219.428572 45.788618 195.047619 70.243903 828.952382 70.243903 804.571428 45.788618 804.571428 241.430933 853.333333 241.430933 853.333333 45.788618 853.333333 21.333333 828.952382 21.333333 195.047619 21.333333 170.666667 21.333333 170.666667 45.788618 170.666667 241.430895 219.428572 241.430895 219.428572 241.430895Z\"  ></path></symbol><symbol id=\"icon-box\" viewBox=\"0 0 1024 1024\"><path d=\"M58.18714 261.513847 489.750985 506.066692C497.230148 510.304885 506.385346 510.304885 513.86451 506.066692L945.428356 261.513847C962.456593 251.864512 961.814227 227.116685 944.308329 218.363735L512.744484 2.581813C505.859648-0.860604 497.755846-0.860604 490.871012 2.581813L59.307167 218.363735C41.801269 227.116685 41.158901 251.864512 58.18714 261.513847L58.18714 261.513847ZM82.300665 218.960567 81.180638 262.110679 512.744484 46.328756 490.871012 46.328756 922.434857 262.110679 921.314829 218.960567 489.750985 463.513412 513.86451 463.513412 82.300665 218.960567 82.300665 218.960567Z\"  ></path><path d=\"M477.352463 504.929698 477.352463 974.793958C477.352463 993.514057 497.526411 1005.2927 513.828779 996.090807L974.163548 736.254285C981.846246 731.917777 986.597801 723.77952 986.597801 714.957436L986.597801 398.477284C986.597801 384.971004 975.648796 374.021999 962.142515 374.021999 948.636235 374.021999 937.687232 384.971004 937.687232 398.477284L937.687232 714.957436 950.121483 693.660589 489.786716 953.497111 526.263031 974.793958 526.263031 504.929698C526.263031 491.423418 515.314029 480.474415 501.807748 480.474415 488.301468 480.474415 477.352463 491.423418 477.352463 504.929698L477.352463 504.929698Z\"  ></path><path d=\"M514.421935 953.842987 82.858091 694.006466 94.699187 714.957436 94.699187 254.622669C94.699187 241.116388 83.750183 230.167383 70.243903 230.167383 56.737622 230.167383 45.788618 241.116388 45.788618 254.622669L45.788618 714.957436C45.788618 723.534342 50.281834 731.484386 57.629714 735.908407L489.193559 995.74493C500.764461 1002.711554 515.792096 998.979049 522.758718 987.408147 529.725342 975.837246 525.992838 960.809611 514.421935 953.842987L514.421935 953.842987Z\"  ></path><path d=\"M172.745454 448.218441 316.60007 534.531209C328.181609 541.480132 343.203518 537.724655 350.152444 526.143115 357.101367 514.561577 353.34589 499.539667 341.76435 492.590741L197.909735 406.277973C186.328194 399.32905 171.306285 403.084527 164.357361 414.666067 157.408437 426.247607 161.163914 441.269517 172.745454 448.218441L172.745454 448.218441Z\"  ></path></symbol><symbol id=\"icon-process\" viewBox=\"0 0 1028 1024\"><path d=\"M965.426743 541.836386C955.038827 339.605751 811.004092 169.469444 615.449711 124.450173 601.95866 121.34435 588.504235 129.763241 585.398411 143.254293 582.292589 156.745345 590.711479 170.19977 604.20253 173.305593 778.021961 213.321184 906.125274 364.639021 915.359418 544.408179 916.0696 558.233888 927.853267 568.866125 941.678976 568.155945 955.504687 567.445764 966.136924 555.662097 965.426743 541.836386L965.426743 541.836386ZM386.693427 130.952194C195.197668 186.776034 61.059829 362.94826 61.059829 565.408546 61.059829 609.513775 67.378292 652.800892 79.687136 694.294543 83.62428 707.566827 97.575277 715.134451 110.847561 711.197308 124.119844 707.260164 131.68747 693.309167 127.750327 680.036883 116.810772 643.159168 111.193162 604.673523 111.193162 565.408546 111.193162 385.380604 230.48234 228.710122 400.724023 179.082159 414.014746 175.207717 421.648149 161.292601 417.773707 148.001879 413.899266 134.711156 399.984149 127.077752 386.693427 130.952194L386.693427 130.952194ZM196.356828 888.107575C280.412745 970.736506 393.28759 1017.894018 513.545299 1017.894018 643.321289 1017.894018 764.304599 962.930765 849.557581 868.463038 858.832625 858.185481 858.019927 842.334965 847.742372 833.059923 837.464815 823.784879 821.6143 824.597574 812.339255 834.875132 736.494948 918.917229 628.982336 967.760685 513.545299 967.760685 406.569346 967.760685 306.273973 925.858699 231.501677 852.355782 221.62909 842.650801 205.758337 842.786671 196.053355 852.659255 186.348373 862.53184 186.484242 878.402594 196.356828 888.107575L196.356828 888.107575Z\"  ></path><path d=\"M498.280341 285.176068C571.138502 285.176068 630.201709 226.11286 630.201709 153.254701 630.201709 80.396541 571.138502 21.333333 498.280341 21.333333 425.422182 21.333333 366.358974 80.396541 366.358974 153.254701 366.358974 226.11286 425.422182 285.176068 498.280341 285.176068L498.280341 285.176068ZM498.280341 235.042735C453.110059 235.042735 416.492307 198.424985 416.492307 153.254701 416.492307 108.084417 453.110059 71.466667 498.280341 71.466667 543.450626 71.466667 580.068375 108.084417 580.068375 153.254701 580.068375 198.424985 543.450626 235.042735 498.280341 235.042735L498.280341 235.042735Z\"  ></path><path d=\"M131.921367 926.304273C204.779527 926.304273 263.842735 867.241065 263.842735 794.382906 263.842735 721.524747 204.779527 662.461538 131.921367 662.461538 59.063208 662.461538 0 721.524747 0 794.382906 0 867.241065 59.063208 926.304273 131.921367 926.304273L131.921367 926.304273ZM131.921367 876.17094C86.751084 876.17094 50.133333 839.55319 50.133333 794.382906 50.133333 749.212623 86.751084 712.594871 131.921367 712.594871 177.091651 712.594871 213.709402 749.212623 213.709402 794.382906 213.709402 839.55319 177.091651 876.17094 131.921367 876.17094L131.921367 876.17094Z\"  ></path><path d=\"M895.169231 895.774359C968.02739 895.774359 1027.090598 836.711151 1027.090598 763.852992 1027.090598 690.994831 968.02739 631.931625 895.169231 631.931625 822.311072 631.931625 763.247863 690.994831 763.247863 763.852992 763.247863 836.711151 822.311072 895.774359 895.169231 895.774359L895.169231 895.774359ZM895.169231 845.641026C849.998946 845.641026 813.381197 809.023275 813.381197 763.852992 813.381197 718.682707 849.998946 682.064958 895.169231 682.064958 940.339516 682.064958 976.957265 718.682707 976.957265 763.852992 976.957265 809.023275 940.339516 845.641026 895.169231 845.641026L895.169231 845.641026Z\"  ></path></symbol><symbol id=\"icon-beauty\" viewBox=\"0 0 1024 1024\"><path d=\"M743.619048 511.999998 743.619048 999.619045 767.999999 975.238091 402.436749 975.238091C361.966454 975.238091 329.142858 942.460515 329.142858 902.114008L329.142858 511.999998 304.761906 536.380949 572.952382 536.380949C586.417608 536.380949 597.333333 525.465227 597.333333 511.999998 597.333333 498.534769 586.417608 487.619047 572.952382 487.619047L304.761906 487.619047 280.380953 487.619047 280.380953 511.999998 280.380953 902.114008C280.380953 969.406298 335.051301 1023.999996 402.436749 1023.999996L767.999999 1023.999996 792.38095 1023.999996 792.38095 999.619045 792.38095 511.999998C792.38095 498.534769 781.465228 487.619047 767.999999 487.619047 754.53477 487.619047 743.619048 498.534769 743.619048 511.999998L743.619048 511.999998Z\"  ></path><path d=\"M670.476189 390.095237 670.476189 121.904761C669.24573 106.724361 665.564723 88.343325 657.506525 69.449458 641.134018 31.061232 612.120891 7.41427 570.10368 12.357471 565.389728 12.912054 560.65841 13.832954 555.912998 15.100715 526.12375 23.059059 496.579123 44.100961 467.116168 74.125843 454.583228 86.897815 442.894214 100.499022 432.311201 114.099062 425.929992 122.299438 421.280327 128.756187 418.664001 132.623069L414.476191 138.812577 414.476191 146.285714 414.476191 402.575798 463.238095 402.575798 463.238095 146.285714 459.050285 159.948358C461.092638 156.929797 465.120136 151.33702 470.794381 144.04515 480.303791 131.824778 490.805099 119.605573 501.920188 108.278494 525.80899 83.934076 548.994795 67.420975 568.498592 62.210439 571.02992 61.534183 573.465015 61.060217 575.801081 60.785386 592.608825 58.808004 603.871353 67.987456 612.653661 88.579122 615.935464 96.273886 618.404081 104.764223 620.111257 113.288988 621.128998 118.371054 621.64641 122.186165 621.806333 124.021357L621.714284 390.095237 670.476189 390.095237 670.476189 390.095237Z\"  ></path><path d=\"M774.15806 483.754552 688.824727 386.230744C684.195073 380.939713 677.506745 377.90476 670.476189 377.90476L390.095239 377.90476C382.57151 377.90476 375.469202 381.378384 370.85008 387.317255L285.516747 497.031541C277.249896 507.660348 279.164641 522.978306 289.793449 531.245156 300.422256 539.512006 315.740214 537.597263 324.007064 526.968454L409.340397 417.25417 390.095239 426.666665 670.476189 426.666665 652.127654 418.340683 737.460987 515.864491C746.327901 525.998108 761.730875 527.024973 771.864492 518.158059 781.998109 509.291143 783.024974 493.888169 774.15806 483.754552L774.15806 483.754552Z\"  ></path></symbol></svg>',t=(t=document.getElementsByTagName(\"script\"))[t.length-1].getAttribute(\"data-injectcss\"),m=function(a,h){h.parentNode.insertBefore(a,h)};if(t&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(a){console&&console.log(a)}}function s(){i||(i=!0,l())}function p(){try{o.documentElement.doScroll(\"left\")}catch(a){return void setTimeout(p,50)}s()}h=function(){var a,h;(h=document.createElement(\"div\")).innerHTML=v,v=null,(a=h.getElementsByTagName(\"svg\")[0])&&(a.setAttribute(\"aria-hidden\",\"true\"),a.style.position=\"absolute\",a.style.width=0,a.style.height=0,a.style.overflow=\"hidden\",h=a,(a=document.body).firstChild?m(h,a.firstChild):a.appendChild(h))},document.addEventListener?~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState)?setTimeout(h,0):(c=function(){document.removeEventListener(\"DOMContentLoaded\",c,!1),h()},document.addEventListener(\"DOMContentLoaded\",c,!1)):document.attachEvent&&(l=h,o=a.document,i=!1,p(),o.onreadystatechange=function(){\"complete\"==o.readyState&&(o.onreadystatechange=null,s())})}(window);"
  },
  {
    "path": "app/admin/t/tpl/style/fonts/iconfont.json",
    "content": "{\n  \"id\": \"1357552\",\n  \"name\": \"极致CMS图标库\",\n  \"font_family\": \"iconfont\",\n  \"css_prefix_text\": \"icon-\",\n  \"description\": \"\",\n  \"glyphs\": [\n    {\n      \"icon_id\": \"1727551\",\n      \"name\": \"311向上、收起\",\n      \"font_class\": \"xiangshangshouqi\",\n      \"unicode\": \"e964\",\n      \"unicode_decimal\": 59748\n    },\n    {\n      \"icon_id\": \"1727552\",\n      \"name\": \"314指向下\",\n      \"font_class\": \"zhixiangxia\",\n      \"unicode\": \"e965\",\n      \"unicode_decimal\": 59749\n    },\n    {\n      \"icon_id\": \"1727553\",\n      \"name\": \"316第一页\",\n      \"font_class\": \"diyiye\",\n      \"unicode\": \"e966\",\n      \"unicode_decimal\": 59750\n    },\n    {\n      \"icon_id\": \"1727554\",\n      \"name\": \"317最后页\",\n      \"font_class\": \"zuihouye\",\n      \"unicode\": \"e967\",\n      \"unicode_decimal\": 59751\n    },\n    {\n      \"icon_id\": \"1727555\",\n      \"name\": \"319表头-正序\",\n      \"font_class\": \"biaotou-zhengxu\",\n      \"unicode\": \"e968\",\n      \"unicode_decimal\": 59752\n    },\n    {\n      \"icon_id\": \"1727556\",\n      \"name\": \"318表头-可排序\",\n      \"font_class\": \"biaotou-kepaixu\",\n      \"unicode\": \"e969\",\n      \"unicode_decimal\": 59753\n    },\n    {\n      \"icon_id\": \"1727557\",\n      \"name\": \"320表头-倒序\",\n      \"font_class\": \"biaotou-daoxu\",\n      \"unicode\": \"e96a\",\n      \"unicode_decimal\": 59754\n    },\n    {\n      \"icon_id\": \"1727558\",\n      \"name\": \"321 回顶部\",\n      \"font_class\": \"huidingbu\",\n      \"unicode\": \"e96b\",\n      \"unicode_decimal\": 59755\n    },\n    {\n      \"icon_id\": \"1727559\",\n      \"name\": \"323向左交换\",\n      \"font_class\": \"xiangzuojiaohuan\",\n      \"unicode\": \"e96c\",\n      \"unicode_decimal\": 59756\n    },\n    {\n      \"icon_id\": \"1727560\",\n      \"name\": \"322相互交换\",\n      \"font_class\": \"xianghujiaohuan\",\n      \"unicode\": \"e96d\",\n      \"unicode_decimal\": 59757\n    },\n    {\n      \"icon_id\": \"1727561\",\n      \"name\": \"324向右交换\",\n      \"font_class\": \"xiangyoujiaohuan\",\n      \"unicode\": \"e96e\",\n      \"unicode_decimal\": 59758\n    },\n    {\n      \"icon_id\": \"1727562\",\n      \"name\": \"326数值下降\",\n      \"font_class\": \"shuzhixiajiang\",\n      \"unicode\": \"e96f\",\n      \"unicode_decimal\": 59759\n    },\n    {\n      \"icon_id\": \"1727563\",\n      \"name\": \"327全屏\",\n      \"font_class\": \"quanping\",\n      \"unicode\": \"e970\",\n      \"unicode_decimal\": 59760\n    },\n    {\n      \"icon_id\": \"1727564\",\n      \"name\": \"329横向展开\",\n      \"font_class\": \"hengxiangzhankai\",\n      \"unicode\": \"e971\",\n      \"unicode_decimal\": 59761\n    },\n    {\n      \"icon_id\": \"1727565\",\n      \"name\": \"325数值上升\",\n      \"font_class\": \"shuzhishangsheng\",\n      \"unicode\": \"e972\",\n      \"unicode_decimal\": 59762\n    },\n    {\n      \"icon_id\": \"1727566\",\n      \"name\": \"328退出全屏\",\n      \"font_class\": \"tuichuquanping\",\n      \"unicode\": \"e973\",\n      \"unicode_decimal\": 59763\n    },\n    {\n      \"icon_id\": \"1727567\",\n      \"name\": \"330横向收起\",\n      \"font_class\": \"hengxiangshouqi\",\n      \"unicode\": \"e974\",\n      \"unicode_decimal\": 59764\n    },\n    {\n      \"icon_id\": \"1727568\",\n      \"name\": \"331刷新\",\n      \"font_class\": \"shuaxin\",\n      \"unicode\": \"e975\",\n      \"unicode_decimal\": 59765\n    },\n    {\n      \"icon_id\": \"1727569\",\n      \"name\": \"332同步\",\n      \"font_class\": \"tongbu\",\n      \"unicode\": \"e976\",\n      \"unicode_decimal\": 59766\n    },\n    {\n      \"icon_id\": \"1727570\",\n      \"name\": \"333加载loading-A\",\n      \"font_class\": \"jiazailoading-A\",\n      \"unicode\": \"e977\",\n      \"unicode_decimal\": 59767\n    },\n    {\n      \"icon_id\": \"1727571\",\n      \"name\": \"333加载loading-B\",\n      \"font_class\": \"jiazailoading-B\",\n      \"unicode\": \"e978\",\n      \"unicode_decimal\": 59768\n    },\n    {\n      \"icon_id\": \"1727581\",\n      \"name\": \"401位置-线性\",\n      \"font_class\": \"weizhi-xianxing\",\n      \"unicode\": \"e979\",\n      \"unicode_decimal\": 59769\n    },\n    {\n      \"icon_id\": \"1727582\",\n      \"name\": \"401位置\",\n      \"font_class\": \"weizhi\",\n      \"unicode\": \"e97a\",\n      \"unicode_decimal\": 59770\n    },\n    {\n      \"icon_id\": \"1727583\",\n      \"name\": \"402导航\",\n      \"font_class\": \"daohang\",\n      \"unicode\": \"e97b\",\n      \"unicode_decimal\": 59771\n    },\n    {\n      \"icon_id\": \"1727584\",\n      \"name\": \"404定位\",\n      \"font_class\": \"dingwei\",\n      \"unicode\": \"e97c\",\n      \"unicode_decimal\": 59772\n    },\n    {\n      \"icon_id\": \"1727585\",\n      \"name\": \"404监控、摄像头-线性\",\n      \"font_class\": \"jiankongshexiangtou-xianxing\",\n      \"unicode\": \"e97d\",\n      \"unicode_decimal\": 59773\n    },\n    {\n      \"icon_id\": \"1727586\",\n      \"name\": \"403拓点图\",\n      \"font_class\": \"tuodiantu\",\n      \"unicode\": \"e97e\",\n      \"unicode_decimal\": 59774\n    },\n    {\n      \"icon_id\": \"1727587\",\n      \"name\": \"404监控、摄像头\",\n      \"font_class\": \"jiankongshexiangtou\",\n      \"unicode\": \"e97f\",\n      \"unicode_decimal\": 59775\n    },\n    {\n      \"icon_id\": \"1727588\",\n      \"name\": \"405雷达、探测\",\n      \"font_class\": \"leidatance\",\n      \"unicode\": \"e980\",\n      \"unicode_decimal\": 59776\n    },\n    {\n      \"icon_id\": \"1727589\",\n      \"name\": \"406报表\",\n      \"font_class\": \"baobiao\",\n      \"unicode\": \"e981\",\n      \"unicode_decimal\": 59777\n    },\n    {\n      \"icon_id\": \"1727590\",\n      \"name\": \"407饼图-线性\",\n      \"font_class\": \"bingtu-xianxing\",\n      \"unicode\": \"e982\",\n      \"unicode_decimal\": 59778\n    },\n    {\n      \"icon_id\": \"1727591\",\n      \"name\": \"406报表-线性\",\n      \"font_class\": \"baobiao-xianxing\",\n      \"unicode\": \"e983\",\n      \"unicode_decimal\": 59779\n    },\n    {\n      \"icon_id\": \"1727592\",\n      \"name\": \"407饼图\",\n      \"font_class\": \"bingtu\",\n      \"unicode\": \"e984\",\n      \"unicode_decimal\": 59780\n    },\n    {\n      \"icon_id\": \"1727593\",\n      \"name\": \"408条形图\",\n      \"font_class\": \"tiaoxingtu\",\n      \"unicode\": \"e985\",\n      \"unicode_decimal\": 59781\n    },\n    {\n      \"icon_id\": \"1727594\",\n      \"name\": \"408条形图-线性\",\n      \"font_class\": \"tiaoxingtu-xianxing\",\n      \"unicode\": \"e986\",\n      \"unicode_decimal\": 59782\n    },\n    {\n      \"icon_id\": \"1727595\",\n      \"name\": \"409折线图\",\n      \"font_class\": \"zhexiantu\",\n      \"unicode\": \"e987\",\n      \"unicode_decimal\": 59783\n    },\n    {\n      \"icon_id\": \"1727596\",\n      \"name\": \"409折线图-线性\",\n      \"font_class\": \"zhexiantu-xianxing\",\n      \"unicode\": \"e988\",\n      \"unicode_decimal\": 59784\n    },\n    {\n      \"icon_id\": \"1727597\",\n      \"name\": \"410指南、指导-线性\",\n      \"font_class\": \"zhinanzhidao-xianxing\",\n      \"unicode\": \"e989\",\n      \"unicode_decimal\": 59785\n    },\n    {\n      \"icon_id\": \"1727598\",\n      \"name\": \"411地图\",\n      \"font_class\": \"ditu\",\n      \"unicode\": \"e98a\",\n      \"unicode_decimal\": 59786\n    },\n    {\n      \"icon_id\": \"1727599\",\n      \"name\": \"410指南、指导\",\n      \"font_class\": \"zhinanzhidao\",\n      \"unicode\": \"e98b\",\n      \"unicode_decimal\": 59787\n    },\n    {\n      \"icon_id\": \"1727600\",\n      \"name\": \"902投诉\",\n      \"font_class\": \"tousu\",\n      \"unicode\": \"e98c\",\n      \"unicode_decimal\": 59788\n    },\n    {\n      \"icon_id\": \"1727601\",\n      \"name\": \"901巡检、检验\",\n      \"font_class\": \"xunjianjianyan\",\n      \"unicode\": \"e98d\",\n      \"unicode_decimal\": 59789\n    },\n    {\n      \"icon_id\": \"1795840\",\n      \"name\": \"50店铺\",\n      \"font_class\": \"dianpu\",\n      \"unicode\": \"e98e\",\n      \"unicode_decimal\": 59790\n    },\n    {\n      \"icon_id\": \"1727257\",\n      \"name\": \"01运输中、物流-线性\",\n      \"font_class\": \"yunshuzhongwuliu-xianxing\",\n      \"unicode\": \"e88f\",\n      \"unicode_decimal\": 59535\n    },\n    {\n      \"icon_id\": \"1795841\",\n      \"name\": \"50店铺-线性\",\n      \"font_class\": \"dianpu-xianxing\",\n      \"unicode\": \"e98f\",\n      \"unicode_decimal\": 59791\n    },\n    {\n      \"icon_id\": \"1727258\",\n      \"name\": \"01运输中、物流\",\n      \"font_class\": \"yunshuzhongwuliu\",\n      \"unicode\": \"e890\",\n      \"unicode_decimal\": 59536\n    },\n    {\n      \"icon_id\": \"1795843\",\n      \"name\": \"51快递员\",\n      \"font_class\": \"kuaidiyuan\",\n      \"unicode\": \"e990\",\n      \"unicode_decimal\": 59792\n    },\n    {\n      \"icon_id\": \"1727259\",\n      \"name\": \"02包裹、发货\",\n      \"font_class\": \"baoguofahuo\",\n      \"unicode\": \"e891\",\n      \"unicode_decimal\": 59537\n    },\n    {\n      \"icon_id\": \"1795844\",\n      \"name\": \"51快递员-线性\",\n      \"font_class\": \"kuaidiyuan-xianxing\",\n      \"unicode\": \"e991\",\n      \"unicode_decimal\": 59793\n    },\n    {\n      \"icon_id\": \"1727260\",\n      \"name\": \"02包裹、发货-线性\",\n      \"font_class\": \"baoguofahuo-xianxing\",\n      \"unicode\": \"e892\",\n      \"unicode_decimal\": 59538\n    },\n    {\n      \"icon_id\": \"1833769\",\n      \"name\": \"44贷款-线性\",\n      \"font_class\": \"daikuan-xianxing\",\n      \"unicode\": \"e992\",\n      \"unicode_decimal\": 59794\n    },\n    {\n      \"icon_id\": \"1727261\",\n      \"name\": \"03拆包裹、取件\",\n      \"font_class\": \"chaibaoguoqujian\",\n      \"unicode\": \"e893\",\n      \"unicode_decimal\": 59539\n    },\n    {\n      \"icon_id\": \"1833770\",\n      \"name\": \"45还款-线性\",\n      \"font_class\": \"huankuan-xianxing\",\n      \"unicode\": \"e993\",\n      \"unicode_decimal\": 59795\n    },\n    {\n      \"icon_id\": \"1727262\",\n      \"name\": \"03拆包裹、取件-线性\",\n      \"font_class\": \"chaibaoguoqujian-xianxing\",\n      \"unicode\": \"e894\",\n      \"unicode_decimal\": 59540\n    },\n    {\n      \"icon_id\": \"1866719\",\n      \"name\": \"47退款-细\",\n      \"font_class\": \"tuikuan-xi\",\n      \"unicode\": \"e994\",\n      \"unicode_decimal\": 59796\n    },\n    {\n      \"icon_id\": \"1727264\",\n      \"name\": \"04自提柜\",\n      \"font_class\": \"zitigui\",\n      \"unicode\": \"e895\",\n      \"unicode_decimal\": 59541\n    },\n    {\n      \"icon_id\": \"1866720\",\n      \"name\": \"234日历-线性-细\",\n      \"font_class\": \"rili-xianxing-xi\",\n      \"unicode\": \"e995\",\n      \"unicode_decimal\": 59797\n    },\n    {\n      \"icon_id\": \"1727265\",\n      \"name\": \"04自提柜-线性\",\n      \"font_class\": \"zitigui-xianxing\",\n      \"unicode\": \"e896\",\n      \"unicode_decimal\": 59542\n    },\n    {\n      \"icon_id\": \"1866721\",\n      \"name\": \"49计算器、利率-线性-细\",\n      \"font_class\": \"jisuanqilishuai-xianxing-xi\",\n      \"unicode\": \"e996\",\n      \"unicode_decimal\": 59798\n    },\n    {\n      \"icon_id\": \"1727266\",\n      \"name\": \"05采购-线性\",\n      \"font_class\": \"caigou-xianxing\",\n      \"unicode\": \"e897\",\n      \"unicode_decimal\": 59543\n    },\n    {\n      \"icon_id\": \"2126752\",\n      \"name\": \"257用户资料\",\n      \"font_class\": \"yonghuziliao\",\n      \"unicode\": \"e997\",\n      \"unicode_decimal\": 59799\n    },\n    {\n      \"icon_id\": \"1727267\",\n      \"name\": \"05采购\",\n      \"font_class\": \"caigou\",\n      \"unicode\": \"e898\",\n      \"unicode_decimal\": 59544\n    },\n    {\n      \"icon_id\": \"2126754\",\n      \"name\": \"257用户资料-线性\",\n      \"font_class\": \"yonghuziliao-xianxing\",\n      \"unicode\": \"e998\",\n      \"unicode_decimal\": 59800\n    },\n    {\n      \"icon_id\": \"1727269\",\n      \"name\": \"06商品\",\n      \"font_class\": \"shangpin\",\n      \"unicode\": \"e899\",\n      \"unicode_decimal\": 59545\n    },\n    {\n      \"icon_id\": \"2126755\",\n      \"name\": \"258皮肤&主题\",\n      \"font_class\": \"pifuzhuti\",\n      \"unicode\": \"e999\",\n      \"unicode_decimal\": 59801\n    },\n    {\n      \"icon_id\": \"1727271\",\n      \"name\": \"06商品-线性\",\n      \"font_class\": \"shangpin-xianxing\",\n      \"unicode\": \"e89a\",\n      \"unicode_decimal\": 59546\n    },\n    {\n      \"icon_id\": \"2126756\",\n      \"name\": \"258皮肤&主题-线性\",\n      \"font_class\": \"pifuzhuti-xianxing\",\n      \"unicode\": \"e99a\",\n      \"unicode_decimal\": 59802\n    },\n    {\n      \"icon_id\": \"1727273\",\n      \"name\": \"07配载、装车\",\n      \"font_class\": \"peizaizhuangche\",\n      \"unicode\": \"e89b\",\n      \"unicode_decimal\": 59547\n    },\n    {\n      \"icon_id\": \"2127051\",\n      \"name\": \"259钻石\",\n      \"font_class\": \"diamond\",\n      \"unicode\": \"e99b\",\n      \"unicode_decimal\": 59803\n    },\n    {\n      \"icon_id\": \"1727274\",\n      \"name\": \"07配载、装车-线性\",\n      \"font_class\": \"peizaizhuangche-xianxing\",\n      \"unicode\": \"e89c\",\n      \"unicode_decimal\": 59548\n    },\n    {\n      \"icon_id\": \"2127052\",\n      \"name\": \"259钻石-线性\",\n      \"font_class\": \"diamond-o\",\n      \"unicode\": \"e99c\",\n      \"unicode_decimal\": 59804\n    },\n    {\n      \"icon_id\": \"1727275\",\n      \"name\": \"08质量-线性\",\n      \"font_class\": \"zhiliang-xianxing\",\n      \"unicode\": \"e89d\",\n      \"unicode_decimal\": 59549\n    },\n    {\n      \"icon_id\": \"2127193\",\n      \"name\": \"54设计-线性\",\n      \"font_class\": \"sheji-xianxing\",\n      \"unicode\": \"e99d\",\n      \"unicode_decimal\": 59805\n    },\n    {\n      \"icon_id\": \"1727276\",\n      \"name\": \"08质量\",\n      \"font_class\": \"zhiliang\",\n      \"unicode\": \"e89e\",\n      \"unicode_decimal\": 59550\n    },\n    {\n      \"icon_id\": \"2127194\",\n      \"name\": \"55开发-线性\",\n      \"font_class\": \"kaifa-xianxing\",\n      \"unicode\": \"e99e\",\n      \"unicode_decimal\": 59806\n    },\n    {\n      \"icon_id\": \"1727278\",\n      \"name\": \"09安全、保障\",\n      \"font_class\": \"anquanbaozhang\",\n      \"unicode\": \"e89f\",\n      \"unicode_decimal\": 59551\n    },\n    {\n      \"icon_id\": \"2488825\",\n      \"name\": \"48银行卡\",\n      \"font_class\": \"yinhangqia\",\n      \"unicode\": \"e99f\",\n      \"unicode_decimal\": 59807\n    },\n    {\n      \"icon_id\": \"1727279\",\n      \"name\": \"09安全、保障-线性\",\n      \"font_class\": \"anquanbaozhang-xianxing\",\n      \"unicode\": \"e8a0\",\n      \"unicode_decimal\": 59552\n    },\n    {\n      \"icon_id\": \"2488826\",\n      \"name\": \"48银行卡-线性\",\n      \"font_class\": \"yinhangqia-xianxing\",\n      \"unicode\": \"e9a0\",\n      \"unicode_decimal\": 59808\n    },\n    {\n      \"icon_id\": \"1727280\",\n      \"name\": \"10仓库、仓储\",\n      \"font_class\": \"cangkucangchu\",\n      \"unicode\": \"e8a1\",\n      \"unicode_decimal\": 59553\n    },\n    {\n      \"icon_id\": \"2488827\",\n      \"name\": \"52红包-线性\",\n      \"font_class\": \"hongbao-xianxing\",\n      \"unicode\": \"e9a1\",\n      \"unicode_decimal\": 59809\n    },\n    {\n      \"icon_id\": \"1727281\",\n      \"name\": \"10仓库、仓储-线性\",\n      \"font_class\": \"cangkucangchu-xianxing\",\n      \"unicode\": \"e8a2\",\n      \"unicode_decimal\": 59554\n    },\n    {\n      \"icon_id\": \"2488828\",\n      \"name\": \"52红包\",\n      \"font_class\": \"hongbao\",\n      \"unicode\": \"e9a2\",\n      \"unicode_decimal\": 59810\n    },\n    {\n      \"icon_id\": \"1727329\",\n      \"name\": \"11中转站-线性\",\n      \"font_class\": \"zhongzhuanzhan-xianxing\",\n      \"unicode\": \"e8a3\",\n      \"unicode_decimal\": 59555\n    },\n    {\n      \"icon_id\": \"11372639\",\n      \"name\": \"爱心\",\n      \"font_class\": \"aixin\",\n      \"unicode\": \"e9a3\",\n      \"unicode_decimal\": 59811\n    },\n    {\n      \"icon_id\": \"1727330\",\n      \"name\": \"11中转站\",\n      \"font_class\": \"zhongzhuanzhan\",\n      \"unicode\": \"e8a4\",\n      \"unicode_decimal\": 59556\n    },\n    {\n      \"icon_id\": \"11372640\",\n      \"name\": \"编辑\",\n      \"font_class\": \"bianji\",\n      \"unicode\": \"e9a4\",\n      \"unicode_decimal\": 59812\n    },\n    {\n      \"icon_id\": \"1727331\",\n      \"name\": \"12库存-线性\",\n      \"font_class\": \"kucun-xianxing\",\n      \"unicode\": \"e8a5\",\n      \"unicode_decimal\": 59557\n    },\n    {\n      \"icon_id\": \"11372641\",\n      \"name\": \"3D眼镜\",\n      \"font_class\": \"Dyanjing\",\n      \"unicode\": \"e9a5\",\n      \"unicode_decimal\": 59813\n    },\n    {\n      \"icon_id\": \"1727332\",\n      \"name\": \"12库存\",\n      \"font_class\": \"kucun\",\n      \"unicode\": \"e8a6\",\n      \"unicode_decimal\": 59558\n    },\n    {\n      \"icon_id\": \"11372642\",\n      \"name\": \"彩蛋\",\n      \"font_class\": \"caidan\",\n      \"unicode\": \"e9a6\",\n      \"unicode_decimal\": 59814\n    },\n    {\n      \"icon_id\": \"1727333\",\n      \"name\": \"13末端网点-线性\",\n      \"font_class\": \"moduanwangdian-xianxing\",\n      \"unicode\": \"e8a7\",\n      \"unicode_decimal\": 59559\n    },\n    {\n      \"icon_id\": \"11372643\",\n      \"name\": \"安全\",\n      \"font_class\": \"anquan\",\n      \"unicode\": \"e9a7\",\n      \"unicode_decimal\": 59815\n    },\n    {\n      \"icon_id\": \"1727334\",\n      \"name\": \"13末端网点\",\n      \"font_class\": \"moduanwangdian\",\n      \"unicode\": \"e8a8\",\n      \"unicode_decimal\": 59560\n    },\n    {\n      \"icon_id\": \"11372644\",\n      \"name\": \"帮助\",\n      \"font_class\": \"bangzhu\",\n      \"unicode\": \"e9a8\",\n      \"unicode_decimal\": 59816\n    },\n    {\n      \"icon_id\": \"1727339\",\n      \"name\": \"14签收、审批通过-线性\",\n      \"font_class\": \"qianshoushenpitongguo-xianxing\",\n      \"unicode\": \"e8a9\",\n      \"unicode_decimal\": 59561\n    },\n    {\n      \"icon_id\": \"11372645\",\n      \"name\": \"不感兴趣\",\n      \"font_class\": \"buganxingqu\",\n      \"unicode\": \"e9a9\",\n      \"unicode_decimal\": 59817\n    },\n    {\n      \"icon_id\": \"1727340\",\n      \"name\": \"14签收、审批通过\",\n      \"font_class\": \"qianshoushenpitongguo\",\n      \"unicode\": \"e8aa\",\n      \"unicode_decimal\": 59562\n    },\n    {\n      \"icon_id\": \"11372646\",\n      \"name\": \"播放记录\",\n      \"font_class\": \"bofangjilu\",\n      \"unicode\": \"e9aa\",\n      \"unicode_decimal\": 59818\n    },\n    {\n      \"icon_id\": \"1727341\",\n      \"name\": \"15拒签收-线性\",\n      \"font_class\": \"juqianshou-xianxing\",\n      \"unicode\": \"e8ab\",\n      \"unicode_decimal\": 59563\n    },\n    {\n      \"icon_id\": \"11372647\",\n      \"name\": \"创作\",\n      \"font_class\": \"chuangzuo\",\n      \"unicode\": \"e9ab\",\n      \"unicode_decimal\": 59819\n    },\n    {\n      \"icon_id\": \"1727342\",\n      \"name\": \"15拒签收\",\n      \"font_class\": \"juqianshou\",\n      \"unicode\": \"e8ac\",\n      \"unicode_decimal\": 59564\n    },\n    {\n      \"icon_id\": \"11372648\",\n      \"name\": \"成功\",\n      \"font_class\": \"chenggong\",\n      \"unicode\": \"e9ac\",\n      \"unicode_decimal\": 59820\n    },\n    {\n      \"icon_id\": \"1727344\",\n      \"name\": \"16寄件、发送-线性\",\n      \"font_class\": \"jijianfasong-xianxing\",\n      \"unicode\": \"e8ad\",\n      \"unicode_decimal\": 59565\n    },\n    {\n      \"icon_id\": \"11372649\",\n      \"name\": \"测试\",\n      \"font_class\": \"ceshi\",\n      \"unicode\": \"e9ad\",\n      \"unicode_decimal\": 59821\n    },\n    {\n      \"icon_id\": \"1727345\",\n      \"name\": \"16寄件、发送\",\n      \"font_class\": \"jijianfasong\",\n      \"unicode\": \"e8ae\",\n      \"unicode_decimal\": 59566\n    },\n    {\n      \"icon_id\": \"11372650\",\n      \"name\": \"电话\",\n      \"font_class\": \"dianhua1\",\n      \"unicode\": \"e9ae\",\n      \"unicode_decimal\": 59822\n    },\n    {\n      \"icon_id\": \"1727347\",\n      \"name\": \"17企业、园区、物业\",\n      \"font_class\": \"qiyeyuanquwuye\",\n      \"unicode\": \"e8af\",\n      \"unicode_decimal\": 59567\n    },\n    {\n      \"icon_id\": \"11372651\",\n      \"name\": \"点赞\",\n      \"font_class\": \"dianzan\",\n      \"unicode\": \"e9af\",\n      \"unicode_decimal\": 59823\n    },\n    {\n      \"icon_id\": \"1727348\",\n      \"name\": \"17企业、园区、物业-线性\",\n      \"font_class\": \"qiyeyuanquwuye-xianxing\",\n      \"unicode\": \"e8b0\",\n      \"unicode_decimal\": 59568\n    },\n    {\n      \"icon_id\": \"11372652\",\n      \"name\": \"定位\",\n      \"font_class\": \"dingwei1\",\n      \"unicode\": \"e9b0\",\n      \"unicode_decimal\": 59824\n    },\n    {\n      \"icon_id\": \"1727350\",\n      \"name\": \"19结算-线性\",\n      \"font_class\": \"jiesuan-xianxing\",\n      \"unicode\": \"e8b1\",\n      \"unicode_decimal\": 59569\n    },\n    {\n      \"icon_id\": \"11372653\",\n      \"name\": \"电筒_关\",\n      \"font_class\": \"diantong_guan\",\n      \"unicode\": \"e9b1\",\n      \"unicode_decimal\": 59825\n    },\n    {\n      \"icon_id\": \"1727351\",\n      \"name\": \"19结算\",\n      \"font_class\": \"jiesuan\",\n      \"unicode\": \"e8b2\",\n      \"unicode_decimal\": 59570\n    },\n    {\n      \"icon_id\": \"11372654\",\n      \"name\": \"电影\",\n      \"font_class\": \"dianying\",\n      \"unicode\": \"e9b2\",\n      \"unicode_decimal\": 59826\n    },\n    {\n      \"icon_id\": \"1727352\",\n      \"name\": \"20积分\",\n      \"font_class\": \"jifen1\",\n      \"unicode\": \"e8b3\",\n      \"unicode_decimal\": 59571\n    },\n    {\n      \"icon_id\": \"11372655\",\n      \"name\": \"地图\",\n      \"font_class\": \"ditu1\",\n      \"unicode\": \"e9b3\",\n      \"unicode_decimal\": 59827\n    },\n    {\n      \"icon_id\": \"1727353\",\n      \"name\": \"20积分-线性\",\n      \"font_class\": \"jifen-xianxing\",\n      \"unicode\": \"e8b4\",\n      \"unicode_decimal\": 59572\n    },\n    {\n      \"icon_id\": \"11372656\",\n      \"name\": \"电筒_开\",\n      \"font_class\": \"diantong_kai\",\n      \"unicode\": \"e9b4\",\n      \"unicode_decimal\": 59828\n    },\n    {\n      \"icon_id\": \"1727354\",\n      \"name\": \"21优惠劵-线性\",\n      \"font_class\": \"youhuijuan-xianxing\",\n      \"unicode\": \"e8b5\",\n      \"unicode_decimal\": 59573\n    },\n    {\n      \"icon_id\": \"11372657\",\n      \"name\": \"电影票\",\n      \"font_class\": \"dianyingpiao\",\n      \"unicode\": \"e9b5\",\n      \"unicode_decimal\": 59829\n    },\n    {\n      \"icon_id\": \"1727355\",\n      \"name\": \"22资料、手册\",\n      \"font_class\": \"ziliaoshouce\",\n      \"unicode\": \"e8b6\",\n      \"unicode_decimal\": 59574\n    },\n    {\n      \"icon_id\": \"11372658\",\n      \"name\": \"订单\",\n      \"font_class\": \"dingdan\",\n      \"unicode\": \"e9b6\",\n      \"unicode_decimal\": 59830\n    },\n    {\n      \"icon_id\": \"1727356\",\n      \"name\": \"22资料、手册-线性\",\n      \"font_class\": \"ziliaoshouce-xianxing\",\n      \"unicode\": \"e8b7\",\n      \"unicode_decimal\": 59575\n    },\n    {\n      \"icon_id\": \"11372659\",\n      \"name\": \"更多\",\n      \"font_class\": \"gengduo\",\n      \"unicode\": \"e9b7\",\n      \"unicode_decimal\": 59831\n    },\n    {\n      \"icon_id\": \"1727357\",\n      \"name\": \"21优惠劵\",\n      \"font_class\": \"youhuijuan\",\n      \"unicode\": \"e8b8\",\n      \"unicode_decimal\": 59576\n    },\n    {\n      \"icon_id\": \"11372660\",\n      \"name\": \"翻倍\",\n      \"font_class\": \"fanbei\",\n      \"unicode\": \"e9b8\",\n      \"unicode_decimal\": 59832\n    },\n    {\n      \"icon_id\": \"1727359\",\n      \"name\": \"23规则\",\n      \"font_class\": \"guize\",\n      \"unicode\": \"e8b9\",\n      \"unicode_decimal\": 59577\n    },\n    {\n      \"icon_id\": \"11372661\",\n      \"name\": \"发现\",\n      \"font_class\": \"faxian\",\n      \"unicode\": \"e9b9\",\n      \"unicode_decimal\": 59833\n    },\n    {\n      \"icon_id\": \"1727360\",\n      \"name\": \"25单据-线性\",\n      \"font_class\": \"danju-xianxing\",\n      \"unicode\": \"e8ba\",\n      \"unicode_decimal\": 59578\n    },\n    {\n      \"icon_id\": \"11372662\",\n      \"name\": \"儿童票\",\n      \"font_class\": \"ertongpiao\",\n      \"unicode\": \"e9ba\",\n      \"unicode_decimal\": 59834\n    },\n    {\n      \"icon_id\": \"1727361\",\n      \"name\": \"24组织架构、接口\",\n      \"font_class\": \"zuzhijiagoujiekou\",\n      \"unicode\": \"e8bb\",\n      \"unicode_decimal\": 59579\n    },\n    {\n      \"icon_id\": \"11372663\",\n      \"name\": \"公益\",\n      \"font_class\": \"gongyi\",\n      \"unicode\": \"e9bb\",\n      \"unicode_decimal\": 59835\n    },\n    {\n      \"icon_id\": \"1727362\",\n      \"name\": \"25单据\",\n      \"font_class\": \"danju\",\n      \"unicode\": \"e8bc\",\n      \"unicode_decimal\": 59580\n    },\n    {\n      \"icon_id\": \"11372664\",\n      \"name\": \"红包\",\n      \"font_class\": \"hongbao1\",\n      \"unicode\": \"e9bc\",\n      \"unicode_decimal\": 59836\n    },\n    {\n      \"icon_id\": \"1727363\",\n      \"name\": \"26创建单据-线性\",\n      \"font_class\": \"chuangjiandanju-xianxing\",\n      \"unicode\": \"e8bd\",\n      \"unicode_decimal\": 59581\n    },\n    {\n      \"icon_id\": \"11372665\",\n      \"name\": \"复制\",\n      \"font_class\": \"fuzhi\",\n      \"unicode\": \"e9bd\",\n      \"unicode_decimal\": 59837\n    },\n    {\n      \"icon_id\": \"1727364\",\n      \"name\": \"26创建单据\",\n      \"font_class\": \"chuangjiandanju\",\n      \"unicode\": \"e8be\",\n      \"unicode_decimal\": 59582\n    },\n    {\n      \"icon_id\": \"11372666\",\n      \"name\": \"分享\",\n      \"font_class\": \"fenxiang\",\n      \"unicode\": \"e9be\",\n      \"unicode_decimal\": 59838\n    },\n    {\n      \"icon_id\": \"1727365\",\n      \"name\": \"27账单-线性\",\n      \"font_class\": \"zhangdan-xianxing\",\n      \"unicode\": \"e8bf\",\n      \"unicode_decimal\": 59583\n    },\n    {\n      \"icon_id\": \"11372667\",\n      \"name\": \"话题符号\",\n      \"font_class\": \"huatifuhao\",\n      \"unicode\": \"e9bf\",\n      \"unicode_decimal\": 59839\n    },\n    {\n      \"icon_id\": \"1727366\",\n      \"name\": \"27账单\",\n      \"font_class\": \"zhangdan\",\n      \"unicode\": \"e8c0\",\n      \"unicode_decimal\": 59584\n    },\n    {\n      \"icon_id\": \"11372668\",\n      \"name\": \"会员\",\n      \"font_class\": \"huiyuan\",\n      \"unicode\": \"e9c0\",\n      \"unicode_decimal\": 59840\n    },\n    {\n      \"icon_id\": \"1727367\",\n      \"name\": \"28体积、空间\",\n      \"font_class\": \"tijikongjian\",\n      \"unicode\": \"e8c1\",\n      \"unicode_decimal\": 59585\n    },\n    {\n      \"icon_id\": \"11372669\",\n      \"name\": \"阿里鱼\",\n      \"font_class\": \"aliyu\",\n      \"unicode\": \"e9c1\",\n      \"unicode_decimal\": 59841\n    },\n    {\n      \"icon_id\": \"1727368\",\n      \"name\": \"28体积、空间-线性\",\n      \"font_class\": \"tijikongjian-xianxing\",\n      \"unicode\": \"e8c2\",\n      \"unicode_decimal\": 59586\n    },\n    {\n      \"icon_id\": \"11372670\",\n      \"name\": \"机具\",\n      \"font_class\": \"jiju\",\n      \"unicode\": \"e9c2\",\n      \"unicode_decimal\": 59842\n    },\n    {\n      \"icon_id\": \"1727369\",\n      \"name\": \"29业务-线性\",\n      \"font_class\": \"yewu-xianxing\",\n      \"unicode\": \"e8c3\",\n      \"unicode_decimal\": 59587\n    },\n    {\n      \"icon_id\": \"11372671\",\n      \"name\": \"减少\",\n      \"font_class\": \"jianshao\",\n      \"unicode\": \"e9c3\",\n      \"unicode_decimal\": 59843\n    },\n    {\n      \"icon_id\": \"1727370\",\n      \"name\": \"29业务\",\n      \"font_class\": \"yewu\",\n      \"unicode\": \"e8c4\",\n      \"unicode_decimal\": 59588\n    },\n    {\n      \"icon_id\": \"11372672\",\n      \"name\": \"卡包\",\n      \"font_class\": \"kabao\",\n      \"unicode\": \"e9c4\",\n      \"unicode_decimal\": 59844\n    },\n    {\n      \"icon_id\": \"1727371\",\n      \"name\": \"30应用程序-线性\",\n      \"font_class\": \"yingyongchengxu-xianxing\",\n      \"unicode\": \"e8c5\",\n      \"unicode_decimal\": 59589\n    },\n    {\n      \"icon_id\": \"11372673\",\n      \"name\": \"话题\",\n      \"font_class\": \"huati\",\n      \"unicode\": \"e9c5\",\n      \"unicode_decimal\": 59845\n    },\n    {\n      \"icon_id\": \"1727372\",\n      \"name\": \"30应用程序\",\n      \"font_class\": \"yingyongchengxu\",\n      \"unicode\": \"e8c6\",\n      \"unicode_decimal\": 59590\n    },\n    {\n      \"icon_id\": \"11372674\",\n      \"name\": \"关注\",\n      \"font_class\": \"guanzhu\",\n      \"unicode\": \"e9c6\",\n      \"unicode_decimal\": 59846\n    },\n    {\n      \"icon_id\": \"1727373\",\n      \"name\": \"31标准\",\n      \"font_class\": \"biaozhun\",\n      \"unicode\": \"e8c7\",\n      \"unicode_decimal\": 59591\n    },\n    {\n      \"icon_id\": \"11372675\",\n      \"name\": \"买一赠一\",\n      \"font_class\": \"maiyizengyi\",\n      \"unicode\": \"e9c7\",\n      \"unicode_decimal\": 59847\n    },\n    {\n      \"icon_id\": \"1727374\",\n      \"name\": \"31标准-线性\",\n      \"font_class\": \"biaozhun-xianxing\",\n      \"unicode\": \"e8c8\",\n      \"unicode_decimal\": 59592\n    },\n    {\n      \"icon_id\": \"11372676\",\n      \"name\": \"密码\",\n      \"font_class\": \"mima\",\n      \"unicode\": \"e9c8\",\n      \"unicode_decimal\": 59848\n    },\n    {\n      \"icon_id\": \"1727376\",\n      \"name\": \"32权限、钥匙\",\n      \"font_class\": \"quanxianyuechi\",\n      \"unicode\": \"e8c9\",\n      \"unicode_decimal\": 59593\n    },\n    {\n      \"icon_id\": \"11372677\",\n      \"name\": \"男\",\n      \"font_class\": \"nan\",\n      \"unicode\": \"e9c9\",\n      \"unicode_decimal\": 59849\n    },\n    {\n      \"icon_id\": \"1727377\",\n      \"name\": \"32权限、钥匙-线性\",\n      \"font_class\": \"quanxianyuechi-xianxing\",\n      \"unicode\": \"e8ca\",\n      \"unicode_decimal\": 59594\n    },\n    {\n      \"icon_id\": \"11372678\",\n      \"name\": \"女\",\n      \"font_class\": \"nv\",\n      \"unicode\": \"e9ca\",\n      \"unicode_decimal\": 59850\n    },\n    {\n      \"icon_id\": \"1727378\",\n      \"name\": \"33资源\",\n      \"font_class\": \"ziyuan\",\n      \"unicode\": \"e8cb\",\n      \"unicode_decimal\": 59595\n    },\n    {\n      \"icon_id\": \"11372679\",\n      \"name\": \"礼盒\",\n      \"font_class\": \"lihe\",\n      \"unicode\": \"e9cb\",\n      \"unicode_decimal\": 59851\n    },\n    {\n      \"icon_id\": \"1727379\",\n      \"name\": \"33资源-线性\",\n      \"font_class\": \"ziyuan-xianxing\",\n      \"unicode\": \"e8cc\",\n      \"unicode_decimal\": 59596\n    },\n    {\n      \"icon_id\": \"11372680\",\n      \"name\": \"排行榜\",\n      \"font_class\": \"paihangbang\",\n      \"unicode\": \"e9cc\",\n      \"unicode_decimal\": 59852\n    },\n    {\n      \"icon_id\": \"1727380\",\n      \"name\": \"34模板、框架-线性\",\n      \"font_class\": \"mobankuangjia-xianxing\",\n      \"unicode\": \"e8cd\",\n      \"unicode_decimal\": 59597\n    },\n    {\n      \"icon_id\": \"11372681\",\n      \"name\": \"礼品卡\",\n      \"font_class\": \"lipinka\",\n      \"unicode\": \"e9cd\",\n      \"unicode_decimal\": 59853\n    },\n    {\n      \"icon_id\": \"1727381\",\n      \"name\": \"34模板、框架\",\n      \"font_class\": \"mobankuangjia\",\n      \"unicode\": \"e8ce\",\n      \"unicode_decimal\": 59598\n    },\n    {\n      \"icon_id\": \"11372682\",\n      \"name\": \"朋友圈\",\n      \"font_class\": \"pengyouquan\",\n      \"unicode\": \"e9ce\",\n      \"unicode_decimal\": 59854\n    },\n    {\n      \"icon_id\": \"1727382\",\n      \"name\": \"35新闻、资讯\",\n      \"font_class\": \"xinwenzixun\",\n      \"unicode\": \"e8cf\",\n      \"unicode_decimal\": 59599\n    },\n    {\n      \"icon_id\": \"11372683\",\n      \"name\": \"明星活动\",\n      \"font_class\": \"mingxinghuodong\",\n      \"unicode\": \"e9cf\",\n      \"unicode_decimal\": 59855\n    },\n    {\n      \"icon_id\": \"1727383\",\n      \"name\": \"35新闻、资讯-线性\",\n      \"font_class\": \"xinwenzixun-xianxing\",\n      \"unicode\": \"e8d0\",\n      \"unicode_decimal\": 59600\n    },\n    {\n      \"icon_id\": \"11372684\",\n      \"name\": \"取票\",\n      \"font_class\": \"qupiao\",\n      \"unicode\": \"e9d0\",\n      \"unicode_decimal\": 59856\n    },\n    {\n      \"icon_id\": \"1727385\",\n      \"name\": \"36合作、关系-线性\",\n      \"font_class\": \"hezuoguanxi-xianxing\",\n      \"unicode\": \"e8d1\",\n      \"unicode_decimal\": 59601\n    },\n    {\n      \"icon_id\": \"11372685\",\n      \"name\": \"扫一扫\",\n      \"font_class\": \"saoyisao\",\n      \"unicode\": \"e9d1\",\n      \"unicode_decimal\": 59857\n    },\n    {\n      \"icon_id\": \"1727386\",\n      \"name\": \"36合作、关系\",\n      \"font_class\": \"hezuoguanxi\",\n      \"unicode\": \"e8d2\",\n      \"unicode_decimal\": 59602\n    },\n    {\n      \"icon_id\": \"11372686\",\n      \"name\": \"日历\",\n      \"font_class\": \"rili1\",\n      \"unicode\": \"e9d2\",\n      \"unicode_decimal\": 59858\n    },\n    {\n      \"icon_id\": \"1727387\",\n      \"name\": \"36线路\",\n      \"font_class\": \"xianlu\",\n      \"unicode\": \"e8d3\",\n      \"unicode_decimal\": 59603\n    },\n    {\n      \"icon_id\": \"11372687\",\n      \"name\": \"评论\",\n      \"font_class\": \"pinglun\",\n      \"unicode\": \"e9d3\",\n      \"unicode_decimal\": 59859\n    },\n    {\n      \"icon_id\": \"1727388\",\n      \"name\": \"37-服务-线性\",\n      \"font_class\": \"-fuwu-xianxing\",\n      \"unicode\": \"e8d4\",\n      \"unicode_decimal\": 59604\n    },\n    {\n      \"icon_id\": \"11372688\",\n      \"name\": \"轻会员\",\n      \"font_class\": \"qinghuiyuan\",\n      \"unicode\": \"e9d4\",\n      \"unicode_decimal\": 59860\n    },\n    {\n      \"icon_id\": \"1727389\",\n      \"name\": \"37-服务\",\n      \"font_class\": \"-fuwu\",\n      \"unicode\": \"e8d5\",\n      \"unicode_decimal\": 59605\n    },\n    {\n      \"icon_id\": \"11372689\",\n      \"name\": \"日签\",\n      \"font_class\": \"riqian\",\n      \"unicode\": \"e9d5\",\n      \"unicode_decimal\": 59861\n    },\n    {\n      \"icon_id\": \"1727391\",\n      \"name\": \"38-客服-线性\",\n      \"font_class\": \"-kefu-xianxing\",\n      \"unicode\": \"e8d6\",\n      \"unicode_decimal\": 59606\n    },\n    {\n      \"icon_id\": \"11372690\",\n      \"name\": \"闪电\",\n      \"font_class\": \"shandian\",\n      \"unicode\": \"e9d6\",\n      \"unicode_decimal\": 59862\n    },\n    {\n      \"icon_id\": \"1727392\",\n      \"name\": \"38-客服\",\n      \"font_class\": \"-kefu\",\n      \"unicode\": \"e8d7\",\n      \"unicode_decimal\": 59607\n    },\n    {\n      \"icon_id\": \"11372691\",\n      \"name\": \"筛选\",\n      \"font_class\": \"shaixuan\",\n      \"unicode\": \"e9d7\",\n      \"unicode_decimal\": 59863\n    },\n    {\n      \"icon_id\": \"1727393\",\n      \"name\": \"39-国际-线性\",\n      \"font_class\": \"-guoji-xianxing\",\n      \"unicode\": \"e8d8\",\n      \"unicode_decimal\": 59608\n    },\n    {\n      \"icon_id\": \"11372692\",\n      \"name\": \"商圈\",\n      \"font_class\": \"shangquan\",\n      \"unicode\": \"e9d8\",\n      \"unicode_decimal\": 59864\n    },\n    {\n      \"icon_id\": \"1727394\",\n      \"name\": \"39-国际\",\n      \"font_class\": \"-guoji\",\n      \"unicode\": \"e8d9\",\n      \"unicode_decimal\": 59609\n    },\n    {\n      \"icon_id\": \"11372693\",\n      \"name\": \"删除\",\n      \"font_class\": \"shanchu\",\n      \"unicode\": \"e9d9\",\n      \"unicode_decimal\": 59865\n    },\n    {\n      \"icon_id\": \"1727395\",\n      \"name\": \"40海关-线性\",\n      \"font_class\": \"haiguan-xianxing\",\n      \"unicode\": \"e8da\",\n      \"unicode_decimal\": 59610\n    },\n    {\n      \"icon_id\": \"11372694\",\n      \"name\": \"设置\",\n      \"font_class\": \"shezhi1\",\n      \"unicode\": \"e9da\",\n      \"unicode_decimal\": 59866\n    },\n    {\n      \"icon_id\": \"1727396\",\n      \"name\": \"40海关\",\n      \"font_class\": \"haiguan\",\n      \"unicode\": \"e8db\",\n      \"unicode_decimal\": 59611\n    },\n    {\n      \"icon_id\": \"11372695\",\n      \"name\": \"上传\",\n      \"font_class\": \"shangchuan\",\n      \"unicode\": \"e9db\",\n      \"unicode_decimal\": 59867\n    },\n    {\n      \"icon_id\": \"1727397\",\n      \"name\": \"41头程、空运\",\n      \"font_class\": \"touchengkongyun\",\n      \"unicode\": \"e8dc\",\n      \"unicode_decimal\": 59612\n    },\n    {\n      \"icon_id\": \"11372696\",\n      \"name\": \"社区\",\n      \"font_class\": \"shequ\",\n      \"unicode\": \"e9dc\",\n      \"unicode_decimal\": 59868\n    },\n    {\n      \"icon_id\": \"1727398\",\n      \"name\": \"42尾程\",\n      \"font_class\": \"weicheng\",\n      \"unicode\": \"e8dd\",\n      \"unicode_decimal\": 59613\n    },\n    {\n      \"icon_id\": \"11372697\",\n      \"name\": \"声音关闭\",\n      \"font_class\": \"shengyinguanbi\",\n      \"unicode\": \"e9dd\",\n      \"unicode_decimal\": 59869\n    },\n    {\n      \"icon_id\": \"1727399\",\n      \"name\": \"43财务\",\n      \"font_class\": \"caiwu\",\n      \"unicode\": \"e8de\",\n      \"unicode_decimal\": 59614\n    },\n    {\n      \"icon_id\": \"11372698\",\n      \"name\": \"失败\",\n      \"font_class\": \"shibai\",\n      \"unicode\": \"e9de\",\n      \"unicode_decimal\": 59870\n    },\n    {\n      \"icon_id\": \"1727401\",\n      \"name\": \"43财务-线性\",\n      \"font_class\": \"caiwu-xianxing\",\n      \"unicode\": \"e8df\",\n      \"unicode_decimal\": 59615\n    },\n    {\n      \"icon_id\": \"11372699\",\n      \"name\": \"时间\",\n      \"font_class\": \"shijian1\",\n      \"unicode\": \"e9df\",\n      \"unicode_decimal\": 59871\n    },\n    {\n      \"icon_id\": \"1727405\",\n      \"name\": \"46免费\",\n      \"font_class\": \"mianfei\",\n      \"unicode\": \"e8e0\",\n      \"unicode_decimal\": 59616\n    },\n    {\n      \"icon_id\": \"11372700\",\n      \"name\": \"声音\",\n      \"font_class\": \"shengyin\",\n      \"unicode\": \"e9e0\",\n      \"unicode_decimal\": 59872\n    },\n    {\n      \"icon_id\": \"1727406\",\n      \"name\": \"46免费-线性\",\n      \"font_class\": \"mianfei-xianxing\",\n      \"unicode\": \"e8e1\",\n      \"unicode_decimal\": 59617\n    },\n    {\n      \"icon_id\": \"11372701\",\n      \"name\": \"收藏\",\n      \"font_class\": \"shoucang1\",\n      \"unicode\": \"e9e1\",\n      \"unicode_decimal\": 59873\n    },\n    {\n      \"icon_id\": \"1727407\",\n      \"name\": \"47退款\",\n      \"font_class\": \"tuikuan\",\n      \"unicode\": \"e8e2\",\n      \"unicode_decimal\": 59618\n    },\n    {\n      \"icon_id\": \"11372702\",\n      \"name\": \"手机\",\n      \"font_class\": \"shouji\",\n      \"unicode\": \"e9e2\",\n      \"unicode_decimal\": 59874\n    },\n    {\n      \"icon_id\": \"1727410\",\n      \"name\": \"49计算器、利率\",\n      \"font_class\": \"jisuanqilishuai\",\n      \"unicode\": \"e8e3\",\n      \"unicode_decimal\": 59619\n    },\n    {\n      \"icon_id\": \"11372703\",\n      \"name\": \"首页\",\n      \"font_class\": \"shouye1\",\n      \"unicode\": \"e9e3\",\n      \"unicode_decimal\": 59875\n    },\n    {\n      \"icon_id\": \"1727411\",\n      \"name\": \"49计算器、利率-线性\",\n      \"font_class\": \"jisuanqilishuai-xianxing\",\n      \"unicode\": \"e8e4\",\n      \"unicode_decimal\": 59620\n    },\n    {\n      \"icon_id\": \"11372704\",\n      \"name\": \"数据\",\n      \"font_class\": \"shuju\",\n      \"unicode\": \"e9e4\",\n      \"unicode_decimal\": 59876\n    },\n    {\n      \"icon_id\": \"1727414\",\n      \"name\": \"201checkbox-未选\",\n      \"font_class\": \"checkbox-weixuan\",\n      \"unicode\": \"e8e5\",\n      \"unicode_decimal\": 59621\n    },\n    {\n      \"icon_id\": \"11372705\",\n      \"name\": \"刷新\",\n      \"font_class\": \"shuaxin1\",\n      \"unicode\": \"e9e5\",\n      \"unicode_decimal\": 59877\n    },\n    {\n      \"icon_id\": \"1727415\",\n      \"name\": \"201checkbox-选中\",\n      \"font_class\": \"checkbox-xuanzhong\",\n      \"unicode\": \"e8e6\",\n      \"unicode_decimal\": 59622\n    },\n    {\n      \"icon_id\": \"11372706\",\n      \"name\": \"搜索\",\n      \"font_class\": \"sousuo1\",\n      \"unicode\": \"e9e6\",\n      \"unicode_decimal\": 59878\n    },\n    {\n      \"icon_id\": \"1727416\",\n      \"name\": \"202Raidobox-未选\",\n      \"font_class\": \"Raidobox-weixuan\",\n      \"unicode\": \"e8e7\",\n      \"unicode_decimal\": 59623\n    },\n    {\n      \"icon_id\": \"11372707\",\n      \"name\": \"叹号\",\n      \"font_class\": \"tanhao\",\n      \"unicode\": \"e9e7\",\n      \"unicode_decimal\": 59879\n    },\n    {\n      \"icon_id\": \"1727417\",\n      \"name\": \"202Raidobox-选中\",\n      \"font_class\": \"Raidobox-xuanzhong\",\n      \"unicode\": \"e8e8\",\n      \"unicode_decimal\": 59624\n    },\n    {\n      \"icon_id\": \"11372708\",\n      \"name\": \"讨论区\",\n      \"font_class\": \"taolunqu\",\n      \"unicode\": \"e9e8\",\n      \"unicode_decimal\": 59880\n    },\n    {\n      \"icon_id\": \"1727418\",\n      \"name\": \"201checkbox-选中部分\",\n      \"font_class\": \"checkbox-xuanzhongbufen\",\n      \"unicode\": \"e8e9\",\n      \"unicode_decimal\": 59625\n    },\n    {\n      \"icon_id\": \"11372709\",\n      \"name\": \"添加优惠券\",\n      \"font_class\": \"tianjiayouhuiquan\",\n      \"unicode\": \"e9e9\",\n      \"unicode_decimal\": 59881\n    },\n    {\n      \"icon_id\": \"1727419\",\n      \"name\": \"203右下角勾选\",\n      \"font_class\": \"youxiajiaogouxuan\",\n      \"unicode\": \"e8ea\",\n      \"unicode_decimal\": 59626\n    },\n    {\n      \"icon_id\": \"11372710\",\n      \"name\": \"提示\",\n      \"font_class\": \"tishi\",\n      \"unicode\": \"e9ea\",\n      \"unicode_decimal\": 59882\n    },\n    {\n      \"icon_id\": \"1727420\",\n      \"name\": \"206搜索-线性\",\n      \"font_class\": \"sousuo-xianxing\",\n      \"unicode\": \"e8eb\",\n      \"unicode_decimal\": 59627\n    },\n    {\n      \"icon_id\": \"11372711\",\n      \"name\": \"图片\",\n      \"font_class\": \"tupian1\",\n      \"unicode\": \"e9eb\",\n      \"unicode_decimal\": 59883\n    },\n    {\n      \"icon_id\": \"1727421\",\n      \"name\": \"205设置-线性\",\n      \"font_class\": \"shezhi-xianxing\",\n      \"unicode\": \"e8ec\",\n      \"unicode_decimal\": 59628\n    },\n    {\n      \"icon_id\": \"11372712\",\n      \"name\": \"退票\",\n      \"font_class\": \"tuipiao\",\n      \"unicode\": \"e9ec\",\n      \"unicode_decimal\": 59884\n    },\n    {\n      \"icon_id\": \"1727422\",\n      \"name\": \"205设置\",\n      \"font_class\": \"shezhi\",\n      \"unicode\": \"e8ed\",\n      \"unicode_decimal\": 59629\n    },\n    {\n      \"icon_id\": \"11372713\",\n      \"name\": \"未选中\",\n      \"font_class\": \"weixuanzhong\",\n      \"unicode\": \"e9ed\",\n      \"unicode_decimal\": 59885\n    },\n    {\n      \"icon_id\": \"1727423\",\n      \"name\": \"204首页\",\n      \"font_class\": \"shouye\",\n      \"unicode\": \"e8ee\",\n      \"unicode_decimal\": 59630\n    },\n    {\n      \"icon_id\": \"11372714\",\n      \"name\": \"微博\",\n      \"font_class\": \"weibo\",\n      \"unicode\": \"e9ee\",\n      \"unicode_decimal\": 59886\n    },\n    {\n      \"icon_id\": \"1727424\",\n      \"name\": \"204首页-线性\",\n      \"font_class\": \"shouye-xianxing\",\n      \"unicode\": \"e8ef\",\n      \"unicode_decimal\": 59631\n    },\n    {\n      \"icon_id\": \"11372715\",\n      \"name\": \"问卷\",\n      \"font_class\": \"wenjuan\",\n      \"unicode\": \"e9ef\",\n      \"unicode_decimal\": 59887\n    },\n    {\n      \"icon_id\": \"1727425\",\n      \"name\": \"206搜索\",\n      \"font_class\": \"sousuo\",\n      \"unicode\": \"e8f0\",\n      \"unicode_decimal\": 59632\n    },\n    {\n      \"icon_id\": \"11372716\",\n      \"name\": \"我的\",\n      \"font_class\": \"wode\",\n      \"unicode\": \"e9f0\",\n      \"unicode_decimal\": 59888\n    },\n    {\n      \"icon_id\": \"1727427\",\n      \"name\": \"207问题-线性\",\n      \"font_class\": \"wenti-xianxing\",\n      \"unicode\": \"e8f1\",\n      \"unicode_decimal\": 59633\n    },\n    {\n      \"icon_id\": \"11372717\",\n      \"name\": \"微信\",\n      \"font_class\": \"weixin3\",\n      \"unicode\": \"e9f1\",\n      \"unicode_decimal\": 59889\n    },\n    {\n      \"icon_id\": \"1727428\",\n      \"name\": \"207问题\",\n      \"font_class\": \"wenti\",\n      \"unicode\": \"e8f2\",\n      \"unicode_decimal\": 59634\n    },\n    {\n      \"icon_id\": \"11372718\",\n      \"name\": \"我的关注\",\n      \"font_class\": \"wodeguanzhu\",\n      \"unicode\": \"e9f2\",\n      \"unicode_decimal\": 59890\n    },\n    {\n      \"icon_id\": \"1727429\",\n      \"name\": \"209电话-线性圆框\",\n      \"font_class\": \"dianhua-xianxingyuankuang\",\n      \"unicode\": \"e8f3\",\n      \"unicode_decimal\": 59635\n    },\n    {\n      \"icon_id\": \"11372719\",\n      \"name\": \"虾米\",\n      \"font_class\": \"xiami\",\n      \"unicode\": \"e9f3\",\n      \"unicode_decimal\": 59891\n    },\n    {\n      \"icon_id\": \"1727430\",\n      \"name\": \"208聊天、对话\",\n      \"font_class\": \"liaotianduihua\",\n      \"unicode\": \"e8f4\",\n      \"unicode_decimal\": 59636\n    },\n    {\n      \"icon_id\": \"11372720\",\n      \"name\": \"想看\",\n      \"font_class\": \"xiangkan\",\n      \"unicode\": \"e9f4\",\n      \"unicode_decimal\": 59892\n    },\n    {\n      \"icon_id\": \"1727431\",\n      \"name\": \"208聊天、对话-线性\",\n      \"font_class\": \"liaotianduihua-xianxing\",\n      \"unicode\": \"e8f5\",\n      \"unicode_decimal\": 59637\n    },\n    {\n      \"icon_id\": \"11372721\",\n      \"name\": \"相机\",\n      \"font_class\": \"xiangji\",\n      \"unicode\": \"e9f5\",\n      \"unicode_decimal\": 59893\n    },\n    {\n      \"icon_id\": \"1727432\",\n      \"name\": \"209电话\",\n      \"font_class\": \"dianhua\",\n      \"unicode\": \"e8f6\",\n      \"unicode_decimal\": 59638\n    },\n    {\n      \"icon_id\": \"11372722\",\n      \"name\": \"消息\",\n      \"font_class\": \"xiaoxi\",\n      \"unicode\": \"e9f6\",\n      \"unicode_decimal\": 59894\n    },\n    {\n      \"icon_id\": \"1727433\",\n      \"name\": \"209电话-圆框\",\n      \"font_class\": \"dianhua-yuankuang\",\n      \"unicode\": \"e8f7\",\n      \"unicode_decimal\": 59639\n    },\n    {\n      \"icon_id\": \"11372723\",\n      \"name\": \"下载\",\n      \"font_class\": \"xiazai\",\n      \"unicode\": \"e9f7\",\n      \"unicode_decimal\": 59895\n    },\n    {\n      \"icon_id\": \"1727434\",\n      \"name\": \"210信-线性\",\n      \"font_class\": \"xin-xianxing\",\n      \"unicode\": \"e8f8\",\n      \"unicode_decimal\": 59640\n    },\n    {\n      \"icon_id\": \"11372724\",\n      \"name\": \"小聚场\",\n      \"font_class\": \"xiaojuchang\",\n      \"unicode\": \"e9f8\",\n      \"unicode_decimal\": 59896\n    },\n    {\n      \"icon_id\": \"1727435\",\n      \"name\": \"211铃铛\",\n      \"font_class\": \"lingdang\",\n      \"unicode\": \"e8f9\",\n      \"unicode_decimal\": 59641\n    },\n    {\n      \"icon_id\": \"11372725\",\n      \"name\": \"小食\",\n      \"font_class\": \"xiaoshi\",\n      \"unicode\": \"e9f9\",\n      \"unicode_decimal\": 59897\n    },\n    {\n      \"icon_id\": \"1727436\",\n      \"name\": \"211铃铛-线性\",\n      \"font_class\": \"lingdang-xianxing\",\n      \"unicode\": \"e8fa\",\n      \"unicode_decimal\": 59642\n    },\n    {\n      \"icon_id\": \"11372726\",\n      \"name\": \"消息中心\",\n      \"font_class\": \"xiaoxizhongxin\",\n      \"unicode\": \"e9fa\",\n      \"unicode_decimal\": 59898\n    },\n    {\n      \"icon_id\": \"1727437\",\n      \"name\": \"210信\",\n      \"font_class\": \"xin\",\n      \"unicode\": \"e8fb\",\n      \"unicode_decimal\": 59643\n    },\n    {\n      \"icon_id\": \"11372727\",\n      \"name\": \"银行卡\",\n      \"font_class\": \"yinhangka\",\n      \"unicode\": \"e9fb\",\n      \"unicode_decimal\": 59899\n    },\n    {\n      \"icon_id\": \"1727438\",\n      \"name\": \"212喇叭-线性\",\n      \"font_class\": \"laba-xianxing\",\n      \"unicode\": \"e8fc\",\n      \"unicode_decimal\": 59644\n    },\n    {\n      \"icon_id\": \"11372728\",\n      \"name\": \"眼睛\",\n      \"font_class\": \"yanjing\",\n      \"unicode\": \"e9fc\",\n      \"unicode_decimal\": 59900\n    },\n    {\n      \"icon_id\": \"1727439\",\n      \"name\": \"212喇叭\",\n      \"font_class\": \"laba\",\n      \"unicode\": \"e8fd\",\n      \"unicode_decimal\": 59645\n    },\n    {\n      \"icon_id\": \"11372729\",\n      \"name\": \"影城卡\",\n      \"font_class\": \"yingchengka\",\n      \"unicode\": \"e9fd\",\n      \"unicode_decimal\": 59901\n    },\n    {\n      \"icon_id\": \"1727440\",\n      \"name\": \"213麦克风-线性\",\n      \"font_class\": \"maikefeng-xianxing\",\n      \"unicode\": \"e8fe\",\n      \"unicode_decimal\": 59646\n    },\n    {\n      \"icon_id\": \"11372730\",\n      \"name\": \"已想看\",\n      \"font_class\": \"yixiangkan\",\n      \"unicode\": \"e9fe\",\n      \"unicode_decimal\": 59902\n    },\n    {\n      \"icon_id\": \"1727441\",\n      \"name\": \"213收藏\",\n      \"font_class\": \"shoucang\",\n      \"unicode\": \"e8ff\",\n      \"unicode_decimal\": 59647\n    },\n    {\n      \"icon_id\": \"11372731\",\n      \"name\": \"影评模板\",\n      \"font_class\": \"yingpingmoban\",\n      \"unicode\": \"e9ff\",\n      \"unicode_decimal\": 59903\n    },\n    {\n      \"icon_id\": \"1727442\",\n      \"name\": \"213麦克风\",\n      \"font_class\": \"maikefeng\",\n      \"unicode\": \"e900\",\n      \"unicode_decimal\": 59648\n    },\n    {\n      \"icon_id\": \"11372732\",\n      \"name\": \"演出\",\n      \"font_class\": \"yanchu\",\n      \"unicode\": \"ea00\",\n      \"unicode_decimal\": 59904\n    },\n    {\n      \"icon_id\": \"1727443\",\n      \"name\": \"213喜欢-线性\",\n      \"font_class\": \"xihuan-xianxing\",\n      \"unicode\": \"e901\",\n      \"unicode_decimal\": 59649\n    },\n    {\n      \"icon_id\": \"11372733\",\n      \"name\": \"小蜜\",\n      \"font_class\": \"xiaomi\",\n      \"unicode\": \"ea01\",\n      \"unicode_decimal\": 59905\n    },\n    {\n      \"icon_id\": \"1727444\",\n      \"name\": \"213收藏-线性\",\n      \"font_class\": \"shoucang-xianxing\",\n      \"unicode\": \"e902\",\n      \"unicode_decimal\": 59650\n    },\n    {\n      \"icon_id\": \"11372734\",\n      \"name\": \"影院\",\n      \"font_class\": \"yingyuan\",\n      \"unicode\": \"ea02\",\n      \"unicode_decimal\": 59906\n    },\n    {\n      \"icon_id\": \"1727445\",\n      \"name\": \"213喜欢\",\n      \"font_class\": \"xihuan\",\n      \"unicode\": \"e903\",\n      \"unicode_decimal\": 59651\n    },\n    {\n      \"icon_id\": \"11372735\",\n      \"name\": \"增加\",\n      \"font_class\": \"zengjia\",\n      \"unicode\": \"ea03\",\n      \"unicode_decimal\": 59907\n    },\n    {\n      \"icon_id\": \"1727446\",\n      \"name\": \"215更多-横向\",\n      \"font_class\": \"gengduo-hengxiang\",\n      \"unicode\": \"e904\",\n      \"unicode_decimal\": 59652\n    },\n    {\n      \"icon_id\": \"11372736\",\n      \"name\": \"语音\",\n      \"font_class\": \"yuyin\",\n      \"unicode\": \"ea04\",\n      \"unicode_decimal\": 59908\n    },\n    {\n      \"icon_id\": \"1727447\",\n      \"name\": \"216更多-竖向\",\n      \"font_class\": \"gengduo-shuxiang\",\n      \"unicode\": \"e905\",\n      \"unicode_decimal\": 59653\n    },\n    {\n      \"icon_id\": \"11372737\",\n      \"name\": \"优惠券\",\n      \"font_class\": \"youhuiquan\",\n      \"unicode\": \"ea05\",\n      \"unicode_decimal\": 59909\n    },\n    {\n      \"icon_id\": \"1727448\",\n      \"name\": \"217时间-线性\",\n      \"font_class\": \"shijian-xianxing\",\n      \"unicode\": \"e906\",\n      \"unicode_decimal\": 59654\n    },\n    {\n      \"icon_id\": \"11372738\",\n      \"name\": \"WIFI\",\n      \"font_class\": \"WIFI\",\n      \"unicode\": \"ea06\",\n      \"unicode_decimal\": 59910\n    },\n    {\n      \"icon_id\": \"1727449\",\n      \"name\": \"214声波、语音消息\",\n      \"font_class\": \"shengboyuyinxiaoxi\",\n      \"unicode\": \"e907\",\n      \"unicode_decimal\": 59655\n    },\n    {\n      \"icon_id\": \"11372739\",\n      \"name\": \"直播\",\n      \"font_class\": \"zhibo\",\n      \"unicode\": \"ea07\",\n      \"unicode_decimal\": 59911\n    },\n    {\n      \"icon_id\": \"1727450\",\n      \"name\": \"217时间\",\n      \"font_class\": \"shijian\",\n      \"unicode\": \"e908\",\n      \"unicode_decimal\": 59656\n    },\n    {\n      \"icon_id\": \"11372740\",\n      \"name\": \"优酷会员\",\n      \"font_class\": \"youkuhuiyuan\",\n      \"unicode\": \"ea08\",\n      \"unicode_decimal\": 59912\n    },\n    {\n      \"icon_id\": \"1727451\",\n      \"name\": \"219上传、导出\",\n      \"font_class\": \"shangchuandaochu\",\n      \"unicode\": \"e909\",\n      \"unicode_decimal\": 59657\n    },\n    {\n      \"icon_id\": \"11372741\",\n      \"name\": \"娱乐宝\",\n      \"font_class\": \"yulebao\",\n      \"unicode\": \"ea09\",\n      \"unicode_decimal\": 59913\n    },\n    {\n      \"icon_id\": \"1727452\",\n      \"name\": \"218下载、导入\",\n      \"font_class\": \"xiazaidaoru\",\n      \"unicode\": \"e90a\",\n      \"unicode_decimal\": 59658\n    },\n    {\n      \"icon_id\": \"11372742\",\n      \"name\": \"指纹\",\n      \"font_class\": \"zhiwen\",\n      \"unicode\": \"ea0a\",\n      \"unicode_decimal\": 59914\n    },\n    {\n      \"icon_id\": \"1727453\",\n      \"name\": \"223保存-线性\",\n      \"font_class\": \"baocun-xianxing\",\n      \"unicode\": \"e90b\",\n      \"unicode_decimal\": 59659\n    },\n    {\n      \"icon_id\": \"11372756\",\n      \"name\": \"爱心\",\n      \"font_class\": \"aixin1\",\n      \"unicode\": \"ea0b\",\n      \"unicode_decimal\": 59915\n    },\n    {\n      \"icon_id\": \"1727454\",\n      \"name\": \"220闪光灯\",\n      \"font_class\": \"shanguangdeng\",\n      \"unicode\": \"e90c\",\n      \"unicode_decimal\": 59660\n    },\n    {\n      \"icon_id\": \"11372757\",\n      \"name\": \"成功\",\n      \"font_class\": \"chenggong1\",\n      \"unicode\": \"ea0c\",\n      \"unicode_decimal\": 59916\n    },\n    {\n      \"icon_id\": \"1727455\",\n      \"name\": \"222闪光灯-自动\",\n      \"font_class\": \"shanguangdeng-zidong\",\n      \"unicode\": \"e90d\",\n      \"unicode_decimal\": 59661\n    },\n    {\n      \"icon_id\": \"11372758\",\n      \"name\": \"点赞\",\n      \"font_class\": \"dianzan1\",\n      \"unicode\": \"ea0d\",\n      \"unicode_decimal\": 59917\n    },\n    {\n      \"icon_id\": \"1727456\",\n      \"name\": \"221闪光灯-关闭\",\n      \"font_class\": \"shanguangdeng-guanbi\",\n      \"unicode\": \"e90e\",\n      \"unicode_decimal\": 59662\n    },\n    {\n      \"icon_id\": \"11372759\",\n      \"name\": \"电话\",\n      \"font_class\": \"dianhua2\",\n      \"unicode\": \"ea0e\",\n      \"unicode_decimal\": 59918\n    },\n    {\n      \"icon_id\": \"1727457\",\n      \"name\": \"223保存\",\n      \"font_class\": \"baocun\",\n      \"unicode\": \"e90f\",\n      \"unicode_decimal\": 59663\n    },\n    {\n      \"icon_id\": \"11372760\",\n      \"name\": \"帮助\",\n      \"font_class\": \"bangzhu1\",\n      \"unicode\": \"ea0f\",\n      \"unicode_decimal\": 59919\n    },\n    {\n      \"icon_id\": \"1727458\",\n      \"name\": \"224用户-线性\",\n      \"font_class\": \"yonghu-xianxing\",\n      \"unicode\": \"e910\",\n      \"unicode_decimal\": 59664\n    },\n    {\n      \"icon_id\": \"11372761\",\n      \"name\": \"电影票\",\n      \"font_class\": \"dianyingpiao1\",\n      \"unicode\": \"ea10\",\n      \"unicode_decimal\": 59920\n    },\n    {\n      \"icon_id\": \"1727459\",\n      \"name\": \"224用户\",\n      \"font_class\": \"yonghu\",\n      \"unicode\": \"e911\",\n      \"unicode_decimal\": 59665\n    },\n    {\n      \"icon_id\": \"11372762\",\n      \"name\": \"发现\",\n      \"font_class\": \"faxian1\",\n      \"unicode\": \"ea11\",\n      \"unicode_decimal\": 59921\n    },\n    {\n      \"icon_id\": \"1727460\",\n      \"name\": \"226角色、群体\",\n      \"font_class\": \"jiaosequnti\",\n      \"unicode\": \"e912\",\n      \"unicode_decimal\": 59666\n    },\n    {\n      \"icon_id\": \"11372763\",\n      \"name\": \"定位\",\n      \"font_class\": \"dingwei2\",\n      \"unicode\": \"ea12\",\n      \"unicode_decimal\": 59922\n    },\n    {\n      \"icon_id\": \"1727461\",\n      \"name\": \"225默认头像\",\n      \"font_class\": \"morentouxiang\",\n      \"unicode\": \"e913\",\n      \"unicode_decimal\": 59667\n    },\n    {\n      \"icon_id\": \"11372764\",\n      \"name\": \"公告\",\n      \"font_class\": \"gonggao\",\n      \"unicode\": \"ea13\",\n      \"unicode_decimal\": 59923\n    },\n    {\n      \"icon_id\": \"1727462\",\n      \"name\": \"227注册、添加好友\",\n      \"font_class\": \"zhucetianjiahaoyou\",\n      \"unicode\": \"e914\",\n      \"unicode_decimal\": 59668\n    },\n    {\n      \"icon_id\": \"11372765\",\n      \"name\": \"话题\",\n      \"font_class\": \"huati1\",\n      \"unicode\": \"ea14\",\n      \"unicode_decimal\": 59924\n    },\n    {\n      \"icon_id\": \"1727466\",\n      \"name\": \"228任务\",\n      \"font_class\": \"renwu\",\n      \"unicode\": \"e915\",\n      \"unicode_decimal\": 59669\n    },\n    {\n      \"icon_id\": \"11372766\",\n      \"name\": \"减少\",\n      \"font_class\": \"jianshao1\",\n      \"unicode\": \"ea15\",\n      \"unicode_decimal\": 59925\n    },\n    {\n      \"icon_id\": \"1727467\",\n      \"name\": \"229中文模式\",\n      \"font_class\": \"zhongwenmoshi\",\n      \"unicode\": \"e916\",\n      \"unicode_decimal\": 59670\n    },\n    {\n      \"icon_id\": \"11372767\",\n      \"name\": \"会员\",\n      \"font_class\": \"huiyuan1\",\n      \"unicode\": \"ea16\",\n      \"unicode_decimal\": 59926\n    },\n    {\n      \"icon_id\": \"1727468\",\n      \"name\": \"231附件\",\n      \"font_class\": \"fujian\",\n      \"unicode\": \"e917\",\n      \"unicode_decimal\": 59671\n    },\n    {\n      \"icon_id\": \"11372768\",\n      \"name\": \"评论\",\n      \"font_class\": \"pinglun1\",\n      \"unicode\": \"ea17\",\n      \"unicode_decimal\": 59927\n    },\n    {\n      \"icon_id\": \"1727469\",\n      \"name\": \"232编辑、输入-线性\",\n      \"font_class\": \"bianjishuru-xianxing\",\n      \"unicode\": \"e918\",\n      \"unicode_decimal\": 59672\n    },\n    {\n      \"icon_id\": \"11372769\",\n      \"name\": \"社区\",\n      \"font_class\": \"shequ1\",\n      \"unicode\": \"ea18\",\n      \"unicode_decimal\": 59928\n    },\n    {\n      \"icon_id\": \"1727470\",\n      \"name\": \"232编辑、输入\",\n      \"font_class\": \"bianjishuru\",\n      \"unicode\": \"e919\",\n      \"unicode_decimal\": 59673\n    },\n    {\n      \"icon_id\": \"11372770\",\n      \"name\": \"失败\",\n      \"font_class\": \"shibai1\",\n      \"unicode\": \"ea19\",\n      \"unicode_decimal\": 59929\n    },\n    {\n      \"icon_id\": \"1727471\",\n      \"name\": \"230英文模式\",\n      \"font_class\": \"yingwenmoshi\",\n      \"unicode\": \"e91a\",\n      \"unicode_decimal\": 59674\n    },\n    {\n      \"icon_id\": \"11372771\",\n      \"name\": \"时间\",\n      \"font_class\": \"shijian2\",\n      \"unicode\": \"ea1a\",\n      \"unicode_decimal\": 59930\n    },\n    {\n      \"icon_id\": \"1727472\",\n      \"name\": \"233键盘-线性\",\n      \"font_class\": \"jianpan-xianxing\",\n      \"unicode\": \"e91b\",\n      \"unicode_decimal\": 59675\n    },\n    {\n      \"icon_id\": \"11372772\",\n      \"name\": \"闪电\",\n      \"font_class\": \"shandian1\",\n      \"unicode\": \"ea1b\",\n      \"unicode_decimal\": 59931\n    },\n    {\n      \"icon_id\": \"1727473\",\n      \"name\": \"233键盘\",\n      \"font_class\": \"jianpan\",\n      \"unicode\": \"e91c\",\n      \"unicode_decimal\": 59676\n    },\n    {\n      \"icon_id\": \"11372773\",\n      \"name\": \"我的\",\n      \"font_class\": \"wode1\",\n      \"unicode\": \"ea1c\",\n      \"unicode_decimal\": 59932\n    },\n    {\n      \"icon_id\": \"1727474\",\n      \"name\": \"234日历\",\n      \"font_class\": \"rili\",\n      \"unicode\": \"e91d\",\n      \"unicode_decimal\": 59677\n    },\n    {\n      \"icon_id\": \"11372774\",\n      \"name\": \"首页\",\n      \"font_class\": \"shouye2\",\n      \"unicode\": \"ea1d\",\n      \"unicode_decimal\": 59933\n    },\n    {\n      \"icon_id\": \"1727475\",\n      \"name\": \"236未出勤\",\n      \"font_class\": \"weichuqin\",\n      \"unicode\": \"e91e\",\n      \"unicode_decimal\": 59678\n    },\n    {\n      \"icon_id\": \"11372775\",\n      \"name\": \"手机\",\n      \"font_class\": \"shouji1\",\n      \"unicode\": \"ea1e\",\n      \"unicode_decimal\": 59934\n    },\n    {\n      \"icon_id\": \"1727476\",\n      \"name\": \"235考勤、出勤\",\n      \"font_class\": \"kaoqinchuqin\",\n      \"unicode\": \"e91f\",\n      \"unicode_decimal\": 59679\n    },\n    {\n      \"icon_id\": \"11372776\",\n      \"name\": \"叹号\",\n      \"font_class\": \"tanhao1\",\n      \"unicode\": \"ea1f\",\n      \"unicode_decimal\": 59935\n    },\n    {\n      \"icon_id\": \"1727477\",\n      \"name\": \"237拍照\",\n      \"font_class\": \"paizhao\",\n      \"unicode\": \"e920\",\n      \"unicode_decimal\": 59680\n    },\n    {\n      \"icon_id\": \"11372777\",\n      \"name\": \"收藏\",\n      \"font_class\": \"shoucang2\",\n      \"unicode\": \"ea20\",\n      \"unicode_decimal\": 59936\n    },\n    {\n      \"icon_id\": \"1727478\",\n      \"name\": \"237拍照-线性\",\n      \"font_class\": \"paizhao-xianxing\",\n      \"unicode\": \"e921\",\n      \"unicode_decimal\": 59681\n    },\n    {\n      \"icon_id\": \"11372778\",\n      \"name\": \"数据\",\n      \"font_class\": \"shuju1\",\n      \"unicode\": \"ea21\",\n      \"unicode_decimal\": 59937\n    },\n    {\n      \"icon_id\": \"1727479\",\n      \"name\": \"238图片-线性\",\n      \"font_class\": \"tupian-xianxing\",\n      \"unicode\": \"e922\",\n      \"unicode_decimal\": 59682\n    },\n    {\n      \"icon_id\": \"11372779\",\n      \"name\": \"问答\",\n      \"font_class\": \"wenda\",\n      \"unicode\": \"ea22\",\n      \"unicode_decimal\": 59938\n    },\n    {\n      \"icon_id\": \"1727480\",\n      \"name\": \"238图片\",\n      \"font_class\": \"tupian\",\n      \"unicode\": \"e923\",\n      \"unicode_decimal\": 59683\n    },\n    {\n      \"icon_id\": \"11372780\",\n      \"name\": \"眼睛\",\n      \"font_class\": \"yanjing1\",\n      \"unicode\": \"ea23\",\n      \"unicode_decimal\": 59939\n    },\n    {\n      \"icon_id\": \"1727483\",\n      \"name\": \"239扫描\",\n      \"font_class\": \"saomiao\",\n      \"unicode\": \"e924\",\n      \"unicode_decimal\": 59684\n    },\n    {\n      \"icon_id\": \"11372781\",\n      \"name\": \"影城卡\",\n      \"font_class\": \"yingchengka1\",\n      \"unicode\": \"ea24\",\n      \"unicode_decimal\": 59940\n    },\n    {\n      \"icon_id\": \"1727484\",\n      \"name\": \"240显示、可见\",\n      \"font_class\": \"xianshikejian\",\n      \"unicode\": \"e925\",\n      \"unicode_decimal\": 59685\n    },\n    {\n      \"icon_id\": \"11372782\",\n      \"name\": \"相机\",\n      \"font_class\": \"xiangji1\",\n      \"unicode\": \"ea25\",\n      \"unicode_decimal\": 59941\n    },\n    {\n      \"icon_id\": \"1727485\",\n      \"name\": \"242锁定\",\n      \"font_class\": \"suoding\",\n      \"unicode\": \"e926\",\n      \"unicode_decimal\": 59686\n    },\n    {\n      \"icon_id\": \"11372783\",\n      \"name\": \"影院\",\n      \"font_class\": \"yingyuan1\",\n      \"unicode\": \"ea26\",\n      \"unicode_decimal\": 59942\n    },\n    {\n      \"icon_id\": \"1727486\",\n      \"name\": \"241隐藏、不可见\",\n      \"font_class\": \"yincangbukejian\",\n      \"unicode\": \"e927\",\n      \"unicode_decimal\": 59687\n    },\n    {\n      \"icon_id\": \"11372784\",\n      \"name\": \"银行优惠\",\n      \"font_class\": \"yinhangyouhui\",\n      \"unicode\": \"ea27\",\n      \"unicode_decimal\": 59943\n    },\n    {\n      \"icon_id\": \"1727487\",\n      \"name\": \"243解锁\",\n      \"font_class\": \"jiesuo\",\n      \"unicode\": \"e928\",\n      \"unicode_decimal\": 59688\n    },\n    {\n      \"icon_id\": \"11372785\",\n      \"name\": \"小食\",\n      \"font_class\": \"xiaoshi1\",\n      \"unicode\": \"ea28\",\n      \"unicode_decimal\": 59944\n    },\n    {\n      \"icon_id\": \"1727488\",\n      \"name\": \"244安装、施工-线性\",\n      \"font_class\": \"anzhuangshigong-xianxing\",\n      \"unicode\": \"e929\",\n      \"unicode_decimal\": 59689\n    },\n    {\n      \"icon_id\": \"11372786\",\n      \"name\": \"演出\",\n      \"font_class\": \"yanchu1\",\n      \"unicode\": \"ea29\",\n      \"unicode_decimal\": 59945\n    },\n    {\n      \"icon_id\": \"1727489\",\n      \"name\": \"245筛选过滤\",\n      \"font_class\": \"shaixuanguolv\",\n      \"unicode\": \"e92a\",\n      \"unicode_decimal\": 59690\n    },\n    {\n      \"icon_id\": \"11372787\",\n      \"name\": \"增加\",\n      \"font_class\": \"zengjia1\",\n      \"unicode\": \"ea2a\",\n      \"unicode_decimal\": 59946\n    },\n    {\n      \"icon_id\": \"1727490\",\n      \"name\": \"244安装、施工\",\n      \"font_class\": \"anzhuangshigong\",\n      \"unicode\": \"e92b\",\n      \"unicode_decimal\": 59691\n    },\n    {\n      \"icon_id\": \"11372788\",\n      \"name\": \"电影\",\n      \"font_class\": \"dianying1\",\n      \"unicode\": \"ea2b\",\n      \"unicode_decimal\": 59947\n    },\n    {\n      \"icon_id\": \"1727491\",\n      \"name\": \"246注销、关机\",\n      \"font_class\": \"zhuxiaoguanji\",\n      \"unicode\": \"e92c\",\n      \"unicode_decimal\": 59692\n    },\n    {\n      \"icon_id\": \"11372789\",\n      \"name\": \"优惠券\",\n      \"font_class\": \"youhuiquan1\",\n      \"unicode\": \"ea2c\",\n      \"unicode_decimal\": 59948\n    },\n    {\n      \"icon_id\": \"1727492\",\n      \"name\": \"247好评-圆框\",\n      \"font_class\": \"haoping-yuankuang\",\n      \"unicode\": \"e92d\",\n      \"unicode_decimal\": 59693\n    },\n    {\n      \"icon_id\": \"11372790\",\n      \"name\": \"热门\",\n      \"font_class\": \"remen\",\n      \"unicode\": \"ea2d\",\n      \"unicode_decimal\": 59949\n    },\n    {\n      \"icon_id\": \"1727493\",\n      \"name\": \"248差评-圆框\",\n      \"font_class\": \"chaping-yuankuang\",\n      \"unicode\": \"e92e\",\n      \"unicode_decimal\": 59694\n    },\n    {\n      \"icon_id\": \"11372791\",\n      \"name\": \"创作\",\n      \"font_class\": \"chuangzuo1\",\n      \"unicode\": \"ea2e\",\n      \"unicode_decimal\": 59950\n    },\n    {\n      \"icon_id\": \"1727494\",\n      \"name\": \"248差评\",\n      \"font_class\": \"chaping\",\n      \"unicode\": \"e92f\",\n      \"unicode_decimal\": 59695\n    },\n    {\n      \"icon_id\": \"1727495\",\n      \"name\": \"247好评\",\n      \"font_class\": \"haoping\",\n      \"unicode\": \"e930\",\n      \"unicode_decimal\": 59696\n    },\n    {\n      \"icon_id\": \"1727496\",\n      \"name\": \"250一般\",\n      \"font_class\": \"yiban\",\n      \"unicode\": \"e931\",\n      \"unicode_decimal\": 59697\n    },\n    {\n      \"icon_id\": \"1727497\",\n      \"name\": \"249满意\",\n      \"font_class\": \"manyi\",\n      \"unicode\": \"e932\",\n      \"unicode_decimal\": 59698\n    },\n    {\n      \"icon_id\": \"1727498\",\n      \"name\": \"251不满意\",\n      \"font_class\": \"bumanyi\",\n      \"unicode\": \"e933\",\n      \"unicode_decimal\": 59699\n    },\n    {\n      \"icon_id\": \"1727500\",\n      \"name\": \"253列表视图、菜单\",\n      \"font_class\": \"liebiaoshitucaidan\",\n      \"unicode\": \"e934\",\n      \"unicode_decimal\": 59700\n    },\n    {\n      \"icon_id\": \"1727501\",\n      \"name\": \"252宫格视图\",\n      \"font_class\": \"gonggeshitu\",\n      \"unicode\": \"e935\",\n      \"unicode_decimal\": 59701\n    },\n    {\n      \"icon_id\": \"1727502\",\n      \"name\": \"255Phone手机\",\n      \"font_class\": \"Phoneshouji\",\n      \"unicode\": \"e936\",\n      \"unicode_decimal\": 59702\n    },\n    {\n      \"icon_id\": \"1727503\",\n      \"name\": \"254PC台式机\",\n      \"font_class\": \"PCtaishiji\",\n      \"unicode\": \"e937\",\n      \"unicode_decimal\": 59703\n    },\n    {\n      \"icon_id\": \"1727504\",\n      \"name\": \"256PDA手持工作设备\",\n      \"font_class\": \"PDAshouchigongzuoshebei\",\n      \"unicode\": \"e938\",\n      \"unicode_decimal\": 59704\n    },\n    {\n      \"icon_id\": \"1727506\",\n      \"name\": \"301加-方框\",\n      \"font_class\": \"jia-fangkuang\",\n      \"unicode\": \"e939\",\n      \"unicode_decimal\": 59705\n    },\n    {\n      \"icon_id\": \"1727507\",\n      \"name\": \"301加-线性方框\",\n      \"font_class\": \"jia-xianxingfangkuang\",\n      \"unicode\": \"e93a\",\n      \"unicode_decimal\": 59706\n    },\n    {\n      \"icon_id\": \"1727508\",\n      \"name\": \"301加-线性圆框\",\n      \"font_class\": \"jia-xianxingyuankuang\",\n      \"unicode\": \"e93b\",\n      \"unicode_decimal\": 59707\n    },\n    {\n      \"icon_id\": \"1727509\",\n      \"name\": \"301加-圆框\",\n      \"font_class\": \"jia-yuankuang\",\n      \"unicode\": \"e93c\",\n      \"unicode_decimal\": 59708\n    },\n    {\n      \"icon_id\": \"1727510\",\n      \"name\": \"302减-方框\",\n      \"font_class\": \"jian-fangkuang\",\n      \"unicode\": \"e93d\",\n      \"unicode_decimal\": 59709\n    },\n    {\n      \"icon_id\": \"1727511\",\n      \"name\": \"301加\",\n      \"font_class\": \"jia\",\n      \"unicode\": \"e93e\",\n      \"unicode_decimal\": 59710\n    },\n    {\n      \"icon_id\": \"1727512\",\n      \"name\": \"302减-圆框\",\n      \"font_class\": \"jian-yuankuang\",\n      \"unicode\": \"e93f\",\n      \"unicode_decimal\": 59711\n    },\n    {\n      \"icon_id\": \"1727513\",\n      \"name\": \"302减\",\n      \"font_class\": \"jian\",\n      \"unicode\": \"e940\",\n      \"unicode_decimal\": 59712\n    },\n    {\n      \"icon_id\": \"1727514\",\n      \"name\": \"302减-线性方框\",\n      \"font_class\": \"jian-xianxingfangkuang\",\n      \"unicode\": \"e941\",\n      \"unicode_decimal\": 59713\n    },\n    {\n      \"icon_id\": \"1727515\",\n      \"name\": \"303正确、完成-线性圆框\",\n      \"font_class\": \"zhengquewancheng-xianxingyuankuang\",\n      \"unicode\": \"e942\",\n      \"unicode_decimal\": 59714\n    },\n    {\n      \"icon_id\": \"1727516\",\n      \"name\": \"303正确、完成-圆框\",\n      \"font_class\": \"zhengquewancheng-yuankuang\",\n      \"unicode\": \"e943\",\n      \"unicode_decimal\": 59715\n    },\n    {\n      \"icon_id\": \"1727517\",\n      \"name\": \"303正确、完成\",\n      \"font_class\": \"zhengquewancheng\",\n      \"unicode\": \"e944\",\n      \"unicode_decimal\": 59716\n    },\n    {\n      \"icon_id\": \"1727518\",\n      \"name\": \"302减-线性圆框\",\n      \"font_class\": \"jian-xianxingyuankuang\",\n      \"unicode\": \"e945\",\n      \"unicode_decimal\": 59717\n    },\n    {\n      \"icon_id\": \"1727520\",\n      \"name\": \"304错误、关闭、取消-线性方框\",\n      \"font_class\": \"cuowuguanbiquxiao-xianxingfangkuang\",\n      \"unicode\": \"e946\",\n      \"unicode_decimal\": 59718\n    },\n    {\n      \"icon_id\": \"1727521\",\n      \"name\": \"304错误、关闭、取消-圆框\",\n      \"font_class\": \"cuowuguanbiquxiao-yuankuang\",\n      \"unicode\": \"e947\",\n      \"unicode_decimal\": 59719\n    },\n    {\n      \"icon_id\": \"1727522\",\n      \"name\": \"304错误、关闭、取消-线性圆框\",\n      \"font_class\": \"cuowuguanbiquxiao-xianxingyuankuang\",\n      \"unicode\": \"e948\",\n      \"unicode_decimal\": 59720\n    },\n    {\n      \"icon_id\": \"1727523\",\n      \"name\": \"304错误、关闭、取消\",\n      \"font_class\": \"cuowuguanbiquxiao\",\n      \"unicode\": \"e949\",\n      \"unicode_decimal\": 59721\n    },\n    {\n      \"icon_id\": \"1727524\",\n      \"name\": \"304错误、关闭、取消-方框\",\n      \"font_class\": \"cuowuguanbiquxiao-fangkuang\",\n      \"unicode\": \"e94a\",\n      \"unicode_decimal\": 59722\n    },\n    {\n      \"icon_id\": \"1727525\",\n      \"name\": \"305信息-线性圆框\",\n      \"font_class\": \"xinxi-xianxingyuankuang\",\n      \"unicode\": \"e94b\",\n      \"unicode_decimal\": 59723\n    },\n    {\n      \"icon_id\": \"1727526\",\n      \"name\": \"305信息\",\n      \"font_class\": \"xinxi\",\n      \"unicode\": \"e94c\",\n      \"unicode_decimal\": 59724\n    },\n    {\n      \"icon_id\": \"1727527\",\n      \"name\": \"306问号-线性圆框\",\n      \"font_class\": \"wenhao-xianxingyuankuang\",\n      \"unicode\": \"e94d\",\n      \"unicode_decimal\": 59725\n    },\n    {\n      \"icon_id\": \"1727528\",\n      \"name\": \"306问号\",\n      \"font_class\": \"wenhao\",\n      \"unicode\": \"e94e\",\n      \"unicode_decimal\": 59726\n    },\n    {\n      \"icon_id\": \"1727529\",\n      \"name\": \"306问号-圆框\",\n      \"font_class\": \"wenhao-yuankuang\",\n      \"unicode\": \"e94f\",\n      \"unicode_decimal\": 59727\n    },\n    {\n      \"icon_id\": \"1727530\",\n      \"name\": \"305信息-圆框\",\n      \"font_class\": \"xinxi-yuankuang\",\n      \"unicode\": \"e950\",\n      \"unicode_decimal\": 59728\n    },\n    {\n      \"icon_id\": \"1727531\",\n      \"name\": \"307感叹号-三角框\",\n      \"font_class\": \"gantanhao-sanjiaokuang\",\n      \"unicode\": \"e951\",\n      \"unicode_decimal\": 59729\n    },\n    {\n      \"icon_id\": \"1727532\",\n      \"name\": \"307感叹号-圆框\",\n      \"font_class\": \"gantanhao-yuankuang\",\n      \"unicode\": \"e952\",\n      \"unicode_decimal\": 59730\n    },\n    {\n      \"icon_id\": \"1727533\",\n      \"name\": \"307感叹号-线性圆框\",\n      \"font_class\": \"gantanhao-xianxingyuankuang\",\n      \"unicode\": \"e953\",\n      \"unicode_decimal\": 59731\n    },\n    {\n      \"icon_id\": \"1727534\",\n      \"name\": \"307感叹号-线性三角框\",\n      \"font_class\": \"gantanhao-xianxingsanjiaokuang\",\n      \"unicode\": \"e954\",\n      \"unicode_decimal\": 59732\n    },\n    {\n      \"icon_id\": \"1727535\",\n      \"name\": \"307感叹号\",\n      \"font_class\": \"gantanhao\",\n      \"unicode\": \"e955\",\n      \"unicode_decimal\": 59733\n    },\n    {\n      \"icon_id\": \"1727537\",\n      \"name\": \"308上一页、后退、返回-线性圆框\",\n      \"font_class\": \"shangyiyehoutuifanhui-xianxingyuankuang\",\n      \"unicode\": \"e956\",\n      \"unicode_decimal\": 59734\n    },\n    {\n      \"icon_id\": \"1727538\",\n      \"name\": \"308上一页、后退、返回-圆框\",\n      \"font_class\": \"shangyiyehoutuifanhui-yuankuang\",\n      \"unicode\": \"e957\",\n      \"unicode_decimal\": 59735\n    },\n    {\n      \"icon_id\": \"1727539\",\n      \"name\": \"309下一页、前进、查看更多-线性圆框\",\n      \"font_class\": \"xiayiyeqianjinchakangengduo-xianxingyuankuang\",\n      \"unicode\": \"e958\",\n      \"unicode_decimal\": 59736\n    },\n    {\n      \"icon_id\": \"1727540\",\n      \"name\": \"309下一页、前进、查看更多-圆框\",\n      \"font_class\": \"xiayiyeqianjinchakangengduo-yuankuang\",\n      \"unicode\": \"e959\",\n      \"unicode_decimal\": 59737\n    },\n    {\n      \"icon_id\": \"1727541\",\n      \"name\": \"308上一页、后退、返回\",\n      \"font_class\": \"shangyiyehoutuifanhui\",\n      \"unicode\": \"e95a\",\n      \"unicode_decimal\": 59738\n    },\n    {\n      \"icon_id\": \"1727542\",\n      \"name\": \"309下一页、前进、查看更多\",\n      \"font_class\": \"xiayiyeqianjinchakangengduo\",\n      \"unicode\": \"e95b\",\n      \"unicode_decimal\": 59739\n    },\n    {\n      \"icon_id\": \"1727543\",\n      \"name\": \"310向下、展开-线性圆框\",\n      \"font_class\": \"xiangxiazhankai-xianxingyuankuang\",\n      \"unicode\": \"e95c\",\n      \"unicode_decimal\": 59740\n    },\n    {\n      \"icon_id\": \"1727544\",\n      \"name\": \"310向下、展开-圆框\",\n      \"font_class\": \"xiangxiazhankai-yuankuang\",\n      \"unicode\": \"e95d\",\n      \"unicode_decimal\": 59741\n    },\n    {\n      \"icon_id\": \"1727545\",\n      \"name\": \"310向下、展开\",\n      \"font_class\": \"xiangxiazhankai\",\n      \"unicode\": \"e95e\",\n      \"unicode_decimal\": 59742\n    },\n    {\n      \"icon_id\": \"1727546\",\n      \"name\": \"311向上、收起-圆框\",\n      \"font_class\": \"xiangshangshouqi-yuankuang\",\n      \"unicode\": \"e95f\",\n      \"unicode_decimal\": 59743\n    },\n    {\n      \"icon_id\": \"1727547\",\n      \"name\": \"311向上、收起-线性圆框\",\n      \"font_class\": \"xiangshangshouqi-xianxingyuankuang\",\n      \"unicode\": \"e960\",\n      \"unicode_decimal\": 59744\n    },\n    {\n      \"icon_id\": \"1727548\",\n      \"name\": \"312指向左\",\n      \"font_class\": \"zhixiangzuo\",\n      \"unicode\": \"e961\",\n      \"unicode_decimal\": 59745\n    },\n    {\n      \"icon_id\": \"1727549\",\n      \"name\": \"313指向右\",\n      \"font_class\": \"zhixiangyou\",\n      \"unicode\": \"e962\",\n      \"unicode_decimal\": 59746\n    },\n    {\n      \"icon_id\": \"1727550\",\n      \"name\": \"315指向上\",\n      \"font_class\": \"zhixiangshang\",\n      \"unicode\": \"e963\",\n      \"unicode_decimal\": 59747\n    },\n    {\n      \"icon_id\": \"1890248\",\n      \"name\": \"微信\",\n      \"font_class\": \"weixin2\",\n      \"unicode\": \"e601\",\n      \"unicode_decimal\": 58881\n    },\n    {\n      \"icon_id\": \"3354374\",\n      \"name\": \"支付宝\",\n      \"font_class\": \"zhifubao\",\n      \"unicode\": \"e600\",\n      \"unicode_decimal\": 58880\n    },\n    {\n      \"icon_id\": \"598413\",\n      \"name\": \"QQ\",\n      \"font_class\": \"qq\",\n      \"unicode\": \"e62e\",\n      \"unicode_decimal\": 58926\n    },\n    {\n      \"icon_id\": \"881531\",\n      \"name\": \"微信\",\n      \"font_class\": \"weixin\",\n      \"unicode\": \"e60e\",\n      \"unicode_decimal\": 58894\n    },\n    {\n      \"icon_id\": \"2269677\",\n      \"name\": \"微信\",\n      \"font_class\": \"weixin1\",\n      \"unicode\": \"e621\",\n      \"unicode_decimal\": 58913\n    },\n    {\n      \"icon_id\": \"3176462\",\n      \"name\": \"qq\",\n      \"font_class\": \"qq1\",\n      \"unicode\": \"e607\",\n      \"unicode_decimal\": 58887\n    },\n    {\n      \"icon_id\": \"3293098\",\n      \"name\": \"qq\",\n      \"font_class\": \"qq2\",\n      \"unicode\": \"e66a\",\n      \"unicode_decimal\": 58986\n    },\n    {\n      \"icon_id\": \"5234182\",\n      \"name\": \"支付宝\",\n      \"font_class\": \"umidd17\",\n      \"unicode\": \"e603\",\n      \"unicode_decimal\": 58883\n    },\n    {\n      \"icon_id\": \"212373\",\n      \"name\": \"electrical\",\n      \"font_class\": \"electrical\",\n      \"unicode\": \"e6d4\",\n      \"unicode_decimal\": 59092\n    },\n    {\n      \"icon_id\": \"212376\",\n      \"name\": \"home\",\n      \"font_class\": \"home\",\n      \"unicode\": \"e6d7\",\n      \"unicode_decimal\": 59095\n    },\n    {\n      \"icon_id\": \"212397\",\n      \"name\": \"electronics\",\n      \"font_class\": \"electronics\",\n      \"unicode\": \"e6da\",\n      \"unicode_decimal\": 59098\n    },\n    {\n      \"icon_id\": \"212398\",\n      \"name\": \"gifts\",\n      \"font_class\": \"gifts\",\n      \"unicode\": \"e6db\",\n      \"unicode_decimal\": 59099\n    },\n    {\n      \"icon_id\": \"212502\",\n      \"name\": \"lights\",\n      \"font_class\": \"lights\",\n      \"unicode\": \"e6de\",\n      \"unicode_decimal\": 59102\n    },\n    {\n      \"icon_id\": \"212973\",\n      \"name\": \"sports\",\n      \"font_class\": \"sports\",\n      \"unicode\": \"e6e0\",\n      \"unicode_decimal\": 59104\n    },\n    {\n      \"icon_id\": \"212999\",\n      \"name\": \"toys\",\n      \"font_class\": \"toys\",\n      \"unicode\": \"e6e1\",\n      \"unicode_decimal\": 59105\n    },\n    {\n      \"icon_id\": \"213017\",\n      \"name\": \"auto\",\n      \"font_class\": \"auto\",\n      \"unicode\": \"e6e3\",\n      \"unicode_decimal\": 59107\n    },\n    {\n      \"icon_id\": \"213018\",\n      \"name\": \"jewelry\",\n      \"font_class\": \"jewelry\",\n      \"unicode\": \"e6e4\",\n      \"unicode_decimal\": 59108\n    },\n    {\n      \"icon_id\": \"221459\",\n      \"name\": \"trade-assurance\",\n      \"font_class\": \"trade-assurance\",\n      \"unicode\": \"e6e5\",\n      \"unicode_decimal\": 59109\n    },\n    {\n      \"icon_id\": \"221461\",\n      \"name\": \"browse\",\n      \"font_class\": \"browse\",\n      \"unicode\": \"e6e6\",\n      \"unicode_decimal\": 59110\n    },\n    {\n      \"icon_id\": \"221462\",\n      \"name\": \"rfq-qm\",\n      \"font_class\": \"rfqqm\",\n      \"unicode\": \"e6e7\",\n      \"unicode_decimal\": 59111\n    },\n    {\n      \"icon_id\": \"221463\",\n      \"name\": \"rfq-quantity\",\n      \"font_class\": \"rfqquantity\",\n      \"unicode\": \"e6e8\",\n      \"unicode_decimal\": 59112\n    },\n    {\n      \"icon_id\": \"221782\",\n      \"name\": \"atm-away\",\n      \"font_class\": \"atmaway\",\n      \"unicode\": \"e6e9\",\n      \"unicode_decimal\": 59113\n    },\n    {\n      \"icon_id\": \"224984\",\n      \"name\": \"rfq\",\n      \"font_class\": \"rfq1\",\n      \"unicode\": \"e6eb\",\n      \"unicode_decimal\": 59115\n    },\n    {\n      \"icon_id\": \"224985\",\n      \"name\": \"scanning\",\n      \"font_class\": \"scanning\",\n      \"unicode\": \"e6ec\",\n      \"unicode_decimal\": 59116\n    },\n    {\n      \"icon_id\": \"238494\",\n      \"name\": \"compare\",\n      \"font_class\": \"compare\",\n      \"unicode\": \"e6ee\",\n      \"unicode_decimal\": 59118\n    },\n    {\n      \"icon_id\": \"238497\",\n      \"name\": \"filter\",\n      \"font_class\": \"filter\",\n      \"unicode\": \"e6f1\",\n      \"unicode_decimal\": 59121\n    },\n    {\n      \"icon_id\": \"238498\",\n      \"name\": \"pin\",\n      \"font_class\": \"pin\",\n      \"unicode\": \"e6f2\",\n      \"unicode_decimal\": 59122\n    },\n    {\n      \"icon_id\": \"238499\",\n      \"name\": \"history\",\n      \"font_class\": \"history\",\n      \"unicode\": \"e6f3\",\n      \"unicode_decimal\": 59123\n    },\n    {\n      \"icon_id\": \"238500\",\n      \"name\": \"product-features\",\n      \"font_class\": \"productfeatures\",\n      \"unicode\": \"e6f4\",\n      \"unicode_decimal\": 59124\n    },\n    {\n      \"icon_id\": \"238501\",\n      \"name\": \"supplier-features\",\n      \"font_class\": \"supplierfeatures\",\n      \"unicode\": \"e6f5\",\n      \"unicode_decimal\": 59125\n    },\n    {\n      \"icon_id\": \"238893\",\n      \"name\": \"similar-product\",\n      \"font_class\": \"similarproduct\",\n      \"unicode\": \"e6f6\",\n      \"unicode_decimal\": 59126\n    },\n    {\n      \"icon_id\": \"240305\",\n      \"name\": \"link\",\n      \"font_class\": \"link\",\n      \"unicode\": \"e6f7\",\n      \"unicode_decimal\": 59127\n    },\n    {\n      \"icon_id\": \"240311\",\n      \"name\": \"cut\",\n      \"font_class\": \"cut\",\n      \"unicode\": \"e6f8\",\n      \"unicode_decimal\": 59128\n    },\n    {\n      \"icon_id\": \"240314\",\n      \"name\": \"nav-list\",\n      \"font_class\": \"navlist\",\n      \"unicode\": \"e6fa\",\n      \"unicode_decimal\": 59130\n    },\n    {\n      \"icon_id\": \"240315\",\n      \"name\": \"image-text\",\n      \"font_class\": \"imagetext\",\n      \"unicode\": \"e6fb\",\n      \"unicode_decimal\": 59131\n    },\n    {\n      \"icon_id\": \"240316\",\n      \"name\": \"text\",\n      \"font_class\": \"text\",\n      \"unicode\": \"e6fc\",\n      \"unicode_decimal\": 59132\n    },\n    {\n      \"icon_id\": \"240317\",\n      \"name\": \"move\",\n      \"font_class\": \"move\",\n      \"unicode\": \"e6fd\",\n      \"unicode_decimal\": 59133\n    },\n    {\n      \"icon_id\": \"243147\",\n      \"name\": \"subtract\",\n      \"font_class\": \"subtract\",\n      \"unicode\": \"e6fe\",\n      \"unicode_decimal\": 59134\n    },\n    {\n      \"icon_id\": \"244729\",\n      \"name\": \"dollar\",\n      \"font_class\": \"dollar\",\n      \"unicode\": \"e702\",\n      \"unicode_decimal\": 59138\n    },\n    {\n      \"icon_id\": \"303179\",\n      \"name\": \"raw\",\n      \"font_class\": \"raw\",\n      \"unicode\": \"e704\",\n      \"unicode_decimal\": 59140\n    },\n    {\n      \"icon_id\": \"303209\",\n      \"name\": \"office\",\n      \"font_class\": \"office\",\n      \"unicode\": \"e705\",\n      \"unicode_decimal\": 59141\n    },\n    {\n      \"icon_id\": \"303224\",\n      \"name\": \"agriculture\",\n      \"font_class\": \"agriculture\",\n      \"unicode\": \"e707\",\n      \"unicode_decimal\": 59143\n    },\n    {\n      \"icon_id\": \"303284\",\n      \"name\": \"machinery\",\n      \"font_class\": \"machinery\",\n      \"unicode\": \"e709\",\n      \"unicode_decimal\": 59145\n    },\n    {\n      \"icon_id\": \"321482\",\n      \"name\": \"assessed-Badge\",\n      \"font_class\": \"assessedbadge\",\n      \"unicode\": \"e70a\",\n      \"unicode_decimal\": 59146\n    },\n    {\n      \"icon_id\": \"321992\",\n      \"name\": \"personal-center\",\n      \"font_class\": \"gerenzhongxin\",\n      \"unicode\": \"e70b\",\n      \"unicode_decimal\": 59147\n    },\n    {\n      \"icon_id\": \"321993\",\n      \"name\": \"integral\",\n      \"font_class\": \"jifen\",\n      \"unicode\": \"e70c\",\n      \"unicode_decimal\": 59148\n    },\n    {\n      \"icon_id\": \"323372\",\n      \"name\": \"operation\",\n      \"font_class\": \"operation\",\n      \"unicode\": \"e70e\",\n      \"unicode_decimal\": 59150\n    },\n    {\n      \"icon_id\": \"332903\",\n      \"name\": \"remind\",\n      \"font_class\": \"remind1\",\n      \"unicode\": \"e713\",\n      \"unicode_decimal\": 59155\n    },\n    {\n      \"icon_id\": \"344978\",\n      \"name\": \"download\",\n      \"font_class\": \"icondownload\",\n      \"unicode\": \"e714\",\n      \"unicode_decimal\": 59156\n    },\n    {\n      \"icon_id\": \"364801\",\n      \"name\": \"map\",\n      \"font_class\": \"map\",\n      \"unicode\": \"e715\",\n      \"unicode_decimal\": 59157\n    },\n    {\n      \"icon_id\": \"401293\",\n      \"name\": \"bad\",\n      \"font_class\": \"bad\",\n      \"unicode\": \"e716\",\n      \"unicode_decimal\": 59158\n    },\n    {\n      \"icon_id\": \"401294\",\n      \"name\": \"good\",\n      \"font_class\": \"good\",\n      \"unicode\": \"e717\",\n      \"unicode_decimal\": 59159\n    },\n    {\n      \"icon_id\": \"401307\",\n      \"name\": \"skip\",\n      \"font_class\": \"skip\",\n      \"unicode\": \"e718\",\n      \"unicode_decimal\": 59160\n    },\n    {\n      \"icon_id\": \"415771\",\n      \"name\": \"play\",\n      \"font_class\": \"iconfontplay2\",\n      \"unicode\": \"e719\",\n      \"unicode_decimal\": 59161\n    },\n    {\n      \"icon_id\": \"424338\",\n      \"name\": \"stop\",\n      \"font_class\": \"iconfontstop\",\n      \"unicode\": \"e71a\",\n      \"unicode_decimal\": 59162\n    },\n    {\n      \"icon_id\": \"428474\",\n      \"name\": \"compass\",\n      \"font_class\": \"compass\",\n      \"unicode\": \"e71b\",\n      \"unicode_decimal\": 59163\n    },\n    {\n      \"icon_id\": \"428475\",\n      \"name\": \"security\",\n      \"font_class\": \"security\",\n      \"unicode\": \"e71c\",\n      \"unicode_decimal\": 59164\n    },\n    {\n      \"icon_id\": \"428864\",\n      \"name\": \"share\",\n      \"font_class\": \"share\",\n      \"unicode\": \"e71d\",\n      \"unicode_decimal\": 59165\n    },\n    {\n      \"icon_id\": \"437515\",\n      \"name\": \"store\",\n      \"font_class\": \"store\",\n      \"unicode\": \"e722\",\n      \"unicode_decimal\": 59170\n    },\n    {\n      \"icon_id\": \"437516\",\n      \"name\": \"manage-order\",\n      \"font_class\": \"manageorder\",\n      \"unicode\": \"e723\",\n      \"unicode_decimal\": 59171\n    },\n    {\n      \"icon_id\": \"437517\",\n      \"name\": \"rejected-order\",\n      \"font_class\": \"rejectedorder\",\n      \"unicode\": \"e724\",\n      \"unicode_decimal\": 59172\n    },\n    {\n      \"icon_id\": \"437518\",\n      \"name\": \"phone\",\n      \"font_class\": \"phone\",\n      \"unicode\": \"e725\",\n      \"unicode_decimal\": 59173\n    },\n    {\n      \"icon_id\": \"437519\",\n      \"name\": \"bussiness-man\",\n      \"font_class\": \"bussinessman\",\n      \"unicode\": \"e726\",\n      \"unicode_decimal\": 59174\n    },\n    {\n      \"icon_id\": \"460122\",\n      \"name\": \"shoes\",\n      \"font_class\": \"shoes\",\n      \"unicode\": \"e728\",\n      \"unicode_decimal\": 59176\n    },\n    {\n      \"icon_id\": \"462212\",\n      \"name\": \"Mobile-phone\",\n      \"font_class\": \"mobilephone\",\n      \"unicode\": \"e72a\",\n      \"unicode_decimal\": 59178\n    },\n    {\n      \"icon_id\": \"520450\",\n      \"name\": \"email-filling\",\n      \"font_class\": \"emailfilling\",\n      \"unicode\": \"e72d\",\n      \"unicode_decimal\": 59181\n    },\n    {\n      \"icon_id\": \"520551\",\n      \"name\": \"favorites-filling\",\n      \"font_class\": \"favoritesfilling\",\n      \"unicode\": \"e730\",\n      \"unicode_decimal\": 59184\n    },\n    {\n      \"icon_id\": \"520737\",\n      \"name\": \"account-filling\",\n      \"font_class\": \"accountfilling\",\n      \"unicode\": \"e732\",\n      \"unicode_decimal\": 59186\n    },\n    {\n      \"icon_id\": \"543965\",\n      \"name\": \"credit-level\",\n      \"font_class\": \"creditlevel\",\n      \"unicode\": \"e735\",\n      \"unicode_decimal\": 59189\n    },\n    {\n      \"icon_id\": \"543966\",\n      \"name\": \"credit-level-filling\",\n      \"font_class\": \"creditlevelfilling\",\n      \"unicode\": \"e736\",\n      \"unicode_decimal\": 59190\n    },\n    {\n      \"icon_id\": \"622430\",\n      \"name\": \"exl\",\n      \"font_class\": \"exl\",\n      \"unicode\": \"e73f\",\n      \"unicode_decimal\": 59199\n    },\n    {\n      \"icon_id\": \"622431\",\n      \"name\": \"pdf\",\n      \"font_class\": \"pdf\",\n      \"unicode\": \"e740\",\n      \"unicode_decimal\": 59200\n    },\n    {\n      \"icon_id\": \"622432\",\n      \"name\": \"zip\",\n      \"font_class\": \"zip\",\n      \"unicode\": \"e741\",\n      \"unicode_decimal\": 59201\n    },\n    {\n      \"icon_id\": \"627893\",\n      \"name\": \"sorting\",\n      \"font_class\": \"sorting\",\n      \"unicode\": \"e743\",\n      \"unicode_decimal\": 59203\n    },\n    {\n      \"icon_id\": \"657583\",\n      \"name\": \"copy\",\n      \"font_class\": \"copy\",\n      \"unicode\": \"e744\",\n      \"unicode_decimal\": 59204\n    },\n    {\n      \"icon_id\": \"710085\",\n      \"name\": \"save\",\n      \"font_class\": \"save\",\n      \"unicode\": \"e747\",\n      \"unicode_decimal\": 59207\n    },\n    {\n      \"icon_id\": \"710249\",\n      \"name\": \" inquiry-template\",\n      \"font_class\": \"inquirytemplate\",\n      \"unicode\": \"e749\",\n      \"unicode_decimal\": 59209\n    },\n    {\n      \"icon_id\": \"710408\",\n      \"name\": \"template-default\",\n      \"font_class\": \"templatedefault\",\n      \"unicode\": \"e74a\",\n      \"unicode_decimal\": 59210\n    },\n    {\n      \"icon_id\": \"856292\",\n      \"name\": \"libra\",\n      \"font_class\": \"libra\",\n      \"unicode\": \"e74c\",\n      \"unicode_decimal\": 59212\n    },\n    {\n      \"icon_id\": \"874681\",\n      \"name\": \"survey\",\n      \"font_class\": \"survey1\",\n      \"unicode\": \"e74e\",\n      \"unicode_decimal\": 59214\n    },\n    {\n      \"icon_id\": \"933540\",\n      \"name\": \"ship\",\n      \"font_class\": \"ship\",\n      \"unicode\": \"e74f\",\n      \"unicode_decimal\": 59215\n    },\n    {\n      \"icon_id\": \"1033916\",\n      \"name\": \"bussiness-card\",\n      \"font_class\": \"bussinesscard\",\n      \"unicode\": \"e753\",\n      \"unicode_decimal\": 59219\n    },\n    {\n      \"icon_id\": \"1036414\",\n      \"name\": \"hot\",\n      \"font_class\": \"hot\",\n      \"unicode\": \"e756\",\n      \"unicode_decimal\": 59222\n    },\n    {\n      \"icon_id\": \"1099498\",\n      \"name\": \"data\",\n      \"font_class\": \"data\",\n      \"unicode\": \"e757\",\n      \"unicode_decimal\": 59223\n    },\n    {\n      \"icon_id\": \"1099499\",\n      \"name\": \"trade\",\n      \"font_class\": \"trade\",\n      \"unicode\": \"e758\",\n      \"unicode_decimal\": 59224\n    },\n    {\n      \"icon_id\": \"1103888\",\n      \"name\": \"onepage\",\n      \"font_class\": \"onepage48\",\n      \"unicode\": \"e75a\",\n      \"unicode_decimal\": 59226\n    },\n    {\n      \"icon_id\": \"1389511\",\n      \"name\": \"signboard\",\n      \"font_class\": \"signboard\",\n      \"unicode\": \"e75c\",\n      \"unicode_decimal\": 59228\n    },\n    {\n      \"icon_id\": \"1389513\",\n      \"name\": \"shuffling-banner\",\n      \"font_class\": \"shuffling-banner\",\n      \"unicode\": \"e75e\",\n      \"unicode_decimal\": 59230\n    },\n    {\n      \"icon_id\": \"1389514\",\n      \"name\": \"component\",\n      \"font_class\": \"component\",\n      \"unicode\": \"e75f\",\n      \"unicode_decimal\": 59231\n    },\n    {\n      \"icon_id\": \"1389516\",\n      \"name\": \"component-filling\",\n      \"font_class\": \"component-filling\",\n      \"unicode\": \"e760\",\n      \"unicode_decimal\": 59232\n    },\n    {\n      \"icon_id\": \"1389605\",\n      \"name\": \"color\",\n      \"font_class\": \"color\",\n      \"unicode\": \"e761\",\n      \"unicode_decimal\": 59233\n    },\n    {\n      \"icon_id\": \"1416446\",\n      \"name\": \"color-filling\",\n      \"font_class\": \"color-filling\",\n      \"unicode\": \"e7cd\",\n      \"unicode_decimal\": 59341\n    },\n    {\n      \"icon_id\": \"1450549\",\n      \"name\": \"favorites\",\n      \"font_class\": \"favorites\",\n      \"unicode\": \"e7ce\",\n      \"unicode_decimal\": 59342\n    },\n    {\n      \"icon_id\": \"1489999\",\n      \"name\": \"pic-filling\",\n      \"font_class\": \"pic-filling\",\n      \"unicode\": \"e802\",\n      \"unicode_decimal\": 59394\n    },\n    {\n      \"icon_id\": \"1491901\",\n      \"name\": \"RFQ\",\n      \"font_class\": \"RFQ\",\n      \"unicode\": \"e803\",\n      \"unicode_decimal\": 59395\n    },\n    {\n      \"icon_id\": \"1491902\",\n      \"name\": \"RFQ-filling\",\n      \"font_class\": \"RFQ-filling\",\n      \"unicode\": \"e804\",\n      \"unicode_decimal\": 59396\n    },\n    {\n      \"icon_id\": \"1519161\",\n      \"name\": \"original-image\",\n      \"font_class\": \"originalimage\",\n      \"unicode\": \"e806\",\n      \"unicode_decimal\": 59398\n    },\n    {\n      \"icon_id\": \"1573888\",\n      \"name\": \"logistic\",\n      \"font_class\": \"logistic\",\n      \"unicode\": \"e811\",\n      \"unicode_decimal\": 59409\n    },\n    {\n      \"icon_id\": \"1586166\",\n      \"name\": \"Calculator\",\n      \"font_class\": \"Calculator\",\n      \"unicode\": \"e812\",\n      \"unicode_decimal\": 59410\n    },\n    {\n      \"icon_id\": \"1937963\",\n      \"name\": \"video\",\n      \"font_class\": \"video\",\n      \"unicode\": \"e820\",\n      \"unicode_decimal\": 59424\n    },\n    {\n      \"icon_id\": \"1979955\",\n      \"name\": \"earth\",\n      \"font_class\": \"earth\",\n      \"unicode\": \"e828\",\n      \"unicode_decimal\": 59432\n    },\n    {\n      \"icon_id\": \"1988626\",\n      \"name\": \"task-management\",\n      \"font_class\": \"task-management\",\n      \"unicode\": \"e829\",\n      \"unicode_decimal\": 59433\n    },\n    {\n      \"icon_id\": \"1991485\",\n      \"name\": \"trust\",\n      \"font_class\": \"trust\",\n      \"unicode\": \"e82a\",\n      \"unicode_decimal\": 59434\n    },\n    {\n      \"icon_id\": \"2093026\",\n      \"name\": \"password\",\n      \"font_class\": \"password\",\n      \"unicode\": \"e82b\",\n      \"unicode_decimal\": 59435\n    },\n    {\n      \"icon_id\": \"2273341\",\n      \"name\": \"3column\",\n      \"font_class\": \"column\",\n      \"unicode\": \"e839\",\n      \"unicode_decimal\": 59449\n    },\n    {\n      \"icon_id\": \"2273342\",\n      \"name\": \"apparel\",\n      \"font_class\": \"apparel\",\n      \"unicode\": \"e83a\",\n      \"unicode_decimal\": 59450\n    },\n    {\n      \"icon_id\": \"2273344\",\n      \"name\": \"bags\",\n      \"font_class\": \"bags\",\n      \"unicode\": \"e83b\",\n      \"unicode_decimal\": 59451\n    },\n    {\n      \"icon_id\": \"2273372\",\n      \"name\": \"folder\",\n      \"font_class\": \"folder\",\n      \"unicode\": \"e83c\",\n      \"unicode_decimal\": 59452\n    },\n    {\n      \"icon_id\": \"2273412\",\n      \"name\": \"4column\",\n      \"font_class\": \"column1\",\n      \"unicode\": \"e83d\",\n      \"unicode_decimal\": 59453\n    },\n    {\n      \"icon_id\": \"2357626\",\n      \"name\": \"code\",\n      \"font_class\": \"code\",\n      \"unicode\": \"e842\",\n      \"unicode_decimal\": 59458\n    },\n    {\n      \"icon_id\": \"2364342\",\n      \"name\": \"RFQ-filling\",\n      \"font_class\": \"RFQ-filling1\",\n      \"unicode\": \"e843\",\n      \"unicode_decimal\": 59459\n    },\n    {\n      \"icon_id\": \"2670451\",\n      \"name\": \"customs-clearance\",\n      \"font_class\": \"customs-clearance\",\n      \"unicode\": \"e863\",\n      \"unicode_decimal\": 59491\n    },\n    {\n      \"icon_id\": \"2954833\",\n      \"name\": \"good-filling\",\n      \"font_class\": \"good-filling\",\n      \"unicode\": \"e866\",\n      \"unicode_decimal\": 59494\n    },\n    {\n      \"icon_id\": \"3583597\",\n      \"name\": \"camera\",\n      \"font_class\": \"camera\",\n      \"unicode\": \"e86e\",\n      \"unicode_decimal\": 59502\n    },\n    {\n      \"icon_id\": \"5203487\",\n      \"name\": \"pin-fill\",\n      \"font_class\": \"pin-fill\",\n      \"unicode\": \"e87a\",\n      \"unicode_decimal\": 59514\n    },\n    {\n      \"icon_id\": \"5203488\",\n      \"name\": \"help-fill\",\n      \"font_class\": \"help-fill\",\n      \"unicode\": \"e87b\",\n      \"unicode_decimal\": 59515\n    },\n    {\n      \"icon_id\": \"5203489\",\n      \"name\": \"add-account\",\n      \"font_class\": \"add-account\",\n      \"unicode\": \"e87c\",\n      \"unicode_decimal\": 59516\n    },\n    {\n      \"icon_id\": \"5799945\",\n      \"name\": \"listing-content\",\n      \"font_class\": \"listing-content\",\n      \"unicode\": \"e87d\",\n      \"unicode_decimal\": 59517\n    },\n    {\n      \"icon_id\": \"5799946\",\n      \"name\": \"warehouse-delivery \",\n      \"font_class\": \"warehouse-delivery\",\n      \"unicode\": \"e87e\",\n      \"unicode_decimal\": 59518\n    },\n    {\n      \"icon_id\": \"5799947\",\n      \"name\": \"customization\",\n      \"font_class\": \"customization\",\n      \"unicode\": \"e87f\",\n      \"unicode_decimal\": 59519\n    },\n    {\n      \"icon_id\": \"5799948\",\n      \"name\": \"inspection\",\n      \"font_class\": \"inspection\",\n      \"unicode\": \"e880\",\n      \"unicode_decimal\": 59520\n    },\n    {\n      \"icon_id\": \"5799949\",\n      \"name\": \"packing-labeling \",\n      \"font_class\": \"packing-labeling\",\n      \"unicode\": \"e881\",\n      \"unicode_decimal\": 59521\n    },\n    {\n      \"icon_id\": \"5799950\",\n      \"name\": \"online-tracking\",\n      \"font_class\": \"online-tracking\",\n      \"unicode\": \"e882\",\n      \"unicode_decimal\": 59522\n    },\n    {\n      \"icon_id\": \"5973112\",\n      \"name\": \"play-filling\",\n      \"font_class\": \"play-filling\",\n      \"unicode\": \"e883\",\n      \"unicode_decimal\": 59523\n    },\n    {\n      \"icon_id\": \"5973113\",\n      \"name\": \"nosound-filling\",\n      \"font_class\": \"nosound-filling\",\n      \"unicode\": \"e884\",\n      \"unicode_decimal\": 59524\n    },\n    {\n      \"icon_id\": \"5973114\",\n      \"name\": \"sound-filling\",\n      \"font_class\": \"sound-filling\",\n      \"unicode\": \"e885\",\n      \"unicode_decimal\": 59525\n    },\n    {\n      \"icon_id\": \"7711442\",\n      \"name\": \"electrical-equipment\",\n      \"font_class\": \"electrical-equipment\",\n      \"unicode\": \"e886\",\n      \"unicode_decimal\": 59526\n    },\n    {\n      \"icon_id\": \"7711443\",\n      \"name\": \"home-appliances\",\n      \"font_class\": \"home-appliances\",\n      \"unicode\": \"e887\",\n      \"unicode_decimal\": 59527\n    },\n    {\n      \"icon_id\": \"7711444\",\n      \"name\": \"furniture\",\n      \"font_class\": \"furniture\",\n      \"unicode\": \"e888\",\n      \"unicode_decimal\": 59528\n    },\n    {\n      \"icon_id\": \"7711445\",\n      \"name\": \"fashion-accessories\",\n      \"font_class\": \"fashion-accessories\",\n      \"unicode\": \"e889\",\n      \"unicode_decimal\": 59529\n    },\n    {\n      \"icon_id\": \"7711446\",\n      \"name\": \"security-protection\",\n      \"font_class\": \"security-protection\",\n      \"unicode\": \"e88a\",\n      \"unicode_decimal\": 59530\n    },\n    {\n      \"icon_id\": \"7711447\",\n      \"name\": \"textile-products\",\n      \"font_class\": \"textile-products\",\n      \"unicode\": \"e88b\",\n      \"unicode_decimal\": 59531\n    },\n    {\n      \"icon_id\": \"7711448\",\n      \"name\": \"tools-hardware\",\n      \"font_class\": \"tools-hardware\",\n      \"unicode\": \"e88c\",\n      \"unicode_decimal\": 59532\n    },\n    {\n      \"icon_id\": \"7711449\",\n      \"name\": \"office-supplies\",\n      \"font_class\": \"office-supplies\",\n      \"unicode\": \"e88d\",\n      \"unicode_decimal\": 59533\n    },\n    {\n      \"icon_id\": \"7711450\",\n      \"name\": \"vehicles\",\n      \"font_class\": \"vehicles\",\n      \"unicode\": \"e88e\",\n      \"unicode_decimal\": 59534\n    },\n    {\n      \"icon_id\": \"122687\",\n      \"name\": \"all\",\n      \"font_class\": \"all\",\n      \"unicode\": \"e696\",\n      \"unicode_decimal\": 59030\n    },\n    {\n      \"icon_id\": \"122688\",\n      \"name\": \"back\",\n      \"font_class\": \"back\",\n      \"unicode\": \"e697\",\n      \"unicode_decimal\": 59031\n    },\n    {\n      \"icon_id\": \"122689\",\n      \"name\": \"cart\",\n      \"font_class\": \"cart\",\n      \"unicode\": \"e698\",\n      \"unicode_decimal\": 59032\n    },\n    {\n      \"icon_id\": \"122690\",\n      \"name\": \"Category\",\n      \"font_class\": \"category\",\n      \"unicode\": \"e699\",\n      \"unicode_decimal\": 59033\n    },\n    {\n      \"icon_id\": \"122691\",\n      \"name\": \"close\",\n      \"font_class\": \"close\",\n      \"unicode\": \"e69a\",\n      \"unicode_decimal\": 59034\n    },\n    {\n      \"icon_id\": \"122692\",\n      \"name\": \"comments\",\n      \"font_class\": \"comments\",\n      \"unicode\": \"e69b\",\n      \"unicode_decimal\": 59035\n    },\n    {\n      \"icon_id\": \"122693\",\n      \"name\": \"cry\",\n      \"font_class\": \"cry\",\n      \"unicode\": \"e69c\",\n      \"unicode_decimal\": 59036\n    },\n    {\n      \"icon_id\": \"122694\",\n      \"name\": \"delete\",\n      \"font_class\": \"delete\",\n      \"unicode\": \"e69d\",\n      \"unicode_decimal\": 59037\n    },\n    {\n      \"icon_id\": \"122695\",\n      \"name\": \"edit\",\n      \"font_class\": \"edit\",\n      \"unicode\": \"e69e\",\n      \"unicode_decimal\": 59038\n    },\n    {\n      \"icon_id\": \"122696\",\n      \"name\": \"email\",\n      \"font_class\": \"email\",\n      \"unicode\": \"e69f\",\n      \"unicode_decimal\": 59039\n    },\n    {\n      \"icon_id\": \"122697\",\n      \"name\": \"favorite\",\n      \"font_class\": \"favorite\",\n      \"unicode\": \"e6a0\",\n      \"unicode_decimal\": 59040\n    },\n    {\n      \"icon_id\": \"122699\",\n      \"name\": \"form\",\n      \"font_class\": \"form\",\n      \"unicode\": \"e6a2\",\n      \"unicode_decimal\": 59042\n    },\n    {\n      \"icon_id\": \"122700\",\n      \"name\": \"help\",\n      \"font_class\": \"help\",\n      \"unicode\": \"e6a3\",\n      \"unicode_decimal\": 59043\n    },\n    {\n      \"icon_id\": \"122701\",\n      \"name\": \"information\",\n      \"font_class\": \"information\",\n      \"unicode\": \"e6a4\",\n      \"unicode_decimal\": 59044\n    },\n    {\n      \"icon_id\": \"122702\",\n      \"name\": \"less\",\n      \"font_class\": \"less\",\n      \"unicode\": \"e6a5\",\n      \"unicode_decimal\": 59045\n    },\n    {\n      \"icon_id\": \"122703\",\n      \"name\": \"more_unfold\",\n      \"font_class\": \"moreunfold\",\n      \"unicode\": \"e6a6\",\n      \"unicode_decimal\": 59046\n    },\n    {\n      \"icon_id\": \"122704\",\n      \"name\": \"more\",\n      \"font_class\": \"more\",\n      \"unicode\": \"e6a7\",\n      \"unicode_decimal\": 59047\n    },\n    {\n      \"icon_id\": \"122705\",\n      \"name\": \"pic\",\n      \"font_class\": \"pic\",\n      \"unicode\": \"e6a8\",\n      \"unicode_decimal\": 59048\n    },\n    {\n      \"icon_id\": \"122706\",\n      \"name\": \"QRCode\",\n      \"font_class\": \"qrcode\",\n      \"unicode\": \"e6a9\",\n      \"unicode_decimal\": 59049\n    },\n    {\n      \"icon_id\": \"122707\",\n      \"name\": \"refresh\",\n      \"font_class\": \"refresh\",\n      \"unicode\": \"e6aa\",\n      \"unicode_decimal\": 59050\n    },\n    {\n      \"icon_id\": \"122708\",\n      \"name\": \"RFQ\",\n      \"font_class\": \"rfq\",\n      \"unicode\": \"e6ab\",\n      \"unicode_decimal\": 59051\n    },\n    {\n      \"icon_id\": \"122709\",\n      \"name\": \"search\",\n      \"font_class\": \"search\",\n      \"unicode\": \"e6ac\",\n      \"unicode_decimal\": 59052\n    },\n    {\n      \"icon_id\": \"122710\",\n      \"name\": \"selected\",\n      \"font_class\": \"selected\",\n      \"unicode\": \"e6ad\",\n      \"unicode_decimal\": 59053\n    },\n    {\n      \"icon_id\": \"122711\",\n      \"name\": \"set\",\n      \"font_class\": \"set\",\n      \"unicode\": \"e6ae\",\n      \"unicode_decimal\": 59054\n    },\n    {\n      \"icon_id\": \"122712\",\n      \"name\": \"Smile\",\n      \"font_class\": \"smile\",\n      \"unicode\": \"e6af\",\n      \"unicode_decimal\": 59055\n    },\n    {\n      \"icon_id\": \"122714\",\n      \"name\": \"success\",\n      \"font_class\": \"success\",\n      \"unicode\": \"e6b1\",\n      \"unicode_decimal\": 59057\n    },\n    {\n      \"icon_id\": \"122715\",\n      \"name\": \"survey\",\n      \"font_class\": \"survey\",\n      \"unicode\": \"e6b2\",\n      \"unicode_decimal\": 59058\n    },\n    {\n      \"icon_id\": \"122716\",\n      \"name\": \"training\",\n      \"font_class\": \"training\",\n      \"unicode\": \"e6b3\",\n      \"unicode_decimal\": 59059\n    },\n    {\n      \"icon_id\": \"122717\",\n      \"name\": \"ViewGallery\",\n      \"font_class\": \"viewgallery\",\n      \"unicode\": \"e6b4\",\n      \"unicode_decimal\": 59060\n    },\n    {\n      \"icon_id\": \"122718\",\n      \"name\": \"Viewlist\",\n      \"font_class\": \"viewlist\",\n      \"unicode\": \"e6b5\",\n      \"unicode_decimal\": 59061\n    },\n    {\n      \"icon_id\": \"122719\",\n      \"name\": \"warning\",\n      \"font_class\": \"warning\",\n      \"unicode\": \"e6b6\",\n      \"unicode_decimal\": 59062\n    },\n    {\n      \"icon_id\": \"122720\",\n      \"name\": \"wrong\",\n      \"font_class\": \"wrong\",\n      \"unicode\": \"e6b7\",\n      \"unicode_decimal\": 59063\n    },\n    {\n      \"icon_id\": \"122721\",\n      \"name\": \"account\",\n      \"font_class\": \"account\",\n      \"unicode\": \"e6b8\",\n      \"unicode_decimal\": 59064\n    },\n    {\n      \"icon_id\": \"122722\",\n      \"name\": \"add\",\n      \"font_class\": \"add\",\n      \"unicode\": \"e6b9\",\n      \"unicode_decimal\": 59065\n    },\n    {\n      \"icon_id\": \"122723\",\n      \"name\": \"atm\",\n      \"font_class\": \"atm\",\n      \"unicode\": \"e6ba\",\n      \"unicode_decimal\": 59066\n    },\n    {\n      \"icon_id\": \"135538\",\n      \"name\": \"clock\",\n      \"font_class\": \"clock\",\n      \"unicode\": \"e6bb\",\n      \"unicode_decimal\": 59067\n    },\n    {\n      \"icon_id\": \"135539\",\n      \"name\": \"remind\",\n      \"font_class\": \"remind\",\n      \"unicode\": \"e6bc\",\n      \"unicode_decimal\": 59068\n    },\n    {\n      \"icon_id\": \"146465\",\n      \"name\": \"calendar\",\n      \"font_class\": \"calendar\",\n      \"unicode\": \"e6bf\",\n      \"unicode_decimal\": 59071\n    },\n    {\n      \"icon_id\": \"186635\",\n      \"name\": \"attachment\",\n      \"font_class\": \"attachment\",\n      \"unicode\": \"e6c0\",\n      \"unicode_decimal\": 59072\n    },\n    {\n      \"icon_id\": \"204017\",\n      \"name\": \"discount\",\n      \"font_class\": \"discount\",\n      \"unicode\": \"e6c5\",\n      \"unicode_decimal\": 59077\n    },\n    {\n      \"icon_id\": \"208895\",\n      \"name\": \"service\",\n      \"font_class\": \"service\",\n      \"unicode\": \"e6c7\",\n      \"unicode_decimal\": 59079\n    },\n    {\n      \"icon_id\": \"208936\",\n      \"name\": \"print\",\n      \"font_class\": \"print\",\n      \"unicode\": \"e6c9\",\n      \"unicode_decimal\": 59081\n    },\n    {\n      \"icon_id\": \"211390\",\n      \"name\": \"box\",\n      \"font_class\": \"box\",\n      \"unicode\": \"e6cb\",\n      \"unicode_decimal\": 59083\n    },\n    {\n      \"icon_id\": \"211433\",\n      \"name\": \"process\",\n      \"font_class\": \"process\",\n      \"unicode\": \"e6ce\",\n      \"unicode_decimal\": 59086\n    },\n    {\n      \"icon_id\": \"212371\",\n      \"name\": \"beauty\",\n      \"font_class\": \"beauty\",\n      \"unicode\": \"e6d2\",\n      \"unicode_decimal\": 59090\n    }\n  ]\n}\n"
  },
  {
    "path": "app/admin/t/tpl/style/js/target_page.js",
    "content": "\n/*弹出层*/\n/*\n    参数解释：\n    title   标题\n    url     请求的url\n    id      需要操作的数据id\n    w       弹出层宽度（缺省调默认值）\n    h       弹出层高度（缺省调默认值）\n*/\nfunction x_admin_show(title,url,w,h){\n   window.location.href=url;\n\t\n}\n\nfunction x_top_show(title,url,w,h){\n   window.location.href=url;\n\t\n}\n\n\n\n\n"
  },
  {
    "path": "app/admin/t/tpl/style/js/target_window.js",
    "content": "\n/*弹出层*/\n/*\n    参数解释：\n    title   标题\n    url     请求的url\n    id      需要操作的数据id\n    w       弹出层宽度（缺省调默认值）\n    h       弹出层高度（缺省调默认值）\n*/\nfunction x_admin_show(title,url,w,h){\n    if (title == null || title == '') {\n        title=false;\n    };\n    if (url == null || url == '') {\n        url=\"404.html\";\n    };\n    if (w == null || w == '') {\n        w=($(window).width()*0.9);\n    };\n    if (h == null || h == '') {\n        h=($(window).height() - 50);\n    };\n\t//window.location.href=url;return false;\n    layer.open({\n        type: 2,\n        area: [w+'px', h +'px'],\n        fix: false, //不固定\n        maxmin: true,\n        shadeClose: false,\n        shade:0.4,\n        title: title,\n        content: url\n    });\n\t\n}\n\n\nfunction x_top_show(title,url,w,h){\n    if (title == null || title == '') {\n        title=false;\n    };\n    if (url == null || url == '') {\n        url=\"404.html\";\n    };\n    if (w == null || w == '') {\n        w=($(window).width()*0.9);\n    };\n    if (h == null || h == '') {\n        h=($(window).height() - 50);\n    };\n\t//window.location.href=url;return false;\n    layer.open({\n        type: 2,\n        area: [w+'px', h +'px'],\n        fix: false, //不固定\n        maxmin: true,\n        shadeClose: false,\n        shade:0.4,\n        title: title,\n        content: url\n    });\n\t\n}\n"
  },
  {
    "path": "app/admin/t/tpl/style/js/xadmin.js",
    "content": "$(function () {\r\n    //加载弹出层\r\n    layui.use(['form','element'],\r\n    function() {\r\n        layer = layui.layer;\r\n        element = layui.element;\r\n    });\r\n\r\n    //触发事件\r\n  var tab = {\r\n        tabAdd: function(title,url,id){\r\n          //新增一个Tab项\r\n          element.tabAdd('xbs_tab', {\r\n            title: title \r\n            ,content: '<iframe tab-id=\"'+id+'\" frameborder=\"0\" src=\"'+url+'\" scrolling=\"auto\" class=\"x-iframe\"></iframe>'\r\n            ,id: id\r\n          })\r\n        }\r\n        ,tabDelete: function(othis){\r\n           element.tabDelete('xbs_tab',othis);\r\n        }\r\n        ,tabChange: function(id){\r\n          //切换到指定Tab项\r\n          element.tabChange('xbs_tab', id); //切换到：用户管理\r\n        }\r\n        ,closeother: function() {  \r\n            $('.layui-tab-title li').each(function(i,el){\r\n              var id = $(el).attr('lay-id');\r\n              if(!$(this).hasClass('layui-this') && id!=''){\r\n                element.tabDelete('xbs_tab', id);\r\n              }\r\n               \r\n            });\r\n          \r\n        }\r\n        ,closeall: function(t) {  \r\n             $('.layui-tab-title li').each(function(){\r\n                var id = parseInt($(this).attr('lay-id'));\r\n                if(id>0){\r\n                    element.tabDelete('xbs_tab', id);\r\n                }\r\n\r\n             })\r\n             $('.layui-tab-title li').eq(0).addClass('layui-this');            \r\n          },\r\n      };\r\n\r\n\r\n    tableCheck = {\r\n        init:function  () {\r\n            $(document).on(\"click\",\".header.layui-form-checkbox,.x-cate .layui-form-checkbox\",function(){\r\n                if($(this).hasClass('layui-form-checked')){\r\n                    $(this).removeClass('layui-form-checked');\r\n                    if($(this).hasClass('header')){\r\n                        $(\".layui-form-checkbox\").removeClass('layui-form-checked');\r\n                    }\r\n                }else{\r\n                    $(this).addClass('layui-form-checked');\r\n                    if($(this).hasClass('header')){\r\n                        $(\".layui-form-checkbox\").addClass('layui-form-checked');\r\n                    }\r\n                }\r\n        \r\n            })\r\n        },\r\n        getData:function  () {\r\n            var obj = $(\".layui-form-checked\").not('.header');\r\n            var arr=[];\r\n            obj.each(function(index, el) {\r\n                arr.push(obj.eq(index).attr('data-id'));\r\n            });\r\n            return arr;\r\n        }\r\n\t\t\r\n    }\r\n\r\n    //开启表格多选\r\n    tableCheck.init();\r\n      \r\n\r\n    $('.container .left_open i').click(function(event) {\r\n        if($('.left-nav').css('left')=='0px'){\r\n            $('.left-nav').animate({left: '-200px'}, 100);\r\n            $('.page-content').animate({left: '0px'}, 100);\r\n            $('.page-content-bg').hide();\r\n        }else{\r\n            $('.left-nav').animate({left: '0px'}, 100);\r\n            $('.page-content').animate({left: '200px'}, 100);\r\n            if($(window).width()<768){\r\n                $('.page-content-bg').show();\r\n            }\r\n        }\r\n\r\n    });\r\n\r\n    $('.page-content-bg').click(function(event) {\r\n        $('.left-nav').animate({left: '-221px'}, 100);\r\n        $('.page-content').animate({left: '0px'}, 100);\r\n        $(this).hide();\r\n    });\r\n\r\n    $('.layui-tab-close').click(function(event) {\r\n        $('.layui-tab-title li').eq(0).find('i').remove();\r\n    });\r\n\r\n   //$(\"tbody.x-cate tr[fid!='0']\").hide();\r\n    // 栏目多级显示效果\r\n    $(document).on(\"click\",\".x-show\",function(){\r\n\r\n        if($(this).attr('status')=='true'){\r\n            $(this).html('&#xe625;');\r\n            $(this).attr('status','false');\r\n            cateId = $(this).parents('tr').attr('cate-id');\r\n            $(\"tbody tr[fid=\"+cateId+\"]\").show();\r\n        }else{\r\n            cateIds = [];\r\n            $(this).html('&#xe623;');\r\n            $(this).attr('status','true');\r\n            cateId = $(this).parents('tr').attr('cate-id');\r\n            getCateId(cateId);\r\n            for (var i in cateIds) {\r\n                $(\"tbody tr[cate-id=\"+cateIds[i]+\"]\").hide().find('.x-show').html('&#xe623;').attr('status','true');\r\n            }\r\n        }\r\n    })\r\n\r\n    //左侧菜单效果\r\n    // $('#content').bind(\"click\",function(event){\r\n    $('.left-nav #nav li').click(function (event) {\r\n\r\n        if($(this).children('.sub-menu').length){\r\n            if($(this).hasClass('open')){\r\n                $(this).removeClass('open');\r\n                $(this).find('.nav_right').html('&#xe6a7;');\r\n                $(this).children('.sub-menu').stop().slideUp();\r\n                $(this).siblings().children('.sub-menu').slideUp();\r\n            }else{\r\n                $(this).addClass('open');\r\n                $(this).children('a').find('.nav_right').html('&#xe6a6;');\r\n                $(this).children('.sub-menu').stop().slideDown();\r\n                $(this).siblings().children('.sub-menu').stop().slideUp();\r\n                $(this).siblings().find('.nav_right').html('&#xe6a7;');\r\n                $(this).siblings().removeClass('open');\r\n            }\r\n        }else{\r\n\r\n            var url = $(this).children('a').attr('_href');\r\n            var title = $(this).find('a').html();\r\n            var index  = $('.left-nav #nav li').index($(this));\r\n            if($(this).parents().hasClass('sub-menu')){\r\n                $(\"ul.sub-menu li\").removeClass('current');\r\n                $(this).addClass('current');\r\n            }\r\n            for (var i = 0; i <$('.x-iframe').length; i++) {\r\n                if($('.x-iframe').eq(i).attr('tab-id')==index+1){\r\n                    tab.tabChange(index+1);\r\n                    event.stopPropagation();\r\n\t\t\t\t\t$('.x-iframe').eq(i).attr(\"src\",$('.x-iframe').eq(i).attr('src'));\r\n                    return;\r\n                }\r\n            };\r\n            \r\n            tab.tabAdd(title,url,index+1);\r\n            tab.tabChange(index+1);\r\n        }\r\n       \r\n        event.stopPropagation();\r\n         CustomRightClick();\r\n         \r\n    })\r\n  \r\n  \r\n   \r\n   $('a.top_nav').click(function (event) {\r\n     \t    var url = $(this).attr('x_href');\r\n            var title =$(this).html();\r\n            var left_index  = $('.left-nav #nav li').length;\r\n\t\t\tvar top_index = $('a.top_nav').length;\r\n\t\t\tvar right_index = $('a.top_nav_right').length;\r\n\t\t\tvar own_index = $(\"dd.top-nav\").index($(this).parent())+$(this).parent().parent().parent().index();\r\n\t\t\tvar all_index = left_index+own_index+top_index+right_index;\r\n            for (var i = 0; i <$('.x-iframe').length; i++) {\r\n                if($('.x-iframe').eq(i).attr('tab-id')==(all_index+1)){\r\n                    tab.tabChange(all_index+1);\r\n                    event.stopPropagation();\r\n\t\t\t\t\t$('.x-iframe').eq(i).attr(\"src\",url);\r\n                    return;\r\n                }\r\n            };\r\n            \r\n            tab.tabAdd(title,url,all_index+1);\r\n            tab.tabChange(all_index+1);\r\n     \t\tevent.stopPropagation();\r\n            CustomRightClick();\r\n   })\r\n   $('a.top_nav_right').click(function (event) {\r\n     \t    var url = $(this).attr('x_href');\r\n            var title =$(this).text();\r\n            var left_index  = $('.left-nav #nav li').length;\r\n\t\t\tvar top_index = $('a.top_nav').length;\r\n\t\t\tvar right_index = $('a.top_nav_right').length;\r\n\t\t\tvar own_index = $(this).index();\r\n\t\t\tvar all_index = left_index+own_index+top_index+right_index;\r\n            for (var i = 0; i <$('.x-iframe').length; i++) {\r\n                if($('.x-iframe').eq(i).attr('tab-id')==(all_index+2)){\r\n                    tab.tabChange(all_index+2);\r\n                    event.stopPropagation();\r\n\t\t\t\t\t$('.x-iframe').eq(i).attr(\"src\",url);\r\n                    return;\r\n                }\r\n            };\r\n            \r\n            tab.tabAdd(title,url,all_index+2);\r\n            tab.tabChange(all_index+2);\r\n     \t\tevent.stopPropagation();\r\n            CustomRightClick();\r\n   })\r\n\r\n  \r\n\r\n    $(\".rightmenu li\").click(function () {\r\n       \r\n        if ($(this).attr(\"data-type\") == \"closethis\") {\r\n            var tabid = $(\".layui-tab-title li.layui-this\").attr('lay-id');// 获取当前激活的选项卡ID\r\n            tab.tabDelete(tabid);\r\n        } else if ($(this).attr(\"data-type\") == \"closeall\") {\r\n            tab.closeall();\r\n        }else{\r\n          \r\n            tab.closeother();\r\n        }\r\n        $('.rightmenu').hide();\r\n    })\r\n    \r\n})\r\nvar cateIds = [];\r\nfunction getCateId(cateId) {\r\n    \r\n    $(\"tbody tr[fid=\"+cateId+\"]\").each(function(index, el) {\r\n        id = $(el).attr('cate-id');\r\n        cateIds.push(id);\r\n        getCateId(id);\r\n    });\r\n}\r\n\r\n/*弹出层*/\r\n/*\r\n    参数解释：\r\n    title   标题\r\n    url     请求的url\r\n    id      需要操作的数据id\r\n    w       弹出层宽度（缺省调默认值）\r\n    h       弹出层高度（缺省调默认值）\r\n*/\r\nfunction x_all_show(title,url,w,h){\r\n    if (title == null || title == '') {\r\n        title=false;\r\n    };\r\n    if (url == null || url == '') {\r\n        url=\"404.html\";\r\n    };\r\n    if (w == null || w == '') {\r\n        w=($(window).width()*0.9);\r\n    };\r\n    if (h == null || h == '') {\r\n        h=($(window).height() - 50);\r\n    };\r\n\t//window.location.href=url;return false;\r\n    layer.open({\r\n        type: 2,\r\n        area: [w+'px', h +'px'],\r\n        fix: false, //不固定\r\n        maxmin: true,\r\n        shadeClose: false,\r\n        shade:0.4,\r\n        title: title,\r\n        content: url\r\n    });\r\n\t\r\n}\r\n\r\n/*关闭弹出框口*/\r\nfunction x_admin_close(){\r\n    var index = parent.layer.getFrameIndex(window.name);\r\n    parent.layer.close(index);\r\n}\r\n\r\n\r\n/**\r\n* 注册tab右键菜单点击事件\r\n*/\r\n\r\n\r\n// 点击空白处关闭右键弹窗\r\n$(document).click(function () {\r\n    $('.rightmenu').hide();\r\n})\r\n\r\n/**\r\n* 绑定右键菜单\r\n* @constructor\r\n*/\r\nfunction CustomRightClick () {\r\n\r\n    //屏蔽右键\r\n    $('.layui-tab-title li').on('contextmenu', function () {\r\n        return false;\r\n    })\r\n    $('.layui-tab-title,.layui-tab-title li').click(function () {\r\n        $('.rightmenu').hide();\r\n    });\r\n    $('.layui-tab-title li').on('contextmenu', function (e) {\r\n        var popupmenu = $(\".rightmenu\");\r\n        l = ($(document).width() - e.clientX) < popupmenu.width() ? (e.clientX - popupmenu.width()) : e.clientX;\r\n        t = ($(document).height() - e.clientY) < popupmenu.height() ? (e.clientY - popupmenu.height()) : e.clientY;\r\n        popupmenu.css({left: l, top: t}).show();\r\n        return false;\r\n    });\r\n}\r\n\r\n"
  },
  {
    "path": "app/admin/t/tpl/style/js/xm-select.js",
    "content": "/*!\n * @Title: xm-select\n * @Version: 1.2.4\n * @Description：基于layui的多选解决方案\n * @Site: https://gitee.com/maplemei/xm-select\n * @Author: maplemei\n * @License：Apache License 2.0\n */!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"./\",n(n.s=214)}({1:function(e,t,n){\"use strict\";function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if(\"string\"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return a(e,t)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function l(e){return e.nodeType?e:document.querySelector(e)}function s(){for(var e=[],t=0;t<arguments.length;t++)e.push(\"\".concat(t+1,\". \").concat(arguments[t]));console.warn(e.join(\"\\n\"))}function c(e){return\"[object Array]\"==Object.prototype.toString.call(e)}function u(e){return\"[object Function]\"==Object.prototype.toString.call(e)}function p(e){return e-=0,isNaN(e)&&(e=0),e}function f(e,t){var n;for(n in t)e[n]=e[n]&&\"[object Object]\"===e[n].toString()&&t[n]&&\"[object Object]\"===t[n].toString()?f(e[n],t[n]):e[n]=t[n];return e}function d(e,t,n){for(var o=n.value,r=i(t),a=function(n){var i=e[n];t.find((function(e){return e[o]==i[o]}))||r.push(i)},l=0;l<e.length;l++)a(l);return r}function h(){return-1!=navigator.userAgent.indexOf(\"Mac OS\")?\"mac\":\"win\"}function m(e,t,n,o){if(e&&c(e)){var r=o.children,i=o.selected,a=o.value;e.forEach((function(e){e.__node[i]||t.find((function(t){return t[a]===e[a]}))?n.push(e):m(e[r],t,n,o)}))}}function b(e,t,n){if(e&&c(e))return e.map((function(e){return e=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({},e),n.forEach((function(t){return delete e[t]})),e[t]=b(e[t],t,n),e}))}function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=this,r=!1;return function(){for(var i=arguments.length,a=new Array(i),l=0;l<i;l++)a[l]=arguments[l];r||(r=!0,!n&&e.call.apply(e,[o].concat(a)),setTimeout((function(){n&&e.call.apply(e,[o].concat(a)),r=!1}),t))}}n.d(t,\"g\",(function(){return l})),n.d(t,\"k\",(function(){return s})),n.d(t,\"d\",(function(){return c})),n.d(t,\"e\",(function(){return u})),n.d(t,\"i\",(function(){return p})),n.d(t,\"b\",(function(){return f})),n.d(t,\"f\",(function(){return d})),n.d(t,\"a\",(function(){return h})),n.d(t,\"j\",(function(){return m})),n.d(t,\"c\",(function(){return b})),n.d(t,\"h\",(function(){return y}))},106:function(e,t){e.exports=function(e){var t=\"undefined\"!=typeof window&&window.location;if(!t)throw new Error(\"fixUrls requires window.location\");if(!e||\"string\"!=typeof e)return e;var n=t.protocol+\"//\"+t.host,o=n+t.pathname.replace(/\\/[^\\/]*$/,\"/\");return e.replace(/url\\s*\\(((?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)\\)/gi,(function(e,t){var r,i=t.trim().replace(/^\"(.*)\"$/,(function(e,t){return t})).replace(/^'(.*)'$/,(function(e,t){return t}));return/^(#|data:|http:\\/\\/|https:\\/\\/|file:\\/\\/\\/|\\s*$)/i.test(i)?e:(r=0===i.indexOf(\"//\")?i:0===i.indexOf(\"/\")?n+i:o+i.replace(/^\\.\\//,\"\"),\"url(\"+JSON.stringify(r)+\")\")}))}},214:function(e,t,n){\"use strict\";n.r(t),function(e){n(216),n(217),n(219);var t=n(42),o=n(1);window.addEventListener(\"click\",(function(){Object.keys(t.b).forEach((function(e){var n=t.b[e];n&&n.closed&&n.closed()}))})),window.addEventListener(\"scroll\",Object(o.h)((function(){Object.keys(t.b).forEach((function(e){var n=t.b[e];n&&n.calcPosition&&n.calcPosition()}))}))),\"object\"===(\"undefined\"==typeof exports?\"undefined\":_typeof(exports))?e.exports=t.c:\"function\"==typeof define&&n(221)?define(xmSelect):window.layui&&layui.define&&layui.define((function(e){e(\"xmSelect\",t.c)})),window.xmSelect=t.c}.call(this,n(215)(e))},215:function(e,t){e.exports=function(e){if(!e.webpackPolyfill){var t=Object.create(e);t.children||(t.children=[]),Object.defineProperty(t,\"loaded\",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,\"id\",{enumerable:!0,get:function(){return t.i}}),Object.defineProperty(t,\"exports\",{enumerable:!0}),t.webpackPolyfill=1}return t}},216:function(e,t){Array.prototype.map||(Array.prototype.map=function(e,t){var n,o,r,i=Object(this),a=i.length>>>0;for(t&&(n=t),o=new Array(a),r=0;r<a;){var l,s;r in i&&(l=i[r],s=e.call(n,l,r,i),o[r]=s),r++}return o}),Array.prototype.forEach||(Array.prototype.forEach=function(e,t){var n,o;if(null==this)throw new TypeError(\"this is null or not defined\");var r=Object(this),i=r.length>>>0;if(\"function\"!=typeof e)throw new TypeError(e+\" is not a function\");for(arguments.length>1&&(n=t),o=0;o<i;){var a;o in r&&(a=r[o],e.call(n,a,o,r)),o++}}),Array.prototype.filter||(Array.prototype.filter=function(e){if(null==this)throw new TypeError;var t=Object(this),n=t.length>>>0;if(\"function\"!=typeof e)throw new TypeError;for(var o=[],r=arguments[1],i=0;i<n;i++)if(i in t){var a=t[i];e.call(r,a,i,t)&&o.push(a)}return o}),Array.prototype.find||(Array.prototype.find=function(e){return e&&(this.filter(e)||[])[0]}),Array.prototype.findIndex||(Array.prototype.findIndex=function(e){for(var t,n=Object(this),o=n.length>>>0,r=arguments[1],i=0;i<o;i++)if(t=n[i],e.call(r,t,i,n))return i;return-1})},217:function(e,t,n){var o=n(218);\"string\"==typeof o&&(o=[[e.i,o,\"\"]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(28)(o,r);o.locals&&(e.exports=o.locals)},218:function(e,t,n){(t=n(27)(!1)).push([e.i,'@font-face {\\n  font-family: \"xm-iconfont\";\\n  src: url(\\'//at.alicdn.com/t/font_792691_ptvyboo0bno.eot?t=1574048839056\\');\\n  /* IE9 */\\n  src: url(\\'//at.alicdn.com/t/font_792691_ptvyboo0bno.eot?t=1574048839056#iefix\\') format(\\'embedded-opentype\\'), /* IE6-IE8 */ url(\\'data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAksAAsAAAAAEYAAAAjeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCEUgqTXI8lATYCJAM0CxwABCAFhG0HgTwbZQ4jEbaCkVIj+4sD3sS6BFAp9ka91ulVG4leTC/+h+3V+zyRYCTyREKkcZ+D5/u137lPdveLGJBMunoiNPOQPBMq0/FQtEKIkMRDZng69d+hOiQumAr7bJdBOEzMTU77s78mhbI58aCg7ebCs4LBTgCk+cD/4ZqWUHebipp7al3tyKOjwCV/hVyw9PdzaktxI7IMQs26/1N8gV4DI0bVut3UhCaflGGgwM3oTXg1IfRMbCsmrEnriJVeYM2eXHII4KdMMzL4OoACHgZBCTasITcReDUBE8kWPLMTCGoQaDV+eKpUPQI49r8vP6BTPIDCaiBSml3oOQX0voNPebv/u2P0AUfP1w0s5EADzYBZsNdByylo2eVq/NtRdgFpovQR5x2CIwmIZeik6/u0T/m/A7RJP00sCmmyksj/kwc+LC5BFBqDEMDDjwPiANDB9MpJTXwHmsO3YyBwWDA4OFwwJLRcRgAOBUYMDg0mHRwGTAYozsV0AgWYruDwwExDHfzwKWf4OurQ9jzQDtoF+wpistfBfluQ5bQiiJa4ZQoKhShLiMayBbyg05AIkYBoIBJEEApQy/FwYv4HchADIUBXl61dW6mpwIgyp7p8PrHddieSjhY9oqTxyPB/FGNYDklpfYh8VtaoqSgb0bKoGB17CuVUp9Ll2nS2UpNGMSw9hyirA7C6+QLyByIQS0sSSmxvArC5odZmYZMxZSiBR5OkQl0uiufxMH5eL8t3u0d4XKyuq6EMdcpNe2+oXA8p9yPa+4T1PM7+A54tc7tpl2vcAHAftnhZj2chy1CyaCRFsyMqQ5nkNnskEt2yxxZinPsOZjFm4+XWvKqLkfCGS1k4MNP82isxSMf7ZsGYvQVCNAeSSVtzWCxRdXGxyZlA2CvCEevuO7y9M2z2NWH8icydzq/qAJSp1lGvDWFp6Nw3xChJowPD+76nU+upQk6Kw9jI0Rgym9Ct8VlxMI3CSIaDCZja5tDYt0/EYra4tn0Kp3v8Rdezk8svcy1mKhoSvNcZz3LKlUe777Gmval0s7bzAc0k13LGk896V9DuvNn34N0ebKgItkQgOomuJtgQPChNI4cwa7CEWCvfk5QjJFlem6i3SfVShWi5LTFRG+JwdCNpSqbpRFwrtb1TbcRkJi/AbJJQOmfCdnswLNGVM7qqSRO1zO0Q0j5Vr3cYQ07HB0MX6KoIZhx+D9Djs2C5bXtVwvbgJHtSCIL7hjFJme4sZDdS5IlJdKUO1Qt8opn0trBafz3AX933kmCRgyMEWGZjMAkRKhwmIHJGR4ruwFCdWKYzrap2R/mvd2UKajzRAZu88pGAD90Y+02kTFCKrBSXwGGJ3wRcPCdIppTxSmHOfESRwIli0S5J/8AYDCxTGh4XZua4xvfvGx320rDK2qA8g5FlS7pWNLx71+BwgA/KZ5I0aeKmNeCNoNPl8qNHu8uHHzqaKc86fHi4vPuRI4ny+I/vjxw+clh4HXVCFvVnVFx07EHZwVhSRliTTMWSEi0h6YuS6DxCRmiin0B3L4ry6cvR0ijYexFdBL3wGQM0YOrUAZCBkLOBBtQ+xdk7omfgUv+u++admyUeXduyxLM+r/+49rPfhgEZor6GymToNYksNsZyC7ntwAH0928UpgMpxpF0ydNlsMMBw7QsxTCmu0Hf3F+/+vb99Yumhb+e9R0LBNm+4O+hu7lQ5bGjI9j5G88qQ5SLFyuEC7cwd25xoYo2j4eA4bhpM7TZhPtmc+uhVEVSMYXLWh0bfjI8dvUpvDUocPZmU4kwwOfc83wB5wPehrpD3waApbwW+fgRrZXcxw+mB/3woZT+8JFMYwRMIy2k/18qhqcKpjYeYSnIACaUoRDu0e3kQFh98R5fiI8oJqwwGZSJDSbehLzZs7zIeWTQ4UGOIs2c4j2/Q/tn7n7j9juO33On6WhURCT/wO6Y3QdmWFY0Ef6JUeGRggO7ZbtaZlh5RYKWXbLPBLc3l/5h4A0mu3ZXTZ+u6t6VHMAzZhxak50T+24NnRuaOmehRkXlqVR5lIpuwezUUDUdCuJysv8Z/0/8uNE1s7jIJIubFWnI/x7g4nAZx79yYpFoAOU3a9iwT1O/GxUxPY0ljVPv9EukI3qNrl/So2YfzasqHCroNjS0+w0tlPlsYfC6v/01ixquizJH1Kd/VK+OS3iS3rTJWmqsMPdU3B3oFyC9RSumWE/0gG36IjTysfH51IJ/5oOgNYu6p4yb5Fdufhr/Kjtu0oSyYP/WJQrz35aNFnMhtFcwb55NlNnH8Wdu1b+XZA9zqlZrhdPo/V3uBhiUlQ66h0LhbAmFYIncdFOpVMh6Fl7peqy5Z2ZdQBITO2x1Asj1dRFjIBMC3hbuUh8Ooc4W03EjAdo8UL/t0oUfyU8630bmMcw/vqDNAsC9BQD4OqCgH+ljy0UhJB8AAJA+8EmArxk5gnRLik90AElf8rBm+IMvBTWnucb3+0o0ARk+r0ZBv8sU01nnSmP45/H8Dp8C8X+iE9e+ZvXymK/sQJ5/DuqhYKebPnKmPqLYuDcIMWS2/Rjxp2s8Do821LVn6A/xMK1RKvBLK5gyDsZ5uQ6bYusmx2yqLFe4lECHDPcFhojmckuAbnCI6Cn308RI6AAJdtCICQLQyBHKhSgX5YowN6BBPIEB8VxuSfNncpAuutzPnCSiDHDEo+DsKQBPoJi4MpRktepIs2zjO5h84IEMM3ffECKSZU1ZHxfewEI4h494MuuUNNOBjuw18QKHAzEXaAcylS3m3baq9MpnKenYmfEUgCdbXTHEtTVKsvruNGv9/DuYfOAhcuKu9TeEiA9nNJTUDOUbbVkn3sv2eDJrEnVrpvcHOjJeqRsOcpYYLuxoBzKVtCOm3ZaKbtJcurw+e/zN6c7Pd6r4gqUo0WLEiiOueOITvwQkKCEJM9nO3F60y5HkqLhdqUyXZtK3lqwReQ+G40O92UhOt0x/KmKM+u7LTPMzoEBOCYtiUPfSjODiuFXjSDm2idzAoc4Tj9bs2eJYDOU7HQA=\\') format(\\'woff2\\'), url(\\'//at.alicdn.com/t/font_792691_ptvyboo0bno.woff?t=1574048839056\\') format(\\'woff\\'), url(\\'//at.alicdn.com/t/font_792691_ptvyboo0bno.ttf?t=1574048839056\\') format(\\'truetype\\'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url(\\'//at.alicdn.com/t/font_792691_ptvyboo0bno.svg?t=1574048839056#iconfont\\') format(\\'svg\\');\\n  /* iOS 4.1- */\\n}\\n.xm-iconfont {\\n  font-family: \"xm-iconfont\" !important;\\n  font-size: 16px;\\n  font-style: normal;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n.xm-icon-quanxuan:before {\\n  content: \"\\\\e62c\";\\n}\\n.xm-icon-caidan:before {\\n  content: \"\\\\e610\";\\n}\\n.xm-icon-fanxuan:before {\\n  content: \"\\\\e837\";\\n}\\n.xm-icon-pifu:before {\\n  content: \"\\\\e668\";\\n}\\n.xm-icon-qingkong:before {\\n  content: \"\\\\e63e\";\\n}\\n.xm-icon-sousuo:before {\\n  content: \"\\\\e600\";\\n}\\n.xm-icon-danx:before {\\n  content: \"\\\\e62b\";\\n}\\n.xm-icon-duox:before {\\n  content: \"\\\\e613\";\\n}\\n.xm-icon-close:before {\\n  content: \"\\\\e601\";\\n}\\n.xm-icon-expand:before {\\n  content: \"\\\\e641\";\\n}\\n.xm-icon-banxuan:before {\\n  content: \"\\\\e60d\";\\n}\\n',\"\"]),e.exports=t},219:function(e,t,n){var o=n(220);\"string\"==typeof o&&(o=[[e.i,o,\"\"]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(28)(o,r);o.locals&&(e.exports=o.locals)},220:function(e,t,n){(t=n(27)(!1)).push([e.i,\"@-webkit-keyframes xm-upbit {\\n  from {\\n    -webkit-transform: translate3d(0, 30px, 0);\\n    opacity: 0.3;\\n  }\\n  to {\\n    -webkit-transform: translate3d(0, 0, 0);\\n    opacity: 1;\\n  }\\n}\\n@keyframes xm-upbit {\\n  from {\\n    transform: translate3d(0, 30px, 0);\\n    opacity: 0.3;\\n  }\\n  to {\\n    transform: translate3d(0, 0, 0);\\n    opacity: 1;\\n  }\\n}\\n@-webkit-keyframes loader {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n@keyframes loader {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\nxm-select {\\n  background-color: #FFF;\\n  position: relative;\\n  border: 1px solid #E6E6E6;\\n  border-radius: 2px;\\n  display: block;\\n  width: 100%;\\n  cursor: pointer;\\n  outline: none;\\n}\\nxm-select * {\\n  margin: 0;\\n  padding: 0;\\n  box-sizing: border-box;\\n  font-size: 14px;\\n  font-weight: 400;\\n  text-overflow: ellipsis;\\n  user-select: none;\\n  -ms-user-select: none;\\n  -moz-user-select: none;\\n  -webkit-user-select: none;\\n}\\nxm-select:hover,\\nxm-select:focus {\\n  border-color: #C0C4CC;\\n}\\nxm-select > .xm-tips {\\n  color: #999999;\\n  padding: 0 10px;\\n  position: absolute;\\n  display: flex;\\n  height: 100%;\\n  align-items: center;\\n}\\nxm-select > .xm-icon {\\n  display: inline-block;\\n  overflow: hidden;\\n  position: absolute;\\n  width: 0;\\n  height: 0;\\n  right: 10px;\\n  top: 50%;\\n  margin-top: -3px;\\n  cursor: pointer;\\n  border: 6px dashed transparent;\\n  border-top-color: #C2C2C2;\\n  border-top-style: solid;\\n  transition: all 0.3s;\\n  -webkit-transition: all 0.3s;\\n}\\nxm-select > .xm-icon-expand {\\n  margin-top: -9px;\\n  transform: rotate(180deg);\\n}\\nxm-select > .xm-label.single-row {\\n  position: absolute;\\n  top: 0;\\n  bottom: 0px;\\n  left: 0px;\\n  right: 30px;\\n  overflow: auto hidden;\\n}\\nxm-select > .xm-label.single-row .scroll {\\n  overflow-y: hidden;\\n}\\nxm-select > .xm-label.single-row .label-content {\\n  flex-wrap: nowrap;\\n  white-space: nowrap;\\n}\\nxm-select > .xm-label.auto-row .label-content {\\n  flex-wrap: wrap;\\n  padding-right: 30px !important;\\n}\\nxm-select > .xm-label.auto-row .xm-label-block > span {\\n  white-space: unset;\\n  height: 100%;\\n}\\nxm-select > .xm-label .scroll .label-content {\\n  display: flex;\\n  padding: 3px 10px;\\n}\\nxm-select > .xm-label .xm-label-block {\\n  display: flex;\\n  position: relative;\\n  padding: 0px 5px;\\n  margin: 2px 5px 2px 0;\\n  border-radius: 3px;\\n  align-items: baseline;\\n  color: #FFF;\\n}\\nxm-select > .xm-label .xm-label-block > span {\\n  display: flex;\\n  color: #FFF;\\n  white-space: nowrap;\\n}\\nxm-select > .xm-label .xm-label-block > i {\\n  color: #FFF;\\n  margin-left: 8px;\\n  font-size: 12px;\\n  cursor: pointer;\\n  display: flex;\\n}\\nxm-select > .xm-label .xm-label-block.disabled {\\n  background-color: #C2C2C2 !important;\\n  cursor: no-drop !important;\\n}\\nxm-select > .xm-label .xm-label-block.disabled > i {\\n  cursor: no-drop !important;\\n}\\nxm-select > .xm-body {\\n  position: absolute;\\n  left: 0;\\n  top: 42px;\\n  padding: 5px 0;\\n  z-index: 999;\\n  width: 100%;\\n  min-width: fit-content;\\n  border: 1px solid #E6E6E6;\\n  background-color: #fff;\\n  border-radius: 2px;\\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\\n  animation-name: xm-upbit;\\n  animation-duration: 0.3s;\\n  animation-fill-mode: both;\\n}\\nxm-select > .xm-body .scroll-body {\\n  overflow-x: hidden;\\n  overflow-y: auto;\\n}\\nxm-select > .xm-body .scroll-body::-webkit-scrollbar {\\n  width: 8px;\\n}\\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-track {\\n  -webkit-border-radius: 2em;\\n  -moz-border-radius: 2em;\\n  -ms-border-radius: 2em;\\n  border-radius: 2em;\\n  background-color: #FFF;\\n}\\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-thumb {\\n  -webkit-border-radius: 2em;\\n  -moz-border-radius: 2em;\\n  -ms-border-radius: 2em;\\n  border-radius: 2em;\\n  background-color: #C2C2C2;\\n}\\nxm-select > .xm-body.up {\\n  top: auto;\\n  bottom: 42px;\\n}\\nxm-select > .xm-body.relative {\\n  position: relative;\\n  display: block !important;\\n  top: 0;\\n  box-shadow: none;\\n  border: none;\\n  animation-name: none;\\n  animation-duration: 0;\\n  min-width: 100%;\\n}\\nxm-select > .xm-body .xm-group {\\n  cursor: default;\\n}\\nxm-select > .xm-body .xm-group-item {\\n  display: inline-block;\\n  cursor: pointer;\\n  padding: 0 10px;\\n  color: #999;\\n  font-size: 12px;\\n}\\nxm-select > .xm-body .xm-option {\\n  display: flex;\\n  align-items: center;\\n  position: relative;\\n  padding: 0 10px;\\n  cursor: pointer;\\n}\\nxm-select > .xm-body .xm-option-icon {\\n  color: transparent;\\n  display: flex;\\n  border: 1px solid #E6E6E6;\\n  border-radius: 3px;\\n  justify-content: center;\\n  align-items: center;\\n}\\nxm-select > .xm-body .xm-option-icon.xm-custom-icon {\\n  color: unset;\\n  border: unset;\\n}\\nxm-select > .xm-body .xm-option-icon-hidden {\\n  margin-right: -10px;\\n}\\nxm-select > .xm-body .xm-option-icon.xm-icon-danx {\\n  border-radius: 100%;\\n}\\nxm-select > .xm-body .xm-option-content {\\n  display: flex;\\n  position: relative;\\n  padding-left: 15px;\\n  overflow: hidden;\\n  white-space: nowrap;\\n  text-overflow: ellipsis;\\n  color: #666;\\n  width: calc(100% - 20px);\\n}\\nxm-select > .xm-body .xm-option.hide-icon .xm-option-content {\\n  padding-left: 0;\\n}\\nxm-select > .xm-body .xm-option.selected.hide-icon .xm-option-content {\\n  color: #FFF !important;\\n}\\nxm-select > .xm-body .xm-option .loader {\\n  width: 0.8em;\\n  height: 0.8em;\\n  margin-right: 6px;\\n  color: #C2C2C2;\\n}\\nxm-select > .xm-body .xm-select-empty {\\n  text-align: center;\\n  color: #999;\\n}\\nxm-select > .xm-body .disabled {\\n  cursor: no-drop;\\n}\\nxm-select > .xm-body .disabled:hover {\\n  background-color: #FFF;\\n}\\nxm-select > .xm-body .disabled .xm-option-icon {\\n  border-color: #C2C2C2 !important;\\n}\\nxm-select > .xm-body .disabled .xm-option-content {\\n  color: #C2C2C2 !important;\\n}\\nxm-select > .xm-body .disabled.selected > .xm-option-icon {\\n  color: #C2C2C2 !important;\\n}\\nxm-select > .xm-body .xm-search {\\n  background-color: #FFF !important;\\n  position: relative;\\n  padding: 0 10px;\\n  margin-bottom: 5px;\\n  cursor: pointer;\\n}\\nxm-select > .xm-body .xm-search > i {\\n  position: absolute;\\n  color: #666;\\n}\\nxm-select > .xm-body .xm-search-input {\\n  border: none;\\n  border-bottom: 1px solid #E6E6E6;\\n  padding-left: 27px;\\n  cursor: text;\\n}\\nxm-select > .xm-body .xm-paging {\\n  padding: 0 10px;\\n  display: flex;\\n  margin-top: 5px;\\n}\\nxm-select > .xm-body .xm-paging > span:first-child {\\n  border-radius: 2px 0 0 2px;\\n}\\nxm-select > .xm-body .xm-paging > span:last-child {\\n  border-radius: 0 2px 2px 0;\\n}\\nxm-select > .xm-body .xm-paging > span {\\n  display: flex;\\n  flex: auto;\\n  justify-content: center;\\n  vertical-align: middle;\\n  margin: 0 -1px 0 0;\\n  background-color: #fff;\\n  color: #333;\\n  font-size: 12px;\\n  border: 1px solid #e2e2e2;\\n  flex-wrap: nowrap;\\n  width: 100%;\\n  overflow: hidden;\\n  min-width: 50px;\\n}\\nxm-select > .xm-body .xm-toolbar {\\n  padding: 0 10px;\\n  display: flex;\\n  margin: -3px 0;\\n  cursor: default;\\n}\\nxm-select > .xm-body .xm-toolbar .toolbar-tag {\\n  cursor: pointer;\\n  display: flex;\\n  margin-right: 20px;\\n  color: #666;\\n  align-items: baseline;\\n}\\nxm-select > .xm-body .xm-toolbar .toolbar-tag:hover {\\n  opacity: 0.8;\\n}\\nxm-select > .xm-body .xm-toolbar .toolbar-tag:active {\\n  opacity: 1;\\n}\\nxm-select > .xm-body .xm-toolbar .toolbar-tag > i {\\n  margin-right: 2px;\\n  font-size: 14px;\\n}\\nxm-select > .xm-body .xm-toolbar .toolbar-tag:last-child {\\n  margin-right: 0;\\n}\\nxm-select > .xm-body .xm-body-custom {\\n  line-height: initial;\\n  cursor: default;\\n}\\nxm-select > .xm-body .xm-body-custom * {\\n  box-sizing: initial;\\n}\\nxm-select > .xm-body .xm-tree {\\n  position: relative;\\n}\\nxm-select > .xm-body .xm-tree-icon {\\n  display: inline-block;\\n  margin-right: 3px;\\n  cursor: pointer;\\n  border: 6px dashed transparent;\\n  border-left-color: #C2C2C2;\\n  border-left-style: solid;\\n  transition: all 0.3s;\\n  -webkit-transition: all 0.3s;\\n  z-index: 2;\\n  visibility: hidden;\\n}\\nxm-select > .xm-body .xm-tree-icon.expand {\\n  margin-top: 3px;\\n  margin-right: 5px;\\n  margin-left: -2px;\\n  transform: rotate(90deg);\\n}\\nxm-select > .xm-body .xm-tree-icon.xm-visible {\\n  visibility: visible;\\n}\\nxm-select > .xm-body .xm-tree .left-line {\\n  position: absolute;\\n  left: 13px;\\n  width: 0;\\n  z-index: 1;\\n  border-left: 1px dotted #c0c4cc !important;\\n}\\nxm-select > .xm-body .xm-tree .top-line {\\n  position: absolute;\\n  left: 13px;\\n  height: 0;\\n  z-index: 1;\\n  border-top: 1px dotted #c0c4cc !important;\\n}\\nxm-select > .xm-body .xm-tree .xm-tree-icon + .top-line {\\n  margin-left: 1px;\\n}\\nxm-select > .xm-body .scroll-body > .xm-tree > .xm-option > .top-line,\\nxm-select > .xm-body .scroll-body > .xm-option > .top-line {\\n  width: 0 !important;\\n}\\nxm-select > .xm-body .xm-cascader-box {\\n  position: absolute;\\n  left: 0;\\n  right: 0;\\n  top: 0;\\n  bottom: 0;\\n  padding: 5px 0;\\n  border: 1px solid #E6E6E6;\\n  background-color: #fff;\\n  border-radius: 2px;\\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\\n  margin: -1px;\\n}\\nxm-select > .xm-body .xm-cascader-box::before {\\n  content: ' ';\\n  position: absolute;\\n  width: 0;\\n  height: 0;\\n  border: 6px solid transparent;\\n  border-right-color: #E6E6E6;\\n  top: 10px;\\n  left: -12px;\\n}\\nxm-select > .xm-body .xm-cascader-box::after {\\n  content: ' ';\\n  position: absolute;\\n  width: 0;\\n  height: 0;\\n  border: 6px solid transparent;\\n  border-right-color: #fff;\\n  top: 10px;\\n  left: -11px;\\n}\\nxm-select > .xm-body .xm-cascader-scroll {\\n  height: 100%;\\n  overflow-x: hidden;\\n  overflow-y: auto;\\n}\\nxm-select > .xm-body.cascader {\\n  width: unset;\\n  min-width: unset;\\n}\\nxm-select > .xm-body.cascader .xm-option-content {\\n  padding-left: 8px;\\n}\\nxm-select > .xm-body.cascader .disabled .xm-right-arrow {\\n  color: #C2C2C2 !important;\\n}\\nxm-select > .xm-body.cascader .hide-icon.disabled .xm-right-arrow {\\n  color: #999 !important;\\n}\\nxm-select .xm-input {\\n  cursor: pointer;\\n  border-radius: 2px;\\n  border-width: 1px;\\n  border-style: solid;\\n  border-color: #E6E6E6;\\n  display: block;\\n  width: 100%;\\n  box-sizing: border-box;\\n  background-color: #FFF;\\n  line-height: 1.3;\\n  padding-left: 10px;\\n  outline: 0;\\n  user-select: text;\\n  -ms-user-select: text;\\n  -moz-user-select: text;\\n  -webkit-user-select: text;\\n}\\nxm-select .dis {\\n  display: none;\\n}\\nxm-select .loading {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  right: 0;\\n  bottom: 0;\\n  background-color: rgba(255, 255, 255, 0.6);\\n  display: flex;\\n  align-items: center;\\n  justify-content: center;\\n}\\nxm-select .loader {\\n  border: 0.2em dotted currentcolor;\\n  border-radius: 50%;\\n  -webkit-animation: 1s loader linear infinite;\\n  animation: 1s loader linear infinite;\\n  display: inline-block;\\n  width: 1em;\\n  height: 1em;\\n  color: inherit;\\n  vertical-align: middle;\\n  pointer-events: none;\\n}\\nxm-select .xm-select-default {\\n  position: absolute;\\n  width: 100%;\\n  height: 100%;\\n  border: none;\\n  visibility: hidden;\\n}\\nxm-select .xm-select-disabled {\\n  position: absolute;\\n  left: 0;\\n  right: 0;\\n  top: 0;\\n  bottom: 0;\\n  cursor: no-drop;\\n  z-index: 2;\\n  opacity: 0.3;\\n  background-color: #FFF;\\n}\\nxm-select .item--divided {\\n  border-top: 1px solid #ebeef5;\\n  width: calc(100% - 20px);\\n  cursor: initial;\\n}\\nxm-select .xm-right-arrow {\\n  position: absolute;\\n  color: #666;\\n  right: 5px;\\n  top: -1px;\\n  font-weight: 700;\\n  transform: scale(0.6, 1);\\n}\\nxm-select .xm-right-arrow::after {\\n  content: '>';\\n}\\nxm-select[size='large'] {\\n  min-height: 40px;\\n  line-height: 40px;\\n}\\nxm-select[size='large'] .xm-input {\\n  height: 40px;\\n}\\nxm-select[size='large'] .xm-label .scroll .label-content {\\n  line-height: 34px;\\n}\\nxm-select[size='large'] .xm-label .xm-label-block {\\n  height: 30px;\\n  line-height: 30px;\\n}\\nxm-select[size='large'] .xm-body .xm-option .xm-option-icon {\\n  height: 20px;\\n  width: 20px;\\n  font-size: 20px;\\n}\\nxm-select[size='large'] .xm-paging > span {\\n  height: 34px;\\n  line-height: 34px;\\n}\\nxm-select[size='large'] .xm-tree .left-line {\\n  height: 100%;\\n  bottom: 20px;\\n}\\nxm-select[size='large'] .xm-tree .left-line-group {\\n  height: calc(100% - 40px);\\n}\\nxm-select[size='large'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\\n  top: 19px;\\n}\\nxm-select[size='large'] .item--divided {\\n  margin: 10px;\\n}\\nxm-select {\\n  min-height: 36px;\\n  line-height: 36px;\\n}\\nxm-select .xm-input {\\n  height: 36px;\\n}\\nxm-select .xm-label .scroll .label-content {\\n  line-height: 30px;\\n}\\nxm-select .xm-label .xm-label-block {\\n  height: 26px;\\n  line-height: 26px;\\n}\\nxm-select .xm-body .xm-option .xm-option-icon {\\n  height: 18px;\\n  width: 18px;\\n  font-size: 18px;\\n}\\nxm-select .xm-paging > span {\\n  height: 30px;\\n  line-height: 30px;\\n}\\nxm-select .xm-tree .left-line {\\n  height: 100%;\\n  bottom: 18px;\\n}\\nxm-select .xm-tree .left-line-group {\\n  height: calc(100% - 36px);\\n}\\nxm-select .xm-tree .xm-tree-icon.xm-hidden + .top-line {\\n  top: 17px;\\n}\\nxm-select .item--divided {\\n  margin: 9px;\\n}\\nxm-select[size='small'] {\\n  min-height: 32px;\\n  line-height: 32px;\\n}\\nxm-select[size='small'] .xm-input {\\n  height: 32px;\\n}\\nxm-select[size='small'] .xm-label .scroll .label-content {\\n  line-height: 26px;\\n}\\nxm-select[size='small'] .xm-label .xm-label-block {\\n  height: 22px;\\n  line-height: 22px;\\n}\\nxm-select[size='small'] .xm-body .xm-option .xm-option-icon {\\n  height: 16px;\\n  width: 16px;\\n  font-size: 16px;\\n}\\nxm-select[size='small'] .xm-paging > span {\\n  height: 26px;\\n  line-height: 26px;\\n}\\nxm-select[size='small'] .xm-tree .left-line {\\n  height: 100%;\\n  bottom: 16px;\\n}\\nxm-select[size='small'] .xm-tree .left-line-group {\\n  height: calc(100% - 32px);\\n}\\nxm-select[size='small'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\\n  top: 15px;\\n}\\nxm-select[size='small'] .item--divided {\\n  margin: 8px;\\n}\\nxm-select[size='mini'] {\\n  min-height: 28px;\\n  line-height: 28px;\\n}\\nxm-select[size='mini'] .xm-input {\\n  height: 28px;\\n}\\nxm-select[size='mini'] .xm-label .scroll .label-content {\\n  line-height: 22px;\\n}\\nxm-select[size='mini'] .xm-label .xm-label-block {\\n  height: 18px;\\n  line-height: 18px;\\n}\\nxm-select[size='mini'] .xm-body .xm-option .xm-option-icon {\\n  height: 14px;\\n  width: 14px;\\n  font-size: 14px;\\n}\\nxm-select[size='mini'] .xm-paging > span {\\n  height: 22px;\\n  line-height: 22px;\\n}\\nxm-select[size='mini'] .xm-tree .left-line {\\n  height: 100%;\\n  bottom: 14px;\\n}\\nxm-select[size='mini'] .xm-tree .left-line-group {\\n  height: calc(100% - 28px);\\n}\\nxm-select[size='mini'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\\n  top: 13px;\\n}\\nxm-select[size='mini'] .item--divided {\\n  margin: 7px;\\n}\\n.layui-form-pane xm-select {\\n  margin: -1px -1px -1px 0;\\n}\\n\",\"\"]),e.exports=t},221:function(e,t){(function(t){e.exports=t}).call(this,{})},27:function(e,t,n){\"use strict\";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||\"\",o=e[3];if(!o)return n;if(t&&\"function\"==typeof btoa){var r=function(e){var t=btoa(unescape(encodeURIComponent(JSON.stringify(e)))),n=\"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(t);return\"/*# \".concat(n,\" */\")}(o),i=o.sources.map((function(e){return\"/*# sourceURL=\".concat(o.sourceRoot||\"\").concat(e,\" */\")}));return[n].concat(i).concat([r]).join(\"\\n\")}return[n].join(\"\\n\")}(t,e);return t[2]?\"@media \".concat(t[2],\" {\").concat(n,\"}\"):n})).join(\"\")},t.i=function(e,n,o){\"string\"==typeof e&&(e=[[null,e,\"\"]]);var r={};if(o)for(var i=0;i<this.length;i++){var a=this[i][0];null!=a&&(r[a]=!0)}for(var l=0;l<e.length;l++){var s=[].concat(e[l]);o&&r[s[0]]||(n&&(s[2]?s[2]=\"\".concat(n,\" and \").concat(s[2]):s[2]=n),t.push(s))}},t}},28:function(e,t,n){var o,r,i={},a=(o=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===r&&(r=o.apply(this,arguments)),r}),l=function(e,t){return t?t.querySelector(e):document.querySelector(e)},s=function(e){var t={};return function(e,n){if(\"function\"==typeof e)return e();if(void 0===t[e]){var o=l.call(this,e,n);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}t[e]=o}return t[e]}}(),c=null,u=0,p=[],f=n(106);function d(e,t){for(var n=0;n<e.length;n++){var o=e[n],r=i[o.id];if(r){r.refs++;for(var a=0;a<r.parts.length;a++)r.parts[a](o.parts[a]);for(;a<o.parts.length;a++)r.parts.push(v(o.parts[a],t))}else{var l=[];for(a=0;a<o.parts.length;a++)l.push(v(o.parts[a],t));i[o.id]={id:o.id,refs:1,parts:l}}}}function h(e,t){for(var n=[],o={},r=0;r<e.length;r++){var i=e[r],a=t.base?i[0]+t.base:i[0],l={css:i[1],media:i[2],sourceMap:i[3]};o[a]?o[a].parts.push(l):n.push(o[a]={id:a,parts:[l]})}return n}function m(e,t){var n=s(e.insertInto);if(!n)throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.\");var o=p[p.length-1];if(\"top\"===e.insertAt)o?o.nextSibling?n.insertBefore(t,o.nextSibling):n.appendChild(t):n.insertBefore(t,n.firstChild),p.push(t);else if(\"bottom\"===e.insertAt)n.appendChild(t);else{if(\"object\"!=typeof e.insertAt||!e.insertAt.before)throw new Error(\"[Style Loader]\\n\\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\\n Must be 'top', 'bottom', or Object.\\n (https://github.com/webpack-contrib/style-loader#insertat)\\n\");var r=s(e.insertAt.before,n);n.insertBefore(t,r)}}function b(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e);var t=p.indexOf(e);t>=0&&p.splice(t,1)}function y(e){var t=document.createElement(\"style\");if(void 0===e.attrs.type&&(e.attrs.type=\"text/css\"),void 0===e.attrs.nonce){var o=function(){0;return n.nc}();o&&(e.attrs.nonce=o)}return x(t,e.attrs),m(e,t),t}function x(e,t){Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])}))}function v(e,t){var n,o,r,i;if(t.transform&&e.css){if(!(i=\"function\"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=i}if(t.singleton){var a=u++;n=c||(c=y(t)),o=w.bind(null,n,a,!1),r=w.bind(null,n,a,!0)}else e.sourceMap&&\"function\"==typeof URL&&\"function\"==typeof URL.createObjectURL&&\"function\"==typeof URL.revokeObjectURL&&\"function\"==typeof Blob&&\"function\"==typeof btoa?(n=function(e){var t=document.createElement(\"link\");return void 0===e.attrs.type&&(e.attrs.type=\"text/css\"),e.attrs.rel=\"stylesheet\",x(t,e.attrs),m(e,t),t}(t),o=O.bind(null,n,t),r=function(){b(n),n.href&&URL.revokeObjectURL(n.href)}):(n=y(t),o=k.bind(null,n),r=function(){b(n)});return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){if(\"undefined\"!=typeof DEBUG&&DEBUG&&\"object\"!=typeof document)throw new Error(\"The style-loader cannot be used in a non-browser environment\");(t=t||{}).attrs=\"object\"==typeof t.attrs?t.attrs:{},t.singleton||\"boolean\"==typeof t.singleton||(t.singleton=a()),t.insertInto||(t.insertInto=\"head\"),t.insertAt||(t.insertAt=\"bottom\");var n=h(e,t);return d(n,t),function(e){for(var o=[],r=0;r<n.length;r++){var a=n[r];(l=i[a.id]).refs--,o.push(l)}e&&d(h(e,t),t);for(r=0;r<o.length;r++){var l;if(0===(l=o[r]).refs){for(var s=0;s<l.parts.length;s++)l.parts[s]();delete i[l.id]}}}};var g,_=(g=[],function(e,t){return g[e]=t,g.filter(Boolean).join(\"\\n\")});function w(e,t,n,o){var r=n?\"\":o.css;if(e.styleSheet)e.styleSheet.cssText=_(t,r);else{var i=document.createTextNode(r),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(i,a[t]):e.appendChild(i)}}function k(e,t){var n=t.css,o=t.media;if(o&&e.setAttribute(\"media\",o),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}function O(e,t,n){var o=n.css,r=n.sourceMap,i=void 0===t.convertToAbsoluteUrls&&r;(t.convertToAbsoluteUrls||i)&&(o=f(o)),r&&(o+=\"\\n/*# sourceMappingURL=data:application/json;base64,\"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+\" */\");var a=new Blob([o],{type:\"text/css\"}),l=e.href;e.href=URL.createObjectURL(a),l&&URL.revokeObjectURL(l)}},37:function(e){e.exports=JSON.parse('{\"a\":\"xm-select\",\"b\":\"1.2.4\",\"c\":\"https://maplemei.gitee.io/xm-select\"}')},42:function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return Xe})),n.d(t,\"d\",(function(){return $e})),n.d(t,\"a\",(function(){return et}));var o,r,i,a,l,s=n(37),c=n(1),u={},p=[],f=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function d(e,t){for(var n in t)e[n]=t[n];return e}function h(e){var t=e.parentNode;t&&t.removeChild(e)}function m(e,t,n){var o,r=arguments,i={};for(o in t)\"key\"!==o&&\"ref\"!==o&&(i[o]=t[o]);if(arguments.length>3)for(n=[n],o=3;o<arguments.length;o++)n.push(r[o]);if(null!=n&&(i.children=n),\"function\"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===i[o]&&(i[o]=e.defaultProps[o]);return b(e,i,t&&t.key,t&&t.ref,null)}function b(e,t,n,r,i){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:i};return null==i&&(a.__v=a),o.vnode&&o.vnode(a),a}function y(e){return e.children}function x(e,t){this.props=e,this.context=t}function v(e,t){if(null==t)return e.__?v(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e)return n.__e;return\"function\"==typeof e.type?v(e):null}function g(e){var t,n;if(null!=(e=e.__)&&null!=e.__c){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e){e.__e=e.__c.base=n.__e;break}return g(e)}}function _(e){(!e.__d&&(e.__d=!0)&&r.push(e)&&!w.__r++||a!==o.debounceRendering)&&((a=o.debounceRendering)||i)(w)}function w(){for(var e;w.__r=r.length;)e=r.sort((function(e,t){return e.__v.__b-t.__v.__b})),r=[],e.some((function(e){var t,n,o,r,i,a,l;e.__d&&(a=(i=(t=e).__v).__e,(l=t.__P)&&(n=[],(o=d({},i)).__v=o,r=A(l,i,o,t.__n,void 0!==l.ownerSVGElement,null,n,null==a?v(i):a),R(n,i),r!=a&&g(i)))}))}function k(e,t,n,o,r,i,a,l,s,c){var f,d,m,x,g,_,w,k=o&&o.__k||p,C=k.length;for(s==u&&(s=null!=a?a[0]:C?v(o,0):null),n.__k=[],f=0;f<t.length;f++)if(null!=(x=n.__k[f]=null==(x=t[f])||\"boolean\"==typeof x?null:\"string\"==typeof x||\"number\"==typeof x?b(null,x,null,null,x):Array.isArray(x)?b(y,{children:x},null,null,null):null!=x.__e||null!=x.__c?b(x.type,x.props,x.key,null,x.__v):x)){if(x.__=n,x.__b=n.__b+1,null===(m=k[f])||m&&x.key==m.key&&x.type===m.type)k[f]=void 0;else for(d=0;d<C;d++){if((m=k[d])&&x.key==m.key&&x.type===m.type){k[d]=void 0;break}m=null}g=A(e,x,m=m||u,r,i,a,l,s,c),(d=x.ref)&&m.ref!=d&&(w||(w=[]),m.ref&&w.push(m.ref,null,x),w.push(d,x.__c||g,x)),null!=g?(null==_&&(_=g),s=O(e,x,m,k,a,g,s),\"option\"==n.type?e.value=\"\":\"function\"==typeof n.type&&(n.__d=s)):s&&m.__e==s&&s.parentNode!=e&&(s=v(m))}if(n.__e=_,null!=a&&\"function\"!=typeof n.type)for(f=a.length;f--;)null!=a[f]&&h(a[f]);for(f=C;f--;)null!=k[f]&&D(k[f],k[f]);if(w)for(f=0;f<w.length;f++)I(w[f],w[++f],w[++f])}function O(e,t,n,o,r,i,a){var l,s,c;if(void 0!==t.__d)l=t.__d,t.__d=void 0;else if(r==n||i!=a||null==i.parentNode)e:if(null==a||a.parentNode!==e)e.appendChild(i),l=null;else{for(s=a,c=0;(s=s.nextSibling)&&c<o.length;c+=2)if(s==i)break e;e.insertBefore(i,a),l=a}return void 0!==l?l:i.nextSibling}function C(e,t,n){\"-\"===t[0]?e.setProperty(t,n):e[t]=\"number\"==typeof n&&!1===f.test(t)?n+\"px\":null==n?\"\":n}function j(e,t,n,o,r){var i,a,l,s,c;if(r?\"className\"===t&&(t=\"class\"):\"class\"===t&&(t=\"className\"),\"style\"===t)if(i=e.style,\"string\"==typeof n)i.cssText=n;else{if(\"string\"==typeof o&&(i.cssText=\"\",o=null),o)for(s in o)n&&s in n||C(i,s,\"\");if(n)for(c in n)o&&n[c]===o[c]||C(i,c,n[c])}else\"o\"===t[0]&&\"n\"===t[1]?(a=t!==(t=t.replace(/Capture$/,\"\")),l=t.toLowerCase(),t=(l in e?l:t).slice(2),n?(o||e.addEventListener(t,S,a),(e.l||(e.l={}))[t]=n):e.removeEventListener(t,S,a)):\"list\"!==t&&\"tagName\"!==t&&\"form\"!==t&&\"type\"!==t&&\"size\"!==t&&!r&&t in e?e[t]=null==n?\"\":n:\"function\"!=typeof n&&\"dangerouslySetInnerHTML\"!==t&&(t!==(t=t.replace(/^xlink:?/,\"\"))?null==n||!1===n?e.removeAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase()):e.setAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase(),n):null==n||!1===n&&!/^ar/.test(t)?e.removeAttribute(t):e.setAttribute(t,n))}function S(e){this.l[e.type](o.event?o.event(e):e)}function E(e,t,n){var o,r;for(o=0;o<e.__k.length;o++)(r=e.__k[o])&&(r.__=e,r.__e&&(\"function\"==typeof r.type&&r.__k.length>1&&E(r,t,n),t=O(n,r,r,e.__k,null,r.__e,t),\"function\"==typeof e.type&&(e.__d=t)))}function A(e,t,n,r,i,a,l,s,c){var u,p,f,h,m,b,v,g,_,w,O,C=t.type;if(void 0!==t.constructor)return null;(u=o.__b)&&u(t);try{e:if(\"function\"==typeof C){if(g=t.props,_=(u=C.contextType)&&r[u.__c],w=u?_?_.props.value:u.__:r,n.__c?v=(p=t.__c=n.__c).__=p.__E:(\"prototype\"in C&&C.prototype.render?t.__c=p=new C(g,w):(t.__c=p=new x(g,w),p.constructor=C,p.render=M),_&&_.sub(p),p.props=g,p.state||(p.state={}),p.context=w,p.__n=r,f=p.__d=!0,p.__h=[]),null==p.__s&&(p.__s=p.state),null!=C.getDerivedStateFromProps&&(p.__s==p.state&&(p.__s=d({},p.__s)),d(p.__s,C.getDerivedStateFromProps(g,p.__s))),h=p.props,m=p.state,f)null==C.getDerivedStateFromProps&&null!=p.componentWillMount&&p.componentWillMount(),null!=p.componentDidMount&&p.__h.push(p.componentDidMount);else{if(null==C.getDerivedStateFromProps&&g!==h&&null!=p.componentWillReceiveProps&&p.componentWillReceiveProps(g,w),!p.__e&&null!=p.shouldComponentUpdate&&!1===p.shouldComponentUpdate(g,p.__s,w)||t.__v===n.__v){p.props=g,p.state=p.__s,t.__v!==n.__v&&(p.__d=!1),p.__v=t,t.__e=n.__e,t.__k=n.__k,p.__h.length&&l.push(p),E(t,s,e);break e}null!=p.componentWillUpdate&&p.componentWillUpdate(g,p.__s,w),null!=p.componentDidUpdate&&p.__h.push((function(){p.componentDidUpdate(h,m,b)}))}p.context=w,p.props=g,p.state=p.__s,(u=o.__r)&&u(t),p.__d=!1,p.__v=t,p.__P=e,u=p.render(p.props,p.state,p.context),p.state=p.__s,null!=p.getChildContext&&(r=d(d({},r),p.getChildContext())),f||null==p.getSnapshotBeforeUpdate||(b=p.getSnapshotBeforeUpdate(h,m)),O=null!=u&&u.type==y&&null==u.key?u.props.children:u,k(e,Array.isArray(O)?O:[O],t,n,r,i,a,l,s,c),p.base=t.__e,p.__h.length&&l.push(p),v&&(p.__E=p.__=null),p.__e=!1}else null==a&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=P(n.__e,t,n,r,i,a,l,c);(u=o.diffed)&&u(t)}catch(e){t.__v=null,o.__e(e,t,n)}return t.__e}function R(e,t){o.__c&&o.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){o.__e(e,t.__v)}}))}function P(e,t,n,o,r,i,a,l){var s,c,f,d,h,m=n.props,b=t.props;if(r=\"svg\"===t.type||r,null!=i)for(s=0;s<i.length;s++)if(null!=(c=i[s])&&((null===t.type?3===c.nodeType:c.localName===t.type)||e==c)){e=c,i[s]=null;break}if(null==e){if(null===t.type)return document.createTextNode(b);e=r?document.createElementNS(\"http://www.w3.org/2000/svg\",t.type):document.createElement(t.type,b.is&&{is:b.is}),i=null,l=!1}if(null===t.type)m!==b&&e.data!=b&&(e.data=b);else{if(null!=i&&(i=p.slice.call(e.childNodes)),f=(m=n.props||u).dangerouslySetInnerHTML,d=b.dangerouslySetInnerHTML,!l){if(null!=i)for(m={},h=0;h<e.attributes.length;h++)m[e.attributes[h].name]=e.attributes[h].value;(d||f)&&(d&&f&&d.__html==f.__html||(e.innerHTML=d&&d.__html||\"\"))}(function(e,t,n,o,r){var i;for(i in n)\"children\"===i||\"key\"===i||i in t||j(e,i,null,n[i],o);for(i in t)r&&\"function\"!=typeof t[i]||\"children\"===i||\"key\"===i||\"value\"===i||\"checked\"===i||n[i]===t[i]||j(e,i,t[i],n[i],o)})(e,b,m,r,l),d?t.__k=[]:(s=t.props.children,k(e,Array.isArray(s)?s:[s],t,n,o,\"foreignObject\"!==t.type&&r,i,a,u,l)),l||(\"value\"in b&&void 0!==(s=b.value)&&s!==e.value&&j(e,\"value\",s,m.value,!1),\"checked\"in b&&void 0!==(s=b.checked)&&s!==e.checked&&j(e,\"checked\",s,m.checked,!1))}return e}function I(e,t,n){try{\"function\"==typeof e?e(t):e.current=t}catch(e){o.__e(e,n)}}function D(e,t,n){var r,i,a;if(o.unmount&&o.unmount(e),(r=e.ref)&&(r.current&&r.current!==e.__e||I(r,null,t)),n||\"function\"==typeof e.type||(n=null!=(i=e.__e)),e.__e=e.__d=void 0,null!=(r=e.__c)){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(e){o.__e(e,t)}r.base=r.__P=null}if(r=e.__k)for(a=0;a<r.length;a++)r[a]&&D(r[a],t,n);null!=i&&h(i)}function M(e,t,n){return this.constructor(e,n)}function T(e,t,n){var r,i,a;o.__&&o.__(e,t),i=(r=n===l)?null:n&&n.__k||t.__k,e=m(y,null,[e]),a=[],A(t,(r?t:n||t).__k=e,i||u,u,void 0!==t.ownerSVGElement,n&&!r?[n]:i?null:t.childNodes.length?p.slice.call(t.childNodes):null,a,n||u,r),R(a,e)}function z(e){return(z=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function L(e){return function(e){if(Array.isArray(e))return V(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if(\"string\"==typeof e)return V(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return V(e,t)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function V(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function F(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function U(e,t){return(U=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function N(e){var t=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=K(e);if(t){var r=K(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return B(this,n)}}function B(e,t){return!t||\"object\"!==z(t)&&\"function\"!=typeof t?function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e):t}function K(e){return(K=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}o={__e:function(e,t){for(var n,o;t=t.__;)if((n=t.__c)&&!n.__)try{if(n.constructor&&null!=n.constructor.getDerivedStateFromError&&(o=!0,n.setState(n.constructor.getDerivedStateFromError(e))),null!=n.componentDidCatch&&(o=!0,n.componentDidCatch(e)),o)return _(n.__E=n)}catch(t){e=t}throw e}},x.prototype.setState=function(e,t){var n;n=this.__s!==this.state?this.__s:this.__s=d({},this.state),\"function\"==typeof e&&(e=e(n,this.props)),e&&d(n,e),null!=e&&this.__v&&(t&&this.__h.push(t),_(this))},x.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),_(this))},x.prototype.render=y,r=[],i=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,w.__r=0,l=u;var H=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&U(e,t)}(i,e);var t,n,o,r=N(i);function i(e){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,i),r.call(this,e)}return t=i,(n=[{key:\"iconClick\",value:function(e,t,n,o){this.props.ck(e,t,n,!0),o.stopPropagation()}},{key:\"scrollFunc\",value:function(e){if(0==e.wheelDeltaX){for(var t=this.labelRef.getElementsByClassName(\"xm-label-block\"),n=10,o=0;o<t.length;o++)n+=t[o].getBoundingClientRect().width+5;var r=this.labelRef.getBoundingClientRect().width,i=n>r?n-r:r,a=this.labelRef.scrollLeft+e.deltaY;a<0&&(a=0),a>i&&(a=i),this.labelRef.scrollLeft=a}}},{key:\"blur\",value:function(){var e=this.base.querySelector(\".label-search-input\");e&&e.blur()}},{key:\"labelDrag\",value:function(e,t){for(var n=t.type,o=t.target;;){if(!o||\"I\"===o.tagName)return;if(\"DIV\"===o.tagName&&\"fixed\"!==o.style.position)break;o=o.parentNode}if(console.log(t),\"mousedown\"===n){var r=o.cloneNode(!0),i=t.pageX,a=t.pageY,l=t.offsetX,s=t.offsetY;console.log(i,a,l,s),r.style.position=\"fixed\",r.style.left=i-l+\"px\",r.style.top=a-s+\"px\",o.appendChild(r),console.log(r),r.onmousemove=function(e){r.style.left=e.pageX-l+\"px\",r.style.top=e.pageY-s+\"px\"},r.mouseup=function(){r.parentNode.removeChild(r),r.onmousemove=null,r.mouseup=null,r.mouseleave=null},r.mouseleave=function(){console.log(\"mouseleave\")}}else if(\"mouseup\"===n)for(var c=o.childNodes,u=0;u<c.length;u++){var p=c[u];if(\"DIV\"===p.tagName){o.removeChild(p),p.onmousemove=null;break}}t.stopPropagation()}},{key:\"componentDidMount\",value:function(){this.labelRef.addEventListener&&this.labelRef.addEventListener(\"DOMMouseScroll\",this.scrollFunc.bind(this),!1),this.labelRef.attachEvent&&this.labelRef.attachEvent(\"onmousewheel\",this.scrollFunc.bind(this)),this.labelRef.onmousewheel=this.scrollFunc.bind(this)}},{key:\"render\",value:function(e){var t=this,n=e.data,o=e.prop,r=e.theme,i=e.model,a=e.sels,l=e.autoRow,s=e.tree,u=o.name,p=o.disabled,f=i.label,d=f.type,h=f[d],b=a;s.show&&s.strict&&s.simple&&(b=[],Object(c.j)(n,a,b,o));var y=\"\",x=!0,v=b.map((function(e){return e[u]})).join(\",\");if(\"text\"===d)y=b.map((function(e){return\"\".concat(h.left).concat(e[u]).concat(h.right)})).join(h.separator);else if(\"block\"===d){x=!1;var g=L(b),_={backgroundColor:r.color},w=h.showCount<=0?g.length:h.showCount;y=g.splice(0,w).map((function(e){var n={width:h.showIcon?\"calc(100% - 20px)\":\"100%\"};return m(\"div\",{class:[\"xm-label-block\",e[p]?\"disabled\":\"\"].join(\" \"),style:_},h.template&&Object(c.e)(h.template)?m(\"span\",{style:n,dangerouslySetInnerHTML:{__html:h.template(e,g)}}):m(\"span\",{style:n},e[u]),h.showIcon&&m(\"i\",{class:\"xm-iconfont xm-icon-close\",onClick:t.iconClick.bind(t,e,!0,e[p])}))})),g.length&&y.push(m(\"div\",{class:\"xm-label-block\",style:_},\"+ \",g.length))}else if(\"search\"==d){x=!1;var k=\"\";b.length&&(k=b[0][u]),y=m(\"input\",{class:\"label-search-input\",type:\"text\",placeholder:e.searchTips,style:{width:\"100%\",border:\"none\"},value:k,onInput:function(e){t.props.onReset(e,\"labelSearch\")},onCompositionstart:function(e){t.props.onReset(e,\"labelSearch\")},compositionupdate:function(e){t.props.onReset(e,\"labelSearch\")},compositionend:function(e){t.props.onReset(e,\"labelSearch\")},onClick:function(e){e.stopPropagation()}})}else y=b.length&&h&&h.template?h.template(n,b):b.map((function(e){return e[u]})).join(\",\");return m(\"div\",{class:[\"xm-label\",l?\"auto-row\":\"single-row\"].join(\" \")},m(\"div\",{class:\"scroll\",ref:function(e){return t.labelRef=e}},x?m(\"div\",{class:\"label-content\",dangerouslySetInnerHTML:{__html:y}}):m(\"div\",{class:\"label-content\",title:v},y)))}}])&&F(t.prototype,n),o&&F(t,o),i}(x);function q(e){return(q=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function Y(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Z(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Y(Object(n),!0).forEach((function(t){Q(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Y(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Q(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function J(e){return function(e){if(Array.isArray(e))return W(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if(\"string\"==typeof e)return W(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return W(e,t)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function W(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function G(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function X(e,t){return(X=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function $(e){var t=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=te(e);if(t){var r=te(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return ee(this,n)}}function ee(e,t){return!t||\"object\"!==q(t)&&\"function\"!=typeof t?function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e):t}function te(e){return(te=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var ne={},oe=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&X(e,t)}(i,e);var t,n,o,r=$(i);function i(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,i),(t=r.call(this,e)).setState({filterValue:\"\",remote:!0,loading:!1,pageIndex:1,totalSize:0,val:ne}),t.searchCid=0,t.inputOver=!0,t.__value=\"\",t.tempData=[],t.size=0,t}return t=i,(n=[{key:\"optionClick\",value:function(e,t,n,o){this.props.ck(e,t,n),this.focus(),this.blockClick(o)}},{key:\"groupClick\",value:function(e,t){var n=this.props.prop,o=n.click,r=n.children,i=n.disabled,a=e[o],l=e[r].filter((function(e){return!e[i]}));\"SELECT\"===a?this.props.onReset(l,\"append\"):\"CLEAR\"===a?this.props.onReset(l,\"delete\"):\"AUTO\"===a?this.props.onReset(l,\"auto\"):Object(c.e)(a)&&a(e),this.focus(),this.blockClick(t)}},{key:\"blockClick\",value:function(e){e.stopPropagation()}},{key:\"pagePrevClick\",value:function(){arguments.length>0&&void 0!==arguments[0]||this.size;var e=this.state.pageIndex;e<=1||(this.changePageIndex(e-1),this.props.pageRemote&&this.postData(e-1,!0))}},{key:\"pageNextClick\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.size,t=this.state.pageIndex;t>=e||(this.changePageIndex(t+1),this.props.pageRemote&&this.postData(t+1,!0))}},{key:\"changePageIndex\",value:function(e){this.setState({pageIndex:e})}},{key:\"labelSearch\",value:function(e){\"input\"==e.type?this.searchInput(e):this.handleComposition(e)}},{key:\"searchInput\",value:function(e){var t=this,n=e.target.value;n!==this.__value&&(this.searchCid&&clearTimeout(this.searchCid),this.inputOver&&(this.__value=n,this.searchCid=setTimeout((function(){t.callback=!0,t.setState({filterValue:t.__value,remote:!0,pageIndex:1})}),this.props.delay)))}},{key:\"focus\",value:function(){this.searchInputRef&&this.searchInputRef.focus()}},{key:\"blur\",value:function(){this.searchInputRef&&this.searchInputRef.blur()}},{key:\"handleComposition\",value:function(e){var t=e.type;\"compositionstart\"===t?(this.inputOver=!1,this.searchCid&&clearTimeout(this.searchCid)):\"compositionend\"===t&&(this.inputOver=!0,this.searchInput(e))}},{key:\"postData\",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.pageIndex,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];(this.state.remote||n)&&(this.callback=!1,this.setState({loading:!0,remote:!1}),this.blur(),this.props.remoteMethod(this.state.filterValue,(function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;setTimeout((function(){e.focus(),e.callback=!0,e.setState({loading:!1,totalSize:n}),e.props.onReset(t,\"data\")}),10)}),this.props.show,t))}},{key:\"keydown\",value:function(e,t){var n=this,o=t.keyCode;if(\"div\"===e&&(27===o||9===o?this.props.onReset(!1,\"close\"):37===o?this.pagePrevClick():39===o&&this.pageNextClick()),this.props.enableKeyboard){var r=this.props.prop,i=r.value,a=r.optgroup,l=r.disabled,s=this.tempData.filter((function(e){return!e[a]&&!e[l]})),c=s.length-1;if(-1===c)return;var u=s.findIndex((function(e){return e[i]===n.state.val}));if(38===o){u<=0?u=c:u>0&&(u-=1);var p=s[u][i];this.setState({val:p}),this.viewTo(p)}else if(40===o){-1===u||u===c?u=0:u<c&&(u+=1);var f=s[u][i];this.setState({val:f}),this.viewTo(f)}else if(o===this.props.selectedKeyCode&&this.state.val!=ne){var d=s[u];this.optionClick(d,-1!=this.props.sels.findIndex((function(e){return e[i]===n.state.val})),d[l],t)}}}},{key:\"viewTo\",value:function(e){if(null!=this.base){var t=this.base.querySelector('.xm-option[value=\"'.concat(e,'\"]'));t&&t.scrollIntoView(!1)}}},{key:\"componentWillReceiveProps\",value:function(e){var t=this;this.props.show!=e.show&&(e.show?setTimeout((function(){\"search\"===e.model.label.type||(e.filterable?t.focus():t.base.focus())}),0):(this.setState({filterValue:\"\",val:ne}),this.__value=\"\",this.searchInputRef&&(this.searchInputRef.value=\"\"),this.props.onReset(\"\",\"labelSearchBlur\"))),this.props.__update!=e.__update&&this.setState({remote:!0})}},{key:\"render\",value:function(e){var t,n=this,o=e.data,r=e.flatData,i=e.prop,a=e.template,l=e.theme,s=e.radio,u=e.sels,p=e.empty,f=e.filterable,d=e.filterMethod,h=e.remoteSearch,b=(e.remoteMethod,e.delay,e.searchTips),y=e.create,x=e.pageRemote,v=e.max,g=e.enableKeyboard,_=e.enableHoverFirst,w=i.name,k=i.value,O=i.disabled,C=i.children,j=i.optgroup,S=Object(c.b)([],r);if((x||f&&h)&&this.postData(),f&&!h&&!x){S=S.filter((function(e,t){return e[j]?(delete e.__del,!0):d(n.state.filterValue,e,t,i)}));for(var E=0;E<S.length-1;E++){var A=S[E],R=S[E+1];A[j]&&R[j]&&(S[E].__del=!0)}S.length&&S[S.length-1][j]&&(S[S.length-1].__del=!0),S=S.filter((function(e){return!e.__del})),t=this.state.filterValue&&Object(c.e)(y)}var P=m(\"div\",{class:f&&\"search\"!=e.model.label.type?\"xm-search\":\"xm-search dis\"},m(\"i\",{class:\"xm-iconfont xm-icon-sousuo\"}),m(\"input\",{class:\"xm-input xm-search-input\",placeholder:b})),I={};S.filter((function(e){return e[j]})).forEach((function(e,t){I[t]=e,e[C].forEach((function(e){return e.__group__index=t}))})),S=S.filter((function(e){return!e[j]}));var D=\"\";if(e.paging){var M=x?this.state.totalSize:Math.floor((S.length-1)/e.pageSize)+1;M<=0&&(M=1);var T=this.state.pageIndex;if(T>M&&(T=M),M>0&&T<=0&&(T=1),!x){var z=(T-1)*e.pageSize,L=z+e.pageSize;S=S.slice(z,L)}var V={cursor:\"no-drop\",color:\"#d2d2d2\"},F={},U={};T<=1&&(F=V),T==M&&(U=V),this.state.pageIndex!==T&&this.changePageIndex(T),this.size=M,D=m(\"div\",{class:\"xm-paging\"},m(\"span\",{style:F,onClick:this.pagePrevClick.bind(this,M)},e.languageProp.paging.prev),m(\"span\",null,this.state.pageIndex,\" / \",M),m(\"span\",{style:U,onClick:this.pageNextClick.bind(this,M)},e.languageProp.paging.next))}else e.showCount>0&&(S=S.slice(0,e.showCount));var N,B,K=[],H={__tmp:!0};H[j]=!0,S.forEach((function(e){var t=I[e.__group__index];delete e.__group__index,N&&!t&&(t=H),t!=N&&(N=t,t&&K.push(N)),K.push(e)})),S=K,t&&null!=(t=y(this.state.filterValue,Object(c.b)([],S)))&&(B=S).splice.apply(B,[0,0].concat(J((Object(c.d)(t)?t:[t]).map((function(e){return Z(Z({},e),{},{__node:{}})})))));var q=Object(c.b)([],S);this.tempData=q;var Y=m(\"div\",{class:\"xm-toolbar\"},e.toolbar.list.map((function(t){var o,r=e.languageProp.toolbar[t];o=\"ALL\"===t?{icon:\"xm-iconfont xm-icon-quanxuan\",name:r,method:function(e){var t=i.optgroup,o=i.disabled,r=e.filter((function(e){return!e[t]})).filter((function(e){return!e[o]})),a=u.filter((function(e){return e[i.disabled]})),l=[];l=s?a.length?a:r.slice(0,1):v>0?a.length>=v?a:Object(c.f)(r.slice(0,v-a.length),a,i):Object(c.f)(r,u,i),n.props.onReset(l,\"sels\")}}:\"CLEAR\"===t?{icon:\"xm-iconfont xm-icon-qingkong\",name:r,method:function(e){n.props.onReset(u.filter((function(e){return e[i.disabled]})),\"sels\")}}:\"REVERSE\"===t?{icon:\"xm-iconfont xm-icon-fanxuan\",name:r,method:function(e){var t=i.optgroup,o=i.disabled,r=e.filter((function(e){return!e[t]})).filter((function(e){return!e[o]})),a=[];u.forEach((function(e){var t=r.findIndex((function(t){return t[k]===e[k]}));-1==t?a.push(e):r.splice(t,1)}));var l=a.filter((function(e){return e[i.disabled]})),p=[];p=s?l.length?l:r.slice(0,1):v>0?l.length>=v?l:Object(c.f)(r.slice(0,v-l.length),l,i):Object(c.f)(r,a,i),n.props.onReset(p,\"sels\")}}:t;var a=function(e){\"mouseenter\"===e.type&&(e.target.style.color=l.color),\"mouseleave\"===e.type&&(e.target.style.color=\"\")};return m(\"div\",{class:\"toolbar-tag\",style:{},onClick:function(){Object(c.e)(o.method)&&o.method(q),n.focus()},onMouseEnter:a,onMouseLeave:a},e.toolbar.showIcon&&m(\"i\",{class:o.icon}),m(\"span\",null,o.name))})).filter((function(e){return e}))),Q=\"hidden\"!=e.model.icon;return(S=S.map((function(t){return t[j]?t.__tmp?m(\"div\",{class:\"item--divided\"}):m(\"div\",{class:\"xm-group\"},m(\"div\",{class:\"xm-group-item\",onClick:n.groupClick.bind(n,t)},t[w])):function(t){var r=!!u.find((function(e){return e[k]==t[k]})),i=r?{color:l.color,border:\"none\"}:{borderColor:l.color},c={};g&&t[k]===n.state.val&&(c.backgroundColor=l.hover),!Q&&r&&(c.backgroundColor=l.color,t[O]&&(c.backgroundColor=\"#C2C2C2\"));var p,f,d=[\"xm-option\",t[O]?\" disabled\":\"\",r?\" selected\":\"\",Q?\"show-icon\":\"hide-icon\"].join(\" \"),h=[\"xm-option-icon\",(p=e.iconfont.select,f=e.iconfont.unselect,(p?!r&&f?f+\" xm-custom-icon\":p:0)||\"xm-iconfont \"+(s?\"xm-icon-danx\":\"xm-icon-duox\"))].join(\" \"),b=function(e){\"mouseenter\"===e.type?t[O]||(g?n.setState({val:t[k]}):e.target.style.backgroundColor=l.hover):\"mouseleave\"===e.type&&(t[O]||g||(e.target.style.backgroundColor=\"\"))};return m(\"div\",{class:d,style:c,value:t[k],onClick:n.optionClick.bind(n,t,r,t[O]),onMouseEnter:b,onMouseLeave:b},Q&&m(\"i\",{class:h,style:i}),m(\"div\",{class:\"xm-option-content\",dangerouslySetInnerHTML:{__html:a({data:o,item:t,arr:u,name:t[w],value:t[k]})}}))}(t)}))).length?_&&this.state.val==ne&&this.keydown(\"div\",{keyCode:40}):(!e.pageEmptyShow&&(D=\"\"),S.push(m(\"div\",{class:\"xm-select-empty\"},p))),m(\"div\",{onClick:this.blockClick,tabindex:\"1\",style:\"outline: none;\"},m(\"div\",null,e.toolbar.show&&Y,P,m(\"div\",{class:\"scroll-body\",style:{maxHeight:e.height}},S),e.paging&&D),this.state.loading&&m(\"div\",{class:\"loading\"},m(\"span\",{class:\"loader\"})))}},{key:\"componentDidMount\",value:function(){var e=this.base.querySelector(\".xm-search-input\");e&&(e.addEventListener(\"compositionstart\",this.handleComposition.bind(this)),e.addEventListener(\"compositionupdate\",this.handleComposition.bind(this)),e.addEventListener(\"compositionend\",this.handleComposition.bind(this)),e.addEventListener(\"input\",this.searchInput.bind(this)),this.searchInputRef=e),this.base.addEventListener(\"keydown\",this.keydown.bind(this,\"div\"))}},{key:\"componentDidUpdate\",value:function(){if(this.callback){this.callback=!1;var e=this.props.filterDone;Object(c.e)(e)&&e(this.state.filterValue,this.tempData||[])}}}])&&G(t.prototype,n),o&&G(t,o),i}(x);function re(e){return(re=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function ie(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function ae(e,t){return(ae=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function le(e){var t=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=ce(e);if(t){var r=ce(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return se(this,n)}}function se(e,t){return!t||\"object\"!==re(t)&&\"function\"!=typeof t?function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e):t}function ce(e){return(ce=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var ue=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&ae(e,t)}(i,e);var t,n,o,r=le(i);function i(e){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,i),r.call(this,e)}return t=i,(n=[{key:\"blockClick\",value:function(e){e.stopPropagation()}},{key:\"shouldComponentUpdate\",value:function(){return!this.prepare}},{key:\"render\",value:function(e){return this.prepare=!0,m(\"div\",{onClick:this.blockClick,class:\"xm-body-custom\"},m(\"div\",{class:\"scroll-body\",style:{maxHeight:e.height}},m(\"div\",{style:\"margin: 5px 0\",dangerouslySetInnerHTML:{__html:e.content}})))}}])&&ie(t.prototype,n),o&&ie(t,o),i}(x);function pe(e){return(pe=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function fe(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function de(e,t){return(de=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function he(e){var t=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=be(e);if(t){var r=be(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return me(this,n)}}function me(e,t){return!t||\"object\"!==pe(t)&&\"function\"!=typeof t?function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e):t}function be(e){return(be=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var ye={},xe=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&de(e,t)}(i,e);var t,n,o,r=he(i);function i(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,i),(t=r.call(this,e)).state={expandedKeys:[],filterValue:\"\",remote:!0,loading:!1,val:ye},t.searchCid=0,t.inputOver=!0,t.__value=\"\",t.tempData=[],t.__skipAutoExpand=\"\",t}return t=i,(n=[{key:\"init\",value:function(e){var t=e.tree,n=e.dataObj,o=e.flatData,r=e.prop,i=r.value,a=r.optgroup,l=[];!0===t.expandedKeys?l=o.filter((function(e){return!0===e[a]})).map((function(e){return e[i]})):!1===t.expandedKeys||t.expandedKeys.forEach((function(e){l.push(e);for(var t=n[e],o=function(){var e=t[i];-1===l.findIndex((function(t){return t===e}))&&l.push(e),t=t.__node.parent};t;)o()})),this.setState({expandedKeys:l})}},{key:\"blockClick\",value:function(e){e.stopPropagation()}},{key:\"optionClick\",value:function(e,t,n,o,r){var i=this;if(\"line\"===o){if(!0===e.__node.loading)return;var a=this.props,l=a.tree,s=a.prop,u=a.sels,p=l.clickExpand,f=l.clickCheck,d=r.target&&Object(c.e)(r.target.getAttribute)&&\"expand\"===r.target.getAttribute(\"type\");if(p||d){if(!l.lazy&&!e[s.optgroup])return void this.props.ck(e,t,n);var h=e[this.props.prop.value],m=this.state.expandedKeys,b=m.findIndex((function(e){return e===h}));-1===b?m.push(h):m.splice(b,1),this.setState({expandedKeys:m});var y=e[s.children];l.lazy&&y&&0===y.length&&!1!==e.__node.loading&&(e.__node.loading=!0,l.load(e,(function(t){e.__node.loading=!1,e[s.children]=i.handlerData(t,s.children),e[s.selected]=-1!=u.findIndex((function(t){return t[s.value]===e[s.value]})),i.props.onReset(u,\"treeData\")})))}else f&&(o=\"checkbox\")}\"checkbox\"===o&&this.props.ck(e,t,n),this.blockClick(r)}},{key:\"handlerData\",value:function(e,t){var n=this;return e.map((function(e){return e.__node={},e[t]&&(e[t]=n.handlerData(e[t],t)),e}))}},{key:\"searchInput\",value:function(e){var t=this,n=e.target.value;n!==this.__value&&(clearTimeout(this.searchCid),this.inputOver&&(this.__value=n,this.searchCid=setTimeout((function(){t.callback=!0,t.setState({filterValue:t.__value,remote:!0})}),this.props.delay)))}},{key:\"focus\",value:function(){this.searchInputRef&&this.searchInputRef.focus()}},{key:\"blur\",value:function(){this.searchInputRef&&this.searchInputRef.blur()}},{key:\"handleComposition\",value:function(e){var t=e.type;\"compositionstart\"===t?(this.inputOver=!1,clearTimeout(this.searchCid)):\"compositionend\"===t&&(this.inputOver=!0,this.searchInput(e))}},{key:\"filterData\",value:function(e,t,n){var o=this,r=this.props,i=r.prop,a=r.filterMethod,l=r.tree,s=i.children,c=i.optgroup,u=(i.name,i.value);return e.forEach((function(e,r){var p,f=!!t&&!a(t,e,r,i);if(l.strict?p=!1:f=p=!1!==n&&f,e[c]){var d=o.filterData(e[s],t,p),h=!!t&&0===d.filter((function(e){return!e.__node.hidn})).length;if(!(f=(l.strict||p)&&h)&&o.__skipAutoExpand!=t){var m=o.state.expandedKeys;t&&-1===m.findIndex((function(t){return t===e[u]}))&&(m.push(e[u]),o.setState({expandedKeys:m})),o.__skipAutoExpand=t}}e.__node.hidn=f})),e}},{key:\"postData\",value:function(){var e=this;this.state.remote&&(this.callback=!1,this.setState({loading:!0,remote:!1}),this.blur(),this.props.remoteMethod(this.state.filterValue,(function(t,n){e.focus(),e.callback=!0,e.setState({loading:!1,totalSize:n}),e.props.onReset(t,\"data\")}),this.props.show,1))}},{key:\"componentWillReceiveProps\",value:function(e){var t=this;this.props.show!=e.show&&(e.show?setTimeout((function(){return t.focus()}),0):(this.setState({filterValue:\"\",val:ye}),this.__value=\"\",this.__skipAutoExpand=\"\",this.searchInputRef&&(this.searchInputRef.value=\"\")))}},{key:\"componentWillMount\",value:function(){this.init(this.props)}},{key:\"render\",value:function(e,t){var n=this,o=(t.expandedKeys,e.prop),r=e.empty,i=e.sels,a=e.theme,l=e.radio,s=e.template,u=e.data,p=e.tree,f=e.filterable,d=e.remoteSearch,h=e.searchTips,b=e.iconfont,y=e.enableKeyboard,x=o.name,v=o.value,g=o.disabled,_=o.children,w=o.optgroup,k=\"hidden\"!=e.model.icon,O=function(e,t,o){var r=!!i.find((function(t){return t[v]==e[v]})),c=e[g],f=!0===e.__node.half;p.strict&&(r=r||f||e.__node.selected,c=c||e.__node.disabled);var d=r?{color:a.color,border:\"none\"}:{borderColor:a.color},h={paddingLeft:t+\"px\"};y&&e[v]===n.state.val&&(h.backgroundColor=a.hover),!k&&r&&(h.backgroundColor=a.color,c&&(h.backgroundColor=\"#C2C2C2\"));var w=[\"xm-option\",c?\" disabled\":\"\",r?\" selected\":\"\",k?\"show-icon\":\"hide-icon\"].join(\" \"),O=0!==o&&\"hidden\"===b.parent?\"xm-option-icon-hidden\":[\"xm-option-icon\",(f?b.half?b.half+\" xm-custom-icon\":0:0!==o&&b.parent?b.parent+\" xm-custom-icon\":r?b.select?b.select:0:b.unselect?b.unselect+\" xm-custom-icon\":0)||\"xm-iconfont \"+(l?\"xm-icon-danx\":p.strict&&f?\"xm-icon-banxuan\":\"xm-icon-duox\")].join(\" \"),C=[\"xm-tree-icon\",o?\"expand\":\"\",e[_]&&(e[_].length>0||p.lazy&&!1!==e.__node.loading)?\"xm-visible\":\"xm-hidden\"].join(\" \"),j=[];p.showFolderIcon&&(j.push(m(\"i\",{class:C,type:\"expand\"})),p.showLine&&(o&&j.push(m(\"i\",{class:\"left-line\",style:{left:t-p.indent+3+\"px\"}})),j.push(m(\"i\",{class:\"top-line\",style:{left:t-p.indent+3+\"px\",width:p.indent+(0===o?10:-2)+\"px\"}}))));var S=function(t){\"mouseenter\"===t.type?e[g]||(y?n.setState({val:e[v]}):t.target.style.backgroundColor=a.hover):\"mouseleave\"===t.type&&(e[g]||y||(t.target.style.backgroundColor=\"\"))};return m(\"div\",{class:w,style:h,value:e[v],onClick:n.optionClick.bind(n,e,r,e[g],\"line\"),onMouseEnter:S,onMouseLeave:S},j,e.__node.loading&&m(\"span\",{class:\"loader\"}),k&&m(\"i\",{class:O,style:d,onClick:n.optionClick.bind(n,e,r,e[g],\"checkbox\")}),m(\"div\",{class:\"xm-option-content\",dangerouslySetInnerHTML:{__html:s({data:u,item:e,arr:i,name:e[x],value:e[v]})}}))};f&&(d?this.postData():this.filterData(u,this.state.filterValue));var C=Object(c.b)([],u),j=Object(c.b)([],i);this.tempData=C;var S=u.map((function(e){return function e(t,o){if(!t.__node.hidn){var r=t[_];if(o+=p.indent,r){var i=-1!==n.state.expandedKeys.findIndex((function(e){return t[v]===e}));return 0===r.length&&(i=!1),m(\"div\",{class:\"xm-tree\"},p.showFolderIcon&&p.showLine&&i&&r.length>0&&m(\"i\",{class:\"left-line left-line-group\",style:{left:o+3+\"px\"}}),O(t,o,0===r.length&&(!p.lazy||p.lazy&&!1===t.__node.loading)?0:i),i&&m(\"div\",{class:\"xm-tree-box\"},r.map((function(t){return e(t,o)}))))}return O(t,o,0)}}(e,10-p.indent)})).filter((function(e){return e}));function E(e,t){t.forEach((function(t){t[w]?(p.strict||\"hidden\"===b.parent||e.push(t),E(e,t[_])):e.push(t)}))}var A=m(\"div\",{class:\"xm-toolbar\"},e.toolbar.list.map((function(t){var r,s=e.languageProp.toolbar[t];r=\"ALL\"===t?{icon:\"xm-iconfont xm-icon-quanxuan\",name:s,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[g]&&!e.__node.hidn})),n.props.onReset(l?t.slice(0,1):Object(c.f)(t,i,o),\"treeData\")}}:\"CLEAR\"===t?{icon:\"xm-iconfont xm-icon-qingkong\",name:s,method:function(e){n.props.onReset(i.filter((function(e){return e[o.disabled]})),\"treeData\")}}:\"REVERSE\"===t?{icon:\"xm-iconfont xm-icon-fanxuan\",name:s,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[g]&&!e.__node.hidn}));var r=[];i.forEach((function(e){var n=t.findIndex((function(t){return t[v]===e[v]}));-1==n?r.push(e):t.splice(n,1)})),n.props.onReset(l?r.slice(0,1):Object(c.f)(t,r,o),\"treeData\")}}:t;var u=function(e){\"mouseenter\"===e.type&&(e.target.style.color=a.color),\"mouseleave\"===e.type&&(e.target.style.color=\"\")};return m(\"div\",{class:\"toolbar-tag\",onClick:function(){Object(c.e)(r.method)&&r.method(C,j)},onMouseEnter:u,onMouseLeave:u},e.toolbar.showIcon&&m(\"i\",{class:r.icon}),m(\"span\",null,r.name))})).filter((function(e){return e}))),R=m(\"div\",{class:f?\"xm-search\":\"xm-search dis\"},m(\"i\",{class:\"xm-iconfont xm-icon-sousuo\"}),m(\"input\",{class:\"xm-input xm-search-input\",placeholder:h}));return S.length||S.push(m(\"div\",{class:\"xm-select-empty\"},r)),m(\"div\",{onClick:this.blockClick,class:\"xm-body-tree\"},e.toolbar.show&&A,R,m(\"div\",{class:\"scroll-body\",style:{maxHeight:e.height}},S),this.state.loading&&m(\"div\",{class:\"loading\"},m(\"span\",{class:\"loader\"})))}},{key:\"componentDidMount\",value:function(){var e=this.base.querySelector(\".xm-search-input\");e&&(e.addEventListener(\"compositionstart\",this.handleComposition.bind(this)),e.addEventListener(\"compositionupdate\",this.handleComposition.bind(this)),e.addEventListener(\"compositionend\",this.handleComposition.bind(this)),e.addEventListener(\"input\",this.searchInput.bind(this)),this.searchInputRef=e)}},{key:\"componentDidUpdate\",value:function(){if(this.callback){this.callback=!1;var e=this.props.filterDone;Object(c.e)(e)&&e(this.state.filterValue,this.tempData||[])}}}])&&fe(t.prototype,n),o&&fe(t,o),i}(x);function ve(e){return(ve=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function ge(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function _e(e,t){return(_e=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function we(e){var t=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=Oe(e);if(t){var r=Oe(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return ke(this,n)}}function ke(e,t){return!t||\"object\"!==ve(t)&&\"function\"!=typeof t?function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}(e):t}function Oe(e){return(Oe=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var Ce=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_e(e,t)}(i,e);var t,n,o,r=we(i);function i(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,i),(t=r.call(this,e)).state={expand:[]},t}return t=i,(n=[{key:\"blockClick\",value:function(e){e.stopPropagation()}},{key:\"optionClick\",value:function(e,t,n,o,r,i){if(\"line\"===o){if(!e.optgroup&&n)return;if(!0===e.__node.loading)return;var a=this.props,l=a.cascader,s=a.prop;if(a.sels,!l.lazy&&!e[s.optgroup])return void this.props.ck(e,t,n);var c=this.state.expand.slice(0,r+1);c[r]=e[this.props.prop.value],this.setState({expand:c})}else\"checkbox\"===o&&this.props.ck(e,t,n);this.blockClick(i)}},{key:\"componentWillReceiveProps\",value:function(e){}},{key:\"componentWillMount\",value:function(){}},{key:\"render\",value:function(e,t){var n=this,o=e.prop,r=e.empty,i=e.sels,a=e.theme,l=e.radio,s=e.template,c=e.data,u=e.cascader,p=o.name,f=o.value,d=o.disabled,h=o.children,b=o.optgroup,y=\"hidden\"!=e.model.icon,x=[],v=function t(o,r,v){var g=o[h];r=r+u.indent+6;var _=g&&n.state.expand[v]===o[f];return _&&x.push(m(\"div\",{class:\"xm-cascader-box\",index:v%4,style:{left:r+\"px\",width:u.indent+\"px\"}},m(\"div\",{class:\"xm-cascader-scroll scroll-body\"},g.map((function(e){return t(e,r,v+1)}))))),function(t,o,r,x){var v=!!i.find((function(e){return e[f]==t[f]})),g=t[d],_=!0===t.__node.half;u.strict&&(v=v||_||t.__node.selected,g=g||t.__node.disabled);var w=v?{color:a.color,border:\"none\"}:{borderColor:a.color},k=t[h]&&t[h].length>0,O={backgroundColor:\"transparent\"},C=[\"xm-option\",g?\" disabled\":\"\",v?\" selected\":\"\",y?\"show-icon\":\"hide-icon\"].join(\" \"),j=k&&\"hidden\"===e.iconfont.parent?\"xm-option-icon-hidden\":[\"xm-option-icon\",(_?e.iconfont.half?e.iconfont.half+\" xm-custom-icon\":0:k&&e.iconfont.parent?e.iconfont.parent+\" xm-custom-icon\":v?e.iconfont.select?e.iconfont.select:0:e.iconfont.unselect?e.iconfont.unselect+\" xm-custom-icon\":0)||\"xm-iconfont \"+(l?\"xm-icon-danx\":u.strict&&_?\"xm-icon-banxuan\":\"xm-icon-duox\")].join(\" \");t[f]===n.state.val&&(O.backgroundColor=a.hover),!y&&v&&(O.backgroundColor=a.color,g&&(O.backgroundColor=\"#C2C2C2\"));var S={},E={};x&&(S.color=a.color,S.fontWeight=700,E.color=a.color);var A=function(e){\"mouseenter\"===e.type?t[d]||n.setState({val:t[f]}):\"mouseleave\"===e.type&&n.setState({val:\"\"})};return m(\"div\",{class:C,style:O,value:t[f],onClick:n.optionClick.bind(n,t,v,g,\"line\",r),onMouseEnter:A,onMouseLeave:A},y&&m(\"i\",{class:j,style:w,onClick:n.optionClick.bind(n,t,v,g,\"checkbox\",r)}),m(\"div\",{class:\"xm-option-content\",style:S,dangerouslySetInnerHTML:{__html:s({data:c,item:t,arr:i,name:t[p],value:t[f]})}}),t[b]&&m(\"div\",{class:\"xm-right-arrow\",style:E}))}(o,0,v,_)},g=c.map((function(e){return v(e,2,0)})).concat(x).filter((function(e){return e}));return g.length||g.push(m(\"div\",{class:\"xm-select-empty\"},r)),m(\"div\",{onClick:this.blockClick,class:\"xm-body-cascader scroll-body\",style:{width:u.indent+\"px\",maxHeight:e.height}},g)}},{key:\"componentDidMount\",value:function(){this.props.onReset(\"cascader\",\"class\")}}])&&ge(t.prototype,n),o&&ge(t,o),i}(x);function je(){return(je=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}function Se(e){return function(e){if(Array.isArray(e))return Ee(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if(\"string\"==typeof e)return Ee(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ee(e,t)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function Ee(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}function Ae(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Re(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ae(Object(n),!0).forEach((function(t){Pe(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ae(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Pe(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Ie(e){return(Ie=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function De(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function Me(e,t){return(Me=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function Te(e){var t=function(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,o=Ve(e);if(t){var r=Ve(this).constructor;n=Reflect.construct(o,arguments,r)}else n=o.apply(this,arguments);return ze(this,n)}}function ze(e,t){return!t||\"object\"!==Ie(t)&&\"function\"!=typeof t?Le(e):t}function Le(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function Ve(e){return(Ve=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}var Fe=function(e){!function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&Me(e,t)}(i,e);var t,n,o,r=Te(i);function i(e){var t;return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,i),t=r.call(this,e),et[e.el]=Le(t),t.state=t.initState(),t.bodyView=null,t}return t=i,(n=[{key:\"initState\",value:function(){return{data:[],dataObj:{},flatData:[],sels:[],show:!1,tmpColor:\"\",bodyClass:\"\",time:0}}},{key:\"init\",value:function(e,t){var n,o=e.data,r=e.prop,i=e.initValue,a=e.radio,l=e.tree,s=e.cascader;if(t){var c={},u=[];this.load(o,c,u,null,0,i?i.map((function(e){return\"object\"===Ie(e)?e[r.value]:e})):null),n=this.exchangeValue(i||Object.keys(c).filter((function(e){return!0===c[e][r.selected]})),c),a&&n.length>1&&(n=n.slice(0,1),(l.show&&l.strict||s.show&&s.strict)&&this.clearAndReset(o,n,!1)),this.setState({sels:n,dataObj:c,flatData:u})}return this.setState({data:o}),n}},{key:\"upDate\",value:function(e,t){var n=this.state.dataObj,o=this.props,r=o.prop,i=o.tree,a=o.cascader,l=r.value,s=r.disabled,u=r.children;e.map((function(e){return n[\"object\"===Ie(e)?e[l]:e]})).filter((function(e){return e})).forEach((function(e){if(e[s]=!t,i.show&&i.strict||a.show&&a.strict){if(t)for(var n=e;n;)n[s]=!1,n=n.__node.parent;!function e(n){n[s]=!t;var o=n[u];o&&Object(c.d)(o)&&o.forEach((function(t){return e(t)}))}(e)}})),this.setState({dataObj:n})}},{key:\"exchangeValue\",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.state.dataObj,o=this.props,r=o.prop,i=o.tree,a=o.cascader,l=(o.data,r.children),s=r.value,u=e.map((function(e){return\"object\"===Ie(e)?Re(Re({},e),{},{__node:{}}):n[e]})).filter((function(e){return e})),p=Se(u);if(i.show&&i.strict||a.show&&a.strict){var f=function e(t,n){var o=n[l];o&&Object(c.d)(o)&&o.forEach((function(n){-1===u.findIndex((function(e){return e[s]===n[s]}))&&t.push(n),e(t,n)}))},d={};d[l]=u,f(p,d),p=p.filter((function(e){return!0!==e[t.props.prop.optgroup]}))}return p}},{key:\"value\",value:function(e,t,n,o){var r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];!1!==t&&!0!==t&&(t=this.state.show);var i=this.props,a=i.prop,l=i.tree,s=i.cascader,c=this.exchangeValue(e);if(!this.checkMax(c,c,!0)){if(l.show&&l.strict||s.show&&s.strict){var u=this.state.data;this.clearAndReset(u,c,!1),c=this.init({data:u,prop:a},!0)}this.resetSelectValue(c,o||c,r,n),this.setState({show:t})}}},{key:\"clearAndReset\",value:function(e,t,n){var o=this,r=this.props.prop,i=r.selected,a=r.disabled,l=r.children,s=r.value;e.forEach((function(e){e[i]=-1!=t.findIndex((function(t){return t[s]===e[s]}))||n;var r=e[l];if(r&&Object(c.d)(r)&&r.length>0){o.clearAndReset(r,t,e[i]);var u=r.length,p=r.filter((function(e){return!0===e[i]||!0===e.__node.selected})).length;e.__node.selected=p===u,e.__node.half=p>0&&p<u||r.filter((function(e){return!0===e.__node.half})).length>0,e.__node.disabled=r.filter((function(e){return!0===e[a]||!0===e.__node.disabled})).length===u}}))}},{key:\"load\",value:function(e,t,n,o){var r=this,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,a=arguments.length>5?arguments[5]:void 0,l=this.props,s=l.prop,u=l.tree,p=l.cascader,f=s.children,d=s.optgroup,h=s.value,m=s.selected,b=s.disabled;e.forEach((function(e){e.__node={parent:o,level:i,loading:e.__node&&e.__node.loading},a&&(delete e[m],a.find((function(t){return t===e[h]}))&&(e[m]=!0)),t[e[h]]=e,n.push(e);var l=e[f];if(l&&Object(c.d)(l)){var s=l.length;if(s>0){r.load(l,t,n,e,i+1,a),e[d]=!0,(u.show&&u.strict||p.show&&p.strict)&&(!0===e[m]&&(delete e[m],l.forEach((function(e){return e[m]=!0}))),!0===e[b]&&(delete e[b],l.forEach((function(e){return e[b]=!0}))));var y=l.filter((function(e){return!0===e[m]||!0===e.__node.selected})).length;e.__node.selected=y===s,e.__node.half=y>0&&y<s||l.filter((function(e){return!0===e.__node.half})).length>0,e.__node.disabled=l.filter((function(e){return!0===e[b]||!0===e.__node.disabled})).length===s}}}))}},{key:\"resetSelectValue\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0,o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=this.props.on;if(Object(c.e)(r)&&this.prepare&&o){var i=r({arr:e,change:t,isAdd:n});if(Object(c.d)(i))return this.value(i,null,!1)}this.setState({sels:e})}},{key:\"updateBorderColor\",value:function(e){this.setState({tmpColor:e})}},{key:\"treeHandler\",value:function(e,t,n,o,r){var i=this,a=this.props.prop,l=a.value,s=(a.selected,a.disabled),c=a.children,u=a.optgroup,p=t[c];if(p.filter((function(e){return!(e[s]||e.__node.disabled)})).forEach((function(t){if(t[u])i.treeHandler(e,t,n,o,r);else{var a=e.findIndex((function(e){return e[l]==t[l]}));\"del\"===o?-1!=a&&(e.splice(a,1),n.push(t)):\"half\"!==o&&\"add\"!==o||-1==a&&(e.push(t),n.push(t))}})),r){var f=p.length,d=p.filter((function(t){return-1!==e.findIndex((function(e){return e[l]===t[l]}))||!0===t.__node.selected})).length;t.__node.selected=d===f,t.__node.half=d>0&&d<f}}},{key:\"checkMax\",value:function(e,t,n){var o=this.props,r=o.max,i=o.maxMethod,a=o.theme,l=Object(c.i)(r),s=(n?t.length:(Object(c.d)(e)?e.length:1)+t.length)>l;if(l>0&&s)return this.updateBorderColor(a.maxColor),i&&Object(c.e)(i)&&i(t,e),!0}},{key:\"itemClick\",value:function(e,t,n,o){var r=this.props,i=(r.theme,r.prop),a=r.radio,l=r.repeat,s=r.clickClose,c=(r.max,r.maxMethod,r.tree),u=r.cascader,p=r.data,f=Se(this.state.sels),d=i.value,h=(i.selected,i.disabled,i.children),m=i.optgroup;if(!n){if(e[m]&&(c.show&&c.strict||u.show&&u.strict)){e[h];var b,y=[],x=!0;if(e.__node.selected?(b=\"del\",x=!1):e.__node.half?(b=\"half\",this.treeHandler(f,e,y,b),0===y.length&&(b=\"del\",x=!1)):b=\"add\",\"half\"!=b&&this.treeHandler(f,e,y,b),this.checkMax(y,f))return;f=Se(this.state.sels),y=[],this.treeHandler(f,e,y,b,!0),this.resetSelectValue(f,y,x),this.setState({data:this.state.data})}else if(!t||l&&!o){if(this.checkMax(e,f))return;f=a?[e]:[].concat(Se(f),[e]),this.clearAndReset(p,f,t),this.resetSelectValue(f,[e],!t)}else{var v=f.findIndex((function(t){return t[d]==e[d]}));-1!=v&&(f.splice(v,1),this.resetSelectValue(f,[e],!t))}var g=e.__node.parent;if(g){for(;g;){var _=g[h],w=_.length,k=_.filter((function(e){return-1!==f.findIndex((function(t){return t[d]===e[d]}))||!0===e.__node.selected})).length;g.__node.selected=k===w,g.__node.half=k>0&&k<w||_.filter((function(e){return!0===e.__node.half})).length>0,g=g.__node.parent}this.setState({data:this.state.data})}s&&!o&&this.onClick()}}},{key:\"onClick\",value:function(e){var t=this;if(\"relative\"!==this.props.model.type)if(this.props.disabled)!1!==this.state.show&&this.setState({show:!1});else{var n=!this.state.show;if(n){if(this.props.show&&0==this.props.show())return;Object.keys(Xe).filter((function(e){return e!=t.props.el})).forEach((function(e){return Xe[e].closed()}))}else{if(this.props.hide&&0==this.props.hide())return;this.bodyView.scroll&&this.bodyView.scroll(0,0)}this.setState({show:n}),e&&e.stopPropagation()}}},{key:\"onReset\",value:function(e,t){var n=this;if(\"data\"===t){var o=e.filter((function(e){return!0===e[n.props.prop.selected]}));this.resetSelectValue(Object(c.f)(o,this.state.sels,this.props.prop),o,!0);var r=[];this.load(e,{},r),this.setState({data:e,flatData:r})}else\"sels\"===t?this.resetSelectValue(e,e,!0):\"append\"===t?this.append(e):\"delete\"===t?this.del(e):\"auto\"===t?this.auto(e):\"treeData\"===t?this.value(e,null,!0,!1,!1):\"close\"===t?this.onClick():\"class\"===t?this.setState({bodyClass:e}):\"labelSearchBlur\"===t?this.labelRef.blur(e):\"labelSearch\"===t&&this.generalRef.labelSearch(e)}},{key:\"append\",value:function(e){var t=this.exchangeValue(e);this.value(Object(c.f)(t,this.state.sels,this.props.prop),this.props.show,!0,t)}},{key:\"del\",value:function(e){var t=this.props.prop.value,n=this.state.sels,o=this.exchangeValue(e);o.forEach((function(e){var o=n.findIndex((function(n){return n[t]===e[t]}));-1!=o&&n.splice(o,1)})),this.value(n,this.props.show,!0,o,!1)}},{key:\"auto\",value:function(e){var t=this,n=this.props.prop.value;e.filter((function(e){return-1!=t.state.sels.findIndex((function(t){return t[n]===e[n]}))})).length==e.length?this.del(e):this.append(e)}},{key:\"changeExpandedKeys\",value:function(e){var t=this.props,n=t.tree,o=t.prop,r=this.state,i=r.dataObj,a=r.flatData;n.show&&this.treeRef.init({dataObj:i,flatData:a,prop:o,tree:{expandedKeys:e}})}},{key:\"calcPosition\",value:function(){if(this.state.show&&\"fixed\"===this.props.model.type){var e=this.base.getBoundingClientRect();return Date.now()-this.state.time>10&&this.setState({time:Date.now()}),{position:\"fixed\",left:e.x,top:e.y+e.height+4,width:e.width}}return{}}},{key:\"componentWillReceiveProps\",value:function(e){this.init(e,e.updateData)}},{key:\"componentWillMount\",value:function(){this.init(this.props,!0)}},{key:\"render\",value:function(e,t){var n=this,o=e.theme,r=e.prop,i=(e.radio,e.repeat,e.clickClose,e.on,e.max,e.maxMethod,e.content),a=e.disabled,l=e.tree,s=e.submitConversion,u={borderColor:o.color},p=t.data,f=t.dataObj,d=t.flatData,h=t.sels,b=t.show,y=t.tmpColor,x=t.bodyClass;a&&(b=!1);var v={style:Re(Re({},e.style),b?u:{}),onClick:this.onClick.bind(this),ua:Object(c.a)(),size:e.size,tabindex:1};y&&(v.style.borderColor=y,setTimeout((function(){v.style.borderColor=\"\",n.updateBorderColor(\"\")}),300)),r.value;var g=Re(Re({},e),{},{data:p,sels:h,ck:this.itemClick.bind(this),title:h.map((function(e){return e[r.name]})).join(\",\"),onReset:this.onReset.bind(this)}),_=Re(Re({},e),{},{data:p,dataObj:f,flatData:d,sels:h,ck:this.itemClick.bind(this),show:b,onReset:this.onReset.bind(this)}),w=i?m(ue,_):l.show?m(xe,je({},_,{ref:function(e){return n.treeRef=e}})):e.cascader.show?m(Ce,_):m(oe,je({},_,{ref:function(e){return n.generalRef=e}})),k=this.calcPosition();return m(\"xm-select\",v,m(\"input\",{class:\"xm-select-default\",\"lay-verify\":e.layVerify,\"lay-verType\":e.layVerType,\"lay-reqText\":e.layReqText,name:e.name,value:s(h,r)}),m(\"i\",{class:b?\"xm-icon xm-icon-expand\":\"xm-icon\"}),0===h.length&&m(\"div\",{class:\"xm-tips\"},e.tips),m(H,je({},g,{ref:function(e){return n.labelRef=e}})),m(\"div\",{class:[\"xm-body\",x,e.model.type,b?\"\":\"dis\"].join(\" \"),style:k,ref:function(e){return n.bodyView=e}},w),a&&m(\"div\",{class:\"xm-select-disabled\"}))}},{key:\"componentDidMount\",value:function(){var e=this;this.prepare=!0,this.base.addEventListener(\"keydown\",(function(t){13===t.keyCode&&e.onClick(t)})),this.input=this.base.querySelector(\".xm-select-default\");var t=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;t&&new t((function(t){t.forEach((function(t){\"attributes\"==t.type&&\"class\"===t.attributeName&&-1!==e.input.className.indexOf(\"layui-form-danger\")&&(e.input.className=\"xm-select-default\",e.base.style.borderColor=e.props.theme.maxColor,e.base.scrollIntoView&&e.base.scrollIntoView({behavior:\"smooth\"}))}))})).observe(this.input,{attributes:!0});for(var n=this.base;n;){if(\"FORM\"===n.tagName){var o=n.querySelector('button[type=\"reset\"]');o&&o.addEventListener(\"click\",(function(t){e.init(e.props,!0)}));break}n=n.parentElement}var r=this.props.done;r&&r()}},{key:\"componentDidUpdate\",value:function(){var e=this.props,t=e.direction,n=e.model;if(\"relative\"!==n.type&&\"fixed\"!==n.type){var o=this.base.getBoundingClientRect();if(\"auto\"===t){this.bodyView.style.display=\"block\",this.bodyView.style.visibility=\"hidden\";var r=this.bodyView.getBoundingClientRect().height;this.bodyView.style.display=\"\",this.bodyView.style.visibility=\"\";var i=o.y||o.top||0,a=document.documentElement.clientHeight-i-o.height-20;t=a>r||i<a?\"down\":\"up\"}\"down\"==t?(this.bodyView.style.top=o.height+4+\"px\",this.bodyView.style.bottom=\"auto\"):(this.bodyView.style.top=\"auto\",this.bodyView.style.bottom=o.height+4+\"px\")}}}])&&De(t.prototype,n),o&&De(t,o),i}(x),Ue={tips:\"请选择\",empty:\"暂无数据\",searchTips:\"请选择\",toolbar:{ALL:\"全选\",CLEAR:\"清空\",REVERSE:\"反选\",SEARCH:\"搜索\"},paging:{prev:\"上一页\",next:\"下一页\"}},Ne={zn:Ue,en:{tips:\"please selected\",empty:\"no data\",searchTips:\"please search\",toolbar:{ALL:\"select all\",CLEAR:\"clear\",REVERSE:\"invert select\",SEARCH:\"search\"},paging:{prev:\"prev\",next:\"next\"}}};function Be(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Ke(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Be(Object(n),!0).forEach((function(t){He(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Be(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function He(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function qe(){return(qe=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}function Ye(e){return(Ye=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function Ze(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}var Qe=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),this.init(t)}var t,n,o;return t=e,(n=[{key:\"init\",value:function(e){this.options=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"zn\",t=Ne[e]||Ue;return{language:e,languageProp:t,data:[],content:\"\",name:\"select\",layVerify:\"\",layVerType:\"\",layReqText:\"\",size:\"medium\",disabled:!1,initValue:null,create:null,tips:t.tips,empty:t.empty,delay:500,searchTips:t.searchTips,filterable:!1,filterMethod:function(e,t,n,o){return!e||-1!=t[o.name].indexOf(e)},remoteSearch:!1,remoteMethod:function(e,t){t([])},direction:\"auto\",style:{},height:\"200px\",autoRow:!1,paging:!1,pageSize:10,pageEmptyShow:!0,pageRemote:!1,radio:!1,repeat:!1,clickClose:!1,max:0,maxMethod:function(e,t){},showCount:0,enableKeyboard:!0,enableHoverFirst:!0,selectedKeyCode:13,toolbar:{show:!1,showIcon:!0,list:[\"ALL\",\"CLEAR\"]},tree:{show:!1,showFolderIcon:!0,showLine:!0,indent:20,expandedKeys:[],strict:!0,lazy:!1,load:null,simple:!1,nodeType:\"__node_type\",clickExpand:!0,clickCheck:!0},cascader:{show:!1,indent:100,strict:!0},prop:{name:\"name\",value:\"value\",selected:\"selected\",disabled:\"disabled\",children:\"children\",optgroup:\"optgroup\",click:\"click\"},theme:{color:\"#009688\",maxColor:\"#e54d42\",hover:\"#f2f2f2\"},model:{label:{type:\"block\",text:{left:\"\",right:\"\",separator:\", \"},block:{showCount:0,showIcon:!0,template:null},count:{template:function(e,t){return\"已选中 \".concat(t.length,\" 项, 共 \").concat(e.length,\" 项\")}}},icon:\"show\",type:\"absolute\"},iconfont:{select:\"\",unselect:\"\",half:\"\",parent:\"\"},show:function(){},hide:function(){},template:function(e){e.item,e.sels;var t=e.name;return e.value,t},on:function(e){e.arr,e.item,e.selected},submitConversion:function(e,t){return e.map((function(e){return e[t.value]})).join(\",\")},done:function(){}}}(e.language),this.update(e)}},{key:\"update\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=!!e.data;this.options=Object(c.b)(this.options,e),this.options.__render_success=!1;var n=this.options.dom;if(n){var o=this.options.data||[];if(\"function\"==typeof o&&(o=o(),this.options.data=o),Object(c.d)(o))return T(m(Fe,qe({},this.options,{__update:Date.now(),updateData:t})),n),this.options.__render_success=!0,this;Object(c.k)(\"data数据必须为数组类型, 不能是\".concat(\"undefined\"==typeof data?\"undefined\":Ye(data),\"类型\"))}else Object(c.k)(\"没有找到渲染对象: \".concat(e.el,\", 请检查\"))}},{key:\"reset\",value:function(){var e=this.options.el;return this.init($e[e]),et[e].init(this.options,!0),this}},{key:\"opened\",value:function(){var e=et[this.options.el];return!e.state.show&&e.onClick(),this}},{key:\"closed\",value:function(){var e=et[this.options.el];return e.state.show&&e.onClick(),this}},{key:\"getValue\",value:function(e){var t=this,n=this.options,o=n.tree,r=n.prop,i=n.data,a=et[this.options.el].state.sels,l=a;o.show&&o.strict&&o.simple&&(l=[],Object(c.j)(i,a,l,r));var s=Object(c.c)(l,r.children,[\"__node\"]);return\"name\"===e?s.map((function(e){return e[t.options.prop.name]})):\"nameStr\"===e?s.map((function(e){return e[t.options.prop.name]})).join(\",\"):\"value\"===e?s.map((function(e){return e[t.options.prop.value]})):\"valueStr\"===e?s.map((function(e){return e[t.options.prop.value]})).join(\",\"):s}},{key:\"setValue\",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(Object(c.d)(e))return et[this.options.el].value(this.options.radio?e.slice(0,1):e,t,n),this;Object(c.k)(\"请传入数组结构...\")}},{key:\"append\",value:function(e){if(Object(c.d)(e))return et[this.options.el].append(e),this;Object(c.k)(\"请传入数组结构...\")}},{key:\"delete\",value:function(e){if(Object(c.d)(e))return et[this.options.el].del(e),this;Object(c.k)(\"请传入数组结构...\")}},{key:\"warning\",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e||this.options.theme.maxColor;return!0===t?et[this.options.el].base.style.borderColor=n:et[this.options.el].updateBorderColor(n),this}},{key:\"getTreeValue\",value:function(e,t){var n=this.options,o=n.tree,r=n.cascader,i=n.prop,a=i.value;if(!o.show&&!r.show)return this.getValue(e);for(var l=et[this.options.el].state.sels,s=[],u=o.nodeType,p=function(e,t){s.find((function(t){return t[a]===e[a]}))||((e=Ke({},e))[u]=t,s.push(e))},f=0;f<l.length;f++){var d=Ke({},l[f]);for(p(d,\"leaf\");d=d.__node.parent;){var h=d.__node,m=h.half,b=h.selected;!e&&b?p(d,\"parent\"):t&&m&&!b&&p(d,\"half\")}}return Object(c.c)(s,i.children,[\"__node\"])}},{key:\"changeExpandedKeys\",value:function(e){return et[this.options.el].changeExpandedKeys(e),this}},{key:\"enable\",value:function(e){if(Object(c.d)(e)){if(0!==e.length)return et[this.options.el].upDate(e,!0),this}else Object(c.k)(\"请传入数组结构...\")}},{key:\"disable\",value:function(e){if(Object(c.d)(e)){if(0!==e.length)return et[this.options.el].upDate(e,!1),this}else Object(c.k)(\"请传入数组结构...\")}},{key:\"scroll\",value:function(e){var t=this.options.dom.querySelector('.xm-option[value=\"'.concat(e,'\"]'));return t&&t.scrollIntoView(!1),this}},{key:\"calcPosition\",value:function(){return et[this.options.el].calcPosition(),this}}])&&Ze(t.prototype,n),o&&Ze(t,o),e}();function Je(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function We(e){return function(e){if(Array.isArray(e))return Ge(e)}(e)||function(e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if(\"string\"==typeof e)return Ge(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ge(e,t)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function Ge(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n<t;n++)o[n]=e[n];return o}var Xe={},$e={},et={};t.c={name:s.a,version:s.b,doc:s.c,KeyCode:{Enter:13,Space:32},render:function(e){var t=e.el;if(e.dom=Object(c.g)(t),t.nodeType){var n=\"DOM_RENDER_\"+Date.now()+\"_\"+Math.random();t.setAttribute(s.a,n),t=\"[\".concat(s.a,\"='\").concat(n,\"']\"),e.el=t}$e[t]=e;var o=new Qe(e);return o&&o.options.__render_success&&(Xe[t]=o),o},get:function(e,t){var n;switch(Object.prototype.toString.call(e)){case\"[object String]\":e&&(n=function(t){return t===e});break;case\"[object RegExp]\":n=function(t){return e.test(t)};break;case\"[object Function]\":n=e}var o=Object.keys(Xe),r=(n?o.filter(n):o).map((function(e){return Xe[e]})).filter((function(e){return Object(c.g)(e.options.el)}));return t?r[0]:r},batch:function(e,t){var n=Array.prototype.slice.call(arguments);return n.splice(0,2),this.get(e).map((function(e){return e[t].apply(e,We(n))}))},arr2tree:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"pid\",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"id\",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"children\",r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i={};return safety(e).filter((function(e){var a=e[n],l=e[t],s=i[a],c=i[l];return s&&(e[o]=s[o]),i[a]=e,c||(c=Je({},o,[]),i[l]=c),c.push(e),n==r}))}}}});"
  },
  {
    "path": "app/admin/t/tpl/style/tags/jquery.tagsinput.css",
    "content": "div.tagsinput { border:1px solid #CCC; background: #FFF; padding:5px; width:300px; height:100px; overflow-y: auto;}\ndiv.tagsinput span.tag { border: 1px solid #a5d24a; -moz-border-radius:2px; -webkit-border-radius:2px; display: block; float: left; padding: 5px; text-decoration:none; background: #cde69c; color: #638421; margin-right: 5px; margin-bottom:5px;font-family: helvetica;  font-size:13px;}\ndiv.tagsinput span.tag a { font-weight: bold; color: #82ad2b; text-decoration:none; font-size: 11px;  }\ndiv.tagsinput input { width:80px; margin:0px; font-family: helvetica; font-size: 13px; border:1px solid transparent; padding:5px; background: transparent; color: #000; outline:0px;  margin-right:5px; margin-bottom:5px; }\ndiv.tagsinput div { display:block; float: left; }\n.tags_clear { clear: both; width: 100%; height: 0px; }\n.not_valid { background: #FBD8DB !important; color: #90111A !important;}\n"
  },
  {
    "path": "app/admin/t/tpl/style/tags/jquery.tagsinput.js",
    "content": "/*\n\n\tjQuery Tags Input Plugin 1.3.3\n\n\tCopyright (c) 2011 XOXCO, Inc\n\n\tDocumentation for this plugin lives here:\n\thttp://xoxco.com/clickable/jquery-tags-input\n\n\tLicensed under the MIT license:\n\thttp://www.opensource.org/licenses/mit-license.php\n\n\tben@xoxco.com\n\n*/\n\n(function($) {\n\n\tvar delimiter = new Array();\n\tvar tags_callbacks = new Array();\n\t$.fn.doAutosize = function(o){\n\t    var minWidth = $(this).data('minwidth'),\n\t        maxWidth = $(this).data('maxwidth'),\n\t        val = '',\n\t        input = $(this),\n\t        testSubject = $('#'+$(this).data('tester_id'));\n\n\t    if (val === (val = input.val())) {return;}\n\n\t    // Enter new content into testSubject\n\t    var escaped = val.replace(/&/g, '&amp;').replace(/\\s/g,' ').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\t    testSubject.html(escaped);\n\t    // Calculate new width + whether to change\n\t    var testerWidth = testSubject.width(),\n\t        newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth,\n\t        currentWidth = input.width(),\n\t        isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth)\n\t                             || (newWidth > minWidth && newWidth < maxWidth);\n\n\t    // Animate width\n\t    if (isValidWidthChange) {\n\t        input.width(newWidth);\n\t    }\n\n\n  };\n  $.fn.resetAutosize = function(options){\n    // alert(JSON.stringify(options));\n    var minWidth =  $(this).data('minwidth') || options.minInputWidth || $(this).width(),\n        maxWidth = $(this).data('maxwidth') || options.maxInputWidth || ($(this).closest('.tagsinput').width() - options.inputPadding),\n        val = '',\n        input = $(this),\n        testSubject = $('<tester/>').css({\n            position: 'absolute',\n            top: -9999,\n            left: -9999,\n            width: 'auto',\n            fontSize: input.css('fontSize'),\n            fontFamily: input.css('fontFamily'),\n            fontWeight: input.css('fontWeight'),\n            letterSpacing: input.css('letterSpacing'),\n            whiteSpace: 'nowrap'\n        }),\n        testerId = $(this).attr('id')+'_autosize_tester';\n    if(! $('#'+testerId).length > 0){\n      testSubject.attr('id', testerId);\n      testSubject.appendTo('body');\n    }\n\n    input.data('minwidth', minWidth);\n    input.data('maxwidth', maxWidth);\n    input.data('tester_id', testerId);\n    input.css('width', minWidth);\n  };\n\n\t$.fn.addTag = function(value,options) {\n\t\t\toptions = jQuery.extend({focus:false,callback:true},options);\n\t\t\tthis.each(function() {\n\t\t\t\tvar id = $(this).attr('id');\n\n\t\t\t\tvar tagslist = $(this).val().split(delimiter[id]);\n\t\t\t\tif (tagslist[0] == '') {\n\t\t\t\t\ttagslist = new Array();\n\t\t\t\t}\n\n\t\t\t\tvalue = jQuery.trim(value);\n\n\t\t\t\tif (options.unique) {\n\t\t\t\t\tvar skipTag = $(this).tagExist(value);\n\t\t\t\t\tif(skipTag == true) {\n\t\t\t\t\t    //Marks fake input as not_valid to let styling it\n    \t\t\t\t    $('#'+id+'_tag').addClass('not_valid');\n    \t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar skipTag = false;\n\t\t\t\t}\n\n\t\t\t\tif (value !='' && skipTag != true) {\n                    $('<span>').addClass('tag').append(\n                        $('<span>').text(value).append('&nbsp;&nbsp;'),\n                        $('<a>', {\n                            href  : '#',\n                            title : 'Removing tag',\n                            text  : 'x'\n                        }).click(function () {\n                            return $('#' + id).removeTag(escape(value));\n                        })\n                    ).insertBefore('#' + id + '_addTag');\n\n\t\t\t\t\ttagslist.push(value);\n\n\t\t\t\t\t$('#'+id+'_tag').val('');\n\t\t\t\t\tif (options.focus) {\n\t\t\t\t\t\t$('#'+id+'_tag').focus();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$('#'+id+'_tag').blur();\n\t\t\t\t\t}\n\n\t\t\t\t\t$.fn.tagsInput.updateTagsField(this,tagslist);\n\n\t\t\t\t\tif (options.callback && tags_callbacks[id] && tags_callbacks[id]['onAddTag']) {\n\t\t\t\t\t\tvar f = tags_callbacks[id]['onAddTag'];\n\t\t\t\t\t\tf.call(this, value);\n\t\t\t\t\t}\n\t\t\t\t\tif(tags_callbacks[id] && tags_callbacks[id]['onChange'])\n\t\t\t\t\t{\n\t\t\t\t\t\tvar i = tagslist.length;\n\t\t\t\t\t\tvar f = tags_callbacks[id]['onChange'];\n\t\t\t\t\t\tf.call(this, $(this), tagslist[i-1]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\treturn false;\n\t\t};\n\n\t$.fn.removeTag = function(value) {\n\t\t\tvalue = unescape(value);\n\t\t\tthis.each(function() {\n\t\t\t\tvar id = $(this).attr('id');\n\n\t\t\t\tvar old = $(this).val().split(delimiter[id]);\n\n\t\t\t\t$('#'+id+'_tagsinput .tag').remove();\n\t\t\t\tstr = '';\n\t\t\t\tfor (i=0; i< old.length; i++) {\n\t\t\t\t\tif (old[i]!=value) {\n\t\t\t\t\t\tstr = str + delimiter[id] +old[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$.fn.tagsInput.importTags(this,str);\n\n\t\t\t\tif (tags_callbacks[id] && tags_callbacks[id]['onRemoveTag']) {\n\t\t\t\t\tvar f = tags_callbacks[id]['onRemoveTag'];\n\t\t\t\t\tf.call(this, value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn false;\n\t\t};\n\n\t$.fn.tagExist = function(val) {\n\t\tvar id = $(this).attr('id');\n\t\tvar tagslist = $(this).val().split(delimiter[id]);\n\t\treturn (jQuery.inArray(val, tagslist) >= 0); //true when tag exists, false when not\n\t};\n\t\n\t// clear all existing tags and import new ones from a string\n\t$.fn.importTags = function(str) {\n                id = $(this).attr('id');\n\t\t$('#'+id+'_tagsinput .tag').remove();\n\t\t$.fn.tagsInput.importTags(this,str);\n\t}\n\n\t$.fn.tagsInput = function(options) {\n    var settings = jQuery.extend({\n      interactive:true,\n      defaultText:'add a tag',\n      minChars:0,\n      width:'300px',\n      height:'100px',\n      autocomplete: {selectFirst: false },\n      'hide':true,\n      'delimiter':',',\n      'unique':true,\n      removeWithBackspace:true,\n      placeholderColor:'#666666',\n      autosize: true,\n      comfortZone: 20,\n      inputPadding: 6*2\n    },options);\n\n\t\tthis.each(function() {\n\t\t\tif (settings.hide) {\n\t\t\t\t$(this).hide();\n\t\t\t}\n\t\t\tvar id = $(this).attr('id');\n\t\t\tif (!id || delimiter[$(this).attr('id')]) {\n\t\t\t\tid = $(this).attr('id', 'tags' + new Date().getTime()).attr('id');\n\t\t\t}\n\n\t\t\tvar data = jQuery.extend({\n\t\t\t\tpid:id,\n\t\t\t\treal_input: '#'+id,\n\t\t\t\tholder: '#'+id+'_tagsinput',\n\t\t\t\tinput_wrapper: '#'+id+'_addTag',\n\t\t\t\tfake_input: '#'+id+'_tag'\n\t\t\t},settings);\n\n\t\t\tdelimiter[id] = data.delimiter;\n\n\t\t\tif (settings.onAddTag || settings.onRemoveTag || settings.onChange) {\n\t\t\t\ttags_callbacks[id] = new Array();\n\t\t\t\ttags_callbacks[id]['onAddTag'] = settings.onAddTag;\n\t\t\t\ttags_callbacks[id]['onRemoveTag'] = settings.onRemoveTag;\n\t\t\t\ttags_callbacks[id]['onChange'] = settings.onChange;\n\t\t\t}\n\n\t\t\tvar markup = '<div id=\"'+id+'_tagsinput\" class=\"tagsinput\"><div id=\"'+id+'_addTag\">';\n\n\t\t\tif (settings.interactive) {\n\t\t\t\tmarkup = markup + '<input id=\"'+id+'_tag\" value=\"\" data-default=\"'+settings.defaultText+'\" />';\n\t\t\t}\n\n\t\t\tmarkup = markup + '</div><div class=\"tags_clear\"></div></div>';\n\n\t\t\t$(markup).insertAfter(this);\n\n\t\t\t$(data.holder).css('width',settings.width);\n\t\t\t$(data.holder).css('min-height',settings.height);\n\t\n\t\t\tif ($(data.real_input).val()!='') {\n\t\t\t\t$.fn.tagsInput.importTags($(data.real_input),$(data.real_input).val());\n\t\t\t}\n\t\t\tif (settings.interactive) {\n\t\t\t\t$(data.fake_input).val($(data.fake_input).attr('data-default'));\n\t\t\t\t$(data.fake_input).css('color',settings.placeholderColor);\n\t\t        $(data.fake_input).resetAutosize(settings);\n\n\t\t\t\t$(data.holder).bind('click',data,function(event) {\n\t\t\t\t\t$(event.data.fake_input).focus();\n\t\t\t\t});\n\n\t\t\t\t$(data.fake_input).bind('focus',data,function(event) {\n\t\t\t\t\tif ($(event.data.fake_input).val()==$(event.data.fake_input).attr('data-default')) {\n\t\t\t\t\t\t$(event.data.fake_input).val('');\n\t\t\t\t\t}\n\t\t\t\t\t$(event.data.fake_input).css('color','#000000');\n\t\t\t\t});\n\n\t\t\t\tif (settings.autocomplete_url != undefined) {\n\t\t\t\t\tautocomplete_options = {source: settings.autocomplete_url};\n\t\t\t\t\tfor (attrname in settings.autocomplete) {\n\t\t\t\t\t\tautocomplete_options[attrname] = settings.autocomplete[attrname];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (jQuery.Autocompleter !== undefined) {\n\t\t\t\t\t\t$(data.fake_input).autocomplete(settings.autocomplete_url, settings.autocomplete);\n\t\t\t\t\t\t$(data.fake_input).bind('result',data,function(event,data,formatted) {\n\t\t\t\t\t\t\tif (data) {\n\t\t\t\t\t\t\t\t$('#'+id).addTag(data[0] + \"\",{focus:true,unique:(settings.unique)});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t  \t});\n\t\t\t\t\t} else if (jQuery.ui.autocomplete !== undefined) {\n\t\t\t\t\t\t$(data.fake_input).autocomplete(autocomplete_options);\n\t\t\t\t\t\t$(data.fake_input).bind('autocompleteselect',data,function(event,ui) {\n\t\t\t\t\t\t\t$(event.data.real_input).addTag(ui.item.value,{focus:true,unique:(settings.unique)});\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\t\t\t\t\t\t// if a user tabs out of the field, create a new tag\n\t\t\t\t\t\t// this is only available if autocomplete is not used.\n\t\t\t\t\t\t$(data.fake_input).bind('blur',data,function(event) {\n\t\t\t\t\t\t\tvar d = $(this).attr('data-default');\n\t\t\t\t\t\t\tif ($(event.data.fake_input).val()!='' && $(event.data.fake_input).val()!=d) {\n\t\t\t\t\t\t\t\tif( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) )\n\t\t\t\t\t\t\t\t\t$(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$(event.data.fake_input).val($(event.data.fake_input).attr('data-default'));\n\t\t\t\t\t\t\t\t$(event.data.fake_input).css('color',settings.placeholderColor);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\t// if user types a comma, create a new tag\n\t\t\t\t$(data.fake_input).bind('keypress',data,function(event) {\n\t\t\t\t\tif (event.which==event.data.delimiter.charCodeAt(0) || event.which==13 ) {\n\t\t\t\t\t    event.preventDefault();\n\t\t\t\t\t\tif( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) )\n\t\t\t\t\t\t\t$(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)});\n\t\t\t\t\t  \t$(event.data.fake_input).resetAutosize(settings);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else if (event.data.autosize) {\n\t\t\t            $(event.data.fake_input).doAutosize(settings);\n\n          \t\t\t}\n\t\t\t\t});\n\t\t\t\t//Delete last tag on backspace\n\t\t\t\tdata.removeWithBackspace && $(data.fake_input).bind('keydown', function(event)\n\t\t\t\t{\n\t\t\t\t\tif(event.keyCode == 8 && $(this).val() == '')\n\t\t\t\t\t{\n\t\t\t\t\t\t event.preventDefault();\n\t\t\t\t\t\t var last_tag = $(this).closest('.tagsinput').find('.tag:last').text();\n\t\t\t\t\t\t var id = $(this).attr('id').replace(/_tag$/, '');\n\t\t\t\t\t\t last_tag = last_tag.replace(/[\\s]+x$/, '');\n\t\t\t\t\t\t $('#' + id).removeTag(escape(last_tag));\n\t\t\t\t\t\t $(this).trigger('focus');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t$(data.fake_input).blur();\n\n\t\t\t\t//Removes the not_valid class when user changes the value of the fake input\n\t\t\t\tif(data.unique) {\n\t\t\t\t    $(data.fake_input).keydown(function(event){\n\t\t\t\t        if(event.keyCode == 8 || String.fromCharCode(event.which).match(/\\w+|[áéíóúÁÉÍÓÚñÑ,/]+/)) {\n\t\t\t\t            $(this).removeClass('not_valid');\n\t\t\t\t        }\n\t\t\t\t    });\n\t\t\t\t}\n\t\t\t} // if settings.interactive\n\t\t});\n\n\t\treturn this;\n\n\t};\n\n\t$.fn.tagsInput.updateTagsField = function(obj,tagslist) {\n\t\tvar id = $(obj).attr('id');\n\t\t$(obj).val(tagslist.join(delimiter[id]));\n\t};\n\n\t$.fn.tagsInput.importTags = function(obj,val) {\n\t\t$(obj).val('');\n\t\tvar id = $(obj).attr('id');\n\t\tvar tags = val.split(delimiter[id]);\n\t\t\n\t\tfor (i=0; i<tags.length; i++) {\n\t\t\t$(obj).addTag(tags[i],{focus:false,callback:false});\n\t\t}\n\t\tif(tags_callbacks[id] && tags_callbacks[id]['onChange'])\n\t\t{\n\t\t\tvar f = tags_callbacks[id]['onChange'];\n\t\t\tf.call(obj, obj, tags[i]);\n\t\t}\n\t};\n\n})(jQuery);\n"
  },
  {
    "path": "app/admin/t/tpl/sys.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n\t<meta charset=\"UTF-8\">\r\n\t{include=\"style\"}\r\n\t{include=\"edit\"}\r\n\t<style>\r\n\t\tbody .layui-layer-demo .layui-layer-title{background:#009688; color:#fff; border: none;}\r\n\t\tbody .layui-layer-demo .layui-layer-content{padding:20px;line-height: 24px;}\r\n\t\t.layui-sys-icon {\r\n\t\t\tfont-size: 20px;\r\n\t\t\tcursor: pointer;\r\n\t\t\tcolor: #01AAED;\r\n\t\t}\r\n\r\n\t\t.layui-form-pane .layui-form-label {\r\n\t\t\tmin-width: 150px;\r\n\t\t\twidth: auto;\r\n\t\t}\r\n\t\t@media screen and (max-width: 900px) {\r\n\t\t\t.layui-form-item .layui-input-inline {\r\n\t\t\t\twidth: 100%;\r\n\t\t\t}\r\n\t\t\t.layui-form-item.layui-form-text{\r\n\t\t\t\twidth:100%;\r\n\t\t\t}\r\n\t\t}\r\n\t\t@media screen and (min-width: 900px) {\r\n\t\t\t.layui-form-item .layui-input-inline {\r\n\t\t\t\twidth: 45%;\r\n\t\t\t}\r\n\t\t\t.layui-form-item.layui-form-text{\r\n\t\t\t\twidth:60%;\r\n\t\t\t}\r\n\t\t}\r\n\t\t.copy{ cursor:pointer;}\r\n\t</style>\r\n\r\n</head>\r\n<body>\r\n<div class=\"x-nav\">\r\n            <span class=\"layui-breadcrumb\">\r\n              <a><cite>{fun JZLANG('首页')}</cite></a>\r\n              <a><cite>{fun JZLANG('系统设置')}</cite></a>\r\n              <a><cite>{fun JZLANG('网站设置')}</cite></a>\r\n            </span>\r\n\t<a class=\"layui-btn layui-btn-sm\" style=\"line-height:1.6em;margin-top:3px;float:right\"  href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\"><i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\r\n</div>\r\n<form class=\"layui-form layui-form-pane\" >\r\n\t<div class=\"x-body\">\r\n\t\t<div class=\"layui-tab layui-tab-brief\" lay-filter=\"docDemoTabBrief\">\r\n\t\t\t<ul class=\"layui-tab-title\">\r\n\t\t\t\t{php\r\n\t\t\t\t$ctype = [];\r\n\t\t\t\t$i = 0;\r\n\t\t\t\t$allconfig = M('sysconfig')->findAll();\r\n\t\t\t\t$newconfig = [];\r\n\t\t\t\tforeach($allconfig as $vs){\r\n\t\t\t\t$newconfig[$vs['typeid']][] = $vs;\r\n\t\t\t\t}\r\n\t\t\t\tfunction bubbleSort($arr) {\r\n\t\t\t\t\t$n = count($arr);\r\n\t\t\t\t\tfor ($i = 0; $i < $n - 1; $i++) {\r\n\t\t\t\t\tfor ($j = 0; $j < $n - $i - 1; $j++) {\r\n\t\t\t\t\tif ($arr[$j]['orders'] < $arr[$j + 1]['orders']) {\r\n\t\t\t\t\t// 交换元素\r\n\t\t\t\t\t$temp = $arr[$j];\r\n\t\t\t\t\t$arr[$j] = $arr[$j + 1];\r\n\t\t\t\t\t$arr[$j + 1] = $temp;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn $arr;\r\n\t\t\t\t}\r\n\t\t\t\tforeach($newconfig as $kk=>$vv){\r\n\t\t\t\t\t//冒泡排序\r\n\t\t\t\t\t$newconfig[$kk] = bubbleSort($vv);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/}\r\n\t\t\t\t{loop table=\"ctype\" orderby=\"id asc\" isopen=\"1\" as=\"v\"}\r\n\t\t\t\t{if(checkAction('Sys/ctype/type/'.$v['action']))}\r\n\t\t\t\t<li {if($i==0)}class=\"layui-this\"{/if}>{fun JZLANG($v['title'])}</li>\r\n\t\t\t\t{php\r\n\t\t\t\t$ctype[]=$v;\r\n\t\t\t\t$i++;\r\n\t\t\t\t/}\r\n\t\t\t\t{/if}\r\n\r\n\t\t\t\t{/loop}\r\n\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t<li>{fun JZLANG('自定义配置')}</li>\r\n\t\t\t\t{/if}\r\n\t\t\t</ul>\r\n\r\n\t\t\t<div class=\"layui-tab-content\" >\r\n\t\t\t\t{foreach $ctype as $s}\r\n\t\t\t\t<div class=\"layui-tab-item {if($s_n==1)}layui-show{/if}\">\r\n\t\t\t\t\t{foreach $newconfig[$s['id']] as $v}\r\n\r\n\t\t\t\t\t{if($v['type']==1)}\r\n\r\n\t\t\t\t\t<div class=\"layui-form-item\" >\r\n\t\t\t\t\t\t<label  class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t{fun JZLANG($v['title'])}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\r\n\t\t\t\t\t\t\t<input name=\"{$v['field']}\" type=\"text\" class=\"layui-input\" id=\"{$v['field']}\" value=\"{$v['data']}\">\r\n\t\t\t\t\t\t\t<div class=\"layui-progress\" id=\"{$v['field']}_propress\" style=\"display:none;\" lay-filter=\"{$v['field']}_propress\" lay-showPercent=\"yes\">\r\n\t\t\t\t\t\t\t\t<div class=\"layui-progress-bar layui-bg-green\" lay-percent=\"0%\"></div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"{$v['field']}_upload\">\r\n\t\t\t\t\t\t\t\t<i class=\"layui-icon layui-icon-add-circle\"></i>{fun JZLANG('上传图片')}\r\n\t\t\t\t\t\t\t</button><input class=\"layui-upload-file\" type=\"file\" accept=\"image/*\" name=\"file\">\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['tip'])}\r\n\t\t\t\t\t\t<i data-info=\"{fun JZLANG($v['tip'])}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t\t\t<div  class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['sys']!=1)}\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t\t<div class=\"layui-block\">\r\n\t\t\t\t\t\t\t<img src=\"{$v['data']}\"  id=\"{$v['field']}_img\">\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<script>\r\n\r\n\t\t\t\t\t\tlayui.use(\"upload\", function(){\r\n\t\t\t\t\t\t\tvar upload_{$v['field']} = layui.upload;\r\n\r\n\t\t\t\t\t\t\t//执行实例\r\n\t\t\t\t\t\t\tvar uploadInst = upload_{$v['field']}.render({\r\n\t\t\t\t\t\t\t\telem: \"#{$v['field']}_upload\" //绑定元素\r\n\t\t\t\t\t\t\t\t,url: \"{fun U('Common/uploads')}\" //上传接口\r\n\t\t\t\t\t\t\t\t,accept:\"images\"\r\n\t\t\t\t\t\t\t\t,acceptMime:\"image/*\"\r\n\t\t\t\t\t\t\t\t,data:{molds:\"sysconfig\"}\r\n\t\t\t\t\t\t\t\t,before:function(){\r\n\t\t\t\t\t\t\t\t\t$(\"#{$v['field']}_propress\").show();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t,done: function(res){\r\n\r\n\t\t\t\t\t\t\t\t\tif(res.code==0){\r\n\t\t\t\t\t\t\t\t\t\t$(\"#{$v['field']}_img\").attr(\"src\",res.url);\r\n\t\t\t\t\t\t\t\t\t\t$(\"#{$v['field']}\").val(res.url);\r\n\t\t\t\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\t\t\t\t$(\"#{$v['field']}_propress\").hide();\r\n\t\t\t\t\t\t\t\t\t\t},2000)\r\n\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\tlayer.alert(res.error, {icon: 5});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t,progress: function(n, elem, res, index){\r\n\t\t\t\t\t\t\t\t\tvar percent = n + \"%\" //获取进度百分比\r\n\t\t\t\t\t\t\t\t\telement.progress(\"{$v['field']}_propress\", percent);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t,error: function(){\r\n\t\t\t\t\t\t\t\t\t//请求异常回调\r\n\t\t\t\t\t\t\t\t\tlayer.alert(\"{fun JZLANG('上传异常！')}\");\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t</script>\r\n\r\n\t\t\t\t\t{else if($v['type']==2)}\r\n\r\n\t\t\t\t\t<div class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t{$v['title']}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div  class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<input type=\"text\" name=\"{$v['field']}\" value=\"{$v['data']}\" autocomplete=\"off\"\r\n\t\t\t\t\t\t\t\t   class=\"layui-input\">\r\n\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['tip'])}\r\n\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t\t\t<div  class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['sys']!=1)}\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t{else if($v['type']==3)}\r\n\t\t\t\t\t<div class=\"layui-form-item layui-form-text\">\r\n\t\t\t\t\t\t<label  class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t{$v['title']}  {if($v['tip'])}\r\n\t\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\r\n\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\r\n\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t</label>\r\n\r\n\t\t\t\t\t\t<div class=\"layui-input-block\">\r\n\t\t\t\t\t\t\t<textarea  name=\"{$v['field']}\" class=\"layui-textarea\">{$v['data']}</textarea>\r\n\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t{if($v['sys']!=1 && $admin['gid']==1)}\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/if}\r\n\r\n\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t{else if($v['type']==4)}\r\n\t\t\t\t\t{php\r\n\t\t\t\t\t$edit = require(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/common/uediter.php');\r\n\t\t\t\t\techo $edit;\r\n\t\t\t\t\t/}\r\n\t\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t\t<div  class=\"layui-inline\">\r\n\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t{if($v['sys']!=1)}\r\n\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button></div>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{else if($v['type']==5)}\r\n\t\t\t\t\t<div class=\"layui-form-item\" >\r\n\t\t\t\t\t\t<label  class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t{$v['title']}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\r\n\t\t\t\t\t\t\t<input name=\"{$v['field']}\" type=\"text\" class=\"layui-input\" id=\"{$v['field']}\" value=\"{$v['data']}\">\r\n\t\t\t\t\t\t\t<div class=\"layui-progress\" id=\"{$v['field']}_propress\" style=\"display:none;\" lay-filter=\"{$v['field']}_propress\" lay-showPercent=\"yes\">\r\n\t\t\t\t\t\t\t\t<div class=\"layui-progress-bar layui-bg-green\" lay-percent=\"0%\"></div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"{$v['field']}_upload\">\r\n\t\t\t\t\t\t\t\t<i class=\"layui-icon layui-icon-add-circle\"></i>{fun JZLANG('上传文件')}\r\n\t\t\t\t\t\t\t</button><input class=\"layui-upload-file\" type=\"file\" name=\"file\">\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['tip'])}\r\n\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t\t\t<div  class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['sys']!=1)}\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<script>\r\n\r\n\t\t\t\t\t\tlayui.use(\"upload\", function(){\r\n\t\t\t\t\t\t\tvar upload_{$v['field']} = layui.upload;\r\n\r\n\t\t\t\t\t\t\t//执行实例\r\n\t\t\t\t\t\t\tvar uploadInst = upload_{$v['field']}.render({\r\n\t\t\t\t\t\t\t\telem: \"#{$v['field']}_upload\" //绑定元素\r\n\t\t\t\t\t\t\t\t,url: \"{fun U('Common/uploads')}\" //上传接口\r\n\t\t\t\t\t\t\t\t,accept:\"file\"\r\n\t\t\t\t\t\t\t\t,exts: \"{$webconf['fileType']}\"\r\n\t\t\t\t\t\t\t\t,data:{molds:\"sysconfig\"}\r\n\t\t\t\t\t\t\t\t,before:function(){\r\n\t\t\t\t\t\t\t\t\t$(\"#{$v['field']}_propress\").show();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t,done: function(res){\r\n\r\n\t\t\t\t\t\t\t\t\tif(res.code==0){\r\n\r\n\t\t\t\t\t\t\t\t\t\t$(\"#{$v['field']}\").val(res.url);\r\n\t\t\t\t\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\t\t\t\t\t$(\"#{$v['field']}_propress\").hide();\r\n\t\t\t\t\t\t\t\t\t\t},2000)\r\n\t\t\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\t\t\tlayer.alert(res.error, {icon: 5});\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t,progress: function(n, elem, res, index){\r\n\t\t\t\t\t\t\t\t\tvar percent = n + \"%\" //获取进度百分比\r\n\t\t\t\t\t\t\t\t\telement.progress(\"{$v['field']}_propress\", percent);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t,error: function(){\r\n\t\t\t\t\t\t\t\t\t//请求异常回调\r\n\t\t\t\t\t\t\t\t\tlayer.alert(\"{fun JZLANG('上传异常！')}\");\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t</script>\r\n\r\n\t\t\t\t\t{else if($v['type']==6)}\r\n\t\t\t\t\t<div  class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label   class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t{$v['title']}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div  class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<select name=\"{$v['field']}\" class=\"layui-btn layui-btn-normal\">\r\n\t\t\t\t\t\t\t\t<option value=\"\">{fun JZLANG('请选择')}</option>\r\n\t\t\t\t\t\t\t\t{php\r\n\t\t\t\t\t\t\t\t$v['config'] = str_replace('，',',',$v['config']);\r\n\t\t\t\t\t\t\t\t$select = explode(',',$v['config']);\r\n\t\t\t\t\t\t\t\t/}\r\n\t\t\t\t\t\t\t\t{foreach $select as $vv}\r\n\t\t\t\t\t\t\t\t{php\r\n\t\t\t\t\t\t\t\t$d = explode('=',$vv);\r\n\t\t\t\t\t\t\t\t/}\r\n\t\t\t\t\t\t\t\t<option value=\"{$d[1]}\" {if($v['data']==$d[1])}selected{/if}>{$d[0]}</option>\r\n\t\t\t\t\t\t\t\t{/foreach}\r\n\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['tip'])}\r\n\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t\t\t<div  class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['sys']!=1)}\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t{else if($v['type']==7)}\r\n\t\t\t\t\t<div  class=\"layui-form-item\">\r\n\t\t\t\t\t\t<label   class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t{$v['title']}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div  class=\"layui-input-inline\">\r\n\t\t\t\t\t\t\t<select name=\"{$v['field']}\" id=\"{$v['field']}\" class=\"layui-btn layui-btn-normal\">\r\n\t\t\t\t\t\t\t\t<option value=\"0\" >{fun JZLANG('不选')}</option>\r\n\t\t\t\t\t\t\t\t{foreach $classtypetree as $vv}\r\n\t\t\t\t\t\t\t\t{if($vv['id']==$v['data'])}\r\n\t\t\t\t\t\t\t\t<option selected value=\"{$vv['id']}\">{fun str_repeat('--', $vv['level']).$vv['classname']}</option>\r\n\t\t\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t\t\t<option  value=\"{$vv['id']}\">{fun str_repeat('--', $vv['level']).$vv['classname']}</option>\r\n\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['tip'])}\r\n\t\t\t\t\t\t<i data-info=\"{$v['tip']}\" data-field=\"f{$v['id']}\" class=\"layui-sys-icon layui-icon layui-icon-about f{$v['id']}\"></i>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t\t\t<div  class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['sys']!=1)}\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t{else if($v['type']==8)}\r\n\t\t\t\t\t<div class=\"layui-form-item layui-form-text\">\r\n\t\t\t\t\t\t<label  class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t{$v['title']}  <span class=\"x-red\">{$v['tip']}</span>\r\n\t\t\t\t\t\t\t{if($admin['gid']==1)}\r\n\t\t\t\t\t\t\t<span data-clipboard-action=\"copy\" id=\"copy_{$v['field']}_text\"  data-clipboard-target=\"#copy_{$v['field']}_text\" title=\"{fun JZLANG('点击复制')}\" class=\"layui-badge-rim copy\">{!--$webconf['{$v['field']}']--}</span>\r\n\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t<div class=\"layui-input-block\">\r\n\t\t\t\t\t\t\t<textarea  name=\"{$v['field']}\" class=\"layui-textarea\">{$v['data']}</textarea>\r\n\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{if($v['sys']!=1 && $admin['gid']==1)}\r\n\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t<button type=\"button\" lay-filter=\"del\" data=\"custom_{$v['field']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t{/if}\r\n\r\n\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t{/foreach}\r\n\r\n\r\n\t\t\t\t\t{if($s['sys']!=1 && $admin['gid']==1)}\r\n\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t<button type=\"button\" lay-filter=\"delconfig\" data=\"{$s['id']}\"  lay-submit=\"\"  class=\"layui-btn layui-btn-danger layui-btn-sm\">{fun JZLANG('删除配置栏')}</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t<div style=\"height:100px;\"></div>\r\n\t\t\t\t</div>\r\n\r\n\r\n\t\t\t\t{/foreach}\r\n\t\t\t\t<div class=\"layui-tab-item \">\r\n\t\t\t\t\t{if($admin['gid']==1)}\r\n\r\n\t\t\t\t\t<fieldset class=\"layui-elem-field\">\r\n\t\t\t\t\t\t<legend>{fun JZLANG('自定义配置')}</legend>\r\n\t\t\t\t\t\t<div class=\"layui-field-box\">\r\n\t\t\t\t\t\t\t<label  class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t\t{fun JZLANG('新增配置')}\r\n\t\t\t\t\t\t\t</label>\r\n\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\" >\r\n\t\t\t\t\t\t\t\t<select class=\"layui-btn layui-btn-normal\" name=\"custom_type\" id=\"custom_type\" >\r\n\t\t\t\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('选择类型')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('图片')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('单行文本')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"3\">{fun JZLANG('多行文本')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"4\">{fun JZLANG('编辑器')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"5\">{fun JZLANG('文件上传')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"6\">{fun JZLANG('下拉选项')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"7\">{fun JZLANG('栏目选项')}</option>\r\n\t\t\t\t\t\t\t\t\t<option value=\"8\">{fun JZLANG('代码')}</option>\r\n\r\n\t\t\t\t\t\t\t\t</select>\r\n\r\n\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"custom_title\" name=\"custom_title\" autocomplete=\"off\" placeholder=\"{fun JZLANG('请填写配置名(中文)')}\"\r\n\t\t\t\t\t\t\t\t\t   class=\"layui-input\">\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"custom_fields\" name=\"custom_fields\" autocomplete=\"off\" placeholder=\"{fun JZLANG('配置标识(字母或数字)')}\"\r\n\t\t\t\t\t\t\t\t\t   class=\"layui-input\">\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t\t<button lay-filter=\"*\" lay-submit=\"\" class=\"layui-btn\"><i class=\"iconfont\">&#xe6b9;</i>{fun JZLANG('添加')}</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<br/>\r\n\t\t\t\t\t\t\t<label  class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t\t{fun JZLANG('配置栏目')}\r\n\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\" >\r\n\t\t\t\t\t\t\t\t<select class=\"layui-btn layui-btn-normal\" name=\"custom_ctype\" id=\"custom_ctype\" >\r\n\t\t\t\t\t\t\t\t\t{foreach $ctype as $v}\r\n\t\t\t\t\t\t\t\t\t<option value=\"{$v['id']}\">{$v['title']}</option>\r\n\t\t\t\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"custom_tips\" name=\"custom_tips\" autocomplete=\"off\" placeholder=\"{fun JZLANG('提示信息')}\"\r\n\t\t\t\t\t\t\t\t\t   class=\"layui-input\">\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<i data-info=\"{fun JZLANG('自定义配置可以配置对应配置栏下的自定义内容')}\" data-field=\"fcustom\" class=\"layui-sys-icon layui-icon layui-icon-about fcustom\"></i>\r\n\t\t\t\t\t\t\t<br/>\r\n\t\t\t\t\t\t\t<div class=\"layui-input-block\" style=\"margin-left:0;\">\r\n\t\t\t\t\t\t\t\t<textarea  name=\"custom_config\" placeholder=\"{fun JZLANG('下拉选项配置，如：开启=1,关闭=0')}\" class=\"layui-textarea\"></textarea>\r\n\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</fieldset>\r\n\t\t\t\t\t<fieldset class=\"layui-elem-field\">\r\n\t\t\t\t\t\t<legend>{fun JZLANG('自定义配置栏')}</legend>\r\n\t\t\t\t\t\t<div class=\"layui-field-box\">\r\n\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"custom_new_title\" name=\"custom_new_title\" autocomplete=\"off\" placeholder=\"{fun JZLANG('请填写配置栏名(中文)')}\"\r\n\t\t\t\t\t\t\t\t\t   class=\"layui-input\">\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t\t<input type=\"text\" id=\"custom_new_fields\" name=\"custom_new_fields\" autocomplete=\"off\" placeholder=\"{fun JZLANG('配置标识(必须是字母)')}\"\r\n\t\t\t\t\t\t\t\t\t   class=\"layui-input\">\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"layui-inline\">\r\n\t\t\t\t\t\t\t\t<button lay-filter=\"*\" lay-submit=\"\" class=\"layui-btn\"><i class=\"iconfont\">&#xe6b9;</i>{fun JZLANG('添加')}</button>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<i data-info=\"{fun JZLANG('配置标识用于权限控制，必填且不能与原系统配置栏重复')}\" data-field=\"fcustomnew\" class=\"layui-sys-icon layui-icon layui-icon-about fcustomnew\"></i>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</fieldset>\r\n\r\n\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t<div style=\"height:100px;\"></div>\r\n\t\t\t\t</div>\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t<div class=\"layui-form-item\">\r\n\t\t\t\t\t<button class=\"layui-btn\" lay-submit=\"\" lay-filter=\"*\">\r\n\t\t\t\t\t\t{fun JZLANG('保存')}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\r\n\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\t</div>\r\n</form>\r\n\r\n<script>\r\n\r\n\tlayui.use(['element','layer','form','upload'], function(){\r\n\t\t$ = layui.jquery;//jquery\r\n\t\tvar  lement = layui.element;//面包导航\r\n\t\tvar  layer = layui.layer;//弹出层\r\n\t\tvar  form = layui.form;\r\n\t\tvar upload = layui.upload;\r\n\r\n\r\n\r\n\r\n\t\t//监听提交\r\n\t\tform.on('submit(*)', function(data){\r\n\r\n\t\t\t$.post(\"{fun U('Sys/index')}\",data.field,function(r){\r\n\t\t\t\t//console.log(r);\r\n\t\t\t\tvar r = JSON.parse(r);\r\n\t\t\t\tif(r.code==0){\r\n\t\t\t\t\tlayer.alert(r.msg, {icon: 6},function(){\r\n\r\n\t\t\t\t\t\twindow.location.reload();\r\n\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t}else{\r\n\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t});\r\n\r\n\t\t\treturn false;\r\n\r\n\r\n\t\t});\r\n\r\n\t\tform.on('submit(del)', function(data){\r\n\r\n\t\t\tvar s = $(this).attr('data');\r\n\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\r\n\t\t\t\t$(\"#\"+s).remove();\r\n\t\t\t\tlayer.close(index);\r\n\t\t\t\tvar ss = s.split('custom_');\r\n\t\t\t\t$.post(\"{fun U('Sys/custom_del')}\",{field:ss[1]},function(r){\r\n\t\t\t\t\tvar r = JSON.parse(r);\r\n\t\t\t\t\tif(r.code==0){\r\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 6},function(){\r\n\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t});\r\n\r\n\t\t\t});\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t});\r\n\r\n\t\tform.on('submit(delconfig)', function(data){\r\n\r\n\t\t\tvar ctype = $(this).attr('data');\r\n\t\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\r\n\r\n\t\t\t\tlayer.close(index);\r\n\r\n\t\t\t\t$.post(\"{fun U('Sys/index')}\",{ctype:ctype,deltype:1},function(r){\r\n\t\t\t\t\tvar r = JSON.parse(r);\r\n\t\t\t\t\tif(r.code==0){\r\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 6},function(){\r\n\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tlayer.alert(r.msg, {icon: 5});\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t});\r\n\r\n\t\t\t});\r\n\t\t\treturn false;\r\n\t\t});\r\n\r\n\r\n\r\n\t\t$(\".layui-sys-icon\").click(function(){\r\n\t\t\tvar fclass = $(this).attr('data-field');\r\n\t\t\tlayer.tips($(this).attr('data-info'), '.'+fclass);\r\n\t\t})\r\n\r\n\t})\r\n\r\n\tfunction custom_delete(s){\r\n\t\tlayer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\r\n\t\t\t$(\"#\"+s).remove();\r\n\t\t\tlayer.close(index);\r\n\r\n\r\n\t\t});\r\n\t}\r\n\tvar clipboard = new ClipboardJS('.copy');\r\n\tclipboard.on('success', function(e) {\r\n\t\tlayer.msg('{fun JZLANG('复制成功！')}', {icon: 6,time: 1000});\r\n\t\te.clearSelection();\r\n\t});\r\n\r\n\tclipboard.on('error', function(e) {\r\n\r\n\t\tlayer.alert('{fun JZLANG('失败！')}');\r\n\t});\r\n\r\n\r\n</script>\r\n\r\n</body>\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/systype.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n\t<style>\n\t\t.m-form{\n\t\t    padding: 25px;\n\t\t}\n\t\t.m-form input{\n\t\t\tmargin:5px 0px;\n\t\t}\n\t</style>\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a >{fun JZLANG('首页')}</a>\n        <a >{fun JZLANG('系统设置')}</a>\n        <a><cite>{fun JZLANG('配置分类')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n     \t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t  <xblock>\n\t  {if($admin['isadmin'])}\n\t\t<a class=\"layui-btn layui-btn-sm\"  onclick=\"add()\" >{fun JZLANG('新增配置栏目')}</a>\n\t  {/if}\n        <span class=\"x-right\" style=\"line-height:40px\"></span>\n      </xblock>\n\t  <form class=\"layui-form\">\n      <table class=\"layui-table layui-form\">\n        <thead>\n          <tr>\n           \n            <th width=\"70\">ID</th>\n            <th width=\"150\">{fun JZLANG('配置栏名称')}</th>\n            <th width=\"150\">{fun JZLANG('配置标识')}</th>\n            <th width=\"150\">{fun JZLANG('系统配置')}</th>\n            <th width=\"150\">{fun JZLANG('是否启用')}</th>\n            <th >{fun JZLANG('操作')}</th>\n        </thead>\n        <tbody class=\"x-cate\">\n\t\t{foreach $lists as $v}\n          <tr cate-id=\"{$v['id']}\" fid=\"0\" >\n\t\t\t\n            <td>{$v['id']}</td>\n            <td>{$v['title']}</td>\n\t\t\t<td>{$v['action']}</td>\n\t\t\t<td>{if($v['sys'])}<span class=\"layui-badge\">是</span>{else}<span class=\"layui-badge layui-bg-gray\">否</span>{/if}</td>\n\t\t\t<td><input type=\"checkbox\" value=\"{$v['id']}\" name=\"switch\" lay-filter=\"isopen\"   lay-text=\"{fun JZLANG('开启|关闭')}\"  lay-skin=\"switch\" {if($v['isopen']==1)}checked{/if}></td>\n\t\t\t\n            <td class=\"td-manage\">\n\t\t\t{if($admin['isadmin'])}\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"edit({$v['id']},'{$v['title']}','{$v['action']}')\" >{fun JZLANG('编辑')}</a>\n              <a class=\"layui-btn layui-btn layui-btn-xs\"  onclick=\"x_admin_show('{fun JZLANG('查看')}','{fun U('Sys/ctype',['type'=>$v['action']])}')\" >{fun JZLANG('查看')}</a>\n\t\t\t{/if}\n\t\t\t{if($admin['isadmin'])}\n              {if(!$v['sys'])}<a class=\"layui-btn-danger layui-btn layui-btn-xs\"  onclick=\"sysdel(this,'{$v['id']}')\" href=\"javascript:;\" >{fun JZLANG('删除')}</a>\n\t\t\t  {/if}\n\t\t\t{/if}  \n            </td>\n          </tr>\n\t\t {/foreach}\n         \n        </tbody>\n      </table>\n\t  </form>\n\t\t\t</div>\n\t\t</div>\n     \n    \n    </div>\n    \n\t\n    <script>\n      layui.use(['form','layer'], function(){\n        var form = layui.form,layer=layui.layer;\n        form.on('switch(isopen)', function (data) {\n\t\t\t$.post(\"{fun U('sys/systypestatus')}\",{id:data.elem.value},function(r){\n\t\t\t\tlayer.msg('操作成功！',{icon:6});\n\t\t\t});\n\t\t});\n      });\n\t\n      function sysdel(obj,id){\n          layer.confirm('{fun JZLANG('确认要删除吗？')}',function(index){\n\t\t\t  $.post('{fun U('Sys/index')}',{ctype:id,deltype:1},function(r){\n\t\t\t\t\tr = JSON.parse(r);\n\t\t\t\t\tif(r.code==1){\n\t\t\t\t\t\tlayer.msg(r.msg,{icon: 5,time:1000});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.msg(r.msg, {\n\t\t\t\t\t\t time:1000,icon:6\n\t\t\t\t\t\t},function(){\n\t\t\t\t\t\t\t $(obj).parents(\"tr\").remove();\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('已删除!')}',{icon:1,time:1000});\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t  });\n\t\t\n\t\t\t  \n\t\t\t  \n              \n          });\n      }\n\t  \n\t  function edit(id,title,action){\n\t\tvar html = '<div class=\"m-form\"><input type=\"hidden\" id=\"id\" value=\\\"'+id+'\\\">{fun JZLANG('配置栏名称')}<input type=\\\"text\\\" autocomplete=\"off\" id= \\\"title\\\" value=\\\"'+title+'\\\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('配置栏名称')}\\\"/>'\n\t\t+'{fun JZLANG('配置标识')}<input type=\\\"text\\\" value=\\\"'+action+'\\\" id= \\\"action\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('配置标识')}\\\"/>'\n\t\t+'<button type=\"button\" style=\"margin-left: 45%;\" class=\"layui layui-btn layui-btn-sm\" onclick=\"update()\">{fun JZLANG('提交')}</button></div>';\n\t\tlayer.open({\n\t\t  type: 1,\n\t\t  title:'{fun JZLANG('修改配置栏目')}',\n\t\t  skin: 'layui-layer-rim', //加上边框\n\t\t  area: ['400px', '300px'], //宽高\n\t\t  content: html\n\t\t});\n\t  \n\t  }\n\t \n\t\tfunction update(){\n\t\t\t  var title = $(\"#title\").val();\n\t\t\t  var id = $(\"#id\").val();\n\t\t\t  var action = $(\"#action\").val();\n\t\t\t  if(title=='' || action==''){\n\t\t\t\tlayer.msg('{fun JZLANG('配置栏名称和配置标识不能为空！')}',{icon:5})\n\t\t\t\treturn false;\n\t\t\t  }\n\t\t\t  $.post(\"{fun U('Sys/editctype')}\",{id:id,title:title,action:action},function(res){\n\t\t\t\tif(res.code==0){\n\t\t\t\t\tlayer.msg('{fun JZLANG('修改成功！')}',{icon:6},function(){\n\t\t\t\t\t\tlayer.closeAll();\n\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t})\n\t\t\t\t}else{\n\t\t\t\t\tlayer.msg(res.msg,{icon:5});\n\t\t\t\t}\n\t\t\t  },'json')\n\t\t}\n\t\t\n\t\tfunction add(){\n\t\t\tvar html = '<div class=\"m-form\">{fun JZLANG('配置栏名称')}<input type=\\\"text\\\" autocomplete=\"off\" id= \\\"title\\\" value=\\\"\\\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('配置栏名称')}\\\"/>'\n\t\t\t+'{fun JZLANG('配置标识')}<input type=\\\"text\\\" value=\\\"\\\" id= \\\"action\\\" autocomplete=\"off\" class=\\\"layui-input\\\" placeholder=\\\"{fun JZLANG('配置标识')}\\\"/>'\n\t\t\t+'<button type=\"button\" style=\"margin-left: 45%;\" class=\"layui layui-btn layui-btn-sm\" onclick=\"addaction()\">{fun JZLANG('新增')}</button></div>';\n\t\t\tlayer.open({\n\t\t\t  type: 1,\n\t\t\t  title:'{fun JZLANG('新增配置栏目')}',\n\t\t\t  skin: 'layui-layer-rim', //加上边框\n\t\t\t  area: ['400px', '300px'], //宽高\n\t\t\t  content: html\n\t\t\t});\n\t\t}\n\t\tfunction addaction(){\n\t\t\t  var title = $(\"#title\").val();\n\t\t\t  var action = $(\"#action\").val();\n\t\t\t  if(title=='' || action==''){\n\t\t\t\tlayer.msg('{fun JZLANG('配置栏名称和配置标识不能为空！')}',{icon:5})\n\t\t\t\treturn false;\n\t\t\t  }\n\t\t\t  $.post(\"{fun U('Sys/addctype')}\",{title:title,action:action},function(res){\n\t\t\t\tif(res.code==0){\n\t\t\t\t\tlayer.msg('{fun JZLANG('新增成功！')}',{icon:6},function(){\n\t\t\t\t\t\tlayer.closeAll();\n\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t})\n\t\t\t\t}else{\n\t\t\t\t\tlayer.msg(res.msg,{icon:5});\n\t\t\t\t}\n\t\t\t  },'json')\n\t\t}\n\t\t\t\n    \n    </script>\n    \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/template-list.html",
    "content": "<!DOCTYPE html>\n<html>\n  \n  <head>\n    <meta charset=\"UTF-8\">\n   {include=\"style\"}\n   <style>\n\t.btn-jz{\n\t\tmargin-left:0px !important;\n\t}\n\tspan.jzspan {\n\t\twidth: 45px;\n\t}\n\t#templatelist li {\n\t\twidth: 24%;\n\t\tfloat: left;\n\t\theight: 365px;\n\t\tborder: 1px solid #ccc;\n\t\tmargin: 2px;\n\t\tbox-shadow: 2px 2px 2px #ebe6e6;\n\t}\n\t#templatelist li:hover {\n\t\tborder: 1px solid #f00;\n\t\tbox-shadow: 4px 4px 4px #ededed;\n\n\t}\n\n\t#templatelist{\n\t\theight: 1125px;\n\t}\n\t#templatelist li dl {\n\t\tpadding: 8px;\n\t}\n\t#templatelist li dl dd{\n\t    overflow: hidden;\n\t\twhite-space: nowrap;\n\t}\n\tdd.thumbnail{\n    height: 230px;\n\t}\n\tdd.thumbnail img{\n\twidth:100%;\n\theight:100%;\n\t}\n\tdd span{\n\t\tcursor:pointer;\n\t}\n\n   </style>\n  </head>\n  \n  <body>\n    <div class=\"x-nav\">\n      <span class=\"layui-breadcrumb\">\n        <a href=\"/\">{fun JZLANG('首页')}</a>\n        <a >{fun JZLANG('模板管理')}</a>\n        <a><cite>{fun JZLANG('模板列表')}</cite></a>\n      </span>\n      <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"{fun JZLANG('刷新')}\">\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\n    </div>\n    <div class=\"x-body\">\n\t\n\t\t<div class=\"layui-card\">\n\t\t\t<div class=\"layui-card-body\">\n\t\t\t  <div class=\"layui-row\">\n\t    <form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\n\t    <a href=\"{fun U('Template/index')}\" class=\"layui-btn layui-btn-primary\">{fun JZLANG('全部')}</a>\n\t\t<a href=\"{fun U('Template/index',['isdown'=>1])}\" class=\"layui-btn  layui-btn-normal\">{fun JZLANG('本地')}</a>\n\t\t\n\t\t<input type=\"text\" name=\"title\" value=\"{$title}\" placeholder=\"{fun JZLANG('请输入模板名字')}\" autocomplete=\"off\" class=\"layui-input\">\n\t\t  <button class=\"layui-btn\"  lay-submit=\"\" lay-filter=\"sreach\"><i class=\"layui-icon\">&#xe615;</i></button>\n\t\t<a class=\"layui-btn layui-btn-warm layui-btn-sm\" style=\"float: right;\" title=\"{fun JZLANG('设置')}\" onclick=\"setconf()\"><i class=\"iconfont\">&#xe6ae;</i></a>\n\t\t</form>\n      </div>\n\t\t\n\t\t<ul id=\"templatelist\">\n\t\t\t {foreach $lists as $v}\n\t\t\t <li>\n\t\t\t    <dl title=\"{$v['name']}\">\n\t\t\t\t<dd class=\"thumbnail\"><a href=\"{$v['web']}\" target=\"_blank\"><img src=\"/static/nopic.jpg\" lay-src=\"{$v['thumbnail']}\" onerror=\"this.src='/static/nopic.jpg'\"></a></dd>\n\t\t\t\t<dd>{$v['name']}</dd>\n\t\t\t\t<dd>{fun JZLANG('作者：')}{$v['author']}</dd>\n\t\t\t\t<dd>{if($v['official']==1)}<span class=\"layui-badge layui-bg-green jzspan\">{fun JZLANG('官方')}</span>{else if($v['official']==2)}<span class=\"layui-badge layui-bg-orange jzspan\">{fun JZLANG('本地')}</span>{else}<span class=\"layui-badge layui-bg-orange jzspan\">{fun JZLANG('第三方')}</span>{/if}\n\t\t\t\t【 {$v['template']} 】\n\t\t\t\tv{$v['version']}{if($v['isupdate'])}  <span style=\"cursor:pointer;\" title=\"{fun JZLANG('点击查看')}\" onclick=\"x_all_show('{fun JZLANG('更新说明')}','{fun U('Template/update',array('template'=>$v['template']))}')\" class=\"layui-badge\">{fun JZLANG('有更新')}</span>{/if}</dd>\n\t\t\t\t<dd>{$v['description']}</dd>\n\t\t\t\t<dd>{if($v['install'])}\n\t\t\t\t<span class=\"layui-badge layui-bg-gray\">{fun JZLANG('已使用')}</span>\n\t\t\t\t<span class=\"layui-badge layui-bg-blue\" onclick=\"beifen('{$v['template']}')\">{fun JZLANG('备份数据')}</span>\n\t\t\t\t{else if($v['official']==2)}\n\t\t\t\t<span class=\"layui-badge layui-bg-blue\" onclick=\"install('{$v['template']}')\">{fun JZLANG('安装模板')}</span>\n\t\t\t\t{else}\n\t\t\t\t\n\t\t\t\t<form class=\"layui-form\">\n\t\t\t\t<a lay-submit  lay-filter=\"down\" data-{$v['template']}-size=\"0\" data-{$v['template']}-url=\"{$v['downurl']}\" data=\"{$v['template']}\" id=\"{$v['template']}-downbutton\" class=\"layui-btn  layui-btn-xs layui-btn-warm\">{fun JZLANG('下载')}</a>\n\t\t\t\t<div class=\"layui-progress  layui-progress-big\"   id=\"{$v['template']}-down-action\" lay-showpercent=\"true\" lay-filter=\"demo-{$v['template']}-progress\" style=\"margin: 30px;display:none;\">\n\t\t\t\t  <div class=\"layui-progress-bar\" lay-percent=\"0%\"></div>\n\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t\t\n\t\t\t\t{/if}</dd>\n\t\t\t\t<dd></dd>\n\t\t\t\t</dl>\n\t\t\t \n\t\t\t </li>\n\t\t\t {/foreach}\n\t\t</ul>\n\t  \n\t\t\n\t\t  \n\t\t  <div class=\"page\">\n\t\t\t{$pages}\n\t\t  </div>\n\t \n\t\t\t\n\t\t\t\n\t\t\t</div>\n\t\t</div>\n\t\n\t\n     \n    </div>\n    <script>\n      layui.use(['laydate','form','flow'], function(){\n        var laydate = layui.laydate;\n        var form = layui.form;\n        var flow = layui.flow;\n\t\tflow.lazyimg();\n       \n\t\tform.on('switch(status)', function (data) {\n\t\t\n\t\t\t$.post(\"{fun U('change_status')}\",{filepath:data.elem.value},function(r){});\n\t\t});\n\t\tform.on('submit(down)', function (data) {\n\t\t\tvar filepath = $(data.elem).attr('data');\n\t\t\tvar download_url = $(data.elem).attr('data-'+filepath+'-url');\n\t\t\t$(\"#\"+filepath+\"-downbutton\").hide();\n\t\t\t$(\"#\"+filepath+\"-down-action\").show();\n\t\t\tvar othis = $(\"#\"+filepath+\"-down-action\");\n          \tvar DISABLED = 'layui-btn-disabled';\n\t\t    if(othis.hasClass(DISABLED)){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t//获取文件大小\n\t\t\t$.post(\"{fun U('template/update')}\",{action:'prepare-download',template:filepath,download_url:download_url},function(res){\n\t\t\t\tconsole.log('预下载',res);\n\t\t\t     if(res.code==0){\n\t\t\t\t\t$(data.elem).attr('data-'+filepath+'-size',res.size);\n\t\t\t\t }else{\n\t\t\t\t  layer.alert('{fun JZLANG('获取文件大小失败，请检查网络！')}');return false;\n\t\t\t\t }\n\t\t\t},'json');\n\t\t    $.post(\"{fun U('template/update')}\",{action:'start-download',template:filepath,download_url:download_url},function(res){\n\t\t\t    //开始下载\n\t\t\t    console.log(res);\n\t\t\t},'json');\n\t\t\t\n\t\t      //模拟loading\n\t\t    var n = 0, timer = setInterval(function(){ \n\t\t        $.post(\"{fun U('template/update')}\",{action:'get-file-size',template:filepath,download_url:download_url},function(res){\n\t\t        \tconsole.log(res);\n\t\t\t\t    var cur_size = parseInt(res.size);\n\t\t\t\t    console.log(cur_size);\n\t\t\t\t    var filesize = parseInt($(data.elem).attr('data-'+filepath+'-size'));\n\t\t\t\t    n = Math.round(cur_size/filesize)*100;\n\t\t\t\t    if(filesize==cur_size){\n\t\t\t\t\t  //n = 90;//只加载到90%，剩下10%解压\n\t\t\t          //$(\"#down-text\").html('插件下载完成');\n\t\t\t\t\t  console.log('插件下载完成，正在解压~');\n\t\t\t          clearInterval(timer);\n\t\t\t          othis.removeClass(DISABLED);\n\t\t\t          element.progress('demo-'+filepath+'-progress', n+'%');\n\t\t\t\t\t  $.post(\"{fun U('template/update')}\",{template:filepath,download_url:download_url,'filesize':$(data.elem).attr('data-'+filepath+'-size'),'action':'file-upzip'},function(res){\n\t\t\t\t        \tif(res.code==0){\n\t\t\t\t\t\t\t\tconsole.log('插件已解压完毕！');\n\t\t\t\t        \t\telement.progress('demo-'+filepath+'-progress', '100%');\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t        \t}else{\n\t\t\t\t        \t\tlayer.msg(res.msg);return false;\n\t\t\t\t        \t}\n\n\t\t\t\t\t\t   \n\t\t\t\t\t\t},'json');\n\t\t\t          \n\n\t\t\t        }\n\t\t\t        element.progress('demo-'+filepath+'-progress', n+'%');\n\t\t\t\t},'json');\n\n\t\t       \n\t\t    }, 1000);\n\t\t\t\n\t\t\t return false;\n\t\t\t})\n\t\t\n\t\t\n      });\n\n\t  function beifen(template){\n\t\t\n\t\tlayer.confirm('{fun JZLANG('如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？')}', {icon: 3, title:'{fun JZLANG('提示')}'}, function(index){\n\t\t \n\t\t $.post(\"{fun U('Template/update')}\",{template:template,action:'backup',ajax:1},function(r){\n\t\t\tif(r.code==0){\n\t\t\t\tlayer.msg(r.msg,{icon: 6},function(){\n\t\t\t\tlocation.reload();\n\t\t\t\t});\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tlayer.alert(r.msg);\n\t\t\t}\n\t\t  },'json')\n\t\t \n\t\t  \n\t\t  layer.close(index);\n\t\t});\n\t  \n\t  \n\t\t \n\t  }\n\t \n\t  \n\t  function install(template){\n\t\t\n\t\t\n\t\tlayer.open({\n\t\t  type: 1,\n\t\t  title:'{fun JZLANG('安装提示')}',\n\t\t  skin: 'layui-layer-rim', //加上边框\n\t\t  area: ['500px', '250px'], //宽高\n\t\t  content: '<form class=\"layui-form\" action=\"\"><div style=\"margin-top: 36px;\" class=\"layui-form-item\">'+\n\t\t  '<input type=\"hidden\" name=\"template\" value=\"'+template+'\" >'+\n\t\t  '<input type=\"hidden\" name=\"action\" value=\"template-install\" >'+\n    '<label class=\"layui-form-label\" style=\"width: 85px;\">{fun JZLANG('该模板用于：')}</label>'+\n    '<div class=\"layui-input-block\">'+\n      '<input type=\"checkbox\" name=\"tpl[]\" value=\"pc\" checked title=\"{fun JZLANG('PC端')}\">'+\n      '<input type=\"checkbox\" name=\"tpl[]\" value=\"wap\" checked title=\"{fun JZLANG('手机端')}\">'+\n      '<input type=\"checkbox\" name=\"tpl[]\" value=\"wechat\" checked title=\"{fun JZLANG('微信端')}\">'+\n    '</div>'+\n\t '<div class=\"layui-form-item\" style=\"margin-top: 50px;\">'+\n    '<div class=\"layui-input-block\" style=\"margin-left:0px;text-align: center;\">'+\n     ' <button class=\"layui-btn\" lay-submit lay-filter=\"install\">{fun JZLANG('安装模板')}</button>'+\n    '</div>'+\n  '</div>'+\n  '</div></form>'\n\t\t});\n\t\t\n\t\tlayui.use('form', function(){\n\t\t  var form = layui.form;\n\t\t  \n\t\t  //监听提交\n\t\t  form.on('submit(install)', function(data){\n\t\t\t//layer.msg(JSON.stringify(data.field));\n\n\t\t\t$.post(\"{fun U('Template/update')}\",data.field,function(r){\n\t\t\t\tif(r.code==0){\n\t\t\t\t\tlayer.msg(r.msg,{icon: 6},function(){\n\t\t\t\t\tlocation.reload();\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tlayer.alert(r.msg);\n\t\t\t\t}\n\t\t\t  },'json')\n\t\t\t\n\t\t\treturn false;\n\t\t  });\n\t\t  \n\t\t  form.render();\n\t\t  \n\t\t});\n\t\t\n\t\t \n\t  }\n\n\t  function setconf(){\n\t\t  layer.prompt({\n\t\t\t  formType: 0,\n\t\t\t  value: '{$webapi}',\n\t\t\t  title: '{fun JZLANG('设置接口')}',\n\t\t\t  area: ['800px', '400px']\n\t\t  }, function(value, index, elem){\n\t\t\t  $.post(\"{fun U('template/index')}\",{set:1,webapi:value},function(r){\n\t\t\t\t  if(r.code==0){\n\t\t\t\t\t  layer.msg(r.msg,{icon: 6},function(){\n\t\t\t\t\t\t  location.reload();\n\t\t\t\t\t  });\n\n\t\t\t\t  }else{\n\t\t\t\t\t  layer.msg(r.msg);\n\t\t\t\t  }\n\t\t\t  },'json')\n\n\n\t\t\t  layer.close(index);\n\t\t  });\n\n\n\t  }\n\n\n    </script>\n   \n  </body>\n\n</html>"
  },
  {
    "path": "app/admin/t/tpl/template-update.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t{include=\"style\"}\n\n</head>\n<body >\n  <div class=\"layui-rows\" style=\"    margin-top: 10px;\">\n    <h1 style=\"text-align:center\">{$templatedata['name']}</h1>\n    <div class=\"layui-content\" style=\"margin: 20px 40px;text-align: center;\"><p style=\"font-size: 16px;\">{fun JZLANG('当前版本：')}<span class=\"layui-badge layui-bg-gray\">v{$templatedata['version']}</span>&nbsp;&nbsp;{fun JZLANG('最新版本：')}<span class=\"layui-badge layui-bg-green\">v{$data['version']}</span>&nbsp;&nbsp;{fun JZLANG('作者：')}{$templatedata['author']}&nbsp;&nbsp;{fun JZLANG('更新时间：')}{$data['time']}</span></p>\n    </div>\n    \n\t<div style=\" margin: 25px; font-size: 20px;\">\n\t\t<fieldset class=\"layui-elem-field\" style=\"border: none;padding: 0;border-top: 1px solid #eee;\">\n\t\t  <legend>{fun JZLANG('更新内容')}</legend>\n\t\t  <div class=\"layui-field-box\">\n\t\t    <blockquote class=\"layui-elem-quote\">{fun nl2br($data['data'])}</blockquote>\n\t\t  </div>\n\t\t</fieldset>\n\t\t\n\t\t\n\t</div>\n\t<form class=\"layui-form layui-form-pane\" action=\"\">\n\t<div id=\"update-plugins\" style=\"display: none;\"><h3  style=\"text-align:center\" id=\"down-text\">{fun JZLANG('正在下载文件')}</h3>\n\t<div class=\"layui-progress  layui-progress-big\"   id=\"down-action\" lay-showpercent=\"true\" lay-filter=\"demo-progress\" style=\"margin: 30px;\">\n\t  <div class=\"layui-progress-bar\" lay-percent=\"0%\"></div>\n\t</div>\n\t</div>\n\t<input type=\"hidden\" name=\"template\" id=\"filepath\" value=\"{$filepath}\">\n\t<input type=\"hidden\" name=\"download_url\" id=\"download_url\" value=\"{$data['downurl']}\">\n\t<input type=\"hidden\" name=\"filesize\" id=\"filesize\" value=\"{$filesize}\">\n\t<input type=\"hidden\" name=\"action\" id=\"action\" value=\"start-download\">\n\t\t<div class=\"layui-form-item\" >\n\t\t<div  style=\"text-align:center;\">\n\t\t  <button class=\"layui-btn\" id=\"update-submit\" lay-submit lay-filter=\"formDemo\">{fun JZLANG('升级模板')}</button>\n\n\t\t</div>\n\t\t</div>\n\t</form>\n  </div>\n\n  \n    <script>\n\tlayui.use(['code','form','element'], function(){ //加载code模块\n\t\t  layui.code({'encode':true}); //引用code方法\n\t\t  var form = layui.form;\n\t\t  var element = layui.element;\n\t\t  var $ = layui.jquery;\n\t\t  //监听提交\n          form.on('submit(formDemo)', function(data){\n       \t\t$(\"#update-submit\").addClass('layui-btn-disabled');\n       \t\t$(\"#update-plugins\").show();\n       \t\tvar othis = $(\"#down-action\");\n          \tvar DISABLED = 'layui-btn-disabled';\n\t\t    if(othis.hasClass(DISABLED)) return;\n\t\t    $.post(\"{fun U('template/update')}\",data.field,function(res){\n\t\t\t    //开始下载\n\t\t\t    console.log(res);\n\t\t\t},'json');\n\t\t\t\n\t\t      //模拟loading\n\t\t    var n = 0, timer = setInterval(function(){\n\t\t        //n = n + Math.random()*10|0;  \n\t\t        data.field.action = 'get-file-size';\n\t\t        $.post(\"{fun U('template/update')}\",data.field,function(res){\n\t\t        \tconsole.log(res);\n\t\t\t\t    var cur_size = parseInt(res.size);\n\t\t\t\t    console.log(cur_size);\n\t\t\t\t    var filesize = parseInt($(\"#filesize\").val());\n\t\t\t\t    n = Math.round(cur_size/filesize)*100;\n\t\t\t\t    if(filesize==cur_size){\n\t\t\t          $(\"#down-text\").html('{fun JZLANG('文件下载完成！正在解压~')}');\n\t\t\t          clearInterval(timer);\n\t\t\t          othis.removeClass(DISABLED);\n\t\t\t          element.progress('demo-progress', n+'%');\n\t\t\t           $.post(\"{fun U('template/update')}\",{template:$(\"#filepath\").val(),download_url:$(\"#download_url\").val(),'filesize':$(\"#filesize\").val(),'action':'file-upzip'},function(res){\n\t\t\t\t        \tif(res.code==0){\n\t\t\t\t        \t\tif(res.isinstall){\n\t\t\t\t        \t\t\t$(\"#down-text\").html('{fun JZLANG('文件解压完成！正在进行安装~')}');\n\t\t\t\t\t        \t\t//element.progress('demo-progress', '80%');\n\t\t\t\t\t        \t\t$.post(\"{fun U('template/update')}\",{template:$(\"#filepath\").val(),download_url:$(\"#download_url\").val(),'filesize':$(\"#filesize\").val(),'action':'template-install'},function(res){\n\t\t\t\t\t\t\t        \tif(res.code==0){\n\t\t\t\t\t\t\t        \t\t$(\"#down-text\").html('{fun JZLANG('模板升级成功！')}');\n\t\t\t\t\t\t\t        \t\telement.progress('demo-progress', '100%');\n\t\t\t\t\t\t\t        \t\t\n\t\t\t\t\t\t\t        \t}else{\n\t\t\t\t\t\t\t        \t\t\n\t\t\t\t\t\t\t        \t\tlayer.msg(res.msg);return false;\n\t\t\t\t\t\t\t        \t}\n\n\n\t\t\t\t\t\t\t\t\t   \n\t\t\t\t\t\t\t\t\t},'json');\n\t\t\t\t        \t\t}else{\n\t\t\t\t        \t\t\t$(\"#down-text\").html('{fun JZLANG('模板已升级完毕！')}');\n\t\t\t\t        \t\t\telement.progress('demo-progress', '100%');\n\t\t\t\t        \t\t}\n\t\t\t\t        \t\t\n\t\t\t\t        \t\t\n\n\t\t\t\t        \t}else{\n\t\t\t\t        \t\t\n\t\t\t\t        \t\tlayer.msg(res.msg);return false;\n\t\t\t\t        \t}\n\n\t\t\t\t\t\t   \n\t\t\t\t\t\t},'json');\n\n\t\t\t        }\n\t\t\t        //升级分三步，70%下载，10%解压，20%安装\n\t\t\t        n = Math.round(n*0.7);\n\t\t\t        element.progress('demo-progress', n+'%');\n\t\t\t\t},'json');\n\n\t\t       \n\t\t    }, 1000);\n\n\t\t\t\n\t\t\t\n            return false;\n          });\n\n\n\n\t\t});\n\n    </script>\n \n</body>\n</html>"
  },
  {
    "path": "app/admin/t/tpl/tohtml.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n    <head>\r\n        <meta charset=\"UTF-8\">\r\n       {include=\"style\"}\r\n\t   <style>\r\n\t   .cache-s{\r\n\t   width:6rem !important;\r\n\t   }\r\n\t   #msg{\r\n\t       margin-left: 20px;\r\n\t\tline-height: 24px;\r\n\t   }\r\n\t   .layui-btn-gray {\r\n\t\t    background-color: #b73535;\r\n\t\t}\r\n\t   </style>\r\n    </head>\r\n    <body>\r\n    <div class=\"x-body layui-anim layui-anim-up\">\r\n      <div class=\"layui-card\">\r\n\t\t<div class=\"layui-card-body\">\r\n        <fieldset class=\"layui-elem-field\">\r\n            <div class=\"layui-field-box\">\r\n                <div class=\"layui-col-md12\">\r\n\t\t\t\t\r\n                    <form class=\"layui-form \" action=\"\">\r\n\t\t\t\t\t\r\n\t\t\t\t\t<table class=\"layui-table\">\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t<th>{fun JZLANG('模块名称')}</th>\r\n\t\t\t\t\t<th>{fun JZLANG('指定栏目')}</th>\r\n\t\t\t\t\t<th>{fun JZLANG('输出范围')}</th>\r\n\t\t\t\t\t<th>{fun JZLANG('操作')}</th>\r\n\t\t\t\t\t\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t<td>{fun JZLANG('栏目模块')}<input name=\"model[]\" value=\"classtype\" type=\"hidden\"></td>\r\n\t\t\t\t\t<td><select class=\"tid\" lay-search name=\"tid[]\"  >\r\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('所有栏目')}</option>\r\n\t\t\t\t\t   {foreach $classtypetree as $v}\r\n\t\t\t\t\t   <option value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\r\n\t\t\t\t\t   {/foreach}\r\n\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t<td><select class=\"isshow\" name=\"isshow[]\"  >\r\n\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的栏目')}</option>\r\n\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的栏目')}</option>\r\n\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t<td><button onclick=\"tohtml(this)\" data=\"classtype\" class=\"layui-btn\" type=\"button\">{fun JZLANG('生成电脑静态')}</button>\r\n\t\t\t\t\t<button onclick=\"tohtmlmobile(this)\" data=\"classtype\" class=\"layui-btn  layui-btn-warm\" type=\"button\">{fun JZLANG('生成手机静态')}</button>\r\n\r\n\t\t\t\t\t<button onclick=\"clearhtml(this)\" data=\"classtype\" class=\"layui-btn layui-btn-success\" type=\"button\">{fun JZLANG('清理电脑静态HTML')}</button>\r\n\t\t\t\t\t<button onclick=\"clearhtmlmobile(this)\" data=\"classtype\" class=\"layui-btn  layui-btn-success\" type=\"button\">{fun JZLANG('清理手机静态HTML')}</button>\r\n\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-gray\" type=\"button\">{fun JZLANG('删除')}</button>\r\n\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t<td>{fun JZLANG('文章模块')}<input name=\"model[]\" value=\"article\" type=\"hidden\"></td>\r\n\t\t\t\t\t<td><select class=\"tid\" lay-search name=\"tid[]\"  >\r\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('所有栏目')}</option>\r\n\t\t\t\t\t   {foreach $classtypetree as $v}\r\n\t\t\t\t\t   {if($v['molds']=='article')}\r\n\t\t\t\t\t   <option value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\r\n\t\t\t\t\t   {/if}\r\n\t\t\t\t\t   {/foreach}\r\n\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t<td><select class=\"isshow\" name=\"isshow[]\"  >\r\n\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的文章')}</option>\r\n\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的文章')}</option>\r\n\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t<td><button onclick=\"tohtml(this)\" data=\"article\" class=\"layui-btn\" type=\"button\">{fun JZLANG('生成电脑静态')}</button>\r\n\t\t\t\t\t<button onclick=\"tohtmlmobile(this)\" data=\"article\" class=\"layui-btn  layui-btn-warm\" type=\"button\">{fun JZLANG('生成手机静态')}</button>\r\n\t\t\t\t\t<button onclick=\"clearhtml(this)\" data=\"article\" class=\"layui-btn layui-btn-success\" type=\"button\">{fun JZLANG('清理电脑静态HTML')}</button>\r\n\t\t\t\t\t<button onclick=\"clearhtmlmobile(this)\" data=\"article\" class=\"layui-btn  layui-btn-success\" type=\"button\">{fun JZLANG('清理手机静态HTML')}</button>\r\n\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-gray\" type=\"button\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t<td>{fun JZLANG('商品模块')}<input name=\"model[]\" value=\"product\" type=\"hidden\"></td>\r\n\t\t\t\t\t<td><select class=\"tid\" lay-search name=\"tid[]\"  >\r\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('所有栏目')}</option>\r\n\t\t\t\t\t   {foreach $classtypetree as $v}\r\n\t\t\t\t\t   {if($v['molds']=='product')}\r\n\t\t\t\t\t   <option value=\"{$v['id']}\">{fun str_repeat('--', $v['level'])}{$v['classname']}</option>\r\n\t\t\t\t\t   {/if}\r\n\t\t\t\t\t   {/foreach}\r\n\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td><select class=\"isshow\" name=\"isshow[]\"  >\r\n\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的商品')}</option>\r\n\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的商品')}</option>\r\n\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t<td><button onclick=\"tohtml(this)\" data=\"product\" class=\"layui-btn\" type=\"button\">{fun JZLANG('生成电脑静态')}</button>\r\n\t\t\t\t\t<button onclick=\"tohtmlmobile(this)\" data=\"product\" class=\"layui-btn  layui-btn-warm\" type=\"button\">{fun JZLANG('生成手机静态')}</button>\r\n\t\t\t\t\t<button onclick=\"clearhtml(this)\" data=\"product\" class=\"layui-btn layui-btn-success\" type=\"button\">{fun JZLANG('清理电脑静态HTML')}</button>\r\n\t\t\t\t\t<button onclick=\"clearhtmlmobile(this)\" data=\"product\" class=\"layui-btn  layui-btn-success\" type=\"button\">{fun JZLANG('清理手机静态HTML')}</button>\r\n\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-gray\" type=\"button\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t{loop table=\"molds\" sys=\"0\" as=\"v\"}\r\n\t\t\t\t\t{if($v['biaoshi']!='links' && $v['biaoshi']!='tags')}\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t<td>{$v['name']}{fun JZLANG('模块')}<input name=\"model[]\" value=\"{$v['biaoshi']}\" type=\"hidden\"></td>\r\n\t\t\t\t\t<td><select class=\"tid\" lay-search name=\"tid[]\"  >\r\n\t\t\t\t\t\t<option value=\"0\">{fun JZLANG('所有栏目')}</option>\r\n\t\t\t\t\t\t{foreach $classtypetree as $vv}\r\n\t\t\t\t\t   {if($vv['molds']==$v['biaoshi'])}\r\n\t\t\t\t\t   <option value=\"{$v['id']}\">{fun str_repeat('--', $vv['level']), $vv['classname']}</option>\r\n\t\t\t\t\t   {/if}\r\n\t\t\t\t\t   {/foreach}\r\n\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t<td><select class=\"isshow\" name=\"isshow[]\"  >\r\n\t\t\t\t\t\t<option value=\"1\">{fun JZLANG('显示的')}{$v['name']}</option>\r\n\t\t\t\t\t\t<option value=\"2\">{fun JZLANG('所有的')}{$v['name']}</option>\r\n\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t<td><button onclick=\"tohtml(this)\" data=\"{$v['biaoshi']}\" class=\"layui-btn\" type=\"button\">{fun JZLANG('生成电脑静态')}</button>\r\n\t\t\t\t\t<button onclick=\"tohtmlmobile(this)\" data=\"{$v['biaoshi']}\" class=\"layui-btn  layui-btn-warm\" type=\"button\">{fun JZLANG('生成手机静态')}</button>\r\n\t\t\t\t\t<button onclick=\"clearhtml(this)\" data=\"{$v['biaoshi']}\" class=\"layui-btn layui-btn-success\" type=\"button\">{fun JZLANG('清理电脑静态HTML')}</button>\r\n\t\t\t\t\t<button onclick=\"clearhtmlmobile(this)\" data=\"{$v['biaoshi']}\" class=\"layui-btn  layui-btn-success\" type=\"button\">{fun JZLANG('清理手机静态HTML')}</button>\r\n\t\t\t\t\t<button onclick=\"del(this)\"  class=\"layui-btn  layui-btn-gray\" type=\"button\">{fun JZLANG('删除')}</button>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{/loop}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t<input type=\"hidden\" name=\"type\" value=\"2\">\r\n\t\t\t\t\t\r\n\t\t\t\t\t</table>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t  \r\n\t\t\t\t\t  <div class=\"layui-form-item\" style=\"text-align:center;\">\r\n\t\t\t\t\t\t <button class=\"layui-btn\" lay-submit lay-filter=\"formDemo\">{fun JZLANG('批量生成电脑静态')}</button>\r\n\t\t\t\t\t\t  <button class=\"layui-btn  layui-btn-warm\" lay-submit lay-filter=\"formDemomobile\">{fun JZLANG('批量生成手机静态')}</button>\r\n\t\t\t\t\t\t  <button class=\"layui-btn layui-btn-success\" lay-submit lay-filter=\"clearformDemo\">{fun JZLANG('批量清理电脑静态')}</button>\r\n\t\t\t\t\t\t  <button class=\"layui-btn  layui-btn-success\" lay-submit lay-filter=\"clearformDemomobile\">{fun JZLANG('批量清理手机静态')}</button>\r\n\t\t\t\t\t  </div>\r\n\t\t\t\t\t</form>\r\n                </div>\r\n            </div>\r\n        </fieldset>\r\n       </div>\r\n       </div>\r\n       \r\n    </div>\r\n        <script>\r\n\t\tlayui.use(['laydate','form','layer','upload'], function(){\r\n                $ = layui.jquery;\r\n              var form = layui.form\r\n              ,layer = layui.layer;\r\n\t\t\t  laydate = layui.laydate;\r\n\t\t\t  var upload = layui.upload;\r\n\t\t\t     //监听提交\r\n              form.on('submit(formDemo)', function(data){\r\n\t\t\t\t//console.log(data.field);return false;\r\n\t\t\t\t\t$.ajax({\r\n\t\t\t\t\t\t url:\"{fun U('Index/tohtml')}?terminal=pc\",\r\n\t\t\t\t\t\t dataType:\"json\",\r\n\t\t\t\t\t\t async:true,\r\n\t\t\t\t\t\t data:data.field,\r\n\t\t\t\t\t\t type:\"POST\",\r\n\t\t\t\t\t\t beforeSend:function(){\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在处理~')}');\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t success:function(r){\r\n\t\t\t\t\t\t\tif(r.code==1){\r\n\t\t\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在准备生成静态，请不要关闭页面~')}',function(){\r\n\t\t\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t complete:function(){\r\n\t\t\t\t\t\t//请求完成的处理\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t error:function(){\r\n\t\t\t\t\t\t//请求出错处理\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t})\r\n                return false;\r\n              });\r\n\t\t\t  \r\n\t\t\t   form.on('submit(formDemomobile)', function(data){\r\n\t\t\t\t\t$.ajax({\r\n\t\t\t\t\t\t url:\"{fun U('Index/tohtml')}?terminal=mobile\",\r\n\t\t\t\t\t\t dataType:\"json\",\r\n\t\t\t\t\t\t async:true,\r\n\t\t\t\t\t\t data:data.field,\r\n\t\t\t\t\t\t type:\"POST\",\r\n\t\t\t\t\t\t beforeSend:function(){\r\n\t\t\t\t\t\t\t//请求前的处理\r\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在处理~')}');\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t success:function(r){\r\n\t\t\t\t\t\t\t//console.log(r);\r\n\t\t\t\t\t\t\tif(r.code==1){\r\n\t\t\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在准备生成静态，请不要关闭页面~')}',function(){\r\n\t\t\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t complete:function(){\r\n\t\t\t\t\t\t//请求完成的处理\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t error:function(){\r\n\t\t\t\t\t\t//请求出错处理\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t})\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n               \r\n                return false;\r\n              });\r\n\r\n\t\t\t  form.on('submit(clearformDemo)', function(data){\r\n\t\t\t\t//console.log(data.field);return false;\r\n\t\t\t\t\t$.ajax({\r\n\t\t\t\t\t\t url:\"{fun U('Index/tohtml')}?terminal=pc&clearhtml=1\",\r\n\t\t\t\t\t\t dataType:\"json\",\r\n\t\t\t\t\t\t async:true,\r\n\t\t\t\t\t\t data:data.field,\r\n\t\t\t\t\t\t type:\"POST\",\r\n\t\t\t\t\t\t beforeSend:function(){\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在处理~')}');\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t success:function(r){\r\n\t\t\t\t\t\t\tif(r.code==1){\r\n\t\t\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在准备清理电脑端静态HTML，请不要关闭页面~')}',function(){\r\n\t\t\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t complete:function(){\r\n\t\t\t\t\t\t//请求完成的处理\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t error:function(){\r\n\t\t\t\t\t\t//请求出错处理\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t})\r\n                return false;\r\n              });\r\n\r\n               form.on('submit(clearformDemomobile)', function(data){\r\n\t\t\t\t\t$.ajax({\r\n\t\t\t\t\t\t url:\"{fun U('Index/tohtml')}?terminal=mobile&clearhtml=1\",\r\n\t\t\t\t\t\t dataType:\"json\",\r\n\t\t\t\t\t\t async:true,\r\n\t\t\t\t\t\t data:data.field,\r\n\t\t\t\t\t\t type:\"POST\",\r\n\t\t\t\t\t\t beforeSend:function(){\r\n\t\t\t\t\t\t\t//请求前的处理\r\n\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在处理~')}');\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t success:function(r){\r\n\t\t\t\t\t\t\t//console.log(r);\r\n\t\t\t\t\t\t\tif(r.code==1){\r\n\t\t\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在准备清理手机端静态HTML，请不要关闭页面~')}',function(){\r\n\t\t\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t complete:function(){\r\n\t\t\t\t\t\t//请求完成的处理\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t error:function(){\r\n\t\t\t\t\t\t//请求出错处理\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t})\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n               \r\n                return false;\r\n              });\r\n\r\n\r\n\r\n\t\t})\r\n\t\t\r\n\t\tfunction tohtml(t){\r\n\t\t\tvar isshow = $(t).parent().prev().children('.isshow').val();\r\n\t\t\tvar model = $(t).attr('data');\r\n\t\t\tvar tid = $(t).parent().prev().prev().children('.tid').val();\r\n\t\t\r\n\t\t\t$.ajax({\r\n\t\t\t\t url:\"{fun U('Index/tohtml')}\",\r\n\t\t\t\t dataType:\"json\",\r\n\t\t\t\t async:true,\r\n\t\t\t\t data:{type:1,model:model,isshow:isshow,tid:tid,terminal:'pc'},\r\n\t\t\t\t type:\"POST\",\r\n\t\t\t\t beforeSend:function(){\r\n\t\t\t\t\tlayer.msg('{fun JZLANG('正在处理~')}');\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t},\r\n\t\t\t\t success:function(r){\r\n\t\t\t\t\t//console.log(r);\r\n\t\t\t\t\tif(r.code==1){\r\n\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在准备生成静态，请不要关闭页面~')}',function(){\r\n\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t complete:function(){\r\n\t\t\t\t//请求完成的处理\r\n\t\t\t\t},\r\n\t\t\t\t error:function(){\r\n\t\t\t\t\r\n\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t})\r\n\t\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tfunction tohtmlmobile(t){\r\n\t\t\tvar isshow = $(t).parent().prev().children('.isshow').val();\r\n\t\t\tvar model = $(t).attr('data');\r\n\t\t\tvar tid = $(t).parent().prev().prev().children('.tid').val();\r\n\t\t\r\n\t\t\t$.ajax({\r\n\t\t\t\t url:\"{fun U('Index/tohtml')}\",\r\n\t\t\t\t// dataType:\"json\",\r\n\t\t\t\t async:true,\r\n\t\t\t\t data:{type:1,model:model,isshow:isshow,tid:tid,terminal:'mobile'},\r\n\t\t\t\t type:\"POST\",\r\n\t\t\t\t beforeSend:function(){\r\n\t\t\t\t\tlayer.msg('{fun JZLANG('正在处理~')}');\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t},\r\n\t\t\t\t success:function(r){\r\n\t\t\t\t\r\n\t\t\t\t\tif(r.code==1){\r\n\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在准备生成静态，请不要关闭页面~')}',function(){\r\n\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t complete:function(){\r\n\t\t\t\t//请求完成的处理\r\n\t\t\t\t},\r\n\t\t\t\t error:function(){\r\n\t\t\t\t\r\n\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t})\r\n\t\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\tfunction clearhtml(t){\r\n\t\t\tvar isshow = $(t).parent().prev().children('.isshow').val();\r\n\t\t\tvar model = $(t).attr('data');\r\n\t\t\tvar tid = $(t).parent().prev().prev().children('.tid').val();\r\n\t\t\r\n\t\t\t$.ajax({\r\n\t\t\t\t url:\"{fun U('Index/tohtml')}\",\r\n\t\t\t\t dataType:\"json\",\r\n\t\t\t\t async:true,\r\n\t\t\t\t data:{type:1,model:model,isshow:isshow,tid:tid,terminal:'pc',clearhtml:1},\r\n\t\t\t\t type:\"POST\",\r\n\t\t\t\t beforeSend:function(){\r\n\t\t\t\t\tlayer.msg('{fun JZLANG('正在处理~')}');\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t},\r\n\t\t\t\t success:function(r){\r\n\t\t\t\t\t//console.log(r);\r\n\t\t\t\t\tif(r.code==1){\r\n\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在准备清理电脑端静态HTML，请不要关闭页面~')}',function(){\r\n\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t complete:function(){\r\n\t\t\t\t//请求完成的处理\r\n\t\t\t\t},\r\n\t\t\t\t error:function(){\r\n\t\t\t\t\r\n\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t})\r\n\t\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t}\r\n\r\n\t\tfunction clearhtmlmobile(t){\r\n\t\t\tvar isshow = $(t).parent().prev().children('.isshow').val();\r\n\t\t\tvar model = $(t).attr('data');\r\n\t\t\tvar tid = $(t).parent().prev().prev().children('.tid').val();\r\n\t\t\r\n\t\t\t$.ajax({\r\n\t\t\t\t url:\"{fun U('Index/tohtml')}\",\r\n\t\t\t\t// dataType:\"json\",\r\n\t\t\t\t async:true,\r\n\t\t\t\t data:{type:1,model:model,isshow:isshow,tid:tid,terminal:'mobile',clearhtml:1},\r\n\t\t\t\t type:\"POST\",\r\n\t\t\t\t beforeSend:function(){\r\n\t\t\t\t\tlayer.msg('{fun JZLANG('正在处理~')}');\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t},\r\n\t\t\t\t success:function(r){\r\n\t\t\t\t\r\n\t\t\t\t\tif(r.code==1){\r\n\t\t\t\t\t\tlayer.alert(r.msg);\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\tlayer.msg('{fun JZLANG('正在准备清理手机端静态HTML，请不要关闭页面~')}',function(){\r\n\t\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t complete:function(){\r\n\t\t\t\t//请求完成的处理\r\n\t\t\t\t},\r\n\t\t\t\t error:function(){\r\n\t\t\t\t\r\n\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t})\r\n\t\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\tfunction del(a){\r\n\t\t\t$(a).parent().parent().remove();\r\n\t\t}\r\n\t\t\r\n        </script>\r\n    </body>\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/unicode.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\"/>\n  <title>IconFont Demo</title>\n   <link rel=\"shortcut icon\" href=\"//img.alicdn.com/imgextra/i2/O1CN01ZyAlrn1MwaMhqz36G_!!6000000001499-73-tps-64-64.ico\" type=\"image/x-icon\"/>\n  <link rel=\"icon\" type=\"image/svg+xml\" href=\"//img.alicdn.com/imgextra/i4/O1CN01EYTRnJ297D6vehehJ_!!6000000008020-55-tps-64-64.svg\"/>\n  <link rel=\"stylesheet\" href=\"https://g.alicdn.com/thx/cube/1.3.2/cube.min.css\">\n  \n  <link rel=\"stylesheet\" href=\"{__Tpl_style__}/style/fonts/demo.css?v=1\">\n  <link rel=\"stylesheet\" href=\"{__Tpl_style__}/style/fonts/iconfont.css?v=1\">\n  <script src=\"{__Tpl_style__}/style/fonts/iconfont.js?v=1\"></script>\n  <script src=\"{__Tpl_style__}/style/js/jquery.min.js\"></script>\n\n  \n  <style>\n  .dib{cursor:pointer !important;}\n  </style>\n</head>\n<body>\n  <div class=\"main\">\n    <h1 class=\"logo\"><a href=\"https://www.iconfont.cn/\" title=\"iconfont 首页\" target=\"_blank\">&#xe86b;</a></h1>\n    <div class=\"nav-tabs\">\n      \n    \n    </div>\n    <div class=\"tab-container\">\n      <div class=\"content unicode\" style=\"display: block;\">\n          <ul class=\"icon_lists dib-box\">\n          \n            \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe974;</span>\n                <div class=\"name\">330横向收起</div>\n                <div class=\"code-name\">&amp;#xe974;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe975;</span>\n                <div class=\"name\">331刷新</div>\n                <div class=\"code-name\">&amp;#xe975;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe976;</span>\n                <div class=\"name\">332同步</div>\n                <div class=\"code-name\">&amp;#xe976;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe977;</span>\n                <div class=\"name\">333加载loading-A</div>\n                <div class=\"code-name\">&amp;#xe977;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe978;</span>\n                <div class=\"name\">333加载loading-B</div>\n                <div class=\"code-name\">&amp;#xe978;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe979;</span>\n                <div class=\"name\">401位置-线性</div>\n                <div class=\"code-name\">&amp;#xe979;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe97a;</span>\n                <div class=\"name\">401位置</div>\n                <div class=\"code-name\">&amp;#xe97a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe97b;</span>\n                <div class=\"name\">402导航</div>\n                <div class=\"code-name\">&amp;#xe97b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe97c;</span>\n                <div class=\"name\">404定位</div>\n                <div class=\"code-name\">&amp;#xe97c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe97d;</span>\n                <div class=\"name\">404监控、摄像头-线性</div>\n                <div class=\"code-name\">&amp;#xe97d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe97e;</span>\n                <div class=\"name\">403拓点图</div>\n                <div class=\"code-name\">&amp;#xe97e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe97f;</span>\n                <div class=\"name\">404监控、摄像头</div>\n                <div class=\"code-name\">&amp;#xe97f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe980;</span>\n                <div class=\"name\">405雷达、探测</div>\n                <div class=\"code-name\">&amp;#xe980;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe981;</span>\n                <div class=\"name\">406报表</div>\n                <div class=\"code-name\">&amp;#xe981;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe982;</span>\n                <div class=\"name\">407饼图-线性</div>\n                <div class=\"code-name\">&amp;#xe982;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe983;</span>\n                <div class=\"name\">406报表-线性</div>\n                <div class=\"code-name\">&amp;#xe983;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe984;</span>\n                <div class=\"name\">407饼图</div>\n                <div class=\"code-name\">&amp;#xe984;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe985;</span>\n                <div class=\"name\">408条形图</div>\n                <div class=\"code-name\">&amp;#xe985;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe986;</span>\n                <div class=\"name\">408条形图-线性</div>\n                <div class=\"code-name\">&amp;#xe986;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe987;</span>\n                <div class=\"name\">409折线图</div>\n                <div class=\"code-name\">&amp;#xe987;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe988;</span>\n                <div class=\"name\">409折线图-线性</div>\n                <div class=\"code-name\">&amp;#xe988;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe989;</span>\n                <div class=\"name\">410指南、指导-线性</div>\n                <div class=\"code-name\">&amp;#xe989;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe98a;</span>\n                <div class=\"name\">411地图</div>\n                <div class=\"code-name\">&amp;#xe98a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe98b;</span>\n                <div class=\"name\">410指南、指导</div>\n                <div class=\"code-name\">&amp;#xe98b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe98c;</span>\n                <div class=\"name\">902投诉</div>\n                <div class=\"code-name\">&amp;#xe98c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe98d;</span>\n                <div class=\"name\">901巡检、检验</div>\n                <div class=\"code-name\">&amp;#xe98d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe98e;</span>\n                <div class=\"name\">50店铺</div>\n                <div class=\"code-name\">&amp;#xe98e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe88f;</span>\n                <div class=\"name\">01运输中、物流-线性</div>\n                <div class=\"code-name\">&amp;#xe88f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe98f;</span>\n                <div class=\"name\">50店铺-线性</div>\n                <div class=\"code-name\">&amp;#xe98f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe890;</span>\n                <div class=\"name\">01运输中、物流</div>\n                <div class=\"code-name\">&amp;#xe890;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe990;</span>\n                <div class=\"name\">51快递员</div>\n                <div class=\"code-name\">&amp;#xe990;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe891;</span>\n                <div class=\"name\">02包裹、发货</div>\n                <div class=\"code-name\">&amp;#xe891;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe991;</span>\n                <div class=\"name\">51快递员-线性</div>\n                <div class=\"code-name\">&amp;#xe991;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe892;</span>\n                <div class=\"name\">02包裹、发货-线性</div>\n                <div class=\"code-name\">&amp;#xe892;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe992;</span>\n                <div class=\"name\">44贷款-线性</div>\n                <div class=\"code-name\">&amp;#xe992;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe893;</span>\n                <div class=\"name\">03拆包裹、取件</div>\n                <div class=\"code-name\">&amp;#xe893;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe993;</span>\n                <div class=\"name\">45还款-线性</div>\n                <div class=\"code-name\">&amp;#xe993;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe894;</span>\n                <div class=\"name\">03拆包裹、取件-线性</div>\n                <div class=\"code-name\">&amp;#xe894;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe994;</span>\n                <div class=\"name\">47退款-细</div>\n                <div class=\"code-name\">&amp;#xe994;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe895;</span>\n                <div class=\"name\">04自提柜</div>\n                <div class=\"code-name\">&amp;#xe895;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe995;</span>\n                <div class=\"name\">234日历-线性-细</div>\n                <div class=\"code-name\">&amp;#xe995;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe896;</span>\n                <div class=\"name\">04自提柜-线性</div>\n                <div class=\"code-name\">&amp;#xe896;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe996;</span>\n                <div class=\"name\">49计算器、利率-线性-细</div>\n                <div class=\"code-name\">&amp;#xe996;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe897;</span>\n                <div class=\"name\">05采购-线性</div>\n                <div class=\"code-name\">&amp;#xe897;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe997;</span>\n                <div class=\"name\">257用户资料</div>\n                <div class=\"code-name\">&amp;#xe997;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe898;</span>\n                <div class=\"name\">05采购</div>\n                <div class=\"code-name\">&amp;#xe898;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe998;</span>\n                <div class=\"name\">257用户资料-线性</div>\n                <div class=\"code-name\">&amp;#xe998;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe899;</span>\n                <div class=\"name\">06商品</div>\n                <div class=\"code-name\">&amp;#xe899;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe999;</span>\n                <div class=\"name\">258皮肤&主题</div>\n                <div class=\"code-name\">&amp;#xe999;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe89a;</span>\n                <div class=\"name\">06商品-线性</div>\n                <div class=\"code-name\">&amp;#xe89a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe99a;</span>\n                <div class=\"name\">258皮肤&主题-线性</div>\n                <div class=\"code-name\">&amp;#xe99a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe89b;</span>\n                <div class=\"name\">07配载、装车</div>\n                <div class=\"code-name\">&amp;#xe89b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe99b;</span>\n                <div class=\"name\">259钻石</div>\n                <div class=\"code-name\">&amp;#xe99b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe89c;</span>\n                <div class=\"name\">07配载、装车-线性</div>\n                <div class=\"code-name\">&amp;#xe89c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe99c;</span>\n                <div class=\"name\">259钻石-线性</div>\n                <div class=\"code-name\">&amp;#xe99c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe89d;</span>\n                <div class=\"name\">08质量-线性</div>\n                <div class=\"code-name\">&amp;#xe89d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe99d;</span>\n                <div class=\"name\">54设计-线性</div>\n                <div class=\"code-name\">&amp;#xe99d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe89e;</span>\n                <div class=\"name\">08质量</div>\n                <div class=\"code-name\">&amp;#xe89e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe99e;</span>\n                <div class=\"name\">55开发-线性</div>\n                <div class=\"code-name\">&amp;#xe99e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe89f;</span>\n                <div class=\"name\">09安全、保障</div>\n                <div class=\"code-name\">&amp;#xe89f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe99f;</span>\n                <div class=\"name\">48银行卡</div>\n                <div class=\"code-name\">&amp;#xe99f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a0;</span>\n                <div class=\"name\">09安全、保障-线性</div>\n                <div class=\"code-name\">&amp;#xe8a0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a0;</span>\n                <div class=\"name\">48银行卡-线性</div>\n                <div class=\"code-name\">&amp;#xe9a0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a1;</span>\n                <div class=\"name\">10仓库、仓储</div>\n                <div class=\"code-name\">&amp;#xe8a1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a1;</span>\n                <div class=\"name\">52红包-线性</div>\n                <div class=\"code-name\">&amp;#xe9a1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a2;</span>\n                <div class=\"name\">10仓库、仓储-线性</div>\n                <div class=\"code-name\">&amp;#xe8a2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a2;</span>\n                <div class=\"name\">52红包</div>\n                <div class=\"code-name\">&amp;#xe9a2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a3;</span>\n                <div class=\"name\">11中转站-线性</div>\n                <div class=\"code-name\">&amp;#xe8a3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a3;</span>\n                <div class=\"name\">爱心</div>\n                <div class=\"code-name\">&amp;#xe9a3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a4;</span>\n                <div class=\"name\">11中转站</div>\n                <div class=\"code-name\">&amp;#xe8a4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a4;</span>\n                <div class=\"name\">编辑</div>\n                <div class=\"code-name\">&amp;#xe9a4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a5;</span>\n                <div class=\"name\">12库存-线性</div>\n                <div class=\"code-name\">&amp;#xe8a5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a5;</span>\n                <div class=\"name\">3D眼镜</div>\n                <div class=\"code-name\">&amp;#xe9a5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a6;</span>\n                <div class=\"name\">12库存</div>\n                <div class=\"code-name\">&amp;#xe8a6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a6;</span>\n                <div class=\"name\">彩蛋</div>\n                <div class=\"code-name\">&amp;#xe9a6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a7;</span>\n                <div class=\"name\">13末端网点-线性</div>\n                <div class=\"code-name\">&amp;#xe8a7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a7;</span>\n                <div class=\"name\">安全</div>\n                <div class=\"code-name\">&amp;#xe9a7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a8;</span>\n                <div class=\"name\">13末端网点</div>\n                <div class=\"code-name\">&amp;#xe8a8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a8;</span>\n                <div class=\"name\">帮助</div>\n                <div class=\"code-name\">&amp;#xe9a8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8a9;</span>\n                <div class=\"name\">14签收、审批通过-线性</div>\n                <div class=\"code-name\">&amp;#xe8a9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9a9;</span>\n                <div class=\"name\">不感兴趣</div>\n                <div class=\"code-name\">&amp;#xe9a9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8aa;</span>\n                <div class=\"name\">14签收、审批通过</div>\n                <div class=\"code-name\">&amp;#xe8aa;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9aa;</span>\n                <div class=\"name\">播放记录</div>\n                <div class=\"code-name\">&amp;#xe9aa;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ab;</span>\n                <div class=\"name\">15拒签收-线性</div>\n                <div class=\"code-name\">&amp;#xe8ab;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ab;</span>\n                <div class=\"name\">创作</div>\n                <div class=\"code-name\">&amp;#xe9ab;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ac;</span>\n                <div class=\"name\">15拒签收</div>\n                <div class=\"code-name\">&amp;#xe8ac;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ac;</span>\n                <div class=\"name\">成功</div>\n                <div class=\"code-name\">&amp;#xe9ac;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ad;</span>\n                <div class=\"name\">16寄件、发送-线性</div>\n                <div class=\"code-name\">&amp;#xe8ad;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ad;</span>\n                <div class=\"name\">测试</div>\n                <div class=\"code-name\">&amp;#xe9ad;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ae;</span>\n                <div class=\"name\">16寄件、发送</div>\n                <div class=\"code-name\">&amp;#xe8ae;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ae;</span>\n                <div class=\"name\">电话</div>\n                <div class=\"code-name\">&amp;#xe9ae;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8af;</span>\n                <div class=\"name\">17企业、园区、物业</div>\n                <div class=\"code-name\">&amp;#xe8af;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9af;</span>\n                <div class=\"name\">点赞</div>\n                <div class=\"code-name\">&amp;#xe9af;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b0;</span>\n                <div class=\"name\">17企业、园区、物业-线性</div>\n                <div class=\"code-name\">&amp;#xe8b0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b0;</span>\n                <div class=\"name\">定位</div>\n                <div class=\"code-name\">&amp;#xe9b0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b1;</span>\n                <div class=\"name\">19结算-线性</div>\n                <div class=\"code-name\">&amp;#xe8b1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b1;</span>\n                <div class=\"name\">电筒_关</div>\n                <div class=\"code-name\">&amp;#xe9b1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b2;</span>\n                <div class=\"name\">19结算</div>\n                <div class=\"code-name\">&amp;#xe8b2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b2;</span>\n                <div class=\"name\">电影</div>\n                <div class=\"code-name\">&amp;#xe9b2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b3;</span>\n                <div class=\"name\">20积分</div>\n                <div class=\"code-name\">&amp;#xe8b3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b3;</span>\n                <div class=\"name\">地图</div>\n                <div class=\"code-name\">&amp;#xe9b3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b4;</span>\n                <div class=\"name\">20积分-线性</div>\n                <div class=\"code-name\">&amp;#xe8b4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b4;</span>\n                <div class=\"name\">电筒_开</div>\n                <div class=\"code-name\">&amp;#xe9b4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b5;</span>\n                <div class=\"name\">21优惠劵-线性</div>\n                <div class=\"code-name\">&amp;#xe8b5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b5;</span>\n                <div class=\"name\">电影票</div>\n                <div class=\"code-name\">&amp;#xe9b5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b6;</span>\n                <div class=\"name\">22资料、手册</div>\n                <div class=\"code-name\">&amp;#xe8b6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b6;</span>\n                <div class=\"name\">订单</div>\n                <div class=\"code-name\">&amp;#xe9b6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b7;</span>\n                <div class=\"name\">22资料、手册-线性</div>\n                <div class=\"code-name\">&amp;#xe8b7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b7;</span>\n                <div class=\"name\">更多</div>\n                <div class=\"code-name\">&amp;#xe9b7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b8;</span>\n                <div class=\"name\">21优惠劵</div>\n                <div class=\"code-name\">&amp;#xe8b8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b8;</span>\n                <div class=\"name\">翻倍</div>\n                <div class=\"code-name\">&amp;#xe9b8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8b9;</span>\n                <div class=\"name\">23规则</div>\n                <div class=\"code-name\">&amp;#xe8b9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9b9;</span>\n                <div class=\"name\">发现</div>\n                <div class=\"code-name\">&amp;#xe9b9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ba;</span>\n                <div class=\"name\">25单据-线性</div>\n                <div class=\"code-name\">&amp;#xe8ba;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ba;</span>\n                <div class=\"name\">儿童票</div>\n                <div class=\"code-name\">&amp;#xe9ba;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8bb;</span>\n                <div class=\"name\">24组织架构、接口</div>\n                <div class=\"code-name\">&amp;#xe8bb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9bb;</span>\n                <div class=\"name\">公益</div>\n                <div class=\"code-name\">&amp;#xe9bb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8bc;</span>\n                <div class=\"name\">25单据</div>\n                <div class=\"code-name\">&amp;#xe8bc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9bc;</span>\n                <div class=\"name\">红包</div>\n                <div class=\"code-name\">&amp;#xe9bc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8bd;</span>\n                <div class=\"name\">26创建单据-线性</div>\n                <div class=\"code-name\">&amp;#xe8bd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9bd;</span>\n                <div class=\"name\">复制</div>\n                <div class=\"code-name\">&amp;#xe9bd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8be;</span>\n                <div class=\"name\">26创建单据</div>\n                <div class=\"code-name\">&amp;#xe8be;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9be;</span>\n                <div class=\"name\">分享</div>\n                <div class=\"code-name\">&amp;#xe9be;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8bf;</span>\n                <div class=\"name\">27账单-线性</div>\n                <div class=\"code-name\">&amp;#xe8bf;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9bf;</span>\n                <div class=\"name\">话题符号</div>\n                <div class=\"code-name\">&amp;#xe9bf;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c0;</span>\n                <div class=\"name\">27账单</div>\n                <div class=\"code-name\">&amp;#xe8c0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c0;</span>\n                <div class=\"name\">会员</div>\n                <div class=\"code-name\">&amp;#xe9c0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c1;</span>\n                <div class=\"name\">28体积、空间</div>\n                <div class=\"code-name\">&amp;#xe8c1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c1;</span>\n                <div class=\"name\">阿里鱼</div>\n                <div class=\"code-name\">&amp;#xe9c1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c2;</span>\n                <div class=\"name\">28体积、空间-线性</div>\n                <div class=\"code-name\">&amp;#xe8c2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c2;</span>\n                <div class=\"name\">机具</div>\n                <div class=\"code-name\">&amp;#xe9c2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c3;</span>\n                <div class=\"name\">29业务-线性</div>\n                <div class=\"code-name\">&amp;#xe8c3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c3;</span>\n                <div class=\"name\">减少</div>\n                <div class=\"code-name\">&amp;#xe9c3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c4;</span>\n                <div class=\"name\">29业务</div>\n                <div class=\"code-name\">&amp;#xe8c4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c4;</span>\n                <div class=\"name\">卡包</div>\n                <div class=\"code-name\">&amp;#xe9c4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c5;</span>\n                <div class=\"name\">30应用程序-线性</div>\n                <div class=\"code-name\">&amp;#xe8c5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c5;</span>\n                <div class=\"name\">话题</div>\n                <div class=\"code-name\">&amp;#xe9c5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c6;</span>\n                <div class=\"name\">30应用程序</div>\n                <div class=\"code-name\">&amp;#xe8c6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c6;</span>\n                <div class=\"name\">关注</div>\n                <div class=\"code-name\">&amp;#xe9c6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c7;</span>\n                <div class=\"name\">31标准</div>\n                <div class=\"code-name\">&amp;#xe8c7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c7;</span>\n                <div class=\"name\">买一赠一</div>\n                <div class=\"code-name\">&amp;#xe9c7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c8;</span>\n                <div class=\"name\">31标准-线性</div>\n                <div class=\"code-name\">&amp;#xe8c8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c8;</span>\n                <div class=\"name\">密码</div>\n                <div class=\"code-name\">&amp;#xe9c8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8c9;</span>\n                <div class=\"name\">32权限、钥匙</div>\n                <div class=\"code-name\">&amp;#xe8c9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9c9;</span>\n                <div class=\"name\">男</div>\n                <div class=\"code-name\">&amp;#xe9c9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ca;</span>\n                <div class=\"name\">32权限、钥匙-线性</div>\n                <div class=\"code-name\">&amp;#xe8ca;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ca;</span>\n                <div class=\"name\">女</div>\n                <div class=\"code-name\">&amp;#xe9ca;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8cb;</span>\n                <div class=\"name\">33资源</div>\n                <div class=\"code-name\">&amp;#xe8cb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9cb;</span>\n                <div class=\"name\">礼盒</div>\n                <div class=\"code-name\">&amp;#xe9cb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8cc;</span>\n                <div class=\"name\">33资源-线性</div>\n                <div class=\"code-name\">&amp;#xe8cc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9cc;</span>\n                <div class=\"name\">排行榜</div>\n                <div class=\"code-name\">&amp;#xe9cc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8cd;</span>\n                <div class=\"name\">34模板、框架-线性</div>\n                <div class=\"code-name\">&amp;#xe8cd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9cd;</span>\n                <div class=\"name\">礼品卡</div>\n                <div class=\"code-name\">&amp;#xe9cd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ce;</span>\n                <div class=\"name\">34模板、框架</div>\n                <div class=\"code-name\">&amp;#xe8ce;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ce;</span>\n                <div class=\"name\">朋友圈</div>\n                <div class=\"code-name\">&amp;#xe9ce;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8cf;</span>\n                <div class=\"name\">35新闻、资讯</div>\n                <div class=\"code-name\">&amp;#xe8cf;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9cf;</span>\n                <div class=\"name\">明星活动</div>\n                <div class=\"code-name\">&amp;#xe9cf;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d0;</span>\n                <div class=\"name\">35新闻、资讯-线性</div>\n                <div class=\"code-name\">&amp;#xe8d0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d0;</span>\n                <div class=\"name\">取票</div>\n                <div class=\"code-name\">&amp;#xe9d0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d1;</span>\n                <div class=\"name\">36合作、关系-线性</div>\n                <div class=\"code-name\">&amp;#xe8d1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d1;</span>\n                <div class=\"name\">扫一扫</div>\n                <div class=\"code-name\">&amp;#xe9d1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d2;</span>\n                <div class=\"name\">36合作、关系</div>\n                <div class=\"code-name\">&amp;#xe8d2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d2;</span>\n                <div class=\"name\">日历</div>\n                <div class=\"code-name\">&amp;#xe9d2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d3;</span>\n                <div class=\"name\">36线路</div>\n                <div class=\"code-name\">&amp;#xe8d3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d3;</span>\n                <div class=\"name\">评论</div>\n                <div class=\"code-name\">&amp;#xe9d3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d4;</span>\n                <div class=\"name\">37-服务-线性</div>\n                <div class=\"code-name\">&amp;#xe8d4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d4;</span>\n                <div class=\"name\">轻会员</div>\n                <div class=\"code-name\">&amp;#xe9d4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d5;</span>\n                <div class=\"name\">37-服务</div>\n                <div class=\"code-name\">&amp;#xe8d5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d5;</span>\n                <div class=\"name\">日签</div>\n                <div class=\"code-name\">&amp;#xe9d5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d6;</span>\n                <div class=\"name\">38-客服-线性</div>\n                <div class=\"code-name\">&amp;#xe8d6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d6;</span>\n                <div class=\"name\">闪电</div>\n                <div class=\"code-name\">&amp;#xe9d6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d7;</span>\n                <div class=\"name\">38-客服</div>\n                <div class=\"code-name\">&amp;#xe8d7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d7;</span>\n                <div class=\"name\">筛选</div>\n                <div class=\"code-name\">&amp;#xe9d7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d8;</span>\n                <div class=\"name\">39-国际-线性</div>\n                <div class=\"code-name\">&amp;#xe8d8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d8;</span>\n                <div class=\"name\">商圈</div>\n                <div class=\"code-name\">&amp;#xe9d8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8d9;</span>\n                <div class=\"name\">39-国际</div>\n                <div class=\"code-name\">&amp;#xe8d9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9d9;</span>\n                <div class=\"name\">删除</div>\n                <div class=\"code-name\">&amp;#xe9d9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8da;</span>\n                <div class=\"name\">40海关-线性</div>\n                <div class=\"code-name\">&amp;#xe8da;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9da;</span>\n                <div class=\"name\">设置</div>\n                <div class=\"code-name\">&amp;#xe9da;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8db;</span>\n                <div class=\"name\">40海关</div>\n                <div class=\"code-name\">&amp;#xe8db;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9db;</span>\n                <div class=\"name\">上传</div>\n                <div class=\"code-name\">&amp;#xe9db;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8dc;</span>\n                <div class=\"name\">41头程、空运</div>\n                <div class=\"code-name\">&amp;#xe8dc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9dc;</span>\n                <div class=\"name\">社区</div>\n                <div class=\"code-name\">&amp;#xe9dc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8dd;</span>\n                <div class=\"name\">42尾程</div>\n                <div class=\"code-name\">&amp;#xe8dd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9dd;</span>\n                <div class=\"name\">声音关闭</div>\n                <div class=\"code-name\">&amp;#xe9dd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8de;</span>\n                <div class=\"name\">43财务</div>\n                <div class=\"code-name\">&amp;#xe8de;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9de;</span>\n                <div class=\"name\">失败</div>\n                <div class=\"code-name\">&amp;#xe9de;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8df;</span>\n                <div class=\"name\">43财务-线性</div>\n                <div class=\"code-name\">&amp;#xe8df;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9df;</span>\n                <div class=\"name\">时间</div>\n                <div class=\"code-name\">&amp;#xe9df;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e0;</span>\n                <div class=\"name\">46免费</div>\n                <div class=\"code-name\">&amp;#xe8e0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e0;</span>\n                <div class=\"name\">声音</div>\n                <div class=\"code-name\">&amp;#xe9e0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e1;</span>\n                <div class=\"name\">46免费-线性</div>\n                <div class=\"code-name\">&amp;#xe8e1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e1;</span>\n                <div class=\"name\">收藏</div>\n                <div class=\"code-name\">&amp;#xe9e1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e2;</span>\n                <div class=\"name\">47退款</div>\n                <div class=\"code-name\">&amp;#xe8e2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e2;</span>\n                <div class=\"name\">手机</div>\n                <div class=\"code-name\">&amp;#xe9e2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e3;</span>\n                <div class=\"name\">49计算器、利率</div>\n                <div class=\"code-name\">&amp;#xe8e3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e3;</span>\n                <div class=\"name\">首页</div>\n                <div class=\"code-name\">&amp;#xe9e3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e4;</span>\n                <div class=\"name\">49计算器、利率-线性</div>\n                <div class=\"code-name\">&amp;#xe8e4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e4;</span>\n                <div class=\"name\">数据</div>\n                <div class=\"code-name\">&amp;#xe9e4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e5;</span>\n                <div class=\"name\">201checkbox-未选</div>\n                <div class=\"code-name\">&amp;#xe8e5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e5;</span>\n                <div class=\"name\">刷新</div>\n                <div class=\"code-name\">&amp;#xe9e5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e6;</span>\n                <div class=\"name\">201checkbox-选中</div>\n                <div class=\"code-name\">&amp;#xe8e6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e6;</span>\n                <div class=\"name\">搜索</div>\n                <div class=\"code-name\">&amp;#xe9e6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e7;</span>\n                <div class=\"name\">202Raidobox-未选</div>\n                <div class=\"code-name\">&amp;#xe8e7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e7;</span>\n                <div class=\"name\">叹号</div>\n                <div class=\"code-name\">&amp;#xe9e7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e8;</span>\n                <div class=\"name\">202Raidobox-选中</div>\n                <div class=\"code-name\">&amp;#xe8e8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e8;</span>\n                <div class=\"name\">讨论区</div>\n                <div class=\"code-name\">&amp;#xe9e8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8e9;</span>\n                <div class=\"name\">201checkbox-选中部分</div>\n                <div class=\"code-name\">&amp;#xe8e9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9e9;</span>\n                <div class=\"name\">添加优惠券</div>\n                <div class=\"code-name\">&amp;#xe9e9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ea;</span>\n                <div class=\"name\">203右下角勾选</div>\n                <div class=\"code-name\">&amp;#xe8ea;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ea;</span>\n                <div class=\"name\">提示</div>\n                <div class=\"code-name\">&amp;#xe9ea;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8eb;</span>\n                <div class=\"name\">206搜索-线性</div>\n                <div class=\"code-name\">&amp;#xe8eb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9eb;</span>\n                <div class=\"name\">图片</div>\n                <div class=\"code-name\">&amp;#xe9eb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ec;</span>\n                <div class=\"name\">205设置-线性</div>\n                <div class=\"code-name\">&amp;#xe8ec;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ec;</span>\n                <div class=\"name\">退票</div>\n                <div class=\"code-name\">&amp;#xe9ec;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ed;</span>\n                <div class=\"name\">205设置</div>\n                <div class=\"code-name\">&amp;#xe8ed;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ed;</span>\n                <div class=\"name\">未选中</div>\n                <div class=\"code-name\">&amp;#xe9ed;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ee;</span>\n                <div class=\"name\">204首页</div>\n                <div class=\"code-name\">&amp;#xe8ee;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ee;</span>\n                <div class=\"name\">微博</div>\n                <div class=\"code-name\">&amp;#xe9ee;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ef;</span>\n                <div class=\"name\">204首页-线性</div>\n                <div class=\"code-name\">&amp;#xe8ef;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ef;</span>\n                <div class=\"name\">问卷</div>\n                <div class=\"code-name\">&amp;#xe9ef;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f0;</span>\n                <div class=\"name\">206搜索</div>\n                <div class=\"code-name\">&amp;#xe8f0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f0;</span>\n                <div class=\"name\">我的</div>\n                <div class=\"code-name\">&amp;#xe9f0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f1;</span>\n                <div class=\"name\">207问题-线性</div>\n                <div class=\"code-name\">&amp;#xe8f1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f1;</span>\n                <div class=\"name\">微信</div>\n                <div class=\"code-name\">&amp;#xe9f1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f2;</span>\n                <div class=\"name\">207问题</div>\n                <div class=\"code-name\">&amp;#xe8f2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f2;</span>\n                <div class=\"name\">我的关注</div>\n                <div class=\"code-name\">&amp;#xe9f2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f3;</span>\n                <div class=\"name\">209电话-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe8f3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f3;</span>\n                <div class=\"name\">虾米</div>\n                <div class=\"code-name\">&amp;#xe9f3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f4;</span>\n                <div class=\"name\">208聊天、对话</div>\n                <div class=\"code-name\">&amp;#xe8f4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f4;</span>\n                <div class=\"name\">想看</div>\n                <div class=\"code-name\">&amp;#xe9f4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f5;</span>\n                <div class=\"name\">208聊天、对话-线性</div>\n                <div class=\"code-name\">&amp;#xe8f5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f5;</span>\n                <div class=\"name\">相机</div>\n                <div class=\"code-name\">&amp;#xe9f5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f6;</span>\n                <div class=\"name\">209电话</div>\n                <div class=\"code-name\">&amp;#xe8f6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f6;</span>\n                <div class=\"name\">消息</div>\n                <div class=\"code-name\">&amp;#xe9f6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f7;</span>\n                <div class=\"name\">209电话-圆框</div>\n                <div class=\"code-name\">&amp;#xe8f7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f7;</span>\n                <div class=\"name\">下载</div>\n                <div class=\"code-name\">&amp;#xe9f7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f8;</span>\n                <div class=\"name\">210信-线性</div>\n                <div class=\"code-name\">&amp;#xe8f8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f8;</span>\n                <div class=\"name\">小聚场</div>\n                <div class=\"code-name\">&amp;#xe9f8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8f9;</span>\n                <div class=\"name\">211铃铛</div>\n                <div class=\"code-name\">&amp;#xe8f9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9f9;</span>\n                <div class=\"name\">小食</div>\n                <div class=\"code-name\">&amp;#xe9f9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8fa;</span>\n                <div class=\"name\">211铃铛-线性</div>\n                <div class=\"code-name\">&amp;#xe8fa;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9fa;</span>\n                <div class=\"name\">消息中心</div>\n                <div class=\"code-name\">&amp;#xe9fa;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8fb;</span>\n                <div class=\"name\">210信</div>\n                <div class=\"code-name\">&amp;#xe8fb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9fb;</span>\n                <div class=\"name\">银行卡</div>\n                <div class=\"code-name\">&amp;#xe9fb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8fc;</span>\n                <div class=\"name\">212喇叭-线性</div>\n                <div class=\"code-name\">&amp;#xe8fc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9fc;</span>\n                <div class=\"name\">眼睛</div>\n                <div class=\"code-name\">&amp;#xe9fc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8fd;</span>\n                <div class=\"name\">212喇叭</div>\n                <div class=\"code-name\">&amp;#xe8fd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9fd;</span>\n                <div class=\"name\">影城卡</div>\n                <div class=\"code-name\">&amp;#xe9fd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8fe;</span>\n                <div class=\"name\">213麦克风-线性</div>\n                <div class=\"code-name\">&amp;#xe8fe;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9fe;</span>\n                <div class=\"name\">已想看</div>\n                <div class=\"code-name\">&amp;#xe9fe;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe8ff;</span>\n                <div class=\"name\">213收藏</div>\n                <div class=\"code-name\">&amp;#xe8ff;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe9ff;</span>\n                <div class=\"name\">影评模板</div>\n                <div class=\"code-name\">&amp;#xe9ff;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe900;</span>\n                <div class=\"name\">213麦克风</div>\n                <div class=\"code-name\">&amp;#xe900;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea00;</span>\n                <div class=\"name\">演出</div>\n                <div class=\"code-name\">&amp;#xea00;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe901;</span>\n                <div class=\"name\">213喜欢-线性</div>\n                <div class=\"code-name\">&amp;#xe901;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea01;</span>\n                <div class=\"name\">小蜜</div>\n                <div class=\"code-name\">&amp;#xea01;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe902;</span>\n                <div class=\"name\">213收藏-线性</div>\n                <div class=\"code-name\">&amp;#xe902;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea02;</span>\n                <div class=\"name\">影院</div>\n                <div class=\"code-name\">&amp;#xea02;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe903;</span>\n                <div class=\"name\">213喜欢</div>\n                <div class=\"code-name\">&amp;#xe903;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea03;</span>\n                <div class=\"name\">增加</div>\n                <div class=\"code-name\">&amp;#xea03;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe904;</span>\n                <div class=\"name\">215更多-横向</div>\n                <div class=\"code-name\">&amp;#xe904;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea04;</span>\n                <div class=\"name\">语音</div>\n                <div class=\"code-name\">&amp;#xea04;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe905;</span>\n                <div class=\"name\">216更多-竖向</div>\n                <div class=\"code-name\">&amp;#xe905;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea05;</span>\n                <div class=\"name\">优惠券</div>\n                <div class=\"code-name\">&amp;#xea05;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe906;</span>\n                <div class=\"name\">217时间-线性</div>\n                <div class=\"code-name\">&amp;#xe906;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea06;</span>\n                <div class=\"name\">WIFI</div>\n                <div class=\"code-name\">&amp;#xea06;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe907;</span>\n                <div class=\"name\">214声波、语音消息</div>\n                <div class=\"code-name\">&amp;#xe907;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea07;</span>\n                <div class=\"name\">直播</div>\n                <div class=\"code-name\">&amp;#xea07;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe908;</span>\n                <div class=\"name\">217时间</div>\n                <div class=\"code-name\">&amp;#xe908;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea08;</span>\n                <div class=\"name\">优酷会员</div>\n                <div class=\"code-name\">&amp;#xea08;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe909;</span>\n                <div class=\"name\">219上传、导出</div>\n                <div class=\"code-name\">&amp;#xe909;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea09;</span>\n                <div class=\"name\">娱乐宝</div>\n                <div class=\"code-name\">&amp;#xea09;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe90a;</span>\n                <div class=\"name\">218下载、导入</div>\n                <div class=\"code-name\">&amp;#xe90a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea0a;</span>\n                <div class=\"name\">指纹</div>\n                <div class=\"code-name\">&amp;#xea0a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe90b;</span>\n                <div class=\"name\">223保存-线性</div>\n                <div class=\"code-name\">&amp;#xe90b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea0b;</span>\n                <div class=\"name\">爱心</div>\n                <div class=\"code-name\">&amp;#xea0b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe90c;</span>\n                <div class=\"name\">220闪光灯</div>\n                <div class=\"code-name\">&amp;#xe90c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea0c;</span>\n                <div class=\"name\">成功</div>\n                <div class=\"code-name\">&amp;#xea0c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe90d;</span>\n                <div class=\"name\">222闪光灯-自动</div>\n                <div class=\"code-name\">&amp;#xe90d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea0d;</span>\n                <div class=\"name\">点赞</div>\n                <div class=\"code-name\">&amp;#xea0d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe90e;</span>\n                <div class=\"name\">221闪光灯-关闭</div>\n                <div class=\"code-name\">&amp;#xe90e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea0e;</span>\n                <div class=\"name\">电话</div>\n                <div class=\"code-name\">&amp;#xea0e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe90f;</span>\n                <div class=\"name\">223保存</div>\n                <div class=\"code-name\">&amp;#xe90f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea0f;</span>\n                <div class=\"name\">帮助</div>\n                <div class=\"code-name\">&amp;#xea0f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe910;</span>\n                <div class=\"name\">224用户-线性</div>\n                <div class=\"code-name\">&amp;#xe910;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea10;</span>\n                <div class=\"name\">电影票</div>\n                <div class=\"code-name\">&amp;#xea10;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe911;</span>\n                <div class=\"name\">224用户</div>\n                <div class=\"code-name\">&amp;#xe911;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea11;</span>\n                <div class=\"name\">发现</div>\n                <div class=\"code-name\">&amp;#xea11;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe912;</span>\n                <div class=\"name\">226角色、群体</div>\n                <div class=\"code-name\">&amp;#xe912;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea12;</span>\n                <div class=\"name\">定位</div>\n                <div class=\"code-name\">&amp;#xea12;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe913;</span>\n                <div class=\"name\">225默认头像</div>\n                <div class=\"code-name\">&amp;#xe913;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea13;</span>\n                <div class=\"name\">公告</div>\n                <div class=\"code-name\">&amp;#xea13;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe914;</span>\n                <div class=\"name\">227注册、添加好友</div>\n                <div class=\"code-name\">&amp;#xe914;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea14;</span>\n                <div class=\"name\">话题</div>\n                <div class=\"code-name\">&amp;#xea14;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe915;</span>\n                <div class=\"name\">228任务</div>\n                <div class=\"code-name\">&amp;#xe915;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea15;</span>\n                <div class=\"name\">减少</div>\n                <div class=\"code-name\">&amp;#xea15;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe916;</span>\n                <div class=\"name\">229中文模式</div>\n                <div class=\"code-name\">&amp;#xe916;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea16;</span>\n                <div class=\"name\">会员</div>\n                <div class=\"code-name\">&amp;#xea16;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe917;</span>\n                <div class=\"name\">231附件</div>\n                <div class=\"code-name\">&amp;#xe917;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea17;</span>\n                <div class=\"name\">评论</div>\n                <div class=\"code-name\">&amp;#xea17;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe918;</span>\n                <div class=\"name\">232编辑、输入-线性</div>\n                <div class=\"code-name\">&amp;#xe918;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea18;</span>\n                <div class=\"name\">社区</div>\n                <div class=\"code-name\">&amp;#xea18;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe919;</span>\n                <div class=\"name\">232编辑、输入</div>\n                <div class=\"code-name\">&amp;#xe919;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea19;</span>\n                <div class=\"name\">失败</div>\n                <div class=\"code-name\">&amp;#xea19;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe91a;</span>\n                <div class=\"name\">230英文模式</div>\n                <div class=\"code-name\">&amp;#xe91a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea1a;</span>\n                <div class=\"name\">时间</div>\n                <div class=\"code-name\">&amp;#xea1a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe91b;</span>\n                <div class=\"name\">233键盘-线性</div>\n                <div class=\"code-name\">&amp;#xe91b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea1b;</span>\n                <div class=\"name\">闪电</div>\n                <div class=\"code-name\">&amp;#xea1b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe91c;</span>\n                <div class=\"name\">233键盘</div>\n                <div class=\"code-name\">&amp;#xe91c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea1c;</span>\n                <div class=\"name\">我的</div>\n                <div class=\"code-name\">&amp;#xea1c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe91d;</span>\n                <div class=\"name\">234日历</div>\n                <div class=\"code-name\">&amp;#xe91d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea1d;</span>\n                <div class=\"name\">首页</div>\n                <div class=\"code-name\">&amp;#xea1d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe91e;</span>\n                <div class=\"name\">236未出勤</div>\n                <div class=\"code-name\">&amp;#xe91e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea1e;</span>\n                <div class=\"name\">手机</div>\n                <div class=\"code-name\">&amp;#xea1e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe91f;</span>\n                <div class=\"name\">235考勤、出勤</div>\n                <div class=\"code-name\">&amp;#xe91f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea1f;</span>\n                <div class=\"name\">叹号</div>\n                <div class=\"code-name\">&amp;#xea1f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe920;</span>\n                <div class=\"name\">237拍照</div>\n                <div class=\"code-name\">&amp;#xe920;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea20;</span>\n                <div class=\"name\">收藏</div>\n                <div class=\"code-name\">&amp;#xea20;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe921;</span>\n                <div class=\"name\">237拍照-线性</div>\n                <div class=\"code-name\">&amp;#xe921;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea21;</span>\n                <div class=\"name\">数据</div>\n                <div class=\"code-name\">&amp;#xea21;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe922;</span>\n                <div class=\"name\">238图片-线性</div>\n                <div class=\"code-name\">&amp;#xe922;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea22;</span>\n                <div class=\"name\">问答</div>\n                <div class=\"code-name\">&amp;#xea22;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe923;</span>\n                <div class=\"name\">238图片</div>\n                <div class=\"code-name\">&amp;#xe923;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea23;</span>\n                <div class=\"name\">眼睛</div>\n                <div class=\"code-name\">&amp;#xea23;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe924;</span>\n                <div class=\"name\">239扫描</div>\n                <div class=\"code-name\">&amp;#xe924;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea24;</span>\n                <div class=\"name\">影城卡</div>\n                <div class=\"code-name\">&amp;#xea24;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe925;</span>\n                <div class=\"name\">240显示、可见</div>\n                <div class=\"code-name\">&amp;#xe925;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea25;</span>\n                <div class=\"name\">相机</div>\n                <div class=\"code-name\">&amp;#xea25;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe926;</span>\n                <div class=\"name\">242锁定</div>\n                <div class=\"code-name\">&amp;#xe926;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea26;</span>\n                <div class=\"name\">影院</div>\n                <div class=\"code-name\">&amp;#xea26;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe927;</span>\n                <div class=\"name\">241隐藏、不可见</div>\n                <div class=\"code-name\">&amp;#xe927;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea27;</span>\n                <div class=\"name\">银行优惠</div>\n                <div class=\"code-name\">&amp;#xea27;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe928;</span>\n                <div class=\"name\">243解锁</div>\n                <div class=\"code-name\">&amp;#xe928;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea28;</span>\n                <div class=\"name\">小食</div>\n                <div class=\"code-name\">&amp;#xea28;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe929;</span>\n                <div class=\"name\">244安装、施工-线性</div>\n                <div class=\"code-name\">&amp;#xe929;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea29;</span>\n                <div class=\"name\">演出</div>\n                <div class=\"code-name\">&amp;#xea29;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe92a;</span>\n                <div class=\"name\">245筛选过滤</div>\n                <div class=\"code-name\">&amp;#xe92a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea2a;</span>\n                <div class=\"name\">增加</div>\n                <div class=\"code-name\">&amp;#xea2a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe92b;</span>\n                <div class=\"name\">244安装、施工</div>\n                <div class=\"code-name\">&amp;#xe92b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea2b;</span>\n                <div class=\"name\">电影</div>\n                <div class=\"code-name\">&amp;#xea2b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe92c;</span>\n                <div class=\"name\">246注销、关机</div>\n                <div class=\"code-name\">&amp;#xe92c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea2c;</span>\n                <div class=\"name\">优惠券</div>\n                <div class=\"code-name\">&amp;#xea2c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe92d;</span>\n                <div class=\"name\">247好评-圆框</div>\n                <div class=\"code-name\">&amp;#xe92d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea2d;</span>\n                <div class=\"name\">热门</div>\n                <div class=\"code-name\">&amp;#xea2d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe92e;</span>\n                <div class=\"name\">248差评-圆框</div>\n                <div class=\"code-name\">&amp;#xe92e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xea2e;</span>\n                <div class=\"name\">创作</div>\n                <div class=\"code-name\">&amp;#xea2e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe92f;</span>\n                <div class=\"name\">248差评</div>\n                <div class=\"code-name\">&amp;#xe92f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe930;</span>\n                <div class=\"name\">247好评</div>\n                <div class=\"code-name\">&amp;#xe930;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe931;</span>\n                <div class=\"name\">250一般</div>\n                <div class=\"code-name\">&amp;#xe931;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe932;</span>\n                <div class=\"name\">249满意</div>\n                <div class=\"code-name\">&amp;#xe932;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe933;</span>\n                <div class=\"name\">251不满意</div>\n                <div class=\"code-name\">&amp;#xe933;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe934;</span>\n                <div class=\"name\">253列表视图、菜单</div>\n                <div class=\"code-name\">&amp;#xe934;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe935;</span>\n                <div class=\"name\">252宫格视图</div>\n                <div class=\"code-name\">&amp;#xe935;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe936;</span>\n                <div class=\"name\">255Phone手机</div>\n                <div class=\"code-name\">&amp;#xe936;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe937;</span>\n                <div class=\"name\">254PC台式机</div>\n                <div class=\"code-name\">&amp;#xe937;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe938;</span>\n                <div class=\"name\">256PDA手持工作设备</div>\n                <div class=\"code-name\">&amp;#xe938;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe939;</span>\n                <div class=\"name\">301加-方框</div>\n                <div class=\"code-name\">&amp;#xe939;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe93a;</span>\n                <div class=\"name\">301加-线性方框</div>\n                <div class=\"code-name\">&amp;#xe93a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe93b;</span>\n                <div class=\"name\">301加-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe93b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe93c;</span>\n                <div class=\"name\">301加-圆框</div>\n                <div class=\"code-name\">&amp;#xe93c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe93d;</span>\n                <div class=\"name\">302减-方框</div>\n                <div class=\"code-name\">&amp;#xe93d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe93e;</span>\n                <div class=\"name\">301加</div>\n                <div class=\"code-name\">&amp;#xe93e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe93f;</span>\n                <div class=\"name\">302减-圆框</div>\n                <div class=\"code-name\">&amp;#xe93f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe940;</span>\n                <div class=\"name\">302减</div>\n                <div class=\"code-name\">&amp;#xe940;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe941;</span>\n                <div class=\"name\">302减-线性方框</div>\n                <div class=\"code-name\">&amp;#xe941;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe942;</span>\n                <div class=\"name\">303正确、完成-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe942;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe943;</span>\n                <div class=\"name\">303正确、完成-圆框</div>\n                <div class=\"code-name\">&amp;#xe943;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe944;</span>\n                <div class=\"name\">303正确、完成</div>\n                <div class=\"code-name\">&amp;#xe944;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe945;</span>\n                <div class=\"name\">302减-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe945;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe946;</span>\n                <div class=\"name\">304错误、关闭、取消-线性方框</div>\n                <div class=\"code-name\">&amp;#xe946;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe947;</span>\n                <div class=\"name\">304错误、关闭、取消-圆框</div>\n                <div class=\"code-name\">&amp;#xe947;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe948;</span>\n                <div class=\"name\">304错误、关闭、取消-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe948;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe949;</span>\n                <div class=\"name\">304错误、关闭、取消</div>\n                <div class=\"code-name\">&amp;#xe949;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe94a;</span>\n                <div class=\"name\">304错误、关闭、取消-方框</div>\n                <div class=\"code-name\">&amp;#xe94a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe94b;</span>\n                <div class=\"name\">305信息-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe94b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe94c;</span>\n                <div class=\"name\">305信息</div>\n                <div class=\"code-name\">&amp;#xe94c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe94d;</span>\n                <div class=\"name\">306问号-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe94d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe94e;</span>\n                <div class=\"name\">306问号</div>\n                <div class=\"code-name\">&amp;#xe94e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe94f;</span>\n                <div class=\"name\">306问号-圆框</div>\n                <div class=\"code-name\">&amp;#xe94f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe950;</span>\n                <div class=\"name\">305信息-圆框</div>\n                <div class=\"code-name\">&amp;#xe950;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe951;</span>\n                <div class=\"name\">307感叹号-三角框</div>\n                <div class=\"code-name\">&amp;#xe951;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe952;</span>\n                <div class=\"name\">307感叹号-圆框</div>\n                <div class=\"code-name\">&amp;#xe952;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe953;</span>\n                <div class=\"name\">307感叹号-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe953;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe954;</span>\n                <div class=\"name\">307感叹号-线性三角框</div>\n                <div class=\"code-name\">&amp;#xe954;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe955;</span>\n                <div class=\"name\">307感叹号</div>\n                <div class=\"code-name\">&amp;#xe955;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe956;</span>\n                <div class=\"name\">308上一页、后退、返回-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe956;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe957;</span>\n                <div class=\"name\">308上一页、后退、返回-圆框</div>\n                <div class=\"code-name\">&amp;#xe957;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe958;</span>\n                <div class=\"name\">309下一页、前进、查看更多-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe958;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe959;</span>\n                <div class=\"name\">309下一页、前进、查看更多-圆框</div>\n                <div class=\"code-name\">&amp;#xe959;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe95a;</span>\n                <div class=\"name\">308上一页、后退、返回</div>\n                <div class=\"code-name\">&amp;#xe95a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe95b;</span>\n                <div class=\"name\">309下一页、前进、查看更多</div>\n                <div class=\"code-name\">&amp;#xe95b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe95c;</span>\n                <div class=\"name\">310向下、展开-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe95c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe95d;</span>\n                <div class=\"name\">310向下、展开-圆框</div>\n                <div class=\"code-name\">&amp;#xe95d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe95e;</span>\n                <div class=\"name\">310向下、展开</div>\n                <div class=\"code-name\">&amp;#xe95e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe95f;</span>\n                <div class=\"name\">311向上、收起-圆框</div>\n                <div class=\"code-name\">&amp;#xe95f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe960;</span>\n                <div class=\"name\">311向上、收起-线性圆框</div>\n                <div class=\"code-name\">&amp;#xe960;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe961;</span>\n                <div class=\"name\">312指向左</div>\n                <div class=\"code-name\">&amp;#xe961;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe962;</span>\n                <div class=\"name\">313指向右</div>\n                <div class=\"code-name\">&amp;#xe962;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe963;</span>\n                <div class=\"name\">315指向上</div>\n                <div class=\"code-name\">&amp;#xe963;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe601;</span>\n                <div class=\"name\">微信</div>\n                <div class=\"code-name\">&amp;#xe601;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe600;</span>\n                <div class=\"name\">支付宝</div>\n                <div class=\"code-name\">&amp;#xe600;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe62e;</span>\n                <div class=\"name\">QQ</div>\n                <div class=\"code-name\">&amp;#xe62e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe60e;</span>\n                <div class=\"name\">微信</div>\n                <div class=\"code-name\">&amp;#xe60e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe621;</span>\n                <div class=\"name\">微信</div>\n                <div class=\"code-name\">&amp;#xe621;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe607;</span>\n                <div class=\"name\">qq</div>\n                <div class=\"code-name\">&amp;#xe607;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe66a;</span>\n                <div class=\"name\">qq</div>\n                <div class=\"code-name\">&amp;#xe66a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe603;</span>\n                <div class=\"name\">支付宝</div>\n                <div class=\"code-name\">&amp;#xe603;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6d4;</span>\n                <div class=\"name\">electrical</div>\n                <div class=\"code-name\">&amp;#xe6d4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6d7;</span>\n                <div class=\"name\">home</div>\n                <div class=\"code-name\">&amp;#xe6d7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6da;</span>\n                <div class=\"name\">electronics</div>\n                <div class=\"code-name\">&amp;#xe6da;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6db;</span>\n                <div class=\"name\">gifts</div>\n                <div class=\"code-name\">&amp;#xe6db;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6de;</span>\n                <div class=\"name\">lights</div>\n                <div class=\"code-name\">&amp;#xe6de;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e0;</span>\n                <div class=\"name\">sports</div>\n                <div class=\"code-name\">&amp;#xe6e0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e1;</span>\n                <div class=\"name\">toys</div>\n                <div class=\"code-name\">&amp;#xe6e1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e3;</span>\n                <div class=\"name\">auto</div>\n                <div class=\"code-name\">&amp;#xe6e3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e4;</span>\n                <div class=\"name\">jewelry</div>\n                <div class=\"code-name\">&amp;#xe6e4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e5;</span>\n                <div class=\"name\">trade-assurance</div>\n                <div class=\"code-name\">&amp;#xe6e5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e6;</span>\n                <div class=\"name\">browse</div>\n                <div class=\"code-name\">&amp;#xe6e6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e7;</span>\n                <div class=\"name\">rfq-qm</div>\n                <div class=\"code-name\">&amp;#xe6e7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e8;</span>\n                <div class=\"name\">rfq-quantity</div>\n                <div class=\"code-name\">&amp;#xe6e8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6e9;</span>\n                <div class=\"name\">atm-away</div>\n                <div class=\"code-name\">&amp;#xe6e9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6eb;</span>\n                <div class=\"name\">rfq</div>\n                <div class=\"code-name\">&amp;#xe6eb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6ec;</span>\n                <div class=\"name\">scanning</div>\n                <div class=\"code-name\">&amp;#xe6ec;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6ee;</span>\n                <div class=\"name\">compare</div>\n                <div class=\"code-name\">&amp;#xe6ee;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6f1;</span>\n                <div class=\"name\">filter</div>\n                <div class=\"code-name\">&amp;#xe6f1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6f2;</span>\n                <div class=\"name\">pin</div>\n                <div class=\"code-name\">&amp;#xe6f2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6f3;</span>\n                <div class=\"name\">history</div>\n                <div class=\"code-name\">&amp;#xe6f3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6f4;</span>\n                <div class=\"name\">product-features</div>\n                <div class=\"code-name\">&amp;#xe6f4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6f5;</span>\n                <div class=\"name\">supplier-features</div>\n                <div class=\"code-name\">&amp;#xe6f5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6f6;</span>\n                <div class=\"name\">similar-product</div>\n                <div class=\"code-name\">&amp;#xe6f6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6f7;</span>\n                <div class=\"name\">link</div>\n                <div class=\"code-name\">&amp;#xe6f7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6f8;</span>\n                <div class=\"name\">cut</div>\n                <div class=\"code-name\">&amp;#xe6f8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6fa;</span>\n                <div class=\"name\">nav-list</div>\n                <div class=\"code-name\">&amp;#xe6fa;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6fb;</span>\n                <div class=\"name\">image-text</div>\n                <div class=\"code-name\">&amp;#xe6fb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6fc;</span>\n                <div class=\"name\">text</div>\n                <div class=\"code-name\">&amp;#xe6fc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6fd;</span>\n                <div class=\"name\">move</div>\n                <div class=\"code-name\">&amp;#xe6fd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6fe;</span>\n                <div class=\"name\">subtract</div>\n                <div class=\"code-name\">&amp;#xe6fe;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe702;</span>\n                <div class=\"name\">dollar</div>\n                <div class=\"code-name\">&amp;#xe702;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe704;</span>\n                <div class=\"name\">raw</div>\n                <div class=\"code-name\">&amp;#xe704;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe705;</span>\n                <div class=\"name\">office</div>\n                <div class=\"code-name\">&amp;#xe705;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe707;</span>\n                <div class=\"name\">agriculture</div>\n                <div class=\"code-name\">&amp;#xe707;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe709;</span>\n                <div class=\"name\">machinery</div>\n                <div class=\"code-name\">&amp;#xe709;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe70a;</span>\n                <div class=\"name\">assessed-Badge</div>\n                <div class=\"code-name\">&amp;#xe70a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe70b;</span>\n                <div class=\"name\">personal-center</div>\n                <div class=\"code-name\">&amp;#xe70b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe70c;</span>\n                <div class=\"name\">integral</div>\n                <div class=\"code-name\">&amp;#xe70c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe70e;</span>\n                <div class=\"name\">operation</div>\n                <div class=\"code-name\">&amp;#xe70e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe713;</span>\n                <div class=\"name\">remind</div>\n                <div class=\"code-name\">&amp;#xe713;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe714;</span>\n                <div class=\"name\">download</div>\n                <div class=\"code-name\">&amp;#xe714;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe715;</span>\n                <div class=\"name\">map</div>\n                <div class=\"code-name\">&amp;#xe715;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe716;</span>\n                <div class=\"name\">bad</div>\n                <div class=\"code-name\">&amp;#xe716;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe717;</span>\n                <div class=\"name\">good</div>\n                <div class=\"code-name\">&amp;#xe717;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe718;</span>\n                <div class=\"name\">skip</div>\n                <div class=\"code-name\">&amp;#xe718;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe719;</span>\n                <div class=\"name\">play</div>\n                <div class=\"code-name\">&amp;#xe719;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe71a;</span>\n                <div class=\"name\">stop</div>\n                <div class=\"code-name\">&amp;#xe71a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe71b;</span>\n                <div class=\"name\">compass</div>\n                <div class=\"code-name\">&amp;#xe71b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe71c;</span>\n                <div class=\"name\">security</div>\n                <div class=\"code-name\">&amp;#xe71c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe71d;</span>\n                <div class=\"name\">share</div>\n                <div class=\"code-name\">&amp;#xe71d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe722;</span>\n                <div class=\"name\">store</div>\n                <div class=\"code-name\">&amp;#xe722;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe723;</span>\n                <div class=\"name\">manage-order</div>\n                <div class=\"code-name\">&amp;#xe723;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe724;</span>\n                <div class=\"name\">rejected-order</div>\n                <div class=\"code-name\">&amp;#xe724;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe725;</span>\n                <div class=\"name\">phone</div>\n                <div class=\"code-name\">&amp;#xe725;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe726;</span>\n                <div class=\"name\">bussiness-man</div>\n                <div class=\"code-name\">&amp;#xe726;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe728;</span>\n                <div class=\"name\">shoes</div>\n                <div class=\"code-name\">&amp;#xe728;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe72a;</span>\n                <div class=\"name\">Mobile-phone</div>\n                <div class=\"code-name\">&amp;#xe72a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe72d;</span>\n                <div class=\"name\">email-filling</div>\n                <div class=\"code-name\">&amp;#xe72d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe730;</span>\n                <div class=\"name\">favorites-filling</div>\n                <div class=\"code-name\">&amp;#xe730;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe732;</span>\n                <div class=\"name\">account-filling</div>\n                <div class=\"code-name\">&amp;#xe732;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe735;</span>\n                <div class=\"name\">credit-level</div>\n                <div class=\"code-name\">&amp;#xe735;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe736;</span>\n                <div class=\"name\">credit-level-filling</div>\n                <div class=\"code-name\">&amp;#xe736;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe73f;</span>\n                <div class=\"name\">exl</div>\n                <div class=\"code-name\">&amp;#xe73f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe740;</span>\n                <div class=\"name\">pdf</div>\n                <div class=\"code-name\">&amp;#xe740;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe741;</span>\n                <div class=\"name\">zip</div>\n                <div class=\"code-name\">&amp;#xe741;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe743;</span>\n                <div class=\"name\">sorting</div>\n                <div class=\"code-name\">&amp;#xe743;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe744;</span>\n                <div class=\"name\">copy</div>\n                <div class=\"code-name\">&amp;#xe744;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe747;</span>\n                <div class=\"name\">save</div>\n                <div class=\"code-name\">&amp;#xe747;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe749;</span>\n                <div class=\"name\"> inquiry-template</div>\n                <div class=\"code-name\">&amp;#xe749;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe74a;</span>\n                <div class=\"name\">template-default</div>\n                <div class=\"code-name\">&amp;#xe74a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe74c;</span>\n                <div class=\"name\">libra</div>\n                <div class=\"code-name\">&amp;#xe74c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe74e;</span>\n                <div class=\"name\">survey</div>\n                <div class=\"code-name\">&amp;#xe74e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe74f;</span>\n                <div class=\"name\">ship</div>\n                <div class=\"code-name\">&amp;#xe74f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe753;</span>\n                <div class=\"name\">bussiness-card</div>\n                <div class=\"code-name\">&amp;#xe753;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe756;</span>\n                <div class=\"name\">hot</div>\n                <div class=\"code-name\">&amp;#xe756;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe757;</span>\n                <div class=\"name\">data</div>\n                <div class=\"code-name\">&amp;#xe757;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe758;</span>\n                <div class=\"name\">trade</div>\n                <div class=\"code-name\">&amp;#xe758;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe75a;</span>\n                <div class=\"name\">onepage</div>\n                <div class=\"code-name\">&amp;#xe75a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe75c;</span>\n                <div class=\"name\">signboard</div>\n                <div class=\"code-name\">&amp;#xe75c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe75e;</span>\n                <div class=\"name\">shuffling-banner</div>\n                <div class=\"code-name\">&amp;#xe75e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe75f;</span>\n                <div class=\"name\">component</div>\n                <div class=\"code-name\">&amp;#xe75f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe760;</span>\n                <div class=\"name\">component-filling</div>\n                <div class=\"code-name\">&amp;#xe760;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe761;</span>\n                <div class=\"name\">color</div>\n                <div class=\"code-name\">&amp;#xe761;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe7cd;</span>\n                <div class=\"name\">color-filling</div>\n                <div class=\"code-name\">&amp;#xe7cd;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe7ce;</span>\n                <div class=\"name\">favorites</div>\n                <div class=\"code-name\">&amp;#xe7ce;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe802;</span>\n                <div class=\"name\">pic-filling</div>\n                <div class=\"code-name\">&amp;#xe802;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe803;</span>\n                <div class=\"name\">RFQ</div>\n                <div class=\"code-name\">&amp;#xe803;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe804;</span>\n                <div class=\"name\">RFQ-filling</div>\n                <div class=\"code-name\">&amp;#xe804;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe806;</span>\n                <div class=\"name\">original-image</div>\n                <div class=\"code-name\">&amp;#xe806;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe811;</span>\n                <div class=\"name\">logistic</div>\n                <div class=\"code-name\">&amp;#xe811;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe812;</span>\n                <div class=\"name\">Calculator</div>\n                <div class=\"code-name\">&amp;#xe812;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe820;</span>\n                <div class=\"name\">video</div>\n                <div class=\"code-name\">&amp;#xe820;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe828;</span>\n                <div class=\"name\">earth</div>\n                <div class=\"code-name\">&amp;#xe828;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe829;</span>\n                <div class=\"name\">task-management</div>\n                <div class=\"code-name\">&amp;#xe829;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe82a;</span>\n                <div class=\"name\">trust</div>\n                <div class=\"code-name\">&amp;#xe82a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe82b;</span>\n                <div class=\"name\">password</div>\n                <div class=\"code-name\">&amp;#xe82b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe839;</span>\n                <div class=\"name\">3column</div>\n                <div class=\"code-name\">&amp;#xe839;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe83a;</span>\n                <div class=\"name\">apparel</div>\n                <div class=\"code-name\">&amp;#xe83a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe83b;</span>\n                <div class=\"name\">bags</div>\n                <div class=\"code-name\">&amp;#xe83b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe83c;</span>\n                <div class=\"name\">folder</div>\n                <div class=\"code-name\">&amp;#xe83c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe83d;</span>\n                <div class=\"name\">4column</div>\n                <div class=\"code-name\">&amp;#xe83d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe842;</span>\n                <div class=\"name\">code</div>\n                <div class=\"code-name\">&amp;#xe842;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe843;</span>\n                <div class=\"name\">RFQ-filling</div>\n                <div class=\"code-name\">&amp;#xe843;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe863;</span>\n                <div class=\"name\">customs-clearance</div>\n                <div class=\"code-name\">&amp;#xe863;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe866;</span>\n                <div class=\"name\">good-filling</div>\n                <div class=\"code-name\">&amp;#xe866;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe86e;</span>\n                <div class=\"name\">camera</div>\n                <div class=\"code-name\">&amp;#xe86e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe87a;</span>\n                <div class=\"name\">pin-fill</div>\n                <div class=\"code-name\">&amp;#xe87a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe87b;</span>\n                <div class=\"name\">help-fill</div>\n                <div class=\"code-name\">&amp;#xe87b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe87c;</span>\n                <div class=\"name\">add-account</div>\n                <div class=\"code-name\">&amp;#xe87c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe87d;</span>\n                <div class=\"name\">listing-content</div>\n                <div class=\"code-name\">&amp;#xe87d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe87e;</span>\n                <div class=\"name\">warehouse-delivery </div>\n                <div class=\"code-name\">&amp;#xe87e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe87f;</span>\n                <div class=\"name\">customization</div>\n                <div class=\"code-name\">&amp;#xe87f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe880;</span>\n                <div class=\"name\">inspection</div>\n                <div class=\"code-name\">&amp;#xe880;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe881;</span>\n                <div class=\"name\">packing-labeling </div>\n                <div class=\"code-name\">&amp;#xe881;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe882;</span>\n                <div class=\"name\">online-tracking</div>\n                <div class=\"code-name\">&amp;#xe882;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe883;</span>\n                <div class=\"name\">play-filling</div>\n                <div class=\"code-name\">&amp;#xe883;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe884;</span>\n                <div class=\"name\">nosound-filling</div>\n                <div class=\"code-name\">&amp;#xe884;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe885;</span>\n                <div class=\"name\">sound-filling</div>\n                <div class=\"code-name\">&amp;#xe885;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe886;</span>\n                <div class=\"name\">electrical-equipment</div>\n                <div class=\"code-name\">&amp;#xe886;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe887;</span>\n                <div class=\"name\">home-appliances</div>\n                <div class=\"code-name\">&amp;#xe887;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe888;</span>\n                <div class=\"name\">furniture</div>\n                <div class=\"code-name\">&amp;#xe888;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe889;</span>\n                <div class=\"name\">fashion-accessories</div>\n                <div class=\"code-name\">&amp;#xe889;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe88a;</span>\n                <div class=\"name\">security-protection</div>\n                <div class=\"code-name\">&amp;#xe88a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe88b;</span>\n                <div class=\"name\">textile-products</div>\n                <div class=\"code-name\">&amp;#xe88b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe88c;</span>\n                <div class=\"name\">tools-hardware</div>\n                <div class=\"code-name\">&amp;#xe88c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe88d;</span>\n                <div class=\"name\">office-supplies</div>\n                <div class=\"code-name\">&amp;#xe88d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe88e;</span>\n                <div class=\"name\">vehicles</div>\n                <div class=\"code-name\">&amp;#xe88e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe696;</span>\n                <div class=\"name\">all</div>\n                <div class=\"code-name\">&amp;#xe696;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe697;</span>\n                <div class=\"name\">back</div>\n                <div class=\"code-name\">&amp;#xe697;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe698;</span>\n                <div class=\"name\">cart</div>\n                <div class=\"code-name\">&amp;#xe698;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe699;</span>\n                <div class=\"name\">Category</div>\n                <div class=\"code-name\">&amp;#xe699;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe69a;</span>\n                <div class=\"name\">close</div>\n                <div class=\"code-name\">&amp;#xe69a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe69b;</span>\n                <div class=\"name\">comments</div>\n                <div class=\"code-name\">&amp;#xe69b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe69c;</span>\n                <div class=\"name\">cry</div>\n                <div class=\"code-name\">&amp;#xe69c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe69d;</span>\n                <div class=\"name\">delete</div>\n                <div class=\"code-name\">&amp;#xe69d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe69e;</span>\n                <div class=\"name\">edit</div>\n                <div class=\"code-name\">&amp;#xe69e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe69f;</span>\n                <div class=\"name\">email</div>\n                <div class=\"code-name\">&amp;#xe69f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a0;</span>\n                <div class=\"name\">favorite</div>\n                <div class=\"code-name\">&amp;#xe6a0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a2;</span>\n                <div class=\"name\">form</div>\n                <div class=\"code-name\">&amp;#xe6a2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a3;</span>\n                <div class=\"name\">help</div>\n                <div class=\"code-name\">&amp;#xe6a3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a4;</span>\n                <div class=\"name\">information</div>\n                <div class=\"code-name\">&amp;#xe6a4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a5;</span>\n                <div class=\"name\">less</div>\n                <div class=\"code-name\">&amp;#xe6a5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a6;</span>\n                <div class=\"name\">more_unfold</div>\n                <div class=\"code-name\">&amp;#xe6a6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a7;</span>\n                <div class=\"name\">more</div>\n                <div class=\"code-name\">&amp;#xe6a7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a8;</span>\n                <div class=\"name\">pic</div>\n                <div class=\"code-name\">&amp;#xe6a8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6a9;</span>\n                <div class=\"name\">QRCode</div>\n                <div class=\"code-name\">&amp;#xe6a9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6aa;</span>\n                <div class=\"name\">refresh</div>\n                <div class=\"code-name\">&amp;#xe6aa;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6ab;</span>\n                <div class=\"name\">RFQ</div>\n                <div class=\"code-name\">&amp;#xe6ab;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6ac;</span>\n                <div class=\"name\">search</div>\n                <div class=\"code-name\">&amp;#xe6ac;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6ad;</span>\n                <div class=\"name\">selected</div>\n                <div class=\"code-name\">&amp;#xe6ad;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6ae;</span>\n                <div class=\"name\">set</div>\n                <div class=\"code-name\">&amp;#xe6ae;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6af;</span>\n                <div class=\"name\">Smile</div>\n                <div class=\"code-name\">&amp;#xe6af;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b1;</span>\n                <div class=\"name\">success</div>\n                <div class=\"code-name\">&amp;#xe6b1;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b2;</span>\n                <div class=\"name\">survey</div>\n                <div class=\"code-name\">&amp;#xe6b2;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b3;</span>\n                <div class=\"name\">training</div>\n                <div class=\"code-name\">&amp;#xe6b3;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b4;</span>\n                <div class=\"name\">ViewGallery</div>\n                <div class=\"code-name\">&amp;#xe6b4;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b5;</span>\n                <div class=\"name\">Viewlist</div>\n                <div class=\"code-name\">&amp;#xe6b5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b6;</span>\n                <div class=\"name\">warning</div>\n                <div class=\"code-name\">&amp;#xe6b6;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b7;</span>\n                <div class=\"name\">wrong</div>\n                <div class=\"code-name\">&amp;#xe6b7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b8;</span>\n                <div class=\"name\">account</div>\n                <div class=\"code-name\">&amp;#xe6b8;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6b9;</span>\n                <div class=\"name\">add</div>\n                <div class=\"code-name\">&amp;#xe6b9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6ba;</span>\n                <div class=\"name\">atm</div>\n                <div class=\"code-name\">&amp;#xe6ba;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6bb;</span>\n                <div class=\"name\">clock</div>\n                <div class=\"code-name\">&amp;#xe6bb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6bc;</span>\n                <div class=\"name\">remind</div>\n                <div class=\"code-name\">&amp;#xe6bc;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6bf;</span>\n                <div class=\"name\">calendar</div>\n                <div class=\"code-name\">&amp;#xe6bf;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6c0;</span>\n                <div class=\"name\">attachment</div>\n                <div class=\"code-name\">&amp;#xe6c0;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6c5;</span>\n                <div class=\"name\">discount</div>\n                <div class=\"code-name\">&amp;#xe6c5;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6c7;</span>\n                <div class=\"name\">service</div>\n                <div class=\"code-name\">&amp;#xe6c7;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6c9;</span>\n                <div class=\"name\">print</div>\n                <div class=\"code-name\">&amp;#xe6c9;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6cb;</span>\n                <div class=\"name\">box</div>\n                <div class=\"code-name\">&amp;#xe6cb;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6ce;</span>\n                <div class=\"name\">process</div>\n                <div class=\"code-name\">&amp;#xe6ce;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe6d2;</span>\n                <div class=\"name\">beauty</div>\n                <div class=\"code-name\">&amp;#xe6d2;</div>\n              </li>\n\t\t\t<li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe964;</span>\n                <div class=\"name\">311向上、收起</div>\n                <div class=\"code-name\">&amp;#xe964;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe965;</span>\n                <div class=\"name\">314指向下</div>\n                <div class=\"code-name\">&amp;#xe965;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe966;</span>\n                <div class=\"name\">316第一页</div>\n                <div class=\"code-name\">&amp;#xe966;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe967;</span>\n                <div class=\"name\">317最后页</div>\n                <div class=\"code-name\">&amp;#xe967;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe968;</span>\n                <div class=\"name\">319表头-正序</div>\n                <div class=\"code-name\">&amp;#xe968;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe969;</span>\n                <div class=\"name\">318表头-可排序</div>\n                <div class=\"code-name\">&amp;#xe969;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe96a;</span>\n                <div class=\"name\">320表头-倒序</div>\n                <div class=\"code-name\">&amp;#xe96a;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe96b;</span>\n                <div class=\"name\">321 回顶部</div>\n                <div class=\"code-name\">&amp;#xe96b;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe96c;</span>\n                <div class=\"name\">323向左交换</div>\n                <div class=\"code-name\">&amp;#xe96c;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe96d;</span>\n                <div class=\"name\">322相互交换</div>\n                <div class=\"code-name\">&amp;#xe96d;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe96e;</span>\n                <div class=\"name\">324向右交换</div>\n                <div class=\"code-name\">&amp;#xe96e;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe96f;</span>\n                <div class=\"name\">326数值下降</div>\n                <div class=\"code-name\">&amp;#xe96f;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe970;</span>\n                <div class=\"name\">327全屏</div>\n                <div class=\"code-name\">&amp;#xe970;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe971;</span>\n                <div class=\"name\">329横向展开</div>\n                <div class=\"code-name\">&amp;#xe971;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe972;</span>\n                <div class=\"name\">325数值上升</div>\n                <div class=\"code-name\">&amp;#xe972;</div>\n              </li>\n          \n            <li class=\"dib\">\n              <span class=\"icon iconfont\">&#xe973;</span>\n                <div class=\"name\">328退出全屏</div>\n                <div class=\"code-name\">&amp;#xe973;</div>\n              </li>\n          \n          \n          </ul>\n          \n      </div>\n      \n    </div>\n  </div>\n  <script>\n  $(document).ready(function () {\n      $('.tab-container .content:first').show()\n\n      $('#tabs li').click(function (e) {\n        var tabContent = $('.tab-container .content')\n        var index = $(this).index()\n\t\t\n        if ($(this).hasClass('active')) {\n          return\n        } else {\n          $('#tabs li').removeClass('active')\n          $(this).addClass('active')\n\n          tabContent.hide().eq(index).fadeIn()\n        }\n      })\n\t  \n\t\t\t\t\t \n\t  $(\".dib\").click(function(){\n\t\t  var font = $(this).find(\".code-name\").html();\n\t\t  //var font = $(this).find(\".name\").html();\n\t\t  font = font.replace('&amp;','&');\n\t\t  //font = font.replace('&#x',\"\\\\u\");\n\t\t  window.parent.getSelectIcon(font);\n\t\t  window.parent.closeiframe();\n\t  \n\t  })\n\t  \n    })\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "app/admin/t/tpl/wechat-caidan.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n\t<meta charset=\"UTF-8\">\r\n\t{include=\"style\"}\r\n</head>\r\n<body>\r\n<div class=\"x-nav\">\r\n            <span class=\"layui-breadcrumb\">\r\n              <a><cite>首页</cite></a>\r\n              <a><cite>微信栏目管理</cite></a>\r\n              \r\n            </span>\r\n\t<a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"刷新\">\r\n\t\t<i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\r\n</div>\r\n<div class=\"x-body\">\r\n\t<div class=\"layui-card\">\r\n\t\t<div class=\"layui-card-body\">\r\n\t\t\t<p class=\"layui-bg-red\" style=\"color:#FF5722\">非网站管理员不可随意更改菜单！</p>\r\n\t\t\t<span>TYPE<br/>1、click：点击推事件用户点击click类型按钮后，微信服务器会通过消息接口推送消息类型为event的结构给开发者（参考消息接口指南），并且带上按钮中开发者填写的key值，开发者可以通过自定义的key值与用户进行交互；<br/>\r\n2、view：跳转URL用户点击view类型按钮后，微信客户端将会打开开发者在按钮中填写的网页URL，可与网页授权获取用户基本信息接口结合，获得用户基本信息。<br/>\r\n3、media_id：下发消息（除文本消息）用户点击media_id类型按钮后，微信服务器会将开发者填写的永久素材id对应的素材下发给用户，永久素材类型可以是图片、音频、视频、图文消息。请注意：永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。<br/>\r\n排序： 按照正序，越小排在越前面，每个菜单都要给他设置一个排序值，否则会报错。\r\n</span>\r\n\t\t\t<form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\r\n\t\t\t\t<input name=\"go\" value=\"1\" type=\"hidden\" />\r\n\r\n\t\t\t\t<table class=\"layui-table\">\r\n\t\t\t\t\t<thead>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<th>\r\n\t\t\t\t\t\t\t排序\r\n\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t<th>\r\n\t\t\t\t\t\t\t菜单名称\r\n\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t<th>\r\n\t\t\t\t\t\t\ttype\r\n\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t<th>\r\n\t\t\t\t\t\t\tkey\r\n\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t<th>\r\n\t\t\t\t\t\t\turl\r\n\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t<th>\r\n\t\t\t\t\t\t\tmedia_id\r\n\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t<th>\r\n\t\t\t\t\t\t\t操作\r\n\t\t\t\t\t\t</th>\r\n\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t</thead>\r\n\r\n\t\t\t\t\t<tbody id=\"x-link\">\r\n\t\t\t\t\t{foreach $lists['menu']['button'] as $k=>$v}\r\n\r\n\r\n\t\t\t\t\t<tr data=\"{$k+1}\">\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_sort[]\" value=\"{$v['sort']}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_name[]\" value=\"{$v['name']}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_type[]\" value=\"{if(isset($v['type']))}{$v['type']}{/if}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t{php\r\n\t\t\t\t\t\tif($v['type']=='miniprogram'){\r\n\t\t\t\t\t\t$v['key'] = $v['appid'];\r\n\t\t\t\t\t\t$v['url'] = $v['pagepath'];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t/}\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_key[]\" value=\"{if(array_key_exists('key',$v))}{$v['key']}{/if}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_url[]\" value=\"{if(array_key_exists('url',$v))}{$v['url']}{/if}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_media_id[]\" value=\"{if(array_key_exists('media_id',$v))}{$v['media_id']}{/if}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<a title=\"新增同级\" href=\"javascript:;\" onclick=\"add_caidan(this)\"\r\n\t\t\t\t\t\t\t   class=\"ml-5\" style=\"text-decoration:none\">\r\n\t\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-sm\" type=\"button\">新增同级</button>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<a title=\"新增二级\" href=\"javascript:;\" onclick=\"add_caidan_2(this)\"\r\n\t\t\t\t\t\t\t   class=\"ml-5\" style=\"text-decoration:none\">\r\n\t\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-sm\" type=\"button\">新增二级</button>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<a title=\"删除\" href=\"javascript:;\" onclick=\"admin_del(this)\"\r\n\t\t\t\t\t\t\t   style=\"text-decoration:none\">\r\n\t\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-sm layui-btn-danger\" type=\"button\">删除</button>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t</td>\r\n\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t{if(count($v['sub_button'])>0)}\r\n\t\t\t\t\t{foreach $v['sub_button'] as $vv}\r\n\t\t\t\t\t<tr data=\"\">\r\n\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t|--<input type=\"text\" class=\"layui-input\" name=\"caidan_sort_{$k+1}[]\" value=\"{$vv['sort']}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_name_{$k+1}[]\" value=\"{$vv['name']}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_type_{$k+1}[]\" value=\"{$vv['type']}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t{php\r\n\t\t\t\t\t\tif($vv['type']=='miniprogram'){\r\n\t\t\t\t\t\t$vv['key'] = $vv['appid'];\r\n\t\t\t\t\t\t$vv['url'] = $vv['pagepath'];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t/}\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_key_{$k+1}[]\" value=\"{if(array_key_exists('key',$vv))}{$vv['key']}{/if}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_url_{$k+1}[]\" value=\"{if(array_key_exists('url',$vv))}{$vv['url']}{/if}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"layui-input\" name=\"caidan_media_id_{$k+1}[]\" value=\"{if(array_key_exists('media_id',$vv))}{$vv['media_id']}{/if}\" />\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<a title=\"新增同级\" href=\"javascript:;\" onclick=\"add_caidan(this)\"\r\n\t\t\t\t\t\t\t   class=\"ml-5\" style=\"text-decoration:none\">\r\n\t\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-sm\" type=\"button\">新增同级</button>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<a title=\"删除\" href=\"javascript:;\" onclick=\"admin_del(this)\"\r\n\t\t\t\t\t\t\t   style=\"text-decoration:none\">\r\n\t\t\t\t\t\t\t\t<button class=\"layui-btn layui-btn-sm layui-btn-danger\" type=\"button\">删除</button>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t</td>\r\n\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t<input id=\"menu_data\" type=\"hidden\" value=\"{$k+1}\" />\r\n\t\t\t\t\t<tr><td colspan=\"7\">\r\n\t\t\t\t\t\t<div class=\"layui-form-item\">\r\n\t\t\t\t\t\t\t<label for=\"L_repass\" class=\"layui-form-label\">\r\n\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t<button  class=\"layui-btn\" lay-filter=\"save\" lay-submit=\"\">\r\n\t\t\t\t\t\t\t\t保存\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</td></tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</form>\r\n\t\t\t<div class=\"page\">\r\n\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n<br/>\r\n<br/>\r\n<br/>\r\n<br/>\r\n<br/>\r\n<br/>\r\n\r\n<script>\r\n\tlayui.use(['laydate','element','form','laypage','layer'], function(){\r\n\t\t$ = layui.jquery;//jquery\r\n\t\tlaydate = layui.laydate;//日期插件\r\n\t\tlement = layui.element;//面包导航\r\n\t\t//  laypage = layui.laypage;//分页\r\n\t\tlayer = layui.layer;//弹出层\r\n\t\tform = layui.form;\r\n\r\n\t\t//以上模块根据需要引入\r\n\r\n\r\n\r\n\t});\r\n\tfunction admin_del(obj){\r\n\t\tlayer.confirm('确认要删除吗？',function(){\r\n\t\t\tif($(obj).parents(\"tr\").attr('data')!=''){\r\n\t\t\t\t$(\"#menu_data\").val(parseInt($('#menu_data').val())-1);\r\n\t\t\t}\r\n\t\t\t$(obj).parents(\"tr\").remove();\r\n\r\n\t\t\tlayer.closeAll();\r\n\r\n\r\n\r\n\t\t});\r\n\t}\r\n\tfunction add_caidan(obj){\r\n\t\tvar cids = $(obj).parents(\"tr\").attr(\"data\");\r\n\t\tif(cids!=''){\r\n\t\t\tvar cid = parseInt($('#menu_data').val())+1;\r\n\t\t\t$(\"#menu_data\").val(cid);\r\n\t\t\tvar html = '<tr data=\"'+cid+'\">'+$(obj).parents(\"tr\").html()+'</tr>';\r\n\r\n\t\t\t$(obj).parents(\"tr\").before(html);\r\n\t\t}else{\r\n\t\t\tvar cid = cids;\r\n\t\t\tvar html = '<tr data=\"'+cid+'\">'+$(obj).parents(\"tr\").html()+'</tr>';\r\n\r\n\t\t\t$(obj).parents(\"tr\").after(html);\r\n\t\t}\r\n\r\n\r\n\t}\r\n\tfunction add_caidan_2(obj){\r\n\t\t//var cid = $(obj).parents(\"tr\").attr(\"data\");\r\n\t\tvar cid = parseInt($('#menu_data').val());\r\n\t\tvar html='<tr data=\"\"><td> |--<input type=\"text\" class=\"layui-input\" name=\"caidan_sort_'+cid+'[]\" value=\"\" /></td><td> <input type=\"text\" class=\"layui-input\" name=\"caidan_name_'+cid+'[]\" value=\"\" /></td><td> <input type=\"text\" class=\"layui-input\" name=\"caidan_type_'+cid+'[]\" value=\"\" /></td><td><input class=\"layui-input\" type=\"text\" name=\"caidan_key_'+cid+'[]\" value=\"\" /></td><td>   <input class=\"layui-input\" type=\"text\" name=\"caidan_url_'+cid+'[]\" value=\"\" /> </td><td><input type=\"text\" class=\"layui-input\" name=\"caidan_media_id_'+cid+'[]\" value=\"\" /></td><td> <a title=\"新增同级\" href=\"javascript:;\" onclick=\"add_caidan(this)\"  class=\"ml-5\" style=\"text-decoration:none\">    <button class=\"layui-btn layui-btn-sm\" type=\"button\">新增同级</button>  </a><a title=\"删除\" href=\"javascript:;\" onclick=\"admin_del(this)\"       style=\"text-decoration:none\"> <button class=\"layui-btn layui-btn-sm layui-btn-danger\" type=\"button\">删除</button> </a>\t</td></tr>';\r\n\t\t$(obj).parents(\"tr\").after(html);\r\n\t}\r\n\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/wechat-sucai.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n    <head>\r\n\t\t<meta charset=\"UTF-8\">\r\n\t\t<meta name=\"referrer\" content=\"never\">\r\n   {include=\"style\"}\r\n    </head>\r\n    <body>\r\n        <div class=\"x-nav\">\r\n            <span class=\"layui-breadcrumb\">\r\n              <a><cite>首页</cite></a>\r\n              <a><cite>微信栏目管理</cite></a>\r\n              \r\n            </span>\r\n           <a class=\"layui-btn layui-btn-small\" style=\"line-height:1.6em;margin-top:3px;float:right\" href=\"javascript:location.replace(location.href);\" title=\"刷新\">\r\n        <i class=\"iconfont\" style=\"line-height:30px\">&#xe6aa;</i></a>\r\n        </div>\r\n        <div class=\"x-body\">\r\n\t\t<a title=\"图文素材\" href=\"{fun U('sucai',array('type'=>'news'))}\"  class=\"ml-5\" style=\"text-decoration:none\"><button class=\"layui-btn layui-btn-sm\" type=\"button\">图文素材</button></a>\r\n\t\t<a title=\"图片素材\" href=\"{fun U('sucai',array('type'=>'image'))}\"  class=\"ml-5\" style=\"text-decoration:none\"><button class=\"layui-btn layui-btn-sm\" type=\"button\">图片素材</button></a>\r\n\t\t<a title=\"视频素材\" href=\"{fun U('sucai',array('type'=>'video'))}\"  class=\"ml-5\" style=\"text-decoration:none\"><button class=\"layui-btn layui-btn-sm\" type=\"button\">视频素材</button></a>\r\n\t\t<a title=\"语音素材\" href=\"{fun U('sucai',array('type'=>'voice'))}\"  class=\"ml-5\" style=\"text-decoration:none\"><button class=\"layui-btn layui-btn-sm\" type=\"button\">语音素材</button></a>\r\n         <form class=\"layui-form layui-col-md12 x-so\" method=\"get\" id=\"myform\">\r\n\t\t\t<input name=\"go\" value=\"1\" type=\"hidden\" />\r\n          {if($data['type']=='news')}\r\n            <table class=\"layui-table\">\r\n                <thead>\r\n                    <tr>\r\n                        <th>media_id</th>\r\n                        <th>\r\n                            title\r\n                        </th>\r\n                        <th>\r\n                            thumb_media_id\r\n                        </th>\r\n                        <th>\r\n                            show_cover_pic\r\n                        </th>\r\n\t\t\t\t\t\t<th>\r\n                            author\r\n                        </th>\r\n\t\t\t\t\t\t<th>\r\n                            digest\r\n                        </th>\r\n\t\t\t\t\t\t<th>\r\n                            content\r\n                        </th>\r\n\t\t\t\t\t\t<th>\r\n                            url\r\n                        </th>\r\n\t\t\t\t\t\t<th>\r\n                            content_source_url\r\n                        </th>\r\n\t\t\t\t\t\t\r\n                        \r\n                    </tr>\r\n                </thead>\r\n\t\t\t\t\r\n                <tbody id=\"x-link\">\r\n\t\t\t\t  {foreach $lists as $k=>$v}\r\n\t\t\t\t\t\r\n\t\t\t\t  \r\n                    <tr data=\"{$k+1}\">\r\n                     \r\n                        <td \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\trowspan=\"{$v['count']}\"\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t{$v['media_id']}\r\n                        </td>\r\n\t\t\t\t\t\t<td>{$v['news_item'][0]['title']}</td>\r\n\t\t\t\t\t\t<td>{$v['news_item'][0]['thumb_media_id']}</td>\r\n\t\t\t\t\t\t<td>{$v['news_item'][0]['show_cover_pic']}</td>\r\n\t\t\t\t\t\t<td>{$v['news_item'][0]['author']}</td>\r\n\t\t\t\t\t\t<td>{$v['news_item'][0]['digest']}</td>\r\n\t\t\t\t\t\t<td>{fun newstr($v['news_item'][0]['content'],30)}</td>\r\n\t\t\t\t\t\t<td>{$v['news_item'][0]['url']}</td>\r\n\t\t\t\t\t\t<td>{$v['news_item'][0]['content_source_url']}</td>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n                    </tr>\r\n\t\t\t\t\t{foreach $v['news_item'] as $kk=>$vv}\r\n\t\t\t\t\t{if($kk>0)}\r\n\t\t\t\t\t<tr data=\"{$k+1}\">\r\n                     \r\n                        \r\n\t\t\t\t\t\t<td>{$vv['title']}</td>\r\n\t\t\t\t\t\t<td>{$vv['thumb_media_id']}</td>\r\n\t\t\t\t\t\t<td>{$vv['show_cover_pic']}</td>\r\n\t\t\t\t\t\t<td>{$vv['author']}</td>\r\n\t\t\t\t\t\t<td>{$vv['digest']}</td>\r\n\t\t\t\t\t\t<td>{fun newstr($vv['content'],30)}</td>\r\n\t\t\t\t\t\t<td>{$vv['url']}</td>\r\n\t\t\t\t\t\t<td>{$vv['content_source_url']}</td>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n                    </tr>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\r\n\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t<tr><td colspan=\"10\">\r\n\t\t\t\t\t总共{$total_count}条\r\n\t\t\t\t\t{if($data['offset']>0)}\r\n\t\t\t\t\t<a title=\"上一页\" href=\"{fun U('sucai',array('type'=>$data['type'],'offset'=>$data['count']-20))}\"  \r\n                            class=\"ml-5\" style=\"text-decoration:none\">\r\n                                <button class=\"layui-btn layui-btn-sm\" type=\"button\">上一页</button>\r\n                            </a>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{if($item_count<$total_count)}\r\n\t\t\t\t\t<a title=\"下一页\" href=\"{fun U('sucai',array('type'=>$data['type'],'offset'=>$data['count']+20))}\"  \r\n                            class=\"ml-5\" style=\"text-decoration:none\">\r\n                                <button class=\"layui-btn layui-btn-sm\" type=\"button\">下一页</button>\r\n                            </a>\r\n\t\t\t\t\t{/if}\t\t\r\n\t\t\t\t\t</td></tr>\r\n                </tbody>\r\n            </table>\r\n\t\t\t{else}\r\n\t\t\t <table class=\"layui-table\">\r\n                <thead>\r\n                    <tr>\r\n                        <th>media_id</th>\r\n                        <th>\r\n                            name\r\n                        </th>\r\n                        \r\n                        </th>\r\n\t\t\t\t\t\t<th>\r\n                            update_time\r\n                        </th>\r\n\t\t\t\t\t\t<th>\r\n                            url\r\n                        </th>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n                        \r\n                    </tr>\r\n                </thead>\r\n\t\t\t\t <tbody id=\"x-link\">\r\n\t\t\t\t \r\n\t\t\t\t {foreach $lists['item'] as $v}\r\n\t\t\t\t {if($v['media_id'])}\r\n\t\t\t\t <tr>\r\n\t\t\t\t\t<td rowspan=\"{$v['count']}\">\r\n\t\t\t\t\t{$v['media_id']}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td>{$v['name']}</td>\r\n\t\t\t\t\t<td>{fun date('Y-m-d H:i:s',$v['update_time'])}</td>\r\n\t\t\t\t\t<td>{if($data['type']=='image')}<img src=\"{$v['url']}\" width=\"200px\" />{else}{$v['url']}{/if}</td>\r\n\t\t\t\t </tr>\r\n\t\t\t\t {/if}\r\n\t\t\t\t {/foreach}\r\n\t\t\t\t <tr><td colspan=\"10\">\r\n\t\t\t\t\t总共{$total_count}条\r\n\t\t\t\t\t{if($data['offset']>0)}\r\n\t\t\t\t\t<a title=\"上一页\" href=\"{fun U('sucai',array('type'=>$data['type'],'offset'=>$data['count']-20))}\"  \r\n                            class=\"ml-5\" style=\"text-decoration:none\">\r\n                                <button class=\"layui-btn layui-btn-sm\" type=\"button\">上一页</button>\r\n                            </a>\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t\t{if($item_count<$total_count)}\r\n\t\t\t\t\t<a title=\"下一页\" href=\"{fun U('sucai',array('type'=>$data['type'],'offset'=>$data['count']+20))}\"  \r\n                            class=\"ml-5\" style=\"text-decoration:none\">\r\n                                <button class=\"layui-btn layui-btn-sm\" type=\"button\">下一页</button>\r\n                            </a>\r\n\t\t\t\t\t{/if}\t\t\r\n\t\t\t\t\t</td></tr>\r\n\t\t\t\t </tbody>\r\n\t\t\t</table>\r\n\t\t\t{/if}\r\n\t\t\t</form>\r\n            \r\n        </div>\r\n\t\t<br/>\r\n\t\t<br/>\r\n\t\t<br/>\r\n\t\t<br/>\r\n\t\t<br/>\r\n\t\t<br/>\r\n    \r\n       <script>\r\n\t    layui.use(['laydate','element','form','laypage','layer'], function(){\r\n                $ = layui.jquery;//jquery\r\n              laydate = layui.laydate;//日期插件\r\n              lement = layui.element();//面包导航\r\n            //  laypage = layui.laypage;//分页\r\n              layer = layui.layer;//弹出层\r\n\t\t\t  form = layui.form;\r\n\r\n              //以上模块根据需要引入\r\n             \r\n             \r\n              \r\n            });\r\n\t\t\r\n\t\t\r\n       </script>\r\n    </body>\r\n</html>"
  },
  {
    "path": "app/admin/t/tpl/welcome.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\">\n       {include=\"style\"}\n    </head>\n    <body>\n    <div class=\"x-body layui-anim layui-anim-up\" style=\"background-color: #f2f2f2\">\n        <div class=\"layui-fluid\">\n        <div class=\"layui-card\">\n          <div class=\"layui-card-header\">{fun JZLANG('欢迎管理员：')}\n            <span class=\"x-red\">{$admin['name']}</span>！{fun JZLANG('当前时间')}:<span id=\"time\">{fun date('Y-m-d H:i:s')}</span></div>\n          <div class=\"layui-card-body\">\n         <div class=\"layui-card\">\n                        <div class=\"layui-card-body\">\n                            <div class=\"layui-carousel x-admin-carousel x-admin-backlog\" lay-anim=\"\" lay-indicator=\"inside\" lay-arrow=\"none\" style=\"width: 100%; height: 90px;\">\n                                <div carousel-item=\"\">\n                                    <ul class=\"layui-row layui-col-space10 layui-this\">\n                                        <li class=\"layui-col-xs3\">\n                                            <a href=\"javascript:;\" class=\"x-admin-backlog-body\">\n                                                <h3>{fun JZLANG('站内用户')}</h3>\n                                                <p>\n                                                    <cite>{$member_count}</cite>{fun JZLANG('人')}</p>\n                                            </a>\n                                        </li>\n                                        <li class=\"layui-col-xs3\">\n                                            <a href=\"javascript:;\" class=\"x-admin-backlog-body\">\n                                                <h3>{fun JZLANG('站内文章')}</h3>\n                                                <p>\n                                                    <cite>{$article_num}</cite>{fun JZLANG('篇')}</p>\n                                            </a>\n                                        </li>\n                                        <li class=\"layui-col-xs3\">\n                                            <a href=\"javascript:;\" class=\"x-admin-backlog-body\">\n                                                <h3>{fun JZLANG('站内产品')}</h3>\n                                                <p>\n                                                    <cite>{$product_num}</cite>{fun JZLANG('件')}</p>\n                                            </a>\n                                        </li>\n                                      \n                                        <li class=\"layui-col-xs3\">\n                                            <a href=\"javascript:;\" class=\"x-admin-backlog-body\">\n                                                <h3>{fun JZLANG('站内留言')}</h3>\n                                                <p>\n                                                    <cite>{$message_num}</cite>{fun JZLANG('条')}</p>\n                                            </a>\n                                        </li>\n                                    \n                                    </ul>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n          </div>\n        </div>\n          <div class=\"layui-row layui-col-space15\">\n            <div class=\"layui-col-md8\">    \n              <div class=\"layui-card\">\n                <div class=\"layui-card-header\">\n                  {fun JZLANG('最近更新')}\n                  <a href=\"{fun U('Article/articlelist')}\" class=\"layui-a-tips\">{fun JZLANG('全部文章')}</a>\n                </div>\n                <div class=\"layui-card-body\">\n                  <div class=\"layui-row layui-col-space10\">\n\t\t\t\t\t<table class=\"layui-table\">\n\t\t\t\t\t  <colgroup>\n\t\t\t\t\t\t<col >\n\t\t\t\t\t\t<col width=\"150\">\n\t\t\t\t\t\t<col width=\"200\">\n\t\t\t\t\t\t<col width=\"100\">\n\t\t\t\t\t  </colgroup>\n\t\t\t\t\t  <thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t  <th>{fun JZLANG('标题')}</th>\n\t\t\t\t\t\t  <th>{fun JZLANG('缩略图')}</th>\n\t\t\t\t\t\t  <th>{fun JZLANG('更新时间')}</th>\n\t\t\t\t\t\t  <th>{fun JZLANG('阅读量')}</th>\n\t\t\t\t\t\t</tr> \n\t\t\t\t\t  </thead>\n\t\t\t\t\t  <tbody>\n\t\t\t\t\t    {loop table=\"article\" orderby=\"addtime desc\" limit=\"10\" as=\"v\"}\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t  <td><a href=\"{$v['url']}\" target=\"_blank\">{fun newstr($v['title'],30)}</a></td>\n\t\t\t\t\t\t  <td>{if($v['litpic'])}<a href=\"{$v['url']}\" target=\"_blank\"><img src=\"{$v['litpic']}\" width=\"150px\" height=\"50px\"></a>{else}无{/if}</td>\n\t\t\t\t\t\t  <td>{fun formatTime($v['addtime'],'Y-m-d')}</td>\n\t\t\t\t\t\t  <td>{$v['hits']}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t    {/loop}\n\t\t\t\t\t\t\n\t\t\t\t\t  </tbody>\n\t\t\t\t\t</table>\n\t\t\t\t  \n                  </div>\n                </div>\n              </div>\n              {php $comment = M('molds')->find(array('biaoshi'=>'comment'));/}\n              {if($comment['isopen'])}\n              <div class=\"layui-card\">\n                <div class=\"layui-card-header\">{fun JZLANG('最新评论')}</div>\n                <div class=\"layui-card-body\">\n                  <dl class=\"layuiadmin-card-status\">\n                  {loop table=\"comment\" limit=\"10\" as=\"v\"}\n                    <dd>\n                    {php  $user = memberInfo($v['userid']);/}\n                      <div class=\"layui-status-img\"><a href=\"javascript:;\">{if($user['litpic']!='')}<img src=\"{$user['litpic']}\">{/if}</a></div>\n                      <div>\n                        <p>{$user['username']} {fun JZLANG('在')} <a href=\"{$classtypedata[$v['tid']]['url']}\">{$classtypedata[$v['tid']]['classname']}</a> {fun JZLANG('发布了评论')}</p>\n                        <span>{fun formatTime($v['addtime'],'Y-m-d H:i:s')}</span>\n                      </div>\n                    </dd>\n                  {/loop}\n                   \n                  </dl>  \n                </div>\n              </div>  \n              {/if}   \n            </div>\n            <div class=\"layui-col-md4\">\n              <div class=\"layui-card\">\n                <div class=\"layui-card-header\">{fun JZLANG('版本信息')}</div>\n                <div class=\"layui-card-body layui-text\">\n                  <table class=\"layui-table\">\n                    <colgroup>\n                      <col width=\"100\">\n                      <col>\n                    </colgroup>\n                    <tbody>\n                      <tr>\n                        <td>{fun JZLANG('当前版本')}</td>\n                        <td>\n                           v{$webconf['web_version']} <a href=\"https://github.com/Cherry-toto/jizhicms\" target=\"_blank\" style=\"padding-left: 15px;\">{fun JZLANG('项目地址')}</a>\n                        </td>\n                      </tr>\n                      <tr>\n                        <td>{fun JZLANG('服务器')}</td>\n                        <td>\n                          {$_SERVER['SERVER_NAME']}\n                       </td>\n                      </tr>\n                      <tr>\n                        <td>{fun JZLANG('操作系统')}</td>\n                        <td>\n                          {fun php_uname('s')}\n                       </td>\n                      </tr>\n                      <tr>\n                        <td>{fun JZLANG('运行环境')}</td>\n                        <td>\n                          {fun php_uname()}\n                       </td>\n                      </tr>\n                      <tr>\n                        <td>{fun JZLANG('PHP版本')}</td>\n                        <td>\n                          {__PHP_VERSION__}\n                       </td>\n                      </tr>\n                      <tr>\n                        <td>{fun JZLANG('运行方式')}</td>\n                        <td>\n                          {fun php_sapi_name()}\n                       </td>\n                      </tr>\n                      <tr>\n                        <td>{fun JZLANG('上传限制')}</td>\n                        <td>\n                          {fun get_cfg_var (\"upload_max_filesize\")}\n                       </td>\n                      </tr>\n\n\n                    </tbody>\n                  </table>\n                </div>\n              </div>\n             \n            <div class=\"layui-card\">\n                <div class=\"layui-card-header\">{fun JZLANG('用户留言')}</div>\n                <div class=\"layui-card-body\">\n                  <ul class=\"layuiadmin-card-status layuiadmin-home2-usernote\">\n                  {loop table=\"message\"  limit=\"10\" orderby=\"addtime desc\" as=\"v\"}\n                    <li>\n                      <h3>{$v['user']}</h3>\n                      <p>{$v['body']}</p>\n                      <span>{fun formatTime($v['addtime'],'Y-m-d H:i:s')}</span>\n                      <a href=\"{fun U('Message/editmessage',['id'=>$v['id']])}\"  class=\"layui-btn layui-btn-xs layuiadmin-reply\">{fun JZLANG('回复')}</a>\n                    </li>\n                  {/loop}\n                   \n                  </ul>\n                </div>\n              </div>\n\n              \n            </div>\n          </div>\n        </div>\n\n    </div>\n        <script>\n\t\tfunction time(){\n\t\t\tvar vWeek,vWeek_s,vDay;\n\t\t\tvWeek = [\"{fun JZLANG('星期天')}\",\"{fun JZLANG('星期一')}\",\"{fun JZLANG('星期二')}\",\"{fun JZLANG('星期三')}\",\"{fun JZLANG('星期四')}\",\"{fun JZLANG('星期五')}\",\"{fun JZLANG('星期六')}\"];\n\t\t\tvar date =  new Date();\n\t\t\tyear = date.getFullYear();\n\t\t\tmonth = ((date.getMonth() + 1)>=10)?(date.getMonth() + 1):'0'+(date.getMonth() + 1);\n\t\t\t//day = date.getDate();\n\t\t\tday = (date.getDate()>=10)?date.getDate():'0'+date.getDate();\n\t\t\thours = (date.getHours()>=10)?date.getHours():'0'+date.getHours();\n\t\t\tminutes = (date.getMinutes()>=10)?date.getMinutes():'0'+date.getMinutes();\n\t\t\tseconds = (date.getSeconds()>=10)?date.getSeconds():'0'+date.getSeconds();\n\t\t\tvWeek_s = date.getDay();\n\t\t\tdocument.getElementById(\"time\").innerHTML = year + \"-\" + month + \"-\" + day + \" \" + \"\\t\" + hours + \":\" + minutes +\":\" + seconds + \"\\t\" + vWeek[vWeek_s] ;\n\n\t\t};\n\t\tsetInterval(\"time()\",1000);\n\n        </script>\n    </body>\n</html>"
  },
  {
    "path": "app/home/c/CommentController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/08\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass CommentController extends CommonController\n{\n\n\tfunction index(){\n\t\t\n\t\t//检查模块是否开启\n\t\tif(!M('molds')->find(['isopen'=>1,'biaoshi'=>'comment'])){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('评论模块未开启！')));\n\t\t\t}\n\t\t\tError(JZLANG('评论模块未开启！'));\n\t\t}\n\t\t\n\t\tif($this->frparam('go',0,false,\"POST\")){\n\t\t\tif($this->islogin){\n                if(isset($GLOBALS['Redis'])){\n                    $message_time = $GLOBALS['Redis']->get('message_time');\n                    $message_num = $GLOBALS['Redis']->get('message_num');\n                    if(!$message_time){\n                        $message_time = time();\n                        $message_num = 0;\n                    }\n                    if(($message_time+10*60)<time()){\n\n                        $GLOBALS['Redis']->setex('message_time', 10 * 60, time());\n                    }\n                    $message_num += 1;\n                    $GLOBALS['Redis']->setex('message_num', 10 * 60, $message_num);\n                    if($message_num>5 && ($message_time+10*60)>=time()){\n                        if($this->frparam('ajax')){\n                            JsonReturn(array('code'=>1,'msg'=>JZLANG('您的操作过于频繁，请十分钟后再试~')));\n                        }\n                        Error(JZLANG('您的操作过于频繁，请十分钟后再试~'));\n                    }\n                }else{\n                    if(!isset($_SESSION['message_time'])){\n                        $_SESSION['message_time'] = time();\n                        $_SESSION['message_num'] = 0;\n                    }\n\n                    if(($_SESSION['message_time']+10*60)<time()){\n                        $_SESSION['message_num'] = 0;\n                        $_SESSION['message_time'] = time();\n                    }\n                    $_SESSION['message_num']++;\n                    if($_SESSION['message_num']>10 && ($_SESSION['message_time']+10*60)>time()){\n                        if($this->frparam('ajax')){\n                            JsonReturn(array('code'=>1,'msg'=>JZLANG('您的操作过于频繁，请十分钟后再试~')));\n                        }\n                        Error(JZLANG('您的操作过于频繁，请十分钟后再试~'));\n                    }\n                }\n\n\t\t\t\t//$w = $this->frparam();\n\t\t\t\t//$w = get_fields_data($w,'comment',0);\n\t\t\t\t$w['tid'] = $this->frparam('tid',0,0);\n\t\t\t\t$w['aid'] = $this->frparam('aid',0,0);\n\t\t\t\t$w['zid'] = $this->frparam('zid',0,0);\n\t\t\t\t$w['pid'] = $this->frparam('pid',0,0);\n\t\t\t\t$w['body'] = $this->frparam('body',1,null);\n\t\t\t\t$w['reply'] = null;\n\t\t\t\tif(!$w['body']){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('评论内容不能为空！')));\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('评论内容不能为空！'));\n\t\t\t\t}\n\t\t\t\tif(!$w['tid']){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('请提交栏目ID')));\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('栏目ID不能为空！'));\n\t\t\t\t}\n\t\t\t\t//是否主帖子\n\t\t\t\tif($w['zid']){\n\t\t\t\t\t$z_userid = M('comment')->getField(['id'=>$w['zid']],'userid');\n\t\t\t\t}else{\n\t\t\t\t\t$z_userid = 0;\n\t\t\t\t}\n\t\t\t\t//是否贴中贴\n\t\t\t\tif($w['pid']){\n\t\t\t\t\t$p_userid = M('comment')->getField(['id'=>$w['pid']],'userid');\n\t\t\t\t}else{\n\t\t\t\t\t$p_userid = 0;\n\t\t\t\t}\n\t\t\t\t$about = [];\n\t\t\t\tif(strpos($w['body'],'[@')!==false){\n\t\t\t\t\t$pars = '/\\[@([^]]+)]/';\n\t\t\t\t\t$res = preg_match_all($pars,$w['body'],$match);\n\t\t\t\t\tif($res){\n\t\t\t\t\t\tforeach($match[0] as $k=>$v){\n\t\t\t\t\t\t\t$w['body'] = str_replace($v,' @'.$match[1][$k].' ',$w['body']);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tforeach($match[1] as $v){\n\t\t\t\t\t    $v = format_param($v,1);\n\t\t\t\t\t\t$r = M('member')->getField(['username'=>$v],'id');\n\t\t\t\t\t\tif($r && $r!=$z_userid && $r!=$p_userid){\n\t\t\t\t\t\t\t$about[] = $r;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tif($this->webconf['autocheckcomment']==1){\n\t\t\t\t\t$w['isshow'] = 1;\n\t\t\t\t}else{\n\t\t\t\t\t$w['isshow'] = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$w['userid'] = $_SESSION['member']['id'];\n\t\t\t\t$w['likes'] = $this->frparam('star',1,0);\n\t\t\t\t$w['isread'] = 0;\n\t\t\t\t$w['zan'] = 0;\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\t$n = M('comment')->add($w);\n\t\t\t\tif($n){\n\t\t\t\t\t//内容URL\n\t\t\t\t\t$molds = $this->classtypedata[$w['tid']]['molds'];\n\t\t\t\t\tif(!$w['aid']){\n\t\t\t\t\t\t//栏目评论\n\t\t\t\t\t\t$url = $this->classtypedata[$w['tid']]['url'];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//非栏目评论\n\t\t\t\t\t\t$htmlurl=M($molds)->getField(['id'=>$w['aid']],'htmlurl');\n\t\t\t\t\t\t$url = get_domain().'/'.$htmlurl.'/'.$w['aid'];\n\t\t\t\t\t}\n\t\t\t\t\t//检查是否用户发布的内容，提示被评论\n\t\t\t\t\tif($w['aid']){\n\t\t\t\t\t\t$member_id=M($molds)->getField(['id'=>$w['aid']],'member_id');\n\t\t\t\t\t\tif($member_id){\n\t\t\t\t\t\t\t$task['aid'] = $n;\n\t\t\t\t\t\t\t$task['tid'] = $w['tid'];\n\t\t\t\t\t\t\t$task['userid'] = $member_id;\n\t\t\t\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t\t\t\t$task['molds'] = $molds;\n\t\t\t\t\t\t\t$task['type'] = 'comment';\n\t\t\t\t\t\t\t$task['addtime'] = time();\n\t\t\t\t\t\t\t$task['body'] = $w['body'];\n\t\t\t\t\t\t\t$task['url'] = $url;\n\t\t\t\t\t\t\tM('task')->add($task);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//检查是否回复帖子\n\t\t\t\t\tif($w['zid']){\n\t\t\t\t\t\tif($z_userid){\n\t\t\t\t\t\t\t$task['aid'] = $n;\n\t\t\t\t\t\t\t$task['tid'] = $w['tid'];\n\t\t\t\t\t\t\t$task['userid'] = $z_userid;\n\t\t\t\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t\t\t\t$task['molds'] = $molds;\n\t\t\t\t\t\t\t$task['type'] = 'comment';\n\t\t\t\t\t\t\t$task['addtime'] = time();\n\t\t\t\t\t\t\t$task['body'] = $w['body'];\n\t\t\t\t\t\t\t$task['url'] = $url;\n\t\t\t\t\t\t\tM('task')->add($task);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//检查是否回复帖子\n\t\t\t\t\tif($w['pid']){\n\t\t\t\t\t\tif($p_userid && $z_userid!=$p_userid){\n\t\t\t\t\t\t\t$task['aid'] = $n;\n\t\t\t\t\t\t\t$task['tid'] = $w['tid'];\n\t\t\t\t\t\t\t$task['userid'] = $p_userid;\n\t\t\t\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t\t\t\t$task['molds'] = $molds;\n\t\t\t\t\t\t\t$task['type'] = 'reply';\n\t\t\t\t\t\t\t$task['addtime'] = time();\n\t\t\t\t\t\t\t$task['body'] = $w['body'];\n\t\t\t\t\t\t\t$task['url'] = $url;\n\t\t\t\t\t\t\tM('task')->add($task);\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//检查是否@用户\n\t\t\t\t\tif(count($about)>0){\n\n\t\t\t\t\t\t$task = [];\n\t\t\t\t\t\t$task['aid'] = $n;\n\t\t\t\t\t\t$task['tid'] = $w['tid'];\n\t\t\t\t\t\t$task['molds'] = $molds;\n\t\t\t\t\t\t$task['type'] = 'at';\n\t\t\t\t\t\t$task['addtime'] = time();\n\t\t\t\t\t\t$task['body'] = $w['body'];\n\t\t\t\t\t\t$task['url'] = $url;\n\t\t\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t\t\tforeach ($about as $value) {\n\t\t\t\t\t\t\t$task['userid'] = $value;\n\t\t\t\t\t\t\tM('task')->add($task);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//更改评分-将以前的评分清空\n\t\t\t\t\tif($w['likes']!=0){\n\t\t\t\t\t    M('comment')->update('id!='.$n.' and userid='.$w['userid'],['likes'=>0]);\n\t\t\t\t\t}\n\t\t\t\t\t//评论奖励\n\t\t\t\t\tif($this->webconf['comment_award_open']==1 && $w['tid']!=0 && $w['aid']!=0){\n\t\t\t\t\t\t$award = round($this->webconf['comment_award'],2);\n\t\t\t\t\t\t$id = $w['aid'];\n\t\t\t\t\t\t$max_award = round($this->webconf['comment_max_award'],2);\n\t\t\t\t\t\t$member_id = M($molds)->getField(['id'=>$id],'member_id');\n\t\t\t\t\t\t$molds = $this->classtypedata[$w['tid']]['molds'];\n\t\t\t\t\t\t//去除自己写的评论\n\t\t\t\t\t\tif($member_id!=0 && $award>0 && $member_id!=$this->member['id']){\n\t\t\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$id,'msg'=>JZLANG('评论奖励')]);\n\t\t\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG(\"评论奖励\").\"' \";\n\t\t\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\t\t\tforeach($all as $v){\n\t\t\t\t\t\t\t\t\t\t$all_jifen+=$v['amount'];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t\t\t        \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t\t\t   \t  \t\t$w['molds'] = $molds;\n\t\t\t\t\t\t   \t  \t\t$w['aid'] = $id;\n\t\t\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('评论奖励');\n\t\t\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t\tM($molds)->goInc(['id'=>$this->frparam('aid')],'comment_num',1);\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(array('code'=>0,'msg'=>JZLANG('评价成功！'),'url'=>$url));\n\t\t\t\t\t}\n\t\t\t\t\tSuccess(JZLANG('评价成功！'),$url);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$referer = (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER']=='') ? U('user/index') : $_SERVER['HTTP_REFERER'];\n\t\t\t\t$_SESSION['return_url'] = $referer;\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('您未登录，请重新登录~'),'url'=>U('login/index')));\n\t\t\t\t}\n\t\t\t\tRedirect(U('login/index'));\n\t\t\t}\n\t\t}\n\t\t\n\n\t\t\n\t}\n\n\t//获取评论列表\n\tfunction getlist(){\n\t\t//检查模块是否开启\n\t\tif(!M('molds')->find(['isopen'=>1,'biaoshi'=>'comment'])){\n\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('评论模块未开启！')));\n\t\t}\n\t\t$aid = $this->frparam('aid',0,0);\n\t\t$tid = $this->frparam('tid',0,0);\n\t\t$limit = $this->frparam('limit',0,10);\n\t\t$page = $this->frparam('page',0,1);\n\t\t$comment = new Page('Comment');\n\t\t$sql = \"isshow=1 and pid=0 and aid=\".$aid.\" and tid=\".$tid;\n\t\t$data = $comment->where($sql)->orderby('likes desc,id desc')->limit($limit)->page($page)->go();\n\t\tforeach($data as $k=>$v){\n\t\t\t$data[$k]['classname'] = $v['tid'] ? $v['tid'] : $this->classtypedata[$v['tid']];\n\t\t\t$data[$k]['article'] = !$v['aid'] ? [] : M($this->classtypedata[$v['tid']]['molds'])->find(['id'=>$v['aid'],'isshow'=>1]);\n\t\t\t$data[$k]['user'] = !$v['userid'] ? [] : M('member')->find(['id'=>$v['userid']],null,'id,username,litpic');\n\t\t\t$data[$k]['addtime'] = formatTime($v['addtime']);\n\t\t\t$children = M('comment')->findAll(['zid'=>$v['id'],'isshow'=>1]);\n\t\t\tif($children){\n\t\t\t\tforeach($children as $kk=>$vv){\n\t\t\t\t\t$children[$kk]['classname'] = $vv['tid'] ? $vv['tid'] : $this->classtypedata[$vv['tid']];\n\t\t\t\t\t$children[$kk]['article'] = !$vv['aid'] ? [] : M($this->classtypedata[$vv['tid']]['molds'])->find(['id'=>$vv['aid'],'isshow'=>1]);\n\t\t\t\t\t$children[$kk]['user'] = !$vv['userid'] ? [] : M('member')->find(['id'=>$vv['userid']],null,'id,username,litpic');\n\t\t\t\t\t$children[$kk]['addtime'] = formatTime($vv['addtime']);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$data[$k]['children'] = $children;\n\t\t}\n\t\t$count = M('comment')->getCount(['isshow'=>1,'aid'=>$aid,'tid'=>$tid]);\n\t\tJsonReturn(['code'=>0,'data'=>[\n\t\t\t'list'=>$data,\n\t\t\t'count'=>$count,\n\t\t\t'allpage'=>$comment->allpage,\n\t\t],'msg'=>'success']);\n\t\t\n\t}\n\n}"
  },
  {
    "path": "app/home/c/CommonController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\nuse frphp\\lib\\Controller;\nclass CommonController extends Controller\n{\n\tfunction _init(){\n        if(class_exists('app\\home\\plugins\\CommonController')){\n            $extCommonModel = new \\app\\home\\plugins\\CommonController($this->frparam());\n            if(method_exists($extCommonModel,APP_ACTION)){\n                $action = APP_ACTION;\n                $extCommonModel->$action();\n                exit;\n            }\n            \n        }\n\t\t//判断当前模板并引入扩展函数\n\t\t$hometpl = get_template();\n\t\tif(defined('TPL_PATH')){\n\t\t\t$path = TPL_PATH;\n\t\t}else{\n\t\t\t$path = APP_HOME;\n\t\t}\n\t\t$func = HOME_VIEW ? $path.HOME_VIEW.'/'.$hometpl.'/func/functions.php' : $path.'/'.$hometpl.'/func/functions.php';\n\t\tif(file_exists($func)){\n\t\t\tinclude_once($func);\n\t\t}\n\t\t$webconf = webConf();\n\t\t$template = TEMPLATE;\n\t\t$this->webconf = $webconf;\n\t\t$this->template = $template;\n\t\t\n\t\tif($this->webconf['closeweb']){\n\t\t\t$this->close();\n\t\t}\n\t\t$m = 1;\n\t\tif(isMobile() && $webconf['iswap']==1){\n\t\t\t$classtypedata = classTypeDataMobile();\n\t\t\t$m = 1;\n\t\t}else{\n\t\t\t$classtypedata = classTypeData();\n\t\t\t$m = 0;\n\t\t}\n\t\t$this->classtypetree = $classtypedata;\n\t\t$this->classtypedata = getclasstypedata($classtypedata,$m);\n\t\t$this->common = Tpl_style.'common/';\n\t\t$this->tpl = Tpl_style.$template.'/';\n\t\t$this->frpage = $this->frparam('page',0,1);\n\t\t$customconf = get_custom();\n\t\t$this->customconf = $customconf;\n        if(isset($GLOBALS['Redis']) && $this->frparam('token',1)){\n            $member = $GLOBALS['Redis']->get($this->frparam('token',1));\n            if($member){\n                $_SESSION['member'] = json_decode($member,true);\n            }\n        }\n\t\tif(isset($_SESSION['member']) && $_SESSION['member']['id']){\n\t\t\t$this->islogin = true;\n\t\t\t$this->member = $_SESSION['member'];\n\t\t\tif($this->webconf['isopenhomepower']==1){\n\t\t\t\tif(strpos($_SESSION['member']['paction'],','.APP_CONTROLLER.',')!==false){\n\t\t\t\t   \n\t\t\t\t}else{\n\t\t\t\t\t$action = APP_CONTROLLER.'/'.APP_ACTION;\n\t\t\t\t\tif(strpos($_SESSION['member']['paction'],','.$action.',')==false){\n\t\t\t\t\t\t$ac = M('Power')->find(array('action'=>$action));\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('您没有').'【'.$ac['name'].'】'.JZLANG('的权限！'),'url'=>U('Home/index')]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tError(JZLANG('您没有').'【'.$ac['name'].'】'.JZLANG('的权限！'),U('Home/index'));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t   \n\t\t\t  \n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}else{\n\t\t\t$this->islogin = false;\n\t\t}\n\t\t\n\t\t$jznav = getCache('jznav');\n\t\tif(!$jznav){\n\t\t\t$nav = M('menu')->findAll(['isshow'=>1]);\n\t\t\t$jznav = [];\n\t\t\tif($nav){\n\t\t\t\tforeach($nav as $v){\n\t\t\t\t\t$menulist = unserialize($v['nav']);\n\t\t\t\t\tforeach($menulist as $vv){\n\t\t\t\t\t\tif($vv['status']==1){\n\t\t\t\t\t\t\t$vv['url'] = $vv['tid'] ? $this->classtypedata[$vv['tid']]['url'] : $vv['gourl'];\n\t\t\t\t\t\t\t$vv['title'] = $vv['title'] ? $vv['title'] : ($vv['tid'] ? $this->classtypedata[$vv['tid']]['classname'] : '');\n\t\t\t\t\t\t\t$jznav[$v['id']][]=$vv;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetCache('jznav',$jznav);\n\t\t}\n\t\t$this->jznav = $jznav;\n    \n    }\n\t\n\tfunction close(){\n\t\tif(file_exists(APP_PATH.'static/common/close.html')){\n\t\t\t$this->display('@'.APP_PATH.'static/common/close.html');\n\t\t\texit;\n\t\t}else{\n\t\t\techo $this->webconf['closetip'];exit;\n\t\t}\n\t}\n\t\n\t\n\tfunction vercode(){\n\t\t$w = $this->frparam('w',0,160);\n\t\t$h = $this->frparam('h',0,50);\n\t\t$n = $this->frparam('n',0,4);\n\t\t//frcode\n\t\t$name = $this->frparam('name',1,$this->frparam('code_name',1,'frcode'));\n\t\t\n\t\t$imagecode=new \\Imagecode($w,$h,$n,$name,APP_PATH.\"frphp/extend/AdobeGothicStd-Bold.ttf\");\n\t\t$imagecode->imageout();\n\t\t \n\t}\n\tfunction checklogin(){\n\t\tif(!$this->islogin){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('您还未登录，请重新登录！')]);\n\t\t\t}\n\t\t\tRedirect(U('login/index'));\n\t\t}\n\t\t\n\t}\n    \n    function multiuploads(){\n        $file = $this->frparam('filename',1);\n        if(!$file){\n            $file = 'file';\n        }\n        //检测是否允许前台上传文件\n        if(!$this->webconf['isopenhomeupload']){\n            $data['error'] =  \"Error: \".JZLANG(\"已关闭前台上传文件功能\");\n            $data['code'] = 1004;\n            JsonReturn($data);\n        }\n        if($this->webconf['onlyuserupload'] && !$this->islogin){\n            $data['error'] =  \"Error: 仅会员才可以上传！\";\n            $data['code'] = 1005;\n            JsonReturn($data);\n        }\n        \n        if($this->webconf['onlyuserupload'] && $this->islogin){\n            \n            $all = M('pictures')->findAll(['userid'=>$this->member['id']],null,'size');\n            $allsize = 0;\n            foreach ($all as $v){\n                $allsize+=$v['size'];\n            }\n            $limisize = $this->member['uploadsize'] * 1024;\n            if($limisize<=$allsize){\n                $data['error'] =  \"Error: \".JZLANG('超出会员上传文件大小！');\n                $data['code'] = 1006;\n                JsonReturn($data);\n                \n            }\n            \n            \n        }\n        foreach($_FILES[$file]['name'] as $k=>$v){\n            $pix = explode('.',$v);\n            $pix = end($pix);\n            $fileType = webConf('fileType');\n            if(strpos($fileType,strtolower($pix))===false || stripos($pix,'php')!==false || stripos($pix,'phtml')!==false || stripos($pix,'phar')!==false){\n                $data['error'] =  \"Error: \".JZLANG(\"文件类型不允许上传！\");\n                $data['code'] = 1002;\n                JsonReturn($data);\n            }\n            $fileSize = (int)webConf('fileSize');\n            if($fileSize!=0 && ($_FILES[$file][\"size\"][$k]/1024)>$fileSize){\n                $data['error'] =  \"Error: \".JZLANG(\"文件大小超过网站内部限制！\");\n                $data['code'] = 1003;\n                JsonReturn($data);\n            }\n            \n            if(isset($this->webconf['home_save_path'])){\n                //替换日期事件\n                $t = time();\n                $d = explode('-', date(\"Y-y-m-d-H-i-s\"));\n                $format = $this->webconf['home_save_path'];\n                $format = str_replace(\"{yyyy}\", $d[0], $format);\n                $format = str_replace(\"{yy}\", $d[1], $format);\n                $format = str_replace(\"{mm}\", $d[2], $format);\n                $format = str_replace(\"{dd}\", $d[3], $format);\n                $format = str_replace(\"{hh}\", $d[4], $format);\n                $format = str_replace(\"{ii}\", $d[5], $format);\n                $format = str_replace(\"{ss}\", $d[6], $format);\n                $format = str_replace(\"{time}\", $t, $format);\n                if($format!=''){\n                    //检查文件是否存在\n                    if(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){\n                        $path = explode('/',$format);\n                        $path1 = APP_PATH;\n                        foreach($path as $v){\n                            if($path1==APP_PATH){\n                                if(!file_exists($path1.$v)){\n                                    mkdir($path1.$v,0777);\n                                }\n                                $path1.=$v;\n                            }else{\n                                if(!file_exists($path1.'/'.$v)){\n                                    mkdir($path1.'/'.$v,0777);\n                                }\n                                $path1.='/'.$v;\n                            }\n                        }\n                    }else if(!file_exists(APP_PATH.$format)){\n                        mkdir(APP_PATH.$format,0777);\n                    }\n                    $home_save_path = $format;\n                    \n                }else{\n                    $home_save_path = 'public/Home';\n                }\n                \n                \n            }else{\n                $home_save_path = 'public/Home';\n            }\n            \n            if(isset($this->webconf['upload_file_name']) && $this->webconf['upload_file_name']){\n                $filename[]=$home_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix; //定义文件名\n            }else{\n                $name = urldecode($v);\n                $name = str_ireplace([\"'\",'\"','%','&',' '],'',$name);\n                $name = format_param($name,6);\n                $filename[]=$home_save_path.'/'.$name; //定义文件名\n            }\n            \n        }\n        \n        $response = array();\n        foreach ($_FILES[$file]['tmp_name'] as $k=>$v){\n            if(move_uploaded_file($v, $filename[$k])){\n                \n                if(isset($_SESSION['member'])){\n                    $userid = $_SESSION['member']['id'];\n                }else{\n                    $userid = 0;\n                }\n                $filesize = round(filesize(APP_PATH.$filename[$k])/1024,2);\n                M('pictures')->add(['litpic'=>'/'.$filename[$k],'addtime'=>time(),'userid'=>$userid,'size'=>$filesize,'tid'=>$this->frparam('tid',0,0),'filetype'=>strtolower($pix),'molds'=>$this->frparam('molds',1,null),'path'=>'Home']);\n                $response[] = '/'.$filename[$k];\n                \n            }else{\n                $data['error'] =  \"Error: \".JZLANG(\"请检查目录\").\"[\".$home_save_path.\"]\".JZLANG(\"写入权限\");\n                $data['code'] = 1001;\n                JsonReturn($data);\n            }\n        }\n        $data = ['code'=>0,'urls'=>$response,'msg'=>JZLANG('上传成功！')];\n        JsonReturn($data);\n        \n        \n        \n    }\n    \n    function uploads(){\n\t\t$file = $this->frparam('filename',1);\n\t\tif(!$file){\n\t\t\t$file = 'file';\n\t\t}\n\t\tif ($_FILES[$file][\"error\"] > 0){\n\t\t  $data['error'] =  \"Error: \".JZLANG(\"上传错误！\");\n\t\t  $data['code'] = 1000;\n\t\t}else{\n\t\t  // echo \"Upload: \" . $_FILES[\"file\"][\"name\"] . \"<br />\";\n\t\t  // echo \"Type: \" . $_FILES[\"file\"][\"type\"] . \"<br />\";\n\t\t  // echo \"Size: \" . ($_FILES[\"file\"][\"size\"] / 1024) . \" Kb<br />\";\n\t\t  // echo \"Stored in: \" . $_FILES[\"file\"][\"tmp_name\"];\n\t\t  $pix = explode('.',$_FILES[$file]['name']);\n\t\t  $pix = end($pix);\n\t\t  //检测是否允许前台上传文件\n\t\t  if(!$this->webconf['isopenhomeupload']){\n\t\t\t  $data['error'] =  \"Error: \".JZLANG(\"已关闭前台上传文件功能\");\n\t\t\t  $data['code'] = 1004;\n\t\t\t  JsonReturn($data);\n\t\t  }\n            if($this->webconf['onlyuserupload'] && !$this->islogin){\n                $data['error'] =  \"Error: 仅会员才可以上传！\";\n                $data['code'] = 1005;\n                JsonReturn($data);\n            }\n\n            if($this->webconf['onlyuserupload'] && $this->islogin){\n\n                $all = M('pictures')->findAll(['userid'=>$this->member['id']],null,'size');\n                $allsize = 0;\n                foreach ($all as $v){\n                    $allsize+=$v['size'];\n                }\n                $limisize = $this->member['uploadsize'] * 1024;\n                if($limisize<=$allsize){\n                    $data['error'] =  \"Error: 超出会员上传文件大小！\";\n                    $data['code'] = 1006;\n                    JsonReturn($data);\n\n                }\n\n\n            }\n\t\t\t$fileType = webConf('fileType');\n\t\t\tif(strpos($fileType,strtolower($pix))===false  || stripos($pix,'php')!==false || stripos($pix,'phtml')!==false || stripos($pix,'phar')!==false){\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"文件类型不允许上传！\");\n\t\t\t\t$data['code'] = 1002;\n\t\t\t\tJsonReturn($data);\n\t\t\t}\n\t\t\t$fileSize = (int)webConf('fileSize');\n\t\t\tif($fileSize!=0 && ($_FILES[$file][\"size\"]/1024)>$fileSize){\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"文件大小超过网站内部限制！\");\n\t\t\t\t$data['code'] = 1003;\n\t\t\t\tJsonReturn($data);\n\t\t\t}\n\t\t  \tif(isset($this->webconf['home_save_path'])){\n\t\t\t  //替换日期事件\n\t\t\t\t$t = time();\n\t\t\t\t$d = explode('-', date(\"Y-y-m-d-H-i-s\"));\n\t\t\t\t$format = $this->webconf['home_save_path'];\n\t\t\t\t$format = str_replace(\"{yyyy}\", $d[0], $format);\n\t\t\t\t$format = str_replace(\"{yy}\", $d[1], $format);\n\t\t\t\t$format = str_replace(\"{mm}\", $d[2], $format);\n\t\t\t\t$format = str_replace(\"{dd}\", $d[3], $format);\n\t\t\t\t$format = str_replace(\"{hh}\", $d[4], $format);\n\t\t\t\t$format = str_replace(\"{ii}\", $d[5], $format);\n\t\t\t\t$format = str_replace(\"{ss}\", $d[6], $format);\n\t\t\t\t$format = str_replace(\"{time}\", $t, $format);\n\t\t\t\tif($format!=''){\n\t\t\t\t\t//检查文件是否存在\n\t\t\t\t\tif(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){\n\t\t\t\t\t\t$path = explode('/',$format);\n\t\t\t\t\t\t$path1 = APP_PATH;\n\t\t\t\t\t\tforeach($path as $v){\n\t\t\t\t\t\t\tif($path1==APP_PATH){\n\t\t\t\t\t\t\t\tif(!file_exists($path1.$v)){\n\t\t\t\t\t\t\t\t\tmkdir($path1.$v,0777);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$path1.=$v;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif(!file_exists($path1.'/'.$v)){\n\t\t\t\t\t\t\t\t\tmkdir($path1.'/'.$v,0777);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$path1.='/'.$v;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}else if(!file_exists(APP_PATH.$format)){\n\t\t\t\t\t\tmkdir(APP_PATH.$format,0777);\n\t\t\t\t\t}\n\t\t\t\t\t$home_save_path = $format;\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$home_save_path = 'public/Home';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t  }else{\n\t\t\t\t $home_save_path = 'public/Home';\n\t\t\t  }\n            \n            if(!isset($this->webconf['upload_file_name']) || (isset($this->webconf['upload_file_name']) && $this->webconf['upload_file_name'])){\n                $filename =  $home_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix;\n            }else{\n                $name = urldecode($_FILES[$file]['name']);\n                $name = str_ireplace([\"'\",'\"','%','&',' '],'',$name);\n                $name = format_param($name,6);\n                $filename =  $home_save_path.'/'.$name;\n            }\n\t\t    \n\t\t  \n\t\t\tif(move_uploaded_file($_FILES[$file]['tmp_name'],$filename)){\n\t\t\t\t$data['url'] = '/'.$filename;\n\t\t\t\t$data['code'] = 0;\n\t\t\t\tif(isset($_SESSION['member'])){\n\t\t\t\t\t$userid = $_SESSION['member']['id'];\n\t\t\t\t}else{\n\t\t\t\t\t$userid = 0;\n\t\t\t\t}\n\t\t\t\t$filesize = round(filesize(APP_PATH.$filename)/1024,2);\n\t\t\t\tM('pictures')->add(['litpic'=>'/'.$filename,'addtime'=>time(),'userid'=>$userid,'size'=>$filesize,'tid'=>$this->frparam('tid',0,0),'filetype'=>strtolower($pix),'molds'=>$this->frparam('molds',1,null),'path'=>'Home']);\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"请检查目录\").\"[public/Home]\".JZLANG(\"写入权限\");\n\t\t\t\t$data['code'] = 1001;\n\t\t\t\t  \n\t\t\t} \n\n\t\t\t  \n\t\t  \n\t\t  }\n\t\t  \n\t\t  \n\t\t  JsonReturn($data);\n\t\t  exit;\n\t\t  \n\t\t\n\t\t\n\t}\n\tfunction qrcode(){\n\t\textendFile('phpqrcode/phpqrcode.php');\n\t\t$data = $this->frparam('data',1);\n\t\t//$pic = 'qrcode.png';\n\t\t$errorCorrectionLevel = \"L\";\n\t\t$matrixPointSize = 6;\n\t\t//$value = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'];\n\t\t\n\t\t\\QRcode::png($data, false, $errorCorrectionLevel, $matrixPointSize, 2);\n\t}\n\n\tfunction get_fields(){\n\t\t\n\t\t\n\t\t$molds = strtolower($this->frparam('molds',1,'message'));\n\t\tif($molds!='message'){\n\t\t\t$this->checklogin();\n\t\t}\n\t\t$tid = $this->frparam('tid');\n\t\t$sql = array();\n\t\tif($tid!=0){\n\t\t\t$sql[] = \" (tids like '%,\".$tid.\",%' or tids is null) \"; \n\t\t}\n\t\t\n\t\tif(!M('molds')->find(['biaoshi'=>$molds])){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数错误！')]);\n\t\t}\n\t\tif(in_array($molds,['level','level_group','member_group','plugins','sysconfig','ruler','molds','power','hook','layout','fields','comment','classtype'])){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数错误！')]);\n\t\t}\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t    if($molds=='member'){\n                $data = M($molds)->find(array('id'=>$this->member['id']));\n            }else{\n                $data = M($molds)->find(array('id'=>$id));\n            }\n\t\t\t\n\t\t}else{\n\t\t\t$data = array();\n\t\t}\n\t\t$sql[] = \" molds = '\".$molds.\"' and ishome=1 \";\n\t\t$sql = implode(' and ',$sql);\n\t\t$fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\n\t\t$l = '';\n\t\t$rd = time();\n\t\t// if($molds=='article'){\n\t\t// $model = 'article_zdy';\n\t\t// $l .=  include(APP_PATH.'static/common/uediter.php');\n\t\t// }else if($molds=='product'){\n\t\t\t\n\t\t// $model = 'product_zdy';\n\t\t// $l .=  include(APP_PATH.'static/common/uediter.php');\n\t\t// }\n\t\tforeach($fields_list as $k=>$v){\n\t\t\tif(!array_key_exists($v['field'],$data)){\n\t\t\t\t//使用默认值\n\t\t\t\t$data[$v['field']] = $v['vdata'];\n\t\t\t}\n\t\t\tif($v['ismust']==1){\n\t\t\t\t$must = '['.JZLANG('必填').']';\n\t\t\t}else{\n\t\t\t\t$must = '';\n\t\t\t}\n\t\t\tswitch($v['fieldtype']){\n\t\t\t\tcase 1:\n\t\t\t\tcase 14:\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t            <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t            <input type=\"text\" id=\"'.$v['field'].'\" autocomplete=\"off\" value=\"'.$data[$v['field']].'\" name=\"'.$v['field'].'\">\n\t\t            <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>';\n\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t            <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t            <textarea id=\"'.$v['field'].'\"  name=\"'.$v['field'].'\" >'.$data[$v['field']].'</textarea>\n\t\t            <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>';\n\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t$model = $molds;\n\t\t\t\t$l .=  include(APP_PATH.'static/common/uediter.php');\n\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t            <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t            <input type=\"number\" id=\"'.$v['field'].'\" autocomplete=\"off\" value=\"'.$data[$v['field']].'\" name=\"'.$v['field'].'\">\n\t\t            <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>';\n\t\t\t\tbreak;\n\t\t\t\tcase 11:\n\t\t\t\t$laydate = ($data[$v['field']]=='' || $data[$v['field']]==0)?time():$data[$v['field']];\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t            <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t            <input type=\"date\" id=\"'.$v['field'].'\" autocomplete=\"off\" value=\"'.date('Y-m-d',$laydate).'\" name=\"'.$v['field'].'\">\n\t\t            <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>';\n\t\t\t\tbreak;\n\t\t\t\tcase 5:\n\t\t\t\t$rd = rand(1000,9999);\n\t\t\t\tif($molds=='member' && $v['field']=='litpic'){\n                    $uploadurl = U('user/uploads');\n                }else{\n                    $uploadurl = U('common/uploads');\n                }\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t              <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t              <span class=\"view_img_'.$v['field'].'\">';\n\t\t            if($data[$v['field']]){\n\t\t            $l .= '<img src=\"'.$data[$v['field']].'\" height=\"100\"  />';\n\t\t            }\n\t\t            $l .= '</span><br/>\n\t\t              <input name=\"'.$v['field'].'\" type=\"text\" id=\"file_url_'.$v['field'].'\" value=\"'.$data[$v['field']].'\" /><br/>\n\t\t              <input type=\"file\" class=\"upload_input_'.$v['field'].'\" name=\"file_'.$v['field'].'\" id=\"upload_input_'.$v['field'].$rd.'\">\n\t\t              <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>\n\t\t\t\t<script type=\"text/javascript\">\n\t\t\t\t\t\n\t\t\t\t  $(document).on(\"change\",\"#upload_input_'.$v['field'].$rd.'\",function(){\n\t\t\t\t    var form=document.getElementById(\"jizhiform\");\n\t\t\t\t    var data =new FormData(form);\n\t\t\t\t    data.append(\"filename\",$(this).attr(\"name\"));\n\t\t\t\t    $.ajax({\n\t\t\t\t       url: \"'.$uploadurl.'\",//处理图片的文件路径\n\t\t\t\t       type: \"POST\",//传输方式\n\t\t\t\t       data: data,\n\t\t\t\t       dataType:\"json\",//返回格式为json\n\t\t\t\t       processData: false,  // 告诉jQuery不要去处理发送的数据\n\t\t\t\t       contentType: false,   // 告诉jQuery不要去设置Content-Type请求头\n\t\t\t\t       success: function(response){\n\t\t\t\t        if(response.code==0){\n\t\t\t\t          var result = \"\";\n\t\t\t\t          result +=\\'<img src=\"\\' + response[\"url\"] + \\'\" height=\"100\"  />\\';\n\t\t\t\t          $(\".view_img_'.$v['field'].'\").html(result);\n\t\t\t\t          $(\"#file_url_'.$v['field'].'\").val(response[\"url\"]);\n\t\t\t\t        }else{\n\t\t\t\t          alert(response.error);\n\t\t\t\t        }\n\t\t\t\t        \n\t\t\t\t       }\n\t\t\t\t    });\n\t\t\t\t  });\n\t\t\t\t\t\n\t\t\t\t</script>';\n\t\t\t\tbreak;\n\t\t\t\tcase 6:\n\t\t\t\t$rd = rand(1000,9999);\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t            <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t            <span class=\"view_img_'.$v['field'].'\">';\n\t\t            if($data[$v['field']]){\n\t\t            \tforeach(explode('||',$data[$v['field']]) as $s){\n\t\t            \t\tif($s!=''){\n                                $pic = explode('|',$s);\n                                $l .= '<span><img src=\"'.$pic[0].'\" height=\"100\"  /><input name=\"'.$v['field'].'_urls[]\" type=\"text\" value=\"'.$pic[0].'\"><input name=\"'.$v['field'].'_des[]\" type=\"text\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"'.$pic[1].'\" ><button type=\"button\" onclick=\"deleteImage_auto(this)\">'.JZLANG('删除').'</button></span>';\n\t\t            \t\t\t \n\t\t            \t\t}\n\t\t            \t}\n\t\t           \n\t\t            }\n\t\t            $l .= '</span>\n\t\t        </div>\n\t\t\t\t<div class=\"form-control\">\n\t\t\t\t<label ></label>\n\t\t\t\t<input type=\"file\" class=\"upload_input_'.$v['field'].'\" file-name=\"file_'.$v['field'].'\" name=\"file_'.$v['field'].'[]\" multiple=\"multiple\" id=\"upload_input_'.$v['field'].$rd.'\">\n\t\t\t\t<label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>\n\t\t\t\t<script type=\"text/javascript\">\n\t\t\t\t\t$(document).on(\"change\",\"#upload_input_'.$v['field'].$rd.'\",function(){\n\t\t\t\t\t    var form=document.getElementById(\"jizhiform\");\n\t\t\t\t\t    var data =new FormData(form);\n\t\t\t\t\t    data.append(\"filename\",$(this).attr(\"file-name\"));\n\t\t\t\t\t    $.ajax({\n\t\t\t\t\t       url: \"'.U('common/multiuploads').'\",//处理图片的文件路径\n\t\t\t\t\t       type: \"POST\",//传输方式\n\t\t\t\t\t       data: data,\n\t\t\t\t\t       dataType:\"json\",//返回格式为json\n\t\t\t\t\t       processData: false,  // 告诉jQuery不要去处理发送的数据\n\t\t\t\t\t       contentType: false,   // 告诉jQuery不要去设置Content-Type请求头\n\t\t\t\t\t       success: function(response){\n\t\t\t\t\t        if(response.code==0){\n\t\t\t\t\t          var result = \"\";\n\t\t\t\t\t          for(var i=0;i<response[\"urls\"].length;i++){\n\t\t\t\t\t          \tresult +=\\'<span><img src=\"\\' + response[\"urls\"][i] + \\'\" height=\"100\"  /><input name=\"'.$v['field'].'_urls[]\" type=\"text\" value=\"\\' + response[\"urls\"][i] + \\'\" ><input name=\"'.$v['field'].'_des[]\" type=\"text\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"\" ><button type=\"button\" onclick=\"deleteImage_auto(this)\">'.JZLANG('删除').'</button></span>\\';\n\t\t\t\t\t          }\n\t\t\t\t\t          $(\".view_img_'.$v['field'].'\").append(result);\n\t\t\t\t\t        }else{\n\t\t\t\t\t          alert(response.error);\n\t\t\t\t\t        }\n\t\t\t\t\t        \n\t\t\t\t\t       }\n\t\t\t\t\t    });\n\t\t\t\t\t});\n\t\t\t\t</script>';\n\t\t\t\tbreak;\n\t\t\t\tcase 7:\n\t\t\t\t$l .= '<div class=\"form-control\">\n                    <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t\t\t\t<select name=\"'.$v['field'].'\" id=\"'.$v['field'].'\" ><option value=\"\">请选择</option>';\n\t\t\t\t\tforeach(explode(',',$v['body']) as $vv){\n\t\t\t\t\t\t$s=explode('=',$vv);\n\t\t\t\t\t\t$l.='<option value=\"'.$s[1].'\" ';\n\t\t\t\t\t\tif($data[$v['field']]==$s[1]){\n\t\t\t\t\t\t\t$l.='selected=\"selected\"';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$l.='>'.$s[0].'</option>';\n\t\t\t\t\t}\n\t\t\t\t\t\t$l.=  '</select>\n\t\t\t\t\t\t<label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t                </div>';\n\t\t\t\tbreak;\n\t\t\t\tcase 12:\n\t\t\t\t$l .= '<div class=\"form-control\">\n                    <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n                    <div class=\"check-box\">';\n\t\t\t\tforeach(explode(',',$v['body']) as $vv){\n\t\t\t\t\t$s=explode('=',$vv);\n\t\t\t\t\t$l.='<input type=\"radio\" name=\"'.$v['field'].'\" value=\"'.$s[1].'\" title=\"'.$s[0].'\" ';\n\t\t\t\t\tif($data[$v['field']]==$s[1]){\n\t\t\t\t\t\t$l.='checked=\"checked\"';\n\t\t\t\t\t}\n\t\t\t\t\t$l.=' >'.$s[0];\n\t\t\t\t}\n\t\t\t\t\t$l.='</div>\n\t\t\t\t\t<label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t\t\t\t</div>';\n\t\t\t\tbreak;\n\t\t\t\tcase 8:\n\t\t\t\t$l .= ' <div class=\"form-control\">\n\t\t\t\t\t<label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t\t\t\t<div class=\"check-box\">';\n\t\t\t\tforeach(explode(',',$v['body']) as $vv){\n\t\t\t\t\t$s=explode('=',$vv);\n\t\t\t\t\t$l.='<input type=\"checkbox\" title=\"'.$s[0].'\" name=\"'.$v['field'].'[]\" value=\"'.$s[1].'\" ';\n\t\t\t\t\tif(strpos($data[$v['field']],','.$s[1].',')!==false){\n\t\t\t\t\t\t$l.='checked=\"checked\"';};\n\t\t\t\t\t$l.='>'.$s[0];\n\t\t\t\t}\n\t\t\t\t$l \t.= '</div>\n\t\t\t\t\t<label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t\t\t\t</div>';\n\t\t\t\tbreak;\n\t\t\t\tcase 9:\n\t\t\t\t$rd = rand(1000,9999);\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t              <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t              <span class=\"view_img_'.$v['field'].'\">';\n\t\t            $l .= '</span><br/>\n\t\t              <input name=\"'.$v['field'].'\" type=\"text\" id=\"file_url_'.$v['field'].'\" value=\"'.$data[$v['field']].'\" /><br/>\n\t\t              <input type=\"file\" class=\"upload_input_'.$v['field'].'\" name=\"file_'.$v['field'].'\" id=\"upload_input_'.$v['field'].$rd.'\">\n\t\t              <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>\n\t\t\t\t<script type=\"text/javascript\">\n\t\t\t\t\t$(document).on(\"change\",\"#upload_input_'.$v['field'].$rd.'\",function(){\n\t\t\t\t\t    var form=document.getElementById(\"jizhiform\");\n\t\t\t\t\t    var data =new FormData(form);\n\t\t\t\t\t    data.append(\"filename\",$(this).attr(\"name\"));\n\t\t\t\t\t    $.ajax({\n\t\t\t\t\t       url: \"'.U('common/uploads').'\",//处理图片的文件路径\n\t\t\t\t\t       type: \"POST\",//传输方式\n\t\t\t\t\t       data: data,\n\t\t\t\t\t       dataType:\"json\",//返回格式为json\n\t\t\t\t\t       processData: false,  // 告诉jQuery不要去处理发送的数据\n\t\t\t\t\t       contentType: false,   // 告诉jQuery不要去设置Content-Type请求头\n\t\t\t\t\t       success: function(response){\n\t\t\t\t\t        if(response.code==0){\n\t\t\t\t\t          $(\"#file_url_'.$v['field'].'\").val(response[\"url\"]);\n\t\t\t\t\t        }else{\n\t\t\t\t\t          alert(response.error);\n\t\t\t\t\t        }\n\t\t\t\t\t        \n\t\t\t\t\t       }\n\t\t\t\t\t    });\n\t\t\t\t\t});\n\t\t\t\t</script>';\n\t\t\t\tbreak;\n\t\t\t\tcase 10:\n\t\t\t\t$rd = rand(1000,9999);\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t            <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t            <span class=\"view_img_'.$v['field'].'\">';\n\t\t            if($data[$v['field']]){\n\t\t            \tforeach(explode('||',$data[$v['field']]) as $s){\n\t\t            \t\tif($s!=''){\n                                $pic = explode('|',$s);\n                                $l .= '<span><input name=\"'.$v['field'].'_urls[]\" type=\"text\" value=\"'.$pic[0].'\"><input name=\"'.$v['field'].'_des[]\" type=\"text\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"'.$pic[1].'\" ><button type=\"button\" onclick=\"deleteImage_auto(this)\">'.JZLANG('删除').'</button></span>';\n\t\t            \t\t\t \n\t\t            \t\t}\n\t\t            \t}\n\t\t           \n\t\t            }\n\t\t            $l .= '</span>\n\t\t        </div>\n\t\t\t\t<div class=\"form-control\">\n\t\t            <label ></label>\n\t\t\t\t\t<input type=\"file\" class=\"upload_input_'.$v['field'].'\" file-name=\"file_'.$v['field'].'\" name=\"file_'.$v['field'].'[]\" multiple=\"multiple\" id=\"upload_input_'.$v['field'].$rd.'\">\n\t\t\t\t\t<label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>\n\t\t\t\t<script type=\"text/javascript\">\n\t\t\t\t\t$(document).on(\"change\",\"#upload_input_'.$v['field'].$rd.'\",function(){\n\t\t\t\t\t    var form=document.getElementById(\"jizhiform\");\n\t\t\t\t\t    var data =new FormData(form);\n\t\t\t\t\t    data.append(\"filename\",$(this).attr(\"file-name\"));\n\t\t\t\t\t    $.ajax({\n\t\t\t\t\t       url: \"'.U('common/multiuploads').'\",//处理图片的文件路径\n\t\t\t\t\t       type: \"POST\",//传输方式\n\t\t\t\t\t       data: data,\n\t\t\t\t\t       dataType:\"json\",//返回格式为json\n\t\t\t\t\t       processData: false,  // 告诉jQuery不要去处理发送的数据\n\t\t\t\t\t       contentType: false,   // 告诉jQuery不要去设置Content-Type请求头\n\t\t\t\t\t       success: function(response){\n\t\t\t\t\t        if(response.code==0){\n\t\t\t\t\t          var result = \"\";\n\t\t\t\t\t          for(var i=0;i<response[\"urls\"].length;i++){\n                                 result +=\\'<span><input name=\"'.$v['field'].'_urls[]\" type=\"text\" value=\"\\' + response[\"urls\"][i] + \\'\" ><input name=\"'.$v['field'].'_des[]\" type=\"text\" placeholder=\"'.JZLANG('文字描述').'\"  value=\"\" ><button type=\"button\" onclick=\"deleteImage_auto(this)\">'.JZLANG('删除').'</button></span>\\';\n\t\t\t\t\t        }\n\t\t\t\t\t          $(\".view_img_'.$v['field'].'\").append(result);\n\t\t\t\t\t        }else{\n\t\t\t\t\t          alert(response.error);\n\t\t\t\t\t        }\n\t\t\t\t\t        \n\t\t\t\t\t       }\n\t\t\t\t\t    });\n\t\t\t\t\t  \n\t\t\t\t\t});\n\t\t\t\t</script>';\n\t\t\t\tbreak;\n\t\t\t\tcase 13:\n\t\t\t\t$l .= '<div class=\"form-control\">\n                    <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t\t\t\t<select name=\"'.$v['field'].'\" id=\"'.$v['field'].'\" ><option value=\"\">请选择</option>';\n\t\t\t\t\t\t$body = explode(',',$v['body']);\n\t\t\t\t$biaoshi = M('molds')->getField(['id'=>$body[0]],'biaoshi');\n\t\t\t\t$datalist = M($biaoshi)->findAll(['isshow'=>1],null,null,50);\n\t\t\t\tforeach($datalist as $vv){\n\t\t\t\t\t$l.='<option value=\"'.$vv['id'].'\" ';\n\t\t\t\t\tif($data[$v['field']]==$vv['id']){\n\t\t\t\t\t\t$l.='selected=\"selected\"';\n\t\t\t\t\t}\n\t\t\t\t\t$l.='>'.$vv[$body[1]].'</option>';\n\t\t\t\t}\n\t\t\t\t\t$l.=  '</select>\n                    <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n                </div>';\n\t\t\t\tbreak;\n                case 21:\n                    $body = explode(',',$v['body']);\n                    $tid = (int)$body[0];\n                    $biaoshi = $this->classtypedata[$tid]['molds'];\n                    $l .= '<div class=\"form-control\">\n                    <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t\t\t\t<select name=\"'.$v['field'].'\" id=\"'.$v['field'].'\" ><option value=\"\">请选择</option>';\n                    $datalist = M($biaoshi)->findAll(['isshow'=>1],null,null,50);\n                    foreach($datalist as $vv){\n                        $l.='<option value=\"'.$vv['id'].'\" ';\n                        if($data[$v['field']]==$vv['id']){\n                            $l.='selected=\"selected\"';\n                        }\n                        $l.='>'.$vv[$body[1]].'</option>';\n                    }\n                    $l.=  '</select>\n                    <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n                    </div>';\n                    break;\n\t\t\t\tcase 15:\n\t\t\t\t$l .= '<div class=\"form-control\">\n\t\t            <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t            <span class=\"view_img_'.$v['field'].'\">';\n\t\t            if($data[$v['field']]){\n\t\t            \tforeach(explode('||',$data[$v['field']]) as $s){\n\t\t            \t\tif($s){\n\t\t\t\t\t\t\t\t$l .= '<div class=\"form-control\"><input name=\"'.$v['field'].'[]\" type=\"text\" value=\"'.$s.'\"><button type=\"button\" class=\"'.$v['field'].'_del\">'.JZLANG('删除').'</button></div>';\n\t\t            \t\t\t \n\t\t            \t\t}\n\t\t            \t}\n\t\t           \n\t\t            }\n\t\t            $l .= '</span>\n\t\t        </div>\n\t\t\t\t<div class=\"form-control\">\n\t\t            <label ></label>\n\t\t\t\t\t<button type=\"button\" class=\"layui-btn\" id=\"'.$v['field'].'_add\">'.JZLANG('新增').'</button>\n\t\t\t\t\t<label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div>\n\t\t\t\t<script>\n\t\t\t\t$(document).ready(function(){\n\t\t\t\t\t$(\"#'.$v['field'].'_add\").click(function(){\n\t\t\t\t\t\tvar html = \\'<div class=\"form-control\"><input type=\"text\"  style=\"width:500px;\" value=\"\" name=\"'.$v['field'].'[]\" autocomplete=\"off\" ><button type=\"button\" class=\"'.$v['field'].'_del\" >'.JZLANG('删除').'</button></div>\\';\n\t\t\t\t\t\t\n\t\t\t\t\t\t$(\".view_img_'.$v['field'].'\").append(html);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\t$(document).on(\"click\",\".'.$v['field'].'_del\",function(){\n\t\t\t\t\t\t$(this).parent().remove();\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t})\n\t\t\t\t</script>';\n\t\t\t\tbreak;\n                case 16:\n                    $l .= ' <div class=\"form-control\">\n\t\t\t\t\t<label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t\t\t\t<div class=\"check-box\">';\n                    $body = explode(',',$v['body']);\n                    $biaoshi = M('molds')->getField(['id'=>$body[0]],'biaoshi');\n                    if(!$biaoshi){\n                        echo $v['field'].JZLANG('字段关联绑定失败，请重新绑定！');exit;\n                    }\n                    $datalist = M($biaoshi)->findAll(['isshow'=>1]);\n\n                    foreach($datalist as $vv){\n\n                        $l.='<input type=\"checkbox\" title=\"'.$vv[$body[1]].'\" name=\"'.$v['field'].'[]\" value=\"'.$vv['id'].'\" ';\n                        if(strpos($data[$v['field']],','.$vv['id'].',')!==false){\n                            $l.='checked=\"checked\"';};\n                        $l.='>'.$vv[$body[1]];\n                    }\n                    $l \t.= '</div>\n\t\t\t\t\t<label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t\t\t\t</div>';\n                    break;\n                case 20:\n                    $body = explode(',',$v['body']);\n                    $tid = (int)$body[0];\n                    $biaoshi = $this->classtypedata[$tid]['molds'];\n                    $l .= ' <div class=\"form-control\">\n\t\t\t\t\t<label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t\t\t\t<div class=\"check-box\">';\n                    if(!$biaoshi){\n                        echo $v['field'].JZLANG('字段关联绑定失败，请重新绑定！');exit;\n                    }\n                    $datalist = M($biaoshi)->findAll(['isshow'=>1],null,null,50);\n                    foreach($datalist as $vv){\n                        $l.='<input type=\"checkbox\" title=\"'.$vv[$body[1]].'\" name=\"'.$v['field'].'[]\" value=\"'.$vv['id'].'\" ';\n                        if(strpos($data[$v['field']],','.$vv['id'].',')!==false){\n                            $l.='checked=\"checked\"';};\n                        $l.='>'.$vv[$body[1]];\n                    }\n                    $l \t.= '</div>\n\t\t\t\t\t<label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t\t\t\t</div>';\n                    break;\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t$l.='<script>\n\t\t$(function(){\n\t\t\t$(document).on(\"click\",\".delete_file\",function(){\n\t\t\t\t//删除图片信息\n\t\t\t\t$(this).parent().remove();\n\t\t\t})\n\t\t})\n\n\t\tfunction deleteImage_auto(elm){\n\t\t\t$(elm).parent().remove();\n\t\t}\n\t\t</script>';\n\t\t\n\t\t//echo $l;\n\t\tJsonReturn(['code'=>0,'fields_list'=>$fields_list,'tpl'=>$l]);\n\t}\n\t\t\n\t\n\tfunction jizhi(){\n\t\theader(\"HTTP/1.0 404\");\n\t\t$this->display($this->template.'/404');\n\t\texit;\n\t}\n\tfunction error($msg){\n\t\theader(\"HTTP/1.0 404\");\n\t\t$this->display($this->template.'/404');\n\t\texit;\n\t}\n\t\n\t//更新session的过期时间\n    function updateactive(){\n\t  $cache_time = (int)webConf('cache_time');\n\t  $cache_time = $cache_time==0 ? 3600 : $cache_time;\n\t  setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + $cache_time);\n\t  \n    }\n\t\n\t//递增递减\n\tfunction gohits(){\n\t\t$id = $this->frparam('id');\n\t\t$molds = strtolower($this->frparam('molds',1,'article'));\n\t\t$moldslist = getCache('moldslist');\n\t\tif(!$moldslist){\n\t\t\t$list = M('molds')->findAll();\n\t\t\t$moldslist = [];\n\t\t\tforeach($list as $v){\n\t\t\t\t$moldslist[]=$v['biaoshi'];\n\t\t\t}\n\t\t\tsetCache('moldslist',$moldslist);\n\t\t}\n\t\tif(in_array($molds,$moldslist)){\n\t\t\t$i = $this->frparam('num',0,1);\n\t\t\t$n = M($molds)->getField(['id'=>$id],'hits');\n\t\t\t$num = $n+$i;\n\t\t\tM($molds)->update(['id'=>$id],['hits'=>$num]);\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>0,'msg'=>'success','data'=>$num]);\n\t\t\t}else{\n\t\t\t\techo $num;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t}\n\n}"
  },
  {
    "path": "app/home/c/ErrorController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\nuse frphp\\lib\\Controller;\nclass ErrorController extends Controller\n{\n\t//错误处理示例\n\tfunction index($msg=''){\n\t\theader(\"HTTP/1.0 404\");\n        if(APP_DEBUG){\n            $msg = format_param($msg,1);\n            echo JZLANG('错误信息提示').'：<br/>';\n            echo $msg;\n        }else{\n            echo '<!doctype html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n<title>404</title>\n<style>\n\tbody{\n\t\tbackground-color:#444;\n\t\tfont-size:14px;\n\t}\n\th3{\n\t\tfont-size:60px;\n\t\tcolor:#eee;\n\t\ttext-align:center;\n\t\tpadding-top:30px;\n\t\tfont-weight:normal;\n\t}\n</style>\n</head>\n\n<body>\n<h3>404，您请求的文件不存在!</h3>\n</body>\n</html>';\n        }\n\t\t\n\n    }\n}\n\t"
  },
  {
    "path": "app/home/c/HomeController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2019/01-2019/02\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace app\\home\\c;\r\n\r\n\r\nuse frphp\\extend\\Page;\r\nuse FrPHP\\Extend\\ArrayPage;\r\n\r\nclass HomeController extends CommonController\r\n{\r\n\r\n\t//首页\r\n\tfunction index(){\r\n\t\t//检查缓存\r\n\t\tif(stripos(REQUEST_URI,'.php')!==false && REQUEST_URI!='/index.php'){\r\n\t\t\t$this->error(JZLANG('链接错误！'));\r\n\t\t}\r\n\t\t$urls = explode('/',REQUEST_URI);\r\n\t\tif(count($urls)>=2 && REQUEST_URI=='/' && REQUEST_URI=='/index.php' && REQUEST_URI=='/index.html'){\r\n\t\t\t$this->error(JZLANG('链接错误！'));\r\n\t\t}\r\n\t\t$this->ishome = true;\r\n\t\t$this->display($this->template.'/index');\r\n\r\n\t}\r\n\t//栏目\r\n\tfunction jizhi(){\r\n\t\t//接收前台所有的请求\r\n\t\t$request_url = str_replace(APP_URL,'',REQUEST_URI);\r\n\t\t$position = strpos($request_url,'?');\r\n\t\t$url = ($position!==FALSE) ? substr($request_url,0,$position) : $request_url;\r\n\t\t$url = substr($url,1,strlen($url)-1);\r\n\r\n\t\tif($url=='' || $url=='/' || $url=='index.php' || $url=='index.html'){\r\n\t\t\t$this->index();exit;\r\n\t\t}\r\n\t\t$this->ishome = false;\r\n\t\t\r\n\t\t//  news/123.html  news-123.html  news-list-123.html\r\n\t\t$url = str_ireplace('.html','',$url);\r\n\t\t//strripos\r\n\t\tif(File_TXT_HIDE && !CLASS_HIDE_SLASH){\r\n\t\t\t$url = (strripos($url,'/')+1 == strlen($url)) ? substr($url,0,strripos($url,'/')) : $url; \r\n\t\t}\r\n\t\tif(!$this->webconf['islevelurl']){\r\n\t\t\t//没有开启URL层级\r\n\t\t\tif(strpos($url,'/')!==false){\r\n\t\t\t\t$urls = explode('/',$url);\r\n\t\t\t\t//内容详情页\r\n\t\t\t\t$html = $urls[0];\r\n\t\t\t\t\r\n\t\t\t\tif(isset($urls[1])){\r\n\t\t\t\t\t$id = (int)$urls[1];\r\n\t\t\t\t\tif(!$id){\r\n\t\t\t\t\t\t$this->error(JZLANG('链接错误！'));exit;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\t}else{\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t//栏目页\r\n\t\t\t\t$this->frpage = $this->frparam('page',0,1);\r\n\t\t\t\tif(strpos($url,'-')!==false){\r\n\t\t\t\t\t//检测是否为分页\r\n\t\t\t\t\t$res = M('classtype')->find(array('htmlurl'=>$url,'isclose'=>0));\r\n\t\t\t\t\tif(!$res){\r\n\t\t\t\t\t\t//存在分页,取最后一个字符串\r\n\t\t\t\t\t\t$html_x = explode('-',$url);\r\n\t\t\t\t\t\t$this->frpage = array_pop($html_x);\r\n\t\t\t\t\t\tif(!$this->frpage){\r\n\t\t\t\t\t\t\t$this->error(JZLANG('链接错误！'));exit;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$html = implode('-',$html_x);//再次拼接\r\n\t\t\t\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t//不是分页\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$html = $url;\r\n\t\t\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\r\n\t\t}else{\r\n\t\t\t//开启URL层级\r\n\t\t\t//判断是否为栏目\r\n\t\t\t$html=$url;\r\n\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\tif(!$res){\r\n\t\t\t\t\r\n\t\t\t\tif(strpos($url,'/')!==false){\r\n\t\t\t\t\t$urls = explode('/',$url);\r\n\t\t\t\t\t$urls_end = array_pop($urls);\r\n\t\t\t\t\tif(strpos($urls_end,'-')!==false){\r\n\t\t\t\t\t\t//分页\r\n\t\t\t\t\t\t//存在分页,取最后一个字符串\r\n\t\t\t\t\t\t$html_x = explode('-',$urls_end);\r\n\t\t\t\t\t\t$this->frpage = array_pop($html_x);\r\n\t\t\t\t\t\tif(!$this->frpage){\r\n\t\t\t\t\t\t\t$this->error(JZLANG('链接错误！'));exit;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$urls[] = implode('-',$html_x);//再次拼接\r\n\t\t\t\t\t\t$html = implode('/',$urls);\r\n\t\t\t\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t//可能是数字？\r\n\t\t\t\t\t\t$html = implode('/',$urls);\r\n\t\t\t\t\t\t$id = (int)$urls_end;\r\n\t\t\t\t\t\tif($id<0){\r\n\t\t\t\t\t\t\t$this->error(JZLANG('链接错误！'));exit;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t}else{\r\n\t\t\t\t\t//栏目页\r\n\t\t\t\t\t$this->frpage = $this->frparam('page',0,1);\r\n\t\t\t\t\tif(strpos($url,'-')!==false){\r\n\t\t\t\t\t\t//检测是否为分页\r\n\t\t\t\t\t\t//存在分页,取最后一个字符串\r\n\t\t\t\t\t\t$html_x = explode('-',$url);\r\n\t\t\t\t\t\t$this->frpage = array_pop($html_x);\r\n\t\t\t\t\t\tif(!$this->frpage){\r\n\t\t\t\t\t\t\t$this->error(JZLANG('链接错误！'));exit;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$html = implode('-',$html_x);//再次拼接\r\n\t\t\t\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$html = $url;\r\n\t\t\t\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\tif($res){\r\n\t\t\t$res['url'] = $this->classtypedata[$res['id']]['url'];\r\n\t\t\t$this->type =  $res;\r\n\t\t\t//检查授权\r\n\t\t\tif($res['gids']){\r\n\t\t\t\t$gids = explode(',',$res['gids']);\r\n\t\t\t\tif(!$this->islogin){\r\n\t\t\t\t\tRedirect(U('Login/index'));\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif(!in_array($this->member['gid'],$gids)){\r\n\t\t\t\t\t\tError(JZLANG('对不起，您没有访问权限！'));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(isset($id)){\r\n\t\t\t\t\r\n\t\t\t\t//默认是详情页-非详情页另做处理\r\n\t\t\t\t$this->id = $id;\r\n\t\t\t\t$this->jizhi_details($this->id);\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t$children = $this->classtypedata[$res['id']]['children']['ids'];\r\n\t\t\t$child = [];\r\n\t\t\tforeach($children as $v){\r\n\t\t\t\tif($this->classtypedata[$v]['gids']){\r\n\t\t\t\t\t$gids_n = explode(',',$this->classtypedata[$v]['gids']);\r\n\t\t\t\t\tif($this->islogin && in_array($this->member['gid'],$gids_n)){\r\n\t\t\t\t\t\t$child[]=$v;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$child[]=$v;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t$sql = ' isshow=1 ';\r\n\t\t\t$molds = $res['molds'];\r\n            if($this->webconf['schedule_table']){\r\n                $tables = explode('|',$this->webconf['schedule_table']);\r\n                if(in_array($molds,$tables)){\r\n                    $sql.=' and addtime<='.time().' ';\r\n                }\r\n            }\r\n            $sql .= \" and (tid in (\".implode(',',$child).\") or tids like '%,\".$this->type['id'].\",%' )\";\r\n            $page = new Page($molds);\r\n            $jzattr = $this->frparam('attr',1);\r\n            if($jzattr){\r\n                $jzattr_arr = explode('-',$jzattr);\r\n                foreach ($jzattr_arr as $s){\r\n                    $sql.=\" and jzattr like '%,\".$s.\",%' \";\r\n                }\r\n                \r\n            }\r\n\t\t\t\r\n\t\t\t//手动设置分页条数\r\n\t\t\t$limit = $res['lists_num'];\r\n\t\t\tif($this->frparam('limit')){\r\n\t\t\t\t$limit = $this->frparam('limit');\r\n\t\t\t}\r\n\t\t\t$orders = 'istop desc,orders desc,addtime desc,id desc';\r\n\t\t\t$ot = $this->frparam('orders') ? $this->frparam('orders') : $res['orderstype'];\r\n\t\t\tswitch($ot){\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\t$orders = 'istop desc,orders desc,addtime desc,id desc';\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\t$orders = 'istop desc,orders desc,id asc';\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\t$orders = 'istop desc,orders asc';\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 4:\r\n\t\t\t\t\t$orders = 'istop desc,addtime desc';\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 5:\r\n\t\t\t\t\t$orders = 'istop desc,id asc';\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 6:\r\n\t\t\t\t\t$orders = 'istop desc,hits desc';\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 7:\r\n\t\t\t\t\t$orders = 'istop desc,addtime asc';\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t$limit = $limit<=0 ? 15 : $limit;\r\n\t\t\t$this->currentpage = $this->frpage;\r\n\t\t\t$data = $page->where($sql)->orderby($orders)->limit($limit)->page($this->frpage)->go();\r\n\t\t\t$pages = $page->pageList(5,'-');\r\n\t\t\t\r\n\t\t\t$this->pages = $pages;//组合分页\r\n\t\t\t\r\n\t\t\tforeach($data as $k=>$v){\r\n\t\t\t\tif(!isset($v['url'])){\r\n\t\t\t\t\t$data[$k]['url'] = gourl($v,$v['htmlurl']);\r\n\t\t\t\t}\r\n\t\t\t\t$data[$k]['class_name'] = $this->type['classname'];\r\n\t\t\t\t$data[$k]['class_url'] = $this->type['url'];\r\n\t\t\t\t$data[$k]['class_litpic'] = $this->type['litpic'];\r\n\t\t\t\t$data[$k]['format_addtime'] = $v['addtime'] ? date('Y-m-d H:i:s',$v['addtime']) : '';\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t$this->lists = $data;//列表数据\r\n\t\t\t$this->sum = $page->sum;//总数据\r\n\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\r\n\t\t\t$this->prevpage = $page->prevpage;//上一页\r\n\t\t\t$this->nextpage = $page->nextpage;//下一页\r\n\t\t\t$this->allpage = $page->allpage;//总页数\r\n\t\t\t//清空screen筛选\r\n            if(isset($GLOBALS['Redis'])){\r\n                if($GLOBALS['Redis']->get('screen')){\r\n                    $GLOBALS['Redis']->setex('screen',0,'');\r\n                }\r\n            }else if(session_id()){\r\n                if(isset($_SESSION['screen'])){\r\n                    $_SESSION['screen'] = null;\r\n                }\r\n            }else{\r\n                if(isset($_COOKIE['screen'])){\r\n                    setcookie('screen','',-1,'/');\r\n                }\r\n            }\r\n\t\t\t$this->filters = [];\r\n\t\t\tif($this->frparam('ajax') && $this->webconf['isajax']){\r\n\t\t\t\t\r\n\t\t\t\tif($this->frparam('ajax_tpl')){\r\n\t\t\t\t\t$this->display($this->template.'/'.$res['molds'].'/ajax_list_'.$res['lists_html']);\r\n\t\t\t\t\texit;\r\n\t\t\t\t}\r\n\t\t\t\t$sql = [];\r\n\t\t\t\t//$sql[] = \" tids like '%,\".$res['id'].\",%' \"; \r\n\t\t\t\t$sql[] = \" molds = '\".$res['molds'].\"' and isshow=1 \";\r\n\t\t\t\t$sql[] = \" isajax=0 \";//查询出不允许访问的字段，进行限制\r\n\t\t\t\t$sql = implode(' and ',$sql);\r\n\t\t\t\t\r\n\t\t\t\t$fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\r\n\t\t\t\tif($fields_list){\r\n\t\t\t\t\t$noallow = [];\r\n\t\t\t\t\tforeach($fields_list as $v){\r\n\t\t\t\t\t\t$noallow[]=$v['field'];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$newdata = [];\r\n\t\t\t\t\tforeach($data as $v){\r\n\t\t\t\t\t\tforeach($v as $kk=>$vv){\r\n\t\t\t\t\t\t\tif(in_array($kk,$noallow)){\r\n\t\t\t\t\t\t\t\tunset($v[$kk]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$newdata[]=$v;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t$data = $newdata;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tJsonReturn(['code'=>0,'data'=>$data,'type'=>$res,'sum'=>$this->sum,'allpage'=>$this->allpage]);\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t$classtypetree = array_reverse($this->classtypetree);\r\n\t\t\t$isgo = false;\r\n\t\t\t$newarray = [];\r\n\t\t\t$parent = [];//标记父类\r\n\t\t\t$istop = false;\r\n\t\t\tforeach($classtypetree as $k=>$v){\r\n\t\t\t\tif($v['id']==$res['id'] && !$isgo){\r\n\t\t\t\t\t$isgo = true;\r\n\t\t\t\t\t$res['level'] = $v['level'];\r\n\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t}\r\n\t\t\t\tif($v['id']==$res['id'] && $v['level']==0){\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif($v['level']==0 && $v['id']!=$res['id'] && $v['id']!=$res['pid']){\r\n\t\t\t\t\tif(!$istop && $isgo && $parent['level']!=0){\r\n\t\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t\t$istop = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$isgo = false;\r\n\t\t\t\t}\r\n\t\t\t\tif($isgo &&  $v['id']!=$res['id'] && $res['level']>$v['level'] ){\r\n\t\t\t\t\tif($parent['pid']){\r\n\t\t\t\t\t\tif($parent['level']>$v['level'] && $parent['pid']!=$v['pid']){\r\n\t\t\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t    \t$parent = $v;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t\t$parent = $v;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t$newarray2 = array_reverse($newarray);\r\n\t\t\t$positions='<a href=\"'.get_domain().'\">'.JZLANG('首页').'</a>';\r\n\t\t\tforeach($newarray2 as $v){\r\n\t\t\t\t$positions.='  &gt;  <a href=\"'.$v['url'].'\">'.$v['classname'].'</a>';\r\n\t\t\t}\r\n\t\t\t$this->positions_data = $newarray2;\r\n\t\t\t$this->positions = $positions;\r\n\t\t\tif(!$res['lists_html']){\r\n\t\t\t\t$lists_html = M('molds')->getField(['biaoshi'=>$this->type['molds']],'list_html');\r\n\t\t\t\t$res['lists_html'] = str_replace('.html','',$lists_html);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$this->display($this->template.'/'.$res['molds'].'/'.$res['lists_html']);\r\n\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\t\r\n\t\t\t//进入自定义页面\r\n\t\t\t/**\r\n\t\t\t\t规定自定义页面的文件名跟访问的URL名相同，存放在page文件夹下面\r\n\t\t\t\r\n\t\t\t**/\r\n\t\t\t//html\r\n\t\t\t$url = ($position!==FALSE) ? substr($request_url,0,$position) : $request_url;\r\n\t\t\t$url = substr($url,1,strlen($url)-1);\r\n\t\t\t$html = str_ireplace('.html','',$url);\r\n            if(defined('TPL_PATH')){\r\n                $path = TPL_PATH;\r\n            }else{\r\n                $path = APP_HOME;\r\n            }\r\n            $filepath = HOME_VIEW ? $path.'/'.HOME_VIEW.'/'.TEMPLATE.'/page/'.$html.File_TXT : $path.'/'.TEMPLATE.'/page/'.$html.File_TXT;\r\n            if(file_exists(APP_PATH.$filepath)){\r\n                $this->display($this->template.'/page/'.$html);\r\n                exit;\r\n            }\r\n            if(file_exists(str_replace(File_TXT,'.html',APP_PATH.$filepath))){\r\n                $this->display($this->template.'/page/'.$html);\r\n                exit;\r\n            }\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t//错误页面->404\r\n\t\t\t$this->error(JZLANG('输入url错误！'));\r\n\t\t\texit;\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\t\r\n\t}\r\n\t//自由定义链接\r\n\tfunction auto_url(){\r\n\t\t$html = $this->frparam('html',1);\r\n\t\t$molds = $this->frparam('molds',1);\r\n\t\t$id = $this->frparam('id');\r\n\t\t$tid = $this->frparam('tid');\r\n\t\t$isclass = true;\r\n\t\tif($id && $html){\r\n\t\t\t//详情页+html\r\n\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\tif(!$res){ $this->error(JZLANG('链接错误！'));}\r\n\t\t\t$isclass = false;\r\n\t\t}else if($id && $tid){\r\n\t\t\t//详情页\r\n\t\t\t$res = M('classtype')->find(array('id'=>$tid,'isclose'=>0));\r\n\t\t\tif(!$res){ $this->error(JZLANG('链接错误！'));}\r\n\t\t\t$isclass = false;\r\n\t\t}else if($tid){\r\n\t\t\t//栏目页\r\n\t\t\t$res = M('classtype')->find(array('id'=>$tid,'isclose'=>0));\r\n\t\t\tif(!$res){ $this->error(JZLANG('链接错误！'));}\r\n        }else if($molds && $id){\r\n            $tables = explode('|',$this->webconf['search_table']);\r\n            if(!in_array(strtolower($molds),$tables)){\r\n                $this->error('链接错误！');\r\n            }\r\n            //默认是详情页-非详情页另做处理\r\n            $this->id = $id;\r\n            $tid = M($molds)->getField(['id'=>$id],'tid');\r\n            if(!$tid){\r\n                $this->error('链接错误！');\r\n            }\r\n            $this->type = $this->classtypedata[$tid];\r\n            $this->jizhi_details($this->id);\r\n\r\n        }else{\r\n\t\t\t//html只有栏目页\r\n\t\t\t$res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0));\r\n\t\t\tif(!$res){ $this->error(JZLANG('链接错误！'));}\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t$res['url'] = $this->classtypedata[$res['id']]['url'];\r\n\t\t$this->type = $res;\r\n\t\t//检查授权\r\n\t\tif($res['gids']){\r\n\t\t\t$gids = explode(',',$res['gids']);\r\n\t\t\tif(!$this->islogin){\r\n\t\t\t\tRedirect(U('Login/index'));\r\n\t\t\t}else{\r\n\t\t\t\tif(!in_array($this->member['gid'],$gids)){\r\n\t\t\t\t\tError(JZLANG('对不起，您没有访问权限！'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif($isclass){\r\n\t\t\t\r\n\t\t\t$children = $this->classtypedata[$res['id']]['children']['ids'];\r\n\t\t\t$child = [];\r\n\t\t\tforeach($children as $v){\r\n\t\t\t\tif($this->classtypedata[$v]['gids']){\r\n\t\t\t\t\t$gids_n = explode(',',$this->classtypedata[$v]['gids']);\r\n\t\t\t\t\tif($this->islogin && in_array($this->member['gid'],$gids_n)){\r\n\t\t\t\t\t\t$child[]=$v;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$child[]=$v;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t$sql = ' isshow=1 ';\r\n\t\t\t$molds = $res['molds'];\r\n            if($this->webconf['schedule_table']){\r\n                $tables = explode('|',$this->webconf['schedule_table']);\r\n                if(in_array($molds,$tables)){\r\n                    $sql.= ' and addtime<='.time().' ';\r\n                }\r\n            }\r\n\t\t\t$sql .= ' and tid in ('.implode(',',$child).') ';\r\n\t\t\t$page = new Page($molds);\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t//手动设置分页条数\r\n\t\t\t$limit = $res['lists_num'];\r\n\t\t\tif($this->frparam('limit')){\r\n\t\t\t\t$limit = $this->frparam('limit');\r\n\t\t\t}\r\n\t\t\t$this->currentpage = $this->frpage;\r\n\t\t\t\r\n\t\t\t$data = $page->where($sql)->orderby('istop desc,orders desc,id desc')->limit($limit)->page($this->frpage)->go();\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t$pages = $page->pageList(5,'-');\r\n\t\t\t$this->pages = $pages;//组合分页\r\n\t\t\tforeach($data as $k=>$v){\r\n\t\t\t\tif(isset($v['htmlurl']) && !isset($v['url'])){\r\n\t\t\t\t\t$data[$k]['url'] = gourl($v,$v['htmlurl']);\r\n\t\t\t\t}\r\n                $data[$k]['class_name'] = $this->type['classname'];\r\n                $data[$k]['class_url'] = $this->type['url'];\r\n                $data[$k]['class_litpic'] = $this->type['litpic'];\r\n                $data[$k]['format_addtime'] = $v['addtime'] ? date('Y-m-d H:i:s',$v['addtime']) : '';\r\n\t\t\t}\r\n\t\t\t$this->lists = $data;//列表数据\r\n\t\t\t$this->sum = $page->sum;//总数据\r\n\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\r\n\t\t\t$this->prevpage = $page->prevpage;//上一页\r\n\t\t\t$this->nextpage = $page->nextpage;//下一页\r\n\t\t\t$this->allpage = $page->allpage;//总页数\r\n\t\t\t//清空screen筛选\r\n            if(isset($GLOBALS['Redis'])){\r\n                if($GLOBALS['Redis']->get('screen')){\r\n                    $GLOBALS['Redis']->setex('screen',0,'');\r\n                }\r\n            }else if(session_id()){\r\n                if(isset($_SESSION['screen'])){\r\n                    $_SESSION['screen'] = null;\r\n                }\r\n            }else{\r\n                if(isset($_COOKIE['screen'])){\r\n                    setcookie('screen','',-1,'/');\r\n                }\r\n            }\r\n\t\t\t$this->filters = [];\r\n\t\t\t\r\n\t\t\tif($this->frparam('ajax') && $this->webconf['isajax']){\r\n\t\t\t\t\r\n\t\t\t\tif($this->frparam('ajax_tpl')){\r\n\t\t\t\t\t$this->display($this->template.'/'.$res['molds'].'/ajax_list_'.$res['lists_html']);\r\n\t\t\t\t\texit;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$sql = [];\r\n\t\t\t\t//$sql[] = \" tids like '%,\".$res['id'].\",%' \"; \r\n\t\t\t\t$sql[] = \" molds = '\".$res['molds'].\"' and isshow=1 \";\r\n\t\t\t\t$sql[] = \" isajax=0 \";//查询出不允许访问的字段，进行限制\r\n\t\t\t\t$sql = implode(' and ',$sql);\r\n\t\t\t\t\r\n\t\t\t\t$fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\r\n\t\t\t\tif($fields_list){\r\n\t\t\t\t\t$noallow = [];\r\n\t\t\t\t\tforeach($fields_list as $v){\r\n\t\t\t\t\t\t$noallow[]=$v['field'];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$newdata = [];\r\n\t\t\t\t\tforeach($data as $v){\r\n\t\t\t\t\t\tforeach($v as $kk=>$vv){\r\n\t\t\t\t\t\t\tif(in_array($kk,$noallow)){\r\n\t\t\t\t\t\t\t\tunset($v[$kk]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$newdata[]=$v;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t$data = $newdata;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tJsonReturn(['code'=>0,'data'=>$data,'type'=>$res,'sum'=>$this->sum,'allpage'=>$this->allpage]);\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t//面包屑导航\r\n\t\t\t$classtypetree = array_reverse($this->classtypetree);\r\n\t\t\t$isgo = false;\r\n\t\t\t$newarray = [];\r\n\t\t\t$parent = [];//标记父类\r\n\t\t\t$istop = false;\r\n\t\t\tforeach($classtypetree as $k=>$v){\r\n\t\t\t\tif($v['id']==$res['id'] && !$isgo){\r\n\t\t\t\t\t$isgo = true;\r\n\t\t\t\t\t$res['level'] = $v['level'];\r\n\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t}\r\n\t\t\t\tif($v['id']==$res['id'] && $v['level']==0){\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif($v['level']==0 && $v['id']!=$res['id'] && $v['id']!=$res['pid']){\r\n\t\t\t\t\tif(!$istop && $isgo && $parent['level']!=0){\r\n\t\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t\t$istop = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$isgo = false;\r\n\t\t\t\t}\r\n\t\t\t\tif($isgo &&  $v['id']!=$res['id'] && $res['level']>$v['level'] ){\r\n\t\t\t\t\tif($parent['pid']){\r\n\t\t\t\t\t\tif($parent['level']>$v['level'] && $parent['pid']!=$v['pid']){\r\n\t\t\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t    \t$parent = $v;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t\t$parent = $v;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t$newarray2 = array_reverse($newarray);\r\n\t\t\t$positions='<a href=\"'.get_domain().'\">'.JZLANG('首页').'</a>';\r\n\t\t\tforeach($newarray2 as $v){\r\n\t\t\t\t$positions.='  &gt;  <a href=\"'.$v['url'].'\">'.$v['classname'].'</a>';\r\n\t\t\t}\r\n\t\t\t$this->positions_data = $newarray2;\r\n\t\t\t$this->positions = $positions;\r\n\t\t\t\r\n\t\t\tif(!$res['lists_html']){\r\n\t\t\t\t$lists_html = M('molds')->getField(['biaoshi'=>$this->type['molds']],'list_html');\r\n\t\t\t\t$res['lists_html'] = str_replace('.html','',$lists_html);\r\n\t\t\t}\r\n\t\t\t$this->display($this->template.'/'.$res['molds'].'/'.$res['lists_html']);\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\t\r\n\t\t\t//默认是详情页-非详情页另做处理\r\n\t\t\t$this->id = $id;\r\n\t\t\t$this->jizhi_details($this->id);\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t}\r\n\t\r\n\t//详情\r\n\tfunction jizhi_details($id){\r\n\t\t\r\n\t\tif(!$id){\r\n\t\t\t$this->error(JZLANG('缺少ID！'));\r\n\t\t}\r\n\t\tif(isset($_SESSION['admin']) && $_SESSION['admin']['id']!=0){\r\n\t\t\t$details = M($this->type['molds'])->find(array('id'=>$id,'tid'=>$this->type['id']));\r\n\t\t}else{\r\n\t\t\t$details = M($this->type['molds'])->find(array('id'=>$id,'isshow'=>1,'tid'=>$this->type['id']));\r\n\t\t}\r\n\t\t\r\n\t\tif(!$details){\r\n\t\t\t$this->error(JZLANG('未找到相应内容！'));\r\n\t\t\texit;\r\n\t\t}\r\n\t\tif(!isset($details['url'])){\r\n\t\t\t$details['url'] = gourl($details,$details['htmlurl']);\r\n\t\t}\r\n\t\tif(array_key_exists('body',$details)){\r\n\t\t\t$con = $details['body'];\r\n\t\t\t$chains = M('chain')->findAll(['isshow'=>1]);\r\n\t\t\tif($chains){\r\n\t\t\t\tforeach($chains as $v){\r\n\t\t\t\t\t$url = $v['url'];\r\n\t\t\t\t\t$num = $v['num'];\r\n\t\t\t\t\t$name = $v['title'];\r\n\t\t\t\t\t$newname = $v['newtitle']!='' ? $v['newtitle'] : $name;\r\n\t\t\t\t\tif($url!=''){\r\n\t\t\t\t\t\t$astr = \"<a href='\".$url.\"' target='_blank' title='\".$newname.\"'><strong>\".$newname.\"</strong></a>\";\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$astr = $newname;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t$con = preg_replace( '|(<img\\b[^>]*?)('.$name.')([^>]*?\\=)([^>]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3$4%&&&&&%$6', $con);\r\n\t\t\t\t\t$con = preg_replace( '|(<img\\b[^>]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3', $con);\r\n\t\t\t\t\t$con = preg_replace( '|(<a\\b[^>]*?)('.$name.')([^>]*?>)(<[^<]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3$4%&&&&&%$6', $con);\r\n\r\n\t\t\t\t\t$con = str_replace_limit($name, $astr, $con, $num);\r\n\t\t\t\t\t$con = str_replace('%&&&&&%', $newname, $con);\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$details['body'] = $con;\r\n\t\t\t\r\n\t\t}\r\n        \r\n        $details['class_name'] = $this->type['classname'];\r\n        $details['class_url'] = $this->type['url'];\r\n        $details['class_litpic'] = $this->type['litpic'];\r\n        $details['format_addtime'] = $details['addtime'] ? date('Y-m-d H:i:s',$details['addtime']) : '';\r\n\t\t$this->jz = $details;\r\n        $is_schedule = false;\r\n        if($this->webconf['schedule_table']){\r\n            $tables = explode('|',$this->webconf['schedule_table']);\r\n            if(in_array($this->type['molds'],$tables)){\r\n                $is_schedule = true;\r\n            }\r\n        }\r\n        if($is_schedule){\r\n            $aprev_sql = ' id<'.$id.' and isshow=1 and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).')  and addtime<='.time();\r\n            $anext_sql = ' id>'.$id.' and isshow=1 and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') and addtime<='.time();\r\n        }else{\r\n            $aprev_sql = ' id<'.$id.' and isshow=1 and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') ';\r\n            $anext_sql = ' id>'.$id.' and isshow=1 and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') ';\r\n        }\r\n\t\t$aprev = M($this->type['molds'])->find($aprev_sql,'id desc');\r\n\t\t$anext = M($this->type['molds'])->find($anext_sql,'id asc');\r\n\t\tif($aprev){\r\n\t\t\t$aprev['url'] = gourl($aprev,$aprev['htmlurl']);\r\n\t\t}\r\n\t\tif($anext){\r\n\t\t\t$anext['url'] = gourl($anext,$anext['htmlurl']);\r\n\t\t}\r\n\t\t$this->aprev = $aprev;\r\n\t\t$this->anext = $anext;\r\n\t\t\r\n\t\t//面包屑导航\r\n\t\t$classtypetree = array_reverse($this->classtypetree);\r\n\t\t$isgo = false;\r\n\t\t$newarray = [];\r\n\t\t$parent = [];//标记父类\r\n\t\t$istop = false;\r\n\t\tforeach($classtypetree as $k=>$v){\r\n\t\t\tif($v['id']==$this->type['id'] && !$isgo){\r\n\t\t\t\t$isgo = true;\r\n\t\t\t\t$this->type['level'] = $v['level'];\r\n\t\t\t\t$newarray[]=$v;\r\n\t\t\t}\r\n\t\t\tif($v['id']==$this->type['id'] && $v['level']==0){\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif($v['level']==0 && $v['id']!=$this->type['id'] && $v['id']!=$this->type['pid']){\r\n\t\t\t\tif(!$istop && $isgo && $parent['level']!=0){\r\n\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t$istop = true;\r\n\t\t\t\t}\r\n\t\t\t\t$isgo = false;\r\n\t\t\t}\r\n\t\t\tif($isgo &&  $v['id']!=$this->type['id'] && $this->type['level']>$v['level'] ){\r\n\t\t\t\tif($parent['pid']){\r\n\t\t\t\t\tif($parent['level']>$v['level'] && $parent['pid']!=$v['pid']){\r\n\t\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t\t$parent = $v;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t$parent = $v;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t$newarray2 = array_reverse($newarray);\r\n\t\t$positions='<a href=\"'.get_domain().'\">'.JZLANG('首页').'</a>';\r\n\t\tforeach($newarray2 as $v){\r\n\t\t\t$positions.='  &gt;  <a href=\"'.$v['url'].'\">'.$v['classname'].'</a>';\r\n\t\t}\r\n\t\t$this->positions_data = $newarray2;\r\n\t\t$this->positions = $positions;\r\n\t\t\r\n\t\tif($this->frparam('ajax') && $this->webconf['isajax'] ){\r\n\t\t\t\r\n\t\t\t$sql = [];\r\n\t\t\t$sql[] = \" tids like '%,\".$details['tid'].\",%' \"; \r\n\t\t\t$sql[] = \" molds = '\".$this->type['molds'].\"' and isshow=1 \";\r\n\t\t\t$sql[] = \" isajax=0 \";//查询出不允许访问的字段，进行限制\r\n\t\t\t$sql = implode(' and ',$sql);\r\n\t\t\t\r\n\t\t\t$fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\r\n\t\t\tif($fields_list){\r\n\t\t\t\t$noallow = [];\r\n\t\t\t\tforeach($fields_list as $v){\r\n\t\t\t\t\t$noallow[]=$v['field'];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tforeach($details as $kk=>$vv){\r\n\t\t\t\t\tif(in_array($kk,$noallow)){\r\n\t\t\t\t\t\tunset($details[$kk]);\r\n\t\t\t\t\t\tunset($aprev[$kk]);\r\n\t\t\t\t\t\tunset($anext[$kk]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tJsonReturn(['code'=>0,'jz'=>$details,'prev'=>$aprev,'next'=>$anext]);\r\n\t\t}\r\n\t\tif(!$this->type['details_html']){\r\n\t\t\t$details_html = M('molds')->getField(['biaoshi'=>$this->type['molds']],'details_html');\r\n\t\t\t$this->type['details_html'] = str_replace('.html','',$details_html);\r\n\t\t}\r\n\t\t$this->display($this->template.'/'.$this->type['molds'].'/'.$this->type['details_html']);\r\n\t\texit;\r\n\t}\r\n\t\r\n\t\r\n\t//搜索--单一模块搜索\r\n\tfunction search(){\r\n\t\t$tables = explode('|',$this->webconf['search_table']);\r\n\t\t$molds = strtolower($this->frparam('molds',6));//搜索的模块\r\n\t\t$tid = $this->frparam('tid',6);\r\n\t\tif(in_array($molds,$tables) && $molds!=''){\r\n\t\t\t$word = $this->frparam('word',6);\r\n\t\t\tif($word==''){\r\n\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\tJsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('请输入关键词搜索！')]);\r\n\t\t\t\t}\r\n\t\t\t\tError(JZLANG('请输入关键词搜索！'));\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t$this->word = $word;\r\n\t\t\t\r\n\t\t\tif(strpos($tid,',')!==false){\r\n\t\t\t\t$tid_arr = explode(',',$tid);\r\n\t\t\t\t$tids = [];\r\n\t\t\t\tforeach($tid_arr as $v){\r\n\t\t\t\t\t$tids[]=format_param($v,0);\r\n\t\t\t\t}\r\n\t\t\t\t$tid = implode(',',$tids);\r\n\t\t\t}else{\r\n\t\t\t\t$tid = format_param($tid,0);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$search_words = (isset($this->webconf['search_words'])&& $this->webconf['search_words']) ? explode('|',$this->webconf['search_words']) : ['title'];\r\n\t\t\t$sql = ' isshow=1 ';\r\n\t\t\t$sq = [];\r\n\t\t\tforeach($search_words as $v){\r\n\t\t\t\t$sq[]= \" \".$v.\" like '%\".$word.\"%' \";\r\n\t\t\t}\r\n\t\t\tif(count($sq)){\r\n\t\t\t\t$sql.=\" and (\".implode(' or ',$sq).\") \";\r\n\t\t\t}\r\n\t\t\tif($this->frparam('isall') && $tid){\r\n\t\t\t\t$sql.= ' and tid in ('.implode(',',$this->classtypedata[$tid]['children']['ids']).') ';\r\n\t\t\t}else if($tid){\r\n\t\t\t\t$sql.=' and tid in('.$tid.') ';\r\n\t\t\t}\r\n            if($this->webconf['schedule_table']){\r\n                $tables = explode('|',$this->webconf['schedule_table']);\r\n                if(in_array($molds,$tables)){\r\n                    $sql.=' and addtime<='.time().' ';\r\n                }\r\n            }\r\n\t\t\t$page = new Page($molds);\r\n\t\t\t$page->typeurl = 'search';\r\n\t\t\t$this->currentpage = $this->frparam('page',0,1);\r\n\t\t\t$data = $page->where($sql)->orderby('id desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go();\r\n\t\t\t$pages = $page->pageList(5,'&page=');\r\n\t\t\t\r\n\t\t\t$this->pages = $pages;//组合分页\r\n\t\t\t\r\n\t\t\tforeach($data as $k=>$v){\r\n\t\t\t\tif(isset($v['htmlurl']) && !isset($v['url'])){\r\n\t\t\t\t\t$data[$k]['url'] = gourl($v,$v['htmlurl']);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n                $data[$k]['class_name'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['classname'] : '';\r\n                $data[$k]['class_url'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['url'] : '';\r\n                $data[$k]['class_litpic'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['litpic'] : '';\r\n                $data[$k]['format_addtime'] = isset($v['addtime']) ? date('Y-m-d H:i:s',$v['addtime']) : '';\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$this->lists = $data;//列表数据\r\n\t\t\t$this->sum = $page->sum;//总数据\r\n\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\r\n\t\t\t$this->prevpage = $page->prevpage;//上一页\r\n\t\t\t$this->nextpage = $page->nextpage;//下一页\r\n\t\t\t$this->allpage = $page->allpage;//总页数\r\n\t\t\r\n\t\t\tif($this->frparam('ajax') && $this->webconf['isajax']){\r\n\t\t\t\tif($this->frparam('ajax_tpl')){\r\n\t\t\t\t\t$this->display($this->template.'/ajax_search_list');\r\n\t\t\t\t\texit;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$sql = [];\r\n\t\t\t\t$sql[] = \" molds = '\".$molds.\"' and isshow=1 \";\r\n\t\t\t\t$sql[] = \" isajax=0 \";//查询出不允许访问的字段，进行限制\r\n\t\t\t\t$sql = implode(' and ',$sql);\r\n\t\t\t\t$fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\r\n\t\t\t\tif($fields_list){\r\n\t\t\t\t\t$noallow = [];\r\n\t\t\t\t\tforeach($fields_list as $v){\r\n\t\t\t\t\t\t$noallow[]=$v['field'];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$newdata = [];\r\n\t\t\t\t\tforeach($data as $v){\r\n\t\t\t\t\t\tforeach($v as $kk=>$vv){\r\n\t\t\t\t\t\t\tif(in_array($kk,$noallow)){\r\n\t\t\t\t\t\t\t\tunset($v[$kk]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$newdata[]=$v;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t$data = $newdata;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tJsonReturn(['code'=>0,'data'=>$data,'lists'=>$page->listpage,'sum'=>$page->sum,'allpage'=>$page->allpage,'msg'=>'success']);\r\n\t\t\t}\r\n\t\t\tif(defined('TPL_PATH')){\r\n\t\t\t\t$path = TPL_PATH;\r\n\t\t\t}else{\r\n\t\t\t\t$path = APP_HOME;\r\n\t\t\t}\r\n\t\t\t$file = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.$this->template.'/'.strtolower($molds).'-search'.File_TXT);\r\n\r\n            if(file_exists($file)){\r\n                $this->display($this->template.'/'.strtolower($molds).'-search');\r\n                exit;\r\n            }\r\n            if(file_exists(str_replace(File_TXT,'.html',$file))){\r\n                $this->display($this->template.'/'.strtolower($molds).'-search');\r\n                exit;\r\n            }\r\n\r\n            $this->display($this->template.'/search');\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\tJsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('搜索超出设定范围！')]);\r\n\t\t\t}\r\n\t\t\tError(JZLANG('搜索超出设定范围！'));\r\n\t\t}\r\n\r\n\t}\r\n\t//多模块搜索\r\n\tfunction searchAll(){\r\n\t\t$tables = explode('|',$this->webconf['search_table_muti']);\r\n\t\t$molds = $this->frparam('molds',2);//搜索的模块\r\n\t\t$tid = $this->frparam('tid',6);\r\n\t\tif($molds && is_array($molds)){\r\n\t\t\t$allow_table = [];\r\n            $is_schedule = false;\r\n            $schedule_tables = [];\r\n            if($this->webconf['schedule_table']){\r\n                $schedule_tables = explode('|',$this->webconf['schedule_table']);\r\n                $is_schedule = true;\r\n\r\n            }\r\n\t\t\tforeach($molds as $v){\r\n\t\t\t\tif(in_array($v,$tables)){\r\n\t\t\t\t\t$allow_table[]=strtolower($v);\r\n                    if(!in_array($v,$schedule_tables)){\r\n                        $is_schedule = false;\r\n                    }\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(count($allow_table)==0){\r\n\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\tJsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('您的搜索超出设定范围！')]);\r\n\t\t\t\t}\r\n\t\t\t\tError(JZLANG('您的搜索超出设定范围！'));\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$word = $this->frparam('word',6);\r\n\t\t\tif($word==''){\r\n\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\tJsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('请输入关键词搜索！')]);\r\n\t\t\t\t}\r\n\t\t\t\tError(JZLANG('请输入关键词搜索！'));\r\n\t\t\t}\r\n\t\t\t$this->word = $word;\r\n\t\t\tif(strpos($tid,',')!==false){\r\n\t\t\t\t$tid_arr = explode(',',$tid);\r\n\t\t\t\t$tids = [];\r\n\t\t\t\tforeach($tid_arr as $v){\r\n\t\t\t\t\t$tids[]=format_param($v,0);\r\n\t\t\t\t}\r\n\t\t\t\t$tid = implode(',',$tids);\r\n\t\t\t}else{\r\n\t\t\t\t$tid = format_param($tid,0);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$search_words = (isset($this->webconf['search_words_muti'])&& $this->webconf['search_words_muti']) ? explode('|',$this->webconf['search_words_muti']) : ['title'];\r\n\t\t\t$sql = ' isshow=1 ';\r\n\t\t\t$sq = [];\r\n\t\t\tforeach($search_words as $v){\r\n\t\t\t\t$sq[]= \" \".$v.\" like '%\".$word.\"%' \";\r\n\t\t\t}\r\n\t\t\tif(count($sq)){\r\n\t\t\t\t$sql.=\" and (\".implode(' or ',$sq).\") \";\r\n\t\t\t}\r\n\t\t\tif($this->frparam('isall') && $tid){\r\n\t\t\t\t$sql.= ' and tid in ('.implode(',',$this->classtypedata[$tid]['children']['ids']).') ';\r\n\t\t\t}else if($tid){\r\n\t\t\t\t$sql.=' and tid in('.$tid.') ';\r\n\t\t\t}\r\n\t\t\t$sqlx = [];\r\n            if(stripos($this->webconf['search_fields_muti'],'addtime')!==false && $is_schedule){\r\n                $sql.=' and addtime<='.time().' ';\r\n            }\r\n\t\t\tforeach($allow_table as $v){\r\n\t\t\t\t$sqlx[] = ' select '.$this->webconf['search_fields_muti'].' from '.DB_PREFIX.$v.\" where \".$sql;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$sql = implode(' union all ',$sqlx);\r\n\t\t\t$page = new Page();\r\n\t\t\t$page->typeurl = 'search';\r\n\t\t\t$this->currentpage = $this->frpage;\r\n\t\t\t$data = $page->where($sql)->setPage(['limit'=>$this->frparam('limit',0,15)])->page($this->frpage)->goSql();\r\n\t\t\tforeach($data as $k=>$v){\r\n\t\t\t\t$data[$k]['url'] = gourl($v,$v['htmlurl']);\r\n                $data[$k]['class_name'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['classname'] : '';\r\n                $data[$k]['class_url'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['url'] : '';\r\n                $data[$k]['class_litpic'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['litpic'] : '';\r\n                $data[$k]['format_addtime'] = isset($v['addtime']) ? date('Y-m-d H:i:s',$v['addtime']) : '';\r\n\t\t\t}\r\n\t\t\t$pages = $page->pageList(5,'&page=');\r\n\t\t\t$this->pages = $pages;//组合分页\r\n\t\t\t$this->lists = $data;//列表数据\r\n\t\t\t$this->sum = $page->sum;//总数据\r\n\t\t\t$this->pagelist = $page->listpage;//分页数组-自定义分页可用\r\n\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\r\n\t\t\t$this->prevpage = $page->prevpage;//上一页\r\n\t\t\t$this->nextpage = $page->nextpage;//下一页\r\n\t\t\t$this->allpage = $page->allpage;//总页数\r\n\t\t\tif($this->frparam('ajax') && $this->webconf['isajax']){\r\n\t\t\t\tif($this->frparam('ajax_tpl')){\r\n\t\t\t\t\t$this->display($this->template.'/ajax_searchall_list');\r\n\t\t\t\t\texit;\r\n\t\t\t\t}\r\n\t\t\t\tJsonReturn(['code'=>0,'data'=>$data]);\r\n\t\t\t}\r\n\t\t\t$this->display($this->template.'/searchall');\r\n\t\t\t\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\tJsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('请输入关键词搜索！')]);\r\n\t\t\t}\r\n\t\t\tError(JZLANG('请输入关键词搜索！'));\r\n\t\t\t\r\n\t\t}\r\n\r\n\t}\r\n\t\r\n\r\n\t\r\n\t//错误页面\r\n\tfunction error($msg){\r\n\t\t$url = substr(REQUEST_URI,1);\r\n\t\t$position = strpos($url, '?');\r\n        $url = $position === false ? $url : substr($url, 0, $position);\r\n\t\t$r = M('customurl')->find(['url'=>$url]);\r\n\t\tif($r){\r\n\t\t\tif(isset($this->classtypedata[$r['tid']])){\r\n\t\t\t\t$this->type = $this->classtypedata[$r['tid']];\r\n\t\t\t\t$this->jizhi_details($r['aid']);\r\n\t\t\t}else if($r['molds']=='tags'){\r\n\t\t\t\t$param = [];\r\n\t\t\t\t$param['id'] = $r['aid'];\r\n\t\t\t\t$tags = new TagsController($param);\r\n\t\t\t\t$tags->index();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\texit;\r\n\t\t}\r\n\t\theader(\"HTTP/1.0 404\");\r\n\t\t$this->display($this->template.'/404');\r\n\t\texit;\r\n\t}\r\n\r\n\t\r\n\t//生成RSS\r\n\tfunction rss(){\r\n\t\t$item = '';\r\n\t\t\r\n\t\t//栏目item\r\n\t\tforeach($this->classtypedata as $v){\r\n\t\t\tif($v['isshow']==1){\r\n\t\t\t\t$item .= '<item>\r\n\t\t\t\t\t\t<title><![CDATA[ '.$v['classname'].' ]]></title>\r\n\t\t\t\t\t\t<link>'.$v['url'].'</link>\r\n\t\t\t\t\t\t<description><![CDATA[ '.$v['description'].' ]]></description>\r\n\r\n\t\t\t\t\t\t<source>'.$this->webconf['web_name'].'</source>\r\n\r\n\t\t\t\t\t\t<pubDate>'.date(\"D, d M Y H:i:s \", time()) . \"GMT\".'</pubDate> \r\n\t\t\t\t\t</item>';\r\n\t\t\t}\r\n\t\t}\r\n\t\t//文章item\r\n\t\t$article = M('article')->findAll(['isshow'=>1]);\r\n\t\tforeach($article as $v){\r\n\t\t\t$v['url'] = gourl($v);\r\n\t\t\t$item .= '<item>\r\n\t\t\t\t\t\t<title><![CDATA[ '.$v['title'].' ]]></title>\r\n\t\t\t\t\t\t<link>'.$v['url'].'</link>\r\n\t\t\t\t\t\t<description><![CDATA[ '.$v['description'].' ]]></description>\r\n\r\n\t\t\t\t\t\t<source>'.$this->webconf['web_name'].'</source>\r\n\r\n\t\t\t\t\t\t<pubDate>'.date(\"D, d M Y H:i:s \", time()) . \"GMT\".'</pubDate> \r\n\t\t\t\t\t</item>';\r\n\t\t}\r\n\t\t//商品item\r\n\t\t$product = M('product')->findAll(['isshow'=>1]);\r\n\t\tforeach($product as $v){\r\n\t\t\t$v['url'] = gourl($v);\r\n\t\t\t$item .= '<item>\r\n\t\t\t\t\t\t<title><![CDATA[ '.$v['title'].' ]]></title>\r\n\t\t\t\t\t\t<link>'.$v['url'].'</link>\r\n\t\t\t\t\t\t<description><![CDATA[ '.$v['description'].' ]]></description>\r\n\r\n\t\t\t\t\t\t<source>'.$this->webconf['web_name'].'</source>\r\n\r\n\t\t\t\t\t\t<pubDate>'.date(\"D, d M Y H:i:s \", time()) . \"GMT\".'</pubDate> \r\n\t\t\t\t\t</item>';\r\n\t\t}\r\n\t\t\r\n\t\t$xml = '<?xml version=\"1.0\" encoding=\"utf-8\"?>  \r\n\t\t\t\t<rss version=\"2.0\">\r\n\t\t\t\t<channel>\r\n\t\t\t\t\t<title>'.$this->webconf['web_name'].'</title>\r\n\t\t\t\t\t<description>'.$this->webconf['web_desc'].'</description>\r\n\t\t\t\t\t<link>'.get_domain().'</link>\r\n\t\t\t\t\t<generator>Rss Powered By jizhicms</generator>\r\n\t\t\t\t\t<image>\r\n\t\t\t\t\t\t<url>'.get_domain().'/'.$this->webconf['web_logo'].'</url>\r\n\t\t\t\t\t\t<title>'.$this->webconf['web_name'].'</title>\r\n\t\t\t\t\t\t<link>'.get_domain().'</link>\r\n\t\t\t\t\t</image>\r\n\t\t\t\t\t\r\n\t\t\t\t\t'.$item.'\r\n\r\n\t\t\t\t</channel>\r\n\r\n\t\t\t\t</rss>';\r\n\t\theader(\"Content-type:application/xml\");\r\n\t\techo $xml;\r\n\t}\r\n\t\r\n\r\n}"
  },
  {
    "path": "app/home/c/JzpayController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2021/01/01\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass JzpayController extends CommonController\n{\n\t/**\n\t\t\n\t\t极致平台支付接口\n\t\n\t**/\n\t\n\tpublic function _init(){\n\t\tparent::_init();\n\t}\n\t\n\t\n\t//检查是否支付\n\tprivate function checke_order($orderno=null){\n\t\t$w['orderno'] = $orderno;\n\t\t$w['mchid'] = $this->webconf['jizhi_mchid'];\n\t\t$api = $this->webconf['jizhi_pay_url'].'/Pay/query_order';\n\t\t$data = curl_http($api,$w);\n\t\t$res = json_decode($data,true);\n\t\tif($res['code']==0){\n\t\t\tif($res['data']['ispay']==1){\n\t\t\t\treturn true;\n\t\t\t}else{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}else{\n\t\t\treturn false;\n\t\t}\n\t\n\t}\n\t\n\t//同步跳转\n\tfunction return_pay(){\n\t\t//记录一下支付信息\n\t\t//register_log($_REQUEST,'return_pay_log');\n\t\t$orderno = $this->frparam('orderno',1);\n\t\t$ispay = $this->frparam('ispay');\n\t\t$checkpay = $this->checke_order($orderno);\n\t\tif($ispay==1 && $checkpay){\n\t\t\t$paytime = $this->frparam('paytime');\n\t\t\t$order = M('orders')->find(['orderno'=>$orderno]);\n\t\t\tif(!$order){\n\t\t\t\tError(JZLANG('支付成功，但是系统内没有找到相应的订单！').$orderno,get_domain());\n\t\t\t}\n\t\t\tif($order['ispay']==1){\n\t\t\t\t//跳转对应查询详情\n\t\t\t\t//Success('支付成功！',U('User/details',['id'=>$order['id']]));\n\t\t\t\t$this->overpay($order['orderno']);\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t$r = M('orders')->update(['orderno'=>$orderno],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]);\n\t\t\n\t\t\t//支付成功后处理...\n\t\t\t$this->overpay($order['orderno']);\n\t\t\texit;\n\t\t\t\t\n\t\t}else{\n\t\t\tError(JZLANG('支付失败'),get_domain());\n\t\t}\n\t}\n\t//异步跳转--只处理状态\n\tfunction notify_pay(){\n\t\t//记录一下支付信息\n\t\t//register_log($_REQUEST,'notify_pay_log');\n\t\t$orderno = $this->frparam('orderno',1);\n\t\t$ispay = $this->frparam('ispay');\n\t\t$checkpay = $this->checke_order($orderno);\n\t\tif($ispay==1 && $checkpay){\n\t\t\t$paytime = $this->frparam('paytime');\n\t\t\t$order = M('orders')->find(['orderno'=>$orderno]);\n\t\t\tif(!$order){\n\t\t\t\t//Error('支付成功，但是系统内没有找到相应的订单！No.'.$orderno);\n\t\t\t\t\n\t\t\t\texit;\n\t\t\t}\n\t\t\tif($order['ispay']==1){\n\t\t\t\t//跳转对应查询详情\n\t\t\t\t//Error('已支付成功，请勿重复操作！',U('User/details',['id'=>$order['id']]));\n\t\t\t\t\n\t\t\t\texit;\n\t\t\t}\n\t\t\t\n\t\t\t$r = M('orders')->update(['orderno'=>$orderno],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]);\n\t\t\tif($r){\n\t\t\t\t//同步跳转进行查询\n\t\t\t\t//Success('支付成功！',U('User/Verify',['id'=>$id]));\n\t\t\t\texit;\n\t\t\t}else{\n\t\t\t\t//Error('支付成功，更新系统订单状态失败！');\n\t\t\t\t\n\t\t\t\texit;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\tprivate function overpay($orderno){\n\t\t$orderno = $this->frparam('orderno',1);\n\t\t$order = M('orders')->find(['orderno'=>$orderno]);\n\t\tif($orderno && $order){\n\t\t\t\n\t\t\t$this->order = $order;\n\t\t\t$this->display($this->template.'/paytpl/overpay');\n\t\t}else{\n\t\t\texit(JZLANG('订单号错误！'));\n\t\t}\n\t\t\n\t}\n\n\t\n}"
  },
  {
    "path": "app/home/c/LoginController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/01-2019/02\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\n\n\nclass LoginController extends CommonController\n{\n\tfunction _init(){\n\t\t\n\t\tif(!M('molds')->find(['biaoshi'=>'member','isopen'=>1])){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('会员中心已关闭！'),'data'=>[]]);\n\t\t\t}\n\t\t\tError(JZLANG('会员中心已关闭！'));\n\t\t\texit;\n\t\t}\n\t\tparent::_init();\n\n    \n    }\n\t\n\tpublic function index(){\n\t\t//检测是否已经设置过return_url,防止多次登录覆盖\n\t\tif(!isset($_SESSION['return_url'])){\n\t\t\t$referer = (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER']=='') ? U('user/index') : $_SERVER['HTTP_REFERER'];\n\t\t\t$_SESSION['return_url'] = $referer;\n\t\t\n\t\t}\n\t\t\n\t\tif($_POST){\n\t\t\t$data['username'] = str_replace(\"'\",'',$this->frparam('tel',1));//进行二次过滤校验\n\t\t\t$data['password'] = str_replace(\"'\",'',$this->frparam('password',1));\n\t\t\tif(!isset($this->webconf['closehomevercode']) || $this->webconf['closehomevercode']!=1){\n\t\t\t\t$vercode = strtolower($this->frparam('vercode',1));\n                if(isset($GLOBALS['Redis'])){\n                    if($GLOBALS['Redis']->get('login_vercode') !=  md5(md5($vercode))){\n                        JsonReturn(array('code'=>1,'msg'=>JZLANG('验证码错误！'),'data'=>[]));\n                    }\n\n                }else{\n                    if(!$vercode || md5(md5($vercode))!=$_SESSION['login_vercode']){\n                        $xdata = array('code'=>1,'msg'=>JZLANG('验证码错误！'),'data'=>[]);\n                        if($this->frparam('ajax')){\n                            JsonReturn($xdata);\n                        }\n                        Error(JZLANG('验证码错误！'));\n                    }\n                }\n\n\t\t\t}\n\t\t\t$_SESSION['login_vercode'] = getRandChar(32);\n            if(isset($GLOBALS['Redis'])){\n                $GLOBALS['Redis']->del('login_vercode');\n            }\n\t\t\tif($data['username']=='' || $data['password']==''){\n\t\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('账户密码不能为空！'),'data'=>[]);\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn($xdata);\n\t\t\t\t}\n\t\t\t\tError(JZLANG('账户密码不能为空！'));\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$where['pass'] = md5($data['password'].$data['password']);\n\t\t\t$where['tel'] = $data['username'];\n\t\t\t$res = M('member')->find($where);\n\t\t\t//unset($where['tel']);\n\t\t\t//$where['username'] = $data['username'];\n\t\t\tunset($where['pass']);\n\t\t\t$where['token'] = $data['password'];//token登录\n\t\t\t$res1 =  M('member')->find($where);\n\t\t\t$where['email'] = $data['username'];\n\t\t\tunset($where['tel']);\n\t\t\tunset($where['token']);\n\t\t\t$where['pass'] = md5($data['password'].$data['password']);\n\t\t\t$res2 = M('member')->find($where);\n\n\t\t\t\n\t\t\tif($res || $res1 || $res2){\n\t\t\t\tif($res1){\n\t\t\t\t\t$res = $res1;\n\t\t\t\t}\n\t\t\t\tif($res2){\n\t\t\t\t\t$res = $res2;\n\t\t\t\t}\n\t\t\t\tunset($res['password']);\n\t\t\t\t//检测权限\n\t\t\t\tif($res['isshow']!=1){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('您的账户已被冻结！'),'url'=>$_SESSION['return_url'],'data'=>['url'=>$_SESSION['return_url']]]);\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('您的账户已被冻结！'));\n\t\t\t\t}\n\n\t\t\t\t$group = M('member_group')->find(array('id'=>$res['gid']));\n\t\t\t\tif(!$group){\n                    if($this->frparam('ajax')) {\n                        JsonReturn(['code' => 1, 'msg' => JZLANG('未找到您所在分组，请联系管理员处理！'), 'url' => $_SESSION['return_url'],'data'=>['url' => $_SESSION['return_url']]]);\n                    }\n                    Error(JZLANG('未找到您所在分组，请联系管理员处理！'));\n\t\t\t\t}\n\t\t\t\tunset($group['id']);\n\t\t\t\t//检测分组权限\n\t\t\t\tif($group['isagree']!=1){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('您所在的分组被限制登录！'),'url'=>$_SESSION['return_url'],'data'=>['url' => $_SESSION['return_url']]]);\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('您所在的分组被限制登录！'));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$_SESSION['member'] = array_merge($res,$group);\n\t\t\t\t//$_SESSION['member'] = $res;\n\t\t\t\t$update['logintime'] = time();\n                //是否记住密码登录,更新token\n\t\t\t\tif($this->frparam('isremember')){\n\t\t\t\t\t$update['token'] = $_SESSION['token'];\n\t\t\t\t}\n               \n                //检查是否开启登录奖励\n                if($this->webconf['login_award_open']==1){\n                \t$awoard = floatval($this->webconf['login_award']);\n                \tif($awoard>0){\n                \t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n                \t\t$sql = \" msg = '\".JZLANG('登录奖励').\"' and addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$_SESSION['member']['id'];\n                \t\tif(!M('buylog')->find($sql)){\n                \t\t\t$w['userid'] = $_SESSION['member']['id'];\n                \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('登录奖励');\n\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t   \t  \t\t$w['amount'] = $awoard;\n\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t   \t  \t\tif($r){\n\t\t\t\t   \t  \t\t\t$update['jifen'] = $_SESSION['member']['jifen']+$awoard;\n\t\t\t\t   \t  \t\t\t$_SESSION['member']['jifen'] = $update['jifen'];\n\t\t\t\t   \t  \t\t}\n                \t\t}\n                \t}\n                }\n                M('member')->update(array('id'=>$res['id']),$update);\n\t\t\t\t//兼容ajax登录\n\t\t\t\tif($this->frparam('ajax')){\n\n                    if(isset($GLOBALS['Redis'])){\n\n                        $token = getRandChar(32);\n                        $GLOBALS['Redis']->setex($token,7 * 86400,json_encode($_SESSION['member'],JSON_UNESCAPED_UNICODE));\n                        JsonReturn(['code'=>0,'msg'=>JZLANG('登录成功！'),'data'=>['token'=>$token,'url'=>$_SESSION['return_url']]]);\n                    }\n\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('登录成功！'),'url'=>$_SESSION['return_url'],'data'=>['url'=>$_SESSION['return_url']]]);\n\t\t\t\t}\n\t\t\t\tRedirect($_SESSION['return_url']);\n\t\t\t}else{\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('账户密码错误！'),'url'=>$_SESSION['return_url'],'data'=>['url'=>$_SESSION['return_url']]]);\n\t\t\t\t}\n\t\t\t\tError(JZLANG('账户密码错误！'));\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\t$token = getRandChar(32);//系统内置32位随机数,混淆前台规则猜测(MD5)\n\t\t$_SESSION['token'] = $token;\n\t\t$this->token = $token;\n     \n      \n\t\t$this->display($this->template.'/user/login');\n\t}\n\n  function register(){\n\t  if($this->webconf['isregister']==0){\n\t\t  Error(JZLANG('系统已关闭会员注册！'));\n\t  }\n\t  $_SESSION['return_url'] = U('user/index');\n\t  if($_POST){\n\t\t  //检查邀请链接的合法性\n\t\t  if($this->webconf['onlyinvite']==1){\n\t\t\t  if(!M('member')->find(['id'=>$this->frparam('pid'),'isshow'=>1])){\n\t\t\t\t    $xdata = array('code'=>1,'msg'=>JZLANG('您的邀请链接不合法！'),'data'=>[]);\n\t\t\t\t    if($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn($xdata);\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('您的邀请链接不合法！'));\n\t\t\t  }\n\t\t\t\n\t\t  }\n\t\t  if(!isset($this->webconf['closehomevercode']) || $this->webconf['closehomevercode']!=1){\n\t\t\t    $vercode = strtolower($this->frparam('vercode',1));\n              if(isset($GLOBALS['Redis'])){\n                  if($GLOBALS['Redis']->get('reg_vercode')!=md5(md5($vercode))){\n                      JsonReturn(['code'=>1,'msg'=>JZLANG('验证码错误！'),'data'=>[]]);\n                  }\n\n              }else{\n                  if(!$vercode || md5(md5($vercode))!=$_SESSION['reg_vercode']){\n                      $xdata = array('code'=>1,'msg'=>JZLANG('验证码错误！'),'data'=>[]);\n                      if($this->frparam('ajax')){\n                          JsonReturn($xdata);\n                      }\n                      Error(JZLANG('验证码错误！'));\n                  }\n              }\n\n\t\t  }\n          $_SESSION['reg_vercode'] = getRandChar(32);\n          if(isset($GLOBALS['Redis'])){\n              $GLOBALS['Redis']->del('reg_vercode');\n          }\n\t\t  $w['email'] = $this->frparam('email',1,'');\n\t\t  $w['password'] = $this->frparam('password',1);\n\t\t  $w['repassword'] = $this->frparam('repassword',1);\n\t\t  $w['tel'] = $this->frparam('tel',1);\n\t\t  if($w['password']=='' || $w['tel']==''){\n\t\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('账户密码不能为空！'),'data'=>[]);\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn($xdata);\n\t\t\t\t}\n\t\t\t\tError(JZLANG('账户密码不能为空！'));\n\t\t  }\n\t\t  if($w['password']!=$w['repassword']){\n\t\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('两次密码不同！'),'data'=>[]);\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn($xdata);\n\t\t\t\t}\n\t\t\t\tError(JZLANG('两次密码不同！'));\n\t\t  }\n          if($w['tel']){\n              if (preg_match(\"/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[0-9])\\\\d{8}$/\", $w['tel'])) {\n              }else {\n                  if ($this->frparam('ajax')) {\n                      JsonReturn(['code' => 1, 'msg' => JZLANG('手机号格式不正确！'),'data'=>[]]);\n                  }\n                  Error(JZLANG('手机号格式不正确！'));\n              }\n          }\n\t\t$w['regtime'] = time();\n\t\t//检查邮箱\n\t\tif($w['email']){\n\t\t\tif(M('member')->find(['email'=>$w['email']])){\n\t\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('您的邮箱已注册！'),'data'=>[]);\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn($xdata);\n\t\t\t\t}\n\t\t\t\tError(JZLANG('您的邮箱已注册！'));\n\t\t\t}\n\t\t}\n\t\t//检查是否已被注册\n\t\tif(M('member')->find(['tel'=>$w['tel']])){\n\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('您的手机号码已注册！'),'data'=>[]);\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn($xdata);\n\t\t\t}\n\t\t\tError(JZLANG('您的手机号码已注册！'));\n\t\t}\n\t\t$w['username'] = getRandChar(6);\n\t\t$w['pass'] =  md5(md5($w['password']).md5($w['password']));\n\t\t$w['pid'] = $_SESSION['invite'];\n\t\t$r = M('member')->add($w);\n\t\tif($r){\n\t\t\t$userid = $r;\n\t\t\t//检查是否开启邀请奖励\n\t\t\tif($this->webconf['invite_award_open']==1 && $w['pid'] && $this->webconf['invite_award']){\n\t\t\t\t$ww['userid'] = $w['pid'];\n\t\t\t\t$ww['buytype'] = $this->webconf['invite_type'];\n\t\t\t\t$ww['type'] = 3;\n\t\t\t\t$ww['msg'] = JZLANG('邀请奖励');\n\t\t\t\t$ww['addtime'] = time();\n\t\t\t\t$ww['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t$ww['amount'] = $this->webconf['invite_award'];\n\t\t\t\tif($ww['buytype']=='jifen'){\n\t\t\t\t\t$ww['money'] = $ww['amount']/($this->webconf['jifen_exchange']);\n\t\t\t\t}else{\n\t\t\t\t\t$ww['money'] = $ww['amount']/($this->webconf['money_exchange']);\n\t\t\t\t}\n\t\t\t\tM('member')->goInc(['id'=>$w['pid']],$ww['buytype'],$ww['amount']);\n\t\t\t\tM('buylog')->add($ww);\n\t\t\t}\n\t\t\t//自动登录\n\t\t\tif($this->frparam('autologin')){\n\t\t\t\t$member = M('member')->find(['id'=>$userid]);\n\t\t\t\t$member_group = M('member_group')->find(['id'=>$member['gid']]);\n\t\t\t\tif($member_group['isagree']!=1){\n\t\t\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('注册成功，等待审核！'),'url'=>U('login/index'));\n\t\t\t\t}else{\n\t\t\t\t\tunset($member['pass']);\n\t\t\t\t\tunset($member_group['id']);\n\t\t\t\t\t$_SESSION['member'] = array_merge($member,$member_group);\n                    if(isset($GLOBALS['Redis'])){\n                        $token = getRandChar(32);\n                        $GLOBALS['Redis']->setex($token,7 * 86400,json_encode($_SESSION['member'],JSON_UNESCAPED_UNICODE));\n                        JsonReturn(['code'=>0,'msg'=>'注册成功！','data'=>['token'=>$token,'url'=>U('user/index')]]);\n                    }\n\t\t\t\t\t$xdata = array('code'=>0,'msg'=>JZLANG('注册成功！'),'data'=>['url'=>U('user/index')],'url'=>U('user/index'));\n\t\t\t\t}\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn($xdata);\n\t\t\t\t}\n\t\t\t\tSuccess($xdata['msg'],$xdata['url']);\n\t\t\t\t\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$xdata = array('code'=>0,'msg'=>JZLANG('注册成功！'),'data'=>['url'=>U('login/index')],'url'=>U('login/index'));\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn($xdata);\n\t\t\t\t}\n\t\t\t\tSuccess(JZLANG('注册成功！'),U('login/index'));\n\t\t\t}\n\t\t\t\n\t\t}else{\n\t\t\t$xdata = array('code'=>1,'msg'=>JZLANG('注册失败，请重试~'),'data'=>[]);\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn($xdata);\n\t\t\t}\n\t\t\tError(JZLANG('注册失败，请重试~'));\n\t\t}\n\t\t  \n\t  }\n\t  $invite = $this->frparam('invite',0,0);\n\t  if(!$invite){\n\t\t  if($this->webconf['onlyinvite']==1){\n\t\t\t  Error(JZLANG('必须通过邀请链接进行注册！'));\n\t\t  }\n\t\t  \n\t  }else{\n\t\t  //检查邀请链接的合法性\n\t\t  if(!M('member')->find(['id'=>$invite,'isshow'=>1])){\n\t\t\t  if($this->webconf['onlyinvite']==1){\n\t\t\t\t  Error(JZLANG('您的邀请链接不合法！'));\n\t\t\t  }\n\t\t\t  $invite = 0;\n\t\t  }\n\t  }\n\t  $_SESSION['invite'] = $invite;\n\t  $this->invite = $invite;\n\t  $this->display($this->template.'/user/register');\n  }\n  \n  function forget(){\n\t  if($_POST && !isset($_POST['reset'])){\n\t\t\n\t\t  $email = $this->frparam('email',1);\n\t\t  $vercode = strtolower($this->frparam('vercode',1));\n\t\t  if(!$email){\n\t\t\t  Error(JZLANG('请输入账号和邮箱！'));\n\t\t  }\n\t\t  if($_SESSION['forget_code']!=md5(md5($vercode))){\n\t\t\t  Error(JZLANG('图形验证码错误！'));\n\t\t  }\n\t\t  $user = M('member')->find(['email'=>$email]);\n\t\t  if($user){\n\t\t\t  //生成随机秘钥\n\t\t\t  $w['logintime'] = time();\n\t\t\t  $w['token'] = getRandChar(32);\n\t\t\t  M('member')->update(['id'=>$user['id']],$w);\n\t\t\t  //发送邮件\n\t\t\t  if($this->webconf['email_server'] && $this->webconf['email_port'] &&  $this->webconf['send_email'] &&  $this->webconf['send_pass']){\n\t\t\t\t$title = JZLANG('找回密码').'-'.$this->webconf['web_name'];\n\t\t\t\t$url = U('login/forget').'?token='.$w['token'].'&email='.$email;\n\t\t\t\t$body = JZLANG('您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击').'<a href=\"'.$url.'\" target=\"_blank\">['.JZLANG('立即找回密码').']</a>，'.JZLANG('过期失效！');\n\t\t\t\t\n\t\t\t\tsend_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$user['email'],$title,$body);\n\t\t\t\tif(!isset($_SESSION['forget_time'])){\n\t\t\t\t\t$_SESSION['forget_time'] = time();\n\t\t\t\t\t$_SESSION['forget_num'] = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(($_SESSION['forget_time']+10*60)<time()){\n\t\t\t\t\t$_SESSION['forget_num'] = 0;\n\t\t\t\t\t$_SESSION['forget_time'] = time();\n\t\t\t\t}\n\t\t\t\t$_SESSION['forget_num']++;\n\t\t\t\tif($_SESSION['forget_num']>5 && ($_SESSION['forget_time']+10*60)>time()){\n\t\t\t\t\t//$this->error('您操作过于频繁，请10分钟后再尝试！');\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('您操作过于频繁，请10分钟后再尝试！'),'data'=>[]]);\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('您操作过于频繁，请10分钟后再尝试！'));\n\t\t\t\t}\n\n\t\t\t\tSuccess(JZLANG('找回密码邮件已发送，请到您的邮箱查看！'),get_domain());\n\t\t\t\t \n\t\t\t\t\n\t\t\t }else{\n\t\t\t\t Error(JZLANG('邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！'));\n\t\t\t }\n\t\t\t  \n\t\t  }else{\n\t\t\t   Error(JZLANG('输入的信息有误！'));\n\t\t  }\n\t  }\n\t  if(!isset($_POST['reset']) && $this->frparam('token',1) && $this->frparam('email',1)){\n\t\t  //检查token是否正确\n\t\t  if($this->frparam('token',1)!='' && $this->frparam('email',1)!=''){\n\t\t\t  $user = M('member')->find(['token'=>$this->frparam('token',1),'email'=>$this->frparam('email',1)]);\n\t\t\t  if($user){\n\t\t\t\t  //检查是否已过期\n\t\t\t\t  $t = (time()-$user['logintime'])/60;\n\t\t\t\t  if($t>10){\n\t\t\t\t\t  Error(JZLANG('token已失效！'),U('login/forget'));\n\t\t\t\t  }\n\t\t\t\t  $this->user = $user;\n\t\t\t\t  $this->display($this->template.'/user/reset_password');\n\t\t\t\t  exit;\n\t\t\t  }\n\t\t  }\n\t\t  \n\t  }\n\t  \n\t  if($_POST && isset($_POST['reset'])){\n\t\t  $w['token'] = $this->frparam('reset',1);\n\t\t  $w['username'] = $this->frparam('username',1);\n\t\t  $pass = $this->frparam('password',1);\n\t\t  if($w['token']!='' && $w['username']!='' && $pass!=''){\n\t\t\t $user = M('member')->find($w);\n\t\t\t if(!$user){\n\t\t\t\t Error(JZLANG('参数错误！'),U('login/forget'));\n\t\t\t }\n\t\t\t $pass = md5(md5($pass).md5($pass));\n\t\t\t if(M('member')->update(['id'=>$user['id']],['pass'=>$pass])){\n\t\t\t\t Success(JZLANG('密码重置成功,请重新登录！'),get_domain());\n\t\t\t\t \n\t\t\t }else{\n\t\t\t\t Error(JZLANG('新密码不能与旧密码相同！'));\n\t\t\t }\n\t\t\t  \n\t\t  }\n\t\t  \n \t  }\n\t  \n\t  $this->display($this->template.'/user/forget');\n  }\n\n  function mforget(){\n\n        $params = $this->frparam();\n        if(!$params){\n            JsonReturn(['code'=>1,'msg'=>'数据异常','data'=>[]]);\n        }\n        $account = format_param($params['account'],6);\n        $vercode = format_param($params['vercode'],6);\n        if(!$account){\n            JsonReturn(['code'=>1,'msg'=>JZLANG('请输入账号/邮箱！'),'data'=>[]]);\n        }\n        $type = (int)$params['type'];\n        switch ($type){\n            //发生认证码\n            case 1:\n\n                $forget_code = $GLOBALS['Redis']->get('forget_code');\n                if(!$forget_code || $forget_code!=md5(md5($vercode))){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('图形验证码错误！'),'data'=>[]]);\n                }\n                $GLOBALS['Redis']->del('forget_code');\n                if(stripos($account,'@')!==false){\n                    //邮箱\n                    $user = M('member')->find(['email'=>$account]);\n                    if($user){\n                        //检查是否发送通知，通知是否过期\n                        if($user['ishassend']){\n                            $t = time() - $user['hassendtime'];\n                            if($t<600){\n                                JsonReturn(['code'=>1,'msg'=>JZLANG('邮箱已发送，请10分钟后再发送！'),'data'=>[]]);\n                            }\n                        }\n\n                        //生成随机秘钥\n                        $w['hassendtime'] = time();\n                        $w['ishassend'] = 1;\n                        $w['token'] = mt_rand(100000,999999);\n                        M('member')->update(['id'=>$user['id']],$w);\n                        //发送邮件\n                        if($this->webconf['email_server'] && $this->webconf['email_port'] &&  $this->webconf['send_email'] &&  $this->webconf['send_pass']){\n                            $title = JZLANG('找回密码').'-'.$this->webconf['web_name'];\n                            //$url = U('login/forget').'?token='.$w['token'].'&email='.$email;\n                            $body = JZLANG('您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内输入认证码：').'<strong>'.$w['token'].'</strong>';\n\n                            send_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$user['email'],$title,$body);\n\n                            JsonReturn(['code'=>0,'msg'=>JZLANG('认证码已发送，请到您的邮箱查看！'),'data'=>[]]);\n\n                        }else{\n                            JsonReturn(['code'=>1,'msg'=>JZLANG('邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！'),'data'=>[]]);\n                        }\n\n                    }else{\n                        JsonReturn(['code'=>1,'msg'=>JZLANG('用户未找到！'),'data'=>[]]);\n                    }\n                }else{\n                    //手机短信\n                    $account = intval($account);\n                    if(strlen($account)==11){\n                        //邮箱\n                        $user = M('member')->find(['tel'=>$account]);\n                        if(!$user){\n                            JsonReturn(['code'=>1,'msg'=>JZLANG('用户未找到！'),'data'=>[]]);\n                        }\n                        JsonReturn(['code'=>0,'msg'=>JZLANG('短信已发送成功！'),'data'=>[]]);\n                    }else{\n                        JsonReturn(['code'=>1,'msg'=>JZLANG('手机号格式错误！'),'data'=>[]]);\n                    }\n\n                }\n\n                break;\n            case 2:\n                $token = intval($params['code']);\n                if(!$token){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('认证码不能为空！'),'data'=>[]]);\n                }\n                if(stripos($account,'@')!==false){\n                    //邮箱\n                    $user = M('member')->find(['email'=>$account,'token'=>$token]);\n\n                }else{\n                    $account = intval($account);\n                    if(strlen($account)==11){\n                        //邮箱\n                        $user = M('member')->find(['tel'=>$account,'token'=>$token]);\n\n                    }else{\n                        JsonReturn(['code'=>1,'msg'=>JZLANG('手机号格式错误！'),'data'=>[]]);\n                    }\n\n                }\n\n                if(!$user){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('认证码错误！'),'data'=>[]]);\n                }\n                $t = time() - $user['hassendtime'];\n                if($t>600){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('认证码过期，请重新获取认证码！'),'data'=>[]]);\n                }\n                $token = getRandChar(32);\n                M('member')->update(['id'=>$user['id']],['token'=>$token]);\n\n                JsonReturn(['code'=>0,'msg'=>'success','data'=>['token'=>$token]]);\n\n\n\n\n                break;\n            case 3:\n                $token = format_param($params['token'],6);\n                if(!$token){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('非法操作！'),'data'=>[]]);\n                }\n                $pass = format_param($params['pass'],6);\n                $repass = format_param($params['repass'],6);\n                if($pass!=$repass){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('两次密码不同！'),'data'=>[]]);\n                }\n                $forget_code = $GLOBALS['Redis']->get('forget_code');\n                if(!$forget_code || $forget_code!=md5(md5($vercode))){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('图形验证码错误！'),'data'=>[]]);\n                }\n                if(stripos($account,'@')!==false){\n                    $user = M('member')->find(['token'=>$token,'email'=>$account]);\n                }else{\n                    $account = intval($account);\n                    $user = M('member')->find(['token'=>$token,'tel'=>$account]);\n                }\n\n                if(!$user){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('非法操作！'),'data'=>[]]);\n                }\n                $pass = md5(md5($pass).md5($pass));\n                M('member')->update(['id'=>$user['id']],['pass'=>$pass]);\n                JsonReturn(['code'=>0,'msg'=>JZLANG('重置密码成功！'),'data'=>[]]);\n\n                break;\n        }\n\n\n\n\n\n\n    }\n  function nologin(){\n  \t\tif($this->islogin){\n  \t\t\tRedirect(U('user/index'));\n  \t\t}\n  \t\t$this->display($this->template.'/user/nologin');\n  }\n  \n  function loginout(){\n  \t  $_SESSION['member'] = null;\n\t  $_SESSION['return_url'] = null;\n      if($this->frparam('ajax')){\n\n          if($this->frparam('token',1) && isset($GLOBALS['Redis'])){\n              $GLOBALS['Redis']->del($this->frparam('token',1));\n          }\n\n          JsonReturn(['code'=>0,'msg'=>JZLANG('安全退出~'),'data'=>[]]);\n      }\n      Error(JZLANG('安全退出~'),get_domain());\n  }\n  \n}\n\n\n\n\n"
  },
  {
    "path": "app/home/c/MessageController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/08\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass MessageController extends CommonController\n{\n\n    function index(){\n\n        if($_POST){\n\n            $w = $this->frparam();\n            $w = get_fields_data($w,'message',0);\n\n            $w['body'] = $this->frparam('body',6,'','POST');\n            $w['user'] = $this->frparam('user',6,'','POST');\n            $w['tel'] = $this->frparam('tel',6,'','POST');\n            $w['aid'] = $this->frparam('aid',0,0,'POST');\n            $w['tid'] = $this->frparam('tid',0,0,'POST');\n            $w['email'] = $this->frparam('email',6,'','POST');\n            $w['orders'] = 0;\n            $w['istop'] = 0;\n            $w['hits'] = 0;\n\n            if($this->webconf['autocheckmessage']==1){\n                $w['isshow'] = 1;\n            }else{\n                $w['isshow'] = 0;\n            }\n            if(!isset($this->webconf['messageyzm']) || $this->webconf['messageyzm']){\n                $vercode = strtolower($this->frparam('vercode',1));\n                if(isset($GLOBALS['Redis']) && $GLOBALS['Redis']->get('message_vercode')!=md5(md5($vercode))){\n                    JsonReturn(array('code'=>1,'msg'=>JZLANG('验证码错误！')));\n                }else{\n                    if (!session_id()) {\n                        if(!$vercode || md5(md5($vercode))!=$_COOKIE['message_vercode']){\n                            $xdata = array('code'=>1,'msg'=>JZLANG('验证码错误！').$_COOKIE['message_vercode']);\n                            if($this->frparam('ajax')){\n                                JsonReturn($xdata);\n                            }\n                            Error(JZLANG('验证码错误！').$_COOKIE['message_vercode']);\n                        }\n                        $message_vercode = getRandChar(30);\n                        $_COOKIE['message_vercode'] = $message_vercode;\n                    }else{\n\n                        if(!$vercode || md5(md5($vercode))!=$_SESSION['message_vercode']){\n                            $xdata = array('code'=>1,'msg'=>JZLANG('验证码错误！'));\n                            if($this->frparam('ajax')){\n                                JsonReturn($xdata);\n                            }\n                            Error(JZLANG('验证码错误！'));\n                        }\n                        $_SESSION['message_vercode'] = getRandChar(30);\n                    }\n\n                }\n\n                if(isset($GLOBALS['Redis'])){\n                    $GLOBALS['Redis']->del('message_vercode');\n                }\n\n\n            }\n\n\n            $w['ip'] = GetIP();\n            $w['addtime'] = time();\n            if(isset($_SESSION['member'])){\n                $w['userid'] = $_SESSION['member']['id'];\n            }else if(isset($GLOBALS['Redis']) && $this->frparam('token',1)){\n                $m = $GLOBALS['Redis']->get($this->frparam('token',1));\n                if($m){\n                    $member = json_decode($m,true);\n                    $w['userid'] = $member['id'];\n                }else{\n                    $w['userid'] = 0;\n                }\n            }else{\n                $w['userid'] = 0;\n            }\n\n            if($this->frparam('title',6,'','POST')==''){\n                //$this->error('标题不能为空！');\n                if($this->frparam('ajax')){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('标题不能为空！')]);\n                }\n                Error(JZLANG('标题不能为空！'));\n            }\n            if($w['user']==''){\n                //$this->error('姓名不能为空！');\n                if($this->frparam('ajax')){\n                    JsonReturn(['code'=>1,'msg'=>'称呼不能为空！']);\n                }\n                Error(JZLANG('称呼不能为空！'));\n            }\n\n\n            $w['title'] = $this->frparam('title',6);\n            //仅在存在手机号的情况进行检测手机号是否有效-可自由设置\n            if($w['tel']){\n                if(!preg_match(\"/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[1-9])\\\\d{8}$/\",$w['tel'])){\n                    //$this->error('您的手机号格式不正确！');\n                    if($this->frparam('ajax')){\n                        JsonReturn(['code'=>1,'msg'=>JZLANG('您的手机号格式不正确！')]);\n                    }\n                    Error(JZLANG('您的手机号格式不正确！'));\n                }\n\n            }\n            // 不为空检测\n            $sql = \" molds='message' and isshow=1 \";\n            $fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\n            if($fields_list){\n                foreach($fields_list as $v){\n                    if($v['ismust']==1){\n                        if($w[$v['field']]==''){\n                            if(in_array($v['fieldtype'],array(6,10))){\n                                if($w[$v['field'].'_urls']==''){\n\n                                    if($this->frparam('ajax')){\n                                        JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空！')]);\n                                    }else{\n                                        Error($v['fieldname'].JZLANG('不能为空！'));\n                                    }\n                                }\n                            }else{\n                                if($this->frparam('ajax')){\n                                    JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空！')]);\n                                }else{\n                                    Error($v['fieldname'].JZLANG('不能为空！'));\n                                }\n                            }\n\n                        }\n                    }\n                }\n            }\n\n            if(isset($GLOBALS['Redis'])){\n                $message_time = $GLOBALS['Redis']->get('message_time');\n                $message_num = $GLOBALS['Redis']->get('message_num');\n                if(!$message_time){\n                    $message_time = time();\n                    $message_num = 0;\n                }\n                if(($message_time+10*60)<time()){\n\n                    $GLOBALS['Redis']->setex('message_time', 10 * 60, time());\n                }\n                $message_num += 1;\n                $GLOBALS['Redis']->setex('message_num', 10 * 60, $message_num);\n                if($message_num>5 && ($message_time+10*60)>=time()){\n                    if($this->frparam('ajax')){\n                        JsonReturn(['code'=>0,'msg'=>JZLANG('您操作过于频繁，请10分钟后再尝试！')]);\n                    }\n                    Error(JZLANG('您操作过于频繁，请10分钟后再尝试！'));\n                }\n            }else if(session_id()){\n                if(!isset($_SESSION['message_time'])){\n                    $_SESSION['message_time'] = time();\n                    $_SESSION['message_num'] = 0;\n                }\n\n                if(($_SESSION['message_time']+10*60)<time()){\n                    $_SESSION['message_num'] = 0;\n                    $_SESSION['message_time'] = time();\n                }\n                $_SESSION['message_num']+=1;\n                if($_SESSION['message_num']>5 && ($_SESSION['message_time']+10*60)>=time()){\n                    if($this->frparam('ajax')){\n                        JsonReturn(['code'=>0,'msg'=>JZLANG('您操作过于频繁，请10分钟后再尝试！')]);\n                    }\n                    Error(JZLANG('您操作过于频繁，请10分钟后再尝试！'));\n                }\n            }else{\n                if(!isset($_COOKIE['message_time'])){\n                    setcookie('message_time',time(),time()+5 * 60,'/');\n                    setcookie('message_num',0,time()+5 * 60,'/');\n                }\n\n                if(($_COOKIE['message_time']+10*60)<time()){\n                    setcookie('message_time',time(),time()+5 * 60,'/');\n                    setcookie('message_num',0,time()+5 * 60,'/');\n                }\n                $message_num = $_COOKIE['message_num'];\n                setcookie('message_num',$message_num+1,time() + 5 * 60,'/');\n                if($_COOKIE['message_num']>5 && ($_COOKIE['message_time']+10*60)>=time()){\n                    if($this->frparam('ajax')){\n                        JsonReturn(['code'=>0,'msg'=>JZLANG('您操作过于频繁，请10分钟后再尝试！')]);\n                    }\n                    Error(JZLANG('您操作过于频繁，请10分钟后再尝试！'));\n                }\n            }\n\n\n            $res = M('message')->add($w);\n            if($res){\n                if($this->frparam('ajax')){\n                    JsonReturn(['code'=>0,'msg'=>JZLANG('提交成功！我们会尽快回复您！'),'url'=>get_domain()]);\n                }\n                Success(JZLANG('提交成功！我们会尽快回复您！'),get_domain());\n            }else{\n                if($this->frparam('ajax')){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('提交失败，请重试！')]);\n                }\n                //$this->error('提交失败，请重试！');\n                Error(JZLANG('提交失败，请重试！'));\n            }\n\n\n\n        }\n\n\n\n    }\n\n    function details(){\n        $id = $this->frparam('id');\n        if(!$id){\n            $error = JZLANG('链接错误');\n            if($this->frparam('ajax')){\n                JsonReturn(['code'=>1,'msg'=>$error]);\n            }\n            Error($error);\n        }\n        if($this->webconf['autocheckmessage']==1){\n            $msg = M('message')->find(['id'=>$id]);\n        }else{\n            $msg = M('message')->find(['id'=>$id,'isshow'=>1]);\n        }\n        if(!$msg){\n            $error = JZLANG('留言未找到或者未审核');\n            if($this->frparam('ajax')){\n                JsonReturn(['code'=>1,'msg'=>$error]);\n            }\n            Error($error);\n        }\n        $this->data = $msg;\n\n        if($this->classtypedata[$msg['tid']]){\n            $this->type = $this->classtypedata[$msg['tid']];\n            $details_html = $this->type['details_html'];\n        }else{\n            $details_html =  M('molds')->getField(['biaoshi'=>'message'],'details_html');\n        }\n        $this->display($this->template.'/message/'.$details_html);\n\n\n    }\n\n\n\n\n}"
  },
  {
    "path": "app/home/c/MypayController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2019/08\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace app\\home\\c;\r\n\r\n\r\nuse frphp\\extend\\Page;\r\n\r\nclass MypayController extends CommonController\r\n{\r\n\t/**\r\n\t\t\r\n\t\t自主平台支付回调\r\n\t\r\n\t**/\r\n\t\r\n\tpublic function _init(){\r\n\t\t\r\n\t\tparent::_init();\r\n\t\t\r\n\t}\r\n\t\r\n\t\r\n\t//跳过购物车直接进行支付\r\n\tpublic function topay(){\r\n\t\t//创建订单\r\n\t\t$w = [];\r\n\t\t$w['orderno'] = 'No'.date('YmdHis');\r\n\t\tif($this->islogin){\r\n\t\t\t$w['userid'] = $this->member['id'];\r\n\t\t\t$w['tel'] = $this->frparam('tel',1) ? $this->frparam('tel',1) : $this->member['tel']; \r\n\t\t\t$w['username'] = $this->frparam('username',1) ? $this->frparam('username',1) : $this->member['username']; \r\n\t\t}else{\r\n\t\t\t$w['tel'] = $this->frparam('tel',1,'');\r\n\t\t\t$w['username'] = $this->frparam('username',1,JZLANG('匿名'));\r\n\t\t}\r\n\t\t\r\n\t\t$w['receive_username'] = $w['username'];\r\n\t\t$w['receive_tel'] = $w['tel'];\r\n\t\t$w['receive_email'] = $this->frparam('email',1);\r\n\t\t$w['receive_address'] = $this->frparam('address',1);\r\n\t\t$id = $this->frparam('id');\r\n\t\t$tid = $this->frparam('tid');\r\n\t\t$w['tid'] = $tid;\r\n\t\tif(!$id){\r\n\t\t\tError(JZLANG('缺少id参数！'));\r\n\t\t}\r\n\t\tif(!$tid){\r\n\t\t\tError(JZLANG('缺少tid参数！'));\r\n\t\t}\r\n\t\t$molds = $this->classtypedata[$tid]['molds'];\r\n\t\tif(!$molds){\r\n\t\t\t$molds = 'product';\r\n\t\t}\r\n\t\t$product = M($molds)->find(['id'=>$id,'isshow'=>1]);\r\n\t\tif(!$product){\r\n\t\t\tError(JZLANG('未找到商品或者已下架！'));\r\n\t\t}\r\n\t\tif(!array_key_exists('price',$product)){\r\n\t\t\tError(JZLANG('该模块缺少price价格参数！'));\r\n\t\t}\r\n\t\t$num = $this->frparam('num',0,1);\r\n        if ($num<=0){\r\n            Error('数量错误！');\r\n        }\r\n\t\t$money = $product['price'] * $num;\r\n\t\t$w['addtime'] = time();\r\n\t\t//运费\r\n\t\t$yunfei = $this->webconf['yunfei'];\r\n\t\tif($this->islogin){\r\n\t\t\t$group = M('member_group')->find(['id'=>$this->member['gid']]);\r\n\t\t\t//折扣\r\n\t\t\t$discount = 0.00;\r\n\t\t\tif($group['discount_type']==1){\r\n\t\t\t\t$discount = $group['discount'];\r\n\t\t\t}else if($group['discount_type']==2){\r\n\t\t\t\t$discount = round((1-$group['discount'])*$money,2);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\t$discount = 0;\r\n\t\t}\r\n\t\t$w['discount'] = $discount;\r\n\t\t//tid-id-num-price\r\n\t\t$w['body'] = '||'.$product['tid'].'-'.$id.'-'.$num.'-'.$product['price'].'||';\r\n\t\t$w['yunfei'] = $yunfei;\r\n\t\t$w['price'] = $money-$discount+$yunfei;\r\n\t\tif($w['price']<0){\r\n\t\t\t$w['price'] = 0;\r\n\t\t}\r\n\t\t\r\n\t\tif($this->webconf['isopenemail']==1 && $this->frparam('ismsg')){\r\n\t\t\tif($this->webconf['email_server'] && $this->webconf['email_port'] &&  $this->webconf['send_email'] &&  $this->webconf['send_pass']){\r\n\t\t\t\t$title = JZLANG('您的订单提交成功通知').'-'.$this->webconf['web_name'];\r\n\t\t\t\tif($this->webconf['tj_msg']!=''){\r\n\t\t\t\t\t$body = str_replace('{xxx}',$w['receive_username'],$this->webconf['tj_msg']);\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$body = JZLANG('尊敬的').$w['receive_username'].JZLANG('我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！');\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$body.='<br/>'.JZLANG('订单详细信息如下').'：<br/>';\r\n\t\t\t\t$body.='<table style=\"min-width:500px\">\r\n\t\t\t\t\t<tr><th width=\"20%\">'.JZLANG('主图').'</th><th width=\"20%\">'.JZLANG('商品').'</th><th width=\"20%\">'.JZLANG('价格').'</th><th width=\"20%\">'.JZLANG('购买数量').'</th><th width=\"20%\">'.JZLANG('总价').'</th></tr>';\r\n\t\t\t\t\r\n\t\t\t\tforeach(explode('||',$w['body']) as $v){\r\n\t\t\t\t\tif($v!=''){\r\n\t\t\t\t\t\t$d = explode('-',$v);\r\n\t\t\t\t\t\t//tid-id-num-price\r\n\t\t\t\t\t\tif($d[0]!=''){\r\n\t\t\t\t\t\t\t$type = $this->classtypedata[$d[0]];//栏目\r\n\t\t\t\t\t\t\t$body.='<tr><td width=\"20%\"><img width=\"200px\" src=\"'.get_domain().$product['litpic'].'\" /></td><td width=\"20%\">'.$product['title'].'</td><td width=\"20%\">'.JZLANG('￥').$d[3].JZLANG('元').'</td><td width=\"20%\">'.$d[2].'</td><td width=\"20%\">'.JZLANG('￥').($d[3]*$d[2]).JZLANG('元').'</td></tr>';\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$body.='<tr><td>'.JZLANG('折扣').'：</td><td colspan=\"4\">'.JZLANG('￥').$order['discount'].JZLANG('元').'</td></tr><tr><td>'.JZLANG('运费').'：</td><td colspan=\"4\">'.JZLANG('￥').$order['yunfei'].JZLANG('元').'</td></tr><tr><td>'.JZLANG('合计').'：</td><td colspan=\"4\">￥'.$order['price'].'元</td></tr></table><br/>';\r\n\t\t\t\t\t$body.=JZLANG('收件地址').'：'.$w['receive_address'].' '.JZLANG('联系电话').'：'.$w['receive_tel'];\r\n\t\t\t\t\r\n\t\t\t\tif($this->webconf['shou_email']!=''){\r\n\t\t\t\t\tsend_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$w['receive_email'],$title,$body,$this->webconf['shou_email']);\r\n\t\t\t\t}else{\r\n\t\t\t\t\tsend_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$w['receive_email'],$title,$body); \r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t$res = M('orders')->add($w);\r\n\t\tif($res){\r\n\t\t\t$ptype = $this->frparam('ptype',0,1);\r\n\t\t\t$w['id'] = $res;\r\n\t\t\t$order = $w;\r\n\t\t\t//保存提交信息\r\n\t\t\t$return_url = U('user/orderdetails',['orderno'=>$order['orderno']]);\r\n\t\t\tswitch($ptype){\r\n\t\t\t\tcase 1:\r\n\t\t\t\tif($this->webconf['paytype']==0){\r\n\t\t\t\t\t//线下支付\r\n\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['isshow'=>4,'paytype'=>JZLANG('线下支付')]);\r\n\t\t\t\t\t//交易提醒\r\n\t\t\t\t\t$task['aid'] = $order['id'];\r\n\t\t\t\t\t$task['tid'] = 0;\r\n\t\t\t\t\tif($this->islogin){\r\n\t\t\t\t\t\t$task['userid'] = $this->member['id'];\r\n\t\t\t\t\t\t$task['puserid'] = $this->member['id'];\r\n\t\t\t\t\t\t$task['molds'] = 'orders';\r\n\t\t\t\t\t\t$task['type'] = 'rechange';\r\n\t\t\t\t\t\t$task['addtime'] = time();\r\n\t\t\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，我们会尽快给您发货！');\r\n\t\t\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\r\n\t\t\t\t\t\tM('task')->add($task);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！'),'url'=>U('user/orders')]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tSuccess(JZLANG('我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！'),U('User/orders'));\r\n\t\t\t\t}else{\r\n\t\t\t\t\t//支付宝\r\n\t\t\t\t\t//检查自主平台配置\r\n\t\t\t\t\tif($order['ispay']==1){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tError(JZLANG('订单已支付！'),$return_url);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif($this->islogin){\r\n\t\t\t\t\t\t//交易提醒\r\n\t\t\t\t\t\t$task['aid'] = $order['id'];\r\n\t\t\t\t\t\t$task['tid'] = 0;\r\n\t\t\t\t\t\t$task['userid'] = $this->member['id'];\r\n\t\t\t\t\t\t$task['puserid'] = $this->member['id'];\r\n\t\t\t\t\t\t$task['molds'] = 'orders';\r\n\t\t\t\t\t\t$task['type'] = 'rechange';\r\n\t\t\t\t\t\t$task['addtime'] = time();\r\n\t\t\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，请尽快支付！');\r\n\t\t\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\r\n\t\t\t\t\t\tM('task')->add($task);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(isMobile()){\r\n\t\t\t\t\t\t//手机端\r\n\t\t\t\t\t\tif(isWeixin()){\r\n\t\t\t\t\t\t\t//微信内\r\n\t\t\t\t\t\t\t$order['paytype'] = 'h5alipay';\r\n\t\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝H5支付')]);\r\n\t\t\t\t\t\t\textendFile('pay/alipay/AlipayService.php');\r\n\t\t\t\t\t\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID\r\n\t\t\t\t\t\t\t$returnUrl = U('Mypay/alipay_return_pay');     //付款成功后的同步回调地址\r\n\t\t\t\t\t\t\t$notifyUrl = U('Mypay/alipay_notify_pay');     //付款成功后的异步回调地址\r\n\t\t\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\r\n\t\t\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\r\n\t\t\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\r\n                            $rsaPrivateKey = $this->webconf['alipay_private_key'];\r\n                            $aliPay = new \\AlipayService();\r\n                            $aliPay->setAppid($appid);\r\n                            $aliPay->setReturnUrl($returnUrl);\r\n                            $aliPay->setNotifyUrl($notifyUrl);\r\n                            $aliPay->setRsaPrivateKey($rsaPrivateKey);\r\n                            $aliPay->setTotalFee($payAmount);\r\n                            $aliPay->setOutTradeNo($outTradeNo);\r\n                            $aliPay->setOrderName($orderName);\r\n                            $payConfigs = $aliPay->wxPay();\r\n                            $this->queryStr = http_build_query($payConfigs);\r\n                            $this->display($this->template.'/paytpl/alipay_in_weixin');\r\n\t\t\t\t\t\t\texit;\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t//支付宝H5支付\r\n\t\t\t\t\t\t\t$order['paytype'] = 'h5alipay';\r\n\t\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝H5支付')]);\r\n\t\t\t\t\t\t\t/*** 请填写以下配置信息 ***/\r\n\t\t\t\t\t\t\textendFile('pay/alipay/AlipayService.php');\r\n\t\t\t\t\t\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID\r\n\t\t\t\t\t\t\t$returnUrl = U('Mypay/alipay_return_pay');     //付款成功后的同步回调地址\r\n\t\t\t\t\t\t\t$notifyUrl = U('Mypay/alipay_notify_pay');     //付款成功后的异步回调地址\r\n\t\t\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\r\n\t\t\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\r\n\t\t\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\r\n\t\t\t\t\t\t\t$signType = 'RSA2';\t\t\t//签名算法类型，支持RSA2和RSA，推荐使用RSA2\r\n\t\t\t\t\t\t\t$rsaPrivateKey=$this->webconf['alipay_private_key'];\t\t//商户私钥，填写对应签名算法类型的私钥，如何生成密钥参考：https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310\r\n\t\t\t\t\t\t\t/*** 配置结束 ***/\r\n\t\t\t\t\t\t\t$aliPay = new \\AlipayService();\r\n\t\t\t\t\t\t\t$aliPay->setAppid($appid);\r\n\t\t\t\t\t\t\t$aliPay->setReturnUrl($returnUrl);\r\n\t\t\t\t\t\t\t$aliPay->setNotifyUrl($notifyUrl);\r\n\t\t\t\t\t\t\t$aliPay->setRsaPrivateKey($rsaPrivateKey);\r\n\t\t\t\t\t\t\t$aliPay->setTotalFee($payAmount);\r\n\t\t\t\t\t\t\t$aliPay->setOutTradeNo($outTradeNo);\r\n\t\t\t\t\t\t\t$aliPay->setOrderName($orderName);\r\n\t\t\t\t\t\t\t$sHtml = $aliPay->mPay();\r\n\t\t\t\t\t\t\techo $sHtml;exit;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t//PC\r\n\t\t\t\t\t\t$order['paytype'] = 'alipay';\r\n\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('电脑支付宝支付')]);\r\n\t\t\t\t\t\t/*** 请填写以下配置信息 ***/\r\n\t\t\t\t\t\textendFile('pay/alipay/AlipayService.php');\r\n\t\t\t\t\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID\r\n\t\t\t\t\t\t$returnUrl = U('Mypay/alipay_return_pay');     //付款成功后的同步回调地址\r\n\t\t\t\t\t\t$notifyUrl = U('Mypay/alipay_notify_pay');     //付款成功后的异步回调地址\r\n\t\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\r\n\t\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\r\n\t\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\r\n\t\t\t\t\t\t$signType = 'RSA2';\t\t\t//签名算法类型，支持RSA2和RSA，推荐使用RSA2\r\n\t\t\t\t\t\t$rsaPrivateKey = $this->webconf['alipay_private_key'];\t\t//商户私钥，填写对应签名算法类型的私钥，如何生成密钥参考：https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310\r\n\t\t\t\t\t\t/*** 配置结束 ***/\r\n\t\t\t\t\t\t$aliPay = new \\AlipayService();\r\n\t\t\t\t\t\t$aliPay->setAppid($appid);\r\n\t\t\t\t\t\t$aliPay->setReturnUrl($returnUrl);\r\n\t\t\t\t\t\t$aliPay->setNotifyUrl($notifyUrl);\r\n\t\t\t\t\t\t$aliPay->setRsaPrivateKey($rsaPrivateKey);\r\n\t\t\t\t\t\t$aliPay->setTotalFee($payAmount);\r\n\t\t\t\t\t\t$aliPay->setOutTradeNo($outTradeNo);\r\n\t\t\t\t\t\t$aliPay->setOrderName($orderName);\r\n\t\t\t\t\t\t$sHtml = $aliPay->doPay();\r\n\t\t\t\t\t\techo $sHtml;\r\n\t\t\t\t\t\texit;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\t//微信\r\n\t\t\t\t\t//检查自主平台配置\r\n\t\t\t\t\tif($order['ispay']==1){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tError(JZLANG('订单已支付！'),$return_url);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif($this->islogin){\r\n\t\t\t\t\t\t//交易提醒\r\n\t\t\t\t\t\t$task['aid'] = $order['id'];\r\n\t\t\t\t\t\t$task['tid'] = 0;\r\n\t\t\t\t\t\t$task['userid'] = $this->member['id'];\r\n\t\t\t\t\t\t$task['puserid'] = $this->member['id'];\r\n\t\t\t\t\t\t$task['molds'] = 'orders';\r\n\t\t\t\t\t\t$task['type'] = 'rechange';\r\n\t\t\t\t\t\t$task['addtime'] = time();\r\n\t\t\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，请尽快支付！');\r\n\t\t\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\r\n\t\t\t\t\t\tM('task')->add($task);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif(isMobile()){\r\n\t\t\t\t\t\t//手机端\r\n\t\t\t\t\t\tif(isWeixin()){\r\n\t\t\t\t\t\t\t//微信内\r\n\t\t\t\t\t\t\t$order['paytype'] = 'wxpay';\r\n\t\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信内支付')]);\r\n\t\t\t\t\t\t\t$url = U('order/wxpay').'?'.http_build_query($order);\r\n\t\t\t\t\t\t\tRedirect($url);\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\texit;\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t//微信H5支付\r\n\t\t\t\t\t\t\t$order['paytype'] = 'h5wxpay';\r\n\t\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信H5支付')]);\r\n\t\t\t\t\t\t\textendFile('pay/wechat/WxpayH5Service.php');\r\n\t\t\t\t\t\t\t/** 请填写以下配置信息 */\r\n\t\t\t\t\t\t\t$mchid = $this->webconf['wx_mchid'];   //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送\r\n\t\t\t\t\t\t\t$appid =  $this->webconf['wx_appid'];  //微信支付申请对应的公众号的APPID\r\n\t\t\t\t\t\t\t$appKey = $this->webconf['wx_appsecret'];   //微信支付申请对应的公众号的APP Key\r\n\t\t\t\t\t\t\t$apiKey = $this->webconf['wx_key'];   //https://pay.weixin.qq.com \r\n\t\t\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\r\n\t\t\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\r\n\t\t\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\r\n\t\t\t\t\t\t\t$notifyUrl = U('Mypay/wechat_notify_pay');     //付款成功后的回调地址(不要有问号)\r\n\t\t\t\t\t\t\t//$returnUrl = U('Mypay/check_wechat_order').'?orderno='.$order['orderno'];     //付款成功后，页面跳转的地址\r\n\t\t\t\t\t\t\t$returnUrl = U('order/wxh5pay').'?orderno='.$order['orderno'];     //付款成功后，页面跳转的地址\r\n\t\t\t\t\t\t\t$wapUrl = $_SERVER['HTTP_HOST'];   //WAP网站URL地址\r\n\t\t\t\t\t\t\t$wapName = $this->webconf['web_name']; //WAP 网站名\r\n\t\t\t\t\t\t\t$webip = GetIP();\r\n\t\t\t\t\t\t\t/** 配置结束 */\r\n\r\n\t\t\t\t\t\t\t$wxPay = new \\WxpayH5Service($mchid,$appid,$apiKey);\r\n\t\t\t\t\t\t\t$wxPay->setTotalFee($payAmount);\r\n\t\t\t\t\t\t\t$wxPay->setOutTradeNo($outTradeNo);\r\n\t\t\t\t\t\t\t$wxPay->setOrderName($orderName);\r\n\t\t\t\t\t\t\t$wxPay->setNotifyUrl($notifyUrl);\r\n\t\t\t\t\t\t\t$wxPay->setReturnUrl($returnUrl);\r\n\t\t\t\t\t\t\t$wxPay->setWapUrl($wapUrl);\r\n\t\t\t\t\t\t\t$wxPay->setWapName($wapName);\r\n\t\t\t\t\t\t\t$wxPay->setIp($webip);\r\n\r\n\t\t\t\t\t\t\t$mwebUrl= $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl);\r\n\t\t\t\t\t\t\t//echo \"<h1><a href='{$mwebUrl}'>点击跳转至支付页面</a></h1>\";\r\n\t\t\t\t\t\t\theader('Location:'.$mwebUrl);\r\n\t\t\t\t\t\t\texit;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t//PC\r\n\t\t\t\t\t\t$order['paytype'] = 'scanwxpay';\r\n\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信扫码支付')]);\r\n\t\t\t\t\t\textendFile('pay/wechat/WxpayScan.php');\r\n\t\t\t\t\t\t//微信扫码支付\r\n\t\t\t\t\t\t$mchid = $this->webconf['wx_mchid'];   //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送\r\n\t\t\t\t\t\t$appid =  $this->webconf['wx_appid'];  //微信支付申请对应的公众号的APPID\r\n\t\t\t\t\t\t$appKey = $this->webconf['wx_appsecret'];   //微信支付申请对应的公众号的APP Key\r\n\t\t\t\t\t\t$apiKey = $this->webconf['wx_key'];   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥\r\n\t\t\t\t\t\t$wxPay = new \\WxpayScan($mchid,$appid,$apiKey);\r\n\t\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\r\n\t\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\r\n\t\t\t\t\t\t$orderName = JZLANG('支付订单').':'.$order['orderno'];    //订单标题\r\n\t\t\t\t\t\t$notifyUrl = U('Mypay/wechat_notify_pay');    //付款成功后的回调地址(不要有问号)\r\n\t\t\t\t\t\t$payTime = time();      //付款时间\r\n\t\t\t\t\t\t$arr = $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime);\r\n\t\t\t\t\t\t//生成二维码\r\n\t\t\t\t\t\t$url = U('Common/qrcode').'?data='.$arr['code_url'];\r\n\t\t\t\t\t\t$this->url = $url;\r\n\t\t\t\t\t\t$this->data = $arr['code_url'];\r\n\t\t\t\t\t\t$this->payAmount = $payAmount;\r\n\t\t\t\t\t\t$this->orderno = $outTradeNo;\r\n\t\t\t\t\t\t$this->display($this->template.'/paytpl/wechat_scan');\r\n\t\t\t\t\t\t//echo \"<img src='{$url}' style='width:300px;'><br>\";\r\n\t\t\t\t\t\t//echo '二维码内容：'.$arr['code_url'];\r\n\t\t\t\t\t\texit;\r\n\t\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\tif($this->webconf['isopenqianbao']!=1){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('未开启钱包支付！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tError(JZLANG('未开启钱包支付！'),$return_url);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!$this->islogin){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('您未登录，无法支付！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tError(JZLANG('您未登录，无法支付！'),$return_url);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//钱包支付\r\n\t\t\t\t\t$money = M('member')->getField(['id'=>$this->member['id']],'money');\r\n\t\t\t\t\t$paymoney = $order['price']*$this->webconf['money_exchange'];\r\n\t\t\t\t\t$allmoney = $paymoney;\r\n\t\t\t\t\tif($money<$paymoney){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('钱包金额不足，请充值！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tError(JZLANG('钱包金额不足，请充值！'),$return_url);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t$money_x = $money-$allmoney;\r\n\t\t\t\t\t$paytime = time();\r\n\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime,'paytype'=>JZLANG('钱包支付')]);\r\n\t\t\t\t\tM('member')->goDec(['id'=>$order['userid']],'money',$allmoney);\r\n\t\t\t\t\t$ww['userid'] = $order['userid'];\r\n\t\t\t\t\t$ww['amount'] = $allmoney;\r\n\t\t\t\t\t$ww['money'] = $order['price'];\r\n\t\t\t\t\t$ww['type'] = 2;\r\n\t\t\t\t\t$ww['msg'] = JZLANG('钱包支付');\r\n\t\t\t\t\t$ww['orderno'] = $order['orderno'];\r\n\t\t\t\t\t$ww['buytype'] = 'money';\r\n\t\t\t\t\t$ww['addtime'] = $paytime;\r\n\t\t\t\t\tM('buylog')->add($ww);\r\n\r\n\t\t\t\t\t$_SESSION['member']['money'] = $money_x;\r\n\t\t\t\t\t$order['ispay'] = 1;\r\n\t\t\t\t\t$order['isshow'] = 2;\r\n\t\t\t\t\t$order['paytime'] = $paytime;\r\n\t\t\t\t\t$order['paytype'] = JZLANG('钱包支付');\r\n\t\t\t\t\t$this->order = $order;\r\n\t\t\t\t\t//交易提醒\r\n\t\t\t\t\t$task['aid'] = $order['id'];\r\n\t\t\t\t\t$task['tid'] = 0;\r\n\t\t\t\t\t$task['userid'] = $this->member['id'];\r\n\t\t\t\t\t$task['puserid'] = $this->member['id'];\r\n\t\t\t\t\t$task['molds'] = 'orders';\r\n\t\t\t\t\t$task['type'] = 'rechange';\r\n\t\t\t\t\t$task['addtime'] = time();\r\n\t\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，我们会尽快给您发货！');\r\n\t\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\r\n\t\t\t\t\tM('task')->add($task);\r\n\r\n\t\t\t\t\t$this->display($this->template.'/paytpl/overpay');\r\n\t\t\t\t\texit;\r\n\t\t\t\t\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 4:\r\n\t\t\t\t\tif($this->webconf['isopenjifen']!=1){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('未开启积分支付！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tError(JZLANG('未开启积分支付！'),$return_url);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!$this->islogin){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('您未登录，无法支付！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tError(JZLANG('您未登录，无法支付！'),$return_url);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//积分支付\r\n\t\t\t\t\t$jifen = M('member')->getField(['id'=>$this->member['id']],'jifen');\r\n\t\t\t\t\t$payjifen = $order['price']*$this->webconf['jifen_exchange'];\r\n\t\t\t\t\t$allmoney = $payjifen;\r\n\t\t\t\t\tif($jifen<$payjifen){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('积分不足，请充值！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tError(JZLANG('积分不足，请充值！'),$return_url);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$money_x = $jifen-$allmoney;\r\n\t\t\t\t\t$paytime = time();\r\n\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime,'paytype'=>JZLANG('积分兑换')]);\r\n\t\t\t\t\t M('member')->goDec(['id'=>$order['userid']],'jifen',$allmoney);\r\n\t\t\t\t\t$ww['userid'] = $order['userid'];\r\n\t\t\t\t\t$ww['amount'] = $allmoney;\r\n\t\t\t\t\t$ww['money'] = $order['price'];\r\n\t\t\t\t\t$ww['type'] = 2;\r\n\t\t\t\t\t$ww['msg'] = JZLANG('积分兑换');\r\n\t\t\t\t\t$ww['orderno'] = $order['orderno'];\r\n\t\t\t\t\t$ww['buytype'] = 'jifen';\r\n\t\t\t\t\t$ww['addtime'] = $paytime;\r\n\t\t\t\t\tM('buylog')->add($ww);\r\n\r\n\t\t\t\t\t$_SESSION['member']['jifen'] = $money_x;\r\n\t\t\t\t\t$order['ispay'] = 1;\r\n\t\t\t\t\t$order['isshow'] = 2;\r\n\t\t\t\t\t$order['paytime'] = $paytime;\r\n\t\t\t\t\t$order['paytype'] = JZLANG('积分兑换');\r\n\t\t\t\t\t$this->order = $order;\r\n\t\t\t\t\t//交易提醒\r\n\t\t\t\t\t$task['aid'] = $order['id'];\r\n\t\t\t\t\t$task['tid'] = 0;\r\n\t\t\t\t\t$task['userid'] = $this->member['id'];\r\n\t\t\t\t\t$task['puserid'] = $this->member['id'];\r\n\t\t\t\t\t$task['molds'] = 'orders';\r\n\t\t\t\t\t$task['type'] = 'rechange';\r\n\t\t\t\t\t$task['addtime'] = time();\r\n\t\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，我们会尽快给您发货！');\r\n\t\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\r\n\t\t\t\t\tM('task')->add($task);\r\n\t\t\t\t\t$this->display($this->template.'/paytpl/overpay');\r\n\t\t\t\t\texit;\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 5:\r\n\t\t\t\t\t// 支付宝当面付\r\n\t\t\t\t\t//检查自主平台配置\r\n\t\t\t\t\tif($order['ispay']==1){\r\n\t\t\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付！'),'url'=>$return_url]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tError(JZLANG('订单已支付！'),$return_url);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//交易提醒\r\n\t\t\t\t\t$task['aid'] = $order['id'];\r\n\t\t\t\t\t$task['tid'] = 0;\r\n\t\t\t\t\t$task['userid'] = $this->member['id'];\r\n\t\t\t\t\t$task['puserid'] = $this->member['id'];\r\n\t\t\t\t\t$task['molds'] = 'orders';\r\n\t\t\t\t\t$task['type'] = 'rechange';\r\n\t\t\t\t\t$task['addtime'] = time();\r\n\t\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，请尽快支付！');\r\n\t\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\r\n\t\t\t\t\tM('task')->add($task);\r\n\t\t\t\t\t\r\n\t\t\t\t\t$order['paytype'] = 'dmfalipay';\r\n\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝当面付')]);\r\n\t\t\t\t\t/*** 请填写以下配置信息 ***/\r\n\t\t\t\t\textendFile('pay/alipay/AlipayService.php');\r\n\t\t\t\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID\r\n\t\t\t\t\t$returnUrl = U('Mypay/alipay_return_pay');     //付款成功后的同步回调地址\r\n\t\t\t\t\t$notifyUrl = U('Mypay/alipay_notify_pay');     //付款成功后的异步回调地址\r\n\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\r\n\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\r\n\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\r\n\t\t\t\t\t$signType = 'RSA2';\t\t\t//签名算法类型，支持RSA2和RSA，推荐使用RSA2\r\n\t\t\t\t\t$rsaPrivateKey=$this->webconf['alipay_private_key'];\t\t//商户私钥，填写对应签名算法类型的私钥，如何生成密钥参考：https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310\r\n\t\t\t\t\t/*** 配置结束 ***/\r\n\t\t\t\t\t$aliPay = new \\AlipayService();\r\n\t\t\t\t\t$aliPay->setAppid($appid);\r\n\t\t\t\t\t$aliPay->setReturnUrl($returnUrl);\r\n\t\t\t\t\t$aliPay->setNotifyUrl($notifyUrl);\r\n\t\t\t\t\t$aliPay->setRsaPrivateKey($rsaPrivateKey);\r\n\t\t\t\t\t$aliPay->setTotalFee($payAmount);\r\n\t\t\t\t\t$aliPay->setOutTradeNo($outTradeNo);\r\n\t\t\t\t\t$aliPay->setOrderName($orderName);\r\n\t\t\t\t\t$result = $aliPay->dmfPay();\r\n\t\t\t\t\t$result = $result['alipay_trade_precreate_response'];\r\n\t\t\t\t\tif($result['code'] && $result['code']=='10000'){\r\n\t\t\t\t\t\t$url = U('common/qrcode').'?data='.$result['qr_code'];\r\n\t\t\t\t\t\t$this->url = $url;\r\n\t\t\t\t\t\t$this->payAmount = $payAmount;\r\n\t\t\t\t\t\t$this->order = $order;\r\n\t\t\t\t\t\t$this->orderno = $order['orderno'];\r\n\t\t\t\t\t\t$this->display($this->template.'/paytpl/dmf');\r\n\t\t\t\t\t\texit;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\techo $result['msg'].' : '.$result['sub_msg'];\r\n\t\t\t\t\t}\r\n\t\t\t\t\texit;\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 6:\r\n\t\t\t\t\r\n\t\t\t\t\tif($this->islogin){\r\n\t\t\t\t\t\t//交易提醒\r\n\t\t\t\t\t\t$task['aid'] = $order['id'];\r\n\t\t\t\t\t\t$task['tid'] = 0;\r\n\t\t\t\t\t\t$task['userid'] = $this->member['id'];\r\n\t\t\t\t\t\t$task['puserid'] = $this->member['id'];\r\n\t\t\t\t\t\t$task['molds'] = 'orders';\r\n\t\t\t\t\t\t$task['type'] = 'rechange';\r\n\t\t\t\t\t\t$task['addtime'] = time();\r\n\t\t\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，请尽快支付！');\r\n\t\t\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\r\n\t\t\t\t\t\tM('task')->add($task);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t//进入第三方支付内\r\n\t\t\t\t\t$order['paytype'] = $this->frparam('payname',1,JZLANG('其他平台支付'));\r\n\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>$order['paytype']]);\r\n\t\t\t\t\t$controller = $this->frparam('c',1);\r\n\t\t\t\t\t$url = U($controller.'/pay').'?'.http_build_query($order);\r\n\t\t\t\t\tRedirect($url);\r\n\t\t\t\t\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\tError('订单创建失败！');\r\n\t\t}\r\n\t}\r\n\t\r\n\t//同步跳转\r\n\tfunction alipay_return_pay(){\r\n\t\textendFile('pay/alipay/AlipayServiceCheck.php');\r\n\t\t//支付宝公钥，账户中心->密钥管理->开放平台密钥，找到添加了支付功能的应用，根据你的加密类型，查看支付宝公钥\r\n\t\t$alipayPublicKey=$this->webconf['alipay_public_key'];\r\n\t\t$aliPay = new \\AlipayServiceCheck($alipayPublicKey);\r\n\t\t//验证签名\r\n\t\t$result = $aliPay->rsaCheck($_REQUEST);\r\n\r\n\t\tif($result===true){\r\n\t\t\t//同步回调一般不处理业务逻辑，显示一个付款成功的页面，或者跳转到用户的财务记录页面即可。\r\n\t\t\t//echo '<h1>付款成功</h1>';\r\n\t\t\t$out_trade_no = htmlspecialchars($_GET['out_trade_no']);\r\n\t\t\t$out_trade_no = format_param($out_trade_no,1);\r\n\t\t\t$orderno = $out_trade_no;\r\n\t\t\t$paytime = time();\r\n\t\t\t$order = M('orders')->find(['orderno'=>$orderno]);\r\n\t\t\tif(!$order || $_GET['total_amount']!=$order['price']){\r\n\t\t\t\tError(JZLANG('支付成功，但是系统内没有找到相应的订单！').$orderno,get_domain());\r\n\t\t\t}\r\n\t\t\tif($order['ispay']==1){\r\n\t\t\t\t//跳转对应查询详情\r\n\t\t\t\t//Success('支付成功！',U('User/details',['id'=>$order['id']]));\r\n\t\t\t\t$this->overpay($order['orderno']);\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]);\r\n            \r\n            if($r && $order['ptype']==2){\r\n                //金币充值\r\n                $this->updatemoney($order);\r\n                \r\n            }else if($r && $order['ptype']==3){\r\n                //积分\r\n                $this->updatejifen($order);\r\n            }\r\n\t\t\t//支付成功后处理...\r\n\t\t\t$this->overpay($order['orderno']);\r\n\t\t\texit;\r\n\t\t\t\r\n\t\t}\r\n\t\techo '不合法的请求';\r\n\t\texit();\r\n\t\t\r\n\t\t\r\n\t}\r\n\t//异步跳转--只处理状态\r\n\tfunction alipay_notify_pay(){\r\n\t\textendFile('pay/alipay/AlipayServiceCheck.php');\r\n\t\t$alipayPublicKey=$this->webconf['alipay_public_key'];\r\n\t\t\r\n\t\t$aliPay = new \\AlipayServiceCheck($alipayPublicKey);\r\n\t\t//验证签名\r\n\t\t$result = $aliPay->rsaCheck($_REQUEST,$_POST['sign_type']);\r\n\t\tif($result===true){\r\n\t\t\t//处理你的逻辑，例如获取订单号$_POST['out_trade_no']，订单金额$_POST['total_amount']等\r\n\t\t\t//程序执行完后必须打印输出“success”（不包含引号）。如果商户反馈给支付宝的字符不是success这7个字符，支付宝服务器会不断重发通知，直到超过24小时22分钟。一般情况下，25小时以内完成8次通知（通知的间隔频率一般是：4m,10m,10m,1h,2h,6h,15h）；\r\n\t\t\t//echo 'success';exit();\r\n\t\t\t$out_trade_no = htmlspecialchars($_GET['out_trade_no']);\r\n\t\t\t$out_trade_no = format_param($out_trade_no,1);\r\n\t\t\t$orderno = $out_trade_no;\r\n\t\t\t$paytime = time();\r\n\t\t\t$order = M('orders')->find(['orderno'=>$orderno]);\r\n\t\t\tif(!$order){\r\n\t\t\t\t//Error('支付成功，但是系统内没有找到相应的订单！'.$orderno,get_domain());\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t\tif($order['ispay']==1){\r\n\t\t\t\t//跳转对应查询详情\r\n\t\t\t\t//Success('支付成功！',U('User/details',['id'=>$order['id']]));\r\n\t\t\t\t//$this->overpay($order['orderno']);\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]);\r\n\t\t\t//检查是否金币或积分充值\r\n            if($r && $order['ptype']==2){\r\n                //金币充值\r\n                $this->updatemoney($order);\r\n                \r\n            }else if($r && $order['ptype']==3){\r\n                //积分\r\n                $this->updatejifen($order);\r\n            }\r\n\r\n\t\t\t//支付成功后处理...\r\n\t\t\t//$this->overpay($order['orderno']);\r\n\t\t\texit;\r\n\t\t}\r\n\t\techo 'error';exit();\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic function alipay_check_order(){\r\n\t\t/*** 请填写以下配置信息 ***/\r\n\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写对应应用的APPID\r\n\t\t$outTradeNo = $this->frparam('orderno',1);     //要查询的商户订单号。注：商户订单号与支付宝交易号不能同时为空\r\n\t\t$tradeNo = $this->frparam('tradeno',1,NULL);     //要查询的支付宝交易号。注：商户订单号与支付宝交易号不能同时为空\r\n\t\t$signType = 'RSA2';       //签名算法类型，使用RSA2\r\n\t\t//商户私钥，填写对应签名算法类型的私钥，如何生成密钥参考：https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310\r\n\t\t$rsaPrivateKey=$this->webconf['alipay_private_key'];\r\n\t\textendFile('pay/alipay/AlipayService.php');\r\n\t\t$aliPay = new \\AlipayService();\r\n\t\t$aliPay->setAppid($appid);\r\n\t\t$aliPay->setRsaPrivateKey($rsaPrivateKey);\r\n\t\t\r\n\t\t //请求参数\r\n        $requestConfigs = array(\r\n            'out_trade_no'=>$outTradeNo,\r\n            'trade_no'=>$tradeNo,\r\n        );\r\n        $commonConfigs = array(\r\n            //公共参数\r\n            'app_id' => $appid,\r\n            'method' => 'alipay.trade.query',             //接口名称\r\n            'format' => 'JSON',\r\n            'charset'=>'utf8',\r\n            'sign_type'=>'RSA2',\r\n            'timestamp'=>date('Y-m-d H:i:s'),\r\n            'version'=>'1.0',\r\n            'biz_content'=>json_encode($requestConfigs),\r\n        );\r\n        $commonConfigs[\"sign\"] = $aliPay->generateSign($commonConfigs, $commonConfigs['sign_type']);\r\n        $result = $aliPay->curlPost('https://openapi.alipay.com/gateway.do?charset=utf8',$commonConfigs);\r\n        $result = json_decode($result,true);\r\n\t\t$msg = '';\r\n\t\t$code = 1;\r\n\t\tif($result['alipay_trade_query_response']['code']!='10000'){\r\n\t\t\t$msg = $result['alipay_trade_query_response']['msg'].'：'.$result['alipay_trade_query_response']['sub_code'].' '.$result['alipay_trade_query_response']['sub_msg'];\r\n\t\t}else{\r\n\t\t\tswitch($result['alipay_trade_query_response']['trade_status']){\r\n\t\t\t\tcase 'WAIT_BUYER_PAY':\r\n\t\t\t\t\t$msg = JZLANG('交易创建，等待买家付款');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'TRADE_CLOSED':\r\n\t\t\t\t\t$msg = JZLANG('未付款交易超时关闭，或支付完成后全额退款');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'TRADE_SUCCESS':\r\n\t\t\t\t\t$msg = JZLANG('支付成功');\r\n\t\t\t\t\t$code = 0;\r\n\t\t\t\t\t\r\n\t\t\t\t\t$out_trade_no = $outTradeNo;\r\n\t\t\t\t\t$orderno = $out_trade_no;\r\n\t\t\t\t\t$paytime = time();\r\n\t\t\t\t\t$order = M('orders')->find(['orderno'=>$orderno]);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif($order['ispay']==1){\r\n\t\t\t\t\t\t//跳转对应查询详情\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tJsonReturn(['code'=>$code,'msg'=>$msg]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t$r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]);\r\n                    \r\n                    if($r && $order['ptype']==2){\r\n                        //金币充值\r\n                        $this->updatemoney($order);\r\n                        \r\n                    }else if($r && $order['ptype']==3){\r\n                        //积分\r\n                        $this->updatejifen($order);\r\n                    }\r\n\t\t\t\t\t//支付成功后处理...\r\n\t\t\t\t\t//$this->overpay($order['orderno']);\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'TRADE_FINISHED':\r\n\t\t\t\t\t$msg = JZLANG('交易结束，不可退款');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t$msg = JZLANG('未知状态');\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tJsonReturn(['code'=>$code,'msg'=>$msg]);\r\n\t\t\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic function wechat_notify_pay(){\r\n\t\textendFile('pay/wechat/WxpayServiceCheck.php');\r\n\t\t$mchid = $this->webconf['wx_mchid'];          //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送\r\n\t\t$appid = $this->webconf['wx_appid'];  //公众号APPID 通过微信支付商户资料审核后邮件发送\r\n\t\t$apiKey = $this->webconf['wx_key'];   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥\r\n\t\t$wxPay = new \\WxpayServiceCheck($mchid,$appid,$apiKey);\r\n\t\t$result = $wxPay->notify();\r\n\t\tif($result){\r\n\t\t\t//完成你的逻辑\r\n\t\t\t//例如连接数据库，获取付款金额$result['cash_fee']，获取订单号$result['out_trade_no']，修改数据库中的订单状态等;\r\n\t\t\t//现金支付金额：$result['cash_fee']\r\n\t\t\t//订单金额：$result['total_fee']\r\n\t\t\t//商户订单号：$result['out_trade_no']\r\n\t\t\t//付款银行：$result['bank_type']\r\n\t\t\t//货币种类：$result['fee_type']\r\n\t\t\t//是否关注公众账号：$result['is_subscribe']\r\n\t\t\t//用户标识：$result['openid']\r\n\t\t\t//业务结果：$result['result_code']  SUCCESS/FAIL\r\n\t\t\t//支付完成时间：$result['time_end']  格式为yyyyMMddHHmmss\r\n\t\t\t//具体详细请看微信文档：https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8\r\n\t\t\t\r\n\t\t\t$out_trade_no = htmlspecialchars($result['out_trade_no']);\r\n\t\t\t$out_trade_no = format_param($out_trade_no,1);\r\n\t\t\t$orderno = $out_trade_no;\r\n\t\t\t$paytime = time();\r\n\t\t\t$order = M('orders')->find(['orderno'=>$orderno]);\r\n\t\t\tif(!$order){\r\n\t\t\t\t//Error('支付成功，但是系统内没有找到相应的订单！'.$orderno,get_domain());\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t\tif($order['ispay']==1){\r\n\t\t\t\t//跳转对应查询详情\r\n\t\t\t\t//Success('支付成功！',U('User/details',['id'=>$order['id']]));\r\n\t\t\t\t//$this->overpay($order['orderno']);\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]);\r\n\t\t\t//检查是否金币或积分充值\r\n            if($r && $order['ptype']==2){\r\n                //金币充值\r\n                $this->updatemoney($order);\r\n                \r\n            }else if($r && $order['ptype']==3){\r\n                //积分\r\n                $this->updatejifen($order);\r\n            }\r\n\r\n\r\n\t\t\t//支付成功后处理...\r\n\t\t\t//$this->overpay($order['orderno']);\r\n\t\t\texit;\r\n\t\t\t\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\techo 'pay error';\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic function wechat_return_pay(){\r\n\t\t$orderno = $this->frparam('orderno',1);\r\n\t\t$order = M('orders')->find(['orderno'=>$orderno]);\r\n\t\tif($orderno && $order){\r\n\t\t\textendFile('pay/wechat/WxpayServiceCheck.php');\r\n\t\t\t$mchid = $this->webconf['wx_mchid'];          //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送\r\n\t\t\t$appid = $this->webconf['wx_appid'];  //公众号APPID 通过微信支付商户资料审核后邮件发送\r\n\t\t\t$apiKey = $this->webconf['wx_key'];   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥\r\n\t\t\t$wxPay = new \\WxpayServiceCheck($mchid,$appid,$apiKey);\r\n\t\t\t$result = $wxPay->notify();\r\n\t\t\tif($result){\r\n\t\t\t\t$out_trade_no = htmlspecialchars($result['out_trade_no']);\r\n\t\t\t\t$out_trade_no = format_param($out_trade_no,1);\r\n\t\t\t\t$orderno = $out_trade_no;\r\n\t\t\t\t$paytime = time();\r\n\t\t\t\t\r\n\t\t\t\tif($order['ispay']==1){\r\n\t\t\t\t\t//跳转对应查询详情\r\n\t\t\t\t\t//Success('支付成功！',U('User/details',['id'=>$order['id']]));\r\n\t\t\t\t\t$this->overpay($order['orderno']);\r\n\t\t\t\t\texit;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]);\r\n\t\t\t\t//检查是否金币或积分充值\r\n                if($r && $order['ptype']==2){\r\n                    //金币充值\r\n                    $this->updatemoney($order);\r\n                    \r\n                }else if($r && $order['ptype']==3){\r\n                    //积分\r\n                    $this->updatejifen($order);\r\n                }\r\n\r\n\t\t\t\t//支付成功后处理...\r\n\t\t\t\t$this->overpay($order['orderno']);\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\texit(JZLANG('订单号错误或订单被删除！'));\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic function check_wechat_order(){\r\n\t\textendFile('pay/wechat/WxpayCheckOrder.php');\r\n\t\t$mchid = $this->webconf['wx_mchid'];          //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送\r\n\t\t$appid = $this->webconf['wx_appid'];  //公众号APPID 通过微信支付商户资料审核后邮件发送\r\n\t\t$apiKey = $this->webconf['wx_key'];   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥\r\n\t\t$outTradeNo = $this->frparam('orderno',1);     //要查询的订单号\r\n\t\t\r\n\t\t$order = M('orders')->find(['orderno'=>$outTradeNo]);\r\n\t\tif($outTradeNo && $order){\r\n\t\t\tif($order['ispay']==1){\r\n                if($this->frparam('ajax')){\r\n                    JsonReturn(['code'=>0,'msg'=>'success']);\r\n                }\r\n\t\t\t\t$this->overpay($outTradeNo);exit;\r\n\t\t\t}\r\n\t\t\t/** 配置结束 */\r\n\t\t\t$wxPay = new \\WxpayCheckOrder($mchid,$appid,$apiKey);\r\n\t\t\t$res = $wxPay->orderquery($outTradeNo);\r\n\t\t\t//echo json_encode($result);die;\r\n\t\t\t//$res = json_encode($result);\r\n\t\t\tif($res['code']==0){\r\n\t\t\t\t$r = M('orders')->update(['orderno'=>$outTradeNo,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>time()]);\r\n\t\t\t\t//检查是否金币或积分充值\r\n                if($r && $order['ptype']==2){\r\n                    //金币充值\r\n                    $this->updatemoney($order);\r\n                    \r\n                }else if($r && $order['ptype']==3){\r\n                    //积分\r\n                    $this->updatejifen($order);\r\n                }\r\n\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>'success']);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$this->overpay($outTradeNo);\r\n\t\t\t}else{\r\n\t\t\t\t\r\n\t\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>$res['msg']]);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tError($res['msg'],U('Order/details',['orderno'=>$outTradeNo]));\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t}\r\n\t\r\n\tprivate function updatejifen($order){\r\n\t    if($order && $order['ptype']==3){\r\n            M('member')->goInc(['id'=>$order['userid']],'jifen',$order['jifen']);\r\n            $ww['userid'] = $order['userid'];\r\n            $ww['amount'] = $order['jifen'];\r\n            $ww['money'] = $order['price'];\r\n            $ww['type'] = 1;\r\n            $ww['msg'] = JZLANG('在线充值');\r\n            $ww['orderno'] = $order['orderno'];\r\n            $ww['buytype'] = 'jifen';\r\n            $ww['addtime'] = time();\r\n            M('buylog')->add($ww);\r\n        }\r\n       \r\n        return true;\r\n    }\r\n    \r\n    private function updatemoney($order){\r\n        if($order && $order['ptype']==2){\r\n            M('member')->goInc(['id'=>$order['userid']],'money',$order['jifen']);\r\n            $ww['userid'] = $order['userid'];\r\n            $ww['amount'] = $order['jifen'];\r\n            $ww['money'] = $order['price'];\r\n            $ww['type'] = 1;\r\n            $ww['msg'] = JZLANG('在线充值');\r\n            $ww['orderno'] = $order['orderno'];\r\n            $ww['buytype'] = 'money';\r\n            $ww['addtime'] = time();\r\n            M('buylog')->add($ww);\r\n        }\r\n        \r\n        return true;\r\n    }\r\n\t\r\n\tprivate function overpay($orderno){\r\n\t\t$order = M('orders')->find(['orderno'=>$orderno,'ispay'=>1]);\r\n\r\n\t\tif($orderno && $order){\r\n\t\t\t\r\n\t\t\t$this->order = $order;\r\n\t\t\t$this->display($this->template.'/paytpl/overpay');\r\n\t\t}else{\r\n\t\t\texit(JZLANG('订单未支付或订单号错误！'));\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n\tpublic function wechat_scan_over(){\r\n\t\t$orderno = $this->frparam('orderno',1);\r\n\t\t$order = M('orders')->find(['orderno'=>$orderno,'ispay'=>1]);\r\n\r\n\t\tif($orderno && $order){\r\n\t\t\t\r\n\t\t\t$this->order = $order;\r\n\t\t\t$this->display($this->template.'/paytpl/overpay');\r\n\t\t}else{\r\n\t\t\texit(JZLANG('订单未支付或订单号错误！'));\r\n\t\t}\r\n\t}\r\n\t\r\n\t\r\n\r\n\t\r\n}"
  },
  {
    "path": "app/home/c/OrderController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/08\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass OrderController extends CommonController\n{\n\tfunction _init(){\n\t\tparent::_init();\n\t\tif(!$this->islogin){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('您还未登录，请重新登录！')]);\n\t\t\t}\n\t\t\tError(JZLANG('您还未登录，请重新登录！'),U('Login/index'));\n\t\t}\n\t\t\n\t}\n\t\n\t\n\t\n\tfunction create(){\n\t\tif($this->frparam('go')){\n            $carts = [];\n            if(isset($GLOBALS['Redis'])){\n                $carts = explode('||',$GLOBALS['Redis']->get('cart'));\n            }else if(isset($_SESSION['cart']) && $_SESSION['cart']!=''){\n                $carts = explode('||',$_SESSION['cart']);\n            }\n\n            if(is_array($carts) && count($carts)>0){\n\t\t\t\t$group = M('member_group')->find(['id'=>$this->member['gid']]);\n\t\t\t\t$new = [];\n\t\t\t\t$price = 0.00;\n\t\t\t\t$w = [];\n\t\t\t\t$newcart = [];\n\t\t\t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t$w['userid'] = $this->member['id'];\n\t\t\t\t$w['tel'] = $this->member['tel']; \n\t\t\t\t$w['username'] = $this->member['username']; \n\t\t\t\t$w['addtime'] = time(); \n\t\t\t\t$qianbao = 0;\n\t\t\t\t$jifen = 0;\n\t\t\t\tforeach($carts as $v){\n\t\t\t\t\t$d = explode('-',$v);\n\t\t\t\t\t//tid-id-num\n\t\t\t\t\tif($d[0]!='' && $d[1]!='' && $d[2]!='' && $d[2]!=0 && intval($d[2])>0){\n\t\t\t\t\t\t$type = $this->classtypedata[$d[0]];\n\t\t\t\t\t\t$info = M($type['molds'])->find(['id'=>$d[1]]);\n\t\t\t\t\t\t//tid-id-num-price\n\t\t\t\t\t\t$new[]=$d[0].'-'.$d[1].'-'.$d[2].'-'.$info['price'];\n\t\t\t\t\t\t$price+=$d[2]*$info['price'];\n\t\t\t\t\t\t\n\t\t\t\t\t\t$newcart[]=['info'=>M($type['molds'])->find(['id'=>$d[1]]),'num'=>$d[2],'price'=>$info['price'],'tid'=>$d[0]];\n\t\t\t\t\t\tif(isset($info['jifen']) && $info['jifen']!=0){\n\t\t\t\t\t\t\t$jifen+=$d[2]*$info['jifen'];\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$jifen+=$d[2]*$d[3]*($this->webconf['jifen_exchange']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$qianbao+=$d[2]*$d[3]*($this->webconf['money_exchange']);\n\t\t\t\t\t}\n\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//运费\n\t\t\t\t$yunfei = $this->webconf['yunfei'];\n\t\t\t\t//折扣\n\t\t\t\t$discount = 0.00;\n\t\t\t\tif($group['discount_type']==1){\n\t\t\t\t\t$discount = $group['discount'];\n\t\t\t\t}else if($group['discount_type']==2){\n\t\t\t\t\t$discount = round((1-$group['discount'])*$price,2);\n\t\t\t\t}\n\t\t\t\t$w['body'] = '||'.implode('||',$new).'||';\n\t\t\t\t$w['yunfei'] = $yunfei;\n\t\t\t\t$w['discount'] = $discount;\n\t\t\t\t$w['price'] = $price-$discount+$yunfei;\n\t\t\t\tif($w['price']<0){\n\t\t\t\t\t$w['price'] = 0;\n\t\t\t\t}\n\t\t\t\t$res = M('orders')->add($w);\n\t\t\t\tif($res){\n\t\t\t\t\t//减库存\n\t\t\t\t\t$allproduct = $carts;\n\t\t\t\t\tforeach($allproduct as $v){\n\t\t\t\t\t\tif($v!=''){\n\t\t\t\t\t\t\t$d = explode('-',$v);\n\t\t\t\t\t\t\t//tid-id-num-price\n\t\t\t\t\t\t\tif($d[0]!=''){\n\t\t\t\t\t\t\t\t$type = $this->classtypedata[$d[0]];//栏目\n\t\t\t\t\t\t\t\t$num = (int)$d[2];\n\t\t\t\t\t\t\t\t$r = M($type['molds'])->goDec(['id'=>$d[1]],'stock_num',$num);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t$_SESSION['cart'] = '';\n                    if(isset($GLOBALS['Redis'])){\n                        $GLOBALS['Redis']->del('cart');\n                    }\n\t\t\t\t\t$this->carts = $newcart;\n\t\t\t\t\t$this->qianbao = $qianbao+$discount*($this->webconf['money_exchange'])-$yunfei*($this->webconf['money_exchange']);\n\t\t\t\t\t$this->jifen = $jifen+$discount*($this->webconf['jifen_exchange'])-$yunfei*($this->webconf['jifen_exchange']);\n\t\t\t\t\t$this->order = M('orders')->find(['id'=>$res]);\n\t\t\t\t\tif($this->webconf['isopenjifen']==1){\n\t\t\t\t\t\tM('orders')->update(['id'=>$res],['jifen'=>$this->jifen]);\n\t\t\t\t\t}\n\t\t\t\t\tif($this->webconf['isopenqianbao']==1){\n\t\t\t\t\t\tM('orders')->update(['id'=>$res],['qianbao'=>$this->qianbao]);\n\t\t\t\t\t}\n\t\t\t\t\t$this->display($this->template.'/user/payment');\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\tError(JZLANG('创建订单失败！'));\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tRedirect(U('user/cart'));\n\t\t\t}\n\t\t}else{\n\t\t\tRedirect(U('user/cart'));\n\t\t}\n\t\t\n\t}\n\t\n\t\n\t//支付处理\n\tfunction pay(){\n\t\tif($this->frparam('go')){\n\t\t\t//保存提交信息\n\t\t\t$return_url = U('user/orderdetails',['orderno'=>$this->frparam('orderno',1)]);\n\t\t\t$w['orderno'] = $this->frparam('orderno',1);\n\t\t\t$w['receive_username'] = $this->frparam('username',1);\n\t\t\t$w['receive_tel'] = $this->frparam('tel',1);\n\t\t\t$w['receive_email'] = $this->frparam('email',1);\n\t\t\t$w['receive_address'] = $this->frparam('address',1);\n\t\t\t$paytype = $this->frparam('paytype',0,1);//默认支付宝支付1，2微信支付\n\t\t\t\n\t\t\t$order = M('orders')->find(['orderno'=>$w['orderno']]);\n\t\t\tif(!$order || !$w['orderno']){\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('订单号不存在或已被删除！'),'url'=>$return_url]);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tError(JZLANG('订单号不存在或已被删除！'),$return_url);\n\t\t\t}\n\t\t\t//购物订单\n\t\t\tif($order['ptype']==1){\n\t\t\t\tif($w['receive_username']=='' || $w['receive_tel']=='' || $w['receive_address']==''){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('收件人、手机号和收货地址不能为空！'),'url'=>$return_url]);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tError(JZLANG('收件人、手机号和收货地址不能为空！'),$return_url);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t//充值订单\n\t\t\t\t//检查是否支持在线支付\n\t\t\t\tif($this->webconf['paytype']==0){\n\t\t\t\t\tError(JZLANG('未开启在线支付！'),$return_url);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t//保存信息\n\t\t\t$res = M('orders')->update(['id'=>$order['id']],$w);\n\n\t\t\t//未设置在线支付\n\t\t\t//提示接收信息邮箱\n\t\t\t//检测是否已经配置邮件发送\n\t\t\tif($this->webconf['isopenemail']==1 && $order['ptype']==1){\n\t\t\t\tif($this->webconf['email_server'] && $this->webconf['email_port'] &&  $this->webconf['send_email'] &&  $this->webconf['send_pass']){\n\t\t\t\t\t$title = JZLANG('您的订单提交成功通知').'-'.$this->webconf['web_name'];\n\t\t\t\t\tif($this->webconf['tj_msg']!=''){\n\t\t\t\t\t\t$body = str_replace('{xxx}',$w['receive_username'],$this->webconf['tj_msg']);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$body = JZLANG('尊敬的').$w['receive_username'].JZLANG('我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$body.='<br/>'.JZLANG('订单详细信息如下').'：<br/>';\n\t\t\t\t\t$body.='<table style=\"min-width:500px\">\n\t\t\t\t\t<tr><th width=\"20%\">'.JZLANG('主图').'</th><th width=\"20%\">'.JZLANG('商品').'</th><th width=\"20%\">'.JZLANG('价格').'</th><th width=\"20%\">'.JZLANG('购买数量').'</th><th width=\"20%\">'.JZLANG('总价').'</th></tr>';\n\t\t\t\t\t\n\t\t\t\t\tforeach(explode('||',$order['body']) as $v){\n\t\t\t\t\t\tif($v!=''){\n\t\t\t\t\t\t\t$d = explode('-',$v);\n\t\t\t\t\t\t\t//tid-id-num-price\n\t\t\t\t\t\t\tif($d[0]!=''){\n\t\t\t\t\t\t\t\t$type = $this->classtypedata[$d[0]];//栏目\n\t\t\t\t\t\t\t\t$product = M($type['molds'])->find(['id'=>$d[1]]);\n\t\t\t\t\t\t\t\t$body.='<tr><td width=\"20%\"><img width=\"200px\" src=\"'.get_domain().$product['litpic'].'\" /></td><td width=\"20%\">'.$product['title'].'</td><td width=\"20%\">'.JZLANG('￥').$d[3].JZLANG('元').'</td><td width=\"20%\">'.$d[2].'</td><td width=\"20%\">'.JZLANG('￥').($d[3]*$d[2]).JZLANG('元').'</td></tr>';\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$body.='<tr><td>'.JZLANG('折扣').'：</td><td colspan=\"4\">'.JZLANG('￥').$order['discount'].JZLANG('元').'</td></tr><tr><td>'.JZLANG('运费').'：</td><td colspan=\"4\">'.JZLANG('￥').$order['yunfei'].JZLANG('元').'</td></tr><tr><td>'.JZLANG('合计').'：</td><td colspan=\"4\">￥'.$order['price'].'元</td></tr></table><br/>';\n\t\t\t\t\t$body.=JZLANG('收件地址').'：'.$w['receive_address'].' '.JZLANG('联系电话').'：'.$w['receive_tel'];\n\t\t\t\t\tif($this->webconf['shou_email']!=''){\n\t\t\t\t\t\tsend_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$w['receive_email'],$title,$body,$this->webconf['shou_email']);\n\t\t\t\t\t}else{\n\t\t\t\t\t    send_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$w['receive_email'],$title,$body); \n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif($this->webconf['paytype']==0 && $order['ptype']==1){\n\t\t\t\t\n\t\t\t\t//更新订单状态，提示收到提交订单\n\t\t\t\tM('orders')->update(['id'=>$order['id']],['isshow'=>4,'paytype'=>JZLANG('线下支付')]);\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t//交易提醒\n\t\t\t\t$task['aid'] = $order['id'];\n\t\t\t\t$task['tid'] = 0;\n\t\t\t\t$task['userid'] = $this->member['id'];\n\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t$task['molds'] = 'orders';\n\t\t\t\t$task['type'] = 'rechange';\n\t\t\t\t$task['addtime'] = time();\n\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，我们会尽快给您发货！');\n\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\n\t\t\t\tM('task')->add($task);\n\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\n\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！'),'url'=>U('user/orders')]);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tSuccess(JZLANG('我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！'),U('User/orders'));\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t}else if($paytype==1){\n\t\t\t\t//支付宝\n\t\t\t\t//检查自主平台配置\n\t\t\t\tif($order['ispay']==1){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付！'),'url'=>$return_url]);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tError(JZLANG('订单已支付！'),$return_url);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//交易提醒\n\t\t\t\t$task['aid'] = $order['id'];\n\t\t\t\t$task['tid'] = 0;\n\t\t\t\t$task['userid'] = $this->member['id'];\n\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t$task['molds'] = 'orders';\n\t\t\t\t$task['type'] = 'rechange';\n\t\t\t\t$task['addtime'] = time();\n\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，请尽快支付！');\n\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\n\t\t\t\tM('task')->add($task);\n\t\t\t\tif(isMobile()){\n\t\t\t\t\t//手机端\n\t\t\t\t\tif(isWeixin()){\n\t\t\t\t\t\t//微信内\n\t\t\t\t\t\t$order['paytype'] = 'h5alipay';\n\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝H5支付')]);\n\t\t\t\t\t\textendFile('pay/alipay/AlipayService.php');\n\t\t\t\t\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID\n\t\t\t\t\t\t$returnUrl = U('Mypay/alipay_return_pay');     //付款成功后的同步回调地址\n\t\t\t\t\t\t$notifyUrl = U('Mypay/alipay_notify_pay');     //付款成功后的异步回调地址\n\t\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\n\t\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\n\t\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\n                        $rsaPrivateKey = $this->webconf['alipay_private_key'];\n                        $aliPay = new \\AlipayService();\n                        $aliPay->setAppid($appid);\n                        $aliPay->setReturnUrl($returnUrl);\n                        $aliPay->setNotifyUrl($notifyUrl);\n                        $aliPay->setRsaPrivateKey($rsaPrivateKey);\n                        $aliPay->setTotalFee($payAmount);\n                        $aliPay->setOutTradeNo($outTradeNo);\n                        $aliPay->setOrderName($orderName);\n                        $payConfigs = $aliPay->wxPay();\n                        $this->queryStr = http_build_query($payConfigs);\n                        $this->display($this->template.'/paytpl/alipay_in_weixin');\n\t\t\t\t\t\texit;\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//支付宝H5支付\n\t\t\t\t\t\t$order['paytype'] = 'h5alipay';\n\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝H5支付')]);\n\t\t\t\t\t\t/*** 请填写以下配置信息 ***/\n\t\t\t\t\t\textendFile('pay/alipay/AlipayService.php');\n\t\t\t\t\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID\n\t\t\t\t\t\t$returnUrl = U('Mypay/alipay_return_pay');     //付款成功后的同步回调地址\n\t\t\t\t\t\t$notifyUrl = U('Mypay/alipay_notify_pay');     //付款成功后的异步回调地址\n\t\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\n\t\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\n\t\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\n\t\t\t\t\t\t$signType = 'RSA2';\t\t\t//签名算法类型，支持RSA2和RSA，推荐使用RSA2\n\t\t\t\t\t\t$rsaPrivateKey=$this->webconf['alipay_private_key'];\t\t//商户私钥，填写对应签名算法类型的私钥，如何生成密钥参考：https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310\n\t\t\t\t\t\t/*** 配置结束 ***/\n\t\t\t\t\t\t$aliPay = new \\AlipayService();\n\t\t\t\t\t\t$aliPay->setAppid($appid);\n\t\t\t\t\t\t$aliPay->setReturnUrl($returnUrl);\n\t\t\t\t\t\t$aliPay->setNotifyUrl($notifyUrl);\n\t\t\t\t\t\t$aliPay->setRsaPrivateKey($rsaPrivateKey);\n\t\t\t\t\t\t$aliPay->setTotalFee($payAmount);\n\t\t\t\t\t\t$aliPay->setOutTradeNo($outTradeNo);\n\t\t\t\t\t\t$aliPay->setOrderName($orderName);\n\t\t\t\t\t\t$sHtml = $aliPay->mPay();\n\t\t\t\t\t\techo $sHtml;exit;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t//PC\n\t\t\t\t\t$order['paytype'] = 'alipay';\n\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('电脑支付宝支付')]);\n\t\t\t\t\t/*** 请填写以下配置信息 ***/\n\t\t\t\t\textendFile('pay/alipay/AlipayService.php');\n\t\t\t\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID\n\t\t\t\t\t$returnUrl = U('Mypay/alipay_return_pay');     //付款成功后的同步回调地址\n\t\t\t\t\t$notifyUrl = U('Mypay/alipay_notify_pay');     //付款成功后的异步回调地址\n\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\n\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\n\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\n\t\t\t\t\t$signType = 'RSA2';\t\t\t//签名算法类型，支持RSA2和RSA，推荐使用RSA2\n\t\t\t\t\t$rsaPrivateKey = $this->webconf['alipay_private_key'];\t\t//商户私钥，填写对应签名算法类型的私钥，如何生成密钥参考：https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310\n\t\t\t\t\t/*** 配置结束 ***/\n\t\t\t\t\t$aliPay = new \\AlipayService();\n\t\t\t\t\t$aliPay->setAppid($appid);\n\t\t\t\t\t$aliPay->setReturnUrl($returnUrl);\n\t\t\t\t\t$aliPay->setNotifyUrl($notifyUrl);\n\t\t\t\t\t$aliPay->setRsaPrivateKey($rsaPrivateKey);\n\t\t\t\t\t$aliPay->setTotalFee($payAmount);\n\t\t\t\t\t$aliPay->setOutTradeNo($outTradeNo);\n\t\t\t\t\t$aliPay->setOrderName($orderName);\n\t\t\t\t\t$sHtml = $aliPay->doPay();\n\t\t\t\t\techo $sHtml;\n\t\t\t\t\texit;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t}else if($paytype==2){\n\t\t\t\t//微信\n\t\t\t\t//检查自主平台配置\n\t\t\t\tif($order['ispay']==1){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付！'),'url'=>$return_url]);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tError(JZLANG('订单已支付！'),$return_url);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//交易提醒\n\t\t\t\t$task['aid'] = $order['id'];\n\t\t\t\t$task['tid'] = 0;\n\t\t\t\t$task['userid'] = $this->member['id'];\n\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t$task['molds'] = 'orders';\n\t\t\t\t$task['type'] = 'rechange';\n\t\t\t\t$task['addtime'] = time();\n\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，请尽快支付！');\n\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\n\t\t\t\tM('task')->add($task);\n\t\t\t\tif(isMobile()){\n\t\t\t\t\t//手机端\n\t\t\t\t\tif(isWeixin()){\n\t\t\t\t\t\t//微信内\n\t\t\t\t\t\t$order['paytype'] = 'wxpay';\n\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信内支付')]);\n\t\t\t\t\t\t$url = U('order/wxpay').'?'.http_build_query($order);\n\t\t\t\t\t\tRedirect($url);\n\t\t\t\t\t\t\n\t\t\t\t\t\texit;\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//微信H5支付\n\t\t\t\t\t\t$order['paytype'] = 'h5wxpay';\n\t\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信H5支付')]);\n\t\t\t\t\t\textendFile('pay/wechat/WxpayH5Service.php');\n\t\t\t\t\t\t/** 请填写以下配置信息 */\n\t\t\t\t\t\t$mchid = $this->webconf['wx_mchid'];   //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送\n\t\t\t\t\t\t$appid =  $this->webconf['wx_appid'];  //微信支付申请对应的公众号的APPID\n\t\t\t\t\t\t$appKey = $this->webconf['wx_appsecret'];   //微信支付申请对应的公众号的APP Key\n\t\t\t\t\t\t$apiKey = $this->webconf['wx_key'];   //https://pay.weixin.qq.com \n\t\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\n\t\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\n\t\t\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\n\t\t\t\t\t\t$notifyUrl = U('Mypay/wechat_notify_pay');     //付款成功后的回调地址(不要有问号)\n\t\t\t\t\t\t//$returnUrl = U('Mypay/check_wechat_order').'?orderno='.$order['orderno'];     //付款成功后，页面跳转的地址\n\t\t\t\t\t\t$returnUrl = U('order/wxh5pay').'?orderno='.$order['orderno'];     //付款成功后，页面跳转的地址\n\t\t\t\t\t\t$wapUrl = $_SERVER['HTTP_HOST'];   //WAP网站URL地址\n\t\t\t\t\t\t$wapName = $this->webconf['web_name']; //WAP 网站名\n\t\t\t\t\t\t$webip = GetIP();\n\t\t\t\t\t\t/** 配置结束 */\n\n\t\t\t\t\t\t$wxPay = new \\WxpayH5Service($mchid,$appid,$apiKey);\n\t\t\t\t\t\t$wxPay->setTotalFee($payAmount);\n\t\t\t\t\t\t$wxPay->setOutTradeNo($outTradeNo);\n\t\t\t\t\t\t$wxPay->setOrderName($orderName);\n\t\t\t\t\t\t$wxPay->setNotifyUrl($notifyUrl);\n\t\t\t\t\t\t$wxPay->setReturnUrl($returnUrl);\n\t\t\t\t\t\t$wxPay->setWapUrl($wapUrl);\n\t\t\t\t\t\t$wxPay->setWapName($wapName);\n\t\t\t\t\t\t$wxPay->setIp($webip);\n\n\t\t\t\t\t\t$mwebUrl= $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl);\n\t\t\t\t\t\t//echo \"<h1><a href='{$mwebUrl}'>点击跳转至支付页面</a></h1>\";\n\t\t\t\t\t\theader('Location:'.$mwebUrl);\n\t\t\t\t\t\texit;\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\t//PC\n\t\t\t\t\t$order['paytype'] = 'scanwxpay';\n\t\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信扫码支付')]);\n\t\t\t\t\textendFile('pay/wechat/WxpayScan.php');\n\t\t\t\t\t//微信扫码支付\n\t\t\t\t\t$mchid = $this->webconf['wx_mchid'];   //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送\n\t\t\t\t\t$appid =  $this->webconf['wx_appid'];  //微信支付申请对应的公众号的APPID\n\t\t\t\t\t$appKey = $this->webconf['wx_appsecret'];   //微信支付申请对应的公众号的APP Key\n\t\t\t\t\t$apiKey = $this->webconf['wx_key'];   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥\n\t\t\t\t\t$wxPay = new \\WxpayScan($mchid,$appid,$apiKey);\n\t\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\n\t\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\n\t\t\t\t\t$orderName = JZLANG('支付订单').':'.$order['orderno'];    //订单标题\n\t\t\t\t\t$notifyUrl = U('Mypay/wechat_notify_pay');    //付款成功后的回调地址(不要有问号)\n\t\t\t\t\t$payTime = time();      //付款时间\n\t\t\t\t\t$arr = $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime);\n\t\t\t\t\t//生成二维码\n\t\t\t\t\t$url = U('Common/qrcode').'?data='.$arr['code_url'];\n\t\t\t\t\t$this->url = $url;\n\t\t\t\t\t$this->data = $arr['code_url'];\n\t\t\t\t\t$this->payAmount = $payAmount;\n\t\t\t\t\t$this->orderno = $outTradeNo;\n\t\t\t\t\t$this->display($this->template.'/paytpl/wechat_scan');\n\t\t\t\t\t//echo \"<img src='{$url}' style='width:300px;'><br>\";\n\t\t\t\t\t//echo '二维码内容：'.$arr['code_url'];\n\t\t\t\t\texit;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else if($paytype==3){\n\t\t\t\tif($this->webconf['isopenqianbao']!=1){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('未开启钱包支付！'),'url'=>$return_url]);\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('未开启钱包支付！'),$return_url);\n\t\t\t\t}\n\t\t\t\t//钱包支付\n\t\t\t\t$money = M('member')->getField(['id'=>$this->member['id']],'money');\n\t\t\t\t\n\t\t\t\t$allmoney = $order['price']*$this->webconf['money_exchange'];\n\t\t\t\tif($money<$allmoney){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('钱包金额不足，请充值！'),'url'=>$return_url]);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tError(JZLANG('钱包金额不足，请充值！'),$return_url);\n\t\t\t\t}\n\n\t\t\t\t$money_x = $money-$allmoney;\n\t\t\t\t$paytime = time();\n\t\t\t\tM('orders')->update(['id'=>$order['id']],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime,'paytype'=>JZLANG('钱包支付')]);\n\t\t\t\tM('member')->update(['id'=>$order['userid']],['money'=>$money_x]);\n\t\t\t\t$ww['userid'] = $order['userid'];\n\t\t\t\t$ww['amount'] = $allmoney;\n\t\t\t\t$ww['money'] = $order['price'];\n\t\t\t\t$ww['type'] = 2;\n\t\t\t\t$ww['msg'] = JZLANG('钱包支付');\n\t\t\t\t$ww['orderno'] = $order['orderno'];\n\t\t\t\t$ww['buytype'] = 'money';\n\t\t\t\t$ww['addtime'] = $paytime;\n\t\t\t\tM('buylog')->add($ww);\n\n\t\t\t\t$_SESSION['member']['money'] = $money_x;\n\t\t\t\t$order['ispay'] = 1;\n\t\t\t\t$order['isshow'] = 2;\n\t\t\t\t$order['paytime'] = $paytime;\n\t\t\t\t$order['paytype'] = JZLANG('钱包支付');\n\t\t\t\t$this->order = $order;\n\t\t\t\t//交易提醒\n\t\t\t\t$task['aid'] = $order['id'];\n\t\t\t\t$task['tid'] = 0;\n\t\t\t\t$task['userid'] = $this->member['id'];\n\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t$task['molds'] = 'orders';\n\t\t\t\t$task['type'] = 'rechange';\n\t\t\t\t$task['addtime'] = time();\n\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，我们会尽快给您发货！');\n\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\n\t\t\t\tM('task')->add($task);\n\n\t\t\t\t$this->display($this->template.'/paytpl/overpay');\n\t\t\t\texit;\n\n\t\t\t}else if($paytype==4){\n\t\t\t\tif($this->webconf['isopenjifen']!=1){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('未开启积分支付！'),'url'=>$return_url]);\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('未开启积分支付！'),$return_url);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//积分支付\n\t\t\t\t$jifen = M('member')->getField(['id'=>$this->member['id']],'jifen');\n\t\t\t\t$allmoney = $order['price']*$this->webconf['jifen_exchange'];\n\t\t\t\t//$allmoney = $order['jifen'];\n\t\t\t\tif($jifen<$order['jifen']){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('积分不足，请充值！'),'url'=>$return_url]);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tError(JZLANG('积分不足，请充值！'),$return_url);\n\t\t\t\t}\n\t\t\t\t$money_x = $jifen-$allmoney;\n\t\t\t\t$paytime = time();\n\t\t\t\tM('orders')->update(['id'=>$order['id']],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime,'paytype'=>JZLANG('积分兑换')]);\n\t\t\t\t\n\t\t\t\tM('member')->update(['id'=>$order['userid']],['jifen'=>$money_x]);\n\t\t\t\t$ww['userid'] = $order['userid'];\n\t\t\t\t$ww['amount'] = $allmoney;\n\t\t\t\t$ww['money'] = $order['price'];\n\t\t\t\t$ww['type'] = 2;\n\t\t\t\t$ww['msg'] = JZLANG('积分兑换');\n\t\t\t\t$ww['orderno'] = $order['orderno'];\n\t\t\t\t$ww['buytype'] = 'jifen';\n\t\t\t\t$ww['addtime'] = $paytime;\n\t\t\t\tM('buylog')->add($ww);\n\n\t\t\t\t$_SESSION['member']['jifen'] = $money_x;\n\t\t\t\t$order['ispay'] = 1;\n\t\t\t\t$order['isshow'] = 2;\n\t\t\t\t$order['paytime'] = $paytime;\n\t\t\t\t$order['paytype'] = JZLANG('积分兑换');\n\t\t\t\t$this->order = $order;\n\t\t\t\t//交易提醒\n\t\t\t\t$task['aid'] = $order['id'];\n\t\t\t\t$task['tid'] = 0;\n\t\t\t\t$task['userid'] = $this->member['id'];\n\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t$task['molds'] = 'orders';\n\t\t\t\t$task['type'] = 'rechange';\n\t\t\t\t$task['addtime'] = time();\n\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，我们会尽快给您发货！');\n\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\n\t\t\t\tM('task')->add($task);\n\t\t\t\t$this->display($this->template.'/paytpl/overpay');\n\t\t\t\texit;\n\t\t\t}else if($paytype==5){\n\t\t\t\t// 支付宝当面付\n\t\t\t\t//检查自主平台配置\n\t\t\t\tif($order['ispay']==1){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付！'),'url'=>$return_url]);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tError(JZLANG('订单已支付！'),$return_url);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//交易提醒\n\t\t\t\t$task['aid'] = $order['id'];\n\t\t\t\t$task['tid'] = 0;\n\t\t\t\t$task['userid'] = $this->member['id'];\n\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t$task['molds'] = 'orders';\n\t\t\t\t$task['type'] = 'rechange';\n\t\t\t\t$task['addtime'] = time();\n\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，请尽快支付！');\n\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\n\t\t\t\tM('task')->add($task);\n\t\t\t\t\n\t\t\t\t$order['paytype'] = 'dmfalipay';\n\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝当面付')]);\n\t\t\t\t/*** 请填写以下配置信息 ***/\n\t\t\t\textendFile('pay/alipay/AlipayService.php');\n\t\t\t\t$appid = $this->webconf['alipay_partner'];  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID\n\t\t\t\t$returnUrl = U('Mypay/alipay_return_pay');     //付款成功后的同步回调地址\n\t\t\t\t$notifyUrl = U('Mypay/alipay_notify_pay');     //付款成功后的异步回调地址\n\t\t\t\t$outTradeNo = $order['orderno'];     //你自己的商品订单号\n\t\t\t\t$payAmount = $order['price'];          //付款金额，单位:元\n\t\t\t\t$orderName = JZLANG('支付订单').'-'.$order['orderno'];    //订单标题\n\t\t\t\t$signType = 'RSA2';\t\t\t//签名算法类型，支持RSA2和RSA，推荐使用RSA2\n\t\t\t\t$rsaPrivateKey=$this->webconf['alipay_private_key'];\t\t//商户私钥，填写对应签名算法类型的私钥，如何生成密钥参考：https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310\n\t\t\t\t/*** 配置结束 ***/\n\t\t\t\t$aliPay = new \\AlipayService();\n\t\t\t\t$aliPay->setAppid($appid);\n\t\t\t\t$aliPay->setReturnUrl($returnUrl);\n\t\t\t\t$aliPay->setNotifyUrl($notifyUrl);\n\t\t\t\t$aliPay->setRsaPrivateKey($rsaPrivateKey);\n\t\t\t\t$aliPay->setTotalFee($payAmount);\n\t\t\t\t$aliPay->setOutTradeNo($outTradeNo);\n\t\t\t\t$aliPay->setOrderName($orderName);\n\t\t\t\t$result = $aliPay->dmfPay();\n\t\t\t\t$result = $result['alipay_trade_precreate_response'];\n\t\t\t\tif($result['code'] && $result['code']=='10000'){\n\t\t\t\t\t$url = U('common/qrcode').'?data='.$result['qr_code'];\n\t\t\t\t\t//echo '<img src=\"'.$url.'\" style=\"width:300px;\"><br>';\n\t\t\t\t\t$this->url = $url;\n\t\t\t\t\t$this->payAmount = $payAmount;\n\t\t\t\t\t$this->order = $order;\n\t\t\t\t\t$this->orderno = $order['orderno'];\n\t\t\t\t\t$this->display($this->template.'/paytpl/dmf');\n\t\t\t\t\texit;\n\t\t\t\t}else{\n\t\t\t\t\techo $result['msg'].' : '.$result['sub_msg'];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\t\n\t\t\t\t//交易提醒\n\t\t\t\t$task['aid'] = $order['id'];\n\t\t\t\t$task['tid'] = 0;\n\t\t\t\t$task['userid'] = $this->member['id'];\n\t\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t\t$task['molds'] = 'orders';\n\t\t\t\t$task['type'] = 'rechange';\n\t\t\t\t$task['addtime'] = time();\n\t\t\t\t$task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交，请尽快支付！');\n\t\t\t\t$task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]);\n\t\t\t\tM('task')->add($task);\n\t\t\t\t\n\t\t\t\t//进入第三方支付内\n\t\t\t\t$order['paytype'] = $this->frparam('payname',1,JZLANG('其他平台支付'));\n\t\t\t\tM('orders')->update(['id'=>$order['id']],['paytype'=>$order['paytype']]);\n\t\t\t\t$controller = $this->frparam('c',1);\n\t\t\t\t$url = U($controller.'/pay').'?'.http_build_query($order);\n\t\t\t\tRedirect($url);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t//jsapi\n\tfunction wxpay(){\n\t\t\t\n\t\t\t//微信支付\n\t\t\t\n\t\t\textendFile('pay/wechat/WxpayService.php');\n\t\t\t$mchid = $this->webconf['wx_mchid'];   //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送\n\t\t\t$appid =  $this->webconf['wx_appid'];  //微信支付申请对应的公众号的APPID\n\t\t\t$appKey = $this->webconf['wx_appsecret'];   //微信支付申请对应的公众号的APP Key\n\t\t\t$apiKey = $this->webconf['wx_key'];   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥\n\t\t\t//①、获取用户openid\n\t\t\t$wxPay = new \\WxpayService($mchid,$appid,$appKey,$apiKey);\n\t\t\t$openId = $wxPay->GetOpenid();      //获取openid\n\t\t\t\n\t\t\tif(!$openId) exit(JZLANG('获取openid失败'));\n\t\t\t//②、统一下单\n\t\t\t$outTradeNo = $this->frparam('orderno',1);     //你自己的商品订单号\n\t\t\t$payAmount = $this->frparam('price',3);          //付款金额，单位:元\n\t\t\t$orderName = JZLANG('支付订单').'：'.$outTradeNo;    //订单标题\n\t\t\t$notifyUrl = U('Mypay/wechat_notify_pay');     //付款成功后的回调地址(不要有问号)\n\t\t\t$returnUrl = U('Mypay/check_wechat_order',['orderno'=>$outTradeNo]);     //付款成功后的回调地址(不要有问号)\n\t\t\t$payTime = JZLANG('支付订单').'-'.$outTradeNo;      //付款时间\n\t\t\t$jsApiParameters = $wxPay->createJsBizPackage($openId,$payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime);\n\t\t\t\n\t\t\t$this->payAmount = $payAmount;\n\t\t\t$this->returnUrl = $returnUrl;\n\t\t\t$jsApiParameters = json_encode($jsApiParameters);\n\t\t\t$this->jsApiParameters = $jsApiParameters;\n\t\t\t$this->order = M('orders')->find(['orderno'=>$outTradeNo]);\n\t\t\t$this->display($this->template.'/paytpl/wechat_pay');\n\t\t\texit;\n\n\t}\n\n\t//微信h5支付验证\n\tfunction wxh5pay(){\n\t\t$this->orderno = $this->frparam('orderno',1);\n\t\tif(!$this->orderno){\n\t\t\tError(JZLANG('链接错误！'));\n\t\t}\n\t\t$this->display($this->template.'/paytpl/wechat_h5_pay');\n\t\texit;\n\t}\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/home/c/ScreenController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2019/08\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace app\\home\\c;\r\n\r\n\r\nuse frphp\\extend\\Page;\r\n\r\nclass ScreenController extends CommonController\r\n{\r\n\tfunction index(){\r\n\t\t//检测三个参数是否存在\r\n\t\tif(!$this->frparam('molds',1) || !$this->frparam('tid') || !$this->frparam('jz_screen',1)){\r\n\t\t\t$this->error(JZLANG('参数错误！'));\r\n\t\t}\r\n\t\tif(!M('molds')->find(['biaoshi'=>$this->frparam('molds',1)])){\r\n\t\t\t$this->error(JZLANG('非法参数！'));\r\n\t\t}\r\n        if(isset($GLOBALS['Redis'])){\r\n            if(!$GLOBALS['Redis']->get('screen')){\r\n                $GLOBALS['Redis']->setex('screen',SessionTime,'');\r\n            }\r\n            $str = $GLOBALS['Redis']->get('screen');\r\n            $session_screen = $str ? json_decode($str,true) : [];\r\n        }else if(session_id()){\r\n            if(!isset($_SESSION['screen'])){\r\n                $_SESSION['screen'] = [];\r\n            }\r\n            $session_screen = $_SESSION['screen'];\r\n        }else{\r\n            if(!isset($_COOKIE['screen'])){\r\n                setcookie('screen','',time() + SessionTime,'/');\r\n            }\r\n            $str = $_COOKIE['screen'];\r\n            $session_screen = $str ? json_decode($str,true) : [];\r\n        }\r\n\r\n\r\n\t\t//查询扩展字段\r\n\t\t$fields = M('fields')->findAll(['molds'=>$this->frparam('molds',1)]);\r\n\t\t$newfield = [];\r\n\t\tforeach($fields as $k=>$v){\r\n\t\t\t$newfield[$v['field']] = $v;\r\n\t\t}\r\n\t\t\r\n\t\t$res = M('classtype')->find(array('id'=>$this->frparam('tid')));\r\n\t\t\r\n\t\t//面包屑导航\r\n\t\t$classtypetree = array_reverse($this->classtypetree);\r\n\t\t$isgo = false;\r\n\t\t$newarray = [];\r\n\t\t$parent = [];//标记父类\r\n\t\t$istop = false;\r\n\t\tforeach($classtypetree as $k=>$v){\r\n\t\t\tif($v['id']==$res['id'] && !$isgo){\r\n\t\t\t\t$isgo = true;\r\n\t\t\t\t$res['level'] = $v['level'];\r\n\t\t\t\t$newarray[]=$v;\r\n\t\t\t}\r\n\t\t\tif($v['id']==$res['id'] && $v['level']==0){\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif($v['level']==0 && $v['id']!=$res['id'] && $v['id']!=$res['pid']){\r\n\t\t\t\tif(!$istop && $isgo && $parent['level']!=0){\r\n\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t$istop = true;\r\n\t\t\t\t}\r\n\t\t\t\t$isgo = false;\r\n\t\t\t}\r\n\t\t\tif($isgo &&  $v['id']!=$res['id'] && $res['level']>$v['level'] ){\r\n\t\t\t\tif($parent['pid']){\r\n\t\t\t\t\tif($parent['level']>$v['level'] && $parent['pid']!=$v['pid']){\r\n\t\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t\t$parent = $v;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$newarray[]=$v;\r\n\t\t\t\t\t$parent = $v;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t$newarray2 = array_reverse($newarray);\r\n\t\t$positions='<a href=\"'.get_domain().'\">'.JZLANG('首页').'</a>';\r\n\t\tforeach($newarray2 as $v){\r\n\t\t\t$positions.='  &gt;  <a href=\"'.$v['url'].'\">'.$v['classname'].'</a>';\r\n\t\t}\r\n\t\t$this->positions_data = $newarray2;\r\n\t\t$this->positions = $positions;\r\n\t\r\n\t\t//解析jz_screen\r\n\t\t//检测是否有page分页参数\r\n\t\t$this->frpage = 1;\r\n\t\tif(strpos($this->frparam('jz_screen',1),'page')!==false){\r\n\t\t\t$jz_screen_arr = explode('-page-',$this->frparam('jz_screen',1));\r\n\t\t\t$jz_screen = explode('-',$jz_screen_arr[0]);\r\n\t\t\t$this->frpage = (int)$jz_screen_arr[1];\r\n\t\t}else{\r\n\t\t\t$jz_screen = explode('-',$this->frparam('jz_screen',1));\r\n\t\t}\r\n\t\t\r\n\t\tif($this->frparam('page')){\r\n\t\t\t$this->frpage = $this->frparam('page');\r\n\t\t}\r\n\t\t\r\n\t\t$jz_screen_key = [];\r\n\t\t$jz_screen_value = [];\r\n\t\tforeach($jz_screen as $k=>$v){\r\n\t\t\tif($k%2==0){\r\n\t\t\t\t$jz_screen_key[]=$v;\r\n\t\t\t}else{\r\n\t\t\t\t$jz_screen_value[]=$v;\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\t$screen = array_combine($jz_screen_key,$jz_screen_value);\r\n\t\tforeach($screen as $k=>$v){\r\n\t\t\t\r\n\t\t\tif($v==0 || $v==''){\r\n\t\t\t\tif(isset($session_screen[$k])){\r\n\t\t\t\t\tunset($session_screen[$k]);\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\t$session_screen[$k] = $v;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t$sql = '1=1 and isshow=1 and addtime<='.time().' ';\r\n\t\t//组合搜索内容\r\n\t\tforeach($session_screen as $k=>$v){\r\n\t\t\tif(!array_key_exists($k,$newfield)){\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif($newfield[$k]['fieldtype']==7 || $newfield[$k]['fieldtype']==12){\r\n\t\t\t\t//单选字段\r\n\t\t\t\t\r\n\t\t\t\t//多选框判断\r\n\t\t\t\tif(strpos($v,',')!==false){\r\n\t\t\t\t\t$vv = explode(',',$v);\r\n\t\t\t\t\t$vv_arr = [];\r\n\t\t\t\t\tforeach($vv as $vs){\r\n\t\t\t\t\t\t$vv_arr[]=\" \".$k.\"='\".$vs.\"' \";\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$sql.=\" and (\".implode(' or ',$vv_arr).\") \";\r\n\t\t\t\t\t$vv = null;\r\n\t\t\t\t\t$vv_arr = null;\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql.=\" and \".$k.\"='\".$v.\"' \";\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t}else{\r\n\t\t\t\t//多选字段\r\n\t\t\t\tif(strpos($v,',')!==false){\r\n\t\t\t\t\t$vv = explode(',',$v);\r\n\t\t\t\t\t$vv_arr = [];\r\n\t\t\t\t\tforeach($vv as $vs){\r\n\t\t\t\t\t\t$vv_arr[]=\" \".$k.\" like '%,\".$vs.\",%' \";\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$sql.=\" and (\".implode(' or ',$vv_arr).\") \";\r\n\t\t\t\t\t$vv = null;\r\n\t\t\t\t\t$vv_arr = null;\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$sql.=\" and \".$k.\" like '%,\".$v.\",%' \";\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}\r\n\t\t$this->filters = $session_screen;\r\n        if(isset($GLOBALS['Redis'])){\r\n            $GLOBALS['Redis']->setex('screen',SessionTime,json_encode($session_screen,JSON_UNESCAPED_UNICODE));\r\n        }else if(session_id()){\r\n            $_SESSION['screen'] = $session_screen;\r\n        }else{\r\n            setcookie('screen',$session_screen,time() + SessionTime,'/');\r\n        }\r\n\r\n\t\t$molds = $this->frparam('molds',1);\r\n\t\t$sql .= ' and tid in ('.implode(',',$this->classtypedata[$res['id']]['children']['ids']).') ';\r\n\t\t$page = new Page($molds);\r\n\t\t//手动设置分页条数\r\n\t\t$limit = $res['lists_num'];\r\n\t\tif($this->frparam('limit')){\r\n\t\t\t$limit = $this->frparam('limit');\r\n\t\t}\r\n\t\t//echo $sql;\r\n\t\t//筛选分页的特殊性\r\n\t\t$page->typeurl = 'screen';\r\n\t\t\r\n\t\t$orders = 'istop desc,orders desc,addtime desc,id desc';\r\n\t\t$ot = $this->frparam('orders') ? $this->frparam('orders') : $res['orderstype'];\r\n\t\tswitch($ot){\r\n\t\t\tcase 1:\r\n\t\t\t\t$orders = 'istop desc,orders desc,addtime desc,id desc';\r\n\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\t$orders = 'istop desc,orders desc,id asc';\r\n\t\t\tbreak;\r\n\t\t\tcase 3:\r\n\t\t\t\t$orders = 'istop desc,orders asc';\r\n\t\t\tbreak;\r\n\t\t\tcase 4:\r\n\t\t\t\t$orders = 'istop desc,addtime desc';\r\n\t\t\tbreak;\r\n\t\t\tcase 5:\r\n\t\t\t\t$orders = 'istop desc,id asc';\r\n\t\t\tbreak;\r\n\t\t\tcase 6:\r\n\t\t\t\t$orders = 'istop desc,hits desc';\r\n\t\t\tbreak;\r\n\t\t\tcase 7:\r\n\t\t\t\t$orders = 'istop desc,addtime asc';\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t$this->currentpage = $this->frpage;\r\n\t\t$data = $page->where($sql)->orderby($orders)->limit($limit)->page($this->frpage)->go();\r\n\t\t$pages = $page->pageList(3,'-page-');\r\n\t\t\r\n\t\t$this->pages = $pages;//组合分页\r\n\t\t\r\n\t\tforeach($data as $k=>$v){\r\n\t\t\t$data[$k]['url'] = gourl($v,$v['htmlurl']);\r\n            $data[$k]['class_name'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['classname'] : '';\r\n            $data[$k]['class_url'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['url'] : '';\r\n            $data[$k]['class_litpic'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['litpic'] : '';\r\n            $data[$k]['format_addtime'] = isset($v['addtime']) ? date('Y-m-d H:i:s',$v['addtime']) : '';\r\n\t\t}\r\n\t\t$this->type = $res;\r\n\t\t$this->lists = $data;//列表数据\r\n\t\t$this->sum = $page->sum;//总数据\r\n\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\r\n\t\t$this->prevpage = $page->prevpage;//上一页\r\n\t\t$this->nextpage = $page->nextpage;//下一页\r\n\t\t$this->allpage = $page->allpage;//总页数\r\n\t\tif($this->frparam('ajax') && $this->webconf['isajax']){\r\n\t\t\tif($this->frparam('ajax_tpl',1)){\r\n\t\t\t\t$this->display($this->template.'/'.$res['molds'].'/screen_list_'.$res['lists_html']);\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t\tJsonReturn(['code'=>0,'data'=>$data,'sum'=>$this->sum,'allpage'=>$this->allpage,'listpage'=>$this->listpage]);\r\n\t\t\t\r\n\t\t}\r\n\t\r\n\t\t$this->display($this->template.'/'.$res['molds'].'/'.$res['lists_html']);\r\n\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t}\r\n    \r\n\r\n}"
  },
  {
    "path": "app/home/c/TagsController.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2019/10/18\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace app\\home\\c;\r\n\r\n\r\nuse frphp\\extend\\Page;\r\nuse FrPHP\\Extend\\ArrayPage;\r\n\r\nclass TagsController extends CommonController\r\n{\r\n\tfunction index(){\r\n\r\n\t\t$keywords = $this->frparam('tagname',1);\r\n\t\t$id = $this->frparam('id');\r\n\t\tif($keywords || $id){\r\n\t\t\tif($id){\r\n\t\t\t\t$keywords = M('tags')->getField(['id'=>$id,'isshow'=>1],'keywords');\r\n\t\t\t\tif(!$keywords){\r\n\t\t\t\t\tError(JZLANG('标签未找到或已删除！'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t$this->tagname = $keywords;\r\n\t\t\t$sql = \"keywords='\".$keywords.\"' and isshow=1  \";\r\n\t\t\t$this->tags = M('tags')->find($sql);\r\n\t\t\tif(!$this->tags){\r\n\t\t\t\tError(JZLANG('标签未找到或已删除！'));\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$tables = isset($this->webconf['tag_table']) ? ($this->webconf['tag_table'] ? explode('|',$this->webconf['tag_table']) : ['article','product']) : ['article','product'];\r\n\t\t\t$sqlx = [];\r\n\t\t\tforeach($tables as $v){\r\n\t\t\t\t$sqlx[] = \" select id,tid,litpic,title,hits,tags,keywords,molds,htmlurl,ownurl,description,body,addtime,userid,member_id from \".DB_PREFIX.$v.\" where tags like '%,\".$keywords.\",%' and isshow=1 \";\r\n\t\t\t}\r\n\t\t\t$sql = implode(' union all ',$sqlx);\r\n\t\t\t$page = new Page();\r\n\t\t\t$this->currentpage = $this->frpage;\r\n\t\t\t$data = $page->where($sql)->limit($this->frparam('limit',0,15))->page($this->frpage)->goSql();\r\n\t\t\tforeach($data as $k=>$v){\r\n\t\t\t\t$data[$k]['url'] = gourl($v,$v['htmlurl']);\r\n                $data[$k]['class_name'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['classname'] : '';\r\n                $data[$k]['class_url'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['url'] : '';\r\n                $data[$k]['class_litpic'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['litpic'] : '';\r\n                $data[$k]['format_addtime'] = isset($v['addtime']) ? date('Y-m-d H:i:s',$v['addtime']) : '';\r\n\t\t\t}\r\n\t\t\t$pages = $page->pageList(5,'/page/');\r\n\t\t\t$this->pages = $pages;//组合分页\r\n\t\t\t$this->lists = $data;//列表数据\r\n\t\t\t$this->sum = $page->sum;//总数据\r\n\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\r\n\t\t\t$this->prevpage = $page->prevpage;//上一页\r\n\t\t\t$this->nextpage = $page->nextpage;//下一页\r\n\t\t\t$this->allpage = $page->allpage;//总页数\r\n\t\t\t\r\n\t\t\tif($this->frparam('ajax')){\r\n\t\t\t\tif($this->frparam('ajax_tpl')){\r\n\t\t\t\t\t$this->display($this->template.'/ajax_tags_list');\r\n\t\t\t\t\texit;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tJsonReturn(['code'=>0,'data'=>$data]);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t$this->display($this->template.'/tags-details');\r\n\t\t}else{\r\n\r\n\t\t\t$sql = ' isshow=1  ';\r\n\t\t\t$page = new Page('tags');\r\n\t\t\t\r\n\t\t\t//手动设置分页条数\r\n\t\t\t$limit = 50;\r\n\t\t\tif($this->frparam('limit')){\r\n\t\t\t\t$limit = $this->frparam('limit');\r\n\t\t\t}\r\n\t\t\t//只适合article和product\r\n\t\t\t$data = $page->where($sql)->orderby('orders desc,id desc')->limit($limit)->page($this->frpage)->go();\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t$pages = $page->pageList(5,'/page/');\r\n\t\t\t\r\n\t\t\t$this->pages = $pages;//组合分页\r\n\t\t\t\r\n\t\t\tforeach($data as $k=>$v){\r\n\t\t\t\t$data[$k]['url'] = U('tags/index',['id'=>$v['id']]);\r\n\t\t\t\t\r\n\t\t\t}\r\n            if($this->frparam('ajax')){\r\n                JsonReturn(['code'=>0,'data'=>$data]);\r\n            }\r\n\t\t\t$this->lists = $data;//列表数据\r\n\t\t\t$this->sum = $page->sum;//总数据\r\n\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\r\n\t\t\t$this->prevpage = $page->prevpage;//上一页\r\n\t\t\t$this->nextpage = $page->nextpage;//下一页\r\n\t\t\t$this->allpage = $page->allpage;//总页数\r\n\t\t\t\r\n\t\t\t$this->display($this->template.'/tags');\r\n\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t}\r\n\r\n\r\n\t\r\n\t\r\n}"
  },
  {
    "path": "app/home/c/UploadsController.php",
    "content": "<?php\n\n\nnamespace app\\home\\c;\n\n\nclass UploadsController extends CommonController\n{\n    function index(){\n    \n        //检测是否允许前台上传文件\n        if(!$this->webconf['isopenhomeupload']){\n        \n            JsonReturn(['state'=> '已关闭前台上传文件功能！']);\n        }\n        if($this->webconf['onlyuserupload'] && !$this->islogin){\n        \n            JsonReturn(['state'=> '仅会员才可以上传！']);\n        }\n        if($this->webconf['onlyuserupload'] && $this->islogin){\n        \n            $all = M('pictures')->findAll(['userid'=>$this->member['id']],null,'size');\n            $allsize = 0;\n            foreach ($all as $v){\n                $allsize+=$v['size'];\n            }\n            $limisize = $this->member['uploadsize'] * 1024;\n            if($limisize<=$allsize){\n                JsonReturn(['state'=> '超出会员上传文件大小！']);\n            }\n        \n        \n        }\n\n        $filepath = isset($_SESSION['admin']) ? $this->webconf['admin_save_path'] : $this->webconf['home_save_path'];\n        $paths = explode('/',$filepath);\n        $allowpath = (count($paths)>=2 && strpos($paths[1],'{')===false) ? '/'.$paths[0].'/'.$paths[1].'/' : '/'.$paths[0].'/';\n        if(strpos($filepath,'{')===false){\n            $filepath.='/{yyyy}/{mm}/{dd}';\n        }\n        if(strpos($filepath,'rand')===false){\n            $filepath.='/{rand:8}';\n        }\n        //$CONFIG = json_decode(preg_replace(\"/\\/\\*[\\s\\S]+?\\*\\//\", \"\", file_get_contents(\"config.json\")), true);\n        $CONFIG = [\n            /* 上传图片配置项 */\n            \"imageActionName\"=>\"uploadimage\", /* 执行上传图片的action名称 */\n            \"imageFieldName\"=>\"upfile\", /* 提交的图片表单名称 */\n            \"imageMaxSize\"=>512000000, /* 上传大小限制，单位B 500MB*/\n            \"imageAllowFiles\"=>[\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\" ,\".webp\"], /* 上传图片格式显示 */\n            \"imageCompressEnable\"=>true, /* 是否压缩图片,默认是true */\n            \"imageCompressBorder\"=>1600, /* 图片压缩最长边限制 */\n            \"imageInsertAlign\"=>\"none\", /* 插入的图片浮动方式 */\n            \"imageUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"imagePathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */\n            /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */\n            /* {time} 会替换成时间戳 */\n            /* {yyyy} 会替换成四位年份 */\n            /* {yy} 会替换成两位年份 */\n            /* {mm} 会替换成两位月份 */\n            /* {dd} 会替换成两位日期 */\n            /* {hh} 会替换成两位小时 */\n            /* {ii} 会替换成两位分钟 */\n            /* {ss} 会替换成两位秒 */\n            /* 非法字符 \\ =>* ? \" < > | */\n            /* 具请体看线上文档=>fex.baidu.com/ueditor/#use-format_upload_filename */\n\n            /* 涂鸦图片上传配置项 */\n            \"scrawlActionName\"=>\"uploadscrawl\", /* 执行上传涂鸦的action名称 */\n            \"scrawlFieldName\"=>\"upfile\", /* 提交的图片表单名称 */\n            \"scrawlPathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"scrawlMaxSize\"=>2048000, /* 上传大小限制，单位B */\n            \"scrawlUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"scrawlInsertAlign\"=>\"none\",\n\n            /* 截图工具上传 */\n            \"snapscreenActionName\"=>\"uploadimage\", /* 执行上传截图的action名称 */\n            \"snapscreenPathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"snapscreenUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"snapscreenInsertAlign\"=>\"none\", /* 插入的图片浮动方式 */\n\n            /* 抓取远程图片配置 */\n            \"catcherLocalDomain\"=>[\"127.0.0.1\", \"localhost\", \"img.baidu.com\"],\n            \"catcherActionName\"=>\"catchimage\", /* 执行抓取远程图片的action名称 */\n            \"catcherFieldName\"=>\"source\", /* 提交的图片列表表单名称 */\n            \"catcherPathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"catcherUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"catcherMaxSize\"=>2048000, /* 上传大小限制，单位B */\n            \"catcherAllowFiles\"=>[\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\" ,\".webp\"], /* 抓取图片格式显示 */\n\n            /* 上传视频配置 */\n            \"videoActionName\"=>\"uploadvideo\", /* 执行上传视频的action名称 */\n            \"videoFieldName\"=>\"upfile\", /* 提交的视频表单名称 */\n            \"videoPathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"videoUrlPrefix\"=>\"\", /* 视频访问路径前缀 */\n            \"videoMaxSize\"=>512000000, /* 上传大小限制，单位B，默认100MB */\n            \"videoAllowFiles\"=>[\n                \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n                \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\"], /* 上传视频格式显示 */\n\n            /* 上传文件配置 */\n            \"fileActionName\"=>\"uploadfile\", /* controller里,执行上传视频的action名称 */\n            \"fileFieldName\"=>\"upfile\", /* 提交的文件表单名称 */\n            \"filePathFormat\"=>\"/\".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */\n            \"fileUrlPrefix\"=>\"\", /* 文件访问路径前缀 */\n            \"fileMaxSize\"=>512000000, /* 上传大小限制，单位B，默认50MB */\n            \"fileAllowFiles\"=>[\n                \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\n                \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n                \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\",\n                \".rar\", \".zip\", \".tar\", \".gz\", \".7z\", \".bz2\", \".cab\", \".iso\",\n                \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".pdf\", \".txt\", \".md\", \".xml\"\n            ], /* 上传文件格式显示 */\n\n            /* 列出指定目录下的图片 */\n            \"imageManagerActionName\"=>\"listimage\", /* 执行图片管理的action名称 */\n            \"imageManagerListPath\"=>$allowpath, /* 指定要列出图片的目录 */\n            \"imageManagerListSize\"=>20, /* 每次列出文件数量 */\n            \"imageManagerUrlPrefix\"=>\"\", /* 图片访问路径前缀 */\n            \"imageManagerInsertAlign\"=>\"none\", /* 插入的图片浮动方式 */\n            \"imageManagerAllowFiles\"=>[\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\" ,\".webp\"], /* 列出的文件类型 */\n\n            /* 列出指定目录下的文件 */\n            \"fileManagerActionName\"=>\"listfile\", /* 执行文件管理的action名称 */\n            \"fileManagerListPath\"=>$allowpath, /* 指定要列出文件的目录 */\n            \"fileManagerUrlPrefix\"=>\"\", /* 文件访问路径前缀 */\n            \"fileManagerListSize\"=>20, /* 每次列出文件数量 */\n            \"fileManagerAllowFiles\"=>[\n                \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\n                \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n                \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\",\n                \".rar\", \".zip\", \".tar\", \".gz\", \".7z\", \".bz2\", \".cab\", \".iso\",\n                \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".pdf\", \".txt\", \".md\", \".xml\"\n            ] /* 列出的文件类型 */\n        ];\n        $action = $_GET['action'];\n\n        // 安全加固:禁止通过GET参数覆盖关键配置\n        // 防止攻击者通过GET参数修改fileAllowFiles、filePathFormat、fileMaxSize等\n        $dangerousKeys = [\n            'imageActionName', 'imageFieldName', 'imageMaxSize', 'imageAllowFiles',\n            'scrawlActionName', 'scrawlFieldName', 'scrawlPathFormat', 'scrawlMaxSize',\n            'snapscreenActionName', 'snapscreenPathFormat',\n            'catcherLocalDomain', 'catcherActionName', 'catcherFieldName', 'catcherPathFormat', \n            'catcherMaxSize', 'catcherAllowFiles',\n            'videoActionName', 'videoFieldName', 'videoPathFormat', 'videoMaxSize', 'videoAllowFiles',\n            'fileActionName', 'fileFieldName', 'filePathFormat', 'fileMaxSize', 'fileAllowFiles',\n            'imageManagerActionName', 'imageManagerListPath', 'imageManagerListSize', \n            'imageManagerAllowFiles',\n            'fileManagerActionName', 'fileManagerListPath', 'fileManagerListSize', \n            'fileManagerAllowFiles'\n        ];\n        \n        foreach ($dangerousKeys as $key) {\n            if (isset($_GET[$key])) {\n                unset($_GET[$key]);\n            }\n            // 同时处理数组形式的参数,如 fileAllowFiles[0]\n            if (strpos($key, 'Files') !== false) {\n                $baseKey = str_replace(['fileAllowFiles', 'imageAllowFiles', 'videoAllowFiles', \n                                       'catcherAllowFiles', 'fileManagerAllowFiles', 'imageManagerAllowFiles'], \n                                       ['fileAllowFiles', 'imageAllowFiles', 'videoAllowFiles',\n                                        'catcherAllowFiles', 'fileManagerAllowFiles', 'imageManagerAllowFiles'], \n                                       $key);\n                if (isset($_GET[$baseKey])) {\n                    unset($_GET[$baseKey]);\n                }\n            }\n        }\n        \n        // 额外清理可能通过数组形式传入的危险参数\n        $dangerousBaseKeys = ['fileAllowFiles', 'imageAllowFiles', 'videoAllowFiles', \n                             'catcherAllowFiles', 'fileManagerAllowFiles', 'imageManagerAllowFiles',\n                             'filePathFormat', 'imagePathFormat', 'videoPathFormat', 'scrawlPathFormat',\n                             'catcherPathFormat', 'fileManagerListPath', 'imageManagerListPath',\n                             'fileMaxSize', 'imageMaxSize', 'videoMaxSize', 'scrawlMaxSize', 'catcherMaxSize',\n                             'fileFieldName', 'imageFieldName', 'videoFieldName', 'scrawlFieldName',\n                             'fileActionName', 'imageActionName', 'videoActionName'];\n        \n        foreach ($dangerousBaseKeys as $baseKey) {\n            if (isset($_GET[$baseKey])) {\n                unset($_GET[$baseKey]);\n            }\n        }\n\n        switch ($action) {\n            case 'config':\n                $result =  json_encode($CONFIG);\n                break;\n\n            /* 上传图片 */\n            case 'uploadimage':\n                /* 上传涂鸦 */\n            case 'uploadscrawl':\n                /* 上传视频 */\n            case 'uploadvideo':\n                /* 上传文件 */\n            case 'uploadfile':\n                //$result = include(\"action_upload.php\");\n                $result = $this->uploadfile($CONFIG);\n                break;\n\n            /* 列出图片 */\n            case 'listimage':\n                //$result = include(\"action_list.php\");\n                $result = $this->listfile($CONFIG);\n                break;\n            /* 列出文件 */\n            case 'listfile':\n                // $result = include(\"action_list.php\");\n                $result = $this->listfile($CONFIG);\n                break;\n\n            /* 抓取远程文件 */\n            case 'catchimage':\n                //$result = include(\"action_crawler.php\");\n                $result = $this->catchimage($CONFIG);\n                break;\n\n            default:\n                $result = json_encode(array(\n                    'state'=> '请求地址出错'\n                ));\n                break;\n        }\n\n        /* 输出结果 */\n        if (isset($_GET[\"callback\"])) {\n            if (preg_match(\"/^[\\w_]+$/\", $_GET[\"callback\"])) {\n                echo htmlspecialchars($_GET[\"callback\"]) . '(' . $result . ')';\n            } else {\n                echo json_encode(array(\n                    'state'=> 'callback参数不合法'\n                ));\n            }\n        } else {\n            /*\n            {\"state\":\"SUCCESS\",\"url\":\"\\/static\\/upload\\/20230103\\/1672756587221260.jpeg\",\"title\":\"1672756587221260.jpeg\",\"original\":\"6.jpeg\",\"type\":\".jpeg\",\"size\":34255}\n            */\n            echo $result;\n        }\n    }\n\n    function catchimage($CONFIG){\n        set_time_limit(0);\n\n        /* 上传配置 */\n        $config = array(\n            \"pathFormat\" => $CONFIG['catcherPathFormat'],\n            \"maxSize\" => $CONFIG['catcherMaxSize'],\n            \"allowFiles\" => $CONFIG['catcherAllowFiles'],\n            \"oriName\" => \"remote.png\"\n        );\n        $fieldName = $CONFIG['catcherFieldName'];\n\n        /* 抓取远程图片 */\n        $list = array();\n        if (isset($_POST[$fieldName])) {\n            $source = $_POST[$fieldName];\n        } else {\n            $source = $_GET[$fieldName];\n        }\n        foreach ($source as $imgUrl) {\n            $item = new \\Uploader($imgUrl, $config, \"remote\");\n            $info = $item->getFileInfo();\n            array_push($list, array(\n                \"state\" => $info[\"state\"],\n                \"url\" => $info[\"url\"],\n                \"size\" => $info[\"size\"],\n                \"title\" => htmlspecialchars($info[\"title\"]),\n                \"original\" => htmlspecialchars($info[\"original\"]),\n                \"source\" => htmlspecialchars_decode($imgUrl)\n            ));\n        }\n\n        /* 返回抓取数据 */\n        return json_encode(array(\n            'state'=> count($list) ? 'SUCCESS':'ERROR',\n            'list'=> $list\n        ));\n    }\n\n    function listfile($CONFIG){\n\n        /* 判断类型 */\n        switch ($_GET['action']) {\n            /* 列出文件 */\n            case 'listfile':\n                $allowFiles = $CONFIG['fileManagerAllowFiles'];\n                $listSize = $CONFIG['fileManagerListSize'];\n                $path = $CONFIG['fileManagerListPath'];\n                break;\n            /* 列出图片 */\n            case 'listimage':\n            default:\n                $allowFiles = $CONFIG['imageManagerAllowFiles'];\n                $listSize = $CONFIG['imageManagerListSize'];\n                $path = $CONFIG['imageManagerListPath'];\n        }\n        $allowFiles = substr(str_replace(\".\", \"|\", join(\"\", $allowFiles)), 1);\n\n        /* 获取参数 */\n        $size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize;\n        $start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0;\n        $end = $start + $size;\n\n        /* 获取文件列表 */\n        $path = $_SERVER['DOCUMENT_ROOT'] . (substr($path, 0, 1) == \"/\" ? \"\":\"/\") . $path;\n        $files = $this->getfiles($path, $allowFiles);\n        if (!count($files)) {\n            return json_encode(array(\n                \"state\" => \"no match file\",\n                \"list\" => array(),\n                \"start\" => $start,\n                \"total\" => count($files)\n            ));\n        }\n\n        /* 获取指定范围的列表 */\n        $files=$this->array_sort($files,'mtime','desc');\n        $len = count($files);\n        for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--){\n            $list[] = $files[$i];\n        }\n        //倒序\n        //for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){\n        //    $list[] = $files[$i];\n        //}\n\n        /* 返回数据 */\n        $result = json_encode(array(\n            \"state\" => \"SUCCESS\",\n            \"list\" => $list,\n            \"start\" => $start,\n            \"total\" => count($files)\n        ));\n\n        return $result;\n\n\n    }\n\n\n    /**\n     * 遍历获取目录下的指定类型的文件\n     * @param $path\n     * @param array $files\n     * @return array\n     */\n    function getfiles($path, $allowFiles, &$files = array())\n    {\n        if (!is_dir($path)) return null;\n        if(substr($path, strlen($path) - 1) != '/') $path .= '/';\n        $handle = opendir($path);\n        while (false !== ($file = readdir($handle))) {\n            if ($file != '.' && $file != '..') {\n                $path2 = $path . $file;\n                if (is_dir($path2)) {\n                    $this->getfiles($path2, $allowFiles, $files);\n                } else {\n                    if (preg_match(\"/\\.(\".$allowFiles.\")$/i\", $file)) {\n                        $files[] = array(\n                            'url'=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])),\n                            'mtime'=> filemtime($path2)\n                        );\n                    }\n                }\n            }\n        }\n        return $files;\n    }\n\n    function array_sort($array,$row,$type){\n        $array_temp = array();\n        $arr=array();\n        foreach($array as $v){\n            $array_temp[$v[$row]] = $v;\n        }\n        if($type == 'asc'){\n            ksort($array_temp);\n        }elseif($type='desc'){\n            krsort($array_temp);\n        }else{\n        }\n        $i=0;\n        foreach ($array_temp as $vd){\n            $arr[$i]=$vd;\n            $i++;\n        }\n        return $arr;\n    }\n\n    function uploadfile($CONFIG){\n\n        /* 上传配置 */\n        $base64 = \"upload\";\n        switch (htmlspecialchars($_GET['action'])) {\n            case 'uploadimage':\n                $config = array(\n                    \"pathFormat\" => $CONFIG['imagePathFormat'],\n                    \"maxSize\" => $CONFIG['imageMaxSize'],\n                    \"allowFiles\" => $CONFIG['imageAllowFiles']\n                );\n                $fieldName = $CONFIG['imageFieldName'];\n                break;\n            case 'uploadscrawl':\n                $config = array(\n                    \"pathFormat\" => $CONFIG['scrawlPathFormat'],\n                    \"maxSize\" => $CONFIG['scrawlMaxSize'],\n                    \"allowFiles\" => $CONFIG['scrawlAllowFiles'],\n                    \"oriName\" => \"scrawl.png\"\n                );\n                $fieldName = $CONFIG['scrawlFieldName'];\n                $base64 = \"base64\";\n                break;\n            case 'uploadvideo':\n                $config = array(\n                    \"pathFormat\" => $CONFIG['videoPathFormat'],\n                    \"maxSize\" => $CONFIG['videoMaxSize'],\n                    \"allowFiles\" => $CONFIG['videoAllowFiles']\n                );\n                $fieldName = $CONFIG['videoFieldName'];\n                break;\n            case 'uploadfile':\n            default:\n                $config = array(\n                    \"pathFormat\" => $CONFIG['filePathFormat'],\n                    \"maxSize\" => $CONFIG['fileMaxSize'],\n                    \"allowFiles\" => $CONFIG['fileAllowFiles']\n                );\n                $fieldName = $CONFIG['fileFieldName'];\n                break;\n        }\n\n        /* 生成上传实例对象并完成上传 */\n        $up = new \\Uploader($fieldName, $config, $base64);\n\n        /**\n         * 得到上传文件所对应的各个参数,数组结构\n         * array(\n         *     \"state\" => \"\",          //上传状态，上传成功时必须返回\"SUCCESS\"\n         *     \"url\" => \"\",            //返回的地址\n         *     \"title\" => \"\",          //新文件名\n         *     \"original\" => \"\",       //原始文件名\n         *     \"type\" => \"\"            //文件类型\n         *     \"size\" => \"\",           //文件大小\n         * )\n         */\n\n        /* 返回数据 */\n        return json_encode($up->getFileInfo());\n\n\n\n    }\n}"
  },
  {
    "path": "app/home/c/UserController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/06/20\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\n\nuse frphp\\extend\\Page;\n\nclass UserController extends CommonController\n{\n\tfunction _init(){\n\t\t\n\t\tif(!M('molds')->find(['biaoshi'=>'member','isopen'=>1])){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('会员中心已关闭！'),'data'=>[]]);\n\t\t\t}\n\t\t\tError(JZLANG('会员中心已关闭！'));\n\t\t\texit;\n\t\t}\n\t\tparent::_init();\n\t\t\n\t}\n\n\tfunction checklogin(){\n        if(isset($GLOBALS['Redis']) && $this->frparam('token',1)){\n            $token = $this->frparam('token',1);\n            $member = $GLOBALS['Redis']->get($token);\n            if(!$member){\n                JsonReturn(['code'=>1,'msg'=>JZLANG('您还未登录，请重新登录！'),'data'=>[]]);\n            }\n            $this->member = json_decode($member,true);\n            $_SESSION['member'] = $this->member;\n            $this->islogin = true;\n        }\n        if(!$this->islogin){\n            if($this->frparam('ajax')){\n                JsonReturn(['code'=>1,'msg'=>JZLANG('您还未登录，请重新登录！'),'data'=>[]]);\n            }\n            Redirect(U('login/index'));\n        }\n\n\t\t\n\t}\n\t\n    function index(){\n    \t$this->checklogin();\n\t\t//统计用户订单\n\t\t$this->order_num = M('orders')->getCount(['userid'=>$this->member['id'],'isshow'=>1]);\n\t\t//统计评论数\n\t\t$this->comment_num = M('comment')->getCount(['userid'=>$this->member['id'],'isshow'=>1]);\n\t\t//统计点赞数\n        $this->likes_num = M('likes')->getCount(['userid'=>$this->member['id']]);\n\t\t//统计收藏\n        $this->collect_num = M('shouchang')->getCount(['userid'=>$this->member['id']]);\n\t\t//发布文章统计\n\t\t$this->article_num = M('article')->getCount(['member_id'=>$this->member['id']]);\n\t\t$this->product_num = M('product')->getCount(['member_id'=>$this->member['id']]);\n\t\t\n\t\t$this->display($this->template.'/user/index');\n       \n    }\n\tfunction userinfo(){\n\t\t$this->checklogin();\n\t\tif($_POST){\n\t\t\t$w = $this->frparam();\n            if(!isset($GLOBALS['Redis']) && (!isset($w['csrfkey']) || $w['csrfkey']!=$_SESSION['csrfkey']) ){\n                if($this->frparam('ajax')){\n                    JsonReturn(['code'=>1,'msg'=>JZLANG('非法操作！'),'data'=>[]]);\n                }\n                Error(JZLANG('非法操作！'));\n            }\n\t\t\t$w = get_fields_data($w,'member',0);\n\t\t\tunset($w['jifen']);\n\t\t\tunset($w['money']);\n\t\t\tunset($w['openid']);\n\t\t\tunset($w['gid']);\n\t\t\tunset($w['likes']);\n\t\t\tunset($w['collection']);\n\t\t\tunset($w['regtime']);\n\t\t\tunset($w['logintime']);\n\t\t\tunset($w['isshow']);\n\t\t\tunset($w['fans']);\n\t\t\tunset($w['follow']);\n\t\t\tunset($w['ismsg']);\n\t\t\tunset($w['iscomment']);\n\t\t\tunset($w['iscollect']);\n\t\t\tunset($w['islikes']);\n\t\t\tunset($w['isat']);\n\t\t\tunset($w['isrechange']);\n\t\t\tunset($w['pid']);\n\t\t\tforeach($w as $k=>$v){\n\t\t\t\t$w[$k] = format_param($v,1);\n\t\t\t}\n\t\t\t$w['tel'] = $this->frparam('tel',1);\n\t\t\t$w['pass'] = $this->frparam('password',1);\n\t\t\t$w['sex'] = $this->frparam('sex',0,0);\n\t\t\t$w['repass'] = $this->frparam('repassword',1);\n\t\t\t$w['username'] = $this->frparam('username',1);\n\t\t\t$w['email'] = $this->frparam('email',1);\n\t\t\t$w['litpic'] = $this->frparam('litpic',1);\n\t\t\t$w['signature'] = $this->frparam('signature',1);\n\t\t\t$w['province'] = $this->frparam('province',1);\n\t\t\t$w['city'] = $this->frparam('city',1);\n\t\t\t$w['address'] = $this->frparam('address',1);\n\n\t\t\tif($w['tel']!=''){\n\t\t\t\tif(preg_match(\"/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[0-9])\\\\d{8}$/\",$w['tel'])){\n\t\t\t\t\n\t\t\t\t}else{  \n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('手机号码格式错误！'),'data'=>[]]);\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('手机号码格式错误！'));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//檢查是否已經註冊\n\t\t\t\t$r = M('member')->find(['tel'=>$w['tel']]);\n\t\t\t\tif($r){\n\t\t\t\t\tif($r['id']!=$this->member['id']){\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('手机号已被注册！'),'data'=>[]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tError(JZLANG('手机号已被注册！'));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif($w['username']==''){\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('账户不能为空！'),'data'=>[]]);\n\t\t\t\t}\n\t\t\t\tError(JZLANG('账户不能为空！'));\n\t\t\t}\n\t\t\tif($w['pass']!=$w['repass'] && $w['pass']!=''){\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('两次密码不同！'),'data'=>[]]);\n\t\t\t\t}\n\t\t\t\tError(JZLANG('两次密码不同！'));\n\t\t\t}\n\t\t\tif($w['email']){\n\t\t\t\t$r = M('member')->find(['email'=>$w['email']]);\n\t\t\t\tif($r){\n\t\t\t\t\tif($r['id']!=$this->member['id']){\n\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('邮箱已被使用！'),'data'=>[]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tError(JZLANG('邮箱已被使用！'));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t$r = M('member')->find(['username'=>$w['username']]);\n\t\t\tif($r){\n\t\t\t\tif($r['id']!=$this->member['id']){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('昵称已被使用！'),'data'=>[]]);\n\t\t\t\t\t}\n\t\t\t\t\tError(JZLANG('昵称已被使用！'));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif($w['pass']!=''){\n\t\t\t\t$w['pass'] = md5(md5($w['pass']).md5($w['pass']));\n\t\t\t}else{\n\t\t\t\tunset($w['pass']);\n\t\t\t\tunset($w['repass']);\n\t\t\t}\n\t\t\t$re = M('member')->update(['id'=>$this->member['id']],$w);\n\t\t\t$member = M('member')->find(['id'=>$this->member['id']]);\n\t\t\tunset($member['pass']);\n\t\t\t$_SESSION['member'] = array_merge($_SESSION['member'],$member);\n            if(isset($GLOBALS['Redis'])){\n                $GLOBALS['Redis']->setex($this->frparam('token',1),7 * 86400,json_encode($_SESSION['member'],JSON_UNESCAPED_UNICODE));\n\n            }\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('修改成功！'),'data'=>[]]);\n\t\t\t}\n\t\t\tError(JZLANG('修改成功！'));\n\t\t\t\n\t\t}\n        $_SESSION['csrfkey'] = getRandChar(32);\n        $this->csrfkey = $_SESSION['csrfkey'];\n        if($this->frparam('ajax')){\n            JsonReturn(['code'=>0,'msg'=>'success','data'=>$this->member]);\n        }\n\t\t$this->display($this->template.'/user/userinfo');\n       \n    }\n\tfunction orders(){\n\t\t$this->checklogin();\n\t\t$page = new Page('Orders');\n\t\t$this->type = $this->frparam('type',0,0);\n\t\tif($this->type){\n\t\t\t//1未支付,2已支付,3超时,4待发货,5已发货,6已废弃失效,0删除订单\n\t\t\tswitch ($this->type) {\n\t\t\t\tcase 1:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].' and isshow=1 ';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].' and isshow=2 ';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].' and isshow=3 ';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].' and isshow=4 ';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].' and isshow=5 ';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].' and isshow=6 ';\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].' and isshow!=0 ';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}else{\n\t\t\t$sql = 'userid='.$this->member['id'].' and isshow!=0 ';\n\t\t}\n\t\t$sql.=\" and ptype=1 \";\n\t\t$data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->page($this->frparam('page',0,1))->go();\n\t\t$page->file_ext = '';\n\t\t$pages = $page->pageList(5,'?page=');\n\t\t$this->pages = $pages;\n\t\tforeach($data as $k=>$v){\n\t\t\t$data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t$data[$k]['details'] =  U('user/orderdetails',['orderno'=>$v['orderno']]);\n\t\t\t$data[$k]['del'] =  U('user/orderdel',['orderno'=>$v['orderno']]);\n\t\t}\n\n\t\t$this->lists = $data;//列表数据\n\t\t$this->sum = $page->sum;//总数据\n\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t$this->allpage = $page->allpage;//总页数\n\n        if($this->frparam('ajax')){\n\n            JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n        }\n\t\t\n\t\t$this->display($this->template.'/user/order');\n       \n    }\n    //订单详情\n    function orderdetails(){\n\t\t$this->checklogin();\n    \t$orderno = $this->frparam('orderno',1);\n\t\t$order = M('orders')->find(['orderno'=>$orderno,'userid'=>$this->member['id']]);\n\t\tif($orderno && $order){\n\t\t\t/*\n\t\t\tif($order['isshow']!=1){\n\t\t\t\t//超时或者已支付\n\t\t\t\tif($order['isshow']==0){\n\t\t\t\t\t$msg = '订单已删除';\n\t\t\t\t}\n\t\t\t\tif($order['isshow']==3){\n\t\t\t\t\t$msg = '订单已过期，不可支付！';\n\t\t\t\t}\n\t\t\t\tif($order['isshow']==2){\n\t\t\t\t\t$msg = '订单已支付，请勿重复操作！';\n\t\t\t\t}\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>$msg]);\n\t\t\t\t}\n\t\t\t\tError($msg);\n\t\t\t\t\n\t\t\t}\n\t\t\t*/\n\t\t\t$carts = explode('||',$order['body']);\n\t\t\t$new = [];\n\t\t\tforeach($carts as $k=>$v){\n\t\t\t\t$d = explode('-',$v);\n\t\t\t\tif($d[0]!=''){\n\t\t\t\t\t//兼容多模块化\n\t\t\t\t\tif(isset($this->classtypedata[$d[0]])){\n\t\t\t\t\t\t$type = $this->classtypedata[$d[0]];\n\t\t\t\t\t\t$res = M($type['molds'])->find(['id'=>$d[1]]);\n\t\t\t\t\t\t$new[] = ['info'=>$res,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$new[] = ['info'=>false,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]];\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t$this->carts = $new;\n\t\t\t$this->order = $order;\n\t\t\t$this->display($this->template.'/user/orderdetails');\n\t\t}\n    \t\n    }\n\t//支付页面\n\tfunction payment(){\n\t\t$this->checklogin();\n\t\t$orderno = $this->frparam('orderno',1);\n\t\t$order = M('orders')->find(['orderno'=>$orderno,'userid'=>$this->member['id']]);\n\t\tif($this->frparam('go') && $orderno && $order){\n\t\t\tif($order['isshow']!=1){\n\t\t\t\t//超时或者已支付\n\t\t\t\tif($order['isshow']==0){\n\t\t\t\t\t$msg = JZLANG('订单已删除');\n\t\t\t\t}\n\t\t\t\tif($order['isshow']==3){\n\t\t\t\t\t$msg = JZLANG('订单已过期，不可支付！');\n\t\t\t\t}\n\t\t\t\tif($order['isshow']==2){\n\t\t\t\t\t$msg = JZLANG('订单已支付，请勿重复操作！');\n\t\t\t\t}\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>$msg,'data'=>[]]);\n\t\t\t\t}\n\t\t\t\tError($msg);\n\t\t\t\t\n\t\t\t}\n\t\t\t$carts = explode('||',$order['body']);\n\t\t\t$new = [];\n\t\t\t$qianbao = 0;\n\t\t\t$jifen = 0;\n\t\t\tforeach($carts as $k=>$v){\n\t\t\t\t$d = explode('-',$v);\n\t\t\t\tif($d[0]!=''){\n\t\t\t\t\t//兼容多模块化\n\t\t\t\t\tif(isset($this->classtypedata[$d[0]])){\n\t\t\t\t\t\t$type = $this->classtypedata[$d[0]];\n\t\t\t\t\t\t$res = M($type['molds'])->find(['id'=>$d[1]]);\n\t\t\t\t\t\t$new[] = ['info'=>$res,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]];\n\t\t\t\t\t\tif(isset($res['jifen']) && $res['jifen']!=0){\n\t\t\t\t\t\t\t$jifen+=$d[2]*$res['jifen'];\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$jifen+=$d[2]*$d[3]*($this->webconf['jifen_exchange']);\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$new[] = ['info'=>false,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]];\n\t\t\t\t\t\t$jifen+=$d[2]*$d[3]*($this->webconf['jifen_exchange']);\n\t\t\t\t\t}\t\n\t\t\t\t\t$qianbao+=$d[2]*$d[3]*($this->webconf['money_exchange']);\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$this->qianbao = $qianbao+$order['discount']*($this->webconf['money_exchange'])-$order['yunfei']*($this->webconf['money_exchange']);\n\t\t\t$this->jifen = $jifen+$order['discount']*($this->webconf['jifen_exchange'])-$order['yunfei']*($this->webconf['jifen_exchange']);\n\t\t\tif($this->webconf['isopenjifen']==1){\n\t\t\t\tM('orders')->update(['id'=>$order['id']],['jifen'=>$this->jifen]);\n\t\t\t}\n\t\t\tif($this->webconf['isopenqianbao']==1){\n\t\t\t\tM('orders')->update(['id'=>$order['id']],['qianbao'=>$this->qianbao]);\n\t\t\t}\n\t\t\t$this->carts = $new;\n\t\t\t$this->order = $order;\n\t\t\t$this->display($this->template.'/user/payment');\n\t\t}\n\t\t\n\t}\n\n\t//删除订单\n\tfunction orderdel(){\n\t\t$this->checklogin();\n\t\t$orderno = $this->frparam('orderno',1);\n\t\tif(!$orderno){ Error(JZLANG('缺少订单号！'));}\n\t\t$order = M('orders')->find(\" orderno='\".$orderno.\"' and userid=\".$this->member['id'].\" and isshow!=0 \");\n\t\tif(!$order){ Error(JZLANG('订单号错误！'));}\n\t\t$r = M('orders')->update(['orderno'=>$orderno,'userid'=>$this->member['id']],['isshow'=>0]);\n\t\tif($r){\n\t\t\tSuccess(JZLANG('删除成功！'),U('user/orders'));\n\t\t}else{\n\t\t\tError(JZLANG('删除失败！'));\n\t\t}\n\t\t\n\t}\n\tfunction comment(){\n\t\t$this->checklogin();\n\t\t$page = new Page('Comment');\n\t\t$sql = 'userid='.$this->member['id'].' and isshow!=2 ';\n\t\t$data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->limit(5)->page($this->frparam('page',0,1))->go();\n\t\t$page->file_ext = '';\n\t\t$pages = $page->pageList(5,'?page=');\n\t\t$pages = $page->pageList();\n\t\t$this->pages = $pages;\n\t\t\n\t\t$this->sum = $page->sum;\n\t\tforeach($data as $k=>$v){\n\t\t\tif(isset($this->classtypedata[$v['tid']])){\n\t\t\t\t$xmolds = M($this->classtypedata[$v['tid']]['molds'])->find(['id'=>$v['aid']]);\n\t\t\t\t$data[$k]['date'] = date('Y/m/d H:i:s',$v['addtime']);\n\t\t\t\t$data[$k]['body'] = newstr($v['body'],60);\n\t\t\t\t$data[$k]['comment_num'] =  get_comment_num($v['tid'],$v['aid']);\n\t\t\t\t$data[$k]['del'] =  U('user/commentdel',['id'=>$v['id']]);\n\t\t\t\tif($xmolds){\n\t\t\t\t\t$data[$k]['title'] = $xmolds['title'];\n\t\t\t\t\t$data[$k]['url'] =  gourl($xmolds);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t$this->lists = $data;//列表数据\n\t\t$this->sum = $page->sum;//总数据\n\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t$this->allpage = $page->allpage;//总页数\n\t\tif($this->frparam('ajax')){\n            JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t}\n\t\t\n\t\t$this->display($this->template.'/user/comment');\n       \n    }\n\tfunction commentdel(){\n\t\t$this->checklogin();\n\t\t$id = $this->frparam('id');\n\t\tif(!$id){ Error(JZLANG('缺少ID！'));}\n\t\t$comment = M('comment')->find(['id'=>$id,'isshow'=>1,'userid'=>$this->member['id']]);\n\t\tif(!$comment){ Error(JZLANG('未找到评论！'));}\n\t\t$r = M('comment')->update(['id'=>$id,'userid'=>$this->member['id']],['isshow'=>2]);\n\t\tif($r){\n\t\t\tSuccess(JZLANG('删除成功！'),U('user/comment'));\n\t\t}else{\n\t\t\tError(JZLANG('删除失败！'));\n\t\t}\n\t\t\n\t}\n\tfunction likesAction(){\n\t\t\n\t\tif(!isset($_SESSION['return_url'])){\n\t\t\t$referer = ($_SERVER['HTTP_REFERER']=='') ? U('user/likes') : $_SERVER['HTTP_REFERER'];\n\t\t\t$_SESSION['return_url'] = $referer;\n\t\t\n\t\t}\n\t\t$tid = $this->frparam('tid');\n\t\t$id = $this->frparam('id');\n\t\tif(!$tid || !$id){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('参数错误！'),'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]);\n\t\t\t}\n\t\t\tError(JZLANG('参数错误！'));\n\t\t}\n\t\tif(!$this->islogin){\n\t\t\tif(isset($_SESSION['likes'])){\n\t\t\t\t$likes = $_SESSION['likes'];\n\t\t\t}else{\n\t\t\t\t$likes = [];\n\t\t\t}\n\t\t\t$lk = $tid.'-'.$id;\n\t\t\t$u = M('member')->find(['username'=>'jzcustomer']);\n\t\t\tif(!$u){\n\t\t\t\t$w = [];\n\t\t\t\t$w['username'] = 'jzcustomer';\n\t\t\t\t$r = M('member')->add($w);\n\t\t\t\t$u['id'] = $r;\n\t\t\t\t$u['likes'] = '';\n\t\t\t}\n\t\t\tif(in_array($lk,$likes)){\n\t\t\t\t$newlikes = [];\n\t\t\t\tforeach($likes as $v){\n\t\t\t\t\tif($v!=$lk){\n\t\t\t\t\t\t$newlikes[]=$v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$msg = JZLANG('已取消点赞！');\n\t\t\t\t$likes = $newlikes;\n\t\t\t\t$ulikes = explode('||',$u['likes']);\n\t\t\t\t$isdo = 0;\n\t\t\t\t$ulk = [];\n\t\t\t\tforeach($ulikes as $k=>$v){\n\t\t\t\t\tif($v){\n\t\t\t\t\t\tif($v==$lk && !$isdo){\n\t\t\t\t\t\t\t$isdo = 1;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$ulk[]=$v;\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tif(count($ulk)){\n\t\t\t\t\t$u['likes'] = '||'.implode('||',$ulk).'||';\n\t\t\t\t}else{\n\t\t\t\t\t$u['likes'] = '';\n\t\t\t\t}\n                $molds = $this->classtypedata[$tid]['molds'];\n                if($molds){\n                    M($molds)->goDec(['id'=>$id],'zan');\n                }\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$msg = JZLANG('点赞成功！');\n\t\t\t\t$likes[]=$lk;\n\t\t\t\tif($u['likes']){\n\t\t\t\t\t$u['likes'] .= $lk.'||';\n\t\t\t\t}else{\n\t\t\t\t\t$u['likes'] = '||'.$lk.'||';\n\t\t\t\t}\n                $molds = $this->classtypedata[$tid]['molds'];\n                if($molds){\n                    M($molds)->goInc(['id'=>$id],'zan');\n                }\n\t\t\t}\n\t\t\t$_SESSION['likes'] = $likes;\n\t\t\tM('member')->update(['id'=>$u['id']],['likes'=>$u['likes']]);\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>0,'msg'=>$msg,'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]);\n\t\t\t}\n\t\t\tSuccess($msg,$_SESSION['return_url']);\n\t\t}\n\t\t\n\t\t//查询是否已点赞\n\t\t$res = M('likes')->find(['tid'=>$tid,'aid'=>$id,'userid'=>$this->member['id']]);\n\t\tif(!$this->classtypedata[$tid]['molds']){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('栏目未绑定模型，无法喜欢！'),'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]);\n\t\t\t}\n\t\t\tError(JZLANG('栏目未绑定模型，无法喜欢！'));\n\t\t}\n\t\t$molds = $this->classtypedata[$tid]['molds'];\n\t\t$isaward = 0;\n\t\tif($this->webconf['likes_award_open']==1 && $this->webconf['likes_award']>0){\n\t\t\t$award = round($this->webconf['likes_award'],2);\n\t\t\t$max_award = round($this->webconf['likes_max_award'],2);\n\t\t\t$isaward = 1;\n\t\t\t\n\t\t}\n\t\t$ww['tid'] = $tid;\n\t\t$ww['aid'] = $id;\n\t\t$ww['userid'] = $this->member['id'];\n\t\t$data = M($molds)->find(['tid'=>$tid,'id'=>$id]);\n\t\t$member_id = $data['member_id'];\n\t\tif($res){\n\t\t\t//存在-取消点赞\n\t\t\tM('likes')->delete($ww);\n\t\t\t$task['aid'] = $id;\n\t\t\t$task['tid'] = $tid;\n\t\t\t$task['userid'] = $member_id;\n\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t$task['molds'] = $molds;\n\t\t\t$task['type'] = 'likes';\n\t\t\tM('task')->delete($task);\n\t\t\tif($isaward){\n\t\t\t\t//扣除\n\t\t\t\t$w['userid'] = $member_id;\n\t\t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t$w['type'] = 3;\n\t\t\t\t$w['molds'] = $molds;\n\t\t\t\t$w['aid'] = $id;\n\t\t\t\t$w['msg'] = JZLANG('取消点赞');\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t$w['amount'] = -$award;\n\t\t\t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t$r = M('buylog')->add($w);\n\t\t\t\tM('member')->goDec(['id'=>$member_id],'jifen',$award);\n\t\t\t}\n\t\t\t$msg = JZLANG('已取消点赞！');\n            $molds = $this->classtypedata[$tid]['molds'];\n            if($molds){\n                M($molds)->goDec(['id'=>$id],'zan');\n            }\n\t\t\t\n\t\t}else{\n\t\t\t//不存在\n\t\t\t$ww['addtime'] = time();\n\t\t\tM('likes')->add($ww);\n\t\t\t$task['aid'] = $id;\n\t\t\t$task['tid'] = $tid;\n\t\t\t$task['userid'] = $member_id;\n\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t$task['molds'] = $molds;\n\t\t\t$task['type'] = 'likes';\n\t\t\t$task['addtime'] = time();\n\t\t\t$task['body'] = $data['title'];\n\t\t\t$task['url'] = gourl($data);\n\t\t\tM('task')->add($task);\n\t\t\tif($award){\n\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG('点赞奖励').\"' \";\n\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t$all_jifen = 0;\n\t\t\t\tif($all){\n\t\t\t\t\tforeach($all as $v){\n\t\t\t\t\t\t$all_jifen+=$v['amount'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//奖励\n\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award>0)){\n\t\t\t\t\t$w['userid'] = $member_id;\n\t\t\t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t$w['type'] = 3;\n\t\t\t\t\t$w['molds'] = $molds;\n\t\t\t\t\t$w['aid'] = $id;\n\t\t\t\t\t$w['msg'] = JZLANG('点赞奖励');\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t$w['amount'] = $award;\n\t\t\t\t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t$r = M('buylog')->add($w);\n\t\t\t\t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t$msg = JZLANG('点赞成功！');\n            $molds = $this->classtypedata[$tid]['molds'];\n            if($molds){\n                M($molds)->goInc(['id'=>$id],'zan');\n            }\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\tif($this->frparam('ajax')){\n\t\t\tJsonReturn(['code'=>0,'msg'=>$msg,'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]);\n\t\t}\n\t\tSuccess($msg,$_SESSION['return_url']);\n\t\t\n\t}\n\n    function checkLikes(){\n        $this->checklogin();\n        $tid = $this->frparam('tid',0,0);\n        $id = $this->frparam('id',0,0);\n        $res = M('likes')->find(['tid'=>$tid,'aid'=>$id,'userid'=>$this->member['id']]);\n        if($res){\n            JsonReturn(['code'=>0,'msg'=>'success','data'=>true]);\n        }else{\n            JsonReturn(['code'=>1,'msg'=>'fail','data'=>false]);\n        }\n    }\n\t\n\tfunction likes(){\n\t\t$this->checklogin();\n\t\t$lists = [];\n\t\t\n\t\t$model = new Page('likes');\n\t\t$data = $model->where(['userid'=>$this->member['id']])->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go();\n\t\t$model->file_ext = '';\n\t\t$pages = $model->pageList(5,'?page=');\n\t\t$this->pages = $pages;\n\t\t\n\t\t\n\t\tforeach($data as $k=>$v){\n\t\t\tif(isset($this->classtypedata[$v['tid']])){\n\t\t\t\t$data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname'];\n\t\t\t\t$molds = $this->classtypedata[$v['tid']]['molds'];\n\t\t\t\t$vdata = M($molds)->find(['id'=>$v['aid']]);\n\t\t\t\t$data[$k]['url'] = $vdata ? gourl($vdata) : '';\n\t\t\t\t$data[$k]['details'] = $vdata ? $vdata : ['title'=>JZLANG('已被删除')];\n\t\t\t}else{\n\t\t\t\t$data[$k]['classname'] = '[ '.JZLANG('已被删除 ').']';\n\t\t\t\t$data[$k]['url'] = '';\n\t\t\t\t$data[$k]['details'] = [];\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t$data[$k]['del'] = U('user/likesdel',['id'=>$v['id']]);\n\t\t}\n\t\t$this->lists = $data;//列表数据\n\t\t$this->sum = $model->sum;//总数据\n\t\t$this->listpage = $model->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage = $model->prevpage;//上一页\n\t\t$this->nextpage = $model->nextpage;//下一页\n\t\t$this->allpage = $model->allpage;//总页数\n\t\tif($this->frparam('ajax')){\n            JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t}\n\t\t\n\t\t$this->display($this->template.'/user/likes');\n       \n    }\n\tfunction likesdel(){\n\t\t$this->checklogin();\n\t\t$id = $this->frparam('id');\n\t\tif($id){\n\t\t\tM('likes')->delete(['id'=>$id,'userid'=>$this->member['id']]);\n\t\t\t\n\t\t\tSuccess(JZLANG('删除成功！'),U('user/likes'));\n\t\t}else{\n\t\t\tError(JZLANG('参数错误！'));\n\t\t}\n\t}\n\t\n\tfunction collectAction(){\n\t\t$this->checklogin();\n\t\tif(!isset($_SESSION['return_url'])){\n\t\t\t$referer = (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER']=='') ? U('user/collect') : $_SERVER['HTTP_REFERER'];\n\t\t\t$_SESSION['return_url'] = $referer;\n\t\t\n\t\t}\n\t\t$tid = $this->frparam('tid');\n\t\t$id = $this->frparam('id');\n\t\tif(!$tid || !$id){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('参数错误！'),'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]);\n\t\t\t}\n\t\t\tError(JZLANG('参数错误！'));\n\t\t}\n\t\tif(!$this->classtypedata[$tid]['molds']){\n\t\t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>0,'data'=>['url'=>$_SESSION['return_url']],'msg'=>JZLANG('栏目未绑定模型，无法收藏！'),'url'=>$_SESSION['return_url']]);\n\t\t\t}\n\t\t\tError(JZLANG('栏目未绑定模型，无法收藏！'));\n\t\t}\n\t\t\n\t\t$r = M('shouchang')->find(['userid'=>$this->member['id'],'tid'=>$tid,'aid'=>$id]);\n\t\t$w['tid'] = $tid;\n\t\t$w['aid'] = $id;\n\t\t$w['userid'] = $this->member['id'];\n\t\t$isaward = 0;\n\t\tif($this->webconf['collect_award_open']==1 && $this->webconf['collect_award']>0){\n\t\t\t$award = round($this->webconf['collect_award'],2);\n\t\t\t$max_award = round($this->webconf['collect_max_award'],2);\n\t\t\t$isaward = 1;\n\t\t}\n\t\t$molds = $this->classtypedata[$tid]['molds'];\n\t\t$data = M($molds)->find(['tid'=>$tid,'id'=>$id]);\n\t\t$member_id = $data['member_id'];\n\t\tif($r){\n\t\t\t//已存在\n\t\t\tM('shouchang')->delete($w);\n\t\t\t$task['aid'] = $id;\n\t\t\t$task['tid'] = $tid;\n\t\t\t$task['userid'] = $member_id;\n\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t$task['molds'] = $molds;\n\t\t\t$task['type'] = 'collect';\n\t\t\tM('task')->delete($task);\n\t\t\t$w['userid'] = $member_id;\n\t\t\t$w['buytype'] = 'jifen';\n\t\t\t$w['type'] = 3;\n\t\t\t$w['molds'] = $molds;\n\t\t\t$w['aid'] = $id;\n\t\t\t$w['msg'] = JZLANG('取消收藏');\n\t\t\t$w['addtime'] = time();\n\t\t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t$w['amount'] = -$award;\n\t\t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t$r = M('buylog')->add($w);\n\t\t\t\n\t\t\tif($isaward){\n\t\t\t\t//扣除\n\t\t\t\t$w['userid'] = $member_id;\n\t\t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t$w['type'] = 3;\n\t\t\t\t$w['molds'] = $molds;\n\t\t\t\t$w['aid'] = $id;\n\t\t\t\t$w['msg'] = JZLANG('取消收藏');\n\t\t\t\t$w['addtime'] = time();\n\t\t\t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t$w['amount'] = -$award;\n\t\t\t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t$r = M('buylog')->add($w);\n\t\t\t\tM('member')->goDec(['id'=>$member_id],'jifen',$award);\n\t\t\t}\n\t\t\t$msg = $w['msg'];\n\t\t}else{\n\t\t\t//新增\n\t\t\t$w['addtime'] = time();\n\t\t\tM('shouchang')->add($w);\n\t\t\t$task['aid'] = $id;\n\t\t\t$task['tid'] = $tid;\n\t\t\t$task['userid'] = $member_id;\n\t\t\t$task['puserid'] = $this->member['id'];\n\t\t\t$task['molds'] = $molds;\n\t\t\t$task['type'] = 'collect';\n\t\t\t$task['addtime'] = time();\n\t\t\t$task['body'] = $data['title'];\n\t\t\t$task['url'] = gourl($data);\n\t\t\tM('task')->add($task);\n\t\t\tif($isaward){\n\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\n\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG('收藏奖励').\"' \";\n\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t$all_jifen = 0;\n\t\t\t\tif($all){\n\t\t\t\t\tforeach($all as $v){\n\t\t\t\t\t\t$all_jifen+=$v['amount'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award>0)){\n\t\t\t\t\t$w['userid'] = $member_id;\n\t\t\t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t\t$w['type'] = 3;\n\t\t\t\t\t$w['molds'] = $molds;\n\t\t\t\t\t$w['aid'] = $id;\n\t\t\t\t\t$w['msg'] = JZLANG('收藏奖励');\n\t\t\t\t\t$w['addtime'] = time();\n\t\t\t\t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t\t$w['amount'] = $award;\n\t\t\t\t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t\t$r = M('buylog')->add($w);\n\t\t\t\t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$msg = JZLANG('收藏成功！');\n\t\t\t\n\t\t}\n\t\t\n\t\tif($this->frparam('ajax')){\n\t\t\tJsonReturn(['code'=>0,'msg'=>$msg,'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]);\n\t\t}\n\t\tSuccess($msg,$_SESSION['return_url']);\n\t\t\n\t}\n\n    function checkCollect(){\n        $this->checklogin();\n        $tid = $this->frparam('tid',0,0);\n        $id = $this->frparam('id',0,0);\n        $res = M('shouchang')->find(['userid'=>$this->member['id'],'tid'=>$tid,'aid'=>$id]);\n        if($res){\n            JsonReturn(['code'=>0,'msg'=>'success','data'=>true]);\n        }else{\n            JsonReturn(['code'=>1,'msg'=>'fail','data'=>false]);\n        }\n    }\n\t\n\tfunction collect(){\n\t\t$this->checklogin();\n\t\t$lists = [];\n\t\t$model = new Page('shouchang');\n\t\t$data = $model->where(['userid'=>$this->member['id']])->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go();\n\t\t$model->file_ext = '';\n\t\t$pages = $model->pageList(5,'?page=');\n\t\t$this->pages = $pages;\n\t\t\n\t\t\n\t\tforeach($data as $k=>$v){\n\t\t\tif(isset($this->classtypedata[$v['tid']])){\n\t\t\t\t$data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname'];\n\t\t\t\t$molds = $this->classtypedata[$v['tid']]['molds'];\n\t\t\t\t$vdata = M($molds)->find(['id'=>$v['aid']]);\n\t\t\t\t$data[$k]['url'] = $vdata ? gourl($vdata) : '';\n\t\t\t\t$data[$k]['details'] = $vdata ? $vdata : ['title'=>JZLANG('已被删除')];\n\t\t\t}else{\n\t\t\t\t$data[$k]['classname'] = '[ '.JZLANG('已被删除').' ]';\n\t\t\t\t$data[$k]['url'] = '';\n\t\t\t\t$data[$k]['details'] = [];\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t$data[$k]['del'] = U('user/collectdel',['id'=>$v['id']]);\n\t\t}\n\t\t$this->lists = $data;//列表数据\n\t\t$this->sum = $model->sum;//总数据\n\t\t$this->listpage = $model->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage = $model->prevpage;//上一页\n\t\t$this->nextpage = $model->nextpage;//下一页\n\t\t$this->allpage = $model->allpage;//总页数\n\t\tif($this->frparam('ajax')){\n\n            JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t}\n\t\t\n\t\t$this->display($this->template.'/user/collect');\n       \n    }\n\tfunction collectdel(){\n\t\t$this->checklogin();\n\t\t$id = $this->frparam('id');\n        if($id){\n            M('shouchang')->delete(['id'=>$id,'userid'=>$this->member['id']]);\n\n            Success(JZLANG('删除成功！'),U('user/collect'));\n        }else{\n            Error(JZLANG('参数错误！'));\n        }\n\t}\n\t\n\t//购物车\n\tfunction cart(){\n\t\t$this->checklogin();\n        if(isset($GLOBALS['Redis'])){\n            $cart = $GLOBALS['Redis']->get('cart');\n            if(!$cart){\n                $cart = '';\n            }\n        }else{\n            if(!isset($_SESSION['cart'])){\n                $_SESSION['cart'] = '';\n            }\n            $cart = $_SESSION['cart'];\n        }\n\t\t$this->member_group = M('member_group')->find(['id'=>$this->member['gid']]);\n\t\t//tid-id-num\n\t\t$cart = explode('||',$_SESSION['cart']);\n\t\t$carts = [];\n\t\tif($cart){\n\t\t\tforeach($cart as $k=>$v){\n\t\t\t\t$d = explode('-',$v);\n\t\t\t\tif($d[0]!=''){\n\t\t\t\t\t//兼容多模块化\n\t\t\t\t\tif(isset($this->classtypedata[$d[0]])){\n\t\t\t\t\t\t$type = $this->classtypedata[$d[0]];\n\t\t\t\t\t\t$res = M($type['molds'])->find(['id'=>$d[1]]);\n\t\t\t\t\t\t$carts[] = ['info'=>$res,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$carts[] = ['info'=>false,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]];\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t$this->carts = $carts;\n\t\t$this->display($this->template.'/user/cart');\n\t}\n\t\n\t//购物车 tid-id-num\n\tfunction addcart(){\n\t\t$this->checklogin();\n\t\t$id = $this->frparam('id');\n\t\t$tid = $this->frparam('tid');\n\t\t$num = $this->frparam('num');\n\t\tif(!$id || !$tid || !$num){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数错误！'),'data'=>[]]);\n\t\t}\n\t\t//检查库存\n\t\t$product = M($this->classtypedata[$tid]['molds'])->find(['id'=>$id]);\n\t\tif($product['stock_num']<$num){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('库存不足！'),'data'=>[]]);\n\t\t}\n\t\t\n\t\t//session存储\n        if(\n            !isset($_SESSION['cart'])\n            && (!isset($GLOBALS['Redis']) || !$GLOBALS['Redis']->get('cart'))\n        ){\n            //id-tid-num\n            $cart = $tid.'-'.$id.'-'.$num.'-'.$product['price'];\n        }else{\n            if(isset($GLOBALS['Redis'])){\n                $cart = $GLOBALS['Redis']->get('cart');\n            }else{\n                $cart = $_SESSION['cart'];\n            }\n\t\t\t$carts = explode('||',$cart);\n\t\t\t$new = [];\n\t\t\t$isnew = true;\n\t\t\tforeach($carts as $v){\n\t\t\t\t$d = explode('-',$v);\n\t\t\t\tif($d[0]!=''){\n\t\t\t\t\tif($d[0]==$tid && $d[1]==$id){\n\t\t\t\t\t   $d[2] = $num;\n\t\t\t\t\t   $isnew = false;\n\t\t\t\t\t}\n\t\t\t\t\t$new[]=$d[0].'-'.$d[1].'-'.$d[2].'-'.$d[3];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tif($isnew){\n\t\t\t\t$new[]=$tid.'-'.$id.'-'.$num.'-'.$product['price'];\n\t\t\t}\n\t\t\t\n\t\t\t$cart = implode('||',$new);\n\t\t}\n\t\t$_SESSION['cart'] = $cart;\n        if(isset($GLOBALS['Redis'])){\n            $GLOBALS['Redis']->setex('cart', 7 * 86400, $cart);\n        }\n\t\tJsonReturn(['code'=>0,'msg'=>'success','data'=>['url'=>U('user/cart')],'url'=>U('user/cart')]);\n\t\t\n\t\t\n\t}\n\t//删除购物车商品\n\tfunction delcart(){\n\t\t$this->checklogin();\n\t\t$id = $this->frparam('id');\n\t\t$tid = $this->frparam('tid');\n\t\tif(!$id || !$tid){\n\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数错误！'),'data'=>[]]);\n\t\t}\n        if(isset($GLOBALS['Redis'])){\n            $cart = $GLOBALS['Redis']->get('cart');\n        }else{\n            $cart = $_SESSION['cart'];\n        }\n\t\t$carts = explode('||',$cart);\n\t\t$new = [];\n\t\t\n\t\tforeach($carts as $v){\n\t\t\t$d = explode('-',$v);\n\t\t\tif(($d[0]!=$tid || $d[1]!=$id) && $d[0]!=''){\n\t\t\t   $new[]=$d[0].'-'.$d[1].'-'.$d[2];\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t$cart = implode('||',$new);\n\t\t$_SESSION['cart'] = $cart;\n        if(isset($GLOBALS['Redis'])){\n            $GLOBALS['Redis']->setex('cart', 7 * 86400, $cart);\n        }\n\t\tJsonReturn(['code'=>0,'msg'=>'success','data'=>['url'=>$cart],'url'=>$cart]);\n\t}\n\n\t//文章列表\n\tfunction posts(){\n\t\t$this->checklogin();\n\t\t$molds = $this->frparam('molds',1,'article');\n\t\t$this->molds = $molds;\n\t\t$this->moldsname = M('molds')->getField(['biaoshi'=>$molds],'name');\n\t\t$page = new Page($molds);\n\t\t$this->type = $this->frparam('type');\n\t\t$sql = 'member_id='.$this->member['id'].'  ';\n\t\tswitch ($this->type) {\n\t\t\tcase 1:\n\t\t\t\t$sql.=\" and isshow=2 \";\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t$sql.=\" and isshow=0 \";\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t$sql.=\" and isshow=1 \";\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\n\t\t\t\t# code...\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\t$data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->page($this->frparam('page',0,1))->go();\n\t\t$page->file_ext = '';\n\t\t$pages = $page->pageList(5,'?page=');\n\t\t\n\t\tforeach($data as $k=>$v){\n\t\t\tif(isset($this->classtypedata[$v['tid']])){\n\t\t\t\t$data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname'];\n\t\t\t}else{\n\t\t\t\t$data[$k]['classname'] = '[ '.JZLANG('未分类').' ]';\n\t\t\t}\n\t\t\t\n\t\t\t$data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t$data[$k]['edit'] =  U('user/release',['id'=>$v['id'],'molds'=>$molds]);\n\t\t\t$data[$k]['del'] =  U('user/del',['id'=>$v['id'],'molds'=>$molds]);\n\t\t\t$data[$k]['view'] =  U('user/preview',['id'=>$v['id'],'tid'=>$v['tid']]);\n\t\t\t$data[$k]['url'] = gourl($v);\n\t\t\t\n\t\t}\n\t\t$this->pages = $pages;\n\t\t$this->lists = $data;//列表数据\n\t\t$this->sum = $page->sum;//总数据\n\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t$this->allpage = $page->allpage;//总页数\n\t\tif($this->frparam('ajax')){\n\n\t\t\tJsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t}\n\t\t$this->display($this->template.'/user/article');\n       \n    }\n\n    function getContent(){\n        $this->checklogin();\n        $molds = $this->frparam('molds',1,'article');\n        if(!$this->frparam('id')){\n            JsonReturn(['code'=>1,'msg'=>JZLANG('ID错误！'),'data'=>[]]);\n        }\n        $data = M($molds)->find(['id'=>$this->frparam('id'),'member_id'=>$this->member['id']]);\n        if(!$data){\n            JsonReturn(['code'=>1,'msg'=>JZLANG('未找到相关文章！'),'data'=>[]]);\n        }\n        JsonReturn(['code'=>0,'msg'=>'success','data'=>$data]);\n\n    }\n    //文章发布和修改\n    function release(){\n    \t$this->checklogin();\n    \t\n    \tif($_POST){\n    \t\t$data = $this->frparam();\n\t\t\t$w = [];\n\t\t\t$w['molds'] = $this->frparam('molds',1);\n\t\t\t$release_table = explode('|',$this->webconf['release_table']);\n\t\t\tif(!in_array($w['molds'],$release_table)){\n\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('该模块不允许发布！'),'data'=>[]));\n\t\t\t}\n            $ishome = M('molds')->getField(['biaoshi'=>$w['molds']],'ishome');\n            if(!$ishome){\n                JsonReturn(array('code'=>1,'msg'=>JZLANG('该模块不允许发布！'),'data'=>[]));\n            }\n\t\t\t$w = get_fields_data($data,$w['molds'],0);\n\t\t\t$w['molds'] = $this->frparam('molds',1);\n\t\t\t//违禁词检测\n\t\t\tif(isset($this->webconf['mingan']) && $this->webconf['mingan']!=''){\n\t\t\t\t$mingan = explode(',',$this->webconf['mingan']);\n\t\t\t\tforeach($w as $v){\n\t\t\t\t\tif($v){\n\t\t\t\t\t\tif(is_array($v)){\n\t\t\t\t\t\t\tforeach($v as $vv){\n\t\t\t\t\t\t\t\tif($vv){\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tforeach($mingan as $s){\n\t\t\t\t\t\t\t\t\t\tif(strpos($s,'{xxx}')!==false){\n\t\t\t\t\t\t\t\t\t\t\t$pattern = '/'.str_replace('{xxx}','(.*)',$s).'/';\n\t\t\t\t\t\t\t\t\t\t\tif(preg_match($pattern, $vv)){\n\t\t\t\t\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败，存在敏感词').' [ '.$s.' ]','data'=>[]));\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t\tif(strpos($vv,$s)!==false){\n\t\t\t\t\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败，存在敏感词').' [ '.$s.' ]','data'=>[]));\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tforeach($mingan as $s){\n\t\t\t\t\t\t\t\tif(strpos($s,'{xxx}')!==false){\n\t\t\t\t\t\t\t\t\t$pattern = '/'.str_replace('{xxx}','(.*)',$s).'/';\n\t\t\t\t\t\t\t\t\tif(preg_match($pattern, $v)){\n\t\t\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败，存在敏感词').' [ '.$s.' ]','data'=>[]));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tif(strpos($v,$s)!==false){\n\t\t\t\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败，存在敏感词').' [ '.$s.' ]','data'=>[]));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$w['tid'] = $this->frparam('tid');\n\t\t\tif(!$w['tid']){\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('请选择分类！'),'data'=>[]]);\n\t\t\t\t}else{\n\t\t\t\t\tError(JZLANG('请选择分类！'));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tif(!isset($this->classtypedata[$w['tid']])){\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('分类错误！'),'data'=>[]]);\n\t\t\t\t}else{\n\t\t\t\t\tError(JZLANG('分类错误！'));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\tif($this->classtypedata[$w['tid']]['ishome']!=1){\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('该分类不允许发布！'),'data'=>[]]);\n\t\t\t\t}else{\n\t\t\t\t\tError(JZLANG('该分类不允许发布！'));\n\t\t\t\t}\n\t\t\t}\n\t\t\t//检查权限\n\t\t\tif($this->classtypedata[$w['tid']]['gid']!=0){\n\t\t\t\tif($this->classtypedata[$w['tid']]['gid']>$this->member['gid']){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('您没有权限在该分类发布内容！'),'data'=>[]]);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tError(JZLANG('您没有权限在该分类发布内容！'));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$w['htmlurl'] = $this->classtypedata[$w['tid']]['htmlurl'];\n\t\t\t$sql = array();\n\t\t\tif($w['tid']!=0){\n\t\t\t\t$sql[] = \" tids like '%,\".$w['tid'].\",%' \"; \n\t\t\t}\n\t\t\t$sql[] = \" molds = '\".$w['molds'].\"' and isshow=1 and ishome=1 \";\n\t\t\t$sql = implode(' and ',$sql);\n\t\t\t$fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\n\t\t\tif($fields_list){\n\t\t\t\tforeach($fields_list as $v){\n\t\t\t\t\tif($v['ismust']==1){\n\t\t\t\t\t\tif($data[$v['field']]==''){\n\t\t\t\t\t\t\tif(in_array($v['fieldtype'],array(6,10))){\n\t\t\t\t\t\t\t\tif($data[$v['field'].'_urls']==''){\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空！'),'data'=>[]]);\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\tError($v['fieldname'].JZLANG('不能为空！'));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空！'),'data'=>[]]);\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tError($v['fieldname'].JZLANG('不能为空！'));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\n\t\t\tswitch($w['molds']){\n\t\t\t\tcase 'article':\n\t\t\t\t\tif(!$w['body']){\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('内容不能为空！'),'data'=>[]]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tError(JZLANG('内容不能为空！'));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!$w['title']){\n\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('标题不能为空！'),'data'=>[]]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tError(JZLANG('标题不能为空！'));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$w['seo_title'] = $w['title'];\n\n\t\t\t\tbreak;\n\t\t\t\tcase 'product':\n\t\t\t\t\tif(!$w['body']){\n\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('内容不能为空！'),'data'=>[]]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tError(JZLANG('内容不能为空！'));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!$w['title']){\n\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('标题不能为空！'),'data'=>[]]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tError(JZLANG('标题不能为空！'));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(!$w['stock_num']){\n\t\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('库存不能为0！'),'data'=>[]]);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tError(JZLANG('库存不能为0！'));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$w['seo_title'] = $w['title'];\n\t\t\t\tbreak;\n\t\t\t\tdefault:\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(!isset($this->webconf['homerelease']) || $this->webconf['homerelease']==1){\n\t\t\t\t$w['isshow'] = 0;\n\t\t\t}else{\n\t\t\t\t$w['isshow'] = 1;\n\t\t\t}\n\t\t\t\n\t\t\t$w['member_id'] = $this->member['id'];\n\t\t\t$w['addtime'] = time();\n\t\t\t\n\t\t\tif($this->frparam('id')){\n\t\t\t\t$w['id'] = $this->frparam('id',1);\n\t\t\t\t$a = M($w['molds'])->update(['id'=>$this->frparam('id'),'member_id'=>$this->member['id']],$w);\n\t\t\t\tif(!$a){ \n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('未修改内容，不能提交！'),'data'=>[]]);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tError(JZLANG('未修改内容，不能提交！'));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('修改成功！'),'url'=>U('user/posts',['molds'=>$w['molds']]),'data'=>['url'=>U('user/posts',['molds'=>$w['molds']])]]);\n\t\t\t\t}else{\n\t\t\t\t\tSuccess(JZLANG('修改成功！'),U('user/posts',['molds'=>$w['molds']]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$a = M($w['molds'])->add($w);\n\t\t\t\tif(!$a){\n\t\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('发布失败，请重试！'),'data'=>[]]);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tError(JZLANG('发布失败，请重试！'));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif($this->frparam('ajax')){\n\t\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('发布成功！'),'data'=>['url'=>U('user/posts',['molds'=>$w['molds']])],'url'=>U('user/posts',['molds'=>$w['molds']])]);\n\t\t\t\t}else{\n\t\t\t\t\tSuccess(JZLANG('发布成功！'),U('user/posts',['molds'=>$w['molds']]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n    \t}\n    \t$molds = $this->frparam('molds',1,'article');\n    \t$tid = $this->frparam('tid',0,0);\n    \tif($this->frparam('id')){\n    \t\t$this->data = M($molds)->find(['id'=>$this->frparam('id'),'member_id'=>$this->member['id']]);\n    \t\t$molds = $this->data['molds'];\n\t\t\t$this->moldsdata = M('molds')->find(['biaoshi'=>$molds]);\n    \t\t$tid = $this->data['tid'];\n    \t}else{\n    \t\t$this->data = false;\n    \t}\n    \t$this->molds = $molds;\n    \t$this->tid = $tid;\n    \t$this->classtypetree =  get_classtype_tree();\n    \t$this->display($this->template.'/user/article-add');\n\n    }\n\t\n\t//删除文章\n\tfunction del(){\n\t\t$this->checklogin();\n\t\t$molds = $this->frparam('molds',1,'article');\n\t\t$id = $this->frparam('id');\n\t\tif(!$id){ Error(JZLANG('链接错误！'));}\n\t\t$res = M($molds)->find(['id'=>$id,'member_id'=>$this->member['id']]);\n\t\tif(!$res){ Error(JZLANG('未找到您要的文章！'));}\n\t\t$r = M($molds)->delete(['id'=>$id]);\n\t\tif($r){\n            if($this->frparam('ajax')){\n                JsonReturn(['code'=>0,'msg'=>JZLANG('删除成功！'),'data'=>[]]);\n            }\n\t\t\tSuccess(JZLANG('删除成功！'),U('user/posts',['molds'=>$molds]));\n\t\t}else{\n            if($this->frparam('ajax')){\n                JsonReturn(['code'=>1,'msg'=>JZLANG('删除失败！'),'data'=>[]]);\n            }\n\t\t\tError(JZLANG('删除失败！'));\n\t\t}\n\t\t\n\t}\n\n\tfunction uploads(){\n\t\t$this->checklogin();\n\t\t$file = $this->frparam('filename',1);\n\t\tif ($_FILES[$file][\"error\"] > 0){\n\t\t  $data['error'] =  \"Error: \" . $_FILES[$file][\"error\"];\n\t\t  $data['code'] = 1000;\n\t\t}else{\n\t\t \n\t\t  $pix = explode('.',$_FILES[$file]['name']);\n\t\t  $pix = end($pix);\n\t\t  //检测是否允许前台上传文件\n\t\t  if(!$this->webconf['isopenhomeupload']){\n\t\t\t  $data['error'] =  \"Error: \".JZLANG(\"已关闭前台上传文件功能\");\n\t\t\t  $data['code'] = 1;\n\t\t\t  JsonReturn($data);\n\t\t  }\n\t\t \n\t\t\t$fileType = webConf('fileType');\n\t\t\tif(strpos($fileType,strtolower($pix))===false   || stripos($pix,'php')!==false  || stripos($pix,'phar')!==false){\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"文件类型不允许上传！\");\n\t\t\t\t$data['code'] = 1;\n\t\t\t\tJsonReturn($data);\n\t\t\t}\n\t\t\t$fileSize = (int)webConf('fileSize');\n\t\t\tif($fileSize!=0 && ($_FILES[$file][\"size\"]/1024)>$fileSize){\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"文件大小超过网站内部限制！\");\n\t\t\t\t$data['code'] = 1;\n\t\t\t\tJsonReturn($data);\n\t\t\t}\n\t\t \n\t\t\t$home_save_path = 'static/upload/user';  \n\t\t\tif(!file_exists(APP_PATH.$home_save_path)){\n\t\t\t\tmkdir(APP_PATH.$home_save_path,0777);\n\t\t\t}  \n\t\t\t \n\t\t  \n\t\t    $filename =  $home_save_path.'/head_'.$this->member['id'].'.'.$pix;\n\t\t  \n\t\t\tif(move_uploaded_file($_FILES[$file]['tmp_name'],$filename)){\n\t\t\t\t$data['url'] = '/'.$filename;\n\t\t\t\t$data['code'] = 0;\n\t\t\t\tif(isset($_SESSION['member'])){\n\t\t\t\t\t$userid = $_SESSION['member']['id'];\n\t\t\t\t}else{\n\t\t\t\t\t$userid = 0;\n\t\t\t\t}\n\t\t\t\t$filesize = round(filesize(APP_PATH.$filename)/1024,2);\n\t\t\t\tM('pictures')->add(['litpic'=>'/'.$filename,'addtime'=>time(),'userid'=>$userid,'size'=>$filesize,'path'=>'Home','filetype'=>strtolower($pix),'molds'=>'member']);\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$data['error'] =  \"Error: \".JZLANG(\"请检查目录\").\"[\".$home_save_path.\"]\".JZLANG(\"写入权限\");\n\t\t\t\t$data['code'] = 1;\n\t\t\t\t  \n\t\t\t} \n\n\t\t\t  \n\t\t  \n\t\t  }\n\t\t  \n\t\t  \n\t\t  JsonReturn($data,true);\n\t\t  exit;\n\t\t  \n\t\t\n\t\t\n\t}\n\n\n\tfunction jizhi(){\n\t\t$this->display($this->template.'/404');\n\t}\n\t\n\tfunction follow(){\n\t\t$this->checklogin();\n\t\t$uid = $this->frparam('uid');\n\t\tif($uid){\n\t\t\t$member_id = $this->member['id'];\n\t\t\t$follow = M('member')->getField(['id'=>$member_id],'follow');\n\t\t\tif(strpos($follow,','.$uid.',')!==false){\n\t\t\t\tError(JZLANG('您已经关注了该用户！'));\n\t\t\t}\n\t\t\tif($uid==$member_id){\n\t\t\t\tError(JZLANG('您不能关注自己！'));\n\t\t\t}\n\t\t\t//拼接方式 [ , ]\n\t\t\tif($follow==''){\n\t\t\t\t$follow = ','.$uid.',';\n\t\t\t}else{\n\t\t\t\t$follow.=$uid.',';\n\t\t\t}\n\t\t\t//需要更新用户的关注数及关注人的关注列表\n\t\t\tM('member')->update(['id'=>$member_id],['follow'=>$follow]);\n\t\t\t$_SESSION['member']['follow'] = $follow;\n\t\t\tM('member')->goInc(['id'=>$uid],'fans',1);\n\t\t\tif($this->webconf['follow_award_open']==1){\n\t\t\t\t$award = round($this->webconf['follow_award'],2);\n\t\t\t\t$max_award = round($this->webconf['follow_max_award'],2);\n\t\t\t\t$molds = 'member';\n\t\t\t\t$member_id = $uid;\n\t\t\t\t$id = $uid;\n\t\t\t\t\n\t\t\t\tif($member_id!=0 && $award>0){\n\t\t\t\t\t$rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$id,'msg'=>JZLANG('关注奖励')]);\n\t\t\t\t\tif(!$rr){\n\t\t\t\t\t\t$start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));\n\t\t\t\t\t\t$end = mktime(23, 59, 59, date('m'), date('d'), date('Y'));\n\t\t\t\t\t\t$sql = \" addtime>=\".$start.\" and addtime<\".$end.\" and userid=\".$member_id.\" and type=3 and msg='\".JZLANG('关注奖励').\"' \";\n\t\t\t\t\t\t$all = M('buylog')->findAll($sql,null,'amount');\n\t\t\t\t\t\t$all_jifen = 0;\n\t\t\t\t\t\tif($all){\n\t\t\t\t\t\t\tforeach($all as $v){\n\t\t\t\t\t\t\t\t$all_jifen+=$v['amount'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){\n\t\t\t\t\t\t\t$w['userid'] = $member_id;\n\t\t        \t\t\t$w['buytype'] = 'jifen';\n\t\t\t\t   \t  \t\t$w['type'] = 3;\n\t\t\t\t   \t  \t\t$w['molds'] = $molds;\n\t\t\t\t   \t  \t\t$w['aid'] = $id;\n\t\t\t\t   \t  \t\t$w['msg'] = JZLANG('关注奖励');\n\t\t\t\t   \t  \t\t$w['addtime'] = time();\n\t\t\t\t   \t  \t\t$w['orderno'] = 'No'.date('YmdHis');\n\t\t\t\t   \t  \t\t$w['amount'] = $award;\n\t\t\t\t   \t  \t\t$w['money'] = $w['amount']/($this->webconf['money_exchange']);\n\t\t\t\t   \t  \t\t$r = M('buylog')->add($w);\n\t\t\t\t   \t  \t\tM('member')->goInc(['id'=>$member_id],'jifen',$award);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tSuccess(JZLANG('关注成功！'),U('user/follow'));\n\n\t\t}else{\n\t\t\t$this->frpage = $this->frparam('page',0,1);\n\t\t\t$page = new Page('member');\n\t\t\t$member_id = $this->member['id'];\n\t\t\t$follow = M('member')->getField(['id'=>$member_id],'follow');\n\t\t\tif($follow!=''){\n\t\t\t\t//,1,2,2,4,\n\t\t\t\t$ids = trim($follow,',');\n\n\t\t\t}else{\n\t\t\t\t$ids = 0;\n\t\t\t}\n\t\t\t$sql = \" id in(\".$ids.\") \" ;\n\t\t\t$data = $page->where($sql)->orderby('fans desc,regtime desc,id desc')->limit(12)->page($this->frpage)->go();\n\t\t\t$pages = $page->pageList(5,'?page=');\n\t\t\t$this->pages = $pages;//组合分页\n\t\t\t$this->lists = $data;//列表数据\n\t\t\t$this->sum = $page->sum;//总数据\n\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t\t$this->allpage = $page->allpage;//总页数\n\t\t\t$this->display($this->template.'/user/follow');\n\n\t\t}\n\t}\n\t//取消关注\n\tfunction nofollow(){\n\t\t$this->checklogin();\n\t\t$uid = $this->frparam('uid');\n\t\tif($uid){\n\t\t\t$member_id = $this->member['id'];\n\t\t\t$follow = M('member')->getField(['id'=>$member_id],'follow');\n\t\t\tif(strpos($follow,','.$uid.',')===false){\n\t\t\t\tError(JZLANG('您没有关注该用户，无法操作！'));\n\t\t\t}\n\t\t\t$follow = explode(',',$follow);\n\t\t\t$f = [];\n\t\t\tforeach ($follow as $key => $value) {\n\t\t\t\tif($value!='' && (int)$value!=$uid){\n\t\t\t\t\t$f[]=$value;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!count($f)){\n\t\t\t\t$follow = '';\n\t\t\t}else{\n\t\t\t\t$follow = ','.implode(',',$f).',';\n\t\t\t}\n\t\t\t\n\t\t\tM('member')->update(['id'=>$member_id],['follow'=>$follow]);\n\t\t\t$_SESSION['member']['follow'] = $follow;\n\t\t\tM('member')->goDec(['id'=>$uid],'fans',1);\n\t\t\tSuccess(JZLANG('取关成功！'),U('user/follow'));\n\n\n\t\t}else{\n\t\t\tError(JZLANG('链接错误！'));\n\t\t}\n\t}\n\tfunction fans(){\n\t\t$this->checklogin();\n\t\t$this->frpage = $this->frparam('page',0,1);\n\t\t$page = new Page('member');\n\t\t$member_id = $this->member['id'];\n\t\t$sql = \" follow like '%,\".$member_id.\",%'\" ;\n\t\t$data = $page->where($sql)->orderby('fans desc,regtime desc,id desc')->limit(15)->page($this->frpage)->go();\n\t\t$pages = $page->pageList(3,'?page=');\n\t\t$this->pages = $pages;//组合分页\n\t\t$this->lists = $data;//列表数据\n\t\t$this->sum = $page->sum;//总数据\n\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t$this->allpage = $page->allpage;//总页数\n\t\t$this->display($this->template.'/user/fans');\n\t}\n\t/*\n\t\n\t以下序号跟msgtype无关，仅表示可能的消息\n\t1、发布的文章/商品/其他被评论消息  article/product  comment\n\t2、发布的文章/商品/其他被点赞消息  article/product  likes\n\t3、发布的文章/商品/其他被收藏消息  article/product  collect\n\t4、被别人@消息 comment at\n\t5、留言被别人回复消息 comment reply\n\t6、交易消息  buylog rechange\n\t*7、官方消息  news channel\n\t*8、私信消息  member msg\n\t\n\n\t*/\n\tfunction notify(){\n\t\t$this->checklogin();\n\t\t$page = new Page('task');\n\t\t$msgtype = $this->frparam('msgtype');\n\t\t$this->msgtype = $msgtype;\n\t\tif($msgtype){\n\t\t\tswitch ($msgtype) {\n\t\t\t\tcase 1:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].\" and isshow=1 and (type = 'comment' or type = 'reply') \";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].\" and isshow=1 and type = 'collect'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].\" and isshow=1 and type = 'likes'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].\" and isshow=1 and type = 'at'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].\" and isshow=1 and type = 'rechange'\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$sql = 'userid='.$this->member['id'].' and isshow=1 ';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t}else{\n\t\t\t$sql = 'userid='.$this->member['id'].' and isshow=1 ';\n\t\t}\n\t\t\n\t\t//$sql = 'userid='.$this->member['id'];\n\t\t$data = $page->where($sql)->orderby('addtime desc')->page($this->frparam('page',0,1))->go();\n\t\t$page->file_ext = '';\n\t\t$pages = $page->pageList(5,'?page=');\n\t\tforeach($data as $k=>$v){\n\t\t\t$data[$k] = $v;\n\t\t\t$data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t$data[$k]['turl'] =  U('user/notifyto',['id'=>$v['id']]);\n\t\t\t$data[$k]['del'] =  U('user/notifydel',['id'=>$v['id']]);\n\t\t\t\n\t\t}\n\t\t$this->lists = $data;//列表数据\n\t\t$this->sum = $page->sum;//总数据\n\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t$this->allpage = $page->allpage;//总页数\n\t\tif($this->frparam('ajax')){\n\t\t\tJsonReturn(['code'=>0,'data'=>$data,'msg'=>'success']);\n\t\t}\n\t\t\n\t\t$this->display($this->template.'/user/notify');\n       \n    }\n\n\tfunction allread(){\n\t\t$this->checklogin();\n\t\tM('task')->update(['userid'=>$this->member['id']],['isread'=>1]);\n\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('操作成功！'),'data'=>[]]);\n\t\t\n\t}\n\t\n    function notifyto(){\n    \t$this->checklogin();\n    \t$id = $this->frparam('id');\n    \tif(!$id){\n    \t\tError(JZLANG('链接错误！'));\n    \t}\n    \t$notify = M('task')->find(['id'=>$id,'isshow'=>1,'userid'=>$this->member['id']]);\n    \tif(!$notify){\n    \t\tError(JZLANG('消息已被删除！'));\n    \t}\n    \t$task['readtime'] = time();\n    \t$task['isread'] = 1;\n    \tM('task')->update(['id'=>$id],$task);\n    \tRedirect($notify['url']);\n\n    }\n\n    function notifydel(){\n    \t$this->checklogin();\n    \t$id = $this->frparam('id');\n    \tif(!$id){\n    \t\tError(JZLANG('链接错误！'));\n    \t}\n    \t$notify = M('task')->find(['id'=>$id,'isshow'=>1,'userid'=>$this->member['id']]);\n    \tif(!$notify){\n    \t\tError(JZLANG('消息已被删除！'));\n    \t}\n    \t$r = M('task')->update(['id'=>$id],['isshow'=>0]);\n    \tif($r){\n    \t\tSuccess(JZLANG('删除成功！'),U('user/notify'));\n    \t}else{\n    \t\tError(JZLANG('删除失败！'));\n    \t}\n    }\n    //个人中心公共页\n    function active(){\n    \t$username = $this->frparam('uname',1);\n    \t$uid = $this->frparam('uid');\n    \tif($username || $uid){\n\t\t\tif($username){\n\t\t\t\t$this->user = M('member')->find(['username'=>$username]);\n\t\t\t}else{\n\t\t\t\t$this->user = M('member')->find(['id'=>$uid]);\n\t\t\t}\n\t\t}else{\n    \t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('链接错误！'),'data'=>[]]);\n\t\t\t}\n\t\t\tError(JZLANG('链接错误！'));\n    \t}\n\n\t\tif(!$this->user){\n\t\t\tError(JZLANG('用户未找到！'));\n\t\t}\n\t\t//统计评论数\n\t\t$this->comment_num = M('comment')->getCount(['userid'=>$this->user['id'],'isshow'=>1]);\n\t\t//统计点赞数\n        $this->likes_num = M('likes')->getCount(['userid'=>$this->user['id']]);\n        //统计收藏\n        $this->collect_num = M('shouchang')->getCount(['userid'=>$this->user['id']]);\n\t\t//发布文章统计\n\t\t$this->article_num = M('article')->getCount(['member_id'=>$this->user['id']]);\n\t\t$this->product_num = M('product')->getCount(['member_id'=>$this->user['id']]);\n\t\t\n\t\t$this->type = $this->frparam('type',0,1);\n\t\t\n\t\tswitch($this->type){\n\t\t\t\n\t\t\tcase 1:\n\t\t\t\t$molds = $this->frparam('molds',1,'article');\n\t\t\t\tif($molds!='article'){\n\t\t\t\t\tError(JZLANG('链接错误！'));\n\t\t\t\t}\n\t\t\t\t$this->molds = $molds;\n\t\t\t\t$this->moldsname = M('molds')->getField(['biaoshi'=>$molds],'name');\n\t\t\t\t$page = new Page($molds);\n\t\t\t\t$this->type = $this->frparam('type');\n\t\t\t\t$sql = 'member_id='.$this->user['id'].' and isshow=1  ';\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t$data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->page($this->frparam('page',0,1))->go();\n\t\t\t\t$page->file_ext = '';\n\t\t\t\t$pages = $page->pageList(5,'?page=');\n\t\t\t\t\n\t\t\t\tforeach($data as $k=>$v){\n\t\t\t\t\tif(isset($this->classtypedata[$v['tid']])){\n\t\t\t\t\t\t$data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname'];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$data[$k]['classname'] = '[ '.JZLANG('未分类 ').']';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t\t\t\n\t\t\t\t\t$data[$k]['url'] = gourl($v);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$this->pages = $pages;\n\t\t\t\t$this->lists = $data;//列表数据\n\t\t\t\t$this->sum = $page->sum;//总数据\n\t\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t\t\t$this->allpage = $page->allpage;//总页数\n\t\t\t\tif($this->frparam('ajax')){\n\n                    JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t$molds = $this->frparam('molds',1,'article');\n\t\t\t\tif($molds!='product'){\n\t\t\t\t\tError(JZLANG('链接错误！'));\n\t\t\t\t}\n\t\t\t\t$this->molds = $molds;\n\t\t\t\t$this->moldsname = M('molds')->getField(['biaoshi'=>$molds],'name');\n\t\t\t\t$page = new Page($molds);\n\t\t\t\t$this->type = $this->frparam('type');\n\t\t\t\t$sql = 'member_id='.$this->user['id'].' and isshow=1  ';\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t$data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->page($this->frparam('page',0,1))->go();\n\t\t\t\t$page->file_ext = '';\n\t\t\t\t$pages = $page->pageList(5,'?page=');\n\t\t\t\t\n\t\t\t\tforeach($data as $k=>$v){\n\t\t\t\t\tif(isset($this->classtypedata[$v['tid']])){\n\t\t\t\t\t\t$data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname'];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$data[$k]['classname'] = '[ '.JZLANG('未分类').' ]';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t\t\t\n\t\t\t\t\t$data[$k]['url'] = gourl($v);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$this->pages = $pages;\n\t\t\t\t$this->lists = $data;//列表数据\n\t\t\t\t$this->sum = $page->sum;//总数据\n\t\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t\t\t$this->allpage = $page->allpage;//总页数\n\t\t\t\tif($this->frparam('ajax')){\n\n                    JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t$this->frpage = $this->frparam('page',0,1);\n\t\t\t\t$page = new Page('member');\n\t\t\t\t$member_id = $this->user['id'];\n\t\t\t\t$follow = M('member')->getField(['id'=>$member_id],'follow');\n\t\t\t\tif($follow!=''){\n\t\t\t\t\t//,1,2,2,4,\n\t\t\t\t\t$ids = trim($follow,',');\n\n\t\t\t\t}else{\n\t\t\t\t\t$ids = 0;\n\t\t\t\t}\n\t\t\t\t$sql = \" id in(\".$ids.\") \" ;\n\t\t\t\t$data = $page->where($sql)->orderby('fans desc,regtime desc,id desc')->limit($this->frparam('limit',0,15))->page($this->frpage)->go();\n\t\t\t\t$pages = $page->pageList(5,'?page=');\n\t\t\t\t$this->pages = $pages;//组合分页\n\t\t\t\t$this->lists = $data;//列表数据\n\t\t\t\t$this->sum = $page->sum;//总数据\n\t\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t\t\t$this->allpage = $page->allpage;//总页数\n                if($this->frparam('ajax')){\n                    JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n                }\n\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\t$this->frpage = $this->frparam('page',0,1);\n\t\t\t\t$page = new Page('member');\n\t\t\t\t$member_id = $this->user['id'];\n\t\t\t\t$sql = \" follow like '%,\".$member_id.\",%'\" ;\n\t\t\t\t$data = $page->where($sql)->orderby('fans desc,regtime desc,id desc')->limit($this->frparam('limit',0,15))->page($this->frpage)->go();\n\t\t\t\t$pages = $page->pageList(3,'?page=');\n\t\t\t\t$this->pages = $pages;//组合分页\n\t\t\t\t$this->lists = $data;//列表数据\n\t\t\t\t$this->sum = $page->sum;//总数据\n\t\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t\t\t$this->allpage = $page->allpage;//总页数\n                if($this->frparam('ajax')){\n                    JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n                }\n\t\t\tbreak;\n\t\t\tcase 5:\n                $model = new Page('shouchang');\n                $member_id = $this->user['id'];\n                $data = $model->where(['userid'=>$member_id])->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go();\n                $model->file_ext = '';\n                $pages = $model->pageList(5,'?page=');\n                $this->pages = $pages;\n\n\n                foreach($data as $k=>$v){\n                    if(isset($this->classtypedata[$v['tid']])){\n                        $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname'];\n                        $molds = $this->classtypedata[$v['tid']]['molds'];\n                        $vdata = M($molds)->find(['id'=>$v['aid']]);\n                        $data[$k]['url'] = gourl($vdata);\n                        $data[$k]['details'] = $vdata;\n                    }else{\n                        $data[$k]['classname'] = '[ '.JZLANG('已被删除').' ]';\n                        $data[$k]['url'] = '';\n                        $data[$k]['details'] = [];\n                    }\n\n\n\n                }\n                \n                $this->sum = $model->sum;\n\t\t\t\t$this->lists = $data;\n\t\t\t\t$this->listpage = $model->listpage;//分页数组-自定义分页可用\n\t\t\t\t$this->prevpage = $model->prevpage;//上一页\n\t\t\t\t$this->nextpage = $model->nextpage;//下一页\n\t\t\t\t$this->allpage = $model->allpage;//总页数\n\t\t\t\tif($this->frparam('ajax')){\n\n                    JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\t$page = new Page('Comment');\n\t\t\t\t$sql = 'userid='.$this->user['id'].' and isshow=1 ';\n\t\t\t\t$data = $page->where($sql)->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go();\n\t\t\t\t$page->file_ext = '';\n\t\t\t\t$pages = $page->pageList(5,'?page=');\n\t\t\t\t$this->pages = $pages;\n\t\t\t\t\n\t\t\t\t$this->sum = $page->sum;\n\t\t\t\tforeach($data as $k=>$v){\n\t\t\t\t\tif(isset($this->classtypedata[$v['tid']])){\n\t\t\t\t\t\t$xmolds = M($this->classtypedata[$v['tid']]['molds'])->find(['id'=>$v['aid']]);\n\t\t\t\t\t\tif($xmolds){\n\t\t\t\t\t\t\t$data[$k]['title'] = $xmolds['title'];\n\t\t\t\t\t\t\t$data[$k]['date'] = date('Y/m/d H:i:s',$v['addtime']);\n\t\t\t\t\t\t\t$data[$k]['url'] =  gourl($xmolds);\n\t\t\t\t\t\t\t$data[$k]['body'] = newstr($v['body'],60);\n\t\t\t\t\t\t\t$data[$k]['comment_num'] =  get_comment_num($v['tid'],$v['aid']);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$this->lists = $data;//列表数据\n\t\t\t\t$this->sum = $page->sum;//总数据\n\t\t\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t\t\t$this->allpage = $page->allpage;//总页数\n\t\t\t\tif($this->frparam('ajax')){\n                    JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t\t\t}\n\t\n\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\t$lists = [];\n                $model = new Page('likes');\n                $data = $model->where(['userid'=>$this->member['id']])->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go();\n                $model->file_ext = '';\n                $pages = $model->pageList(5,'?page=');\n                $this->pages = $pages;\n\n\n                foreach($data as $k=>$v){\n                    if(isset($this->classtypedata[$v['tid']])){\n                        $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname'];\n                        $molds = $this->classtypedata[$v['tid']]['molds'];\n                        $vdata = M($molds)->find(['id'=>$v['aid']]);\n                        $data[$k]['url'] = gourl($vdata);\n                        $data[$k]['details'] = $vdata;\n                    }else{\n                        $data[$k]['classname'] = '[ '.JZLANG('已被删除 ').']';\n                        $data[$k]['url'] = '';\n                        $data[$k]['details'] = [];\n                    }\n\n\n\n\n                }\n\n\n\n                $this->lists = $data;\n\t\t\t\t$this->listpage = $model->listpage;//分页数组-自定义分页可用\n\t\t\t\t$this->prevpage = $model->prevpage;//上一页\n\t\t\t\t$this->nextpage = $model->nextpage;//下一页\n\t\t\t\t$this->allpage = $model->allpage;//总页数\n\t\t\t\tif($this->frparam('ajax')){\n                    JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']);\n\t\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\t\n\t\t$this->display($this->template.'/user/people');\n    \t\n    }\n\n    //消息提醒设置\n    function setmsg(){\n    \t$this->checklogin();\n    \tif($_POST){\n    \t\t$data['ismsg'] = $this->frparam('ismsg',0,0);\n    \t\t$data['iscomment'] = $this->frparam('iscomment',0,0);\n    \t\t$data['iscollect'] = $this->frparam('iscollect',0,0);\n    \t\t$data['islikes'] = $this->frparam('islikes',0,0);\n    \t\t$data['isat'] = $this->frparam('isat',0,0);\n    \t\t$data['isrechange'] = $this->frparam('isrechange',0,0);\n    \t\tM('member')->update(['id'=>$this->member['id']],$data);\n    \t\t$_SESSION['member'] = array_merge($_SESSION['member'],$data);\n    \t\tif($this->frparam('ajax')){\n\t\t\t\tJsonReturn(['code'=>0,'msg'=>JZLANG('设置成功'),'data'=>[]]);\n\t\t\t}\n\t\t\tSuccess(JZLANG('设置成功！'),U('user/setmsg'));\n    \t}\n    \t$this->display($this->template.'/user/setmsg');\n    }\n\n    function getclass(){\n    \t$molds = $this->frparam('molds',1,'article');\n    \t$data = M('classtype')->findAll(['molds'=>$molds,'ishome'=>1],'orders desc');\n    \tif(!$data){\n    \t\t$data = [];\n    \t}\n\t\t$data = getTree($data);\n    \tJsonReturn(['code'=>0,'data'=>$data,'msg'=>'success']);\n    }\n\n    //钱包\n    function wallet(){\n    \t$this->checklogin();\n    \t$lists = M('buylog')->findAll(['userid'=>$this->member['id'],'type'=>1]);\n    \t$cz_money = 0;\n    \t$cz_jifen = 0;\n    \tforeach ($lists as $key => $value) {\n    \t\tif($value['buytype']=='money'){\n    \t\t\t$cz_money += $value['amount'];\n    \t\t}else{\n    \t\t\t$cz_jifen += $value['amount'];\n    \t\t}\n\n    \t}\n    \t$this->user = M('member')->find(['id'=>$this->member['id']]);\n    \t$this->cz_money = $cz_money;\n    \t$this->cz_jifen = $cz_jifen;\n    \t$this->display($this->template.'/user/wallet');\n    }\n    //购买\n    function buy(){\n    \t$this->checklogin();\n    \tif($_POST){\n    \t\tif($this->webconf['paytype']==0){\n\t\t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('未开启在线支付！'),'data'=>[]]);\n\t\t\t}\n    \t\t$money = $this->frparam('allmoney',3);\n    \t\t$number = $this->frparam('number');\n    \t\tif(!$money || !$number){\n    \t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数错误！'),'data'=>[]]);\n    \t\t}\n    \t\t$w['jifen'] = $number;\n    \t\t$w['price'] = $money;\n    \t\t$w['orderno'] = 'No'.date('YmdHis');\n    \t\t$paytype = $this->frparam('paytype',0,1);\n    \t\t$w['userid'] = $this->member['id'];\n    \t\t$w['paytype'] = $paytype;\n\t\t\t$buytarget = $this->frparam('buytarget',0,1);\n    \t\tif($buytarget==1){\n    \t\t\t$w['ptype'] = 2;\n    \t\t}else{\n    \t\t\t$w['ptype'] = 3;\n    \t\t}\n    \t\t\n    \t\t$w['addtime'] = time();\n    \t\t$res = M('orders')->add($w);\n    \t\tif($res){\n    \t\t\tJsonReturn(['code'=>0,'msg'=>'success','data'=>$w]);\n    \t\t}else{\n    \t\t\tJsonReturn(['code'=>1,'msg'=>JZLANG('参数错误！'),'data'=>[]]);\n    \t\t}\n\n    \t}\n    \t$this->display($this->template.'/user/buy');\n    }\n    //购买列表\n    function buylist(){\n    \t$this->checklogin();\n    \t//兑换记录\n    \t$page1 = new Page('buylog');\n\t\t$this->type = $this->frparam('type',0,1);\n\t\tif($this->type==1){\n\t\t\t$sql =\"  type=2 \";\n\t\t}else if($this->type==2){\n\t\t\t$sql =\"  type=1 \";\n\t\t}else{\n\t\t\t$sql = \" type=3 \";\n\t\t}\n\t\t$sql.=\" and userid=\".$this->member['id'];\n\t\t$data1 = $page1->where($sql)->orderby('addtime desc')->page($this->frparam('p',0,1))->go();\n        $page1->typeurl = 'search';\n\t\t$pages1 = $page1->pageList(5,'&p=');\n\t\t$this->pages1 = $pages1;\n\t\tforeach($data1 as $k=>$v){\n\t\t\t$data1[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t$data1[$k]['details'] = U('user/buydetails',['id'=>$v['id']]);\n\t\t}\n\t\t$this->lists1 = $data1;//列表数据\n\t\t$this->sum1 = $page1->sum;//总数据\n\t\t$this->listpage1 = $page1->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage1 = $page1->prevpage;//上一页\n\t\t$this->nextpage1 = $page1->nextpage;//下一页\n\t\t$this->allpage1 = $page1->allpage;//总页数\n    \t//订单记录\n    \t$page = new Page('orders');\n\t\t$this->type = $this->frparam('type',0,1);\n\t\tif($this->type==1){\n\t\t\t$sql =\" ptype=1 \";\n\t\t}else{\n\t\t\t$sql =\" ptype=2 \";\n\t\t}\n\t\t$sql.=\"  and isshow!=0 and userid=\".$this->member['id'];\n\t\t$data = $page->where($sql)->orderby('addtime desc')->page($this->frparam('page',0,1))->go();\n        $page->typeurl = 'search';\n\t\t$pages = $page->pageList(5,'&page=');\n\t\t$this->pages = $pages;\n\t\tforeach($data as $k=>$v){\n\t\t\t$data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']);\n\t\t\t$data[$k]['orderdetails'] =  U('user/orderdetails',['orderno'=>$v['orderno']]);\n\t\t\t$data[$k]['orderdel'] =  U('user/orderdel',['orderno'=>$v['orderno']]);\n\t\t\t$data[$k]['buytype'] = M('buylog')->getField(['orderno'=>$v['orderno']],'type');\n\t\t}\n\t\t$this->lists = $data;//列表数据\n\t\t$this->sum = $page->sum;//总数据\n\t\t$this->listpage = $page->listpage;//分页数组-自定义分页可用\n\t\t$this->prevpage = $page->prevpage;//上一页\n\t\t$this->nextpage = $page->nextpage;//下一页\n\t\t$this->allpage = $page->allpage;//总页数\n\n    \t$this->display($this->template.'/user/buy-list');\n    }\n    //交易详情\n    function buydetails(){\n    \t$this->checklogin();\n    \t$id = $this->frparam(\"id\");\n    \tif($id){\n    \t\t$data = M('buylog')->find(['id'=>$id,'userid'=>$this->member['id']]);\n    \t\tif($data){\n    \t\t\t$this->data = $data;\n    \t\t\t$this->display($this->template.'/user/buy-view');\n    \t\t}else{\n    \t\t\tError(JZLANG('记录不存在！'));\n    \t\t}\n    \t}else{\n    \t\tError(JZLANG('链接错误！'));\n    \t}\n    \t\n    }\n\t\n\t//动态获取消息\n\tfunction getmsg(){\n\t\techo has_no_read_msg();\n\t}\n\t\n\t//预览信息\n\tfunction preview(){\n    \t\n    \t$this->checklogin();\n    \t$tid = $this->frparam('tid');\n    \t$id = $this->frparam('id');\n    \t\n    \tif(!$id){\n\t\t\t$this->error(JZLANG('缺少ID！'));\n\t\t}\n\t\tif(!$tid){\n\t\t\t$this->error(JZLANG('缺少栏目ID！'));\n\t\t}\n\t\t$this->type = $this->classtypedata[$tid];\n\t\t\n\t\t\n\t\t$details = M($this->type['molds'])->find(array('id'=>$id,'member_id'=>$this->member['id']));\n\t\tif(!$details){\n\t\t\t$this->error(JZLANG('未找到相应内容！'));\n\t\t\texit;\n\t\t}\n\t\tif(!isset($details['url'])){\n\t\t\t$details['url'] = gourl($details);\n\t\t}\n\t\t\n\t\t\n\t\t//body\n\t\tif(array_key_exists('body',$details)){\n\t\t\t$con = $details['body'];\n\t\t\t$chains = M('chain')->findAll(['isshow'=>1]);\n\t\t\tif($chains){\n\t\t\t\tforeach($chains as $v){\n\t\t\t\t\t$url = $v['url'];\n\t\t\t\t\t$num = $v['num'];\n\t\t\t\t\t$name = $v['title'];\n\t\t\t\t\t$newname = $v['newtitle']!='' ? $v['newtitle'] : $name;\n\t\t\t\t\tif($url!=''){\n\t\t\t\t\t\t$astr = \"<a href='\".$url.\"' target='_blank' title='\".$newname.\"'><strong>\".$newname.\"</strong></a>\";\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$astr = $newname;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$con = preg_replace( '|(<img\\b[^>]*?)('.$name.')([^>]*?\\=)([^>]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3$4%&&&&&%$6', $con);\n\t\t\t\t\t$con = preg_replace( '|(<img\\b[^>]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3', $con);\n\t\t\t\t\t$con = preg_replace( '|(<a\\b[^>]*?)('.$name.')([^>]*?>)(<[^<]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3$4%&&&&&%$6', $con);\n\n\t\t\t\t\t$con = str_replace_limit($name, $astr, $con, $num);\n\t\t\t\t\t$con = str_replace('%&&&&&%', $newname, $con);\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t$details['body'] = $con;\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t$this->jz = $details;\n\t\t\n\t\t$aprev_sql = ' id<'.$id.' and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') ';\n\t\t$anext_sql = ' id>'.$id.' and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') ';\n\t\t$aprev = M($this->type['molds'])->find($aprev_sql,'id desc');\n\t\t$anext = M($this->type['molds'])->find($anext_sql,'id asc');\n\t\tif($aprev){\n\t\t\t$aprev['url'] = gourl($aprev);\n\t\t}\n\t\tif($anext){\n\t\t\t$anext['url'] = gourl($anext);\n\t\t}\n\t\t$this->aprev = $aprev;\n\t\t$this->anext = $anext;\n\t\t\n\t\t//面包屑导航\n\t\t$classtypetree = array_reverse($this->classtypetree);\n\t\t$isgo = false;\n\t\t$newarray = [];\n\t\t$parent = [];//标记父类\n\t\t$istop = false;\n\t\tforeach($classtypetree as $k=>$v){\n\t\t\tif($v['id']==$this->type['id'] && !$isgo){\n\t\t\t\t$isgo = true;\n\t\t\t\t$this->type['level'] = $v['level'];\n\t\t\t\t$newarray[]=$v;\n\t\t\t}\n\t\t\tif($v['id']==$this->type['id'] && $v['level']==0){\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif($v['level']==0 && $v['id']!=$this->type['id'] && $v['id']!=$this->type['pid']){\n\t\t\t\tif(!$istop && $isgo && $parent['level']!=0){\n\t\t\t\t\t$newarray[]=$v;\n\t\t\t\t\t$istop = true;\n\t\t\t\t}\n\t\t\t\t$isgo = false;\n\t\t\t}\n\t\t\tif($isgo &&  $v['id']!=$this->type['id'] && $this->type['level']>$v['level']){\n\t\t\t\t\n\t\t\t\tif(isset($parent['pid'])){\n\t\t\t\t\tif($parent['level']!=$v['level']){\n\t\t\t\t\t\t$newarray[]=$v;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$newarray[]=$v;\n\t\t\t\t}\n\t\t\t\t$parent = $v;\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t$newarray2 = array_reverse($newarray);\n\t\t$positions='<a href=\"'.get_domain().'\">'.JZLANG('首页').'</a>';\n\t\tforeach($newarray2 as $v){\n\t\t\t$positions.='  &gt;  <a href=\"'.$v['url'].'\">'.$v['classname'].'</a>';\n\t\t}\n\t\t\n\t\t$this->positions_data = $newarray2;\n\t\t$this->positions = $positions;\n\t\t\n\t\tif($this->frparam('ajax') && $this->webconf['isajax'] ){\n\t\t\t\n\t\t\t$sql = [];\n\t\t\t$sql[] = \" tids like '%,\".$details['tid'].\",%' \"; \n\t\t\t$sql[] = \" molds = '\".$this->type['molds'].\"' and isshow=1 \";\n\t\t\t$sql[] = \" isajax=0 \";//查询出不允许访问的字段，进行限制\n\t\t\t$sql = implode(' and ',$sql);\n\t\t\t\n\t\t\t$fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\n\t\t\tif($fields_list){\n\t\t\t\t$noallow = [];\n\t\t\t\tforeach($fields_list as $v){\n\t\t\t\t\t$noallow[]=$v['field'];\n\t\t\t\t}\n\n\t\t\t\tforeach($details as $kk=>$vv){\n\t\t\t\t\tif(in_array($kk,$noallow)){\n\t\t\t\t\t\tunset($details[$kk]);\n\t\t\t\t\t\tunset($aprev[$kk]);\n\t\t\t\t\t\tunset($anext[$kk]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t}\n\t\t\t\n\t\t\tJsonReturn(['code'=>0,'data'=>['jz'=>$details,'prev'=>$aprev,'next'=>$anext],'msg'=>'success','jz'=>$details,'prev'=>$aprev,'next'=>$anext]);\n\t\t}\n\t\tif(!$this->type['details_html']){\n\t\t\t$details_html = M('molds')->getField(['biaoshi'=>$this->type['molds']],'details_html');\n\t\t\t$this->type['details_html'] = str_replace('.html','',$details_html);\n\t\t}\n\t\t$this->display($this->template.'/'.$this->type['molds'].'/'.$this->type['details_html']);\n    \t\n    }\n\n}"
  },
  {
    "path": "app/home/c/WechatController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.inchinalife.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2020/01/01\n// +----------------------------------------------------------------------\n\n\nnamespace app\\home\\c;\n\n\nuse frphp\\extend\\Page;\n \nclass WechatController extends CommonController\n{\n\tpublic function _init(){\n\t\tparent::_init();\n\t}\n\t\n\t\n\tpublic function index(){\n\t\tif (isset($_GET['echostr'])){\n\t\t\t$this->checkWeixin();\n\t\t}else{\n\t\t\t$this->responseMsg();\n\t\t}\n\t}\n\t\n\t//微信登录\n\tpublic function login(){\n\t\t\n\t\t//存储当前页面链接\n\t\tif(!isset($_SESSION['return_url'])){\n\t\t\t$referer = ($_SERVER['HTTP_REFERER']=='') ? U('user/index') : $_SERVER['HTTP_REFERER'];\n\t\t\t$_SESSION['return_url'] = $referer;\n\t\t}\n\t\t\n\t\t//检查微信配置\n\t\tif($this->webconf['wx_login_appid']!='' && $this->webconf['wx_login_appsecret']!='' && $this->webconf['wx_login_token']!=''){\n\t\t\t\n\t\t\t//获取openid，并检测是否已存在\n\t\t\tif(!isset($_GET['code'])){\n\t\t\t\t\n\t\t\t\t\t//进入授权登录\n\t\t\t\t\t$appid = $this->webconf['wx_login_appid'];\n\t\t\t\t\t\n\t\t\t\t\t$localhost = get_domain().$_SERVER['REQUEST_URI'];//当前页面url\n\t\t\t\t\t//echo $localhost;exit;\n\t\t\t\t\t$redirect_uri = urlencode($localhost);\n\t\t\t\t\t$url = \"https://open.weixin.qq.com/connect/oauth2/authorize?appid=\".$appid.\"&redirect_uri=\".$redirect_uri.\"&response_type=code&scope=snsapi_base&state=123#wechat_redirect\";\n\t\t\t\t\t//echo $url;exit;\n\t\t\t\t\theader('location:'.$url);\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t$res = $this->getopenid();\n\t\t\t\t$openid = $res['openid'];\n\t\t\t\tif(!$openid){\n\t\t\t\t\t$_GET['code']=null;\n\t\t\t\t\t//授权失败重新登录\n\t\t\t\t\tRedirect(U('login'));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$islive = M('member')->find(array('openid'=>$openid));\n\t\t\t\tif($islive){\n\t\t\t\t\t//已存在的用户，直接登录系统\n\t\t\t\t\tunset($islive['pass']);\n\t\t\t\t\t//更新登录时间\n\t\t\t\t\tM('member')->update(['id'=>$islive['id']],['logintime'=>time()]);\n\t\t\t\t\t$_SESSION['member'] = $islive;\n\t\t\t\t\tRedirect($_SESSION['return_url']);\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t//未绑定，进行授权登录，获取用户信息\n\t\t\t\t\t$_GET['code']=null;\n\t\t\t\t\t$this->register();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}else{\n\t\t\texit(JZLANG('系统未配置微信登录！'));\n\t\t}\n\t\t\n\t}\n\t\n\t\n\t//绑定微信号\n\tpublic function bindinguser(){\n\t\t\n\t\tif(!isset($_GET['code'])){\n\t\t\t\n\t\t\t\t//进入授权登录\n\t\t\t\t$appid = $this->webconf['wx_login_appid'];\n\t\t\t\t\n\t\t\t\t$localhost = get_domain().$_SERVER['REQUEST_URI'];//当前页面url\n\t\t\t\t//echo $localhost;exit;\n\t\t\t\t$redirect_uri = urlencode($localhost);\n\t\t\t\t$url = \"https://open.weixin.qq.com/connect/oauth2/authorize?appid=\".$appid.\"&redirect_uri=\".$redirect_uri.\"&response_type=code&scope=snsapi_base&state=123#wechat_redirect\";\n\t\t\t\t//echo $url;exit;\n\t\t\t\theader('location:'.$url);\n\t\t\t\n\t\t}else{\n\t\t\t$res = $this->getopenid();\n\t\t\t$openid = $res['openid'];\n\t\t\tif(!$openid){\n\t\t\t\t$_GET['code']=null;\n\t\t\t\t//Error('授权失败，重新登录~',U('bindinguser'));\n\t\t\t\tRedirect(U('bindinguser'));\n\t\t\t}\n\t\t\t\n\t\t\t$islive = M('member')->find(array('openid'=>$openid));\n\t\t\tif($islive){\n\t\t\t\t//绑定账户\n\t\t\t\tif($this->member['openid']==$islive['openid']){\n\t\t\t\t\tSuccess(JZLANG('微信已绑定！'),U('User/index'));\n\t\t\t\t}else{\n\t\t\t\t\tError(JZLANG('您的微信已被绑定，不能再绑定！'),U('User/index'));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t//未绑定，进行授权绑定\n\t\t\t\t$_GET['code']=null;\n\t\t\t\t$this->register();\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t\n\t}\n\t\n\t//验证微信公众号\n\tpublic function checkWeixin(){\n\t\t//微信会发送4个参数到我们的服务器后台 签名 时间戳 随机字符串 随机数\n\n\t\t\t$signature = $_GET[\"signature\"];\n\t\t\t$timestamp = $_GET[\"timestamp\"];\n\t\t\t$nonce = $_GET[\"nonce\"];\n\t\t\t$echostr = format_param($_GET[\"echostr\"],1);\n\t\t\t$token = $this->webconf['wx_login_token'];\n\n\t\t\t// 1）将token、timestamp、nonce三个参数进行字典序排序\n\t\t\t$tmpArr = array($nonce,$token,$timestamp);\n\t\t\tsort($tmpArr,SORT_STRING);\n\n\t\t\t// 2）将三个参数字符串拼接成一个字符串进行sha1加密\n\t\t\t$str = implode($tmpArr);\n\t\t\t$sign = sha1($str);\n\n\t\t\t// 3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信\n\t\t\tif ($sign == $signature) {\n\t\t\t\techo $echostr;\n\t\t\t}\n\t}\n\t\n\tpublic function responseMsg(){\n\t\n\t\t//get post data, May be due to the different environments\n\t\t//$postStr = $GLOBALS[\"HTTP_RAW_POST_DATA\"];\n\t\t$postStr = file_get_contents('php://input');\n\t\t\n\t\t//extract post data\n\t\tif (!empty($postStr)){\n\t\t\t\n\t\t\t/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,\n\t\t\t   the best way is to check the validity of xml by yourself */\n\t\t\tlibxml_disable_entity_loader(true);\n\t\t\t$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);\n\t\t\t$this->postObj = $postObj;\n\t\t\t$fromUsername = $postObj->FromUserName;\n\t\t\t$toUsername = $postObj->ToUserName;\n\t\t\t$keyword = trim($postObj->Content);\n\t\t\t$time = time();\n\t\t\t$textTpl = \"<xml>\n\t\t\t\t\t\t\t<ToUserName><![CDATA[%s]]></ToUserName>\n\t\t\t\t\t\t\t<FromUserName><![CDATA[%s]]></FromUserName>\n\t\t\t\t\t\t\t<CreateTime>%s</CreateTime>\n\t\t\t\t\t\t\t<MsgType><![CDATA[%s]]></MsgType>\n\t\t\t\t\t\t\t<Content><![CDATA[%s]]></Content>\n\t\t\t\t\t\t\t<FuncFlag>0</FuncFlag>\n\t\t\t\t\t\t\t</xml>\";\n\t\t\tif($postObj->MsgType=='event'){\n\t\t\t\tswitch ($postObj->Event){\n\t\t\t\t\tcase 'CLICK':\n\t\t\t\t\t/*\n\t\t\t\t\tif($postObj->EventKey == 'xxx'){\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'subscribe':\n\t\t\t\t\t//获取用户信息，并存入数据库\n\t\t\t\t\t$openid = $fromUsername;\n\t\t\t\t\t//查询是否已有账号\n\t\t\t\t\t$openid = format_param($openid,1);\n\t\t\t\t\t$islive = M('member')->find(array('openid'=>$openid));\n\t\t\t\t\tif(!$islive){\n\t\t\t\t\t\t$access_token = $this->getAccessToken();\n\t\t\t\t\t\t$url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';\n\t\t\t\t\t\t$user = file_get_contents($url);\n\t\t\t\t\t\t$user = json_decode($user,true);\n\n                        $n = M('member')->add(['username'=>'微信用户'.date('YmdHis'),'openid'=>$openid,'regtime'=>$time]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif($n){\n\t\t\t\t\t\t\tif($this->webconf['huanying']!=''){\n\t\t\t\t\t\t\t\t$contentStr = htmlspecialchars_decode($this->webconf['huanying']);\n\t\t\t\t\t\t\t\t$msgType = \"text\";\n\t\t\t\t\t\t\t\t$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);\n\t\t\t\t\t\t\t\techo $resultStr;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t/*\n\t\t\t\tif($keyword){\n\t\t\t\t\t$contentStr = '已收到您的信息：'.$keyword;\n\t\t\t\t}else{\n\t\t\t\t\t$contentStr = '您好，请问我可以为你做什么呢？';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$msgType = \"text\";\n\t\t\t\t$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);\n\t\t\t\techo $resultStr;\n\t\t\t\t*/\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\n\t\t}else {\n\t\t\techo \"\";\n\t\t\texit;\n\t\t}\n\t}\n\t\n\tpublic function getAccessToken(){\n\t\n\t\t$url = \"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=\".$this->webconf['wx_login_appid'].\"&secret=\".$this->webconf['wx_login_appsecret'];\n\t\t$json = file_get_contents($url);\n\t\t//解析json\n\t\t//var_dump($json);\n\t\t$obj = json_decode($json);\n\t\treturn  $obj->access_token; \n\t}\n\t//获取用户的详情\n\tpublic\tfunction getopenid(){\n\t\t\t\n\t\t$code = $_GET['code'];\n\t\t$url = \"https://api.weixin.qq.com/sns/oauth2/access_token?appid=\".$this->webconf['wx_login_appid'].\"&secret=\".$this->webconf['wx_login_appsecret'].\"&code=\".$code.\"&grant_type=authorization_code \";\n\n\t\t$res = file_get_contents($url);\n\t\t\n\t\t$json_obj = json_decode($res,true);\n\t\t//var_dump($json_obj);exit;\n\t\tif(isset($json_obj['openid'])){\n\t\t\t$openid = $json_obj['openid'];\n\t\t\t$_SESSION['openid'] = $openid;\n\t\t\t\n\t\t\t$access_token = $json_obj['access_token'];\n\t\t\n\t\t\t$openid = $json_obj['openid'];\n\t\t\treturn array('openid'=>$openid,'access_token'=>$access_token);\n\t\t}else{\n\t\t\t//return false;\n\t\t\texit($res);\n\t\t}\n\t\t\n\t}\n\t\n\t\t\n\t\n\t\n\t//用户注册\n\tpublic function register(){\n\t\tif(!isset($_GET['code'])){\n\t\t\t\n\t\t\t$appid = $this->webconf['wx_login_appid'];\n\t\t\t\n\t\t\t$redirect_uri = urlencode(U('register'));\n\t\t\t$url = \"https://open.weixin.qq.com/connect/oauth2/authorize?appid=\".$appid.\"&redirect_uri=\".$redirect_uri.\"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect\";\n\t\t\theader('location:'.$url);\n\t\t}else{\n\t\t\t$res = $this->getopenid();\n\t\t\t$openid = $res['openid'];\n\t\t\tif(!$openid){\n\t\t\t\t$_GET['code']=null;\n\t\t\t\t//Error('登录失败，重新登录~',U('register'));\n\t\t\t\tRedirect(U('register'));\n\t\t\t\t\n\t\t\t}\n\t\t\t$islive = M('member')->find(array('openid'=>$openid));\n\t\t\t//查询是否已存在\n            if(!$islive){\n\t\t\t\t$access_token  =  $res['access_token']; \n\t\t\t\t$url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';\n\t\t\t\t$user = file_get_contents($url);\n\t\t\t\t$user = json_decode($user,true);\n\t\t\t    $time = time();\n\t\t\t\t$n = M('member')->add(['username'=>$user['nickname'],'openid'=>$openid,'litpic'=>$user['headimgurl'],'sex'=>$user['sex'],'logintime'=>$time]);\n\t\t\t\t\n\t\t\t\tif($n){\n\t\t\t\t\t$user = M('member')->find(['id'=>$n]);\n\t\t\t\t\tunset($user['pass']);\n\t\t\t\t\t$_SESSION['member'] = $user;\n\t\t\t\t\t//Success('登录成功！',U('User/index'));\n\t\t\t\t\tRedirect(U('User/index'));\n\t\t\t\t\t\n\t\t\t\t}else{\n\t\t\t\t\t$_GET['code']=null;\n\t\t\t\t\t//未知错误，重新注册\n\t\t\t\t\tRedirect(U('register'));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\t\n\t\t\t\t//已存在的用户，直接登录系统\n\t\t\t\tunset($islive['pass']);\n\t\t\t\t//更新登录时间\n\t\t\t\tM('member')->update(['id'=>$islive['id']],['logintime'=>time()]);\n\t\t\t\t$_SESSION['member'] = $islive;\n\t\t\t\tRedirect(U('user/index'));\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t}\n\t\n\t\n\t\n\n\t//发送模板消息\n\tfunction sendTemplate($data){\n\t\t$access_token = $this->getAccessToken();\n\t\t$api = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$access_token;\n\t\t$res = curl_http($api,json_encode($data,JSON_UNESCAPED_UNICODE),'POST');\n\t\t$res = json_decode($res,1);\n\t\tif($res['errcode']==0){\n\t\t\treturn true;\n\t\t}else{\n\t\t\tError($res['errmsg']);\n\t\t}\n\t\t\n\t}\n\t\n\t//发红包--涉及支付的账户，请填写系统设置中的支付相关微信商户\n\tfunction hongbao($title,$money,$openid,$biaoyu='恭喜发财'){\n\t\t//$money = 100; //最低1元，单位分\n\t\t$sender = $title;\n\t\t$obj = array();\n\t\t$obj['wxappid'] = $this->webconf['wx_appid']; //appid\n\t\t$obj['mch_id'] = $this->webconf['wx_mchid'];//商户id\n\t\t$obj['mch_billno'] = $this->webconf['wx_mchid'].date('YmdHis').rand(1000,9999);//组合成28位，根据官方开发文档，可以自行设置\n\t\t$obj['client_ip'] = $_SERVER['REMOTE_ADDR'];\n\t\t$obj['re_openid'] = $openid;//接收红包openid\n\t\t$obj['total_amount'] = $money;\n\t\t$obj['min_value'] = $money;\n\t\t$obj['max_value'] = $money;\n\t\t$obj['total_num'] = 1;\n\t\t$obj['nick_name'] = $sender;\n\t\t$obj['send_name'] = $sender;\n\t\t$obj['wishing'] = $biaoyu;\n\t\t$obj['act_name'] = $sender;\n\t\t$obj['remark'] = $sender;\n\t\t$url = \"https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack\";\n\t\t$obj['nonce_str'] = $this->create_noncestr();  //创建随机字符串\n\t\t$stringA = $this->create_qianming($obj,false);  //创建签名\n\t\t$stringSignTemp = $stringA.\"&key=\".$this->webconf['key'];  //签名后加api\n\t\t$sign = strtoupper(md5($stringSignTemp));  //签名加密并大写\n\t\t$obj['sign'] = $sign;  //将签名传入数组\n\t\t$postXml = $this->arrayToXml($obj);  //将参数转为xml格式\n\t\t//var_dump($postXml);\n\t\t$responseXml = $this->curl_post_ssl($url,$postXml);  //提交请求\n\t\t//var_dump($responseXml);\n\t\t//return $responseXml;\n\t\t$xml = simplexml_load_string($responseXml);\n\t\t$res = json_decode(json_encode($xml),TRUE);\n\t\treturn $res;\n\t\t\n\t\t\n\t}\n\t\n\t//生成随机字符串，默认32位\n\n\tfunction create_noncestr($length=32) {\n\t\t//创建随机字符\n\t\t$chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\t\t$str = \"\";\n\t\tfor($i=0;$i<$length;$i++) {\n\t\t  $str.=substr($chars, mt_rand(0,strlen($chars)-1),1);\n\t\t}\n\t\treturn $str;\n\n\t}\n\t//数组转xml\n\n\tfunction arrayToXml($arr) {\n\t\t$xml = \"<xml>\";\n\t\tforeach ($arr as $key=>$val) {\n\t\t  if (is_numeric($val)) {\n\t\t\t$xml.=\"<\".$key.\">\".$val.\"</\".$key.\">\";\n\t\t  } else {\n\t\t\t$xml.=\"<\".$key.\"><![CDATA[\".$val.\"]]></\".$key.\">\";\n\t\t  }\n\t\t}\n\t\t$xml.=\"</xml>\";\n\t\treturn $xml;\n\t}\n\t\n\t//post请求网站，需要证书\n\n\tfunction curl_post_ssl($url, $vars, $second=30,$aHeader=array())\n\t  {\n\t\t$ch = curl_init();\n\t\t//超时时间\n\t\tcurl_setopt($ch,CURLOPT_TIMEOUT,$second);\n\t\tcurl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);\n\t\t//这里设置代理，如果有的话\n\t\tcurl_setopt($ch,CURLOPT_URL,$url);\n\t\tcurl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);\n\t\tcurl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);\n\t\t//cert 与 key 分别属于两个.pem文件\n\t\t//请确保您的libcurl版本是否支持双向认证，版本高于7.20.1\n\t\tcurl_setopt($ch,CURLOPT_SSLCERT,$this->webconf['apiclient_cert']);\n\t\tcurl_setopt($ch,CURLOPT_SSLKEY,$this->webconf['apiclient_key']);\n\t\tcurl_setopt($ch,CURLOPT_CAINFO,$this->webconf['rootca']);\n\t\tif( count($aHeader) >= 1 ){\n\t\t  curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);\n\t\t}\n\t\tcurl_setopt($ch,CURLOPT_POST, 1);\n\t\tcurl_setopt($ch,CURLOPT_POSTFIELDS,$vars);\n\t\t$data = curl_exec($ch);\n\t\tif($data){\n\t\t  curl_close($ch);\n\t\t  return $data;\n\t\t}else {\n\t\t  $error = curl_errno($ch);\n\t\t  echo \"call faild, errorCode:$error\\n\";\n\t\t  curl_close($ch);\n\t\t  return false;\n\t\t}\n\n\t}\n\t\n\n\t\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "app/home/lang/back.php",
    "content": "<?php return array (\n  '该角色下存在用户，请先移除用户再删除！' => '',\n  '删除失败，该分组不允许删除！' => '',\n  '删除成功！' => '',\n  '删除失败，请重试！' => '',\n  '非法操作！' => '',\n  '修改失败，您的权限不足！' => '',\n  '修改成功！' => '',\n  '修改失败，请重新提交！' => '',\n  '没有该角色！' => '',\n  '新增成功！' => '',\n  '新增失败，请重新提交！' => '',\n  '修改失败，该分组不允许修改！' => '',\n  '您没有权限操作！' => '',\n  '两次密码不同！' => '',\n  '手机号已被注册！' => '',\n  '昵称已被使用！' => '',\n  '邮箱已被使用！' => '',\n  '修改失败！' => '',\n  '新增失败！' => '',\n  '系统管理员不能删除！' => '',\n  '删除失败！' => '',\n  '批量操作失败！' => '',\n  '批量删除成功！' => '',\n  '添加失败' => '',\n  '存在敏感词' => '',\n  '已存在相同的自定义URL！' => '',\n  '添加成功,继续添加~' => '',\n  '内容配置' => '',\n  '修改失败' => '',\n  '发布奖励' => '',\n  '您未做任何修改，不能提交！' => '',\n  '复制成功！' => '',\n  '复制失败！' => '',\n  '批量复制成功！' => '',\n  '批量修改成功！' => '',\n  '批量操作成功！' => '',\n  'URL链接命名不能是' => '',\n  '非法URL' => '',\n  '添加栏目成功，继续添加~' => '',\n  '模型错误！' => '',\n  '不能选择当前栏目及下级为顶级栏目' => '',\n  '该栏目有子栏目，请先删除子栏目！' => '',\n  '栏目不能为空！' => '',\n  '操作成功！' => '',\n  '请选择分类！' => '',\n  '添加成功！继续添加~' => '',\n  '添加失败！' => '',\n  '该分类下存在内容，请先删除该分类下的内容！' => '',\n  '添加成功！' => '',\n  '已审核' => '',\n  '被删除' => '',\n  '未审核' => '',\n  '已读' => '',\n  '未读' => '',\n  '批量审核成功！' => '',\n  '批量审核失败！' => '',\n  '您没有权限！' => '',\n  '文件类型不允许上传！' => '',\n  '文件大小超过网站内部限制！' => '',\n  '请检查目录写入权限' => '',\n  '错误信息提示' => '',\n  '模块为空，请选择模块！' => '',\n  '缺少ID' => '',\n  '请选择模块！' => '',\n  '显示' => '',\n  '隐藏' => '',\n  '是' => '',\n  '否' => '',\n  '单行文本' => '',\n  '多行文本' => '',\n  '文本编辑器' => '',\n  '数字' => '',\n  '单图片' => '',\n  '多图片' => '',\n  '单选下拉' => '',\n  '多选' => '',\n  '单附件' => '',\n  '多附件' => '',\n  '时间戳' => '',\n  '单选按钮' => '',\n  '单选关联' => '',\n  '小数' => '',\n  '多行录入' => '',\n  '多选关联' => '',\n  '栏目' => '',\n  '副栏目' => '',\n  '系统TAG' => '',\n  '字段名和字段标识不能为空！' => '',\n  '字段标识已存在！' => '',\n  '系统保护字段，不允许创建！' => '',\n  '字段长度不对！' => '',\n  '字段长度不对,时间属性必须长度为11' => '',\n  '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '',\n  '字段创建成功，但是字段表记录失败，请反馈官方解决！' => '',\n  '字段创建成功！' => '',\n  '字段修改成功！' => '',\n  '字段修改失败！' => '',\n  '上传图片' => '',\n  '选择图片' => '',\n  '图片未找到' => '',\n  '删除这张图片' => '',\n  '删除' => '',\n  '上传异常！' => '',\n  '文字描述' => '',\n  '左移' => '',\n  '右移' => '',\n  '请选择' => '',\n  '上传附件' => '',\n  '字段关联绑定失败，请重新绑定！' => '',\n  '请选择关联项' => '',\n  'TAG标签' => '',\n  '按Enter回车自动添加' => '',\n  '添加一个标签' => '',\n  '系统字段不允许删除！' => '',\n  '请选择字段！' => '',\n  '请选择栏目！' => '',\n  '参数有误！' => '',\n  '请选择桌面配置！' => '',\n  '系统默认不可删除！' => '',\n  '网站地图创建成功！' => '',\n  '网站地图创建失败，请检查根目录权限！' => '',\n  '清除失败！' => '',\n  '清除成功！' => '',\n  '生成失败！' => '',\n  '生成成功！' => '',\n  '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~' => '',\n  '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~' => '',\n  '静态HTML页面已全部清理完毕！' => '',\n  '总共清理页面数：' => '',\n  '每次清理页面数：' => '',\n  '停顿时间：' => '',\n  '开始时间：' => '',\n  '结束时间：' => '',\n  '总共花费时间：' => '',\n  '总共生成页面数：' => '',\n  '每次生成页面数：' => '',\n  '系统创建目录失败!' => '',\n  '模块未绑定栏目，无法生存HTML！' => '',\n  '链接错误！' => '',\n  '请输入属性名称！' => '',\n  '属性已存在！' => '',\n  '参数错误！' => '',\n  '系统属性只允许修改和隐藏，不允许删除！' => '',\n  '请输入内链词！' => '',\n  '请输入内链！' => '',\n  '内链词已存在！' => '',\n  '已审' => '',\n  '退回' => '',\n  '未审' => '',\n  '账户密码不能为空！' => '',\n  '验证码错误！' => '',\n  '该账户已被封禁！' => '',\n  '登录成功！' => '',\n  '账户密码错误！' => '',\n  '安全退出~' => '',\n  '无' => '',\n  '不显示' => '',\n  '邮箱已被注册！' => '',\n  '添加失败，请重新提交！' => '',\n  '没有找到该用户！' => '',\n  '该分组下存在用户，请先移除用户再删除！' => '',\n  '删除失败，该分类有下级功能，请先删除下级功能！' => '',\n  '未选择删除对象！' => '',\n  '模块名和标识不能为空！' => '',\n  '模型已添加不能重复添加！' => '',\n  '该表已存在！' => '',\n  '标题' => '',\n  '默认为空' => '',\n  '所属栏目' => '',\n  '选择栏目' => '',\n  '绑定后可以在当前模型的其他栏目中显示' => '',\n  '关键词' => '',\n  '每个词用英文逗号(,)拼接' => '',\n  '缩略图' => '',\n  '可留空' => '',\n  '简介' => '',\n  '内容' => '',\n  '发布会员' => '',\n  '前台发布会员ID记录' => '',\n  '管理员' => '',\n  '后台发布管理员ID记录' => '',\n  '外链URL' => '',\n  '默认为空，系统访问内容则直接跳转到此链接' => '',\n  '自定义URL' => '',\n  '默认为空，自定义URL' => '',\n  '点击量' => '',\n  '系统自动添加' => '',\n  '评论数' => '',\n  '系统自带' => '',\n  '点赞数' => '',\n  '排序' => '',\n  '添加时间' => '',\n  '选择时间' => '',\n  '推荐属性' => '',\n  '1置顶2热点3推荐' => '',\n  '置顶=1,热点=2,推荐=3' => '',\n  '是否显示' => '',\n  '显示隐藏' => '',\n  '显示=1,未审=0,退回=2' => '',\n  '列表' => '',\n  '新增' => '',\n  '修改' => '',\n  '复制' => '',\n  '批量删除' => '',\n  '批量修改' => '',\n  '批量复制' => '',\n  '批量审核' => '',\n  '管理' => '',\n  '新增模型成功，快去创建对应的栏目吧！' => '',\n  '新增模型成功，快去设置表字段吧！' => '',\n  '新增模型失败！' => '',\n  '标识不能为空！' => '',\n  '系统模型标识不允许修改！' => '',\n  '页面有错误，缺少模块ID！' => '',\n  '里面存在数据，请先清空表内数据！' => '',\n  '是系统模型，不允许删除！' => '',\n  '字段表记录未清除，请手动清除！' => '',\n  '模型' => '',\n  '用户' => '',\n  '栏目链接' => '',\n  '外链' => '',\n  '自定义链接' => '',\n  '发布时间' => '',\n  '字段名称不能为空！' => '',\n  '显示=1,隐藏=0' => '',\n  '显示=1,隐藏=0,退回=2' => '',\n  '是=1,否=0' => '',\n  '重构成功！' => '',\n  '系统栏目' => '',\n  '系统副栏目' => '',\n  '模型标识' => '',\n  '发布管理员' => '',\n  '前台用户' => '',\n  '待付款' => '',\n  '已付' => '',\n  '超时' => '',\n  '待审核待支付' => '',\n  '已发货' => '',\n  '已废弃' => '',\n  '未付' => '',\n  '您的订单发货通知' => '',\n  '尊敬的' => '',\n  '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！' => '',\n  '订单详细信息如下：' => '',\n  '主图' => '',\n  '价格' => '',\n  '购买数量' => '',\n  '总价' => '',\n  '折扣：' => '',\n  '元' => '',\n  '运费：' => '',\n  '￥' => '',\n  '合计：' => '',\n  '收件地址：' => '',\n  '联系电话：' => '',\n  '钱包' => '',\n  '积分' => '',\n  '充值' => '',\n  '兑换' => '',\n  '奖励' => '',\n  '该用户不存在！' => '',\n  '充值数量不对！' => '',\n  '操作失败！' => '',\n  '插件配置' => '',\n  '未分类' => '',\n  '商品配置' => '',\n  '批量复制失败！' => '',\n  '部分未执行成功！' => '',\n  '还原失败，可能是ID已经存在！' => '',\n  '数据不存在！' => '',\n  '删除失败，系统功能不能删除！' => '',\n  '配置栏下有自定义配置，无法删除配置栏' => '',\n  '已存在配置标识，请重新设置！' => '',\n  '提交成功！' => '',\n  '删除失败！系统字段不允许删除！' => '',\n  '图片不存在，删除失败！' => '',\n  '远程存储图片无法删除！' => '',\n  '图片ID错误！' => '',\n  '部分删除成功，存在远程链接无法删除！' => '',\n  '非法操作' => '',\n  '请检查目录' => '',\n  '写入权限' => '',\n  '配置成功！' => '',\n  '参数存在安全隐患！' => '',\n  '参数错误,必须携带插件ID！' => '',\n  '发生错误' => '',\n  '下载缓存文件不存在！' => '',\n  '请选择使用场景！' => '',\n  '执行插件安装程序失败！' => '',\n  '安装成功！' => '',\n  '备份成功！' => '',\n  '该插件暂无更新！' => '',\n  '参数错误,请选择对应模板！' => '',\n  '文件不存在！' => '',\n  '解压失败！' => '',\n  '数据库中没有表!' => '',\n  '写入文件失败！' => '',\n  ' 写入文件失败！' => '',\n  '解压完毕！本次解压花费' => '',\n  '秒' => '',\n  '更新成功！' => '',\n  '个人中心' => '',\n  '测试1' => '',\n  '测试2' => '',\n  '测试3' => '',\n  '接口报错' => '',\n  '微信配置错误！' => '',\n  '网站首页' => '',\n  '首页' => '',\n  '碎片化管理' => '',\n  '新增碎片' => '',\n  '刷新' => '',\n  '基本信息' => '',\n  '使用说明' => '',\n  '指定几个id或者几个tid的内容输出' => '',\n  'SQL中输入' => '',\n  '或者' => '',\n  '模糊查询，查询标题跟 “网站建设” 相关的内容' => '',\n  '网站建设' => '',\n  '模糊查询，查询标题/内容跟 “网站建设” 相关的内容' => '',\n  '不支持联表查询' => '',\n  '注意字符串都要使用英文单引号' => '',\n  '如' => '',\n  '碎片名称' => '',\n  '碎片标识' => '',\n  '建议英文，不要重复' => '',\n  '不限栏目' => '',\n  '子栏目包含' => '',\n  '包含' => '',\n  '不包含' => '',\n  '输出条数' => '',\n  '0表示输出所有' => '',\n  '更新周期' => '',\n  '单位' => '',\n  '分钟' => '',\n  '保存' => '',\n  '返回' => '',\n  '确定' => '',\n  '导航管理' => '',\n  '新增导航' => '',\n  '导航名称' => '',\n  '导航菜单' => '',\n  '链接' => '',\n  '打开' => '',\n  '操作' => '',\n  '不填默认栏目名称' => '',\n  '自定义链接则需要填写' => '',\n  '本页面' => '',\n  '新页面' => '',\n  '管理员管理' => '',\n  '新增管理员信息' => '',\n  '基本' => '',\n  '扩展' => '',\n  '登录名' => '',\n  '将会成为您唯一的登入名' => '',\n  '手机' => '',\n  '邮箱' => '',\n  '角色' => '',\n  '选择角色' => '',\n  '密码' => '',\n  '6到16个字符,不改请留空' => '',\n  '确认密码' => '',\n  '状态' => '',\n  '正常' => '',\n  '禁用' => '',\n  '增加成功' => '',\n  '修改管理员信息' => '',\n  '管理员列表' => '',\n  '搜索' => '',\n  '是否封禁' => '',\n  '封禁' => '',\n  '开始日' => '',\n  '截止日' => '',\n  '请输入用户名' => '',\n  '编辑' => '',\n  '添加管理员' => '',\n  '正常|封禁' => '',\n  '所属角色' => '',\n  '登录时间' => '',\n  '注册时间' => '',\n  '确认要删除吗？' => '',\n  '请选择对象！' => '',\n  '批量删除成功' => '',\n  '个人信息' => '',\n  '基础' => '',\n  '设置' => '',\n  '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！' => '',\n  '恢复数据' => '',\n  '此规则配置仅在不填留空的情况下才会触发' => '',\n  'SEO标题' => '',\n  '等于内容标题' => '',\n  '不填则留空' => '',\n  '缩略图规则' => '',\n  '自动获取内容第一张图片' => '',\n  '不自动获取' => '',\n  '简介规则' => '',\n  '自动获取内容前200字符' => '',\n  'TAG规则' => '',\n  '同步关键词' => '',\n  '不同步关键词' => '',\n  '敏感词过滤字段' => '',\n  '需要过滤敏感词在系统配置中进行设置' => '',\n  '请输入需要过滤的字段' => '',\n  '返回列表' => '',\n  '取消' => '',\n  '预览' => '',\n  '批量修改栏目' => '',\n  '修改推荐属性' => '',\n  '审核' => '',\n  '列表字段设置' => '',\n  '顶' => '',\n  '热' => '',\n  '荐' => '',\n  '请选择修改栏目！' => '',\n  '确认要批量修改内容分类吗？' => '',\n  '批量修改成功' => '',\n  '请选择修改属性！' => '',\n  '请选择修改对象！' => '',\n  '请选择审核选项！' => '',\n  '请选择审核对象！' => '',\n  '确认要批量处理吗？' => '',\n  '批量审核成功' => '',\n  '确认要复制吗？' => '',\n  '批量复制成功' => '',\n  '添加属性' => '',\n  '名称' => '',\n  '修改属性' => '',\n  '新增属性' => '',\n  '系统设置' => '',\n  '数据库管理' => '',\n  '备份数据库' => '',\n  '备份数：' => '',\n  '数据库备份名' => '',\n  '大小' => '',\n  '备份副本' => '',\n  '还原数据' => '',\n  '删除备份' => '',\n  '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？' => '',\n  '您确定要删除备份数据库吗？删除后将不可找回！' => '',\n  '数据缓存' => '',\n  '文件夹cache/data，主要是网站内容缓存，栏目，详情页等' => '',\n  '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空' => '',\n  '日志缓存' => '',\n  '文件夹cache/log，包括错误日志、支付日志、登录日志等' => '',\n  '模板缓存' => '',\n  '文件夹cache，主要是程序执行时生成的模板编译文件' => '',\n  '缩略图缓存' => '',\n  '文件夹image，主要是程序执行时生成的自定义缩略图' => '',\n  '立即清空' => '',\n  '请选择清空目标！' => '',\n  '清理成功！' => '',\n  '内链管理' => '',\n  '添加内链' => '',\n  '内链词' => '',\n  '内链' => '',\n  '替换词' => '',\n  '替换次数' => '',\n  '替换词，可为空！' => '',\n  '请填写内链' => '',\n  '替换次数，默认-1，替换全部，可不写。' => '',\n  '提交' => '',\n  '修改内链' => '',\n  '内链词和内链不能为空！' => '',\n  '充值类型' => '',\n  '当前兑换率：' => '',\n  '兑换率指1元相当于多少钱包/积分' => '',\n  '交易类型' => '',\n  '赠送' => '',\n  '充值数量' => '',\n  '用户ID' => '',\n  '备注' => '',\n  '添加' => '',\n  '充值管理' => '',\n  '充值列表' => '',\n  '选择交易类型' => '',\n  '买入' => '',\n  '选择交易种类' => '',\n  '请输入前台用户手机号' => '',\n  '请输入用户昵称' => '',\n  '请输入订单号' => '',\n  '会员充值' => '',\n  '总订单' => '',\n  '已充值' => '',\n  '已兑换' => '',\n  '总赠送' => '',\n  '尾页' => '',\n  '订单号' => '',\n  '类型' => '',\n  '交易' => '',\n  '用户名' => '',\n  '数量' => '',\n  '金额' => '',\n  '时间' => '',\n  '查看' => '',\n  '选择模块' => '',\n  '选择上级' => '',\n  '顶级栏目' => '',\n  '分类名' => '',\n  '图片  ' => '',\n  '择图片' => '',\n  '排序规则' => '',\n  '组合：排序倒序，时间倒序，ID倒序' => '',\n  '组合：排序倒序，ID正序' => '',\n  '排序正序' => '',\n  '时间倒序' => '',\n  'ID正序' => '',\n  '点击量倒序' => '',\n  '时间正序' => '',\n  '默认不需要更改' => '',\n  'URL命名' => '',\n  '请填写文件名，如:index，不填请留空' => '',\n  '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：' => '',\n  '多个相同URL，将覆盖前面的栏目' => '',\n  '列表显示' => '',\n  '设置列表页显示的内容条数' => '',\n  '栏目模板' => '',\n  '手动填写，不填请留空' => '',\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '',\n  '详情页模板' => '',\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。' => '',\n  '栏目外链' => '',\n  '栏目外链，如:htt://xxx.com/abc，不填请留空' => '',\n  '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！' => '',\n  '发布显示' => '',\n  '勾选后，前台会员发布会显示该栏目' => '',\n  '导航显示' => '',\n  '模板覆盖' => '',\n  '覆盖' => '',\n  '不覆盖' => '',\n  '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => '',\n  '访问限制' => '',\n  '是否关闭' => '',\n  '关闭' => '',\n  '开启' => '',\n  '栏目关闭后，前台不显示，也无法访问！' => '',\n  '增加' => '',\n  '请选择模板页面/使用自定义' => '',\n  '批量新增' => '',\n  '添加栏目' => '',\n  '格式：栏目名|栏目URL，一行一个，如：关于我们|about' => '',\n  '格式：栏目名|栏目URL，一行一个' => '',\n  '请选择模板页面' => '',\n  '图片 ' => '',\n  '请填写完整文件名，如:index，不填请留空' => '',\n  ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => '',\n  '请选择栏目' => '',\n  '顶级' => '',\n  '展开|折叠' => '',\n  '模块名' => '',\n  '快捷操作' => '',\n  '显示|隐藏' => '',\n  '添加下级' => '',\n  '字段管理' => '',\n  '新增文章' => '',\n  '新增商品' => '',\n  '新增内容' => '',\n  '请选择对象' => '',\n  '已删除!' => '',\n  '删除成功' => '',\n  '扩展管理' => '',\n  '新增轮播图' => '',\n  '所属分类' => '',\n  '图片' => '',\n  '图片高' => '',\n  '0表示不限制' => '',\n  '图片宽' => '',\n  '跳转链接' => '',\n  '不填请留空' => '',\n  '数字越大越靠前' => '',\n  '修改轮播图' => '',\n  '选择分类' => '',\n  '更新时间' => '',\n  '轮播图列表' => '',\n  '请选择分类' => '',\n  '请输入标题' => '',\n  '新增图片' => '',\n  '分类列表' => '',\n  '添加分类' => '',\n  '共有数据：' => '',\n  '条' => '',\n  '长' => '',\n  '宽' => '',\n  '轮播图分类' => '',\n  '评论管理' => '',\n  '添加评论' => '',\n  '评论栏目' => '',\n  '文章ID' => '',\n  '主回复ID' => '',\n  '同属于一个评论的ID，如果没有评论中的评论，则为0' => '',\n  '回复帖子ID' => '',\n  '评论内容' => '',\n  '管理员回复' => '',\n  '是否提醒回复' => '',\n  '提醒' => '',\n  '不提醒' => '',\n  '喜欢/点赞' => '',\n  '是否已读' => '',\n  '是否删除' => '',\n  '已删除' => '',\n  '未删除' => '',\n  '只能管理员删除评论，用户只能软删除评论' => '',\n  '查看评论' => '',\n  '评论列表' => '',\n  '请输入评论内容' => '',\n  '查看相关内容' => '',\n  '查看用户' => '',\n  '所属文章' => '',\n  '评论时间' => '',\n  '请选择审核选项' => '',\n  '批量处理成功' => '',\n  '调用方式' => '',\n  '这里输出想要的内容，如：' => '',\n  '查看SQL' => '',\n  '系统扩展' => '',\n  '桌面管理' => '',\n  '新增配置' => '',\n  '配置名称' => '',\n  '左侧菜单栏' => '',\n  '没有二级菜单不会生效' => '',\n  '顶部菜单栏' => '',\n  '适用角色' => '',\n  '默认所有' => '',\n  '系统默认' => '',\n  '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置' => '',\n  '一个菜单名称' => '',\n  '顶级菜单' => '',\n  '菜单图标' => '',\n  '二级菜单' => '',\n  '图标' => '',\n  '修改菜单名称' => '',\n  '确定要删除吗？' => '',\n  '最后一个索引不能删除！' => '',\n  '添加菜单名称' => '',\n  '菜单选择' => '',\n  '图标选择' => '',\n  '修改配置' => '',\n  '桌面名称' => '',\n  '系统' => '',\n  '是否默认' => '',\n  '所有角色' => '',\n  '复制配置' => '',\n  '修改碎片' => '',\n  '指定几个id或者几个tid的内容输出(栏目：不限制栏目)' => '',\n  'SQL中输入：' => '',\n  'SQL中输入： ' => '',\n  '如： ' => '',\n  '单位：分钟' => '',\n  '修改导航' => '',\n  '扩展模型管理' => '',\n  '模块管理' => '',\n  '新增字段' => '',\n  '角色绑定' => '',\n  '目绑定' => '',\n  '字段名称' => '',\n  '简短的名称' => '',\n  '字段标识' => '',\n  '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短' => '',\n  '字段类型' => '',\n  '选择' => '',\n  '长度' => '',\n  '说明' => '',\n  '不限' => '',\n  '带编辑器文本' => '',\n  '只能填写数字，长度不能超过11位' => '',\n  '金钱，小数等，保留2位' => '',\n  '时间日期' => '',\n  '多图，图集' => '',\n  '红=1,黄=2' => '',\n  '单项选择，下拉选择，如：红=1,黄=2,蓝=3' => '',\n  '单项选择，按钮选择，如：红=1,黄=2,蓝=3' => '',\n  '多项选择，如：红=1,黄=2,蓝=3' => '',\n  '一个附件，压缩包，Excel，Word文档' => '',\n  '多个附件，压缩包，Excel，Word文档' => '',\n  '请选择关联模块' => '',\n  '列表显示字段' => '',\n  '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '',\n  '多行录入，可以在页面动态新增内容输入框' => '',\n  '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '',\n  '系统栏目，不可修改' => '',\n  '系统副栏目，不可修改' => '',\n  '系统TAG，不可修改' => '',\n  '默认值' => '',\n  '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1' => '',\n  '字段提示' => '',\n  '用于填写时的提示信息，50字以内' => '',\n  '表单排序' => '',\n  '是否必填' => '',\n  '必填' => '',\n  '非必填' => '',\n  '带有文本框编辑器的除外' => '',\n  '前台显示' => '',\n  '前台表单' => '',\n  '后台显示' => '',\n  '后台搜索' => '',\n  '仅用于后台列表头部带有该字段搜索' => '',\n  '列表中显示' => '',\n  '仅用于后台列表显示该字段' => '',\n  '显示格式化' => '',\n  '不做处理' => '',\n  '仅用于后台列表显示该字段内容处理' => '',\n  'ajax可访问' => '',\n  '不能' => '',\n  '能' => '',\n  '由于本系统对json数据封装，限制访问可以提高安全性' => '',\n  '角色名' => '',\n  '栏目名' => '',\n  '修改字段' => '',\n  '栏目绑定' => '',\n  '红=1,黄=2,蓝=3' => '',\n  '关联模块内容ID' => '',\n  '可以在页面动态新增内容输入框' => '',\n  '温馨提示：排序和宽度在列表点击也可以更改。' => '',\n  '排序：当前列表显示排序，不会影响录入排序，越大越靠前。' => '',\n  '搜索：在列表顶部的搜索中，可以搜索该字段。' => '',\n  '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。' => '',\n  '宽度' => '',\n  '批量绑定栏目' => '',\n  '字段' => '',\n  '后台' => '',\n  '确认要删除吗？删除的同时将删除对应的表内容！' => '',\n  '角色管理' => '',\n  '角色修改' => '',\n  '是否超管' => '',\n  '不是' => '',\n  '超级管理员拥有无上权利，无视下面权限限制' => '',\n  '发布审核' => '',\n  '超级管理员除外，发布的内容是否需要审核' => '',\n  '栏目权限' => '',\n  '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效' => '',\n  '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目' => '',\n  '子栏目' => '',\n  '拥有权限' => '',\n  '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块' => '',\n  '主模块' => '',\n  '子模块' => '',\n  '描述' => '',\n  '请输入内容' => '',\n  '关闭后，该分组管理员将不能登录' => '',\n  '添加角色' => '',\n  '后台管理' => '',\n  '展开左侧栏' => '',\n  '清理缓存' => '',\n  '退出' => '',\n  '前台首页' => '',\n  '后台首页' => '',\n  '我的桌面' => '',\n  '关闭当前' => '',\n  '关闭其他' => '',\n  '关闭所有' => '',\n  '扩展模块管理' => '',\n  '批量修改分类' => '',\n  '批量处理' => '',\n  '友情链接分类' => '',\n  '分类' => '',\n  '后台管理登录' => '',\n  '验证码' => '',\n  '登录' => '',\n  '登录ID' => '',\n  '登录用户' => '',\n  '模块' => '',\n  '方法' => '',\n  '操作时间' => '',\n  '会员管理' => '',\n  '新增会员' => '',\n  '用于找回密码' => '',\n  '手机号' => '',\n  '必须唯一' => '',\n  '昵称' => '',\n  '分组' => '',\n  '头像' => '',\n  '生日' => '',\n  '个性签名' => '',\n  '省份' => '',\n  '城市' => '',\n  '详细地址' => '',\n  '6到16个字符' => '',\n  '添加成功' => '',\n  '会员修' => '',\n  '6到16个字符,不修改请留空' => '',\n  '修改成功' => '',\n  '会员列表' => '',\n  '请输入手机号' => '',\n  '余额' => '',\n  '加入时间' => '',\n  '分组管理' => '',\n  '分组修改' => '',\n  '分组名' => '',\n  '折扣类型' => '',\n  '无折扣' => '',\n  '现金折扣' => '',\n  '百分比折扣' => '',\n  '折扣金额' => '',\n  '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效' => '',\n  '登录状态' => '',\n  '请选择所属单位！' => '',\n  '用户管理' => '',\n  '会员分组' => '',\n  '添加分组' => '',\n  '温馨提示：前台权限已关闭，设置权限不会生效。' => '',\n  '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！' => '',\n  '留言管理' => '',\n  '查看留言' => '',\n  '问题描述' => '',\n  '用户昵称' => '',\n  '留言栏目' => '',\n  '不指定栏目' => '',\n  '联系电话' => '',\n  '留言IP' => '',\n  '留言内容' => '',\n  '是否审核' => '',\n  '提交时间' => '',\n  '修改保存' => '',\n  '留言列表' => '',\n  '请输入相关内容ID' => '',\n  '内容ID' => '',\n  '模型管理' => '',\n  '新增模型' => '',\n  '模型名称' => '',\n  '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名' => '',\n  '是否必选栏目' => '',\n  '新增修改内容时必选' => '',\n  '是否显示栏目' => '',\n  '列表展示、录入内容、修改内容三个页面是否展示栏目' => '',\n  '是否受权限控制' => '',\n  '不同角色可以通过控制栏目权限来限制查看内容' => '',\n  '栏目绑定显示' => '',\n  '栏目绑定时是否显示该模型' => '',\n  '前台发布' => '',\n  '前台是否允许发布' => '',\n  '列表模板' => '',\n  '默认列表模板' => '',\n  '详情模板' => '',\n  '默认详情模板' => '',\n  '是否开启' => '',\n  '数值越小越靠前' => '',\n  '已有表' => '',\n  '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"' => '',\n  '是否可以预览' => '',\n  '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]' => '',\n  '修改模型' => '',\n  '模型状态' => '',\n  '模型分类' => '',\n  '允许' => '',\n  '已停用' => '',\n  '已启用' => '',\n  '重构字段' => '',\n  '确认要删除吗？删除的同时将删除对应的表！' => '',\n  '订单列表' => '',\n  '订单详情' => '',\n  '姓名' => '',\n  '是否支付' => '',\n  '已支付' => '',\n  '未支付' => '',\n  '支付时间' => '',\n  '存储内容' => '',\n  '订单内容' => '',\n  '商品' => '',\n  '商品已删除' => '',\n  '收货信息：' => '',\n  '收件人：' => '',\n  '联系手机：' => '',\n  '联系邮箱：' => '',\n  '收货地址：' => '',\n  '订单状态' => '',\n  '订单已删除' => '',\n  '已提交未支付' => '',\n  '超时订单' => '',\n  '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '',\n  '发货时间' => '',\n  '确定修改' => '',\n  '订单管理' => '',\n  '选择状态' => '',\n  '支付方式' => '',\n  '线下支付' => '',\n  '钱包支付' => '',\n  '积分兑换' => '',\n  '支付宝支付' => '',\n  '微信支付' => '',\n  '微信H5支付' => '',\n  '微信扫码支付' => '',\n  '支付宝H5支付' => '',\n  '总收入' => '',\n  '付款方式' => '',\n  '是否付款' => '',\n  '付款时间' => '',\n  '图库管理' => '',\n  '筛选上传入口' => '',\n  '前台' => '',\n  '筛选模块' => '',\n  '其他杂项' => '',\n  '系统配置' => '',\n  '筛选栏目' => '',\n  '上传前台' => '',\n  '所属模块' => '',\n  '本地文件' => '',\n  '文件大小' => '',\n  '其他' => '',\n  '插件管理' => '',\n  '插件列表' => '',\n  '全部' => '',\n  '本地' => '',\n  '请输入插件名字' => '',\n  '插件名' => '',\n  '版本' => '',\n  '作者' => '',\n  '平台' => '',\n  '插件文件' => '',\n  '开关' => '',\n  '安装说明' => '',\n  '点击查看' => '',\n  '更新说明' => '',\n  '新' => '',\n  '官方' => '',\n  '第三方' => '',\n  '开|停' => '',\n  '配置' => '',\n  '导出' => '',\n  '卸载' => '',\n  '安装' => '',\n  '下载' => '',\n  '获取文件大小失败，请检查网络！' => '',\n  '正在安装中，请稍等~' => '',\n  '正在删除中，请稍等~' => '',\n  '正在卸载中，请稍等~' => '',\n  '设置接口' => '',\n  '当前版本：' => '',\n  '最新版本：' => '',\n  '作者：' => '',\n  '更新时间：' => '',\n  '更新内容' => '',\n  '正在下载文件' => '',\n  '升级插件' => '',\n  '文件下载完成！正在解压~' => '',\n  '文件解压完成！正在进行安装~' => '',\n  '插件升级成功！' => '',\n  '插件已升级完毕！' => '',\n  '功能' => '',\n  '函数名' => '',\n  '对应的控制器/函数，如果是顶级，则只需要写控制器名' => '',\n  '权限列表' => '',\n  '添加权限' => '',\n  '控制器/方法' => '',\n  '添加子功能' => '',\n  '权限管理' => '',\n  '栏目选择' => '',\n  '权限选择' => '',\n  '不能选择的权限是非独立功能' => '',\n  '请先勾选菜单!' => '',\n  '扩展信息' => '',\n  '回收站' => '',\n  '还原' => '',\n  '批量恢复' => '',\n  '确认要删除吗？删除后就彻底无法恢复了！' => '',\n  '确认要删除吗？删除后不可恢复！' => '',\n  '确认要还原吗？' => '',\n  '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。' => '',\n  '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '',\n  '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '',\n  '数据类型' => '',\n  '录入类型' => '',\n  '归属' => '',\n  '插件' => '',\n  '独立功能' => '',\n  '桌面管理配置时，将调用独立功能' => '',\n  '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录' => '',\n  '如果不生成静态文件，请改为' => '',\n  '手机端未开启，sitemap不会包含手机端URL' => '',\n  'PC端网站地图：' => '',\n  '手机端网站地图：' => '',\n  '网站地图' => '',\n  '模块名称' => '',\n  '更新频率' => '',\n  '站内权重' => '',\n  '输出范围' => '',\n  '栏目模块' => '',\n  '显示的栏目' => '',\n  '所有的栏目' => '',\n  '文章模块' => '',\n  '显示的文章' => '',\n  '所有的文章' => '',\n  '商品模块' => '',\n  '显示的商品' => '',\n  '所有的商品' => '',\n  '显示的' => '',\n  '所有的' => '',\n  '立即生成' => '',\n  '网站设置' => '',\n  '自定义配置' => '',\n  '点击复制' => '',\n  '上传文件' => '',\n  '不选' => '',\n  '删除配置栏' => '',\n  '选择类型' => '',\n  '编辑器' => '',\n  '文件上传' => '',\n  '下拉选项' => '',\n  '栏目选项' => '',\n  '代码' => '',\n  '请填写配置名(中文)' => '',\n  '配置标识(字母或数字)' => '',\n  '配置栏目' => '',\n  '提示信息' => '',\n  '自定义配置可以配置对应配置栏下的自定义内容' => '',\n  '下拉选项配置，如：开启=1,关闭=0' => '',\n  '自定义配置栏' => '',\n  '请填写配置栏名(中文)' => '',\n  '配置标识(必须是字母)' => '',\n  '配置标识用于权限控制，必填且不能与原系统配置栏重复' => '',\n  '失败！' => '',\n  '模板管理' => '',\n  '模板列表' => '',\n  '请输入模板名字' => '',\n  '有更新' => '',\n  '已使用' => '',\n  '备份数据' => '',\n  '安装模板' => '',\n  '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？' => '',\n  '提示' => '',\n  '安装提示' => '',\n  '该模板用于：' => '',\n  'PC端' => '',\n  '手机端' => '',\n  '微信端' => '',\n  '升级模板' => '',\n  '模板升级成功！' => '',\n  '模板已升级完毕！' => '',\n  '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！' => '',\n  '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '',\n  '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！' => '',\n  '指定栏目' => '',\n  '所有栏目' => '',\n  '生成电脑静态' => '',\n  '生成手机静态' => '',\n  '清理电脑静态HTML' => '',\n  '清理手机静态HTML' => '',\n  '批量生成电脑静态' => '',\n  '批量生成手机静态' => '',\n  '批量清理电脑静态' => '',\n  '批量清理手机静态' => '',\n  '正在处理~' => '',\n  '正在准备生成静态，请不要关闭页面~' => '',\n  '正在准备清理电脑端静态HTML，请不要关闭页面~' => '',\n  '正在准备清理手机端静态HTML，请不要关闭页面~' => '',\n  '欢迎管理员：' => '',\n  '当前时间' => '',\n  '站内用户' => '',\n  '人' => '',\n  '站内文章' => '',\n  '篇' => '',\n  '站内产品' => '',\n  '件' => '',\n  '站内留言' => '',\n  '最近更新' => '',\n  '全部文章' => '',\n  '阅读量' => '',\n  '最新评论' => '',\n  '在' => '',\n  '发布了评论' => '',\n  '版本信息' => '',\n  '当前版本' => '',\n  '项目地址' => '',\n  '服务器' => '',\n  '操作系统' => '',\n  '运行环境' => '',\n  'PHP版本' => '',\n  '运行方式' => '',\n  '上传限制' => '',\n  '用户留言' => '',\n  '回复' => '',\n  '星期天' => '',\n  '星期一' => '',\n  '星期二' => '',\n  '星期三' => '',\n  '星期四' => '',\n  '星期五' => '',\n  '星期六' => '',\n  '评论模块未开启！' => '',\n  '您的操作过于频繁，请十分钟后再试~' => '',\n  '评论内容不能为空！' => '',\n  '请提交栏目ID' => '',\n  '栏目ID不能为空！' => '',\n  '评论奖励' => '',\n  '评价成功！' => '',\n  '您未登录，请重新登录~' => '',\n  '您没有' => '',\n  '的权限！' => '',\n  '您还未登录，请重新登录！' => '',\n  '上传成功！' => '',\n  '已关闭前台上传文件功能' => '',\n  '上传错误！' => '',\n  '对不起，您没有访问权限！' => '',\n  '输入url错误！' => '',\n  '缺少ID！' => '',\n  '未找到相应内容！' => '',\n  '请输入关键词搜索！' => '',\n  '搜索超出设定范围！' => '',\n  '您的搜索超出设定范围！' => '',\n  '系统创建' => '',\n  '目录失败!' => '',\n  '支付成功，但是系统内没有找到相应的订单！' => '',\n  '支付失败' => '',\n  '订单号错误！' => '',\n  '会员中心已关闭！' => '',\n  '您的账户已被冻结！' => '',\n  '未找到您所在分组，请联系管理员处理！' => '',\n  '您所在的分组被限制登录！' => '',\n  '登录奖励' => '',\n  '系统已关闭会员注册！' => '',\n  '您的邀请链接不合法！' => '',\n  '手机号格式不正确！' => '',\n  '您的邮箱已注册！' => '',\n  '您的手机号码已注册！' => '',\n  '邀请奖励' => '',\n  '注册成功，等待审核！' => '',\n  '注册成功！' => '',\n  '注册失败，请重试~' => '',\n  '必须通过邀请链接进行注册！' => '',\n  '请输入账号和邮箱！' => '',\n  '图形验证码错误！' => '',\n  '找回密码' => '',\n  '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击' => '',\n  '立即找回密码' => '',\n  '过期失效！' => '',\n  '您操作过于频繁，请10分钟后再尝试！' => '',\n  '找回密码邮件已发送，请到您的邮箱查看！' => '',\n  '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！' => '',\n  '输入的信息有误！' => '',\n  'token已失效！' => '',\n  '密码重置成功,请重新登录！' => '',\n  '新密码不能与旧密码相同！' => '',\n  '标题不能为空！' => '',\n  '称呼不能为空！' => '',\n  '您的手机号格式不正确！' => '',\n  '不能为空！' => '',\n  '提交成功！我们会尽快回复您！' => '',\n  '提交失败，请重试！' => '',\n  '链接错误' => '',\n  '留言未找到或者未审核' => '',\n  '匿名' => '',\n  '缺少id参数！' => '',\n  '缺少tid参数！' => '',\n  '未找到商品或者已下架！' => '',\n  '该模块缺少price价格参数！' => '',\n  '您的订单提交成功通知' => '',\n  '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！' => '',\n  '订单详细信息如下' => '',\n  '折扣' => '',\n  '运费' => '',\n  '合计' => '',\n  '收件地址' => '',\n  '您的订单' => '',\n  '已经提交，我们会尽快给您发货！' => '',\n  '订单已支付！' => '',\n  '已经提交，请尽快支付！' => '',\n  '支付订单' => '',\n  '电脑支付宝支付' => '',\n  '微信内支付' => '',\n  '未开启钱包支付！' => '',\n  '您未登录，无法支付！' => '',\n  '钱包金额不足，请充值！' => '',\n  '未开启积分支付！' => '',\n  '积分不足，请充值！' => '',\n  '支付宝当面付' => '',\n  '其他平台支付' => '',\n  '在线充值' => '',\n  '交易创建，等待买家付款' => '',\n  '未付款交易超时关闭，或支付完成后全额退款' => '',\n  '支付成功' => '',\n  '交易结束，不可退款' => '',\n  '未知状态' => '',\n  '订单号错误或订单被删除！' => '',\n  '订单未支付或订单号错误！' => '',\n  '创建订单失败！' => '',\n  '订单号不存在或已被删除！' => '',\n  '收件人、手机号和收货地址不能为空！' => '',\n  '未开启在线支付！' => '',\n  '获取openid失败' => '',\n  '非法参数！' => '',\n  '标签未找到或已删除！' => '',\n  '手机号码格式错误！' => '',\n  '账户不能为空！' => '',\n  '订单已过期，不可支付！' => '',\n  '订单已支付，请勿重复操作！' => '',\n  '缺少订单号！' => '',\n  '网络错误，请刷新后重试！' => '',\n  '未找到评论！' => '',\n  '已取消点赞！' => '',\n  '点赞成功！' => '',\n  '栏目未绑定模型，无法喜欢！' => '',\n  '取消点赞' => '',\n  '点赞奖励' => '',\n  '已被删除 ' => '',\n  '栏目未绑定模型，无法收藏！' => '',\n  '取消收藏' => '',\n  '收藏奖励' => '',\n  '收藏成功！' => '',\n  '已被删除' => '',\n  '库存不足！' => '',\n  '该模块不允许发布！' => '',\n  '添加失败，存在敏感词' => '',\n  '分类错误！' => '',\n  '该分类不允许发布！' => '',\n  '您没有权限在该分类发布内容！' => '',\n  '内容不能为空！' => '',\n  '库存不能为0！' => '',\n  '未修改内容，不能提交！' => '',\n  '发布失败，请重试！' => '',\n  '发布成功！' => '',\n  '未找到您要的文章！' => '',\n  '您已经关注了该用户！' => '',\n  '您不能关注自己！' => '',\n  '关注奖励' => '',\n  '关注成功！' => '',\n  '您没有关注该用户，无法操作！' => '',\n  '取关成功！' => '',\n  '消息已被删除！' => '',\n  '用户未找到！' => '',\n  '未分类 ' => '',\n  '设置成功' => '',\n  '设置成功！' => '',\n  '记录不存在！' => '',\n  '缺少栏目ID！' => '',\n  '系统未配置微信登录！' => '',\n  '微信已绑定！' => '',\n  '您的微信已被绑定，不能再绑定！' => '',\n  '系统版号' => '',\n  '版本号是系统自带，请勿改动' => '',\n  '网站SEO名称' => '',\n  '控制在25个字、50个字节以内' => '',\n  '网站SEO关键词' => '',\n  '5个左右，8汉字以内，用英文逗号隔开' => '',\n  '网站SEO描述' => '',\n  '控制在80个汉字，160个字符以内' => '',\n  '统计代码' => '',\n  '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '',\n  '底部版权' => '',\n  '如：&copy; 2016 xxx版权' => '',\n  '备案号' => '',\n  '如：京ICP备00000000号' => '',\n  '网站电话' => '',\n  '网站联系电话' => '',\n  '400电话' => '',\n  '网站QQ' => '',\n  '网站邮箱' => '',\n  '公司地址' => '',\n  'PC网站模板' => '',\n  '将模板名称填写到此处' => '',\n  'WAP网站模板' => '',\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板' => '',\n  '微信网站模板' => '',\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板' => '',\n  '是否开启手机端' => '',\n  '如果不开启手机端，则默认调用电脑端模板' => '',\n  '是否开启前台上传' => '',\n  '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。' => '',\n  '是否开启前台权限' => '',\n  '开启后前台用户权限可以在后台控制' => '',\n  '缓存时间' => '',\n  '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。' => '',\n  '限制上传文件大小' => '',\n  '0代表不限，单位kb' => '',\n  '允许上传文件类型' => '',\n  '请用|分割，如：pdf|jpg|png' => '',\n  '前台UEditor编辑器导航条配置' => '',\n  '允许前台搜索的表' => '',\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product' => '',\n  '上传图片压缩比例' => '',\n  '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80' => '',\n  'PNG是否压缩' => '',\n  'PNG压缩后容易变成背景黑色，关闭后，不会压缩。' => '',\n  '邮件服务器' => '',\n  'smtp.163.com,smtp.qq.com' => '',\n  '邮件收发端口' => '',\n  '163、126邮件端口(465)，QQ邮件端口(587)' => '',\n  '收件人Email地址' => '',\n  '发件人Email地址' => '',\n  '指邮件服务器发件邮箱' => '',\n  '发件人Email秘钥' => '',\n  '这个秘钥不是登录密码' => '',\n  '发件人昵称' => '',\n  '发件邮箱会带一个昵称' => '',\n  '客户订单通知' => '',\n  '购买商品的时候会发送的一条邮件信息' => '',\n  '订单出货通知' => '',\n  '发货的时候发送给客户的通知' => '',\n  '订单运费' => '',\n  '购物下单时会加上这个运费' => '',\n  '在线支付' => '',\n  '0关闭支付，1自主平台支付' => '',\n  '极致平台接口' => '',\n  '极致平台商户' => '',\n  '极致平台应用appid' => '',\n  '极致平台应用秘钥' => '',\n  '支付宝APPID' => '',\n  '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID' => '',\n  '支付宝key' => '',\n  'MD5密钥，安全检验码，由数字和字母组成的32位字符串' => '',\n  '支付宝私钥' => '',\n  '支付宝公钥' => '',\n  '微信商户mchid' => '',\n  '支付相关' => '',\n  '微信商户key' => '',\n  '微信公众号appid' => '',\n  '微信公众号appsecret' => '',\n  '微信apiclient_cert' => '',\n  '微信apiclient_key' => '',\n  '公众号appid' => '',\n  '用户登录相关，如果跟支付的一样，那就再填写一遍' => '',\n  '公众号appsecret' => '',\n  '公众号token' => '',\n  '公众号关注欢迎语' => '',\n  '公众号关注时发送的第一句推送' => '',\n  '网站LOGO' => '',\n  '后台模板风格' => '',\n  '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。' => '',\n  '是否绑定多域名' => '',\n  '开启绑定多域名后，需要到插件中配置' => '',\n  '网站SEO网址' => '',\n  '一般不填，全局网址，最后不带/,如：http://www.xxx.com' => '',\n  '基本信息下扩展' => '',\n  '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下' => '',\n  '订单超时' => '',\n  '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制' => '',\n  '开启层级URL' => '',\n  '默认关闭层级URL，开启后URL会按照父类层级展现' => '',\n  '缓存完整页面' => '',\n  '前台完整页面缓存，结合缓存时间，可以提高访问速度' => '',\n  '自动生成静态HTML' => '',\n  '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面' => '',\n  'PC静态文件目录' => '',\n  '电脑端静态HTML存放目录，默认根目录[ / ]' => '',\n  'WAP静态文件目录' => '',\n  '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱' => '',\n  '是否留言自动审核' => '',\n  '开启后，留言自动审核（显示）' => '',\n  '是否评论自动审核' => '',\n  '开启后评论自动审核（显示）' => '',\n  '网站敏感词过滤' => '',\n  '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容' => '',\n  '是否开启水印' => '',\n  '开启水印需要上传水印图片' => '',\n  '水印图片' => '',\n  '水印图片在250px以内' => '',\n  '水印位置' => '',\n  '参考键盘九宫格1-9' => '',\n  '水印透明度' => '',\n  '透明度越大，越难看清楚水印' => '',\n  '钱包兑换率' => '',\n  '站内钱包与RMB的兑换率，即1元=多少金币' => '',\n  '积分兑换率' => '',\n  '站内积分与RMB的兑换率，即1元=多少积分' => '',\n  '积分支付' => '',\n  '开启积分支付后，商品可以用积分支付' => '',\n  '开启钱包支付后，商品可以用钱包支付' => '',\n  '开启微信支付后，商品可以用微信支付' => '',\n  '开启支付宝支付后，商品可以用支付宝支付' => '',\n  '每次登录奖励' => '',\n  '每天登录奖励积分数，最小为0，每天登录只奖励一次' => '',\n  '开启登录奖励后，登录后就会获得积分奖励' => '',\n  '开启后，发布内容会奖励积分' => '',\n  '每次发布奖励' => '',\n  '每次发布内容奖励积分数' => '',\n  '每天发布最高奖励' => '',\n  '每天奖励不超过积分上限，设置0则无上限' => '',\n  '开启后，发布内容被收藏会奖励积分' => '',\n  '每次收藏奖励' => '',\n  '每次发布内容被收藏奖励积分数' => '',\n  '每天收藏最高奖励' => '',\n  '开启后，发布内容被点赞会奖励积分' => '',\n  '每次点赞奖励' => '',\n  '每次发布内容被点赞奖励积分数' => '',\n  '每天点赞最高奖励' => '',\n  '开启后，发布内容被评论会奖励积分' => '',\n  '每次评论奖励' => '',\n  '每次发布内容被评论奖励积分数' => '',\n  '每天评论最高奖励' => '',\n  '开启后，用户被粉丝关注会奖励积分' => '',\n  '每次关注奖励' => '',\n  '每次被关注奖励积分数' => '',\n  '每天关注最高奖励' => '',\n  '每天关注奖励不超过积分上限，设置0则无上限' => '',\n  '发送邮件' => '',\n  '是否开启邮件发送' => '',\n  '关闭网站' => '',\n  '关闭网站后，前台无法访问，后台可以进入' => '',\n  '关站提示' => '',\n  '后台文件存储路径' => '',\n  '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]' => '',\n  '前台文件存储路径' => '',\n  '是否开启前台AJAX' => '',\n  '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据' => '',\n  '自动生成sitemap' => '',\n  '开启后，前台访问每天会自动生成1次sitemap' => '',\n  '是否开启邀请奖励' => '',\n  '开启邀请后则会奖励' => '',\n  '邀请奖励类型' => '',\n  '邀请奖励数量' => '',\n  '网站手机' => '',\n  '站长微信' => '',\n  '开启多图描述' => '',\n  '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)' => '',\n  '前台用户注册' => '',\n  '关闭前台注册后，前台无法进入注册页面' => '',\n  '仅邀请码注册' => '',\n  '开启后，必须通过邀请链接才能注册！' => '',\n  '允许前台发布模块' => '',\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '',\n  '前台搜索的字段' => '',\n  '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '',\n  '前台验证码' => '',\n  '关闭后，登录注册不需要验证码' => '',\n  '后台验证码' => '',\n  '关闭后，后台管理员登录不需要验证码' => '',\n  'TAG包含模型' => '',\n  '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product' => '',\n  '支付配置' => '',\n  '前台多模块搜索的字段' => '',\n  '多个模块直接必须都有相同的字段，否则会报错' => '',\n  '多模块允许搜索的表' => '',\n  '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product' => '',\n  '允许查询显示的字段' => '',\n  '多模块搜索允许查询显示的字段' => '',\n  '前台编辑器设置' => '',\n  '前台的编辑器功能菜单设置' => '',\n  'PHP调试' => '',\n  '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。' => '',\n  '前台SESSION' => '',\n  '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭' => '',\n  '留言验证码' => '',\n  '开启后，前台留言需要填写验证码' => '',\n  '前台发布审核' => '',\n  '开启后需要后台审核，关闭则不需要' => '',\n  '公共权限' => '',\n  '前台网站' => '',\n  '会员登录' => '',\n  '会员评论' => '',\n  '网站筛选' => '',\n  '会员下单' => '',\n  '网站支付' => '',\n  '极致支付' => '',\n  '微信模块' => '',\n  '验证码生成' => '',\n  '检查是否登录' => '',\n  '多附件上传' => '',\n  '单附件上传' => '',\n  '二维码生成' => '',\n  '获取扩展信息' => '',\n  '链接错误提示' => '',\n  '报错提示' => '',\n  '网站内容' => '',\n  '详情内容' => '',\n  '网站搜索' => '',\n  '网站多模块搜索' => '',\n  '开启网站缓存' => '',\n  '输出缓存' => '',\n  '个人中心首页' => '',\n  '会员资料' => '',\n  '订单记录' => '',\n  '订单支付' => '',\n  '删除订单' => '',\n  '上传头像' => '',\n  '删除评论' => '',\n  '点赞文章' => '',\n  '点赞列表' => '',\n  '收藏文章' => '',\n  '收藏列表' => '',\n  '删除收藏' => '',\n  '购物车' => '',\n  '添加购物车' => '',\n  '删除购物车' => '',\n  '发布管理' => '',\n  '会员发布' => '',\n  '删除发布' => '',\n  '会员上传附件' => '',\n  '404提示' => '',\n  '关注用户' => '',\n  '取消关注' => '',\n  '粉丝列表' => '',\n  '消息提醒' => '',\n  '查看消息' => '',\n  '删除消息' => '',\n  '公共主页' => '',\n  '消息提醒设置' => '',\n  '获取栏目列表' => '',\n  '用户钱包' => '',\n  '交易详情' => '',\n  '登录首页' => '',\n  '注册页面' => '',\n  '忘记密码' => '',\n  '未登录页面' => '',\n  '退出登录' => '',\n  '发送留言' => '',\n  '发表评论' => '',\n  '筛选列表' => '',\n  '创建订单' => '',\n  'TAG标签列表' => '',\n  '会员' => '',\n  '订单' => '',\n  '评论' => '',\n  '留言' => '',\n  '轮播图' => '',\n  '友情链接' => '',\n  'TAG' => '',\n  '单页' => '',\n  '用户评价' => '',\n  '添加会员' => '',\n  '修改会员' => '',\n  '删除会员' => '',\n  '修改状态' => '',\n  '内容管理' => '',\n  '内容列表' => '',\n  '添加内容' => '',\n  '修改内容' => '',\n  '删除内容' => '',\n  '复制内容' => '',\n  '修改评论' => '',\n  '修改留言' => '',\n  '删除留言' => '',\n  '字段列表' => '',\n  '删除字段' => '',\n  '获取字段' => '',\n  '基本功能' => '',\n  '系统界面' => '',\n  '数据库备份' => '',\n  '数据库还原' => '',\n  '数据库删除' => '',\n  '系统功能' => '',\n  '栏目管理' => '',\n  '栏目列表' => '',\n  '新增栏目' => '',\n  '修改栏目' => '',\n  '删除栏目' => '',\n  '修改排序' => '',\n  '栏目隐藏' => '',\n  '新增角色' => '',\n  '修改角色' => '',\n  '删除角色' => '',\n  '角色状态' => '',\n  '新增管理员' => '',\n  '修改管理员' => '',\n  '管理员状态' => '',\n  '删除管理员' => '',\n  '模型列表' => '',\n  '删除模型' => '',\n  '新增权限' => '',\n  '修改权限' => '',\n  '删除权限' => '',\n  '桌面设置' => '',\n  '新增桌面' => '',\n  '修改桌面' => '',\n  '删除桌面' => '',\n  '图标库' => '',\n  '模块扩展' => '',\n  '删除轮播图' => '',\n  '复制轮播图' => '',\n  '批量删除轮播图' => '',\n  '新增轮播图分类' => '',\n  '修改轮播图分类' => '',\n  '删除轮播图分类' => '',\n  '新增友链' => '',\n  '修改友链' => '',\n  '复制友链' => '',\n  '删除友链' => '',\n  '批量删除友链' => '',\n  '通用模块' => '',\n  '更新cookie' => '',\n  '商品管理' => '',\n  '商品列表' => '',\n  '修改商品' => '',\n  '删除商品' => '',\n  '复制商品' => '',\n  '登录日志' => '',\n  '新增分组' => '',\n  '修改分组' => '',\n  '更改分组状态' => '',\n  '删除分组' => '',\n  '会员权限' => '',\n  '修改分组排序' => '',\n  '上传支付证书' => '',\n  '更改状态' => '',\n  '安装卸载' => '',\n  '删除图库图片' => '',\n  '批量删除图库' => '',\n  '微信公众号' => '',\n  '公众号菜单' => '',\n  '公众号素材' => '',\n  '模板制作' => '',\n  '获取首字母拼音' => '',\n  '批量新增栏目' => '',\n  '自定义配置删除' => '',\n  'TAG列表' => '',\n  '新增TAG' => '',\n  '修改TAG' => '',\n  '复制TAG' => '',\n  '删除TAG' => '',\n  '批量删除TAG' => '',\n  '生成静态文件' => '',\n  '更新栏目HTML' => '',\n  '更新模块HTML' => '',\n  '批量修改推荐属性' => '',\n  '批量修改友链栏目' => '',\n  '批量修改TAG栏目' => '',\n  '批量复制友链' => '',\n  '批量复制TAG' => '',\n  '批量修改友链排序' => '',\n  '批量修改TAG排序' => '',\n  '高级设置' => '',\n  '邮箱订单' => '',\n  '公众号配置' => '',\n  '批量审核友链' => '',\n  '批量审核TAG' => '',\n  '手动充值' => '',\n  '删除记录' => '',\n  '批量删除记录' => '',\n  '积分配置' => '',\n  '插件更新' => '',\n  '获取栏目模板' => '',\n  '友链分类' => '',\n  '新增友链分类' => '',\n  '修改友链分类' => '',\n  '删除友链分类' => '',\n  '导航设置' => '',\n  '删除导航' => '',\n  '碎片化' => '',\n  '删除碎片' => '',\n  '预览SQL' => '',\n  '搜索配置' => '',\n  '修改字段属性' => '',\n  '新增推荐属性' => '',\n  '删除推荐属性' => '',\n  '列表设置' => '',\n  '获取列表字段' => '',\n  '内链模块' => '',\n  '内链列表' => '',\n  '新增内链' => '',\n  '删除内链' => '',\n  '删除数据' => '',\n  '模板更新' => '',\n  '用户评价列表' => '',\n  '新增用户评价' => '',\n  '修改用户评价' => '',\n  '复制用户评价' => '',\n  '删除用户评价' => '',\n  '批量删除用户评价' => '',\n  '批量修改用户评价栏目' => '',\n  '批量复制用户评价' => '',\n  '批量修改用户评价列表' => '',\n  '批量审核用户评价' => '',\n  '基本设置' => '',\n  '邮件订单' => '',\n  '非超级管理员无法设置！' => '',\n  '你确定要还原吗？' => '',\n); ?>"
  },
  {
    "path": "app/home/lang/cht.php",
    "content": "<?php return array (\r\n  '该角色下存在用户，请先移除用户再删除！' => '該角色下存在用戶，請先移除用戶再刪除！',\r\n  '删除失败，该分组不允许删除！' => '刪除失敗，該分組不允許刪除！',\r\n  '删除成功！' => '刪除成功！',\r\n  '删除失败，请重试！' => '刪除失敗，請重試！',\r\n  '非法操作！' => '非法操作！',\r\n  '修改失败，您的权限不足！' => '修改失敗，您的權限不足！',\r\n  '修改成功！' => '修改成功！',\r\n  '修改失败，请重新提交！' => '修改失敗，請重新提交！',\r\n  '没有该角色！' => '沒有該角色！',\r\n  '新增成功！' => '新增成功！',\r\n  '新增失败，请重新提交！' => '新增失敗，請重新提交！',\r\n  '修改失败，该分组不允许修改！' => '修改失敗，該分組不允許修改！',\r\n  '您没有权限操作！' => '您沒有權限操作！',\r\n  '两次密码不同！' => '兩次密碼不同！',\r\n  '手机号已被注册！' => '手機號已被註冊！',\r\n  '昵称已被使用！' => '暱稱已被使用！',\r\n  '邮箱已被使用！' => '郵箱已被使用！',\r\n  '修改失败！' => '修改失敗！',\r\n  '新增失败！' => '新增失敗！',\r\n  '系统管理员不能删除！' => '系統管理員不能刪除！',\r\n  '删除失败！' => '刪除失敗！',\r\n  '批量操作失败！' => '批量操作失敗！',\r\n  '批量删除成功！' => '批量刪除成功！',\r\n  '添加失败' => '添加失敗',\r\n  '存在敏感词' => '存在敏感詞',\r\n  '已存在相同的自定义URL！' => '已存在相同的自定義URL！',\r\n  '添加成功,继续添加~' => '添加成功,繼續添加~',\r\n  '内容配置' => '內容配置',\r\n  '修改失败' => '修改失敗',\r\n  '发布奖励' => '發布獎勵',\r\n  '您未做任何修改，不能提交！' => '您未做任何修改，不能提交！',\r\n  '复制成功！' => '複製成功！',\r\n  '复制失败！' => '複製失敗！',\r\n  '批量复制成功！' => '批量複製成功！',\r\n  '批量修改成功！' => '批量修改成功！',\r\n  '批量操作成功！' => '批量操作成功！',\r\n  'URL链接命名不能是' => 'URL連結命名不能是',\r\n  '非法URL' => '非法URL',\r\n  '添加栏目成功，继续添加~' => '添加欄目成功，繼續添加~',\r\n  '模型错误！' => '模型錯誤！',\r\n  '不能选择当前栏目及下级为顶级栏目' => '不能選擇當前欄目及下級為頂級欄目',\r\n  '该栏目有子栏目，请先删除子栏目！' => '該欄目有子欄目，請先刪除子欄目！',\r\n  '栏目不能为空！' => '欄目不能為空！',\r\n  '操作成功！' => '操作成功！',\r\n  '请选择分类！' => '請選擇分類！',\r\n  '添加成功！继续添加~' => '添加成功！繼續添加~',\r\n  '添加失败！' => '添加失敗！',\r\n  '该分类下存在内容，请先删除该分类下的内容！' => '該分類下存在內容，請先刪除該分類下的內容！',\r\n  '添加成功！' => '添加成功！',\r\n  '已审核' => '已審核',\r\n  '被删除' => '被刪除',\r\n  '未审核' => '未審核',\r\n  '已读' => '已讀',\r\n  '未读' => '未讀',\r\n  '批量审核成功！' => '批量審核成功！',\r\n  '批量审核失败！' => '批量審核失敗！',\r\n  '您没有权限！' => '您沒有權限！',\r\n  '文件类型不允许上传！' => '文件類型不允許上傳！',\r\n  '文件大小超过网站内部限制！' => '文件大小超過網站內部限制！',\r\n  '请检查目录写入权限' => '請檢查目錄寫入權限',\r\n  '错误信息提示' => '錯誤信息提示',\r\n  '模块为空，请选择模块！' => '模塊為空，請選擇模塊！',\r\n  '缺少ID' => '缺少ID',\r\n  '请选择模块！' => '請選擇模塊！',\r\n  '显示' => '顯示',\r\n  '隐藏' => '隱藏',\r\n  '是' => '是',\r\n  '否' => '否',\r\n  '单行文本' => '單行文本',\r\n  '多行文本' => '多行文本',\r\n  '文本编辑器' => '文本編輯器',\r\n  '数字' => '數字',\r\n  '单图片' => '單圖片',\r\n  '多图片' => '多圖片',\r\n  '单选下拉' => '單選下拉',\r\n  '多选' => '多選',\r\n  '单附件' => '單附件',\r\n  '多附件' => '多附件',\r\n  '时间戳' => '時間戳',\r\n  '单选按钮' => '單選按鈕',\r\n  '单选关联' => '單選關聯',\r\n  '小数' => '小數',\r\n  '多行录入' => '多行錄入',\r\n  '多选关联' => '多選關聯',\r\n  '栏目' => '欄目',\r\n  '副栏目' => '副欄目',\r\n  '系统TAG' => '系統TAG',\r\n  '字段名和字段标识不能为空！' => '欄位名和欄位標識不能為空！',\r\n  '字段标识已存在！' => '欄位標識已存在！',\r\n  '系统保护字段，不允许创建！' => '系統保護欄位，不允許創建！',\r\n  '字段长度不对！' => '欄位長度不對！',\r\n  '字段长度不对,时间属性必须长度为11' => '欄位長度不對,時間屬性必須長度為11',\r\n  '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '欄位長度不對,decimal欄位長度格式[整數位數,小數位數]',\r\n  '字段创建成功，但是字段表记录失败，请反馈官方解决！' => '欄位創建成功，但是欄位表記錄失敗，請反饋官方解決！',\r\n  '字段创建成功！' => '欄位創建成功！',\r\n  '字段修改成功！' => '欄位修改成功！',\r\n  '字段修改失败！' => '欄位修改失敗！',\r\n  '上传图片' => '上傳圖片',\r\n  '选择图片' => '選擇圖片',\r\n  '图片未找到' => '圖片未找到',\r\n  '删除这张图片' => '刪除這張圖片',\r\n  '删除' => '刪除',\r\n  '上传异常！' => '上傳異常！',\r\n  '文字描述' => '文字描述',\r\n  '左移' => '左移',\r\n  '右移' => '右移',\r\n  '请选择' => '請選擇',\r\n  '上传附件' => '上傳附件',\r\n  '字段关联绑定失败，请重新绑定！' => '欄位關聯綁定失敗，請重新綁定！',\r\n  '请选择关联项' => '請選擇關聯項',\r\n  'TAG标签' => 'TAG標籤',\r\n  '按Enter回车自动添加' => '按Enter回車自動添加',\r\n  '添加一个标签' => '添加一個標籤',\r\n  '系统字段不允许删除！' => '系統欄位不允許刪除！',\r\n  '请选择字段！' => '請選擇欄位！',\r\n  '请选择栏目！' => '請選擇欄目！',\r\n  '参数有误！' => '參數有誤！',\r\n  '请选择桌面配置！' => '請選擇桌面配置！',\r\n  '系统默认不可删除！' => '系統默認不可刪除！',\r\n  '网站地图创建成功！' => '網站地圖創建成功！',\r\n  '网站地图创建失败，请检查根目录权限！' => '網站地圖創建失敗，請檢查根目錄權限！',\r\n  '清除失败！' => '清除失敗！',\r\n  '清除成功！' => '清除成功！',\r\n  '生成失败！' => '生成失敗！',\r\n  '生成成功！' => '生成成功！',\r\n  '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~' => '已清理一部分頁面，請不要關閉當前頁面，還需要繼續清理HTML~',\r\n  '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~' => '已生成一部分頁面，請不要關閉當前頁面，還需要繼續生成HTML~',\r\n  '静态HTML页面已全部清理完毕！' => '靜態HTML頁面已全部清理完畢！',\r\n  '总共清理页面数：' => '總共清理頁面數：',\r\n  '每次清理页面数：' => '每次清理頁面數：',\r\n  '停顿时间：' => '停頓時間：',\r\n  '开始时间：' => '開始時間：',\r\n  '结束时间：' => '結束時間：',\r\n  '总共花费时间：' => '總共花費時間：',\r\n  '总共生成页面数：' => '總共生成頁面數：',\r\n  '每次生成页面数：' => '每次生成頁面數：',\r\n  '系统创建目录失败!' => '系統創建目錄失敗!',\r\n  '模块未绑定栏目，无法生存HTML！' => '模塊未綁定欄目，無法生存HTML！',\r\n  '链接错误！' => '連結錯誤！',\r\n  '请输入属性名称！' => '請輸入屬性名稱！',\r\n  '属性已存在！' => '屬性已存在！',\r\n  '参数错误！' => '參數錯誤！',\r\n  '系统属性只允许修改和隐藏，不允许删除！' => '系統屬性只允許修改和隱藏，不允許刪除！',\r\n  '请输入内链词！' => '請輸入內鏈詞！',\r\n  '请输入内链！' => '請輸入內鏈！',\r\n  '内链词已存在！' => '內鏈詞已存在！',\r\n  '已审' => '已審',\r\n  '退回' => '退回',\r\n  '未审' => '未審',\r\n  '账户密码不能为空！' => '帳戶密碼不能為空！',\r\n  '验证码错误！' => '驗證碼錯誤！',\r\n  '该账户已被封禁！' => '該帳戶已被封禁！',\r\n  '登录成功！' => '登錄成功！',\r\n  '账户密码错误！' => '帳戶密碼錯誤！',\r\n  '安全退出~' => '安全退出~',\r\n  '无' => '無',\r\n  '不显示' => '不顯示',\r\n  '邮箱已被注册！' => '郵箱已被註冊！',\r\n  '添加失败，请重新提交！' => '添加失敗，請重新提交！',\r\n  '没有找到该用户！' => '沒有找到該用戶！',\r\n  '该分组下存在用户，请先移除用户再删除！' => '該分組下存在用戶，請先移除用戶再刪除！',\r\n  '删除失败，该分类有下级功能，请先删除下级功能！' => '刪除失敗，該分類有下級功能，請先刪除下級功能！',\r\n  '未选择删除对象！' => '未選擇刪除對象！',\r\n  '模块名和标识不能为空！' => '模塊名和標識不能為空！',\r\n  '模型已添加不能重复添加！' => '模型已添加不能重複添加！',\r\n  '该表已存在！' => '該表已存在！',\r\n  '标题' => '標題',\r\n  '默认为空' => '默認為空',\r\n  '所属栏目' => '所屬欄目',\r\n  '选择栏目' => '選擇欄目',\r\n  '绑定后可以在当前模型的其他栏目中显示' => '綁定後可以在當前模型的其他欄目中顯示',\r\n  '关键词' => '關鍵詞',\r\n  '每个词用英文逗号(,)拼接' => '每個詞用英文逗號(,)拼接',\r\n  '缩略图' => '縮略圖',\r\n  '可留空' => '可留空',\r\n  '简介' => '簡介',\r\n  '内容' => '內容',\r\n  '发布会员' => '發布會員',\r\n  '前台发布会员ID记录' => '前台發布會員ID記錄',\r\n  '管理员' => '管理員',\r\n  '后台发布管理员ID记录' => '後台發布管理員ID記錄',\r\n  '外链URL' => '外鏈URL',\r\n  '默认为空，系统访问内容则直接跳转到此链接' => '默認為空，系統訪問內容則直接跳轉到此連結',\r\n  '自定义URL' => '自定義URL',\r\n  '默认为空，自定义URL' => '默認為空，自定義URL',\r\n  '点击量' => '點擊量',\r\n  '系统自动添加' => '系統自動添加',\r\n  '评论数' => '評論數',\r\n  '系统自带' => '系統自帶',\r\n  '点赞数' => '點讚數',\r\n  '排序' => '排序',\r\n  '添加时间' => '添加時間',\r\n  '选择时间' => '選擇時間',\r\n  '推荐属性' => '推薦屬性',\r\n  '1置顶2热点3推荐' => '1置頂2熱點3推薦',\r\n  '置顶=1,热点=2,推荐=3' => '置頂=1,熱點=2,推薦=3',\r\n  '是否显示' => '是否顯示',\r\n  '显示隐藏' => '顯示隱藏',\r\n  '显示=1,未审=0,退回=2' => '顯示=1,未審=0,退回=2',\r\n  '列表' => '列表',\r\n  '新增' => '新增',\r\n  '修改' => '修改',\r\n  '复制' => '複製',\r\n  '批量删除' => '批量刪除',\r\n  '批量修改' => '批量修改',\r\n  '批量复制' => '批量複製',\r\n  '批量审核' => '批量審核',\r\n  '管理' => '管理',\r\n  '新增模型成功，快去创建对应的栏目吧！' => '新增模型成功，快去創建對應的欄目吧！',\r\n  '新增模型成功，快去设置表字段吧！' => '新增模型成功，快去設置表欄位吧！',\r\n  '新增模型失败！' => '新增模型失敗！',\r\n  '标识不能为空！' => '標識不能為空！',\r\n  '系统模型标识不允许修改！' => '系統模型標識不允許修改！',\r\n  '页面有错误，缺少模块ID！' => '頁面有錯誤，缺少模塊ID！',\r\n  '里面存在数据，请先清空表内数据！' => '裡面存在數據，請先清空表內數據！',\r\n  '是系统模型，不允许删除！' => '是系統模型，不允許刪除！',\r\n  '字段表记录未清除，请手动清除！' => '欄位表記錄未清除，請手動清除！',\r\n  '模型' => '模型',\r\n  '用户' => '用戶',\r\n  '栏目链接' => '欄目連結',\r\n  '外链' => '外鏈',\r\n  '自定义链接' => '自定義連結',\r\n  '发布时间' => '發布時間',\r\n  '字段名称不能为空！' => '欄位名稱不能為空！',\r\n  '显示=1,隐藏=0' => '顯示=1,隱藏=0',\r\n  '显示=1,隐藏=0,退回=2' => '顯示=1,隱藏=0,退回=2',\r\n  '是=1,否=0' => '是=1,否=0',\r\n  '重构成功！' => '重構成功！',\r\n  '系统栏目' => '系統欄目',\r\n  '系统副栏目' => '系統副欄目',\r\n  '模型标识' => '模型標識',\r\n  '发布管理员' => '發布管理員',\r\n  '前台用户' => '前台用戶',\r\n  '待付款' => '待付款',\r\n  '已付' => '已付',\r\n  '超时' => '超時',\r\n  '待审核待支付' => '待審核待支付',\r\n  '已发货' => '已發貨',\r\n  '已废弃' => '已廢棄',\r\n  '未付' => '未付',\r\n  '您的订单发货通知' => '您的訂單發貨通知',\r\n  '尊敬的' => '尊敬的',\r\n  '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！' => '您的訂單已發貨了，這幾天請您留意一下快遞，謝謝您的惠顧！期待再次為您服務！',\r\n  '订单详细信息如下：' => '訂單詳細信息如下：',\r\n  '主图' => '主圖',\r\n  '价格' => '價格',\r\n  '购买数量' => '購買數量',\r\n  '总价' => '總價',\r\n  '折扣：' => '折扣：',\r\n  '元' => '元',\r\n  '运费：' => '運費：',\r\n  '￥' => '￥',\r\n  '合计：' => '合計：',\r\n  '收件地址：' => '收件地址：',\r\n  '联系电话：' => '聯繫電話：',\r\n  '钱包' => '錢包',\r\n  '积分' => '積分',\r\n  '充值' => '充值',\r\n  '兑换' => '兌換',\r\n  '奖励' => '獎勵',\r\n  '该用户不存在！' => '該用戶不存在！',\r\n  '充值数量不对！' => '充值數量不對！',\r\n  '操作失败！' => '操作失敗！',\r\n  '插件配置' => '插件配置',\r\n  '未分类' => '未分類',\r\n  '商品配置' => '商品配置',\r\n  '批量复制失败！' => '批量複製失敗！',\r\n  '部分未执行成功！' => '部分未執行成功！',\r\n  '还原失败，可能是ID已经存在！' => '還原失敗，可能是ID已經存在！',\r\n  '数据不存在！' => '數據不存在！',\r\n  '删除失败，系统功能不能删除！' => '刪除失敗，系統功能不能刪除！',\r\n  '配置栏下有自定义配置，无法删除配置栏' => '配置欄下有自定義配置，無法刪除配置欄',\r\n  '已存在配置标识，请重新设置！' => '已存在配置標識，請重新設置！',\r\n  '提交成功！' => '提交成功！',\r\n  '删除失败！系统字段不允许删除！' => '刪除失敗！系統欄位不允許刪除！',\r\n  '图片不存在，删除失败！' => '圖片不存在，刪除失敗！',\r\n  '远程存储图片无法删除！' => '遠程存儲圖片無法刪除！',\r\n  '图片ID错误！' => '圖片ID錯誤！',\r\n  '部分删除成功，存在远程链接无法删除！' => '部分刪除成功，存在遠程連結無法刪除！',\r\n  '非法操作' => '非法操作',\r\n  '请检查目录' => '請檢查目錄',\r\n  '写入权限' => '寫入權限',\r\n  '配置成功！' => '配置成功！',\r\n  '参数存在安全隐患！' => '參數存在安全隱患！',\r\n  '参数错误,必须携带插件ID！' => '參數錯誤,必須攜帶插件ID！',\r\n  '发生错误' => '發生錯誤',\r\n  '下载缓存文件不存在！' => '下載緩存文件不存在！',\r\n  '请选择使用场景！' => '請選擇使用場景！',\r\n  '执行插件安装程序失败！' => '執行插件安裝程序失敗！',\r\n  '安装成功！' => '安裝成功！',\r\n  '备份成功！' => '備份成功！',\r\n  '该插件暂无更新！' => '該插件暫無更新！',\r\n  '参数错误,请选择对应模板！' => '參數錯誤,請選擇對應模板！',\r\n  '文件不存在！' => '文件不存在！',\r\n  '解压失败！' => '解壓失敗！',\r\n  '数据库中没有表!' => '資料庫中沒有表!',\r\n  '写入文件失败！' => '寫入文件失敗！',\r\n  ' 写入文件失败！' => ' 寫入文件失敗！',\r\n  '解压完毕！本次解压花费' => '解壓完畢！本次解壓花費',\r\n  '秒' => '秒',\r\n  '更新成功！' => '更新成功！',\r\n  '个人中心' => '個人中心',\r\n  '测试1' => '測試1',\r\n  '测试2' => '測試2',\r\n  '测试3' => '測試3',\r\n  '接口报错' => '接口報錯',\r\n  '微信配置错误！' => '微信配置錯誤！',\r\n  '网站首页' => '網站首頁',\r\n  '首页' => '首頁',\r\n  '碎片化管理' => '碎片化管理',\r\n  '新增碎片' => '新增碎片',\r\n  '刷新' => '刷新',\r\n  '基本信息' => '基本信息',\r\n  '使用说明' => '使用說明',\r\n  '指定几个id或者几个tid的内容输出' => '指定幾個id或者幾個tid的內容輸出',\r\n  'SQL中输入' => 'SQL中輸入',\r\n  '或者' => '或者',\r\n  '模糊查询，查询标题跟 “网站建设” 相关的内容' => '模糊查詢，查詢標題跟 「網站建設」 相關的內容',\r\n  '网站建设' => '網站建設',\r\n  '模糊查询，查询标题/内容跟 “网站建设” 相关的内容' => '模糊查詢，查詢標題/內容跟 「網站建設」 相關的內容',\r\n  '不支持联表查询' => '不支持聯表查詢',\r\n  '注意字符串都要使用英文单引号' => '注意字符串都要使用英文單引號',\r\n  '如' => '如',\r\n  '碎片名称' => '碎片名稱',\r\n  '碎片标识' => '碎片標識',\r\n  '建议英文，不要重复' => '建議英文，不要重複',\r\n  '不限栏目' => '不限欄目',\r\n  '子栏目包含' => '子欄目包含',\r\n  '包含' => '包含',\r\n  '不包含' => '不包含',\r\n  '输出条数' => '輸出條數',\r\n  '0表示输出所有' => '0表示輸出所有',\r\n  '更新周期' => '更新周期',\r\n  '单位' => '單位',\r\n  '分钟' => '分鐘',\r\n  '保存' => '保存',\r\n  '返回' => '返回',\r\n  '确定' => '確定',\r\n  '导航管理' => '導航管理',\r\n  '新增导航' => '新增導航',\r\n  '导航名称' => '導航名稱',\r\n  '导航菜单' => '導航菜單',\r\n  '链接' => '連結',\r\n  '打开' => '打開',\r\n  '操作' => '操作',\r\n  '不填默认栏目名称' => '不填默認欄目名稱',\r\n  '自定义链接则需要填写' => '自定義連結則需要填寫',\r\n  '本页面' => '本頁面',\r\n  '新页面' => '新頁面',\r\n  '管理员管理' => '管理員管理',\r\n  '新增管理员信息' => '新增管理員信息',\r\n  '基本' => '基本',\r\n  '扩展' => '擴展',\r\n  '登录名' => '登錄名',\r\n  '将会成为您唯一的登入名' => '將會成為您唯一的登入名',\r\n  '手机' => '手機',\r\n  '邮箱' => '郵箱',\r\n  '角色' => '角色',\r\n  '选择角色' => '選擇角色',\r\n  '密码' => '密碼',\r\n  '6到16个字符,不改请留空' => '6到16個字符,不改請留空',\r\n  '确认密码' => '確認密碼',\r\n  '状态' => '狀態',\r\n  '正常' => '正常',\r\n  '禁用' => '禁用',\r\n  '增加成功' => '增加成功',\r\n  '修改管理员信息' => '修改管理員信息',\r\n  '管理员列表' => '管理員列表',\r\n  '搜索' => '搜索',\r\n  '是否封禁' => '是否封禁',\r\n  '封禁' => '封禁',\r\n  '开始日' => '開始日',\r\n  '截止日' => '截止日',\r\n  '请输入用户名' => '請輸入用戶名',\r\n  '编辑' => '編輯',\r\n  '添加管理员' => '添加管理員',\r\n  '正常|封禁' => '正常|封禁',\r\n  '所属角色' => '所屬角色',\r\n  '登录时间' => '登錄時間',\r\n  '注册时间' => '註冊時間',\r\n  '确认要删除吗？' => '確認要刪除嗎？',\r\n  '请选择对象！' => '請選擇對象！',\r\n  '批量删除成功' => '批量刪除成功',\r\n  '个人信息' => '個人信息',\r\n  '基础' => '基礎',\r\n  '设置' => '設置',\r\n  '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！' => '填寫內容時，請先選擇欄目，否則切換欄目後，數據會丟失！',\r\n  '恢复数据' => '恢復數據',\r\n  '此规则配置仅在不填留空的情况下才会触发' => '此規則配置僅在不填留空的情況下才會觸發',\r\n  'SEO标题' => 'SEO標題',\r\n  '等于内容标题' => '等於內容標題',\r\n  '不填则留空' => '不填則留空',\r\n  '缩略图规则' => '縮略圖規則',\r\n  '自动获取内容第一张图片' => '自動獲取內容第一張圖片',\r\n  '不自动获取' => '不自動獲取',\r\n  '简介规则' => '簡介規則',\r\n  '自动获取内容前200字符' => '自動獲取內容前200字符',\r\n  'TAG规则' => 'TAG規則',\r\n  '同步关键词' => '同步關鍵詞',\r\n  '不同步关键词' => '不同步關鍵詞',\r\n  '敏感词过滤字段' => '敏感詞過濾欄位',\r\n  '需要过滤敏感词在系统配置中进行设置' => '需要過濾敏感詞在系統配置中進行設置',\r\n  '请输入需要过滤的字段' => '請輸入需要過濾的欄位',\r\n  '返回列表' => '返回列表',\r\n  '取消' => '取消',\r\n  '预览' => '預覽',\r\n  '批量修改栏目' => '批量修改欄目',\r\n  '修改推荐属性' => '修改推薦屬性',\r\n  '审核' => '審核',\r\n  '列表字段设置' => '列表欄位設置',\r\n  '顶' => '頂',\r\n  '热' => '熱',\r\n  '荐' => '薦',\r\n  '请选择修改栏目！' => '請選擇修改欄目！',\r\n  '确认要批量修改内容分类吗？' => '確認要批量修改內容分類嗎？',\r\n  '批量修改成功' => '批量修改成功',\r\n  '请选择修改属性！' => '請選擇修改屬性！',\r\n  '请选择修改对象！' => '請選擇修改對象！',\r\n  '请选择审核选项！' => '請選擇審核選項！',\r\n  '请选择审核对象！' => '請選擇審核對象！',\r\n  '确认要批量处理吗？' => '確認要批量處理嗎？',\r\n  '批量审核成功' => '批量審核成功',\r\n  '确认要复制吗？' => '確認要複製嗎？',\r\n  '批量复制成功' => '批量複製成功',\r\n  '添加属性' => '添加屬性',\r\n  '名称' => '名稱',\r\n  '修改属性' => '修改屬性',\r\n  '新增属性' => '新增屬性',\r\n  '系统设置' => '系統設置',\r\n  '数据库管理' => '資料庫管理',\r\n  '备份数据库' => '備份資料庫',\r\n  '备份数：' => '備份數：',\r\n  '数据库备份名' => '資料庫備份名',\r\n  '大小' => '大小',\r\n  '备份副本' => '備份副本',\r\n  '还原数据' => '還原數據',\r\n  '删除备份' => '刪除備份',\r\n  '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？' => '還原資料庫將覆蓋現有的資料庫，您確認要還原資料庫嗎？',\r\n  '您确定要删除备份数据库吗？删除后将不可找回！' => '您確定要刪除備份資料庫嗎？刪除後將不可找回！',\r\n  '数据缓存' => '數據緩存',\r\n  '文件夹cache/data，主要是网站内容缓存，栏目，详情页等' => '文件夾cache/data，主要是網站內容緩存，欄目，詳情頁等',\r\n  '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空' => '文件夾cache/tmp，主要是伺服器session文件緩存，當前session將不會被清空',\r\n  '日志缓存' => '日誌緩存',\r\n  '文件夹cache/log，包括错误日志、支付日志、登录日志等' => '文件夾cache/log，包括錯誤日誌、支付日誌、登錄日誌等',\r\n  '模板缓存' => '模板緩存',\r\n  '文件夹cache，主要是程序执行时生成的模板编译文件' => '文件夾cache，主要是程序執行時生成的模板編譯文件',\r\n  '缩略图缓存' => '縮略圖緩存',\r\n  '文件夹image，主要是程序执行时生成的自定义缩略图' => '文件夾image，主要是程序執行時生成的自定義縮略圖',\r\n  '立即清空' => '立即清空',\r\n  '请选择清空目标！' => '請選擇清空目標！',\r\n  '清理成功！' => '清理成功！',\r\n  '内链管理' => '內鏈管理',\r\n  '添加内链' => '添加內鏈',\r\n  '内链词' => '內鏈詞',\r\n  '内链' => '內鏈',\r\n  '替换词' => '替換詞',\r\n  '替换次数' => '替換次數',\r\n  '替换词，可为空！' => '替換詞，可為空！',\r\n  '请填写内链' => '請填寫內鏈',\r\n  '替换次数，默认-1，替换全部，可不写。' => '替換次數，默認-1，替換全部，可不寫。',\r\n  '提交' => '提交',\r\n  '修改内链' => '修改內鏈',\r\n  '内链词和内链不能为空！' => '內鏈詞和內鏈不能為空！',\r\n  '充值类型' => '充值類型',\r\n  '当前兑换率：' => '當前兌換率：',\r\n  '兑换率指1元相当于多少钱包/积分' => '兌換率指1元相當於多少錢包/積分',\r\n  '交易类型' => '交易類型',\r\n  '赠送' => '贈送',\r\n  '充值数量' => '充值數量',\r\n  '用户ID' => '用戶ID',\r\n  '备注' => '備註',\r\n  '添加' => '添加',\r\n  '充值管理' => '充值管理',\r\n  '充值列表' => '充值列表',\r\n  '选择交易类型' => '選擇交易類型',\r\n  '买入' => '買入',\r\n  '选择交易种类' => '選擇交易種類',\r\n  '请输入前台用户手机号' => '請輸入前台用戶手機號',\r\n  '请输入用户昵称' => '請輸入用戶暱稱',\r\n  '请输入订单号' => '請輸入訂單號',\r\n  '会员充值' => '會員充值',\r\n  '总订单' => '總訂單',\r\n  '已充值' => '已充值',\r\n  '已兑换' => '已兌換',\r\n  '总赠送' => '總贈送',\r\n  '尾页' => '尾頁',\r\n  '订单号' => '訂單號',\r\n  '类型' => '類型',\r\n  '交易' => '交易',\r\n  '用户名' => '用戶名',\r\n  '数量' => '數量',\r\n  '金额' => '金額',\r\n  '时间' => '時間',\r\n  '查看' => '查看',\r\n  '选择模块' => '選擇模塊',\r\n  '选择上级' => '選擇上級',\r\n  '顶级栏目' => '頂級欄目',\r\n  '分类名' => '分類名',\r\n  '图片  ' => '圖片  ',\r\n  '择图片' => '擇圖片',\r\n  '排序规则' => '排序規則',\r\n  '组合：排序倒序，时间倒序，ID倒序' => '組合：排序倒序，時間倒序，ID倒序',\r\n  '组合：排序倒序，ID正序' => '組合：排序倒序，ID正序',\r\n  '排序正序' => '排序正序',\r\n  '时间倒序' => '時間倒序',\r\n  'ID正序' => 'ID正序',\r\n  '点击量倒序' => '點擊量倒序',\r\n  '时间正序' => '時間正序',\r\n  '默认不需要更改' => '默認不需要更改',\r\n  'URL命名' => 'URL命名',\r\n  '请填写文件名，如:index，不填请留空' => '請填寫文件名，如:index，不填請留空',\r\n  '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：' => '填寫欄目命名後，系統將自動用作該欄目URL連結，如：news，訪問該欄目連結：',\r\n  '多个相同URL，将覆盖前面的栏目' => '多個相同URL，將覆蓋前面的欄目',\r\n  '列表显示' => '列表顯示',\r\n  '设置列表页显示的内容条数' => '設置列表頁顯示的內容條數',\r\n  '栏目模板' => '欄目模板',\r\n  '手动填写，不填请留空' => '手動填寫，不填請留空',\r\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '請將模板文件放到對應的模塊文件夾下面，如文章(article)模塊，那麼就要在當前模板目錄的article文件夾下面。默認欄目首頁',\r\n  '详情页模板' => '詳情頁模板',\r\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。' => '請將模板文件放到對應的模塊文件夾下面，如文章(article)模塊，那麼就要在當前模板目錄的article文件夾下面，列表內的詳情頁。',\r\n  '栏目外链' => '欄目外鏈',\r\n  '栏目外链，如:htt://xxx.com/abc，不填请留空' => '欄目外鏈，如:htt://xxx.com/abc，不填請留空',\r\n  '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！' => '填寫欄目外鏈後，訪問欄目連結將會跳到外鏈，不填請留空！',\r\n  '发布显示' => '發布顯示',\r\n  '勾选后，前台会员发布会显示该栏目' => '勾選後，前台會員發布會顯示該欄目',\r\n  '导航显示' => '導航顯示',\r\n  '模板覆盖' => '模板覆蓋',\r\n  '覆盖' => '覆蓋',\r\n  '不覆盖' => '不覆蓋',\r\n  '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => '模板覆蓋指：顯示數量及使用模板文件下級一樣，減少同步操作。如果上級勾選了覆蓋下級，那麼下級默認調用上級填寫的模板。',\r\n  '访问限制' => '訪問限制',\r\n  '是否关闭' => '是否關閉',\r\n  '关闭' => '關閉',\r\n  '开启' => '開啟',\r\n  '栏目关闭后，前台不显示，也无法访问！' => '欄目關閉後，前台不顯示，也無法訪問！',\r\n  '增加' => '增加',\r\n  '请选择模板页面/使用自定义' => '請選擇模板頁面/使用自定義',\r\n  '批量新增' => '批量新增',\r\n  '添加栏目' => '添加欄目',\r\n  '格式：栏目名|栏目URL，一行一个，如：关于我们|about' => '格式：欄目名|欄目URL，一行一個，如：關於我們|about',\r\n  '格式：栏目名|栏目URL，一行一个' => '格式：欄目名|欄目URL，一行一個',\r\n  '请选择模板页面' => '請選擇模板頁面',\r\n  '图片 ' => '圖片 ',\r\n  '请填写完整文件名，如:index，不填请留空' => '請填寫完整文件名，如:index，不填請留空',\r\n  ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => ' 模板覆蓋指：顯示數量及使用模板文件下級一樣，減少同步操作。如果上級勾選了覆蓋下級，那麼下級默認調用上級填寫的模板。',\r\n  '请选择栏目' => '請選擇欄目',\r\n  '顶级' => '頂級',\r\n  '展开|折叠' => '展開|摺疊',\r\n  '模块名' => '模塊名',\r\n  '快捷操作' => '快捷操作',\r\n  '显示|隐藏' => '顯示|隱藏',\r\n  '添加下级' => '添加下級',\r\n  '字段管理' => '欄位管理',\r\n  '新增文章' => '新增文章',\r\n  '新增商品' => '新增商品',\r\n  '新增内容' => '新增內容',\r\n  '请选择对象' => '請選擇對象',\r\n  '已删除!' => '已刪除!',\r\n  '删除成功' => '刪除成功',\r\n  '扩展管理' => '擴展管理',\r\n  '新增轮播图' => '新增輪播圖',\r\n  '所属分类' => '所屬分類',\r\n  '图片' => '圖片',\r\n  '图片高' => '圖片高',\r\n  '0表示不限制' => '0表示不限制',\r\n  '图片宽' => '圖片寬',\r\n  '跳转链接' => '跳轉連結',\r\n  '不填请留空' => '不填請留空',\r\n  '数字越大越靠前' => '數字越大越靠前',\r\n  '修改轮播图' => '修改輪播圖',\r\n  '选择分类' => '選擇分類',\r\n  '更新时间' => '更新時間',\r\n  '轮播图列表' => '輪播圖列表',\r\n  '请选择分类' => '請選擇分類',\r\n  '请输入标题' => '請輸入標題',\r\n  '新增图片' => '新增圖片',\r\n  '分类列表' => '分類列表',\r\n  '添加分类' => '添加分類',\r\n  '共有数据：' => '共有數據：',\r\n  '条' => '條',\r\n  '长' => '長',\r\n  '宽' => '寬',\r\n  '轮播图分类' => '輪播圖分類',\r\n  '评论管理' => '評論管理',\r\n  '添加评论' => '添加評論',\r\n  '评论栏目' => '評論欄目',\r\n  '文章ID' => '文章ID',\r\n  '主回复ID' => '主回復ID',\r\n  '同属于一个评论的ID，如果没有评论中的评论，则为0' => '同屬於一個評論的ID，如果沒有評論中的評論，則為0',\r\n  '回复帖子ID' => '回覆帖子ID',\r\n  '评论内容' => '評論內容',\r\n  '管理员回复' => '管理員回復',\r\n  '是否提醒回复' => '是否提醒回復',\r\n  '提醒' => '提醒',\r\n  '不提醒' => '不提醒',\r\n  '喜欢/点赞' => '喜歡/點讚',\r\n  '是否已读' => '是否已讀',\r\n  '是否删除' => '是否刪除',\r\n  '已删除' => '已刪除',\r\n  '未删除' => '未刪除',\r\n  '只能管理员删除评论，用户只能软删除评论' => '只能管理員刪除評論，用戶只能軟刪除評論',\r\n  '查看评论' => '查看評論',\r\n  '评论列表' => '評論列表',\r\n  '请输入评论内容' => '請輸入評論內容',\r\n  '查看相关内容' => '查看相關內容',\r\n  '查看用户' => '查看用戶',\r\n  '所属文章' => '所屬文章',\r\n  '评论时间' => '評論時間',\r\n  '请选择审核选项' => '請選擇審核選項',\r\n  '批量处理成功' => '批量處理成功',\r\n  '调用方式' => '調用方式',\r\n  '这里输出想要的内容，如：' => '這裡輸出想要的內容，如：',\r\n  '查看SQL' => '查看SQL',\r\n  '系统扩展' => '系統擴展',\r\n  '桌面管理' => '桌面管理',\r\n  '新增配置' => '新增配置',\r\n  '配置名称' => '配置名稱',\r\n  '左侧菜单栏' => '左側菜單欄',\r\n  '没有二级菜单不会生效' => '沒有二級菜單不會生效',\r\n  '顶部菜单栏' => '頂部菜單欄',\r\n  '适用角色' => '適用角色',\r\n  '默认所有' => '默認所有',\r\n  '系统默认' => '系統默認',\r\n  '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置' => '系統默認指沒有指定桌面配置的管理員，進入後台後默認的配置',\r\n  '一个菜单名称' => '一個菜單名稱',\r\n  '顶级菜单' => '頂級菜單',\r\n  '菜单图标' => '菜單圖標',\r\n  '二级菜单' => '二級菜單',\r\n  '图标' => '圖標',\r\n  '修改菜单名称' => '修改菜單名稱',\r\n  '确定要删除吗？' => '確定要刪除嗎？',\r\n  '最后一个索引不能删除！' => '最後一個索引不能刪除！',\r\n  '添加菜单名称' => '添加菜單名稱',\r\n  '菜单选择' => '菜單選擇',\r\n  '图标选择' => '圖標選擇',\r\n  '修改配置' => '修改配置',\r\n  '桌面名称' => '桌面名稱',\r\n  '系统' => '系統',\r\n  '是否默认' => '是否默認',\r\n  '所有角色' => '所有角色',\r\n  '复制配置' => '複製配置',\r\n  '修改碎片' => '修改碎片',\r\n  '指定几个id或者几个tid的内容输出(栏目：不限制栏目)' => '指定幾個id或者幾個tid的內容輸出(欄目：不限制欄目)',\r\n  'SQL中输入：' => 'SQL中輸入：',\r\n  'SQL中输入： ' => 'SQL中輸入： ',\r\n  '如： ' => '如： ',\r\n  '单位：分钟' => '單位：分鐘',\r\n  '修改导航' => '修改導航',\r\n  '扩展模型管理' => '擴展模型管理',\r\n  '模块管理' => '模塊管理',\r\n  '新增字段' => '新增欄位',\r\n  '角色绑定' => '角色綁定',\r\n  '目绑定' => '目綁定',\r\n  '字段名称' => '欄位名稱',\r\n  '简短的名称' => '簡短的名稱',\r\n  '字段标识' => '欄位標識',\r\n  '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短' => '只能英文字母[或者後面+數字]，必須含有英文字母，小寫字母，簡短',\r\n  '字段类型' => '欄位類型',\r\n  '选择' => '選擇',\r\n  '长度' => '長度',\r\n  '说明' => '說明',\r\n  '不限' => '不限',\r\n  '带编辑器文本' => '帶編輯器文本',\r\n  '只能填写数字，长度不能超过11位' => '只能填寫數字，長度不能超過11位',\r\n  '金钱，小数等，保留2位' => '金錢，小數等，保留2位',\r\n  '时间日期' => '時間日期',\r\n  '多图，图集' => '多圖，圖集',\r\n  '红=1,黄=2' => '紅=1,黃=2',\r\n  '单项选择，下拉选择，如：红=1,黄=2,蓝=3' => '單項選擇，下拉選擇，如：紅=1,黃=2,藍=3',\r\n  '单项选择，按钮选择，如：红=1,黄=2,蓝=3' => '單項選擇，按鈕選擇，如：紅=1,黃=2,藍=3',\r\n  '多项选择，如：红=1,黄=2,蓝=3' => '多項選擇，如：紅=1,黃=2,藍=3',\r\n  '一个附件，压缩包，Excel，Word文档' => '一個附件，壓縮包，Excel，Word文檔',\r\n  '多个附件，压缩包，Excel，Word文档' => '多個附件，壓縮包，Excel，Word文檔',\r\n  '请选择关联模块' => '請選擇關聯模塊',\r\n  '列表显示字段' => '列表顯示欄位',\r\n  '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '單選關聯，可以直接調用關聯模塊內容列表，列表顯示對應欄位內容',\r\n  '多行录入，可以在页面动态新增内容输入框' => '多行錄入，可以在頁面動態新增內容輸入框',\r\n  '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '多選關聯，可以直接調用關聯模塊內容列表，列表顯示對應欄位內容',\r\n  '系统栏目，不可修改' => '系統欄目，不可修改',\r\n  '系统副栏目，不可修改' => '系統副欄目，不可修改',\r\n  '系统TAG，不可修改' => '系統TAG，不可修改',\r\n  '默认值' => '默認值',\r\n  '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1' => '默認欄位值，不填默認int類型的值是0，string類型的值是null。多選參數的值是兩邊帶【,】，如【,1,】表示值為1',\r\n  '字段提示' => '欄位提示',\r\n  '用于填写时的提示信息，50字以内' => '用於填寫時的提示信息，50字以內',\r\n  '表单排序' => '表單排序',\r\n  '是否必填' => '是否必填',\r\n  '必填' => '必填',\r\n  '非必填' => '非必填',\r\n  '带有文本框编辑器的除外' => '帶有文本框編輯器的除外',\r\n  '前台显示' => '前台顯示',\r\n  '前台表单' => '前台表單',\r\n  '后台显示' => '後台顯示',\r\n  '后台搜索' => '後台搜索',\r\n  '仅用于后台列表头部带有该字段搜索' => '僅用於後台列表頭部帶有該欄位搜索',\r\n  '列表中显示' => '列表中顯示',\r\n  '仅用于后台列表显示该字段' => '僅用於後台列表顯示該欄位',\r\n  '显示格式化' => '顯示格式化',\r\n  '不做处理' => '不做處理',\r\n  '仅用于后台列表显示该字段内容处理' => '僅用於後台列表顯示該欄位內容處理',\r\n  'ajax可访问' => 'ajax可訪問',\r\n  '不能' => '不能',\r\n  '能' => '能',\r\n  '由于本系统对json数据封装，限制访问可以提高安全性' => '由於本系統對json數據封裝，限制訪問可以提高安全性',\r\n  '角色名' => '角色名',\r\n  '栏目名' => '欄目名',\r\n  '修改字段' => '修改欄位',\r\n  '栏目绑定' => '欄目綁定',\r\n  '红=1,黄=2,蓝=3' => '紅=1,黃=2,藍=3',\r\n  '关联模块内容ID' => '關聯模塊內容ID',\r\n  '可以在页面动态新增内容输入框' => '可以在頁面動態新增內容輸入框',\r\n  '温馨提示：排序和宽度在列表点击也可以更改。' => '溫馨提示：排序和寬度在列表點擊也可以更改。',\r\n  '排序：当前列表显示排序，不会影响录入排序，越大越靠前。' => '排序：當前列表顯示排序，不會影響錄入排序，越大越靠前。',\r\n  '搜索：在列表顶部的搜索中，可以搜索该字段。' => '搜索：在列表頂部的搜索中，可以搜索該欄位。',\r\n  '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。' => '寬度：列表顯示的寬度。由於屏幕寬度問題，可以根據自己關注的欄位在列表中顯示更清晰，默認100。',\r\n  '宽度' => '寬度',\r\n  '批量绑定栏目' => '批量綁定欄目',\r\n  '字段' => '欄位',\r\n  '后台' => '後台',\r\n  '确认要删除吗？删除的同时将删除对应的表内容！' => '確認要刪除嗎？刪除的同時將刪除對應的表內容！',\r\n  '角色管理' => '角色管理',\r\n  '角色修改' => '角色修改',\r\n  '是否超管' => '是否超管',\r\n  '不是' => '不是',\r\n  '超级管理员拥有无上权利，无视下面权限限制' => '超級管理員擁有無上權利，無視下面權限限制',\r\n  '发布审核' => '發布審核',\r\n  '超级管理员除外，发布的内容是否需要审核' => '超級管理員除外，發布的內容是否需要審核',\r\n  '栏目权限' => '欄目權限',\r\n  '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效' => '是否設置欄目權限，默認不設置。開啟後下面的欄目權限設置才有效',\r\n  '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目' => '選中頂級欄目，則默認子欄目也選中。如果只需要子欄目權限，請不要選中頂級欄目',\r\n  '子栏目' => '子欄目',\r\n  '拥有权限' => '擁有權限',\r\n  '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块' => '選中主模塊，則默認子模塊也選中。如果只需要子模塊權限，請不要選中主模塊',\r\n  '主模块' => '主模塊',\r\n  '子模块' => '子模塊',\r\n  '描述' => '描述',\r\n  '请输入内容' => '請輸入內容',\r\n  '关闭后，该分组管理员将不能登录' => '關閉後，該分組管理員將不能登錄',\r\n  '添加角色' => '添加角色',\r\n  '后台管理' => '後台管理',\r\n  '展开左侧栏' => '展開左側欄',\r\n  '清理缓存' => '清理緩存',\r\n  '退出' => '退出',\r\n  '前台首页' => '前台首頁',\r\n  '后台首页' => '後台首頁',\r\n  '我的桌面' => '我的桌面',\r\n  '关闭当前' => '關閉當前',\r\n  '关闭其他' => '關閉其他',\r\n  '关闭所有' => '關閉所有',\r\n  '扩展模块管理' => '擴展模塊管理',\r\n  '批量修改分类' => '批量修改分類',\r\n  '批量处理' => '批量處理',\r\n  '友情链接分类' => '友情連結分類',\r\n  '分类' => '分類',\r\n  '后台管理登录' => '後台管理登錄',\r\n  '验证码' => '驗證碼',\r\n  '登录' => '登錄',\r\n  '登录ID' => '登錄ID',\r\n  '登录用户' => '登錄用戶',\r\n  '模块' => '模塊',\r\n  '方法' => '方法',\r\n  '操作时间' => '操作時間',\r\n  '会员管理' => '會員管理',\r\n  '新增会员' => '新增會員',\r\n  '用于找回密码' => '用於找回密碼',\r\n  '手机号' => '手機號',\r\n  '必须唯一' => '必須唯一',\r\n  '昵称' => '暱稱',\r\n  '分组' => '分組',\r\n  '头像' => '頭像',\r\n  '生日' => '生日',\r\n  '个性签名' => '個性簽名',\r\n  '省份' => '省份',\r\n  '城市' => '城市',\r\n  '详细地址' => '詳細地址',\r\n  '6到16个字符' => '6到16個字符',\r\n  '添加成功' => '添加成功',\r\n  '会员修' => '會員修',\r\n  '6到16个字符,不修改请留空' => '6到16個字符,不修改請留空',\r\n  '修改成功' => '修改成功',\r\n  '会员列表' => '會員列表',\r\n  '请输入手机号' => '請輸入手機號',\r\n  '余额' => '餘額',\r\n  '加入时间' => '加入時間',\r\n  '分组管理' => '分組管理',\r\n  '分组修改' => '分組修改',\r\n  '分组名' => '分組名',\r\n  '折扣类型' => '折扣類型',\r\n  '无折扣' => '無折扣',\r\n  '现金折扣' => '現金折扣',\r\n  '百分比折扣' => '百分比折扣',\r\n  '折扣金额' => '折扣金額',\r\n  '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效' => '百分比折扣請填寫0.01-1之間的小數(如5折,填0.5)，無折扣時，該參數設置無效',\r\n  '登录状态' => '登錄狀態',\r\n  '请选择所属单位！' => '請選擇所屬單位！',\r\n  '用户管理' => '用戶管理',\r\n  '会员分组' => '會員分組',\r\n  '添加分组' => '添加分組',\r\n  '温馨提示：前台权限已关闭，设置权限不会生效。' => '溫馨提示：前台權限已關閉，設置權限不會生效。',\r\n  '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！' => '溫馨提示：前台權限已開啟，權限設置將直接影響前台訪問，請謹慎操作！',\r\n  '留言管理' => '留言管理',\r\n  '查看留言' => '查看留言',\r\n  '问题描述' => '問題描述',\r\n  '用户昵称' => '用戶暱稱',\r\n  '留言栏目' => '留言欄目',\r\n  '不指定栏目' => '不指定欄目',\r\n  '联系电话' => '聯繫電話',\r\n  '留言IP' => '留言IP',\r\n  '留言内容' => '留言內容',\r\n  '是否审核' => '是否審核',\r\n  '提交时间' => '提交時間',\r\n  '修改保存' => '修改保存',\r\n  '留言列表' => '留言列表',\r\n  '请输入相关内容ID' => '請輸入相關內容ID',\r\n  '内容ID' => '內容ID',\r\n  '模型管理' => '模型管理',\r\n  '新增模型' => '新增模型',\r\n  '模型名称' => '模型名稱',\r\n  '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名' => '必須是英文字母，且不能是已存在的標識，標識即是資料庫里的表名',\r\n  '是否必选栏目' => '是否必選欄目',\r\n  '新增修改内容时必选' => '新增修改內容時必選',\r\n  '是否显示栏目' => '是否顯示欄目',\r\n  '列表展示、录入内容、修改内容三个页面是否展示栏目' => '列表展示、錄入內容、修改內容三個頁面是否展示欄目',\r\n  '是否受权限控制' => '是否受權限控制',\r\n  '不同角色可以通过控制栏目权限来限制查看内容' => '不同角色可以通過控制欄目權限來限制查看內容',\r\n  '栏目绑定显示' => '欄目綁定顯示',\r\n  '栏目绑定时是否显示该模型' => '欄目綁定時是否顯示該模型',\r\n  '前台发布' => '前台發布',\r\n  '前台是否允许发布' => '前台是否允許發布',\r\n  '列表模板' => '列表模板',\r\n  '默认列表模板' => '默認列表模板',\r\n  '详情模板' => '詳情模板',\r\n  '默认详情模板' => '默認詳情模板',\r\n  '是否开启' => '是否開啟',\r\n  '数值越小越靠前' => '數值越小越靠前',\r\n  '已有表' => '已有表',\r\n  '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"' => '如果資料庫已經有這個表了，就選擇\"是\"，否則就選\"不是\"',\r\n  '是否可以预览' => '是否可以預覽',\r\n  '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]' => '如果後台無法預覽，則選擇 「否」 ，列表中將不會出現 [預覽]',\r\n  '修改模型' => '修改模型',\r\n  '模型状态' => '模型狀態',\r\n  '模型分类' => '模型分類',\r\n  '允许' => '允許',\r\n  '已停用' => '已停用',\r\n  '已启用' => '已啟用',\r\n  '重构字段' => '重構欄位',\r\n  '确认要删除吗？删除的同时将删除对应的表！' => '確認要刪除嗎？刪除的同時將刪除對應的表！',\r\n  '订单列表' => '訂單列表',\r\n  '订单详情' => '訂單詳情',\r\n  '姓名' => '姓名',\r\n  '是否支付' => '是否支付',\r\n  '已支付' => '已支付',\r\n  '未支付' => '未支付',\r\n  '支付时间' => '支付時間',\r\n  '存储内容' => '存儲內容',\r\n  '订单内容' => '訂單內容',\r\n  '商品' => '商品',\r\n  '商品已删除' => '商品已刪除',\r\n  '收货信息：' => '收貨信息：',\r\n  '收件人：' => '收件人：',\r\n  '联系手机：' => '聯繫手機：',\r\n  '联系邮箱：' => '聯繫郵箱：',\r\n  '收货地址：' => '收貨地址：',\r\n  '订单状态' => '訂單狀態',\r\n  '订单已删除' => '訂單已刪除',\r\n  '已提交未支付' => '已提交未支付',\r\n  '超时订单' => '超時訂單',\r\n  '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '訂單更改為『已出貨』，點『確定修改』後，將發送一封郵件通知客戶。訂單未變化狀態則不會發送郵件',\r\n  '发货时间' => '發貨時間',\r\n  '确定修改' => '確定修改',\r\n  '订单管理' => '訂單管理',\r\n  '选择状态' => '選擇狀態',\r\n  '支付方式' => '支付方式',\r\n  '线下支付' => '線下支付',\r\n  '钱包支付' => '錢包支付',\r\n  '积分兑换' => '積分兌換',\r\n  '支付宝支付' => '支付寶支付',\r\n  '微信支付' => '微信支付',\r\n  '微信H5支付' => '微信H5支付',\r\n  '微信扫码支付' => '微信掃碼支付',\r\n  '支付宝H5支付' => '支付寶H5支付',\r\n  '总收入' => '總收入',\r\n  '付款方式' => '付款方式',\r\n  '是否付款' => '是否付款',\r\n  '付款时间' => '付款時間',\r\n  '图库管理' => '圖庫管理',\r\n  '筛选上传入口' => '篩選上傳入口',\r\n  '前台' => '前台',\r\n  '筛选模块' => '篩選模塊',\r\n  '其他杂项' => '其他雜項',\r\n  '系统配置' => '系統配置',\r\n  '筛选栏目' => '篩選欄目',\r\n  '上传前台' => '上傳前台',\r\n  '所属模块' => '所屬模塊',\r\n  '本地文件' => '本地文件',\r\n  '文件大小' => '文件大小',\r\n  '其他' => '其他',\r\n  '插件管理' => '插件管理',\r\n  '插件列表' => '插件列表',\r\n  '全部' => '全部',\r\n  '本地' => '本地',\r\n  '请输入插件名字' => '請輸入插件名字',\r\n  '插件名' => '插件名',\r\n  '版本' => '版本',\r\n  '作者' => '作者',\r\n  '平台' => '平台',\r\n  '插件文件' => '插件文件',\r\n  '开关' => '開關',\r\n  '安装说明' => '安裝說明',\r\n  '点击查看' => '點擊查看',\r\n  '更新说明' => '更新說明',\r\n  '新' => '新',\r\n  '官方' => '官方',\r\n  '第三方' => '第三方',\r\n  '开|停' => '開|停',\r\n  '配置' => '配置',\r\n  '导出' => '導出',\r\n  '卸载' => '卸載',\r\n  '安装' => '安裝',\r\n  '下载' => '下載',\r\n  '获取文件大小失败，请检查网络！' => '獲取文件大小失敗，請檢查網絡！',\r\n  '正在安装中，请稍等~' => '正在安裝中，請稍等~',\r\n  '正在删除中，请稍等~' => '正在刪除中，請稍等~',\r\n  '正在卸载中，请稍等~' => '正在卸載中，請稍等~',\r\n  '设置接口' => '設置接口',\r\n  '当前版本：' => '當前版本：',\r\n  '最新版本：' => '最新版本：',\r\n  '作者：' => '作者：',\r\n  '更新时间：' => '更新時間：',\r\n  '更新内容' => '更新內容',\r\n  '正在下载文件' => '正在下載文件',\r\n  '升级插件' => '升級插件',\r\n  '文件下载完成！正在解压~' => '文件下載完成！正在解壓~',\r\n  '文件解压完成！正在进行安装~' => '文件解壓完成！正在進行安裝~',\r\n  '插件升级成功！' => '插件升級成功！',\r\n  '插件已升级完毕！' => '插件已升級完畢！',\r\n  '功能' => '功能',\r\n  '函数名' => '函數名',\r\n  '对应的控制器/函数，如果是顶级，则只需要写控制器名' => '對應的控制器/函數，如果是頂級，則只需要寫控制器名',\r\n  '权限列表' => '權限列表',\r\n  '添加权限' => '添加權限',\r\n  '控制器/方法' => '控制器/方法',\r\n  '添加子功能' => '添加子功能',\r\n  '权限管理' => '權限管理',\r\n  '栏目选择' => '欄目選擇',\r\n  '权限选择' => '權限選擇',\r\n  '不能选择的权限是非独立功能' => '不能選擇的權限是非獨立功能',\r\n  '请先勾选菜单!' => '請先勾選菜單!',\r\n  '扩展信息' => '擴展信息',\r\n  '回收站' => '回收站',\r\n  '还原' => '還原',\r\n  '批量恢复' => '批量恢復',\r\n  '确认要删除吗？删除后就彻底无法恢复了！' => '確認要刪除嗎？刪除後就徹底無法恢復了！',\r\n  '确认要删除吗？删除后不可恢复！' => '確認要刪除嗎？刪除後不可恢復！',\r\n  '确认要还原吗？' => '確認要還原嗎？',\r\n  '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。' => '重構欄位可以快速將外部表引入CMS內，使其兼容CMS模型。',\r\n  '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '重構欄位 => 簡單選擇錄入類型 => 欄位列表 => 詳細欄位修改',\r\n  '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '溫馨提示：外部表必須有個欄位為id，且必須是自增主鍵。如果沒有，請先在資料庫手動增加這個欄位或者把已有的自增欄位改成id。',\r\n  '数据类型' => '數據類型',\r\n  '录入类型' => '錄入類型',\r\n  '归属' => '歸屬',\r\n  '插件' => '插件',\r\n  '独立功能' => '獨立功能',\r\n  '桌面管理配置时，将调用独立功能' => '桌面管理配置時，將調用獨立功能',\r\n  '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录' => '手機端已開啟，sitemap將包含手機端URL，請注意【手機靜態目錄',\r\n  '如果不生成静态文件，请改为' => '如果不生成靜態文件，請改為',\r\n  '手机端未开启，sitemap不会包含手机端URL' => '手機端未開啟，sitemap不會包含手機端URL',\r\n  'PC端网站地图：' => 'PC端網站地圖：',\r\n  '手机端网站地图：' => '手機端網站地圖：',\r\n  '网站地图' => '網站地圖',\r\n  '模块名称' => '模塊名稱',\r\n  '更新频率' => '更新頻率',\r\n  '站内权重' => '站內權重',\r\n  '输出范围' => '輸出範圍',\r\n  '栏目模块' => '欄目模塊',\r\n  '显示的栏目' => '顯示的欄目',\r\n  '所有的栏目' => '所有的欄目',\r\n  '文章模块' => '文章模塊',\r\n  '显示的文章' => '顯示的文章',\r\n  '所有的文章' => '所有的文章',\r\n  '商品模块' => '商品模塊',\r\n  '显示的商品' => '顯示的商品',\r\n  '所有的商品' => '所有的商品',\r\n  '显示的' => '顯示的',\r\n  '所有的' => '所有的',\r\n  '立即生成' => '立即生成',\r\n  '网站设置' => '網站設置',\r\n  '自定义配置' => '自定義配置',\r\n  '点击复制' => '點擊複製',\r\n  '上传文件' => '上傳文件',\r\n  '不选' => '不選',\r\n  '删除配置栏' => '刪除配置欄',\r\n  '选择类型' => '選擇類型',\r\n  '编辑器' => '編輯器',\r\n  '文件上传' => '文件上傳',\r\n  '下拉选项' => '下拉選項',\r\n  '栏目选项' => '欄目選項',\r\n  '代码' => '代碼',\r\n  '请填写配置名(中文)' => '請填寫配置名(中文)',\r\n  '配置标识(字母或数字)' => '配置標識(字母或數字)',\r\n  '配置栏目' => '配置欄目',\r\n  '提示信息' => '提示信息',\r\n  '自定义配置可以配置对应配置栏下的自定义内容' => '自定義配置可以配置對應配置欄下的自定義內容',\r\n  '下拉选项配置，如：开启=1,关闭=0' => '下拉選項配置，如：開啟=1,關閉=0',\r\n  '自定义配置栏' => '自定義配置欄',\r\n  '请填写配置栏名(中文)' => '請填寫配置欄名(中文)',\r\n  '配置标识(必须是字母)' => '配置標識(必須是字母)',\r\n  '配置标识用于权限控制，必填且不能与原系统配置栏重复' => '配置標識用於權限控制，必填且不能與原系統配置欄重複',\r\n  '失败！' => '失敗！',\r\n  '模板管理' => '模板管理',\r\n  '模板列表' => '模板列表',\r\n  '请输入模板名字' => '請輸入模板名字',\r\n  '有更新' => '有更新',\r\n  '已使用' => '已使用',\r\n  '备份数据' => '備份數據',\r\n  '安装模板' => '安裝模板',\r\n  '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？' => '如果數據量較大，不建議通過此方法備份資料庫，可以從資料庫中直接導出。確定要備份資料庫嗎？',\r\n  '提示' => '提示',\r\n  '安装提示' => '安裝提示',\r\n  '该模板用于：' => '該模板用於：',\r\n  'PC端' => 'PC端',\r\n  '手机端' => '手機端',\r\n  '微信端' => '微信端',\r\n  '升级模板' => '升級模板',\r\n  '模板升级成功！' => '模板升級成功！',\r\n  '模板已升级完毕！' => '模板已升級完畢！',\r\n  '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！' => '您已開啟【緩存完整頁面】，更新靜態HTML需要預留足夠的空間，如：總內存500M，已用280M（過半），不建議生成HMTL，可能會導致內存不夠！',\r\n  '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '可以去【系統設置】-【高級設置】-【緩存完整頁面】進行關閉',\r\n  '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！' => '請確定空間內存是否足夠，如果不夠，可以開啟【緩存完整頁面】，也能達到靜態訪問打開頁面速度！',\r\n  '指定栏目' => '指定欄目',\r\n  '所有栏目' => '所有欄目',\r\n  '生成电脑静态' => '生成電腦靜態',\r\n  '生成手机静态' => '生成手機靜態',\r\n  '清理电脑静态HTML' => '清理電腦靜態HTML',\r\n  '清理手机静态HTML' => '清理手機靜態HTML',\r\n  '批量生成电脑静态' => '批量生成電腦靜態',\r\n  '批量生成手机静态' => '批量生成手機靜態',\r\n  '批量清理电脑静态' => '批量清理電腦靜態',\r\n  '批量清理手机静态' => '批量清理手機靜態',\r\n  '正在处理~' => '正在處理~',\r\n  '正在准备生成静态，请不要关闭页面~' => '正在準備生成靜態，請不要關閉頁面~',\r\n  '正在准备清理电脑端静态HTML，请不要关闭页面~' => '正在準備清理電腦端靜態HTML，請不要關閉頁面~',\r\n  '正在准备清理手机端静态HTML，请不要关闭页面~' => '正在準備清理手機端靜態HTML，請不要關閉頁面~',\r\n  '欢迎管理员：' => '歡迎管理員：',\r\n  '当前时间' => '當前時間',\r\n  '站内用户' => '站內用戶',\r\n  '人' => '人',\r\n  '站内文章' => '站內文章',\r\n  '篇' => '篇',\r\n  '站内产品' => '站內產品',\r\n  '件' => '件',\r\n  '站内留言' => '站內留言',\r\n  '最近更新' => '最近更新',\r\n  '全部文章' => '全部文章',\r\n  '阅读量' => '閱讀量',\r\n  '最新评论' => '最新評論',\r\n  '在' => '在',\r\n  '发布了评论' => '發布了評論',\r\n  '版本信息' => '版本信息',\r\n  '当前版本' => '當前版本',\r\n  '项目地址' => '項目地址',\r\n  '服务器' => '伺服器',\r\n  '操作系统' => '作業系統',\r\n  '运行环境' => '運行環境',\r\n  'PHP版本' => 'PHP版本',\r\n  '运行方式' => '運行方式',\r\n  '上传限制' => '上傳限制',\r\n  '用户留言' => '用戶留言',\r\n  '回复' => '回復',\r\n  '星期天' => '星期天',\r\n  '星期一' => '星期一',\r\n  '星期二' => '星期二',\r\n  '星期三' => '星期三',\r\n  '星期四' => '星期四',\r\n  '星期五' => '星期五',\r\n  '星期六' => '星期六',\r\n  '评论模块未开启！' => '評論模塊未開啟！',\r\n  '您的操作过于频繁，请十分钟后再试~' => '您的操作過於頻繁，請十分鐘後再試~',\r\n  '评论内容不能为空！' => '評論內容不能為空！',\r\n  '请提交栏目ID' => '請提交欄目ID',\r\n  '栏目ID不能为空！' => '欄目ID不能為空！',\r\n  '评论奖励' => '評論獎勵',\r\n  '评价成功！' => '評價成功！',\r\n  '您未登录，请重新登录~' => '您未登錄，請重新登錄~',\r\n  '您没有' => '您沒有',\r\n  '的权限！' => '的權限！',\r\n  '您还未登录，请重新登录！' => '您還未登錄，請重新登錄！',\r\n  '上传成功！' => '上傳成功！',\r\n  '已关闭前台上传文件功能' => '已關閉前台上傳文件功能',\r\n  '上传错误！' => '上傳錯誤！',\r\n  '对不起，您没有访问权限！' => '對不起，您沒有訪問權限！',\r\n  '输入url错误！' => '輸入url錯誤！',\r\n  '缺少ID！' => '缺少ID！',\r\n  '未找到相应内容！' => '未找到相應內容！',\r\n  '请输入关键词搜索！' => '請輸入關鍵詞搜索！',\r\n  '搜索超出设定范围！' => '搜索超出設定範圍！',\r\n  '您的搜索超出设定范围！' => '您的搜索超出設定範圍！',\r\n  '系统创建' => '系統創建',\r\n  '目录失败!' => '目錄失敗!',\r\n  '支付成功，但是系统内没有找到相应的订单！' => '支付成功，但是系統內沒有找到相應的訂單！',\r\n  '支付失败' => '支付失敗',\r\n  '订单号错误！' => '訂單號錯誤！',\r\n  '会员中心已关闭！' => '會員中心已關閉！',\r\n  '您的账户已被冻结！' => '您的帳戶已被凍結！',\r\n  '未找到您所在分组，请联系管理员处理！' => '未找到您所在分組，請聯繫管理員處理！',\r\n  '您所在的分组被限制登录！' => '您所在的分組被限制登錄！',\r\n  '登录奖励' => '登錄獎勵',\r\n  '系统已关闭会员注册！' => '系統已關閉會員註冊！',\r\n  '您的邀请链接不合法！' => '您的邀請連結不合法！',\r\n  '手机号格式不正确！' => '手機號格式不正確！',\r\n  '您的邮箱已注册！' => '您的郵箱已註冊！',\r\n  '您的手机号码已注册！' => '您的手機號碼已註冊！',\r\n  '邀请奖励' => '邀請獎勵',\r\n  '注册成功，等待审核！' => '註冊成功，等待審核！',\r\n  '注册成功！' => '註冊成功！',\r\n  '注册失败，请重试~' => '註冊失敗，請重試~',\r\n  '必须通过邀请链接进行注册！' => '必須通過邀請連結進行註冊！',\r\n  '请输入账号和邮箱！' => '請輸入帳號和郵箱！',\r\n  '图形验证码错误！' => '圖形驗證碼錯誤！',\r\n  '找回密码' => '找回密碼',\r\n  '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击' => '您的帳號正在進行找回密碼操作，如果確定是本人操作，請在10分鐘內點擊',\r\n  '立即找回密码' => '立即找回密碼',\r\n  '过期失效！' => '過期失效！',\r\n  '您操作过于频繁，请10分钟后再尝试！' => '您操作過於頻繁，請10分鐘後再嘗試！',\r\n  '找回密码邮件已发送，请到您的邮箱查看！' => '找回密碼郵件已發送，請到您的郵箱查看！',\r\n  '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！' => '郵箱伺服器未配置，無法發送郵件，請聯繫管理員找回密碼！',\r\n  '输入的信息有误！' => '輸入的信息有誤！',\r\n  'token已失效！' => 'token已失效！',\r\n  '密码重置成功,请重新登录！' => '密碼重置成功,請重新登錄！',\r\n  '新密码不能与旧密码相同！' => '新密碼不能與舊密碼相同！',\r\n  '标题不能为空！' => '標題不能為空！',\r\n  '称呼不能为空！' => '稱呼不能為空！',\r\n  '您的手机号格式不正确！' => '您的手機號格式不正確！',\r\n  '不能为空！' => '不能為空！',\r\n  '提交成功！我们会尽快回复您！' => '提交成功！我們會儘快回復您！',\r\n  '提交失败，请重试！' => '提交失敗，請重試！',\r\n  '链接错误' => '連結錯誤',\r\n  '留言未找到或者未审核' => '留言未找到或者未審核',\r\n  '匿名' => '匿名',\r\n  '缺少id参数！' => '缺少id參數！',\r\n  '缺少tid参数！' => '缺少tid參數！',\r\n  '未找到商品或者已下架！' => '未找到商品或者已下架！',\r\n  '该模块缺少price价格参数！' => '該模塊缺少price價格參數！',\r\n  '您的订单提交成功通知' => '您的訂單提交成功通知',\r\n  '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！' => '我們已經收到您的訂單，我們會儘快給你發貨，請密切關注您的郵箱以獲得訂單的最新消息，謝謝合作！',\r\n  '订单详细信息如下' => '訂單詳細信息如下',\r\n  '折扣' => '折扣',\r\n  '运费' => '運費',\r\n  '合计' => '合計',\r\n  '收件地址' => '收件地址',\r\n  '您的订单' => '您的訂單',\r\n  '已经提交，我们会尽快给您发货！' => '已經提交，我們會儘快給您發貨！',\r\n  '订单已支付！' => '訂單已支付！',\r\n  '已经提交，请尽快支付！' => '已經提交，請儘快支付！',\r\n  '支付订单' => '支付訂單',\r\n  '电脑支付宝支付' => '電腦支付寶支付',\r\n  '微信内支付' => '微信內支付',\r\n  '未开启钱包支付！' => '未開啟錢包支付！',\r\n  '您未登录，无法支付！' => '您未登錄，無法支付！',\r\n  '钱包金额不足，请充值！' => '錢包金額不足，請充值！',\r\n  '未开启积分支付！' => '未開啟積分支付！',\r\n  '积分不足，请充值！' => '積分不足，請充值！',\r\n  '支付宝当面付' => '支付寶當面付',\r\n  '其他平台支付' => '其他平台支付',\r\n  '在线充值' => '在線充值',\r\n  '交易创建，等待买家付款' => '交易創建，等待買家付款',\r\n  '未付款交易超时关闭，或支付完成后全额退款' => '未付款交易超時關閉，或支付完成後全額退款',\r\n  '支付成功' => '支付成功',\r\n  '交易结束，不可退款' => '交易結束，不可退款',\r\n  '未知状态' => '未知狀態',\r\n  '订单号错误或订单被删除！' => '訂單號錯誤或訂單被刪除！',\r\n  '订单未支付或订单号错误！' => '訂單未支付或訂單號錯誤！',\r\n  '创建订单失败！' => '創建訂單失敗！',\r\n  '订单号不存在或已被删除！' => '訂單號不存在或已被刪除！',\r\n  '收件人、手机号和收货地址不能为空！' => '收件人、手機號和收貨地址不能為空！',\r\n  '未开启在线支付！' => '未開啟在線支付！',\r\n  '获取openid失败' => '獲取openid失敗',\r\n  '非法参数！' => '非法參數！',\r\n  '标签未找到或已删除！' => '標籤未找到或已刪除！',\r\n  '手机号码格式错误！' => '手機號碼格式錯誤！',\r\n  '账户不能为空！' => '帳戶不能為空！',\r\n  '订单已过期，不可支付！' => '訂單已過期，不可支付！',\r\n  '订单已支付，请勿重复操作！' => '訂單已支付，請勿重複操作！',\r\n  '缺少订单号！' => '缺少訂單號！',\r\n  '网络错误，请刷新后重试！' => '網絡錯誤，請刷新後重試！',\r\n  '未找到评论！' => '未找到評論！',\r\n  '已取消点赞！' => '已取消點讚！',\r\n  '点赞成功！' => '點讚成功！',\r\n  '栏目未绑定模型，无法喜欢！' => '欄目未綁定模型，無法喜歡！',\r\n  '取消点赞' => '取消點讚',\r\n  '点赞奖励' => '點讚獎勵',\r\n  '已被删除 ' => '已被刪除 ',\r\n  '栏目未绑定模型，无法收藏！' => '欄目未綁定模型，無法收藏！',\r\n  '取消收藏' => '取消收藏',\r\n  '收藏奖励' => '收藏獎勵',\r\n  '收藏成功！' => '收藏成功！',\r\n  '已被删除' => '已被刪除',\r\n  '库存不足！' => '庫存不足！',\r\n  '该模块不允许发布！' => '該模塊不允許發布！',\r\n  '添加失败，存在敏感词' => '添加失敗，存在敏感詞',\r\n  '分类错误！' => '分類錯誤！',\r\n  '该分类不允许发布！' => '該分類不允許發布！',\r\n  '您没有权限在该分类发布内容！' => '您沒有權限在該分類發布內容！',\r\n  '内容不能为空！' => '內容不能為空！',\r\n  '库存不能为0！' => '庫存不能為0！',\r\n  '未修改内容，不能提交！' => '未修改內容，不能提交！',\r\n  '发布失败，请重试！' => '發布失敗，請重試！',\r\n  '发布成功！' => '發布成功！',\r\n  '未找到您要的文章！' => '未找到您要的文章！',\r\n  '您已经关注了该用户！' => '您已經關注了該用戶！',\r\n  '您不能关注自己！' => '您不能關注自己！',\r\n  '关注奖励' => '關注獎勵',\r\n  '关注成功！' => '關注成功！',\r\n  '您没有关注该用户，无法操作！' => '您沒有關注該用戶，無法操作！',\r\n  '取关成功！' => '取關成功！',\r\n  '消息已被删除！' => '消息已被刪除！',\r\n  '用户未找到！' => '用戶未找到！',\r\n  '未分类 ' => '未分類 ',\r\n  '设置成功' => '設置成功',\r\n  '设置成功！' => '設置成功！',\r\n  '记录不存在！' => '記錄不存在！',\r\n  '缺少栏目ID！' => '缺少欄目ID！',\r\n  '系统未配置微信登录！' => '系統未配置微信登錄！',\r\n  '微信已绑定！' => '微信已綁定！',\r\n  '您的微信已被绑定，不能再绑定！' => '您的微信已被綁定，不能再綁定！',\r\n  '系统版号' => '系統版號',\r\n  '版本号是系统自带，请勿改动' => '版本號是系統自帶，請勿改動',\r\n  '网站SEO名称' => '網站SEO名稱',\r\n  '控制在25个字、50个字节以内' => '控制在25個字、50個字節以內',\r\n  '网站SEO关键词' => '網站SEO關鍵詞',\r\n  '5个左右，8汉字以内，用英文逗号隔开' => '5個左右，8漢字以內，用英文逗號隔開',\r\n  '网站SEO描述' => '網站SEO描述',\r\n  '控制在80个汉字，160个字符以内' => '控制在80個漢字，160個字符以內',\r\n  '统计代码' => '統計代碼',\r\n  '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '將百度統計、cnzz等平台的流量統計JS代碼放到這裡',\r\n  '底部版权' => '底部版權',\r\n  '如：&copy; 2016 xxx版权' => '如：&copy; 2016 xxx版權',\r\n  '备案号' => '備案號',\r\n  '如：京ICP备00000000号' => '如：京ICP備00000000號',\r\n  '网站电话' => '網站電話',\r\n  '网站联系电话' => '網站聯繫電話',\r\n  '400电话' => '400電話',\r\n  '网站QQ' => '網站QQ',\r\n  '网站邮箱' => '網站郵箱',\r\n  '公司地址' => '公司地址',\r\n  'PC网站模板' => 'PC網站模板',\r\n  '将模板名称填写到此处' => '將模板名稱填寫到此處',\r\n  'WAP网站模板' => 'WAP網站模板',\r\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板' => '開啟了手機端，這個設置才會生效，否則調用電腦端模板',\r\n  '微信网站模板' => '微信網站模板',\r\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板' => '開啟了手機端，這個設置才會生效，否則調用電腦端模板。由於微信內有一些特殊的js，所以可以在這裡單獨設置微信模板',\r\n  '是否开启手机端' => '是否開啟手機端',\r\n  '如果不开启手机端，则默认调用电脑端模板' => '如果不開啟手機端，則默認調用電腦端模板',\r\n  '是否开启前台上传' => '是否開啟前台上傳',\r\n  '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。' => '關閉後，前台無法上傳文件。如果網站沒有使用會員，建議關閉前台上傳。',\r\n  '是否开启前台权限' => '是否開啟前台權限',\r\n  '开启后前台用户权限可以在后台控制' => '開啟後前台用戶權限可以在後台控制',\r\n  '缓存时间' => '緩存時間',\r\n  '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。' => '單位：分鐘，留空或0則不設置緩存。如果生成靜態文件，靜態文件清空後才生效。此設置與緩存完整頁面，模板緩存有關。',\r\n  '限制上传文件大小' => '限制上傳文件大小',\r\n  '0代表不限，单位kb' => '0代表不限，單位kb',\r\n  '允许上传文件类型' => '允許上傳文件類型',\r\n  '请用|分割，如：pdf|jpg|png' => '請用|分割，如：pdf|jpg|png',\r\n  '前台UEditor编辑器导航条配置' => '前台UEditor編輯器導航條配置',\r\n  '允许前台搜索的表' => '允許前台搜索的表',\r\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product' => '防止數據泄露,填寫允許發布模塊標識,留空表示不允許發布,多個表可用|分割,如：article|product',\r\n  '上传图片压缩比例' => '上傳圖片壓縮比例',\r\n  '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80' => '100%則不壓縮，如果PNG是透明圖，壓縮後背景變黑色。格式如：80',\r\n  'PNG是否压缩' => 'PNG是否壓縮',\r\n  'PNG压缩后容易变成背景黑色，关闭后，不会压缩。' => 'PNG壓縮後容易變成背景黑色，關閉後，不會壓縮。',\r\n  '邮件服务器' => '郵件伺服器',\r\n  'smtp.163.com,smtp.qq.com' => 'smtp.163.com,smtp.qq.com',\r\n  '邮件收发端口' => '郵件收發埠',\r\n  '163、126邮件端口(465)，QQ邮件端口(587)' => '163、126郵件埠(465)，QQ郵件埠(587)',\r\n  '收件人Email地址' => '收件人Email地址',\r\n  '发件人Email地址' => '發件人Email地址',\r\n  '指邮件服务器发件邮箱' => '指郵件伺服器發件郵箱',\r\n  '发件人Email秘钥' => '發件人Email秘鑰',\r\n  '这个秘钥不是登录密码' => '這個秘鑰不是登錄密碼',\r\n  '发件人昵称' => '發件人暱稱',\r\n  '发件邮箱会带一个昵称' => '發件郵箱會帶一個暱稱',\r\n  '客户订单通知' => '客戶訂單通知',\r\n  '购买商品的时候会发送的一条邮件信息' => '購買商品的時候會發送的一條郵件信息',\r\n  '订单出货通知' => '訂單出貨通知',\r\n  '发货的时候发送给客户的通知' => '發貨的時候發送給客戶的通知',\r\n  '订单运费' => '訂單運費',\r\n  '购物下单时会加上这个运费' => '購物下單時會加上這個運費',\r\n  '在线支付' => '在線支付',\r\n  '0关闭支付，1自主平台支付' => '0關閉支付，1自主平台支付',\r\n  '极致平台接口' => '極致平台接口',\r\n  '极致平台商户' => '極致平台商戶',\r\n  '极致平台应用appid' => '極致平台應用appid',\r\n  '极致平台应用秘钥' => '極致平台應用秘鑰',\r\n  '支付宝APPID' => '支付寶APPID',\r\n  '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID' => '帳戶中心->密鑰管理->開放平台密鑰，填寫添加了電腦網站支付的應用的APPID',\r\n  '支付宝key' => '支付寶key',\r\n  'MD5密钥，安全检验码，由数字和字母组成的32位字符串' => 'MD5密鑰，安全檢驗碼，由數字和字母組成的32位字符串',\r\n  '支付宝私钥' => '支付寶私鑰',\r\n  '支付宝公钥' => '支付寶公鑰',\r\n  '微信商户mchid' => '微信商戶mchid',\r\n  '支付相关' => '支付相關',\r\n  '微信商户key' => '微信商戶key',\r\n  '微信公众号appid' => '微信公眾號appid',\r\n  '微信公众号appsecret' => '微信公眾號appsecret',\r\n  '微信apiclient_cert' => '微信apiclient_cert',\r\n  '微信apiclient_key' => '微信apiclient_key',\r\n  '公众号appid' => '公眾號appid',\r\n  '用户登录相关，如果跟支付的一样，那就再填写一遍' => '用戶登錄相關，如果跟支付的一樣，那就再填寫一遍',\r\n  '公众号appsecret' => '公眾號appsecret',\r\n  '公众号token' => '公眾號token',\r\n  '公众号关注欢迎语' => '公眾號關注歡迎語',\r\n  '公众号关注时发送的第一句推送' => '公眾號關注時發送的第一句推送',\r\n  '网站LOGO' => '網站LOGO',\r\n  '后台模板风格' => '後台模板風格',\r\n  '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。' => '內頁彈窗：點擊新增/修改等操作，頁面是一個彈出層，更美觀。內嵌頁面：點擊新增/修改等操作，頁面直接進入新頁面，不會彈出層。',\r\n  '是否绑定多域名' => '是否綁定多域名',\r\n  '开启绑定多域名后，需要到插件中配置' => '開啟綁定多域名後，需要到插件中配置',\r\n  '网站SEO网址' => '網站SEO網址',\r\n  '一般不填，全局网址，最后不带/,如：http://www.xxx.com' => '一般不填，全局網址，最後不帶/,如：http://www.xxx.com',\r\n  '基本信息下扩展' => '基本信息下擴展',\r\n  '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下' => '新增欄位是否顯示在【基本信息】底部，默認在【擴展信息】下',\r\n  '订单超时' => '訂單超時',\r\n  '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制' => '按小時計算，超過該小時訂單過期，僅限於開啟支付後，0代表不限制',\r\n  '开启层级URL' => '開啟層級URL',\r\n  '默认关闭层级URL，开启后URL会按照父类层级展现' => '默認關閉層級URL，開啟後URL會按照父類層級展現',\r\n  '缓存完整页面' => '緩存完整頁面',\r\n  '前台完整页面缓存，结合缓存时间，可以提高访问速度' => '前台完整頁面緩存，結合緩存時間，可以提高訪問速度',\r\n  '自动生成静态HTML' => '自動生成靜態HTML',\r\n  '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面' => '前台訪問網站頁面，將自動生成靜態HTML，下次訪問直接進入靜態HTML頁面',\r\n  'PC静态文件目录' => 'PC靜態文件目錄',\r\n  '电脑端静态HTML存放目录，默认根目录[ / ]' => '電腦端靜態HTML存放目錄，默認根目錄[ / ]',\r\n  'WAP静态文件目录' => 'WAP靜態文件目錄',\r\n  '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱' => '手機端靜態HTML存放目錄，默認[ m ]，PC和WAP靜態目錄不能相同，否則文件會混亂',\r\n  '是否留言自动审核' => '是否留言自動審核',\r\n  '开启后，留言自动审核（显示）' => '開啟後，留言自動審核（顯示）',\r\n  '是否评论自动审核' => '是否評論自動審核',\r\n  '开启后评论自动审核（显示）' => '開啟後評論自動審核（顯示）',\r\n  '网站敏感词过滤' => '網站敏感詞過濾',\r\n  '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容' => '將敏感詞放到裡面，用「,」分隔，用{xxx}代替通配內容',\r\n  '是否开启水印' => '是否開啟水印',\r\n  '开启水印需要上传水印图片' => '開啟水印需要上傳水印圖片',\r\n  '水印图片' => '水印圖片',\r\n  '水印图片在250px以内' => '水印圖片在250px以內',\r\n  '水印位置' => '水印位置',\r\n  '参考键盘九宫格1-9' => '參考鍵盤九宮格1-9',\r\n  '水印透明度' => '水印透明度',\r\n  '透明度越大，越难看清楚水印' => '透明度越大，越難看清楚水印',\r\n  '钱包兑换率' => '錢包兌換率',\r\n  '站内钱包与RMB的兑换率，即1元=多少金币' => '站內錢包與RMB的兌換率，即1元=多少金幣',\r\n  '积分兑换率' => '積分兌換率',\r\n  '站内积分与RMB的兑换率，即1元=多少积分' => '站內積分與RMB的兌換率，即1元=多少積分',\r\n  '积分支付' => '積分支付',\r\n  '开启积分支付后，商品可以用积分支付' => '開啟積分支付後，商品可以用積分支付',\r\n  '开启钱包支付后，商品可以用钱包支付' => '開啟錢包支付後，商品可以用錢包支付',\r\n  '开启微信支付后，商品可以用微信支付' => '開啟微信支付後，商品可以用微信支付',\r\n  '开启支付宝支付后，商品可以用支付宝支付' => '開啟支付寶支付後，商品可以用支付寶支付',\r\n  '每次登录奖励' => '每次登錄獎勵',\r\n  '每天登录奖励积分数，最小为0，每天登录只奖励一次' => '每天登錄獎勵積分數，最小為0，每天登錄只獎勵一次',\r\n  '开启登录奖励后，登录后就会获得积分奖励' => '開啟登錄獎勵後，登錄後就會獲得積分獎勵',\r\n  '开启后，发布内容会奖励积分' => '開啟後，發布內容會獎勵積分',\r\n  '每次发布奖励' => '每次發布獎勵',\r\n  '每次发布内容奖励积分数' => '每次發布內容獎勵積分數',\r\n  '每天发布最高奖励' => '每天發布最高獎勵',\r\n  '每天奖励不超过积分上限，设置0则无上限' => '每天獎勵不超過積分上限，設置0則無上限',\r\n  '开启后，发布内容被收藏会奖励积分' => '開啟後，發布內容被收藏會獎勵積分',\r\n  '每次收藏奖励' => '每次收藏獎勵',\r\n  '每次发布内容被收藏奖励积分数' => '每次發布內容被收藏獎勵積分數',\r\n  '每天收藏最高奖励' => '每天收藏最高獎勵',\r\n  '开启后，发布内容被点赞会奖励积分' => '開啟後，發布內容被點讚會獎勵積分',\r\n  '每次点赞奖励' => '每次點讚獎勵',\r\n  '每次发布内容被点赞奖励积分数' => '每次發布內容被點讚獎勵積分數',\r\n  '每天点赞最高奖励' => '每天點讚最高獎勵',\r\n  '开启后，发布内容被评论会奖励积分' => '開啟後，發布內容被評論會獎勵積分',\r\n  '每次评论奖励' => '每次評論獎勵',\r\n  '每次发布内容被评论奖励积分数' => '每次發布內容被評論獎勵積分數',\r\n  '每天评论最高奖励' => '每天評論最高獎勵',\r\n  '开启后，用户被粉丝关注会奖励积分' => '開啟後，用戶被粉絲關注會獎勵積分',\r\n  '每次关注奖励' => '每次關注獎勵',\r\n  '每次被关注奖励积分数' => '每次被關注獎勵積分數',\r\n  '每天关注最高奖励' => '每天關注最高獎勵',\r\n  '每天关注奖励不超过积分上限，设置0则无上限' => '每天關注獎勵不超過積分上限，設置0則無上限',\r\n  '发送邮件' => '發送郵件',\r\n  '是否开启邮件发送' => '是否開啟郵件發送',\r\n  '关闭网站' => '關閉網站',\r\n  '关闭网站后，前台无法访问，后台可以进入' => '關閉網站後，前台無法訪問，後台可以進入',\r\n  '关站提示' => '關站提示',\r\n  '后台文件存储路径' => '後台文件存儲路徑',\r\n  '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]' => '默認static/upload/{yyyy}/{mm}/{dd}，存儲路徑相對於根目錄，最後不能帶斜槓[ / ]',\r\n  '前台文件存储路径' => '前台文件存儲路徑',\r\n  '是否开启前台AJAX' => '是否開啟前台AJAX',\r\n  '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据' => '開啟後AJAX，前台可以通過欄目連結+ajax=1獲取JSON數據',\r\n  '自动生成sitemap' => '自動生成sitemap',\r\n  '开启后，前台访问每天会自动生成1次sitemap' => '開啟後，前台訪問每天會自動生成1次sitemap',\r\n  '是否开启邀请奖励' => '是否開啟邀請獎勵',\r\n  '开启邀请后则会奖励' => '開啟邀請後則會獎勵',\r\n  '邀请奖励类型' => '邀請獎勵類型',\r\n  '邀请奖励数量' => '邀請獎勵數量',\r\n  '网站手机' => '網站手機',\r\n  '站长微信' => '站長微信',\r\n  '开启多图描述' => '開啟多圖描述',\r\n  '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)' => '開啟後圖集每張圖可以添加描述，注意模板輸出需要更改輸出方式！(附件同理)',\r\n  '前台用户注册' => '前台用戶註冊',\r\n  '关闭前台注册后，前台无法进入注册页面' => '關閉前台註冊後，前台無法進入註冊頁面',\r\n  '仅邀请码注册' => '僅邀請碼註冊',\r\n  '开启后，必须通过邀请链接才能注册！' => '開啟後，必須通過邀請連結才能註冊！',\r\n  '允许前台发布模块' => '允許前台發布模塊',\r\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '防止數據泄露,填寫允許發布模塊標識,留空表示不允許發布,多個表可用|分割',\r\n  '前台搜索的字段' => '前台搜索的欄位',\r\n  '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '可以設置搜索表中的相關欄位進行模糊查詢,多個欄位可用|分割',\r\n  '前台验证码' => '前台驗證碼',\r\n  '关闭后，登录注册不需要验证码' => '關閉後，登錄註冊不需要驗證碼',\r\n  '后台验证码' => '後台驗證碼',\r\n  '关闭后，后台管理员登录不需要验证码' => '關閉後，後台管理員登錄不需要驗證碼',\r\n  'TAG包含模型' => 'TAG包含模型',\r\n  '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product' => '在tag列表上查詢的相關模型,多個模型標識可用|分割,如：article|product',\r\n  '支付配置' => '支付配置',\r\n  '前台多模块搜索的字段' => '前台多模塊搜索的欄位',\r\n  '多个模块直接必须都有相同的字段，否则会报错' => '多個模塊直接必須都有相同的欄位，否則會報錯',\r\n  '多模块允许搜索的表' => '多模塊允許搜索的表',\r\n  '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product' => '防止數據泄露,填寫允許搜索的表名,留空表示不允許搜索,多個表可用|分割,如：article|product',\r\n  '允许查询显示的字段' => '允許查詢顯示的欄位',\r\n  '多模块搜索允许查询显示的字段' => '多模塊搜索允許查詢顯示的欄位',\r\n  '前台编辑器设置' => '前台編輯器設置',\r\n  '前台的编辑器功能菜单设置' => '前台的編輯器功能菜單設置',\r\n  'PHP调试' => 'PHP調試',\r\n  '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。' => '測試環境，開啟調試，提示錯誤，實時更新模板。正式上線，請關閉調試，打開頁面更快。',\r\n  '前台SESSION' => '前台SESSION',\r\n  '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭' => '關閉前台SESSION後，前台會員模塊無法使用，但是可以減少session緩存文件。純內容網站可以開啟，使用會員支付等必須關閉',\r\n  '留言验证码' => '留言驗證碼',\r\n  '开启后，前台留言需要填写验证码' => '開啟後，前台留言需要填寫驗證碼',\r\n  '前台发布审核' => '前台發布審核',\r\n  '开启后需要后台审核，关闭则不需要' => '開啟後需要後台審核，關閉則不需要',\r\n  '公共权限' => '公共權限',\r\n  '前台网站' => '前台網站',\r\n  '会员登录' => '會員登錄',\r\n  '会员评论' => '會員評論',\r\n  '网站筛选' => '網站篩選',\r\n  '会员下单' => '會員下單',\r\n  '网站支付' => '網站支付',\r\n  '极致支付' => '極致支付',\r\n  '微信模块' => '微信模塊',\r\n  '验证码生成' => '驗證碼生成',\r\n  '检查是否登录' => '檢查是否登錄',\r\n  '多附件上传' => '多附件上傳',\r\n  '单附件上传' => '單附件上傳',\r\n  '二维码生成' => '二維碼生成',\r\n  '获取扩展信息' => '獲取擴展信息',\r\n  '链接错误提示' => '連結錯誤提示',\r\n  '报错提示' => '報錯提示',\r\n  '网站内容' => '網站內容',\r\n  '详情内容' => '詳情內容',\r\n  '网站搜索' => '網站搜索',\r\n  '网站多模块搜索' => '網站多模塊搜索',\r\n  '开启网站缓存' => '開啟網站緩存',\r\n  '输出缓存' => '輸出緩存',\r\n  '个人中心首页' => '個人中心首頁',\r\n  '会员资料' => '會員資料',\r\n  '订单记录' => '訂單記錄',\r\n  '订单支付' => '訂單支付',\r\n  '删除订单' => '刪除訂單',\r\n  '上传头像' => '上傳頭像',\r\n  '删除评论' => '刪除評論',\r\n  '点赞文章' => '點讚文章',\r\n  '点赞列表' => '點讚列表',\r\n  '收藏文章' => '收藏文章',\r\n  '收藏列表' => '收藏列表',\r\n  '删除收藏' => '刪除收藏',\r\n  '购物车' => '購物車',\r\n  '添加购物车' => '添加購物車',\r\n  '删除购物车' => '刪除購物車',\r\n  '发布管理' => '發布管理',\r\n  '会员发布' => '會員發布',\r\n  '删除发布' => '刪除發布',\r\n  '会员上传附件' => '會員上傳附件',\r\n  '404提示' => '404提示',\r\n  '关注用户' => '關注用戶',\r\n  '取消关注' => '取消關注',\r\n  '粉丝列表' => '粉絲列表',\r\n  '消息提醒' => '消息提醒',\r\n  '查看消息' => '查看消息',\r\n  '删除消息' => '刪除消息',\r\n  '公共主页' => '公共主頁',\r\n  '消息提醒设置' => '消息提醒設置',\r\n  '获取栏目列表' => '獲取欄目列表',\r\n  '用户钱包' => '用戶錢包',\r\n  '交易详情' => '交易詳情',\r\n  '登录首页' => '登錄首頁',\r\n  '注册页面' => '註冊頁面',\r\n  '忘记密码' => '忘記密碼',\r\n  '未登录页面' => '未登錄頁面',\r\n  '退出登录' => '退出登錄',\r\n  '发送留言' => '發送留言',\r\n  '发表评论' => '發表評論',\r\n  '筛选列表' => '篩選列表',\r\n  '创建订单' => '創建訂單',\r\n  'TAG标签列表' => 'TAG標籤列表',\r\n  '会员' => '會員',\r\n  '订单' => '訂單',\r\n  '评论' => '評論',\r\n  '留言' => '留言',\r\n  '轮播图' => '輪播圖',\r\n  '友情链接' => '友情連結',\r\n  'TAG' => 'TAG',\r\n  '单页' => '單頁',\r\n  '用户评价' => '用戶評價',\r\n  '添加会员' => '添加會員',\r\n  '修改会员' => '修改會員',\r\n  '删除会员' => '刪除會員',\r\n  '修改状态' => '修改狀態',\r\n  '内容管理' => '內容管理',\r\n  '内容列表' => '內容列表',\r\n  '添加内容' => '添加內容',\r\n  '修改内容' => '修改內容',\r\n  '删除内容' => '刪除內容',\r\n  '复制内容' => '複製內容',\r\n  '修改评论' => '修改評論',\r\n  '修改留言' => '修改留言',\r\n  '删除留言' => '刪除留言',\r\n  '字段列表' => '欄位列表',\r\n  '删除字段' => '刪除欄位',\r\n  '获取字段' => '獲取欄位',\r\n  '基本功能' => '基本功能',\r\n  '系统界面' => '系統界面',\r\n  '数据库备份' => '資料庫備份',\r\n  '数据库还原' => '資料庫還原',\r\n  '数据库删除' => '資料庫刪除',\r\n  '系统功能' => '系統功能',\r\n  '栏目管理' => '欄目管理',\r\n  '栏目列表' => '欄目列表',\r\n  '新增栏目' => '新增欄目',\r\n  '修改栏目' => '修改欄目',\r\n  '删除栏目' => '刪除欄目',\r\n  '修改排序' => '修改排序',\r\n  '栏目隐藏' => '欄目隱藏',\r\n  '新增角色' => '新增角色',\r\n  '修改角色' => '修改角色',\r\n  '删除角色' => '刪除角色',\r\n  '角色状态' => '角色狀態',\r\n  '新增管理员' => '新增管理員',\r\n  '修改管理员' => '修改管理員',\r\n  '管理员状态' => '管理員狀態',\r\n  '删除管理员' => '刪除管理員',\r\n  '模型列表' => '模型列表',\r\n  '删除模型' => '刪除模型',\r\n  '新增权限' => '新增權限',\r\n  '修改权限' => '修改權限',\r\n  '删除权限' => '刪除權限',\r\n  '桌面设置' => '桌面設置',\r\n  '新增桌面' => '新增桌面',\r\n  '修改桌面' => '修改桌面',\r\n  '删除桌面' => '刪除桌面',\r\n  '图标库' => '圖標庫',\r\n  '模块扩展' => '模塊擴展',\r\n  '删除轮播图' => '刪除輪播圖',\r\n  '复制轮播图' => '複製輪播圖',\r\n  '批量删除轮播图' => '批量刪除輪播圖',\r\n  '新增轮播图分类' => '新增輪播圖分類',\r\n  '修改轮播图分类' => '修改輪播圖分類',\r\n  '删除轮播图分类' => '刪除輪播圖分類',\r\n  '新增友链' => '新增友鏈',\r\n  '修改友链' => '修改友鏈',\r\n  '复制友链' => '複製友鏈',\r\n  '删除友链' => '刪除友鏈',\r\n  '批量删除友链' => '批量刪除友鏈',\r\n  '通用模块' => '通用模塊',\r\n  '更新cookie' => '更新cookie',\r\n  '商品管理' => '商品管理',\r\n  '商品列表' => '商品列表',\r\n  '修改商品' => '修改商品',\r\n  '删除商品' => '刪除商品',\r\n  '复制商品' => '複製商品',\r\n  '登录日志' => '登錄日誌',\r\n  '新增分组' => '新增分組',\r\n  '修改分组' => '修改分組',\r\n  '更改分组状态' => '更改分組狀態',\r\n  '删除分组' => '刪除分組',\r\n  '会员权限' => '會員權限',\r\n  '修改分组排序' => '修改分組排序',\r\n  '上传支付证书' => '上傳支付證書',\r\n  '更改状态' => '更改狀態',\r\n  '安装卸载' => '安裝卸載',\r\n  '删除图库图片' => '刪除圖庫圖片',\r\n  '批量删除图库' => '批量刪除圖庫',\r\n  '微信公众号' => '微信公眾號',\r\n  '公众号菜单' => '公眾號菜單',\r\n  '公众号素材' => '公眾號素材',\r\n  '模板制作' => '模板製作',\r\n  '获取首字母拼音' => '獲取首字母拼音',\r\n  '批量新增栏目' => '批量新增欄目',\r\n  '自定义配置删除' => '自定義配置刪除',\r\n  'TAG列表' => 'TAG列表',\r\n  '新增TAG' => '新增TAG',\r\n  '修改TAG' => '修改TAG',\r\n  '复制TAG' => '複製TAG',\r\n  '删除TAG' => '刪除TAG',\r\n  '批量删除TAG' => '批量刪除TAG',\r\n  '生成静态文件' => '生成靜態文件',\r\n  '更新栏目HTML' => '更新欄目HTML',\r\n  '更新模块HTML' => '更新模塊HTML',\r\n  '批量修改推荐属性' => '批量修改推薦屬性',\r\n  '批量修改友链栏目' => '批量修改友鏈欄目',\r\n  '批量修改TAG栏目' => '批量修改TAG欄目',\r\n  '批量复制友链' => '批量複製友鏈',\r\n  '批量复制TAG' => '批量複製TAG',\r\n  '批量修改友链排序' => '批量修改友鏈排序',\r\n  '批量修改TAG排序' => '批量修改TAG排序',\r\n  '高级设置' => '高級設置',\r\n  '邮箱订单' => '郵箱訂單',\r\n  '公众号配置' => '公眾號配置',\r\n  '批量审核友链' => '批量審核友鏈',\r\n  '批量审核TAG' => '批量審核TAG',\r\n  '手动充值' => '手動充值',\r\n  '删除记录' => '刪除記錄',\r\n  '批量删除记录' => '批量刪除記錄',\r\n  '积分配置' => '積分配置',\r\n  '插件更新' => '插件更新',\r\n  '获取栏目模板' => '獲取欄目模板',\r\n  '友链分类' => '友鏈分類',\r\n  '新增友链分类' => '新增友鏈分類',\r\n  '修改友链分类' => '修改友鏈分類',\r\n  '删除友链分类' => '刪除友鏈分類',\r\n  '导航设置' => '導航設置',\r\n  '删除导航' => '刪除導航',\r\n  '碎片化' => '碎片化',\r\n  '删除碎片' => '刪除碎片',\r\n  '预览SQL' => '預覽SQL',\r\n  '搜索配置' => '搜索配置',\r\n  '修改字段属性' => '修改欄位屬性',\r\n  '新增推荐属性' => '新增推薦屬性',\r\n  '删除推荐属性' => '刪除推薦屬性',\r\n  '列表设置' => '列表設置',\r\n  '获取列表字段' => '獲取列表欄位',\r\n  '内链模块' => '內鏈模塊',\r\n  '内链列表' => '內鏈列表',\r\n  '新增内链' => '新增內鏈',\r\n  '删除内链' => '刪除內鏈',\r\n  '删除数据' => '刪除數據',\r\n  '模板更新' => '模板更新',\r\n  '用户评价列表' => '用戶評價列表',\r\n  '新增用户评价' => '新增用戶評價',\r\n  '修改用户评价' => '修改用戶評價',\r\n  '复制用户评价' => '複製用戶評價',\r\n  '删除用户评价' => '刪除用戶評價',\r\n  '批量删除用户评价' => '批量刪除用戶評價',\r\n  '批量修改用户评价栏目' => '批量修改用戶評價欄目',\r\n  '批量复制用户评价' => '批量複製用戶評價',\r\n  '批量修改用户评价列表' => '批量修改用戶評價列表',\r\n  '批量审核用户评价' => '批量審核用戶評價',\r\n  '基本设置' => '基本設置',\r\n  '邮件订单' => '郵件訂單',\r\n  '非超级管理员无法设置！' => '非超級管理員無法設定！',\r\n    '你确定要还原吗？' => '你確定要還原嗎？',\r\n); ?>"
  },
  {
    "path": "app/home/lang/common.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/09/10\n// +----------------------------------------------------------------------\n\n\n/**\n\t\n\t公共语言包\n\t\n\t如果系统有多个语言包，但是有些部分是一样的、重复的，可以放到这里存放，减少重复内容\n\t如果当前语言包里有同个字符，但是内容不同，公共语言包里的内容将被覆盖\n\n**/\n\nreturn [\n\t'JIZHI' => '极致CMS',\n\t\n];"
  },
  {
    "path": "app/home/lang/zh.php",
    "content": "<?php return array (\r\n  '该角色下存在用户，请先移除用户再删除！' => '该角色下存在用户，请先移除用户再删除！',\r\n  '删除失败，该分组不允许删除！' => '删除失败，该分组不允许删除！',\r\n  '删除成功！' => '删除成功！',\r\n  '删除失败，请重试！' => '删除失败，请重试！',\r\n  '非法操作！' => '非法操作！',\r\n  '修改失败，您的权限不足！' => '修改失败，您的权限不足！',\r\n  '修改成功！' => '修改成功！',\r\n  '修改失败，请重新提交！' => '修改失败，请重新提交！',\r\n  '没有该角色！' => '没有该角色！',\r\n  '新增成功！' => '新增成功！',\r\n  '新增失败，请重新提交！' => '新增失败，请重新提交！',\r\n  '修改失败，该分组不允许修改！' => '修改失败，该分组不允许修改！',\r\n  '您没有权限操作！' => '您没有权限操作！',\r\n  '两次密码不同！' => '两次密码不同！',\r\n  '手机号已被注册！' => '手机号已被注册！',\r\n  '昵称已被使用！' => '昵称已被使用！',\r\n  '邮箱已被使用！' => '邮箱已被使用！',\r\n  '修改失败！' => '修改失败！',\r\n  '新增失败！' => '新增失败！',\r\n  '系统管理员不能删除！' => '系统管理员不能删除！',\r\n  '删除失败！' => '删除失败！',\r\n  '批量操作失败！' => '批量操作失败！',\r\n  '批量删除成功！' => '批量删除成功！',\r\n  '添加失败' => '添加失败',\r\n  '存在敏感词' => '存在敏感词',\r\n  '已存在相同的自定义URL！' => '已存在相同的自定义URL！',\r\n  '添加成功,继续添加~' => '添加成功,继续添加~',\r\n  '内容配置' => '内容配置',\r\n  '修改失败' => '修改失败',\r\n  '发布奖励' => '发布奖励',\r\n  '您未做任何修改，不能提交！' => '您未做任何修改，不能提交！',\r\n  '复制成功！' => '复制成功！',\r\n  '复制失败！' => '复制失败！',\r\n  '批量复制成功！' => '批量复制成功！',\r\n  '批量修改成功！' => '批量修改成功！',\r\n  '批量操作成功！' => '批量操作成功！',\r\n  'URL链接命名不能是' => 'URL链接命名不能是',\r\n  '非法URL' => '非法URL',\r\n  '添加栏目成功，继续添加~' => '添加栏目成功，继续添加~',\r\n  '模型错误！' => '模型错误！',\r\n  '不能选择当前栏目及下级为顶级栏目' => '不能选择当前栏目及下级为顶级栏目',\r\n  '该栏目有子栏目，请先删除子栏目！' => '该栏目有子栏目，请先删除子栏目！',\r\n  '栏目不能为空！' => '栏目不能为空！',\r\n  '操作成功！' => '操作成功！',\r\n  '请选择分类！' => '请选择分类！',\r\n  '添加成功！继续添加~' => '添加成功！继续添加~',\r\n  '添加失败！' => '添加失败！',\r\n  '该分类下存在内容，请先删除该分类下的内容！' => '该分类下存在内容，请先删除该分类下的内容！',\r\n  '添加成功！' => '添加成功！',\r\n  '已审核' => '已审核',\r\n  '被删除' => '被删除',\r\n  '未审核' => '未审核',\r\n  '已读' => '已读',\r\n  '未读' => '未读',\r\n  '批量审核成功！' => '批量审核成功！',\r\n  '批量审核失败！' => '批量审核失败！',\r\n  '您没有权限！' => '您没有权限！',\r\n  '文件类型不允许上传！' => '文件类型不允许上传！',\r\n  '文件大小超过网站内部限制！' => '文件大小超过网站内部限制！',\r\n  '请检查目录写入权限' => '请检查目录写入权限',\r\n  '错误信息提示' => '错误信息提示',\r\n  '模块为空，请选择模块！' => '模块为空，请选择模块！',\r\n  '缺少ID' => '缺少ID',\r\n  '请选择模块！' => '请选择模块！',\r\n  '显示' => '显示',\r\n  '隐藏' => '隐藏',\r\n  '是' => '是',\r\n  '否' => '否',\r\n  '单行文本' => '单行文本',\r\n  '多行文本' => '多行文本',\r\n  '文本编辑器' => '文本编辑器',\r\n  '数字' => '数字',\r\n  '单图片' => '单图片',\r\n  '多图片' => '多图片',\r\n  '单选下拉' => '单选下拉',\r\n  '多选' => '多选',\r\n  '单附件' => '单附件',\r\n  '多附件' => '多附件',\r\n  '时间戳' => '时间戳',\r\n  '单选按钮' => '单选按钮',\r\n  '单选关联' => '单选关联',\r\n  '小数' => '小数',\r\n  '多行录入' => '多行录入',\r\n  '多选关联' => '多选关联',\r\n  '栏目' => '栏目',\r\n  '副栏目' => '副栏目',\r\n  '系统TAG' => '系统TAG',\r\n  '字段名和字段标识不能为空！' => '字段名和字段标识不能为空！',\r\n  '字段标识已存在！' => '字段标识已存在！',\r\n  '系统保护字段，不允许创建！' => '系统保护字段，不允许创建！',\r\n  '字段长度不对！' => '字段长度不对！',\r\n  '字段长度不对,时间属性必须长度为11' => '字段长度不对,时间属性必须长度为11',\r\n  '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '字段长度不对,decimal字段长度格式[整数位数,小数位数]',\r\n  '字段创建成功，但是字段表记录失败，请反馈官方解决！' => '字段创建成功，但是字段表记录失败，请反馈官方解决！',\r\n  '字段创建成功！' => '字段创建成功！',\r\n  '字段修改成功！' => '字段修改成功！',\r\n  '字段修改失败！' => '字段修改失败！',\r\n  '上传图片' => '上传图片',\r\n  '选择图片' => '选择图片',\r\n  '图片未找到' => '图片未找到',\r\n  '删除这张图片' => '删除这张图片',\r\n  '删除' => '删除',\r\n  '上传异常！' => '上传异常！',\r\n  '文字描述' => '文字描述',\r\n  '左移' => '左移',\r\n  '右移' => '右移',\r\n  '请选择' => '请选择',\r\n  '上传附件' => '上传附件',\r\n  '字段关联绑定失败，请重新绑定！' => '字段关联绑定失败，请重新绑定！',\r\n  '请选择关联项' => '请选择关联项',\r\n  'TAG标签' => 'TAG标签',\r\n  '按Enter回车自动添加' => '按Enter回车自动添加',\r\n  '添加一个标签' => '添加一个标签',\r\n  '系统字段不允许删除！' => '系统字段不允许删除！',\r\n  '请选择字段！' => '请选择字段！',\r\n  '请选择栏目！' => '请选择栏目！',\r\n  '参数有误！' => '参数有误！',\r\n  '请选择桌面配置！' => '请选择桌面配置！',\r\n  '系统默认不可删除！' => '系统默认不可删除！',\r\n  '网站地图创建成功！' => '网站地图创建成功！',\r\n  '网站地图创建失败，请检查根目录权限！' => '网站地图创建失败，请检查根目录权限！',\r\n  '清除失败！' => '清除失败！',\r\n  '清除成功！' => '清除成功！',\r\n  '生成失败！' => '生成失败！',\r\n  '生成成功！' => '生成成功！',\r\n  '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~' => '已清理一部分页面，请不要关闭当前页面，还需要继续清理HTML~',\r\n  '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~' => '已生成一部分页面，请不要关闭当前页面，还需要继续生成HTML~',\r\n  '静态HTML页面已全部清理完毕！' => '静态HTML页面已全部清理完毕！',\r\n  '总共清理页面数：' => '总共清理页面数：',\r\n  '每次清理页面数：' => '每次清理页面数：',\r\n  '停顿时间：' => '停顿时间：',\r\n  '开始时间：' => '开始时间：',\r\n  '结束时间：' => '结束时间：',\r\n  '总共花费时间：' => '总共花费时间：',\r\n  '总共生成页面数：' => '总共生成页面数：',\r\n  '每次生成页面数：' => '每次生成页面数：',\r\n  '系统创建目录失败!' => '系统创建目录失败!',\r\n  '模块未绑定栏目，无法生存HTML！' => '模块未绑定栏目，无法生存HTML！',\r\n  '链接错误！' => '链接错误！',\r\n  '请输入属性名称！' => '请输入属性名称！',\r\n  '属性已存在！' => '属性已存在！',\r\n  '参数错误！' => '参数错误！',\r\n  '系统属性只允许修改和隐藏，不允许删除！' => '系统属性只允许修改和隐藏，不允许删除！',\r\n  '请输入内链词！' => '请输入内链词！',\r\n  '请输入内链！' => '请输入内链！',\r\n  '内链词已存在！' => '内链词已存在！',\r\n  '已审' => '已审',\r\n  '退回' => '退回',\r\n  '未审' => '未审',\r\n  '账户密码不能为空！' => '账户密码不能为空！',\r\n  '验证码错误！' => '验证码错误！',\r\n  '该账户已被封禁！' => '该账户已被封禁！',\r\n  '登录成功！' => '登录成功！',\r\n  '账户密码错误！' => '账户密码错误！',\r\n  '安全退出~' => '安全退出~',\r\n  '无' => '无',\r\n  '不显示' => '不显示',\r\n  '邮箱已被注册！' => '邮箱已被注册！',\r\n  '添加失败，请重新提交！' => '添加失败，请重新提交！',\r\n  '没有找到该用户！' => '没有找到该用户！',\r\n  '该分组下存在用户，请先移除用户再删除！' => '该分组下存在用户，请先移除用户再删除！',\r\n  '删除失败，该分类有下级功能，请先删除下级功能！' => '删除失败，该分类有下级功能，请先删除下级功能！',\r\n  '未选择删除对象！' => '未选择删除对象！',\r\n  '模块名和标识不能为空！' => '模块名和标识不能为空！',\r\n  '模型已添加不能重复添加！' => '模型已添加不能重复添加！',\r\n  '该表已存在！' => '该表已存在！',\r\n  '标题' => '标题',\r\n  '默认为空' => '默认为空',\r\n  '所属栏目' => '所属栏目',\r\n  '选择栏目' => '选择栏目',\r\n  '绑定后可以在当前模型的其他栏目中显示' => '绑定后可以在当前模型的其他栏目中显示',\r\n  '关键词' => '关键词',\r\n  '每个词用英文逗号(,)拼接' => '每个词用英文逗号(,)拼接',\r\n  '缩略图' => '缩略图',\r\n  '可留空' => '可留空',\r\n  '简介' => '简介',\r\n  '内容' => '内容',\r\n  '发布会员' => '发布会员',\r\n  '前台发布会员ID记录' => '前台发布会员ID记录',\r\n  '管理员' => '管理员',\r\n  '后台发布管理员ID记录' => '后台发布管理员ID记录',\r\n  '外链URL' => '外链URL',\r\n  '默认为空，系统访问内容则直接跳转到此链接' => '默认为空，系统访问内容则直接跳转到此链接',\r\n  '自定义URL' => '自定义URL',\r\n  '默认为空，自定义URL' => '默认为空，自定义URL',\r\n  '点击量' => '点击量',\r\n  '系统自动添加' => '系统自动添加',\r\n  '评论数' => '评论数',\r\n  '系统自带' => '系统自带',\r\n  '点赞数' => '点赞数',\r\n  '排序' => '排序',\r\n  '添加时间' => '添加时间',\r\n  '选择时间' => '选择时间',\r\n  '推荐属性' => '推荐属性',\r\n  '1置顶2热点3推荐' => '1置顶2热点3推荐',\r\n  '置顶=1,热点=2,推荐=3' => '置顶=1,热点=2,推荐=3',\r\n  '是否显示' => '是否显示',\r\n  '显示隐藏' => '显示隐藏',\r\n  '显示=1,未审=0,退回=2' => '显示=1,未审=0,退回=2',\r\n  '列表' => '列表',\r\n  '新增' => '新增',\r\n  '修改' => '修改',\r\n  '复制' => '复制',\r\n  '批量删除' => '批量删除',\r\n  '批量修改' => '批量修改',\r\n  '批量复制' => '批量复制',\r\n  '批量审核' => '批量审核',\r\n  '管理' => '管理',\r\n  '新增模型成功，快去创建对应的栏目吧！' => '新增模型成功，快去创建对应的栏目吧！',\r\n  '新增模型成功，快去设置表字段吧！' => '新增模型成功，快去设置表字段吧！',\r\n  '新增模型失败！' => '新增模型失败！',\r\n  '标识不能为空！' => '标识不能为空！',\r\n  '系统模型标识不允许修改！' => '系统模型标识不允许修改！',\r\n  '页面有错误，缺少模块ID！' => '页面有错误，缺少模块ID！',\r\n  '里面存在数据，请先清空表内数据！' => '里面存在数据，请先清空表内数据！',\r\n  '是系统模型，不允许删除！' => '是系统模型，不允许删除！',\r\n  '字段表记录未清除，请手动清除！' => '字段表记录未清除，请手动清除！',\r\n  '模型' => '模型',\r\n  '用户' => '用户',\r\n  '栏目链接' => '栏目链接',\r\n  '外链' => '外链',\r\n  '自定义链接' => '自定义链接',\r\n  '发布时间' => '发布时间',\r\n  '字段名称不能为空！' => '字段名称不能为空！',\r\n  '显示=1,隐藏=0' => '显示=1,隐藏=0',\r\n  '显示=1,隐藏=0,退回=2' => '显示=1,隐藏=0,退回=2',\r\n  '是=1,否=0' => '是=1,否=0',\r\n  '重构成功！' => '重构成功！',\r\n  '系统栏目' => '系统栏目',\r\n  '系统副栏目' => '系统副栏目',\r\n  '模型标识' => '模型标识',\r\n  '发布管理员' => '发布管理员',\r\n  '前台用户' => '前台用户',\r\n  '待付款' => '待付款',\r\n  '已付' => '已付',\r\n  '超时' => '超时',\r\n  '待审核待支付' => '待审核待支付',\r\n  '已发货' => '已发货',\r\n  '已废弃' => '已废弃',\r\n  '未付' => '未付',\r\n  '您的订单发货通知' => '您的订单发货通知',\r\n  '尊敬的' => '尊敬的',\r\n  '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！' => '您的订单已发货了，这几天请您留意一下快递，谢谢您的惠顾！期待再次为您服务！',\r\n  '订单详细信息如下：' => '订单详细信息如下：',\r\n  '主图' => '主图',\r\n  '价格' => '价格',\r\n  '购买数量' => '购买数量',\r\n  '总价' => '总价',\r\n  '折扣：' => '折扣：',\r\n  '元' => '元',\r\n  '运费：' => '运费：',\r\n  '￥' => '￥',\r\n  '合计：' => '合计：',\r\n  '收件地址：' => '收件地址：',\r\n  '联系电话：' => '联系电话：',\r\n  '钱包' => '钱包',\r\n  '积分' => '积分',\r\n  '充值' => '充值',\r\n  '兑换' => '兑换',\r\n  '奖励' => '奖励',\r\n  '该用户不存在！' => '该用户不存在！',\r\n  '充值数量不对！' => '充值数量不对！',\r\n  '操作失败！' => '操作失败！',\r\n  '插件配置' => '插件配置',\r\n  '未分类' => '未分类',\r\n  '商品配置' => '商品配置',\r\n  '批量复制失败！' => '批量复制失败！',\r\n  '部分未执行成功！' => '部分未执行成功！',\r\n  '还原失败，可能是ID已经存在！' => '还原失败，可能是ID已经存在！',\r\n  '数据不存在！' => '数据不存在！',\r\n  '删除失败，系统功能不能删除！' => '删除失败，系统功能不能删除！',\r\n  '配置栏下有自定义配置，无法删除配置栏' => '配置栏下有自定义配置，无法删除配置栏',\r\n  '已存在配置标识，请重新设置！' => '已存在配置标识，请重新设置！',\r\n  '提交成功！' => '提交成功！',\r\n  '删除失败！系统字段不允许删除！' => '删除失败！系统字段不允许删除！',\r\n  '图片不存在，删除失败！' => '图片不存在，删除失败！',\r\n  '远程存储图片无法删除！' => '远程存储图片无法删除！',\r\n  '图片ID错误！' => '图片ID错误！',\r\n  '部分删除成功，存在远程链接无法删除！' => '部分删除成功，存在远程链接无法删除！',\r\n  '非法操作' => '非法操作',\r\n  '请检查目录' => '请检查目录',\r\n  '写入权限' => '写入权限',\r\n  '配置成功！' => '配置成功！',\r\n  '参数存在安全隐患！' => '参数存在安全隐患！',\r\n  '参数错误,必须携带插件ID！' => '参数错误,必须携带插件ID！',\r\n  '发生错误' => '发生错误',\r\n  '下载缓存文件不存在！' => '下载缓存文件不存在！',\r\n  '请选择使用场景！' => '请选择使用场景！',\r\n  '执行插件安装程序失败！' => '执行插件安装程序失败！',\r\n  '安装成功！' => '安装成功！',\r\n  '备份成功！' => '备份成功！',\r\n  '该插件暂无更新！' => '该插件暂无更新！',\r\n  '参数错误,请选择对应模板！' => '参数错误,请选择对应模板！',\r\n  '文件不存在！' => '文件不存在！',\r\n  '解压失败！' => '解压失败！',\r\n  '数据库中没有表!' => '数据库中没有表!',\r\n  '写入文件失败！' => '写入文件失败！',\r\n  ' 写入文件失败！' => ' 写入文件失败！',\r\n  '解压完毕！本次解压花费' => '解压完毕！本次解压花费',\r\n  '秒' => '秒',\r\n  '更新成功！' => '更新成功！',\r\n  '个人中心' => '个人中心',\r\n  '测试1' => '测试1',\r\n  '测试2' => '测试2',\r\n  '测试3' => '测试3',\r\n  '接口报错' => '接口报错',\r\n  '微信配置错误！' => '微信配置错误！',\r\n  '网站首页' => '网站首页',\r\n  '首页' => '首页',\r\n  '碎片化管理' => '碎片化管理',\r\n  '新增碎片' => '新增碎片',\r\n  '刷新' => '刷新',\r\n  '基本信息' => '基本信息',\r\n  '使用说明' => '使用说明',\r\n  '指定几个id或者几个tid的内容输出' => '指定几个id或者几个tid的内容输出',\r\n  'SQL中输入' => 'SQL中输入',\r\n  '或者' => '或者',\r\n  '模糊查询，查询标题跟 “网站建设” 相关的内容' => '模糊查询，查询标题跟 “网站建设” 相关的内容',\r\n  '网站建设' => '网站建设',\r\n  '模糊查询，查询标题/内容跟 “网站建设” 相关的内容' => '模糊查询，查询标题/内容跟 “网站建设” 相关的内容',\r\n  '不支持联表查询' => '不支持联表查询',\r\n  '注意字符串都要使用英文单引号' => '注意字符串都要使用英文单引号',\r\n  '如' => '如',\r\n  '碎片名称' => '碎片名称',\r\n  '碎片标识' => '碎片标识',\r\n  '建议英文，不要重复' => '建议英文，不要重复',\r\n  '不限栏目' => '不限栏目',\r\n  '子栏目包含' => '子栏目包含',\r\n  '包含' => '包含',\r\n  '不包含' => '不包含',\r\n  '输出条数' => '输出条数',\r\n  '0表示输出所有' => '0表示输出所有',\r\n  '更新周期' => '更新周期',\r\n  '单位' => '单位',\r\n  '分钟' => '分钟',\r\n  '保存' => '保存',\r\n  '返回' => '返回',\r\n  '确定' => '确定',\r\n  '导航管理' => '导航管理',\r\n  '新增导航' => '新增导航',\r\n  '导航名称' => '导航名称',\r\n  '导航菜单' => '导航菜单',\r\n  '链接' => '链接',\r\n  '打开' => '打开',\r\n  '操作' => '操作',\r\n  '不填默认栏目名称' => '不填默认栏目名称',\r\n  '自定义链接则需要填写' => '自定义链接则需要填写',\r\n  '本页面' => '本页面',\r\n  '新页面' => '新页面',\r\n  '管理员管理' => '管理员管理',\r\n  '新增管理员信息' => '新增管理员信息',\r\n  '基本' => '基本',\r\n  '扩展' => '扩展',\r\n  '登录名' => '登录名',\r\n  '将会成为您唯一的登入名' => '将会成为您唯一的登入名',\r\n  '手机' => '手机',\r\n  '邮箱' => '邮箱',\r\n  '角色' => '角色',\r\n  '选择角色' => '选择角色',\r\n  '密码' => '密码',\r\n  '6到16个字符,不改请留空' => '6到16个字符,不改请留空',\r\n  '确认密码' => '确认密码',\r\n  '状态' => '状态',\r\n  '正常' => '正常',\r\n  '禁用' => '禁用',\r\n  '增加成功' => '增加成功',\r\n  '修改管理员信息' => '修改管理员信息',\r\n  '管理员列表' => '管理员列表',\r\n  '搜索' => '搜索',\r\n  '是否封禁' => '是否封禁',\r\n  '封禁' => '封禁',\r\n  '开始日' => '开始日',\r\n  '截止日' => '截止日',\r\n  '请输入用户名' => '请输入用户名',\r\n  '编辑' => '编辑',\r\n  '添加管理员' => '添加管理员',\r\n  '正常|封禁' => '正常|封禁',\r\n  '所属角色' => '所属角色',\r\n  '登录时间' => '登录时间',\r\n  '注册时间' => '注册时间',\r\n  '确认要删除吗？' => '确认要删除吗？',\r\n  '请选择对象！' => '请选择对象！',\r\n  '批量删除成功' => '批量删除成功',\r\n  '个人信息' => '个人信息',\r\n  '基础' => '基础',\r\n  '设置' => '设置',\r\n  '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！' => '填写内容时，请先选择栏目，否则切换栏目后，数据会丢失！',\r\n  '恢复数据' => '恢复数据',\r\n  '此规则配置仅在不填留空的情况下才会触发' => '此规则配置仅在不填留空的情况下才会触发',\r\n  'SEO标题' => 'SEO标题',\r\n  '等于内容标题' => '等于内容标题',\r\n  '不填则留空' => '不填则留空',\r\n  '缩略图规则' => '缩略图规则',\r\n  '自动获取内容第一张图片' => '自动获取内容第一张图片',\r\n  '不自动获取' => '不自动获取',\r\n  '简介规则' => '简介规则',\r\n  '自动获取内容前200字符' => '自动获取内容前200字符',\r\n  'TAG规则' => 'TAG规则',\r\n  '同步关键词' => '同步关键词',\r\n  '不同步关键词' => '不同步关键词',\r\n  '敏感词过滤字段' => '敏感词过滤字段',\r\n  '需要过滤敏感词在系统配置中进行设置' => '需要过滤敏感词在系统配置中进行设置',\r\n  '请输入需要过滤的字段' => '请输入需要过滤的字段',\r\n  '返回列表' => '返回列表',\r\n  '取消' => '取消',\r\n  '预览' => '预览',\r\n  '批量修改栏目' => '批量修改栏目',\r\n  '修改推荐属性' => '修改推荐属性',\r\n  '审核' => '审核',\r\n  '列表字段设置' => '列表字段设置',\r\n  '顶' => '顶',\r\n  '热' => '热',\r\n  '荐' => '荐',\r\n  '请选择修改栏目！' => '请选择修改栏目！',\r\n  '确认要批量修改内容分类吗？' => '确认要批量修改内容分类吗？',\r\n  '批量修改成功' => '批量修改成功',\r\n  '请选择修改属性！' => '请选择修改属性！',\r\n  '请选择修改对象！' => '请选择修改对象！',\r\n  '请选择审核选项！' => '请选择审核选项！',\r\n  '请选择审核对象！' => '请选择审核对象！',\r\n  '确认要批量处理吗？' => '确认要批量处理吗？',\r\n  '批量审核成功' => '批量审核成功',\r\n  '确认要复制吗？' => '确认要复制吗？',\r\n  '批量复制成功' => '批量复制成功',\r\n  '添加属性' => '添加属性',\r\n  '名称' => '名称',\r\n  '修改属性' => '修改属性',\r\n  '新增属性' => '新增属性',\r\n  '系统设置' => '系统设置',\r\n  '数据库管理' => '数据库管理',\r\n  '备份数据库' => '备份数据库',\r\n  '备份数：' => '备份数：',\r\n  '数据库备份名' => '数据库备份名',\r\n  '大小' => '大小',\r\n  '备份副本' => '备份副本',\r\n  '还原数据' => '还原数据',\r\n  '删除备份' => '删除备份',\r\n  '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？' => '还原数据库将覆盖现有的数据库，您确认要还原数据库吗？',\r\n  '您确定要删除备份数据库吗？删除后将不可找回！' => '您确定要删除备份数据库吗？删除后将不可找回！',\r\n  '数据缓存' => '数据缓存',\r\n  '文件夹cache/data，主要是网站内容缓存，栏目，详情页等' => '文件夹cache/data，主要是网站内容缓存，栏目，详情页等',\r\n  '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空' => '文件夹cache/tmp，主要是服务器session文件缓存，当前session将不会被清空',\r\n  '日志缓存' => '日志缓存',\r\n  '文件夹cache/log，包括错误日志、支付日志、登录日志等' => '文件夹cache/log，包括错误日志、支付日志、登录日志等',\r\n  '模板缓存' => '模板缓存',\r\n  '文件夹cache，主要是程序执行时生成的模板编译文件' => '文件夹cache，主要是程序执行时生成的模板编译文件',\r\n  '缩略图缓存' => '缩略图缓存',\r\n  '文件夹image，主要是程序执行时生成的自定义缩略图' => '文件夹image，主要是程序执行时生成的自定义缩略图',\r\n  '立即清空' => '立即清空',\r\n  '请选择清空目标！' => '请选择清空目标！',\r\n  '清理成功！' => '清理成功！',\r\n  '内链管理' => '内链管理',\r\n  '添加内链' => '添加内链',\r\n  '内链词' => '内链词',\r\n  '内链' => '内链',\r\n  '替换词' => '替换词',\r\n  '替换次数' => '替换次数',\r\n  '替换词，可为空！' => '替换词，可为空！',\r\n  '请填写内链' => '请填写内链',\r\n  '替换次数，默认-1，替换全部，可不写。' => '替换次数，默认-1，替换全部，可不写。',\r\n  '提交' => '提交',\r\n  '修改内链' => '修改内链',\r\n  '内链词和内链不能为空！' => '内链词和内链不能为空！',\r\n  '充值类型' => '充值类型',\r\n  '当前兑换率：' => '当前兑换率：',\r\n  '兑换率指1元相当于多少钱包/积分' => '兑换率指1元相当于多少钱包/积分',\r\n  '交易类型' => '交易类型',\r\n  '赠送' => '赠送',\r\n  '充值数量' => '充值数量',\r\n  '用户ID' => '用户ID',\r\n  '备注' => '备注',\r\n  '添加' => '添加',\r\n  '充值管理' => '充值管理',\r\n  '充值列表' => '充值列表',\r\n  '选择交易类型' => '选择交易类型',\r\n  '买入' => '买入',\r\n  '选择交易种类' => '选择交易种类',\r\n  '请输入前台用户手机号' => '请输入前台用户手机号',\r\n  '请输入用户昵称' => '请输入用户昵称',\r\n  '请输入订单号' => '请输入订单号',\r\n  '会员充值' => '会员充值',\r\n  '总订单' => '总订单',\r\n  '已充值' => '已充值',\r\n  '已兑换' => '已兑换',\r\n  '总赠送' => '总赠送',\r\n  '尾页' => '尾页',\r\n  '订单号' => '订单号',\r\n  '类型' => '类型',\r\n  '交易' => '交易',\r\n  '用户名' => '用户名',\r\n  '数量' => '数量',\r\n  '金额' => '金额',\r\n  '时间' => '时间',\r\n  '查看' => '查看',\r\n  '选择模块' => '选择模块',\r\n  '选择上级' => '选择上级',\r\n  '顶级栏目' => '顶级栏目',\r\n  '分类名' => '分类名',\r\n  '图片  ' => '图片  ',\r\n  '择图片' => '择图片',\r\n  '排序规则' => '排序规则',\r\n  '组合：排序倒序，时间倒序，ID倒序' => '组合：排序倒序，时间倒序，ID倒序',\r\n  '组合：排序倒序，ID正序' => '组合：排序倒序，ID正序',\r\n  '排序正序' => '排序正序',\r\n  '时间倒序' => '时间倒序',\r\n  'ID正序' => 'ID正序',\r\n  '点击量倒序' => '点击量倒序',\r\n  '时间正序' => '时间正序',\r\n  '默认不需要更改' => '默认不需要更改',\r\n  'URL命名' => 'URL命名',\r\n  '请填写文件名，如:index，不填请留空' => '请填写文件名，如:index，不填请留空',\r\n  '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：' => '填写栏目命名后，系统将自动用作该栏目URL链接，如：news，访问该栏目链接：',\r\n  '多个相同URL，将覆盖前面的栏目' => '多个相同URL，将覆盖前面的栏目',\r\n  '列表显示' => '列表显示',\r\n  '设置列表页显示的内容条数' => '设置列表页显示的内容条数',\r\n  '栏目模板' => '栏目模板',\r\n  '手动填写，不填请留空' => '手动填写，不填请留空',\r\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面。默认栏目首页',\r\n  '详情页模板' => '详情页模板',\r\n  '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。' => '请将模板文件放到对应的模块文件夹下面，如文章(article)模块，那么就要在当前模板目录的article文件夹下面，列表内的详情页。',\r\n  '栏目外链' => '栏目外链',\r\n  '栏目外链，如:htt://xxx.com/abc，不填请留空' => '栏目外链，如:htt://xxx.com/abc，不填请留空',\r\n  '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！' => '填写栏目外链后，访问栏目链接将会跳到外链，不填请留空！',\r\n  '发布显示' => '发布显示',\r\n  '勾选后，前台会员发布会显示该栏目' => '勾选后，前台会员发布会显示该栏目',\r\n  '导航显示' => '导航显示',\r\n  '模板覆盖' => '模板覆盖',\r\n  '覆盖' => '覆盖',\r\n  '不覆盖' => '不覆盖',\r\n  '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => '模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。',\r\n  '访问限制' => '访问限制',\r\n  '是否关闭' => '是否关闭',\r\n  '关闭' => '关闭',\r\n  '开启' => '开启',\r\n  '栏目关闭后，前台不显示，也无法访问！' => '栏目关闭后，前台不显示，也无法访问！',\r\n  '增加' => '增加',\r\n  '请选择模板页面/使用自定义' => '请选择模板页面/使用自定义',\r\n  '批量新增' => '批量新增',\r\n  '添加栏目' => '添加栏目',\r\n  '格式：栏目名|栏目URL，一行一个，如：关于我们|about' => '格式：栏目名|栏目URL，一行一个，如：关于我们|about',\r\n  '格式：栏目名|栏目URL，一行一个' => '格式：栏目名|栏目URL，一行一个',\r\n  '请选择模板页面' => '请选择模板页面',\r\n  '图片 ' => '图片 ',\r\n  '请填写完整文件名，如:index，不填请留空' => '请填写完整文件名，如:index，不填请留空',\r\n  ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。' => ' 模板覆盖指：显示数量及使用模板文件下级一样，减少同步操作。如果上级勾选了覆盖下级，那么下级默认调用上级填写的模板。',\r\n  '请选择栏目' => '请选择栏目',\r\n  '顶级' => '顶级',\r\n  '展开|折叠' => '展开|折叠',\r\n  '模块名' => '模块名',\r\n  '快捷操作' => '快捷操作',\r\n  '显示|隐藏' => '显示|隐藏',\r\n  '添加下级' => '添加下级',\r\n  '字段管理' => '字段管理',\r\n  '新增文章' => '新增文章',\r\n  '新增商品' => '新增商品',\r\n  '新增内容' => '新增内容',\r\n  '请选择对象' => '请选择对象',\r\n  '已删除!' => '已删除!',\r\n  '删除成功' => '删除成功',\r\n  '扩展管理' => '扩展管理',\r\n  '新增轮播图' => '新增轮播图',\r\n  '所属分类' => '所属分类',\r\n  '图片' => '图片',\r\n  '图片高' => '图片高',\r\n  '0表示不限制' => '0表示不限制',\r\n  '图片宽' => '图片宽',\r\n  '跳转链接' => '跳转链接',\r\n  '不填请留空' => '不填请留空',\r\n  '数字越大越靠前' => '数字越大越靠前',\r\n  '修改轮播图' => '修改轮播图',\r\n  '选择分类' => '选择分类',\r\n  '更新时间' => '更新时间',\r\n  '轮播图列表' => '轮播图列表',\r\n  '请选择分类' => '请选择分类',\r\n  '请输入标题' => '请输入标题',\r\n  '新增图片' => '新增图片',\r\n  '分类列表' => '分类列表',\r\n  '添加分类' => '添加分类',\r\n  '共有数据：' => '共有数据：',\r\n  '条' => '条',\r\n  '长' => '长',\r\n  '宽' => '宽',\r\n  '轮播图分类' => '轮播图分类',\r\n  '评论管理' => '评论管理',\r\n  '添加评论' => '添加评论',\r\n  '评论栏目' => '评论栏目',\r\n  '文章ID' => '文章ID',\r\n  '主回复ID' => '主回复ID',\r\n  '同属于一个评论的ID，如果没有评论中的评论，则为0' => '同属于一个评论的ID，如果没有评论中的评论，则为0',\r\n  '回复帖子ID' => '回复帖子ID',\r\n  '评论内容' => '评论内容',\r\n  '管理员回复' => '管理员回复',\r\n  '是否提醒回复' => '是否提醒回复',\r\n  '提醒' => '提醒',\r\n  '不提醒' => '不提醒',\r\n  '喜欢/点赞' => '喜欢/点赞',\r\n  '是否已读' => '是否已读',\r\n  '是否删除' => '是否删除',\r\n  '已删除' => '已删除',\r\n  '未删除' => '未删除',\r\n  '只能管理员删除评论，用户只能软删除评论' => '只能管理员删除评论，用户只能软删除评论',\r\n  '查看评论' => '查看评论',\r\n  '评论列表' => '评论列表',\r\n  '请输入评论内容' => '请输入评论内容',\r\n  '查看相关内容' => '查看相关内容',\r\n  '查看用户' => '查看用户',\r\n  '所属文章' => '所属文章',\r\n  '评论时间' => '评论时间',\r\n  '请选择审核选项' => '请选择审核选项',\r\n  '批量处理成功' => '批量处理成功',\r\n  '调用方式' => '调用方式',\r\n  '这里输出想要的内容，如：' => '这里输出想要的内容，如：',\r\n  '查看SQL' => '查看SQL',\r\n  '系统扩展' => '系统扩展',\r\n  '桌面管理' => '桌面管理',\r\n  '新增配置' => '新增配置',\r\n  '配置名称' => '配置名称',\r\n  '左侧菜单栏' => '左侧菜单栏',\r\n  '没有二级菜单不会生效' => '没有二级菜单不会生效',\r\n  '顶部菜单栏' => '顶部菜单栏',\r\n  '适用角色' => '适用角色',\r\n  '默认所有' => '默认所有',\r\n  '系统默认' => '系统默认',\r\n  '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置' => '系统默认指没有指定桌面配置的管理员，进入后台后默认的配置',\r\n  '一个菜单名称' => '一个菜单名称',\r\n  '顶级菜单' => '顶级菜单',\r\n  '菜单图标' => '菜单图标',\r\n  '二级菜单' => '二级菜单',\r\n  '图标' => '图标',\r\n  '修改菜单名称' => '修改菜单名称',\r\n  '确定要删除吗？' => '确定要删除吗？',\r\n  '最后一个索引不能删除！' => '最后一个索引不能删除！',\r\n  '添加菜单名称' => '添加菜单名称',\r\n  '菜单选择' => '菜单选择',\r\n  '图标选择' => '图标选择',\r\n  '修改配置' => '修改配置',\r\n  '桌面名称' => '桌面名称',\r\n  '系统' => '系统',\r\n  '是否默认' => '是否默认',\r\n  '所有角色' => '所有角色',\r\n  '复制配置' => '复制配置',\r\n  '修改碎片' => '修改碎片',\r\n  '指定几个id或者几个tid的内容输出(栏目：不限制栏目)' => '指定几个id或者几个tid的内容输出(栏目：不限制栏目)',\r\n  'SQL中输入：' => 'SQL中输入：',\r\n  'SQL中输入： ' => 'SQL中输入： ',\r\n  '如： ' => '如： ',\r\n  '单位：分钟' => '单位：分钟',\r\n  '修改导航' => '修改导航',\r\n  '扩展模型管理' => '扩展模型管理',\r\n  '模块管理' => '模块管理',\r\n  '新增字段' => '新增字段',\r\n  '角色绑定' => '角色绑定',\r\n  '目绑定' => '目绑定',\r\n  '字段名称' => '字段名称',\r\n  '简短的名称' => '简短的名称',\r\n  '字段标识' => '字段标识',\r\n  '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短' => '只能英文字母[或者后面+数字]，必须含有英文字母，小写字母，简短',\r\n  '字段类型' => '字段类型',\r\n  '选择' => '选择',\r\n  '长度' => '长度',\r\n  '说明' => '说明',\r\n  '不限' => '不限',\r\n  '带编辑器文本' => '带编辑器文本',\r\n  '只能填写数字，长度不能超过11位' => '只能填写数字，长度不能超过11位',\r\n  '金钱，小数等，保留2位' => '金钱，小数等，保留2位',\r\n  '时间日期' => '时间日期',\r\n  '多图，图集' => '多图，图集',\r\n  '红=1,黄=2' => '红=1,黄=2',\r\n  '单项选择，下拉选择，如：红=1,黄=2,蓝=3' => '单项选择，下拉选择，如：红=1,黄=2,蓝=3',\r\n  '单项选择，按钮选择，如：红=1,黄=2,蓝=3' => '单项选择，按钮选择，如：红=1,黄=2,蓝=3',\r\n  '多项选择，如：红=1,黄=2,蓝=3' => '多项选择，如：红=1,黄=2,蓝=3',\r\n  '一个附件，压缩包，Excel，Word文档' => '一个附件，压缩包，Excel，Word文档',\r\n  '多个附件，压缩包，Excel，Word文档' => '多个附件，压缩包，Excel，Word文档',\r\n  '请选择关联模块' => '请选择关联模块',\r\n  '列表显示字段' => '列表显示字段',\r\n  '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '单选关联，可以直接调用关联模块内容列表，列表显示对应字段内容',\r\n  '多行录入，可以在页面动态新增内容输入框' => '多行录入，可以在页面动态新增内容输入框',\r\n  '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容' => '多选关联，可以直接调用关联模块内容列表，列表显示对应字段内容',\r\n  '系统栏目，不可修改' => '系统栏目，不可修改',\r\n  '系统副栏目，不可修改' => '系统副栏目，不可修改',\r\n  '系统TAG，不可修改' => '系统TAG，不可修改',\r\n  '默认值' => '默认值',\r\n  '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1' => '默认字段值，不填默认int类型的值是0，string类型的值是null。多选参数的值是两边带【,】，如【,1,】表示值为1',\r\n  '字段提示' => '字段提示',\r\n  '用于填写时的提示信息，50字以内' => '用于填写时的提示信息，50字以内',\r\n  '表单排序' => '表单排序',\r\n  '是否必填' => '是否必填',\r\n  '必填' => '必填',\r\n  '非必填' => '非必填',\r\n  '带有文本框编辑器的除外' => '带有文本框编辑器的除外',\r\n  '前台显示' => '前台显示',\r\n  '前台表单' => '前台表单',\r\n  '后台显示' => '后台显示',\r\n  '后台搜索' => '后台搜索',\r\n  '仅用于后台列表头部带有该字段搜索' => '仅用于后台列表头部带有该字段搜索',\r\n  '列表中显示' => '列表中显示',\r\n  '仅用于后台列表显示该字段' => '仅用于后台列表显示该字段',\r\n  '显示格式化' => '显示格式化',\r\n  '不做处理' => '不做处理',\r\n  '仅用于后台列表显示该字段内容处理' => '仅用于后台列表显示该字段内容处理',\r\n  'ajax可访问' => 'ajax可访问',\r\n  '不能' => '不能',\r\n  '能' => '能',\r\n  '由于本系统对json数据封装，限制访问可以提高安全性' => '由于本系统对json数据封装，限制访问可以提高安全性',\r\n  '角色名' => '角色名',\r\n  '栏目名' => '栏目名',\r\n  '修改字段' => '修改字段',\r\n  '栏目绑定' => '栏目绑定',\r\n  '红=1,黄=2,蓝=3' => '红=1,黄=2,蓝=3',\r\n  '关联模块内容ID' => '关联模块内容ID',\r\n  '可以在页面动态新增内容输入框' => '可以在页面动态新增内容输入框',\r\n  '温馨提示：排序和宽度在列表点击也可以更改。' => '温馨提示：排序和宽度在列表点击也可以更改。',\r\n  '排序：当前列表显示排序，不会影响录入排序，越大越靠前。' => '排序：当前列表显示排序，不会影响录入排序，越大越靠前。',\r\n  '搜索：在列表顶部的搜索中，可以搜索该字段。' => '搜索：在列表顶部的搜索中，可以搜索该字段。',\r\n  '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。' => '宽度：列表显示的宽度。由于屏幕宽度问题，可以根据自己关注的字段在列表中显示更清晰，默认100。',\r\n  '宽度' => '宽度',\r\n  '批量绑定栏目' => '批量绑定栏目',\r\n  '字段' => '字段',\r\n  '后台' => '后台',\r\n  '确认要删除吗？删除的同时将删除对应的表内容！' => '确认要删除吗？删除的同时将删除对应的表内容！',\r\n  '角色管理' => '角色管理',\r\n  '角色修改' => '角色修改',\r\n  '是否超管' => '是否超管',\r\n  '不是' => '不是',\r\n  '超级管理员拥有无上权利，无视下面权限限制' => '超级管理员拥有无上权利，无视下面权限限制',\r\n  '发布审核' => '发布审核',\r\n  '超级管理员除外，发布的内容是否需要审核' => '超级管理员除外，发布的内容是否需要审核',\r\n  '栏目权限' => '栏目权限',\r\n  '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效' => '是否设置栏目权限，默认不设置。开启后下面的栏目权限设置才有效',\r\n  '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目' => '选中顶级栏目，则默认子栏目也选中。如果只需要子栏目权限，请不要选中顶级栏目',\r\n  '子栏目' => '子栏目',\r\n  '拥有权限' => '拥有权限',\r\n  '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块' => '选中主模块，则默认子模块也选中。如果只需要子模块权限，请不要选中主模块',\r\n  '主模块' => '主模块',\r\n  '子模块' => '子模块',\r\n  '描述' => '描述',\r\n  '请输入内容' => '请输入内容',\r\n  '关闭后，该分组管理员将不能登录' => '关闭后，该分组管理员将不能登录',\r\n  '添加角色' => '添加角色',\r\n  '后台管理' => '后台管理',\r\n  '展开左侧栏' => '展开左侧栏',\r\n  '清理缓存' => '清理缓存',\r\n  '退出' => '退出',\r\n  '前台首页' => '前台首页',\r\n  '后台首页' => '后台首页',\r\n  '我的桌面' => '我的桌面',\r\n  '关闭当前' => '关闭当前',\r\n  '关闭其他' => '关闭其他',\r\n  '关闭所有' => '关闭所有',\r\n  '扩展模块管理' => '扩展模块管理',\r\n  '批量修改分类' => '批量修改分类',\r\n  '批量处理' => '批量处理',\r\n  '友情链接分类' => '友情链接分类',\r\n  '分类' => '分类',\r\n  '后台管理登录' => '后台管理登录',\r\n  '验证码' => '验证码',\r\n  '登录' => '登录',\r\n  '登录ID' => '登录ID',\r\n  '登录用户' => '登录用户',\r\n  '模块' => '模块',\r\n  '方法' => '方法',\r\n  '操作时间' => '操作时间',\r\n  '会员管理' => '会员管理',\r\n  '新增会员' => '新增会员',\r\n  '用于找回密码' => '用于找回密码',\r\n  '手机号' => '手机号',\r\n  '必须唯一' => '必须唯一',\r\n  '昵称' => '昵称',\r\n  '分组' => '分组',\r\n  '头像' => '头像',\r\n  '生日' => '生日',\r\n  '个性签名' => '个性签名',\r\n  '省份' => '省份',\r\n  '城市' => '城市',\r\n  '详细地址' => '详细地址',\r\n  '6到16个字符' => '6到16个字符',\r\n  '添加成功' => '添加成功',\r\n  '会员修' => '会员修',\r\n  '6到16个字符,不修改请留空' => '6到16个字符,不修改请留空',\r\n  '修改成功' => '修改成功',\r\n  '会员列表' => '会员列表',\r\n  '请输入手机号' => '请输入手机号',\r\n  '余额' => '余额',\r\n  '加入时间' => '加入时间',\r\n  '分组管理' => '分组管理',\r\n  '分组修改' => '分组修改',\r\n  '分组名' => '分组名',\r\n  '折扣类型' => '折扣类型',\r\n  '无折扣' => '无折扣',\r\n  '现金折扣' => '现金折扣',\r\n  '百分比折扣' => '百分比折扣',\r\n  '折扣金额' => '折扣金额',\r\n  '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效' => '百分比折扣请填写0.01-1之间的小数(如5折,填0.5)，无折扣时，该参数设置无效',\r\n  '登录状态' => '登录状态',\r\n  '请选择所属单位！' => '请选择所属单位！',\r\n  '用户管理' => '用户管理',\r\n  '会员分组' => '会员分组',\r\n  '添加分组' => '添加分组',\r\n  '温馨提示：前台权限已关闭，设置权限不会生效。' => '温馨提示：前台权限已关闭，设置权限不会生效。',\r\n  '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！' => '温馨提示：前台权限已开启，权限设置将直接影响前台访问，请谨慎操作！',\r\n  '留言管理' => '留言管理',\r\n  '查看留言' => '查看留言',\r\n  '问题描述' => '问题描述',\r\n  '用户昵称' => '用户昵称',\r\n  '留言栏目' => '留言栏目',\r\n  '不指定栏目' => '不指定栏目',\r\n  '联系电话' => '联系电话',\r\n  '留言IP' => '留言IP',\r\n  '留言内容' => '留言内容',\r\n  '是否审核' => '是否审核',\r\n  '提交时间' => '提交时间',\r\n  '修改保存' => '修改保存',\r\n  '留言列表' => '留言列表',\r\n  '请输入相关内容ID' => '请输入相关内容ID',\r\n  '内容ID' => '内容ID',\r\n  '模型管理' => '模型管理',\r\n  '新增模型' => '新增模型',\r\n  '模型名称' => '模型名称',\r\n  '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名' => '必须是英文字母，且不能是已存在的标识，标识即是数据库里的表名',\r\n  '是否必选栏目' => '是否必选栏目',\r\n  '新增修改内容时必选' => '新增修改内容时必选',\r\n  '是否显示栏目' => '是否显示栏目',\r\n  '列表展示、录入内容、修改内容三个页面是否展示栏目' => '列表展示、录入内容、修改内容三个页面是否展示栏目',\r\n  '是否受权限控制' => '是否受权限控制',\r\n  '不同角色可以通过控制栏目权限来限制查看内容' => '不同角色可以通过控制栏目权限来限制查看内容',\r\n  '栏目绑定显示' => '栏目绑定显示',\r\n  '栏目绑定时是否显示该模型' => '栏目绑定时是否显示该模型',\r\n  '前台发布' => '前台发布',\r\n  '前台是否允许发布' => '前台是否允许发布',\r\n  '列表模板' => '列表模板',\r\n  '默认列表模板' => '默认列表模板',\r\n  '详情模板' => '详情模板',\r\n  '默认详情模板' => '默认详情模板',\r\n  '是否开启' => '是否开启',\r\n  '数值越小越靠前' => '数值越小越靠前',\r\n  '已有表' => '已有表',\r\n  '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"' => '如果数据库已经有这个表了，就选择\"是\"，否则就选\"不是\"',\r\n  '是否可以预览' => '是否可以预览',\r\n  '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]' => '如果后台无法预览，则选择 “否” ，列表中将不会出现 [预览]',\r\n  '修改模型' => '修改模型',\r\n  '模型状态' => '模型状态',\r\n  '模型分类' => '模型分类',\r\n  '允许' => '允许',\r\n  '已停用' => '已停用',\r\n  '已启用' => '已启用',\r\n  '重构字段' => '重构字段',\r\n  '确认要删除吗？删除的同时将删除对应的表！' => '确认要删除吗？删除的同时将删除对应的表！',\r\n  '订单列表' => '订单列表',\r\n  '订单详情' => '订单详情',\r\n  '姓名' => '姓名',\r\n  '是否支付' => '是否支付',\r\n  '已支付' => '已支付',\r\n  '未支付' => '未支付',\r\n  '支付时间' => '支付时间',\r\n  '存储内容' => '存储内容',\r\n  '订单内容' => '订单内容',\r\n  '商品' => '商品',\r\n  '商品已删除' => '商品已删除',\r\n  '收货信息：' => '收货信息：',\r\n  '收件人：' => '收件人：',\r\n  '联系手机：' => '联系手机：',\r\n  '联系邮箱：' => '联系邮箱：',\r\n  '收货地址：' => '收货地址：',\r\n  '订单状态' => '订单状态',\r\n  '订单已删除' => '订单已删除',\r\n  '已提交未支付' => '已提交未支付',\r\n  '超时订单' => '超时订单',\r\n  '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '订单更改为‘已出货’，点‘确定修改’后，将发送一封邮件通知客户。订单未变化状态则不会发送邮件',\r\n  '发货时间' => '发货时间',\r\n  '确定修改' => '确定修改',\r\n  '订单管理' => '订单管理',\r\n  '选择状态' => '选择状态',\r\n  '支付方式' => '支付方式',\r\n  '线下支付' => '线下支付',\r\n  '钱包支付' => '钱包支付',\r\n  '积分兑换' => '积分兑换',\r\n  '支付宝支付' => '支付宝支付',\r\n  '微信支付' => '微信支付',\r\n  '微信H5支付' => '微信H5支付',\r\n  '微信扫码支付' => '微信扫码支付',\r\n  '支付宝H5支付' => '支付宝H5支付',\r\n  '总收入' => '总收入',\r\n  '付款方式' => '付款方式',\r\n  '是否付款' => '是否付款',\r\n  '付款时间' => '付款时间',\r\n  '图库管理' => '图库管理',\r\n  '筛选上传入口' => '筛选上传入口',\r\n  '前台' => '前台',\r\n  '筛选模块' => '筛选模块',\r\n  '其他杂项' => '其他杂项',\r\n  '系统配置' => '系统配置',\r\n  '筛选栏目' => '筛选栏目',\r\n  '上传前台' => '上传前台',\r\n  '所属模块' => '所属模块',\r\n  '本地文件' => '本地文件',\r\n  '文件大小' => '文件大小',\r\n  '其他' => '其他',\r\n  '插件管理' => '插件管理',\r\n  '插件列表' => '插件列表',\r\n  '全部' => '全部',\r\n  '本地' => '本地',\r\n  '请输入插件名字' => '请输入插件名字',\r\n  '插件名' => '插件名',\r\n  '版本' => '版本',\r\n  '作者' => '作者',\r\n  '平台' => '平台',\r\n  '插件文件' => '插件文件',\r\n  '开关' => '开关',\r\n  '安装说明' => '安装说明',\r\n  '点击查看' => '点击查看',\r\n  '更新说明' => '更新说明',\r\n  '新' => '新',\r\n  '官方' => '官方',\r\n  '第三方' => '第三方',\r\n  '开|停' => '开|停',\r\n  '配置' => '配置',\r\n  '导出' => '导出',\r\n  '卸载' => '卸载',\r\n  '安装' => '安装',\r\n  '下载' => '下载',\r\n  '获取文件大小失败，请检查网络！' => '获取文件大小失败，请检查网络！',\r\n  '正在安装中，请稍等~' => '正在安装中，请稍等~',\r\n  '正在删除中，请稍等~' => '正在删除中，请稍等~',\r\n  '正在卸载中，请稍等~' => '正在卸载中，请稍等~',\r\n  '设置接口' => '设置接口',\r\n  '当前版本：' => '当前版本：',\r\n  '最新版本：' => '最新版本：',\r\n  '作者：' => '作者：',\r\n  '更新时间：' => '更新时间：',\r\n  '更新内容' => '更新内容',\r\n  '正在下载文件' => '正在下载文件',\r\n  '升级插件' => '升级插件',\r\n  '文件下载完成！正在解压~' => '文件下载完成！正在解压~',\r\n  '文件解压完成！正在进行安装~' => '文件解压完成！正在进行安装~',\r\n  '插件升级成功！' => '插件升级成功！',\r\n  '插件已升级完毕！' => '插件已升级完毕！',\r\n  '功能' => '功能',\r\n  '函数名' => '函数名',\r\n  '对应的控制器/函数，如果是顶级，则只需要写控制器名' => '对应的控制器/函数，如果是顶级，则只需要写控制器名',\r\n  '权限列表' => '权限列表',\r\n  '添加权限' => '添加权限',\r\n  '控制器/方法' => '控制器/方法',\r\n  '添加子功能' => '添加子功能',\r\n  '权限管理' => '权限管理',\r\n  '栏目选择' => '栏目选择',\r\n  '权限选择' => '权限选择',\r\n  '不能选择的权限是非独立功能' => '不能选择的权限是非独立功能',\r\n  '请先勾选菜单!' => '请先勾选菜单!',\r\n  '扩展信息' => '扩展信息',\r\n  '回收站' => '回收站',\r\n  '还原' => '还原',\r\n  '批量恢复' => '批量恢复',\r\n  '确认要删除吗？删除后就彻底无法恢复了！' => '确认要删除吗？删除后就彻底无法恢复了！',\r\n  '确认要删除吗？删除后不可恢复！' => '确认要删除吗？删除后不可恢复！',\r\n  '确认要还原吗？' => '确认要还原吗？',\r\n  '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。' => '重构字段可以快速将外部表引入CMS内，使其兼容CMS模型。',\r\n  '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改',\r\n  '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '温馨提示：外部表必须有个字段为id，且必须是自增主键。如果没有，请先在数据库手动增加这个字段或者把已有的自增字段改成id。',\r\n  '数据类型' => '数据类型',\r\n  '录入类型' => '录入类型',\r\n  '归属' => '归属',\r\n  '插件' => '插件',\r\n  '独立功能' => '独立功能',\r\n  '桌面管理配置时，将调用独立功能' => '桌面管理配置时，将调用独立功能',\r\n  '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录' => '手机端已开启，sitemap将包含手机端URL，请注意【手机静态目录',\r\n  '如果不生成静态文件，请改为' => '如果不生成静态文件，请改为',\r\n  '手机端未开启，sitemap不会包含手机端URL' => '手机端未开启，sitemap不会包含手机端URL',\r\n  'PC端网站地图：' => 'PC端网站地图：',\r\n  '手机端网站地图：' => '手机端网站地图：',\r\n  '网站地图' => '网站地图',\r\n  '模块名称' => '模块名称',\r\n  '更新频率' => '更新频率',\r\n  '站内权重' => '站内权重',\r\n  '输出范围' => '输出范围',\r\n  '栏目模块' => '栏目模块',\r\n  '显示的栏目' => '显示的栏目',\r\n  '所有的栏目' => '所有的栏目',\r\n  '文章模块' => '文章模块',\r\n  '显示的文章' => '显示的文章',\r\n  '所有的文章' => '所有的文章',\r\n  '商品模块' => '商品模块',\r\n  '显示的商品' => '显示的商品',\r\n  '所有的商品' => '所有的商品',\r\n  '显示的' => '显示的',\r\n  '所有的' => '所有的',\r\n  '立即生成' => '立即生成',\r\n  '网站设置' => '网站设置',\r\n  '自定义配置' => '自定义配置',\r\n  '点击复制' => '点击复制',\r\n  '上传文件' => '上传文件',\r\n  '不选' => '不选',\r\n  '删除配置栏' => '删除配置栏',\r\n  '选择类型' => '选择类型',\r\n  '编辑器' => '编辑器',\r\n  '文件上传' => '文件上传',\r\n  '下拉选项' => '下拉选项',\r\n  '栏目选项' => '栏目选项',\r\n  '代码' => '代码',\r\n  '请填写配置名(中文)' => '请填写配置名(中文)',\r\n  '配置标识(字母或数字)' => '配置标识(字母或数字)',\r\n  '配置栏目' => '配置栏目',\r\n  '提示信息' => '提示信息',\r\n  '自定义配置可以配置对应配置栏下的自定义内容' => '自定义配置可以配置对应配置栏下的自定义内容',\r\n  '下拉选项配置，如：开启=1,关闭=0' => '下拉选项配置，如：开启=1,关闭=0',\r\n  '自定义配置栏' => '自定义配置栏',\r\n  '请填写配置栏名(中文)' => '请填写配置栏名(中文)',\r\n  '配置标识(必须是字母)' => '配置标识(必须是字母)',\r\n  '配置标识用于权限控制，必填且不能与原系统配置栏重复' => '配置标识用于权限控制，必填且不能与原系统配置栏重复',\r\n  '失败！' => '失败！',\r\n  '模板管理' => '模板管理',\r\n  '模板列表' => '模板列表',\r\n  '请输入模板名字' => '请输入模板名字',\r\n  '有更新' => '有更新',\r\n  '已使用' => '已使用',\r\n  '备份数据' => '备份数据',\r\n  '安装模板' => '安装模板',\r\n  '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？' => '如果数据量较大，不建议通过此方法备份数据库，可以从数据库中直接导出。确定要备份数据库吗？',\r\n  '提示' => '提示',\r\n  '安装提示' => '安装提示',\r\n  '该模板用于：' => '该模板用于：',\r\n  'PC端' => 'PC端',\r\n  '手机端' => '手机端',\r\n  '微信端' => '微信端',\r\n  '升级模板' => '升级模板',\r\n  '模板升级成功！' => '模板升级成功！',\r\n  '模板已升级完毕！' => '模板已升级完毕！',\r\n  '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！' => '您已开启【缓存完整页面】，更新静态HTML需要预留足够的空间，如：总内存500M，已用280M（过半），不建议生成HMTL，可能会导致内存不够！',\r\n  '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭',\r\n  '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！' => '请确定空间内存是否足够，如果不够，可以开启【缓存完整页面】，也能达到静态访问打开页面速度！',\r\n  '指定栏目' => '指定栏目',\r\n  '所有栏目' => '所有栏目',\r\n  '生成电脑静态' => '生成电脑静态',\r\n  '生成手机静态' => '生成手机静态',\r\n  '清理电脑静态HTML' => '清理电脑静态HTML',\r\n  '清理手机静态HTML' => '清理手机静态HTML',\r\n  '批量生成电脑静态' => '批量生成电脑静态',\r\n  '批量生成手机静态' => '批量生成手机静态',\r\n  '批量清理电脑静态' => '批量清理电脑静态',\r\n  '批量清理手机静态' => '批量清理手机静态',\r\n  '正在处理~' => '正在处理~',\r\n  '正在准备生成静态，请不要关闭页面~' => '正在准备生成静态，请不要关闭页面~',\r\n  '正在准备清理电脑端静态HTML，请不要关闭页面~' => '正在准备清理电脑端静态HTML，请不要关闭页面~',\r\n  '正在准备清理手机端静态HTML，请不要关闭页面~' => '正在准备清理手机端静态HTML，请不要关闭页面~',\r\n  '欢迎管理员：' => '欢迎管理员：',\r\n  '当前时间' => '当前时间',\r\n  '站内用户' => '站内用户',\r\n  '人' => '人',\r\n  '站内文章' => '站内文章',\r\n  '篇' => '篇',\r\n  '站内产品' => '站内产品',\r\n  '件' => '件',\r\n  '站内留言' => '站内留言',\r\n  '最近更新' => '最近更新',\r\n  '全部文章' => '全部文章',\r\n  '阅读量' => '阅读量',\r\n  '最新评论' => '最新评论',\r\n  '在' => '在',\r\n  '发布了评论' => '发布了评论',\r\n  '版本信息' => '版本信息',\r\n  '当前版本' => '当前版本',\r\n  '项目地址' => '项目地址',\r\n  '服务器' => '服务器',\r\n  '操作系统' => '操作系统',\r\n  '运行环境' => '运行环境',\r\n  'PHP版本' => 'PHP版本',\r\n  '运行方式' => '运行方式',\r\n  '上传限制' => '上传限制',\r\n  '用户留言' => '用户留言',\r\n  '回复' => '回复',\r\n  '星期天' => '星期天',\r\n  '星期一' => '星期一',\r\n  '星期二' => '星期二',\r\n  '星期三' => '星期三',\r\n  '星期四' => '星期四',\r\n  '星期五' => '星期五',\r\n  '星期六' => '星期六',\r\n  '评论模块未开启！' => '评论模块未开启！',\r\n  '您的操作过于频繁，请十分钟后再试~' => '您的操作过于频繁，请十分钟后再试~',\r\n  '评论内容不能为空！' => '评论内容不能为空！',\r\n  '请提交栏目ID' => '请提交栏目ID',\r\n  '栏目ID不能为空！' => '栏目ID不能为空！',\r\n  '评论奖励' => '评论奖励',\r\n  '评价成功！' => '评价成功！',\r\n  '您未登录，请重新登录~' => '您未登录，请重新登录~',\r\n  '您没有' => '您没有',\r\n  '的权限！' => '的权限！',\r\n  '您还未登录，请重新登录！' => '您还未登录，请重新登录！',\r\n  '上传成功！' => '上传成功！',\r\n  '已关闭前台上传文件功能' => '已关闭前台上传文件功能',\r\n  '上传错误！' => '上传错误！',\r\n  '对不起，您没有访问权限！' => '对不起，您没有访问权限！',\r\n  '输入url错误！' => '输入url错误！',\r\n  '缺少ID！' => '缺少ID！',\r\n  '未找到相应内容！' => '未找到相应内容！',\r\n  '请输入关键词搜索！' => '请输入关键词搜索！',\r\n  '搜索超出设定范围！' => '搜索超出设定范围！',\r\n  '您的搜索超出设定范围！' => '您的搜索超出设定范围！',\r\n  '系统创建' => '系统创建',\r\n  '目录失败!' => '目录失败!',\r\n  '支付成功，但是系统内没有找到相应的订单！' => '支付成功，但是系统内没有找到相应的订单！',\r\n  '支付失败' => '支付失败',\r\n  '订单号错误！' => '订单号错误！',\r\n  '会员中心已关闭！' => '会员中心已关闭！',\r\n  '您的账户已被冻结！' => '您的账户已被冻结！',\r\n  '未找到您所在分组，请联系管理员处理！' => '未找到您所在分组，请联系管理员处理！',\r\n  '您所在的分组被限制登录！' => '您所在的分组被限制登录！',\r\n  '登录奖励' => '登录奖励',\r\n  '系统已关闭会员注册！' => '系统已关闭会员注册！',\r\n  '您的邀请链接不合法！' => '您的邀请链接不合法！',\r\n  '手机号格式不正确！' => '手机号格式不正确！',\r\n  '您的邮箱已注册！' => '您的邮箱已注册！',\r\n  '您的手机号码已注册！' => '您的手机号码已注册！',\r\n  '邀请奖励' => '邀请奖励',\r\n  '注册成功，等待审核！' => '注册成功，等待审核！',\r\n  '注册成功！' => '注册成功！',\r\n  '注册失败，请重试~' => '注册失败，请重试~',\r\n  '必须通过邀请链接进行注册！' => '必须通过邀请链接进行注册！',\r\n  '请输入账号和邮箱！' => '请输入账号和邮箱！',\r\n  '图形验证码错误！' => '图形验证码错误！',\r\n  '找回密码' => '找回密码',\r\n  '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击' => '您的账号正在进行找回密码操作，如果确定是本人操作，请在10分钟内点击',\r\n  '立即找回密码' => '立即找回密码',\r\n  '过期失效！' => '过期失效！',\r\n  '您操作过于频繁，请10分钟后再尝试！' => '您操作过于频繁，请10分钟后再尝试！',\r\n  '找回密码邮件已发送，请到您的邮箱查看！' => '找回密码邮件已发送，请到您的邮箱查看！',\r\n  '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！' => '邮箱服务器未配置，无法发送邮件，请联系管理员找回密码！',\r\n  '输入的信息有误！' => '输入的信息有误！',\r\n  'token已失效！' => 'token已失效！',\r\n  '密码重置成功,请重新登录！' => '密码重置成功,请重新登录！',\r\n  '新密码不能与旧密码相同！' => '新密码不能与旧密码相同！',\r\n  '标题不能为空！' => '标题不能为空！',\r\n  '称呼不能为空！' => '称呼不能为空！',\r\n  '您的手机号格式不正确！' => '您的手机号格式不正确！',\r\n  '不能为空！' => '不能为空！',\r\n  '提交成功！我们会尽快回复您！' => '提交成功！我们会尽快回复您！',\r\n  '提交失败，请重试！' => '提交失败，请重试！',\r\n  '链接错误' => '链接错误',\r\n  '留言未找到或者未审核' => '留言未找到或者未审核',\r\n  '匿名' => '匿名',\r\n  '缺少id参数！' => '缺少id参数！',\r\n  '缺少tid参数！' => '缺少tid参数！',\r\n  '未找到商品或者已下架！' => '未找到商品或者已下架！',\r\n  '该模块缺少price价格参数！' => '该模块缺少price价格参数！',\r\n  '您的订单提交成功通知' => '您的订单提交成功通知',\r\n  '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！' => '我们已经收到您的订单，我们会尽快给你发货，请密切关注您的邮箱以获得订单的最新消息，谢谢合作！',\r\n  '订单详细信息如下' => '订单详细信息如下',\r\n  '折扣' => '折扣',\r\n  '运费' => '运费',\r\n  '合计' => '合计',\r\n  '收件地址' => '收件地址',\r\n  '您的订单' => '您的订单',\r\n  '已经提交，我们会尽快给您发货！' => '已经提交，我们会尽快给您发货！',\r\n  '订单已支付！' => '订单已支付！',\r\n  '已经提交，请尽快支付！' => '已经提交，请尽快支付！',\r\n  '支付订单' => '支付订单',\r\n  '电脑支付宝支付' => '电脑支付宝支付',\r\n  '微信内支付' => '微信内支付',\r\n  '未开启钱包支付！' => '未开启钱包支付！',\r\n  '您未登录，无法支付！' => '您未登录，无法支付！',\r\n  '钱包金额不足，请充值！' => '钱包金额不足，请充值！',\r\n  '未开启积分支付！' => '未开启积分支付！',\r\n  '积分不足，请充值！' => '积分不足，请充值！',\r\n  '支付宝当面付' => '支付宝当面付',\r\n  '其他平台支付' => '其他平台支付',\r\n  '在线充值' => '在线充值',\r\n  '交易创建，等待买家付款' => '交易创建，等待买家付款',\r\n  '未付款交易超时关闭，或支付完成后全额退款' => '未付款交易超时关闭，或支付完成后全额退款',\r\n  '支付成功' => '支付成功',\r\n  '交易结束，不可退款' => '交易结束，不可退款',\r\n  '未知状态' => '未知状态',\r\n  '订单号错误或订单被删除！' => '订单号错误或订单被删除！',\r\n  '订单未支付或订单号错误！' => '订单未支付或订单号错误！',\r\n  '创建订单失败！' => '创建订单失败！',\r\n  '订单号不存在或已被删除！' => '订单号不存在或已被删除！',\r\n  '收件人、手机号和收货地址不能为空！' => '收件人、手机号和收货地址不能为空！',\r\n  '未开启在线支付！' => '未开启在线支付！',\r\n  '获取openid失败' => '获取openid失败',\r\n  '非法参数！' => '非法参数！',\r\n  '标签未找到或已删除！' => '标签未找到或已删除！',\r\n  '手机号码格式错误！' => '手机号码格式错误！',\r\n  '账户不能为空！' => '账户不能为空！',\r\n  '订单已过期，不可支付！' => '订单已过期，不可支付！',\r\n  '订单已支付，请勿重复操作！' => '订单已支付，请勿重复操作！',\r\n  '缺少订单号！' => '缺少订单号！',\r\n  '网络错误，请刷新后重试！' => '网络错误，请刷新后重试！',\r\n  '未找到评论！' => '未找到评论！',\r\n  '已取消点赞！' => '已取消点赞！',\r\n  '点赞成功！' => '点赞成功！',\r\n  '栏目未绑定模型，无法喜欢！' => '栏目未绑定模型，无法喜欢！',\r\n  '取消点赞' => '取消点赞',\r\n  '点赞奖励' => '点赞奖励',\r\n  '已被删除 ' => '已被删除 ',\r\n  '栏目未绑定模型，无法收藏！' => '栏目未绑定模型，无法收藏！',\r\n  '取消收藏' => '取消收藏',\r\n  '收藏奖励' => '收藏奖励',\r\n  '收藏成功！' => '收藏成功！',\r\n  '已被删除' => '已被删除',\r\n  '库存不足！' => '库存不足！',\r\n  '该模块不允许发布！' => '该模块不允许发布！',\r\n  '添加失败，存在敏感词' => '添加失败，存在敏感词',\r\n  '分类错误！' => '分类错误！',\r\n  '该分类不允许发布！' => '该分类不允许发布！',\r\n  '您没有权限在该分类发布内容！' => '您没有权限在该分类发布内容！',\r\n  '内容不能为空！' => '内容不能为空！',\r\n  '库存不能为0！' => '库存不能为0！',\r\n  '未修改内容，不能提交！' => '未修改内容，不能提交！',\r\n  '发布失败，请重试！' => '发布失败，请重试！',\r\n  '发布成功！' => '发布成功！',\r\n  '未找到您要的文章！' => '未找到您要的文章！',\r\n  '您已经关注了该用户！' => '您已经关注了该用户！',\r\n  '您不能关注自己！' => '您不能关注自己！',\r\n  '关注奖励' => '关注奖励',\r\n  '关注成功！' => '关注成功！',\r\n  '您没有关注该用户，无法操作！' => '您没有关注该用户，无法操作！',\r\n  '取关成功！' => '取关成功！',\r\n  '消息已被删除！' => '消息已被删除！',\r\n  '用户未找到！' => '用户未找到！',\r\n  '未分类 ' => '未分类 ',\r\n  '设置成功' => '设置成功',\r\n  '设置成功！' => '设置成功！',\r\n  '记录不存在！' => '记录不存在！',\r\n  '缺少栏目ID！' => '缺少栏目ID！',\r\n  '系统未配置微信登录！' => '系统未配置微信登录！',\r\n  '微信已绑定！' => '微信已绑定！',\r\n  '您的微信已被绑定，不能再绑定！' => '您的微信已被绑定，不能再绑定！',\r\n  '系统版号' => '系统版号',\r\n  '版本号是系统自带，请勿改动' => '版本号是系统自带，请勿改动',\r\n  '网站SEO名称' => '网站SEO名称',\r\n  '控制在25个字、50个字节以内' => '控制在25个字、50个字节以内',\r\n  '网站SEO关键词' => '网站SEO关键词',\r\n  '5个左右，8汉字以内，用英文逗号隔开' => '5个左右，8汉字以内，用英文逗号隔开',\r\n  '网站SEO描述' => '网站SEO描述',\r\n  '控制在80个汉字，160个字符以内' => '控制在80个汉字，160个字符以内',\r\n  '统计代码' => '统计代码',\r\n  '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '将百度统计、cnzz等平台的流量统计JS代码放到这里',\r\n  '底部版权' => '底部版权',\r\n  '如：&copy; 2016 xxx版权' => '如：&copy; 2016 xxx版权',\r\n  '备案号' => '备案号',\r\n  '如：京ICP备00000000号' => '如：京ICP备00000000号',\r\n  '网站电话' => '网站电话',\r\n  '网站联系电话' => '网站联系电话',\r\n  '400电话' => '400电话',\r\n  '网站QQ' => '网站QQ',\r\n  '网站邮箱' => '网站邮箱',\r\n  '公司地址' => '公司地址',\r\n  'PC网站模板' => 'PC网站模板',\r\n  '将模板名称填写到此处' => '将模板名称填写到此处',\r\n  'WAP网站模板' => 'WAP网站模板',\r\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板' => '开启了手机端，这个设置才会生效，否则调用电脑端模板',\r\n  '微信网站模板' => '微信网站模板',\r\n  '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板' => '开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板',\r\n  '是否开启手机端' => '是否开启手机端',\r\n  '如果不开启手机端，则默认调用电脑端模板' => '如果不开启手机端，则默认调用电脑端模板',\r\n  '是否开启前台上传' => '是否开启前台上传',\r\n  '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。' => '关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。',\r\n  '是否开启前台权限' => '是否开启前台权限',\r\n  '开启后前台用户权限可以在后台控制' => '开启后前台用户权限可以在后台控制',\r\n  '缓存时间' => '缓存时间',\r\n  '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。' => '单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。此设置与缓存完整页面，模板缓存有关。',\r\n  '限制上传文件大小' => '限制上传文件大小',\r\n  '0代表不限，单位kb' => '0代表不限，单位kb',\r\n  '允许上传文件类型' => '允许上传文件类型',\r\n  '请用|分割，如：pdf|jpg|png' => '请用|分割，如：pdf|jpg|png',\r\n  '前台UEditor编辑器导航条配置' => '前台UEditor编辑器导航条配置',\r\n  '允许前台搜索的表' => '允许前台搜索的表',\r\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product' => '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product',\r\n  '上传图片压缩比例' => '上传图片压缩比例',\r\n  '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80' => '100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80',\r\n  'PNG是否压缩' => 'PNG是否压缩',\r\n  'PNG压缩后容易变成背景黑色，关闭后，不会压缩。' => 'PNG压缩后容易变成背景黑色，关闭后，不会压缩。',\r\n  '邮件服务器' => '邮件服务器',\r\n  'smtp.163.com,smtp.qq.com' => 'smtp.163.com,smtp.qq.com',\r\n  '邮件收发端口' => '邮件收发端口',\r\n  '163、126邮件端口(465)，QQ邮件端口(587)' => '163、126邮件端口(465)，QQ邮件端口(587)',\r\n  '收件人Email地址' => '收件人Email地址',\r\n  '发件人Email地址' => '发件人Email地址',\r\n  '指邮件服务器发件邮箱' => '指邮件服务器发件邮箱',\r\n  '发件人Email秘钥' => '发件人Email秘钥',\r\n  '这个秘钥不是登录密码' => '这个秘钥不是登录密码',\r\n  '发件人昵称' => '发件人昵称',\r\n  '发件邮箱会带一个昵称' => '发件邮箱会带一个昵称',\r\n  '客户订单通知' => '客户订单通知',\r\n  '购买商品的时候会发送的一条邮件信息' => '购买商品的时候会发送的一条邮件信息',\r\n  '订单出货通知' => '订单出货通知',\r\n  '发货的时候发送给客户的通知' => '发货的时候发送给客户的通知',\r\n  '订单运费' => '订单运费',\r\n  '购物下单时会加上这个运费' => '购物下单时会加上这个运费',\r\n  '在线支付' => '在线支付',\r\n  '0关闭支付，1自主平台支付' => '0关闭支付，1自主平台支付',\r\n  '极致平台接口' => '极致平台接口',\r\n  '极致平台商户' => '极致平台商户',\r\n  '极致平台应用appid' => '极致平台应用appid',\r\n  '极致平台应用秘钥' => '极致平台应用秘钥',\r\n  '支付宝APPID' => '支付宝APPID',\r\n  '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID' => '账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID',\r\n  '支付宝key' => '支付宝key',\r\n  'MD5密钥，安全检验码，由数字和字母组成的32位字符串' => 'MD5密钥，安全检验码，由数字和字母组成的32位字符串',\r\n  '支付宝私钥' => '支付宝私钥',\r\n  '支付宝公钥' => '支付宝公钥',\r\n  '微信商户mchid' => '微信商户mchid',\r\n  '支付相关' => '支付相关',\r\n  '微信商户key' => '微信商户key',\r\n  '微信公众号appid' => '微信公众号appid',\r\n  '微信公众号appsecret' => '微信公众号appsecret',\r\n  '微信apiclient_cert' => '微信apiclient_cert',\r\n  '微信apiclient_key' => '微信apiclient_key',\r\n  '公众号appid' => '公众号appid',\r\n  '用户登录相关，如果跟支付的一样，那就再填写一遍' => '用户登录相关，如果跟支付的一样，那就再填写一遍',\r\n  '公众号appsecret' => '公众号appsecret',\r\n  '公众号token' => '公众号token',\r\n  '公众号关注欢迎语' => '公众号关注欢迎语',\r\n  '公众号关注时发送的第一句推送' => '公众号关注时发送的第一句推送',\r\n  '网站LOGO' => '网站LOGO',\r\n  '后台模板风格' => '后台模板风格',\r\n  '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。' => '内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。',\r\n  '是否绑定多域名' => '是否绑定多域名',\r\n  '开启绑定多域名后，需要到插件中配置' => '开启绑定多域名后，需要到插件中配置',\r\n  '网站SEO网址' => '网站SEO网址',\r\n  '一般不填，全局网址，最后不带/,如：http://www.xxx.com' => '一般不填，全局网址，最后不带/,如：http://www.xxx.com',\r\n  '基本信息下扩展' => '基本信息下扩展',\r\n  '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下' => '新增字段是否显示在【基本信息】底部，默认在【扩展信息】下',\r\n  '订单超时' => '订单超时',\r\n  '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制' => '按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制',\r\n  '开启层级URL' => '开启层级URL',\r\n  '默认关闭层级URL，开启后URL会按照父类层级展现' => '默认关闭层级URL，开启后URL会按照父类层级展现',\r\n  '缓存完整页面' => '缓存完整页面',\r\n  '前台完整页面缓存，结合缓存时间，可以提高访问速度' => '前台完整页面缓存，结合缓存时间，可以提高访问速度',\r\n  '自动生成静态HTML' => '自动生成静态HTML',\r\n  '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面' => '前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面',\r\n  'PC静态文件目录' => 'PC静态文件目录',\r\n  '电脑端静态HTML存放目录，默认根目录[ / ]' => '电脑端静态HTML存放目录，默认根目录[ / ]',\r\n  'WAP静态文件目录' => 'WAP静态文件目录',\r\n  '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱' => '手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱',\r\n  '是否留言自动审核' => '是否留言自动审核',\r\n  '开启后，留言自动审核（显示）' => '开启后，留言自动审核（显示）',\r\n  '是否评论自动审核' => '是否评论自动审核',\r\n  '开启后评论自动审核（显示）' => '开启后评论自动审核（显示）',\r\n  '网站敏感词过滤' => '网站敏感词过滤',\r\n  '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容' => '将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容',\r\n  '是否开启水印' => '是否开启水印',\r\n  '开启水印需要上传水印图片' => '开启水印需要上传水印图片',\r\n  '水印图片' => '水印图片',\r\n  '水印图片在250px以内' => '水印图片在250px以内',\r\n  '水印位置' => '水印位置',\r\n  '参考键盘九宫格1-9' => '参考键盘九宫格1-9',\r\n  '水印透明度' => '水印透明度',\r\n  '透明度越大，越难看清楚水印' => '透明度越大，越难看清楚水印',\r\n  '钱包兑换率' => '钱包兑换率',\r\n  '站内钱包与RMB的兑换率，即1元=多少金币' => '站内钱包与RMB的兑换率，即1元=多少金币',\r\n  '积分兑换率' => '积分兑换率',\r\n  '站内积分与RMB的兑换率，即1元=多少积分' => '站内积分与RMB的兑换率，即1元=多少积分',\r\n  '积分支付' => '积分支付',\r\n  '开启积分支付后，商品可以用积分支付' => '开启积分支付后，商品可以用积分支付',\r\n  '开启钱包支付后，商品可以用钱包支付' => '开启钱包支付后，商品可以用钱包支付',\r\n  '开启微信支付后，商品可以用微信支付' => '开启微信支付后，商品可以用微信支付',\r\n  '开启支付宝支付后，商品可以用支付宝支付' => '开启支付宝支付后，商品可以用支付宝支付',\r\n  '每次登录奖励' => '每次登录奖励',\r\n  '每天登录奖励积分数，最小为0，每天登录只奖励一次' => '每天登录奖励积分数，最小为0，每天登录只奖励一次',\r\n  '开启登录奖励后，登录后就会获得积分奖励' => '开启登录奖励后，登录后就会获得积分奖励',\r\n  '开启后，发布内容会奖励积分' => '开启后，发布内容会奖励积分',\r\n  '每次发布奖励' => '每次发布奖励',\r\n  '每次发布内容奖励积分数' => '每次发布内容奖励积分数',\r\n  '每天发布最高奖励' => '每天发布最高奖励',\r\n  '每天奖励不超过积分上限，设置0则无上限' => '每天奖励不超过积分上限，设置0则无上限',\r\n  '开启后，发布内容被收藏会奖励积分' => '开启后，发布内容被收藏会奖励积分',\r\n  '每次收藏奖励' => '每次收藏奖励',\r\n  '每次发布内容被收藏奖励积分数' => '每次发布内容被收藏奖励积分数',\r\n  '每天收藏最高奖励' => '每天收藏最高奖励',\r\n  '开启后，发布内容被点赞会奖励积分' => '开启后，发布内容被点赞会奖励积分',\r\n  '每次点赞奖励' => '每次点赞奖励',\r\n  '每次发布内容被点赞奖励积分数' => '每次发布内容被点赞奖励积分数',\r\n  '每天点赞最高奖励' => '每天点赞最高奖励',\r\n  '开启后，发布内容被评论会奖励积分' => '开启后，发布内容被评论会奖励积分',\r\n  '每次评论奖励' => '每次评论奖励',\r\n  '每次发布内容被评论奖励积分数' => '每次发布内容被评论奖励积分数',\r\n  '每天评论最高奖励' => '每天评论最高奖励',\r\n  '开启后，用户被粉丝关注会奖励积分' => '开启后，用户被粉丝关注会奖励积分',\r\n  '每次关注奖励' => '每次关注奖励',\r\n  '每次被关注奖励积分数' => '每次被关注奖励积分数',\r\n  '每天关注最高奖励' => '每天关注最高奖励',\r\n  '每天关注奖励不超过积分上限，设置0则无上限' => '每天关注奖励不超过积分上限，设置0则无上限',\r\n  '发送邮件' => '发送邮件',\r\n  '是否开启邮件发送' => '是否开启邮件发送',\r\n  '关闭网站' => '关闭网站',\r\n  '关闭网站后，前台无法访问，后台可以进入' => '关闭网站后，前台无法访问，后台可以进入',\r\n  '关站提示' => '关站提示',\r\n  '后台文件存储路径' => '后台文件存储路径',\r\n  '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]' => '默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]',\r\n  '前台文件存储路径' => '前台文件存储路径',\r\n  '是否开启前台AJAX' => '是否开启前台AJAX',\r\n  '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据' => '开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据',\r\n  '自动生成sitemap' => '自动生成sitemap',\r\n  '开启后，前台访问每天会自动生成1次sitemap' => '开启后，前台访问每天会自动生成1次sitemap',\r\n  '是否开启邀请奖励' => '是否开启邀请奖励',\r\n  '开启邀请后则会奖励' => '开启邀请后则会奖励',\r\n  '邀请奖励类型' => '邀请奖励类型',\r\n  '邀请奖励数量' => '邀请奖励数量',\r\n  '网站手机' => '网站手机',\r\n  '站长微信' => '站长微信',\r\n  '开启多图描述' => '开启多图描述',\r\n  '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)' => '开启后图集每张图可以添加描述，注意模板输出需要更改输出方式！(附件同理)',\r\n  '前台用户注册' => '前台用户注册',\r\n  '关闭前台注册后，前台无法进入注册页面' => '关闭前台注册后，前台无法进入注册页面',\r\n  '仅邀请码注册' => '仅邀请码注册',\r\n  '开启后，必须通过邀请链接才能注册！' => '开启后，必须通过邀请链接才能注册！',\r\n  '允许前台发布模块' => '允许前台发布模块',\r\n  '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割',\r\n  '前台搜索的字段' => '前台搜索的字段',\r\n  '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割',\r\n  '前台验证码' => '前台验证码',\r\n  '关闭后，登录注册不需要验证码' => '关闭后，登录注册不需要验证码',\r\n  '后台验证码' => '后台验证码',\r\n  '关闭后，后台管理员登录不需要验证码' => '关闭后，后台管理员登录不需要验证码',\r\n  'TAG包含模型' => 'TAG包含模型',\r\n  '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product' => '在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product',\r\n  '支付配置' => '支付配置',\r\n  '前台多模块搜索的字段' => '前台多模块搜索的字段',\r\n  '多个模块直接必须都有相同的字段，否则会报错' => '多个模块直接必须都有相同的字段，否则会报错',\r\n  '多模块允许搜索的表' => '多模块允许搜索的表',\r\n  '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product' => '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product',\r\n  '允许查询显示的字段' => '允许查询显示的字段',\r\n  '多模块搜索允许查询显示的字段' => '多模块搜索允许查询显示的字段',\r\n  '前台编辑器设置' => '前台编辑器设置',\r\n  '前台的编辑器功能菜单设置' => '前台的编辑器功能菜单设置',\r\n  'PHP调试' => 'PHP调试',\r\n  '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。' => '测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。',\r\n  '前台SESSION' => '前台SESSION',\r\n  '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭' => '关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以开启，使用会员支付等必须关闭',\r\n  '留言验证码' => '留言验证码',\r\n  '开启后，前台留言需要填写验证码' => '开启后，前台留言需要填写验证码',\r\n  '前台发布审核' => '前台发布审核',\r\n  '开启后需要后台审核，关闭则不需要' => '开启后需要后台审核，关闭则不需要',\r\n  '公共权限' => '公共权限',\r\n  '前台网站' => '前台网站',\r\n  '会员登录' => '会员登录',\r\n  '会员评论' => '会员评论',\r\n  '网站筛选' => '网站筛选',\r\n  '会员下单' => '会员下单',\r\n  '网站支付' => '网站支付',\r\n  '极致支付' => '极致支付',\r\n  '微信模块' => '微信模块',\r\n  '验证码生成' => '验证码生成',\r\n  '检查是否登录' => '检查是否登录',\r\n  '多附件上传' => '多附件上传',\r\n  '单附件上传' => '单附件上传',\r\n  '二维码生成' => '二维码生成',\r\n  '获取扩展信息' => '获取扩展信息',\r\n  '链接错误提示' => '链接错误提示',\r\n  '报错提示' => '报错提示',\r\n  '网站内容' => '网站内容',\r\n  '详情内容' => '详情内容',\r\n  '网站搜索' => '网站搜索',\r\n  '网站多模块搜索' => '网站多模块搜索',\r\n  '开启网站缓存' => '开启网站缓存',\r\n  '输出缓存' => '输出缓存',\r\n  '个人中心首页' => '个人中心首页',\r\n  '会员资料' => '会员资料',\r\n  '订单记录' => '订单记录',\r\n  '订单支付' => '订单支付',\r\n  '删除订单' => '删除订单',\r\n  '上传头像' => '上传头像',\r\n  '删除评论' => '删除评论',\r\n  '点赞文章' => '点赞文章',\r\n  '点赞列表' => '点赞列表',\r\n  '收藏文章' => '收藏文章',\r\n  '收藏列表' => '收藏列表',\r\n  '删除收藏' => '删除收藏',\r\n  '购物车' => '购物车',\r\n  '添加购物车' => '添加购物车',\r\n  '删除购物车' => '删除购物车',\r\n  '发布管理' => '发布管理',\r\n  '会员发布' => '会员发布',\r\n  '删除发布' => '删除发布',\r\n  '会员上传附件' => '会员上传附件',\r\n  '404提示' => '404提示',\r\n  '关注用户' => '关注用户',\r\n  '取消关注' => '取消关注',\r\n  '粉丝列表' => '粉丝列表',\r\n  '消息提醒' => '消息提醒',\r\n  '查看消息' => '查看消息',\r\n  '删除消息' => '删除消息',\r\n  '公共主页' => '公共主页',\r\n  '消息提醒设置' => '消息提醒设置',\r\n  '获取栏目列表' => '获取栏目列表',\r\n  '用户钱包' => '用户钱包',\r\n  '交易详情' => '交易详情',\r\n  '登录首页' => '登录首页',\r\n  '注册页面' => '注册页面',\r\n  '忘记密码' => '忘记密码',\r\n  '未登录页面' => '未登录页面',\r\n  '退出登录' => '退出登录',\r\n  '发送留言' => '发送留言',\r\n  '发表评论' => '发表评论',\r\n  '筛选列表' => '筛选列表',\r\n  '创建订单' => '创建订单',\r\n  'TAG标签列表' => 'TAG标签列表',\r\n  '会员' => '会员',\r\n  '订单' => '订单',\r\n  '评论' => '评论',\r\n  '留言' => '留言',\r\n  '轮播图' => '轮播图',\r\n  '友情链接' => '友情链接',\r\n  'TAG' => 'TAG',\r\n  '单页' => '单页',\r\n  '用户评价' => '用户评价',\r\n  '添加会员' => '添加会员',\r\n  '修改会员' => '修改会员',\r\n  '删除会员' => '删除会员',\r\n  '修改状态' => '修改状态',\r\n  '内容管理' => '内容管理',\r\n  '内容列表' => '内容列表',\r\n  '添加内容' => '添加内容',\r\n  '修改内容' => '修改内容',\r\n  '删除内容' => '删除内容',\r\n  '复制内容' => '复制内容',\r\n  '修改评论' => '修改评论',\r\n  '修改留言' => '修改留言',\r\n  '删除留言' => '删除留言',\r\n  '字段列表' => '字段列表',\r\n  '删除字段' => '删除字段',\r\n  '获取字段' => '获取字段',\r\n  '基本功能' => '基本功能',\r\n  '系统界面' => '系统界面',\r\n  '数据库备份' => '数据库备份',\r\n  '数据库还原' => '数据库还原',\r\n  '数据库删除' => '数据库删除',\r\n  '系统功能' => '系统功能',\r\n  '栏目管理' => '栏目管理',\r\n  '栏目列表' => '栏目列表',\r\n  '新增栏目' => '新增栏目',\r\n  '修改栏目' => '修改栏目',\r\n  '删除栏目' => '删除栏目',\r\n  '修改排序' => '修改排序',\r\n  '栏目隐藏' => '栏目隐藏',\r\n  '新增角色' => '新增角色',\r\n  '修改角色' => '修改角色',\r\n  '删除角色' => '删除角色',\r\n  '角色状态' => '角色状态',\r\n  '新增管理员' => '新增管理员',\r\n  '修改管理员' => '修改管理员',\r\n  '管理员状态' => '管理员状态',\r\n  '删除管理员' => '删除管理员',\r\n  '模型列表' => '模型列表',\r\n  '删除模型' => '删除模型',\r\n  '新增权限' => '新增权限',\r\n  '修改权限' => '修改权限',\r\n  '删除权限' => '删除权限',\r\n  '桌面设置' => '桌面设置',\r\n  '新增桌面' => '新增桌面',\r\n  '修改桌面' => '修改桌面',\r\n  '删除桌面' => '删除桌面',\r\n  '图标库' => '图标库',\r\n  '模块扩展' => '模块扩展',\r\n  '删除轮播图' => '删除轮播图',\r\n  '复制轮播图' => '复制轮播图',\r\n  '批量删除轮播图' => '批量删除轮播图',\r\n  '新增轮播图分类' => '新增轮播图分类',\r\n  '修改轮播图分类' => '修改轮播图分类',\r\n  '删除轮播图分类' => '删除轮播图分类',\r\n  '新增友链' => '新增友链',\r\n  '修改友链' => '修改友链',\r\n  '复制友链' => '复制友链',\r\n  '删除友链' => '删除友链',\r\n  '批量删除友链' => '批量删除友链',\r\n  '通用模块' => '通用模块',\r\n  '更新cookie' => '更新cookie',\r\n  '商品管理' => '商品管理',\r\n  '商品列表' => '商品列表',\r\n  '修改商品' => '修改商品',\r\n  '删除商品' => '删除商品',\r\n  '复制商品' => '复制商品',\r\n  '登录日志' => '登录日志',\r\n  '新增分组' => '新增分组',\r\n  '修改分组' => '修改分组',\r\n  '更改分组状态' => '更改分组状态',\r\n  '删除分组' => '删除分组',\r\n  '会员权限' => '会员权限',\r\n  '修改分组排序' => '修改分组排序',\r\n  '上传支付证书' => '上传支付证书',\r\n  '更改状态' => '更改状态',\r\n  '安装卸载' => '安装卸载',\r\n  '删除图库图片' => '删除图库图片',\r\n  '批量删除图库' => '批量删除图库',\r\n  '微信公众号' => '微信公众号',\r\n  '公众号菜单' => '公众号菜单',\r\n  '公众号素材' => '公众号素材',\r\n  '模板制作' => '模板制作',\r\n  '获取首字母拼音' => '获取首字母拼音',\r\n  '批量新增栏目' => '批量新增栏目',\r\n  '自定义配置删除' => '自定义配置删除',\r\n  'TAG列表' => 'TAG列表',\r\n  '新增TAG' => '新增TAG',\r\n  '修改TAG' => '修改TAG',\r\n  '复制TAG' => '复制TAG',\r\n  '删除TAG' => '删除TAG',\r\n  '批量删除TAG' => '批量删除TAG',\r\n  '生成静态文件' => '生成静态文件',\r\n  '更新栏目HTML' => '更新栏目HTML',\r\n  '更新模块HTML' => '更新模块HTML',\r\n  '批量修改推荐属性' => '批量修改推荐属性',\r\n  '批量修改友链栏目' => '批量修改友链栏目',\r\n  '批量修改TAG栏目' => '批量修改TAG栏目',\r\n  '批量复制友链' => '批量复制友链',\r\n  '批量复制TAG' => '批量复制TAG',\r\n  '批量修改友链排序' => '批量修改友链排序',\r\n  '批量修改TAG排序' => '批量修改TAG排序',\r\n  '高级设置' => '高级设置',\r\n  '邮箱订单' => '邮箱订单',\r\n  '公众号配置' => '公众号配置',\r\n  '批量审核友链' => '批量审核友链',\r\n  '批量审核TAG' => '批量审核TAG',\r\n  '手动充值' => '手动充值',\r\n  '删除记录' => '删除记录',\r\n  '批量删除记录' => '批量删除记录',\r\n  '积分配置' => '积分配置',\r\n  '插件更新' => '插件更新',\r\n  '获取栏目模板' => '获取栏目模板',\r\n  '友链分类' => '友链分类',\r\n  '新增友链分类' => '新增友链分类',\r\n  '修改友链分类' => '修改友链分类',\r\n  '删除友链分类' => '删除友链分类',\r\n  '导航设置' => '导航设置',\r\n  '删除导航' => '删除导航',\r\n  '碎片化' => '碎片化',\r\n  '删除碎片' => '删除碎片',\r\n  '预览SQL' => '预览SQL',\r\n  '搜索配置' => '搜索配置',\r\n  '修改字段属性' => '修改字段属性',\r\n  '新增推荐属性' => '新增推荐属性',\r\n  '删除推荐属性' => '删除推荐属性',\r\n  '列表设置' => '列表设置',\r\n  '获取列表字段' => '获取列表字段',\r\n  '内链模块' => '内链模块',\r\n  '内链列表' => '内链列表',\r\n  '新增内链' => '新增内链',\r\n  '删除内链' => '删除内链',\r\n  '删除数据' => '删除数据',\r\n  '模板更新' => '模板更新',\r\n  '用户评价列表' => '用户评价列表',\r\n  '新增用户评价' => '新增用户评价',\r\n  '修改用户评价' => '修改用户评价',\r\n  '复制用户评价' => '复制用户评价',\r\n  '删除用户评价' => '删除用户评价',\r\n  '批量删除用户评价' => '批量删除用户评价',\r\n  '批量修改用户评价栏目' => '批量修改用户评价栏目',\r\n  '批量复制用户评价' => '批量复制用户评价',\r\n  '批量修改用户评价列表' => '批量修改用户评价列表',\r\n  '批量审核用户评价' => '批量审核用户评价',\r\n  '基本设置' => '基本设置',\r\n  '邮件订单' => '邮件订单',\r\n  '非超级管理员无法设置！' => '非超级管理员无法设置！',\r\n    '你确定要还原吗？' => '你确定要还原吗？',\r\n); ?>"
  },
  {
    "path": "app/home/plugins/.gitkeep",
    "content": ""
  },
  {
    "path": "app/home/template/.gitkeep",
    "content": ""
  },
  {
    "path": "backup/.gitkeep",
    "content": ""
  },
  {
    "path": "conf/Functions.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2018/02\n// +----------------------------------------------------------------------\n\n\n\n/*****************\n * 项目公共函数 *\n *****************/\n\ninclude(APP_PATH.'conf/FunctionsExt.php');\n// 获取系统配置\nif(!function_exists('webConf')){\n    function webConf($str=null){\n        //v1.3 取消文件存储\n        //$web_config = include(APP_PATH.'Conf/webconf.php');\n        $webconfig = getCache('webconfig');\n        if(!$webconfig){\n            $wcf = M('sysconfig')->findAll();\n            $webconfig = array();\n            foreach($wcf as $k=>$v){\n                if($v['field']=='web_js' || $v['field']=='ueditor_config'){\n                    $v['data'] = html_decode($v['data']);\n                }\n                $webconfig[$v['field']] = $v['data'];\n            }\n            setCache('webconfig',$webconfig);\n        }\n\n\n        if($str!=null){\n            if(!array_key_exists($str,$webconfig)){\n                return false;\n            }\n            return $webconfig[$str];\n        }else{\n            return $webconfig;\n        }\n    }\n}\n// 获取系统扩展配置--历史方法暂无作用\nif(!function_exists('get_custom')) {\n    function get_custom($str = null)\n    {\n        return webConf($str);\n    }\n}\n// 获取前台模板\nif(!function_exists('get_template')) {\n    function get_template()\n    {\n        $hometpl = isMobile() ? (isWeixin() ? getCache('wxhometpl') : getCache('mobilehometpl')) : getCache('hometpl');\n        if ($hometpl) {\n            return $hometpl;\n        }\n        $webconf = webConf();\n        $isgo = true;\n        //检测是否安装插件\n        $res = M('plugins')->find(['filepath' => 'website', 'isopen' => 1]);\n        if ($res && $res['config']) {\n            $website = $_SERVER['HTTP_HOST'];\n            $config = json_decode($res['config'], 1);\n            $pc = $webconf['pc_template'];\n            $wap = $webconf['wap_template'];\n            $wechat = $webconf['weixin_template'];\n            foreach ($config as $v) {\n                if ($v['website'] == $website) {\n                    $isgo = false;\n                    $v['model'] = (int)$v['model'];\n                    switch ($v['model']) {\n                        case 0:\n                            $pc = $wap = $wechat = $v['tpl'];\n                            break;\n                        case 1:\n                            $pc = $v['tpl'];\n                            break;\n                        case 2:\n                            $wap = $v['tpl'];\n                            break;\n                        case 3:\n                            $wechat = $v['tpl'];\n                            break;\n                    }\n                }\n            }\n            //当前端口检测\n            if ($webconf['iswap'] == 1 && isMobile()) {\n                $template = $wap;\n                //wap\n                if (isWeixin()) {\n                    //wechat\n                    $template = $wechat;\n                }\n\n\n            } else {\n                //pc\n                $template = $pc;\n            }\n\n\n            if ($template == '') {\n                //全局\n                $isgo = true;//直接跳转下面进行默认设置\n            }\n\n        }\n        if ($isgo) {\n            if ($webconf['iswap'] == 1 && isMobile()) {\n                if (isWeixin()) {\n                    $template = ($webconf['weixin_template'] != '') ? $webconf['weixin_template'] : $webconf['wap_template'];\n                } else {\n                    $template = $webconf['wap_template'];\n                }\n\n            } else {\n                $template = $webconf['pc_template'];\n            }\n\n        }\n        if (isMobile()) {\n            if (isWeixin()) {\n                setCache('wxhometpl', $template);\n            } else {\n                setCache('mobilehometpl', $template);\n            }\n        } else {\n            setCache('hometpl', $template);\n        }\n\n        return $template;\n    }\n}\n// 发送http请求\nif(!function_exists('curl_http')) {\n    function curl_http($url, $data = null, $method = 'GET')\n    {\n        if (is_array($data)) {\n            $data = http_build_query($data);\n        }\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_HEADER, false);\n        if ($method != 'GET') {\n            curl_setopt($ch, CURLOPT_POST, 1);\n        }\n        if ($data != null) {\n            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);\n        }\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  //结果是否显示出来，1不显示，0显示\n        //判断是否https\n        if (strpos($url, 'https://') !== false) {\n            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n            $UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';\n            curl_setopt($ch, CURLOPT_USERAGENT, $UserAgent);\n        }\n\n\n        $data = curl_exec($ch);\n        curl_close($ch);\n        if ($data === FALSE) {\n            $data = \"curl Error:\" . curl_error($ch);\n        }\n        return $data;\n    }\n}\n// 分页处理\nif(!function_exists('get_all_page')) {\n    function get_all_page($url, $start = 5, $end = 0, $match = '{$}')\n    {\n        $urls = array();\n        if ($end == 0) {\n            for ($i = 1; $i <= $start; $i++) {\n                $urls[] = str_ireplace($match, $i, $url);\n            }\n        } else {\n\n            for ($i = $start; $i <= $end; $i++) {\n                $urls[] = str_ireplace($match, $i, $url);\n            }\n        }\n\n        return $urls;\n\n    }\n}\n// 获取管理员信息\nif(!function_exists('adminInfo')) {\n    function adminInfo($id, $str = null)\n    {\n        $user = M('level')->find('id=' . $id);\n        if ($str != null) {\n            return $user[$str];\n        }\n        return $user;\n\n    }\n}\n// 检查是否有路由权限\nif(!function_exists('checkAction')) {\n    function checkAction($action)\n    {\n        if (!isset($_SESSION['admin'])) {\n            Error('登录超时,请重新登录！');\n        }\n        $action = ucfirst($action);\n        $paction = $_SESSION['admin']['paction'];\n        if ($_SESSION['admin']['isadmin'] != 1) {\n\n            if (strpos($action, '/') !== false) {\n                if (strpos($paction, ',' . $action . ',') !== false) {\n                    return true;\n                } else {\n                    $d = explode('/', $action);\n                    if (strpos($paction, ',' . $d[0] . ',') !== false) {\n                        return true;\n                    } else {\n                        return false;\n                    }\n\n                }\n            } else {\n                if (strpos($paction, ',' . $action . ',') !== false) {\n                    return true;\n                } else {\n                    return false;\n                }\n            }\n\n\n        } else {\n            return true;\n        }\n\n\n    }\n}\n/**\n * 递归实现无限极分类\n * @param $array 分类数据\n * @param $pid 父ID\n * @param $level 分类级别\n * @return $list 分好类的数组 直接遍历即可 $level可以用来遍历缩进\n */\nif(!function_exists('getTree')) {\n    function getTree($array, $pid = 0, $level = 0)\n    {\n\n        //声明静态数组,避免递归调用时,多次声明导致数组覆盖\n        static $list = [];\n        if ($level == 0) {\n            $list = [];\n        }\n        foreach ($array as $key => $value) {\n\n            //判断是否有下级---存在多次处理的bug v1.3已解决\n            //$value['haschild'] = haschild($array,$value['id']);\n            //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点\n            if ($value['pid'] == $pid) {\n                //父节点为根节点的节点,级别为0，也就是第一级\n                $value['level'] = $level;\n                //把数组放到list中\n                $list[] = $value;\n                //把这个节点从数组中移除,减少后续递归消耗\n                unset($array[$key]);\n                //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1\n                getTree($array, $value['id'], $level + 1);\n\n            }\n        }\n        return $list;\n    }\n}\n// 栏目是否有下级\nif(!function_exists('haschild')) {\n    function haschild($array, $pid)\n    {\n        $n = false;\n        foreach ($array as $v) {\n            if ($v['pid'] == $pid) {\n                $n = true;\n                break;\n            }\n        }\n        return $n;\n    }\n}\n// 栏目格式化树状结构\nif(!function_exists('show_tree')) {\n    function show_tree($array)\n    {\n        foreach ($array as $value) {\n            echo str_repeat('--', $value['level']), $value['classname'] . '<br />';\n        }\n    }\n}\n// 子栏目处理\nif(!function_exists('set_class_haschild')) {\n    function set_class_haschild($classtype = null)\n    {\n\n        $newarray = [];//组建新栏目数组\n        foreach ($classtype as $k => $v) {\n\n            $v['haschild'] = false;//默认所有都没有下级\n            $newarray[$v['id']] = $v;\n\n\n        }\n        foreach ($newarray as $k => $v) {\n            if ($v['pid'] != 0) {\n                //找到有上级的栏目，那么上级栏目就有下级了。。。。\n                $newarray[$v['pid']]['haschild'] = true;\n            }\n\n        }\n        return $newarray;\n\n    }\n}\n// 获取栏目树状结构\nif(!function_exists('get_classtype_tree')) {\n    function get_classtype_tree()\n    {\n\n        $classtypetree = getCache('classtypetree');\n        if (!$classtypetree) {\n\n            $classtype = M('classtype')->findAll(['isclose' => 0], 'orders desc');\n            $classtype = set_class_haschild($classtype);\n            $classtypetree = getTree($classtype);\n            setCache('classtypetree', $classtypetree);\n        }\n\n        return $classtypetree;\n\n    }\n}\n// 获取栏目数据\nif(!function_exists('classTypeData')) {\n    function classTypeData()\n    {\n        $res = getCache('classtype');\n        $cache_time = (int)webConf('cache_time');\n        if (!$res || !$cache_time) {\n            $classtypedata = get_classtype_tree();\n            $d = array();\n            $www = webConf('domain') ? webConf('domain') : get_domain();\n            $htmlpath = webConf('pc_html');\n            $htmlpath = ($htmlpath == '' || $htmlpath == '/') ? '' : '/' . $htmlpath;\n            foreach ($classtypedata as $k => $v) {\n                $d[$v['id']] = $v;\n                if ($v['gourl'] != '') {\n                    $d[$v['id']]['url'] = $v['gourl'];\n                } else {\n                    $file_txt = File_TXT_HIDE ? '' : '.html';\n                    if ($file_txt == '') {\n                        $file_txt = CLASS_HIDE_SLASH ? $file_txt : $file_txt . '/';\n                    }\n                    $d[$v['id']]['url'] = $www . $htmlpath . '/' . $v['htmlurl'] . $file_txt;\n                }\n\n            }\n\n            setCache('classtype', $d, $cache_time);\n            return $d;\n        }\n        return $res;\n\n\n    }\n}\n// 获取手机端栏目数据\nif(!function_exists('classTypeDataMobile')) {\n    function classTypeDataMobile()\n    {\n        $res = getCache('mobileclasstype');\n        $cache_time = (int)webConf('cache_time');\n        if (!$res || !$cache_time) {\n            $classtypedata = get_classtype_tree();\n            $d = array();\n            $www = webConf('domain') ? webConf('domain') : get_domain();\n            $htmlpath = webConf('mobile_html');\n            $htmlpath = ($htmlpath == '' || $htmlpath == '/') ? '' : '/' . $htmlpath;\n            foreach ($classtypedata as $k => $v) {\n                $d[$v['id']] = $v;\n                if ($v['gourl'] != '') {\n                    $d[$v['id']]['url'] = $v['gourl'];\n                } else {\n                    $file_txt = File_TXT_HIDE ? '' : '.html';\n                    if ($file_txt == '') {\n                        $file_txt = CLASS_HIDE_SLASH ? $file_txt : $file_txt . '/';\n                    }\n                    $d[$v['id']]['url'] = $www . $htmlpath . '/' . $v['htmlurl'] . $file_txt;\n                }\n\n            }\n\n            setCache('mobileclasstype', $d, $cache_time);\n            return $d;\n        }\n        return $res;\n\n\n    }\n}\n// 检查两个栏目id是否为子栏目\nif(!function_exists('checkClass')) {\n    function checkClass($pid, $tid){\n\n        $class = M('classtype')->find(array('id' => $pid));\n\n        if ($class['pid'] == $tid) {\n            return true;\n        }\n\n\n        if ($class['pid'] == 0) {\n            return false;\n        } else {\n            checkClass($class['pid'], $tid);\n        }\n    }\n}\n//获取栏目的所有下级\n/*\n@param type\t\t\t\t当前栏目数组\n@param classtype  已被getTree格式化数组\n@param code       获取内容类型\n\t1输出所有数组\n\t2输出直系子类id\n\t3输出全系子类ids\n\t4输出直系子类数组children\n\t5输出全系子类数组childrens\n*/\nif(!function_exists('get_children')) {\n    function get_children($type, $classtype = null, $code = 1)\n    {\n        if ($type == null || $classtype == null) {\n            Error_msg('参数错误！');\n        }\n\n        $children = array();\n        $childrens = array();\n        $alldata = array();\n        $go = false;\n        $children_id = [];\n        $children_ids[] = $type['id'];\n\n        foreach ($classtype as $v) {\n            if ($v['id'] == $type['id']) {\n                $go = true;\n                continue;\n            }\n            if ($v['level'] == $type['level']) {\n                $go = false;\n                continue;\n            }\n            //所有下级\n            if ($v['level'] >= $type['level'] && $go) {\n                $childrens[] = $v;\n                $children_ids[] = $v['id'];\n\n            }\n            //直系下级\n            if ($v['pid'] == $type['id']) {\n                $children[] = $v;\n                $children_id[] = $v['id'];\n            }\n\n\n        }\n        //直系属性\n        $alldata['id'] = $children_id;\n        $alldata['list'] = $children;\n        //全系属性\n        $alldata['ids'] = $children_ids;\n        $alldata['lists'] = $childrens;\n        switch ($code) {\n            case 1:\n                return $alldata;\n                break;\n            case 2:\n                return $children_id;\n                break;\n            case 3:\n                return $children_ids;\n                break;\n            case 4:\n                return $children;\n                break;\n            case 5:\n                return $childrens;\n                break;\n        }\n\n\n    }\n}\n// 获取一个条数据\nif(!function_exists('get_info_table')) {\n    function get_info_table($table, $where = null, $str = null)\n    {\n\n        $data = M($table)->find($where, null, $str);\n        if ($str != null) {\n            return $data[$str];\n        }\n        return $data;\n\n    }\n}\n// 获取多条数据\nif(!function_exists('get_all_info_table')) {\n    function get_all_info_table($table, $where = null, $order = null, $limit = null, $field = null)\n    {\n        $data = M($table)->findAll($where, $order, $field, $limit);\n        return $data;\n    }\n}\n//后台方法-获取表单提交的扩展字段的内容\n/**\n@param data   表单提交的内容\n@param molds  模块标识\n@param isadmin是否后台\n**/\nif(!function_exists('get_fields_data')) {\n    function get_fields_data($data, $molds, $isadmin = 1)\n    {\n        if ($isadmin) {\n            $fields = M('fields')->findAll(['molds' => $molds, 'isadmin' => 1], 'orders desc,id asc');\n        } else {\n            //前台需要判断是否前台显示\n            $fields = M('fields')->findAll(['molds' => $molds, 'isshow' => 1, 'ishome' => 1], 'orders desc,id asc');\n        }\n        $newdata = [];\n        foreach ($fields as $v) {\n            if (array_key_exists($v['field'], $data)) {\n                switch ($v['fieldtype']) {\n                    case 1:\n                    case 2:\n                    case 5:\n                    case 7:\n                    case 9:\n                    case 12:\n                    case 18:\n                    case 21:\n                        $data[$v['field']] = format_param($data[$v['field']], 1);\n                        break;\n                    case 11:\n                        $data[$v['field']] = strtotime(format_param($data[$v['field']], 1));\n                        break;\n                    case 3:\n                        if ($isadmin) {\n                            $text = $data[$v['field']];\n                            if(webConf('islocal')){\n                                $text = remote_data_local($text, $data['tid'], $data['molds']);\n                            }\n                            $data[$v['field']] = format_param($text, 4);\n                        }else{\n                            $text = $data[$v['field']];\n                            if(webConf('islocal')) {\n                                $text = remote_data_local($text, $data['tid'], $data['molds']);\n                            }\n                            $data[$v['field']] = format_param($text, 4);\n                        }\n                        \n                        break;\n                    case 4:\n                    case 13:\n                    case 17:\n                        $data[$v['field']] = format_param($data[$v['field']]);\n                        break;\n                    case 14:\n                        $data[$v['field']] = format_param($data[$v['field']], 3);\n                        break;\n                    case 8:\n                        $r = implode(',', format_param($data[$v['field']], 2));\n                        if ($r) {\n                            $r = ',' . $r . ',';\n                        }\n                        $data[$v['field']] = $r;\n                        break;\n                    case 16:\n                    case 20:\n                        if(is_array($data[$v['field']])){\n                            $data[$v['field']] = $data[$v['field']] ? ',' . implode(',',format_param($data[$v['field']], 2)) . ',' : '';\n                        }else{\n                            $data[$v['field']] = $data[$v['field']] ? ',' . format_param($data[$v['field']], 1) . ',' : '';\n                        }\n                        break;\n                    case 15:\n                        $r = implode('||', format_param($data[$v['field']], 2));\n                        $data[$v['field']] = $r;\n                        break;\n                    case 19:\n                        $data[$v['field']] = format_param($data[$v['field']], 1);\n                        $data[$v['field']] = $data[$v['field']] ? ',' . $data[$v['field']] . ',' : '';\n                        break;\n\n                }\n                $newdata[$v['field']] = $data[$v['field']];\n            } else if (array_key_exists($v['field'] . '_urls', $data)) {\n                switch ($v['fieldtype']) {\n                    case 6:\n                    case 10:\n                        if (array_key_exists($v['field'] . '_des', $data)) {\n                            $pics = format_param($data[$v['field'] . '_urls'], 2);\n                            $pics_des = format_param($data[$v['field'] . '_des'], 2);\n                            foreach ($pics as $k => $vv) {\n                                if ($pics_des[$k]) {\n                                    $pics[$k] = $vv . '|' . $pics_des[$k];\n                                }\n                            }\n                            $data[$v['field']] = implode('||', $pics);\n\n                        } else {\n                            $data[$v['field']] = implode('||', format_param($data[$v['field'] . '_urls'], 2));\n                        }\n\n                        break;\n                }\n                $newdata[$v['field']] = $data[$v['field']];\n            } else {\n                $data[$v['field']] = '';\n\n            }\n            if (isset($data['id'])) {\n                $data['id'] = format_param($data['id']);\n            }\n\n        }\n\n        if ($isadmin) {\n            return $data;\n        } else {\n            //前台只返回允许的字段\n            return $newdata;\n        }\n\n\n    }\n}\n\n// 新增字段-后台列表搜索获取\nif(!function_exists('molds_search')) {\n    function molds_search($molds = null, $data = null)\n    {\n        if ($molds == null) {\n            Error('缺少模块标识！');\n        }\n        $lists = M('Fields')->findAll(array('molds' => $molds, 'issearch' => 1), 'orders desc,id asc');\n        $fields_search = '';\n        $fields_search_check = array();\n        foreach ($lists as $v) {\n            $data[$v['field']] = array_key_exists($v['field'], $data) ? $data[$v['field']] : '';\n            switch ($v['fieldtype']) {\n                case 1:\n                case 2:\n                case 3:\n                case 5:\n                case 6:\n                case 9:\n                case 10:\n                case 14:\n                case 15:\n                    $fields_search .= '<input type=\"text\" name=\"' . $v['field'] . '\" value=\"' . format_param($data[$v['field']], 1) . '\" placeholder=\"请输入' . $v['fieldname'] . '\" autocomplete=\"off\" class=\"layui-input\">';\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \"  \" . $v['field'] . \" like '%\" . format_param($data[$v['field']], 1) . \"%'\";\n                        }\n\n                    }\n                    break;\n                case 4:\n                    $fields_search .= '<input type=\"number\" name=\"' . $v['field'] . '\" value=\"' . format_param($data[$v['field']]) . '\" placeholder=\"请输入' . $v['fieldname'] . '\" autocomplete=\"off\" class=\"layui-input\">';\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \"  \" . $v['field'] . \" = '\" . format_param($data[$v['field']], 1) . \"'\";\n                        }\n\n                    }\n                    break;\n                case 7:\n                case 12:\n                    $fields_search .= '<div class=\"layui-input-inline\">\n\t\t  <select name=\"' . $v['field'] . '\" lay-search=\"\" class=\"layui-inline\">\n\t\t  <option value=\"\">请选择' . $v['fieldname'] . '</option>';\n                    foreach (explode(',', $v['body']) as $vv) {\n                        $s = explode('=', $vv);\n                        $fields_search .= '<option ';\n                        if (array_key_exists($v['field'], $data)) {\n                            if (format_param($data[$v['field']], 1) == $s[1]) {\n                                $fields_search .= 'selected=\"selected\"';\n                            }\n                        }\n                        $fields_search .= 'value=\"' . $s[1] . '\">' . $s[0] . '</option>';\n                    }\n\n                    $fields_search .= '</select>\n\t\t </div>';\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \"  \" . $v['field'] . \" = '\" . format_param($data[$v['field']], 1) . \"'\";\n                        }\n\n                    }\n                    break;\n                case 8:\n                    $fields_search .= '<div class=\"layui-input-inline\">\n\t\t  <select name=\"' . $v['field'] . '\" lay-search=\"\" class=\"layui-inline\">\n\t\t  <option value=\"\">请选择' . $v['fieldname'] . '</option>';\n                    foreach (explode(',', $v['body']) as $vv) {\n                        $s = explode('=', $vv);\n                        $fields_search .= '<option ';\n                        if (array_key_exists($v['field'], $data)) {\n                            if (format_param($data[$v['field']], 1) == $s[1]) {\n                                $fields_search .= 'selected=\"selected\"';\n                            }\n                        }\n                        $fields_search .= 'value=\"' . $s[1] . '\">' . $s[0] . '</option>';\n                    }\n\n                    $fields_search .= '</select>\n\t\t </div>';\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \" \" . $v['field'] . \" like '%,\" . format_param($data[$v['field']], 1) . \",%'\";\n                        }\n\n                    }\n\n                    break;\n                case 11:\n                    $laydate = ($data[$v['field']] == '' || $data[$v['field']] == 0) ? '' : date('Y-m-d', strtotime($data[$v['field']]));\n                    $laytime = ($data[$v['field']] == '' || $data[$v['field']] == 0) ? 0 : strtotime($laydate);\n                    $fields_search .= '<input name=\"' . $v['field'] . '\" value=\"' . $laydate . '\" placeholder=\"请选择' . $v['fieldname'] . '\" id=\"laydate_' . $v['field'] . '\" autocomplete=\"off\" class=\"layui-input\"><script>\nlayui.use(\"laydate\", function(){\nvar laydate = layui.laydate;\nlaydate.render({elem: \"#laydate_' . $v['field'] . '\" });});</script>';\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']]) != 0 && format_param($data[$v['field']])!='') {\n                            $fields_search_check[] = \"  (\" . $v['field'] . \" >= \" . $laytime . \" and \" . $v['field'] . \" < \" . ($laytime + 86400) . \") \";\n                        }\n\n                    }\n                    break;\n                case 13:\n                    $body = explode(',', $v['body']);\n                    $moldsdata = M('molds')->find(['id' => $body[0]]);\n                    $num = M($moldsdata['biaoshi'])->getCount();\n\n                    if ($num > 500) {\n                        $fields_search .= '<input type=\"text\" name=\"' . $v['field'] . '\" value=\"' . format_param($data[$v['field']], 1) . '\" placeholder=\"请输入' . $moldsdata['name'] . 'ID\" autocomplete=\"off\" class=\"layui-input\">';\n                        if (array_key_exists($v['field'], $data)) {\n                            if (format_param($data[$v['field']], 1) != '') {\n                                $fields_search_check[] = \"  \" . $v['field'] . \" like '%\" . format_param($data[$v['field']], 1) . \"%'\";\n                            }\n\n                        }\n                    } else {\n                        $datalist = M($moldsdata['biaoshi'])->findAll(null, 'id desc', 'id,' . $body[1]);\n                        $fields_search .= '<div class=\"layui-input-inline\">\n\t\t\t  <select name=\"' . $v['field'] . '\" lay-search=\"\" class=\"layui-inline\">\n\t\t\t  <option value=\"\">请选择' . $v['fieldname'] . '</option>';\n                        foreach ($datalist as $vv) {\n                            $fields_search .= '<option ';\n                            if (array_key_exists($v['field'], $data)) {\n                                if (format_param($data[$v['field']]) == $vv['id']) {\n                                    $fields_search .= 'selected=\"selected\"';\n                                }\n                            }\n                            $fields_search .= 'value=\"' . $vv['id'] . '\">' . $vv[$body[1]] . '</option>';\n                        }\n\n                        $fields_search .= '</select>\n\t\t\t </div>';\n                    }\n\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \" \" . $v['field'] . \" =\" . format_param($data[$v['field']]) . \" \";\n                        }\n\n                    }\n\n                    break;\n                case 16:\n                    $body = explode(',', $v['body']);\n                    $moldsdata = M('molds')->find(['id' => $body[0]]);\n                    $num = M($moldsdata['biaoshi'])->getCount();\n\n                    if ($num > 500) {\n                        $fields_search .= '<input type=\"text\" name=\"' . $v['field'] . '\" value=\"' . format_param($data[$v['field']], 1) . '\" placeholder=\"请输入' . $moldsdata['name'] . 'ID\" autocomplete=\"off\" class=\"layui-input\">';\n                        if (array_key_exists($v['field'], $data)) {\n                            if (format_param($data[$v['field']], 1) != '') {\n                                $fields_search_check[] = \"  \" . $v['field'] . \" like '%,\" . format_param($data[$v['field']], 1) . \",%'\";\n                            }\n\n                        }\n                    } else {\n                        $datalist = M($moldsdata['biaoshi'])->findAll(['isshow' => 1], 'id desc', 'id,' . $body[1]);\n                        $fields_search .= '<div class=\"layui-input-inline\">\n\t\t\t  <select name=\"' . $v['field'] . '\" lay-search=\"\" class=\"layui-inline\">\n\t\t\t  <option value=\"\">请选择' . $v['fieldname'] . '</option>';\n                        $d = format_param($data[$v['field']]);\n                        foreach ($datalist as $vv) {\n                            $fields_search .= '<option ';\n                            if (array_key_exists($v['field'], $data)) {\n                                if ($d == $vv['id']) {\n                                    $fields_search .= 'selected=\"selected\"';\n                                }\n                            }\n                            $fields_search .= 'value=\"' . $vv['id'] . '\">' . $vv[$body[1]] . '</option>';\n                        }\n\n                        $fields_search .= '</select>\n\t\t\t </div>';\n                    }\n\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \" \" . $v['field'] . \" like '%,\" . format_param($data[$v['field']]) . \",%' \";\n                        }\n\n                    }\n                    break;\n                case 17:\n                    $classtypedata = getclasstypedata(classTypeData());\n                    $classtypetree = get_classtype_tree();\n                    $fields_search .= '<div class=\"layui-input-inline\"><select name=\"tid\" lay-filter=\"tid\" lay-search=\"\" class=\"layui-inline autosubmit\">\n\t\t\t\t  <option value=\"\">请选择栏目</option>';\n                    if ($_SESSION['admin']['isadmin'] != 1) {\n                        $tids = $_SESSION['admin']['tids'];\n                        foreach ($classtypedata as $k => $vs) {\n                            if ($vs['pid'] == 0) {\n                                if (strpos($_SESSION['admin']['tids'], ',' . $vs['id'] . ',') !== false) {\n                                    $children = get_children($vs, $classtypetree, 5);\n                                    foreach ($children as $vv) {\n                                        if (strpos($_SESSION['admin']['tids'], ',' . $vv['id'] . ',') === false) {\n                                            $tids .= $tids ? $vv['id'] . ',' : ',' . $vv['id'] . ',';\n                                        }\n                                    }\n                                }\n                            }\n\n                        }\n\n                    } else {\n                        $tids = '0';\n                    }\n                    $admin = $_SESSION['admin'];\n                    $moldsdata = M('molds')->find(['biaoshi' => $molds]);\n                    $d = format_param($data[$v['field']]);\n                    foreach ($classtypedata as $vs) {\n                        if ($vs['molds'] == $molds) {\n                            if ($admin['classcontrol'] == 0 || $admin['isadmin'] == 1 || strpos($tids, ',' . $vs['id'] . ',') !== false || $moldsdata['iscontrol'] == 0) {\n                                if ($d == $vs['id']) {\n                                    $fields_search .= '<option selected=\"selected\" value=\"' . $vs['id'] . '\">' . str_repeat('--', $vs['level']) . $vs['classname'] . '</option>';\n                                } else {\n                                    $fields_search .= '<option  value=\"' . $vs['id'] . '\">' . str_repeat('--', $vs['level']) . $vs['classname'] . '</option>';\n                                }\n\n                            }\n\n                        }\n\n                    }\n\n                    $fields_search .= '</select>\n\t\t\t\t</div>';\n                    if (array_key_exists($v['field'], $data)) {\n                        if ($d) {\n                            $fields_search_check[] = ' tid in(' . implode(\",\", $classtypedata[$d][\"children\"][\"ids\"]) . ') ';\n                        }\n\n                    }\n\n                    break;\n                case 18:\n\n                    break;\n                case 19:\n                    $fields_search .= '<input type=\"text\" name=\"' . $v['field'] . '\" value=\"' . format_param($data[$v['field']], 1) . '\" placeholder=\"请输入' . $v['fieldname'] . '\" autocomplete=\"off\" class=\"layui-input\">';\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \"  \" . $v['field'] . \" like '%,\" . format_param($data[$v['field']], 1) . \"%,'\";\n                        }\n\n                    }\n                    break;\n                case 20://栏目绑定多选\n                    $body = explode(',', $v['body']);\n                    $tid = (int)$body[0];\n                    $classtypedata = classTypeData();\n                    $molds = $classtypedata[$tid]['molds'];\n                    $moldsdata = M('molds')->find(['biaoshi' => $molds]);\n                    $num = M($molds)->getCount();\n\n                    if ($num > 500) {\n                        $fields_search .= '<input type=\"text\" name=\"' . $v['field'] . '\" value=\"' . format_param($data[$v['field']], 1) . '\" placeholder=\"请输入' . $moldsdata['name'] . 'ID\" autocomplete=\"off\" class=\"layui-input\">';\n                        if (array_key_exists($v['field'], $data)) {\n                            if (format_param($data[$v['field']], 1) != '') {\n                                $fields_search_check[] = \"  \" . $v['field'] . \" like '%,\" . format_param($data[$v['field']], 1) . \",%'\";\n                            }\n\n                        }\n                    } else {\n                        $tids = array_column($classtypedata[$tid]['children']['lists'], 'id');\n                        $tids[] = $tid;\n                        $sql = \" tid in(\" . implode(',', $tids) . \") and isshow=1 \";\n                        $datalist = M($molds)->findAll($sql, 'id desc', 'id,' . $body[1]);\n                        $fields_search .= '<div class=\"layui-input-inline\">\n\t\t\t  <select name=\"' . $v['field'] . '\" lay-search=\"\" class=\"layui-inline\">\n\t\t\t  <option value=\"\">请选择' . $v['fieldname'] . '</option>';\n                        $d = format_param($data[$v['field']]);\n                        foreach ($datalist as $vv) {\n                            $fields_search .= '<option ';\n                            if (array_key_exists($v['field'], $data)) {\n                                if ($d == $vv['id']) {\n                                    $fields_search .= 'selected=\"selected\"';\n                                }\n                            }\n                            $fields_search .= 'value=\"' . $vv['id'] . '\">' . $vv[$body[1]] . '</option>';\n                        }\n\n                        $fields_search .= '</select>\n\t\t\t </div>';\n                    }\n\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \" \" . $v['field'] . \" like '%,\" . format_param($data[$v['field']]) . \",%' \";\n                        }\n\n                    }\n                    break;\n                case 21://栏目绑定单选\n                    $body = explode(',', $v['body']);\n                    $tid = (int)$body[0];\n                    $classtypedata = classTypeData();\n                    $molds = $classtypedata[$tid]['molds'];\n                    $num = M($molds)->getCount();\n                    $moldsdata = M('molds')->find(['biaoshi' => $molds]);\n\n                    if ($num > 500) {\n                        $fields_search .= '<input type=\"text\" name=\"' . $v['field'] . '\" value=\"' . format_param($data[$v['field']], 1) . '\" placeholder=\"请输入' . $moldsdata['name'] . 'ID\" autocomplete=\"off\" class=\"layui-input\">';\n                        if (array_key_exists($v['field'], $data)) {\n                            if (format_param($data[$v['field']], 1) != '') {\n                                $fields_search_check[] = \"  \" . $v['field'] . \" like '%\" . format_param($data[$v['field']], 1) . \"%'\";\n                            }\n\n                        }\n                    } else {\n                        $tids = array_column($classtypedata[$tid]['children']['lists'], 'id');\n                        $tids[] = $tid;\n                        $sql = \" tid in(\" . implode(',', $tids) . \") and isshow=1 \";\n                        $datalist = M($molds)->findAll($sql, 'id desc', 'id,' . $body[1]);\n                        $fields_search .= '<div class=\"layui-input-inline\">\n\t\t\t  <select name=\"' . $v['field'] . '\" lay-search=\"\" class=\"layui-inline\">\n\t\t\t  <option value=\"\">请选择' . $v['fieldname'] . '</option>';\n                        foreach ($datalist as $vv) {\n                            $fields_search .= '<option ';\n                            if (array_key_exists($v['field'], $data)) {\n                                if (format_param($data[$v['field']]) == $vv['id']) {\n                                    $fields_search .= 'selected=\"selected\"';\n                                }\n                            }\n                            $fields_search .= 'value=\"' . $vv['id'] . '\">' . $vv[$body[1]] . '</option>';\n                        }\n\n                        $fields_search .= '</select>\n\t\t\t </div>';\n                    }\n\n                    if (array_key_exists($v['field'], $data)) {\n                        if (format_param($data[$v['field']], 1) != '') {\n                            $fields_search_check[] = \" \" . $v['field'] . \" =\" . format_param($data[$v['field']]) . \" \";\n                        }\n\n                    }\n\n                    break;\n\n\n            }\n\n\n        }\n        if (count($fields_search_check) > 0) {\n            $fields_search_check = implode(' and ', $fields_search_check);\n        } else {\n            $fields_search_check = '';\n        }\n        return array('fields_search' => $fields_search, 'fields_search_check' => $fields_search_check);\n    }\n}\nif(!function_exists('get_classtype')){\n    function get_classtype(){\n        $classtypedata = getCache('jzclasstypedata');\n        if(!$classtypedata){\n            $classtype = M('classtype')->findAll();\n            $classtypedata = [];\n            foreach ($classtype as $v){\n                $classtypedata[$v['id']] = $v;\n            }\n            setCache('jzclasstypedata',$classtypedata);\n        }\n        return $classtypedata;\n    }\n}\n// 后台格式化类型显示\nif(!function_exists('format_fields')) {\n    function format_fields($fields = null, $data = null)\n    {\n        $classtypedata = get_classtype();\n        if ($fields == null) {\n            $list = array(\n\n                'string_10' => '截取10个字',\n                'string_15' => '截取15个字',\n                'date_1' => '日期(Y-m-d)',\n                'date_2' => '日期(Y-m-d H:i:s)',\n            );\n            return $list;\n        } else {\n            switch ($fields['format']) {\n                case 'string_10':\n                    return newstr($data, 10);\n                    break;\n                case 'string_15':\n                    return newstr($data, 15);\n                    break;\n                case 'date_1':\n                    return \"\\t\" . date('Y-m-d', $data) . \"\\t\";\n                    break;\n                case 'date_2':\n                    return \"\\t\" . date('Y-m-d H:i:s', $data) . \"\\t\";\n                    break;\n                default:\n                    if ($fields['fieldtype'] == 7 || $fields['fieldtype'] == 12) {\n                        $r = explode(',', $fields['body']);\n                        foreach ($r as $v) {\n                            $d = explode('=', $v);\n                            if ($d[1] == $data) {\n                                return $d[0];\n                                exit;\n                            }\n                        }\n                    } else if ($fields['fieldtype'] == 8) {\n                        $r = explode(',', $fields['body']);\n                        $rr = array();\n                        foreach ($r as $v) {\n                            $d = explode('=', $v);\n                            if (strpos($data, ',' . $d[1] . ',') !== false) {\n                                $rr[] = $d[0];\n                            }\n                        }\n                        return implode(',', $rr);\n                    } else if ($fields['fieldtype'] == 5) {\n                        $vdata = $data != '' ? '<a href=\"' . $data . '\" target=\"_blank\"><img src=\"' . $data . '\" width=\"100px\"  /></a>' : '';\n                        return $vdata;\n                    } else if ($fields['fieldtype'] == 6) {\n                        //图集\n                        if ($data != '') {\n                            $vdata = explode('||', $data);\n                            $res = '';\n                            foreach ($data as $s) {\n                                if ($s != '') {\n                                    $res .= '<a href=\"' . $s . '\" target=\"_blank\"><img src=\"' . $s . '\" width=\"50px\" /></a>';\n                                }\n                            }\n                            return $res;\n                        } else {\n                            return '';\n                        }\n                    } else if ($fields['fieldtype'] == 9) {\n                        $vdata = $data != '' ? '<a href=\"' . $data . '\" target=\"_blank\">[查看]</a>' : '';\n                        return $vdata;\n                    } else if ($fields['fieldtype'] == 10) {\n                        if ($data != '') {\n                            $vdata = explode('||', $data);\n                            $res = '';\n                            foreach ($data as $s) {\n                                if ($s != '') {\n                                    $res .= '<a href=\"' . $s . '\" target=\"_blank\">[查看]</a>';\n                                }\n                            }\n                            return $res;\n                        } else {\n                            return '';\n                        }\n                    } else if ($fields['fieldtype'] == 11) {\n                        $vdata = $data == 0 ? '-' : \"\\t\" . date('Y-m-d H:i:s', $data) . \"\\t\";\n                        return $vdata;\n                    } else if ($fields['fieldtype'] == 13) {\n                        $body = explode(',', $fields['body']);\n                        $biaoshi = M('molds')->getField(['id' => $body[0]], 'biaoshi');\n                        $res = M($biaoshi)->getField(['id' => $data], $body[1]);\n                        if (!$res) {\n                            return '[ 空 ]';\n                        }\n                        return $res;\n\n\n                    } else if ($fields['fieldtype'] == 16) {\n                        //多选关联\n                        if (trim($data, ',')) {\n                            $res = trim($data, ',');\n                            $body = explode(',', $fields['body']);\n                            $biaoshi = M('molds')->getField(['id' => $body[0]], 'biaoshi');\n                            $all = M($biaoshi)->findAll('id in(' . $res . ')', null, $body[1]);\n                            $ss = '[' . implode(',', array_column($all, $body[1])) . ']';\n                            return $ss;\n                        }\n                    } else if ($fields['fieldtype'] == 17) {\n                        $ids = explode(',', $data);\n                        $name = [];\n                        foreach ($ids as $v) {\n                            $name[] = $classtypedata[$v]['classname'];\n                        }\n                        return implode(',', $name);\n                    } else if ($fields['fieldtype'] == 18) {\n\n                        return $data == 0 ? '[未绑定栏目]' : $classtypedata[$data]['classname'];\n\n                    } else if ($fields['fieldtype'] == 19) {\n                        if ($data) {\n                            return trim($data, ',');\n                        }\n                    } else if ($fields['fieldtype'] == 21) {\n                        $body = explode(',', $fields['body']);\n                        $tid = (int)$body[0];\n                        $molds = $classtypedata[$tid]['molds'];\n                        $res = M($molds)->getField(['id' => $data], $body[1]);\n                        if (!$res) {\n                            return '[ 空 ]';\n                        }\n                        return $res;\n\n\n                    } else if ($fields['fieldtype'] == 20) {\n                        //栏目关联多选\n                        if (trim($data, ',')) {\n                            $res = trim($data, ',');\n                            $body = explode(',', $fields['body']);\n                            $tid = (int)$body[0];\n                            $molds = $classtypedata[$tid]['molds'];\n                            $tids = array_column($classtypedata[$tid]['children']['lists'], 'id');\n                            $tids[] = $tid;\n                            $all = M($molds)->findAll('id in(' . $res . ') and tid in(' . implode(',', $tids) . ')', null, $body[1]);\n                            $ss = '[' . implode(',', array_column($all, $body[1])) . ']';\n\n                            return $ss;\n                        }\n                    }\n                    return $data;\n                    break;\n            }\n        }\n\n    }\n}\n// 图形验证码--旧版本使用-无作用\nif(!function_exists('frvercode')) {\n    function frvercode($num = 4, $str = 'frcode')\n    {\n        //创建随机码\n        $_nmsg = '';\n        for ($i = 0; $i < $num; $i++) {\n            $_nmsg .= dechex(mt_rand(0, 15));\n        }\n        //保存在session里\n        $_SESSION[$str] = md5(md5($_nmsg));\n        //长和高\n        $_width = 75;\n        $_height = 25;\n        //创建图像\n        $_img = imagecreatetruecolor($_width, $_height);\n        $_white = imagecolorallocate($_img, 255, 255, 255);\n        imagefill($_img, 0, 0, $_white);\n        /*\n        //创建黑色边框\n        $_black = imagecolorallocate($_img, 100, 100, 100);\n        imagerectangle($_img, 0, 0, $_width-1, $_height-1, $_black);\n        //随机划线条\n        for ($i=0;$i<6;$i++) {\n        $_rnd_color= imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255)\n        ,mt_rand(0,255));\n        imageline($_img,mt_rand(0,75),mt_rand(0,25),mt_rand(0,75),mt_rand(0,25)\n        ,$_rnd_color);\n        }\n        //随机打雪花\n        for ($i=1;$i<100;$i++) {\n        imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),\"*\",\n        imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));\n        }\n        */\n        //输出验证码\n        for ($i = 0; $i < strlen($_nmsg); $i++) {\n            imagestring($_img, mt_rand(3, 5), $i * $_width / $num + mt_rand(1, 10),\n                mt_rand(1, $_height / 2), $_nmsg[$i],\n                imagecolorallocate($_img, mt_rand(0, 150), mt_rand(0, 100), mt_rand(0, 150)));\n        }\n        //输出图像\n        //ob_clean();\n        header('Content-Type:image/png');\n        imagepng($_img);\n        //销毁\n        imagedestroy($_img);\n\n    }\n}\n// 判断是否包含\nif(!function_exists('aCheckSubstrs')) {\n    function aCheckSubstrs($substrs, $text)\n    {\n        foreach ($substrs as $substr)\n            if (false !== strpos($text, $substr)) {\n                return true;\n            }\n        return false;\n    }\n}\n// 判断是否为手机端\nif(!function_exists('isMobile')) {\n    function isMobile()\n    {\n        $useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';\n        $useragent_commentsblock = preg_match('|\\(.*?\\)|', $useragent, $matches) > 0 ? $matches[0] : '';\n\n        $mobile_os_list = array('Google Wireless Transcoder', 'Windows CE', 'WindowsCE', 'Symbian', 'Android', 'armv6l', 'armv5', 'Mobile', 'CentOS', 'mowser', 'AvantGo', 'Opera Mobi', 'J2ME/MIDP', 'Smartphone', 'Go.Web', 'Palm', 'iPAQ');\n        $mobile_token_list = array('Profile/MIDP', 'Configuration/CLDC-', '160×160', '176×220', '240×240', '240×320', '320×240', 'UP.Browser', 'UP.Link', 'SymbianOS', 'PalmOS', 'PocketPC', 'SonyEricsson', 'Nokia', 'BlackBerry', 'Vodafone', 'BenQ', 'Novarra-Vision', 'Iris', 'NetFront', 'HTC_', 'Xda_', 'SAMSUNG-SGH', 'Wapaka', 'DoCoMo', 'iPhone', 'iPod', 'iPad');\n\n        $found_mobile = aCheckSubstrs($mobile_os_list, $useragent_commentsblock) ||\n            aCheckSubstrs($mobile_token_list, $useragent);\n\n        if ($found_mobile) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n// 判断是否微信端\nif(!function_exists('isWeixin')) {\n    function isWeixin()\n    {\n        if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {\n            return true;\n        }\n        return false;\n    }\n}\n// 获取前台链接\nif(!function_exists('gourl')) {\n    function gourl($id, $htmlurl = null, $molds = 'article')\n    {\n        $www = webConf('domain') ? webConf('domain') : get_domain();\n        if (is_array($id)) {\n            /**\n             * ownurl target id\n             **/\n            $value = $id;\n            if ($value['target']) {\n                return $value['target'];\n            } else {\n                if ($value['ownurl']) {\n                    return $www . '/' . $value['ownurl'];\n\n                }\n            }\n            $id = $value['id'];\n            $htmlurl = $value['htmlurl'];\n        }\n        if (!$id) {\n            Error_msg('缺少ID！');\n        }\n        $htmlpath = (isMobile() && webConf('iswap') == 1) ? webConf('mobile_html') : webConf('pc_html');\n        $htmlpath = ($htmlpath == '' || $htmlpath == '/') ? '' : '/' . $htmlpath;\n        if ($htmlurl != null) {\n            return $www . $htmlpath . '/' . $htmlurl . '/' . $id . '.html';\n        }\n\n        $tid = M($molds)->getField(array('id' => $id), 'tid');\n        $htmlurl = M('classtype')->getField(array('id' => $tid), 'htmlurl');\n        return $www . $htmlpath . '/' . $htmlurl . '/' . $id . '.html';\n    }\n}\n// 获取前台链接--同上\nif(!function_exists('all_url')) {\n    function all_url($id, $molds = 'article', $htmlurl = null){\n        $www = webConf('domain') ? webConf('domain') : get_domain();\n        if (is_array($id)) {\n            /**\n             * ownurl target id\n             **/\n            $value = $id;\n            if ($value['target']) {\n                return $value['target'];\n            } else {\n                if ($value['ownurl']) {\n                    return $www . '/' . $value['ownurl'];\n                }\n            }\n            $id = $value['id'];\n        }\n        if (!$id) {\n            Error_msg('缺少ID！');\n        }\n        $htmlpath = isMobile() && webConf('isopen') ? webConf('mobile_html') : webConf('pc_html');\n        $htmlpath = ($htmlpath == '' || $htmlpath == '/') ? '' : '/' . $htmlpath;\n        if ($htmlurl != null) {\n            $file_txt = File_TXT_HIDE ? '' : '.html';\n            return $www . $htmlpath . '/' . $htmlurl . '/' . $id . $file_txt;\n        }\n        $tid = M($molds)->getField(array('id' => $id), 'tid');\n        $htmlurl = M('classtype')->getField(array('id' => $tid), 'htmlurl');\n        $file_txt = File_TXT_HIDE ? '' : '.html';\n        return $www . $htmlpath . '/' . $htmlurl . '/' . $id . $file_txt;\n    }\n}\n// 自定义递增函数\nif(!function_exists('incrData')) {\n    function incrData($table = null, $id = 0, $field = 'hits', $num = 1)\n    {\n\n        if (!format_param($table, 1)) {\n            Error_msg($table . '表不存在！');\n        }\n        if (!format_param($id)) {\n            Error_msg('缺少ID！');\n        }\n        if (!format_param($field, 1)) {\n            Error_msg('递增字段缺少！');\n        }\n        if (!format_param($num)) {\n            Error_msg('递增数据格式错误！');\n        }\n\n        $r = M($table)->goInc(array('id' => $id), $field, $num);\n        if (!$r) {\n            return '递增失败！';\n        }\n        return M($table)->getField(array('id' => $id), $field);\n    }\n}\n//自定义字段单项/多项选择获取\nif(!function_exists('get_key_field_select')) {\n    function get_key_field_select($key = 0, $molds = null, $field = null)\n    {\n        if ($molds == null || $field == null) {\n            echo '参数molds或field缺少';\n            exit;\n        }\n        $res = M('Fields')->find(array('molds' => $molds, 'field' => $field), null, 'body,fieldtype');\n        if ($res) {\n            $value = explode(',', $res['body']);\n            if ($res['fieldtype'] == 7 || $res['fieldtype'] == 12) {\n                //单选\n                foreach ($value as $v) {\n                    $d = explode('=', $v);\n                    if ($d[1] == $key) {\n                        return $d[0];\n                    }\n                }\n                return false;\n            } else if ($res['fieldtype'] == 13) {\n                $biaoshi = M('molds')->getField(['id' => $value[0]], 'biaoshi');\n                $data = M($biaoshi)->getField(['id' => $key], $value[1]);\n                return $data;\n            } else if ($res['fieldtype'] == 20) {\n                $classtypedata = classTypeData();\n                $tid = (int)$value[0];\n                $biaoshi = $classtypedata[$tid]['molds'];\n                $tids = array_column($classtypedata[$tid]['children']['lists'], 'id');\n                $tids[] = $tid;\n                $sql = \"id in(\" . implode(',', trim($key, ',')) . \") and tid in(\" . implode(',', $tids) . \") \";\n                $data = M($biaoshi)->findAll($sql, null, $value[1]);\n                return array_column($data, $value[1]);\n            } else if ($res['fieldtype'] == 21) {\n                $classtypedata = classTypeData();\n                $tid = (int)$value[0];\n                $biaoshi = $classtypedata[$tid]['molds'];\n                $data = M($biaoshi)->getField(['id' => $key], $value[1]);\n                return $data;\n            } else {\n                $s = array();\n                foreach ($value as $v) {\n                    $d = explode('=', $v);\n                    if (strpos($key, ',' . $d[1] . ',') !== false) {\n                        $s[] = $d[0];\n                    }\n                }\n                return $s;\n            }\n\n\n        } else {\n            return '没有查询到该字段内容！';\n        }\n\n    }\n}\n//根据模型[$molds]、字段[$field]获取并输出内容选项\nif(!function_exists('get_field_select')) {\n    function get_field_select($molds = null, $field = null)\n    {\n        if ($molds == null || $field == null) {\n            echo '参数molds或field缺少';\n            exit;\n        }\n        $res = M('Fields')->find(array('molds' => $molds, 'field' => $field), null, 'body,fieldtype');\n        if ($res) {\n            $value = explode(',', $res['body']);\n            $s = array();\n            foreach ($value as $v) {\n                $s[] = explode('=', $v);\n\n            }\n            return $s;\n\n        } else {\n            return '没有查询到该字段内容！';\n        }\n\n    }\n}\n//获取文件大小\nif(!function_exists('get_file_byte')) {\n    function get_file_byte($file)\n    {\n        $byte = filesize($file);\n\n        $KB = 1024;\n\n        $MB = 1024 * $KB;\n\n        $GB = 1024 * $MB;\n\n        $TB = 1024 * $GB;\n\n        if ($byte < $KB) {\n\n            return $byte . \"B\";\n\n        } elseif ($byte < $MB) {\n\n            return round($byte / $KB, 2) . \"KB\";\n\n        } elseif ($byte < $GB) {\n\n            return round($byte / $MB, 2) . \"MB\";\n\n        } elseif ($byte < $TB) {\n\n            return round($byte / $GB, 2) . \"GB\";\n\n        } else {\n\n            return round($byte / $TB, 2) . \"TB\";\n\n        }\n\n    }\n}\n//获取文章评论\nif(!function_exists('show_comment')) {\n    function show_comment($tid = 0, $id = 0, $str = null)\n    {\n        if ($tid == 0 || $id == 0) {\n            return false;\n        }\n\n        $lists = M('comment')->findAll(['tid' => $tid, 'aid' => $id, 'isshow' => 1], 'addtime asc');\n        $star_num = 0;\n        $count = 0;\n        if ($lists) {\n            foreach ($lists as $k => $v) {\n                $star_num += $v['likes'];\n                $lists[$k]['userinfo'] = M('member')->find(['id' => $v['userid']]);\n                if ($v['likes'] > 0) {\n                    $count += 1;\n                }\n            }\n            $lists = set_class_haschild($lists);\n            $lists = getTree($lists);\n        }\n        if ($count != 0) {\n            $average = round($star_num / $count, 1);\n        } else {\n            $average = 0;\n        }\n        $res = array('data' => $lists, 'star' => $star_num, 'count' => $count, 'average' => $average);\n        if ($str != null) {\n            return $res[$str];\n        }\n        return $res;\n    }\n}\n//获取指定评论用户姓名\nif(!function_exists('get_comment_user')) {\n    function get_comment_user($id)\n    {\n        $userid = M('comment')->getField(['id' => $id], 'userid');\n        if (!$userid) {\n            return '';\n        } else {\n            return M('member')->getField(['id' => $userid], 'username');\n        }\n    }\n}\n//计算评论数量---或者直接comment_num显示\nif(!function_exists('get_comment_num')) {\n    function get_comment_num($tid, $id = 0)\n    {\n        if ($id == 0) {\n            return '缺少ID！';\n        }\n        $count = M('comment')->getCount(['aid' => $id, 'tid' => $tid, 'isshow' => 1]);\n        return $count;\n    }\n}\n//处理数组拼接--Screen筛选功能有使用\nif(!function_exists('change_parse_url')) {\n    function change_parse_url($arr, $str)\n    {\n        if (count($arr) == 0) {\n            return '';\n        }\n        unset($arr[$str]);\n        if (count($arr) == 0) {\n            return '';\n        }\n        $url = str_replace('=', '-', http_build_query($arr, false, '-'));\n        return '-' . $url;\n    }\n}\n//获取扩展字段内容输出\nif(!function_exists('get_fields_show')) {\n    function get_fields_show($tid, $molds)\n    {\n        $sql = array();\n        if ($tid != 0) {\n            $sql[] = \" tids like '%,\" . $tid . \",%' \";\n        }\n\n        $sql[] = \" molds = '\" . $molds . \"' and isshow=1 \";\n        $sql = implode(' and ', $sql);\n        $fields_list = M('Fields')->findAll($sql, 'orders desc,id asc');\n        return $fields_list;\n    }\n}\n//输出指定字段的标题和内容\nif(!function_exists('jz_show_fields')) {\n    function jz_show_fields($data = array(), $fields = null)\n    {\n        $sql = array();\n        if ($data['tid'] != 0) {\n            $sql[] = \" tids like '%,\" . $data['tid'] . \",%' \";\n        }\n        if ($fields) {\n            $arr = explode(',', $fields);\n            $r = [];\n            foreach ($arr as $v) {\n                $r[] = \" field='\" . $v . \"' \";\n            }\n            $sql[] = \" (\" . implode(' or ', $r) . \") \";\n        }\n        $sql[] = \" molds = '\" . $data['molds'] . \"' and isshow=1 \";\n        $sql = implode(' and ', $sql);\n        $fields_list = M('Fields')->findAll($sql, 'orders desc,id asc');\n        $new = [];\n        foreach ($fields_list as $k => $v) {\n            $new[$k]['title'] = $v['fieldname'];\n            $new[$k]['field'] = $v['field'];\n\n            switch ($v['fieldtype']) {\n                case 1:\n                case 2:\n                case 3:\n                case 4:\n                case 5:\n                case 9:\n                case 14:\n                    $new[$k]['data'] = $data[$v['field']];\n                    break;\n                case 6:\n                case 10:\n                case 15:\n                    $new[$k]['data'] = explode('||', $data[$v['field']]);\n                    break;\n                case 7:\n                case 12:\n                    $value = explode(',', $v['body']);\n                    foreach ($value as $vv) {\n                        $d = explode('=', $vv);\n                        if ($d[1] == $data[$v['field']]) {\n                            $new[$k]['data'] = $d[0];\n                        }\n\n                    }\n\n                    break;\n                case 8:\n                    $r = [];\n                    $value = explode(',', $v['body']);\n                    foreach ($value as $vv) {\n                        $d = explode('=', $vv);\n                        if (stripos($data[$v['field']], ',' . $d[1] . ',') !== false) {\n                            $r[] = $d[0];\n                        }\n\n                    }\n                    $new[$k]['data'] = implode(',', $r);\n\n                    break;\n                case 11:\n                    $new[$k]['data'] = date('Y-m-d H:i:s', $data[$v['field']]);\n                    break;\n                case 13:\n                    $body = explode(',', $v['body']);\n                    $biaoshi = M('molds')->getField(['id' => $body[0]], 'biaoshi');\n                    $new[$k]['data'] = M($biaoshi)->getField(['id' => $data[$v['field']]], $body[1]);\n                    break;\n                case 16:\n                    $body = explode(',', $v['body']);\n                    $biaoshi = M('molds')->getField(['id' => $body[0]], 'biaoshi');\n                    $s = trim($data[$v['field']], ',');\n                    $datalist = M($biaoshi)->findAll('id in(' . $s . ')', null, $body[1]);\n                    $r = [];\n                    foreach ($datalist as $vv) {\n                        $r[] = $vv[$body[1]];\n                    }\n                    $new[$k]['data'] = implode(',', $r);\n                    break;\n                case 17:\n                    $classtypedata = classTypeData();\n                    $new[$k]['data'] = $classtypedata[$data[$v['field']]]['classname'];\n                    break;\n                case 18:\n                    $s = trim($data[$v['field']], ',');\n                    $arr = explode(',', $s);\n                    $r = [];\n                    $classtypedata = classTypeData();\n                    foreach ($arr as $vv) {\n                        $r[] = $classtypedata[$vv]['classname'];\n                    }\n                    $new[$k]['data'] = implode(',', $r);\n                    break;\n                case 19:\n                    $new[$k]['data'] = trim($data[$v['field']], ',');\n                    break;\n                case 20://绑定栏目多选\n                    $body = explode(',', $v['body']);\n                    $classtypedata = classTypeData();\n                    $tid = (int)$body[0];\n                    $molds = $classtypedata[$tid]['molds'];\n                    $s = trim($data[$v['field']], ',');\n                    $tids = array_column($classtypedata[$tid]['children']['lists'], 'id');\n                    $tids[] = $tid;\n                    $datalist = M($molds)->findAll('id in(' . $s . ') and tid in(' . implode(',', $tids) . ')', null, $body[1]);\n\n                    $new[$k]['data'] = implode(',', array_column($datalist, $body[1]));\n                    break;\n                case 21://绑定栏目单选\n                    $body = explode(',', $v['body']);\n                    $classtypedata = classTypeData();\n                    $tid = (int)$body[0];\n                    $molds = $classtypedata[$tid]['molds'];\n                    $new[$k]['data'] = M($molds)->getField(['id' => $data[$v['field']]], $body[1]);\n                    break;\n                default:\n                    $new[$k]['data'] = $data[$v['field']];\n                    break;\n            }\n            $new[$k]['type'] = $v['fieldtype'];\n        }\n\n        return $new;\n\n    }\n}\n//发送邮件处理\nif(!function_exists('send_mail')) {\n    function send_mail($send_mail, $password, $send_name, $to_mail, $title, $body, $email_ext = '')\n    {\n\n        require_once(APP_PATH . 'frphp/extend/PHPMailer/PHPMailerAutoload.php');\n        require_once(APP_PATH . 'frphp/extend/PHPMailer/class.phpmailer.php');\n        require_once(APP_PATH . \"frphp/extend/PHPMailer/class.smtp.php\");\n\n        $mail = new PHPMailer();\n\n        $host = webConf('email_server');\n        $port = (int)webConf('email_port');\n        if (!$host || !$port) {\n            exit('邮件服务器未配置完成');\n        }\n\n        if (strpos($host, 'qq') !== false) {\n            $mail->isSMTP();\n            $mail->CharSet = \"UTF-8\";\n            $mail->Host = $host;\n            $mail->SMTPAuth = true;\n            $mail->Username = $send_mail;\n            $mail->Password = $password;\n            $mail->SMTPSecure = 'tls';\n            $mail->Port = $port;\n            $mail->SetFrom($send_mail, $send_name);\n            $address = $to_mail;\n\n            if (is_array($email_ext)) {\n                foreach ($email_ext as $v) {\n                    $mail->AddAddress($v, $send_name);\n                }\n            } else if ($email_ext != '') {\n                $mail->AddAddress($email_ext, $send_name);\n            }\n            $mail->AddAddress($address, $send_name);\n            $mail->isHTML(true);\n            $mail->Subject = $title;\n            $mail->Body = $body;\n        } else {\n            $mail->IsSMTP(); // telling the class to use SMTP\n\n            $mail->SMTPDebug = 0; // enables SMTP debug information (for testing)\n\n            $mail->SMTPAuth = true; // enable SMTP authentication\n\n            $mail->SMTPSecure = \"ssl\"; // sets the prefix to the servier\n\n            //$mail->SMTPSecure = false; // sets the prefix to the servier\n\n            $mail->Host = $host; // sets GMAIL as the SMTP server\n\n            $mail->Port = $port; // set the SMTP port for the GMAIL server\n\n            $mail->Username = $send_mail; // GMAIL username\n\n            $mail->Password = $password; // GMAIL password\n\n            $mail->SetFrom($send_mail, $send_name);\n\n            //$mail->AddReplyTo(\"xxx@xxx.com\",\"First Last\");\n\n            $mail->Subject = $title;\n\n            $mail->AltBody = $title; // optional, comment out and test\n\n            $mail->MsgHTML($body);\n\n            $mail->CharSet = \"utf-8\"; // 这里指定字符集！\n\n            $address = $to_mail;\n\n            if (is_array($email_ext)) {\n                foreach ($email_ext as $v) {\n                    $mail->AddAddress($v, $send_name);\n                }\n            } else if ($email_ext != '') {\n                $email_ext = explode(',', $email_ext);\n                foreach ($email_ext as $v) {\n                    $mail->AddAddress($v, $send_name);\n                }\n            }\n\n            $mail->AddAddress($address, $send_name);\n\n        }\n        if (!$mail->Send()) {\n\n            // echo \"Mailer Error: \" . $mail->ErrorInfo;\n            return false;\n\n        } else {\n\n            //echo \"Message sent!\";\n            return true;\n\n        }\n\n    }\n}\n//检测是否收藏\nif(!function_exists('checkCollect')) {\n    function checkCollect($tid = 0, $id = 0)\n    {\n        if ($tid && $id && isset($_SESSION['member'])) {\n            $isok = M('shouchang')->getCount(['tid' => $tid, 'aid' => $id, 'userid' => $_SESSION['member']['id']]);\n            return $isok;\n\n\n        } else {\n            return false;\n        }\n\n    }\n}\n//检测是否点赞\nif(!function_exists('checkLikes')) {\n    function checkLikes($tid = 0, $id = 0)\n    {\n        if (isset($_SESSION['member']) && $_SESSION['member']['id']) {\n            if ($tid && $id) {\n                $isok = M('likes')->getCount(['tid' => $tid, 'aid' => $id, 'userid' => $_SESSION['member']['id']]);\n                return $isok;\n\n            } else {\n                return false;\n            }\n        } else {\n            if ($tid && $id && isset($_SESSION['likes'])) {\n                if (in_array($tid . '-' . $id, $_SESSION['likes'])) {\n                    return true;\n                } else {\n                    return false;\n                }\n\n\n            } else {\n                return false;\n            }\n        }\n\n\n    }\n}\n//检查多少未读评论\nif(!function_exists('has_no_read_comment')) {\n    function has_no_read_comment()\n    {\n        if (!isset($_SESSION['member'])) {\n            return 0;\n        }\n        $sql = 'userid=' . $_SESSION['member']['id'] . \" and isshow=1 and (type = 'comment' or type = 'reply') and isread=0 \";\n        $count = M('task')->getCount($sql);\n        return $count;\n    }\n}\n//检查多少未读消息\nif(!function_exists('has_no_read_msg')) {\n    function has_no_read_msg()\n    {\n        if (!isset($_SESSION['member'])) {\n            return 0;\n        }\n        //增对个人用户是否关闭提醒\n        $sql = 'userid=' . $_SESSION['member']['id'] . \" and isshow=1  and isread=0 \";\n        if (!$_SESSION['member']['ismsg']) {\n            $sql .= \" and type = '0' \";//只接收交易提醒\n        }\n        if (!$_SESSION['member']['iscomment']) {\n            $sql .= \" and type != 'comment' and type != 'reply'  \";\n        }\n        if (!$_SESSION['member']['iscollect']) {\n            $sql .= \" and type != 'collect'  \";\n        }\n        if (!$_SESSION['member']['islikes']) {\n            $sql .= \" and type != 'likes'  \";\n        }\n        if (!$_SESSION['member']['isat']) {\n            $sql .= \" and type != 'at'  \";\n        }\n        if (!$_SESSION['member']['isrechange']) {\n            $sql .= \" and type != 'rechange'  \";\n        }\n\n        $count = M('task')->getCount($sql);\n        return $count;\n    }\n}\n//数据库html反转义\nif(!function_exists('html_decode')) {\n    function html_decode($data = null)\n    {\n        if (!$data) return '';\n        $data = str_replace('&#039;', \"'\", htmlspecialchars_decode($data));\n        return $data;\n\n    }\n}\n//字符串替换\nif(!function_exists('str_replace_limit')) {\n    function str_replace_limit($search, $replace, $subject, $limit = -1)\n    {\n        if (is_array($search)) {\n            foreach ($search as $k => $v) {\n                $search[$k] = '`' . preg_quote($search[$k], '`') . '`';\n            }\n        } else {\n            $search = '`' . preg_quote($search, '`') . '`';\n        }\n        return preg_replace($search, $replace, $subject, $limit);\n    }\n}\n//人性化时间显示\nif(!function_exists('formatTime')) {\n    function formatTime($sTime, $formt = 'Y-m-d')\n    {\n\n        //sTime=源时间，cTime=当前时间，dTime=时间差\n        $cTime = time();\n        $dTime = $cTime - $sTime;\n        $dDay = intval($dTime / 86400);\n        $dYear = intval(date('Y', $cTime)) - intval(date('Y', $sTime));\n\n        //n秒前，n分钟前，n小时前，日期\n        if ($dTime < 60) {\n            if ($dTime < 10) {\n\n                if ($dTime < 0) {\n                    return date($formt, $sTime);\n                } else {\n                    return '刚刚';\n                }\n            } else {\n                return intval(floor($dTime / 10) * 10) . '秒前';\n            }\n        } else if ($dTime < 3600) {\n            return intval($dTime / 60) . '分钟前';\n        } else if ($dTime >= 3600 && $dDay == 0) {\n            return intval($dTime / 3600) . '小时前';\n        } else if ($dDay > 0 && $dDay <= 7) {\n            return intval($dDay) . '天前';\n        } else if ($dDay > 7 && $dDay <= 30) {\n            return intval($dDay / 7) . '周前';\n        } else if ($dDay > 30 && $dDay < 365) {\n            return intval($dDay / 30) . '个月前';\n        } else {\n            return date($formt, $sTime);\n        }\n    }\n}\n//过滤HTML代码函数\nif(!function_exists('htmldecode')) {\n    function htmldecode($data)\n    {\n        $data = strip_tags($data);\n        $data = str_replace('&nbsp;', '', $data);\n        return $data;\n    }\n}\n//计算点赞数\nif(!function_exists('jz_zan')) {\n    function jz_zan($tid, $id)\n    {\n\n        $count = M('likes')->getCount(['tid' => $tid, 'aid' => $id]);\n\n        return $count;\n\n    }\n}\n//计算收藏数\nif(!function_exists('jz_collect')) {\n    function jz_collect($tid, $id)\n    {\n\n        $count = M('shouchang')->getCount(['tid' => $tid, 'aid' => $id]);\n        return $count;\n\n    }\n}\n//用户详情\nif(!function_exists('memberInfo')) {\n    function memberInfo($id, $str = null)\n    {\n        $user = M('member')->find('id=' . $id);\n        if ($str != null) {\n            return $user[$str];\n        }\n        return $user;\n\n    }\n}\n//图片水印\nif(!function_exists('watermark')) {\n    function watermark($img, $water, $pos = 9, $tm = 100, $word = '')\n    {\n        $tm = $tm ?: 100;\n        if(file_exists($water)){\n            $info = getImageInfo($img);\n    \n            $logo = getImageInfo($water);\n    \n            $dst = openImg($img, $info['type']);\n            $src = openImg($water, $logo['type']);\n    \n    \n            switch ($pos) {\n                case 1:\n                    $x = 0;\n                    $y = 0;\n                    break;\n                case 2:\n                    $x = ceil(($info['width'] - $logo['width']) / 2);\n                    $y = 0;\n                    break;\n                case 3:\n                    $x = $info['width'] - $logo['width'];\n                    $y = 0;\n                    break;\n                case 4:\n                    $x = 0;\n                    $y = ceil(($info['height'] - $logo['height']) / 2);\n                    break;\n                case 5:\n                    $x = ceil(($info['width'] - $logo['width']) / 2);\n                    $y = ceil(($info['height'] - $logo['height']) / 2);\n                    break;\n                case 6:\n                    $x = $info['width'] - $logo['width'];\n                    $y = ceil(($info['height'] - $logo['height']) / 2);\n                    break;\n        \n                case 7:\n                    $x = 0;\n                    $y = $info['height'] - $logo['height'];\n                    break;\n                case 8:\n                    $x = ceil(($info['width'] - $logo['width']) / 2);\n                    $y = $info['height'] - $logo['height'];\n                    break;\n                case 9:\n                    $x = $info['width'] - $logo['width'];\n                    $y = $info['height'] - $logo['height'];\n                    break;\n                case 0:\n                default:\n                    $x = mt_rand(0, $info['width'] - $logo['width']);\n                    $y = mt_rand(0, $y = $info['height'] - $logo['height']);\n                    break;\n        \n            }\n            imagecopymerge($dst, $src, $x, $y, 0, 0, $logo['width'], $logo['height'], $tm);\n    \n    \n            imagejpeg($dst, $img);\n    \n            imagedestroy($dst);\n            imagedestroy($src);\n            return $img;\n        }else if($word){\n    \n            $webconf = webConf();\n            // 图片路径\n            $imagePath = $img;\n            // 文字水印内容\n            $text = $word;\n            // 每行文字数\n            $charsPerLine = 10;\n            // 文字大小\n            $fontSize = 24;\n            // 文字行高\n            $lineHeight = 34;\n            // 文字颜色（RGB格式）\n            if(!empty($webconf['watermark_rgb']) && (strlen($webconf['watermark_rgb'])==7)) {\n                $r = hexdec(substr($webconf['watermark_rgb'],1,2));\n                $g = hexdec(substr($webconf['watermark_rgb'],3,2));\n                $b = hexdec(substr($webconf['watermark_rgb'],5));\n            }else{\n                $r = $g = $b = 255;\n            }\n            $color = [$r, $g, $b];\n            // 文字字体路径\n            $fontPath = $webconf['watermark_font'] ? APP_PATH.'static/common/'.$webconf['watermark_font']:APP_PATH.'static/common/simsun.ttf';\n            // 文字水印位置（1-9，左上到右下）\n            $position = $webconf['watermark_wz'] ?: 5;\n    \n            // 创建图像资源\n            if(stripos($imagePath,'.png')!==false){\n                $image = imagecreatefrompng($imagePath);\n            }else if(stripos($imagePath,'.gif')!==false){\n                $image = imagecreatefromgif($imagePath);\n            }else{\n                $image = imagecreatefromjpeg($imagePath);\n            }\n            // 设置字体文件路径 ---高版本已经废弃\n            //putenv('GDFONTPATH=' . realpath('.'));\n            // 设置文字颜色\n            $textColor = imagecolorallocate($image, $color[0], $color[1], $color[2]);\n    \n            // 获取图像尺寸\n            $imageWidth = imagesx($image);\n            $imageHeight = imagesy($image);\n            // 计算文字宽度和高度\n            $textBoundingBox = imagettfbbox($fontSize, 0, $fontPath, $text);\n            $textWidth = $textBoundingBox[2] - $textBoundingBox[0];\n            $textHeight = $textBoundingBox[1] - $textBoundingBox[7];\n    \n            // 处理文字水印内容并自动换行\n            $lines = [];\n            $line = '';\n            //$chars = mb_str_split($text);\n            $chars = smb_str_split($text);\n            $newlines = [];\n            $l = '';\n            $n = 1;//行数\n            foreach($chars as $k=>$v){\n                $l.=$v;\n                if( ($k+1)%$charsPerLine==0){\n                    $newlines[] = $l;\n                    $l = '';\n                    $n += 1;\n                }\n            }\n            $newlines[] = $l;\n            //var_dump($newlines);exit;\n            //计算文字真实和宽度\n            $old = $textHeight+2;\n            $textHeight = count($newlines) * $old;\n            if($n==1){\n                $textWidth = $old * count($chars);\n            }else{\n                $textWidth = $old * $charsPerLine;\n            }\n    \n    \n            // 计算水印位置\n            switch ($position) {\n                case 1: // 左上\n                    $x = 0;\n                    $y = 0;\n                    break;\n                case 2: // 上\n                    $x = ($imageWidth - $textWidth) / 2;\n                    $y = 0;\n                    break;\n                case 3: // 右上\n                    $x = $imageWidth - $textWidth;\n                    $y = 0;\n                    break;\n                case 4: // 左\n                    $x = 0;\n                    $y = ($imageHeight - $textHeight) / 2;\n                    break;\n                case 5: // 居中\n                    $x = ($imageWidth - $textWidth) / 2;\n                    $y = ($imageHeight - $textHeight) / 2;\n                    break;\n                case 6: // 右\n                    $x = $imageWidth - $textWidth;\n                    $y = ($imageHeight - $textHeight) / 2;\n                    break;\n                case 7: // 左下\n                    $x = 0;\n                    $y = $imageHeight - $textHeight;\n                    break;\n                case 8: // 下\n                    $x = ($imageWidth - $textWidth) / 2;\n                    $y = $imageHeight - $textHeight;\n                    break;\n                case 9: // 右下\n                    $x = $imageWidth - $textWidth;\n                    $y = $imageHeight - $textHeight;\n                    break;\n                default: // 默认为右下\n                    $x = $imageWidth - $textWidth;\n                    $y = $imageHeight - $textHeight;\n                    break;\n            }\n    \n            // 添加文字水印\n            $y = $y + $fontSize;\n    \n            //微调\n            $x = $x + $webconf['watermark_x'];\n            $y = $y + $webconf['watermark_y'];\n    \n            foreach ($newlines as $line) {\n                imagettftext($image, $fontSize, 0, $x, $y, $textColor, $fontPath, $line);\n                $y += $lineHeight;\n        \n        \n            }\n    \n            // 生成新的图像文件名\n    \n            $source = $imagePath; // 替换为你想要保存的图像文件路径和文件名\n            $newImagePath = $source;\n    \n            // 保存图像到文件\n            if(stripos($imagePath,'.png')!==false){\n                imagepng($image, $newImagePath);\n            }else if(stripos($imagePath,'.gif')!==false){\n                imagegif($image, $newImagePath);\n            }else{\n                imagejpeg($image, $newImagePath);\n            }\n    \n    \n            // 释放资源\n            imagedestroy($image);\n            return str_replace(APP_PATH,'',$source);\n        \n        }\n        \n        return $img;\n\n    }\n}\nif(!function_exists('getImageInfo')) {\n    function getImageInfo($path)\n    {\n        $info = getimagesize($path);\n        $data['width'] = $info[0];\n        $data['height'] = $info[1];\n        $data['type'] = $info['mime'];\n        return $data;\n    }\n}\n//打开图片\nif(!function_exists('openImg')) {\n    function openImg($path, $type)\n    {\n        switch ($type) {\n            case 'image/jpeg':\n            case 'image/jpg':\n            case 'image/pjpeg':\n                $img = imagecreatefromjpeg($path);\n                break;\n            case 'image/png':\n            case 'image/x-png':\n                $img = imagecreatefrompng($path);\n                break;\n            case 'image/gif':\n                $img = imagecreatefromgif($path);\n                break;\n            case 'image/wbmp':\n                $img = imagecreatefromwbmp($path);\n                break;\n            default:\n                exit('图片类型不支持');\n\n\n        }\n        return $img;\n    }\n}\n//检查是否关注\nif(!function_exists('isfollow')) {\n    function isfollow($id, $other)\n    {\n        $follow = M('member')->getField(['id' => $id], 'follow');\n        if (strpos($follow, ',' . $other . ',') !== false) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n//计算粉丝数\nif(!function_exists('jz_fans')) {\n    function jz_fans($id = 0)\n    {\n        if ($id) {\n            $user_num = M('member')->getCount(\" follow like '%,\" . $id . \",%'\");\n            return $user_num;\n        } else {\n            return 0;\n        }\n    }\n}\n//计算关注数\nif(!function_exists('jz_follow')) {\n    function jz_follow($id = 0)\n    {\n        if ($id) {\n            //,1,2,2,4,\n            $follow = M('member')->getField(['id' => $id], 'follow');\n            if ($follow != '') {\n                $follow = trim($follow, ',');\n                $num = substr_count($follow, ',');\n                return $num + 1;\n            } else {\n                return 0;\n            }\n        } else {\n            return 0;\n        }\n    }\n}\n//删除文件目录\nif(!function_exists('deldir')) {\n    function deldir($dir)\n    {\n        //先删除目录下的文件：\n        $dh = opendir($dir);\n        while ($file = readdir($dh)) {\n            if ($file != \".\" && $file != \"..\") {\n                $fullpath = $dir . \"/\" . $file;\n                if (!is_dir($fullpath)) {\n                    unlink($fullpath);\n                } else {\n                    deldir($fullpath);\n                }\n            }\n        }\n        closedir($dh);\n        //删除当前文件夹：\n        if (rmdir($dir)) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n/**\n * 图片压缩裁剪\n * src_image 原图链接  根目录绝对链接，支持远程图片\n * out_image 生成图链接  写文件名即可\n * mode=1 按尺寸裁剪 mode=0 按比例裁剪\n * out_width 生成的宽（比例）\n * out_height 生成的高（比例）\n * img_quality 压缩比例（PNG无法压缩）\n * direct=1 中间开始裁剪  direct=0 左上角开始裁剪\n * debug=1 调试状态，每次请求都生成缓存 debug=0 会直接调用已生成的缩略图\n */\nif(!function_exists('jzresize')) {\n    function jzresize($src_image, $out_width = NULL, $out_height = NULL, $mode = 1, $out_image = NULL, $direct = 1, $debug = 0, $img_quality = 90)\n    {\n        if (!file_exists('.' . $src_image)) {\n            if (strpos($src_image, 'http') !== false) {\n                return $src_image;\n            }\n        } else {\n            list($width, $height, $type, $attr) = getimagesize('.' . $src_image);\n            if ($width == $out_width && $height == $out_height) {\n                return $src_image;\n            }\n            if (!is_dir(APP_PATH . 'cache/image')) {\n                if (!mkdir(APP_PATH . 'cache/image', 0777)) {\n                    exit('没有权限[cache/image]');\n                }\n            }\n            if (!$out_image) {\n                $imageinfo = pathinfo($src_image);\n                $filename = str_replace('.' . $imageinfo['extension'], '_' . $out_width . 'x' . $out_height . '.' . $imageinfo['extension'], $imageinfo['basename']);\n                $out_image = 'cache/image/' . $filename;\n            }\n            if (file_exists(APP_PATH . $out_image) && !$debug) {\n                return '/' . $out_image;\n            } else {\n                if (!copy(APP_PATH . $src_image, $out_image)) {\n                    return '';\n                }\n                list($width, $height, $type, $attr) = getimagesize($out_image);\n                switch ($type) {\n                    case 1:\n                        $img = imagecreatefromgif($out_image);\n                        break;\n                    case 2:\n                        $img = imagecreatefromjpeg($out_image);\n                        break;\n                    case 3:\n                        $img = imagecreatefrompng($out_image);\n                        break;\n                }\n                $out_scale = $out_height / $out_width;\n                $src_scale = $height / $width;\n                if ($mode == 1) {\n                    $w = $out_width;\n                    $h = $out_height;\n                } else {\n                    $w = $width;\n                    $h = intval($out_scale * $w);\n                    if ($h > $height) {\n                        $h = $height;\n                        $w = intval($h / $out_scale);\n                    }\n                }\n\n                if ($direct == 1) {\n                    if ($src_scale >= $out_scale) {\n                        $w = intval($width);\n                        $h = intval($out_scale * $w);\n                        $start_x = 0;\n                        $start_y = ($height - $h) / 2;\n                    } else {\n                        $h = intval($height);\n                        $w = intval($h / $out_scale);\n                        $start_x = ($width - $w) / 2;\n                        $start_y = 0;\n                    }\n                } else {\n                    $w = intval($width);\n                    $h = intval($height);\n                    $start_x = 0;\n                    $start_y = 0;\n                }\n\n                $scale = $out_width / $w;\n                $new_img = imagecreatetruecolor($out_width, $out_height);\n                // 根据图像类型处理透明度\n                switch ($type) {\n                    case 1: // GIF\n                        $transparent = imagecolorallocatealpha($new_img, 0, 0, 0, 127);\n                        imagefill($new_img, 0, 0, $transparent);\n                        imagecolortransparent($new_img, $transparent); // 使背景透明\n                        break;\n                    case 3: // PNG\n                        imagesavealpha($new_img, true); // 保存透明通道信息\n                        $transparent = imagecolorallocatealpha($new_img, 0, 0, 0, 127);\n                        imagefill($new_img, 0, 0, $transparent);\n                        break;\n                    default: // 对于不支持透明度的图像类型（如 JPEG），使用白色背景\n                        $white = imagecolorallocate($new_img, 255, 255, 255);\n                        imagefill($new_img, 0, 0, $white);\n                        break;\n                }\n                imagecopyresampled($new_img, $img, 0, 0, $start_x, $start_y, $out_width, $out_height, $w, $h);\n                switch ($type) {\n                    case 1: // GIF\n                        imagegif($new_img, $out_image); // 保存GIF图像，不需要质量参数\n                        break;\n                    case 2: // JPEG\n                        imagejpeg($new_img, $out_image, $img_quality); // 保存JPEG图像，需要质量参数\n                        break;\n                    case 3: // PNG\n                        imagesavealpha($new_img, true); // 确保保存透明度信息\n                        imagepng($new_img, $out_image); // 保存PNG图像，不需要质量参数，但可以设置压缩级别\n                        break;\n                }\n                imagedestroy($img);\n                imagedestroy($new_img);\n                return '/' . $out_image;\n            }\n        }\n    }\n}\nif(!function_exists('jzcachedata')) {\n    function jzcachedata($field)\n    {\n        $result = getCache('jzcache_' . $field);\n        if (!$result) {\n            $res = M('cachedata')->find(['field' => $field]);\n\n            if ($res['isall'] && $res['tid']) {\n                $classtypedata = (isMobile() && webConf('iswap') == 1) ? classTypeDataMobile() : classTypeData();\n                foreach ($classtypedata as $k => $v) {\n                    $classtypedata[$k]['children'] = get_children($v, $classtypedata);\n                }\n            }\n\n\n            $tid = $res['tid'] ? ($res['isall'] == 1 ? ' and tid in (' . implode(',', $classtypedata[$res['tid']]['children']['ids']) . ') ' : ' and tid=' . $res['tid']) : '';\n            $sqls = $res['sqls'] ? ' and ' . $res['sqls'] : '';\n            $orderby = $res['orders'] ? ' order by ' . $res['orders'] : '';\n            $limit = $res['limits'] ? ' limit ' . $res['limits'] : '';\n            if ($tid || $sqls) {\n                $where = ' where 1=1 ' . $tid . htmlspecialchars_decode($sqls, ENT_QUOTES);\n            } else {\n                $where = '';\n            }\n            $sql = \"select * from \" . DB_PREFIX . $res['molds'] . $where . $orderby . $limit;\n            $result = M()->findSql($sql);\n            if ($result) {\n                foreach ($result as $kk => $vv) {\n                    if (isset($vv['htmlurl'])) {\n                        $result[$kk]['url'] = gourl($vv, $vv['htmlurl']);\n                    }\n                }\n            }\n            $time = $res['times'] * 60;\n            setCache('jzcache_' . $res['field'], $result, $time);\n        }\n        return $result;\n    }\n}\n// 增加classtypedata缓存\nif(!function_exists('getclasstypedata')) {\n    function getclasstypedata($array, $m = 1)\n    {\n        if ($m) {\n            $s = 'classtypedatamobile';\n        } else {\n            $s = 'classtypedatapc';\n        }\n        $classtypedata = getCache($s);\n        if (!$classtypedata) {\n            $classtypedata = $array;\n            $classtypemaxlevel = webConf('classtypemaxlevel');\n            foreach ($classtypedata as $k => $v) {\n                if ($classtypemaxlevel) {\n                    $classtypedata[$k]['children'] = get_all_children($v, $classtypedata);\n                } else {\n                    $classtypedata[$k]['children'] = get_children($v, $classtypedata);\n                }\n\n            }\n            setCache($s, $classtypedata);\n        }\n        return $classtypedata;\n    }\n}\n//递归获取全部格式化子类\nif(!function_exists('get_all_children')) {\n    function get_all_children($type, $classtypedata)\n    {\n        $res = get_children($type, $classtypedata);\n        if ($type['haschild']) {\n            foreach ($res['list'] as $k => $v) {\n                $res['list'][$k]['children'] = get_all_children($v, $classtypedata);\n            }\n        }\n        return $res;\n    }\n}\nif(!function_exists('jztpldata')) {\n    function jztpldata()\n    {\n        $tpldata = getCache('tpldata');\n        if (!$tpldata) {\n            $webconf = webConf();\n            $m = (isMobile() && $webconf['iswap'] == 1) ? 1 : 0;\n            if ($m) {\n                $classtypedata = classTypeDataMobile();\n            } else {\n                $classtypedata = classTypeData();\n            }\n            $tpldata = [];\n            $tpl_data = M('tplfields')->findAll();\n            if ($tpl_data) {\n\n                foreach ($tpl_data as $v) {\n                    if ($v['tid']) {\n                        $v['url'] = $classtypedata[$v['tid']]['url'];\n                    }\n                    if ($v['orders']) {\n                        switch ($v['orders']) {\n                            case 1:\n                                $v['orders'] = ' addtime desc ';\n                                break;\n                            case 2:\n                                $v['orders'] = ' addtime asc ';\n                                break;\n                            case 3:\n                                $v['orders'] = ' orders desc ';\n                                break;\n                            case 4:\n                                $v['orders'] = ' hits desc ';\n                                break;\n                            case 5:\n                                $v['orders'] = ' id asc ';\n                                break;\n                            case 6:\n                                $v['orders'] = ' id desc ';\n                                break;\n                        }\n                    }\n                    switch ($v['fieldtype']) {\n                        case 4:\n                        case 11:\n                            $data = explode('||', $v['data']);\n                            $newdata = [];\n                            foreach ($data as $kk => $vv) {\n                                $pic = explode('|', $vv);\n                                $newdata[$kk] = ['url' => $pic[0], 'title' => $pic[1]];\n                            }\n                            $v['filedata'] = $newdata;\n\n                            break;\n\n                        case 8:\n                        case 9:\n                            $v['sdata'] = explode(\"\\n\", $v['sdata']);\n\n                            break;\n                    }\n                    $tpldata[$v['pid']][$v['field']] = $v;\n                }\n            }\n\n            setCache('tpldata', $tpldata);\n\n        }\n        return $tpldata;\n    }\n}\nif(!function_exists('jztpldatafield')) {\n    function jztpldatafield()\n    {\n        $tpldata = getCache('tpldata');\n        if (!$tpldata) {\n            $webconf = webConf();\n            $m = (isMobile() && $webconf['iswap'] == 1) ? 1 : 0;\n            if ($m) {\n                $classtypedata = classTypeDataMobile();\n            } else {\n                $classtypedata = classTypeData();\n            }\n            $tpldata = [];\n            $tpls = M('tpl')->findAll();\n            $tplarr = [];\n            foreach ($tpls as $v) {\n                $tplarr[$v['id']] = $v;\n            }\n            $tpl_data = M('tplfields')->findAll();\n            if ($tpl_data) {\n\n                foreach ($tpl_data as $v) {\n                    if ($v['tid']) {\n                        $v['url'] = $classtypedata[$v['tid']]['url'];\n                    }\n                    if ($v['orders']) {\n                        switch ($v['orders']) {\n                            case 1:\n                                $v['orders'] = ' addtime desc ';\n                                break;\n                            case 2:\n                                $v['orders'] = ' addtime asc ';\n                                break;\n                            case 3:\n                                $v['orders'] = ' orders desc ';\n                                break;\n                            case 4:\n                                $v['orders'] = ' hits desc ';\n                                break;\n                            case 5:\n                                $v['orders'] = ' id asc ';\n                                break;\n                            case 6:\n                                $v['orders'] = ' id desc ';\n                                break;\n                        }\n                    }\n                    switch ($v['fieldtype']) {\n                        case 4:\n                        case 11:\n                            $data = explode('||', $v['data']);\n                            $newdata = [];\n                            foreach ($data as $kk => $vv) {\n                                $pic = explode('|', $vv);\n                                $newdata[$kk] = ['url' => $pic[0], 'title' => $pic[1]];\n                            }\n                            $v['filedata'] = $newdata;\n\n                            break;\n\n                        case 8:\n                        case 9:\n                            $v['sdata'] = explode(\"\\n\", $v['sdata']);\n\n                            break;\n                    }\n                    $tpldata[$tplarr[$v['pid']]['field']][$v['field']] = $v;\n                }\n            }\n\n            setCache('tpldata2', $tpldata);\n\n        } else {\n            $tpldata = getCache('tpldata2');\n        }\n        return $tpldata;\n    }\n}\nif(!function_exists('waterwordmark')) {\n    function waterwordmark($title,$path,$isnew = 1){\n        $webconf = webConf();\n        // 图片路径\n        $imagePath = $path;\n        // 文字水印内容\n        $text = $title;\n        // 每行文字数\n        $charsPerLine = $webconf['text_num'] ?: 10;\n        // 文字大小\n        $fontSize = $webconf['text_size'] ?: 24;\n        // 文字行高\n        $lineHeight = $webconf['text_h'] ?: 34;\n        // 文字间距\n        $letterSpacing = $webconf['text_m'] ?: 2;\n        // 文字颜色（RGB格式）\n        if(!empty($webconf['text_rgb']) && (strlen($webconf['text_rgb'])==7)) {\n            $r = hexdec(substr($webconf['text_rgb'],1,2));\n            $g = hexdec(substr($webconf['text_rgb'],3,2));\n            $b = hexdec(substr($webconf['text_rgb'],5));\n        }else{\n            $r = $g = $b = 255;\n        }\n        $color = [$r, $g, $b];\n        // 文字字体路径\n        $fontPath = $webconf['text_font'] ? APP_PATH.'static/common/'.$webconf['text_font']:APP_PATH.'static/common/Alibaba-PuHuiTi-Bold.ttf';\n        // 文字水印位置（1-9，左上到右下）\n        $position = $webconf['text_wz'] ?: 5;\n    \n        // 创建图像资源\n        if(stripos($imagePath,'.png')!==false){\n            $image = imagecreatefrompng($imagePath);\n        }else if(stripos($imagePath,'.gif')!==false){\n            $image = imagecreatefromgif($imagePath);\n        }else{\n            $image = imagecreatefromjpeg($imagePath);\n        }\n        // 设置字体文件路径 ---高版本已经废弃\n        //putenv('GDFONTPATH=' . realpath('.'));\n        // 设置文字颜色\n        $textColor = imagecolorallocate($image, $color[0], $color[1], $color[2]);\n    \n        // 获取图像尺寸\n        $imageWidth = imagesx($image);\n        $imageHeight = imagesy($image);\n        // 计算文字宽度和高度\n        $textBoundingBox = imagettfbbox($fontSize, 0, $fontPath, $text);\n        $textWidth = $textBoundingBox[2] - $textBoundingBox[0];\n        $textHeight = $textBoundingBox[1] - $textBoundingBox[7];\n        \n        // 处理文字水印内容并自动换行\n        $lines = [];\n        $line = '';\n        //$chars = mb_str_split($text);\n        $chars = smb_str_split($text);\n        $newlines = [];\n        $l = '';\n        $n = 1;//行数\n        foreach($chars as $k=>$v){\n            $l.=$v;\n            if( ($k+1)%$charsPerLine==0){\n                $newlines[] = $l;\n                $l = '';\n                $n += 1;\n            }\n        }\n        $newlines[] = $l;\n        //var_dump($newlines);exit;\n        //计算文字真实和宽度\n        $old = $textHeight+2;\n        $textHeight = count($newlines) * $old;\n        if($n==1){\n            $textWidth = $old * count($chars);\n        }else{\n            $textWidth = $old * $charsPerLine;\n        }\n    \n    \n        // 计算水印位置\n        switch ($position) {\n            case 1: // 左上\n                $x = 0;\n                $y = 0;\n                break;\n            case 2: // 上\n                $x = ($imageWidth - $textWidth) / 2;\n                $y = 0;\n                break;\n            case 3: // 右上\n                $x = $imageWidth - $textWidth;\n                $y = 0;\n                break;\n            case 4: // 左\n                $x = 0;\n                $y = ($imageHeight - $textHeight) / 2;\n                break;\n            case 5: // 居中\n                $x = ($imageWidth - $textWidth) / 2;\n                $y = ($imageHeight - $textHeight) / 2;\n                break;\n            case 6: // 右\n                $x = $imageWidth - $textWidth;\n                $y = ($imageHeight - $textHeight) / 2;\n                break;\n            case 7: // 左下\n                $x = 0;\n                $y = $imageHeight - $textHeight;\n                break;\n            case 8: // 下\n                $x = ($imageWidth - $textWidth) / 2;\n                $y = $imageHeight - $textHeight;\n                break;\n            case 9: // 右下\n                $x = $imageWidth - $textWidth;\n                $y = $imageHeight - $textHeight;\n                break;\n            default: // 默认为右下\n                $x = $imageWidth - $textWidth;\n                $y = $imageHeight - $textHeight;\n                break;\n        }\n    \n        // 添加文字水印\n        $y = $y + $fontSize;\n    \n        //微调\n        $x = $x + $webconf['text_x'];\n        $y = $y + $webconf['text_y'];\n    \n        foreach ($newlines as $line) {\n            imagettftext($image, $fontSize, 0, $x, $y, $textColor, $fontPath, $line);\n            $y += $lineHeight;\n        \n        \n        }\n        \n        // 生成新的图像文件名\n        if($isnew){\n            $pic_arr = explode('.',$imagePath);\n            $pix = end($pic_arr);\n            //$source = $imagePath; // 替换为你想要保存的图像文件路径和文件名\n            if(isset($webconf['admin_save_path'])){\n                //替换日期事件\n                $t = time();\n                $d = explode('-', date(\"Y-y-m-d-H-i-s\"));\n                $format = $webconf['admin_save_path'];\n                $format = str_replace(\"{yyyy}\", $d[0], $format);\n                $format = str_replace(\"{yy}\", $d[1], $format);\n                $format = str_replace(\"{mm}\", $d[2], $format);\n                $format = str_replace(\"{dd}\", $d[3], $format);\n                $format = str_replace(\"{hh}\", $d[4], $format);\n                $format = str_replace(\"{ii}\", $d[5], $format);\n                $format = str_replace(\"{ss}\", $d[6], $format);\n                $format = str_replace(\"{time}\", $t, $format);\n                if($format!=''){\n                    //检查文件是否存在\n                    if(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){\n                        $path = explode('/',$format);\n                        $path1 = APP_PATH;\n                        foreach($path as $v){\n                            if($path1==APP_PATH){\n                                if(!file_exists($path1.$v)){\n                                    mkdir($path1.$v,0777);\n                                }\n                                $path1.=$v;\n                            }else{\n                                if(!file_exists($path1.'/'.$v)){\n                                    mkdir($path1.'/'.$v,0777);\n                                }\n                                $path1.='/'.$v;\n                            }\n                        }\n                    }else if(!file_exists(APP_PATH.$format)){\n                        mkdir(APP_PATH.$format,0777);\n                    }\n                    $admin_save_path = $format;\n            \n                }else{\n                    $admin_save_path = 'static/upload';\n                }\n        \n        \n            }else{\n                $admin_save_path = 'static/upload';\n            }\n            $source =  APP_PATH.'/'.$admin_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix;\n            \n        }else{\n            $source = $imagePath; // 替换为你想要保存的图像文件路径和文件名\n        }\n        \n        $newImagePath = $source;\n    \n        // 保存图像到文件\n        if(stripos($imagePath,'.png')!==false){\n            imagepng($image, $newImagePath);\n        }else if(stripos($imagePath,'.gif')!==false){\n            imagegif($image, $newImagePath);\n        }else{\n            imagejpeg($image, $newImagePath);\n        }\n    \n    \n        // 释放资源\n        imagedestroy($image);\n    \n        return str_replace(APP_PATH,'',$newImagePath);\n    }\n    \n}\nif(!function_exists('smb_str_split')) {\n    // 将字符串拆分为单个字符\n    function smb_str_split($string, $split_length = 1, $encoding = null) {\n        if ($split_length < 1) {\n            return false;\n        }\n        if ($encoding === null) {\n            $encoding = mb_internal_encoding();\n        }\n        $result = [];\n        $length = mb_strlen($string, $encoding);\n        for ($i = 0; $i < $length; $i += $split_length) {\n            $result[] = mb_substr($string, $i, $split_length, $encoding);\n        }\n        return $result;\n    }\n}\n\nif(!function_exists('check_field_must')){\n    function check_field_must($data,$molds){\n        // 不为空检测\n        $sql = \" molds='{$molds}' and isshow=1 \";\n        if(isset($data['tid']) && $data['tid']){\n            $tid = (int)$data['tid'];\n            $sql.=\" and tids like ',\".$tid.\",'\";\n        \n        }\n        $fields_list = M('Fields')->findAll($sql,'orders desc,id asc');\n        if($fields_list){\n            foreach($fields_list as $v){\n                if($v['ismust']==1){\n                    if($data[$v['field']]===''|| $data[$v['field']]===null){\n                        if(in_array($v['fieldtype'],array(6,10))){\n                            if($data[$v['field'].'_urls']==''){\n\n                                JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空！')]);\n                            }\n                        }else{\n                            JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空！')]);\n                        }\n\n                    }\n                }\n            }\n        }\n    }\n}\n\nif(!function_exists('remote_data_local')){\n    function remote_data_local($body = '', $tid=0, $molds=null)\n    {\n        $webconfig = getCache('webconfig');\n        $web_basehost    = get_domain();\n\n        $img_array = array();\n        preg_match_all('/<img[^>]+src=\"([^\">]+)\"/', $body, $img_array);\n\n        //preg_match_all('/http(s?):\\/\\/(.*?).*?\\\\\"/is', $body, $img_array);  //img 被转义的数据\n\n        $img_array = array_unique($img_array[1]);\n\n\n        if(isset($webconfig['admin_save_path'])){\n            //替换日期事件\n            $t = time();\n            $d = explode('-', date(\"Y-y-m-d-H-i-s\"));\n            $format = $webconfig['admin_save_path'];\n            $format = str_replace(\"{yyyy}\", $d[0], $format);\n            $format = str_replace(\"{yy}\", $d[1], $format);\n            $format = str_replace(\"{mm}\", $d[2], $format);\n            $format = str_replace(\"{dd}\", $d[3], $format);\n            $format = str_replace(\"{hh}\", $d[4], $format);\n            $format = str_replace(\"{ii}\", $d[5], $format);\n            $format = str_replace(\"{ss}\", $d[6], $format);\n            $format = str_replace(\"{time}\", $t, $format);\n            if($format!=''){\n                //检查文件是否存在\n                if(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){\n                    $path = explode('/',$format);\n                    $path1 = APP_PATH;\n                    foreach($path as $v){\n                        if($path1==APP_PATH){\n                            if(!file_exists($path1.$v)){\n                                mkdir($path1.$v,0777);\n                            }\n                            $path1.=$v;\n                        }else{\n                            if(!file_exists($path1.'/'.$v)){\n                                mkdir($path1.'/'.$v,0777);\n                            }\n                            $path1.='/'.$v;\n                        }\n                    }\n                }else if(!file_exists(APP_PATH.$format)){\n                    mkdir(APP_PATH.$format,0777);\n                }\n                $admin_save_path = $format;\n\n            }else{\n                $admin_save_path = 'public/Admin';\n            }\n\n\n        }else{\n            $admin_save_path = 'public/Admin';\n        }\n        $dirname =  $admin_save_path.'/';\n\n\n        //创建目录失败\n        if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {\n            return $body;\n        } else if (!is_writeable($dirname)) {\n            return $body;\n        }\n\n\n\n        foreach ($img_array as $key => $value) {\n            $imgUrl = trim($value);\n            //  $imgUrl = preg_replace('/\\\\\\\"/', '', $imgUrl); //img 被转义的数据\n            $imgUrl = preg_replace('/#/', '', $imgUrl);\n\n            // 本站图片 / 根网址图片 / 第三方存储插件的图片\n            if (preg_match(\"/\\/\\/('.$web_basehost.')\\//i\", $imgUrl)) {\n                continue;\n            }\n            // 不是合法链接\n            if (!preg_match(\"#^http(s?):\\/\\/#i\", $imgUrl)) {\n                continue;\n            }\n\n            $heads = @get_headers($imgUrl, 1);\n\n            // 获取请求头并检测死链\n            if (empty($heads)) {\n                continue;\n            } else if (!(stristr($heads[0], \"200\") && !stristr($heads[0], \"304\"))) {\n                continue;\n            }\n            // 图片扩展名\n            $fileType = substr($heads['Content-Type'], -4, 4);\n            if (!preg_match(\"#\\.(jpg|jpeg|gif|png|ico|bmp|webp|svg)#i\", $fileType)) {\n                if ($fileType == 'image/gif') {\n                    $pix = \"gif\";\n                } else if ($fileType == 'image/png') {\n                    $pix = \"png\";\n                } else if ($fileType == 'image/x-icon') {\n                    $pix = \"ico\";\n                } else if ($fileType == 'image/bmp') {\n                    $pix = \"bmp\";\n                }  else if ($fileType == 'image/webp') {\n                    $pix = \"webp\";\n                } else if ($heads['Content-Type'] == 'image/svg+xml') {\n                    $pix = \"svg\";\n                } else {\n                    $pix = 'jpg';\n                }\n            }\n            $pix = strtolower($pix);\n\n            //打开输出缓冲区并获取远程图片\n            ob_start();\n            $context = stream_context_create(\n                array('http' => array(\n                    'follow_location' => false // don't follow redirects\n                ))\n            );\n            readfile($imgUrl, false, $context);\n            $img = ob_get_contents();\n            ob_end_clean();\n            preg_match(\"/[\\/]([^\\/]*)[\\.]?[^\\.\\/]*$/\", $imgUrl, $m);\n\n            $file             = [];\n            $file['oriName']  = $m ? $m[1] : \"\";\n            $file['filesize'] = strlen($img);\n            $file['ext']      = $pix;\n            $file['name']     = date(\"ymdHis\") . mt_rand(100, 999) .'.'. $file['ext'];\n            $file['fullName'] = $dirname . $file['name'];\n            $fullName         = $file['fullName'];\n\n            //检查文件大小是否超出限制\n            if ($file['filesize'] >= 20480000) {\n                continue;\n            }\n\n            //移动文件\n            if (!(file_put_contents($fullName, $img) && file_exists($fullName))) { //移动失败\n                continue;\n            }\n            //处理水印\n            if( (strtolower($pix)=='png' || strtolower($pix)=='jpg' || strtolower($pix)=='jpeg') && $webconfig['iswatermark']==1 ){\n                watermark($file['fullName'],APP_PATH.$webconfig['watermark_file'],$webconfig['watermark_t'],$webconfig['watermark_tm'],$webconfig['text_word']);\n            }\n\n\n            $fileurl = '/'.$file['fullName'];\n\n            $body = str_replace($imgUrl, $fileurl, $body);\n            //添加图片进数据库\n            $filesize = round(filesize(APP_PATH.$file['fullName'])/1024,2);\n            M('pictures')->add(['litpic'=>'/'.$file['fullName'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$tid,'molds'=>$molds]);\n\n        }\n\n\n        return $body;\n    }\n}\n"
  },
  {
    "path": "conf/FunctionsExt.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2018/03\n// +----------------------------------------------------------------------\n\n\n\n/***************************************\n * 项目扩展函数-为开发者/站长自行定义使用 *\n***************************************/\n\n\n\n"
  },
  {
    "path": "conf/config.php",
    "content": "<?php return array (\n  'db' => \n  array (\n    'host' => '',\n    'dbname' => '',\n    'username' => '',\n    'password' => '',\n    'prefix' => 'jz_',\n    'port' => '3306',\n  ),\n  'redis' => \n  array (\n    'SAVE_HANDLE' => 'Redis',\n    'HOST' => '127.0.0.1',\n    'PORT' => 6379,\n    'AUTH' => NULL,\n    'TIMEOUT' => 0,\n    'RESERVED' => NULL,\n    'RETRY_INTERVAL' => 100,\n    'RECONNECT' => false,\n    'EXPIRE' => 1800,\n  ),\n  'APP_DEBUG' => true,\n  'File_TXT_HIDE' => false,\n); ?>"
  },
  {
    "path": "conf/route.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/08\n// +----------------------------------------------------------------------\n\n\nreturn [\n\t/**\n\t\t['正则url','系统内真实链接','传输方式POST/GET,或者为空,则表示POST/GET都接收']\n\t\t如果有多条匹配，默认第一条有效\n\t\tdemo：\n\t\t['/\\/base\\/([0-9]+)\\.html$/','Home/test/id/$1','GET'],\n\t\t['/\\/xbase\\/([0-9]+)\\/(\\w+)\\.html$/','Home/test/id/$1/sq/$2','POST'],\n\t\t['/\\/test_([0-9]+)\\.html$/','Home/test/id/$1','GET'],\n\t\t['/\\/abc\\.html$/','/shangpin.html',''],\n\t**/\n\t//以下规则不可删除，否则会报错！\n\t//http://demo.jizhicms.cn/Home/screen/molds/product/categories/3\n\t['/^\\/screen-(\\w+)-([0-9]+)-(.*)/','Screen/index/molds/$1/tid/$2/jz_screen/$3',''],\n\t['/^\\/searchAll(.*)/','Home/searchAll','GET'],\n\t['/^\\/search(.*)/','Home/search','GET'],\n\t\n];\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "frphp/common/Config.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2018/02\n// +----------------------------------------------------------------------\n\n\n\n/**\n * 核心公共配置\n */\n \n\ndefined('APP_PATH') or exit();\n\nreturn array(\n\t/*系统设定*/\n\t'Tpl_style'\t\t\t=>\t '/Public',//公共静态文件\n\t'Tpl_common'   \t\t=>   'common',//模板公共目录Home\\View\\common\n\t'APP_HOME'     \t\t=>   'Home',//默认前台目录\n\t'APP_URL'     \t\t=>   '/index.php',//默认前台入口\n\t'HOME_CONTROLLER'   =>   'Controller',//默认控制器文件目录\n\t'HOME_MODEL'   \t\t=>   'Model',//默认模型文件目录\n\t'HOME_VIEW'     \t=>   'View',//默认模板文件目录\n\t'Tpl_template'\t\t=>\t '',//默认模板目录-二级目录-多端口配置\n\t'File_TXT'    \t\t=>\t '.html',//默认模板后缀名\n\t'SessionTime'\t\t=>\t 86400*7,//默认缓存时间\n\t'APP_DEBUG'\t\t\t=>\t false,//关闭调试\n\t'StopLog'\t\t\t=>\t false,//关闭事件日志\n\t'DefaultController'\t=>\t 'Home',//默认控制器\n\t'DefaultAction'\t\t=>\t 'index',//默认方法\n\t'open_url_route'\t=>\t true,//开启自定义路由\n\t'open_redis_session'=>\t false,//开启redis缓存session\n\t'Cache_Path'\t\t=>\t APP_PATH.'cache',//缓存目录\n\t'Session_Path'\t\t=>\t APP_PATH.'cache/tmp',//session存储目录\n\t'APP_LANG'\t\t\t=>\t 'zh',//默认当前语言，zh_cn中文简体，其他自定义\n\t'APP_LANG_REQUREST'\t=>\t 'l',//语言包接收参数（小写的L）\n\t'ROOT'\t\t\t\t=>\t '/',//根目录路径\n\t'File_TXT_HIDE'\t\t=>\t false,//隐藏URL后缀\n\t'CLASS_HIDE_SLASH'\t=>\t false,//隐藏栏目最后的斜杠\n\n\n\n\n\n\n);"
  },
  {
    "path": "frphp/common/Error.php",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta name=\"robots\" content=\"noindex, nofollow, noarchive\" />\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title><?php echo $msg?></title>\n<style>\nbody{padding:0;margin:0;font-family:Arial, Helvetica, sans-serif;background:#EBF8FF;color:#5E5E5E;}\ndiv, h1, h2, h3, h4, p, form, label, input, textarea, img, span{margin:0; padding:0;}\nul{margin:0; padding:0; list-style-type:none;font-size:0;line-height:0;}\n#body{width:918px;margin:0 auto;}\n#main{width:918px;margin:13px auto 0 auto;padding:0 0 35px 0;}\n#contents{width:918px;float:left;margin:13px auto 0 auto;background:#FFF;padding:8px 0 0 9px;}\n#contents h2{display:block;background:#CFF0F3;font:bold 20px;padding:12px 0 12px 30px;margin:0 10px 22px 1px;}\n#contents ul{padding:0 0 0 18px;font-size:0;line-height:0;}\n#contents ul li{display:block;padding:0;color:#8F8F8F;background-color:inherit;font:normal 14px Arial, Helvetica, sans-serif;margin:0;}\n#contents ul li span{display:block;color:#408BAA;background-color:inherit;font:bold 14px Arial, Helvetica, sans-serif;padding:0 0 10px 0;margin:0;}\n#oneborder{width:800px;font:normal 14px Arial, Helvetica, sans-serif;border:#EBF3F5 solid 4px;margin:0 30px 20px 30px;padding:10px 20px;line-height:23px;}\n#oneborder span{padding:0;margin:0;}\n#oneborder #current{background:#CFF0F3;}\n</style>\t\n</head><body><div id=\"main\"><div id=\"contents\">\n<h2><?php echo $msg;?></h2>\n<?php foreach( $traces as $trace ){if(is_array($trace)&&!empty($trace[\"file\"])){\n$souceline = getsource($trace[\"file\"], $trace[\"line\"]);if( $souceline ){\n?>\n<ul><li><span><?php echo $trace[\"file\"];?> on line <?php echo $trace[\"line\"];?> </span></li></ul>\n<div id=\"oneborder\">\n<?php \nforeach( $souceline as $singleline )echo $singleline;?>\n</div>\n<?php }}}?>\n</div></div><div style=\"clear:both;\"></body></html>\n<?php\nfunction getsource($file, $line){\n\tif (!(file_exists($file) && is_file($file))) {return '';}\n\t$data = file($file);$count = count($data) - 1;\n\t$start = $line - 5;if ($start < 1) {$start = 1;}\n\t$end = $line + 5;if ($end > $count) {$end = $count + 1;}\n\t$returns = array();\n\tfor ($i = $start; $i <= $end; $i++) {\n\t\tif( $i == $line ){\n\t\t\t$returns[] = \"<div id='current'>\".$i.\".&nbsp;\".highlight_code($data[$i - 1], TRUE).\"</div>\";\n\t\t}else{\n\t\t\t$returns[] = $i.\".&nbsp;\".highlight_code($data[$i - 1], TRUE);\n\t\t}\n\t}\n\treturn $returns;\n}\nfunction highlight_code($code){\n    if (preg_match(\"/<\\?(php)?[^[:graph:]]/\", $code)) {\n        $code = highlight_string($code, TRUE);\n    } else {\n        $code = preg_replace(\"/(&lt;\\?php&nbsp;)+/\", \"\", highlight_string(\"<?php \".$code, TRUE));\n    }\n    return $code;\n}\n?>"
  },
  {
    "path": "frphp/common/Functions.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2018/02\n// +----------------------------------------------------------------------\n\n\n\n/*****************\n * 核心公共函数集*\n *****************/\n\n\n/**\n * 实例化一个没有模型文件的Model\n *@name   string   模块名\n *\n */\n\n\nfunction M($name = null,$prefix = 1) {\n\tif(empty($name)){\n\t\t$path = 'frphp\\\\lib\\\\Model';\n\t\treturn $path::getInstance();\n\t}\n    $table = $name;\n    $name = ucfirst($name);\n\tif($name==''){\n\t\treturn '缺少模型类！';\n\t}else{\n\t\t$name = APP_HOME.'\\\\'.HOME_MODEL.'\\\\'.$name.'Model';\n\t\tif(!class_exists($name)){\n\t\t\t$path = 'frphp\\\\lib\\\\Model';\n\t\t\treturn $path::getInstance($table,$prefix);\n\t\t}else{\n\t\t\treturn $name::getInstance($table,$prefix);\n\t\t}\n\t\t\n\t}\n}\n\n\n/**\n\t参数过滤，格式化\n**/\nfunction format_param($value=null,$int=0,$default=false){\n\tif($value==null){ return '';}\n\tif($value===false && $default!==false){ return $default;}\n\tswitch ($int){\n\t\tcase 0://整数\n\t\t\treturn (int)$value;\n\t\tcase 1://字符串\n\t\t\t$value = SafeFilter($value);\n\t\t\t$value=htmlspecialchars(trim($value), ENT_QUOTES);\n            $value = addslashes($value);\n\t\t\t\n\t\t\treturn $value;\n\t\tcase 2://数组\n\t\t\tif($value=='')return '';\n\t\t\tarray_walk_recursive($value, \"array_format\");\n\t\t\treturn $value;\n\t\tcase 3://浮点\n\t\t\treturn (float)$value;\n\t\tcase 4:\n            $value = addslashes($value);\n            $value = SafeFilter($value);\n\t\t\treturn trim($value);\n        case 5:\n            $value = SafeFilter($value);\n            $value=htmlspecialchars(trim($value), ENT_QUOTES);\n            $value = addslashes($value);\n            $ra=Array('select','insert','update','delete');\n            return str_ireplace($ra,'',$value);\n        case 6:\n            $value= strip_tags($value, \"<a><p><img><table><span><strong><h1><h2><h3><h4><h5><h6><div><ul><ol><li><form><input><header><td><tr><th><thead><tbody><source><area><aside><video><pre><code><i><font><audio><b><article><cite><dd><dl><em><section><small><del><hr><br>\");\n            $value = SafeFilter($value);\n            $value=htmlspecialchars(trim($value), ENT_QUOTES);\n            $value = addslashes($value);\n            return trim($value);\n\t}\n}\n//过滤XSS攻击\nfunction SafeFilter($arr) \n{\n   $ra=Array('/([\\x00-\\x08])/','/([\\x0b-\\x0c])/','/([\\x0e-\\x19])/');\n   $arr = preg_replace($ra,'',$arr);   \n   return $arr;\n}\nfunction array_format(&$item, $key)\n{\n\t$item=trim($item);\n    $item = SafeFilter($item);\n\t$item=htmlspecialchars($item, ENT_QUOTES);\n    $item = addslashes($item);\n}\n\nfunction unicodeEncode($str){\n    //split word\n    preg_match_all('/./u',$str,$matches);\n \n    $unicodeStr = \"\";\n    foreach($matches[0] as $m){\n        //拼接\n        $unicodeStr .= \"&#\".base_convert(bin2hex(iconv('UTF-8',\"UCS-4\",$m)),16,10);\n    }\n    return $unicodeStr;\n}\n\nfunction unicodeDecode($unicode_str){\n    $json = '{\"str\":\"'.$unicode_str.'\"}';\n    $arr = json_decode($json,true);\n    if(empty($arr)) return '';\n    return $arr['str'];\n}\n\n/**\n\t\n\t格式化数组为pathinfo格式\n\n**/\n\nfunction array_pathInfo($url){\n\tforeach($url as $k=>$v){\n\t\tif($v!=''){\n\t\t\t$url[$k] = $v;\n\t\t}\n\t}\n\t//$url = http_build_query(array_filter($url));\n\t$url = http_build_query($url);\n\t$url = str_ireplace(array('&','='),'/',$url);\n\treturn $url;\n}\n\n/**\n\n系统内置URL生成方法\n@action   string   支持两种格式生成  controllorName/actionName或actionName自动调用当前控制器  \n\n**/\n\n\nfunction U($action=null,$field=null){\n\t\n\tif(APP_URL=='/index.php'){\n\t\tif(strpos($action,'/')!==FALSE){\n\t\t\t//存在'/' 取消首字母大写限制\n\t\t\t//$action  = ucfirst($action);\n\t\t\t$url =  get_domain().'/'.$action;\n\t\t}else if($action!=null){\n\t\t\t$url =  get_domain().'/'.APP_CONTROLLER.'/'.$action;\n\t\t}else{\n\t\t\t$url =  get_domain().'/'.APP_CONTROLLER.'/'.APP_ACTION;\n\t\t}\n\t}else{\n\t\tif(strpos($action,'/')!==FALSE){\n\t\t\t//存在'/'\n\t\t\t$action  = ucfirst($action);\n\t\t\t$url =  get_domain().APP_URL.'/'.$action;\n\t\t}else if($action!=null){\n\t\t\t$url =  get_domain().APP_URL.'/'.APP_CONTROLLER.'/'.$action;\n\t\t}else{\n\t\t\t$url =  get_domain().APP_URL.'/'.APP_CONTROLLER.'/'.APP_ACTION;\n\t\t}\n\t}\n\t\n\t\n\t\n\tif($field!=null){\n\t\tif(is_array($field)){\n\t\t\t$url.='/'.array_pathInfo($field);\n\t\t}else{\n\t\t\t$url.='/'.$field;\n\t\t}\n\t}\n\treturn $url.'.html';\n\t\n}\n\n/**\n\n系统内部错误提示\n@info   string    文字描述\n\n**/\nfunction Error_msg($msg,$url=null){\n\t//检测是否定义了错误处理--2019/2/24  by 留恋风\n\t$controller = str_replace('/','\\\\',APP_HOME.'\\\\'.HOME_CONTROLLER.'\\\\ErrorController');\n\tif (!class_exists($controller) || !method_exists($controller,'index')) {\n\t\t$traces = debug_backtrace();\n\t\t$bufferabove = ob_get_clean();\n\t\trequire_once(CORE_PATH.'/common/Error.php');\n\t\texit;\n\t}else{\n\t\t(new $controller('ErrorController', 'index'))->index($msg);\n\t\texit;\n\t}\n\t\n}\n\n\n/**\n\n自定义成功后跳转方法\n@info  string  提示信息\n@url   string  链接   default 空\n@delay int     时间   default 2s \n\n**/\nfunction Success($info, $url=null){\n\tif($url==null){\n\t\t$url = get_domain().'/'.APP_CONTROLLER.'/'.APP_ACTION;\n\t}\n\techo '<!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\" /></head><body><script type=text/javascript>alert(\"'.$info.'\");window.location.href=\"'.$url.'\";</script></body></html>';\n\texit;\n}\n/**\n\n自定义失败后跳转方法\n@info  string   提示信息\n\n**/\nfunction Error($info, $url=null){\n  if($url==null){\n    echo '<!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\" />';\n\techo \"<script>alert('\".$info.\"'); javascript:history.go(-1);</script>\";\n\texit;\n  }else{\n\n\techo '<!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\" /></head><body><script type=text/javascript>\n\talert(\"'.$info.'\"); window.location.href=\"'.$url.'\";</script></body></html>';\n\texit;\n  }\n\t\n}\n\n/**\n\n返回json格式数组\n\n**/\n\nfunction JsonReturn($data){\n\techo json_encode($data,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);\n\texit;\n}\n\n\n//获取IP\n/*\nfunction GetIP(){ \n\tif (getenv(\"HTTP_CLIENT_IP\") && strcasecmp(getenv(\"HTTP_CLIENT_IP\"), \"unknown\")) \n\t$ip = getenv(\"HTTP_CLIENT_IP\"); \n\telse if (getenv(\"HTTP_X_FORWARDED_FOR\") && strcasecmp(getenv(\"HTTP_X_FORWARDED_FOR\"), \"unknown\")) \n\t$ip = getenv(\"HTTP_X_FORWARDED_FOR\"); \n\telse if (getenv(\"REMOTE_ADDR\") && strcasecmp(getenv(\"REMOTE_ADDR\"), \"unknown\")) \n\t$ip = getenv(\"REMOTE_ADDR\"); \n\telse if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], \"unknown\")) \n\t$ip = $_SERVER['REMOTE_ADDR']; \n\telse \n\t$ip = \"unknown\"; \n\t$ip=htmlspecialchars($ip, ENT_QUOTES);\n\tif(!get_magic_quotes_gpc())$ip = addslashes($ip);\n\treturn($ip); \n}\n*/\nfunction GetIP(){ \n  static $ip = '';\n  $ip = $_SERVER['REMOTE_ADDR'];\n  if(isset($_SERVER['HTTP_CDN_SRC_IP']) && preg_match('/^([0-9]{1,3}\\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CDN_SRC_IP'])) {\n    $ip = $_SERVER['HTTP_CDN_SRC_IP'];\n  } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {\n    $ip = $_SERVER['HTTP_CLIENT_IP'];\n  } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {\n    foreach ($matches[0] AS $xip) {\n      if (!preg_match('#^(10|172\\.16|192\\.168)\\.#', $xip)) {\n        $ip = $xip;\n        break;\n      }\n    }\n  }\n  return $ip;\n}\n//获取域名\nfunction get_domain(){\n\tif ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')\n\t{\n\t\t$protocol = \"https://\";\n\t}\n\telseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')\n\t{\n\t\t$protocol = \"https://\";\n\t}\n\telseif ( ! empty($_SERVER['HTTP_FROM_HTTPS']) && strtolower($_SERVER['HTTP_FROM_HTTPS']) !== 'off')\n\t{\n\t\t$protocol = \"https://\";\n\t}\n\telseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')\n\t{\n\t\t$protocol = \"https://\";\n\t}else if(!empty($_SERVER['HTTP_X_CLIENT_SCHEME']) && $_SERVER['HTTP_X_CLIENT_SCHEME']=='https'){\n\t\t$protocol = \"https://\";\n\t}else{\n\t\t$protocol = \"http://\";\n\t}\n\tif(isset($_SERVER['SERVER_PORT'])) {\n\t\t$port = ':' . $_SERVER['SERVER_PORT'];\n\t\tif((':80' == $port && 'http://' == $protocol) || (':443' == $port && 'https://' == $protocol)) {\n\t\t\t$port = '';\n\t\t}\n\t}else{\n\t\t$port = '';\n\t}\n    if(isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {\n        $host = $_SERVER['HTTP_X_FORWARDED_HOST'].$port;\n    }else if (isset($_SERVER['HTTP_HOST'])) {\n        $host = $_SERVER['HTTP_HOST'];\n    }else if(isset($_SERVER['SERVER_NAME'])) {\n\t\t$host = $_SERVER['SERVER_NAME'].$port;\n\t}else if(isset($_SERVER['SERVER_ADDR'])) {\n\t\t$host = $_SERVER['SERVER_ADDR'].$port;\n    }\n    return $protocol.$host;\n}\n//当前页面URL\nfunction current_url(){\n\treturn get_domain().$_SERVER[\"REQUEST_URI\"];\n}\n\n\n\n/**\n\n自定义重定向跳转方法\n  *@param $url 目标地址\n  *@param $info 提示信息\n  *@param $sec 等待时间\n  *return void \n\n**/\nfunction Redirect($url,$info=null,$sec=3){\n\tif(is_null($info)){\n\t\theader(\"Location:$url\");\n\t\t}else{\n\t\t\t//header(\"Refersh:$sec;URL=$url\");\n\t\t\techo '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><meta http-equiv=\"refresh\" content=\"'.$sec.';URL='.$url.'\">';\n\t\t\techo $info;\n\t\t}\n\t\tdie; \n\t\n}\n\n/**\n\t设置Session过期时间\n\n**/\n\nfunction start_session($expire = 0)  {\n\t\n\tif ($expire == 0) {\n\t\t\t//$expire = ini_get('session.gc_maxlifetime');\n\t\t\t$expire = SessionTime;\n\t\t} else {\n\t\t\t\n\t\t\tini_set('session.gc_maxlifetime', $expire);\n\t\t}\n\t$session_cache_dir = APP_PATH.'cache/tmp';\n\tif(!file_exists($session_cache_dir)){\n\t\tmkdir($session_cache_dir,0777,true);\n\t}\n\tini_set('session.save_path',$session_cache_dir);\n\t\n\t\n\tif (!isset($_COOKIE['PHPSESSID'])) {\n\t\tsession_set_cookie_params($expire);\n\t\tsession_start();\n\t} else {\n\t\tsession_start();\n\t\tsetcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + $expire,'/',null,null,true);\n\t}\n\n} \n\n/**\n\n\t自定义添加事件日志\n\t@param  data   日志内容\n\t@param  dataname  日志名称\n\n**/\n\nfunction register_log($data=null,$dataname=null){\n    if($dataname==null){\n        Error_msg('日志名称不能为空！');\n    }\n    \n    $st = array('m'=>APP_CONTROLLER,'a'=>APP_ACTION,'t'=>date('Y-m-d H:i:s',time()),'ip'=>GetIP(),'data'=>$data);\n    if(!is_dir(APP_PATH.'cache/log')){\n        mkdir(APP_PATH.'cache/log');\n    }\n    //读取日志文件\n    $logurl = APP_PATH.'cache/log/'.$dataname.'.php';\n    if(file_exists($logurl)){\n        $log = @fopen($logurl,\"r\");\n        $log_txt=@fread($log,filesize($logurl));\n        @fclose($log);\n    }else{\n        $log_txt = '';\n    }\n    if($log_txt!=''){\n        $log_txt = substr($log_txt,14);\n        $log_arr = json_decode($log_txt,true);\n    }\n    $log_arr[]=$st;\n    $log_txt = json_encode($log_arr,JSON_UNESCAPED_UNICODE);\n    $log_txt = '<?php die();?>'.$log_txt;\n    $log_x=@fopen($logurl,\"w\");\n    @fwrite($log_x,$log_txt);\n    @fclose($log_x);\n}\n\n\n/**\n\n\t输出日志事件列表\n\t@param  dataname   日志名称   默认空，输出主日志记录\n**/\n\nfunction show_log($dataname=null){\n\tif($dataname!=null){\n\t\t//主日志记录\n\t\t$logurl = APP_PATH.'cache/log/'.$dataname.'.php';\n\t\tif(!file_exists($logurl)){\n\t\t\treturn false;\n\t\t}\n\t\t// $log = @fopen($logurl,\"r\");\n\t\t// $logdata=@fread($log,filesize($logurl));\n\t\t// @fclose($log);\n\t\t$logdata = file_get_contents($logurl);\n\t\t$logdata = substr($logdata,14);\n\t\t$logdata = json_decode($logdata,true);\n\t\t//dump($logdata);\n\t\treturn $logdata;\n\t}else{\n\t\tError_msg('请输入日志名称！');\n\t}\n}\n\n\n/**\n\t记录操作的模块--操作的方法（函数）--事件--操作人 \n\t记录报错\n**/\nfunction actionLog(){\n    if(APP_DEBUG === true){\n        //开启调试模式自动记录事件,可以手动关闭\n        if(!StopLog){\n            \n            $st = array('m'=>APP_CONTROLLER,'a'=>APP_ACTION,'t'=>date('Y-m-d H:i:s',time()),'ip'=>GetIP(),'data'=>'');\n            //读取日志文件\n            $logurl = APP_PATH.'cache/log/memberAction.php';\n            \n            if(file_exists($logurl)){\n                $log = @fopen($logurl,\"r\");\n                $log_txt=@fread($log,filesize($logurl));\n                @fclose($log);\n            }else{\n                $log_txt = '';\n            }\n            if($log_txt!=''){\n                $log_txt = substr($log_txt,14);\n                $log_arr = json_decode($log_txt,true);\n            }\n            $log_arr[]=$st;\n            $log_txt = json_encode($log_arr,JSON_UNESCAPED_UNICODE);\n            $log_txt = '<?php die();?>'.$log_txt;\n            $log_x=@fopen($logurl,\"w\");\n            @fwrite($log_x,$log_txt);\n            @fclose($log_x);\n            \n        }\n    }\n}\n\n/**\n * 随机生成字符串\n * @param int $length\n * @return null|string\n */\nfunction getRandChar($length = 8){\n  $str = null;\n  $strPol = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz\";\n  $max = strlen($strPol)-1;\n  \n  for($i=0;$i<$length;$i++){\n    $str.=$strPol[rand(0,$max)]; //rand($min,$max)生成介于min和max两个数之间的一个随机整数\n  }\n  \n  return $str;\n}\n\n/**\n\t字符截断,中文算2个字符\n**/\nfunction newstr($string, $length, $dot=\"...\") {\n\tif(strlen($string) <= $length) {return $string;}\n\t$string = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;' ,'&nbsp;'), array('&','\"','<','>',''), $string);\n\t$strcut = '';$n = $tn = $noc = $noct = $nc = $tnc =0;\n\twhile($n < strlen($string)) {\n\t\t$t = ord($string[$n]);\n\t\tif($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {\n\t\t\t$tn = 1; $n++; $noct++;\n\t\t} elseif(194 <= $t && $t <= 223) {\n\t\t\t$tn = 2; $n += 2; $noct += 2;\n\t\t} elseif(224 <= $t && $t <= 239) {\n\t\t\t$tn = 3; $n += 3; $noct += 2;\n\t\t} elseif(240 <= $t && $t <= 247) {\n\t\t\t$tn = 4; $n += 4; $noct += 2;\n\t\t} elseif(248 <= $t && $t <= 251) {\n\t\t\t$tn = 5; $n += 5; $noct += 2;\n\t\t} elseif($t == 252 || $t == 253) {\n\t\t\t$tn = 6; $n += 6; $noct += 2;\n\t\t} else {$n++;}\n\t\tif($noct >= $length){if($noct==0)$noc=$noct;if($nc==0)$nc=$n;if($tnc==0)$tnc=$tn;}\n\t}\n\tif($noct<=$length){return str_replace(array('&','\"','<','>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $string);}\n\tif($noc > $length) {$nc -= $tnc;}\n\t$strcut = substr($string, 0, $nc);\n\t$strcut = str_replace(array('&','\"','<','>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $strcut);\n\treturn $strcut.$dot;\n} \n \n\n//系统加密解密\nfunction frencode($str)     \n{  \n   $yuan = 'abA!c1dB#ef2@Cg$h%iD_3jkl^E:m}4n.o{&F*p)5q(G-r[sH]6tuIv7w+Jxy8z9K0';\n\n   $jia = 'zAy%0Bx+1C$wDv^Eu2-t3(F{sr&G4q_pH5*on6I)m:l7.Jk]j8K}ih@gf9#ed!cb[a';\n $results = '';\n        if ( strlen($str) == 0) return false;\n\n\t\tfor($i = 0;$i<strlen($str);$i++){\n\n\t\t\tfor($j = 0;$j<strlen($yuan);$j++){\n\n\t\t\t\tif($str[$i]==$yuan[$j]){\n\n\t\t\t\t\t$results.= $jia[$j];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n       return $results;\n}      \nfunction frdecode($str)  \n{         \n  $yuan = 'abA!c1dB#ef2@Cg$h%iD_3jkl^E:m}4n.o{&F*p)5q(G-r[sH]6tuIv7w+Jxy8z9K0';\n\n  $jia = 'zAy%0Bx+1C$wDv^Eu2-t3(F{sr&G4q_pH5*on6I)m:l7.Jk]j8K}ih@gf9#ed!cb[a';\n\n  If (strlen($str)==0) return false;\n $results = '';\n  for($i = 0;$i< strlen($str);$i++){\n\n      for($j = 0;$j<strlen($jia);$j++){\n\n          if($str[$i]==$jia[$j]){\n\n              $results .= $yuan[$j];\n\n              break;\n          }\n      }\n\n  }\n\n  return $results;\n}\n\n/**\n\t格式化打印变量\n**/\nfunction dump($vars){\n   $content = \"<div align=left><pre>\\n\" . htmlspecialchars(print_r($vars, true)) . \"\\n</pre></div>\\n\";\n   echo \"<html><head><meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=utf-8\\\"></head><body>{$content}</body></html>\"; \n   return;\n}\n\n/**\n\t本地缓存\n\t@param str  设置索引\n\t@param data 存储数据\n\t@param timeout  设置过期时间，单位秒(s) 默认-1,永久存储\n**/\nfunction setCache($str,$data,$timeout=-1){\n\n\t//设置\n\t$rdata['frcache_time'] = $timeout;\n\t$rdata['frcache_data'] = $data;\n\t$str = get_domain().$str;\n\t$s = md5(md5($str.'frphp'.$str));\n\t$cache_file_data = Cache_Path.'/data/'.$s.'.php';\n\tif(!file_exists(Cache_Path.'/data')){\n\t\tmkdir (Cache_Path.'/data',0777,true);\n\t}\n\t//如果为null,则直接删除缓存\n\tif(!isset($data)){\n\t\tif(file_exists($cache_file_data)){\n\t\t\tunlink($cache_file_data);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t$res = json_encode($rdata,JSON_UNESCAPED_UNICODE);\n\t$res = '<?php die();?>'.$res;\n\t$r = file_put_contents($cache_file_data,$res);\n\tif($r){\n\t\treturn true;\n\t}else{\n\t\tError_msg('数据缓存失败，'.Cache_Path.'/data文件夹的读写权限设置为777！');\n\t}\n\n\t\n}\n\nfunction getCache($str=false){\n\tif(!$str){\n\t\treturn false;\n\t}\n\t$str = get_domain().$str;\n\t//获取\n\t$s = md5(md5($str.'frphp'.$str));\n\t$cache_file_data = Cache_Path.'/data/'.$s.'.php';\n\tif(!file_exists($cache_file_data)){\n\t\treturn false;\n\t}\n\t$last_time = filemtime($cache_file_data);//创建文件时间\n\t$res = file_get_contents($cache_file_data);\n\t$res = substr($res,14);\n\t$data = json_decode($res,true);\n\t\n\tif(($data['frcache_time']+$last_time)<time() && $data['frcache_time']>=0){\n\t\t\n\t\tunlink($cache_file_data);\n\t\treturn false;\n\t}else{\n\t\t\n\t\treturn $data['frcache_data'];\n\t}\n}\n\n//引入扩展文件\nfunction extendFile($filepath){\n\tif(strpos($filepath,'.')!==false){\n\t\trequire_once(CORE_PATH.'/extend/'.$filepath);\n\t}else{\n        if(substr($filepath,1)=='/'){\n            $Extend = scandir(CORE_PATH.'/extend'.$filepath);\n        }else{\n            $Extend = scandir(CORE_PATH.'/extend/'.$filepath);\n        }\n\t\t\n\t\tforeach($Extend as $v){\n\t\t\tif(strpos($v,'.php')!==false){\n\t\t\t\trequire_once CORE_PATH.'/extend/'.$filepath.'/'.$v;\n\t\t\t}\n\t\t}\n\t}\n\t\n}\n\n//多语言方法定义\nfunction JZLANG($str=null){\n\tif($str){\n\t\t//读取当前语言包环境\n\t\tif(isset($_SESSION['lang'])){\n\t\t\t$_lang = $_SESSION['lang'];\n\t\t}else{\n\t\t\t$_lang = LANG;\n\t\t}\n\t\t\n\t\t$lang_common_file = APP_PATH.APP_HOME.'/lang/common.php';//公共语言包\n\t\t$lang_current_file = APP_PATH.APP_HOME.'/lang/'.$_lang.'.php';//当前语言包\n\t\tif(file_exists($lang_common_file)){\n\t\t\t$common = include($lang_common_file);\n\t\t}else{\n\t\t\t$common = [];\n\t\t}\n\t\tif(file_exists($lang_current_file)){\n\t\t\t$current = include($lang_current_file);\n\t\t}else{\n\t\t\t$current = [];\n\t\t}\n\t\t$lang = empty($common) ? $current : (empty($current) ? $common : array_merge($common,$current));\n\t\tif(array_key_exists($str,$lang)){\n\t\t\treturn $lang[$str];\n\t\t}else{\n\t\t\treturn $str;\n\t\t}\n\n\t}else{\n\t\treturn '';\n\t}\n}\n\n"
  },
  {
    "path": "frphp/db/DBholder.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | FrPHP { a friendly PHP Framework } \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2018/03/15\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace frphp\\db;\r\n\r\nuse PDO;\r\nuse PDOException;\r\nuse PDOStatement;\r\n\r\nclass DBholder{\r\n\t\r\n\tprivate static $instance = false;\r\n\tprivate $pdo;\r\n\tprivate $Statement;\r\n\tprivate $arrSql;\r\n\t\r\n\tprivate function __construct(){\r\n\t\tclass_exists('PDO') or exit(\"not found PDO\");\r\n\t\ttry{\r\n\t\t\t$this->pdo = new PDO(\"mysql:host=\".DB_HOST.\";port=\".DB_PORT.\";dbname=\".DB_NAME,DB_USER, DB_PASS); \r\n\t\t}catch(PDOException $e){\r\n\t\t\t//数据库无法链接，如果您是第一次使用，请先配置数据库！\r\n\t\t\texit('<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />数据库无法链接，如果您是第一次使用，请先执行<a href=\"/install/\">安装程序</a><br /><br /><a href=\"http://jizhicms.com\" target=\"_blank\">极致CMS建站程序 jizhicms.com</a>');\r\n\t\t}\r\n\t\t\r\n\r\n\t\tini_set(\"memory_limit\",\"800M\");\r\n\t\t$this->pdo->exec(\"SET NAMES utf8mb4\");\r\n\t}\r\n\t\r\n\tpublic static function getInstance(){\r\n\t\tif(self::$instance===false){\r\n\t\t\tself::$instance = new self();\r\n\t\t}\r\n\t\treturn self::$instance;\r\n\t}\r\n\t\r\n\t//执行 SQL 语句，返回PDOStatement对象,可以理解为结果集\r\n\tpublic function query($sql){\r\n        if(!isset($_SESSION['admin'])){\r\n            if( (stripos($sql,DB_PREFIX.'level')!==false || stripos($sql,DB_PREFIX.'level_group')!==false) && (stripos($sql,'insert')!==false ||  stripos($sql,'update')!==false || stripos($sql,'delete')!==false)){\r\n                return false;\r\n            }\r\n        }\r\n\t\t$this->arrSql[] = $sql;\r\n        $this->Statement = $this->pdo->query($sql);\r\n        if ($this->Statement) {\r\n\t\t\treturn $this;\r\n        }else{\r\n\t\t\t$msg = $this->pdo->errorInfo();\r\n\t\t\tif($msg[2]){\r\n\t\t\t\t//Error_msg('数据库错误：' . $msg[2] . end($this->arrSql));\r\n\t\t\t\t$log_name = date('Y-m-d-H-i-s-').time();\r\n\t\t\t\tregister_log('数据库错误：' . $msg[2] . end($this->arrSql),$log_name);\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\t\r\n\t//执行SQL语句返回数组\r\n\tpublic function getArray($sql){\r\n\t\tif(!$result = $this->query($sql))return array();\r\n\t\tif(!$this->Statement->rowCount())return array();\r\n\t\t$rows = array();\r\n\t\twhile($rows[] = $this->Statement->fetch(PDO::FETCH_ASSOC)){}\r\n\t\t$this->Statement=null;\r\n\t\tarray_pop($rows);\r\n\t\treturn $rows;\r\n\t}\r\n\t\r\n\t//执行一条 SQL 语句，并返回受影响的行数\r\n\tpublic function exec($sql)\r\n\t{\r\n        if(!isset($_SESSION['admin'])){\r\n            if( (stripos($sql,DB_PREFIX.'level')!==false || stripos($sql,DB_PREFIX.'level_group')!==false) && (stripos($sql,'insert')!==false ||  stripos($sql,'update')!==false || stripos($sql,'delete')!==false)){\r\n                return false;\r\n            }\r\n        }\r\n\t\t$this->arrSql[] = $sql;\r\n\t\t$n = $this->pdo->exec($sql);\r\n        if(!$n){\r\n\t\t\t$msg = $this->pdo->errorInfo();\r\n\t\t\tif($msg[2]){\r\n\t\t\t\t$log_name = date('Y-m-d-H-i-s-').time();\r\n\t\t\t\tregister_log('数据库错误：' . $msg[2] . end($this->arrSql),$log_name);\r\n\t\t\t\texit;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn $n;\r\n\t}\r\n\t\r\n\t//获取插入影响行数\r\n\tpublic function lastInsertId(){\r\n\t\treturn $this->pdo->lastInsertId();\r\n\t}\r\n\t\r\n\t//获取表信息\r\n\tpublic function getTable($table){\r\n\t\t$stmt = $this->pdo->prepare(\"DESC {$table}\");  \r\n\t\treturn $stmt;\r\n\t}\r\n\t\r\n\t\r\n\t\r\n\t\r\n}"
  },
  {
    "path": "frphp/extend/ArrayPage.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2018/04/20\n// +----------------------------------------------------------------------\n\n\n\n\tclass ArrayPage {\n\t\t//分页数组\n\t\tpublic $array = '';\n\t\t//总条数\n\t\tpublic $sum = 0;\n\t\t//上一页\n\t\tpublic $prevpage = '';\n\t\t//下一页\n\t\tpublic $nextpage = '';\n\t\t//总页数\n\t\tpublic $allpage = 0;\n\t\t//每页条数\n\t\tpublic $limit = 10;\n\t\t//当前页码\n\t\tpublic $currentPage = 1;\n\t\t//间隔条数\n\t\tpublic $pv = 3;\n\t\t//系统分页链接\n\t\tpublic $url = '';\n\t\t//SQL\n\t\tpublic $sql = null;\n\t\t//排序\n\t\tpublic $order = null;\n\t\t//字段\n\t\tpublic $fields = null;\n\t\t//当前页数据\n\t\tpublic $datalist = array();\n\t\t//当前分页数组\n\t\tpublic $listpage = array();\n\t\t//分页标识\n\t\tpublic $pagetype = 'page';\n\t\t\n\t\t\n\t\t\n\t\tpublic function __construct($array){\n\t\t\t\n\t\t\t$this->datalist = $array;\n\t\t\tif(!is_array($array)){\n\t\t\t\texit('不是数组！');\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\tpublic function query($param){\n\t\t\t$this->currentPage = !isset($_GET[$this->pagetype]) ? 1 : $_GET[$this->pagetype];\n\t\t\tif(is_array($param)){\n\t\t\t\tif(isset($param[$this->pagetype])){\n\t\t\t\t\tunset($param[$this->pagetype]);\n\t\t\t\t}\n                unset($param['PHPSESSID']);\n\t\t\t\t$url = http_build_query($param);\n\t\t\t}else{\n\t\t\t\t$url = '';\n\t\t\t}\n\t\t\t\n\t\t\t$this->url = $url;\n\t\t\treturn $this;\n\t\t}\n\n\t\tpublic function pageList($pv=5){\n\t\t\t$listpage = array(\n\t\t\t\t'home' => null,\n\t\t\t\t'prev' => null,\n\t\t\t\t'next' => null,\n\t\t\t\t'current' => null,\n\t\t\t\t'allpage' => 0,\n\t\t\t\t'current_num' => 0,\n\t\t\t\t'list' => null,\n\t\t\t\t'last' => null,\n\t\t\t);\n\t\n\t\n\t\t\t$this->pv = $pv;\n\t\t\t$list = '';\n\t\t\t$listpage['home'] = $this->url;\t\n\t\t\t$listpage['current_num'] = $this->currentPage;\t\n\t\t\t$listpage['allpage'] = $this->allpage;\t\n\n\t\t\tif($this->url==''){\n\t\t\t\t$this->url.='?'.$this->pagetype.'=';\n\t\t\t}else{\n\t\t\t\t$this->url = '?'.$this->url.'&'.$this->pagetype.'=';\n\t\t\t}\n\t\t\t$listpage['current'] = $this->url.$this->currentPage;\t\n\t\t\t$start = $this->currentPage-$this->pv;\n\t\t\t$start = $start<1 ? 1 : $start;\n\t\t\t$end = $this->currentPage+$this->pv;\n\t\t\t$end = $end>$this->allpage ? $this->allpage : $end;\n\t\t\twhile($start<=$end){\n\t\t\t\tif($start==$this->currentPage){\n\t\t\t\t\t$list.='<li class=\"active\" ><a >'.$this->currentPage.'</a></li>';\n\t\t\t\t\t$listpage['current'] = $this->url.$start;\n\t\t\t\t\t$listpage['current_num'] = $this->currentPage;\n\t\t\t\t}else{\n\t\t\t\t\t$list .= '<li><a href=\"'.$this->url.$start.'\" data-page=\"'.$start.'\">'.$start.'</a></li>';\n\t\t\t\t}\n\t\t\t\t$listpage['list'][] = array('url'=>$this->url.$start,'num'=>$start);\n\t\t\t\t$start++;\n\t\t\t}\n\t\t\t\n\t\t\t$prev = '<li><a href=\"'.$this->url.($this->currentPage-1).'\" class=\"layui-laypage-prev\" data-page=\"'.($this->currentPage-1).'\"><em>&lt;</em></a></li>';\n\t\t\t\n\t\t\t$next = '<li><a href=\"'.$this->url.($this->currentPage+1).'\" class=\"layui-laypage-next\" data-page=\"'.($this->currentPage+1).'\"><em>&gt;</em></a></li>';\n\t\t\t\n\t\t\t$all = '<li><a href=\"javascript:;\" data-page=\"'.$this->currentPage.'\">总共'.$this->currentPage.'/'.$this->allpage.'页 '.$this->sum.'条数据</a></li>';\n\t\t\t\n\t\t\t\n\t\t\t$last = '<li><a href=\"'.$this->url.$this->allpage.'\" class=\"layui-laypage-prev\" data-page=\"'.$this->allpage.'\"><em>尾页</em></a></li>';\n\t\t\t\n\t\t\t$ext = '<div class=\"pagination\"><ul>';\n\t\t\t$list = $list;\n\t\t\t\n\t\t\tif($this->currentPage!=1){\n\t\t\t\t$list = $prev.'<li><a href=\"'.$this->url.'1\" data-page=\"1\">首页</a></li>'.$list;\n\t\t\t\t$listpage['prev'] = $this->url.($this->currentPage-1);\n\t\t\t}\n\t\t\tif($this->currentPage<$this->allpage){\n\t\t\t\t$list .= $next;\n\t\t\t\t$listpage['next'] = $this->url.($this->currentPage+1);\n\t\t\t}\n\t\t\t\n\t\t\tif($this->allpage > $this->pv){\n\t\t\t\t$list .= $last;\n\t\t\t}\n\t\t\t$listpage['last'] = $this->url.$this->allpage;\n\t\t\t$list.=$all;\n\t\t\t$list = $ext.$list.'</ul></div>';\n\t\t\t$this->listpage = $listpage;\n\t\t\t$this->prevpage = $listpage['prev'];\n\t\t\t$this->nextpage = $listpage['next'];\n\t\t\treturn $list;\n\t\t\t\n\t\t}\n\t\t\n\t\tpublic function setPage($config){\n\t\t\t\n\t\t\tif(isset($config['page'])){\n\t\t\t\t$this->currentPage = $config['page'];\n\t\t\t}\n\t\t\tif(isset($config['limit'])){\n\t\t\t\t$this->limit = $config['limit'];\n\t\t\t}\n\t\t\t\n\t\t\treturn $this;\n\t\t}\n\t\t\n\t\tpublic function go(){\n\t\t\t\n\t\t\t\n\t\t\t$this->sum = count($this->datalist);\n\t\t\t$lists = array();\n            $start = $this->limit * ($this->currentPage-1);\n\t\t\t\n            $end = $this->limit * $this->currentPage;\n\t\t\t$i = 0;\n\t\t\tforeach($this->datalist as $v){\n\t\t\t\tif($end>$i && $start<=$i){\n\t\t\t\t\t$lists[]=$v;\n\t\t\t\t}\n\t\t\t\t$i++;\n\t\t\t}\n\t\t\t$allpage = ceil($this->sum/$this->limit);\n\t\t\tif($allpage==0){$allpage=1;}\n\t\t\t$this->allpage = $allpage;\n\t\t\treturn $lists;\n\t\t}\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n?>"
  },
  {
    "path": "frphp/extend/DB_API.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2019/8\n// +----------------------------------------------------------------------\n\n\n\n\nclass DB_API\n{\n    // 数据库表名\n    protected $table;\n \n    // 数据库主键\n    protected $primary = 'id';\n\t\n\t//表前缀\n\tprotected $prefix = '';\n \n    // WHERE和ORDER拼装后的条件\n    private $filter = array();\n \n\t//PDO\n\tprivate $pdo;\n\t\n\t//PDOStatement\n\tprivate $Statement;\n\t\n\t//PDO链接数据库\n\tpublic function __construct($config){\n\t\tclass_exists('PDO') or exit(\"not found PDO\");\n\t\t\n\t\ttry{\n\t\t\t$this->pdo = new PDO(\"mysql:host=\".$config['db_host'].\";port=\".$config['db_port'].\";dbname=\".$config['db_name'],$config['db_user'], $config['db_pass']); \n\t\t}catch(PDOException $e){\n\t\t\t//数据库无法链接，如果您是第一次使用，请先配置数据库！\n\t\t\texit($e->getMessage());\n\t\t}\n\t\t$this->prefix = $config['db_prefix'];\n\t\t$this->pdo->exec(\"SET NAMES UTF8\");\n\t\t\n\t\t\n\t}\n\t//配置表信息\n    public function set_table($table=null,$primary='id'){\n        if($table==null){ exit('Not found Table');}\n\t\t\n\t\t$this->primary = $primary;\n\t\t$this->table = $this->prefix.$table;\n        return $this;\n    }\n\t\n\t\n\t//获取数据\n\tpublic function getData($sql)\n\t{\n\t\tif(!$result = $this->query($sql))return array();\n\t\tif(!$this->Statement->rowCount())return array();\n\t\t$rows = array();\n\t\twhile($rows[] = $this->Statement->fetch(PDO::FETCH_ASSOC)){}\n\t\t$this->Statement=null;\n\t\tarray_pop($rows);\n\t\treturn $rows;\n\t}\n\t\n\t//查询数据条数\n\tpublic function getCount($conditions){\n\t\t$where = '';\n\t\tif(is_array($conditions)){\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $value ){\n\t\t\t\t$value =  '\\''.$value.'\\'';\n\t\t\t\t$join[] = \"{$key} = {$value}\";\n\t\t\t}\n\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t}else{\n\t\t\tif(null != $conditions)$where = \"WHERE \".$conditions;\n\t\t}\n\t\t$sql = \"SELECT count(*) as Frcount FROM {$this->table} {$where}\";\n        $result = $this->getData($sql);\n\t\treturn $result[0]['Frcount'];\n\t\t\n\t}\n\t//获取单一字段内容\n\tpublic function getField($where=null,$fields=null){\n\t\tif( $record = $this->findAll($where, null, $fields, 1) ){\n\t\t\t$res = array_pop($record);\n\t\t\treturn $res[$fields];\n\t\t}else{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\t\n\t//递增数据\n\tpublic function goInc($conditions,$field,$vp=1){\n\t\t$where = \"\";\n\t\tif(is_array($conditions)){\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $value ){\n\t\t\t\t$value = '\\''.$value.'\\'';\n\t\t\t\t$join[] = \"{$key} = {$value}\";\n\t\t\t}\n\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t}else{\n\t\t\tif(null != $conditions)$where = \"WHERE \".$conditions;\n\t\t}\n\t\t$values = \"{$field} = {$field} + {$vp}\";\n\t\t$sql = \"UPDATE {$this->table} SET {$values} {$where}\";\n\t\t\n\t\treturn $this->pdo->exec($sql);\n\t\t\n\t}\n\t\n\t//递减\n\tpublic function goDec($conditions,$field,$vp=1){\n\t\treturn $this->goInc($conditions,$field,-$vp);\n\t}\n\t    // 修改数据\n    public function update($conditions,$row)\n    {\n        $where = \"\";\n\t\t$row = $this->__prepera_format($row);\n\t\tif(empty($row)){\n        return FALSE;\n        }\n\t\tif(is_array($conditions)){\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $condition ){\n\t\t\t\t$condition = '\\''.$condition.'\\'';\n\t\t\t\t$join[] = \"{$key} = {$condition}\";\n\t\t\t}\n\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t}else{\n\t\t\tif(null != $conditions){\n              $where = \"WHERE \".$conditions;\n            }\n\t\t}\n\t\tforeach($row as $key => $value){\n\t\t\t$value = '\\''.$value.'\\'';\n\t\t\t$vals[] = \"{$key} = {$value}\";\n\t\t}\n\t\t$values = join(\", \",$vals);\n\t\t$sql = \"UPDATE {$this->table} SET {$values} {$where}\";\n        //echo $sql.'<br/>';\n\t\t$res = $this->pdo->exec($sql);\n      if($res){\n      \treturn $res;\n      }else{\n      \tvar_dump($this->pdo->errorInfo());\n      }\n\t\t\n\t\t\n    }\n \n \n    // 查询所有\n    public function findAll($conditions=null,$order=null,$fields=null,$limit=null)\n    {\n\t\t$where = '';\n\t\tif(is_array($conditions)){\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $value ){\n\t\t\t\t$value =  '\\''.$value.'\\'';\n\t\t\t\t$join[] = \"{$key} = {$value}\";\n\t\t\t}\n\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t}else{\n\t\t\tif(null != $conditions)$where = \"WHERE \".$conditions;\n\t\t}\n      if(is_array($order)){\n       \t\t$where .= ' ORDER BY ';\n            $where .= implode(',', $order);\n      }else{\n         if($order!=null)$where .= \" ORDER BY  \".$order;\n      }\n\t\t\n\t\tif(!empty($limit))$where .= \" LIMIT {$limit}\";\n\t\t$fields = empty($fields) ? \"*\" : $fields;\n \n\t\t$sql = \"SELECT {$fields} FROM {$this->table} {$where}\";\n\t\t\n        return $this->getData($sql);\n \n    }\n \n    // 查询一条\n    public function find($where=null,$order=null,$fields=null,$limit=1)\n    {\n\t   if( $record = $this->findAll($where, $order, $fields, 1) ){\n\t\t\treturn array_pop($record);\n\t\t}else{\n\t\t\treturn FALSE;\n\t\t}\n    }\n\t\n\t//执行SQL语句并检查是否错误\n\tpublic function query($sql){\n\t\t$this->filter[] = $sql;\n        $this->Statement = $this->pdo->query($sql);\n        if ($this->Statement) {\n\t\t\treturn $this;\n        }else{\n\t\t\t$msg = $this->pdo->errorInfo();\n\t\t\tif($msg[2]) exit('数据库错误：' . $msg[2] . end($this->filter));\n\t\t}\n\t}\n \n\t//执行SQL语句函数\n\tpublic function findSql($sql)\n\t{\n\t\treturn $this->getData($sql);\n\t}\n\t\n    // 根据条件 (conditions) 删除\n    public function delete($conditions)\n    {\n       $where = \"\";\n\t\tif(is_array($conditions)){\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $condition ){\n\t\t\t\t$condition = '\\''.$condition.'\\'';\n\t\t\t\t$join[] = \"{$key} = {$condition}\";\n\t\t\t}\n\t\t\t$where = \"WHERE ( \".join(\" AND \",$join). \")\";\n\t\t}else{\n\t\t\tif(null != $conditions)$where = \"WHERE ( \".$conditions. \")\";\n\t\t}\n\t\t$sql = \"DELETE FROM {$this->table} {$where}\";\n\t\treturn $this->pdo->exec($sql);\n    }\n \n    // 新增数据\n    public function add($row)\n    {\n       if(!is_array($row)){\n         return FALSE;\n       }\n\t\t$row = $this->__prepera_format($row);\n\t\tif(empty($row)){\n         return FALSE;\n        }\n\t\tforeach($row as $key => $value){\n\t\t\t$cols[] = $key;\n\t\t\t$vals[] = '\\''.$value.'\\'';\n\t\t}\n\t\t$col = join(',', $cols);\n\t\t$val = join(',', $vals);\n \n\t\t$sql = \"INSERT INTO {$this->table} ({$col}) VALUES ({$val})\";\n\t\tif( FALSE != $this->pdo->exec($sql) ){\n\t\t\tif( $newinserid = $this->pdo->lastInsertId() ){\n\t\t\t\treturn $newinserid;\n\t\t\t}else{\n\t\t\t\t$a=$this->find($row, \"{$this->primary} DESC\",$this->primary);\n\t\t\t\treturn array_pop($a);\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n    }\n \n \n \n\tprivate function __prepera_format($rows)\n\t{\n\t\t$stmt = $this->pdo->prepare('DESC '.$this->table);  \n\t\t$stmt->execute();  \n\t\t$columns = $stmt->fetchAll(PDO::FETCH_COLUMN);\n\t\t$newcol = array();\n\t\tforeach( $columns as $col ){\n\t\t\t$newcol[$col] = null;\n\t\t}\n\t\treturn array_intersect_key($rows,$newcol);\n\t}\n\t\n\t\n}\n\n\n/*\n\n//配置一个数据库\n$config  = [\n    'db_host' => 'localhost',//或者127.0.0.1 或指定的数据库地址\n    'db_port' => 3306,//默认mysql数据库端口\n    'db_name' => 'test',//数据库名字\n    'db_user' => 'root',//数据库用户名\n    'db_pass' => 'root',//数据库密码\n\t'db_prefix' => '',//表前缀\n];\n\n$db = new DB_API($config);\n \n//将传入表数据的对象类放入一个变量中，方便多次使用\n$article = $db->set_table('article');\n\n//新增一条数据\n$newdata = ['title'=>'测试1','addtime'=>time()];\n$r = $article->add($newdata);\nif($r){\n    echo '新增成功！';\n}else{\n    echo '操作失败！';\n}\n\n//查询一条数据\n$where = ['id'=>1];// 也支持字符串：$where = ' id = 1 ';\n$find = $article->find($where);//查询一条数据\n//$find = $article->findAll($where);查询多条数据\nprint_r($find);\n\n//更新数据-更新id为1的数据\n$where = ['title'=>'测试1122'];\n$update = $article->update(['id'=>1],$where);\nif($update ){\n    echo '更新成功！';\n    //查询对应数据并打印\n    $newdata = $article->find('id=1');\n    print_r($newdata);\n}else{\n    echo '更新失败！';\n}\n\n//删除一条数据\n$where = ['id'=>1];//也支持字符串：$where = 'id=1';\n$del =  $article->delete($where);\nif($del ){\n    echo '删除成功！';\n}else{\n    echo '删除失败！';\n}\n\n//额外功能\n\n//根据查询条件，获取条数\n$where = ' id>0 ';//也可以是数组形式\n$count = $article->getCount($where);\nprint_r($count);\n\n//根据条件，递增数据库内整数类型字段值\n$a = $article->find(['id'=>1]);\nif(!$a){ exit('缺少ID为1的数据！');}\necho '原数据：'.$a['addtime'].'<br/>';\n$r = $article->goInc(['id'=>1],'addtime',1);\n$a = $article->find(['id'=>1]);\necho '新数据：'.$a['addtime'];\n\n//同理，根据条件，递减数据库内整数类型字段值\n$a = $article->find(['id'=>1]);\nif(!$a){ exit('缺少ID为1的数据！');}\necho '原数据：'.$a['addtime'].'<br/>';\n$r = $article->goDec(['id'=>1],'addtime',1);\n$a = $article->find(['id'=>1]);\necho '新数据：'.$a['addtime'];\n\n//执行原生SQL语句\n$sql = 'select *  from article where id>0 ';\n$lists = $article->findSql($sql);\nprint_r($lists);\n\n//根据条件查询出对应的字段的值\n$where = ['id'=>1];//可以是字符串：'id=1';\n$res = $article->getField($where,'title');//未找到返回false\nprint_r($res);\n*/"
  },
  {
    "path": "frphp/extend/DatabaseTool.php",
    "content": "<?php\r\n\r\n/**\r\n * Class DatabaseTool\r\n * 最新工具类\r\n * @author tofo <2581047041@qq.com>\r\n * @time 2022/7/19 19:00\r\n */\r\nclass DatabaseTool\r\n{\r\n    private $handler;\r\n    private $config = array(\r\n        'host' => 'localhost',\r\n        'port' => 3306,\r\n        'user' => 'root',\r\n        'password' => 'root',\r\n        'database' => 'test',\r\n        'charset' => 'utf-8',\r\n        'target' => '',\r\n        'prefix' => '',\r\n    );\r\n    private $tables = array();\r\n    private $limit = 10000;//每条最大插入条数\r\n    private $error;\r\n    private $begin; //开始时间\r\n    /**\r\n     * 架构方法\r\n     * @param array $config\r\n     */\r\n    public function __construct($config = array())\r\n    {\r\n        //date_default_timezone_set('Asia/Shanghai');\r\n        ini_set(\"memory_limit\",\"800M\");\r\n        $this->begin = microtime(true);\r\n        $config = is_array($config) ? $config : array();\r\n        $this->config = array_merge($this->config, $config);\r\n        //启动PDO连接\r\n        if (!$this->handler instanceof PDO)\r\n        {\r\n            try\r\n            {\r\n                $this->handler = new PDO(\"mysql:host=\".$this->config['host'].\";port={$this->config['port']};dbname={$this->config['database']}\", $this->config['user'], $this->config['password']);\r\n                $this->handler->query(\"set names utf8\");\r\n            }\r\n            catch (PDOException $e)\r\n            {\r\n                $this->error = $e->getMessage();\r\n                return false;\r\n            }\r\n            \r\n        }\r\n    }\r\n    /**\r\n     * 备份\r\n     * @param array $tables\r\n     * @return bool\r\n     */\r\n    public function backup($tables = array())\r\n    {\r\n        //存储表定义语句的数组\r\n        $ddl = array();\r\n        //存储数据的数组\r\n        $data = array();\r\n        $this->setTables($tables);\r\n        if (!empty($this->tables))\r\n        {\r\n            foreach ($this->tables as $table)\r\n            {\r\n                if(stripos($table,DB_PREFIX)!==false){\r\n                    $ddl[] = $this->getDDL($table);\r\n                    $data[] = $this->getData($table);\r\n                }\r\n            }\r\n            //开始写入\r\n            $this->writeToFile($this->tables, $ddl, $data);\r\n        }\r\n        else\r\n        {\r\n            $this->error = '数据库中没有表!';\r\n            return false;\r\n        }\r\n    }\r\n    /**\r\n     * 设置要备份的表\r\n     * @param array $tables\r\n     */\r\n    private function setTables($tables = array())\r\n    {\r\n        if (!empty($tables) && is_array($tables))\r\n        {\r\n            //备份指定表\r\n            $this->tables = $tables;\r\n        }\r\n        else\r\n        {\r\n            //备份全部表\r\n            $this->tables = $this->getTables();\r\n        }\r\n    }\r\n    /**\r\n     * 查询\r\n     * @param string $sql\r\n     * @return mixed\r\n     */\r\n    private function query($sql = '')\r\n    {\r\n        $stmt = $this->handler->query($sql);\r\n        $stmt->setFetchMode(PDO::FETCH_NUM);\r\n        $list = $stmt->fetchAll();\r\n        return $list;\r\n    }\r\n    /**\r\n     * 获取全部表\r\n     * @return array\r\n     */\r\n    private function getTables()\r\n    {\r\n        $sql = 'SHOW TABLES';\r\n        $list = $this->query($sql);\r\n        $tables = array();\r\n        foreach ($list as $value)\r\n        {\r\n            if(strpos($value[0],$this->config['prefix'])!==false){\r\n                $tables[] = $value[0];\r\n            }\r\n        }\r\n        return $tables;\r\n    }\r\n    /**\r\n     * 获取表定义语句\r\n     * @param string $table\r\n     * @return mixed\r\n     */\r\n    private function getDDL($table = '')\r\n    {\r\n        $sql = \"SHOW CREATE TABLE `{$table}`\";\r\n        $ddl = $this->query($sql)[0][1] . ';';\r\n        return $ddl;\r\n    }\r\n    //过滤\r\n    private function safeParams($value){\r\n        $ra=Array('/([\\x00-\\x08])/','/([\\x0b-\\x0c])/','/([\\x0e-\\x19])/');\r\n        $value = preg_replace($ra,'',$value);\r\n        $value = addslashes($value);\r\n        return $value;\r\n    }\r\n    /**\r\n     * 获取表数据\r\n     * @param string $table\r\n     * @return mixed\r\n     */\r\n    private function getData($table = '')\r\n    {\r\n        $sql = \"SHOW COLUMNS FROM `{$table}`\";\r\n        $list = $this->query($sql);\r\n        //字段\r\n        $columns = '';\r\n        //需要返回的SQL\r\n        $query = [];\r\n        $max = $this->limit;\r\n        $start = 1;\r\n        $values = [];\r\n        $n = 0;\r\n        foreach ($list as $value)\r\n        {\r\n            $columns .= \"`{$value[0]}`,\";\r\n        }\r\n        $columns = substr($columns, 0, -1);\r\n        $data = $this->query(\"SELECT * FROM `{$table}`\");\r\n        foreach ($data as $value)\r\n        {\r\n            $dataSql = '';\r\n            foreach ($value as $v)\r\n            {\r\n                if($v==='' || $v===null){\r\n                    $dataSql .= \" NULL,\";\r\n                }else{\r\n                    $v = $this->safeParams($v);\r\n                    $dataSql .= \"'{$v}',\";\r\n                }\r\n                \r\n            }\r\n            $dataSql = substr($dataSql, 0, -1);\r\n            if($start%$max==1){\r\n                $n = (int)$start/$max;\r\n            }\r\n            \r\n            $values[$n][]= \"({$dataSql})\";\r\n        }\r\n        foreach($values as $v){\r\n            $query[]=\"INSERT INTO `{$table}` ({$columns}) VALUES \\r\\n\".implode(\",\\r\\n\",$v).\";\\r\\n\";\r\n        }\r\n        return $query;\r\n    }\r\n    /**\r\n     * 写入文件\r\n     * @param array $tables\r\n     * @param array $ddl\r\n     * @param array $data\r\n     */\r\n    private function writeToFile($tables = array(), $ddl = array(), $data = array())\r\n    {\r\n        $public_str = \"/*\\r\\nMySQL Database Backup Tools\\r\\n\";\r\n        $public_str .= \"Server:{$this->config['host']}:{$this->config['port']}\\r\\n\";\r\n        $public_str .= \"Database:{$this->config['database']}\\r\\n\";\r\n        $public_str .= \"Data:\" . date('Y-m-d H:i:s', time()) . \"\\r\\n*/\\r\\n\";\r\n        $i = 0;\r\n        echo '备份数据库-'.$this->config['database'].'<br />';\r\n        $countsql = 0;//记录sql数\r\n        $filenum = 0;//文件序号\r\n        $backfile = $this->config['target']==''? str_replace('_','',$this->config['database']).'_'.date('Y_m_d_H_i_s').'_'.rand(100000,999999): $this->config['target'].date('YmdHis');//文件名\r\n        $str = $public_str.\"SET FOREIGN_KEY_CHECKS=0;\\r\\n\";\r\n        foreach ($tables as $table)\r\n        {\r\n            echo '备份表：'.$table.'<br>';\r\n            $str .= \"-- ----------------------------\\r\\n\";\r\n            $str .= \"-- Table structure for {$table}\\r\\n\";\r\n            $str .= \"-- ----------------------------\\r\\n\";\r\n            $str .= \"DROP TABLE IF EXISTS `{$table}`;\\r\\n\";\r\n            $str .= $ddl[$i] . \"\\r\\n\";\r\n            \r\n            $i++;\r\n            //echo '备份成功！<br/>';\r\n            \r\n        }\r\n        \r\n        $filenum = 1;\r\n        $i = 0;\r\n        foreach($tables as $table){\r\n            echo '备份表数据：'.$table.' <br>';\r\n            $str .= \"-- ----------------------------\\r\\n\";\r\n            $str .= \"-- Records of {$table}\\r\\n\";\r\n            $str .= \"-- ----------------------------\\r\\n\";\r\n            //$str .= $data[$i] . \"\\r\\n\";\r\n            foreach ($data[$i] as $v){\r\n                $str .= $v;\r\n            }\r\n            $i++;\r\n            \r\n            \r\n        }\r\n        $str = '<?php die();?>'.$str;\r\n        $isok = file_put_contents('backup/'.$backfile.'.php', $str);\r\n        echo '备份成功！<br/>  备份成功!花费时间' . (microtime(true) - $this->begin) . 'ms';\r\n        \r\n        Redirect(U('Index/beifen'),'备份完成~',1);\r\n    }\r\n    /**\r\n     * 错误信息\r\n     * @return mixed\r\n     */\r\n    public function getError()\r\n    {\r\n        return $this->error;\r\n    }\r\n    \r\n    //数据库还原\r\n    \r\n    public function restore($path = ''){\r\n        if (!file_exists($path)){\r\n            $this->error('SQL文件不存在!');\r\n            return false;\r\n        }else{\r\n            $filename_arr = explode('.php',$path);\r\n            $filename_arr2 = explode('/',$filename_arr[0]);\r\n            $filename = end($filename_arr2);\r\n            //读取备份数据库\r\n            $dir = APP_PATH.'backup';\r\n            $fileArray=array();\r\n            $fileArray[] = $dir.'/'.$filename.'.php';\r\n            for($i=1;file_exists($dir.'/'.$filename.'_v'.$i.'.php')===true;$i++){\r\n                $fileArray[]=$dir.'/'.$filename.'_v'.$i.'.php';\r\n            }\r\n            \r\n            foreach($fileArray as $path){\r\n                $sql = $this->parseSQL($path);\r\n                try{\r\n                    $n = $this->handler->exec($sql);\r\n                    if(!$n){\r\n                        $msg = $this->handler->errorInfo();\r\n                        if($msg[2]) Exit('数据库错误：' . $msg[2] . end($sql));\r\n                    }\r\n                    \r\n                    \r\n                }catch (PDOException $e){\r\n                    $this->error = $e->getMessage();\r\n                    return false;\r\n                }\r\n                \r\n            }\r\n            setCache('classtype',null);\r\n            setCache('mobileclasstype',null);\r\n            setCache('classtypedatamobile',null);\r\n            setCache('classtypedatapc',null);\r\n            echo '还原成功!花费时间', (microtime(true) - $this->begin) . 'ms';\r\n            Redirect(U('Index/beifen'),'还原成功~',1);\r\n            \r\n        }\r\n    }\r\n    /**\r\n     * 解析SQL文件为SQL语句数组\r\n     * @param string $path\r\n     * @return array|mixed|string\r\n     */\r\n    private function parseSQL($path = '')\r\n    {\r\n        $sql = file_get_contents($path);\r\n        //替换掉15个字符串\r\n        $sql = substr($sql,14);\r\n        $sql = explode(\"\\r\\n\", $sql);\r\n        //先消除--注释\r\n        $sql = array_filter($sql, function ($data)\r\n        {\r\n            if (empty($data) || preg_match('/^--.*/', $data))\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return true;\r\n            }\r\n        });\r\n        $sql = implode('', $sql);\r\n        //删除/**/注释\r\n        $sql = preg_replace('/\\/\\*.*\\*\\//', '', $sql);\r\n        return $sql;\r\n        \r\n        \r\n    }\r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "frphp/extend/FrSession.php",
    "content": "<?php\n\n/**\n * ************\n * FrSession类  重写session机制\n * 将session存到redis数据库中\n * ************\n */\n \n\nclass FrSession implements SessionHandlerInterface\n{\n\n    private $save_handle = '';\n    private $prefix = 'frses_';//前缀\n    private $expire = null;\n\tprivate $save_path = 'cache/tmp';//存储目录\n\tprivate $life_time = 1800;//过期时间，单位s  -1表示不过期\n    private $config = array(\n\t\t\t\n    );\n\n    public function __construct($config = array())\n    {\n\n        if (!empty($config)){\n\t\t\t$this->save_path = $config['save_path'];\n\t\t\t$this->life_time = $config['life_time'];\n\t\t} \n\n        \n    }\n    function checkmkdirs($dir, $mode = 0755)\n    {\n        if (!is_dir($dir)) {\n            $this->checkmkdirs(dirname($dir), $mode);\n            return @mkdir($dir, $mode);\n        }\n        return true;\n    }\n\n    /**\n     * 当session_start()函数被调用的时候该函数被触发\n     *\n     * @see SessionHandlerInterface::open()\n     */\n    #[\\ReturnTypeWillChange]\n    public function open($save_path, $name)\n    {\n      \n        return true;\n\n    }\n\n    /**\n     * 关闭当前session\n     * 当session关闭的时候该函数自动被触发\n     *\n     * @see SessionHandlerInterface::close()\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function close()\n    {\n        return true;\n    }\n\n    /**\n     * 从session存储空间读取session的数据。\n     * 当调用session_start()函数的时候该函数会被触发\n     * 但是在session_start()函数调用的时候先触发open函数，再触发该函数\n     *\n     * @see SessionHandlerInterface::read()\n     * @return string|false\n     */\n    #[\\ReturnTypeWillChange]\n    public function read($id)\n    {\t\n        if(!is_dir($this->save_path)){\n\t\t\t$this->checkmkdirs($this->save_path);\n\t\t}\n\t\t$session_id = str_replace(['..','/','\\\\'],'',$id);\n        $sfile = $this->save_path.'/'.$this->prefix.$session_id.'.php';\n        $res = $this->sesstime($sfile);\n\t\tif($res){\n\t\t\treturn $res;\n\t\t}else{\n\t\t\treturn '';\n\t\t}\n\n    }\n\n    /**\n     * 将session的数据写入到session的存储空间内。\n     * 当session准备好存储和关闭的时候调用该函数\n     *\n     * @see SessionHandlerInterface::write()\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function write($id, $data)\n    {\n\t\t$session_id = str_replace(['..','/','\\\\'],'',$id);\n        if(!is_dir($this->save_path)){\n\t\t\t$this->checkmkdirs($this->save_path);\n\t\t}\n        if( !is_readable($this->save_path) ){\n            return false;\n        }\n        $sfile = $this->save_path.'/'.$this->prefix.$session_id.'.php';\n\t\t$life_time = ( -1 == $this->life_time ) ? '300000000' : $this->life_time;\n\t\t\n\t\t$value = '<?php die();?>'.( time() + $life_time ).serialize($data);\n\t\t$res = file_put_contents($sfile, $value);\n\t\tif($res){\n\t\t\treturn true;\n\t\t}else{\n\t\t\treturn false;\n\t\t}\n    }\n\n    /**\n     * 销毁session\n     *\n     * @see SessionHandlerInterface::destroy()\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function destroy($id)\n    {\n\t\t$sfile = $this->save_path.'/'.$this->prefix.$id.'.php';\n\t\tif(file_exists($sfile)){\n\t\t\treturn @unlink($sfile);\n\t\t}\n\t\treturn true;\n    }\n\n    /**\n     * 清除垃圾session，也就是清除过期的session。\n     * 该函数是基于php.ini中的配置选项\n     * session.gc_divisor, session.gc_probability 和 session.gc_lifetime所设置的值的\n     *\n     * @see SessionHandlerInterface::gc()\n     */\n    #[\\ReturnTypeWillChange]\n    public function gc($maxlifetime)\n    {\n        \n\t\t$dirName=@opendir($this->save_path);\n\t\twhile(($file = @readdir($dirName)) !== false){\n\t\t\tif($file!='.' && $file!='..'){\n\t\t\t\t$this->sesstime($this->save_path.'/'.$file);\n\t\t\t}\n\t\t}\n\t\tclosedir($dirName);\n\n    }\n\tprivate function sesstime($sfile){\n\t\tif( !is_readable($sfile) ){\n\t\t\treturn false;\n\t\t}\n\t\t$arg_data = file_get_contents($sfile);\n\t\tif( substr($arg_data, 14, 10) < time() ){\n\t\t\t@unlink($sfile); \n\t\t\treturn false;\n\t\t}\n\t\treturn unserialize(substr($arg_data, 24));\n\t}\n}\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "frphp/extend/PHPMailer/LICENSE",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "frphp/extend/PHPMailer/PHPMailerAutoload.php",
    "content": "<?php\n/**\n * PHPMailer SPL autoloader.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer SPL autoloader.\n * @param string $classname The name of the class to load\n */\nfunction PHPMailerAutoload($classname)\n{\n    //Can't use __DIR__ as it's only in PHP 5.3+\n    $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';\n    if (is_readable($filename)) {\n        require $filename;\n    }\n}\n\nif (version_compare(PHP_VERSION, '5.1.2', '>=')) {\n    //SPL autoloading was introduced in PHP 5.1.2\n    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {\n        spl_autoload_register('PHPMailerAutoload', true, true);\n    } else {\n        spl_autoload_register('PHPMailerAutoload');\n    }\n} else {\n\texit('版本太低，请调整PHP版本高于7.0');\n    /**\n     * Fall back to traditional autoload for old PHP versions\n     * @param string $classname The name of the class to load\n     */\n    \n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/VERSION",
    "content": "5.2.24\n"
  },
  {
    "path": "frphp/extend/PHPMailer/class.phpmailer.php",
    "content": "<?php\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer - PHP email creation and transport class.\n * @package PHPMailer\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n */\nclass PHPMailer\n{\n    /**\n     * The PHPMailer Version number.\n     * @var string\n     */\n    public $Version = '5.2.24';\n\n    /**\n     * Email priority.\n     * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n     * When null, the header is not set at all.\n     * @var integer\n     */\n    public $Priority = null;\n\n    /**\n     * The character set of the message.\n     * @var string\n     */\n    public $CharSet = 'iso-8859-1';\n\n    /**\n     * The MIME Content-type of the message.\n     * @var string\n     */\n    public $ContentType = 'text/plain';\n\n    /**\n     * The message encoding.\n     * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n     * @var string\n     */\n    public $Encoding = '8bit';\n\n    /**\n     * Holds the most recent mailer error message.\n     * @var string\n     */\n    public $ErrorInfo = '';\n\n    /**\n     * The From email address for the message.\n     * @var string\n     */\n    public $From = 'root@localhost';\n\n    /**\n     * The From name of the message.\n     * @var string\n     */\n    public $FromName = 'Root User';\n\n    /**\n     * The Sender email (Return-Path) of the message.\n     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n     * @var string\n     */\n    public $Sender = '';\n\n    /**\n     * The Return-Path of the message.\n     * If empty, it will be set to either From or Sender.\n     * @var string\n     * @deprecated Email senders should never set a return-path header;\n     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference\n     */\n    public $ReturnPath = '';\n\n    /**\n     * The Subject of the message.\n     * @var string\n     */\n    public $Subject = '';\n\n    /**\n     * An HTML or plain text message body.\n     * If HTML then call isHTML(true).\n     * @var string\n     */\n    public $Body = '';\n\n    /**\n     * The plain-text message body.\n     * This body can be read by mail clients that do not have HTML email\n     * capability such as mutt & Eudora.\n     * Clients that can read HTML will view the normal Body.\n     * @var string\n     */\n    public $AltBody = '';\n\n    /**\n     * An iCal message part body.\n     * Only supported in simple alt or alt_inline message types\n     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator\n     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/\n     * @link http://kigkonsult.se/iCalcreator/\n     * @var string\n     */\n    public $Ical = '';\n\n    /**\n     * The complete compiled MIME message body.\n     * @access protected\n     * @var string\n     */\n    protected $MIMEBody = '';\n\n    /**\n     * The complete compiled MIME message headers.\n     * @var string\n     * @access protected\n     */\n    protected $MIMEHeader = '';\n\n    /**\n     * Extra headers that createHeader() doesn't fold in.\n     * @var string\n     * @access protected\n     */\n    protected $mailHeader = '';\n\n    /**\n     * Word-wrap the message body to this number of chars.\n     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n     * @var integer\n     */\n    public $WordWrap = 0;\n\n    /**\n     * Which method to use to send mail.\n     * Options: \"mail\", \"sendmail\", or \"smtp\".\n     * @var string\n     */\n    public $Mailer = 'mail';\n\n    /**\n     * The path to the sendmail program.\n     * @var string\n     */\n    public $Sendmail = '/usr/sbin/sendmail';\n\n    /**\n     * Whether mail() uses a fully sendmail-compatible MTA.\n     * One which supports sendmail's \"-oi -f\" options.\n     * @var boolean\n     */\n    public $UseSendmailOptions = true;\n\n    /**\n     * Path to PHPMailer plugins.\n     * Useful if the SMTP class is not in the PHP include path.\n     * @var string\n     * @deprecated Should not be needed now there is an autoloader.\n     */\n    public $PluginDir = '';\n\n    /**\n     * The email address that a reading confirmation should be sent to, also known as read receipt.\n     * @var string\n     */\n    public $ConfirmReadingTo = '';\n\n    /**\n     * The hostname to use in the Message-ID header and as default HELO string.\n     * If empty, PHPMailer attempts to find one with, in order,\n     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n     * 'localhost.localdomain'.\n     * @var string\n     */\n    public $Hostname = '';\n\n    /**\n     * An ID to be used in the Message-ID header.\n     * If empty, a unique id will be generated.\n     * You can set your own, but it must be in the format \"<id@domain>\",\n     * as defined in RFC5322 section 3.6.4 or it will be ignored.\n     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4\n     * @var string\n     */\n    public $MessageID = '';\n\n    /**\n     * The message Date to be used in the Date header.\n     * If empty, the current date will be added.\n     * @var string\n     */\n    public $MessageDate = '';\n\n    /**\n     * SMTP hosts.\n     * Either a single hostname or multiple semicolon-delimited hostnames.\n     * You can also specify a different port\n     * for each host by using this format: [hostname:port]\n     * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n     * You can also specify encryption type, for example:\n     * (e.g. \"tls://smtp1.example.com:587;ssl://smtp2.example.com:465\").\n     * Hosts will be tried in order.\n     * @var string\n     */\n    public $Host = 'localhost';\n\n    /**\n     * The default SMTP server port.\n     * @var integer\n     * @TODO Why is this needed when the SMTP class takes care of it?\n     */\n    public $Port = 25;\n\n    /**\n     * The SMTP HELO of the message.\n     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n     * one with the same method described above for $Hostname.\n     * @var string\n     * @see PHPMailer::$Hostname\n     */\n    public $Helo = '';\n\n    /**\n     * What kind of encryption to use on the SMTP connection.\n     * Options: '', 'ssl' or 'tls'\n     * @var string\n     */\n    public $SMTPSecure = '';\n\n    /**\n     * Whether to enable TLS encryption automatically if a server supports it,\n     * even if `SMTPSecure` is not set to 'tls'.\n     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n     * @var boolean\n     */\n    public $SMTPAutoTLS = true;\n\n    /**\n     * Whether to use SMTP authentication.\n     * Uses the Username and Password properties.\n     * @var boolean\n     * @see PHPMailer::$Username\n     * @see PHPMailer::$Password\n     */\n    public $SMTPAuth = false;\n\n    /**\n     * Options array passed to stream_context_create when connecting via SMTP.\n     * @var array\n     */\n    public $SMTPOptions = array();\n\n    /**\n     * SMTP username.\n     * @var string\n     */\n    public $Username = '';\n\n    /**\n     * SMTP password.\n     * @var string\n     */\n    public $Password = '';\n\n    /**\n     * SMTP auth type.\n     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified\n     * @var string\n     */\n    public $AuthType = '';\n\n    /**\n     * SMTP realm.\n     * Used for NTLM auth\n     * @var string\n     */\n    public $Realm = '';\n\n    /**\n     * SMTP workstation.\n     * Used for NTLM auth\n     * @var string\n     */\n    public $Workstation = '';\n\n    /**\n     * The SMTP server timeout in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * @var integer\n     */\n    public $Timeout = 300;\n\n    /**\n     * SMTP class debug output mode.\n     * Debug output level.\n     * Options:\n     * * `0` No output\n     * * `1` Commands\n     * * `2` Data and commands\n     * * `3` As 2 plus connection status\n     * * `4` Low-level data output\n     * @var integer\n     * @see SMTP::$do_debug\n     */\n    public $SMTPDebug = 0;\n\n    /**\n     * How to handle debug output.\n     * Options:\n     * * `echo` Output plain-text as-is, appropriate for CLI\n     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n     * * `error_log` Output to error log as configured in php.ini\n     *\n     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n     * <code>\n     * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n     * </code>\n     * @var string|callable\n     * @see SMTP::$Debugoutput\n     */\n    public $Debugoutput = 'echo';\n\n    /**\n     * Whether to keep SMTP connection open after each message.\n     * If this is set to true then to close the connection\n     * requires an explicit call to smtpClose().\n     * @var boolean\n     */\n    public $SMTPKeepAlive = false;\n\n    /**\n     * Whether to split multiple to addresses into multiple messages\n     * or send them all in one message.\n     * Only supported in `mail` and `sendmail` transports, not in SMTP.\n     * @var boolean\n     */\n    public $SingleTo = false;\n\n    /**\n     * Storage for addresses when SingleTo is enabled.\n     * @var array\n     * @TODO This should really not be public\n     */\n    public $SingleToArray = array();\n\n    /**\n     * Whether to generate VERP addresses on send.\n     * Only applicable when sending via SMTP.\n     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path\n     * @link http://www.postfix.org/VERP_README.html Postfix VERP info\n     * @var boolean\n     */\n    public $do_verp = false;\n\n    /**\n     * Whether to allow sending messages with an empty body.\n     * @var boolean\n     */\n    public $AllowEmpty = false;\n\n    /**\n     * The default line ending.\n     * @note The default remains \"\\n\". We force CRLF where we know\n     *        it must be used via self::CRLF.\n     * @var string\n     */\n    public $LE = \"\\n\";\n\n    /**\n     * DKIM selector.\n     * @var string\n     */\n    public $DKIM_selector = '';\n\n    /**\n     * DKIM Identity.\n     * Usually the email address used as the source of the email.\n     * @var string\n     */\n    public $DKIM_identity = '';\n\n    /**\n     * DKIM passphrase.\n     * Used if your key is encrypted.\n     * @var string\n     */\n    public $DKIM_passphrase = '';\n\n    /**\n     * DKIM signing domain name.\n     * @example 'example.com'\n     * @var string\n     */\n    public $DKIM_domain = '';\n\n    /**\n     * DKIM private key file path.\n     * @var string\n     */\n    public $DKIM_private = '';\n\n    /**\n     * DKIM private key string.\n     * If set, takes precedence over `$DKIM_private`.\n     * @var string\n     */\n    public $DKIM_private_string = '';\n\n    /**\n     * Callback Action function name.\n     *\n     * The function that handles the result of the send email action.\n     * It is called out by send() for each email sent.\n     *\n     * Value can be any php callable: http://www.php.net/is_callable\n     *\n     * Parameters:\n     *   boolean $result        result of the send action\n     *   array   $to            email addresses of the recipients\n     *   array   $cc            cc email addresses\n     *   array   $bcc           bcc email addresses\n     *   string  $subject       the subject\n     *   string  $body          the email body\n     *   string  $from          email address of sender\n     * @var string\n     */\n    public $action_function = '';\n\n    /**\n     * What to put in the X-Mailer header.\n     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n     * @var string\n     */\n    public $XMailer = '';\n\n    /**\n     * Which validator to use by default when validating email addresses.\n     * May be a callable to inject your own validator, but there are several built-in validators.\n     * @see PHPMailer::validateAddress()\n     * @var string|callable\n     * @static\n     */\n    public static $validator = 'auto';\n\n    /**\n     * An instance of the SMTP sender class.\n     * @var SMTP\n     * @access protected\n     */\n    protected $smtp = null;\n\n    /**\n     * The array of 'to' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $to = array();\n\n    /**\n     * The array of 'cc' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $cc = array();\n\n    /**\n     * The array of 'bcc' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $bcc = array();\n\n    /**\n     * The array of reply-to names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $ReplyTo = array();\n\n    /**\n     * An array of all kinds of addresses.\n     * Includes all of $to, $cc, $bcc\n     * @var array\n     * @access protected\n     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n     */\n    protected $all_recipients = array();\n\n    /**\n     * An array of names and addresses queued for validation.\n     * In send(), valid and non duplicate entries are moved to $all_recipients\n     * and one of $to, $cc, or $bcc.\n     * This array is used only for addresses with IDN.\n     * @var array\n     * @access protected\n     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n     * @see PHPMailer::$all_recipients\n     */\n    protected $RecipientsQueue = array();\n\n    /**\n     * An array of reply-to names and addresses queued for validation.\n     * In send(), valid and non duplicate entries are moved to $ReplyTo.\n     * This array is used only for addresses with IDN.\n     * @var array\n     * @access protected\n     * @see PHPMailer::$ReplyTo\n     */\n    protected $ReplyToQueue = array();\n\n    /**\n     * The array of attachments.\n     * @var array\n     * @access protected\n     */\n    protected $attachment = array();\n\n    /**\n     * The array of custom headers.\n     * @var array\n     * @access protected\n     */\n    protected $CustomHeader = array();\n\n    /**\n     * The most recent Message-ID (including angular brackets).\n     * @var string\n     * @access protected\n     */\n    protected $lastMessageID = '';\n\n    /**\n     * The message's MIME type.\n     * @var string\n     * @access protected\n     */\n    protected $message_type = '';\n\n    /**\n     * The array of MIME boundary strings.\n     * @var array\n     * @access protected\n     */\n    protected $boundary = array();\n\n    /**\n     * The array of available languages.\n     * @var array\n     * @access protected\n     */\n    protected $language = array();\n\n    /**\n     * The number of errors encountered.\n     * @var integer\n     * @access protected\n     */\n    protected $error_count = 0;\n\n    /**\n     * The S/MIME certificate file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_cert_file = '';\n\n    /**\n     * The S/MIME key file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_key_file = '';\n\n    /**\n     * The optional S/MIME extra certificates (\"CA Chain\") file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_extracerts_file = '';\n\n    /**\n     * The S/MIME password for the key.\n     * Used only if the key is encrypted.\n     * @var string\n     * @access protected\n     */\n    protected $sign_key_pass = '';\n\n    /**\n     * Whether to throw exceptions for errors.\n     * @var boolean\n     * @access protected\n     */\n    protected $exceptions = false;\n\n    /**\n     * Unique ID used for message ID and boundaries.\n     * @var string\n     * @access protected\n     */\n    protected $uniqueid = '';\n\n    /**\n     * Error severity: message only, continue processing.\n     */\n    const STOP_MESSAGE = 0;\n\n    /**\n     * Error severity: message, likely ok to continue processing.\n     */\n    const STOP_CONTINUE = 1;\n\n    /**\n     * Error severity: message, plus full stop, critical error reached.\n     */\n    const STOP_CRITICAL = 2;\n\n    /**\n     * SMTP RFC standard line ending.\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * The maximum line length allowed by RFC 2822 section 2.1.1\n     * @var integer\n     */\n    const MAX_LINE_LENGTH = 998;\n\n    /**\n     * Constructor.\n     * @param boolean $exceptions Should we throw external exceptions?\n     */\n    public function __construct($exceptions = null)\n    {\n        if ($exceptions !== null) {\n            $this->exceptions = (boolean)$exceptions;\n        }\n    }\n\n    /**\n     * Destructor.\n     */\n    public function __destruct()\n    {\n        //Close any open SMTP connection nicely\n        $this->smtpClose();\n    }\n\n    /**\n     * Call mail() in a safe_mode-aware fashion.\n     * Also, unless sendmail_path points to sendmail (or something that\n     * claims to be sendmail), don't pass params (not a perfect fix,\n     * but it will do)\n     * @param string $to To\n     * @param string $subject Subject\n     * @param string $body Message Body\n     * @param string $header Additional Header(s)\n     * @param string $params Params\n     * @access private\n     * @return boolean\n     */\n    private function mailPassthru($to, $subject, $body, $header, $params)\n    {\n        //Check overloading of mail function to avoid double-encoding\n        if (ini_get('mbstring.func_overload') & 1) {\n            $subject = $this->secureHeader($subject);\n        } else {\n            $subject = $this->encodeHeader($this->secureHeader($subject));\n        }\n\n        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks\n        //@link http://php.net/manual/en/function.mail.php\n        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {\n            $result = @mail($to, $subject, $body, $header);\n        } else {\n            $result = @mail($to, $subject, $body, $header, $params);\n        }\n        return $result;\n    }\n    /**\n     * Output debugging info via user-defined method.\n     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n     * @see PHPMailer::$Debugoutput\n     * @see PHPMailer::$SMTPDebug\n     * @param string $str\n     */\n    protected function edebug($str)\n    {\n        if ($this->SMTPDebug <= 0) {\n            return;\n        }\n        //Avoid clash with built-in function names\n        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n            return;\n        }\n        switch ($this->Debugoutput) {\n            case 'error_log':\n                //Don't output, just log\n                error_log($str);\n                break;\n            case 'html':\n                //Cleans up output a bit for a better looking, HTML-safe output\n                echo htmlentities(\n                    preg_replace('/[\\r\\n]+/', '', $str),\n                    ENT_QUOTES,\n                    'UTF-8'\n                )\n                . \"<br>\\n\";\n                break;\n            case 'echo':\n            default:\n                //Normalize line breaks\n                $str = preg_replace('/\\r\\n?/ms', \"\\n\", $str);\n                echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n                    \"\\n\",\n                    \"\\n                   \\t                  \",\n                    trim($str)\n                ) . \"\\n\";\n        }\n    }\n\n    /**\n     * Sets message type to HTML or plain.\n     * @param boolean $isHtml True for HTML mode.\n     * @return void\n     */\n    public function isHTML($isHtml = true)\n    {\n        if ($isHtml) {\n            $this->ContentType = 'text/html';\n        } else {\n            $this->ContentType = 'text/plain';\n        }\n    }\n\n    /**\n     * Send messages using SMTP.\n     * @return void\n     */\n    public function isSMTP()\n    {\n        $this->Mailer = 'smtp';\n    }\n\n    /**\n     * Send messages using PHP's mail() function.\n     * @return void\n     */\n    public function isMail()\n    {\n        $this->Mailer = 'mail';\n    }\n\n    /**\n     * Send messages using $Sendmail.\n     * @return void\n     */\n    public function isSendmail()\n    {\n        $ini_sendmail_path = ini_get('sendmail_path');\n\n        if (!stristr($ini_sendmail_path, 'sendmail')) {\n            $this->Sendmail = '/usr/sbin/sendmail';\n        } else {\n            $this->Sendmail = $ini_sendmail_path;\n        }\n        $this->Mailer = 'sendmail';\n    }\n\n    /**\n     * Send messages using qmail.\n     * @return void\n     */\n    public function isQmail()\n    {\n        $ini_sendmail_path = ini_get('sendmail_path');\n\n        if (!stristr($ini_sendmail_path, 'qmail')) {\n            $this->Sendmail = '/var/qmail/bin/qmail-inject';\n        } else {\n            $this->Sendmail = $ini_sendmail_path;\n        }\n        $this->Mailer = 'qmail';\n    }\n\n    /**\n     * Add a \"To\" address.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addAddress($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('to', $address, $name);\n    }\n\n    /**\n     * Add a \"CC\" address.\n     * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addCC($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('cc', $address, $name);\n    }\n\n    /**\n     * Add a \"BCC\" address.\n     * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addBCC($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n    }\n\n    /**\n     * Add a \"Reply-To\" address.\n     * @param string $address The email address to reply to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addReplyTo($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n    }\n\n    /**\n     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n     * be modified after calling this function), addition of such addresses is delayed until send().\n     * Addresses that have been added already return false, but do not throw exceptions.\n     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n     * @param string $address The email address to send, resp. to reply to\n     * @param string $name\n     * @throws phpmailerException\n     * @return boolean true on success, false if address already used or invalid in some way\n     * @access protected\n     */\n    protected function addOrEnqueueAnAddress($kind, $address, $name)\n    {\n        $address = trim($address);\n        $name = trim(preg_replace('/[\\r\\n]+/', '', $name)); //Strip breaks and trim\n        if (($pos = strrpos($address, '@')) === false) {\n            // At-sign is misssing.\n            $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        $params = array($kind, $address, $name);\n        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n            if ($kind != 'Reply-To') {\n                if (!array_key_exists($address, $this->RecipientsQueue)) {\n                    $this->RecipientsQueue[$address] = $params;\n                    return true;\n                }\n            } else {\n                if (!array_key_exists($address, $this->ReplyToQueue)) {\n                    $this->ReplyToQueue[$address] = $params;\n                    return true;\n                }\n            }\n            return false;\n        }\n        // Immediately add standard addresses without IDN.\n        return call_user_func_array(array($this, 'addAnAddress'), $params);\n    }\n\n    /**\n     * Add an address to one of the recipient arrays or to the ReplyTo array.\n     * Addresses that have been added already return false, but do not throw exceptions.\n     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n     * @param string $address The email address to send, resp. to reply to\n     * @param string $name\n     * @throws phpmailerException\n     * @return boolean true on success, false if address already used or invalid in some way\n     * @access protected\n     */\n    protected function addAnAddress($kind, $address, $name = '')\n    {\n        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n            $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        if (!$this->validateAddress($address)) {\n            $error_message = $this->lang('invalid_address') . \" (addAnAddress $kind): $address\";\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        if ($kind != 'Reply-To') {\n            if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n                array_push($this->$kind, array($address, $name));\n                $this->all_recipients[strtolower($address)] = true;\n                return true;\n            }\n        } else {\n            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n                $this->ReplyTo[strtolower($address)] = array($address, $name);\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses\n     * of the form \"display name <address>\" into an array of name/address pairs.\n     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.\n     * Note that quotes in the name part are removed.\n     * @param string $addrstr The address list string\n     * @param bool $useimap Whether to use the IMAP extension to parse the list\n     * @return array\n     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation\n     */\n    public function parseAddresses($addrstr, $useimap = true)\n    {\n        $addresses = array();\n        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {\n            //Use this built-in parser if it's available\n            $list = imap_rfc822_parse_adrlist($addrstr, '');\n            foreach ($list as $address) {\n                if ($address->host != '.SYNTAX-ERROR.') {\n                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {\n                        $addresses[] = array(\n                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),\n                            'address' => $address->mailbox . '@' . $address->host\n                        );\n                    }\n                }\n            }\n        } else {\n            //Use this simpler parser\n            $list = explode(',', $addrstr);\n            foreach ($list as $address) {\n                $address = trim($address);\n                //Is there a separate name part?\n                if (strpos($address, '<') === false) {\n                    //No separate name, just use the whole thing\n                    if ($this->validateAddress($address)) {\n                        $addresses[] = array(\n                            'name' => '',\n                            'address' => $address\n                        );\n                    }\n                } else {\n                    list($name, $email) = explode('<', $address);\n                    $email = trim(str_replace('>', '', $email));\n                    if ($this->validateAddress($email)) {\n                        $addresses[] = array(\n                            'name' => trim(str_replace(array('\"', \"'\"), '', $name)),\n                            'address' => $email\n                        );\n                    }\n                }\n            }\n        }\n        return $addresses;\n    }\n\n    /**\n     * Set the From and FromName properties.\n     * @param string $address\n     * @param string $name\n     * @param boolean $auto Whether to also set the Sender address, defaults to true\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function setFrom($address, $name = '', $auto = true)\n    {\n        $address = trim($address);\n        $name = trim(preg_replace('/[\\r\\n]+/', '', $name)); //Strip breaks and trim\n        // Don't validate now addresses with IDN. Will be done in send().\n        if (($pos = strrpos($address, '@')) === false or\n            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n            !$this->validateAddress($address)) {\n            $error_message = $this->lang('invalid_address') . \" (setFrom) $address\";\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        $this->From = $address;\n        $this->FromName = $name;\n        if ($auto) {\n            if (empty($this->Sender)) {\n                $this->Sender = $address;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Return the Message-ID header of the last email.\n     * Technically this is the value from the last time the headers were created,\n     * but it's also the message ID of the last sent message except in\n     * pathological cases.\n     * @return string\n     */\n    public function getLastMessageID()\n    {\n        return $this->lastMessageID;\n    }\n\n    /**\n     * Check that a string looks like an email address.\n     * @param string $address The email address to check\n     * @param string|callable $patternselect A selector for the validation pattern to use :\n     * * `auto` Pick best pattern automatically;\n     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n     * * `pcre` Use old PCRE implementation;\n     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n     * * `noregex` Don't use a regex: super fast, really dumb.\n     * Alternatively you may pass in a callable to inject your own validator, for example:\n     * PHPMailer::validateAddress('user@example.com', function($address) {\n     *     return (strpos($address, '@') !== false);\n     * });\n     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.\n     * @return boolean\n     * @static\n     * @access public\n     */\n    public static function validateAddress($address, $patternselect = null)\n    {\n        if (is_null($patternselect)) {\n            $patternselect = self::$validator;\n        }\n        if (is_callable($patternselect)) {\n            return call_user_func($patternselect, $address);\n        }\n        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n        if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n            return false;\n        }\n        if (!$patternselect or $patternselect == 'auto') {\n            //Check this constant first so it works when extension_loaded() is disabled by safe mode\n            //Constant was added in PHP 5.2.4\n            if (defined('PCRE_VERSION')) {\n                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n                    $patternselect = 'pcre8';\n                } else {\n                    $patternselect = 'pcre';\n                }\n            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n                //Fall back to older PCRE\n                $patternselect = 'pcre';\n            } else {\n                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n                    $patternselect = 'php';\n                } else {\n                    $patternselect = 'noregex';\n                }\n            }\n        }\n        switch ($patternselect) {\n            case 'pcre8':\n                /**\n                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n                 * @link http://squiloople.com/2009/12/20/email-address-validation/\n                 * @copyright 2009-2010 Michael Rushton\n                 * Feel free to use and redistribute this code. But please keep this copyright notice.\n                 */\n                return (boolean)preg_match(\n                    '/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n                    '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n                    '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n                    '([!#-\\'*+\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n                    '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n                    '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n                    '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n                    '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$/isD',\n                    $address\n                );\n            case 'pcre':\n                //An older regex that doesn't need a recent PCRE\n                return (boolean)preg_match(\n                    '/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n                    '[!#-\\'*+\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n                    '(?>\\.(?>[!#-\\'*+\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n                    '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$/isD',\n                    $address\n                );\n            case 'html5':\n                /**\n                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)\n                 */\n                return (boolean)preg_match(\n                    '/^[a-zA-Z0-9.!#$%&\\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n                    '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',\n                    $address\n                );\n            case 'noregex':\n                //No PCRE! Do something _very_ approximate!\n                //Check the address is 3 chars or longer and contains an @ that's not the first or last char\n                return (strlen($address) >= 3\n                    and strpos($address, '@') >= 1\n                    and strpos($address, '@') != strlen($address) - 1);\n            case 'php':\n            default:\n                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n        }\n    }\n\n    /**\n     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n     * \"intl\" and \"mbstring\" PHP extensions.\n     * @return bool \"true\" if required functions for IDN support are present\n     */\n    public function idnSupported()\n    {\n        // @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n    }\n\n    /**\n     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n     * This function silently returns unmodified address if:\n     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)\n     * @see PHPMailer::$CharSet\n     * @param string $address The email address to convert\n     * @return string The encoded address in ASCII form\n     */\n    public function punyencodeAddress($address)\n    {\n        // Verify we have required functions, CharSet, and at-sign.\n        if ($this->idnSupported() and\n            !empty($this->CharSet) and\n            ($pos = strrpos($address, '@')) !== false) {\n            $domain = substr($address, ++$pos);\n            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n                    idn_to_ascii($domain)) !== false) {\n                    return substr($address, 0, $pos) . $punycode;\n                }\n            }\n        }\n        return $address;\n    }\n\n    /**\n     * Create a message and send it.\n     * Uses the sending method specified by $Mailer.\n     * @throws phpmailerException\n     * @return boolean false on error - See the ErrorInfo property for details of the error.\n     */\n    public function send()\n    {\n        try {\n            if (!$this->preSend()) {\n                return false;\n            }\n            return $this->postSend();\n        } catch (phpmailerException $exc) {\n            $this->mailHeader = '';\n            $this->setError($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n    }\n\n    /**\n     * Prepare a message for sending.\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function preSend()\n    {\n        try {\n            $this->error_count = 0; // Reset errors\n            $this->mailHeader = '';\n\n            // Dequeue recipient and Reply-To addresses with IDN\n            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n                $params[1] = $this->punyencodeAddress($params[1]);\n                call_user_func_array(array($this, 'addAnAddress'), $params);\n            }\n            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n            }\n\n            // Validate From, Sender, and ConfirmReadingTo addresses\n            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n                $this->$address_kind = trim($this->$address_kind);\n                if (empty($this->$address_kind)) {\n                    continue;\n                }\n                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n                if (!$this->validateAddress($this->$address_kind)) {\n                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;\n                    $this->setError($error_message);\n                    $this->edebug($error_message);\n                    if ($this->exceptions) {\n                        throw new phpmailerException($error_message);\n                    }\n                    return false;\n                }\n            }\n\n            // Set whether the message is multipart/alternative\n            if ($this->alternativeExists()) {\n                $this->ContentType = 'multipart/alternative';\n            }\n\n            $this->setMessageType();\n            // Refuse to send an empty message unless we are specifically allowing it\n            if (!$this->AllowEmpty and empty($this->Body)) {\n                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n            }\n\n            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n            $this->MIMEHeader = '';\n            $this->MIMEBody = $this->createBody();\n            // createBody may have added some headers, so retain them\n            $tempheaders = $this->MIMEHeader;\n            $this->MIMEHeader = $this->createHeader();\n            $this->MIMEHeader .= $tempheaders;\n\n            // To capture the complete message when using mail(), create\n            // an extra header list which createHeader() doesn't fold in\n            if ($this->Mailer == 'mail') {\n                if (count($this->to) > 0) {\n                    $this->mailHeader .= $this->addrAppend('To', $this->to);\n                } else {\n                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n                }\n                $this->mailHeader .= $this->headerLine(\n                    'Subject',\n                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n                );\n            }\n\n            // Sign with DKIM if enabled\n            if (!empty($this->DKIM_domain)\n                && !empty($this->DKIM_selector)\n                && (!empty($this->DKIM_private_string)\n                   || (!empty($this->DKIM_private) && file_exists($this->DKIM_private))\n                )\n            ) {\n                $header_dkim = $this->DKIM_Add(\n                    $this->MIMEHeader . $this->mailHeader,\n                    $this->encodeHeader($this->secureHeader($this->Subject)),\n                    $this->MIMEBody\n                );\n                $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n                    str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n            }\n            return true;\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n    }\n\n    /**\n     * Actually send a message.\n     * Send the email via the selected mechanism\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function postSend()\n    {\n        try {\n            // Choose the mailer and send through it\n            switch ($this->Mailer) {\n                case 'sendmail':\n                case 'qmail':\n                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n                case 'smtp':\n                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n                case 'mail':\n                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n                default:\n                    $sendMethod = $this->Mailer.'Send';\n                    if (method_exists($this, $sendMethod)) {\n                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n                    }\n\n                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n            }\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Send mail using the $Sendmail program.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @see PHPMailer::$Sendmail\n     * @throws phpmailerException\n     * @access protected\n     * @return boolean\n     */\n    protected function sendmailSend($header, $body)\n    {\n        // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n        if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {\n            if ($this->Mailer == 'qmail') {\n                $sendmailFmt = '%s -f%s';\n            } else {\n                $sendmailFmt = '%s -oi -f%s -t';\n            }\n        } else {\n            if ($this->Mailer == 'qmail') {\n                $sendmailFmt = '%s';\n            } else {\n                $sendmailFmt = '%s -oi -t';\n            }\n        }\n\n        // TODO: If possible, this should be changed to escapeshellarg.  Needs thorough testing.\n        $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender);\n\n        if ($this->SingleTo) {\n            foreach ($this->SingleToArray as $toAddr) {\n                if (!@$mail = popen($sendmail, 'w')) {\n                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n                }\n                fputs($mail, 'To: ' . $toAddr . \"\\n\");\n                fputs($mail, $header);\n                fputs($mail, $body);\n                $result = pclose($mail);\n                $this->doCallback(\n                    ($result == 0),\n                    array($toAddr),\n                    $this->cc,\n                    $this->bcc,\n                    $this->Subject,\n                    $body,\n                    $this->From\n                );\n                if ($result != 0) {\n                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n                }\n            }\n        } else {\n            if (!@$mail = popen($sendmail, 'w')) {\n                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n            }\n            fputs($mail, $header);\n            fputs($mail, $body);\n            $result = pclose($mail);\n            $this->doCallback(\n                ($result == 0),\n                $this->to,\n                $this->cc,\n                $this->bcc,\n                $this->Subject,\n                $body,\n                $this->From\n            );\n            if ($result != 0) {\n                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters.\n     *\n     * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows.\n     * @param string $string The string to be validated\n     * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report\n     * @access protected\n     * @return boolean\n     */\n    protected static function isShellSafe($string)\n    {\n        // Future-proof\n        if (escapeshellcmd($string) !== $string\n            or !in_array(escapeshellarg($string), array(\"'$string'\", \"\\\"$string\\\"\"))\n        ) {\n            return false;\n        }\n\n        $length = strlen($string);\n\n        for ($i = 0; $i < $length; $i++) {\n            $c = $string[$i];\n\n            // All other characters have a special meaning in at least one common shell, including = and +.\n            // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here.\n            // Note that this does permit non-Latin alphanumeric characters based on the current locale.\n            if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Send mail using the PHP mail() function.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @link http://www.php.net/manual/en/book.mail.php\n     * @throws phpmailerException\n     * @access protected\n     * @return boolean\n     */\n    protected function mailSend($header, $body)\n    {\n        $toArr = array();\n        foreach ($this->to as $toaddr) {\n            $toArr[] = $this->addrFormat($toaddr);\n        }\n        $to = implode(', ', $toArr);\n\n        $params = null;\n        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver\n        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n            // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.\n            if (self::isShellSafe($this->Sender)) {\n                $params = sprintf('-f%s', $this->Sender);\n            }\n        }\n        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {\n            $old_from = ini_get('sendmail_from');\n            ini_set('sendmail_from', $this->Sender);\n        }\n        $result = false;\n        if ($this->SingleTo and count($toArr) > 1) {\n            foreach ($toArr as $toAddr) {\n                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n            }\n        } else {\n            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n        }\n        if (isset($old_from)) {\n            ini_set('sendmail_from', $old_from);\n        }\n        if (!$result) {\n            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n        }\n        return true;\n    }\n\n    /**\n     * Get an instance to use for SMTP operations.\n     * Override this function to load your own SMTP implementation\n     * @return SMTP\n     */\n    public function getSMTPInstance()\n    {\n        if (!is_object($this->smtp)) {\n            $this->smtp = new SMTP;\n        }\n        return $this->smtp;\n    }\n\n    /**\n     * Send mail via SMTP.\n     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n     * Uses the PHPMailerSMTP class by default.\n     * @see PHPMailer::getSMTPInstance() to use a different class.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @throws phpmailerException\n     * @uses SMTP\n     * @access protected\n     * @return boolean\n     */\n    protected function smtpSend($header, $body)\n    {\n        $bad_rcpt = array();\n        if (!$this->smtpConnect($this->SMTPOptions)) {\n            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n        }\n        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {\n            $smtp_from = $this->Sender;\n        } else {\n            $smtp_from = $this->From;\n        }\n        if (!$this->smtp->mail($smtp_from)) {\n            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n        }\n\n        // Attempt to send to all recipients\n        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n            foreach ($togroup as $to) {\n                if (!$this->smtp->recipient($to[0])) {\n                    $error = $this->smtp->getError();\n                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n                    $isSent = false;\n                } else {\n                    $isSent = true;\n                }\n                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n            }\n        }\n\n        // Only send the DATA command if we have viable recipients\n        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n        }\n        if ($this->SMTPKeepAlive) {\n            $this->smtp->reset();\n        } else {\n            $this->smtp->quit();\n            $this->smtp->close();\n        }\n        //Create error message for any bad addresses\n        if (count($bad_rcpt) > 0) {\n            $errstr = '';\n            foreach ($bad_rcpt as $bad) {\n                $errstr .= $bad['to'] . ': ' . $bad['error'];\n            }\n            throw new phpmailerException(\n                $this->lang('recipients_failed') . $errstr,\n                self::STOP_CONTINUE\n            );\n        }\n        return true;\n    }\n\n    /**\n     * Initiate a connection to an SMTP server.\n     * Returns false if the operation failed.\n     * @param array $options An array of options compatible with stream_context_create()\n     * @uses SMTP\n     * @access public\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function smtpConnect($options = null)\n    {\n        if (is_null($this->smtp)) {\n            $this->smtp = $this->getSMTPInstance();\n        }\n\n        //If no options are provided, use whatever is set in the instance\n        if (is_null($options)) {\n            $options = $this->SMTPOptions;\n        }\n\n        // Already connected?\n        if ($this->smtp->connected()) {\n            return true;\n        }\n\n        $this->smtp->setTimeout($this->Timeout);\n        $this->smtp->setDebugLevel($this->SMTPDebug);\n        $this->smtp->setDebugOutput($this->Debugoutput);\n        $this->smtp->setVerp($this->do_verp);\n        $hosts = explode(';', $this->Host);\n        $lastexception = null;\n\n        foreach ($hosts as $hostentry) {\n            $hostinfo = array();\n            if (!preg_match(\n                '/^((ssl|tls):\\/\\/)*([a-zA-Z0-9\\.-]*|\\[[a-fA-F0-9:]+\\]):?([0-9]*)$/',\n                trim($hostentry),\n                $hostinfo\n            )) {\n                // Not a valid host entry\n                $this->edebug('Ignoring invalid host: ' . $hostentry);\n                continue;\n            }\n            // $hostinfo[2]: optional ssl or tls prefix\n            // $hostinfo[3]: the hostname\n            // $hostinfo[4]: optional port number\n            // The host string prefix can temporarily override the current setting for SMTPSecure\n            // If it's not specified, the default value is used\n            $prefix = '';\n            $secure = $this->SMTPSecure;\n            $tls = ($this->SMTPSecure == 'tls');\n            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n                $prefix = 'ssl://';\n                $tls = false; // Can't have SSL and TLS at the same time\n                $secure = 'ssl';\n            } elseif ($hostinfo[2] == 'tls') {\n                $tls = true;\n                // tls doesn't use a prefix\n                $secure = 'tls';\n            }\n            //Do we need the OpenSSL extension?\n            $sslext = defined('OPENSSL_ALGO_SHA1');\n            if ('tls' === $secure or 'ssl' === $secure) {\n                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n                if (!$sslext) {\n                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n                }\n            }\n            $host = $hostinfo[3];\n            $port = $this->Port;\n            $tport = (integer)$hostinfo[4];\n            if ($tport > 0 and $tport < 65536) {\n                $port = $tport;\n            }\n            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n                try {\n                    if ($this->Helo) {\n                        $hello = $this->Helo;\n                    } else {\n                        $hello = $this->serverHostname();\n                    }\n                    $this->smtp->hello($hello);\n                    //Automatically enable TLS encryption if:\n                    // * it's not disabled\n                    // * we have openssl extension\n                    // * we are not already using SSL\n                    // * the server offers STARTTLS\n                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n                        $tls = true;\n                    }\n                    if ($tls) {\n                        if (!$this->smtp->startTLS()) {\n                            throw new phpmailerException($this->lang('connect_host'));\n                        }\n                        // We must resend EHLO after TLS negotiation\n                        $this->smtp->hello($hello);\n                    }\n                    if ($this->SMTPAuth) {\n                        if (!$this->smtp->authenticate(\n                            $this->Username,\n                            $this->Password,\n                            $this->AuthType,\n                            $this->Realm,\n                            $this->Workstation\n                        )\n                        ) {\n                            throw new phpmailerException($this->lang('authenticate'));\n                        }\n                    }\n                    return true;\n                } catch (phpmailerException $exc) {\n                    $lastexception = $exc;\n                    $this->edebug($exc->getMessage());\n                    // We must have connected, but then failed TLS or Auth, so close connection nicely\n                    $this->smtp->quit();\n                }\n            }\n        }\n        // If we get here, all connection attempts have failed, so close connection hard\n        $this->smtp->close();\n        // As we've caught all exceptions, just report whatever the last one was\n        if ($this->exceptions and !is_null($lastexception)) {\n            throw $lastexception;\n        }\n        return false;\n    }\n\n    /**\n     * Close the active SMTP session if one exists.\n     * @return void\n     */\n    public function smtpClose()\n    {\n        if (is_a($this->smtp, 'SMTP')) {\n            if ($this->smtp->connected()) {\n                $this->smtp->quit();\n                $this->smtp->close();\n            }\n        }\n    }\n\n    /**\n     * Set the language for error messages.\n     * Returns false if it cannot load the language file.\n     * The default language is English.\n     * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n     * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n     * @return boolean\n     * @access public\n     */\n    public function setLanguage($langcode = 'en', $lang_path = '')\n    {\n        // Backwards compatibility for renamed language codes\n        $renamed_langcodes = array(\n            'br' => 'pt_br',\n            'cz' => 'cs',\n            'dk' => 'da',\n            'no' => 'nb',\n            'se' => 'sv',\n            'sr' => 'rs'\n        );\n\n        if (isset($renamed_langcodes[$langcode])) {\n            $langcode = $renamed_langcodes[$langcode];\n        }\n\n        // Define full set of translatable strings in English\n        $PHPMAILER_LANG = array(\n            'authenticate' => 'SMTP Error: Could not authenticate.',\n            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n            'data_not_accepted' => 'SMTP Error: data not accepted.',\n            'empty_message' => 'Message body empty',\n            'encoding' => 'Unknown encoding: ',\n            'execute' => 'Could not execute: ',\n            'file_access' => 'Could not access file: ',\n            'file_open' => 'File Error: Could not open file: ',\n            'from_failed' => 'The following From address failed: ',\n            'instantiate' => 'Could not instantiate mail function.',\n            'invalid_address' => 'Invalid address: ',\n            'mailer_not_supported' => ' mailer is not supported.',\n            'provide_address' => 'You must provide at least one recipient email address.',\n            'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n            'signing' => 'Signing Error: ',\n            'smtp_connect_failed' => 'SMTP connect() failed.',\n            'smtp_error' => 'SMTP server error: ',\n            'variable_set' => 'Cannot set or reset variable: ',\n            'extension_missing' => 'Extension missing: '\n        );\n        if (empty($lang_path)) {\n            // Calculate an absolute path so it can work if CWD is not here\n            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n        }\n        //Validate $langcode\n        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {\n            $langcode = 'en';\n        }\n        $foundlang = true;\n        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n        // There is no English translation file\n        if ($langcode != 'en') {\n            // Make sure language file path is readable\n            if (!is_readable($lang_file)) {\n                $foundlang = false;\n            } else {\n                // Overwrite language-specific strings.\n                // This way we'll never have missing translation keys.\n                $foundlang = include $lang_file;\n            }\n        }\n        $this->language = $PHPMAILER_LANG;\n        return (boolean)$foundlang; // Returns false if language not found\n    }\n\n    /**\n     * Get the array of strings for the current language.\n     * @return array\n     */\n    public function getTranslations()\n    {\n        return $this->language;\n    }\n\n    /**\n     * Create recipient headers.\n     * @access public\n     * @param string $type\n     * @param array $addr An array of recipient,\n     * where each recipient is a 2-element indexed array with element 0 containing an address\n     * and element 1 containing a name, like:\n     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n     * @return string\n     */\n    public function addrAppend($type, $addr)\n    {\n        $addresses = array();\n        foreach ($addr as $address) {\n            $addresses[] = $this->addrFormat($address);\n        }\n        return $type . ': ' . implode(', ', $addresses) . $this->LE;\n    }\n\n    /**\n     * Format an address for use in a message header.\n     * @access public\n     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n     *      like array('joe@example.com', 'Joe User')\n     * @return string\n     */\n    public function addrFormat($addr)\n    {\n        if (empty($addr[1])) { // No name provided\n            return $this->secureHeader($addr[0]);\n        } else {\n            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n                $addr[0]\n            ) . '>';\n        }\n    }\n\n    /**\n     * Word-wrap message.\n     * For use with mailers that do not automatically perform wrapping\n     * and for quoted-printable encoded messages.\n     * Original written by philippe.\n     * @param string $message The message to wrap\n     * @param integer $length The line length to wrap to\n     * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n     * @access public\n     * @return string\n     */\n    public function wrapText($message, $length, $qp_mode = false)\n    {\n        if ($qp_mode) {\n            $soft_break = sprintf(' =%s', $this->LE);\n        } else {\n            $soft_break = $this->LE;\n        }\n        // If utf-8 encoding is used, we will need to make sure we don't\n        // split multibyte characters when we wrap\n        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n        $lelen = strlen($this->LE);\n        $crlflen = strlen(self::CRLF);\n\n        $message = $this->fixEOL($message);\n        //Remove a trailing line break\n        if (substr($message, -$lelen) == $this->LE) {\n            $message = substr($message, 0, -$lelen);\n        }\n\n        //Split message into lines\n        $lines = explode($this->LE, $message);\n        //Message will be rebuilt in here\n        $message = '';\n        foreach ($lines as $line) {\n            $words = explode(' ', $line);\n            $buf = '';\n            $firstword = true;\n            foreach ($words as $word) {\n                if ($qp_mode and (strlen($word) > $length)) {\n                    $space_left = $length - strlen($buf) - $crlflen;\n                    if (!$firstword) {\n                        if ($space_left > 20) {\n                            $len = $space_left;\n                            if ($is_utf8) {\n                                $len = $this->utf8CharBoundary($word, $len);\n                            } elseif (substr($word, $len - 1, 1) == '=') {\n                                $len--;\n                            } elseif (substr($word, $len - 2, 1) == '=') {\n                                $len -= 2;\n                            }\n                            $part = substr($word, 0, $len);\n                            $word = substr($word, $len);\n                            $buf .= ' ' . $part;\n                            $message .= $buf . sprintf('=%s', self::CRLF);\n                        } else {\n                            $message .= $buf . $soft_break;\n                        }\n                        $buf = '';\n                    }\n                    while (strlen($word) > 0) {\n                        if ($length <= 0) {\n                            break;\n                        }\n                        $len = $length;\n                        if ($is_utf8) {\n                            $len = $this->utf8CharBoundary($word, $len);\n                        } elseif (substr($word, $len - 1, 1) == '=') {\n                            $len--;\n                        } elseif (substr($word, $len - 2, 1) == '=') {\n                            $len -= 2;\n                        }\n                        $part = substr($word, 0, $len);\n                        $word = substr($word, $len);\n\n                        if (strlen($word) > 0) {\n                            $message .= $part . sprintf('=%s', self::CRLF);\n                        } else {\n                            $buf = $part;\n                        }\n                    }\n                } else {\n                    $buf_o = $buf;\n                    if (!$firstword) {\n                        $buf .= ' ';\n                    }\n                    $buf .= $word;\n\n                    if (strlen($buf) > $length and $buf_o != '') {\n                        $message .= $buf_o . $soft_break;\n                        $buf = $word;\n                    }\n                }\n                $firstword = false;\n            }\n            $message .= $buf . self::CRLF;\n        }\n\n        return $message;\n    }\n\n    /**\n     * Find the last character boundary prior to $maxLength in a utf-8\n     * quoted-printable encoded string.\n     * Original written by Colin Brown.\n     * @access public\n     * @param string $encodedText utf-8 QP text\n     * @param integer $maxLength Find the last character boundary prior to this length\n     * @return integer\n     */\n    public function utf8CharBoundary($encodedText, $maxLength)\n    {\n        $foundSplitPos = false;\n        $lookBack = 3;\n        while (!$foundSplitPos) {\n            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n            $encodedCharPos = strpos($lastChunk, '=');\n            if (false !== $encodedCharPos) {\n                // Found start of encoded character byte within $lookBack block.\n                // Check the encoded byte value (the 2 chars after the '=')\n                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n                $dec = hexdec($hex);\n                if ($dec < 128) {\n                    // Single byte character.\n                    // If the encoded char was found at pos 0, it will fit\n                    // otherwise reduce maxLength to start of the encoded char\n                    if ($encodedCharPos > 0) {\n                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n                    }\n                    $foundSplitPos = true;\n                } elseif ($dec >= 192) {\n                    // First byte of a multi byte character\n                    // Reduce maxLength to split at start of character\n                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n                    $foundSplitPos = true;\n                } elseif ($dec < 192) {\n                    // Middle byte of a multi byte character, look further back\n                    $lookBack += 3;\n                }\n            } else {\n                // No encoded character found\n                $foundSplitPos = true;\n            }\n        }\n        return $maxLength;\n    }\n\n    /**\n     * Apply word wrapping to the message body.\n     * Wraps the message body to the number of chars set in the WordWrap property.\n     * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n     * This is called automatically by createBody(), so you don't need to call it yourself.\n     * @access public\n     * @return void\n     */\n    public function setWordWrap()\n    {\n        if ($this->WordWrap < 1) {\n            return;\n        }\n\n        switch ($this->message_type) {\n            case 'alt':\n            case 'alt_inline':\n            case 'alt_attach':\n            case 'alt_inline_attach':\n                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n                break;\n            default:\n                $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n                break;\n        }\n    }\n\n    /**\n     * Assemble message headers.\n     * @access public\n     * @return string The assembled headers\n     */\n    public function createHeader()\n    {\n        $result = '';\n\n        $result .= $this->headerLine('Date', $this->MessageDate == '' ? self::rfcDate() : $this->MessageDate);\n\n        // To be created automatically by mail()\n        if ($this->SingleTo) {\n            if ($this->Mailer != 'mail') {\n                foreach ($this->to as $toaddr) {\n                    $this->SingleToArray[] = $this->addrFormat($toaddr);\n                }\n            }\n        } else {\n            if (count($this->to) > 0) {\n                if ($this->Mailer != 'mail') {\n                    $result .= $this->addrAppend('To', $this->to);\n                }\n            } elseif (count($this->cc) == 0) {\n                $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n            }\n        }\n\n        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n        // sendmail and mail() extract Cc from the header before sending\n        if (count($this->cc) > 0) {\n            $result .= $this->addrAppend('Cc', $this->cc);\n        }\n\n        // sendmail and mail() extract Bcc from the header before sending\n        if ((\n                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n            )\n            and count($this->bcc) > 0\n        ) {\n            $result .= $this->addrAppend('Bcc', $this->bcc);\n        }\n\n        if (count($this->ReplyTo) > 0) {\n            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n        }\n\n        // mail() sets the subject itself\n        if ($this->Mailer != 'mail') {\n            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n        }\n\n        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4\n        // https://tools.ietf.org/html/rfc5322#section-3.6.4\n        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {\n            $this->lastMessageID = $this->MessageID;\n        } else {\n            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n        }\n        $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n        if (!is_null($this->Priority)) {\n            $result .= $this->headerLine('X-Priority', $this->Priority);\n        }\n        if ($this->XMailer == '') {\n            $result .= $this->headerLine(\n                'X-Mailer',\n                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'\n            );\n        } else {\n            $myXmailer = trim($this->XMailer);\n            if ($myXmailer) {\n                $result .= $this->headerLine('X-Mailer', $myXmailer);\n            }\n        }\n\n        if ($this->ConfirmReadingTo != '') {\n            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n        }\n\n        // Add custom headers\n        foreach ($this->CustomHeader as $header) {\n            $result .= $this->headerLine(\n                trim($header[0]),\n                $this->encodeHeader(trim($header[1]))\n            );\n        }\n        if (!$this->sign_key_file) {\n            $result .= $this->headerLine('MIME-Version', '1.0');\n            $result .= $this->getMailMIME();\n        }\n\n        return $result;\n    }\n\n    /**\n     * Get the message MIME type headers.\n     * @access public\n     * @return string\n     */\n    public function getMailMIME()\n    {\n        $result = '';\n        $ismultipart = true;\n        switch ($this->message_type) {\n            case 'inline':\n                $result .= $this->headerLine('Content-Type', 'multipart/related;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            case 'attach':\n            case 'inline_attach':\n            case 'alt_attach':\n            case 'alt_inline_attach':\n                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            case 'alt':\n            case 'alt_inline':\n                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            default:\n                // Catches case 'plain': and case '':\n                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n                $ismultipart = false;\n                break;\n        }\n        // RFC1341 part 5 says 7bit is assumed if not specified\n        if ($this->Encoding != '7bit') {\n            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n            if ($ismultipart) {\n                if ($this->Encoding == '8bit') {\n                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n                }\n                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n            } else {\n                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n            }\n        }\n\n        if ($this->Mailer != 'mail') {\n            $result .= $this->LE;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Returns the whole MIME message.\n     * Includes complete headers and body.\n     * Only valid post preSend().\n     * @see PHPMailer::preSend()\n     * @access public\n     * @return string\n     */\n    public function getSentMIMEMessage()\n    {\n        return rtrim($this->MIMEHeader . $this->mailHeader, \"\\n\\r\") . self::CRLF . self::CRLF . $this->MIMEBody;\n    }\n\n    /**\n     * Create unique ID\n     * @return string\n     */\n    protected function generateId() {\n        return md5(uniqid(time()));\n    }\n\n    /**\n     * Assemble the message body.\n     * Returns an empty string on failure.\n     * @access public\n     * @throws phpmailerException\n     * @return string The assembled message body\n     */\n    public function createBody()\n    {\n        $body = '';\n        //Create unique IDs and preset boundaries\n        $this->uniqueid = $this->generateId();\n        $this->boundary[1] = 'b1_' . $this->uniqueid;\n        $this->boundary[2] = 'b2_' . $this->uniqueid;\n        $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n        if ($this->sign_key_file) {\n            $body .= $this->getMailMIME() . $this->LE;\n        }\n\n        $this->setWordWrap();\n\n        $bodyEncoding = $this->Encoding;\n        $bodyCharSet = $this->CharSet;\n        //Can we do a 7-bit downgrade?\n        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n            $bodyEncoding = '7bit';\n            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n            $bodyCharSet = 'us-ascii';\n        }\n        //If lines are too long, and we're not already using an encoding that will shorten them,\n        //change to quoted-printable transfer encoding for the body part only\n        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {\n            $bodyEncoding = 'quoted-printable';\n        }\n\n        $altBodyEncoding = $this->Encoding;\n        $altBodyCharSet = $this->CharSet;\n        //Can we do a 7-bit downgrade?\n        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n            $altBodyEncoding = '7bit';\n            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit\n            $altBodyCharSet = 'us-ascii';\n        }\n        //If lines are too long, and we're not already using an encoding that will shorten them,\n        //change to quoted-printable transfer encoding for the alt body part only\n        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {\n            $altBodyEncoding = 'quoted-printable';\n        }\n        //Use this as a preamble in all multipart message types\n        $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n        switch ($this->message_type) {\n            case 'inline':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[1]);\n                break;\n            case 'attach':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'inline_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'alt':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                if (!empty($this->Ical)) {\n                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');\n                    $body .= $this->encodeString($this->Ical, $this->Encoding);\n                    $body .= $this->LE . $this->LE;\n                }\n                $body .= $this->endBoundary($this->boundary[1]);\n                break;\n            case 'alt_inline':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->endBoundary($this->boundary[1]);\n                break;\n            case 'alt_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->endBoundary($this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'alt_inline_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->textLine('--' . $this->boundary[2]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[3]);\n                $body .= $this->LE;\n                $body .= $this->endBoundary($this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            default:\n                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types\n                //Reset the `Encoding` property in case we changed it for line length reasons\n                $this->Encoding = $bodyEncoding;\n                $body .= $this->encodeString($this->Body, $this->Encoding);\n                break;\n        }\n\n        if ($this->isError()) {\n            $body = '';\n        } elseif ($this->sign_key_file) {\n            try {\n                if (!defined('PKCS7_TEXT')) {\n                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n                }\n                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1\n                $file = tempnam(sys_get_temp_dir(), 'mail');\n                if (false === file_put_contents($file, $body)) {\n                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n                }\n                $signed = tempnam(sys_get_temp_dir(), 'signed');\n                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197\n                if (empty($this->sign_extracerts_file)) {\n                    $sign = @openssl_pkcs7_sign(\n                        $file,\n                        $signed,\n                        'file://' . realpath($this->sign_cert_file),\n                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),\n                        null\n                    );\n                } else {\n                    $sign = @openssl_pkcs7_sign(\n                        $file,\n                        $signed,\n                        'file://' . realpath($this->sign_cert_file),\n                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),\n                        null,\n                        PKCS7_DETACHED,\n                        $this->sign_extracerts_file\n                    );\n                }\n                if ($sign) {\n                    @unlink($file);\n                    $body = file_get_contents($signed);\n                    @unlink($signed);\n                    //The message returned by openssl contains both headers and body, so need to split them up\n                    $parts = explode(\"\\n\\n\", $body, 2);\n                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n                    $body = $parts[1];\n                } else {\n                    @unlink($file);\n                    @unlink($signed);\n                    throw new phpmailerException($this->lang('signing') . openssl_error_string());\n                }\n            } catch (phpmailerException $exc) {\n                $body = '';\n                if ($this->exceptions) {\n                    throw $exc;\n                }\n            }\n        }\n        return $body;\n    }\n\n    /**\n     * Return the start of a message boundary.\n     * @access protected\n     * @param string $boundary\n     * @param string $charSet\n     * @param string $contentType\n     * @param string $encoding\n     * @return string\n     */\n    protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n    {\n        $result = '';\n        if ($charSet == '') {\n            $charSet = $this->CharSet;\n        }\n        if ($contentType == '') {\n            $contentType = $this->ContentType;\n        }\n        if ($encoding == '') {\n            $encoding = $this->Encoding;\n        }\n        $result .= $this->textLine('--' . $boundary);\n        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n        $result .= $this->LE;\n        // RFC1341 part 5 says 7bit is assumed if not specified\n        if ($encoding != '7bit') {\n            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n        }\n        $result .= $this->LE;\n\n        return $result;\n    }\n\n    /**\n     * Return the end of a message boundary.\n     * @access protected\n     * @param string $boundary\n     * @return string\n     */\n    protected function endBoundary($boundary)\n    {\n        return $this->LE . '--' . $boundary . '--' . $this->LE;\n    }\n\n    /**\n     * Set the message type.\n     * PHPMailer only supports some preset message types, not arbitrary MIME structures.\n     * @access protected\n     * @return void\n     */\n    protected function setMessageType()\n    {\n        $type = array();\n        if ($this->alternativeExists()) {\n            $type[] = 'alt';\n        }\n        if ($this->inlineImageExists()) {\n            $type[] = 'inline';\n        }\n        if ($this->attachmentExists()) {\n            $type[] = 'attach';\n        }\n        $this->message_type = implode('_', $type);\n        if ($this->message_type == '') {\n            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text\n            $this->message_type = 'plain';\n        }\n    }\n\n    /**\n     * Format a header line.\n     * @access public\n     * @param string $name\n     * @param string $value\n     * @return string\n     */\n    public function headerLine($name, $value)\n    {\n        return $name . ': ' . $value . $this->LE;\n    }\n\n    /**\n     * Return a formatted mail line.\n     * @access public\n     * @param string $value\n     * @return string\n     */\n    public function textLine($value)\n    {\n        return $value . $this->LE;\n    }\n\n    /**\n     * Add an attachment from a path on the filesystem.\n     * Never use a user-supplied path to a file!\n     * Returns false if the file could not be found or read.\n     * @param string $path Path to the attachment.\n     * @param string $name Overrides the attachment name.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File extension (MIME) type.\n     * @param string $disposition Disposition to use\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n    {\n        try {\n            if (!@is_file($path)) {\n                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n            }\n\n            // If a MIME type is not specified, try to work it out from the file name\n            if ($type == '') {\n                $type = self::filenameToType($path);\n            }\n\n            $filename = basename($path);\n            if ($name == '') {\n                $name = $filename;\n            }\n\n            $this->attachment[] = array(\n                0 => $path,\n                1 => $filename,\n                2 => $name,\n                3 => $encoding,\n                4 => $type,\n                5 => false, // isStringAttachment\n                6 => $disposition,\n                7 => 0\n            );\n\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Return the array of attachments.\n     * @return array\n     */\n    public function getAttachments()\n    {\n        return $this->attachment;\n    }\n\n    /**\n     * Attach all file, string, and binary attachments to the message.\n     * Returns an empty string on failure.\n     * @access protected\n     * @param string $disposition_type\n     * @param string $boundary\n     * @return string\n     */\n    protected function attachAll($disposition_type, $boundary)\n    {\n        // Return text of body\n        $mime = array();\n        $cidUniq = array();\n        $incl = array();\n\n        // Add all attachments\n        foreach ($this->attachment as $attachment) {\n            // Check if it is a valid disposition_filter\n            if ($attachment[6] == $disposition_type) {\n                // Check for string attachment\n                $string = '';\n                $path = '';\n                $bString = $attachment[5];\n                if ($bString) {\n                    $string = $attachment[0];\n                } else {\n                    $path = $attachment[0];\n                }\n\n                $inclhash = md5(serialize($attachment));\n                if (in_array($inclhash, $incl)) {\n                    continue;\n                }\n                $incl[] = $inclhash;\n                $name = $attachment[2];\n                $encoding = $attachment[3];\n                $type = $attachment[4];\n                $disposition = $attachment[6];\n                $cid = $attachment[7];\n                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n                    continue;\n                }\n                $cidUniq[$cid] = true;\n\n                $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n                //Only include a filename property if we have one\n                if (!empty($name)) {\n                    $mime[] = sprintf(\n                        'Content-Type: %s; name=\"%s\"%s',\n                        $type,\n                        $this->encodeHeader($this->secureHeader($name)),\n                        $this->LE\n                    );\n                } else {\n                    $mime[] = sprintf(\n                        'Content-Type: %s%s',\n                        $type,\n                        $this->LE\n                    );\n                }\n                // RFC1341 part 5 says 7bit is assumed if not specified\n                if ($encoding != '7bit') {\n                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n                }\n\n                if ($disposition == 'inline') {\n                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n                }\n\n                // If a filename contains any of these chars, it should be quoted,\n                // but not otherwise: RFC2183 & RFC2045 5.1\n                // Fixes a warning in IETF's msglint MIME checker\n                // Allow for bypassing the Content-Disposition header totally\n                if (!(empty($disposition))) {\n                    $encoded_name = $this->encodeHeader($this->secureHeader($name));\n                    if (preg_match('/[ \\(\\)<>@,;:\\\\\"\\/\\[\\]\\?=]/', $encoded_name)) {\n                        $mime[] = sprintf(\n                            'Content-Disposition: %s; filename=\"%s\"%s',\n                            $disposition,\n                            $encoded_name,\n                            $this->LE . $this->LE\n                        );\n                    } else {\n                        if (!empty($encoded_name)) {\n                            $mime[] = sprintf(\n                                'Content-Disposition: %s; filename=%s%s',\n                                $disposition,\n                                $encoded_name,\n                                $this->LE . $this->LE\n                            );\n                        } else {\n                            $mime[] = sprintf(\n                                'Content-Disposition: %s%s',\n                                $disposition,\n                                $this->LE . $this->LE\n                            );\n                        }\n                    }\n                } else {\n                    $mime[] = $this->LE;\n                }\n\n                // Encode as string attachment\n                if ($bString) {\n                    $mime[] = $this->encodeString($string, $encoding);\n                    if ($this->isError()) {\n                        return '';\n                    }\n                    $mime[] = $this->LE . $this->LE;\n                } else {\n                    $mime[] = $this->encodeFile($path, $encoding);\n                    if ($this->isError()) {\n                        return '';\n                    }\n                    $mime[] = $this->LE . $this->LE;\n                }\n            }\n        }\n\n        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n        return implode('', $mime);\n    }\n\n    /**\n     * Encode a file attachment in requested format.\n     * Returns an empty string on failure.\n     * @param string $path The full path to the file\n     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n     * @throws phpmailerException\n     * @access protected\n     * @return string\n     */\n    protected function encodeFile($path, $encoding = 'base64')\n    {\n        try {\n            if (!is_readable($path)) {\n                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n            }\n            $magic_quotes = get_magic_quotes_runtime();\n            if ($magic_quotes) {\n                if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n                    set_magic_quotes_runtime(false);\n                } else {\n                    //Doesn't exist in PHP 5.4, but we don't need to check because\n                    //get_magic_quotes_runtime always returns false in 5.4+\n                    //so it will never get here\n                    ini_set('magic_quotes_runtime', false);\n                }\n            }\n            $file_buffer = file_get_contents($path);\n            $file_buffer = $this->encodeString($file_buffer, $encoding);\n            if ($magic_quotes) {\n                if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n                    set_magic_quotes_runtime($magic_quotes);\n                } else {\n                    ini_set('magic_quotes_runtime', $magic_quotes);\n                }\n            }\n            return $file_buffer;\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            return '';\n        }\n    }\n\n    /**\n     * Encode a string in requested format.\n     * Returns an empty string on failure.\n     * @param string $str The text to encode\n     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n     * @access public\n     * @return string\n     */\n    public function encodeString($str, $encoding = 'base64')\n    {\n        $encoded = '';\n        switch (strtolower($encoding)) {\n            case 'base64':\n                $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n                break;\n            case '7bit':\n            case '8bit':\n                $encoded = $this->fixEOL($str);\n                // Make sure it ends with a line break\n                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n                    $encoded .= $this->LE;\n                }\n                break;\n            case 'binary':\n                $encoded = $str;\n                break;\n            case 'quoted-printable':\n                $encoded = $this->encodeQP($str);\n                break;\n            default:\n                $this->setError($this->lang('encoding') . $encoding);\n                break;\n        }\n        return $encoded;\n    }\n\n    /**\n     * Encode a header string optimally.\n     * Picks shortest of Q, B, quoted-printable or none.\n     * @access public\n     * @param string $str\n     * @param string $position\n     * @return string\n     */\n    public function encodeHeader($str, $position = 'text')\n    {\n        $matchcount = 0;\n        switch (strtolower($position)) {\n            case 'phrase':\n                if (!preg_match('/[\\200-\\377]/', $str)) {\n                    // Can't use addslashes as we don't know the value of magic_quotes_sybase\n                    $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\\'*+\\/=?^_`{|}~ -]/', $str)) {\n                        return ($encoded);\n                    } else {\n                        return (\"\\\"$encoded\\\"\");\n                    }\n                }\n                $matchcount = preg_match_all('/[^\\040\\041\\043-\\133\\135-\\176]/', $str, $matches);\n                break;\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 'comment':\n                $matchcount = preg_match_all('/[()\"]/', $str, $matches);\n                // Intentional fall-through\n            case 'text':\n            default:\n                $matchcount += preg_match_all('/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]/', $str, $matches);\n                break;\n        }\n\n        //There are no chars that need encoding\n        if ($matchcount == 0) {\n            return ($str);\n        }\n\n        $maxlen = 75 - 7 - strlen($this->CharSet);\n        // Try to select the encoding which should produce the shortest output\n        if ($matchcount > strlen($str) / 3) {\n            // More than a third of the content will need encoding, so B encoding will be most efficient\n            $encoding = 'B';\n            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n                // Use a custom function which correctly encodes and wraps long\n                // multibyte strings without breaking lines within a character\n                $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n            } else {\n                $encoded = base64_encode($str);\n                $maxlen -= $maxlen % 4;\n                $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n            }\n        } else {\n            $encoding = 'Q';\n            $encoded = $this->encodeQ($str, $position);\n            $encoded = $this->wrapText($encoded, $maxlen, true);\n            $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n        }\n\n        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n        $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n        return $encoded;\n    }\n\n    /**\n     * Check if a string contains multi-byte characters.\n     * @access public\n     * @param string $str multi-byte text to wrap encode\n     * @return boolean\n     */\n    public function hasMultiBytes($str)\n    {\n        if (function_exists('mb_strlen')) {\n            return (strlen($str) > mb_strlen($str, $this->CharSet));\n        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)\n            return false;\n        }\n    }\n\n    /**\n     * Does a string contain any 8-bit chars (in any charset)?\n     * @param string $text\n     * @return boolean\n     */\n    public function has8bitChars($text)\n    {\n        return (boolean)preg_match('/[\\x80-\\xFF]/', $text);\n    }\n\n    /**\n     * Encode and wrap long multibyte strings for mail headers\n     * without breaking lines within a character.\n     * Adapted from a function by paravoid\n     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283\n     * @access public\n     * @param string $str multi-byte text to wrap encode\n     * @param string $linebreak string to use as linefeed/end-of-line\n     * @return string\n     */\n    public function base64EncodeWrapMB($str, $linebreak = null)\n    {\n        $start = '=?' . $this->CharSet . '?B?';\n        $end = '?=';\n        $encoded = '';\n        if ($linebreak === null) {\n            $linebreak = $this->LE;\n        }\n\n        $mb_length = mb_strlen($str, $this->CharSet);\n        // Each line must have length <= 75, including $start and $end\n        $length = 75 - strlen($start) - strlen($end);\n        // Average multi-byte ratio\n        $ratio = $mb_length / strlen($str);\n        // Base64 has a 4:3 ratio\n        $avgLength = floor($length * $ratio * .75);\n\n        for ($i = 0; $i < $mb_length; $i += $offset) {\n            $lookBack = 0;\n            do {\n                $offset = $avgLength - $lookBack;\n                $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n                $chunk = base64_encode($chunk);\n                $lookBack++;\n            } while (strlen($chunk) > $length);\n            $encoded .= $chunk . $linebreak;\n        }\n\n        // Chomp the last linefeed\n        $encoded = substr($encoded, 0, -strlen($linebreak));\n        return $encoded;\n    }\n\n    /**\n     * Encode a string in quoted-printable format.\n     * According to RFC2045 section 6.7.\n     * @access public\n     * @param string $string The text to encode\n     * @param integer $line_max Number of chars allowed on a line before wrapping\n     * @return string\n     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment\n     */\n    public function encodeQP($string, $line_max = 76)\n    {\n        // Use native function if it's available (>= PHP5.3)\n        if (function_exists('quoted_printable_encode')) {\n            return quoted_printable_encode($string);\n        }\n        // Fall back to a pure PHP implementation\n        $string = str_replace(\n            array('%20', '%0D%0A.', '%0D%0A', '%'),\n            array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n            rawurlencode($string)\n        );\n        return preg_replace('/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}/', \"$0=\\r\\n\", $string);\n    }\n\n    /**\n     * Backward compatibility wrapper for an old QP encoding function that was removed.\n     * @see PHPMailer::encodeQP()\n     * @access public\n     * @param string $string\n     * @param integer $line_max\n     * @param boolean $space_conv\n     * @return string\n     * @deprecated Use encodeQP instead.\n     */\n    public function encodeQPphp(\n        $string,\n        $line_max = 76,\n        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false\n    ) {\n        return $this->encodeQP($string, $line_max);\n    }\n\n    /**\n     * Encode a string using Q encoding.\n     * @link http://tools.ietf.org/html/rfc2047\n     * @param string $str the text to encode\n     * @param string $position Where the text is going to be used, see the RFC for what that means\n     * @access public\n     * @return string\n     */\n    public function encodeQ($str, $position = 'text')\n    {\n        // There should not be any EOL in the string\n        $pattern = '';\n        $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n        switch (strtolower($position)) {\n            case 'phrase':\n                // RFC 2047 section 5.3\n                $pattern = '^A-Za-z0-9!*+\\/ -';\n                break;\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 'comment':\n                // RFC 2047 section 5.2\n                $pattern = '\\(\\)\"';\n                // intentional fall-through\n                // for this reason we build the $pattern without including delimiters and []\n            case 'text':\n            default:\n                // RFC 2047 section 5.1\n                // Replace every high ascii, control, =, ? and _ characters\n                $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n                break;\n        }\n        $matches = array();\n        if (preg_match_all(\"/[{$pattern}]/\", $encoded, $matches)) {\n            // If the string contains an '=', make sure it's the first thing we replace\n            // so as to avoid double-encoding\n            $eqkey = array_search('=', $matches[0]);\n            if (false !== $eqkey) {\n                unset($matches[0][$eqkey]);\n                array_unshift($matches[0], '=');\n            }\n            foreach (array_unique($matches[0]) as $char) {\n                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n            }\n        }\n        // Replace every spaces to _ (more readable than =20)\n        return str_replace(' ', '_', $encoded);\n    }\n\n    /**\n     * Add a string or binary attachment (non-filesystem).\n     * This method can be used to attach ascii or binary data,\n     * such as a BLOB record from a database.\n     * @param string $string String attachment data.\n     * @param string $filename Name of the attachment.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File extension (MIME) type.\n     * @param string $disposition Disposition to use\n     * @return void\n     */\n    public function addStringAttachment(\n        $string,\n        $filename,\n        $encoding = 'base64',\n        $type = '',\n        $disposition = 'attachment'\n    ) {\n        // If a MIME type is not specified, try to work it out from the file name\n        if ($type == '') {\n            $type = self::filenameToType($filename);\n        }\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $string,\n            1 => $filename,\n            2 => basename($filename),\n            3 => $encoding,\n            4 => $type,\n            5 => true, // isStringAttachment\n            6 => $disposition,\n            7 => 0\n        );\n    }\n\n    /**\n     * Add an embedded (inline) attachment from a file.\n     * This can include images, sounds, and just about any other document type.\n     * These differ from 'regular' attachments in that they are intended to be\n     * displayed inline with the message, not just attached for download.\n     * This is used in HTML messages that embed the images\n     * the HTML refers to using the $cid value.\n     * Never use a user-supplied path to a file!\n     * @param string $path Path to the attachment.\n     * @param string $cid Content ID of the attachment; Use this to reference\n     *        the content when using an embedded image in HTML.\n     * @param string $name Overrides the attachment name.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File MIME type.\n     * @param string $disposition Disposition to use\n     * @return boolean True on successfully adding an attachment\n     */\n    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n    {\n        if (!@is_file($path)) {\n            $this->setError($this->lang('file_access') . $path);\n            return false;\n        }\n\n        // If a MIME type is not specified, try to work it out from the file name\n        if ($type == '') {\n            $type = self::filenameToType($path);\n        }\n\n        $filename = basename($path);\n        if ($name == '') {\n            $name = $filename;\n        }\n\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $path,\n            1 => $filename,\n            2 => $name,\n            3 => $encoding,\n            4 => $type,\n            5 => false, // isStringAttachment\n            6 => $disposition,\n            7 => $cid\n        );\n        return true;\n    }\n\n    /**\n     * Add an embedded stringified attachment.\n     * This can include images, sounds, and just about any other document type.\n     * Be sure to set the $type to an image type for images:\n     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.\n     * @param string $string The attachment binary data.\n     * @param string $cid Content ID of the attachment; Use this to reference\n     *        the content when using an embedded image in HTML.\n     * @param string $name\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type MIME type.\n     * @param string $disposition Disposition to use\n     * @return boolean True on successfully adding an attachment\n     */\n    public function addStringEmbeddedImage(\n        $string,\n        $cid,\n        $name = '',\n        $encoding = 'base64',\n        $type = '',\n        $disposition = 'inline'\n    ) {\n        // If a MIME type is not specified, try to work it out from the name\n        if ($type == '' and !empty($name)) {\n            $type = self::filenameToType($name);\n        }\n\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $string,\n            1 => $name,\n            2 => $name,\n            3 => $encoding,\n            4 => $type,\n            5 => true, // isStringAttachment\n            6 => $disposition,\n            7 => $cid\n        );\n        return true;\n    }\n\n    /**\n     * Check if an inline attachment is present.\n     * @access public\n     * @return boolean\n     */\n    public function inlineImageExists()\n    {\n        foreach ($this->attachment as $attachment) {\n            if ($attachment[6] == 'inline') {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Check if an attachment (non-inline) is present.\n     * @return boolean\n     */\n    public function attachmentExists()\n    {\n        foreach ($this->attachment as $attachment) {\n            if ($attachment[6] == 'attachment') {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Check if this message has an alternative body set.\n     * @return boolean\n     */\n    public function alternativeExists()\n    {\n        return !empty($this->AltBody);\n    }\n\n    /**\n     * Clear queued addresses of given kind.\n     * @access protected\n     * @param string $kind 'to', 'cc', or 'bcc'\n     * @return void\n     */\n    public function clearQueuedAddresses($kind)\n    {\n        $RecipientsQueue = $this->RecipientsQueue;\n        foreach ($RecipientsQueue as $address => $params) {\n            if ($params[0] == $kind) {\n                unset($this->RecipientsQueue[$address]);\n            }\n        }\n    }\n\n    /**\n     * Clear all To recipients.\n     * @return void\n     */\n    public function clearAddresses()\n    {\n        foreach ($this->to as $to) {\n            unset($this->all_recipients[strtolower($to[0])]);\n        }\n        $this->to = array();\n        $this->clearQueuedAddresses('to');\n    }\n\n    /**\n     * Clear all CC recipients.\n     * @return void\n     */\n    public function clearCCs()\n    {\n        foreach ($this->cc as $cc) {\n            unset($this->all_recipients[strtolower($cc[0])]);\n        }\n        $this->cc = array();\n        $this->clearQueuedAddresses('cc');\n    }\n\n    /**\n     * Clear all BCC recipients.\n     * @return void\n     */\n    public function clearBCCs()\n    {\n        foreach ($this->bcc as $bcc) {\n            unset($this->all_recipients[strtolower($bcc[0])]);\n        }\n        $this->bcc = array();\n        $this->clearQueuedAddresses('bcc');\n    }\n\n    /**\n     * Clear all ReplyTo recipients.\n     * @return void\n     */\n    public function clearReplyTos()\n    {\n        $this->ReplyTo = array();\n        $this->ReplyToQueue = array();\n    }\n\n    /**\n     * Clear all recipient types.\n     * @return void\n     */\n    public function clearAllRecipients()\n    {\n        $this->to = array();\n        $this->cc = array();\n        $this->bcc = array();\n        $this->all_recipients = array();\n        $this->RecipientsQueue = array();\n    }\n\n    /**\n     * Clear all filesystem, string, and binary attachments.\n     * @return void\n     */\n    public function clearAttachments()\n    {\n        $this->attachment = array();\n    }\n\n    /**\n     * Clear all custom headers.\n     * @return void\n     */\n    public function clearCustomHeaders()\n    {\n        $this->CustomHeader = array();\n    }\n\n    /**\n     * Add an error message to the error container.\n     * @access protected\n     * @param string $msg\n     * @return void\n     */\n    protected function setError($msg)\n    {\n        $this->error_count++;\n        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n            $lasterror = $this->smtp->getError();\n            if (!empty($lasterror['error'])) {\n                $msg .= $this->lang('smtp_error') . $lasterror['error'];\n                if (!empty($lasterror['detail'])) {\n                    $msg .= ' Detail: '. $lasterror['detail'];\n                }\n                if (!empty($lasterror['smtp_code'])) {\n                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n                }\n                if (!empty($lasterror['smtp_code_ex'])) {\n                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n                }\n            }\n        }\n        $this->ErrorInfo = $msg;\n    }\n\n    /**\n     * Return an RFC 822 formatted date.\n     * @access public\n     * @return string\n     * @static\n     */\n    public static function rfcDate()\n    {\n        // Set the time zone to whatever the default is to avoid 500 errors\n        // Will default to UTC if it's not set properly in php.ini\n        date_default_timezone_set(@date_default_timezone_get());\n        return date('D, j M Y H:i:s O');\n    }\n\n    /**\n     * Get the server hostname.\n     * Returns 'localhost.localdomain' if unknown.\n     * @access protected\n     * @return string\n     */\n    protected function serverHostname()\n    {\n        $result = 'localhost.localdomain';\n        if (!empty($this->Hostname)) {\n            $result = $this->Hostname;\n        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n            $result = $_SERVER['SERVER_NAME'];\n        } elseif (function_exists('gethostname') && gethostname() !== false) {\n            $result = gethostname();\n        } elseif (php_uname('n') !== false) {\n            $result = php_uname('n');\n        }\n        return $result;\n    }\n\n    /**\n     * Get an error message in the current language.\n     * @access protected\n     * @param string $key\n     * @return string\n     */\n    protected function lang($key)\n    {\n        if (count($this->language) < 1) {\n            $this->setLanguage('en'); // set the default language\n        }\n\n        if (array_key_exists($key, $this->language)) {\n            if ($key == 'smtp_connect_failed') {\n                //Include a link to troubleshooting docs on SMTP connection failure\n                //this is by far the biggest cause of support questions\n                //but it's usually not PHPMailer's fault.\n                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';\n            }\n            return $this->language[$key];\n        } else {\n            //Return the key as a fallback\n            return $key;\n        }\n    }\n\n    /**\n     * Check if an error occurred.\n     * @access public\n     * @return boolean True if an error did occur.\n     */\n    public function isError()\n    {\n        return ($this->error_count > 0);\n    }\n\n    /**\n     * Ensure consistent line endings in a string.\n     * Changes every end of line from CRLF, CR or LF to $this->LE.\n     * @access public\n     * @param string $str String to fixEOL\n     * @return string\n     */\n    public function fixEOL($str)\n    {\n        // Normalise to \\n\n        $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n        // Now convert LE as needed\n        if ($this->LE !== \"\\n\") {\n            $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n        }\n        return $nstr;\n    }\n\n    /**\n     * Add a custom header.\n     * $name value can be overloaded to contain\n     * both header name and value (name:value)\n     * @access public\n     * @param string $name Custom header name\n     * @param string $value Header value\n     * @return void\n     */\n    public function addCustomHeader($name, $value = null)\n    {\n        if ($value === null) {\n            // Value passed in as name:value\n            $this->CustomHeader[] = explode(':', $name, 2);\n        } else {\n            $this->CustomHeader[] = array($name, $value);\n        }\n    }\n\n    /**\n     * Returns all custom headers.\n     * @return array\n     */\n    public function getCustomHeaders()\n    {\n        return $this->CustomHeader;\n    }\n\n    /**\n     * Create a message body from an HTML string.\n     * Automatically inlines images and creates a plain-text version by converting the HTML,\n     * overwriting any existing values in Body and AltBody.\n     * Do not source $message content from user input!\n     * $basedir is prepended when handling relative URLs, e.g. <img src=\"/images/a.png\"> and must not be empty\n     * will look for an image file in $basedir/images/a.png and convert it to inline.\n     * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email)\n     * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly.\n     * @access public\n     * @param string $message HTML message string\n     * @param string $basedir Absolute path to a base directory to prepend to relative paths to images\n     * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n     *    or your own custom converter @see PHPMailer::html2text()\n     * @return string $message The transformed message Body\n     */\n    public function msgHTML($message, $basedir = '', $advanced = false)\n    {\n        preg_match_all('/(src|background)=[\"\\'](.*)[\"\\']/Ui', $message, $images);\n        if (array_key_exists(2, $images)) {\n            if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {\n                // Ensure $basedir has a trailing /\n                $basedir .= '/';\n            }\n            foreach ($images[2] as $imgindex => $url) {\n                // Convert data URIs into embedded images\n                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n                    $data = substr($url, strpos($url, ','));\n                    if ($match[2]) {\n                        $data = base64_decode($data);\n                    } else {\n                        $data = rawurldecode($data);\n                    }\n                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2\n                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n                        $message = str_replace(\n                            $images[0][$imgindex],\n                            $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n                            $message\n                        );\n                    }\n                    continue;\n                }\n                if (\n                    // Only process relative URLs if a basedir is provided (i.e. no absolute local paths)\n                    !empty($basedir)\n                    // Ignore URLs containing parent dir traversal (..)\n                    && (strpos($url, '..') === false)\n                    // Do not change urls that are already inline images\n                    && substr($url, 0, 4) !== 'cid:'\n                    // Do not change absolute URLs, including anonymous protocol\n                    && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)\n                ) {\n                    $filename = basename($url);\n                    $directory = dirname($url);\n                    if ($directory == '.') {\n                        $directory = '';\n                    }\n                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2\n                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {\n                        $directory .= '/';\n                    }\n                    if ($this->addEmbeddedImage(\n                        $basedir . $directory . $filename,\n                        $cid,\n                        $filename,\n                        'base64',\n                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n                    )\n                    ) {\n                        $message = preg_replace(\n                            '/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '/') . '[\"\\']/Ui',\n                            $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n                            $message\n                        );\n                    }\n                }\n            }\n        }\n        $this->isHTML(true);\n        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n        $this->Body = $this->normalizeBreaks($message);\n        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n        if (!$this->alternativeExists()) {\n            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n                self::CRLF . self::CRLF;\n        }\n        return $this->Body;\n    }\n\n    /**\n     * Convert an HTML string into plain text.\n     * This is used by msgHTML().\n     * Note - older versions of this function used a bundled advanced converter\n     * which was been removed for license reasons in #232.\n     * Example usage:\n     * <code>\n     * // Use default conversion\n     * $plain = $mail->html2text($html);\n     * // Use your own custom converter\n     * $plain = $mail->html2text($html, function($html) {\n     *     $converter = new MyHtml2text($html);\n     *     return $converter->get_text();\n     * });\n     * </code>\n     * @param string $html The HTML text to convert\n     * @param boolean|callable $advanced Any boolean value to use the internal converter,\n     *   or provide your own callable for custom conversion.\n     * @return string\n     */\n    public function html2text($html, $advanced = false)\n    {\n        if (is_callable($advanced)) {\n            return call_user_func($advanced, $html);\n        }\n        return html_entity_decode(\n            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\\/\\\\1>/si', '', $html))),\n            ENT_QUOTES,\n            $this->CharSet\n        );\n    }\n\n    /**\n     * Get the MIME type for a file extension.\n     * @param string $ext File extension\n     * @access public\n     * @return string MIME type of file.\n     * @static\n     */\n    public static function _mime_types($ext = '')\n    {\n        $mimes = array(\n            'xl'    => 'application/excel',\n            'js'    => 'application/javascript',\n            'hqx'   => 'application/mac-binhex40',\n            'cpt'   => 'application/mac-compactpro',\n            'bin'   => 'application/macbinary',\n            'doc'   => 'application/msword',\n            'word'  => 'application/msword',\n            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',\n            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',\n            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',\n            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n            'class' => 'application/octet-stream',\n            'dll'   => 'application/octet-stream',\n            'dms'   => 'application/octet-stream',\n            'exe'   => 'application/octet-stream',\n            'lha'   => 'application/octet-stream',\n            'lzh'   => 'application/octet-stream',\n            'psd'   => 'application/octet-stream',\n            'sea'   => 'application/octet-stream',\n            'so'    => 'application/octet-stream',\n            'oda'   => 'application/oda',\n            'pdf'   => 'application/pdf',\n            'ai'    => 'application/postscript',\n            'eps'   => 'application/postscript',\n            'ps'    => 'application/postscript',\n            'smi'   => 'application/smil',\n            'smil'  => 'application/smil',\n            'mif'   => 'application/vnd.mif',\n            'xls'   => 'application/vnd.ms-excel',\n            'ppt'   => 'application/vnd.ms-powerpoint',\n            'wbxml' => 'application/vnd.wap.wbxml',\n            'wmlc'  => 'application/vnd.wap.wmlc',\n            'dcr'   => 'application/x-director',\n            'dir'   => 'application/x-director',\n            'dxr'   => 'application/x-director',\n            'dvi'   => 'application/x-dvi',\n            'gtar'  => 'application/x-gtar',\n            'php3'  => 'application/x-httpd-php',\n            'php4'  => 'application/x-httpd-php',\n            'php'   => 'application/x-httpd-php',\n            'phtml' => 'application/x-httpd-php',\n            'phps'  => 'application/x-httpd-php-source',\n            'swf'   => 'application/x-shockwave-flash',\n            'sit'   => 'application/x-stuffit',\n            'tar'   => 'application/x-tar',\n            'tgz'   => 'application/x-tar',\n            'xht'   => 'application/xhtml+xml',\n            'xhtml' => 'application/xhtml+xml',\n            'zip'   => 'application/zip',\n            'mid'   => 'audio/midi',\n            'midi'  => 'audio/midi',\n            'mp2'   => 'audio/mpeg',\n            'mp3'   => 'audio/mpeg',\n            'mpga'  => 'audio/mpeg',\n            'aif'   => 'audio/x-aiff',\n            'aifc'  => 'audio/x-aiff',\n            'aiff'  => 'audio/x-aiff',\n            'ram'   => 'audio/x-pn-realaudio',\n            'rm'    => 'audio/x-pn-realaudio',\n            'rpm'   => 'audio/x-pn-realaudio-plugin',\n            'ra'    => 'audio/x-realaudio',\n            'wav'   => 'audio/x-wav',\n            'bmp'   => 'image/bmp',\n            'gif'   => 'image/gif',\n            'jpeg'  => 'image/jpeg',\n            'jpe'   => 'image/jpeg',\n            'jpg'   => 'image/jpeg',\n            'png'   => 'image/png',\n            'tiff'  => 'image/tiff',\n            'tif'   => 'image/tiff',\n            'eml'   => 'message/rfc822',\n            'css'   => 'text/css',\n            'html'  => 'text/html',\n            'htm'   => 'text/html',\n            'shtml' => 'text/html',\n            'log'   => 'text/plain',\n            'text'  => 'text/plain',\n            'txt'   => 'text/plain',\n            'rtx'   => 'text/richtext',\n            'rtf'   => 'text/rtf',\n            'vcf'   => 'text/vcard',\n            'vcard' => 'text/vcard',\n            'xml'   => 'text/xml',\n            'xsl'   => 'text/xml',\n            'mpeg'  => 'video/mpeg',\n            'mpe'   => 'video/mpeg',\n            'mpg'   => 'video/mpeg',\n            'mov'   => 'video/quicktime',\n            'qt'    => 'video/quicktime',\n            'rv'    => 'video/vnd.rn-realvideo',\n            'avi'   => 'video/x-msvideo',\n            'movie' => 'video/x-sgi-movie'\n        );\n        if (array_key_exists(strtolower($ext), $mimes)) {\n            return $mimes[strtolower($ext)];\n        }\n        return 'application/octet-stream';\n    }\n\n    /**\n     * Map a file name to a MIME type.\n     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.\n     * @param string $filename A file name or full path, does not need to exist as a file\n     * @return string\n     * @static\n     */\n    public static function filenameToType($filename)\n    {\n        // In case the path is a URL, strip any query string before getting extension\n        $qpos = strpos($filename, '?');\n        if (false !== $qpos) {\n            $filename = substr($filename, 0, $qpos);\n        }\n        $pathinfo = self::mb_pathinfo($filename);\n        return self::_mime_types($pathinfo['extension']);\n    }\n\n    /**\n     * Multi-byte-safe pathinfo replacement.\n     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n     * Works similarly to the one in PHP >= 5.2.0\n     * @link http://www.php.net/manual/en/function.pathinfo.php#107461\n     * @param string $path A filename or path, does not need to exist as a file\n     * @param integer|string $options Either a PATHINFO_* constant,\n     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n     * @return string|array\n     * @static\n     */\n    public static function mb_pathinfo($path, $options = null)\n    {\n        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n        $pathinfo = array();\n        if (preg_match('%^(.*?)[\\\\\\\\/]*(([^/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\/]+?)|))[\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n            if (array_key_exists(1, $pathinfo)) {\n                $ret['dirname'] = $pathinfo[1];\n            }\n            if (array_key_exists(2, $pathinfo)) {\n                $ret['basename'] = $pathinfo[2];\n            }\n            if (array_key_exists(5, $pathinfo)) {\n                $ret['extension'] = $pathinfo[5];\n            }\n            if (array_key_exists(3, $pathinfo)) {\n                $ret['filename'] = $pathinfo[3];\n            }\n        }\n        switch ($options) {\n            case PATHINFO_DIRNAME:\n            case 'dirname':\n                return $ret['dirname'];\n            case PATHINFO_BASENAME:\n            case 'basename':\n                return $ret['basename'];\n            case PATHINFO_EXTENSION:\n            case 'extension':\n                return $ret['extension'];\n            case PATHINFO_FILENAME:\n            case 'filename':\n                return $ret['filename'];\n            default:\n                return $ret;\n        }\n    }\n\n    /**\n     * Set or reset instance properties.\n     * You should avoid this function - it's more verbose, less efficient, more error-prone and\n     * harder to debug than setting properties directly.\n     * Usage Example:\n     * `$mail->set('SMTPSecure', 'tls');`\n     *   is the same as:\n     * `$mail->SMTPSecure = 'tls';`\n     * @access public\n     * @param string $name The property name to set\n     * @param mixed $value The value to set the property to\n     * @return boolean\n     * @TODO Should this not be using the __set() magic function?\n     */\n    public function set($name, $value = '')\n    {\n        if (property_exists($this, $name)) {\n            $this->$name = $value;\n            return true;\n        } else {\n            $this->setError($this->lang('variable_set') . $name);\n            return false;\n        }\n    }\n\n    /**\n     * Strip newlines to prevent header injection.\n     * @access public\n     * @param string $str\n     * @return string\n     */\n    public function secureHeader($str)\n    {\n        return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n    }\n\n    /**\n     * Normalize line breaks in a string.\n     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n     * @param string $text\n     * @param string $breaktype What kind of line break to use, defaults to CRLF\n     * @return string\n     * @access public\n     * @static\n     */\n    public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n    {\n        return preg_replace('/(\\r\\n|\\r|\\n)/ms', $breaktype, $text);\n    }\n\n    /**\n     * Set the public and private key files and password for S/MIME signing.\n     * @access public\n     * @param string $cert_filename\n     * @param string $key_filename\n     * @param string $key_pass Password for private key\n     * @param string $extracerts_filename Optional path to chain certificate\n     */\n    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n    {\n        $this->sign_cert_file = $cert_filename;\n        $this->sign_key_file = $key_filename;\n        $this->sign_key_pass = $key_pass;\n        $this->sign_extracerts_file = $extracerts_filename;\n    }\n\n    /**\n     * Quoted-Printable-encode a DKIM header.\n     * @access public\n     * @param string $txt\n     * @return string\n     */\n    public function DKIM_QP($txt)\n    {\n        $line = '';\n        for ($i = 0; $i < strlen($txt); $i++) {\n            $ord = ord($txt[$i]);\n            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n                $line .= $txt[$i];\n            } else {\n                $line .= '=' . sprintf('%02X', $ord);\n            }\n        }\n        return $line;\n    }\n\n    /**\n     * Generate a DKIM signature.\n     * @access public\n     * @param string $signHeader\n     * @throws phpmailerException\n     * @return string The DKIM signature value\n     */\n    public function DKIM_Sign($signHeader)\n    {\n        if (!defined('PKCS7_TEXT')) {\n            if ($this->exceptions) {\n                throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n            }\n            return '';\n        }\n        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);\n        if ('' != $this->DKIM_passphrase) {\n            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n        } else {\n            $privKey = openssl_pkey_get_private($privKeyStr);\n        }\n        //Workaround for missing digest algorithms in old PHP & OpenSSL versions\n        //@link http://stackoverflow.com/a/11117338/333340\n        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and\n            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {\n            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {\n                openssl_pkey_free($privKey);\n                return base64_encode($signature);\n            }\n        } else {\n            $pinfo = openssl_pkey_get_details($privKey);\n            $hash = hash('sha256', $signHeader);\n            //'Magic' constant for SHA256 from RFC3447\n            //@link https://tools.ietf.org/html/rfc3447#page-43\n            $t = '3031300d060960864801650304020105000420' . $hash;\n            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);\n            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);\n\n            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {\n                openssl_pkey_free($privKey);\n                return base64_encode($signature);\n            }\n        }\n        openssl_pkey_free($privKey);\n        return '';\n    }\n\n    /**\n     * Generate a DKIM canonicalization header.\n     * @access public\n     * @param string $signHeader Header\n     * @return string\n     */\n    public function DKIM_HeaderC($signHeader)\n    {\n        $signHeader = preg_replace('/\\r\\n\\s+/', ' ', $signHeader);\n        $lines = explode(\"\\r\\n\", $signHeader);\n        foreach ($lines as $key => $line) {\n            list($heading, $value) = explode(':', $line, 2);\n            $heading = strtolower($heading);\n            $value = preg_replace('/\\s{2,}/', ' ', $value); // Compress useless spaces\n            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value\n        }\n        $signHeader = implode(\"\\r\\n\", $lines);\n        return $signHeader;\n    }\n\n    /**\n     * Generate a DKIM canonicalization body.\n     * @access public\n     * @param string $body Message Body\n     * @return string\n     */\n    public function DKIM_BodyC($body)\n    {\n        if ($body == '') {\n            return \"\\r\\n\";\n        }\n        // stabilize line endings\n        $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n        $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n        // END stabilize line endings\n        while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n            $body = substr($body, 0, strlen($body) - 2);\n        }\n        return $body;\n    }\n\n    /**\n     * Create the DKIM header and body in a new message header.\n     * @access public\n     * @param string $headers_line Header lines\n     * @param string $subject Subject\n     * @param string $body Body\n     * @return string\n     */\n    public function DKIM_Add($headers_line, $subject, $body)\n    {\n        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms\n        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body\n        $DKIMquery = 'dns/txt'; // Query method\n        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n        $subject_header = \"Subject: $subject\";\n        $headers = explode($this->LE, $headers_line);\n        $from_header = '';\n        $to_header = '';\n        $date_header = '';\n        $current = '';\n        foreach ($headers as $header) {\n            if (strpos($header, 'From:') === 0) {\n                $from_header = $header;\n                $current = 'from_header';\n            } elseif (strpos($header, 'To:') === 0) {\n                $to_header = $header;\n                $current = 'to_header';\n            } elseif (strpos($header, 'Date:') === 0) {\n                $date_header = $header;\n                $current = 'date_header';\n            } else {\n                if (!empty($$current) && strpos($header, ' =?') === 0) {\n                    $$current .= $header;\n                } else {\n                    $current = '';\n                }\n            }\n        }\n        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));\n        $subject = str_replace(\n            '|',\n            '=7C',\n            $this->DKIM_QP($subject_header)\n        ); // Copied header fields (dkim-quoted-printable)\n        $body = $this->DKIM_BodyC($body);\n        $DKIMlen = strlen($body); // Length of body\n        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body\n        if ('' == $this->DKIM_identity) {\n            $ident = '';\n        } else {\n            $ident = ' i=' . $this->DKIM_identity . ';';\n        }\n        $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n            $DKIMsignatureType . '; q=' .\n            $DKIMquery . '; l=' .\n            $DKIMlen . '; s=' .\n            $this->DKIM_selector .\n            \";\\r\\n\" .\n            \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n            \"\\th=From:To:Date:Subject;\\r\\n\" .\n            \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n            \"\\tz=$from\\r\\n\" .\n            \"\\t|$to\\r\\n\" .\n            \"\\t|$date\\r\\n\" .\n            \"\\t|$subject;\\r\\n\" .\n            \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n            \"\\tb=\";\n        $toSign = $this->DKIM_HeaderC(\n            $from_header . \"\\r\\n\" .\n            $to_header . \"\\r\\n\" .\n            $date_header . \"\\r\\n\" .\n            $subject_header . \"\\r\\n\" .\n            $dkimhdrs\n        );\n        $signed = $this->DKIM_Sign($toSign);\n        return $dkimhdrs . $signed . \"\\r\\n\";\n    }\n\n    /**\n     * Detect if a string contains a line longer than the maximum line length allowed.\n     * @param string $str\n     * @return boolean\n     * @static\n     */\n    public static function hasLineLongerThanMax($str)\n    {\n        //+2 to include CRLF line break for a 1000 total\n        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);\n    }\n\n    /**\n     * Allows for public read access to 'to' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getToAddresses()\n    {\n        return $this->to;\n    }\n\n    /**\n     * Allows for public read access to 'cc' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getCcAddresses()\n    {\n        return $this->cc;\n    }\n\n    /**\n     * Allows for public read access to 'bcc' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getBccAddresses()\n    {\n        return $this->bcc;\n    }\n\n    /**\n     * Allows for public read access to 'ReplyTo' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getReplyToAddresses()\n    {\n        return $this->ReplyTo;\n    }\n\n    /**\n     * Allows for public read access to 'all_recipients' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getAllRecipientAddresses()\n    {\n        return $this->all_recipients;\n    }\n\n    /**\n     * Perform a callback.\n     * @param boolean $isSent\n     * @param array $to\n     * @param array $cc\n     * @param array $bcc\n     * @param string $subject\n     * @param string $body\n     * @param string $from\n     */\n    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n    {\n        if (!empty($this->action_function) && is_callable($this->action_function)) {\n            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n            call_user_func_array($this->action_function, $params);\n        }\n    }\n}\n\n/**\n * PHPMailer exception handler\n * @package PHPMailer\n */\nclass phpmailerException extends Exception\n{\n    /**\n     * Prettify error message output\n     * @return string\n     */\n    public function errorMessage()\n    {\n        $errorMsg = '<strong>' . htmlspecialchars($this->getMessage()) . \"</strong><br />\\n\";\n        return $errorMsg;\n    }\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/class.phpmaileroauth.php",
    "content": "<?php\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5.4\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailerOAuth - PHPMailer subclass adding OAuth support.\n * @package PHPMailer\n * @author @sherryl4george\n * @author Marcus Bointon (@Synchro) <phpmailer@synchromedia.co.uk>\n */\nclass PHPMailerOAuth extends PHPMailer\n{\n    /**\n     * The OAuth user's email address\n     * @var string\n     */\n    public $oauthUserEmail = '';\n\n    /**\n     * The OAuth refresh token\n     * @var string\n     */\n    public $oauthRefreshToken = '';\n\n    /**\n     * The OAuth client ID\n     * @var string\n     */\n    public $oauthClientId = '';\n\n    /**\n     * The OAuth client secret\n     * @var string\n     */\n    public $oauthClientSecret = '';\n\n    /**\n     * An instance of the PHPMailerOAuthGoogle class.\n     * @var PHPMailerOAuthGoogle\n     * @access protected\n     */\n    protected $oauth = null;\n\n    /**\n     * Get a PHPMailerOAuthGoogle instance to use.\n     * @return PHPMailerOAuthGoogle\n     */\n    public function getOAUTHInstance()\n    {\n        if (!is_object($this->oauth)) {\n            $this->oauth = new PHPMailerOAuthGoogle(\n                $this->oauthUserEmail,\n                $this->oauthClientSecret,\n                $this->oauthClientId,\n                $this->oauthRefreshToken\n            );\n        }\n        return $this->oauth;\n    }\n\n    /**\n     * Initiate a connection to an SMTP server.\n     * Overrides the original smtpConnect method to add support for OAuth.\n     * @param array $options An array of options compatible with stream_context_create()\n     * @uses SMTP\n     * @access public\n     * @return bool\n     * @throws phpmailerException\n     */\n    public function smtpConnect($options = array())\n    {\n        if (is_null($this->smtp)) {\n            $this->smtp = $this->getSMTPInstance();\n        }\n\n        if (is_null($this->oauth)) {\n            $this->oauth = $this->getOAUTHInstance();\n        }\n\n        // Already connected?\n        if ($this->smtp->connected()) {\n            return true;\n        }\n\n        $this->smtp->setTimeout($this->Timeout);\n        $this->smtp->setDebugLevel($this->SMTPDebug);\n        $this->smtp->setDebugOutput($this->Debugoutput);\n        $this->smtp->setVerp($this->do_verp);\n        $hosts = explode(';', $this->Host);\n        $lastexception = null;\n\n        foreach ($hosts as $hostentry) {\n            $hostinfo = array();\n            if (!preg_match('/^((ssl|tls):\\/\\/)*([a-zA-Z0-9\\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {\n                // Not a valid host entry\n                continue;\n            }\n            // $hostinfo[2]: optional ssl or tls prefix\n            // $hostinfo[3]: the hostname\n            // $hostinfo[4]: optional port number\n            // The host string prefix can temporarily override the current setting for SMTPSecure\n            // If it's not specified, the default value is used\n            $prefix = '';\n            $secure = $this->SMTPSecure;\n            $tls = ($this->SMTPSecure == 'tls');\n            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n                $prefix = 'ssl://';\n                $tls = false; // Can't have SSL and TLS at the same time\n                $secure = 'ssl';\n            } elseif ($hostinfo[2] == 'tls') {\n                $tls = true;\n                // tls doesn't use a prefix\n                $secure = 'tls';\n            }\n            //Do we need the OpenSSL extension?\n            $sslext = defined('OPENSSL_ALGO_SHA1');\n            if ('tls' === $secure or 'ssl' === $secure) {\n                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n                if (!$sslext) {\n                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n                }\n            }\n            $host = $hostinfo[3];\n            $port = $this->Port;\n            $tport = (integer)$hostinfo[4];\n            if ($tport > 0 and $tport < 65536) {\n                $port = $tport;\n            }\n            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n                try {\n                    if ($this->Helo) {\n                        $hello = $this->Helo;\n                    } else {\n                        $hello = $this->serverHostname();\n                    }\n                    $this->smtp->hello($hello);\n                    //Automatically enable TLS encryption if:\n                    // * it's not disabled\n                    // * we have openssl extension\n                    // * we are not already using SSL\n                    // * the server offers STARTTLS\n                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n                        $tls = true;\n                    }\n                    if ($tls) {\n                        if (!$this->smtp->startTLS()) {\n                            throw new phpmailerException($this->lang('connect_host'));\n                        }\n                        // We must resend HELO after tls negotiation\n                        $this->smtp->hello($hello);\n                    }\n                    if ($this->SMTPAuth) {\n                        if (!$this->smtp->authenticate(\n                            $this->Username,\n                            $this->Password,\n                            $this->AuthType,\n                            $this->Realm,\n                            $this->Workstation,\n                            $this->oauth\n                        )\n                        ) {\n                            throw new phpmailerException($this->lang('authenticate'));\n                        }\n                    }\n                    return true;\n                } catch (phpmailerException $exc) {\n                    $lastexception = $exc;\n                    $this->edebug($exc->getMessage());\n                    // We must have connected, but then failed TLS or Auth, so close connection nicely\n                    $this->smtp->quit();\n                }\n            }\n        }\n        // If we get here, all connection attempts have failed, so close connection hard\n        $this->smtp->close();\n        // As we've caught all exceptions, just report whatever the last one was\n        if ($this->exceptions and !is_null($lastexception)) {\n            throw $lastexception;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/class.phpmaileroauthgoogle.php",
    "content": "<?php\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5.4\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailerOAuthGoogle - Wrapper for League OAuth2 Google provider.\n * @package PHPMailer\n * @author @sherryl4george\n * @author Marcus Bointon (@Synchro) <phpmailer@synchromedia.co.uk>\n * @link https://github.com/thephpleague/oauth2-client\n */\nclass PHPMailerOAuthGoogle\n{\n    private $oauthUserEmail = '';\n    private $oauthRefreshToken = '';\n    private $oauthClientId = '';\n    private $oauthClientSecret = '';\n\n    /**\n     * @param string $UserEmail\n     * @param string $ClientSecret\n     * @param string $ClientId\n     * @param string $RefreshToken\n     */\n    public function __construct(\n        $UserEmail,\n        $ClientSecret,\n        $ClientId,\n        $RefreshToken\n    ) {\n        $this->oauthClientId = $ClientId;\n        $this->oauthClientSecret = $ClientSecret;\n        $this->oauthRefreshToken = $RefreshToken;\n        $this->oauthUserEmail = $UserEmail;\n    }\n\n    private function getProvider()\n    {\n        return new League\\OAuth2\\Client\\Provider\\Google([\n            'clientId' => $this->oauthClientId,\n            'clientSecret' => $this->oauthClientSecret\n        ]);\n    }\n\n    private function getGrant()\n    {\n        return new \\League\\OAuth2\\Client\\Grant\\RefreshToken();\n    }\n\n    private function getToken()\n    {\n        $provider = $this->getProvider();\n        $grant = $this->getGrant();\n        return $provider->getAccessToken($grant, ['refresh_token' => $this->oauthRefreshToken]);\n    }\n\n    public function getOauth64()\n    {\n        $token = $this->getToken();\n        return base64_encode(\"user=\" . $this->oauthUserEmail . \"\\001auth=Bearer \" . $token . \"\\001\\001\");\n    }\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/class.pop3.php",
    "content": "<?php\n/**\n * PHPMailer POP-Before-SMTP Authentication Class.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer POP-Before-SMTP Authentication Class.\n * Specifically for PHPMailer to use for RFC1939 POP-before-SMTP authentication.\n * Does not support APOP.\n * @package PHPMailer\n * @author Richard Davey (original author) <rich@corephp.co.uk>\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n */\nclass POP3\n{\n    /**\n     * The POP3 PHPMailer Version number.\n     * @var string\n     * @access public\n     */\n    public $Version = '5.2.24';\n\n    /**\n     * Default POP3 port number.\n     * @var integer\n     * @access public\n     */\n    public $POP3_PORT = 110;\n\n    /**\n     * Default timeout in seconds.\n     * @var integer\n     * @access public\n     */\n    public $POP3_TIMEOUT = 30;\n\n    /**\n     * POP3 Carriage Return + Line Feed.\n     * @var string\n     * @access public\n     * @deprecated Use the constant instead\n     */\n    public $CRLF = \"\\r\\n\";\n\n    /**\n     * Debug display level.\n     * Options: 0 = no, 1+ = yes\n     * @var integer\n     * @access public\n     */\n    public $do_debug = 0;\n\n    /**\n     * POP3 mail server hostname.\n     * @var string\n     * @access public\n     */\n    public $host;\n\n    /**\n     * POP3 port number.\n     * @var integer\n     * @access public\n     */\n    public $port;\n\n    /**\n     * POP3 Timeout Value in seconds.\n     * @var integer\n     * @access public\n     */\n    public $tval;\n\n    /**\n     * POP3 username\n     * @var string\n     * @access public\n     */\n    public $username;\n\n    /**\n     * POP3 password.\n     * @var string\n     * @access public\n     */\n    public $password;\n\n    /**\n     * Resource handle for the POP3 connection socket.\n     * @var resource\n     * @access protected\n     */\n    protected $pop_conn;\n\n    /**\n     * Are we connected?\n     * @var boolean\n     * @access protected\n     */\n    protected $connected = false;\n\n    /**\n     * Error container.\n     * @var array\n     * @access protected\n     */\n    protected $errors = array();\n\n    /**\n     * Line break constant\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * Simple static wrapper for all-in-one POP before SMTP\n     * @param $host\n     * @param integer|boolean $port The port number to connect to\n     * @param integer|boolean $timeout The timeout value\n     * @param string $username\n     * @param string $password\n     * @param integer $debug_level\n     * @return boolean\n     */\n    public static function popBeforeSmtp(\n        $host,\n        $port = false,\n        $timeout = false,\n        $username = '',\n        $password = '',\n        $debug_level = 0\n    ) {\n        $pop = new POP3;\n        return $pop->authorise($host, $port, $timeout, $username, $password, $debug_level);\n    }\n\n    /**\n     * Authenticate with a POP3 server.\n     * A connect, login, disconnect sequence\n     * appropriate for POP-before SMTP authorisation.\n     * @access public\n     * @param string $host The hostname to connect to\n     * @param integer|boolean $port The port number to connect to\n     * @param integer|boolean $timeout The timeout value\n     * @param string $username\n     * @param string $password\n     * @param integer $debug_level\n     * @return boolean\n     */\n    public function authorise($host, $port = false, $timeout = false, $username = '', $password = '', $debug_level = 0)\n    {\n        $this->host = $host;\n        // If no port value provided, use default\n        if (false === $port) {\n            $this->port = $this->POP3_PORT;\n        } else {\n            $this->port = (integer)$port;\n        }\n        // If no timeout value provided, use default\n        if (false === $timeout) {\n            $this->tval = $this->POP3_TIMEOUT;\n        } else {\n            $this->tval = (integer)$timeout;\n        }\n        $this->do_debug = $debug_level;\n        $this->username = $username;\n        $this->password = $password;\n        //  Reset the error log\n        $this->errors = array();\n        //  connect\n        $result = $this->connect($this->host, $this->port, $this->tval);\n        if ($result) {\n            $login_result = $this->login($this->username, $this->password);\n            if ($login_result) {\n                $this->disconnect();\n                return true;\n            }\n        }\n        // We need to disconnect regardless of whether the login succeeded\n        $this->disconnect();\n        return false;\n    }\n\n    /**\n     * Connect to a POP3 server.\n     * @access public\n     * @param string $host\n     * @param integer|boolean $port\n     * @param integer $tval\n     * @return boolean\n     */\n    public function connect($host, $port = false, $tval = 30)\n    {\n        //  Are we already connected?\n        if ($this->connected) {\n            return true;\n        }\n\n        //On Windows this will raise a PHP Warning error if the hostname doesn't exist.\n        //Rather than suppress it with @fsockopen, capture it cleanly instead\n        set_error_handler(array($this, 'catchWarning'));\n\n        if (false === $port) {\n            $port = $this->POP3_PORT;\n        }\n\n        //  connect to the POP3 server\n        $this->pop_conn = fsockopen(\n            $host, //  POP3 Host\n            $port, //  Port #\n            $errno, //  Error Number\n            $errstr, //  Error Message\n            $tval\n        ); //  Timeout (seconds)\n        //  Restore the error handler\n        restore_error_handler();\n\n        //  Did we connect?\n        if (false === $this->pop_conn) {\n            //  It would appear not...\n            $this->setError(array(\n                'error' => \"Failed to connect to server $host on port $port\",\n                'errno' => $errno,\n                'errstr' => $errstr\n            ));\n            return false;\n        }\n\n        //  Increase the stream time-out\n        stream_set_timeout($this->pop_conn, $tval, 0);\n\n        //  Get the POP3 server response\n        $pop3_response = $this->getResponse();\n        //  Check for the +OK\n        if ($this->checkResponse($pop3_response)) {\n            //  The connection is established and the POP3 server is talking\n            $this->connected = true;\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Log in to the POP3 server.\n     * Does not support APOP (RFC 2828, 4949).\n     * @access public\n     * @param string $username\n     * @param string $password\n     * @return boolean\n     */\n    public function login($username = '', $password = '')\n    {\n        if (!$this->connected) {\n            $this->setError('Not connected to POP3 server');\n        }\n        if (empty($username)) {\n            $username = $this->username;\n        }\n        if (empty($password)) {\n            $password = $this->password;\n        }\n\n        // Send the Username\n        $this->sendString(\"USER $username\" . self::CRLF);\n        $pop3_response = $this->getResponse();\n        if ($this->checkResponse($pop3_response)) {\n            // Send the Password\n            $this->sendString(\"PASS $password\" . self::CRLF);\n            $pop3_response = $this->getResponse();\n            if ($this->checkResponse($pop3_response)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Disconnect from the POP3 server.\n     * @access public\n     */\n    public function disconnect()\n    {\n        $this->sendString('QUIT');\n        //The QUIT command may cause the daemon to exit, which will kill our connection\n        //So ignore errors here\n        try {\n            @fclose($this->pop_conn);\n        } catch (Exception $e) {\n            //Do nothing\n        };\n    }\n\n    /**\n     * Get a response from the POP3 server.\n     * $size is the maximum number of bytes to retrieve\n     * @param integer $size\n     * @return string\n     * @access protected\n     */\n    protected function getResponse($size = 128)\n    {\n        $response = fgets($this->pop_conn, $size);\n        if ($this->do_debug >= 1) {\n            echo \"Server -> Client: $response\";\n        }\n        return $response;\n    }\n\n    /**\n     * Send raw data to the POP3 server.\n     * @param string $string\n     * @return integer\n     * @access protected\n     */\n    protected function sendString($string)\n    {\n        if ($this->pop_conn) {\n            if ($this->do_debug >= 2) { //Show client messages when debug >= 2\n                echo \"Client -> Server: $string\";\n            }\n            return fwrite($this->pop_conn, $string, strlen($string));\n        }\n        return 0;\n    }\n\n    /**\n     * Checks the POP3 server response.\n     * Looks for for +OK or -ERR.\n     * @param string $string\n     * @return boolean\n     * @access protected\n     */\n    protected function checkResponse($string)\n    {\n        if (substr($string, 0, 3) !== '+OK') {\n            $this->setError(array(\n                'error' => \"Server reported an error: $string\",\n                'errno' => 0,\n                'errstr' => ''\n            ));\n            return false;\n        } else {\n            return true;\n        }\n    }\n\n    /**\n     * Add an error to the internal error store.\n     * Also display debug output if it's enabled.\n     * @param $error\n     * @access protected\n     */\n    protected function setError($error)\n    {\n        $this->errors[] = $error;\n        if ($this->do_debug >= 1) {\n            echo '<pre>';\n            foreach ($this->errors as $error) {\n                print_r($error);\n            }\n            echo '</pre>';\n        }\n    }\n\n    /**\n     * Get an array of error messages, if any.\n     * @return array\n     */\n    public function getErrors()\n    {\n        return $this->errors;\n    }\n\n    /**\n     * POP3 connection error handler.\n     * @param integer $errno\n     * @param string $errstr\n     * @param string $errfile\n     * @param integer $errline\n     * @access protected\n     */\n    protected function catchWarning($errno, $errstr, $errfile, $errline)\n    {\n        $this->setError(array(\n            'error' => \"Connecting to the POP3 server raised a PHP warning: \",\n            'errno' => $errno,\n            'errstr' => $errstr,\n            'errfile' => $errfile,\n            'errline' => $errline\n        ));\n    }\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/class.smtp.php",
    "content": "<?php\n/**\n * PHPMailer RFC821 SMTP email transport class.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer RFC821 SMTP email transport class.\n * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.\n * @package PHPMailer\n * @author Chris Ryan\n * @author Marcus Bointon <phpmailer@synchromedia.co.uk>\n */\nclass SMTP\n{\n    /**\n     * The PHPMailer SMTP version number.\n     * @var string\n     */\n    const VERSION = '5.2.24';\n\n    /**\n     * SMTP line break constant.\n     * @var string\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * The SMTP port to use if one is not specified.\n     * @var integer\n     */\n    const DEFAULT_SMTP_PORT = 25;\n\n    /**\n     * The maximum line length allowed by RFC 2822 section 2.1.1\n     * @var integer\n     */\n    const MAX_LINE_LENGTH = 998;\n\n    /**\n     * Debug level for no output\n     */\n    const DEBUG_OFF = 0;\n\n    /**\n     * Debug level to show client -> server messages\n     */\n    const DEBUG_CLIENT = 1;\n\n    /**\n     * Debug level to show client -> server and server -> client messages\n     */\n    const DEBUG_SERVER = 2;\n\n    /**\n     * Debug level to show connection status, client -> server and server -> client messages\n     */\n    const DEBUG_CONNECTION = 3;\n\n    /**\n     * Debug level to show all messages\n     */\n    const DEBUG_LOWLEVEL = 4;\n\n    /**\n     * The PHPMailer SMTP Version number.\n     * @var string\n     * @deprecated Use the `VERSION` constant instead\n     * @see SMTP::VERSION\n     */\n    public $Version = '5.2.24';\n\n    /**\n     * SMTP server port number.\n     * @var integer\n     * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead\n     * @see SMTP::DEFAULT_SMTP_PORT\n     */\n    public $SMTP_PORT = 25;\n\n    /**\n     * SMTP reply line ending.\n     * @var string\n     * @deprecated Use the `CRLF` constant instead\n     * @see SMTP::CRLF\n     */\n    public $CRLF = \"\\r\\n\";\n\n    /**\n     * Debug output level.\n     * Options:\n     * * self::DEBUG_OFF (`0`) No debug output, default\n     * * self::DEBUG_CLIENT (`1`) Client commands\n     * * self::DEBUG_SERVER (`2`) Client commands and server responses\n     * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status\n     * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages\n     * @var integer\n     */\n    public $do_debug = self::DEBUG_OFF;\n\n    /**\n     * How to handle debug output.\n     * Options:\n     * * `echo` Output plain-text as-is, appropriate for CLI\n     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n     * * `error_log` Output to error log as configured in php.ini\n     *\n     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n     * <code>\n     * $smtp->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n     * </code>\n     * @var string|callable\n     */\n    public $Debugoutput = 'echo';\n\n    /**\n     * Whether to use VERP.\n     * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path\n     * @link http://www.postfix.org/VERP_README.html Info on VERP\n     * @var boolean\n     */\n    public $do_verp = false;\n\n    /**\n     * The timeout value for connection, in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.\n     * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2\n     * @var integer\n     */\n    public $Timeout = 300;\n\n    /**\n     * How long to wait for commands to complete, in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * @var integer\n     */\n    public $Timelimit = 300;\n\n    /**\n     * @var array Patterns to extract an SMTP transaction id from reply to a DATA command.\n     * The first capture group in each regex will be used as the ID.\n     */\n    protected $smtp_transaction_id_patterns = array(\n        'exim' => '/[0-9]{3} OK id=(.*)/',\n        'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/',\n        'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/'\n    );\n\n    /**\n     * @var string The last transaction ID issued in response to a DATA command,\n     * if one was detected\n     */\n    protected $last_smtp_transaction_id;\n\n    /**\n     * The socket for the server connection.\n     * @var resource\n     */\n    protected $smtp_conn;\n\n    /**\n     * Error information, if any, for the last SMTP command.\n     * @var array\n     */\n    protected $error = array(\n        'error' => '',\n        'detail' => '',\n        'smtp_code' => '',\n        'smtp_code_ex' => ''\n    );\n\n    /**\n     * The reply the server sent to us for HELO.\n     * If null, no HELO string has yet been received.\n     * @var string|null\n     */\n    protected $helo_rply = null;\n\n    /**\n     * The set of SMTP extensions sent in reply to EHLO command.\n     * Indexes of the array are extension names.\n     * Value at index 'HELO' or 'EHLO' (according to command that was sent)\n     * represents the server name. In case of HELO it is the only element of the array.\n     * Other values can be boolean TRUE or an array containing extension options.\n     * If null, no HELO/EHLO string has yet been received.\n     * @var array|null\n     */\n    protected $server_caps = null;\n\n    /**\n     * The most recent reply received from the server.\n     * @var string\n     */\n    protected $last_reply = '';\n\n    /**\n     * Output debugging info via a user-selected method.\n     * @see SMTP::$Debugoutput\n     * @see SMTP::$do_debug\n     * @param string $str Debug string to output\n     * @param integer $level The debug level of this message; see DEBUG_* constants\n     * @return void\n     */\n    protected function edebug($str, $level = 0)\n    {\n        if ($level > $this->do_debug) {\n            return;\n        }\n        //Avoid clash with built-in function names\n        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n            call_user_func($this->Debugoutput, $str, $level);\n            return;\n        }\n        switch ($this->Debugoutput) {\n            case 'error_log':\n                //Don't output, just log\n                error_log($str);\n                break;\n            case 'html':\n                //Cleans up output a bit for a better looking, HTML-safe output\n                echo gmdate('Y-m-d H:i:s') . ' ' . htmlentities(\n                    preg_replace('/[\\r\\n]+/', '', $str),\n                    ENT_QUOTES,\n                    'UTF-8'\n                ) . \"<br>\\n\";\n                break;\n            case 'echo':\n            default:\n                //Normalize line breaks\n                $str = preg_replace('/(\\r\\n|\\r|\\n)/ms', \"\\n\", $str);\n                echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n                    \"\\n\",\n                    \"\\n                   \\t                  \",\n                    trim($str)\n                ) . \"\\n\";\n        }\n    }\n\n    /**\n     * Connect to an SMTP server.\n     * @param string $host SMTP server IP or host name\n     * @param integer $port The port number to connect to\n     * @param integer $timeout How long to wait for the connection to open\n     * @param array $options An array of options for stream_context_create()\n     * @access public\n     * @return boolean\n     */\n    public function connect($host, $port = null, $timeout = 30, $options = array())\n    {\n        static $streamok;\n        //This is enabled by default since 5.0.0 but some providers disable it\n        //Check this once and cache the result\n        if (is_null($streamok)) {\n            $streamok = function_exists('stream_socket_client');\n        }\n        // Clear errors to avoid confusion\n        $this->setError('');\n        // Make sure we are __not__ connected\n        if ($this->connected()) {\n            // Already connected, generate error\n            $this->setError('Already connected to a server');\n            return false;\n        }\n        if (empty($port)) {\n            $port = self::DEFAULT_SMTP_PORT;\n        }\n        // Connect to the SMTP server\n        $this->edebug(\n            \"Connection: opening to $host:$port, timeout=$timeout, options=\" .\n            var_export($options, true),\n            self::DEBUG_CONNECTION\n        );\n        $errno = 0;\n        $errstr = '';\n        if ($streamok) {\n            $socket_context = stream_context_create($options);\n            set_error_handler(array($this, 'errorHandler'));\n            $this->smtp_conn = stream_socket_client(\n                $host . \":\" . $port,\n                $errno,\n                $errstr,\n                $timeout,\n                STREAM_CLIENT_CONNECT,\n                $socket_context\n            );\n            restore_error_handler();\n        } else {\n            //Fall back to fsockopen which should work in more places, but is missing some features\n            $this->edebug(\n                \"Connection: stream_socket_client not available, falling back to fsockopen\",\n                self::DEBUG_CONNECTION\n            );\n            set_error_handler(array($this, 'errorHandler'));\n            $this->smtp_conn = fsockopen(\n                $host,\n                $port,\n                $errno,\n                $errstr,\n                $timeout\n            );\n            restore_error_handler();\n        }\n        // Verify we connected properly\n        if (!is_resource($this->smtp_conn)) {\n            $this->setError(\n                'Failed to connect to server',\n                $errno,\n                $errstr\n            );\n            $this->edebug(\n                'SMTP ERROR: ' . $this->error['error']\n                . \": $errstr ($errno)\",\n                self::DEBUG_CLIENT\n            );\n            return false;\n        }\n        $this->edebug('Connection: opened', self::DEBUG_CONNECTION);\n        // SMTP server can take longer to respond, give longer timeout for first read\n        // Windows does not have support for this timeout function\n        if (substr(PHP_OS, 0, 3) != 'WIN') {\n            $max = ini_get('max_execution_time');\n            // Don't bother if unlimited\n            if ($max != 0 && $timeout > $max) {\n                @set_time_limit($timeout);\n            }\n            stream_set_timeout($this->smtp_conn, $timeout, 0);\n        }\n        // Get any announcement\n        $announce = $this->get_lines();\n        $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);\n        return true;\n    }\n\n    /**\n     * Initiate a TLS (encrypted) session.\n     * @access public\n     * @return boolean\n     */\n    public function startTLS()\n    {\n        if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {\n            return false;\n        }\n\n        //Allow the best TLS version(s) we can\n        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;\n\n        //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT\n        //so add them back in manually if we can\n        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {\n            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;\n            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;\n        }\n\n        // Begin encrypted connection\n        set_error_handler(array($this, 'errorHandler'));\n        $crypto_ok = stream_socket_enable_crypto(\n            $this->smtp_conn,\n            true,\n            $crypto_method\n        );\n        restore_error_handler();\n        return $crypto_ok;\n    }\n\n    /**\n     * Perform SMTP authentication.\n     * Must be run after hello().\n     * @see hello()\n     * @param string $username The user name\n     * @param string $password The password\n     * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5, XOAUTH2)\n     * @param string $realm The auth realm for NTLM\n     * @param string $workstation The auth workstation for NTLM\n     * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth)\n     * @return bool True if successfully authenticated.* @access public\n     */\n    public function authenticate(\n        $username,\n        $password,\n        $authtype = null,\n        $realm = '',\n        $workstation = '',\n        $OAuth = null\n    ) {\n        if (!$this->server_caps) {\n            $this->setError('Authentication is not allowed before HELO/EHLO');\n            return false;\n        }\n\n        if (array_key_exists('EHLO', $this->server_caps)) {\n            // SMTP extensions are available; try to find a proper authentication method\n            if (!array_key_exists('AUTH', $this->server_caps)) {\n                $this->setError('Authentication is not allowed at this stage');\n                // 'at this stage' means that auth may be allowed after the stage changes\n                // e.g. after STARTTLS\n                return false;\n            }\n\n            self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);\n            self::edebug(\n                'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),\n                self::DEBUG_LOWLEVEL\n            );\n\n            if (empty($authtype)) {\n                foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN', 'NTLM', 'XOAUTH2') as $method) {\n                    if (in_array($method, $this->server_caps['AUTH'])) {\n                        $authtype = $method;\n                        break;\n                    }\n                }\n                if (empty($authtype)) {\n                    $this->setError('No supported authentication methods found');\n                    return false;\n                }\n                self::edebug('Auth method selected: ' . $authtype, self::DEBUG_LOWLEVEL);\n            }\n\n            if (!in_array($authtype, $this->server_caps['AUTH'])) {\n                $this->setError(\"The requested authentication method \\\"$authtype\\\" is not supported by the server\");\n                return false;\n            }\n        } elseif (empty($authtype)) {\n            $authtype = 'LOGIN';\n        }\n        switch ($authtype) {\n            case 'PLAIN':\n                // Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {\n                    return false;\n                }\n                // Send encoded username and password\n                if (!$this->sendCommand(\n                    'User & Password',\n                    base64_encode(\"\\0\" . $username . \"\\0\" . $password),\n                    235\n                )\n                ) {\n                    return false;\n                }\n                break;\n            case 'LOGIN':\n                // Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {\n                    return false;\n                }\n                if (!$this->sendCommand(\"Username\", base64_encode($username), 334)) {\n                    return false;\n                }\n                if (!$this->sendCommand(\"Password\", base64_encode($password), 235)) {\n                    return false;\n                }\n                break;\n            case 'XOAUTH2':\n                //If the OAuth Instance is not set. Can be a case when PHPMailer is used\n                //instead of PHPMailerOAuth\n                if (is_null($OAuth)) {\n                    return false;\n                }\n                $oauth = $OAuth->getOauth64();\n\n                // Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {\n                    return false;\n                }\n                break;\n            case 'NTLM':\n                /*\n                 * ntlm_sasl_client.php\n                 * Bundled with Permission\n                 *\n                 * How to telnet in windows:\n                 * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx\n                 * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication\n                 */\n                require_once 'extras/ntlm_sasl_client.php';\n                $temp = new stdClass;\n                $ntlm_client = new ntlm_sasl_client_class;\n                //Check that functions are available\n                if (!$ntlm_client->initialize($temp)) {\n                    $this->setError($temp->error);\n                    $this->edebug(\n                        'You need to enable some modules in your php.ini file: '\n                        . $this->error['error'],\n                        self::DEBUG_CLIENT\n                    );\n                    return false;\n                }\n                //msg1\n                $msg1 = $ntlm_client->typeMsg1($realm, $workstation); //msg1\n\n                if (!$this->sendCommand(\n                    'AUTH NTLM',\n                    'AUTH NTLM ' . base64_encode($msg1),\n                    334\n                )\n                ) {\n                    return false;\n                }\n                //Though 0 based, there is a white space after the 3 digit number\n                //msg2\n                $challenge = substr($this->last_reply, 3);\n                $challenge = base64_decode($challenge);\n                $ntlm_res = $ntlm_client->NTLMResponse(\n                    substr($challenge, 24, 8),\n                    $password\n                );\n                //msg3\n                $msg3 = $ntlm_client->typeMsg3(\n                    $ntlm_res,\n                    $username,\n                    $realm,\n                    $workstation\n                );\n                // send encoded username\n                return $this->sendCommand('Username', base64_encode($msg3), 235);\n            case 'CRAM-MD5':\n                // Start authentication\n                if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {\n                    return false;\n                }\n                // Get the challenge\n                $challenge = base64_decode(substr($this->last_reply, 4));\n\n                // Build the response\n                $response = $username . ' ' . $this->hmac($challenge, $password);\n\n                // send encoded credentials\n                return $this->sendCommand('Username', base64_encode($response), 235);\n            default:\n                $this->setError(\"Authentication method \\\"$authtype\\\" is not supported\");\n                return false;\n        }\n        return true;\n    }\n\n    /**\n     * Calculate an MD5 HMAC hash.\n     * Works like hash_hmac('md5', $data, $key)\n     * in case that function is not available\n     * @param string $data The data to hash\n     * @param string $key The key to hash with\n     * @access protected\n     * @return string\n     */\n    protected function hmac($data, $key)\n    {\n        if (function_exists('hash_hmac')) {\n            return hash_hmac('md5', $data, $key);\n        }\n\n        // The following borrowed from\n        // http://php.net/manual/en/function.mhash.php#27225\n\n        // RFC 2104 HMAC implementation for php.\n        // Creates an md5 HMAC.\n        // Eliminates the need to install mhash to compute a HMAC\n        // by Lance Rushing\n\n        $bytelen = 64; // byte length for md5\n        if (strlen($key) > $bytelen) {\n            $key = pack('H*', md5($key));\n        }\n        $key = str_pad($key, $bytelen, chr(0x00));\n        $ipad = str_pad('', $bytelen, chr(0x36));\n        $opad = str_pad('', $bytelen, chr(0x5c));\n        $k_ipad = $key ^ $ipad;\n        $k_opad = $key ^ $opad;\n\n        return md5($k_opad . pack('H*', md5($k_ipad . $data)));\n    }\n\n    /**\n     * Check connection state.\n     * @access public\n     * @return boolean True if connected.\n     */\n    public function connected()\n    {\n        if (is_resource($this->smtp_conn)) {\n            $sock_status = stream_get_meta_data($this->smtp_conn);\n            if ($sock_status['eof']) {\n                // The socket is valid but we are not connected\n                $this->edebug(\n                    'SMTP NOTICE: EOF caught while checking if connected',\n                    self::DEBUG_CLIENT\n                );\n                $this->close();\n                return false;\n            }\n            return true; // everything looks good\n        }\n        return false;\n    }\n\n    /**\n     * Close the socket and clean up the state of the class.\n     * Don't use this function without first trying to use QUIT.\n     * @see quit()\n     * @access public\n     * @return void\n     */\n    public function close()\n    {\n        $this->setError('');\n        $this->server_caps = null;\n        $this->helo_rply = null;\n        if (is_resource($this->smtp_conn)) {\n            // close the connection and cleanup\n            fclose($this->smtp_conn);\n            $this->smtp_conn = null; //Makes for cleaner serialization\n            $this->edebug('Connection: closed', self::DEBUG_CONNECTION);\n        }\n    }\n\n    /**\n     * Send an SMTP DATA command.\n     * Issues a data command and sends the msg_data to the server,\n     * finializing the mail transaction. $msg_data is the message\n     * that is to be send with the headers. Each header needs to be\n     * on a single line followed by a <CRLF> with the message headers\n     * and the message body being separated by and additional <CRLF>.\n     * Implements rfc 821: DATA <CRLF>\n     * @param string $msg_data Message data to send\n     * @access public\n     * @return boolean\n     */\n    public function data($msg_data)\n    {\n        //This will use the standard timelimit\n        if (!$this->sendCommand('DATA', 'DATA', 354)) {\n            return false;\n        }\n\n        /* The server is ready to accept data!\n         * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)\n         * so we will break the data up into lines by \\r and/or \\n then if needed we will break each of those into\n         * smaller lines to fit within the limit.\n         * We will also look for lines that start with a '.' and prepend an additional '.'.\n         * NOTE: this does not count towards line-length limit.\n         */\n\n        // Normalize line breaks before exploding\n        $lines = explode(\"\\n\", str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $msg_data));\n\n        /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field\n         * of the first line (':' separated) does not contain a space then it _should_ be a header and we will\n         * process all lines before a blank line as headers.\n         */\n\n        $field = substr($lines[0], 0, strpos($lines[0], ':'));\n        $in_headers = false;\n        if (!empty($field) && strpos($field, ' ') === false) {\n            $in_headers = true;\n        }\n\n        foreach ($lines as $line) {\n            $lines_out = array();\n            if ($in_headers and $line == '') {\n                $in_headers = false;\n            }\n            //Break this line up into several smaller lines if it's too long\n            //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),\n            while (isset($line[self::MAX_LINE_LENGTH])) {\n                //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on\n                //so as to avoid breaking in the middle of a word\n                $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');\n                //Deliberately matches both false and 0\n                if (!$pos) {\n                    //No nice break found, add a hard break\n                    $pos = self::MAX_LINE_LENGTH - 1;\n                    $lines_out[] = substr($line, 0, $pos);\n                    $line = substr($line, $pos);\n                } else {\n                    //Break at the found point\n                    $lines_out[] = substr($line, 0, $pos);\n                    //Move along by the amount we dealt with\n                    $line = substr($line, $pos + 1);\n                }\n                //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1\n                if ($in_headers) {\n                    $line = \"\\t\" . $line;\n                }\n            }\n            $lines_out[] = $line;\n\n            //Send the lines to the server\n            foreach ($lines_out as $line_out) {\n                //RFC2821 section 4.5.2\n                if (!empty($line_out) and $line_out[0] == '.') {\n                    $line_out = '.' . $line_out;\n                }\n                $this->client_send($line_out . self::CRLF);\n            }\n        }\n\n        //Message data has been sent, complete the command\n        //Increase timelimit for end of DATA command\n        $savetimelimit = $this->Timelimit;\n        $this->Timelimit = $this->Timelimit * 2;\n        $result = $this->sendCommand('DATA END', '.', 250);\n        $this->recordLastTransactionID();\n        //Restore timelimit\n        $this->Timelimit = $savetimelimit;\n        return $result;\n    }\n\n    /**\n     * Send an SMTP HELO or EHLO command.\n     * Used to identify the sending server to the receiving server.\n     * This makes sure that client and server are in a known state.\n     * Implements RFC 821: HELO <SP> <domain> <CRLF>\n     * and RFC 2821 EHLO.\n     * @param string $host The host name or IP to connect to\n     * @access public\n     * @return boolean\n     */\n    public function hello($host = '')\n    {\n        //Try extended hello first (RFC 2821)\n        return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));\n    }\n\n    /**\n     * Send an SMTP HELO or EHLO command.\n     * Low-level implementation used by hello()\n     * @see hello()\n     * @param string $hello The HELO string\n     * @param string $host The hostname to say we are\n     * @access protected\n     * @return boolean\n     */\n    protected function sendHello($hello, $host)\n    {\n        $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);\n        $this->helo_rply = $this->last_reply;\n        if ($noerror) {\n            $this->parseHelloFields($hello);\n        } else {\n            $this->server_caps = null;\n        }\n        return $noerror;\n    }\n\n    /**\n     * Parse a reply to HELO/EHLO command to discover server extensions.\n     * In case of HELO, the only parameter that can be discovered is a server name.\n     * @access protected\n     * @param string $type - 'HELO' or 'EHLO'\n     */\n    protected function parseHelloFields($type)\n    {\n        $this->server_caps = array();\n        $lines = explode(\"\\n\", $this->helo_rply);\n\n        foreach ($lines as $n => $s) {\n            //First 4 chars contain response code followed by - or space\n            $s = trim(substr($s, 4));\n            if (empty($s)) {\n                continue;\n            }\n            $fields = explode(' ', $s);\n            if (!empty($fields)) {\n                if (!$n) {\n                    $name = $type;\n                    $fields = $fields[0];\n                } else {\n                    $name = array_shift($fields);\n                    switch ($name) {\n                        case 'SIZE':\n                            $fields = ($fields ? $fields[0] : 0);\n                            break;\n                        case 'AUTH':\n                            if (!is_array($fields)) {\n                                $fields = array();\n                            }\n                            break;\n                        default:\n                            $fields = true;\n                    }\n                }\n                $this->server_caps[$name] = $fields;\n            }\n        }\n    }\n\n    /**\n     * Send an SMTP MAIL command.\n     * Starts a mail transaction from the email address specified in\n     * $from. Returns true if successful or false otherwise. If True\n     * the mail transaction is started and then one or more recipient\n     * commands may be called followed by a data command.\n     * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>\n     * @param string $from Source address of this message\n     * @access public\n     * @return boolean\n     */\n    public function mail($from)\n    {\n        $useVerp = ($this->do_verp ? ' XVERP' : '');\n        return $this->sendCommand(\n            'MAIL FROM',\n            'MAIL FROM:<' . $from . '>' . $useVerp,\n            250\n        );\n    }\n\n    /**\n     * Send an SMTP QUIT command.\n     * Closes the socket if there is no error or the $close_on_error argument is true.\n     * Implements from rfc 821: QUIT <CRLF>\n     * @param boolean $close_on_error Should the connection close if an error occurs?\n     * @access public\n     * @return boolean\n     */\n    public function quit($close_on_error = true)\n    {\n        $noerror = $this->sendCommand('QUIT', 'QUIT', 221);\n        $err = $this->error; //Save any error\n        if ($noerror or $close_on_error) {\n            $this->close();\n            $this->error = $err; //Restore any error from the quit command\n        }\n        return $noerror;\n    }\n\n    /**\n     * Send an SMTP RCPT command.\n     * Sets the TO argument to $toaddr.\n     * Returns true if the recipient was accepted false if it was rejected.\n     * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>\n     * @param string $address The address the message is being sent to\n     * @access public\n     * @return boolean\n     */\n    public function recipient($address)\n    {\n        return $this->sendCommand(\n            'RCPT TO',\n            'RCPT TO:<' . $address . '>',\n            array(250, 251)\n        );\n    }\n\n    /**\n     * Send an SMTP RSET command.\n     * Abort any transaction that is currently in progress.\n     * Implements rfc 821: RSET <CRLF>\n     * @access public\n     * @return boolean True on success.\n     */\n    public function reset()\n    {\n        return $this->sendCommand('RSET', 'RSET', 250);\n    }\n\n    /**\n     * Send a command to an SMTP server and check its return code.\n     * @param string $command The command name - not sent to the server\n     * @param string $commandstring The actual command to send\n     * @param integer|array $expect One or more expected integer success codes\n     * @access protected\n     * @return boolean True on success.\n     */\n    protected function sendCommand($command, $commandstring, $expect)\n    {\n        if (!$this->connected()) {\n            $this->setError(\"Called $command without being connected\");\n            return false;\n        }\n        //Reject line breaks in all commands\n        if (strpos($commandstring, \"\\n\") !== false or strpos($commandstring, \"\\r\") !== false) {\n            $this->setError(\"Command '$command' contained line breaks\");\n            return false;\n        }\n        $this->client_send($commandstring . self::CRLF);\n\n        $this->last_reply = $this->get_lines();\n        // Fetch SMTP code and possible error code explanation\n        $matches = array();\n        if (preg_match(\"/^([0-9]{3})[ -](?:([0-9]\\\\.[0-9]\\\\.[0-9]) )?/\", $this->last_reply, $matches)) {\n            $code = $matches[1];\n            $code_ex = (count($matches) > 2 ? $matches[2] : null);\n            // Cut off error code from each response line\n            $detail = preg_replace(\n                \"/{$code}[ -]\" .\n                ($code_ex ? str_replace('.', '\\\\.', $code_ex) . ' ' : '') . \"/m\",\n                '',\n                $this->last_reply\n            );\n        } else {\n            // Fall back to simple parsing if regex fails\n            $code = substr($this->last_reply, 0, 3);\n            $code_ex = null;\n            $detail = substr($this->last_reply, 4);\n        }\n\n        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);\n\n        if (!in_array($code, (array)$expect)) {\n            $this->setError(\n                \"$command command failed\",\n                $detail,\n                $code,\n                $code_ex\n            );\n            $this->edebug(\n                'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,\n                self::DEBUG_CLIENT\n            );\n            return false;\n        }\n\n        $this->setError('');\n        return true;\n    }\n\n    /**\n     * Send an SMTP SAML command.\n     * Starts a mail transaction from the email address specified in $from.\n     * Returns true if successful or false otherwise. If True\n     * the mail transaction is started and then one or more recipient\n     * commands may be called followed by a data command. This command\n     * will send the message to the users terminal if they are logged\n     * in and send them an email.\n     * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>\n     * @param string $from The address the message is from\n     * @access public\n     * @return boolean\n     */\n    public function sendAndMail($from)\n    {\n        return $this->sendCommand('SAML', \"SAML FROM:$from\", 250);\n    }\n\n    /**\n     * Send an SMTP VRFY command.\n     * @param string $name The name to verify\n     * @access public\n     * @return boolean\n     */\n    public function verify($name)\n    {\n        return $this->sendCommand('VRFY', \"VRFY $name\", array(250, 251));\n    }\n\n    /**\n     * Send an SMTP NOOP command.\n     * Used to keep keep-alives alive, doesn't actually do anything\n     * @access public\n     * @return boolean\n     */\n    public function noop()\n    {\n        return $this->sendCommand('NOOP', 'NOOP', 250);\n    }\n\n    /**\n     * Send an SMTP TURN command.\n     * This is an optional command for SMTP that this class does not support.\n     * This method is here to make the RFC821 Definition complete for this class\n     * and _may_ be implemented in future\n     * Implements from rfc 821: TURN <CRLF>\n     * @access public\n     * @return boolean\n     */\n    public function turn()\n    {\n        $this->setError('The SMTP TURN command is not implemented');\n        $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);\n        return false;\n    }\n\n    /**\n     * Send raw data to the server.\n     * @param string $data The data to send\n     * @access public\n     * @return integer|boolean The number of bytes sent to the server or false on error\n     */\n    public function client_send($data)\n    {\n        $this->edebug(\"CLIENT -> SERVER: $data\", self::DEBUG_CLIENT);\n        set_error_handler(array($this, 'errorHandler'));\n        $result = fwrite($this->smtp_conn, $data);\n        restore_error_handler();\n        return $result;\n    }\n\n    /**\n     * Get the latest error.\n     * @access public\n     * @return array\n     */\n    public function getError()\n    {\n        return $this->error;\n    }\n\n    /**\n     * Get SMTP extensions available on the server\n     * @access public\n     * @return array|null\n     */\n    public function getServerExtList()\n    {\n        return $this->server_caps;\n    }\n\n    /**\n     * A multipurpose method\n     * The method works in three ways, dependent on argument value and current state\n     *   1. HELO/EHLO was not sent - returns null and set up $this->error\n     *   2. HELO was sent\n     *     $name = 'HELO': returns server name\n     *     $name = 'EHLO': returns boolean false\n     *     $name = any string: returns null and set up $this->error\n     *   3. EHLO was sent\n     *     $name = 'HELO'|'EHLO': returns server name\n     *     $name = any string: if extension $name exists, returns boolean True\n     *       or its options. Otherwise returns boolean False\n     * In other words, one can use this method to detect 3 conditions:\n     *  - null returned: handshake was not or we don't know about ext (refer to $this->error)\n     *  - false returned: the requested feature exactly not exists\n     *  - positive value returned: the requested feature exists\n     * @param string $name Name of SMTP extension or 'HELO'|'EHLO'\n     * @return mixed\n     */\n    public function getServerExt($name)\n    {\n        if (!$this->server_caps) {\n            $this->setError('No HELO/EHLO was sent');\n            return null;\n        }\n\n        // the tight logic knot ;)\n        if (!array_key_exists($name, $this->server_caps)) {\n            if ($name == 'HELO') {\n                return $this->server_caps['EHLO'];\n            }\n            if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {\n                return false;\n            }\n            $this->setError('HELO handshake was used. Client knows nothing about server extensions');\n            return null;\n        }\n\n        return $this->server_caps[$name];\n    }\n\n    /**\n     * Get the last reply from the server.\n     * @access public\n     * @return string\n     */\n    public function getLastReply()\n    {\n        return $this->last_reply;\n    }\n\n    /**\n     * Read the SMTP server's response.\n     * Either before eof or socket timeout occurs on the operation.\n     * With SMTP we can tell if we have more lines to read if the\n     * 4th character is '-' symbol. If it is a space then we don't\n     * need to read anything else.\n     * @access protected\n     * @return string\n     */\n    protected function get_lines()\n    {\n        // If the connection is bad, give up straight away\n        if (!is_resource($this->smtp_conn)) {\n            return '';\n        }\n        $data = '';\n        $endtime = 0;\n        stream_set_timeout($this->smtp_conn, $this->Timeout);\n        if ($this->Timelimit > 0) {\n            $endtime = time() + $this->Timelimit;\n        }\n        while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {\n            $str = @fgets($this->smtp_conn, 515);\n            $this->edebug(\"SMTP -> get_lines(): \\$data is \\\"$data\\\"\", self::DEBUG_LOWLEVEL);\n            $this->edebug(\"SMTP -> get_lines(): \\$str is  \\\"$str\\\"\", self::DEBUG_LOWLEVEL);\n            $data .= $str;\n            // If response is only 3 chars (not valid, but RFC5321 S4.2 says it must be handled),\n            // or 4th character is a space, we are done reading, break the loop,\n            // string array access is a micro-optimisation over strlen\n            if (!isset($str[3]) or (isset($str[3]) and $str[3] == ' ')) {\n                break;\n            }\n            // Timed-out? Log and break\n            $info = stream_get_meta_data($this->smtp_conn);\n            if ($info['timed_out']) {\n                $this->edebug(\n                    'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n            // Now check if reads took too long\n            if ($endtime and time() > $endtime) {\n                $this->edebug(\n                    'SMTP -> get_lines(): timelimit reached (' .\n                    $this->Timelimit . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n        }\n        return $data;\n    }\n\n    /**\n     * Enable or disable VERP address generation.\n     * @param boolean $enabled\n     */\n    public function setVerp($enabled = false)\n    {\n        $this->do_verp = $enabled;\n    }\n\n    /**\n     * Get VERP address generation mode.\n     * @return boolean\n     */\n    public function getVerp()\n    {\n        return $this->do_verp;\n    }\n\n    /**\n     * Set error messages and codes.\n     * @param string $message The error message\n     * @param string $detail Further detail on the error\n     * @param string $smtp_code An associated SMTP error code\n     * @param string $smtp_code_ex Extended SMTP code\n     */\n    protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')\n    {\n        $this->error = array(\n            'error' => $message,\n            'detail' => $detail,\n            'smtp_code' => $smtp_code,\n            'smtp_code_ex' => $smtp_code_ex\n        );\n    }\n\n    /**\n     * Set debug output method.\n     * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.\n     */\n    public function setDebugOutput($method = 'echo')\n    {\n        $this->Debugoutput = $method;\n    }\n\n    /**\n     * Get debug output method.\n     * @return string\n     */\n    public function getDebugOutput()\n    {\n        return $this->Debugoutput;\n    }\n\n    /**\n     * Set debug output level.\n     * @param integer $level\n     */\n    public function setDebugLevel($level = 0)\n    {\n        $this->do_debug = $level;\n    }\n\n    /**\n     * Get debug output level.\n     * @return integer\n     */\n    public function getDebugLevel()\n    {\n        return $this->do_debug;\n    }\n\n    /**\n     * Set SMTP timeout.\n     * @param integer $timeout\n     */\n    public function setTimeout($timeout = 0)\n    {\n        $this->Timeout = $timeout;\n    }\n\n    /**\n     * Get SMTP timeout.\n     * @return integer\n     */\n    public function getTimeout()\n    {\n        return $this->Timeout;\n    }\n\n    /**\n     * Reports an error number and string.\n     * @param integer $errno The error number returned by PHP.\n     * @param string $errmsg The error message returned by PHP.\n     * @param string $errfile The file the error occurred in\n     * @param integer $errline The line number the error occurred on\n     */\n    protected function errorHandler($errno, $errmsg, $errfile = '', $errline = 0)\n    {\n        $notice = 'Connection failed.';\n        $this->setError(\n            $notice,\n            $errno,\n            $errmsg\n        );\n        $this->edebug(\n            $notice . ' Error #' . $errno . ': ' . $errmsg . \" [$errfile line $errline]\",\n            self::DEBUG_CONNECTION\n        );\n    }\n\n    /**\n     * Extract and return the ID of the last SMTP transaction based on\n     * a list of patterns provided in SMTP::$smtp_transaction_id_patterns.\n     * Relies on the host providing the ID in response to a DATA command.\n     * If no reply has been received yet, it will return null.\n     * If no pattern was matched, it will return false.\n     * @return bool|null|string\n     */\n    protected function recordLastTransactionID()\n    {\n        $reply = $this->getLastReply();\n\n        if (empty($reply)) {\n            $this->last_smtp_transaction_id = null;\n        } else {\n            $this->last_smtp_transaction_id = false;\n            foreach ($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {\n                if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) {\n                    $this->last_smtp_transaction_id = $matches[1];\n                }\n            }\n        }\n\n        return $this->last_smtp_transaction_id;\n    }\n\n    /**\n     * Get the queue/transaction ID of the last SMTP transaction\n     * If no reply has been received yet, it will return null.\n     * If no pattern was matched, it will return false.\n     * @return bool|null|string\n     * @see recordLastTransactionID()\n     */\n    public function getLastTransactionID()\n    {\n        return $this->last_smtp_transaction_id;\n    }\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/extras/EasyPeasyICS.php",
    "content": "<?php\n/**\n * EasyPeasyICS Simple ICS/vCal data generator.\n * @author Marcus Bointon <phpmailer@synchromedia.co.uk>\n * @author Manuel Reinhard <manu@sprain.ch>\n *\n * Built with inspiration from\n * http://stackoverflow.com/questions/1463480/how-can-i-use-php-to-dynamically-publish-an-ical-file-to-be-read-by-google-calend/1464355#1464355\n * History:\n * 2010/12/17 - Manuel Reinhard - when it all started\n * 2014 PHPMailer project becomes maintainer\n */\n\n/**\n * Class EasyPeasyICS.\n * Simple ICS data generator\n * @package phpmailer\n * @subpackage easypeasyics\n */\nclass EasyPeasyICS\n{\n    /**\n     * The name of the calendar\n     * @var string\n     */\n    protected $calendarName;\n    /**\n     * The array of events to add to this calendar\n     * @var array\n     */\n    protected $events = array();\n\n    /**\n     * Constructor\n     * @param string $calendarName\n     */\n    public function __construct($calendarName = \"\")\n    {\n        $this->calendarName = $calendarName;\n    }\n\n    /**\n     * Add an event to this calendar.\n     * @param string $start The start date and time as a unix timestamp\n     * @param string $end The end date and time as a unix timestamp\n     * @param string $summary A summary or title for the event\n     * @param string $description A description of the event\n     * @param string $url A URL for the event\n     * @param string $uid A unique identifier for the event - generated automatically if not provided\n     * @return array An array of event details, including any generated UID\n     */\n    public function addEvent($start, $end, $summary = '', $description = '', $url = '', $uid = '')\n    {\n        if (empty($uid)) {\n            $uid = md5(uniqid(mt_rand(), true)) . '@EasyPeasyICS';\n        }\n        $event = array(\n            'start' => gmdate('Ymd', $start) . 'T' . gmdate('His', $start) . 'Z',\n            'end' => gmdate('Ymd', $end) . 'T' . gmdate('His', $end) . 'Z',\n            'summary' => $summary,\n            'description' => $description,\n            'url' => $url,\n            'uid' => $uid\n        );\n        $this->events[] = $event;\n        return $event;\n    }\n\n    /**\n     * @return array Get the array of events.\n     */\n    public function getEvents()\n    {\n        return $this->events;\n    }\n\n    /**\n     * Clear all events.\n     */\n    public function clearEvents()\n    {\n        $this->events = array();\n    }\n\n    /**\n     * Get the name of the calendar.\n     * @return string\n     */\n    public function getName()\n    {\n        return $this->calendarName;\n    }\n\n    /**\n     * Set the name of the calendar.\n     * @param $name\n     */\n    public function setName($name)\n    {\n        $this->calendarName = $name;\n    }\n\n    /**\n     * Render and optionally output a vcal string.\n     * @param bool $output Whether to output the calendar data directly (the default).\n     * @return string The complete rendered vlal\n     */\n    public function render($output = true)\n    {\n        //Add header\n        $ics = 'BEGIN:VCALENDAR\nMETHOD:PUBLISH\nVERSION:2.0\nX-WR-CALNAME:' . $this->calendarName . '\nPRODID:-//hacksw/handcal//NONSGML v1.0//EN';\n\n        //Add events\n        foreach ($this->events as $event) {\n            $ics .= '\nBEGIN:VEVENT\nUID:' . $event['uid'] . '\nDTSTAMP:' . gmdate('Ymd') . 'T' . gmdate('His') . 'Z\nDTSTART:' . $event['start'] . '\nDTEND:' . $event['end'] . '\nSUMMARY:' . str_replace(\"\\n\", \"\\\\n\", $event['summary']) . '\nDESCRIPTION:' . str_replace(\"\\n\", \"\\\\n\", $event['description']) . '\nURL;VALUE=URI:' . $event['url'] . '\nEND:VEVENT';\n        }\n\n        //Add footer\n        $ics .= '\nEND:VCALENDAR';\n\n        if ($output) {\n            //Output\n            $filename = $this->calendarName;\n            //Filename needs quoting if it contains spaces\n            if (strpos($filename, ' ') !== false) {\n                $filename = '\"'.$filename.'\"';\n            }\n            header('Content-type: text/calendar; charset=utf-8');\n            header('Content-Disposition: inline; filename=' . $filename . '.ics');\n            echo $ics;\n        }\n        return $ics;\n    }\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/extras/README.md",
    "content": "# PHPMailer Extras\n\nThese classes provide optional additional functions to PHPMailer.\n\nThese are not loaded by the PHPMailer autoloader, so in some cases you may need to `require` them yourself before using them.\n\n## EasyPeasyICS\n\nThis class was originally written by Manuel Reinhard and provides a simple means of generating ICS/vCal files that are used in sending calendar events. PHPMailer does not use it directly, but you can use it to generate content appropriate for placing in the `Ical` property of PHPMailer. The PHPMailer project is now its official home as Manuel has given permission for that and is no longer maintaining it himself.\n\n## htmlfilter\n\nThis class by Konstantin Riabitsev and Jim Jagielski implements HTML filtering to remove potentially malicious tags, such as `<script>` or `onclick=` attributes that can result in XSS attacks. This is a simple filter and is not as comprehensive as [HTMLawed](http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/) or [HTMLPurifier](http://htmlpurifier.org), but it's easier to use and considerably better than nothing! PHPMailer does not use it directly, but you may want to apply it to user-supplied HTML before using it as a message body.\n\n## NTLM_SASL_client\n\nThis class by Manuel Lemos (bundled with permission) adds the ability to authenticate with Microsoft Windows mail servers that use NTLM-based authentication. It is used by PHPMailer if you send via SMTP and set the `AuthType` property to `NTLM`; you will also need to use the `Realm` and `Workstation` properties. The original source is [here](http://www.phpclasses.org/browse/file/7495.html).\n"
  },
  {
    "path": "frphp/extend/PHPMailer/extras/htmlfilter.php",
    "content": "<?php\n/**\n * htmlfilter.inc\n * ---------------\n * This set of functions allows you to filter html in order to remove\n * any malicious tags from it. Useful in cases when you need to filter\n * user input for any cross-site-scripting attempts.\n *\n * Copyright (C) 2002-2004 by Duke University\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\t See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301  USA\n *\n * @Author\tKonstantin Riabitsev <icon@linux.duke.edu>\n * @Author  Jim Jagielski <jim@jaguNET.com / jimjag@gmail.com>\n * @Version 1.1 ($Date$)\n */\n\n/**\n * This function returns the final tag out of the tag name, an array\n * of attributes, and the type of the tag. This function is called by\n * tln_sanitize internally.\n *\n * @param string $tagname the name of the tag.\n * @param array $attary the array of attributes and their values\n * @param integer $tagtype The type of the tag (see in comments).\n * @return string A string with the final tag representation.\n */\nfunction tln_tagprint($tagname, $attary, $tagtype)\n{\n    if ($tagtype == 2) {\n        $fulltag = '</' . $tagname . '>';\n    } else {\n        $fulltag = '<' . $tagname;\n        if (is_array($attary) && sizeof($attary)) {\n            $atts = array();\n            foreach($attary as $attname => $attvalue) {\n                array_push($atts, \"$attname=$attvalue\");\n            }\n            $fulltag .= ' ' . join(' ', $atts);\n        }\n        if ($tagtype == 3) {\n            $fulltag .= ' /';\n        }\n        $fulltag .= '>';\n    }\n    return $fulltag;\n}\n\n/**\n * A small helper function to use with array_walk. Modifies a by-ref\n * value and makes it lowercase.\n *\n * @param string $val a value passed by-ref.\n * @return\t\tvoid since it modifies a by-ref value.\n */\nfunction tln_casenormalize(&$val)\n{\n    $val = strtolower($val);\n}\n\n/**\n * This function skips any whitespace from the current position within\n * a string and to the next non-whitespace value.\n *\n * @param string $body the string\n * @param integer $offset the offset within the string where we should start\n *\t\t\t\t   looking for the next non-whitespace character.\n * @return integer          the location within the $body where the next\n *\t\t\t\t   non-whitespace char is located.\n */\nfunction tln_skipspace($body, $offset)\n{\n    preg_match('/^(\\s*)/s', substr($body, $offset), $matches);\n    if (sizeof($matches[1])) {\n        $count = strlen($matches[1]);\n        $offset += $count;\n    }\n    return $offset;\n}\n\n/**\n * This function looks for the next character within a string.\tIt's\n * really just a glorified \"strpos\", except it catches the failures\n * nicely.\n *\n * @param string $body   The string to look for needle in.\n * @param integer $offset Start looking from this position.\n * @param string $needle The character/string to look for.\n * @return integer           location of the next occurrence of the needle, or\n *\t\t\t\t   strlen($body) if needle wasn't found.\n */\nfunction tln_findnxstr($body, $offset, $needle)\n{\n    $pos = strpos($body, $needle, $offset);\n    if ($pos === false) {\n        $pos = strlen($body);\n    }\n    return $pos;\n}\n\n/**\n * This function takes a PCRE-style regexp and tries to match it\n * within the string.\n *\n * @param string $body   The string to look for needle in.\n * @param integer $offset Start looking from here.\n * @param string $reg       A PCRE-style regex to match.\n * @return array|boolean  Returns a false if no matches found, or an array\n *\t\t\t\t   with the following members:\n *\t\t\t\t   - integer with the location of the match within $body\n *\t\t\t\t   - string with whatever content between offset and the match\n *\t\t\t\t   - string with whatever it is we matched\n */\nfunction tln_findnxreg($body, $offset, $reg)\n{\n    $matches = array();\n    $retarr = array();\n    $preg_rule = '%^(.*?)(' . $reg . ')%s';\n    preg_match($preg_rule, substr($body, $offset), $matches);\n    if (!isset($matches[0]) || !$matches[0]) {\n        $retarr = false;\n    } else {\n        $retarr[0] = $offset + strlen($matches[1]);\n        $retarr[1] = $matches[1];\n        $retarr[2] = $matches[2];\n    }\n    return $retarr;\n}\n\n/**\n * This function looks for the next tag.\n *\n * @param string $body   String where to look for the next tag.\n * @param integer $offset Start looking from here.\n * @return array|boolean false if no more tags exist in the body, or\n *\t\t\t\t   an array with the following members:\n *\t\t\t\t   - string with the name of the tag\n *\t\t\t\t   - array with attributes and their values\n *\t\t\t\t   - integer with tag type (1, 2, or 3)\n *\t\t\t\t   - integer where the tag starts (starting \"<\")\n *\t\t\t\t   - integer where the tag ends (ending \">\")\n *\t\t\t\t   first three members will be false, if the tag is invalid.\n */\nfunction tln_getnxtag($body, $offset)\n{\n    if ($offset > strlen($body)) {\n        return false;\n    }\n    $lt = tln_findnxstr($body, $offset, '<');\n    if ($lt == strlen($body)) {\n        return false;\n    }\n    /**\n     * We are here:\n     * blah blah <tag attribute=\"value\">\n     * \\---------^\n     */\n    $pos = tln_skipspace($body, $lt + 1);\n    if ($pos >= strlen($body)) {\n        return array(false, false, false, $lt, strlen($body));\n    }\n    /**\n     * There are 3 kinds of tags:\n     * 1. Opening tag, e.g.:\n     *\t  <a href=\"blah\">\n     * 2. Closing tag, e.g.:\n     *\t  </a>\n     * 3. XHTML-style content-less tag, e.g.:\n     *\t  <img src=\"blah\"/>\n     */\n    switch (substr($body, $pos, 1)) {\n    case '/':\n        $tagtype = 2;\n        $pos++;\n        break;\n    case '!':\n        /**\n         * A comment or an SGML declaration.\n         */\n            if (substr($body, $pos + 1, 2) == '--') {\n            $gt = strpos($body, '-->', $pos);\n            if ($gt === false) {\n                $gt = strlen($body);\n            } else {\n                $gt += 2;\n            }\n            return array(false, false, false, $lt, $gt);\n        } else {\n            $gt = tln_findnxstr($body, $pos, '>');\n            return array(false, false, false, $lt, $gt);\n        }\n        break;\n    default:\n        /**\n         * Assume tagtype 1 for now. If it's type 3, we'll switch values\n         * later.\n         */\n        $tagtype = 1;\n        break;\n    }\n\n    /**\n     * Look for next [\\W-_], which will indicate the end of the tag name.\n     */\n    $regary = tln_findnxreg($body, $pos, '[^\\w\\-_]');\n    if ($regary == false) {\n        return array(false, false, false, $lt, strlen($body));\n    }\n    list($pos, $tagname, $match) = $regary;\n    $tagname = strtolower($tagname);\n\n    /**\n     * $match can be either of these:\n     * '>'\tindicating the end of the tag entirely.\n     * '\\s' indicating the end of the tag name.\n     * '/'\tindicating that this is type-3 xhtml tag.\n     *\n     * Whatever else we find there indicates an invalid tag.\n     */\n    switch ($match) {\n    case '/':\n        /**\n         * This is an xhtml-style tag with a closing / at the\n         * end, like so: <img src=\"blah\"/>. Check if it's followed\n         * by the closing bracket. If not, then this tag is invalid\n         */\n        if (substr($body, $pos, 2) == '/>') {\n            $pos++;\n            $tagtype = 3;\n        } else {\n            $gt = tln_findnxstr($body, $pos, '>');\n            $retary = array(false, false, false, $lt, $gt);\n            return $retary;\n        }\n            //intentional fall-through\n    case '>':\n        return array($tagname, false, $tagtype, $lt, $pos);\n        break;\n    default:\n        /**\n         * Check if it's whitespace\n         */\n        if (!preg_match('/\\s/', $match)) {\n            /**\n             * This is an invalid tag! Look for the next closing \">\".\n             */\n            $gt = tln_findnxstr($body, $lt, '>');\n            return array(false, false, false, $lt, $gt);\n        }\n        break;\n    }\n\n    /**\n     * At this point we're here:\n     * <tagname\t attribute='blah'>\n     * \\-------^\n     *\n     * At this point we loop in order to find all attributes.\n     */\n    $attary = array();\n\n    while ($pos <= strlen($body)) {\n        $pos = tln_skipspace($body, $pos);\n        if ($pos == strlen($body)) {\n            /**\n             * Non-closed tag.\n             */\n            return array(false, false, false, $lt, $pos);\n        }\n        /**\n         * See if we arrived at a \">\" or \"/>\", which means that we reached\n         * the end of the tag.\n         */\n        $matches = array();\n        if (preg_match('%^(\\s*)(>|/>)%s', substr($body, $pos), $matches)) {\n            /**\n             * Yep. So we did.\n             */\n            $pos += strlen($matches[1]);\n            if ($matches[2] == '/>') {\n                $tagtype = 3;\n                $pos++;\n            }\n            return array($tagname, $attary, $tagtype, $lt, $pos);\n        }\n\n        /**\n         * There are several types of attributes, with optional\n         * [:space:] between members.\n         * Type 1:\n         *\t attrname[:space:]=[:space:]'CDATA'\n         * Type 2:\n         *\t attrname[:space:]=[:space:]\"CDATA\"\n         * Type 3:\n         *\t attr[:space:]=[:space:]CDATA\n         * Type 4:\n         *\t attrname\n         *\n         * We leave types 1 and 2 the same, type 3 we check for\n         * '\"' and convert to \"&quot\" if needed, then wrap in\n         * double quotes. Type 4 we convert into:\n         * attrname=\"yes\".\n         */\n        $regary = tln_findnxreg($body, $pos, '[^\\w\\-_]');\n        if ($regary == false) {\n            /**\n             * Looks like body ended before the end of tag.\n             */\n            return array(false, false, false, $lt, strlen($body));\n        }\n        list($pos, $attname, $match) = $regary;\n        $attname = strtolower($attname);\n        /**\n         * We arrived at the end of attribute name. Several things possible\n         * here:\n         * '>'\tmeans the end of the tag and this is attribute type 4\n         * '/'\tif followed by '>' means the same thing as above\n         * '\\s' means a lot of things -- look what it's followed by.\n         *\t\tanything else means the attribute is invalid.\n         */\n        switch ($match) {\n        case '/':\n            /**\n             * This is an xhtml-style tag with a closing / at the\n             * end, like so: <img src=\"blah\"/>. Check if it's followed\n             * by the closing bracket. If not, then this tag is invalid\n             */\n            if (substr($body, $pos, 2) == '/>') {\n                $pos++;\n                $tagtype = 3;\n            } else {\n                $gt = tln_findnxstr($body, $pos, '>');\n                $retary = array(false, false, false, $lt, $gt);\n                return $retary;\n            }\n                //intentional fall-through\n        case '>':\n            $attary{$attname} = '\"yes\"';\n            return array($tagname, $attary, $tagtype, $lt, $pos);\n            break;\n        default:\n            /**\n             * Skip whitespace and see what we arrive at.\n             */\n            $pos = tln_skipspace($body, $pos);\n            $char = substr($body, $pos, 1);\n            /**\n             * Two things are valid here:\n             * '=' means this is attribute type 1 2 or 3.\n             * \\w means this was attribute type 4.\n             * anything else we ignore and re-loop. End of tag and\n             * invalid stuff will be caught by our checks at the beginning\n             * of the loop.\n             */\n            if ($char == '=') {\n                $pos++;\n                $pos = tln_skipspace($body, $pos);\n                /**\n                 * Here are 3 possibilities:\n                 * \"'\"\tattribute type 1\n                 * '\"'\tattribute type 2\n                 * everything else is the content of tag type 3\n                 */\n                $quot = substr($body, $pos, 1);\n                if ($quot == '\\'') {\n                        $regary = tln_findnxreg($body, $pos + 1, '\\'');\n                    if ($regary == false) {\n                        return array(false, false, false, $lt, strlen($body));\n                    }\n                    list($pos, $attval, $match) = $regary;\n                    $pos++;\n                    $attary{$attname} = '\\'' . $attval . '\\'';\n                } elseif ($quot == '\"') {\n                    $regary = tln_findnxreg($body, $pos + 1, '\\\"');\n                    if ($regary == false) {\n                        return array(false, false, false, $lt, strlen($body));\n                    }\n                    list($pos, $attval, $match) = $regary;\n                    $pos++;\n                            $attary{$attname} = '\"' . $attval . '\"';\n                } else {\n                    /**\n                     * These are hateful. Look for \\s, or >.\n                     */\n                    $regary = tln_findnxreg($body, $pos, '[\\s>]');\n                    if ($regary == false) {\n                        return array(false, false, false, $lt, strlen($body));\n                    }\n                    list($pos, $attval, $match) = $regary;\n                    /**\n                     * If it's \">\" it will be caught at the top.\n                     */\n                    $attval = preg_replace('/\\\"/s', '&quot;', $attval);\n                    $attary{$attname} = '\"' . $attval . '\"';\n                }\n            } elseif (preg_match('|[\\w/>]|', $char)) {\n                /**\n                 * That was attribute type 4.\n                 */\n                $attary{$attname} = '\"yes\"';\n            } else {\n                /**\n                 * An illegal character. Find next '>' and return.\n                 */\n                $gt = tln_findnxstr($body, $pos, '>');\n                return array(false, false, false, $lt, $gt);\n            }\n            break;\n        }\n    }\n    /**\n     * The fact that we got here indicates that the tag end was never\n     * found. Return invalid tag indication so it gets stripped.\n     */\n    return array(false, false, false, $lt, strlen($body));\n}\n\n/**\n * Translates entities into literal values so they can be checked.\n *\n * @param string $attvalue the by-ref value to check.\n * @param string $regex    the regular expression to check against.\n * @param boolean $hex        whether the entities are hexadecimal.\n * @return boolean            True or False depending on whether there were matches.\n */\nfunction tln_deent(&$attvalue, $regex, $hex = false)\n{\n    preg_match_all($regex, $attvalue, $matches);\n    if (is_array($matches) && sizeof($matches[0]) > 0) {\n        $repl = array();\n        for ($i = 0; $i < sizeof($matches[0]); $i++) {\n            $numval = $matches[1][$i];\n            if ($hex) {\n                $numval = hexdec($numval);\n            }\n            $repl{$matches[0][$i]} = chr($numval);\n        }\n        $attvalue = strtr($attvalue, $repl);\n        return true;\n    } else {\n        return false;\n    }\n}\n\n/**\n * This function checks attribute values for entity-encoded values\n * and returns them translated into 8-bit strings so we can run\n * checks on them.\n *\n * @param string $attvalue A string to run entity check against.\n */\nfunction tln_defang(&$attvalue)\n{\n    /**\n     * Skip this if there aren't ampersands or backslashes.\n     */\n    if (strpos($attvalue, '&') === false\n        && strpos($attvalue, '\\\\') === false\n    ) {\n        return;\n    }\n    do {\n        $m = false;\n        $m = $m || tln_deent($attvalue, '/\\&#0*(\\d+);*/s');\n        $m = $m || tln_deent($attvalue, '/\\&#x0*((\\d|[a-f])+);*/si', true);\n        $m = $m || tln_deent($attvalue, '/\\\\\\\\(\\d+)/s', true);\n    } while ($m == true);\n    $attvalue = stripslashes($attvalue);\n}\n\n/**\n * Kill any tabs, newlines, or carriage returns. Our friends the\n * makers of the browser with 95% market value decided that it'd\n * be funny to make \"java[tab]script\" be just as good as \"javascript\".\n *\n * @param string $attvalue     The attribute value before extraneous spaces removed.\n */\nfunction tln_unspace(&$attvalue)\n{\n    if (strcspn($attvalue, \"\\t\\r\\n\\0 \") != strlen($attvalue)) {\n        $attvalue = str_replace(\n            array(\"\\t\", \"\\r\", \"\\n\", \"\\0\", \" \"),\n            array('', '', '', '', ''),\n            $attvalue\n        );\n    }\n}\n\n/**\n * This function runs various checks against the attributes.\n *\n * @param string $tagname            String with the name of the tag.\n * @param array $attary            Array with all tag attributes.\n * @param array $rm_attnames        See description for tln_sanitize\n * @param array $bad_attvals        See description for tln_sanitize\n * @param array $add_attr_to_tag See description for tln_sanitize\n * @param string $trans_image_path\n * @param boolean $block_external_images\n * @return array with modified attributes.\n */\nfunction tln_fixatts(\n    $tagname,\n    $attary,\n    $rm_attnames,\n    $bad_attvals,\n    $add_attr_to_tag,\n    $trans_image_path,\n    $block_external_images\n) {\n    foreach($attary as $attname => $attvalue) {\n        /**\n         * See if this attribute should be removed.\n         */\n        foreach ($rm_attnames as $matchtag => $matchattrs) {\n            if (preg_match($matchtag, $tagname)) {\n                foreach ($matchattrs as $matchattr) {\n                    if (preg_match($matchattr, $attname)) {\n                        unset($attary{$attname});\n                        continue;\n                    }\n                }\n            }\n        }\n        /**\n         * Remove any backslashes, entities, or extraneous whitespace.\n         */\n        $oldattvalue = $attvalue;\n        tln_defang($attvalue);\n        if ($attname == 'style' && $attvalue !== $oldattvalue) {\n            $attvalue = \"idiocy\";\n            $attary{$attname} = $attvalue;\n        }\n        tln_unspace($attvalue);\n\n        /**\n         * Now let's run checks on the attvalues.\n         * I don't expect anyone to comprehend this. If you do,\n         * get in touch with me so I can drive to where you live and\n         * shake your hand personally. :)\n         */\n        foreach ($bad_attvals as $matchtag => $matchattrs) {\n            if (preg_match($matchtag, $tagname)) {\n                foreach ($matchattrs as $matchattr => $valary) {\n                    if (preg_match($matchattr, $attname)) {\n                        /**\n                         * There are two arrays in valary.\n                         * First is matches.\n                         * Second one is replacements\n                         */\n                        list($valmatch, $valrepl) = $valary;\n                        $newvalue = preg_replace($valmatch, $valrepl, $attvalue);\n                        if ($newvalue != $attvalue) {\n                            $attary{$attname} = $newvalue;\n                            $attvalue = $newvalue;\n                        }\n                    }\n                }\n            }\n        }\n        if ($attname == 'style') {\n            if (preg_match('/[\\0-\\37\\200-\\377]+/', $attvalue)) {\n                $attary{$attname} = '\"disallowed character\"';\n            }\n            preg_match_all(\"/url\\s*\\((.+)\\)/si\", $attvalue, $aMatch);\n            if (count($aMatch)) {\n                foreach($aMatch[1] as $sMatch) {\n                    $urlvalue = $sMatch;\n                    tln_fixurl($attname, $urlvalue, $trans_image_path, $block_external_images);\n                    $attary{$attname} = str_replace($sMatch, $urlvalue, $attvalue);\n                }\n            }\n        }\n     }\n    /**\n     * See if we need to append any attributes to this tag.\n     */\n    foreach ($add_attr_to_tag as $matchtag => $addattary) {\n        if (preg_match($matchtag, $tagname)) {\n            $attary = array_merge($attary, $addattary);\n        }\n    }\n    return $attary;\n}\n\nfunction tln_fixurl($attname, &$attvalue, $trans_image_path, $block_external_images)\n{\n    $sQuote = '\"';\n    $attvalue = trim($attvalue);\n    if ($attvalue && ($attvalue[0] =='\"'|| $attvalue[0] == \"'\")) {\n        // remove the double quotes\n        $sQuote = $attvalue[0];\n        $attvalue = trim(substr($attvalue,1,-1));\n    }\n\n    /**\n     * Replace empty src tags with the blank image.  src is only used\n     * for frames, images, and image inputs.  Doing a replace should\n     * not affect them working as should be, however it will stop\n     * IE from being kicked off when src for img tags are not set\n     */\n    if ($attvalue == '') {\n        $attvalue = $sQuote . $trans_image_path . $sQuote;\n    } else {\n        // first, disallow 8 bit characters and control characters\n        if (preg_match('/[\\0-\\37\\200-\\377]+/',$attvalue)) {\n            switch ($attname) {\n                case 'href':\n                    $attvalue = $sQuote . 'http://invalid-stuff-detected.example.com' . $sQuote;\n                    break;\n                default:\n                    $attvalue = $sQuote . $trans_image_path . $sQuote;\n                    break;\n            }\n        } else {\n            $aUrl = parse_url($attvalue);\n            if (isset($aUrl['scheme'])) {\n                switch(strtolower($aUrl['scheme'])) {\n                    case 'mailto':\n                    case 'http':\n                    case 'https':\n                    case 'ftp':\n                        if ($attname != 'href') {\n                            if ($block_external_images == true) {\n                                $attvalue = $sQuote . $trans_image_path . $sQuote;\n                            } else {\n                                if (!isset($aUrl['path'])) {\n                                    $attvalue = $sQuote . $trans_image_path . $sQuote;\n                                }\n                            }\n                        } else {\n                            $attvalue = $sQuote . $attvalue . $sQuote;\n                        }\n                        break;\n                    case 'outbind':\n                        $attvalue = $sQuote . $attvalue . $sQuote;\n                        break;\n                    case 'cid':\n                        $attvalue = $sQuote . $attvalue . $sQuote;\n                        break;\n                    default:\n                        $attvalue = $sQuote . $trans_image_path . $sQuote;\n                        break;\n                }\n            } else {\n                if (!isset($aUrl['path']) || $aUrl['path'] != $trans_image_path) {\n                    $$attvalue = $sQuote . $trans_image_path . $sQuote;\n                }\n            }\n        }\n    }\n}\n\nfunction tln_fixstyle($body, $pos, $trans_image_path, $block_external_images)\n{\n    // workaround for </style> in between comments\n    $content = '';\n    $sToken = '';\n    $bSucces = false;\n    $bEndTag = false;\n    for ($i=$pos,$iCount=strlen($body);$i<$iCount;++$i) {\n        $char = $body{$i};\n        switch ($char) {\n            case '<':\n                $sToken = $char;\n                break;\n            case '/':\n                 if ($sToken == '<') {\n                    $sToken .= $char;\n                    $bEndTag = true;\n                 } else {\n                    $content .= $char;\n                 }\n                 break;\n            case '>':\n                 if ($bEndTag) {\n                    $sToken .= $char;\n                    if (preg_match('/\\<\\/\\s*style\\s*\\>/i',$sToken,$aMatch)) {\n                        $newpos = $i + 1;\n                        $bSucces = true;\n                        break 2;\n                    } else {\n                        $content .= $sToken;\n                    }\n                    $bEndTag = false;\n                 } else {\n                    $content .= $char;\n                 }\n                 break;\n            case '!':\n                if ($sToken == '<') {\n                    // possible comment\n                    if (isset($body{$i+2}) && substr($body,$i,3) == '!--') {\n                        $i = strpos($body,'-->',$i+3);\n                        if ($i === false) { // no end comment\n                            $i = strlen($body);\n                        }\n                        $sToken = '';\n                    }\n                } else {\n                    $content .= $char;\n                }\n                break;\n            default:\n                if ($bEndTag) {\n                    $sToken .= $char;\n                } else {\n                    $content .= $char;\n                }\n                break;\n        }\n    }\n    if ($bSucces == FALSE){\n        return array(FALSE, strlen($body));\n    }\n\n\n\n    /**\n     * First look for general BODY style declaration, which would be\n     * like so:\n     * body {background: blah-blah}\n     * and change it to .bodyclass so we can just assign it to a <div>\n     */\n    $content = preg_replace(\"|body(\\s*\\{.*?\\})|si\", \".bodyclass\\\\1\", $content);\n\n    /**\n    * Fix url('blah') declarations.\n    */\n    //   $content = preg_replace(\"|url\\s*\\(\\s*([\\'\\\"])\\s*\\S+script\\s*:.*?([\\'\\\"])\\s*\\)|si\",\n    //                           \"url(\\\\1$trans_image_path\\\\2)\", $content);\n\n    // first check for 8bit sequences and disallowed control characters\n    if (preg_match('/[\\16-\\37\\200-\\377]+/',$content)) {\n        $content = '<!-- style block removed by html filter due to presence of 8bit characters -->';\n        return array($content, $newpos);\n    }\n\n    // remove @import line\n    $content = preg_replace(\"/^\\s*(@import.*)$/mi\",\"\\n<!-- @import rules forbidden -->\\n\",$content);\n\n    $content = preg_replace(\"/(\\\\\\\\)?u(\\\\\\\\)?r(\\\\\\\\)?l(\\\\\\\\)?/i\", 'url', $content);\n    preg_match_all(\"/url\\s*\\((.+)\\)/si\",$content,$aMatch);\n    if (count($aMatch)) {\n        $aValue = $aReplace = array();\n        foreach($aMatch[1] as $sMatch) {\n            // url value\n            $urlvalue = $sMatch;\n            tln_fixurl('style',$urlvalue, $trans_image_path, $block_external_images);\n            $aValue[] = $sMatch;\n            $aReplace[] = $urlvalue;\n        }\n        $content = str_replace($aValue,$aReplace,$content);\n    }\n\n    /**\n     * Remove any backslashes, entities, and extraneous whitespace.\n     */\n    $contentTemp = $content;\n    tln_defang($contentTemp);\n    tln_unspace($contentTemp);\n\n    $match   = array('/\\/\\*.*\\*\\//',\n                    '/expression/i',\n                    '/behaviou*r/i',\n                    '/binding/i',\n                    '/include-source/i',\n                    '/javascript/i',\n                    '/script/i',\n                    '/position/i');\n    $replace = array('','idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', '');\n    $contentNew = preg_replace($match, $replace, $contentTemp);\n    if ($contentNew !== $contentTemp) {\n        $content = $contentNew;\n    }\n    return array($content, $newpos);\n}\n\nfunction tln_body2div($attary, $trans_image_path)\n{\n    $divattary = array('class' => \"'bodyclass'\");\n    $text = '#000000';\n    $has_bgc_stl = $has_txt_stl = false;\n    $styledef = '';\n    if (is_array($attary) && sizeof($attary) > 0){\n        foreach ($attary as $attname=>$attvalue){\n            $quotchar = substr($attvalue, 0, 1);\n            $attvalue = str_replace($quotchar, \"\", $attvalue);\n            switch ($attname){\n                case 'background':\n                    $styledef .= \"background-image: url('$trans_image_path'); \";\n                    break;\n                case 'bgcolor':\n                    $has_bgc_stl = true;\n                    $styledef .= \"background-color: $attvalue; \";\n                    break;\n                case 'text':\n                    $has_txt_stl = true;\n                    $styledef .= \"color: $attvalue; \";\n                    break;\n            }\n        }\n        // Outlook defines a white bgcolor and no text color. This can lead to\n        // white text on a white bg with certain themes.\n        if ($has_bgc_stl && !$has_txt_stl) {\n            $styledef .= \"color: $text; \";\n        }\n        if (strlen($styledef) > 0){\n            $divattary{\"style\"} = \"\\\"$styledef\\\"\";\n        }\n    }\n    return $divattary;\n}\n\n/**\n *\n * @param string $body                    The HTML you wish to filter\n * @param array $tag_list                see description above\n * @param array $rm_tags_with_content see description above\n * @param array $self_closing_tags    see description above\n * @param boolean $force_tag_closing    see description above\n * @param array $rm_attnames            see description above\n * @param array $bad_attvals            see description above\n * @param array $add_attr_to_tag        see description above\n * @param string $trans_image_path\n * @param boolean $block_external_images\n\n * @return string                       Sanitized html safe to show on your pages.\n */\nfunction tln_sanitize(\n    $body,\n    $tag_list,\n    $rm_tags_with_content,\n    $self_closing_tags,\n    $force_tag_closing,\n    $rm_attnames,\n    $bad_attvals,\n    $add_attr_to_tag,\n    $trans_image_path,\n    $block_external_images\n) {\n    /**\n     * Normalize rm_tags and rm_tags_with_content.\n     */\n    $rm_tags = array_shift($tag_list);\n    @array_walk($tag_list, 'tln_casenormalize');\n    @array_walk($rm_tags_with_content, 'tln_casenormalize');\n    @array_walk($self_closing_tags, 'tln_casenormalize');\n    /**\n     * See if tag_list is of tags to remove or tags to allow.\n     * false  means remove these tags\n     * true\t  means allow these tags\n     */\n    $curpos = 0;\n    $open_tags = array();\n    $trusted = \"<!-- begin tln_sanitized html -->\\n\";\n    $skip_content = false;\n    /**\n     * Take care of netscape's stupid javascript entities like\n     * &{alert('boo')};\n     */\n    $body = preg_replace('/&(\\{.*?\\};)/si', '&amp;\\\\1', $body);\n    while (($curtag = tln_getnxtag($body, $curpos)) != false) {\n        list($tagname, $attary, $tagtype, $lt, $gt) = $curtag;\n        $free_content = substr($body, $curpos, $lt-$curpos);\n        /**\n         * Take care of <style>\n         */\n        if ($tagname == \"style\" && $tagtype == 1){\n            list($free_content, $curpos) =\n                tln_fixstyle($body, $gt+1, $trans_image_path, $block_external_images);\n            if ($free_content != FALSE){\n                if ( !empty($attary) ) {\n                    $attary = tln_fixatts($tagname,\n                                         $attary,\n                                         $rm_attnames,\n                                         $bad_attvals,\n                                         $add_attr_to_tag,\n                                         $trans_image_path,\n                                         $block_external_images\n                                         );\n                }\n                $trusted .= tln_tagprint($tagname, $attary, $tagtype);\n                $trusted .= $free_content;\n                $trusted .= tln_tagprint($tagname, null, 2);\n            }\n            continue;\n        }\n        if ($skip_content == false){\n            $trusted .= $free_content;\n        }\n        if ($tagname != false) {\n            if ($tagtype == 2) {\n                if ($skip_content == $tagname) {\n                    /**\n                     * Got to the end of tag we needed to remove.\n                     */\n                    $tagname = false;\n                    $skip_content = false;\n                } else {\n                    if ($skip_content == false) {\n                        if ($tagname == \"body\") {\n                            $tagname = \"div\";\n                        }\n                        if (isset($open_tags{$tagname}) &&\n                            $open_tags{$tagname} > 0\n                        ) {\n                            $open_tags{$tagname}--;\n                        } else {\n                            $tagname = false;\n                        }\n                    }\n                }\n            } else {\n                /**\n                 * $rm_tags_with_content\n                 */\n                if ($skip_content == false) {\n                    /**\n                     * See if this is a self-closing type and change\n                     * tagtype appropriately.\n                     */\n                    if ($tagtype == 1\n                        && in_array($tagname, $self_closing_tags)\n                    ) {\n                        $tagtype = 3;\n                    }\n                    /**\n                     * See if we should skip this tag and any content\n                     * inside it.\n                     */\n                    if ($tagtype == 1\n                        && in_array($tagname, $rm_tags_with_content)\n                    ) {\n                        $skip_content = $tagname;\n                    } else {\n                        if (($rm_tags == false\n                             && in_array($tagname, $tag_list)) ||\n                            ($rm_tags == true\n                                && !in_array($tagname, $tag_list))\n                        ) {\n                            $tagname = false;\n                        } else {\n                            /**\n                             * Convert body into div.\n                             */\n                            if ($tagname == \"body\"){\n                                $tagname = \"div\";\n                                $attary = tln_body2div($attary, $trans_image_path);\n                            }\n                            if ($tagtype == 1) {\n                                if (isset($open_tags{$tagname})) {\n                                    $open_tags{$tagname}++;\n                                } else {\n                                    $open_tags{$tagname} = 1;\n                                }\n                            }\n                            /**\n                             * This is where we run other checks.\n                             */\n                            if (is_array($attary) && sizeof($attary) > 0) {\n                                $attary = tln_fixatts(\n                                    $tagname,\n                                    $attary,\n                                    $rm_attnames,\n                                    $bad_attvals,\n                                    $add_attr_to_tag,\n                                    $trans_image_path,\n                                    $block_external_images\n                                );\n                            }\n                        }\n                    }\n                }\n            }\n            if ($tagname != false && $skip_content == false) {\n                $trusted .= tln_tagprint($tagname, $attary, $tagtype);\n            }\n        }\n        $curpos = $gt + 1;\n    }\n    $trusted .= substr($body, $curpos, strlen($body) - $curpos);\n    if ($force_tag_closing == true) {\n        foreach ($open_tags as $tagname => $opentimes) {\n            while ($opentimes > 0) {\n                $trusted .= '</' . $tagname . '>';\n                $opentimes--;\n            }\n        }\n        $trusted .= \"\\n\";\n    }\n    $trusted .= \"<!-- end tln_sanitized html -->\\n\";\n    return $trusted;\n}\n\n//\n// Use the nifty htmlfilter library\n//\n\n\nfunction HTMLFilter($body, $trans_image_path, $block_external_images = false)\n{\n\n    $tag_list = array(\n        false,\n        \"object\",\n        \"meta\",\n        \"html\",\n        \"head\",\n        \"base\",\n        \"link\",\n        \"frame\",\n        \"iframe\",\n        \"plaintext\",\n        \"marquee\"\n    );\n\n    $rm_tags_with_content = array(\n        \"script\",\n        \"applet\",\n        \"embed\",\n        \"title\",\n        \"frameset\",\n        \"xmp\",\n        \"xml\"\n    );\n\n    $self_closing_tags =  array(\n        \"img\",\n        \"br\",\n        \"hr\",\n        \"input\",\n        \"outbind\"\n    );\n\n    $force_tag_closing = true;\n\n    $rm_attnames = array(\n        \"/.*/\" =>\n            array(\n                // \"/target/i\",\n                \"/^on.*/i\",\n                \"/^dynsrc/i\",\n                \"/^data.*/i\",\n                \"/^lowsrc.*/i\"\n            )\n    );\n\n    $bad_attvals = array(\n        \"/.*/\" =>\n        array(\n            \"/^src|background/i\" =>\n            array(\n                array(\n                    '/^([\\'\"])\\s*\\S+script\\s*:.*([\\'\"])/si',\n                    '/^([\\'\"])\\s*mocha\\s*:*.*([\\'\"])/si',\n                    '/^([\\'\"])\\s*about\\s*:.*([\\'\"])/si'\n                ),\n                array(\n                    \"\\\\1$trans_image_path\\\\2\",\n                    \"\\\\1$trans_image_path\\\\2\",\n                    \"\\\\1$trans_image_path\\\\2\"\n                )\n            ),\n            \"/^href|action/i\" =>\n            array(\n                array(\n                    '/^([\\'\"])\\s*\\S+script\\s*:.*([\\'\"])/si',\n                    '/^([\\'\"])\\s*mocha\\s*:*.*([\\'\"])/si',\n                    '/^([\\'\"])\\s*about\\s*:.*([\\'\"])/si'\n                ),\n                array(\n                    \"\\\\1#\\\\1\",\n                    \"\\\\1#\\\\1\",\n                    \"\\\\1#\\\\1\"\n                )\n            ),\n            \"/^style/i\" =>\n            array(\n                array(\n                    \"/\\/\\*.*\\*\\//\",\n                    \"/expression/i\",\n                    \"/binding/i\",\n                    \"/behaviou*r/i\",\n                    \"/include-source/i\",\n                    '/position\\s*:/i',\n                    '/(\\\\\\\\)?u(\\\\\\\\)?r(\\\\\\\\)?l(\\\\\\\\)?/i',\n                    '/url\\s*\\(\\s*([\\'\"])\\s*\\S+script\\s*:.*([\\'\"])\\s*\\)/si',\n                    '/url\\s*\\(\\s*([\\'\"])\\s*mocha\\s*:.*([\\'\"])\\s*\\)/si',\n                    '/url\\s*\\(\\s*([\\'\"])\\s*about\\s*:.*([\\'\"])\\s*\\)/si',\n                    '/(.*)\\s*:\\s*url\\s*\\(\\s*([\\'\"]*)\\s*\\S+script\\s*:.*([\\'\"]*)\\s*\\)/si'\n                ),\n                array(\n                    \"\",\n                    \"idiocy\",\n                    \"idiocy\",\n                    \"idiocy\",\n                    \"idiocy\",\n                    \"idiocy\",\n                    \"url\",\n                    \"url(\\\\1#\\\\1)\",\n                    \"url(\\\\1#\\\\1)\",\n                    \"url(\\\\1#\\\\1)\",\n                    \"\\\\1:url(\\\\2#\\\\3)\"\n                )\n            )\n        )\n    );\n\n    if ($block_external_images) {\n        array_push(\n            $bad_attvals{'/.*/'}{'/^src|background/i'}[0],\n            '/^([\\'\\\"])\\s*https*:.*([\\'\\\"])/si'\n        );\n        array_push(\n            $bad_attvals{'/.*/'}{'/^src|background/i'}[1],\n            \"\\\\1$trans_image_path\\\\1\"\n        );\n        array_push(\n            $bad_attvals{'/.*/'}{'/^style/i'}[0],\n            '/url\\(([\\'\\\"])\\s*https*:.*([\\'\\\"])\\)/si'\n        );\n        array_push(\n            $bad_attvals{'/.*/'}{'/^style/i'}[1],\n            \"url(\\\\1$trans_image_path\\\\1)\"\n        );\n    }\n\n    $add_attr_to_tag = array(\n        \"/^a$/i\" =>\n            array('target' => '\"_blank\"')\n    );\n\n    $trusted = tln_sanitize(\n        $body,\n        $tag_list,\n        $rm_tags_with_content,\n        $self_closing_tags,\n        $force_tag_closing,\n        $rm_attnames,\n        $bad_attvals,\n        $add_attr_to_tag,\n        $trans_image_path,\n        $block_external_images\n    );\n    return $trusted;\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/extras/ntlm_sasl_client.php",
    "content": "<?php\n/*\n * ntlm_sasl_client.php\n *\n * @(#) $Id: ntlm_sasl_client.php,v 1.3 2004/11/17 08:00:37 mlemos Exp $\n *\n */\n\ndefine(\"SASL_NTLM_STATE_START\", 0);\ndefine(\"SASL_NTLM_STATE_IDENTIFY_DOMAIN\", 1);\ndefine(\"SASL_NTLM_STATE_RESPOND_CHALLENGE\", 2);\ndefine(\"SASL_NTLM_STATE_DONE\", 3);\ndefine(\"SASL_FAIL\", -1);\ndefine(\"SASL_CONTINUE\", 1);\n\nclass ntlm_sasl_client_class\n{\n    public $credentials = array();\n    public $state = SASL_NTLM_STATE_START;\n\n    public function initialize(&$client)\n    {\n        if (!function_exists($function = \"mcrypt_encrypt\")\n            || !function_exists($function = \"mhash\")\n        ) {\n            $extensions = array(\n                \"mcrypt_encrypt\" => \"mcrypt\",\n                \"mhash\" => \"mhash\"\n            );\n            $client->error = \"the extension \" . $extensions[$function] .\n                \" required by the NTLM SASL client class is not available in this PHP configuration\";\n            return (0);\n        }\n        return (1);\n    }\n\n    public function ASCIIToUnicode($ascii)\n    {\n        for ($unicode = \"\", $a = 0; $a < strlen($ascii); $a++) {\n            $unicode .= substr($ascii, $a, 1) . chr(0);\n        }\n        return ($unicode);\n    }\n\n    public function typeMsg1($domain, $workstation)\n    {\n        $domain_length = strlen($domain);\n        $workstation_length = strlen($workstation);\n        $workstation_offset = 32;\n        $domain_offset = $workstation_offset + $workstation_length;\n        return (\n            \"NTLMSSP\\0\" .\n            \"\\x01\\x00\\x00\\x00\" .\n            \"\\x07\\x32\\x00\\x00\" .\n            pack(\"v\", $domain_length) .\n            pack(\"v\", $domain_length) .\n            pack(\"V\", $domain_offset) .\n            pack(\"v\", $workstation_length) .\n            pack(\"v\", $workstation_length) .\n            pack(\"V\", $workstation_offset) .\n            $workstation .\n            $domain\n        );\n    }\n\n    public function NTLMResponse($challenge, $password)\n    {\n        $unicode = $this->ASCIIToUnicode($password);\n        $md4 = mhash(MHASH_MD4, $unicode);\n        $padded = $md4 . str_repeat(chr(0), 21 - strlen($md4));\n        $iv_size = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB);\n        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);\n        for ($response = \"\", $third = 0; $third < 21; $third += 7) {\n            for ($packed = \"\", $p = $third; $p < $third + 7; $p++) {\n                $packed .= str_pad(decbin(ord(substr($padded, $p, 1))), 8, \"0\", STR_PAD_LEFT);\n            }\n            for ($key = \"\", $p = 0; $p < strlen($packed); $p += 7) {\n                $s = substr($packed, $p, 7);\n                $b = $s . ((substr_count($s, \"1\") % 2) ? \"0\" : \"1\");\n                $key .= chr(bindec($b));\n            }\n            $ciphertext = mcrypt_encrypt(MCRYPT_DES, $key, $challenge, MCRYPT_MODE_ECB, $iv);\n            $response .= $ciphertext;\n        }\n        return $response;\n    }\n\n    public function typeMsg3($ntlm_response, $user, $domain, $workstation)\n    {\n        $domain_unicode = $this->ASCIIToUnicode($domain);\n        $domain_length = strlen($domain_unicode);\n        $domain_offset = 64;\n        $user_unicode = $this->ASCIIToUnicode($user);\n        $user_length = strlen($user_unicode);\n        $user_offset = $domain_offset + $domain_length;\n        $workstation_unicode = $this->ASCIIToUnicode($workstation);\n        $workstation_length = strlen($workstation_unicode);\n        $workstation_offset = $user_offset + $user_length;\n        $lm = \"\";\n        $lm_length = strlen($lm);\n        $lm_offset = $workstation_offset + $workstation_length;\n        $ntlm = $ntlm_response;\n        $ntlm_length = strlen($ntlm);\n        $ntlm_offset = $lm_offset + $lm_length;\n        $session = \"\";\n        $session_length = strlen($session);\n        $session_offset = $ntlm_offset + $ntlm_length;\n        return (\n            \"NTLMSSP\\0\" .\n            \"\\x03\\x00\\x00\\x00\" .\n            pack(\"v\", $lm_length) .\n            pack(\"v\", $lm_length) .\n            pack(\"V\", $lm_offset) .\n            pack(\"v\", $ntlm_length) .\n            pack(\"v\", $ntlm_length) .\n            pack(\"V\", $ntlm_offset) .\n            pack(\"v\", $domain_length) .\n            pack(\"v\", $domain_length) .\n            pack(\"V\", $domain_offset) .\n            pack(\"v\", $user_length) .\n            pack(\"v\", $user_length) .\n            pack(\"V\", $user_offset) .\n            pack(\"v\", $workstation_length) .\n            pack(\"v\", $workstation_length) .\n            pack(\"V\", $workstation_offset) .\n            pack(\"v\", $session_length) .\n            pack(\"v\", $session_length) .\n            pack(\"V\", $session_offset) .\n            \"\\x01\\x02\\x00\\x00\" .\n            $domain_unicode .\n            $user_unicode .\n            $workstation_unicode .\n            $lm .\n            $ntlm\n        );\n    }\n\n    public function start(&$client, &$message, &$interactions)\n    {\n        if ($this->state != SASL_NTLM_STATE_START) {\n            $client->error = \"NTLM authentication state is not at the start\";\n            return (SASL_FAIL);\n        }\n        $this->credentials = array(\n            \"user\" => \"\",\n            \"password\" => \"\",\n            \"realm\" => \"\",\n            \"workstation\" => \"\"\n        );\n        $defaults = array();\n        $status = $client->GetCredentials($this->credentials, $defaults, $interactions);\n        if ($status == SASL_CONTINUE) {\n            $this->state = SASL_NTLM_STATE_IDENTIFY_DOMAIN;\n        }\n        unset($message);\n        return ($status);\n    }\n\n    public function step(&$client, $response, &$message, &$interactions)\n    {\n        switch ($this->state) {\n            case SASL_NTLM_STATE_IDENTIFY_DOMAIN:\n                $message = $this->typeMsg1($this->credentials[\"realm\"], $this->credentials[\"workstation\"]);\n                $this->state = SASL_NTLM_STATE_RESPOND_CHALLENGE;\n                break;\n            case SASL_NTLM_STATE_RESPOND_CHALLENGE:\n                $ntlm_response = $this->NTLMResponse(substr($response, 24, 8), $this->credentials[\"password\"]);\n                $message = $this->typeMsg3(\n                    $ntlm_response,\n                    $this->credentials[\"user\"],\n                    $this->credentials[\"realm\"],\n                    $this->credentials[\"workstation\"]\n                );\n                $this->state = SASL_NTLM_STATE_DONE;\n                break;\n            case SASL_NTLM_STATE_DONE:\n                $client->error = \"NTLM authentication was finished without success\";\n                return (SASL_FAIL);\n            default:\n                $client->error = \"invalid NTLM authentication step state\";\n                return (SASL_FAIL);\n        }\n        return (SASL_CONTINUE);\n    }\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/get_oauth_token.php",
    "content": "<?php\n/**\n * Get an OAuth2 token from Google.\n * * Install this script on your server so that it's accessible\n * as [https/http]://<yourdomain>/<folder>/get_oauth_token.php\n * e.g.: http://localhost/phpmail/get_oauth_token.php\n * * Ensure dependencies are installed with 'composer install'\n * * Set up an app in your Google developer console\n * * Set the script address as the app's redirect URL\n * If no refresh token is obtained when running this file, revoke access to your app\n * using link: https://accounts.google.com/b/0/IssuedAuthSubTokens and run the script again.\n * This script requires PHP 5.4 or later\n * PHP Version 5.4\n */\n\nnamespace League\\OAuth2\\Client\\Provider;\n\nrequire 'vendor/autoload.php';\n\nuse League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse League\\OAuth2\\Client\\Tool\\BearerAuthorizationTrait;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nsession_start();\n\n//If this automatic URL doesn't work, set it yourself manually\n$redirectUri = isset($_SERVER['HTTPS']) ? 'https://' : 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];\n//$redirectUri = 'http://localhost/phpmailer/get_oauth_token.php';\n\n//These details obtained are by setting up app in Google developer console.\n$clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';\n$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';\n\nclass Google extends AbstractProvider\n{\n    use BearerAuthorizationTrait;\n\n    const ACCESS_TOKEN_RESOURCE_OWNER_ID = 'id';\n\n    /**\n     * @var string If set, this will be sent to google as the \"access_type\" parameter.\n     * @link https://developers.google.com/accounts/docs/OAuth2WebServer#offline\n     */\n    protected $accessType;\n\n    /**\n     * @var string If set, this will be sent to google as the \"hd\" parameter.\n     * @link https://developers.google.com/accounts/docs/OAuth2Login#hd-param\n     */\n    protected $hostedDomain;\n\n    /**\n     * @var string If set, this will be sent to google as the \"scope\" parameter.\n     * @link https://developers.google.com/gmail/api/auth/scopes\n     */\n    protected $scope;\n\n    public function getBaseAuthorizationUrl()\n    {\n        return 'https://accounts.google.com/o/oauth2/auth';\n    }\n\n    public function getBaseAccessTokenUrl(array $params)\n    {\n        return 'https://accounts.google.com/o/oauth2/token';\n    }\n\n    public function getResourceOwnerDetailsUrl(AccessToken $token)\n    {\n\treturn ' ';\n    }\n\n    protected function getAuthorizationParameters(array $options)\n    {\n\tif (is_array($this->scope)) {\n            $separator = $this->getScopeSeparator();\n            $this->scope = implode($separator, $this->scope);\n        }\n\n        $params = array_merge(\n            parent::getAuthorizationParameters($options),\n            array_filter([\n                'hd'          => $this->hostedDomain,\n                'access_type' => $this->accessType,\n\t\t'scope'       => $this->scope,\n                // if the user is logged in with more than one account ask which one to use for the login!\n                'authuser'    => '-1'\n            ])\n        );\n        return $params;\n    }\n\n    protected function getDefaultScopes()\n    {\n        return [\n            'email',\n            'openid',\n            'profile',\n        ];\n    }\n\n    protected function getScopeSeparator()\n    {\n        return ' ';\n    }\n\n    protected function checkResponse(ResponseInterface $response, $data)\n    {\n        if (!empty($data['error'])) {\n            $code  = 0;\n            $error = $data['error'];\n\n            if (is_array($error)) {\n                $code  = $error['code'];\n                $error = $error['message'];\n            }\n\n            throw new IdentityProviderException($error, $code, $data);\n        }\n    }\n\n    protected function createResourceOwner(array $response, AccessToken $token)\n    {\n        return new GoogleUser($response);\n    }\n}\n\n\n//Set Redirect URI in Developer Console as [https/http]://<yourdomain>/<folder>/get_oauth_token.php\n$provider = new Google(\n    array(\n        'clientId' => $clientId,\n        'clientSecret' => $clientSecret,\n        'redirectUri' => $redirectUri,\n        'scope' => array('https://mail.google.com/'),\n\t'accessType' => 'offline'\n    )\n);\n\nif (!isset($_GET['code'])) {\n    // If we don't have an authorization code then get one\n    $authUrl = $provider->getAuthorizationUrl();\n    $_SESSION['oauth2state'] = $provider->getState();\n    header('Location: ' . $authUrl);\n    exit;\n// Check given state against previously stored one to mitigate CSRF attack\n} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {\n    unset($_SESSION['oauth2state']);\n    exit('Invalid state');\n} else {\n    // Try to get an access token (using the authorization code grant)\n    $token = $provider->getAccessToken(\n        'authorization_code',\n        array(\n            'code' => $_GET['code']\n        )\n    );\n\n    // Use this to get a new access token if the old one expires\n    echo 'Refresh Token: ' . $token->getRefreshToken();\n}\n"
  },
  {
    "path": "frphp/extend/PHPMailer/testmail.php",
    "content": "<?php\n\nrequire 'PHPMailerAutoload.php';\nrequire_once('class.phpmailer.php');\nrequire_once(\"class.smtp.php\");\n$mail  = new PHPMailer();\n\n$mail->CharSet    =\"UTF-8\";                 //趨ʼ룬ĬISO-8859-1ĴΪ UTF-8\n$mail->IsSMTP();                            // 趨ʹSMTP\n$mail->SMTPAuth   = true;                   //  SMTP ֤\n$mail->SMTPSecure = \"ssl\";                  // SSL\n$mail->SMTPDebug = 2;\n$mail->Host       = \"smtp.xxx.com\";       // SMTP \n$mail->Port       = 465;                    // SMTPĶ˿ں\n$mail->Username   = \"xxx@xxx.com\";  // SMTPû\n$mail->Password   = \"xxx\";        // SMTP\n$mail->SetFrom('xxx@xxx.com', 'qq');    // ÷˵ַ\n$mail->AddReplyTo(\"xxx@xxx.com\",\"xxx@xxx.com\");\n                                            // ʼظ˵ַ\n$mail->Subject    = 'xxx';                     // ʼ\n$mail->AltBody    = \"Ϊ˲鿴ʼл֧ HTML ʼͻ\";\n                                            // ѡ¼ݿ\n$mail->MsgHTML('<html>helo</html>');                         // ʼ\n$mail->AddAddress('xxx@xxx.com', \"xxx@xxx.com\");\n//$mail->AddAttachment(\"images/phpmailer.gif\"); // \nif(!$mail->Send()) {\n    echo \"ʧܣ\" . $mail->ErrorInfo;\n} else {\n    echo \"ϲʼͳɹ\";\n}\n\n?>\n"
  },
  {
    "path": "frphp/extend/Page.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2018/04/20\n// +----------------------------------------------------------------------\n\n\nnamespace frphp\\extend;\n\n\tclass Page {\n\t\t//分页表\n\t\tpublic $table = '';\n\t\t//总条数\n\t\tpublic $sum = 0;\n\t\t//总页数\n\t\tpublic $allpage = 0;\n\t\t//上一页\n\t\tpublic $prevpage = '';\n\t\t//下一页\n\t\tpublic $nextpage = '';\n\t\t//每页条数\n\t\tpublic $limit = 10;\n\t\t//分页从第几开始\n\t\tpublic $limit_t = 0;\n\t\t//当前页码\n\t\tpublic $currentPage = 1;\n\t\t//间隔条数\n\t\tpublic $pv = 3;\n\t\t//系统分页链接\n\t\tpublic $url = '';\n\t\t//分页分隔符\n\t\tpublic $sep = '/page/';\n\t\tpublic $paged = 'page';\n\t\t//SQL\n\t\tpublic $sql = null;\n\t\t//排序\n\t\tpublic $order = null;\n\t\t//字段\n\t\tpublic $fields = null;\n\t\t//当前分页数据\n\t\tpublic $datalist = array();\n\t\t//当前分页数组\n\t\tpublic $listpage = array();\n\t\t//分页url设置\n\t\tpublic $typeurl = '';\n\t\t//是否需要后缀File_TXT\n\t\tpublic $file_ext = '.html';\n\t\t//是否极致内部表\n\t\tpublic $prefix = 1;\n\t\t\n\t\t\n\t\tpublic function __construct($table='',$prefix = 1){\n\t\t\t\n\t\t\t$this->table = $table;\n\t\t\t$this->prefix = $prefix;\n\t\t}\n\t\t\n\t\t\n\t\tpublic function getUrl(){\n            $request_uri = format_param($_SERVER[\"REQUEST_URI\"],6);\n            if(strpos($request_uri,APP_URL)!==false){\n\t\t\t\t//后台\n                $this->file_ext = '';\n                if($this->typeurl=='tpl'){\n                   \n                    $url = $request_uri;\n                    if(strpos($url,'?')!==false){\n                        $urls = explode('?',$url);\n                        $url = $urls[0];\n                    }\n                    $position = strpos($url, '?');\n                    $url = $position === false ? $url : substr($url, 0, $position);\n                    $url = (strripos($url,'/')+1 == strlen($url)) ? substr($url,0,strripos($url,'/')) : $url;\n                }else{\n                    $this->sep = '?page=';\n                    if(isset($_GET['page'])){\n                        unset($_GET['page']);\n                    }\n                    $url = get_domain().APP_URL.'/'.APP_CONTROLLER.'/'.APP_ACTION;\n                    if(count($_GET)>0){\n                        $this->sep = '&page=';\n                        $url = get_domain().APP_URL.'/'.APP_CONTROLLER.'/'.APP_ACTION.'?'.http_build_query($_GET);\n                    }\n                }\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\n\t\t\t\tswitch($this->typeurl){\n\t\t\t\t\tcase 'screen':\n\t\t\t\t\t$url = get_domain().'/screen-'.$_GET['molds'].'-'.$_GET['tid'].'-'.$_GET['jz_screen']; \n\t\t\t\t\t\tif(strpos($url,'page')!==false){\n\t\t\t\t\t\t\t$urls = explode('-page-',$url);\n\t\t\t\t\t\t\t$url = $urls[0];\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'tpl':\n\t\t\t\t\t\t$this->file_ext = '';\n\t\t\t\t\t\t//$url = str_ireplace('.html','',$request_uri);\n\t\t\t\t\t\t$url = $request_uri;\n\t\t\t\t\t\tif(strpos($url,'?')!==false){\n\t\t\t\t\t\t\t$urls = explode('?',$url);\n\t\t\t\t\t\t\t$url = $urls[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'search':\n\t\t\t\t\t\t$this->file_ext = '';\n\t\t\t\t\t\t$param = $_REQUEST;\n\t\t\t\t\t\tif(isset($param['page'])){\n\t\t\t\t\t\t\tunset($param['page']);\n\t\t\t\t\t\t}\n                        unset($param['PHPSESSID']);\n\t\t\t\t\t\tunset($param['ajax']);\n\t\t\t\t\t\tunset($param['ajax_tpl']);\n\t\t\t\t\t\t$urlparse = parse_url($request_uri);\n\t\t\t\t\t\t$url = get_domain().$urlparse['path'].'?'.http_build_query($param);\n\t\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t\n\t\t\t\t\t\t$url = str_ireplace('.html','',$request_uri);\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif($this->typeurl!='search'){\n\t\t\t\t\t$position = strpos($url, '?');\n\t\t\t\t\t$url = $position === false ? $url : substr($url, 0, $position);\n\t\t\t\t\t$url = (strripos($url,'/')+1 == strlen($url)) ? substr($url,0,strripos($url,'/')) : $url; \n\t\t\t\t}\n\t\t\t}\n            \n            \n            $url = $url=='' ? '/' : $url;\n\t\t\treturn $url;\n            \n\t\t}\n\t\t\n\t\tpublic function pageList($pv=5,$sep=false){\n\t\t\t/**\n\t\t\t\t首页url  \t\thome\n\t\t\t\t上一页url\t\tprev\n\t\t\t\t下一页url       next\n\t\t\t\t当前页url       current\n\t\t\t\t总页数  \t    allpage\n\t\t\t\t当前页码\t\tcurrent_num\n\t\t\t\t普通页码组      list\n\t\t\t\t最后一页url\t\tlast\n\t\t\t\n\t\t\t\n\t\t\t**/\n\t\t\t$listpage = array(\n\t\t\t\t'home' => null,\n\t\t\t\t'prev' => null,\n\t\t\t\t'next' => null,\n\t\t\t\t'current' => null,\n\t\t\t\t'allpage' => 0,\n\t\t\t\t'current_num' => 0,\n\t\t\t\t'list' => null,\n\t\t\t\t'last' => null,\n\t\t\t);\n\t\t\t\n\t\t\t$this->pv = $pv;\n\t\t\t$this->sep = ($sep==false) ? ($this->sep) : $sep;\n\t\t\t$url = $this->getUrl();\n\t\t\tif( (strpos($url,$this->sep)!==false && $this->currentPage!=1) || (strpos($url,$this->sep.'1')!==false && $this->currentPage==1)){\n\t\t\t\t$urls = explode($this->sep,$url);\n\t\t\t\t$num = array_pop($urls);\n\t\t\t\tif(is_numeric($num)){\n\t\t\t\t\t  $url = implode($this->sep,$urls);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t\t$this->url = $url;\n\t\t\t$list = '';\n\t\t\t$request_uri = $_SERVER[\"REQUEST_URI\"];    \n            if(strpos($request_uri,APP_URL)!==false){\n\t\t\t\t$file_ext = '';\n\t\t\t}else{\n\t\t\t\t$file_ext = File_TXT_HIDE ? '' : $this->file_ext;\n\t\t\t\tif($file_ext=='' && $this->typeurl==''){\n\t\t\t\t\t$file_ext = CLASS_HIDE_SLASH ? $file_ext : $file_ext.'/';\n\t\t\t\t}\n\t\t\t\tif(strpos($url,'?')===false){\n\t\t\t\t\t$param = $_REQUEST;\n                    unset($param['PHPSESSID']);\n\t\t\t\t\tif(isset($param['page'])){\n\t\t\t\t\t\tunset($param['page']);\n\t\t\t\t\t}\n\t\t\t\t\tunset($param['ajax']);\n\t\t\t\t\tunset($param['ajax_tpl']);\n\t\t\t\t\tunset($param['s']);\n\t\t\t\t\tif($this->typeurl=='screen'){\n\t\t\t\t\t\tunset($param['tid']);\n\t\t\t\t\t\tunset($param['jz_screen']);\n\t\t\t\t\t\tunset($param['molds']);\n\t\t\t\t\t}\n\t\t\t\t\tif($this->typeurl=='tpl'){\n\t\t\t\t\t\tif(isset($param[$this->paged])){\n\t\t\t\t\t\t\tunset($param[$this->paged]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(count($param)){\n\t\t\t\t\t\tif(strpos($this->sep,'?')!==false){\n\t\t\t\t\t\t\t$file_ext.='&'.http_build_query($param);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t$file_ext.='?'.http_build_query($param);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t$listpage['home'] = $this->url.$file_ext;\n            $num = floor($this->pv/2);\n            $start = $this->currentPage-$num;\n            $start = ($this->currentPage+$num) > $this->allpage ? ($this->allpage-$this->pv+1) : $start;\n            $start = $start<1 ? 1 : $start;\n            \n            $end = $this->currentPage+$num;\n            $end = $end>$this->allpage ? $this->allpage : $end;\n            $end = $start<$num ? ($this->pv>=$this->allpage ? $this->allpage : $this->pv) : $end;\n            while($start<=$end){\n                $urlx = $start==1 ? $this->url.$file_ext : $this->url.$this->sep.$start.$file_ext;\n                if($start==$this->currentPage){\n                    $list.='<li class=\"active\" ><a >'.$this->currentPage.'</a></li>';\n                    $listpage['current'] = $urlx;\n                    $listpage['current_num'] = $this->currentPage;\n                }else{\n                    $list .= '<li><a href=\"'.$urlx.'\" data-page=\"'.$start.'\">'.$start.'</a></li>';\n                }\n                \n                $listpage['list'][] = array('url'=>$urlx,'num'=>$start);\n                $start++;\n            }\n\t\t\t$listpage['allpage'] = $this->allpage;\n\t\t\t$prev_url = $this->currentPage==1 ? '' : $this->url.$this->sep.($this->currentPage-1).$file_ext;\n\t\t\t$prev = '<li><a href=\"'.$prev_url.'\" class=\"layui-laypage-prev\" data-page=\"'.($this->currentPage-1).'\"><em>&lt;</em></a></li>';\n\t\t\t\n\t\t\tif($this->currentPage!=1){\n\t\t\t\t$this->prevpage = $this->url.$this->sep.($this->currentPage-1).$file_ext;\n\t\t\t}\n\t\t\t$next = '<li><a href=\"'.$this->url.$this->sep.($this->currentPage+1).$file_ext.'\" class=\"layui-laypage-next\" data-page=\"'.($this->currentPage+1).'\"><em>&gt;</em></a></li>';\n\t\t\t\n\t\t\tif($this->currentPage != $this->allpage && $this->allpage>1){\n\t\t\t$this->nextpage = $this->url.$this->sep.($this->currentPage+1).$file_ext;\t\n\t\t\t}\n\t\t\t\n\t\t\t$all = '<li><a href=\"javascript:;\" data-page=\"'.$this->currentPage.'\">总共'.$this->currentPage.'/'.$this->allpage.'</a></li>';\n\t\t\t$last_url = $this->allpage==1 ? $this->url.$file_ext : $this->url.$this->sep.$this->allpage.$file_ext;\n\t\t\t$last = '<li><a href=\"'.$last_url.'\" class=\"layui-laypage-prev\" data-page=\"'.$this->allpage.'\"><em>尾页</em></a></li>';\n\t\t\t\n\t\t\t$ext = '<div class=\"pagination\"><ul>';\n\t\t\t$list = $all.$list;\n\t\t\t\n\t\t\tif($this->currentPage!=1){\n\t\t\t\t$list = $prev.$list;\n\t\t\t\t$listpage['prev'] = $this->prevpage;\n\t\t\t}\n\t\t\tif($this->currentPage<$this->allpage){\n\t\t\t\t$list .= $next;\n\t\t\t\t$listpage['next'] = $this->nextpage;\n\t\t\t}\n\t\t\tif($this->allpage > $this->pv){\n\t\t\t\t$list .= $last;\n\t\t\t}\n\t\t\t$listpage['last'] = $last_url;\n\t\t\t$list = $ext.$list.'</ul></div>';\n\t\t\t$this->listpage = $listpage;\n\t\t\treturn $list;\n\t\t\t\n\t\t}\n\t\t\n\t\tpublic function where($sql=null){\n\t\t\t$this->sql = $sql;\n\t\t\treturn $this;\n\t\t}\n\t\tpublic function orderby($orders=null){\n\t\t\t$this->order = $orders;\n\t\t\treturn $this;\n\t\t}\n\t\tpublic function limit($limit=null){\n\t\t\tif($limit==null){\n\t\t\t\t$this->limit = $this->limit;\n\t\t\t}else{\n\t\t\t\tif(strpos($limit,',')!==false){\n\t\t\t\t\t$limit_t = explode(',',$limit);\n\t\t\t\t\t$this->limit = (int)$limit_t[1];\n\t\t\t\t\t$this->limit_t = (int)$limit_t[0];\n\t\t\t\t}else{\n\t\t\t\t\t$this->limit = $limit;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn $this;\n\t\t}\n\t\tpublic function fields($fields=null){\n\t\t\t$this->fields = $fields;\n\t\t\treturn $this;\n\t\t}\n\t\tpublic function page($p=1){\n\t\t\t$this->currentPage = (int)$p;\n\t\t\treturn $this;\n\t\t}\n\t\t\n\t\t\n\t\tpublic function setPage($config){\n\t\t\tif(isset($config['order'])){\n\t\t\t\t$this->order = $config['order'];\n\t\t\t}\n\t\t\tif(isset($config['fields'])){\n\t\t\t\t$this->fields = $config['fields'];\n\t\t\t}\n\t\t\tif(isset($config['limit'])){\n\t\t\t\t$this->limit = $config['limit'];\n\t\t\t}\n\t\t\tif(isset($config['page'])){\n\t\t\t\t$this->currentPage = $config['page'];\n\t\t\t}\n\t\t\t\n\t\t\treturn $this;\n\t\t}\n\t\t\n\t\tpublic function go(){\n\t\t\tif($this->currentPage>1){\n\t\t\t\t$limitsql = (($this->limit*($this->currentPage-1)) - ($this->limit_t)).','.$this->limit;\n\t\t\t\t//1-0:1  2-2:3\n\t\t\t}else{\n\t\t\t\tif($this->limit_t==1){\n\t\t\t\t\t$limitsql = $this->limit_t.','.$this->limit;\n\t\t\t\t}else{\n\t\t\t\t\t$limitsql = $this->limit;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n            $data = M($this->table,$this->prefix)->findPage($this->sql,$this->order,$this->fields,$limitsql);\n            $this->datalist = $data['lists'];\n            $this->sum = $data['sum'];\n\n\t\t\t$allpage = ceil($this->sum/$this->limit);\n\t\t\tif($allpage==0){$allpage=1;}\n\t\t\t$this->allpage = $allpage;\n\t\t\treturn $this->datalist;\n\t\t}\n\t\t\n\t\t//一步到位\n\t\tpublic function goPage($sql=null,$order=null,$fields=null,$limit=10){\n\t\t\t$this->sql = $sql;\n\t\t\t$this->order = $order;\n\t\t\t$this->fields = $fields;\n\t\t\tif(strpos($limit,',')!==false){\n\t\t\t\t$limit_t = explode(',',$limit);\n\t\t\t\t$this->limit = (int)$limit_t[1];\n\t\t\t\t$this->limit_t = (int)$limit_t[0];\n\t\t\t}else{\n\t\t\t\t$this->limit = $limit;\n\t\t\t}\n\t\t\t\n\t\t\tif($this->currentPage!=1){\n\t\t\t\t$limitsql = (($this->limit*($this->currentPage-1)) - ($this->limit_t)).','.$this->limit;\n\t\t\t\t//1-0:1  2-2:3\n\t\t\t}else{\n\t\t\t\tif($this->limit_t!=0){\n\t\t\t\t\t$limitsql = $this->limit_t.','.$this->limit;\n\t\t\t\t}else{\n\t\t\t\t\t$limitsql = $this->limit;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n            $data = M($this->table,$this->prefix)->findPage($this->sql,$this->order,$this->fields,$limitsql);\n            $this->datalist = $data['lists'];\n            $this->sum = $data['sum'];\n\t\t\t$this->limit = $limit;\n\t\t\t$this->allpage = ceil($this->sum/$this->limit);\n\t\t\treturn $this->datalist;\n\t\t}\n\t\t\n\t\t// SQL处理\n\t\tpublic function goSql(){\n\t\t\tif($this->currentPage!=1){\n\t\t\t\t$limitsql = (($this->limit*($this->currentPage-1)) - ($this->limit_t)).','.$this->limit;\n\t\t\t\t//1-0:1  2-2:3\n\t\t\t}else{\n\t\t\t\tif($this->limit_t!=0){\n\t\t\t\t\t$limitsql = $this->limit_t.','.$this->limit;\n\t\t\t\t}else{\n\t\t\t\t\t$limitsql = $this->limit;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n\t\t\t$orderby = $this->order ? ' order by '.$this->order : '';\n\t\t\t$limit = ' limit '.$limitsql;\n            $sql = $this->sql;\n            $orderlimit = $orderby.' '.$limit;\n            $data = M()->findSqlPage($sql,$orderlimit);\n            $this->datalist = $data['lists'];\n            $this->sum = $data['sum'];\n\n\t\t\t$allpage = ceil($this->sum/$this->limit);\n\t\t\tif($allpage==0){$allpage=1;}\n\t\t\t$this->allpage = $allpage;\n\t\t\treturn $this->datalist;\n\t\t}\n\t\t\n\t\tpublic function goCount($sql){\n\t\t\t$n = M()->findSql($sql);\n\t\t\t$this->sum = count($n);\n\t\t\treturn $this;\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n?>"
  },
  {
    "path": "frphp/extend/SessionRedis.php",
    "content": "<?php\n\n/**\n * ************\n * SessionRedis  重写session机制\n * 将session存到redis数据库中\n * ************\n */\n \n /**\n\t使用\n\t\n\t$session = new SessionRedis(array(\n\t\t'HOST'=>'127.0.0.1',\n\t\t'PORT'=>6379\n\t));\n\tsession_set_save_handler($session,true);\n\t//session_id($_COOKIE['PHPSESSID']);\n\tsession_start();\n\t$_SESSION['name'] = 'onmpw';\n\tvar_dump($_SESSION);\n \n **/\nclass SessionRedis implements SessionHandlerInterface\n{\n\n    private $save_handle = '';\n    private $reconnect = false;  //是否重新连接  默认不重新连接\n    private $handle = '';\n    private $auth = null;   //是否有用户验证，默认无密码验证。如果不是为null，则为验证密码\n    private $prefix = 'FrPHP_SESSION';\n    private $expire = null;\n    private $config = array(\n        'SAVE_HANDLE' => 'Redis',\n        'HOST' => '127.0.0.1',\n        'PORT' => 6379,\n        'AUTH' => null,    //是否有用户验证，默认无密码验证。如果不是为null，则为验证密码\n        'TIMEOUT' => 0,   //连接超时\n        'RESERVED' => null,\n        'RETRY_INTERVAL' => 100,  //单位是 ms 毫秒\n        'RECONNECT' => false, //连接超时是否重连  默认不重连\n        'EXPIRE'=>1800  //session垃圾回收时间 单位s  在此也是session的过期时间\n    );\n\n    public function __construct($config = array())\n    {\n\n        if (!empty($config)) $this->config = array_merge($this->config, $config);\n\n        $this->parseConfig();\n    }\n\n    public function parseConfig()\n    {\n\n        $this->save_handle = $this->config['SAVE_HANDLE'];\n\n        $this->reconnect = $this->config['RECONNECT'];\n\n        $this->auth = $this->config['AUTH'];\n\n        $this->expire= $this->config['EXPIRE'];\n    }\n\n    /**\n     * Redis服务器连接\n     * @param string $host 主机地址\n     * @param number $port 连接端口\n     * @param number $timeout 连接超时时间\n     * @param string $reserved\n     * @param number $retry_interval\n     *\n     * @throws RedisException\n     *\n     * @return boolean\n     */\n    public function redisConnect($host = '127.0.0.1', $port = 6379, $timeout = 0, $reserved = null, $retry_interval = 100)\n    {\n        //实例化Redis对象\n        try {\n\n            $this->handle = new \\Redis();\n\n        } catch (RedisException $e) {\n\n            throw $e;\n\n        }\n\n\n        /*\n         * 判断是否重新连接\n         */\n        if (!$this->reconnect) {\n\n            $this->handle->connect($host, $port, $timeout);\n\n        } else {\n\n            $this->handle->connect($host, $port, $timeout, $reserved, $retry_interval);\n\n        }\n        /*\n         * 判断是否有密码验证\n         * 有密码验证则进行验证才可继续后续的操作\n         */\n        if (!is_null($this->auth)) {\n\n            $this->handle->auth($this->auth);\n\n        }\n        return true;\n    }\n\n    /**\n     * 解析连接\n     */\n    private function parseConnect()\n    {\n\n        if ($this->save_handle == 'Redis') {\n\n            $this->redisConnect($this->config['HOST'], $this->config['PORT'], $this->config['TIMEOUT'], $this->config['RESERVED'], $this->config['RETRY_INTERVAL']);\n\n        }\n\n    }\n\n    /**\n     * 当session_start()函数被调用的时候该函数被触发\n     *\n     * @see SessionHandlerInterface::open()\n     * @param string $path\n     * @param string $name\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function open($path, $name)\n    {\n        /*\n         * 首先连接服务器\n         */\n        $this->parseConnect();\n        return true;\n\n    }\n\n    /**\n     * 关闭当前session\n     * 当session关闭的时候该函数自动被触发\n     *\n     * @see SessionHandlerInterface::close()\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function close()\n    {\n        return true;\n    }\n\n    /**\n     * 从session存储空间读取session的数据。\n     * 当调用session_start()函数的时候该函数会被触发\n     * 但是在session_start()函数调用的时候先触发open函数，再触发该函数\n     *\n     * @see SessionHandlerInterface::read()\n     * @param string $id\n     * @return string|false\n     */\n    #[\\ReturnTypeWillChange]\n    public function read($id)\n    {\n        /*\n         * 根据sessionId 构造键名\n         */\n        $key = $this->prefix . ':' . $id;\n\n        //读取当前sessionid下的data数据\n        $res = $this->handle->hGet($key, 'data');\n        //读取完成以后 更新时间，说明已经操作过session\n        $time=time();\n        $this->handle->hSet($key, 'last_time', $time);\n        return (string)$res;\n\n    }\n\n    /**\n     * 将session的数据写入到session的存储空间内。\n     * 当session准备好存储和关闭的时候调用该函数\n     *\n     * @see SessionHandlerInterface::write()\n     * @param string $id\n     * @param string $data\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function write($id, $data)\n    {\n        /*\n         * 根据sessionId 构造键名\n         */\n        $key = $this->prefix . ':' . $id;\n        $time = time();\n        //查看该键内容是否存在\n        if (!$this->handle->exists($key)) {\n            /*\n             * 不存在则插入新的内容\n             * 插入最后更新时间\n             */\n            $this->handle->hset($key, 'last_time', $time);\n        } else {\n            /*\n             * 存在，则更新该键值\n             */\n            $this->handle->hMset($key, array('last_time' => $time, 'data' => $data));\n        }\n        return true;\n\n    }\n\n    /**\n     * 销毁session\n     *\n     * @see SessionHandlerInterface::destroy()\n     * @param string $id\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function destroy($id)\n    {\n        /*\n         * 根据sessionId 构造键名\n         */\n        $key = $this->prefix . ':' . $id;\n        return $this->handle->hDel($key, 'data') > 0;\n    }\n\n    /**\n     * 清除垃圾session，也就是清除过期的session。\n     * 该函数是基于php.ini中的配置选项\n     * session.gc_divisor, session.gc_probability 和 session.gc_lifetime所设置的值的\n     *\n     * @see SessionHandlerInterface::gc()\n     * @param int $maxlifetime\n     * @return bool\n     */\n    #[\\ReturnTypeWillChange]\n    public function gc($maxlifetime)\n    {\n        /*\n         * 取出所有的 带有指定前缀的键\n         */\n        $keys = $this->handle->keys($this->prefix . '*');\n\n        $now = time(); //取得现在的时间\n        //垃圾回收\n        foreach ($keys as $key) {\n            //取得当前key的最后更新时间\n            $last_time = $this->handle->hGet($key, 'last_time');\n            /*\n             * 查看当前时间和最后的更新时间的时间差是否超过最大生命周期\n             */\n            if (($now - $last_time) > $this->expire) {\n                //超过了最大生命周期时间 则删除该key\n                $this->handle->del($key);\n            }\n\n        }\n\n        return true;\n    }\n}\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "frphp/extend/Uploader.class.php",
    "content": "<?php\n\n/**\n * Created by JetBrains PhpStorm.\n * User: taoqili\n * Date: 12-7-18\n * Time: 上午11: 32\n * UEditor编辑器通用上传类\n */\nclass Uploader\n{\n    private $fileField; //文件域名\n    private $file; //文件上传对象\n    private $base64; //文件上传对象\n    private $config; //配置信息\n    private $oriName; //原始文件名\n    private $fileName; //新文件名\n    private $fullName; //完整文件名,即从当前配置目录开始的URL\n    private $filePath; //完整文件名,即从当前配置目录开始的URL\n    private $fileSize; //文件大小\n    private $fileType; //文件类型\n    private $stateInfo; //上传状态信息,\n    private $stateMap = array( //上传状态映射表，国际化用户需考虑此处数据的国际化\n        \"SUCCESS\", //上传成功标记，在UEditor中内不可改变，否则flash判断会出错\n        \"文件大小超出 upload_max_filesize 限制\",\n        \"文件大小超出 MAX_FILE_SIZE 限制\",\n        \"文件未被完整上传\",\n        \"没有文件被上传\",\n        \"上传文件为空\",\n        \"ERROR_TMP_FILE\" => \"临时文件错误\",\n        \"ERROR_TMP_FILE_NOT_FOUND\" => \"找不到临时文件\",\n        \"ERROR_SIZE_EXCEED\" => \"文件大小超出网站限制\",\n        \"ERROR_TYPE_NOT_ALLOWED\" => \"文件类型不允许\",\n        \"ERROR_CREATE_DIR\" => \"目录创建失败\",\n        \"ERROR_DIR_NOT_WRITEABLE\" => \"目录没有写权限\",\n        \"ERROR_FILE_MOVE\" => \"文件保存时出错\",\n        \"ERROR_FILE_NOT_FOUND\" => \"找不到上传文件\",\n        \"ERROR_WRITE_CONTENT\" => \"写入文件内容错误\",\n        \"ERROR_UNKNOWN\" => \"未知错误\",\n        \"ERROR_DEAD_LINK\" => \"链接不可用\",\n        \"ERROR_HTTP_LINK\" => \"链接不是http链接\",\n        \"ERROR_HTTP_CONTENTTYPE\" => \"链接contentType不正确\",\n        \"INVALID_URL\" => \"非法 URL\",\n        \"INVALID_IP\" => \"非法 IP\"\n    );\n\n    /**\n     * 构造函数\n     * @param string $fileField 表单名称\n     * @param array $config 配置项\n     * @param bool $base64 是否解析base64编码，可省略。若开启，则$fileField代表的是base64编码的字符串表单名\n     */\n    public function __construct($fileField, $config, $type = \"upload\")\n    {\n        $this->webconf = webConf();\n        $this->fileField = $fileField;\n        $this->config = $config;\n        $this->type = $type;\n        if ($type == \"remote\") {\n            $this->saveRemote();\n        } else if($type == \"base64\") {\n            $this->upBase64();\n        } else {\n            $this->upFile();\n        }\n\n    }\n    /**\n     * 图片加水印\n     * $source  string  图片资源\n     * $target  string  添加水印后的名字\n     * $w_pos   int     水印位置安排（1-10）【1:左头顶；2:中间头顶；3:右头顶...值空:随机位置】\n     * $w_img   string  水印图片路径\n     * $w_text  string  显示的文字\n     * $w_font  int     字体大小\n     * $w_color string  字体颜色\n     */\n    public function watermarkImg($source, $target = '', $w_pos = '', $w_img = '', $w_text = '',$w_font = 10, $w_color = '#CC0000') {\n        $this->w_img = '../watermark.png';//水印图片\n        $this->w_pos = 8;\n        $this->w_minwidth = 400;//最少宽度\n        $this->w_minheight = 200;//最少高度\n        $this->w_quality = 80;//图像质量\n        $this->w_pct = 60;//透明度\n        \n        $w_pos = $w_pos ? $w_pos : $this->w_pos;\n        $w_img = $w_img ? APP_PATH.$w_img : APP_PATH.$this->w_img;\n        if(!$this->check($source)) return false;\n        if(!$target) $target = $source;\n        $source_info = getimagesize($source);//图片信息\n        $source_w  = $source_info[0];//图片宽度\n        $source_h  = $source_info[1];//图片高度\n        if($source_w < $this->w_minwidth || $source_h < $this->w_minheight) return false;\n        switch($source_info[2]) { //图片类型\n            case 1 : //GIF格式\n                $source_img = imagecreatefromgif($source);\n                break;\n            case 2 : //JPG格式\n                $source_img = imagecreatefromjpeg($source);\n                break;\n            case 3 : //PNG格式\n                $source_img = imagecreatefrompng($source);\n                //imagealphablending($source_img,false); //关闭混色模式\n                imagesavealpha($source_img,true); //设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息（与单一透明色相反）\n                break;\n            default :\n                return false;\n        }\n        if(!empty($w_img) && file_exists($w_img)) { //水印图片有效\n            $ifwaterimage = 1; //标记\n            $water_info  = getimagesize($w_img);\n            $width    = $water_info[0];\n            $height    = $water_info[1];\n            switch($water_info[2]) {\n                case 1 :\n                    $water_img = imagecreatefromgif($w_img);\n                    break;\n                case 2 :\n                    $water_img = imagecreatefromjpeg($w_img);\n                    break;\n                case 3 :\n                    $water_img = imagecreatefrompng($w_img);\n                    imagealphablending($w_img,false);\n                    imagesavealpha($w_img,true);\n                    break;\n                default :\n                    return;\n            }\n        }else{\n            $ifwaterimage = 0;\n            $temp = imagettfbbox(ceil($w_font*2.5), 0, '../../texb.ttf', $w_text); //imagettfbbox返回一个含有 8 个单元的数组表示了文本外框的四个角\n            $width = $temp[2] - $temp[6];\n            $height = $temp[3] - $temp[7];\n            unset($temp);\n        }\n        \n        switch($w_pos) {\n            case 1:\n                $wx = 5;\n                $wy = 5;\n                break;\n            case 2:\n                $wx = ($source_w - $width) / 2;\n                $wy = 0;\n                break;\n            case 3:\n                $wx = $source_w - $width;\n                $wy = 0;\n                break;\n            case 4:\n                $wx = 0;\n                $wy = ($source_h - $height) / 2;\n                break;\n            case 5:\n                $wx = ($source_w - $width) / 2;\n                $wy = ($source_h - $height) / 2;\n                break;\n            case 6:\n                $wx = $source_w - $width;\n                $wy = ($source_h - $height) / 2;\n                break;\n            case 7:\n                $wx = 0;\n                $wy = $source_h - $height;\n                break;\n            case 8:\n                $wx = ($source_w - $width) / 2;\n                $wy = $source_h - $height;\n                break;\n            case 9:\n                $wx = $source_w - ($width+5);\n                $wy = $source_h - ($height+5);\n                break;\n            case 10:\n                $wx = rand(0,($source_w - $width));\n                $wy = rand(0,($source_h - $height));\n                break;\n            default:\n                $wx = rand(0,($source_w - $width));\n                $wy = rand(0,($source_h - $height));\n                break;\n        }\n        \n        if($ifwaterimage) {\n            if($water_info[2] == 3) {\n                imagecopy($source_img, $water_img, $wx, $wy, 0, 0, $width, $height);\n            }else{\n                imagecopymerge($source_img, $water_img, $wx, $wy, 0, 0, $width, $height, $this->w_pct);\n            }\n        }else{\n            if(!empty($w_color) && (strlen($w_color)==7)) {\n                $r = hexdec(substr($w_color,1,2));\n                $g = hexdec(substr($w_color,3,2));\n                $b = hexdec(substr($w_color,5));\n            }else{\n                return;\n            }\n            imagestring($source_img,$w_font,$wx,$wy,$w_text,imagecolorallocate($source_img,$r,$g,$b));\n        }\n        \n        switch($source_info[2]) {\n            case 1 :\n                imagegif($source_img, $target);\n                //GIF 格式将图像输出到浏览器或文件(欲输出的图像资源, 指定输出图像的文件名)\n                break;\n            case 2 :\n                imagejpeg($source_img, $target, $this->w_quality);\n                break;\n            case 3 :\n                imagepng($source_img, $target);\n                break;\n            default :\n                return;\n        }\n        \n        if(isset($water_info)){\n            unset($water_info);\n        }\n        if(isset($water_img)) {\n            imagedestroy($water_img);\n        }\n        unset($source_info);\n        imagedestroy($source_img);\n        return true;\n    }\n    public function watermark($title,$path){\n        \n        // 图片路径\n        $imagePath = $path;\n        // 文字水印内容\n        $text = $title;\n        // 每行文字数\n        $charsPerLine = $this->webconf['text_num'] ?: 10;\n        // 文字大小\n        $fontSize = $this->webconf['text_size'] ?: 24;\n        // 文字行高\n        $lineHeight = $this->webconf['text_h'] ?: 34;\n        // 文字间距\n        $letterSpacing = $this->webconf['text_m'] ?: 2;\n        // 文字颜色（RGB格式）\n        $color = [$this->webconf['text_rgb1'] ?: 255, $this->webconf['text_rgb2'] ?: 255, $this->webconf['text_rgb3'] ?: 255];\n        // 文字字体路径\n        $fontPath = $this->webconf['text_font'] ? APP_PATH.'static/common/'.$this->webconf['text_font']:APP_PATH.'static/common/simsun.ttf';\n        // 文字水印位置（1-9，左上到右下）\n        $position = $this->webconf['text_wz'] ?: 5;\n        \n        // 创建图像资源\n        //$image = imagecreatefromjpeg($imagePath);\n        if(stripos($imagePath,'.png')!==false){\n            $image = imagecreatefrompng($imagePath);\n        }else if(stripos($imagePath,'.gif')!==false){\n            $image = imagecreatefromgif($imagePath);\n        }else{\n            $image = imagecreatefromjpeg($imagePath);\n        }\n        // 设置字体文件路径 ---高版本已经废弃\n        //putenv('GDFONTPATH=' . realpath('.'));\n        // 设置文字颜色\n        $textColor = imagecolorallocate($image, $color[0], $color[1], $color[2]);\n        \n        // 获取图像尺寸\n        $imageWidth = imagesx($image);\n        $imageHeight = imagesy($image);\n        //echo $imageWidth.'-'.$imageHeight.'<br>';\n        // 计算文字宽度和高度\n        $textBoundingBox = imagettfbbox($fontSize, 0, $fontPath, $text);\n        $textWidth = $textBoundingBox[2] - $textBoundingBox[0];\n        $textHeight = $textBoundingBox[1] - $textBoundingBox[7];\n        //echo $textWidth.'-'.$textHeight.'<br>';\n        \n        \n        // 处理文字水印内容并自动换行\n        $lines = [];\n        $line = '';\n        //$chars = mb_str_split($text);\n        $chars = $this->smb_str_split($text);\n        $newlines = [];\n        $l = '';\n        $n = 1;//行数\n        foreach($chars as $k=>$v){\n            $l.=$v;\n            if( ($k+1)%$charsPerLine==0){\n                $newlines[] = $l;\n                $l = '';\n                $n += 1;\n            }\n        }\n        $newlines[] = $l;\n        //var_dump($newlines);exit;\n        //计算文字真实和宽度\n        $old = $textHeight+2;\n        $textHeight = count($newlines) * $old;\n        if($n==1){\n            $textWidth = $old * count($chars);\n        }else{\n            $textWidth = $old * $charsPerLine;\n        }\n        \n        \n        // 计算水印位置\n        switch ($position) {\n            case 1: // 左上\n                $x = 0;\n                $y = 0;\n                break;\n            case 2: // 上\n                $x = ($imageWidth - $textWidth) / 2;\n                $y = 0;\n                break;\n            case 3: // 右上\n                $x = $imageWidth - $textWidth;\n                $y = 0;\n                break;\n            case 4: // 左\n                $x = 0;\n                $y = ($imageHeight - $textHeight) / 2;\n                break;\n            case 5: // 居中\n                $x = ($imageWidth - $textWidth) / 2;\n                $y = ($imageHeight - $textHeight) / 2;\n                break;\n            case 6: // 右\n                $x = $imageWidth - $textWidth;\n                $y = ($imageHeight - $textHeight) / 2;\n                break;\n            case 7: // 左下\n                $x = 0;\n                $y = $imageHeight - $textHeight;\n                break;\n            case 8: // 下\n                $x = ($imageWidth - $textWidth) / 2;\n                $y = $imageHeight - $textHeight;\n                break;\n            case 9: // 右下\n                $x = $imageWidth - $textWidth;\n                $y = $imageHeight - $textHeight;\n                break;\n            default: // 默认为右下\n                $x = $imageWidth - $textWidth;\n                $y = $imageHeight - $textHeight;\n                break;\n        }\n        \n        // 添加文字水印\n        $y = $y + $fontSize;\n        \n        //微调\n        $x = $x + $this->webconf['text_x'];\n        $y = $y + $this->webconf['text_y'];\n        \n        foreach ($newlines as $line) {\n            ///echo '('.$x.','.$y.')<br>';\n            imagettftext($image, $fontSize, 0, $x, $y, $textColor, $fontPath, $line);\n            $y += $lineHeight;\n            \n            \n        }\n        //var_dump($newlines);\n        \n        // 输出图像\n        //header('Content-Type: image/jpeg');\n        //imagejpeg($image);\n        $p = explode('.',$imagePath);\n        $pic = end($p);\n        // 生成新的图像文件名\n        \n        $source = 'static/upload/images/'.date('YmdHis').rand(1000,9999).'.'.$pic; // 替换为你想要保存的图像文件路径和文件名\n        $source = $imagePath; // 替换为你想要保存的图像文件路径和文件名\n        $newImagePath = $source;\n        \n        // 保存图像到文件\n        //imagejpeg($image, $newImagePath);\n        //imagepng($image, $newImagePath);\n        //imagegif($image, $newImagePath);\n        \n        if(stripos($imagePath,'.png')!==false){\n            imagepng($image, $newImagePath);\n        }else if(stripos($imagePath,'.gif')!==false){\n            imagegif($image, $newImagePath);\n        }else{\n            imagejpeg($image, $newImagePath);\n        }\n        \n        \n        // 释放资源\n        imagedestroy($image);\n        \n        //return '/'.$source;\n    }\n    \n    \n    // 将字符串拆分为单个字符\n    function smb_str_split($string, $split_length = 1, $encoding = null) {\n        if ($split_length < 1) {\n            return false;\n        }\n        if ($encoding === null) {\n            $encoding = mb_internal_encoding();\n        }\n        $result = [];\n        $length = mb_strlen($string, $encoding);\n        for ($i = 0; $i < $length; $i += $split_length) {\n            $result[] = mb_substr($string, $i, $split_length, $encoding);\n        }\n        return $result;\n    }\n\n    public function check($image){\n        return extension_loaded('gd') && preg_match(\"/\\.(jpg|jpeg|gif|png)/i\", $image, $m) && file_exists($image) && function_exists('imagecreatefrom'.($m[1] == 'jpg' ? 'jpeg' : $m[1]));\n    }\n    /**\n     * 上传文件的主处理方法\n     * @return mixed\n     */\n    private function upFile()\n    {\n        $file = $this->file = $_FILES[$this->fileField];\n        if (!$file) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_FILE_NOT_FOUND\");\n            return;\n        }\n        if ($this->file['error']) {\n            $this->stateInfo = $this->getStateInfo($file['error']);\n            return;\n        } else if (!file_exists($file['tmp_name'])) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TMP_FILE_NOT_FOUND\");\n            return;\n        } else if (!is_uploaded_file($file['tmp_name'])) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TMPFILE\");\n            return;\n        }\n\n        $this->oriName = $file['name'];\n        $this->fileSize = $file['size'];\n        $this->fileType = $this->getFileExt();\n        $this->fullName = $this->getFullName();\n        $this->filePath = $this->getFilePath();\n        $this->fileName = $this->getFileName();\n        $dirname = dirname($this->filePath);\n\n        //检查文件大小是否超出限制\n        if (!$this->checkSize()) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_SIZE_EXCEED\");\n            return;\n        }\n\n        //检查是否不允许的文件格式\n        if (!$this->checkType()) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TYPE_NOT_ALLOWED\");\n            return;\n        }\n        \n        // 安全加固:禁止上传危险文件(可被解析执行的文件)\n        $dangerousExtensions = [\n            '.php', '.php3', '.php4', '.php5', '.php7', '.phtml', '.phps',\n            '.asp', '.aspx', '.cer', '.cdx',\n            '.jsp', '.jspx',\n            '.cgi', '.pl', '.py',\n            '.htaccess', '.htpasswd', '.user.ini',\n            '.exe', '.bat', '.cmd', '.com',\n            '.sh', '.bash', '.zsh'\n        ];\n        \n        $fileExt = strtolower($this->getFileExt());\n        if (in_array($fileExt, $dangerousExtensions)) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TYPE_NOT_ALLOWED\");\n            return;\n        }\n        \n        // 检查原始文件名是否包含危险扩展名(防止双重扩展名攻击)\n        if(stripos($this->oriName,'.php')!==false || stripos($this->oriName,'.phtml')!==false || \n           stripos($this->oriName,'.htaccess')!==false || stripos($this->oriName,'.user.ini')!==false ||\n           stripos($this->oriName,'.asp')!==false || stripos($this->oriName,'.jsp')!==false) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TYPE_NOT_ALLOWED\");\n            return;\n        }\n\n        //创建目录失败\n        if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_CREATE_DIR\");\n            return;\n        } else if (!is_writeable($dirname)) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_DIR_NOT_WRITEABLE\");\n            return;\n        }\n\n        if (!(move_uploaded_file($file[\"tmp_name\"], $this->filePath) && file_exists($this->filePath))) { //移动失败\n            $this->stateInfo = $this->getStateInfo(\"ERROR_FILE_MOVE\");\n        } else { //移动成功\n            $this->stateInfo = $this->stateMap[0];\n            $this->save_files($this->filePath);\n        }\n    }\n\n    /**\n     * 处理base64编码的图片上传\n     * @return mixed\n     */\n    private function upBase64()\n    {\n        $base64Data = $_POST[$this->fileField];\n        $img = base64_decode($base64Data);\n\n        $this->oriName = $this->config['oriName'];\n        $this->fileSize = strlen($img);\n        $this->fileType = $this->getFileExt();\n        $this->fullName = $this->getFullName();\n        $this->filePath = $this->getFilePath();\n        $this->fileName = $this->getFileName();\n        $dirname = dirname($this->filePath);\n\n\n        //检查文件大小是否超出限制\n        if (!$this->checkSize()) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_SIZE_EXCEED\");\n            return;\n        }\n        \n        // 安全加固:禁止上传危险文件\n        $dangerousExtensions = [\n            '.php', '.php3', '.php4', '.php5', '.php7', '.phtml', '.phps',\n            '.asp', '.aspx', '.cer', '.cdx',\n            '.jsp', '.jspx',\n            '.cgi', '.pl', '.py',\n            '.htaccess', '.htpasswd', '.user.ini',\n            '.exe', '.bat', '.cmd', '.com',\n            '.sh', '.bash', '.zsh'\n        ];\n        \n        $fileExt = strtolower($this->getFileExt());\n        if (in_array($fileExt, $dangerousExtensions)) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TYPE_NOT_ALLOWED\");\n            return;\n        }\n        \n        if(stripos($this->oriName,'.php')!==false || stripos($this->oriName,'.phtml')!==false || \n           stripos($this->oriName,'.htaccess')!==false || stripos($this->oriName,'.user.ini')!==false) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TYPE_NOT_ALLOWED\");\n            return;\n        }\n        //创建目录失败\n        if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_CREATE_DIR\");\n            return;\n        } else if (!is_writeable($dirname)) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_DIR_NOT_WRITEABLE\");\n            return;\n        }\n\n        //检查是否不允许的文件格式\n        if (!$this->checkType()) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TYPE_NOT_ALLOWED\");\n            return;\n        }\n\n        //移动文件\n        if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败\n            $this->stateInfo = $this->getStateInfo(\"ERROR_WRITE_CONTENT\");\n        } else { //移动成功\n            $this->stateInfo = $this->stateMap[0];\n            $this->save_files($this->filePath);\n        }\n\n    }\n\n    /**\n     * 拉取远程图片\n     * @return mixed\n     */\n    private function saveRemote()\n    {\n        $imgUrl = htmlspecialchars($this->fileField);\n        $imgUrl = str_replace(\"&amp;\", \"&\", $imgUrl);\n\n        //http开头验证\n        if (strpos($imgUrl, \"http\") !== 0) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_HTTP_LINK\");\n            return;\n        }\n        \n        // 安全加固:禁止抓取危险文件\n        if(stripos($imgUrl,'.php')!==false || stripos($imgUrl,'.phtml')!==false ||\n           stripos($imgUrl,'.htaccess')!==false || stripos($imgUrl,'.user.ini')!==false ||\n           stripos($imgUrl,'.asp')!==false || stripos($imgUrl,'.jsp')!==false) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TYPE_NOT_ALLOWED\");\n            return;\n        }\n        \n        preg_match('/(^https*:\\/\\/[^:\\/]+)/', $imgUrl, $matches);\n        $host_with_protocol = count($matches) > 1 ? $matches[1] : '';\n\n        // 判断是否是合法 url\n        if (!filter_var($host_with_protocol, FILTER_VALIDATE_URL)) {\n            $this->stateInfo = $this->getStateInfo(\"INVALID_URL\");\n            return;\n        }\n\n        preg_match('/^https*:\\/\\/(.+)/', $host_with_protocol, $matches);\n        $host_without_protocol = count($matches) > 1 ? $matches[1] : '';\n\n        // 此时提取出来的可能是 ip 也有可能是域名，先获取 ip\n        $ip = gethostbyname($host_without_protocol);\n        // 判断是否是私有 ip\n        if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) {\n            $this->stateInfo = $this->getStateInfo(\"INVALID_IP\");\n            return;\n        }\n        $fix = strtolower(strrchr($imgUrl, '.'));\n        $fix = $fix ?: '.png';\n        //检查是否不允许的文件格式\n        if (!in_array($fix, $this->config[\"allowFiles\"])) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_TYPE_NOT_ALLOWED\");\n            return;\n        }\n\n        //获取请求头并检测死链\n        $heads = get_headers($imgUrl, 1);\n        if (!(stristr($heads[0], \"200\") && stristr($heads[0], \"OK\"))) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_DEAD_LINK\");\n            return;\n        }\n\n        if (!isset($heads['Content-Type']) || !stristr($heads['Content-Type'], \"image\")) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_HTTP_CONTENTTYPE\");\n            return;\n        }\n\n        //打开输出缓冲区并获取远程图片\n        ob_start();\n        $context = stream_context_create(\n            array('http' => array(\n                'follow_location' => false // don't follow redirects\n            ))\n        );\n        readfile($imgUrl, false, $context);\n        $img = ob_get_contents();\n        ob_end_clean();\n        preg_match(\"/[\\/]([^\\/]*)[\\.]?[^\\.\\/]*$/\", $imgUrl, $m);\n\n        $this->oriName = $m ? $m[1]:\"\";\n        $this->fileSize = strlen($img);\n        $this->fileType = $this->getFileExt();\n        $this->fullName = $this->getFullName();\n        $this->filePath = $this->getFilePath();\n        $this->fileName = $this->getFileName();\n        $dirname = dirname($this->filePath);\n\n        //检查文件大小是否超出限制\n        if (!$this->checkSize()) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_SIZE_EXCEED\");\n            return;\n        }\n\n        //创建目录失败\n        if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_CREATE_DIR\");\n            return;\n        } else if (!is_writeable($dirname)) {\n            $this->stateInfo = $this->getStateInfo(\"ERROR_DIR_NOT_WRITEABLE\");\n            return;\n        }\n\n        //移动文件\n        if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败\n            $this->stateInfo = $this->getStateInfo(\"ERROR_WRITE_CONTENT\");\n        } else { //移动成功\n            $this->stateInfo = $this->stateMap[0];\n            $this->save_files($this->filePath);\n        }\n\n    }\n\n    /**\n     * 上传错误检查\n     * @param $errCode\n     * @return string\n     */\n    private function getStateInfo($errCode)\n    {\n        return !$this->stateMap[$errCode] ? $this->stateMap[\"ERROR_UNKNOWN\"] : $this->stateMap[$errCode];\n    }\n\n    /**\n     * 获取文件扩展名\n     * @return string\n     */\n    private function getFileExt()\n    {\n        $fix = strtolower(strrchr($this->oriName, '.'));\n        return $fix ? $fix : '.png';\n    }\n\n    /**\n     * 重命名文件\n     * @return string\n     */\n    private function getFullName()\n    {\n        //替换日期事件\n        $t = time();\n        $d = explode('-', date(\"Y-y-m-d-H-i-s\"));\n        $format = $this->config[\"pathFormat\"];\n        $format = str_replace(\"{yyyy}\", $d[0], $format);\n        $format = str_replace(\"{yy}\", $d[1], $format);\n        $format = str_replace(\"{mm}\", $d[2], $format);\n        $format = str_replace(\"{dd}\", $d[3], $format);\n        $format = str_replace(\"{hh}\", $d[4], $format);\n        $format = str_replace(\"{ii}\", $d[5], $format);\n        $format = str_replace(\"{ss}\", $d[6], $format);\n        $format = str_replace(\"{time}\", $t, $format);\n\n        //过滤文件名的非法自负,并替换文件名\n        $oriName = substr($this->oriName, 0, strrpos($this->oriName, '.'));\n        $oriName = preg_replace(\"/[\\|\\?\\\"\\<\\>\\/\\*\\\\\\\\]+/\", '', $oriName);\n        $format = str_replace(\"{filename}\", $oriName, $format);\n\n        //替换随机字符串\n        $randNum = mt_rand(1, 100000) . mt_rand(1, 100000);\n        if (preg_match(\"/\\{rand\\:([\\d]*)\\}/i\", $format, $matches)) {\n            $format = preg_replace(\"/\\{rand\\:[\\d]*\\}/i\", substr($randNum, 0, $matches[1]), $format);\n        }\n\n        $ext = $this->getFileExt();\n        return $format . $ext;\n    }\n\n    /**\n     * 获取文件名\n     * @return string\n     */\n    private function getFileName () {\n        return substr($this->filePath, strrpos($this->filePath, '/') + 1);\n    }\n\n    /**\n     * 获取文件完整路径\n     * @return string\n     */\n    private function getFilePath()\n    {\n        $fullname = $this->fullName;\n        $rootPath = $_SERVER['DOCUMENT_ROOT'];\n\n        if (substr($fullname, 0, 1) != '/') {\n            $fullname = '/' . $fullname;\n        }\n\n        return $rootPath . $fullname;\n    }\n\n    /**\n     * 文件类型检测\n     * @return bool\n     */\n    private function checkType()\n    {\n        return in_array($this->getFileExt(), $this->config[\"allowFiles\"]);\n    }\n\n    /**\n     * 文件大小检测\n     * @return bool\n     */\n    private function  checkSize()\n    {\n        return $this->fileSize <= ($this->config[\"maxSize\"]);\n    }\n\n    /**\n     * 获取当前上传成功文件的各项信息\n     * @return array\n     */\n    public function getFileInfo()\n    {\n        return array(\n            \"state\" => $this->stateInfo,\n            \"url\" => $this->fullName,\n            \"title\" => $this->fileName,\n            \"original\" => $this->oriName,\n            \"type\" => $this->fileType,\n            \"size\" => $this->fileSize\n        );\n    }\n\n    //引入系统，并存入数据库\n    public function save_files($filename){\n        \n        if($this->webconf['iswatermark']){\n            if($this->webconf['watermark_file']){\n                $this->watermarkImg($this->filePath,$this->filePath,$this->webconf['watermark_t'],$this->webconf['watermark_file']);\n            }else{\n                $this->watermark($this->webconf['watermark_word'],$this->filePath);\n            }\n            \n        }\n        //新增一条数据\n        $filesize = round(filesize($filename)/1024,2);\n        $file_url = str_replace($_SERVER['DOCUMENT_ROOT'],'',$filename);\n        $userid = $_SESSION['member'] ? $_SESSION['member']['id'] : ($_SESSION['admin'] ? $_SESSION['admin']['id'] : 0);\n        M('pictures')->add(['litpic'=>$file_url,'addtime'=>time(),'userid'=>$userid,'size'=>$filesize,'filetype'=>str_replace('.','',$this->fileType)]);\n\n    }\n\n}"
  },
  {
    "path": "frphp/extend/Vercode.php",
    "content": "<?php\r\n\tclass Imagecode{\r\n\t\tprivate $width ;\r\n\t\tprivate $height;\r\n\t\tprivate $counts;\r\n\t\tprivate $distrubcode;\r\n\t\tprivate $fonturl;\r\n\t\tprivate $session;\r\n\t\tprivate $code;\r\n\t\tfunction __construct($width = 120,$height = 30,$counts = 5,$code='frcode',$fonturl=''){\r\n\t\t\t$this->width=$width;\r\n\t\t\t$this->height=$height;\r\n\t\t\t$this->counts=$counts;\r\n\t\t\t$this->distrubcode= \"1235467890qwertyuipkjhgfdaszxcvbnm\";\r\n\t\t\t$this->fonturl=$fonturl;\r\n\t\t\t$this->session=$this->sessioncode();\r\n\t\t\tif(strtolower($code)=='admin' || strtolower($code)=='member'){\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif(isset($GLOBALS['Redis']) && $GLOBALS['Redis']!==null){\r\n                $GLOBALS['Redis']->setex($code,5 * 60 ,md5(md5($this->session)));\r\n            }\r\n\t\t\t\r\n            if (!session_id()) {\r\n                setcookie($code,md5(md5($this->session)),time() + 5*60,'/');\r\n            }else{\r\n                $_SESSION[$code] = md5(md5($this->session));\r\n            }\r\n\r\n\t\t}\r\n\t\t\r\n\t\t function imageout(){\r\n\t\t\t$im=$this->createimagesource();\r\n\t\t\t$this->setbackgroundcolor($im);\r\n\t\t\t$this->set_code($im);\r\n\t\t\t$this->setdistrubecode($im);\r\n\t\t\tHeader(\"Content-type: image/GIF\");\r\n\t\t\tImageGIF($im);\r\n\t\t\tImageDestroy($im); \r\n\t\t}\r\n\t\t\r\n\t\tprivate function createimagesource(){\r\n\t\t\treturn imagecreate($this->width,$this->height);\r\n\t\t}\r\n\t\tprivate function setbackgroundcolor($im){\r\n\t\t\t$bgcolor = ImageColorAllocate($im, rand(200,255),rand(200,255),rand(200,255));\r\n\t\t\timagefill($im,0,0,$bgcolor);\r\n\t\t}\r\n\t\tprivate function setdistrubecode($im){\r\n\t\t\t$count_h=$this->height;\r\n\t\t\t$cou=floor($count_h/2);\r\n\t\t\t$cou = 0;\r\n\t\t\tfor($i=0;$i<$cou;$i++){\r\n\t\t\t\t$x=rand(0,$this->width);\r\n\t\t\t\t$y=rand(0,$this->height);\r\n\t\t\t\t$jiaodu=rand(0,360);\r\n\t\t\t\t$fontsize=rand(8,15);\r\n\t\t\t\t$fonturl=$this->fonturl;\r\n\t\t\t\t$originalcode = $this->distrubcode;\r\n\t\t\t\t$countdistrub = strlen($originalcode);\r\n\t\t\t\t$dscode = $originalcode[rand(0,$countdistrub-1)];\r\n\t\t\t\t$color = ImageColorAllocate($im, rand(40,140),rand(40,140),rand(40,140));\r\n\t\t\t\t//$color = ImageColorAllocate($im, 255,255,255);\r\n\t\t\t\timagettftext($im,$fontsize,$jiaodu,$x,$y,$color,$fonturl,$dscode);\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\tprivate function set_code($im){\r\n\t\t\t\t$width=$this->width;\r\n\t\t\t\t$counts=$this->counts;\r\n\t\t\t\t$height=$this->height;\r\n\t\t\t\t$scode=$this->session;\r\n\t\t\t\t$y=floor($height/2)+floor($height/4);\r\n\t\t\t\t$fontsize=rand(30,35);\r\n\t\t\t\t$fonturl=$this->fonturl;\r\n\t\t\t\tfor($i=0;$i<$counts;$i++){\r\n\t\t\t\t\t$char=$scode[$i];\r\n\t\t\t\t\t$x=floor($width/$counts)*$i+8;\r\n\t\t\t\t\t$jiaodu=rand(-20,30);\r\n\t\t\t\t\t//$color = ImageColorAllocate($im,rand(0,50),rand(50,100),rand(100,140));\r\n\t\t\t\t\t$color = ImageColorAllocate($im,rand(50,200),rand(50,200),rand(50,200));\r\n\t\t\t\t\timagettftext($im,$fontsize,$jiaodu,$x,$y,$color,$fonturl,$char);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\tpublic function sessioncode(){\r\n\t\t\t\t$originalcode = $this->distrubcode;\r\n\t\t\t\t$countdistrub = strlen($originalcode);\r\n\t\t\t\t$_dscode = \"\";\r\n\t\t\t\t$counts=$this->counts;\r\n\t\t\t\tfor($j=0;$j<$counts;$j++){\r\n\t\t\t\t\t$dscode = $originalcode[rand(0,$countdistrub-1)];\r\n\t\t\t\t\t$_dscode.=$dscode;\r\n\t\t\t\t}\r\n\t\t\t\treturn $_dscode;\r\n\t\t\t\t\r\n\t\t}\r\n\t}"
  },
  {
    "path": "frphp/extend/compressimage.php",
    "content": "<?php\n\nclass compressimage{\nprivate $src;\nprivate $imageinfo;\nprivate $image;\npublic $percent = 0.1;\npublic $ispngcompress = 0;\npublic $quality = 75;\npublic function __construct($src){\n$this->src = $src;\n}\n/**打开图片*/\npublic function openImage(){\nlist($width, $height, $type, $attr) = getimagesize($this->src);\n$this->imageinfo = array(\n'width'=>$width,\n'height'=>$height,\n'type'=>image_type_to_extension($type,false),\n'attr'=>$attr\n);\n$fun = \"imagecreatefrom\".$this->imageinfo['type'];\n$this->image = $fun($this->src);\n}\n/**操作图片*/\npublic function thumpImage(){\n$new_width = $this->imageinfo['width'] * $this->percent;\n$new_height = $this->imageinfo['height'] * $this->percent;\n$image_thump = imagecreatetruecolor($new_width,$new_height);//将原图复制带图片载体上面，并且按照一定比例压缩,极大的保持了清晰度\nif($this->imageinfo['type']=='png' || $this->imageinfo['type']=='gif'){\n\t$color = imagecolorallocate($image_thump, 255, 255, 255);\n\timagefill($image_thump, 0, 0, $color);\n\timagecolortransparent($image_thump, $color);\n}\nimagecopyresampled($image_thump,$this->image,0,0,0,0,$new_width,$new_height,$this->imageinfo['width'],$this->imageinfo['height']);\nimagedestroy($this->image);\n$this->image = $image_thump;\n} \n/**输出图片*/\npublic function showImage(){\nheader('Content-Type: image/'.$this->imageinfo['type']);\n$funcs = \"image\".$this->imageinfo['type'];\n$funcs($this->image);\n}\n/**保存图片到硬盘*/\npublic function saveImage($name){\n$funcs = \"image\".$this->imageinfo['type'];\n\nif($this->imageinfo['type']=='gif'){\n\t//不压缩\n\t$funcs($this->image,$name);\n}else if($this->imageinfo['type']=='png'){\n    if($this->ispngcompress==1){\n        //其余一律按jpg格式压缩\n\t    imagejpeg($this->image,$name,$this->quality);\n    }else{\n        $funcs($this->image,$name);\n    }\n\t\n}else{\n    imagejpeg($this->image,$name,$this->quality);\n}\n//$funcs($this->image,$name);\n//imagejpeg($this->image,$name);\n\n}\n/**销毁图片*/\npublic function __destruct(){\nimagedestroy($this->image);\n}\n\n\n\n}\n\n"
  },
  {
    "path": "frphp/extend/pay/alipay/AlipayService.php",
    "content": "<?php\n\nclass AlipayService\n{\n    protected $appId;\n    protected $returnUrl;\n    protected $notifyUrl;\n    protected $charset;\n    //私钥值\n    protected $rsaPrivateKey;\n    protected $totalFee;\n    protected $outTradeNo;\n    protected $orderName;\n    public function __construct()\n    {\n        $this->charset = 'utf8';\n    }\n    public function setAppid($appid)\n    {\n        $this->appId = $appid;\n    }\n    public function setReturnUrl($returnUrl)\n    {\n        $this->returnUrl = $returnUrl;\n    }\n    public function setNotifyUrl($notifyUrl)\n    {\n        $this->notifyUrl = $notifyUrl;\n    }\n    public function setRsaPrivateKey($saPrivateKey)\n    {\n        $this->rsaPrivateKey = $saPrivateKey;\n    }\n    public function setTotalFee($payAmount)\n    {\n        $this->totalFee = $payAmount;\n    }\n    public function setOutTradeNo($outTradeNo)\n    {\n        $this->outTradeNo = $outTradeNo;\n    }\n    public function setOrderName($orderName)\n    {\n        $this->orderName = $orderName;\n    }\n    /**\n     * 发起订单\n     * @return array\n     */\n    public function doPay()\n    {\n        //请求参数\n        $requestConfigs = array(\n            'out_trade_no'=>$this->outTradeNo,\n            'product_code'=>'FAST_INSTANT_TRADE_PAY',\n            'total_amount'=>$this->totalFee, //单位 元\n            'subject'=>$this->orderName,  //订单标题\n        );\n        $commonConfigs = array(\n            //公共参数\n            'app_id' => $this->appId,\n            'method' => 'alipay.trade.page.pay',             //接口名称\n            'format' => 'JSON',\n            'return_url' => $this->returnUrl,\n            'charset'=>$this->charset,\n            'sign_type'=>'RSA2',\n            'timestamp'=>date('Y-m-d H:i:s'),\n            'version'=>'1.0',\n            'notify_url' => $this->notifyUrl,\n            'biz_content'=>json_encode($requestConfigs),\n        );\n        $commonConfigs[\"sign\"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);\n        return $this->buildRequestForm($commonConfigs);\n    }\n    //手机wap支付\n    public function mPay()\n    {\n        //请求参数\n        $requestConfigs = array(\n            'out_trade_no'=>$this->outTradeNo,\n            'product_code'=>'QUICK_WAP_WAY',\n            'total_amount'=>$this->totalFee, //单位 元\n            'subject'=>$this->orderName,  //订单标题\n        );\n        $commonConfigs = array(\n            //公共参数\n            'app_id' => $this->appId,\n            'method' => 'alipay.trade.wap.pay',             //接口名称\n            'format' => 'JSON',\n            'return_url' => $this->returnUrl,\n            'charset'=>$this->charset,\n            'sign_type'=>'RSA2',\n            'timestamp'=>date('Y-m-d H:i:s'),\n            'version'=>'1.0',\n            'notify_url' => $this->notifyUrl,\n            'biz_content'=>json_encode($requestConfigs),\n        );\n        $commonConfigs[\"sign\"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);\n        return $this->buildRequestForm($commonConfigs);\n    }\n    //微信\n    public function wxPay()\n    {\n        //请求参数\n        $requestConfigs = array(\n            'out_trade_no'=>$this->outTradeNo,\n            'product_code'=>'QUICK_WAP_WAY',\n            'total_amount'=>$this->totalFee, //单位 元\n            'subject'=>$this->orderName,  //订单标题\n        );\n        $commonConfigs = array(\n            //公共参数\n            'app_id' => $this->appId,\n            'method' => 'alipay.trade.wap.pay',             //接口名称\n            'format' => 'JSON',\n            'return_url' => $this->returnUrl,\n            'charset'=>$this->charset,\n            'sign_type'=>'RSA2',\n            'timestamp'=>date('Y-m-d H:i:s'),\n            'version'=>'1.0',\n            'notify_url' => $this->notifyUrl,\n            'biz_content'=>json_encode($requestConfigs),\n        );\n        $commonConfigs[\"sign\"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);\n        return $commonConfigs;\n    }\n\n    /**\n     * 发起订单\n     * @return array\n     */\n    public function dmfPay()\n    {\n        //请求参数\n        $requestConfigs = array(\n            'out_trade_no'=>$this->outTradeNo,\n            'total_amount'=>$this->totalFee, //单位 元\n            'subject'=>$this->orderName,  //订单标题\n            'timeout_express'=>'2h'       //该笔订单允许的最晚付款时间，逾期将关闭交易。取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。 该参数数值不接受小数点， 如 1.5h，可转换为 90m。\n        );\n        $commonConfigs = array(\n            //公共参数\n            'app_id' => $this->appId,\n            'method' => 'alipay.trade.precreate',             //接口名称\n            'format' => 'JSON',\n            'charset'=>$this->charset,\n            'sign_type'=>'RSA2',\n            'timestamp'=>date('Y-m-d H:i:s'),\n            'version'=>'1.0',\n            'notify_url' => $this->notifyUrl,\n            'biz_content'=>json_encode($requestConfigs),\n        );\n        $commonConfigs[\"sign\"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);\n        $result = $this->curlPost('https://openapi.alipay.com/gateway.do?charset='.$this->charset,$commonConfigs);\n        return json_decode($result,true);\n    }\n\tpublic function curlPost($url = '', $postData = '', $options = array())\n    {\n        if (is_array($postData)) {\n            $postData = http_build_query($postData);\n        }\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);\n        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数\n        if (!empty($options)) {\n            curl_setopt_array($ch, $options);\n        }\n        //https请求 不验证证书和host\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        $data = curl_exec($ch);\n        curl_close($ch);\n        return $data;\n    }\n    /**\n     * 建立请求，以表单HTML形式构造（默认）\n     * @param $para_temp 请求参数数组\n     * @return 提交表单HTML文本\n     */\n    protected function buildRequestForm($para_temp) {\n        $sHtml = \"正在跳转至支付页面...<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=\".$this->charset.\"' method='POST'>\";\n\t\tforeach($para_temp as $key=>$val){\n            if (false === $this->checkEmpty($val)) {\n                $val = str_replace(\"'\",\"&apos;\",$val);\n                $sHtml.= \"<input type='hidden' name='\".$key.\"' value='\".$val.\"'/>\";\n            }\t\n\t\t}\n        //submit按钮控件请不要含有name属性\n        $sHtml = $sHtml.\"<input type='submit' value='ok' style='display:none;''></form>\";\n        $sHtml = $sHtml.\"<script>document.forms['alipaysubmit'].submit();</script>\";\n        return $sHtml;\n    }\n    public function generateSign($params, $signType = \"RSA\") {\n        return $this->sign($this->getSignContent($params), $signType);\n    }\n    protected function sign($data, $signType = \"RSA\") {\n        $priKey=$this->rsaPrivateKey;\n        $res = \"-----BEGIN RSA PRIVATE KEY-----\\n\" .\n            wordwrap($priKey, 64, \"\\n\", true) .\n            \"\\n-----END RSA PRIVATE KEY-----\";\n        ($res) or die('您使用的私钥格式错误，请检查RSA私钥配置');\n        if (\"RSA2\" == $signType) {\n            openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持\n        } else {\n            openssl_sign($data, $sign, $res);\n        }\n        $sign = base64_encode($sign);\n        return $sign;\n    }\n    /**\n     * 校验$value是否非空\n     *  if not set ,return true;\n     *    if is null , return true;\n     **/\n    protected function checkEmpty($value) {\n        if (!isset($value))\n            return true;\n        if ($value === null)\n            return true;\n        if (trim($value) === \"\")\n            return true;\n        return false;\n    }\n    public function getSignContent($params) {\n        ksort($params);\n        $stringToBeSigned = \"\";\n        $i = 0;\n        foreach ($params as $k => $v) {\n            if (false === $this->checkEmpty($v) && \"@\" != substr($v, 0, 1)) {\n                // 转换成目标字符集\n                $v = $this->characet($v, $this->charset);\n                if ($i == 0) {\n                    $stringToBeSigned .= \"$k\" . \"=\" . \"$v\";\n                } else {\n                    $stringToBeSigned .= \"&\" . \"$k\" . \"=\" . \"$v\";\n                }\n                $i++;\n            }\n        }\n        unset ($k, $v);\n        return $stringToBeSigned;\n    }\n    /**\n     * 转换字符集编码\n     * @param $data\n     * @param $targetCharset\n     * @return string\n     */\n    function characet($data, $targetCharset) {\n        if (!empty($data)) {\n            $fileType = $this->charset;\n            if (strcasecmp($fileType, $targetCharset) != 0) {\n                $data = mb_convert_encoding($data, $targetCharset, $fileType);\n                //$data = iconv($fileType, $targetCharset.'//IGNORE', $data);\n            }\n        }\n        return $data;\n    }\n}"
  },
  {
    "path": "frphp/extend/pay/alipay/AlipayServiceCheck.php",
    "content": "<?php\n\nclass AlipayServiceCheck\n{\n    //支付宝公钥\n    protected $alipayPublicKey;\n    protected $charset;\n\n    public function __construct($alipayPublicKey)\n    {\n        $this->charset = 'utf8';\n        $this->alipayPublicKey=$alipayPublicKey;\n    }\n\n    /**\n     *  验证签名\n     **/\n    public function rsaCheck($params) {\n        $sign = $params['sign'];\n        $signType = $params['sign_type'];\n        unset($params['sign_type']);\n        unset($params['sign']);\n\t\tif(array_key_exists('s',$params)){\n\t\t\tunset($params['s']);\n\t\t}\n        return $this->verify($this->getSignContent($params), $sign, $signType);\n    }\n\n    function verify($data, $sign, $signType = 'RSA') {\n        $pubKey= $this->alipayPublicKey;\n        $res = \"-----BEGIN PUBLIC KEY-----\\n\" .\n            wordwrap($pubKey, 64, \"\\n\", true) .\n            \"\\n-----END PUBLIC KEY-----\";\n        ($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');\n\n        //调用openssl内置方法验签，返回bool值\n        if (\"RSA2\" == $signType) {\n            $result = (bool)openssl_verify($data, base64_decode($sign), $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256);\n        } else {\n            $result = (bool)openssl_verify($data, base64_decode($sign), $res);\n        }\n//        if(!$this->checkEmpty($this->alipayPublicKey)) {\n//            //释放资源\n//            openssl_free_key($res);\n//        }\n        return $result;\n    }\n\n    /**\n     * 校验$value是否非空\n     *  if not set ,return true;\n     *    if is null , return true;\n     **/\n    protected function checkEmpty($value) {\n        if (!isset($value))\n            return true;\n        if ($value === null)\n            return true;\n        if (trim($value) === \"\")\n            return true;\n\n        return false;\n    }\n\n    public function getSignContent($params) {\n        ksort($params);\n        $stringToBeSigned = \"\";\n        $i = 0;\n        foreach ($params as $k => $v) {\n            if (false === $this->checkEmpty($v) && \"@\" != substr($v, 0, 1)) {\n                // 转换成目标字符集\n                $v = $this->characet($v, $this->charset);\n                if ($i == 0) {\n                    $stringToBeSigned .= \"$k\" . \"=\" . \"$v\";\n                } else {\n                    $stringToBeSigned .= \"&\" . \"$k\" . \"=\" . \"$v\";\n                }\n                $i++;\n            }\n        }\n        unset ($k, $v);\n        return $stringToBeSigned;\n    }\n\n    /**\n     * 转换字符集编码\n     * @param $data\n     * @param $targetCharset\n     * @return string\n     */\n    function characet($data, $targetCharset) {\n        if (!empty($data)) {\n            $fileType = $this->charset;\n            if (strcasecmp($fileType, $targetCharset) != 0) {\n                $data = mb_convert_encoding($data, $targetCharset, $fileType);\n                //$data = iconv($fileType, $targetCharset.'//IGNORE', $data);\n            }\n        }\n        return $data;\n    }\n}"
  },
  {
    "path": "frphp/extend/pay/wechat/WxpayCheckOrder.php",
    "content": "<?php\n\nclass WxpayCheckOrder\n{\n    protected $mchid;\n    protected $appid;\n    protected $apiKey;\n    protected $returnUrl;\n    public function __construct($mchid, $appid, $key)\n    {\n        $this->mchid = $mchid;\n        $this->appid = $appid;\n        $this->apiKey = $key;\n    }\n    public function setReturnUrl($returnUrl)\n    {\n        $this->returnUrl = $returnUrl;\n    }\n    public function orderquery($outTradeNo)\n    {\n        $config = array(\n            'mch_id' => $this->mchid,\n            'appid' => $this->appid,\n            'key' => $this->apiKey,\n        );\n        //$orderName = iconv('GBK','UTF-8',$orderName);\n        $unified = array(\n            'appid' => $config['appid'],\n            'mch_id' => $config['mch_id'],\n            'out_trade_no' => $outTradeNo,\n            'nonce_str' => self::createNonceStr(),\n        );\n        $unified['sign'] = self::getSign($unified, $config['key']);\n        $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/orderquery', self::arrayToXml($unified));\n        $queryResult = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);\n        if ($queryResult === false) {\n            die('parse xml error');\n        }\n        if ($queryResult->return_code != 'SUCCESS') {\n            die($queryResult->return_msg);\n        }\n        $trade_state = $queryResult->trade_state;\n        $data['code'] = $trade_state=='SUCCESS' ? 0 : 1;\n        $data['data'] = $trade_state;\n        $data['msg'] = $this->getTradeSTate($trade_state);\n        $data['time'] = date('Y-m-d H:i:s');\n        return $data;exit();\n    }\n    public function getTradeSTate($str)\n    {\n        switch ($str){\n            case 'SUCCESS';\n                return '支付成功';\n            case 'REFUND';\n                return '转入退款';\n            case 'NOTPAY';\n                return '未支付';\n            case 'CLOSED';\n                return '已关闭';\n            case 'REVOKED';\n                return '已撤销（刷卡支付）';\n            case 'USERPAYING';\n                return '用户支付中';\n            case 'PAYERROR';\n                return '支付失败';\n        }\n    }\n    /**\n     * curl get\n     *\n     * @param string $url\n     * @param array $options\n     * @return mixed\n     */\n    public static function curlGet($url = '', $options = array())\n    {\n        $ch = curl_init($url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_TIMEOUT, 30);\n        if (!empty($options)) {\n            curl_setopt_array($ch, $options);\n        }\n        //https请求 不验证证书和host\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        $data = curl_exec($ch);\n        curl_close($ch);\n        return $data;\n    }\n    public static function curlPost($url = '', $postData = '', $options = array())\n    {\n        if (is_array($postData)) {\n            $postData = http_build_query($postData);\n        }\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);\n        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数\n        if (!empty($options)) {\n            curl_setopt_array($ch, $options);\n        }\n        //https请求 不验证证书和host\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        $data = curl_exec($ch);\n        curl_close($ch);\n        return $data;\n    }\n    public static function createNonceStr($length = 16)\n    {\n        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n        $str = '';\n        for ($i = 0; $i < $length; $i++) {\n            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);\n        }\n        return $str;\n    }\n    public static function arrayToXml($arr)\n    {\n        $xml = \"<xml>\";\n        foreach ($arr as $key => $val) {\n            if (is_numeric($val)) {\n                $xml .= \"<\" . $key . \">\" . $val . \"</\" . $key . \">\";\n            } else\n                $xml .= \"<\" . $key . \"><![CDATA[\" . $val . \"]]></\" . $key . \">\";\n        }\n        $xml .= \"</xml>\";\n        return $xml;\n    }\n    /**\n     * 获取签名\n     */\n    public static function getSign($params, $key)\n    {\n        ksort($params, SORT_STRING);\n        $unSignParaString = self::formatQueryParaMap($params, false);\n        $signStr = strtoupper(md5($unSignParaString . \"&key=\" . $key));\n        return $signStr;\n    }\n    protected static function formatQueryParaMap($paraMap, $urlEncode = false)\n    {\n        $buff = \"\";\n        ksort($paraMap);\n        foreach ($paraMap as $k => $v) {\n            if (null != $v && \"null\" != $v) {\n                if ($urlEncode) {\n                    $v = urlencode($v);\n                }\n                $buff .= $k . \"=\" . $v . \"&\";\n            }\n        }\n        $reqPar = '';\n        if (strlen($buff) > 0) {\n            $reqPar = substr($buff, 0, strlen($buff) - 1);\n        }\n        return $reqPar;\n    }\n}\n\n"
  },
  {
    "path": "frphp/extend/pay/wechat/WxpayH5Service.php",
    "content": "<?php\n\n\nclass WxpayH5Service\n{\n    protected $mchid;\n    protected $appid;\n    protected $apiKey;\n    protected $totalFee;\n    protected $outTradeNo;\n    protected $orderName;\n    protected $notifyUrl;\n    protected $returnUrl;\n    protected $wapUrl;\n    protected $wapName;\n    protected $webip;\n\n    public function __construct($mchid, $appid, $key)\n    {\n        $this->mchid = $mchid;\n        $this->appid = $appid;\n        $this->apiKey = $key;\n    }\n\n    public function setTotalFee($totalFee)\n    {\n        $this->totalFee = $totalFee;\n    }\n    public function setOutTradeNo($outTradeNo)\n    {\n        $this->outTradeNo = $outTradeNo;\n    }\n    public function setOrderName($orderName)\n    {\n        $this->orderName = $orderName;\n    }\n    public function setWapUrl($wapUrl)\n    {\n        $this->wapUrl = $wapUrl;\n    }\n    public function setWapName($wapName)\n    {\n        $this->wapName = $wapName;\n    }\n    public function setNotifyUrl($notifyUrl)\n    {\n        $this->notifyUrl = $notifyUrl;\n    }\n    public function setReturnUrl($returnUrl)\n    {\n        $this->returnUrl = $returnUrl;\n    }\n\tpublic function setIp($webip)\n    {\n        $this->webip = $webip;\n    }\n\n    /**\n     * 发起订单\n     * @return array\n     */\n    public function createJsBizPackage()\n    {\n        $config = array(\n            'mch_id' => $this->mchid,\n            'appid' => $this->appid,\n            'key' => $this->apiKey,\n        );\n        $scene_info = array(\n            'h5_info' =>array(\n                'type'=>'Wap',\n                'wap_url'=>$this->wapUrl,\n                'wap_name'=>$this->wapName,\n            )\n        );\n        $unified = array(\n            'appid' => $config['appid'],\n            'attach' => 'pay',             //商家数据包，原样返回，如果填写中文，请注意转换为utf-8\n            'body' => $this->orderName,\n            'mch_id' => $config['mch_id'],\n            'nonce_str' => self::createNonceStr(),\n            'notify_url' => $this->notifyUrl,\n            'out_trade_no' => $this->outTradeNo,\n            'spbill_create_ip' => $this->webip,\n            'total_fee' => $this->totalFee * 100,       //单位 转为分\n            'trade_type' => 'MWEB',\n            'scene_info'=>json_encode($scene_info)\n        );\n        $unified['sign'] = self::getSign($unified, $config['key']);\n        $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));\n        $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);\n        if ($unifiedOrder->return_code != 'SUCCESS') {\n            die($unifiedOrder->return_msg);\n        }\n        if($unifiedOrder->mweb_url){\n            return $unifiedOrder->mweb_url.'&redirect_url='.urlencode($this->returnUrl);\n        }\n        exit('error');\n    }\n    public static function curlPost($url = '', $postData = '', $options = array())\n    {\n        if (is_array($postData)) {\n            $postData = http_build_query($postData);\n        }\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);\n        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数\n        if (!empty($options)) {\n            curl_setopt_array($ch, $options);\n        }\n        //https请求 不验证证书和host\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        $data = curl_exec($ch);\n        curl_close($ch);\n        return $data;\n    }\n    public static function createNonceStr($length = 16)\n    {\n        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n        $str = '';\n        for ($i = 0; $i < $length; $i++) {\n            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);\n        }\n        return $str;\n    }\n    public static function arrayToXml($arr)\n    {\n        $xml = \"<xml>\";\n        foreach ($arr as $key => $val) {\n            if (is_numeric($val)) {\n                $xml .= \"<\" . $key . \">\" . $val . \"</\" . $key . \">\";\n            } else\n                $xml .= \"<\" . $key . \"><![CDATA[\" . $val . \"]]></\" . $key . \">\";\n        }\n        $xml .= \"</xml>\";\n        return $xml;\n    }\n    /**\n     * 获取签名\n     */\n    public static function getSign($params, $key)\n    {\n        ksort($params, SORT_STRING);\n        $unSignParaString = self::formatQueryParaMap($params, false);\n        $signStr = strtoupper(md5($unSignParaString . \"&key=\" . $key));\n        return $signStr;\n    }\n    protected static function formatQueryParaMap($paraMap, $urlEncode = false)\n    {\n        $buff = \"\";\n        ksort($paraMap);\n        foreach ($paraMap as $k => $v) {\n            if (null != $v && \"null\" != $v) {\n                if ($urlEncode) {\n                    $v = urlencode($v);\n                }\n                $buff .= $k . \"=\" . $v . \"&\";\n            }\n        }\n        $reqPar = '';\n        if (strlen($buff) > 0) {\n            $reqPar = substr($buff, 0, strlen($buff) - 1);\n        }\n        return $reqPar;\n    }\n}\n"
  },
  {
    "path": "frphp/extend/pay/wechat/WxpayScan.php",
    "content": "<?php\n\nclass WxpayScan\n{\n    protected $mchid;\n    protected $appid;\n    protected $apiKey;\n    public function __construct($mchid, $appid, $key)\n    {\n        $this->mchid = $mchid;\n        $this->appid = $appid;\n        $this->apiKey = $key;\n    }\n    /**\n     * 发起订单\n     * @param float $totalFee 收款总费用 单位元\n     * @param string $outTradeNo 唯一的订单号\n     * @param string $orderName 订单名称\n     * @param string $notifyUrl 支付结果通知url 不要有问号\n     * @param string $timestamp 订单发起时间\n     * @return array\n     */\n    public function createJsBizPackage($totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp)\n    {\n        $config = array(\n            'mch_id' => $this->mchid,\n            'appid' => $this->appid,\n            'key' => $this->apiKey,\n        );\n        //$orderName = iconv('GBK','UTF-8',$orderName);\n        $unified = array(\n            'appid' => $config['appid'],\n            'attach' => 'pay',             //商家数据包，原样返回，如果填写中文，请注意转换为utf-8\n            'body' => $orderName,\n            'mch_id' => $config['mch_id'],\n            'nonce_str' => self::createNonceStr(),\n            'notify_url' => $notifyUrl,\n            'out_trade_no' => $outTradeNo,\n            'spbill_create_ip' => '127.0.0.1',\n            'total_fee' => $totalFee * 100,       //单位 转为分\n            'trade_type' => 'NATIVE',\n        );\n        $unified['sign'] = self::getSign($unified, $config['key']);\n        $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));\n\t\t//禁止引用外部xml实体\n\t\tlibxml_disable_entity_loader(true);        \n        $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);\n        if ($unifiedOrder === false) {\n            die('parse xml error');\n        }\n        if ($unifiedOrder->return_code != 'SUCCESS') {\n            die($unifiedOrder->return_msg);\n        }\n        if ($unifiedOrder->result_code != 'SUCCESS') {\n            die($unifiedOrder->err_code);\n        }\n        $codeUrl = (array)($unifiedOrder->code_url);\n        if(!$codeUrl[0]) exit('get code_url error');\n        $arr = array(\n            \"appId\" => $config['appid'],\n            \"timeStamp\" => $timestamp,\n            \"nonceStr\" => self::createNonceStr(),\n            \"package\" => \"prepay_id=\" . $unifiedOrder->prepay_id,\n            \"signType\" => 'MD5',\n            \"code_url\" => $codeUrl[0],\n        );\n        $arr['paySign'] = self::getSign($arr, $config['key']);\n        return $arr;\n    }\n    public function notify()\n    {\n        $config = array(\n            'mch_id' => $this->mchid,\n            'appid' => $this->appid,\n            'key' => $this->apiKey,\n        );\n        $postStr = $GLOBALS[\"HTTP_RAW_POST_DATA\"];\n        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);\n        if ($postObj === false) {\n            die('parse xml error');\n        }\n        if ($postObj->return_code != 'SUCCESS') {\n            die($postObj->return_msg);\n        }\n        if ($postObj->result_code != 'SUCCESS') {\n            die($postObj->err_code);\n        }\n        $arr = (array)$postObj;\n        unset($arr['sign']);\n        if (self::getSign($arr, $config['key']) == $postObj->sign) {\n            echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';\n            return $postObj;\n        }\n    }\n    /**\n     * curl get\n     *\n     * @param string $url\n     * @param array $options\n     * @return mixed\n     */\n    public static function curlGet($url = '', $options = array())\n    {\n        $ch = curl_init($url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_TIMEOUT, 30);\n        if (!empty($options)) {\n            curl_setopt_array($ch, $options);\n        }\n        //https请求 不验证证书和host\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        $data = curl_exec($ch);\n        curl_close($ch);\n        return $data;\n    }\n    public static function curlPost($url = '', $postData = '', $options = array())\n    {\n        if (is_array($postData)) {\n            $postData = http_build_query($postData);\n        }\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);\n        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数\n        if (!empty($options)) {\n            curl_setopt_array($ch, $options);\n        }\n        //https请求 不验证证书和host\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        $data = curl_exec($ch);\n        curl_close($ch);\n        return $data;\n    }\n    public static function createNonceStr($length = 16)\n    {\n        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n        $str = '';\n        for ($i = 0; $i < $length; $i++) {\n            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);\n        }\n        return $str;\n    }\n    public static function arrayToXml($arr)\n    {\n        $xml = \"<xml>\";\n        foreach ($arr as $key => $val) {\n            if (is_numeric($val)) {\n                $xml .= \"<\" . $key . \">\" . $val . \"</\" . $key . \">\";\n            } else\n                $xml .= \"<\" . $key . \"><![CDATA[\" . $val . \"]]></\" . $key . \">\";\n        }\n        $xml .= \"</xml>\";\n        return $xml;\n    }\n    /**\n     * 获取签名\n     */\n    public static function getSign($params, $key)\n    {\n        ksort($params, SORT_STRING);\n        $unSignParaString = self::formatQueryParaMap($params, false);\n        $signStr = strtoupper(md5($unSignParaString . \"&key=\" . $key));\n        return $signStr;\n    }\n    protected static function formatQueryParaMap($paraMap, $urlEncode = false)\n    {\n        $buff = \"\";\n        ksort($paraMap);\n        foreach ($paraMap as $k => $v) {\n            if (null != $v && \"null\" != $v) {\n                if ($urlEncode) {\n                    $v = urlencode($v);\n                }\n                $buff .= $k . \"=\" . $v . \"&\";\n            }\n        }\n        $reqPar = '';\n        if (strlen($buff) > 0) {\n            $reqPar = substr($buff, 0, strlen($buff) - 1);\n        }\n        return $reqPar;\n    }\n}\n\n"
  },
  {
    "path": "frphp/extend/pay/wechat/WxpayService.php",
    "content": "<?php\nclass WxpayService\n{\n    protected $mchid;\n    protected $appid;\n    protected $appKey;\n    protected $apiKey;\n    public $data = null;\n    public function __construct($mchid, $appid, $appKey,$key)\n    {\n        $this->mchid = $mchid; //https://pay.weixin.qq.com 产品中心-开发配置-商户号\n        $this->appid = $appid; //微信支付申请对应的公众号的APPID\n        $this->appKey = $appKey; //微信支付申请对应的公众号的APP Key\n        $this->apiKey = $key;   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥\n    }\n    /**\n     * 通过跳转获取用户的openid，跳转流程如下：\n     * 1、设置自己需要调回的url及其其他参数，跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize\n     * 2、微信服务处理完成之后会跳转回用户redirect_uri地址，此时会带上一些参数，如：code\n     * @return 用户的openid\n     */\n    public function GetOpenid()\n    {\n        //通过code获得openid\n        if (!isset($_GET['code'])){\n            //触发微信返回code码\n            $scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';\n\t\t\t$uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING'];\n\t\t\tif($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI'];\n            $baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri);\n            $url = $this->__CreateOauthUrlForCode($baseUrl);\n            Header(\"Location: $url\");\n            exit();\n        } else {\n            //获取code码，以获取openid\n            $code = $_GET['code'];\n            $openid = $this->getOpenidFromMp($code);\n            return $openid;\n        }\n    }\n    /**\n     * 通过code从工作平台获取openid机器access_token\n     * @param string $code 微信跳转回来带上的code\n     * @return openid\n     */\n    public function GetOpenidFromMp($code)\n    {\n        $url = $this->__CreateOauthUrlForOpenid($code);\n        $res = self::curlGet($url);\n        //取出openid\n        $data = json_decode($res,true);\n        $this->data = $data;\n        $openid = $data['openid'];\n        return $openid;\n    }\n    /**\n     * 构造获取open和access_toke的url地址\n     * @param string $code，微信跳转带回的code\n     * @return 请求的url\n     */\n    private function __CreateOauthUrlForOpenid($code)\n    {\n        $urlObj[\"appid\"] = $this->appid;\n        $urlObj[\"secret\"] = $this->appKey;\n        $urlObj[\"code\"] = $code;\n        $urlObj[\"grant_type\"] = \"authorization_code\";\n        $bizString = $this->ToUrlParams($urlObj);\n        return \"https://api.weixin.qq.com/sns/oauth2/access_token?\".$bizString;\n    }\n    /**\n     * 构造获取code的url连接\n     * @param string $redirectUrl 微信服务器回跳的url，需要url编码\n     * @return 返回构造好的url\n     */\n    private function __CreateOauthUrlForCode($redirectUrl)\n    {\n        $urlObj[\"appid\"] = $this->appid;\n        $urlObj[\"redirect_uri\"] = \"$redirectUrl\";\n        $urlObj[\"response_type\"] = \"code\";\n        $urlObj[\"scope\"] = \"snsapi_base\";\n        $urlObj[\"state\"] = \"STATE\".\"#wechat_redirect\";\n        $bizString = $this->ToUrlParams($urlObj);\n        return \"https://open.weixin.qq.com/connect/oauth2/authorize?\".$bizString;\n    }\n    /**\n     * 拼接签名字符串\n     * @param array $urlObj\n     * @return 返回已经拼接好的字符串\n     */\n    private function ToUrlParams($urlObj)\n    {\n        $buff = \"\";\n        foreach ($urlObj as $k => $v)\n        {\n            if($k != \"sign\") $buff .= $k . \"=\" . $v . \"&\";\n        }\n        $buff = trim($buff, \"&\");\n        return $buff;\n    }\n    /**\n     * 统一下单\n     * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid\n     * @param float $totalFee 收款总费用 单位元\n     * @param string $outTradeNo 唯一的订单号\n     * @param string $orderName 订单名称\n     * @param string $notifyUrl 支付结果通知url 不要有问号\n     * @param string $timestamp 支付时间\n     * @return string\n     */\n    public function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp)\n    {\n        $config = array(\n            'mch_id' => $this->mchid,\n            'appid' => $this->appid,\n            'key' => $this->apiKey,\n        );\n        //$orderName = iconv('GBK','UTF-8',$orderName);\n        $unified = array(\n            'appid' => $config['appid'],\n            'attach' => 'pay',             //商家数据包，原样返回，如果填写中文，请注意转换为utf-8\n            'body' => $orderName,\n            'mch_id' => $config['mch_id'],\n            'nonce_str' => self::createNonceStr(),\n            'notify_url' => $notifyUrl,\n            'openid' => $openid,            //rade_type=JSAPI，此参数必传\n            'out_trade_no' => $outTradeNo,\n            'spbill_create_ip' => '127.0.0.1',\n            'total_fee' => $totalFee * 100,       //单位 转为分\n            'trade_type' => 'JSAPI',\n        );\n        $unified['sign'] = self::getSign($unified, $config['key']);\n        $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));\n\t\t//禁止引用外部xml实体\n\t\tlibxml_disable_entity_loader(true);\t    \n        $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);\n        if ($unifiedOrder === false) {\n            die('parse xml error');\n        }\n        if ($unifiedOrder->return_code != 'SUCCESS') {\n            die($unifiedOrder->return_msg);\n        }\n        if ($unifiedOrder->result_code != 'SUCCESS') {\n            die($unifiedOrder->err_code);\n        }\n        $arr = array(\n            \"appId\" => $config['appid'],\n            \"timeStamp\" => \"$timestamp\",        //这里是字符串的时间戳，不是int，所以需加引号\n            \"nonceStr\" => self::createNonceStr(),\n            \"package\" => \"prepay_id=\" . $unifiedOrder->prepay_id,\n            \"signType\" => 'MD5',\n        );\n        $arr['paySign'] = self::getSign($arr, $config['key']);\n        return $arr;\n    }\n    public static function curlGet($url = '', $options = array())\n    {\n        $ch = curl_init($url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_TIMEOUT, 30);\n        if (!empty($options)) {\n            curl_setopt_array($ch, $options);\n        }\n        //https请求 不验证证书和host\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        $data = curl_exec($ch);\n        curl_close($ch);\n        return $data;\n    }\n    public static function curlPost($url = '', $postData = '', $options = array())\n    {\n        if (is_array($postData)) {\n            $postData = http_build_query($postData);\n        }\n        $ch = curl_init();\n        curl_setopt($ch, CURLOPT_URL, $url);\n        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n        curl_setopt($ch, CURLOPT_POST, 1);\n        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);\n        curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数\n        if (!empty($options)) {\n            curl_setopt_array($ch, $options);\n        }\n        //https请求 不验证证书和host\n        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);\n        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);\n        $data = curl_exec($ch);\n        curl_close($ch);\n        return $data;\n    }\n    public static function createNonceStr($length = 16)\n    {\n        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n        $str = '';\n        for ($i = 0; $i < $length; $i++) {\n            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);\n        }\n        return $str;\n    }\n    public static function arrayToXml($arr)\n    {\n        $xml = \"<xml>\";\n        foreach ($arr as $key => $val) {\n            if (is_numeric($val)) {\n                $xml .= \"<\" . $key . \">\" . $val . \"</\" . $key . \">\";\n            } else\n                $xml .= \"<\" . $key . \"><![CDATA[\" . $val . \"]]></\" . $key . \">\";\n        }\n        $xml .= \"</xml>\";\n        return $xml;\n    }\n    public static function getSign($params, $key)\n    {\n        ksort($params, SORT_STRING);\n        $unSignParaString = self::formatQueryParaMap($params, false);\n        $signStr = strtoupper(md5($unSignParaString . \"&key=\" . $key));\n        return $signStr;\n    }\n    protected static function formatQueryParaMap($paraMap, $urlEncode = false)\n    {\n        $buff = \"\";\n        ksort($paraMap);\n        foreach ($paraMap as $k => $v) {\n            if (null != $v && \"null\" != $v) {\n                if ($urlEncode) {\n                    $v = urlencode($v);\n                }\n                $buff .= $k . \"=\" . $v . \"&\";\n            }\n        }\n        $reqPar = '';\n        if (strlen($buff) > 0) {\n            $reqPar = substr($buff, 0, strlen($buff) - 1);\n        }\n        return $reqPar;\n    }\n}"
  },
  {
    "path": "frphp/extend/pay/wechat/WxpayServiceCheck.php",
    "content": "<?php\n\nclass WxpayServiceCheck\n{\n    protected $mchid;\n    protected $appid;\n    protected $apiKey;\n    public function __construct($mchid, $appid, $key)\n    {\n        $this->mchid = $mchid;\n        $this->appid = $appid;\n        $this->apiKey = $key;\n    }\n    public function notify()\n    {\n        $config = array(\n            'mch_id' => $this->mchid,\n            'appid' => $this->appid,\n            'key' => $this->apiKey,\n        );\n        $postStr = file_get_contents('php://input');\n\t\t//禁止引用外部xml实体\n\t\tlibxml_disable_entity_loader(true);        \n        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);\n        if ($postObj === false) {\n            die('parse xml error');\n        }\n        if ($postObj->return_code != 'SUCCESS') {\n            die($postObj->return_msg);\n        }\n        if ($postObj->result_code != 'SUCCESS') {\n            die($postObj->err_code);\n        }\n        $arr = (array)$postObj;\n        unset($arr['sign']);\n        if (self::getSign($arr, $config['key']) == $postObj->sign) {\n            echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';\n            return $arr;\n        }\n    }\n    /**\n     * 获取签名\n     */\n    public static function getSign($params, $key)\n    {\n        ksort($params, SORT_STRING);\n        $unSignParaString = self::formatQueryParaMap($params, false);\n        $signStr = strtoupper(md5($unSignParaString . \"&key=\" . $key));\n        return $signStr;\n    }\n    protected static function formatQueryParaMap($paraMap, $urlEncode = false)\n    {\n        $buff = \"\";\n        ksort($paraMap);\n        foreach ($paraMap as $k => $v) {\n            if (null != $v && \"null\" != $v) {\n                if ($urlEncode) {\n                    $v = urlencode($v);\n                }\n                $buff .= $k . \"=\" . $v . \"&\";\n            }\n        }\n        $reqPar = '';\n        if (strlen($buff) > 0) {\n            $reqPar = substr($buff, 0, strlen($buff) - 1);\n        }\n        return $reqPar;\n    }\n}"
  },
  {
    "path": "frphp/extend/phpqrcode/phpqrcode.php",
    "content": "<?php\n\n/*\n * PHP QR Code encoder\n *\n * This file contains MERGED version of PHP QR Code library.\n * It was auto-generated from full version for your convenience.\n *\n * This merged version was configured to not requre any external files,\n * with disabled cache, error loging and weker but faster mask matching.\n * If you need tune it up please use non-merged version.\n *\n * For full version, documentation, examples of use please visit:\n *\n *    http://phpqrcode.sourceforge.net/\n *    https://sourceforge.net/projects/phpqrcode/\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n \n \n\n/*\n * Version: 1.1.4\n * Build: 2010100721\n */\n\n\n\n//---- qrconst.php -----------------------------\n\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Common constants\n *\n * Based on libqrencode C library distributed under LGPL 2.1\n * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n \n\t// Encoding modes\n\t \n\tdefine('QR_MODE_NUL', -1);\n\tdefine('QR_MODE_NUM', 0);\n\tdefine('QR_MODE_AN', 1);\n\tdefine('QR_MODE_8', 2);\n\tdefine('QR_MODE_KANJI', 3);\n\tdefine('QR_MODE_STRUCTURE', 4);\n\n\t// Levels of error correction.\n\n\tdefine('QR_ECLEVEL_L', 0);\n\tdefine('QR_ECLEVEL_M', 1);\n\tdefine('QR_ECLEVEL_Q', 2);\n\tdefine('QR_ECLEVEL_H', 3);\n\t\n\t// Supported output formats\n\t\n\tdefine('QR_FORMAT_TEXT', 0);\n\tdefine('QR_FORMAT_PNG',  1);\n\t\n\tclass qrstr {\n\t\tpublic static function set(&$srctab, $x, $y, $repl, $replLen = false) {\n\t\t\t$srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));\n\t\t}\n\t}\t\n\n\n\n//---- merged_config.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Config file, tuned-up for merged verion\n */\n     \n    define('QR_CACHEABLE', false);       // use cache - more disk reads but less CPU power, masks and format templates are stored there\n    define('QR_CACHE_DIR', false);       // used when QR_CACHEABLE === true\n    define('QR_LOG_DIR', false);         // default error logs dir   \n    \n    define('QR_FIND_BEST_MASK', true);                                                          // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code\n    define('QR_FIND_FROM_RANDOM', 2);                                                       // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly\n    define('QR_DEFAULT_MASK', 2);                                                               // when QR_FIND_BEST_MASK === false\n                                                  \n    define('QR_PNG_MAXIMUM_SIZE',  1024);                                                       // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images\n                                                  \n\n\n\n//---- qrtools.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Toolset, handy and debug utilites.\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n    class QRtools {\n    \n        //----------------------------------------------------------------------\n        public static function binarize($frame)\n        {\n            $len = count($frame);\n            foreach ($frame as &$frameLine) {\n                \n                for($i=0; $i<$len; $i++) {\n                    $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';\n                }\n            }\n            \n            return $frame;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')\n        {\n            $barcode_array = array();\n            \n            if (!is_array($mode))\n                $mode = explode(',', $mode);\n                \n            $eccLevel = 'L';\n                \n            if (count($mode) > 1) {\n                $eccLevel = $mode[1];\n            }\n                \n            $qrTab = QRcode::text($code, false, $eccLevel);\n            $size = count($qrTab);\n                \n            $barcode_array['num_rows'] = $size;\n            $barcode_array['num_cols'] = $size;\n            $barcode_array['bcode'] = array();\n                \n            foreach ($qrTab as $line) {\n                $arrAdd = array();\n                foreach(str_split($line) as $char)\n                    $arrAdd[] = ($char=='1')?1:0;\n                $barcode_array['bcode'][] = $arrAdd;\n            }\n                    \n            return $barcode_array;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function clearCache()\n        {\n            self::$frames = array();\n        }\n        \n        //----------------------------------------------------------------------\n        public static function buildCache()\n        {\n\t\t\tQRtools::markTime('before_build_cache');\n\t\t\t\n\t\t\t$mask = new QRmask();\n            for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {\n                $frame = QRspec::newFrame($a);\n                if (QR_IMAGE) {\n                    $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';\n                    QRimage::png(self::binarize($frame), $fileName, 1, 0);\n                }\n\t\t\t\t\n\t\t\t\t$width = count($frame);\n\t\t\t\t$bitMask = array_fill(0, $width, array_fill(0, $width, 0));\n\t\t\t\tfor ($maskNo=0; $maskNo<8; $maskNo++)\n\t\t\t\t\t$mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);\n            }\n\t\t\t\n\t\t\tQRtools::markTime('after_build_cache');\n        }\n\n        //----------------------------------------------------------------------\n        public static function log($outfile, $err)\n        {\n            if (QR_LOG_DIR !== false) {\n                if ($err != '') {\n                    if ($outfile !== false) {\n                        file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);\n                    } else {\n                        file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);\n                    }\n                }    \n            }\n        }\n        \n        //----------------------------------------------------------------------\n        public static function dumpMask($frame) \n        {\n            $width = count($frame);\n            for($y=0;$y<$width;$y++) {\n                for($x=0;$x<$width;$x++) {\n                    echo ord($frame[$y][$x]).',';\n                }\n            }\n        }\n        \n        //----------------------------------------------------------------------\n        public static function markTime($markerId)\n        {\n            list($usec, $sec) = explode(\" \", microtime());\n            $time = ((float)$usec + (float)$sec);\n            \n            if (!isset($GLOBALS['qr_time_bench']))\n                $GLOBALS['qr_time_bench'] = array();\n            \n            $GLOBALS['qr_time_bench'][$markerId] = $time;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function timeBenchmark()\n        {\n            self::markTime('finish');\n        \n            $lastTime = 0;\n            $startTime = 0;\n            $p = 0;\n\n            echo '<table cellpadding=\"3\" cellspacing=\"1\">\n                    <thead><tr style=\"border-bottom:1px solid silver\"><td colspan=\"2\" style=\"text-align:center\">BENCHMARK</td></tr></thead>\n                    <tbody>';\n\n            foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {\n                if ($p > 0) {\n                    echo '<tr><th style=\"text-align:right\">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>';\n                } else {\n                    $startTime = $thisTime;\n                }\n                \n                $p++;\n                $lastTime = $thisTime;\n            }\n            \n            echo '</tbody><tfoot>\n                <tr style=\"border-top:2px solid black\"><th style=\"text-align:right\">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr>\n            </tfoot>\n            </table>';\n        }\n        \n    }\n    \n    //##########################################################################\n    \n    QRtools::markTime('start');\n    \n\n\n\n//---- qrspec.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * QR Code specifications\n *\n * Based on libqrencode C library distributed under LGPL 2.1\n * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * The following data / specifications are taken from\n * \"Two dimensional symbol -- QR-code -- Basic Specification\" (JIS X0510:2004)\n *  or\n * \"Automatic identification and data capture techniques -- \n *  QR Code 2005 bar code symbology specification\" (ISO/IEC 18004:2006)\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n \n    define('QRSPEC_VERSION_MAX', 40);\n    define('QRSPEC_WIDTH_MAX',   177);\n\n    define('QRCAP_WIDTH',        0);\n    define('QRCAP_WORDS',        1);\n    define('QRCAP_REMINDER',     2);\n    define('QRCAP_EC',           3);\n\n    class QRspec {\n    \n        public static $capacity = array(\n            array(  0,    0, 0, array(   0,    0,    0,    0)),\n            array( 21,   26, 0, array(   7,   10,   13,   17)), // 1\n            array( 25,   44, 7, array(  10,   16,   22,   28)),\n            array( 29,   70, 7, array(  15,   26,   36,   44)),\n            array( 33,  100, 7, array(  20,   36,   52,   64)),\n            array( 37,  134, 7, array(  26,   48,   72,   88)), // 5\n            array( 41,  172, 7, array(  36,   64,   96,  112)),\n            array( 45,  196, 0, array(  40,   72,  108,  130)),\n            array( 49,  242, 0, array(  48,   88,  132,  156)),\n            array( 53,  292, 0, array(  60,  110,  160,  192)),\n            array( 57,  346, 0, array(  72,  130,  192,  224)), //10\n            array( 61,  404, 0, array(  80,  150,  224,  264)),\n            array( 65,  466, 0, array(  96,  176,  260,  308)),\n            array( 69,  532, 0, array( 104,  198,  288,  352)),\n            array( 73,  581, 3, array( 120,  216,  320,  384)),\n            array( 77,  655, 3, array( 132,  240,  360,  432)), //15\n            array( 81,  733, 3, array( 144,  280,  408,  480)),\n            array( 85,  815, 3, array( 168,  308,  448,  532)),\n            array( 89,  901, 3, array( 180,  338,  504,  588)),\n            array( 93,  991, 3, array( 196,  364,  546,  650)),\n            array( 97, 1085, 3, array( 224,  416,  600,  700)), //20\n            array(101, 1156, 4, array( 224,  442,  644,  750)),\n            array(105, 1258, 4, array( 252,  476,  690,  816)),\n            array(109, 1364, 4, array( 270,  504,  750,  900)),\n            array(113, 1474, 4, array( 300,  560,  810,  960)),\n            array(117, 1588, 4, array( 312,  588,  870, 1050)), //25\n            array(121, 1706, 4, array( 336,  644,  952, 1110)),\n            array(125, 1828, 4, array( 360,  700, 1020, 1200)),\n            array(129, 1921, 3, array( 390,  728, 1050, 1260)),\n            array(133, 2051, 3, array( 420,  784, 1140, 1350)),\n            array(137, 2185, 3, array( 450,  812, 1200, 1440)), //30\n            array(141, 2323, 3, array( 480,  868, 1290, 1530)),\n            array(145, 2465, 3, array( 510,  924, 1350, 1620)),\n            array(149, 2611, 3, array( 540,  980, 1440, 1710)),\n            array(153, 2761, 3, array( 570, 1036, 1530, 1800)),\n            array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35\n            array(161, 3034, 0, array( 600, 1120, 1680, 1980)),\n            array(165, 3196, 0, array( 630, 1204, 1770, 2100)),\n            array(169, 3362, 0, array( 660, 1260, 1860, 2220)),\n            array(173, 3532, 0, array( 720, 1316, 1950, 2310)),\n            array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40\n        );\n        \n        //----------------------------------------------------------------------\n        public static function getDataLength($version, $level)\n        {\n            return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];\n        }\n        \n        //----------------------------------------------------------------------\n        public static function getECCLength($version, $level)\n        {\n            return self::$capacity[$version][QRCAP_EC][$level];\n        }\n        \n        //----------------------------------------------------------------------\n        public static function getWidth($version)\n        {\n            return self::$capacity[$version][QRCAP_WIDTH];\n        }\n        \n        //----------------------------------------------------------------------\n        public static function getRemainder($version)\n        {\n            return self::$capacity[$version][QRCAP_REMINDER];\n        }\n        \n        //----------------------------------------------------------------------\n        public static function getMinimumVersion($size, $level)\n        {\n\n            for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {\n                $words  = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];\n                if($words >= $size) \n                    return $i;\n            }\n\n            return -1;\n        }\n    \n        //######################################################################\n        \n        public static $lengthTableBits = array(\n            array(10, 12, 14),\n            array( 9, 11, 13),\n            array( 8, 16, 16),\n            array( 8, 10, 12)\n        );\n        \n        //----------------------------------------------------------------------\n        public static function lengthIndicator($mode, $version)\n        {\n            if ($mode == QR_MODE_STRUCTURE)\n                return 0;\n                \n            if ($version <= 9) {\n                $l = 0;\n            } else if ($version <= 26) {\n                $l = 1;\n            } else {\n                $l = 2;\n            }\n\n            return self::$lengthTableBits[$mode][$l];\n        }\n        \n        //----------------------------------------------------------------------\n        public static function maximumWords($mode, $version)\n        {\n            if($mode == QR_MODE_STRUCTURE) \n                return 3;\n                \n            if($version <= 9) {\n                $l = 0;\n            } else if($version <= 26) {\n                $l = 1;\n            } else {\n                $l = 2;\n            }\n\n            $bits = self::$lengthTableBits[$mode][$l];\n            $words = (1 << $bits) - 1;\n            \n            if($mode == QR_MODE_KANJI) {\n                $words *= 2; // the number of bytes is required\n            }\n\n            return $words;\n        }\n\n        // Error correction code -----------------------------------------------\n        // Table of the error correction code (Reed-Solomon block)\n        // See Table 12-16 (pp.30-36), JIS X0510:2004.\n\n        public static $eccTable = array(\n            array(array( 0,  0), array( 0,  0), array( 0,  0), array( 0,  0)),\n            array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)), // 1\n            array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)),\n            array(array( 1,  0), array( 1,  0), array( 2,  0), array( 2,  0)),\n            array(array( 1,  0), array( 2,  0), array( 2,  0), array( 4,  0)),\n            array(array( 1,  0), array( 2,  0), array( 2,  2), array( 2,  2)), // 5\n            array(array( 2,  0), array( 4,  0), array( 4,  0), array( 4,  0)),\n            array(array( 2,  0), array( 4,  0), array( 2,  4), array( 4,  1)),\n            array(array( 2,  0), array( 2,  2), array( 4,  2), array( 4,  2)),\n            array(array( 2,  0), array( 3,  2), array( 4,  4), array( 4,  4)),\n            array(array( 2,  2), array( 4,  1), array( 6,  2), array( 6,  2)), //10\n            array(array( 4,  0), array( 1,  4), array( 4,  4), array( 3,  8)),\n            array(array( 2,  2), array( 6,  2), array( 4,  6), array( 7,  4)),\n            array(array( 4,  0), array( 8,  1), array( 8,  4), array(12,  4)),\n            array(array( 3,  1), array( 4,  5), array(11,  5), array(11,  5)),\n            array(array( 5,  1), array( 5,  5), array( 5,  7), array(11,  7)), //15\n            array(array( 5,  1), array( 7,  3), array(15,  2), array( 3, 13)),\n            array(array( 1,  5), array(10,  1), array( 1, 15), array( 2, 17)),\n            array(array( 5,  1), array( 9,  4), array(17,  1), array( 2, 19)),\n            array(array( 3,  4), array( 3, 11), array(17,  4), array( 9, 16)),\n            array(array( 3,  5), array( 3, 13), array(15,  5), array(15, 10)), //20\n            array(array( 4,  4), array(17,  0), array(17,  6), array(19,  6)),\n            array(array( 2,  7), array(17,  0), array( 7, 16), array(34,  0)),\n            array(array( 4,  5), array( 4, 14), array(11, 14), array(16, 14)),\n            array(array( 6,  4), array( 6, 14), array(11, 16), array(30,  2)),\n            array(array( 8,  4), array( 8, 13), array( 7, 22), array(22, 13)), //25\n            array(array(10,  2), array(19,  4), array(28,  6), array(33,  4)),\n            array(array( 8,  4), array(22,  3), array( 8, 26), array(12, 28)),\n            array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),\n            array(array( 7,  7), array(21,  7), array( 1, 37), array(19, 26)),\n            array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30\n            array(array(13,  3), array( 2, 29), array(42,  1), array(23, 28)),\n            array(array(17,  0), array(10, 23), array(10, 35), array(19, 35)),\n            array(array(17,  1), array(14, 21), array(29, 19), array(11, 46)),\n            array(array(13,  6), array(14, 23), array(44,  7), array(59,  1)),\n            array(array(12,  7), array(12, 26), array(39, 14), array(22, 41)), //35\n            array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),\n            array(array(17,  4), array(29, 14), array(49, 10), array(24, 46)),\n            array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),\n            array(array(20,  4), array(40,  7), array(43, 22), array(10, 67)),\n            array(array(19,  6), array(18, 31), array(34, 34), array(20, 61)),//40\n        );                                                                       \n\n        //----------------------------------------------------------------------\n        // CACHEABLE!!!\n        \n        public static function getEccSpec($version, $level, array &$spec)\n        {\n            if (count($spec) < 5) {\n                $spec = array(0,0,0,0,0);\n            }\n\n            $b1   = self::$eccTable[$version][$level][0];\n            $b2   = self::$eccTable[$version][$level][1];\n            $data = self::getDataLength($version, $level);\n            $ecc  = self::getECCLength($version, $level);\n\n            if($b2 == 0) {\n                $spec[0] = $b1;\n                $spec[1] = (int)($data / $b1);\n                $spec[2] = (int)($ecc / $b1);\n                $spec[3] = 0; \n                $spec[4] = 0;\n            } else {\n                $spec[0] = $b1;\n                $spec[1] = (int)($data / ($b1 + $b2));\n                $spec[2] = (int)($ecc  / ($b1 + $b2));\n                $spec[3] = $b2;\n                $spec[4] = $spec[1] + 1;\n            }\n        }\n\n        // Alignment pattern ---------------------------------------------------\n\n        // Positions of alignment patterns.\n        // This array includes only the second and the third position of the \n        // alignment patterns. Rest of them can be calculated from the distance \n        // between them.\n         \n        // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.\n         \n        public static $alignmentPattern = array(      \n            array( 0,  0),\n            array( 0,  0), array(18,  0), array(22,  0), array(26,  0), array(30,  0), // 1- 5\n            array(34,  0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10\n            array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15\n            array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20\n            array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25\n            array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30\n            array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35\n            array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40\n        );                                                                                  \n\n        \n        /** --------------------------------------------------------------------\n         * Put an alignment marker.\n         * @param frame\n         * @param width\n         * @param ox,oy center coordinate of the pattern\n         */\n        public static function putAlignmentMarker(array &$frame, $ox, $oy)\n        {\n            $finder = array(\n                \"\\xa1\\xa1\\xa1\\xa1\\xa1\",\n                \"\\xa1\\xa0\\xa0\\xa0\\xa1\",\n                \"\\xa1\\xa0\\xa1\\xa0\\xa1\",\n                \"\\xa1\\xa0\\xa0\\xa0\\xa1\",\n                \"\\xa1\\xa1\\xa1\\xa1\\xa1\"\n            );                        \n            \n            $yStart = $oy-2;         \n            $xStart = $ox-2;\n            \n            for($y=0; $y<5; $y++) {\n                QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);\n            }\n        }\n\n        //----------------------------------------------------------------------\n        public static function putAlignmentPattern($version, &$frame, $width)\n        {\n            if($version < 2)\n                return;\n\n            $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];\n            if($d < 0) {\n                $w = 2;\n            } else {\n                $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);\n            }\n\n            if($w * $w - 3 == 1) {\n                $x = self::$alignmentPattern[$version][0];\n                $y = self::$alignmentPattern[$version][0];\n                self::putAlignmentMarker($frame, $x, $y);\n                return;\n            }\n\n            $cx = self::$alignmentPattern[$version][0];\n            for($x=1; $x<$w - 1; $x++) {\n                self::putAlignmentMarker($frame, 6, $cx);\n                self::putAlignmentMarker($frame, $cx,  6);\n                $cx += $d;\n            }\n\n            $cy = self::$alignmentPattern[$version][0];\n            for($y=0; $y<$w-1; $y++) {\n                $cx = self::$alignmentPattern[$version][0];\n                for($x=0; $x<$w-1; $x++) {\n                    self::putAlignmentMarker($frame, $cx, $cy);\n                    $cx += $d;\n                }\n                $cy += $d;\n            }\n        }\n\n        // Version information pattern -----------------------------------------\n\n\t\t// Version information pattern (BCH coded).\n        // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.\n        \n\t\t// size: [QRSPEC_VERSION_MAX - 6]\n\t\t\n        public static $versionPattern = array(\n            0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,\n            0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,\n            0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,\n            0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,\n            0x27541, 0x28c69\n        );\n\n        //----------------------------------------------------------------------\n        public static function getVersionPattern($version)\n        {\n            if($version < 7 || $version > QRSPEC_VERSION_MAX)\n                return 0;\n\n            return self::$versionPattern[$version -7];\n        }\n\n        // Format information --------------------------------------------------\n        // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)\n        \n        public static $formatInfo = array(\n            array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),\n            array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),\n            array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),\n            array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)\n        );\n\n        public static function getFormatInfo($mask, $level)\n        {\n            if($mask < 0 || $mask > 7)\n                return 0;\n                \n            if($level < 0 || $level > 3)\n                return 0;                \n\n            return self::$formatInfo[$level][$mask];\n        }\n\n        // Frame ---------------------------------------------------------------\n        // Cache of initial frames.\n         \n        public static $frames = array();\n\n        /** --------------------------------------------------------------------\n         * Put a finder pattern.\n         * @param frame\n         * @param width\n         * @param ox,oy upper-left coordinate of the pattern\n         */\n        public static function putFinderPattern(&$frame, $ox, $oy)\n        {\n            $finder = array(\n                \"\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\",\n                \"\\xc1\\xc0\\xc0\\xc0\\xc0\\xc0\\xc1\",\n                \"\\xc1\\xc0\\xc1\\xc1\\xc1\\xc0\\xc1\",\n                \"\\xc1\\xc0\\xc1\\xc1\\xc1\\xc0\\xc1\",\n                \"\\xc1\\xc0\\xc1\\xc1\\xc1\\xc0\\xc1\",\n                \"\\xc1\\xc0\\xc0\\xc0\\xc0\\xc0\\xc1\",\n                \"\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\\xc1\"\n            );                            \n            \n            for($y=0; $y<7; $y++) {\n                QRstr::set($frame, $ox, $oy+$y, $finder[$y]);\n            }\n        }\n\n        //----------------------------------------------------------------------\n        public static function createFrame($version)\n        {\n            $width = self::$capacity[$version][QRCAP_WIDTH];\n            $frameLine = str_repeat (\"\\0\", $width);\n            $frame = array_fill(0, $width, $frameLine);\n\n            // Finder pattern\n            self::putFinderPattern($frame, 0, 0);\n            self::putFinderPattern($frame, $width - 7, 0);\n            self::putFinderPattern($frame, 0, $width - 7);\n            \n            // Separator\n            $yOffset = $width - 7;\n            \n            for($y=0; $y<7; $y++) {\n                $frame[$y][7] = \"\\xc0\";\n                $frame[$y][$width - 8] = \"\\xc0\";\n                $frame[$yOffset][7] = \"\\xc0\";\n                $yOffset++;\n            }\n            \n            $setPattern = str_repeat(\"\\xc0\", 8);\n            \n            QRstr::set($frame, 0, 7, $setPattern);\n            QRstr::set($frame, $width-8, 7, $setPattern);\n            QRstr::set($frame, 0, $width - 8, $setPattern);\n        \n            // Format info\n            $setPattern = str_repeat(\"\\x84\", 9);\n            QRstr::set($frame, 0, 8, $setPattern);\n            QRstr::set($frame, $width - 8, 8, $setPattern, 8);\n            \n            $yOffset = $width - 8;\n\n            for($y=0; $y<8; $y++,$yOffset++) {\n                $frame[$y][8] = \"\\x84\";\n                $frame[$yOffset][8] = \"\\x84\";\n            }\n\n            // Timing pattern  \n            \n            for($i=1; $i<$width-15; $i++) {\n                $frame[6][7+$i] = chr(0x90 | ($i & 1));\n                $frame[7+$i][6] = chr(0x90 | ($i & 1));\n            }\n            \n            // Alignment pattern  \n            self::putAlignmentPattern($version, $frame, $width);\n            \n            // Version information \n            if($version >= 7) {\n                $vinf = self::getVersionPattern($version);\n\n                $v = $vinf;\n                \n                for($x=0; $x<6; $x++) {\n                    for($y=0; $y<3; $y++) {\n                        $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));\n                        $v = $v >> 1;\n                    }\n                }\n\n                $v = $vinf;\n                for($y=0; $y<6; $y++) {\n                    for($x=0; $x<3; $x++) {\n                        $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));\n                        $v = $v >> 1;\n                    }\n                }\n            }\n    \n            // and a little bit...  \n            $frame[$width - 8][8] = \"\\x81\";\n            \n            return $frame;\n        }\n\n        //----------------------------------------------------------------------\n        public static function debug($frame, $binary_mode = false)\n        {\n            if ($binary_mode) {\n            \n                    foreach ($frame as &$frameLine) {\n                        $frameLine = join('<span class=\"m\">&nbsp;&nbsp;</span>', explode('0', $frameLine));\n                        $frameLine = join('&#9608;&#9608;', explode('1', $frameLine));\n                    }\n                    \n                    ?>\n                <style>\n                    .m { background-color: white; }\n                </style>\n                <?php\n                    echo '<pre><tt><br/ ><br/ ><br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';\n                    echo join(\"<br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\", $frame);\n                    echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >';\n            \n            } else {\n            \n                foreach ($frame as &$frameLine) {\n                    $frameLine = join('<span class=\"m\">&nbsp;</span>',  explode(\"\\xc0\", $frameLine));\n                    $frameLine = join('<span class=\"m\">&#9618;</span>', explode(\"\\xc1\", $frameLine));\n                    $frameLine = join('<span class=\"p\">&nbsp;</span>',  explode(\"\\xa0\", $frameLine));\n                    $frameLine = join('<span class=\"p\">&#9618;</span>', explode(\"\\xa1\", $frameLine));\n                    $frameLine = join('<span class=\"s\">&#9671;</span>', explode(\"\\x84\", $frameLine)); //format 0\n                    $frameLine = join('<span class=\"s\">&#9670;</span>', explode(\"\\x85\", $frameLine)); //format 1\n                    $frameLine = join('<span class=\"x\">&#9762;</span>', explode(\"\\x81\", $frameLine)); //special bit\n                    $frameLine = join('<span class=\"c\">&nbsp;</span>',  explode(\"\\x90\", $frameLine)); //clock 0\n                    $frameLine = join('<span class=\"c\">&#9719;</span>', explode(\"\\x91\", $frameLine)); //clock 1\n                    $frameLine = join('<span class=\"f\">&nbsp;</span>',  explode(\"\\x88\", $frameLine)); //version\n                    $frameLine = join('<span class=\"f\">&#9618;</span>', explode(\"\\x89\", $frameLine)); //version\n                    $frameLine = join('&#9830;', explode(\"\\x01\", $frameLine));\n                    $frameLine = join('&#8901;', explode(\"\\0\", $frameLine));\n                }\n                \n                ?>\n                <style>\n                    .p { background-color: yellow; }\n                    .m { background-color: #00FF00; }\n                    .s { background-color: #FF0000; }\n                    .c { background-color: aqua; }\n                    .x { background-color: pink; }\n                    .f { background-color: gold; }\n                </style>\n                <?php\n                echo \"<pre><tt>\";\n                echo join(\"<br/ >\", $frame);\n                echo \"</tt></pre>\";\n            \n            }\n        }\n\n        //----------------------------------------------------------------------\n        public static function serial($frame)\n        {\n            return gzcompress(join(\"\\n\", $frame), 9);\n        }\n        \n        //----------------------------------------------------------------------\n        public static function unserial($code)\n        {\n            return explode(\"\\n\", gzuncompress($code));\n        }\n        \n        //----------------------------------------------------------------------\n        public static function newFrame($version)\n        {\n            if($version < 1 || $version > QRSPEC_VERSION_MAX) \n                return null;\n\n            if(!isset(self::$frames[$version])) {\n                \n                $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';\n                \n                if (QR_CACHEABLE) {\n                    if (file_exists($fileName)) {\n                        self::$frames[$version] = self::unserial(file_get_contents($fileName));\n                    } else {\n                        self::$frames[$version] = self::createFrame($version);\n                        file_put_contents($fileName, self::serial(self::$frames[$version]));\n                    }\n                } else {\n                    self::$frames[$version] = self::createFrame($version);\n                }\n            }\n            \n            if(is_null(self::$frames[$version]))\n                return null;\n\n            return self::$frames[$version];\n        }\n\n        //----------------------------------------------------------------------\n        public static function rsBlockNum($spec)     { return $spec[0] + $spec[3]; }\n        public static function rsBlockNum1($spec)    { return $spec[0]; }\n        public static function rsDataCodes1($spec)   { return $spec[1]; }\n        public static function rsEccCodes1($spec)    { return $spec[2]; }\n        public static function rsBlockNum2($spec)    { return $spec[3]; }\n        public static function rsDataCodes2($spec)   { return $spec[4]; }\n        public static function rsEccCodes2($spec)    { return $spec[2]; }\n        public static function rsDataLength($spec)   { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);    }\n        public static function rsEccLength($spec)    { return ($spec[0] + $spec[3]) * $spec[2]; }\n        \n    }\n\n\n\n//---- qrimage.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Image output of code using GD2\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n \n    define('QR_IMAGE', true);\n\n    class QRimage {\n    \n        //----------------------------------------------------------------------\n        public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) \n        {\n            $image = self::image($frame, $pixelPerPoint, $outerFrame);\n            \n            if ($filename === false) {\n                Header(\"Content-type: image/png\");\n                ImagePng($image);\n            } else {\n                if($saveandprint===TRUE){\n                    ImagePng($image, $filename);\n                    header(\"Content-type: image/png\");\n                    ImagePng($image);\n                }else{\n                    ImagePng($image, $filename);\n                }\n            }\n            \n            ImageDestroy($image);\n        }\n    \n        //----------------------------------------------------------------------\n        public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) \n        {\n            $image = self::image($frame, $pixelPerPoint, $outerFrame);\n            \n            if ($filename === false) {\n                Header(\"Content-type: image/jpeg\");\n                ImageJpeg($image, null, $q);\n            } else {\n                ImageJpeg($image, $filename, $q);            \n            }\n            \n            ImageDestroy($image);\n        }\n    \n        //----------------------------------------------------------------------\n        private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) \n        {\n            $h = count($frame);\n            $w = strlen($frame[0]);\n            \n            $imgW = $w + 2*$outerFrame;\n            $imgH = $h + 2*$outerFrame;\n            \n            $base_image =ImageCreate($imgW, $imgH);\n            \n            $col[0] = ImageColorAllocate($base_image,255,255,255);\n            $col[1] = ImageColorAllocate($base_image,0,0,0);\n\n            imagefill($base_image, 0, 0, $col[0]);\n\n            for($y=0; $y<$h; $y++) {\n                for($x=0; $x<$w; $x++) {\n                    if ($frame[$y][$x] == '1') {\n                        ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); \n                    }\n                }\n            }\n            \n            $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);\n            ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);\n            ImageDestroy($base_image);\n            \n            return $target_image;\n        }\n    }\n\n\n\n//---- qrinput.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Input encoding class\n *\n * Based on libqrencode C library distributed under LGPL 2.1\n * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n \n    define('STRUCTURE_HEADER_BITS',  20);\n    define('MAX_STRUCTURED_SYMBOLS', 16);\n\n    class QRinputItem {\n    \n        public $mode;\n        public $size;\n        public $data;\n        public $bstream;\n\n        public function __construct($mode, $size, $data, $bstream = null) \n        {\n            $setData = array_slice($data, 0, $size);\n            \n            if (count($setData) < $size) {\n                $setData = array_merge($setData, array_fill(0,$size-count($setData),0));\n            }\n        \n            if(!QRinput::check($mode, $size, $setData)) {\n                throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));\n                return null;\n            }\n            \n            $this->mode = $mode;\n            $this->size = $size;\n            $this->data = $setData;\n            $this->bstream = $bstream;\n        }\n        \n        //----------------------------------------------------------------------\n        public function encodeModeNum($version)\n        {\n            try {\n            \n                $words = (int)($this->size / 3);\n                $bs = new QRbitstream();\n                \n                $val = 0x1;\n                $bs->appendNum(4, $val);\n                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);\n\n                for($i=0; $i<$words; $i++) {\n                    $val  = (ord($this->data[$i*3  ]) - ord('0')) * 100;\n                    $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;\n                    $val += (ord($this->data[$i*3+2]) - ord('0'));\n                    $bs->appendNum(10, $val);\n                }\n\n                if($this->size - $words * 3 == 1) {\n                    $val = ord($this->data[$words*3]) - ord('0');\n                    $bs->appendNum(4, $val);\n                } else if($this->size - $words * 3 == 2) {\n                    $val  = (ord($this->data[$words*3  ]) - ord('0')) * 10;\n                    $val += (ord($this->data[$words*3+1]) - ord('0'));\n                    $bs->appendNum(7, $val);\n                }\n\n                $this->bstream = $bs;\n                return 0;\n                \n            } catch (Exception $e) {\n                return -1;\n            }\n        }\n        \n        //----------------------------------------------------------------------\n        public function encodeModeAn($version)\n        {\n            try {\n                $words = (int)($this->size / 2);\n                $bs = new QRbitstream();\n                \n                $bs->appendNum(4, 0x02);\n                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);\n\n                for($i=0; $i<$words; $i++) {\n                    $val  = (int)QRinput::lookAnTable(ord($this->data[$i*2  ])) * 45;\n                    $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));\n\n                    $bs->appendNum(11, $val);\n                }\n\n                if($this->size & 1) {\n                    $val = QRinput::lookAnTable(ord($this->data[$words * 2]));\n                    $bs->appendNum(6, $val);\n                }\n        \n                $this->bstream = $bs;\n                return 0;\n            \n            } catch (Exception $e) {\n                return -1;\n            }\n        }\n        \n        //----------------------------------------------------------------------\n        public function encodeMode8($version)\n        {\n            try {\n                $bs = new QRbitstream();\n\n                $bs->appendNum(4, 0x4);\n                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);\n\n                for($i=0; $i<$this->size; $i++) {\n                    $bs->appendNum(8, ord($this->data[$i]));\n                }\n\n                $this->bstream = $bs;\n                return 0;\n            \n            } catch (Exception $e) {\n                return -1;\n            }\n        }\n        \n        //----------------------------------------------------------------------\n        public function encodeModeKanji($version)\n        {\n            try {\n\n                $bs = new QRbitrtream();\n                \n                $bs->appendNum(4, 0x8);\n                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));\n\n                for($i=0; $i<$this->size; $i+=2) {\n                    $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);\n                    if($val <= 0x9ffc) {\n                        $val -= 0x8140;\n                    } else {\n                        $val -= 0xc140;\n                    }\n                    \n                    $h = ($val >> 8) * 0xc0;\n                    $val = ($val & 0xff) + $h;\n\n                    $bs->appendNum(13, $val);\n                }\n\n                $this->bstream = $bs;\n                return 0;\n            \n            } catch (Exception $e) {\n                return -1;\n            }\n        }\n\n        //----------------------------------------------------------------------\n        public function encodeModeStructure()\n        {\n            try {\n                $bs =  new QRbitstream();\n                \n                $bs->appendNum(4, 0x03);\n                $bs->appendNum(4, ord($this->data[1]) - 1);\n                $bs->appendNum(4, ord($this->data[0]) - 1);\n                $bs->appendNum(8, ord($this->data[2]));\n\n                $this->bstream = $bs;\n                return 0;\n            \n            } catch (Exception $e) {\n                return -1;\n            }\n        }\n        \n        //----------------------------------------------------------------------\n        public function estimateBitStreamSizeOfEntry($version)\n        {\n            $bits = 0;\n\n            if($version == 0) \n                $version = 1;\n\n            switch($this->mode) {\n                case QR_MODE_NUM:        $bits = QRinput::estimateBitsModeNum($this->size);    break;\n                case QR_MODE_AN:        $bits = QRinput::estimateBitsModeAn($this->size);    break;\n                case QR_MODE_8:            $bits = QRinput::estimateBitsMode8($this->size);    break;\n                case QR_MODE_KANJI:        $bits = QRinput::estimateBitsModeKanji($this->size);break;\n                case QR_MODE_STRUCTURE:    return STRUCTURE_HEADER_BITS;            \n                default:\n                    return 0;\n            }\n\n            $l = QRspec::lengthIndicator($this->mode, $version);\n            $m = 1 << $l;\n            $num = (int)(($this->size + $m - 1) / $m);\n\n            $bits += $num * (4 + $l);\n\n            return $bits;\n        }\n        \n        //----------------------------------------------------------------------\n        public function encodeBitStream($version)\n        {\n            try {\n            \n                unset($this->bstream);\n                $words = QRspec::maximumWords($this->mode, $version);\n                \n                if($this->size > $words) {\n                \n                    $st1 = new QRinputItem($this->mode, $words, $this->data);\n                    $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));\n\n                    $st1->encodeBitStream($version);\n                    $st2->encodeBitStream($version);\n                    \n                    $this->bstream = new QRbitstream();\n                    $this->bstream->append($st1->bstream);\n                    $this->bstream->append($st2->bstream);\n                    \n                    unset($st1);\n                    unset($st2);\n                    \n                } else {\n                    \n                    $ret = 0;\n                    \n                    switch($this->mode) {\n                        case QR_MODE_NUM:        $ret = $this->encodeModeNum($version);    break;\n                        case QR_MODE_AN:        $ret = $this->encodeModeAn($version);    break;\n                        case QR_MODE_8:            $ret = $this->encodeMode8($version);    break;\n                        case QR_MODE_KANJI:        $ret = $this->encodeModeKanji($version);break;\n                        case QR_MODE_STRUCTURE:    $ret = $this->encodeModeStructure();    break;\n                        \n                        default:\n                            break;\n                    }\n                    \n                    if($ret < 0)\n                        return -1;\n                }\n\n                return $this->bstream->size();\n            \n            } catch (Exception $e) {\n                return -1;\n            }\n        }\n    };\n    \n    //##########################################################################\n\n    class QRinput {\n\n        public $items;\n        \n        private $version;\n        private $level;\n        \n        //----------------------------------------------------------------------\n        public function __construct($version = 0, $level = QR_ECLEVEL_L)\n        {\n            if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {\n                throw new Exception('Invalid version no');\n                return NULL;\n            }\n            \n            $this->version = $version;\n            $this->level = $level;\n        }\n        \n        //----------------------------------------------------------------------\n        public function getVersion()\n        {\n            return $this->version;\n        }\n        \n        //----------------------------------------------------------------------\n        public function setVersion($version)\n        {\n            if($version < 0 || $version > QRSPEC_VERSION_MAX) {\n                throw new Exception('Invalid version no');\n                return -1;\n            }\n\n            $this->version = $version;\n\n            return 0;\n        }\n        \n        //----------------------------------------------------------------------\n        public function getErrorCorrectionLevel()\n        {\n            return $this->level;\n        }\n\n        //----------------------------------------------------------------------\n        public function setErrorCorrectionLevel($level)\n        {\n            if($level > QR_ECLEVEL_H) {\n                throw new Exception('Invalid ECLEVEL');\n                return -1;\n            }\n\n            $this->level = $level;\n\n            return 0;\n        }\n        \n        //----------------------------------------------------------------------\n        public function appendEntry(QRinputItem $entry)\n        {\n            $this->items[] = $entry;\n        }\n        \n        //----------------------------------------------------------------------\n        public function append($mode, $size, $data)\n        {\n            try {\n                $entry = new QRinputItem($mode, $size, $data);\n                $this->items[] = $entry;\n                return 0;\n            } catch (Exception $e) {\n                return -1;\n            }\n        }\n        \n        //----------------------------------------------------------------------\n        \n        public function insertStructuredAppendHeader($size, $index, $parity)\n        {\n            if( $size > MAX_STRUCTURED_SYMBOLS ) {\n                throw new Exception('insertStructuredAppendHeader wrong size');\n            }\n            \n            if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {\n                throw new Exception('insertStructuredAppendHeader wrong index');\n            }\n\n            $buf = array($size, $index, $parity);\n            \n            try {\n                $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);\n                array_unshift($this->items, $entry);\n                return 0;\n            } catch (Exception $e) {\n                return -1;\n            }\n        }\n\n        //----------------------------------------------------------------------\n        public function calcParity()\n        {\n            $parity = 0;\n            \n            foreach($this->items as $item) {\n                if($item->mode != QR_MODE_STRUCTURE) {\n                    for($i=$item->size-1; $i>=0; $i--) {\n                        $parity ^= $item->data[$i];\n                    }\n                }\n            }\n\n            return $parity;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function checkModeNum($size, $data)\n        {\n            for($i=0; $i<$size; $i++) {\n                if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        //----------------------------------------------------------------------\n        public static function estimateBitsModeNum($size)\n        {\n            $w = (int)$size / 3;\n            $bits = $w * 10;\n            \n            switch($size - $w * 3) {\n                case 1:\n                    $bits += 4;\n                    break;\n                case 2:\n                    $bits += 7;\n                    break;\n                default:\n                    break;\n            }\n\n            return $bits;\n        }\n        \n        //----------------------------------------------------------------------\n        public static $anTable = array(\n            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n            36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,\n             0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 44, -1, -1, -1, -1, -1,\n            -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n            25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,\n            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1\n        );\n        \n        //----------------------------------------------------------------------\n        public static function lookAnTable($c)\n        {\n            return (($c > 127)?-1:self::$anTable[$c]);\n        }\n        \n        //----------------------------------------------------------------------\n        public static function checkModeAn($size, $data)\n        {\n            for($i=0; $i<$size; $i++) {\n                if (self::lookAnTable(ord($data[$i])) == -1) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function estimateBitsModeAn($size)\n        {\n            $w = (int)($size / 2);\n            $bits = $w * 11;\n            \n            if($size & 1) {\n                $bits += 6;\n            }\n\n            return $bits;\n        }\n    \n        //----------------------------------------------------------------------\n        public static function estimateBitsMode8($size)\n        {\n            return $size * 8;\n        }\n        \n        //----------------------------------------------------------------------\n        public function estimateBitsModeKanji($size)\n        {\n            return (int)(($size / 2) * 13);\n        }\n        \n        //----------------------------------------------------------------------\n        public static function checkModeKanji($size, $data)\n        {\n            if($size & 1)\n                return false;\n\n            for($i=0; $i<$size; $i+=2) {\n                $val = (ord($data[$i]) << 8) | ord($data[$i+1]);\n                if( $val < 0x8140 \n                || ($val > 0x9ffc && $val < 0xe040) \n                || $val > 0xebbf) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        /***********************************************************************\n         * Validation\n         **********************************************************************/\n\n        public static function check($mode, $size, $data)\n        {\n            if($size <= 0) \n                return false;\n\n            switch($mode) {\n                case QR_MODE_NUM:       return self::checkModeNum($size, $data);   break;\n                case QR_MODE_AN:        return self::checkModeAn($size, $data);    break;\n                case QR_MODE_KANJI:     return self::checkModeKanji($size, $data); break;\n                case QR_MODE_8:         return true; break;\n                case QR_MODE_STRUCTURE: return true; break;\n                \n                default:\n                    break;\n            }\n\n            return false;\n        }\n        \n        \n        //----------------------------------------------------------------------\n        public function estimateBitStreamSize($version)\n        {\n            $bits = 0;\n\n            foreach($this->items as $item) {\n                $bits += $item->estimateBitStreamSizeOfEntry($version);\n            }\n\n            return $bits;\n        }\n        \n        //----------------------------------------------------------------------\n        public function estimateVersion()\n        {\n            $version = 0;\n            $prev = 0;\n            do {\n                $prev = $version;\n                $bits = $this->estimateBitStreamSize($prev);\n                $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);\n                if ($version < 0) {\n                    return -1;\n                }\n            } while ($version > $prev);\n\n            return $version;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function lengthOfCode($mode, $version, $bits)\n        {\n            $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);\n            switch($mode) {\n                case QR_MODE_NUM:\n                    $chunks = (int)($payload / 10);\n                    $remain = $payload - $chunks * 10;\n                    $size = $chunks * 3;\n                    if($remain >= 7) {\n                        $size += 2;\n                    } else if($remain >= 4) {\n                        $size += 1;\n                    }\n                    break;\n                case QR_MODE_AN:\n                    $chunks = (int)($payload / 11);\n                    $remain = $payload - $chunks * 11;\n                    $size = $chunks * 2;\n                    if($remain >= 6) \n                        $size++;\n                    break;\n                case QR_MODE_8:\n                    $size = (int)($payload / 8);\n                    break;\n                case QR_MODE_KANJI:\n                    $size = (int)(($payload / 13) * 2);\n                    break;\n                case QR_MODE_STRUCTURE:\n                    $size = (int)($payload / 8);\n                    break;\n                default:\n                    $size = 0;\n                    break;\n            }\n            \n            $maxsize = QRspec::maximumWords($mode, $version);\n            if($size < 0) $size = 0;\n            if($size > $maxsize) $size = $maxsize;\n\n            return $size;\n        }\n        \n        //----------------------------------------------------------------------\n        public function createBitStream()\n        {\n            $total = 0;\n\n            foreach($this->items as $item) {\n                $bits = $item->encodeBitStream($this->version);\n                \n                if($bits < 0) \n                    return -1;\n                    \n                $total += $bits;\n            }\n\n            return $total;\n        }\n        \n        //----------------------------------------------------------------------\n        public function convertData()\n        {\n            $ver = $this->estimateVersion();\n            if($ver > $this->getVersion()) {\n                $this->setVersion($ver);\n            }\n\n            for(;;) {\n                $bits = $this->createBitStream();\n                \n                if($bits < 0) \n                    return -1;\n                    \n                $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);\n                if($ver < 0) {\n                    throw new Exception('WRONG VERSION');\n                    return -1;\n                } else if($ver > $this->getVersion()) {\n                    $this->setVersion($ver);\n                } else {\n                    break;\n                }\n            }\n\n            return 0;\n        }\n        \n        //----------------------------------------------------------------------\n        public function appendPaddingBit(&$bstream)\n        {\n            $bits = $bstream->size();\n            $maxwords = QRspec::getDataLength($this->version, $this->level);\n            $maxbits = $maxwords * 8;\n\n            if ($maxbits == $bits) {\n                return 0;\n            }\n\n            if ($maxbits - $bits < 5) {\n                return $bstream->appendNum($maxbits - $bits, 0);\n            }\n\n            $bits += 4;\n            $words = (int)(($bits + 7) / 8);\n\n            $padding = new QRbitstream();\n            $ret = $padding->appendNum($words * 8 - $bits + 4, 0);\n            \n            if($ret < 0) \n                return $ret;\n\n            $padlen = $maxwords - $words;\n            \n            if($padlen > 0) {\n                \n                $padbuf = array();\n                for($i=0; $i<$padlen; $i++) {\n                    $padbuf[$i] = ($i&1)?0x11:0xec;\n                }\n                \n                $ret = $padding->appendBytes($padlen, $padbuf);\n                \n                if($ret < 0)\n                    return $ret;\n                \n            }\n\n            $ret = $bstream->append($padding);\n            \n            return $ret;\n        }\n\n        //----------------------------------------------------------------------\n        public function mergeBitStream()\n        {\n            if($this->convertData() < 0) {\n                return null;\n            }\n\n            $bstream = new QRbitstream();\n            \n            foreach($this->items as $item) {\n                $ret = $bstream->append($item->bstream);\n                if($ret < 0) {\n                    return null;\n                }\n            }\n\n            return $bstream;\n        }\n\n        //----------------------------------------------------------------------\n        public function getBitStream()\n        {\n\n            $bstream = $this->mergeBitStream();\n            \n            if($bstream == null) {\n                return null;\n            }\n            \n            $ret = $this->appendPaddingBit($bstream);\n            if($ret < 0) {\n                return null;\n            }\n\n            return $bstream;\n        }\n        \n        //----------------------------------------------------------------------\n        public function getByteStream()\n        {\n            $bstream = $this->getBitStream();\n            if($bstream == null) {\n                return null;\n            }\n            \n            return $bstream->toByte();\n        }\n    }\n        \n        \n    \n\n\n\n//---- qrbitstream.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Bitstream class\n *\n * Based on libqrencode C library distributed under LGPL 2.1\n * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n     \n    class QRbitstream {\n    \n        public $data = array();\n        \n        //----------------------------------------------------------------------\n        public function size()\n        {\n            return count($this->data);\n        }\n        \n        //----------------------------------------------------------------------\n        public function allocate($setLength)\n        {\n            $this->data = array_fill(0, $setLength, 0);\n            return 0;\n        }\n    \n        //----------------------------------------------------------------------\n        public static function newFromNum($bits, $num)\n        {\n            $bstream = new QRbitstream();\n            $bstream->allocate($bits);\n            \n            $mask = 1 << ($bits - 1);\n            for($i=0; $i<$bits; $i++) {\n                if($num & $mask) {\n                    $bstream->data[$i] = 1;\n                } else {\n                    $bstream->data[$i] = 0;\n                }\n                $mask = $mask >> 1;\n            }\n\n            return $bstream;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function newFromBytes($size, $data)\n        {\n            $bstream = new QRbitstream();\n            $bstream->allocate($size * 8);\n            $p=0;\n\n            for($i=0; $i<$size; $i++) {\n                $mask = 0x80;\n                for($j=0; $j<8; $j++) {\n                    if($data[$i] & $mask) {\n                        $bstream->data[$p] = 1;\n                    } else {\n                        $bstream->data[$p] = 0;\n                    }\n                    $p++;\n                    $mask = $mask >> 1;\n                }\n            }\n\n            return $bstream;\n        }\n        \n        //----------------------------------------------------------------------\n        public function append(QRbitstream $arg)\n        {\n            if (is_null($arg)) {\n                return -1;\n            }\n            \n            if($arg->size() == 0) {\n                return 0;\n            }\n            \n            if($this->size() == 0) {\n                $this->data = $arg->data;\n                return 0;\n            }\n            \n            $this->data = array_values(array_merge($this->data, $arg->data));\n\n            return 0;\n        }\n        \n        //----------------------------------------------------------------------\n        public function appendNum($bits, $num)\n        {\n            if ($bits == 0) \n                return 0;\n\n            $b = QRbitstream::newFromNum($bits, $num);\n            \n            if(is_null($b))\n                return -1;\n\n            $ret = $this->append($b);\n            unset($b);\n\n            return $ret;\n        }\n\n        //----------------------------------------------------------------------\n        public function appendBytes($size, $data)\n        {\n            if ($size == 0) \n                return 0;\n\n            $b = QRbitstream::newFromBytes($size, $data);\n            \n            if(is_null($b))\n                return -1;\n\n            $ret = $this->append($b);\n            unset($b);\n\n            return $ret;\n        }\n        \n        //----------------------------------------------------------------------\n        public function toByte()\n        {\n        \n            $size = $this->size();\n\n            if($size == 0) {\n                return array();\n            }\n            \n            $data = array_fill(0, (int)(($size + 7) / 8), 0);\n            $bytes = (int)($size / 8);\n\n            $p = 0;\n            \n            for($i=0; $i<$bytes; $i++) {\n                $v = 0;\n                for($j=0; $j<8; $j++) {\n                    $v = $v << 1;\n                    $v |= $this->data[$p];\n                    $p++;\n                }\n                $data[$i] = $v;\n            }\n            \n            if($size & 7) {\n                $v = 0;\n                for($j=0; $j<($size & 7); $j++) {\n                    $v = $v << 1;\n                    $v |= $this->data[$p];\n                    $p++;\n                }\n                $data[$bytes] = $v;\n            }\n\n            return $data;\n        }\n\n    }\n\n\n\n\n//---- qrsplit.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Input splitting classes\n *\n * Based on libqrencode C library distributed under LGPL 2.1\n * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * The following data / specifications are taken from\n * \"Two dimensional symbol -- QR-code -- Basic Specification\" (JIS X0510:2004)\n *  or\n * \"Automatic identification and data capture techniques -- \n *  QR Code 2005 bar code symbology specification\" (ISO/IEC 18004:2006)\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n    class QRsplit {\n\n        public $dataStr = '';\n        public $input;\n        public $modeHint;\n\n        //----------------------------------------------------------------------\n        public function __construct($dataStr, $input, $modeHint) \n        {\n            $this->dataStr  = $dataStr;\n            $this->input    = $input;\n            $this->modeHint = $modeHint;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function isdigitat($str, $pos)\n        {    \n            if ($pos >= strlen($str))\n                return false;\n            \n            return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));\n        }\n        \n        //----------------------------------------------------------------------\n        public static function isalnumat($str, $pos)\n        {\n            if ($pos >= strlen($str))\n                return false;\n                \n            return (QRinput::lookAnTable(ord($str[$pos])) >= 0);\n        }\n\n        //----------------------------------------------------------------------\n        public function identifyMode($pos)\n        {\n            if ($pos >= strlen($this->dataStr)) \n                return QR_MODE_NUL;\n                \n            $c = $this->dataStr[$pos];\n            \n            if(self::isdigitat($this->dataStr, $pos)) {\n                return QR_MODE_NUM;\n            } else if(self::isalnumat($this->dataStr, $pos)) {\n                return QR_MODE_AN;\n            } else if($this->modeHint == QR_MODE_KANJI) {\n            \n                if ($pos+1 < strlen($this->dataStr)) \n                {\n                    $d = $this->dataStr[$pos+1];\n                    $word = (ord($c) << 8) | ord($d);\n                    if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {\n                        return QR_MODE_KANJI;\n                    }\n                }\n            }\n\n            return QR_MODE_8;\n        } \n        \n        //----------------------------------------------------------------------\n        public function eatNum()\n        {\n            $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\n\n            $p = 0;\n            while(self::isdigitat($this->dataStr, $p)) {\n                $p++;\n            }\n            \n            $run = $p;\n            $mode = $this->identifyMode($p);\n            \n            if($mode == QR_MODE_8) {\n                $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln\n                     + QRinput::estimateBitsMode8(1)         // + 4 + l8\n                     - QRinput::estimateBitsMode8($run + 1); // - 4 - l8\n                if($dif > 0) {\n                    return $this->eat8();\n                }\n            }\n            if($mode == QR_MODE_AN) {\n                $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln\n                     + QRinput::estimateBitsModeAn(1)        // + 4 + la\n                     - QRinput::estimateBitsModeAn($run + 1);// - 4 - la\n                if($dif > 0) {\n                    return $this->eatAn();\n                }\n            }\n            \n            $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));\n            if($ret < 0)\n                return -1;\n\n            return $run;\n        }\n        \n        //----------------------------------------------------------------------\n        public function eatAn()\n        {\n            $la = QRspec::lengthIndicator(QR_MODE_AN,  $this->input->getVersion());\n            $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\n\n            $p = 0;\n            \n            while(self::isalnumat($this->dataStr, $p)) {\n                if(self::isdigitat($this->dataStr, $p)) {\n                    $q = $p;\n                    while(self::isdigitat($this->dataStr, $q)) {\n                        $q++;\n                    }\n                    \n                    $dif = QRinput::estimateBitsModeAn($p) // + 4 + la\n                         + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln\n                         - QRinput::estimateBitsModeAn($q); // - 4 - la\n                         \n                    if($dif < 0) {\n                        break;\n                    } else {\n                        $p = $q;\n                    }\n                } else {\n                    $p++;\n                }\n            }\n\n            $run = $p;\n\n            if(!self::isalnumat($this->dataStr, $p)) {\n                $dif = QRinput::estimateBitsModeAn($run) + 4 + $la\n                     + QRinput::estimateBitsMode8(1) // + 4 + l8\n                      - QRinput::estimateBitsMode8($run + 1); // - 4 - l8\n                if($dif > 0) {\n                    return $this->eat8();\n                }\n            }\n\n            $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));\n            if($ret < 0)\n                return -1;\n\n            return $run;\n        }\n        \n        //----------------------------------------------------------------------\n        public function eatKanji()\n        {\n            $p = 0;\n            \n            while($this->identifyMode($p) == QR_MODE_KANJI) {\n                $p += 2;\n            }\n            \n            $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));\n            if($ret < 0)\n                return -1;\n\n            return $run;\n        }\n\n        //----------------------------------------------------------------------\n        public function eat8()\n        {\n            $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());\n            $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());\n\n            $p = 1;\n            $dataStrLen = strlen($this->dataStr);\n            \n            while($p < $dataStrLen) {\n                \n                $mode = $this->identifyMode($p);\n                if($mode == QR_MODE_KANJI) {\n                    break;\n                }\n                if($mode == QR_MODE_NUM) {\n                    $q = $p;\n                    while(self::isdigitat($this->dataStr, $q)) {\n                        $q++;\n                    }\n                    $dif = QRinput::estimateBitsMode8($p) // + 4 + l8\n                         + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln\n                         - QRinput::estimateBitsMode8($q); // - 4 - l8\n                    if($dif < 0) {\n                        break;\n                    } else {\n                        $p = $q;\n                    }\n                } else if($mode == QR_MODE_AN) {\n                    $q = $p;\n                    while(self::isalnumat($this->dataStr, $q)) {\n                        $q++;\n                    }\n                    $dif = QRinput::estimateBitsMode8($p)  // + 4 + l8\n                         + QRinput::estimateBitsModeAn($q - $p) + 4 + $la\n                         - QRinput::estimateBitsMode8($q); // - 4 - l8\n                    if($dif < 0) {\n                        break;\n                    } else {\n                        $p = $q;\n                    }\n                } else {\n                    $p++;\n                }\n            }\n\n            $run = $p;\n            $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));\n            \n            if($ret < 0)\n                return -1;\n\n            return $run;\n        }\n\n        //----------------------------------------------------------------------\n        public function splitString()\n        {\n            while (strlen($this->dataStr) > 0)\n            {\n                if($this->dataStr == '')\n                    return 0;\n\n                $mode = $this->identifyMode(0);\n                \n                switch ($mode) {\n                    case QR_MODE_NUM: $length = $this->eatNum(); break;\n                    case QR_MODE_AN:  $length = $this->eatAn(); break;\n                    case QR_MODE_KANJI:\n                        if ($hint == QR_MODE_KANJI)\n                                $length = $this->eatKanji();\n                        else    $length = $this->eat8();\n                        break;\n                    default: $length = $this->eat8(); break;\n                \n                }\n\n                if($length == 0) return 0;\n                if($length < 0)  return -1;\n                \n                $this->dataStr = substr($this->dataStr, $length);\n            }\n        }\n\n        //----------------------------------------------------------------------\n        public function toUpper()\n        {\n            $stringLen = strlen($this->dataStr);\n            $p = 0;\n            \n            while ($p<$stringLen) {\n                $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);\n                if($mode == QR_MODE_KANJI) {\n                    $p += 2;\n                } else {\n                    if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {\n                        $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);\n                    }\n                    $p++;\n                }\n            }\n\n            return $this->dataStr;\n        }\n\n        //----------------------------------------------------------------------\n        public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)\n        {\n            if(is_null($string) || $string == '\\0' || $string == '') {\n                throw new Exception('empty string!!!');\n            }\n\n            $split = new QRsplit($string, $input, $modeHint);\n            \n            if(!$casesensitive)\n                $split->toUpper();\n                \n            return $split->splitString();\n        }\n    }\n\n\n\n//---- qrrscode.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Reed-Solomon error correction support\n * \n * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q\n * (libfec is released under the GNU Lesser General Public License.)\n *\n * Based on libqrencode C library distributed under LGPL 2.1\n * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n \n    class QRrsItem {\n    \n        public $mm;                  // Bits per symbol \n        public $nn;                  // Symbols per block (= (1<<mm)-1) \n        public $alpha_to = array();  // log lookup table \n        public $index_of = array();  // Antilog lookup table \n        public $genpoly = array();   // Generator polynomial \n        public $nroots;              // Number of generator roots = number of parity symbols \n        public $fcr;                 // First consecutive root, index form \n        public $prim;                // Primitive element, index form \n        public $iprim;               // prim-th root of 1, index form \n        public $pad;                 // Padding bytes in shortened block \n        public $gfpoly;\n    \n        //----------------------------------------------------------------------\n        public function modnn($x)\n        {\n            while ($x >= $this->nn) {\n                $x -= $this->nn;\n                $x = ($x >> $this->mm) + ($x & $this->nn);\n            }\n            \n            return $x;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)\n        {\n            // Common code for intializing a Reed-Solomon control block (char or int symbols)\n            // Copyright 2004 Phil Karn, KA9Q\n            // May be used under the terms of the GNU Lesser General Public License (LGPL)\n\n            $rs = null;\n            \n            // Check parameter ranges\n            if($symsize < 0 || $symsize > 8)                     return $rs;\n            if($fcr < 0 || $fcr >= (1<<$symsize))                return $rs;\n            if($prim <= 0 || $prim >= (1<<$symsize))             return $rs;\n            if($nroots < 0 || $nroots >= (1<<$symsize))          return $rs; // Can't have more roots than symbol values!\n            if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding\n\n            $rs = new QRrsItem();\n            $rs->mm = $symsize;\n            $rs->nn = (1<<$symsize)-1;\n            $rs->pad = $pad;\n\n            $rs->alpha_to = array_fill(0, $rs->nn+1, 0);\n            $rs->index_of = array_fill(0, $rs->nn+1, 0);\n          \n            // PHP style macro replacement ;)\n            $NN =& $rs->nn;\n            $A0 =& $NN;\n            \n            // Generate Galois field lookup tables\n            $rs->index_of[0] = $A0; // log(zero) = -inf\n            $rs->alpha_to[$A0] = 0; // alpha**-inf = 0\n            $sr = 1;\n          \n            for($i=0; $i<$rs->nn; $i++) {\n                $rs->index_of[$sr] = $i;\n                $rs->alpha_to[$i] = $sr;\n                $sr <<= 1;\n                if($sr & (1<<$symsize)) {\n                    $sr ^= $gfpoly;\n                }\n                $sr &= $rs->nn;\n            }\n            \n            if($sr != 1){\n                // field generator polynomial is not primitive!\n                $rs = NULL;\n                return $rs;\n            }\n\n            /* Form RS code generator polynomial from its roots */\n            $rs->genpoly = array_fill(0, $nroots+1, 0);\n        \n            $rs->fcr = $fcr;\n            $rs->prim = $prim;\n            $rs->nroots = $nroots;\n            $rs->gfpoly = $gfpoly;\n\n            /* Find prim-th root of 1, used in decoding */\n            for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)\n            ; // intentional empty-body loop!\n            \n            $rs->iprim = (int)($iprim / $prim);\n            $rs->genpoly[0] = 1;\n            \n            for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {\n                $rs->genpoly[$i+1] = 1;\n\n                // Multiply rs->genpoly[] by  @**(root + x)\n                for ($j = $i; $j > 0; $j--) {\n                    if ($rs->genpoly[$j] != 0) {\n                        $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];\n                    } else {\n                        $rs->genpoly[$j] = $rs->genpoly[$j-1];\n                    }\n                }\n                // rs->genpoly[0] can never be zero\n                $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];\n            }\n            \n            // convert rs->genpoly[] to index form for quicker encoding\n            for ($i = 0; $i <= $nroots; $i++)\n                $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];\n\n            return $rs;\n        }\n        \n        //----------------------------------------------------------------------\n        public function encode_rs_char($data, &$parity)\n        {\n            $MM       =& $this->mm;\n            $NN       =& $this->nn;\n            $ALPHA_TO =& $this->alpha_to;\n            $INDEX_OF =& $this->index_of;\n            $GENPOLY  =& $this->genpoly;\n            $NROOTS   =& $this->nroots;\n            $FCR      =& $this->fcr;\n            $PRIM     =& $this->prim;\n            $IPRIM    =& $this->iprim;\n            $PAD      =& $this->pad;\n            $A0       =& $NN;\n\n            $parity = array_fill(0, $NROOTS, 0);\n\n            for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {\n                \n                $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];\n                if($feedback != $A0) {      \n                    // feedback term is non-zero\n            \n                    // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must\n                    // always be for the polynomials constructed by init_rs()\n                    $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);\n            \n                    for($j=1;$j<$NROOTS;$j++) {\n                        $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];\n                    }\n                }\n                \n                // Shift \n                array_shift($parity);\n                if($feedback != $A0) {\n                    array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);\n                } else {\n                    array_push($parity, 0);\n                }\n            }\n        }\n    }\n    \n    //##########################################################################\n    \n    class QRrs {\n    \n        public static $items = array();\n        \n        //----------------------------------------------------------------------\n        public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)\n        {\n            foreach(self::$items as $rs) {\n                if($rs->pad != $pad)       continue;\n                if($rs->nroots != $nroots) continue;\n                if($rs->mm != $symsize)    continue;\n                if($rs->gfpoly != $gfpoly) continue;\n                if($rs->fcr != $fcr)       continue;\n                if($rs->prim != $prim)     continue;\n\n                return $rs;\n            }\n\n            $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);\n            array_unshift(self::$items, $rs);\n\n            return $rs;\n        }\n    }\n\n\n\n//---- qrmask.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Masking\n *\n * Based on libqrencode C library distributed under LGPL 2.1\n * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n \n\tdefine('N1', 3);\n\tdefine('N2', 3);\n\tdefine('N3', 40);\n\tdefine('N4', 10);\n\n\tclass QRmask {\n\t\n\t\tpublic $runLength = array();\n\t\t\n\t\t//----------------------------------------------------------------------\n\t\tpublic function __construct() \n        {\n            $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);\n        }\n        \n        //----------------------------------------------------------------------\n        public function writeFormatInformation($width, &$frame, $mask, $level)\n        {\n            $blacks = 0;\n            $format =  QRspec::getFormatInfo($mask, $level);\n\n            for($i=0; $i<8; $i++) {\n                if($format & 1) {\n                    $blacks += 2;\n                    $v = 0x85;\n                } else {\n                    $v = 0x84;\n                }\n                \n                $frame[8][$width - 1 - $i] = chr($v);\n                if($i < 6) {\n                    $frame[$i][8] = chr($v);\n                } else {\n                    $frame[$i + 1][8] = chr($v);\n                }\n                $format = $format >> 1;\n            }\n            \n            for($i=0; $i<7; $i++) {\n                if($format & 1) {\n                    $blacks += 2;\n                    $v = 0x85;\n                } else {\n                    $v = 0x84;\n                }\n                \n                $frame[$width - 7 + $i][8] = chr($v);\n                if($i == 0) {\n                    $frame[8][7] = chr($v);\n                } else {\n                    $frame[8][6 - $i] = chr($v);\n                }\n                \n                $format = $format >> 1;\n            }\n\n            return $blacks;\n        }\n        \n        //----------------------------------------------------------------------\n        public function mask0($x, $y) { return ($x+$y)&1;                       }\n        public function mask1($x, $y) { return ($y&1);                          }\n        public function mask2($x, $y) { return ($x%3);                          }\n        public function mask3($x, $y) { return ($x+$y)%3;                       }\n        public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }\n        public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3;           }\n        public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1;       }\n        public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1;     }\n        \n        //----------------------------------------------------------------------\n        private function generateMaskNo($maskNo, $width, $frame)\n        {\n            $bitMask = array_fill(0, $width, array_fill(0, $width, 0));\n            \n            for($y=0; $y<$width; $y++) {\n                for($x=0; $x<$width; $x++) {\n                    if(ord($frame[$y][$x]) & 0x80) {\n                        $bitMask[$y][$x] = 0;\n                    } else {\n                        $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);\n                        $bitMask[$y][$x] = ($maskFunc == 0)?1:0;\n                    }\n                    \n                }\n            }\n            \n            return $bitMask;\n        }\n        \n        //----------------------------------------------------------------------\n        public static function serial($bitFrame)\n        {\n            $codeArr = array();\n            \n            foreach ($bitFrame as $line)\n                $codeArr[] = join('', $line);\n                \n            return gzcompress(join(\"\\n\", $codeArr), 9);\n        }\n        \n        //----------------------------------------------------------------------\n        public static function unserial($code)\n        {\n            $codeArr = array();\n            \n            $codeLines = explode(\"\\n\", gzuncompress($code));\n            foreach ($codeLines as $line)\n                $codeArr[] = str_split($line);\n            \n            return $codeArr;\n        }\n        \n        //----------------------------------------------------------------------\n        public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) \n        {\n            $b = 0;\n            $bitMask = array();\n            \n            $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';\n\n            if (QR_CACHEABLE) {\n                if (file_exists($fileName)) {\n                    $bitMask = self::unserial(file_get_contents($fileName));\n                } else {\n                    $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);\n                    if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))\n                        mkdir(QR_CACHE_DIR.'mask_'.$maskNo);\n                    file_put_contents($fileName, self::serial($bitMask));\n                }\n            } else {\n                $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);\n            }\n\n            if ($maskGenOnly)\n                return;\n                \n            $d = $s;\n\n            for($y=0; $y<$width; $y++) {\n                for($x=0; $x<$width; $x++) {\n                    if($bitMask[$y][$x] == 1) {\n                        $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);\n                    }\n                    $b += (int)(ord($d[$y][$x]) & 1);\n                }\n            }\n\n            return $b;\n        }\n        \n        //----------------------------------------------------------------------\n        public function makeMask($width, $frame, $maskNo, $level)\n        {\n            $masked = array_fill(0, $width, str_repeat(\"\\0\", $width));\n            $this->makeMaskNo($maskNo, $width, $frame, $masked);\n            $this->writeFormatInformation($width, $masked, $maskNo, $level);\n       \n            return $masked;\n        }\n        \n        //----------------------------------------------------------------------\n        public function calcN1N3($length)\n        {\n            $demerit = 0;\n\n            for($i=0; $i<$length; $i++) {\n                \n                if($this->runLength[$i] >= 5) {\n                    $demerit += (N1 + ($this->runLength[$i] - 5));\n                }\n                if($i & 1) {\n                    if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {\n                        $fact = (int)($this->runLength[$i] / 3);\n                        if(($this->runLength[$i-2] == $fact) &&\n                           ($this->runLength[$i-1] == $fact) &&\n                           ($this->runLength[$i+1] == $fact) &&\n                           ($this->runLength[$i+2] == $fact)) {\n                            if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {\n                                $demerit += N3;\n                            } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {\n                                $demerit += N3;\n                            }\n                        }\n                    }\n                }\n            }\n            return $demerit;\n        }\n        \n        //----------------------------------------------------------------------\n        public function evaluateSymbol($width, $frame)\n        {\n            $head = 0;\n            $demerit = 0;\n\n            for($y=0; $y<$width; $y++) {\n                $head = 0;\n                $this->runLength[0] = 1;\n                \n                $frameY = $frame[$y];\n                \n                if ($y>0)\n                    $frameYM = $frame[$y-1];\n                \n                for($x=0; $x<$width; $x++) {\n                    if(($x > 0) && ($y > 0)) {\n                        $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);\n                        $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);\n                        \n                        if(($b22 | ($w22 ^ 1))&1) {                                                                     \n                            $demerit += N2;\n                        }\n                    }\n                    if(($x == 0) && (ord($frameY[$x]) & 1)) {\n                        $this->runLength[0] = -1;\n                        $head = 1;\n                        $this->runLength[$head] = 1;\n                    } else if($x > 0) {\n                        if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {\n                            $head++;\n                            $this->runLength[$head] = 1;\n                        } else {\n                            $this->runLength[$head]++;\n                        }\n                    }\n                }\n    \n                $demerit += $this->calcN1N3($head+1);\n            }\n\n            for($x=0; $x<$width; $x++) {\n                $head = 0;\n                $this->runLength[0] = 1;\n                \n                for($y=0; $y<$width; $y++) {\n                    if($y == 0 && (ord($frame[$y][$x]) & 1)) {\n                        $this->runLength[0] = -1;\n                        $head = 1;\n                        $this->runLength[$head] = 1;\n                    } else if($y > 0) {\n                        if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {\n                            $head++;\n                            $this->runLength[$head] = 1;\n                        } else {\n                            $this->runLength[$head]++;\n                        }\n                    }\n                }\n            \n                $demerit += $this->calcN1N3($head+1);\n            }\n\n            return $demerit;\n        }\n        \n        \n        //----------------------------------------------------------------------\n        public function mask($width, $frame, $level)\n        {\n            $minDemerit = PHP_INT_MAX;\n            $bestMaskNum = 0;\n            $bestMask = array();\n            \n            $checked_masks = array(0,1,2,3,4,5,6,7);\n            \n            if (QR_FIND_FROM_RANDOM !== false) {\n            \n                $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);\n                for ($i = 0; $i <  $howManuOut; $i++) {\n                    $remPos = rand (0, count($checked_masks)-1);\n                    unset($checked_masks[$remPos]);\n                    $checked_masks = array_values($checked_masks);\n                }\n            \n            }\n            \n            $bestMask = $frame;\n             \n            foreach($checked_masks as $i) {\n                $mask = array_fill(0, $width, str_repeat(\"\\0\", $width));\n\n                $demerit = 0;\n                $blacks = 0;\n                $blacks  = $this->makeMaskNo($i, $width, $frame, $mask);\n                $blacks += $this->writeFormatInformation($width, $mask, $i, $level);\n                $blacks  = (int)(100 * $blacks / ($width * $width));\n                $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);\n                $demerit += $this->evaluateSymbol($width, $mask);\n                \n                if($demerit < $minDemerit) {\n                    $minDemerit = $demerit;\n                    $bestMask = $mask;\n                    $bestMaskNum = $i;\n                }\n            }\n            \n            return $bestMask;\n        }\n        \n        //----------------------------------------------------------------------\n    }\n\n\n\n\n//---- qrencode.php -----------------------------\n\n\n\n\n/*\n * PHP QR Code encoder\n *\n * Main encoder classes.\n *\n * Based on libqrencode C library distributed under LGPL 2.1\n * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>\n *\n * PHP QR Code is distributed under LGPL 3\n * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n */\n \n    class QRrsblock {\n        public $dataLength;\n        public $data = array();\n        public $eccLength;\n        public $ecc = array();\n        \n        public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)\n        {\n            $rs->encode_rs_char($data, $ecc);\n        \n            $this->dataLength = $dl;\n            $this->data = $data;\n            $this->eccLength = $el;\n            $this->ecc = $ecc;\n        }\n    };\n    \n    //##########################################################################\n\n    class QRrawcode {\n        public $version;\n        public $datacode = array();\n        public $ecccode = array();\n        public $blocks;\n        public $rsblocks = array(); //of RSblock\n        public $count;\n        public $dataLength;\n        public $eccLength;\n        public $b1;\n        \n        //----------------------------------------------------------------------\n        public function __construct(QRinput $input)\n        {\n            $spec = array(0,0,0,0,0);\n            \n            $this->datacode = $input->getByteStream();\n            if(is_null($this->datacode)) {\n                throw new Exception('null imput string');\n            }\n\n            QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);\n\n            $this->version = $input->getVersion();\n            $this->b1 = QRspec::rsBlockNum1($spec);\n            $this->dataLength = QRspec::rsDataLength($spec);\n            $this->eccLength = QRspec::rsEccLength($spec);\n            $this->ecccode = array_fill(0, $this->eccLength, 0);\n            $this->blocks = QRspec::rsBlockNum($spec);\n            \n            $ret = $this->init($spec);\n            if($ret < 0) {\n                throw new Exception('block alloc error');\n                return null;\n            }\n\n            $this->count = 0;\n        }\n        \n        //----------------------------------------------------------------------\n        public function init(array $spec)\n        {\n            $dl = QRspec::rsDataCodes1($spec);\n            $el = QRspec::rsEccCodes1($spec);\n            $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);\n            \n\n            $blockNo = 0;\n            $dataPos = 0;\n            $eccPos = 0;\n            for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {\n                $ecc = array_slice($this->ecccode,$eccPos);\n                $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el,  $ecc, $rs);\n                $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);\n                \n                $dataPos += $dl;\n                $eccPos += $el;\n                $blockNo++;\n            }\n\n            if(QRspec::rsBlockNum2($spec) == 0)\n                return 0;\n\n            $dl = QRspec::rsDataCodes2($spec);\n            $el = QRspec::rsEccCodes2($spec);\n            $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);\n            \n            if($rs == NULL) return -1;\n            \n            for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {\n                $ecc = array_slice($this->ecccode,$eccPos);\n                $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);\n                $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);\n                \n                $dataPos += $dl;\n                $eccPos += $el;\n                $blockNo++;\n            }\n\n            return 0;\n        }\n        \n        //----------------------------------------------------------------------\n        public function getCode()\n        {\n            $ret;\n\n            if($this->count < $this->dataLength) {\n                $row = $this->count % $this->blocks;\n                $col = $this->count / $this->blocks;\n                if($col >= $this->rsblocks[0]->dataLength) {\n                    $row += $this->b1;\n                }\n                $ret = $this->rsblocks[$row]->data[$col];\n            } else if($this->count < $this->dataLength + $this->eccLength) {\n                $row = ($this->count - $this->dataLength) % $this->blocks;\n                $col = ($this->count - $this->dataLength) / $this->blocks;\n                $ret = $this->rsblocks[$row]->ecc[$col];\n            } else {\n                return 0;\n            }\n            $this->count++;\n            \n            return $ret;\n        }\n    }\n\n    //##########################################################################\n    \n    class QRcode {\n    \n        public $version;\n        public $width;\n        public $data; \n        \n        //----------------------------------------------------------------------\n        public function encodeMask(QRinput $input, $mask)\n        {\n            if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {\n                throw new Exception('wrong version');\n            }\n            if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {\n                throw new Exception('wrong level');\n            }\n\n            $raw = new QRrawcode($input);\n            \n            QRtools::markTime('after_raw');\n            \n            $version = $raw->version;\n            $width = QRspec::getWidth($version);\n            $frame = QRspec::newFrame($version);\n            \n            $filler = new FrameFiller($width, $frame);\n            if(is_null($filler)) {\n                return NULL;\n            }\n\n            // inteleaved data and ecc codes\n            for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {\n                $code = $raw->getCode();\n                $bit = 0x80;\n                for($j=0; $j<8; $j++) {\n                    $addr = $filler->next();\n                    $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));\n                    $bit = $bit >> 1;\n                }\n            }\n            \n            QRtools::markTime('after_filler');\n            \n            unset($raw);\n            \n            // remainder bits\n            $j = QRspec::getRemainder($version);\n            for($i=0; $i<$j; $i++) {\n                $addr = $filler->next();\n                $filler->setFrameAt($addr, 0x02);\n            }\n            \n            $frame = $filler->frame;\n            unset($filler);\n            \n            \n            // masking\n            $maskObj = new QRmask();\n            if($mask < 0) {\n            \n                if (QR_FIND_BEST_MASK) {\n                    $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());\n                } else {\n                    $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());\n                }\n            } else {\n                $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());\n            }\n            \n            if($masked == NULL) {\n                return NULL;\n            }\n            \n            QRtools::markTime('after_mask');\n            \n            $this->version = $version;\n            $this->width = $width;\n            $this->data = $masked;\n            \n            return $this;\n        }\n    \n        //----------------------------------------------------------------------\n        public function encodeInput(QRinput $input)\n        {\n            return $this->encodeMask($input, -1);\n        }\n        \n        //----------------------------------------------------------------------\n        public function encodeString8bit($string, $version, $level)\n        {\n            if(string == NULL) {\n                throw new Exception('empty string!');\n                return NULL;\n            }\n\n            $input = new QRinput($version, $level);\n            if($input == NULL) return NULL;\n\n            $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));\n            if($ret < 0) {\n                unset($input);\n                return NULL;\n            }\n            return $this->encodeInput($input);\n        }\n\n        //----------------------------------------------------------------------\n        public function encodeString($string, $version, $level, $hint, $casesensitive)\n        {\n\n            if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {\n                throw new Exception('bad hint');\n                return NULL;\n            }\n\n            $input = new QRinput($version, $level);\n            if($input == NULL) return NULL;\n\n            $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);\n            if($ret < 0) {\n                return NULL;\n            }\n\n            return $this->encodeInput($input);\n        }\n        \n        //----------------------------------------------------------------------\n        public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) \n        {\n            $enc = QRencode::factory($level, $size, $margin);\n            return $enc->encodePNG($text, $outfile, $saveandprint=false);\n        }\n\n        //----------------------------------------------------------------------\n        public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) \n        {\n            $enc = QRencode::factory($level, $size, $margin);\n            return $enc->encode($text, $outfile);\n        }\n\n        //----------------------------------------------------------------------\n        public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) \n        {\n            $enc = QRencode::factory($level, $size, $margin);\n            return $enc->encodeRAW($text, $outfile);\n        }\n    }\n    \n    //##########################################################################\n    \n    class FrameFiller {\n    \n        public $width;\n        public $frame;\n        public $x;\n        public $y;\n        public $dir;\n        public $bit;\n        \n        //----------------------------------------------------------------------\n        public function __construct($width, &$frame)\n        {\n            $this->width = $width;\n            $this->frame = $frame;\n            $this->x = $width - 1;\n            $this->y = $width - 1;\n            $this->dir = -1;\n            $this->bit = -1;\n        }\n        \n        //----------------------------------------------------------------------\n        public function setFrameAt($at, $val)\n        {\n            $this->frame[$at['y']][$at['x']] = chr($val);\n        }\n        \n        //----------------------------------------------------------------------\n        public function getFrameAt($at)\n        {\n            return ord($this->frame[$at['y']][$at['x']]);\n        }\n        \n        //----------------------------------------------------------------------\n        public function next()\n        {\n            do {\n            \n                if($this->bit == -1) {\n                    $this->bit = 0;\n                    return array('x'=>$this->x, 'y'=>$this->y);\n                }\n\n                $x = $this->x;\n                $y = $this->y;\n                $w = $this->width;\n\n                if($this->bit == 0) {\n                    $x--;\n                    $this->bit++;\n                } else {\n                    $x++;\n                    $y += $this->dir;\n                    $this->bit--;\n                }\n\n                if($this->dir < 0) {\n                    if($y < 0) {\n                        $y = 0;\n                        $x -= 2;\n                        $this->dir = 1;\n                        if($x == 6) {\n                            $x--;\n                            $y = 9;\n                        }\n                    }\n                } else {\n                    if($y == $w) {\n                        $y = $w - 1;\n                        $x -= 2;\n                        $this->dir = -1;\n                        if($x == 6) {\n                            $x--;\n                            $y -= 8;\n                        }\n                    }\n                }\n                if($x < 0 || $y < 0) return null;\n\n                $this->x = $x;\n                $this->y = $y;\n\n            } while(ord($this->frame[$y][$x]) & 0x80);\n                        \n            return array('x'=>$x, 'y'=>$y);\n        }\n        \n    } ;\n    \n    //##########################################################################    \n    \n    class QRencode {\n    \n        public $casesensitive = true;\n        public $eightbit = false;\n        \n        public $version = 0;\n        public $size = 3;\n        public $margin = 4;\n        \n        public $structured = 0; // not supported yet\n        \n        public $level = QR_ECLEVEL_L;\n        public $hint = QR_MODE_8;\n        \n        //----------------------------------------------------------------------\n        public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)\n        {\n            $enc = new QRencode();\n            $enc->size = $size;\n            $enc->margin = $margin;\n            \n            switch ($level.'') {\n                case '0':\n                case '1':\n                case '2':\n                case '3':\n                        $enc->level = $level;\n                    break;\n                case 'l':\n                case 'L':\n                        $enc->level = QR_ECLEVEL_L;\n                    break;\n                case 'm':\n                case 'M':\n                        $enc->level = QR_ECLEVEL_M;\n                    break;\n                case 'q':\n                case 'Q':\n                        $enc->level = QR_ECLEVEL_Q;\n                    break;\n                case 'h':\n                case 'H':\n                        $enc->level = QR_ECLEVEL_H;\n                    break;\n            }\n            \n            return $enc;\n        }\n        \n        //----------------------------------------------------------------------\n        public function encodeRAW($intext, $outfile = false) \n        {\n            $code = new QRcode();\n\n            if($this->eightbit) {\n                $code->encodeString8bit($intext, $this->version, $this->level);\n            } else {\n                $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);\n            }\n            \n            return $code->data;\n        }\n\n        //----------------------------------------------------------------------\n        public function encode($intext, $outfile = false) \n        {\n            $code = new QRcode();\n\n            if($this->eightbit) {\n                $code->encodeString8bit($intext, $this->version, $this->level);\n            } else {\n                $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);\n            }\n            \n            QRtools::markTime('after_encode');\n            \n            if ($outfile!== false) {\n                file_put_contents($outfile, join(\"\\n\", QRtools::binarize($code->data)));\n            } else {\n                return QRtools::binarize($code->data);\n            }\n        }\n        \n        //----------------------------------------------------------------------\n        public function encodePNG($intext, $outfile = false,$saveandprint=false) \n        {\n            try {\n            \n                ob_start();\n                $tab = $this->encode($intext);\n                $err = ob_get_contents();\n                ob_end_clean();\n                \n                if ($err != '')\n                    QRtools::log($outfile, $err);\n                \n                $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));\n                \n                QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);\n            \n            } catch (Exception $e) {\n            \n                QRtools::log($outfile, $e->getMessage());\n            \n            }\n        }\n    }\n\n\n"
  },
  {
    "path": "frphp/extend/pinyin.php",
    "content": "<?php\n/**\n * PHP 汉字转拼音 [包含20902个基本汉字+5059生僻字]\n * @author 楼教主(cik520@qq.com)\n * @version v1.2\n * @note 请开启 mb_string 扩展\n */\n/* 测试用例\n$start_time = microtime(1);\n\nvar_dump(pinyin('对多音字无能为力'));\nvar_dump(pinyin('最全的PHP汉字转拼音库，比百度词典还全（dict.baidu.com）'));\nvar_dump(pinyin('试试：㐀㐁㐄㐅㐆㐌㐖㐜'));\nvar_dump(pinyin('一起开始数：12345'));\nvar_dump(pinyin('海南'));\nvar_dump(pinyin('乌鲁木齐'));\nvar_dump(pinyin('前总理朱镕基'));\nvar_dump(pinyin('仅首字母', 'first'));\nvar_dump(pinyin('占-位-符-为-空', 'all', ''));\nvar_dump(pinyin('不允许中文以外的字符', 'first', '', ''));\n\nfor ($i=0; $i<1e4; $i++) { // 性能次数，转换1万次\n    pinyin('对多音字无能为力');\n    pinyin('最全的PHP汉字转拼音库，比百度词典还全（dict.baidu.com）');\n    pinyin('试试：㐀㐁㐄㐅㐆㐌㐖㐜');\n    pinyin('一起开始数：12345');\n    pinyin('海南');\n    pinyin('乌鲁木齐');\n    pinyin('前总理朱镕基');\n    pinyin('仅首字母', 'first');\n    pinyin('占-位-符-为-空', 'all', '');\n    pinyin('不允许中文以外的字符', 'first', '', '');\n}\n\necho number_format(microtime(1) - $start_time, 6);\n*/\n\n/**\n * 中文转拼音 (utf8版,gbk转utf8也可用)\n * @param string $str         utf8字符串\n * @param string $ret_format  返回格式 [all:全拼音|first:首字母|one:仅第一字符首字母]\n * @param string $placeholder 无法识别的字符占位符\n * @param string $allow_chars 允许的非中文字符\n * @return string             拼音字符串\n */\nfunction pinyin($str, $ret_format = 'all', $placeholder = '_', $allow_chars = '/[a-zA-Z\\d ]/') {\n    static $pinyins = null;\n\n    if (null === $pinyins) {\n        $data = 'yi:一,乁,乂,义,乙,亄,亦,亿,仡,以,仪,伇,伊,伿,佁,佚,佾,侇,依,俋,倚,偯,儀,億,兿,冝,刈,劓,劮,勚,勩,匇,匜,医,吚,呓,呭,呹,咦,咿,唈,噫,囈,圛,圯,坄,垼,埶,埸,墿,壱,壹,夁,夷,奕,妷,姨,媐,嫕,嫛,嬄,嬑,嬟,宐,宜,宧,寱,寲,屹,峄,峓,崺,嶧,嶬,嶷,已,巸,帟,帠,幆,庡,廙,异,弈,弋,弌,弬,彛,彜,彝,彞,役,忆,忔,怈,怡,怿,恞,悒,悘,悥,意,憶,懌,懿,扅,扆,抑,挹,揖,撎,攺,敡,敼,斁,旑,旖,易,晹,暆,曀,曎,曵,杙,杝,枍,枻,柂,栘,栧,栺,桋,棭,椅,椬,椸,榏,槸,檍,檥,檹,欭,欹,歝,殔,殪,殹,毅,毉,沂,沶,泆,洢,浂,浥,浳,湙,溢,漪,潩,澺,瀷,炈,焲,熠,熤,熪,熼,燚,燡,燱,狋,猗,獈,玴,瑿,瓵,畩,異,疑,疫,痍,痬,瘗,瘞,瘱,癔,益,眙,瞖,矣,礒,祎,禕,秇,移,稦,穓,竩,笖,簃,籎,縊,繄,繶,繹,绎,缢,羛,羠,義,羿,翊,翌,翳,翼,耴,肄,肊,胰,膉,臆,舣,艗,艤,艺,芅,苅,苡,苢,荑,萓,萟,蓺,薏,藙,藝,蘙,虉,蚁,蛜,蛡,蛦,蜴,螔,螘,螠,蟻,衣,衤,衪,衵,袘,袣,裔,裛,褹,襼,觺,訲,訳,詍,詒,詣,誃,誼,謻,譩,譯,議,讉,讛,议,译,诒,诣,谊,豙,豛,豷,貖,貤,貽,贀,贻,跇,跠,軼,輢,轙,轶,辷,迆,迤,迻,逘,逸,遗,遺,邑,郼,酏,醫,醳,醷,釔,釴,鈘,鈠,鉯,銥,鎰,鏔,鐿,钇,铱,镒,镱,阣,陭,隿,霬,靾,頉,頤,頥,顊,顗,颐,飴,饐,饴,駅,驛,驿,骮,鮧,鮨,鯣,鳦,鶂,鶃,鶍,鷁,鷊,鷖,鷧,鷾,鸃,鹝,鹢,鹥,黓,黟,黳,齮,齸,㐹,㑊,㑜,㑥,㓷,㔴,㕥,㖂,㘁,㘈,㘊,㘦,㙠,㙯,㚤,㚦,㛕,㜋,㜒,㝖,㞔,㠯,㡫,㡼,㢞,㣂,㣻,㥴,㦉,㦤,㦾,㩘,㫊,㰘,㰝,㰻,㱅,㱲,㲼,㳑,㴁,㴒,㵝,㵩,㶠,㹓,㹭,㺿,㽈,䄁,䄬,䄿,䆿,䇩,䇵,䉨,䋚,䋵,䌻,䎈,䐅,䐖,䓃,䓈,䓹,䔬,䕍,䖁,䖊,䗑,䗟,䗷,䘝,䘸,䝘,䝝,䝯,䞅,䢃,䣧,䦴,䧧,䩟,䬁,䬥,䬮,䭂,䭇,䭞,䭿,䮊,䯆,䰙,䱌,䱒,䲑,䴊,䴬|ding:丁,仃,叮,啶,奵,定,嵿,帄,忊,椗,玎,甼,疔,盯,矴,碇,碠,磸,耵,聢,聣,腚,萣,薡,訂,订,酊,釘,錠,鐤,钉,锭,靪,頂,顁,顶,飣,饤,鼎,鼑,㝎,㫀,㴿,㼗|kao:丂,尻,拷,攷,栲,洘,烤,犒,考,銬,铐,靠,髛,鮳,鯌,鲓,䐧,䯪|qi:七,乞,亓,亝,企,倛,僛,其,凄,剘,启,呇,呮,咠,唘,唭,啓,啔,啟,嘁,噐,器,圻,埼,夡,奇,契,妻,娸,婍,屺,岂,岐,岓,崎,嵜,帺,弃,忯,恓,悽,愒,愭,慼,慽,憇,憩,懠,戚,捿,掑,摖,斉,斊,旂,旗,晵,暣,朞,期,杞,柒,栔,栖,桤,桼,棄,棊,棋,棨,棲,榿,槭,檱,櫀,欫,欺,歧,气,気,氣,汔,汽,沏,泣,淇,淒,渏,湆,湇,漆,濝,炁,猉,玂,玘,琦,琪,璂,甈,畦,疧,盀,盵,矵,砌,碁,碕,碛,碶,磎,磜,磧,磩,礘,祁,祇,祈,祺,禥,竒,簯,簱,籏,粸,紪,綥,綦,綨,綮,綺,緀,緕,纃,绮,缼,罊,耆,肵,脐,臍,艩,芑,芞,芪,荠,萁,萋,葺,蕲,薺,藄,蘄,蚑,蚔,蚚,蛴,蜝,蜞,螧,蟿,蠐,裿,褀,褄,訖,諆,諬,諿,讫,豈,起,跂,踑,踦,蹊,軝,迄,迉,邔,郪,釮,錡,鏚,锜,闙,霋,頎,颀,騎,騏,騹,骐,骑,鬐,鬾,鬿,魌,魕,鯕,鰭,鲯,鳍,鵸,鶀,鶈,麒,麡,齊,齐,㒅,㓞,㜎,㞓,㞚,㟓,㟚,㟢,㣬,㥓,㩩,㩽,㫓,㮑,㯦,㼤,㾨,䀈,䀙,䁈,䁉,䄎,䄢,䄫,䅤,䅲,䉝,䉻,䋯,䌌,䎢,䏅,䏌,䏠,䏿,䐡,䑴,䒗,䒻,䓅,䔇,䙄,䚉,䚍,䛴,䞚,䟄,䟚,䡋,䡔,䢀,䧘,䧵,䩓,䫔,䬣,䭫,䭬,䭶,䭼,䰇,䰴,䱈,䲬,䳢,䶒,䶞|shang:丄,上,仩,伤,傷,商,垧,墒,尙,尚,恦,愓,慯,扄,晌,殇,殤,滳,漡,熵,緔,绱,蔏,螪,裳,觞,觴,謪,賞,赏,鑜,鬺,䬕|xia:丅,下,侠,俠,傄,匣,厦,吓,呷,嚇,圷,夏,夓,峡,峽,廈,懗,搳,敮,暇,柙,梺,溊,炠,烚,煆,狎,狭,狹,珨,瑕,疜,疨,睱,瞎,硖,硤,碬,磍,祫,笚,筪,縀,縖,罅,翈,舝,舺,蕸,虾,蝦,諕,谺,赮,轄,辖,遐,鍜,鎋,鏬,閕,閜,陜,陿,霞,颬,騢,魻,鰕,鶷,黠,㗇,㗿,㘡,㙤,㰺,㽠,䖎,䖖,䘥,䛅,䦖,䪗,䫗|mu:丆,亩,仫,凩,募,坶,墓,墲,姆,娒,峔,幕,幙,慔,慕,拇,旀,暮,木,椧,楘,樢,母,毣,毪,氁,沐,炑,牡,牧,牳,狇,獏,畆,畒,畝,畞,畮,目,睦,砪,穆,胟,艒,苜,莯,萺,蚞,踇,鉧,鉬,钼,雮,霂,鞪,㒇,㜈,㣎,㧅,㾇,䀲,䊾,䑵,䥈,䧔,䱯|wan:万,丸,乛,倇,刓,剜,卍,卐,唍,埦,塆,壪,妧,婉,婠,完,宛,岏,帵,弯,彎,忨,惋,抏,挽,捖,捥,晚,晩,晼,杤,梚,椀,汍,涴,湾,潫,灣,烷,玩,琓,琬,畹,皖,盌,睕,碗,笂,紈,綩,綰,纨,绾,翫,脘,腕,芄,莞,菀,萬,薍,蜿,豌,貦,贃,贎,踠,輓,邜,鋄,鋔,錽,鍐,鎫,頑,顽,㜶,㝴,㸘,㽜,㿸,䂺,䅋,䖤,䗕,䘼,䛷,䝹,䥑,䩊,䯈,䳃|zhang:丈,仉,仗,傽,墇,嫜,嶂,帐,帳,幛,幥,张,弡,張,彰,慞,扙,掌,暲,杖,樟,涨,涱,漲,漳,獐,璋,痮,瘬,瘴,瞕,礃,章,粀,粻,胀,脹,蔁,蟑,賬,账,遧,鄣,鏱,鐣,障,鞝,餦,騿,鱆,麞,㕩,㙣,㽴,䍤|san:三,伞,俕,傘,厁,叁,壭,弎,散,橵,毵,毶,毿,犙,糁,糂,糝,糣,糤,繖,鏒,閐,饊,馓,鬖,㤾,㧲,㪔,㪚,䀐,䉈,䊉,䫅,䫩|:|ji:丌,丮,乩,亟,亼,伋,伎,佶,偈,偮,僟,兾,冀,几,击,刉,刏,剂,剞,剤,劑,勣,卙,即,卽,及,叝,叽,吉,咭,哜,唧,喞,嗘,嘰,嚌,圾,坖,垍,基,塉,墍,墼,妀,妓,姞,姬,嫉,季,寂,寄,屐,岌,峜,嵆,嵇,嵴,嶯,己,幾,庴,廭,彐,彑,彶,徛,忌,忣,急,悸,惎,愱,憿,懻,戟,戢,技,挤,掎,揤,撃,撠,擊,擠,攲,敧,旡,既,旣,暨,暩,曁,机,极,枅,梞,棘,楖,楫,極,槉,槣,樭,機,橶,檕,檝,檵,櫅,殛,毄,汲,泲,洎,济,済,湒,漃,漈,潗,激,濈,濟,瀱,焏,犄,犱,狤,玑,璣,璾,畸,畿,疾,痵,瘠,癠,癪,皍,矶,磯,祭,禝,禨,积,稘,稩,稷,稽,穄,穊,積,穖,穧,笄,笈,筓,箕,箿,簊,籍,糭,紀,紒,級,継,緝,縘,績,繋,繫,繼,级,纪,继,绩,缉,罽,羁,羇,羈,耤,耭,肌,脊,脨,膌,臮,艥,芨,芰,芶,茍,萕,葪,蒺,蓟,蔇,蕀,蕺,薊,蘎,蘮,蘻,虀,虮,蝍,螏,蟣,裚,襀,襋,覉,覊,覬,觊,觙,觭,計,記,誋,諅,譏,譤,计,讥,记,谻,賫,賷,赍,趌,跡,跻,跽,踖,蹐,蹟,躋,躤,躸,輯,轚,辑,迹,郆,鄿,銈,銡,錤,鍓,鏶,鐖,鑇,鑙,际,際,隮,集,雞,雦,雧,霁,霵,霽,鞊,鞿,韲,飢,饑,饥,驥,骥,髻,魢,鮆,鯚,鯽,鰶,鰿,鱀,鱭,鱾,鲚,鲫,鳮,鵋,鶏,鶺,鷄,鷑,鸄,鸡,鹡,麂,齌,齎,齏,齑,㑧,㒫,㔕,㖢,㗊,㗱,㘍,㙨,㙫,㚡,㞃,㞆,㞛,㞦,㠍,㠎,㠖,㠱,㡇,㡭,㡮,㡶,㤂,㥍,㥛,㦸,㧀,㨈,㪠,㭰,㭲,㮟,㮨,㰟,㱞,㲅,㲺,㳵,㴉,㴕,㸄,㹄,㻑,㻷,㽺,㾊,㾒,㾵,䁒,䋟,䐀,䐕,䐚,䒁,䓫,䓽,䗁,䚐,䜞,䝸,䞘,䟌,䠏,䢋,䢳,䣢,䤒,䤠,䦇,䨖,䩯,䮺,䯂,䰏,䲯,䳭,䶓,䶩|bu:不,佈,勏,卟,吥,咘,哺,埗,埠,峬,布,庯,廍,怖,悑,捗,晡,步,歨,歩,獛,瓿,篰,簿,荹,蔀,补,補,誧,踄,轐,逋,部,郶,醭,鈈,鈽,钚,钸,餔,餢,鳪,鵏,鸔,㘵,㙛,㚴,㨐,㳍,㻉,㾟,䀯,䊇,䋠,䍌,䏽,䑰,䒈,䝵,䪁,䪔,䬏,䳝,䴝,䴺|yu:与,予,于,亐,伃,伛,余,俁,俞,俣,俼,偊,傴,儥,兪,匬,吁,唹,喅,喐,喩,喻,噊,噳,圄,圉,圫,域,堉,堣,堬,妤,妪,娛,娯,娱,媀,嫗,嬩,宇,寓,寙,屿,峪,峿,崳,嵎,嵛,嶎,嶼,庽,庾,彧,御,忬,悆,惐,愈,愉,愚,慾,懙,戫,扜,扵,挧,揄,敔,斔,斞,於,旟,昱,杅,栯,棛,棜,棫,楀,楡,楰,榆,櫲,欎,欝,欤,欲,歈,歟,歶,毓,浴,淢,淤,淯,渔,渝,湡,滪,漁,澞,澦,灪,焴,煜,燏,燠,爩,牏,狱,狳,獄,玉,玗,玙,琙,瑀,瑜,璵,畬,畭,瘀,瘉,瘐,癒,盂,盓,睮,矞,砡,硢,礇,礖,礜,祤,禦,禹,禺,秗,稢,稶,穥,穻,窬,窳,竽,箊,篽,籅,籞,籲,紆,緎,繘,纡,罭,羭,羽,聿,育,腴,臾,舁,舆,與,艅,芋,芌,茟,茰,荢,萭,萮,萸,蒮,蓣,蓹,蕍,蕷,薁,蘌,蘛,虞,虶,蜟,蜮,蝓,螸,衧,袬,裕,褕,覦,觎,誉,語,諛,諭,謣,譽,语,谀,谕,豫,貐,踰,軉,輍,輿,轝,迃,逳,逾,遇,遹,邘,郁,鄅,酑,醧,釪,鈺,銉,鋊,鋙,錥,鍝,鐭,钰,铻,閾,阈,陓,隃,隅,隩,雓,雨,雩,霱,預,预,飫,餘,饇,饫,馀,馭,騟,驈,驭,骬,髃,鬰,鬱,鬻,魊,魚,魣,鮽,鯲,鰅,鱊,鱼,鳿,鴥,鴧,鴪,鵒,鷠,鷸,鸆,鸒,鹆,鹬,麌,齬,龉,㑨,㒁,㒜,㔱,㙑,㚥,㝢,㠘,㠨,㡰,㣃,㤤,㥔,㥚,㥥,㦛,㪀,㬂,㬰,㲾,㳚,㳛,㶛,㷒,㺄,㺞,㺮,㼌,㼶,㽣,䁌,䁩,䂊,䂛,䃋,䄏,䄨,䆷,䈅,䉛,䋖,䍂,䍞,䏸,䐳,䔡,䖇,䗨,䘘,䘱,䛕,䜽,䢓,䢩,䣁,䥏,䨒,䨞,䩒,䬄,䮇,䮙,䰻,䱷,䲣,䴁,䵫|mian:丏,俛,偭,免,冕,勉,勔,喕,娩,婂,媔,嬵,宀,愐,棉,檰,櫋,汅,沔,湎,眄,眠,矈,矊,矏,糆,綿,緜,緬,绵,缅,腼,臱,芇,葂,蝒,面,靣,鮸,麪,麫,麵,麺,黾,㒙,㛯,㝰,㤁,㬆,㮌,㰃,㴐,㻰,䀎,䃇,䏃,䤄,䫵,䰓|gai:丐,乢,侅,匃,匄,垓,姟,峐,忋,戤,摡,改,晐,杚,概,槩,槪,溉,漑,瓂,畡,盖,祴,絠,絯,荄,葢,蓋,該,该,豥,賅,賌,赅,郂,鈣,鎅,钙,陔,隑,㕢,㧉,㮣,䏗,䪱|chou:丑,丒,仇,侴,俦,偢,儔,吜,嬦,帱,幬,惆,愁,懤,抽,搊,杽,栦,椆,殠,燽,犨,犫,畴,疇,瘳,皗,瞅,矁,稠,筹,篘,籌,紬,絒,綢,绸,臭,臰,菗,薵,裯,詶,讎,讐,踌,躊,遚,酧,酬,醜,醻,雔,雠,魗,㐜,㛶,㤽,㦞,㨶,㵞,㿧,䇺,䊭,䌧,䌷,䓓,䔏,䛬,䥒,䪮,䲖|zhuan:专,僎,叀,啭,囀,堟,嫥,孨,専,專,撰,灷,瑑,瑼,甎,砖,磚,竱,篆,籑,縳,膞,蒃,蟤,襈,諯,譔,賺,赚,転,轉,转,鄟,顓,颛,饌,馔,鱄,䉵,䡱|qie:且,倿,切,匧,厒,妾,怯,悏,惬,愜,挈,朅,洯,淁,癿,穕,窃,竊,笡,箧,篋,籡,緁,聺,苆,茄,藒,蛪,踥,鍥,鐑,锲,魥,鯜,㓶,㗫,㚗,㛍,㛙,㤲,㥦,㫸,㰰,㰼,㹤,㾀,㾜,䟙,䤿,䦧,䬊|pi:丕,仳,伓,伾,僻,劈,匹,啤,噼,噽,嚊,嚭,圮,坯,埤,壀,媲,嫓,屁,岯,崥,庀,怶,悂,憵,批,披,抷,揊,擗,旇,朇,枇,椑,榌,毗,毘,毞,淠,渒,潎,澼,炋,焷,狉,狓,琵,甓,疈,疲,痞,癖,皮,睤,睥,砒,磇,礔,礕,秛,秠,笓,篺,簲,紕,纰,罴,羆,翍,耚,肶,脴,脾,腗,膍,芘,苉,蚍,蚽,蜱,螷,蠯,諀,譬,豼,豾,貔,邳,郫,釽,鈚,鈹,鉟,銔,銢,錃,錍,铍,闢,阰,陴,隦,霹,駓,髬,魮,魾,鮍,鲏,鴄,鵧,鷿,鸊,鼙,㔥,㨽,㯅,㿙,䏘,䑀,䑄,䚰,䚹,䠘,䡟,䤏,䤨,䫌,䰦,䴙|shi:世,丗,乨,亊,事,什,仕,佦,使,侍,兘,兙,冟,势,勢,十,卋,叓,史,呞,呩,嗜,噬,埘,塒,士,失,奭,始,姼,嬕,实,実,室,宩,寔,實,尸,屍,屎,峕,崼,嵵,市,师,師,式,弑,弒,徥,忕,恀,恃,戺,拭,拾,揓,施,时,旹,是,昰,時,枾,柹,柿,栻,榁,榯,檡,氏,浉,湜,湤,湿,溡,溮,溼,澨,濕,炻,烒,煶,狮,獅,瑡,瓧,眂,眎,眡,睗,矢,石,示,礻,祏,竍,笶,笹,筮,箷,篒,簭,籂,籭,絁,舐,舓,莳,葹,蒒,蒔,蓍,虱,虲,蚀,蝕,蝨,螫,褆,褷,襫,襹,視,视,觢,試,詩,誓,諟,諡,謚,識,识,试,诗,谥,豕,貰,贳,軾,轼,辻,适,逝,遈,適,遾,邿,酾,釃,釈,释,釋,釶,鈰,鉂,鉃,鉇,鉐,鉽,銴,鍦,铈,食,飠,飾,餝,饣,饰,駛,驶,鮖,鯴,鰘,鰣,鰤,鲥,鲺,鳲,鳾,鶳,鸤,鼫,鼭,齛,㒾,㔺,㕜,㖷,㫑,㮶,㱁,㵓,㸷,㹝,㹬,㹷,䁺,䂖,䊓,䏡,䒨,䖨,䛈,䟗,䤱,䦠,䦹,䩃,䭄,䰄,䴓,䶡|qiu:丘,丠,俅,叴,唒,囚,坵,媝,寈,崷,巯,巰,恘,扏,搝,朹,梂,楸,殏,毬,求,汓,泅,浗,渞,湭,煪,犰,玌,球,璆,皳,盚,秋,秌,穐,篍,糗,紌,絿,緧,肍,莍,萩,蓲,蘒,虬,虯,蚯,蛷,蝤,蝵,蟗,蠤,裘,觓,觩,訄,訅,賕,赇,趥,逎,逑,遒,邱,酋,醔,釚,釻,銶,鞦,鞧,鮂,鯄,鰌,鰍,鰽,鱃,鳅,鵭,鶖,鹙,鼽,龝,㐀,㐤,㕤,㞗,㟈,㤹,㥢,㧨,㭝,㷕,㺫,㼒,䆋,䊵,䎿,䜪,䞭,䟬,䟵,䠗,䣇,䤛|bing:丙,並,仌,併,倂,偋,傡,兵,冫,冰,垪,寎,并,幷,庰,怲,抦,掤,摒,昞,昺,柄,栟,栤,梹,棅,檳,氷,炳,燷,病,眪,禀,秉,窉,竝,苪,蛃,誁,邴,鈵,鉼,鋲,陃,靐,鞆,餅,餠,饼,鮩,㓈,㨀,䈂,䋑,䓑,䗒,䴵|ye:业,也,亪,亱,倻,偞,僷,冶,叶,吔,嘢,噎,嚈,埜,堨,墷,壄,夜,嶪,嶫,抴,捓,捙,掖,揶,擖,擛,擨,擪,擫,晔,暍,曄,曅,曗,曳,枼,枽,椰,楪,業,歋,殗,洂,液,漜,潱,澲,烨,燁,爗,爷,爺,皣,瞱,瞸,礏,耶,腋,葉,蠮,謁,谒,邺,鄓,鄴,野,釾,鋣,鍱,鎁,鎑,铘,靥,靨,頁,页,餣,饁,馌,驜,鵺,鸈,㐖,㖡,㖶,㗼,㙒,㙪,㝣,㥷,㩎,㪑,㱉,㸣,䈎,䓉,䤳,䤶,䥟,䥡,䥺,䧨,䭟,䲜|cong:丛,从,匆,叢,囪,囱,婃,孮,従,徖,從,忩,怱,悤,悰,慒,憁,暰,枞,棇,楤,樅,樬,樷,欉,淙,漎,漗,潀,潈,潨,灇,焧,熜,爜,琮,瑽,璁,瞛,篵,緫,繱,聡,聦,聪,聰,苁,茐,葱,蓯,蔥,藂,蟌,誴,謥,賨,賩,鏦,騘,驄,骢,㼻,䉘,䕺,䧚,䳷|dong:东,侗,倲,働,冬,冻,凍,动,動,咚,垌,埬,墥,姛,娻,嬞,岽,峒,峝,崠,崬,恫,懂,戙,挏,昸,東,栋,棟,氡,氭,洞,涷,湩,硐,笗,箽,胨,胴,腖,苳,菄,董,蕫,蝀,詷,諌,迵,霘,駧,鮗,鯟,鶇,鶫,鸫,鼕,㑈,㓊,㖦,㗢,㜱,㢥,㨂,㼯,䂢,䅍,䍶,䞒,䵔|si:丝,乺,亖,伺,似,佀,価,俟,俬,儩,兕,凘,厮,厶,司,咝,嗣,嘶,噝,四,姒,娰,媤,孠,寺,巳,廝,思,恖,撕,斯,枱,柶,梩,楒,榹,死,汜,泀,泗,泤,洍,涘,澌,瀃,燍,牭,磃,祀,禗,禠,禩,私,竢,笥,糹,絲,緦,纟,缌,罒,罳,耜,肂,肆,蕬,蕼,虒,蛳,蜤,螄,螦,蟖,蟴,覗,貄,釲,鈻,鉰,銯,鋖,鍶,鐁,锶,颸,飔,飤,飼,饲,駟,騃,騦,驷,鷥,鸶,鼶,㐌,㕽,㚶,㣈,㭒,㸻,㹑,㾅,䇃,䎣,䏤,䦙|cheng:丞,乗,乘,侱,偁,呈,城,埕,堘,塍,塖,娍,宬,峸,庱,徎,悜,惩,憆,憕,懲,成,承,挰,掁,摚,撐,撑,朾,枨,柽,棖,棦,椉,橕,橙,檉,檙,泟,洆,浾,溗,澂,澄,瀓,爯,牚,珵,珹,琤,畻,睈,瞠,碀,秤,称,程,穪,窚,竀,筬,絾,緽,脀,脭,荿,虰,蛏,蟶,裎,誠,诚,赪,赬,逞,郕,酲,鋮,鏳,鏿,鐺,铖,铛,阷,靗,頳,饓,騁,騬,骋,鯎,㐼,㞼,㨃,㲂,㼩,䀕,䁎,䄇,䆑,䆵,䆸,䇸,䔲,䗊,䞓,䧕,䫆,䮪|diu:丟,丢,銩,铥,颩|liang:両,两,亮,俍,兩,凉,哴,唡,啢,喨,墚,掚,晾,梁,椋,樑,涼,湸,煷,簗,粮,粱,糧,綡,緉,脼,良,蜽,裲,諒,谅,踉,輌,輛,輬,辆,辌,量,鍄,魉,魎,㒳,㔝,㹁,䓣,䝶,䠃,䣼,䩫,䭪|you:丣,亴,优,佑,侑,偤,優,卣,又,友,右,呦,哊,唀,嚘,囿,姷,孧,宥,尢,尤,峟,峳,幼,幽,庮,忧,怞,怣,怮,悠,憂,懮,攸,斿,有,柚,梄,梎,楢,槱,櫌,櫾,沋,油,泑,浟,游,湵,滺,瀀,牖,牗,牰,犹,狖,猶,猷,由,疣,祐,禉,秞,糿,纋,羐,羑,耰,聈,肬,脜,苃,莜,莠,莤,莸,蒏,蕕,蚰,蚴,蜏,蝣,訧,誘,诱,貁,輏,輶,迂,迶,逌,逰,遊,邎,邮,郵,鄾,酉,酭,釉,鈾,銪,铀,铕,駀,魷,鮋,鱿,鲉,麀,黝,鼬,㒡,㓜,㕗,㕱,㘥,㚭,㛜,㤑,㫍,㮋,㰶,㳺,㹨,㺠,㻀,㽕,㾞,䀁,䅎,䆜,䑻,䒴,䖻,䚃,䛻,䞥,䢊,䢟,䬀,䱂,䳑|yan:严,乵,俨,偃,偐,偣,傿,儼,兖,兗,円,剦,匽,厌,厣,厭,厳,厴,咽,唁,喭,噞,嚥,嚴,堰,塩,墕,壛,壧,夵,奄,妍,妟,姲,姸,娫,娮,嫣,嬊,嬮,嬿,孍,宴,岩,崦,嵃,嵒,嵓,嶖,巌,巖,巗,巘,巚,延,弇,彥,彦,恹,愝,懕,戭,扊,抁,掞,掩,揅,揜,敥,昖,晏,暥,曕,曮,棪,椻,椼,楌,樮,檐,檿,櫩,欕,沇,沿,淹,渰,渷,湮,滟,演,漹,灎,灔,灧,灩,炎,烟,焉,焔,焰,焱,煙,熖,燄,燕,爓,牪,狿,猒,珚,琂,琰,甗,盐,眼,研,砚,硏,硯,硽,碞,礹,筵,篶,簷,綖,縯,罨,胭,腌,臙,艳,艶,艷,芫,莚,菸,萒,葕,蔅,虤,蜒,蝘,衍,裺,褗,覎,觃,觾,言,訁,訮,詽,諺,讌,讞,讠,谚,谳,豓,豔,贋,贗,贘,赝,躽,軅,遃,郔,郾,鄢,酀,酓,酽,醃,醶,醼,釅,閆,閹,閻,闫,阉,阎,隁,隒,雁,顏,顔,顩,颜,餍,饜,騐,験,騴,驗,驠,验,鬳,魇,魘,鰋,鳫,鴈,鴳,鶠,鷃,鷰,鹽,麙,麣,黡,黤,黫,黬,黭,黶,鼴,鼹,齞,齴,龑,㓧,㕣,㗴,㘖,㘙,㚧,㛪,㢂,㢛,㦔,㫃,㫟,㬫,㭺,㳂,㶄,㷔,㷳,㷼,㿕,㿼,䀋,䀽,䁙,䂩,䂴,䄋,䅧,䊙,䊻,䌪,䎦,䑍,䓂,䕾,䖗,䗡,䗺,䜩,䢥,䢭,䣍,䤷,䨄,䭘,䱲,䲓,䳛,䳺,䴏,䶮|sang:丧,喪,嗓,搡,桑,桒,槡,磉,褬,鎟,顙,颡,䡦,䫙|gun:丨,惃,棍,棞,滚,滾,璭,睔,睴,磙,緄,緷,绲,蓘,蔉,衮,袞,裷,謴,輥,辊,鮌,鯀,鲧,㙥,㫎,㯻,䃂,䎾,䜇,䵪|jiu:丩,久,乆,九,乣,倃,僦,勼,匓,匛,匶,厩,咎,啾,奺,就,廄,廏,廐,慦,揂,揪,揫,摎,救,旧,朻,杦,柩,柾,桕,樛,欍,殧,汣,灸,牞,玖,畂,疚,究,糺,糾,紤,纠,臼,舅,舊,舏,萛,赳,酒,镹,阄,韭,韮,鬏,鬮,鯦,鳩,鷲,鸠,鹫,麔,齨,㠇,㡱,㧕,㩆,㲃,㶭,㺩,㺵,䅢,䆒,䊆,䊘,䓘,䛮,䡂,䳎,䳔|ge:个,佮,個,割,匌,各,呄,哥,哿,嗝,圪,塥,彁,愅,戈,戓,戨,挌,搁,搿,擱,敋,格,槅,櫊,歌,滆,滒,牫,牱,犵,獦,疙,硌,箇,紇,纥,肐,胳,膈,臵,舸,茖,葛,虼,蛒,蛤,袼,裓,觡,諽,謌,輵,轕,鉻,鎘,鎶,铬,镉,閣,閤,阁,隔,革,鞈,鞷,韐,韚,騔,骼,鬲,鮯,鰪,鴐,鴚,鴿,鸽,㗆,㝓,㠷,㦴,㨰,㪾,㵧,㷴,䆟,䈓,䐙,䕻,䗘,䘁,䛋,䛿,䢔,䧄,䨣,䩐,䪂,䪺,䫦|ya:丫,亚,亜,亞,伢,俹,劜,厊,压,厓,呀,哑,唖,啞,圔,圠,垭,埡,堐,壓,娅,婭,孲,岈,崕,崖,庌,庘,押,挜,掗,揠,枒,桠,椏,氩,氬,涯,漄,牙,犽,猚,猰,玡,琊,瑘,疋,痖,瘂,睚,砑,稏,穵,窫,笌,聐,芽,蕥,蚜,衙,襾,訝,讶,迓,錏,鐚,铔,雅,鴉,鴨,鵶,鸦,鸭,齖,齾,㝞,㧎,㰳,㿿,䄰,䅉,䊦,䝟,䢝,䦪,䪵,䯉,䰲,䵝|zhuang:丬,壮,壯,壵,妆,妝,娤,庄,庒,戅,撞,桩,梉,樁,湷,焋,状,狀,粧,糚,荘,莊,装,裝|zhong:中,仲,伀,众,偅,冢,刣,喠,堹,塚,妐,妕,媑,尰,幒,彸,忠,柊,歱,汷,泈,炂,煄,狆,瘇,盅,眾,祌,祍,种,種,筗,籦,終,终,肿,腫,舯,茽,蔠,蚛,螤,螽,衆,衳,衶,衷,諥,踵,蹱,迚,重,鈡,鍾,鐘,钟,锺,鴤,鼨,㐺,㣫,㲴,䱰|jie:丯,介,借,倢,偼,傑,刦,刧,刼,劫,劼,卩,卪,吤,喈,嗟,堦,堺,姐,婕,媎,媘,媫,嫅,孑,尐,屆,届,岊,岕,崨,嵥,嶻,巀,幯,庎,徣,忦,悈,戒,截,拮,捷,接,掲,揭,擑,擮,擳,斺,昅,杰,桀,桔,桝,椄,楐,楬,楶,榤,檞,櫭,毑,洁,湝,滐,潔,煯,犗,玠,琾,界,畍,疌,疖,疥,痎,癤,皆,睫,砎,碣,礍,秸,稭,竭,節,結,繲,结,羯,脻,节,芥,莭,菨,蓵,藉,蚧,蛣,蛶,蜐,蝔,蠘,蠞,蠽,街,衱,衸,袺,褯,解,觧,訐,詰,誡,誱,讦,诘,诫,踕,迼,鉣,鍻,阶,階,鞂,頡,颉,飷,骱,魝,魪,鮚,鲒,鶛,㑘,㓗,㓤,㔾,㘶,㛃,㝌,㝏,㞯,㠹,㦢,㨗,㨩,㮞,㮮,㸅,㾏,㿍,䀷,䀹,䁓,䂒,䂝,䂶,䅥,䇒,䌖,䔿,䕙,䗻,䛺,䣠,䥛,䯰,䰺,䱄,䲙,䲸|feng:丰,仹,俸,偑,僼,冯,凤,凨,凬,凮,唪,堸,夆,奉,妦,寷,封,峯,峰,崶,捀,摓,枫,桻,楓,檒,沣,沨,浲,渢,湗,溄,灃,烽,焨,煈,犎,猦,琒,瓰,甮,疯,瘋,盽,砜,碸,篈,綘,縫,缝,艂,葑,蘕,蘴,蜂,覂,諷,讽,豐,賵,赗,逢,鄷,酆,鋒,鎽,鏠,锋,靊,風,飌,风,馮,鳯,鳳,鴌,麷,㡝,㦀,㵯,䏎,䙜,䟪,䩼|guan:丱,倌,关,冠,卝,官,悹,悺,惯,慣,掼,摜,棺,樌,毌,泴,涫,潅,灌,爟,琯,瓘,痯,瘝,癏,盥,矔,礶,祼,窤,筦,管,罆,罐,舘,萖,蒄,覌,観,觀,观,貫,贯,躀,輨,遦,錧,鏆,鑵,関,闗,關,雚,館,馆,鰥,鱞,鱹,鳏,鳤,鸛,鹳,㮡,㴦,䌯,䎚,䏓,䗆,䗰,䘾,䙛,䙮,䝺,䦎,䩪,䪀,䲘|chuan:串,传,傳,僢,剶,喘,圌,巛,川,暷,椽,歂,氚,汌,猭,玔,瑏,穿,篅,舛,舡,舩,船,荈,賗,輲,遄,釧,钏,镩,鶨,㯌,㱛,㼷,䁣|chan:丳,产,僝,儃,儳,冁,刬,剗,剷,劖,嚵,囅,壥,婵,嬋,孱,嵼,巉,幝,幨,廛,忏,懴,懺,掺,搀,摌,摲,摻,攙,旵,梴,棎,欃,毚,浐,湹,滻,潹,潺,瀍,瀺,灛,煘,燀,獑,產,産,硟,磛,禅,禪,簅,緾,繟,繵,纏,纒,缠,羼,艬,蒇,蕆,蝉,蝊,蟬,蟾,裧,襜,覘,觇,誗,諂,譂,讇,讒,谄,谗,躔,辿,鄽,酁,醦,鋋,鋓,鏟,鑱,铲,镡,镵,閳,闡,阐,韂,顫,颤,饞,馋,㔆,㙴,㙻,㢆,㢟,㦃,㬄,㯆,㵌,㶣,㸥,㹌,㹽,㺥,䀡,䂁,䊲,䐮,䑎,䜛,䠨,䡪,䡲,䣑,䤘,䤫,䥀,䧯,䩶,䪜,䮭,䱿,䴼,䵐|lin:临,亃,僯,凛,凜,厸,吝,啉,壣,崊,嶙,廩,廪,恡,悋,惏,懍,懔,拎,撛,斴,晽,暽,林,橉,檁,檩,淋,潾,澟,瀶,焛,燐,獜,琳,璘,甐,疄,痳,癛,癝,瞵,碄,磷,稟,箖,粦,粼,繗,翷,膦,臨,菻,蔺,藺,賃,赁,蹸,躏,躙,躪,轔,轥,辚,遴,邻,鄰,鏻,閵,隣,霖,顲,驎,鱗,鳞,麐,麟,㐭,㔂,㖁,㝝,㨆,㷠,䉮,䕲,䗲,䚬,䢯,䫐,䫰,䮼|zhuo:丵,倬,劅,卓,叕,啄,啅,圴,妰,娺,彴,拙,捉,撯,擆,擢,斀,斫,斮,斱,斲,斵,晫,桌,梲,棁,棳,椓,槕,櫡,浊,浞,涿,濁,濯,灂,灼,炪,烵,犳,琢,琸,着,硺,禚,穛,穱,窡,窧,篧,籗,籱,罬,茁,蠗,蠿,諁,諑,謶,诼,酌,鋜,鐯,鐲,镯,鵫,鷟,㑁,㣿,㪬,㭬,㺟,䅵,䕴,䶂|zhu:丶,主,伫,佇,住,侏,劚,助,劯,嘱,囑,坾,墸,壴,孎,宔,屬,嵀,拄,斸,曯,朱,杼,柱,柷,株,槠,樦,橥,櫧,櫫,欘,殶,泏,注,洙,渚,潴,濐,瀦,灟,炢,炷,烛,煑,煮,燭,爥,猪,珠,疰,瘃,眝,瞩,矚,砫,硃,祝,祩,秼,窋,竚,竹,竺,笁,笜,筑,筯,箸,築,篫,紵,紸,絑,纻,罜,羜,翥,舳,芧,苎,苧,茱,茿,莇,著,蓫,藸,蛀,蛛,蝫,蠋,蠩,蠾,袾,註,詝,誅,諸,诛,诸,豬,貯,贮,跓,跦,躅,軴,迬,逐,邾,鉒,銖,鋳,鑄,钃,铢,铸,陼,霔,飳,馵,駐,駯,驻,鮢,鯺,鱁,鴸,麆,麈,鼄,㑏,㔉,㝉,㤖,㧣,㫂,㵭,㹥,㺛,㾻,㿾,䇡,䇧,䌵,䍆,䎷,䐢,䕽,䘚,䘢,䝒,䝬,䟉,䥮,䬡,䭖,䮱,䰞|ha:丷,哈,妎,鉿,铪|dan:丹,亶,伔,但,僤,儋,刐,勯,匰,单,単,啖,啗,啿,單,嘾,噉,嚪,妉,媅,帎,弹,彈,惮,憚,憺,担,掸,撣,擔,旦,柦,殚,殫,氮,沊,泹,淡,澸,澹,狚,玬,瓭,甔,疍,疸,瘅,癉,癚,眈,砃,禫,窞,箪,簞,紞,耼,耽,聃,聸,胆,腅,膽,萏,蛋,蜑,衴,褝,襌,觛,訑,誕,诞,贉,躭,郸,鄲,酖,霮,頕,餤,饏,馾,駳,髧,鴠,黕,㔊,㕪,㗖,㡺,㫜,㱽,㲷,㵅,㺗,㽎,䃫,䄷,䉞,䉷,䨢,䨵,䩥,䭛,䮰,䱋,䳉|wei:为,亹,伟,伪,位,偉,偎,偽,僞,儰,卫,危,厃,叞,味,唯,喂,喡,喴,囗,围,圍,圩,墛,壝,委,威,娓,媁,媙,媦,寪,尉,尾,峗,峞,崣,嵔,嵬,嶶,巍,帏,帷,幃,廆,徫,微,惟,愄,愇,慰,懀,捤,揋,揻,斖,昷,暐,未,桅,梶,椲,椳,楲,沩,洈,洧,浘,涠,渨,渭,湋,溈,溦,潍,潙,潿,濊,濰,濻,瀢,炜,為,烓,煀,煒,煟,煨,熭,燰,爲,犚,犩,猥,猬,玮,琟,瑋,璏,畏,痏,痿,癐,癓,硊,硙,碨,磑,維,緭,緯,縅,纬,维,罻,胃,腲,艉,芛,苇,苿,荱,菋,萎,葦,葨,葳,蒍,蓶,蔚,蔿,薇,薳,藯,蘶,蜲,蜼,蝛,蝟,螱,衛,衞,褽,覣,覹,詴,諉,謂,讆,讏,诿,谓,踓,躗,躛,軎,轊,违,逶,違,鄬,醀,錗,鍏,鍡,鏏,闈,闱,隇,隈,隗,霨,霺,霻,韋,韑,韙,韡,韦,韪,頠,颹,餧,餵,饖,骩,骪,骫,魏,鮇,鮠,鮪,鰃,鰄,鲔,鳂,鳚,㕒,㖐,㞇,㞑,㟪,㠕,㢻,㣲,㥜,㦣,㧑,㨊,㬙,㭏,㱬,㷉,䃬,䈧,䉠,䑊,䔺,䗽,䘙,䙿,䜅,䜜,䝐,䞔,䡺,䥩,䧦,䪋,䪘,䬐,䬑,䬿,䭳,䮹,䲁,䵋,䵳|jing:丼,井,京,亰,俓,倞,傹,儆,兢,净,凈,刭,剄,坓,坕,坙,境,妌,婙,婛,婧,宑,巠,幜,弪,弳,径,徑,惊,憬,憼,敬,旌,旍,景,晶,暻,曔,桱,梷,橸,汫,汬,泾,浄,涇,淨,瀞,燝,燞,猄,獍,璄,璟,璥,痉,痙,睛,秔,稉,穽,竞,竟,竧,竫,競,竸,粳,精,経,經,经,聙,肼,胫,脛,腈,茎,荆,荊,莖,菁,蟼,誩,警,踁,迳,逕,鏡,镜,阱,靓,靖,静,靚,靜,頚,頸,颈,驚,鯨,鲸,鵛,鶁,鶄,麖,麠,鼱,㕋,㘫,㢣,㣏,㬌,㵾,㹵,䔔,䜘,䡖,䴖,䵞|li:丽,例,俐,俚,俪,傈,儮,儷,凓,刕,利,剓,剺,劙,力,励,勵,历,厉,厘,厤,厯,厲,吏,呖,哩,唎,唳,喱,嚟,嚦,囄,囇,坜,塛,壢,娌,娳,婯,嫠,孋,孷,屴,岦,峛,峲,巁,廲,悡,悧,悷,慄,戾,搮,攊,攦,攭,斄,暦,曆,曞,朸,李,枥,栃,栎,栗,栛,栵,梨,梸,棃,棙,樆,檪,櫔,櫟,櫪,欐,欚,歴,歷,氂,沥,沴,浬,涖,溧,漓,澧,濿,瀝,灕,爄,爏,犁,犂,犛,犡,狸,猁,珕,理,琍,瑮,璃,瓅,瓈,瓑,瓥,疠,疬,痢,癘,癧,皪,盠,盭,睝,砅,砺,砾,磿,礪,礫,礰,礼,禮,禲,离,秝,穲,立,竰,笠,筣,篥,篱,籬,粒,粝,粴,糎,糲,綟,縭,缡,罹,艃,苈,苙,茘,荔,荲,莅,莉,菞,蒚,蒞,蓠,蔾,藜,藶,蘺,蚸,蛎,蛠,蜊,蜧,蟍,蟸,蠇,蠡,蠣,蠫,裏,裡,褵,詈,謧,讈,豊,貍,赲,跞,躒,轢,轣,轹,逦,邌,邐,郦,酈,醨,醴,里,釐,鉝,鋫,鋰,錅,鏫,鑗,锂,隶,隷,隸,離,雳,靂,靋,驪,骊,鬁,鯉,鯏,鯬,鱧,鱱,鱺,鲡,鲤,鳢,鳨,鴗,鵹,鷅,鸝,鹂,麗,麜,黎,黧,㑦,㒧,㒿,㓯,㔏,㕸,㗚,㘑,㟳,㠟,㡂,㤡,㤦,㦒,㧰,㬏,㮚,㯤,㰀,㰚,㱹,㴝,㷰,㸚,㹈,㺡,㻎,㻺,㼖,㽁,㽝,㾐,㾖,㿛,㿨,䁻,䃯,䄜,䅄,䅻,䇐,䉫,䊍,䊪,䋥,䍠,䍦,䍽,䓞,䔁,䔆,䔉,䔣,䔧,䖥,䖽,䖿,䗍,䘈,䙰,䚕,䟏,䟐,䡃,䣓,䣫,䤙,䤚,䥶,䧉,䬅,䬆,䮋,䮥,䰛,䰜,䱘,䲞,䴄,䴡,䴻,䵓,䵩,䶘|ju:举,侷,俱,倨,倶,僪,具,冣,凥,剧,劇,勮,匊,句,咀,圧,埧,埾,壉,姖,娵,婅,婮,寠,局,居,屦,屨,岠,崌,巈,巨,弆,怇,怚,惧,愳,懅,懼,抅,拒,拘,拠,挙,挶,捄,据,掬,據,擧,昛,梮,椇,椈,椐,榉,榘,橘,檋,櫸,欅,歫,毩,毱,沮,泃,泦,洰,涺,淗,湨,澽,炬,焗,焣,爠,犋,犑,狊,狙,琚,疽,痀,眗,瞿,矩,砠,秬,窭,窶,筥,簴,粔,粷,罝,耟,聚,聥,腒,舉,艍,苣,苴,莒,菊,蒟,蓻,蘜,虡,蚷,蜛,袓,裾,襷,詎,諊,讵,豦,貗,趄,趜,跔,跙,距,跼,踘,踞,踽,蹫,躆,躹,輂,遽,邭,郹,醵,鉅,鋦,鋸,鐻,钜,锔,锯,閰,陱,雎,鞠,鞫,颶,飓,駏,駒,駶,驧,驹,鮈,鮔,鴡,鵙,鵴,鶋,鶪,鼰,鼳,齟,龃,㘌,㘲,㜘,㞐,㞫,㠪,㥌,㨿,㩀,㩴,㬬,㮂,㳥,㽤,䃊,䄔,䅓,䆽,䈮,䋰,䏱,䕮,䗇,䛯,䜯,䡞,䢹,䣰,䤎,䪕,䰬,䱟,䱡,䴗,䵕,䶙,䶥|pie:丿,嫳,撆,撇,暼,氕,瞥,苤,鐅,䥕|fu:乀,付,伏,伕,俌,俘,俯,偩,傅,冨,冹,凫,刜,副,匐,呋,呒,咈,咐,哹,坿,垘,复,夫,妇,妋,姇,娐,婏,婦,媍,孚,孵,富,尃,岪,峊,巿,帗,幅,幞,府,弗,弣,彿,復,怤,怫,懯,扶,抚,拂,拊,捬,撫,敷,斧,旉,服,枎,枹,柎,柫,栿,桴,棴,椨,椱,榑,氟,泭,洑,浮,涪,滏,澓,炥,烰,焤,父,猤,玞,玸,琈,甫,甶,畉,畐,畗,癁,盙,砆,砩,祓,祔,福,禣,秿,稃,稪,竎,符,笰,筟,箙,簠,粰,糐,紨,紱,紼,絥,綍,綒,緮,縛,绂,绋,缚,罘,罦,翇,肤,胕,脯,腐,腑,腹,膚,艀,艴,芙,芣,芾,苻,茀,茯,荂,荴,莩,菔,萯,葍,蕧,虙,蚥,蚨,蚹,蛗,蜅,蜉,蝜,蝠,蝮,衭,袝,袱,複,褔,襆,襥,覄,覆,訃,詂,諨,讣,豧,負,賦,賻,负,赋,赙,赴,趺,跗,踾,輔,輹,輻,辅,辐,邞,郙,郛,鄜,酜,釜,釡,鈇,鉘,鉜,鍑,鍢,阜,阝,附,陚,韍,韨,颫,馥,駙,驸,髴,鬴,鮄,鮒,鮲,鰒,鲋,鳆,鳧,鳬,鳺,鴔,鵩,鶝,麩,麬,麱,麸,黻,黼,㓡,㕮,㙏,㚆,㚕,㜑,㟊,㠅,㤔,㤱,㪄,㫙,㬼,㳇,㵗,㽬,㾈,䂤,䃽,䋨,䋹,䌗,䌿,䍖,䎅,䑧,䒀,䒇,䓛,䔰,䕎,䗄,䘀,䘄,䘠,䝾,䞜,䞞,䞯,䞸,䟔,䟮,䠵,䡍,䦣,䧞,䨗,䨱,䩉,䪙,䫍,䫝,䭸,䮛,䯱,䯽,䵗,䵾|nai:乃,倷,奈,奶,妳,嬭,孻,廼,摨,柰,氖,渿,熋,疓,耐,腉,艿,萘,螚,褦,迺,釢,錼,鼐,㮈,㮏,㲡,㾍,䍲,䘅,䯮|wu:乄,乌,五,仵,伆,伍,侮,俉,倵,儛,兀,剭,务,務,勿,午,吳,吴,吾,呉,呜,唔,啎,嗚,圬,坞,塢,奦,妩,娪,娬,婺,嫵,寤,屋,屼,岉,嵍,嵨,巫,庑,廡,弙,忢,忤,怃,悞,悟,悮,憮,戊,扤,捂,摀,敄,无,旿,晤,杇,杌,梧,橆,歍,武,毋,汙,汚,污,洖,洿,浯,溩,潕,烏,焐,焑,無,熃,熓,物,牾,玝,珷,珸,瑦,璑,甒,痦,矹,碔,祦,禑,窏,窹,箼,粅,舞,芜,芴,茣,莁,蕪,蘁,蜈,螐,誈,誣,誤,诬,误,趶,躌,迕,逜,邬,郚,鄔,釫,鋈,錻,鎢,钨,阢,隖,雾,霚,霧,靰,騖,骛,鯃,鰞,鴮,鵐,鵡,鶩,鷡,鹀,鹉,鹜,鼯,鼿,齀,㐅,㐳,㑄,㡔,㬳,㵲,㷻,㹳,㻍,㽾,䃖,䍢,䎸,䑁,䒉,䛩,䟼,䡧,䦍,䦜,䫓,䮏,䳇,䳱|tuo:乇,佗,侂,侻,咃,唾,坨,堶,妥,媠,嫷,岮,庹,彵,托,扡,拓,拕,拖,挩,捝,撱,杔,柁,柝,椭,楕,槖,橐,橢,毤,毻,汑,沰,沱,涶,狏,砣,砤,碢,箨,籜,紽,脫,脱,莌,萚,蘀,袉,袥,託,詑,讬,跅,跎,踻,迱,酡,陀,陁,飥,饦,馱,馲,駄,駝,駞,騨,驒,驝,驮,驼,魠,鮀,鰖,鴕,鵎,鸵,鼉,鼍,鼧,㟎,㸰,㸱,㼠,㾃,䍫,䓕,䡐,䪑,䭾,䰿,䲊,䴱|me:么,嚒,嚰,庅,濹,癦|ho:乊,乥|zhi:之,乿,侄,俧,倁,値,值,偫,傂,儨,凪,制,劕,劧,卮,厔,只,吱,咫,址,坁,坧,垁,埴,執,墆,墌,夂,姪,娡,嬂,寘,峙,崻,巵,帋,帙,帜,幟,庢,庤,廌,彘,徏,徔,徝,志,忮,恉,慹,憄,懥,懫,戠,执,扺,扻,抧,挃,指,挚,掷,搘,搱,摭,摯,擲,擿,支,旘,旨,晊,智,枝,枳,柣,栀,栉,桎,梔,梽,植,椥,榰,槜,樴,櫍,櫛,止,殖,汁,汥,汦,沚,治,洔,洷,淽,滍,滞,滯,漐,潌,潪,瀄,炙,熫,狾,猘,瓆,瓡,畤,疐,疷,疻,痔,痣,瘈,直,知,砋,礩,祉,祑,祗,祬,禃,禔,禵,秓,秖,秩,秪,秲,秷,稙,稚,稺,穉,窒,筫,紙,紩,絷,綕,緻,縶,織,纸,织,置,翐,聀,聁,职,職,肢,胑,胝,脂,膣,膱,至,致,臸,芖,芝,芷,茋,藢,蘵,蛭,蜘,螲,蟙,衹,衼,袟,袠,製,襧,覟,觗,觯,觶,訨,誌,謢,豑,豒,豸,貭,質,贄,质,贽,趾,跖,跱,踬,踯,蹠,蹢,躑,躓,軄,軹,輊,轵,轾,郅,酯,釞,銍,鋕,鑕,铚,锧,阤,阯,陟,隲,隻,雉,馶,馽,駤,騭,騺,驇,骘,鯯,鳷,鴙,鴲,鷙,鸷,黹,鼅,㕄,㗌,㗧,㘉,㙷,㛿,㜼,㝂,㣥,㧻,㨁,㨖,㮹,㲛,㴛,䄺,䅩,䆈,䇛,䇽,䉅,䉜,䌤,䎺,䏄,䏯,䐈,䐭,䑇,䓌,䕌,䚦,䛗,䝷,䞃,䟈,䡹,䥍,䦯,䫕,䬹,䭁,䱥,䱨,䳅,䵂|zha:乍,偧,劄,厏,吒,咋,咤,哳,喳,奓,宱,扎,抯,挓,揸,搩,搾,摣,札,柤,柵,栅,楂,榨,樝,渣,溠,灹,炸,煠,牐,甴,痄,皶,皻,皼,眨,砟,箚,膪,苲,蚱,蚻,觰,詐,譇,譗,诈,踷,軋,轧,迊,醡,鍘,铡,閘,闸,霅,鮓,鮺,鲊,鲝,齄,齇,㒀,㡸,㱜,㴙,㷢,䋾,䕢,䖳,䛽,䞢,䥷,䵙,䵵|hu:乎,乕,互,冱,冴,匢,匫,呼,唬,唿,喖,嘑,嘝,嚛,囫,垀,壶,壷,壺,婟,媩,嫭,嫮,寣,岵,帍,幠,弖,弧,忽,怙,恗,惚,戶,户,戸,戽,扈,抇,护,搰,摢,斛,昈,昒,曶,枑,楜,槲,槴,歑,汻,沍,沪,泘,浒,淴,湖,滬,滸,滹,瀫,烀,焀,煳,熩,狐,猢,琥,瑚,瓠,瓳,祜,笏,箎,箶,簄,粐,糊,絗,綔,縠,胡,膴,芐,苸,萀,葫,蔛,蔰,虍,虎,虖,虝,蝴,螜,衚,觳,謼,護,軤,轷,鄠,醐,錿,鍙,鍸,雐,雽,韄,頀,頶,餬,鬍,魱,鯱,鰗,鱯,鳠,鳸,鶘,鶦,鶮,鸌,鹕,鹱,㕆,㗅,㦿,㨭,㪶,㫚,㯛,㸦,㹱,㺉,㾰,㿥,䁫,䇘,䈸,䉉,䉿,䊀,䍓,䎁,䔯,䕶,䗂,䚛,䛎,䞱,䠒,䧼,䨥,䨼,䩴,䪝,䭅,䭌,䭍,䮸,䲵|fa:乏,伐,佱,傠,发,垡,姂,彂,栰,橃,沷,法,灋,珐,琺,疺,発,發,瞂,砝,筏,罚,罰,罸,茷,藅,醗,鍅,閥,阀,髪,髮,㕹,㘺,㛲,䂲,䇅,䒥,䣹|le:乐,仂,勒,叻,忇,扐,楽,樂,氻,泐,玏,砳,竻,簕,艻,阞,韷,餎,饹,鰳,鳓,㔹,㖀,㦡|yin:乑,乚,侌,冘,凐,印,吟,吲,唫,喑,噖,噾,嚚,囙,因,圁,垔,垠,垽,堙,夤,姻,婣,婬,寅,尹,峾,崟,崯,嶾,廕,廴,引,愔,慇,慭,憖,憗,懚,斦,朄,栶,檃,檭,檼,櫽,歅,殥,殷,氤,泿,洇,洕,淫,淾,湚,溵,滛,濥,濦,烎,犾,狺,猌,珢,璌,瘖,瘾,癊,癮,碒,磤,禋,秵,筃,粌,絪,緸,胤,苂,茚,茵,荫,荶,蒑,蔩,蔭,蘟,蚓,螾,蟫,裀,訔,訚,訡,誾,諲,讔,趛,鄞,酳,釿,鈏,鈝,銀,銦,铟,银,闉,阥,阴,陰,陻,隂,隐,隠,隱,霒,霠,霪,靷,鞇,音,韾,飮,飲,饮,駰,骃,鮣,鷣,齗,齦,龂,龈,㐆,㕂,㖗,㙬,㝙,㞤,㡥,㣧,㥯,㥼,㦩,㧈,㪦,㱃,㴈,㸒,㹜,㹞,㼉,㾙,䇙,䌥,䒡,䓄,䕃,䖜,䚿,䡛,䤃,䤺,䨸,䪩,䲟|ping:乒,俜,凭,凴,呯,坪,塀,娦,屏,屛,岼,帡,帲,幈,平,慿,憑,枰,檘,洴,涄,淜,焩,玶,瓶,甁,甹,砯,竮,箳,簈,缾,聠,艵,苹,荓,萍,蓱,蘋,蚲,蛢,評,评,軿,輧,郱,頩,鮃,鲆,㺸,㻂,䍈,䶄|pang:乓,厐,嗙,嫎,庞,旁,汸,沗,滂,炐,篣,耪,肨,胖,胮,膖,舽,螃,蠭,覫,逄,雱,霶,髈,鰟,鳑,龎,龐,㜊,㤶,㥬,㫄,䅭,䒍,䨦,䮾|qiao:乔,侨,俏,僑,僺,劁,喬,嘺,墝,墽,嫶,峭,嵪,巧,帩,幧,悄,愀,憔,撬,撽,敲,桥,槗,樵,橇,橋,殼,燆,犞,癄,睄,瞧,硗,硚,碻,磽,礄,窍,竅,繑,繰,缲,翘,翹,荍,荞,菬,蕎,藮,誚,譙,诮,谯,趫,趬,跷,踍,蹺,蹻,躈,郻,鄗,鄡,鄥,釥,鍫,鍬,鐈,鐰,锹,陗,鞒,鞘,鞩,鞽,韒,頝,顦,骹,髚,髜,㚁,㚽,㝯,㡑,㢗,㤍,㪣,㴥,䀉,䃝,䆻,䇌,䎗,䩌,䱁,䲾|guai:乖,叏,夬,怪,恠,拐,枴,柺,箉,㧔,㷇,㽇,䂯,䊽|mie:乜,吀,咩,哶,孭,幭,懱,搣,櫗,滅,瀎,灭,瓱,篾,蔑,薎,蠛,衊,覕,鑖,鱴,鴓,㒝,䁾,䈼,䘊,䩏|xi:习,係,俙,傒,僖,兮,凞,匸,卌,卥,厀,吸,呬,咥,唏,唽,喜,嘻,噏,嚱,塈,壐,夕,奚,娭,媳,嬆,嬉,屃,屖,屗,屣,嵠,嶍,巇,希,席,徆,徙,徚,徯,忚,忥,怬,怸,恄,息,悉,悕,惁,惜,慀,憘,憙,戏,戯,戱,戲,扸,昔,晞,晰,晳,暿,曦,杫,析,枲,桸,椞,椺,榽,槢,樨,橀,橲,檄,欯,欷,歖,歙,歚,氥,汐,洗,浠,淅,渓,溪,滊,漇,漝,潝,潟,澙,烯,焁,焈,焟,焬,煕,熂,熄,熈,熙,熹,熺,熻,燨,爔,牺,犀,犔,犠,犧,狶,玺,琋,璽,瘜,皙,盻,睎,瞦,矖,矽,硒,磶,礂,禊,禧,稀,稧,穸,窸,粞,系,細,綌,緆,縰,繥,纚,细,绤,羲,習,翕,翖,肸,肹,膝,舄,舾,莃,菥,葈,葸,蒠,蒵,蓆,蓰,蕮,薂,虩,蜥,蝷,螅,螇,蟋,蟢,蠵,衋,袭,襲,西,覀,覡,覤,觋,觹,觽,觿,誒,諰,謑,謵,譆,诶,谿,豀,豨,豯,貕,赥,赩,趇,趘,蹝,躧,郄,郋,郗,郤,鄎,酅,醯,釳,釸,鈢,銑,錫,鎴,鏭,鑴,铣,锡,闟,阋,隙,隟,隰,隵,雟,霫,霼,飁,餏,餙,餼,饩,饻,騱,騽,驨,鬩,鯑,鰼,鱚,鳛,鵗,鸂,黖,鼷,㑶,㔒,㗩,㙾,㚛,㞒,㠄,㣟,㤴,㤸,㥡,㦻,㩗,㭡,㳧,㵿,㸍,㹫,㽯,㿇,䀘,䂀,䈪,䊠,䏮,䐼,䓇,䙽,䚷,䛥,䜁,䢄,䧍,䨳,䩤,䫣,䮎,䲪|xiang:乡,享,亯,佭,像,勨,厢,向,响,啌,嚮,姠,嶑,巷,庠,廂,忀,想,晑,曏,栙,楿,橡,欀,湘,珦,瓖,瓨,相,祥,箱,絴,緗,缃,缿,翔,膷,芗,萫,葙,薌,蚃,蟓,蠁,襄,襐,詳,详,象,跭,郷,鄉,鄊,鄕,銄,鐌,鑲,镶,響,項,项,飨,餉,饗,饟,饷,香,驤,骧,鮝,鯗,鱌,鱜,鱶,鲞,麘,㐮,㗽,㟄,㟟,䊑,䐟,䔗,䖮,䜶,䢽|hai:乤,亥,咍,嗐,嗨,嚡,塰,孩,害,氦,海,烸,胲,酼,醢,餀,饚,駭,駴,骇,骸,㜾,㤥,㦟,㧡,㨟,㺔,䇋,䠽,䯐,䱺|shu:书,侸,倏,倐,儵,叔,咰,塾,墅,姝,婌,孰,尌,尗,属,庶,庻,怷,恕,戍,抒,掓,摅,攄,数,數,暏,暑,曙,書,朮,术,束,杸,枢,柕,树,梳,樞,樹,橾,殊,殳,毹,毺,沭,淑,漱,潄,潻,澍,濖,瀭,焂,熟,瑹,璹,疎,疏,癙,秫,竖,竪,籔,糬,紓,絉,綀,纾,署,腧,舒,荗,菽,蒁,蔬,薥,薯,藷,虪,蜀,蠴,術,裋,襡,襩,豎,贖,赎,跾,踈,軗,輸,输,述,鄃,鉥,錰,鏣,陎,鮛,鱪,鱰,鵨,鶐,鶑,鸀,黍,鼠,鼡,㒔,㛸,㜐,㟬,㣽,㯮,㳆,㶖,㷂,㻿,㽰,㾁,䃞,䆝,䉀,䎉,䘤,䜹,䝂,䝪,䞖,䠱,䢤,䩱,䩳,䴰|dou:乧,兜,兠,剅,吺,唗,抖,斗,斣,枓,梪,橷,毭,浢,痘,窦,竇,篼,脰,艔,荳,蔸,蚪,豆,逗,郖,酘,鈄,鋀,钭,閗,闘,阧,陡,餖,饾,鬥,鬦,鬪,鬬,鬭,㛒,㞳,㢄,㨮,㪷,㷆,䄈,䕆,䕱,䛠,䬦|nang:乪,儾,嚢,囊,囔,擃,攮,曩,欜,灢,蠰,饢,馕,鬞,齉,㒄,㶞,䂇|kai:乫,凯,凱,剀,剴,勓,嘅,垲,塏,奒,开,忾,恺,愷,愾,慨,揩,暟,楷,欬,炌,炏,烗,蒈,衉,輆,鍇,鎎,鎧,鐦,铠,锎,锴,開,闓,闿,颽,㡁,㲉,䁗,䐩,䒓,䡷|keng:乬,劥,厼,吭,唟,坈,坑,巪,怾,挳,牼,硁,硜,硻,誙,銵,鍞,鏗,铿,䡰|ting:乭,亭,侹,停,厅,厛,听,圢,娗,婷,嵉,庁,庭,廰,廳,廷,挺,桯,梃,楟,榳,汀,涏,渟,濎,烃,烴,烶,珽,町,筳,綎,耓,聤,聴,聼,聽,脡,艇,艈,艼,莛,葶,蜓,蝏,誔,諪,邒,鋌,铤,閮,霆,鞓,頲,颋,鼮,㹶,䋼,䗴,䦐,䱓,䵺|mo:乮,劘,劰,嗼,嚤,嚩,圽,塻,墨,妺,嫫,嫼,寞,尛,帓,帞,怽,懡,抹,摩,摸,摹,擵,昩,暯,末,枺,模,橅,歾,歿,殁,沫,漠,爅,瘼,皌,眜,眽,眿,瞐,瞙,砞,磨,礳,秣,粖,糢,絈,縸,纆,耱,膜,茉,莈,莫,蓦,藦,蘑,蛨,蟔,袹,謨,謩,譕,谟,貃,貊,貘,銆,鏌,镆,陌,靺,饃,饝,馍,驀,髍,魔,魩,魹,麼,麽,麿,默,黙,㱄,㱳,㷬,㷵,㹮,䁼,䁿,䃺,䉑,䏞,䒬,䘃,䜆,䩋,䬴,䮬,䯢,䱅,䳮,䴲|ou:乯,偶,吘,呕,嘔,噢,塸,夞,怄,慪,櫙,欧,歐,殴,毆,毮,沤,漚,熰,瓯,甌,筽,耦,腢,膒,蕅,藕,藲,謳,讴,鏂,鞰,鴎,鷗,鸥,齵,㒖,㛏,㼴,䌂,䌔,䚆,䯚|mai:买,佅,劢,勱,卖,嘪,埋,売,脈,脉,荬,蕒,薶,衇,買,賣,迈,邁,霡,霢,霾,鷶,麥,麦,㜥,㼮,䁲,䈿,䘑,䚑,䜕,䨪,䨫,䮮|luan:乱,亂,卵,圝,圞,奱,孌,孪,孿,峦,巒,挛,攣,曫,栾,欒,滦,灓,灤,癴,癵,羉,脔,臠,虊,釠,銮,鑾,鵉,鸞,鸾,㝈,㡩,㱍,䖂,䜌|cai:乲,倸,偲,埰,婇,寀,彩,戝,才,採,材,棌,猜,睬,綵,縩,纔,菜,蔡,裁,財,财,跴,踩,采,㒲,㥒,䌨,䌽,䐆,䣋,䰂,䴭|ru:乳,侞,儒,入,嗕,嚅,如,媷,嬬,孺,嶿,帤,扖,擩,曘,杁,桇,汝,洳,渪,溽,濡,燸,筎,縟,繻,缛,肗,茹,蒘,蓐,蕠,薷,蠕,袽,褥,襦,辱,込,邚,鄏,醹,銣,铷,顬,颥,鱬,鳰,鴑,鴽,㦺,㨎,㹘,䋈,䰰|xue:乴,吷,坹,学,學,岤,峃,嶨,怴,斈,桖,樰,泧,泶,澩,瀥,烕,燢,狘,疦,疶,穴,膤,艝,茓,蒆,薛,血,袕,觷,謔,谑,趐,踅,轌,辥,雤,雪,靴,鞾,鱈,鳕,鷽,鸴,㖸,㞽,㡜,㧒,㶅,㿱,䎀,䤕,䨮,䫻,䫼,䬂,䭥,䱑|peng:乶,倗,傰,剻,匉,喸,嘭,堋,塜,塳,巼,弸,彭,怦,恲,憉,抨,挷,捧,掽,搒,朋,梈,棚,椖,椪,槰,樥,泙,浌,淎,漨,漰,澎,烹,熢,皏,砰,硑,硼,碰,磞,稝,竼,篷,纄,胓,膨,芃,莑,蓬,蟚,蟛,踫,軯,輣,錋,鑝,閛,闏,韸,韼,駍,騯,髼,鬅,鬔,鵬,鹏,㛔,㥊,㼞,䄘,䡫,䰃,䴶|sha:乷,倽,傻,儍,刹,唦,唼,啥,喢,帹,挱,杀,榝,樧,歃,殺,沙,煞,猀,痧,砂,硰,箑,粆,紗,繌,繺,纱,翜,翣,莎,萐,蔱,裟,鎩,铩,閯,閷,霎,魦,鯊,鯋,鲨,㚫,㛼,㰱,䈉,䝊,䮜,䵘,䶎|na:乸,吶,呐,哪,嗱,妠,娜,拏,拿,挐,捺,笝,納,纳,肭,蒳,衲,袦,誽,豽,貀,軜,那,鈉,鎿,钠,镎,雫,靹,魶,㗙,㨥,㴸,䀑,䅞,䇣,䇱,䈫,䎎,䏧,䖓,䖧,䛔,䟜,䪏,䫱,䱹|qian:乹,乾,仟,仱,伣,佥,俔,倩,偂,傔,僉,儙,凵,刋,前,千,嗛,圱,圲,堑,塹,墘,壍,奷,婜,媊,嬱,孯,岍,岒,嵌,嵰,忴,悓,悭,愆,慊,慳,扦,扲,拑,拪,掔,掮,揵,搴,摼,撁,攐,攑,攓,杄,棈,椠,榩,槏,槧,橬,檶,櫏,欠,欦,歉,歬,汘,汧,浅,淺,潛,潜,濳,灊,牵,牽,皘,竏,签,箝,箞,篏,篟,簽,籖,籤,粁,綪,縴,繾,缱,羬,肷,膁,臤,芊,芡,茜,茾,荨,蒨,蔳,蕁,虔,蚈,蜸,褰,諐,謙,譴,谦,谴,谸,軡,輤,迁,遣,遷,釺,鈆,鈐,鉆,鉗,鉛,銭,錢,鎆,鏲,鐱,鑓,钎,钤,钱,钳,铅,阡,雃,韆,顅,騚,騝,騫,骞,鬜,鬝,鰬,鵮,鹐,黔,黚,㐸,㜞,㟻,㡨,㦮,㧄,㨜,㩮,㯠,㸫,䁮,䈤,䈴,䊴,䍉,䖍,䥅,䦲,䨿,䪈,䫡,䭤|er:乻,二,仒,佴,侕,儿,児,兒,刵,咡,唲,尒,尓,尔,峏,弍,弐,旕,栭,栮,樲,毦,洏,洱,爾,珥,粫,而,耏,耳,聏,胹,荋,薾,衈,袻,誀,貮,貳,贰,趰,輀,轜,迩,邇,鉺,铒,陑,隭,餌,饵,駬,髵,鮞,鲕,鴯,鸸,㒃,㖇,㚷,㛅,㜨,㢽,㧫,㮕,䋙,䋩,䌺,䎟,䎠,䎶,䏪,䣵,䮘|cui:乼,伜,倅,催,凗,啐,啛,墔,崔,嶉,忰,悴,慛,摧,榱,槯,毳,淬,漼,焠,獕,璀,疩,瘁,皠,磪,竁,粹,紣,綷,縗,缞,翆,翠,脃,脆,膬,膵,臎,萃,襊,趡,鏙,顇,㝮,㥞,㧘,㯔,㯜,㱖,㳃,㵏,㷃,㷪,䂱,䃀,䄟,䆊,䊫,䧽|ceng:乽,噌,层,層,岾,嶒,猠,硛,硳,竲,蹭,驓,㣒,㬝,䁬,䉕|gui:亀,佹,刽,刿,劊,劌,匦,匭,厬,圭,垝,妫,姽,媯,嫢,嬀,宄,嶲,巂,帰,庋,庪,归,恑,摫,撌,攰,攱,昋,晷,柜,桂,椝,椢,槶,槻,槼,櫃,櫷,歸,氿,湀,溎,炅,珪,瑰,璝,瓌,癸,皈,瞆,瞡,瞶,硅,祪,禬,窐,筀,簂,簋,胿,膭,茥,蓕,蛫,蟡,袿,襘,規,规,觤,詭,诡,貴,贵,跪,軌,轨,邽,郌,閨,闺,陒,鞼,騩,鬶,鬹,鬼,鮭,鱖,鱥,鲑,鳜,龜,龟,㔳,㙺,㧪,㨳,㩻,㪈,㲹,㸵,䁛,䇈,䌆,䍯,䍷,䐴,䖯,䙆,䝿,䞈,䞨,䠩,䣀,䤥,䯣,䰎,䳏|gan:亁,仠,倝,凎,凲,坩,尲,尴,尶,尷,干,幹,忓,感,擀,攼,敢,旰,杆,柑,桿,榦,橄,檊,汵,泔,淦,漧,澉,灨,玕,甘,疳,皯,盰,矸,秆,稈,竿,笴,筸,簳,粓,紺,绀,肝,芉,苷,衦,詌,贛,赣,赶,趕,迀,酐,骭,魐,鱤,鳡,鳱,㺂,䃭,䇞,䔈,䤗,䯎,䲺,䵟|jue:亅,倔,傕,决,刔,劂,勪,厥,噘,噱,妜,孒,孓,屩,屫,崛,嶡,嶥,彏,憠,憰,戄,抉,挗,捔,掘,撅,撧,攫,斍,桷,橛,橜,欔,欮,殌,氒,決,泬,潏,灍,焆,熦,爑,爝,爴,爵,獗,玃,玦,玨,珏,瑴,瘚,矍,矡,砄,絕,絶,绝,臄,芵,蕝,蕨,虳,蚗,蟨,蟩,覐,覚,覺,觉,觖,觼,訣,譎,诀,谲,貜,赽,趉,趹,蹶,蹷,躩,逫,鈌,鐍,鐝,钁,镢,镼,駃,鴂,鴃,鶌,鷢,龣,㓸,㔃,㔢,㟲,㤜,㩱,㭈,㭾,㰐,㵐,㷾,㸕,㹟,㻕,䀗,䁷,䆕,䆢,䇶,䋉,䍊,䏐,䏣,䐘,䖼,䘿,䙠,䝌,䞵,䞷,䟾,䠇,䡈,䦆,䦼|liao:了,僚,嘹,嫽,寥,寮,尞,尥,尦,屪,嵺,嶚,嶛,廖,廫,憀,憭,撂,撩,敹,料,暸,漻,潦,炓,燎,爎,爒,獠,璙,疗,療,瞭,窷,竂,簝,繚,缭,聊,膋,膫,蓼,蟟,豂,賿,蹘,蹽,辽,遼,鄝,釕,鐐,钌,镣,镽,飉,髎,鷯,鹩,㙩,㝋,㡻,㵳,㶫,㺒,䄦,䉼,䍡,䎆,䑠,䜍,䜮,䝀,䢧,䨅,䩍|ma:亇,傌,吗,唛,嗎,嘛,嘜,妈,媽,嫲,嬤,嬷,杩,榪,溤,犘,犸,獁,玛,瑪,痲,睰,码,碼,礣,祃,禡,罵,蔴,蚂,螞,蟆,蟇,遤,鎷,閁,馬,駡,马,骂,鬕,鰢,鷌,麻,㐷,㑻,㜫,㦄,㨸,㾺,䗫,䣕,䣖,䯦,䳸|zheng:争,佂,凧,埩,塣,姃,媜,峥,崝,崢,帧,幀,征,徰,徴,徵,怔,愸,抍,拯,挣,掙,掟,揁,撜,政,整,晸,正,氶,炡,烝,爭,狰,猙,症,癥,眐,睁,睜,筝,箏,篜,糽,聇,蒸,証,諍,證,证,诤,踭,郑,鄭,鉦,錚,钲,铮,鬇,鴊,㡠,㡧,㱏,㽀,䂻,䈣,䛫,䡕,䥌,䥭,䦛,䦶|chu:亍,俶,傗,储,儊,儲,処,出,刍,初,厨,嘼,埱,处,岀,幮,廚,怵,憷,懨,拀,搋,搐,摴,敊,斶,杵,椘,楚,楮,榋,樗,橱,橻,檚,櫉,櫥,欪,歜,滀,滁,濋,犓,珿,琡,璴,矗,础,礎,禇,竌,竐,篨,絀,绌,耡,臅,芻,蒢,蒭,蕏,處,蜍,蟵,褚,触,觸,諔,豖,豠,貙,趎,踀,蹰,躇,躕,鄐,鉏,鋤,锄,閦,除,雏,雛,鶵,黜,齣,齭,齼,㔘,㕏,㕑,㗰,㙇,㡡,㤕,㤘,㶆,㹼,㼥,䅳,䊰,䎝,䎤,䖏,䙕,䙘,䜴,䟞,䟣,䠂,䠧,䦌,䧁,䮞|kui:亏,傀,刲,匮,匱,卼,喟,喹,嘳,夔,奎,媿,嬇,尯,岿,巋,巙,悝,愦,愧,憒,戣,揆,晆,暌,楏,楑,樻,櫆,欳,殨,溃,潰,煃,盔,睽,磈,窥,窺,篑,簣,籄,聧,聩,聭,聵,葵,蒉,蒊,蕢,藈,蘬,蘷,虁,虧,蝰,謉,跬,蹞,躨,逵,鄈,鍨,鍷,鐀,鑎,闚,頄,頍,頯,顝,餽,饋,馈,馗,騤,骙,魁,㕟,㙓,㚝,㛻,㨒,䈐,䍪,䕚,䕫,䟸,䠑,䤆,䦱,䧶,䫥,䯓,䳫|yun:云,伝,傊,允,勻,匀,呍,喗,囩,夽,奫,妘,孕,恽,惲,愠,愪,慍,抎,抣,昀,晕,暈,枟,橒,殒,殞,氲,氳,沄,涢,溳,澐,煴,熅,熉,熨,狁,玧,畇,眃,磒,秐,筼,篔,紜,緼,縕,縜,繧,纭,缊,耘,耺,腪,芸,荺,蒀,蒕,蒷,蕓,蕰,蕴,薀,藴,蘊,蝹,褞,賱,贇,赟,运,運,郓,郧,鄆,鄖,酝,醖,醞,鈗,鋆,阭,陨,隕,雲,霣,韗,韞,韫,韵,韻,頵,餫,馧,馻,齫,齳,㚃,㚺,㜏,㞌,㟦,䆬,䇖,䉙,䚋,䞫,䡝,䢵,䤞,䦾,䨶,䩵,䪳,䲰,䵴|sui:亗,倠,哸,埣,夊,嬘,岁,嵗,旞,檖,歲,歳,浽,滖,澻,濉,瀡,煫,熣,燧,璲,瓍,眭,睟,睢,砕,碎,祟,禭,穂,穗,穟,粋,綏,繀,繐,繸,绥,脺,膸,芕,荽,荾,葰,虽,襚,誶,譢,谇,賥,遀,遂,邃,鐆,鐩,隋,随,隧,隨,雖,鞖,髄,髓,㒸,㞸,㴚,㵦,㻟,㻪,㻽,䅗,䉌,䍁,䔹,䜔,䠔,䡵,䢫,䥙,䭉,䯝|gen:亘,哏,揯,搄,根,艮,茛,跟,㫔,㮓,䫀|geng:亙,刯,哽,啹,喼,嗰,埂,堩,峺,庚,挭,掶,更,梗,椩,浭,焿,畊,絚,綆,緪,縆,绠,羮,羹,耕,耿,莄,菮,賡,赓,郠,骾,鯁,鲠,鶊,鹒,㾘,䋁,䌄,䱍,䱎,䱭,䱴|xie:些,亵,伳,偕,偰,僁,写,冩,劦,勰,协,協,卨,卸,嗋,噧,垥,塮,夑,奊,娎,媟,寫,屑,屓,屟,屧,屭,峫,嶰,廨,徢,恊,愶,懈,拹,挟,挾,揳,携,撷,擕,擷,攜,斜,旪,暬,械,楔,榍,榭,歇,泄,泻,洩,渫,澥,瀉,瀣,灺,炧,炨,焎,熁,燮,燲,爕,猲,獬,瑎,祄,禼,糏,紲,絏,絜,絬,綊,緤,緳,纈,绁,缬,缷,翓,胁,脅,脇,脋,膎,薢,薤,藛,蝎,蝢,蟹,蠍,蠏,衺,褉,褻,襭,諧,謝,讗,谐,谢,躞,躠,邂,邪,鐷,鞋,鞢,鞵,韰,齂,齘,齥,龤,㒠,㓔,㔎,㕐,㖑,㖿,㙝,㙰,㝍,㞕,㣯,㣰,㥟,㦪,㨙,㨝,㩉,㩦,㩪,㭨,㰔,㰡,㳦,㳿,㴬,㴮,㴽,㸉,㽊,䉏,䉣,䊝,䔑,䕈,䕵,䙊,䙎,䙝,䚳,䚸,䡡,䢡,䥱,䥾,䦏,䦑,䩧,䭎,䲒,䵦|tou:亠,偷,偸,头,妵,婾,媮,投,敨,斢,殕,紏,緰,蘣,透,鍮,頭,骰,黈,㓱,㖣,㡏,㢏,㪗,䞬,䟝,䱏,䵉|wang:亡,亾,仼,兦,妄,尣,尩,尪,尫,彺,往,徃,忘,忹,惘,旺,暀,望,朢,枉,棢,汪,瀇,焹,王,盳,網,网,罔,莣,菵,蚟,蛧,蝄,誷,輞,辋,迋,魍,㑌,㓁,㲿,㳹,㴏,䋄,䋞,䛃,䤑,䰣|kang:亢,伉,匟,囥,嫝,嵻,康,忼,慷,扛,抗,摃,槺,漮,炕,犺,砊,穅,粇,糠,躿,邟,鈧,鏮,钪,閌,闶,鱇,㰠,䡉|da:亣,剳,匒,呾,咑,哒,嗒,噠,垯,墶,大,妲,怛,打,搭,撘,橽,沓,溚,炟,燵,畣,瘩,眔,笪,答,繨,羍,耷,荅,荙,薘,蟽,褡,詚,跶,躂,达,迏,迖,逹,達,鎉,鎝,鐽,靼,鞑,韃,龖,龘,㙮,㜓,㟷,㯚,㾑,㿯,䃮,䐊,䑽,䩢,䳴,䵣|jiao:交,佼,侥,僥,僬,儌,剿,劋,勦,叫,呌,嘂,嘄,嘦,噍,噭,嚼,姣,娇,嬌,嬓,孂,峤,峧,嶕,嶠,嶣,徼,憍,挍,挢,捁,搅,摷,撟,撹,攪,敎,教,敫,敽,敿,斠,晈,暞,曒,椒,櫵,浇,湫,湬,滘,漖,潐,澆,灚,烄,焦,焳,煍,燋,狡,獥,珓,璬,皎,皦,皭,矫,矯,礁,穚,窌,窖,笅,筊,簥,絞,繳,纐,绞,缴,胶,脚,腳,膠,膲,臫,艽,芁,茭,茮,蕉,藠,虠,蛟,蟜,蟭,角,訆,譑,譥,賋,趭,跤,踋,較,轇,轎,轿,较,郊,酵,醮,釂,鉸,鐎,铰,餃,饺,驕,骄,鮫,鱎,鲛,鵁,鵤,鷦,鷮,鹪,㠐,㩰,㬭,㭂,㰾,㳅,㽱,㽲,䀊,䁶,䂃,䆗,䘨,䚩,䠛,䣤,䥞,䪒,䴔,䴛|heng:亨,哼,啈,囍,堼,姮,恆,恒,悙,桁,横,橫,涥,烆,珩,胻,脝,蘅,衡,鑅,鴴,鵆,鸻,㔰,㶇,䄓,䒛,䬖,䬝,䯒|qin:亲,侵,勤,吢,吣,唚,嗪,噙,坅,埁,媇,嫀,寑,寝,寢,寴,嵚,嶔,庈,懃,懄,抋,捦,揿,搇,撳,擒,斳,昑,梫,檎,欽,沁,溱,澿,瀙,珡,琴,琹,瘽,矝,禽,秦,笉,綅,耹,芩,芹,菣,菦,菳,藽,蚙,螓,螼,蠄,衾,親,誛,赺,赾,鈙,鋟,钦,锓,雂,靲,顉,駸,骎,鮼,鳹,㝲,㞬,㢙,㤈,㩒,㪁,㮗,㾛,䈜,䔷,䖌,䠴,䦦|bo:亳,仢,伯,侼,僠,僰,勃,博,卜,啵,嚗,壆,孛,孹,嶓,帛,愽,懪,拨,挬,捕,搏,撥,播,擘,柭,桲,檗,欂,泊,波,浡,淿,渤,湐,煿,牔,犦,犻,狛,猼,玻,瓝,瓟,癶,癷,盋,砵,碆,磻,礡,礴,秡,箔,箥,簙,簸,糪,紴,缽,胉,脖,膊,舶,艊,苩,菠,葧,蔔,蘗,蚾,袚,袯,袰,襏,襮,譒,豰,跛,踣,蹳,郣,鈸,鉑,鉢,鋍,鎛,鑮,钵,钹,铂,镈,餑,餺,饽,馎,馛,馞,駁,駮,驋,驳,髆,髉,鮊,鱍,鲌,鵓,鹁,㖕,㗘,㝿,㟑,㧳,㩧,㩭,㪍,㬍,㬧,㱟,㴾,㶿,㹀,䂍,䊿,䍨,䍸,䑈,䒄,䗚,䙏,䞳,䟛,䢌,䥬,䪇,䪬,䫊,䬪,䭦,䭯,䮀,䮂,䯋,䰊,䶈|lian:亷,僆,劆,匲,匳,嗹,噒,堜,奁,奩,娈,媡,嫾,嬚,帘,廉,怜,恋,慩,憐,戀,摙,敛,斂,梿,楝,槤,櫣,歛,殓,殮,浰,涟,湅,溓,漣,潋,澰,濂,濓,瀲,炼,煉,熑,燫,琏,瑓,璉,磏,稴,簾,籢,籨,練,縺,纞,练,羷,翴,联,聨,聫,聮,聯,脸,臁,臉,莲,萰,蓮,蔹,薕,蘝,蘞,螊,蠊,裢,裣,褳,襝,覝,謰,譧,蹥,连,連,鄻,錬,鍊,鎌,鏈,鐮,链,镰,鬑,鰊,鰱,鲢,㓎,㜃,㜕,㜻,㝺,㟀,㡘,㢘,㥕,㦁,㦑,㪘,㪝,㯬,㰈,㰸,㱨,㶌,㶑,㺦,㼑,㼓,㾾,䁠,䃛,䆂,䇜,䌞,䏈,䙺,䥥,䨬,䭑|duo:亸,仛,凙,刴,剁,剟,剫,咄,哆,哚,喥,嚉,嚲,垛,垜,埵,堕,墮,墯,多,夛,夺,奪,尮,崜,嶞,惰,憜,挅,挆,掇,敓,敚,敠,敪,朵,朶,柮,桗,椯,毲,沲,痥,綞,缍,舵,茤,裰,趓,跢,跥,跺,踱,躱,躲,軃,鈬,鐸,铎,陊,陏,飿,饳,鬌,鮵,鵽,㔍,㖼,㙐,㛆,㛊,㣞,㥩,㧷,㻔,㻧,䅜,䍴,䐾,䑨,䒳,䙃,䙟,䙤,䠤,䤪,䤻,䩔,䩣,䫂,䯬|ren:人,亻,仁,仞,仭,任,刃,刄,壬,妊,姙,屻,忈,忍,忎,恁,扨,朲,杒,栠,栣,梕,棯,牣,秂,秹,稔,紉,紝,絍,綛,纫,纴,肕,腍,芢,荏,荵,葚,衽,袵,訒,認,认,讱,躵,軔,轫,鈓,銋,靭,靱,韌,韧,飪,餁,饪,魜,鵀,㠴,㣼,㶵,㸾,䀼,䇮,䋕,䌾,䏕,䏰,䭃,䴦|ra:亽,囕,罖|ze:仄,伬,则,則,唶,啧,啫,嘖,夨,嫧,崱,帻,幘,庂,択,择,捑,擇,昃,昗,樍,歵,汄,沢,泎,泽,溭,澤,皟,瞔,矠,礋,稄,笮,箦,簀,耫,舴,蔶,蠌,襗,諎,謮,責,賾,责,赜,迮,鸅,齚,齰,㖽,㣱,㳁,㳻,䃎,䇥,䕉,䕪,䰹,䶦|jin:仅,今,伒,侭,僅,僸,儘,兓,凚,劤,劲,勁,卺,厪,噤,嚍,埐,堇,堻,墐,壗,妗,嫤,嬧,寖,尽,嶜,巹,巾,廑,惍,慬,搢,斤,晉,晋,枃,槿,歏,殣,津,浕,浸,溍,漌,濅,濜,烬,煡,燼,珒,琎,琻,瑨,瑾,璡,璶,盡,矜,砛,祲,禁,筋,紟,紧,緊,縉,缙,荕,荩,菫,蓳,藎,衿,襟,覲,觐,觔,謹,谨,賮,贐,赆,近,进,進,金,釒,錦,钅,锦,靳,饉,馑,鹶,黅,齽,㝻,㨷,㬐,㬜,㯲,㯸,㰹,㱈,㴆,㶦,㶳,㹏,䀆,䆮,䋮,䌝,䐶,䑤,䒺,䖐,䗯,䝲,䤐,䥆,䫴,䭙,䶖|pu:仆,僕,匍,噗,圃,圑,圤,埔,墣,巬,巭,扑,抪,撲,擈,攴,攵,普,暜,曝,朴,柨,樸,檏,氆,浦,溥,潽,濮,瀑,炇,烳,璞,痡,瞨,穙,纀,舖,舗,莆,菐,菩,葡,蒱,蒲,諩,譜,谱,贌,蹼,酺,鋪,鏷,鐠,铺,镤,镨,陠,駇,鯆,㒒,㬥,㯷,㲫,㹒,㺪,䈬,䈻,䑑,䔕,䗱,䧤,䲕,䴆|ba:仈,八,叐,叭,吧,哵,坝,坺,垻,墢,壩,夿,妭,岜,巴,弝,扒,把,抜,拔,捌,朳,欛,灞,炦,爸,犮,玐,疤,癹,矲,笆,粑,紦,罢,罷,羓,耙,胈,芭,茇,菝,蚆,覇,詙,豝,跁,跋,軷,釛,釟,鈀,钯,霸,靶,颰,魃,魞,鮁,鲃,鲅,鼥,㔜,㖠,㞎,㧊,㶚,䃻,䆉,䇑,䎬,䟦,䥯,䩗,䩻,䰾,䱝,䳁,䳊|reng:仍,扔,礽,芿,辸,陾,㭁,㺱,䄧,䚮|fo:仏,佛,坲,梻|tao:仐,匋,咷,啕,夲,套,嫍,幍,弢,慆,掏,搯,桃,梼,槄,檮,洮,涛,淘,滔,濤,瑫,畓,祹,絛,綯,縚,縧,绦,绹,萄,蜪,裪,討,詜,謟,讨,迯,逃,醄,鋾,錭,陶,鞀,鞉,鞱,韜,韬,飸,饀,饕,駣,騊,鼗,㚐,㹗,䚯,䚵,䬞,䵚|lun:仑,伦,侖,倫,囵,圇,埨,婨,崘,崙,惀,抡,掄,棆,沦,淪,溣,碖,磮,稐,綸,纶,耣,腀,菕,蜦,論,论,踚,輪,轮,錀,陯,鯩,㖮,㷍,䈁,䑳|cang:仓,仺,伧,倉,傖,凔,匨,嵢,欌,沧,滄,濸,獊,罉,舱,艙,苍,蒼,蔵,藏,螥,賶,鑶,鶬,鸧,㵴,㶓,䅮,䢢|zi:仔,倳,兹,剚,吇,呰,咨,唨,啙,嗞,姉,姊,姕,姿,子,孖,字,孜,孳,孶,崰,嵫,恣,杍,栥,梓,椔,榟,橴,淄,渍,湽,滋,滓,漬,澬,牸,玆,眥,眦,矷,禌,秄,秭,秶,稵,笫,籽,粢,紎,紫,緇,缁,耔,胏,胔,胾,自,芓,茊,茡,茲,葘,虸,觜,訾,訿,諮,谘,貲,資,赀,资,赼,趑,趦,輜,輺,辎,鄑,釨,鈭,錙,鍿,鎡,锱,镃,頾,頿,髭,鯔,鰦,鲻,鶅,鼒,齍,齜,龇,㜽,㧗,㰣,㰷,㱴,㺭,䅆,䐉,䔂,䘣|ta:他,侤,咜,嚃,嚺,塌,塔,墖,她,它,崉,挞,搨,撻,榙,榻,毾,涾,溻,澾,濌,牠,狧,獭,獺,祂,禢,褟,襨,誻,譶,趿,踏,蹋,蹹,躢,遝,遢,鉈,錔,铊,闒,闥,闼,阘,鞜,鞳,鮙,鰨,鳎,㒓,㗳,㛥,㣛,㣵,㧺,㭼,㯓,㳠,㳫,㹺,㺚,㿹,䂿,䈋,䈳,䌈,䍇,䍝,䎓,䑜,䓠,䜚,䵬,䶀,䶁|xian:仙,仚,伭,佡,僊,僩,僲,僴,先,冼,县,咞,咸,哯,唌,啣,嘕,垷,奾,妶,姭,娊,娨,娴,娹,婱,嫌,嫺,嫻,嬐,孅,宪,尟,尠,屳,岘,峴,崄,嶮,幰,廯,弦,忺,憪,憲,憸,挦,掀,搟,撊,撏,攇,攕,显,晛,暹,杴,枮,橌,櫶,毨,氙,涀,涎,湺,澖,瀗,灦,烍,燹,狝,猃,献,獫,獮,獻,玁,现,珗,現,甉,痫,癇,癎,県,睍,硍,礥,祆,禒,秈,筅,箲,籼,粯,糮,絃,絤,綫,線,縣,繊,纎,纖,纤,线,缐,羡,羨,胘,腺,臔,臽,舷,苋,苮,莧,莶,薟,藓,藔,藖,蘚,蚬,蚿,蛝,蜆,衔,衘,褼,襳,誢,誸,諴,譣,豏,賢,贒,贤,赻,跣,跹,蹮,躚,輱,酰,醎,銛,銜,鋧,錎,鍁,鍂,鍌,鏾,鑦,铦,锨,閑,闲,限,陥,险,陷,険,險,霰,韅,韯,韱,顕,顯,餡,馅,馦,鮮,鱻,鲜,鶱,鷳,鷴,鷼,鹇,鹹,麲,鼸,㔵,㘅,㘋,㛾,㜪,㡉,㡾,㢺,㦓,㧋,㧥,㩈,㪇,㫫,㬎,㬗,㭠,㭹,㮭,㯀,㳄,㳭,㵪,㶍,㺌,㿅,䀏,䁂,䃱,䃸,䉯,䉳,䏹,䒸,䕔,䗾,䘆,䚚,䜢,䝨,䞁,䢾,䤼,䥪,䦥,䧋,䧟,䧮,䨘,䨷,䱤,䲗,䵇,䶟,䶢|hong:仜,叿,吰,哄,嗊,嚝,垬,妅,娂,宏,宖,弘,彋,揈,撔,晎,汯,泓,洪,浤,渱,渹,潂,澋,澒,灴,烘,焢,玒,玜,硔,硡,竑,竤,篊,粠,紅,紘,紭,綋,红,纮,翃,翝,耾,苰,荭,葒,葓,蕻,薨,虹,訇,訌,讧,谹,谼,谾,軣,輷,轟,轰,鈜,鉷,銾,鋐,鍧,閎,閧,闀,闂,闳,霐,霟,鞃,鬨,魟,鴻,鸿,黉,黌,㖓,㢬,㬴,㶹,䀧,䂫,䃔,䆖,䉺,䍔,䜫,䞑,䡌,䡏,䧆,䨎,䩑,䪦,䫹,䫺,䲨|tong:仝,佟,僮,勭,同,哃,嗵,囲,峂,庝,彤,恸,慟,憅,捅,晍,曈,朣,桐,桶,樋,橦,氃,浵,潼,炵,烔,熥,犝,狪,獞,痌,痛,眮,瞳,砼,秱,穜,童,筒,筩,粡,絧,統,綂,统,膧,茼,蓪,蚒,衕,赨,通,酮,鉖,鉵,銅,铜,餇,鮦,鲖,㛚,㠉,㠽,㣚,㣠,㤏,㪌,㮔,㸗,㼧,㼿,䂈,䆚,䆹,䮵,䳋,䴀,䶱|dai:代,侢,傣,叇,呆,呔,垈,埭,岱,帒,带,帯,帶,廗,待,怠,懛,戴,曃,柋,歹,殆,汏,瀻,獃,玳,瑇,甙,簤,紿,緿,绐,艜,蚮,袋,襶,貸,贷,蹛,軑,軚,軩,轪,迨,逮,霴,靆,鮘,鴏,黛,黱,㐲,㞭,㫹,㯂,㶡,㻖,㿃,䈆,䒫,䚞,䚟|ling:令,伶,凌,刢,另,呤,囹,坽,夌,姈,婈,孁,岭,岺,崚,嶺,彾,掕,昤,朎,柃,棂,櫺,欞,泠,淩,澪,瀮,灵,炩,燯,爧,狑,玲,琌,瓴,皊,砱,祾,秢,竛,笭,紷,綾,绫,羚,翎,聆,舲,苓,菱,蓤,蔆,蕶,蘦,蛉,衑,袊,裬,詅,跉,軨,輘,酃,醽,鈴,錂,铃,閝,阾,陵,零,霊,霗,霛,霝,靈,領,领,駖,魿,鯪,鲮,鴒,鸰,鹷,麢,齡,齢,龄,龗,㖫,㡵,㥄,㦭,㪮,㬡,㯪,㱥,㲆,㸳,㻏,㾉,䄥,䈊,䉁,䉖,䉹,䌢,䍅,䔖,䕘,䖅,䙥,䚖,䠲,䡼,䡿,䧙,䨩,䯍,䰱,䴇,䴒,䴫|chao:仦,仯,吵,嘲,巐,巢,巣,弨,怊,抄,晁,朝,樔,欩,漅,潮,炒,焯,煼,牊,眧,窲,繛,罺,耖,觘,訬,謿,超,轈,鄛,鈔,钞,麨,鼂,鼌,㶤,㷅,䄻,䎐,䏚,䬤,䰫|chang:仧,伥,倀,倡,偿,僘,償,兏,厂,厰,唱,嘗,嚐,场,場,塲,娼,嫦,尝,常,廠,徜,怅,悵,惝,敞,昌,昶,晿,暢,椙,氅,淐,猖,玚,琩,瑒,瑺,瓺,甞,畅,畼,肠,腸,膓,苌,菖,萇,蟐,裮,誯,鋹,鋿,錩,鏛,锠,長,镸,长,閶,阊,韔,鬯,鯧,鱨,鲳,鲿,鼚,㙊,㦂,㫤,䕋,䗅,䠀,䠆,䩨,䯴|sa:仨,卅,摋,撒,栍,桬,櫒,洒,潵,灑,脎,萨,薩,訯,鈒,钑,隡,靸,颯,飒,馺,㒎,㪪,㳐,㽂,䊛,䘮,䙣,䬃|men:们,們,悶,懑,懣,扪,捫,暪,椚,焖,燜,玣,璊,穈,菛,虋,鍆,钔,門,閅,门,闷,㡈,㥃,㦖,㨺,㱪,㵍,䊟,䝧,䫒|fan:仮,凡,凢,凣,勫,匥,反,噃,墦,奿,嬎,嬏,嬔,帆,幡,忛,憣,払,旙,旛,杋,柉,梵,棥,樊,橎,氾,汎,泛,滼,瀪,瀿,烦,煩,燔,犯,犿,璠,畈,番,盕,矾,礬,笲,笵,範,籓,籵,緐,繁,繙,羳,翻,膰,舤,舧,范,蕃,薠,藩,蘩,蠜,襎,訉,販,贩,蹯,軓,軬,轓,辺,返,釩,鐇,钒,颿,飜,飯,飰,饭,鱕,鷭,㕨,㝃,㠶,㤆,㴀,㶗,㸋,㺕,㼝,㽹,䀀,䀟,䉊,䉒,䊩,䋣,䋦,䌓,䐪,䒠,䒦,䛀,䡊,䣲,䪛,䪤,䫶,䭵,䮳|yang:仰,佒,佯,傟,养,劷,卬,咉,坱,垟,央,奍,姎,岟,崵,崸,徉,怏,恙,慃,懩,扬,抰,揚,攁,敭,旸,昜,暘,杨,柍,样,楊,楧,様,樣,殃,氜,氧,氱,泱,洋,漾,瀁,炀,炴,烊,煬,珜,疡,痒,瘍,癢,眏,眻,礢,禓,秧,紻,羊,羏,羕,羪,胦,蛘,詇,諹,軮,輰,鉠,鍈,鍚,鐊,钖,阦,阳,陽,雵,霷,鞅,颺,飏,養,駚,鰑,鴦,鴹,鸉,鸯,㔦,㟅,㨾,㬕,㺊,㿮,䁑,䇦,䑆,䒋,䖹,䬗,䬬,䬺,䭐,䵮|wo:仴,倭,偓,卧,唩,喔,婐,婑,媉,幄,我,挝,捰,捾,握,撾,斡,楃,沃,涡,涹,渥,渦,濣,焥,猧,瓁,瞃,硪,窝,窩,肟,腛,臒,臥,莴,萵,蜗,蝸,踒,齷,龌,㠛,㦱,㧴,㱧,䁊,䠎,䰀|jian:件,侟,俭,俴,倹,健,僭,儉,兼,冿,减,剑,剣,剪,剱,劍,劎,劒,劔,囏,囝,坚,堅,墹,奸,姦,姧,寋,尖,帴,幵,建,弿,彅,徤,惤,戋,戔,戩,戬,拣,挸,捡,揀,揃,搛,撿,擶,旔,暕,枧,柬,栫,梘,检,検,椷,椾,楗,榗,槛,樫,橺,檢,檻,櫼,歼,殱,殲,毽,洊,涧,渐,減,湔,湕,溅,漸,澗,濺,瀐,瀳,瀸,瀽,煎,熞,熸,牋,牮,犍,猏,玪,珔,瑊,瑐,监,監,睑,睷,瞯,瞷,瞼,硷,碊,碱,磵,礀,礆,礛,笕,笺,筧,简,箋,箭,篯,簡,籛,糋,絸,緘,縑,繝,繭,缄,缣,翦,聻,肩,腱,臶,舰,艦,艰,艱,茧,荐,菅,菺,葌,葏,葥,蒹,蕑,蕳,薦,藆,虃,螹,蠒,袸,裥,襇,襉,襺,見,覵,覸,见,詃,諓,諫,謇,謭,譼,譾,谏,谫,豜,豣,賎,賤,贱,趝,趼,跈,践,踐,踺,蹇,轞,釼,鉴,鋻,鍳,鍵,鏩,鐗,鐧,鑑,鑒,鑬,鑯,鑳,锏,键,閒,間,间,靬,鞬,鞯,韀,韉,餞,餰,饯,馢,鬋,鰎,鰔,鰜,鰹,鲣,鳒,鳽,鵳,鶼,鹣,鹸,鹻,鹼,麉,㓺,㔋,㔓,㣤,㦗,㨴,㨵,㯺,㰄,㳨,㶕,㺝,䄯,䅐,䇟,䉍,䛳,䟅,䟰,䤔,䥜,䧖,䩆,䬻,䭈,䭕,䭠,䮿,䯛,䯡,䵖,䵛,䵡,䵤,䶠|jia:价,佳,假,傢,價,加,叚,唊,嗧,嘉,圿,埉,夹,夾,婽,嫁,宊,家,岬,幏,徦,恝,戛,戞,扴,抸,拁,斚,斝,架,枷,梜,椵,榎,榢,槚,檟,毠,泇,浃,浹,犌,猳,玾,珈,甲,痂,瘕,稼,笳,糘,耞,胛,脥,腵,荚,莢,葭,蛱,蛺,袈,袷,裌,豭,貑,賈,贾,跏,跲,迦,郏,郟,鉀,鉫,鋏,鎵,钾,铗,镓,頬,頰,颊,餄,駕,驾,鴶,鵊,麚,㕅,㪴,㮖,㼪,㿓,䀫,䁍,䑝,䕛,䛟,䩡|yao:仸,倄,偠,傜,吆,咬,喓,嗂,垚,堯,夭,妖,姚,婹,媱,宎,尧,尭,岆,峣,崾,嶢,嶤,幺,徭,徺,愮,抭,揺,搖,摇,摿,暚,曜,曣,杳,枖,柼,楆,榚,榣,殀,殽,溔,烑,熎,燿,爻,狕,猺,獟,珧,瑤,瑶,眑,矅,磘,祅,穾,窅,窈,窑,窔,窯,窰,筄,繇,纅,耀,肴,腰,舀,艞,苭,药,葯,葽,蓔,薬,藥,蘨,袎,要,覞,訞,詏,謠,謡,讑,谣,軺,轺,遙,遥,邀,銚,鎐,鑰,闄,靿,顤,颻,飖,餆,餚,騕,鰩,鳐,鴁,鴢,鷂,鷕,鹞,鼼,齩,㔽,㝔,㞁,㟱,㢓,㨱,㫏,㫐,㮁,㴭,㵸,㿑,㿢,䁏,䁘,䂚,䆙,䆞,䉰,䋂,䋤,䌊,䌛,䍃,䑬,䔄,䖴,䙅,䚺,䚻,䢣,䬙,䴠,䶧|fen:份,偾,僨,分,吩,坆,坋,坟,墳,奋,奮,妢,岎,帉,幩,弅,忿,愤,憤,昐,朆,枌,梤,棻,棼,橨,氛,汾,瀵,炃,焚,燌,燓,玢,瞓,秎,竕,粉,粪,糞,紛,纷,羒,羵,翂,肦,膹,芬,蒶,蕡,蚠,蚡,衯,訜,豮,豶,躮,轒,酚,鈖,鐼,隫,雰,餴,饙,馚,馩,魵,鱝,鲼,鳻,黂,黺,鼖,鼢,㖹,㥹,㮥,㷊,㸮,㿎,䩿,䯨,䴅|di:仾,低,俤,偙,僀,厎,呧,唙,啇,啲,嘀,嚁,地,坔,坻,埊,埞,堤,墑,墬,奃,娣,媂,嫡,嶳,帝,底,廸,弚,弟,弤,彽,怟,慸,抵,拞,掋,摕,敌,敵,旳,杕,枤,柢,梊,梑,棣,氐,涤,滌,滴,焍,牴,狄,玓,甋,眱,睇,砥,碲,磾,祶,禘,笛,第,篴,籴,糴,締,缔,羝,翟,聜,肑,腣,苐,苖,荻,菂,菧,蒂,蔋,蔐,蔕,藡,蝃,螮,袛,覿,觌,觝,詆,諦,诋,谛,豴,趆,踶,軧,迪,递,逓,遞,遰,邸,釱,鉪,鍉,鏑,镝,阺,隄,靮,鞮,頔,馰,骶,髢,魡,鯳,鸐,㡳,㢩,㣙,㦅,㪆,㭽,㰅,㹍,㼵,䀸,䀿,䂡,䊮,䍕,䏑,䑭,䑯,䞶,䟡,䢑,䣌,䧝,䨀,䨤,䩘,䩚,䮤,䯼,䱃,䱱,䴞,䵠,䶍|fang:仿,倣,匚,坊,埅,堏,妨,彷,房,放,方,旊,昉,昘,枋,淓,牥,瓬,眆,紡,纺,肪,舫,芳,蚄,訪,访,趽,邡,鈁,錺,钫,防,髣,魴,鲂,鴋,鶭,㑂,㕫,㤃,㧍,㯐,䢍,䦈,䲱|pei:伂,佩,俖,呸,培,姵,嶏,帔,怌,斾,旆,柸,毰,沛,浿,珮,笩,肧,胚,蓜,衃,裴,裵,賠,赔,轡,辔,配,醅,錇,锫,阫,陪,陫,霈,馷,㟝,㤄,㧩,㫲,㳈,䊃,䣙,䪹,䫠,䲹|diao:伄,凋,刁,刟,叼,吊,奝,屌,弔,弴,彫,扚,掉,殦,汈,琱,瘹,瞗,碉,窎,窵,竨,簓,蓧,藋,虭,蛁,訋,調,调,貂,釣,鈟,銱,鋽,鑃,钓,铞,雕,雿,鮉,鯛,鲷,鳭,鵰,鼦,㒛,㪕,㹿,䂪,䂽,䉆,䔙,䠼,䵲|dun:伅,吨,噸,囤,墩,墪,壿,庉,惇,憞,撉,撴,敦,橔,沌,潡,炖,燉,犜,獤,盹,盾,砘,碷,礅,腞,蜳,趸,踲,蹲,蹾,躉,逇,遁,遯,鈍,钝,頓,顿,驐,㬿,䤜|xin:伈,伩,信,俽,噷,噺,囟,妡,嬜,孞,廞,心,忄,忻,惞,新,昕,杺,枔,欣,歆,潃,炘,焮,盺,脪,舋,芯,莘,薪,衅,訢,訫,軐,辛,邤,釁,鈊,鋅,鐔,鑫,锌,阠,顖,馨,馫,馸,鬵,㐰,㚯,㛛,㭄,䒖,䚱,䛨,䜗,䜣,䰼|ai:伌,僾,凒,叆,哀,哎,唉,啀,嗌,嗳,嘊,噯,埃,塧,壒,娾,嫒,嬡,嵦,愛,懓,懝,挨,捱,敱,敳,昹,暧,曖,欸,毐,溰,溾,濭,爱,瑷,璦,癌,皑,皚,皧,瞹,矮,砹,硋,碍,礙,艾,蔼,薆,藹,譪,譺,賹,躷,鎄,鑀,锿,隘,霭,靄,靉,餲,馤,鱫,鴱,㑸,㕌,㗒,㗨,㘷,㝶,㢊,㤅,㱯,㿄,䀳,䅬,䑂,䔽,䝽,䠹,䨠,䬵,䶣|xiu:休,俢,修,咻,嗅,岫,庥,朽,樇,溴,滫,烋,烌,珛,琇,璓,秀,糔,綇,綉,繍,繡,绣,羞,脙,脩,臹,苬,螑,袖,裦,褎,褏,貅,銝,銹,鎀,鏅,鏥,鏽,锈,飍,饈,馐,髤,髹,鮴,鵂,鸺,齅,㗜,㱙,㾋|nu:伖,伮,傉,努,奴,孥,弩,怒,搙,砮,笯,胬,駑,驽,㚢,䢞|huo:伙,佸,俰,剨,劐,吙,咟,嗀,嚄,嚯,嚿,夥,夻,奯,惑,或,捇,掝,擭,攉,旤,曤,檴,沎,活,湱,漷,濩,瀖,火,獲,癨,眓,矆,矐,祸,禍,秮,秳,穫,耠,耯,臛,艧,获,蒦,藿,蠖,謋,豁,貨,货,邩,鈥,鍃,鑊,钬,锪,镬,閄,雘,霍,靃,騞,㗲,㘞,㦜,㦯,㨯,㯉,㸌,䁨,䂄,䄀,䄆,䄑,䉟,䋭,䣶,䦚,䯏,䰥|hui:会,佪,僡,儶,匯,卉,咴,哕,喙,嘒,噅,噕,噦,嚖,囘,回,囬,圚,婎,媈,孈,寭,屷,幑,廻,廽,彗,彙,彚,徻,徽,恚,恛,恢,恵,悔,惠,慧,憓,懳,拻,挥,揮,撝,晖,晦,暉,暳,會,桧,楎,槥,橞,檅,檓,檜,櫘,毀,毁,毇,汇,泋,洃,洄,浍,湏,滙,潓,澮,瀈,灰,灳,烠,烣,烩,烪,煇,燬,燴,獩,珲,琿,璤,璯,痐,瘣,睳,瞺,禈,秽,穢,篲,絵,繢,繪,绘,缋,翙,翚,翬,翽,芔,茴,荟,蔧,蕙,薈,薉,藱,虺,蚘,蛔,蛕,蜖,螝,蟪,袆,褘,詯,詼,誨,諱,譓,譭,譮,譿,讳,诙,诲,豗,賄,贿,輝,辉,迴,逥,鏸,鐬,闠,阓,隓,隳,靧,韢,頮,顪,餯,鮰,鰴,麾,㑰,㑹,㒑,㜇,㞧,㤬,㥣,㨤,㨹,㩓,㩨,㬩,㰥,㱱,㷄,㷐,㻅,䂕,䃣,䅏,䇻,䌇,䏨,䕇,䙌,䙡,䛛,䛼,䜋,䤧,䧥,䩈,䫭|che:伡,俥,偖,勶,唓,坼,奲,屮,彻,徹,扯,掣,撤,撦,澈,烢,烲,爡,瞮,砗,硨,硩,聅,莗,蛼,車,车,迠,頙,㔭,㥉,㨋,㬚,㯙,㱌,㵃,㵔,㾝,㿭,䁤,䋲,䑲,䒆,䚢,䛸,䜠,䞣,䧪,䨁,䰩|xun:伨,侚,偱,勋,勛,勲,勳,卂,噀,噚,嚑,坃,埙,塤,壎,壦,奞,寻,尋,峋,巡,巽,廵,徇,循,恂,愻,揗,攳,旬,曛,杊,栒,桪,樳,殉,殾,毥,汛,洵,浔,潯,灥,焄,熏,燂,燅,燖,燻,爋,狥,獯,珣,璕,矄,窨,紃,纁,臐,荀,蔒,蕈,薫,薰,蘍,蟳,襑,訊,訓,訙,詢,训,讯,询,賐,迅,迿,逊,遜,鄩,醺,鑂,顨,馴,駨,驯,鱏,鱘,鲟,㜄,㝁,㢲,㨚,㰊,㰬,㽦,䋸,䑕,䖲,䙉,䛜,䞊,䭀|gu:估,傦,僱,凅,古,咕,唂,唃,啒,嘏,固,堌,夃,姑,嫴,孤,尳,峠,崓,崮,怘,愲,扢,故,柧,梏,棝,榖,榾,橭,毂,汩,沽,泒,淈,濲,瀔,焸,牯,牿,痼,皷,盬,瞽,硲,祻,稒,穀,笟,箍,箛,篐,糓,縎,罛,罟,羖,股,脵,臌,菇,菰,蓇,薣,蛄,蛊,蛌,蠱,觚,詁,诂,谷,軱,軲,轂,轱,辜,逧,酤,鈲,鈷,錮,钴,锢,雇,頋,顧,顾,餶,馉,骨,鮕,鯝,鲴,鴣,鵠,鶻,鸪,鹄,鹘,鼓,鼔,㒴,㚉,㧽,㯏,㼋,㽽,㾶,䀇,䀜,䀦,䀰,䅽,䊺,䍍,䍛,䐨,䓢,䜼,䡩,䮩,䵻,䶜|ni:伱,伲,你,倪,儗,儞,匿,坭,埿,堄,妮,婗,嫟,嬺,孴,尼,屔,屰,怩,惄,愵,抳,拟,掜,擬,旎,昵,晲,暱,柅,棿,檷,氼,泥,淣,溺,狔,猊,痆,眤,睨,秜,籾,縌,胒,腻,膩,臡,苨,薿,蚭,蜺,觬,貎,跜,輗,迡,逆,郳,鈮,鉨,鑈,铌,隬,霓,馜,鯢,鲵,麑,齯,㞾,㠜,㣇,㥾,㦐,㪒,㲻,㵫,㹸,䁥,䕥,䘌,䘦,䘽,䛏,䝚,䦵,䧇,䭲,䰯,䵑,䵒|ban:伴,办,半,坂,姅,岅,怑,扮,扳,拌,搬,攽,斑,斒,昄,朌,板,湴,版,班,瓣,瓪,瘢,癍,秚,粄,絆,绊,舨,般,蝂,螁,螌,褩,辦,辬,鈑,鉡,钣,闆,阪,靽,頒,颁,魬,㚘,㩯,㪵,㸞,㺜,䉽,䕰,䬳|xu:伵,侐,俆,偦,冔,勖,勗,卹,叙,呴,喣,嘘,噓,垿,墟,壻,姁,婿,媭,嬃,幁,序,徐,恤,慉,戌,揟,敍,敘,旭,旴,昫,暊,朂,栩,楈,槒,欨,欰,欻,歔,歘,殈,汿,沀,洫,湑,溆,漵,潊,烅,烼,煦,獝,珝,珬,畜,疞,盢,盨,盱,瞁,瞲,砉,稰,稸,窢,糈,絮,続,緒,緖,縃,續,绪,续,聟,胥,蒣,蓄,蓿,蕦,藇,藚,虗,虚,虛,蝑,訏,許,訹,詡,諝,譃,许,诩,谞,賉,鄦,酗,醑,銊,鑐,需,須,頊,须,顼,驉,鬚,魆,魖,鱮,㐨,㑔,㑯,㕛,㖅,㗵,㘧,㚜,㜅,㜿,㞊,㞰,㤢,㥠,㦽,㰲,㵰,㷦,㺷,㾥,䂆,䅡,䋶,䍱,䔓,䘏,䙒,䛙,䜡,䢕,䣱,䣴,䦗,䦽,䬔,䱛,䳳|zhou:伷,侜,僽,冑,周,呪,咒,咮,喌,噣,嚋,妯,婤,宙,州,帚,徟,昼,晝,晭,洀,洲,淍,炿,烐,珘,甃,疛,皱,皺,盩,睭,矪,碡,箒,籀,籒,籕,粙,粥,紂,縐,纣,绉,肘,胄,舟,荮,菷,葤,詋,謅,譸,诌,诪,賙,赒,軸,輈,輖,轴,辀,週,郮,酎,銂,霌,駎,駲,騆,驟,骤,鯞,鵃,鸼,㑇,㑳,㔌,㛩,㥮,㼙,㾭,䇠,䈙,䋓,䎻,䏲,䐍,䖞,䛆,䩜,䶇|shen:伸,侁,侺,兟,呻,哂,堔,妽,姺,娠,婶,嬸,审,宷,審,屾,峷,弞,愼,慎,扟,抌,昚,曋,柛,椮,椹,榊,氠,沈,涁,深,渖,渗,滲,瀋,燊,珅,甚,甡,甧,申,瘆,瘮,眒,眘,瞫,矤,矧,砷,神,祳,穼,籶,籸,紳,绅,罙,罧,肾,胂,脤,腎,葠,蓡,蔘,薓,蜃,裑,覾,訠,訷,詵,諗,讅,诜,谂,谉,身,邥,鉮,鋠,頣,駪,魫,鯓,鯵,鰰,鰺,鲹,鵢,㔤,㜤,㥲,㰂,㰮,㵊,㵕,㾕,䆦,䰠|qu:伹,佉,佢,刞,劬,匤,匷,区,區,厺,去,取,呿,坥,娶,屈,岖,岨,岴,嶇,忂,憈,戵,抾,敺,斪,曲,朐,朑,欋,氍,浀,淭,渠,灈,璖,璩,癯,磲,祛,竘,竬,筁,籧,粬,紶,絇,翑,翵,耝,胊,胠,臞,菃,葋,蕖,蘧,蛆,蛐,蝺,螶,蟝,蠷,蠼,衐,衢,袪,覰,覷,覻,觑,詓,詘,誳,诎,趋,趣,趨,躣,躯,軀,軥,迲,郥,鑺,閴,闃,阒,阹,駆,駈,驅,驱,髷,魼,鰸,鱋,鴝,鸜,鸲,麮,麯,麴,麹,黢,鼁,鼩,齲,龋,㖆,㜹,㠊,㣄,㧁,㫢,㯫,㰦,㲘,䀠,䁦,䂂,䋧,䒧,䝣,䞤,䟊,䠐,䵶,䶚|beng:伻,嘣,埄,埲,塴,奟,崩,嵭,泵,琣,琫,甏,甭,痭,祊,絣,綳,繃,绷,菶,跰,蹦,迸,逬,鏰,镚,閍,鞛,㑟,㱶,㷯,䋽,䙀,䨻,䩬,䭰,䳞|ga:伽,嘎,嘠,噶,尕,尜,尬,旮,玍,釓,錷,钆,魀|dian:佃,傎,典,厧,唸,坫,垫,墊,壂,奌,奠,婝,婰,嵮,巅,巓,巔,店,惦,扂,掂,攧,敁,敟,椣,槙,橂,殿,淀,滇,澱,点,玷,琔,电,甸,瘨,癜,癫,癲,碘,磹,簟,蒧,蕇,蜔,踮,蹎,鈿,钿,阽,電,靛,顚,顛,颠,驔,點,齻,㓠,㚲,㝪,㞟,㥆,㵤,㶘,㸃,㼭,䍄,䓦,䟍,䧃|han:佄,傼,兯,函,凾,厈,含,咁,哻,唅,喊,圅,垾,娢,嫨,寒,屽,崡,嵅,悍,憨,憾,扞,捍,撖,撼,旱,晗,晘,晥,暵,梒,汉,汗,浛,浫,涆,涵,淊,漢,澏,瀚,焊,焓,熯,爳,猂,琀,甝,皔,睅,筨,罕,翰,肣,莟,菡,蔊,蘫,虷,蚶,蛿,蜬,蜭,螒,譀,谽,豃,邗,邯,酣,釬,銲,鋎,鋡,閈,闬,雗,韓,韩,頇,頷,顄,顸,颔,馠,馯,駻,鬫,魽,鶾,鼾,㑵,㒈,㖤,㘎,㘕,㘚,㙈,㙔,㙳,㜦,㟏,㟔,㢨,㨔,㪋,㮀,㲦,㵄,㵎,㶰,㸁,㺖,㼨,㽉,㽳,䁔,䈄,䌍,䍐,䍑,䎯,䏷,䐄,䓍,䓿,䕿,䖔,䗙,䘶,䛞,䤴,䥁,䧲,䨡,䫲,䮧,䶃|bi:佊,佖,俾,偪,匂,匕,吡,哔,啚,嗶,坒,堛,壁,夶,奰,妣,妼,婢,嬖,嬶,屄,币,幣,幤,庇,庳,廦,弊,弻,弼,彃,彼,必,怭,愊,愎,敝,斃,朼,枈,柀,柲,梐,楅,比,毕,毖,毙,毴,沘,湢,滗,滭,潷,濞,煏,熚,狴,獘,獙,珌,璧,畀,畁,畢,疕,疪,痹,痺,皀,皕,碧,禆,秕,稫,笔,筆,筚,箅,箆,篦,篳,粃,粊,綼,縪,繴,罼,聛,胇,腷,臂,舭,苾,荜,荸,萆,萞,蓖,蓽,蔽,薜,蜌,螕,袐,裨,襅,襞,襣,觱,詖,诐,豍,貏,貱,贔,赑,跸,蹕,躃,躄,辟,逼,避,邲,鄙,鄨,鄪,鉍,鎞,鏎,鐴,铋,閇,閉,閟,闭,陛,鞞,鞸,韠,飶,饆,馝,駜,驆,髀,髲,魓,鮅,鰏,鲾,鵖,鷝,鷩,鼊,鼻,㓖,㗉,㘠,㘩,㙄,㚰,㠲,㡀,㡙,㢰,㢶,㢸,㧙,㪏,㪤,㮰,㮿,㯇,㱸,㳼,㵥,㵨,㹃,㻫,㻶,㿫,䀣,䁹,䃾,䄶,䇷,䊧,䋔,䌟,䎵,䏢,䏶,䕗,䖩,䘡,䟆,䟤,䠋,䣥,䦘,䧗,䨆,䩛,䪐,䫁,䫾,䭮,䮡,䯗,䵄|zhao:佋,兆,召,啁,垗,妱,巶,找,招,旐,昭,曌,枛,棹,櫂,沼,炤,照,燳,爫,狣,瑵,盄,瞾,窼,笊,箌,罀,罩,羄,肁,肇,肈,詔,诏,赵,趙,釗,鉊,鍣,钊,駋,鮡,㕚,㡽,㨄,㷖,㺐,䃍,䈃,䈇,䍜,䍮,䝖,䮓|ci:佌,佽,偨,刺,刾,呲,嗭,垐,堲,嬨,庛,慈,朿,柌,栨,次,此,泚,濨,玼,珁,瓷,甆,疵,皉,磁,礠,祠,糍,絘,縒,茈,茦,茨,莿,薋,蛓,螆,蠀,詞,词,賜,赐,趀,跐,辝,辞,辤,辭,鈶,雌,飺,餈,骴,鴜,鶿,鷀,鹚,㓨,㘂,㘹,㞖,㠿,㡹,㢀,㤵,㩞,㹂,䂣,䆅,䈘,䓧,䖪,䗹,䛐,䦻,䧳,䨏,䭣,䯸,䰍,䲿,䳄,䳐|zuo:佐,作,侳,做,咗,唑,坐,岝,岞,左,座,怍,捽,昨,柞,椊,祚,秨,稓,筰,糳,繓,胙,莋,葃,葄,蓙,袏,鈼,阼,飵,㑅,㘀,㘴,㛗,㝾,㭮,㸲,䋏,䎰,䔘,䝫,䞰|ti:体,倜,偍,剃,剔,厗,啼,嗁,嚏,嚔,媞,屉,屜,崹,徲,悌,悐,惕,惖,惿,戻,挮,掦,提,揥,替,梯,楴,歒,殢,洟,涕,渧,漽,珶,瑅,瓋,碮,稊,籊,綈,緹,绨,缇,罤,蕛,薙,蝭,裼,褅,謕,趧,趯,踢,蹄,蹏,躰,軆,逖,逷,遆,醍,銻,鍗,鐟,锑,題,题,騠,骵,體,髰,鬀,鬄,鮷,鯷,鳀,鴺,鵜,鶗,鶙,鷈,鷉,鹈,㖒,㗣,㡗,㣢,㬱,㯩,䅠,䌡,䎮,䔶,䙗,䚣,䛱,䝰,䣡,䣽,䧅,䨑,䪆,䬾,䯜,䴘,䶏,䶑|zhan:佔,偡,占,噡,嫸,展,崭,嶃,嶄,嶘,嶦,惉,战,戦,戰,拃,搌,斩,斬,旃,旜,栈,栴,桟,棧,榐,橏,毡,氈,氊,沾,湛,澶,琖,皽,盏,盞,瞻,站,粘,綻,绽,菚,薝,蘸,虥,虦,蛅,覱,詀,詹,譫,讝,谵,趈,蹍,輚,輾,轏,辗,邅,醆,閚,霑,颭,飐,飦,饘,驏,驙,骣,魙,鱣,鳣,鸇,鹯,黵,㞡,㟞,㠭,㣶,㺘,㻵,䁴,䋎,䎒,䗃,䘺,䟋,䡀,䩅,䪌,䱠,䱼|he:何,佫,劾,合,呵,咊,和,哬,啝,喝,嗃,嗬,垎,壑,姀,寉,峆,惒,抲,敆,曷,柇,核,楁,欱,毼,河,涸,渮,湼,澕,焃,煂,熆,熇,燺,爀,狢,癋,皬,盇,盉,盍,盒,碋,礉,禾,秴,篕,籺,粭,翮,翯,荷,菏,萂,蚵,螛,蠚,袔,褐,覈,訶,訸,詥,诃,貈,貉,賀,贺,赫,郃,鉌,鑉,閡,闔,阂,阖,隺,靍,靎,靏,鞨,頜,颌,饸,魺,鲄,鶡,鶴,鸖,鹖,鹤,麧,齃,齕,龁,龢,㓭,㔠,㕡,㕰,㥺,㦦,㪉,㬞,㭘,㭱,㮝,㮫,㵑,㷎,㷤,㹇,㿣,䃒,䅂,䎋,䒩,䓼,䕣,䚂,䞦,䢗,䪚,䫘,䳚,䳽,䴳,䵱,䶅|she:佘,厍,厙,奢,射,弽,慑,慴,懾,捨,摂,摄,摵,攝,檨,欇,涉,涻,渉,滠,灄,猞,畲,社,舌,舍,舎,蔎,虵,蛇,蛥,蠂,設,设,賒,賖,赊,赦,輋,韘,騇,麝,㒤,㢵,㭙,㰒,㴇,䀅,䁋,䁯,䂠,䄕,䌰,䞌,䠶,䤮,䬷,䵥|gou:佝,冓,勾,坸,垢,够,夠,姤,媾,岣,彀,搆,撀,构,枸,構,沟,溝,煹,狗,玽,笱,篝,簼,緱,缑,耇,耈,耉,苟,茩,蚼,袧,褠,覯,觏,訽,詬,诟,豿,購,购,遘,鈎,鉤,钩,雊,鞲,韝,㗕,㜌,㝅,㝤,㨌,㳶,㺃,䃓,䝭,䞀|ning:佞,侫,儜,凝,咛,嚀,嬣,宁,寍,寕,寗,寜,寧,拧,擰,柠,橣,檸,泞,澝,濘,狞,獰,甯,矃,聍,聹,薴,鑏,鬡,鸋,㝕,㣷,㲰,㿦,䔭,䗿,䭢|yong:佣,俑,傛,傭,勇,勈,咏,喁,嗈,噰,埇,塎,墉,壅,嫞,嵱,庸,廱,彮,怺,恿,悀,惥,愑,愹,慂,慵,拥,擁,柡,栐,槦,永,泳,涌,湧,滽,澭,灉,牅,用,甬,痈,癕,癰,砽,硧,禜,臃,苚,蛹,詠,踊,踴,邕,郺,鄘,醟,銿,鏞,镛,雍,雝,顒,颙,饔,鯒,鰫,鱅,鲬,鳙,鷛,㐯,㙲,㝘,㞲,㦷,㶲,㷏,㽫,䗤,䞻|wa:佤,劸,咓,哇,啘,嗗,嗢,娃,娲,媧,屲,徍,挖,搲,攨,洼,溛,漥,瓦,瓲,畖,砙,窊,窪,聉,腽,膃,蛙,袜,襪,邷,韈,韤,鼃,㧚,㰪,㼘,䎳,䚴,䠚|ka:佧,卡,咔,咖,咯,喀,垰,胩,裃,鉲|bao:佨,保,儤,剝,剥,勹,勽,包,堡,堢,報,媬,嫑,孢,宝,寚,寳,寶,忁,怉,报,抱,暴,曓,煲,爆,珤,窇,笣,緥,胞,苞,菢,萡,葆,蕔,薄,藵,虣,袌,褒,褓,襃,豹,賲,趵,鉋,鑤,铇,闁,雹,靌,靤,飹,飽,饱,駂,骲,髱,鮑,鲍,鳵,鴇,鸨,齙,龅,㙅,㙸,㫧,㲏,㲒,㵡,㻄,㿺,䈏,䎂,䤖,䥤,䨌,䨔,䪨,䭋,䳈,䳰,䴐|lao:佬,僗,劳,労,勞,咾,哰,唠,嗠,嘮,姥,嫪,崂,嶗,恅,憥,憦,捞,撈,朥,栳,橑,橯,浶,涝,澇,烙,牢,狫,珯,痨,癆,硓,磱,窂,簩,粩,老,耂,耢,耮,荖,蛯,蟧,軂,轑,酪,醪,銠,鐒,铑,铹,顟,髝,鮱,㗦,㞠,㟉,㟙,㟹,㧯,㨓,䃕,䇭,䕩,䜎,䝁,䝤,䲏,䳓,䵏|bai:佰,兡,呗,唄,庍,拜,拝,挀,捭,掰,摆,擺,敗,柏,栢,猈,瓸,白,百,稗,竡,粨,粺,絔,薭,襬,贁,败,鞁,韛,㗑,㗗,㠔,㼟,㼣,㿟,䒔,䙓,䢙,䳆,䴽|ming:佲,冥,凕,名,命,姳,嫇,慏,掵,明,暝,朙,榠,洺,溟,猽,眀,眳,瞑,茗,蓂,螟,覭,詺,鄍,酩,銘,铭,鳴,鸣,㝠,㟰,㫥,䄙,䆨,䆩,䊅,䒌,䫤|hen:佷,很,恨,拫,狠,痕,詪,鞎,㯊,䓳|quan:佺,全,券,劝,勧,勸,啳,圈,圏,埢,姾,婘,孉,峑,巏,巻,恮,悛,惓,拳,搼,权,棬,椦,楾,権,權,汱,泉,洤,湶,烇,牶,牷,犈,犬,犭,瑔,甽,畎,痊,硂,筌,絟,綣,縓,绻,腃,荃,葲,虇,蜷,蠸,觠,詮,诠,跧,踡,輇,辁,醛,銓,鐉,铨,闎,韏,顴,颧,駩,騡,鬈,鰁,鳈,齤,㒰,㟨,㟫,䀬,䄐,䊎,䑏,䟒,䠰|tiao:佻,嬥,宨,岧,岹,庣,恌,挑,旫,晀,朓,条,條,樤,眺,祒,祧,窕,窱,笤,粜,糶,絩,聎,脁,芀,蓚,蓨,蜩,螩,覜,誂,趒,跳,迢,鋚,鎥,铫,鞗,頫,髫,鯈,鰷,鲦,齠,龆,㑿,㟘,㸠,䎄,䒒,䖺,䟭,䠷,䩦,䯾,䱔,䳂|xing:侀,倖,兴,刑,哘,型,垶,塂,姓,娙,婞,嬹,幸,形,性,悻,惺,擤,星,曐,杏,洐,涬,煋,狌,猩,瑆,皨,睲,硎,箵,篂,緈,腥,臖,興,荇,莕,蛵,行,裄,觪,觲,謃,邢,郉,醒,鈃,鉶,銒,鋞,钘,铏,陉,陘,騂,骍,鮏,鯹,㐩,㓑,㓝,㝭,㣜,㨘,㮐,㼛,㼬,䁄,䂔,䓷,䛭,䣆,䤯,䰢,䳙|kan:侃,偘,冚,刊,勘,坎,埳,堪,堿,塪,墈,崁,嵁,惂,戡,栞,欿,歁,看,瞰,矙,砍,磡,竷,莰,衎,輡,轁,轗,闞,阚,顑,龕,龛,㸝,䀍,䘓,䶫|lai:來,俫,倈,唻,婡,崃,崍,庲,徕,徠,来,梾,棶,涞,淶,濑,瀨,瀬,猍,琜,癞,癩,睐,睞,筙,箂,籁,籟,莱,萊,藾,襰,賚,賴,赉,赖,逨,郲,錸,铼,頼,顂,騋,鯠,鵣,鶆,麳,㚓,㠣,㥎,㾢,䂾,䄤,䅘,䋱,䓶,䚅,䠭,䧒,䲚|chi:侈,侙,俿,傺,勅,匙,卶,叱,叺,吃,呎,哧,啻,喫,嗤,噄,坘,垑,墀,妛,媸,尺,岻,弛,彨,彲,彳,恜,恥,慗,憏,懘,抶,拸,持,摛,攡,敕,斥,杘,欼,歭,歯,池,泜,淔,湁,漦,灻,炽,烾,熾,瓻,痓,痴,痸,瘛,癡,眵,瞝,竾,笞,筂,篪,粚,糦,絺,翄,翅,翤,翨,耛,耻,肔,胣,胵,腟,茌,荎,蚇,蚩,蚳,螭,袲,袳,裭,褫,訵,誺,謘,豉,貾,赤,赿,趍,趩,跮,踟,迟,迣,遅,遟,遫,遲,鉓,鉹,銐,雴,飭,饎,饬,馳,驰,魑,鴟,鵄,鶒,鷘,鸱,麶,黐,齒,齝,齿,㒆,㓼,㓾,㔑,㘜,㙜,㞴,㞿,㟂,㡿,㢁,㢋,㢮,㮛,㱀,㳏,㶴,㽚,䆍,䇼,䈕,䊼,䐤,䑛,䔟,䗖,䙙,䛂,䜄,䜵,䜻,䞾,䟷,䠠,䤲,䪧,䮈,䮻,䰡,䳵,䶔,䶵|kua:侉,咵,垮,夸,姱,挎,晇,胯,舿,誇,跨,銙,骻,㐄,䋀|guang:侊,俇,僙,光,咣,垙,姯,广,広,廣,撗,桄,欟,洸,灮,炗,炚,炛,烡,犷,獷,珖,硄,胱,臦,臩,茪,輄,逛,銧,黆,㫛|mi:侎,冖,冞,冪,咪,嘧,塓,孊,宓,宻,密,峚,幂,幎,幦,弥,弭,彌,戂,擟,攠,敉,榓,樒,櫁,汨,沕,沵,泌,洣,淧,渳,滵,漞,濔,濗,瀰,灖,熐,爢,猕,獼,瓕,眫,眯,瞇,祕,祢,禰,秘,簚,米,粎,糜,糸,縻,羃,羋,脒,芈,葞,蒾,蔝,蔤,藌,蘼,蜜,蝆,袮,覓,覔,覛,觅,詸,謎,謐,谜,谧,踎,迷,醚,醾,醿,釄,銤,镾,靡,鸍,麊,麋,麛,鼏,㜆,㜷,㝥,㟜,㠧,㣆,㥝,㨠,㩢,㫘,㰽,㳴,㳽,㴵,㵋,㸏,㸓,䁇,䉾,䊳,䋛,䌏,䌐,䌕,䌘,䌩,䍘,䕳,䕷,䖑,䛉,䛑,䛧,䣾,䤉,䤍,䥸,䪾,䭧,䭩,䱊,䴢|an:侒,俺,儑,唵,啽,垵,埯,堓,婩,媕,安,岸,峖,庵,按,揞,晻,暗,案,桉,氨,洝,犴,玵,痷,盦,盫,罯,胺,腤,荌,菴,萻,葊,蓭,誝,諳,谙,豻,貋,銨,錌,铵,闇,隌,雸,鞌,鞍,韽,馣,鮟,鵪,鶕,鹌,黯,㜝,㟁,㱘,㸩,㽢,䁆,䅁,䅖,䎏,䎨,䜙,䬓,䮗,䯥|lu:侓,僇,剹,勎,勠,卢,卤,噜,嚕,嚧,圥,坴,垆,塶,塷,壚,娽,峍,庐,廘,廬,彔,录,戮,挔,捛,掳,摝,撸,擄,擼,攎,枦,栌,椂,樐,樚,橹,櫓,櫨,氇,氌,泸,淕,淥,渌,滷,漉,潞,澛,濾,瀂,瀘,炉,熝,爐,獹,玈,琭,璐,璷,瓐,甪,盝,盧,睩,矑,硉,硵,碌,磠,祿,禄,稑,穋,箓,簏,簬,簵,簶,籙,籚,粶,纑,罏,胪,膔,膟,臚,舮,舻,艣,艪,艫,芦,菉,蓾,蔍,蕗,蘆,虂,虏,虜,螰,蠦,觮,觻,賂,赂,趢,路,踛,蹗,輅,轆,轤,轳,辂,辘,逯,醁,鈩,錄,録,錴,鏀,鏕,鏴,鐪,鑥,鑪,镥,陆,陸,露,顱,颅,騄,騼,髗,魯,魲,鯥,鱸,鲁,鲈,鴼,鵦,鵱,鷺,鸕,鸬,鹭,鹵,鹿,麓,黸,㓐,㔪,㖨,㛬,㜙,㟤,㠠,㢚,㢳,㦇,㪐,㪖,㪭,㫽,㭔,㯝,㯟,㯭,㱺,㼾,㿖,䃙,䌒,䎑,䎼,䐂,䕡,䘵,䚄,䟿,䡎,䡜,䩮,䬛,䮉,䰕,䱚,䲐,䴪|mou:侔,劺,哞,恈,某,桙,洠,牟,眸,瞴,蟱,謀,谋,鉾,鍪,鴾,麰,㭌,䍒,䏬,䗋,䥐,䱕|cha:侘,偛,剎,叉,嗏,垞,奼,姹,察,岔,嵖,差,扠,扱,挿,插,揷,搽,杈,查,査,槎,檫,汊,猹,疀,碴,秅,紁,肞,臿,艖,芆,茬,茶,衩,褨,訍,詧,詫,诧,蹅,釵,銟,鍤,鎈,鑔,钗,锸,镲,靫,餷,馇,㛳,㢉,㢎,㢒,㣾,㤞,㪯,㫅,䁟,䆛,䊬,䑘,䒲,䓭,䕓,䟕,䡨,䤩,䰈,䲦,䶪|gong:供,兝,兣,公,共,功,匑,匔,厷,唝,塨,宫,宮,工,巩,幊,廾,弓,恭,愩,慐,拱,拲,攻,杛,栱,汞,熕,珙,碽,篢,糼,羾,肱,蚣,觥,觵,貢,贑,贡,躬,躳,輁,鞏,髸,龏,龔,龚,㓋,㔶,㤨,㧬,㫒,㭟,㯯,㺬,㼦,䂬,䇨,䡗,䢚|lv:侣,侶,儢,勴,吕,呂,哷,垏,寽,屡,屢,履,嵂,律,慮,旅,曥,梠,榈,櫖,櫚,氀,氯,滤,焒,爈,率,祣,稆,穞,穭,箻,絽,綠,緑,縷,繂,绿,缕,膂,膐,膢,葎,藘,虑,褛,褸,郘,鋁,鑢,铝,閭,闾,馿,驢,驴,鷜,㔧,㠥,㭚,㲶,㻲,㾔,䔞,䢖,䥨|zhen:侦,侲,偵,圳,塦,姫,嫃,寊,屒,帪,弫,抮,挋,振,揕,搸,敒,敶,斟,昣,朕,枕,栕,栚,桢,桭,楨,榛,槇,樼,殝,浈,湞,潧,澵,獉,珍,珎,瑧,甄,畛,疹,眕,眞,真,眹,砧,碪,祯,禎,禛,稹,箴,籈,紖,紾,絼,縝,縥,纼,缜,聄,胗,臻,萙,葴,蒖,蓁,薽,蜄,袗,裖,覙,診,誫,诊,貞,賑,贞,赈,軫,轃,轸,辴,遉,酙,針,鉁,鋴,錱,鍖,鍼,鎭,鎮,针,镇,阵,陣,震,靕,駗,鬒,鱵,鴆,鸩,黮,黰,㐱,㓄,㣀,㪛,㮳,㯢,㴨,䂦,䂧,䊶,䏖,䑐,䝩,䟴,䨯,䪴,䫬,䲴,䳲|ce:侧,側,冊,册,厕,厠,墄,廁,恻,惻,憡,拺,敇,测,測,畟,笧,策,筞,筴,箣,簎,粣,荝,萗,萴,蓛,㥽,㨲,㩍,䇲,䈟,䊂,䔴,䜺|kuai:侩,儈,凷,哙,噲,圦,块,塊,墤,巜,廥,快,擓,旝,狯,獪,筷,糩,脍,膾,蒯,郐,鄶,鱠,鲙,㔞,㙕,㙗,㟴,㧟,㬮,㱮,䈛,䓒,䭝,䯤,䶐|chai:侪,儕,勑,喍,囆,拆,柴,犲,瘥,祡,茝,虿,蠆,袃,豺,㑪,㳗,㾹,䓱,䘍|nong:侬,儂,农,哝,噥,弄,憹,挊,挵,欁,浓,濃,癑,禯,秾,穠,繷,脓,膿,蕽,襛,農,辳,醲,齈,㶶,䁸,䢉,䵜|hou:侯,候,厚,后,吼,吽,喉,垕,堠,帿,後,洉,犼,猴,瘊,睺,矦,篌,糇,翭,葔,豞,逅,郈,鄇,銗,鍭,餱,骺,鮜,鯸,鱟,鲎,鲘,齁,㕈,㖃,㗋,㤧,㫗,㬋,㮢,㸸,㺅,䂉,䗔,䙈,䞧,䪷,䫛,䳧|jiong:侰,僒,冂,冋,冏,囧,坰,埛,扃,泂,浻,澃,炯,烱,煚,煛,熲,燑,燛,窘,絅,綗,蘏,蘔,褧,迥,逈,顈,颎,駉,駫,㑋,㓏,㖥,㢠,㤯,㷗,㷡,䌹,䐃,䢛|nan:侽,南,喃,囡,娚,婻,戁,抩,揇,暔,枏,枬,柟,楠,湳,煵,男,畘,腩,莮,萳,蝻,諵,赧,遖,难,難,㓓,㫱,㽖,䁪,䈒,䔜,䔳,䕼,䛁,䶲|xiao:侾,俲,傚,削,効,呺,咲,哓,哮,啋,啸,嘋,嘐,嘨,嘯,嘵,嚣,嚻,囂,婋,孝,宯,宵,小,崤,庨,彇,恔,恷,憢,揱,撨,效,敩,斅,斆,晓,暁,曉,枭,枵,校,梟,櫹,歊,歗,毊,洨,消,涍,淆,滧,潇,瀟,灱,灲,焇,熽,猇,獢,痚,痟,皛,皢,硝,硣,穘,窙,笑,筱,筿,箫,篠,簘,簫,綃,绡,翛,肖,膮,萧,萷,蕭,藃,虈,虓,蟂,蟏,蟰,蠨,訤,詨,誟,誵,謏,謞,踃,逍,郩,銷,销,霄,驍,骁,髇,髐,魈,鴞,鴵,鷍,鸮,㑾,㔅,㗛,㚣,㤊,㬵,㹲,䊥,䒕,䒝,䕧,䥵|bian:便,匾,卞,变,変,峅,弁,徧,忭,惼,扁,抃,拚,揙,昪,汳,汴,炞,煸,牑,猵,獱,甂,砭,碥,稨,窆,笾,箯,籩,糄,編,緶,缏,编,艑,苄,萹,藊,蝙,褊,覍,變,貶,贬,辡,辧,辨,辩,辪,辫,辮,辯,边,遍,邉,邊,釆,鍽,閞,鞭,頨,鯾,鯿,鳊,鴘,㝸,㣐,㦚,㭓,㲢,㳎,㳒,㴜,㵷,㺹,㻞,䁵,䉸,䒪,䛒,䡢,䪻|tui:俀,僓,娧,尵,推,煺,穨,脮,腿,蓷,藬,蘈,蛻,蜕,褪,蹆,蹪,退,隤,頹,頺,頽,颓,駾,骽,魋,㞂,㢈,㢑,㦌,㱣,㷟,㾯,㾼,㾽,㿉,㿗,䀃,䅪,䍾,䫋|cu:促,噈,媨,徂,憱,殂,猝,瘄,瘯,簇,粗,縬,蔟,觕,誎,趗,踧,蹙,蹴,蹵,酢,醋,顣,麁,麄,麤,鼀,㗤,㰗,䃚,䎌,䓚,䙯,䛤,䟟,䠓,䠞,䢐,䥄,䥘,䬨|e:俄,偔,僫,匎,卾,厄,吪,呃,呝,咢,咹,噁,噩,囮,垩,堊,堮,妸,妿,姶,娥,娿,婀,屙,屵,岋,峉,峨,峩,崿,廅,恶,悪,惡,愕,戹,扼,搤,搹,擜,枙,櫮,歞,歺,涐,湂,珴,琧,皒,睋,砈,砐,砨,硆,磀,腭,苊,莪,萼,蕚,蚅,蛾,蝁,覨,訛,詻,誐,諤,譌,讍,讹,谔,豟,軛,軶,轭,迗,遌,遏,遻,鄂,鈋,鋨,鍔,鑩,锇,锷,閼,阏,阨,阸,頞,頟,額,顎,颚,额,餓,餩,饿,騀,魤,鰐,鱷,鳄,鵈,鵝,鵞,鶚,鹅,鹗,齶,㓵,㔩,㕎,㖾,㗁,㟧,㠋,㡋,㦍,㧖,㩵,㮙,㱦,㷈,㼂,㼢,㼰,䄉,䆓,䑥,䑪,䓊,䔾,䕏,䖸,䙳,䛖,䝈,䞩,䣞,䩹,䫷,䱮,䳗,䳘,䳬|ku:俈,刳,哭,喾,嚳,圐,堀,崫,库,庫,扝,枯,桍,楛,焅,狜,瘔,矻,秙,窟,絝,绔,苦,袴,裤,褲,跍,郀,酷,骷,鮬,㒂,㠸,䇢|jun:俊,儁,军,君,呁,均,埈,姰,寯,峻,懏,捃,攈,晙,桾,汮,浚,濬,焌,燇,珺,畯,皲,皸,皹,碅,竣,筠,箘,箟,莙,菌,蚐,蜠,袀,覠,軍,郡,鈞,銁,銞,鍕,钧,陖,餕,馂,駿,骏,鮶,鲪,鵔,鵕,鵘,麇,麏,麕,㑺,㒞,㓴,㕙,㝦,㴫,㻒,㽙,䇹,䕑,䜭,䝍|zu:俎,傶,卆,卒,哫,崒,崪,族,爼,珇,祖,租,稡,箤,組,组,菹,葅,蒩,詛,謯,诅,足,踤,踿,鎺,鏃,镞,阻,靻,㞺,㰵,㲞,䅸,䔃,䖕,䚝,䯿,䱣|hun:俒,倱,圂,婚,忶,惛,惽,慁,掍,昏,昬,棔,殙,浑,涽,混,渾,溷,焝,睧,睯,繉,荤,葷,觨,諢,诨,轋,閽,阍,餛,馄,魂,鼲,㑮,㥵,㨡,䅙,䅱,䚠,䛰,䧰,䫟,䰟,䴷|su:俗,傃,僳,嗉,嗽,囌,塐,塑,夙,嫊,宿,愫,愬,憟,梀,榡,樎,樕,橚,櫯,殐,泝,洬,涑,溯,溸,潚,潥,玊,珟,璛,甦,碿,稣,穌,窣,簌,粛,粟,素,縤,肃,肅,膆,苏,蔌,藗,蘇,蘓,觫,訴,謖,诉,谡,趚,蹜,速,遡,遬,酥,鋉,餗,驌,骕,鯂,鱐,鷫,鹔,㑉,㑛,㓘,㔄,㕖,㜚,㝛,㨞,㩋,㪩,㬘,㯈,㴋,㴑,㴼,䃤,䅇,䌚,䎘,䏋,䑿,䔎,䘻,䛾,䥔|lia:俩,倆|pai:俳,哌,徘,拍,排,棑,派,湃,牌,犤,猅,磗,箄,簰,蒎,輫,鎃,㭛,㵺,䖰|biao:俵,儦,墂,婊,幖,彪,摽,杓,标,標,檦,淲,滮,瀌,灬,熛,爂,猋,瘭,穮,脿,膘,臕,蔈,藨,表,裱,褾,諘,謤,贆,錶,鏢,鑣,镖,镳,颮,颷,飆,飇,飈,飊,飑,飙,飚,驃,驫,骉,骠,髟,鰾,鳔,麃,㟽,㠒,㧼,㯱,㯹,䔸,䞄|fei:俷,剕,匪,厞,吠,啡,奜,妃,婓,婔,屝,废,廃,廢,悱,扉,斐,昲,暃,曊,朏,杮,棐,榧,櫠,沸,淝,渄,濷,狒,猆,疿,痱,癈,篚,緋,绯,翡,肥,肺,胐,腓,菲,萉,蕜,蕟,蜚,蜰,蟦,裶,誹,诽,費,费,鐨,镄,霏,靅,非,靟,飛,飝,飞,餥,馡,騑,騛,鯡,鲱,鼣,㔗,㥱,㩌,㭭,㵒,䆏,䈈,䉬,䑔,䕁,䕠,䚨,䛍,䠊,䤵,䨽,䨾,䰁|bei:俻,倍,偝,偹,備,僃,北,卑,喺,备,悖,悲,惫,愂,憊,揹,昁,杯,桮,梖,焙,牬,犕,狈,狽,珼,琲,盃,碑,碚,禙,糒,背,苝,蓓,藣,蛽,被,褙,誖,貝,贝,軰,輩,辈,邶,鄁,鉳,鋇,鐾,钡,陂,鞴,骳,鵯,鹎,㔨,㛝,㣁,㤳,㰆,㶔,㷶,㸢,㸬,㸽,㻗,㼎,㾱,䁅,䋳,䔒,䠙,䡶,䩀,䰽|zong:倊,倧,偬,傯,堫,宗,嵏,嵕,嵸,总,惣,惾,愡,捴,揔,搃,摠,昮,朡,棕,椶,熧,燪,猔,猣,疭,瘲,碂,磫,稯,粽,糉,綜,緃,総,緵,縂,縦,縱,總,纵,综,翪,腙,艐,葼,蓗,蝬,豵,踨,踪,蹤,錝,鍯,鏓,鑁,騌,騣,骔,鬃,鬉,鬷,鯮,鯼,㢔,㯶,㷓,㹅,䍟,䝋,䰌|tian:倎,兲,唺,塡,填,天,婖,屇,忝,恬,悿,捵,掭,搷,晪,殄,沺,淟,添,湉,琠,瑱,璳,甛,甜,田,畋,畑,畠,痶,盷,睓,睼,碵,磌,窴,緂,胋,腆,舔,舚,菾,覥,觍,賟,酟,錪,闐,阗,靔,靝,靦,餂,鴫,鷆,鷏,黇,㐁,㖭,㙉,㥏,㧂,㮇,㶺,䄼,䄽,䐌,䑚,䟧,䠄,䡒,䡘,䣯,䥖,䩄|dao:倒,刀,刂,到,叨,噵,壔,宲,导,導,屶,岛,島,嶋,嶌,嶹,忉,悼,捣,捯,搗,擣,朷,椡,槝,檤,氘,焘,燾,瓙,盗,盜,祷,禂,禱,稲,稻,纛,翢,翿,舠,菿,衜,衟,蹈,軇,道,釖,陦,隝,隯,魛,鱽,㠀,㿒,䆃,䌦,䧂,䲽|tan:倓,傝,僋,叹,啴,嗿,嘆,嘽,坍,坛,坦,埮,墰,墵,壇,壜,婒,弾,忐,怹,惔,憛,憳,憻,探,摊,撢,擹,攤,昙,暺,曇,榃,橝,檀,歎,毯,湠,滩,潬,潭,灘,炭,璮,痑,痰,瘫,癱,碳,罈,罎,舑,舕,菼,藫,袒,襢,覃,談,譚,譠,谈,谭,貚,貪,賧,贪,赕,郯,醈,醓,醰,鉭,錟,钽,锬,顃,鷤,㲜,㲭,㷋,㽑,䃪,䆱,䉡,䊤,䏙,䐺,䕊,䜖,䞡,䦔|chui:倕,吹,垂,埀,捶,搥,桘,棰,槌,炊,箠,腄,菙,錘,鎚,锤,陲,顀,龡,㓃,㝽,㥨,㩾,䄲,䍋,䞼,䳠|tang:倘,偒,傏,傥,儻,劏,唐,啺,嘡,坣,堂,塘,嵣,帑,戃,搪,摥,曭,棠,榶,樘,橖,汤,淌,湯,溏,漟,烫,煻,燙,爣,瑭,矘,磄,禟,篖,糃,糖,糛,羰,耥,膅,膛,蓎,薚,蝪,螗,螳,赯,趟,踼,蹚,躺,鄌,醣,鎕,鎲,鏜,鐋,钂,铴,镋,镗,闛,隚,鞺,餳,餹,饄,饧,鶶,鼞,㑽,㒉,㙶,㜍,㭻,㲥,㼺,㿩,䅯,䉎,䌅,䟖,䣘,䧜|kong:倥,埪,孔,崆,恐,悾,控,涳,硿,空,箜,躻,躼,錓,鞚,鵼,㤟,㸜|juan:倦,劵,勌,勬,卷,呟,埍,奆,姢,娟,帣,弮,慻,捐,捲,桊,涓,淃,狷,獧,瓹,眷,睊,睠,絭,絹,绢,罥,羂,脧,臇,菤,蔨,蠲,裐,鄄,鋑,鋗,錈,鎸,鐫,锩,镌,隽,雋,飬,餋,鵑,鹃,㢧,㢾,㪻,㯞,㷷,䄅,䌸,䖭,䚈,䡓,䳪|luo:倮,儸,剆,啰,囉,峈,捋,摞,攞,曪,椤,欏,泺,洛,洜,漯,濼,犖,猡,玀,珞,瘰,癳,砢,笿,箩,籮,絡,纙,络,罗,羅,脶,腡,臝,荦,萝,落,蓏,蘿,螺,蠃,裸,覶,覼,躶,逻,邏,鏍,鑼,锣,镙,雒,頱,饠,駱,騾,驘,骆,骡,鮥,鱳,鵅,鸁,㑩,㒩,㓢,㦬,㩡,㰁,㱻,㴖,㼈,㽋,㿚,䀩,䇔,䈷,䊨,䌱,䌴,䯁|song:倯,傱,凇,娀,宋,崧,嵩,嵷,庺,忪,怂,悚,愯,慫,憽,捒,松,枀,枩,柗,梥,檧,淞,濍,硹,竦,耸,聳,菘,蜙,訟,誦,讼,诵,送,鎹,頌,颂,餸,駷,鬆,㕬,㧐,㨦,㩳,㮸,䉥,䛦,䜬,䢠|leng:倰,冷,堎,塄,愣,棱,楞,睖,碐,稜,薐,踜,䉄,䚏,䬋,䮚|ben:倴,坌,奔,奙,捹,撪,本,桳,楍,泍,渀,犇,獖,畚,笨,苯,賁,贲,輽,逩,錛,锛,㡷,㤓,㨧,㮺,㱵,䬱|zhai:债,債,夈,宅,寨,捚,摘,斋,斎,斏,榸,瘵,砦,窄,粂,鉙,齋,㡯,㩟|qing:倾,傾,儬,凊,剠,勍,卿,圊,埥,夝,庆,庼,廎,情,慶,掅,擎,擏,晴,暒,棾,樈,檠,檾,櫦,殑,殸,氢,氫,氰,淸,清,漀,濪,甠,硘,碃,磬,箐,罄,苘,葝,蜻,請,謦,请,軽,輕,轻,郬,鑋,靑,青,靘,頃,顷,鯖,鲭,黥,㯳,㷫,䋜,䌠,䔛,䝼,䞍,䯧,䲔|ying:偀,僌,啨,営,嘤,噟,嚶,塋,婴,媖,媵,嫈,嬰,嬴,孆,孾,巆,巊,应,廮,影,応,愥,應,摬,撄,攍,攖,攚,映,暎,朠,桜,梬,楹,樱,櫻,櫿,浧,渶,溁,溋,滎,滢,潁,潆,濙,濚,濴,瀅,瀛,瀠,瀯,瀴,灐,灜,煐,熒,營,珱,瑛,瑩,璎,瓔,甇,甖,瘿,癭,盁,盈,矨,硬,碤,礯,穎,籝,籯,緓,縈,纓,绬,缨,罂,罃,罌,膡,膺,英,茔,荥,荧,莹,莺,萤,营,萦,萾,蓥,藀,蘡,蛍,蝇,蝧,蝿,螢,蠅,蠳,褮,覮,謍,譍,譻,賏,贏,赢,軈,迎,郢,鎣,鐛,鑍,锳,霙,鞕,韺,頴,颍,颕,颖,鴬,鶧,鶯,鷪,鷹,鸎,鸚,鹦,鹰,㑞,㢍,㨕,㯋,㲟,㴄,㵬,㶈,㹙,㹚,㿘,䀴,䁐,䁝,䃷,䇾,䑉,䕦,䙬,䤝,䨍,䪯,䭊,䭗|ruan:偄,堧,壖,媆,嫰,愞,撋,朊,瑌,瓀,碝,礝,緛,耎,腝,蝡,軟,輭,软,阮,㼱,㽭,䓴,䞂,䪭|chun:偆,唇,堾,媋,惷,旾,春,暙,杶,椿,槆,橁,櫄,浱,淳,湻,滣,漘,犉,瑃,睶,箺,純,纯,脣,莼,萅,萶,蒓,蓴,蝽,蠢,賰,踳,輴,醇,醕,錞,陙,鯙,鰆,鶉,鶞,鹑,㖺,㝄,㝇,㵮,㸪,㿤,䄝,䏛,䏝,䐇,䐏,䓐,䔚,䞐,䣨,䣩,䥎,䦮,䫃|ruo:偌,叒,婼,嵶,弱,挼,捼,楉,渃,焫,爇,箬,篛,若,蒻,鄀,鰙,鰯,鶸,䐞|pian:偏,囨,媥,楄,楩,片,犏,篇,翩,胼,腁,覑,諚,諞,谝,貵,賆,蹁,駢,騈,騗,騙,骈,骗,骿,魸,鶣,㓲,㛹,㸤,㼐,䏒,䮁|sheng:偗,剩,剰,勝,升,呏,圣,墭,声,嵊,憴,斘,昇,晟,晠,曻,枡,榺,橳,殅,泩,渑,渻,湦,澠,焺,牲,珄,琞,生,甥,盛,省,眚,竔,笙,縄,繩,绳,聖,聲,胜,苼,蕂,譝,貹,賸,鉎,鍟,阩,陞,陹,鱦,鵿,鼪,㗂,㼳,㾪,䁞,䎴,䚇,䞉,䪿,䱆|huang:偟,兤,凰,喤,堭,塃,墴,奛,媓,宺,崲,巟,幌,徨,怳,恍,惶,愰,慌,揘,晃,晄,曂,朚,楻,榥,櫎,湟,滉,潢,炾,煌,熀,熿,獚,瑝,璜,癀,皇,皝,皩,磺,穔,篁,簧,縨,肓,艎,荒,葟,蝗,蟥,衁,詤,諻,謊,谎,趪,遑,鍠,鎤,鐄,锽,隍,韹,餭,騜,鰉,鱑,鳇,鷬,黃,黄,㞷,㤺,㨪,㬻,㾠,㾮,䁜,䅣,䊗,䊣,䌙,䍿,䐠,䐵,䑟,䞹,䪄,䮲,䳨|duan:偳,塅,媏,断,斷,椴,段,毈,煅,瑖,短,碫,端,簖,籪,緞,缎,耑,腶,葮,褍,躖,鍛,鍴,锻,㫁,㱭,䠪|zan:偺,儧,儹,兂,咱,喒,囋,寁,撍,攒,攢,昝,暂,暫,濽,灒,瓉,瓒,瓚,禶,簪,簮,糌,襸,讃,讚,賛,贊,赞,趱,趲,蹔,鄼,酂,酇,錾,鏨,鐕,饡,㜺,㟛,㣅,㤰|lou:偻,僂,喽,嘍,塿,娄,婁,屚,嵝,嶁,廔,慺,搂,摟,楼,樓,溇,漊,漏,熡,甊,瘘,瘺,瘻,瞜,篓,簍,耧,耬,艛,蒌,蔞,蝼,螻,謱,軁,遱,鏤,镂,陋,鞻,髅,髏,㔷,㟺,㥪,㪹,㲎,㺏,䁖,䄛,䅹,䝏,䣚,䫫,䮫,䱾|sou:傁,凁,叜,叟,嗖,嗾,廀,廋,捜,搜,摗,擞,擻,櫢,溲,獀,瘶,瞍,艘,蒐,蓃,薮,藪,螋,鄋,醙,鎪,锼,颼,飕,餿,馊,騪,㖩,㛐,㵻,䈹,䉤,䏂,䮟|yuan:傆,元,冤,剈,原,厡,厵,员,員,噮,囦,园,圆,圎,園,圓,圜,垣,垸,塬,夗,妴,媛,媴,嫄,嬽,寃,弲,怨,悁,惌,愿,掾,援,杬,棩,榞,榬,橼,櫞,沅,淵,渁,渆,渊,渕,湲,源,溒,灁,爰,猨,猿,獂,瑗,盶,眢,禐,笎,箢,緣,縁,缘,羱,肙,苑,葾,蒝,蒬,薗,蚖,蜎,蜵,蝝,蝯,螈,衏,袁,裫,褑,褤,謜,貟,贠,轅,辕,远,逺,遠,邍,邧,酛,鈨,鋺,鎱,院,願,駌,騵,魭,鳶,鴛,鵷,鶢,鶰,鸢,鸳,鹓,黿,鼋,鼘,鼝,㟶,㤪,㥐,㥳,㭇,㹉,䅈,䏍,䖠,䛄,䛇,䩩,䬇,䬧,䬼,䲮,䳒,䳣|rong:傇,冗,媶,嫆,嬫,宂,容,峵,嵘,嵤,嶸,戎,搈,搑,摉,曧,栄,榕,榮,榵,毧,氄,溶,瀜,烿,熔,爃,狨,瑢,穁,穃,絨,縙,绒,羢,肜,茙,茸,荣,蓉,蝾,融,螎,蠑,褣,軵,鎔,镕,駥,髶,㘇,㝐,㣑,㭜,㲓,㲝,㲨,㺎,㼸,䇀,䇯,䈶,䘬,䠜,䡆,䡥,䢇,䤊,䩸|jiang:傋,僵,勥,匞,匠,壃,夅,奖,奨,奬,姜,将,將,嵹,弜,弶,彊,摪,摾,杢,桨,槳,橿,櫤,殭,江,洚,浆,滰,漿,犟,獎,畕,畺,疅,疆,礓,糡,糨,絳,繮,绛,缰,翞,耩,膙,茳,葁,蒋,蔣,薑,螀,螿,袶,講,謽,讲,豇,酱,醤,醬,降,韁,顜,鱂,鳉,㢡,㯍,䁰,䉃,䋌,䒂,䕭,䕯,䙹,䞪|bang:傍,垹,塝,峀,帮,幇,幚,幫,徬,捠,梆,棒,棓,榜,浜,牓,玤,硥,磅,稖,綁,縍,绑,膀,艕,蒡,蚌,蜯,謗,谤,邦,邫,鎊,镑,鞤,㔙,㭋,㮄,㯁,㾦,䂜,䎧,䖫,䟺,䧛,䰷|hao:傐,儫,兞,号,哠,嗥,嘷,噑,嚆,嚎,壕,好,恏,悎,昊,昦,晧,暤,暭,曍,椃,毫,浩,淏,滈,澔,濠,灏,灝,獆,獋,皓,皜,皞,皡,皥,秏,竓,籇,耗,聕,茠,蒿,薃,薅,薧,號,蚝,蠔,譹,豪,郝,顥,颢,鰝,㕺,㘪,㙱,㚪,㝀,㞻,㠙,㩝,㬔,㬶,㵆,䒵,䚽,䝞,䝥,䧫,䪽,䬉,䯫|shan:傓,僐,删,刪,剡,剼,善,嘇,圸,埏,墠,墡,姍,姗,嬗,山,幓,彡,扇,挻,搧,擅,敾,晱,曑,杉,杣,椫,樿,檆,汕,潸,澘,灗,炶,烻,煔,煽,熌,狦,珊,疝,痁,睒,磰,笘,縿,繕,缮,羴,羶,脠,膳,膻,舢,芟,苫,蔪,蟮,蟺,衫,覢,訕,謆,譱,讪,贍,赡,赸,跚,軕,邖,鄯,釤,銏,鐥,钐,閃,閊,闪,陕,陝,饍,騸,骟,鯅,鱓,鱔,鳝,㚒,㣌,㣣,㨛,㪎,㪨,㶒,䄠,䆄,䚲,䠾,䥇,䦂,䦅,䱇,䱉,䴮|suo:傞,唆,唢,嗦,嗩,娑,惢,所,挲,摍,暛,桫,梭,溑,溹,琐,琑,瑣,睃,簑,簔,索,縮,缩,羧,莏,蓑,蜶,趖,逤,鎍,鎖,鎻,鎼,鏁,锁,髿,鮻,㪽,䂹,䅴,䈗,䐝,䖛,䗢,䞆,䞽,䣔,䵀|zai:傤,儎,再,哉,在,宰,崽,扗,栽,洅,渽,溨,災,灾,烖,甾,睵,縡,菑,賳,載,载,酨,㞨,㱰,㴓,䏁,䣬,䮨,䵧|bin:傧,儐,宾,彬,摈,擯,斌,椕,槟,殡,殯,氞,汃,滨,濒,濱,濵,瀕,瑸,璸,砏,繽,缤,膑,臏,虨,蠙,豩,豳,賓,賔,邠,鑌,镔,霦,顮,髌,髕,髩,鬂,鬓,鬢,䐔|nuo:傩,儺,喏,懦,懧,挪,掿,搦,搻,桛,梛,榒,橠,燶,硸,稬,穤,糑,糥,糯,諾,诺,蹃,逽,郍,鍩,锘,黁,㐡,㑚,㔮,㛂,㡅,㰙,䚥|can:傪,儏,参,參,叄,叅,喰,噆,嬠,惨,惭,慘,慙,慚,憯,朁,残,殘,湌,澯,灿,燦,爘,璨,穇,粲,薒,蚕,蝅,蠶,蠺,謲,飡,餐,驂,骖,黪,黲,㘔,㛑,㜗,㣓,㥇,㦧,㨻,㱚,㺑,㻮,㽩,㿊,䅟,䍼,䏼,䑶,䗝,䗞,䘉,䙁,䛹,䝳,䣟,䫮,䬫,䳻|lei:傫,儡,儽,厽,嘞,垒,塁,壘,壨,嫘,擂,攂,樏,檑,櫐,櫑,欙,泪,洡,涙,淚,灅,瓃,畾,癗,矋,磊,磥,礌,礧,礨,禷,类,累,絫,縲,纇,纍,纝,缧,罍,羸,耒,肋,脷,蔂,蕌,蕾,藟,蘱,蘲,蘽,虆,蠝,誄,讄,诔,轠,酹,銇,錑,鐳,鑘,鑸,镭,雷,靁,頛,頪,類,颣,鱩,鸓,鼺,㑍,㒍,㒦,㔣,㙼,㡞,㭩,㲕,㴃,㵢,㶟,㹎,㼍,㿔,䉂,䉓,䉪,䍣,䍥,䐯,䒹,䛶,䢮,䣂,䣦,䨓,䮑,䴎|zao:傮,凿,唕,唣,喿,噪,慥,早,枣,栆,梍,棗,澡,灶,煰,燥,璅,璪,皁,皂,竃,竈,簉,糟,艁,薻,藻,蚤,譟,趮,蹧,躁,造,遭,醩,鑿,㲧,㿷,䜊,䥣,䲃|ao:傲,凹,厫,嗷,嗸,坳,垇,墺,奡,奥,奧,媪,媼,嫯,岙,岰,嶅,嶴,廒,慠,懊,扷,抝,拗,摮,擙,敖,柪,滶,澚,澳,熬,爊,獒,獓,璈,磝,翱,翶,翺,聱,芺,蔜,螯,袄,襖,謷,謸,軪,遨,鏊,鏖,镺,隞,驁,骜,鰲,鳌,鷔,鼇,㑃,㕭,㘬,㘭,㜜,㜩,㟼,㠂,㠗,㤇,㥿,㿰,䁱,䐿,䚫,䜒,䞝,䥝,䦋,䫨,䮯,䯠,䴈,䵅|chuang:傸,刅,创,刱,剏,剙,創,噇,幢,床,怆,愴,摐,漺,牀,牎,牕,疮,瘡,磢,窓,窗,窻,闖,闯,㡖,㵂,䃥,䆫,䇬,䎫,䚒,䡴,䭚|piao:僄,剽,勡,嘌,嫖,彯,徱,慓,旚,殍,漂,犥,瓢,皫,瞟,磦,票,篻,縹,缥,翲,薸,螵,醥,闝,顠,飃,飄,飘,魒,㩠,㬓,㵱,㹾,㺓,㼼,䏇,䴩|man:僈,墁,姏,嫚,屘,幔,悗,慢,慲,摱,曼,槾,樠,満,满,滿,漫,澫,澷,熳,獌,睌,瞒,瞞,矕,縵,缦,蔄,蔓,蘰,蛮,螨,蟃,蟎,蠻,襔,謾,谩,鄤,鏋,鏝,镘,鞔,顢,颟,饅,馒,鬗,鬘,鰻,鳗,㒼,㗄,㗈,㙢,㛧,㡢,㬅,㵘,䅼,䊡,䐽,䑱,䕕,䛲,䜱,䝡,䝢,䟂,䡬,䯶,䰋|zun:僔,噂,尊,嶟,捘,撙,樽,繜,罇,譐,遵,銌,鐏,鱒,鳟,鶎,鷷|deng:僜,凳,噔,墱,嬁,嶝,戥,櫈,灯,燈,璒,登,瞪,磴,竳,等,簦,艠,覴,豋,蹬,邓,鄧,鐙,镫,隥,䃶,䒭,䠬,䮴|tie:僣,呫,帖,怗,聑,萜,蛈,貼,贴,跕,鉄,銕,鐡,鐢,鐵,铁,飻,餮,驖,鴩,䥫,䴴,䵿|seng:僧|min:僶,冧,冺,刡,勄,垊,姄,岷,崏,忞,怋,悯,愍,慜,憫,抿,捪,敃,敏,敯,旻,旼,暋,民,泯,湣,潣,玟,珉,琘,琝,瑉,痻,皿,盿,碈,笢,笽,簢,緍,緡,缗,罠,苠,蠠,賯,鈱,錉,鍲,閔,閩,闵,闽,鰵,鳘,鴖,黽,㞶,㟩,㟭,㢯,㥸,㨉,䁕,䂥,䃉,䋋,䟨,䡅,䡑,䡻,䪸,䲄|sai:僿,嗮,嘥,噻,塞,愢,揌,毢,毸,簺,腮,虄,賽,赛,顋,鰓,鳃,㗷,䈢|dang:儅,党,凼,噹,圵,垱,壋,婸,宕,当,挡,擋,攩,档,檔,欓,氹,潒,澢,灙,珰,璗,璫,瓽,當,盪,瞊,砀,碭,礑,筜,簜,簹,艡,荡,菪,蕩,蘯,蟷,裆,襠,譡,讜,谠,趤,逿,闣,雼,黨,䑗,䣊,䣣,䦒|xuan:儇,吅,咺,喧,塇,媗,嫙,嬛,宣,怰,悬,愃,愋,懸,揎,旋,昍,昡,晅,暄,暅,暶,梋,楥,楦,檈,泫,渲,漩,炫,烜,煊,玄,玹,琁,琄,瑄,璇,璿,痃,癣,癬,眩,眴,睻,矎,碹,禤,箮,絢,縼,繏,绚,翧,翾,萱,萲,蓒,蔙,蕿,藼,蘐,蜁,蝖,蠉,衒,袨,諠,諼,譞,讂,谖,贙,軒,轩,选,選,鉉,鍹,鏇,铉,镟,鞙,颴,駽,鰚,㘣,㧦,㳙,㳬,㹡,㾌,䁢,䍗,䍻,䗠,䘩,䝮,䠣,䧎,䩙,䩰,䮄,䲂,䲻,䴉,䴋|tai:儓,冭,台,囼,坮,太,夳,嬯,孡,忲,态,態,抬,擡,旲,檯,汰,泰,溙,炱,炲,燤,珆,箈,籉,粏,肽,胎,臺,舦,苔,菭,薹,跆,邰,酞,鈦,钛,颱,駘,骀,鮐,鲐,㑷,㒗,㘆,㙵,㣍,㥭,㬃,㷘,㸀,䈚,䑓,䢰,䣭|lan:儖,兰,厱,嚂,囒,壈,壏,婪,嬾,孄,孏,岚,嵐,幱,懒,懢,懶,拦,揽,擥,攔,攬,斓,斕,栏,榄,欄,欖,欗,浨,滥,漤,澜,濫,瀾,灆,灠,灡,烂,燗,燣,爁,爛,爤,爦,璼,瓓,礷,篮,籃,籣,糷,繿,纜,缆,罱,葻,蓝,蓞,藍,蘭,褴,襕,襤,襴,襽,覧,覽,览,譋,讕,谰,躝,醂,鑭,钄,镧,闌,阑,韊,㑣,㘓,㛦,㜮,㞩,㦨,㨫,㩜,㰖,㱫,㳕,䃹,䆾,䊖,䌫,䍀,䑌,䦨,䪍,䰐,䳿|meng:儚,冡,勐,夢,夣,孟,幪,庬,懜,懞,懵,掹,擝,曚,朦,梦,橗,檬,氋,溕,濛,猛,獴,瓾,甍,甿,盟,瞢,矇,矒,礞,罞,艋,艨,莔,萌,萠,蒙,蕄,虻,蜢,蝱,蠓,鄳,鄸,錳,锰,雺,霥,霿,靀,顭,饛,鯍,鯭,鸏,鹲,鼆,㙹,㚞,㜴,㝱,㠓,㩚,䀄,䇇,䉚,䏵,䑃,䑅,䒐,䓝,䗈,䙦,䙩,䠢,䤓,䥂,䥰,䰒,䲛,䴌,䴿,䵆|qiong:儝,卭,宆,惸,憌,桏,橩,焪,焭,煢,熍,琼,璚,瓊,瓗,睘,瞏,穷,穹,窮,竆,笻,筇,舼,茕,藑,藭,蛩,蛬,赹,跫,邛,銎,㒌,㧭,㮪,㷀,㼇,䅃,䆳,䊄,䓖,䛪,䠻|lie:儠,冽,列,劣,劽,咧,埒,埓,姴,峢,巤,挒,挘,捩,擸,毟,洌,浖,烈,烮,煭,犣,猎,猟,獵,睙,聗,脟,茢,蛚,裂,趔,躐,迾,颲,鬛,鬣,鮤,鱲,鴷,㤠,㧜,㬯,㭞,㯿,㲱,㸹,㼲,㽟,䁽,䅀,䉭,䓟,䜲,䟩,䟹,䢪,䴕|kuang:儣,况,劻,匡,匩,哐,圹,壙,夼,岲,恇,懬,懭,抂,旷,昿,曠,框,況,洭,爌,狂,狅,眖,眶,矌,矿,砿,礦,穬,筐,筺,絋,絖,纊,纩,誆,誑,诓,诳,貺,贶,軖,軠,軦,軭,邝,邼,鄺,鉱,鋛,鑛,鵟,黋,㤮,䊯,䵃|chen:儭,嗔,嚫,塵,墋,夦,宸,尘,忱,愖,抻,揨,敐,晨,曟,棽,榇,樄,櫬,沉,烥,煁,琛,疢,瘎,瞋,硶,碜,磣,稱,綝,臣,茞,莀,莐,蔯,薼,螴,衬,襯,訦,諃,諶,謓,讖,谌,谶,賝,贂,趁,趂,趻,踸,軙,辰,迧,郴,鈂,陈,陳,霃,鷐,麎,齓,齔,龀,㕴,㧱,㫳,㲀,㴴,㽸,䆣,䒞,䚘,䜟,䞋,䟢,䢅,䢈,䢻,䣅,䤟,䫖|teng:儯,唞,幐,朰,滕,漛,疼,痋,籐,籘,縢,腾,膯,藤,虅,螣,誊,謄,邆,霯,駦,騰,驣,鰧,鼟,䒅,䕨,䠮,䲍,䲢|long:儱,咙,哢,嚨,垄,垅,壟,壠,屸,嶐,巃,巄,徿,拢,攏,昽,曨,朧,栊,梇,槞,櫳,泷,湰,漋,瀧,爖,珑,瓏,癃,眬,矓,砻,硦,礱,礲,窿,竉,竜,笼,篭,籠,聋,聾,胧,茏,蕯,蘢,蠪,蠬,衖,襱,豅,贚,躘,鏧,鑨,陇,隆,隴,霳,靇,驡,鸗,龍,龒,龓,龙,㑝,㙙,㚅,㛞,㝫,㟖,㡣,㢅,㦕,㰍,㴳,䃧,䏊,䙪,䡁,䥢,䪊|rang:儴,勷,嚷,壌,壤,懹,攘,瀼,爙,獽,瓤,禳,穣,穰,纕,蘘,譲,讓,让,躟,鬤,㚂,䉴|xiong:兄,兇,凶,匈,哅,夐,忷,恟,敻,汹,洶,熊,胷,胸,芎,訩,詗,詾,讻,诇,雄,㐫,䧺|chong:充,冲,嘃,埫,宠,寵,崇,崈,徸,忡,憃,憧,揰,摏,沖,浺,漴,爞,珫,緟,罿,翀,舂,艟,茺,虫,蝩,蟲,衝,褈,蹖,銃,铳,隀,㓽,㧤,㹐,䌬,䖝,䳯|dui:兊,兌,兑,叾,垖,堆,塠,对,対,對,嵟,怼,憝,懟,濧,瀩,痽,碓,磓,祋,綐,薱,譈,譵,鐓,鐜,镦,队,陮,隊,頧,鴭,㙂,㟋,㠚,㬣,㳔,㵽,䇏,䇤,䔪,䨴,䨺,䬈,䬽,䯟|ke:克,刻,剋,勀,勊,匼,可,咳,嗑,坷,堁,壳,娔,客,尅,岢,峇,嵑,嵙,嶱,恪,愙,揢,搕,敤,柯,棵,榼,樖,殻,氪,渇,渴,溘,炣,牁,犐,珂,疴,痾,瞌,碦,磕,礊,礚,科,稞,窠,緙,缂,翗,胢,苛,萪,薖,蝌,課,课,趷,軻,轲,醘,鈳,錁,钶,锞,頦,顆,颏,颗,騍,骒,髁,㕉,㞹,㤩,㪃,㪙,㪡,㪼,㰤,㵣,㾧,䙐,䶗|tu:兎,兔,凃,凸,吐,唋,図,图,圖,圗,土,圡,堍,堗,塗,屠,峹,嵞,嶀,庩,廜,徒,怢,悇,捈,捸,揬,梌,汢,涂,涋,湥,潳,痜,瘏,禿,秃,稌,突,筡,腯,荼,莵,菟,葖,蒤,跿,迌,途,酴,釷,鈯,鋵,鍎,钍,馟,駼,鵌,鵚,鵵,鶟,鷋,鷵,鼵,㭸,㻌,㻠,㻬,㻯,䅷,䖘,䠈,䣄,䣝,䤅,䳜|qiang:兛,呛,唴,嗆,嗴,墏,墙,墻,嫱,嬙,嶈,廧,強,强,戕,戗,戧,抢,搶,摤,斨,枪,椌,槍,樯,檣,溬,漒,炝,熗,牄,牆,猐,獇,玱,琷,瑲,瓩,篬,繈,繦,羌,羗,羟,羥,羫,羻,腔,艢,蔃,蔷,薔,蘠,蜣,襁,謒,跄,蹌,蹡,錆,鎗,鏘,鏹,锖,锵,镪,㛨,㩖,䅚,䵁|nei:內,内,娞,氝,焾,腇,餒,馁,鮾,鯘,㕯,㖏,㘨,㨅,㼏,䡾,䲎,䳖|liu:六,刘,劉,嚠,囖,塯,媹,嬼,嵧,廇,懰,旈,旒,柳,栁,桞,桺,榴,橊,橮,沠,流,浏,溜,澑,瀏,熘,熮,珋,琉,瑠,瑬,璢,瓼,甅,畄,留,畱,疁,瘤,癅,硫,磂,磟,綹,绺,罶,羀,翏,蒥,蓅,藰,蟉,裗,蹓,遛,鋶,鎏,鎦,鏐,鐂,锍,镏,镠,雡,霤,飀,飂,飅,飗,餾,馏,駠,駵,騮,驑,骝,鬸,鰡,鶹,鷚,鹠,鹨,麍,㐬,㙀,㨨,㶯,㽌,㽞,䄂,䉧,䋷,䗜,䚧,䬟,䭷,䰘,䱖,䱞,䶉|pou:兺,咅,哛,哣,堷,婄,抔,抙,捊,掊,犃,箁,裒,颒,㕻,㧵|shou:兽,収,受,售,垨,壽,夀,守,寿,手,扌,授,收,涭,狩,獣,獸,痩,瘦,綬,绶,膄,艏,鏉,首,㖟,㝊,㥅,䛵,䭭|mao:冃,冇,冐,冒,卯,唜,堥,夘,媢,峁,帽,愗,懋,戼,旄,昴,暓,枆,楙,毛,毜,毝,毷,泖,渵,牦,猫,瑁,皃,眊,瞀,矛,笷,緢,耄,芼,茂,茅,茆,蓩,蛑,蝐,蝥,蟊,袤,覒,貌,貓,貿,贸,軞,鄚,鄮,酕,鉚,錨,铆,锚,髦,髳,鶜,㒵,㒻,㚹,㝟,㡌,㧇,㧌,㪞,㫯,㮘,㲠,㴘,㺺,㿞,䀤,䅦,䋃,䓮,䡚,䫉|ran:冄,冉,呥,嘫,姌,媣,染,橪,然,燃,珃,繎,肰,苒,蒅,蚦,蚺,衻,袇,袡,髥,髯,㚩,㜣,㯗,㲯,㸐,㾆,㿵,䎃,䑙,䒣,䖄,䡮,䣸,䤡,䫇|gang:冈,冮,刚,剛,堈,堽,岗,岡,崗,戆,戇,掆,杠,棡,槓,港,焵,牨,犅,疘,矼,筻,綱,纲,缸,罁,罓,罡,肛,釭,鋼,鎠,钢,阬,㟠,㟵,㽘,䴚|gua:冎,刮,剐,剮,劀,卦,叧,呱,啩,坬,寡,挂,掛,歄,焻,煱,瓜,絓,緺,罣,罫,胍,苽,褂,詿,诖,趏,銽,颪,颳,騧,鴰,鸹,㒷,䈑|kou:冦,剾,劶,口,叩,宼,寇,廤,彄,怐,扣,抠,摳,敂,滱,眍,瞉,瞘,窛,筘,簆,芤,蔲,蔻,釦,鷇,㓂,㔚,㰯,㲄,㽛,䳟,䳹|pan:冸,判,叛,坢,媻,幋,搫,攀,柈,槃,沜,泮,溿,潘,瀊,炍,爿,牉,畔,畨,盘,盤,盼,眅,磐,縏,蒰,蟠,袢,襻,詊,跘,蹒,蹣,鋬,鎜,鑻,鞶,頖,鵥,㐴,㳪,䃑,䃲,䈲,䰉,䰔|qia:冾,圶,帢,恰,愘,拤,掐,殎,洽,硈,葜,跒,酠,鞐,髂,㓣,㡊,㤉,䜑,䠍,䨐,䯊,䶝|mei:凂,呅,嚜,堳,塺,妹,媄,媒,媚,媺,嬍,寐,嵄,嵋,徾,抺,挴,攗,攟,昧,枚,栂,梅,楣,楳,槑,毎,每,沒,没,沬,浼,渼,湄,湈,煝,煤,燘,猸,玫,珻,瑂,痗,眉,眛,睂,睸,矀,祙,禖,篃,美,脄,脢,腜,苺,莓,葿,蘪,蝞,袂,跊,躾,郿,酶,鋂,鎂,鎇,镁,镅,霉,韎,鬽,魅,鶥,鹛,黣,黴,㭑,㶬,㺳,䀛,䆀,䉋,䊈,䊊,䍙,䒽,䓺,䜸,䤂,䰨,䰪,䵢|zhun:准,凖,埻,宒,準,稕,窀,綧,肫,衠,訰,諄,谆,迍|cou:凑,楱,湊,腠,輳,辏,㫶|du:凟,剢,匵,厾,嘟,堵,妒,妬,嬻,帾,度,杜,椟,櫝,殬,殰,毒,涜,渎,渡,瀆,牍,牘,犊,犢,独,獨,琽,瓄,皾,督,睹,秺,笃,篤,肚,芏,荰,蝳,螙,蠧,蠹,裻,覩,読,讀,讟,读,豄,賭,贕,赌,都,醏,錖,鍍,鑟,镀,闍,阇,靯,韇,韣,韥,騳,髑,黩,黷,㱩,㸿,㾄,䀾,䄍,䅊,䈞,䐗,䓯,䙱,䟻,䢱,䪅,䫳,䮷,䲧|cun:刌,吋,墫,存,寸,忖,拵,村,澊,皴,竴,籿,踆,邨,䍎|wen:刎,吻,呚,呡,問,塭,妏,彣,忟,抆,揾,搵,文,桽,榅,榲,殟,汶,渂,温,溫,炆,珳,瑥,璺,瘒,瘟,砇,稳,穏,穩,紊,紋,絻,纹,聞,肳,脕,脗,芠,莬,蚉,蚊,螡,蟁,豱,輼,轀,辒,鈫,鎾,閺,閿,闅,闦,闧,问,闻,阌,雯,顐,饂,馼,魰,鰛,鰮,鳁,鳼,鴍,鼤,㒚,㖧,㗃,㝧,㳷,䎹,䎽,䘇,䰚|hua:划,劃,化,华,哗,嘩,埖,姡,婲,婳,嫿,嬅,崋,摦,撶,杹,桦,椛,槬,樺,滑,澅,猾,璍,画,畫,畵,硴,磆,糀,繣,舙,花,芲,華,蕐,蘤,蘳,螖,觟,話,誮,諙,諣,譁,话,鋘,錵,鏵,铧,驊,骅,鷨,黊,㓰,㕦,㕲,㕷,㚌,㟆,㠏,㠢,㦊,㦎,㩇,㭉,㮯,䅿,䏦,䔢,䛡,䠉,䱻,䶤|yue:刖,嬳,岄,岳,嶽,彟,彠,恱,悅,悦,戉,抈,捳,曰,曱,月,枂,樾,汋,瀹,爚,玥,矱,礿,禴,箹,篗,籆,籥,籰,粤,粵,約,约,蘥,蚎,蚏,越,跀,跃,躍,軏,鈅,鉞,钥,钺,閱,閲,阅,鸑,鸙,黦,龠,龥,㜧,㜰,㬦,㰛,㹊,䋐,䖃,䟠,䠯,䡇,䢁,䢲,䤦,䥃,䶳|bie:別,别,咇,彆,徶,憋,瘪,癟,莂,虌,蛂,蟞,襒,蹩,鱉,鳖,鼈,龞,㢼,㿜,䉲,䋢,䏟,䠥,䭱|pao:刨,匏,咆,垉,奅,庖,抛,拋,泡,炮,炰,爮,狍,疱,皰,砲,礟,礮,脬,萢,蚫,袍,褜,跑,軳,鞄,麅,麭,㘐,㚿,㯡,䛌,䩝,䶌|shua:刷,唰,耍,誜|cuo:剉,剒,厝,夎,嵯,嵳,挫,措,搓,撮,棤,瑳,痤,睉,矬,磋,脞,莝,莡,蒫,蓌,蔖,虘,蹉,逪,遳,醝,銼,錯,锉,错,髊,鹺,鹾,齹,㟇,㽨,䂳,䐣,䟶,䠡,䣜,䱜,䴾|la:剌,啦,喇,嚹,垃,拉,揦,揧,搚,攋,旯,柆,楋,櫴,溂,爉,瓎,瘌,砬,磖,翋,腊,臈,臘,菈,藞,蜡,蝋,蝲,蠟,辢,辣,邋,鑞,镴,鞡,鬎,鯻,㕇,㸊,㻋,㻝,䂰,䃳,䏀,䓥,䗶,䝓,䟑,䪉,䱫,䶛|po:剖,叵,哱,嘙,坡,奤,娝,婆,尀,岥,岶,廹,敀,昢,櫇,泼,洦,溌,潑,烞,珀,皤,破,砶,笸,粕,蒪,蔢,謈,迫,鄱,酦,醱,釙,鉕,鏺,钋,钷,頗,颇,駊,魄,㛘,㨇,㰴,䄸,䎊,䞟,䣪,䣮,䨰,䪖,䯙|tuan:剬,剸,团,団,圕,團,塼,彖,慱,抟,摶,槫,檲,湍,湪,漙,煓,猯,疃,篿,糰,褖,貒,鏄,鷒,鷻,㩛,䊜,䜝,䵯|zuan:劗,揝,攥,籫,繤,纂,纉,纘,缵,躜,躦,鑚,鑽,钻,䂎,䌣,䎱,䤸|shao:劭,勺,卲,哨,娋,少,弰,捎,旓,柖,梢,潲,烧,焼,焽,燒,玿,稍,筲,紹,綤,绍,艄,芍,苕,莦,萔,蕱,蛸,袑,輎,邵,韶,颵,髾,鮹,㪢,㲈,㷹,㸛,䏴,䒚,䔠,䙼,䬰|gao:勂,吿,告,夰,峼,搞,暠,杲,槀,槁,槔,槹,橰,檺,櫜,滜,獔,皋,皐,睪,睾,祮,祰,禞,稁,稾,稿,筶,篙,糕,縞,缟,羔,羙,膏,臯,菒,藁,藳,誥,诰,郜,鋯,鎬,锆,镐,韟,餻,高,髙,鷎,鷱,鼛,㚏,㚖,㾸,䗣|lang:勆,唥,啷,埌,塱,嫏,崀,廊,悢,朖,朗,朤,桹,榔,樃,欴,浪,烺,狼,琅,瑯,硠,稂,筤,艆,莨,蒗,蓈,蓢,蜋,螂,誏,躴,郎,郒,郞,鋃,鎯,锒,閬,阆,駺,㓪,㙟,㝗,㟍,㢃,㫰,㮾,㱢,㾗,㾿,䀶,䁁,䆡,䍚,䕞,䡙,䯖,䱶|weng:勜,嗡,塕,奣,嵡,暡,滃,瓮,甕,瞈,罋,翁,聬,蓊,蕹,螉,鎓,鶲,鹟,齆,㘢,㜲,䐥,䤰|mang:匁,厖,吂,哤,壾,娏,尨,忙,恾,杗,杧,氓,汒,浝,漭,牤,牻,狵,痝,盲,硭,笀,芒,茫,茻,莽,莾,蘉,蛖,蟒,蠎,邙,釯,鋩,铓,駹,㙁,㝑,㟌,㟐,㟿,㡛,㬒,㻊,䀮,䁳,䅒,䈍,䒎,䖟,䟥,䵨|nao:匘,呶,垴,堖,夒,婥,嫐,孬,峱,嶩,巎,怓,恼,悩,惱,挠,撓,檂,淖,猱,獶,獿,瑙,硇,碙,碯,脑,脳,腦,臑,蛲,蟯,詉,譊,鐃,铙,閙,闹,鬧,㑎,㛴,㞪,㺀,㺁,䃩,䄩,䑋,䛝,䜀,䜧,䫸,䴃|za:匝,咂,囐,帀,拶,杂,桚,沞,沯,砸,磼,紥,紮,臜,臢,襍,鉔,雑,雜,雥,韴,魳,䕹,䞙,䪞|suan:匴,狻,痠,祘,笇,筭,算,蒜,酸,㔯|nian:卄,哖,埝,姩,年,廿,念,拈,捻,撚,撵,攆,涊,淰,碾,秊,秥,簐,艌,蔫,蹨,躎,輦,辇,鮎,鯰,鲇,鲶,鵇,黏,㘝,㞋,㲽,䄭,䄹,䚓,䩞,䬯|shuai:卛,帅,帥,摔,甩,蟀,衰,䢦|que:却,卻,埆,塙,墧,崅,悫,愨,慤,搉,榷,毃,炔,燩,瘸,皵,硞,确,碏,確,礐,礭,缺,舃,蒛,趞,闋,闕,阕,阙,雀,鵲,鹊,㕁,㩁,㰌,㱋,㱿,㴶,㾡,䇎,䦬,䧿|zhe:厇,哲,啠,喆,嗻,嚞,埑,嫬,悊,折,摺,晢,晣,柘,棏,樀,樜,歽,浙,淛,矺,砓,磔,籷,粍,者,蔗,虴,蛰,蜇,蟄,蟅,袩,褶,襵,詟,謫,謺,讁,讋,谪,赭,輒,輙,轍,辄,辙,这,這,遮,銸,鍺,锗,鮿,鷓,鹧,㞏,㪿,㯰,䂞,䊞,䎲,䏳,䐑,䐲,䓆,䗪,䝃,䝕,䠦,䩾,䵭|a:厑,吖,啊,嗄,錒,锕,阿|zui:厜,嗺,嘴,噿,嶊,嶵,晬,最,朘,枠,栬,樶,檇,檌,欈,濢,璻,祽,穝,絊,纗,罪,蕞,蟕,辠,酔,酻,醉,鋷,錊,㝡,㠑,㰎,䘹,䮔|rou:厹,媃,宍,揉,柔,楺,渘,煣,瑈,瓇,禸,粈,糅,肉,腬,葇,蝚,蹂,輮,鍒,鞣,韖,騥,鰇,鶔,㖻,㽥,䄾,䐓,䧷,䰆|shuang:双,塽,孀,孇,慡,樉,欆,滝,灀,爽,礵,縔,艭,鏯,雙,霜,騻,驦,骦,鷞,鸘,鹴,㦼,㼽,䗮,䡯,䫪|die:叠,哋,啑,喋,嚸,垤,堞,峌,嵽,幉,恎,惵,戜,挕,揲,昳,曡,曢,殜,氎,爹,牃,牒,瓞,畳,疂,疉,疊,眣,眰,碟,絰,绖,耊,耋,胅,臷,艓,苵,蜨,蝶,褋,褺,詄,諜,谍,趃,跌,蹀,迭,镻,鰈,鲽,㑙,㥈,㦶,㩸,㩹,㫼,㬪,㭯,㲲,㲳,㷸,㻡,䘭,䞇,䞕,䠟,䪥,䮢,䲀,䳀,䴑|rui:叡,壡,枘,桵,橤,汭,瑞,甤,睿,緌,繠,芮,蕊,蕋,蕤,蘂,蘃,蚋,蜹,銳,鋭,锐,㓹,㛱,㪫,㮃,㲊,䅑,䌼,䓲|tun:吞,呑,啍,坉,屯,忳,旽,暾,朜,氽,涒,焞,畽,臀,臋,芚,豘,豚,軘,霕,飩,饨,魨,鲀,黗,㖔,㞘,㩔,㹠,㼊|fou:否,垺,妚,紑,缶,缹,缻,雬,鴀,䳕|shun:吮,瞬,舜,顺,㥧,䀢,䀵,䑞|guo:呙,咼,啯,嘓,囯,囶,囻,国,圀,國,埚,堝,墎,崞,帼,幗,彉,彍,惈,慖,掴,摑,果,椁,楇,槨,淉,漍,濄,猓,瘑,粿,綶,聒,聝,腂,腘,膕,菓,蔮,虢,蜾,蝈,蟈,裹,褁,輠,过,過,郭,鈛,鍋,鐹,锅,餜,馃,馘,㕵,㖪,㚍,㞅,㳀,㶁,䂸,䆐,䐸,䙨,䤋,䬎,䴹|pen:呠,喯,喷,噴,歕,湓,濆,瓫,盆,翉,翸,葐|ne:呢,抐,疒,眲,訥,讷,䎪,䭆|m:呣,嘸|huai:咶,坏,壊,壞,徊,怀,懐,懷,槐,櫰,淮,瀤,耲,蘹,蘾,褢,褱,踝,㜳,䈭,䴜|pin:品,嚬,姘,娉,嫔,嬪,拼,朩,榀,汖,牝,玭,琕,矉,礗,穦,聘,薲,貧,贫,頻,顰,频,颦,馪,驞,㰋,䀻|yo:哟,唷,喲|o:哦|shui:哾,帨,楯,橓,水,氵,氺,涗,涚,睡,瞚,瞤,祱,稅,税,脽,蕣,裞,說,説,誰,谁,閖,順,鬊,㽷,䭨|huan:唤,喚,喛,嚾,堚,奂,奐,宦,寏,寰,峘,嵈,幻,患,愌,懁,懽,换,換,擐,攌,桓,梙,槵,欢,欥,歓,歡,洹,浣,涣,渙,漶,澣,澴,烉,焕,煥,狟,獾,环,瑍,環,瓛,痪,瘓,睆,瞣,糫,絙,綄,緩,繯,缓,缳,羦,肒,荁,萈,萑,藧,讙,豢,豲,貆,貛,輐,轘,还,逭,還,郇,酄,鍰,鐶,锾,镮,闤,阛,雈,驩,鬟,鯇,鯶,鰀,鲩,鴅,鵍,鹮,㓉,㕕,㡲,㣪,㦥,㪱,㬇,㬊,㵹,㶎,㹖,㼫,㿪,䀓,䀨,䆠,䈠,䍺,䝠,䥧,䦡,䭴,䮝,䯘,䴟|nou:啂,槈,檽,獳,羺,耨,譨,譳,鎒,鐞,㝹,䅶,䘫,䨲,䰭|ken:啃,垦,墾,恳,懇,掯,肎,肯,肻,裉,褃,豤,貇,錹,㸧|chuai:啜,嘬,揣,膗,踹,㪓,㪜,䦟,䦤,䦷|pa:啪,妑,帊,帕,怕,掱,杷,潖,爬,琶,皅,筢,舥,葩,袙,趴,䯲,䶕|se:啬,嗇,懎,擌,栜,槮,歮,歰,洓,涩,渋,澀,澁,濇,濏,瀒,琗,瑟,璱,瘷,穑,穡,穯,篸,縇,繬,聓,色,裇,襂,譅,轖,銫,鏼,铯,閪,雭,飋,鬙,㒊,㥶,㮦,㱇,㴔,㻭,䉢,䔼,䨛|nie:啮,喦,嗫,噛,嚙,囁,囓,圼,孼,孽,嵲,嶭,巕,帇,惗,捏,揑,摰,敜,枿,槷,櫱,涅,篞,籋,糱,糵,聂,聶,肀,臬,臲,苶,菍,蘖,蠥,讘,踂,踗,踙,蹑,躡,鉩,錜,鎳,鑷,钀,镊,镍,闑,陧,隉,顳,颞,齧,㖖,㘿,㙞,㚔,㜸,㡪,㩶,㮆,㴪,㸎,䂼,䄒,䌜,䜓,䯀,䯅,䯵|n:啱,嗯,莻,鈪,銰,㐻|wai:喎,外,崴,歪,竵,顡,㖞,䠿|miao:喵,妙,媌,嫹,庙,庿,廟,描,杪,淼,渺,玅,眇,瞄,秒,竗,篎,緲,缈,苗,藐,邈,鱙,鶓,鹋,㑤,㠺,㦝,䁧,䅺,䖢|shuo:嗍,妁,搠,朔,槊,欶,烁,爍,獡,矟,硕,碩,箾,蒴,说,鎙,鑠,铄,䀥,䈾,䌃|dia:嗲|cao:嘈,嶆,愺,懆,撡,操,曹,曺,槽,漕,糙,肏,艚,艸,艹,草,蓸,螬,褿,襙,鄵,鏪,騲,鼜,㜖,㯥,䄚,䏆,䐬,䒃,䒑|de:嘚,得,徳,德,恴,悳,惪,淂,的,鍀,锝,㝵,㤫,㥀,㥁,㯖,䙷,䙸|hei:嘿,嬒,潶,黑,黒|kuo:噋,廓,懖,扩,拡,括,挄,擴,栝,桰,濶,穒,筈,萿,葀,蛞,闊,阔,霩,鞟,鞹,韕,頢,髺,鬠,㗥,䟯,䦢,䯺|ca:嚓,囃,擦,攃,礤,礸,遪,䟃,䵽|chuo:嚽,娕,娖,惙,戳,擉,歠,涰,磭,綽,绰,腏,趠,踔,輟,辍,辵,辶,逴,酫,鑡,齪,齱,龊,㚟,㲋,䂐,䃗,䄪,䆯,䇍,䋘,䍳,䓎,䮕|zen:囎,怎,譖,譛,谮,䫈|nin:囜,您,拰,脌,㤛,䋻,䚾,䛘|kun:困,坤,堃,堒,壸,壼,婫,尡,崐,崑,悃,捆,昆,晜,梱,涃,潉,焜,熴,猑,琨,瑻,睏,硱,祵,稇,稛,綑,臗,菎,蜫,裈,裍,裩,褌,醌,錕,锟,閫,閸,阃,騉,髠,髡,髨,鯤,鲲,鵾,鶤,鹍,㩲,㫻,䠅|qun:囷,夋,宭,峮,帬,羣,群,裙,裠,輑,逡,㪊,㿏,䭽|ri:囸,日,釰,鈤,馹,驲,䒤|lve:圙,擽,畧,稤,稥,鋝,鋢,锊,㑼,㔀,㨼,䂮,䌎,䛚,䤣|zhui:坠,墜,娷,惴,椎,沝,甀,畷,硾,礈,笍,綴,縋,缀,缒,膇,諈,贅,赘,轛,追,醊,錐,錣,鑆,锥,隹,餟,騅,骓,鵻,䄌|hang:垳,夯,妔,斻,杭,沆,笐,筕,絎,绗,航,苀,蚢,貥,迒,頏,颃,魧,㤚,䀪,䘕,䟘,䣈,䦳,䲳,䴂|sao:埽,嫂,慅,扫,掃,掻,搔,氉,溞,瘙,矂,繅,缫,臊,颾,騒,騷,骚,髞,鰠,鱢,鳋,㛮,㿋,䐹,䕅,䖣|zang:塟,奘,弉,牂,羘,脏,臓,臟,臧,葬,賍,賘,贓,贜,赃,銺,駔,驵,髒,㘸|zeng:増,增,憎,曽,曾,橧,熷,璔,甑,矰,磳,繒,缯,罾,譄,贈,赠,鄫,鋥,锃,鱛,㽪,䙢,䰝|en:奀,峎,恩,摁,煾,蒽,䅰,䊐,䬶,䭓,䭡|zou:奏,媰,掫,揍,棷,棸,箃,緅,菆,諏,诹,走,赱,邹,郰,鄒,鄹,陬,騶,驺,鯐,鯫,鲰,黀,齺,㔿,㵵,䠫|nv:女,恧,朒,籹,衂,衄,釹,钕,㵖,䖡,䘐,䚼,䶊|nuan:奻,暖,渜,煖,煗,餪,㬉,䎡,䙇|niu:妞,忸,扭,杻,汼,沑,炄,牛,牜,狃,紐,纽,莥,鈕,钮,靵,㺲,䀔,䋴,䏔,䒜|rao:娆,嬈,扰,擾,桡,橈,犪,繞,绕,荛,蕘,襓,遶,隢,饒,饶,㑱,㹛,䫞|niang:娘,嬢,孃,酿,醸,釀,䖆|niao:嫋,嬝,嬲,尿,脲,茑,茒,蔦,袅,裊,褭,鳥,鸟,㒟,㜵,㞙,㠡,㭤,㳮,䃵,䐁,䙚,䦊,䮍|nen:嫩,㜛,㯎,㶧|sun:孙,孫,巺,损,損,搎,榫,槂,潠,狲,猻,畃,笋,筍,箰,簨,荪,蓀,蕵,薞,鎨,隼,飧,飱,鶽,㔼,㡄,㦏,䁚|kuan:宽,寛,寬,梡,欵,款,歀,窽,窾,鑧,髋,髖,㯘,䕀,䤭,䥗,䲌|yen:岃,膶|ang:岇,昂,昻,枊,盎,肮,醠,骯,㦹,㭿,㼜,䀚,䍩,䒢,䩕,䭹,䭺|cen:岑,嵾,梣,涔,笒,膥,㞥,㻸,䃡,䅾,䤁,䨙,䯔,䲋|cuan:巑,撺,攅,攛,櫕,欑,殩,汆,熶,爨,穳,窜,竄,篡,篹,簒,蹿,躥,鑹,㠝,㭫,㵀,㸑,䆘,䰖|te:忑,忒,慝,特,犆,脦,蟘,貣,鋱,铽,㥂,㧹|re:惹,热,熱|den:扥,扽,揼|zhua:抓,檛,爪,簻,膼,髽|shuan:拴,栓,涮,腨,閂,闩,䧠|zhuai:拽,跩|lue:掠,略|shai:晒,曬,筛,篩,簁,簛,㩄,㬠|sen:森|run:橍,润,潤,閏,閠,闰,㠈,䦞|nue:疟,虐|nve:瘧,䖈,䖋,䨋|gei:給,给|miu:繆,缪,謬,谬|neng:能,㲌,㴰,䏻|zei:蠈,賊,贼,鰂,鱡,鲗|fiao:覅|eng:鞥|ng:㕶|chua:䫄';\n\n        $rows = explode('|', $data);\n\n        $pinyins = array();\n        foreach($rows as $v) {\n            list($py, $vals) = explode(':', $v);\n            $chars = explode(',', $vals);\n\n            foreach ($chars as $char) {\n                $pinyins[$char] = $py;\n            }\n        }\n    }\n\n    $str = trim($str);\n    $len = mb_strlen($str, 'UTF-8');\n    $rs = '';\n    for ($i = 0; $i < $len; $i++) {\n        $chr = mb_substr($str, $i, 1, 'UTF-8');\n        $asc = ord($chr);\n        if ($asc < 0x80) { // 0-127\n            if (preg_match($allow_chars, $chr)) { // 用参数控制正则\n                $rs .= $chr; // 0-9 a-z A-Z 空格\n            } else { // 其他字符用填充符代替\n                $rs .= $placeholder;\n            }\n        } else { // 128-255\n            if (isset($pinyins[$chr])) {\n                $rs .= 'first' === $ret_format ? $pinyins[$chr][0] : ($pinyins[$chr] . ' ');\n            } else {\n                $rs .= $placeholder;\n            }\n        }\n\n        if ('one' === $ret_format && '' !== $rs) {\n            return $rs[0];\n        }\n    }\n\n    return rtrim($rs, ' ');\n}"
  },
  {
    "path": "frphp/fr.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | FrPHP { a friendly PHP Framework } \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2018/02\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace frphp;\r\n\r\n// 框架根目录\r\ndefined('CORE_PATH') or define('CORE_PATH', __DIR__);\r\n\r\n// 内核版本信息\r\nconst FrPHP_VERSION     =   '2.1';\r\n\r\n/**\r\n * FrPHP框架核心\r\n */\r\nclass frphp\r\n{\r\n    // 配置内容\r\n    protected $config = [];\r\n\r\n    public function __construct($config)\r\n    {\r\n        $this->config = $config;\r\n\t\t//引入系统配置\r\n\t\t//定义全局常量\r\n\t\t$MyConfig = require(CORE_PATH.'/common/Config.php');\r\n\t\tdefined('APP_DEBUG') or define('APP_DEBUG', isset($config['APP_DEBUG']) ? $config['APP_DEBUG'] : $MyConfig['APP_DEBUG']);\r\n\t\tdefined('Tpl_style') or define('Tpl_style', isset($config['Tpl_style']) ? $config['Tpl_style'] : $MyConfig['Tpl_style']);\r\n\t\tdefined('Tpl_common') or define('Tpl_common', isset($config['Tpl_common']) ? $config['Tpl_common'] : $MyConfig['Tpl_common']);\r\n\t\tdefined('Tpl_template') or define('Tpl_template', isset($config['Tpl_template']) ? $config['Tpl_template'] : $MyConfig['Tpl_template']);\r\n\t\tdefined('APP_HOME') or define('APP_HOME', isset($config['APP_HOME']) ? $config['APP_HOME'] : $MyConfig['APP_HOME']);\r\n\t\tdefined('HOME_MODEL') or define('HOME_MODEL', isset($config['HOME_MODEL']) ? $config['HOME_MODEL'] : $MyConfig['HOME_MODEL']);\r\n\t\tdefined('HOME_CONTROLLER') or define('HOME_CONTROLLER', isset($config['HOME_CONTROLLER']) ? $config['HOME_CONTROLLER'] : $MyConfig['HOME_CONTROLLER']);\r\n\t\tdefined('HOME_VIEW') or define('HOME_VIEW', isset($config['HOME_VIEW']) ? $config['HOME_VIEW'] : $MyConfig['HOME_VIEW']);\r\n\t\tdefined('File_TXT') or define('File_TXT', isset($config['File_TXT']) ? $config['File_TXT'] : $MyConfig['File_TXT']);\r\n\t\tdefined('SessionTime') or define('SessionTime', isset($config['SessionTime']) ? $config['SessionTime'] : $MyConfig['SessionTime']);\r\n\t\tdefined('StopLog') or define('StopLog', isset($config['StopLog']) ? $config['StopLog'] : $MyConfig['StopLog']);\r\n\t\tdefined('DefaultController') or define('DefaultController', isset($config['DefaultController']) ? $config['DefaultController'] : $MyConfig['DefaultController']);\r\n\t\tdefined('DefaultAction') or define('DefaultAction', isset($config['DefaultAction']) ? $config['DefaultAction'] : $MyConfig['DefaultAction']);\r\n\t\tdefined('open_url_route') or define('open_url_route', isset($config['open_url_route']) ? $config['open_url_route'] : $MyConfig['open_url_route']);\r\n\t\tdefined('open_redis_session') or define('open_redis_session', isset($config['open_redis_session']) ? $config['open_redis_session'] : $MyConfig['open_redis_session']);\r\n\t\tdefined('Cache_Path') or define('Cache_Path', isset($config['Cache_Path']) ? $config['Cache_Path'] : $MyConfig['Cache_Path']);\r\n\t\tdefined('Session_Path') or define('Session_Path', isset($config['Session_Path']) ? $config['Session_Path'] : $MyConfig['Session_Path']);\r\n\t\tdefined('APP_LANG') or define('APP_LANG', isset($config['APP_LANG']) ? $config['APP_LANG'] : $MyConfig['APP_LANG']);\r\n\t\tdefined('APP_LANG_REQUREST') or define('APP_LANG_REQUREST', isset($config['APP_LANG_REQUREST']) ? $config['APP_LANG_REQUREST'] : $MyConfig['APP_LANG_REQUREST']);\r\n\t\tdefined('ROOT') or define('ROOT', isset($config['ROOT']) ? $config['ROOT'] : $MyConfig['ROOT']);\r\n\t\tdefined('File_TXT_HIDE') or define('File_TXT_HIDE', isset($config['File_TXT_HIDE']) ? $config['File_TXT_HIDE'] : $MyConfig['File_TXT_HIDE']);\r\n\t\tdefined('CLASS_HIDE_SLASH') or define('CLASS_HIDE_SLASH', isset($config['CLASS_HIDE_SLASH']) ? $config['CLASS_HIDE_SLASH'] : $MyConfig['CLASS_HIDE_SLASH']);\r\n\t\t//引入系统函数\r\n\t\trequire(CORE_PATH.'/common/Functions.php');\r\n\t\t//引入项目函数\r\n\t\t$ext_fun = APP_PATH.'conf/Functions.php';\r\n\t\tif(file_exists($ext_fun)){\r\n\t\t\trequire($ext_fun);\r\n\t\t}\r\n\t\t//引入扩展函数\r\n\t\t$Extend = scandir(CORE_PATH.'/extend');\r\n\t\t//var_dump($Extend);\r\n\t\tforeach($Extend as $v){\r\n\t\t\tif(strpos($v,'.php')!==false){\r\n\t\t\t\tinclude  CORE_PATH.'/extend/'.$v;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t//检查缓存文件是否存在\r\n\t\tif(!is_dir(Cache_Path)){\r\n\t\t\tmkdir(Cache_Path);\r\n\t\t}\r\n\t\tif(!is_dir(Cache_Path.'/tmp')){\r\n\t\t\tmkdir(Cache_Path.'/tmp');\r\n\t\t}\r\n\t\t\r\n\t\t//设置时区\r\n\t\t@date_default_timezone_set('PRC');\r\n    }\r\n\r\n    // 运行程序\r\n    public function run()\r\n    {\r\n        spl_autoload_register(array($this, 'loadClass'));\r\n\t\t$this->setDbConfig();\r\n        $this->setReporting();\r\n        $this->removeMagicQuotes();\r\n        //$this->unregisterGlobals();\r\n        $this->route();\r\n\t\t\r\n    }\r\n\r\n    // 路由处理\r\n    public function route()\r\n    {\r\n\t\t\r\n\t\t//读取系统配置\r\n\t\t$webconfig = getCache('webconfig');\r\n\t\tif( !isset($webconfig['closesession']) || (isset($webconfig['closesession']) && $webconfig['closesession']==0) || APP_HOME=='app/admin'){\r\n\t\t\t//检查是否开启redis_session ---2019/09/05 留恋风\r\n            if(open_redis_session || (isset($webconfig['openredis']) && $webconfig['openredis'])){\r\n\t\t\t\t$session = new \\SessionRedis($this->config['redis']);\r\n\t\t\t\tsession_set_save_handler($session,true);\r\n\t\t\t\tif (!isset($_COOKIE['PHPSESSID'])) {\r\n\t\t\t\t\tsession_set_cookie_params($this->config['redis']['EXPIRE']);\r\n\t\t\t\t\tif(!session_id()){ session_start();}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif(!session_id()){ session_start();}\r\n\t\t\t\t\tsetcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + $this->config['redis']['EXPIRE'],'/',\"\",\"\",true);\r\n\t\t\t\t}\r\n\t\t\t\t//全局Redis\r\n                $redis = new \\Redis();\r\n                $redis->connect($this->config['redis']['HOST'],$this->config['redis']['PORT']);\r\n                if($this->config['redis']['AUTH']){\r\n                    $redis->auth($this->config['redis']['AUTH']);\r\n                }\r\n                $GLOBALS['Redis'] = $redis;\r\n                if(!$GLOBALS['Redis']){\r\n                    exit('请检查Redis配置是否正确！');\r\n                }\r\n\t\t\t}else{\r\n\t\t\t\t\r\n\t\t\t\t//开启SESSION,并设置600s缓存时间\r\n\t\t\t\tstart_session(SessionTime);\r\n\t\t\t\t$session = new \\FrSession(array('save_path'=>Session_Path,'life_time'=>SessionTime));\r\n\t\t\t\tsession_set_save_handler($session,true);\r\n\t\t\t\tif (!isset($_COOKIE['PHPSESSID'])) {\r\n\t\t\t\t\tsession_set_cookie_params(SessionTime);\r\n\t\t\t\t\tif(!session_id()){ session_start();}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif(!session_id()){ session_start();}\r\n\t\t\t\t\tsetcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + SessionTime,'/',\"\",\"\",true);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif(isset($_SERVER['argv']) && !isset($_SERVER['REQUEST_URI'])){\r\n\t\t\t$url = urldecode($_SERVER['argv'][1]);\r\n\t\t}else{\r\n\t\t\t$url = urldecode($_SERVER['REQUEST_URI']);\r\n\t\t}\r\n      \t//读取系统配置\r\n\t\t$webconfig = getCache('webconfig');\r\n\t\tif(!$webconfig){\r\n\t\t\t$wcf = M('sysconfig')->findAll();\r\n\t\t\t$webconfig = array();\r\n\t\t\tforeach($wcf as $k=>$v){\r\n\t\t\t\tif($v['field']=='web_js' || $v['field']=='ueditor_config'){\r\n\t\t\t\t\t$v['data'] = html_decode($v['data']);\r\n\t\t\t\t}\r\n\t\t\t\t$webconfig[$v['field']] = $v['data'];\r\n\t\t\t}\r\n\t\t\tsetCache('webconfig',$webconfig);\r\n\t\t}\r\n\t\tif($webconfig){\r\n\t\t\tif($webconfig['iswap']==1){\r\n\t\t\t\t$webconfig['mobile_html'] = $webconfig['mobile_html']=='' ? '/' : $webconfig['mobile_html'];\r\n\t\t\t\t$url = str_replace('/'.$webconfig['mobile_html'].'/','/',$url);\r\n\t\t\t}\r\n\t\t\t$url = str_replace('/'.$webconfig['pc_html'].'/','/',$url);\r\n\t\t}\r\n\t\t//引入自定义路由\r\n\t\t\r\n\t\t$route_ok = false;\r\n\t\t\r\n\t\t$method = '';\r\n\t\tif(open_url_route){\r\n\t\t\t$open_url_route = include (APP_PATH.'conf/route.php');\r\n\t\t\t$urls = '';\r\n\t\t\tforeach($open_url_route as $k=>$v){\r\n\t\t\t\tif($v!='' && $v[0]!='' && $v[1]!=''){\r\n\t\t\t\t\t$route_ok = preg_match_all($v[0],$url,$matches);\r\n\t\t\t\t\t$urls = $v[1];\r\n\t\t\t\t\t$method = strtoupper($v[2]);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif($route_ok){\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif($route_ok){\r\n\t\t\t\t//print_r($matches);\r\n\t\t\t\tforeach($matches as $k=>$v){\r\n\t\t\t\t\t$urls = str_replace('$'.$k,$v[0],$urls);\r\n\t\t\t\t}\r\n\t\t\t\t$url = $urls;\r\n\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$position = strpos($url,'?');\r\n\t\t\tif($position!==false){\r\n\t\t\t\t$param = substr($url,$position+1);\r\n\t\t\t\tparse_str($param,$_GET);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\t$open_url_route = [];\r\n\t\t\t\r\n\t\t}\r\n\t\t\r\n\t\t//去除二级目录\r\n\t\t$url = str_replace(ROOT,'/',$url);\r\n\t\t$url = format_param($url,6);\r\n\t\tdefine('REQUEST_URI',$url);\r\n        $controllerName = DefaultController;\r\n        $actionName = DefaultAction;\r\n        $param = array();\r\n\t\t$tpl = get_template();\r\n\t\tdefine('TEMPLATE',$tpl);\r\n        // 清除?之后的内容\r\n        $position = strpos($url, '?');\r\n        $url = $position === false ? $url : substr($url, 0, $position);\r\n\t\t//删除入口文件字符串\r\n\t\tif(stripos($url,'.php')!==false){\r\n\t\t\t//获取入口文件\r\n            $ds = stripos($url,'.php');\r\n            if(stripos($url,ADMIN_MODEL)!==false){\r\n                define('APP_URL',substr($url,0,($ds+4)).'/'.ADMIN_MODEL);\r\n                $url = str_replace(ADMIN_MODEL,'',$url);\r\n            }else{\r\n                define('APP_URL',substr($url,0,($ds+4)));\r\n            }\r\n            $url = substr(strstr($url,'.php'),4);\r\n\t\t}else{\r\n            define('APP_URL','/index.php');\r\n        }\r\n\t\t//去除最后的.html后缀\r\n\t\tif(stripos($url,'.html')!==false){\r\n\t\t\t$url = str_ireplace('.html','',$url);\r\n\t\t}\r\n\t\t\r\n        // 删除前后的“/”\r\n        $url = trim($url, '/');\r\n        if ($url){\r\n            // 使用“/”分割字符串，并保存在数组中\r\n            $urlArray = explode('/', $url);\r\n            // 删除空的数组元素\r\n            //$urlArray = array_filter($urlArray);\r\n\t\t\tforeach($urlArray as $k=>$v){\r\n\t\t\t\tif($v!=''){\r\n\t\t\t\t\t$urlArray[$k] = $v;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// 获取控制器名\r\n\t\t\t$controllerName = ucfirst($urlArray[0]);\r\n\t\t\t// 获取动作名\r\n\t\t\tarray_shift($urlArray);\r\n\t  \r\n            $actionName = $urlArray ? $urlArray[0] : $actionName;\r\n            \r\n            // 获取URL参数\r\n            array_shift($urlArray);\r\n            $param = $urlArray ? $urlArray : array();\r\n\t\t\t\r\n        }\r\n\t\t\r\n\t\t\r\n\t\t// 判断插件中是否存在控制器和操作--2019/2/15 by 留恋风\r\n        $app_home = str_replace('/','\\\\',APP_HOME);\r\n        $controller = $app_home.'\\\\plugins\\\\'. $controllerName . 'Controller';\r\n\t\tif (!class_exists($controller) || !method_exists($controller, $actionName)) {\r\n\r\n\t\t\t// 不存在插件，则进入系统默认控制器\r\n            // 判断控制器和操作是否存在\r\n\t\t\t$controller = $app_home.'\\\\'.HOME_CONTROLLER.'\\\\'. $controllerName . 'Controller';\r\n\t\t\tif (!class_exists($controller)) {\r\n\t\t\t\t$controllerName = 'Home';\r\n                $controller = $app_home.'\\\\'.HOME_CONTROLLER.'\\\\HomeController';\r\n           \r\n            }\r\n            //规定前台数据统一到jizhi里面处理\r\n            if(APP_URL=='/index.php'){\r\n                if (!method_exists($controller, $actionName)) {\r\n                   $actionName = 'jizhi';\r\n\t\t\t\t   //Error_msg('方法不存在！');\r\n                }  \r\n            }else{\r\n                if (!method_exists($controller, $actionName)) {\r\n                    Error_msg('方法不存在！');\r\n                }\r\n            }\r\n\r\n            if($controllerName=='Home' && $actionName=='jizhi'){\r\n            \tif(method_exists($app_home.'\\\\plugins\\\\HomeController', 'jizhi')){\r\n\t\t\t\t\t$controller = $app_home.'\\\\plugins\\\\HomeController';\r\n\t\t\t\t\t$actionName = 'jizhi';\r\n\t\t\t\t}\r\n            }\r\n\r\n        }\r\n        //定义全局控制器及方法常量\r\n\t\tdefine('APP_CONTROLLER',$controllerName);\r\n        define('APP_ACTION',$actionName);\r\n        \r\n\t\tif(open_url_route && $route_ok){\r\n\t\t\tswitch($method){\r\n\t\t\t\tcase 'GET':\r\n\t\t\t\t$param = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET;\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 'POST':\r\n\t\t\t\t$param = $_POST;\r\n\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t//Error_msg('路由配置错误！传输方式未填写或者不正确！请检查Conf/route.php');\r\n\t\t\t\t\t$_GET = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET;\r\n\t\t\t\t\t$param = (count($_GET)>0) ? array_merge($_GET,$_REQUEST) : $_REQUEST;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\r\n\t\t}else{\r\n\t\t\t$_GET = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET;\r\n\t\t\t$param = (count($_GET)>0) ? array_merge($_GET,$_REQUEST) : $_REQUEST;\r\n\t\t}\r\n\t\t\r\n\t\t//读Hook数据缓存\r\n\t\t$hookconfig = getCache('hook');\r\n\t\tif(!$hookconfig){\r\n\t\t\t//Hook插件注册--缓存整个插件表数据\r\n\t\t\t$hookconfig = M('hook')->findAll(array('isopen'=>1),'orders desc');\r\n\t\t\tsetCache('hook',$hookconfig);\r\n\t\t}\r\n\t\t\r\n\t\tif($hookconfig){\r\n\t\t\tforeach($hookconfig as $v){\r\n\t\t\t\tif(\"app\\\\\".$v['module']==$app_home && $v['controller']==APP_CONTROLLER && (strpos(','.$v['action'].',',','.APP_ACTION.',')!==false || $v['all_action']==1)){\r\n\t\t\t\t\t$newhook_controller = '\\\\app\\\\'.$v['module'].'\\\\plugins\\\\'.$v['hook_controller'].'Controller';\r\n\t\t\t\t\tif(class_exists($newhook_controller)){\r\n\t\t\t\t\t\t$newhook = new $newhook_controller($param);\r\n\t\t\t\t\t\t$hook_action = $v['hook_action'];\r\n\t\t\t\t\t\t$newhook->$hook_action($param);\r\n\t\t\t\t\t\t$newhook = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\t$dispatch = new $controller($param);\r\n\t\t$dispatch->$actionName($param);\r\n       \r\n\t\t\r\n\t\t\r\n\t\t\r\n    }\r\n\t\r\n\t//将链接参数转为GET传值\r\n\tpublic function stringGet($urlarray){\r\n\t\t$data = array();\r\n\t\tforeach($urlarray as $k=>$v){\r\n\t\t\tif(($k+1)%2==1){\r\n\t\t\t\tif(!isset($urlarray[$k+1])){$urlarray[$k+1]=null;}\r\n\t\t\t\t$data[$v] = $urlarray[$k+1];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn $data;\r\n\t\r\n\t\r\n\t}\r\n\t\r\n\r\n    // 检测开发环境\r\n    public function setReporting()\r\n    {\r\n\t\tini_set(\"session.cookie_httponly\", 1);\r\n        if (APP_DEBUG === true) {\r\n            //error_reporting(E_ALL);\r\n\t\t\terror_reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED);\r\n            ini_set('display_errors','On');\r\n        } else {\r\n            error_reporting(0);\r\n            ini_set('display_errors','Off');\r\n            ini_set('log_errors', 'On');\r\n        }\r\n    }\r\n\r\n    // 删除敏感字符\r\n    public function stripSlashesDeep($value)\r\n    {\r\n        $value = is_array($value) ? array_map(array($this, 'stripSlashesDeep'), $value) : stripslashes($value);\r\n        return $value;\r\n    }\r\n\r\n    // 检测敏感字符并删除\r\n    public function removeMagicQuotes()\r\n    {\r\n        $_GET = isset($_GET) ? $this->stripSlashesDeep($_GET ) : '';\r\n\t\t$_POST = isset($_POST) ? $this->stripSlashesDeep($_POST ) : '';\r\n\t\t$_COOKIE = isset($_COOKIE) ? $this->stripSlashesDeep($_COOKIE) : '';\r\n\t\t$_SESSION = isset($_SESSION) ? $this->stripSlashesDeep($_SESSION) : '';\r\n    }\r\n\r\n    // 检测自定义全局变量并移除。因为 register_globals 已经弃用，如果\r\n    // 已经弃用的 register_globals 指令被设置为 on，那么局部变量也将\r\n    // 在脚本的全局作用域中可用。 例如， $_POST['foo'] 也将以 $foo 的\r\n    // 形式存在，这样写是不好的实现，会影响代码中的其他变量。 相关信息，\r\n    // 参考: http://php.net/manual/zh/faq.using.php#faq.register-globals\r\n    public function unregisterGlobals()\r\n    {\r\n        if (ini_get('register_globals')) {\r\n            $array = array('_SESSION', '_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');\r\n            foreach ($array as $value) {\r\n                foreach ($GLOBALS[$value] as $key => $var) {\r\n                    if ($var === $GLOBALS[$key]) {\r\n                        unset($GLOBALS[$key]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // 配置数据库信息\r\n    public function setDbConfig()\r\n    {\r\n        if ($this->config['db']) {\r\n            define('DB_HOST', $this->config['db']['host']);\r\n            define('DB_NAME', $this->config['db']['dbname']);\r\n            define('DB_PREFIX', $this->config['db']['prefix']);\r\n            define('DB_USER', $this->config['db']['username']);\r\n            define('DB_PASS', $this->config['db']['password']);\r\n            define('DB_PORT', $this->config['db']['port']);\r\n\t\t\tif(DB_HOST=='' || DB_NAME=='' || DB_USER=='' || DB_PASS==''){\r\n\t\t\t\texit('<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />数据库无法链接，如果您是第一次使用，请先执行<a href=\"/install/\">安装程序</a><br /><br /><a href=\"http://jizhicms.com\" target=\"_blank\">极致CMS建站程序 jizhicms.com</a>');\r\n\t\t\t}\r\n\t\t\t\r\n        }\r\n\t\t\r\n    }\r\n\r\n    // 自动加载类\r\n    public function loadClass($className)\r\n    {\r\n        $classMap = $this->classMap();\r\n\r\n        if (isset($classMap[$className])) {\r\n            // 包含内核文件\r\n            $file = $classMap[$className];\r\n        } elseif (strpos($className, '\\\\') !== false) {\r\n            // 包含应用（application目录）文件\r\n            $file = APP_PATH . str_replace('\\\\', '/', $className) . '.php';\r\n            if (!is_file($file)) {\r\n                return;\r\n            }\r\n        } else {\r\n            return;\r\n        }\r\n\r\n        include $file;\r\n\r\n        // 这里可以加入判断，如果名为$className的类、接口或者性状不存在，则在调试模式下抛出错误\r\n    }\r\n\r\n    // 内核文件命名空间映射关系\r\n    protected function classMap()\r\n    {\r\n        return [\r\n            'frphp\\lib\\Controller' => CORE_PATH . '/lib/Controller.php',\r\n            'frphp\\lib\\Model' => CORE_PATH . '/lib/Model.php',\r\n            'frphp\\lib\\View' => CORE_PATH . '/lib/View.php',\r\n            'frphp\\db\\DBholder' => CORE_PATH . '/db/DBholder.php',\r\n            \r\n        ];\r\n    }\r\n}\r\n\r\n// 加载配置文件\r\n$config = require(APP_PATH . 'conf/config.php');\r\n\r\n\r\n$url = urldecode($_SERVER['REQUEST_URI']);\r\n\r\ndefined('ADMIN_MODEL') or define('ADMIN_MODEL', 'admins');\r\n\r\n//判断是否后台入口\r\nif(strpos($url,'/index.php/'.ADMIN_MODEL)!==false || (defined('APP_HOME') && APP_HOME=='app/admin')){\r\n    //后台\r\n    //定义项目目录\r\n    defined('APP_HOME') or define('APP_HOME', 'app/admin');\r\n    //定义项目模板文件目录\r\n    defined('HOME_VIEW') or define('HOME_VIEW', 't');\r\n    defined('Tpl_template') or define('Tpl_template', 'tpl');\r\n    //定义项目控制器文件目录\r\n    defined('HOME_CONTROLLER') or define('HOME_CONTROLLER', 'c');\r\n\r\n    //定义项目模型文件目录\r\n    defined('HOME_MODEL') or define('HOME_MODEL', 'm');\r\n\r\n    //定义项目默认方法\r\n    defined('DefaultController') or define('DefaultController', 'Index');\r\n\r\n    defined('DefaultAction') or define('DefaultAction', 'index');\r\n\r\n    //定义静态文件路径\r\n    defined('Tpl_style') or define('Tpl_style', '/app/admin/t/tpl');\r\n}else{\r\n    //前台\r\n    //定义项目目录\r\n    defined('APP_HOME') or define('APP_HOME', 'app/home');\r\n    //定义模板文件夹\r\n    defined('TPL_PATH') or define('TPL_PATH', 'static');\r\n\r\n    //定义项目模板文件目录\r\n    defined('HOME_VIEW') or define('HOME_VIEW', '');\r\n\r\n    //定义项目模板公共文件目录\r\n    defined('Tpl_common') or define('Tpl_common', '');\r\n\r\n    //定义项目控制器文件目录\r\n    defined('HOME_CONTROLLER') or define('HOME_CONTROLLER', 'c');\r\n\r\n    //定义项目模型文件目录\r\n    defined('HOME_MODEL') or define('HOME_MODEL', 'm');\r\n\r\n    //定义模板文件后缀\r\n    defined('File_TXT') or define('File_TXT', '.php');\r\n\r\n    //定义项目默认方法\r\n    defined('DefaultAction') or define('DefaultAction', 'jizhi');\r\n\r\n    //定义静态文件路径\r\n    defined('Tpl_style') or define('Tpl_style', '/static/');\r\n}\r\nheader_remove('X-Powered-By');\r\n//实例化核心类\r\n(new frphp($config))->run();"
  },
  {
    "path": "frphp/lib/Controller.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | FrPHP { a friendly PHP Framework } \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2018/02\r\n// +----------------------------------------------------------------------\r\n\r\n\r\nnamespace frphp\\lib;\r\n\r\n/**\r\n * 控制器基类\r\n */\r\nclass Controller\r\n{\r\n    protected $_controller;\r\n    protected $_action;\r\n    protected $_view;\r\n    protected $_data;\r\n\r\n    // 构造函数，初始化属性，并实例化对应模型\r\n    public function __construct($param=null)\r\n    {\r\n        $this->_controller = APP_CONTROLLER;\r\n        $this->_action = APP_ACTION;\r\n\t\t$this->_data = $param;\r\n\t\t//对语言包获取优先处理\r\n\t\tif(!empty($_REQUEST) && isset($_REQUEST[APP_LANG_REQUREST])){\r\n\t\t\t$_SESSION['lang'] = $_REQUEST[APP_LANG_REQUREST];\r\n            define('LANG',$_SESSION['lang']);\r\n\t\t}else if(isset($_SESSION['lang'])){\r\n            define('LANG',$_SESSION['lang']);\r\n        }else{\r\n\t\t\tdefine('LANG',APP_LANG);\r\n\t\t}\r\n\t\t\r\n        $this->_view = new View(APP_CONTROLLER, APP_ACTION);\r\n\t\t$this->_init();\r\n\t\t\r\n    }\r\n\t// 自动调用方法\r\n\tpublic function _init(){\r\n\t\t\r\n\t}\r\n\r\n    // 分配变量\r\n\tpublic function __set($name, $value)\r\n\t{\r\n\t\t $this->$name = $value;\r\n\t\t $this->_view->assign($name, $value);\r\n\t\t\r\n\t}\r\n    public function assign($name, $value)\r\n    {\r\n\t\t\r\n        $this->_view->assign($name, $value);\r\n    }\r\n\r\n    // 渲染视图\r\n    public function display($name=null)\r\n    {\r\n        $this->_view->render($name);\r\n    }\r\n\t\r\n\t// 获取URL参数值\r\n\tpublic function frparam($str=null, $int=0,$default = FALSE, $method = null){\r\n\t\t\r\n\t\t$data = $this->_data;\r\n\t\tif($str===null) return $data;\r\n\t\tif(!array_key_exists($str,$data)){\r\n\t\t\treturn ($default===FALSE)?false:$default;\r\n\t\t}\r\n\t\t\r\n\t\tif($method===null){\r\n\t\t\t$value = $data[$str];\r\n\t\t}else{\r\n\t\t\t$method = strtolower($method);\r\n\t\t\tswitch($method){\r\n\t\t\t\tcase 'get':\r\n\t\t\t\t$value = $_GET[$str];\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 'post':\r\n\t\t\t\t$value = $_POST[$str];\r\n\t\t\t\tbreak;\r\n\t\t\t\tcase 'cookie':\r\n\t\t\t\t$value = $_COOKIE[$str];\r\n\t\t\t\tbreak;\r\n\t\t\t\t\r\n\t\t\t} \r\n\t\t}\r\n\t\t\r\n\t\treturn format_param($value,$int,$default);\r\n\t\t\r\n\t\t\r\n\t}\r\n\t\r\n\r\n\r\n}"
  },
  {
    "path": "frphp/lib/Model.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2018/03/15\n// +----------------------------------------------------------------------\n\n\nnamespace frphp\\lib;\nuse frphp\\db\\DBholder;\nuse PDO;\nclass Model {\n\tprotected $model;\n\tprotected static $table;\n    protected $primary = 'id';\n\tprivate $db;\n\tprivate static $instance=false;//不支持单例模式\n\t\n\tpublic function __construct(){\n\t\t$this->db = DBholder::getInstance();\n\t}\n\t\n\tpublic static function getInstance($table = null,$prefix = 1){\n\t\tif(self::$instance===false){\n\t\t\tself::$instance = new self($table);\n\t\t}\n\t\tif($table!=null){\n\t\t\tself::$table = $table;\n\t\t}\n\t\tif($prefix){\n\t\t\tself::$table = DB_PREFIX.strtolower(self::$table);\n\t\t}else{\n\t\t\tself::$table = self::$table;\n\t\t}\n\t\t\n\t\t\n\t\treturn self::$instance;\n\t}\n\t\n\t//查询数据条数\n\tpublic function getCount($conditions=null){\n\t\t$where = '';\n\t\tif(is_array($conditions)){\n\t\t\t$conditions = $this->__prepera_format($conditions);\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $value ){\n                if(is_array($value)){\n                    $va =  '\\''.$value[1].'\\'';\n                    $join[] = \"{$key} \".$value[0].\" {$va}\";\n                }else{\n                    $value =  '\\''.$value.'\\'';\n                    $join[] = \"{$key} = {$value}\";\n                }\n\t\t\t}\n\t\t\tif(count($join)){\n\t\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t\t}\n\t\t\t\n\t\t}else{\n\t\t\tif(null != $conditions) $where = \"WHERE \".$conditions;\n\t\t}\n\t\t$table = self::$table;\n\t\t$sql = \"SELECT count(*) as Frcount FROM {$table} {$where}\";\n        $result = $this->db->getArray($sql);\n\t\treturn $result[0]['Frcount'];\n\t\t\n\t}\n\t\n\t//递增数据\n\tpublic function goInc($conditions,$field,$vp=1){\n\t\t$where = \"\";\n\t\tif(is_array($conditions)){\n\t\t\t$conditions = $this->__prepera_format($conditions);\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $value ){\n                if(is_array($value)){\n                    $va =  '\\''.$value[1].'\\'';\n                    $join[] = \"{$key} \".$value[0].\" {$va}\";\n                }else{\n                    $value =  '\\''.$value.'\\'';\n                    $join[] = \"{$key} = {$value}\";\n                }\n\t\t\t}\n\t\t\tif(count($join)){\n\t\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t\t}\n\t\t}else{\n\t\t\tif(null != $conditions)$where = \"WHERE \".$conditions;\n\t\t}\n\t\t$values = \"{$field} = {$field} + {$vp}\";\n\t\t$table = self::$table;\n\t\t$sql = \"UPDATE {$table} SET {$values} {$where}\";\n\t\t\n\t\treturn $this->runSql($sql);\n\t\t\n\t}\n\t\n\t//递减\n\tpublic function goDec($conditions,$field,$vp=1){\n\t\treturn $this->goInc($conditions,$field,-$vp);\n\t}\n\t    // 修改数据\n    public function update($conditions=null,$row=null)\n    {\n        $where = \"\";\n\t\t$row = $this->__prepera_format($row);\n\t\tif(empty($row))return FALSE;\n\t\tif(is_array($conditions)){\n\t\t\t$conditions = $this->__prepera_format($conditions);\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $value ){\n                if(is_array($value)){\n                    $va =  '\\''.$value[1].'\\'';\n                    $join[] = \"{$key} \".$value[0].\" {$va}\";\n                }else{\n                    $value =  '\\''.$value.'\\'';\n                    $join[] = \"{$key} = {$value}\";\n                }\n\t\t\t}\n\t\t\tif(count($join)){\n\t\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t\t}\n\t\t}else{\n\t\t\tif(null != $conditions)$where = \"WHERE \".$conditions;\n\t\t}\n\t\tforeach($row as $key => $value){\n\t\t\tif($value!==null){\n\t\t\t\t$value = '\\''.$value.'\\'';\n\t\t\t\t$vals[] = \"{$key} = {$value}\";\n\t\t\t}else{\n\t\t\t\t$vals[] = \"{$key} = null\";\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t$values = join(\", \",$vals);\n\t\t$table = self::$table;\n\t\t$sql = \"UPDATE {$table} SET {$values} {$where}\";\n\t\treturn $this->runSql($sql);\n\t\t\n\t\t\n    }\n\t\n\tpublic function updateMuti($conditions=null,$rows=null){\n\t\t\n\t\tif(count($conditions)!=count($rows)){\n\t\t\tthrow new Exception('数组不匹配');\n\t\t\treturn false;\n\t\t}\n\t\t$whereArr = [];\n\t\tforeach($conditions as $condition){\n\t\t\t\n\t\t\tif(is_array($condition)){\n\t\t\t\t$condition = $this->__prepera_format($condition);\n\t\t\t\t$join = array();\n\t\t\t\tforeach( $condition as $key => $value ){\n                    if(is_array($value)){\n                        $va =  '\\''.$value[1].'\\'';\n                        $join[] = \"{$key} \".$value[0].\" {$va}\";\n                    }else{\n                        $value =  '\\''.$value.'\\'';\n                        $join[] = \"{$key} = {$value}\";\n                    }\n\t\t\t\t}\n\t\t\t\tif(count($join)){\n\t\t\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tif(null != $condition)$where = \"WHERE \".$condition;\n\t\t\t}\n\t\t\t\n\t\t\t$whereArr[] = $where;\n\t\t}\n\t\t\n\t\t$valuesArr = [];\n\t\tforeach($rows as $row){\n\t\t\t$row = $this->__prepera_format($row);\n\t\t\tif(!empty($row)){\n\t\t\t\t\n\t\t\t\tforeach($row as $key => $value){\n\t\t\t\t\tif($value!==null){\n\t\t\t\t\t\t$value = '\\''.$value.'\\'';\n\t\t\t\t\t\t$vals[] = \"{$key} = {$value}\";\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$vals[] = \"{$key} = null\";\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t$values = join(\", \",$vals);\n\t\t\t\t\n\t\t\t\t$valuesArr[]=$values;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t}\n\t\tif(count($whereArr)!=count($valuesArr)){\n\t\t\tthrow new Exception('数组不匹配');\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t$sqlArr=[];\n\t\t$table = self::$table;\n\t\tforeach($whereArr as $k=>$where){\n\t\t\t$sqlArr[] = \"UPDATE {$table} SET {$valuesArr[$k]} {$where};\";\n\t\t\t\n\t\t}\n\t\t$sql=implode('',$sqlArr);\n\t\treturn $this->runSql($sql);\n\t}\n\n\n    // 查询所有\n    public function findAll($conditions=null,$order=null,$fields=null,$limit=null)\n    {\n\t\t$where = '';\n\t\tif(is_array($conditions)){\n\t\t\t$conditions = $this->__prepera_format($conditions);\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $value ){\n                if(is_array($value)){\n                    $va =  '\\''.$value[1].'\\'';\n                    $join[] = \"{$key} \".$value[0].\" {$va}\";\n                }else{\n                    $value =  '\\''.$value.'\\'';\n                    $join[] = \"{$key} = {$value}\";\n                }\n\t\t\t}\n\t\t\tif(count($join)){\n\t\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t\t}\n\t\t}else{\n\t\t\tif(null != $conditions)$where = \"WHERE \".$conditions;\n\t\t}\n      if(is_array($order)){\n       \t\t$where .= ' ORDER BY ';\n            $where .= implode(',', $order);\n      }else{\n         if($order!=null)$where .= \" ORDER BY  \".$order;\n      }\n\t\t\n\t\tif(!empty($limit)){\n\t\t\tif(strpos($limit,',')===false){\n\t\t\t\t$limit = ($limit<=0) ? 1 : $limit;\n\t\t\t}\n\t\t\t$where .= \" LIMIT {$limit}\";\n\t\t}\n\t\t$fields = empty($fields) ? \"*\" : $fields;\n\t\t$table = self::$table;\n\t\t$sql = \"SELECT {$fields} FROM {$table} {$where}\";\n\t\t\n        return $this->db->getArray($sql);\n\n    }\n\n    //分页查询\n    public function findPage($conditions=null,$order=null,$fields=null,$limit=null)\n    {\n        $where = '';\n        if(is_array($conditions)){\n            $conditions = $this->__prepera_format($conditions);\n            $join = array();\n            foreach( $conditions as $key => $value ){\n                if(is_array($value)){\n                    $va =  '\\''.$value[1].'\\'';\n                    $join[] = \"{$key} \".$value[0].\" {$va}\";\n                }else{\n                    $value =  '\\''.$value.'\\'';\n                    $join[] = \"{$key} = {$value}\";\n                }\n            }\n            if(count($join)){\n                $where = \"WHERE \".join(\" AND \",$join);\n            }\n        }else{\n            if(null != $conditions)$where = \"WHERE \".$conditions;\n        }\n        if(is_array($order)){\n            $where .= ' ORDER BY ';\n            $where .= implode(',', $order);\n        }else{\n            if($order!=null)$where .= \" ORDER BY  \".$order;\n        }\n\n        if(!empty($limit)){\n            if(strpos($limit,',')===false){\n                $limit = ($limit<=0) ? 1 : $limit;\n            }\n            $where .= \" LIMIT {$limit}\";\n        }\n        $fields = empty($fields) ? \"*\" : $fields;\n        $table = self::$table;\n        $sql = \"SELECT SQL_CALC_FOUND_ROWS {$fields} FROM {$table} {$where}\";\n\n        $data = $this->db->getArray($sql);\n        $sql = 'SELECT FOUND_ROWS()';\n        $result = $this->db->getArray($sql);\n\n\n        return ['lists'=>$data,'sum'=>$result[0]['FOUND_ROWS()']];\n\n    }\n\n    // 查询一条\n    public function find($where=null,$order=null,$fields=null,$limit=1)\n    {\n\t   if( $record = $this->findAll($where, $order, $fields, 1) ){\n\t\t\treturn array_pop($record);\n\t\t}else{\n\t\t\treturn FALSE;\n\t\t}\n    }\n\t\n\t//获取单一字段内容\n\tpublic function getField($where=null,$fields=null,$orders=null){\n\t\tif( $record = $this->findAll($where, $orders, $fields, 1) ){\n\t\t\t$res = array_pop($record);\n\t\t\treturn $res[$fields];\n\t\t}else{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\t\n\t\n\t//执行 SQL 语句，返回PDOStatement对象,可以理解为结果集\n\tpublic function query($sql){\n\t\treturn $this->db->query();\n\t}\n\t//执行SQL语句返回影响行数\n\tpublic function runSql($sql)\n\t{\n\t\treturn $this->db->exec($sql);\n\t}\n\t\n\t//执行SQL语句函数\n\tpublic function findSql($sql)\n\t{\n\t\treturn $this->db->getArray($sql);\n\t}\n\t//执行SQL获取分页\n    public function findSqlPage($sql,$orderlimit=''){\n        $sql = \"select SQL_CALC_FOUND_ROWS * from (\".$sql.\") a \".$orderlimit;\n        $data = $this->db->getArray($sql);\n        $sql = 'SELECT FOUND_ROWS()';\n        $result = $this->db->getArray($sql);\n        return ['lists'=>$data,'sum'=>$result[0]['FOUND_ROWS()']];\n    }\n\t\n    // 根据条件 (conditions) 删除\n    public function delete($conditions)\n    {\n       $where = \"\";\n\t\tif(is_array($conditions)){\n\t\t\t$conditions = $this->__prepera_format($conditions);\n\t\t\t$join = array();\n\t\t\tforeach( $conditions as $key => $value ){\n                if(is_array($value)){\n                    $va =  '\\''.$value[1].'\\'';\n                    $join[] = \"{$key} \".$value[0].\" {$va}\";\n                }else{\n                    $value =  '\\''.$value.'\\'';\n                    $join[] = \"{$key} = {$value}\";\n                }\n\t\t\t}\n\t\t\tif(count($join)){\n\t\t\t\t$where = \"WHERE \".join(\" AND \",$join);\n\t\t\t}\n\t\t}else{\n\t\t\tif(null != $conditions)$where = \"WHERE ( \".$conditions. \")\";\n\t\t}\n\t\t$table = self::$table;\n\t\t$sql = \"DELETE FROM {$table} {$where}\";\n\t\treturn $this->runSql($sql);\n    }\n\n    // 新增数据\n    public function add($row)\n    {\n       if(!is_array($row))return FALSE;\n\t\t$row = $this->__prepera_format($row);\n\t\tif(empty($row))return FALSE;\n\t\tforeach($row as $key => $value){\n\t\t\tif($value!==null){\n\t\t\t\t$cols[] = $key;\n\t\t\t\t$vals[] = '\\''.$value.'\\'';\n\t\t\t}\n\t\t}\n\t\t$col = join(',', $cols);\n\t\t$val = join(',', $vals);\n\t\t$table = self::$table;\n\t\t$sql = \"INSERT INTO {$table} ({$col}) VALUES ({$val})\";\n\t\tif( FALSE != $this->runSql($sql) ){\n\t\t\tif( $newinserid = $this->db->lastInsertId() ){\n\t\t\t\treturn $newinserid;\n\t\t\t}else{\n\t\t\t\t$a=$this->find($row, \"{$this->primary} DESC\",$this->primary);\n\t\t\t\treturn array_pop($a);\n\t\t\t}\n\t\t}\n\t\treturn FALSE;\n    }\n\n\t//预处理SQL\n\tprivate function __prepera_format($rows)\n\t{\n\t\t$table = self::$table;\n\t\t$stmt = $this->db->getTable($table);  \n\t\t$stmt->execute();  \n\t\t$columns = $stmt->fetchAll(PDO::FETCH_CLASS);\n\t\t$newcol = array();\n\t\tforeach ($columns as $key => $value) {\n\t\t\t$field = strtolower($value->Field);\n\t\t\tif(stripos($value->Type,'int')!==false || stripos($value->Type,'decimal')!==false){\n\t\t\t\t\n\t\t\t\tif(isset($rows[$field])){\n\t\t\t\t\tif($rows[$field]!=='' && $rows[$field]!==false){\n\t\t\t\t\t\t$newcol[$field] = $rows[$field];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$newcol[$field] = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}else{\n\t\t\t\tif(isset($rows[$field])){\n\t\t\t\t\tif($rows[$field]!=='' && $rows[$field]!==false ){\n\t\t\t\t\t\t$newcol[$field] = $rows[$field];\n\t\t\t\t\t}else{\n\t\t\t\t\t\t$newcol[$field] = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\treturn $newcol;\n\t\t//return array_intersect_key($rows,$newcol);\n\t}\n\t\n\t\n\tpublic function __destruct()\n\t{\n\t  $this->db = null;\n\t}\n\n\t\n\t\n\t\n\t\n\t\n}"
  },
  {
    "path": "frphp/lib/View.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2018/02\n// +----------------------------------------------------------------------\n\n\nnamespace frphp\\lib;\n\nuse frphp\\extend\\Page;\n\n/**\n * 视图基类\n */\nclass View\n{\n    protected $variables = array();\n    protected $_controller;\n    protected $_action;\n    protected $_cachefile;\n\n    function __construct($controller, $action)\n    {\n        $this->_controller = strtolower($controller);\n        $this->_action = strtolower($action);\n    }\n \n    // 分配变量\n    public function assign($name, $value)\n    {\n        //$this->variables[$name] = $value;\n        $GLOBALS[$name] = $value;\n    }\n \n    // 渲染显示\n    public function render($name=null)\n    {\n        if(defined('TPL_PATH')){\n\t\t\t$path = TPL_PATH;\n\t\t}else{\n\t\t\t$path = APP_HOME;\n\t\t}\n\t\tif($name){\n\t\t\tif(strpos($name,'@')!==false){\n\t\t\t\t$controllerLayout =  str_replace('@','',$name);\n\t\t\t}else{\n\t\t\t\t$controllerLayout =  HOME_VIEW ? $path.'/'.HOME_VIEW.'/'.Tpl_template.'/' . $name : $path.'/'.Tpl_template.'/' . $name;\n\t\t\t\t$controllerLayout = (stripos($controllerLayout,File_TXT)!==false || stripos($controllerLayout,'.html')!==false ) ? $controllerLayout : $controllerLayout.File_TXT;\n\t\t\t}\n\t\t\t\n\t\t}else{\n\t\t\t$controllerLayout =  HOME_VIEW ? $path .'/'.HOME_VIEW.'/'.Tpl_template.'/' . strtolower($this->_controller) . '/' . $this->_action : $path .'/'.Tpl_template.'/' . strtolower($this->_controller) . '/' . $this->_action;\n\n\t\t}\n\t\t//去除可能没有的Tpl_template\n        $controllerLayout = str_ireplace(['//','\\\\'],'/',$controllerLayout);\n        //判断视图文件是否存在\n        if (file_exists($controllerLayout)) {\n\t\t\t$this->template($controllerLayout);\n        } else {\n            //兼容自定义扩展和.html模板\n            $controllerLayout = str_replace(File_TXT,'.html',$controllerLayout);\n            if (file_exists($controllerLayout)) {\n                $this->template($controllerLayout);\n            }else{\n                $f = strpos($name,File_TXT)!==false ? $name : $name.File_TXT;\n                Error_msg('无法找到视图文件，页面模板：'.$f);\n            }\n          \n        }\n\t\t\n\t\t\n\t\t\n    }\n\t\n\t//模板解析\n\tpublic function template($controllerLayout){\n\t\t//extract($this->variables);//分配变量到模板中\n\t\textract($GLOBALS);//分配变量到模板中\n\t\t//对路径文件换为缓存目录  '/'换为'-'\n\t\t//$layout = str_ireplace(array(\"//\",\"/\"),'_',$controllerLayout);\n\t\t//$cache_file = str_ireplace('.html','.php',APP_PATH.'/cache/'.$layout);\n\t\t$cache_file = Cache_Path.'/'.md5($controllerLayout).'.php';\n\t\t$this->_cachefile = $cache_file;//传入系统中\n\t\t$now_time = time();\n        if(file_exists($cache_file)){\n            $last_time = filemtime($cache_file);\n        }else{\n            $last_time = 0;\n        }\n\t\t$cache_time = webConf('cache_time') ? webConf('cache_time') : 0;\n\t\t$isclear = 0;\n\t\tif((($now_time - $last_time)/60)>$cache_time){\n\t\t\t$isclear = 1;\n\t\t}\n\t\tif(APP_DEBUG===true){\n\t\t\t$fp_tp=@fopen($controllerLayout,\"r\");\n\t\t\t$fp_txt=@fread($fp_tp,filesize($controllerLayout));\n\t\t\t@fclose($fp_tp);\n\t\t\t$fp_txt=$this->template_html($fp_txt);\n\t\t\t$fp_txt = \"<?php if (!defined('CORE_PATH')) exit();?>\".$fp_txt;\n\t\t\t$fpt_tpl=@fopen($cache_file,\"w\");\n\t\t\t@fwrite($fpt_tpl,$fp_txt);\n\t\t\t@fclose($fpt_tpl);\n\t\t}else if(is_readable($cache_file)!==true || $isclear){\n\t\t\t$fp_tp=@fopen($controllerLayout,\"r\");\n\t\t\t$fp_txt=@fread($fp_tp,filesize($controllerLayout));\n\t\t\t@fclose($fp_tp);\n\t\t\t$fp_txt=$this->template_html($fp_txt);\n\t\t\t$fp_txt = \"<?php if (!defined('CORE_PATH')) exit();?>\".$fp_txt;\n\t\t\t$fpt_tpl=@fopen($cache_file,\"w\");\n\t\t\t@fwrite($fpt_tpl,$fp_txt);\n\t\t\t@fclose($fpt_tpl);\n\t\t}\n\t\t\n\t\tif(is_readable($cache_file)!==true){\n\t\t\t\n\t\t\tError_msg('无法找到模板缓存，请刷新后重试，或者检查cache缓存文件夹权限');\n\n\t\t}\n\t\tinclude $cache_file;\n\t\t\n\t\t\n\t}\n\t\n\t\n\t//模板分解替换\n\tpublic function template_html($content){\n\t\t//include标签\n\t\tpreg_match_all('/\\{include=\\\"(.*?)\\\"\\}/si',$content,$i);\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,$this->template_html_include($i[1][$k]),$content);\n\t\t}\n\t\t//loop标签\n\t\tpreg_match_all('/\\{loop (.*?)\\}/si',$content,$i);\n\t\t$this->check_template_err(substr_count($content, '{/loop}'),count($i[0]),'loop');\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,$this->template_html_loop($i[1][$k]),$content);\n\t\t}\n\t\t$content=str_ireplace('{/loop}','<?php } ?>',$content);\n\t\t//foreach循环\n\t\tpreg_match_all('/\\{foreach(.*?)\\}/si',$content,$i);\n\t\t$this->check_template_err(substr_count($content, '{/foreach}'),count($i[0]),'foreach');\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,$this->template_html_foreach($i[1][$k]),$content);\n\t\t}\n\t\t$content=str_ireplace('{/foreach}','<?php } ?>',$content);\n\t\t//screen标签\n\t\tpreg_match_all('/\\{screen (.*?)\\}/si',$content,$i);\n\t\t$this->check_template_err(substr_count($content, '{/screen}'),count($i[0]),'screen');\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,$this->template_html_screen($i[1][$k]),$content);\n\t\t}\n\t\t$content=str_ireplace('{/screen}','<?php } ?>',$content);\n\t\t//for循环\n\t\tpreg_match_all('/\\{for(.*?)\\}/si',$content,$i);\n\t\t$this->check_template_err(substr_count($content, '{/for}'),count($i[0]),'for');\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,'<?php for('.$i[1][$k].'){ ?>',$content);\n\t\t}\n\t\t$content=str_ireplace('{/for}','<?php } ?>',$content);\n\t\t//if判断\n\t\tpreg_match_all('/\\{if(.*?)\\}/si',$content,$i);\n\t\t$this->check_template_err(substr_count($content, '{/if}'),count($i[0]),'if');\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,'<?php if'.$i[1][$k].'{ ?>',$content);\n\t\t}\t\n\t\t$content=str_ireplace('{else}','<?php }else{ ?>',$content);\n\t\t//else if判断\n\t\tpreg_match_all('/\\{else if(.*?)\\}/si',$content,$i);\n\t\tforeach($i[0] as $k=>$v){\n\t\t$content=str_ireplace($v,'<?php }else if'.$i[1][$k].'{ ?>',$content);\n\t\t}\t\n\t\t$content=str_ireplace('{/if}','<?php } ?>',$content);\n\t\t//PHP函数解析\n\t\tpreg_match_all('/\\{fun (.*?)\\}/si',$content,$i);\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,'<?php echo '.$i[1][$k].' ?>',$content);\n\t\t}\n\t\t//PHP常量解析\n\t\tpreg_match_all('/\\{__(.*?)__}/si',$content,$i);\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,'<?php echo '.$i[1][$k].' ?>',$content);\n\t\t}\n\t\t//PHP标签解析\n\t\tpreg_match_all('/\\{php(.*?)\\/}/si',$content,$i);\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,'<?php  '.$i[1][$k].' ?>',$content);\n\t\t}\n\t\t//PHP变量解析\n\t\tpreg_match_all('/\\{\\$(.*?)\\}/si',$content,$i);\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,'<?php echo $'.$i[1][$k].' ?>',$content);\n\t\t}\n\t\t//标签原样输出\n\t\tpreg_match_all('/\\{!--(.*?)\\--}/si',$content,$i);\n\t\tforeach($i[0] as $k=>$v){\n\t\t\t$content=str_ireplace($v,'{'.$i[1][$k].'}',$content);\n\t\t}\n\t\treturn $content;\n\t}\n\t//引入公共模板\n\tpublic function template_html_include($filename){\n\t\tif(strpos($filename,'.')!==false){\n\t\t\t$prefix = '';\n\t\t}else{\n\t\t\t$prefix = File_TXT;\n\t\t}\n\t\t if(defined('TPL_PATH')){\n\t\t\t$path = TPL_PATH;\n\t\t}else{\n\t\t\t$path = APP_HOME;\n\t\t}\n\t\tif(APP_URL=='/index.php'){\n\t\t\t$includefile = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.TEMPLATE.'/'.$filename. $prefix);\n\t\t\t$file = TEMPLATE.'/'.$filename. $prefix;\n\t\t}else{\n\t\t\t$includefile = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.Tpl_template.'/'. Tpl_common .'/'.$filename. $prefix);\n\t\t\t$file = Tpl_common .'/'.$filename. $prefix;\n\t\t}\n\t\tif(!is_file($includefile)){\n            //兼容自定义扩展和.html模板\n            $includefile = str_replace(File_TXT,'.html',$includefile);\n            if (!is_file($includefile)) {\n                Error_msg($file.'不存在！');\n            }\n\t\t\t\n\t\t}\n  \n\t\t$content = file_get_contents($includefile);\n\t\t$content = $this->template_html($content);\n\t\treturn $content;\n\t}\n\t//检查模板标签是否错误！\n\tpublic function check_template_err($a,$b,$msg){\n\t\tif($a!=$b) Error_msg($this->_cachefile.'模板中存在不完整'.$msg.'标签，请检查是否遗漏{'.$msg.'}开始或结束符');\n\t}\n\t\n\t//筛选\n\t/**\n\t\t输出参数：筛选列表all(item)，链接url，升降序(id,orders,addtime)\n\t\t{screen molds=\"article\" orderby=\"orders desc\" tid=\"1|2\" fields='pingpai,yanse' as=\"v\"}\n\t**/\n\tpublic function template_html_screen($f){\n\t\tpreg_match_all('/.*?(\\s*.*?=.*?[\\\"|\\'].*?[\\\"|\\']\\s).*?/si',' '.$f.' ',$aa);\n\t\t$a=array();\n\t\tforeach($aa[1] as $v){\n\t\t\t$t=explode('=',trim(str_replace(array('\"',\"'\"),'',$v)));\n\t\t\t$a=array_merge($a,array(trim($t[0]) => trim($t[1])));\n\t\t}\n\t\tif(strpos($a['molds'],'$')!==FALSE){\n\t\t\t$a['molds']='\\'\".'.$a['molds'].'.\"\\'';\n\t\t}else{\n\t\t\t$a['molds'] = \" '\".$a['molds'].\"' \";\n\t\t}\n\t\t$molds=$a['molds'];\n\t\tif(isset($a['fields'])){$fields=\"'\".$a['fields'].\"'\";}else{$fields='null';}\n\t\tif($a['as']!=''){$as=$a['as'];}else{$as='v';}\n\t\tif(isset($a['orderby'])){\n\t\t\t$order=\"'\".$a['orderby'].\"'\";\n\t\t}else{$order=\"' id desc '\";}\n\t\t$tids = '1=1';\n\t\tif(isset($a['tid'])){\n\t\t\t$arr_tid = array();\n\t\t\tif(strpos($a['tid'],'|')!==false){\n\t\t\t\tforeach(explode('|',$a['tid']) as $v){\n\t\t\t\t\t$arr_tid[]=\" (tids like '%,\".$v.\",%') \";\n\t\t\t\t}\n\t\t\t$tids = ' ( '. implode('or',$arr_tid).' ) ';\n\t\t\t}else if(strpos($a['tid'],'$')!==false){\n\t\t\t\t$tids = \" tids like  '%,\".trim($a['tid'],\"'\").\",%'  \";\n\t\t\t}else{\n\t\t\t\t$tids = \" tids like  '%,\".$a['tid'].\",%'  \";\n\t\t\t}\n\t\t}\n\t\t$where = '1=1';\n\t\tif(isset($a['fields'])){\n\t\t\tif(strpos($a['fields'],',')!==false){\n\t\t\t\t$a['fields'] = str_replace(',',\"','\",$a['fields']);\n\t\t\t}\n            $where = \" field in ('\".$a['fields'].\"') \";\n\t\t}\n\n\t\t$sql=' fieldtype in(7,8,12) and  isshow=1 and field!=\\'isshow\\' and molds='.$molds.'  and '.$tids.' and '.$where;\n\t\t$txt=\"<?php\n\t\t\\$table ='fields';\n\t\t\\$w=\\\"\".$sql.\"\\\";\n\t\t\\$order=$order;\";\n\t\t$as = trim($as,\"'\");\n\t\t$txt .= \"\n\t\t$\".$as.\"_data = M(\\$table)->findAll(\\$w,\\$order,\\$fields);\";\n\t\t\n\n\t\t$txt.='$n=0;foreach($'.$as.'_data as $'.$as.'_key=>  $'.$as.'){\n\t\t\t$n++;\n\t\t\t$vs=array();\n\t\t\t$fieldvalue = explode(\",\",$'.$as.'[\"body\"]);\n\t\t\t//$rooturl = get_domain().\"/screen/index/molds/\".$'.$as.'[\"molds\"].\"/tid/\".$type[\"id\"];\n\t\t\t$rooturl = get_domain().\"/screen-\".$'.$as.'[\"molds\"].\"-\".$type[\"id\"];\n\t\t\tforeach($fieldvalue as $kk=>$vv){\n\t\t\t\t$d=explode(\"=\",$vv);\n\t\t\t\t$vs[$kk] = array(\"key\"=>$d[1],\"value\"=>$d[0],\"url\"=>$rooturl.\"-\".$'.$as.'[\"field\"].\"-\".$d[1].change_parse_url($filters,$'.$as.'[\"field\"]));\n\t\t\t}\n\t\t\t\n\t\t\t$'.$as.'[\"list\"] = $vs;\n\t\t\t$'.$as.'[\"url\"] = $rooturl.\"-\".$'.$as.'[\"field\"].\"-0\";\n\t\t\t?>';\n\t\t\n\t\treturn $txt;\n\t}\n\t\n\t//foreach全局标签\n\t/**\n\t$content=str_ireplace($v,'<?php foreach('.$i[1][$k].'){  ?>',$content);\n\t*/\n\tprivate function template_html_foreach($f){\n\t\t$ff = explode(' as ',$f);\n\t\tif(strpos($ff[1],'=>')!==false){\n\t\t\t$fff = explode('=>',$ff[1]);\n\t\t\t$fff[1] = trim($fff[1]);\n\t\t\treturn '<?php '.$fff[1].'_n=0;foreach('.$f.'){ '.$fff[1].'_n++; ?>';\n\t\t}else{\n\t\t\t$ff[1] = trim($ff[1]);\n\t\t\treturn '<?php '.$ff[1].'_n=0;foreach('.$f.'){ '.$ff[1].'_n++;?>';\n\t\t}\n\t}\n\t\n\t//loop全局标签\n    private function template_html_loop($f){\n        preg_match_all('/.*?(\\s*.*?=.*?[\\\"|\\'].*?[\\\"|\\']\\s).*?/si',' '.$f.' ',$aa);\n        $a=array();foreach($aa[1] as $v){$t=explode('=',trim(str_replace(array('\"'),\"'\",$v)));$a=array_merge($a,array(trim($t[0]) => trim($t[1])));}\n        if(isset($a['table'])){\n            if(strpos($a['table'],'$')!==FALSE){$a['table']=trim($a['table'],\"'\");}\n            $db=$a['table'];\n        }else{\n            if(!isset($a['tid'])){ exit('缺少table参数！');}\n            if(strpos($a['tid'],'$')!==false){\n                $db = ' $classtypedata['.trim($a['tid'],\"'\").'][\"molds\"] ';\n            }else{\n                if(strpos($a['tid'],',')!==false){\n                    $tids = explode(',',$a['tid']);\n                    $db = ' $classtypedata['.trim($tids[0],\"'\").'][\"molds\"] ';\n                }else{\n                    $db = ' $classtypedata['.trim($a['tid'],\"'\").'][\"molds\"] ';\n                }\n            }\n            \n        }\n        if(isset($a['limit'])){\n            if(strpos($a['limit'],'$')!==false){\n                $limit=trim($a['limit'],\"'\");\n            }else{\n                $limit=$a['limit'];\n            }\n        }else{$limit='null';}\n        if(isset($a['notempty'])){$notempty=trim($a['notempty'],\"'\");}else{$notempty=false;}\n        if(isset($a['empty'])){$empty=trim($a['empty'],\"'\");}else{$empty=false;}\n        if(isset($a['fields'])){\n            if(strpos($a['fields'],'$')!==false){\n                $fields=trim($a['fields'],\"'\");\n            }else{\n                $fields=$a['fields'];\n            }\n            \n        }else{$fields='null';}\n        if(isset($a['isall'])){$isall=trim($a['isall'],\"'\");}else{$isall=false;}\n        if(isset($a['as'])){$as=$a['as'];}else{$as='v';}\n        if(isset($a['day'])){$day=$a['day'];}else{$day=false;}\n        if(isset($a['jzpage'])){$jzpage=trim($a['jzpage'],\"'\");}else{$jzpage='page';}\n        if(isset($a['sql'])){$sql=trim($a['sql'],\"'\");}else{$sql='';}\n        if(isset($a['jzcache'])){$jzcache=trim($a['jzcache'],\"'\");}else{$jzcache=false;}\n        if(isset($a['jzcachetime'])){$jzcachetime= 60 * trim($a['jzcachetime'],\"'\");}else{$jzcachetime=30*60;}\n        if(isset($a['orderby'])){\n            $order=$a['orderby'];\n            if(strpos($a['orderby'],'$')!==FALSE){$order=trim($a['orderby'],\"'\");}\n            //$order=' '.str_replace('|',' ',$order).' ';\n        }else{$order=\"' id desc '\";}\n        if(isset($a['like'])){\n            // like='title|学习,keywords|学习' => title like '%学习%' and keywords like '%学习%';\n            $lk = array();\n            if(strpos($a['like'],',')!==false){\n                $like = explode(',',trim($a['like'],\"'\"));\n                foreach($like as $v){\n                    $s = explode('|',$v);\n                    if(strpos($s[1],'$')!==false){\n                        $lk[] = \" \".$s[0].\" like \\'%'.\".trim($s[1]).\".'%\\' \";\n                    }else{\n                        $lk[]= \" \".$s[0].\" like \\'%\".trim($s[1]).\"%\\' \";\n                    }\n                    \n                }\n                $lk = \" and ( \". implode(\" or \",$lk).\" )\";\n            }else{\n                if(strpos($a['like'],'$')!==false){\n                    $like = explode('|',trim($a['like'],\"'\"));\n                    $lk = \" and \".$like[0].\" like \\'%'.\".trim($like[1]).\".'%\\' \";\n                }else{\n                    $like = explode('|',trim($a['like'],\"'\"));\n                    $lk = \" and \".$like[0].\" like \\'%\".trim($like[1]).\"%\\' \";\n                }\n                \n            }\n            \n        }else{ $lk='';}\n        if(isset($a['notlike'])){\n            $not = array();\n            if(strpos($a['notlike'],',')!==false){\n                $like = explode(',',trim($a['notlike'],\"'\"));\n                foreach($like as $v){\n                    $s = explode('|',$v);\n                    if(strpos($s[1],'$')!==false){\n                        $not[] = \" \".$s[0].\" not like \\'%'.\".trim($s[1]).\".'%\\' or \".$s[0].\" is null  \";\n                    }else{\n                        $not[]= \" \".$s[0].\" not like \\'%\".trim($s[1]).\"%\\' or \".$s[0].\" is null \";\n                    }\n                    \n                }\n                $notlike = \" and ( \". implode(\" or \",$not).\" )\";\n            }else{\n                if(strpos($a['notlike'],'$')!==false){\n                    $like = explode('|',trim($a['notlike'],\"'\"));\n                    $notlike = \" and (\".$like[0].\" not like \\'%'.\".trim($like[1]).\".'%\\' or \".$like[0].\" is null) \";\n                }else{\n                    $like = explode('|',trim($a['notlike'],\"'\"));\n                    $notlike = \" and (\".$like[0].\" not like \\'%\".trim($like[1]).\"%\\' or \".$like[0].\" is null)  \";\n                }\n                \n            }\n        }else{\n            $notlike = '';\n        }\n        //不在某个参数范围内\n        $notin_sql = '';\n        if(isset($a['notin'])){\n            if(strpos($a['notin'],'|')!==false){\n                $notin = explode('|',trim($a['notin'],\"'\"));\n                if(strpos($notin[1],'$')!==false){\n                    $notin_sql = ' and '.$notin[0].' not in(\\'.'.$notin[1].'.\\') ';\n                }else{\n                    $notin_sql = ' and '.$notin[0].' not in('.$notin[1].') ';\n                }\n                \n            }\n        }\n        //在某个参数范围内\n        $in_sql = '';\n        if(isset($a['in'])){\n            if(strpos($a['in'],'|')!==false){\n                $in = explode('|',trim($a['in'],\"'\"));\n                if(strpos($in[1],'$')!==false){\n                    $in_sql = ' and '.$in[0].' in(\\'.'.$in[1].'.\\') ';\n                }else{\n                    $in_sql = ' and '.$in[0].' in('.$in[1].') ';\n                }\n                \n            }\n        }\n        if($sql){\n            $sql = \" and ('.\".$sql.\".' ) \";\n        }\n        if(isset($a['notjz'])){\n            $jz = 0;\n        }else{\n            $jz = 1;\n        }\n        unset($a['table']);unset($a['orderby']);unset($a['limit']);unset($a['as']);unset($a['like']);unset($a['notlike']);unset($a['fields']);unset($a['isall']);unset($a['notin']);unset($a['notempty']);unset($a['empty']);unset($a['day']);unset($a['in']);unset($a['sql']);unset($a['jzpage']);unset($a['jzcache']);unset($a['jzcachetime']);unset($a['notjz']);\n        $w = ' 1=1 ';\n        $fu = '';\n        $ispage=false;\n        if($jzpage!='page'){\n            if(stripos($jzpage,'$')!==false){\n                $jzpage = \"'.$jzpage.'\";\n            }\n            $pagenum = \"\\$pagenum = (int)\\$_REQUEST['\".$jzpage.\"'] ? (int)\\$_REQUEST['\".$jzpage.\"']  : 1; \";\n        }else{\n            $pagenum = \"\\$pagenum = isset(\\$frpage) ? \\$frpage : (int)\\$_REQUEST['page'];\";\n        }\n        \n        foreach($a as $k=>$v){\n            if(strpos($v,'$')===FALSE){\n                //$v = str_ireplace(\"'\",'',$v);\n                $v = trim($v,\"'\");\n            }\n            \n            if($k=='ispage'){\n                $ispage=true;\n            }else if($k=='tid'){\n                $classtypedata = classTypeData();\n                if(strpos($a['tid'],',')!==false){\n                    \n                    if($isall){\n                        $a['tid'] = trim($a['tid'],\"'\");\n                        $tids=explode(',',$a['tid']);\n                        $ss = [];\n                        $fu = \" \\$fu = [];\\$f = [];\";\n                        foreach($tids as $s){\n                            if($classtypedata[$s]){\n                                $ss[] = '  tid in(\\'.implode(\",\",$classtypedata['.$s.'][\"children\"][\"ids\"]).\\') ';\n                                $fu .= \" \\$fu = array_merge(\\$fu,\\$classtypedata[\".$s.\"][\\\"children\\\"][\\\"ids\\\"]);\";\n                            }\n                            \n                        }\n                        $fu .= \"foreach(\\$fu as \\$fv){\n\t\t\t\t\t\t\t\\$f[] = 'tids like \\'%,'.\\$fv.',%\\'';\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\";\n                        if(count($ss)){\n                            $w.=' and ('.implode(' or ',$ss).' or \\'.implode(\\' or \\',$f).\\' )';\n                        }\n                        \n                    }else{\n                        $w.=' and tid in('.trim($a['tid'],\"'\").') ';\n                    }\n                    \n                    \n                }else{\n                    \n                    if(strpos($a['tid'],'$')!==false){\n                        if($isall){\n                            $fu = \" \\$f = []; \\$fu = \\$classtypedata[\".trim($v,\"'\").\"]['children']['ids'];\";\n                            $fu .= \"foreach(\\$fu as \\$fv){\n\t\t\t\t\t\t\t\t\\$f[] = 'tids like \\'%,'.\\$fv.',%\\'  ';\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\";\n                            $w.= ' and ( tid in(\\'.implode(\",\",$classtypedata['.trim($v,\"'\").'][\"children\"][\"ids\"]).\\') or \\'.implode(\\' or \\',$f).\\' ) ';\n                        }else{\n                            $w.=\"and tid='.\".trim($v,\"'\").\".' \";\n                        }\n                        \n                        \n                    }else{\n                        \n                        if($isall){\n                            $fu = \" \\$f = []; \\$fu = \\$classtypedata[\".trim($v,\"'\").\"]['children']['ids'];\";\n                            $fu .= \"foreach(\\$fu as \\$fv){\n\t\t\t\t\t\t\t\t\\$f[] = 'tids like \\'%,'.\\$fv.',%\\'  ';\n\t\t\t\t\t\t\t}\";\n                            if($classtypedata[$v]) {\n                                $w .= ' and  (tid in(\\'.implode(\",\",$classtypedata[' . trim($v, \"'\") . '][\"children\"][\"ids\"]).\\')  or  \\'.implode(\\' or \\',$f).\\') ';\n                            }\n                        }else{\n                            $w.=\"and tid=\".$v.\" \";\n                        }\n                        \n                        \n                    }\n                }\n                \n            }else if($k=='jzattr'){\n                if(strpos($v,',')!==false){\n                    $s = explode(',',$v);\n                    $s_sql = [];\n                    foreach($s as $ss){\n                        $s_sql[]=\" jzattr like \\'%,\".$ss.\",%\\'  \";\n                    }\n                    $w.=\" and ( \".implode('or',$s_sql).\" ) \";\n                }else{\n                    $w.=\" and jzattr like \\'%,\".$v.\",%\\'\";\n                }\n                \n            }else{\n                if(strpos($v,'$')!==FALSE){\n                    $w.=\"and \".$k.\"=\\''.\".trim($v,\"'\").\".'\\' \";\n                }else{\n                    $w.=\"and \".$k.\"=\\'\".$v.\"\\' \";\n                }\n                \n            }\n            \n            \n            \n        }\n        \n        if($notempty){\n            //多个字段\n            if(strpos($notempty,'|')!==false){\n                $notempty = explode('|',$notempty);\n                foreach($notempty as $v){\n                    $w.=' (and trim('.$v.') !=\"\" && trim('.$v.') is not null) ';\n                }\n                \n            }else{\n                $w.=' and (trim('.$notempty.') !=\"\" && trim('.$notempty.') is not null)  ';\n            }\n            \n        }\n        if($empty){\n            //多个字段\n            if(strpos($empty,'|')!==false){\n                $empty = explode('|',$empty);\n                foreach($empty as $v){\n                    $w.=' and (trim('.$v.') =\"\" or  trim('.$v.') is null) ';\n                }\n                \n            }else{\n                $w.=' and (trim('.$empty.') =\"\" or trim('.$empty.') is null) ';\n            }\n            \n        }\n        if($day){\n            $day =str_replace(\"'\",'',$day);\n            if(strpos($day,'$')!==false){\n                $day = trim($day,\"'\");\n                $w.=\" and DATE_SUB(CURDATE(), INTERVAL '\".\".$day.\".\"' DAY) <= date(FROM_UNIXTIME(addtime))\";\n            }else{\n                $w.=\" and DATE_SUB(CURDATE(), INTERVAL \".$day.\" DAY) <= date(FROM_UNIXTIME(addtime))\";\n            }\n        }\n        if(webconf('schedule_table')){\n            if(webConf('schedule_table')){\n                $tables = explode('|',webConf('schedule_table'));\n                if(in_array(trim($db,\"'\"),$tables)){\n                    $w.= ' and addtime<='.time().' ';\n                }\n            }\n        }\n        $w .= $notin_sql;\n        $w .= $in_sql;\n        $w .= $sql;\n        $w.= $lk;\n        $w.= $notlike;\n        $as = trim($as,\"'\");\n        $txt=\"<?php\n\t\t\\$\".$as.\"_table =$db;\n\t\t$fu\n\t\t\\$\".$as.\"_w='\".$w.\"';\n\t\t\\$\".$as.\"_order=$order;\n\t\t\\$\".$as.\"_fields=$fields;\n\t\t\\$\".$as.\"_prefix = $jz;\n\t\t\\$\".$as.\"_limit=$limit;\";\n        \n        if($ispage){\n            \n            $txt .=\"\n\t\t\t\".$pagenum.\"\n\t\t\t\\$\".$as.\"_page = new frphp\\Extend\\Page(\\$\".$as.\"_table,\\$\".$as.\"_prefix);\n\t\t\t\\$\".$as.\"_page->typeurl = 'tpl';\n\t\t\t\\$\".$as.\"_page->paged = '\".$jzpage.\"';\n\t\t\t\\$\".$as.\"_data = \\$\".$as.\"_page->where(\\$\".$as.\"_w)->fields(\\$\".$as.\"_fields)->orderby(\\$\".$as.\"_order)->limit(\\$\".$as.\"_limit)->page(\\$pagenum)->go();\n\t\t\t\\$\".$as.\"_pages = \\$\".$as.\"_page->pageList(3,'?\".$jzpage.\"=');\n\t\t\t\\$\".$as.\"_sum = \\$\".$as.\"_page->sum;\n\t\t\t\\$\".$as.\"_listpage = \\$\".$as.\"_page->listpage;\n\t\t\t\\$\".$as.\"_prevpage = \\$\".$as.\"_page->prevpage;\n\t\t\t\\$\".$as.\"_nextpage = \\$\".$as.\"_page->nextpage;\n\t\t\t\\$\".$as.\"_allpage = \\$\".$as.\"_page->allpage;\";\n        }else{\n            \n            if($jzcache){\n                $txt .= \"\n\t\t\t\t\\$cachestr = md5(\\$\".$as.\"_table.\\$\".$as.\"_w.\\$\".$as.\"_order.\\$\".$as.\"_fields.\\$\".$as.\"_limit);\n\t\t\t\t$\".$as.\"_data = getCache(\\$cachestr);\n\t\t\t\tif($\".$as.\"_data!==false){\n\t\t\t\t\t$\".$as.\"_data = M(\\$\".$as.\"_table,\\$\".$as.\"_prefix)->findAll(\\$\".$as.\"_w,\\$\".$as.\"_order,\\$\".$as.\"_fields,\\$\".$as.\"_limit);\n\t\t\t\t\tsetCache(\\$cachestr,$\".$as.\"_data,$jzcachetime);\n\t\t\t\t}\";\n            }else{\n                $txt .= \"\n\t\t\t\t$\".$as.\"_data = M(\\$\".$as.\"_table,\\$\".$as.\"_prefix)->findAll(\\$\".$as.\"_w,\\$\".$as.\"_order,\\$\".$as.\"_fields,\\$\".$as.\"_limit);\";\n            }\n            \n        }\n        $txt.='$'.$as.'_n=0;foreach($'.$as.'_data as $'.$as.'_key=> $'.$as.'){\n\t\t\t$'.$as.'_n++;\n\t\t\tif(!array_key_exists(\\'url\\',$'.$as.')){\n\t\t\t\t\n\t\t\t\tif($'.$as.'_table==\\'classtype\\'){\n\t\t\t\t\t$'.$as.'[\\'url\\'] = $classtypedata[$'.$as.'[\\'id\\']][\\'url\\'];\n\t\t\t\t}else if($'.$as.'_table==\\'message\\'){\n\t\t\t\t\t$'.$as.'[\\'url\\'] = U(\\'message/details\\',[\\'id\\'=>$'.$as.'[\\'id\\']]);\n\t\t\t\t}else if($'.$as.'_table==\\'tags\\'){\n\t\t\t\t\t$'.$as.'[\\'url\\'] = U(\\'tags/index\\',[\\'id\\'=>$'.$as.'[\\'id\\']]);\n\t\t\t\t}else{\n\t\t\t\t\t$'.$as.'[\\'url\\'] = gourl($'.$as.',$'.$as.'[\\'htmlurl\\']);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t?>';\n        \n        return $txt;\n        \n    }\n    \n    \n    \n}"
  },
  {
    "path": "index.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | FrPHP { a friendly PHP Framework } \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://frphp.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 如沐春 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2022/04/11\n// +----------------------------------------------------------------------\n\n// 应用目录为当前目录\ndefine('APP_PATH', __DIR__ . '/');\ndefine('ADMIN_MODEL','admins');\n// 加载框架文件\nrequire(APP_PATH . 'frphp/fr.php');\n\n// 就这么简单~\n\n"
  },
  {
    "path": "install/db.php",
    "content": "<?php die();?>/*\nMySQL Database Backup Tools\nServer:127.0.0.1:3306\nDatabase:db\nData:2022-01-26 13:46:31\n*/\nSET FOREIGN_KEY_CHECKS=0;\n-- ----------------------------\n-- Table structure for jz_article\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_article`;\nCREATE TABLE `jz_article` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `title` varchar(255) DEFAULT NULL COMMENT '文章标题',\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目',\n  `molds` varchar(50) DEFAULT 'article' COMMENT '模型标识',\n  `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',\n  `keywords` varchar(255) DEFAULT NULL COMMENT '关键词',\n  `description` text COMMENT '简介',\n  `seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID：0前台发布',\n  `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',\n  `body` mediumtext COMMENT '文章内容',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',\n  `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击次数',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否审核：1审核0未审2退回',\n  `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',\n  `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n  `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条：1是0否',\n  `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐：1是0否',\n  `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',\n  `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员：0后台发布',\n  `target` varchar(255) DEFAULT NULL COMMENT '外链',\n  `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',\n  `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性：1置顶2热点3推荐',\n  `tids` varchar(255) DEFAULT NULL COMMENT '副栏目',\n  `zan` int(11) DEFAULT '0' COMMENT '点赞数',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='文章表';\n-- ----------------------------\n-- Table structure for jz_attr\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_attr`;\nCREATE TABLE `jz_attr` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `molds` varchar(50) DEFAULT 'attr' COMMENT '模型标识',\n  `name` varchar(50) DEFAULT NULL COMMENT '属性名',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='推荐属性';\n-- ----------------------------\n-- Table structure for jz_buylog\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_buylog`;\nCREATE TABLE `jz_buylog` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `aid` int(11) DEFAULT '0' COMMENT '内容ID',\n  `userid` int(11) DEFAULT '0' COMMENT '会员ID',\n  `orderno` varchar(255) DEFAULT NULL COMMENT '订单号',\n  `type` tinyint(1) DEFAULT '1' COMMENT '交易类型：1购买商品0兑换金币',\n  `buytype` varchar(20) DEFAULT NULL COMMENT '支付类型',\n  `msg` varchar(255) DEFAULT NULL COMMENT '记录',\n  `molds` varchar(255) DEFAULT NULL COMMENT '模型标识',\n  `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总计',\n  `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金额',\n  `addtime` int(11) DEFAULT '0' COMMENT '添加时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='购买记录表';\n-- ----------------------------\n-- Table structure for jz_cachedata\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_cachedata`;\nCREATE TABLE `jz_cachedata` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `title` varchar(255) DEFAULT NULL COMMENT '标题',\n  `field` varchar(50) DEFAULT NULL COMMENT '字段',\n  `molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `isall` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否输出所有：1是0否',\n  `sqls` varchar(500) DEFAULT NULL COMMENT 'SQL',\n  `orders` varchar(255) DEFAULT NULL COMMENT '排序',\n  `limits` int(11) NOT NULL DEFAULT '10' COMMENT '输出条数',\n  `times` int(11) NOT NULL DEFAULT '0' COMMENT '更新周期',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='数据缓存表';\n-- ----------------------------\n-- Table structure for jz_chain\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_chain`;\nCREATE TABLE `jz_chain` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `title` varchar(100) DEFAULT NULL COMMENT '内链词',\n  `newtitle` varchar(100) DEFAULT NULL COMMENT '替换词',\n  `url` varchar(255) DEFAULT NULL COMMENT '链接',\n  `num` int(11) NOT NULL DEFAULT '-1' COMMENT '替换次数',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='内链';\n-- ----------------------------\n-- Table structure for jz_classtype\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_classtype`;\nCREATE TABLE `jz_classtype` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `classname` varchar(50) DEFAULT NULL COMMENT '栏目名',\n  `seo_classname` varchar(50) DEFAULT NULL COMMENT 'SEO栏目名',\n  `molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n  `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',\n  `description` text COMMENT '描述',\n  `keywords` varchar(255) DEFAULT NULL COMMENT '关键词',\n  `body` text COMMENT '内容',\n  `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',\n  `orderstype` int(4) NOT NULL DEFAULT '0' COMMENT '排序类型：1时间倒序2ID正序3点击量倒序4ID正序5时间正序6点击量正序',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n  `iscover` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否覆盖下级',\n  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '上级栏目ID',\n  `gid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目权限：0不限制',\n  `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',\n  `lists_html` varchar(50) DEFAULT NULL COMMENT '栏目页模板',\n  `details_html` varchar(50) DEFAULT NULL COMMENT '详情页模板',\n  `lists_num` int(4) DEFAULT '0' COMMENT '列表数量',\n  `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',\n  `gourl` varchar(255) DEFAULT NULL COMMENT '栏目外链',\n  `ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许会员发布',\n  `isclose` tinyint(1) NOT NULL DEFAULT '0' COMMENT '关闭栏目',\n  `gids` varchar(255) DEFAULT NULL COMMENT '允许访问角色',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='栏目表';\n-- ----------------------------\n-- Table structure for jz_collect\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_collect`;\nCREATE TABLE `jz_collect` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `title` varchar(255) DEFAULT NULL COMMENT '标题',\n  `description` varchar(500) DEFAULT NULL COMMENT '简介',\n  `tid` int(11) DEFAULT NULL COMMENT '所属栏目',\n  `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',\n  `w` varchar(10) NOT NULL DEFAULT '0' COMMENT '宽',\n  `h` varchar(10) NOT NULL DEFAULT '0' COMMENT '高',\n  `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示：1显示0隐藏',\n  `url` varchar(255) DEFAULT NULL COMMENT '链接',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图';\n-- ----------------------------\n-- Table structure for jz_collect_type\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_collect_type`;\nCREATE TABLE `jz_collect_type` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) DEFAULT NULL COMMENT '分类名',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图分类';\n-- ----------------------------\n-- Table structure for jz_comment\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_comment`;\nCREATE TABLE `jz_comment` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `molds` varchar(50) DEFAULT 'comment' COMMENT '模型标识',\n  `tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目tid',\n  `aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章id',\n  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '回复帖子id',\n  `zid` int(11) NOT NULL DEFAULT '0' COMMENT '主回复帖子：同一层楼内回复，规定主回复id',\n  `body` text COMMENT '评论内容',\n  `reply` text COMMENT '回复内容',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员：0表示游客',\n  `likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示：1显示0隐藏2被删除',\n  `isread` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已读：1已读0未读',\n  PRIMARY KEY (`id`),\n  KEY `tid` (`tid`),\n  KEY `aid` (`aid`),\n  KEY `pid` (`pid`),\n  KEY `zid` (`zid`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='评论表';\n-- ----------------------------\n-- Table structure for jz_ctype\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_ctype`;\nCREATE TABLE `jz_ctype` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `title` varchar(50) DEFAULT NULL COMMENT '配置栏名称',\n  `action` varchar(255) DEFAULT NULL COMMENT '配置标识，用于权限控制',\n  `sys` tinyint(1) DEFAULT 0 COMMENT '系统配置，1是0否',\n  `isopen` tinyint(1) DEFAULT 1 COMMENT '是否启用，1启用0关闭',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统设置栏目名';\n-- ----------------------------\n-- Table structure for jz_customurl\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_customurl`;\nCREATE TABLE `jz_customurl` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n  `url` varchar(255) DEFAULT NULL COMMENT '自定义URL',\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='自定义链接表';\n-- ----------------------------\n-- Table structure for jz_fields\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_fields`;\nCREATE TABLE `jz_fields` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `field` varchar(50) DEFAULT NULL COMMENT '字段标识',\n  `molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n  `fieldname` varchar(100) DEFAULT NULL COMMENT '字段名称',\n  `tips` varchar(100) DEFAULT NULL COMMENT '填写提示',\n  `fieldtype` tinyint(2) NOT NULL DEFAULT '1' COMMENT '输入类型',\n  `tids` text COMMENT '绑定栏目',\n  `fieldlong` varchar(50) DEFAULT NULL COMMENT '字段长度',\n  `body` text COMMENT '字段配置',\n  `orders` int(11) NOT NULL DEFAULT '0' COMMENT '表单排序',\n  `ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否必填：1是0否',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台是否显示：1显示0隐藏',\n  `isadmin` tinyint(1) NOT NULL DEFAULT '1' COMMENT '后台是否显示：1显示0隐藏',\n  `issearch` tinyint(1) NOT NULL DEFAULT '0' COMMENT '搜索显示：1显示0隐藏',\n  `islist` tinyint(1) NOT NULL DEFAULT '0' COMMENT '列表显示：1显示0隐藏',\n  `format` varchar(50) DEFAULT NULL COMMENT '格式化',\n  `vdata` varchar(50) DEFAULT NULL COMMENT '默认值',\n  `isajax` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'AJAX显示：1显示0隐藏',\n  `listorders` int(4) NOT NULL DEFAULT '0' COMMENT '列表排序',\n  `isext` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否扩展信息',\n  `width` varchar(50) DEFAULT NULL COMMENT '列表中显示宽度',\n  `ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台表单录入',\n  `ldfield` varchar(255)  DEFAULT NULL COMMENT '关联字段',\n  `linkfield` varchar(255)  DEFAULT NULL COMMENT '连接字段',\n  `remote` tinyint(1) NOT NULL  DEFAULT '1'  COMMENT '是否远程数据',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;\n-- ----------------------------\n-- Table structure for jz_hook\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_hook`;\nCREATE TABLE `jz_hook` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `module` varchar(50) DEFAULT NULL COMMENT '模块，Home/A',\n  `namespace` varchar(100) DEFAULT NULL COMMENT '控制器命名空间',\n  `controller` varchar(50) DEFAULT NULL COMMENT '控制器',\n  `action` varchar(255) DEFAULT NULL COMMENT '执行函数：可同时注册多个方法，逗号拼接',\n  `hook_namespace` varchar(100) DEFAULT NULL COMMENT '钩子控制器所在的命名空间',\n  `hook_controller` varchar(50) DEFAULT NULL COMMENT '钩子控制器',\n  `hook_action` varchar(50) DEFAULT NULL COMMENT '钩子执行方法',\n  `all_action` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否全局控制器',\n  `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序：越大越靠前执行',\n  `isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否关闭：1开启0关闭',\n  `plugins_name` varchar(50) DEFAULT NULL COMMENT '关联插件名',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件钩子';\n-- ----------------------------\n-- Table structure for jz_layout\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_layout`;\nCREATE TABLE `jz_layout` (\n  `id` int(4) NOT NULL AUTO_INCREMENT,\n  `name` varchar(200) DEFAULT NULL COMMENT '桌面名称',\n  `top_layout` text COMMENT '顶部菜单',\n  `left_layout` text COMMENT '左侧菜单',\n  `gid` int(11) DEFAULT NULL COMMENT '所属角色',\n  `ext` varchar(255) DEFAULT NULL COMMENT '备注',\n  `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统配置：1是0否',\n  `isdefault` tinyint(1) NOT NULL DEFAULT '0' COMMENT '默认配置：1是0否',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='桌面设置';\n-- ----------------------------\n-- Table structure for jz_level\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_level`;\nCREATE TABLE `jz_level` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `molds` varchar(50) DEFAULT 'level' COMMENT '模型标识',\n  `name` varchar(20) DEFAULT NULL COMMENT '管理员名称',\n  `pass` varchar(100) DEFAULT NULL COMMENT '密码',\n  `tel` varchar(20) DEFAULT NULL COMMENT '电话号码',\n  `gid` int(4) NOT NULL DEFAULT '2' COMMENT '所属角色',\n  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',\n  `regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间',\n  `logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间',\n  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1正常0冻结',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='管理员表';\n-- ----------------------------\n-- Table structure for jz_level_group\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_level_group`;\nCREATE TABLE `jz_level_group` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `molds` varchar(50) DEFAULT 'level_group' COMMENT '模型标识',\n  `name` varchar(50) DEFAULT NULL COMMENT '角色名称',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n  `isadmin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超管：1是0否',\n  `ischeck` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发布审核：1需要审核0不需要',\n  `classcontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否配置栏目权限：1是0否',\n  `paction` text COMMENT '权限列表',\n  `tids` text COMMENT '拥有栏目权限',\n  `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1正常0冻结',\n  `description` varchar(500) DEFAULT NULL COMMENT '描述',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表';\n-- ----------------------------\n-- Table structure for jz_likes\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_likes`;\nCREATE TABLE `jz_likes` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  PRIMARY KEY (`id`),\n  KEY `tid` (`tid`,`aid`,`userid`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='点赞表';\n-- ----------------------------\n-- Table structure for jz_link_type\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_link_type`;\nCREATE TABLE `jz_link_type` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) DEFAULT NULL COMMENT '友链分类名',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接分类表';\n-- ----------------------------\n-- Table structure for jz_links\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_links`;\nCREATE TABLE `jz_links` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `title` varchar(255) DEFAULT NULL COMMENT '友链名称',\n  `molds` varchar(50) DEFAULT 'links' COMMENT '模型标识',\n  `url` varchar(255) DEFAULT NULL COMMENT '链接',\n  `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示：1显示0隐藏',\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID',\n  `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',\n  `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n  `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',\n  `target` varchar(255) DEFAULT NULL COMMENT '外链',\n  `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接表';\n-- ----------------------------\n-- Table structure for jz_member\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_member`;\nCREATE TABLE `jz_member` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `molds` varchar(50) DEFAULT 'member' COMMENT '模型标识',\n  `username` varchar(50) DEFAULT NULL COMMENT '用户昵称',\n  `openid` varchar(255) DEFAULT NULL COMMENT '微信OPENID',\n  `pass` varchar(255) DEFAULT NULL COMMENT '密码',\n  `token` varchar(255) DEFAULT NULL COMMENT 'Token',\n  `sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别：1男2女0未知',\n  `gid` int(11) NOT NULL DEFAULT '1' COMMENT '会员分组ID',\n  `litpic` varchar(255) DEFAULT NULL COMMENT '头像',\n  `tel` varchar(50) DEFAULT NULL COMMENT '手机号码',\n  `jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分数',\n  `likes` text COMMENT '喜欢点赞（已废弃）',\n  `collection` text COMMENT '收藏（已废弃）',\n  `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金币',\n  `email` varchar(255) DEFAULT NULL COMMENT '邮箱',\n  `address` varchar(255) DEFAULT NULL COMMENT '地址',\n  `province` varchar(50) DEFAULT NULL COMMENT '省份',\n  `city` varchar(50) DEFAULT NULL COMMENT '城市',\n  `regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间',\n  `hassendtime` int(11) NOT NULL DEFAULT '0' COMMENT '发送验证码时间',\n  `logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1正常0封禁',\n  `signature` varchar(255) DEFAULT NULL COMMENT '个性签名',\n  `birthday` varchar(25) DEFAULT NULL COMMENT '生日：2020-01-01',\n  `follow` text COMMENT '关注列表',\n  `fans` int(11) NOT NULL DEFAULT '0' COMMENT '粉丝数',\n  `ismsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收消息提醒',\n  `iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收评论消息提醒',\n  `iscollect` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收收藏消息提醒',\n  `islikes` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收点赞消息提醒',\n  `isat` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收@消息提醒',\n  `isrechange` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收交易消息提醒',\n  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '推荐用户ID',\n  `uploadsize` int(11) NOT NULL DEFAULT '50' COMMENT '上传大小限制',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员表';\n-- ----------------------------\n-- Table structure for jz_member_group\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_member_group`;\nCREATE TABLE `jz_member_group` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) DEFAULT NULL COMMENT '分组名',\n  `molds` varchar(50) DEFAULT 'member_group' COMMENT '模型标识',\n  `description` varchar(255) DEFAULT NULL COMMENT '分组简介',\n  `paction` text COMMENT '权限',\n  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '分组上级',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n  `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许登录',\n  `iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许评论',\n  `ischeckmsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否需要审核评论',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n  `discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣价：现金折扣或者百分比折扣',\n  `discount_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '折扣类型：0无折扣1现金折扣,1百分比折扣',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员分组';\n-- ----------------------------\n-- Table structure for jz_menu\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_menu`;\nCREATE TABLE `jz_menu` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(255) DEFAULT NULL COMMENT '导航名称',\n  `nav` text COMMENT '导航配置',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示：1显示0不显示',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='导航表';\n-- ----------------------------\n-- Table structure for jz_message\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_message`;\nCREATE TABLE `jz_message` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `title` varchar(255) DEFAULT NULL COMMENT '标题',\n  `molds` varchar(50) DEFAULT 'message' COMMENT '模型标识',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员',\n  `tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章ID',\n  `user` varchar(255) DEFAULT NULL COMMENT '用户名',\n  `ip` varchar(255) DEFAULT NULL COMMENT 'IP',\n  `body` text COMMENT '留言内容',\n  `reply` text COMMENT '回复内容',\n  `tel` varchar(50) DEFAULT NULL COMMENT '电话',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',\n  `email` varchar(255) DEFAULT NULL COMMENT '邮箱',\n  `isshow` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否审核：1审核0未审',\n  `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n  `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',\n  `tids` varchar(255) DEFAULT NULL COMMENT '副栏目',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='留言表';\n-- ----------------------------\n-- Table structure for jz_molds\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_molds`;\nCREATE TABLE `jz_molds` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) DEFAULT NULL COMMENT '模型名称',\n  `biaoshi` varchar(50) DEFAULT NULL COMMENT '模型标识',\n  `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统：1是0否',\n  `isopen` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启：1开启0关闭',\n  `iscontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启权限：1开启权限0不开启',\n  `ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '栏目必选：1是0否',\n  `isclasstype` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示栏目',\n  `isshowclass` tinyint(1) DEFAULT '1' COMMENT '栏目绑定：1显示0隐藏',\n  `list_html` varchar(50) DEFAULT 'list.html' COMMENT '默认列表模板',\n  `details_html` varchar(50) DEFAULT 'details.html' COMMENT '默认详情模板',\n  `orders` int(11) NOT NULL DEFAULT '100' COMMENT '排序',\n  `ispreview` tinyint(1) DEFAULT '1' COMMENT '是否可以预览',\n  `ishome` tinyint(1) DEFAULT '0' COMMENT '前台发布',\n  PRIMARY KEY (`id`),\n  KEY `biaoshi` (`biaoshi`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='模型表';\n-- ----------------------------\n-- Table structure for jz_orders\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_orders`;\nCREATE TABLE `jz_orders` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `orderno` varchar(255) DEFAULT NULL COMMENT '订单号',\n  `molds` varchar(50) DEFAULT 'orders' COMMENT '模型标识',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '下单会员',\n  `paytype` varchar(20) DEFAULT NULL COMMENT '支付方式',\n  `ptype` tinyint(1) DEFAULT '1' COMMENT '交易类型：1商品购买2充值金额3充值积分',\n  `tel` varchar(50) DEFAULT NULL COMMENT '电话',\n  `username` varchar(50) DEFAULT NULL COMMENT '用户名',\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `price` varchar(200) DEFAULT NULL COMMENT '价格',\n  `jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分',\n  `qianbao` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '钱包',\n  `body` text COMMENT '购买内容',\n  `receive_username` varchar(50) DEFAULT NULL COMMENT '收件人',\n  `receive_tel` varchar(20) DEFAULT NULL COMMENT '收件电话',\n  `receive_email` varchar(50) DEFAULT NULL COMMENT '收件邮箱',\n  `receive_address` varchar(255) DEFAULT NULL COMMENT '收件地址',\n  `ispay` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否支付：1支付0未支付',\n  `paytime` int(11) NOT NULL DEFAULT '0' COMMENT '支付时间',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '下单时间',\n  `send_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '订单状态：1提交订单,2已支付,3超时,4已提交订单,5已发货,6已废弃失效,0删除订单',\n  `discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣',\n  `yunfei` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='订单表';\n-- ----------------------------\n-- Table structure for jz_page\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_page`;\nCREATE TABLE `jz_page` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `molds` varchar(50) DEFAULT 'page' COMMENT '模型标识',\n  `htmlurl` varchar(50) DEFAULT NULL COMMENT '链接',\n  `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n  `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',\n  `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示：1显示0隐藏',\n  `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n  `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `tids` varchar(255) NOT NULL COMMENT '副栏目',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='单页模型';\n-- ----------------------------\n-- Table structure for jz_pictures\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_pictures`;\nCREATE TABLE `jz_pictures` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',\n  `molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n  `path` varchar(20) DEFAULT 'Admin' COMMENT '板块：Admin后台Home前台',\n  `filetype` varchar(20) DEFAULT NULL COMMENT '类型',\n  `size` varchar(50) DEFAULT NULL COMMENT '大小',\n  `litpic` varchar(255) DEFAULT NULL COMMENT '链接',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID/发布会员ID',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='图片集';\n-- ----------------------------\n-- Table structure for jz_pingjia\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_pingjia`;\nCREATE TABLE `jz_pingjia` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `tid` int(11) DEFAULT '0' COMMENT '所属栏目',\n  `tids` varchar(255) DEFAULT NULL COMMENT '副栏目',\n  `title` varchar(255) DEFAULT NULL COMMENT '标题',\n  `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',\n  `keywords` varchar(255) DEFAULT NULL COMMENT '关键词',\n  `description` varchar(500) DEFAULT NULL COMMENT '简介',\n  `body` text COMMENT '内容',\n  `molds` varchar(50) DEFAULT 'pingjia' COMMENT '模型标识',\n  `userid` int(11) DEFAULT '0' COMMENT '发布管理员',\n  `orders` int(11) DEFAULT '0' COMMENT '排序',\n  `member_id` int(11) DEFAULT '0' COMMENT '前台用户',\n  `comment_num` int(11) DEFAULT '0' COMMENT '评论数',\n  `htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接',\n  `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示',\n  `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n  `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条：1是0否',\n  `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐：1是0否',\n  `target` varchar(255) DEFAULT NULL COMMENT '外链',\n  `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义URL',\n  `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性',\n  `hits` int(11) DEFAULT '0' COMMENT '点击量',\n  `zan` int(11) DEFAULT '0' COMMENT '点赞数',\n  `tags` varchar(255) DEFAULT NULL COMMENT 'TAG',\n  `addtime` int(11) DEFAULT '0' COMMENT '发布时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `zhiye` varchar(255) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;\n-- ----------------------------\n-- Table structure for jz_plugins\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_plugins`;\nCREATE TABLE `jz_plugins` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) DEFAULT NULL COMMENT '插件名称',\n  `filepath` varchar(50) DEFAULT NULL COMMENT '插件文件名',\n  `description` varchar(255) DEFAULT NULL COMMENT '简介',\n  `version` decimal(3,1) NOT NULL DEFAULT '0.0' COMMENT '版本',\n  `author` varchar(50) DEFAULT NULL COMMENT '作者',\n  `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `module` varchar(20) NOT NULL DEFAULT 'Home' COMMENT '模块',\n  `isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启：1开启0关闭',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `config` text COMMENT '配置',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件表';\n-- ----------------------------\n-- Table structure for jz_power\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_power`;\nCREATE TABLE `jz_power` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `action` varchar(50) DEFAULT NULL COMMENT '函数名',\n  `name` varchar(50) DEFAULT NULL COMMENT '权限名',\n  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限ID',\n  `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开放',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户权限表';\n-- ----------------------------\n-- Table structure for jz_product\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_product`;\nCREATE TABLE `jz_product` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `molds` varchar(50) DEFAULT 'product' COMMENT '模型标识',\n  `title` varchar(255) DEFAULT NULL COMMENT '商品名称',\n  `seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目',\n  `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',\n  `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',\n  `keywords` varchar(255) DEFAULT NULL COMMENT '关键词',\n  `description` varchar(255) DEFAULT NULL COMMENT '简介',\n  `litpic` varchar(255) DEFAULT NULL COMMENT '首图',\n  `stock_num` int(11) NOT NULL DEFAULT '0' COMMENT '库存',\n  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格',\n  `pictures` text COMMENT '图集',\n  `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示：1显示0不显示',\n  `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',\n  `body` mediumtext COMMENT '详情',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '录入管理员ID',\n  `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n  `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条：1是0否',\n  `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐：1是0否',\n  `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',\n  `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员',\n  `target` varchar(255) DEFAULT NULL COMMENT '外链',\n  `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',\n  `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性：1置顶2热点3推荐',\n  `tids` varchar(255) DEFAULT NULL,\n  `zan` int(11) DEFAULT '0',\n  `lx` varchar(2) DEFAULT NULL,\n  `color` varchar(2) DEFAULT NULL,\n  `hy` varchar(500) DEFAULT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='商品表';\n-- ----------------------------\n-- Table structure for jz_recycle\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_recycle`;\nCREATE TABLE `jz_recycle` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `title` varchar(255) DEFAULT NULL COMMENT '标记',\n  `molds` varchar(50) DEFAULT NULL COMMENT '回收模型标志',\n  `data` mediumtext COMMENT '回收数据',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '删除时间',\n  `aid` int(11) NOT NULL DEFAULT '0' COMMENT '关联删除',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='回收站';\n-- ----------------------------\n-- Table structure for jz_ruler\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_ruler`;\nCREATE TABLE `jz_ruler` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `name` varchar(50) DEFAULT NULL COMMENT '权限名称',\n  `fc` varchar(50) DEFAULT NULL COMMENT '函数',\n  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限',\n  `isdesktop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否桌面配置显示（已废弃）',\n  `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '系统：1是0否',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色权限表';\n-- ----------------------------\n-- Table structure for jz_shouchang\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_shouchang`;\nCREATE TABLE `jz_shouchang` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n  `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',\n  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户收藏表';\n-- ----------------------------\n-- Table structure for jz_sysconfig\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_sysconfig`;\nCREATE TABLE `jz_sysconfig` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `field` varchar(50) DEFAULT NULL COMMENT '配置字段',\n  `title` varchar(255) DEFAULT NULL COMMENT '配置名称',\n  `tip` varchar(255) DEFAULT NULL COMMENT '字段填写提示',\n  `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '参数类型：1图片2单行文本3多行文本4编辑器5文件上传6下拉开启关闭选项7下拉是否选项8栏目选项9代码',\n  `data` text COMMENT '配置内容',\n  `typeid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '配置栏ID',\n  `config` text COMMENT '单选多选配置信息',\n  `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n  `sys` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否系统字段',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统配置';\n-- ----------------------------\n-- Table structure for jz_tags\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_tags`;\nCREATE TABLE `jz_tags` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `tid` int(11) DEFAULT '0' COMMENT '栏目ID',\n  `tids` varchar(500) DEFAULT NULL COMMENT '相关栏目',\n  `orders` int(11) DEFAULT '0' COMMENT '排序',\n  `comment_num` int(11) DEFAULT '0' COMMENT '评论数',\n  `molds` varchar(50) DEFAULT 'tags' COMMENT '模型标识',\n  `htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接',\n  `keywords` varchar(50) DEFAULT NULL COMMENT '关键词',\n  `newname` varchar(50) DEFAULT NULL COMMENT '替换词（已废弃）',\n  `num` int(4) DEFAULT '-1' COMMENT '替换次数：-1不限制',\n  `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示：1显示隐藏',\n  `target` varchar(50) DEFAULT '_blank' COMMENT '外链',\n  `number` int(11) DEFAULT '0' COMMENT '数量',\n  `member_id` int(11) DEFAULT '0' COMMENT '发布会员',\n  `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',\n  `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',\n  `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n  `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条：1是0否',\n  `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐：1是0否',\n  `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n  `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='TAGS表';\n-- ----------------------------\n-- Table structure for jz_task\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_task`;\nCREATE TABLE `jz_task` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `tid` int(11) DEFAULT '0' COMMENT '栏目ID',\n  `aid` int(11) DEFAULT '0' COMMENT '文章ID',\n  `userid` int(11) DEFAULT '0' COMMENT '发布会员',\n  `puserid` int(11) DEFAULT '0' COMMENT '对象会员',\n  `molds` varchar(50) DEFAULT NULL COMMENT '模块标识',\n  `type` varchar(50) DEFAULT NULL COMMENT '消息类型',\n  `body` varchar(255) DEFAULT NULL COMMENT '内容',\n  `url` varchar(255) DEFAULT NULL COMMENT '链接',\n  `isread` tinyint(1) DEFAULT '0' COMMENT '是否已读：1已读0未读',\n  `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示：1显示0隐藏',\n  `readtime` int(11) DEFAULT '0' COMMENT '阅读时间',\n  `addtime` int(11) DEFAULT '0' COMMENT '发布时间',\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员消息表';\n-- ----------------------------\n-- Records of jz_article\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_attr\n-- ----------------------------\nINSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('1','置顶','1');\nINSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('2','热点','1');\nINSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('3','推荐','1');\n-- ----------------------------\n-- Records of jz_buylog\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_cachedata\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_chain\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_classtype\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_collect\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_collect_type\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_comment\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_ctype\n-- ----------------------------\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('1','基本设置','base',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('2','高级设置','high-level',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('3','搜索配置','searchconfig',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('4','邮件订单','email-order',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('5','支付配置','payconfig',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('6','公众号配置','wechatbind',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('7','积分配置','jifenset',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('8','图片水印','imagewatermark',1,1);\n-- ----------------------------\n-- Records of jz_customurl\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_fields\n-- ----------------------------\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('1','url','links','链接地址', NULL,'1',',0,','255', NULL,'0','1','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('2','title','links','链接名称', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('3','email','message','联系邮箱', NULL,'1', NULL,'255', NULL,'0','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('4','keywords','tags','关键词','尽量简短，但不能重复','1', NULL,'50', NULL,'0','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('5','newname','tags','替换词','尽量简短，但不能重复，20字以内，可不填。【已废弃】','1', NULL,'50', NULL,'0','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('7','num','tags','替换次数','一篇文章内替换的次数，默认-1，全部替换【已废弃】','4', NULL,'4', NULL,'0','0','1','0','0','0', NULL,'-1','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('8','target','tags','打开方式', NULL,'7', NULL,'50','新窗口=_blank,本窗口=_self','0','0','1','0','0','0', NULL,'_blank','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('9','number','tags','标签数','无需填写，程序自动处理','4', NULL,'11', NULL,'0','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('10','member_id','article','用户','前台会员，无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('11','member_id','product','用户','前台会员，无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('12','member_id','links','发布用户','前台会员，无需填写','13', NULL,'11','3,username','0','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('13','target','links','外链URL','默认为空，系统访问内容则直接跳转到此链接','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('14','ownurl','links','自定义URL','默认为空，自定义URL','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('15','ownurl','tags','自定义URL','默认为空，自定义URL','1', NULL,'255', NULL,'0','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('16','addtime','links','添加时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('17','addtime','tags','添加时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('43','molds','product','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('19','title','article','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0','250','1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('20','tid','article','所属栏目', NULL,'17', NULL,'13', NULL,'1','1','1','1','1','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('21','molds','article','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('22','htmlurl','article','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','1', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('23','keywords','article','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('24','description','article','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('25','seo_title','article','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('26','userid','article','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('27','litpic','article','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('28','body','article','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('29','addtime','article','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('30','orders','article','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('31','hits','article','点击量', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('32','isshow','article','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','1','1', NULL,'1','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('33','comment_num','article','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','1', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('34','istop','article','是否置顶：1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('35','ishot','article','是否头条：1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('36','istuijian','article','是否推荐：1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('37','tags','article','Tags', NULL,'19',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('38','target','article','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('39','ownurl','article','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('40','jzattr','article','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','0','0','150','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('41','tids','article','副栏目', NULL,'18', NULL,'255', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('42','zan','article','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('44','title','product','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','100','0','300','1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('45','seo_title','product','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('46','tid','product','所属栏目', NULL,'17', NULL,'11', NULL,'1','0','1','1','1','1', NULL,'0','1','100','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('47','hits','product','点击量', NULL,'4',',0,10,','11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('48','htmlurl','product','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('49','keywords','product','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('50','description','product','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('51','litpic','product','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','100','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('52','stock_num','product','库存', NULL,'1', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('53','price','product','价格', NULL,'1', NULL,'10,2', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('54','pictures','product','图集', NULL,'6',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,', NULL, NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('55','isshow','product','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','0','1', NULL,'1','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('56','comment_num','product','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('57','body','product','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('58','userid','product','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('59','orders','product','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','100','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('60','addtime','product','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('61','istop','product','是否置顶：1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('62','ishot','product','是否头条：1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('63','istuijian','product','是否推荐：1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('64','tags','product','Tags', NULL,'19', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('65','target','product','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('66','ownurl','product','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('67','jzattr','product','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','100','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('68','tids','product','副栏目', NULL,'18', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('69','zan','product','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('70','isshow','tags','是否显示', NULL,'7', NULL,'1','显示=1,隐藏=0,退回=2','0','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('71','lx','product','类型', NULL,'7',',1,6,7,','2','响应式=1,PC=2,手机=3,PC+手机=4,小程序=5','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('72','color','product','颜色', NULL,'7',',1,6,7,','2','红色=1,橙色=2,黄色=3,绿色=4,蓝色=5,紫色=6,粉色=7','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('73','hy','product','行业', NULL,'8',',1,6,7,','500','金融/证券=1,IT科技/软件=2,教育/培训=3,珠宝/工艺品=4,五金/机电=5,婚庆/摄影/美容=6,旅游/餐饮/美食=7,房产/汽车/运输=8,休闲/文化=9,医疗/生物/化工=10,儿童/游乐园=11,动物/宠物=12,鲜花/礼物=13,运动/俱乐部=14,生态/农业=15,建筑/装饰=16,广告/网站/设计=17,个人/导航/博客=18','2','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('74','title','pingjia','用户名','默认为空','1',',0,10,','255', NULL,'100','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('75','tid','pingjia','所属栏目','选择栏目','17',',10,','11', NULL,'100','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('76','tids','pingjia','副栏目','绑定后可以在当前模型的其他栏目中显示','18', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('77','keywords','pingjia','关键词','每个词用英文逗号(,)拼接','1', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('78','tags','pingjia','TAG','每个词用英文逗号(,)拼接','19', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('79','litpic','pingjia','头像','可留空','5',',0,10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('80','description','pingjia','简述','可留空','2',',0,10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('81','body','pingjia','内容','可留空','3',',10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('82','member_id','pingjia','发布会员','前台发布会员ID记录','13', NULL,'11','3,username','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('83','userid','pingjia','管理员','后台发布管理员ID记录','13', NULL,'11','11,name','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('84','target','pingjia','外链URL','默认为空，系统访问内容则直接跳转到此链接','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('85','ownurl','pingjia','自定义URL','默认为空，自定义URL','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('86','hits','pingjia','点击量','系统自动添加','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('87','comment_num','pingjia','评论数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('88','zan','pingjia','点赞数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('89','addtime','pingjia','添加时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('90','jzattr','pingjia','推荐属性','1置顶2热点3推荐','16', NULL,'50','14,name','100','0','1','0','0','0', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('91','isshow','pingjia','是否显示','显示隐藏','7',',10,','1','显示=1,隐藏=0,退回=2','100','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('92','zhiye','pingjia','职业', NULL,'1',',10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('93','orders','pingjia','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (94, 'username', 'member', '用户昵称', NULL, 1, ',0,', '255', NULL, 2, 1, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (95, 'openid', 'member', '微信OPENID', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (96, 'sex', 'member', '性别', NULL, 12, ',0,', '2', '男=1,女=2,未知=0', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (97, 'gid', 'member', '会员分组', NULL, 13, ',0,', '11', '6,name', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (98, 'litpic', 'member', '会员头像', NULL, 5, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (99, 'tel', 'member', '电话号码', NULL, 1, ',0,', '12', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (100, 'jifen', 'member', '积分', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (101, 'money', 'member', '金币', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (102, 'email', 'member', '邮箱', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (103, 'province', 'member', '省份', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (104, 'city', 'member', '城市', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (105, 'address', 'member', '详细地址', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (106, 'regtime', 'member', '注册时间', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (107, 'logintime', 'member', '最近登录', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (108, 'signature', 'member', '个性签名', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (109, 'birthday', 'member', '生日', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (110, 'pid', 'member', '推荐人', NULL, 13, ',0,', '11', '3,username', 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (111, 'isshow', 'member', '状态', '封禁后不能登录', 7, ',0,', '2', '正常=1,封禁=0', 2, 0, 1, 1, 1, 1, NULL, '1', 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (112, 'title', 'message', '标题', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (113, 'user', 'message', '用户昵称', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 0, 1, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (114, 'tid', 'message', '相关栏目', NULL, 13, ',4,', '11', '2,classname', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (115, 'tel', 'message', '联系电话', NULL, 1, ',4,', '20', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (116, 'ip', 'message', '留言IP', NULL, 1, ',4,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (117, 'body', 'message', '留言内容', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (118, 'isshow', 'message', '是否审核', NULL, 7, ',4,', '1', '未审核=0,已审核=1', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (119, 'addtime', 'message', '提交时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (120, 'reply', 'message', '回复留言', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (121, 'uploadsize', 'member', '上传限制', '单位M，上传总文件大小限制，超过此大小不允许上传', 4, ',0,', '11', NULL, 2, 0, 0, 1, 0, 0, NULL, '0', 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('122','updatetime','article','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('123','updatetime','product','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('124','updatetime','pingjia','更新时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (125, 'updatetime', 'message', '更新时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('126','updatetime','links','更新时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('127','updatetime','tags','更新时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1');\n-- ----------------------------\n-- Records of jz_hook\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_layout\n-- ----------------------------\nINSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('1','系统默认','[]','[{\"name\":\"内容管理\",\"icon\":\"&amp;#xe6b4;\",\"nav\":[{\"key\":\"16948\",\"title\":\"内容列表\",\"value\":\"9\",\"icon\":\"\"},{\"key\":\"12349\",\"title\":\"商品列表\",\"value\":\"105\",\"icon\":\"\"},{\"key\":\"19748\",\"title\":\"推荐属性\",\"value\":\"202\",\"icon\":\"\"}]},{\"name\":\"栏目管理\",\"icon\":\"&amp;#xe699;\",\"nav\":[{\"key\":\"10518\",\"title\":\"栏目列表\",\"value\":\"42\",\"icon\":\"\"}]},{\"name\":\"互动管理\",\"icon\":\"&amp;#xe69b;\",\"nav\":[{\"key\":\"11832\",\"title\":\"留言列表\",\"value\":\"22\",\"icon\":\"\"},{\"key\":\"11262\",\"title\":\"评论列表\",\"value\":\"16\",\"icon\":\"\"}]},{\"name\":\"SEO设置\",\"icon\":\"&amp;#xe6b3;\",\"nav\":[{\"key\":\"16628\",\"title\":\"TAG列表\",\"value\":\"147\",\"icon\":\"\"},{\"key\":\"16214\",\"title\":\"友情链接\",\"value\":\"95\",\"icon\":\"\"},{\"key\":\"16254\",\"title\":\"网站地图\",\"value\":\"153\",\"icon\":\"\"},{\"key\":\"16917\",\"title\":\"内链列表\",\"value\":\"210\",\"icon\":\"\"}]},{\"name\":\"用户管理\",\"icon\":\"&amp;#xe6b8;\",\"nav\":[{\"key\":\"11957\",\"title\":\"会员列表\",\"value\":\"2\",\"icon\":\"\"},{\"key\":\"15086\",\"title\":\"会员分组\",\"value\":\"118\",\"icon\":\"\"},{\"key\":\"10618\",\"title\":\"会员权限\",\"value\":\"123\",\"icon\":\"\"},{\"key\":\"17578\",\"title\":\"管理员列表\",\"value\":\"54\",\"icon\":\"\"},{\"key\":\"19552\",\"title\":\"角色管理\",\"value\":\"49\",\"icon\":\"\"},{\"key\":\"10895\",\"title\":\"权限列表\",\"value\":\"66\",\"icon\":\"\"},{\"key\":\"12582\",\"title\":\"订单列表\",\"value\":\"129\",\"icon\":\"\"},{\"key\":\"17076\",\"title\":\"充值列表\",\"value\":\"177\",\"icon\":\"\"}]},{\"name\":\"系统设置\",\"icon\":\"&amp;#xe6ae;\",\"nav\":[{\"key\":\"11314\",\"title\":\"网站设置\",\"value\":\"40\",\"icon\":\"\"},{\"key\":\"10572\",\"title\":\"桌面设置\",\"value\":\"70\",\"icon\":\"\"},{\"key\":\"18242\",\"title\":\"导航设置\",\"value\":\"190\",\"icon\":\"\"},{\"key\":\"13002\",\"title\":\"轮播图\",\"value\":\"83\",\"icon\":\"\"},{\"key\":\"15936\",\"title\":\"轮播图分类\",\"value\":\"89\",\"icon\":\"\"},{\"key\":\"19847\",\"title\":\"清理缓存\",\"value\":\"114\",\"icon\":\"\"},{\"key\":\"12739\",\"title\":\"模板列表\",\"value\":\"223\",\"icon\":\"\"},{\"key\":\"127391\",\"title\":\"配置栏目\",\"value\":\"240\",\"icon\":\"\"}]},{\"name\":\"扩展管理\",\"icon\":\"&amp;#xe6ce;\",\"nav\":[{\"key\":\"11957\",\"title\":\"插件列表\",\"value\":\"76\",\"icon\":\"\"},{\"key\":\"13870\",\"title\":\"图库管理\",\"value\":\"116\",\"icon\":\"\"},{\"key\":\"12472\",\"title\":\"模型列表\",\"value\":\"61\",\"icon\":\"\"},{\"key\":\"15551\",\"title\":\"数据库备份\",\"value\":\"35\",\"icon\":\"\"},{\"key\":\"16311\",\"title\":\"碎片化\",\"value\":\"194\",\"icon\":\"\"},{\"key\":\"18982\",\"title\":\"公众号菜单\",\"value\":\"141\",\"icon\":\"\"},{\"key\":\"14568\",\"title\":\"公众号素材\",\"value\":\"142\",\"icon\":\"\"},{\"key\":\"13219\",\"title\":\"模板制作\",\"value\":\"143\",\"icon\":\"\"},{\"key\":\"17893\",\"title\":\"生成静态文件\",\"value\":\"154\",\"icon\":\"\"},{\"key\":\"16926\",\"title\":\"登录日志\",\"value\":\"115\",\"icon\":\"\"}]},{\"name\":\"回收站\",\"icon\":\"&amp;#xe8a3;\",\"nav\":[{\"key\":\"17056\",\"title\":\"回收站\",\"value\":\"217\",\"icon\":\"\"}]},{\"name\":\"评价管理\",\"icon\":\"&amp;#xe717;\",\"nav\":[{\"key\":\"16835\",\"title\":\"用户评价\",\"value\":\"227\",\"icon\":\"\"}]}]','0','CMS默认配置，不可删除！','1','1');\nINSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('2','旧版桌面','[]','[{\"name\":\"网站管理\",\"icon\":\"&amp;#xe699;\",\"nav\":[\"42\",\"9\",\"95\",\"83\",\"147\",\"22\"]},{\"name\":\"商品管理\",\"icon\":\"&amp;#xe698;\",\"nav\":[\"105\",\"129\",\"2\",\"118\",\"123\",\"16\",\"177\"]},{\"name\":\"扩展管理\",\"icon\":\"&amp;#xe6ce;\",\"nav\":[\"76\",\"116\",\"141\",\"142\",\"143\",\"194\",\"35\",\"61\",\"154\",\"153\"]},{\"name\":\"系统设置\",\"icon\":\"&amp;#xe6ae;\",\"nav\":[\"40\",\"54\",\"49\",\"190\",\"70\",\"115\",\"114\",\"66\"]}]','0','旧版本配置','0','0');\n-- ----------------------------\n-- Records of jz_level\n-- ----------------------------\nINSERT INTO `jz_level` (`id`,`name`,`pass`,`tel`,`gid`,`email`,`regtime`,`logintime`,`status`) VALUES ('1','admin','0acdd3e4a8a2a1f8aa3ac518313dab9d','13600136000','1','123456@qq.com','1635997469','1643156842','1');\n-- ----------------------------\n-- Records of jz_level_group\n-- ----------------------------\nINSERT INTO `jz_level_group` (`id`,`name`,`isadmin`,`ischeck`,`classcontrol`,`paction`,`tids`,`isagree`,`description`) VALUES ('1','超级管理员','1','0','0',',Fields,', NULL,'1', NULL);\n-- ----------------------------\n-- Records of jz_likes\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_link_type\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_links\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_member\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_member_group\n-- ----------------------------\nINSERT INTO `jz_member_group` (`id`,`name`,`description`,`paction`,`pid`,`isagree`,`iscomment`,`ischeckmsg`,`addtime`,`orders`,`discount`,`discount_type`) VALUES ('1','注册会员','前台会员分组，最低等级分组',',Message,Comment,User,Order,Home,Common,Uploads,','0','1','1','1','0','0','0.00','0');\n-- ----------------------------\n-- Records of jz_menu\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_message\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_molds\n-- ----------------------------\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('1','内容','article','1','1','1','1','1','1','article-list.html','article-details.html','100','0','1');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('2','栏目','classtype','1','1','1','1','1','1','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('3','会员','member','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('4','订单','orders','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('5','商品','product','1','1','1','1','1','1','list.html','details.html','100','0','1');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('6','会员分组','member_group','1','1','0','0','1','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('7','评论','comment','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('8','留言','message','1','1','0','0','1','1','message.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('9','轮播图','collect','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('10','友情链接','links','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('11','管理员','level','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('12','TAG','tags','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('13','单页','page','1','1','1','1','1','1','page.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('14','推荐属性','attr','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('15','用户评价','pingjia','0','1','0','1','1','1','lists.html','details.html','100','0','0');\n-- ----------------------------\n-- Records of jz_orders\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_page\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_pictures\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_pingjia\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_plugins\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_power\n-- ----------------------------\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('1','Common','公共权限','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('2','Home','前台网站','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('3','User','个人中心','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('4','Login','会员登录','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('5','Message','站内留言','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('6','Comment','会员评论','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('7','Screen','网站筛选','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('8','Order','会员下单','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('9','Mypay','网站支付','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('10','Jzpay','极致支付','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('11','Tags','TAG标签','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('12','Wechat','微信模块','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('13','Common/vercode','验证码生成','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('14','Common/checklogin','检查是否登录','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('15','Common/multiuploads','多附件上传','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('16','Common/uploads','单附件上传','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('17','Common/qrcode','二维码生成','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('18','Common/get_fields','获取扩展信息','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('19','Common/jizhi','链接错误提示','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('20','Common/error','报错提示','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('21','Home/index','网站首页','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('22','Home/jizhi','网站内容','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('23','Home/auto_url','自定义链接','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('24','Home/jizhi_details','详情内容','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('25','Home/search','网站搜索','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('26','Home/searchAll','网站多模块搜索','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('27','Home/start_cache','开启网站缓存','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('28','Home/end_cache','输出缓存','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('29','User/checklogin','检查是否登录','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('30','User/index','个人中心首页','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('31','User/userinfo','会员资料','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('32','User/orders','订单记录','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('33','User/orderdetails','订单详情','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('34','User/payment','订单支付','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('35','User/orderdel','删除订单','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('36','User/changeimg','上传头像','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('37','User/comment','评论列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('38','User/commentdel','删除评论','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('39','User/likesAction','点赞文章','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('40','User/likes','点赞列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('41','User/likesdel','取消点赞','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('42','User/collectAction','收藏文章','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('43','User/collect','收藏列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('44','User/collectdel','删除收藏','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('45','User/cart','购物车','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('46','User/addcart','添加购物车','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('47','User/delcart','删除购物车','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('48','User/posts','发布管理','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('49','User/release','会员发布','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('50','User/del','删除发布','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('51','User/uploads','会员上传附件','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('52','User/jizhi','404提示','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('53','User/follow','关注用户','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('54','User/nofollow','取消关注','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('55','User/fans','粉丝列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('56','User/notify','消息提醒','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('57','User/notifyto','查看消息','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('58','User/notifydel','删除消息','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('59','User/active','公共主页','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('60','User/setmsg','消息提醒设置','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('61','User/getclass','获取栏目列表','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('62','User/wallet','用户钱包','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('63','User/buy','会员充值','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('64','User/buylist','充值列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('65','User/buydetails','交易详情','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('66','Login/index','登录首页','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('67','Login/register','注册页面','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('68','Login/forget','忘记密码','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('69','Login/nologin','未登录页面','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('70','Login/loginout','退出登录','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('71','Message/index','发送留言','5','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('72','Comment/index','发表评论','6','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('73','Screen/index','筛选列表','7','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('74','Order/create','创建订单','8','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('75','Order/pay','订单支付','8','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('76','Tags/index','TAG标签列表','11','1');\n-- ----------------------------\n-- Records of jz_product\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_recycle\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_ruler\n-- ----------------------------\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('1','会员管理','Member','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('2','会员列表','Member/index','1','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('3','添加会员','Member/memberadd','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('4','修改会员','Member/memberedit','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('5','删除会员','Member/member_del','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('6','批量删除','Member/deleteAll','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('7','修改状态','Member/change_status','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('8','内容管理','Article','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('9','内容列表','Article/articlelist','8','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('10','添加内容','Article/addarticle','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('11','修改内容','Article/editarticle','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('12','删除内容','Article/deletearticle','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('13','批量删除','Article/deleteAll','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('14','复制内容','Article/copyarticle','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('15','评论管理','Comment','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('16','评论列表','Comment/commentlist','15','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('17','添加评论','Comment/addcomment','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('18','修改评论','Comment/editcomment','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('19','删除评论','Comment/deletecomment','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('20','批量删除','Comment/deleteAll','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('21','留言管理','Message','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('22','留言列表','Message/messagelist','21','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('23','修改留言','Message/editmessage','21','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('24','删除留言','Message/deletemessage','21','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('25','批量删除','Message/deleteAll','21','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('26','字段管理','Fields','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('27','字段列表','Fields/index','26','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('28','新增字段','Fields/addFields','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('29','修改字段','Fields/editFields','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('30','删除字段','Fields/deleteFields','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('31','获取字段','Fields/get_fields','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('32','基本功能','Index','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('33','系统界面','Index/index','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('34','后台首页','Index/welcome','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('35','数据库备份','Index/beifen','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('36','数据库备份','Index/backup','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('37','数据库还原','Index/huanyuan','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('38','数据库删除','Index/shanchu','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('39','系统功能','Sys','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('40','网站设置','Sys/index','39','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('41','栏目管理','Classtype','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('42','栏目列表','Classtype/index','41','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('43','新增栏目','Classtype/addclass','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('44','修改栏目','Classtype/editclass','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('45','删除栏目','Classtype/deleteclass','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('46','修改排序','Classtype/editClassOrders','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('47','栏目隐藏','Classtype/change_status','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('48','管理员管理','Admin','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('49','角色管理','Admin/group','48','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('50','新增角色','Admin/groupadd','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('51','修改角色','Admin/groupedit','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('52','删除角色','Admin/group_del','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('53','角色状态','Admin/change_group_status','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('54','管理员列表','Admin/adminlist','48','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('55','新增管理员','Admin/adminadd','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('56','修改管理员','Admin/adminedit','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('57','管理员状态','Admin/change_status','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('58','删除管理员','Admin/admindelete','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('59','个人信息','Index/details','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('60','模型管理','Molds','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('61','模型列表','Molds/index','60','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('62','新增模型','Molds/addMolds','60','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('63','修改模型','Molds/editMolds','60','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('64','删除模型','Molds/deleteMolds','60','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('65','权限管理','Rulers','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('66','权限列表','Rulers/index','65','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('67','新增权限','Rulers/addrulers','65','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('68','修改权限','Rulers/editrulers','65','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('69','删除权限','Rulers/deleterulers','65','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('70','桌面设置','Index/desktop','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('71','新增桌面','Index/desktop_add','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('72','修改桌面','Index/desktop_edit','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('73','删除桌面','Index/desktop_del','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('74','图标库','Index/unicode','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('75','插件管理','Plugins','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('76','插件列表','Plugins/index','75','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('77','模块扩展','Extmolds','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('82','轮播图','Collect','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('83','轮播图','Collect/index','82','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('84','新增轮播图','Collect/addcollect','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('85','修改轮播图','Collect/editcollect','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('86','删除轮播图','Collect/deletecollect','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('87','复制轮播图','Collect/copycollect','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('88','批量删除轮播图','Collect/deleteAll','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('89','轮播图分类','Collect/collectType','82','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('90','新增轮播图分类','Collect/collectTypeAdd','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('91','修改轮播图分类','Collect/collectTypeEdit','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('92','删除轮播图分类','Collect/collectTypeDelete','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('93','批量复制','Article/copyAll','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('94','批量修改栏目','Article/changeType','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('95','友情链接','Links/index','189','1','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('96','新增友链','Links/addlinks','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('97','修改友链','Links/editlinks','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('98','复制友链','Links/copylinks','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('99','删除友链','Links/deletelinks','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('100','批量删除友链','Links/deleteAll','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('101','通用模块','Common','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('102','上传文件','Common/uploads','101','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('103','更新cookie','Index/update_session_maxlifetime','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('104','商品管理','Product','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('105','商品列表','Product/productlist','104','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('106','新增商品','Product/addproduct','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('107','修改商品','Product/editproduct','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('108','删除商品','Product/deleteproduct','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('109','复制商品','Product/copyproduct','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('110','批量删除','Product/deleteAll','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('111','批量复制','Product/copyAll','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('112','修改栏目','Product/changeType','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('113','修改排序','Product/editProductOrders','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('114','清理缓存','Index/cleanCache','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('115','登录日志','Sys/loginlog','39','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('116','图库管理','Sys/pictures','39','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('117','修改排序','Extmolds/editOrders','77','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('118','会员分组','Member/membergroup','1','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('119','新增分组','Member/groupadd','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('120','修改分组','Member/groupedit','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('121','更改分组状态','Member/change_group_status','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('122','删除分组','Member/group_del','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('123','会员权限','Member/power','1','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('124','添加权限','Member/addrulers','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('125','修改权限','Member/editrulers','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('126','删除权限','Member/deleterulers','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('127','修改分组排序','Member/editOrders','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('128','订单管理','Order','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('129','订单列表','Order/index','128','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('130','订单详情','Order/details','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('131','批量删除','Order/deleteAll','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('132','上传支付证书','Sys/uploadcert','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('133','更改状态','Plugins/change_status','75','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('134','安装卸载','Plugins/action_do','75','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('223','模板列表','Template/index','222','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('222','模板管理','Template','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('137','删除图库图片','Sys/deletePic','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('138','批量删除图库','Sys/deletePicAll','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('139','安装说明','Plugins/desc','75','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('140','微信公众号','Wechat','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('141','公众号菜单','Wechat/wxcaidan','140','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('142','公众号素材','Wechat/sucai','140','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('143','模板制作','Index/showlabel','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('144','获取首字母拼音','Classtype/get_pinyin','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('145','批量新增栏目','Classtype/addmany','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('146','自定义配置删除','Sys/custom_del','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('147','TAG列表','Extmolds/index/molds/tags','77','1','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('148','新增TAG','Extmolds/addmolds/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('149','修改TAG','Extmolds/editmolds/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('150','复制TAG','Extmolds/copymolds/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('151','删除TAG','Extmolds/deletemolds/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('152','批量删除TAG','Extmolds/deleteAll/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('153','网站地图','Index/sitemap','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('154','生成静态文件','Index/tohtml','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('155','更新栏目HTML','Index/html_classtype','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('156','更新模块HTML','Index/html_molds','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('157','批量修改推荐属性','Article/changeAttribute','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('158','批量修改推荐属性','Product/changeAttribute','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('159','批量修改友链栏目','Links/changeType','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('160','批量修改TAG栏目','Extmolds/changeType/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('161','批量复制友链','Links/copyAll','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('162','批量复制TAG','Extmolds/copyAll/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('163','批量修改友链排序','Links/editOrders','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('164','批量修改TAG排序','Extmolds/editOrders/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('165','删除订单','Order/deleteorder','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('166','批量删除','Admin/deleteAll','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('167','高级设置','Sys/ctype/type/high-level','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('168','邮箱订单','Sys/ctype/type/email-order','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('169','支付配置','Sys/ctype/type/payconfig','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('170','公众号配置','Sys/ctype/type/wechatbind','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('171','批量审核','Article/checkAll','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('172','批量审核','Product/checkAll','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('173','批量审核','Message/checkAll','21','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('174','批量审核','Comment/checkAll','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('175','批量审核友链','Links/checkAll','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('176','批量审核TAG','Extmolds/checkAll/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('177','充值列表','Order/czlist','128','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('178','手动充值','Order/chongzhi','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('179','删除记录','Order/delbuylog','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('180','批量删除记录','Order/delAllbuylog','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('181','积分配置','Sys/ctype/type/jifenset','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('182','插件更新','Plugins/update','75','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('183','获取栏目模板','Classtype/get_html','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('184','批量修改栏目','Classtype/changeClass','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('185','友链分类','Links/linktype','189','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('186','新增友链分类','Links/linktypeadd','189','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('187','修改友链分类','Links/linktypeedit','189','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('188','删除友链分类','Links/linktypedelete','189','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('189','友情链接','Links','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('190','导航设置','Index/menu','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('191','新增导航','Index/addmenu','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('192','修改导航','Index/editmenu','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('193','删除导航','Index/delmenu','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('194','碎片化','Sys/datacache','39','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('195','新增碎片','Sys/addcache','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('196','修改碎片','Sys/editcache','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('197','删除碎片','Sys/delcache','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('198','预览SQL','Sys/viewcache','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('199','搜索配置','Sys/ctype/type/searchconfig','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('200','修改字段属性','Fields/editFieldsValue','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('201','推荐属性','Jzattr','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('202','推荐属性','Jzattr/index','201','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('203','新增推荐属性','Jzattr/addAttr','201','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('204','修改推荐属性','Jzattr/editAttr','201','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('205','删除推荐属性','Jzattr/delAttr','201','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('206','修改状态','Jzattr/changeStatus','201','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('207','列表设置','Fields/fieldsList','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('208','获取列表字段','Fields/fieldsList','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('209','内链模块','Jzchain','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('210','内链列表','Jzchain/index','209','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('211','新增内链','Jzchain/addchain','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('212','修改内链','Jzchain/editchain','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('213','删除内链','Jzchain/delchain','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('214','批量删除','Jzchain/delAll','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('215','修改状态','Jzchain/changeStatus','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('216','回收站','Recycle','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('217','回收站','Recycle/index','216','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('218','恢复数据','Recycle/restore','216','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('219','删除数据','Recycle/del','216','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('220','批量删除','Recycle/delAll','216','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('221','批量恢复','Recycle/restoreAll','216','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('224','安装卸载','Template/actionDo','222','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('225','安装说明','Template/desc','222','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('226','模板更新','Template/update','222','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('227','用户评价列表','Extmolds/index/molds/pingjia','77','1','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('228','新增用户评价','Extmolds/addmolds/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('229','修改用户评价','Extmolds/editmolds/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('230','复制用户评价','Extmolds/copymolds/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('231','删除用户评价','Extmolds/deletemolds/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('232','批量删除用户评价','Extmolds/deleteAll/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('233','批量修改用户评价栏目','Extmolds/changeType/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('234','批量复制用户评价','Extmolds/copyAll/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('235','批量修改用户评价列表','Extmolds/editOrders/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('236','批量审核用户评价','Extmolds/checkAll/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('237','重构字段','Molds/restrucFields','60','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('238','基本配置','Sys/ctype/type/base','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('239','批量修改评价推荐属性','Extmolds/changeAttribute/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('240','配置栏目','Sys/systype','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('241','设置配置状态','Sys/systypestatus','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('242','修改配置分组','Sys/editctype','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('243','新增配置分组','Sys/addctype','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('244','全局配置','Sys/ctype','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('245','修改配置字段','Sys/setfield','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('246','绑定模块数据获取','Fields/getSelect','26',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('247','编辑器上传','Uploads','0',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('248','上传功能','Uploads/index','247',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('249','获取子栏目','Classtype/getchildren','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('250','获取联动数据','Fields/getliandong','26','0','1');\n-- ----------------------------\n-- Records of jz_shouchang\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_sysconfig\n-- ----------------------------\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('1','web_version','系统版号','版本号是系统自带，请勿改动','0','2.5.6','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('2','web_name','网站SEO名称','控制在25个字、50个字节以内','2','极致CMS建站系统','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('3','web_keyword','网站SEO关键词','5个左右，8汉字以内，用英文逗号隔开','2','极致建站,cms,开源cms,免费cms,cms系统,phpcms,免费企业建站,建站系统,企业cms,jizhicms,极致cms,建站cms,建站系统,极致博客,极致blog,内容管理系统','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('4','web_desc','网站SEO描述','控制在80个汉字，160个字符以内','3','极致CMS是开源免费的PHPCMS网站内容管理系统，无商业授权，简单易用，提供丰富的插件，帮您实现零基础搭建不同类型网站（企业站，门户站，个人博客站等），是您建站的好帮手。极速建站，就选极致CMS。','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('5','web_js','统计代码','将百度统计、cnzz等平台的流量统计JS代码放到这里','8', NULL,'1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('6','web_copyright','底部版权','如：&copy; 2016 xxx版权','2','@2020-2099','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('7','web_beian','备案号','如：京ICP备00000000号','2','冀ICP备88888号','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('8','web_tel','网站电话','网站联系电话','2','0666-8888888','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('9','web_tel_400','400电话','400电话','2','400-0000-000','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('10','web_qq','网站QQ','网站QQ','2','12345678','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('11','web_email','网站邮箱','网站邮箱','2','123456@qq.com','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('12','web_address','公司地址','公司地址','2','河北省廊坊市广阳区xxx大厦xx楼001号','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('13','pc_template','PC网站模板','将模板名称填写到此处','2','cms','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('14','wap_template','WAP网站模板','开启了手机端，这个设置才会生效，否则调用电脑端模板','2','cms','2',NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('15','weixin_template','微信网站模板','开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板','2','cms','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('16','iswap','是否开启手机端','如果不开启手机端，则默认调用电脑端模板','6','1','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('17','isopenhomeupload','是否开启前台上传','关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。','6','1','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('18','isopenhomepower','是否开启前台权限','开启后前台用户权限可以在后台控制','6','0','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('19','cache_time','缓存时间','单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。','2','0','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('20','fileSize','限制上传文件大小','0代表不限，单位kb','2','0','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('21','fileType','允许上传文件类型','请用|分割，如：pdf|jpg|png','2','pdf|jpg|jpeg|png|zip|rar|gzip|doc|docx|xlsx','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('22','ueditor_config','后台编辑器导航条配置', \"后台UEditor编辑器导航条配置\",'3','&quot;fullscreen&quot;, &quot;source&quot;,&quot;undo&quot;, &quot;redo&quot;,&quot;bold&quot;, &quot;italic&quot;, &quot;underline&quot;, &quot;fontborder&quot;, &quot;strikethrough&quot;, &quot;super&quot;, &quot;removeformat&quot;, &quot;formatmatch&quot;, &quot;autotypeset&quot;, &quot;blockquote&quot;, &quot;pasteplain&quot;,&quot;forecolor&quot;, &quot;backcolor&quot;, &quot;insertorderedlist&quot;, &quot;insertunorderedlist&quot;, &quot;selectall&quot;, &quot;cleardoc&quot;,&quot;rowspacingtop&quot;, &quot;rowspacingbottom&quot;, &quot;lineheight&quot;,&quot;customstyle&quot;, &quot;paragraph&quot;, &quot;fontfamily&quot;, &quot;fontsize&quot;,&quot;directionalityltr&quot;, &quot;directionalityrtl&quot;, &quot;indent&quot;,&quot;justifyleft&quot;, &quot;justifycenter&quot;, &quot;justifyright&quot;, &quot;justifyjustify&quot;,&quot;touppercase&quot;, &quot;tolowercase&quot;,&quot;link&quot;, &quot;unlink&quot;, &quot;anchor&quot;, &quot;imagenone&quot;, &quot;imageleft&quot;, &quot;imageright&quot;, &quot;imagecenter&quot;,&quot;simpleupload&quot;, &quot;insertimage&quot;, &quot;emotion&quot;, &quot;scrawl&quot;, &quot;insertvideo&quot;, &quot;music&quot;, &quot;attachment&quot;, &quot;map&quot;, &quot;gmap&quot;, &quot;insertframe&quot;, &quot;insertcode&quot;, &quot;webapp&quot;, &quot;pagebreak&quot;,&quot;template&quot;, &quot;background&quot;,&quot;horizontal&quot;, &quot;date&quot;, &quot;time&quot;, &quot;spechars&quot;, &quot;snapscreen&quot;, &quot;wordimage&quot;,&quot;inserttable&quot;, &quot;deletetable&quot;, &quot;insertparagraphbeforetable&quot;, &quot;insertrow&quot;, &quot;deleterow&quot;, &quot;insertcol&quot;, &quot;deletecol&quot;, &quot;mergecells&quot;, &quot;mergeright&quot;, &quot;mergedown&quot;, &quot;splittocells&quot;, &quot;splittorows&quot;, &quot;splittocols&quot;, &quot;charts&quot;,&quot;print&quot;, &quot;preview&quot;, &quot;searchreplace&quot;, &quot;help&quot;, &quot;drafts&quot;','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('23','search_table','允许前台搜索的表','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product','2','article|product','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('24','imagequlity','上传图片压缩比例','100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80','6','75','2','不压缩使用原图=100,95%=95,90%=90,85%=85,80%=80,75%=75,70%=70,65%=65,60%=60,55%=55,50%=50','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('25','ispngcompress','PNG是否压缩','PNG压缩后容易变成背景黑色，关闭后，不会压缩。','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('26','email_server','邮件服务器','smtp.163.com,smtp.qq.com','2','smtp.163.com','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('27','email_port','邮件收发端口','163、126邮件端口(465)，QQ邮件端口(587)','2','465','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('28','shou_email','收件人Email地址', NULL,'2', NULL,'4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('29','send_email','发件人Email地址','指邮件服务器发件邮箱','2', NULL,'4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('30','send_pass','发件人Email秘钥','这个秘钥不是登录密码','2', NULL,'4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('31','send_name','发件人昵称','发件邮箱会带一个昵称','2','极致建站系统','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('32','tj_msg','客户订单通知','购买商品的时候会发送的一条邮件信息','3','尊敬的{xxx}，我们已经收到您的订单！请留意您的电子邮件以获得最新消息，谢谢您！','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('33','send_msg','订单出货通知','发货的时候发送给客户的通知','3','尊敬的{xxx}，我们已确认了您的订单，请于3日内汇款，逾期恕不保留，不便请见谅。汇款完成后，烦请告知客服人员您的交易账号后五位，即完成下单手续，谢谢您。','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('34','yunfei','订单运费','购物下单时会加上这个运费','2','0.00','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('35','paytype','在线支付','0关闭支付，1自主平台支付','6','0','5','关闭=0,开启=1','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('40','alipay_partner','支付宝APPID','账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('41','alipay_key','支付宝key','MD5密钥，安全检验码，由数字和字母组成的32位字符串','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('42','alipay_private_key','支付宝私钥', NULL,'3', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('43','alipay_public_key','支付宝公钥', NULL,'3', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('44','wx_mchid','微信商户mchid','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('45','wx_key','微信商户key','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('46','wx_appid','微信公众号appid','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('47','wx_appsecret','微信公众号appsecret','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('48','wx_client_cert','微信apiclient_cert','支付相关','5', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('49','wx_client_key','微信apiclient_key','支付相关','5', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('50','wx_login_appid','公众号appid','用户登录相关，如果跟支付的一样，那就再填写一遍','2', NULL,'6', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('51','wx_login_appsecret','公众号appsecret','用户登录相关，如果跟支付的一样，那就再填写一遍','2', NULL,'6', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('52','wx_login_token','公众号token','用户登录相关，如果跟支付的一样，那就再填写一遍','2', NULL,'6', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('53','huanying','公众号关注欢迎语','公众号关注时发送的第一句推送','3','欢迎关注公众号~','6', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('54','wx_token','公众号token','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('55','web_logo','网站LOGO', NULL,'1','/static/cms/static/images/logo.png','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('56','admintpl','后台模板风格','内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。','6','default','2','内页弹窗=default,内嵌页面=tpl','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('59','domain','网站SEO网址','一般不填，全局网址，最后不带/,如：http://www.xxx.com','2', NULL,'1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('61','overtime','订单超时','按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制','2','4','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('62','islevelurl','开启层级URL','默认关闭层级URL，开启后URL会按照父类层级展现','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('63','iscachepage','缓存完整页面','前台完整页面缓存，结合缓存时间，可以提高访问速度','6','1','0','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('64','isautohtml','自动生成静态','前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面','0','0','0','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('65','pc_html','PC静态文件目录','电脑端静态HTML存放目录，默认根目录[ / ]','2','/','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('66','mobile_html','WAP静态文件目录','手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱','2','m','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('67','autocheckmessage','是否留言自动审核','开启后，留言自动审核（显示）','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('68','autocheckcomment','是否评论自动审核','开启后评论自动审核（显示）','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('69','mingan','网站敏感词过滤','将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容','3', NULL,'1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('70','iswatermark','是否开启水印','开启水印后水印图片优先，如果没有图片则使用水印文字','6','0','8','开启=1,关闭=0','100','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('71','watermark_file','水印图片','水印图片在250px以内','1', NULL,'8', NULL,'99','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('72','watermark_t','水印位置','参考键盘九宫格1-9','2','9','8', NULL,'98','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('73','watermark_tm','水印透明度','透明度越大，越难看清楚水印','6','0','8','不显示=0,10%=10,20%=20,30%=30,40%=40,50%=50,60%=60,70%=70,80%=80,90%=90','97','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('74','money_exchange','钱包兑换率','站内钱包与RMB的兑换率，即1元=多少金币','2','1','5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('75','jifen_exchange','积分兑换率','站内积分与RMB的兑换率，即1元=多少积分','2','100','5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('76','isopenjifen','积分支付','开启积分支付后，商品可以用积分支付','6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('77','isopenqianbao','钱包支付','开启钱包支付后，商品可以用钱包支付','6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('78','isopenweixin','微信支付','开启微信支付后，商品可以用微信支付','6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('79','isopenzfb','支付宝支付','开启支付宝支付后，商品可以用支付宝支付','6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('80','login_award','每次登录奖励','每天登录奖励积分数，最小为0，每天登录只奖励一次','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('81','login_award_open','登录奖励','开启登录奖励后，登录后就会获得积分奖励','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('82','release_award_open','发布奖励','开启后，发布内容会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('83','release_award','每次发布奖励','每次发布内容奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('84','release_max_award','每天发布最高奖励','每天奖励不超过积分上限，设置0则无上限','2','0','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('85','collect_award_open','收藏奖励','开启后，发布内容被收藏会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('86','collect_award','每次收藏奖励','每次发布内容被收藏奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('87','collect_max_award','每天收藏最高奖励','每天奖励不超过积分上限，设置0则无上限','2','1000','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('88','likes_award_open','点赞奖励','开启后，发布内容被点赞会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('89','likes_award','每次点赞奖励','每次发布内容被点赞奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('90','likes_max_award','每天点赞最高奖励','每天奖励不超过积分上限，设置0则无上限','2','1000','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('91','comment_award_open','评论奖励','开启后，发布内容被评论会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('92','comment_award','每次评论奖励','每次发布内容被评论奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('93','comment_max_award','每天评论最高奖励','每天奖励不超过积分上限，设置0则无上限','2','1000','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('94','follow_award_open','关注奖励','开启后，用户被粉丝关注会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('95','follow_award','每次关注奖励','每次被关注奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('96','follow_max_award','每天关注最高奖励','每天关注奖励不超过积分上限，设置0则无上限','2','1000','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('97','isopenemail','发送邮件','是否开启邮件发送','6','1','4','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('98','closeweb','关闭网站','关闭网站后，前台无法访问，后台可以进入','6','0','1','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('99','closetip','关站提示', NULL,'3','抱歉！该站点已经被管理员停止运行，请联系管理员了解详情！','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('100','admin_save_path','后台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('101','home_save_path','前台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('102','isajax','是否开启前台AJAX','开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据','6','0','2', '开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('104','invite_award_open','是否开启邀请奖励','开启邀请后则会奖励','6','0','7', '开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('105','invite_type','邀请奖励类型', NULL,'6','jifen','7', '积分=jifen,金币=money','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('106','invite_award','邀请奖励数量', NULL,'2','0','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('107','web_phone','网站手机', NULL,'2','0','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('108','web_weixin','站长微信', NULL,'1', NULL,'1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('110','isregister','前台用户注册','关闭前台注册后，前台无法进入注册页面','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('111','onlyinvite','仅邀请码注册','开启后，必须通过邀请链接才能注册！','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('112','release_table','允许前台发布模块','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割','2','article|product','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('113','search_words','前台搜索的字段','可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割','2','title','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('114','closehomevercode','前台验证码','关闭后，登录注册不需要验证码','6','0','2','关闭=1,开启=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('115','closeadminvercode','后台验证码','关闭后，后台管理员登录不需要验证码','6','0','2','关闭=1,开启=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('116','tag_table','TAG包含模型','在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product','2','article|product','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('118','isopendmf','支付宝当面付', NULL,'6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('119','search_words_muti','前台多模块搜索的字段','多个模块直接必须都有相同的字段，否则会报错','3','title','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('120','search_table_muti','多模块允许搜索的表','防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product','2','article|product','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('121','search_fields_muti','允许查询显示的字段','多模块搜索允许查询显示的字段','3','id,tid,litpic,title,tags,keywords,molds,htmlurl,description,addtime,userid,member_id,hits,ownurl,target','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('122','ueditor_user_config','前台编辑器设置','前台的编辑器功能菜单设置','3','&quot;undo&quot;, &quot;redo&quot;, &quot;|&quot;,&quot;paragraph&quot;,&quot;bold&quot;,&quot;forecolor&quot;,&quot;fontfamily&quot;,&quot;fontsize&quot;, &quot;italic&quot;, &quot;blockquote&quot;, &quot;insertparagraph&quot;, &quot;justifyleft&quot;, &quot;justifycenter&quot;, &quot;justifyright&quot;,&quot;justifyjustify&quot;,&quot;|&quot;,&quot;indent&quot;, &quot;insertorderedlist&quot;, &quot;insertunorderedlist&quot;,&quot;|&quot;, &quot;insertimage&quot;, &quot;inserttable&quot;, &quot;deletetable&quot;, &quot;insertparagraphbeforetable&quot;, &quot;insertrow&quot;, &quot;deleterow&quot;, &quot;insertcol&quot;, &quot;deletecol&quot;,&quot;mergecells&quot;, &quot;mergeright&quot;, &quot;mergedown&quot;, &quot;splittocells&quot;, &quot;splittorows&quot;, &quot;splittocols&quot;, &quot;|&quot;,&quot;drafts&quot;, &quot;|&quot;,&quot;fullscreen&quot;','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('123','article_config','内容配置', NULL,'3','{\"seotitle\":1,\"litpic\":1,\"description\":1,\"tags\":1,\"filter\":\"title,keywords,body\"}','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('124','product_config','商品配置', NULL,'3','{\"seotitle\":1,\"litpic\":1,\"description\":1,\"tags\":1,\"filter\":\"title,keywords,body\"}','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('125','isdebug','PHP调试','测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('126','plugins_config','插件配置', NULL,'2','http://api.jizhicms.cn/plugins.php','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('127','template_config','插件配置', NULL,'2','http://api.jizhicms.cn/template.php','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('128','closesession','前台SESSION','关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以关闭，使用会员支付等必须开启','6','0','2','关闭=1,开启=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('129','messageyzm','留言验证码','开启后，前台留言需要填写验证码','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('130','homerelease','前台发布审核','开启后需要后台审核，关闭则不需要','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('131','hideclasspath','栏目隐藏.html','开启后栏目链接将没有.html后缀','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('132','classtypemaxlevel','栏目全局递归','默认开启，栏目超过20个，请关闭此选项，有一定程度提升访问速度！','6','0','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('133','hidetitleonliy','字段重复检测', '将【模块标识-检测字段】填写进去，用|进行分割，将会进行标题重复检测。如：article-title|product-title','2','article-title|product-title','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('134','onlyuserupload','会员上传限制','开启后，仅会员才可以上传！受会员上传大小限制！','6','1','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('135','cachefilenum','缓存文件数','0表示不限制，最大不超过500','2','100','0',null,0,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('136','watermark_word','水印文字','只有没有水印图片的时候才生效','2','这个是水印文字','8',null,96,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('137','watermark_font','水印字体','默认Alibaba-PuHuiTi-Bold.ttf，存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,95,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('138','watermark_size','水印大小','默认24','2','24','8',null,94,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('139','watermark_h','水印行高','默认34','2','34','8',null,93,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('140','watermark_rgb','水印颜色','默认白色：#FFFFFF','2','#FFFFFF','8',null,92,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('141','watermark_x','水印微调X','相对水印位置再进行X轴微调，默认0','2','0','8',null,91,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('142','watermark_y','水印微调Y','相对水印位置再进行Y轴微调，默认0','2','10','8',null,90,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('143','text_waterlitpic','缩略图标题水印','文章缩略图进行水印文章标题，开启后生效','6','0','8','开启=1,关闭=0',89,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('144','text_litpic','默认缩略图','当文章没有缩略图的时候生效','1',null,'8',null,88,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('145','text_molds','支持模型','填写模型标识，如：article,product','2','article,product','8',null,87,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('146','text_num','每行文字数','默认10个字','2','10','8',null,86,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('147','text_size','文字大小','默认24','2','24','8',null,85,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('148','text_h','文字行高','默认34','2','34','8',null,84,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('149','text_rgb','文字颜色','默认白色：#FFFFFF','2','#FFFFFF','8',null,83,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('150','text_font','文字字体','默认Alibaba-PuHuiTi-Bold.ttf，存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,82,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('151','text_wz','水印位置','九宫格1-9，默认5中间','2','5','8',null,81,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('152','text_x','微调X','相对于水印位置再进行X轴微调，默认0','2','0','8',null,80,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('153','text_y','微调Y','相对于水印位置再进行Y轴微调，默认0','2','0','8',null,79,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('154','islocal','是否开启图片本地化','图片本地化可以将内容的外网图片保存到服务器','6','1','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('155','openredis','是否开启Redis','开启Redis后可以使用token登录前台账户，但必须服务器安装了Redis，在config里面需要配置redis信息','6','0','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('156','sitemap_config','sitemap配置','用于sitemap生成','3','a:3:{s:9:\"page_size\";i:10000;s:7:\"tagsurl\";s:19:\"/tags/index?id={id}\";s:8:\"filetype\";s:3:\"xml\";}','0','','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('157','schedule_table','定时发布表','带有addtime发布时间字段的表才可以使用定时发布功能,用|分隔','3','article|product','2','','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('158','upload_file_name','上传文件重命名','上传文件后是否重命名，默认开启重命名，关闭后上传文件名不会变','6','1','2','开启=1,关闭=0','1','1');\n-- ----------------------------\n-- Records of jz_tags\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_task\n-- ----------------------------\n\n"
  },
  {
    "path": "install/index.php",
    "content": "<?php\r\n\r\n// +----------------------------------------------------------------------\r\n// | FrPHP { a friendly PHP Framework } \r\n// +----------------------------------------------------------------------\r\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\r\n// +----------------------------------------------------------------------\r\n// | Author: 留恋风 <2581047041@qq.com>\r\n// +----------------------------------------------------------------------\r\n// | Date：2018/05\r\n// +----------------------------------------------------------------------\r\n\r\n\r\n//安装程序\r\n//error_reporting(0);\r\n//检查是否已安装\r\nif(file_exists('install.lock')){\r\n\texit('很抱歉，程序已安装,如需重新安装请删除install/install.lock');\r\n}\r\n\r\n//状态\r\n$errmsg=0;\r\n\r\n//相关方法\r\nfunction check_disable(){\r\n\t\t$string=ini_get(\"disable_functions\");\r\n\t\tif(strpos($string,'opendir')!==false){\r\n\t\t\t$GLOBALS['errmsg']=1;\r\n\t\t\treturn '<b>关闭中！</b>';\r\n\t\t}else{\r\n\t\t\treturn '开启';\r\n\t\t}\r\n\t}\r\nfunction check_chinese(){\r\n\tif(preg_match('/[\\x{4e00}-\\x{9fa5}]/u', $_SERVER['DOCUMENT_ROOT'])>0){\r\n\t\t$GLOBALS['errmsg']=1;\r\n\t\treturn '<b>网站路径中不能含有中文！</b>';\r\n\t}else{\r\n\t\treturn $_SERVER['DOCUMENT_ROOT'];\r\n\t}\r\n}\r\n\r\nfunction check_version(){\r\n    \r\n    if (PHP_VERSION < 5.6) {\r\n        $GLOBALS['errmsg']=1;\r\n        return '<b>'.PHP_VERSION.'不满足</b>';\r\n    }else if(PHP_VERSION > 7.5){\r\n        $GLOBALS['errmsg']=1;\r\n        return '<b>'.PHP_VERSION.'不满足</b>';\r\n    }else{\r\n        return PHP_VERSION;\r\n    }\r\n}\r\n//检查目录是否可写入\r\nfunction new_is_writeable($file) {\r\n    if (is_dir($file)){\r\n        $dir = $file;\r\n        if ($fp = @fopen(\"$dir/test.txt\", 'w')) {\r\n            @fclose($fp);\r\n            @unlink(\"$dir/test.txt\");\r\n            $writeable = 1;\r\n        } else {\r\n            $writeable = 0;\r\n\t\t\t$GLOBALS['errmsg']=1;\r\n        }\r\n    } else {\r\n        if ($fp = @fopen($file, 'a+')) {\r\n            @fclose($fp);\r\n            $writeable = 1;\r\n        } else {\r\n            $writeable = 0;\r\n\t\t\t$GLOBALS['errmsg']=1;\r\n        }\r\n    }\r\n \r\n    return $writeable;\r\n}\r\n\r\n//获取后台文件名\r\nfunction get_admin_url(){\r\n    $data = file_get_contents(\"../index.php\");\r\n    if(stripos($data,'ADMIN_MODEL')!==false){\r\n        $r = preg_match(\"/define\\('ADMIN_MODEL',[\\'|\\\"](.*?)[\\'|\\\"]\\)/\",$data,$matches);\r\n        if($r){\r\n            $admins = $matches[1];\r\n        }else{\r\n            $admins = 'admins';\r\n        }\r\n        \r\n    }else{\r\n        $admins = 'admins';\r\n    }\r\n    \r\n    return 'index.php/'.$admins;\r\n}\r\n\r\n//获取域名\r\nfunction GetIP(){ \r\n  static $ip = '';\r\n  $ip = $_SERVER['REMOTE_ADDR'];\r\n  if(isset($_SERVER['HTTP_CDN_SRC_IP']) && preg_match('/^([0-9]{1,3}\\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CDN_SRC_IP'])) {\r\n    $ip = $_SERVER['HTTP_CDN_SRC_IP'];\r\n  } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {\r\n    $ip = $_SERVER['HTTP_CLIENT_IP'];\r\n  } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {\r\n    foreach ($matches[0] AS $xip) {\r\n      if (!preg_match('#^(10|172\\.16|192\\.168)\\.#', $xip)) {\r\n        $ip = $xip;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return $ip;\r\n}\r\n//获取域名\r\nfunction get_domain(){\r\n\tif ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')\r\n\t{\r\n\t\t$protocol = \"https://\";\r\n\t}\r\n\telseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')\r\n\t{\r\n\t\t$protocol = \"https://\";\r\n\t}\r\n\telseif ( ! empty($_SERVER['HTTP_FROM_HTTPS']) && strtolower($_SERVER['HTTP_FROM_HTTPS']) !== 'off')\r\n\t{\r\n\t\t$protocol = \"https://\";\r\n\t}\r\n\telseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')\r\n\t{\r\n\t\t$protocol = \"https://\";\r\n\t}else if(!empty($_SERVER['HTTP_X_CLIENT_SCHEME']) && $_SERVER['HTTP_X_CLIENT_SCHEME']=='https'){\r\n\t\t$protocol = \"https://\";\r\n\t}else{\r\n\t\t$protocol = \"http://\";\r\n\t}\r\n\tif(isset($_SERVER['SERVER_PORT'])) {\r\n\t\t$port = ':' . $_SERVER['SERVER_PORT'];\r\n\t\tif((':80' == $port && 'http://' == $protocol) || (':443' == $port && 'https://' == $protocol)) {\r\n\t\t\t$port = '';\r\n\t\t}\r\n\t}else{\r\n\t\t$port = '';\r\n\t}\r\n    if(isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {\r\n        $host = $_SERVER['HTTP_X_FORWARDED_HOST'].$port;\r\n    }else if (isset($_SERVER['HTTP_HOST'])) {\r\n        $host = $_SERVER['HTTP_HOST'].$port;\r\n    }else if(isset($_SERVER['SERVER_NAME'])) {\r\n\t\t$host = $_SERVER['SERVER_NAME'].$port;\r\n\t}else if(isset($_SERVER['SERVER_ADDR'])) {\r\n\t\t$host = $_SERVER['SERVER_ADDR'].$port;\r\n    }\r\n    return $protocol.$host;\r\n}\r\n /**\r\n  * 解析SQL文件为SQL语句数组\r\n  * @param string $path\r\n  * @return array|mixed|string\r\n  */\r\n function parseSQL($path = '')\r\n {\r\n  $sql = file_get_contents($path);\r\n  //替换掉15个字符串\r\n  $sql = substr($sql,14);\r\n  $sql = explode(\"\\r\\n\", $sql);\r\n  //先消除--注释\r\n  $sql = array_filter($sql, function ($data)\r\n  {\r\n   if (empty($data) || preg_match('/^--.*/', $data))\r\n   {\r\n    return false;\r\n   }\r\n   else\r\n   {\r\n    return true;\r\n   }\r\n  });\r\n    $sql = implode('', $sql);\r\n\t//删除/**/注释\r\n\t$sql = preg_replace('/\\/\\*.*\\*\\//', '', $sql);\r\n\treturn $sql;\r\n  \r\n  \r\n}\r\n//检查是否有模板v1.9.x版本新增 \r\nfunction checktemplate(){\r\n\t$dir = '../static';\r\n\t$fileArray=array();\r\n\tif (false != ($handle = opendir ( $dir ))) {\r\n\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\tif ($file != \".\" && $file != \"..\"  && strpos($file,'.')===false && file_exists($dir.'/'.$file.'/info.php') && is_dir($dir.'/'.$file.'/backup')) {\r\n\t\t\t\t$fileArray[]=$file;\r\n\t\t\t}\r\n\t\t}\r\n\t\t//关闭句柄\r\n\t\tclosedir ( $handle );\r\n\t}\r\n\t$dblist = [];\r\n\tforeach($fileArray as $v){\r\n\t\t$dir = '../static/'.$v.'/backup';\r\n\t\tif (false != ($handle = opendir ( $dir ))) {\r\n\t\t\t$i=0;\r\n\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\tif ($file != \".\" && $file != \"..\"&& (strpos($file,\".php\")!==false) && (strpos($file,'_v')===false)) {\r\n\t\t\t\t\t$dblist[$i]=$file;\r\n\t\t\t\t\t$i++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//关闭句柄\r\n\t\t\tclosedir ( $handle );\r\n\t\t}\r\n\t\t\r\n\t}\r\n\t\r\n\t\r\n\treturn $dblist;\r\n} \r\n//检查安装进度\r\n$act = isset($_GET['act'])?$_GET['act']:'';\r\nswitch($act){\r\n\tcase 'step1':\r\n\t\t$tpl = include('tpl/step1.jizhi');\r\n\tbreak;\r\n\tcase 'step2':\r\n\t\t//检测是否有备份数据库\r\n\t\t//读取备份数据库\r\n\t\t$dir = '../backup';\r\n\t\t$fileArray=array();\r\n\t\tif (false != ($handle = opendir ( $dir ))) {\r\n\t\t\t$i=0;\r\n\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\r\n\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\r\n\t\t\t\tif ($file != \".\" && $file != \"..\"&& (strpos($file,\".php\")!==false) && (strpos($file,'_v')===false)) {\r\n\t\t\t\t\t$fileArray[$i]=$file;\r\n\t\t\t\t\t$i++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t//关闭句柄\r\n\t\t\tclosedir ( $handle );\r\n\t\t}\r\n\t\t\r\n\t\t$dblists = $fileArray;\r\n\t\t$dblists2 = checktemplate();\r\n\t\tif(count($dblists2)){\r\n\t\t\t$dblists = array_merge($dblists,$dblists2);\r\n\t\t}\r\n\t\t\r\n\t\t$admin_url = get_admin_url();\r\n\t\t$tpl = include('tpl/step2.jizhi');\r\n\tbreak;\r\n\tcase 'step3':\r\n\t\t\r\n\t\ttry{\r\n\t\t\t$pdo = new PDO(\"mysql:host=\".$_POST['host'].\";port=\".$_POST['port'].\";dbname=\".$_POST['name'],$_POST['user'], $_POST['password']); \r\n\t\t\t//更新db.config.php\r\n\t\t\t$config['db']['host'] = $_POST['host'];\r\n\t\t\t$config['db']['dbname'] = $_POST['name'];\r\n\t\t\t$config['db']['username'] = $_POST['user'];\r\n\t\t\t$config['db']['password'] = $_POST['password'];\r\n\t\t\t$config['db']['prefix'] = $_POST['prefix'];\r\n\t\t\t$config['db']['port'] = $_POST['port'];\r\n\t\t\t\r\n\t\t\t$config['redis'] = array(\r\n\t\t\t\t'SAVE_HANDLE' => 'Redis',\r\n\t\t\t\t'HOST' => '127.0.0.1',\r\n\t\t\t\t'PORT' => 6379,\r\n\t\t\t\t'AUTH' => null,\r\n\t\t\t\t'TIMEOUT' => 0,\r\n\t\t\t\t'RESERVED' => null,\r\n\t\t\t\t'RETRY_INTERVAL' => 100,\r\n\t\t\t\t'RECONNECT' => false,\r\n\t\t\t\t'EXPIRE'=>1800\r\n\t\t\t);\r\n\t\t\t$config['APP_DEBUG'] = true;\r\n\t\t\t\r\n\t\t\t$ress = file_put_contents('../conf/config.php', '<?php return ' . var_export($config, true) . '; ?>');\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t}catch(PDOException $e){\r\n\t\t\techo '<!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\" /></head><body><script type=text/javascript>alert(\"数据库连接失败！\");javascript:history.go(-1);</script></body></html>';\r\n\t\t}\r\n\t\t$db = $_POST['go_backup']==1 ? $_POST['backup_db'] : '';\r\n\t\r\n\t\t\r\n\t\t$admin_url = get_admin_url();\r\n\t\r\n\t\t\r\n\t\t//传入管理员信息\r\n\t\t$admin_name = $_POST['admin_name'];\r\n\t\t$admin_pass = $_POST['admin_pass'];\r\n\t\t$tpl = include('tpl/step3.jizhi');\r\n\tbreak;\r\n\tcase 'step4':\r\n\t\t$tpl = include('tpl/step4.jizhi');\r\n\tbreak;\r\n\tcase 'step5':\r\n\t\t$admin_url = get_domain().'/'.get_admin_url();\r\n\t\t//生成安装锁定文件\r\n\t\t$res = file_put_contents('install.lock','');\r\n\t\t$tpl = include('tpl/step5.jizhi');\r\n\tbreak;\r\n\tcase 'install_testdb':\r\n\t\t$start= ((int)$_POST['start']==0)?1:$_POST['start'];\r\n\t\t$to=((int)$_POST['to']==0)?1:$_POST['to'];\t\r\n\t\t$config = include('../conf/config.php');\r\n\t\t$db = new PDO(\"mysql:host=\".$config['db']['host'].\";port=\".$config['db']['port'].\";dbname=\".$config['db']['dbname'],$config['db']['username'], $config['db']['password']);\r\n\t\t$sql = file_get_contents('test.php');\r\n\t\t$sql = str_replace('jz_',$config['db']['prefix'],$sql);\r\n\t\t$count=100;\r\n\t\t$sql = substr($sql,14);\r\n\t\t$sql.=\"UPDATE `jz_level` SET `name`='\".$_POST['admin_name'].\"',`pass`='\".md5(md5($_POST['admin_pass']).'YF').\"' , `regtime` = '\".time().\"' , `logintime` = \".time().\"   WHERE id=1\";\r\n\t\t$db->query(\"set names utf8mb4\");\r\n\t\t$db->exec($sql);\r\n\t\techo json_encode(array('count'=>$count,\"start\"=>0,\"to\"=>$count));\r\n\t\texit;\r\n\tbreak;\r\n\tcase 'go_install':\r\n\t\t$start= ((int)$_POST['start']==0)?1:$_POST['start'];\r\n\t\t$to=((int)$_POST['to']==0)?1:$_POST['to'];\t\r\n\t\t$config = include('../conf/config.php');\r\n\t\tif($_GET['db']==''){\r\n\t\t\t$sql = file_get_contents('db.php');\r\n\t\t\t$sql.=\"UPDATE `jz_level` SET `name`='\".$_POST['admin_name'].\"',`pass`='\".md5(md5($_POST['admin_pass']).'YF').\"' , `regtime` = '\".time().\"' , `logintime` = \".time().\"   WHERE id=1\";\r\n\t\t\t$sql = substr($sql,14);\r\n\t\t\t$sql = str_replace('jz_',$config['db']['prefix'],$sql);\r\n\t\t\t$count=100;\r\n\t\t\t$db = new PDO(\"mysql:host=\".$config['db']['host'].\";port=\".$config['db']['port'].\";dbname=\".$config['db']['dbname'],$config['db']['username'], $config['db']['password']);\r\n\t\t\t\r\n\t\t\t$db->query(\"set names utf8mb4\");\r\n\t\t\t$r = $db->exec($sql);\r\n\t\t\techo json_encode(array('count'=>$count,\"start\"=>0,\"to\"=>$count,'code'=>0));\r\n\t\t\texit;\r\n\t\t}else{\r\n\t\t\t$db = new PDO(\"mysql:host=\".$config['db']['host'].\";port=\".$config['db']['port'].\";dbname=\".$config['db']['dbname'],$config['db']['username'], $config['db']['password']);\r\n\t\t\t\r\n\t\t\t$db->query(\"set names utf8mb4\");\r\n\t\t\t//$sql = file_get_contents('../backup/'.$_GET['db']);\r\n\t\t\t$path = $_GET['db'];\r\n\t\t\t$filename_arr = explode('.php',$path);\r\n\t\t\t$filename = $filename_arr[0];\r\n\t\t\t\r\n\t\t\t//读取备份数据库\r\n\t\t\t$dir = '../backup';\r\n\t\t\t$fileArray=array();\r\n\t\t\t$fileArray[] = $dir.'/'.$filename.'.php';\r\n\t\t\tfor($i=1;file_exists($dir.'/'.$filename.'_v'.$i.'.php')===true;$i++){\r\n\t\t\t   $fileArray[]=$dir.'/'.$filename.'_v'.$i.'.php';\r\n\t\t\t}\r\n\t\t\t\r\n\t\t    foreach($fileArray as $path){\r\n\t\t\t   $sql = parseSQL($path);\r\n\t\t\t   try{\r\n\t\t\t\t    $n = $db->exec($sql);\r\n\t\t\t\t\tif(!$n){\r\n\t\t\t\t\t\t$msg = $db->errorInfo();\r\n\t\t\t\t\t\tif($msg[2]){\r\n\t\t\t\t\t\t\techo json_encode(array('code'=>1,'msg'=>'数据库错误：' . $msg[2] . end($sql)));exit;\r\n\t\t\t\t\t\t} \r\n\t\t\t\t\t}\r\n\t\t\t   \r\n\t\t\t\t\r\n\t\t\t   }catch (PDOException $e){\r\n\t\t\t   \t\techo json_encode(array('code'=>1,'msg'=>$e->getMessage()));\r\n\t\t\t   \t\texit;\r\n\t\t\t   }\r\n\t\t\t   \r\n\t\t    }\r\n\t\t\tif($_POST['admin_pass']!='' && $_POST['admin_name']!=''){\r\n\t\t\t\t$sql=\"UPDATE `jz_level` SET `name`='\".$_POST['admin_name'].\"',`pass`='\".md5(md5($_POST['admin_pass']).'YF').\"' , `regtime` = '\".time().\"' , `logintime` = \".time().\"   WHERE id=1\";\r\n\t\t\t\t$sql = str_replace('jz_',$config['db']['prefix'],$sql);\r\n\t\t\t\t$db->exec($sql);\r\n\t\t\t}\r\n\r\n\t\t    echo json_encode(array('count'=>100,\"start\"=>0,\"to\"=>100,'code'=>0));\r\n\t\t\texit;\r\n \r\n\t\t}\r\n\t\t\r\n\t\r\n\tbreak;\r\n\tcase 'testdb':\r\n\ttry{\r\n\t\t//$_opts_values = array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>2,PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8');\r\n\t\t//$db = new PDO(\"mysql:host=\".$_POST['host'].\";port=\".$_POST['port'].\";dbname=\".$_POST['name'],$_POST['user'], $_POST['password'],$_opts_values); \r\n\t\t$db = new PDO(\"mysql:host=\".$_POST['host'].\";port=\".$_POST['port'],$_POST['user'], $_POST['password']);\r\n\t\t$newtable = \"CREATE DATABASE IF NOT EXISTS `\" . $_POST['name'] . \"` DEFAULT CHARACTER SET utf8mb4;\";\r\n\t\tif($db->exec($newtable)){\r\n\t\t\t$db->query(\"set names utf8mb4\");\r\n\t\t\techo json_encode(['code'=>0,'msg'=>'success']);\r\n\t\t\texit;\r\n\t\t}else{\r\n\t\t\techo json_encode(['code'=>1,'msg'=>'您没有创建数据库权限，请手动填写数据库！']);\r\n\t\t\texit;\t\r\n\t\t}\r\n\t}catch(PDOException $e){\r\n\t\techo json_encode(['code'=>1,'msg'=>'数据库连接失败，请检查数据库配置！']);\r\n\t\texit;\r\n\t}\r\n\t\r\n\tbreak;\r\n\tdefault:\r\n\t$tpl = include('tpl/index.jizhi');\r\n\tbreak;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "install/test.php",
    "content": "<?php die();?>/*\nMySQL Database Backup Tools\nServer:127.0.0.1:3306\nDatabase:www.19x.mm\nData:2022-01-26 13:48:01\n*/\nSET FOREIGN_KEY_CHECKS=0;\n-- ----------------------------\n-- Table structure for jz_article\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_article`;\nCREATE TABLE `jz_article` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`title` varchar(255) DEFAULT NULL COMMENT '文章标题',\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目',\n`molds` varchar(50) DEFAULT 'article' COMMENT '模型标识',\n`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',\n`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',\n`description` text COMMENT '简介',\n`seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID：0前台发布',\n`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',\n`body` mediumtext COMMENT '文章内容',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',\n`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击次数',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否审核：1审核0未审2退回',\n`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',\n`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条：1是0否',\n`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐：1是0否',\n`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',\n`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员：0后台发布',\n`target` varchar(255) DEFAULT NULL COMMENT '外链',\n`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',\n`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性：1置顶2热点3推荐',\n`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',\n`zan` int(11) DEFAULT '0' COMMENT '点赞数',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='文章表';\n-- ----------------------------\n-- Table structure for jz_attr\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_attr`;\nCREATE TABLE `jz_attr` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`molds` varchar(50) DEFAULT 'attr' COMMENT '模型标识',\n`name` varchar(50) DEFAULT NULL COMMENT '属性名',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='推荐属性';\n-- ----------------------------\n-- Table structure for jz_buylog\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_buylog`;\nCREATE TABLE `jz_buylog` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`aid` int(11) DEFAULT '0' COMMENT '内容ID',\n`userid` int(11) DEFAULT '0' COMMENT '会员ID',\n`orderno` varchar(255) DEFAULT NULL COMMENT '订单号',\n`type` tinyint(1) DEFAULT '1' COMMENT '交易类型：1购买商品0兑换金币',\n`buytype` varchar(20) DEFAULT NULL COMMENT '支付类型',\n`msg` varchar(255) DEFAULT NULL COMMENT '记录',\n`molds` varchar(255) DEFAULT NULL COMMENT '模型标识',\n`amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总计',\n`money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金额',\n`addtime` int(11) DEFAULT '0' COMMENT '添加时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='购买记录表';\n-- ----------------------------\n-- Table structure for jz_cachedata\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_cachedata`;\nCREATE TABLE `jz_cachedata` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`title` varchar(255) DEFAULT NULL COMMENT '标题',\n`field` varchar(50) DEFAULT NULL COMMENT '字段',\n`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`isall` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否输出所有：1是0否',\n`sqls` varchar(500) DEFAULT NULL COMMENT 'SQL',\n`orders` varchar(255) DEFAULT NULL COMMENT '排序',\n`limits` int(11) NOT NULL DEFAULT '10' COMMENT '输出条数',\n`times` int(11) NOT NULL DEFAULT '0' COMMENT '更新周期',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='数据缓存表';\n-- ----------------------------\n-- Table structure for jz_chain\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_chain`;\nCREATE TABLE `jz_chain` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`title` varchar(100) DEFAULT NULL COMMENT '内链词',\n`newtitle` varchar(100) DEFAULT NULL COMMENT '替换词',\n`url` varchar(255) DEFAULT NULL COMMENT '链接',\n`num` int(11) NOT NULL DEFAULT '-1' COMMENT '替换次数',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='内链';\n-- ----------------------------\n-- Table structure for jz_classtype\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_classtype`;\nCREATE TABLE `jz_classtype` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`classname` varchar(50) DEFAULT NULL COMMENT '栏目名',\n`seo_classname` varchar(50) DEFAULT NULL COMMENT 'SEO栏目名',\n`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',\n`description` text COMMENT '描述',\n`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',\n`body` text COMMENT '内容',\n`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',\n`orderstype` int(4) NOT NULL DEFAULT '0' COMMENT '排序类型：1时间倒序2ID正序3点击量倒序4ID正序5时间正序6点击量正序',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n`iscover` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否覆盖下级',\n`pid` int(11) NOT NULL DEFAULT '0' COMMENT '上级栏目ID',\n`gid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目权限：0不限制',\n`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',\n`lists_html` varchar(50) DEFAULT NULL COMMENT '栏目页模板',\n`details_html` varchar(50) DEFAULT NULL COMMENT '详情页模板',\n`lists_num` int(4) DEFAULT '0' COMMENT '列表数量',\n`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',\n`gourl` varchar(255) DEFAULT NULL COMMENT '栏目外链',\n`ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许会员发布',\n`isclose` tinyint(1) NOT NULL DEFAULT '0' COMMENT '关闭栏目',\n`gids` varchar(255) DEFAULT NULL COMMENT '允许访问角色',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='栏目表';\n-- ----------------------------\n-- Table structure for jz_collect\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_collect`;\nCREATE TABLE `jz_collect` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`title` varchar(255) DEFAULT NULL COMMENT '标题',\n`description` varchar(500) DEFAULT NULL COMMENT '简介',\n`tid` int(11) DEFAULT NULL COMMENT '所属栏目',\n`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',\n`w` varchar(10) NOT NULL DEFAULT '0' COMMENT '宽',\n`h` varchar(10) NOT NULL DEFAULT '0' COMMENT '高',\n`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示：1显示0隐藏',\n`url` varchar(255) DEFAULT NULL COMMENT '链接',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图';\n-- ----------------------------\n-- Table structure for jz_collect_type\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_collect_type`;\nCREATE TABLE `jz_collect_type` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`name` varchar(50) DEFAULT NULL COMMENT '分类名',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图分类';\n-- ----------------------------\n-- Table structure for jz_comment\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_comment`;\nCREATE TABLE `jz_comment` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`molds` varchar(50) DEFAULT 'comment' COMMENT '模型标识',\n`tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目tid',\n`aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章id',\n`pid` int(11) NOT NULL DEFAULT '0' COMMENT '回复帖子id',\n`zid` int(11) NOT NULL DEFAULT '0' COMMENT '主回复帖子：同一层楼内回复，规定主回复id',\n`body` text COMMENT '评论内容',\n`reply` text COMMENT '回复内容',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员：0表示游客',\n`likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示：1显示0隐藏2被删除',\n`isread` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已读：1已读0未读',\nPRIMARY KEY (`id`),\nKEY `tid` (`tid`),\nKEY `aid` (`aid`),\nKEY `pid` (`pid`),\nKEY `zid` (`zid`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='评论表';\n-- ----------------------------\n-- Table structure for jz_ctype\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_ctype`;\nCREATE TABLE `jz_ctype` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`title` varchar(50) DEFAULT NULL COMMENT '配置栏名称',\n`action` varchar(255) DEFAULT NULL COMMENT '配置标识，用于权限控制',\n`sys` tinyint(1) DEFAULT 0 COMMENT '系统配置，1是0否',\n`isopen` tinyint(1) DEFAULT 1 COMMENT '是否启用，1启用0关闭',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统设置栏目名';\n-- ----------------------------\n-- Table structure for jz_customurl\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_customurl`;\nCREATE TABLE `jz_customurl` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n`url` varchar(255) DEFAULT NULL COMMENT '自定义URL',\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='自定义链接表';\n-- ----------------------------\n-- Table structure for jz_fields\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_fields`;\nCREATE TABLE `jz_fields` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`field` varchar(50) DEFAULT NULL COMMENT '字段标识',\n`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n`fieldname` varchar(100) DEFAULT NULL COMMENT '字段名称',\n`tips` varchar(100) DEFAULT NULL COMMENT '填写提示',\n`fieldtype` tinyint(2) NOT NULL DEFAULT '1' COMMENT '输入类型',\n`tids` text COMMENT '绑定栏目',\n`fieldlong` varchar(50) DEFAULT NULL COMMENT '字段长度',\n`body` text COMMENT '字段配置',\n`orders` int(11) NOT NULL DEFAULT '0' COMMENT '表单排序',\n`ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否必填：1是0否',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台是否显示：1显示0隐藏',\n`isadmin` tinyint(1) NOT NULL DEFAULT '1' COMMENT '后台是否显示：1显示0隐藏',\n`issearch` tinyint(1) NOT NULL DEFAULT '0' COMMENT '搜索显示：1显示0隐藏',\n`islist` tinyint(1) NOT NULL DEFAULT '0' COMMENT '列表显示：1显示0隐藏',\n`format` varchar(50) DEFAULT NULL COMMENT '格式化',\n`vdata` varchar(50) DEFAULT NULL COMMENT '默认值',\n`isajax` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'AJAX显示：1显示0隐藏',\n`listorders` int(4) NOT NULL DEFAULT '0' COMMENT '列表排序',\n`isext` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否扩展信息',\n`width` varchar(50) DEFAULT NULL COMMENT '列表中显示宽度',\n`ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台表单录入',\n`ldfield` varchar(255)  DEFAULT NULL COMMENT '关联字段',\n`linkfield` varchar(255)  DEFAULT NULL COMMENT '连接字段',\n`remote` tinyint(1) NOT NULL  DEFAULT '1'  COMMENT '是否远程数据',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;\n-- ----------------------------\n-- Table structure for jz_hook\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_hook`;\nCREATE TABLE `jz_hook` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`module` varchar(50) DEFAULT NULL COMMENT '模块，Home/A',\n`namespace` varchar(100) DEFAULT NULL COMMENT '控制器命名空间',\n`controller` varchar(50) DEFAULT NULL COMMENT '控制器',\n`action` varchar(255) DEFAULT NULL COMMENT '执行函数：可同时注册多个方法，逗号拼接',\n`hook_namespace` varchar(100) DEFAULT NULL COMMENT '钩子控制器所在的命名空间',\n`hook_controller` varchar(50) DEFAULT NULL COMMENT '钩子控制器',\n`hook_action` varchar(50) DEFAULT NULL COMMENT '钩子执行方法',\n`all_action` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否全局控制器',\n`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序：越大越靠前执行',\n`isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否关闭：1开启0关闭',\n`plugins_name` varchar(50) DEFAULT NULL COMMENT '关联插件名',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件钩子';\n-- ----------------------------\n-- Table structure for jz_layout\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_layout`;\nCREATE TABLE `jz_layout` (\n`id` int(4) NOT NULL AUTO_INCREMENT,\n`name` varchar(200) DEFAULT NULL COMMENT '桌面名称',\n`top_layout` text COMMENT '顶部菜单',\n`left_layout` text COMMENT '左侧菜单',\n`gid` int(11) DEFAULT NULL COMMENT '所属角色',\n`ext` varchar(255) DEFAULT NULL COMMENT '备注',\n`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统配置：1是0否',\n`isdefault` tinyint(1) NOT NULL DEFAULT '0' COMMENT '默认配置：1是0否',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='桌面设置';\n-- ----------------------------\n-- Table structure for jz_level\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_level`;\nCREATE TABLE `jz_level` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`molds` varchar(50) DEFAULT 'level' COMMENT '模型标识',\n`name` varchar(20) DEFAULT NULL COMMENT '管理员名称',\n`pass` varchar(100) DEFAULT NULL COMMENT '密码',\n`tel` varchar(20) DEFAULT NULL COMMENT '电话号码',\n`gid` int(4) NOT NULL DEFAULT '2' COMMENT '所属角色',\n`email` varchar(50) DEFAULT NULL COMMENT '邮箱',\n`regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间',\n`logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间',\n`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1正常0冻结',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='管理员表';\n-- ----------------------------\n-- Table structure for jz_level_group\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_level_group`;\nCREATE TABLE `jz_level_group` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`molds` varchar(50) DEFAULT 'level_group' COMMENT '模型标识',\n`name` varchar(50) DEFAULT NULL COMMENT '角色名称',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n`isadmin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超管：1是0否',\n`ischeck` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发布审核：1需要审核0不需要',\n`classcontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否配置栏目权限：1是0否',\n`paction` text COMMENT '权限列表',\n`tids` text COMMENT '拥有栏目权限',\n`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1正常0冻结',\n`description` varchar(500) DEFAULT NULL COMMENT '描述',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表';\n-- ----------------------------\n-- Table structure for jz_likes\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_likes`;\nCREATE TABLE `jz_likes` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\nPRIMARY KEY (`id`),\nKEY `tid` (`tid`,`aid`,`userid`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='点赞表';\n-- ----------------------------\n-- Table structure for jz_link_type\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_link_type`;\nCREATE TABLE `jz_link_type` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`name` varchar(50) DEFAULT NULL COMMENT '友链分类名',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接分类表';\n-- ----------------------------\n-- Table structure for jz_links\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_links`;\nCREATE TABLE `jz_links` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`title` varchar(255) DEFAULT NULL COMMENT '友链名称',\n`molds` varchar(50) DEFAULT 'links' COMMENT '模型标识',\n`url` varchar(255) DEFAULT NULL COMMENT '链接',\n`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示：1显示0隐藏',\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID',\n`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',\n`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',\n`target` varchar(255) DEFAULT NULL COMMENT '外链',\n`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接表';\n-- ----------------------------\n-- Table structure for jz_member\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_member`;\nCREATE TABLE `jz_member` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`molds` varchar(50) DEFAULT 'member' COMMENT '模型标识',\n`username` varchar(50) DEFAULT NULL COMMENT '用户昵称',\n`openid` varchar(255) DEFAULT NULL COMMENT '微信OPENID',\n`pass` varchar(255) DEFAULT NULL COMMENT '密码',\n`token` varchar(255) DEFAULT NULL COMMENT 'Token',\n`sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别：1男2女0未知',\n`gid` int(11) NOT NULL DEFAULT '1' COMMENT '会员分组ID',\n`litpic` varchar(255) DEFAULT NULL COMMENT '头像',\n`tel` varchar(50) DEFAULT NULL COMMENT '手机号码',\n`jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分数',\n`likes` text COMMENT '喜欢点赞（已废弃）',\n`collection` text COMMENT '收藏（已废弃）',\n`money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金币',\n`email` varchar(255) DEFAULT NULL COMMENT '邮箱',\n`address` varchar(255) DEFAULT NULL COMMENT '地址',\n`province` varchar(50) DEFAULT NULL COMMENT '省份',\n`city` varchar(50) DEFAULT NULL COMMENT '城市',\n`regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间',\n`hassendtime` int(11) NOT NULL DEFAULT '0' COMMENT '发送验证码时间',\n`logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态：1正常0封禁',\n`signature` varchar(255) DEFAULT NULL COMMENT '个性签名',\n`birthday` varchar(25) DEFAULT NULL COMMENT '生日：2020-01-01',\n`follow` text COMMENT '关注列表',\n`fans` int(11) NOT NULL DEFAULT '0' COMMENT '粉丝数',\n`ismsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收消息提醒',\n`iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收评论消息提醒',\n`iscollect` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收收藏消息提醒',\n`islikes` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收点赞消息提醒',\n`isat` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收@消息提醒',\n`isrechange` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收交易消息提醒',\n`pid` int(11) NOT NULL DEFAULT '0' COMMENT '推荐用户ID',\n`uploadsize` int(11) NOT NULL DEFAULT '50' COMMENT '上传大小限制',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员表';\n-- ----------------------------\n-- Table structure for jz_member_group\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_member_group`;\nCREATE TABLE `jz_member_group` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`name` varchar(50) DEFAULT NULL COMMENT '分组名',\n`molds` varchar(50) DEFAULT 'member_group' COMMENT '模型标识',\n`description` varchar(255) DEFAULT NULL COMMENT '分组简介',\n`paction` text COMMENT '权限',\n`pid` int(11) NOT NULL DEFAULT '0' COMMENT '分组上级',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示',\n`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许登录',\n`iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许评论',\n`ischeckmsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否需要审核评论',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n`discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣价：现金折扣或者百分比折扣',\n`discount_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '折扣类型：0无折扣1现金折扣,1百分比折扣',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员分组';\n-- ----------------------------\n-- Table structure for jz_menu\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_menu`;\nCREATE TABLE `jz_menu` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`name` varchar(255) DEFAULT NULL COMMENT '导航名称',\n`nav` text COMMENT '导航配置',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示：1显示0不显示',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='导航表';\n-- ----------------------------\n-- Table structure for jz_message\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_message`;\nCREATE TABLE `jz_message` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`title` varchar(255) DEFAULT NULL COMMENT '标题',\n`molds` varchar(50) DEFAULT 'message' COMMENT '模型标识',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员',\n`tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章ID',\n`user` varchar(255) DEFAULT NULL COMMENT '用户名',\n`ip` varchar(255) DEFAULT NULL COMMENT 'IP',\n`body` text COMMENT '留言内容',\n`reply` text COMMENT '回复内容',\n`tel` varchar(50) DEFAULT NULL COMMENT '电话',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序',\n`email` varchar(255) DEFAULT NULL COMMENT '邮箱',\n`isshow` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否审核：1审核0未审',\n`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',\n`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='留言表';\n-- ----------------------------\n-- Table structure for jz_molds\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_molds`;\nCREATE TABLE `jz_molds` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`name` varchar(50) DEFAULT NULL COMMENT '模型名称',\n`biaoshi` varchar(50) DEFAULT NULL COMMENT '模型标识',\n`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统：1是0否',\n`isopen` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启：1开启0关闭',\n`iscontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启权限：1开启权限0不开启',\n`ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '栏目必选：1是0否',\n`isclasstype` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示栏目',\n`isshowclass` tinyint(1) DEFAULT '1' COMMENT '栏目绑定：1显示0隐藏',\n`list_html` varchar(50) DEFAULT 'list.html' COMMENT '默认列表模板',\n`details_html` varchar(50) DEFAULT 'details.html' COMMENT '默认详情模板',\n`orders` int(11) NOT NULL DEFAULT '100' COMMENT '排序',\n`ispreview` tinyint(1) DEFAULT '1' COMMENT '是否可以预览',\n`ishome` tinyint(1) DEFAULT '0' COMMENT '前台发布',\nPRIMARY KEY (`id`),\nKEY `biaoshi` (`biaoshi`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='模型表';\n-- ----------------------------\n-- Table structure for jz_orders\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_orders`;\nCREATE TABLE `jz_orders` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`orderno` varchar(255) DEFAULT NULL COMMENT '订单号',\n`molds` varchar(50) DEFAULT 'orders' COMMENT '模型标识',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '下单会员',\n`paytype` varchar(20) DEFAULT NULL COMMENT '支付方式',\n`ptype` tinyint(1) DEFAULT '1' COMMENT '交易类型：1商品购买2充值金额3充值积分',\n`tel` varchar(50) DEFAULT NULL COMMENT '电话',\n`username` varchar(50) DEFAULT NULL COMMENT '用户名',\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`price` varchar(200) DEFAULT NULL COMMENT '价格',\n`jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分',\n`qianbao` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '钱包',\n`body` text COMMENT '购买内容',\n`receive_username` varchar(50) DEFAULT NULL COMMENT '收件人',\n`receive_tel` varchar(20) DEFAULT NULL COMMENT '收件电话',\n`receive_email` varchar(50) DEFAULT NULL COMMENT '收件邮箱',\n`receive_address` varchar(255) DEFAULT NULL COMMENT '收件地址',\n`ispay` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否支付：1支付0未支付',\n`paytime` int(11) NOT NULL DEFAULT '0' COMMENT '支付时间',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '下单时间',\n`send_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '订单状态：1提交订单,2已支付,3超时,4已提交订单,5已发货,6已废弃失效,0删除订单',\n`discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣',\n`yunfei` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='订单表';\n-- ----------------------------\n-- Table structure for jz_page\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_page`;\nCREATE TABLE `jz_page` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`molds` varchar(50) DEFAULT 'page' COMMENT '模型标识',\n`htmlurl` varchar(50) DEFAULT NULL COMMENT '链接',\n`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',\n`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示：1显示0隐藏',\n`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`tids` varchar(255) NOT NULL COMMENT '副栏目',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='单页模型';\n-- ----------------------------\n-- Table structure for jz_pictures\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_pictures`;\nCREATE TABLE `jz_pictures` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',\n`molds` varchar(50) DEFAULT NULL COMMENT '模型标识',\n`path` varchar(20) DEFAULT 'Admin' COMMENT '板块：Admin后台Home前台',\n`filetype` varchar(20) DEFAULT NULL COMMENT '类型',\n`size` varchar(50) DEFAULT NULL COMMENT '大小',\n`litpic` varchar(255) DEFAULT NULL COMMENT '链接',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID/发布会员ID',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='图片集';\n-- ----------------------------\n-- Table structure for jz_pingjia\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_pingjia`;\nCREATE TABLE `jz_pingjia` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`tid` int(11) DEFAULT '0' COMMENT '所属栏目',\n`tids` varchar(255) DEFAULT NULL COMMENT '副栏目',\n`title` varchar(255) DEFAULT NULL COMMENT '标题',\n`litpic` varchar(255) DEFAULT NULL COMMENT '缩略图',\n`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',\n`description` varchar(500) DEFAULT NULL COMMENT '简介',\n`body` text COMMENT '内容',\n`molds` varchar(50) DEFAULT 'pingjia' COMMENT '模型标识',\n`userid` int(11) DEFAULT '0' COMMENT '发布管理员',\n`orders` int(11) DEFAULT '0' COMMENT '排序',\n`member_id` int(11) DEFAULT '0' COMMENT '前台用户',\n`comment_num` int(11) DEFAULT '0' COMMENT '评论数',\n`htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接',\n`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示',\n`target` varchar(255) DEFAULT NULL COMMENT '外链',\n`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义URL',\n`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性',\n`hits` int(11) DEFAULT '0' COMMENT '点击量',\n`zan` int(11) DEFAULT '0' COMMENT '点赞数',\n`tags` varchar(255) DEFAULT NULL COMMENT 'TAG',\n`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条：1是0否',\n`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐：1是0否',\n`addtime` int(11) DEFAULT '0' COMMENT '发布时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`zhiye` varchar(255) DEFAULT NULL,\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;\n-- ----------------------------\n-- Table structure for jz_plugins\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_plugins`;\nCREATE TABLE `jz_plugins` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`name` varchar(50) DEFAULT NULL COMMENT '插件名称',\n`filepath` varchar(50) DEFAULT NULL COMMENT '插件文件名',\n`description` varchar(255) DEFAULT NULL COMMENT '简介',\n`version` decimal(3,1) NOT NULL DEFAULT '0.0' COMMENT '版本',\n`author` varchar(50) DEFAULT NULL COMMENT '作者',\n`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`module` varchar(20) NOT NULL DEFAULT 'Home' COMMENT '模块',\n`isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启：1开启0关闭',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`config` text COMMENT '配置',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件表';\n-- ----------------------------\n-- Table structure for jz_power\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_power`;\nCREATE TABLE `jz_power` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`action` varchar(50) DEFAULT NULL COMMENT '函数名',\n`name` varchar(50) DEFAULT NULL COMMENT '权限名',\n`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限ID',\n`isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开放',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户权限表';\n-- ----------------------------\n-- Table structure for jz_product\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_product`;\nCREATE TABLE `jz_product` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`molds` varchar(50) DEFAULT 'product' COMMENT '模型标识',\n`title` varchar(255) DEFAULT NULL COMMENT '商品名称',\n`seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题',\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目',\n`hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量',\n`htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接',\n`keywords` varchar(255) DEFAULT NULL COMMENT '关键词',\n`description` varchar(255) DEFAULT NULL COMMENT '简介',\n`litpic` varchar(255) DEFAULT NULL COMMENT '首图',\n`stock_num` int(11) NOT NULL DEFAULT '0' COMMENT '库存',\n`price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格',\n`pictures` text COMMENT '图集',\n`isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示：1显示0不显示',\n`comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数',\n`body` mediumtext COMMENT '详情',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '录入管理员ID',\n`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\n`istop` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n`ishot` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否头条：1是0否',\n`istuijian` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否推荐：1是0否',\n`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',\n`member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员',\n`target` varchar(255) DEFAULT NULL COMMENT '外链',\n`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',\n`jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性：1置顶2热点3推荐',\n`tids` varchar(255) DEFAULT NULL,\n`zan` int(11) DEFAULT '0',\n`lx` varchar(2) DEFAULT NULL,\n`color` varchar(2) DEFAULT NULL,\n`hy` varchar(500) DEFAULT NULL,\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='商品表';\n-- ----------------------------\n-- Table structure for jz_recycle\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_recycle`;\nCREATE TABLE `jz_recycle` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`title` varchar(255) DEFAULT NULL COMMENT '标记',\n`molds` varchar(50) DEFAULT NULL COMMENT '回收模型标志',\n`data` mediumtext COMMENT '回收数据',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '删除时间',\n`aid` int(11) NOT NULL DEFAULT '0' COMMENT '关联删除',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='回收站';\n-- ----------------------------\n-- Table structure for jz_ruler\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_ruler`;\nCREATE TABLE `jz_ruler` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`name` varchar(50) DEFAULT NULL COMMENT '权限名称',\n`fc` varchar(50) DEFAULT NULL COMMENT '函数',\n`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限',\n`isdesktop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否桌面配置显示（已废弃）',\n`sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '系统：1是0否',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色权限表';\n-- ----------------------------\n-- Table structure for jz_shouchang\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_shouchang`;\nCREATE TABLE `jz_shouchang` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID',\n`aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID',\n`userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户收藏表';\n-- ----------------------------\n-- Table structure for jz_sysconfig\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_sysconfig`;\nCREATE TABLE `jz_sysconfig` (\n`id` int(11) NOT NULL AUTO_INCREMENT,\n`field` varchar(50) DEFAULT NULL COMMENT '配置字段',\n`title` varchar(255) DEFAULT NULL COMMENT '配置名称',\n`tip` varchar(255) DEFAULT NULL COMMENT '字段填写提示',\n`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '参数类型：1图片2单行文本3多行文本4编辑器5文件上传6下拉开启关闭选项7下拉是否选项8栏目选项9代码',\n`data` text COMMENT '配置内容',\n`typeid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '配置栏ID',\n`config` text COMMENT '单选多选配置信息',\n`orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n`sys` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否系统字段',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统配置';\n-- ----------------------------\n-- Table structure for jz_tags\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_tags`;\nCREATE TABLE `jz_tags` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`tid` int(11) DEFAULT '0' COMMENT '栏目ID',\n`tids` varchar(500) DEFAULT NULL COMMENT '相关栏目',\n`orders` int(11) DEFAULT '0' COMMENT '排序',\n`comment_num` int(11) DEFAULT '0' COMMENT '评论数',\n`molds` varchar(50) DEFAULT 'tags' COMMENT '模型标识',\n`htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接',\n`keywords` varchar(50) DEFAULT NULL COMMENT '关键词',\n`newname` varchar(50) DEFAULT NULL COMMENT '替换词（已废弃）',\n`num` int(4) DEFAULT '-1' COMMENT '替换次数：-1不限制',\n`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示：1显示隐藏',\n`target` varchar(50) DEFAULT '_blank' COMMENT '外链',\n`number` int(11) DEFAULT '0' COMMENT '数量',\n`member_id` int(11) DEFAULT '0' COMMENT '发布会员',\n`ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接',\n`tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签',\n`istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶：1是0否',\n`ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条：1是0否',\n`istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐：1是0否',\n`addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间',\n`updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='TAGS表';\n-- ----------------------------\n-- Table structure for jz_task\n-- ----------------------------\nDROP TABLE IF EXISTS `jz_task`;\nCREATE TABLE `jz_task` (\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n`tid` int(11) DEFAULT '0' COMMENT '栏目ID',\n`aid` int(11) DEFAULT '0' COMMENT '文章ID',\n`userid` int(11) DEFAULT '0' COMMENT '发布会员',\n`puserid` int(11) DEFAULT '0' COMMENT '对象会员',\n`molds` varchar(50) DEFAULT NULL COMMENT '模块标识',\n`type` varchar(50) DEFAULT NULL COMMENT '消息类型',\n`body` varchar(255) DEFAULT NULL COMMENT '内容',\n`url` varchar(255) DEFAULT NULL COMMENT '链接',\n`isread` tinyint(1) DEFAULT '0' COMMENT '是否已读：1已读0未读',\n`isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示：1显示0隐藏',\n`readtime` int(11) DEFAULT '0' COMMENT '阅读时间',\n`addtime` int(11) DEFAULT '0' COMMENT '发布时间',\nPRIMARY KEY (`id`)\n) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员消息表';\n-- ----------------------------\n-- Records of jz_article\n-- ----------------------------\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('1','如何有效的提高网站权重？','8', NULL,'znxw', NULL,'想要在搜索引擎的排名更靠前、提高整站的流量、提高用户对网站的信任度，所以提高网站的权重是相当重要。如何才能够快速的提高自己网站的权重，或者说哪些东西是决定网站权重的重要因素。','如何有效的提高网站权重？','1','/static/upload/2022/01/20/202201202461.jpg','<p>如何有效的提高网站的权重？想要在搜索引擎的排名更靠前、提高整站的流量、提高用户对网站的信任度，所以提高网站的权重是相当重要。如何才能够快速的提高自己网站的权重，或者说哪些东西是决定网站权重的重要因素，网站合理的内链结构布局。</p><p style=\"text-align: center;\"><img src=\"/static/upload/2022/01/20/202201202799.png\"/></p><p>目前来讲，外链的地位已不再像之前那样是SEO优化的核心，外链为皇的时代早就过去了，如今更为重要的就是网站内容，而内链就好比一张蜘蛛网一样，起着连接和传递网站系统化内容的作用。所以，内链设置必须注重合理、呼应，避免重复、堆积，这样更利于搜索引擎的抓取和收录。</p><p><br/></p><p>从目前掌握的情况而言，很多人都喜欢给首页做一个超链接，做回链是需要掌握一个度的，一般情况下，一个独立页面做上1-2个内链就可以了，导航以及面包屑导航就是最好的内链，因此，在做内链的时候千万别滥用，否则会被百度惩罚，认为你的网站是为了做排名而做排名，不具备用户搜索的参考价值。优化建议：做好具有引导性的内链，大量的回链犹如“七伤拳”，用得好利于排名，用不好则属于自残，在这里，建议广大的SEO千万不要在底部或者文章中做太多的内链，要做符合用户搜索的内容。</p><p><br/></p><p>好的域名及稳定的服务器和打开速度。</p><p><br/></p><p>对于优化而言，好的域名主要是指域名中包含关键词或者企业名称，最好简短易记。其次，就是老域名和新域名的区分，当然老域名更利于优化。域名只是影响优化的一小部分，而网站服务器的稳定性和打开速度却是极为重要的一部分。数据调查显示，通常一个打开速度较慢的站点会减少60%的流量，而且网站一旦出现服务器异常，打不开，可能就会造成对搜索引擎的不友好现象，收录成为困难。</p><p><br/></p><p>有规律的产生日常更新维护。</p><p><br/></p><p>如今的搜索引擎更注重高质量的原创内容，而高质量的标准取决于可读性、稀缺性、价值性三个方面。所以，大家在更新网站内容的时候要把握好这几点，高质量的原创内容一直是网站用户和搜索引擎喜欢的，当然这里说的原创也并非原创，很多朋友都能理解这块，比如某个网站发布一篇类似文章，但由于对方排版不清晰该插入图片或视频的地方未进行操作密密麻麻的文章给人的一种感觉都不是很友好，此时我们又需要这篇文章怎么办，解决对方未完成的细节问题再发布，搜索引擎依然会认为你的文章比你抄袭的文章更有价值意思。</p><p><br/></p><p>美观、有逻辑性的排版布局。</p><p><br/></p><p>因为现在的网民审美及网站功能各方面的要求提高，美观似乎已成为每个网站的基本要求，因为只有满足了用户的浏览及感官体验，才能达到所谓的用户体验和粘度。但是美观并不代表就一定有酷炫的功能和风格，因为JS、FLASH等特效方式的渲染力虽大于图片，但是搜索引擎是抓不到，对搜索引擎来说是不友好的。所以，在保证美观、逻辑性的排版布局的同时，JS等特殊效果尽量少用。但目前从泽民了解的情况而言JS百度也是可以抓取的。</p><p><br/></p><p>有些朋友每天更新文章，但排版乱七八糟，字体忽大忽小，要么就是文字过多，一张图片也没有，密密麻麻的文字，或者是文字小得可怜，正常情况下，14px-16px的字体是最适合用户阅读的，建议大家在为网站更新文章的时候，最好用图文并茂的模式，排版干净整洁，赢得客户的第一印象，搜索引擎也会根据页面的整洁度给予好的评分。</p><p><br/></p><p>合理利用优化标签。</p><p><br/></p><p>你是否合理的运用了这些标签?很多人不会用，也有很多人会用但使用过度了，标签是优化常用的一个标签，在单页面优化中，它的存在也是对页面优化起到了很大的促进作用，在最能突出页面内容的地方加上 会让搜索引擎优先抓取，然后在一层一层往下面抓取，会让搜索引擎更好的了解该页面的核心内容，但一个页面只能有一对 ，至于 可以使用多次，但要使用合理。</p><p><br/></p><p>三大标签TDK的正确写。</p><p><br/></p><p>我想这个时候肯定有人会问我为什么把标题写法最主要的一点写在最后，正因为重要我才写到最好，判断一个合格的SEO人员首先是看你写的标题是否完美，常见的标题写法就是把公司做的产品词全部写在标题上，这是百分之80SEO人员的通病，百度在之前对标题的写法做出的回应具体如下：</p><p><br/></p><p>网站首页title的写法：网站标题 ?或者 ?网站标题_服务词或者产品词;</p><p><br/></p><p>网站频道页title的写法：频道名称_网站名称;</p><p><br/></p><p>网站文章页title的写法：文章标题_频道名称_网站名称;</p><p><br/></p><p>这种写法符合重要的内容放在title前面，权重从左到右依次递减的规则。</p><p><br/></p><p>这里在补充一点，在写标题的时候一定要考虑到百度的分词算法，很多人都不知道，分词的规则：a，在百度搜索一个三个以三个以下汉字的关键词，百度不会对关键词进行分割，百度显示的是所有匹配完整关键词的搜索结果;b，在百度搜索四个汉字以上的关键词，百度会对关键词进行分割，百度会显示完整关键词和组合关键词的搜索结果;分词后组合的方式有非常多种，对我们SEO来说，最有价值的还是分词的正向最大匹配法以及逆向匹配法。说白一点，就是title在分词后，可以正向和反向的组合不同的关键词。</p><p><br/></p><p>优质的内外链接：我们的内链如果做得好话，让我们更加容易的找到自己想要的资料，让网民更好的阅读我们的文章，这样网民停留在我们网页的时间也变久了，对于权重的提升很有帮助优质是外链要从友情链接做起，不求多但求精，质量重于数量，多寻找一些高质量的友情链接，不仅能提升网站权重，还能辅助相关的关键字提升。</p><p><br/></p>','1642639144','0','10','1','0','0','0','0','SEO','0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('2','SEO优化细节问题','8', NULL,'znxw', NULL,'我们可以发现，现在很多企业站都在做SEO优化，让自己的网站能让更多的人搜索到，但是当我们在优化的过程中，有时会由于一些操作而带来一些影响，有些细节问题大家一定要注意，我们一起来了解一下。','SEO优化细节问题','1','/static/upload/2022/01/20/202201206807.jpg','<p>1.H1、H2、H3标签的使用，这个对于一个seo人员来说也是需要了解的基本功能。它可以加重对关键词的描述，通俗一点说就是能够更好的集中网站的权重。</p><p><br/></p><p>2.META标签是HTML标记头部区的一个关键标签，提供文档字符集、使用语言、作者等基本信息，以及对关键词和网页等级的设定等，最大的作用是能够做搜索引擎优化(SEO)。</p><p><br/></p><p>3.title标签能够让搜索引擎在栏目上显示你提交的文字，也就是咱们经常说到的标题前缀。</p><p><br/></p><p>4.处理图片Alt、title标签以及为页面添加元标记meta 网站经常都会更新图片，因此为图片增加alt是非常重要的，这样能够更好的让搜索引擎识别你网站上的图片。</p><p><br/></p><p>5.大家都知道人的搜索习惯是通过关键词、标题、描述来进行搜索，因此定位好你每个页面的标题、关键词、描述也是必不可少的一环。同时还需要注意的是个别关键词的密度问题。</p><p><br/></p><p>6.网站地图专业名字也叫做sitemap 这个可以通过一些专业的工具去生成，然后提交给搜索引擎，使得搜索引擎对你的网站更加友好。</p><p><br/></p><p>7.404页面设置、301重定向这两个主要在于提高网站体验度这方面，当你的网站出现死链，或者访问不了的情况那么就需要用到404跳转页面了。</p><p><br/></p><p>8.Robot.txt如果你没有接触过seo行业看起来一定很陌生，Robot.txt所起的作用是至关重要的，他能让搜索引擎更好的识别你的网站哪些内容是该抓取收录的，哪些内容是不能抓取收录的。</p><p><img src=\"/static/upload/image/20220120/1642640161966799.jpeg\" title=\"1642640161966799.jpeg\" alt=\"seo-1.jpeg\"/></p><p>网站首页被K的原因</p><p><br/></p><p>在外链方面应当循序渐进.并且有规律的增长，如果突然之间失去了一些外链的话，就会造成网站降权或者被K，所以说要其有广泛性，不要在一个网站上拴住。当然做的外链在权重高的网站那是肯定的好了，但要注重质量，自己把握的住就好。</p><p><br/></p><p>使用了一些作弊手段，这也会导致你的站点被降权或K站。如果你没有做这些，也许是竟争对手用这些手段在陷害你的站，这得注意下，经常查查外链情况，如果有垃圾外链过来的话，就用百度外链工具屏蔽掉吧。</p><p><br/></p><p>服务器影响：如果使用的空间同IP中有大量博彩类网站，或者有网站被降权或被K，都有可能影响到同iP下你的网站，这个影响的程度我也说不好，这点可注意一下。服务器的不稳定因素也是排名提不上去或被降权的原因之一，服务器的不稳定，造成搜索无法正常访问，故而做出惩罚。</p><p><br/></p><p>关键词密度问题：并且要注意不要堆砌关键词，关键词的密度应当&lt;8%，这个可以使用工具查询的到，其实这个关键词的密度，大家就仁者见仁智者见智了。</p><p><br/></p><p>网站内容问题：多写意些高质量的相关原创文章，增加搜索引擎的友好度，伪原创和转载的那肯定是不行的，尤其是新网站就更不能进行文章采集。同时要注重网站内部链优化，还要就是不要在网站不稳定期间更换模板，不然蜘蛛又需要重新抓取，影响不好。如果是新站的话，文章当中还不要放太多的链接，尤其是链接到首页的。</p><p><br/></p>','1642640121','0','1','1','0','0','0','0','SEO','0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('3','如何正确选择关键词技巧？','8', NULL,'znxw', NULL,'一个要做SEO优化的网站，如果在之前不能够选择好适当的关键词的话，那么对网站的优化会造成很大的影响，因此就会一步走错，满盘皆输的窘境。结合网站本身从用户的角度出发选择优化词网站调整完毕以后主要的流量以及权...','如何正确选择关键词技巧？','1','/static/upload/2022/01/20/202201209692.jpg','<p>一个要做SEO优化的网站，如果在之前不能够选择好适当的关键词的话，那么对网站的优化会造成很大的影响，因此就会一步走错，满盘皆输的窘境。结合网站本身从用户的角度出发选择优化词网站调整完毕以后主要的流量以及权重的来源便是用户，那么我们应该怎么去让用户精准的查询到网站呢?这就要我们去站到用户的角度去考虑网站产品本身需要拓展的关键词了，精准的抓住用户的需求是企业网站有价值体现的最要表现。</p><p><br/></p><p>合理的选择优化关键词</p><p><br/></p><p>合理选择优化关键词，主要针对于中小型企业网站来说，我们不能一味的去选择指数高、搜索量大的词，前期尽量去选择一些优化关键词的长尾关键词，通过不断的提升网站的基础从而提升选择关键词的优化难度。确定关键词方向，从百度下拉框中选择精准关键词我们在确定好客户网站关键词方针以后，将关键词输入到百度搜索框中，自动弹出下拉框，下拉框中的词就是我们日常用户搜索量比较大的词。</p><p><br/></p><p>根据客户网站内容进行关键词扩展</p><p><br/></p><p>我们在为客户的网站选择关键词的时候，要根据客户网站主要做的产品、服务内容来选定大的方针，在利用一些关键词扩展工具选择一些比较多的关键词，在从中筛选出有价值的关键词。企业在进行网站关键词优化的时候，应该注重一些网络优化的细节问题，不同的网站，其优化方式有很大的不同，对于一些优化细节的问题是不容忽视的。同时要做好网站优化数据的统计与分析，这将才能够更好的做好网站优化效果。</p><p><br/></p><p>企业在进行网络推广的时候，大部分企业网站的排名都不尽人意，同时网站优化的效果差，周期长，这是现今大多数企业的通病，长期如此的话，企业也就逐渐丧失了继续优化下去的信心。</p><p><br/></p><p>做网站推广的过程中，需要注重很多相关的细节，就好比网站锚文本建设，合理的运用网站锚文本，对搜索引擎进行引导，这样也就能够促进蜘蛛的更快更精准的抓取网站内容，从而提高长尾关键词的排名、增加网站的权重。但是做网站锚文本也不是随意增加的，网站页面的相关内容能够通过锚文本，精准地指向相关网站页面的内容，可以说是锚文本对网站页面所做的内容评价。</p><p><br/></p><p>锚文本在内外链的用处</p><p><br/></p><p>内部链接内部链接的作用是提高网站的网页和网页之间增加粘度，提高用户的体验度。文章包含其他文章的关键词，那都可以做锚文本链接。一定要注意锚文本链接的多样化，不要都是指向首页的锚文本链接，这样对你的网站也是没有好处的。(内部链接的规则)</p><p><br/></p><p>外部链接外链现如今越来越不好做，个人签名和网页的网址链接现在都被百度算作了垃圾外链。锚文本链接是权重最高的链接，但是一定不要优化过度了，否则会过犹不及。</p><p><br/></p><p>锚文本怎么做?</p><p><br/></p><p>锚文本运用的地方很广，我们要把它做到：网站导航、栏目、分类目录、次导航、外部链接、友情链接、文章内的锚文本。文章内锚文本频率：站内锚文本我们提倡是控制在1%频率就好;锚文本链接放置位置：我们一般在一篇文章第一次出现这个关键词时就做成锚文本;锚文本链接数量：一篇文章如果出现多次相同的关键词，我们只做一个就好。做网站锚文本建设其实难度并不大，关键是要掌握锚文本建设的方法，合理的运用，这样才能够个网站优化效果带来很大的助益。如果为了加快网站排名的提升，随意增加锚文本数量，同时链接的相关性也比较差，自然搜索引擎就会以为存在作弊行为，就会给予相应的惩罚。</p><p><br/></p>','1642640201','0','5','1','0','0','0','0','SEO','0', NULL, NULL, NULL,',9,','0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('4','友链交换方法及友链交换平台有哪些？','9', NULL,'xyxw', NULL,'一些SEO经常咨询怎么换友链，我相信许多新手也会有这些问题。今天我分享友情链接交换的方法是什么，友情链接交换的平台是什么？','友链交换方法及友链交换平台有哪些？','1','/static/upload/2022/01/20/202201201293.jpg','<p>一些SEO经常咨询怎么换友链，我相信许多新手也会有这些问题。今天我分享友情链接交换的方法是什么，友情链接交换的平台是什么？</p><p><br/></p><p>友情链接交换的方法是什么？</p><p><br/></p><p>方法1。对于QQ群来说，更换朋友是很常见的，但与彼此的站长交流非常有效和快捷。</p><p>您可以去QQ群找到自己，并与合适的网站交流。或者把你想交流的网站和一些基本信息链接起来。</p><p><br/></p><p>方法2。好友链平台本身可以在互联网上找到好友链平台，查看其他站长发布的信息，如果觉得合适的话可以更换。</p><p><br/></p><p>方法3。在自己的网站上添加一个网站，看看彼此的网站上添加了哪些朋友链接。可以直接去网站找站长交流，有些网站有在线客服，遇到好的客服你很幸运，点低吗？让我们换一个。如果你有客户服务，就可以了。你们中的一些人会留下网站管理员的联系信息，并有申请朋友链接的功能。推荐阅读(深圳搜索引擎优化培训)</p><p><br/></p><p>方法4。注册更多的网站和论坛，为发布好友链找到一个特殊的目录区域，并把自己</p><p>编辑后的网站好友链接信息应该随时发布。建议一些网站不能留下链接，所以不要留下它们，避免删除它们，并留下您的网站名称。关键词相关性，我们应该对这个频道感到满意，哈哈。留下你的微信</p><p>一些QQ论坛仍然可以使用。百度贴吧是一部精彩的作品。让我们说点别的。</p><p><br/></p><p>方法5。购买好友链具有选择自由、重量大、流量大的优点。缺点:花钱多、长期提款多、流动性和风险不稳定。</p><p><br/></p><p>什么是友好的友情链接交换平台？</p><p><br/></p><p>滴滴友情链接网</p><p><br/></p><p>专为站长和SEOer交流和交易友好链接而开发的友好链接平台欢迎站长使用犀牛云链接。它拥有丰富的资源和交易，帮助您节省链交换时间和提高工作效率。</p><p><br/></p><p>云链接链接交换平台</p><p><br/></p>','1642640580','0','3','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('5','什么是网站子域名对优化排名优缺点有哪些','8', NULL,'znxw', NULL,'对于刚刚接触到网站建设优化的网站管理员搜索引擎优化人员来说，他们可能不熟悉子域子目录，有些人可能没有听说过。今天将告诉你什么是子域子目录，优化排名的优缺点是什么？希望能够帮助那些新手站长搜索引擎优化人...','dasdsadsa','1','/static/upload/2022/01/19/202201192968.jpg','<p>对于刚刚接触到网站建设优化的网站管理员搜索引擎优化人员来说，他们可能不熟悉子域子目录，有些人可能没有听说过。今天将告诉你什么是子域子目录，优化排名的优缺点是什么？</p><p><br/></p><p>希望能够帮助那些新手站长搜索引擎优化人员！</p><p><br/></p><p>什么是子域？</p><p><br/></p><p>子域名称(或子域；中文:子域)是域名系统级别中属于更高级别域的域。例如，mail.example.com和calendar.example.com是example.com的两个子域，而example.com是顶级域的子域。请访问。</p><p><br/></p><p>子域名:它是顶级域名的下一级(一级域名或父域名)。域名作为一个整体包括两个。或者包括一个”和一个“/”。</p><p><br/></p><p>什么是子目录？</p><p><br/></p><p>子目录:父目录中的目录。子目录也可以有子目录，子目录是无限的。推荐阅读(为什么不去网站关键词排名)</p><p><br/></p><p>我们说简单地理解它是在我们网站的根目录下建立的任何文件夹(我们公司用户网站的根目录是wwwroot，如果一个文件夹是在wwwroot下建立为abc，那么abc就是一个子目录，也就是说，这个子目录的名称是abc)。子目录技术可以将任何附加域放在这些任意建立的子目录下。</p><p><br/></p><p>子域有什么优点？</p><p><br/></p><p>1.使用过网站的人非常清楚，如果域名包含关键词，优化他们的网站是非常有帮助的。当列表出现时，如果你想提高你的瓶颈，你需要搜索引擎所需的权重。当然，这对小站长来说更难。如果我们使用子域，您的列表将翻倍。</p><p><br/></p><p>2.他的体重比目录重很多倍。经过仔细优化后，您的权重比子目录更容易获得排名。可以分成很多很多分类页面，也可以单独转移到服务器上，目录无法实现。</p><p><br/></p><p>3.如果大量的二级域名组成一个子域站组，这将大大有助于提升主域名的权重。</p><p><br/></p><p>4.该网站规模很大，获得了更多的选票。你也可以挂更多的友情链接。强大的品牌建设。推荐关注点(搜索引擎优化开始)</p><p><br/></p><p>子域有什么缺点？</p><p><br/></p><p>1.他最大的重量是他不能继承头版的重量，就像一个新网站一样。如果你的主域优化得很好，你可以考虑打开另一个网站。</p><p><br/></p><p>2.工作量将会增加，这与主站的内容不协调。内容差异很大，不相关。</p><p><br/></p><p>3.不要滥用子域。搜索引擎很容易将他们视为作弊。最好不要启用没有很多内容的子域。</p><p><br/></p><p>子目录有什么优点？</p><p><br/></p><p>子目录的优点是它们可以继承主域的权重。子目录。内容的质量会影响你网站的整体得分。为了更快的操作，只需要一个后台。</p><p><br/></p><p>子目录的缺点是什么？</p><p><br/></p><p>缺点是收集压力大，搜索次数少。子目录不利于良好的友谊链接。</p><p><br/></p><p>然而，如何使用它取决于您的应用程序对象。如果你想创建一个子域，首先要注意你的网站是否适合这样做。如果你是一个大网站，比如58、Ganji、腾讯、网易、新浪，你自然会选择子域，因为你的规模已经达到了一定的水平，这些网站的信息和资源是巨大而广泛的。使用单个子域名制作一个领域和行业的内容没有问题，也不需要坚持使用单个关键词，而是要考虑用户的习惯。</p><p><br/></p><p>如果您是一个中小型网站，此时不建议使用子域。我建议使用子目录更合适，因为子域相当于全新的网站，短期内不会给你带来高搜索引擎优化性能。此外，您自己的中小型网站的内容数据相对较少，不足以支持子域的数量。此外，子域增加了维护成本和工作量。如果你没有足够的诗句来管理，你的体重会导致水平的现象。</p><p><br/></p>','1642641743','0','5','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('9','极致CMS不使用伪静态可以吗？','5', NULL,'faq', NULL,'不可以！极致CMS必须使用伪静态。因为在自定义链接上面做了一定的处理，所以必须使用伪静态。','极致CMS不使用伪静态可以吗？','1', NULL,'<p>不可以！极致CMS必须使用伪静态。因为在自定义链接上面做了一定的处理，所以必须使用伪静态。</p>','1642943414','0','0','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('10','极致CMS框架是ThinkPHP吗？','5', NULL,'faq', NULL,'不是！是自主研发的FrPHP框架，仓库地址：https://gitee.com/Cherry_toto/FrPHP 也是免费使用的一个简单框架，只不过伪静态配置跟thinkphp一样。','极致CMS框架是ThinkPHP吗？','1', NULL,'<p>不是！是自主研发的FrPHP框架，仓库地址：<a href=\"https://gitee.com/Cherry_toto/FrPHP\">https://gitee.com/Cherry_toto/FrPHP</a> </p><p>也是免费使用的一个简单框架，只不过伪静态配置跟thinkphp一样。</p>','1642943502','0','58','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('11','平台靠什么盈利？是否会一直维护下去？','5', NULL,'faq', NULL,'目前平台是不盈利运营的，当然，说不盈利只不过是指不从极致CMS系统授权方面，而官方有应用市场（https://app.jizhicms.cn），还有极致云（https://idc.jizhicms.com/）平台，虽然两个平台没什么收入，但也算盈利的一...','平台靠什么盈利？是否会一直维护下去？','1', NULL,'<p>目前平台是不盈利运营的，当然，说不盈利只不过是指不从极致CMS系统授权方面，而官方有应用市场（<a href=\"https://app.jizhicms.cn\">https://app.jizhicms.cn</a>），还有极致云（https://idc.jizhicms.com/）平台，虽然两个平台没什么收入，但也算盈利的一部分。我只不过不希望从授权上盈利，我觉得开源免费就应该完全免费，让大家都能安心的用系统。</p><p>只要不是特殊原因，我们都会一直维护下去。后续我们也会开发更多的产品，给大家使用。</p><p><br/></p>','1642943612','0','11','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('7','新手零基础学SEO难吗？','9', NULL,'xyxw', NULL,'许多初学者学习搜索引擎优化大多是新手，新手学习搜索引擎优化更担心的问题是零基本搜索引擎优化难，零基本搜索引擎优化要学多久？今天，我想和你谈谈这个饥饿的问题。我希望我能帮助你！','新手零基础学SEO难吗？','1','/static/upload/2022/01/19/202201198505.jpg','<p>许多初学者学习搜索引擎优化大多是新手，新手学习搜索引擎优化更担心的问题是零基本搜索引擎优化难，零基本搜索引擎优化要学多久？今天，我想和你谈谈这个饥饿的问题。我希望我能帮助你！</p><p><br/></p><p>零基础研究的搜索引擎优化困难吗？</p><p><br/></p><p>零基础的定义:零基础意味着搜索引擎优化一无所知。你经常浏览网页吗？你知道搜索引擎的投标位置和共同位置吗？你了解搜索引擎优化的基本定义和功能吗？或者你知道程序，但不知道搜索引擎优化？回答完这些问题后，我们可以定位自己，并确定我们是否真的从零开始。</p><p><br/></p><p>搜索引擎优化对零基础研究来说困难吗？事实上，这是一个错误的命题。大多数人认为搜索引擎优化很难学，因为学习搜索引擎优化的过程并不难，但大多数人仍然可以做得很好。认为搜索引擎优化不难学，已经在学搜索引擎优化，并且对搜索引擎优化有着深刻的理解，能够正确操作。</p><p><br/></p><p>零基础搜索引擎优化研究需要多长时间？</p><p><br/></p><p>准备加入搜索引擎优化专业的人，会考虑搜索引擎优化学习多长时间的实际问题，实际上学习搜索引擎优化多长时间是一个错误的命题。学习是无止境的，搜索引擎优化是一个持续的学习过程，几乎没有终点。再说，什么是“会议”？有几个层次。搜索引擎优化的基本学习时间大约是两个月，这两个月的每一天都需要固定的时间来学习和记忆。</p><p><br/></p><p>成为搜索引擎优化专家需要多长时间？</p><p><br/></p><p>答案是不确定的。没有必要花很多时间成为搜索引擎优化行业的大玩家。除了必要的时间投入，大量的独立思考，大量的实际网站优化，大量的参考优化技术和个人知识库的存储都是必要的。</p><p><br/></p><p>搜索引擎优化学习的基本内容是什么？</p><p><br/></p><p>1.关键词:分析、挖掘、密度分析、布局、查询和排名、长尾关键词排名</p><p><br/></p><p>2.站内优化:站内优化细节、网址优化、伪静态和动态、死链接查询和解决方案、链内优化、网站地图制作、301重定向设置、robots.txt、404错误页面设置、图片优化技术、网站内容策略。</p><p><br/></p><p>3.站外优化:站外优化策略、友谊链接交换、网站提交门户、站外软文章推广和高质量的站外链架设。</p><p><br/></p>','1642645778','0','87','1','0','0','0','0','SEO','0', NULL, NULL,',3,', NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('8','极致CMS免费吗？','5', NULL,'faq', NULL,'极致CMS完全免费，不收取系统的授权费，且免费商用！但是，有的模板如果有标记授权或者付费的，另当别论，因为有的模板二开过，有些文件在系统内，可能整站出售。','极致CMS免费吗？','1', NULL,'<p>极致CMS完全免费，不收取系统的授权费，且免费商用！</p><p>但是，有的模板如果有标记授权或者付费的，另当别论，因为有的模板二开过，有些文件在系统内，可能整站出售。</p>','1642943290','0','32','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('6','网站死链接应该如何处理','8', NULL,'znxw', NULL,'网站死链接应该如何处理？当你的网站有了死链接之后，你觉得这些链接对网站的影响不是很大，那么就可以删除这些链接，但是在删除的过程中一定要注意不能扩大化删除链接，即删除链接不要太多，将死链接删除即可。而遇...','网站死链接应该如何处理','1','/static/upload/2022/01/19/202201199543.jpg','<p>网站死链接应该如何处理？当你的网站有了死链接之后，你觉得这些链接对网站的影响不是很大，那么就可以删除这些链接，但是在删除的过程中一定要注意不能扩大化删除链接，即删除链接不要太多，将死链接删除即可。而遇到一些栏目链接的时候一定不要将之删除了，那样会造成网站栏目的缺乏，站在用户体验的角度上来讲无法对用户构成利好，可能用户这次进入了你的网站，下次看到你的网站就会直接关闭，不能够形成用户二次访问率。</p><p><br/></p><p>转化页面，当你检查到网站的页面不存在的时候就可以设置转化页面进行转化，不过这个过程比较复杂，如果网站的死链接过多，那么对站长的技术与耐心也是一个挑战。</p><p><br/></p><p>利用屏蔽方法，所谓的屏蔽方法就是通过robots.txt文档将死链接屏蔽掉，让搜索引擎蜘蛛不能发现这些链接的存在，从搜索引擎的角度来讲这个方法是有效的，它逃避了搜索引擎的处罚。但是这个方法却不能够长期的使用，因为这样会造成整个网站垃圾信息过多，还不如通过404引导页面进行引导点击，这种效果对用户与搜索引擎都友好。</p><p><br/></p><p>错误链接处理方法：</p><p><br/></p><p>当网站打不开的时候先不要着急，看看是否是你输入错误。最好的解决方法就是细心。由此导弹总结以下两点希望各位站长注意：总体来说死链接和错误链接都是一样的，都是打不开的页面。工作中多多细心尽量减少死链接页面，因为死链接越多对你的优化和用户体验越不利。减少客户操作失误造成的错误链接，最好的办法就是用一个简单易记，方便输入的域名。域名中最好不要带符号等。</p><p><br/></p><p>首先要明确自己建站的目的是什么?</p><p><br/></p><p>网站类型非常之多，每一种类型其建站的目的都是不一致的，我们以企业网站为例子，企业网站无疑就是品牌产品宣传的主要阵地，主要需要面度的是定向客户因为行业不一致导致用户细分也是有差异的，在比如一个个人站长资讯类站点挂百度或者谷歌广告，当然流量为王，越多的访问量才能增加广告被点击的几率可见两者的目的有着质的区别，这一点大家一定要弄清楚。</p><p><br/></p><p>网站上线之前的栏目策划是必须的。</p><p><br/></p><p>我们知道，一个裸站是没有任何价值和意义的，网站新上线我们首先要进行外包装，比如LOGO，网站导航的设置，网站界面美工的优化，然后针对自己站点的用户需求和关键词的竞争度分析，仔细做好网站栏目的添加，这些细节全部设置好之后，我们就要针对网站内容进行关键词的布局，合理的规划首页布局尽可能的囊括所有SEO优化细节。</p><p><br/></p><p>网站上线之后第一时间提交各大搜索引擎。</p><p><br/></p><p>作为一个站长，网站建设并不是我们的最终目的，我们的核心是关注网站的权重和排名，seo优化的思维是贯穿在整个网站建设的过程中的，网站上线之后一个非常重要的细节就是尽快提交至各大搜索引擎，提交之前我们要注意一个细节要点，就是尽可能的为网站更新2篇到三篇文章，文章一定要注意质量，新站上线一定要为用户和搜索引擎留下良好的第一印象才对，这个时候我们就可以登陆各大搜索引擎的提交入口了，接下来的工作我就不用在赘述了吧!内容、外链、关键词分析布局，坚持就这样把这些基础工作做精做细吧!</p><p><br/></p>','1642644634','0','88','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0');\nINSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('12','网站SEO优化需要原创内容吗？','9','article','xyxw','seo', NULL,'网站SEO优化需要原创内容吗？','0','/static/upload/2022/01/26/202201267840.jpg','<p>随着互联网发展的日渐成熟，越来越多人选择做百度自然排名SEO，那么，有很多人就疑惑了，网站SEO优化需要原创内容吗？答案是肯定的，原因如下：</p><p><br/></p><p>　　1、百度蜘蛛更喜欢原创文章</p><p><br/></p><p>　　原创文章很重要，特别是对于新站来说，因为百度蜘蛛对于抄袭的文章会厌恶，如果百度蜘蛛在爬取你的网站的时候，发现你的网站的内容是以前网上发布过的，那么收录你的网站的文章的可能性就会变得极低，百度蜘蛛不收录，你的网站被客户搜索到的几率也就会大大降低，当客户都没办法搜索到你的网站的时候，网站建设也就没有意义可言了。所以企业网站SEO优化的时候，一定要坚持写原创文章，而且需要持续性的更新，这虽然是一个漫长的过程，但是却非常重要。</p><p><br/></p><p>　　原创的内容，不仅受百度蜘蛛喜爱，也更受客户欢迎。如果客户在浏览你的网站的时候，发现你网站的内容是网上没有过的，比较新颖的，也会特别关注你的网站，浏览的时间也就会更长，交易的可能性也就越高。当客户都喜欢网站的内容的时候，搜索引擎也会了解到这一点，在爬取的时候也会收录更多的内容。所以，坚持原创内容的更新，是一个良性循环、一举两得的事情。</p><p><br/></p><p>网站质量</p><p><br/></p><p>　　2、内容原创很重要，价值更重要</p><p><br/></p><p>　　原创文章对于企业网站SEO优化是很重要，但是原创文章就一定可以吗?答案也是否定的，在做内容的时候，我们也不能因为原创而原创。很多站长为了原创，利用一些伪原创工具制造文章更新，这么做文章的原创度是提高了，但是内容却没有任何价值可言，没有价值的内容，不仅百度蜘蛛不会喜欢，用户更不会喜欢，长此以往，百度蜘蛛也就不会再来爬取你的站点了，收录只会越来越少。所以，站长在做企业网站的时候，万不能为了原创而丢了质量，要坚持带给客户原创，坚持文章内容的可读性，坚持具有价值的内容，牺牲网站内容质量去迎合百度蜘蛛是非常愚蠢的行为。</p><p><br/></p><p>　　3、伪原创是否可行?</p><p><br/></p><p>　　在某种意义上来说，伪原创也是可行的，转载也可以。但是一定要注意比例，原创文章为主，伪原创转载类文章为辅。如果伪原创或者转载的内容是质量高的，对用户非常有价值的，那么你的文章哪怕不是原创，百度蜘蛛也会很喜欢，会收录。当然，哪怕是伪原创或者转载的内容，也需要注意跟网站的相关性，不能随意转载。</p><p><br/></p><p>　　原创内容确实很重要，但是也需要掌握原创的方法，注重营销型网站内容的内容建设，重视内容的可读性，不能为了迎合百度蜘蛛忽略了用户，搜索引擎是根本，用户体验是未来发展的方向，二者不是独立的，需要相辅相成。</p><p><br/></p><p>　　以上就是《网站SEO优化需要原创内容吗？》的全部内容，仅供站长朋友们互动交流学习，SEO优化是一个需要坚持的过程，希望大家一起共同进步。</p><p><br/></p>','1643161498','0','9','0','0','0','0','0', NULL,'1', NULL, NULL, NULL, NULL,'0');\n-- ----------------------------\n-- Records of jz_attr\n-- ----------------------------\nINSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('1','置顶','1');\nINSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('2','热点','1');\nINSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('3','推荐','1');\n-- ----------------------------\n-- Records of jz_buylog\n-- ----------------------------\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('1','0','1','No20220123161635','3','jifen','登录奖励', NULL,'1.00','1.00','1642925795');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('2','9','0','No20220123220149','3','jifen','点赞奖励','product','1.00','1.00','1642946509');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('3','9','0','No20220123220206','3','jifen','取消点赞','product','-1.00','-1.00','1642946526');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('4','9','0','No20220123220209','3','jifen','点赞奖励','product','1.00','1.00','1642946529');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('5','9','0','No20220123220358','3','jifen','取消点赞','product','-1.00','-1.00','1642946638');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('6','10','0','No20220123220410','3','jifen','点赞奖励','product','1.00','1.00','1642946650');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('7','9','0','No20220123220413','3','jifen','点赞奖励','product','1.00','1.00','1642946653');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('8','8','0','No20220123220415','3','jifen','点赞奖励','product','1.00','1.00','1642946655');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('9','9','0','No20220123220441','3','jifen','收藏奖励','product','1.00','1.00','1642946681');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('10','9','0','No20220123220450','3','jifen','取消收藏','product','-1.00','-1.00','1642946690');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('11','9','0','No20220123220450','3','jifen','取消收藏','product','-1.00','-1.00','1642946690');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('12','9','0','No20220123220655','3','jifen','收藏奖励','product','1.00','1.00','1642946815');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('13','10','0','No20220123220726','3','jifen','收藏奖励','product','1.00','1.00','1642946846');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('14','7','0','No20220123220730','3','jifen','收藏奖励','product','1.00','1.00','1642946850');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('15','10','0','No20220123221918','3','jifen','取消收藏','product','-1.00','-1.00','1642947558');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('16','10','0','No20220123221918','3','jifen','取消收藏','product','-1.00','-1.00','1642947558');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('17','10','0','No20220123221923','3','jifen','收藏奖励','product','1.00','1.00','1642947563');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('18','9','0','No20220123224512','3','jifen','取消收藏','product','-1.00','-1.00','1642949112');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('19','9','0','No20220123224512','3','jifen','取消收藏','product','-1.00','-1.00','1642949112');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('20','10','0','No20220123224623','3','jifen','取消点赞','product','-1.00','-1.00','1642949183');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('21','0','1','No20220125083513','3','jifen','登录奖励', NULL,'1.00','1.00','1643070913');\nINSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('22','0','1','No20220126083805','3','jifen','登录奖励', NULL,'1.00','1.00','1643157485');\n-- ----------------------------\n-- Records of jz_cachedata\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_chain\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_classtype\n-- ----------------------------\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('1','公司产品','公司产品','product', NULL, NULL, NULL, NULL,'0','1','1','1','0','0','product','list','details','9','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('2','公司新闻','公司新闻','article', NULL, NULL, NULL, NULL,'0','1','1','1','0','0','news','article-list','article-details','10','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('3','关于我们','关于我们','page', NULL, NULL, NULL,'<p>极致CMS是一款免费开源的建站系统。具备基础的CMS模型，可以使用它进行发布更新，进行内容管理。</p><p>而除此之外，它还有会员模块，支付模块，积分模块，不仅拥有丰富的插件，还可以自由扩展。</p><p>简单的模板标签，使你能够更快更便捷的建站。强大的拓展性，让它能够胜任市场上绝大多数的功能开发。</p><p>具备良好的SEO优化，更容易被浏览器抓取收录。毫秒级响应，百万数据承载，对大数据处理有非常丰富的经验。</p>','0','1','1','0','0','0','about-us','about-us','article-details','10','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('4','联系我们','联系我们','message','/static/cms/static/images/jizhicms.jpg', NULL, NULL, NULL,'0','1','1','0','0','0','contact','contact-us', NULL,'10','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('5','常见问题','常见问题','article', NULL, NULL, NULL, NULL,'0','1','1','0','0','0','faq','faq','article-details','10','0', NULL,'0','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('6','免费模板','免费模板','product', NULL, NULL, NULL, NULL,'0','1','1','0','1','0','free','list','details','9','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('7','商业模板','商业模板','product', NULL, NULL, NULL, NULL,'0','1','1','0','1','0','business','list','details','9','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('8','站内新闻','站内新闻','article', NULL, NULL, NULL, NULL,'0','1','1','0','2','0','znxw','article-list','article-details','10','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('9','行业新闻','行业新闻','article', NULL, NULL, NULL, NULL,'0','1','1','0','2','0','xyxw','article-list','article-details','10','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('10','用户评价','用户评价','pingjia', NULL, NULL, NULL, NULL,'0','1','0','0','0','0','yhpj','lists','details','10','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('11','技术支持','技术支持','page', NULL, NULL, NULL, NULL,'0','1','1','0','3','0','support','page','details','10','0','https://www.jizhicms.cn','1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('12','隐私协议','隐私协议','page', NULL, NULL, NULL,'<p><span style=\"color: rgb(255, 0, 0);\"><strong>极致CMS遵循 MIT协议！</strong></span></p><p><span style=\"color: rgb(255, 0, 0);\"><strong>除此外，极致CMS不允许做违纪违法的事情，如果有参与，一律自行负责，与极致CMS无关！</strong></span></p>','0','1','1','0','3','0','privacy-agreement','page','details','10','0', NULL,'1','0', NULL);\nINSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('13','广告合作','广告合作','page', NULL, NULL, NULL,'<p style=\"white-space: normal;\">极致CMS由开发者&nbsp;<strong>留恋风（如沐春）[ 25841047041@qq.com ]</strong>&nbsp;独立开发完成！</p><p style=\"white-space: normal;\">Gitee ：<a href=\"https://gitee.com/Cherry_toto/jizhicms\">https://gitee.com/Cherry_toto/jizhicms</a></p><p style=\"white-space: normal;\">Github ：<a href=\"https://github.com/Cherry-toto/jizhicms\">https://github.com/Cherry-toto/jizhicms</a></p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\">邮箱 ：2581047041@qq.com</p><p style=\"white-space: normal;\">QQ ：2581047041</p><p style=\"white-space: normal;\">微信 ：TF-2581047041</p><p style=\"white-space: normal;\"><br/></p><p style=\"white-space: normal;\"><span style=\"color: rgb(255, 0, 0);\"><strong>极致CMS源码不会携带任何广告，如果有广告合作的朋友，暂时不会在系统上加，十分抱歉！</strong></span></p><p style=\"white-space: normal;\">可以通过邮箱或者QQ联系（由于提问的人数过多，建议发送邮件咨询，QQ已加爆！<img src=\"http://img.baidu.com/hi/jx2/j_0012.gif\"/>），另外主要在QQ交流群内解答问题，如果你有问题，可以到QQ群里来提问。</p><p><br/></p><p>如果有其他项目合作的朋友，随时可以添加QQ微信联系我！<br/></p>','0','1','1','0','3','0','cooperation','page','details','10','0', NULL,'1','0', NULL);\n-- ----------------------------\n-- Records of jz_collect\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_collect_type\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_comment\n-- ----------------------------\nINSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('1','8','6','0','0','很不错！', NULL,'1642931294','1','0','1','0');\nINSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('2','8','6','1','0',' @iPHfa6 干得漂亮！', NULL,'1642932172','1','0','1','0');\nINSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('3','6','10','0','0','很不错哦！', NULL,'1643167629','1','0','1','0');\n-- ----------------------------\n-- Records of jz_ctype\n-- ----------------------------\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('1','基本设置','base',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('2','高级设置','high-level',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('3','搜索配置','searchconfig',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('4','邮件订单','email-order',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('5','支付配置','payconfig',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('6','公众号配置','wechatbind',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('7','积分配置','jifenset',1,1);\nINSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('8','图片水印','imagewatermark',1,1);\n-- ----------------------------\n-- Records of jz_customurl\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_fields\n-- ----------------------------\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('1','url','links','链接地址', NULL,'1',',0,','255', NULL,'0','1','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('2','title','links','链接名称', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('3','email','message','联系邮箱', NULL,'1', NULL,'255', NULL,'0','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('4','keywords','tags','关键词','尽量简短，但不能重复','1', NULL,'50', NULL,'0','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('5','newname','tags','替换词','尽量简短，但不能重复，20字以内，可不填。【已废弃】','1', NULL,'50', NULL,'0','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('7','num','tags','替换次数','一篇文章内替换的次数，默认-1，全部替换【已废弃】','4', NULL,'4', NULL,'0','0','1','0','0','0', NULL,'-1','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('8','target','tags','打开方式', NULL,'7', NULL,'50','新窗口=_blank,本窗口=_self','0','0','1','0','0','0', NULL,'_blank','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('9','number','tags','标签数','无需填写，程序自动处理','4', NULL,'11', NULL,'0','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('10','member_id','article','用户','前台会员，无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('11','member_id','product','用户','前台会员，无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('12','member_id','links','发布用户','前台会员，无需填写','13', NULL,'11','3,username','0','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('13','target','links','外链URL','默认为空，系统访问内容则直接跳转到此链接','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('14','ownurl','links','自定义URL','默认为空，自定义URL','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('15','ownurl','tags','自定义URL','默认为空，自定义URL','1', NULL,'255', NULL,'0','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('16','addtime','links','添加时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('17','addtime','tags','添加时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('43','molds','product','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('19','title','article','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0','250','1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('20','tid','article','所属栏目', NULL,'17', NULL,'13', NULL,'1','1','1','1','1','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('21','molds','article','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('22','htmlurl','article','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','1', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('23','keywords','article','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('24','description','article','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('25','seo_title','article','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('26','userid','article','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('27','litpic','article','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('28','body','article','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('29','addtime','article','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('30','orders','article','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('31','hits','article','点击量', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('32','isshow','article','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','1','1', NULL,'1','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('33','comment_num','article','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','1', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('34','istop','article','是否置顶：1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('35','ishot','article','是否头条：1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('36','istuijian','article','是否推荐：1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('37','tags','article','Tags', NULL,'19',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('38','target','article','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('39','ownurl','article','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('40','jzattr','article','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','0','0','150','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('41','tids','article','副栏目', NULL,'18', NULL,'255', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('42','zan','article','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('44','title','product','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','100','0','300','1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('45','seo_title','product','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('46','tid','product','所属栏目', NULL,'17', NULL,'11', NULL,'1','0','1','1','1','1', NULL,'0','1','100','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('47','hits','product','点击量', NULL,'4',',0,10,','11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('48','htmlurl','product','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('49','keywords','product','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('50','description','product','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('51','litpic','product','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','100','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('52','stock_num','product','库存', NULL,'1', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('53','price','product','价格', NULL,'1', NULL,'10,2', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('54','pictures','product','图集', NULL,'6',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,', NULL, NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('55','isshow','product','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','0','1', NULL,'1','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('56','comment_num','product','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('57','body','product','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('58','userid','product','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('59','orders','product','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','100','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('60','addtime','product','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('61','istop','product','是否置顶：1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('62','ishot','product','是否头条：1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('63','istuijian','product','是否推荐：1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('64','tags','product','Tags', NULL,'19', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('65','target','product','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('66','ownurl','product','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('67','jzattr','product','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','100','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('68','tids','product','副栏目', NULL,'18', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('69','zan','product','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('70','isshow','tags','是否显示', NULL,'7', NULL,'1','显示=1,隐藏=0,退回=2','0','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('71','lx','product','类型', NULL,'7',',1,6,7,','2','响应式=1,PC=2,手机=3,PC+手机=4,小程序=5','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('72','color','product','颜色', NULL,'7',',1,6,7,','2','红色=1,橙色=2,黄色=3,绿色=4,蓝色=5,紫色=6,粉色=7','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('73','hy','product','行业', NULL,'8',',1,6,7,','500','金融/证券=1,IT科技/软件=2,教育/培训=3,珠宝/工艺品=4,五金/机电=5,婚庆/摄影/美容=6,旅游/餐饮/美食=7,房产/汽车/运输=8,休闲/文化=9,医疗/生物/化工=10,儿童/游乐园=11,动物/宠物=12,鲜花/礼物=13,运动/俱乐部=14,生态/农业=15,建筑/装饰=16,广告/网站/设计=17,个人/导航/博客=18','2','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('74','title','pingjia','用户名','默认为空','1',',0,10,','255', NULL,'100','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('75','tid','pingjia','所属栏目','选择栏目','17',',10,','11', NULL,'100','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('76','tids','pingjia','副栏目','绑定后可以在当前模型的其他栏目中显示','18', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('77','keywords','pingjia','关键词','每个词用英文逗号(,)拼接','1', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('78','tags','pingjia','TAG','每个词用英文逗号(,)拼接','19', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('79','litpic','pingjia','头像','可留空','5',',0,10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('80','description','pingjia','简述','可留空','2',',0,10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('81','body','pingjia','内容','可留空','3',',10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('82','member_id','pingjia','发布会员','前台发布会员ID记录','13', NULL,'11','3,username','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('83','userid','pingjia','管理员','后台发布管理员ID记录','13', NULL,'11','11,name','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('84','target','pingjia','外链URL','默认为空，系统访问内容则直接跳转到此链接','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('85','ownurl','pingjia','自定义URL','默认为空，自定义URL','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('86','hits','pingjia','点击量','系统自动添加','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('87','comment_num','pingjia','评论数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('88','zan','pingjia','点赞数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('89','addtime','pingjia','添加时间','选择时间','11',',10,','11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('90','jzattr','pingjia','推荐属性','1置顶2热点3推荐','16', NULL,'50','14,name','100','0','1','0','0','0', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('91','isshow','pingjia','是否显示','显示隐藏','7',',10,','1','显示=1,隐藏=0,退回=2','100','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('92','zhiye','pingjia','职业', NULL,'1',',10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('93','orders','pingjia','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (94, 'username', 'member', '用户昵称', NULL, 1, ',0,', '255', NULL, 2, 1, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (95, 'openid', 'member', '微信OPENID', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (96, 'sex', 'member', '性别', NULL, 12, ',0,', '2', '男=1,女=2,未知=0', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (97, 'gid', 'member', '会员分组', NULL, 13, ',0,', '11', '6,name', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (98, 'litpic', 'member', '会员头像', NULL, 5, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (99, 'tel', 'member', '电话号码', NULL, 1, ',0,', '12', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (100, 'jifen', 'member', '积分', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (101, 'money', 'member', '金币', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (102, 'email', 'member', '邮箱', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (103, 'province', 'member', '省份', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (104, 'city', 'member', '城市', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (105, 'address', 'member', '详细地址', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (106, 'regtime', 'member', '注册时间', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (107, 'logintime', 'member', '最近登录', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (108, 'signature', 'member', '个性签名', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (109, 'birthday', 'member', '生日', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (110, 'pid', 'member', '推荐人', NULL, 13, ',0,', '11', '3,username', 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (111, 'isshow', 'member', '状态', '封禁后不能登录', 7, ',0,', '2', '正常=1,封禁=0', 2, 0, 1, 1, 1, 1, NULL, '1', 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (112, 'title', 'message', '标题', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (113, 'user', 'message', '用户昵称', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 0, 1, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (114, 'tid', 'message', '相关栏目', NULL, 13, ',4,', '11', '2,classname', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (115, 'tel', 'message', '联系电话', NULL, 1, ',4,', '20', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (116, 'ip', 'message', '留言IP', NULL, 1, ',4,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (117, 'body', 'message', '留言内容', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (118, 'isshow', 'message', '是否审核', NULL, 7, ',4,', '1', '未审核=0,已审核=1', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (119, 'addtime', 'message', '提交时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (120, 'reply', 'message', '回复留言', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (121, 'uploadsize', 'member', '上传限制', '单位M，上传总文件大小限制，超过此大小不允许上传', 4, ',0,', '11', NULL, 2, 0, 0, 1, 0, 0, NULL, '0', 1, 0, 0, NULL, 0);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('122','updatetime','article','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('123','updatetime','product','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('124','updatetime','pingjia','更新时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (125, 'updatetime', 'message', '更新时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1);\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('126','updatetime','links','更新时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0');\nINSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('127','updatetime','tags','更新时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1');\n-- ----------------------------\n-- Records of jz_hook\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_layout\n-- ----------------------------\nINSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('1','系统默认','[]','[{\"name\":\"内容管理\",\"icon\":\"&amp;#xe6b4;\",\"nav\":[{\"key\":\"16948\",\"title\":\"内容列表\",\"value\":\"9\",\"icon\":\"\"},{\"key\":\"12349\",\"title\":\"商品列表\",\"value\":\"105\",\"icon\":\"\"},{\"key\":\"19748\",\"title\":\"推荐属性\",\"value\":\"202\",\"icon\":\"\"}]},{\"name\":\"栏目管理\",\"icon\":\"&amp;#xe699;\",\"nav\":[{\"key\":\"10518\",\"title\":\"栏目列表\",\"value\":\"42\",\"icon\":\"\"}]},{\"name\":\"互动管理\",\"icon\":\"&amp;#xe69b;\",\"nav\":[{\"key\":\"11832\",\"title\":\"留言列表\",\"value\":\"22\",\"icon\":\"\"},{\"key\":\"11262\",\"title\":\"评论列表\",\"value\":\"16\",\"icon\":\"\"}]},{\"name\":\"SEO设置\",\"icon\":\"&amp;#xe6b3;\",\"nav\":[{\"key\":\"16628\",\"title\":\"TAG列表\",\"value\":\"147\",\"icon\":\"\"},{\"key\":\"16214\",\"title\":\"友情链接\",\"value\":\"95\",\"icon\":\"\"},{\"key\":\"16254\",\"title\":\"网站地图\",\"value\":\"153\",\"icon\":\"\"},{\"key\":\"16917\",\"title\":\"内链列表\",\"value\":\"210\",\"icon\":\"\"}]},{\"name\":\"用户管理\",\"icon\":\"&amp;#xe6b8;\",\"nav\":[{\"key\":\"11957\",\"title\":\"会员列表\",\"value\":\"2\",\"icon\":\"\"},{\"key\":\"15086\",\"title\":\"会员分组\",\"value\":\"118\",\"icon\":\"\"},{\"key\":\"10618\",\"title\":\"会员权限\",\"value\":\"123\",\"icon\":\"\"},{\"key\":\"17578\",\"title\":\"管理员列表\",\"value\":\"54\",\"icon\":\"\"},{\"key\":\"19552\",\"title\":\"角色管理\",\"value\":\"49\",\"icon\":\"\"},{\"key\":\"10895\",\"title\":\"权限列表\",\"value\":\"66\",\"icon\":\"\"},{\"key\":\"12582\",\"title\":\"订单列表\",\"value\":\"129\",\"icon\":\"\"},{\"key\":\"17076\",\"title\":\"充值列表\",\"value\":\"177\",\"icon\":\"\"}]},{\"name\":\"系统设置\",\"icon\":\"&amp;#xe6ae;\",\"nav\":[{\"key\":\"11314\",\"title\":\"网站设置\",\"value\":\"40\",\"icon\":\"\"},{\"key\":\"10572\",\"title\":\"桌面设置\",\"value\":\"70\",\"icon\":\"\"},{\"key\":\"18242\",\"title\":\"导航设置\",\"value\":\"190\",\"icon\":\"\"},{\"key\":\"13002\",\"title\":\"轮播图\",\"value\":\"83\",\"icon\":\"\"},{\"key\":\"15936\",\"title\":\"轮播图分类\",\"value\":\"89\",\"icon\":\"\"},{\"key\":\"19847\",\"title\":\"清理缓存\",\"value\":\"114\",\"icon\":\"\"},{\"key\":\"12739\",\"title\":\"模板列表\",\"value\":\"223\",\"icon\":\"\"},{\"key\":\"127391\",\"title\":\"配置栏目\",\"value\":\"240\",\"icon\":\"\"}]},{\"name\":\"扩展管理\",\"icon\":\"&amp;#xe6ce;\",\"nav\":[{\"key\":\"11957\",\"title\":\"插件列表\",\"value\":\"76\",\"icon\":\"\"},{\"key\":\"13870\",\"title\":\"图库管理\",\"value\":\"116\",\"icon\":\"\"},{\"key\":\"12472\",\"title\":\"模型列表\",\"value\":\"61\",\"icon\":\"\"},{\"key\":\"15551\",\"title\":\"数据库备份\",\"value\":\"35\",\"icon\":\"\"},{\"key\":\"16311\",\"title\":\"碎片化\",\"value\":\"194\",\"icon\":\"\"},{\"key\":\"18982\",\"title\":\"公众号菜单\",\"value\":\"141\",\"icon\":\"\"},{\"key\":\"14568\",\"title\":\"公众号素材\",\"value\":\"142\",\"icon\":\"\"},{\"key\":\"13219\",\"title\":\"模板制作\",\"value\":\"143\",\"icon\":\"\"},{\"key\":\"17893\",\"title\":\"生成静态文件\",\"value\":\"154\",\"icon\":\"\"},{\"key\":\"16926\",\"title\":\"登录日志\",\"value\":\"115\",\"icon\":\"\"}]},{\"name\":\"回收站\",\"icon\":\"&amp;#xe8a3;\",\"nav\":[{\"key\":\"17056\",\"title\":\"回收站\",\"value\":\"217\",\"icon\":\"\"}]},{\"name\":\"评价管理\",\"icon\":\"&amp;#xe717;\",\"nav\":[{\"key\":\"16835\",\"title\":\"用户评价\",\"value\":\"227\",\"icon\":\"\"}]}]','0','CMS默认配置，不可删除！','1','1');\nINSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('2','旧版桌面','[]','[{\"name\":\"网站管理\",\"icon\":\"&amp;#xe699;\",\"nav\":[\"42\",\"9\",\"95\",\"83\",\"147\",\"22\"]},{\"name\":\"商品管理\",\"icon\":\"&amp;#xe698;\",\"nav\":[\"105\",\"129\",\"2\",\"118\",\"123\",\"16\",\"177\"]},{\"name\":\"扩展管理\",\"icon\":\"&amp;#xe6ce;\",\"nav\":[\"76\",\"116\",\"141\",\"142\",\"143\",\"194\",\"35\",\"61\",\"154\",\"153\"]},{\"name\":\"系统设置\",\"icon\":\"&amp;#xe6ae;\",\"nav\":[\"40\",\"54\",\"49\",\"190\",\"70\",\"115\",\"114\",\"66\"]}]','0','旧版本配置','0','0');\n-- ----------------------------\n-- Records of jz_level\n-- ----------------------------\nINSERT INTO `jz_level` (`id`,`name`,`pass`,`tel`,`gid`,`email`,`regtime`,`logintime`,`status`) VALUES ('1','admin','0acdd3e4a8a2a1f8aa3ac518313dab9d','13600136000','1','123456@qq.com','1635997469','1643156842','1');\n-- ----------------------------\n-- Records of jz_level_group\n-- ----------------------------\nINSERT INTO `jz_level_group` (`id`,`name`,`isadmin`,`ischeck`,`classcontrol`,`paction`,`tids`,`isagree`,`description`) VALUES ('1','超级管理员','1','0','0',',Fields,', NULL,'1', NULL);\n-- ----------------------------\n-- Records of jz_likes\n-- ----------------------------\nINSERT INTO `jz_likes` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('4','6','9','1','1642946653');\nINSERT INTO `jz_likes` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('5','7','8','1','1642946655');\n-- ----------------------------\n-- Records of jz_link_type\n-- ----------------------------\nINSERT INTO `jz_link_type` (`id`,`name`,`addtime`) VALUES ('1','首页','1642818560');\n-- ----------------------------\n-- Records of jz_links\n-- ----------------------------\nINSERT INTO `jz_links` (`id`,`title`,`molds`,`url`,`isshow`,`tid`,`userid`,`htmlurl`,`orders`,`member_id`,`target`,`ownurl`,`addtime`) VALUES ('1','极致CMS','links','https://www.jizhicms.cn','1','1','1', NULL,'0','0', NULL, NULL,'0');\nINSERT INTO `jz_links` (`id`,`title`,`molds`,`url`,`isshow`,`tid`,`userid`,`htmlurl`,`orders`,`member_id`,`target`,`ownurl`,`addtime`) VALUES ('2','极致应用市场','links','https://app.jizhicms.cn','1','1','1', NULL,'0','0', NULL, NULL,'0');\n-- ----------------------------\n-- Records of jz_member\n-- ----------------------------\nINSERT INTO `jz_member` (`id`,`username`,`openid`,`pass`,`token`,`sex`,`gid`,`litpic`,`tel`,`jifen`,`likes`,`collection`,`money`,`email`,`address`,`province`,`city`,`regtime`,`logintime`,`isshow`,`signature`,`birthday`,`follow`,`fans`,`ismsg`,`iscomment`,`iscollect`,`islikes`,`isat`,`isrechange`,`pid`) VALUES ('1','极致用户', NULL,'1321321321312', NULL,'0','1','/static/upload/user/head_1.jpeg','13600136000','3.00', NULL, NULL,'0.00', NULL, NULL, NULL, NULL,'1642925638','1643157485','1', NULL, NULL, NULL,'0','1','1','1','1','1','1','0');\n-- ----------------------------\n-- Records of jz_member_group\n-- ----------------------------\nINSERT INTO `jz_member_group` (`id`,`name`,`description`,`paction`,`pid`,`isagree`,`iscomment`,`ischeckmsg`,`addtime`,`orders`,`discount`,`discount_type`) VALUES ('1','注册会员','前台会员分组，最低等级分组',',Message,Comment,User,Order,Home,Common,Uploads,','0','1','1','1','0','0','0.00','0');\n-- ----------------------------\n-- Records of jz_menu\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_message\n-- ----------------------------\nINSERT INTO `jz_message` (`id`,`title`,`userid`,`tid`,`aid`,`user`,`ip`,`body`,`tel`,`addtime`,`orders`,`email`,`isshow`,`istop`,`hits`,`tids`) VALUES ('1','联系我们','0','0','0','测试客户','127.0.0.1','<p>这是一条测试留言</p>','13600136000','1643100950','0','123456@qq.com','0','0','0', NULL);\nINSERT INTO `jz_message` (`id`,`title`,`userid`,`tid`,`aid`,`user`,`ip`,`body`,`tel`,`addtime`,`orders`,`email`,`isshow`,`istop`,`hits`,`tids`) VALUES ('2','联系我们','0','0','0','测试123','127.0.0.1','<p>这是一条测试留言</p>','13600136000','1643102345','0','2311232131@qq.com','0','0','0', NULL);\n-- ----------------------------\n-- Records of jz_molds\n-- ----------------------------\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('1','内容','article','1','1','1','1','1','1','article-list.html','article-details.html','100','0','1');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('2','栏目','classtype','1','1','1','1','1','1','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('3','会员','member','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('4','订单','orders','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('5','商品','product','1','1','1','1','1','1','list.html','details.html','100','0','1');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('6','会员分组','member_group','1','1','0','0','1','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('7','评论','comment','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('8','留言','message','1','1','0','0','1','1','message.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('9','轮播图','collect','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('10','友情链接','links','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('11','管理员','level','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('12','TAG','tags','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('13','单页','page','1','1','1','1','1','1','page.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('14','推荐属性','attr','1','1','0','0','0','0','list.html','details.html','100','1','0');\nINSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('15','用户评价','pingjia','0','1','0','1','1','1','lists.html','details.html','100','0','0');\n-- ----------------------------\n-- Records of jz_orders\n-- ----------------------------\nINSERT INTO `jz_orders` (`id`,`orderno`,`userid`,`paytype`,`ptype`,`tel`,`username`,`tid`,`price`,`jifen`,`qianbao`,`body`,`receive_username`,`receive_tel`,`receive_email`,`receive_address`,`ispay`,`paytime`,`addtime`,`send_time`,`isshow`,`discount`,`yunfei`) VALUES ('1','No20220125084425','1', NULL,'1','13600136000','iPHfa6','0','0.01','1.00','0.01','||7-6-1-0.01||', NULL, NULL, NULL, NULL,'0','0','1643071465','0','1','0.00','0.00');\nINSERT INTO `jz_orders` (`id`,`orderno`,`userid`,`paytype`,`ptype`,`tel`,`username`,`tid`,`price`,`jifen`,`qianbao`,`body`,`receive_username`,`receive_tel`,`receive_email`,`receive_address`,`ispay`,`paytime`,`addtime`,`send_time`,`isshow`,`discount`,`yunfei`) VALUES ('2','No20220125151109','1', NULL,'1','13600136000','iPHfa6','0','0.02','2.00','0.02','||7-7-2-0.01||', NULL, NULL, NULL, NULL,'0','0','1643094669','0','1','0.00','0.00');\n-- ----------------------------\n-- Records of jz_page\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_pictures\n-- ----------------------------\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('1','1','0','product','Admin','jpg','14.24','/static/upload/2022/01/19/202201199543.jpg','1642592754','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('2','1','0','product','Admin','jpg','17.91','/static/upload/2022/01/19/202201194641.jpg','1642593917','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('3','1','0','product','Admin','jpg','12.47','/static/upload/2022/01/19/202201198505.jpg','1642594016','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('4','1','0','product','Admin','jpg','10.41','/static/upload/2022/01/19/202201192886.jpg','1642594063','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('5','1','0','product','Admin','jpg','11.62','/static/upload/2022/01/19/202201192968.jpg','1642594125','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('6','8','0','article','Admin','png','79.87','/static/upload/2022/01/20/202201202799.png','1642639629','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('7','8','0','article','Admin','jpg','9.66','/static/upload/2022/01/20/202201202461.jpg','1642639668','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('8','0','0', NULL,'Admin','jpeg','122.31','/static/upload/image/20220120/1642640161966799.jpeg','1642640161','0');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('9','8','0','article','Admin','jpg','13.05','/static/upload/2022/01/20/202201206807.jpg','1642640183','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('10','8','0','article','Admin','jpg','17.91','/static/upload/2022/01/20/202201209692.jpg','1642640284','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('11','9','0','article','Admin','jpg','11.62','/static/upload/2022/01/20/202201201293.jpg','1642640663','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('12','10','0','pingjia','Admin','jpeg','22.38','/static/upload/2022/01/20/202201207970.jpeg','1642678774','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('13','10','0','pingjia','Admin','jpeg','34.07','/static/upload/2022/01/20/202201202736.jpeg','1642678847','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('14','10','0','pingjia','Admin','jpeg','25.34','/static/upload/2022/01/20/202201207507.jpeg','1642679235','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('15','10','0','pingjia','Admin','jpeg','19.63','/static/upload/2022/01/20/202201209411.jpeg','1642679469','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('16','10','0','pingjia','Admin','jpeg','25.94','/static/upload/2022/01/20/202201201541.jpeg','1642679928','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('17','10','0','pingjia','Admin','jpeg','18.82','/static/upload/2022/01/20/202201205173.jpeg','1642680404','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('18','10','0','pingjia','Admin','jpeg','16.53','/static/upload/2022/01/22/202201226081.jpeg','1642817000','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('19','6','0','product','Admin','jpg','11.43','/static/upload/2022/01/24/202201248147.jpg','1643024022','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('20','6','0','product','Admin','jpg','11.04','/static/upload/2022/01/24/202201248943.jpg','1643024022','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('21','6','0','product','Admin','jpg','17.91','/static/upload/2022/01/24/202201244087.jpg','1643024023','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('22','6','0','product','Admin','jpg','14.24','/static/upload/2022/01/24/202201247813.jpg','1643024023','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('23','9','0','article','Home','jpg','16.44','/static/upload/2022/01/26/202201267840.jpg','1643161485','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('24','6','0','product','Home','jpg','41.2','/static/upload/2022/01/26/202201263577.jpg','1643161953','1');\nINSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('27','0','0','member','Home','jpeg','30.93','/static/upload/user/head_1.jpeg','1643163524','1');\n-- ----------------------------\n-- Records of jz_pingjia\n-- ----------------------------\nINSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('1','10', NULL,'杜*小','/static/upload/2022/01/20/202201207970.jpeg', NULL,'简单、方便，还免费！','<p>相比于其他的cms，极致CMS就特别简洁，后台进去没有什么多余的广告信息，清爽简洁！</p>','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642678180','个人博主');\nINSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('2','10', NULL,'慕*文','/static/upload/2022/01/20/202201202736.jpeg', NULL,'功能强大，免费开源，搞钱神器！','<p>找了很多网上的“免费”CMS，除了免费给你看，其他很多都要付费，后台各种广告，随便找个插件都要钱！而且还不能去版权，必须挂到主页底下，自从看到极致CMS后我再也不用担心了，出了功能强大之外，免费开源，想改哪里就改哪里，主页还不用挂版权，真的是业界良心！</p>','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642678780','自由职业');\nINSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('3','10', NULL,'王*鑫','/static/upload/2022/01/20/202201207507.jpeg', NULL,'开源免费！这个CMS是真的开源免费！','<p>不说别人，就开源免费而言，就甩其他同类CMS几条街！什么是开源？有的CMS还加密一些文件。极致CMS不仅免费，而且各个地方都可以自由定义，真的做到了自主自由！群主还经常在群里热心回答，帮助我很多，非常感谢！</p>','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679206','互联网小白');\nINSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('4','10', NULL,'张小姐','/static/upload/2022/01/20/202201209411.jpeg', NULL,'群主热心，挺不错的cms！','<p>刚接触cms时，群主远程手把手帮我安装，虽然我很笨，但是群里好多热心人帮我，帮我解决了一个大难题！</p>','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679458','网站运营');\nINSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('5','10', NULL,'程*安','/static/upload/2022/01/20/202201201541.jpeg', NULL,'好用，方便，简单。越用越是觉得这个CMS的强大！非常棒！','<p>之前朋友推荐给我的这个CMS，当时还是觉得小众，感觉所有的cms都一个样。后面因为要做个站，就选用这个cms，不得不说一开始确实一脸懵逼，特别是他的逻辑跟织梦这些有区别，但是想法却很新颖。后面陆陆续续做了几个站，看了群主的视频教程，对cms也比较了解了，现在随便一个功能型的站，我都能用极致做出来！</p>','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679894','SEO');\nINSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('7','10', NULL,'吴*强','/static/upload/2022/01/22/202201226081.jpeg', NULL,'开源免费，容易搞钱！','<p>没有用极致CMS之前，都觉得网上的CMS基本上是简单的功能，要功能就得付费，而且对于不懂程序的人而言，那是相当难，自从用了极致之后，你会觉得每一天都在成长，能力越来越强，可以用它来做任何系统！</p>','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642816961','个人站长');\nINSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('6','10', NULL,'梁*宽','/static/upload/2022/01/20/202201205173.jpeg', NULL,'群主好人，免费开源，还经常回答问题！','<p>个人觉得cms对新手有一定难度，不过当你真正做了几个站之后，你就会发现这个CMS是真的强大，每当我觉得做不出来功能的时候，群里一问，里面就有群友出一些解决方案，而且自己能完成！对于互联网小白而言，这个是不可思议的，因为我没学过编程，但完成了一个其他CMS需要花很多钱二开的功能！那一刻，很自豪！</p>','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642680280','博客小新人');\n-- ----------------------------\n-- Records of jz_plugins\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_power\n-- ----------------------------\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('1','Common','公共权限','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('2','Home','前台网站','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('3','User','个人中心','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('4','Login','会员登录','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('5','Message','站内留言','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('6','Comment','会员评论','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('7','Screen','网站筛选','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('8','Order','会员下单','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('9','Mypay','网站支付','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('10','Jzpay','极致支付','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('11','Tags','TAG标签','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('12','Wechat','微信模块','0','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('13','Common/vercode','验证码生成','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('14','Common/checklogin','检查是否登录','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('15','Common/multiuploads','多附件上传','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('16','Common/uploads','单附件上传','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('17','Common/qrcode','二维码生成','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('18','Common/get_fields','获取扩展信息','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('19','Common/jizhi','链接错误提示','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('20','Common/error','报错提示','1','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('21','Home/index','网站首页','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('22','Home/jizhi','网站内容','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('23','Home/auto_url','自定义链接','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('24','Home/jizhi_details','详情内容','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('25','Home/search','网站搜索','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('26','Home/searchAll','网站多模块搜索','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('27','Home/start_cache','开启网站缓存','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('28','Home/end_cache','输出缓存','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('29','User/checklogin','检查是否登录','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('30','User/index','个人中心首页','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('31','User/userinfo','会员资料','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('32','User/orders','订单记录','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('33','User/orderdetails','订单详情','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('34','User/payment','订单支付','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('35','User/orderdel','删除订单','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('36','User/changeimg','上传头像','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('37','User/comment','评论列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('38','User/commentdel','删除评论','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('39','User/likesAction','点赞文章','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('40','User/likes','点赞列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('41','User/likesdel','取消点赞','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('42','User/collectAction','收藏文章','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('43','User/collect','收藏列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('44','User/collectdel','删除收藏','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('45','User/cart','购物车','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('46','User/addcart','添加购物车','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('47','User/delcart','删除购物车','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('48','User/posts','发布管理','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('49','User/release','会员发布','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('50','User/del','删除发布','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('51','User/uploads','会员上传附件','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('52','User/jizhi','404提示','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('53','User/follow','关注用户','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('54','User/nofollow','取消关注','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('55','User/fans','粉丝列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('56','User/notify','消息提醒','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('57','User/notifyto','查看消息','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('58','User/notifydel','删除消息','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('59','User/active','公共主页','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('60','User/setmsg','消息提醒设置','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('61','User/getclass','获取栏目列表','2','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('62','User/wallet','用户钱包','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('63','User/buy','会员充值','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('64','User/buylist','充值列表','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('65','User/buydetails','交易详情','3','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('66','Login/index','登录首页','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('67','Login/register','注册页面','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('68','Login/forget','忘记密码','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('69','Login/nologin','未登录页面','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('70','Login/loginout','退出登录','4','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('71','Message/index','发送留言','5','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('72','Comment/index','发表评论','6','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('73','Screen/index','筛选列表','7','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('74','Order/create','创建订单','8','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('75','Order/pay','订单支付','8','1');\nINSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('76','Tags/index','TAG标签列表','11','1');\n-- ----------------------------\n-- Records of jz_product\n-- ----------------------------\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('1','product','PC端橙色IT科技教育培训网站模板','PC端橙色IT科技教育培训网站模板','6','1','free', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201194641.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,', NULL,'0','2','2',',2,3,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('2','product','响应式红色软件公司网站模板','响应式红色软件公司网站模板','6','0','free', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201199543.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','1','1',',1,2,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('3','product','手机端黄色五金机电网站模板','手机端黄色五金机电网站模板','6','0','free', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201198505.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','3','3',',4,5,6,7,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('4','product','PC+手机绿色医疗生物化工网站模板','PC+手机绿色医疗生物化工网站模板','6','0','free', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201192886.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','4','4',',10,11,12,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('5','product','蓝色小程序鲜花礼物广告设计网站模板','蓝色小程序鲜花礼物广告设计网站模板','7','0','business', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201192968.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,', NULL,'0','5','5',',2,13,14,15,16,17,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('6','product','PC端橙色IT科技教育培训网站模板','PC端橙色IT科技教育培训网站模板','7','2','business', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201194641.jpg','99','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','2','2',',2,3,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('7','product','响应式红色软件公司网站模板','响应式红色软件公司网站模板','7','0','business', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201199543.jpg','98','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,2,', NULL,'0','1','1',',1,2,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('8','product','手机端黄色五金机电网站模板','手机端黄色五金机电网站模板','7','1','business', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201198505.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','3','3',',4,5,6,7,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('9','product','PC+手机绿色医疗生物化工网站模板','PC+手机绿色医疗生物化工网站模板','6','0','free', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201192886.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','4','4',',10,11,12,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('10','product','蓝色小程序鲜花礼物广告设计网站模板','蓝色小程序鲜花礼物广告设计网站模板','6','0','free', NULL,'响应式网站模板源码自适应，同一个后台，数据即时同步，简单适用！附带测试数据！友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！后台：域名/admin.p...','/static/upload/2022/01/19/202201192968.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','<p>响应式网站模板源码</p><p><br/></p><p>自适应，同一个后台，数据即时同步，简单适用！附带测试数据！</p><p>友好的seo，所有页面均都能完全自定义标题/关键词/描述，PHP程序，安全、稳定、快速；用低成本获取源源不断订单！</p><p><br/></p><p>后台：域名/admin.php</p><p>账号：admin</p><p>密码：admin</p><p><br/></p><p>使用教程：xxxxx</p><p><br/></p><p>模板特点</p><p>1：手工书写DIV+CSS、代码精简无冗余。</p><p>2：自适应结构，全球先进技术，高端视觉体验。</p><p>3：SEO框架布局，栏目及文章页均可独立设置标题/关键词/描述。</p><p>4：附带测试数据、安装教程、入门教程、安全及备份教程。</p><p>5：后台直接修改联系方式、传真、邮箱、地址等，修改更加方便。</p><p><br/></p><p>语言程序：PHP + SQLite</p><p>前端规范：html+css+jQuery</p><p>设备支持：PC端+手机端</p><p>浏览器支持：兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器</p><p>最佳分辨率：1920px+1440px</p><p>程序运行环境：linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境</p><p><br/></p>','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','5','5',',2,13,14,15,16,17,');\nINSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('11','product','响应式蓝色软件博客模板','响应式蓝色软件博客模板','6','3','free', NULL,'免费响应式蓝色软件博客模板','/static/upload/2022/01/26/202201263577.jpg','10','0.00', NULL,'1','0','<p>1、安装教程：极致CMS网站安装教程</p><p><br/></p><p>2、网站安全设置教程：极致CMS网站安全设置教程</p><p><br/></p><p>3、非模板BUG修改另付费</p><p><br/></p><p>4、模板BUG修改请直接联系站长，验证信息请填写您的订单号</p><p><br/></p><p>5、不解答有关任何免费模板的问题（解答付费）</p><p><br/></p><p>6、后台已配置好，不要乱点，整出些妖蛾子，浪费彼此时间</p><p><br/></p><p>7、缩略图请按照源码示例进行制作，要不然又说图片变形什么的</p><p><br/></p>','0','0','1643162020','0','0','0', NULL,'1', NULL, NULL, NULL, NULL,'0','1','5',',2,18,');\n-- ----------------------------\n-- Records of jz_recycle\n-- ----------------------------\n-- ----------------------------\n-- Records of jz_ruler\n-- ----------------------------\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('1','会员管理','Member','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('2','会员列表','Member/index','1','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('3','添加会员','Member/memberadd','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('4','修改会员','Member/memberedit','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('5','删除会员','Member/member_del','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('6','批量删除','Member/deleteAll','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('7','修改状态','Member/change_status','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('8','内容管理','Article','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('9','内容列表','Article/articlelist','8','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('10','添加内容','Article/addarticle','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('11','修改内容','Article/editarticle','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('12','删除内容','Article/deletearticle','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('13','批量删除','Article/deleteAll','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('14','复制内容','Article/copyarticle','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('15','评论管理','Comment','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('16','评论列表','Comment/commentlist','15','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('17','添加评论','Comment/addcomment','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('18','修改评论','Comment/editcomment','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('19','删除评论','Comment/deletecomment','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('20','批量删除','Comment/deleteAll','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('21','留言管理','Message','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('22','留言列表','Message/messagelist','21','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('23','修改留言','Message/editmessage','21','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('24','删除留言','Message/deletemessage','21','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('25','批量删除','Message/deleteAll','21','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('26','字段管理','Fields','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('27','字段列表','Fields/index','26','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('28','新增字段','Fields/addFields','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('29','修改字段','Fields/editFields','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('30','删除字段','Fields/deleteFields','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('31','获取字段','Fields/get_fields','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('32','基本功能','Index','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('33','系统界面','Index/index','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('34','后台首页','Index/welcome','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('35','数据库备份','Index/beifen','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('36','数据库备份','Index/backup','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('37','数据库还原','Index/huanyuan','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('38','数据库删除','Index/shanchu','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('39','系统功能','Sys','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('40','网站设置','Sys/index','39','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('41','栏目管理','Classtype','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('42','栏目列表','Classtype/index','41','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('43','新增栏目','Classtype/addclass','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('44','修改栏目','Classtype/editclass','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('45','删除栏目','Classtype/deleteclass','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('46','修改排序','Classtype/editClassOrders','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('47','栏目隐藏','Classtype/change_status','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('48','管理员管理','Admin','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('49','角色管理','Admin/group','48','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('50','新增角色','Admin/groupadd','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('51','修改角色','Admin/groupedit','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('52','删除角色','Admin/group_del','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('53','角色状态','Admin/change_group_status','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('54','管理员列表','Admin/adminlist','48','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('55','新增管理员','Admin/adminadd','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('56','修改管理员','Admin/adminedit','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('57','管理员状态','Admin/change_status','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('58','删除管理员','Admin/admindelete','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('59','个人信息','Index/details','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('60','模型管理','Molds','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('61','模型列表','Molds/index','60','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('62','新增模型','Molds/addMolds','60','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('63','修改模型','Molds/editMolds','60','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('64','删除模型','Molds/deleteMolds','60','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('65','权限管理','Rulers','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('66','权限列表','Rulers/index','65','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('67','新增权限','Rulers/addrulers','65','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('68','修改权限','Rulers/editrulers','65','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('69','删除权限','Rulers/deleterulers','65','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('70','桌面设置','Index/desktop','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('71','新增桌面','Index/desktop_add','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('72','修改桌面','Index/desktop_edit','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('73','删除桌面','Index/desktop_del','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('74','图标库','Index/unicode','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('75','插件管理','Plugins','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('76','插件列表','Plugins/index','75','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('77','模块扩展','Extmolds','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('82','轮播图','Collect','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('83','轮播图','Collect/index','82','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('84','新增轮播图','Collect/addcollect','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('85','修改轮播图','Collect/editcollect','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('86','删除轮播图','Collect/deletecollect','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('87','复制轮播图','Collect/copycollect','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('88','批量删除轮播图','Collect/deleteAll','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('89','轮播图分类','Collect/collectType','82','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('90','新增轮播图分类','Collect/collectTypeAdd','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('91','修改轮播图分类','Collect/collectTypeEdit','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('92','删除轮播图分类','Collect/collectTypeDelete','82','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('93','批量复制','Article/copyAll','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('94','批量修改栏目','Article/changeType','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('95','友情链接','Links/index','189','1','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('96','新增友链','Links/addlinks','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('97','修改友链','Links/editlinks','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('98','复制友链','Links/copylinks','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('99','删除友链','Links/deletelinks','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('100','批量删除友链','Links/deleteAll','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('101','通用模块','Common','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('102','上传文件','Common/uploads','101','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('103','更新cookie','Index/update_session_maxlifetime','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('104','商品管理','Product','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('105','商品列表','Product/productlist','104','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('106','新增商品','Product/addproduct','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('107','修改商品','Product/editproduct','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('108','删除商品','Product/deleteproduct','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('109','复制商品','Product/copyproduct','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('110','批量删除','Product/deleteAll','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('111','批量复制','Product/copyAll','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('112','修改栏目','Product/changeType','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('113','修改排序','Product/editProductOrders','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('114','清理缓存','Index/cleanCache','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('115','登录日志','Sys/loginlog','39','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('116','图库管理','Sys/pictures','39','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('117','修改排序','Extmolds/editOrders','77','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('118','会员分组','Member/membergroup','1','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('119','新增分组','Member/groupadd','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('120','修改分组','Member/groupedit','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('121','更改分组状态','Member/change_group_status','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('122','删除分组','Member/group_del','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('123','会员权限','Member/power','1','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('124','添加权限','Member/addrulers','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('125','修改权限','Member/editrulers','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('126','删除权限','Member/deleterulers','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('127','修改分组排序','Member/editOrders','1','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('128','订单管理','Order','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('129','订单列表','Order/index','128','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('130','订单详情','Order/details','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('131','批量删除','Order/deleteAll','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('132','上传支付证书','Sys/uploadcert','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('133','更改状态','Plugins/change_status','75','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('134','安装卸载','Plugins/action_do','75','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('223','模板列表','Template/index','222','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('222','模板管理','Template','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('137','删除图库图片','Sys/deletePic','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('138','批量删除图库','Sys/deletePicAll','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('139','安装说明','Plugins/desc','75','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('140','微信公众号','Wechat','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('141','公众号菜单','Wechat/wxcaidan','140','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('142','公众号素材','Wechat/sucai','140','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('143','模板制作','Index/showlabel','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('144','获取首字母拼音','Classtype/get_pinyin','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('145','批量新增栏目','Classtype/addmany','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('146','自定义配置删除','Sys/custom_del','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('147','TAG列表','Extmolds/index/molds/tags','77','1','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('148','新增TAG','Extmolds/addmolds/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('149','修改TAG','Extmolds/editmolds/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('150','复制TAG','Extmolds/copymolds/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('151','删除TAG','Extmolds/deletemolds/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('152','批量删除TAG','Extmolds/deleteAll/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('153','网站地图','Index/sitemap','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('154','生成静态文件','Index/tohtml','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('155','更新栏目HTML','Index/html_classtype','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('156','更新模块HTML','Index/html_molds','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('157','批量修改推荐属性','Article/changeAttribute','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('158','批量修改推荐属性','Product/changeAttribute','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('159','批量修改友链栏目','Links/changeType','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('160','批量修改TAG栏目','Extmolds/changeType/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('161','批量复制友链','Links/copyAll','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('162','批量复制TAG','Extmolds/copyAll/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('163','批量修改友链排序','Links/editOrders','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('164','批量修改TAG排序','Extmolds/editOrders/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('165','删除订单','Order/deleteorder','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('166','批量删除','Admin/deleteAll','48','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('167','高级设置','Sys/ctype/type/high-level','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('168','邮箱订单','Sys/ctype/type/email-order','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('169','支付配置','Sys/ctype/type/payconfig','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('170','公众号配置','Sys/ctype/type/wechatbind','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('171','批量审核','Article/checkAll','8','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('172','批量审核','Product/checkAll','104','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('173','批量审核','Message/checkAll','21','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('174','批量审核','Comment/checkAll','15','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('175','批量审核友链','Links/checkAll','189','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('176','批量审核TAG','Extmolds/checkAll/molds/tags','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('177','充值列表','Order/czlist','128','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('178','手动充值','Order/chongzhi','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('179','删除记录','Order/delbuylog','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('180','批量删除记录','Order/delAllbuylog','128','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('181','积分配置','Sys/ctype/type/jifenset','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('182','插件更新','Plugins/update','75','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('183','获取栏目模板','Classtype/get_html','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('184','批量修改栏目','Classtype/changeClass','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('185','友链分类','Links/linktype','189','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('186','新增友链分类','Links/linktypeadd','189','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('187','修改友链分类','Links/linktypeedit','189','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('188','删除友链分类','Links/linktypedelete','189','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('189','友情链接','Links','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('190','导航设置','Index/menu','32','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('191','新增导航','Index/addmenu','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('192','修改导航','Index/editmenu','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('193','删除导航','Index/delmenu','32','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('194','碎片化','Sys/datacache','39','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('195','新增碎片','Sys/addcache','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('196','修改碎片','Sys/editcache','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('197','删除碎片','Sys/delcache','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('198','预览SQL','Sys/viewcache','39','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('199','搜索配置','Sys/ctype/type/searchconfig','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('200','修改字段属性','Fields/editFieldsValue','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('201','推荐属性','Jzattr','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('202','推荐属性','Jzattr/index','201','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('203','新增推荐属性','Jzattr/addAttr','201','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('204','修改推荐属性','Jzattr/editAttr','201','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('205','删除推荐属性','Jzattr/delAttr','201','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('206','修改状态','Jzattr/changeStatus','201','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('207','列表设置','Fields/fieldsList','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('208','获取列表字段','Fields/fieldsList','26','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('209','内链模块','Jzchain','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('210','内链列表','Jzchain/index','209','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('211','新增内链','Jzchain/addchain','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('212','修改内链','Jzchain/editchain','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('213','删除内链','Jzchain/delchain','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('214','批量删除','Jzchain/delAll','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('215','修改状态','Jzchain/changeStatus','209','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('216','回收站','Recycle','0','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('217','回收站','Recycle/index','216','1','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('218','恢复数据','Recycle/restore','216','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('219','删除数据','Recycle/del','216','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('220','批量删除','Recycle/delAll','216','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('221','批量恢复','Recycle/restoreAll','216','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('224','安装卸载','Template/actionDo','222','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('225','安装说明','Template/desc','222','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('226','模板更新','Template/update','222','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('227','用户评价列表','Extmolds/index/molds/pingjia','77','1','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('228','新增用户评价','Extmolds/addmolds/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('229','修改用户评价','Extmolds/editmolds/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('230','复制用户评价','Extmolds/copymolds/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('231','删除用户评价','Extmolds/deletemolds/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('232','批量删除用户评价','Extmolds/deleteAll/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('233','批量修改用户评价栏目','Extmolds/changeType/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('234','批量复制用户评价','Extmolds/copyAll/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('235','批量修改用户评价列表','Extmolds/editOrders/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('236','批量审核用户评价','Extmolds/checkAll/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('237','重构字段','Molds/restrucFields','60','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('238','基本配置','Sys/ctype/type/base','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('239','批量修改评价推荐属性','Extmolds/changeAttribute/molds/pingjia','77','0','0');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('240','配置栏目','Sys/systype','39',1,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('241','设置配置状态','Sys/systypestatus','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('242','修改配置分组','Sys/editctype','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('243','新增配置分组','Sys/addctype','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('244','全局配置','Sys/ctype','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('245','修改配置字段','Sys/setfield','39',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('246','绑定模块数据获取','Fields/getSelect','26',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('247','编辑器上传','Uploads','0',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('248','上传功能','Uploads/index','247',0,'1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('249','获取子栏目','Classtype/getchildren','41','0','1');\nINSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('250','获取联动数据','Fields/getliandong','26','0','1');\n-- ----------------------------\n-- Records of jz_shouchang\n-- ----------------------------\nINSERT INTO `jz_shouchang` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('5','6','10','1','1642947563');\nINSERT INTO `jz_shouchang` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('4','7','7','1','1642946850');\n-- ----------------------------\n-- Records of jz_sysconfig\n-- ----------------------------\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('1','web_version','系统版号','版本号是系统自带，请勿改动','0','2.5.6','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('2','web_name','网站SEO名称','控制在25个字、50个字节以内','2','极致CMS建站系统','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('3','web_keyword','网站SEO关键词','5个左右，8汉字以内，用英文逗号隔开','2','极致建站,cms,开源cms,免费cms,cms系统,phpcms,免费企业建站,建站系统,企业cms,jizhicms,极致cms,建站cms,建站系统,极致博客,极致blog,内容管理系统','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('4','web_desc','网站SEO描述','控制在80个汉字，160个字符以内','3','极致CMS是开源免费的PHPCMS网站内容管理系统，无商业授权，简单易用，提供丰富的插件，帮您实现零基础搭建不同类型网站（企业站，门户站，个人博客站等），是您建站的好帮手。极速建站，就选极致CMS。','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('5','web_js','统计代码','将百度统计、cnzz等平台的流量统计JS代码放到这里','8', NULL,'1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('6','web_copyright','底部版权','如：&copy; 2016 xxx版权','2','@2020-2099','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('7','web_beian','备案号','如：京ICP备00000000号','2','冀ICP备88888号','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('8','web_tel','网站电话','网站联系电话','2','0666-8888888','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('9','web_tel_400','400电话','400电话','2','400-0000-000','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('10','web_qq','网站QQ','网站QQ','2','12345678','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('11','web_email','网站邮箱','网站邮箱','2','123456@qq.com','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('12','web_address','公司地址','公司地址','2','河北省廊坊市广阳区xxx大厦xx楼001号','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('13','pc_template','PC网站模板','将模板名称填写到此处','2','cms','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('14','wap_template','WAP网站模板','开启了手机端，这个设置才会生效，否则调用电脑端模板','2','1','2',NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('15','weixin_template','微信网站模板','开启了手机端，这个设置才会生效，否则调用电脑端模板。由于微信内有一些特殊的js，所以可以在这里单独设置微信模板','2','cms','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('16','iswap','是否开启手机端','如果不开启手机端，则默认调用电脑端模板','6','1','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('17','isopenhomeupload','是否开启前台上传','关闭后，前台无法上传文件。如果网站没有使用会员，建议关闭前台上传。','6','1','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('18','isopenhomepower','是否开启前台权限','开启后前台用户权限可以在后台控制','6','0','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('19','cache_time','缓存时间','单位：分钟，留空或0则不设置缓存。如果生成静态文件，静态文件清空后才生效。','2','0','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('20','fileSize','限制上传文件大小','0代表不限，单位kb','2','0','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('21','fileType','允许上传文件类型','请用|分割，如：pdf|jpg|png','2','pdf|jpg|jpeg|png|zip|rar|gzip|doc|docx|xlsx','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('22','ueditor_config','后台编辑器导航条配置', \"后台UEditor编辑器导航条配置\",'3','&quot;fullscreen&quot;, &quot;source&quot;,&quot;undo&quot;, &quot;redo&quot;,&quot;bold&quot;, &quot;italic&quot;, &quot;underline&quot;, &quot;fontborder&quot;, &quot;strikethrough&quot;, &quot;super&quot;, &quot;removeformat&quot;, &quot;formatmatch&quot;, &quot;autotypeset&quot;, &quot;blockquote&quot;, &quot;pasteplain&quot;,&quot;forecolor&quot;, &quot;backcolor&quot;, &quot;insertorderedlist&quot;, &quot;insertunorderedlist&quot;, &quot;selectall&quot;, &quot;cleardoc&quot;,&quot;rowspacingtop&quot;, &quot;rowspacingbottom&quot;, &quot;lineheight&quot;,&quot;customstyle&quot;, &quot;paragraph&quot;, &quot;fontfamily&quot;, &quot;fontsize&quot;,&quot;directionalityltr&quot;, &quot;directionalityrtl&quot;, &quot;indent&quot;,&quot;justifyleft&quot;, &quot;justifycenter&quot;, &quot;justifyright&quot;, &quot;justifyjustify&quot;,&quot;touppercase&quot;, &quot;tolowercase&quot;,&quot;link&quot;, &quot;unlink&quot;, &quot;anchor&quot;, &quot;imagenone&quot;, &quot;imageleft&quot;, &quot;imageright&quot;, &quot;imagecenter&quot;,&quot;simpleupload&quot;, &quot;insertimage&quot;, &quot;emotion&quot;, &quot;scrawl&quot;, &quot;insertvideo&quot;, &quot;music&quot;, &quot;attachment&quot;, &quot;map&quot;, &quot;gmap&quot;, &quot;insertframe&quot;, &quot;insertcode&quot;, &quot;webapp&quot;, &quot;pagebreak&quot;,&quot;template&quot;, &quot;background&quot;,&quot;horizontal&quot;, &quot;date&quot;, &quot;time&quot;, &quot;spechars&quot;, &quot;snapscreen&quot;, &quot;wordimage&quot;,&quot;inserttable&quot;, &quot;deletetable&quot;, &quot;insertparagraphbeforetable&quot;, &quot;insertrow&quot;, &quot;deleterow&quot;, &quot;insertcol&quot;, &quot;deletecol&quot;, &quot;mergecells&quot;, &quot;mergeright&quot;, &quot;mergedown&quot;, &quot;splittocells&quot;, &quot;splittorows&quot;, &quot;splittocols&quot;, &quot;charts&quot;,&quot;print&quot;, &quot;preview&quot;, &quot;searchreplace&quot;, &quot;help&quot;, &quot;drafts&quot;','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('23','search_table','允许前台搜索的表','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如：article|product','2','article|product','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('24','imagequlity','上传图片压缩比例','100%则不压缩，如果PNG是透明图，压缩后背景变黑色。格式如：80','6','75','2','不压缩使用原图=100,95%=95,90%=90,85%=85,80%=80,75%=75,70%=70,65%=65,60%=60,55%=55,50%=50','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('25','ispngcompress','PNG是否压缩','PNG压缩后容易变成背景黑色，关闭后，不会压缩。','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('26','email_server','邮件服务器','smtp.163.com,smtp.qq.com','2','smtp.163.com','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('27','email_port','邮件收发端口','163、126邮件端口(465)，QQ邮件端口(587)','2','465','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('28','shou_email','收件人Email地址', NULL,'2', NULL,'4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('29','send_email','发件人Email地址','指邮件服务器发件邮箱','2', NULL,'4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('30','send_pass','发件人Email秘钥','这个秘钥不是登录密码','2', NULL,'4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('31','send_name','发件人昵称','发件邮箱会带一个昵称','2','极致建站系统','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('32','tj_msg','客户订单通知','购买商品的时候会发送的一条邮件信息','3','尊敬的{xxx}，我们已经收到您的订单！请留意您的电子邮件以获得最新消息，谢谢您！','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('33','send_msg','订单出货通知','发货的时候发送给客户的通知','3','尊敬的{xxx}，我们已确认了您的订单，请于3日内汇款，逾期恕不保留，不便请见谅。汇款完成后，烦请告知客服人员您的交易账号后五位，即完成下单手续，谢谢您。','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('34','yunfei','订单运费','购物下单时会加上这个运费','2','0.00','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('35','paytype','在线支付','0关闭支付，1自主平台支付','6','0','5','关闭=0,开启=1','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('40','alipay_partner','支付宝APPID','账户中心->密钥管理->开放平台密钥，填写添加了电脑网站支付的应用的APPID','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('41','alipay_key','支付宝key','MD5密钥，安全检验码，由数字和字母组成的32位字符串','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('42','alipay_private_key','支付宝私钥', NULL,'3', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('43','alipay_public_key','支付宝公钥', NULL,'3', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('44','wx_mchid','微信商户mchid','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('45','wx_key','微信商户key','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('46','wx_appid','微信公众号appid','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('47','wx_appsecret','微信公众号appsecret','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('48','wx_client_cert','微信apiclient_cert','支付相关','5', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('49','wx_client_key','微信apiclient_key','支付相关','5', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('50','wx_login_appid','公众号appid','用户登录相关，如果跟支付的一样，那就再填写一遍','2', NULL,'6', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('51','wx_login_appsecret','公众号appsecret','用户登录相关，如果跟支付的一样，那就再填写一遍','2', NULL,'6', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('52','wx_login_token','公众号token','用户登录相关，如果跟支付的一样，那就再填写一遍','2', NULL,'6', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('53','huanying','公众号关注欢迎语','公众号关注时发送的第一句推送','3','欢迎关注公众号~','6', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('54','wx_token','公众号token','支付相关','2', NULL,'5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('55','web_logo','网站LOGO', NULL,'1','/static/cms/static/images/logo.png','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('56','admintpl','后台模板风格','内页弹窗：点击新增/修改等操作，页面是一个弹出层，更美观。内嵌页面：点击新增/修改等操作，页面直接进入新页面，不会弹出层。','6','default','2','内页弹窗=default,内嵌页面=tpl','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('59','domain','网站SEO网址','一般不填，全局网址，最后不带/,如：http://www.xxx.com','2', NULL,'1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('61','overtime','订单超时','按小时计算，超过该小时订单过期，仅限于开启支付后，0代表不限制','2','4','4', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('62','islevelurl','开启层级URL','默认关闭层级URL，开启后URL会按照父类层级展现','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('63','iscachepage','缓存完整页面','前台完整页面缓存，结合缓存时间，可以提高访问速度','6','1','0','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('64','isautohtml','自动生成静态','前台访问网站页面，将自动生成静态HTML，下次访问直接进入静态HTML页面','0','0','0','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('65','pc_html','PC静态文件目录','电脑端静态HTML存放目录，默认根目录[ / ]','2','/','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('66','mobile_html','WAP静态文件目录','手机端静态HTML存放目录，默认[ m ]，PC和WAP静态目录不能相同，否则文件会混乱','2','m','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('67','autocheckmessage','是否留言自动审核','开启后，留言自动审核（显示）','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('68','autocheckcomment','是否评论自动审核','开启后评论自动审核（显示）','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('69','mingan','网站敏感词过滤','将敏感词放到里面，用“,”分隔，用{xxx}代替通配内容','3', NULL,'1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('70','iswatermark','是否开启水印','开启水印后水印图片优先，如果没有图片则使用水印文字','6','0','8','开启=1,关闭=0','100','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('71','watermark_file','水印图片','水印图片在250px以内','1', NULL,'8', NULL,'99','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('72','watermark_t','水印位置','参考键盘九宫格1-9','2','9','8', NULL,'98','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('73','watermark_tm','水印透明度','透明度越大，越难看清楚水印','6','0','8','不显示=0,10%=10,20%=20,30%=30,40%=40,50%=50,60%=60,70%=70,80%=80,90%=90','97','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('74','money_exchange','钱包兑换率','站内钱包与RMB的兑换率，即1元=多少金币','2','1','5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('75','jifen_exchange','积分兑换率','站内积分与RMB的兑换率，即1元=多少积分','2','100','5', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('76','isopenjifen','积分支付','开启积分支付后，商品可以用积分支付','6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('77','isopenqianbao','钱包支付','开启钱包支付后，商品可以用钱包支付','6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('78','isopenweixin','微信支付','开启微信支付后，商品可以用微信支付','6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('79','isopenzfb','支付宝支付','开启支付宝支付后，商品可以用支付宝支付','6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('80','login_award','每次登录奖励','每天登录奖励积分数，最小为0，每天登录只奖励一次','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('81','login_award_open','登录奖励','开启登录奖励后，登录后就会获得积分奖励','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('82','release_award_open','发布奖励','开启后，发布内容会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('83','release_award','每次发布奖励','每次发布内容奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('84','release_max_award','每天发布最高奖励','每天奖励不超过积分上限，设置0则无上限','2','0','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('85','collect_award_open','收藏奖励','开启后，发布内容被收藏会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('86','collect_award','每次收藏奖励','每次发布内容被收藏奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('87','collect_max_award','每天收藏最高奖励','每天奖励不超过积分上限，设置0则无上限','2','1000','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('88','likes_award_open','点赞奖励','开启后，发布内容被点赞会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('89','likes_award','每次点赞奖励','每次发布内容被点赞奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('90','likes_max_award','每天点赞最高奖励','每天奖励不超过积分上限，设置0则无上限','2','1000','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('91','comment_award_open','评论奖励','开启后，发布内容被评论会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('92','comment_award','每次评论奖励','每次发布内容被评论奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('93','comment_max_award','每天评论最高奖励','每天奖励不超过积分上限，设置0则无上限','2','1000','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('94','follow_award_open','关注奖励','开启后，用户被粉丝关注会奖励积分','6','1','7','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('95','follow_award','每次关注奖励','每次被关注奖励积分数','2','1','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('96','follow_max_award','每天关注最高奖励','每天关注奖励不超过积分上限，设置0则无上限','2','1000','7', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('97','isopenemail','发送邮件','是否开启邮件发送','6','1','4','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('98','closeweb','关闭网站','关闭网站后，前台无法访问，后台可以进入','6','0','1','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('99','closetip','关站提示', NULL,'3','抱歉！该站点已经被管理员停止运行，请联系管理员了解详情！','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('100','admin_save_path','后台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('101','home_save_path','前台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd}，存储路径相对于根目录，最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('102','isajax','是否开启前台AJAX','开启后AJAX，前台可以通过栏目链接+ajax=1获取JSON数据','6','0','2', '开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('104','invite_award_open','是否开启邀请奖励','开启邀请后则会奖励','6','0','7', '开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('105','invite_type','邀请奖励类型', NULL,'6','jifen','7', '积分=jifen,金币=money','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('106','invite_award','邀请奖励数量', NULL,'0','0','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('107','web_phone','网站手机', NULL,'2','0','1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('108','web_weixin','站长微信', NULL,'1', NULL,'1', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('110','isregister','前台用户注册','关闭前台注册后，前台无法进入注册页面','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('111','onlyinvite','仅邀请码注册','开启后，必须通过邀请链接才能注册！','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('112','release_table','允许前台发布模块','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割','2','article|product','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('113','search_words','前台搜索的字段','可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割','2','title','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('114','closehomevercode','前台验证码','关闭后，登录注册不需要验证码','6','0','2','关闭=1,开启=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('115','closeadminvercode','后台验证码','关闭后，后台管理员登录不需要验证码','6','0','2','关闭=1,开启=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('116','tag_table','TAG包含模型','在tag列表上查询的相关模型,多个模型标识可用|分割,如：article|product','2','article|product','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('118','isopendmf','支付宝当面付', NULL,'6','1','5','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('119','search_words_muti','前台多模块搜索的字段','多个模块直接必须都有相同的字段，否则会报错','3','title','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('120','search_table_muti','多模块允许搜索的表','防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如：article|product','2','article|product','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('121','search_fields_muti','允许查询显示的字段','多模块搜索允许查询显示的字段','3','id,tid,litpic,title,tags,keywords,molds,htmlurl,description,addtime,userid,member_id,hits,ownurl,target','3', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('122','ueditor_user_config','前台编辑器设置','前台的编辑器功能菜单设置','3','&quot;undo&quot;, &quot;redo&quot;, &quot;|&quot;,&quot;paragraph&quot;,&quot;bold&quot;,&quot;forecolor&quot;,&quot;fontfamily&quot;,&quot;fontsize&quot;, &quot;italic&quot;, &quot;blockquote&quot;, &quot;insertparagraph&quot;, &quot;justifyleft&quot;, &quot;justifycenter&quot;, &quot;justifyright&quot;,&quot;justifyjustify&quot;,&quot;|&quot;,&quot;indent&quot;, &quot;insertorderedlist&quot;, &quot;insertunorderedlist&quot;,&quot;|&quot;, &quot;insertimage&quot;, &quot;inserttable&quot;, &quot;deletetable&quot;, &quot;insertparagraphbeforetable&quot;, &quot;insertrow&quot;, &quot;deleterow&quot;, &quot;insertcol&quot;, &quot;deletecol&quot;,&quot;mergecells&quot;, &quot;mergeright&quot;, &quot;mergedown&quot;, &quot;splittocells&quot;, &quot;splittorows&quot;, &quot;splittocols&quot;, &quot;|&quot;,&quot;drafts&quot;, &quot;|&quot;,&quot;fullscreen&quot;','2', NULL,'1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('123','article_config','内容配置', NULL,'3','{\"seotitle\":1,\"litpic\":1,\"description\":1,\"tags\":1,\"filter\":\"title,keywords,body\"}','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('124','product_config','商品配置', NULL,'3','{\"seotitle\":1,\"litpic\":1,\"description\":1,\"tags\":1,\"filter\":\"title,keywords,body\"}','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('125','isdebug','PHP调试','测试环境，开启调试，提示错误，实时更新模板。正式上线，请关闭调试，打开页面更快。','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('126','plugins_config','插件配置', NULL,'2','http://api.jizhicms.cn/plugins.php','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('127','template_config','插件配置', NULL,'2','http://api.jizhicms.cn/template.php','0', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('128','closesession','前台SESSION','关闭前台SESSION后，前台会员模块无法使用，但是可以减少session缓存文件。纯内容网站可以关闭，使用会员支付等必须开启','6','0','2','关闭=1,开启=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('129','messageyzm','留言验证码','开启后，前台留言需要填写验证码','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('130','homerelease','前台发布审核','开启后需要后台审核，关闭则不需要','6','1','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('131','hideclasspath','栏目隐藏.html','开启后栏目链接将没有.html后缀','6','0','2','开启=1,关闭=0','0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('132','classtypemaxlevel','栏目全局递归','默认开启，栏目超过20个，请关闭此选项，有一定程度提升访问速度！','6','0','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('133','hidetitleonliy','字段重复检测', '将【模块标识-检测字段】填写进去，用|进行分割，将会进行标题重复检测。如：article-title|product-title','2','article-title|product-title','2', NULL,'0','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('134','onlyuserupload','会员上传限制','开启后，仅会员才可以上传！受会员上传大小限制！','6','1','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('135','cachefilenum','缓存文件数','0表示不限制，最大不超过500','2','100','0',null,0,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('136','watermark_word','水印文字','只有没有水印图片的时候才生效','2','这个是水印文字','8',null,96,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('137','watermark_font','水印字体','默认Alibaba-PuHuiTi-Bold.ttf，存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,95,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('138','watermark_size','水印大小','默认24','2','24','8',null,94,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('139','watermark_h','水印行高','默认34','2','34','8',null,93,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('140','watermark_rgb','水印颜色','默认白色：#FFFFFF','2','#FFFFFF','8',null,92,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('141','watermark_x','水印微调X','相对水印位置再进行X轴微调，默认0','2','0','8',null,91,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('142','watermark_y','水印微调Y','相对水印位置再进行Y轴微调，默认0','2','10','8',null,90,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('143','text_waterlitpic','缩略图标题水印','文章缩略图进行水印文章标题，开启后生效','6','0','8','开启=1,关闭=0',89,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('144','text_litpic','默认缩略图','当文章没有缩略图的时候生效','1',null,'8',null,88,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('145','text_molds','支持模型','填写模型标识，如：article,product','2','article,product','8',null,87,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('146','text_num','每行文字数','默认10个字','2','10','8',null,86,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('147','text_size','文字大小','默认24','2','24','8',null,85,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('148','text_h','文字行高','默认34','2','34','8',null,84,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('149','text_rgb','文字颜色','默认白色：#FFFFFF','2','#FFFFFF','8',null,83,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('150','text_font','文字字体','默认Alibaba-PuHuiTi-Bold.ttf，存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,82,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('151','text_wz','水印位置','九宫格1-9，默认5中间','2','5','8',null,81,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('152','text_x','微调X','相对于水印位置再进行X轴微调，默认0','2','0','8',null,80,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('153','text_y','微调Y','相对于水印位置再进行Y轴微调，默认0','2','0','8',null,79,'1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('154','islocal','是否开启图片本地化','图片本地化可以将内容的外网图片保存到服务器','6','1','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('155','openredis','是否开启Redis','开启Redis后可以使用token登录前台账户，但必须服务器安装了Redis，在config里面需要配置redis信息','6','0','2','开启=1,关闭=0','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('156','sitemap_config','sitemap配置','用于sitemap生成','3','a:3:{s:9:\"page_size\";i:10000;s:7:\"tagsurl\";s:19:\"/tags/index?id={id}\";s:8:\"filetype\";s:3:\"xml\";}','0','','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('157','schedule_table','定时发布表','带有addtime发布时间字段的表才可以使用定时发布功能,用|分隔','3','article|product','2','','1','1');\nINSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('158','upload_file_name','上传文件重命名','上传文件后是否重命名，默认开启重命名，关闭后上传文件名不会变','6','1','2','开启=1,关闭=0','1','1');\n-- ----------------------------\n-- Records of jz_tags\n-- ----------------------------\nINSERT INTO `jz_tags` (`id`,`tid`,`orders`,`comment_num`,`molds`,`htmlurl`,`keywords`,`newname`,`num`,`isshow`,`target`,`number`,`member_id`,`ownurl`,`tags`,`addtime`) VALUES ('1','0','0','0','tags', NULL,'SEO', NULL,'-1','1','_blank','4','0', NULL, NULL,'0');\n-- ----------------------------\n-- Records of jz_task\n-- ----------------------------\nINSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('1','8','2','1','1','article','reply',' @iPHfa6 干得漂亮！','http://www.19x.mm/znxw.html','1','1','0','1642932172');\nINSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('5','6','9','0','1','product','likes','PC+手机绿色医疗生物化工网站模板','http://www.19x.mm/free/9.html','0','1','0','1642946653');\nINSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('6','7','8','0','1','product','likes','手机端黄色五金机电网站模板','http://www.19x.mm/business/8.html','0','1','0','1642946655');\nINSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('11','6','10','0','1','product','collect','蓝色小程序鲜花礼物广告设计网站模板','http://www.19x.mm/free/10.html','0','1','0','1642947563');\nINSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('10','7','7','0','1','product','collect','响应式红色软件公司网站模板','http://www.19x.mm/business/7.html','0','1','0','1642946850');\n"
  },
  {
    "path": "install/tpl/css/ui.progress-bar.css",
    "content": "@-webkit-keyframes animate-stripes { from {\nbackground-position:0 0\n}\nto { background-position: 44px 0 }\n}\n.ui-progress-bar {\n\tposition: relative;\n\theight: 35px;\n\tpadding-right: 2px;\n\tbackground-color: #abb2bc;\n\tborder-radius: 35px;\n\t-moz-border-radius: 35px;\n\t-webkit-border-radius: 35px;\n\tbackground: -webkit-gradient(linear, left bottom, left top, color-stop(0, #b6bcc6), color-stop(1, #9da5b0));\n\tbackground: -moz-linear-gradient(#9da5b0 0, #b6bcc6 100%);\n\t-webkit-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF;\n\t-moz-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF;\n\tbox-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF\n}\n.ui-progress {\n\tposition: relative;\n\tdisplay: block;\n\toverflow: hidden;\n\theight: 33px;\n\t-moz-border-radius: 35px;\n\t-webkit-border-radius: 35px;\n\tborder-radius: 35px;\n\tbackground-color: #74d04c;\n\t-webkit-box-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a;\n\t-moz-box-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a;\n\tbox-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a;\n\tborder: 1px solid #4c8932;\n\t-webkit-background-size: 30px 30px;\n\t-moz-background-size: 30px 30px;\n\tbackground-size: 30px 30px;\n\tbackground-image: -webkit-gradient(linear, left top, right bottom,  color-stop(.25, rgba(255, 255, 255, .15)), color-stop(.25, transparent),  color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .15)),  color-stop(.75, rgba(255, 255, 255, .15)), color-stop(.75, transparent),  to(transparent));\n\tbackground-image: -webkit-linear-gradient(135deg, 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);\n\tbackground-image: -moz-linear-gradient(135deg, 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);\n\tbackground-image: -ms-linear-gradient(135deg, 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);\n\tbackground-image: -o-linear-gradient(135deg, 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);\n\tbackground-image: linear-gradient(135deg, 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);\n\t-webkit-animation: animate-stripes 1s linear infinite;\n\t-moz-animation: animate-stripes 1s linear infinite;\n}\n.ui-progress span.ui-label {\n\tfont-size: 1.2em;\n\tposition: absolute;\n\tright: 0;\n\tline-height: 33px;\n\tpadding-right: 12px;\n\tcolor: rgba(0,0,0,0.6);\n\ttext-shadow: rgba(255,255,255,0.45) 0 1px 0;\n\twhite-space: nowrap\n}\n"
  },
  {
    "path": "install/tpl/footer.tpl",
    "content": "<div class=\"footer\">\n    <footer>\n        <p>© 2019 极致CMS 版权所有 | Powered By <a href=\"http://jizhicms.com\" target=\"_blank\">jizhicms.com</a></p>\n    </footer>\n</div>\n"
  },
  {
    "path": "install/tpl/header.tpl",
    "content": "\t<title>极致建站系统安装向导</title>\n    <link rel=\"icon\" href=\"\">\n    <link rel=\"stylesheet\" href=\"./tpl/css/bootstrap.min.css\" crossorigin=\"anonymous\" />\n\t<script type=\"text/javascript\" src=\"./tpl/js/jquery.min.js\"></script>\n\t<script type=\"text/javascript\" src=\"./tpl/layer/layer.min.js\"></script>\n\t<script type=\"text/javascript\" src=\"./tpl/js/common.js\"></script>\n\t<link rel=\"stylesheet\" href=\"./tpl/css/ui.progress-bar.css\">\n    <style>\n\t\t/*進度條樣式*/\n              .progress{\n                  height: 25px;\n                  background: #262626;\n                  padding: 1px;\n                  overflow: visible;\n                  border-radius: 20px;\n                  border-top: 1px solid #000;\n                  border-bottom: 1px solid #7992a8;\n              }\n              .progress .progress-bar{\n                  border-radius: 20px;\n                  position: relative;\n                  animation: animate-positive 2s;\n              }\n              .progress .progress-value{\n                  display: block;\n                  padding: 3px 7px;\n                  font-size: 13px;\n                  color: #fff;\n                  border-radius: 4px;\n                  background: #191919;\n                  border: 1px solid #000;\n                  position: absolute;\n                  top: -40px;\n                  right: -10px;\n              }\n              .progress .progress-value:after{\n                  content: \"\";\n                  border-top: 10px solid #191919;\n                  border-left: 10px solid transparent;\n                  border-right: 10px solid transparent;\n                  position: absolute;\n                  bottom: -6px;\n                  left: 26%;\n              }\n              .progress-bar.active{\n                  animation: reverse progress-bar-stripes 0.40s linear infinite, animate-positive 2s;\n              }\n              @-webkit-keyframes animate-positive{\n                  0% { width: 0; }\n              }\n              @keyframes animate-positive{\n                  0% { width: 0; }\n              }\n\t\t\t  \n\t\t/*分步樣式*/\n\t\t\t*, *::after, *::before {\n\t\t\t  box-sizing: border-box;\n\t\t\t}\n\n\t\t\ta {\n\t\t\t  color: #96c03d;\n\t\t\t  text-decoration: none;\n\t\t\t}\n\n\t\t\t.cd-breadcrumb {\n\t\t\t  width: 90%;\n\t\t\t  max-width: 768px;\n\t\t\t  padding: 0.5em 1em;\n\t\t\t  margin: 1em auto;\n\t\t\t  background-color: #edeff0;\n\t\t\t  border-radius: .25em;\n\t\t\t}\n\t\t\t.cd-breadcrumb:after {\n\t\t\t  content: \"\";\n\t\t\t  display: table;\n\t\t\t  clear: both;\n\t\t\t}\n\t\t\t.cd-breadcrumb li {\n\t\t\t  display: inline-block;\n\t\t\t  float: left;\n\t\t\t  margin: 0.5em 0;\n\t\t\t}\n\t\t\t.cd-breadcrumb li::after {\n\t\t\t  display: inline-block;\n\t\t\t  content: '\\00bb';\n\t\t\t  margin: 0 .6em;\n\t\t\t  color: #959fa5;\n\t\t\t}\n\t\t\t.cd-breadcrumb li:last-of-type::after {\n\t\t\t  display: none;\n\t\t\t}\n\t\t\t.cd-breadcrumb li > * {\n\t\t\t  display: inline-block;\n\t\t\t  font-size: 1.4rem;\n\t\t\t  color: #2c3f4c;\n\t\t\t}\n\t\t\t.cd-breadcrumb li.current > * {\n\t\t\t  color: #96c03d;\n\t\t\t}\n\t\t\t.cd-breadcrumb.custom-icons li > *::before {\n\t\t\t  content: '';\n\t\t\t  display: inline-block;\n\t\t\t  height: 20px;\n\t\t\t  width: 20px;\n\t\t\t  margin-right: .4em;\n\t\t\t  margin-top: -2px;\n\t\t\t  background: url(../img/cd-custom-icons-01.svg) no-repeat 0 0;\n\t\t\t  vertical-align: middle;\n\t\t\t}\n\t\t\t.cd-breadcrumb.custom-icons li:not(.current):nth-of-type(2) > *::before {\n\t\t\t  background-position: -20px 0;\n\t\t\t}\n\t\t\t.cd-breadcrumb.custom-icons li:not(.current):nth-of-type(3) > *::before {\n\t\t\t  background-position: -40px 0;\n\t\t\t}\n\t\t\t.cd-breadcrumb.custom-icons li.current:nth-of-type(4) > *::before {\n\t\t\t  background-position: -60px -20px;\n\t\t\t}\n\t\t\t@media only screen and (min-width: 768px) {\n\t\t\t  .cd-breadcrumb {\n\t\t\t\tpadding: 0 1.2em;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb li {\n\t\t\t\tmargin: 1.2em 0;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb li::after {\n\t\t\t\tmargin: 0 1em;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb li > * {\n\t\t\t\tfont-size: 1rem;\n\t\t\t  }\n\t\t\t}\n\n\t\t\t@media only screen and (min-width: 768px) {\n\t\t\t  .cd-breadcrumb.triangle {\n\t\t\t\tbackground-color: transparent;\n\t\t\t\tpadding: 0;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li {\n\t\t\t\tposition: relative;\n\t\t\t\tpadding: 0;\n\t\t\t\tmargin: 4px 4px 4px 0;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li:last-of-type {\n\t\t\t\tmargin-right: 0;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li > * {\n\t\t\t\tposition: relative;\n\t\t\t\tpadding: 1em .8em 1em 2.5em;\n\t\t\t\tcolor: #2c3f4c;\n\t\t\t\tbackground-color: #edeff0;\n\t\t\t\tborder-color: #edeff0;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li.current > * {\n\t\t\t\tcolor: #ffffff;\n\t\t\t\tbackground-color: #96c03d;\n\t\t\t\tborder-color: #96c03d;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li:first-of-type > * {\n\t\t\t\tpadding-left: 1.6em;\n\t\t\t\tborder-radius: .25em 0 0 .25em;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li:last-of-type > * {\n\t\t\t\tpadding-right: 1.6em;\n\t\t\t\tborder-radius: 0 .25em .25em 0;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li::after, .cd-breadcrumb.triangle li > *::after {\n\t\t\t\tcontent: '';\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 100%;\n\t\t\t\tcontent: '';\n\t\t\t\theight: 0;\n\t\t\t\twidth: 0;\n\t\t\t\tborder: 24px solid transparent;\n\t\t\t\tborder-right-width: 0;\n\t\t\t\tborder-left-width: 20px;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li::after {\n\t\t\t\tz-index: 1;\n\t\t\t\t-webkit-transform: translateX(4px);\n\t\t\t\t-moz-transform: translateX(4px);\n\t\t\t\t-ms-transform: translateX(4px);\n\t\t\t\t-o-transform: translateX(4px);\n\t\t\t\ttransform: translateX(4px);\n\t\t\t\tborder-left-color: #ffffff;\n\n\t\t\t\tmargin: 0;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li > *::after {\n\t\t\t\tz-index: 2;\n\t\t\t\tborder-left-color: inherit;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle li:last-of-type::after, .cd-breadcrumb.triangle li:last-of-type > *::after {\n\t\t\t\tdisplay: none;\n\t\t\t  }\n\t\t\t  .cd-breadcrumb.triangle.custom-icons li::after, .cd-breadcrumb.triangle.custom-icons li > *::after {\n\t\t\t\tborder-top-width: 25px;\n\t\t\t\tborder-bottom-width: 25px;\n\t\t\t  }\n\n\t\t\t  @-moz-document url-prefix() {\n\t\t\t\t.cd-breadcrumb.triangle li::after,\n\t\t\t\t.cd-breadcrumb.triangle li > *::after {\n\t\t\t\t  border-left-style: dashed;\n\t\t\t\t}\n\t\t\t  }\n\t\t\t}\n\n\t\t\t@media only screen and (min-width: 768px) {\n\t\t\t  .cd-breadcrumb.triangle.custom-icons li.current:nth-of-type(4) em::before {\n\t\t\t\tbackground-position: -60px -40px;\n\t\t\t  }\n\t\t\t}\n\n\t\tblockquote {\n\t\t    padding: 1.25rem;\n\t\t    margin-top: 1.25rem;\n\t\t    margin-bottom: 1.25rem;\n\t\t    border: 1px solid #eee;\n\t\t    border-left-width: .25rem;\n\t\t    border-left-color: #5bc0de;\n\t\t    border-radius: .25rem;\n\t\t}\n    \t.card {border:none;}\n    \t.footer {padding:40px 0;background-color:#fff;color:#4b4c4d;text-align:center;}\n\n\n    </style>\n\t"
  },
  {
    "path": "install/tpl/index.jizhi",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"robots\" content=\"noindex,noarchive\">\n    <?php include(\"header.tpl\");?>\n</head>\n<body>\n<header><div class=\"text-center\"><h1>极致CMS商业版系统安装向导</h1></div></header>\n<div class=\"container\">\n\t<div class=\"row justify-content-center\">\n\t    <div class=\"col-lg-10\">\n\t        <div class=\"card\">\n\t            <div class=\"card-body\">\n\t\t\t\t\t<!--body-->\n\t\t\t\t\t<form class=\"track_form row was-validated\" action=\"?act=step1\" method=\"post\" id=\"contactForm\">\n\t                <!--textarea class=\"form-control\" rows=\"15\" readonly=\"readonly\"-->\n\t\t\t\t\t\t<div class=\"border p-3\" style=\"overflow-y:auto;height:300px;\">\n\t\t\t\t\t\t\t<div class=\"m-3\">\n\t\t\t\t\t\t\t\t<div class=\"card-title\">\n\t\t\t\t\t\t\t\t\t<h2>前面的话</h2>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"card-text\">\n                                  <p>欢迎您使用极致CMS商业版, 希望我们的建站系统能够让您在使用的时候感到快乐~</p>\n                                  <p>郑重承诺极致CMS商业版程序无后门，无限制，全开源，不收授权费，长期运营至死方休。</p>\n                                  <p>原极致CMS与现在的商业版源码结构不同，但功能相同，商业版出售的是商业服务，并不是源码授权。</p>\n                                  <h2>安装须知</h2>\n                                  <p>极致CMS商业版受到法律和国际公约保护。使用者：无论个人或组织、盈利与否、用途如何（包括以学习和研究为目的），均需仔细阅读本协议，在理解、同意、并遵守本协议的全部条款后，方可开始使用 极致CMS商业版 软件。</p>\n                                  <h3>I. 权利</h3>\n                                  <ol>\n                                    <li>您可以在完全遵守本最终用户授权协议的基础上使用本软件。</li>\n                                    <li>您可以在协议规定的约束和限制范围内修改 极致CMS商业版 源代码或界面风格以适应您的网站要求。</li>\n                                    <li>您拥有使用本软件构建的网站中全部会员资料、文章、商品及相关信息的所有权，并独立承担与之相关的法律义务。</li>\n                                    <li><b style=\"color:#f00;\">您可以修改删除网页显示的版权信息，但不允许修改删除PHP源码中的版权信息。</b></li>\n                                  </ol>\n                                  <h3>II. 义务</h3>\n                                  <ol>\n                                    <li>本软件为开源软件，您可以在遵循本授权协议的基础上使用此版本软件。</li>\n                                    <li>不得对本软件或与之关联的商业授权进行出租、出售、抵押。</li>\n                                    <li>不得利用本软件参与重大国际、国家等重点项目，发生一切安全、产权、事故等纠纷均由使用者承担。</li>\n                                    <li>禁止在 极致CMS商业版 的整体或任何部分基础上以发展任何衍生版本、修改版本或第三方版本用于重新分发。</li>\n                                    <li><b style=\"color:#f00;\">禁止使用者在未经官方允许的情况下发布 极致CMS商业版 相关安全漏洞信息，取得官方授权并在官方修复漏洞后，可发布相关漏洞信息。</b></li>\n                                  </ol>\n                                  <h3>III. 有限担保和免责声明</h3>\n                                  <ol>\n                                    <li>本软件及所附带的文件是不提供任何明确的或隐含的赔偿或担保的形式提供的。</li>\n                                    <li>用户出于自愿而使用本软件，您必须了解使用本软件的风险，在尚未购买产品技术服务之前，我们不承诺提供任何形式的技术支持、使用担保，也不承担任何因使用本软件而产生问题的相关责任。</li>\n                                    <li>极致CMS商业版官方不对使用本软件构建的网站中的文章、商品和其他信息承担责任。</li>\n                                  </ol>\n                                  <p><b style=\"color:#f00;\">有关 极致CMS商业版 最终用户授权协议、商业授权与技术服务的详细内容，均由 极致CMS商业版 官方网站独家提供。</b></p>\n                                  <p>电子文本形式的授权协议如同双方书面签署的协议一样，具有完全的和等同的法律效力。您一旦开始安装 极致CMS商业版，即被视为完全理解并接受本协议的各项条款，在享有上述条款授予的权力的同时，受到相关的约束和限制。协议许可范围以外的行为，将直接违反本授权协议并构成侵权，我们有权随时终止授权，责令停止损害，并保留追究相关责任的权力。</p>\n                                  <blockquote>\n                                  <p>\n                                  作者：涂福<br>\n                                  时间：2021-01-26<br>\n                                  版权所有 (c) 2021-2099。\n                                  </p>\n                                  </blockquote>\n                                </div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"form-group mt-2 mb-5 col-md-12\">\n\t\t\t\t\t\t\t<div class=\"creat_account_two custom-control custom-switch\">\n\t\t\t\t\t\t\t\t<input class=\"custom-control-input\" type=\"checkbox\" id=\"f-option\" name=\"selector\" required>\n\t\t\t\t\t\t\t\t<label class=\"custom-control-label text-justify\" for=\"f-option\">我已阅读并且同意用户授权协议。</label>\n\t\t\t\t\t\t\t\t<div class=\"check\"></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"form-group col-12\">\n\t\t\t\t\t\t\t<button type=\"submit\" value=\"submit\" class=\"btn btn-primary rounded btn-block py-2\">继续</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t\t<!-- end -->\n\t            </div>\n\t        </div>\n\t    </div>\n\t</div>\n<?php include('footer.tpl');?>\n</body>\n</html>"
  },
  {
    "path": "install/tpl/js/common.js",
    "content": "\nfunction TrBgChange(AreaId,OddClass,EvenClass){\n\tvar trs=document.getElementById(AreaId).getElementsByTagName(\"tr\");\n\tfor(var i=1;i<trs.length;i++)\n\t{\n\t\ttrs[i].className=(trs[i].sectionRowIndex%2==0)?OddClass:EvenClass;\n\t}\n}\n\n(function( $ ){\n  $.fn.animateProgress = function(progress, callback) {    \n    return this.each(function() {\n      $(this).animate({\n        width: progress+'%'\n      }, {\n        duration: 20, \n        easing: 'swing',\n        step: function( progress ){\n          var labelEl = $('.ui-label', this),\n              valueEl = $('.value', labelEl);\n          \n          if (Math.ceil(progress) < 20 && $('.ui-label', this).is(\":visible\")) {\n            labelEl.hide();\n          }else{\n            if (labelEl.is(\":hidden\")) {\n              labelEl.fadeIn();\n            };\n          }\n          \n          if (Math.ceil(progress) == 100) {\n            labelEl.text('Done');\n            setTimeout(function() {\n              labelEl.fadeOut();\n            }, 100);\n          }else{\n            valueEl.text(Math.ceil(progress) + '%');\n          }\n        },\n        complete: function(scope, i, elem) {\n          if (callback) {\n            callback.call(this, i, elem );\n          };\n        }\n      });\n    });\n  };\n})( jQuery );"
  },
  {
    "path": "install/tpl/layer/mobile/layer.js",
    "content": "/*! layer mobile-v2.0.0 Web弹层组件 MIT License  http://layer.layui.com/mobile  By 贤心 */\n ;!function(e){\"use strict\";var t=document,n=\"querySelectorAll\",i=\"getElementsByClassName\",a=function(e){return t[n](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 n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener(\"click\",function(e){t.call(this,e)},!1)};var r=0,o=[\"layui-m-layer\"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement(\"div\");e.id=s.id=o[0]+r,s.setAttribute(\"class\",o[0]+\" \"+o[0]+(n.type||0)),s.setAttribute(\"index\",r);var l=function(){var e=\"object\"==typeof n.title;return n.title?'<h3 style=\"'+(e?n.title[1]:\"\")+'\">'+(e?n.title[0]:n.title)+\"</h3>\":\"\"}(),c=function(){\"string\"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type=\"1\">'+n.btn[0]+\"</span>\",2===t&&(e='<span no type=\"0\">'+n.btn[1]+\"</span>\"+e),'<div class=\"layui-m-layerbtn\">'+e+\"</div>\"):\"\"}();if(n.fixed||(n.top=n.hasOwnProperty(\"top\")?n.top:100,n.style=n.style||\"\",n.style+=\" top:\"+(t.body.scrollTop+n.top)+\"px\"),2===n.type&&(n.content='<i></i><i class=\"layui-m-layerload\"></i><i></i><p>'+(n.content||\"\")+\"</p>\"),n.skin&&(n.anim=\"up\"),\"msg\"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?\"<div \"+(\"string\"==typeof n.shade?'style=\"'+n.shade+'\"':\"\")+' class=\"layui-m-layershade\"></div>':\"\")+'<div class=\"layui-m-layermain\" '+(n.fixed?\"\":'style=\"position:static;\"')+'><div class=\"layui-m-layersection\"><div class=\"layui-m-layerchild '+(n.skin?\"layui-m-layer-\"+n.skin+\" \":\"\")+(n.className?n.className:\"\")+\" \"+(n.anim?\"layui-m-anim-\"+n.anim:\"\")+'\" '+(n.style?'style=\"'+n.style+'\"':\"\")+\">\"+l+'<div class=\"layui-m-layercont\">'+n.content+\"</div>\"+c+\"</div></div></div>\",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute(\"index\"))}document.body.appendChild(s);var u=e.elem=a(\"#\"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute(\"type\");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i](\"layui-m-layerbtn\")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i](\"layui-m-layershade\")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:\"2.0\",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a(\"#\"+o[0]+e)[0];n&&(n.innerHTML=\"\",t.body.removeChild(n),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[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute(\"index\"))}},\"function\"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf(\"/\")+1);n.getAttribute(\"merge\")||document.head.appendChild(function(){var e=t.createElement(\"link\");return e.href=a+\"need/layer.css?2.0\",e.type=\"text/css\",e.rel=\"styleSheet\",e.id=\"layermcss\",e}())}()}(window);"
  },
  {
    "path": "install/tpl/layer/mobile/need/layer.css",
    "content": ".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}"
  },
  {
    "path": "install/tpl/layer/theme/default/layer.css",
    "content": ".layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+\"px\")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}"
  },
  {
    "path": "install/tpl/step1.jizhi",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n    <meta name=\"robots\" content=\"noindex,noarchive\">\r\n    <?php include('header.tpl');?>\r\n</head>\r\n<body>\r\n<header><div class=\"text-center\"><h1>极致建站系统安装向导</h1></div></header>\r\n<div class=\"container\">\r\n\t<div class=\"row justify-content-center\">\r\n\t\t<div class=\"col-lg-8\">\r\n\t\t\t\r\n\t\t\t<nav>\r\n\t\t\t\t<ol class=\"cd-breadcrumb triangle custom-icons\">\r\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step1\">环境需求</a></li>\r\n\t\t\t\t\t<li><em>填写数据信息</em></li>\r\n\t\t\t\t\t<li><em>开始安装</em></li>\r\n\t\t\t\t\t<li><em>安装完成</em></li>\r\n\t\t\t\t</ol>\r\n\t\t\t</nav>\r\n\t\t</div>\r\n\t\t<div class=\"col-lg-7\">\r\n\t\t\t<div class=\"progress my-5\">\r\n\t\t\t\t<div class=\"progress-bar progress-bar-info progress-bar-striped active\" style=\"width: 20%;\">\r\n\t\t\t\t\t<div class=\"progress-value\">20%</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"row justify-content-center\">\r\n\t    <div class=\"col-lg-10\">\r\n\t        <div class=\"card\">\r\n\t            <div class=\"card-body\">\r\n\t\t\t\t\t<!--body-->\r\n\t\t\t\t\t<h2>运行环境需求</h2>\r\n\t\t\t\t        <p>1.要求PHP5.6以上，建议使用7.0以上版本，本系统已支持PHP7.2，支持Windows和Linux主机</p>\r\n\t\t\t\t        <p>2.安装环境建议Linux服务器，当然Windows也是可以安装的，云服务器建议安装宝塔面板【<a href=\"http://www.bt.cn/\" style=\"color:green\" target=\"_blank\">查看</a>】</p>\r\n\t\t\t\t        <p>3.无论是Windows还是Linux建议安装Apache、mysql、phpMyAdmin配件</p>\r\n\t\t\t\t        <p>4.本系统目前仅支持mysql数据库，且数据库字符集必须是UTF-8或utf8_general_ci</p>\r\n\t\t\t\t\t<h2>安装环境</h2>\r\n\t\t\t\t\t<table class=\"table table-striped table-bordered\">\r\n\t\t\t\t        <tr class=\"table-primary\">\r\n\t\t\t\t\t\t\t<th scope=\"col\">环境</th>\r\n\t\t\t\t\t\t\t<th scope=\"col\">当前</th>\r\n\t\t\t\t\t\t\t<th scope=\"col\">要求</th>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<th>PHP</th>\r\n\t\t\t\t\t\t\t<td><?php echo check_version();?></td>\r\n\t\t\t\t\t\t\t<td>5.6 ~ 7.4</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t         <tr>\r\n\t\t\t\t          <th>路径</th> \r\n\t\t\t\t          <td><?php echo  check_chinese();?></td>\r\n\t\t\t\t          <td>无中文字符</td>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t        <tr>\r\n\t\t\t\t          <th>权限</th> \r\n\t\t\t\t          <td><?php echo  check_disable();?></td>\r\n\t\t\t\t          <td>opendir</td>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t\t</table>\r\n\t\t\t\t\t<h2>目录权限</h2>\r\n\t\t\t\t\t<table class=\"table table-striped table-bordered\">\r\n\t\t\t\t        <tr class=\"table-primary\">\r\n\t\t\t\t          <th scope=\"col\">目录</th>\r\n\t\t\t\t          <th scope=\"col\">当前</th>\r\n\t\t\t\t          <th scope=\"col\">所需</th>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t         <tr>\r\n\t\t\t\t          <th>安装目录/install/</th>\r\n\t\t\t\t          <td><?php echo new_is_writeable('../install')?'满足':'不支持';?></td>\r\n\t\t\t\t          <td>可写</td>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t        <tr>\r\n\t\t\t\t          <th>配置文件/conf/config.php</th>\r\n\t\t\t\t          <td><?php echo new_is_writeable('../conf/config.php')?'满足':'不支持';?></td>\r\n\t\t\t\t          <td>可写</td>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t\t\r\n\t\t\t\t        <tr>\r\n\t\t\t\t          <th>缓存文件/cache/</th>\r\n\t\t\t\t          <td><?php echo new_is_writeable('../cache')?'满足':'不支持';?></td>\r\n\t\t\t\t          <td>可写</td>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t          <th>资源文件夹/static/</th>\r\n\t\t\t\t          <td><?php echo new_is_writeable('../static')?'满足':'不支持';?></td>\r\n\t\t\t\t          <td>可写</td>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t          <th>备份文件夹/backup/</th>\r\n\t\t\t\t          <td><?php echo new_is_writeable('../backup')?'满足':'不支持';?></td>\r\n\t\t\t\t          <td>可写</td>\r\n\t\t\t\t        </tr>\r\n\t\t\t\t\t</table>\r\n\t\t\t\t\t<div class=\"form-group col-12\">\r\n\t\t\t\t\t\t<?php \r\n\t\t\t\t\t\t\tif($errmsg==1) {\r\n\t\t\t\t\t\t\t  echo '<button type=\"button\" class=\"btn btn-warning rounded btn-block py-2\" value=\"\" disabled>不符合要求，不能安装！</button>';\r\n\t\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\t  echo '<button type=\"submit\" value=\"submit\"  class=\"btn btn-primary rounded btn-block py-2\" value=\"\" onclick=\"window.location.href=\\'?act=step2\\'\"/>开始安装 > > ></button>';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t?>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<!-- end -->\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n<script>\r\nfunction installfinish() {\r\n    layer.confirm(\"您确定取消安装吗？这样非常不安全，将使用默认后台地址和密码！\", {\r\n        icon: 3,\r\n        title: '警告危险'\r\n    }, function() {\r\n        $.post(\"?act=finish\", function(data) {\r\n            window.location.href = '../'\r\n        });\r\n    })\r\n}\r\n</script>\r\n<?php include('footer.tpl');?>\r\n</body>\r\n</html>"
  },
  {
    "path": "install/tpl/step2.jizhi",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n    <meta name=\"robots\" content=\"noindex,noarchive\">\r\n   <?php include('header.tpl');?>\r\n</head>\r\n<body>\r\n<header><div class=\"text-center\"><h1>极致建站系统安装向导</h1></div></header>\r\n<div class=\"container\">\r\n\t<div class=\"row justify-content-center\">\r\n\t\t<div class=\"col-lg-8\">\r\n\t\t\t<nav>\r\n\t\t\t\t<ol class=\"cd-breadcrumb triangle custom-icons\">\r\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step1\">环境需求</a></li>\r\n\t\t\t\t\t<li class=\"current\"><em>填写数据信息</em></li>\r\n\t\t\t\t\t<li><em>开始安装</em></li>\r\n\t\t\t\t\t<li><em>安装完成</em></li>\r\n\t\t\t\t</ol>\r\n\t\t\t</nav>\r\n\t\t</div>\r\n\t\t<div class=\"col-lg-7\">\r\n\t\t\t<div class=\"progress my-5\">\r\n\t\t\t\t<div class=\"progress-bar progress-bar-info progress-bar-striped active\" style=\"width: 50%;\">\r\n\t\t\t\t\t<div class=\"progress-value\">50%</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"row justify-content-center\">\r\n\t    <div class=\"col-lg-10\">\r\n\t        <div class=\"card\">\r\n\t            <div class=\"card-body\">\r\n\t\t\t\t\t<!--body-->\r\n\t\t\t\t\t<form name=\"submitForm\" action=\"?act=step3\" method=\"post\">\r\n\t\t\t\t\t\t\t<table class=\"table table-striped table-bordered\">\r\n\t\t\t\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t\t\t\t<tr class=\"table-primary\">\r\n\t\t\t\t\t\t\t\t\t\t<th  colspan=\"2\">填写网站基本信息<em>(默认系统会自动获取不用修改，如有错请修改.)</em></th>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t</thead>\r\n\t\t\t\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t  <td>网站网址:</td>\r\n\t\t\t\t\t\t\t\t\t  <td><?php echo get_domain();?></td>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>选择数据库类型:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td><span id=\"dbType\">\r\n\t\t\t\t\t\t\t\t\t\t\t<label>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"radio\" name=\"dbtype\"   value=\"mysql\" checked />\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>mysql</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t</tbody>\r\n\t\t\t\t\t\t\t</table>\r\n\r\n\t\t\t\t\t\t\t<table class=\"table table-striped table-bordered\">\r\n\t\t\t\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t\t\t\t<tr class=\"table-primary\">\r\n\t\t\t\t\t\t\t\t\t\t<th  colspan=\"2\">填写数据库信息</th>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t</thead>\r\n\t\t\t\t\t\t\t\t<div class=\"dbType\" id=\"mysql\">\r\n\t\t\t\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t\t\t\t  <tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>数据库服务器:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\" id=\"host\" name=\"host\" value=\"127.0.0.1\" placeholder=\"127.0.0.1\"/>\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal hostinfo\">如果无法连接，改成:localhost</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t  </tr>\r\n\t\t\t\t\t\t\t\t\t  <tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>数据库端口号:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\"  id=\"port\" name=\"port\" value=\"3306\" style=\"width:80px;\"  placeholder=\"空\"/>\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal\">默认3306一般不需要更改</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t  </tr>\r\n\t\t\t\t\t\t\t\t\t  <tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>数据库名称:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\" id=\"name\" name=\"name\" value=\"jizhicms<?php echo mt_rand(1000,9999);?>\" placeholder=\"jizhicms\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal nameinfo\">本地自动创建，服务器空间需要超级管理员账户，否则需要手动填写</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t  </tr>\r\n\t\t\t\t\t\t\t\t\t   <tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>数据库表前缀:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\" id=\"prefix\" name=\"prefix\" value=\"jz_\" placeholder=\"jz_\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal nameinfo\">一般不改</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t  </tr>\r\n\t\t\t\t\t\t\t\t\t  <tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>数据库帐号:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\" id=\"user\" name=\"user\" value=\"\"  placeholder=\"\"/>\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal userinfo\">请查看服务器上分配的账户</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t  </tr>\r\n\t\t\t\t\t\t\t\t\t  <tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>数据库密码:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\" id=\"password\" name=\"password\" value=\"\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal passwordinfo\">请查看服务器上分配的登录密码</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t  </tr>\r\n\t\t\t\t\t\t\t\t</tbody>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</table>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<div class=\"cuetitle\"></div>\r\n\t\t\t\t\t\t\t<table class=\"table table-striped table-bordered\">\r\n\t\t\t\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t\t\t\t<tr class=\"table-primary\">\r\n\t\t\t\t\t\t\t\t\t\t<th  colspan=\"2\">填写创始人信息</th>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>管理员:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\" name=\"admin_name\" id=\"adminname\" maxlength=\"20\" value=\"jizhicms<?php echo mt_rand(1000,9999)?>\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal\">0到20个字符，不含非法字符！</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t</thead>\r\n\t\t\t\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>密码:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\" name=\"admin_pass\" id=\"adminpass\" maxlength=\"20\" value=\"jizhicms<?php echo mt_rand(1000,9999)?>\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal\">6到20个字符</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>确认密码:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" class=\"text\" name=\"admin_repass\" id=\"repassword\" maxlength=\"20\" value=\"\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<label class=\"normal\">和密码保持一致</label>\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t</tbody>\r\n\t\t\t\t\t\t\t</table>\r\n\t\t\t\t\t\t<input name=\"go_backup\" id=\"go_backup\" type=\"hidden\" value=\"0\" />\r\n\t\t\t\t\t\t\t<?php if(count($dblists)>0){?>\r\n\t\t\t\t\t\t\t<table class=\"table table-striped table-bordered\">\r\n\t\t\t\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t\t\t\t<tr class=\"table-warning\">\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t<th  colspan=\"2\">检测到您存在备份数据库  <span style=\"color: #f00;\">如果是下载的网站源码，建议安装备份数据库，否则网站会报错！</span></th>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t\t<td>备份数据库列表:</td>\r\n\t\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t\t<select name=\"backup_db\" id=\"backup_db\">\r\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"\">选择备份数据库</option>\r\n\t\t\t\t\t\t\t\t\t\t\t<?php foreach($dblists as $v){\r\n\t\t\t\t\t\t\t\t\t\t\t\techo \"<option value='\".$v.\"'>\".$v.\"</option>\";\r\n\t\t\t\t\t\t\t\t\t\t\t}?>\r\n\t\t\t\t\t\t\t\t\t\t\t</select>\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t\t</thead>\r\n\t\t\t\t\t\t\t</table>\r\n\r\n\t\t\t\t\t\t\t<?php }?>\r\n\t\t\t\t\t\t<div class=\"form-group col-12\">\r\n\t\t\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t\t\t\t\t<div class=\"col-6\">\r\n\t\t\t\t\t\t\t\t\t<input type=\"button\" class=\"btn btn-secondary rounded btn-block py-2\" onclick=\"location.href='step1.html'\" value=\"上一步\" />\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<div class=\"col-6\">\r\n\t\t\t\t\t\t\t\t\t<input type=\"button\" class=\"btn btn-primary rounded btn-block py-2\" id=\"submitinput\" onclick=\"formSubmit();\" value=\"下一步\" />\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</form>\r\n\t\t\t\t\t<!-- end -->\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n<script type=\"text/javascript\">\r\n\t\tvar install = 1;\r\n\t\tfunction godbback(){\r\n\t\t\tconsole.log('安装备份数据库');\r\n\t\t\tvar host = $(\"#host\").val();\r\n\t\t\tvar port = $(\"#port\").val();\r\n\t\t\tvar name = $(\"#name\").val();\r\n\t\t\tvar prefix = $(\"#prefix\").val();\r\n\t\t\tvar user = $(\"#user\").val();\r\n\t\t\tvar password = $(\"#password\").val();\r\n\t\t\tvar check=true;\r\n\t\t\tif($.trim(host)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库服务器!\");$(\"#host\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(port)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库端口!\");$(\"#port\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(name)==''){\r\n\t\t\t\tlayer.alert(\"请填写数据库名字!\");$(\"#name\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(prefix)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库表前缀!\");$(\"#prefix\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(user)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库用户名!\");$(\"#user\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(password)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库密码!\");$(\"#password\").focus();return false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$.ajax({\r\n\t\t\t\turl:\"?act=testdb\",\r\n\t\t\t\ttype:'POST',\r\n\t\t\t\tasync:false,\r\n\t\t\t\tdataType:'json',\r\n\t\t\t\tdata:{host:host,port:port,name:name,prefix:prefix,user:user,password:password},\r\n\t\t\t\tsuccess:function(res){\r\n\t\t\t\t\tif(res.code!=0){\r\n\t\t\t\t\t\talert(res.msg);\r\n\t\t\t\t\t\tcheck=false;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\t\t\t\terror:function(){\r\n\t\t\t\t\talert('网络错误！');\r\n\t\t\t\t\tcheck=false;\r\n\t\t\t\t}\r\n\r\n\t\t\t});\r\n\t\t\tif(!check){\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar db = $(\"#backup_db\").val();\r\n\t\t\t$(\"#go_backup\").val(1);\r\n\t\t\r\n\t\t\t$(\"form[name='submitForm']\").submit();\r\n\t\t\t\r\n\t\t}\r\n\t\tfunction formSubmit(){\r\n\t\t\tif(install==2){\r\n\t\t\t\tgodbback();\r\n\t\t\t\treturn false;\r\n\t\t\t}else{\r\n\t\t\t\tconsole.log('下一步');\r\n\t\t\t}\r\n\t\t\tvar check = true;\r\n\r\n\t\t\tvar host = $(\"#host\").val();\r\n\t\t\tvar port = $(\"#port\").val();\r\n\t\t\tvar name = $(\"#name\").val();\r\n\t\t\tvar prefix = $(\"#prefix\").val();\r\n\t\t\tvar user = $(\"#user\").val();\r\n\t\t\tvar password = $(\"#password\").val();\r\n\t\t\tif($.trim(host)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库服务器!\");$(\"#host\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(port)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库端口!\");$(\"#port\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(name)==''){\r\n\t\t\t\tlayer.alert(\"请填写数据库名字!\");$(\"#name\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(prefix)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库表前缀!\");$(\"#prefix\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(user)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库用户名!\");$(\"#user\").focus();return false;\r\n\t\t\t}\r\n\t\t\tif($.trim(password)==''){\r\n\t\t\t\tcheck=false;layer.alert(\"请填写数据库密码!\");$(\"#password\").focus();return false;\r\n\t\t\t}\r\n\t\t\t$.ajax({\r\n\t\t\t\turl:\"?act=testdb\",\r\n\t\t\t\ttype:'POST',\r\n\t\t\t\tasync:false,\r\n\t\t\t\tdataType:'json',\r\n\t\t\t\tdata:{host:host,port:port,name:name,prefix:prefix,user:user,password:password},\r\n\t\t\t\tsuccess:function(res){\r\n\t\t\t\t\tif(res.code!=0){\r\n\t\t\t\t\t\talert(res.msg);\r\n\t\t\t\t\t\tcheck=false;\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t//console.log(res);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\terror:function(){\r\n\t\t\t\t\talert('网络错误！');\r\n\t\t\t\t\tcheck=false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tif(!check){\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif($.trim($(\"#adminname\").val())==\"\"){check=false;layer.alert(\"请填写用户名!\");$(\"#adminname\").focus();return false;}\r\n\t\t\tif($.trim($(\"#adminpass\").val())==\"\"){check=false;layer.alert(\"请填写密码!\");$(\"#adminpass\").focus();return false;}\r\n\t\t\tif($.trim($(\"#repassword\").val())==\"\"){check=false;layer.alert(\"请填写确认密码!\");$(\"#repassword\").focus();return false;}\r\n\t\t\tif($.trim($(\"#adminpass\").val())!=$.trim($(\"#repassword\").val())){check=false;layer.alert(\"密码和确认密码不符!\");$(\"#repassword\").focus();return false;}\r\n\t\t\t\t\r\n\t\t\tif(check){$(\"form[name='submitForm']\").submit();}\r\n\t\t}\r\n\r\n\t\t$(function(){\r\n\t\t\t$(\"#backup_db\").change(function(){\r\n\t\t\t\tif($(this).val()!=''){\r\n\t\t\t\t\tinstall = 2;//安装备份数据库\r\n\t\t\t\t}else{\r\n\t\t\t\t\tinstall = 1;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\r\n\t\t})\r\n</script>\r\n<?php include('footer.tpl');?>\r\n</body>\r\n</html>"
  },
  {
    "path": "install/tpl/step3.jizhi",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"robots\" content=\"noindex,noarchive\">\n   <?php include('header.tpl');?>\n</head>\n<body>\n<header><div class=\"text-center\"><h1>极致建站系统安装向导</h1></div></header>\n<div class=\"container\">\n\t<div class=\"row justify-content-center\">\n\t\t<div class=\"col-lg-8\">\n\t\t\t\n\t\t\t<nav>\n\t\t\t\t<ol class=\"cd-breadcrumb triangle custom-icons\">\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step1\">环境需求</a></li>\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step2\">填写数据信息</a></li>\n\t\t\t\t\t<li class=\"current\"><em>开始安装</em></li>\n\t\t\t\t\t<li><em>安装完成</em></li>\n\t\t\t\t</ol>\n\t\t\t</nav>\n\t\t</div>\n\t\t<div class=\"col-lg-7\">\n\t\t\t<div class=\"progress my-5\">\n\t\t\t\t<div class=\"progress-bar progress-bar-info progress-bar-striped active\" style=\"width: 100%;\">\n\t\t\t\t\t<div class=\"progress-value\">100%</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"row justify-content-center\">\n\t    <div class=\"col-lg-10\">\n\t        <div class=\"card\">\n\t            <div class=\"card-body\">\n\t\t\t\t\t<!--body-->\n\t\t\t\t\t<div class=\"card-title\">\n\t\t\t\t\t\t<h3>安装进度安装过程中请不要做其他操作，安装时间大约需要1分钟。</h3>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"my-5\">\n\t\t\t\t\t\t<div id=\"progress_bar\" class=\"ui-progress-bar ui-container\">\n\t\t\t\t\t\t\t<div class=\"ui-progress\" style=\"width: 0%;\"><span class=\"ui-label\" style=\"display:none;\">Processing<b class=\"value\">100%</b></span></div>\n\t\t\t\t\t\t\t<div id=\"main_content\">正在载入...</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t\t<script>\n\t\t\t\t\t\t\t$(function() { \n\t\t\t\t\t\t\t\t$('#progress_bar .ui-progress .ui-label').hide();\n\t\t\t\t\t\t\t\t\t getinstalling(0,100)\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tfunction getinstalling(start,to){\n\t\t\t\t\t\t\t  \n\t\t\t\t\t\t\t\t$.post(\"?act=go_install&db=<?php echo $db;?>\",{\"start\":start,\"to\":to,\"admin_name\":\"<?php echo $admin_name;?>\",\"admin_pass\":\"<?php echo $admin_pass;?>\"},  function(data){\n\t\t\t\t\t\t\t\tconsole.log(data);\n\t\t\t\t\t\t\t\t var count=data.count;\n\t\t\t\t\t\t\t\t  var start =data.to;\n\t\t\t\t\t\t\t\t  var num =Math.round(start/count*100);\n\t\t\t\t\t\t\t\t$('#progress_bar .ui-progress').animateProgress(num)\n\t\t\t\t\t\t\t\t $('#main_content').html(\"安装中\");\n\t\t\t\t\t\t\t\t\t if (num==100){\n\t\t\t\t\t\t\t\t\t\t  $('#main_content').html(\"<span >数据库初始化完成！请点击 安装完成 。</span>\");\n\t\t\t\t\t\t\t\t\t\t $(\".button_step5\").val(\"完成安装\").removeAttr(\"disabled\");\n\t\t\t\t\t\t\t\t\t\tif(\"0\"==\"1\"){ $(\".button_testsql\").show(); }\n\t\t\t\t\t\t\t\t\t }\t\n\t\t\t\t\t\t\t\t\telse if(num<100){\n\t\t\t\t\t\t\t\t\t $(\".button_step5\").val(\"正在创建数据，请稍等...\").attr({\"disabled\":\"disabled\"});\n\t\t\t\t\t\t\t\t\tgetinstalling(to,to+10)\t\t \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\t  alert(\"安装出错，请检查数据库连接是否稳定，不建议本地连接服务器数据库\")\n\t\t\t\t\t\t\t\t\t  $(\".button_step5\").val(\"安装出错\").attr({\"disabled\":\"disabled\"});\n\t\t\t\t\t\t\t\t\t  return false;\n\t\t\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t\t},\"json\");\t  \n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</script>\n\t\t\t\t\t\t<div class=\"col-12\">\n\t\t\t\t\t\t<?php if($db==''){?>\n\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t<div class=\"col-6\">\n\t\t\t\t\t\t\t\t\t<input class=\"btn btn-primary rounded btn-block py-2\" type=\"button\"  class=\"button\" onclick=\"location.href='?act=step4&admin_name=<?php echo $admin_name;?>&admin_pass=<?php echo $admin_pass;?>'\"  value=\"导入演示数据\" />\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-6\">\n\t\t\t\t\t\t\t\t\t<input class=\"btn btn-success rounded btn-block py-2\" type=\"button\" onclick=\"location.href='?act=step5'\" value=\"安装完成\" />\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<?php }else{?>\n\t\t\t\t\t\t<input class=\"btn btn-primary rounded btn-block py-2\" type=\"button\" class=\"button\" onclick=\"location.href='?act=step5'\" value=\"安装完成\" />\n\t\t\t\t\t\t<?php }?>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t<!-- end -->\n\t            </div>\n\t        </div>\n\t    </div>\n\t</div>\n<?php include('footer.tpl');?>\n</body>\n</html>"
  },
  {
    "path": "install/tpl/step4.jizhi",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"robots\" content=\"noindex,noarchive\">\n    <?php include(\"header.tpl\");?>\n</head>\n<body>\n<header><div class=\"text-center\"><h1>极致建站系统安装向导</h1></div></header>\n<div class=\"container\">\n\t<div class=\"row justify-content-center\">\n\t\t<div class=\"col-lg-8\">\n\t\t\t\n\t\t\t<nav>\n\t\t\t\t<ol class=\"cd-breadcrumb triangle custom-icons\">\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step1\">环境需求</a></li>\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step2\">填写数据信息</a></li>\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step3\">开始安装</a></li>\n\t\t\t\t\t<li class=\"current\"><em>导入数据</em></li>\n\t\t\t\t</ol>\n\t\t\t</nav>\n\t\t</div>\n\t\t<div class=\"col-lg-7\">\n\t\t\t<div class=\"progress my-5\">\n\t\t\t\t<div class=\"progress-bar progress-bar-info progress-bar-striped active\" style=\"width: 100%;\">\n\t\t\t\t\t<div class=\"progress-value\">100%</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"row justify-content-center\">\n\t    <div class=\"col-lg-10\">\n\t        <div class=\"card\">\n\t            <div class=\"card-body\">\n\t\t\t\t\t<!--body-->\t\t\t\t\t\n\t\t\t\t\t<div class=\"card-title\">\n\t\t\t\t\t\t<h3>安装进度安装过程中请不要做其他操作，安装时间大约需要1分钟。</h3>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"my-5\">\n\t\t\t\t\t\t<div id=\"progress_bar\" class=\"ui-progress-bar ui-container\">\n\t\t\t\t\t\t\t<div class=\"ui-progress\" style=\"width: 0%;\"><span class=\"ui-label\" style=\"display:none;\">Processing<b class=\"value\">100%</b></span></div>\n\t\t\t\t\t\t\t<div id=\"main_content\">正在载入...</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n<script>\n\t $(function() { \n\t  $('#progress_bar .ui-progress .ui-label').hide();  \t  \n\t  getinstalling(0,100);\n\t});\n\t  function getinstalling(start,to){\n\t\tvar index = layer.load();\n\t\t$('#main_content').html(\"正在安装中，请耐心等待！大概需要10-30秒\");\t\t\n\t\t$.post(\"?act=install_testdb\",{\"start\":start,\"to\":to,\"admin_name\":\"<?php echo $_GET['admin_name'];?>\",\"admin_pass\":\"<?php echo $_GET['admin_pass'];?>\"},  function(data){\n\t\t  var count=data.count;\n\t\t  var start =data.to;\n\t\t  var num =Math.round(start/count*100);\n\t\t$('#progress_bar .ui-progress').animateProgress(num)\t  \n\t\t\t if (num==100){\n\t\t\t\t layer.close(index)\n\t\t\t\t $('#main_content').html(\"测试数据安装完成，请点击[完成安装]。\");\n\t\t\t\t $(\".button_step5\").val(\"完成安装\").removeAttr(\"disabled\");\n\t\t\t\t if(\"0\"==\"1\"){ $(\".button_testsql\").show(); }\n\t\t\t }else{\n\t\t\t  layer.close(index)\n\t\t\t  layer.alert(\"安装出错，请检查服务器环境，写入权限是否开启\");\n\t\t\t  $(\".button_step5\").val(\"安装出错\").attr({\"disabled\":\"disabled\"});\n\t\t\t  return false;\n\t\t\t  }\n\t\t },\"json\");\t  \n\t  }\n</script>\n\t\t\t\t\t\t<div class=\"col-12\">\n\t\t\t\t\t\t\t<input class=\"btn btn-primary rounded btn-block py-2\" type=\"button\" class=\"button\" onclick=\"location.href='?act=step5'\" value=\"安装完成\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t<!-- end -->\n\t            </div>\n\t        </div>\n\t    </div>\n\t</div>\n<?php include('footer.tpl');?>\n</body>\n</html>"
  },
  {
    "path": "install/tpl/step5.jizhi",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"robots\" content=\"noindex,noarchive\">\n\t<?php include(\"header.tpl\");?>\n</head>\n<body>\n<header><div class=\"text-center\"><h1>极致建站系统安装向导</h1></div></header>\n<div class=\"container\">\n\t<div class=\"row justify-content-center\">\n\t\t<div class=\"col-lg-8\">\n\t\t\n\t\t\t<nav>\n\t\t\t\t<ol class=\"cd-breadcrumb triangle custom-icons\">\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step1\">环境需求</a></li>\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step2\">填写数据信息</a></li>\n\t\t\t\t\t<li class=\"current\"><a href=\"?act=step3\">开始安装</a></li>\n\t\t\t\t\t<li class=\"current\"><em>安装完成</em></li>\n\t\t\t\t</ol>\n\t\t\t</nav>\n\t\t</div>\n\t\t<div class=\"col-lg-7\">\n\t\t\t<div class=\"progress my-5\">\n\t\t\t\t<div class=\"progress-bar progress-bar-info progress-bar-striped active\" style=\"width: 100%;\">\n\t\t\t\t\t<div class=\"progress-value\">100%</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"row justify-content-center\">\n\t    <div class=\"col-lg-10\">\n\t        <div class=\"card\">\n\t            <div class=\"card-body\">\n\t\t\t\t\t<!--body-->\t\t\t\t\t\n\t\t\t\t\t<div class=\"card-title my-5 py-5\">\n\t\t\t\t\t\t<h3 class=\"pb10\">恭喜您，极致CMS的安装已经完成，网站上线要删除install文件夹</h3>\n\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"col-12\">\n\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t<div class=\"col-6\">\n\t\t\t\t\t\t\t\t\t<input class=\"btn btn-primary rounded btn-block py-2\" type=\"button\" onclick=\"location.href='<?php echo $admin_url;?>'\" class=\"button\" value=\"进入后台\">\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"col-6\">\n\t\t\t\t\t\t\t\t\t<input class=\"btn btn-success rounded btn-block py-2\" type=\"button\" onclick=\"location.href='/'\" value=\"打开首页\">\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t<!-- end -->\n\t            </div>\n\t        </div>\n\t    </div>\n\t</div>\n<?php include('footer.tpl');?>\n</body>\n</html>"
  },
  {
    "path": "readme.txt",
    "content": "﻿极致CMS 2.5.4 release\n更新时间：2024-12-16\n更新内容如下：\n1. 修复添加购物车错误问题\n2. 优化后台字段添加列表\n3. 优化上传文件重命名问题，支持开启关闭重命名\n4. 优化redis配置错误导致打不开问题\n5. 留言支持cookie存储，前台关闭session也可以提交表单\n6. 新增模板标签支持非系统表数据输出（筛选标签不支持）\n7. 新增定时发布功能，需要系统配置填写允许开启的模型表\n8. 开放CommonController控制器，让系统更加自由\n9. 安全加固加密前后台登录\n\n极致CMS 2.5.3 release\n更新时间：2024-09-17\n更新内容如下：\n1. 增加更新字段updatetime\n2. 增加检查点赞和收藏的功能\n3. 优化生成sitemap\n4. 增加英文语言包\n\n极致CMS 2.5.2 release\n更新时间：2024-08-25\n更新内容如下：\n1. 优化字段绑定和图库列表\n2. 图片本地可以配置里面控制\n3. 增加APP和Vue项目支持\n4. 修复https导致无法生成静态页面的问题\n5. 更换编辑器\n\n极致CMS 2.5.1 release\n更新时间：2024-02-26\n更新内容如下：\n1. 优化字段排序问题\n2. 优化栏目缓存\n3. 优化数据库备份\n4. 优化自定义字段\n5. 更换编辑器\n6. 修复水印功能\n7. 增加图片本地化处理\n\n极致CMS 2.5.0 release\n更新时间：2023-10-03\n更新内容如下：\n1. 解决并发问题\n2. 优化系统配置排序\n3. 区分前后台上传功能\n\n极致CMS 2.4.9 release\n更新时间：2023-08-25\n更新内容如下：\n1. 优化上传文件安全\n2. 优化图片水印文字水印\n3. 增加缩略图标题水印\n\n极致CMS 2.4.8 release\n更新时间：2023-03-20\n更新内容如下：\n1. 优化系统配置\n2. 优化批量生成栏目\n3. 修复sitemap格式\n\n极致CMS 2.4.7 release\n更新时间：2023-02-25\n更新内容如下：\n1. 优化上传文件后缀\n2. 修复字段类型问题\n3. 可完全自定义系统函数[conf/Functions.php]，写到 FunctionsExt.php 里面即可\n\n极致CMS 2.4.6 release\n更新时间：2023-02-23\n更新内容如下：\n1. 优化系统安全\n2. 字段增加绑定栏目类型\n\n极致CMS 2.4.5 release\n更新时间：2023-02-18\n更新内容如下：\n1. 百度编辑器安全问题\n2. 优化系统缓存\n\n极致CMS 2.4.4 release\n更新时间：2023-01-04\n更新内容如下：\n1. 优化生成xml网站地图功能\n2. 升级文件上传功能\n3. 优化备份数据库\n\n极致CMS 2.4.3 release\n更新时间：2022-11-19\n更新内容如下：\n1. 优化生成xml网站地图功能\n2. 修复友情链接查询报错\n3. 优化用户体验\n\n极致CMS 2.4.2 release\n更新时间：2022-11-13\n更新内容如下：\n1. 修复前台会员多图出错问题\n2. 修复新增字段报错\n3. 修复layui图片不能选择icon、webp的bug\n4. 加强数据安全措施\n\n极致CMS 2.4.1 release\n更新时间：2022-10-23\n更新内容如下：\n1. 优化自定义字段功能\n2. 优化标题重复检测功能\n3. 修复碎片化时间过期不失效问题\n4. 修复评论中加评论不显示问题\n\n极致CMS 2.4.0 release\n更新时间：2022-09-29\n更新内容如下：\n1. 优化部分系统配置\n2. 优化代码结构，去除无用配置\n\n极致CMS 2.3.9 release\n更新时间：2022-09-25\n更新内容如下：\n1. 优化后台留言详情模板\n2. 优化前台ajax显示字段\n3. 修复后台留言回复字段不显示问题\n4. 优化新增栏目时的字段绑定\n5. 优化前台表单字段显示\n\n极致CMS 2.3.8 release\n更新时间：2022-08-30\n更新内容如下：\n1. 取消自定义模块标题重复检测\n2. 优化后台模板列表样式\n3. 修复前台用户头像上传问题\n4. 优化前台会员注册\n\n极致CMS 2.3.7 release\n更新时间：2022-08-24\n更新内容如下：\n1. 修复公共页数据问题\n2. 增加列表推荐属性筛选功能\n\n极致CMS 2.3.6 release\n更新时间：2022-08-18\n更新内容如下：\n1. 修复公共主页数据错误\n2. 修复后台获取内容第一张图片失效问题\n3. 优化模板列表\n\n极致CMS 2.3.5 release\n更新时间：2022-08-10\n更新内容如下：\n1. 加固数据安全\n2. 修复公共主页数据错误\n\n极致CMS 2.3.4 release\n更新时间：2022-08-04\n更新内容如下：\n1. 删除多余代码\n2. 优化微信扫码登录\n3. 优化模型发布时间\n4. 安全加固\n\n极致CMS 2.3.3 release\n更新时间：2022-07-28\n更新内容如下：\n1. 优化前台会员收藏和点赞删除的内容\n2. 优化支付宝H5支付\n3. 优化自定义字段创建默认小写字母\n4. 优化后台列表按钮用户体验\n\n极致CMS 2.3.2 release\n更新时间：2022-07-20\n更新内容如下：\n1. 修复商品取消属性不成功的问题\n2. 优化配置项\n3. 优化数据库备份类\n4. 修复后台评论安全问题\n5. 修复模板嵌套不解析问题\n\n极致CMS 2.3.1 release\n更新时间：2022-07-13\n更新内容如下：\n1. 修复系统配置自定义编辑器出错\n2. 修改回收站存储格式为序列化存储\n3. 优化手机号正则验证\n4. 检查标题重复\n\n极致CMS 2.3.0 release\n更新时间：2022-07-05\n更新内容如下：\n1. 修复会员中心会员信息字段重复问题\n2. 优化系统配置功能，允许配置到菜单\n3. 新增配置栏目功能\n4. 去除关于javascript的过滤\n\n极致CMS 2.2.9 release\n更新时间：2022-06-30\n更新内容如下：\n1. 修复内容模型切换栏目无法更新字段的问题\n2. 优化会员模块和留言模块\n3. tags前台增加hits字段\n4. 会员中心更换jquery版本\n5. 优化模型创建时间字段\n6. 去掉前台PHP版本标识\n7. 前台禁止操作管理员相关表\n\n极致CMS 2.2.8 release\n更新时间：2022-06-16\n更新内容如下：\n1. 优化代码，去除多余代码\n2. 修复安装时后台地址错误问题\n3. 导航模块增加图片\n4. 优化后台管理员角色权限\n\n极致CMS 2.2.7 release\n更新时间：2022-06-02\n更新内容如下：\n1. 优化网站地图生成页面\n2. 增加评论安全\n\n极致CMS 2.2.6 release\n更新时间：2022-05-27\n更新内容如下：\n1. 优化自定义URL\n2. 解决筛选异常报错\n\n极致CMS 2.2.5 release\n更新时间：2022-05-19\n更新内容如下：\n1. 修复百度编辑器无法保存微信图片问题\n2. 修复个别字段类型修改错误问题\n3. 优化后台入口地址报错问题\n\n极致CMS 2.2.4 release\n更新时间：2022-05-12\n更新内容如下：\n1. 后台留言权限修复\n2. tags代码优化\n3. 搜索模板优化\n4. 修复二级评论时间问题\n5. 优化分页\n\n极致CMS 2.2.3 release\n更新时间：2022-05-04\n更新内容如下：\n1. 增加自定义模块批量修改推荐属性\n2. 增加删除评论时减少评论统计数\n3. 发布一个免费小程序\n\n极致CMS 2.2.2 release\n更新时间：2022-04-28\n更新内容如下：\n1. 修复收藏点赞功能问题\n2. 修复个人中心收藏点赞计算错误问题\n3. 优化layui表格修改时HTML转译的问题\n\n极致CMS 2.2.1 release\n更新时间：2022-04-21\n更新内容如下：\n1. 修复前台购买记录分页错误\n2. 修复后台回收站列表无法设置每页条数\n3. 新增tags能够记录相关栏目，可以根据栏目输出tags\n4. 新增回收站删除标记\n\n极致CMS 2.2.0 release\n更新时间：2022-04-14\n更新内容如下：\n1. 修复模板评论上一页下一页无法翻页问题\n2. 修复收藏删除功能\n3. 优化自定义字段样式\n4. 新增单入口功能，同时兼容多入口\n5. 做单入口功能兼容\n> 单入口：进入前后台都通过`index.php`，也可以通过自定义入口文件进行指定，默认后台地址：`/index.php/admins` 在 `index.php` 里面可以修改 `admins` 后台模块标识\n\n极致CMS 2.1.4 release\n更新时间：2022-04-08\n更新内容如下：\n1. 修复后台会员列表时间查询没有效果\n2. 修复前台收藏列表的删除链接错误\n3. 优化后台模型新增修改预览效果显示问题\n4. 增加栏目全局递归的控制，优化加载速度\n\n极致CMS 2.1.3 release\n更新时间：2022-03-31\n更新内容如下：\n1. 前台发布模型限制\n2. 修复后台测试扩展类\n3. 美化支付页面\n4. 修复首页loop分页第一页链接错误问题\n5. 优化多选绑定\n6. loop增加notlike查询\n7. 优化后台模板列表\n8. 优化会员分组模板及扩展字段显示\n9. 优化后台插件列表操作提示\n\n极致CMS 2.1.2 release\n更新时间：2022-03-24\n更新内容如下： \n1. 优化点赞功能   \n2. 优化后台模板缓存数据   \n3. 修复前台多选绑定不显示\n4. 修改扩展模型字段列表排序  \n5. 修复后台商品列表审批错乱  \n\n极致CMS 2.1.1 release\n更新时间：2022-03-17\n更新内容如下： \n1. 优化分页功能   \n2. 优化网站地图  \n3. 优化错误提示   \n4. 优化关联字段显示   \n5. 修复后台模型是否显示预览功能   \n\n极致CMS 2.1.0 release\n更新时间：2022-03-10\n更新内容如下：  \n1. 修复自定义模型自定义模板无法找到的问题   \n2. 修复系统配置web_js无法显示问题   \n3. 优化安装细节  \n4. 修复单页模型自定义模板无法找到问题   \n5. 优化搜索模板兼容问题   \n6. 优化后台管理员模板   \n7. 修复自定义字段小数创建不了问题   \n8. 修复后台友情链接模板   \n\n极致CMS 2.0.9 release\n更新时间：2022-03-03\n更新内容如下：  \n1. 修复管理员栏目权限问题   \n2. 修复模板变量换成全局变量   \n3. 修复article表molds默认值为article   \n4. 修复用户公共页   \n5. 兼容PHP5.6版本   \n6. 修复编辑器不能下载远程图片的问题    \n7. 修复模型列表排序   \n8. 优化缩略图代码   \n9. 优化手机号验证代码   \n\n极致CMS 2.0.8 release\n更新时间：2022-02-24\n更新内容如下：\n1. 修复新增模型推荐属性类型问题\n2. 修复留言验证码后台设置无效问题\n3. 修复后台栏目角色权限设置无效问题\n4. 优化前台控制器代码\n5. 优化日志记录问题\n6. 修复模板部分不显示问题\n7. 修复扩展文件未引入问题，兼容多种情况\n8. 去除栏目.html模板名过滤问题，兼容.html和自定义后缀\n9. 修复后台评论修改提交报错问题\n\n极致CMS 2.0.7 release\n更新时间：2022-02-17\n更新内容如下：\n1、修复tags显示问题\n2、优化系统配置点击复制功能\n3、修复前台用户发布问题\n4、修复推荐属性输出问题\n5、修复桌面设置问题\n6、修复插件列表显示问题\n\n极致CMS 2.0 release\n更新时间：2022-02-01\n更新内容如下：\n1.优化后端模板\n2.增加后台安装模板模块\n3.所有字段列表可以控制显示\n4.多模块搜素可以指定字段\n5.增加副栏目功能\n6.自定义模型前台发布可以后台控制\n7.文章/商品模型获取缩略图、tags和简介截取字段内容功能界面可以控制\n8.网站地图生成，取消前台生成sitemap，只后台生成\n9.前端编辑器设置\n10.回收站\n11.栏目权限控制\n12.支持定义搜索不同模型不同结果页（全局搜索除外）\n13.模块列表设置排序，字段管理设置是否显示\n14.收藏点赞重构，增加两个表likes和shouchang\n15.编辑器相对路径图片\n16.缓存时间设置问题进行了优化\n17.【已修复】自定义链接更改栏目的时候没有同步更改数据\n18.用户头像固定格式存储，覆盖方式\n19.置顶推荐热点等功能可以创建，增加了attr推荐属性表，原来的ishot,istuijian,istop字段已废弃，但是前台loop参数依旧可用\n20.内链用新表，不要放到tags里面，增加了chain表\n21.前台自定义模型发布内容有问题。自定义模型可以后台设置\n22.栏目权限问题，可以选择多个\n23.栏目排序已修复\n24.评论点赞数类型换成int\n25.【已修复】内容评论字符串小图标问题\n26.【已修复】微信H5支付问题\n27.安装进度条优化，完成后将进度条隐藏\n28.系统配置增加了自定义配置栏问题\n29.桌面设置重新处理，可以单独设置菜单的名称\n30.增加了后台模板自定义配置的文件格式，可以自动调用自定义模板\n31.增加了插件接口及模板接口自定义，可自由接入不同的供应商插件和模板接口\n32.更换了layui框架版本v2.6.8，将后台的layui转移到了static/common/layui下面\n33.调整系统目录结构\n\n极致CMS Beta1.9.5\n更新时间：2021-04-26\n更新内容如下：\n修复：后台管理安全问题\n修复：开启httponly\n修复：数据库备份大小计算不准确\n修复：后台错误返回页叠加问题\n修复：json数据返回中文乱码问题\n修复：前台邀请注册无效及增加积分出错问题\n修复：loop缓存设置失效问题\n\n极致CMS Beta1.9.4\n更新时间：2021-03-09\n更新内容如下：\n修复：静态HTML生成问题\n修复：导航缓存问题\n修复：管理员列表分页数无法设置\n优化：session缓存时间\n优化：404页面返回404状态\n优化：模块中设置栏目不是必选，字段可以在全局栏目使用\n优化：栏目模板可以手动填写\n优化：图集多附件字段默认text类型\n新增：后台角色可以设置发布审核\n\n极致CMS Beta1.9.3\n更新时间：2021-01-10\n更新内容如下：\n修复：后台订单计算错误问题\n修复：面包屑导航错误\n修复：立即支付积分钱包计算\n修复：碎片化时间计算错误\n修复：系统设置个别配置设置错误\n修复：其他管理员会员分组无法看见\n修复：微信支付提交模板错误\n修复：字段列表全部显示错误\n修复：多图字段左右排序错误\n修复：静态HTML生成时分页链接错误\n优化：插件安装及列表\n优化：字段列表去除分页，过滤栏目\n优化：自定义导航太多而溢出问题\n优化：自定义图片截取\n优化：入口文件错误提示\n优化：删除大量重复代码\n优化：栏目数据缓存\n优化：后台可预览未审核的内容\n优化：普通管理员不能查看超级管理员登录记录\n优化：栏目缓存\n新增：对模板助手插件内置函数支持\n新增：可以设置js更新点击量\n新增：可自定义设置后台主页模板\n新增：支持PHP8\n新增：分页可以使用$currentpage输出当前页码\n\n极致CMS Beta1.9.2\n更新时间：2020-12-02\n更新内容如下：\n修复：多模块搜索缺少litpic字段\n修复：sqlite后台管理员无法编辑修改\n修复：生成静态无法清理文件夹\n修复：取消关注失败，计算关注数不对\n修复：个人中心头像无法修改\n优化：栏目支持动态更改排序规则，分页不会出错\n优化：支持自定义模板存放目录\n优化：栏目列表按权限输出\n优化：后台导航增加删除按钮\n新增：留言支持列表，支持查看详情\n\n极致CMS Beta1.9.1\n更新时间：2020-11-18\n更新内容如下：\n修复：后台自定义模块tags无法修改的问题\n修复：桌面设置-新增的时候缺少栏目\n修复：自定义链接修改问题\n修复：后台验证码隐藏\n修复：自定义栏目URL无法生产静态HTML\n修复：关键词tags，中文逗号替换\n优化：自定义模块时间参数默认显示\n优化：新增模块想办法增加几个默认字段\n优化：loop自定义分页标识jzpage需要更改\n优化：检测插件安全目录\n优化：前台个人主页支持ID传输 如：/user/active/uid/[会员ID]\n新增：自定义字段增加动态多行输入\n\n极致CMS Beta1.9\n更新时间：2020-10-24\n更新内容如下：\n修复：友情链接权限\n修复：积分金币充值问题\n修复：面包屑导航错误\n修复：自定义路由错误\n修复：loop notempty查询问题\n修复：后台插件数据保存不能获取数据\n修复：购物车折扣错误\n修复：百度编辑器无法自动下载图片\n修复：百度编辑器多图上传bug\n修复：生成静态HTML时出错\n修复：后台无法下载插件问题\n修复：前台图集问题\n修复：后台录入英文不过滤空格\n优化：图形验证码\n优化：系统后台界面美化\n优化：百度编辑器图片按时间排序\n优化：系统配置加载太慢的问题\n优化：后台模板多余内容\n优化：前台搜索查询\n优化：前台tag查询\n优化：模板标签大小写不敏感问题\n优化：自定义模块栏目未选显示所有字段\n优化：分页页码输出\n优化：系统菜单功能文字\n优化：自定义路由?后面的参数加进来\n优化：后台搜索\n新增：图集可以进行排序\n新增：大数据碎片化\n新增：导航设置\n新增：系统配置增加单选开关及栏目选项\n新增：自定义缩略图功能\n新增：前台点击量可以JS处理\n新增：前台可以不登录点赞\n新增：支付宝当面付功能\n新增：网站可以跳过购物车直接购买\n新增：前台搜索相关字段可以后台控制\n新增：自定义模块可以添加TAG\n新增：前后台验证码可以关闭\n新增：桌面设置可以设置指定栏目到菜单\n\n极致CMS Beta1.8.1\n更新时间：2020-07-30\n更新内容如下：\n1、修复：前台自定义时间字段显示问题\n2、修复：编辑器视频无法编辑\n3、修复：批量删除时自定义URL未删除\n4、修复：多附件字段只能上传图片\n5、修复：前台注册后登录还跳到注册页面\n6、修复：系统配置release_table模板写错参数\n7、修复：支付宝支付回调检测错误\n8、修复：友情链接分类删除出错\n9、修复：tags表缺少member_id字段\n10、修复：系统配置统计代码过滤问题\n11、优化：友情链接权限分配\n12、优化：过滤参数规则\n13、优化：新增字段默认排序改为2\n14、优化：留言自定义字段根据栏目区分\n15、优化：订单内容可以修改自定义字段内容\n16、优化：更改系统数组分页逻辑\n17、新增：栏目可以设置关闭，关闭后前台不会显示也不能打开\n\n极致CMS Beta1.8\n更新时间：2020-06-30\n更新内容如下：\n1、修复：系统模板目录变更问题\n2、修复：删除前台支付多余代码\n3、修复：缓存域名唯一性\n4、修复：数据库恢复在Linux存在报错\n5、修复：自定义URL后面加参数报404错误\n6、修复：文章字数限制错误提示\n7、修复：官方模块默认模板\n8、修复：官方模板个人中心自定义图片字段无法上传的问题\n9、修复：官方自定义字段前台图片上传问题\n10、修复：微信支付宝支付存在的bug\n11、修复：修复分页列表数为0时报错问题\n12、修复：sqlite版本字段修改失败的问题\n13、修复：后台新增管理员字段报错\n14、修复：多处存在XSS漏洞\n15、优化：后台列表第一页与最后一页显示问题\n16、优化：后台订单总金额显示异常\n17、优化：数据库报错直接写入文件，不再显示页面\n18、优化：点赞收藏积分奖励\n19、优化：后台商品默认库存\n20、优化：API数据插件增加发布和更新\n21、新增：栏目SEO标题\n22、新增：前台发布模块限制\n23、新增：根目录robots\n24、新增：QQ登录插件加入邮箱验证\n25、新增：栏目列表增加发布快捷键\n26、新增：前台模板标签loop增加分页标识\n27、新增：独立友情链接模块，并增加友情链接分类\n\n极致CMS Beta1.7.1\n更新时间：2020-05-25\n更新内容如下：\n1、修复：开启层级URL后，自定内容URL报404\n2、修复：检查默认字段是否存在\n3、修复：栏目列表，新增下级栏目，无法关联上级\n4、修复：后台列表修改退回选项\n5、修复：前台发布数据库报错\n6、修复：foreach计数时{foreach $list as $v} $v与}不能隔开\n7、修复：后台栏目修改时，单页无法自动读取模板\n8、修复：管理员回复评论后台编辑框丢失\n9、修复：管理员回复不能通知前台用户\n10、修复：后台栏目新增字段，新增栏目时不能直接显示字段\n11、修复：新增自定义配置后，前台{$webconf}不能立即调用\n12、修复：留言/评论数限制问题\n13、修复：微信登录注册bug\n14、修复：系统支付功能\n15、修复：Screen标签View.php里面变量参数bug\n16、修复：后台商品列表无法筛选子栏目\n17、修复：前台发布提交相关问题\n18、修复：验证码兼容大小写\n19、修复：时间字段筛选不准确\n20、优化：新增时间插件会无法选择时间\n21、优化：后台子管理员创建角色可以选择角色\n22、优化：去除安装时的修改后台文件名\n23、优化：自定义模块编辑内容的时候栏目被编辑器挡住\n24、优化：后台首页换一个列表\n25、优化：系统兼容php7.4\n26、优化：前台注册随机用户名，取消手机号作为用户名\n27、新增：栏目修改也增加提示是否取消\n28、新增：后台插件列表插件所属平台、插件搜索功能\n29、新增：新增字段能列表更改排序\n30、新增：前台邀请注册送奖励\n31、新增：前台注册可以后台关闭\n32、新增：前台注册仅限通过邀请链接进入注册\n33、新增：其他平台支付接入点\n34、新增：系统配置-增加手机号码、微信二维码\n35、新增：系统模板目录可更改\n36、新增：管理员模块按照分组输出扩展字段\n37、新增：栏目增加关闭及批量处理功能\n38、新增：分离编辑器，可扩展自定义编辑器\n39、新增：图集/多附件增加文字描述\n40、新增：桌面设置增加复制功能\n41、新增：默认模板里增加tags相关页面\n42、新增：loop增加sql参数，参考帮助文档了解使用\n\n极致CMS Beta1.7\n更新时间：2020-04-28\n更新内容如下：\n1、修复：后台订单支付状态修改无效\n2、修复：前台不显示充值钱包记录\n3、修复：商品库存下单不减少\n4、修复：评论后台管理员无法回复\n5、修复：ArrayPage修复next下一页链接\n6、修复：自定义模块列表分页不受控制\n7、修复：人性化时间显示问题\n8、修复：新建栏目字段绑定会失效\n9、修复：前台上传的图片没有记录文件后缀\n10、修复：个人中心发布内容扩展信息无法记录\n11、修复：去掉富文本截屏插件\n12、修复：后台充值分页错误\n13、修复：核心文件中配置读取有错误\n14、修复：后台用户删除没有写返回\n15、修复：后台评论栏目显示不全\n16、修复：前台message ajax提交返回code=1为success\n17、修复：顶部导航点击菜单不能新增tab\n18、修复：后台列表分页数量设置无效\n19、修复：新增模块列表未固定右侧编辑菜单\n20、优化：插件模块\n21、优化：系统配置模板可以下拉选择\n22、优化：系统模块不允许修改模块标识\n22、优化：批量新增栏目更改形式\n23、优化：友情链接、TAG可以不受栏目权限限制\n24、优化：错误信息提示隐藏路径问题\n25、优化：更改系统文件上传处理\n26、优化：统一配置输出，原$customconf依旧可以使用\n27、优化：前台栏目发布检测分类授权\n28、优化：商品表增加molds字段\n29、优化：后台提交按钮部分页面浮动\n30、优化：后台内容修改取消自动跳转\n31、优化：sqlite版本链接数据库换用sqlite3\n32、优化：文章商品简介过多提示修改\n33、优化：静态HTML生成\n34、优化：后台从内容获取简介优化去除空格\n35、优化：后台编辑器转为static/common/user/uedit\n36、优化：自动生成静态html\n37、优化：系统生成缓存的方法\n38、新增：关闭网站功能，关闭页面模板static/common/close.html\n39、新增：自定义配置增加编辑器\n40、新增：模块增加默认模板\n41、新增：可控制栏目绑定模块\n42、新增：可控制栏目是否受权限限制\n43、新增：可控制栏目是否在该模块显示\n44、新增：可控制栏目是否必选\n45、新增：foreach标签加计数器\n46、新增：可控制栏目是否在该模块显示\n47、新增：上传文件目录更改，富文本编辑器上传需手动更改\n48、新增：loop模板标签增加in字段，可范围内查询，支持变量\n49、新增：增加ajax数据获取的安全性，后台可关闭\n50、新增：增加字段安全性，可针对新增字段进行设置前台ajax获取权限\n51、新增：文章/商品/自定义模块详情页均可自定义URL\n52、新增：文章/商品/自定义模块详情页均可添加外链\n53、新增：前台敏感词提示\n54、新增：sitemap动态生成\n55、新增：增加rss订阅，访问：http://域名/home/rss\n56、新增：栏目列表页排序增加多种形式\n57、新增：栏目列表页排序前台可提交对应的形式参数(orders:1~7)值进行动态设置\n58、新增：新增模块增加多个默认字段[addtime:新增时间 hits:点击数 istop:是否置顶 target:外链 ownurl:自定义URL]\n59、新增：默认字段不允许删除，可进行隐藏\n60、新增：管理员角色组模块加上是否受栏目权限控制\n61、新增：管理员列表加上所属角色组\n62、新增：搜索页面数量控制，只需要提交参数时加上limit参数即可设置列表数\n63、新增：栏目URL后缀.html可以去掉[系统设置-高级设置]\n\n极致CMS Beta1.6.7\n更新时间：2020-03-26\n更新内容如下：\n1、修复：内容页下一篇上一篇问题\n2、修复：后台评论修改返回json\n3、修复：前台提交的内容审核时报错\n4、修复：前台发布退回改为未审核\n5、修复：前台用户信息提醒页面\n6、修复：本地自定义插件后台未引入\n7、修复：后台创建用户分组时报错(sqlite)\n8、修复：解决服务器多文件部署上传图片根目录问题\n9、优化：引入模板文件报错提示\n10、优化：后台个人信息修改页面\n11、优化：前台登录返回登录的地方\n12、优化：前台订单删除增加安全过滤\n13、优化：前台评论删除增加安全过滤\n14、优化：个人中心页面\n15、优化：优化分页\n16、优化：更改系统报错等级\n17、优化：安装指引\n18、优化：栏目模板选择\n19、新增：后台LOGO系统配置项\n\n极致CMS Beta1.6.6\n更新时间：2020-03-07\n更新内容如下：\n1、修复扩展字段小数类型bug\n2、修改模板缓存文件名为32位字符串\n3、兼容links模块中url存在而导致链接覆盖的问题\n4、修复前台留言无法获取扩展字段问题\n5、修复前台ArrayPage数组分页类分页错误\n6、实现后台插件列表在线下载安装插件\n7、增加前台后台录入内容安全过滤\n*8、sqlite版本修复内容样式无法保存的bug(实际上保存了，显示的时候有问题)\n\n极致CMS Beta1.6.5\n更新时间：2020-02-15\n更新内容如下：\n1、修复M函数传递表名问题\n2、修复新增字段前台显示必选字段未验证问题\n3、新增后台栏目权限设置，可以给管理员分组设置允许访问的栏目\n\n极致CMS Beta1.6.4\n更新时间：2020-01-02\n更新内容如下：\n1、修复手机模式下，后台首页提示报错\n2、修复插件文件夹存在zip压缩包报错\n3、修复后台定时器，保持后台session持续\n4、修复后台留言详情页，提交时ip被修改的错误\n5、修复后台模板风格-原始-关闭阴影点击触发关闭窗口\n6、修复数据库新增内容的时候，不能录入空而导致无法新增的bug\n7、更改hook方式，防止数据库反斜杠丢失带来错误\n8、取消U方法首字母大写转换，按原字母大小写\n9、截取字符串的时候，将&nbsp;空格过滤\n10、增加动态访问链接实现\n11、修复empty和notempty不处理null的问题\n12、修复loop中like查询，并增强like查询，支持格式：like='字段|关键词'，like='字段1|关键词1,字段2|关键词2'，like='字段1|变量1'，like='字段1|变量1,字段2|变量2'，like='字段1|关键词1,字段2|变量'\n13、loop可以使用limit从第几条开始输出，如：limit=\"1,10\",输出10条，从第2条开始输出，需要注意一点，limit=\"开始数,输出条数\"，数据库是从0开始计数的，也就是从第一条输出是这样的：limit=\"0,10\"\n14、修复开启层级URL后，栏目修改父类时，子栏目URL不更改\n15、修改模板错误提示，去除绝对模板路径，只显示相对模板路径\n16、loop标签新增一个day参数，按天调用数据，如：最近1天、3天、7天这种调用，可以{loop xxx day=\"1\" as=\"$v\"}【该方法由群友分享，昵称：MingTian】\n17、修复栏目新增字段绑定bug，栏目页面没有新增字段显示问题\n18、修复插件模块Home/plugins/HomeController->jizhi无效的bug\n19、备份数据库列表不再显示副本\n20、修复数据库导入副本顺序错误问题\n21、修复tags分页及系统Page分页类优化\n22、数组分页类增加自定义分页输出\n23、多模块搜索和tags标签增加pagelist分页数组参数，可自定义输出分页\n24、后台增加$classtypedata全局栏目\n25、loop循环支持省略table参数，但必须同时要填写tid数值，tid可以写多个，但以第一个数值的栏目绑定模块为主。支持：{loop tid=\"2\" isshow=\"1\" as=\"v\"}、{loop tid=\"2,3,4\" isshow=\"1\" as=\"v\"}（table默认为栏目id=2的模块）、{loop tid=\"$tid\" isshow=\"1\" as=\"v\"}（如果$tid为一个栏目ID数值）\n26、修改清除静态文件按钮的颜色\n27、修改网站上传大小限制，后台设定的大小单位为MB\n28、修改上传文件功能，修改pictures表字段\n30、增强缓存文件安全性\n31、新增上传图片水印功能\n32、增强系统安全\n33、修复loop标签字符串变量传递报错问题\n34、丰富完善个人中心模块（特别感谢：舒彬琪1651978720 提供的个人中心模板）\n35、增加二级目录可执行功能\n\n极致CMS Beta1.6.3\n更新时间：2019-11-25\n更新内容如下：\n1、调试模式开关增加到后台系统配置\n2、留言审核及评论审核权限增加到后台系统配置\n3、文章/商品/留言/评论/自定义 五个模块增加批量审核功能\n4、文章/商品/留言/评论/自定义 五个模块列表增加自适应屏幕界面美化（导出功能也美化下）\n5、文章模块增加敏感词检测（标题，SEO标题，关键词，内容，简介），敏感词增加到系统配置\n6、文章/商品 模块增加快速修改标题功能\n7、自定义字段（select）增加输入检索功能，美化用户体验\n8、修复支付页面提交缺少提交数据的HTML模板demo页\n9、优化后台首页\n10、修复管理员后台点击分组报错问题\n11、修复数据库导出可能出现乱码bug\n12、去除前台推荐属性置顶的全局置顶\n13、美化后台界面\n14、优化后台图片管理删除不存在的文件导致报错问题\n15、增加统计点赞(jz_zan)收藏(jz_collect)的函数\n\n极致CMS Beta1.6.2\n更新时间：2019-11-13\n更新内容如下：\n1、修复栏目跳转链接修改时为空的bug\n2、更改推荐属性字段类型为varchar\n3、修复get_domain有时候ssl无法判断的bug\n4、修复层级分类栏目的小bug\n5、修改字段的时候，关联栏目数值未赋值的bug\n6、修改插件的用户权限审核,多处文件修改\n7、自动更新静态时，首页报错的bug\n8、修复后台无法创建管理员账户的bug\n9、修复手机模式栏目URL出错的bug\n10、增强数据库数据承受能力及更新静态HTML时导致内存溢出的bug\n11、修复数据库备份太多数据出错的bug\n12、修复安装程序时出现数据库乱码的bug\n13、修复安装时候填入账号密码无效的bug\n14、修复session存储文件夹不存在导致的错误\n15、FrPHP框架默认配置删除多余字符\n16、新增tags详情输出\n17、新增用户中心发布文章模块\n18、新增安装cms时，可以自动创建数据库\n19、修复拉栏目缓存问题\n20、去除文章模块和商品模块的全局置顶\n21、修复新增后台桌面时设置不生效的bug\n22、修改关联字段格式化数据显示\n\n极致CMS Beta1.6.1\n更新时间：2019-10-19\n更新内容如下：\n1、去除多余InnoDB,有时候会导致数据库导入出错\n2、修复留言json返回状态码code错误\n3、修复ajax登录可能出现Notice:Undefined index:return_url错误\n4、修改插件列表提示语\n5、修改网站多域名绑定模板插件中模板显示不全问题，更改为手动填写\n6、修复loop循环classtype表嵌套其他表循环时URL出错\n7、增强TAG标签功能。\n\t* 文章模块和商品模块发布时可以填写tags标签\n\t* 前台具有标签聚合功能，标签聚合页tags.html，标签详情页tags-details.html，存放路径跟模板中主页index.html同级\n\t* 标签控制器Home/TagsController.php\n\t* 标签列表跟栏目列表页一样，数据数组是$lists，默认每页数据是100条，可以在控制器中手动修改，建议tags.html中{fun dump($pages)}了解分页结构，也可以在扩展类FrPHP/Extend/ArrayPage.php中修改你想要的分页结构\n8、修复自定义页面有时候无法正确读取的问题\n9、美化自定义图集字段模板界面\n\n极致CMS Beta1.6\n更新时间：2019-10-10\n更新内容如下：\n1、修改后台列表为数据表格\n2、加强生成静态文件功能，可以分别生成手机端和电脑端静态文件，可以自动生成静态文件\n3、新增插件-系统API接口，实现API数据查询\n4、新增插件-独立静态网站，生成独立静态网站，更加安全可靠！\n5、美化后台界面，搜索栏可折叠\n6、加强后台管理员权限分配功能\n7、新增文章/商品模块置顶、推荐、热点三个内容属性\n8、新增URL层级格式，新增栏目的时候自动添加层级，修改的时候会显示所有层级URL\n9、新增扩展字段内容显示权限控制，可以在基础信息下显示扩展信息\n10、新增缓存页面功能控制，可关闭以保证空间容量\n11、修改前台缓存页面格式，增加安全性\n12、修复新增桌面时前端js效果错误\n13、新增自定义单页，将单页文件放置在模板内的page文件夹内，文件名即为访问链接\n14、新增系统配置中高级配置、邮箱订单、支付配置、公众号绑定等权限设置\n15、添加Blog桌面配置、基础建站桌面配置供大家参考\n\n极致CMS Beta1.5.2\n更新时间：2019-09-28\n更新内容如下：\n1、修复筛选字段bug\n2、添加上传文件后缀限制\n3、新增推荐属性功能\n4、修复产品新增的时候，弹出窗口点击确认会跳转到错误页面的bug\n5、修复栏目新增字段不受绑定栏目控制的bug\n6、增加栏目外链功能\n7、美化前台上传图片样式，修复多图上传删除按钮失效bug\n8、增加js方法帮助删除自定义上传图片\n9、美化自定义上传图片样式\n10、删除栏目的时候没有判断子栏目是否存在\n11、修复由于开启缓存导致ajax=1不返回json数据\n12、修复批量添加栏目的时候没有限制隐藏模块,修复新增字段fieldtype=12时筛选未起作用\n13、修复screen筛选链接出错问题\n14、修复由于github打包存在空文件不打包而导致程序执行错误问题\n15、修复缓存获取的时候文件找不到\n16、解决install检测出不符合安装的条件还能继续安装，新增栏目、轮播图分类列表notice错误，系统设置扩展字段不能上传图片bug\n17、修复轮播图不能修改扩展字段内容bug\n18、新增系统配置网站SEO网址，便于SEO优化\n19、修复修改详情时导致用户权限消失，优化功能\n\n极致CMS Beta1.5\n更新内容如下：\n1、修复修改字段时无法更改字段内容bug\n2、修改loop循环的时候page分页链接去除.html后缀\n3、修复前台获取自定义字段有的字段没有被获取到\n4、修复loop循环中$type['id']时报错\n5、修复个人中心订单及评论数错误显示\n6、新增字段增加关联模块类型，并修复新增字段时提示偶然错误bug[FieldsController.php]\n7、修复安装时出现缓存文件夹不存在和数据库未创建而直接连接数据库导致的错误\n8、美化textarea及修复新增字段bug\n9、修复新增字段编辑器类型不显示bug\n10、修复登录的时候如果没有HTTP_REFERER提示的Notice\n11、修复后台新增用户没有用户分组选项\n12、修复修改详情时导致用户权限消失，优化功能\n13、修复详情页上一页下一页输出问题\n14、配置文件新增domain网站SEO网址\n15、安装数据库添加v1.5版本及相关sql\n\n极致CMS Beta1.4\n更新内容如下：\n1、格式化时间显示\n2、新增前台留言模块增加验证码插件\n3、新增后台模板编辑插件\n4、自定义文章/产品详情url\n5、自定义模块新增isshow默认字段，判断是否显示内容，修复前台不显示内容也显示的bug\n6、支付模块修复bug\n\n极致CMS Dev1.3\n更新功能如下：\n1.修改A/t/tpl/welcome.html里的系统版本\n2.修改GetIP方法更换，以兼容7.1和7.2有时报错问题\n3.新增配置文件信息数据库sysconfig，存储配置，去除Conf/webconf.php和Conf/custom.php\n4.新增字段，默认值填写\n5.后台模板部分美化\n6.栏目增加模板文件默认值\n7.插件功能升级，增加hook表作为插件注册事件\n8.批量创建栏目\n9.loop加notempty，empty筛选\n10.栏目loop的url问题\n11.修复栏目当前位置$positions出现输出多个栏目问题\n12.修复扩展模块分页出错问题\n13.修复后台标签错误输出\n14.修复前台评论接收自定义字段参数内容\n15.数据备份存储加安全代码\n16.数据存储加安全代码\n17.修复系统控制器访问404页面错误处理\n18.修改配置文件Config/db.config.php为Config/config.php，可以更灵活,多配置\n19.自定义字段增加radio选项类\n20.多语言功能（通用型）\n21.域名绑定模板功能\n22.重写session存储及增加redis存储session[备用]\n23.支付功能完善 (已完善支付宝支付)\n24.安装步骤优化\n25.增强文件安全\n26.自动内链\n27.静态文件生成\n28.网站地图生成\n29.数据库表中默认值，注册用户的时候出现字段缺少默认值的情况\n30.新增字段时，已存在的表内字段提示已有字段\n\n极致CMS Dev1.2\n更新时间：2019-08-24\n1.删除可疑文件  FrPHP/Extend/wechat.php\n2.修复插件列表不显示新增插件问题【手动修复,复制新系统里面的A/c/PluginsController.php覆盖一下】\n\n极致CMS Dev1.1\n更新时间：2019-08-23 23:45\n1.修复目录中空数据库包db.sql存在gbk编码问题"
  },
  {
    "path": "robots.txt",
    "content": "User-agent: *\nDisallow: \nDisallow: /app/\nDisallow: /backup/\nDisallow: /cache/\nDisallow: /frphp/\nDisallow: /install/\nDisallow: /conf/\n"
  },
  {
    "path": "static/cms/404.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"vn\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <title>404找不到页面</title>\n    <meta\n      name=\"description\"\n      content=\"Bunzo is one of the most popular blog template\"\n    />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <meta\n      name=\"robots\"\n      content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\"\n    />\n    {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n        <div class=\"error-404-area\">\n          <div class=\"container\">\n            <div class=\"row\">\n              <div class=\"col-lg-12\">\n                <div class=\"error-404-content text-center\">\n                  <div class=\"banner wow fadeInUp\" >\n                    <img src=\"{$tpl}static/picture/error-404.png\" alt=\"\" />\n                  </div>\n                  <div class=\"error-text wow fadeInUp\" >\n                    <h5>This Page is Not Found.</h5>\n                    <h2>很抱歉，找不到此页。</h2>\n\n                    <div class=\"button-box mt-30 wow fadeInUp\">\n                      <a href=\"/\" class=\"btn-large btn-primary\"\n                        ><i class=\"icofont-long-arrow-left mr-2\"></i> 返回首页\n                      </a>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"error-area-shap\">\n            <img src=\"{$tpl}static/picture/error-shap.png\" alt=\"\" />\n          </div>\n        </div>\n      </div>\n    </div>\n\n    {include=\"footer\"}\n    {include=\"js\"}\n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/article/article-details.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"cn\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>{$jz['seo_title']}-{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"{$jz['keywords']}\" />\n\t<meta name=\"description\" content=\"{$jz['description']}\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n     {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n    <!-- breadcrumb-area start -->\n    <div class=\"breadcrumb-area\">\n      <div class=\"container\">\n        <div class=\"row\">\n          <div class=\"col-12\">\n            <div class=\"breadcrumb_box text-center\" >\n             \n              <ul class=\"breadcrumb-list\">\n                <li class=\"breadcrumb-item\"><a href=\"/\">首页</a></li>\n\t\t\t\t{foreach $positions_data as $v}\n\t\t\t\t{if($type['id']==$v['id'])}\n\t\t\t\t<li class=\"breadcrumb-item active\"><a href=\"{$v['url']}\">{$v['classname']}</a></li>\n\t\t\t\t{else}\n                <li class=\"breadcrumb-item \"><a href=\"{$v['url']}\">{$v['classname']}</a></li>\n\t\t\t\t{/if}\n\t\t\t\t{/foreach}\n\t\t\t\t\n              </ul>\n              \n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <!-- breadcrumb-area end -->\n\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n        <!-- Blog Details Wrapper Start -->\n        <div class=\"blog-details-wrapper section-space--ptb_80\">\n          <div class=\"container\">\n            <div class=\"row row--17\">\n              <div class=\"blog-details-col-8\">\n                <!-- blog details Post Start -->\n                <div class=\"blog-details-post-wrap\">\n                  <div class=\"blog-details-thum\">\n                    <img src=\"{$jz['litpic']}\" alt=\"{$jz['title']}\" />\n                  </div>\n                  <div class=\"blog-details-post-content\">\n                    <div class=\"blog-details-meta-box\">\n                      <div class=\"post-meta-left-side mb-2\">\n                        <div class=\"trending-blog-post-category\">\n                          <a href=\"{$type['url']}\">{$type['classname']}</a>\n                        </div>\n                        <div class=\"following-blog-post-author\">\n                          {if(!$jz['member_id'])}\n                            By <a >{fun adminInfo($jz['userid'],'name')}</a>\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t    By <a href=\"/user/active/uid/{$jz['member_id']}\">{fun memberInfo($jz['member_id'],'username')}</a>\n\t\t\t\t\t\t  {/if} \n                        </div>\n                      </div>\n\n                      <div class=\"post-mid-side mb-2\">\n                        <span class=\"post-meta-left-side\">\n                          <span class=\"post-date\">\n                            <i class=\"icofont-ui-calendar\"></i>\n                            <a >{fun date('Y-m-d H:i:s',$jz['addtime'])}</a>\n                          </span>\n                        </span>\n                        <span id=\"read-num\">热度 {$jz['hits']}</span>\n                      </div>\n\n                      <div class=\"post-meta-right-side mb-2\">\n\t\t\t\t\t    {if(checkCollect($type['id'],$jz['id']))}\n\t\t\t\t\t\t<a title=\"已收藏\" onclick=\"collect({$type['id']},{$jz['id']})\"\n                          ><img src=\"{$tpl}static/picture/collect.png\" alt=\"\"\n                        /></a>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<a title=\"点击收藏\" onclick=\"collect({$type['id']},{$jz['id']})\"\n                          ><img src=\"{$tpl}static/picture/small-bookmark.png\" alt=\"\"\n                        /></a>\n\t\t\t\t\t\t{/if}\n                        \n\t\t\t\t\t\t{if(checkLikes($type['id'],$jz['id']))}\n\t\t\t\t\t\t<a title=\"已点赞\" onclick=\"likes({$type['id']},{$jz['id']})\"\n                          ><img src=\"{$tpl}static/picture/zan.png\" alt=\"\"\n                        /></a>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<a title=\"点赞\" onclick=\"likes({$type['id']},{$jz['id']})\"\n                          ><img src=\"{$tpl}static/picture/heart.png\" alt=\"\"\n                        /></a>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/if}\n                        \n                      </div>\n                    </div>\n                    <h3 class=\"following-blog-post-title\">\n                      {$jz['title']}\n                    </h3>\n\n                    <div class=\"post-details-text\">\n                      {$jz['body']}\n                    </div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t{if($aprev)}\n\t\t\t\t\t<a  class=\"prevpage btn\" href=\"{$aprev['url']}\">上一篇：{$aprev['title']}</a>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{if($anext)}\n\t\t\t\t\t<a class=\"nextpage btn\" href=\"{$anext['url']}\">下一篇：{$anext['title']}</a>\n\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t\t\n                    <!-- Related Post Area Start -->\n                    <div class=\"related-post-area section-space--pt_60\">\n                      <div class=\"row\">\n                        <div class=\"col-lg-8 col-7\">\n                          <div class=\"section-title mb-30\">\n                            <h3 class=\"title\">相关文章</h3>\n                          </div>\n                        </div>\n                        <div class=\"col-lg-4 col-5\">\n                          <div class=\"related-post-slider-navigation text-end\">\n                            <div\n                              class=\"related-post-button-prev navigation-button\"\n                            >\n                              <i class=\"icofont-long-arrow-left\"></i>\n                            </div>\n                            <div\n                              class=\"related-post-button-next navigation-button\"\n                            >\n                              <i class=\"icofont-long-arrow-right\"></i>\n                            </div>\n                          </div>\n                        </div>\n                      </div>\n\t\t\t\t\t\n                      <!-- Swiper -->\n                      <div class=\"swiper-container related-post-slider-active\">\n                        <div class=\"swiper-wrapper\">\n\t\t\t\t\t\t{loop table=\"article\" notempty=\"litpic\" isshow=\"1\" tid=\"$jz['tid']\" isall=\"1\" orderby=\"rand()\" limit=\"4\" as=\"v\"}\n                          <div class=\"swiper-slide\">\n                            <!-- Single Following Post Start -->\n                            <div class=\"single-related-post\">\n                              <div class=\"related-post-thum\">\n                                <img src=\"{$v['litpic']}\" alt=\"{$v['title']}\" />\n                              </div>\n                              <div class=\"following-post-content\">\n                                <div class=\"following-blog-post-top\">\n                                  <div class=\"trending-blog-post-category\">\n                                    <a href=\"{$classtypedata[$v['tid']]['url']}\">{$classtypedata[$v['tid']]['classname']}</a>\n                                  </div>\n                                  <div class=\"following-blog-post-author\">\n                                      {if(!$v['member_id'])}\n\t\t\t\t\t\t\t\t\t\t作者 <a >{fun adminInfo($v['userid'],'name')}</a>\n\t\t\t\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t\t\t\t\t作者 <a href=\"/user/active/uid/{$v['member_id']}\">{fun memberInfo($v['member_id'],'username')}</a>\n\t\t\t\t\t\t\t\t\t  {/if} \n                                  </div>\n                                </div>\n                                <h5 class=\"following-blog-post-title\">\n                                  <a href=\"{$v['url']}\"\n                                    >{$v['title']}\n                                  </a>\n                                </h5>\n                                <div class=\"following-blog-post-meta\">\n                                  <div class=\"post-meta-left-side\">\n                                    <span class=\"post-date\"\n                                      ><i class=\"icofont-ui-calendar\"></i\n                                      ><a href=\"{$v['url']}\">{fun date('Y-m-d',$v['addtime'])}</a></span\n                                    ><span>热度 {$v['hits']}</span>\n                                  </div>\n                                  <div class=\"post-meta-right-side\">\n                                    {if(checkCollect($type['id'],$v['id']))}\n\t\t\t\t\t\t\t\t\t<a title=\"已收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\n\t\t\t\t\t\t\t\t\t  ><img src=\"{$tpl}static/picture/collect.png\" alt=\"\"\n\t\t\t\t\t\t\t\t\t/></a>\n\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t<a title=\"点击收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\n\t\t\t\t\t\t\t\t\t  ><img src=\"{$tpl}static/picture/small-bookmark.png\" alt=\"\"\n\t\t\t\t\t\t\t\t\t/></a>\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{if(checkLikes($type['id'],$v['id']))}\n\t\t\t\t\t\t\t\t\t<a title=\"已点赞\" onclick=\"likes({$v['tid']},{$jz['id']})\"\n\t\t\t\t\t\t\t\t\t  ><img src=\"{$tpl}static/picture/zan.png\" alt=\"\"\n\t\t\t\t\t\t\t\t\t/></a>\n\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t<a title=\"点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\n\t\t\t\t\t\t\t\t\t  ><img src=\"{$tpl}static/picture/heart.png\" alt=\"\"\n\t\t\t\t\t\t\t\t\t/></a>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{/if}\n                                  </div>\n                                </div>\n                              </div>\n                            </div>\n                            <!-- Single Following Post End -->\n                          </div>\n\t\t\t\t\t\t{/loop}\n                         \n                        </div>\n                      </div>\n                    </div>\n                  {include=\"comment\"}\n                  </div>\n                </div>\n                <!-- blog details Post End -->\n              </div>\n              <div class=\"blog-details-col-4\">\n\t\t\t\t{if($jz['member_id'])}\n                <div class=\"following-author-area\">\n\t\t\t\t\t{php\n\t\t\t\t\t$user = memberInfo($jz['member_id']);\n\t\t\t\t\t/}\n                  <div class=\"author-image\">\n                    <img src=\"{$user['litpic']}\" alt=\"{$user['username']}\" onerror=\"this.src='{$tpl}static/picture/author-01.png'\" />\n                  </div>\n                  <div class=\"author-title\">\n                    <h4><a href=\"/user/active/uid/{$user['id']}\">{$user['username']}</a></h4>\n                    <p>{$user['email']}</p>\n                  </div>\n                  <div class=\"author-details\">\n                    <p>\n                      {$user['signature']}\n                    </p>\n                    <div class=\"author-post-share\">\n                      <ul class=\"social-share-area\">\n                        {if($user['email'])}<li>\n                          <a href=\"mailto:{$user['email']}\"><i class=\"icofont-email\"></i></a>\n                        </li>\n\t\t\t\t\t\t{/if}\n                        <li>\n                          <a href=\"/user/active/uid/{$user['id']}\" target=\"_blank\"><i class=\"icofont-home\"></i></a>\n                        </li>\n                        \n                      </ul>\n                    </div>\n                    <div class=\"button-box\">\n                      <a href=\"/user/active/uid/{$user['id']}\" class=\"btn\"\n                        >查看主页<i class=\"icofont-long-arrow-right\"></i\n                      ></a>\n                    </div>\n                  </div>\n                </div>\n                {/if}\n\t\t\t\t<!-- Hero Category Area End --><!-- Latest Post Area Start -->\n                <div class=\"latest-post-inner-wrap mt-5\">\n                 \n                  {include=\"latestpost\"}\n       \n                \n                </div>\n            \n                \n\t\t\n                <!-- Stay In Touch Area Start -->\n                <div class=\"stay-in-touch-area mt-5\">\n                  <div class=\"section-title\">\n                    <h3>热门标签</h3>\n                  </div>\n                  <div class=\"stay-in-touch-box tags\">\n                    {loop table=\"tags\" isshow=\"1\" orderby=\"num desc\" limit=\"15\" as=\"v\"}\n\t\t\t\t\t<a \n\t\t\t\t\t{if($v_n%8==1)}\n\t\t\t\t\tclass=\"badge bg-primary\"\n\t\t\t\t\t{else if($v_n%8==2)}\n\t\t\t\t\tclass=\"badge bg-secondary\"\n\t\t\t\t\t{else if($v_n%8==3)}\n\t\t\t\t\tclass=\"badge bg-success\"\n\t\t\t\t\t{else if($v_n%8==4)}\n\t\t\t\t\tclass=\"badge bg-danger\"\n\t\t\t\t\t{else if($v_n%8==5)}\n\t\t\t\t\tclass=\"badge bg-warning text-dark\"\n\t\t\t\t\t{else if($v_n%8==6)}\n\t\t\t\t\tclass=\"badge bg-info text-dark\"\n\t\t\t\t\t{else if($v_n%8==7)}\n\t\t\t\t\tclass=\"badge bg-light text-dark\"\n\t\t\t\t\t{else if($v_n%8==8)}\n\t\t\t\t\tclass=\"badge bg-dark\"\n\t\t\t\t\t{/if}\n\t\t\t\t\ttarget=\"_blank\" href=\"{$v['url']}\">{$v['keywords']}</a>\n\t\t\t\t\t{/loop}\n                  </div>\n                </div>\n              \n              </div>\n            </div>\n          </div>\n        </div>\n        <!-- Blog Details Wrapper End -->\n\n      </div>\n    </div>\n\n   {include=\"footer\"}\n   {include=\"js\"}\n   \n   <script>\n   $.get('/common/gohits?molds={$jz['molds']}&id={$jz['id']}',function(r){\n   $(\"#read-num\").html('热度 '+r);\n   })\n   var page = 1;\n   getmessagelist({$jz['tid']},{$jz['id']},page);\n   \n   \n   </script>\n   \n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/article/article-list.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"zxx\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <title>{$type['seo_classname']}-{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"{$type['keywords']}\" />\n\t<meta name=\"description\" content=\"{$type['description']}\" />\n\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n     {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n        <!-- Blog Details Wrapper Start -->\n        <div class=\"blog-details-wrapper section-space--ptb_80\">\n          <div class=\"container\">\n            <div class=\"row row--17\">\n              <div class=\"blog-details-col-8\">\n                <div class=\"row\">\n\t\t\t\t{if($lists)}\n\t\t\t\t{foreach $lists as $v}\n                  <!-- Author Blog Post Wrap Start -->\n                  <div class=\"author-blog-post-wrap masonary-item cat--3 wow fadeInUp\">\n                    <a href=\"{$v['url']}\" class=\"author-blog-thum\">\n                      <img src=\"{$v['litpic']}\" alt=\"{$v['title']}\" />\n                    </a>\n                    <div class=\"author-blog-post-content\">\n                      <div class=\"blog-details-meta-box\">\n                        <div class=\"post-meta-left-side mb-2\">\n                          <div class=\"blog-post-category\">\n                            <a href=\"{$v['url']}\" class=\"btn-medium business mr-1\"\n                              >{$classtypedata[$v['tid']]['classname']}</a\n                            >\n                          </div>\n                          <div class=\"blog-post-author\">\n\t\t\t\t\t\t  {if(!$v['member_id'])}\n                            By <a >{fun adminInfo($v['userid'],'name')}</a>\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t    By <a href=\"/user/active/uid/{$v['member_id']}\">{fun memberInfo($v['member_id'],'username')}</a>\n\t\t\t\t\t\t  {/if} \n                          </div>\n                        </div>\n                        <div class=\"post-right-side mb-2\">\n                          <span class=\"post-meta-left-side\">\n                            <span class=\"post-date\">\n                              <i class=\"icofont-ui-calendar\"></i>\n                              <a href=\"{$v['url']}\">{fun date('Y-m-d H:i:s',$v['addtime'])}</a>\n                            </span>\n                          </span>\n                          <span>热度 {$v['hits']}</span>\n                        </div>\n                      </div>\n                      <h3 class=\"title mb-2\">\n                        <a href=\"{$v['url']}\"\n                          >{$v['title']}</a\n                        >\n                      </h3>\n                      <p class=\"mb-2\">\n                        {$v['description']}\n                      </p>\n\n                      <div class=\"author-post-bottom-area\">\n                        <div class=\"author-post-action-box\">\n                          <div class=\"author-action\">\n                            <img src=\"{$tpl}static/picture/heart-2.png\" alt=\"\" />\n                            <span class=\"count\">{$v['zan']}</span>\n                          </div>\n                          <div class=\"author-action\">\n                            <img src=\"{$tpl}static/picture/message.png\" alt=\"\" />\n                            <span class=\"count\">{$v['comment_num']}</span>\n                          </div>\n                        </div>\n                        <div class=\"author-post-action-box\">\n                          <div class=\"author-action\">\n                           \n\t\t\t\t\t\t\t<span class=\"count\">阅 {$v['hits']}</span>\n                          </div>\n                          \n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <!-- Author Blog Post Wrap End -->\n\t\t\t\t{/foreach}\n\t\t\t\t{else}\n\t\t\t\t <div class=\"col-lg-12\">\n\t\t\t\t\t<div class=\"error-404-content text-center\">\n\t\t\t\t\t  <div class=\"banner wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\n\t\t\t\t\t\t<img src=\"/static/cms/static/picture/error-404.png\" alt=\"\">\n\t\t\t\t\t  </div>\n\t\t\t\t\t  <div class=\"error-text wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\n\t\t\t\t\t\t<h5>This Page is Not Found.</h5>\n\t\t\t\t\t\t<h2>很抱歉，没有找到你要的信息。</h2>\n\n\t\t\t\t\t\t\n\t\t\t\t\t  </div>\n\t\t\t\t\t</div>\n\t\t\t\t  </div>\n\t\t\t\t{/if}\n                \n\t\t\t\t<nav>\n\t\t\t\t\t<ul class=\"pagination\">\n\t\t\t\t\t\t<li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n\t\t\t\t\t\t{foreach $listpage['list'] as $ss}\n\t\t\t\t\t\t<li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t<li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n\t\t\t\t\t\n\t\t\t\t\t</ul>\n\t\t\t\t</nav>\n                </div>\n\t\t\t\t\n              </div>\n              <div class=\"blog-details-col-4\">\n               \t <div class=\"latest-post-inner-wrap\">\n\t\t\t\t   {include=\"searchform\"}\n\t\t\t\t \n                  {include=\"latestpost\"}\n                </div>\n                \n              </div>\n            \n\t\t\t</div>\n          </div>\n        </div>\n       \n      </div>\n    </div>\n    {include=\"footer\"}\n    {include=\"js\"}\n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/article/faq.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"zxx\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <title>{$type['seo_classname']}-{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"{$type['keywords']}\" />\n\t<meta name=\"description\" content=\"{$type['description']}\" />\n\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n        <div class=\"faq-area\">\n          <div class=\"container\">\n            <div class=\"row\">\n              <div class=\"col\">\n                <div class=\"row g-0 align-items-center faq-box-wrap\">\n                  <div class=\"col-lg-6\">\n                    <div class=\"faq-section-title wow fadeInUp\">\n                      <img src=\"{$tpl}static/picture/faq-text.png\" alt=\"\" />\n\n                      <h4 class=\"title wow fadeInUp\">\n                        一些问题和回答,\n                        <span class=\"bold-text\">请看这里.</span>\n                      </h4>\n                    </div>\n                  </div>\n                  <div class=\"col-lg-6\">\n                    <div class=\"faq-content-wrap\">\n                      <div class=\"accordion\" id=\"accordionExample\">\n\t\t\t\t\t   \n\t\t\t\t\t\t{loop table=\"article\" tid=\"$type['id']\" isshow=\"1\" orderby=\"orders desc,id asc\" as=\"v\"}\n                        <div class=\"accordion-item wow fadeInUp\" >\n                          <h2 class=\"accordion-header\" id=\"headingOne{$v_n}\">\n                            <button\n                              class=\"accordion-button faq-qustion {if($v_n!=1)}collapsed{/if}\"\n                              type=\"button\"\n                              data-bs-toggle=\"collapse\"\n                              data-bs-target=\"#collapseOne{$v_n}\"\n                              {if($v_n==1)}aria-expanded=\"true\"{/if}\n                              aria-controls=\"collapseOne{$v_n}\"\n                            >\n                              <span class=\"number-of-accordion\">{$v_n}</span> {$v['title']}\n                            </button>\n                          </h2>\n                          <div\n                            id=\"collapseOne{$v_n}\"\n                            class=\"accordion-collapse collapse {if($v_n==1)}show{/if}\"\n                            aria-labelledby=\"headingOne{$v_n}\"\n                            data-bs-parent=\"#accordionExample\"\n                          >\n                            <div class=\"accordion-body faq-ans\">\n                              {$v['body']}\n                            </div>\n                          </div>\n                        </div>\n                        \n\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t  </div>\n                    </div>\n                  </div>\n                \n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t\n\t\t\t\t\n              </div>\n\t\t\t  \n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    {include=\"footer\"}\n    {include=\"js\"}\n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/backup/.gitkeep",
    "content": ""
  },
  {
    "path": "static/cms/comment.html",
    "content": "  <div class=\"comment-area section-space--pt_60 section-space--pb_100\">\n\t\t\t\t\t<div class=\"container\">\n\t\t\t\t\t<div class=\"row comment-area section-space--pt_60\">\n\t\t\t\t\t  <div class=\"m-auto\">\n\t\t\t\t\t\t<div class=\"comment-list-wrapper\">\n\t\t\t\t\t\t  <h3 class=\"widget-title mb-30\">评论 (<span id=\"jz_comment_num\">{$jz['comment_num']}</span>)</h3>\n\t\t\t\t\t\t  <ol class=\"comment-list\" id=\"jz_comment_list\">\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t  </ol>\n\t\t\t\t\t\t  <div class=\"comment-page-bar\">\n\t\t\t\t\t\t  <span class=\"comment-page\" onclick=\"prevmessagelist()\" >上一页</span>\n\t\t\t\t\t\t  <span class=\"comment-page\" onclick=\"nextmessagelist()\" >下一页</span>\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"row comment-area section-space--pt_60\">\n                      <div class=\"section-title\">\n                        <h3 class=\"title\">我要点评</h3>\n                      </div>\n                      <form action=\"\" class=\"comment-form-area\">\n                        <div class=\"row\">\n                        <input name=\"go\" value=\"1\" placeholder=\"表示\" id=\"go\" type=\"hidden\" />\n\t\t\t\t\t\t<input name=\"star\" value=\"0\" placeholder=\"评论星星数\"  id=\"star\" type=\"hidden\" />\n\t\t\t\t\t\t<input name=\"tid\" id=\"tid\" value=\"{$type['id']}\"  type=\"hidden\" />\n\t\t\t\t\t\t<input name=\"aid\" id=\"aid\" value=\"{$jz['id']}\" placeholder=\"文章ID\"   type=\"hidden\" />\n\t\t\t\t\t\t<input name=\"zid\" value=\"0\" id=\"zid\" placeholder=\"评论层ID\"  type=\"hidden\" />\n\t\t\t\t\t\t<input name=\"pid\" value=\"0\" id=\"pid\" placeholder=\"回复层ID\"  type=\"hidden\" />\n                          <div class=\"col-lg-12\">\n                            <div class=\"single-input\">\n                              <textarea\n\t\t\t\t\t\t\t\tid=\"content\"\n                                name=\"textarea\"\n\t\t\t\t\t\t\t\t{if(!$islogin)}disabled{/if}\n                                placeholder=\"输入评论内容\"\n                              ></textarea>\n                            </div>\n                          </div>\n                          <div class=\"col-lg-12\">\n\t\t\t\t\t\t  {if($islogin)}\n                            <div class=\"submit-button text-center\">\n                              <button\n                                class=\"btn-large btn-primary\"\n                                type=\"button\"\n\t\t\t\t\t\t\t\tonclick=\"sendmsg()\"\n                              >\n                                提 交\n                              </button>\n                            </div>\n\t\t\t\t\t\t   {else}\n\t\t\t\t\t\t   您还未登录，无法发表评论！<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#loginModel\">立即登录</button>\n\t\t\t\t\t\t   {/if}\n                          </div>\n                        </div>\n                      </form>\n                    </div>\n                  \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n                    "
  },
  {
    "path": "static/cms/faq.html",
    "content": "<!DOCTYPE html><html class=\"no-js\" lang=\"zxx\"><head><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>Bunzo - Blog Bootstrap 5 HTML Template</title><meta name=\"description\" content=\"Bunzo is one of the most popular blog template\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" /><link rel=\"canonical\" href=\"#\" /><meta property=\"og:locale\" content=\"en_US\" /><meta property=\"og:type\" content=\"article\" /><meta property=\"og:title\" content=\"Bunzo - Blog HTML Template\" /><meta property=\"og:url\" content=\"\" /><meta property=\"og:site_name\" content=\"\" /><meta property=\"og:image\" content=\"\" /><!-- Favicon --><link rel=\"icon\" href=\"assets/images/favicon.png\"><!-- CSS ============================================ --><!-- Bootstrap CSS --><!-- <link rel=\"stylesheet\" href=\"static/css/bootstrap.min.css\">--><!-- Gordita Fonts CSS --><link rel=\"stylesheet\" href=\"static/css/gordita-fonts.css\" /><!-- Icofont CSS --><!-- <link rel=\"stylesheet\" href=\"static/css/icofont.min.css\" />--><!-- Light gallery CSS --><!-- <link rel=\"stylesheet\" href=\"static/css/lightgallery.min.css\">--><!-- Swiper bundle CSS --><!-- <link rel=\"stylesheet\" href=\"static/css/swiper-bundle.min.css\" />--><!-- AOS CSS --><!-- <link rel=\"stylesheet\" href=\"static/css/aos.css\">--><!-- Vendor & Plugins CSS(Please remove the comment from below vendor.min.css & plugins.min.css for better website load performance and remove css files from avobe) --><link rel=\"stylesheet\" href=\"static/css/vendor.min.css\"><link rel=\"stylesheet\" href=\"static/css/plugins.min.css\"><!-- Main Style CSS --><link rel=\"stylesheet\" href=\"static/css/style.css\"></head><body><!--======== header area =========--><header class=\"header\"><div class=\"header-top-area\"><div class=\"container\"><div class=\"row\"><div class=\"col-lg-3 col-md-6 col-sm-6 order-1 order-lg-1\"><ul class=\"header-top-menu-list\"><li><a href=\"#\">Help</a></li><li><a href=\"#\">Status</a></li><li><a href=\"#\">Writers</a></li></ul></div><div class=\"col-lg-6 col-md-12 col-sm-12 order-3 order-lg-2\"><div class=\"header-top-contact-info\"><div class=\"header-top-single-contact-item\"><div class=\"header-top-contact-icon\"><img src=\"static/picture/contact-call.png\" alt=\"\"></div><div class=\"header-top-contact-text text-size-small\"><a href=\"\">(970) 262-1413</a></div></div><div class=\"header-top-single-contact-item\"><div class=\"header-top-contact-icon\"><img src=\"static/picture/contact-emaill.png\" alt=\"\"></div><div class=\"header-top-contact-text\"><a href=\"mailto:address@gmail.com\">address@gmail.com</a></div></div></div></div><div class=\"col-lg-3 col-md-6 col-sm-6 order-2 order-lg-3\"><div class=\"header-top-right-side\"><p>Bangladesh</p><div class=\"wayder\"><span class=\"wayder-icon\"><img src=\"static/picture/wayder.png\" alt=\"\"/></span><span class=\"wayder-text\">28° C</span></div></div></div></div></div></div><div class=\"header-mid-area\"><div class=\"container\"><div class=\"row align-items-center\"><div class=\"col-lg-3 col-md-2 col-5\"><div class=\"logo\"><a href=\"index.html\"><img src=\"static/picture/logo.png\" alt=\"\" /></a></div></div><div class=\"col-lg-6 col-md-6 d-md-block d-none\"><div class=\"header-add-banner text-center\"><a href=\"#\"><img src=\"static/picture/header-add-banner.jpg\" alt=\"\" /><h6 class=\"header-add-text\">All Food Item <span>50% Off</span></h6></a></div></div><div class=\"col-lg-3 col-md-4 col-7\"><div class=\"header-mid-right-side\"><a href=\"javascript:void(0)\" id=\"search-overlay-trigger\" class=\"single-action-item\"><img src=\"static/picture/search.png\" alt=\"\"></a><a href=\"#\" class=\"single-action-item\"><img src=\"static/picture/notification.png\" alt=\"\"></a><a href=\"#\" class=\"single-action-item\"><img src=\"static/picture/bookmark.png\" alt=\"\"></a><a href=\"register.html\" class=\"single-action-item\"><img src=\"static/picture/user.png\" alt=\"\"></a></div></div></div></div></div><div class=\"header-bottom-area\"><div class=\"container\"><div class=\"row align-items-center\"><div class=\"col-lg-4 col-9\"><ul class=\"social-share-area mt-15 mb-15\"><li><a href=\"#\"><i class=\"icofont-facebook\"></i></a></li><li><a href=\"#\"><i class=\"icofont-skype\"></i></a></li><li><a href=\"#\"><i class=\"icofont-twitter\"></i></a></li><li><a href=\"#\"><i class=\"icofont-linkedin\"></i></a></li></ul></div><div class=\"col-lg-8 col-3\"><div class=\"main-menu-area text-end\"><nav class=\"navigation-menu\"><ul><li class=\"has-children\"><a href=\"index.html\"><span>Home</span></a><ul class=\"submenu\"><li><a href=\"index-2.html\"><span>Home Two</span></a></li><li><a href=\"index-3.html\"><span>Home Three</span></a></li><li><a href=\"index-4.html\"><span>Home Four</span></a></li><li><a href=\"index-5.html\"><span>Home Five</span></a></li><li><a href=\"index-6.html\"><span>Home Six</span></a></li></ul></li><li><a href=\"about-us.html\"><span>About</span></a></li><li class=\"has-children\"><a href=\"category.html\"><span>Category</span></a><ul class=\"submenu\"><li><a href=\"category.html\"><span>Category List</span></a></li><li><a href=\"category-grid.html\"><span>Category Grid</span></a></li></ul></li><li class=\"has-children\"><a href=\"#\"><span>Pages</span></a><ul class=\"submenu\"><li><a href=\"blog-details.html\"><span>Blog Details</span></a></li><li><a href=\"blog-details-two.html\"><span>Blog Details Two</span></a></li><li><a href=\"error-404.html\"><span>Error 404</span></a></li><li><a href=\"faq.html\"><span>FAQ's</span></a> </li>\n                                            <li><a href=\"author-post.html\"><span>Author post</span></a> </li>\n                                            <li><a href=\"register.html\"><span>Register</span></a> </li>\n                                            <li><a href=\"write-post.html\"><span>Write Post</span></a> </li>\n                                        </ul>\n                                    </li>\n                                    <li><a href=\"contact-us.html\"><span>Contact </span></a></li>\n                                </ul>\n                            </nav>\n                        </div>\n                        <!-- mobile menu -->\n                        <div class=\"mobile-menu-right\">\n                            <div class=\"mobile-navigation-icon d-block d-lg-none\" id=\"mobile-menu-trigger\">\n                                <i></i>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </header>\n    <!--======== End of header area  =========-->\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <!-- breadcrumb-area start -->\n    <div class=\"breadcrumb-area\">\n        <div class=\"container\">\n            <div class=\"row\">\n                <div class=\"col-12\">\n                    <div class=\"breadcrumb_box text-center\">\n                        <!-- <h2 class=\"breadcrumb-title\">@@title</h2> -->\n                        <!-- breadcrumb-list start -->\n                        <ul class=\"breadcrumb-list\">\n                            <li class=\"breadcrumb-item\"><a href=\"index.html\">Home</a></li>\n                            <li class=\"breadcrumb-item active\">FAQ’s</li>\n                        </ul>\n                        <!-- breadcrumb-list end -->\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <!-- breadcrumb-area end -->\n\n\n\n\n\n\n    <div id=\"main-wrapper\">\n        <div class=\"site-wrapper-reveal\">\n\n            <div class=\"faq-area\">\n                <div class=\"container\">\n                    <div class=\"row \">\n                        <div class=\"col\">\n                            <div class=\"row g-0 align-items-center faq-box-wrap\">\n                                <div class=\"col-lg-6 \">\n                                    <div class=\"faq-section-title wow fadeInUp\" >\n                                        <img src=\"static/picture/faq-text.png\" alt=\"\">\n\n                                        <h4 class=\"title wow fadeInUp\" >\n                                            Some Question\n                                            And Answer,\n                                            <span class=\"bold-text\">Look’s here.</span>\n                                        </h4>\n                                    </div>\n                                </div>\n                                <div class=\"col-lg-6\">\n                                    <div class=\"faq-content-wrap\">\n                                        <div class=\"accordion\" id=\"accordionExample\">\n                                            <div class=\"accordion-item wow fadeInUp\" >\n                                                <h2 class=\"accordion-header\" id=\"headingOne\">\n                                                    <button class=\"accordion-button faq-qustion\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseOne\" aria-expanded=\"true\" aria-controls=\"collapseOne\">\n                                                        <span class=\"number-of-accordion\">01</span> How do the different types of drawings work?\n                                                    </button>\n                                                </h2>\n                                                <div id=\"collapseOne\" class=\"accordion-collapse collapse show\" aria-labelledby=\"headingOne\" data-bs-parent=\"#accordionExample\">\n                                                    <div class=\"accordion-body faq-ans\">\n                                                        <p>Lorem Ipsum is simply dummy text of printing and typesetting\n                                                            industry. Lorem psum has been the dustry standard dummy text\n                                                            since the printer into electronic.</p>\n                                                        <p>Lorem Ipsum is simply dummy text offer printing and typeseting\n                                                            industry since the printer into electronic.</p>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                            <div class=\"accordion-item wow fadeInUp\" >\n                                                <h2 class=\"accordion-header\" id=\"headingTwo\">\n                                                    <button class=\"accordion-button faq-qustion collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\">\n                                                        <span class=\"number-of-accordion\">02</span> How long do the records of drawings persist?\n                                                    </button>\n                                                </h2>\n                                                <div id=\"collapseTwo\" class=\"accordion-collapse collapse\" aria-labelledby=\"headingTwo\" data-bs-parent=\"#accordionExample\">\n                                                    <div class=\"accordion-body faq-ans\">\n                                                        <p>Lorem Ipsum is simply dummy text of printing and typesetting\n                                                            industry. Lorem psum has been the dustry standard dummy text\n                                                            since the printer into electronic.</p>\n                                                        <p>Lorem Ipsum is simply dummy text offer printing and typeseting\n                                                            industry since the printer into electronic.</p>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                            <div class=\"accordion-item wow fadeInUp\" >\n                                                <h2 class=\"accordion-header\" id=\"headingThree\">\n                                                    <button class=\"accordion-button faq-qustion collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseThree\" aria-expanded=\"false\" aria-controls=\"collapseThree\">\n                                                        <span class=\"number-of-accordion\">03</span> Why do I need to be careful public drawings?\n                                                    </button>\n                                                </h2>\n                                                <div id=\"collapseThree\" class=\"accordion-collapse collapse\" aria-labelledby=\"headingThree\" data-bs-parent=\"#accordionExample\">\n                                                    <div class=\"accordion-body faq-ans\">\n                                                        <p>Lorem Ipsum is simply dummy text of printing and typesetting\n                                                            industry. Lorem psum has been the dustry standard dummy text\n                                                            since the printer into electronic.</p>\n                                                        <p>Lorem Ipsum is simply dummy text offer printing and typeseting\n                                                            industry since the printer into electronic.</p>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                            <div class=\"accordion-item wow fadeInUp\" >\n                                                <h2 class=\"accordion-header\" id=\"headingfour\">\n                                                    <button class=\"accordion-button faq-qustion collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapsefour\" aria-expanded=\"false\" aria-controls=\"collapseThree\">\n                                                        <span class=\"number-of-accordion\">04</span> Can I use RANDOM.ORG to draw straws?\n                                                    </button>\n                                                </h2>\n                                                <div id=\"collapsefour\" class=\"accordion-collapse collapse\" aria-labelledby=\"headingfour\" data-bs-parent=\"#accordionExample\">\n                                                    <div class=\"accordion-body faq-ans\">\n                                                        <p>Lorem Ipsum is simply dummy text of printing and typesetting\n                                                            industry. Lorem psum has been the dustry standard dummy text\n                                                            since the printer into electronic.</p>\n                                                        <p>Lorem Ipsum is simply dummy text offer printing and typeseting\n                                                            industry since the printer into electronic.</p>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                            <div class=\"accordion-item wow fadeInUp\" >\n                                                <h2 class=\"accordion-header\" id=\"headingfive\">\n                                                    <button class=\"accordion-button faq-qustion collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapsefive\" aria-expanded=\"false\" aria-controls=\"collapseThree\">\n                                                        <span class=\"number-of-accordion\">05</span> Do the numbers exhibit Benford's Law? </button></h2><div id=\"collapsefive\" class=\"accordion-collapse collapse\" aria-labelledby=\"headingfive\" data-bs-parent=\"#accordionExample\"><div class=\"accordion-body faq-ans\"><p>Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.</p><p>Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.</p></div></div></div><div class=\"accordion-item wow fadeInUp\" ><h2 class=\"accordion-header\" id=\"headingsix\"><button class=\"accordion-button faq-qustion collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapsesix\" aria-expanded=\"false\" aria-controls=\"collapseThree\"><span class=\"number-of-accordion\">06</span>Are the numbers suitable for experiments? </button></h2><div id=\"collapsesix\" class=\"accordion-collapse collapse\" aria-labelledby=\"headingsix\" data-bs-parent=\"#accordionExample\"><div class=\"accordion-body faq-ans\"><p>Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.</p><p>Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.</p></div></div></div></div></div></div></div></div></div></div></div></div></div><!--====== footer area =======--><footer class=\"footer-area footer-one\"><div class=\"footer-top-area\"><div class=\"container\"><div class=\"row\"><div class=\"col-lg-3 col-md-6\"><div class=\"footer-widget\"><div class=\"footer-logo\"><a href=\"index.html\"><img src=\"static/picture/logo-white.png\" alt=\"\"></a></div><p>Lorem Ipsum is simply dummy text the printing and typesetting industry has been the industry's standard\n                                text ever since.\n                            </p>\n                            <ul class=\"footer-socail-share\">\n                                <li><a href=\"#\"><i class=\"icofont-facebook\"></i></a></li>\n                                <li><a href=\"#\"><i class=\"icofont-skype\"></i></a></li>\n                                <li><a href=\"#\"><i class=\"icofont-twitter\"></i></a></li>\n                                <li><a href=\"#\"><i class=\"icofont-linkedin\"></i></a></li>\n                            </ul>\n                        </div>\n                    </div>\n                    <div class=\"col-lg-4  col-md-6\">\n                        <div class=\"footer-widget footer-subscribe-center\">\n                            <div class=\"footer-widget-title\">\n                                <h4 class=\"title\">Subscribe</h4>\n                            </div>\n                            <div class=\"footer-subscribe-wrap\">\n                                <div class=\"single-input\">\n                                    <input type=\"text\" placeholder=\"Your Name\">\n                                </div>\n                                <div class=\"single-input\">\n                                    <input type=\"email\" placeholder=\"Email Address\">\n                                </div>\n                                <div class=\"button-box\">\n                                    <button class=\"btn-primary btn-large\" type=\"submit\">Subscribe Now</button>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"col-lg-5\">\n                        <div class=\"footer-menu-widget\">\n                            <div class=\"single-footer-menu\">\n                                <div class=\"footer-widget-title\">\n                                    <h4 class=\"title\">Company</h4>\n                                </div>\n                                <ul class=\"footer-widget-menu-list\">\n                                    <li><a href=\"about-us.html\">About Us</a></li>\n                                    <li><a href=\"contact-us.html\">Contact Us</a></li>\n                                    <li><a href=\"#!\">Local Print Ads</a></li>\n                                    <li><a href=\"faq.html\">FAQ’s</a></li>\n                                    <li><a href=\"#!\">Careers</a></li>\n                                </ul>\n                            </div>\n                            <div class=\"single-footer-menu\">\n                                <div class=\"footer-widget-title\">\n                                    <h4 class=\"title\">Quick Links</h4>\n                                </div>\n                                <ul class=\"footer-widget-menu-list\">\n                                    <li><a href=\"#!\">Privacy Policy</a></li>\n                                    <li><a href=\"#!\">Discussion</a></li>\n                                    <li><a href=\"#!\">Terms & Conditions</a></li>\n                                    <li><a href=\"#!\">Customer Support</a></li>\n                                    <li><a href=\"#!\">Course FAQ’s</a></li>\n                                </ul>\n                            </div>\n                            <div class=\"single-footer-menu\">\n                                <div class=\"footer-widget-title\">\n                                    <h4 class=\"title\">Category</h4>\n                                </div>\n                                <ul class=\"footer-widget-menu-list\">\n                                    <li><a href=\"#!\">Lefestyle</a></li>\n                                    <li><a href=\"#!\">Healthy</a></li>\n                                    <li><a href=\"#!\">Restaurent</a></li>\n                                    <li><a href=\"#!\">Travel Tips</a></li>\n                                    <li><a href=\"#!\">Marketing</a></li>\n                                </ul>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"footer-bottom-area\">\n            <div class=\"container\">\n                <div class=\"row\">\n                    <div class=\"col-lg-12\">\n                        <div class=\"footer-bottom-inner\">\n                            <div class=\"copy-right-text\">\n                                <p>© 2021 <a href=\"#\">Bunzo</a>. Made with ❤️ by <a target=\"_blank\" rel=\"noopener\" href=\"http://www.bootstrapmb.com\">HasThemes</a></p>\n                            </div>\n                            <div class=\"button-right-box\">\n                                <a href=\"#!\" class=\"btn-primary btn-large\">Share your thinking <i class=\"icofont-long-arrow-right\"></i></a>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </footer>\n    <!--=====  End of footer area ========-->\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    <!--====================  search overlay ====================-->\n    <div class=\"search-overlay\" id=\"search-overlay\">\n\n        <div class=\"search-overlay__header\">\n            <div class=\"container-fluid\">\n                <div class=\"row align-items-center\">\n                    <div class=\"col-md-12\">\n                        <!-- search content -->\n                        <div class=\"search-content text-end\">\n                            <span class=\"mobile-navigation-close-icon\" id=\"search-close-trigger\"></span>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"search-overlay__inner\">\n            <div class=\"search-overlay__body\">\n                <div class=\"search-overlay__form\">\n                    <form action=\"#\">\n                        <input type=\"text\" placeholder=\"Search\">\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n    <!--====================  End of search overlay  ====================-->\n    <!--====================  scroll top ====================-->\n    <a href=\"#\" class=\"scroll-top\" id=\"scroll-top\">\n        <i class=\"arrow-top icofont-swoosh-up\"></i>\n        <i class=\"arrow-bottom icofont-swoosh-up\"></i>\n    </a>\n    <!--====================  End of scroll top  ====================-->\n\n    <!--====================  mobile menu overlay ====================-->\n    <div class=\"mobile-menu-overlay\" id=\"mobile-menu-overlay\">\n        <div class=\"mobile-menu-overlay__inner\">\n            <div class=\"mobile-menu-overlay__header\">\n                <div class=\"container-fluid\">\n                    <div class=\"row align-items-center\">\n                        <div class=\"col-md-6 col-8\">\n                            <!-- logo -->\n                            <div class=\"logo\">\n                                <a href=\"index.html\">\n                                    <img src=\"static/picture/logo.png\" class=\"img-fluid\" alt=\"\">\n                                </a>\n                            </div>\n                        </div>\n                        <div class=\"col-md-6 col-4\">\n                            <!-- mobile menu content -->\n                            <div class=\"mobile-menu-content text-end\">\n                                <span class=\"mobile-navigation-close-icon\" id=\"mobile-menu-close-trigger\"></span>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div class=\"mobile-menu-overlay__body\">\n                <nav class=\"offcanvas-navigation\">\n                    <ul>\n                        <li class=\"has-children\">\n                            <a href=\"index.html\">Home</a>\n                            <ul class=\"sub-menu\">\n                                <li><a href=\"index-2.html\"><span>Home Two</span></a></li>\n                                <li><a href=\"index-3.html\"><span>Home Three</span></a></li>\n                                <li><a href=\"index-4.html\"><span>Home Four</span></a></li>\n                                <li><a href=\"index-5.html\"><span>Home Five</span></a></li>\n                                <li><a href=\"index-6.html\"><span>Home Six</span></a></li>\n                            </ul>\n                        </li>\n                        <li><a href=\"about-us.html\"><span>About</span></a></li>\n                        <li class=\"has-children\">\n                            <a href=\"#\">Category</a>\n                            <ul class=\"sub-menu\">\n                                <li><a href=\"category.html\"><span>Category List</span></a> </li>\n                                <li><a href=\"category-grid.html\"><span>Category Grid</span></a> </li>\n                            </ul>\n                        </li>\n                        <li class=\"has-children\">\n                            <a href=\"#\">Pages</a>\n                            <ul class=\"sub-menu\">\n                                <li><a href=\"blog-details.html\"><span>Blog Details</span></a> </li>\n                                <li><a href=\"blog-details-two.html\"><span>Blog Details Two</span></a> </li>\n                                <li><a href=\"error-404.html\"><span>Error 404</span></a> </li>\n                                <li><a href=\"faq.html\"><span>FAQ's</span></a></li><li><a href=\"author-post.html\"><span>Author post</span></a></li><li><a href=\"register.html\"><span>Register</span></a></li><li><a href=\"write-post.html\"><span>Write Post</span></a></li></ul></li><li><a href=\"contact-us.html\"><span>Contact </span></a></li></ul></nav></div></div></div><!--==================== End of mobile menu overlay ====================--><!-- JS ============================================ --><!-- Modernizer JS --><!-- <script src=\"static/js/modernizr-2.8.3.min.js\"></script>--><!-- jQuery JS --><!-- <script src=\"static/js/jquery-3.5.1.min.js\"></script><script src=\"static/js/jquery-migrate-3.3.0.min.js\"></script>--><!-- Bootstrap JS --><!-- <script src=\"static/js/bootstrap.min.js\"></script>--><!-- Light gallery JS --><!-- <script src=\"static/js/lightgallery.min.js\"></script>--><!-- Isotope JS --><!-- <script src=\"static/js/isotope.min.js\"></script>--><!-- Masonry JS --><!-- <script src=\"static/js/masonry.min.js\"></script>--><!-- ImagesLoaded JS --><!-- <script src=\"static/js/images-loaded.min.js\"></script>--><!-- Swiper Bundle JS --><!-- <script src=\"static/js/swiper-bundle.min.js\"></script>--><!-- AOS JS --><!-- <script src=\"static/js/aos.js\"></script>--><!-- Ajax JS --><!-- <script src=\"static/js/ajax.mail.js\"></script>--><!-- Plugins JS(Please remove the comment from below plugins.min.js for better website load performance and remove plugin js files from avobe) --><script src=\"static/js/vendor.min.js\"></script><script src=\"static/js/plugins.min.js\"></script><!-- Main JS --><script src=\"static/js/main.js\"></script></body></html>"
  },
  {
    "path": "static/cms/footer.html",
    "content": "  <!--======  footer area =======-->\r\n    <footer class=\"footer-area footer-two\">\r\n      <div class=\"footer-top-area\">\r\n        <div class=\"container-fluid container-custom-xl\">\r\n          <div class=\"row\">\r\n            <div class=\"col-lg-4 col-md-8 col-sm-8 order-lg-1 order-1\">\r\n              <div class=\"footer-widget\">\r\n                <div class=\"footer-logo\">\r\n                  <a href=\"/\">\r\n                    <img src=\"{$webconf['web_logo']}\" alt=\"{$webconf['web_name']}\" />\r\n                  </a>\r\n                </div>\r\n                <p>\r\n                  {$webconf['web_desc']}\r\n                </p>\r\n                \r\n               \r\n              </div>\r\n            </div>\r\n            <div class=\"col-lg-8 order-lg-2 order-3\">\r\n              <div class=\"footer-menu-widget\">\r\n\t\t\t    {foreach $classtypedata as $v}\r\n\t\t\t    {if($v['pid']==0 && $v['isshow']==1 && $v['haschild'])}\r\n\t\t\t\t\t\r\n\t\t\t\t\t<div class=\"single-footer-menu\">\r\n\t\t\t\t\t  <div class=\"footer-widget-title\">\r\n\t\t\t\t\t\t<h4 class=\"title\">{$v['classname']}</h4>\r\n\t\t\t\t\t  </div>\r\n\t\t\t\t\t  \r\n\t\t\t\t\t  <ul class=\"footer-widget-menu-list\">\r\n\t\t\t\t\t    {foreach $v['children']['list'] as $vv}\r\n\t\t\t\t\t\t<li><a href=\"{$vv['url']}\">{$vv['classname']}</a></li>\r\n\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t  </ul>\r\n\t\t\t\t\t  \r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n\t\t\t\t{/if}\r\n\t\t\t\t{/foreach}\r\n               \r\n\t\t\t\t</div>\r\n            </div>\r\n           \r\n\t\t  </div>\r\n        </div>\r\n      </div>\r\n      <div class=\"footer-bottom-area\">\r\n        <div class=\"container-fluid\">\r\n          <div class=\"row\">\r\n            <div class=\"col-lg-12\">\r\n              <div class=\"copy-right-center\">\r\n                <p>\r\n                  © {fun date('Y')} powered by {$webconf['web_name']} <a href=\"https://beian.miit.gov.cn/\" target=\"_blank\" >{$webconf['web_beian']}</a>\r\n                </p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </footer>\r\n    <a\r\n      href=\"#\"\r\n      class=\"scroll-top\"\r\n      id=\"scroll-top\"\r\n      ><i class=\"arrow-top icofont-swoosh-up\"></i\r\n      ><i class=\"arrow-bottom icofont-swoosh-up\"></i></a\r\n    >\r\n    <div class=\"mobile-menu-overlay\" id=\"mobile-menu-overlay\">\r\n      <div class=\"mobile-menu-overlay__inner\">\r\n        <div class=\"mobile-menu-overlay__header\">\r\n          <div class=\"container-fluid\">\r\n            <div class=\"row align-items-center\">\r\n              <div class=\"col-md-6 col-8\">\r\n                <!-- logo -->\r\n                <div class=\"logo\">\r\n                  <a href=\"/\"\r\n                    ><img\r\n                      src=\"{$webconf['web_logo']}\"\r\n                      class=\"img-fluid\"\r\n                      alt=\"\"\r\n                  /></a>\r\n                </div>\r\n              </div>\r\n              <div class=\"col-md-6 col-4\">\r\n                <!-- mobile menu content -->\r\n                <div class=\"mobile-menu-content text-end\">\r\n                  <span\r\n                    class=\"mobile-navigation-close-icon\"\r\n                    id=\"mobile-menu-close-trigger\"\r\n                  ></span>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div class=\"mobile-menu-overlay__body\">\r\n          <nav class=\"offcanvas-navigation\">\r\n\t\t \r\n            <ul>\r\n\t\t\t {foreach $classtypedata as $v}\r\n\t\t\t {if($v['pid']==0 && $v['isshow']==1)}\r\n\t\t\t\t {if($v['haschild'])}\r\n\t\t\t\t<li class=\"has-children\">\r\n\t\t\t\t  <a href=\"{$v['url']}\"><span>{$v['classname']}</span></a>\r\n\t\t\t\t  <ul class=\"sub-menu\">\r\n\t\t\t\t\t{foreach $v['children']['list'] as $vv}\r\n\t\t\t\t\t<li>\r\n\t\t\t\t\t  <a href=\"{$vv['url']}\"><span>{$vv['classname']}</span></a>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\r\n\t\t\t\t  </ul>\r\n\t\t\t\t</li>\r\n\t\t\t\t{else}\r\n\t\t\t\t<li>\r\n\t\t\t\t  <a href=\"{$v['url']}\"><span>{$v['classname']}</span></a>\r\n\t\t\t\t</li>\r\n\t\t\t\t\r\n\t\t\t\t{/if}\r\n              \r\n\t\t\t  {/if}\r\n\t\t\t  {/foreach}\r\n             \r\n            </ul>\r\n          </nav>\r\n        </div>\r\n      </div>\r\n    </div>\r\n<!-- Modal -->\r\n<div class=\"modal fade\" id=\"loginModel\" tabindex=\"-1\" aria-labelledby=\"loginModelLabel\" aria-hidden=\"true\">\r\n  <div class=\"modal-dialog\">\r\n    <div class=\"modal-content\">\r\n      <div class=\"modal-header\">\r\n        <h5 class=\"modal-title\" id=\"loginModelLabel\">登录</h5>\r\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n      </div>\r\n      <div class=\"modal-body\">\r\n       \r\n\t    <div class=\"mb-3\">\r\n\t\t  <label for=\"m-user\" class=\"form-label\">账户</label>\r\n\t\t  <input type=\"text\" class=\"form-control\" id=\"m-user\" placeholder=\"请输入邮箱/昵称/手机号\">\r\n\t\t</div>\r\n\t\t<div class=\"mb-3\">\r\n\t\t  <label for=\"m-pass\" class=\"form-label\">密码</label>\r\n\t\t  <input type=\"password\" class=\"form-control\" id=\"m-pass\" placeholder=\"请输入登录密码\">\r\n\t\t</div>\r\n\t\t{if(!$webconf['closehomevercode'])}\r\n\t\t<div class=\"mb-3\">\r\n\t\t  <label for=\"m-yzm\" class=\"form-label\">验证码</label>\r\n\t\t  <input type=\"text\" class=\"form-control\" id=\"m-yzm\" placeholder=\"请输入验证码\">\r\n\t\t</div>\r\n\t\t<div class=\"mb-3\">\r\n\t\t\t<img id=\"login-yzm\" src=\"/common/vercode?name=login_vercode\"  onclick=\"this.src=this.src+'&'+Math.random()\">\r\n\t\t</div>\r\n\t\t{/if}\r\n\t\t<div class=\"mb-3\">\r\n\t\t<p>没有账户？<a  class=\"register\" style=\"color:#5974ff;\" data-bs-dismiss=\"modal\" data-bs-toggle=\"modal\" data-bs-target=\"#registerModel\">点击注册</a></p>\r\n\t\t</div>\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t   \r\n      </div>\r\n      <div class=\"modal-footer\">\r\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">关闭</button>\r\n        <button type=\"button\" onclick=\"mlogin()\" class=\"btn btn-primary\">登录</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class=\"modal fade\" id=\"registerModel\" tabindex=\"-1\" aria-labelledby=\"registerModelLabel\" aria-hidden=\"true\">\r\n  <div class=\"modal-dialog\">\r\n    <div class=\"modal-content\">\r\n      <div class=\"modal-header\">\r\n        <h5 class=\"modal-title\" id=\"registerModelLabel\">注册</h5>\r\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n      </div>\r\n      <div class=\"modal-body\">\r\n        <div class=\"mb-3\">\r\n\t\t  <label for=\"r-tel\" class=\"form-label\">*手机</label>\r\n\t\t  <input type=\"tel\" class=\"form-control\" id=\"r-tel\" placeholder=\"请输入手机号\">\r\n\t\t</div>\r\n\t\t<div class=\"mb-3\">\r\n\t\t  <label for=\"r-pass\" class=\"form-label\">*密码</label>\r\n\t\t  <input type=\"password\" class=\"form-control\" id=\"r-pass\" placeholder=\"请输入登录密码\">\r\n\t\t</div>\r\n\t\t<div class=\"mb-3\">\r\n\t\t  <label for=\"r-pass\" class=\"form-label\">*重复密码</label>\r\n\t\t  <input type=\"password\" class=\"form-control\" id=\"r-repass\" placeholder=\"请输入登录密码\">\r\n\t\t</div>\r\n\t\t{if(!$webconf['closehomevercode'])}\r\n\t\t<div class=\"mb-3\">\r\n\t\t  <label for=\"r-yzm\" class=\"form-label\">*验证码</label>\r\n\t\t  <input type=\"text\" class=\"form-control\" id=\"r-yzm\" placeholder=\"请输入验证码\">\r\n\t\t</div>\t\t\r\n\t\t<div class=\"mb-3\">\r\n\t\t\t<img id=\"register-yzm\" src=\"/common/vercode?name=reg_vercode\" onclick=\"this.src=this.src+'&'+Math.random()\">\r\n\t\t</div>\r\n\t\t{/if}\r\n\t\t<div class=\"mb-3\">\r\n\t\t<p>已有账户？<a  class=\"login\" style=\"color:#5974ff;\" data-bs-dismiss=\"modal\" data-bs-toggle=\"modal\" data-bs-target=\"#loginModel\">点击登录</a></p>\r\n\t\t</div>\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t   \r\n      </div>\r\n      <div class=\"modal-footer\">\r\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">关闭</button>\r\n        <button type=\"button\" onclick=\"mregister()\" class=\"btn btn-primary\">注册</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "static/cms/func/functions.php",
    "content": "<?php\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "static/cms/header.html",
    "content": "<header class=\"header-two {if($ishome)}position--absolute{else}position--relative{/if}\">\n      <div class=\"header-bottom-area\">\n        <div class=\"container\">\n          <div class=\"row align-items-center\">\n            <div class=\"col-lg-2 col-md-3 col-5\">\n              <div class=\"logo\">\n                <a href=\"/\"><img src=\"{$webconf['web_logo']}\" alt=\"{$webconf['web_name']}\" /></a>\n              </div>\n            </div>\n            <div class=\"col-lg-8 d-lg-block d-none\">\n              <div class=\"main-menu-area text-center\">\n                <nav class=\"navigation-menu navigation-menu-white\">\n                  <ul>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t  <a href=\"/\"><span>首页</span></a>\n\t\t\t\t\t</li>\n\t\t\t\t    {foreach $classtypedata as $v}\n\t\t\t\t\t{if($v['pid']==0 && $v['isshow']==1)}\n\t\t\t\t\t\t{if($v['haschild'])}\n\t\t\t\t\t\t<li class=\"has-children\">\n\t\t\t\t\t\t  <a href=\"{$v['url']}\"><span>{$v['classname']}</span></a>\n\t\t\t\t\t\t  <ul class=\"submenu\">\n\t\t\t\t\t\t    {foreach $v['children']['list'] as $vv}\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t  <a href=\"{$vv['url']}\"><span>{$vv['classname']}</span></a>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t  </ul>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t  <a href=\"{$v['url']}\"><span>{$v['classname']}</span></a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{/if}\n\t\t\t\t    {/foreach}\n                   \n                    \n                  </ul>\n                </nav>\n              </div>\n            </div>\n            <div class=\"col-lg-2 col-md-9 col-7\">\n              <div class=\"header-two-right-side\">\n                <a href=\"/user/notify\" class=\"single-action-item\">\n                  <span id=\"notifiy-icon\" class=\"\"></span>\n                  <img src=\"{$tpl}static/picture/notification-white.png\" alt=\"\" />\n                </a>\n\t\t\t\t{if($islogin)}\n                <a href=\"/user/index\" class=\"single-action-item\">\n                  <img src=\"{$tpl}static/picture/user-white.png\" alt=\"\" />\n                </a>\n\t\t\t\t{else}\n\t\t\t\t<a data-bs-dismiss=\"modal\" data-bs-toggle=\"modal\" data-bs-target=\"#loginModel\" class=\"single-action-item\">\n                  <img src=\"{$tpl}static/picture/user-white.png\" alt=\"\" />\n                </a>\n\t\t\t\t{/if}\n                <!-- mobile menu -->\n                <div\n                  class=\"mobile-navigation-icon icon-white d-block d-lg-none\"\n                  id=\"mobile-menu-trigger\"\n                >\n                  <i></i>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </header>\n    "
  },
  {
    "path": "static/cms/index.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"cn\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <title>{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"{$webconf['web_keyword']}\" />\n\t<meta name=\"description\" content=\"{$webconf['web_desc']}\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    {include=\"style\"}\n  </head>\n  <body class=\"theme-color-two\">\n   \n    {include=\"header\"}\n\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n\t\t<div class=\"hero-area-two-wrapper\">\n                <!-- Hero Area Start -->\n                <div class=\"hero-area-two hero-area-overly\">\n                    <div class=\"container\">\n                        <div class=\"col-lg-12\">\n                            <div class=\"hero-area--two-innter text-center\">\n                       \n\t\t\t\t\t\t\t\t<h1 class=\"hero-title\">极致建站系统</h1>\n\t\t\t\t\t\t\t\t<h2><span class=\"hero-title-small\">建站、教程、资源</span></h2>\n\t\t\t\t\t\t\t\t<div class=\"hero-two-tag\">\n\t\t\t\t\t\t\t\t\t<a  class=\"btn-outline-2 btn-large\">免费</a>\n\t\t\t\t\t\t\t\t\t<a  class=\"btn-outline-2 btn-large\">开源</a>\n\t\t\t\t\t\t\t\t\t<a  class=\"btn-outline-2 btn-large\">无商业授权</a>\n\t\t\t\t\t\t\t\t\t<a  class=\"btn-outline-2 btn-large\">功能强大</a>\n\t\t\t\t\t\t\t\t\t<a  class=\"btn-outline-2 btn-large\">简单易用</a>\n\t\t\t\t\t\t\t\t\t<a  class=\"btn-outline-2 btn-large\">无限制</a>\n\t\t\t\t\t\t\t\t\t<a  class=\"btn-outline-2 btn-large\">安全可靠</a>\n\t\t\t\t\t\t\t\t</div>\n                            </div>\n                        </div>\n                    </div>\n                </div><!-- Hero Area End -->\n\n                <div class=\"hero-two-banner-text\">\n                    \n                </div>\n        </div>\n<!-- Most Popular Area Start -->\n        <div class=\"most-populer-area section-space--ptb_120\">\n          <div class=\"container\">\n            <div class=\"row\">\n              <div class=\"col-8\">\n                <div class=\"section-title\">\n                  <h2>热门模板</h2>\n                </div>\n              </div>\n              <div class=\"col-4\">\n                <div class=\"most-popular-slider-navigation\">\n                  <div class=\"popular-swiper-button-prev navigation-button\">\n                    <i class=\"icofont-long-arrow-left\"></i>\n                  </div>\n                  <div class=\"popular-swiper-button-next navigation-button\">\n                    <i class=\"icofont-long-arrow-right\"></i>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <!-- Swiper -->\n            <div class=\"swiper-container most-popular-slider-active\">\n              <div class=\"swiper-wrapper\">\n\t\t\t   {loop table=\"product\" notempty=\"litpic\" orderby=\"orders desc\" isshow=\"1\" jzattr=\"1,2,3\" limit=\"6\"  as=\"v\"}\n                <div class=\"swiper-slide\">\n                  \n                  <div class=\"single-most-populer-item wow fadeInUp\" >\n                    <a href=\"{$v['url']}\" class=\"most-populer-thum\">\n                      <img src=\"{$v['litpic']}\" alt=\"{$v['title']}\" />\n                    </a>\n                    <div class=\"most-populer-content\">\n                      <div class=\"most-populer-post-author\">\n\t\t\t\t\t\t  {if(!$v['member_id'])}\n                            作者 <a href=\"{$v['url']}\">{fun adminInfo($v['userid'],'name')}</a>\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t    作者 <a href=\"/user/active/uid/{$v['member_id']}\">{fun memberInfo($v['member_id'],'username')}</a>\n\t\t\t\t\t\t  {/if}\n                      </div>\n                      <h3 class=\"title\">\n                        <a href=\"{$v['url']}\"\n                          >{$v['title']}</a\n                        >\n                      </h3>\n\t\t\t\t\t  <p class=\"dec mt-2\">\n                      <span class=\"product-price\">￥ {$v['price']}</span>\n                      </p>\n                      <div class=\"most-populer-post-meta\">\n                        <span class=\"post-date\">\n                          <a>{fun date('Y-m-d',$v['addtime'])}</a>\n                        </span>\n                        <span>热度 {$v['hits']}</span>\n                      </div>\n                    </div>\n                  </div>\n       \n                </div>\n\t\t\t    {/loop}\n\n               \n\t\t\t  </div>\n            </div>\n          </div>\n        </div>\n        <!-- Most Popular Area End -->\n\n\t    \n        <!-- Recent Article Area Start -->\n        <div class=\"recent-article-area section-space--pb_120\">\n          <div class=\"container\">\n            <div class=\"row\">\n              <div class=\"col-lg-12\">\n                <div class=\"section-title text-center section-border-bottom\">\n                  <h2>最近更新</h2>\n                </div>\n              </div>\n            </div>\n            <div class=\"row row--30\">\n\t\t\t{loop table=\"article\" notempty=\"litpic\"  orderby=\"addtime desc\" isshow=\"1\"  limit=\"6\"  as=\"v\"}\n              <div class=\"col-lg-4 col-md-6\">\n                \n                <div class=\"single-most-populer-item wow fadeInUp\" >\n                  <a href=\"{$v['url']}\" class=\"most-populer-thum\">\n                    <img src=\"{$v['litpic']}\" alt=\"{$v['title']}\" />\n                  </a>\n                  <div class=\"most-populer-content\">\n                    <div class=\"most-populer-post-author\">\n                       作者 <a href=\"{$v['url']}\">{fun adminInfo($v['userid'],'name')}</a>\n                    </div>\n                    <h3 class=\"title\">\n                      <a href=\"{$v['url']}\"\n                        >{$v['title']}</a\n                      >\n                    </h3>\n                    <p class=\"dec mt-2\">\n                      {fun newstr($v['description'],80)}\n                    </p>\n                    <div class=\"most-populer-post-meta\">\n                      <span class=\"post-date\">\n                        <a>{fun date('Y-m-d',$v['addtime'])}</a>\n                      </span>\n                      <span>阅 {$v['hits']}</span>\n                    </div>\n                  </div>\n                </div>\n               \n              </div>\n\t\t\t{/loop}\n             \n             \n\t\t\t</div>\n          </div>\n        </div>\n        <!-- Recent Article Area End -->\n\t\t\t\t  <!-- Related Newsletter Area Start -->\n        <div class=\"related-newsletter-area\">\n          <div class=\"container\">\n            <div class=\"row\">\n              <div class=\"col-lg-12\">\n                <div class=\"related-newsletter-box\">\n                  <div class=\"related-newsletter-inner-box\">\n                    <h2 class=\"title\">\n                      国内企业用户 <b style=\"color:#F00\">200+</b> 家\n                     \n                    </h2>\n\t\t\t\t\t<h2 class=\"title\"> 下载使用超 <b style=\"color:#F00\">100000+</b> 人</h2>\n                    <div class=\"button-box mt-30\">\n                      <a\n                        href=\"https://www.jizhicms.cn/jizhicms.zip\"\n                        class=\"btn-primary btn-bg-2 bg-color btn-large\"\n                        >立即下载使用</a\n                      >\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <!-- Related Newsletter Area End -->\n        \n       <div class=\"testimonial-area bg-gray section-space--ptb_120\">\n                <div class=\"container\">\n                    <div class=\"row\">\n                        <div class=\"col-lg-12\">\n                            <div class=\"section-title text-center mb-10\" >\n                                <h6 class=\"sub-title-four mb-20\">用户评价</h6>\n                                <h2 class=\"title\">人们对我们的评价</h2>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"testimonial-slider-area\">\n                        <div class=\"swiper-container testimonial-slider-active\">\n                            <div class=\"swiper-wrapper\">\n\t\t\t\t\t\t\t{loop table=\"pingjia\" orderby=\"orders desc\" isshow=\"1\" as=\"v\"}\n                                <div class=\"swiper-slide\">\n                                    <div class=\"single-testimonial-item wow fadeInUp\" >\n                                        <div class=\"testimonial-post-author\">\n                                            <div class=\"testimonial-author-image\">\n                                                <img src=\"{$v['litpic']}\" alt=\"{$v['title']}\">\n                                            </div>\n                                            <div class=\"testimonial-author-info\">\n                                                <h4>{$v['title']}</h4>\n                                                <p>{$v['zhiye']}</p>\n                                            </div>\n                                        </div>\n                                        <div class=\"testimonial-post-content\">\n                                            <h5 class=\"testimonial-post-title\">{$v['description']}</h5>\n                                            <p>{$v['body']}\n                                            </p>\n                                        </div>\n                                    </div>\n                                </div>\n\t\t\t\t\t\t\t{/loop}\n                                \n                            </div>\n                        </div>\n                        <div class=\"testimonial-slider-navigation\">\n                            <div class=\"testimonial-button-next navigation-button\"><i class=\"icofont-long-arrow-left\"></i></div>\n                            <div class=\"testimonial-button-prev navigation-button\"><i class=\"icofont-long-arrow-right\"></i></div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            \n\t   \n\t   \n      </div>\n    </div>\n\n    {include=\"footer\"}\n    {include=\"js\"}\n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/info.php",
    "content": "<?php\n\nreturn [\n\t'name'=>'官方默认模板',//模板名称\n\t'desc'=>'此模板拥有极致CMS所有功能，仅供参考和学习！',//模板介绍\n\t'author'=>'留恋风2581047041@qq.com',//作者介绍,这里可以把自己的联系方式带上去,方便用户沟通\n\t'version'=>'1.0',//模板版本,默认1.0为最低版本\n\t'web'=>'https://www.jizhicms.cn',\n\t'thumbnail'=>'/static/cms/thumbnail.png',\n\t'update_time'=>'2022-01-20',//更新时间,格式：Y-m-d\n];\n\n"
  },
  {
    "path": "static/cms/install/TemplateController.php",
    "content": "<?php\n\n// +----------------------------------------------------------------------\n// | JiZhiCMS { 极致CMS，给您极致的建站体验 }  \n// +----------------------------------------------------------------------\n// | Copyright (c) 2018-2099 http://www.jizhicms.com All rights reserved.\n// +----------------------------------------------------------------------\n// | Author: 留恋风 <2581047041@qq.com>\n// +----------------------------------------------------------------------\n// | Date：2022/01\n// +----------------------------------------------------------------------\n\nuse frphp\\lib\\Controller;\nuse frphp\\extend\\Page;\nclass TemplateController extends Controller {\n\t\n\tprivate $backupPath = '';\n\t\n\t//自动执行\n\tpublic function _init(){\n\t\t/**\n\t\t\t继承系统默认配置\n\t\t\n\t\t**/\n\t\t\n\t\t//检查当前账户是否合乎操作\n\t\tif(!isset($_SESSION['admin']) || $_SESSION['admin']['id']==0){\n\t\t\tRedirect(U('Login/index'));\n\t\t\t\n\t\t}\n \n\t  \t\n\t    $webconf = webConf();\n\t    $this->webconf = $webconf;\n\t\t$classtypedata = classTypeData();\n\t\t$this->classtypedata = getclasstypedata($classtypedata,0);\n\t\t\n\t\t\n\t\t//当前模板目录\n\t\t\n\t\t$this->tpl = '@'.dirname(__FILE__);\n\t\t\n\t\t//数据库备份目录\n\t\t$this->backupPath = __DIR__ .'/backup';\n\t\t\n\t\t//引入当前模板的配置文件\n\t\t$this->templateconfig = include_once('../info.php');\n\t\t\n\t\t/**\n\t\t\t在下面添加自定义操作\n\t\t**/\n\t\t\n\t\t\n\t}\n\t\n\t//执行SQL语句在此处处理,或者移动文件也可以在此处理\n\tpublic  function install(){\n\t\t\n\t\t//将一个文件覆盖另一个文件的方法\n\t\t/*将当前模板目录的a.html复制到abc模板下面的index.html\n\t\t$dir = APP_PATH.'static/default';\n\t\tcopy($dir.\"/a.html\",APP_PATH.'static/abc/index.html');\n\t\t*/\n\t\t\n\t\t//插入一条SQL\n\t\t/*\n\t\t$sql.=\"INSERT INTO `\".DB_PREFIX.\"sysconfig` (`field`,`title`,`tip`,`type`,`data`) VALUES ('closeweb','关闭网站', NULL,'0','0');\";\n\t\tM()->runSql($sql);\n\t\t*/\n\t\t\n\t\t\n\t\t\n\t\t\n\t\treturn true;\n\t\t\n\t}\n\t\n\t//批量转移覆盖文件--子目录不会覆盖\n\t//从一个目录$from转移到另一个目录$to\n\t//最好在这个目录中创建一个back文件夹，转移覆盖文件前会先备份原文件以防文件丢失\n\t//eg: $from = APP_PATH.'static/backup' 转移到 $to = APP_PATH.'static/abc'\n\t//备份文件在 APP_PATH.'static/backup/back'中\n\tprivate function removeFile($from,$to){\n\t\t//移动后台插件控制器\n\t\t$sourcefile = $from;\n\t\t$target = $to;\n\t\tif(is_dir($sourcefile) && is_dir($target)){\n\t\t\tif (false != ($handle = opendir ( $sourcefile ))) {\n\t\t\t\t\n\t\t\t\twhile ( false !== ($file = readdir ( $handle )) ) {\n\t\t\t\t\t//去掉\"“.”、“..”以及带“.xxx”后缀的文件\n\t\t\t\t\tif ($file != \".\" && $file != \"..\" && !is_dir($sourcefile.'/'.$file) ) {\n\t\t\t\t\t\t$fs = $sourcefile.'/'.$file;\n\t\t\t\t\t\t$ft = $target.'/'.$file;\n\t\t\t\t\t\t //备份源文件以防更新覆盖\n\t\t\t\t\t\tif(!is_dir($sourcefile.'/back')){\n\t\t\t\t\t\t\tmkdir($sourcefile.'/back',0777);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcopy($ft,  $sourcefile.'/back/'.$file);\n\t\t\t\t\t\t$r = $this->file2dir($fs,$ft);\n\t\t\t\t\t\tif(!$r){\n\t\t\t\t\t\t\tJsonReturn(array('code'=>1,'msg'=>'文件转移失败！sourcefile:'.$fs.' targetfile:'.$ft));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//关闭句柄\n\t\t\t\tclosedir ( $handle );\n\t\t\t}\n\t\t\n\t\t}\n\t\t\t\t\n\t}\n\t\n\t//复制文件并转移与removeFile结合使用\n\tprivate function file2dir($sourcefile, $filename){\n\t\t if( !file_exists($sourcefile)){\n\t\t\t return false;\n\t\t }\n\t\t return copy($sourcefile,  $filename);\n\t}\n\t\n\t// 原目录复制到的目录，子目录也会转移\n\tfunction recurse_copy($src,$dst) {  \n\t \n\t\t$dir = opendir($src);\n\t\t@mkdir($dst);\n\t\twhile(false !== ( $file = readdir($dir)) ) {\n\t\t\tif (( $file != '.' ) && ( $file != '..' )) {\n\t\t\t\tif ( is_dir($src . '/' . $file) ) {\n\t\t\t\t\t$this->recurse_copy($src . '/' . $file,$dst . '/' . $file);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcopy($src . '/' . $file,$dst . '/' . $file);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tclosedir($dir);\n\t}\n\t\n\t//返回表字段 \n\t//$table不需要带表前缀\n\t//返回字段数组 eg:['id','title','body',[...]]\n\tprivate function getTableFields($table){\n\t\tif(defined('DB_TYPE') && DB_TYPE=='sqlite'){\n\t\t\t$sql = \"pragma table_info(\".DB_PREFIX.$table.\")\";\n\t\t\t\n\t\t\t$list = M()->findSql($sql);\n\t\t\t$fields = [];\n\t\t\tforeach($list as $v){\n\t\t\t\t$fields[]=$v['name'];\n\t\t\t\t\n\t\t\t}\n\t\t}else{\n\t\t\t$sql = 'SHOW COLUMNS FROM '.DB_PREFIX.$table;\n\t\t\t$list = M()->findSql($sql);\n\t\t\t$isgo = true;\n\t\t\t$fields = [];\n\t\t\tforeach($list as $v){\n\t\t\t\t$fields[]=$v['Field'];\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\treturn $fields;\n\t\t\n\t}\n\t\n\t//返回数据库表数组\n\t//eg:['article','product',[...]]\n\tprivate function getTableData(){\n\t\tif(defined('DB_TYPE') && DB_TYPE=='sqlite'){\n\t\t\t$sql = \"select name from sqlite_master where type='table' order by name\";\n\t\t}else{\n\t\t\t$sql = \"SHOW TABLES\";\n\t\t}\n\t\t\n\t\t\n\t\t$tables = M()->findSql($sql);\n\t\t$ttable = array();\n\t\tforeach($tables as $value){\n\t\t\tforeach($value as $vv){\n\t\t\t\t$ttable[] = $vv;\n\t\t\t}\n\t\t\t\n\t\t}\n\t\treturn $ttable;\n\t}\n\t\n\t//备份数据库\n\tprivate function toBackup(){\n\t\t$pconfig = array(\n\t\t\t'host' =>DB_HOST,\n\t\t\t'port' =>DB_PORT,\n\t\t\t'user' =>DB_USER,\n\t\t\t'password' =>DB_PASS,\n\t\t\t'database' =>DB_NAME\n\t\t);\n\t\t$this->config = array_merge($this->config, $pconfig);\n\t\t$this->handler = new \\PDO(\"mysql:host=\".$this->config['host'].\";port={$this->config['port']};dbname={$this->config['database']}\", $this->config['user'], $this->config['password']);\n\t\t$this->handler->query(\"set names utf8\");\n\t\t\n\t\t$this->backup();\n\t}\n\t/**\n\t  * 备份当前数据库\n\t  * @param array $tables\n\t  * @return bool\n\t  */\n\t private function backup($tables = array())\n\t {\n\t  //存储表定义语句的数组\n\t  $ddl = array();\n\t  //存储数据的数组\n\t  $data = array();\n\t  $this->setTables($tables);\n\t  if (!empty($this->tables))\n\t  {\n\t   foreach ($this->tables as $table)\n\t   {\n\t\t$ddl[] = $this->getDDL($table);\n\t\t$data[] = $this->getData($table);\n\t   }\n\t   //开始写入\n\t   $this->writeToFile($this->tables, $ddl, $data);\n\t  }\n\t  else\n\t  {\n\t   $this->error = '数据库中没有表!';\n\t   return false;\n\t  }\n\t }\n\t /**\n\t  * 设置要备份的表\n\t  * @param array $tables\n\t  */\n\t private function setTables($tables = array())\n\t {\n\t  if (!empty($tables) && is_array($tables))\n\t  {\n\t   //备份指定表\n\t   $this->tables = $tables;\n\t  }\n\t  else\n\t  {\n\t   //备份全部表\n\t   $this->tables = $this->getTables();\n\t  }\n\t }\n\t /**\n\t  * 查询\n\t  * @param string $sql\n\t  * @return mixed\n\t  */\n\t private function query($sql = '')\n\t {\n\t  $stmt = $this->handler->query($sql);\n\t  $stmt->setFetchMode(\\PDO::FETCH_NUM);\n\t  $list = $stmt->fetchAll();\n\t  return $list;\n\t }\n\t /**\n\t  * 获取全部表\n\t  * @return array\n\t  */\n\t private function getTables()\n\t {\n\t  $sql = 'SHOW TABLES';\n\t  $list = $this->query($sql);\n\t  $tables = array();\n\t  foreach ($list as $value)\n\t  {\n\t   $tables[] = $value[0];\n\t  }\n\t  return $tables;\n\t }\n\t /**\n\t  * 获取表定义语句\n\t  * @param string $table\n\t  * @return mixed\n\t  */\n\t private function getDDL($table = '')\n\t {\n\t  $sql = \"SHOW CREATE TABLE `{$table}`\";\n\t  $ddl = $this->query($sql)[0][1] . ';';\n\t  return $ddl;\n\t }\n\t /**\n\t  * 获取表数据\n\t  * @param string $table\n\t  * @return mixed\n\t  */\n\t private function getData($table = '')\n\t {\n\t  $sql = \"SHOW COLUMNS FROM `{$table}`\";\n\t  $list = $this->query($sql);\n\t  //字段\n\t  $columns = '';\n\t  //需要返回的SQL\n\t  $query = [];\n\t  foreach ($list as $value)\n\t  {\n\t   $columns .= \"`{$value[0]}`,\";\n\t  }\n\t  $columns = substr($columns, 0, -1);\n\t  $data = $this->query(\"SELECT * FROM `{$table}`\");\n\t  foreach ($data as $value)\n\t  {\n\t   $dataSql = '';\n\t   foreach ($value as $v)\n\t   {\n\t\tif($v==='' || $v===null){\n\t\t  $dataSql .= \" NULL,\";\n\t\t}else{\n\t\t  $dataSql .= \"'{$v}',\";\n\t\t}\n\t\t\n\t   }\n\t   $dataSql = substr($dataSql, 0, -1);\n\t   $query[]= \"INSERT INTO `{$table}` ({$columns}) VALUES ({$dataSql});\\r\\n\";\n\t  }\n\t  return $query;\n\t }\n\t /**\n\t  * 写入文件\n\t  * @param array $tables\n\t  * @param array $ddl\n\t  * @param array $data\n\t  */\n\t private function writeToFile($tables = array(), $ddl = array(), $data = array())\n\t {\n\t  $public_str = \"/*\\r\\nMySQL Database Backup Tools\\r\\n\";\n\t  $public_str .= \"Server:{$this->config['host']}:{$this->config['port']}\\r\\n\";\n\t  $public_str .= \"Database:{$this->config['database']}\\r\\n\";\n\t  $public_str .= \"Data:\" . date('Y-m-d H:i:s', time()) . \"\\r\\n*/\\r\\n\";\n\t  $i = 0;\n\t  //echo '备份数据库-'.$this->config['database'].'<br />';\n\t  $countsql = 0;//记录sql数\n\t  $filenum = 0;//文件序号\n\t  $backfile = $this->config['target']==''? $this->config['database'].'_'.date('Y_m_d_H_i_s').'_'.rand(100000,999999): $this->config['target'].date('YmdHis');//文件名\n\t  $str = $public_str.\"SET FOREIGN_KEY_CHECKS=0;\\r\\n\";\n\t  foreach ($tables as $table)\n\t  {\n\t  // echo '备份表：'.$table.'<br>';\n\t   $str .= \"-- ----------------------------\\r\\n\";\n\t   $str .= \"-- Table structure for {$table}\\r\\n\";\n\t   $str .= \"-- ----------------------------\\r\\n\";\n\t   $str .= \"DROP TABLE IF EXISTS `{$table}`;\\r\\n\";\n\t   $str .= $ddl[$i] . \"\\r\\n\";\n\t  \n\t   $i++;\n\t   //echo '备份成功！<br/>'; \n\t   \n\t  }\n\t  //优先备份表结构\n\t\t$str = '<?php die();?>'.$str;\n\t\t$isok = file_put_contents('backup/'.$backfile.'.php', $str);\n\t\tif(!$isok){\n\t\t\texit('[ backup/'.$backfile.'.php ] 写入文件失败！');\n\t\t}\n\t\t$str = $public_str;\n\t\t$filenum = 1;\n\t  $i = 0;\n\t  foreach($tables as $table){\n\t\t//echo '备份表数据：'.$table.' <br>';\n\t\t$str .= \"-- ----------------------------\\r\\n\";\n\t\t$str .= \"-- Records of {$table}\\r\\n\";\n\t\t$str .= \"-- ----------------------------\\r\\n\";\n\t\t//$str .= $data[$i] . \"\\r\\n\";\n\t\tforeach ($data[$i] as $v){\n\t\t\t$str .= $v;\n\t\t\t$countsql++;\n\t\t\tif($countsql%($this->limit)==0){\n\t\t\t\t$str = '<?php die();?>'.$str;\n\t\t\t\tif($filenum==0){\n\t\t\t\t\t$isok = file_put_contents($this->backupPath.'/'.$backfile.'.php', $str);\n\t\t\t\t\tif(!$isok){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'.php ] 写入文件失败！']);\n\t\t\t\t\t}\n\t\t\t\t\t$filenum++;\n\t\t\t\t}else{\n\t\t\t\t\t$isok = file_put_contents($this->backupPath.'/'.$backfile.'_v'.$filenum.'.php', $str);\n\t\t\t\t\tif(!$isok){\n\t\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'_v'.$filenum.'.php ] 写入文件失败！']);\n\t\t\t\t\t}\n\t\t\t\t\t$filenum++;\n\t\t\t\t}\n\t\t\t\t$str = $public_str;\n\t\t\t}\t\n\t\t}\n\t\t$i++;\n\t\t\n\t\t\n\t  }\n\t  if($str!='' && $str != $public_str){\n\t\t\t$str = '<?php die();?>'.$str;\n\t\t\tif($filenum==0){\n\t\t\t\t$isok = file_put_contents($this->backupPath.'/'.$backfile.'.php', $str);\n\t\t\t\tif(!$isok){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'.php ] 写入文件失败！']);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t$isok = file_put_contents($this->backupPath.'/'.$backfile.'_v'.$filenum.'.php', $str);\n\t\t\t\tif(!$isok){\n\t\t\t\t\tJsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'_v'.$filenum.'.php ] 写入文件失败！']);\n\t\t\t\t}\n\t\t\t}\n\t  }\n\n\t }\n\t\n\t\n\n}\n\n\n\n\n\n\n\n"
  },
  {
    "path": "static/cms/js.html",
    "content": "<script src=\"{$tpl}static/js/vendor.min.js\"></script>\n<script src=\"{$tpl}static/js/plugins.min.js\"></script>\n<script src=\"{$tpl}static/js/smoothproducts.min.js\"></script>\n<script src=\"{$tpl}static/js/wow.min.js\"></script>\n<!-- Main JS -->\n<script src=\"{$tpl}static/js/main.js\"></script>\n<script src=\"{$common}layui/layui.js\"></script>\n<script src=\"/static/common/md5.js\" charset=\"utf-8\"></script>\n<script>\nfunction likes(tid,id){\n        $.ajax({\n                 url:\"/user/likesAction\",//请求的url地址\n                 dataType:\"json\",//返回格式为json\n                 async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n                 data:{tid:tid,id:id,ajax:1},//参数值\n                 type:\"POST\",//请求方式\n                 beforeSend:function(){\n                    //请求前的处理\n                    },\n\t\t\t\t success:function(r){\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.msg(r.msg,{icon: 6,time: 2000},function(){\n\t\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t\t});\n\t\t\t\t\t   \n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg);\n\t\t\t\t\t}\n\n\t\t\t\t},\n\t\t\t\t complete:function(){\n\t\t\t\t//请求完成的处理\n\t\t\t\t},\n\t\t\t\t error:function(){\n\t\t\t\t//请求出错处理\n\t\t\t\t\tlayer.alert('网络错误');\n\t\t\t\t}\n\n\n\n            })\n    }\n\nfunction collect(tid,id){\n        $.ajax({\n                 url:\"/user/collectAction\",//请求的url地址\n                 dataType:\"json\",//返回格式为json\n                 async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n                 data:{tid:tid,id:id,ajax:1},//参数值\n                 type:\"POST\",//请求方式\n                 beforeSend:function(){\n                    //请求前的处理\n                    },\n\t\t\t\t success:function(r){\n\t\t\t\t\tif(r.code==0){\n\t\t\t\t\t\tlayer.msg(r.msg,{icon: 6,time: 2000},function(){\n\t\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t\t});\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlayer.alert(r.msg);\n\t\t\t\t\t}\n\n\t\t\t\t},\n\t\t\t\t complete:function(){\n\t\t\t\t//请求完成的处理\n\t\t\t\t},\n\t\t\t\t error:function(){\n\t\t\t\t//请求出错处理\n\t\t\t\t\tlayer.alert('网络错误');\n\t\t\t\t}\n\n\n\n            })\n    }\n\nfunction mlogin(){\n\tvar user = $(\"#m-user\").val();\n\tvar pass = $(\"#m-pass\").val();\n\t\n\tif(user==''){\n\t\tlayer.alert('登录账户不能为空！');return false;\n\t}\n\tif(pass==''){\n\t\tlayer.alert('登录密码不能为空！');return false;\n\t}\n\t{if(!$webconf['closehomevercode'])}\n\tvar yzm = $(\"#m-yzm\").val();\n\tif(yzm==''){\n\t\tlayer.alert('验证码不能为空！');return false;\n\t}\n\t{else}\n\tvar yzm = '';\n\t{/if}\n\t\tpass = hex_md5(pass)\n\t$.post('/login/index',{tel:user,password:pass,vercode:yzm,ajax:1},function(res){\n\t\tif(res.code==0){\n\t\t\tlayer.msg('登录成功！',{icon: 6,time: 2000},function(){\n\t\t\t\t//登录成功后的操作\n\t\t\t\tlocation.reload();\n\t\t\t})\n\t\t}else{\n\t\t\tlayer.msg(res.msg,{icon:5,time:2000});\n\t\t\tvar img = '/common/vercode?name=login_vercode&'+Math.random();\n\t\t\t$(\"#login-yzm\").attr('src',img);\n\t\t}\n\t},'json')\n\t\n\treturn false;\n\t\n}\n\nfunction mregister(){\n\tvar tel = $(\"#r-tel\").val();\n\tvar pass = $(\"#r-pass\").val();\n\tvar repass = $(\"#r-repass\").val();\n\t\n\tif(tel==''){\n\t\tlayer.alert('手机号不能为空！');return false;\n\t}\n\tif(pass==''){\n\t\tlayer.alert('登录密码不能为空！');return false;\n\t}\n\tif(repass==''){\n\t\tlayer.alert('重复密码不能为空！');return false;\n\t}\n\tif(pass!=repass){\n\t\tlayer.alert('两次密码不同！');return false;\n\t}\n\t{if(!$webconf['closehomevercode'])}\n\tvar yzm = $(\"#r-yzm\").val();\n\tif(yzm==''){\n\t\tlayer.alert('验证码不能为空！');return false;\n\t}\n\t{else}\n\tvar yzm = '';\n\t{/if}\n\t\n\t$.post('/login/register',{tel:tel,repassword:repass,password:pass,vercode:yzm,ajax:1,autologin:1},function(res){\n\t\tif(res.code==0){\n\t\t\tlayer.msg(res.msg,{icon: 6,time: 2000},function(){\n\t\t\t\t//登录成功后的操作\n\t\t\t\twindow.location.href=res.url;\n\t\t\t})\n\t\t}else{\n\t\t\tlayer.msg(res.msg,{icon:5,time:2000});\n\t\t\tvar img = '/common/vercode?name=reg_vercode&'+Math.random();\n\t\t\t$(\"#register-yzm\").attr('src',img);\n\t\t}\n\t},'json')\n\t\n\treturn false;\n\t\n}\n\nfunction sendmsg(){\n\tvar star = $(\"#star\").val();\n\tvar tid = $(\"#tid\").val();\n\tvar aid = $(\"#aid\").val();\n\tvar zid = $(\"#zid\").val();\n\tvar pid = $(\"#pid\").val();\n\tvar content = $(\"#content\").val();\n\tif(content==''){\n\t\tlayer.alert('评论内容不能为空！');\n\t\treturn false;\n\t}\n\t$.post('/comment/index',{star:star,tid:tid,aid:aid,zid:zid,pid:pid,body:content,ajax:1,go:1},function(res){\n\t\tif(res.code==0){\n\t\t\tlayer.msg(res.msg,{icon:6,time:2000},function(){\n\t\t\t\tlocation.reload();\n\t\t\t})\n\t\t}else{\n\t\t\tlayer.msg(res.msg,{icon:5,time:2000})\n\t\t}\n\t},'json');\n\t\n\treturn false;\n\t\n\t\n}\n\nfunction reply(pid,username,zid){\n\t$(\"#zid\").val(zid);\n\t$(\"#pid\").val(pid);\n\t$(\"#content\").val('[@'+username+']');\n\t$(\"#content\").focus();\n}\n\nvar page; \nif(undefined == page){ \n  page = 1;\n} \n\nfunction getmessagelist(tid,aid,page){\n\t$.ajax({\n\t\t url:\"/comment/getlist\",\n\t\t dataType:\"json\",\n\t\t data:{tid:tid,aid:aid,page:page,limit:10},\n\t\t async:true,\n\t\t type:\"GET\",\n\t\t success:function(r){\n\t\t\tif(r.code==0){\n\t\t\t\tvar len = r.data.list.length;\n\t\t\t\tvar html = '';\n\t\t\t\tif(len>0){\n\t\t\t\t\tfor(var i=0;i<len;i++){\n\t\t\t\t\t\tvar rdata = r.data.list[i];\n\t\t\t\t\t\thtml+='<li class=\"comment\">'+\n\t\t\t\t\t\t\t  '<div class=\"comment-2\">'+\n\t\t\t\t\t\t\t\t'<div class=\"comment-author-info\">'+\n\t\t\t\t\t\t\t\t  '<div class=\"comment-author vcard\">'+\n\t\t\t\t\t\t\t\t\t'<img alt=\"'+rdata.user.username+'\" src=\"'+rdata.user.litpic+'\" onerror=\"this.src=\\'{$tpl}static/picture/comments-3.png\\'\" />'+\n\t\t\t\t\t\t\t\t  '</div>'+\n\t\t\t\t\t\t\t\t  '<div class=\"comment-content\">'+\n\t\t\t\t\t\t\t\t\t'<div class=\"meta\">'+\n\t\t\t\t\t\t\t\t\t  '<div class=\"comment-content-top\">'+\n\t\t\t\t\t\t\t\t\t\t'<div class=\"comment-actions\">'+\n\t\t\t\t\t\t\t\t\t\t  '<h6 class=\"fn\">'+rdata.user.username+'</h6>'+\n\t\t\t\t\t\t\t\t\t\t  '<span class=\"time\">'+rdata.addtime+'</span>'+\n\t\t\t\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t\t\t  '</div>'+\n\t\t\t\t\t\t\t\t\t  '<a class=\"comment-reply-link\" onclick=\"reply('+rdata.id+',\\''+rdata.user.username+'\\','+rdata.id+')\"><i class=\"icofont-reply\"></i> 回复</a>'+\n\t\t\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t\t  '</div>'+\n\t\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t\t'<div class=\"comment-text\">'+\n\t\t\t\t\t\t\t\t  '<p>'+rdata.body+\n\t\t\t\t\t\t\t\t  '</p>'+\n\t\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t  '</div>';\n\t\t\t\t\t\tvar llen = rdata.children.length;\n\t\t\t\t\t\tif(llen>0){\n\t\t\t\t\t\t\thtml+='<ol class=\"children\">';\n\t\t\t\t\t\t\tfor(var j=0;j<llen;j++){\n\t\t\t\t\t\t\t\tvar rrdata = rdata.children[j];\n\t\t\t\t\t\t\t\thtml+='<li class=\"comment\">'+\n\t\t\t\t\t\t\t  '<div class=\"comment-2\">'+\n\t\t\t\t\t\t\t\t'<div class=\"comment-author-info\">'+\n\t\t\t\t\t\t\t\t  '<div class=\"comment-author vcard\">'+\n\t\t\t\t\t\t\t\t\t'<img alt=\"'+rrdata.user.username+'\" src=\"'+rrdata.user.litpic+'\" onerror=\"this.src=\\'{$tpl}static/picture/comments-3.png\\'\" />'+\n\t\t\t\t\t\t\t\t  '</div>'+\n\t\t\t\t\t\t\t\t  '<div class=\"comment-content\">'+\n\t\t\t\t\t\t\t\t\t'<div class=\"meta\">'+\n\t\t\t\t\t\t\t\t\t  '<div class=\"comment-content-top\">'+\n\t\t\t\t\t\t\t\t\t\t'<div class=\"comment-actions\">'+\n\t\t\t\t\t\t\t\t\t\t  '<h6 class=\"fn\">'+rrdata.user.username+'</h6>'+\n\t\t\t\t\t\t\t\t\t\t  '<span class=\"time\">'+rrdata.addtime+'</span>'+\n\t\t\t\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t\t\t  '</div>'+\n\t\t\t\t\t\t\t\t\t  '<a class=\"comment-reply-link\" onclick=\"reply('+rrdata.id+',\\''+rrdata.user.username+'\\','+rdata.id+')\"><i class=\"icofont-reply\"></i> 回复</a>'+\n\t\t\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t\t  '</div>'+\n\t\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t\t'<div class=\"comment-text\">'+\n\t\t\t\t\t\t\t\t  '<p>'+rrdata.body+\n\t\t\t\t\t\t\t\t  '</p>'+\n\t\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t  '</div>';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thtml+='</ol>';\n\t\t\t\t\t\t}\n\t\t\t\t\t\thtml+='</li>';\n\t\t\t\t\t}\n\t\n\t\t\t\t\t$(\"#jz_comment_list\").html(html);\n\t\t\t\t}else{\n\t\t\t\t\tvar page = r.data.allpage;\n\t\t\t\t\t//layer.msg('没有了',{icon:6,time:1000});\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$(\"#jz_comment_num\").html(r.data.count);\n\t\t\t\tvar allpage = parseInt(r.data.allpage);\n\t\t\t\tif(allpage>1){\n\t\t\t\t\t$(\".comment-page-bar\").show();\n\t\t\t\t}else{\n\t\t\t\t\t$(\".comment-page-bar\").hide();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t }\n\t})\n}\n\nfunction nextmessagelist(){\n\tpage++;\n\tvar tid = $(\"#tid\").val();\n\tvar aid = $(\"#aid\").val();\n\tgetmessagelist(tid,aid,page)\n}\n\nfunction prevmessagelist(){\n\tpage = page-1;\n\tpage = page<0 ? 1 : page;\n\tvar tid = $(\"#tid\").val();\n\tvar aid = $(\"#aid\").val();\n\tgetmessagelist(tid,aid,page)\n}\n\nfunction addcart(tid,id,num){\n\t$.ajax({\n\t\t url:\"/user/addcart\",//请求的url地址\n\t\t dataType:\"json\",//返回格式为json\n\t\t async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n\t\t data:{tid:tid,id:id,num:num,ajax:1},//参数值\n\t\t type:\"POST\",//请求方式\n\t\t beforeSend:function(){\n\t\t\t//请求前的处理\n\t\t\t},\n\t\t\t success:function(r){\n\t\t\t\tif(r.code==0){\n\t\t\t\t\twindow.location.href=r.url;\n\t\t\t\t}else{\n\t\t\t\t\tlayer.alert(r.msg);\n\t\t\t\t}\n\n\t\t\t},\n\t\t\t complete:function(){\n\t\t\t//请求完成的处理\n\t\t\t},\n\t\t\t error:function(){\n\t\t\t//请求出错处理\n\t\t\t\tlayer.alert('网络错误');\n\t\t\t}\n\n\n\n\t})\n}\n$(function(){\n\t\n\tvar interval =  setInterval(function(){\n\t$.ajax({\n\t\t url:\"/common/updateactive\",\n\t\t dataType:\"json\",\n\t\t async:true,\n\t\t type:\"GET\",\n\t\t success:function(r){\n\t\t }\n\t})\n\t},30000);\n\tvar interval2 =  setInterval(function(){\n\t$.ajax({\n\t\t url:\"/user/getmsg\",\n\t\t async:true,\n\t\t type:\"GET\",\n\t\t success:function(r){\n\t\t\tvar n = parseInt(r);\n\t\t\tif(n>0){\n\t\t\t$(\"#notifiy-icon\").addClass('new-notification')\n\t\t\t}else{\n\t\t\t$(\"#notifiy-icon\").removeClass('new-notification')\n\t\t\t}\n\t\t\t$(\"#notifiy-num\").html(n);\n\t\t\t\n\t\t }\n\t})\n\t},30000);\n\n\n })\n\n\n\n</script>"
  },
  {
    "path": "static/cms/latestpost.html",
    "content": "\n                  <div class=\"latest-post-header aos-init aos-animate wow fadeInUp\"\n                     >\n                    <div class=\"section-title\">\n                      <h4>最新发布</h4>\n                    </div>\n                    <div class=\"latest-post-slider-navigation\">\n                      <div\n                        class=\"latest-post-button-prev navigation-button\"\n                        tabindex=\"0\"\n                        role=\"button\"\n                        aria-label=\"Previous slide\"\n                        aria-controls=\"swiper-wrapper-6dc7b981adf55113\"\n                      >\n                        <i class=\"icofont-long-arrow-left\"></i>\n                      </div>\n                      <div\n                        class=\"latest-post-button-next navigation-button\"\n                        tabindex=\"0\"\n                        role=\"button\"\n                        aria-label=\"Next slide\"\n                        aria-controls=\"swiper-wrapper-6dc7b981adf55113\"\n                      >\n                        <i class=\"icofont-long-arrow-right\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div\n                    class=\"swiper-container latest-post-slider-active aos-init swiper-container-initialized swiper-container-horizontal swiper-container-pointer-events aos-animate wow fadeInUp\"\n                    \n                  >\n                    <div\n                      class=\"swiper-wrapper\"\n                      id=\"swiper-wrapper-6dc7b981adf55113\"\n                      aria-live=\"polite\"\n                      style=\"\n                        transform: translate3d(-281px, 0px, 0px);\n                        transition-duration: 0ms;\n                      \"\n                    >\n\t\t\t\t\t{loop table=\"article\" notempty=\"litpic\" jzcache=\"1\" notempty=\"litpic\"  jzcachetime=\"60\" orderby=\"addtime desc\" isshow=\"1\" limit=\"15\" as=\"v\"}\n\t\t\t\t\t{php\n\t\t\t\t\t//分3组\n\t\t\t\t\t$n = $v_n%3;\n\t\t\t\t\t$newlist[$n][]=$v;\n\t\t\t\t\t/}\n\t\t\t\t\t{/loop}\n\t\t\t\t\t{foreach $newlist as $v}\n                      <div\n                        class=\"swiper-slide \n\t\t\t\t\t\tswiper-slide-active \n\t\t\t\t\t\tswiper-slide-duplicate-active {if($v_n==1)}swiper-slide-prev{else}swiper-slide-next{/if}\"\n                        data-swiper-slide-index=\"0\"\n                        role=\"group\"\n                        aria-label=\"{$v_n} / 3\"\n                        style=\"width: 281px\">\n                        <div class=\"latest-post-box\">\n                          {foreach $v as $s}\n                          <div class=\"single-latest-post\">\n                            <div class=\"latest-post-thum\">\n                              <a href=\"{$s['url']}\">\n                                <img src=\"{$s['litpic']}\" alt=\"{$s['title']}\" />\n                              </a>\n                            </div>\n                            <div class=\"latest-post-content\">\n                              <h6 class=\"title\">\n                                <a href=\"{$s['url']}\"\n                                  >{$s['title']}</a\n                                >\n                              </h6>\n                              <div class=\"latest-post-meta\">\n                                <span class=\"post-date\">\n                                  <i class=\"icofont-ui-calendar\"></i>\n                                  <a href=\"{$s['url']}\">{fun date('Y-m-d',$s['addtime'])}</a>\n                                </span>\n                                <span>{$s['hits']} read</span>\n                              </div>\n                            </div>\n                          </div>\n\t\t\t\t\t\t  {/foreach}\n                         \n                        </div>\n                      \n\t\t\t\t\t  </div>\n\t\t\t\t\t{/foreach}\n                     \n                    <span\n                      class=\"swiper-notification\"\n                      aria-live=\"assertive\"\n                      aria-atomic=\"true\"\n                    ></span>\n                  </div>\n                </div>\n            "
  },
  {
    "path": "static/cms/message/contact-us.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"zxx\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <title>{$type['seo_classname']}-{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"{$type['keywords']}\" />\n\t<meta name=\"description\" content=\"{$type['description']}\" />\n\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n\n    <!-- breadcrumb-area start -->\n    <div class=\"breadcrumb-area\">\n      <div class=\"container\">\n        <div class=\"row\">\n          <div class=\"col-12\">\n            <div class=\"breadcrumb_box text-center\" >\n             \n              <ul class=\"breadcrumb-list\">\n                <li class=\"breadcrumb-item\"><a href=\"/\">首页</a></li>\n\t\t\t\t{foreach $positions_data as $v}\n\t\t\t\t{if($type['id']==$v['id'])}\n\t\t\t\t<li class=\"breadcrumb-item active\"><a href=\"{$v['url']}\">{$v['classname']}</a></li>\n\t\t\t\t{else}\n                <li class=\"breadcrumb-item \"><a href=\"{$v['url']}\">{$v['classname']}</a></li>\n\t\t\t\t{/if}\n\t\t\t\t{/foreach}\n\t\t\t\t\n              </ul>\n              \n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <!-- breadcrumb-area end -->\n\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n        <div\n          class=\"contact-us-page-area section-space--pt_70 section-space--pb_100\"\n        >\n          <div class=\"container\">\n            <div class=\"row\">\n            \n\t\t\t  <div class=\"col-12\">\n                <div class=\"single-office-info-wrap wow fadeInUp\" >\n                  \n\t\t\t\t  {if($type['litpic'])}<a class=\"office-img\">\n                    <img src=\"{$type['litpic']}\" alt=\"{$type['classname']}\" />\n                  </a>\n\t\t\t\t  {/if}\n                  <div class=\"single-office-info\">\n                    <div class=\"single-contact-info\">\n                      <span class=\"icon\">\n                        <img src=\"{$tpl}static/picture/calling.svg\" alt=\"\" />\n                      </span>\n                      <span class=\"contact-text\"><a href=\"#\">{$webconf['web_tel']}</a></span>\n                    </div>\n                    <div class=\"single-contact-info\">\n                      <span class=\"icon\">\n                        <img src=\"{$tpl}static/picture/emaill-contact.png\" alt=\"\" />\n                      </span>\n                      <span class=\"contact-text\"\n                        ><a href=\"#\">{$webconf['web_email']}</a></span\n                      >\n                    </div>\n                    <div class=\"single-contact-info\">\n                      <span class=\"icon\">\n                        <img src=\"{$tpl}static/picture/map-contact.png\" alt=\"\" />\n                      </span>\n                      <span class=\"contact-text\"\n                        >{$webconf['web_address']}</span\n                      >\n                    </div>\n                    <div class=\"share-wrap mt-30\">\n                      <h4 class=\"title\">下面方式联系我们:</h4>\n                      <ul class=\"social-share-area mt-15 mb-15 contact\">\n                        <li>\n                          <a ><i class=\"icofont-qq\"></i>1群：774764507 [已满]</a>\n                        </li>\n                        <li>\n                          <a ><i class=\"icofont-qq\"></i>2群：869094463 [已满]</a>\n                        </li>\n\t\t\t\t\t\t<li>\n                          <a href=\"https://jq.qq.com/?_wv=1027&k=qOLqjBqR\" title=\"点击加入群聊\" target=\"_blank\"><i class=\"icofont-qq\"></i>3群：651403450</a>\n                        </li>\n                       \n                      </ul>\n                    </div>\n                  </div>\n                </div>\n              </div>\n             \n\t\t\t</div>\n\n            <div class=\"contact-from section-space--pt_80\">\n              <div class=\"row align-items-center\">\n                <div class=\"col-lg-8 col-md-8 col-12\">\n                  <div class=\"section-title wow fadeInUp\" wow fadeInUp>\n                    <h3 class=\"title mb-30\">给我们留言</h3>\n                  </div>\n                  <form\n                    id=\"#contact-form\"\n                    class=\"contact-us-form\"\n                    action=\"/message/index\"\n                    method=\"post\"\n                  >\n\t\t\t\t   <input type=\"hidden\" name=\"title\" value=\"{$type['classname']}\">\n                    <div class=\"single-input-box\">\n                      <input type=\"text\" name=\"user\" placeholder=\"您的称呼\" />\n                    </div>\n                    <div class=\"single-input-box\">\n                      <input\n                        type=\"email\"\n                        name=\"email\"\n                        placeholder=\"您的邮箱\"\n                      />\n                    </div>\n                    <div class=\"single-input-box\">\n                      <input type=\"text\" name=\"tel\" placeholder=\"您的手机\" />\n                    </div>\n                    <div class=\"single-input-box\">\n                      <textarea\n                        name=\"body\"\n                        placeholder=\"留言内容\"\n                      ></textarea>\n                    </div>\n\t\t\t\t\t<div class=\"single-input-box\">\n                      <input type=\"text\" name=\"vercode\" placeholder=\"验证码\" />\n                    </div>\n\t\t\t\t\t<div class=\"single-input-box\">\n                      <img src=\"/common/vercode/name/message_vercode?{fun getRandChar(8)}\" onclick=\"this.src=this.src+'?'+Math.random()\">\n                    </div>\n                    <div class=\"single-input-box\">\n                      <button type=\"submit\" class=\"btn-primary btn-large\">\n                        发 送 <i class=\"icofont-long-arrow-right\"></i>\n                      </button>\n                    </div>\n                    <p class=\"form-messege\"></p>\n                  </form>\n                </div>\n                \n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    {include=\"footer\"}\n    {include=\"js\"}\n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/page/about-us.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"cn\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <title>{$type['seo_classname']}-{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"{$type['keywords']}\" />\n\t<meta name=\"description\" content=\"{$type['description']}\" />\n\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n    <!-- breadcrumb-area start -->\n    <div class=\"breadcrumb-area\">\n      <div class=\"container\">\n        <div class=\"row\">\n          <div class=\"col-12\">\n            <div class=\"breadcrumb_box text-center\" >\n             \n              <ul class=\"breadcrumb-list\">\n                <li class=\"breadcrumb-item\"><a href=\"/\">首页</a></li>\n\t\t\t\t{foreach $positions_data as $v}\n\t\t\t\t{if($type['id']==$v['id'])}\n\t\t\t\t<li class=\"breadcrumb-item active\"><a href=\"{$v['url']}\">{$v['classname']}</a></li>\n\t\t\t\t{else}\n                <li class=\"breadcrumb-item \"><a href=\"{$v['url']}\">{$v['classname']}</a></li>\n\t\t\t\t{/if}\n\t\t\t\t{/foreach}\n\t\t\t\t\n              </ul>\n              \n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <!-- breadcrumb-area end -->\n\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n\n\t\t<div class=\"bunzo-history-area wow fadeInUp\">\n\t\t\t<div class=\"container\">\n\t\t\t\t<div class=\"row jz-body\">\n\t\t\t\t  <div class=\"col-lg-12\">\n\t\t\t\t\t{$type['body']}\n\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t\n\t\t</div>\n        \n      \n       \n        <div class=\"bg-gray\">\n          \n\t\t  \n\t\t   <div class=\"testimonial-area bg-gray section-space--ptb_100\">\n                <div class=\"container\">\n                    <div class=\"row\">\n                        <div class=\"col-lg-12\">\n                            <div class=\"section-title text-center mb-10\" >\n                                <h6 class=\"sub-title-four mb-20\">用户评价</h6>\n                                <h2 class=\"title\">人们对我们的评价</h2>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"testimonial-slider-area\">\n                        <div class=\"swiper-container testimonial-slider-active\">\n                            <div class=\"swiper-wrapper\">\n\t\t\t\t\t\t\t{loop table=\"pingjia\" orderby=\"orders desc\" isshow=\"1\" as=\"v\"}\n                                <div class=\"swiper-slide\">\n                                    <div class=\"single-testimonial-item wow fadeInUp\" >\n                                        <div class=\"testimonial-post-author\">\n                                            <div class=\"testimonial-author-image\">\n                                                <img src=\"{$v['litpic']}\" alt=\"{$v['title']}\">\n                                            </div>\n                                            <div class=\"testimonial-author-info\">\n                                                <h4>{$v['title']}</h4>\n                                                <p>{$v['zhiye']}</p>\n                                            </div>\n                                        </div>\n                                        <div class=\"testimonial-post-content\">\n                                            <h5 class=\"testimonial-post-title\">{$v['description']}</h5>\n                                            <p>{$v['body']}\n                                            </p>\n                                        </div>\n                                    </div>\n                                </div>\n\t\t\t\t\t\t\t{/loop}\n                                \n                            </div>\n                        </div>\n                        <div class=\"testimonial-slider-navigation\">\n                            <div class=\"testimonial-button-next navigation-button\"><i class=\"icofont-long-arrow-left\"></i></div>\n                            <div class=\"testimonial-button-prev navigation-button\"><i class=\"icofont-long-arrow-right\"></i></div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n       \n\t\t  \n        \n        </div>\n      </div>\n    </div>\n\n    {include=\"footer\"}\n    {include=\"js\"}\n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/page/page.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"cn\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <title>{$type['seo_classname']}-{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"{$type['keywords']}\" />\n\t<meta name=\"description\" content=\"{$type['description']}\" />\n\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n    <!-- breadcrumb-area start -->\n    <div class=\"breadcrumb-area\">\n      <div class=\"container\">\n        <div class=\"row\">\n          <div class=\"col-12\">\n            <div class=\"breadcrumb_box text-center\" >\n             \n              <ul class=\"breadcrumb-list\">\n                <li class=\"breadcrumb-item\"><a href=\"/\">首页</a></li>\n\t\t\t\t{foreach $positions_data as $v}\n\t\t\t\t{if($type['id']==$v['id'])}\n\t\t\t\t<li class=\"breadcrumb-item active\"><a href=\"{$v['url']}\">{$v['classname']}</a></li>\n\t\t\t\t{else}\n                <li class=\"breadcrumb-item \"><a href=\"{$v['url']}\">{$v['classname']}</a></li>\n\t\t\t\t{/if}\n\t\t\t\t{/foreach}\n\t\t\t\t\n              </ul>\n              \n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <!-- breadcrumb-area end -->\n\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n\n\t\t<div class=\"bunzo-history-area wow fadeInUp\">\n\t\t\t<div class=\"container\">\n\t\t\t\t<div class=\"row jz-body\">\n\t\t\t\t  <div class=\"col-lg-12\">\n\t\t\t\t\t{$type['body']}\n\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\n\t\t\n\t\t</div>\n        \n      \n       \n     \n\t  </div>\n    </div>\n\n    {include=\"footer\"}\n    {include=\"js\"}\n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/paytpl/alipay_in_weixin.html",
    "content": "<!DOCTYPE HTML>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>支付提示</title>\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\"/>\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\"/>\n    <meta name=\"format-detection\" content=\"telephone=no\"/>\n    <meta name=\"format-detection\" content=\"email=no\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0\"/>\n    <style>\n        *, :before, :after {\n            -webkit-tap-highlight-color: rgba(0, 0, 0, 0)\n        }\n\n        body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, form, fieldset, legend, input, textarea, p, blockquote, th, td {\n            margin: 0;\n            padding: 0\n        }\n\n        table {\n            border-collapse: collapse;\n            border-spacing: 0\n        }\n\n        fieldset, img {\n            border: 0\n        }\n\n        li {\n            list-style: none\n        }\n\n        caption, th {\n            text-align: left\n        }\n\n        q:before, q:after {\n            content: \"\"\n        }\n\n        input:password {\n            ime-mode: disabled\n        }\n\n        :focus {\n            outline: 0\n        }\n\n        html, body {\n            -webkit-touch-callout: none;\n            touch-callout: none;\n            -webkit-user-select: none;\n            user-select: none;\n            -webkit-tap-highlight-color: transparent;\n            tap-highlight-color: transparent;\n            height: 100%;\n            margin: 0;\n            padding: 0;\n            text-align: center;\n            font-size: 15px;\n            font-weight: 300;\n            font-family: \"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif\n        }\n\n        a {\n            text-decoration: none\n        }\n\n        body {\n            background: #F4F4F8\n        }\n\n        .weixin-tip {\n            display: none;\n            -webkit-box-sizing: border-box;\n            box-sizing: border-box;\n            position: absolute;\n            top: 15px;\n            right: 20px;\n            width: 265px;\n            padding: 55px 0 0;\n            text-align: left;\n            background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAACICAMAAABQgAwUAAAAMFBMVEUAAADY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fY2NjY2NjY2NjY2NjY2NjY2NjY2Njr/TvvAAAAD3RSTlMAxy89c9CdTRyG7lvcD7FzqbJAAAACFklEQVR42uWYy4rkMBAErZdlPdzx/3+7LAw0tH0Y2orDsnnyKQlSVaWytoc6xrEpigFoinUAIBnWABAE5woW9o6GPbGwI1jYGSzsgoV9goU9wMLe0bA7FnYCC7uBhV2wsE+wsAdY2AENGyzsBBZ2Q8MuWNgH94pLbgELO6Bhg4VdwcJuaNgTCzuChZ3Bwg5o2GBhV7CwdzTsjoUdwcLOYGEXLOwTLOwBFvaOht2xsBNY2I1f6lhaenvhrfpkAblab+k9b/OD0iuX2F9/x8D+7ZL2pmpbuj+6o3Vg//oWmPU9p65VkXL6+oIJ8S738nwj62Pb1lvHACH+fBs7sG59U3yrVD3rce3GVcp8qGkPAGTprQUYy6xfaE8i82b6S7/pfZnzdYQIHeOXdfYKpHoFcmrvWlM8RW+CDO8JMWoNM/+FeyB4UfMpL48g5qG1Iqc29YI3mqq2knXvEJu2onJoQy9ok4mkQZf/GjqitUvQyqN6SU8NOvOhHq25xNCWj6LFQdLiyKuaZWpxBC2OrFVHxdryElbQsVtBx6KN0qAd4a71yo610uxa2b0s5xg052I5p26d4MCqusZFwzrAnqQhSogSMnkNcr+GUS3kEKWS62NJFlNCToWLZpWMe14RReGqdjz2PfNECbkGbrQ/Nj5q5y7j8/HRTW5UhvHfA7Mdzitji8rfWsgX3gVZ91eO22odKed6LLf9A/sRnc74RV7lAAAAAElFTkSuQmCC) no-repeat right top;\n            background-size: 45px 68px\n        }\n\n        .weixin-tip-img {\n            display: none;\n            padding: 110px 0 0\n        }\n\n        .weixin-tip-img::after {\n            display: block;\n            margin: 15px auto;\n            content: ' ';\n            background-size: cover\n        }\n\n        .weixin-tip-img.iphone::after {\n            width: 150px;\n            height: 150px;\n            background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAMAAABOo35HAAAAXVBMVEUAAADq6vHs7PLu7vPu7vPu7vMeiPL///8cm/UarfcfdfAavvkczvvG5/oDAABd0/qh2/r7ExFSovWGvPPi3c4FCkfSv6VWBwCIhpJPir+pSCoFSZG8hWdPUE/v7/SejHF2AAAABnRSTlMAI0XUl2pd6vM9AAARD0lEQVR4XuzYwY3EMAxD0Ugk21D/ZS529ziXITCTODFfCR+y7ORYQlVLJPFr/uEPSamrjjiqRWLeAFJdG2fC2LBdsnrpZBfbI1gT8xFgP32i5qOo2nukMmDN+SL2fqXSq4g5BVjHvQlzIujOQzWnY2VTGdg5fwbomamSS7MAZaoM0HNSJVdjloI+VlWY5aDyBDWwcgUadNsTmLPIWRxzBxrQGSsDM1YGdMbKwFyCBlTeVgblCBq4+BHMUey5rc66MijrysCsKwMqrZxaWe2Gzmo3dFoZlFYG5clgYFoZmFYGppWBaWVgWhmYN4NBaWVQWhl0zbdzvhNrHq8u+H+V/1uYDSAPLANzERqUi9DQuQgNleX+PmS5G3j5cv9h145WHIdhKIBu65SwxOLex5kX/f9nbuVoiKHDslltpIFZpa2MHw9XhtZdc0rX2kP+lisVr8pjq2VT1XO1qgNrLamaY+teYVXPdS8YwrWw8gdxqbGqj9aSPoRrbSUNYv0Q1g9i8hCWV+Yg3vQ7Y+kteQi/zyA+aq3qtR6pQ/h9BnH5j7UEgpWDpUIC6KMAgKIBrJRotQorIfqnBUqFVvuyX6AF/bcFyY/WPSNYGpD6p16aEK2HpmJxprI1n331jtkR1EwsfXyxn0eVfS7os6ljjTUM8ChqIlZLCJb+XaogA8nfE5o42GmuhNuLloYleEmUYkrWtC+YUNOwWsLl18kJhCMZiHLv6540GhgdjWfDpZdHS+N1MlZibzEV7yNZo9PA4NtyNlwar8uDpSdiZTD06ICHyLo3woMHX38QU+JY8Wi1FCz1WB2RGTsvWHLswgPoBUnBavXX9fPJjj1a5KF0NJ0Cxmc3Ujggg1jxaLUMLJlSRPvA5NL7Zn1vLijwzmkSOzOw2tV/XPvTXJEeLQfZDMhe47G+r+FmNCfioNQAVvymZ7keS2UQAJ4YiIvAoT4Rw442rAhX69tGvR5rCdxSRLGUGAr8gOpjw11eX9b9Id2UOqze3zsDWNG7i+V6LKPZngLww2qI2Ybtvjy2ty89h7aA0D7f3n52MIAVjJZejiXov2i3ux5HdRgMwGf7MYdoJ7JLbgCh/P+fubFx91UQdKeVXtMhZkSQeOSYqzQAkfaXNTganwV0MAIQ9337xLKuc7uQTMeq3M1Mr6xcRbSNkjWI3CR0Isc/AhKZakundZn96pUWdRPUlY1V3QpafgkSyCAJKCRq0NNjmaLUpLKxrsftnY2lvgatoKCF6Lwg1Ycxp/XxmJKoignqqRZzD9SNjbXZSDazLbXze2FfwaVZDZKDWpSNdWNuZ3pl5Vrd+ns3JrNKkjWkz5s8cQvUpZKx1Hmg9VEks1pmUZVYzOdti7hN5UbGciBR/fbzh1rD+jArVTzM2tYJFm8dViIWvoThJB9pWbtqMcvuGZK5WJW4+etFx4LWB1hps1qHbbLgOUrGuvA26ZwWlkjnlNrR//ZpDHHz5FbLDL5vyXretXhbeioPCx0rq2xKHp51VshwVwrWYXpsVpgj+vwmKher7lYhF6sWvF3UTIrCgRUucPy9Z14fHtNzDqgsr1ysC22r3ElhBZeqhMpPD7QrtwrN5ydVXF+5WP06vFKxqrYaEZHgEtTMD48prNbZZvpsPM3HSsW60jb3HhWWvWExpjaKXx3/9tc+WruKhhX/s2pzMTUzu85MrH5n3Z2LFaUkRSWFx4nWkd28dlbh5UTiZM7Gxbp3LYuJVcVrwU4gQBlZQGfPZe0qolklTIgSE1Fto1QiVt+0KhUrm4O3LASoUCmR9gGrdQgq3OQf2KyWZSpWhdWFi1VMQbN/6dNb4e0qYhlSBKREs+oGXrhYF6xCLpZEg9GsIudcB5AzrJZ5DzmWrHicVCoW1uGVipVHAwgv1fTDwBJEw+px40M4ihhdpmJd0bKoWM4j8ny1z6ymYW8F/1wsUSYWmtYvLlYxgKKq8na7Om9YWIsS/IWJhU0Edy6WPGvgLay5s/r6N65wse7o70SsOnb14j8f+z+kntsSRMz7KXhQGkWk2FipWDdKf69H/b0UkRFaOPnYpUdWoOzmGpTmFmp5pmJd0bKIWNoAxu2VioOhgjAitdPXFEpo7gOEwCuaFQ9VHhaa1oWO5SFFNeuYhheVFUdvtXR11U/E4qZjXdDfeVjFAfbv60M/Pm/7WnqrGRPswAR4jZYUHhY6/I2LJcYwjikB5+CAwuhWiPkfcyS3KMPAxEKHv/KxJOeay6YVZLsf0rzuGhZuOynGNHgIDwsdvpKxhi1QWQGGM9LBOs/aW4EKc5BGJDpWxceQhzW6QTsQZ1wp1hK0FpAc4KLD29VIxvqFjyEVaxQZZWyRIDUgR0h7R9NCc99iX5KB+4cbe9ttG4bBANw1iaUVIMb9vNmGgu//mANFsYwXL7UvZBSi5Qg+wAA/ULQRCQAeipWvw9sJWC0pb8RPA1pWWma1L4Zi5evwOhxrd3wnp9Ku9esA1fiedf1aWFxcqvet933CvrprxQlYl3PehsCnauJU2rby/mfZZ0WkbXnLMKz8dtDBWGIrhPTTflWh3conqodiPJbal8NwrH0BU0orrl8O69t4LK51CRCgHSzrzU+RIQWVSvXbfGxvFaTEzHAsHo/1OhwLzuT/0qAhrMLPsCHFIEcNsM3wCxBSVbsfw7FeX26jsTwRjaa1WSq+htKq5j3/L6yEBOyHRmPdxmOpZWL7s7yhSaWyErH52RZPho7Huo7GKvCEt7UcMKwc995nu2WlO4QFjRRlNNb1BCypi+UCZmOwsd69uUdZEfyeHDZv7u4sTGS+MgVWMxIlQct8Y11JY2pcFBA5HlZigAP9efZg8AlYl+FYBANyqArBsg6z0qgsCaIcMWUEohDl00DDsS4nYJVMiD29LJHesKKy4BKr341y/MADq5J7ocyBJTUSYywPASrdl0I1qRJqHWkoVLxlzYAVCFLI0B6iUq8r5WVvrOkqnHwOrBJNayskvhhkOR748EeZBYsRMlIfrUxLFQed+tLuLb7yCVj6oidgkfT24mpIGKgXFmE5GEIILptoGqzCLa1ORSlTqVkpH6WK52SBzoOVPEIkCcAl29XxEA0u0ERYRSKpyC+bez/zZuPtfs4pz8QII+3VWmbCaiDggPFsoXHJj4PM55jySs7J7R2LZ8HK0oLIXfJupRxEtgWXH+f8zxnYLxhBhr/snUFr6zAQhPuaZxkEC8vsXf//Zz4mmku7xM85rE1FNbWVqrn0Y3YkElsmm0WWDvKPPOHeWkcARlaRCk6dhqj0DvnJQuysGpZUD0tytC//J0uHVZloZER5LDw0v5JW7Is5ix7qvYXTYfREzGjvHJXYJWn8Gza4obcGjmEsB2s39D4zJwZZCd//JGA85nmeQFpsXH+sB2v31tmaj6AbLARCLPSTDo3rVaAJuT9hswhXhDWCrGAGrbeao38Hk3GJmF6Eg7YKGnQW9rgOVvXHyrkQAbrCwABLYF6h0hjhOJE9aXEgzYQ/9DP4LFfMxDA6w1o/1YRLv7iDAR+dDb6vCms48TSwb0Gj5TLMkSUB6o3ewgwsH5fC2oph5fWDEsdCEKyfajDhg4UgpsD64d9IZ1oN9ATIqpGX83RGQcas5DDRIqtLYX3Ww8qV2GEM9wgZhiOvAwyKOgvNhoEmVpfC+iy85OiYViMnEaAcB5bSWww0oqhmVgtcn/WCFlmB7viaXJOL1EKWak+6zVyFKFaXw/q4CFZeQYBFOFhaOqghPOpkKehNxNtStl8Fq+oC3GMZupqxEolAQxAl+U1dWJvZZjxR8LFfDetRf2n3MS2+gNNhJMD8/gKLCDkHDsxZE3HE6udeB38sU9VBRWZGEpNIEyw6KfRnn6aTwsZ+D6ztDlj7kLmU4gOTCiOMKb5Pw7lNs4WMl2x1Jayt9EanY5k34RIMOmcnsP6E1Yzj7FWPUti+3wLrs/oWumNzRVdDzDLDTmATFqFhCBROVWD9LXQfF8PKuCTIYUOwBg+BkkBUd8GqvO33fVya7UywXDmVcv0eWI/KG8rP40JPLQ/hDKr6G8q3+2AJV+aVSRHVrbC2wk0w3uf1AhhOkyrfBOO26TDz8ggA30GFJ1I3TYbVG/e8bzBzDzV3e89S1Rv3FCV8jW7Pd2r7hXUq36tCq0T3Rxb1C+v/Kth6U1qP1eP8PtS/sLaK7YKldVjlZw0UwFqL1ajZ4lxaDNbfqs3zpaWMtVU9lkFaB5VWWUWLB2kdVo/0KJkCrYFKkVW4eJAWQJUfFjbK2n4VsH/snc2O5CAMhPf3SKm1MYYEyPs/5jahe0ryTCtpsWgv1IUZy6dPZafg0vs4Xf1htSlOIedw6nwKz+dw6v2fGZ1TeH0O5xSe5dIpJtL353BOob0fTtl7Yccczik07zRT5nXmctSaIev6ip/r/eqKn+u911rTWOcpfqb38/Qwc0NHepi54cRa01gd1prGMsF0ily6rDWNZbfW3FijraVDAIi4/2GswdYSYB3AKiDVk1JgHW6s0dZSYLE1ueulYy7C8rdPFfdVo5XrMdZoa2VYY2lAVXJfMSBaIw2rQWNhpXtTiVSpHQFGaYCx+m+IGfC+FMCXhxqIDfAx1vptt9rgi3vl0AuwMqiKveHL8LHqONaOW+E4a2UAOFg1Wh7A2nYLt47RRoAvnJVj1Lsy/KJVMR6kns5SObRhFVFHjjzGGav/XStgseZZuXY+w3Kni93It2HjP1WZw3wCq+Md65+/a+W2mnJcCGsxf4moGFismZwg4eEotDM3PvkY8lIGwOI71mhrScDSjtU6q84M1/1R3FC1sPbYVRlY68ldZU+iGAOLxhoYHzYkO1512+yUPtf9Wv0BX4pjbW0NQPmvsBgbRu74Dd5ZWBIqCjFGU3jX+mxN22fzEiwN6wBY3O4DB1E2ILUPVPA3EVH3KFeV6IxDGixb08rqEqyWogjrOdjeA/4uJq2OIRy04yWgwgqglgdFLe1fJnYlLFPTCuAclmQAPu4WVot6KFVHjPFIHdt90CBmADGkPddQHVoqdGyQ/ISnMZYAjqGpNUiE5eMhoJ1Hj+QAcBcSFvMsx3DAEHbkeF5c2pYgBNuRPj58hbBMzcKCUesBAl4u+ExYHdl95CBKWPYvYElZ+SFMuwJpkdpBWKx96axF7tLn+YC8ulfRgYGOHR1DOOyLaGDxUkdYGYnl1mdqhPV+dOBVgR2Dh5CD2A+L+bRBUSy7jQ6sWVj1cIa57GewCD91DeHgL6KAsDghH1bBn+d1SANhmZqB9dmgZ7AUWNjRMYSDB1Hb24gqsKrWP2/VWkc1AIkBHvDlxp3FWjcsCUjs6BvCodFUYbW00FDlV14N060arsEytbdhiYoGLPSVdwTcH0eH3REVSVXlKVVtdalVPimI4/IxtavPyhuTuaLq9lE335aOO+GotcVwMEZi3skymEkDSvkwVkiOPveuY2ENW1vjpZHOeu1B69c3Wf1t185uGwaCIIjO0Z2G8w/TsAX/qyHJosh6IRRmDxK79ZjmlV9geLgWMC8bArrw69Hc8grkfn2BWtv1JM1BGBgOwoA5CAOmVcC0CogLVkC0CohWAdEqIFoFRKuAuTMETKuAaRUYvp0Dvfy/SmrRKiCuDAGztQeGrT3Qy3YVENtVwGxXgV6WYEAswcB8zHDt1PuJsQrMMlYBMVaBXg7BgLlbBVrHTKWuI+plBQZmOQMDPlCudR2dl1QBcwQmvExVwEuqwOg9qTT1iVpcQRNe1l+g9U+9Vl0nMGKnSowolZjXrMfV1Cm1nzxgcteZjZaRSrQfK7Zy15X03Irlnabrmnqs+5qtbpnQPbak/fWX54cke/oYlb4BOpAsA4h+WeAAAAAASUVORK5CYII=)\n        }\n\n        .weixin-tip-img.android::after {\n            width: 173px;\n            height: 240px;\n            background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQwAAAFwCAMAAAB6srUbAAAAYFBMVEUAAAAAAABkZWg1OTwAAAAAAAAAAAAAAAA0ODs0ODsiKSw0OTs0ODo2Oz07P0FYWlxDRkhMT1FlZmh/gIFyc3SLjI2bnJ2tra6kpaWUlZXl5OQbIST+/v65ubrX1tfHx8i05zY7AAAACnRSTlMCYqz/GzFKC/335XMVHQAAG3FJREFUeAHs2NtuGjEQh/GKJkpysSd8ruT4/d+y88ljAup6U6k3GPpX6cKKIPxjPGvvj/38z9tTZl/idDpv68dTZd3Op9ONh1I4c17WeXp/okzzupyNE44di00wfj5RBGNTjV2L58LY0cDCMkfU4qk0mCm2aYDxov1i32JqeUgN7Rsvb83ipBa9twufPB6TQzVOVQMM6RdYdOTWjYjHo2pI3/jCWMRinjpstBiyPCrHNIvGAgYWrxvD3G8vUFhjnDH2XzgoMT3cpca6vaIBho6xR+F8jNG7ynGoMd1m9yS5w2vKBeNj2rVoFCFLAhytOPoU8yX6Pj23rvPV4b48+I4fXxjv/fWIj7mU8lmKcKRWHF3geZVsa808Ec5t11nX+2s+74cYWEhZpBhy+awRDi2Og2YrWTSbFgNnzoT/OSwbUONgYLFYZkgRi18SNEqOqbMk0T9h2DUWNcJcs0Zi20E8uHqNgqErkURZVAvlyFFqg9LoXK4tkQEbCRwS+o5zKSXn9GAsHzEKhk4SF0OtC02dKcburtB0XhFnGLarNYCFSz5G75P3UY6JuTYKhv7K2jBuKgOMzlCoJUqAJCfj9s4ZPGzFQMPHEIJo4DkOBr+ycR6MplFbKJcUR5X/URrVT6eClkCiPG4x0BgOg+7JV8+VgxQsdCzrvIsBhIycUcvgJcldY0TRbR8wEMZG98yaUpQiBx7RHWHIP0YesKjrVuPEVSO6Q2L4XACoJI2Cc8Gb83ZQGSDQGqiQ5GiodXpgQeg6g2G4mEubGjkQrZGSjzEoDIbMMwqjWZDIY0yM1inqj1opwIjfY2hlpIoBJKicrhjbaBgsMaoGGLleZeXMX2Bc+qexutMjWACbBsVoSy0pjPbyGAMCICJRjHiDEQbHKFktvsVQC50rrN3PF4zQksCYhsRAg97Ji0MM1ia1JLxzzgcwrGAkxVCNPG5lEDDKFYbvYpgERkyORpF3K0MO42GYmFtl3GKULgZLeFbiPrXKaD0DDWGoiX7IRZdqKEbbrIWkY9nbwsMBhpQIGLfrDI13Fs1ppL2JblmvK0NvadjOtrXduyCeVAyBaYHlstAYadea0CCKQfRm1zZ37iDDobv4GuYJOrqZhcW3fe84N3fa/QzFaE9C7C6mf7NztruN20AU/bH/4mbj1VesBn3/1yx1dKxM4JWUogVMVXMDx/RIDqADcqSQnBuWWdqe+T1+OemHJOT80GFgTAmgZQ60CBi83QbW69fXIqExqZnkXBef+AiX7lDTftCIiybMa5S3wfnL9ZUTZ4XLy3nyX0W88Q4T16KOtFRgl+e2QOb7zqJaWKe+llYQH5eVkyOtm8QMQP7jtbvc6teUTQNxtY0/cSQYZgBwtKTCXRRoXkV7XZXHfhwLhp1jwjGLhbBvXcc3zjkaDHGEkf6E7l0LDLQy0k8IA60M9FPCQIJIGP+VEkbCSBgJI2EkjISRMBLG5eRagZEw/ji9EkZQHCZnZ5E5IxPoLox8zngqjISRMBJGwkgYCSNhJIzXu84OI5ZzA+TEMNyPoARyVhjuVFFxe8bpYFj03HTKCvZ9GvSf7WX80A6Rh1ZFMGDB5mdLtu/eKrsoomLMT6viGFoaVcCgY1jni9j22O0V9Jtmfirzrk4Sy6eoEImtkLergMFeekqei+ZK576VxqYJ2KSQdsFDUEhXj/ObyNwOLRq2wPFUGFbDjxgDuGmcil1tm9ZZsDcwZl2ycENQBhzxd5ERTqVlqKFFmqrAP2MpOYGGld9bFammGZwymk4Ai38GORgwXbfsK0dNR5tTaREya0Pj+f4ZHXW+oUyNyu/1shl9JqiuaBFZ5o2YG4wnFMFXBAqk6baDAVHO4Y+4O7sO/4xYmVW01TUcWb3+CN6DqCkgRgoGwsyqn/AAhOKlvgWLUULDzA/4T4aBsUqs2SuiomrF7cEaFW4/c4WvV0jdijekInuJ1Vt0oFEHAU4traIBpsNIEcPTYcyOO6Gac6ax6jLDdzBjIbkgroWOQcHe0PcTigEKPQCgMR2339iERZFeHT+fCuPVCxNGoEHXWKlDopTrNp0EDPqCda3AuMFgqm4chMGQoFbenkGTEmFx1gCDCyN/Bo8ZHjgoSt2DgYTRRRjW7j3CwEfC7DJGGG11MKCBVopaY28KNOgZDANgDF4mPWO0/rXtJ1iMP8B51tS7dJeoDwY8/qSQExirCfQBRsfVCmOwIppMMdMQBvkFGMNIpMRqhkHq2ILBOJGGpc1zZZcwhgcYiDuQQ0qjoqPD8DnjE8aNpxJKQoGhDQ/DRBhDhMHdBATD9AVhdDXDeF+D4f92jpP7veBNWydi0qBnFEJ0lXHsoTE70pArQs8YK4WB1mHQMwKM9y8wkENgGBgmPqk+wmCYoOqHyft2zgjDJMDgqQMW6GvO6JenLoOkVHhW+pyhtmFYJH2nAYwGhxHk1c9WZv34CYO0Sc7gIHTAoZHgIXsGMOga5fUJYzRVeCtdfIlKY/GX4NGdYN/66BGnDI53awXGiC1EoeFTJVXC3FK1MAsw0KgtojCi5cbxYQy3OG860+ByZdF74QwJYIwBRkHTAePmnbUaGNEO1Efyv/Zg0A1UT9doOnDMjpheb4kS4zXRGIXR6xNpn2GesQoYA/YZaud/E2F8zt0g56+c96ObcJxoF1w1IAW1tpPePPVTyTDBWBpnaX/W/2uNNjNIr4xO51x4NI3znUZLrAS7YKoBNecGdeBw2u/58xk+OUZtOSnpncE1M+HttUzSQuPKCUaBhO6m00yJS0/9qmFCGBgjZpaLuDV649/0zriir4slk3gnSJSYVIiGb/vm+u7TYeCBS6JX47g9XQ0NZesaF9VowoCmwYhKvX42OLEOd2lTG2p7hvV2v339nTxA8zGoZGYjqgrfcVZ7oljn+Wf9ljN3g2Kp2pHeJPjGT+NqHyhOtT8juogEuZB+0s0qDwLFCWG4vS38TMp9oP9KCSNhJIyEkTASRsJIGJfLeUlcLumfERVhpDFAWkYErcJI/4zLiZX+GRv+GT9OrfTPiNqFkTASxkfqY4HxknpJGAkjYSSMhJEwEkbCSBgJI2EkjISRMP4PMD4+EgYcXtgf+zd55rbjNq+D0Yu5Cu3oZMmyyU/S+7/lNuUcnHaS7gLG34tZxYSykqDhAkkZifVfJD9chpBdKmOD6+p/uIzQ8ISLlx8rQ8YZr/D0U2XItaDT5gZg75aZlL+ct7JvyvHpw0ro/0JEfrn+D2Vc1EUNkeswViD6WXWs9EdM9K/XTojIR0c7MdwVWE8kdjLHhJXD4omfPB2xcXi8QyFFXjlNxgygGJGESRpQjbgMYBL6AzNmoSfX1rsrYdFdkQGNNqZIIxciKfD3Dy5LVZqnpXYOQ0pmrHRgf5/PednJUT3fro57J8iQoC5GIZlQEwPIJLQA7N7bEOXCsPKAyCzAMohFvYiY6MYuQ5Xon1jwFJWRSBpqrQxL98XeR52EJDsHGREPMpFkvJJPqowGtCvRZWJ0+hUVYKF3XFpVgPqg10hkxNG37K4UkehFBjXc8ELS2BEtKoNHXXQZIXYyco9d22DGgjCMo9+wFdF7bTbnfWAO256bMeveGTJ6YQQh8m1mKGx12zLY0RvGyhsAP9lbIyTeKb/JWNGmNE8bA6mMaENRGQjBli5jrHhFtZX9/ykkG9TgHzPDMF9lY8J02szIQCPlKhM6tWsun6aGMeYroTpjfIpXszFo3iLUWqsVyL/KGAo7SRxvM6Oh4++Lm4xZaWg9sspYtIlqXW4V2V/YURlGo8qgc2SMDVily5gylF2CJKDQe2So+jqxyEI7c41ELrq+91tlfHmhdO89iWsnhW3RSlpNl8G00WfGLsz3WDT+FzLEsyYvQlRwp6iM0EvkLaFoqkcZlwXIY0ShgPkpY2yzUJmlY+stsfGyQR51IM/V0ZWeMlYk+oMMEVEZX482ETlDhgWQxDma8KD3vwfYC72jAVYOMpTI7KhgSpjuMpQQw4N5z9PyDnB/iPJRhnmRcbUbERy24GfMGs6Q0Q9WKnXBkyBEZPZO/h6xjJWccyaiGI37bujVW2GfMsQxDkw9P99aKRXgBnAprbWwyzgcrQcZqbSjDIn4jfp1kgy2RxW3U8R9kCGmAjbgSX3cOMukVy8yOKU053V7zEhye6GdKjhIAierDnqbOPU6Y+1+uwwhWwG08VgZdtloqMse2/aYLie1CUrgowzTn/jQJtemptyS81LAW8iJFLuY3kH5VUYlkcRBRALSnkypALITolCBWuaoMsAKcIsqY+0qwkhHGaIErKLE82bGXsQ5NDyJRIOJ0On2LTKjt8LrAO3dPvVDuY6vMkbdjNIVdRkMbsmL9BqJmYHSZVSFwT12GQ3M354mtGCSk49WalAmsplxg1urZYGm+T2+2ILwm4xRDfXGS7/IEKoI5iGDzMxNR0WkpbXSKk++z4zrMAyXGeu4RWpamTaM5VsZV53WJ8uQBYrVLp4rnjAQhd7SfpOhazZiKgp4DJiOMjy4wT5kSELvg5V4X/QcY3y5z/DhokG+lSETCp0uwwK36SAyhsIHHVf6KxmUsQhlNMqYyI3jLsOUrF2yaCKhRjFjTzia66Qy2DlT7qPgeLTqpfKtDDGMIGfL0BT6LCNFqOFBoo8yrCgqQ9nvTKysKjagqVq0W1JmBvs9EfE8q4zeUF2GiCz3HI8ylFcZQg8ZlFGITpchnrHB8TBPO3X4LCM1pYJ7SL0mhgUchGhy12B8l2GcDkiOWktEl8uCtctoeWkqAznn+l6Gd1/tJsMYX2/LIavzU2U81CqrqPqMGz2pzzL4yKwegwXHRxkzContdosVKl1bPyNUhtJlKO9lzGA8br4AvpBS+sc7XYYyY6OQkJnxIAp9Ym7WuAMDUVhGmh5ZpVabJXGt5cmRENlSlRJ7BjU6N9WJSvPezdUfZCSeDiOt1bruy9hai9SZ2u6ib9d4pozdRk5z/buvx+Xw7yPy6dtk0cURY6//9HeTyHihWfqHCP1TGeKWg466XuVn/9ZqplJ5o+b/sXPHJgCAMBQFC5soIaRw/1l1DMHLCNfm8/al8IXP6q5cr1PYZ8CAAQMGDBgwYMCAAQMGDBgwYMCYMfLrC2UVmRkYMGDAgAHjsHc2vW3zQBA+9GykDh2GOhT9//+ynn12sAJYBe5pcyjfAytaMqxHsx9i8GI6YdwY/2GUrcc/0ADdhQvQjvZixdN3giHDFw1ovIZC6JIhIOuwVgpDnePVPGb6NjBwiXuOF63MENLJFQyQeXg/rxQgLxW2PCzXsH4Y3BqOeTj+vcQijdDKFU5HPrzbWq54aYUlGPAF5cHW7Za1GUu+6lOPkjAVtNGWffPKPjBWzIsPtAQSvkD/TB++fh+18l/Ep/0jTPW2fHetJFtMppNk+UrmSvEKq7ZhbpIOUmSyPVczDJ4zxuafM6VxyndXwggMOJLGsOHoETbXrGopfTp13tRZQBKiMbhE9MrDrh+GhCEjyvUR3pMicemHWDB0Y+HaODXKlxeLc7yNi9cs22t7IKfdL36//a6c5eUtx1akgYnkF06Zt4Ihw+oY2OGPoxzBxQRXYxv5LqjZvfZAQUFPS/1+rRUl4UuqrJHJjeDeaegCpQzEf2B+Dgx7YBeOhGGXy9KQvdCT3pLlb7v7t6PEP0op9Mki810+rouUEVLA2hQYuKP/hobs84FBnJx9wQcs1nHgmvtLubtdGa6rz7soR3J7lhLdWyRTS3QKynBIAEP/H2IpQ87PxiEYeGOL0KF/yyQ/LhC19/acUbVkSe8RJzh7o2gX2w1GuFlfwdCxYSjiRCNPXWn+Lfrzubo+JaWVftf9MIiSNfVrl+y6HeYSsopt/UbjAwZ3SJisChOFWy7b8Fo4gBEawEg5YEzCk36vGwbCmPHLAol9ynmUZNQNRkTSDoMEGjDmImeoigLDwggY4I/rbbL/Box2W+NjGUZI4+GyGYc7jJRGwSAxjhHfIBY5FGag4CNggJtiMgMRJ34D92+ajMxmyJiUx88/BjD2cqI4we/fPQWPXwMWdFNCK2qiFGoYD9qMNakwqatHd2l1+rSyaTUyTHRMG7YXV2AcCEMjYWiBJXegmT75cgqrswYDGJZGLwxacbSteVEk4ka/huEHmzA+3G0axiRKREPrWhQeXukKBueGNFphOEpQMDA+5xEKfgHGOo+CMYmVFAbvpSMT0vCLfF7u5sM+9J0w6oWVAK7sp+z4FYw3w+DCEwwnRWCwy0HGpLiw9xOXo7+VwfPeqwyihLxJ/eCZcqxqcgGDeuz7QA7AmFZGPm32LoChnpvNLlWjYyqZxhU40ffmDEfJihqikgoNUoCryQWM95EdOy9svMIbxgoWCeMnMLKfzT0/XR5Bw8x2V2c14QkP9KtXdiWChEHOECUiee/IVYCpDHRpI/vMHOJ0giF0bjNvkXOcSZnv7HX9aIWBXvXIEG9tUBAFNF0Xm6APdu58R1RRD0lGH2vTl0/cStC1xbX6lpjZS2+FgV55OZV61WV780Gz2+S/b497J1x3pBqhiTFyRvwCBzeyAizfAkH9jaJ7Q9hyZy8h3zk0/GTHVV+Yf/eIbAiXoCKV6D9NoALynQVYBA1dy2fMRtFaTbxlTyjr6Dn8XL3XdfUntT/sm0FqxDAMRQ/Qeeqi97/rdGJ/EWPHdFMw6L+dlBiGZwgD+hJ9HNfmIw2NRSKAaP2rGIdQfA7HGUMkiPyZWX1/0ITj+ROPkBdigZ6ruLvUYQ4ZL+qKIKuLdq1/nfyxQS+oEFkeNHimkxXTzVaKJMw3NuDkzn9gGZZhGZZhGZZhGZZhGZZhGV/FeZJhGa/i3GW8yrOWYRn+ZixlWIb/Z1iGZViGZViGZViGZVjGATIQc6uaDIgO4t4qJUMhI61la5Gz9SIoJIPoQa4eWuoafqtcyy4jA3ItsyXcLxFaU96uVzIwdzchJzVvjw+QoeBzW87LvO+P4uCbcDss0k4wdsZeAjCG397UnV1u5CAQhI+wmsxPQiRn7n/L3eqPz3glL9I+2e4XoM08dE0HcDNVcfbBYAxSK6QIqXXxyNf7t/yIghkVT60/eo1VH7ZKRjhlTjQ/gmKxvMugCoVooWNQ1HaXGn8Ii1QGPyS9lVPtDH0lDqFtZDNkmt9E42gw2uf7BwslNUTTdbxHURucvQ9/Ip024Yy1+IOQ9WFDaiPIpAlOW6L54WDcX8v7J//ypsJfloxq/P1ntEs3kbKXKFx8/ZF4OdXEYHtKuBD3uklPCmqdO83nTwLGd1nlRvLC4Q4YJIYyCZL7Vi4F0FTEMVhHYMBMWCjBgAYRBXUBDgbjQzBE470ZLV/7YMA/GPoXhUZSHuKJKioSMMoLEq11Gl/H617UYrnwZwODv5kZGDIzCoTnCwJrdmEVQmBD+xexYaG0AkPSM/zWZ5Fq3cVPlxlzMCRmhHP2ChZy8ypAQhUoo34KhiSWoAAYnQn9apI5rgWG/KUv+NuyNiV1FxiQQTutdWQFlJ7WSdV3KZ6mxu149uJ/g0FiQHEMGAvc3UdRXQHjtfKdJc3Ddy2IVOIBDEmwUe64HBgqWSn58CXbOYthObOolpM99K7+EKzeDCA8qjajesL1wHD5bMYNGDk2DTBgyrrBSJoXDOnAvcEtF/5ia4ZgZD8kzWHvdn676RLfDTCQhkCvSgGiLRjoslxyAR2byRaMnLBrMwEM1Hv+BkMZCci9gsGDhgDRVXeTJ8pcCUYwslF69sAVX4HRVjDcWvtRRPEZj6AXPWe0WjIaYPCe0XnNAQoOdVVHWmxIWAkGMxv+8h2/ZvyankAnugA9CQADUcNOcA9E6Aw9MhAMidT1zM9X6cTUOBcYZoaDCRj3CkYJK/bWDgYJ8khL8nQStXgAxrq8qGx1BjCsZxh/Bulm8PmynrFLoW/NQDl6P7Zg9NdUMmOkB3pXlRmgiczMKcCw0mU5J2a/Kl0TMNRCaKoX8tJKpPUgmKSBTV6hkwTBzc9yRheMM9RAASGlPjrpLbs1UM+gfOPqYPqm1hvShvwoIJRlqgWUd1nwiVVzPBhuk1SAA4DN7Ihc2wkR8Boe49x1p6l0UDHVawiENlDXQTeBMhmtC+jx9ybIKH1qijPu7f1CmAgQvjWWFDbj8CYGEKyRIi3BVIqfeSZMCkqc4UZN+T03B+LYvVFTETTBEGR6NVlR6XhG6Rdfr4QzMwMr68CkiMbxd61EodqvWT25a1UEoqakZ7ib+r/K2vi8I2GqQhPeKTjpeKXYftXsvaJAzIRf+keYsulheHDqwpzqCLN7BnVptRFUjvGrm12BekHYbfTsGKa2Bb4Px3y6x+uOa35vZVMgtN/t3dHOlDAQxfEsF6vmS7cW4/u/qk5z+NMGC1yZTpijCSzGi/522l02MLRjZJethUEf/hdhn0yAgQclEdd0/a9yjQvcAiMwAiMwAiMwAiMwAiMwAuPr0YlmIm2iZUS0jAiMy/RrxrMton9G9M8YJDACIzACIzACIzACIzACIzDikgRXGPu1VYGxXcd0pUEVsTMsMn8YWKjJwR2NpJDDQdpiOMVQk4MbV+r2Dw7TuHVQm61DhjsMLNTf4HOhsV/RuXcq4hj9i9RVwxkGLTG4tPsKg6t7S2muHNUx2+Qa0/CIwcMGz3tZAGfDVdsmPUmwb7ayZh12iEFh/L4ujcTqUiksddj0k9HB1ScGK8avO6WR6B3DsFcwWqBcHGJQGDcxdFfGSlqMIgyfawbjMwz7ywfKOYZp5K08bNwdRtOkyRlGEoYyLg0wTKNaaGJkfbRwM06WhkMMLLhValAa0Akjqxb0MQJGXvnIdYaRwFgtV32zkkpDDbn4TlG2ytDk8VgZPHO5WuR7GHpSMemmiUVfM9xhpHZFzFlbNEaVAcOGYUKloMEs8YXB9wZhWG5ioKF783oMZ+cmFEaWhTQ038/O9bVa6k/hJsTKIaCPYwy+JjBPxpVhAEou3ZmaDmZvZ60shyx5WXt6XwcY+wmq8lMYWEA0MUZK18vh6YzHzwCkoVEzT2Ca7+edlHaMw/BYAQRgYfcEY28J2xRGfSml6dpT8zaCwfgONQ+FVj+tiacYaOz3Pit9N9ypLAoYudeg5P8dxnJSGYowMGhu9J7MIoPBGdgIo98/wfgwMxi+biKf9Bn7nIKBsXQavMtMfUX7Y4zUjVgby747q8UCxls/VaRjw4Njxm0SGKsIxplqjtTGKW/DUGn0GoyL9JU+Gs1w4OxpO53FIotaGqbRraIU9zEMx334lWJ57xho2LrxZRHHuMoHN7EQvdZ2D/80QWy9wEIYtTRMwzC+PyqGYRa1MIRRNV6LlcaPR8UKY3lVC8NAwzieGKPYLNAwjifGKLBAwzgeF5NoLOD462EiD8u3AwUeD0xPECF/AOs1Ff6YfFsmAAAAAElFTkSuQmCC)\n        }\n    </style>\n</head>\n<body>\n<div class=\"J-weixin-tip weixin-tip\">\n    <div class=\"weixin-tip-content\">\n        请在菜单中选择在浏览器中打开,<br/>\n        以完成支付\n    </div>\n</div>\n<div class=\"J-weixin-tip-img weixin-tip-img\"></div>\n\n<script type=\"text/javascript\">\n(function(){var b={};var a={};a.PADCHAR=\"=\";a.ALPHA=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";a.makeDOMException=function(){var f,d;try{return new DOMException(DOMException.INVALID_CHARACTER_ERR)}catch(d){var c=new Error(\"DOM Exception 5\");c.code=c.number=5;c.name=c.description=\"INVALID_CHARACTER_ERR\";c.toString=function(){return\"Error: \"+c.name+\": \"+c.message};return c}};a.getbyte64=function(e,d){var c=a.ALPHA.indexOf(e.charAt(d));if(c===-1){throw a.makeDOMException()}return c};a.decode=function(f){f=\"\"+f;var j=a.getbyte64;var h,e,g;var d=f.length;if(d===0){return f}if(d%4!==0){throw a.makeDOMException()}h=0;if(f.charAt(d-1)===a.PADCHAR){h=1;if(f.charAt(d-2)===a.PADCHAR){h=2}d-=4}var c=[];for(e=0;e<d;e+=4){g=(j(f,e)<<18)|(j(f,e+1)<<12)|(j(f,e+2)<<6)|j(f,e+3);c.push(String.fromCharCode(g>>16,(g>>8)&255,g&255))}switch(h){case 1:g=(j(f,e)<<18)|(j(f,e+1)<<12)|(j(f,e+2)<<6);c.push(String.fromCharCode(g>>16,(g>>8)&255));break;case 2:g=(j(f,e)<<18)|(j(f,e+1)<<12);c.push(String.fromCharCode(g>>16));break}return c.join(\"\")};a.getbyte=function(e,d){var c=e.charCodeAt(d);if(c>255){throw a.makeDOMException()}return c};a.encode=function(f){\nif(arguments.length!==1){throw new SyntaxError(\"Not enough arguments\")}var g=a.PADCHAR;var h=a.ALPHA;var k=a.getbyte;var e,j;var c=[];f=\"\"+f;var d=f.length-f.length%3;if(f.length===0){return f}for(e=0;e<d;e+=3){j=(k(f,e)<<16)|(k(f,e+1)<<8)|k(f,e+2);c.push(h.charAt(j>>18));c.push(h.charAt((j>>12)&63));c.push(h.charAt((j>>6)&63));c.push(h.charAt(j&63))}switch(f.length-d){case 1:j=k(f,e)<<16;c.push(h.charAt(j>>18)+h.charAt((j>>12)&63)+g+g);break;case 2:j=(k(f,e)<<16)|(k(f,e+1)<<8);c.push(h.charAt(j>>18)+h.charAt((j>>12)&63)+h.charAt((j>>6)&63)+g);break}return c.join(\"\")};b.pay=function(d){var c=encodeURIComponent(a.encode(d));location.href=window.location.href+\"?goto=\"+c};b.decode=function(c){return a.decode(decodeURIComponent(c))};window._AP=b})();\n</script>\n\n<script>\n    var gotoUrl = 'https://openapi.alipay.com/gateway.do?{$queryStr}';\n    _AP.pay(gotoUrl);\n</script>\n\n<script>\n    if (location.hash.indexOf('error') != -1) {\n        alert('参数错误，请检查');\n    } else {\n        var ua = navigator.userAgent.toLowerCase();\n        var tip = document.querySelector(\".weixin-tip\");\n        var tipImg = document.querySelector(\".J-weixin-tip-img\");\n        if (ua.indexOf('micromessenger') != -1) {\n            tip.style.display = 'block';\n            tipImg.style.display = 'block';\n            if (ua.indexOf('iphone') != -1 || ua.indexOf('ipad') != -1 || ua.indexOf('ipod') != -1) {\n                tipImg.className = 'J-weixin-tip-img weixin-tip-img iphone'\n            } else {\n                tipImg.className = 'J-weixin-tip-img weixin-tip-img android'\n            }\n        } else {\n            var getQueryString = function (url, name) {\n                var reg = new RegExp(\"(^|\\\\?|&)\" + name + \"=([^&]*)(\\\\s|&|$)\", \"i\");\n                if (reg.test(url)) return RegExp.$2.replace(/\\+/g, \" \");\n            };\n            var param = getQueryString(location.href, 'goto') || '';\n            location.href = param != '' ? _AP.decode(param) : window.location.href+'#error';\n        }\n    }\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "static/cms/paytpl/dmf.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>温馨提示</title>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<link rel=\"shortcut icon\" href=\"/favicon.ico\">\n\t<style type=\"text/css\">\n\t\t*{box-sizing:border-box;margin:0;padding:0;font-family:Lantinghei SC,Open Sans,Arial,Hiragino Sans GB,Microsoft YaHei,\"微软雅黑\",STHeiti,WenQuanYi Micro Hei,SimSun,sans-serif;-webkit-font-smoothing:antialiased}\n\t\tbody{padding:70px 50px;background:#edf1f4;font-weight:400;font-size:1pc;-webkit-text-size-adjust:none;color:#333}\n\t\ta{outline:0;color:#3498db;text-decoration:none;cursor:pointer}\n\t\t.system-message{margin:20px auto;padding:50px 0px;background:#fff;box-shadow:0 0 30px hsla(0,0%,39%,.06);text-align:center;width:100%;border-radius:2px;}\n\t\t.system-message h1{margin:0;margin-bottom:9pt;color:#444;font-weight:400;font-size:30px}\n\t\t.system-message .jump,.system-message .image{margin:20px 0;padding:0;padding:10px 0;font-weight:400}\n\t\t.system-message .jump{font-size:14px}\n\t\t.system-message .jump a{color:#333}\n\t\t.system-message p{font-size:9pt;line-height:20px}\n\t\t.system-message .btn{display:inline-block;margin-right:10px;width:138px;height:2pc;border:1px solid #44a0e8;border-radius:30px;color:#44a0e8;text-align:center;font-size:1pc;line-height:2pc;margin-bottom:5px;}\n\t\t.success .btn{border-color:#69bf4e;color:#69bf4e}\n\t\t.error .btn{border-color:#ff8992;color:#ff8992}\n\t\t.info .btn{border-color:#3498db;color:#3498db}\n\t\t.copyright p{width:100%;color:#919191;text-align:center;font-size:10px}\n\t\t.system-message .btn-grey{border-color:#bbb;color:#bbb}\n\t\t.clearfix:after{clear:both;display:block;visibility:hidden;height:0;content:\".\"}\n\t\t@media (max-width:768px){body {padding:20px;}}\n\t\t@media (max-width:480px){.system-message h1{font-size:30px;}}\n\t</style>\n\t<script src=\"/static/common/user/js/jquery.min-1.10.2.js\"></script>\n\t<script type=\"text/javascript\">\n\n\t\tsetInterval(function(){\n\t\t\t$.post(\"{fun U('Mypay/alipay_check_order')}\",{orderno:'{$orderno}',ajax:1},function(r){\n\t\t\t\tconsole.log(r);\n\t\t\t\tif(r.code==0){\n\t\t\t\t\twindow.location.href=\"{fun U('user/orderdetails',['orderno'=>$orderno])}\";\n\t\t\t\t}\n\n\t\t\t},'json')\n\n\n\t\t},1500);\n\n\t</script>\n</head>\n<body>\n<div class=\"system-message error\">\n\t<div class=\"image\">\n\t\t<img src=\"{$url}\"  alt=\"\" width=\"120\">\n\t</div>\n\t<h1>应支付金额为<?php echo $payAmount;?>元</h1>\n\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "static/cms/paytpl/overpay.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <title>温馨提示</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <link rel=\"shortcut icon\" href=\"/favicon.ico\">\n    <style type=\"text/css\">\n        *{box-sizing:border-box;margin:0;padding:0;font-family:Lantinghei SC,Open Sans,Arial,Hiragino Sans GB,Microsoft YaHei,\"微软雅黑\",STHeiti,WenQuanYi Micro Hei,SimSun,sans-serif;-webkit-font-smoothing:antialiased}\n        body{padding:70px 50px;background:#edf1f4;font-weight:400;font-size:1pc;-webkit-text-size-adjust:none;color:#333}\n        a{outline:0;color:#3498db;text-decoration:none;cursor:pointer}\n        .system-message{margin:20px auto;padding:50px 0px;background:#fff;box-shadow:0 0 30px hsla(0,0%,39%,.06);text-align:center;width:100%;border-radius:2px;}\n        .system-message h1{margin:0;margin-bottom:9pt;color:#444;font-weight:400;font-size:30px}\n        .system-message .jump,.system-message .image{margin:20px 0;padding:0;padding:10px 0;font-weight:400}\n        .system-message .jump{font-size:14px}\n        .system-message .jump a{color:#333}\n        .system-message p{font-size:9pt;line-height:20px}\n        .system-message .btn{display:inline-block;margin-right:10px;width:138px;height:2pc;border:1px solid #44a0e8;border-radius:30px;color:#44a0e8;text-align:center;font-size:1pc;line-height:2pc;margin-bottom:5px;}\n        .success .btn{border-color:#69bf4e;color:#69bf4e}\n        .error .btn{border-color:#ff8992;color:#ff8992}\n        .info .btn{border-color:#3498db;color:#3498db}\n        .copyright p{width:100%;color:#919191;text-align:center;font-size:10px}\n        .system-message .btn-grey{border-color:#bbb;color:#bbb}\n        .clearfix:after{clear:both;display:block;visibility:hidden;height:0;content:\".\"}\n        @media (max-width:768px){body {padding:20px;}}\n        @media (max-width:480px){.system-message h1{font-size:30px;}}\n    </style>\n</head>\n<body>\n<div class=\"system-message error\">\n    <div class=\"image\">\n        <img src=\"/static/common/images/success.svg\" alt=\"\" width=\"120\">\n    </div>\n    <h1>订单{$order['orderno']}支付成功！</h1>\n            <p class=\"jump\">\n            页面将在 <span id=\"wait\">3</span> 秒后自动跳转        </p>\n\t\t\t<p class=\"clearfix\">\n\t\t\t<a href=\"/\" class=\"btn btn-grey\">返回首页</a>\n\t\t\t{if($order['ptype']!=1)}\n\t\t\t<a href=\"{fun U('user/wallet')}\" class=\"btn btn-grey\">返回钱包</a>\n\t\t\t{else}\n\t\t\t<a href=\"{fun U('user/orderdetails',['orderno'=>$order['orderno']])}\" class=\"btn btn-primary\">立即跳转</a>\n\t\t\t{/if}\n\t\t\t\t  \n            </p>\n</div>\n    <script type=\"text/javascript\">\n        (function () {\n            var wait = document.getElementById('wait');\n            var interval = setInterval(function () {\n                var time = --wait.innerHTML;\n                if (time <= 0) {\n\t\t\t\t\t{if($order['ptype']!=1)}\n\t\t\t\t\tlocation.href = \"{fun U('user/wallet')}\";\n\t\t\t\t\t{else}\n\t\t\t\t\tlocation.href = \"{fun U('user/orderdetails',['orderno'=>$order['orderno']])}\";\n\t\t\t\t\t{/if}\n\t\t\t\t\t\t\n                    clearInterval(interval);\n                }\n            }, 1000);\n        })();\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "static/cms/paytpl/pay_form.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, shrink-to-fit=no\">\n    <title>支付</title>\n    \n</head>\n\n<body style=\"background:#fff;opacity: 0;\">\n\n<form method=\"post\" action=\"<?php echo $url;?>\" id=\"formdata\" >\n<h2 class=\"sr-only\">订单信息</h2>\n<div class=\"form-group\"><input class=\"form-control\" type=\"text\" name=\"mchid\" value=\"<?php echo $order['mchid'];?>\" /></div>\n<div class=\"form-group\"><input class=\"form-control\" type=\"text\" name=\"appid\" value=\"<?php echo $order['appid'];?>\" /></div>\n<div class=\"form-group\"><input class=\"form-control\" type=\"text\" name=\"secretkey\" value=\"<?php echo $order['secretkey'];?>\" /></div>\n<div class=\"form-group\"><input class=\"form-control\" type=\"text\" name=\"paytype\" value=\"<?php echo $order['paytype'];?>\" /></div>\n<div class=\"form-group\"><input class=\"form-control\" type=\"text\" name=\"money\" value=\"<?php echo $order['money'];?>\" /></div>\n<div class=\"form-group\"><input class=\"form-control\" type=\"text\" name=\"title\" value=\"<?php echo $order['title'];?>\" /></div>\n<div class=\"form-group\"><input class=\"form-control\" type=\"text\" name=\"orderno\" value=\"<?php echo $order['orderno'];?>\" /></div>\n\n</form>\n<script>\nvar form = document.getElementById('formdata');\n//再次修改input内容\nform.submit();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "static/cms/paytpl/wechat_h5_pay.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>温馨提示</title>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<link rel=\"shortcut icon\" href=\"/favicon.ico\">\n\t<style type=\"text/css\">\n\t\t*{box-sizing:border-box;margin:0;padding:0;font-family:Lantinghei SC,Open Sans,Arial,Hiragino Sans GB,Microsoft YaHei,\"微软雅黑\",STHeiti,WenQuanYi Micro Hei,SimSun,sans-serif;-webkit-font-smoothing:antialiased}\n\t\tbody{padding:70px 50px;background:#edf1f4;font-weight:400;font-size:1pc;-webkit-text-size-adjust:none;color:#333}\n\t\ta{outline:0;color:#3498db;text-decoration:none;cursor:pointer}\n\t\t.system-message{margin:20px auto;padding:50px 0px;background:#fff;box-shadow:0 0 30px hsla(0,0%,39%,.06);text-align:center;width:100%;border-radius:2px;}\n\t\t.system-message h1{margin:0;margin-bottom:9pt;color:#444;font-weight:400;font-size:30px}\n\t\t.system-message .jump,.system-message .image{margin:20px 0;padding:0;padding:10px 0;font-weight:400}\n\t\t.system-message .jump{font-size:14px}\n\t\t.system-message .jump a{color:#333}\n\t\t.system-message p{font-size:9pt;line-height:20px}\n\t\t.system-message .btn{display:inline-block;margin-right:10px;width:138px;height:2pc;border:1px solid #44a0e8;border-radius:30px;color:#44a0e8;text-align:center;font-size:1pc;line-height:2pc;margin-bottom:5px;}\n\t\t.success .btn{border-color:#69bf4e;color:#69bf4e}\n\t\t.error .btn{border-color:#ff8992;color:#ff8992}\n\t\t.info .btn{border-color:#3498db;color:#3498db}\n\t\t.copyright p{width:100%;color:#919191;text-align:center;font-size:10px}\n\t\t.system-message .btn-grey{border-color:#bbb;color:#bbb}\n\t\t.clearfix:after{clear:both;display:block;visibility:hidden;height:0;content:\".\"}\n\t\t@media (max-width:768px){body {padding:20px;}}\n\t\t@media (max-width:480px){.system-message h1{font-size:30px;}}\n\t</style>\n\t<script type=\"text/javascript\" src=\"http://res.wx.qq.com/open/js/jweixin-1.2.0.js\"></script>\n\t<script src=\"/static/common/user/js/jquery.min-1.10.2.js\"></script>\n\t<script type=\"text/javascript\">\n\n\t\tsetInterval(function(){\n\t\t\t$.post(\"{fun U('Mypay/check_wechat_order')}\",{orderno:'{$orderno}',ajax:1},function(r){\n\t\t\t\tif(r.code==0){\n\t\t\t\t\twindow.location.href=\"{fun U('Mypay/wechat_scan_over',['orderno'=>$orderno])}\";\n\t\t\t\t}else{\n\n\t\t\t\t}\n\n\t\t\t},'json')\n\n\n\t\t},1500);\n\n\t</script>\n</head>\n<body>\n<div class=\"system-message error\">\n\t<div class=\"image\">\n\t\t<img src=\"/static/common/images/success.svg\" alt=\"\" width=\"120\">\n\t</div>\n\t<h1>等待支付......</h1>\n\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "static/cms/paytpl/wechat_pay.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>温馨提示</title>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<link rel=\"shortcut icon\" href=\"/favicon.ico\">\n\t<style type=\"text/css\">\n\t\t*{box-sizing:border-box;margin:0;padding:0;font-family:Lantinghei SC,Open Sans,Arial,Hiragino Sans GB,Microsoft YaHei,\"微软雅黑\",STHeiti,WenQuanYi Micro Hei,SimSun,sans-serif;-webkit-font-smoothing:antialiased}\n\t\tbody{padding:70px 50px;background:#edf1f4;font-weight:400;font-size:1pc;-webkit-text-size-adjust:none;color:#333}\n\t\ta{outline:0;color:#3498db;text-decoration:none;cursor:pointer}\n\t\t.system-message{margin:20px auto;padding:50px 0px;background:#fff;box-shadow:0 0 30px hsla(0,0%,39%,.06);text-align:center;width:100%;border-radius:2px;}\n\t\t.system-message h1{margin:0;margin-bottom:9pt;color:#444;font-weight:400;font-size:30px}\n\t\t.system-message .jump,.system-message .image{margin:20px 0;padding:0;padding:10px 0;font-weight:400}\n\t\t.system-message .jump{font-size:14px}\n\t\t.system-message .jump a{color:#333}\n\t\t.system-message p{font-size:9pt;line-height:20px}\n\t\t.system-message .btn{display:inline-block;margin-right:10px;width:138px;height:2pc;border:1px solid #44a0e8;border-radius:30px;color:#44a0e8;text-align:center;font-size:1pc;line-height:2pc;margin-bottom:5px;}\n\t\t.success .btn{border-color:#69bf4e;color:#69bf4e}\n\t\t.error .btn{border-color:#ff8992;color:#ff8992}\n\t\t.info .btn{border-color:#3498db;color:#3498db}\n\t\t.copyright p{width:100%;color:#919191;text-align:center;font-size:10px}\n\t\t.system-message .btn-grey{border-color:#bbb;color:#bbb}\n\t\t.clearfix:after{clear:both;display:block;visibility:hidden;height:0;content:\".\"}\n\t\t@media (max-width:768px){body {padding:20px;}}\n\t\t@media (max-width:480px){.system-message h1{font-size:30px;}}\n\t</style>\n\t<script type=\"text/javascript\" src=\"http://res.wx.qq.com/open/js/jweixin-1.2.0.js\"></script>\n\t<script src=\"http://libs.baidu.com/jquery/2.0.0/jquery.js\"></script>\n\t<script type=\"text/javascript\">\n\t\t//调用微信JS api 支付\n\t\tfunction jsApiCall()\n\t\t{\n\t\t\tWeixinJSBridge.invoke(\n\t\t\t\t'getBrandWCPayRequest',\n\t\t\t\t<?php echo $jsApiParameters; ?>,\n\t\t\tfunction(res){\n\t\t\t\tWeixinJSBridge.log(res.err_msg);\n\t\t\t\tif(res.err_msg=='get_brand_wcpay_request:ok'){\n\t\t\t\t\t//alert('支付成功！');\n\t\t\t\t\t/*\n\t\t\t\t\t$.post(\"{$returnUrl}\",{orderno:\"{$order['orderno']}\"},function(d){\n\n\t\t\t\t\t\tvar r = JSON.parse(d);\n\t\t\t\t\t\talert(r['msg']);\n\n\n\t\t\t\t\t});\n\t\t\t\t\t*/\n\t\t\t\t\twindow.location.href=\"{$returnUrl}\";\n\t\t\t\t\treturn false;\n\n\n\t\t\t\t}else{\n\t\t\t\t\talert('支付失败：'+res.err_code+res.err_desc+res.err_msg);\n\n\t\t\t\t}\n\t\t\t\twindow.location.href=\"{fun U('order/details',['orderno'=>$order['orderno']])}\";\n\t\t\t}\n\t\t);\n\t\t}\n\t\tfunction callpay()\n\t\t{\n\t\t\tif (typeof WeixinJSBridge == \"undefined\"){\n\t\t\t\tif( document.addEventListener ){\n\t\t\t\t\tdocument.addEventListener('WeixinJSBridgeReady', jsApiCall, false);\n\t\t\t\t}else if (document.attachEvent){\n\t\t\t\t\tdocument.attachEvent('WeixinJSBridgeReady', jsApiCall);\n\t\t\t\t\tdocument.attachEvent('onWeixinJSBridgeReady', jsApiCall);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tjsApiCall();\n\t\t\t}\n\t\t}\n\t</script>\n</head>\n<body>\n<div class=\"system-message error\">\n\t<div class=\"image\">\n\t\t<img src=\"/static/common/images/success.svg\" alt=\"\" width=\"120\">\n\t</div>\n\t<h1>应支付金额为<?php echo $payAmount;?>元</h1>\n\n\t<p class=\"clearfix\">\n\t\t<a onclick=\"callpay()\" class=\"btn btn-grey\">立即支付</a>\n\t</p>\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "static/cms/paytpl/wechat_scan.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>温馨提示</title>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<link rel=\"shortcut icon\" href=\"/favicon.ico\">\n\t<style type=\"text/css\">\n\t\t*{box-sizing:border-box;margin:0;padding:0;font-family:Lantinghei SC,Open Sans,Arial,Hiragino Sans GB,Microsoft YaHei,\"微软雅黑\",STHeiti,WenQuanYi Micro Hei,SimSun,sans-serif;-webkit-font-smoothing:antialiased}\n\t\tbody{padding:70px 50px;background:#edf1f4;font-weight:400;font-size:1pc;-webkit-text-size-adjust:none;color:#333}\n\t\ta{outline:0;color:#3498db;text-decoration:none;cursor:pointer}\n\t\t.system-message{margin:20px auto;padding:50px 0px;background:#fff;box-shadow:0 0 30px hsla(0,0%,39%,.06);text-align:center;width:100%;border-radius:2px;}\n\t\t.system-message h1{margin:0;margin-bottom:9pt;color:#444;font-weight:400;font-size:30px}\n\t\t.system-message .jump,.system-message .image{margin:20px 0;padding:0;padding:10px 0;font-weight:400}\n\t\t.system-message .jump{font-size:14px}\n\t\t.system-message .jump a{color:#333}\n\t\t.system-message p{font-size:9pt;line-height:20px}\n\t\t.system-message .btn{display:inline-block;margin-right:10px;width:138px;height:2pc;border:1px solid #44a0e8;border-radius:30px;color:#44a0e8;text-align:center;font-size:1pc;line-height:2pc;margin-bottom:5px;}\n\t\t.success .btn{border-color:#69bf4e;color:#69bf4e}\n\t\t.error .btn{border-color:#ff8992;color:#ff8992}\n\t\t.info .btn{border-color:#3498db;color:#3498db}\n\t\t.copyright p{width:100%;color:#919191;text-align:center;font-size:10px}\n\t\t.system-message .btn-grey{border-color:#bbb;color:#bbb}\n\t\t.clearfix:after{clear:both;display:block;visibility:hidden;height:0;content:\".\"}\n\t\t@media (max-width:768px){body {padding:20px;}}\n\t\t@media (max-width:480px){.system-message h1{font-size:30px;}}\n\t</style>\n\t<script type=\"text/javascript\" src=\"http://res.wx.qq.com/open/js/jweixin-1.2.0.js\"></script>\n\t<script src=\"/static/common/user/js/jquery.min-1.10.2.js\"></script>\n\t<script type=\"text/javascript\">\n\n\t\tsetInterval(function(){\n\t\t\t$.post(\"{fun U('Mypay/check_wechat_order')}\",{orderno:'{$orderno}',ajax:1},function(r){\n\t\t\t\tif(r.code==0){\n\t\t\t\t\twindow.location.href=\"{fun U('Mypay/wechat_scan_over',['orderno'=>$orderno])}\";\n\t\t\t\t}else{\n\n\t\t\t\t}\n\n\t\t\t},'json')\n\n\n\t\t},1500);\n\n\t</script>\n</head>\n<body>\n<div class=\"system-message error\">\n\t<div class=\"image\">\n\t\t<img src=\"{$url}\" data=\"{$data}\"  alt=\"\" width=\"120\">\n\t</div>\n\t<h1>应支付金额为<?php echo $payAmount;?>元</h1>\n\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "static/cms/product/details.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"cn\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>{$jz['seo_title']}-{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"{$jz['keywords']}\" />\n\t<meta name=\"description\" content=\"{$jz['description']}\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n     {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n   \n\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n        <!-- Blog Details Wrapper Start -->\n        <div class=\"blog-details-wrapper section-space--ptb_60\">\n          <div class=\"container\">\n            <div class=\"row row--17\">\n              <div class=\"blog-details-col-12\">\n                <!-- blog details Post Start -->\n                <div class=\"blog-details-post-wrap\">\n                  <div class=\"blog-details-thum clean-block clean-product\">\n                    \n\t\t\t\t\t<div class=\"row\">\n                            <div class=\"col-md-6\">\n                                <div class=\"gallery\">\n                                    <div class=\"sp-wrap\">\n\t\t\t\t\t\t\t\t\t{if($jz['pictures'])}\n\t\t\t\t\t\t\t\t\t{php $pictures = explode('||',$jz['pictures'])/}\n\t\t\t\t\t\t\t\t\t{foreach $pictures as $v}\n\t\t\t\t\t\t\t\t\t{php $pic = explode('|',$v);/}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<a href=\"{$pic[0]}\"><img class=\"img-fluid d-block mx-auto\" alt=\"{$pic[1]}\" title=\"{$pic[1]}\" src=\"{$pic[0]}\"></a>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t<a href=\"{$jz['litpic']}\"><img class=\"img-fluid d-block mx-auto\" alt=\"{$jz['title']}\" title=\"{$jz['title']}\" src=\"{$jz['litpic']}\"></a>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t</div>\n                                </div>\n                            </div>\n                            <div class=\"col-md-6\">\n                                <div class=\"info\">\n                                    <h3>{$jz['title']}</h3>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t{if($jz['tags'])}\n\t\t\t\t\t\t\t\t\t\t{foreach explode(',',$jz['tags']) as $v}\n\t\t\t\t\t\t\t\t\t\t{if($v)}<span class=\"badge bg-primary\">{$v}</span>{/if}\n\t\t\t\t\t\t\t\t\t\t{/foreach}\n\t\t\t\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\t\t</p>\n                                    <div class=\"price\">\n                                        ￥{$jz['price']} <span class=\"nsbar\">\n\t\t\t\t\t\t\t\t\t\t{if(checkCollect($type['id'],$jz['id']))}\n\t\t\t\t\t\t\t\t\t\t<a title=\"已收藏\" onclick=\"collect({$type['id']},{$jz['id']})\"\n\t\t\t\t\t\t\t\t\t\t  ><img src=\"{$tpl}static/picture/collect.png\" alt=\"\"\n\t\t\t\t\t\t\t\t\t\t/></a>\n\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t<a title=\"点击收藏\" onclick=\"collect({$type['id']},{$jz['id']})\"\n\t\t\t\t\t\t\t\t\t\t  ><img src=\"{$tpl}static/picture/small-bookmark.png\" alt=\"\"\n\t\t\t\t\t\t\t\t\t\t/></a>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{if(checkLikes($type['id'],$jz['id']))}\n\t\t\t\t\t\t\t\t\t\t<a title=\"已点赞\" onclick=\"likes({$type['id']},{$jz['id']})\"\n\t\t\t\t\t\t\t\t\t\t  ><img src=\"{$tpl}static/picture/zan.png\" alt=\"\"\n\t\t\t\t\t\t\t\t\t\t/></a>\n\t\t\t\t\t\t\t\t\t\t{else}\n\t\t\t\t\t\t\t\t\t\t<a title=\"点赞\" onclick=\"likes({$type['id']},{$jz['id']})\"\n\t\t\t\t\t\t\t\t\t\t  ><img src=\"{$tpl}static/picture/heart.png\" alt=\"\"\n\t\t\t\t\t\t\t\t\t\t/></a>\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t</span>\n                                    </div>\n\t\t\t\t\t\t\t\t\t<div class=\"feature\">\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<table class=\"table table-bordered\">\n\t\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t<tr><th>参数</th><th>值</th></tr>\n\t\t\t\t\t\t\t\t\t\t\t{foreach jz_show_fields($jz,'color,lx,hy') as $v}\n\t\t\t\t\t\t\t\t\t\t\t<tr><td>{$v['title']}</td><td>{$v['data']}</td></tr>\n\t\t\t\t\t\t\t\t\t\t\t{/foreach}\n\n\t\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class=\"buy-bar\">\n\t\t\t\t\t\t\t\t\t<p>库存：{$jz['stock_num']} 件 </p>\n\t\t\t\t\t\t\t\t\t<button onclick=\"addcart({$type['id']},{$jz['id']},1)\" class=\"buy btn\" type=\"button\"><i class=\"icon-basket\"></i>加入购物车</button>\n\t\t\t\t\t\t\t\t\t</div>\n                                    <div class=\"summary\">\n\t\t\t\t\t\t\t\t\t{$jz['description']}\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    \n\t\t\t\t\t\n                  </div>\n                  <div class=\"blog-details-post-content\">\n                    <div class=\"blog-details-meta-box\">\n                      <div class=\"post-meta-left-side mb-2\">\n                        <div class=\"trending-blog-post-category\">\n                          <a href=\"{$type['url']}\">{$type['classname']}</a>\n                        </div>\n                        <div class=\"following-blog-post-author\">\n                          {if(!$jz['member_id'])}\n                            发布者 <a >{fun adminInfo($jz['userid'],'name')}</a>\n\t\t\t\t\t\t  {else}\n\t\t\t\t\t\t    发布者 <a href=\"/user/active/uid/{$jz['member_id']}\">{fun memberInfo($jz['member_id'],'username')}</a>\n\t\t\t\t\t\t  {/if} \n                        </div>\n                      </div>\n\n                      <div class=\"post-mid-side mb-2\">\n                        <span class=\"post-meta-left-side\">\n                          <span class=\"post-date\">\n                            <i class=\"icofont-ui-calendar\"></i>\n                            <a >{fun date('Y-m-d H:i:s',$jz['addtime'])}</a>\n                          </span>\n                        </span>\n                        <span id=\"read-num\">热度 {$jz['hits']}</span>\n                      </div>\n\n                    </div>\n                    \n\n                    <div class=\"post-details-text\">\n                      {$jz['body']}\n                    </div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t{if($aprev)}\n\t\t\t\t\t<a  class=\"prevpage btn\" href=\"{$aprev['url']}\">上一篇：{$aprev['title']}</a>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{if($anext)}\n\t\t\t\t\t<a class=\"nextpage btn\" href=\"{$anext['url']}\">下一篇：{$anext['title']}</a>\n\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t\t\n                    <!-- Related Post Area Start -->\n                    <div class=\"related-post-area section-space--pt_60\">\n                      <div class=\"row\">\n                        <div class=\"col-lg-8 col-7\">\n                          <div class=\"section-title mb-30\">\n                            <h3 class=\"title\">相关商品</h3>\n                          </div>\n                        </div>\n                        \n                      </div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"recent-article-area\">\n\t\t\t\t\t  <div class=\"container\">\n\t\t\t\t\t\t<div class=\"row row--30\">\n\t\t\t\t\t\t{loop table=\"product\" notempty=\"litpic\" tid=\"$jz['tid']\" isshow=\"1\" isall=\"1\" orderby=\"rand()\" limit=\"3\" as=\"v\"}\n\t\t\t\t\t\t  <div class=\"col-lg-4 col-md-6\">\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<div class=\"single-most-populer-item wow fadeInUp\" >\n\t\t\t\t\t\t\t  <a href=\"{$v['url']}\" class=\"most-populer-thum\">\n\t\t\t\t\t\t\t\t<img src=\"{$v['litpic']}\" alt=\"{$v['title']}\" />\n\t\t\t\t\t\t\t  </a>\n\t\t\t\t\t\t\t  <div class=\"most-populer-content\">\n\t\t\t\t\t\t\t\t<div class=\"most-populer-post-author\">\n\t\t\t\t\t\t\t\t   作者 <a href=\"{$v['url']}\">{fun adminInfo($v['userid'],'name')}</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<h3 class=\"title\">\n\t\t\t\t\t\t\t\t  <a href=\"{$v['url']}\"\n\t\t\t\t\t\t\t\t\t>{$v['title']}</a\n\t\t\t\t\t\t\t\t  >\n\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t<p class=\"dec mt-2\">\n\t\t\t\t\t\t\t\t  <span class=\"product-price\">￥ {$v['price']}</span>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<div class=\"most-populer-post-meta\">\n\t\t\t\t\t\t\t\t  <span class=\"post-date\">\n\t\t\t\t\t\t\t\t\t<a>{fun date('Y-m-d',$v['addtime'])}</a>\n\t\t\t\t\t\t\t\t  </span>\n\t\t\t\t\t\t\t\t  <span>热度 {$v['hits']}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t   \n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t{/loop}\n\t\t\t\t\t\t \n\t\t\t\t\t\t \n\t\t\t\t\t\t</div>\n\t\t\t\t\t  </div>\n\t\t\t\t\t</div>\n       \n\t\t\t\t\t\n\t\t\t\t\t\n                    \n\t\t\t\t\t</div>\n                  {include=\"comment\"}\n                  </div>\n                </div>\n                <!-- blog details Post End -->\n              </div>\n             \n\t\t\t</div>\n          </div>\n        </div>\n        <!-- Blog Details Wrapper End -->\n\n      </div>\n    </div>\n\n   {include=\"footer\"}\n   {include=\"js\"}\n   \n   <script>\n   $.get('/common/gohits?molds={$jz['molds']}&id={$jz['id']}',function(r){\n   $(\"#read-num\").html('热度 '+r);\n   })\n   var page = 1;\n   getmessagelist({$jz['tid']},{$jz['id']},page);\n   \n   \n    if ($('.clean-gallery').length > 0) {\n\t   baguetteBox.run('.clean-gallery', { animation: 'slideIn'});\n\t}\n\n\tif ($('.clean-product').length > 0) {\n\t\t$(window).on(\"load\",function() {\n\t\t\t$('.sp-wrap').smoothproducts();\n\t\t});\n\t}\n\n   \n   \n   </script>\n   \n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/product/list.html",
    "content": "<!DOCTYPE html>\r\n<html class=\"no-js\" lang=\"cn\">\r\n  <head>\r\n    <meta charset=\"utf-8\" />\r\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\r\n    <title>{$type['seo_classname']}-{$webconf['web_name']}</title>\r\n\t<meta name=\"keywords\" content=\"{$type['keywords']}\" />\r\n\t<meta name=\"description\" content=\"{$type['description']}\" />\r\n\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\r\n    {include=\"style\"}\r\n  </head>\r\n  <body>\r\n    {include=\"header\"}\r\n    <div id=\"main-wrapper\">\r\n      <div class=\"site-wrapper-reveal\">\r\n        <!-- Blog Details Wrapper Start -->\r\n        <div class=\"blog-details-wrapper section-space--ptb_80\">\r\n          <div class=\"container\">\r\n\t\t\t\r\n            <div class=\"row row--17\">\r\n\t\t\t\r\n            <div class=\"row\">\r\n\t\t\t<ul class=\"filter-bar\">\r\n\t\t\t{screen molds=\"product\"   orderby=\"orders desc\"  as=\"s\"}\r\n\t\t\t\t<li>\r\n\t\t\t\t<div class=\"filter-s\">\r\n\t\t\t\t<label>{$s['fieldname']}</label>\r\n\t\t\t\t<a href=\"{$s['url']}\" {if(!isset($filters[$s['field']]))}class=\"is-checked\" {/if}><span class=\"filter-text\">全部</span></a>\r\n\t\t\t\t{foreach $s['list'] as $ss}\r\n\t\t\t\t<a href=\"{$ss['url']}\"\r\n\t\t\t\t{if(isset($filters[$s['field']]) && strpos(','.$filters[$s['field']].',',','.$ss['key'].',')!==false)} class=\"is-checked\" {/if}\t \r\n\t\t\t\t><span class=\"filter-text\">{$ss['value']}</span></a>\r\n\t\t\t\t{/foreach}\r\n\t\t\t\t</div>\r\n\t\t\t\t</li>\r\n\t\t\t{/screen}\r\n\t\t\t</ul>\r\n\t\t\t</div>\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t{if($lists)}\r\n\t\t\t{foreach $lists as $v}\r\n              <div class=\"col-lg-4 col-md-6 col-sm-6\">\r\n                <!-- Single Following Post Start -->\r\n                <div class=\"single-following-post wow fadeInUp\" >\r\n                  <a href=\"{$v['url']}\" class=\"following-post-thum\">\r\n                    <img src=\"{$v['litpic']}\" alt=\"{$v['title']}\" />\r\n                  </a>\r\n                  <div class=\"following-post-content\">\r\n                    <div class=\"following-blog-post-top\">\r\n                      <div class=\"trending-blog-post-category\">\r\n                        <a href=\"{$classtypedata[$v['tid']]['url']}\" class=\"business\">{$classtypedata[$v['tid']]['classname']}</a>\r\n                      </div>\r\n                      <div class=\"product-price\">\r\n                          ￥ {$v['price']} 元\r\n                      </div>\r\n                    </div>\r\n                    <h5 class=\"following-blog-post-title\">\r\n                      <a href=\"{$v['url']}\"\r\n                        >{$v['title']}\r\n                      </a>\r\n                    </h5>\r\n                    <div class=\"following-blog-post-meta\">\r\n                      <div class=\"post-meta-left-side\">\r\n                        <span class=\"post-date\">\r\n                          <i class=\"icofont-ui-calendar\"></i>\r\n                          <a href=\"{$v['url']}\">{fun date('Y-m-d',$v['addtime'])}</a>\r\n                        </span>\r\n                        <span>热度 {$v['hits']}</span>\r\n                      </div>\r\n                      <div class=\"post-meta-right-side\">\r\n                        {if(checkCollect($v['tid'],$v['id']))}\r\n\t\t\t\t\t\t<a title=\"已收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/collect.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t<a title=\"点击收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/small-bookmark.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{/if}\r\n                        \r\n\t\t\t\t\t\t{if(checkLikes($v['tid'],$v['id']))}\r\n\t\t\t\t\t\t<a title=\"已点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/zan.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t<a title=\"点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/heart.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{/if}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <!-- Single Following Post End -->\r\n              </div>\r\n\t\t\t{/foreach}\r\n\t\t\t\t<nav>\r\n\t\t\t\t\t<ul class=\"pagination\">\r\n\t\t\t\t\t\t<li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\r\n\t\t\t\t\t\t{foreach $listpage['list'] as $ss}\r\n\t\t\t\t\t\t<li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\r\n\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t<li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\r\n\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t</nav>\r\n\t\t\t{else}\r\n\t\t\t <div class=\"col-lg-12\">\r\n\t\t\t\t<div class=\"error-404-content text-center\">\r\n\t\t\t\t  <div class=\"banner wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\r\n\t\t\t\t\t<img src=\"/static/cms/static/picture/error-404.png\" alt=\"\">\r\n\t\t\t\t  </div>\r\n\t\t\t\t  <div class=\"error-text wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\r\n\t\t\t\t\t<h5>This Page is Not Found.</h5>\r\n\t\t\t\t\t<h2>很抱歉，没有找到你要的信息。</h2>\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t  </div>\r\n\t\t\t\t</div>\r\n\t\t\t  </div>\r\n\t\t\t{/if}\r\n                \r\n\t\t\t\r\n\t\t\t</div>\r\n          </div>\r\n        </div>\r\n       \r\n\t    \r\n\t\t<div class=\"trending-topic-area bg-gray section-space--ptb_80\">\r\n\t\t<form class=\"search\" action=\"/searchAll\" id=\"myform\" method=\"get\">\r\n\t\t\t<div class=\"container\">\r\n\t\t\t<!-- Newsletter Subscribe Area Start -->\r\n\t\t\t<div class=\"newsletter-subscribe-inner section-space--mt_80 aos-init aos-animate\" data-aos=\"fade-up\">\r\n\t\t\t<div class=\"row align-items-center\">\r\n\t\t\t\r\n\t\t\t<div class=\"col-lg-3\">\r\n\t\t\t\t<div class=\"section-title mb-4\"><h3>全站搜索</h3></div>\r\n\t\t\t</div>\r\n\t\t\t\r\n\t\t\t<input type=\"hidden\" name=\"molds[]\" value=\"article\">\r\n\t\t\t<input type=\"hidden\" name=\"molds[]\" value=\"product\">\r\n\t\t\t\t<div class=\"col-lg-9\">\r\n\t\t\t\t\t<div class=\"newsletter-input-box\">\r\n\t\t\t\t\t\t<input class=\"newsletter-input\" name=\"word\" autocomplete=\"off\" type=\"text\" placeholder=\"输入关键词\">\r\n\t\t\t\t\t\t<div class=\"button-box\">\r\n\t\t\t\t\t\t\t<a  class=\"btn-primary btn-large searchall\" >搜索</a>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\r\n\t\t\t</div>\r\n\t\t\t\r\n\t\t\t<div class=\"newsletter-inner-image\">\r\n\t\t\t\t<img class=\"newsletter-image-01\" src=\"{$tpl}static/picture/1-newsletter.png\" alt=\"\">\r\n\t\t\t\t<img class=\"newsletter-image-02\" src=\"{$tpl}static/picture/2-newsletter.png\" alt=\"\">\r\n\t\t\t</div>\r\n\t\t\t</div><!-- Newsletter Subscribe Area End -->\r\n\t\t\t</div>\r\n\t\t\t</form>\r\n\t\t</div>\r\n\t   \r\n\t   \r\n      </div>\r\n    </div>\r\n   \r\n    {include=\"footer\"}\r\n    {include=\"js\"}\r\n\t<script>\r\n\t$(function(){\r\n\t\t$(\".searchall\").click(function (){\r\n\t\t\t$(\"#myform\").submit();\r\n\t\t})\r\n\t})\r\n\r\n\t</script>\r\n  </body>\r\n</html>\r\n"
  },
  {
    "path": "static/cms/search.html",
    "content": "<!DOCTYPE html>\r\n<html class=\"no-js\" lang=\"cn\">\r\n  <head>\r\n    <meta charset=\"utf-8\" />\r\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\r\n    <title>搜索 “{$word}” -{$webconf['web_name']}</title>\r\n\t<meta name=\"keywords\" content=\"搜索 “{$word}”\" />\r\n\t<meta name=\"description\" content=\"搜索 “{$word}”\" />\r\n\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\r\n    {include=\"style\"}\r\n  </head>\r\n  <body>\r\n    {include=\"header\"}\r\n    <div id=\"main-wrapper\">\r\n      <div class=\"site-wrapper-reveal\">\r\n        <!-- Blog Details Wrapper Start -->\r\n        <div class=\"blog-details-wrapper section-space--ptb_80\">\r\n          <div class=\"container\">\r\n\t\t\t<div class=\"row\" style=\"margin-bottom: 20px;\">\r\n\t\t\t<h3>搜索 “{$word}” 结果如下：</h3>\r\n\t\t\t</div>\r\n            <div class=\"row row--17\">\r\n\t\t\t{if($lists)}\r\n\t\t\t{foreach $lists as $v}\r\n              <div class=\"col-lg-4 col-md-6 col-sm-6\">\r\n                <!-- Single Following Post Start -->\r\n                <div class=\"single-following-post wow fadeInUp\" >\r\n                  <a href=\"{$v['url']}\" class=\"following-post-thum\">\r\n                    <img src=\"{$v['litpic']}\" />\r\n                  </a>\r\n                  <div class=\"following-post-content\">\r\n                    <div class=\"following-blog-post-top\">\r\n                      <div class=\"trending-blog-post-category\">\r\n                        <a href=\"{$classtypedata[$v['tid']]['url']}\" class=\"business\">{$classtypedata[$v['tid']]['classname']}</a>\r\n                      </div>\r\n                    </div>\r\n                    <h5 class=\"following-blog-post-title\">\r\n                      <a href=\"{$v['url']}\"\r\n                        >{$v['title']}\r\n                      </a>\r\n                    </h5>\r\n                    <div class=\"following-blog-post-meta\">\r\n                      <div class=\"post-meta-left-side\">\r\n                        <span class=\"post-date\">\r\n                          <i class=\"icofont-ui-calendar\"></i>\r\n                          <a href=\"{$v['url']}\">{fun date('Y-m-d',$v['addtime'])}</a>\r\n                        </span>\r\n                        <span>热度 {$v['hits']}</span>\r\n                      </div>\r\n                      <div class=\"post-meta-right-side\">\r\n                        {if(checkCollect($v['tid'],$v['id']))}\r\n\t\t\t\t\t\t<a title=\"已收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/collect.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t<a title=\"点击收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/small-bookmark.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{/if}\r\n                        \r\n\t\t\t\t\t\t{if(checkLikes($v['tid'],$v['id']))}\r\n\t\t\t\t\t\t<a title=\"已点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/zan.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t<a title=\"点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/heart.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{/if}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <!-- Single Following Post End -->\r\n              </div>\r\n\t\t\t{/foreach}\r\n\t\t\t\t<nav>\r\n\t\t\t\t\t<ul class=\"pagination\">\r\n\t\t\t\t\t\t<li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\r\n\t\t\t\t\t\t{foreach $listpage['list'] as $ss}\r\n\t\t\t\t\t\t<li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\r\n\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t<li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\r\n\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t</nav>\r\n\t\t\t{else}\r\n\t\t\t<div class=\"row\">\r\n              <div class=\"col-lg-12\">\r\n                <div class=\"error-404-content text-center\">\r\n                  <div class=\"banner wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\r\n                    <img src=\"/static/cms/static/picture/error-404.png\" alt=\"\">\r\n                  </div>\r\n                  <div class=\"error-text wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\r\n                    <h5>This Page is Not Found.</h5>\r\n                    <h2>很抱歉，没有找到你要的信息。</h2>\r\n\r\n                    \r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\t\t\t{/if}\r\n\t\t\t\r\n\t\t\t</div>\r\n          </div>\r\n        </div>\r\n       \r\n      </div>\r\n    </div>\r\n   \r\n    {include=\"footer\"}\r\n    {include=\"js\"}\r\n  </body>\r\n</html>\r\n"
  },
  {
    "path": "static/cms/searchall.html",
    "content": "<!DOCTYPE html>\r\n<html class=\"no-js\" lang=\"cn\">\r\n  <head>\r\n    <meta charset=\"utf-8\" />\r\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\r\n    <title>搜索 “{$word}” -{$webconf['web_name']}</title>\r\n\t<meta name=\"keywords\" content=\"搜索 “{$word}”\" />\r\n\t<meta name=\"description\" content=\"搜索 “{$word}”\" />\r\n\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\r\n    {include=\"style\"}\r\n  </head>\r\n  <body>\r\n    {include=\"header\"}\r\n    <div id=\"main-wrapper\">\r\n      <div class=\"site-wrapper-reveal\">\r\n        <!-- Blog Details Wrapper Start -->\r\n        <div class=\"blog-details-wrapper section-space--ptb_80\">\r\n          <div class=\"container\">\r\n\t\t\t<div class=\"row\" style=\"margin-bottom: 20px;\">\r\n\t\t\t<h3>搜索 “{$word}” 结果如下：</h3>\r\n\t\t\t</div>\r\n            <div class=\"row row--17\">\r\n\t\t\t{if($lists)}\r\n\t\t\t{foreach $lists as $v}\r\n              <div class=\"col-lg-4 col-md-6 col-sm-6\">\r\n                <!-- Single Following Post Start -->\r\n                <div class=\"single-following-post wow fadeInUp\" >\r\n                  <a href=\"{$v['url']}\" class=\"following-post-thum\">\r\n                    <img src=\"{$v['litpic']}\"  />\r\n                  </a>\r\n                  <div class=\"following-post-content\">\r\n                    <div class=\"following-blog-post-top\">\r\n                      <div class=\"trending-blog-post-category\">\r\n                        <a href=\"{$classtypedata[$v['tid']]['url']}\" class=\"business\">{$classtypedata[$v['tid']]['classname']}</a>\r\n                      </div>\r\n                    </div>\r\n                    <h5 class=\"following-blog-post-title\">\r\n                      <a href=\"{$v['url']}\">{$v['title']}\r\n                      </a>\r\n                    </h5>\r\n                    <div class=\"following-blog-post-meta\">\r\n                      <div class=\"post-meta-left-side\">\r\n                        <span class=\"post-date\">\r\n                          <i class=\"icofont-ui-calendar\"></i>\r\n                          <a href=\"{$v['url']}\">{fun date('Y-m-d',$v['addtime'])}</a>\r\n                        </span>\r\n                        <span>热度 {$v['hits']}</span>\r\n                      </div>\r\n                      <div class=\"post-meta-right-side\">\r\n                        {if(checkCollect($v['tid'],$v['id']))}\r\n\t\t\t\t\t\t<a title=\"已收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/collect.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t<a title=\"点击收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/small-bookmark.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{/if}\r\n                        \r\n\t\t\t\t\t\t{if(checkLikes($v['tid'],$v['id']))}\r\n\t\t\t\t\t\t<a title=\"已点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/zan.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t<a title=\"点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\r\n                          ><img src=\"{$tpl}static/picture/heart.png\" alt=\"\"\r\n                        /></a>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{/if}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <!-- Single Following Post End -->\r\n              </div>\r\n\t\t\t{/foreach}\r\n\t\t\t\t<nav>\r\n\t\t\t\t\t<ul class=\"pagination\">\r\n\t\t\t\t\t\t<li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\r\n\t\t\t\t\t\t{foreach $listpage['list'] as $ss}\r\n\t\t\t\t\t\t<li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\r\n\t\t\t\t\t\t{/foreach}\r\n\t\t\t\t\t\t<li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\r\n\r\n\t\t\t\t\t</ul>\r\n\t\t\t\t</nav>\r\n\t\t\t{else}\r\n\t\t\t<div class=\"row\">\r\n              <div class=\"col-lg-12\">\r\n                <div class=\"error-404-content text-center\">\r\n                  <div class=\"banner wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\r\n                    <img src=\"/static/cms/static/picture/error-404.png\" alt=\"\">\r\n                  </div>\r\n                  <div class=\"error-text wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\r\n                    <h5>This Page is Not Found.</h5>\r\n                    <h2>很抱歉，没有找到你要的信息。</h2>\r\n\r\n                    \r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\t\t\t{/if}\r\n\t\t\t\r\n\t\t\t</div>\r\n          </div>\r\n        </div>\r\n       \r\n      </div>\r\n    </div>\r\n   \r\n    {include=\"footer\"}\r\n    {include=\"js\"}\r\n  </body>\r\n</html>\r\n"
  },
  {
    "path": "static/cms/searchform.html",
    "content": "<div class=\"searchform\">\n<div class=\"latest-post-header aos-init aos-animate wow fadeInUp\"\n >\n<div class=\"section-title\">\n  <h4>站内搜索</h4>\n</div>\n<div class=\"latest-post-slider-navigation\">\n\n</div>\n</div>\n<div class=\"latest-post-slider-active  wow fadeInUp\">\n\n<form class=\"search\" action=\"/search\" method=\"get\">\n<input type=\"hidden\" name=\"molds\" value=\"{$classtypedata[$type['id']]['molds']}\">\n<input type=\"text\" autocomplete=\"off\" class=\"so\" placeholder=\"请输入关键词\" name=\"word\" value=\"\">\n<button class=\"layui-btn layui-btn-sm\">搜索</button>\n</form>\n\n</div>\n</div>"
  },
  {
    "path": "static/cms/static/css/aos.css",
    "content": "[data-aos][data-aos][data-aos-duration=\"50\"],body[data-aos-duration=\"50\"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay=\"50\"],body[data-aos-delay=\"50\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"50\"].aos-animate,body[data-aos-delay=\"50\"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration=\"100\"],body[data-aos-duration=\"100\"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay=\"100\"],body[data-aos-delay=\"100\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"100\"].aos-animate,body[data-aos-delay=\"100\"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration=\"150\"],body[data-aos-duration=\"150\"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay=\"150\"],body[data-aos-delay=\"150\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"150\"].aos-animate,body[data-aos-delay=\"150\"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration=\"200\"],body[data-aos-duration=\"200\"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay=\"200\"],body[data-aos-delay=\"200\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"200\"].aos-animate,body[data-aos-delay=\"200\"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration=\"250\"],body[data-aos-duration=\"250\"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay=\"250\"],body[data-aos-delay=\"250\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"250\"].aos-animate,body[data-aos-delay=\"250\"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration=\"300\"],body[data-aos-duration=\"300\"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay=\"300\"],body[data-aos-delay=\"300\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"300\"].aos-animate,body[data-aos-delay=\"300\"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration=\"350\"],body[data-aos-duration=\"350\"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay=\"350\"],body[data-aos-delay=\"350\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"350\"].aos-animate,body[data-aos-delay=\"350\"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration=\"400\"],body[data-aos-duration=\"400\"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay=\"400\"],body[data-aos-delay=\"400\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"400\"].aos-animate,body[data-aos-delay=\"400\"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration=\"450\"],body[data-aos-duration=\"450\"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay=\"450\"],body[data-aos-delay=\"450\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"450\"].aos-animate,body[data-aos-delay=\"450\"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration=\"500\"],body[data-aos-duration=\"500\"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay=\"500\"],body[data-aos-delay=\"500\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"500\"].aos-animate,body[data-aos-delay=\"500\"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration=\"550\"],body[data-aos-duration=\"550\"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay=\"550\"],body[data-aos-delay=\"550\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"550\"].aos-animate,body[data-aos-delay=\"550\"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration=\"600\"],body[data-aos-duration=\"600\"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay=\"600\"],body[data-aos-delay=\"600\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"600\"].aos-animate,body[data-aos-delay=\"600\"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration=\"650\"],body[data-aos-duration=\"650\"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay=\"650\"],body[data-aos-delay=\"650\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"650\"].aos-animate,body[data-aos-delay=\"650\"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration=\"700\"],body[data-aos-duration=\"700\"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay=\"700\"],body[data-aos-delay=\"700\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"700\"].aos-animate,body[data-aos-delay=\"700\"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration=\"750\"],body[data-aos-duration=\"750\"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay=\"750\"],body[data-aos-delay=\"750\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"750\"].aos-animate,body[data-aos-delay=\"750\"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration=\"800\"],body[data-aos-duration=\"800\"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay=\"800\"],body[data-aos-delay=\"800\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"800\"].aos-animate,body[data-aos-delay=\"800\"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration=\"850\"],body[data-aos-duration=\"850\"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay=\"850\"],body[data-aos-delay=\"850\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"850\"].aos-animate,body[data-aos-delay=\"850\"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration=\"900\"],body[data-aos-duration=\"900\"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay=\"900\"],body[data-aos-delay=\"900\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"900\"].aos-animate,body[data-aos-delay=\"900\"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration=\"950\"],body[data-aos-duration=\"950\"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay=\"950\"],body[data-aos-delay=\"950\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"950\"].aos-animate,body[data-aos-delay=\"950\"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration=\"1000\"],body[data-aos-duration=\"1000\"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay=\"1000\"],body[data-aos-delay=\"1000\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1000\"].aos-animate,body[data-aos-delay=\"1000\"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration=\"1050\"],body[data-aos-duration=\"1050\"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay=\"1050\"],body[data-aos-delay=\"1050\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1050\"].aos-animate,body[data-aos-delay=\"1050\"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration=\"1100\"],body[data-aos-duration=\"1100\"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay=\"1100\"],body[data-aos-delay=\"1100\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1100\"].aos-animate,body[data-aos-delay=\"1100\"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration=\"1150\"],body[data-aos-duration=\"1150\"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay=\"1150\"],body[data-aos-delay=\"1150\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1150\"].aos-animate,body[data-aos-delay=\"1150\"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration=\"1200\"],body[data-aos-duration=\"1200\"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay=\"1200\"],body[data-aos-delay=\"1200\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1200\"].aos-animate,body[data-aos-delay=\"1200\"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration=\"1250\"],body[data-aos-duration=\"1250\"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay=\"1250\"],body[data-aos-delay=\"1250\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1250\"].aos-animate,body[data-aos-delay=\"1250\"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration=\"1300\"],body[data-aos-duration=\"1300\"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay=\"1300\"],body[data-aos-delay=\"1300\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1300\"].aos-animate,body[data-aos-delay=\"1300\"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration=\"1350\"],body[data-aos-duration=\"1350\"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay=\"1350\"],body[data-aos-delay=\"1350\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1350\"].aos-animate,body[data-aos-delay=\"1350\"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration=\"1400\"],body[data-aos-duration=\"1400\"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay=\"1400\"],body[data-aos-delay=\"1400\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1400\"].aos-animate,body[data-aos-delay=\"1400\"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration=\"1450\"],body[data-aos-duration=\"1450\"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay=\"1450\"],body[data-aos-delay=\"1450\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1450\"].aos-animate,body[data-aos-delay=\"1450\"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration=\"1500\"],body[data-aos-duration=\"1500\"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay=\"1500\"],body[data-aos-delay=\"1500\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1500\"].aos-animate,body[data-aos-delay=\"1500\"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration=\"1550\"],body[data-aos-duration=\"1550\"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay=\"1550\"],body[data-aos-delay=\"1550\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1550\"].aos-animate,body[data-aos-delay=\"1550\"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration=\"1600\"],body[data-aos-duration=\"1600\"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay=\"1600\"],body[data-aos-delay=\"1600\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1600\"].aos-animate,body[data-aos-delay=\"1600\"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration=\"1650\"],body[data-aos-duration=\"1650\"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay=\"1650\"],body[data-aos-delay=\"1650\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1650\"].aos-animate,body[data-aos-delay=\"1650\"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration=\"1700\"],body[data-aos-duration=\"1700\"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay=\"1700\"],body[data-aos-delay=\"1700\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1700\"].aos-animate,body[data-aos-delay=\"1700\"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration=\"1750\"],body[data-aos-duration=\"1750\"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay=\"1750\"],body[data-aos-delay=\"1750\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1750\"].aos-animate,body[data-aos-delay=\"1750\"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration=\"1800\"],body[data-aos-duration=\"1800\"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay=\"1800\"],body[data-aos-delay=\"1800\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1800\"].aos-animate,body[data-aos-delay=\"1800\"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration=\"1850\"],body[data-aos-duration=\"1850\"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay=\"1850\"],body[data-aos-delay=\"1850\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1850\"].aos-animate,body[data-aos-delay=\"1850\"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration=\"1900\"],body[data-aos-duration=\"1900\"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay=\"1900\"],body[data-aos-delay=\"1900\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1900\"].aos-animate,body[data-aos-delay=\"1900\"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration=\"1950\"],body[data-aos-duration=\"1950\"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay=\"1950\"],body[data-aos-delay=\"1950\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"1950\"].aos-animate,body[data-aos-delay=\"1950\"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration=\"2000\"],body[data-aos-duration=\"2000\"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay=\"2000\"],body[data-aos-delay=\"2000\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2000\"].aos-animate,body[data-aos-delay=\"2000\"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration=\"2050\"],body[data-aos-duration=\"2050\"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay=\"2050\"],body[data-aos-delay=\"2050\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2050\"].aos-animate,body[data-aos-delay=\"2050\"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration=\"2100\"],body[data-aos-duration=\"2100\"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay=\"2100\"],body[data-aos-delay=\"2100\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2100\"].aos-animate,body[data-aos-delay=\"2100\"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration=\"2150\"],body[data-aos-duration=\"2150\"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay=\"2150\"],body[data-aos-delay=\"2150\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2150\"].aos-animate,body[data-aos-delay=\"2150\"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration=\"2200\"],body[data-aos-duration=\"2200\"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay=\"2200\"],body[data-aos-delay=\"2200\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2200\"].aos-animate,body[data-aos-delay=\"2200\"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration=\"2250\"],body[data-aos-duration=\"2250\"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay=\"2250\"],body[data-aos-delay=\"2250\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2250\"].aos-animate,body[data-aos-delay=\"2250\"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration=\"2300\"],body[data-aos-duration=\"2300\"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay=\"2300\"],body[data-aos-delay=\"2300\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2300\"].aos-animate,body[data-aos-delay=\"2300\"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration=\"2350\"],body[data-aos-duration=\"2350\"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay=\"2350\"],body[data-aos-delay=\"2350\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2350\"].aos-animate,body[data-aos-delay=\"2350\"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration=\"2400\"],body[data-aos-duration=\"2400\"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay=\"2400\"],body[data-aos-delay=\"2400\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2400\"].aos-animate,body[data-aos-delay=\"2400\"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration=\"2450\"],body[data-aos-duration=\"2450\"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay=\"2450\"],body[data-aos-delay=\"2450\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2450\"].aos-animate,body[data-aos-delay=\"2450\"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration=\"2500\"],body[data-aos-duration=\"2500\"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay=\"2500\"],body[data-aos-delay=\"2500\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2500\"].aos-animate,body[data-aos-delay=\"2500\"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration=\"2550\"],body[data-aos-duration=\"2550\"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay=\"2550\"],body[data-aos-delay=\"2550\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2550\"].aos-animate,body[data-aos-delay=\"2550\"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration=\"2600\"],body[data-aos-duration=\"2600\"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay=\"2600\"],body[data-aos-delay=\"2600\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2600\"].aos-animate,body[data-aos-delay=\"2600\"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration=\"2650\"],body[data-aos-duration=\"2650\"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay=\"2650\"],body[data-aos-delay=\"2650\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2650\"].aos-animate,body[data-aos-delay=\"2650\"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration=\"2700\"],body[data-aos-duration=\"2700\"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay=\"2700\"],body[data-aos-delay=\"2700\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2700\"].aos-animate,body[data-aos-delay=\"2700\"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration=\"2750\"],body[data-aos-duration=\"2750\"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay=\"2750\"],body[data-aos-delay=\"2750\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2750\"].aos-animate,body[data-aos-delay=\"2750\"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration=\"2800\"],body[data-aos-duration=\"2800\"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay=\"2800\"],body[data-aos-delay=\"2800\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2800\"].aos-animate,body[data-aos-delay=\"2800\"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration=\"2850\"],body[data-aos-duration=\"2850\"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay=\"2850\"],body[data-aos-delay=\"2850\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2850\"].aos-animate,body[data-aos-delay=\"2850\"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration=\"2900\"],body[data-aos-duration=\"2900\"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay=\"2900\"],body[data-aos-delay=\"2900\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2900\"].aos-animate,body[data-aos-delay=\"2900\"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration=\"2950\"],body[data-aos-duration=\"2950\"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay=\"2950\"],body[data-aos-delay=\"2950\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"2950\"].aos-animate,body[data-aos-delay=\"2950\"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration=\"3000\"],body[data-aos-duration=\"3000\"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay=\"3000\"],body[data-aos-delay=\"3000\"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay=\"3000\"].aos-animate,body[data-aos-delay=\"3000\"] [data-aos].aos-animate{transition-delay:3s}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,transform}[data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;transform:translateZ(0)}[data-aos=fade-up]{transform:translate3d(0,100px,0)}[data-aos=fade-down]{transform:translate3d(0,-100px,0)}[data-aos=fade-right]{transform:translate3d(-100px,0,0)}[data-aos=fade-left]{transform:translate3d(100px,0,0)}[data-aos=fade-up-right]{transform:translate3d(-100px,100px,0)}[data-aos=fade-up-left]{transform:translate3d(100px,100px,0)}[data-aos=fade-down-right]{transform:translate3d(-100px,-100px,0)}[data-aos=fade-down-left]{transform:translate3d(100px,-100px,0)}[data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,transform}[data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;transform:translateZ(0) scale(1)}[data-aos=zoom-in]{transform:scale(.6)}[data-aos=zoom-in-up]{transform:translate3d(0,100px,0) scale(.6)}[data-aos=zoom-in-down]{transform:translate3d(0,-100px,0) scale(.6)}[data-aos=zoom-in-right]{transform:translate3d(-100px,0,0) scale(.6)}[data-aos=zoom-in-left]{transform:translate3d(100px,0,0) scale(.6)}[data-aos=zoom-out]{transform:scale(1.2)}[data-aos=zoom-out-up]{transform:translate3d(0,100px,0) scale(1.2)}[data-aos=zoom-out-down]{transform:translate3d(0,-100px,0) scale(1.2)}[data-aos=zoom-out-right]{transform:translate3d(-100px,0,0) scale(1.2)}[data-aos=zoom-out-left]{transform:translate3d(100px,0,0) scale(1.2)}[data-aos^=slide][data-aos^=slide]{transition-property:transform}[data-aos^=slide][data-aos^=slide].aos-animate{transform:translateZ(0)}[data-aos=slide-up]{transform:translate3d(0,100%,0)}[data-aos=slide-down]{transform:translate3d(0,-100%,0)}[data-aos=slide-right]{transform:translate3d(-100%,0,0)}[data-aos=slide-left]{transform:translate3d(100%,0,0)}[data-aos^=flip][data-aos^=flip]{backface-visibility:hidden;transition-property:transform}[data-aos=flip-left]{transform:perspective(2500px) rotateY(-100deg)}[data-aos=flip-left].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-right]{transform:perspective(2500px) rotateY(100deg)}[data-aos=flip-right].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-up]{transform:perspective(2500px) rotateX(-100deg)}[data-aos=flip-up].aos-animate{transform:perspective(2500px) rotateX(0)}[data-aos=flip-down]{transform:perspective(2500px) rotateX(100deg)}[data-aos=flip-down].aos-animate{transform:perspective(2500px) rotateX(0)}"
  },
  {
    "path": "static/cms/static/css/gordita-fonts.css",
    "content": "@font-face{font-family:'Gordita';font-style:normal;font-weight:300;src:local('Gordita'),url('../fonts/gordita-light.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:300;src:local('Gordita-light-italic'),url('../fonts/gordita-light-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:400;src:local('Gordita-thin'),url('../fonts/gordita-thin.woff') format('woff')}@font-face{font-family:'Gordita Thin';font-style:italic;font-weight:400;src:local('Gordita Thin Italic'),url('../fonts/gordita-thin-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:500;src:local('Gordita-regular'),url('../fonts/gordita-regular.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:500;src:local('Gordita Regular Italic'),url('../fonts/gordita-regular-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:600;src:local('Gordita-medium'),url('../fonts/gordita-medium.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:600;src:local('Gordita-medium-italic'),url('../fonts/gordita-medium-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:700;src:local('Gorditabold'),url('../fonts/gordita-bold.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:700;src:local('Gordita-bold-italic'),url('../fonts/gordita-bold-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:800;src:local('Gordita-black'),url('../fonts/gordita-black.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:800;src:local('Gordita-black-italic'),url('../fonts/gordita-black-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:900;src:local('Gordita-ultra'),url('../fonts/gordita-ultra.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:900;src:local('Gordita-ultra-italic'),url('../fonts/gordita-ultra-italic.woff') format('woff')}"
  },
  {
    "path": "static/cms/static/css/style.css",
    "content": "@charset \"UTF-8\";*,*::after,*::before{-webkit-box-sizing:border-box;box-sizing:border-box}html,body{height:100%}body{line-height:1.74;font-size:15px;font-style:normal;font-weight:500;visibility:visible;font-family:\"Gordita\";color:#333;position:relative;background-color:#fff}body.no-overflow{overflow:hidden}h1,h2,h3,h4,h5,h6{color:#000;font-family:\"Gordita\";font-weight:600;margin-top:0;margin-bottom:0;line-height:1.41}h1{font-size:56px}@media only screen and (min-width:992px) and (max-width:1199px){h1{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){h1{font-size:40px}}@media only screen and (max-width:767px){h1{font-size:34px}}h2{font-size:38px}@media only screen and (min-width:992px) and (max-width:1199px){h2{font-size:32px}}@media only screen and (min-width:768px) and (max-width:991px){h2{font-size:30px}}@media only screen and (max-width:767px){h2{font-size:26px}}h3{font-size:24px}@media only screen and (min-width:992px) and (max-width:1199px){h3{font-size:22px}}@media only screen and (min-width:768px) and (max-width:991px){h3{font-size:20px}}@media only screen and (max-width:767px){h3{font-size:20px}}h4{font-size:20px}@media only screen and (min-width:992px) and (max-width:1199px){h4{font-size:18px}}@media only screen and (min-width:768px) and (max-width:991px){h4{font-size:18px}}@media only screen and (max-width:767px){h4{font-size:18px}}h5{font-size:18px}@media only screen and (max-width:767px){h5{font-size:16px}}h6{font-size:16px}p:last-child{margin-bottom:0}a,button{color:inherit;display:inline-block;line-height:inherit;text-decoration:none;cursor:pointer}a,button,img,input{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}*:focus{outline:none!important}a:focus{color:inherit;outline:0;text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}a:hover{text-decoration:none;color:#ffc4a0}.theme-color-two a:hover{color:#ffc4a0}.theme-color-three a:hover{color:#a50eff}.theme-color-four a:hover{color:#5974ff}.theme-color-five a:hover{color:#5138ee}.theme-color-six a:hover{color:#5138ee}button,input[type=\"submit\"]{cursor:pointer}ul{list-style:outside none none;margin:0;padding:0}.form-messege.success,.form-messege-2.success{color:green}.form-messege.error,.form-messege-2.error{color:red}.mark,mark{padding:0;background-color:transparent}.font-weight--bold{font-weight:800}.font-weight--reguler{font-weight:500}.font-weight--normal{font-weight:400}.font-weight--light{font-weight:300}.text-color-primary{color:#ffc4a0}.text-color-secondary{color:#f9c322}.text-black{color:#000!important}.bg-gray{background-color:#edf0f8}.bg-gray-1{background-color:#fafafa}.bg-gray-2{background-color:#f8f8f8}.bg-gradient{background:-webkit-linear-gradient(top,#FFF 0,#F5F5F5 100%)}select{padding:3px 20px;height:56px;max-width:100%;width:100%;outline:0;border:1px solid #f8f8f8;border-radius:5px;background:#f8f8f8 url(\"../images/selector-icon.png\") no-repeat center right 20px;background-color:#f8f8f8;-moz-appearance:none;-webkit-appearance:none}select:focus{background:#f8f8f8 url(\"../images/selector-icon.png\") no-repeat center right 20px!important}.fixed-bg{background-size:cover;background-repeat:no-repeat;background-attachment:fixed}.text-black{color:#333}.box-shadow-top{-webkit-box-shadow:0 10px 15px rgba(0,0,0,0.05);box-shadow:0 10px 15px rgba(0,0,0,0.05)}.border{border:1px solid #ededed!important}.border-top{border-top:1px solid #ededed!important}.border-right{border-right:1px solid #ededed!important}.border-bottom{border-bottom:1px solid #ededed!important}.border-left{border-left:1px solid #ededed!important}.border-top-dash{border-top:1px dashed #ddd!important}.border-bottom-dash{border-bottom:1px dashed #ddd!important}.border-top-thick{border-top:2px solid #ededed!important}.border-bottom-thick{border-bottom:2px solid #ededed!important}.border-top-drak{border-top:1px solid rgba(255,255,255,0.2)!important}.border-bottom-drak{border-bottom:1px solid rgba(255,255,255,0.2)!important}img{max-width:100%}.img-width{width:100%}::-moz-selection{color:#fff;background-color:#ffc4a0}::selection{color:#fff;background-color:#ffc4a0}form input:focus::-webkit-input-placeholder{color:transparent}form input:focus:-moz-placeholder{color:transparent}form input:focus::-moz-placeholder{color:transparent}form input:focus:-ms-input-placeholder{color:transparent}form input,form textarea{font-weight:500}form input::-webkit-input-placeholder,form textarea::-webkit-input-placeholder{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::-moz-placeholder,form textarea::-moz-placeholder{-moz-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input:-ms-input-placeholder,form textarea:-ms-input-placeholder{-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::-ms-input-placeholder,form textarea::-ms-input-placeholder{-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::placeholder,form textarea::placeholder{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}input[type=\"text\"]:focus,input[type=\"email\"]:focus,input[type=\"url\"]:focus,input[type=\"password\"]:focus,input[type=\"search\"]:focus,input[type=\"number\"]:focus,input[type=\"tel\"]:focus,input[type=\"range\"]:focus,input[type=\"date\"]:focus,input[type=\"month\"]:focus,input[type=\"week\"]:focus,input[type=\"time\"]:focus,input[type=\"datetime\"]:focus,input[type=\"datetime-local\"]:focus,input[type=\"color\"]:focus,textarea:focus,select:focus,select:focus,textarea:focus{color:#ffc4a0;border-color:#ffc4a0}input[type=\"checkbox\"]{position:relative;background:0;border-width:0;-webkit-box-shadow:none;box-shadow:none;margin:0 10px 0 3px;cursor:pointer}.navigation-button{height:40px;width:40px;text-align:center;line-height:38px;background-color:#f4f4f4;font-size:24px;border-radius:50000px;display:inline-block;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-button:hover{background-color:#ffc4a0;color:#fff}.navigation-button:last-child{margin-left:10px}.scroll-top{position:fixed;right:30px;bottom:-60px;z-index:999;-webkit-box-shadow:0 30px 50px rgba(0,0,0,0.03);box-shadow:0 30px 50px rgba(0,0,0,0.03);display:block;padding:0;width:60px;height:60px;border-radius:50%;text-align:center;font-size:25px;line-height:60px;cursor:pointer;opacity:0;visibility:hidden;background-color:#ffc4a0;background-size:200% auto;background-position:left center;color:#fff;-webkit-transition:all .5s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .5s cubic-bezier(0.645,0.045,0.355,1);transition:all .5s cubic-bezier(0.645,0.045,0.355,1);overflow:hidden}@media only screen and (max-width:479px){.scroll-top{width:50px;height:50px;line-height:50px;font-size:20px}}.scroll-top.show{visibility:visible;opacity:1;bottom:60px}.scroll-top i{position:absolute;top:50%;left:50%;color:#fff;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.scroll-top .arrow-top{-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.scroll-top .arrow-bottom{-webkit-transform:translate(-50%,80px);-ms-transform:translate(-50%,80px);transform:translate(-50%,80px)}.scroll-top:hover{background-position:right center}.scroll-top:hover .arrow-top{-webkit-transform:translate(-50%,-80px);-ms-transform:translate(-50%,-80px);transform:translate(-50%,-80px)}.scroll-top:hover .arrow-bottom{-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.section-space--pt_150{padding-top:150px}@media only screen and (min-width:992px) and (max-width:1199px){.section-space--pt_150{padding-top:100px}}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_150{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_150{padding-top:60px}}.section-space--ptb_120{padding-top:120px;padding-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_120{padding-top:80px;padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--ptb_120{padding-top:60px;padding-bottom:60px}}.section-space--pt_120{padding-top:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_120{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_120{padding-top:60px}}.section-space--pb_120{padding-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_120{padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--pb_120{padding-bottom:60px}}.section-space--ptb_100{padding-top:100px;padding-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_100{padding-top:80px;padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--ptb_100{padding-top:60px;padding-bottom:60px}}.section-space--pt_100{padding-top:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_100{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_100{padding-top:60px}}.section-space--pb_100{padding-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_100{padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--pb_100{padding-bottom:60px}}.section-space--ptb_90{padding-top:90px;padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_90{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_90{padding-top:40px;padding-bottom:40px}}.section-space--pt_90{padding-top:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_90{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_90{padding-top:40px}}.section-space--pb_90{padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_90{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_90{padding-bottom:40px}}.section-space--ptb_80{padding-top:80px;padding-bottom:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_80{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_80{padding-top:40px;padding-bottom:40px}}.section-space--pt_80{padding-top:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_80{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_80{padding-top:40px}}.section-space--pb_80{padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_80{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_80{padding-bottom:40px}}.section-space--ptb_70{padding-top:70px;padding-bottom:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_70{padding-top:40px;padding-bottom:40px}}@media only screen and (max-width:767px){.section-space--ptb_70{padding-top:30px;padding-bottom:30px}}.section-space--pt_70{padding-top:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_70{padding-top:40px}}@media only screen and (max-width:767px){.section-space--pt_70{padding-top:30px}}.section-space--pb_70{padding-bottom:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_70{padding-bottom:40px}}@media only screen and (max-width:767px){.section-space--pb_70{padding-bottom:30px}}.section-space--ptb_60{padding-top:60px;padding-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_60{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_60{padding-top:60px;padding-bottom:60px}}.section-space--pt_60{padding-top:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_60{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_60{padding-top:60px}}.section-space--pb_60{padding-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_60{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_60{padding-bottom:60px}}.section-space--pt_40{padding-top:40px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_40{padding-top:30px}}@media only screen and (max-width:767px){.section-space--pt_40{padding-top:30px}}.section-space--pb_40{padding-bottom:40px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_40{padding-bottom:30px}}@media only screen and (max-width:767px){.section-space--pb_40{padding-bottom:30px}}.section-space--ptb_30{padding-top:30px;padding-bottom:30px}.section-space--pt_30{padding-top:30px}.section-space--pb_30{padding-bottom:30px}.section-space--mt_15{margin-top:15px}.section-space--mt_20{margin-top:20px}.section-space--mt_30{margin-top:30px}.section-space--mt_40{margin-top:40px}.section-space--mt_50{margin-top:50px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_50{margin-top:40px}}@media only screen and (max-width:767px){.section-space--mt_50{margin-top:30px}}.section-space--mt_60{margin-top:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_60{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_60{margin-top:30px}}.section-space--mt_70{margin-top:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_70{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_70{margin-top:30px}}.section-space--mt_80{margin-top:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_80{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_80{margin-top:30px}}.section-space--mt_100{margin-top:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_100{margin-top:80px}}@media only screen and (max-width:767px){.section-space--mt_100{margin-top:60px}}.section-space--mt_120{margin-top:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_120{margin-top:80px}}@media only screen and (max-width:767px){.section-space--mt_120{margin-top:60px}}.section-space--mb_15{margin-bottom:15px}.section-space--mb_20{margin-bottom:20px}.section-space--mb_30{margin-bottom:30px}.section-space--mb_40{margin-bottom:40px}@media only screen and (max-width:767px){.section-space--mb_40{margin-bottom:30px}}.section-space--mb_50{margin-bottom:50px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_50{margin-bottom:40px}}@media only screen and (max-width:767px){.section-space--mb_50{margin-bottom:30px}}.section-space--mb_60{margin-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_60{margin-bottom:50px}}@media only screen and (max-width:767px){.section-space--mb_60{margin-bottom:30px}}.section-space--mb_100{margin-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_100{margin-bottom:80px}}@media only screen and (max-width:767px){.section-space--mb_100{margin-bottom:60px}}.section-space--mb_120{margin-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_120{margin-bottom:80px}}@media only screen and (max-width:767px){.section-space--mb_120{margin-bottom:60px}}.mb-10{margin-bottom:10px}.mb-15{margin-bottom:15px}.mb-20{margin-bottom:20px}.mb-25{margin-bottom:25px}.mb-30{margin-bottom:30px}.mb-40{margin-bottom:40px}.mt-10{margin-top:10px}.mt-15{margin-top:15px}.mt-20{margin-top:20px}.mt-25{margin-top:25px}.mt-30{margin-top:30px}.mt-40{margin-top:40px}@media only screen and (max-width:767px){.small-mt__0{margin-top:0}.small-mt__10{margin-top:10px}.small-mt__20{margin-top:20px}.small-mt__30{margin-top:30px}.small-mt__40{margin-top:40px}.small-mt__50{margin-top:50px}.small-mt__60{margin-top:60px}.small-mb__30{margin-bottom:30px}.small-mb__40{margin-bottom:40px}.small-mb__50{margin-bottom:50px}.small-mb__60{margin-bottom:60px}}@media only screen and (min-width:768px) and (max-width:991px){.tablet-mt__0{margin-top:0}.tablet-mt__30{margin-top:30px}.tablet-mt__40{margin-top:40px}.tablet-mt__50{margin-top:50px}.tablet-mt__60{margin-top:60px}.tablet-mb__30{margin-bottom:30px}.tablet-mb__40{margin-bottom:40px}.tablet-mb__50{margin-bottom:50px}.tablet-mb__60{margin-bottom:60px}}@media(min-width:1200px){.container{max-width:1200px}}.container-custom-xl{max-width:1540px;width:100%}@media only screen and (min-width:1200px) and (max-width:1499px){.container-custom-xl{max-width:100%}}@media only screen and (min-width:992px) and (max-width:1199px){.container-custom-xl{max-width:100%;width:100%}}.container-custom-150{padding-right:115px;padding-left:115px}@media only screen and (min-width:1200px) and (max-width:1499px){.container-custom-150{padding-right:50px;padding-left:50px}}@media only screen and (min-width:992px) and (max-width:1199px){.container-custom-150{padding-right:15px;padding-left:15px}}@media only screen and (min-width:768px) and (max-width:991px){.container-custom-150{padding-right:15px;padding-left:15px}}@media only screen and (max-width:767px){.container-custom-150{padding-right:15px;padding-left:15px}}.row--35{margin-left:-35px;margin-right:-35px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--35{margin-left:-15px!important;margin-right:-15px!important}}.row--35>[class*=\"col\"],.row--35>[class*=\"col-\"]{padding-left:35px;padding-right:35px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--35>[class*=\"col\"],.row--35>[class*=\"col-\"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--35>[class*=\"col\"],.row--35>[class*=\"col-\"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--35>[class*=\"col\"],.row--35>[class*=\"col-\"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--35>[class*=\"col\"],.row--35>[class*=\"col-\"]{padding-left:15px!important;padding-right:15px!important}}.row--30{margin-left:-30px;margin-right:-30px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--30{margin-left:-12px!important;margin-right:-12px!important}}.row--30>[class*=\"col\"],.row--30>[class*=\"col-\"]{padding-left:30px;padding-right:30px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--30>[class*=\"col\"],.row--30>[class*=\"col-\"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--30>[class*=\"col\"],.row--30>[class*=\"col-\"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--30>[class*=\"col\"],.row--30>[class*=\"col-\"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--30>[class*=\"col\"],.row--30>[class*=\"col-\"]{padding-left:15px!important;padding-right:15px!important}}.row--17{margin-left:-17px;margin-right:-17px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--17{margin-left:-17px;margin-right:-17px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--17{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--17{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--17{margin-left:-15px!important;margin-right:-15px!important}}.row--17>[class*=\"col\"],.row--17>[class*=\"col-\"]{padding-left:17px;padding-right:17px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--17>[class*=\"col\"],.row--17>[class*=\"col-\"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--17>[class*=\"col\"],.row--17>[class*=\"col-\"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--17>[class*=\"col\"],.row--17>[class*=\"col-\"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--17>[class*=\"col\"],.row--17>[class*=\"col-\"]{padding-left:15px!important;padding-right:15px!important}}.row--10{margin-left:-10px;margin-right:-10px}@media only screen and (min-width:992px) and (max-width:1199px){.row--10{margin-left:-10px;margin-right:-10px}}@media only screen and (min-width:768px) and (max-width:991px){.row--10{margin-left:-10px;margin-right:-10px}}@media only screen and (max-width:767px){.row--10{margin-left:-10px!important;margin-right:-10px!important}}.row--10>[class*=\"col\"],.row--10>[class*=\"col-\"]{padding-left:10px;padding-right:10px}@media only screen and (min-width:992px) and (max-width:1199px){.row--10>[class*=\"col\"],.row--10>[class*=\"col-\"]{padding-left:10px;padding-right:10px}}@media only screen and (min-width:768px) and (max-width:991px){.row--10>[class*=\"col\"],.row--10>[class*=\"col-\"]{padding-left:10px!important;padding-right:10px!important}}@media only screen and (max-width:767px){.row--10>[class*=\"col\"],.row--10>[class*=\"col-\"]{padding-left:10px!important;padding-right:10px!important}}.section-title-two{position:relative;margin-bottom:40px}.section-title-two::after{background-color:#e3e3e3;content:\"\";left:0;top:50%;position:absolute;height:1px;width:100%}.section-title-two h2{color:#0f034a;background:#fff;display:inline-block;position:relative;z-index:1}.section-title-two h2::after{background-color:#fff;content:\"\";right:-50px;left:auto;top:50%;position:absolute;height:90%;width:50px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.section-title-two h2::before{background-color:#fff;content:\"\";left:-50px;right:auto;top:50%;position:absolute;height:90%;width:50px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.section-title-three .title{color:#0f034a}.sub-title-four{color:#5974ff}.breadcrumb-area{background-color:#fafafa;padding:80px 0}.breadcrumb-list{padding:10px 20px;background-color:#ffebdf;display:inline-block;border-radius:15px}.breadcrumb-list li{display:inline-block}.breadcrumb-item+.breadcrumb-item{padding-left:1.5rem;position:relative}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.1rem;color:#222;content:'';height:6px;width:6px;background:#222;border-radius:5000px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);position:absolute;left:8px}.btn{height:50px;line-height:48px;padding:0 30px;font-weight:500;border-radius:15px}.btn:hover{background-color:#ffc4a0}.btn i{margin-left:10px;font-size:22px}.btn-primary{background:#ffc4a0;font-weight:500;border-radius:10px;color:#fff;border:0}.btn-primary:focus{outline:none!important}.btn-primary:hover,.btn-primary:focus{background:#d4966f;color:#fff;-webkit-box-shadow:none;box-shadow:none}.btn-primary i{margin-left:10px;font-size:22px}.btn-bg-2{background-color:#ff7d6b;color:#fff}.btn-bg-3{background-color:#a50eff;color:#fff}.btn-bg-4{background-color:#5974ff;color:#fff}.btn-bg-5{background-color:#fed74b;color:#000}.btn-bg-5-primary{background-color:#5138ee;color:#fff}.btn-bg-5-primary:hover{color:#222}.btn-bg-6{background-color:#5138ee;color:#fff}.btn-bg-white{background-color:#fff;color:#0f034a}.btn-primary-three{padding:0 30px;background:#f4eaff;font-weight:600;border-radius:10px;color:#0f034a;border:0}.btn-primary-three:focus{outline:none!important}.btn-primary-three:hover,.btn-primary-three:focus{background:#a50eff;color:#fff!important;-webkit-box-shadow:none;box-shadow:none}.btn-primary-three i{margin-left:15px;font-size:22px}.btn-primary-four{padding:0 30px;background:#edf0f8;font-weight:600;border-radius:10px;color:#081131;border:0}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.btn-primary-four{padding:0 20px}}.btn-primary-four:focus{outline:none!important}.btn-primary-four:hover,.btn-primary-four:focus{background:#5974ff;color:#fff!important;-webkit-box-shadow:none;box-shadow:none}.btn-primary-four i{margin-left:15px;font-size:22px}.btn-outline-2{border:2px solid #ddd;border-radius:10px;color:#fff;padding-bottom:2px;color:#ff7d6b}.btn-outline-2:hover{color:#fff;border:2px solid #ff7d6b;background-color:#ff7d6b}.btn-large{padding:0 30px;height:60px;line-height:60px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.btn-large{padding:0 20px}}.btn-medium{height:50px;line-height:50px;padding:0 20px}.woocommerce{background-color:#fff1dc;color:#d59a46;border-radius:15px}.woocommerce:hover{background-color:#d59a46;color:#fff}.wordpress{background-color:#e0f9f6;color:#3ac8bd;border-radius:15px}.wordpress:hover{background-color:#3ac8bd;color:#fff}.magento{background-color:#fbefef;color:#b36262;border-radius:15px}.magento:hover{background-color:#b36262;color:#fff}.laravel{background-color:#9c8bda;color:#fff;border-radius:15px}.laravel:hover{background-color:#9c8bda;color:#fff}.ux-design{background-color:#e8f7e0;color:#8cad78;border-radius:15px}.ux-design:hover{background-color:#8cad78;color:#fff}.online-tutorial{background-color:#e3f0ff;color:#7f9cbf;border-radius:15px}.online-tutorial:hover{background-color:#7f9cbf;color:#fff}.marketing{background-color:#fdf0e8;color:#c49076;border-radius:15px}.marketing:hover{background-color:#c49076;color:#fff}.javaScript{background-color:#ffe7da;color:#fe8e4b;border-radius:15px}.javaScript:hover{background-color:#fe8e4b;color:#fff}.lifestyle{background-color:#e1fae3;color:#1f9a39;border-radius:15px}.lifestyle:hover{background-color:#1f9a39;color:#fff}.fashion{background-color:#ffebdf;border-radius:15px}.fashion:hover{color:#fff;background-color:#f3d6c5}.health{background-color:#dcf1ff;border-radius:15px}.travel{background-color:#ffe6af;border-radius:15px}.business{background-color:#e1f3ff;border-radius:15px}.food{background-color:#f9e7a0;border-radius:15px}.lifesytle{background-color:#ffebde;border-radius:15px}.tech{background-color:#ffebdf;border-radius:15px}.tech:hover{color:#222}.marketing{background-color:#fce7e7;border-radius:15px;color:#222}.marketing:hover{color:#222}.doctor{background-color:#e6f9ed;border-radius:15px;color:#222}.doctor:hover{color:#222}.health{background-color:#eaf6fd;border-radius:15px;color:#222}.health:hover{color:#222}.single-testimonial-item,.single-testimonial-item-two{padding:30px 35px 60px;background-color:#fff;border-radius:15px;position:relative;margin-top:40px}.single-testimonial-item::after,.single-testimonial-item-two::after{position:absolute;right:35px;bottom:20px;content:'';background:url(\"../images/quote.png\");background-repeat:no-repeat;height:40px;width:52px}.single-testimonial-item-two::after{background:url(\"../images/quote-2.png\");background-repeat:no-repeat}.single-testimonial-item-two .testimonial-author-info p{color:#ffc4a0}.testimonial-post-author{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-bottom:30px;border-bottom:1px solid #ddd;margin-bottom:30px}.testimonial-author-image{width:70px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-right:20px}.testimonial-author-image img{border-radius:50%;}.testimonial-author-info p{margin-top:10px;color:#5974ff;font-size:11px}.testimonial-post-content .testimonial-post-title{margin-bottom:25px;line-height:1.6}.testimonial-post-content p{font-size:14px;line-height:2}.testimonial-slider-navigation,.testimonial-slider-navigation-two{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:50px}.testimonial-slider-navigation .navigation-button,.testimonial-slider-navigation-two .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #5974ff;text-align:center;font-size:25px;border-radius:10px;color:#5974ff;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background-color:transparent;margin:10px}.testimonial-slider-navigation .navigation-button:hover,.testimonial-slider-navigation-two .navigation-button:hover{border:2px solid #5974ff;background-color:#5974ff;color:#fff}.testimonial-slider-navigation-two .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #ffc4a0;text-align:center;font-size:25px;border-radius:500000px;color:#fff;background-color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;margin:10px}.testimonial-slider-navigation-two .navigation-button:hover{border:2px solid #222;background-color:#222;color:#fff}.single-popup-wrap{position:relative}.single-popup-wrap img{width:100%}.video-link{-webkit-transition:all .3s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .3s cubic-bezier(0.645,0.045,0.355,1);transition:all .3s cubic-bezier(0.645,0.045,0.355,1);display:block}.video-link .ht-popup-video.video-overlay{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:rgba(8,106,216,0.8)}.video-link .ht-popup-video.video-button{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.video-link .ht-popup-video.video-button .video-mark{position:absolute;top:50%;left:50%;-webkit-transform:translateY(-50%,-50%);-ms-transform:translateY(-50%,-50%);transform:translateY(-50%,-50%);pointer-events:none}.video-link .ht-popup-video.video-button .video-mark .wave-pulse{width:1px;height:0;margin:0 auto}.video-link .ht-popup-video.video-button .video-mark .wave-pulse::after,.video-link .ht-popup-video.video-button .video-mark .wave-pulse::before{opacity:0;content:'';display:block;position:absolute;width:200px;height:200px;top:50%;left:50%;border-radius:50%;border:3px solid #ffc4a0;-webkit-animation:zoomBig 3.25s linear infinite;animation:zoomBig 3.25s linear infinite;-webkit-animation-delay:0s;animation-delay:0s}.video-link .ht-popup-video.video-button .video-mark .wave-pulse::before{-webkit-animation-delay:.75s;animation-delay:.75s}.video-link .ht-popup-video .video-button{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.video-link .ht-popup-video .video-button__one{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.video-link .ht-popup-video .video-button__one .video-play{width:72px;height:72px;background:transparent;border:6px solid #fff;border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important}.video-link .ht-popup-video .video-button__one .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__one .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:11px solid transparent;border-bottom:11px solid transparent;border-left:17px solid #fff}.video-link .ht-popup-video .video-button__two{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.video-link .ht-popup-video .video-button__two .video-play{width:78px;height:78px;background:#ffc4a0;border:3px solid #fff;-webkit-box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important;-webkit-box-shadow:0 20px 30px rgba(0,0,0,0.07);box-shadow:0 20px 30px rgba(0,0,0,0.07)}.video-link .ht-popup-video .video-button__two .video-play-sm{width:58px;height:58px;background:#ffc4a0;border:3px solid #fff;-webkit-box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important;-webkit-box-shadow:0 20px 30px rgba(0,0,0,0.07);box-shadow:0 20px 30px rgba(0,0,0,0.07)}.video-link .ht-popup-video .video-button__two .video-play-sm .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__two .video-play-sm .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:9px solid transparent;border-bottom:9px solid transparent;border-left:12px solid #fff;border-top-width:8px;border-bottom-width:9px;border-left-width:15px;border-left-color:#fff}.video-link .ht-popup-video .video-button__two .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__two .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:11px solid transparent;border-bottom:11px solid transparent;border-left:17px solid #fff;border-top-width:12px;border-bottom-width:12px;border-left-width:19px;border-left-color:#fff}.video-link:hover .video-play,.video-link:hover .video-play-sm{-webkit-transform:scale3d(1.15,1.15,1.15);transform:scale3d(1.15,1.15,1.15)}@-webkit-keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}@keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}@keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}.header-sticky.is-sticky{position:fixed;top:0;left:0;width:100%;-webkit-animation:.95s ease-in-out 0s normal none 1 running fadeInDown;animation:.95s ease-in-out 0s normal none 1 running fadeInDown;z-index:999;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-box-shadow:0 8px 20px 0 rgba(0,0,0,0.1);box-shadow:0 8px 20px 0 rgba(0,0,0,0.1);background-color:#fff}.position--absolute{position: absolute;width:100%;z-index:5}.mobile-menu-right{margin-right:0;float:right}.header-top-area{background-color:#22262a;padding-bottom:10px}.header-top-menu-list{margin-top:10px}.header-top-menu-list li{display:inline-block;padding-right:20px;margin-right:15px;position:relative}.header-top-menu-list li::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#ffc4a0;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.header-top-menu-list li a{color:#fff}.header-top-menu-list li a:hover{color:#ffc4a0}.header-top-menu-list li:last-child{padding-right:0;margin-right:0}.header-top-menu-list li:last-child::after{display:none}@media only screen and (max-width:575px){.header-top-menu-list{text-align:center}}.header-top-contact-info{margin-top:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.header-top-single-contact-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#fff;margin:0 30px}.header-top-single-contact-item:first-child{margin-left:0}.header-top-single-contact-item:last-child{margin-right:0}.header-top-single-contact-item .text-size-small{font-size:12px}@media only screen and (max-width:575px){.header-top-single-contact-item{margin:0 5px;font-size:13px}}.header-top-contact-icon{margin-right:15px}@media only screen and (max-width:575px){.header-top-contact-icon{margin-right:5px}}.header-top-right-side{margin-top:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;color:#ffc4a0}.header-top-right-side p{margin-bottom:0}.header-top-right-side .wayder-icon{margin:0 10px}@media only screen and (max-width:575px){.header-top-right-side{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}.header-mid-area{margin-top:20px;border-bottom:1px solid #f3f3f3;padding-bottom:20px}.header-mid-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-action-item{height:45px;min-width:45px;background:#f4f4f4;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:20px;border-radius:5px}.single-action-item:hover{background:#ffc4a0}.single-action-item:first-child{margin-left:0}@media only screen and (min-width:992px) and (max-width:1199px){.single-action-item{height:40px;min-width:40px;margin-left:12px}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.single-action-item{height:40px;min-width:40px;margin-left:7px}}.header-add-banner{position:relative}.header-add-banner a{display:block}.header-add-text{font-size:15px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:50px;display:inline-block}.header-add-text span{display:block;font-size:18px;text-align:left;margin-top:3px;font-weight:bold}.social-share-area li{display:inline-block;margin-right:15px}.social-share-area li:last-child{margin-right:0}.social-share-area li a{height:45px;width:45px;line-height:45px;text-align:center;background-color:#ddd;border-radius:5px}.social-share-area li a:hover{background-color:#ffc4a0;color:#fff}@media only screen and (max-width:767px){.social-share-area li{margin-right:10px}}@media only screen and (max-width:575px){.social-share-area li{margin-right:6px}}.social-share-area.social-share-border-outline li a{background-color:transparent;border-radius:15px;border:1px solid #fff;color:#fff}.social-share-area.social-share-border-outline li a:hover{background:#fff;color:#222}.social-share-area.social-share-normal a{height:auto;width:auto;line-height:auto;padding:0;border:0;background-color:transparent}.social-share-area.social-share-normal a:hover{background-color:transparent;color:#5138ee}.new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:0}.header-two{border-bottom:1px solid rgba(255,255,255,0.15)}.header-two .header-bottom-area{height:80px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;    background: #252c63;}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-two .header-bottom-area{height:auto}}.header-two-right-side{margin:15px 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.header-two-right-side .single-action-item{position:relative;border-radius:10px;border:2px solid rgba(255,255,255,0.5);background-color:transparent}.header-two-right-side .single-action-item::after,.header-two-right-side .single-action-item::before{height:2px;width:6px;background-color:#fff;content:'';position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);opacity:0;visibility:hidden;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.header-two-right-side .single-action-item::after{bottom:-2px}.header-two-right-side .single-action-item::before{top:-2px}.header-two-right-side .single-action-item:hover::after,.header-two-right-side .single-action-item:hover::before{opacity:1;visibility:visible}.header-two-right-side .new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:6px;top:4px}.header-three .header-bottom-area{height:110px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-three .header-bottom-area{height:auto}}.header-three-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0}.header-three-right-side .sign-up-action-button{font-size:16px;font-weight:500;margin-left:20px;color:#fff;background-color:#0f034a;white-space:nowrap;line-height:46px;border-radius:20px}.header-three-right-side .sign-up-action-button:hover{background-color:#a50eff;color:#fff}@media only screen and (max-width:575px){.header-three-right-side .sign-up-action-button{padding:0 10px;font-size:13px}}.header-three-right-side .single-action-item{background-color:#efe1ff;border-radius:20px;position:relative}.header-three-right-side .single-action-item .new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:8px;top:6px}.header-three-right-side .single-action-item .btn-medium{padding:0 26px}.header-style-center{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.header-four{border-bottom:1px solid rgba(255,255,255,0.3)}.header-four-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0;white-space:nowrap}.header-four-right-side .sign-up-action-button{font-size:15px;font-weight:500;margin-left:20px;color:#fff;background-color:transparent;border:2px solid #fff;height:66px;line-height:64px;padding:0 20px}.header-four-right-side .sign-up-action-button:hover{background-color:#5974ff;color:#fff;border:2px solid #5974ff}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-four-right-side .sign-up-action-button{padding:0 10px;font-size:13px;height:46px;line-height:44px}}.header-four-right-side .single-action-item{background-color:transparent;border:2px solid #fff;border-radius:15px;position:relative;height:64px;line-height:64px;padding:0 20px}.header-four-right-side .single-action-item .new-notification{height:6px;width:6px;border-radius:100%;background-color:#d83d40;position:absolute;right:10px;top:8px}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-four-right-side .single-action-item{height:46px;line-height:44px;padding:0 15px}}.header-five .header-top{background:url(\"../images/header-top.jpg\");background-repeat:no-repeat;background-size:cover;padding:15px 0}.header-five .time-offer{color:#fff;font-weight:18px}.header-five .time-offer .offer-text{color:#ff7d6b;margin-right:15px}.header-five .time-offer .get-offer-btn{padding:6px 16px;background-color:#fed74b;color:#000;border-radius:10px;font-weight:600}.header-five .time-offer .get-offer-btn:hover{background-color:#ff7d6b}.header-five .social-share-area{text-align:right}@media only screen and (max-width:767px){.header-five .social-share-area{text-align:center;margin-top:20px}}@media only screen and (min-width:768px) and (max-width:991px){.header-five .social-share-area li{margin-right:6px}}.header-five-left-side-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.header-five-left-side-box .ml-3{margin-left:60px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-five-left-side-box .ml-3{margin-left:0}}.header-five-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0}.header-five-right-side .sign-up-action-button{font-size:16px;font-weight:600;margin-left:30px;border-radius:10px}.header-five-right-side .sign-up-action-button:hover{background-color:#ff7d6b}@media only screen and (min-width:992px) and (max-width:1199px){.header-five-right-side .sign-up-action-button{margin-left:20px}}@media only screen and (max-width:575px){.header-five-right-side .sign-up-action-button{margin-left:0;padding:0 15px;font-size:13px}}.header-five-right-side .log-in-action-btn{font-weight:600}.header-six .header-top{padding:10px 0;border-bottom:1px solid #e8e8e8}.header-six .time-offer{color:#000;font-weight:18px}.header-six .time-offer .get-offer-btn{padding:6px 16px;background-color:#fed74b;color:#000;border-radius:10px;font-weight:600;margin-left:20px}.header-six .time-offer .get-offer-btn:hover{background-color:#ff7d6b}.header-six .social-share-area{text-align:right}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-six .social-share-area{text-align:center}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-six .header-bottom-area{margin-top:20px}}.mobile-navigation-icon{width:24px;height:25px;position:relative;cursor:pointer;display:inline-block;margin-right:0;margin-left:15px}.mobile-navigation-icon:hover i{background-color:#ffc4a0}.mobile-navigation-icon:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon:hover i:after{background-color:#ffc4a0;width:60%}.mobile-navigation-icon i{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);width:100%;height:2px;background-color:#333;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon i:before{position:absolute;bottom:8px;left:0;width:100%;height:2px;background-color:#333;content:\"\";-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon i:after{position:absolute;bottom:-8px;left:0;width:100%;height:2px;background-color:#333;content:\"\";-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon.icon-white i{background-color:#fff}.mobile-navigation-icon.icon-white i:before{background-color:#fff}.mobile-navigation-icon.icon-white i:after{background-color:#fff}.mobile-navigation-icon.icon-white:hover i{background-color:#ffc4a0}.mobile-navigation-icon.icon-white:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon.icon-white:hover i:after{background-color:#ffc4a0;width:60%}@media only screen and (min-width:992px) and (max-width:1199px){.mobile-navigation-icon.white-md-icon i{background-color:#fff}.mobile-navigation-icon.white-md-icon i:before{background-color:#fff}.mobile-navigation-icon.white-md-icon i:after{background-color:#fff}.mobile-navigation-icon.white-md-icon:hover i{background-color:#ffc4a0}.mobile-navigation-icon.white-md-icon:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon.white-md-icon:hover i:after{background-color:#ffc4a0;width:60%}}.mobile-menu-overlay,.page-oppen-off-sidebar{position:fixed;left:0;top:0;width:100%;height:100%;background-color:#000;overflow:auto;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);z-index:9999;background:rgba(0,0,0,0.7);visibility:hidden;opacity:0}.mobile-menu-overlay__inner,.page-oppen-off-sidebar__inner{-webkit-transform:translateX(120%);-ms-transform:translateX(120%);transform:translateX(120%);width:400px;height:100%;float:right;cursor:default;background:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);overflow-y:auto}@media only screen and (max-width:479px){.mobile-menu-overlay__inner,.page-oppen-off-sidebar__inner{width:300px}}.mobile-menu-overlay.active,.page-oppen-off-sidebar.active{visibility:visible;opacity:1}.mobile-menu-overlay.active .mobile-menu-overlay__inner,.page-oppen-off-sidebar.active .mobile-menu-overlay__inner{-webkit-transform:translateX(0%);-ms-transform:translateX(0%);transform:translateX(0%)}.mobile-menu-overlay__header,.page-oppen-off-sidebar__header{background-color:#fff;padding:15px 0}.mobile-menu-overlay__header .mobile-navigation-close-icon,.page-oppen-off-sidebar__header .mobile-navigation-close-icon{position:relative;cursor:pointer;height:40px;width:40px;line-height:40px;display:inline-block;margin-right:auto}.mobile-menu-overlay__header .mobile-navigation-close-icon:before,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:before{position:absolute;top:23px;left:8px;content:'';width:24px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__header .mobile-navigation-close-icon:after,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:after{position:absolute;top:23px;left:8px;content:'';width:24px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__header .mobile-navigation-close-icon:hover,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover{color:#ffc4a0}.mobile-menu-overlay__header .mobile-navigation-close-icon:hover:before,.mobile-menu-overlay__header .mobile-navigation-close-icon:hover:after,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover:before,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover:after{-webkit-transform:none;-ms-transform:none;transform:none}.mobile-menu-overlay__body,.page-oppen-off-sidebar__body{padding:20px 40px 100px}.mobile-menu-overlay__body .offcanvas-navigation>ul>li,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li{border-bottom:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li>a,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li>a{display:block;color:#000;padding-top:18px;padding-bottom:18px;font-size:16px;font-weight:500;line-height:1.5;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li>a:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li>a:hover{color:#000}.mobile-menu-overlay__body .offcanvas-navigation>ul>li:last-child,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li:last-child{border-bottom:0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children.active .menu-expand:before{content:'\\eaa1'}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand{position:absolute;right:0;top:12px;width:40px;height:40px;background:rgba(255,255,255,0.1);color:#000;text-align:center;line-height:40px;cursor:pointer;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand:hover{background:rgba(255,255,255,0.2)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand:before{content:'\\ea99';font-size:18px;font-family:IcoFont}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu{padding:12px 0 14px 10px;border-top:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li{border-bottom:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li a,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li a{display:block;font-size:15px;color:rgba(0,0,0,0.7);font-weight:500;line-height:1.5;padding:10px 0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li a:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li a:hover{color:#000}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li:last-child,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li:last-child{border-bottom:0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children.active .menu-expand:before{content:\"\\ea99\"}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand{position:absolute;right:0;top:6px;width:30px;height:30px;background:rgba(255,255,255,0.1);color:#000;text-align:center;line-height:30px;cursor:pointer;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:hover{background:rgba(255,255,255,0.2)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:before{content:'\\ea99';font-size:16px;font-family:IcoFont;font-weight:500}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children.active .menu-expand:before{content:\"\\f106\"}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children .menu-expand:before{content:'\\f107';font-size:16px;font-family:IcoFont;font-weight:500}.search-overlay{position:fixed;left:0;top:0;width:100%;height:100%;background-color:#000;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);z-index:9999;visibility:hidden;opacity:0;overflow:hidden;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__inner{width:100%;height:100%;cursor:default;background:#fff;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);overflow-y:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.search-overlay.active{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.search-overlay__header{background-color:#fff;padding:15px 0}.search-overlay__header .mobile-navigation-close-icon{position:relative;cursor:pointer;height:48px;width:48px;line-height:48px;display:inline-block}.search-overlay__header .mobile-navigation-close-icon:before{position:absolute;top:28px;left:0;content:'';width:42px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__header .mobile-navigation-close-icon:after{position:absolute;top:28px;left:0;content:'';width:42px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__header .mobile-navigation-close-icon:hover{color:#ffc4a0}.search-overlay__header .mobile-navigation-close-icon:hover:before,.search-overlay__header .mobile-navigation-close-icon:hover:after{-webkit-transform:none;-ms-transform:none;transform:none}.search-overlay__body{width:100%;margin:0 auto;margin-bottom:75px}.search-overlay__form{position:relative;max-width:1200px;padding:0 15px;width:100%;margin:auto}.search-overlay__form input{background-color:transparent;border:0;border-bottom:2px solid #ffc4a0;border-radius:0;padding:15px 50px 15px 0;width:100%;color:#fff;font-size:42px;height:60px;color:#ffc4a0}@media only screen and (max-width:767px){.search-overlay__form input{font-size:30px;height:60px}}.search-overlay__form input::-webkit-input-placeholder{color:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::-moz-placeholder{color:#ffc4a0;-moz-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input:-ms-input-placeholder{color:#ffc4a0;-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::-ms-input-placeholder{color:#ffc4a0;-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::placeholder{color:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input[type=\"text\"]:focus{color:#ffc4a0;border-color:#ffc4a0}@media only screen and (min-width:768px) and (max-width:991px){.navigation-menu{display:none}}@media only screen and (max-width:767px){.navigation-menu{display:none}}.navigation-menu>ul>li{margin:0 25px;position:relative;text-align:left;display:inline-block}@media only screen and (min-width:1500px) and (max-width:1599px){.navigation-menu>ul>li{margin:0 22px}}@media only screen and (min-width:1200px) and (max-width:1499px){.navigation-menu>ul>li{margin:0 15px}}@media only screen and (min-width:992px) and (max-width:1199px){.navigation-menu>ul>li{margin:0 12px}}.navigation-menu>ul>li:last-child{margin-right:0}.navigation-menu>ul>li:first-child{margin-left:0}.navigation-menu>ul>li>a{display:block;color:#000;padding:30px 2px;position:relative;font-size:16px;font-weight:500;line-height:1.18;-webkit-transition:all .0s ease-in-out;-o-transition:all .0s ease-in-out;transition:all .0s ease-in-out}.navigation-menu>ul>li>a span{-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li.has-children>a{position:relative}.navigation-menu>ul>li.has-children>a:after{position:static;margin-left:5px;font-family:IcoFont;content:'\\ea99';font-size:14px;vertical-align:middle;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li.has-children--multilevel-submenu{position:relative}.navigation-menu>ul>li.has-children:hover .megamenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.navigation-menu>ul>li.has-children:hover .megamenu--home-variation__item{visibility:visible;opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.navigation-menu>ul>li.has-children:hover>.submenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.navigation-menu>ul>li:hover>a:after,.navigation-menu>ul>li.active>a:after{color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li:hover>a span,.navigation-menu>ul>li.active>a span{color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu-white>ul>li>a{color:#fff}.navigation-menu-white>ul>li>a:before{content:'';width:0;height:3px;bottom:0;position:absolute;left:0;background-color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.theme-color-two .navigation-menu>ul>li:hover>a:after,.theme-color-two .navigation-menu>ul>li.active>a:after{color:#ff7d6b}.theme-color-two .navigation-menu>ul>li:hover>a span,.theme-color-two .navigation-menu>ul>li.active>a span{color:#ff7d6b}.theme-color-two .submenu{border-bottom:3px solid #ff7d6b}.theme-color-two .submenu>li.active>a{color:#ff7d6b}.theme-color-two .submenu>li a>span:after{background-color:#ff7d6b}.theme-color-two .submenu>li>a:hover{color:#ff7d6b}.theme-color-two .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-two .megamenu--mega>li>ul>li>a:hover{color:#ff7d6b}.theme-color-two .megamenu--mega>li>ul>li.active>a{color:#ff7d6b}.theme-color-three .navigation-menu>ul>li a{color:#250c83}.theme-color-three .navigation-menu>ul>li:hover>a:after,.theme-color-three .navigation-menu>ul>li.active>a:after{color:#a50eff}.theme-color-three .navigation-menu>ul>li:hover>a span,.theme-color-three .navigation-menu>ul>li.active>a span{color:#a50eff}.theme-color-three .submenu{border-bottom:3px solid #a50eff}.theme-color-three .submenu>li.active>a{color:#a50eff}.theme-color-three .submenu>li a>span:after{background-color:#a50eff}.theme-color-three .submenu>li>a:hover{color:#a50eff}.theme-color-three .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-three .megamenu--mega>li>ul>li>a:hover{color:#a50eff}.theme-color-three .megamenu--mega>li>ul>li.active>a{color:#a50eff}.theme-color-four .navigation-menu>ul>li:hover>a:after,.theme-color-four .navigation-menu>ul>li.active>a:after{color:#5974ff}.theme-color-four .navigation-menu>ul>li:hover>a span,.theme-color-four .navigation-menu>ul>li.active>a span{color:#5974ff}.theme-color-four .submenu{border-bottom:3px solid #5974ff}.theme-color-four .submenu>li.active>a{color:#5974ff}.theme-color-four .submenu>li a>span:after{background-color:#5974ff}.theme-color-four .submenu>li>a:hover{color:#5974ff}.theme-color-four .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-four .megamenu--mega>li>ul>li>a:hover{color:#5974ff}.theme-color-four .megamenu--mega>li>ul>li.active>a{color:#5974ff}.theme-color-five .navigation-menu>ul>li:hover>a:after,.theme-color-five .navigation-menu>ul>li.active>a:after{color:#5138ee}.theme-color-five .navigation-menu>ul>li:hover>a span,.theme-color-five .navigation-menu>ul>li.active>a span{color:#5138ee}.theme-color-five .submenu{border-bottom:3px solid #5138ee}.theme-color-five .submenu>li.active>a{color:#5138ee}.theme-color-five .submenu>li a>span:after{background-color:#5138ee}.theme-color-five .submenu>li>a:hover{color:#5138ee}.theme-color-five .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-five .megamenu--mega>li>ul>li>a:hover{color:#5138ee}.theme-color-five .megamenu--mega>li>ul>li.active>a{color:#5138ee}.theme-color-six .navigation-menu>ul>li:hover>a:after,.theme-color-six .navigation-menu>ul>li.active>a:after{color:#5138ee}.theme-color-six .navigation-menu>ul>li:hover>a span,.theme-color-six .navigation-menu>ul>li.active>a span{color:#5138ee}.theme-color-six .submenu{border-bottom:3px solid #5138ee}.theme-color-six .submenu>li.active>a{color:#5138ee}.theme-color-six .submenu>li a>span:after{background-color:#5138ee}.theme-color-six .submenu>li>a:hover{color:#5138ee}.theme-color-six .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-six .megamenu--mega>li>ul>li>a:hover{color:#5138ee}.theme-color-six .megamenu--mega>li>ul>li.active>a{color:#5138ee}.submenu{position:absolute;top:100%;left:-20px;-webkit-box-shadow:0 2px 29px rgba(0,0,0,0.05);box-shadow:0 2px 29px rgba(0,0,0,0.05);border-bottom:3px solid #ffc4a0;background-color:#fff;-webkit-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-transition-delay:.2s;-o-transition-delay:.2s;transition-delay:.2s;-webkit-transition-duration:.4s;-o-transition-duration:.4s;transition-duration:.4s;visibility:hidden;opacity:0;min-width:200px;padding:15px 0;z-index:9}.submenu>li{position:relative}.submenu>li>a{display:block;padding:5px 20px;color:#000;font-weight:500;-webkit-transition:0s;-o-transition:0s;transition:0s}.submenu>li>a>span{position:relative}.submenu>li>a>span:after{content:'';width:0;height:1px;bottom:0;position:absolute;left:auto;right:0;z-index:-1;background-color:#ffc4a0;-webkit-transition:.3s;-o-transition:.3s;transition:.3s}.submenu>li>a:hover{color:#ffc4a0}.submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.submenu>li:hover>.submenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1;z-index:9}.submenu>li.active>a{color:#ffc4a0}.submenu>li.has-children>a{position:relative;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.submenu>li.has-children>a:after{position:absolute;right:20px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-family:IcoFont;content:'\\f105';font-size:14px;vertical-align:middle;color:#ababab}.submenu>li.has-children>a:hover:after{color:#ffc4a0}.submenu>li.has-children.active>a{color:#ffc4a0}.submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu .submenu .submenu.left{right:100%;left:auto}.megamenu{position:absolute;top:100%;left:0;-webkit-box-shadow:0 2px 29px rgba(0,0,0,0.05);box-shadow:0 2px 29px rgba(0,0,0,0.05);border-bottom:3px solid #ffc4a0;background-color:#fff;-webkit-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-transition-delay:.2s;-o-transition-delay:.2s;transition-delay:.2s;-webkit-transition-duration:.4s;-o-transition-duration:.4s;transition-duration:.4s;visibility:hidden;opacity:0;z-index:9}.megamenu--mega{min-width:980px;width:100%;padding:35px 20px 30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media only screen and (min-width:1200px) and (max-width:1499px){.megamenu--mega{padding-left:50px;padding-right:50px}}@media only screen and (min-width:1200px) and (max-width:1499px){.megamenu--mega{min-width:700px}}.megamenu--mega>li{-webkit-flex-basis:22%;-ms-flex-preferred-size:22%;flex-basis:22%;padding-left:15px;padding-right:15px}.megamenu--mega>li .page-list-title{font-size:14px;margin-bottom:20px;color:#000}.megamenu--mega>li>ul>li>a{padding:10px 0;color:#ababab;line-height:1.2;-webkit-transition:.1s;-o-transition:.1s;transition:.1s}.megamenu--mega>li>ul>li>a:hover{color:#ffc4a0}.megamenu--mega>li>ul>li>a:hover span:after{width:100%;left:0;right:auto}.megamenu--mega>li>ul>li>a>span{position:relative}.megamenu--mega>li>ul>li>a>span:after{content:'';width:0;height:1px;bottom:0;position:absolute;left:auto;right:0;z-index:-1;background-color:#ffc4a0;-webkit-transition:.3s;-o-transition:.3s;transition:.3s}.megamenu--mega>li>ul>li.active>a{color:#ffc4a0}.footer-one .footer-top-area{background-color:#22262a;padding:60px 0 90px}.footer-one .footer-top-area p{color:#fff}.footer-one .footer-bottom-area{background:#2d3135}.footer-one .footer-bottom-area p{color:#fff}.footer-widget{margin-top:30px;max-width:280px;margin-left: 40px;}@media only screen and (max-width:767px){.footer-widget{max-width:100%}}.footer-logo{margin-bottom:20px}.footer-socail-share{margin-top:30px}.footer-socail-share li{display:inline-block;margin-right:15px}.footer-socail-share li:last-child{margin-right:0}@media only screen and (min-width:992px) and (max-width:1199px){.footer-socail-share li{margin-right:5px}}.footer-socail-share li a{height:45px;width:45px;line-height:45px;text-align:center;background-color:#2d3135;border-radius:5px;color:#fff}.footer-socail-share li a:hover{background-color:#ffc4a0;color:#fff}.footer-widget-title{margin-bottom:30px}.footer-widget-title .title{color:#fff}.footer-subscribe-center{margin-right:0;margin-left:auto;margin-right:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-subscribe-center{margin-left:0}}.footer-subscribe-area{margin-right:0;margin-left:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-subscribe-area{margin-left:0}}.footer-subscribe-wrap .single-input{margin-bottom:15px}.footer-subscribe-wrap .single-input input{width:100%;max-width:300px;border:1px solid #2d3135;border-radius:10px;font-weight:500;padding:15px 15px;background-color:#2d3135;color:#ffc4a0}.footer-subscribe-wrap .single-input ::-webkit-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input :-ms-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::-moz-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::-ms-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::placeholder{color:#fff}.footer-menu-widget{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-10px;margin-left:-5px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.single-footer-menu{width:33.3333%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:5px;padding-right:10px;margin-top:30px}@media only screen and (max-width:575px){.single-footer-menu{width:50%}}.single-footer-menu:last-child{padding-left:50px}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-footer-menu:last-child{padding-left:5px}}.footer-widget-menu-list li{margin-bottom:10px}.footer-widget-menu-list li:last-child{margin-bottom:0}.footer-widget-menu-list li a{color:#fff}.footer-bottom-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.footer-bottom-inner .copy-right-text a{color:#ffc4a0}.footer-bottom-inner .button-right-box{margin:10px 0}@media only screen and (max-width:767px){.footer-bottom-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.footer-bottom-inner p{margin-top:20px}}.footer-bottom-area .copy-right-center{text-align:center}.footer-bottom-area .copy-right-text a{color:#ffc4a0}.footer-two .footer-top-area{background-color:#252c63;padding:90px 0 110px}.footer-two .footer-top-area p{color:#fff}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.footer-two .footer-top-area{padding:60px 0 90px}}@media only screen and (max-width:767px){.footer-two .footer-top-area{padding:30px 0 60px}}.footer-two .footer-bottom-area{background:#252c63}.footer-two .footer-bottom-area p{color:#fff}.footer-two .footer-bottom-area a{color:#ff7d6b}.footer-two .footer-socail-share li a{background-color:#3b4179}.footer-two .footer-socail-share li a:hover{background-color:#ff7d6b;color:#fff}@media only screen and (max-width:575px){.footer-two .single-footer-menu{width:100%}}.footer-two .footer-subscribe-wrap .single-input input{border:1px solid #353872;background-color:#353872}.footer-two .footer-bottom-area{border-top:1px solid rgba(255,255,255,0.2);padding:20px 0}.footer-three .footer-top-area{background-color:#200b70}.footer-three .footer-widget-top{padding:45px 0 25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.footer-three .footer-widget-top .footer-logo{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .footer-logo{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.footer-three .footer-widget-top .info-text-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-bottom:20px}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .info-text-box{width:100%;-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}}.footer-three .footer-widget-top .info-text-box .sub-title{font-size:12px;color:#ff7d6b;margin-bottom:10px}.footer-three .footer-widget-top .info-text-box .title{color:#fff;font-size:32px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-three .footer-widget-top .info-text-box .title{font-size:22px}}.footer-three .footer-widget-top .button-right-box{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.footer-three .footer-widget-top .button-right-box .btn-primary{background-color:#218b00;color:#fff}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .button-right-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.footer-three .footer-mid-area{background-color:#250c83;padding:70px 0 100px}.footer-three .footer-mid-area .footer-subscribe-wrap .single-input input{border:1px solid #453095;background-color:transparent;border-radius:15px}.footer-three .footer-mid-area .button-box .btn-primary{border-radius:15px}.footer-three .footer-socail-share li a{background-color:#3b4179}.footer-three .footer-socail-share li a:hover{background-color:#a50eff;color:#fff}.footer-three .footer-bottom-area{padding:20px 0;border-top:1px solid #3b2590;background-color:#250c83}.footer-three .footer-bottom-area p{color:#fff}.footer-three .footer-bottom-area a{color:#ff7d6b}.footer-four .footer-top-area{background-color:#5974ff}.footer-four .footer-widget-top{padding:45px 0 25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.footer-four .footer-widget-top .info-text-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-bottom:20px}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-widget-top .info-text-box{width:100%;-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}}.footer-four .footer-widget-top .info-text-box .sub-title{font-size:12px;color:#fff;margin-bottom:10px}.footer-four .footer-widget-top .info-text-box .title{color:#fff;font-size:32px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-four .footer-widget-top .info-text-box .title{font-size:22px}}.footer-four .footer-widget-top .button-right-box{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-widget-top .button-right-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.footer-four .footer-widget-top .button-right-box a{color:#222}.footer-four .footer-item-space{padding:100px 0}@media only screen and (min-width:992px) and (max-width:1199px){.footer-four .footer-item-space{padding:80px 0}}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-item-space{padding:30px 0}}@media only screen and (max-width:767px){.footer-four .footer-item-space{padding:20px 0}}.footer-four .footer-widget p{color:#fff}.footer-four .footer-mid-area{background-color:#081131}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-mid-area{padding:50px 0}}@media only screen and (max-width:767px){.footer-four .footer-mid-area{padding:40px 0}}.footer-four .footer-mid-area .footer-widget{margin-top:0}.footer-four .footer-mid-area .footer-border{position:relative}.footer-four .footer-mid-area .footer-border::before{position:absolute;content:'';left:-70px;top:0;height:100%;width:1px;background-color:#171f3d}.footer-four .footer-mid-area .footer-border:last-child::after{position:absolute;content:'';right:-70px;top:0;height:100%;width:1px;background-color:#171f3d}@media only screen and (min-width:1200px) and (max-width:1499px){.footer-four .footer-mid-area .footer-border::before{left:-10px}.footer-four .footer-mid-area .footer-border:last-child::after{right:-10px}}@media only screen and (min-width:992px) and (max-width:1199px){.footer-four .footer-mid-area .footer-border::before{display:none}.footer-four .footer-mid-area .footer-border:last-child::after{display:none;right:0}}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-mid-area .footer-border:last-child::after{display:none}}@media only screen and (max-width:767px){.footer-four .footer-mid-area .footer-border::before{display:none}.footer-four .footer-mid-area .footer-border:last-child::after{display:none}}.footer-four .footer-socail-share li a{background-color:transparent;border:2px solid #fff;border-radius:15px;line-height:38px}.footer-four .footer-socail-share li a:hover{border:2px solid #5974ff;background-color:#5974ff;color:#fff}.footer-four .footer-bottom-area{padding:20px 0;background-color:#081131}.footer-four .footer-bottom-area p{color:#fff}.footer-four .footer-bottom-area a{color:#5974ff}.footer-five .footer-top-area{padding:70px 0 100px;background-color:#5138ee;background-image:url(\"../images/footer-bg-five.jpg\");background-size:cover}@media only screen and (max-width:767px){.footer-five .footer-top-area{padding:30px 0 60px}}.footer-five .footer-subscribe-wrap .single-input input{border:2px solid #fff;padding:15px 30px;background-color:transparent;border-radius:15px}.footer-five .footer-dec-text{color:#fff}.footer-five .footer-socail-share li a{background-color:transparent;border:1px solid #fff}.footer-five .footer-socail-share li a:hover{border:1px solid #fff;background-color:#fff;color:#5138ee}.footer-five .footer-bottom-area{background-color:#462fd7;padding:25px 50px 5px}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:1200px) and (max-width:1499px){.footer-five .footer-bottom-area{padding:25px 0 5px}}.footer-five .copy-right-text{color:#fff}.footer-five .copy-right-text a{color:#fed74b}.footer-bottom-menu-list li{display:inline-block;padding-right:20px;margin-right:20px;position:relative}.footer-bottom-menu-list li::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#ffc4a0;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.footer-bottom-menu-list li a{color:#fff}.footer-bottom-menu-list li a:hover{color:#ffc4a0}.footer-bottom-menu-list li:last-child{padding-right:0;margin-right:0}.footer-bottom-menu-list li:last-child::after{display:none}.scroll-button-buttom .text{color:#fff;margin-right:10px}.scroll-button-buttom .right-side-scroll-up{height:50px;width:50px;line-height:50px;color:#222;background-color:#fed74b;border-radius:10px;text-align:center;font-size:20px}.footer-six .footer-top-area{background-color:#081b3c;padding:80px 0 80px}.footer-six .footer-top-area .footer-newsletter-subscribe{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title{max-width:500px}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title .title{color:#fff}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-six .footer-top-area .footer-newsletter-subscribe{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title{max-width:100%;margin-bottom:30px}}.footer-six .footer-top-area .newsletter-input-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;width:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:450px;width:100%;border:2px solid #ddd;border-radius:10px;margin-right:20px;padding:5px 30px;font-weight:500;height:60px;background-color:transparent}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-webkit-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-moz-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input:-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::placeholder{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:300px}}@media only screen and (max-width:767px){.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:100%;margin-bottom:20px}}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-webkit-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-moz-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input :-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::placeholder{color:#fff}@media only screen and (max-width:767px){.footer-six .footer-top-area .newsletter-input-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.footer-six .footer-mid-area{background-color:#0a1e43;padding:90px 0 120px}.footer-six .footer-mid-area .dec-text{color:#fff}.footer-six .footer-socail-share li a{background-color:#5974ff}.footer-six .footer-socail-share li a:hover{background-color:#5974ff;color:#fff}.footer-six .footer-bottom-area{background:#0a1e43;border-top:1px solid #1d3052;padding:20px 0}.footer-six .footer-bottom-area p{color:#fff}.footer-six .footer-bottom-area a{color:#fff}.footer-six .footer-bottom-area .right-side-scroll-up{background-color:#5974ff}@media only screen and (max-width:767px){.footer-six .footer-bottom-area{text-align:center}.footer-six .footer-bottom-area .scroll-button-buttom{margin-top:10px}}.hero-area{background-color:#f7f7f7;padding:80px 0}.hero-inner-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-15px;margin-left:-15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.hero-inner-area{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.hero-category-area{max-width:290px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px){.hero-category-area{width:35%}}@media only screen and (max-width:767px){.hero-category-area{width:35%}}@media only screen and (max-width:575px){.hero-category-area{width:100%;max-width:100%}}.single-hero-category-item{display:block;margin-bottom:28px;position:relative}.single-hero-category-item:last-child{margin-bottom:0}.single-hero-category-item img{border-radius:15px;width:100%}.single-hero-category-item::after{position:absolute;height:100%;width:100%;content:\"\";left:0;top:0;background-color:rgba(0,0,0,0.7);border-radius:15px;opacity:0;visibility:hidden;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.single-hero-category-item:hover::after{opacity:1;visibility:visible}.single-hero-category-item:hover .hero-category-inner-box{opacity:1;visibility:visible}.hero-category-inner-box{position:absolute;opacity:0;visibility:hidden;left:0;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:100%;padding:10px 30px;color:#fff;z-index:1;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}@media only screen and (min-width:992px) and (max-width:1199px){.hero-category-inner-box{padding:5px 10px}}@media only screen and (max-width:767px){.hero-category-inner-box{padding:5px 10px}}@media only screen and (max-width:575px){.hero-category-inner-box{padding:10px 30px}}.hero-category-inner-box .title{color:#fff}.hero-category-inner-box .icon{font-size:28px;height:40px;width:40px;background-color:#ffc4a0;line-height:40px;text-align:center;border-radius:50000px}.hero-banner-area{padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px){.hero-banner-area{width:64%}}@media only screen and (max-width:767px){.hero-banner-area{width:64%}}@media only screen and (max-width:575px){.hero-banner-area{margin-top:45px;width:100%;max-width:100%}}.hero-banner-area a{display:block}.hero-banner-area a img{border-radius:15px;width:100%}.hero-blog-post{max-width:375px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px),only screen and (max-width:575px){.hero-blog-post{max-width:100%;width:100%;margin-top:45px}}.single-hero-blog-post{margin-top:45px}.single-hero-blog-post:first-child{margin-top:0}@media only screen and (min-width:992px) and (max-width:1199px){.single-hero-blog-post{margin-top:25px}}.hero-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-blog-post-top{margin-bottom:10px}}.hero-blog-post-category{margin-right:25px}.hero-blog-post-category a{min-width:100px;background:#ffebdf;text-align:center;padding:6px 5px;border-radius:10px}.hero-blog-post-author{color:#9b9ea1}.hero-blog-post-author a{color:#000}.hero-blog-post-title{margin-bottom:20px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-blog-post-title{margin-bottom:10px}}.hero-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.post-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.post-meta-left-side span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.post-meta-left-side span a:hover{color:#ffc4a0}.post-meta-left-side span:last-child{padding-right:0;margin-right:0}.post-meta-left-side span:last-child::after{display:none}.post-meta-right-side a{margin-left:10px}.hero-area-two-wrapper{position:relative}.hero-area-two-wrapper .hero-two-banner-text{position:absolute;bottom:0;text-align:center;width:100%}.hero-area-two{background:url(\"../images/home-2-hero-bg.jpg\");background-repeat:no-repeat;background-size:cover;height:850px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#091d40}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-two{height:750px}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.hero-area-two{height:auto;padding:150px 0 100px}}.hero-area-overly{position:relative}.hero-area-overly::before{content:'';background-color:rgba(15,0,84,0.7);height:100%;width:100%;position:absolute;left:0;top:0}.hero-area--two-innter{position:relative}.hero-area--two-innter .sub-title{color:#ff7d6b;text-transform:uppercase;letter-spacing:1px}.hero-area--two-innter .hero-title{color:#fff;font-size:95px;font-weight:bold}.hero-area--two-innter .hero-title-small{font-size:60px;color:#fff;font-weight:bold}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area--two-innter .hero-title{font-size:75px}.hero-area--two-innter .hero-title-small{font-size:40px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area--two-innter .hero-title{font-size:65px}.hero-area--two-innter .hero-title-small{font-size:30px}}@media only screen and (max-width:767px){.hero-area--two-innter .hero-title{font-size:45px}.hero-area--two-innter .hero-title-small{font-size:20px}}@media only screen and (max-width:575px){.hero-area--two-innter .hero-title{font-size:45px}.hero-area--two-innter .hero-title-small{font-size:20px}}.hero-two-tag{max-width:750px;margin:60px auto 0}.hero-two-tag a{margin:10px;padding:0 35px;height:50px;line-height:46px;border:2px solid #fff}.hero-two-tag a:hover{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-two-tag{margin:40px auto 0}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.hero-two-tag{margin:30px auto 0}}@media only screen and (max-width:575px){.hero-two-tag a{margin:5px}}.hero-area-three{background:url(\"../images/home-3-hero-bg.jpg\");background-repeat:no-repeat;background-size:cover;height:830px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:relative;background-color:#091d40}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.hero-area-three{height:600px}}.hero-area-three-post .title{color:#fff;font-size:45px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-three-post .title{font-size:36px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-three-post .title{font-size:30px}}@media only screen and (max-width:767px){.hero-area-three-post .title{font-size:28px}}.hero-area-three-post .dec{color:#fff;max-width:470px;font-size:18px}.hero-area-three-post-author{color:#9b9ea1;margin-bottom:15px;font-weight:600;font-size:18px}.hero-area-three-post-author a{color:#fff}.hero-area-three-post-meta{margin-top:25px}.hero-area-three-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:17px;color:#fff}.hero-area-three-post-meta>span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#fff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-area-three-post-meta>span:last-child{padding-right:0;margin-right:0}.hero-area-three-post-meta>span:last-child::after{display:none}.hero-three-box{margin-right:-60px;margin-left:60px}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.hero-three-box{margin-right:0;margin-left:0}}.hero-three-inner-image{margin-bottom:20px;border-radius:20px;border:1px solid #ddd;padding:15px}.hero-three-inner-image img{border-radius:20px}.hero-swiper-pagination{position:absolute;bottom:40px;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.hero-swiper-pagination .swiper-pagination-bullet{height:16px;width:16px;border-radius:100%;background-color:#8b61b7;margin:5px}.hero-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#fff}.hero-three-category{text-align:center}.hero-three-category a{margin:15px;min-width:200px;text-align:center;height:66px;line-height:66px;border-radius:15px;background:#f4eaff}.hero-three-category a:hover{background:#a50eff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-three-category a{min-width:140px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-three-category a{min-width:auto;margin:10px 2px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-three-category a{min-width:auto;margin:10px 2px}}@media only screen and (max-width:767px){.hero-three-category a{min-width:auto;margin:10px 2px}}.hero-three-category .category-step-2{width:90%;margin:auto}.hero-area-four{background:url(\"../images/home-4-hero-bg.jpg\");background-repeat:no-repeat;background-size:cover;background-color:#091d40;height:820px;padding-top:150px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-four{height:700px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-four{height:650px}}@media only screen and (max-width:767px){.hero-area-four{height:600px}}@media only screen and (max-width:575px){.hero-area-four{height:600px}}@media only screen and (max-width:479px){.hero-area-four{height:700px}}.hero-four-image{margin-top:-380px;z-index:1;position:relative;text-align:center}@media only screen and (min-width:992px) and (max-width:1199px){.hero-four-image{margin-top:-220px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-four-image{margin-top:-220px}}@media only screen and (max-width:767px){.hero-four-image{margin-top:-200px}}@media only screen and (max-width:575px){.hero-four-image{margin-top:-150px}}@media only screen and (max-width:479px){.hero-four-image{margin-top:-150px}}.hero-four-inner-image{padding:15px;border:2px solid #edf0f8;max-width:770px;border-radius:15px;margin:auto}.hero-four-inner-image img{border-radius:15px}.hero-area-four-post{margin-bottom:40px}.hero-area-four-post .title{color:#fff;font-size:52px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-four-post .title{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-four-post .title{font-size:30px}}@media only screen and (max-width:767px){.hero-area-four-post .title{font-size:28px}}.hero-area-four-post .dec{color:#fff}.hero-area-three-post-author{color:#9b9ea1;margin-bottom:10px;font-weight:600}.hero-area-three-post-author a{color:#fff}.hero-area-four-post-meta{margin-top:20px}.hero-area-four-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#5974ff}.hero-area-four-post-meta>span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#5974ff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-area-four-post-meta>span a{color:#fff}.hero-area-four-post-meta>span.time{color:#fff}.hero-area-four-post-meta>span:last-child{padding-right:0;margin-right:0}.hero-area-four-post-meta>span:last-child::after{display:none}.slider-four-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:1px solid #e7e5ed;text-align:center;font-size:25px;border-radius:10px;color:#fff;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;position:absolute;background-color:transparent;left:100px;right:auto}.slider-four-slider-navigation .navigation-button.slider-four-button-prev{right:100px;left:auto}.slider-four-slider-navigation .navigation-button:hover{border:1px solid #363449;background-color:#363449}.hero-four-category{border-top:1px solid #edf0f8;border-bottom:1px solid #edf0f8;padding:15px 0}.hero-four-category .category-step-1{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;margin-left:-15px;margin-right:-15px}@media only screen and (max-width:767px){.hero-four-category .category-step-1{-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start}}.hero-four-category a{margin:15px;min-width:200px;text-align:center;border-radius:15px}.hero-four-category a:hover{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-four-category a{min-width:140px;margin:10px 2px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-four-category a{min-width:auto;margin:10px 2px}}@media only screen and (max-width:767px){.hero-four-category a{min-width:auto;margin:10px 10px;padding:0 18px}}.hero-four-category .category-step-2{width:90%;margin:auto}.hero-area-five{padding:120px 0}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-five{padding:100px 0}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-five{padding:80px 0}}@media only screen and (max-width:767px){.hero-area-five{padding:60px 0}}.hero-five-text .sub-title{color:#ff7d6b;text-transform:uppercase;margin-bottom:30px}.hero-five-text .title{display:block;font-size:60px;font-weight:700}.hero-five-text .title .hero-five-title{font-size:90px;display:inline-block;position:relative;line-height:1}.hero-five-text .title .hero-five-title::after{position:absolute;content:\"\";left:0;bottom:2px;height:25px;width:100%;background-color:#fed74b;z-index:-1}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-text .title .hero-five-title{font-size:80px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-five-text .title .hero-five-title{font-size:40px}.hero-five-text .title .hero-five-title::after{height:20px}}@media only screen and (max-width:767px){.hero-five-text .title .hero-five-title{font-size:34px}.hero-five-text .title .hero-five-title::after{height:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-text .title{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-five-text .title{font-size:40px}}@media only screen and (max-width:767px){.hero-five-text .title{font-size:34px}}@media only screen and (max-width:575px){.hero-five-text .title{font-size:30px}}.hero-five-text .hero-text-dec{margin-top:10px;margin-bottom:30px;font-size:20px;font-weight:600;max-width:540px}.hero-five-text .button-box .btn-bg-5{background-color:#5138ee;color:#fff}.hero-five-text .button-box .btn-bg-5:hover{color:#fff}.hero-five-category{margin-right:-30px}.hero-five-category a{margin-right:25px;margin-top:25px}.hero-five-category a:hover{color:#fff}@media only screen and (min-width:1200px) and (max-width:1499px){.hero-five-category a{margin-right:20px}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-category a{margin-right:15px}}@media only screen and (max-width:767px){.hero-five-category a{margin-right:5px}}@media only screen and (min-width:1200px) and (max-width:1499px){.hero-five-category{margin-right:0}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-category{margin-right:0}}@media only screen and (max-width:767px){.hero-five-category{margin-right:0}}.hero-six-area{padding:60px 0 100px}.hero-slide-six-image{display:block}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-six-image img{width:100%}}.hero-slide-post-content{margin-top:20px;margin-bottom:10px;margin-left:40px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-slide-post-content{margin-left:0}}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-post-content{margin-left:0}}@media only screen and (max-width:767px){.hero-slide-post-content{margin-left:0}}.hero-slide-post-author{color:#9b9ea1}.hero-slide-post-author a{color:#091d40}@media only screen and (max-width:479px){.hero-slide-post-author{font-size:12px}}.hero-slide-post-title{margin-bottom:25px;font-size:32px;font-weight:800;color:#0f034a}@media only screen and (min-width:992px) and (max-width:1199px){.hero-slide-post-title{font-size:30px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-post-title{font-size:22px;margin-bottom:10px}}@media only screen and (max-width:767px){.hero-slide-post-title{font-size:22px}}.hero-slide-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}@media only screen and (max-width:479px){.hero-slide-post-meta{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.hero-slide-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.hero-slide-post-meta span::after{position:absolute;content:\"\";right:-5px;top:50%;height:4px;width:4px;background:#091d40;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-slide-post-meta span a:hover{color:#5974ff}.hero-slide-post-meta span:last-child{padding-right:0;margin-right:0}.hero-slide-post-meta span:last-child::after{display:none}.hero-read-more-button a{border-bottom:1px solid #ddd;display:inline-block;font-weight:600;color:#0f034a}.hero-read-more-button a i{font-size:18px;margin-left:10px}.slider-six-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #e6e8ec;text-align:center;font-size:25px;border-radius:10px;color:#333;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;left:100px;right:auto;position:absolute;top:50%;z-index:1;background-color:transparent}.slider-six-slider-navigation .navigation-button.slider-six-button-prev{right:100px;left:auto}.slider-six-slider-navigation .navigation-button:hover{border:1px solid #5138ee;background-color:#5138ee;color:#fff}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.slider-six-slider-navigation .navigation-button{left:20px}.slider-six-slider-navigation .navigation-button.slider-six-button-prev{right:20px}}.trending-article-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-15px;margin-left:-15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-row{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.trending-article-left-side{max-width:515px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-left-side{max-width:100%}}.trending-article-right-side{max-width:675px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-right-side{margin-top:30px}}.trending-single-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:35px}.trending-single-item:first-child{margin-top:0}@media only screen and (max-width:767px){.trending-single-item{margin-top:20px}}.trending-single-item .trending-post-thum{max-width:160px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (max-width:479px){.trending-single-item .trending-post-thum{max-width:100px}}.trending-single-item .trending-post-thum img{height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover;border-radius:10px}.trending-single-item .trending-post-content{margin-left:30px}@media only screen and (max-width:479px){.trending-single-item .trending-post-content{margin-left:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.trending-single-item .trending-post-content{margin-left:15px}}.trending-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px}@media only screen and (max-width:479px){.trending-blog-post-top{margin-bottom:10px}}.trending-blog-post-category{margin-right:25px}.trending-blog-post-category a{min-width:100px;text-align:center;padding:4px 5px;border-radius:10px;color:#fff;background: #ffc107;}@media only screen and (max-width:479px){.trending-blog-post-category{margin-right:15px}.trending-blog-post-category a{min-width:40px;font-size:12px;padding:2px 5px}}.trending-blog-post-author{color:#9b9ea1}.trending-blog-post-author a{color:#000}@media only screen and (max-width:479px){.trending-blog-post-author{font-size:12px}}.trending-blog-post-title{margin-bottom:15px}.trending-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.trending-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.trending-meta-left-side span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-meta-left-side span a:hover{color:#ffc4a0}.trending-meta-left-side span:last-child{padding-right:0;margin-right:0}.trending-meta-left-side span:last-child::after{display:none}.post-meta-right-side a{margin-left:10px}.large-banner-trending-article{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-banner-trending-article .trending-single-item{margin-top:45px}.large-banner-trending-article .trending-single-item:first-child{margin-top:15px}@media only screen and (min-width:992px) and (max-width:1199px){.large-banner-trending-article .trending-single-item{margin-top:25px}.large-banner-trending-article .trending-single-item:first-child{margin-top:5px}}@media only screen and (max-width:479px){.large-banner-trending-article .trending-single-item{margin-top:15px}}.trending-large-post-thum{max-width:315px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (max-width:767px){.trending-large-post-thum{max-width:160px}}@media only screen and (max-width:479px){.trending-large-post-thum{max-width:100px}}.trending-large-post-thum img{height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover;border-radius:10px}.trending-tody-content{margin-top:20px;margin-bottom:10px;margin-left:40px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-tody-content{margin-left:0}}@media only screen and (min-width:768px) and (max-width:991px){.trending-tody-content{margin-left:0}}@media only screen and (max-width:767px){.trending-tody-content{margin-left:0}}.trending-tody-post-author{color:#9b9ea1;margin-bottom:10px;font-size:18px}.trending-tody-post-author a{color:#5974ff}@media only screen and (max-width:479px){.trending-tody-post-author{font-size:12px}}.trending-tody-post-title{margin-bottom:20px;font-size:52px}@media only screen and (min-width:1200px) and (max-width:1499px){.trending-tody-post-title{font-size:42px}}@media only screen and (min-width:992px) and (max-width:1199px){.trending-tody-post-title{font-size:36px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-tody-post-title{font-size:26px;margin-bottom:10px}}@media only screen and (max-width:767px){.trending-tody-post-title{font-size:26px}}.trending-tody-content .dec{font-size:18px}.trending-tody-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;font-size:17px}.trending-tody-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.trending-tody-post-meta span::after{position:absolute;content:\"\";right:-5px;top:50%;height:4px;width:4px;background:#5974ff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-tody-post-meta span a:hover{color:#5974ff}.trending-tody-post-meta span:last-child{padding-right:0;margin-right:0}.trending-tody-post-meta span:last-child::after{display:none}.trending-tody-swiper-pagination{margin-top:80px;text-align:center}.trending-tody-swiper-pagination .swiper-pagination-bullet{height:12px;width:12px;border-radius:5000px;background-color:#0f034a;margin:10px}.trending-tody-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#5974ff;border-radius:5000px}@media only screen and (max-width:767px){.trending-tody-swiper-pagination{margin-top:40px}}.trending-tody-two-box{background-color:#fff;padding:43px 40px;border-radius:15px;-webkit-transition:.3s ease-in-out;-o-transition:.3s ease-in-out;transition:.3s ease-in-out}.trending-tody-two-box .trending-tody-two-post-title{font-size:18px}.trending-tody-two-box:hover{background-color:#5138ee}.trending-tody-two-box:hover .trending-tody-two-post-author{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-author a{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-title{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-meta{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-meta span::after{background:#fff}.trending-tody-two-post-author{color:#9b9ea1;margin-bottom:12px;font-weight:500;-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-author a{color:#0f034a;-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}@media only screen and (max-width:479px){.trending-tody-two-post-author{font-size:12px}}.trending-tody-two-post-title{color:#0f034a}.trending-tody-two-post-title a{-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-title a:hover{color:#fff}.trending-tody-two-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px;color:#7e7e7e}.trending-tody-two-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:500}.trending-tody-two-post-meta span::after{position:absolute;content:\"\";right:-5px;top:50%;height:4px;width:4px;background:#0f034a;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-tody-two-post-meta span a{-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-meta span a:hover{color:#5974ff}.trending-tody-two-post-meta span:last-child{padding-right:0;margin-right:0}.trending-tody-two-post-meta span:last-child::after{display:none}.trending-tody-two-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.trending-tody-two-slider-navigation .navigation-button{color:#0f034a;font-size:24px;height:20px;line-height:20px;background-color:transparent;border-radius:0}.trending-tody-two-slider-navigation .navigation-button.trending-tody-button-prev{margin-left:20px;padding-left:20px;border-left:1px solid #dadada}.from-following-hader-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:20px 0;border-top:1px solid #f3f3f3;border-bottom:1px solid #f3f3f3;margin-bottom:40px}@media only screen and (max-width:575px){.from-following-hader-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.from-following-hader-area .section-title{margin-bottom:20px}}.from-following-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:-0.5rem}.from-following-left-side{max-width:873px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}@media only screen and (min-width:992px) and (max-width:1199px){.from-following-left-side{max-width:650px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.from-following-left-side{min-width:100%;max-width:100%}}.from-following-right-side{max-width:335px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.following-post-thum{display:block}.following-post-thum img{border-radius:15px}.single-following-post{margin-bottom:40px}.following-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;margin-top:25px}@media only screen and (max-width:479px){.following-blog-post-top{margin-bottom:10px}}.following-blog-post-category{margin-right:25px}.following-blog-post-category a{min-width:100px;background:#ffebdf;text-align:center;padding:4px 5px;border-radius:10px}@media only screen and (max-width:479px){.following-blog-post-category{margin-right:15px}.following-blog-post-category a{min-width:40px;font-size:12px;padding:2px 5px}}.following-blog-post-author{color:#9b9ea1}.following-blog-post-author a{color:#000}@media only screen and (max-width:479px){.following-blog-post-author{font-size:12px}}.following-blog-post-title{margin-bottom:15px}.following-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.following-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.following-meta-left-side span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.following-meta-left-side span a:hover{color:#ffc4a0}.following-meta-left-side span:last-child{padding-right:0;margin-right:0}.following-meta-left-side span:last-child::after{display:none}.following-author-area{border:1px solid #f3f3f3;border-radius:10px;text-align:center;padding:30px 15px}.following-author-area .author-image{border:1px solid #f3f3f3;display:inline-block;border-radius:50000px;width:150px;height:150px;padding:11px;margin-bottom:25px}.following-author-area .author-image img{border-radius:50%;}.following-author-area .author-title{margin-bottom:20px}.following-author-area .author-details p{margin-bottom:20px}.following-author-area .author-post-share{margin-bottom:30px}.following-add-banner{margin-top:40px}.trending-topic-section-title{max-width:232px;padding:0 15px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-topic-section-title{max-width:200px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-topic-section-title{max-width:100%}}@media only screen and (max-width:767px){.trending-topic-section-title{max-width:100%}}.trending-topic-item-wrap{max-width:968px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-topic-item-wrap{max-width:758px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-topic-item-wrap{max-width:100%}}@media only screen and (max-width:767px){.trending-topic-item-wrap{max-width:100%}}.single-trending-topic-item{text-align:center}.single-trending-topic-item a{display:block;min-width:120px;max-width:100%;position:relative}.single-trending-topic-item a img{border-radius:15px;width:100%}.single-trending-topic-item a .title{position:absolute;bottom:20px;text-align:center;width:100%;color:#fff}.trending-topic-navigation{margin-bottom:20px}.trending-topic-navigation .navigation-button{background-color:#313438;color:#fff}.trending-topic-navigation .navigation-button:hover{background-color:#ffc4a0}.newsletter-subscribe-inner{background-color:#fff;padding:70px;border-radius:10px;position:relative;overflow:hidden}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-subscribe-inner{padding:70px 50px}}@media only screen and (max-width:767px){.newsletter-subscribe-inner{padding:60px 30px}}@media only screen and (max-width:575px){.newsletter-subscribe-inner{padding:60px 20px}}.newsletter-input-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:1;position:relative}.newsletter-input-box .newsletter-input{max-width:450px;width:100%;border:1px solid #ddd;border-radius:10px;margin-right:20px;padding:5px 15px;font-weight:500;height:60px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.newsletter-input-box .newsletter-input{max-width:300px}}@media only screen and (max-width:767px){.newsletter-input-box .newsletter-input{max-width:100%;margin-bottom:20px}}@media only screen and (max-width:767px){.newsletter-input-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.newsletter-inner-image .newsletter-image-01{position:absolute;bottom:0;left:18%;z-index:0}.newsletter-inner-image .newsletter-image-02{position:absolute;bottom:0;right:34px;z-index:0}.related-newsletter-box{background:url(\"../images/home-two-newsletter-bg.jpg\");border-radius:10px;background-size:cover;background-position:center}.related-newsletter-inner-box{max-width:730px;margin:auto;text-align:center;padding:80px 15px}.related-newsletter-inner-box .title{color:#fff;font-size:44px;font-weight:bold}.related-newsletter-inner-box .title .normal-width{font-weight:500}@media only screen and (min-width:768px) and (max-width:991px){.related-newsletter-inner-box .title{font-size:30px}}@media only screen and (max-width:767px){.related-newsletter-inner-box .title{font-size:30px}}.related-newsletter-three-box{background:url(\"../images/home-three-newsletter-bg.jpg\");border-radius:10px;background-size:cover;background-position:center;position:relative}.related-newsletter-three-inner-box{max-width:894px;text-align:left;padding:80px 100px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.related-newsletter-three-inner-box{padding:60px 40px}}@media only screen and (max-width:575px){.related-newsletter-three-inner-box{padding:60px 40px 100px}}.related-newsletter-three-inner-box .title{color:#fff;font-weight:bold;font-size:44px}.related-newsletter-three-inner-box .title .normal-width{font-weight:500}@media only screen and (min-width:768px) and (max-width:991px){.related-newsletter-three-inner-box .title{font-size:30px}}@media only screen and (max-width:767px){.related-newsletter-three-inner-box .title{font-size:30px}}.subscribe-today-update{position:absolute;bottom:60px;right:70px;width:250px}.subscribe-today-update .today-update-text{font-size:28px;color:#fff;font-weight:400}.subscribe-today-update .today-update-text span{font-weight:600}@media only screen and (min-width:768px) and (max-width:991px){.subscribe-today-update{right:40px}.subscribe-today-update .today-update-text{font-size:22px}}@media only screen and (max-width:767px){.subscribe-today-update{right:20px}.subscribe-today-update .today-update-text{font-size:18px}}@media only screen and (max-width:575px){.subscribe-today-update{left:45px;bottom:30px;width:150px}.subscribe-today-update .today-update-text{font-size:18px}}.newsletter-four-box{background:url(\"../images/home-four-newsletter-bg.jpg\");border-radius:10px;background-size:cover;background-position:center;background-color:#fff;padding:70px;border-radius:15px;position:relative;overflow:hidden}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box{padding:70px 50px}}@media only screen and (max-width:767px){.newsletter-four-box{padding:60px 30px}}@media only screen and (max-width:575px){.newsletter-four-box{padding:60px 20px}}.newsletter-four-box .title{color:#fff;font-weight:500;margin-bottom:10px;font-size:44px}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box .title{font-size:36px}}@media only screen and (max-width:767px){.newsletter-four-box .title{font-size:30px}}.newsletter-four-box p{color:#fff;font-size:25px}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box p{font-size:20px}}@media only screen and (max-width:767px){.newsletter-four-box p{font-size:18px}}.newsletter-four-box .newsletter-input-box{margin-top:30px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.newsletter-four-box .newsletter-input-box .newsletter-input{background:transparent;border:1px solid #fff;color:#fff;border-radius:15px;padding:0 30px}.newsletter-four-box .newsletter-input-box .newsletter-input::-webkit-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input:-ms-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::-moz-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::-ms-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::placeholder{color:#fff}.newsletter-inner-image .newsletter-image-01{position:absolute;bottom:0;left:18%;z-index:0}.newsletter-inner-image .newsletter-image-02{position:absolute;bottom:0;right:34px;z-index:0}.featured-video-col-8{max-width:847px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:1200px) and (max-width:1499px){.featured-video-col-8{max-width:846px;width:100%}}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.featured-video-col-8{max-width:100%}}.latest-post-col-4{max-width:363px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:1200px) and (max-width:1499px){.latest-post-col-4{max-width:360px;width:100%}}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.latest-post-col-4{max-width:100%}}.featured-video-haader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:575px){.featured-video-haader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}}.featured-video-list .featured-video-list-item{padding-right:40px;margin-right:25px;position:relative}@media only screen and (max-width:767px){.featured-video-list .featured-video-list-item{padding-right:25px;margin-right:8px}}@media only screen and (max-width:575px){.featured-video-list .featured-video-list-item{margin-top:20px}}.featured-video-list .featured-video-list-item::after{position:absolute;right:0;top:50%;content:'\\eab8';font-family:IcoFont;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.featured-video-list .featured-video-list-item .featured-video-link{font-weight:600}.featured-video-list .featured-video-list-item .featured-video-link.active{color:#ffc4a0}.featured-video-list .featured-video-list-item:last-child{padding-right:0;margin-right:0}.featured-video-list .featured-video-list-item:last-child::after{display:none}.single-featured-video-item{margin-bottom:30px}.featured-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;margin-top:25px}@media only screen and (max-width:479px){.featured-blog-post-top{margin-bottom:10px}}.featured-blog-post-top .post-meta-right-side{margin-left:30px}@media only screen and (max-width:767px){.featured-blog-post-top .read-time{display:none}}.latest-post-inner-wrap{padding:30px 24px;background:#fafafa;border-radius:10px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.latest-post-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.latest-post-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.latest-post-slider-navigation .navigation-button{background-color:#222;color:#fff}.latest-post-slider-navigation .navigation-button:hover{background-color:#ffc4a0}.single-latest-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.single-latest-post{width:50%;padding-right:15px}}.latest-post-thum{-webkit-flex-basis:0 0 auto;-ms-flex-preferred-size:0 0 auto;flex-basis:0 0 auto;min-width:84px}.latest-post-thum a img{border-radius:10px;height: 66px;}.latest-post-content{margin-left:20px}.latest-post-content .title{margin-top:0;font-size:15px}.latest-post-content .latest-post-meta{font-size:12px;margin-top:10px}.latest-post-content .latest-post-meta span{position:relative;padding-right:6px;margin-right:6px}.latest-post-content .latest-post-meta span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.latest-post-content .latest-post-meta span a:hover{color:#ffc4a0}.latest-post-content .latest-post-meta span:last-child{padding-right:0;margin-right:0}.latest-post-content .latest-post-meta span:last-child::after{display:none}.stay-in-touch-area{margin-top:30px;padding:30px 24px;background:#fafafa;border-radius:10px;text-align:center}.stay-in-touch-box{margin-top:30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.single-touch-col{width:33.333%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:5px;padding-right:5px}.single-touch{background-color:#ebebeb;width:100%;margin-bottom:10px;text-align:center;border-radius:10px;padding:14px 10px}.single-touch.facebook .touch-socail-icon{background:#4867AA}.single-touch.twitter .touch-socail-icon{background:#1DA1F2}.single-touch.behance .touch-socail-icon{background:#1869FF}.single-touch.youtube .touch-socail-icon{background:#FE0000}.single-touch.dribbble .touch-socail-icon{background:#EA4C8A}.single-touch.linkedin .touch-socail-icon{background:#007BB6}.single-touch p{color:#000;font-size:12px}.single-touch:hover.facebook{background:#4867AA}.single-touch:hover.facebook .touch-socail-icon{color:#4867AA;background:#fff}.single-touch:hover.twitter{background:#1DA1F2}.single-touch:hover.twitter .touch-socail-icon{color:#1DA1F2;background:#fff}.single-touch:hover.behance{background:#1869FF}.single-touch:hover.behance .touch-socail-icon{color:#1869FF;background:#fff}.single-touch:hover.youtube{background:#FE0000}.single-touch:hover.youtube .touch-socail-icon{color:#FE0000;background:#fff}.single-touch:hover.dribbble{background:#EA4C8A}.single-touch:hover.dribbble .touch-socail-icon{color:#EA4C8A;background:#fff}.single-touch:hover.linkedin{background:#007BB6}.single-touch:hover.linkedin .touch-socail-icon{color:#007BB6;background:#fff}.single-touch:hover p{color:#fff}.touch-socail-icon{height:40px;width:40px;text-align:center;line-height:40px;margin:auto;margin-bottom:5px;border-radius:100%;color:#fff}.recent-reading-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px 0;border-top:1px solid #f3f3f3;border-bottom:1px solid #f3f3f3}@media only screen and (max-width:575px){.recent-reading-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:self-end;-webkit-align-items:self-end;-ms-flex-align:self-end;align-items:self-end}}.recent-reading-header .recent-article-date{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-reading-header .recent-article-date .date-button{margin-left:15px;height:48px;width:48px;line-height:48px;text-align:center;background-color:#f8f7fc;border-radius:10px}.single-recent-reading-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:40px}.recent-reading-post-thum{width:120px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.recent-reading-post-author{color:#9b9ea1;margin-bottom:10px}.recent-reading-post-author a{color:#000}.recent-reading-post-content{margin-left:25px}@media only screen and (max-width:575px){.recent-reading-post-content{margin-left:10px}}.recent-reading-post-meta{font-size:12px;margin-top:10px}.recent-reading-post-meta span{position:relative;padding-right:10px;margin-right:10px}.recent-reading-post-meta span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.recent-reading-post-meta span a:hover{color:#ffc4a0}.recent-reading-post-meta span:last-child{padding-right:0;margin-right:0}.recent-reading-post-meta span:last-child::after{display:none}.archive-search-box{position:relative;margin-top:20px}.archive-search-box .search-input{width:100%;background-color:#f8f7fc;border-radius:10px;position:relative;border:0;font-weight:500;padding:16px 40px 16px 30px}.archive-search-box .search-button{position:absolute;top:50%;right:0;background-color:transparent;color:#5974ff;padding:10px 15px;border:0;font-size:20px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.archive-post-inner-wrap{border-radius:10px;max-width:300px;margin-left:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.archive-post-inner-wrap{max-width:100%;margin-top:60px}}.single-archive-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px}.archive-post-thum{-webkit-flex-basis:0 0 auto;-ms-flex-preferred-size:0 0 auto;flex-basis:0 0 auto;min-width:84px}.archive-post-thum a img{border-radius:10px}.archive-post-content{margin-left:20px}.archive-post-content .title{margin-top:0;font-size:15px}.archive-post-content .archive-post-meta{font-size:12px;margin-top:10px}.archive-post-content .archive-post-meta span{position:relative;padding-right:6px;margin-right:6px}.archive-post-content .archive-post-meta span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.archive-post-content .archive-post-meta span a:hover{color:#ffc4a0}.archive-post-content .archive-post-meta span:last-child{padding-right:0;margin-right:0}.archive-post-content .archive-post-meta span:last-child::after{display:none}.follow-us-box{margin-top:20px}.single-follow-col{margin-bottom:15px}.single-follow{background-color:#f8f7fc;padding:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border-radius:15px;padding:17px 20px}.single-follow i{margin-right:5px}.single-follow .socail-title{font-weight:600}.single-follow:hover{background-color:#5974ff;color:#fff}.single-follow:hover .follow-share-onover .follow-title{opacity:0;visibility:hidden}.single-follow:hover .follow-share-onover .follow-hover{opacity:1;visibility:visible;color:#fff}.single-follow:hover .follow-socail-icon{color:#fff}.follow-share-onover{position:relative}.follow-share-onover p{margin-bottom:0;position:absolute;right:0;-webkit-transition:all .3s ease-in;-o-transition:all .3s ease-in;transition:all .3s ease-in;color:#000}.follow-share-onover .follow-title{opacity:1;visibility:visible}.follow-share-onover .follow-hover{opacity:0;visibility:hidden}.bottom-add-banner-box{position:relative}.bottom-add-banner-boxa{display:block}@media only screen and (max-width:767px){.bottom-add-banner-box img{height:100px;-o-object-fit:cover;object-fit:cover;border-radius:10px}}.bottom-add-text{font-size:25px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:50px;display:inline-block}.bottom-add-text span{display:block;font-size:32px;text-align:left;margin-top:3px}@media only screen and (max-width:767px){.bottom-add-text{font-size:16px}.bottom-add-text span{font-size:18px}}.single-most-populer-item{margin-top:40px}.most-populer-thum{display:block}.most-populer-thum img{border-radius:10px;width:100%}.most-populer-content{margin-top:25px}.most-populer-content .title{color:#0f034a;margin-top:10px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.most-populer-content .most-populer-post-meta{margin-top:10px}.most-populer-content .most-populer-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#0f034a}.most-populer-content .most-populer-post-meta>span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.most-populer-content .most-populer-post-meta>span:last-child{padding-right:0;margin-right:0}.most-populer-content .most-populer-post-meta>span:last-child::after{display:none}.most-populer-post-author{color:#9b9ea1;font-weight:600}.most-populer-post-author a{color:#0f034a}.most-popular-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.most-popular-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:1px solid #e7e5ed;text-align:center;font-size:25px;border-radius:10px;color:#0f034a;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.most-popular-slider-navigation .navigation-button.popular-swiper-button-next{margin-left:10px}.most-popular-slider-navigation .navigation-button:hover{border:1px solid #ff7d6b;background-color:#ff7d6b;color:#fff}.special-banner-blog-post .single-special-banner-post{border-bottom:1px solid #e3e3e3;padding-bottom:30px}.special-banner-blog-post .single-special-banner-post:last-child{border-bottom:0}.recent-article-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-article-header .recent-article-date{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-article-header .recent-article-date .date-button{margin-left:15px;height:48px;width:48px;line-height:48px;text-align:center;background-color:#f4f4f4;border-radius:10px}@media only screen and (max-width:575px){.recent-article-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.recent-article-header .recent-article-date{margin-top:10px}}.section-border-bottom{border-bottom:1px solid #e3e3e3;padding-bottom:30px}.recent-article-header-two{padding-top:60px;margin-top:60px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:767px){.recent-article-header-two{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.recent-article-header-two .input-search-box{position:relative;width:340px}.recent-article-header-two .input-search-box .input{border:1px solid #ddd;border-radius:15px;position:relative;height:60px;padding:15px 50px 15px 30px;font-weight:500;width:100%}.recent-article-header-two .input-search-box .submit-button{position:absolute;right:15px;height:60px;background:transparent;border:0}@media only screen and (max-width:767px){.recent-article-header-two .input-search-box{width:300px;margin-top:30px}}.single-recent-article-item{margin-top:45px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (max-width:575px){.single-recent-article-item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.recent-article-thum{display:block;max-width:360px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.recent-article-thum{max-width:300px}}@media only screen and (min-width:768px) and (max-width:991px){.recent-article-thum{max-width:300px}}@media only screen and (max-width:767px){.recent-article-thum{max-width:200px}}@media only screen and (max-width:575px){.recent-article-thum{max-width:100%}}.recent-article-thum img{border-radius:10px;width:100%;height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover}.recent-article-content{margin-left:35px;margin-top:15px}@media only screen and (max-width:575px){.recent-article-content{margin-left:0;margin-top:30px}}.recent-article-content .title{color:#0f034a;margin-top:10px}.recent-article-content .recent-article-post-meta{margin-top:10px}.recent-article-content .recent-article-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#0f034a}.recent-article-content .recent-article-post-meta>span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.recent-article-content .recent-article-post-meta>span:last-child{padding-right:0;margin-right:0}.recent-article-content .recent-article-post-meta>span:last-child::after{display:none}.recent-article-post-author{color:#9b9ea1;font-weight:600}.recent-article-post-author a{color:#0f034a}.recent-post-right-area{padding-left:26px}.trusted-partners-box{padding:80px 100px;background-color:#f4eaff;border-radius:15px}.trusted-partners-box .trusted-partners-slider-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (min-width:992px) and (max-width:1199px){.trusted-partners-box{padding:60px 80px}}@media only screen and (min-width:768px) and (max-width:991px){.trusted-partners-box{padding:60px 40px}}@media only screen and (max-width:767px){.trusted-partners-box{padding:60px 30px}}.trusted-partners-area{padding:60px 0}.partners-swiper-pagination{margin-top:40px;text-align:center}.partners-swiper-pagination .swiper-pagination-bullet{height:14px;width:14px;border-radius:100%;background-color:#8b61b7;margin:8px}.partners-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#0f034a;border-radius:100%}.single-platform-box{background-color:#fafafa;padding:40px;border-radius:10px;margin-top:30px}@media only screen and (max-width:575px){.single-platform-box{padding:40px 20px}}.platform-icon{background-color:#ffc4a0;display:inline-block;height:90px;width:90px;line-height:90px;text-align:center;border-radius:10px;margin-bottom:20px}.platform-content .title{margin-bottom:20px}.platform-d-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (max-width:767px){.platform-d-flex{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.platform-content-box{max-width:300px;padding-right:20px}@media only screen and (min-width:992px) and (max-width:1199px){.platform-content-box{max-width:250px}}@media only screen and (max-width:767px){.platform-content-box{max-width:100%;margin-bottom:30px}}.plateform-image-box{margin-left:30px}@media only screen and (max-width:767px){.plateform-image-box{margin-left:0}}.bunzo-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-top:1px solid #ddd;border-bottom:1px solid #ddd}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.bunzo-row{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;border-bottom:0}}.bunzo-col-6{width:50%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;border-left:1px solid #ddd;height:100%}.bunzo-col-6:first-child{border-left:none}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.bunzo-col-6{width:100%;border-right:0;border-bottom:1px solid #ddd}}.bunzo-history-title{font-size:62px;font-weight:300;margin-right:30px;margin-top:30px;margin-bottom:30px}.bunzo-history-title .f-w-bold{font-weight:600}@media only screen and (min-width:992px) and (max-width:1199px){.bunzo-history-title{font-size:42px}}@media only screen and (min-width:768px) and (max-width:991px){.bunzo-history-title{font-size:42px}}@media only screen and (max-width:767px){.bunzo-history-title{font-size:22px}}.single-history-item{border-bottom:1px solid #ddd;padding:60px 0 60px 90px}.single-history-item:last-child{border-bottom:0}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-history-item{padding:30px 30px 30px 30px;border-right:1px solid #ddd}}.plateforem-image{position:relative}.plateforem-image .platform-box-button{position:absolute;width:100%;bottom:30px;text-align:center;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.single-team-area{position:relative;overflow:hidden;margin-top:40px}.single-team-area .team-thum img{width:100%}.single-team-area:hover .team-content{opacity:1;visibility:visible}.single-team-area:hover .team-share-top{margin-top:20px}.single-team-area:hover .team-member-info{margin-bottom:20px}.team-content{opacity:0;visibility:hidden;position:absolute;height:100%;width:100%;top:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;text-align:center;border-radius:10px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background:-webkit-linear-gradient(bottom,rgba(0,0,0,0.9) 0,rgba(253,195,158,0.9) 100%)}.team-share-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:0;-webkit-transition:all .4s ease-in-out;-o-transition:all .4s ease-in-out;transition:all .4s ease-in-out}.shate-action-button{margin-left:20px;height:40px;width:40px;line-height:40px;background-color:#fff;border-radius:10px;text-align:center;font-weight:600}.shate-action-button:hover{background-color:#222;color:#fff}.team-social-share{text-align:right;margin-right:20px}.team-social-share li{display:inline-block;margin:0 3px}.team-social-share li a{height:40px;width:40px;line-height:40px;background-color:#fff;border-radius:10px;text-align:center}.team-social-share li a:hover{background-color:#222;color:#fff}.team-member-info{margin-bottom:0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.team-member-info .name-title{color:#fff}.team-member-info .desination{color:#ffc4a0}.blog-details-col-8{max-width:847px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-8{max-width:603px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.blog-details-col-8{max-width:100%}}.blog-details-col-4{max-width:363px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-4{max-width:363px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.blog-details-col-4{max-width:100%}}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-4 .single-latest-post{width:100%;padding-right:0}}.blog-details-meta-box{margin-top:20px;margin-bottom:5px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.blog-details-meta-box .post-meta-left-side,.blog-details-meta-box .post-mid-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.blog-details-meta-box .post-mid-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.blog-details-meta-box .post-mid-side span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.blog-details-meta-box .post-mid-side span a:hover{color:#ffc4a0}.blog-details-meta-box .post-mid-side span:last-child{padding-right:0;margin-right:0}.blog-details-meta-box .post-mid-side span:last-child::after{display:none}@media only screen and (max-width:767px){.blog-details-meta-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.blockquote-box{background-color:#fafafa;padding:60px 60px;text-align:center;position:relative;margin-top:30px}.blockquote-box::before{color:#ffc4a0;font-size:106px;position:absolute;content:\"“\";height:auto;width:105px;line-height:100px;top:30px;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.blockquote-box .blockquote-text{font-size:20px;font-weight:600;margin-top:30px}@media only screen and (max-width:767px){.blockquote-box{padding:60px 30px}.blockquote-box .blockquote-text{font-size:16px}}.blog-details-tag-and-share-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:30px}@media only screen and (max-width:767px){.blog-details-tag-and-share-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.blog-details-tag-and-share-area .social-share-area{margin-top:30px}}.related-post-thum img{width:100%}.comment-form-area{margin-top:30px}.comment-form-area .single-input{margin-bottom:20px}.comment-form-area .single-input input,.comment-form-area .single-input textarea{border:1px solid #efefef;border-radius:5px;width:100%;padding:15px 30px;background-color:#fafafa}.comment-form-area .single-input textarea{height:280px}.blog-details-two-header{max-width:800px;text-align:center;margin:auto;margin-top:40px}.blog-details-two-post-title{margin-bottom:25px;font-size:32px;font-weight:bold;color:#0f034a}.blog-details-two-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:20px}@media only screen and (max-width:479px){.blog-details-two-post-meta{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.blog-details-two-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.blog-details-two-post-meta span::after{position:absolute;content:\"\";right:-5px;top:50%;height:4px;width:4px;background:#091d40;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.blog-details-two-post-meta span a:hover{color:#5974ff}.blog-details-two-post-meta span:last-child{padding-right:0;margin-right:0}.blog-details-two-post-meta span:last-child::after{display:none}.blog-details-two-post-author{color:#9b9ea1}.blog-details-two-post-author a{color:#091d40}@media only screen and (max-width:479px){.blog-details-two-post-author{font-size:12px}}.blog-details-two-tags a{margin-left:10px;margin-right:10px;margin-top:20px;height:40px;border-radius:10px;line-height:40px}.blog-details-two-post-text .title{color:#0a1e43}.table-content-list .table-content-item{position:relative;padding:20px;padding-left:50px;background-color:transparent;border-radius:15px;border:1px solid #eee;margin-bottom:10px;font-weight:600;color:#5138ee;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.table-content-list .table-content-item:hover{background-color:#eeee}.table-content-list .table-content-item::before{content:'\\ea98';position:absolute;left:20px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-family:IcoFont;color:#0a1e43}.blockquote-box-two{margin-top:40px;margin-bottom:40px;background-color:#5138ee;padding:80px 60px;text-align:center}.blockquote-box-two h4{font-size:44px;color:#fff;font-weight:500}.blockquote-box-two h4 .bold{font-weight:600}@media only screen and (min-width:768px) and (max-width:991px){.blockquote-box-two{padding:60px 30px}.blockquote-box-two h4{font-size:30px}}@media only screen and (max-width:767px){.blockquote-box-two{padding:60px 30px}.blockquote-box-two h4{font-size:26px}}.blog-post-author{color:#9b9ea1;margin-left:15px}.blog-post-author a{color:#000}.blog-details-two-share-area{margin-top:40px;border-top:1px solid #ddd;border-bottom:1px solid #ddd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px 50px}@media only screen and (max-width:767px){.blog-details-two-share-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:15px 10px}.blog-details-two-share-area .share-title{margin-bottom:20px}}.related-post-two-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.related-post-two-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #e0dfe6;text-align:center;background-color:transparent;font-size:25px;border-radius:10px;color:#0f034a;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.related-post-two-slider-navigation .navigation-button.popular-swiper-button-next{margin-left:10px}.related-post-two-slider-navigation .navigation-button:hover{border:1px solid #5138ee;background-color:#5138ee;color:#fff}.comment-list-wrapper{margin-bottom:60px}.comment-list-wrapper .widget-title{color:#0a1e43}.comment-list{margin:0;padding:0}.comment-list .comment-2,.comment-list .comment-reply-wrap{border:1px solid #eee;padding:30px;border-radius:10px}.comment-list .comment-author-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.comment-list .comment{list-style-type:none;padding:10px 0}.comment-list .comment:last-child{padding-bottom:0}.comment-list .comment-author img{border-radius:50px;width:120px}.comment-list .comment-content{position:relative;overflow:hidden;margin-left:20px;width:100%}.comment-list .meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:767px){.comment-list .meta{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}}.comment-list .meta .fn{font-size:22px;text-transform:uppercase;color:#0a1e43;display:block;margin-bottom:0}@media only screen and (max-width:767px){.comment-list .meta .fn{font-size:18px}}.comment-list .meta .comment-datetime{position:relative;display:inline-block;font-size:14px;color:#ababab;margin-top:10px}.comment-list .meta .separator{padding:0 10px}.comment-list .meta .time{color:#5138ee}.comment-list .comment-author.vcard{padding:8px;border:1px solid #dfeee5;border-radius:100%}.comment-list .comment-actions a{margin-right:20px;font-weight:500;color:#333}.comment-list .comment-actions a:hover{color:#5138ee}.comment-list .comment-reply-link{background-color:#f8f8f8;height:45px;line-height:45px;color:#5138ee;font-weight:600;border-radius:10px;padding:0 20px}.comment-list .comment-reply-link i{margin-right:10px}@media only screen and (max-width:767px){.comment-list .comment-reply-link{margin-top:5px}}.comment-list .children{margin:20px 0 20px 100px;padding:0}@media only screen and (max-width:767px){.comment-list .children{margin:40px 0 20px 30px}}.comment-list .children li+li{margin-top:0}.comment-list .comment-text{margin-top:15px}.comment-submit-btn .ht-btn{padding:0 54px}.messonry-button{border-bottom:1px solid #eee;padding-bottom:20px;padding-top:20px;border-top:1px solid #eee}.messonry-button button{background-color:transparent;border:0;font-weight:600;padding-left:35px;margin-left:30px;position:relative}.messonry-button button.is-checked{color:#ffc4a0}.messonry-button button::before{color:#222;content:'';height:6px;width:6px;background:#222;border-radius:5000px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);position:absolute;left:0}.messonry-button button:first-child{padding-left:0;margin-left:0}.messonry-button button:first-child::before{display:none}.author-blog-post-content .post-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.author-blog-post-content .post-right-side span{position:relative;padding-right:15px;margin-right:15px;font-size:13px}.author-blog-post-content .post-right-side span::after{position:absolute;content:\"\";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.author-blog-post-content .post-right-side span a:hover{color:#ffc4a0}.author-blog-post-content .post-right-side span:last-child{padding-right:0;margin-right:0}.author-blog-post-content .post-right-side span:last-child::after{display:none}@media only screen and (max-width:767px){.author-blog-post-content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.author-blog-post-wrap{margin-bottom:30px}.author-post-bottom-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-top:1px solid #eee;border-bottom:1px solid #eee;margin-top:20px}.author-blog-thum{display:block}.author-blog-thum img{width:100%}.author-post-action-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 20px;margin:20px 0}@media only screen and (max-width:575px){.author-post-action-box{padding:0}}.author-post-action-box .author-action{margin-right:10px;margin-left:10px}.faq-box-wrap{margin-top:100px;margin-bottom:100px;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.faq-section-title{margin-top:30px}.faq-section-title .title{font-size:62px;font-weight:400;margin-top:100px;margin-right:30px}.faq-section-title .title .bold-text{font-weight:600;display:block}@media only screen and (min-width:992px) and (max-width:1199px){.faq-section-title .title{font-size:52px;margin-top:50px}}@media only screen and (min-width:768px) and (max-width:991px){.faq-section-title .title{font-size:48px;margin-top:50px}}@media only screen and (max-width:767px){.faq-section-title .title{font-size:42px;margin-top:50px}}@media only screen and (max-width:575px){.faq-section-title .title{font-size:32px;margin-top:50px}}.faq-content-wrap{border-left:1px solid #ddd}.faq-qustion{background:transparent;border:0;font-weight:600;padding:40px 0 40px 40px;font-size:20px}@media only screen and (max-width:575px){.faq-qustion{font-size:14px;padding:20px 0 20px 10px}}.faq-qustion::after{display:none}.faq-qustion:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.faq-qustion .number-of-accordion{min-height:46px;min-width:46px;text-align:center;line-height:46px;background-color:#f4f4f4;border-radius:10px;margin-right:20px;font-size:15px}.faq-qustion:not(.collapsed){background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#000}.faq-qustion:not(.collapsed) .number-of-accordion{background-color:#ffc4a0;color:#fff}.accordion-item{border-top:0;border-left:none;border-right:0;border-bottom:2px solid #ddd}.accordion-item:last-child{border-bottom:0}.faq-ans{padding:0 0 40px 100px}@media only screen and (max-width:575px){.faq-ans{padding:0 0 20px 10px}}.office-img{margin-top:30px;padding:30px;background:#f7f7f7;border-radius:15px;position:relative}.office-img img{border-radius:15px}.office-img .office-title{position:absolute;bottom:60px;text-align:center;left:50%;display:inline-block;background-color:#333;border-radius:15px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);color:#fff;padding:10px 40px;border:4px solid rgba(255,255,255,0.8)}.single-office-info{margin-top:30px;padding:40px 55px;border:1px solid #ddd;border-radius:15px;background-color:transparent}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-office-info{padding:30px 25px}}.single-office-info .single-contact-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.single-office-info .single-contact-info:last-child{margin-bottom:0}.single-office-info .single-contact-info .icon{min-height:45px;min-width:45px;line-height:45px;border-radius:10px;margin-right:20px;text-align:center;background-color:#f4f4f4}.single-office-info-wrap:hover .office-title{background-color:#ffc4a0;color:#222}.single-office-info-wrap:hover .single-office-info{border-color:#ffc4a0}.contact-from .section-title .title{font-size:40px}@media large-mobile{.contact-from .section-title .title{font-size:30px}}.single-input-box{margin-bottom:20px}.single-input-box input,.single-input-box textarea{border:1px solid #efefef;width:100%;padding:10px 30px;border-radius:10px;background-color:#fafafa}.single-input-box textarea{height:200px}.single-input-box:hover input,.single-input-box:hover textarea{background-color:transparent}.contact-us-map iframe{height:664px;width:100%;border-radius:15px}.error-404-area{padding:100px 0;position:relative}@media only screen and (min-width:768px) and (max-width:991px){.error-404-area{padding:80px 0}}@media only screen and (max-width:767px){.error-404-area{padding:60px 0}}.error-text{text-align:center;max-width:600px;margin:auto;margin-top:50px}.error-text h5{color:#ffc4a0;margin-bottom:20px}.error-area-shap{position:absolute;bottom:0;left:100px}@media only screen and (min-width:768px) and (max-width:991px){.error-area-shap{left:40px}}@media only screen and (max-width:767px){.error-area-shap{display:none}}.share-thinking-title{background-color:#f5f5f5;padding:40px;border-radius:15px}.share-thinking-title .title{font-size:28px}.title-write{background-color:#f5f5f5;padding:20px;border-radius:15px;margin-top:30px}.write-content-box{border:1px solid #f5f5f5;padding:20px;border-radius:15px;margin-top:30px}.post-write-tag a{position:relative;padding-right:10px}.post-write-tag a::after{content:\",\"}.post-write-tag a:last-child::after{content:\"\"}.post-write-trams{padding:0 20px}.single-trams{margin-bottom:20px}.single-trams .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px}.single-trams .title .form-check-label{margin-left:10px;font-weight:600;font-size:18px}.form-check-input:checked{background-color:#ffc4a0;border-color:#ffc4a0}.form-check-input:focus{border-color:transparent;outline:0;-webkit-box-shadow:none;box-shadow:none}.conditon-buttom-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:50px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.conditon-buttom-wrap{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.conditon-note{color:#8e8f91;max-width:600px}@media only screen and (min-width:992px) and (max-width:1199px){.conditon-note{max-width:500px}}.conditon-note .title{font-weight:600;color:#000}.login-content form>input{width:100%;background-color:#fff;padding:1px 20px;color:#000;line-height:47px;border:0;border-radius:10px;margin-bottom:25px;border:1px solid #ddd}.remember-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.remember-wrap p{margin-bottom:0}.remember-forget-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}\n\n/**商品**/\n#baguetteBox-overlay{display:none;opacity:0;position:fixed;overflow:hidden;top:0;left:0;width:100%;height:100%;z-index:1000000;background-color:#222;background-color:rgba(0,0,0,.8);transition:opacity .5s ease}#baguetteBox-overlay.visible{opacity:1}#baguetteBox-overlay .full-image{display:inline-block;position:relative;width:100%;height:100%;text-align:center}#baguetteBox-overlay .full-image figure{display:inline;margin:0;height:100%}#baguetteBox-overlay .full-image img{display:inline-block;width:auto;height:auto;max-height:100%;max-width:100%;vertical-align:middle;box-shadow:0 0 8px rgba(0,0,0,.6)}#baguetteBox-overlay .full-image figcaption{display:block;position:absolute;bottom:0;width:100%;text-align:center;line-height:1.8;white-space:normal;color:#ccc;background-color:#000;background-color:rgba(0,0,0,.6);font-family:sans-serif}#baguetteBox-overlay .full-image:before{content:\"\";display:inline-block;height:50%;width:1px;margin-right:-1px}#baguetteBox-slider{position:absolute;left:0;top:0;height:100%;width:100%;white-space:nowrap;transition:left .4s ease,-webkit-transform .4s ease;transition:left .4s ease,transform .4s ease;transition:left .4s ease,transform .4s ease,-webkit-transform .4s ease}#baguetteBox-slider.bounce-from-right{-webkit-animation:d .4s ease-out;animation:d .4s ease-out}#baguetteBox-slider.bounce-from-left{-webkit-animation:e .4s ease-out;animation:e .4s ease-out}@-webkit-keyframes d{0%,to{margin-left:0}50%{margin-left:-30px}}@keyframes d{0%,to{margin-left:0}50%{margin-left:-30px}}@-webkit-keyframes e{0%,to{margin-left:0}50%{margin-left:30px}}@keyframes e{0%,to{margin-left:0}50%{margin-left:30px}}.baguetteBox-button#next-button,.baguetteBox-button#previous-button{top:50%;top:calc(50% - 30px);width:44px;height:60px}.baguetteBox-button{position:absolute;cursor:pointer;outline:0;padding:0;margin:0;border:0;border-radius:15%;background-color:#323232;background-color:rgba(50,50,50,.5);color:#ddd;font:1.6em sans-serif;transition:background-color .4s ease}.baguetteBox-button:focus,.baguetteBox-button:hover{background-color:rgba(50,50,50,.9)}.baguetteBox-button#next-button{right:2%}.baguetteBox-button#previous-button{left:2%}.baguetteBox-button#close-button{top:20px;right:2%;right:calc(2% + 6px);width:30px;height:30px}.baguetteBox-button svg{position:absolute;left:0;top:0}.baguetteBox-spinner{width:40px;height:40px;display:inline-block;position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-20px}.baguetteBox-double-bounce1,.baguetteBox-double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:f 2s infinite ease-in-out;animation:f 2s infinite ease-in-out}.baguetteBox-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes f{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes f{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}body,html{height:100%;width:100%}.sp-loading{text-align:center;max-width:270px;padding:15px;font-size:12px;color:#888}.sp-loading,.sp-wrap{border:5px solid #eee;border-radius:3px}.sp-wrap{display:none;line-height:0;font-size:0;background:#eee;position:relative;margin:0 25px 15px 0;float:left;}.sp-thumbs{text-align:left;display:inline-block}.sp-thumbs img{min-height:50px;min-width:50px;max-width:50px}.sp-thumbs a:link,.sp-thumbs a:visited{width:50px;height:50px;overflow:hidden;opacity:.3;display:inline-block;background-size:cover;background-position:50%;transition:all .2s ease-out}.sp-thumbs a:hover{opacity:1}.sp-current,.sp-thumbs a:active{opacity:1!important;position:relative}.sp-large{position:relative;overflow:hidden;top:0;left:0}.sp-large a img{max-width:100%;height:auto}.sp-large a{display:block}.sp-zoom{position:absolute;left:-50%;top:-50%;cursor:zoom-in;display:none}.sp-lightbox{position:fixed;top:0;left:0;height:100%;width:100%;background:#000;background:rgba(0,0,0,.9);z-index:1031;display:none;cursor:pointer}.sp-lightbox img{position:absolute;margin:auto;top:0;bottom:0;left:0;right:0;max-width:90%;max-height:90%;border:2px solid #fff}#sp-next,#sp-prev{position:absolute;top:50%;margin-top:-25px;z-index:501;color:#fff;padding:14px;text-decoration:none;background:#000;border-radius:25px;border:2px solid #fff;width:50px;height:50px;box-sizing:border-box;transition:.2s}#sp-prev{left:10px}#sp-prev:before{content:\"\";border:7px solid transparent;border-right:15px solid #fff;position:absolute;top:16px;left:7px}#sp-next{right:10px}#sp-next:before{content:\"\";border:7px solid transparent;border-left:15px solid #fff;position:absolute;top:16px;left:18px}#sp-next:hover,#sp-prev:hover{background:#444}@media screen and (max-width:400px){.sp-wrap{margin:0 0 15px}#sp-next,#sp-prev{top:auto;margin-top:0;bottom:25px}}.btn i{margin-right:5px}.clean-block.dark{background-color:#f6f6f6}.clean-block.blue{background-color:#007bff;color:#fff}.clean-block.blue input{border:none}.clean-block .block-heading{padding-top:50px;margin-bottom:40px;text-align:center}.clean-block .block-heading p{text-align:center;max-width:420px;margin:auto;opacity:.7}.clean-block.dark .block-heading p{opacity:.8}.clean-block .block-heading h1,.clean-block .block-heading h2,.clean-block .block-heading h3{margin-bottom:1.2rem}.clean-block .block-content,.clean-block .content{box-shadow:0 2px 10px rgba(0,0,0,.075);background-color:#fff}.clean-block .block-content{padding:40px}.clean-block.clean-hero{position:relative;text-align:center;background-size:cover;background-repeat:no-repeat;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding-bottom:0}.clean-block.clean-hero:before{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background-color:currentColor;z-index:1}.clean-block.clean-hero .text{max-width:640px;color:#fff;z-index:2;padding:40px 15px;text-shadow:1px 1px 1px rgba(0,0,0,.15)}.clean-block.clean-hero h2{margin-bottom:30px}.clean-block.clean-hero p{font-size:18px;margin-bottom:30px}.feature-box{padding:15px 20px 15px 70px}.feature-box .icon{font-size:30px;position:absolute;left:15px;top:15px;width:30px;text-align:center;color:#3b99e0}.feature-box h4{font-weight:600;font-size:1.2rem}.feature-box p{font-size:.9em;opacity:.8}.clean-block.slider{margin-left:auto;margin-right:auto}.clean-card{box-shadow:0 2px 10px rgba(0,0,0,.075);border-radius:3px;margin-bottom:40px;border:1px solid #eaeaea}.clean-card .image{border-radius:3px 3px 0 0;overflow:hidden}.clean-card .info{padding:30px}.clean-card h4{font-weight:600;font-size:1em}.clean-card p{opacity:.8;font-size:.85em;margin-bottom:.9em}.clean-card .icons a{font-size:16px;color:#3b99e0;opacity:.75;height:2em;line-height:2;text-align:center;padding:.6em .4em}.clean-card .icons a:hover{opacity:1;text-decoration:none}.clean-block.clean-info{padding-left:20px;padding-right:20px;text-align:center}.clean-block.clean-info h3{margin-top:.8em;margin-bottom:.6em}.clean-block.clean-services .card{margin-bottom:30px;text-align:center}.clean-block.clean-services .card h4{font-weight:600;font-size:1em;margin-bottom:.8em}.clean-block.clean-services .card p{font-size:.9em;opacity:.8}.clean-block.clean-services .card button{margin-bottom:25px;padding:6px 20px}.clean-block.clean-faq .faq-item{margin-bottom:20px}.clean-block.clean-faq .faq-item .question{font-weight:600;font-size:1em;line-height:1.5}.clean-block.clean-faq .faq-item:not(:first-child) .question{margin-top:1.8em}.clean-block.clean-faq .faq-item .answer{font-size:1em;color:#7f7d7d;margin-top:20px}.clean-block.clean-form form{border-top:2px solid #5ea4f3;background-color:#fff;max-width:500px;margin:auto;padding:40px;box-shadow:0 2px 10px rgba(0,0,0,.075)}.clean-block.clean-block.clean-gallery .item{margin-bottom:20px}.clean-block.clean-gallery .item .image{box-shadow:0 2px 10px rgba(0,0,0,.075)}.clean-block.clean-gallery .lightbox img{transition:.2s ease-in-out}.clean-block.clean-gallery .lightbox img:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.clean-block.clean-gallery img{border-radius:4px}.baguetteBox-button{background-color:transparent!important}.clean-pricing-item .heading{text-align:center;padding-bottom:10px;border-bottom:1px solid rgba(0,0,0,.1)}.clean-pricing-item{background-color:#fff;box-shadow:0 2px 10px rgba(0,0,0,.075);border-top:2px solid #5ea4f3;padding:30px;overflow:hidden;position:relative}.clean-block.clean-pricing .col-md-5:not(:last-child) .item{margin-bottom:30px}.clean-pricing-item button{font-weight:600}.clean-pricing-item .ribbon{width:160px;height:32px;font-size:12px;text-align:center;color:#fff;font-weight:700;box-shadow:0 2px 3px hsla(0,0%,53%,.25);background:#4dbe3b;-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;right:-42px;top:20px;padding-top:7px}.clean-pricing-item p{text-align:center;margin-top:20px;opacity:.7}.clean-pricing-item .features .feature{font-weight:600}.clean-pricing-item .features h4{text-align:center;font-size:18px;padding:5px}.clean-pricing-item .price h4{margin:15px 0;font-size:45px;text-align:center;color:#2288f9}.clean-pricing-item .buy-now button{text-align:center;margin:auto;font-weight:600;padding:9px 0}.clean-block.payment-form form{border-top:2px solid #5ea4f3;box-shadow:0 2px 10px rgba(0,0,0,.075);background-color:#fff;padding:0;max-width:600px;margin:auto}.clean-block.payment-form .title{font-size:1em;border-bottom:1px solid rgba(0,0,0,.1);margin-bottom:.8em;font-weight:600;padding-bottom:8px}.clean-block.payment-form .products{background-color:#f7fbff;padding:25px}.clean-block.payment-form .products .item{margin-bottom:1em}.clean-block.payment-form .products .item-name{font-weight:600;font-size:.9em}.clean-block.payment-form .products .item-description{font-size:.8em;opacity:.6}.clean-block.payment-form .products .item p{margin-bottom:.2em}.clean-block.payment-form .products .price{float:right;font-weight:600;font-size:.9em}.clean-block.payment-form .products .total{border-top:1px solid rgba(0,0,0,.1);margin-top:10px;padding-top:19px;font-weight:600;line-height:1}.clean-block.payment-form .card-details{padding:25px 25px 15px}.clean-block.payment-form .card-details label{font-size:12px;font-weight:600;margin-bottom:15px;color:#79818a;text-transform:uppercase}.clean-block.payment-form .card-details button{margin-top:.6em;padding:12px 0;font-weight:600}.clean-block.payment-form .date-separator{margin-left:10px;margin-right:10px;margin-top:5px}.clean-block.clean-catalog .filters{padding-left:40px;padding-top:10px}.clean-block.clean-catalog .filter-collapse .filter-caret{float:right;font-size:12px;line-height:26px}.clean-block.clean-catalog .filter-collapse{display:block;padding:10px;border:1px solid #ccc;margin:30px;border-radius:0;text-align:left}.clean-block.clean-catalog .filters h3{font-size:1em;font-weight:600;margin-bottom:.8em}.clean-block.clean-catalog .filters .heading{font-size:20px;font-weight:700;padding-bottom:20px}.clean-block.clean-catalog .filters .filter-item{margin-bottom:40px}.clean-block.clean-catalog .filters label{word-wrap:break-word;max-width:100%}.clean-block.clean-catalog .products{padding:0}.clean-block.clean-catalog .products .row:first-of-type{border-top:none;border-left:none;margin-bottom:20px}.clean-product-item{padding:20px;border-right:none;border-bottom:1px solid #e8e6e6;height:100%}.clean-product-item .image{margin-bottom:20px}.clean-product-item .image img{max-width:220px;max-height:180px}.clean-product-item .product-name{margin-bottom:20px;text-align:center}.clean-product-item .product-name a{color:#585858;font-size:1.1em}.clean-product-item .product-name a:hover{text-decoration:none;color:#8f8c8c}.clean-product-item .about{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.clean-product-item .price{text-align:right;padding-right:10px}.clean-product-item .price h3{font-size:1.2em;font-weight:600;color:#32303c;margin:0}.clean-product-item .rating{color:#fec000}.clean-product-item .rating img{width:14px;margin-right:2px}.clean-product-item .add .icon{padding-right:10px}.clean-block.clean-catalog .products .pages{width:50%;margin:55px auto 0}.clean-block.clean-catalog .pagination{-ms-flex-pack:center;justify-content:center}.clean-block.clean-cart .items{padding:36px}.clean-block.clean-cart .items .product{padding-top:20px;padding-bottom:40px}.clean-block.clean-cart .items .product .product-image{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:15px;border:2px solid #f0f0f0}.clean-block.clean-cart .items .product{padding-top:0}.clean-block.clean-cart .items .product .product-info{padding-top:1em;padding-bottom:1em}.clean-block.clean-cart .items .product .product-name{font-weight:600;font-size:1.3em}.clean-block.clean-cart .items .product .product-info .product-specs{font-size:.8rem;font-weight:600;margin-top:15px}.clean-block.clean-cart .items .product .product-info .product-specs .value{font-weight:400}.clean-block.clean-cart .items .product .quantity .quantity-input{width:68px}.clean-block.clean-cart .items .product .quantity label{font-size:.9em}.clean-block.clean-cart .items .product .price{font-weight:700;font-size:22px;text-align:right}.clean-block.clean-cart .summary{background-color:#f7fbff;height:100%;padding:30px}.clean-block.clean-cart .summary h3{text-align:center;font-size:1.25em;font-weight:600;padding-top:16px;padding-bottom:28px;text-transform:uppercase;letter-spacing:2px;color:#1d4f88}.clean-block.clean-cart .summary h4{padding-bottom:18px;margin-bottom:0;background:#fff;padding-left:20px;padding-right:20px}.clean-block.clean-cart .summary h4:first-of-type{border-top:1px solid #86b4e8;padding-top:18px}.clean-block.clean-cart .summary h4:last-of-type{color:#617ef3;border-bottom:1px solid #e6edf5}.clean-block.clean-cart .summary .text{font-size:.65em;font-weight:600}.clean-block.clean-cart .summary .price{font-size:.6em;float:right;margin-top:10px}.clean-block.clean-cart .summary button{margin-top:20px;font-weight:600;font-size:1em;padding:10px 0}.clean-block.clean-product .block-content{padding:20px}.clean-block.clean-product .product-info{margin-bottom:50px}.clean-block.clean-product .gallery{padding:20px;background-color:#f6f6f6}.clean-block.clean-product .sp-wrap{background:transparent;border:none;float:none;width:100%}.clean-block.clean-product .sp-thumbs{margin-top:15px}.clean-block.clean-product .sp-thumbs a:link{margin-right:10px}.clean-block.clean-product .product-info .info .price{padding:20px 0}.clean-block.clean-product .product-info .info .price h3{font-size:1.5em;font-weight:700}.clean-block.clean-product .product-info .info .rating{color:#fec000;padding-bottom:20px;border-bottom:1px solid rgba(0,0,0,.1)}.clean-block.clean-product .product-info .info button{padding:10px 20px;margin-bottom:30px}.clean-block.clean-product .product-info .info button .fa{margin-right:10px}.clean-block.clean-product .product-info .info .summary{border-top:1px solid rgba(0,0,0,.1);padding-top:30px}.clean-block.clean-product .product-info .info .summary p{font-size:.9em}.clean-block.clean-product .product-info .description{max-width:720px;margin:0 auto}.clean-block.clean-product .product-info .description p{margin-bottom:50px}.clean-block.clean-product .product-info .description h4{margin-top:60px;margin-bottom:20px}.clean-block.clean-product .tab-content .description{padding-top:60px}.clean-block.clean-product .tab-content .description .right{text-align:left}.clean-block.clean-product .tab-content .reviews,.clean-block.clean-product .tab-content .specifications{padding-top:30px}.clean-block.clean-product .product-info .specifications .stat{font-weight:700}.clean-block.clean-product .product-info .reviews .review-item{margin-bottom:30px;padding:20px;border:1px solid #ded7d7}.clean-block.clean-product .product-info .reviews .review-item h4{font-size:1.2em;font-weight:600}.clean-block.clean-product .product-info .reviews .review-item span{font-size:.9em}.clean-block.clean-product .product-info .reviews .review-item p{margin-top:12px;font-size:.9em}.clean-block.clean-product .clean-related-items .items{margin-top:30px}.clean-related-item{border:1px solid #eaeaea;padding-top:20px;padding-bottom:20px}.clean-related-item .related-name{text-align:center;margin-top:16px}.clean-related-item .related-name a{font-size:1em;color:#212529}.clean-related-item .related-name a:hover{text-decoration:none;color:#999ea4}.clean-block.clean-product .reviews .review-item .rating,.clean-related-item .related-name .rating{color:#fec000;margin-bottom:10px}.clean-block.clean-product .product-info .info .rating img,.clean-block.clean-product .reviews .review-item .rating img,.clean-related-item .related-name .rating img{width:18px;margin-right:2px}.clean-related-item .related-name h4{font-size:1.3em;font-weight:600;color:#007bff}.clean-blog-post{padding-bottom:70px}.clean-blog-post h3{font-size:1.3em;font-weight:600;padding-top:17px}.clean-blog-post p{font-size:.95em}.clean-blog-post .info{padding:5px 0 12px;font-size:.9em}.clean-blog-post .info span:not(:last-child){margin-right:7px}.clean-blog-post .info a{color:inherit}.clean-block.clean-post{padding-top:100px}.clean-block.clean-post .block-content{padding:0}.clean-block.clean-post .post-image{background-size:cover;background-repeat:no-repeat;width:100%;height:300px}.clean-block.clean-post .post-body{padding:70px 50px;font-size:.9em}.clean-block.clean-post .post-body h3{font-weight:600}.clean-block.clean-post .post-body p{margin-bottom:30px}.clean-block.clean-post .post-body .post-info{padding:20px 0}.clean-block.clean-post .post-body .post-info span{color:#007bff}.clean-block.clean-post .post-body .post-info span:not(:last-child){margin-right:40px}.clean-block.clean-post .post-body h4{font-weight:600;padding-top:20px;padding-bottom:20px}.clean-testimonial-item{border:1px solid #eaeaea;box-shadow:0 2px 10px rgba(0,0,0,.075);margin-bottom:30px;background-color:#fff;color:#212529;text-align:left}.clean-testimonial-item .card-body{padding:40px}.clean-testimonial-item h3{font-size:1.1em;font-weight:600}.clean-testimonial-item p{font-size:.9em}.clean-testimonial-item h4{font-size:.9em;color:#3b99e0}.clean-block.add-on{padding:50px 0;text-align:center;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.clean-block.add-on.call-to-action h3{margin-right:0;margin-bottom:20px}.clean-block.add-on.call-to-action button{border-radius:20px}.clean-block.add-on.newsletter-sign-up h2{padding-right:20px}.clean-block.add-on.newsletter-sign-up input{max-width:85%;margin-bottom:18px;margin-top:10px}.clean-block.add-on.newsletter-sign-up button{border-radius:20px}.clean-block.add-on.newsletter-sign-up .input-group{max-width:300px}.clean-block.add-on.social-icons .icons i{line-height:45px}.clean-block.add-on.social-icons .icons a{font-size:24px;margin-right:4px;color:#6aacf3;border:1px solid;opacity:.75;border-radius:50%;width:45px;height:45px;display:inline-block;text-align:center}.clean-block.add-on.social-icons .icons a:hover{opacity:1;text-decoration:none}.clean-block.add-on.social-icons.blue .icons a{color:#fff;opacity:1}.clean-block.add-on.social-icons.blue .icons a:hover{opacity:.8;text-decoration:none}.clean-block.add-on.sponsors a img{max-width:170px;-webkit-filter:grayscale(.8);filter:grayscale(.8)}.clean-block.add-on.sponsors a:not(:last-child) img{margin-bottom:20px}@media (max-width:767.98px){.clean-block.clean-services .row div:last-child .card{margin-bottom:0}}@media (min-width:576px){.clean-block .block-heading{padding-top:80px}.clean-block.clean-hero{min-height:680px}.clean-block.clean-hero .text{padding:0}.clean-block.clean-block.clean-gallery .item{margin-bottom:40px}.clean-block.payment-form .title{font-size:1.2em}.clean-block.payment-form .products{padding:40px}.clean-block.payment-form .products .item-name,.clean-block.payment-form .products .price{font-size:1em}.clean-block.payment-form .card-details{padding:40px 40px 30px}.clean-block.payment-form .card-details button{margin-top:2em}}@media (min-width:768px){.clean-block.clean-info.right>.container>.row{-ms-flex-direction:row-reverse;flex-direction:row-reverse}.clean-block.clean-info{padding-left:0;padding-right:0;text-align:inherit}.clean-block.clean-info h3{margin-top:0}.clean-block.clean-cart .items .product{padding:0;text-align:left}.clean-block.clean-cart .items .product:not(:last-child){padding-top:0;padding-bottom:25px}.clean-block.clean-cart .items .product .price{font-weight:700;font-size:22px}.clean-block.clean-cart .items .product .quantity{text-align:center}.clean-block.clean-cart .items .product .quantity .quantity-input{margin:auto;padding-left:15px;padding-right:5px}.clean-block.clean-cart .items .product .product-name{font-size:1em}.clean-block.clean-cart .items .product .product-info{padding:0 15px 0 1.5em}.clean-block.clean-post .post-image{height:400px}.clean-block.clean-blog-list .block-content{padding:80px}.clean-blog-post{padding-bottom:70px}.clean-block.add-on{-ms-flex-direction:row;flex-direction:row}.clean-block.add-on.call-to-action h3,.clean-block.add-on.sponsors a:not(:last-child) img{margin-right:20px;margin-bottom:0}.clean-block.add-on.newsletter-sign-up h2{margin-bottom:0}.clean-block.add-on.newsletter-sign-up input{max-width:200px;margin-bottom:0;margin-top:0;margin-right:10px}.clean-block.clean-catalog .filters{padding-top:30px}.clean-block.clean-catalog .products{padding:30px 30px 30px 0}.clean-block.clean-catalog .products .clean-product-item .product-name{text-align:left}.clean-block.clean-catalog .products .row:first-of-type{border-top:1px solid #e8e6e6;border-left:1px solid #e8e6e6}.clean-block.clean-catalog .products .clean-product-item{border-right:1px solid #e8e6e6}.clean-block.clean-product .block-content{padding:40px}.clean-block.clean-product .tab-content .description .right{text-align:right}}@media (min-width:992px){.clean-card{margin-bottom:0}.clean-blog-post h3{padding-top:0}.clean-block.clean-post .post-image{height:500px}.clean-block.clean-post .post-body{padding:70px 150px}.clean-block.clean-testimonials .item{margin-bottom:0}.clean-block.clean-post .post-body{padding:70px 100px}.clean-block.clean-post .post-body h4{padding-top:50px}}.clean-navbar .navbar-nav .nav-link{font-weight:600;font-size:.8rem;text-transform:uppercase}.clean-navbar.fixed-bottom,.clean-navbar.fixed-top{box-shadow:0 0 15px rgba(0,0,0,.1)}.clean-navbar .navbar-nav .nav-item{padding-right:2rem}.clean-navbar .navbar-nav:last-child .item:last-child,.clean-navbar .navbar-nav:last-child .item:last-child a{padding-right:0}.clean-navbar .logo{font-size:1.5rem}.clean-navbar.fixed-top+.page{padding-top:62px}@media (min-width:576px){.navbar{padding-top:1.2rem;padding-bottom:1.2rem}.clean-navbar.fixed-top+.page{padding-top:5rem}}.header-standard .navbar-nav .item{padding-left:20px;font-size:20px}.header-standard{background-image:url(../../assets/img/header-standard/image1.jpg);background-size:cover;background-repeat:no-repeat}.header-standard .hero{padding-top:200px;padding-bottom:200px;text-align:center}.header-standard .hero .heading{font-size:50px}.header-standard .hero .info{margin:30px auto;font-size:20px;margin-top:30px}.page-footer{background-color:#fff;padding-top:30px;text-align:center}.page-footer.dark{background-color:#2b2f31}.page-footer .footer-copyright{background-color:#fff;padding-top:3px;padding-bottom:3px;text-align:center;margin-top:50px;border:1px solid #ededed}.page-footer.dark .footer-copyright{background-color:#222425;border-color:#222425}.page-footer .footer-copyright p{margin:10px;color:#7d8288}.page-footer.dark .footer-copyright p{color:#ccc}.page-footer ul{list-style-type:none;padding-left:0;line-height:1.7}.page-footer h5{font-size:18px;font-weight:700;margin-top:30px}.page-footer.dark h5{color:#fff}.page-footer a{color:#53595f;text-decoration:none}.page-footer.dark a{color:#d2d1d1}.page-footer a:focus,.page-footer a:hover{text-decoration:none;color:#1d2125}.page-footer.dark a:focus,.page-footer.dark a:hover{color:#fff}@media (min-width:576px){.page-footer{text-align:left}}@media (min-width:768px){.page-footer ul li{position:relative;padding-left:10px}.page-footer ul li:after,.page-footer ul li:before{content:\"\";position:absolute;left:0;width:2px;height:6px;border-radius:2px;background-color:#007bff;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.page-footer ul li:before{top:9px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.page-footer ul li:after{top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}}\n\nul.qq-group li,ul.qq-group li a {\n    color: #fff;padding:5px 0;\n}\n.prevpage.btn,.nextpage.btn{\n\ttext-align:left;\n\tmargin-top:5px;\n}\n.comment-page-bar{\n\ttext-align:right;\n}\n.comment-page{\n\t    padding: 5px 10px;\n    border: 1px solid #ccc;\n    border-radius: 5px;\n    margin-right: 10px;\n\tcursor:pointer;\n}\n.tags a {\n    margin: 5px;\n    display: inline-block;\n}\n.faq-ans p {\n    line-height: 30px;\n}\n.product-price {\n    font-weight: 800;\n    color: #f00 !important;\n    font-size: 18px;\n}\nul.filter-bar {\n    border: 1px solid #ccc;\n    border-radius: 5px;\n    padding: 15px;\n\tmargin-bottom: 40px;\n}\n.filter-s label {\n    color: #ffb701;\n    font-size: 15px;\n    font-weight: 600;\n    margin-right: 15px;\n}\n.filter-bar li {\n    padding: 5px 0;\n}\n.filter-s a {\n    padding: 5px 10px;\n}\n.filter-s a.is-checked {\n    background: #ffb806;\n    color: #fff;\n}\n.blog-details-thum img{\n\twidth:100%;\n}\n.info .price {\n    margin: 10px 0;\n    font-size: 20px;\n    font-weight: 600;\n    color: #f00;\n\tclear:both;\n}\n.feature {\n    margin: 10px 0;\n}\n.summary {\n    margin: 20px 0;\n    line-height: 25px;\n}\n.buy-bar button.buy {\n    color: #fff;\n    background: #dc3545;\n}\n.buy-bar p{\n\tdisplay:block;\n\tmargin-bottom:15px;\n\tfont-weight:600;\n}\n.nsbar{\n\tfloat: right;\n}\n.nsbar a {\n    margin: 0 5px;\n}\n.contact a {\n    width: 200px !important;\n}\n.jz-body p {\n    line-height: 40px;\n}\n.jz-body{\n\tpadding: 50px 0;\n\ttext-align: center;\n    font-size: 20px;\n}\n.so{\n\twidth: 80%;\n    height: 30px;\n    border: 1px solid #ccc;\n    border-radius: 3px;\n}\nform.search{\nmargin: 15px 0;\n}"
  },
  {
    "path": "static/cms/static/js/ajax.mail.js",
    "content": "\n\n/*====================================\n    Ajax Mail js\n======================================*/\n\n$(function() {\n\n\t// Get the form.\n\tvar form = $('#contact-form');\n\n\t// Get the messages div.\n\tvar formMessages = $('.form-messege');\n\n\t// Set up an event listener for the contact form.\n\t$(form).submit(function(e) {\n\t\t// Stop the browser from submitting the form.\n\t\te.preventDefault();\n\n\t\t// Serialize the form data.\n\t\tvar formData = $(form).serialize();\n\n\t\t// Submit the form using AJAX.\n\t\t$.ajax({\n\t\t\ttype: 'POST',\n\t\t\turl: $(form).attr('action'),\n\t\t\tdata: formData\n\t\t})\n\t\t.done(function(response) {\n\t\t\t// Make sure that the formMessages div has the 'success' class.\n\t\t\t$(formMessages).removeClass('error');\n\t\t\t$(formMessages).addClass('success');\n\n\t\t\t// Set the message text.\n\t\t\t$(formMessages).text(response);\n\n\t\t\t// Clear the form.\n\t\t\t$('#contact-form input,#contact-form textarea').val('');\n\t\t})\n\t\t.fail(function(data) {\n\t\t\t// Make sure that the formMessages div has the 'error' class.\n\t\t\t$(formMessages).removeClass('success');\n\t\t\t$(formMessages).addClass('error');\n\n\t\t\t// Set the message text.\n\t\t\tif (data.responseText !== '') {\n\t\t\t\t$(formMessages).text(data.responseText);\n\t\t\t} else {\n\t\t\t\t$(formMessages).text('Oops! An error occured and your message could not be sent.');\n\t\t\t}\n\t\t});\n\t});\n\n});\n"
  },
  {
    "path": "static/cms/static/js/aos.js",
    "content": "!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p=\"dist/\",t(0)}([function(e,t,n){\"use strict\";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},r=n(1),a=(o(r),n(6)),u=o(a),c=n(7),f=o(c),s=n(8),d=o(s),l=n(9),p=o(l),m=n(10),b=o(m),v=n(11),y=o(v),g=n(14),h=o(g),w=[],k=!1,x={offset:120,delay:0,easing:\"ease\",duration:400,disable:!1,once:!1,startEvent:\"DOMContentLoaded\",throttleDelay:99,debounceDelay:50,disableMutationObserver:!1},j=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},_=function(){w.forEach(function(e,t){e.node.removeAttribute(\"data-aos\"),e.node.removeAttribute(\"data-aos-easing\"),e.node.removeAttribute(\"data-aos-duration\"),e.node.removeAttribute(\"data-aos-delay\")})},S=function(e){return e===!0||\"mobile\"===e&&p.default.mobile()||\"phone\"===e&&p.default.phone()||\"tablet\"===e&&p.default.tablet()||\"function\"==typeof e&&e()===!0},z=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?_():(document.querySelector(\"body\").setAttribute(\"data-aos-easing\",x.easing),document.querySelector(\"body\").setAttribute(\"data-aos-duration\",x.duration),document.querySelector(\"body\").setAttribute(\"data-aos-delay\",x.delay),\"DOMContentLoaded\"===x.startEvent&&[\"complete\",\"interactive\"].indexOf(document.readyState)>-1?j(!0):\"load\"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener(\"resize\",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener(\"orientationchange\",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener(\"scroll\",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||(0,d.default)(\"[data-aos]\",O),w)};e.exports={init:z,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){\"use strict\";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if(\"function\"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S=\"maxWait\"in n,y=S?x(u(n.maxWait)||0,t):y,z=\"trailing\"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if(\"function\"!=typeof e)throw new TypeError(f);return i(o)&&(r=\"leading\"in o?!!o.leading:r,a=\"trailing\"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t=\"undefined\"==typeof e?\"undefined\":c(e);return!!e&&(\"object\"==t||\"function\"==t)}function r(e){return!!e&&\"object\"==(\"undefined\"==typeof e?\"undefined\":c(e))}function a(e){return\"symbol\"==(\"undefined\"==typeof e?\"undefined\":c(e))||r(e)&&k.call(e)==d}function u(e){if(\"number\"==typeof e)return e;if(a(e))return s;if(i(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(l,\"\");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},f=\"Expected a function\",s=NaN,d=\"[object Symbol]\",l=/^\\s+|\\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y=\"object\"==(\"undefined\"==typeof t?\"undefined\":c(t))&&t&&t.Object===Object&&t,g=\"object\"==(\"undefined\"==typeof self?\"undefined\":c(self))&&self&&self.Object===Object&&self,h=y||g||Function(\"return this\")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){\"use strict\";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if(\"function\"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S=\"maxWait\"in n,y=S?k(a(n.maxWait)||0,t):y,z=\"trailing\"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t=\"undefined\"==typeof e?\"undefined\":u(e);return!!e&&(\"object\"==t||\"function\"==t)}function i(e){return!!e&&\"object\"==(\"undefined\"==typeof e?\"undefined\":u(e))}function r(e){return\"symbol\"==(\"undefined\"==typeof e?\"undefined\":u(e))||i(e)&&w.call(e)==s}function a(e){if(\"number\"==typeof e)return e;if(r(e))return f;if(o(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(d,\"\");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},c=\"Expected a function\",f=NaN,s=\"[object Symbol]\",d=/^\\s+|\\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v=\"object\"==(\"undefined\"==typeof t?\"undefined\":u(t))&&t&&t.Object===Object&&t,y=\"object\"==(\"undefined\"==typeof self?\"undefined\":u(self))&&self&&self.Object===Object&&self,g=v||y||Function(\"return this\")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){\"use strict\";function n(e,t){var n=window.document,r=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=new r(o);i=t,a.observe(n.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function o(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),n=Array.prototype.slice.call(e.removedNodes),o=t.concat(n).filter(function(e){return e.hasAttribute&&e.hasAttribute(\"data-aos\")}).length;o&&i()})}Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){};t.default=n},function(e,t){\"use strict\";function n(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(){return navigator.userAgent||navigator.vendor||window.opera||\"\"}Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),r=/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,a=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i,u=/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i,c=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i,f=function(){function e(){n(this,e)}return i(e,[{key:\"phone\",value:function(){var e=o();return!(!r.test(e)&&!a.test(e.substr(0,4)))}},{key:\"mobile\",value:function(){var e=o();return!(!u.test(e)&&!c.test(e.substr(0,4)))}},{key:\"tablet\",value:function(){return this.mobile()&&!this.phone()}}]),e}();t.default=new f},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e,t,n){var o=e.node.getAttribute(\"data-aos-once\");t>e.position?e.node.classList.add(\"aos-animate\"):\"undefined\"!=typeof o&&(\"false\"===o||!n&&\"true\"!==o)&&e.node.classList.remove(\"aos-animate\")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){\"use strict\";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add(\"aos-init\"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){\"use strict\";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute(\"data-aos-offset\"),anchor:e.getAttribute(\"data-aos-anchor\"),anchorPlacement:e.getAttribute(\"data-aos-anchor-placement\")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case\"top-bottom\":break;case\"center-bottom\":n+=e.offsetHeight/2;break;case\"bottom-bottom\":n+=e.offsetHeight;break;case\"top-center\":n+=i/2;break;case\"bottom-center\":n+=i/2+e.offsetHeight;break;case\"center-center\":n+=i/2+e.offsetHeight/2;break;case\"top-top\":n+=i;break;case\"bottom-top\":n+=e.offsetHeight+i;break;case\"center-top\":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-(\"BODY\"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-(\"BODY\"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e){return e=e||document.querySelectorAll(\"[data-aos]\"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])});\n"
  },
  {
    "path": "static/cms/static/js/main.js",
    "content": "(function(a) {\n\tvar m = a(window);\n\tvar j = m.width();\n\tvar l = a(\".header-sticky\");\n\tvar c = a(\"html\");\n\tvar b = a(\"body\");\n\tvar m = a(window);\n\tvar j = m.width();\n\tvar l = a(\".header-sticky\");\n\tvar c = a(\"html\");\n\tvar b = a(\"body\");\n\tm.on(\"scroll\", function() {\n\t\tvar o = m.scrollTop();\n\t\tvar n = l.height();\n\t\tif (j >= 320) {\n\t\t\tif (o < n) {\n\t\t\t\tl.removeClass(\"is-sticky\")\n\t\t\t} else {\n\t\t\t\tl.addClass(\"is-sticky\")\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction k() {\n\t\tvar o = a(\"#scroll-top\"),\n\t\t\tn = 0,\n\t\t\tp = a(window);\n\t\tp.on(\"scroll\", function() {\n\t\t\tvar q = a(this).scrollTop();\n\t\t\tif (q > n) {\n\t\t\t\to.removeClass(\"show\")\n\t\t\t} else {\n\t\t\t\tif (p.scrollTop() > 200) {\n\t\t\t\t\to.addClass(\"show\")\n\t\t\t\t} else {\n\t\t\t\t\to.removeClass(\"show\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tn = q\n\t\t});\n\t\to.on(\"click\", function(q) {\n\t\t\ta(\"html, body\").animate({\n\t\t\t\tscrollTop: 0\n\t\t\t}, 600);\n\t\t\tq.preventDefault()\n\t\t})\n\t}\n\tk();\n\tif (a(\".has-children--multilevel-submenu\").find(\".submenu\").length) {\n\t\tvar h = a(\".has-children--multilevel-submenu\").find(\".submenu\");\n\t\th.each(function() {\n\t\t\tvar r = a(this).offset();\n\t\t\tvar q = r.left;\n\t\t\tvar s = a(this).width();\n\t\t\tvar n = m.height();\n\t\t\tvar o = m.width() - 10;\n\t\t\tvar p = (q + s <= o);\n\t\t\tif (!p) {\n\t\t\t\ta(this).addClass(\"left\")\n\t\t\t}\n\t\t})\n\t}\n\ta(\"#mobile-menu-trigger\").on(\"click\", function() {\n\t\ta(\"#mobile-menu-overlay\").addClass(\"active\");\n\t\tb.addClass(\"no-overflow\")\n\t});\n\ta(\"#mobile-menu-close-trigger\").on(\"click\", function() {\n\t\ta(\"#mobile-menu-overlay\").removeClass(\"active\");\n\t\tb.removeClass(\"no-overflow\")\n\t});\n\ta(\".offcanvas-navigation--onepage ul li a\").on(\"click\", function() {\n\t\ta(\"#mobile-menu-overlay\").removeClass(\"active\");\n\t\tb.removeClass(\"no-overflow\")\n\t});\n\tb.on(\"click\", function(o) {\n\t\tvar n = o.target;\n\t\tif (!a(n).is(\".mobile-menu-overlay__inner\") && !a(n).parents().is(\".mobile-menu-overlay__inner\") && !a(n).is(\"#mobile-menu-trigger\") && !a(n).is(\"#mobile-menu-trigger i\")) {\n\t\t\ta(\"#mobile-menu-overlay\").removeClass(\"active\");\n\t\t\tb.removeClass(\"no-overflow\")\n\t\t}\n\t});\n\tvar g = window.location.pathname;\n\tvar f = g.substr(g.lastIndexOf(\"/\") + 1);\n\tvar i = window.location.hash.substr(1);\n\tif ((f == \"\" || f == \"/\" || f == \"admin\") && i == \"\") {} else {\n\t\ta(\".navigation-menu li\").each(function() {\n\t\t\ta(this).removeClass(\"active\")\n\t\t});\n\t\tif (i != \"\") {\n\t\t\ta(\".navigation-menu li a[href*='\" + i + \"']\").parents(\"li\").addClass(\"active\")\n\t\t} else {\n\t\t\ta(\".navigation-menu li a[href*='\" + f + \"']\").parents(\"li\").addClass(\"active\")\n\t\t}\n\t}\n\ta(\".openmenu-trigger\").on(\"click\", function(n) {\n\t\tn.preventDefault();\n\t\ta(\".open-menuberger-wrapper\").addClass(\"is-visiable\")\n\t});\n\ta(\".page-close\").on(\"click\", function(n) {\n\t\tn.preventDefault();\n\t\ta(\".open-menuberger-wrapper\").removeClass(\"is-visiable\")\n\t});\n\ta(\"#open-off-sidebar-trigger\").on(\"click\", function() {\n\t\ta(\"#page-oppen-off-sidebar-overlay\").addClass(\"active\");\n\t\tb.addClass(\"no-overflow\")\n\t});\n\ta(\"#menu-close-trigger\").on(\"click\", function() {\n\t\ta(\"#page-oppen-off-sidebar-overlay\").removeClass(\"active\");\n\t\tb.removeClass(\"no-overflow\")\n\t});\n\ta(\"#search-overlay-trigger\").on(\"click\", function() {\n\t\ta(\"#search-overlay\").addClass(\"active\");\n\t\tb.addClass(\"no-overflow\")\n\t});\n\ta(\"#search-close-trigger\").on(\"click\", function() {\n\t\ta(\"#search-overlay\").removeClass(\"active\");\n\t\tb.removeClass(\"no-overflow\")\n\t});\n\ta(\"#hidden-icon-trigger\").on(\"click\", function() {\n\t\ta(\"#hidden-icon-wrapper\").toggleClass(\"active\")\n\t});\n\ta(\".share-icon\").on(\"click\", function(n) {\n\t\tn.preventDefault();\n\t\ta(\".entry-post-share\").toggleClass(\"opened\")\n\t});\n\tb.on(\"click\", function() {\n\t\ta(\".entry-post-share\").removeClass(\"opened\")\n\t});\n\ta(\".entry-post-share\").on(\"click\", function(n) {\n\t\tn.stopPropagation()\n\t});\n\tvar d = a(\".offcanvas-navigation\"),\n\t\te = d.find(\".sub-menu\");\n\te.parent().prepend('<span class=\"menu-expand\"><i></i></span>');\n\te.slideUp();\n\td.on(\"click\", \"li a, li .menu-expand\", function(o) {\n\t\tvar n = a(this);\n\t\tif ((n.parent().attr(\"class\").match(/\\b(menu-item-has-children|has-children|has-sub-menu)\\b/)) && (n.attr(\"href\") === \"#\" || n.hasClass(\"menu-expand\"))) {\n\t\t\to.preventDefault();\n\t\t\tif (n.siblings(\"ul:visible\").length) {\n\t\t\t\tn.parent(\"li\").removeClass(\"active\");\n\t\t\t\tn.siblings(\"ul\").slideUp()\n\t\t\t} else {\n\t\t\t\tn.parent(\"li\").addClass(\"active\");\n\t\t\t\tn.closest(\"li\").siblings(\"li\").removeClass(\"active\").find(\"li\").removeClass(\"active\");\n\t\t\t\tn.closest(\"li\").siblings(\"li\").find(\"ul:visible\").slideUp();\n\t\t\t\tn.siblings(\"ul\").slideDown()\n\t\t\t}\n\t\t}\n\t});\n\ta(document).ready(function() {\n\t\tvar n = new Swiper(\".most-popular-slider-active\", {\n\t\t\tslidesPerView: 3,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".popular-swiper-button-next\",\n\t\t\t\tprevEl: \".popular-swiper-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".swiper-pagination-t0\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t1499: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t991: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t767: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t575: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t0: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".hero-slider-three-active\", {\n\t\t\tslidesPerView: 1,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 0,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".slider-three-swiper-button-next\",\n\t\t\t\tprevEl: \".slider-three-swiper-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".hero-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".hero-slider-four-active\", {\n\t\t\tslidesPerView: 1,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 0,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".slider-four-button-next\",\n\t\t\t\tprevEl: \".slider-four-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".hero-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".trending-slider-active\", {\n\t\t\tslidesPerView: 1,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 0,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".trending-button-next\",\n\t\t\t\tprevEl: \".trending-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".trending-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".following-slider-active\", {\n\t\t\tslidesPerView: 1,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 0,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".following-button-next\",\n\t\t\t\tprevEl: \".following-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".following-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".trending-topic-slider-active\", {\n\t\t\tslidesPerView: 5,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 25,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".trending-topic-button-next\",\n\t\t\t\tprevEl: \".trending-topic-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".hero-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t1499: {\n\t\t\t\t\tslidesPerView: 5\n\t\t\t\t},\n\t\t\t\t991: {\n\t\t\t\t\tslidesPerView: 4\n\t\t\t\t},\n\t\t\t\t767: {\n\t\t\t\t\tslidesPerView: 4\n\t\t\t\t},\n\t\t\t\t575: {\n\t\t\t\t\tslidesPerView: 3,\n\t\t\t\t\tspaceBetween: 10\n\t\t\t\t},\n\t\t\t\t0: {\n\t\t\t\t\tslidesPerView: 2,\n\t\t\t\t\tspaceBetween: 10,\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".latest-post-slider-active\", {\n\t\t\tslidesPerView: 1,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 0,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".latest-post-button-next\",\n\t\t\t\tprevEl: \".latest-post-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".recent-reading-slider-active\", {\n\t\t\tslidesPerView: 3,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".recent-reading-button-next\",\n\t\t\t\tprevEl: \".recent-reading-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t1499: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t991: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t767: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t},\n\t\t\t\t575: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t},\n\t\t\t\t0: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".trusted-partners-slider-active\", {\n\t\t\tslidesPerView: 4,\n\t\t\tslidesPerGroup: 2,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".partners-swiper-button-next\",\n\t\t\t\tprevEl: \".partners-swiper-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".partners-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t1499: {\n\t\t\t\t\tslidesPerView: 4\n\t\t\t\t},\n\t\t\t\t991: {\n\t\t\t\t\tslidesPerView: 4\n\t\t\t\t},\n\t\t\t\t767: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t575: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t0: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".testimonial-slider-active\", {\n\t\t\tslidesPerView: 3,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".testimonial-button-next\",\n\t\t\t\tprevEl: \".testimonial-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".partners-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t1499: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t991: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t767: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t575: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t},\n\t\t\t\t0: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".trending-tody-slider-active\", {\n\t\t\tslidesPerView: 1,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".testimonial-button-next\",\n\t\t\t\tprevEl: \".testimonial-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".trending-tody-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".hero-six-slider-active\", {\n\t\t\tslidesPerView: 1,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".slider-six-button-next\",\n\t\t\t\tprevEl: \".slider-six-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".hero-six-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".trending-tody-slider-two-active\", {\n\t\t\tslidesPerView: 3,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".trending-tody-button-next\",\n\t\t\t\tprevEl: \".trending-tody-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".trending-tody-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t1499: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t991: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t767: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t575: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t},\n\t\t\t\t0: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".related-post-slider-active\", {\n\t\t\tslidesPerView: 2,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".related-post-button-next\",\n\t\t\t\tprevEl: \".related-post-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".related-post-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t1499: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t991: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t767: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t575: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t},\n\t\t\t\t0: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar n = new Swiper(\".related-post-two-slider-active\", {\n\t\t\tslidesPerView: 3,\n\t\t\tslidesPerGroup: 1,\n\t\t\tcenteredSlides: false,\n\t\t\tloop: true,\n\t\t\tspeed: 1000,\n\t\t\tspaceBetween: 30,\n\t\t\tnavigation: {\n\t\t\t\tnextEl: \".related-post-button-next\",\n\t\t\t\tprevEl: \".related-post-button-prev\",\n\t\t\t},\n\t\t\tpagination: {\n\t\t\t\tel: \".related-post-swiper-pagination\",\n\t\t\t\ttype: \"bullets\",\n\t\t\t\tclickable: true\n\t\t\t},\n\t\t\tbreakpoints: {\n\t\t\t\t1499: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t991: {\n\t\t\t\t\tslidesPerView: 3\n\t\t\t\t},\n\t\t\t\t767: {\n\t\t\t\t\tslidesPerView: 2\n\t\t\t\t},\n\t\t\t\t575: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t},\n\t\t\t\t0: {\n\t\t\t\t\tslidesPerView: 1\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t});\n\ta(\".popup-images\").lightGallery();\n\ta(\".video-popup\").lightGallery();\n// \tAOS.init({\n// \t\toffset: 80,\n// \t\tduration: 1000,\n// \t\tonce: true,\n// \t\teasing: \"ease\",\n// \t});\nwow = new WOW({\n        animateClass: 'animated',\n        offset: 200\n       });\n       wow.init();\n\ta(\".projects-masonary-wrapper,.masonry-activation\").imagesLoaded(function() {\n\t\ta(\".messonry-button\").on(\"click\", \"button\", function() {\n\t\t\tvar o = a(this).attr(\"data-filter\");\n\t\t\ta(this).siblings(\".is-checked\").removeClass(\"is-checked\");\n\t\t\ta(this).addClass(\"is-checked\");\n\t\t\tn.isotope({\n\t\t\t\tfilter: o\n\t\t\t})\n\t\t});\n\t\tvar n = a(\".masonry-wrap\").masonry({\n\t\t\titemSelector: \".masonary-item\",\n\t\t\tpercentPosition: true,\n\t\t\ttransitionDuration: \"0.7s\",\n\t\t\tcolumnWidth: \".masonary-sizer\"\n\t\t});\n\t\tvar n = a(\".mesonry-list\").isotope({\n\t\t\tpercentPosition: true,\n\t\t\ttransitionDuration: \"0.7s\",\n\t\t\tlayoutMode: \"masonry\",\n\t\t})\n\t})\n})(jQuery);"
  },
  {
    "path": "static/cms/style.html",
    "content": "    <link rel=\"icon\" href=\"/favicon.ico\" />\n\t<link rel=\"stylesheet\" href=\"{$tpl}static/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"{$tpl}static/css/gordita-fonts.css\" />\n    <link rel=\"stylesheet\" href=\"{$tpl}static/css/vendor.min.css\" />\n    <link rel=\"stylesheet\" href=\"{$tpl}static/css/plugins.min.css\" />\n    <link rel=\"stylesheet\" href=\"{$tpl}static/css/animate.min.css\" />\n    <!-- Main Style CSS -->\n    <link rel=\"stylesheet\" href=\"{$tpl}static/css/style.css?v=1\" />\n    <link rel=\"stylesheet\" href=\"{$common}/layui/css/layui.css\" />"
  },
  {
    "path": "static/cms/tags-details.html",
    "content": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"cn\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <title>搜索 “{$tagname}” -{$webconf['web_name']}</title>\n\t<meta name=\"keywords\" content=\"搜索 “{$tagname}”\" />\n\t<meta name=\"description\" content=\"搜索 “{$tagname}”\" />\n\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    {include=\"style\"}\n  </head>\n  <body>\n    {include=\"header\"}\n    <div id=\"main-wrapper\">\n      <div class=\"site-wrapper-reveal\">\n        <!-- Blog Details Wrapper Start -->\n        <div class=\"blog-details-wrapper section-space--ptb_80\">\n          <div class=\"container\">\n\t\t\t<div class=\"row\" style=\"margin-bottom: 20px;\">\n\t\t\t<h3>搜索 “{$tagname}” 结果如下：</h3>\n\t\t\t</div>\n            <div class=\"row row--17\">\n\t\t\t{if($lists)}\n\t\t\t{foreach $lists as $v}\n              <div class=\"col-lg-4 col-md-6 col-sm-6\">\n                <!-- Single Following Post Start -->\n                <div class=\"single-following-post wow fadeInUp\" >\n                  <a href=\"{$v['url']}\" class=\"following-post-thum\">\n                    <img src=\"{$v['litpic']}\"  />\n                  </a>\n                  <div class=\"following-post-content\">\n                    <div class=\"following-blog-post-top\">\n                      <div class=\"trending-blog-post-category\">\n                        <a href=\"{$classtypedata[$v['tid']]['url']}\" class=\"business\">{$classtypedata[$v['tid']]['classname']}</a>\n                      </div>\n                    </div>\n                    <h5 class=\"following-blog-post-title\">\n                      <a href=\"{$v['url']}\">{$v['title']}\n                      </a>\n                    </h5>\n                    <div class=\"following-blog-post-meta\">\n                      <div class=\"post-meta-left-side\">\n                        <span class=\"post-date\">\n                          <i class=\"icofont-ui-calendar\"></i>\n                          <a href=\"{$v['url']}\">{fun date('Y-m-d',$v['addtime'])}</a>\n                        </span>\n                        <span>热度 {$v['hits']}</span>\n                      </div>\n                      <div class=\"post-meta-right-side\">\n                        {if(checkCollect($v['tid'],$v['id']))}\n\t\t\t\t\t\t<a title=\"已收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\n                          ><img src=\"{$tpl}static/picture/collect.png\" alt=\"\"\n                        /></a>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<a title=\"点击收藏\" onclick=\"collect({$v['tid']},{$v['id']})\"\n                          ><img src=\"{$tpl}static/picture/small-bookmark.png\" alt=\"\"\n                        /></a>\n\t\t\t\t\t\t{/if}\n                        \n\t\t\t\t\t\t{if(checkLikes($v['tid'],$v['id']))}\n\t\t\t\t\t\t<a title=\"已点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\n                          ><img src=\"{$tpl}static/picture/zan.png\" alt=\"\"\n                        /></a>\n\t\t\t\t\t\t{else}\n\t\t\t\t\t\t<a title=\"点赞\" onclick=\"likes({$v['tid']},{$v['id']})\"\n                          ><img src=\"{$tpl}static/picture/heart.png\" alt=\"\"\n                        /></a>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{/if}\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <!-- Single Following Post End -->\n              </div>\n\t\t\t{/foreach}\n\t\t\t{else}\n\t\t\t<div class=\"row\">\n              <div class=\"col-lg-12\">\n                <div class=\"error-404-content text-center\">\n                  <div class=\"banner wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\n                    <img src=\"/static/cms/static/picture/error-404.png\" alt=\"\">\n                  </div>\n                  <div class=\"error-text wow fadeInUp animated\" style=\"visibility: visible; animation-name: fadeInUp;\">\n                    <h5>This Page is Not Found.</h5>\n                    <h2>很抱歉，没有找到你要的信息。</h2>\n\n                    \n                  </div>\n                </div>\n              </div>\n            </div>\n\t\t\t{/if}\n\t\t\t\n\t\t\t</div>\n          </div>\n        </div>\n       \n      </div>\n    </div>\n   \n    {include=\"footer\"}\n    {include=\"js\"}\n  </body>\n</html>\n"
  },
  {
    "path": "static/cms/user/article-add.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  <title>发布内容 - 个人中心</title>\n  {include=\"user/style\"}\n  <style>\n .user-form .form-control>input[type='button']:hover{color:#fff;background:#007bff;border:1px solid #007bff}.jzhide{display:none}.mu{position:fixed;width:100%;height:100%;background:#524e4e;padding:0;margin:0;top:0;opacity:40%;z-index:9999}.jizhitip.jzhide{text-align:center;background-color:#fff;border-radius:4px;width:300px;height:130px;margin:auto;position:fixed;top:0;left:0;right:0;bottom:0;z-index:9999}.jizhi_body{font-size:16px;line-height:22px;padding:25px}.jizhi_botton{margin-top:15px;    border-top: 1px solid #ccc;color: #3c61a5cc;\n    padding-top: 10px;cursor:pointer;}\n\t.layui-input-block{ margin-left:0px;}.tj{ cursor:pointer;}\n  </style>\n\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"/static/common/wangeditor/wangeditor.min.js\"></script>\n\t<link rel=\"stylesheet\" href=\"/static/common/wangeditor/wangeditor.css\">\n  \n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <form action=\"\" method=\"POST\" id=\"jizhiform\" class=\"user-form\">\n          <input name=\"ajax\" type=\"hidden\" value=\"1\">\n\t\t  {if($data)}\n          <input name=\"id\" type=\"hidden\" value=\"{$data['id']}\">\n\t\t  {/if}\n          <input name=\"isshow\" type=\"hidden\" value=\"{$data['isshow']}\">\n          <div class=\"form-control\">\n\t\t    {if(!$data)}\n            <label for=\"\">选择专栏：</label>\n            <select id=\"molds\"   name=\"molds\">\n\t\t\t{loop table=\"molds\" ishome=\"1\" isopen=\"1\" orderby=\"id asc\"  as=\"v\"}\n            <option value=\"{$v['biaoshi']}\" {if($molds==$v['biaoshi'])}selected{/if}>{$v['name']}</option>\n\t\t\t{/loop}\n            \n            </select>\n\t\t\t{else}\n\t\t\t<label for=\"\">所属专栏：</label>\n\t\t\t<span class=\"form-control\" >{$moldsdata['name']}</span>\n\t\t\t<input type=\"hidden\" name=\"molds\" id=\"molds\" value=\"{$molds}\" />\n            {/if}\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">选择分类：</label>\n            <select id=\"tid\" name=\"tid\">\n            \n            </select>\n          </div>\n          <span id=\"fields_ext\"></span>\n          <div class=\"form-control\">\n            <label for=\"submit\"></label>\n            <input type=\"button\" class=\"tj\" onclick=\"submitform()\" name=\"submit\" value=\"提交\">\n          </div>\n        </form>\n      </div>\n\t  \n\t  \n    </div>\n  </div>\n</div>\n<div class=\"mu jzhide\"></div>\n<div class=\"jizhitip jzhide\">\n<div class=\"jizhi_body\"></div>\n<div class=\"jizhi_botton\" onclick=\"closetip()\">确定</div>\n</div>\n{include=\"user/footer\"}\n<script type=\"text/javascript\">\n\nfunction get_fields(tid,id){\n    var id = arguments[1]?arguments[1]:0;\n    $.post(\"{fun U('common/get_fields')}\",{molds:$(\"#molds\").val(),tid:tid,id:id},function(res){\n      if(res.code==0){\n        //默认 res.tpl输出的是layui的模板HTML,可以审核元素查看res里面的内容\n        //$(\"#ext_fields\").html(res.tpl);\n        var html = '';\n        var len = res.fields_list.length;\n        if(len>0){\n          //根据对应的字段，进行HTML设计\n          for(var i=0;i<len;i++){\n            \n          }\n          \n        }\n        $(\"#fields_ext\").html(res.tpl);\n      }\n      \n    },'json');\n  }\n\nfunction getclass(molds){\n   $.post(\"{fun U('user/getclass')}\",{molds:molds},function(res){\n        if(res.code==0){\n          {if($data)}\n          var id = {$data['id']};\n          {else}\n          var id = 0;\n          {/if}\n          var tid = {$tid};\n          var html = '';\n          for(var i=0;i<res['data'].length;i++){\n\t\t    var classname = '';\n\t\t\tfor(var j=1;j<=res['data'][i]['level'];j++){\n\t\t\t\tclassname += '--';\n\t\t\t}\n\t\t\tclassname += res['data'][i]['classname'];\n            if(tid==res['data'][i]['id']){\n              html+='<option value=\"'+res['data'][i]['id']+'\" selected>'+classname+'</option>';\n            }else{\n              html+='<option value=\"'+res['data'][i]['id']+'\" >'+classname+'</option>';\n            }\n          }\n          $(\"#tid\").html(html);\n          \n          get_fields(tid,id)\n        }\n        \n      },'json');\n}  \n\nfunction submitform(){\n\t$.post(\"{fun U('user/release')}\", $('#jizhiform').serialize(),function(res){\n\t\tif(res.code==0){\n\t\t\tlayer.msg('提交成功！',{icon:6,time:2000},function(){\n\t\t\t\twindow.location.href=res.url;\n\t\t\t})\n\n\t\t}else{\n\t\t\tlayer.msg(res.msg,{icon:5,time:2000})\n\t\t\treturn false;\n\t\t}\n\t\t\n\t},'json');\n\n}\nfunction closetip(){\n\t$(\".mu\").hide();\n\t$(\".jizhitip\").fadeOut();\n}\n\n  $(document).ready(function(){\n     getclass($('#molds').val());\n     $(\"#molds\").change(function () {\n        var molds = $('#molds').val();\n        if(molds==''){\n          return false;\n        }\n        getclass(molds)\n     });\n     $(\"#tid\").change(function () {\n          {if($data)}\n          var id = {$data['id']};\n          {else}\n          var id = 0;\n          {/if}\n          var tid = $(\"#tid\").val();\n          get_fields(tid,id)\n     });\n  });\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/article.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的发布 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <!-- 右侧列表 -->\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n\t  <div class=\"common-tab\">\n        <h2>\n\t\t{loop  table=\"molds\" ishome=\"1\" isopen=\"1\" orderby=\"id asc\" as=\"v\"}\n\t\t<a href=\"{fun U('user/posts',['molds'=>$v['biaoshi']])}\" {if($molds==$v['biaoshi'])}class=\"active\"{/if}>{$v['name']}投稿</a>\n\t\t{/loop}\n\n\t\t</h2>\n      </div>\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/posts',['molds'=>$molds])}\" {if(!$type)}class=\"active\"{/if}>全部投稿</a><a href=\"{fun U('user/posts',['type'=>1,'molds'=>$molds])}\" {if($type==1)}class=\"active\"{/if}>已退回</a><a href=\"{fun U('user/posts',['type'=>2,'molds'=>$molds])}\" {if($type==2)}class=\"active\"{/if}>待审核</a><a href=\"{fun U('user/posts',['type'=>3,'molds'=>$molds])}\" {if($type==3)}class=\"active\"{/if}>已发布</a><a href=\"{fun U('user/release',['molds'=>$molds])}\" class=\"btn-info btn-release\">发布{$moldsname}</a></h2>\n      </div>\n      <div class=\"table release-table\">\n        <div class=\"table-scroll\">\n          <table>\n            <thead>\n              <tr>\n                <th>名称</th>\n                <th>分类</th>\n                <th>状态</th>\n                <th>时间</th>\n                <th>操作</th>\n              </tr>\n            </thead>\n            <tbody>\n            {foreach $lists as $v}\n              <tr>\n                <td><a href=\"{$v['url']}\" target=\"_blank\" class=\"title\">{$v['title']}</a></td>\n                <td><span class=\"btn-table btn-light\">{$v['classname']}</span></th>\n                <td>\n                {if($v['isshow']==1)}\n                <span class=\"btn-table btn-success\">已发布</span>\n                {else if($v['isshow']==2)}\n                <span class=\"btn-table btn-danger\">已退回</span>\n                {else}\n                <span class=\"btn-table btn-info\">待审核</span>\n                {/if}\n                </td>\n                <td>{$v['date']}</td>\n                <td>\n\t\t\t\t<a href=\"{$v['edit']}\" class=\"layui-btn layui-btn-sm\">编辑</a>\n\t\t\t\t<a href=\"{$v['view']}\" target=\"_blank\" class=\"layui-btn layui-btn-normal layui-btn-sm\">预览</a>\n\t\t\t\t<a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗？'))window.location.href='{$v['del']}'\" class=\"layui-btn layui-btn-danger layui-btn-sm\">删除</a></td>\n              </tr>\n            {/foreach}\n             \n            </tbody>\n          </table>\n        </div>\n        <div class=\"pagebar-common\">\n          {if($listpage['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/buy-list.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>购买记录 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/wallet')}\">我的钱包</a><a href=\"{fun U('user/buylist')}?type=1\" {if($type==1)}class=\"active\"{/if} >交易记录</a><a href=\"{fun U('user/buylist')}?type=2\" {if($type==2)}class=\"active\"{/if} >充值记录</a><a href=\"{fun U('user/buylist')}?type=3\" {if($type==3)}class=\"active\"{/if} >赠送记录</a></h2>\n      </div>\n      <style>\n      .rechage {\n        background: #fff;\n        border-radius: 5px;\n        margin-bottom: 10px;\n        overflow: hidden;\n        padding: 15px 10px;\n      }\n      .rechage-list li {\n        border-bottom: 1px solid #f9f9f9;\n        padding: 0 10px;\n        position: relative;\n      }\n      .rechage-list li:hover {\n        background: #f1f1f1;\n      }\n      .rechage-list li a {\n        display: flex;\n        justify-content: space-between;\n        width: 100%;\n        padding: 10px 0;\n      }\n      .rechage-list li a.btn {\n        position: absolute;\n        right: 10px;\n        bottom: 10px;\n        display: block;\n        width: 40px;\n        height: 24px;\n        line-height: 22px;\n        border-radius: 2px;\n        color: #fff;\n        font-size: 12px;\n        text-align: center;\n        background: #c82333;\n        padding: 0;\n        border: 1px solid #c82333;\n        display: none;\n      }\n      .rechage-list li:hover a.btn {\n        display: block;\n      }\n      .rechage-list i.iconjifen1 {\n        display: block;\n        width: 30px;\n        height: 30px;\n        text-align: center;\n        line-height: 30px;\n        border-radius: 50%;\n        color: #fff;\n        font-size: 20px;\n        background: #e85328;\n        margin-right: 10px;\n      }\n      .rechage-list i.iconzijin {\n        display: block;\n        width: 30px;\n        height: 30px;\n        text-align: center;\n        line-height: 30px;\n        border-radius: 50%;\n        color: #fff;\n        font-size: 20px;\n        background: #007bff;\n        margin-right: 10px;\n      }\n      .rechage-item {\n        display: flex;\n      }\n      .rechage-item p.title {\n        color: #242424;\n        font-size: 14px;\n        line-height: 20px;\n      }\n      .rechage-item p.type,\n      .rechage-item p.time {\n        color: #666;\n        font-size: 12px;\n        line-height: 20px;\n      }\n      .rechage-list li .money {\n        color: #000;\n      }\n      </style>\n      <div class=\"rechage\">\n        <ul class=\"rechage-list\">\n        {foreach $lists1 as $v}\n          <li>\n            <a href=\"{$v['details']}\" title=\"\">\n              <div class=\"rechage-item\">\n              {if($v['buytype']=='money')}\n                <div class=\"icon\">\n                  <i class=\"iconfont iconzijin\"></i>\n                </div>\n                <div class=\"p\">\n                  <p class=\"title\">余额</p>\n                  <p class=\"type\">{$v['msg']}</p>\n                  <p class=\"time\">{fun formatTime($v['addtime'],'Y-m-d H:i:s')}</p>\n                </div>\n              {else}\n                <div class=\"icon\">\n                  <i class=\"iconfont iconjifen1\"></i>\n                </div>\n                <div class=\"p\">\n                  <p class=\"title\">积分</p>\n                  <p class=\"type\">{$v['msg']}</p>\n                  <p class=\"time\">{fun formatTime($v['addtime'],'Y-m-d H:i:s')}</p>\n                </div>\n              {/if}\n              </div>\n              <div class=\"money\">\n               {if($v['type']!=2)}+{else}-{/if}{$v['amount']}\n              </div>\n            </a>\n            <a href=\"{$v['details']}\" class=\"btn\">查看</a>\n          </li>\n        {/foreach}\n          \n        </ul>\n        <div class=\"pagebar-common\">\n          {if($listpage1['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage1['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage1['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage1['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage1['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage1['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage1['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n      <div class=\"table release-table\">\n        <div class=\"table-scroll\">\n          <table>\n            <thead>\n              <tr>\n                <th>订单号</th>\n                <th>金额</th>\n                <th>状态</th>\n                <th>创建时间</th>\n                <th>操作</th>\n              </tr>\n            </thead>\n            <tbody>\n            {foreach $lists as $v}\n              <tr>\n                <td>{$v['orderno']}</td>\n                <td><span class=\"price\">{$v['price']}</span></th>\n                <td>{if($v['isshow']==1)}\n              <span class=\"fr btn-sm btn-info\">待支付</span>\n              {else if($v['isshow']==2)}\n              <span class=\"fr btn-sm btn-success\">交易成功</span>\n              {else if($v['isshow']==3)}\n              <span class=\"fr btn-sm btn-danger\">已超时</span>\n              {else if($v['isshow']==4)}\n              <span class=\"fr btn-sm btn-warning\">待发货</span>\n              {else if($v['isshow']==5)}\n              <span class=\"fr btn-sm btn-success\">已发货</span>\n              {else}\n              <span class=\"fr btn-sm btn-warning\">已废弃</span>\n              {/if}</td>\n                <td>{$v['date']}</td>\n                <td><a href=\"{$v['orderdetails']}\" class=\"btn-edit\">查看</a><a  href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗？'))window.location.href='{$v['orderdel']}'\" class=\"btn-delete\">删除</a></td>\n              </tr>\n            {/foreach}\n            \n            </tbody>\n          </table>\n        </div>\n        <div class=\"pagebar-common\">\n          {if($listpage['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/buy-view.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>购买 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/wallet')}\">我的钱包</a><a href=\"{fun U('user/buylist',['type'=>1])}\" >交易记录</a><a href=\"{fun U('user/buylist',['type'=>2])}\"  >充值记录</a><a href=\"{fun U('user/buylist',['type'=>3])}\"  >赠送记录</a></h2>\n      </div>\n      <style>\n      .rechage-view {\n        background: #fff;\n        padding: 15px;\n        border-radius: 5px;\n      }\n      .rechage-view h4 {\n        color: #242424;\n        font-size: 20px;\n        line-height: 30px;\n        text-align: center;\n      }\n      .rechage-view p.tips {\n        color: #808080;\n        font-size: 14px;\n        line-height: 30px;\n        text-align: center;\n      }\n      .rechage-view p {\n        color: #808080;\n        font-size: 12px;\n        line-height: 20px;\n        margin-bottom: 5px;\n      }\n      .rechage-view p span.fr {\n        color: #666;\n      }\n      </style>\n      <div class=\"rechage-view\">\n        <h4>{if($data['type']!=2)}+{else}-{/if}{$data['amount']}</h4>\n        <p class=\"tips\">交易成功</p>\n        <p><span>充值方式</span><span class=\"fr\">{$data['msg']}</span></p>\n        <p><span>创建时间</span><span class=\"fr\">{fun date('Y-m-d H:i:s',$data['addtime'])}</span></p>\n        <p><span>订单号</span><span class=\"fr\">{$data['orderno']}</span></p>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/buy.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>钱包与积分 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <h2>钱包与积分</h2>\n        <form action=\"\" method=\"POST\" onsubmit=\"return checkform()\" id=\"myupload\" class=\"user-form\">\n          <input name=\"allmoney\" id=\"allmoney\" type=\"hidden\" value=\"0\" />\n          <input name=\"paytype\" id=\"paytype\" type=\"hidden\" value=\"1\" />\n          <div class=\"form-control\">\n            <label for=\"\">交易类型：</label>\n            <select id=\"buytarget\" onchange=\"count_money()\" name=\"buytarget\" >\n            <option value=\"1\">钱包（兑换率:人民币 : 金币 = 1 : {$webconf['money_exchange']}）</option>\n            <option value=\"2\">积分（兑换率:人民币 : 积分 = 1 : {$webconf['jifen_exchange']}）</option>\n            </select>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">购买数量：</label>\n            <input type=\"number\" value=\"0\" name=\"money\" onchange=\"count_money()\" id=\"money\" placeholder=\"请输入购买数量\">\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">支付金额：</label>\n            <label id=\"paymoney\" for=\"\" style=\"color:#f00;font-weight: 600;\">0</label>\n            <label for=\"\">元</label>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"submit\">支付方式：</label>\n            {if($webconf['isopenzfb'])}\n            <a class=\"zfbpay\" href=\"javascript:;\" onclick=\"choosepay('zfb')\" style=\"filter: grayscale(0%);\"><img style=\"width:100px;\" src=\"{$common}user/images/zfb.png\"></a>\n            {/if}\n            {if($webconf['isopenweixin'])}\n            <a class=\"wxpay\" href=\"javascript:;\" onclick=\"choosepay('wx')\" style=\"filter: grayscale(100%);\"><img style=\"width:100px;\" src=\"{$common}user/images/wx.png\"></a>\n            {/if}\n          </div>\n          <div class=\"form-control\">\n            <label for=\"submit\"></label>\n            <input type=\"submit\" name=\"submit\" value=\"提交\">\n          </div>\n        </form>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n<script type=\"text/javascript\">\nfunction choosepay(pt){\n    if(pt=='zfb'){\n        $(\".zfbpay\").attr('style',\"filter: grayscale(0%);\");\n        $(\".wxpay\").attr('style',\"filter: grayscale(100%);\");\n        $(\"#paytype\").val(1);\n    }else{\n        $(\"#paytype\").val(2);\n        $(\".zfbpay\").attr('style',\"filter: grayscale(100%);\");\n        $(\".wxpay\").attr('style',\"filter: grayscale(0%);\");\n    }\n}\n  var floatObj = function () {\n  /*\n   * 判断obj是否为一个整数\n   */\n  function isInteger(obj) {\n      return Math.floor(obj) === obj\n  }\n\n  /*\n   * 将一个浮点数转成整数，返回整数和倍数。如 3.14 >> 314，倍数是 100\n   * @param floatNum {number} 小数\n   * @return {object}\n   *   {times:100, num: 314}\n   */\n  function toInteger(floatNum) {\n      var ret = {times: 1, num: 0};\n      if (isInteger(floatNum)) {\n          ret.num = floatNum;\n          return ret\n      }\n      var strfi = floatNum + '';\n      var dotPos = strfi.indexOf('.');\n      var len = strfi.substr(dotPos + 1).length;\n      var times = Math.pow(10, len);\n      var intNum = parseInt(floatNum * times + 0.5, 10);\n      ret.times = times;\n      ret.num = intNum;\n      return ret\n  }\n\n/*\n   * 核心方法，实现加减乘除运算，确保不丢失精度\n   * 思路：把小数放大为整数（乘），进行算术运算，再缩小为小数（除）\n   *\n   * @param a {number} 运算数1\n   * @param b {number} 运算数2\n   * @param op {string} 运算类型，有加减乘除（add/subtract/multiply/divide）\n   *\n   */\n  function operation(a, b, op) {\n      var o1 = toInteger(a);\n      var o2 = toInteger(b);\n      var n1 = o1.num;\n      var n2 = o2.num;\n      var t1 = o1.times;\n      var t2 = o2.times;\n      var max = t1 > t2 ? t1 : t2;\n      var result = null;\n      switch (op) {\n          case 'add':\n              if (t1 === t2) { // 两个小数位数相同\n                  result = n1 + n2\n              } else if (t1 > t2) { // o1 小数位 大于 o2\n                  result = n1 + n2 * (t1 / t2)\n              } else { // o1 小数位 小于 o2\n                  result = n1 * (t2 / t1) + n2\n              }\n              return result / max;\n          case 'subtract':\n              if (t1 === t2) {\n                  result = n1 - n2\n              } else if (t1 > t2) {\n                  result = n1 - n2 * (t1 / t2)\n              } else {\n                  result = n1 * (t2 / t1) - n2\n              }\n              return result / max;\n          case 'multiply':\n              result = (n1 * n2) / (t1 * t2);\n              return result;\n          case 'divide':\n              result = (n1 / n2) * (t2 / t1);\n              return result\n      }\n  }\n\n  // 加减乘除的四个接口\n  function add(a, b) {\n      return operation(a, b, 'add')\n  }\n\n  function subtract(a, b) {\n      return operation(a, b, 'subtract')\n  }\n\n  function multiply(a, b) {\n      return operation(a, b, 'multiply')\n  }\n\n  function divide(a, b) {\n      return operation(a, b, 'divide')\n  }\n\n  // exports\n  return {\n      add: add,\n      subtract: subtract,\n      multiply: multiply,\n      divide: divide\n  }\n}();\nfunction checkform(){\n    if(parseFloat($(\"#allmoney\").val())<=0){\n        alert('输入数量错误！');return false;\n    }\n    $.post(\"{fun U('user/buy')}\",{allmoney:$(\"#allmoney\").val(),paytype:$(\"#paytype\").val(),number:$(\"#money\").val(),buytarget:$(\"#buytarget\").val()},function(res){\n      console.log(res);\n      if(res.code==0){\n          var url = \"{fun U('order/pay')}?go=1&orderno=\"+res['data'].orderno+\"&paytype=\"+res['data'].paytype;\n          window.location.href = url;\n      }else{\n        alert(res.msg);\n      }\n\n    },'json');\n\n    return false;\n\n}\nfunction count_money(){\n    var money_exchange = 1/parseFloat({$webconf['money_exchange']});\n    var jifen_exchange = 1/parseFloat({$webconf['jifen_exchange']});\n    if(parseInt($(\"#buytarget\").val())==1){\n        var b = money_exchange;\n    }else{\n        var b = jifen_exchange;\n    }\n    var a = parseInt($(\"#money\").val());\n    if(a<0){\n      alert('输入数量错误！');$(\"#paymoney\").html(0);return false;\n    }\n    if(a==0){\n      $(\"#paymoney\").html(0);return false;\n    }\n    var m = floatObj.multiply(a,b);\n    $(\"#allmoney\").val(m);\n    $(\"#paymoney\").html(m);\n}\n\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/cart.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的购物车 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"\" class=\"active\">我的购物车</a></h2>\n      </div>\n      <div class=\"order-details\">\n        <h4 class=\"head-title\">购物车</h4>\n        {if($carts)}\n        <div class=\"display-flex-order\">\n          <div class=\"order-left\">\n            <ul class=\"order-list\">\n            {foreach $carts as $v}\n            {if($v['info'])}\n              <li class=\"product product-{$v['tid']}-{$v['info']['id']}\">\n                <div class=\"order-item\">\n                  <div class=\"img-box\">\n                    <a href=\"{fun gourl($v['info']['id'],$v['info']['htmlurl'])}\"><img src=\"{$v['info']['litpic']}\" ></a>\n                  </div>\n                  <div class=\"order-title\">\n                    <a href=\"{fun gourl($v['info']['id'],$v['info']['htmlurl'])}\" target=\"_blank\">{$v['info']['title']}</a>\n                    \n                  </div>\n                </div>\n                <div class=\"order-item-right\">\n                  <div class=\"order-number\">\n                    <p>数量</p>\n                    <p><input type=\"number\" class=\"quantity-input\" data-id=\"{$v['id']}\" data-tid=\"{$v['tid']}\" value=\"{$v['num']}\"></p>\n                  </div>\n                  <input id=\"price_per_{$v['tid']}_{$v['info']['id']}\" value=\"{$v['info']['price']}\" type=\"hidden\" />\n                  <div class=\"order-money\">\n                    <p>单价</p>\n                    <p class=\"price\">￥{$v['info']['price']}</p>\n                  </div>\n                </div>\n\t\t\t\t<div class=\"col-sm-12 col-md-1\">\n\t\t\t\t\t<button class=\"btn btn-danger\" onclick=\"delcart({$v['tid']},{$v['info']['id']})\" type=\"button\">删除</button>\n\t\t\t\t</div>\n              </li>\n            {else}\n              <li>\n                <div class=\"order-item\">\n                  <div class=\"img-box\">\n                    <a >[ 无 ]</a>\n                  </div>\n                  <div class=\"order-title\">\n                    <h4><a >[{$v['id']}][ 商品已被删除 ]</a></h4>\n                   \n                  </div>\n                </div>\n                <div class=\"order-item-right\">\n                  <div class=\"order-number\">\n                    <p>数量</p>\n                    <p><input type=\"number\" class=\"quantity-input\" data-id=\"{$v['info']['id']}\" data-tid=\"{$v['tid']}\" value=\"{$v['num']}\"></p>\n                  </div>\n                  \n                  <div class=\"order-money\">\n                    <p>单价</p>\n                    <p class=\"price\">￥{$v['price']}</p>\n                  </div>\n                </div>\n              </li>\n            {/if}\n            {/foreach}\n             \n            </ul>\n          </div>\n          <div class=\"order-right\">\n            <div class=\"summary\">\n            <form action=\"{fun U('order/create')}\" method=\"POST\">\n            <input name=\"go\" value=\"1\" type=\"hidden\" />\n              <h3>总计</h3>\n              <h4><span>总金额</span><span class=\"price fr\" id=\"allmoney\">0.00</span></h4>\n              <h4><span>折扣</span><span class=\"price fr\" id=\"alldiscount\">0.00</span></h4>\n              <h4><span>邮费</span><span class=\"price fr\" id=\"yunfei\">0.00</span></h4>\n              <h4><span>总计</span><span class=\"price fr\" id=\"summary\">0.00</span></h4>\n              <button class=\"\" type=\"submit\">立即支付</button>\n            </form>\n            </div>\n          </div>\n        </div>\n        {else}\n        暂无商品~\n        {/if}\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n<script>\n  \n\n    var floatObj = function () {\n \n        /*\n         * 判断obj是否为一个整数\n         */\n        function isInteger(obj) {\n            return Math.floor(obj) === obj\n        }\n \n        /*\n         * 将一个浮点数转成整数，返回整数和倍数。如 3.14 >> 314，倍数是 100\n         * @param floatNum {number} 小数\n         * @return {object}\n         *   {times:100, num: 314}\n         */\n        function toInteger(floatNum) {\n            var ret = {times: 1, num: 0};\n            if (isInteger(floatNum)) {\n                ret.num = floatNum;\n                return ret\n            }\n            var strfi = floatNum + '';\n            var dotPos = strfi.indexOf('.');\n            var len = strfi.substr(dotPos + 1).length;\n            var times = Math.pow(10, len);\n            var intNum = parseInt(floatNum * times + 0.5, 10);\n            ret.times = times;\n            ret.num = intNum;\n            return ret\n        }\n \n    /*\n         * 核心方法，实现加减乘除运算，确保不丢失精度\n         * 思路：把小数放大为整数（乘），进行算术运算，再缩小为小数（除）\n         *\n         * @param a {number} 运算数1\n         * @param b {number} 运算数2\n         * @param op {string} 运算类型，有加减乘除（add/subtract/multiply/divide）\n         *\n         */\n        function operation(a, b, op) {\n            var o1 = toInteger(a);\n            var o2 = toInteger(b);\n            var n1 = o1.num;\n            var n2 = o2.num;\n            var t1 = o1.times;\n            var t2 = o2.times;\n            var max = t1 > t2 ? t1 : t2;\n            var result = null;\n            switch (op) {\n                case 'add':\n                    if (t1 === t2) { // 两个小数位数相同\n                        result = n1 + n2\n                    } else if (t1 > t2) { // o1 小数位 大于 o2\n                        result = n1 + n2 * (t1 / t2)\n                    } else { // o1 小数位 小于 o2\n                        result = n1 * (t2 / t1) + n2\n                    }\n                    return result / max;\n                case 'subtract':\n                    if (t1 === t2) {\n                        result = n1 - n2\n                    } else if (t1 > t2) {\n                        result = n1 - n2 * (t1 / t2)\n                    } else {\n                        result = n1 * (t2 / t1) - n2\n                    }\n                    return result / max;\n                case 'multiply':\n                    result = (n1 * n2) / (t1 * t2);\n                    return result;\n                case 'divide':\n                    result = (n1 / n2) * (t2 / t1);\n                    return result\n            }\n        }\n \n        // 加减乘除的四个接口\n        function add(a, b) {\n            return operation(a, b, 'add')\n        }\n \n        function subtract(a, b) {\n            return operation(a, b, 'subtract')\n        }\n \n        function multiply(a, b) {\n            return operation(a, b, 'multiply')\n        }\n \n        function divide(a, b) {\n            return operation(a, b, 'divide')\n        }\n \n        // exports\n        return {\n            add: add,\n            subtract: subtract,\n            multiply: multiply,\n            divide: divide\n        }\n    }();\n  \n  //删除商品\n  function delcart(tid,id){\n    \n    $.ajax({\n       url:\"{fun U('user/delcart')}\",//请求的url地址\n       dataType:\"json\",//返回格式为json\n       async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n       data:{tid:tid,id:id,ajax:1},//参数值\n       type:\"POST\",//请求方式\n       beforeSend:function(){\n        //请求前的处理\n        },\n         success:function(r){\n          if(r.code==0){\n            //window.location.href=r.url;\n            $(\".product-\"+tid+\"-\"+id).remove();\n            total();\n          }else{\n            alert(r.msg);\n          }\n            \n        },\n         complete:function(){\n        //请求完成的处理\n        },\n         error:function(){\n        //请求出错处理\n          alert('网络错误');\n        }\n\n          \n      \n    })\n    \n  }\n  //更改商品数量\n   $(document).on(\"change\",\".quantity-input\",function () {\n    //console.log($(this).val());\n    var num = $(this).val();\n    if(num==0){\n      alert('购买数量不能等于0');\n      $(this).val(1);\n      return false;\n    }\n    \n    var tid = $(this).attr('data-tid');\n    var id = $(this).attr('data-id');\n    var price = parseFloat($(\"#price_per_\"+tid+\"_\"+id).val());\n    var money = floatObj.multiply(num,price);\n    $(\".price_\"+tid+\"_\"+id).html('￥'+money);\n    $.ajax({\n       url:\"{fun U('user/addcart')}\",//请求的url地址\n       dataType:\"json\",//返回格式为json\n       async:true,//请求是否异步，默认为异步，这也是ajax重要特性\n       data:{tid:tid,id:id,num:num,ajax:1},//参数值\n       type:\"POST\",//请求方式\n       beforeSend:function(){\n        //请求前的处理\n        },\n         success:function(r){\n          if(r.code==0){\n            //window.location.href=r.url;\n            total();\n          }else{\n            alert(r.msg);\n            window.location.reload();\n          }\n            \n        },\n         complete:function(){\n        //请求完成的处理\n        },\n         error:function(){\n        //请求出错处理\n          alert('网络错误');\n        }\n\n          \n      \n    })\n    \n   });\n   \n   //统计商品金额及折扣\n  var discount_type= {$member_group['discount_type']};//折扣类型\n  var discount = parseFloat({$member_group['discount']});//折扣价\n  var yunfei = {$webconf['yunfei']};//自由设定\n  function total(){\n    var num=0,id=0,tid=0,price=0.00,money=0.00;\n    var allmoney = 0.00;\n    var alldiscount = 0.00;\n    var summary = 0.00;\n    $(\".quantity-input\").each(function(){\n       num = $(this).val();\n       id = $(this).attr('data-id');\n       tid = $(this).attr('data-tid');\n       price =  parseFloat($(\"#price_per_\"+tid+\"_\"+id).val());\n       money = floatObj.multiply(num,price);\n       allmoney = floatObj.add(allmoney,money);\n       if(allmoney<0){\n        allmoney = 0;\n       }\n    });\n    if(discount_type==1){\n      //现金折扣\n     // alldiscount = floatObj.subtract(allmoney,discount);\n\t alldiscount = discount;\n    }else if(discount_type==2){\n      //百分比折扣\n\t  discount = (1-discount).toFixed(2);\n      alldiscount = floatObj.multiply(allmoney,discount);\n    }\n    var summary1 = floatObj.subtract(allmoney,alldiscount);//减去折扣\n    summary = floatObj.add(summary1,yunfei);//加上运费\n    //赋值统计\n    $(\"#allmoney\").html('￥'+allmoney);\n    $(\"#alldiscount\").html('￥'+alldiscount);\n    $(\"#yunfei\").html('￥'+yunfei);\n    $(\"#summary\").html('￥'+summary);\n  \n  }\n  $(function(){\n    total();\n  });\n  \n  </script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/collect.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的收藏-个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/collect')}\" {if(APP_ACTION=='collect')}class=\"active\"{/if}>收藏</a><a href=\"{fun U('user/likes')}\" {if(APP_ACTION=='likes')}class=\"active\"{/if}>点赞</a><a href=\"{fun U('user/comment')}\" {if(APP_ACTION=='comment')}class=\"active\"{/if}>评论</a></h2>\n      </div>\n\n        <div class=\"table release-table\">\n        <div class=\"table-scroll\">\n          <table>\n            <thead>\n              <tr>\n                <th>ID</th>\n                <th>名称</th>\n                <th>分类</th>\n                <th>作者</th>\n                <th>操作</th>\n              </tr>\n            </thead>\n            <tbody>\n             {if($lists)}\n              {foreach $lists as $v}\n              <tr>\n                <td>{$v['id']}</td>\n                <td><a href=\"{$v['url']}\" target=\"_blank\" class=\"title\">{$v['details']['title']}</a></td>\n                <td><span class=\"btn-table btn-light\">{$v['classname']}</span></th>\n                <td><a {if($v['member_id']!=0)}href=\"{fun U('user/active',['uid'=>$v['member_id']])}\"{/if} target=\"_blank\" class=\"title\">{if($v['member_id']!=0)}{fun memberInfo($v['member_id'],'username')}{else}[官方]{/if}</a></td>\n                <td><a href=\"{$v['url']}\" target=\"_blank\" class=\"btn-edit\">查看</a><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗?'))window.location.href='{$v['del']}'\" class=\"btn-delete\">删除</a></td>\n              </tr>\n              {/foreach}\n               {else}\n              <p style=\"text-align: center;width: 100%;display: block;height: 50px;line-height: 50px;\"> 暂无收藏~ </p>\n              {/if}\n             \n            </tbody>\n          </table>\n        </div>\n        <div class=\"pagebar-common\">\n          {if($listpage['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n    \n\n      \n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/comment.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的评论-个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/collect')}\" {if(APP_ACTION=='collect')}class=\"active\"{/if}>收藏</a><a href=\"{fun U('user/likes')}\" {if(APP_ACTION=='likes')}class=\"active\"{/if}>点赞</a><a href=\"{fun U('user/comment')}\" {if(APP_ACTION=='comment')}class=\"active\"{/if}>评论</a></h2>\n      </div>\n      <div class=\"table release-table\">\n        <ul class=\"shop-record-list\">\n        {if($lists)}\n        {foreach $lists as $v}\n          <li>\n            <div class=\"record-item\">\n            <p><span>时间：{$v['date']}{if($v['isshow']==0)}【待审核】{/if}</span></p>\n              <p><span>您回复了： <a href=\"{$v['url']}\">{fun newstr(htmldecode($v['body']),30)}</a></span></p>\n              <h4><span class=\"text-info\">【{$classtypedata[$v['tid']]['classname']}】</span><span class=\"fr\"><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗?'))window.location.href='{$v['del']}'\" class=\"change\" title=\"删除\">删除</a><a href=\"{$v['url']}\" class=\"btn-more\" title=\"查看详情\">查看详情</a></span></h4>\n            </div>\n          </li>\n        {/foreach}\n         {else}\n        <p style=\"text-align: center;width: 100%;display: block;height: 50px;line-height: 50px;\"> 暂无评论~ </p>\n        {/if}\n        </ul>\n        <div class=\"pagebar-common\">\n          {if($listpage['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n\n\n      \n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/fans.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的粉丝 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n   {include=\"user/left_nav\"}\n    <!-- 右侧内容 -->\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/follow')}\" >我的关注</a><a href=\"{fun U('user/fans')}\" class=\"active\">我的粉丝</a></h2>\n      </div>\n      <ul class=\"follow-list1\">\n      {if($lists)}\n      {foreach $lists as $v}\n        <li>\n          <div class=\"follow-list-item\">\n           {if(isfollow($member['id'],$v['id']))}<div class=\"each-other\"><i class=\"iconfont iconhuxiangguanzhu3\" title=\"互相关注\"></i></div>{/if}\n            <div class=\"img-box\"><img src=\"{if($v['litpic'])}{$v['litpic']}{else}{$common}user/images/login1.png{/if}\" alt=\"\"></div>\n            <h4>{$v['username']}</h4>\n            <p>{if($v['signature'])}{$v['signature']}{else}他很懒，什么都没有留下~{/if}</p>\n\t\t\t{if(isfollow($member['id'],$v['id']))}\n            <a href=\"{fun U('user/follow',['uid'=>$v['id']])}\" title=\"取消关注\">取消关注</a>\n\t\t\t{else}\n\t\t\t<a href=\"{fun U('user/follow',['uid'=>$v['id']])}\" title=\"关注\">关注</a>\n\t\t\t{/if}\n          </div>\n        </li>\n      {/foreach}\n      {else}\n       <p style=\"text-align: center;width: 100%;display: block;height: 50px;line-height: 50px;\"> 暂无粉丝~ </p>\n      {/if}\n       \n      </ul>\n      <div class=\"pagebar-common\">\n      {if($listpage['list'])}\n      <ul class=\"pagination\">\n      <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n      <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n      {foreach $listpage['list'] as $ss}\n      <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n      {/foreach}\n\n      <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n      </ul>\n      {/if}\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/follow.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的关注 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n   {include=\"user/left_nav\"}\n    <!-- 右侧内容 -->\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/follow')}\" class=\"active\">我的关注</a><a href=\"{fun U('user/fans')}\">我的粉丝</a></h2>\n      </div>\n      <ul class=\"follow-list1\">\n      {if($lists)}\n      {foreach $lists as $v}\n        <li>\n          <div class=\"follow-list-item\">\n            {if(isfollow($v['id'],$member['id']))}<div class=\"each-other\"><i class=\"iconfont iconhuxiangguanzhu3\" title=\"互相关注\"></i></div>{/if}\n            <div class=\"img-box\"><img src=\"{if($v['litpic'])}{$v['litpic']}{else}{$common}user/images/login1.png{/if}\" alt=\"{$v['username']}\"></div>\n            <h4>{$v['username']}</h4>\n            <p>{if($v['signature'])}{$v['signature']}{else}他很懒，什么都没有留下~{/if}</p>\n            <a href=\"{fun U('user/nofollow',['uid'=>$v['id']])}\" title=\"取消关注\">取消关注</a>\n          </div>\n        </li>\n      {/foreach}\n      {else}\n     <p style=\"text-align: center;width: 100%;display: block;height: 50px;line-height: 50px;\"> 暂无关注~ </p>\n      {/if}\n       \n      </ul>\n      <div class=\"pagebar-common\">\n      {if($listpage['list'])}\n      <ul class=\"pagination\">\n      <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n      <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n      {foreach $listpage['list'] as $ss}\n      <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n      {/foreach}\n\n      <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n      </ul>\n      {/if}\n      </div>\n    \n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/footer.html",
    "content": "<footer>\n  <div class=\"copyright\">\n    <p><span>Copyright &copy; 2019-2099</span><span><a href=\"https://beian.miit.gov.cn/\" target=\"_blank\" >{$webconf['web_beian']}</a></span><span>Power by {$webconf['web_name']}</span></p>\n  </div>\n</footer>\n<script src=\"{$common}user/js/user.js\"></script>"
  },
  {
    "path": "static/cms/user/forget.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>个人中心-未登录</title>\n</head>\n<body>\n\n<header>\n  <div class=\"container\">\n    <div class=\"brand\">\n      <a href=\"{$webconf['domain']}/\" class=\"logo\"><i class=\"iconfont iconhome\"></i> 返回网站</a>\n    </div>\n    <div class=\"user-center\">\n      <ul class=\"unlogin\">\n        <li><a href=\"{fun U('login/index')}\" title=\"登录\">登录</a></li>\n        <li><a href=\"{fun U('login/register')}\" title=\"注册\">注册</a></li>\n      </ul>\n      <ul class=\"user-login\" style=\"display: none;\">\n        <li class=\"user-message\"><a href=\"#\" title=\"消息\"><i class=\"iconfont iconxinxi\"></i> <span>2</span></a></li>\n        <li class=\"user-icon\">\n          <a href=\"{fun U('login/index')}\" title=\"我的\"><img src=\"images/login.png\" alt=\"\"></a>\n          <ul class=\"user-menu\">\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的关注\">我的关注</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的钱包\">我的钱包</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的订单\">我的订单</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"退出登录\">退出登录</a></li>\n          </ul>\n        </li>\n      </ul>\n    </div>\n  </div>\n</header>\n\n<div class=\"no-login-page page\">\n  <div class=\"container clearfix\">\n    <div class=\"user-left hidden-sm\">\n      <div class=\"user-card\">\n        <div class=\"img-box\">\n          <a href=\"{fun U('login/index')}\" title=\"去登录\"><img src=\"{$common}user/images/no-login.png\" alt=\"\"></a>\n        </div>\n        <div class=\"username-info\">\n          <a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a>\n        </div>\n        <div class=\"autograph-info\">\n          个性签名\n        </div>\n        <div class=\"btn-area\">\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-release\">发布文章</a><br>\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-sign-out\">退出登录</a>\n        </div>\n      </div>\n      <ul class=\"user-list\">\n        <li><a href=\"{fun U('login/index')}\" title=\"我的关注\" class=\"bt1\">我的关注</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的钱包\" class=\"bt1\">我的钱包</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"订单管理\">订单管理</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"资料与账号\" class=\"bt1\">资料与账号</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\n        <li><a href=\"{$webconf['domain']}/\" title=\"返回主页\" class=\"bt1\">返回主页</a></li>\n      </ul>\n    </div>\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <h2>忘记密码</h2>\n        <form method=\"POST\" onsubmit=\"return checklogin()\" class=\"user-form\">\n        <div class=\"form-control\">\n        <label for=\"email\">绑定邮箱</label>\n        <input class=\"form-control item\" type=\"email\" name=\"email\" id=\"email\">\n        </div>\n        <div class=\"form-control\">\n        <label for=\"yzm\">验证码</label>\n        <input placeholder=\"请输入图形验证码\" style=\"\" type=\"text\" name=\"vercode\" id=\"vercode\"><img style=\"width:150px;\" src=\"{fun U('Common/vercode',['code_name'=>'forget_code'])}\" onclick=\"this.src=this.src+'?'+Math.random()\">   \n        </div>\n        <div class=\"form-control\">\n         <label for=\"submit\"></label>\n            <input type=\"submit\" name=\"submit\" value=\"确定\">\n        </div>\n        </form>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n<script>\n\n\n\nfunction checklogin(){\n  if($.trim($(\"#email\").val())==''){\n    alert('邮箱不能为空~');\n    return false;\n  }\n  if($.trim($(\"#vercode\").val())==''){\n    alert('图形验证码不能为空~');\n    return false;\n  }\n  \n  return true;\n\n}\n\n\n\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <div class=\"user-tab\">\n          <div class=\"num\">\n            <a href=\"{fun U('user/posts',['molds'=>'article'])}\" title=\"\">\n              <h4>{$article_num}</h4>\n              <p>投稿</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/posts',['molds'=>'product'])}\" title=\"\">\n              <h4>{$product_num}</h4>\n              <p>商品</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/follow')}\" title=\"\">\n              <h4>{fun jz_follow($member['id'])}</h4>\n              <p>关注</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/fans')}\" title=\"\">\n              <h4>{fun jz_fans($member['id'])}</h4>\n              <p>粉丝</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/collect')}\" title=\"\">\n              <h4>{$collect_num}</h4>\n              <p>收藏</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/comment')}\" title=\"\">\n              <h4>{$comment_num}</h4>\n              <p>评论</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/likes')}\" title=\"\">\n              <h4>{$likes_num}</h4>\n              <p>点赞</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/orders')}\" title=\"\">\n              <h4>{$order_num}</h4>\n              <p>订单</p>\n            </a>\n          </div>\n        </div>\n      </div>\n      <div class=\"user-data\">\n        <h2>个人中心</h2>\n        <p><span>用户名：</span><span>{$member['username']}</span></p>\n        <p><span>个性签名：</span><span>{if($member['signature'])}{$member['signature']}{else}他很懒，什么都没有留下~{/if}</span></p>\n        <p><span>手机号码：</span><span>{$member['tel']}</span></p>\n        <p><span>电子邮箱：</span><span>{$member['email']}</span></p>\n        <p><span>生日：</span><span>{if($member['birthday'])}{$member['birthday']}{else}-{/if}</span></p>\n        <p><span>性别：</span><span>{if($member['sex']==1)}男{else if($member['sex']==2)}女{else}未知{/if}</span></p>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/left_nav.html",
    "content": "<div class=\"user-left hidden-sm\">\n      <div class=\"user-card\">\n        <div class=\"img-box\">\n          <a href=\"{fun U('user/userinfo')}\" title=\"{$member['username']}\"><img src=\"{if(!$member['litpic'])}{$common}user/images/login.png{else}{$member['litpic']}{/if}\" alt=\"{$member['username']}\"></a>\n        </div>\n        <div class=\"username-info\">\n          <a href=\"{fun U('user/userinfo')}\" title=\"{$member['username']}\">{$member['username']}</a>\n        </div>\n        <div class=\"autograph-info\">\n          {if($member['signature'])}{$member['signature']}{else}他很懒，什么都没有留下~{/if}\n        </div>\n        <div class=\"btn-area\">\n          <a href=\"{fun U('user/release')}\" class=\"btn-default btn-release\">发布文章</a><br>\n          <a href=\"{fun U('login/loginout')}\" class=\"btn-default btn-sign-out\">退出登录</a>\n        </div>\n      </div>\n      <ul class=\"user-list\">\n        <li {if(APP_ACTION=='follow')}class=\"active\"{/if}><a href=\"{fun U('user/follow')}\" title=\"我的关注\" class=\"bt1\">我的关注</a></li>\n        <li {if(APP_ACTION=='fans')}class=\"active\"{/if}><a href=\"{fun U('user/fans')}\" title=\"我的粉丝\">我的粉丝</a></li>\n        <li {if(APP_ACTION=='posts')}class=\"active\"{/if}><a href=\"{fun U('user/posts')}\" title=\"我的投稿\">我的投稿</a></li>\n        <li {if(APP_ACTION=='collect')}class=\"active\"{/if}><a href=\"{fun U('user/collect')}\" title=\"我的收藏\">我的收藏</a></li>\n        <li {if(APP_ACTION=='likes')}class=\"active\"{/if}><a href=\"{fun U('user/likes')}\" title=\"我的喜欢\">我的喜欢</a></li>\n        <li {if(APP_ACTION=='comment')}class=\"active\"{/if}><a href=\"{fun U('user/comment')}\" title=\"我的评论\">我的评论</a></li>\n        <li {if(APP_ACTION=='wallet')}class=\"active\"{/if}><a href=\"{fun U('user/wallet')}\" title=\"我的钱包\" class=\"bt1\">我的钱包</a></li>\n        <li {if(APP_ACTION=='cart')}class=\"active\"{/if}><a href=\"{fun U('user/cart')}\" title=\"购物车\">购物车</a></li>\n        <li {if(APP_ACTION=='orders')}class=\"active\"{/if}><a href=\"{fun U('user/orders')}\" title=\"订单管理\">订单管理</a></li>\n        <li {if(APP_ACTION=='userinfo')}class=\"active\"{/if}><a href=\"{fun U('user/userinfo')}\" title=\"资料账户\">资料账户</a></li>\n        <li {if(APP_ACTION=='setmsg')}class=\"active\"{/if}><a href=\"{fun U('user/setmsg')}\" title=\"消息设置\">消息设置</a></li>\n        <li><a href=\"index.html\" title=\"返回主页\" class=\"bt1\">返回主页</a></li>\n      </ul>\n    </div>"
  },
  {
    "path": "static/cms/user/likes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的点赞-个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/collect')}\" {if(APP_ACTION=='collect')}class=\"active\"{/if}>收藏</a><a href=\"{fun U('user/likes')}\" {if(APP_ACTION=='likes')}class=\"active\"{/if}>点赞</a><a href=\"{fun U('user/comment')}\" {if(APP_ACTION=='comment')}class=\"active\"{/if}>评论</a></h2>\n      </div>\n\n        <div class=\"table release-table\">\n        <div class=\"table-scroll\">\n          <table>\n            <thead>\n              <tr>\n                <th>ID</th>\n                <th>名称</th>\n                <th>分类</th>\n                <th>作者</th>\n                <th>操作</th>\n              </tr>\n            </thead>\n            <tbody>\n             {if($lists)}\n              {foreach $lists as $v}\n              <tr>\n                <td>{$v['id']}</td>\n                <td><a href=\"{$v['url']}\" target=\"_blank\" class=\"title\">{$v['details']['title']}</a></td>\n                <td><span class=\"btn-table btn-light\">{$v['classname']}</span></th>\n                <td><a {if($v['member_id']!=0)}href=\"{fun U('user/active',['uid'=>$v['member_id']])}\"{/if} target=\"_blank\" class=\"title\">{if($v['member_id']!=0)}{fun memberInfo($v['member_id'],'username')}{else}[官方]{/if}</a></td>\n                <td><a href=\"{$v['url']}\" target=\"_blank\" class=\"btn-edit\">查看</a><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗?'))window.location.href='{$v['del']}'\" class=\"btn-delete\">删除</a></td>\n              </tr>\n              {/foreach}\n              {else}\n              <p style=\"text-align: center;width: 100%;display: block;height: 50px;line-height: 50px;\"> 暂无收藏~ </p>\n              {/if}\n             \n            </tbody>\n          </table>\n        </div>\n        <div class=\"pagebar-common\">\n          {if($listpage['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n    \n\n      \n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/login.html",
    "content": "<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n  <meta charset=\"UTF-8\">\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\r\n  {include=\"user/style\"}\r\n  <script src=\"/static/common/md5.js\" charset=\"utf-8\"></script>\r\n  <title>个人中心-未登录</title>\r\n</head>\r\n<body>\r\n\r\n<header>\r\n  <div class=\"container\">\r\n    <div class=\"brand\">\r\n      <a href=\"{$webconf['domain']}/\" class=\"logo\"><i class=\"iconfont iconhome\"></i> 返回网站</a>\r\n    </div>\r\n    <div class=\"user-center\">\r\n      <ul class=\"unlogin\">\r\n        <li><a href=\"{fun U('login/index')}\" title=\"登录\">登录</a></li>\r\n        <li><a href=\"{fun U('login/register')}\" title=\"注册\">注册</a></li>\r\n      </ul>\r\n      <ul class=\"user-login\" style=\"display: none;\">\r\n        <li class=\"user-message\"><a href=\"#\" title=\"消息\"><i class=\"iconfont iconxinxi\"></i> <span>2</span></a></li>\r\n        <li class=\"user-icon\">\r\n          <a href=\"{fun U('login/index')}\" title=\"我的\"><img src=\"images/login.png\" alt=\"\"></a>\r\n          <ul class=\"user-menu\">\r\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a></li>\r\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的关注\">我的关注</a></li>\r\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\r\n            <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\r\n            <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\r\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\r\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\r\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的钱包\">我的钱包</a></li>\r\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\r\n            <li><a href=\"{fun U('login/index')}\" title=\"我的订单\">我的订单</a></li>\r\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\r\n            <li><a href=\"{fun U('login/index')}\" title=\"退出登录\">退出登录</a></li>\r\n          </ul>\r\n        </li>\r\n      </ul>\r\n    </div>\r\n  </div>\r\n</header>\r\n\r\n<div class=\"no-login-page page\">\r\n  <div class=\"container clearfix\">\r\n    <div class=\"user-left hidden-sm\">\r\n      <div class=\"user-card\">\r\n        <div class=\"img-box\">\r\n          <a href=\"{fun U('login/index')}\" title=\"去登录\"><img src=\"{$common}user/images/no-login.png\" alt=\"\"></a>\r\n        </div>\r\n        <div class=\"username-info\">\r\n          <a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a>\r\n        </div>\r\n        <div class=\"autograph-info\">\r\n          个性签名\r\n        </div>\r\n        <div class=\"btn-area\">\r\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-release\">发布文章</a><br>\r\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-sign-out\">退出登录</a>\r\n        </div>\r\n      </div>\r\n      <ul class=\"user-list\">\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的关注\" class=\"bt1\">我的关注</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的钱包\" class=\"bt1\">我的钱包</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"订单管理\">订单管理</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"资料与账号\" class=\"bt1\">资料与账号</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\r\n        <li><a href=\"{$webconf['domain']}/\" title=\"返回主页\" class=\"bt1\">返回主页</a></li>\r\n      </ul>\r\n    </div>\r\n    <div class=\"user-right\">\r\n      {include=\"user/tips\"}\r\n        <div class=\"user-content\">\r\n        <h2>登录网站</h2>\r\n        <form method=\"POST\" onsubmit=\"return checklogin()\" class=\"user-form\">\r\n          <input id=\"isremember\" name=\"isremember\" value=\"0\" type=\"hidden\" />\r\n          <input id=\"token\" name=\"token\" value=\"{$token}\" type=\"hidden\" />\r\n          <div class=\"form-control\">\r\n            <label for=\"\">账户：</label>\r\n            <input type=\"text\" name=\"tel\" id=\"tel\" value=\"\" placeholder=\"请输入手机号/邮箱\">\r\n          </div>\r\n          <div class=\"form-control\">\r\n            <label for=\"\">密码：</label>\r\n            <input type=\"password\" value=\"\" id=\"password\" name=\"password\" placeholder=\"请输入您的密码\">\r\n            <a style=\"color:#f00\" href=\"{fun U('forget')}\">忘记密码？</a>\r\n          </div>\r\n          {if($webconf['closehomevercode']!=1)}\r\n          <div class=\"form-control\">\r\n            <label for=\"\">验证码：</label>\r\n            <input type=\"text\" value=\"\" name=\"vercode\" id=\"yzm\" placeholder=\"请输入验证码\">\r\n          </div>\r\n          <div class=\"form-control\">\r\n            <label for=\"\"></label><img src=\"{fun U('common/vercode',['code_name'=>'login_vercode','r'=>rand(111,999)])}\" onclick=\"this.src=this.src+'?'+Math.random()\" style=\"height:50px;\"/>\r\n          </div>\r\n          {/if}\r\n          <div class=\"form-control\">\r\n            <label for=\"\"></label>\r\n            <input class=\"form-check-input\" type=\"checkbox\" id=\"jz_login\">记住密码\r\n          </div>\r\n\r\n          <div class=\"form-control\">\r\n            <label for=\"submit\"></label>\r\n            <input type=\"submit\" name=\"submit\" value=\"提交\">\r\n\r\n          </div>\r\n          {if(isWeixin())}\r\n          <div class=\"form-control\">\r\n            <label for=\"submit\"></label>\r\n            <input type=\"button\" style=\"border: 1px solid #6eb12d; background: #6eb12d;color: #fff;\" onclick=\"wechat_login()\" value=\"微信端登录\">\r\n          </div>\r\n          {/if}\r\n          <div class=\"form-control\">\r\n            <label for=\"\"></label>\r\n            还没有账号？<a  href=\"{fun U('login/register')}\" style=\"color:green\">立即注册</a>&nbsp;<a style=\"color:#f00\" href=\"{fun U('forget')}\">忘记密码？</a>\r\n          </div>\r\n\r\n         \r\n        </form>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n{include=\"user/footer\"}\r\n<script>\r\nfunction setCookie(name,value,day)\r\n{\r\nvar Days = parseInt(day);\r\nvar exp = new Date();\r\nexp.setTime(exp.getTime() + Days*24*60*60*1000);\r\ndocument.cookie = name + \"=\"+ escape (value) + \";expires=\" + exp.toGMTString();\r\n}\r\nfunction getCookie(name)\r\n{\r\nvar arr,reg=new RegExp(\"(^| )\"+name+\"=([^;]*)(;|$)\");\r\nif(arr=document.cookie.match(reg)){\r\nreturn unescape(arr[2]);\r\n}else{\r\nreturn null;\r\n}\r\n\r\n}\r\n\r\n$(function(){\r\n//页面执行时处理\r\nvar name = getCookie('jizhi_username');\r\nvar jizhi_login_token = getCookie('jizhi_login_token');\r\nif(name!=null && jizhi_login_token!=null){\r\n  $(\"#tel\").val(name);\r\n  $(\"#password\").val(jizhi_login_token);\r\n}\r\n\r\n})\r\n\r\nfunction checklogin(){\r\n  if($.trim($(\"#tel\").val())=='' || $.trim($(\"#password\").val())==''){\r\n    alert('账号密码不能为空~');\r\n    return false;\r\n  }\r\n  {if($webconf['closehomevercode']!=1)}\r\n  if($.trim($(\"#yzm\").val())==''){\r\n    alert('验证码不能为空~');\r\n    return false;\r\n  }\r\n  {/if}\r\n  if($(\"#jz_login\").is(\":checked\")){\r\n    $(\"#isremember\").val(1);\r\n    setCookie('jizhi_username',$(\"#tel\").val(),7);//设置用户名\r\n    setCookie('jizhi_login_token',$(\"#token\").val(),7);//设置7天有效期\r\n  }else{\r\n    $(\"#isremember\").val(0);\r\n  }\r\n  $(\"#password\").val(hex_md5($(\"#password\").val()))\r\n  return true;\r\n\r\n}\r\n\r\nfunction wechat_login(){\r\n  window.location.href=\"{fun U('Wechat/login')}\"\r\n}\r\n\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "static/cms/user/nologin.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  <link rel=\"stylesheet\" href=\"{$common}user/css/reset.css\">\n  <link rel=\"stylesheet\" href=\"{$common}user/css/user.css\">\n  <link rel=\"stylesheet\" href=\"http://at.alicdn.com/t/font_1546140_3ob5w5s06xt.css\">\n  <title>个人中心-未登录</title>\n</head>\n<body>\n\n<header>\n  <div class=\"container\">\n    <div class=\"brand\">\n      <a href=\"{$webconf['domain']}/\" class=\"logo\"><i class=\"iconfont iconhome\"></i> 返回网站</a>\n    </div>\n    <div class=\"user-center\">\n      <ul class=\"unlogin\">\n        <li><a href=\"{fun U('login/index')}\" title=\"登录\">登录</a></li>\n        <li><a href=\"{fun U('login/register')}\" title=\"注册\">注册</a></li>\n      </ul>\n      <ul class=\"user-login\" style=\"display: none;\">\n        <li class=\"user-message\"><a href=\"#\" title=\"消息\"><i class=\"iconfont iconxinxi\"></i> <span>2</span></a></li>\n        <li class=\"user-icon\">\n          <a href=\"{fun U('login/index')}\" title=\"我的\"><img src=\"images/login.png\" alt=\"\"></a>\n          <ul class=\"user-menu\">\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的关注\">我的关注</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的钱包\">我的钱包</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的订单\">我的订单</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"退出登录\">退出登录</a></li>\n          </ul>\n        </li>\n      </ul>\n    </div>\n  </div>\n</header>\n\n<div class=\"no-login-page page\">\n  <div class=\"container clearfix\">\n    <div class=\"user-left hidden-sm\">\n      <div class=\"user-card\">\n        <div class=\"img-box\">\n          <a href=\"{fun U('login/index')}\" title=\"去登录\"><img src=\"{$common}user/images/no-login.png\" alt=\"\"></a>\n        </div>\n        <div class=\"username-info\">\n          <a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a>\n        </div>\n        <div class=\"autograph-info\">\n          个性签名\n        </div>\n        <div class=\"btn-area\">\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-release\">发布文章</a><br>\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-sign-out\">退出登录</a>\n        </div>\n      </div>\n      <ul class=\"user-list\">\n        <li><a href=\"{fun U('login/index')}\" title=\"我的关注\" class=\"bt1\">我的关注</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的钱包\" class=\"bt1\">我的钱包</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"订单管理\">订单管理</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"资料与账号\" class=\"bt1\">资料与账号</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\n        <li><a href=\"{$webconf['domain']}/\" title=\"返回主页\" class=\"bt1\">返回主页</a></li>\n      </ul>\n    </div>\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <p class=\"login-tips\"><i class=\"iconfont iconkaifazheshequicon-\"></i></p>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/notify.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n{include=\"user/style\"}\n  <title>消息中心 - 个人中心</title>\n\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/notify')}\" {if(!$msgtype)}class=\"active\"{/if}>全部消息</a><a href=\"{fun U('user/notify',['msgtype'=>1])}\" {if($msgtype==1)}class=\"active\"{/if} >评论提醒</a><a href=\"{fun U('user/notify',['msgtype'=>2])}\" {if($msgtype==2)}class=\"active\"{/if}>收藏提醒</a><a href=\"{fun U('user/notify',['msgtype'=>3])}\" {if($msgtype==3)}class=\"active\"{/if}>赞同提醒</a><a href=\"{fun U('user/notify',['msgtype'=>4])}\" {if($msgtype==4)}class=\"active\"{/if}>@提到我</a><a href=\"{fun U('user/notify',['msgtype'=>5])}\" {if($msgtype==5)}class=\"active\"{/if}>交易提醒</a>\n\t\t<button onclick=\"allread()\" class=\"layui-btn layui-btn-sm\">一键已读</button>\n\t\t</h2>\n      </div>\n      <div class=\"table release-table\">\n        <ul class=\"shop-record-list\">\n        {if($lists)}\n        {foreach $lists as $v}\n        {if($v['type']=='comment' || $v['type']=='reply')}\n          <li>\n            <div class=\"record-item\">\n            <p><span>时间：{$v['date']}</span>{if(!$v['isread'])}<span class=\"fr btn-sm btn-warning\">未读</span>{else}<span class=\"fr btn-sm btn-success\">已读</span>{/if}</p>\n              <p><span>{if($v['puserid'])}{fun memberInfo($v['puserid'],'username')}{else}管理员{/if} 回复了： <a href=\"{$v['turl']}\">{fun newstr(htmldecode($v['body']),30)}</a></span></p>\n              <h4><span class=\"text-info\">【{$classtypedata[$v['tid']]['classname']}】</span><span class=\"fr\"><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗?'))window.location.href='{$v['del']}'\" class=\"change\" title=\"删除\">删除</a><a href=\"{$v['turl']}\" class=\"btn-more\" title=\"回复\">回复</a></span></h4>\n            </div>\n          </li>\n        {else if($v['type']=='likes')}\n          <li>\n            <div class=\"record-item\">\n            <p><span>时间：{$v['date']}</span></p>\n              <p><span>{fun memberInfo($v['puserid'],'username')} 点赞了： <a href=\"{$v['turl']}\">{fun newstr($v['body'],30)}</a></span></p>\n              <h4><span class=\"text-info\">【{$classtypedata[$v['tid']]['classname']}】</span><span class=\"fr\"><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗?'))window.location.href='{$v['del']}'\" class=\"change\" title=\"删除\">删除</a><a href=\"{$v['turl']}\" class=\"btn-more\" title=\"查看详情\">查看详情</a></span></h4>\n            </div>\n          </li>\n        {else if($v['type']=='collect')}\n          <li>\n            <div class=\"record-item\">\n            <p><span>时间：{$v['date']}</span></p>\n              <p><span>{fun memberInfo($v['puserid'],'username')} 收藏了： <a href=\"{$v['turl']}\">{fun newstr($v['body'],30)}</a></span></p>\n              <h4><span class=\"text-info\">【{$classtypedata[$v['tid']]['classname']}】</span><span class=\"fr\"><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗?'))window.location.href='{$v['del']}'\" class=\"change\" title=\"删除\">删除</a><a href=\"{$v['turl']}\" class=\"btn-more\" title=\"查看详情\">查看详情</a></span></h4>\n            </div>\n          </li>\n        {else if($v['type']=='at')}\n          <li>\n            <div class=\"record-item\">\n            <p><span>时间：{$v['date']}</span>{if(!$v['isread'])}<span class=\"fr btn-sm btn-warning\">未读</span>{else}<span class=\"fr btn-sm btn-success\">已读</span>{/if}</p>\n              <p><span>{fun memberInfo($v['puserid'],'username')} @了您： <a href=\"{$v['turl']}\">{fun newstr($v['body'],30)}</a> </span></p>\n              <h4><span class=\"text-info\">【{$classtypedata[$v['tid']]['classname']}】</span><span class=\"fr\"><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗?'))window.location.href='{$v['del']}'\" class=\"change\" title=\"删除\">删除</a><a href=\"{$v['turl']}\" class=\"btn-more\" title=\"回复\">回复</a></span></h4>\n            </div>\n          </li>\n        {else}\n          <li>\n            <div class=\"record-item\">\n            <p><span>时间：{$v['date']}</span>{if(!$v['isread'])}<span class=\"fr btn-sm btn-warning\">未读</span>{else}<span class=\"fr btn-sm btn-success\">已读</span>{/if}</p>\n              <p><span>交易提醒： <a href=\"{$v['turl']}\">{$v['body']}</a> </span></p>\n              <h4><span class=\"text-info\">  </span><span class=\"fr\"><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗?'))window.location.href='{$v['del']}'\" class=\"change\" title=\"删除\">删除</a><a href=\"{$v['turl']}\" class=\"btn-more\" title=\"查看详情\">查看详情</a></span></h4>\n            </div>\n          </li>\n        {/if}\n\n\n        {/foreach}\n        {else}\n        <p style=\"text-align: center;width: 100%;display: block;height: 50px;line-height: 50px;\"> 暂无消息~ </p>\n        {/if}\n       \n        </ul>\n        <div class=\"pagebar-common\">\n          {if($listpage['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n<script>\nfunction allread(){\n\t$.get('/user/allread',function(res){\n\t\tif(res.code==0){\n\t\t\tlayer.msg(res.msg,{time:1500},function(){\n\t\t\tlocation.reload();\n\t\t\t});\n\t\t\t\n\t\t}\n\t},'json')\n}\n\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/order.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的订单 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"{fun U('user/orders')}\" {if(!$type)}class=\"active\"{/if}>全部订单</a>\n        <a href=\"{fun U('user/orders',['type'=>1])}\" {if($type==1)}class=\"active\"{/if}>待付款</a>\n        <a href=\"{fun U('user/orders',['type'=>2])}\" {if($type==2)}class=\"active\"{/if}>已付款</a>\n        <a href=\"{fun U('user/orders',['type'=>3])}\" {if($type==3)}class=\"active\"{/if}>超时订单</a>\n        <a href=\"{fun U('user/orders',['type'=>4])}\" {if($type==4)}class=\"active\"{/if}>待发货</a>\n        <a href=\"{fun U('user/orders',['type'=>5])}\" {if($type==5)}class=\"active\"{/if}>已发货</a>\n        <a href=\"{fun U('user/orders',['type'=>6])}\" {if($type==6)}class=\"active\"{/if}>已废弃</a>\n        </h2>\n      </div>\n      <div class=\"table release-table\">\n        <ul class=\"shop-record-list\">\n        {foreach $lists as $v}\n          <li>\n            <div class=\"record-item\">\n              <p><span>下单时间：{$v['date']}</span>\n              {if($v['isshow']==1)}\n              <span class=\"fr btn-sm btn-info\">待支付</span>\n              {else if($v['isshow']==2)}\n              <span class=\"fr btn-sm btn-success\">交易成功</span>\n              {else if($v['isshow']==3)}\n              <span class=\"fr btn-sm btn-danger\">已超时</span>\n              {else if($v['isshow']==4)}\n              <span class=\"fr btn-sm btn-warning\">待发货</span>\n              {else if($v['isshow']==5)}\n              <span class=\"fr btn-sm btn-success\">已发货</span>\n              {else}\n              <span class=\"fr btn-sm btn-warning\">已废弃</span>\n              {/if}\n              </p>\n              <p><span>订单号：<a href=\"{$v['details']}\">{$v['orderno']}</a></span></p>\n              <p><span>交易类型：{$v['paytype']}</span></p>\n              <h4><span class=\"text-info\">￥{$v['price']}</span><span class=\"fr\"><a href=\"javascript:;\" onclick=\"javascript:if(confirm('您确定要删除吗？'))window.location.href='{$v['del']}'\" class=\"change\" title=\"删除\">删除</a><a href=\"{$v['details']}\" class=\"btn-more\" title=\"查看详情\">查看详情</a></span></h4>\n            </div>\n          </li>\n        {/foreach}\n         \n        </ul>\n        <div class=\"pagebar-common\">\n          {if($listpage['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/orderdetails.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的订单 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"\" class=\"active\">我的订单</a></h2>\n      </div>\n      <div class=\"order-details\">\n        <h4 class=\"head-title\">订单详情</h4>\n        {if($carts)}\n        <div class=\"display-flex-order\">\n          <div class=\"order-left\">\n            <ul class=\"order-list\">\n            {foreach $carts as $v}\n            {if($v['info'])}\n              <li>\n                <div class=\"order-item\">\n                  <div class=\"img-box\">\n                    <a href=\"{fun gourl($v['info']['id'],$v['info']['htmlurl'])}\"><img src=\"{$v['info']['litpic']}\" ></a>\n                  </div>\n                  <div class=\"order-title\">\n                    <a href=\"{fun gourl($v['info']['id'],$v['info']['htmlurl'])}\" target=\"_blank\">{$v['info']['title']}</a>\n                    \n                  </div>\n                </div>\n                <div class=\"order-item-right\">\n                  <div class=\"order-number\">\n                    <p>数量</p>\n                    <p>{$v['num']}</p>\n                  </div>\n                  <input id=\"price_per_{$v['tid']}_{$v['info']['id']}\" value=\"{$v['info']['price']}\" type=\"hidden\" />\n                  <div class=\"order-money\">\n                    <p>单价</p>\n                    <p class=\"price\">￥{$v['price']}</p>\n                  </div>\n                </div>\n              </li>\n            {else}\n              <li>\n                <div class=\"order-item\">\n                  <div class=\"img-box\">\n                    <a >[ 无 ]</a>\n                  </div>\n                  <div class=\"order-title\">\n                    <h4><a >[{$v['id']}][ 商品已被删除 ]</a></h4>\n                   \n                  </div>\n                </div>\n                <div class=\"order-item-right\">\n                  <div class=\"order-number\">\n                    <p>数量</p>\n                    <p>{$v['num']}</p>\n                  </div>\n                  \n                  <div class=\"order-money\">\n                    <p>单价</p>\n                    <p class=\"price\">￥{$v['price']}</p>\n                  </div>\n                </div>\n              </li>\n            {/if}\n            {/foreach}\n             \n            </ul>\n          </div>\n          <div class=\"order-right\">\n            <div class=\"summary\">\n            <form action=\"{fun U('user/payment')}\" method=\"get\">\n            <input name=\"go\" value=\"1\" type=\"hidden\" />\n            <input name=\"orderno\" value=\"{$order['orderno']}\" type=\"hidden\" />\n              <h3>总计</h3>\n              <h4><span>总金额</span><span class=\"price fr\" id=\"allmoney\">￥{$order['price']-$order['discount']+$order['yunfei']}</span></h4>\n              <h4><span>折扣</span><span class=\"price fr\" id=\"alldiscount\">-￥{$order['discount']}</span></h4>\n              <h4><span>邮费</span><span class=\"price fr\" id=\"yunfei\">+￥{$order['yunfei']}</span></h4>\n              <h4><span>总计</span><span class=\"price fr\" id=\"summary\">￥{$order['price']}</span></h4>\n              {if($order['isshow']==1)}\n              <button class=\"\" type=\"submit\">继续支付</button>\n              {else if($order['isshow']==2)}\n              <button class=\"btn btn-success\" disabled type=\"button\">已支付</button>\n              {else if($order['isshow']==3)}\n              <button class=\"btn btn-warning\" disabled type=\"button\">订单已过期</button>\n              {else if($order['isshow']==4)}\n              <button class=\"btn btn-success\" disabled type=\"button\">待发货</button>\n              {else if($order['isshow']==5)}\n              <button class=\"btn btn-success\" disabled type=\"button\">已发货</button>\n              {else if($order['isshow']==6)}\n              <button class=\"btn btn-warning\" disabled type=\"button\">已失效</button>\n              {else if($order['isshow']==0)}\n              <button class=\"btn btn-warning\" disabled type=\"button\">订单已过期</button>\n              {/if}\n            </form>\n            </div>\n          </div>\n        </div>\n        {else}\n        暂无商品~\n        {/if}\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n<script>\n \n  \n  </script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/password.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  <link rel=\"stylesheet\" href=\"css/reset.css\">\n  <link rel=\"stylesheet\" href=\"css/user.css\">\n  <link rel=\"stylesheet\" href=\"http://at.alicdn.com/t/font_1546140_sw4m5ivcrg9.css\">\n  <script src=\"https://www.jq22.com/jquery/jquery-1.10.2.js\"></script>\n  <title>个人中心-已登录</title>\n</head>\n<body>\n\n<header>\n  <div class=\"container\">\n    <div class=\"brand\">\n      <a href=\"#\" class=\"logo\"><i class=\"iconfont iconhome\"></i> 返回网站</a>\n    </div>\n    <div class=\"user-center\">\n      <ul class=\"unlogin\" style=\"display: none;\">\n        <li><a href=\"#\" title=\"登录\">登录</a></li>\n        <li><a href=\"#\" title=\"注册\">注册</a></li>\n      </ul>\n      <ul class=\"user-login\">\n        <li class=\"user-message\"><a href=\"#\" title=\"消息\"><i class=\"iconfont iconxinxi\"></i> <span>2</span></a></li>\n        <li class=\"user-icon\">\n          <a href=\"#\" title=\"我的\"><img src=\"images/login.png\" alt=\"\"></a>\n          <ul class=\"user-menu\">\n            <li class=\"bt1\"><a href=\"user-change.html\" title=\"资料与账户\">资料与账户</a></li>\n            <li class=\"bt1\"><a href=\"#\" title=\"我的关注\">我的关注</a></li>\n            <li class=\"hidden-md\"><a href=\"#\" title=\"我的粉丝\">我的粉丝</a></li>\n            <li><a href=\"#\" title=\"我的投稿\">我的投稿</a></li>\n            <li><a href=\"#\" title=\"我的收藏\">我的收藏</a></li>\n            <li class=\"hidden-md\"><a href=\"#\" title=\"我的喜欢\">我的喜欢</a></li>\n            <li class=\"hidden-md\"><a href=\"#\" title=\"我的评论\">我的评论</a></li>\n            <li class=\"bt1\"><a href=\"#\" title=\"我的钱包\">我的钱包</a></li>\n            <li class=\"hidden-md\"><a href=\"#\" title=\"购物车\">购物车</a></li>\n            <li><a href=\"#\" title=\"我的订单\">我的订单</a></li>\n            <li class=\"bt1\"><a href=\"password.html\" title=\"修改密码\">修改密码</a></li>\n            <li><a href=\"index.html\" title=\"退出登录\">退出登录</a></li>\n          </ul>\n        </li>\n      </ul>\n    </div>\n  </div>\n</header>\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    <div class=\"user-left hidden-sm\">\n      <div class=\"user-card\">\n        <div class=\"img-box\">\n          <a href=\"#\" title=\"登录\"><img src=\"images/login.png\" alt=\"\"></a>\n        </div>\n        <div class=\"username-info\">\n          <a href=\"#\" title=\"登录\">舒彬琪</a>\n        </div>\n        <div class=\"autograph-info\">\n          舒彬琪的个性签名\n        </div>\n        <div class=\"btn-area\">\n          <a href=\"#\" class=\"btn-default btn-release\">发布文章</a><br>\n          <a href=\"#\" class=\"btn-default btn-sign-out\">退出登录</a>\n        </div>\n      </div>\n      <ul class=\"user-list\">\n        <li><a href=\"user-list1.html\" title=\"我的关注\" class=\"bt1\">我的关注</a></li>\n        <li><a href=\"user-list2.html\" title=\"我的粉丝\">我的粉丝</a></li>\n        <li><a href=\"user-list3.html\" title=\"我的投稿\">我的投稿</a></li>\n        <li><a href=\"user-list4.html\" title=\"我的收藏\">我的收藏</a></li>\n        <li><a href=\"user-list5.html\" title=\"我的喜欢\">我的喜欢</a></li>\n        <li><a href=\"user-list6.html\" title=\"我的评论\">我的评论</a></li>\n        <li><a href=\"user-list7.html\" title=\"我的钱包\" class=\"bt1\">我的钱包</a></li>\n        <li><a href=\"user-list8.html\" title=\"购物车\">购物车</a></li>\n        <li><a href=\"user-list9.html\" title=\"订单管理\">订单管理</a></li>\n        <li><a href=\"user-change.html\" title=\"资料与账号\" class=\"bt1\">资料与账号</a></li>\n        <li class=\"active\"><a href=\"password.html\" title=\"修改密码\">修改密码</a></li>\n        <li><a href=\"index.html\" title=\"返回主页\" class=\"bt1\">返回主页</a></li>\n      </ul>\n    </div>\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <h2>修改密码</h2>\n        <form action=\"\" class=\"user-form\">\n          <div class=\"form-control\">\n            <label for=\"\">密码：</label>\n            <input type=\"text\" value=\"dsf@32423sa\" placeholder=\"请输入您的密码\">\n          </div>\n          <div class=\"form-control\">\n            <label for=\"password\">新密码：</label>\n            <div class=\"form-password\">\n              <input type=\"password\" class=\"password1\" value=\"password\" placeholder=\"请设置您的密码\">\n              <i class=\"iconfont iconyanjing\"></i><i class=\"iconfont iconyanjing-guan\"></i>\n            </div>\n          </div>\n          <div class=\"form-control\">\n            <span><label for=\"setpassword\">确认密码：</label></span>\n            <div class=\"form-password\">\n              <input type=\"password\" class=\"password1\" value=\"password\" placeholder=\"请设置您的密码\">\n              <i class=\"iconfont iconyanjing\"></i><i class=\"iconfont iconyanjing-guan\"></i>\n            </div>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"submit\"></label>\n            <input type=\"submit\" name=\"submit\" value=\"提交\">\n          </div>\n        </form>\n      </div>\n    </div>\n  </div>\n</div>\n\n<footer>\n  <div class=\"copyright\">\n    <p><span>Copyright &copy; 2019-2099</span><span><a href=\"#\" title=\"ICP备案号\">京ICP备100001234523号</a></span><span>Theme By Shubinqi</span></p>\n  </div>\n</footer>\n\n<script src=\"js/user.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/payment.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>支付订单 - 个人中心</title>\n  <style type=\"text/css\">\nselect#paytype {\n    width: 100%;\n    height: 45px;\n    border-radius: 2px;\n}\n  </style>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n        <h2><a href=\"\" class=\"active\">支付订单</a></h2>\n      </div>\n      <div class=\"order-details\">\n\t   <form action=\"{fun U('order/pay')}\"  id=\"myform\"  method=\"POST\">\n        <h4 class=\"head-title\">订单详情</h4>\n        {if($carts)}\n        <div class=\"display-flex-order\">\n         \n          <div class=\"order-left\">\n            <ul class=\"order-list\">\n            {foreach $carts as $v}\n            {if($v['info'])}\n              <li>\n                <div class=\"order-item\">\n                  <div class=\"img-box\">\n                    <a href=\"{fun gourl($v['info']['id'],$v['info']['htmlurl'])}\"><img src=\"{$v['info']['litpic']}\" ></a>\n                  </div>\n                  <div class=\"order-title\">\n                    <h4><a href=\"{fun gourl($v['info']['id'],$v['info']['htmlurl'])}\" target=\"_blank\">{$v['info']['title']}</a></h4>\n                    \n                  </div>\n                </div>\n                <div class=\"order-item-right\">\n                  <div class=\"order-number\">\n                    <p>数量</p>\n                    <p>{$v['num']}</p>\n                  </div>\n                  <input id=\"price_per_{$v['tid']}_{$v['info']['id']}\" value=\"{$v['info']['price']}\" type=\"hidden\" />\n                  <div class=\"order-money\">\n                    <p>单价</p>\n                    <p class=\"price\">￥{$v['price']}</p>\n                  </div>\n                </div>\n              </li>\n            {else}\n              <li>\n                <div class=\"order-item\">\n                  <div class=\"img-box\">\n                    <a >[ 无 ]</a>\n                  </div>\n                  <div class=\"order-title\">\n                    <h4><a >[{$v['id']}][ 商品已被删除 ]</a></h4>\n                   \n                  </div>\n                </div>\n                <div class=\"order-item-right\">\n                  <div class=\"order-number\">\n                    <p>数量</p>\n                    <p>{$v['num']}</p>\n                  </div>\n                  \n                  <div class=\"order-money\">\n                    <p>单价</p>\n                    <p class=\"price\">￥{$v['price']}</p>\n                  </div>\n                </div>\n              </li>\n            {/if}\n            {/foreach}\n            \n            <li>\n            <div class=\"information\">\n          {php\n\t\t  $member = memberInfo($member['id']);\n\t\t  /}\n            <input name=\"go\" value=\"1\" type=\"hidden\" />\n            <input name=\"orderno\" value=\"{$order['orderno']}\" type=\"hidden\" />\n            <input name=\"paytype\" value=\"0\" id=\"paytypeinput\" type=\"hidden\" />\n             <h3>收货信息</h3>\n              <h4><label>*收货人</label><input class=\"form-control\" type=\"text\" name=\"username\" id=\"username\" value=\"{$member['username']}\" placeholder=\"填写收货人信息\"></h4>\n              <h4><label>*联系手机</label><input class=\"form-control\" name=\"tel\" id=\"tel\" value=\"{$member['tel']}\" type=\"text\" placeholder=\"填写收货人手机号\"></h4>\n              <h4><label>收件邮箱</label><input class=\"form-control\" name=\"email\" id=\"email\" value=\"{$member['email']}\" type=\"text\" placeholder=\"方便接收发货邮件\"></h4>\n              <h4><label>*收货地址</label><input class=\"form-control\" id=\"address\" name=\"address\" value=\"{$member['address']}\" type=\"text\" placeholder=\"填写收货地址\"></h4>\n            \n       \n            </div>\n            </li>\n            \n           \n            </ul>\n          </div>\n          <div class=\"order-right\">\n            <div class=\"summary\">\n           \n             <h3>总计</h3>\n              <h4><span>总金额</span><span class=\"price fr\" id=\"allmoney\">￥{$order['price']+$order['discount']-$order['yunfei']}</span></h4>\n              <h4><span>折扣</span><span class=\"price fr\" id=\"alldiscount\">-￥{$order['discount']}</span></h4>\n              <h4><span>邮费</span><span class=\"price fr\" id=\"yunfei\">+￥{$order['yunfei']}</span></h4>\n              <h4><span>总计</span><span class=\"price fr\" id=\"summary\">￥{$order['price']}</span></h4>\n            \n            {if($webconf['paytype']!=0)}\n           \n             <h3>支付方式</h3>\n           \n             <div class=\"payment\">\n              <select name=\"paytypeselect\" id=\"paytype\">\n              {if($webconf['isopenzfb'])}\n              <option value=\"1\">支付宝（需付：{$order['price']}）</option>\n              <option value=\"5\">支付宝当面付（需付：{$order['price']}）</option>\n              {/if}\n              {if($webconf['isopenweixin'])}\n              <option value=\"2\">微信（需付：{$order['price']}）</option>\n              {/if}\n              {if($webconf['isopenqianbao'])}\n              <option value=\"3\">钱包（需付：{$qianbao} 余额：{$member['money']}）</option>\n              {/if}\n              {if($webconf['isopenjifen'])}\n              <option value=\"4\">积分（需付：{$jifen} 余额：{$member['jifen']}）</option>\n              {/if}\n              </select>\n            \n             </div>\n           \n            \n            {/if}\n\t\t\t <button class=\"btn\" onclick=\"checkpay()\" type=\"button\">立即支付</button>\n            \n            </div>\n          </div>\n        </div>\n        {else}\n        暂无商品~\n        {/if}\n       </form>  \n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n<script>\n  $(function(){\n    $(\".pay\").click(function(){\n      $(this).removeClass('pay-hide').addClass('pay-active').siblings().removeClass('pay-active').addClass('pay-hide');\n    });\n  \n  })\n\n  //检查订单\n  function checkpay(){\n    var username = $.trim($(\"#username\").val());\n    var tel = $.trim($(\"#tel\").val());\n    var email = $.trim($(\"#email\").val());\n    var address = $.trim($(\"#address\").val());\n    $(\"#paytypeinput\").val($(\"#paytype\").val());\n    if(username==''){\n      alert('收货人不能为空！');$(\"#username\").focus();return false;\n    }\n    if(tel==''){\n      alert('联系手机不能为空！');$(\"#tel\").focus();return false;\n    }\n    if(address==''){\n      alert('收货地址不能为空！');$(\"#address\").focus();return false;\n    }\n\n    \n    $(\"#myform\").submit();\n    \n    \n    \n  }\n  \n</script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/people.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>{$user['username']}的公共主页</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n<style>\n/* 关注用户 */\n.user-follow-top {\n  display: flex;\n  flex-wrap: wrap;\n  margin-bottom: 20px;\n}\n/* 关注左侧 */\n.user-top-left {\n  width: 220px;\n  background: #fff;\n  margin-right: 20px;\n  border-radius: 5px;\n  padding: 20px 0;\n}\n.user-top-left .img-box {\n  width: 100%;\n  margin-bottom: 15px;\n}\n.user-top-left .img-box img {\n  width: 80px;\n  margin: 0 auto;\n  border-radius: 5px;\n}\n.user-top-left .username-info {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.user-top-left .username-info a {\n  color: #242424;\n  font-size: 18px;\n  line-height: 24px;\n  font-weight: 700;\n  text-align: center;\n}\n.user-top-left .username-info a:hover {\n  color: #007bff;\n}\n.user-top-left .autograph-info {\n  text-align: center;\n  color: #808080;\n  font-size: 12px;\n  line-height: 18px;\n  margin-bottom: 20px;\n}\n.user-top-left .btn-area {\n  padding: 0 20px;\n}\n.user-top-left .btn-area .btn-default {\n  display: block;\n  height: 40px;\n  line-height: 38px;\n  text-align: center;\n  width: 100%;\n  font-size: 14px;\n  border-radius: 5px;\n}\n.user-top-left .btn-area .btn-follow {\n  color: #fff;\n  background: #007bff;\n  border: 1px solid #007bff;\n}\n.user-top-left .btn-area .btn-follow:hover {\n  background: #005bbd;\n  border: 1px solid #005bbd;\n}\n/* 关注右侧 */\n.user-top-right {\n  flex: 1;\n  background: #fff;\n  border-radius: 5px;\n  padding: 15px;\n}\n.user-top-right .user-tab {\n  display: flex;\n  flex-wrap: wrap;\n}\n.user-top-right .user-tab .num {\n  width: 25%;\n  padding: 28px 0;\n}\n/* 关注底部 */\n.user-follow-bottom {\n  background: #fff;\n  border-radius: 5px;\n  padding: 15px 20px;\n  margin-bottom: 10px;\n}\n.tab-hd {\n  display: flex;\n  flex-wrap: wrap;\n  border-bottom: 1px solid #e1e1e1;\n  margin-bottom: 20px;\n}\n.tab-hd li {\n  margin-right: 10px;\n  position: relative;\n}\n.tab-hd li.active:after {\n  content: \"\";\n  width: 100%;\n  height: 3px;\n  background: #007bff;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n}\n.tab-hd li.active a {\n  font-weight: 700;\n  color: #007bff;\n}\n.tab-hd li a {\n  color: #242424;\n  font-size: 16px;\n  line-height: 36px;\n  padding: 0 10px;\n}\n.tab-item-follow .follow-list {\n  width: 100%;\n  border-top: 1px solid #f1f1f1;\n}\n.follow-list-item {\n  padding-top: 10px;\n  padding-bottom: 20px;\n  border-bottom: 1px solid #f1f1f1;\n}\n.follow-list-item > p {\n  color: #8590a6;\n  font-size: 14px;\n  line-height: 30px;\n}\n.follow-list-item > p span {\n  float: right;\n}\n.follow-list-item h3 {\n  margin-bottom: 10px;\n}\n.follow-list-item h3 a {\n  display: block;\n  font-size: 20px;\n  line-height: 30px;\n  font-weight: 700;\n  color: #242424;\n}\n.follow-list-item .user-top {\n  display: flex;\n  margin-bottom: 15px;\n}\n.follow-list-item .user-top .img-box {\n  height: 40px;\n  border-radius: 3px;\n  overflow: hidden;\n  margin-right: 20px;\n}\n.follow-list-item .user-top img {\n  width: 40px;\n  height: 40px;\n  border-radius: 5px;\n}\n.follow-list-item .user-top h4 {\n  font-size: 14px;\n  font-weight: 700;\n  line-height: 20px;\n}\n.follow-list-item .user-top p {\n  font-size: 14px;\n  line-height: 20px;\n}\n.follow-list-item .list-content {\n  display: flex;\n}\n.follow-list-item .list-content .img-box {\n  height: 150px;\n  margin-right: 20px;\n}\n.follow-list-item .list-content img {\n  height: 150px;\n}\n.follow-list-item .list-content .cont {\n  color: #444;\n  font-size: 14px;\n  line-height: 30px;\n}\n.content-x dd{\ndisplay: inline-block;\n}\n\n.content-x dd{\n\twidth:60%;\n}\n.content-x dd.img{\n\twidth:30%;\n}\ndd.img img{\n\twidth:100%;\n}\n</style>\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    <div class=\"user-follow-top\">\n      <div class=\"user-top-left user-card\">\n        <div class=\"img-box\">\n          <a ><img src=\"{if($user['litpic'])}{$user['litpic']}{else}{$common}user/images/user.png{/if}\" alt=\"\"></a>\n        </div>\n        <div class=\"username-info\">\n          <a >{$user['username']}</a>\n        </div>\n        <div class=\"autograph-info\">\n          {if($user['signature'])}{$user['signature']}{else}他很懒，什么都没有留下~{/if}\n        </div>\n        <div class=\"btn-area\">\n          {if($islogin)}\n\t\t  {if(isfollow($member['id'],$user['id']))}\n\t\t  <a  class=\"btn-default btn-follow\"> 已关注</a>\n\t\t  {else}\n\t\t  <a href=\"{fun U('user/follow',['uid'=>$user['id']])}\" class=\"btn-default btn-follow\"><i class=\"iconfont iconguanzhu2\"></i> 关注</a>\n\t\t  {/if}\n\t\t  {else}\n\t\t  <a href=\"{fun U('user/follow',['uid'=>$user['id']])}\" class=\"btn-default btn-follow\"><i class=\"iconfont iconguanzhu2\"></i> 关注</a>\n\t\t  {/if}\n        </div>\n      </div>\n      <div class=\"user-top-right\">\n        <div class=\"user-tab\">\n          <div class=\"num\">\n            <a href=\"{fun U('user/active',['molds'=>'article','uid'=>$user['id'],'type'=>1])}\" title=\"\">\n              <h4>{$article_num}</h4>\n              <p>投稿</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/active',['molds'=>'product','type'=>2,'uid'=>$user['id']])}\" title=\"\">\n              <h4>{$product_num}</h4>\n              <p>商品</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/active',['type'=>3,'uid'=>$user['id']])}\" title=\"\">\n              <h4>{fun jz_follow($member['id'])}</h4>\n              <p>关注</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/active',['type'=>4,'uid'=>$user['id']])}\" title=\"\">\n              <h4>{fun jz_fans($member['id'])}</h4>\n              <p>粉丝</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/active',['type'=>5,'uid'=>$user['id']])}\" title=\"\">\n              <h4>{$collect_num}</h4>\n              <p>收藏</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/active',['type'=>6,'uid'=>$user['id']])}\" title=\"\">\n              <h4>{$comment_num}</h4>\n              <p>评论</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"{fun U('user/active',['type'=>7,'uid'=>$user['id']])}\" title=\"\">\n              <h4>{$likes_num}</h4>\n              <p>点赞</p>\n            </a>\n          </div>\n          \n        </div>\n\t  </div>\n    </div>\n    <div class=\"user-follow-bottom\">\n      <div class=\"tab-hd\">\n        <li {if($type==1)}class=\"active\"{/if}><a href=\"{fun U('user/active',['molds'=>'article','uid'=>$user['id'],'type'=>1])}\" title=\"文章\">文章</a></li>\n        <li {if($type==2)}class=\"active\"{/if}><a href=\"{fun U('user/active',['molds'=>'product','uid'=>$user['id'],'type'=>2])}\" title=\"商品\">商品</a></li>\n        <li {if($type==3)}class=\"active\"{/if}><a href=\"{fun U('user/active',['uid'=>$user['id'],'type'=>3])}\" title=\"关注\">关注</a></li>\n        <li {if($type==4)}class=\"active\"{/if}><a href=\"{fun U('user/active',['uid'=>$user['id'],'type'=>4])}\" title=\"粉丝\">粉丝</a></li>\n        <li {if($type==5)}class=\"active\"{/if}><a href=\"{fun U('user/active',['uid'=>$user['id'],'type'=>5])}\" title=\"收藏\">收藏</a></li>\n        <li {if($type==6)}class=\"active\"{/if}><a href=\"{fun U('user/active',['uid'=>$user['id'],'type'=>6])}\" title=\"评论\">评论</a></li>\n        <li {if($type==7)}class=\"active\"{/if}><a href=\"{fun U('user/active',['uid'=>$user['id'],'type'=>7])}\" title=\"点赞\">点赞</a></li>\n        \n      </div>\n      <div class=\"tab-bd\">\n        <div class=\"tab-item-follow\">\n          <ul class=\"content-list\">\n\t\t  {if($lists)}\n\t\t  {if($type==1 || $type==2)}\n\t\t  {foreach $lists as $v}\n\t\t\t<li>\n\t\t\t<dl class=\"content-x\">\n\t\t\t<dd class=\"img\">{if($v['litpic'])}<img src=\"{$v['litpic']}\">{else}无图{/if}</dd>\n\t\t\t<dd><a href=\"{$v['url']}\" title=\"{$v['title']}\">{$v['title']}</a></dd>\n\t\t\t</dl>\n            \n            </li>\n\t\t  {/foreach}\n\t\t  \n\t\t  {else if($type==3)}\n\t\t  {foreach $lists as $v}\n\t\t\t<li>\n\t\t\t  <div class=\"follow-list-item\">\n\t\t\t\t\n\t\t\t\t<div class=\"img-box\"><img src=\"{if($v['litpic'])}{$v['litpic']}{else}{$common}images/login1.png{/if}\" alt=\"{$v['username']}\"></div>\n\t\t\t\t<h4>{$v['username']}</h4>\n\t\t\t\t<p>{if($v['signature'])}{$v['signature']}{else}他很懒，什么都没有留下~{/if}</p>\n\t\t\t\t<a href=\"{fun U('user/nofollow',['uid'=>$v['id']])}\" title=\"关注\">关注</a>\n\t\t\t  </div>\n\t\t\t</li>\n\t\t  {/foreach}\n\t\t  \n\t\t  {else if($type==4)}\n\t\t   {foreach $lists as $v}\n\t\t\t<li>\n\t\t\t  <div class=\"follow-list-item\">\n\t\t\t   \n\t\t\t\t<div class=\"img-box\"><img src=\"{if($v['litpic'])}{$v['litpic']}{else}{$common}user/images/login1.png{/if}\" alt=\"\"></div>\n\t\t\t\t<h4>{$v['username']}</h4>\n\t\t\t\t<p>{if($v['signature'])}{$v['signature']}{else}他很懒，什么都没有留下~{/if}</p>\n\t\t\t\t<a href=\"{fun U('user/follow',['uid'=>$v['id']])}\" title=\"关注\">关注</a>\n\t\t\t  </div>\n\t\t\t</li>\n\t\t  {/foreach}\n\t\t  {else if($type==5)}\n\t\t  {foreach $lists as $v}\n\t\t  <li>\n\t\t   \n\t\t\t<p>\n\t\t\t<a href=\"{$v['url']}\" target=\"_blank\" class=\"title\">{$v['details']['title']}</a>\n\t\t\t<span class=\"btn-table btn-light\">{$v['classname']}</span>\n\t\t\t<a {if($v['details']['member_id']!=0)}href=\"{fun U('user/active',['uid'=>$v['details']['member_id']])}\"{/if} target=\"_blank\" class=\"title\">{if($v['details']['member_id']!=0)}{fun memberInfo($v['details']['member_id'],'username')}{else}[官方]{/if}</a>\n\t\t\t</p>\n\t\t\t\n\t\t  </li>\n\t\t  {/foreach}\n\t\t  {else if($type==6)}\n\t\t  {foreach $lists as $v}\n          <li>\n            <div class=\"record-item\">\n            <p><span>时间：{$v['date']}</span></p>\n              <p><span>回复了： <a href=\"{$v['url']}\">{fun newstr($v['body'],30)}</a></span></p>\n              <h4><span class=\"text-info\">【{$classtypedata[$v['tid']]['classname']}】</span><span class=\"fr\"><a href=\"{$v['url']}\" class=\"btn-more\" title=\"查看详情\">查看详情</a></span></h4>\n            </div>\n          </li>\n\t\t  {/foreach}\n\t\t  {else if($type==7)}\n\t\t  {foreach $lists as $v}\n\t\t\t<li>\n              <div class=\"follow-list-item\">\n                {if($v['member_id']!=0)}\n\t\t\t\t{php $author = memberInfo($v['member_id']); /}\n                <div class=\"user-top\">\n                  <div class=\"img-box\">\n                    <img src=\"{if($author['litpic'])}{$author['litpic']}{else}{$common}user/images/user.png{/if}\" alt=\"\">\n                  </div>\n                  <div class=\"user-name\">\n                    <h4>{$author['username']}</h4>\n                    <p>{$author['signature']}</p>\n                  </div>\n                </div>\n\t\t\t\t{else}\n\t\t\t\t{php $author = adminInfo($v['userid']); /}\n\t\t\t\t<div class=\"user-top\">\n                  <div class=\"img-box\">\n                    <img src=\"{$common}user/images/user.png\" alt=\"\">\n                  </div>\n                  <div class=\"user-name\">\n                    <h4>{$author['name']}【官方】</h4>\n                    <p></p>\n                  </div>\n                </div>\n\t\t\t\t{/if}\n                <div class=\"list-content\">\n                  <div class=\"img-box\">\n                    \n                  </div>\n                  <div class=\"cont\">\n                    <a href=\"{$v['url']}\" title=\"{$v['title']}\">{$v['title']}</a>\n                  </div>\n                </div>\n              </div>\n            </li>\n\t\t  {/foreach}\n\t\t  \n\t\t  {/if}\n\t\t  {else}\n\t\t\t<li>没有任何内容~</li>\n\t\t  {/if}\n            \n            \n          </ul>\n        </div>\n\t\t<div class=\"pagebar-common\">\n          {if($listpage['list'])}\n          <ul class=\"pagination\">\n          <li class=\"page-item {if(!$listpage['prev'])}disabled{/if}\">\n          <a class=\"page-link\" href=\"{$listpage['prev']}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>\n          {foreach $listpage['list'] as $ss}\n          <li class=\"page-item {if($ss['num']==$listpage['current_num'])}active background{/if}\"><a href=\"{$ss['url']}\" class=\"page-link\">{$ss['num']}</a></li>\n          {/foreach}\n          <li class=\"page-item {if(!$listpage['next'])}disabled{/if}\"><a class=\"page-link\" href=\"{$listpage['next']}\" aria-label=\"Next\"><span aria-hidden=\"true\">»</span></a></li>\n          </ul>\n          {/if}\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/prople.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  <link rel=\"stylesheet\" href=\"css/reset.css\">\n  <link rel=\"stylesheet\" href=\"css/user.css\">\n  <link rel=\"stylesheet\" href=\"http://at.alicdn.com/t/font_1546140_sw4m5ivcrg9.css\">\n  <script src=\"https://www.jq22.com/jquery/jquery-1.10.2.js\"></script>\n  <title>个人中心-已登录</title>\n</head>\n<body>\n\n<header>\n  <div class=\"container\">\n    <div class=\"brand\">\n      <a href=\"#\" class=\"logo\"><i class=\"iconfont iconhome\"></i> 返回网站</a>\n    </div>\n    <div class=\"user-center\">\n      <ul class=\"unlogin\" style=\"display: none;\">\n        <li><a href=\"#\" title=\"登录\">登录</a></li>\n        <li><a href=\"#\" title=\"注册\">注册</a></li>\n      </ul>\n      <ul class=\"user-login\">\n        <li class=\"user-message\"><a href=\"#\" title=\"消息\"><i class=\"iconfont iconxinxi\"></i> <span>2</span></a></li>\n        <li class=\"user-icon\">\n          <a href=\"#\" title=\"我的\"><img src=\"images/login.png\" alt=\"\"></a>\n          <ul class=\"user-menu\">\n            <li class=\"bt1\"><a href=\"#\" title=\"资料与账户\">资料与账户</a></li>\n            <li class=\"bt1\"><a href=\"#\" title=\"我的关注\">我的关注</a></li>\n            <li class=\"hidden-md\"><a href=\"#\" title=\"我的粉丝\">我的粉丝</a></li>\n            <li><a href=\"#\" title=\"我的投稿\">我的投稿</a></li>\n            <li><a href=\"#\" title=\"我的收藏\">我的收藏</a></li>\n            <li class=\"hidden-md\"><a href=\"#\" title=\"我的喜欢\">我的喜欢</a></li>\n            <li class=\"hidden-md\"><a href=\"#\" title=\"我的评论\">我的评论</a></li>\n            <li class=\"bt1\"><a href=\"#\" title=\"我的钱包\">我的钱包</a></li>\n            <li class=\"hidden-md\"><a href=\"#\" title=\"购物车\">购物车</a></li>\n            <li><a href=\"#\" title=\"我的订单\">我的订单</a></li>\n            <li class=\"bt1\"><a href=\"#\" title=\"修改密码\">修改密码</a></li>\n            <li><a href=\"#\" title=\"退出登录\">退出登录</a></li>\n          </ul>\n        </li>\n      </ul>\n    </div>\n  </div>\n</header>\n<style>\n/* 关注用户 */\n.user-follow-top {\n  display: flex;\n  flex-wrap: wrap;\n  margin-bottom: 20px;\n}\n/* 关注左侧 */\n.user-top-left {\n  width: 220px;\n  background: #fff;\n  margin-right: 20px;\n  border-radius: 5px;\n  padding: 20px 0;\n}\n.user-top-left .img-box {\n  width: 100%;\n  margin-bottom: 15px;\n}\n.user-top-left .img-box img {\n  width: 80px;\n  margin: 0 auto;\n  border-radius: 5px;\n}\n.user-top-left .username-info {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.user-top-left .username-info a {\n  color: #242424;\n  font-size: 18px;\n  line-height: 24px;\n  font-weight: 700;\n  text-align: center;\n}\n.user-top-left .username-info a:hover {\n  color: #007bff;\n}\n.user-top-left .autograph-info {\n  text-align: center;\n  color: #808080;\n  font-size: 12px;\n  line-height: 18px;\n  margin-bottom: 20px;\n}\n.user-top-left .btn-area {\n  padding: 0 20px;\n}\n.user-top-left .btn-area .btn-default {\n  display: block;\n  height: 40px;\n  line-height: 38px;\n  text-align: center;\n  width: 100%;\n  font-size: 14px;\n  border-radius: 5px;\n}\n.user-top-left .btn-area .btn-follow {\n  color: #fff;\n  background: #007bff;\n  border: 1px solid #007bff;\n}\n.user-top-left .btn-area .btn-follow:hover {\n  background: #005bbd;\n  border: 1px solid #005bbd;\n}\n/* 关注右侧 */\n.user-top-right {\n  flex: 1;\n  background: #fff;\n  border-radius: 5px;\n  padding: 15px;\n}\n.user-top-right .user-tab {\n  display: flex;\n  flex-wrap: wrap;\n}\n.user-top-right .user-tab .num {\n  width: 25%;\n  padding: 28px 0;\n}\n/* 关注底部 */\n.user-follow-bottom {\n  background: #fff;\n  border-radius: 5px;\n  padding: 15px 20px;\n  margin-bottom: 10px;\n}\n.tab-hd {\n  display: flex;\n  flex-wrap: wrap;\n  border-bottom: 1px solid #e1e1e1;\n  margin-bottom: 20px;\n}\n.tab-hd li {\n  margin-right: 10px;\n  position: relative;\n}\n.tab-hd li.active:after {\n  content: \"\";\n  width: 100%;\n  height: 3px;\n  background: #007bff;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n}\n.tab-hd li.active a {\n  font-weight: 700;\n  color: #007bff;\n}\n.tab-hd li a {\n  color: #242424;\n  font-size: 16px;\n  line-height: 36px;\n  padding: 0 10px;\n}\n.tab-item-follow .follow-list {\n  width: 100%;\n  border-top: 1px solid #f1f1f1;\n}\n.follow-list-item {\n  padding-top: 10px;\n  padding-bottom: 20px;\n  border-bottom: 1px solid #f1f1f1;\n}\n.follow-list-item > p {\n  color: #8590a6;\n  font-size: 14px;\n  line-height: 30px;\n}\n.follow-list-item > p span {\n  float: right;\n}\n.follow-list-item h3 {\n  margin-bottom: 10px;\n}\n.follow-list-item h3 a {\n  display: block;\n  font-size: 20px;\n  line-height: 30px;\n  font-weight: 700;\n  color: #242424;\n}\n.follow-list-item .user-top {\n  display: flex;\n  margin-bottom: 15px;\n}\n.follow-list-item .user-top .img-box {\n  height: 40px;\n  border-radius: 3px;\n  overflow: hidden;\n  margin-right: 20px;\n}\n.follow-list-item .user-top img {\n  width: 40px;\n  height: 40px;\n  border-radius: 5px;\n}\n.follow-list-item .user-top h4 {\n  font-size: 14px;\n  font-weight: 700;\n  line-height: 20px;\n}\n.follow-list-item .user-top p {\n  font-size: 14px;\n  line-height: 20px;\n}\n.follow-list-item .list-content {\n  display: flex;\n}\n.follow-list-item .list-content .img-box {\n  height: 150px;\n  margin-right: 20px;\n}\n.follow-list-item .list-content img {\n  height: 150px;\n}\n.follow-list-item .list-content .cont {\n  color: #444;\n  font-size: 14px;\n  line-height: 30px;\n}\n</style>\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    <div class=\"user-follow-top\">\n      <div class=\"user-top-left user-card\">\n        <div class=\"img-box\">\n          <a href=\"#\" title=\"登录\"><img src=\"images/user.png\" alt=\"\"></a>\n        </div>\n        <div class=\"username-info\">\n          <a href=\"#\" title=\"登录\">她的主页</a>\n        </div>\n        <div class=\"autograph-info\">\n          她的个性签名\n        </div>\n        <div class=\"btn-area\">\n          <a href=\"#\" class=\"btn-default btn-follow\"><i class=\"iconfont iconguanzhu2\"></i> 关注</a>\n        </div>\n      </div>\n      <div class=\"user-top-right\">\n        <div class=\"user-tab\">\n          <div class=\"num\">\n            <a href=\"#\" title=\"\">\n              <h4>21</h4>\n              <p>文章</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"#\" title=\"\">\n              <h4>0</h4>\n              <p>商品</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"#\" title=\"\">\n              <h4>10</h4>\n              <p>关注</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"#\" title=\"\">\n              <h4>23</h4>\n              <p>粉丝</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"#\" title=\"\">\n              <h4>123</h4>\n              <p>收藏</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"#\" title=\"\">\n              <h4>3</h4>\n              <p>评论</p>\n            </a>\n          </div>\n          <div class=\"num\">\n            <a href=\"#\" title=\"\">\n              <h4>3</h4>\n              <p>点赞</p>\n            </a>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class=\"user-follow-bottom\">\n      <div class=\"tab-hd\">\n        <li class=\"active\"><a href=\"#\" title=\"文章\">文章</a></li>\n        <li><a href=\"#\" title=\"评论\">评论</a></li>\n        <li><a href=\"#\" title=\"商品\">商品</a></li>\n      </div>\n      <div class=\"tab-bd\">\n        <div class=\"tab-item-follow\">\n          <ul class=\"follow-list\">\n            <li>\n              <div class=\"follow-list-item\">\n                <p>发表了文章 <span>1天前</span></p>\n                <h3><a href=\"#\" title=\"不管在哪里，都好希望身边的人是你\">不管在哪里，都好希望身边的人是你</a></h3>\n                <div class=\"user-top\">\n                  <div class=\"img-box\">\n                    <img src=\"images/user.png\" alt=\"\">\n                  </div>\n                  <div class=\"user-name\">\n                    <h4>她</h4>\n                    <p>她的个性签名</p>\n                  </div>\n                </div>\n                <div class=\"list-content\">\n                  <div class=\"img-box\">\n                    <img src=\"images/article.jpg\" alt=\"\">\n                  </div>\n                  <div class=\"cont\">\n                    大胖墩这两天去景德镇出差，参加一个会议，主办方带着他们参观了当地的瓷器城，我几乎是跟着他游览了个遍。 弹古筝的少女，梳着小辫子吹笛子的少年，清澈的人工湖和绒绒的让人想躺上去打滚的绿草地，全都一一拍下来给大胖墩这两天去景德镇出差，参加一个会议，主办方带着他们参观了当地的瓷器城，我几乎是跟着他游览了个遍。 弹古筝的少女，梳着小辫子吹笛子的少年，清澈的人工湖和绒绒的让人想躺上去打滚的绿草地，全都一一拍下来给\n                  </div>\n                </div>\n              </div>\n            </li>\n            <li>\n              <div class=\"follow-list-item\">\n                <p>发表了文章 <span>10天前</span></p>\n                <h3><a href=\"#\" title=\"不管在哪里，都好希望身边的人是你\">不管在哪里，都好希望身边的人是你</a></h3>\n                <div class=\"user-top\">\n                  <div class=\"img-box\">\n                    <img src=\"images/user.png\" alt=\"\">\n                  </div>\n                  <div class=\"user-name\">\n                    <h4>她</h4>\n                    <p>她的个性签名</p>\n                  </div>\n                </div>\n                <div class=\"list-content\">\n                  <div class=\"img-box\">\n                    <img src=\"images/article.jpg\" alt=\"\">\n                  </div>\n                  <div class=\"cont\">\n                    大胖墩这两天去景德镇出差，参加一个会议，主办方带着他们参观了当地的瓷器城，我几乎是跟着他游览了个遍。 弹古筝的少女，梳着小辫子吹笛子的少年，清澈的人工湖和绒绒的让人想躺上去打滚的绿草地，全都一一拍下来给大胖墩这两天去景德镇出差，参加一个会议，主办方带着他们参观了当地的瓷器城，我几乎是跟着他游览了个遍。 弹古筝的少女，梳着小辫子吹笛子的少年，清澈的人工湖和绒绒的让人想躺上去打滚的绿草地，全都一一拍下来给\n                  </div>\n                </div>\n              </div>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n<footer>\n  <div class=\"copyright\">\n    <p><span>Copyright &copy; 2019-2099</span><span><a href=\"#\" title=\"ICP备案号\">京ICP备100001234523号</a></span><span>Theme By Shubinqi</span></p>\n  </div>\n</footer>\n\n<script src=\"js/user.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/register.html",
    "content": "<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n  <meta charset=\"UTF-8\">\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\r\n  {include=\"user/style\"}\r\n  <title>个人中心-未登录</title>\r\n</head>\r\n<body>\r\n\r\n<header>\r\n  <div class=\"container\">\r\n    <div class=\"brand\">\r\n      <a href=\"{$webconf['domain']}/\" class=\"logo\"><i class=\"iconfont iconhome\"></i> 返回网站</a>\r\n    </div>\r\n    <div class=\"user-center\">\r\n      <ul class=\"unlogin\">\r\n        <li><a href=\"{fun U('login/index')}\" title=\"登录\">登录</a></li>\r\n        <li><a href=\"{fun U('login/register')}\" title=\"注册\">注册</a></li>\r\n      </ul>\r\n      <ul class=\"user-login\" style=\"display: none;\">\r\n        <li class=\"user-message\"><a href=\"#\" title=\"消息\"><i class=\"iconfont iconxinxi\"></i> <span>2</span></a></li>\r\n        <li class=\"user-icon\">\r\n          <a href=\"{fun U('login/index')}\" title=\"我的\"><img src=\"images/login.png\" alt=\"\"></a>\r\n          <ul class=\"user-menu\">\r\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a></li>\r\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的关注\">我的关注</a></li>\r\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\r\n            <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\r\n            <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\r\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\r\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\r\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的钱包\">我的钱包</a></li>\r\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\r\n            <li><a href=\"{fun U('login/index')}\" title=\"我的订单\">我的订单</a></li>\r\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\r\n            <li><a href=\"{fun U('login/index')}\" title=\"退出登录\">退出登录</a></li>\r\n          </ul>\r\n        </li>\r\n      </ul>\r\n    </div>\r\n  </div>\r\n</header>\r\n\r\n<div class=\"no-login-page page\">\r\n  <div class=\"container clearfix\">\r\n    <div class=\"user-left hidden-sm\">\r\n      <div class=\"user-card\">\r\n        <div class=\"img-box\">\r\n          <a href=\"{fun U('login/index')}\" title=\"去登录\"><img src=\"{$common}user/images/no-login.png\" alt=\"\"></a>\r\n        </div>\r\n        <div class=\"username-info\">\r\n          <a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a>\r\n        </div>\r\n        <div class=\"autograph-info\">\r\n          个性签名\r\n        </div>\r\n        <div class=\"btn-area\">\r\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-release\">发布文章</a><br>\r\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-sign-out\">退出登录</a>\r\n        </div>\r\n      </div>\r\n      <ul class=\"user-list\">\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的关注\" class=\"bt1\">我的关注</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"我的钱包\" class=\"bt1\">我的钱包</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"订单管理\">订单管理</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"资料与账号\" class=\"bt1\">资料与账号</a></li>\r\n        <li><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\r\n        <li><a href=\"{$webconf['domain']}/\" title=\"返回主页\" class=\"bt1\">返回主页</a></li>\r\n      </ul>\r\n    </div>\r\n    <div class=\"user-right\">\r\n      {include=\"user/tips\"}\r\n        <div class=\"user-content\">\r\n        <h2>会员注册</h2>\r\n        <form method=\"POST\" onsubmit=\"return checkreg()\" class=\"user-form\">\r\n          <input type=\"hidden\" name=\"pid\" value=\"{$invite}\">\r\n          <div class=\"form-control\">\r\n            <label for=\"\">手机号：</label>\r\n            <input type=\"text\" name=\"tel\" id=\"tel\" value=\"\" placeholder=\"请输入手机号\">\r\n          </div>\r\n          <div class=\"form-control\">\r\n            <label for=\"\">邮箱：</label>\r\n            <input type=\"email\" name=\"email\" id=\"email\" value=\"\" placeholder=\"请输入邮箱，用于找回密码\">\r\n          </div>\r\n          <div class=\"form-control\">\r\n            <label for=\"\">密码：</label>\r\n            <input type=\"password\" value=\"\" id=\"password\" name=\"password\" placeholder=\"请输入您的密码\">\r\n          </div>\r\n          <div class=\"form-control\">\r\n            <label for=\"\">重复密码：</label>\r\n            <input type=\"password\" value=\"\" id=\"repassword\" name=\"repassword\" placeholder=\"请输入您的密码\">\r\n          </div>\r\n          <div class=\"form-control\">\r\n            <label for=\"\">验证码：</label>\r\n            <input type=\"text\" value=\"\" name=\"vercode\" id=\"yzm\" placeholder=\"请输入验证码\">\r\n            <img src=\"{fun U('common/vercode',['code_name'=>'reg_vercode'])}\" onclick=\"this.src=this.src+'?'+Math.random()\" style=\"height:50px;\"/>\r\n          </div>\r\n          <div class=\"form-group\">\r\n              <div style=\"margin-left: 80px;height: 50px;\">\r\n              \r\n              <a  href=\"{fun U('login/index')}\">已有账号？立即登录</a>\r\n              </div>\r\n          </div>\r\n          <div class=\"form-control\">\r\n            <label for=\"submit\"></label>\r\n            <input type=\"submit\" name=\"submit\" value=\"注册\">\r\n          </div>\r\n         \r\n        </form>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n{include=\"user/footer\"}\r\n<script>\r\n\r\n\r\n\r\nfunction checkreg(){\r\n  if($.trim($(\"#yzm\").val())=='' || $.trim($(\"#yzm\").val())==''){\r\n    alert('验证码不能为空~');\r\n    return false;\r\n  }\r\n  if($.trim($(\"#tel\").val())=='' || $.trim($(\"#password\").val())==''){\r\n    alert('账号密码不能为空~');\r\n    return false;\r\n  }\r\n  if($.trim($(\"#password\").val())!=$.trim($(\"#repassword\").val())){\r\n    alert('两次密码不同~');\r\n    return false;\r\n  }\r\n  \r\n  return true;\r\n\r\n}\r\n\r\n</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "static/cms/user/reset_password.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>个人中心-未登录</title>\n</head>\n<body>\n\n<header>\n  <div class=\"container\">\n    <div class=\"brand\">\n      <a href=\"{$webconf['domain']}/\" class=\"logo\"><i class=\"iconfont iconhome\"></i> 返回网站</a>\n    </div>\n    <div class=\"user-center\">\n      <ul class=\"unlogin\">\n        <li><a href=\"{fun U('login/index')}\" title=\"登录\">登录</a></li>\n        <li><a href=\"{fun U('login/register')}\" title=\"注册\">注册</a></li>\n      </ul>\n      <ul class=\"user-login\" style=\"display: none;\">\n        <li class=\"user-message\"><a href=\"#\" title=\"消息\"><i class=\"iconfont iconxinxi\"></i> <span>2</span></a></li>\n        <li class=\"user-icon\">\n          <a href=\"{fun U('login/index')}\" title=\"我的\"><img src=\"images/login.png\" alt=\"\"></a>\n          <ul class=\"user-menu\">\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的关注\">我的关注</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"我的钱包\">我的钱包</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"我的订单\">我的订单</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\n            <li><a href=\"{fun U('login/index')}\" title=\"退出登录\">退出登录</a></li>\n          </ul>\n        </li>\n      </ul>\n    </div>\n  </div>\n</header>\n\n<div class=\"no-login-page page\">\n  <div class=\"container clearfix\">\n    <div class=\"user-left hidden-sm\">\n      <div class=\"user-card\">\n        <div class=\"img-box\">\n          <a href=\"{fun U('login/index')}\" title=\"去登录\"><img src=\"{$common}user/images/no-login.png\" alt=\"\"></a>\n        </div>\n        <div class=\"username-info\">\n          <a href=\"{fun U('login/index')}\" title=\"去登录\">去登录</a>\n        </div>\n        <div class=\"autograph-info\">\n          个性签名\n        </div>\n        <div class=\"btn-area\">\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-release\">发布文章</a><br>\n          <a href=\"{fun U('login/index')}\" class=\"btn-default btn-sign-out\">退出登录</a>\n        </div>\n      </div>\n      <ul class=\"user-list\">\n        <li><a href=\"{fun U('login/index')}\" title=\"我的关注\" class=\"bt1\">我的关注</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的粉丝\">我的粉丝</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的投稿\">我的投稿</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的收藏\">我的收藏</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的喜欢\">我的喜欢</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的评论\">我的评论</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"我的钱包\" class=\"bt1\">我的钱包</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"购物车\">购物车</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"订单管理\">订单管理</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"资料与账号\" class=\"bt1\">资料与账号</a></li>\n        <li><a href=\"{fun U('login/index')}\" title=\"修改密码\">修改密码</a></li>\n        <li><a href=\"{$webconf['domain']}/\" title=\"返回主页\" class=\"bt1\">返回主页</a></li>\n      </ul>\n    </div>\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <h2>重置密码</h2>\n         <form method=\"POST\" class=\"user-form\" onsubmit=\"return checklogin()\">\n          <input name=\"reset\" type=\"hidden\" value=\"{$user['token']}\" />\n          <input name=\"username\" type=\"hidden\" value=\"{$user['username']}\" />\n          <div class=\"form-control\"><label for=\"password\">新密码</label><input class=\"form-control\" type=\"password\" name=\"password\" id=\"password\"></div>\n         \n          <div class=\"form-control\">\n         <label for=\"submit\"></label>\n            <input type=\"submit\" name=\"submit\" value=\"确定\">\n        </div>\n        </form>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n<script>\n\n\n\nfunction checklogin(){\n  if($.trim($(\"#password\").val())==''){\n    alert('新密码不能为空~');\n    return false;\n  }\n  \n  \n  return true;\n\n}\n\n\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/setmsg.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>资料与账号 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <h2>消息提醒设置</h2>\n        <form action=\"\" method=\"POST\" class=\"user-form\">\n           <div class=\"form-control\">\n            <label for=\"\">消息提醒：</label>\n            <div class=\"check-box\"><input type=\"checkbox\" id=\"ismsg\" name=\"ismsg\" value=\"1\" {if($member['ismsg']==1)}checked=\"checked\"{/if} class=\"switch\"></div>\n            <label >关闭消息提醒后，将不会收到以下信息提醒</label>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">评论提醒：</label>\n            <div class=\"check-box\"><input type=\"checkbox\" name=\"iscomment\" value=\"1\" {if($member['iscomment']==1)}checked=\"checked\"{/if} class=\"switch\"></div>\n            <label >关闭评论提醒后，将不会收到评论提醒</label>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">收藏提醒：</label>\n            <div class=\"check-box\"><input type=\"checkbox\" name=\"iscollect\" value=\"1\" {if($member['iscollect']==1)}checked=\"checked\"{/if} class=\"switch\"></div>\n            <label >关闭收藏提醒后，将不会收到收藏提醒</label>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">赞同提醒：</label>\n            <div class=\"check-box\"><input type=\"checkbox\" name=\"islikes\" value=\"1\" {if($member['islikes']==1)}checked=\"checked\"{/if} class=\"switch\"></div>\n            <label >关闭赞同提醒后，将不会收到赞同提醒</label>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">@我提醒：</label>\n            <div class=\"check-box\"><input type=\"checkbox\" name=\"isat\" value=\"1\" {if($member['isat']==1)}checked=\"checked\"{/if} class=\"switch\"></div>\n            <label >关闭@我提醒后，将不会收到@我提醒</label>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">交易提醒：</label>\n            <div class=\"check-box\"><input type=\"checkbox\" name=\"isrechange\" value=\"1\" {if($member['isrechange']==1)}checked=\"checked\"{/if} class=\"switch\"></div>\n            <label >关闭交易提醒后，将不会收到交易提醒</label>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"submit\"></label>\n            <input type=\"submit\" name=\"submit\" value=\"提交\">\n          </div>\n        </form>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/style.html",
    "content": "<link rel=\"stylesheet\" href=\"{$common}layui/css/layui.css\">\n<link rel=\"stylesheet\" href=\"{$common}user/css/reset.css\">\n<link rel=\"stylesheet\" href=\"{$common}user/css/user.css\">\n<link rel=\"stylesheet\" href=\"//at.alicdn.com/t/font_1546140_3tb06o2k3sy.css\">\n<script src=\"{$common}user/js/jquery.min-1.10.2.js\"></script>\n<script src=\"{$common}layui/layui.js\"></script>"
  },
  {
    "path": "static/cms/user/tips.html",
    "content": "<div class=\"user-tips\">\n        <p><i class=\"iconfont iconxiaoxi3\"></i> 欢迎注册本站会员，注册会员后您将享受专属会员服务!包括但不限于专属文章浏览权限，会员投稿权限，在线购物权限，下载会员可见附件等实用功能，欢迎注册体验！</p>\n      </div>"
  },
  {
    "path": "static/cms/user/top.html",
    "content": "<header>\n  <div class=\"container\">\n    <div class=\"brand\">\n      <a href=\"{$webconf['domain']}/\" class=\"logo\"><i class=\"iconfont iconhome\"></i> 返回网站</a>\n    </div>\n    <div class=\"user-center\">\n     \n      <ul class=\"user-login\">\n        <li class=\"user-message\"><a href=\"{fun U('user/notify')}\" title=\"消息\"><i class=\"iconfont iconxinxi\"></i> <span id=\"notifiy-num\">{fun has_no_read_msg()}</span></a></li>\n        <li class=\"user-icon\">\n          <a title=\"我的\"><img src=\"{if(!$member['litpic'])}{$common}user/images/login.png{else}{$member['litpic']}{/if}\" alt=\"\"></a>\n          <ul class=\"user-menu\">\n            <li class=\"bt1\"><a href=\"{fun U('user/userinfo')}\" title=\"资料与账户\">资料与账户</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('user/follow')}\" title=\"我的关注\">我的关注</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('user/fans')}\" title=\"我的粉丝\">我的粉丝</a></li>\n            <li><a href=\"{fun U('user/posts')}\" title=\"我的投稿\">我的投稿</a></li>\n            <li><a href=\"{fun U('user/collect')}\" title=\"我的收藏\">我的收藏</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('user/likes')}\" title=\"我的喜欢\">我的喜欢</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('user/comment')}\" title=\"我的评论\">我的评论</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('user/wallet')}\" title=\"我的钱包\">我的钱包</a></li>\n            <li class=\"hidden-md\"><a href=\"{fun U('user/cart')}\" title=\"购物车\">购物车</a></li>\n            <li><a href=\"{fun U('user/orders')}\" title=\"我的订单\">我的订单</a></li>\n            <li class=\"bt1\"><a href=\"{fun U('user/userinfo')}\" title=\"修改密码\">修改密码</a></li>\n            <li><a href=\"{fun U('login/loginout')}\" title=\"退出登录\">退出登录</a></li>\n          </ul>\n        </li>\n      </ul>\n    </div>\n  </div>\n</header>"
  },
  {
    "path": "static/cms/user/userinfo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>资料与账号 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"user-content\">\n        <h2>资料与账号</h2>\n        <form action=\"\" method=\"POST\" onsubmit=\"return checkform()\" id=\"jizhiform\" class=\"user-form\">\n          <input type=\"hidden\" name=\"csrfkey\" value=\"{$csrfkey}\">\n          <span id=\"fields_ext\"></span>\n          <div class=\"form-control\">\n            <label for=\"password\">新密码：</label>\n            <div class=\"form-password\">\n              <input type=\"password\" class=\"password1\" name=\"password\" id=\"t_password\" value=\"\" placeholder=\"如果不修改，请留空\">\n              <i class=\"iconfont iconyanjing\"></i><i class=\"iconfont iconyanjing-guan\"></i>\n            </div>\n          </div>\n          <div class=\"form-control\">\n            <span><label for=\"setpassword\">确认密码：</label></span>\n            <div class=\"form-password\">\n              <input type=\"password\" class=\"password1\" name=\"repassword\" id=\"t_repassword\" value=\"\" placeholder=\"如果不修改，请留空\">\n              <i class=\"iconfont iconyanjing\"></i><i class=\"iconfont iconyanjing-guan\"></i>\n            </div>\n          </div>\n          <div class=\"form-control\">\n            <label for=\"\">邀请链接：</label>\n            <input type=\"text\" value=\"{fun U('login/register')}?invite={$member['id']}\" readonly name=\"invite\" id=\"t_invite\" placeholder=\"邀请链接\">\n          </div>\n          <div class=\"form-control\">\n            <label for=\"submit\"></label>\n            <input type=\"submit\" name=\"submit\" value=\"提交\">\n          </div>\n        </form>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n<script type=\"text/javascript\">\nfunction get_fields(tid,id){\n    var id = arguments[1]?arguments[1]:0;\n    $.post(\"{fun U('common/get_fields')}\",{molds:'member',tid:tid,id:id},function(res){\n      if(res.code==0){\n        //默认 res.tpl输出的是layui的模板HTML,可以审核元素查看res里面的内容\n        //$(\"#ext_fields\").html(res.tpl);\n        var html = '';\n        var len = res.fields_list.length;\n        if(len>0){\n          //根据对应的字段，进行HTML设计\n          for(var i=0;i<len;i++){\n            \n          }\n          \n        }\n        $(\"#fields_ext\").html(res.tpl);\n      }\n      \n    },'json');\n  }\n$(function(){\n  get_fields(0,{$member['id']});\n})\nfunction checkform(){\n\n    var password = $.trim($(\"#t_password\").val());\n    var repassword = $.trim($(\"#t_repassword\").val());\n\n    if(password!=repassword){\n      alert('两次密码不同！');$(\"#t_password\").focus();return false;\n    }\n    return true;\n}\n$(document).ready(function(){\n  $(\"#fileid\").change(function(){\n    var form=document.getElementById(\"jizhiform\");\n    var data =new FormData(form);\n\tdata.append('filename','file');\n    $.ajax({\n       url: \"{fun U('user/uploads')}\",//处理图片的文件路径\n       type: \"POST\",//传输方式\n       data: data,\n       dataType:\"json\",//返回格式为json\n       processData: false,  // 告诉jQuery不要去处理发送的数据\n       contentType: false,   // 告诉jQuery不要去设置Content-Type请求头\n       success: function(response){\n        \n        if(response.code==0){\n          \n          var result = '';\n          result +='<img src=\"' + response['url'] + '\" height=\"100\"  />';\n          //$(\"#fileid\").hide();\n         // $(\"#upload_ok\").show();\n          $('.view_img').html(result);\n          $(\"#fileurl\").val(response['url']);\n        }else{\n          alert(response.error);\n        }\n        \n       }\n    });\n    \n  });\n\n  \n});\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/cms/user/wallet.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n  {include=\"user/style\"}\n  <title>我的钱包 - 个人中心</title>\n</head>\n<body>\n\n{include=\"user/top\"}\n\n<div class=\"login-page page\">\n  <div class=\"container clearfix\">\n    {include=\"user/left_nav\"}\n    <div class=\"user-right\">\n      {include=\"user/tips\"}\n      <div class=\"common-tab\">\n          <h2><a class=\"active\">我的钱包</a><a href=\"{fun U('user/buylist',['type'=>1])}\">交易记录</a><a href=\"{fun U('user/buylist',['type'=>2])}\">充值记录</a><a href=\"{fun U('user/buylist',['type'=>3])}\">奖励记录</a></h2>\n      </div>\n      <div class=\"wallet\">\n        <div class=\"wallet-left\">\n          <div class=\"wallet-rmb\">\n            <p class=\"mb10\">总资产(单位：元)</p>\n            <h4>￥{$user['money']} <a href=\"{fun U('user/buy')}\" class=\"fr\">钱包充值 <i class=\"iconfont iconright\"></i></a></h4>\n            <p>累计充值：￥{$cz_money}</p>\n          </div>\n          <div class=\"wallet-jifen\">\n            <p class=\"mb10\">积分</p>\n            <h4>{$user['jifen']} <a href=\"{fun U('user/buy')}\" class=\"fr\">积分充值 <i class=\"iconfont iconright\"></i></a></h4>\n            <p>累计获取：{$cz_jifen}</p>\n          </div>\n        </div>\n        <div class=\"wallet-right\">\n          <h4>FAQ</h4>\n          <p><span>Q:</span><span>如何获取积分？</span></p>\n          <p><span>A:</span>1、每日登录奖励{$webconf['login_award']}积分</p>\n          <p><span></span>2、发布文章奖励{$webconf['release_award_open']}积分{if($webconf['release_max_award'])}，每日上限{$webconf['release_max_award']}分{/if}</p>\n          <p><span></span>3、收藏文章奖励{$webconf['collect_award']}积分{if($webconf['collect_max_award'])}，每日上限{$webconf['collect_max_award']}分{/if}</p>\n          <p><span></span>4、点赞文章奖励{$webconf['likes_award']}积分{if($webconf['likes_max_award'])}，每日上限{$webconf['likes_max_award']}分{/if}</p>\n          <p><span></span>5、评论文章奖励{$webconf['comment_award']}积分{if($webconf['comment_max_award'])}，每日上限{$webconf['comment_max_award']}分{/if}</p>\n          <p><span></span>6、被关注奖励{$webconf['follow_award']}积分{if($webconf['follow_max_award'])}，每日上限{$webconf['follow_max_award']}分{/if}</p>\n          <p><span>Q:</span><span>积分有什么用处？</span></p>\n          <p><span>A:</span>1、通过积分到积分商城进行购物</p>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n{include=\"user/footer\"}\n</body>\n</html>"
  },
  {
    "path": "static/common/clipboard.js",
    "content": "/*!\n * clipboard.js v2.0.6\n * https://clipboardjs.com/\n * \n * Licensed MIT © Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nfunction select(element) {\n    var selectedText;\n\n    if (element.nodeName === 'SELECT') {\n        element.focus();\n\n        selectedText = element.value;\n    }\n    else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n        var isReadOnly = element.hasAttribute('readonly');\n\n        if (!isReadOnly) {\n            element.setAttribute('readonly', '');\n        }\n\n        element.select();\n        element.setSelectionRange(0, element.value.length);\n\n        if (!isReadOnly) {\n            element.removeAttribute('readonly');\n        }\n\n        selectedText = element.value;\n    }\n    else {\n        if (element.hasAttribute('contenteditable')) {\n            element.focus();\n        }\n\n        var selection = window.getSelection();\n        var range = document.createRange();\n\n        range.selectNodeContents(element);\n        selection.removeAllRanges();\n        selection.addRange(range);\n\n        selectedText = selection.toString();\n    }\n\n    return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\nfunction E () {\n  // Keep this empty so it's easier to inherit from\n  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n  on: function (name, callback, ctx) {\n    var e = this.e || (this.e = {});\n\n    (e[name] || (e[name] = [])).push({\n      fn: callback,\n      ctx: ctx\n    });\n\n    return this;\n  },\n\n  once: function (name, callback, ctx) {\n    var self = this;\n    function listener () {\n      self.off(name, listener);\n      callback.apply(ctx, arguments);\n    };\n\n    listener._ = callback\n    return this.on(name, listener, ctx);\n  },\n\n  emit: function (name) {\n    var data = [].slice.call(arguments, 1);\n    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n    var i = 0;\n    var len = evtArr.length;\n\n    for (i; i < len; i++) {\n      evtArr[i].fn.apply(evtArr[i].ctx, data);\n    }\n\n    return this;\n  },\n\n  off: function (name, callback) {\n    var e = this.e || (this.e = {});\n    var evts = e[name];\n    var liveEvents = [];\n\n    if (evts && callback) {\n      for (var i = 0, len = evts.length; i < len; i++) {\n        if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n          liveEvents.push(evts[i]);\n      }\n    }\n\n    // Remove event from queue to prevent memory leak\n    // Suggested by https://github.com/lazd\n    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n    (liveEvents.length)\n      ? e[name] = liveEvents\n      : delete e[name];\n\n    return this;\n  }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar is = __webpack_require__(3);\nvar delegate = __webpack_require__(4);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n    if (!target && !type && !callback) {\n        throw new Error('Missing required arguments');\n    }\n\n    if (!is.string(type)) {\n        throw new TypeError('Second argument must be a String');\n    }\n\n    if (!is.fn(callback)) {\n        throw new TypeError('Third argument must be a Function');\n    }\n\n    if (is.node(target)) {\n        return listenNode(target, type, callback);\n    }\n    else if (is.nodeList(target)) {\n        return listenNodeList(target, type, callback);\n    }\n    else if (is.string(target)) {\n        return listenSelector(target, type, callback);\n    }\n    else {\n        throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n    }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n    node.addEventListener(type, callback);\n\n    return {\n        destroy: function() {\n            node.removeEventListener(type, callback);\n        }\n    }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n    Array.prototype.forEach.call(nodeList, function(node) {\n        node.addEventListener(type, callback);\n    });\n\n    return {\n        destroy: function() {\n            Array.prototype.forEach.call(nodeList, function(node) {\n                node.removeEventListener(type, callback);\n            });\n        }\n    }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n    return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n    return value !== undefined\n        && value instanceof HTMLElement\n        && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n    var type = Object.prototype.toString.call(value);\n\n    return value !== undefined\n        && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n        && ('length' in value)\n        && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n    return typeof value === 'string'\n        || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n    var type = Object.prototype.toString.call(value);\n\n    return type === '[object Function]';\n};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar closest = __webpack_require__(5);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n    var listenerFn = listener.apply(this, arguments);\n\n    element.addEventListener(type, listenerFn, useCapture);\n\n    return {\n        destroy: function() {\n            element.removeEventListener(type, listenerFn, useCapture);\n        }\n    }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n    // Handle the regular Element usage\n    if (typeof elements.addEventListener === 'function') {\n        return _delegate.apply(null, arguments);\n    }\n\n    // Handle Element-less usage, it defaults to global delegation\n    if (typeof type === 'function') {\n        // Use `document` as the first parameter, then apply arguments\n        // This is a short way to .unshift `arguments` without running into deoptimizations\n        return _delegate.bind(null, document).apply(null, arguments);\n    }\n\n    // Handle Selector-based usage\n    if (typeof elements === 'string') {\n        elements = document.querySelectorAll(elements);\n    }\n\n    // Handle Array-like based usage\n    return Array.prototype.map.call(elements, function (element) {\n        return _delegate(element, selector, type, callback, useCapture);\n    });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n    return function(e) {\n        e.delegateTarget = closest(e.target, selector);\n\n        if (e.delegateTarget) {\n            callback.call(element, e);\n        }\n    }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n    var proto = Element.prototype;\n\n    proto.matches = proto.matchesSelector ||\n                    proto.mozMatchesSelector ||\n                    proto.msMatchesSelector ||\n                    proto.oMatchesSelector ||\n                    proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n    while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n        if (typeof element.matches === 'function' &&\n            element.matches(selector)) {\n          return element;\n        }\n        element = element.parentNode;\n    }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(0);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n\n// CONCATENATED MODULE: ./src/clipboard-action.js\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n/**\n * Inner class which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n */\n\nvar clipboard_action_ClipboardAction = function () {\n    /**\n     * @param {Object} options\n     */\n    function ClipboardAction(options) {\n        _classCallCheck(this, ClipboardAction);\n\n        this.resolveOptions(options);\n        this.initSelection();\n    }\n\n    /**\n     * Defines base properties passed from constructor.\n     * @param {Object} options\n     */\n\n\n    _createClass(ClipboardAction, [{\n        key: 'resolveOptions',\n        value: function resolveOptions() {\n            var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n            this.action = options.action;\n            this.container = options.container;\n            this.emitter = options.emitter;\n            this.target = options.target;\n            this.text = options.text;\n            this.trigger = options.trigger;\n\n            this.selectedText = '';\n        }\n\n        /**\n         * Decides which selection strategy is going to be applied based\n         * on the existence of `text` and `target` properties.\n         */\n\n    }, {\n        key: 'initSelection',\n        value: function initSelection() {\n            if (this.text) {\n                this.selectFake();\n            } else if (this.target) {\n                this.selectTarget();\n            }\n        }\n\n        /**\n         * Creates a fake textarea element, sets its value from `text` property,\n         * and makes a selection on it.\n         */\n\n    }, {\n        key: 'selectFake',\n        value: function selectFake() {\n            var _this = this;\n\n            var isRTL = document.documentElement.getAttribute('dir') == 'rtl';\n\n            this.removeFake();\n\n            this.fakeHandlerCallback = function () {\n                return _this.removeFake();\n            };\n            this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;\n\n            this.fakeElem = document.createElement('textarea');\n            // Prevent zooming on iOS\n            this.fakeElem.style.fontSize = '12pt';\n            // Reset box model\n            this.fakeElem.style.border = '0';\n            this.fakeElem.style.padding = '0';\n            this.fakeElem.style.margin = '0';\n            // Move element out of screen horizontally\n            this.fakeElem.style.position = 'absolute';\n            this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';\n            // Move element to the same position vertically\n            var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n            this.fakeElem.style.top = yPosition + 'px';\n\n            this.fakeElem.setAttribute('readonly', '');\n            this.fakeElem.value = this.text;\n\n            this.container.appendChild(this.fakeElem);\n\n            this.selectedText = select_default()(this.fakeElem);\n            this.copyText();\n        }\n\n        /**\n         * Only removes the fake element after another click event, that way\n         * a user can hit `Ctrl+C` to copy because selection still exists.\n         */\n\n    }, {\n        key: 'removeFake',\n        value: function removeFake() {\n            if (this.fakeHandler) {\n                this.container.removeEventListener('click', this.fakeHandlerCallback);\n                this.fakeHandler = null;\n                this.fakeHandlerCallback = null;\n            }\n\n            if (this.fakeElem) {\n                this.container.removeChild(this.fakeElem);\n                this.fakeElem = null;\n            }\n        }\n\n        /**\n         * Selects the content from element passed on `target` property.\n         */\n\n    }, {\n        key: 'selectTarget',\n        value: function selectTarget() {\n            this.selectedText = select_default()(this.target);\n            this.copyText();\n        }\n\n        /**\n         * Executes the copy operation based on the current selection.\n         */\n\n    }, {\n        key: 'copyText',\n        value: function copyText() {\n            var succeeded = void 0;\n\n            try {\n                succeeded = document.execCommand(this.action);\n            } catch (err) {\n                succeeded = false;\n            }\n\n            this.handleResult(succeeded);\n        }\n\n        /**\n         * Fires an event based on the copy operation result.\n         * @param {Boolean} succeeded\n         */\n\n    }, {\n        key: 'handleResult',\n        value: function handleResult(succeeded) {\n            this.emitter.emit(succeeded ? 'success' : 'error', {\n                action: this.action,\n                text: this.selectedText,\n                trigger: this.trigger,\n                clearSelection: this.clearSelection.bind(this)\n            });\n        }\n\n        /**\n         * Moves focus away from `target` and back to the trigger, removes current selection.\n         */\n\n    }, {\n        key: 'clearSelection',\n        value: function clearSelection() {\n            if (this.trigger) {\n                this.trigger.focus();\n            }\n            document.activeElement.blur();\n            window.getSelection().removeAllRanges();\n        }\n\n        /**\n         * Sets the `action` to be performed which can be either 'copy' or 'cut'.\n         * @param {String} action\n         */\n\n    }, {\n        key: 'destroy',\n\n\n        /**\n         * Destroy lifecycle.\n         */\n        value: function destroy() {\n            this.removeFake();\n        }\n    }, {\n        key: 'action',\n        set: function set() {\n            var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';\n\n            this._action = action;\n\n            if (this._action !== 'copy' && this._action !== 'cut') {\n                throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n            }\n        }\n\n        /**\n         * Gets the `action` property.\n         * @return {String}\n         */\n        ,\n        get: function get() {\n            return this._action;\n        }\n\n        /**\n         * Sets the `target` property using an element\n         * that will be have its content copied.\n         * @param {Element} target\n         */\n\n    }, {\n        key: 'target',\n        set: function set(target) {\n            if (target !== undefined) {\n                if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {\n                    if (this.action === 'copy' && target.hasAttribute('disabled')) {\n                        throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n                    }\n\n                    if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n                        throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n                    }\n\n                    this._target = target;\n                } else {\n                    throw new Error('Invalid \"target\" value, use a valid Element');\n                }\n            }\n        }\n\n        /**\n         * Gets the `target` property.\n         * @return {String|HTMLElement}\n         */\n        ,\n        get: function get() {\n            return this._target;\n        }\n    }]);\n\n    return ClipboardAction;\n}();\n\n/* harmony default export */ var clipboard_action = (clipboard_action_ClipboardAction);\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(1);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(2);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n\n// CONCATENATED MODULE: ./src/clipboard.js\nvar clipboard_typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar clipboard_createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\nvar clipboard_Clipboard = function (_Emitter) {\n    _inherits(Clipboard, _Emitter);\n\n    /**\n     * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n     * @param {Object} options\n     */\n    function Clipboard(trigger, options) {\n        clipboard_classCallCheck(this, Clipboard);\n\n        var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));\n\n        _this.resolveOptions(options);\n        _this.listenClick(trigger);\n        return _this;\n    }\n\n    /**\n     * Defines if attributes would be resolved using internal setter functions\n     * or custom functions that were passed in the constructor.\n     * @param {Object} options\n     */\n\n\n    clipboard_createClass(Clipboard, [{\n        key: 'resolveOptions',\n        value: function resolveOptions() {\n            var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n            this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n            this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n            this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n            this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n        }\n\n        /**\n         * Adds a click event listener to the passed trigger.\n         * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n         */\n\n    }, {\n        key: 'listenClick',\n        value: function listenClick(trigger) {\n            var _this2 = this;\n\n            this.listener = listen_default()(trigger, 'click', function (e) {\n                return _this2.onClick(e);\n            });\n        }\n\n        /**\n         * Defines a new `ClipboardAction` on each click event.\n         * @param {Event} e\n         */\n\n    }, {\n        key: 'onClick',\n        value: function onClick(e) {\n            var trigger = e.delegateTarget || e.currentTarget;\n\n            if (this.clipboardAction) {\n                this.clipboardAction = null;\n            }\n\n            this.clipboardAction = new clipboard_action({\n                action: this.action(trigger),\n                target: this.target(trigger),\n                text: this.text(trigger),\n                container: this.container,\n                trigger: trigger,\n                emitter: this\n            });\n        }\n\n        /**\n         * Default `action` lookup function.\n         * @param {Element} trigger\n         */\n\n    }, {\n        key: 'defaultAction',\n        value: function defaultAction(trigger) {\n            return getAttributeValue('action', trigger);\n        }\n\n        /**\n         * Default `target` lookup function.\n         * @param {Element} trigger\n         */\n\n    }, {\n        key: 'defaultTarget',\n        value: function defaultTarget(trigger) {\n            var selector = getAttributeValue('target', trigger);\n\n            if (selector) {\n                return document.querySelector(selector);\n            }\n        }\n\n        /**\n         * Returns the support of the given action, or all actions if no action is\n         * given.\n         * @param {String} [action]\n         */\n\n    }, {\n        key: 'defaultText',\n\n\n        /**\n         * Default `text` lookup function.\n         * @param {Element} trigger\n         */\n        value: function defaultText(trigger) {\n            return getAttributeValue('text', trigger);\n        }\n\n        /**\n         * Destroy lifecycle.\n         */\n\n    }, {\n        key: 'destroy',\n        value: function destroy() {\n            this.listener.destroy();\n\n            if (this.clipboardAction) {\n                this.clipboardAction.destroy();\n                this.clipboardAction = null;\n            }\n        }\n    }], [{\n        key: 'isSupported',\n        value: function isSupported() {\n            var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n\n            var actions = typeof action === 'string' ? [action] : action;\n            var support = !!document.queryCommandSupported;\n\n            actions.forEach(function (action) {\n                support = support && !!document.queryCommandSupported(action);\n            });\n\n            return support;\n        }\n    }]);\n\n    return Clipboard;\n}(tiny_emitter_default.a);\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\n\nfunction getAttributeValue(suffix, element) {\n    var attribute = 'data-clipboard-' + suffix;\n\n    if (!element.hasAttribute(attribute)) {\n        return;\n    }\n\n    return element.getAttribute(attribute);\n}\n\n/* harmony default export */ var clipboard = __webpack_exports__[\"default\"] = (clipboard_Clipboard);\n\n/***/ })\n/******/ ])[\"default\"];\n});"
  },
  {
    "path": "static/common/close.html",
    "content": "<!doctype html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<title>抱歉，站点已暂停</title>\n<style>\nhtml,body,div,h1,*{margin:0;padding:0;}\nbody{\n\tbackground-color:#fefefe;\n\tcolor:#333\n}\n.box{\n\twidth:580px;\n\tmargin:0 auto;\n}\nh1{\n\tfont-size:20px;\n\ttext-align:center; \n\tbackground:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAQAAABpN6lAAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAH+UlEQVR42uyde3AV1RnAfyFpTCBpFIVoaxUpSQSEAezwMDUJRK11DOTDAjJTtPRBBx1bK/VRO7T1VdFCRx6j6DgjltaamcIJWBpICRg0MFjGio6BRGKp4iOUMtBEkiBJ+ocxzQ17957de3bv3WY//mDYc75zzve73549z4+Ubga2DCIEEAIIAYQAQgAhgBBACCAEEAIIAYQAQgAhgBBACCAEEAIIAYQAQgADR9L8q0pyGUM+BRRwIVlkk00mp2ilhRaaaaCBRupVs78AUrzfF5ChlFBKKQVa2RuooYaX1fH/AwCSgfAdrnHxonWxneeoVO2BBSBj+BHzODeuQk5QwSpVHzgAMo6l3GSog+1iAw+ptwIDQPJZRjkpRgvtRnGfeifpAUgGP+NezvHkp+rgMR413ycYBCDX8hRf9bTHOsRt6q9JCUDSeJQlhh3f+mVYzv3qTJIBkIup4Crfxi6vcrP6IIkAyNVs5AJfh2/HmK1eSZK5gJRR7bP5cAHb5MakACC3sJGMBMxhMlGyIOEAZBHr/JxO9ZvGPS8/SGgfILPYQGpC57KdzFabEwRACtmeEOePlDZK1Z4EAJBR7GVoUqxoHGeKOuRzHyDpVCSJ+TCUFyXd707wN0wieeRKHvP1FZCZbCLZpEz92ScAkkMDuZqZD7CTowxnBpc7fK+3cJghTKBE00ebKVAn3X1NncrDmuYf4YfqL33Gi09zkZbeaR5kuero0cvjaaZraOXyAHf64AEygX1a3/5/UKzej9AcSS0Xx9Rrp1xti9BLZR3f1qjxDJPcrBs57QTXaJl/mvJI80G9yzy6Ymr+ONJ8UJ0s5G9avrzG86+AfJNCrYxPqDfPfqh281wMvT3qGQu9M+gNeYvkWq894OdaubpYFSVlZQzN31o/VvupMdg+twCkRPP3fyPacoV6iw9t3+KtUdNe0qq5WAq99ID7NfO9bpP2d5u0g6o1atpeoz7qBoCMRPcNO+YyrdllWl+5Xi7xygNu0c6Z6jJtkEu9iM86CzwBIE4KHm6TNsx2MOOuTLc/lCMPKGSkdpmTbTB+zUbvcsmJmjZVu/Z8meoFgHIHZY6WvKhmnG/bljIj9Zd7AaDEkV/dFeX5T2LoLRHL9sg0rnZQ+3TjAORcJjoCsEgstknkOubE0JvAEgu9DJ51tj4gXzTtAUUOR4yD+FP/10DG8gcNzV/Lt/rppVPBGEe1p1JkGoDj8RUXUSdzJeXzzk/ms0tr+ySNP8ojktkH28vMdFy7g/ZqTYdlk4tGfDYp3sG/GEYpIxzptVDFYQYziWmuNlwrlZhdEMnHnVzG91zpZTOXeCTfqAdIKqdIJ0jSwWDVZa4PuDRg5sM5XGqyExxO8GSYSQBZAQSQbRJAdgABZA10DzAKICOAADJNAmgLIIA2kwBaAwigdaADaAk9wCCAowEEcNQkgH9yOmDmd/CeQQCqk3cDBqBJdyqkuyDSGDAADtqrtx5wwOWCSKR8yiEOUE89H9HS8yeNLIYwhGxGkMco8hitP4iJKgdNA6iLqzndvMk2tlKnrPqSEz1/1/asPqQzjRmUMpkvuK7xVf2sektiORx3eZ6siSd5QX3sXFGGcSvf17xqFymdDFX/MQoAZB9XOm7IVlZTpeI6jy9F/NRmu8RaXlNTTL8CsNMhgD0sie8Ia88XaBe7ZDKro2+3WcgOJzXoOnalo2HobRSaML8HwmtM5Q4HUzJHpxi1T4lJk+b26H7meHHBTcayWasFjcpRv6F/TnA9v9TItYV56pOoRgxiFOP4Cl8il8FkkM6ntNPOMT7iQw7ytjoV1Q/elilU2e4ufya/cwZW3wNG0hTbW5mjOi21x3MD32Ayg231u2ikhmq2W4OQ86hlXIxP7gj1nicAQKpjHJLZw/TPT3j20cplIQsc7u59wibWU332gFZGsM92i71K3eCRB4CUsNMm+QTj+x+OlIncw02uBzSHWcva/ieAZS4VNjpfV3WeAQCps7kdeKda2a/TWkb8N7tOsorHI0+P2XhirSpxWoGz8d0jNvPvtX2aOESeYD8mLrblsJSmfvfDfuWifWY8wMYHHlf39ua5it9zmeGv4FYW/m9ALfWMtsjziipyXrDTEf7tWPby9J4NlbuoNW4+XM9+uab3X82WM4Db3RTsEIB6g6csE4oBJE2eYYVHNwmHUyWLACTFcvt7jbsgC25ujDRabpfOYgsvxLmvH1vuZgVLeeCs565vjJi7M9TN+1yC9/IBX7Z4OlO95K44F7N8tZnVVih9MR9L81e6Nd/ttbm7bU99+y2vc497Zbc3R/PYy3lJYX4ibo6Ceocy2pPA/DbK4jE/juvzqo75dCXY/E7mq93xFRFH/ABVyWIS+V+UdLNYxX2HNc4YInIrzyYohMIZvqvWx19M3EFUZCYVCThD0sY8958+owBAithou0hhXpIpigyoXUxgt4/m72aiKfMNhdRURyhmhU8d33KK1RFzBZqMJXYdT3ocS6yJxaZjiRkMqqqquYKHPTtM0cFDXGHafC/iCRawjFnG4wlWcp/y5JSCNxElx/MLZhuC0M0GHgxQRMleCGO5g5vJiauQk7wYyJiivRAyERYyw1VU2RrWsTHAUWX7YDif6ZQyQ/MiSyM17GCn+rc/g4oU/2YzciFjKOiNLJ1FNpm00UIrLXxMIw00UO/mNElAACSnhNHlQwAhgBBACCAEEAIIAYQAQgAhgBDAgJT/DgDyxCJjaj0UmAAAAABJRU5ErkJggg==) no-repeat top center; \n\tpadding-top:160px;\n\tmargin-top:30%;\n\tfont-weight:normal;\n}\n\n</style>\n</head>\n\n<body>\n<div class=\"box\">\n<h1>{if($webconf['closetip'])}{$webconf['closetip']}{else}抱歉！该站点已经被管理员停止运行，请联系管理员了解详情！{/if}</h1>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "static/common/layui/css/layui.css",
    "content": ".layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}a,body{color:#333}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-edge,hr{height:0;overflow:hidden}.layui-layout-body,.layui-side,.layui-side-scroll{overflow-x:hidden}.layui-edge,.layui-elip,hr{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-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{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}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}body{line-height:1.6;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{line-height:0;margin:10px 0;padding:0;border:none!important;border-bottom:1px solid #eee!important;clear:both;background:0 0}a{text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-btn,.layui-btn-group,.layui-edge{display:inline-block}.layui-edge{width:0;border-width:6px;border-style:dashed;border-color:transparent}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;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-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) 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-icon-reply-fill:before{content:\"\\e611\"}.layui-icon-set-fill:before{content:\"\\e614\"}.layui-icon-menu-fill:before{content:\"\\e60f\"}.layui-icon-search:before{content:\"\\e615\"}.layui-icon-share:before{content:\"\\e641\"}.layui-icon-set-sm:before{content:\"\\e620\"}.layui-icon-engine:before{content:\"\\e628\"}.layui-icon-close:before{content:\"\\1006\"}.layui-icon-close-fill:before{content:\"\\1007\"}.layui-icon-chart-screen:before{content:\"\\e629\"}.layui-icon-star:before{content:\"\\e600\"}.layui-icon-circle-dot:before{content:\"\\e617\"}.layui-icon-chat:before{content:\"\\e606\"}.layui-icon-release:before{content:\"\\e609\"}.layui-icon-list:before{content:\"\\e60a\"}.layui-icon-chart:before{content:\"\\e62c\"}.layui-icon-ok-circle:before{content:\"\\1005\"}.layui-icon-layim-theme:before{content:\"\\e61b\"}.layui-icon-table:before{content:\"\\e62d\"}.layui-icon-right:before{content:\"\\e602\"}.layui-icon-left:before{content:\"\\e603\"}.layui-icon-cart-simple:before{content:\"\\e698\"}.layui-icon-face-cry:before{content:\"\\e69c\"}.layui-icon-face-smile:before{content:\"\\e6af\"}.layui-icon-survey:before{content:\"\\e6b2\"}.layui-icon-tree:before{content:\"\\e62e\"}.layui-icon-ie:before{content:\"\\e7bb\"}.layui-icon-upload-circle:before{content:\"\\e62f\"}.layui-icon-add-circle:before{content:\"\\e61f\"}.layui-icon-download-circle:before{content:\"\\e601\"}.layui-icon-templeate-1:before{content:\"\\e630\"}.layui-icon-util:before{content:\"\\e631\"}.layui-icon-face-surprised:before{content:\"\\e664\"}.layui-icon-edit:before{content:\"\\e642\"}.layui-icon-speaker:before{content:\"\\e645\"}.layui-icon-down:before{content:\"\\e61a\"}.layui-icon-file:before{content:\"\\e621\"}.layui-icon-layouts:before{content:\"\\e632\"}.layui-icon-rate-half:before{content:\"\\e6c9\"}.layui-icon-add-circle-fine:before{content:\"\\e608\"}.layui-icon-prev-circle:before{content:\"\\e633\"}.layui-icon-read:before{content:\"\\e705\"}.layui-icon-404:before{content:\"\\e61c\"}.layui-icon-carousel:before{content:\"\\e634\"}.layui-icon-help:before{content:\"\\e607\"}.layui-icon-code-circle:before{content:\"\\e635\"}.layui-icon-windows:before{content:\"\\e67f\"}.layui-icon-water:before{content:\"\\e636\"}.layui-icon-username:before{content:\"\\e66f\"}.layui-icon-find-fill:before{content:\"\\e670\"}.layui-icon-about:before{content:\"\\e60b\"}.layui-icon-location:before{content:\"\\e715\"}.layui-icon-up:before{content:\"\\e619\"}.layui-icon-pause:before{content:\"\\e651\"}.layui-icon-date:before{content:\"\\e637\"}.layui-icon-layim-uploadfile:before{content:\"\\e61d\"}.layui-icon-delete:before{content:\"\\e640\"}.layui-icon-play:before{content:\"\\e652\"}.layui-icon-top:before{content:\"\\e604\"}.layui-icon-firefox:before{content:\"\\e686\"}.layui-icon-friends:before{content:\"\\e612\"}.layui-icon-refresh-3:before{content:\"\\e9aa\"}.layui-icon-ok:before{content:\"\\e605\"}.layui-icon-layer:before{content:\"\\e638\"}.layui-icon-face-smile-fine:before{content:\"\\e60c\"}.layui-icon-dollar:before{content:\"\\e659\"}.layui-icon-group:before{content:\"\\e613\"}.layui-icon-layim-download:before{content:\"\\e61e\"}.layui-icon-picture-fine:before{content:\"\\e60d\"}.layui-icon-link:before{content:\"\\e64c\"}.layui-icon-diamond:before{content:\"\\e735\"}.layui-icon-log:before{content:\"\\e60e\"}.layui-icon-key:before{content:\"\\e683\"}.layui-icon-rate-solid:before{content:\"\\e67a\"}.layui-icon-fonts-del:before{content:\"\\e64f\"}.layui-icon-unlink:before{content:\"\\e64d\"}.layui-icon-fonts-clear:before{content:\"\\e639\"}.layui-icon-triangle-r:before{content:\"\\e623\"}.layui-icon-circle:before{content:\"\\e63f\"}.layui-icon-radio:before{content:\"\\e643\"}.layui-icon-align-center:before{content:\"\\e647\"}.layui-icon-align-right:before{content:\"\\e648\"}.layui-icon-align-left:before{content:\"\\e649\"}.layui-icon-loading-1:before{content:\"\\e63e\"}.layui-icon-return:before{content:\"\\e65c\"}.layui-icon-fonts-strong:before{content:\"\\e62b\"}.layui-icon-upload:before{content:\"\\e67c\"}.layui-icon-dialogue:before{content:\"\\e63a\"}.layui-icon-video:before{content:\"\\e6ed\"}.layui-icon-headset:before{content:\"\\e6fc\"}.layui-icon-cellphone-fine:before{content:\"\\e63b\"}.layui-icon-add-1:before{content:\"\\e654\"}.layui-icon-face-smile-b:before{content:\"\\e650\"}.layui-icon-fonts-html:before{content:\"\\e64b\"}.layui-icon-screen-full:before{content:\"\\e622\"}.layui-icon-form:before{content:\"\\e63c\"}.layui-icon-cart:before{content:\"\\e657\"}.layui-icon-camera-fill:before{content:\"\\e65d\"}.layui-icon-tabs:before{content:\"\\e62a\"}.layui-icon-heart-fill:before{content:\"\\e68f\"}.layui-icon-fonts-code:before{content:\"\\e64e\"}.layui-icon-ios:before{content:\"\\e680\"}.layui-icon-at:before{content:\"\\e687\"}.layui-icon-fire:before{content:\"\\e756\"}.layui-icon-set:before{content:\"\\e716\"}.layui-icon-fonts-u:before{content:\"\\e646\"}.layui-icon-triangle-d:before{content:\"\\e625\"}.layui-icon-tips:before{content:\"\\e702\"}.layui-icon-picture:before{content:\"\\e64a\"}.layui-icon-more-vertical:before{content:\"\\e671\"}.layui-icon-bluetooth:before{content:\"\\e689\"}.layui-icon-flag:before{content:\"\\e66c\"}.layui-icon-loading:before{content:\"\\e63d\"}.layui-icon-fonts-i:before{content:\"\\e644\"}.layui-icon-refresh-1:before{content:\"\\e666\"}.layui-icon-rmb:before{content:\"\\e65e\"}.layui-icon-addition:before{content:\"\\e624\"}.layui-icon-home:before{content:\"\\e68e\"}.layui-icon-time:before{content:\"\\e68d\"}.layui-icon-user:before{content:\"\\e770\"}.layui-icon-notice:before{content:\"\\e667\"}.layui-icon-chrome:before{content:\"\\e68a\"}.layui-icon-edge:before{content:\"\\e68b\"}.layui-icon-login-weibo:before{content:\"\\e675\"}.layui-icon-voice:before{content:\"\\e688\"}.layui-icon-upload-drag:before{content:\"\\e681\"}.layui-icon-login-qq:before{content:\"\\e676\"}.layui-icon-snowflake:before{content:\"\\e6b1\"}.layui-icon-heart:before{content:\"\\e68c\"}.layui-icon-logout:before{content:\"\\e682\"}.layui-icon-file-b:before{content:\"\\e655\"}.layui-icon-template:before{content:\"\\e663\"}.layui-icon-transfer:before{content:\"\\e691\"}.layui-icon-auz:before{content:\"\\e672\"}.layui-icon-console:before{content:\"\\e665\"}.layui-icon-app:before{content:\"\\e653\"}.layui-icon-prev:before{content:\"\\e65a\"}.layui-icon-website:before{content:\"\\e7ae\"}.layui-icon-next:before{content:\"\\e65b\"}.layui-icon-component:before{content:\"\\e857\"}.layui-icon-android:before{content:\"\\e684\"}.layui-icon-more:before{content:\"\\e65f\"}.layui-icon-login-wechat:before{content:\"\\e677\"}.layui-icon-shrink-right:before{content:\"\\e668\"}.layui-icon-spread-left:before{content:\"\\e66b\"}.layui-icon-camera:before{content:\"\\e660\"}.layui-icon-note:before{content:\"\\e66e\"}.layui-icon-refresh:before{content:\"\\e669\"}.layui-icon-female:before{content:\"\\e661\"}.layui-icon-male:before{content:\"\\e662\"}.layui-icon-screen-restore:before{content:\"\\e758\"}.layui-icon-password:before{content:\"\\e673\"}.layui-icon-senior:before{content:\"\\e674\"}.layui-icon-theme:before{content:\"\\e66a\"}.layui-icon-tread:before{content:\"\\e6c5\"}.layui-icon-praise:before{content:\"\\e6c6\"}.layui-icon-star-fill:before{content:\"\\e658\"}.layui-icon-rate:before{content:\"\\e67b\"}.layui-icon-template-1:before{content:\"\\e656\"}.layui-icon-vercode:before{content:\"\\e679\"}.layui-icon-service:before{content:\"\\e626\"}.layui-icon-cellphone:before{content:\"\\e678\"}.layui-icon-print:before{content:\"\\e66d\"}.layui-icon-cols:before{content:\"\\e610\"}.layui-icon-wifi:before{content:\"\\e7e0\"}.layui-icon-export:before{content:\"\\e67d\"}.layui-icon-rss:before{content:\"\\e808\"}.layui-icon-slider:before{content:\"\\e714\"}.layui-icon-email:before{content:\"\\e618\"}.layui-icon-subtraction:before{content:\"\\e67e\"}.layui-icon-mike:before{content:\"\\e6dc\"}.layui-icon-light:before{content:\"\\e748\"}.layui-icon-gift:before{content:\"\\e627\"}.layui-icon-mute:before{content:\"\\e685\"}.layui-icon-reduce-circle:before{content:\"\\e616\"}.layui-icon-music:before{content:\"\\e690\"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px}.layui-side-scroll{position:relative;width:220px;height:100%}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;z-index:900;width:auto;box-sizing:border-box}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-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;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#FAFAFA}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:\"\";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.6;border-left:5px solid #5FB878;border-radius:0 2px 2px 0;background-color:#FAFAFA}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#FAFAFA;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card-body,.layui-card-header,.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-panel,.layui-textarea{position:relative}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-form-select dl,.layui-panel{box-shadow:1px 1px 4px rgb(0 0 0 / 8%)}.layui-card:last-child{margin-bottom:0}.layui-card-header{height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{border-width:1px;border-style:solid;border-radius:2px;background-color:#fff;color:#666}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-border,.layui-border-black,.layui-border-blue,.layui-border-cyan,.layui-border-green,.layui-border-orange,.layui-border-red{border-width:1px;border-style:solid}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#FAFAFA!important;color:#666!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{color:#666!important}.layui-border-red{border-color:#FF5722!important;color:#FF5722!important}.layui-border-orange{border-color:#FFB800!important;color:#FFB800!important}.layui-border-green{border-color:#009688!important;color:#009688!important}.layui-border-cyan{border-color:#2F4056!important;color:#2F4056!important}.layui-border-blue{border-color:#1E9FFF!important;color:#1E9FFF!important}.layui-border-black{border-color:#393D49!important;color:#393D49!important}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.6;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:10px 0}.layui-text p:first-child{margin-top:0}.layui-font-12{font-size:12px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-red{color:#FF5722!important}.layui-font-orange{color:#FFB800!important}.layui-font-green{color:#009688!important}.layui-font-cyan{color:#2F4056!important}.layui-font-blue{color:#01AAED!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\\9;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#666}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#FBFBFB!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{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:#d2d2d2;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 #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#eee!important}.layui-input:focus,.layui-textarea:focus{border-color:#d2d2d2!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left: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:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;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:#F6F6F6;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\\9}:root .layui-form-selected .layui-edge{margin-top:-9px\\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878!important;background-color:#5FB878;color:#fff}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disabled,.layui-checkbox-disabled i{border-color:#eee!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disabled span{background-color:#eee!important}.layui-checkbox-disabled em{color:#d2d2d2!important}.layui-checkbox-disabled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover *,.layui-form-radioed,.layui-form-radioed>i{color:#5FB878}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled *{color:#c2c2c2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FAFAFA;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #eee}.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:#eee;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#FAFAFA}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-menu li,.layui-menu-body-title a:hover,.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#F6F6F6}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-colorpicker-alpha-slider,.layui-colorpicker-side-slider,.layui-menu,.layui-menu *,.layui-nav{box-sizing:border-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff}.layui-menu li,.layui-menu-body-title a{padding:5px 15px}.layui-menu li{position:relative;margin:1px 0;width:calc(100% + 1px);line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer}.layui-menu li:hover{background-color:#F6F6F6}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group .layui-menu-body-title,.layui-menu-item-parent .layui-menu-body-title{padding-right:25px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default;text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:rgba(0,0,0,1)}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#F6F6F6!important;color:#5FB878}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#5FB878}.layui-menu .layui-menu-item-checked:after{position:absolute;right:0;top:0;bottom:0;border-right:3px solid #5FB878;content:\"\"}.layui-menu-body-title{position:relative;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title>.layui-icon{position:absolute;right:0;top:0;font-size:14px}.layui-menu-body-title>.layui-icon-right{right:-1px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:\"\";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#5FB878}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:66666666;margin:5px 0;min-width:100px}.layui-dropdown:before{content:\"\";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0}.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:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:\"\";position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.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 #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#666;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#F6F6F6;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#F6F6F6;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child{display:block;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:\"\";width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;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:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#FAFAFA}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:\"\";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#F6F6F6;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:66666666;width:280px;margin:5px 0;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:\"\";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:\"\";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \\0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:\"\";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:\"\";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:\"\";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-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,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}"
  },
  {
    "path": "static/common/layui/css/modules/code.css",
    "content": "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 #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee}.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 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view .layui-code-ol li:first-child{padding-top:10px}.layui-code-view .layui-code-ol li:last-child{padding-bottom:10px}.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}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none}"
  },
  {
    "path": "static/common/layui/css/modules/laydate/default/laydate.css",
    "content": ".laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;animation-name:laydate-downbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #C9C9C9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-footer span:hover{color:#5FB878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#B5FFF8}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}"
  },
  {
    "path": "static/common/layui/css/modules/layer/default/layer.css",
    "content": ".layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+\"px\")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #F0F0F0;font-size:14px;color:#333;overflow:hidden;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.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-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_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:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}"
  },
  {
    "path": "static/common/layui/layui.js",
    "content": ";function strhtml(str){var s=\"\";if(!str){return''}str=htmlstr(str);if(str.length==0)return\"\";s=str.replace(/&/g,\"&amp;\");s=s.replace(/</g,\"&lt;\");s=s.replace(/>/g,\"&gt;\");s=s.replace(/ /g,\"&nbsp;\");s=s.replace(/\\'/g,\"'\");s=s.replace(/\\\"/g,'\"');return s}function htmlstr(str){var s=\"\";if(!str){return''}if(str.length==0)return\"\";s=str.replace(/&amp;/g,\"&\");s=s.replace(/&lt;/g,\"<\");s=s.replace(/&gt;/g,\">\");s=s.replace(/&nbsp;/g,\" \");s=s.replace(/'/g,\"\\'\");s=s.replace(/\"/g,\"\\\"\");return s}!function(t){\"use strict\";var e=t.document,n={modules:{},status:{},timeout:10,event:{}},r=function(){this.v=\"2.6.8\"},o=t.LAYUI_GLOBAL||{},a=function(){var t=e.currentScript?e.currentScript.src:function(){for(var t,n=e.scripts,r=n.length-1,o=r;o>0;o--)if(\"interactive\"===n[o].readyState){t=n[o].src;break}return t||n[r].src}();return n.dir=o.dir||t.substring(0,t.lastIndexOf(\"/\")+1)}(),i=function(e,n){n=n||\"log\",t.console&&console[n]&&console[n](\"layui error hint: \"+e)},u=\"undefined\"!=typeof opera&&\"[object Opera]\"===opera.toString(),l=n.builtin={lay:\"lay\",layer:\"layer\",laydate:\"laydate\",laypage:\"laypage\",laytpl:\"laytpl\",layedit:\"layedit\",form:\"form\",upload:\"upload\",dropdown:\"dropdown\",transfer:\"transfer\",tree:\"tree\",table:\"table\",element:\"element\",rate:\"rate\",colorpicker:\"colorpicker\",slider:\"slider\",carousel:\"carousel\",flow:\"flow\",util:\"util\",code:\"code\",jquery:\"jquery\",all:\"all\",\"layui.all\":\"layui.all\"};r.prototype.cache=n,r.prototype.define=function(t,e){var r=this,o=\"function\"==typeof t,a=function(){var t=function(t,e){layui[t]=e,n.status[t]=!0};return\"function\"==typeof e&&e(function(r,o){t(r,o),n.callback[r]=function(){e(t)}}),this};return o&&(e=t,t=[]),r.use(t,a,null,\"define\"),r},r.prototype.use=function(r,o,c,s){function p(t,e){var r=\"PLaySTATION 3\"===navigator.platform?/^complete$/:/^(complete|loaded)$/;(\"load\"===t.type||r.test((t.currentTarget||t.srcElement).readyState))&&(n.modules[h]=e,v.removeChild(b),function o(){return++m>1e3*n.timeout/4?i(h+\" is not a valid module\",\"error\"):void(n.status[h]?f():setTimeout(o,4))}())}function f(){c.push(layui[h]),r.length>1?y.use(r.slice(1),o,c,s):\"function\"==typeof o&&function(){return layui.jquery&&\"function\"==typeof layui.jquery&&\"define\"!==s?layui.jquery(function(){o.apply(layui,c)}):void o.apply(layui,c)}()}var y=this,d=n.dir=n.dir?n.dir:a,v=e.getElementsByTagName(\"head\")[0];r=function(){return\"string\"==typeof r?[r]:\"function\"==typeof r?(o=r,[\"all\"]):r}(),t.jQuery&&jQuery.fn.on&&(y.each(r,function(t,e){\"jquery\"===e&&r.splice(t,1)}),layui.jquery=layui.$=jQuery);var h=r[0],m=0;if(c=c||[],n.host=n.host||(d.match(/\\/\\/([\\s\\S]+?)\\//)||[\"//\"+location.host+\"/\"])[0],0===r.length||layui[\"layui.all\"]&&l[h])return f(),y;var g=(l[h]?d+\"modules/\":/^\\{\\/\\}/.test(y.modules[h])?\"\":n.base||\"\")+(y.modules[h]||h)+\".js\";if(g=g.replace(/^\\{\\/\\}/,\"\"),!n.modules[h]&&layui[h]&&(n.modules[h]=g),n.modules[h])!function S(){return++m>1e3*n.timeout/4?i(h+\" is not a valid module\",\"error\"):void(\"string\"==typeof n.modules[h]&&n.status[h]?f():setTimeout(S,4))}();else{var b=e.createElement(\"script\");b.async=!0,b.charset=\"utf-8\",b.src=g+function(){var t=n.version===!0?n.v||(new Date).getTime():n.version||\"\";return t?\"?v=\"+t:\"\"}(),v.appendChild(b),!b.attachEvent||b.attachEvent.toString&&b.attachEvent.toString().indexOf(\"[native code\")<0||u?b.addEventListener(\"load\",function(t){p(t,g)},!1):b.attachEvent(\"onreadystatechange\",function(t){p(t,g)}),n.modules[h]=g}return y},r.prototype.getStyle=function(e,n){var r=e.currentStyle?e.currentStyle:t.getComputedStyle(e,null);return r[r.getPropertyValue?\"getPropertyValue\":\"getAttribute\"](n)},r.prototype.link=function(t,r,o){var a=this,u=e.getElementsByTagName(\"head\")[0],l=e.createElement(\"link\");\"string\"==typeof r&&(o=r);var c=(o||t).replace(/\\.|\\//g,\"\"),s=l.id=\"layuicss-\"+c,p=\"creating\",f=0;return l.rel=\"stylesheet\",l.href=t+(n.debug?\"?v=\"+(new Date).getTime():\"\"),l.media=\"all\",e.getElementById(s)||u.appendChild(l),\"function\"!=typeof r?a:(function y(o){var u=100,l=e.getElementById(s);return++f>1e3*n.timeout/u?i(t+\" timeout\"):void(1989===parseInt(a.getStyle(l,\"width\"))?(o===p&&l.removeAttribute(\"lay-status\"),l.getAttribute(\"lay-status\")===p?setTimeout(y,u):r()):(l.setAttribute(\"lay-status\",p),setTimeout(function(){y(p)},u)))}(),a)},r.prototype.addcss=function(t,e,r){return layui.link(n.dir+\"css/\"+t,e,r)},n.callback={},r.prototype.factory=function(t){if(layui[t])return\"function\"==typeof n.callback[t]?n.callback[t]:null},r.prototype.img=function(t,e,n){var r=new Image;return r.src=t,r.complete?e(r):(r.onload=function(){r.onload=null,\"function\"==typeof e&&e(r)},void(r.onerror=function(t){r.onerror=null,\"function\"==typeof n&&n(t)}))},r.prototype.config=function(t){t=t||{};for(var e in t)n[e]=t[e];return this},r.prototype.modules=function(){var t={};for(var e in l)t[e]=l[e];return t}(),r.prototype.extend=function(t){var e=this;t=t||{};for(var n in t)e[n]||e.modules[n]?i(n+\" Module already exists\",\"error\"):e.modules[n]=t[n];return e},r.prototype.router=function(t){var e=this,t=t||location.hash,n={path:[],search:{},hash:(t.match(/[^#](#.*$)/)||[])[1]||\"\"};return/^#\\//.test(t)?(t=t.replace(/^#\\//,\"\"),n.href=\"/\"+t,t=t.replace(/([^#])(#.*$)/,\"$1\").split(\"/\")||[],e.each(t,function(t,e){/^\\w+=/.test(e)?function(){e=e.split(\"=\"),n.search[e[0]]=e[1]}():n.path.push(e)}),n):n},r.prototype.url=function(t){var e=this,n={pathname:function(){var e=t?function(){var e=(t.match(/\\.[^.]+?\\/.+/)||[])[0]||\"\";return e.replace(/^[^\\/]+/,\"\").replace(/\\?.+/,\"\")}():location.pathname;return e.replace(/^\\//,\"\").split(\"/\")}(),search:function(){var n={},r=(t?function(){var e=(t.match(/\\?.+/)||[])[0]||\"\";return e.replace(/\\#.+/,\"\")}():location.search).replace(/^\\?+/,\"\").split(\"&\");return e.each(r,function(t,e){var r=e.indexOf(\"=\"),o=function(){return r<0?e.substr(0,e.length):0!==r&&e.substr(0,r)}();o&&(n[o]=r>0?e.substr(r+1):null)}),n}(),hash:e.router(function(){return t?(t.match(/#.+/)||[])[0]||\"/\":location.hash}())};return n},r.prototype.data=function(e,n,r){if(e=e||\"layui\",r=r||localStorage,t.JSON&&t.JSON.parse){if(null===n)return delete r[e];n=\"object\"==typeof n?n:{key:n};try{var o=JSON.parse(r[e])}catch(a){var o={}}return\"value\"in n&&(o[n.key]=n.value),n.remove&&delete o[n.key],r[e]=JSON.stringify(o),n.key?o[n.key]:o}},r.prototype.sessionData=function(t,e){return this.data(t,e,sessionStorage)},r.prototype.device=function(e){var n=navigator.userAgent.toLowerCase(),r=function(t){var e=new RegExp(t+\"/([^\\\\s\\\\_\\\\-]+)\");return t=(n.match(e)||[])[1],t||!1},o={os:function(){return/windows/.test(n)?\"windows\":/linux/.test(n)?\"linux\":/iphone|ipod|ipad|ios/.test(n)?\"ios\":/mac/.test(n)?\"mac\":void 0}(),ie:function(){return!!(t.ActiveXObject||\"ActiveXObject\"in t)&&((n.match(/msie\\s(\\d+)/)||[])[1]||\"11\")}(),weixin:r(\"micromessenger\")};return e&&!o[e]&&(o[e]=r(e)),o.android=/android/.test(n),o.ios=\"ios\"===o.os,o.mobile=!(!o.android&&!o.ios),o},r.prototype.hint=function(){return{error:i}},r.prototype._typeof=function(t){return null===t?String(t):\"object\"==typeof t||\"function\"==typeof t?function(){var e=Object.prototype.toString.call(t).match(/\\s(.+)\\]$/)||[],n=\"Function|Array|Date|RegExp|Object|Error|Symbol\";return e=e[1]||\"Object\",new RegExp(\"\\\\b(\"+n+\")\\\\b\").test(e)?e.toLowerCase():\"object\"}():typeof t},r.prototype._isArray=function(e){var n,r=this,o=r._typeof(e);return!(!e||\"object\"!=typeof e||e===t)&&(n=\"length\"in e&&e.length,\"array\"===o||0===n||\"number\"==typeof n&&n>0&&n-1 in e)},r.prototype.each=function(t,e){var n,r=this,o=function(t,n){return e.call(n[t],t,n[t])};if(\"function\"!=typeof e)return r;if(t=t||[],r._isArray(t))for(n=0;n<t.length&&!o(n,t);n++);else for(n in t)if(o(n,t))break;return r},r.prototype.sort=function(t,e,n){var r=JSON.parse(JSON.stringify(t||[]));return e?(r.sort(function(t,n){var r=t[e],o=n[e],a=[!isNaN(r),!isNaN(o)];return a[0]&&a[1]?r&&!o&&0!==o?1:!r&&0!==r&&o?-1:r-o:a[0]||a[1]?a[0]||!a[1]?-1:!a[0]||a[1]?1:void 0:r>o?1:r<o?-1:0}),n&&r.reverse(),r):r},r.prototype.stope=function(e){e=e||t.event;try{e.stopPropagation()}catch(n){e.cancelBubble=!0}};var c=\"LAYUI-EVENT-REMOVE\";r.prototype.onevent=function(t,e,n){return\"string\"!=typeof t||\"function\"!=typeof n?this:r.event(t,e,null,n)},r.prototype.event=r.event=function(t,e,r,o){var a=this,i=null,u=(e||\"\").match(/\\((.*)\\)$/)||[],l=(t+\".\"+e).replace(u[0],\"\"),s=u[1]||\"\",p=function(t,e){var n=e&&e.call(a,r);n===!1&&null===i&&(i=!1)};return r===c?(delete(a.cache.event[l]||{})[s],a):o?(n.event[l]=n.event[l]||{},n.event[l][s]=[o],this):(layui.each(n.event[l],function(t,e){return\"{*}\"===s?void layui.each(e,p):(\"\"===t&&layui.each(e,p),void(s&&t===s&&layui.each(e,p)))}),i)},r.prototype.on=function(t,e,n){var r=this;return r.onevent.call(r,e,t,n)},r.prototype.off=function(t,e){var n=this;return n.event.call(n,e,t,c)},t.layui=new r}(window);layui.define(function(a){var i=layui.cache;layui.config({dir:i.dir.replace(/lay\\/dest\\/$/,\"\")}),a(\"layui.all\",layui.v)});!function(t){\"use strict\";var e=\"lay\",n=t.document,r=function(t){return new o(t)},o=function(t){for(var e=0,r=\"object\"==typeof t?[t]:(this.selector=t,n.querySelectorAll(t||null));e<r.length;e++)this.push(r[e])};o.prototype=[],o.prototype.constructor=o,r.extend=function(){var t=1,e=arguments,n=function(t,e){t=t||(\"array\"===layui._typeof(e)?[]:{});for(var r in e)t[r]=e[r]&&e[r].constructor===Object?n(t[r],e[r]):e[r];return t};for(e[0]=\"object\"==typeof e[0]?e[0]:{};t<e.length;t++)\"object\"==typeof e[t]&&n(e[0],e[t]);return e[0]},r.v=\"1.0.8\",r.ie=function(){var e=navigator.userAgent.toLowerCase();return!!(t.ActiveXObject||\"ActiveXObject\"in t)&&((e.match(/msie\\s(\\d+)/)||[])[1]||\"11\")}(),r.layui=layui||{},r.getPath=layui.cache.dir,r.stope=layui.stope,r.each=function(){return layui.each.apply(layui,arguments),this},r.digit=function(t,e,n){var r=\"\";t=String(t),e=e||2;for(var o=t.length;o<e;o++)r+=\"0\";return t<Math.pow(10,e)?r+(0|t):t},r.elem=function(t,e){var o=n.createElement(t);return r.each(e||{},function(t,e){o.setAttribute(t,e)}),o},r.hasScrollbar=function(){return n.body.scrollHeight>(t.innerHeight||n.documentElement.clientHeight)},r.position=function(e,o,i){if(o){i=i||{},e!==n&&e!==r(\"body\")[0]||(i.clickType=\"right\");var c=\"right\"===i.clickType?function(){var e=i.e||t.event||{};return{left:e.clientX,top:e.clientY,right:e.clientX,bottom:e.clientY}}():e.getBoundingClientRect(),u=o.offsetWidth,a=o.offsetHeight,f=function(t){return t=t?\"scrollLeft\":\"scrollTop\",n.body[t]|n.documentElement[t]},s=function(t){return n.documentElement[t?\"clientWidth\":\"clientHeight\"]},l=5,h=c.left,p=c.bottom;\"center\"===i.align?h-=(u-e.offsetWidth)/2:\"right\"===i.align&&(h=h-u+e.offsetWidth),h+u+l>s(\"width\")&&(h=s(\"width\")-u-l),h<l&&(h=l),p+a+l>s()&&(c.top>a+l?p=c.top-a-2*l:\"right\"===i.clickType&&(p=s()-a-2*l,p<0&&(p=0)));var y=i.position;if(y&&(o.style.position=y),o.style.left=h+(\"fixed\"===y?0:f(1))+\"px\",o.style.top=p+(\"fixed\"===y?0:f())+\"px\",!r.hasScrollbar()){var d=o.getBoundingClientRect();!i.SYSTEM_RELOAD&&d.bottom+l>s()&&(i.SYSTEM_RELOAD=!0,setTimeout(function(){r.position(e,o,i)},50))}}},r.options=function(t,e){var n=r(t),o=e||\"lay-options\";try{return new Function(\"return \"+(n.attr(o)||\"{}\"))()}catch(i){return hint.error(\"parseerror\\uff1a\"+i,\"error\"),{}}},r.isTopElem=function(t){var e=[n,r(\"body\")[0]],o=!1;return r.each(e,function(e,n){if(n===t)return o=!0}),o},o.addStr=function(t,e){return t=t.replace(/\\s+/,\" \"),e=e.replace(/\\s+/,\" \").split(\" \"),r.each(e,function(e,n){new RegExp(\"\\\\b\"+n+\"\\\\b\").test(t)||(t=t+\" \"+n)}),t.replace(/^\\s|\\s$/,\"\")},o.removeStr=function(t,e){return t=t.replace(/\\s+/,\" \"),e=e.replace(/\\s+/,\" \").split(\" \"),r.each(e,function(e,n){var r=new RegExp(\"\\\\b\"+n+\"\\\\b\");r.test(t)&&(t=t.replace(r,\"\"))}),t.replace(/\\s+/,\" \").replace(/^\\s|\\s$/,\"\")},o.prototype.find=function(t){var e=this,n=0,o=[],i=\"object\"==typeof t;return this.each(function(r,c){for(var u=i?c.contains(t):c.querySelectorAll(t||null);n<u.length;n++)o.push(u[n]);e.shift()}),i||(e.selector=(e.selector?e.selector+\" \":\"\")+t),r.each(o,function(t,n){e.push(n)}),e},o.prototype.each=function(t){return r.each.call(this,this,t)},o.prototype.addClass=function(t,e){return this.each(function(n,r){r.className=o[e?\"removeStr\":\"addStr\"](r.className,t)})},o.prototype.removeClass=function(t){return this.addClass(t,!0)},o.prototype.hasClass=function(t){var e=!1;return this.each(function(n,r){new RegExp(\"\\\\b\"+t+\"\\\\b\").test(r.className)&&(e=!0)}),e},o.prototype.css=function(t,e){var n=this,o=function(t){return isNaN(t)?t:t+\"px\"};return\"string\"==typeof t&&void 0===e?function(){if(n.length>0)return n[0].style[t]}():n.each(function(n,i){\"object\"==typeof t?r.each(t,function(t,e){i.style[t]=o(e)}):i.style[t]=o(e)})},o.prototype.width=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].offsetWidth}():e.each(function(n,r){e.css(\"width\",t)})},o.prototype.height=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].offsetHeight}():e.each(function(n,r){e.css(\"height\",t)})},o.prototype.attr=function(t,e){var n=this;return void 0===e?function(){if(n.length>0)return n[0].getAttribute(t)}():n.each(function(n,r){r.setAttribute(t,e)})},o.prototype.removeAttr=function(t){return this.each(function(e,n){n.removeAttribute(t)})},o.prototype.html=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].innerHTML}():this.each(function(e,n){n.innerHTML=t})},o.prototype.val=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].value}():this.each(function(e,n){n.value=t})},o.prototype.append=function(t){return this.each(function(e,n){\"object\"==typeof t?n.appendChild(t):n.innerHTML=n.innerHTML+t})},o.prototype.remove=function(t){return this.each(function(e,n){t?n.removeChild(t):n.parentNode.removeChild(n)})},o.prototype.on=function(t,e){return this.each(function(n,r){r.attachEvent?r.attachEvent(\"on\"+t,function(t){t.target=t.srcElement,e.call(r,t)}):r.addEventListener(t,e,!1)})},o.prototype.off=function(t,e){return this.each(function(n,r){r.detachEvent?r.detachEvent(\"on\"+t,e):r.removeEventListener(t,e,!1)})},t.lay=r,t.layui&&layui.define&&layui.define(function(t){t(e,r)})}(window,window.document);layui.define(function(e){\"use strict\";var r={open:\"{{\",close:\"}}\"},c={exp:function(e){return new RegExp(e,\"g\")},query:function(e,c,t){var o=[\"#([\\\\s\\\\S])+?\",\"([^{#}])*?\"][e||0];return n((c||\"\")+r.open+o+r.close+(t||\"\"))},escape:function(e){return String(e||\"\").replace(/&(?!#?[a-zA-Z0-9]+;)/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/'/g,\"&#39;\").replace(/\"/g,\"&quot;\")},error:function(e,r){var c=\"Laytpl Error: \";return\"object\"==typeof console&&console.error(c+e+\"\\n\"+(r||\"\")),c+e}},n=c.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=n(\"^\"+r.open+\"#\",\"\"),l=n(r.close+\"$\",\"\");e=e.replace(/\\s+|\\r|\\t|\\n/g,\" \").replace(n(r.open+\"#\"),r.open+\"# \").replace(n(r.close+\"}\"),\"} \"+r.close).replace(/\\\\/g,\"\\\\\\\\\").replace(n(r.open+\"!(.+?)!\"+r.close),function(e){return e=e.replace(n(\"^\"+r.open+\"!\"),\"\").replace(n(\"!\"+r.close),\"\").replace(n(r.open+\"|\"+r.close),function(e){return e.replace(/(.)/g,\"\\\\$1\")})}).replace(/(?=\"|')/g,\"\\\\\").replace(c.query(),function(e){return e=e.replace(a,\"\").replace(l,\"\"),'\";'+e.replace(/\\\\(.)/g,\"$1\")+';view+=\"'}).replace(c.query(1),function(e){var c='\"+(';return e.replace(/\\s/g,\"\")===r.open+r.close?\"\":(e=e.replace(n(r.open+\"|\"+r.close),\"\"),/^=/.test(e)&&(e=e.replace(/^=/,\"\"),c='\"+_escape_('),c+e.replace(/\\\\(.)/g,\"$1\")+')+\"')}),e='\"use strict\";var view = \"'+e+'\";return view;';try{return o.cache=e=new Function(\"d, _escape_\",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error(\"no data\")};var o=function(e){return\"string\"!=typeof e?c.error(\"Template not found\"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v=\"1.2.0\",e(\"laytpl\",o)});layui.define(function(e){\"use strict\";var a=document,t=\"getElementById\",n=\"getElementsByTagName\",i=\"laypage\",r=\"layui-disabled\",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if(\"object\"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups=\"groups\"in a?0|a.groups:5;a.layout=\"object\"==typeof a.layout?a.layout:[\"prev\",\"page\",\"next\"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits=\"object\"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev=\"prev\"in a?a.prev:\"&#x4E0A;&#x4E00;&#x9875;\",a.next=\"next\"in a?a.next:\"&#x4E0B;&#x4E00;&#x9875;\";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?'<a href=\"javascript:;\" class=\"layui-laypage-prev'+(1==a.curr?\" \"+r:\"\")+'\" data-page=\"'+(a.curr-1)+'\">'+a.prev+\"</a>\":\"\"}(),page:function(){var e=[];if(a.count<1)return\"\";n>1&&a.first!==!1&&0!==t&&e.push('<a href=\"javascript:;\" class=\"layui-laypage-first\" data-page=\"1\"  title=\"&#x9996;&#x9875;\">'+(a.first||1)+\"</a>\");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r<t-1&&(r=u-t+1),a.first!==!1&&r>2&&e.push('<span class=\"layui-laypage-spr\">&#x2026;</span>');r<=u;r++)r===a.curr?e.push('<span class=\"layui-laypage-curr\"><em class=\"layui-laypage-em\" '+(/^#/.test(a.theme)?'style=\"background-color:'+a.theme+';\"':\"\")+\"></em><em>\"+r+\"</em></span>\"):e.push('<a href=\"javascript:;\" data-page=\"'+r+'\">'+r+\"</a>\");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1<a.pages&&e.push('<span class=\"layui-laypage-spr\">&#x2026;</span>'),0!==t&&e.push('<a href=\"javascript:;\" class=\"layui-laypage-last\" title=\"&#x5C3E;&#x9875;\"  data-page=\"'+a.pages+'\">'+(a.last||a.pages)+\"</a>\")),e.join(\"\")}(),next:function(){return a.next?'<a href=\"javascript:;\" class=\"layui-laypage-next'+(a.curr==a.pages?\" \"+r:\"\")+'\" data-page=\"'+(a.curr+1)+'\">'+a.next+\"</a>\":\"\"}(),count:'<span class=\"layui-laypage-count\">\\u5171 '+a.count+\" \\u6761</span>\",limit:function(){var e=['<span class=\"layui-laypage-limits\"><select lay-ignore>'];return layui.each(a.limits,function(t,n){e.push('<option value=\"'+n+'\"'+(n===a.limit?\"selected\":\"\")+\">\"+n+\" \\u6761/\\u9875</option>\")}),e.join(\"\")+\"</select></span>\"}(),refresh:['<a href=\"javascript:;\" data-page=\"'+a.curr+'\" class=\"layui-laypage-refresh\">','<i class=\"layui-icon layui-icon-refresh\"></i>',\"</a>\"].join(\"\"),skip:function(){return['<span class=\"layui-laypage-skip\">&#x5230;&#x7B2C;','<input type=\"text\" min=\"1\" value=\"'+a.curr+'\" class=\"layui-input\">','&#x9875;<button type=\"button\" class=\"layui-laypage-btn\">&#x786e;&#x5b9a;</button>',\"</span>\"].join(\"\")}()};return['<div class=\"layui-box layui-laypage layui-laypage-'+(a.theme?/^#/.test(a.theme)?\"molv\":a.theme:\"default\")+'\" id=\"layui-laypage-'+a.index+'\">',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join(\"\")}(),\"</div>\"].join(\"\")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n](\"button\")[0],l=e[n](\"input\")[0],p=e[n](\"select\")[0],c=function(){var e=0|l.value.replace(/\\s|\\D/g,\"\");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;o<y;o++)\"a\"===r[o].nodeName.toLowerCase()&&s.on(r[o],\"click\",function(){var e=0|this.getAttribute(\"data-page\");e<1||e>i.pages||(i.curr=e,t.render())});p&&s.on(p,\"change\",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,\"click\",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n](\"input\")[0];t&&s.on(t,\"keyup\",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\\D/.test(n)&&(this.value=n.replace(/\\D/,\"\")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t](\"layui-laypage-\"+i.index);n.jump(s),i.hash&&!e&&(location.hash=\"!\"+i.hash+\"=\"+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent(\"on\"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(e,t){\"use strict\";var a=e.layui&&layui.define,n={getPath:e.lay&&lay.getPath?lay.getPath:\"\",link:function(t,a,n){l.path&&e.lay&&lay.layui&&lay.layui.link(l.path+t,a,n)}},i=e.LAYUI_GLOBAL||{},l={v:\"5.3.1\",config:{},index:e.laydate&&e.laydate.v?1e5:0,path:i.laydate_dir||n.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t=\"laydate\",i=\"\",r=(a?\"modules/laydate/\":\"theme/\")+\"default/laydate.css?v=\"+l.v+i;return a?layui.addcss(r,e,t):n.link(r,e,t),this}},r=function(){var e=this,t=e.config,a=t.id;return r.that[a]=e,{hint:function(t){e.hint.call(e,t)},config:e.config}},o=\"laydate\",s=\".layui-laydate\",y=\"layui-this\",d=\"laydate-disabled\",m=[100,2e5],c=\"layui-laydate-static\",u=\"layui-laydate-list\",h=\"layui-laydate-hint\",f=\"layui-laydate-footer\",p=\".laydate-btns-confirm\",g=\"laydate-time-text\",v=\"laydate-btns-time\",T=\"layui-laydate-preview\",D=function(e){var t=this;t.index=++l.index,t.config=lay.extend({},t.config,l.config,e),e=t.config,e.id=\"id\"in e?e.id:t.index,l.ready(function(){t.init()})},w=\"yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s\";r.formatArr=function(e){return(e||\"\").match(new RegExp(w+\"|.\",\"g\"))||[]},D.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},D.prototype.config={type:\"date\",range:!1,format:\"yyyy-MM-dd\",value:null,isInitValue:!0,min:\"1900-1-1\",max:\"2099-12-31\",trigger:\"click\",show:!1,showBottom:!0,isPreview:!0,btns:[\"clear\",\"now\",\"confirm\"],lang:\"cn\",theme:\"default\",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},D.prototype.lang=function(){var e=this,t=e.config,a={cn:{weeks:[\"\\u65e5\",\"\\u4e00\",\"\\u4e8c\",\"\\u4e09\",\"\\u56db\",\"\\u4e94\",\"\\u516d\"],time:[\"\\u65f6\",\"\\u5206\",\"\\u79d2\"],timeTips:\"\\u9009\\u62e9\\u65f6\\u95f4\",startTime:\"\\u5f00\\u59cb\\u65f6\\u95f4\",endTime:\"\\u7ed3\\u675f\\u65f6\\u95f4\",dateTips:\"\\u8fd4\\u56de\\u65e5\\u671f\",month:[\"\\u4e00\",\"\\u4e8c\",\"\\u4e09\",\"\\u56db\",\"\\u4e94\",\"\\u516d\",\"\\u4e03\",\"\\u516b\",\"\\u4e5d\",\"\\u5341\",\"\\u5341\\u4e00\",\"\\u5341\\u4e8c\"],tools:{confirm:\"\\u786e\\u5b9a\",clear:\"\\u6e05\\u7a7a\",now:\"\\u73b0\\u5728\"},timeout:\"\\u7ed3\\u675f\\u65f6\\u95f4\\u4e0d\\u80fd\\u65e9\\u4e8e\\u5f00\\u59cb\\u65f6\\u95f4<br>\\u8bf7\\u91cd\\u65b0\\u9009\\u62e9\",invalidDate:\"\\u4e0d\\u5728\\u6709\\u6548\\u65e5\\u671f\\u6216\\u65f6\\u95f4\\u8303\\u56f4\\u5185\",formatError:[\"\\u65e5\\u671f\\u683c\\u5f0f\\u4e0d\\u5408\\u6cd5<br>\\u5fc5\\u987b\\u9075\\u5faa\\u4e0b\\u8ff0\\u683c\\u5f0f\\uff1a<br>\",\"<br>\\u5df2\\u4e3a\\u4f60\\u91cd\\u7f6e\"],preview:\"\\u5f53\\u524d\\u9009\\u4e2d\\u7684\\u7ed3\\u679c\"},en:{weeks:[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],time:[\"Hours\",\"Minutes\",\"Seconds\"],timeTips:\"Select Time\",startTime:\"Start Time\",endTime:\"End Time\",dateTips:\"Select Date\",month:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],tools:{confirm:\"Confirm\",clear:\"Clear\",now:\"Now\"},timeout:\"End time cannot be less than start Time<br>Please re-select\",invalidDate:\"Invalid date\",formatError:[\"The date format error<br>Must be followed\\uff1a<br>\",\"<br>It has been reset\"],preview:\"The selected result\"}};return a[t.lang]||a.cn},D.prototype.init=function(){var t=this,a=t.config,n=\"static\"===a.position,i={year:\"yyyy\",month:\"yyyy-MM\",date:\"yyyy-MM-dd\",time:\"HH:mm:ss\",datetime:\"yyyy-MM-dd HH:mm:ss\"};a.elem=lay(a.elem),a.eventElem=lay(a.eventElem),a.elem[0]&&(t.rangeStr=a.range?\"string\"==typeof a.range?a.range:\"-\":\"\",\"array\"===layui._typeof(a.range)&&(t.rangeElem=[lay(a.range[0]),lay(a.range[1])]),i[a.type]||(e.console&&console.error&&console.error(\"laydate type error:'\"+a.type+\"' is not supported\"),a.type=\"date\"),a.format===i.date&&(a.format=i[a.type]||i.date),t.format=r.formatArr(a.format),t.EXP_IF=\"\",t.EXP_SPLIT=\"\",lay.each(t.format,function(e,a){var n=new RegExp(w).test(a)?\"\\\\d{\"+function(){return new RegExp(w).test(t.format[0===e?e+1:e-1]||\"\")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?\"1,4\":/^y$/.test(a)?\"1,308\":\"1,2\"}()+\"}\":\"\\\\\"+a;t.EXP_IF=t.EXP_IF+n,t.EXP_SPLIT=t.EXP_SPLIT+\"(\"+n+\")\"}),t.EXP_IF_ONE=new RegExp(\"^\"+t.EXP_IF+\"$\"),t.EXP_IF=new RegExp(\"^\"+(a.range?t.EXP_IF+\"\\\\s\\\\\"+t.rangeStr+\"\\\\s\"+t.EXP_IF:t.EXP_IF)+\"$\"),t.EXP_SPLIT=new RegExp(\"^\"+t.EXP_SPLIT+\"$\",\"\"),t.isInput(a.elem[0])||\"focus\"===a.trigger&&(a.trigger=\"click\"),a.elem.attr(\"lay-key\")||(a.elem.attr(\"lay-key\",t.index),a.eventElem.attr(\"lay-key\",t.index)),a.mark=lay.extend({},a.calendar&&\"cn\"===a.lang?{\"0-1-1\":\"\\u5143\\u65e6\",\"0-2-14\":\"\\u60c5\\u4eba\",\"0-3-8\":\"\\u5987\\u5973\",\"0-3-12\":\"\\u690d\\u6811\",\"0-4-1\":\"\\u611a\\u4eba\",\"0-5-1\":\"\\u52b3\\u52a8\",\"0-5-4\":\"\\u9752\\u5e74\",\"0-6-1\":\"\\u513f\\u7ae5\",\"0-9-10\":\"\\u6559\\u5e08\",\"0-9-18\":\"\\u56fd\\u803b\",\"0-10-1\":\"\\u56fd\\u5e86\",\"0-12-25\":\"\\u5723\\u8bde\"}:{},a.mark),lay.each([\"min\",\"max\"],function(e,t){var n=[],i=[];if(\"number\"==typeof a[t]){var l=a[t],r=(new Date).getTime(),o=864e5,s=new Date(l?l<o?r+l*o:l:r);n=[s.getFullYear(),s.getMonth()+1,s.getDate()],l<o||(i=[s.getHours(),s.getMinutes(),s.getSeconds()])}else n=(a[t].match(/\\d+-\\d+-\\d+/)||[\"\"])[0].split(\"-\"),i=(a[t].match(/\\d+:\\d+:\\d+/)||[\"\"])[0].split(\":\");a[t]={year:0|n[0]||(new Date).getFullYear(),month:n[1]?(0|n[1])-1:(new Date).getMonth(),date:0|n[2]||(new Date).getDate(),hours:0|i[0],minutes:0|i[1],seconds:0|i[2]}}),t.elemID=\"layui-laydate\"+a.elem.attr(\"lay-key\"),(a.show||n)&&t.render(),n||t.events(),a.value&&a.isInitValue&&(\"date\"===layui._typeof(a.value)?t.setValue(t.parse(0,t.systemDate(a.value))):t.setValue(a.value)))},D.prototype.render=function(){var e=this,a=e.config,n=e.lang(),i=\"static\"===a.position,r=e.elem=lay.elem(\"div\",{id:e.elemID,\"class\":[\"layui-laydate\",a.range?\" layui-laydate-range\":\"\",i?\" \"+c:\"\",a.theme&&\"default\"!==a.theme&&!/^#/.test(a.theme)?\" laydate-theme-\"+a.theme:\"\"].join(\"\")}),o=e.elemMain=[],s=e.elemHeader=[],y=e.elemCont=[],d=e.table=[],m=e.footer=lay.elem(\"div\",{\"class\":f});if(a.zIndex&&(r.style.zIndex=a.zIndex),lay.each(new Array(2),function(e){if(!a.range&&e>0)return!0;var t=lay.elem(\"div\",{\"class\":\"layui-laydate-header\"}),i=[function(){var e=lay.elem(\"i\",{\"class\":\"layui-icon laydate-icon laydate-prev-y\"});return e.innerHTML=\"&#xe65a;\",e}(),function(){var e=lay.elem(\"i\",{\"class\":\"layui-icon laydate-icon laydate-prev-m\"});return e.innerHTML=\"&#xe603;\",e}(),function(){var e=lay.elem(\"div\",{\"class\":\"laydate-set-ym\"}),t=lay.elem(\"span\"),a=lay.elem(\"span\");return e.appendChild(t),e.appendChild(a),e}(),function(){var e=lay.elem(\"i\",{\"class\":\"layui-icon laydate-icon laydate-next-m\"});return e.innerHTML=\"&#xe602;\",e}(),function(){var e=lay.elem(\"i\",{\"class\":\"layui-icon laydate-icon laydate-next-y\"});return e.innerHTML=\"&#xe65b;\",e}()],l=lay.elem(\"div\",{\"class\":\"layui-laydate-content\"}),r=lay.elem(\"table\"),m=lay.elem(\"thead\"),c=lay.elem(\"tr\");lay.each(i,function(e,a){t.appendChild(a)}),m.appendChild(c),lay.each(new Array(6),function(e){var t=r.insertRow(0);lay.each(new Array(7),function(a){if(0===e){var i=lay.elem(\"th\");i.innerHTML=n.weeks[a],c.appendChild(i)}t.insertCell(a)})}),r.insertBefore(m,r.children[0]),l.appendChild(r),o[e]=lay.elem(\"div\",{\"class\":\"layui-laydate-main laydate-main-list-\"+e}),o[e].appendChild(t),o[e].appendChild(l),s.push(i),y.push(l),d.push(r)}),lay(m).html(function(){var e=[],t=[];return\"datetime\"===a.type&&e.push('<span lay-type=\"datetime\" class=\"'+v+'\">'+n.timeTips+\"</span>\"),(a.range||\"datetime\"!==a.type)&&e.push('<span class=\"'+T+'\" title=\"'+n.preview+'\"></span>'),lay.each(a.btns,function(e,l){var r=n.tools[l]||\"btn\";a.range&&\"now\"===l||(i&&\"clear\"===l&&(r=\"cn\"===a.lang?\"\\u91cd\\u7f6e\":\"Reset\"),t.push('<span lay-type=\"'+l+'\" class=\"laydate-btns-'+l+'\">'+r+\"</span>\"))}),e.push('<div class=\"laydate-footer-btns\">'+t.join(\"\")+\"</div>\"),e.join(\"\")}()),lay.each(o,function(e,t){r.appendChild(t)}),a.showBottom&&r.appendChild(m),/^#/.test(a.theme)){var u=lay.elem(\"style\"),h=[\"#{{id}} .layui-laydate-header{background-color:{{theme}};}\",\"#{{id}} .layui-this{background-color:{{theme}} !important;}\"].join(\"\").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,a.theme);\"styleSheet\"in u?(u.setAttribute(\"type\",\"text/css\"),u.styleSheet.cssText=h):u.innerHTML=h,lay(r).addClass(\"laydate-theme-molv\"),r.appendChild(u)}l.thisId=a.id,e.remove(D.thisElemDate),i?a.elem.append(r):(t.body.appendChild(r),e.position()),e.checkDate().calendar(null,0,\"init\"),e.changeEvent(),D.thisElemDate=e.elemID,\"function\"==typeof a.ready&&a.ready(lay.extend({},a.dateTime,{month:a.dateTime.month+1})),e.preview()},D.prototype.remove=function(e){var t=this,a=(t.config,lay(\"#\"+(e||t.elemID)));return a[0]?(a.hasClass(c)||t.checkDate(function(){a.remove()}),t):t},D.prototype.position=function(){var e=this,t=e.config;return lay.position(e.bindElem||t.elem[0],e.elem,{position:t.position}),e},D.prototype.hint=function(e){var t=this,a=(t.config,lay.elem(\"div\",{\"class\":h}));t.elem&&(a.innerHTML=e||\"\",lay(t.elem).find(\".\"+h).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find(\".\"+h).remove()},3e3))},D.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},D.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},D.prototype.checkDate=function(e){var t,a,n=this,i=(new Date,n.config),r=n.lang(),o=i.dateTime=i.dateTime||n.systemDate(),s=n.bindElem||i.elem[0],y=(n.isInput(s)?\"val\":\"html\",function(){if(n.rangeElem){var e=[n.rangeElem[0].val(),n.rangeElem[1].val()];if(e[0]&&e[1])return e.join(\" \"+n.rangeStr+\" \")}return n.isInput(s)?s.value:\"static\"===i.position?\"\":lay(s).attr(\"lay-date\")}()),d=function(e){e.year>m[1]&&(e.year=m[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=l.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},c=function(e,t,l){var r=[\"startTime\",\"endTime\"];t=(t.match(n.EXP_SPLIT)||[]).slice(1),l=l||0,i.range&&(n[r[l]]=n[r[l]]||{}),lay.each(n.format,function(o,s){var y=parseFloat(t[o]);t[o].length<s.length&&(a=!0),/yyyy|y/.test(s)?(y<m[0]&&(y=m[0],a=!0),e.year=y):/MM|M/.test(s)?(y<1&&(y=1,a=!0),e.month=y-1):/dd|d/.test(s)?(y<1&&(y=1,a=!0),e.date=y):/HH|H/.test(s)?(y<1&&(y=0,a=!0),e.hours=y,i.range&&(n[r[l]].hours=y)):/mm|m/.test(s)?(y<1&&(y=0,a=!0),e.minutes=y,i.range&&(n[r[l]].minutes=y)):/ss|s/.test(s)&&(y<1&&(y=0,a=!0),e.seconds=y,i.range&&(n[r[l]].seconds=y))}),d(e)};if(\"limit\"===e)return d(o),n;y=y||i.value,\"string\"==typeof y&&(y=y.replace(/\\s+/g,\" \").replace(/^\\s|\\s$/g,\"\"));var u=function(){i.range&&(n.endDate=n.endDate||lay.extend({},i.dateTime,function(){var e={},t=i.dateTime,a=n.getAsYM(t.year,t.month);return\"year\"===i.type?e.year=t.year+1:\"time\"!==i.type&&(e.year=a[0],e.month=a[1]),\"datetime\"!==i.type&&\"time\"!==i.type||(e.hours=23,e.minutes=e.seconds=59),e}()))};u(),\"string\"==typeof y&&y?n.EXP_IF.test(y)?i.range?(y=y.split(\" \"+n.rangeStr+\" \"),lay.each([i.dateTime,n.endDate],function(e,t){c(t,y[e],e)})):c(o,y):(n.hint(r.formatError[0]+(i.range?i.format+\" \"+n.rangeStr+\" \"+i.format:i.format)+r.formatError[1]),a=!0):y&&\"date\"===layui._typeof(y)?i.dateTime=n.systemDate(y):(i.dateTime=n.systemDate(),delete n.startTime,delete n.endDate,u(),delete n.endTime),function(){if(n.rangeElem){var e=[n.rangeElem[0].val(),n.rangeElem[1].val()],t=[i.dateTime,n.endDate];lay.each(e,function(e,a){n.EXP_IF_ONE.test(a)&&c(t[e],a,e)})}}(),d(o),i.range&&d(n.endDate),a&&y&&n.setValue(i.range?n.endDate?n.parse():\"\":n.parse());var h=function(e){return n.newDate(e).getTime()};return(h(o)>h(i.max)||h(o)<h(i.min))&&(o=i.dateTime=lay.extend({},i.min)),i.range&&(h(n.endDate)<h(i.min)||h(n.endDate)>h(i.max))&&(n.endDate=lay.extend({},i.max)),e&&e(),n},D.prototype.mark=function(e,t){var a,n=this,i=n.config;return lay.each(i.mark,function(e,n){var i=e.split(\"-\");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(a=n||t[2])}),a&&e.html('<span class=\"laydate-day-mark\">'+a+\"</span>\"),n},D.prototype.limit=function(e,t,a,n){var i,l=this,r=l.config,o={},s=r[a>41?\"endDate\":\"dateTime\"],y=lay.extend({},s,t||{});return lay.each({now:y,min:r.min,max:r.max},function(e,t){o[e]=l.newDate(lay.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return lay.each(n,function(a,n){e[n]=t[n]}),e}())).getTime()}),i=o.now<o.min||o.now>o.max,e&&e[i?\"addClass\":\"removeClass\"](d),i},D.prototype.thisDateTime=function(e){var t=this,a=t.config;return e?t.endDate:a.dateTime},D.prototype.calendar=function(e,t,a){var n,i,r,o=this,s=o.config,t=t?1:0,d=e||o.thisDateTime(t),c=new Date,u=o.lang(),h=\"date\"!==s.type&&\"datetime\"!==s.type,f=lay(o.table[t]).find(\"td\"),g=lay(o.elemHeader[t][2]).find(\"span\");return d.year<m[0]&&(d.year=m[0],o.hint(u.invalidDate)),d.year>m[1]&&(d.year=m[1],o.hint(u.invalidDate)),o.firstDate||(o.firstDate=lay.extend({},d)),c.setFullYear(d.year,d.month,1),n=c.getDay(),i=l.getEndDate(d.month||12,d.year),r=l.getEndDate(d.month+1,d.year),lay.each(f,function(e,t){var a=[d.year,d.month],l=0;t=lay(t),t.removeAttr(\"class\"),e<n?(l=i-n+e,t.addClass(\"laydate-day-prev\"),a=o.getAsYM(d.year,d.month,\"sub\")):e>=n&&e<r+n?(l=e-n,l+1===d.date&&t.addClass(y)):(l=e-r-n,t.addClass(\"laydate-day-next\"),a=o.getAsYM(d.year,d.month)),a[1]++,a[2]=l+1,t.attr(\"lay-ymd\",a.join(\"-\")).html(a[2]),o.mark(t,a).limit(t,{year:a[0],month:a[1]-1,date:a[2]},e)}),lay(g[0]).attr(\"lay-ym\",d.year+\"-\"+(d.month+1)),lay(g[1]).attr(\"lay-ym\",d.year+\"-\"+(d.month+1)),\"cn\"===s.lang?(lay(g[0]).attr(\"lay-type\",\"year\").html(d.year+\" \\u5e74\"),lay(g[1]).attr(\"lay-type\",\"month\").html(d.month+1+\" \\u6708\")):(lay(g[0]).attr(\"lay-type\",\"month\").html(u.month[d.month]),lay(g[1]).attr(\"lay-type\",\"year\").html(d.year)),h&&(s.range?e&&(o.listYM=[[s.dateTime.year,s.dateTime.month+1],[o.endDate.year,o.endDate.month+1]],o.list(s.type,0).list(s.type,1),\"time\"===s.type?o.setBtnStatus(\"\\u65f6\\u95f4\",lay.extend({},o.systemDate(),o.startTime),lay.extend({},o.systemDate(),o.endTime)):o.setBtnStatus(!0)):(o.listYM=[[d.year,d.month+1]],o.list(s.type,0))),s.range&&\"init\"===a&&!e&&o.calendar(o.endDate,1),s.range||o.limit(lay(o.footer).find(p),null,0,[\"hours\",\"minutes\",\"seconds\"]),o.setBtnStatus(),o},D.prototype.list=function(e,t){var a=this,n=a.config,i=n.dateTime,l=a.lang(),r=n.range&&\"date\"!==n.type&&\"datetime\"!==n.type,o=lay.elem(\"ul\",{\"class\":u+\" \"+{year:\"laydate-year-list\",month:\"laydate-month-list\",time:\"laydate-time-list\"}[e]}),s=a.elemHeader[t],m=lay(s[2]).find(\"span\"),c=a.elemCont[t||0],h=lay(c).find(\".\"+u)[0],f=\"cn\"===n.lang,T=f?\"\\u5e74\":\"\",D=a.listYM[t]||{},w=[\"hours\",\"minutes\",\"seconds\"],x=[\"startTime\",\"endTime\"][t];if(D[0]<1&&(D[0]=1),\"year\"===e){var M,E=M=D[0]-7;E<1&&(E=M=1),lay.each(new Array(15),function(e){var i=lay.elem(\"li\",{\"lay-ym\":M}),l={year:M};M==D[0]&&lay(i).addClass(y),i.innerHTML=M+T,o.appendChild(i),M<a.firstDate.year?(l.month=n.min.month,l.date=n.min.date):M>=a.firstDate.year&&(l.month=n.max.month,l.date=n.max.date),a.limit(lay(i),l,t),M++}),lay(m[f?0:1]).attr(\"lay-ym\",M-8+\"-\"+D[1]).html(E+T+\" - \"+(M-1+T))}else if(\"month\"===e)lay.each(new Array(12),function(e){var i=lay.elem(\"li\",{\"lay-ym\":e}),r={year:D[0],month:e};e+1==D[1]&&lay(i).addClass(y),i.innerHTML=l.month[e]+(f?\"\\u6708\":\"\"),o.appendChild(i),D[0]<a.firstDate.year?r.date=n.min.date:D[0]>=a.firstDate.year&&(r.date=n.max.date),a.limit(lay(i),r,t)}),lay(m[f?0:1]).attr(\"lay-ym\",D[0]+\"-\"+D[1]).html(D[0]+T);else if(\"time\"===e){var C=function(){lay(o).find(\"ol\").each(function(e,n){lay(n).find(\"li\").each(function(n,i){a.limit(lay(i),[{hours:n},{hours:a[x].hours,minutes:n},{hours:a[x].hours,minutes:a[x].minutes,seconds:n}][e],t,[[\"hours\"],[\"hours\",\"minutes\"],[\"hours\",\"minutes\",\"seconds\"]][e])})}),n.range||a.limit(lay(a.footer).find(p),a[x],0,[\"hours\",\"minutes\",\"seconds\"])};n.range?a[x]||(a[x]=\"startTime\"===x?i:a.endDate):a[x]=i,lay.each([24,60,60],function(e,t){var n=lay.elem(\"li\"),i=[\"<p>\"+l.time[e]+\"</p><ol>\"];lay.each(new Array(t),function(t){i.push(\"<li\"+(a[x][w[e]]===t?' class=\"'+y+'\"':\"\")+\">\"+lay.digit(t,2)+\"</li>\")}),n.innerHTML=i.join(\"\")+\"</ol>\",o.appendChild(n)}),C()}if(h&&c.removeChild(h),c.appendChild(o),\"year\"===e||\"month\"===e)lay(a.elemMain[t]).addClass(\"laydate-ym-show\"),lay(o).find(\"li\").on(\"click\",function(){var l=0|lay(this).attr(\"lay-ym\");if(!lay(this).hasClass(d)){0===t?(i[e]=l,a.limit(lay(a.footer).find(p),null,0)):a.endDate[e]=l;var s=\"year\"===n.type||\"month\"===n.type;s?(lay(o).find(\".\"+y).removeClass(y),lay(this).addClass(y),\"month\"===n.type&&\"year\"===e&&(a.listYM[t][0]=l,r&&((t?a.endDate:i).year=l),a.list(\"month\",t))):(a.checkDate(\"limit\").calendar(null,t),a.closeList()),a.setBtnStatus(),n.range||(\"month\"===n.type&&\"month\"===e||\"year\"===n.type&&\"year\"===e)&&a.setValue(a.parse()).remove().done(),a.done(null,\"change\"),lay(a.footer).find(\".\"+v).removeClass(d)}});else{var I=lay.elem(\"span\",{\"class\":g}),k=function(){lay(o).find(\"ol\").each(function(e){var t=this,n=lay(t).find(\"li\");t.scrollTop=30*(a[x][w[e]]-2),t.scrollTop<=0&&n.each(function(e,a){if(!lay(this).hasClass(d))return t.scrollTop=30*(e-2),!0})})},b=lay(s[2]).find(\".\"+g);k(),I.innerHTML=n.range?[l.startTime,l.endTime][t]:l.timeTips,lay(a.elemMain[t]).addClass(\"laydate-time-show\"),b[0]&&b.remove(),s[2].appendChild(I),lay(o).find(\"ol\").each(function(e){var t=this;lay(t).find(\"li\").on(\"click\",function(){var l=0|this.innerHTML;lay(this).hasClass(d)||(n.range?a[x][w[e]]=l:i[w[e]]=l,lay(t).find(\".\"+y).removeClass(y),lay(this).addClass(y),C(),k(),(a.endDate||\"time\"===n.type)&&a.done(null,\"change\"),a.setBtnStatus())})})}return a},D.prototype.listYM=[],D.prototype.closeList=function(){var e=this;e.config;lay.each(e.elemCont,function(t,a){lay(this).find(\".\"+u).remove(),lay(e.elemMain[t]).removeClass(\"laydate-ym-show laydate-time-show\")}),lay(e.elem).find(\".\"+g).remove()},D.prototype.setBtnStatus=function(e,t,a){var n,i=this,l=i.config,r=i.lang(),o=lay(i.footer).find(p);l.range&&\"time\"!==l.type&&(t=t||l.dateTime,a=a||i.endDate,n=i.newDate(t).getTime()>i.newDate(a).getTime(),i.limit(null,t)||i.limit(null,a)?o.addClass(d):o[n?\"addClass\":\"removeClass\"](d),e&&n&&i.hint(\"string\"==typeof e?r.timeout.replace(/\\u65e5\\u671f/g,e):r.timeout))},D.prototype.parse=function(e,t){var a=this,n=a.config,i=t||(\"end\"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},n.dateTime,a.startTime):n.dateTime),r=l.parse(i,a.format,1);return n.range&&void 0===e?r+\" \"+a.rangeStr+\" \"+a.parse(\"end\"):r},D.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},D.prototype.setValue=function(e){var t=this,a=t.config,n=t.bindElem||a.elem[0];return\"static\"===a.position?t:(e=e||\"\",t.isInput(n)?lay(n).val(e):t.rangeElem?(t.rangeElem[0].val(e?t.parse(\"start\"):\"\"),t.rangeElem[1].val(e?t.parse(\"end\"):\"\")):(0===lay(n).find(\"*\").length&&lay(n).html(e),lay(n).attr(\"lay-date\",e)),t)},D.prototype.preview=function(){var e=this,t=e.config;if(t.isPreview){var a=lay(e.elem).find(\".\"+T),n=t.range?e.endDate?e.parse():\"\":e.parse();a.html(n).css({color:\"#5FB878\"}),setTimeout(function(){a.css({color:\"#666\"})},300)}},D.prototype.done=function(e,t){var a=this,n=a.config,i=lay.extend({},lay.extend(n.dateTime,a.startTime)),l=lay.extend({},lay.extend(a.endDate,a.endTime));return lay.each([i,l],function(e,t){\"month\"in t&&lay.extend(t,{month:t.month+1})}),a.preview(),e=e||[a.parse(),i,l],\"function\"==typeof n[t||\"done\"]&&n[t||\"done\"].apply(n,e),a},D.prototype.choose=function(e,t){var a=this,n=a.config,i=a.thisDateTime(t),l=(lay(a.elem).find(\"td\"),e.attr(\"lay-ymd\").split(\"-\"));l={year:0|l[0],month:(0|l[1])-1,date:0|l[2]},e.hasClass(d)||(lay.extend(i,l),n.range?(lay.each([\"startTime\",\"endTime\"],function(e,t){a[t]=a[t]||{hours:0,minutes:0,seconds:0}}),a.calendar(null,t).done(null,\"change\")):\"static\"===n.position?a.calendar().done().done(null,\"change\"):\"date\"===n.type?a.setValue(a.parse()).remove().done():\"datetime\"===n.type&&a.calendar().done(null,\"change\"))},D.prototype.tool=function(e,t){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r=\"static\"===n.position,o={datetime:function(){lay(e).hasClass(d)||(a.list(\"time\",0),n.range&&a.list(\"time\",1),lay(e).attr(\"lay-type\",\"date\").html(a.lang().dateTips))},date:function(){a.closeList(),lay(e).attr(\"lay-type\",\"datetime\").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue(\"\").remove(),a.done([\"\",{},{}])},now:function(){var e=new Date;lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()).remove(),r&&a.calendar(),a.done()},confirm:function(){if(n.range){if(lay(e).hasClass(d))return a.hint(\"time\"===n.type?i.timeout.replace(/\\u65e5\\u671f/g,\"\\u65f6\\u95f4\"):i.timeout)}else if(lay(e).hasClass(d))return a.hint(i.invalidDate);a.done(),a.setValue(a.parse()).remove()}};o[t]&&o[t]()},D.prototype.change=function(e){var t=this,a=t.config,n=t.thisDateTime(e),i=a.range&&(\"year\"===a.type||\"month\"===a.type),l=t.elemCont[e||0],r=t.listYM[e],o=function(o){var s=lay(l).find(\".laydate-year-list\")[0],y=lay(l).find(\".laydate-month-list\")[0];return s&&(r[0]=o?r[0]-15:r[0]+15,t.list(\"year\",e)),y&&(o?r[0]--:r[0]++,t.list(\"month\",e)),(s||y)&&(lay.extend(n,{year:r[0]}),i&&(n.year=r[0]),a.range||t.done(null,\"change\"),a.range||t.limit(lay(t.footer).find(p),{year:r[0]})),t.setBtnStatus(),s||y};return{prevYear:function(){o(\"sub\")||(n.year--,t.checkDate(\"limit\").calendar(null,e),t.done(null,\"change\"))},prevMonth:function(){var a=t.getAsYM(n.year,n.month,\"sub\");lay.extend(n,{year:a[0],month:a[1]}),t.checkDate(\"limit\").calendar(null,e),t.done(null,\"change\")},nextMonth:function(){var a=t.getAsYM(n.year,n.month);lay.extend(n,{year:a[0],month:a[1]}),t.checkDate(\"limit\").calendar(null,e),t.done(null,\"change\")},nextYear:function(){o()||(n.year++,t.checkDate(\"limit\").calendar(null,e),t.done(null,\"change\"))}}},D.prototype.changeEvent=function(){var e=this;e.config;lay(e.elem).on(\"click\",function(e){lay.stope(e)}).on(\"mousedown\",function(e){lay.stope(e)}),lay.each(e.elemHeader,function(t,a){lay(a[0]).on(\"click\",function(a){e.change(t).prevYear()}),lay(a[1]).on(\"click\",function(a){e.change(t).prevMonth()}),lay(a[2]).find(\"span\").on(\"click\",function(a){var n=lay(this),i=n.attr(\"lay-ym\"),l=n.attr(\"lay-type\");i&&(i=i.split(\"-\"),e.listYM[t]=[0|i[0],0|i[1]],e.list(l,t),lay(e.footer).find(\".\"+v).addClass(d))}),lay(a[3]).on(\"click\",function(a){e.change(t).nextMonth()}),lay(a[4]).on(\"click\",function(a){e.change(t).nextYear()})}),lay.each(e.table,function(t,a){var n=lay(a).find(\"td\");n.on(\"click\",function(){e.choose(lay(this),t)})}),lay(e.footer).find(\"span\").on(\"click\",function(){var t=lay(this).attr(\"lay-type\");e.tool(this,t)})},D.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},D.prototype.events=function(){var e=this,t=e.config,a=function(a,n){a.on(t.trigger,function(){n&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(a(t.elem,\"bind\"),a(t.eventElem),t.elem[0].eventHandler=!0)},r.that={},r.getThis=function(e){var t=r.that[e];return!t&&a&&layui.hint().error(e?o+\" instance with ID '\"+e+\"' not found\":\"ID argument required\"),t},n.run=function(a){a(t).on(\"mousedown\",function(e){if(l.thisId){var t=r.getThis(l.thisId);if(t){var n=t.config;e.target!==n.elem[0]&&e.target!==n.eventElem[0]&&e.target!==a(n.closeStop)[0]&&t.remove()}}}).on(\"keydown\",function(e){if(l.thisId){var t=r.getThis(l.thisId);t&&13===e.keyCode&&a(\"#\"+t.elemID)[0]&&t.elemID===D.thisElemDate&&(e.preventDefault(),a(t.footer).find(p)[0].click())}}),a(e).on(\"resize\",function(){if(l.thisId){var e=r.getThis(l.thisId);if(e)return!(!e.elem||!a(s)[0])&&void e.position()}})},l.render=function(e){var t=new D(e);return r.call(t)},l.parse=function(e,t,a){return e=e||{},\"string\"==typeof t&&(t=r.formatArr(t)),t=(t||[]).concat(),lay.each(t,function(n,i){/yyyy|y/.test(i)?t[n]=lay.digit(e.year,i.length):/MM|M/.test(i)?t[n]=lay.digit(e.month+(a||0),i.length):/dd|d/.test(i)?t[n]=lay.digit(e.date,i.length):/HH|H/.test(i)?t[n]=lay.digit(e.hours,i.length):/mm|m/.test(i)?t[n]=lay.digit(e.minutes,i.length):/ss|s/.test(i)&&(t[n]=lay.digit(e.seconds,i.length))}),t.join(\"\")},l.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},a?(l.ready(),layui.define(\"lay\",function(e){l.path=layui.cache.dir,n.run(lay),e(o,l)})):\"function\"==typeof define&&define.amd?define(function(){return n.run(lay),l}):function(){l.ready(),n.run(e.lay),e.laydate=l}()}(window,window.document);!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(e,t,n){var r=!0,i=\"width\"===t?e.offsetWidth:e.offsetHeight,o=ht(e),a=fe.boxSizing&&\"border-box\"===pe.css(e,\"boxSizing\",!1,o);if(i<=0||null==i){if(i=gt(e,t,o),(i<0||null==i)&&(i=e.style[t]),ft.test(i))return i;r=a&&(fe.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+F(e,t,n||(a?\"border\":\"content\"),r,o)+\"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){if(!pe.contains(e.ownerDocument||re,e))return!0;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.4\",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>\",l.childNodes[0].style.borderCollapse=\"separate\",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){layui.$=pe,e(\"jquery\",pe)}),pe});!function(e,t){\"use strict\";var i,n,a=e.layui&&layui.define,o={getPath:function(){var t=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if(\"interactive\"===t[n].readyState){e=t[n].src;break}return e||t[i].src}(),i=e.LAYUI_GLOBAL||{};return i.layer_dir||t.substring(0,t.lastIndexOf(\"/\")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:[\"&#x786E;&#x5B9A;\",\"&#x53D6;&#x6D88;\"],type:[\"dialog\",\"page\",\"iframe\",\"loading\",\"tips\"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?\"getPropertyValue\":\"getAttribute\"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName(\"head\")[0],s=document.createElement(\"link\");\"string\"==typeof i&&(n=i);var l=(n||t).replace(/\\.|\\//g,\"\"),f=\"layuicss-\"+l,c=\"creating\",u=0;s.rel=\"stylesheet\",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),\"function\"==typeof i&&!function d(t){var n=100,a=document.getElementById(f);return++u>1e4/n?e.console&&console.error(l+\".css: Invalid\"):void(1989===parseInt(o.getStyle(a,\"width\"))?(t===c&&a.removeAttribute(\"lay-status\"),a.getAttribute(\"lay-status\")===c?setTimeout(d,n):i()):(a.setAttribute(\"lay-status\",c),setTimeout(function(){d(c)},n)))}()}}},r={v:\"3.5.1\",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):o.link(\"theme/\"+e.extend),this):this},ready:function(e){var t=\"layer\",i=\"\",n=(a?\"modules/layer/\":\"theme/\")+\"default/layer.css?v=\"+r.v+i;return a?layui.addcss(n,e,t):o.link(n,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:260},n))}},s=function(e){var t=this,a=function(){t.creat()};t.index=++r.index,t.config.maxWidth=i(n).width()-30,t.config=i.extend({},t.config,o.config,e),document.body?a():setTimeout(function(){a()},30)};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-00\",\"layer-anim-01\",\"layer-anim-02\",\"layer-anim-03\",\"layer-anim-04\",\"layer-anim-05\",\"layer-anim-06\"],l.SHADE=\"layui-layer-shade\",l.MOVE=\"layui-layer-move\",s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:\"&#x4FE1;&#x606F;\",offset:\"auto\",area:\"auto\",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,minStack:!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=\"'+l.SHADE+'\" id=\"'+l.SHADE+a+'\" times=\"'+a+'\" style=\"'+(\"z-index:\"+(s-1)+\"; \")+'\"></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]+\";position:\"+(r.fixed?\"fixed;\":\"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=\"'+l.MOVE+'\" id=\"'+l.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||\"\",\"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\")}if(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(\"#\"+l.MOVE)[0]||c.append(o.moveElem=u),e.layero=i(\"#\"+l[0]+a),e.shadeo=i(\"#\"+l.SHADE+a),t.scrollbar||l.html.css(\"overflow\",\"hidden\").attr(\"layer-full\",a)}).auto(a),e.shadeo.css({\"background-color\":t.shade[1]||\"#000\",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find(\"iframe\").attr(\"src\",s[0]),4==t.type?e.tips():function(){e.offset(),parseInt(o.getStyle(document.getElementById(l.MOVE),\"z-index\"))||function(){e.layero.css(\"visibility\",\"hidden\"),r.ready(function(){e.offset(),e.layero.css(\"visibility\",\"visible\")})}()}(),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]){var u=\"layer-anim \"+l.anim[t.anim];e.layero.addClass(u).one(\"webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend\",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data(\"isOutAnim\",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i(\"#\"+l[0]+e);\"\"===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find(\".\"+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css(\"padding-top\"))))};switch(a.type){case 2:u(\"iframe\");break;default:\"\"===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u(\".\"+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u(\".\"+l[5])):u(\".\"+l[5])}return t},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,t)}):a.success(n,t.index,t)),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&&t.shadeo.on(\"click\",function(){r.close(t.index)}),n.find(\".layui-layer-min\").on(\"click\",function(){var e=a.min&&a.min(n,t.index);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,t.index)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n,t.index)},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){t=t||{};var a=i(\"#\"+l[0]+e),s=i(\"#\"+l.SHADE+e),f=a.find(l[1]).outerHeight()||0,c=a.attr(\"minLeft\")||181*o.minIndex+\"px\",u=a.css(\"position\"),d={width:180,height:f,position:\"fixed\",overflow:\"hidden\"};o.record(a),o.minLeft[0]&&(c=o.minLeft[0],o.minLeft.shift()),t.minStack&&(d.left=c,d.top=n.height()-f,a.attr(\"minLeft\")||o.minIndex++,a.attr(\"minLeft\",c)),a.attr(\"position\",u),r.style(e,d,!0),a.find(\".layui-layer-min\").hide(),\"page\"===a.attr(\"type\")&&a.find(l[4]).hide(),o.rescollbar(e),s.hide()},r.restore=function(e){var t=i(\"#\"+l[0]+e),n=i(\"#\"+l.SHADE+e),a=t.attr(\"area\").split(\",\");t.attr(\"type\");r.style(e,{width:parseFloat(a[0]),height:parseFloat(a[1]),top:parseFloat(a[2]),left:parseFloat(a[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),n.show()},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,t){var n=i(\"#\"+l[0]+e),a=n.attr(\"type\"),s=\"layer-anim-close\";if(n[0]){var f=\"layui-layer-wrap\",c=function(){if(a===o.type[1]&&\"object\"===n.attr(\"conType\")){n.children(\":not(.\"+l[5]+\")\").remove();for(var r=n.find(\".\"+f),s=0;s<2;s++)r.unwrap();r.css(\"display\",r.data(\"display\")).removeClass(f)}else{if(a===o.type[2])try{var c=i(\"#\"+l[4]+e)[0];c.contentWindow.document.write(\"\"),c.contentWindow.close(),n.find(\".\"+l[5])[0].removeChild(c)}catch(u){}n[0].innerHTML=\"\",n.remove()}\"function\"==typeof o.end[e]&&o.end[e](),delete o.end[e],\"function\"==typeof t&&t()};n.data(\"isOutAnim\")&&n.addClass(\"layer-anim \"+s),i(\"#layui-layer-moves, #\"+l.SHADE+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),n.attr(\"minLeft\")&&(o.minIndex--,o.minLeft.push(n.attr(\"minLeft\"))),r.ie&&r.ie<10||!n.data(\"isOutAnim\")?c():setTimeout(function(){c()},200)}},r.closeAll=function(e,t){\"function\"==typeof e&&(t=e,e=null);var n=i(\".\"+l[0]);i.each(n,function(a){var o=i(this),s=e?o.attr(\"type\")===e:1;s&&r.close(o.attr(\"times\"),a===n.length-1?t:null),s=null}),0===n.length&&\"function\"==typeof t&&t()};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+\"></textarea>\":function(){return'<input type=\"'+(1==e.formType?\"password\":\"text\")+'\" class=\"layui-layer-input\">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:[\"&#x786E;&#x5B9A;\",\"&#x53D6;&#x6D88;\"],content:l,skin:\"layui-layer-prompt\"+c(\"prompt\"),maxWidth:n.width(),success:function(t){s=t.find(\".layui-layer-input\"),s.val(e.value||\"\").focus(),\"function\"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();\"\"===n?s.focus():n.length>(e.maxlength||500)?r.tips(\"&#x6700;&#x591A;&#x8F93;&#x5165;\"+(e.maxlength||500)+\"&#x4E2A;&#x5B57;&#x6570;\",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n=\"layui-this\",a=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,a=\"\";if(e>0)for(a='<span class=\"'+n+'\">'+t[0].title+\"</span>\";i<e;i++)a+=\"<span>\"+t[i].title+\"</span>\";return a}(),content:'<ul class=\"layui-layer-tabmain\">'+function(){var e=t.length,i=1,a=\"\";if(e>0)for(a='<li class=\"layui-layer-tabli '+n+'\">'+(t[0].content||\"no content\")+\"</li>\";i<e;i++)a+='<li class=\"layui-layer-tabli\">'+(t[i].content||\"no  content\")+\"</li>\";return a}()+\"</ul>\",success:function(t){var o=t.find(\".layui-layer-title\").children(),r=t.find(\".layui-layer-tabmain\").children();o.on(\"mousedown\",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),\"function\"==typeof e.change&&e.change(o)}),\"function\"==typeof a&&a(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=!(\"string\"==typeof t.photos||t.photos instanceof i),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(\"&#x6CA1;&#x6709;&#x56FE;&#x7247;\")}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(){h();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)}),!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){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.find(\".layui-layer-imgprev\").on(\"click\",function(e){e.preventDefault(),s.imgprev(!0)}),s.bigimg.find(\".layui-layer-imgnext\").on(\"click\",function(e){e.preventDefault(),s.imgnext(!0)}),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),a&&(t.anim=-1),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,isOutAnim:!1,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+'\">'+function(){return u.length>1?'<div class=\"layui-layer-imgsee\"><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-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(\"&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;\",{time:3e4,btn:[\"&#x4E0B;&#x4E00;&#x5F20;\",\"&#x4E0D;&#x770B;&#x4E86;\"],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.$),e.layer=r,t(\"layer\",r)})):\"function\"==typeof define&&define.amd?define([\"jquery\"],function(){return o.run(e.jQuery),r}):function(){r.ready(),o.run(e.jQuery)}()}(window);layui.define(\"jquery\",function(e){\"use strict\";var t=layui.$,i=layui.hint(),n={fixbar:function(e){var i,n,r=\"layui-fixbar\",a=\"layui-fixbar-top\",o=t(document),l=t(\"body\");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?\"&#xe606;\":e.bar1,e.bar2=e.bar2===!0?\"&#xe607;\":e.bar2,e.bgcolor=e.bgcolor?\"background-color:\"+e.bgcolor:\"\";var c=[e.bar1,e.bar2,\"&#xe604;\"],g=t(['<ul class=\"'+r+'\">',e.bar1?'<li class=\"layui-icon\" lay-type=\"bar1\" style=\"'+e.bgcolor+'\">'+c[0]+\"</li>\":\"\",e.bar2?'<li class=\"layui-icon\" lay-type=\"bar2\" style=\"'+e.bgcolor+'\">'+c[1]+\"</li>\":\"\",'<li class=\"layui-icon '+a+'\" lay-type=\"top\" style=\"'+e.bgcolor+'\">'+c[2]+\"</li>\",\"</ul>\"].join(\"\")),u=g.find(\".\"+a),s=function(){var t=o.scrollTop();t>=e.showHeight?i||(u.show(),i=1):i&&(u.hide(),i=0)};t(\".\"+r)[0]||(\"object\"==typeof e.css&&g.css(e.css),l.append(g),s(),g.find(\"li\").on(\"click\",function(){var i=t(this),n=i.attr(\"lay-type\");\"top\"===n&&t(\"html,body\").animate({scrollTop:0},200),e.click&&e.click.call(this,n)}),o.on(\"scroll\",function(){clearTimeout(n),n=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var n=this,r=\"function\"==typeof t,a=new Date(e).getTime(),o=new Date(!t||r?(new Date).getTime():t).getTime(),l=a-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];r&&(i=t);var g=setTimeout(function(){n.countdown(e,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,g),l<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,n=[[],[]],r=(new Date).getTime()-new Date(e).getTime();return r>26784e5?(r=new Date(e),n[0][0]=i.digit(r.getFullYear(),4),n[0][1]=i.digit(r.getMonth()+1),n[0][2]=i.digit(r.getDate()),t||(n[1][0]=i.digit(r.getHours()),n[1][1]=i.digit(r.getMinutes()),n[1][2]=i.digit(r.getSeconds())),n[0].join(\"-\")+\" \"+n[1].join(\":\")):r>=864e5?(r/1e3/60/60/24|0)+\"\\u5929\\u524d\":r>=36e5?(r/1e3/60/60|0)+\"\\u5c0f\\u65f6\\u524d\":r>=18e4?(r/1e3/60|0)+\"\\u5206\\u949f\\u524d\":r<0?\"\\u672a\\u6765\":\"\\u521a\\u521a\"},digit:function(e,t){var i=\"\";e=String(e),t=t||2;for(var n=e.length;n<t;n++)i+=\"0\";return e<Math.pow(10,t)?i+(0|e):e},toDateString:function(e,t){if(null===e||\"\"===e)return\"\";var n=this,r=new Date(function(){if(e)return isNaN(e)?e:\"string\"==typeof e?parseInt(e):e}()||new Date),a=[n.digit(r.getFullYear(),4),n.digit(r.getMonth()+1),n.digit(r.getDate())],o=[n.digit(r.getHours()),n.digit(r.getMinutes()),n.digit(r.getSeconds())];return r.getDate()?(t=t||\"yyyy-MM-dd HH:mm:ss\",t.replace(/yyyy/g,a[0]).replace(/MM/g,a[1]).replace(/dd/g,a[2]).replace(/HH/g,o[0]).replace(/mm/g,o[1]).replace(/ss/g,o[2])):(i.error('Invalid Msec for \"util.toDateString(Msec)\"'),\"\")},escape:function(e){return String(e||\"\").replace(/&(?!#?[a-zA-Z0-9]+;)/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/'/g,\"&#39;\").replace(/\"/g,\"&quot;\")},unescape:function(e){return String(e||\"\").replace(/\\&amp;/g,\"&\").replace(/\\&lt;/g,\"<\").replace(/\\&gt;/g,\">\").replace(/\\&#39;/,\"'\").replace(/\\&quot;/,'\"')},toVisibleArea:function(e){if(e=t.extend({margin:160,duration:200,type:\"y\"},e),e.scrollElem[0]&&e.thisElem[0]){var i=e.scrollElem,n=e.thisElem,r=\"y\"===e.type,a=r?\"scrollTop\":\"scrollLeft\",o=r?\"top\":\"left\",l=i[a](),c=i[r?\"height\":\"width\"](),g=i.offset()[o],u=n.offset()[o]-g,s={};(u>c-e.margin||u<e.margin)&&(s[a]=u-c/2+l,i.animate(s,e.duration))}},event:function(e,i,r){var a=t(\"body\");return r=r||\"click\",i=n.event[e]=t.extend(!0,n.event[e],i)||{},n.event.UTIL_EVENT_CALLBACK=n.event.UTIL_EVENT_CALLBACK||{},a.off(r,\"*[\"+e+\"]\",n.event.UTIL_EVENT_CALLBACK[e]),n.event.UTIL_EVENT_CALLBACK[e]=function(){var n=t(this),r=n.attr(e);\"function\"==typeof i[r]&&i[r].call(this,n)},a.on(r,\"*[\"+e+\"]\",n.event.UTIL_EVENT_CALLBACK[e]),i}};e(\"util\",n)});layui.define(\"jquery\",function(t){\"use strict\";var i=layui.$,a=(layui.hint(),layui.device()),e=\"element\",l=\"layui-this\",n=\"layui-show\",s=function(){this.config={}};s.prototype.set=function(t){var a=this;return i.extend(!0,a.config,t),a},s.prototype.on=function(t,i){return layui.onevent.call(this,e,t,i)},s.prototype.tabAdd=function(t,a){var e=\".layui-tab-title\",l=i(\".layui-tab[lay-filter=\"+t+\"]\"),n=l.children(e),s=n.children(\".layui-tab-bar\"),o=l.children(\".layui-tab-content\"),r=\"<li\"+function(){var t=[];return layui.each(a,function(i,a){/^(title|content)$/.test(i)||t.push(\"lay-\"+i+'=\"'+a+'\"')}),t.length>0&&t.unshift(\"\"),t.join(\" \")}()+\">\"+(a.title||\"unnaming\")+\"</li>\";return s[0]?s.before(r):n.append(r),o.append('<div class=\"layui-tab-item\">'+(a.content||\"\")+\"</div>\"),b.hideTabMore(!0),b.tabAuto(),this},s.prototype.tabDelete=function(t,a){var e=\".layui-tab-title\",l=i(\".layui-tab[lay-filter=\"+t+\"]\"),n=l.children(e),s=n.find('>li[lay-id=\"'+a+'\"]');return b.tabDelete(null,s),this},s.prototype.tabChange=function(t,a){var e=\".layui-tab-title\",l=i(\".layui-tab[lay-filter=\"+t+\"]\"),n=l.children(e),s=n.find('>li[lay-id=\"'+a+'\"]');return b.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},m.on(\"click\",t.headerElem,function(a){var e=i(this).index();b.tabClick.call(this,a,e,null,t)})},s.prototype.progress=function(t,a){var e=\"layui-progress\",l=i(\".\"+e+\"[lay-filter=\"+t+\"]\"),n=l.find(\".\"+e+\"-bar\"),s=n.find(\".\"+e+\"-text\");return n.css(\"width\",a).attr(\"lay-percent\",a),s.text(a),this};var o=\".layui-nav\",r=\"layui-nav-item\",c=\"layui-nav-bar\",u=\"layui-nav-tree\",y=\"layui-nav-child\",d=\"layui-nav-child-c\",f=\"layui-nav-more\",h=\"layui-icon-down\",p=\"layui-anim layui-anim-upbit\",b={tabClick:function(t,a,s,o){o=o||{};var r=s||i(this),a=a||r.parent().children(\"li\").index(r),c=o.headerElem?r.parent():r.parents(\".layui-tab\").eq(0),u=o.bodyElem?i(o.bodyElem):c.children(\".layui-tab-content\").children(\".layui-tab-item\"),y=r.find(\"a\"),d=\"javascript:;\"!==y.attr(\"href\")&&\"_blank\"===y.attr(\"target\"),f=\"string\"==typeof r.attr(\"lay-unselect\"),h=c.attr(\"lay-filter\");d||f||(r.addClass(l).siblings().removeClass(l),u.eq(a).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,\"tab(\"+h+\")\",{elem:c,index:a})},tabDelete:function(t,a){var n=a||i(this).parent(),s=n.index(),o=n.parents(\".layui-tab\").eq(0),r=o.children(\".layui-tab-content\").children(\".layui-tab-item\"),c=o.attr(\"lay-filter\");n.hasClass(l)&&(n.next()[0]?b.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&b.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){b.tabAuto()},50),layui.event.call(this,e,\"tabDelete(\"+c+\")\",{elem:o,index:s})},tabAuto:function(){var t=\"layui-tab-more\",e=\"layui-tab-bar\",l=\"layui-tab-close\",n=this;i(\".layui-tab\").each(function(){var s=i(this),o=s.children(\".layui-tab-title\"),r=(s.children(\".layui-tab-content\").children(\".layui-tab-item\"),'lay-stope=\"tabmore\"'),c=i('<span class=\"layui-unselect layui-tab-bar\" '+r+\"><i \"+r+' class=\"layui-icon\">&#xe61a;</i></span>');if(n===window&&8!=a.ie&&b.hideTabMore(!0),s.attr(\"lay-allowClose\")&&o.find(\"li\").each(function(){var t=i(this);if(!t.find(\".\"+l)[0]){var a=i('<i class=\"layui-icon layui-icon-close layui-unselect '+l+'\"></i>');a.on(\"click\",b.tabDelete),t.append(a)}}),\"string\"!=typeof s.attr(\"lay-unauto\"))if(o.prop(\"scrollWidth\")>o.outerWidth()+1){if(o.find(\".\"+e)[0])return;o.append(c),s.attr(\"overflow\",\"\"),c.on(\"click\",function(i){o[this.title?\"removeClass\":\"addClass\"](t),this.title=this.title?\"\":\"\\u6536\\u7f29\"})}else o.find(\".\"+e).remove(),s.removeAttr(\"overflow\")})},hideTabMore:function(t){var a=i(\".layui-tab-title\");t!==!0&&\"tabmore\"===i(t.target).attr(\"lay-stope\")||(a.removeClass(\"layui-tab-more\"),a.find(\".layui-tab-bar\").attr(\"title\",\"\"))},clickThis:function(){var t=i(this),a=t.parents(o),n=a.attr(\"lay-filter\"),s=t.parent(),c=t.siblings(\".\"+y),d=\"string\"==typeof s.attr(\"lay-unselect\");\"javascript:;\"!==t.attr(\"href\")&&\"_blank\"===t.attr(\"target\")||d||c[0]||(a.find(\".\"+l).removeClass(l),s.addClass(l)),a.hasClass(u)&&(c.removeClass(p),c[0]&&(s[\"none\"===c.css(\"display\")?\"addClass\":\"removeClass\"](r+\"ed\"),\"all\"===a.attr(\"lay-shrink\")&&s.siblings().removeClass(r+\"ed\"))),layui.event.call(this,e,\"nav(\"+n+\")\",t)},collapse:function(){var t=i(this),a=t.find(\".layui-colla-icon\"),l=t.siblings(\".layui-colla-content\"),s=t.parents(\".layui-collapse\").eq(0),o=s.attr(\"lay-filter\"),r=\"none\"===l.css(\"display\");if(\"string\"==typeof s.attr(\"lay-accordion\")){var c=s.children(\".layui-colla-item\").children(\".\"+n);c.siblings(\".layui-colla-title\").children(\".layui-colla-icon\").html(\"&#xe602;\"),c.removeClass(n)}l[r?\"addClass\":\"removeClass\"](n),a.html(r?\"&#xe61a;\":\"&#xe602;\"),layui.event.call(this,e,\"collapse(\"+o+\")\",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter=\"'+e+'\"]':\"\"}(),s={tab:function(){b.tabAuto.call({})},nav:function(){var t=200,e={},s={},v={},m=\"layui-nav-title\",C=function(l,o,r){var c=i(this),h=c.find(\".\"+y);if(o.hasClass(u)){if(!h[0]){var b=c.children(\".\"+m);l.css({top:c.offset().top-o.offset().top,height:(b[0]?b:c).outerHeight(),opacity:1})}}else h.addClass(p),h.hasClass(d)&&h.css({left:-(h.outerWidth()-c.width())/2}),h[0]?l.css({left:l.position().left+l.width()/2,width:0,opacity:0}):l.css({left:c.position().left+parseFloat(c.css(\"marginLeft\")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:h[0]?0:c.width(),opacity:h[0]?0:1})},a.ie&&a.ie<10?0:t),clearTimeout(v[r]),\"block\"===h.css(\"display\")&&clearTimeout(s[r]),s[r]=setTimeout(function(){h.addClass(n),c.find(\".\"+f).addClass(f+\"d\")},300)};i(o+l).each(function(a){var l=i(this),o=i('<span class=\"'+c+'\"></span>'),d=l.find(\".\"+r);l.find(\".\"+c)[0]||(l.append(o),(l.hasClass(u)?d.find(\"dd,>.\"+m):d).on(\"mouseenter\",function(){C.call(this,o,l,a)}).on(\"mouseleave\",function(){l.hasClass(u)?o.css({height:0,opacity:0}):(clearTimeout(s[a]),s[a]=setTimeout(function(){l.find(\".\"+y).removeClass(n),l.find(\".\"+f).removeClass(f+\"d\")},300))}),l.on(\"mouseleave\",function(){clearTimeout(e[a]),v[a]=setTimeout(function(){l.hasClass(u)||o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),d.find(\"a\").each(function(){var t=i(this),a=(t.parent(),t.siblings(\".\"+y));a[0]&&!t.children(\".\"+f)[0]&&t.append('<i class=\"layui-icon '+h+\" \"+f+'\"></i>'),t.off(\"click\",b.clickThis).on(\"click\",b.clickThis)})})},breadcrumb:function(){var t=\".layui-breadcrumb\";i(t+l).each(function(){var t=i(this),a=\"lay-separator\",e=t.attr(a)||\"/\",l=t.find(\"a\");l.next(\"span[\"+a+\"]\")[0]||(l.each(function(t){t!==l.length-1&&i(this).after(\"<span \"+a+\">\"+e+\"</span>\")}),t.css(\"visibility\",\"visible\"))})},progress:function(){var t=\"layui-progress\";i(\".\"+t+l).each(function(){var a=i(this),e=a.find(\".layui-progress-bar\"),l=e.attr(\"lay-percent\");e.css(\"width\",function(){return/^.+\\/.+$/.test(l)?100*new Function(\"return \"+l)()+\"%\":l}()),a.attr(\"lay-showPercent\")&&setTimeout(function(){e.html('<span class=\"'+t+'-text\">'+l+\"</span>\")},350)})},collapse:function(){var t=\"layui-collapse\";i(\".\"+t+l).each(function(){var t=i(this).find(\".layui-colla-item\");t.each(function(){var t=i(this),a=t.find(\".layui-colla-title\"),e=t.find(\".layui-colla-content\"),l=\"none\"===e.css(\"display\");a.find(\".layui-colla-icon\").remove(),a.append('<i class=\"layui-icon layui-colla-icon\">'+(l?\"&#xe602;\":\"&#xe61a;\")+\"</i>\"),a.off(\"click\",b.collapse).on(\"click\",b.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,i){i()})},s.prototype.render=s.prototype.init;var v=new s,m=i(document);i(function(){v.render()});var C=\".layui-tab-title li\";m.on(\"click\",C,b.tabClick),m.on(\"click\",b.hideTabMore),i(window).on(\"resize\",b.tabAuto),t(e,v)});layui.define(\"layer\",function(e){\"use strict\";var t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},config:e.config}},r=\"upload\",u=\"layui-upload-file\",c=\"layui-upload-form\",f=\"layui-upload-iframe\",s=\"layui-upload-choose\",p=function(e){var i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:\"images\",exts:\"\",auto:!0,bindAction:\"\",url:\"\",field:\"file\",acceptMime:\"\",method:\"post\",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['<input class=\"'+u+'\" type=\"file\" accept=\"'+i.acceptMime+'\" name=\"'+i.field+'\"',i.multiple?\" multiple\":\"\",\">\"].join(\"\")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('<div class=\"layui-upload-wrap\"></div>'),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t('<iframe id=\"'+f+'\" class=\"'+f+'\" name=\"'+f+'\" frameborder=\"0\"></iframe>'),o=t(['<form target=\"'+f+'\" class=\"'+c+'\" method=\"post\" key=\"set-mine\" enctype=\"multipart/form-data\" action=\"'+i.url+'\">',\"</form>\"].join(\"\"));t(\"#\"+f)[0]||t(\"body\").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next(\".\"+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i=\"function\"==typeof i?i():i,e.push('<input type=\"hidden\" name=\"'+t+'\" value=\"'+i+'\">')}),e.join(\"\")}()))},p.prototype.msg=function(e){return i.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return\"input\"===e.tagName.toLocaleLowerCase()&&\"file\"===e.type},p.prototype.preview=function(e){var t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&\"function\"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t=\"function\"==typeof t?t():t,r.append(e,t)});var c={url:l.url,type:\"post\",data:r,contentType:!1,processData:!1,dataType:\"json\",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg(\"\\u8bf7\\u6c42\\u4e0a\\u4f20\\u63a5\\u53e3\\u51fa\\u73b0\\u5f02\\u5e38\"),m(e),u()}};\"function\"==typeof l.progress&&(c.xhr=function(){var i=t.ajaxSettings.xhr();return i.upload.addEventListener(\"progress\",function(t){if(t.lengthComputable){var i=Math.floor(t.loaded/t.total*100);l.progress(i,l.item?l.item[0]:l.elem[0],t,e)}}),i}),t.ajax(c)})},c=function(){var e=t(\"#\"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find(\"body\");try{t=i.text()}catch(n){a.msg(\"\\u83b7\\u53d6\\u4e0a\\u4f20\\u540e\\u7684\\u54cd\\u5e94\\u4fe1\\u606f\\u51fa\\u73b0\\u5f02\\u5e38\"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(\"\"),d(0,t))},30)},d=function(e,t){if(a.elemFile.next(\".\"+s).remove(),r.value=\"\",\"object\"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg(\"\\u8bf7\\u5bf9\\u4e0a\\u4f20\\u63a5\\u53e3\\u8fd4\\u56de\\u6709\\u6548JSON\")}\"function\"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=\"\"),\"function\"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if(!((\"choose\"===i||l.auto)&&(l.choose&&l.choose(g),\"choose\"===i)||l.before&&l.before(g)===!1))return o.ie?o.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\\/\\\\]+\\..+/g)||[]||\"\":v,0!==v.length){switch(l.accept){case\"file\":if(h&&!RegExp(\"\\\\w\\\\.(\"+h+\")$\",\"i\").test(escape(v)))return a.msg(\"\\u9009\\u62e9\\u7684\\u6587\\u4ef6\\u4e2d\\u5305\\u542b\\u4e0d\\u652f\\u6301\\u7684\\u683c\\u5f0f\"),r.value=\"\";break;case\"video\":if(!RegExp(\"\\\\w\\\\.(\"+(h||\"avi|mp4|wma|rmvb|rm|flash|3gp|flv\")+\")$\",\"i\").test(escape(v)))return a.msg(\"\\u9009\\u62e9\\u7684\\u89c6\\u9891\\u4e2d\\u5305\\u542b\\u4e0d\\u652f\\u6301\\u7684\\u683c\\u5f0f\"),r.value=\"\";break;case\"audio\":if(!RegExp(\"\\\\w\\\\.(\"+(h||\"mp3|wav|mid\")+\")$\",\"i\").test(escape(v)))return a.msg(\"\\u9009\\u62e9\\u7684\\u97f3\\u9891\\u4e2d\\u5305\\u542b\\u4e0d\\u652f\\u6301\\u7684\\u683c\\u5f0f\"),r.value=\"\";break;default:if(layui.each(v,function(e,t){RegExp(\"\\\\w\\\\.(\"+(h||\"ico|webp|svg|jpg|png|gif|bmp|jpeg$\")+\")\",\"i\").test(escape(t))||(n=!0)}),n)return a.msg(\"\\u9009\\u62e9\\u7684\\u56fe\\u7247\\u4e2d\\u5305\\u542b\\u4e0d\\u652f\\u6301\\u7684\\u683c\\u5f0f\"),r.value=\"\"}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg(\"\\u540c\\u65f6\\u6700\\u591a\\u53ea\\u80fd\\u4e0a\\u4f20\\u7684\\u6570\\u91cf\\u4e3a\\uff1a\"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+\"MB\":l.size+\"KB\",r.value=\"\",F=i}}),F)return a.msg(\"\\u6587\\u4ef6\\u4e0d\\u80fd\\u8d85\\u8fc7\"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+\"-\"+t]=i})},l=function(t,n){var o=e.elemFile,a=(i.item?i.item:i.elem,t.length>1?t.length+\"\\u4e2a\\u6587\\u4ef6\":(t[0]||{}).name||o[0].value.match(/[^\\/\\\\]+\\..+/g)||[]||\"\");o.next().hasClass(s)&&o.next().remove(),e.upload(null,\"choose\"),e.isFile()||i.choose||o.after('<span class=\"layui-inline '+s+'\">'+a+\"</span>\")};i.elem.off(\"upload.start\").on(\"upload.start\",function(){var o=t(this),a=o.attr(\"lay-data\");if(a)try{a=new Function(\"return \"+a)(),e.config=t.extend({},i,a)}catch(l){n.error(\"Upload element property lay-data configuration item has a syntax error: \"+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off(\"upload.over\").on(\"upload.over\",function(){var e=t(this);e.attr(\"lay-over\",\"\")}).off(\"upload.leave\").on(\"upload.leave\",function(){var e=t(this);e.removeAttr(\"lay-over\")}).off(\"upload.drop\").on(\"upload.drop\",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr(\"lay-over\"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off(\"upload.change\").on(\"upload.change\",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off(\"upload.action\").on(\"upload.action\",function(){e.upload()}),i.elem.data(\"haveEvents\")||(e.elemFile.on(\"change\",function(){t(this).trigger(\"upload.change\")}),i.elem.on(\"click\",function(){e.isFile()||t(this).trigger(\"upload.start\")}),i.drag&&i.elem.on(\"dragover\",function(e){e.preventDefault(),t(this).trigger(\"upload.over\")}).on(\"dragleave\",function(e){t(this).trigger(\"upload.leave\")}).on(\"drop\",function(e){e.preventDefault(),t(this).trigger(\"upload.drop\",e)}),i.bindAction.on(\"click\",function(){t(this).trigger(\"upload.action\")}),i.elem.data(\"haveEvents\",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)});layui.define([\"jquery\",\"laytpl\",\"lay\"],function(e){\"use strict\";var i=layui.$,n=layui.laytpl,t=layui.hint(),a=layui.device(),l=a.mobile?\"click\":\"mousedown\",r=\"dropdown\",o=\"layui_\"+r+\"_index\",u={config:{},index:layui[r]?layui[r].index+1e4:0,set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,r,e,i)}},d=function(){var e=this,i=e.config,n=i.id;return d.that[n]=e,{config:i,reload:function(i){e.reload.call(e,i)}}},s=\"layui-dropdown\",m=\"layui-menu-item-up\",c=\"layui-menu-item-down\",p=\"layui-menu-body-title\",y=\"layui-menu-item-group\",f=\"layui-menu-item-parent\",v=\"layui-menu-item-divider\",g=\"layui-menu-item-checked\",h=\"layui-menu-item-checked2\",w=\"layui-menu-body-panel\",C=\"layui-menu-body-panel-left\",V=\".\"+y+\">.\"+p,k=function(e){var n=this;n.index=++u.index,n.config=i.extend({},n.config,u.config,e),n.init()};k.prototype.config={trigger:\"click\",content:\"\",className:\"\",style:\"\",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:300},k.prototype.reload=function(e){var n=this;n.config=i.extend({},n.config,e),n.init(!0)},k.prototype.init=function(e){var n=this,t=n.config,a=t.elem=i(t.elem);if(a.length>1)return layui.each(a,function(){u.render(i.extend({},t,{elem:this}))}),n;if(!e&&a[0]&&a.data(o)){var l=d.getThis(a.data(o));if(!l)return;return l.reload(t)}t.id=\"id\"in t?t.id:n.index,t.show&&n.render(e),n.events()},k.prototype.render=function(e){var t=this,a=t.config,r=i(\"body\"),s=function(){var e=i('<ul class=\"layui-menu layui-dropdown-menu\"></ul>');return a.data.length>0?m(e,a.data):e.html('<li class=\"layui-menu-item-none\">no menu</li>'),e},m=function(e,t){return layui.each(t,function(t,l){var r=l.child&&l.child.length>0,o=\"isSpreadItem\"in l?l.isSpreadItem:a.isSpreadItem,u=l.templet?n(l.templet).render(l):a.templet?n(a.templet).render(l):l.title,d=function(){return r&&(l.type=l.type||\"parent\"),l.type?{group:\"group\",parent:\"parent\",\"-\":\"-\"}[l.type]||\"parent\":\"\"}();if(\"-\"===d||l.title||l.id||r){var s=i([\"<li\"+function(){var e={group:\"layui-menu-item-group\"+(a.isAllowSpread?o?\" layui-menu-item-down\":\" layui-menu-item-up\":\"\"),parent:f,\"-\":\"layui-menu-item-divider\"};return r||d?' class=\"'+e[d]+'\"':\"\"}()+\">\",function(){var e=\"href\"in l?'<a href=\"'+l.href+'\" target=\"'+(l.target||\"_self\")+'\">'+u+\"</a>\":u;return r?'<div class=\"'+p+'\">'+e+function(){return\"parent\"===d?'<i class=\"layui-icon layui-icon-right\"></i>':\"group\"===d&&a.isAllowSpread?'<i class=\"layui-icon layui-icon-'+(o?\"up\":\"down\")+'\"></i>':\"\"}()+\"</div>\":'<div class=\"'+p+'\">'+e+\"</div>\"}(),\"</li>\"].join(\"\"));if(s.data(\"item\",l),r){var c=i('<div class=\"layui-panel layui-menu-body-panel\"></div>'),y=i(\"<ul></ul>\");\"parent\"===d?(c.append(m(y,l.child)),s.append(c)):s.append(m(y,l.child))}e.append(s)}}),e},c=['<div class=\"layui-dropdown layui-border-box layui-panel layui-anim layui-anim-downbit\">',\"</div>\"].join(\"\");(\"contextmenu\"===a.trigger||lay.isTopElem(a.elem[0]))&&(e=!0),!e&&a.elem.data(o+\"_opened\")||(t.elemView=i(c),t.elemView.append(a.content||s()),a.className&&t.elemView.addClass(a.className),a.style&&t.elemView.attr(\"style\",a.style),u.thisId=a.id,t.remove(),r.append(t.elemView),a.elem.data(o+\"_opened\",!0),t.position(),d.prevElem=t.elemView,d.prevElem.data(\"prevElem\",a.elem),t.elemView.find(\".layui-menu\").on(l,function(e){layui.stope(e)}),t.elemView.find(\".layui-menu li\").on(\"click\",function(e){var n=i(this),l=n.data(\"item\")||{},r=l.child&&l.child.length>0;r||\"-\"===l.type||(t.remove(),\"function\"==typeof a.click&&a.click(l,n))}),t.elemView.find(V).on(\"click\",function(e){var n=i(this),t=n.parent(),l=t.data(\"item\")||{};\"group\"===l.type&&a.isAllowSpread&&d.spread(t)}),\"mouseenter\"===a.trigger&&t.elemView.on(\"mouseenter\",function(){clearTimeout(d.timer)}).on(\"mouseleave\",function(){t.delayRemove()}))},k.prototype.position=function(e){var i=this,n=i.config;lay.position(n.elem[0],i.elemView[0],{position:n.position,e:i.e,clickType:\"contextmenu\"===n.trigger?\"right\":null,align:n.align||null})},k.prototype.remove=function(){var e=this,i=(e.config,d.prevElem);i&&(i.data(\"prevElem\")&&i.data(\"prevElem\").data(o+\"_opened\",!1),i.remove())},k.prototype.delayRemove=function(){var e=this,i=e.config;clearTimeout(d.timer),d.timer=setTimeout(function(){e.remove()},i.delay)},k.prototype.events=function(){var e=this,i=e.config;\"hover\"===i.trigger&&(i.trigger=\"mouseenter\"),e.prevElem&&e.prevElem.off(i.trigger,e.prevElemCallback),e.prevElem=i.elem,e.prevElemCallback=function(n){clearTimeout(d.timer),e.e=n,e.render(),n.preventDefault(),\"function\"==typeof i.ready&&i.ready(e.elemView,i.elem,e.e.target)},i.elem.on(i.trigger,e.prevElemCallback),\"mouseenter\"===i.trigger&&i.elem.on(\"mouseleave\",function(){e.delayRemove()})},d.that={},d.getThis=function(e){var i=d.that[e];return i||t.error(e?r+\" instance with ID '\"+e+\"' not found\":\"ID argument required\"),i},d.spread=function(e){var i=e.children(\".\"+p).find(\".layui-icon\");e.hasClass(m)?(e.removeClass(m).addClass(c),i.removeClass(\"layui-icon-down\").addClass(\"layui-icon-up\")):(e.removeClass(c).addClass(m),i.removeClass(\"layui-icon-up\").addClass(\"layui-icon-down\"))},!function(){var e=i(window),n=i(document);e.on(\"resize\",function(){if(u.thisId){var e=d.getThis(u.thisId);if(e){if(!e.elemView[0]||!i(\".\"+s)[0])return!1;var n=e.config;\"contextmenu\"===n.trigger?e.remove():e.position()}}}),n.on(l,function(e){if(u.thisId){var i=d.getThis(u.thisId);if(i){var n=i.config;!lay.isTopElem(n.elem[0])&&\"contextmenu\"!==n.trigger&&(e.target===n.elem[0]||n.elem.find(e.target)[0]||e.target===i.elemView[0]||i.elemView&&i.elemView.find(e.target)[0])||i.remove()}}});var t=\".layui-menu:not(.layui-dropdown-menu) li\";n.on(\"click\",t,function(e){var n=i(this),t=n.parents(\".layui-menu\").eq(0),a=n.hasClass(y)||n.hasClass(f),l=t.attr(\"lay-filter\")||t.attr(\"id\"),o=lay.options(this);n.hasClass(v)||a||(t.find(\".\"+g).removeClass(g),t.find(\".\"+h).removeClass(h),n.addClass(g),n.parents(\".\"+f).addClass(h),layui.event.call(this,r,\"click(\"+l+\")\",o))}),n.on(\"click\",t+V,function(e){var n=i(this),t=n.parents(\".\"+y+\":eq(0)\"),a=lay.options(t[0]);\"isAllowSpread\"in a&&!a.isAllowSpread||d.spread(t)});var a=\".layui-menu .\"+f;n.on(\"mouseenter\",a,function(n){var t=i(this),a=t.find(\".\"+w);if(a[0]){var l=a[0].getBoundingClientRect();l.right>e.width()&&(a.addClass(C),l=a[0].getBoundingClientRect(),l.left<0&&a.removeClass(C)),l.bottom>e.height()&&a.eq(0).css(\"margin-top\",-(l.bottom-e.height()))}}).on(\"mouseleave\",a,function(e){var n=i(this),t=n.children(\".\"+w);t.removeClass(C),t.css(\"margin-top\",0)})}(),u.reload=function(e,i){var n=d.getThis(e);return n?(n.reload(i),d.call(n)):this},u.render=function(e){var i=new k(e);return d.call(i)},e(r,u)});layui.define(\"jquery\",function(e){\"use strict\";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(t,a){return i.value=t,e.slide(\"set\",t,a||0)},config:i}},n=\"slider\",l=\"layui-disabled\",s=\"layui-slider\",r=\"layui-slider-bar\",o=\"layui-slider-wrap\",u=\"layui-slider-wrap-btn\",d=\"layui-slider-tips\",v=\"layui-slider-input\",c=\"layui-slider-input-txt\",p=\"layui-slider-input-btn\",m=\"layui-slider-hover\",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:\"default\",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:\"#009688\"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.max<t.min&&(t.max=t.min+t.step),t.range){t.value=\"object\"==typeof t.value?t.value:[t.min,t.value];var a=Math.min(t.value[0],t.value[1]),n=Math.max(t.value[0],t.value[1]);t.value[0]=a>t.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),p=v-r+\"%\";r+=\"%\",v+=\"%\"}else{\"object\"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.value<t.min&&(t.value=t.min),t.value>t.max&&(t.value=t.max);var p=Math.floor((t.value-t.min)/(t.max-t.min)*100)+\"%\"}var m=t.disabled?\"#c2c2c2\":t.theme,f='<div class=\"layui-slider '+(\"vertical\"===t.type?\"layui-slider-vertical\":\"\")+'\">'+(t.tips?'<div class=\"layui-slider-tips\"></div>':\"\")+'<div class=\"layui-slider-bar\" style=\"background:'+m+\"; \"+(\"vertical\"===t.type?\"height\":\"width\")+\":\"+p+\";\"+(\"vertical\"===t.type?\"bottom\":\"left\")+\":\"+(r||0)+';\"></div><div class=\"layui-slider-wrap\" style=\"'+(\"vertical\"===t.type?\"bottom\":\"left\")+\":\"+(r||p)+';\"><div class=\"layui-slider-wrap-btn\" style=\"border: 2px solid '+m+';\"></div></div>'+(t.range?'<div class=\"layui-slider-wrap\" style=\"'+(\"vertical\"===t.type?\"bottom\":\"left\")+\":\"+v+';\"><div class=\"layui-slider-wrap-btn\" style=\"border: 2px solid '+m+';\"></div></div>':\"\")+\"</div>\",h=i(t.elem),y=h.next(\".\"+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find(\".\"+o).eq(0).data(\"value\",t.value[0]),e.elemTemp.find(\".\"+o).eq(1).data(\"value\",t.value[1])):e.elemTemp.find(\".\"+o).data(\"value\",t.value),h.html(e.elemTemp),\"vertical\"===t.type&&e.elemTemp.height(t.height+\"px\"),t.showstep){for(var g=(t.max-t.min)/t.step,b=\"\",x=1;x<g+1;x++){var T=100*x/g;T<100&&(b+='<div class=\"layui-slider-step\" style=\"'+(\"vertical\"===t.type?\"bottom\":\"left\")+\":\"+T+'%\"></div>')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('<div class=\"layui-slider-input layui-input\"><div class=\"layui-slider-input-txt\"><input type=\"text\" class=\"layui-input\"></div><div class=\"layui-slider-input-btn\"><i class=\"layui-icon layui-icon-up\"></i><i class=\"layui-icon layui-icon-down\"></i></div></div>');h.css(\"position\",\"relative\"),h.append(w),h.find(\".\"+c).children(\"input\").val(t.value),\"vertical\"===t.type?w.css({left:0,top:-48}):e.elemTemp.css(\"margin-right\",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find(\".\"+u).addClass(l)):e.slide(),e.elemTemp.find(\".\"+u).on(\"mouseover\",function(){var a=\"vertical\"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find(\".\"+o),l=\"vertical\"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data(\"value\"),u=t.setTips?t.setTips(r):r;e.elemTemp.find(\".\"+d).html(u),\"vertical\"===t.type?e.elemTemp.find(\".\"+d).css({bottom:s+\"%\",\"margin-bottom\":\"20px\",display:\"inline-block\"}):e.elemTemp.find(\".\"+d).css({left:s+\"%\",display:\"inline-block\"})}).on(\"mouseout\",function(){e.elemTemp.find(\".\"+d).css(\"display\",\"none\")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return\"vertical\"===l.type?l.height:s[0].offsetWidth},h=s.find(\".\"+o),y=s.next(\".\"+v),g=y.children(\".\"+c).children(\"input\").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css(\"vertical\"===l.type?\"bottom\":\"left\",e+\"%\");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;\"vertical\"===l.type?(s.find(\".\"+d).css({bottom:e+\"%\",\"margin-bottom\":\"20px\"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find(\".\"+d).css(\"left\",e+\"%\"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);\"vertical\"===l.type?s.find(\".\"+r).css({height:o+\"%\",bottom:n+\"%\"}):s.find(\".\"+r).css({width:o+\"%\",left:n+\"%\"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children(\".\"+c).children(\"input\").val(g),h.eq(i).data(\"value\",u),s.find(\".\"+d).html(l.setTips?l.setTips(u):u),l.range){var v=[h.eq(0).data(\"value\"),h.eq(1).data(\"value\")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['<div class=\"layui-auxiliar-moving\" id=\"LAY-slider-moving\"></div'].join(\"\")),M=function(e,t){var a=function(){t&&t(),w.remove()};i(\"#LAY-slider-moving\")[0]||i(\"body\").append(w),w.on(\"mousemove\",e),w.on(\"mouseup\",a).on(\"mouseleave\",a)};if(\"set\"===e)return x(t,a);s.find(\".\"+u).each(function(e){var t=i(this);t.on(\"mousedown\",function(i){i=i||window.event;var a=t.parent()[0].offsetLeft,n=i.clientX;\"vertical\"===l.type&&(a=f()-t.parent()[0].offsetTop-h.height(),n=i.clientY);var r=function(i){i=i||window.event;var r=a+(\"vertical\"===l.type?n-i.clientY:i.clientX-n);r<0&&(r=0),r>f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(m),s.find(\".\"+d).show(),i.preventDefault()},o=function(){t.removeClass(m),s.find(\".\"+d).hide()};M(r,o)})}),s.on(\"click\",function(e){var t=i(\".\"+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n=\"vertical\"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?\"vertical\"===l.type?Math.abs(n-parseInt(i(h[0]).css(\"bottom\")))>Math.abs(n-parseInt(i(h[1]).css(\"bottom\")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.children(\".\"+p).children(\"i\").each(function(e){i(this).on(\"click\",function(){g=y.children(\".\"+c).children(\"input\").val(),g=1==e?g-l.step<l.min?l.min:Number(g)-l.step:Number(g)+l.step>l.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=e<l.min?l.min:e,e=e>l.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children(\".\"+c).children(\"input\").on(\"keydown\",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on(\"change\",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});layui.define([\"jquery\",\"lay\"],function(e){\"use strict\";var i=layui.jquery,r=layui.lay,o=layui.device(),n=o.mobile?\"click\":\"mousedown\",l={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var r=this;return r.config=i.extend({},r.config,e),r},on:function(e,i){return layui.onevent.call(this,\"colorpicker\",e,i)}},t=function(){var e=this,i=e.config;return{config:i}},c=\"colorpicker\",a=\"layui-show\",s=\"layui-colorpicker\",f=\".layui-colorpicker-main\",d=\"layui-icon-down\",u=\"layui-icon-close\",p=\"layui-colorpicker-trigger-span\",g=\"layui-colorpicker-trigger-i\",v=\"layui-colorpicker-side\",h=\"layui-colorpicker-side-slider\",b=\"layui-colorpicker-basis\",k=\"layui-colorpicker-alpha-bgcolor\",y=\"layui-colorpicker-alpha-slider\",m=\"layui-colorpicker-basis-cursor\",x=\"layui-colorpicker-main-input\",P=function(e){var i={h:0,s:0,b:0},r=Math.min(e.r,e.g,e.b),o=Math.max(e.r,e.g,e.b),n=o-r;return i.b=o,i.s=0!=o?255*n/o:0,0!=i.s?e.r==o?i.h=(e.g-e.b)/n:e.g==o?i.h=2+(e.b-e.r)/n:i.h=4+(e.r-e.g)/n:i.h=-1,o==r&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},C=function(e){var e=e.indexOf(\"#\")>-1?e.substring(1):e;if(3==e.length){var i=e.split(\"\");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var r={r:e>>16,g:(65280&e)>>8,b:255&e};return P(r)},B=function(e){var i={},r=e.h,o=255*e.s/100,n=255*e.b/100;if(0==o)i.r=i.g=i.b=n;else{var l=n,t=(255-o)*n/255,c=(l-t)*(r%60)/60;360==r&&(r=0),r<60?(i.r=l,i.b=t,i.g=t+c):r<120?(i.g=l,i.b=t,i.r=l-c):r<180?(i.g=l,i.r=t,i.b=t+c):r<240?(i.b=l,i.r=t,i.g=l-c):r<300?(i.b=l,i.g=t,i.r=t+c):r<360?(i.r=l,i.g=t,i.b=l-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},w=function(e){var r=B(e),o=[r.r.toString(16),r.g.toString(16),r.b.toString(16)];return i.each(o,function(e,i){1==i.length&&(o[e]=\"0\"+i)}),o.join(\"\")},D=function(e){var i=/[0-9]{1,3}/g,r=e.match(i)||[];return{r:r[0],g:r[1],b:r[2]}},j=i(window),E=i(document),F=function(e){var r=this;r.index=++l.index,r.config=i.extend({},r.config,l.config,e),r.render()};F.prototype.config={color:\"\",size:null,alpha:!1,format:\"hex\",predefine:!1,colors:[\"#009688\",\"#5FB878\",\"#1E9FFF\",\"#FF5722\",\"#FFB800\",\"#01AAED\",\"#999\",\"#c00\",\"#ff8c00\",\"#ffd700\",\"#90ee90\",\"#00ced1\",\"#1e90ff\",\"#c71585\",\"rgb(0, 186, 189)\",\"rgb(255, 120, 0)\",\"rgb(250, 212, 0)\",\"#393D49\",\"rgba(0,0,0,.5)\",\"rgba(255, 69, 0, 0.68)\",\"rgba(144, 240, 144, 0.5)\",\"rgba(31, 147, 255, 0.73)\"]},F.prototype.render=function(){var e=this,r=e.config,o=i(['<div class=\"layui-unselect layui-colorpicker\">',\"<span \"+(\"rgb\"==r.format&&r.alpha?'class=\"layui-colorpicker-trigger-bgcolor\"':\"\")+\">\",'<span class=\"layui-colorpicker-trigger-span\" ','lay-type=\"'+(\"rgb\"==r.format?r.alpha?\"rgba\":\"torgb\":\"\")+'\" ','style=\"'+function(){var e=\"\";return r.color?(e=r.color,(r.color.match(/[0-9]{1,3}/g)||[]).length>3&&(r.alpha&&\"rgb\"==r.format||(e=\"#\"+w(P(D(r.color))))),\"background: \"+e):e}()+'\">','<i class=\"layui-icon layui-colorpicker-trigger-i '+(r.color?d:u)+'\"></i>',\"</span>\",\"</span>\",\"</div>\"].join(\"\")),n=i(r.elem);r.size&&o.addClass(\"layui-colorpicker-\"+r.size),n.addClass(\"layui-inline\").html(e.elemColorBox=o),e.color=e.elemColorBox.find(\".\"+p)[0].style.background,e.events()},F.prototype.renderPicker=function(){var e=this,r=e.config,o=e.elemColorBox[0],n=e.elemPicker=i(['<div id=\"layui-colorpicker'+e.index+'\" data-index=\"'+e.index+'\" class=\"layui-anim layui-anim-downbit layui-colorpicker-main\">','<div class=\"layui-colorpicker-main-wrapper\">','<div class=\"layui-colorpicker-basis\">','<div class=\"layui-colorpicker-basis-white\"></div>','<div class=\"layui-colorpicker-basis-black\"></div>','<div class=\"layui-colorpicker-basis-cursor\"></div>',\"</div>\",'<div class=\"layui-colorpicker-side\">','<div class=\"layui-colorpicker-side-slider\"></div>',\"</div>\",\"</div>\",'<div class=\"layui-colorpicker-main-alpha '+(r.alpha?a:\"\")+'\">','<div class=\"layui-colorpicker-alpha-bgcolor\">','<div class=\"layui-colorpicker-alpha-slider\"></div>',\"</div>\",\"</div>\",function(){if(r.predefine){var e=['<div class=\"layui-colorpicker-main-pre\">'];return layui.each(r.colors,function(i,r){e.push(['<div class=\"layui-colorpicker-pre'+((r.match(/[0-9]{1,3}/g)||[]).length>3?\" layui-colorpicker-pre-isalpha\":\"\")+'\">','<div style=\"background:'+r+'\"></div>',\"</div>\"].join(\"\"))}),e.push(\"</div>\"),e.join(\"\")}return\"\"}(),'<div class=\"layui-colorpicker-main-input\">','<div class=\"layui-inline\">','<input type=\"text\" class=\"layui-input\">',\"</div>\",'<div class=\"layui-btn-container\">','<button class=\"layui-btn layui-btn-primary layui-btn-sm\" colorpicker-events=\"clear\">\\u6e05\\u7a7a</button>','<button class=\"layui-btn layui-btn-sm\" colorpicker-events=\"confirm\">\\u786e\\u5b9a</button>',\"</div\",\"</div>\",\"</div>\"].join(\"\"));e.elemColorBox.find(\".\"+p)[0];i(f)[0]&&i(f).data(\"index\")==e.index?e.removePicker(F.thisElemInd):(e.removePicker(F.thisElemInd),i(\"body\").append(n)),F.thisElemInd=e.index,F.thisColor=o.style.background,e.position(),e.pickerEvents()},F.prototype.removePicker=function(e){var r=this;r.config;return i(\"#layui-colorpicker\"+(e||r.index)).remove(),r},F.prototype.position=function(){var e=this,i=e.config;return r.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:\"center\"}),e},F.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find(\".\"+p)),r=e.elemPicker.find(\".\"+x),o=i[0],n=o.style.backgroundColor;if(n){var l=P(D(n)),t=i.attr(\"lay-type\");if(e.select(l.h,l.s,l.b),\"torgb\"===t&&r.find(\"input\").val(n),\"rgba\"===t){var c=D(n);if(3==(n.match(/[0-9]{1,3}/g)||[]).length)r.find(\"input\").val(\"rgba(\"+c.r+\", \"+c.g+\", \"+c.b+\", 1)\"),e.elemPicker.find(\".\"+y).css(\"left\",280);else{r.find(\"input\").val(n);var a=280*n.slice(n.lastIndexOf(\",\")+1,n.length-1);e.elemPicker.find(\".\"+y).css(\"left\",a)}e.elemPicker.find(\".\"+k)[0].style.background=\"linear-gradient(to right, rgba(\"+c.r+\", \"+c.g+\", \"+c.b+\", 0), rgb(\"+c.r+\", \"+c.g+\", \"+c.b+\"))\"}}else e.select(0,100,100),r.find(\"input\").val(\"\"),e.elemPicker.find(\".\"+k)[0].style.background=\"\",e.elemPicker.find(\".\"+y).css(\"left\",280)},F.prototype.side=function(){var e=this,r=e.config,o=e.elemColorBox.find(\".\"+p),n=o.attr(\"lay-type\"),l=e.elemPicker.find(\".\"+v),t=e.elemPicker.find(\".\"+h),c=e.elemPicker.find(\".\"+b),a=e.elemPicker.find(\".\"+m),s=e.elemPicker.find(\".\"+k),f=e.elemPicker.find(\".\"+y),C=t[0].offsetTop/180*360,w=100-(a[0].offsetTop+3)/180*100,E=(a[0].offsetLeft+3)/260*100,F=Math.round(f[0].offsetLeft/280*100)/100,H=e.elemColorBox.find(\".\"+g),M=e.elemPicker.find(\".layui-colorpicker-pre\").children(\"div\"),Y=function(i,l,t,c){e.select(i,l,t);var a=B({h:i,s:l,b:t});if(H.addClass(d).removeClass(u),o[0].style.background=\"rgb(\"+a.r+\", \"+a.g+\", \"+a.b+\")\",\"torgb\"===n&&e.elemPicker.find(\".\"+x).find(\"input\").val(\"rgb(\"+a.r+\", \"+a.g+\", \"+a.b+\")\"),\"rgba\"===n){var p=0;p=280*c,f.css(\"left\",p),e.elemPicker.find(\".\"+x).find(\"input\").val(\"rgba(\"+a.r+\", \"+a.g+\", \"+a.b+\", \"+c+\")\"),o[0].style.background=\"rgba(\"+a.r+\", \"+a.g+\", \"+a.b+\", \"+c+\")\",s[0].style.background=\"linear-gradient(to right, rgba(\"+a.r+\", \"+a.g+\", \"+a.b+\", 0), rgb(\"+a.r+\", \"+a.g+\", \"+a.b+\"))\"}r.change&&r.change(e.elemPicker.find(\".\"+x).find(\"input\").val())},I=i(['<div class=\"layui-auxiliar-moving\" id=\"LAY-colorpicker-moving\"></div>'].join(\"\")),L=function(e){i(\"#LAY-colorpicker-moving\")[0]||i(\"body\").append(I),I.on(\"mousemove\",e),I.on(\"mouseup\",function(){I.remove()}).on(\"mouseleave\",function(){I.remove()})};t.on(\"mousedown\",function(e){var i=this.offsetTop,r=e.clientY,o=function(e){var o=i+(e.clientY-r),n=l[0].offsetHeight;o<0&&(o=0),o>n&&(o=n);var t=o/180*360;C=t,Y(t,E,w,F),e.preventDefault()};L(o),e.preventDefault()}),l.on(\"click\",function(e){var r=e.clientY-i(this).offset().top;r<0&&(r=0),r>this.offsetHeight&&(r=this.offsetHeight);var o=r/180*360;C=o,Y(o,E,w,F),e.preventDefault()}),a.on(\"mousedown\",function(e){var i=this.offsetTop,r=this.offsetLeft,o=e.clientY,n=e.clientX,l=function(e){var l=i+(e.clientY-o),t=r+(e.clientX-n),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;l<-3&&(l=-3),l>a&&(l=a),t<-3&&(t=-3),t>s&&(t=s);var f=(t+3)/260*100,d=100-(l+3)/180*100;w=d,E=f,Y(C,f,d,F),e.preventDefault()};layui.stope(e),L(l),e.preventDefault()}),c.on(\"mousedown\",function(e){var r=e.clientY-i(this).offset().top-3+j.scrollTop(),o=e.clientX-i(this).offset().left-3+j.scrollLeft();r<-3&&(r=-3),r>this.offsetHeight-3&&(r=this.offsetHeight-3),o<-3&&(o=-3),o>this.offsetWidth-3&&(o=this.offsetWidth-3);var n=(o+3)/260*100,l=100-(r+3)/180*100;w=l,E=n,Y(C,n,l,F),layui.stope(e),e.preventDefault(),a.trigger(e,\"mousedown\")}),f.on(\"mousedown\",function(e){var i=this.offsetLeft,r=e.clientX,o=function(e){var o=i+(e.clientX-r),n=s[0].offsetWidth;o<0&&(o=0),o>n&&(o=n);var l=Math.round(o/280*100)/100;F=l,Y(C,E,w,l),e.preventDefault()};L(o),e.preventDefault()}),s.on(\"click\",function(e){var r=e.clientX-i(this).offset().left;r<0&&(r=0),r>this.offsetWidth&&(r=this.offsetWidth);var o=Math.round(r/280*100)/100;F=o,Y(C,E,w,o),e.preventDefault()}),M.each(function(){i(this).on(\"click\",function(){i(this).parent(\".layui-colorpicker-pre\").addClass(\"selected\").siblings().removeClass(\"selected\");var e,r=this.style.backgroundColor,o=P(D(r)),n=r.slice(r.lastIndexOf(\",\")+1,r.length-1);C=o.h,E=o.s,w=o.b,3==(r.match(/[0-9]{1,3}/g)||[]).length&&(n=1),F=n,e=280*n,Y(o.h,o.s,o.b,n)})})},F.prototype.select=function(e,i,r,o){var n=this,l=(n.config,w({h:e,s:100,b:100})),t=w({h:e,s:i,b:r}),c=e/360*180,a=180-r/100*180-3,s=i/100*260-3;n.elemPicker.find(\".\"+h).css(\"top\",c),n.elemPicker.find(\".\"+b)[0].style.background=\"#\"+l,n.elemPicker.find(\".\"+m).css({top:a,left:s}),\"change\"!==o&&n.elemPicker.find(\".\"+x).find(\"input\").val(\"#\"+t)},F.prototype.pickerEvents=function(){var e=this,r=e.config,o=e.elemColorBox.find(\".\"+p),n=e.elemPicker.find(\".\"+x+\" input\"),l={clear:function(i){o[0].style.background=\"\",e.elemColorBox.find(\".\"+g).removeClass(d).addClass(u),e.color=\"\",r.done&&r.done(\"\"),e.removePicker()},confirm:function(i,l){var t=n.val(),c=t,a={};if(t.indexOf(\",\")>-1){if(a=P(D(t)),e.select(a.h,a.s,a.b),o[0].style.background=c=\"#\"+w(a),(t.match(/[0-9]{1,3}/g)||[]).length>3&&\"rgba\"===o.attr(\"lay-type\")){var s=280*t.slice(t.lastIndexOf(\",\")+1,t.length-1);e.elemPicker.find(\".\"+y).css(\"left\",s),o[0].style.background=t,c=t}}else a=C(t),o[0].style.background=c=\"#\"+w(a),e.elemColorBox.find(\".\"+g).removeClass(u).addClass(d);return\"change\"===l?(e.select(a.h,a.s,a.b,l),void(r.change&&r.change(c))):(e.color=t,r.done&&r.done(t),void e.removePicker())}};e.elemPicker.on(\"click\",\"*[colorpicker-events]\",function(){var e=i(this),r=e.attr(\"colorpicker-events\");l[r]&&l[r].call(this,e)}),n.on(\"keyup\",function(e){var r=i(this);l.confirm.call(this,r,13===e.keyCode?null:\"change\")})},F.prototype.events=function(){var e=this,r=e.config,o=e.elemColorBox.find(\".\"+p);e.elemColorBox.on(\"click\",function(){e.renderPicker(),i(f)[0]&&(e.val(),e.side())}),r.elem[0]&&!e.elemColorBox[0].eventHandler&&(E.on(n,function(r){if(!i(r.target).hasClass(s)&&!i(r.target).parents(\".\"+s)[0]&&!i(r.target).hasClass(f.replace(/\\./g,\"\"))&&!i(r.target).parents(f)[0]&&e.elemPicker){if(e.color){var n=P(D(e.color));e.select(n.h,n.s,n.b)}else e.elemColorBox.find(\".\"+g).removeClass(d).addClass(u);o[0].style.background=e.color||\"\",e.removePicker()}}),j.on(\"resize\",function(){return!(!e.elemPicker||!i(f)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},l.render=function(e){var i=new F(e);return t.call(i)},e(c,l)});layui.define(\"layer\",function(e){\"use strict\";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l=\"form\",r=\".layui-form\",o=\"layui-this\",s=\"layui-hide\",c=\"layui-disabled\",u=function(){this.config={verify:{required:[/[\\S]+/,\"\\u5fc5\\u586b\\u9879\\u4e0d\\u80fd\\u4e3a\\u7a7a\"],phone:[/^1\\d{10}$/,\"\\u8bf7\\u8f93\\u5165\\u6b63\\u786e\\u7684\\u624b\\u673a\\u53f7\"],email:[/^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$/,\"\\u90ae\\u7bb1\\u683c\\u5f0f\\u4e0d\\u6b63\\u786e\"],url:[/^(#|(http(s?)):\\/\\/|\\/\\/)[^\\s]+\\.[^\\s]+$/,\"\\u94fe\\u63a5\\u683c\\u5f0f\\u4e0d\\u6b63\\u786e\"],number:function(e){if(!e||isNaN(e))return\"\\u53ea\\u80fd\\u586b\\u5199\\u6570\\u5b57\"},date:[/^(\\d{4})[-\\/](\\d{1}|0\\d{1}|1[0-2])([-\\/](\\d{1}|0\\d{1}|[1-2][0-9]|3[0-1]))*$/,\"\\u65e5\\u671f\\u683c\\u5f0f\\u4e0d\\u6b63\\u786e\"],identity:[/(^\\d{15}$)|(^\\d{17}(x|X|\\d)$)/,\"\\u8bf7\\u8f93\\u5165\\u6b63\\u786e\\u7684\\u8eab\\u4efd\\u8bc1\\u53f7\"]},autocomplete:null}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter=\"'+e+'\"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name=\"'+e+'\"]');a[0]&&(i=a[0].type,\"checkbox\"===i?a[0].checked=t:\"radio\"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter=\"'+e+'\"]').eq(0);var a={},n={},l=i.find(\"input,select,textarea\");return layui.each(l,function(e,i){var l;t(this);if(i.name=(i.name||\"\").replace(/^\\s*|\\s*&/,\"\"),i.name){if(/^.*\\[\\]$/.test(i.name)){var r=i.name.match(/^(.*)\\[\\]$/g)[0];a[r]=0|a[r],l=i.name.replace(/^(.*)\\[\\]$/,\"$1[\"+a[r]++ +\"]\")}/^checkbox|radio$/.test(i.type)&&!i.checked||(n[l||i.name]=i.value)}}),n},u.prototype.render=function(e,i){var n=this,u=n.config,d=t(r+function(){return i?'[lay-filter=\"'+i+'\"]':\"\"}()),f={input:function(){var e=d.find(\"input,textarea\");u.autocomplete&&e.attr(\"autocomplete\",u.autocomplete)},select:function(){var e,i=\"\\u8bf7\\u9009\\u62e9\",a=\"layui-form-select\",n=\"layui-select-title\",r=\"layui-select-none\",u=\"\",f=d.find(\"select\"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t(\".\"+a).removeClass(a+\"ed \"+a+\"up\"),e&&u&&e.val(u)),e=null},y=function(i,d,f){var y,p=t(this),m=i.find(\".\"+n),g=m.find(\"input\"),k=i.find(\"dl\"),x=k.children(\"dd\"),b=this.selectedIndex;if(!d){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=k.outerHeight();b=p[0].selectedIndex,i.addClass(a+\"ed\"),x.removeClass(s),y=null,x.eq(b).addClass(o).siblings().removeClass(o),e+t>h.height()&&e>=t&&i.addClass(a+\"up\"),T()},w=function(e){i.removeClass(a+\"ed \"+a+\"up\"),g.blur(),y=null,e||$(g.val(),function(e){var i=p[0].selectedIndex;e&&(u=t(p[0].options[i]).html(),0===i&&u===g.attr(\"placeholder\")&&(u=\"\"),g.val(u||\"\"))})},T=function(){var e=k.children(\"dd.\"+o);if(e[0]){var t=e.position().top,i=k.height(),a=e.height();t>i&&k.scrollTop(t+k.scrollTop()-i+a-5),t<0&&k.scrollTop(t+k.scrollTop()-5)}};m.on(\"click\",function(e){i.hasClass(a+\"ed\")?w():(v(e,!0),C()),k.find(\".\"+r).remove()}),m.find(\".layui-edge\").on(\"click\",function(){g.focus()}),g.on(\"keyup\",function(e){var t=e.keyCode;9===t&&C()}).on(\"keydown\",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=k.children(\"dd.\"+o);if(k.children(\"dd.\"+s)[0]&&\"next\"===t){var i=k.children(\"dd:not(.\"+s+\",.\"+c+\")\"),n=i.eq(0).index();if(n>=0&&n<e.index()&&!i.hasClass(o))return i.eq(0).prev()[0]?i.eq(0).prev():k.children(\":last\")}return a&&a[0]?a:y&&y[0]?y:e}();return l=r[t](),n=r[t](\"dd:not(.\"+s+\")\"),l[0]?(y=r[t](),n[0]&&!n.hasClass(c)||!y[0]?(n.addClass(o).siblings().removeClass(o),void T()):i(t,y)):y=null};38===t&&i(\"prev\"),40===t&&i(\"next\"),13===t&&(e.preventDefault(),k.children(\"dd.\"+o).trigger(\"click\"))});var $=function(e,i,a){var n=0;layui.each(x,function(){var i=t(this),l=i.text(),r=l.indexOf(e)===-1;(\"\"===e||\"blur\"===a?e!==l:r)&&n++,\"keyup\"===a&&i[r?\"addClass\":\"removeClass\"](s)});var l=n===x.length;return i(l),l},q=function(e){var t=this.value,i=e.keyCode;return 9!==i&&13!==i&&37!==i&&38!==i&&39!==i&&40!==i&&($(t,function(e){e?k.find(\".\"+r)[0]||k.append('<p class=\"'+r+'\">\\u65e0\\u5339\\u914d\\u9879</p>'):k.find(\".\"+r).remove()},\"keyup\"),\"\"===t&&k.find(\".\"+r).remove(),void T())};f&&g.on(\"keyup\",q).on(\"blur\",function(i){var a=p[0].selectedIndex;e=g,u=t(p[0].options[a]).html(),0===a&&u===g.attr(\"placeholder\")&&(u=\"\"),setTimeout(function(){$(g.val(),function(e){u||g.val(\"\")},\"blur\")},200)}),x.on(\"click\",function(){var e=t(this),a=e.attr(\"lay-value\"),n=p.attr(\"lay-filter\");return!e.hasClass(c)&&(e.hasClass(\"layui-select-tips\")?g.val(\"\"):(g.val(e.text()),e.addClass(o)),e.siblings().removeClass(o),p.val(a).removeClass(\"layui-form-danger\"),layui.event.call(this,l,\"select(\"+n+\")\",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find(\"dl>dt\").on(\"click\",function(e){return!1}),t(document).off(\"click\",v).on(\"click\",v)}};f.each(function(e,l){var r=t(this),s=r.next(\".\"+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if(\"string\"==typeof r.attr(\"lay-ignore\"))return r.show();var h=\"string\"==typeof r.attr(\"lay-search\"),p=v?v.value?i:v.innerHTML||i:i,m=t(['<div class=\"'+(h?\"\":\"layui-unselect \")+a,(u?\" layui-select-disabled\":\"\")+'\">','<div class=\"'+n+'\">','<input type=\"text\" placeholder=\"'+t.trim(p)+'\" '+('value=\"'+t.trim(d?f.html():\"\")+'\"')+(!u&&h?\"\":\" readonly\")+' class=\"layui-input'+(h?\"\":\" 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 a=[];return layui.each(e,function(e,n){0!==e||n.value?\"optgroup\"===n.tagName.toLowerCase()?a.push(\"<dt>\"+n.label+\"</dt>\"):a.push('<dd lay-value=\"'+n.value+'\" class=\"'+(d===n.value?o:\"\")+(n.disabled?\" \"+c:\"\")+'\">'+t.trim(n.innerHTML)+\"</dd>\"):a.push('<dd lay-value=\"\" class=\"layui-select-tips\">'+t.trim(n.innerHTML||i)+\"</dd>\")}),0===a.length&&a.push('<dd lay-value=\"\" class=\"'+c+'\">\\u6ca1\\u6709\\u9009\\u9879</dd>'),a.join(\"\")}(r.find(\"*\"))+\"</dl>\",\"</div>\"].join(\"\"));s[0]&&s.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:[\"layui-form-checkbox\",\"layui-form-checked\",\"checkbox\"],_switch:[\"layui-form-switch\",\"layui-form-onswitch\",\"switch\"]},i=d.find(\"input[type=checkbox]\"),a=function(e,i){var a=t(this);e.on(\"click\",function(){var t=a.attr(\"lay-filter\"),n=(a.attr(\"lay-text\")||\"\").split(\"|\");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find(\"em\").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find(\"em\").text(n[0])),layui.event.call(a[0],l,i[2]+\"(\"+t+\")\",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr(\"lay-skin\"),o=(l.attr(\"lay-text\")||\"\").split(\"|\"),s=this.disabled;\"switch\"===r&&(r=\"_\"+r);var u=e[r]||e.checkbox;if(\"string\"==typeof l.attr(\"lay-ignore\"))return l.show();var d=l.next(\".\"+u[0]),f=t(['<div class=\"layui-unselect '+u[0],n.checked?\" \"+u[1]:\"\",s?\" layui-checkbox-disabled \"+c:\"\",'\"',r?' lay-skin=\"'+r+'\"':\"\",\">\",function(){var e=n.title.replace(/\\s/g,\"\"),t={checkbox:[e?\"<span>\"+n.title+\"</span>\":\"\",'<i class=\"layui-icon layui-icon-ok\"></i>'].join(\"\"),_switch:\"<em>\"+((n.checked?o[0]:o[1])||\"\")+\"</em><i></i>\"};return t[r]||t.checkbox}(),\"</div>\"].join(\"\"));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e=\"layui-form-radio\",i=[\"&#xe643;\",\"&#xe63f;\"],a=d.find(\"input[type=radio]\"),n=function(a){var n=t(this),o=\"layui-anim-scaleSpring\";a.on(\"click\",function(){var s=n[0].name,c=n.parents(r),u=n.attr(\"lay-filter\"),d=c.find(\"input[name=\"+s.replace(/(\\.|#|\\[|\\])/g,\"\\\\$1\")+\"]\");n[0].disabled||(layui.each(d,function(){var a=t(this).next(\".\"+e);this.checked=!1,a.removeClass(e+\"ed\"),a.find(\".layui-icon\").removeClass(o).html(i[1])}),n[0].checked=!0,a.addClass(e+\"ed\"),a.find(\".layui-icon\").addClass(o).html(i[0]),layui.event.call(n[0],l,\"radio(\"+u+\")\",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),o=r.next(\".\"+e),s=this.disabled;if(\"string\"==typeof r.attr(\"lay-ignore\"))return r.show();o[0]&&o.remove();var u=t(['<div class=\"layui-unselect '+e,l.checked?\" \"+e+\"ed\":\"\",(s?\" layui-radio-disabled \"+c:\"\")+'\">','<i class=\"layui-anim layui-icon\">'+i[l.checked?0:1]+\"</i>\",\"<div>\"+function(){var e=l.title||\"\";return\"string\"==typeof r.next().attr(\"lay-radio\")&&(e=r.next().html()),e}()+\"</div>\",\"</div>\"].join(\"\"));r.after(u),n.call(this,u)})}};return e?f[e]?f[e]():a.error('\\u4e0d\\u652f\\u6301\\u7684 \"'+e+'\" \\u8868\\u5355\\u6e32\\u67d3'):layui.each(f,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,o=\"layui-form-danger\",s={},c=t(this),u=c.parents(r).eq(0),d=u.find(\"*[lay-verify]\"),h=c.parents(\"form\")[0],y=c.attr(\"lay-filter\");return layui.each(d,function(l,r){var s=t(this),c=s.attr(\"lay-verify\").split(\"|\"),u=s.attr(\"lay-verType\"),d=s.val();if(s.removeClass(o),layui.each(c,function(t,l){var c,f=\"\",h=\"function\"==typeof a[l];if(a[l]){var c=h?f=a[l](d,r):!a[l][0].test(d),y=\"select\"===r.tagName.toLowerCase()||/^checkbox|radio$/.test(r.type);if(f=f||a[l][1],\"required\"===l&&(f=s.attr(\"lay-reqText\")||f),c)return\"tips\"===u?i.tips(f,function(){return\"string\"!=typeof s.attr(\"lay-ignore\")&&y?s.next():s}(),{tips:1}):\"alert\"===u?i.alert(f,{title:\"\\u63d0\\u793a\",shadeClose:!0}):/\\bstring|number\\b/.test(typeof f)&&i.msg(f,{icon:5,shift:6}),n.mobile?v.scrollTop(function(){try{return(y?s.next():s).offset().top-15}catch(e){return 0}}()):setTimeout(function(){(y?s.next().find(\"input\"):r).focus()},7),s.addClass(o),e=!0}}),e)return e}),!e&&(s=f.getValue(null,u),layui.event.call(this,l,\"submit(\"+y+\")\",{elem:this,form:h,field:s}))},f=new u,v=t(document),h=t(window);t(function(){f.render()}),v.on(\"reset\",r,function(){var e=t(this).attr(\"lay-filter\");setTimeout(function(){f.render(null,e)},50)}),v.on(\"submit\",r,d).on(\"click\",\"*[lay-submit]\",d),e(l,f)});layui.define(\"form\",function(e){\"use strict\";var i=layui.$,a=layui.form,n=layui.layer,t=\"tree\",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c=\"layui-hide\",d=\"layui-disabled\",s=\"layui-tree-set\",o=\"layui-tree-iconClick\",h=\"layui-icon-addition\",u=\"layui-icon-subtraction\",p=\"layui-tree-entry\",f=\"layui-tree-main\",y=\"layui-tree-txt\",v=\"layui-tree-pack\",C=\"layui-tree-spread\",k=\"layui-tree-setLineShort\",m=\"layui-tree-showLine\",x=\"layui-tree-lineExtend\",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:\"\\u672a\\u547d\\u540d\",none:\"\\u65e0\\u6570\\u636e\"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){\"array\"===layui._typeof(i)&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('<div class=\"layui-tree'+(a.showCheckbox?\" layui-form\":\"\")+(a.showLine?\" layui-tree-line\":\"\")+'\" lay-filter=\"LAY-tree-'+e.index+'\"></div>');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('<div class=\"layui-tree-emptyText\">'+a.text.none+\"</div>\"),t.html(e.elem),0==e.elem.find(\".layui-tree-set\").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm(\"checkbox\"),e.elem.find(\".layui-tree-set\").each(function(){var e=i(this);e.parent(\".layui-tree-pack\")[0]||e.addClass(\"layui-tree-setHide\"),!e.next()[0]&&e.parents(\".layui-tree-pack\").eq(1).hasClass(\"layui-tree-lineExtend\")&&e.addClass(k),e.next()[0]||e.parents(\".layui-tree-set\").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,\"LAY-tree-\"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('<div class=\"layui-tree-pack\" '+(r.spread?'style=\"display: block;\"':\"\")+\"></div>\"),h=i(['<div data-id=\"'+r.id+'\" class=\"layui-tree-set'+(r.spread?\" layui-tree-spread\":\"\")+(r.checked?\" layui-tree-checkedFirst\":\"\")+'\">','<div class=\"layui-tree-entry\">','<div class=\"layui-tree-main\">',function(){return t.showLine?l?'<span class=\"layui-tree-iconClick layui-tree-icon\"><i class=\"layui-icon '+(r.spread?\"layui-icon-subtraction\":\"layui-icon-addition\")+'\"></i></span>':'<span class=\"layui-tree-iconClick\"><i class=\"layui-icon layui-icon-file\"></i></span>':'<span class=\"layui-tree-iconClick\"><i class=\"layui-tree-iconArrow '+(l?\"\":c)+'\"></i></span>'}(),function(){return t.showCheckbox?'<input type=\"checkbox\" name=\"'+(r.field||\"layuiTreeCheck_\"+r.id)+'\" same=\"layuiTreeCheck\" lay-skin=\"primary\" '+(r.disabled?\"disabled\":\"\")+' value=\"'+r.id+'\">':\"\"}(),function(){return t.isJump&&r.href?'<a href=\"'+r.href+'\" target=\"_blank\" class=\"'+y+'\">'+(r.title||r.label||t.text.defaultNodeName)+\"</a>\":'<span class=\"'+y+(r.disabled?\" \"+d:\"\")+'\">'+(r.title||r.label||t.text.defaultNodeName)+\"</span>\"}(),\"</div>\",function(){if(!t.edit)return\"\";var e={add:'<i class=\"layui-icon layui-icon-add-1\"  data-type=\"add\"></i>',update:'<i class=\"layui-icon layui-icon-edit\" data-type=\"update\"></i>',del:'<i class=\"layui-icon layui-icon-delete\" data-type=\"del\"></i>'},i=['<div class=\"layui-btn-group layui-tree-btnGroup\">'];return t.edit===!0&&(t.edit=[\"update\",\"del\"]),\"object\"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||\"\")}),i.join(\"\")+\"</div>\"):void 0}(),\"</div></div>\"].join(\"\"));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev(\".\"+s)[0]&&h.prev().children(\".layui-tree-pack\").addClass(\"layui-tree-showLine\"),l||h.parent(\".layui-tree-pack\").addClass(\"layui-tree-lineExtend\"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children(\".\"+p),l=r.children(\".\"+f),c=r.find(\".\"+o),k=r.find(\".\"+y),m=t.onlyIconControl?c:l,x=\"\";m.on(\"click\",function(i){var a=e.children(\".\"+v),n=m.children(\".layui-icon\")[0]?m.children(\".layui-icon\"):m.find(\".layui-tree-icon\").children(\".layui-icon\");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings(\".\"+s);r.removeClass(C),r.children(\".\"+v).slideUp(200),r.find(\".layui-tree-icon\").children(\".layui-icon\").removeClass(u).addClass(h)}}else x=\"normal\"}),k.on(\"click\",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?\"open\":\"close\":t.onlyIconControl?\"close\":\"open\",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop(\"checked\"));if(!a.prop(\"disabled\")){if(\"object\"==typeof i.children||e.find(\".\"+v)[0]){var r=e.find(\".\"+v).find('input[same=\"layuiTreeCheck\"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents(\".\"+s)[0]){var i,a=e.parent(\".\"+v),n=a.parent(),r=a.prev().find('input[same=\"layuiTreeCheck\"]');t?r.prop(\"checked\",t):(a.find('input[same=\"layuiTreeCheck\"]').each(function(){this.checked&&(i=!0)}),i||r.prop(\"checked\",!1)),l(n)}};l(e),n.renderForm(\"checkbox\")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children(\".\"+p),l=r.children(\".\"+f);l.on(\"click\",'input[same=\"layuiTreeCheck\"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop(\"checked\");l.prop(\"disabled\")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children(\".\"+p),d=l.children(\".\"+f);l.children(\".layui-tree-btnGroup\").on(\"click\",\".layui-icon\",function(l){layui.stope(l);var f=i(this).data(\"type\"),b=e.children(\".\"+v),g={data:a,type:f,elem:e};if(\"add\"==f){b[0]||(r.showLine?(d.find(\".\"+o).addClass(\"layui-tree-icon\"),d.find(\".\"+o).children(\".layui-icon\").addClass(h).removeClass(\"layui-icon-file\")):d.find(\".layui-tree-iconArrow\").removeClass(c),e.append('<div class=\"layui-tree-pack\"></div>'));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children(\".\"+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find(\".\"+v).each(function(){i(this).children(\".\"+s).last().addClass(k)}),b.children(\".\"+s).last().prev().hasClass(k)?b.children(\".\"+s).last().prev().removeClass(k):b.children(\".\"+s).last().removeClass(k),!e.parent(\".\"+v)[0]&&e.next()[0]&&b.children(\".\"+s).last().removeClass(k);else{var T=e.siblings(\".\"+s),L=1,I=e.parent(\".\"+v);layui.each(T,function(e,a){i(a).children(\".\"+v)[0]||(L=0)}),1==L?(T.children(\".\"+v).addClass(m),T.children(\".\"+v).children(\".\"+s).removeClass(k),e.children(\".\"+v).addClass(m),I.removeClass(x),I.children(\".\"+s).last().children(\".\"+v).children(\".\"+s).last().addClass(k)):e.children(\".\"+v).children(\".\"+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same=\"layuiTreeCheck\"]')[0].checked){var A=e.children(\".\"+v).children(\".\"+s).last();A.find('input[same=\"layuiTreeCheck\"]')[0].checked=!0}t.renderForm(\"checkbox\")}else if(\"update\"==f){var F=d.children(\".\"+y).html();d.children(\".\"+y).html(\"\"),d.append('<input type=\"text\" class=\"layui-tree-editInput\">'),d.children(\".layui-tree-editInput\").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children(\".\"+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(\".layui-tree-editInput\").blur(function(){j(i(this))}),d.children(\".layui-tree-editInput\").on(\"keydown\",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('\\u786e\\u8ba4\\u5220\\u9664\\u8be5\\u8282\\u70b9 \"<span style=\"color: #999;\">'+(a.title||\"\")+'</span>\" \\u5417\\uff1f',function(a){if(r.operate&&r.operate(g),g.status=\"remove\",n.close(a),!e.prev(\".\"+s)[0]&&!e.next(\".\"+s)[0]&&!e.parent(\".\"+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings(\".\"+s).children(\".\"+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents(\".\"+s)[0]){var a=e.siblings(\".\"+s).children(\".\"+p),n=e.parent(\".\"+v).prev(),r=n.find('input[same=\"layuiTreeCheck\"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same=\"layuiTreeCheck\"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm(\"checkbox\"),l(n.parent(\".\"+s))))}};l(e)}if(r.showLine){var d=e.siblings(\".\"+s),h=1,f=e.parent(\".\"+v);layui.each(d,function(e,a){i(a).children(\".\"+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children(\".\"+v).addClass(m),d.children(\".\"+v).children(\".\"+s).removeClass(k)),e.next()[0]?f.children(\".\"+s).last().children(\".\"+v).children(\".\"+s).last().addClass(k):e.prev().children(\".\"+v).children(\".\"+s).last().addClass(k),e.next()[0]||e.parents(\".\"+s)[1]||e.parents(\".\"+s).eq(0).next()[0]||e.prev(\".\"+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent(\".\"+v).prev();if(r.showLine){y.find(\".\"+o).removeClass(\"layui-tree-icon\"),y.find(\".\"+o).children(\".layui-icon\").removeClass(u).addClass(\"layui-icon-file\");var w=y.parents(\".\"+v).eq(0);w.addClass(x),w.children(\".\"+s).each(function(){i(this).children(\".\"+v).children(\".\"+s).last().addClass(k)})}else y.find(\".layui-tree-iconArrow\").addClass(c);e.parents(\".\"+s).eq(0).removeClass(C),e.parent(\".\"+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(\".layui-tree-checkedFirst\");e.setChecked(e.checkids),e.elem.find(\".layui-tree-search\").on(\"keyup\",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find(\".\"+y).each(function(){var e=i(this).parents(\".\"+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass(\"layui-tree-searchShow\"),e.parent(\".\"+v)[0]&&a(e.parent(\".\"+v).parent(\".\"+s))};a(e.parent(\".\"+s))}}),r.find(\".\"+p).each(function(){var e=i(this).parent(\".\"+s);e.hasClass(\"layui-tree-searchShow\")||e.addClass(c)}),0==r.find(\".layui-tree-searchShow\").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(\".layui-tree-search\").on(\"keydown\",function(){i(this).nextAll().find(\".\"+p).each(function(){var e=i(this).parent(\".\"+s);e.removeClass(\"layui-tree-searchShow \"+c)}),i(\".layui-tree-emptyText\")[0]&&i(\".layui-tree-emptyText\").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(\".layui-form-checked\").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find(\".\"+s).each(function(a,n){var t=i(this).data(\"id\"),r=i(n).children(\".\"+p).find('input[same=\"layuiTreeCheck\"]'),l=r.next();if(\"number\"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else\"object\"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)});layui.define([\"laytpl\",\"form\"],function(e){\"use strict\";var a=layui.$,t=layui.laytpl,i=layui.form,n=\"transfer\",l={config:{},index:layui[n]?layui[n].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,n,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c=\"layui-hide\",o=\"layui-btn-disabled\",d=\"layui-none\",s=\"layui-transfer-box\",u=\"layui-transfer-header\",h=\"layui-transfer-search\",f=\"layui-transfer-active\",y=\"layui-transfer-data\",p=function(e){return e=e||{},['<div class=\"layui-transfer-box\" data-index=\"'+e.index+'\">','<div class=\"layui-transfer-header\">','<input type=\"checkbox\" name=\"'+e.checkAllName+'\" lay-filter=\"layTransferCheckbox\" lay-type=\"all\" lay-skin=\"primary\" title=\"{{ d.data.title['+e.index+\"] || 'list\"+(e.index+1)+\"' }}\\\">\",\"</div>\",\"{{# if(d.data.showSearch){ }}\",'<div class=\"layui-transfer-search\">','<i class=\"layui-icon layui-icon-search\"></i>','<input type=\"input\" class=\"layui-input\" placeholder=\"\\u5173\\u952e\\u8bcd\\u641c\\u7d22\">',\"</div>\",\"{{# } }}\",'<ul class=\"layui-transfer-data\"></ul>',\"</div>\"].join(\"\")},v=['<div class=\"layui-transfer layui-form layui-border-box\" lay-filter=\"LAY-transfer-{{ d.index }}\">',p({index:0,checkAllName:\"layTransferLeftCheckAll\"}),'<div class=\"layui-transfer-active\">','<button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled\" data-index=\"0\">','<i class=\"layui-icon layui-icon-next\"></i>',\"</button>\",'<button type=\"button\" class=\"layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled\" data-index=\"1\">','<i class=\"layui-icon layui-icon-prev\"></i>',\"</button>\",\"</div>\",p({index:1,checkAllName:\"layTransferRightCheckAll\"}),\"</div>\"].join(\"\"),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:[\"\\u5217\\u8868\\u4e00\",\"\\u5217\\u8868\\u4e8c\"],width:200,height:360,data:[],value:[],showSearch:!1,id:\"\",text:{none:\"\\u65e0\\u6570\\u636e\",searchNone:\"\\u65e0\\u5339\\u914d\\u6570\\u636e\"}},x.prototype.reload=function(e){var t=this;t.config=a.extend({},t.config,e),t.render()},x.prototype.render=function(){var e=this,i=e.config,n=e.elem=a(t(v).render({data:i,index:e.index})),l=i.elem=a(i.elem);l[0]&&(i.data=i.data||[],i.value=i.value||[],e.key=i.id||e.index,l.html(e.elem),e.layBox=e.elem.find(\".\"+s),e.layHeader=e.elem.find(\".\"+u),e.laySearch=e.elem.find(\".\"+h),e.layData=n.find(\".\"+y),e.layBtn=n.find(\".\"+f+\" .layui-btn\"),e.layBox.css({width:i.width,height:i.height}),e.layData.css({height:function(){return i.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:\"layTransferLeftCheck\",views:[]},{checkName:\"layTransferRightCheck\",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,i=[\"<li>\",'<input type=\"checkbox\" name=\"'+a[t].checkName+'\" lay-skin=\"primary\" lay-filter=\"layTransferCheckbox\" title=\"'+e.title+'\"'+(e.disabled?\" disabled\":\"\")+(e.checked?\" checked\":\"\")+' value=\"'+e.value+'\">',\"</li>\"].join(\"\");a[t].views.push(i),delete e.selected}),e.layData.eq(0).html(a[0].views.join(\"\")),e.layData.eq(1).html(a[1].views.join(\"\")),e.renderCheckBtn()},x.prototype.renderForm=function(e){i.render(e,\"LAY-transfer-\"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,i=t.config;e=e||{},t.layBox.each(function(n){var l=a(this),r=l.find(\".\"+y),d=l.find(\".\"+u).find('input[type=\"checkbox\"]'),s=r.find('input[type=\"checkbox\"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data(\"hide\");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop(\"checked\",f&&h===s.length),t.layBtn.eq(n)[f?\"removeClass\":\"addClass\"](o),!e.stopNone){var p=r.children(\"li:not(.\"+c+\")\").length;t.noneView(r,p?\"\":i.text.none)}}),t.renderForm(\"checkbox\")},x.prototype.noneView=function(e,t){var i=a('<p class=\"layui-none\">'+(t||\"\")+\"</p>\");e.find(\".\"+d)[0]&&e.find(\".\"+d).remove(),t.replace(/\\s/g,\"\")&&e.append(i)},x.prototype.setValue=function(){var e=this,t=e.config,i=[];return e.layBox.eq(1).find(\".\"+y+' input[type=\"checkbox\"]').each(function(){var e=a(this).data(\"hide\");e||i.push(this.value)}),t.value=i,e},x.prototype.parseData=function(e){var t=this,i=t.config,n=[];return layui.each(i.data,function(t,l){l=(\"function\"==typeof i.parseData?i.parseData(l):l)||l,n.push(l=a.extend({},l)),layui.each(i.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),i.data=n,t},x.prototype.getData=function(e){var a=this,t=a.config,i=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},x.prototype.events=function(){var e=this,t=e.config;e.elem.on(\"click\",'input[lay-filter=\"layTransferCheckbox\"]+',function(){var t=a(this).prev(),i=t[0].checked,n=t.parents(\".\"+s).eq(0).find(\".\"+y);t[0].disabled||(\"all\"===t.attr(\"lay-type\")&&n.find('input[type=\"checkbox\"]').each(function(){this.disabled||(this.checked=i)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on(\"click\",function(){var i=a(this),n=i.data(\"index\"),l=e.layBox.eq(n),r=[];if(!i.hasClass(o)){e.layBox.eq(n).each(function(t){var i=a(this),n=i.find(\".\"+y);n.children(\"li\").each(function(){var t=a(this),i=t.find('input[type=\"checkbox\"]'),n=i.data(\"hide\");i[0].checked&&!n&&(i[0].checked=!1,l.siblings(\".\"+s).find(\".\"+y).append(t.clone()),t.remove(),r.push(i[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings(\".\"+s).find(\".\"+h+\" input\");\"\"===c.val()||c.trigger(\"keyup\"),t.onchange&&t.onchange(e.getData(r),n)}}),e.laySearch.find(\"input\").on(\"keyup\",function(){var i=this.value,n=a(this).parents(\".\"+h).eq(0).siblings(\".\"+y),l=n.children(\"li\");l.each(function(){var e=a(this),t=e.find('input[type=\"checkbox\"]'),n=t[0].title.indexOf(i)!==-1;e[n?\"removeClass\":\"addClass\"](c),t.data(\"hide\",!n)}),e.renderCheckBtn();var r=l.length===n.children(\"li.\"+c).length;e.noneView(n,r?t.text.searchNone:\"\")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(n,l)});layui.define([\"laytpl\",\"laypage\",\"layer\",\"form\",\"util\"],function(e){\"use strict\";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=layui.util,r=layui.hint(),c=layui.device(),d={config:{checkName:\"LAY_CHECKED\",indexName:\"LAY_TABLE_INDEX\"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,h,e,t)}},s=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(s.that[i]=e,s.config[i]=t),{config:t,reload:function(t,i){e.reload.call(e,t,i)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},u=function(e){var t=s.config[e];return t||r.error(e?\"The table instance with ID '\"+e+\"' not found\":\"ID argument required\"),t||null},y=function(e,a,l,n){var r=this.config||{};r.escape&&(a=o.escape(a));var c=e.templet?function(){return\"function\"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t(\"<div>\"+c+\"</div>\").text():c},h=\"table\",f=\".layui-table\",p=\"layui-hide\",v=\"layui-none\",m=\"layui-table-view\",g=\".layui-table-tool\",b=\".layui-table-box\",x=\".layui-table-init\",k=\".layui-table-header\",C=\".layui-table-body\",w=\".layui-table-main\",T=\".layui-table-fixed\",N=\".layui-table-fixed-l\",L=\".layui-table-fixed-r\",_=\".layui-table-total\",S=\".layui-table-page\",A=\".layui-table-sort\",R=\"layui-table-edit\",W=\"layui-table-hover\",z=function(e){var t='{{#if(item2.colspan){}} colspan=\"{{item2.colspan}}\"{{#} if(item2.rowspan){}} rowspan=\"{{item2.rowspan}}\"{{#}}}';return e=e||{},['<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" class=\"layui-table\" ','{{# if(d.data.skin){ }}lay-skin=\"{{d.data.skin}}\"{{# } }} {{# if(d.data.size){ }}lay-size=\"{{d.data.size}}\"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',\"<thead>\",\"{{# layui.each(d.data.cols, function(i1, item1){ }}\",\"<tr>\",\"{{# layui.each(item1, function(i2, item2){ }}\",'{{# if(item2.fixed && item2.fixed !== \"right\"){ left = true; } }}','{{# if(item2.fixed === \"right\"){ right = true; } }}',function(){return e.fixed&&\"right\"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== \"right\"){ }}':\"right\"===e.fixed?'{{# if(item2.fixed === \"right\"){ }}':\"\"}(),\"{{# var isSort = !(item2.colGroup) && item2.sort; }}\",'<th data-field=\"{{ item2.field||i2 }}\" data-key=\"{{d.index}}-{{i1}}-{{i2}}\" {{# if( item2.parentKey){ }}data-parentkey=\"{{ item2.parentKey }}\"{{# } }} {{# if(item2.minWidth){ }}data-minwidth=\"{{item2.minWidth}}\"{{# } }} '+t+' {{# if(item2.unresize || item2.colGroup){ }}data-unresize=\"true\"{{# } }} class=\"{{# if(item2.hide){ }}layui-hide{{# } }}{{# if(isSort){ }} layui-unselect{{# } }}{{# if(!item2.field){ }} layui-table-col-special{{# } }}\">','<div class=\"layui-table-cell laytable-cell-',\"{{# if(item2.colGroup){ }}\",\"group\",\"{{# } else { }}\",\"{{d.index}}-{{i1}}-{{i2}}\",'{{# if(item2.type !== \"normal\"){ }}',\" laytable-cell-{{ item2.type }}\",\"{{# } }}\",\"{{# } }}\",'\" {{#if(item2.align){}}align=\"{{item2.align}}\"{{#}}}>','{{# if(item2.type === \"checkbox\"){ }}','<input type=\"checkbox\" name=\"layTableCheckbox\" lay-skin=\"primary\" lay-filter=\"layTableAllChoose\" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>',\"{{# } else { }}\",'<span>{{item2.title||\"\"}}</span>',\"{{# if(isSort){ }}\",'<span class=\"layui-table-sort layui-inline\"><i class=\"layui-edge layui-table-sort-asc\" title=\"\\u5347\\u5e8f\"></i><i class=\"layui-edge layui-table-sort-desc\" title=\"\\u964d\\u5e8f\"></i></span>',\"{{# } }}\",\"{{# } }}\",\"</div>\",\"</th>\",e.fixed?\"{{# }; }}\":\"\",\"{{# }); }}\",\"</tr>\",\"{{# }); }}\",\"</thead>\",\"</table>\"].join(\"\")},E=['<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" class=\"layui-table\" ','{{# if(d.data.skin){ }}lay-skin=\"{{d.data.skin}}\"{{# } }} {{# if(d.data.size){ }}lay-size=\"{{d.data.size}}\"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',\"<tbody></tbody>\",\"</table>\"].join(\"\"),j=['<div class=\"layui-form layui-border-box {{d.VIEW_CLASS}}{{# if(d.data.className){ }} {{ d.data.className }}{{# } }}\" lay-filter=\"LAY-table-{{d.index}}\" lay-id=\"{{ d.data.id }}\" style=\"{{# if(d.data.width){ }}width:{{d.data.width}}px;{{# } }} {{# if(d.data.height){ }}height:{{d.data.height}}px;{{# } }}\">',\"{{# if(d.data.toolbar){ }}\",'<div class=\"layui-table-tool\">','<div class=\"layui-table-tool-temp\"></div>','<div class=\"layui-table-tool-self\"></div>',\"</div>\",\"{{# } }}\",'<div class=\"layui-table-box\">',\"{{# if(d.data.loading){ }}\",'<div class=\"layui-table-init\" style=\"background-color: #fff;\">','<i class=\"layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop\"></i>',\"</div>\",\"{{# } }}\",\"{{# var left, right; }}\",'<div class=\"layui-table-header\">',z(),\"</div>\",'<div class=\"layui-table-body layui-table-main\">',E,\"</div>\",\"{{# if(left){ }}\",'<div class=\"layui-table-fixed layui-table-fixed-l\">','<div class=\"layui-table-header\">',z({fixed:!0}),\"</div>\",'<div class=\"layui-table-body\">',E,\"</div>\",\"</div>\",\"{{# }; }}\",\"{{# if(right){ }}\",'<div class=\"layui-table-fixed layui-table-fixed-r\">','<div class=\"layui-table-header\">',z({fixed:\"right\"}),'<div class=\"layui-table-mend\"></div>',\"</div>\",'<div class=\"layui-table-body\">',E,\"</div>\",\"</div>\",\"{{# }; }}\",\"</div>\",\"{{# if(d.data.totalRow){ }}\",'<div class=\"layui-table-total\">','<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" class=\"layui-table\" ','{{# if(d.data.skin){ }}lay-skin=\"{{d.data.skin}}\"{{# } }} {{# if(d.data.size){ }}lay-size=\"{{d.data.size}}\"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>','<tbody><tr><td><div class=\"layui-table-cell\" style=\"visibility: hidden;\">Total</div></td></tr></tbody>',\"</table>\",\"</div>\",\"{{# } }}\",\"{{# if(d.data.page){ }}\",'<div class=\"layui-table-page\">','<div id=\"layui-table-page{{d.index}}\"></div>',\"</div>\",\"{{# } }}\",\"<style>\",\"{{# layui.each(d.data.cols, function(i1, item1){\",\"layui.each(item1, function(i2, item2){ }}\",\".laytable-cell-{{d.index}}-{{i1}}-{{i2}}{ \",\"{{# if(item2.width){ }}\",\"width: {{item2.width}}px;\",\"{{# } }}\",\" }\",\"{{# });\",\"}); }}\",\"</style>\",\"</div>\"].join(\"\"),F=t(window),I=t(document),H=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};H.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:[\"filter\",\"exports\",\"print\"],autoSort:!0,text:{none:\"\\u65e0\\u6570\\u636e\"}},H.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr(\"id\")||e.index,a.request=t.extend({pageName:\"page\",limitName:\"limit\"},a.request),a.response=t.extend({statusName:\"code\",statusCode:0,msgName:\"msg\",dataName:\"data\",totalRowName:\"totalRow\",countName:\"count\"},a.response),\"object\"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split(\"-\")[1],a.height=F.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next(\".\"+m),o=e.elem=t(i(j).render({VIEW_CLASS:m,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(g),e.layBox=o.find(b),e.layHeader=o.find(k),e.layMain=o.find(w),e.layBody=o.find(C),e.layFixed=o.find(T),e.layFixLeft=o.find(N),e.layFixRight=o.find(L),e.layTotal=o.find(_),e.layPage=o.find(S),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(k).find(\"th\");r.height(e.layHeader.height()-1-parseFloat(r.css(\"padding-top\"))-parseFloat(r.css(\"padding-bottom\")))}e.pullData(e.page),e.events()},H.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type=\"checkbox\"),e.space&&(e.type=\"space\"),e.type||(e.type=\"normal\"),\"normal\"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},H.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l=\"none\"===t.css(\"display\")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),\"width\"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+\"-\"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+\"-\"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},H.prototype.renderToolbar=function(){var e=this,a=e.config,l=['<div class=\"layui-inline\" lay-event=\"add\"><i class=\"layui-icon layui-icon-add-1\"></i></div>','<div class=\"layui-inline\" lay-event=\"update\"><i class=\"layui-icon layui-icon-edit\"></i></div>','<div class=\"layui-inline\" lay-event=\"delete\"><i class=\"layui-icon layui-icon-delete\"></i></div>'].join(\"\"),n=e.layTool.find(\".layui-table-tool-temp\");if(\"default\"===a.toolbar)n.html(l);else if(\"string\"==typeof a.toolbar){var o=t(a.toolbar).html()||\"\";o&&n.html(i(o).render(a))}var r={filter:{title:\"\\u7b5b\\u9009\\u5217\",layEvent:\"LAYTABLE_COLS\",icon:\"layui-icon-cols\"},exports:{title:\"\\u5bfc\\u51fa\",layEvent:\"LAYTABLE_EXPORT\",icon:\"layui-icon-export\"},print:{title:\"\\u6253\\u5370\",layEvent:\"LAYTABLE_PRINT\",icon:\"layui-icon-print\"}},c=[];\"object\"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i=\"string\"==typeof t?r[t]:t;i&&c.push('<div class=\"layui-inline\" title=\"'+i.title+'\" lay-event=\"'+i.layEvent+'\"><i class=\"layui-icon '+i.icon+'\"></i></div>')}),e.layTool.find(\".layui-table-tool-self\").html(c.join(\"\"))},H.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key=\"'+a.index+\"-\"+t+'\"]'),n=parseInt(l.attr(\"colspan\"))||0;if(l[0]){var o=t.split(\"-\"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr(\"colspan\",n),l[n<1?\"addClass\":\"removeClass\"](p),r.colspan=n,r.hide=n<1;var c=l.data(\"parentkey\");c&&i.setParentCol(e,c)}},H.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},H.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit(\"width\");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return\"line\"===t.skin||\"nob\"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,c){var d=0,s=c.minWidth||t.cellMinWidth;return c?void(c.colGroup||c.hide||(e?l&&l<s&&(a--,d=s):(d=c.width||0,/\\d+%$/.test(d)?(d=Math.floor(parseFloat(d)/100*o),d<s&&(d=s)):d||(c.width=d=0,a++)),c.hide&&(d=0),n+=d)):void r.splice(i,1)})}),o>n&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+\"-\"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+\"px\"}):/\\d+%$/.test(a.width)&&e.getCssRule(t.index+\"-\"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+\"px\"}))});var c=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children(\"table\").outerWidth();if(e.autoColNums&&c>=-i&&c<=i){var d=function(t){var i;return t=t||e.layHeader.eq(0).find(\"thead th:last-child\"),i=t.data(\"field\"),!i&&t.prev()[0]?d(t.prev()):t},s=d(),u=s.data(\"key\");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+c+\"px\",e.layMain.height()-e.layMain.prop(\"clientHeight\")>0&&(t.style.width=parseFloat(t.style.width)-1+\"px\")})}e.loading(!0)},H.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},H.prototype.reload=function(e,i){var a=this;e=e||{},delete a.haveInit,layui.each(e,function(e,t){\"array\"===layui._typeof(t)&&delete a.config[e]}),a.config=t.extend(i,{},a.config,e),a.render()},H.prototype.errorView=function(e){var i=this,a=i.layMain.find(\".\"+v),l=t('<div class=\"'+v+'\">'+(e||\"Error\")+\"</div>\");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(p),i.layMain.find(\"tbody\").html(\"\"),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},H.prototype.page=1,H.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){\"object\"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var c=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf(\"application/json\")&&(c=JSON.stringify(c)),i.loading(),t.ajax({type:a.method||\"get\",url:a.url,contentType:a.contentType,data:c,dataType:\"json\",headers:a.headers||{},success:function(t){\"function\"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'\\u8fd4\\u56de\\u7684\\u6570\\u636e\\u4e0d\\u7b26\\u5408\\u89c4\\u8303\\uff0c\\u6b63\\u786e\\u7684\\u6210\\u529f\\u72b6\\u6001\\u7801\\u5e94\\u4e3a\\uff1a\"'+n.statusName+'\": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+\" ms\"),i.setColsWidth(),\"function\"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView(\"\\u8bf7\\u6c42\\u5f02\\u5e38\\uff0c\\u9519\\u8bef\\u63d0\\u793a\\uff1a\"+t),i.renderForm(),i.setColsWidth(),\"function\"==typeof a.error&&a.error(e,t)}})}else if(\"array\"===layui._typeof(a.data)){var d={},s=e*a.limit-a.limit;d[n.dataName]=a.data.concat().splice(s,a.limit),d[n.countName]=a.data.length,\"object\"==typeof a.totalRow&&(d[n.totalRowName]=t.extend({},a.totalRow)),i.renderData(d,e,d[n.countName]),o(),i.setColsWidth(),\"function\"==typeof a.done&&a.done(d,e,d[n.countName])}},H.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},H.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=e[s.response.totalRowName],f=[],m=[],g=[],b=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],h=[],v=a+s.limit*(n-1)+1;\"array\"===layui._typeof(l)&&0===l.length||(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var f=r.field||n,m=s.index+\"-\"+r.key,g=l[f];if(void 0!==g&&null!==g||(g=\"\"),!r.colGroup){var b=['<td data-field=\"'+f+'\" data-key=\"'+m+'\" '+function(){var e=[];return r.edit&&e.push('data-edit=\"'+r.edit+'\"'),r.align&&e.push('align=\"'+r.align+'\"'),r.templet&&e.push('data-content=\"'+g+'\"'),r.toolbar&&e.push('data-off=\"true\"'),r.event&&e.push('lay-event=\"'+r.event+'\"'),r.style&&e.push('style=\"'+r.style+'\"'),r.minWidth&&e.push('data-minwidth=\"'+r.minWidth+'\"'),e.join(\" \")}()+' class=\"'+function(){var e=[];return r.hide&&e.push(p),r.field||e.push(\"layui-table-col-special\"),e.join(\" \")}()+'\">','<div class=\"layui-table-cell laytable-cell-'+function(){return\"normal\"===r.type?m:m+\" laytable-cell-\"+r.type}()+'\">'+function(){var n=t.extend(!0,{LAY_INDEX:v,LAY_COL:r},l),o=d.config.checkName;switch(r.type){case\"checkbox\":return'<input type=\"checkbox\" name=\"layTableCheckbox\" lay-skin=\"primary\" '+function(){return r[o]?(l[o]=r[o],r[o]?\"checked\":\"\"):n[o]?\"checked\":\"\"}()+\">\";case\"radio\":return n[o]&&(e=a),'<input type=\"radio\" name=\"layTableRadio_'+s.index+'\" '+(n[o]?\"checked\":\"\")+' lay-type=\"layTableRadio\">';case\"numbers\":return v}return r.toolbar?i(t(r.toolbar).html()||\"\").render(n):y.call(c,r,g,n)}(),\"</div></td>\"].join(\"\");o.push(b),r.fixed&&\"right\"!==r.fixed&&u.push(b),\"right\"===r.fixed&&h.push(b)}}),f.push('<tr data-index=\"'+a+'\">'+o.join(\"\")+\"</tr>\"),m.push('<tr data-index=\"'+a+'\">'+u.join(\"\")+\"</tr>\"),g.push('<tr data-index=\"'+a+'\">'+h.join(\"\")+\"</tr>\"))}),c.layBody.scrollTop(0),c.layMain.find(\".\"+v).remove(),c.layMain.find(\"tbody\").html(f.join(\"\")),c.layFixLeft.find(\"tbody\").html(m.join(\"\")),c.layFixRight.find(\"tbody\").html(g.join(\"\")),c.renderForm(),\"number\"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?\"addClass\":\"removeClass\"](p),0===u.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(p),r?b():(b(),c.renderTotal(u,h),void(s.page&&(s.page=t.extend({elem:\"layui-table-page\"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:[\"prev\",\"page\",\"next\",\"skip\",\"count\",\"limit\"],prev:'<i class=\"layui-icon\">&#xe603;</i>',next:'<i class=\"layui-icon\">&#xe602;</i>',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page)))))},H.prototype.renderTotal=function(e,a){var l=this,n=l.config,o={};if(n.totalRow){layui.each(e,function(e,t){\"array\"===layui._typeof(t)&&0===t.length||l.eachCols(function(e,i){var a=i.field||e,l=t[a];i.totalRow&&(o[a]=(o[a]||0)+(parseFloat(l)||0))})}),l.dataTotal={};var r=[];l.eachCols(function(e,c){var d=c.field||e,s=function(){var e,t=c.totalRowText||\"\",i=parseFloat(o[d]).toFixed(2),n={};return n[d]=i,e=c.totalRow?y.call(l,c,i,n)||t:t,a?a[c.field]||e:e}(),u=['<td data-field=\"'+d+'\" data-key=\"'+n.index+\"-\"+c.key+'\" '+function(){var e=[];return c.align&&e.push('align=\"'+c.align+'\"'),c.style&&e.push('style=\"'+c.style+'\"'),c.minWidth&&e.push('data-minwidth=\"'+c.minWidth+'\"'),e.join(\" \")}()+' class=\"'+function(){var e=[];return c.hide&&e.push(p),c.field||e.push(\"layui-table-col-special\"),e.join(\" \")}()+'\">','<div class=\"layui-table-cell laytable-cell-'+function(){var e=n.index+\"-\"+c.key;return\"normal\"===c.type?e:e+\" laytable-cell-\"+c.type}()+'\">'+function(){var e=c.totalRow||n.totalRow;return\"string\"==typeof e?i(e).render(t.extend({TOTAL_NUMS:s},c)):s}(),\"</div></td>\"].join(\"\");c.field&&(l.dataTotal[d]=s),r.push(u)}),l.layTotal.find(\"tbody\").html(\"<tr>\"+r.join(\"\")+\"</tr>\")}},H.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(\".laytable-cell-\"+(a.index+\"-\"+t)+\":eq(0)\")},H.prototype.renderForm=function(e){n.render(e,\"LAY-table-\"+this.index)},H.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,\"layui-table-click\"),a=t.layBody.find('tr[data-index=\"'+e+'\"]');a.addClass(i).siblings(\"tr\").removeClass(i)},H.prototype.sort=function(e,i,a,l){var n,o,c=this,s={},u=c.config,y=u.elem.attr(\"lay-filter\"),f=d.cache[c.key];\"string\"==typeof e&&(n=e,c.layHeader.find(\"th\").each(function(i,a){var l=t(this),o=l.data(\"field\");if(o===e)return e=l,n=o,!1}));try{var n=n||e.data(\"field\"),p=e.data(\"key\");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find(\"th .laytable-cell-\"+p).find(A);c.layHeader.find(\"th\").find(A).removeAttr(\"lay-sort\"),v.attr(\"lay-sort\",i||null),c.layFixed.find(\"th\")}catch(m){r.error(\"Table modules: sort field '\"+n+\"' not matched\")}c.sortKey={field:n,sort:i},u.autoSort&&(\"asc\"===i?o=layui.sort(f,n):\"desc\"===i?o=layui.sort(f,n,!0):(o=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=o||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,h,\"sort(\"+y+\")\",{field:n,type:i})},H.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(x).remove()):(i.layInit=t(['<div class=\"layui-table-init\">','<i class=\"layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop\"></i>',\"</div>\"].join(\"\")),i.layBox.append(i.layInit)))},H.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&\"array\"!==layui._typeof(l[e])&&(l[e][a.checkName]=t)},H.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name=\"layTableCheckbox\"]'),a=function(i){return e.eachCols(function(e,a){\"checkbox\"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop(\"checked\",!0),e.renderForm(\"checkbox\")),a(!0)):(i[0].checked&&(i.prop(\"checked\",!1),e.renderForm(\"checkbox\")),a(!1)))},H.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find(\"style\")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===\".laytable-cell-\"+e)return t(a),!0})},H.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=F.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css(\"height\",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css(\"height\",e-2))},H.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement(\"div\"),e.style.width=\"100px\",e.style.height=\"100px\",e.style.overflowY=\"scroll\",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},H.prototype.scrollPatch=function(){var e=this,i=e.layMain.children(\"table\"),a=e.layMain.width()-e.layMain.prop(\"clientWidth\"),l=e.layMain.height()-e.layMain.prop(\"clientHeight\"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(\".layui-table-patch\")[0]){var i=t('<th class=\"layui-table-patch\"><div class=\"layui-table-cell\"></div></th>');i.find(\"div\").css({width:a}),e.find(\"tr\").append(i)}}else e.find(\".layui-table-patch\").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),c=r-l;e.layFixed.find(C).css(\"height\",i.height()>=c?c:\"auto\"),e.layFixRight[n>0?\"removeClass\":\"addClass\"](p),e.layFixRight.css(\"right\",a-1)},H.prototype.events=function(){var e,i=this,a=i.config,o=t(\"body\"),r={},s=i.layHeader.find(\"th\"),u=\".layui-table-cell\",f=a.elem.attr(\"lay-filter\");i.layTool.on(\"click\",\"*[lay-event]\",function(e){var o=t(this),r=o.attr(\"lay-event\"),s=function(e){var l=t(e.list),n=t('<ul class=\"layui-table-tool-panel\"></ul>');n.html(l),a.height&&n.css(\"max-height\",a.height-(i.layTool.outerHeight()||50)),o.find(\".layui-table-tool-panel\")[0]||o.append(n),i.renderForm(),n.on(\"click\",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),I.trigger(\"table.tool.panel.remove\"),l.close(i.tipsIndex),r){case\"LAYTABLE_COLS\":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&\"normal\"==i.type&&e.push('<li><input type=\"checkbox\" name=\"'+i.field+'\" data-key=\"'+i.key+'\" data-parentkey=\"'+(i.parentKey||\"\")+'\" lay-skin=\"primary\" '+(i.hide?\"\":\"checked\")+' title=\"'+(i.title||i.field)+'\" lay-filter=\"LAY_TABLE_TOOL_COLS\"></li>')}),e.join(\"\")}(),done:function(){n.on(\"checkbox(LAY_TABLE_TOOL_COLS)\",function(e){var l=t(e.elem),n=this.checked,o=l.data(\"key\"),r=l.data(\"parentkey\");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+\"-\"+t===o){var c=l.hide;l.hide=!n,i.elem.find('*[data-key=\"'+a.index+\"-\"+o+'\"]')[n?\"removeClass\":\"addClass\"](p),c!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case\"LAYTABLE_EXPORT\":c.ie?l.tips(\"\\u5bfc\\u51fa\\u529f\\u80fd\\u4e0d\\u652f\\u6301 IE\\uff0c\\u8bf7\\u7528 Chrome \\u7b49\\u9ad8\\u7ea7\\u6d4f\\u89c8\\u5668\\u5bfc\\u51fa\",this,{tips:3}):s({list:function(){return['<li data-type=\"csv\">\\u5bfc\\u51fa\\u5230 Csv \\u6587\\u4ef6</li>','<li data-type=\"xls\">\\u5bfc\\u51fa\\u5230 Excel \\u6587\\u4ef6</li>'].join(\"\")}(),done:function(e,l){l.on(\"click\",function(){var e=t(this).data(\"type\");d.exportFile.call(i,a.id,null,e)})}});break;case\"LAYTABLE_PRINT\":var u=window.open(\"\\u6253\\u5370\\u7a97\\u53e3\",\"_blank\"),y=[\"<style>\",\"body{font-size: 12px; color: #666;}\",\"table{width: 100%; border-collapse: collapse; border-spacing: 0;}\",\"th,td{line-height: 20px; padding: 9px 15px; border: 1px solid #ccc; text-align: left; font-size: 12px; color: #666;}\",\"a{color: #666; text-decoration:none;}\",\"*.layui-hide{display: none}\",\"</style>\"].join(\"\"),v=t(i.layHeader.html());v.append(i.layMain.find(\"table\").html()),v.append(i.layTotal.find(\"table\").html()),v.find(\"th.layui-table-patch\").remove(),v.find(\".layui-table-col-special\").remove(),u.document.write(y+v.prop(\"outerHTML\")),u.document.close(),u.print(),u.close()}layui.event.call(this,h,\"toolbar(\"+f+\")\",t.extend({event:r,config:a},{}))}),s.on(\"mousemove\",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data(\"unresize\")||r.resizeStart||(r.allowResize=i.width()-l<=10,o.css(\"cursor\",r.allowResize?\"col-resize\":\"\"))}).on(\"mouseleave\",function(){t(this);r.resizeStart||o.css(\"cursor\",\"\")}).on(\"mousedown\",function(e){var l=t(this);if(r.allowResize){var n=l.data(\"key\");e.preventDefault(),r.resizeStart=!0,r.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();r.rule=e,r.ruleWidth=parseFloat(t),r.minWidth=l.data(\"minwidth\")||a.cellMinWidth})}}),I.on(\"mousemove\",function(t){if(r.resizeStart){if(t.preventDefault(),r.rule){var a=r.ruleWidth+t.clientX-r.offset[0];a<r.minWidth&&(a=r.minWidth),r.rule.style.width=a+\"px\",l.close(i.tipsIndex)}e=1}}).on(\"mouseup\",function(t){r.resizeStart&&(r={},o.css(\"cursor\",\"\"),i.scrollPatch()),2===e&&(e=null)}),s.on(\"click\",function(a){var l,n=t(this),o=n.find(A),r=o.attr(\"lay-sort\");return o[0]&&1!==e?(l=\"asc\"===r?\"desc\":\"desc\"===r?null:\"asc\",void i.sort(n,l,null,!0)):e=2}).find(A+\" .layui-edge \").on(\"click\",function(e){var a=t(this),l=a.index(),n=a.parents(\"th\").eq(0).data(\"field\");layui.stope(e),0===l?i.sort(n,\"asc\",null,!0):i.sort(n,\"desc\",null,!0)});var v=function(e){var a=t(this),l=a.parents(\"tr\").eq(0).data(\"index\"),n=i.layBody.find('tr[data-index=\"'+l+'\"]'),o=d.cache[i.key]||[];return o=o[l]||{},t.extend({tr:n,data:d.clearCacheKey(o),del:function(){d.cache[i.key][l]=[],n.remove(),i.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,t){if(e in o){var a,l=n.children('td[data-field=\"'+e+'\"]');o[e]=t,i.eachCols(function(t,i){i.field==e&&i.templet&&(a=i.templet)}),l.children(u).html(y.call(i,{templet:a},t,o)),l.data(\"content\",t)}})}},e)};i.elem.on(\"click\",'input[name=\"layTableCheckbox\"]+',function(){var e=t(this).prev(),a=i.layBody.find('input[name=\"layTableCheckbox\"]'),l=e.parents(\"tr\").eq(0).data(\"index\"),n=e[0].checked,o=\"layTableAllChoose\"===e.attr(\"lay-filter\");o?(a.each(function(e,t){t.checked=n,i.setCheckData(e,n)}),i.syncCheckAll(),i.renderForm(\"checkbox\")):(i.setCheckData(l,n),i.syncCheckAll()),layui.event.call(e[0],h,\"checkbox(\"+f+\")\",v.call(e[0],{checked:n,type:o?\"all\":\"one\"}))}),i.elem.on(\"click\",'input[lay-type=\"layTableRadio\"]+',function(){var e=t(this).prev(),l=e[0].checked,n=d.cache[i.key],o=e.parents(\"tr\").eq(0).data(\"index\");layui.each(n,function(e,t){o===e?t[a.checkName]=!0:delete t[a.checkName]}),i.setThisRowChecked(o),layui.event.call(this,h,\"radio(\"+f+\")\",v.call(this,{checked:l}))}),i.layBody.on(\"mouseenter\",\"tr\",function(){var e=t(this),a=e.index();e.data(\"off\")||i.layBody.find(\"tr:eq(\"+a+\")\").addClass(W)}).on(\"mouseleave\",\"tr\",function(){var e=t(this),a=e.index();e.data(\"off\")||i.layBody.find(\"tr:eq(\"+a+\")\").removeClass(W)}).on(\"click\",\"tr\",function(){m.call(this,\"row\")}).on(\"dblclick\",\"tr\",function(){m.call(this,\"rowDouble\")});var m=function(e){var i=t(this);i.data(\"off\")||layui.event.call(this,h,e+\"(\"+f+\")\",v.call(i.children(\"td\")[0]))};i.layBody.on(\"change\",\".\"+R,function(){var e=t(this),a=this.value,l=e.parent().data(\"field\"),n=e.parents(\"tr\").eq(0).data(\"index\"),o=d.cache[i.key][n];o[l]=a,layui.event.call(this,h,\"edit(\"+f+\")\",v.call(this,{value:a,field:l}))}).on(\"blur\",\".\"+R,function(){var e,a=t(this),l=this,n=a.parent().data(\"field\"),o=a.parents(\"tr\").eq(0).data(\"index\"),r=d.cache[i.key][o];i.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),a.siblings(u).html(function(t){return y.call(i,{templet:e},t,r)}(l.value)),a.parent().data(\"content\",l.value),a.remove()}),i.layBody.on(\"click\",\"td\",function(e){var i=t(this),a=(i.data(\"field\"),i.data(\"edit\")),l=i.children(u);if(!i.data(\"off\")&&a){var n=t('<input class=\"layui-input '+R+'\">');return n[0].value=strhtml(i.data(\"content\"))||strhtml(l.text()),i.find(\".\"+R)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on(\"mouseenter\",\"td\",function(){b.call(this)}).on(\"mouseleave\",\"td\",function(){b.call(this,\"hide\")});var g=\"layui-table-grid-down\",b=function(e){var i=t(this),a=i.children(u);if(!i.data(\"off\"))if(e)i.find(\".layui-table-grid-down\").remove();else if(a.prop(\"scrollWidth\")>a.outerWidth()){if(a.find(\".\"+g)[0])return;i.append('<div class=\"'+g+'\"><i class=\"layui-icon layui-icon-down\"></i></div>')}};i.layBody.on(\"click\",\".\"+g,function(e){var n=t(this),o=n.parent(),r=o.children(u);i.tipsIndex=l.tips(['<div class=\"layui-table-tips-main\" style=\"margin-top: -'+(r.height()+16)+\"px;\"+function(){return\"sm\"===a.size?\"padding: 4px 15px; font-size: 12px;\":\"lg\"===a.size?\"padding: 14px 15px;\":\"\"}()+'\">',r.html(),\"</div>\",'<i class=\"layui-icon layui-table-tips-c layui-icon-close\"></i>'].join(\"\"),r[0],{tips:[3,\"\"],time:-1,anim:-1,maxWidth:c.ios||c.android?300:i.elem.width()/2,isOutAnim:!1,skin:\"layui-table-tips\",success:function(e,t){e.find(\".layui-table-tips-c\").on(\"click\",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on(\"click\",\"*[lay-event]\",function(){var e=t(this),a=e.parents(\"tr\").eq(0).data(\"index\");layui.event.call(this,h,\"tool(\"+f+\")\",v.call(this,{event:e.attr(\"lay-event\")})),i.setThisRowChecked(a)}),i.layMain.on(\"scroll\",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(C).scrollTop(n),l.close(i.tipsIndex)}),F.on(\"resize\",function(){i.resize()})},function(){I.on(\"click\",function(){I.trigger(\"table.remove.tool.panel\")}),I.on(\"table.remove.tool.panel\",function(){t(\".layui-table-tool-panel\").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter=\"'+e+'\"]':f+\"[lay-data]\"),n=\"Table element property lay-data configuration item has a syntax error: \";return l.each(function(){var a=t(this),l=a.attr(\"lay-data\");try{l=new Function(\"return \"+l)()}catch(o){r.error(n+l,\"error\")}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr(\"lay-skin\"),size:a.attr(\"lay-size\"),even:\"string\"==typeof a.attr(\"lay-even\")},d.config,i,l);e&&a.hide(),a.find(\"thead>tr\").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr(\"lay-data\");try{l=new Function(\"return \"+l)()}catch(o){return r.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr(\"colspan\")||0,rowspan:a.attr(\"rowspan\")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find(\"tbody>tr\").each(function(e){var i=t(this),a={};i.children(\"td\").each(function(e,i){var l=t(this),n=l.data(\"field\");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children(\"td\").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},s.that={},s.config={},d.eachCols=function(e,i,a){var l=s.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void(\"function\"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return\"array\"===layui._typeof(l)?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.getData=function(e){var t=[],i=d.cache[e]||[];return layui.each(i,function(e,i){\"array\"!==layui._typeof(i)&&t.push(d.clearCacheKey(i))}),t},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||\"csv\";var l=s.that[e],n=s.config[e]||{},o={csv:\"text/csv\",xls:\"application/vnd.ms-excel\"}[i],u=document.createElement(\"a\");return c.ie?r.error(\"IE_NOT_SUPPORT_EXPORTS\"):(u.href=\"data:\"+o+\";charset=utf-8,\\ufeff\"+encodeURIComponent(function(){var i=[],n=[],o=[];return layui.each(t,function(t,a){var o=[];\"object\"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||\"\")}),layui.each(d.clearCacheKey(a),function(e,t){o.push('\"'+(t||\"\")+'\"')})):d.eachCols(e,function(e,n){if(n.field&&\"normal\"==n.type&&!n.hide){var r=a[n.field];void 0!==r&&null!==r||(r=\"\"),0==t&&i.push(n.title||\"\"),o.push('\"'+y.call(l,n,r,a,\"text\")+'\"')}}),n.push(o.join(\",\"))}),layui.each(a.dataTotal,function(e,t){o.push(t)}),i.join(\",\")+\"\\r\\n\"+n.join(\"\\r\\n\")+\"\\r\\n\"+o.join(\",\")}()),u.download=(n.title||\"table_\"+(n.index||\"\"))+\".\"+i,document.body.appendChild(u),u.click(),void document.body.removeChild(u))},d.resize=function(e){if(e){var t=u(e);if(!t)return;s.that[e].resize()}else layui.each(s.that,function(){this.resize()})},d.reload=function(e,t,i){var a=u(e);if(a){var l=s.that[e];return l.reload(t,i),s.call(l)}},d.render=function(e){var t=new H(e);return s.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},t(function(){d.init()}),e(h,d)});layui.define(\"jquery\",function(e){\"use strict\";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t=\"carousel\",a=\"layui-this\",l=\">*[carousel-item]>*\",o=\"layui-carousel-left\",r=\"layui-carousel-right\",d=\"layui-carousel-prev\",s=\"layui-carousel-next\",u=\"layui-carousel-arrow\",c=\"layui-carousel-ind\",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:\"600px\",height:\"280px\",full:!1,arrow:\"hover\",indicator:\"inside\",autoplay:!0,interval:3e3,anim:\"\",trigger:\"click\",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:\"fixed\",width:\"100%\",height:\"100%\",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr(\"lay-anim\",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['<button class=\"layui-icon '+u+'\" lay-type=\"sub\">'+(\"updown\"===n.anim?\"&#xe619;\":\"&#xe603;\")+\"</button>\",'<button class=\"layui-icon '+u+'\" lay-type=\"add\">'+(\"updown\"===n.anim?\"&#xe61a;\":\"&#xe602;\")+\"</button>\"].join(\"\"));n.elem.attr(\"lay-arrow\",n.arrow),n.elem.find(\".\"+u)[0]&&n.elem.find(\".\"+u).remove(),n.elem.append(t),t.on(\"click\",function(){var n=i(this),t=n.attr(\"lay-type\");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['<div class=\"'+c+'\"><ul>',function(){var i=[];return layui.each(e.elemItem,function(e){i.push(\"<li\"+(n.index===e?' class=\"layui-this\"':\"\")+\"></li>\")}),i.join(\"\")}(),\"</ul></div>\"].join(\"\"));n.elem.attr(\"lay-indicator\",n.indicator),n.elem.find(\".\"+c)[0]&&n.elem.find(\".\"+c).remove(),n.elem.append(t),\"updown\"===n.anim&&t.css(\"margin-top\",-(t.height()/2)),t.find(\"li\").on(\"hover\"===n.trigger?\"mouseover\":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide(\"add\",a-n.index):a<n.index&&e.slide(\"sub\",n.index-a)})},m.prototype.slide=function(e,i){var n=this,l=n.elemItem,u=n.config,c=u.index,m=u.elem.attr(\"lay-filter\");n.haveSlide||(\"sub\"===e?(n.subIndex(i),l.eq(u.index).addClass(d),setTimeout(function(){l.eq(c).addClass(r),l.eq(u.index).addClass(r)},50)):(n.addIndex(i),l.eq(u.index).addClass(s),setTimeout(function(){l.eq(c).addClass(o),l.eq(u.index).addClass(o)},50)),setTimeout(function(){l.removeClass(a+\" \"+d+\" \"+s+\" \"+o+\" \"+r),l.eq(u.index).addClass(a),n.haveSlide=!1},300),n.elemInd.find(\"li\").eq(u.index).addClass(a).siblings().removeClass(a),n.haveSlide=!0,layui.event.call(this,t,\"change(\"+m+\")\",{index:u.index,prevIndex:c,item:l.eq(u.index)}))},m.prototype.events=function(){var e=this,i=e.config;i.elem.data(\"haveEvents\")||(i.elem.on(\"mouseenter\",function(){clearInterval(e.timer)}).on(\"mouseleave\",function(){e.autoplay()}),i.elem.data(\"haveEvents\",!0))},n.render=function(e){var i=new m(e);return i},e(t,n)});layui.define(\"jquery\",function(e){\"use strict\";var a=layui.jquery,l={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var l=this;return l.config=a.extend({},l.config,e),l},on:function(e,a){return layui.onevent.call(this,n,e,a)}},i=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n=\"rate\",t=\"layui-rate\",o=\"layui-icon-rate\",u=\"layui-icon-rate-solid\",s=\"layui-icon-rate-half\",r=\"layui-icon-rate-solid layui-icon-rate-half\",c=\"layui-icon-rate-solid layui-icon-rate\",f=\"layui-icon-rate layui-icon-rate-half\",v=function(e){var i=this;i.index=++l.index,i.config=a.extend({},i.config,l.config,e),i.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:\"\"},v.prototype.render=function(){var e=this,l=e.config,i=l.theme?'style=\"color: '+l.theme+';\"':\"\";l.elem=a(l.elem),l.value>l.length&&(l.value=l.length),parseInt(l.value)!==l.value&&(l.half||(l.value=Math.ceil(l.value)-l.value<.5?Math.ceil(l.value):Math.floor(l.value)));for(var n='<ul class=\"layui-rate\" '+(l.readonly?\"readonly\":\"\")+\">\",s=1;s<=l.length;s++){var r='<li class=\"layui-inline\"><i class=\"layui-icon '+(s>Math.floor(l.value)?o:u)+'\" '+i+\"></i></li>\";l.half&&parseInt(l.value)!==l.value&&s==Math.ceil(l.value)?n=n+'<li><i class=\"layui-icon layui-icon-rate-half\" '+i+\"></i></li>\":n+=r}n+=\"</ul>\"+(l.text?'<span class=\"layui-inline\">'+l.value+\"\\u661f\":\"\")+\"</span>\";var c=l.elem,f=c.next(\".\"+t);f[0]&&f.remove(),e.elemTemp=a(n),l.span=e.elemTemp.next(\"span\"),l.setText&&l.setText(l.value),c.html(e.elemTemp),c.addClass(\"layui-inline\"),l.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,l=a.config;l.value=e,a.render()},v.prototype.action=function(){var e=this,l=e.config,i=e.elemTemp,n=i.find(\"i\").width();i.children(\"li\").each(function(e){var t=e+1,v=a(this);v.on(\"click\",function(e){if(l.value=t,l.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(l.value=l.value-.5)}l.text&&i.next(\"span\").text(l.value+\"\\u661f\"),l.choose&&l.choose(l.value),l.setText&&l.setText(l.value)}),v.on(\"mousemove\",function(e){if(i.find(\"i\").each(function(){a(this).addClass(o).removeClass(r)}),i.find(\"i:lt(\"+t+\")\").each(function(){a(this).addClass(u).removeClass(f)}),l.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children(\"i\").addClass(s).removeClass(u)}}),v.on(\"mouseleave\",function(){i.find(\"i\").each(function(){a(this).addClass(o).removeClass(r)}),i.find(\"i:lt(\"+Math.floor(l.value)+\")\").each(function(){a(this).addClass(u).removeClass(f)}),l.half&&parseInt(l.value)!==l.value&&i.children(\"li:eq(\"+Math.floor(l.value)+\")\").children(\"i\").addClass(s).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},l.render=function(e){var a=new v(e);return i.call(a)},e(n,l)});layui.define(\"jquery\",function(e){\"use strict\";var l=layui.$,o=function(e){},t='<i class=\"layui-anim layui-anim-rotate layui-anim-loop layui-icon \">&#xe63e;</i>';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var m=l(e.elem);if(m[0]){var f=l(e.scrollElem||document),u=e.mb||50,s=!(\"isAuto\"in e)||e.isAuto,y=e.end||\"\\u6ca1\\u6709\\u66f4\\u591a\\u4e86\",v=e.scrollElem&&e.scrollElem!==document,d=\"<cite>\\u52a0\\u8f7d\\u66f4\\u591a</cite>\",h=l('<div class=\"layui-flow-more\"><a href=\"javascript:;\">'+d+\"</a></div>\");m.find(\".layui-flow-more\")[0]||m.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(y):h.find(\"a\").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find(\"a\").html(t),\"function\"==typeof e.done&&e.done(++c,p)};if(g(),h.find(\"a\").on(\"click\",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+\" img\",scrollElem:e.scrollElem});return s?(f.on(\"scroll\",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),!i&&m.width()&&(r=setTimeout(function(){var i=v?e.height():l(window).height(),n=v?e.prop(\"scrollHeight\"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||\"img\",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&e.attr(\"lay-src\")){var f=e.attr(\"lay-src\");layui.img(f,function(){var l=t.lazyimg.elem.eq(i);e.attr(\"src\",f).removeAttr(\"lay-src\"),l[0]&&m(l),i++},function(){t.lazyimg.elem.eq(i);e.removeAttr(\"lay-src\")})}},m=function(e,o){var m=a?(o||n).height():l(window).height(),f=n.scrollTop(),u=f+m;if(t.lazyimg.elem=l(r),e)c(e,m);else for(var s=0;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,m),i=s,v>u)break}};if(m(),!o){var f;n.on(\"scroll\",function(){var e=l(this);f&&clearTimeout(f),f=setTimeout(function(){m(null,e)},50)}),o=!0}return m},e(\"flow\",new o)});layui.define([\"layer\",\"form\"],function(t){\"use strict\";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n=\"layedit\",o=\"layui-show\",r=\"layui-disabled\",c=function(){var t=this;t.index=0,t.config={tool:[\"strong\",\"italic\",\"underline\",\"del\",\"|\",\"left\",\"center\",\"right\",\"|\",\"link\",\"unlink\",\"face\",\"image\"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r=\"layui-layedit\",c=e(\"string\"==typeof t?\"#\"+t:t),u=\"LAY_layedit_\"+ ++a.index,d=c.next(\".\"+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join(\"\")}(),m=e(['<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?c.removeClass(\"layui-hide\").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass(\"layui-hide\").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e(\"#\"+i[1].attr(\"textarea\"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find(\"iframe\");n.css({height:a.height}).on(\"load\",function(){var o=n.contents(),r=n.prop(\"contentWindow\"),c=o.find(\"head\"),s=e([\"<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\");c.append(s),u.attr(\"contenteditable\",\"true\").css({\"min-height\":a.height}).html(i.value||\"\"),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e(\"#LAY_layedit_\"+t),a=i.prop(\"contentWindow\");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on(\"keydown\",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if(\"pre\"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg(\"\\u8bf7\\u6682\\u65f6\\u7528shift+enter\"),!1}r.execCommand(\"formatBlock\",!1,\"<p>\")}}),e(n).parents(\"form\").on(\"submit\",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on(\"paste\",function(e){r.execCommand(\"formatBlock\",!1,\"<p>\"),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find(\"*[style]\").each(function(){var t=this.style.textAlign;this.removeAttribute(\"style\"),e(this).css({\"text-align\":t||\"\"})}),t.find(\"table\").addClass(\"layui-table\"),t.find(\"script,link\").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute(\"text\"),l.selection){var r=a.text||i.text;if(\"a\"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop(\"outerHTML\")),a.select()}else{var r=a.toString()||i.text;if(\"a\"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l=\"layedit-tool-active\",n=p(m(a)),o=function(e){return t.find(\".layedit-tool-\"+e)};i&&i[i.hasClass(l)?\"removeClass\":\"addClass\"](l),t.find(\">i\").removeClass(l),o(\"unlink\").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;\"b\"!==t&&\"strong\"!==t||o(\"b\").addClass(l),\"i\"!==t&&\"em\"!==t||o(\"i\").addClass(l),\"u\"===t&&o(\"u\").addClass(l),\"strike\"===t&&o(\"d\").addClass(l),\"p\"===t&&(\"center\"===e?o(\"center\").addClass(l):\"right\"===e?o(\"right\").addClass(l):o(\"left\").addClass(l)),\"a\"===t&&(o(\"link\").addClass(l),o(\"unlink\").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr(\"href\"),target:l.attr(\"target\")},function(e){var a=l[0];\"A\"===a.tagName?a.href=e.url:v.call(t,\"a\",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand(\"unlink\")},face:function(e){x.call(this,function(i){v.call(t,\"img\",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use(\"upload\",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find(\"input\")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,\"img\",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||\"\\u4e0a\\u4f20\\u5931\\u8d25\")}})})},code:function(e){k.call(o,function(i){v.call(t,\"pre\",{text:i.code,\"lay-lang\":i.lang},e)})},help:function(){i.open({type:2,title:\"\\u5e2e\\u52a9\",area:[\"600px\",\"380px\"],shadeClose:!0,shade:.1,skin:\"layui-layer-msg\",content:[\"\",\"no\"]})}},s=a.find(\".layui-layedit-tool\"),u=function(){var i=e(this),a=i.attr(\"layedit-event\"),l=i.attr(\"lay-command\");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand(\"formatBlock\",!1,\"<p>\"),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(\">i\").on(\"mousedown\",function(){var t=e(this),i=t.attr(\"layedit-event\");d.test(i)||u.call(this)}).on(\"click\",function(){var t=e(this),i=t.attr(\"layedit-event\");d.test(i)&&u.call(this)}),o.on(\"click\",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:\"LAY_layedit_link\",area:\"350px\",shade:.05,shadeClose:!0,moveType:1,title:\"\\u8d85\\u94fe\\u63a5\",skin:\"layui-layer-msg\",content:['<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;\">\\u6253\\u5f00\\u65b9\\u5f0f</label>','<div class=\"layui-input-block\" style=\"margin-left: 90px\">','<input type=\"radio\" name=\"target\" value=\"_self\" class=\"layui-input\" title=\"\\u5f53\\u524d\\u7a97\\u53e3\"'+(\"_self\"!==t.target&&t.target?\"\":\"checked\")+\">\",'<input type=\"radio\" name=\"target\" value=\"_blank\" class=\"layui-input\" title=\"\\u65b0\\u7a97\\u53e3\" '+(\"_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\"> \\u786e\\u5b9a </button>','<button style=\"margin-left: 20px;\" type=\"button\" class=\"layui-btn layui-btn-primary\"> \\u53d6\\u6d88 </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=[\"[\\u5fae\\u7b11]\",\"[\\u563b\\u563b]\",\"[\\u54c8\\u54c8]\",\"[\\u53ef\\u7231]\",\"[\\u53ef\\u601c]\",\"[\\u6316\\u9f3b]\",\"[\\u5403\\u60ca]\",\"[\\u5bb3\\u7f9e]\",\"[\\u6324\\u773c]\",\"[\\u95ed\\u5634]\",\"[\\u9119\\u89c6]\",\"[\\u7231\\u4f60]\",\"[\\u6cea]\",\"[\\u5077\\u7b11]\",\"[\\u4eb2\\u4eb2]\",\"[\\u751f\\u75c5]\",\"[\\u592a\\u5f00\\u5fc3]\",\"[\\u767d\\u773c]\",\"[\\u53f3\\u54fc\\u54fc]\",\"[\\u5de6\\u54fc\\u54fc]\",\"[\\u5618]\",\"[\\u8870]\",\"[\\u59d4\\u5c48]\",\"[\\u5410]\",\"[\\u54c8\\u6b20]\",\"[\\u62b1\\u62b1]\",\"[\\u6012]\",\"[\\u7591\\u95ee]\",\"[\\u998b\\u5634]\",\"[\\u62dc\\u62dc]\",\"[\\u601d\\u8003]\",\"[\\u6c57]\",\"[\\u56f0]\",\"[\\u7761]\",\"[\\u94b1]\",\"[\\u5931\\u671b]\",\"[\\u9177]\",\"[\\u8272]\",\"[\\u54fc]\",\"[\\u9f13\\u638c]\",\"[\\u6655]\",\"[\\u60b2\\u4f24]\",\"[\\u6293\\u72c2]\",\"[\\u9ed1\\u7ebf]\",\"[\\u9634\\u9669]\",\"[\\u6012\\u9a82]\",\"[\\u4e92\\u7c89]\",\"[\\u5fc3]\",\"[\\u4f24\\u5fc3]\",\"[\\u732a\\u5934]\",\"[\\u718a\\u732b]\",\"[\\u5154\\u5b50]\",\"[ok]\",\"[\\u8036]\",\"[good]\",\"[NO]\",\"[\\u8d5e]\",\"[\\u6765]\",\"[\\u5f31]\",\"[\\u8349\\u6ce5\\u9a6c]\",\"[\\u795e\\u9a6c]\",\"[\\u56e7]\",\"[\\u6d6e\\u4e91]\",\"[\\u7ed9\\u529b]\",\"[\\u56f4\\u89c2]\",\"[\\u5a01\\u6b66]\",\"[\\u5965\\u7279\\u66fc]\",\"[\\u793c\\u7269]\",\"[\\u949f]\",\"[\\u8bdd\\u7b52]\",\"[\\u8721\\u70db]\",\"[\\u86cb\\u7cd5]\"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+\"images/face/\"+t+\".gif\"}),e}();return x.hide=x.hide||function(t){\"face\"!==e(t.target).attr(\"layedit-event\")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('<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:\"\\u63d2\\u5165\\u4ee3\\u7801\",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\">\\u8bf7\\u9009\\u62e9\\u8bed\\u8a00</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\">\\u4ee3\\u7801</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\"> \\u786e\\u5b9a </button>','<button style=\"margin-left: 20px;\" type=\"button\" class=\"layui-btn layui-btn-primary\"> \\u53d6\\u6d88 </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\\u6e90\\u4ee3\\u7801\" lay-command=\"html\" layedit-event=\"html\"\">&#xe64b;</i><span class=\"layedit-tool-mid\"></span>',strong:'<i class=\"layui-icon layedit-tool-b\" title=\"\\u52a0\\u7c97\" lay-command=\"Bold\" layedit-event=\"b\"\">&#xe62b;</i>',italic:'<i class=\"layui-icon layedit-tool-i\" title=\"\\u659c\\u4f53\" lay-command=\"italic\" layedit-event=\"i\"\">&#xe644;</i>',underline:'<i class=\"layui-icon layedit-tool-u\" title=\"\\u4e0b\\u5212\\u7ebf\" lay-command=\"underline\" layedit-event=\"u\"\">&#xe646;</i>',del:'<i class=\"layui-icon layedit-tool-d\" title=\"\\u5220\\u9664\\u7ebf\" lay-command=\"strikeThrough\" layedit-event=\"d\"\">&#xe64f;</i>',\"|\":'<span class=\"layedit-tool-mid\"></span>',left:'<i class=\"layui-icon layedit-tool-left\" title=\"\\u5de6\\u5bf9\\u9f50\" lay-command=\"justifyLeft\" layedit-event=\"left\"\">&#xe649;</i>',center:'<i class=\"layui-icon layedit-tool-center\" title=\"\\u5c45\\u4e2d\\u5bf9\\u9f50\" lay-command=\"justifyCenter\" layedit-event=\"center\"\">&#xe647;</i>',right:'<i class=\"layui-icon layedit-tool-right\" title=\"\\u53f3\\u5bf9\\u9f50\" lay-command=\"justifyRight\" layedit-event=\"right\"\">&#xe648;</i>',link:'<i class=\"layui-icon layedit-tool-link\" title=\"\\u63d2\\u5165\\u94fe\\u63a5\" layedit-event=\"link\"\">&#xe64c;</i>',unlink:'<i class=\"layui-icon layedit-tool-unlink layui-disabled\" title=\"\\u6e05\\u9664\\u94fe\\u63a5\" lay-command=\"unlink\" layedit-event=\"unlink\"\">&#xe64d;</i>',face:'<i class=\"layui-icon layedit-tool-face\" title=\"\\u8868\\u60c5\" layedit-event=\"face\"\">&#xe650;</i>',image:'<i class=\"layui-icon layedit-tool-image\" title=\"\\u56fe\\u7247\" layedit-event=\"image\">&#xe64a;<input type=\"file\" name=\"file\"></i>',code:'<i class=\"layui-icon layedit-tool-code\" title=\"\\u63d2\\u5165\\u4ee3\\u7801\" layedit-event=\"code\">&#xe64e;</i>',help:'<i class=\"layui-icon layedit-tool-help\" title=\"\\u5e2e\\u52a9\" layedit-event=\"help\">&#xe607;</i>'},L=new c;t(n,L)});layui.define(\"jquery\",function(a){\"use strict\";var e=layui.$;a(\"code\",function(a){var l=[];a=a||{},a.elem=e(a.elem||\".layui-code\"),a.lang=\"lang\"in a?a.lang:\"code\",a.elem.each(function(){l.push(this)}),layui.each(l.reverse(),function(l,i){var t=e(i),c=t.html();(t.attr(\"lay-encode\")||a.encode)&&(c=c.replace(/&(?!#?[a-zA-Z0-9]+;)/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/'/g,\"&#39;\").replace(/\"/g,\"&quot;\")),t.html('<ol class=\"layui-code-ol\"><li>'+c.replace(/[\\r\\t\\n]+/g,\"</li><li>\")+\"</li></ol>\"),t.find(\">.layui-code-h3\")[0]||t.prepend('<h3 class=\"layui-code-h3\">'+(t.attr(\"lay-title\")||a.title||\"&lt;/&gt;\")+'<a href=\"javascript:;\">'+(t.attr(\"lay-lang\")||a.lang||\"\")+\"</a></h3>\");var n=t.find(\">.layui-code-ol\");t.addClass(\"layui-box layui-code-view\"),(t.attr(\"lay-skin\")||a.skin)&&t.addClass(\"layui-code-\"+(t.attr(\"lay-skin\")||a.skin)),(n.find(\"li\").length/100|0)>0&&n.css(\"margin-left\",(n.find(\"li\").length/100|0)+\"px\"),(t.attr(\"lay-height\")||a.height)&&n.css(\"max-height\",t.attr(\"lay-height\")||a.height)})})}).addcss(\"modules/code.css?v=2\",\"skincodecss\");"
  },
  {
    "path": "static/common/md5.js",
    "content": "var hexcase = 0;  \r\nvar b64pad  = \"\"; \r\nvar chrsz   = 8;  \r\nfunction hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}\r\nfunction b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}\r\nfunction hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }\r\nfunction b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }\r\nfunction calcMD5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}\r\n\r\nfunction md5_vm_test()\r\n{\r\n  return hex_md5(\"abc\") == \"900150983cd24fb0d6963f7d28e17f72\";\r\n}\r\n\r\nfunction core_md5(x, len)\r\n{\r\n\r\n  x[len >> 5] |= 0x80 << ((len) % 32);\r\n  x[(((len + 64) >>> 9) << 4) + 14] = len;\r\n  var a =  1732584193;\r\n  var b = -271733879;\r\n  var c = -1732584194;\r\n  var d =  271733878;\r\n  for(var i = 0; i < x.length; i += 16)\r\n  {\r\n    var olda = a;\r\n    var oldb = b;\r\n    var oldc = c;\r\n    var oldd = d;\r\n\r\n    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);\r\n    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);\r\n    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);\r\n    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);\r\n    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);\r\n    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);\r\n    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);\r\n    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);\r\n    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);\r\n    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);\r\n    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);\r\n    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);\r\n    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);\r\n    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);\r\n    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);\r\n    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);\r\n    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);\r\n    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);\r\n    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);\r\n    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);\r\n    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);\r\n    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);\r\n    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);\r\n    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);\r\n    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);\r\n    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);\r\n    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);\r\n    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);\r\n    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);\r\n    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);\r\n    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);\r\n    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);\r\n    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);\r\n    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);\r\n    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);\r\n    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);\r\n    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);\r\n    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);\r\n    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);\r\n    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);\r\n    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);\r\n    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);\r\n    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);\r\n    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);\r\n    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);\r\n    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);\r\n    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);\r\n    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);\r\n    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);\r\n    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);\r\n    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);\r\n    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);\r\n    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);\r\n    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);\r\n    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);\r\n    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);\r\n    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);\r\n    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);\r\n    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);\r\n    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);\r\n    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);\r\n    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);\r\n    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);\r\n    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);\r\n\r\n    a = safe_add(a, olda);\r\n    b = safe_add(b, oldb);\r\n    c = safe_add(c, oldc);\r\n    d = safe_add(d, oldd);\r\n  }\r\n  return Array(a, b, c, d);\r\n  \r\n}\r\n\r\nfunction md5_cmn(q, a, b, x, s, t)\r\n{\r\n  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);\r\n}\r\nfunction md5_ff(a, b, c, d, x, s, t)\r\n{\r\n  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);\r\n}\r\nfunction md5_gg(a, b, c, d, x, s, t)\r\n{\r\n  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);\r\n}\r\nfunction md5_hh(a, b, c, d, x, s, t)\r\n{\r\n  return md5_cmn(b ^ c ^ d, a, b, x, s, t);\r\n}\r\nfunction md5_ii(a, b, c, d, x, s, t)\r\n{\r\n  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);\r\n}\r\n\r\nfunction core_hmac_md5(key, data)\r\n{\r\n  var bkey = str2binl(key);\r\n  if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);\r\n\r\n  var ipad = Array(16), opad = Array(16);\r\n  for(var i = 0; i < 16; i++) \r\n  {\r\n    ipad[i] = bkey[i] ^ 0x36363636;\r\n    opad[i] = bkey[i] ^ 0x5C5C5C5C;\r\n  }\r\n\r\n  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);\r\n  return core_md5(opad.concat(hash), 512 + 128);\r\n}\r\n\r\nfunction safe_add(x, y)\r\n{\r\n  var lsw = (x & 0xFFFF) + (y & 0xFFFF);\r\n  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\r\n  return (msw << 16) | (lsw & 0xFFFF);\r\n}\r\n\r\nfunction bit_rol(num, cnt)\r\n{\r\n  return (num << cnt) | (num >>> (32 - cnt));\r\n}\r\n\r\nfunction str2binl(str)\r\n{\r\n  var bin = Array();\r\n  var mask = (1 << chrsz) - 1;\r\n  for(var i = 0; i < str.length * chrsz; i += chrsz)\r\n    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);\r\n  return bin;\r\n}\r\n\r\nfunction binl2hex(binarray)\r\n{\r\n  var hex_tab = hexcase ? \"0123456789ABCDEF\" : \"0123456789abcdef\";\r\n  var str = \"\";\r\n  for(var i = 0; i < binarray.length * 4; i++)\r\n  {\r\n    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +\r\n           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);\r\n  }\r\n  return str;\r\n}\r\n\r\nfunction binl2b64(binarray)\r\n{\r\n  var tab = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\r\n  var str = \"\";\r\n  for(var i = 0; i < binarray.length * 4; i += 3)\r\n  {\r\n    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)\r\n                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )\r\n                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);\r\n    for(var j = 0; j < 4; j++)\r\n    {\r\n      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;\r\n      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);\r\n    }\r\n  }\r\n  return str;\r\n}"
  },
  {
    "path": "static/common/uediter.php",
    "content": "<?php\n\nif(isset($model)){\n    $rd = getRandChar(6);\n    switch($model){\n        case 'article_zdy':\n            return '<div class=\"form-control\">\n            <label for=\"\">文章内容：</label>\n            <div class=\"layui-input-block\" style=\"width:100%;\">\n\t\t\t <div style=\"border: 1px solid #ccc;\">\n\t\t\t        <div id=\"editor-toolbar-'.$rd.'\" style=\"border-bottom: 1px solid #ccc;\"></div>\n                    <div id=\"editor-text-area-'.$rd.'\" style=\"height: 350px\"></div>\n                  </div>\n                  <textarea id=\"editor-content-textarea-'.$rd.'\" style=\"display:none\" name=\"body\">'.$data['body'].'</textarea>\n\t\t\t\t\n\t\t\t</div>\n            <label>1500字以内</label>\n        </div>\n        <script type=\"text/javascript\">\n\t\t\t$(document).ready(function (){\n    var html = document.getElementById(\"editor-content-textarea-'.$rd.'\").value\n     var E_'.$rd.' = window.wangEditor\n    // 切换语言\n    E_'.$rd.'.i18nChangeLanguage(\"zh-CN\")\n    window.editor = E_'.$rd.'.createEditor({\n      selector: \"#editor-text-area-'.$rd.'\",\n      html: html,\n      mode: \"simple\",\n      config: {\n        placeholder: \"请输入内容...\",\n        MENU_CONF: {\n            uploadImage: {\n                fieldName: \"file\",\n                server: \"'.U('common/uploads').'\",\n                 // 单个文件的最大体积限制，默认为 2M\n                maxFileSize: 100 * 1024 * 1024, // 1M\n            \n                // 最多可上传几个文件，默认为 100\n                maxNumberOfFiles: 100,\n           \n                allowedFileTypes: [\"image/*\"],\n                // 超时时间，默认为 10 秒\n                timeout: 10 * 60 * 1000, // 5 秒\n                 // 单个文件上传成功之后\n                //onSuccess(file: File, res: any) {  // TS 语法\n                onSuccess(file, res) {          // JS 语法\n                    console.log(`${file.name} 上传成功`, res)\n                },\n            \n                // 单个文件上传失败\n                //onFailed(file: File, res: any) {   // TS 语法\n                onFailed(file, res) {           // JS 语法\n                    console.log(`${file.name} 上传失败`, res)\n                },\n            \n                // 上传错误，或者触发 timeout 超时\n                //onError(file: File, err: any, res: any) {  // TS 语法\n                onError(file, err, res) {               // JS 语法\n                    console.log(`${file.name} 上传出错`, err, res)\n                },\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\n                customInsert(res, insertFn) {                  // JS 语法\n                    // res 即服务端的返回结果\n                    console.log(res,insertFn)\n                    // 从 res 中找到 url alt href ，然后插入图片\n                    insertFn(res.url)\n                },\n          },\n            uploadVideo: {\n                fieldName: \"file\",\n                server: \"'.U('common/uploads').'\",\n                 // 单个文件的最大体积限制，默认为 2M\n                maxFileSize: 10000 * 1024 * 1024 * 1024, // 1M\n            \n                // 最多可上传几个文件，默认为 100\n                maxNumberOfFiles: 100,\n     \n                allowedFileTypes: [\"video/*\"],\n                // 超时时间，默认为 10 秒\n                timeout: 30 * 60 * 1000, // 5 秒\n                 // 单个文件上传成功之后\n                //onSuccess(file: File, res: any) {  // TS 语法\n                onSuccess(file, res) {          // JS 语法\n                    console.log(`${file.name} 上传成功`, res)\n                    if(res.code!=0){\n                        alert(res.error)\n                    }\n                },\n            \n                // 单个文件上传失败\n                //onFailed(file: File, res: any) {   // TS 语法\n                onFailed(file, res) {           // JS 语法\n                    console.log(`${file.name} 上传失败`, res)\n                },\n            \n                // 上传错误，或者触发 timeout 超时\n                //onError(file: File, err: any, res: any) {  // TS 语法\n                onError(file, err, res) {               // JS 语法\n                    console.log(`${file.name} 上传出错`, err, res)\n                },\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\n                customInsert(res, insertFn) {                  // JS 语法\n                    // res 即服务端的返回结果\n                    console.log(res,insertFn)\n                    // 从 res 中找到 url alt href ，然后插入图片\n                    insertFn(res.url)\n                },\n          },\n        },\n        onChange(editor) {\n          var html = editor.getHtml()\n          var num = 0,\n          reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\n          while (num < html.length && html != \"\")\n          {\n            num++;\n            let k = html.match(reg);\n            if (k) {\n              html = html.replace(k[0], \"\");\n            }\n          } \n          document.getElementById(\"editor-content-textarea-'.$rd.'\").value = html\n        }\n      }\n    })\n     class MyMenu'.$rd.' {\n      constructor() {\n        this.title = \"源码\"\n        this.tag = \"button\"\n        this.sourceActive = false\n      }\n      getValue(editor) {\n        if (this.sourceActive) {\n            return editor.getText()\n        } else {\n            return editor.getHtml()\n        }\n    \n      }\n      isActive(editor) {\n         return this.sourceActive\n      }\n      isDisabled(editor) {\n        return false // or true\n      }\n      exec(editor, value) {\n            this.sourceActive = !this.sourceActive\n            editor.clear()\n            E_'.$rd.'.SlateTransforms.setNodes(editor, { type: \"paragraph\" }, { mode: \"highest\"})\n            var num = 0,\n            reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\n            while (num < value.length && value != \"\")\n            {\n              num++;\n              let k = value.match(reg);\n              if (k) {\n                value = value.replace(k[0], \"\");\n              }\n            } \n            if (this.isActive()) {\n                editor.insertText(value)\n            } else {\n                editor.dangerouslyInsertHtml(value)\n            }\n        \n\n\n      }\n    }\n    const myMenuConf'.$rd.' = {\n      key: \"'.$rd.'html\",\n      factory() {\n        return new MyMenu'.$rd.'()\n      }\n    }\n    E_'.$rd.'.Boot.registerMenu(myMenuConf'.$rd.')\n    window.toolbar = E_'.$rd.'.createToolbar({\n      editor,\n      selector: \"#editor-toolbar-'.$rd.'\",\n      config: {\n      \tinsertKeys: {\n          index: 0,\n          keys: [\"'.$rd.'html\"],\n        }\n      }\n    })\n\n    \n\t})\n\t\t</script>';\n\n            break;\n        case 'product_zdy':\n            return '<div class=\"form-control\">\n            <label for=\"\">商品详情：</label>\n            <div class=\"layui-input-block\" style=\"width:100%;\">\n\t\t\t      <div style=\"border: 1px solid #ccc;\">\n\t\t\t        <div id=\"editor-toolbar-'.$rd.'\" style=\"border-bottom: 1px solid #ccc;\"></div>\n                    <div id=\"editor-text-area-'.$rd.'\" style=\"height: 350px\"></div>\n                  </div>\n                  <textarea id=\"editor-content-textarea-'.$rd.'\" style=\"display:none\" name=\"body\">'.$data['body'].'</textarea>\n\t\t\t</div>\n            <label>1500字以内</label>\n        </div>\n        <script type=\"text/javascript\">\n\t\t\t$(document).ready(function (){\n    var html = document.getElementById(\"editor-content-textarea-'.$rd.'\").value\n     var E_'.$rd.' = window.wangEditor\n    // 切换语言\n    E_'.$rd.'.i18nChangeLanguage(\"zh-CN\")\n    window.editor = E_'.$rd.'.createEditor({\n      selector: \"#editor-text-area-'.$rd.'\",\n      html: html,\n      mode: \"simple\",\n      config: {\n        placeholder: \"请输入内容...\",\n        MENU_CONF: {\n            uploadImage: {\n                fieldName: \"file\",\n                server: \"'.U('common/uploads').'\",\n                 // 单个文件的最大体积限制，默认为 2M\n                maxFileSize: 100 * 1024 * 1024, // 1M\n            \n                // 最多可上传几个文件，默认为 100\n                maxNumberOfFiles: 100,\n           \n                allowedFileTypes: [\"image/*\"],\n                // 超时时间，默认为 10 秒\n                timeout: 10 * 60 * 1000, // 5 秒\n                 // 单个文件上传成功之后\n                //onSuccess(file: File, res: any) {  // TS 语法\n                onSuccess(file, res) {          // JS 语法\n                    console.log(`${file.name} 上传成功`, res)\n                    if(res.code!=0){\n                        alert(res.error)\n                    }\n                },\n            \n                // 单个文件上传失败\n                //onFailed(file: File, res: any) {   // TS 语法\n                onFailed(file, res) {           // JS 语法\n                    console.log(`${file.name} 上传失败`, res)\n                },\n            \n                // 上传错误，或者触发 timeout 超时\n                //onError(file: File, err: any, res: any) {  // TS 语法\n                onError(file, err, res) {               // JS 语法\n                    console.log(`${file.name} 上传出错`, err, res)\n                },\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\n                customInsert(res, insertFn) {                  // JS 语法\n                    // res 即服务端的返回结果\n                    console.log(res,insertFn)\n                    // 从 res 中找到 url alt href ，然后插入图片\n                    insertFn(res.url)\n                },\n          },\n            uploadVideo: {\n                fieldName: \"file\",\n                server: \"'.U('common/uploads').'\",\n                 // 单个文件的最大体积限制，默认为 2M\n                maxFileSize: 10000 * 1024 * 1024 * 1024, // 1M\n            \n                // 最多可上传几个文件，默认为 100\n                maxNumberOfFiles: 100,\n     \n                allowedFileTypes: [\"video/*\"],\n                // 超时时间，默认为 10 秒\n                timeout: 30 * 60 * 1000, // 5 秒\n                 // 单个文件上传成功之后\n                //onSuccess(file: File, res: any) {  // TS 语法\n                onSuccess(file, res) {          // JS 语法\n                    console.log(`${file.name} 上传成功`, res)\n                    if(res.code!=0){\n                        alert(res.error)\n                    }\n                },\n            \n                // 单个文件上传失败\n                //onFailed(file: File, res: any) {   // TS 语法\n                onFailed(file, res) {           // JS 语法\n                    console.log(`${file.name} 上传失败`, res)\n                },\n            \n                // 上传错误，或者触发 timeout 超时\n                //onError(file: File, err: any, res: any) {  // TS 语法\n                onError(file, err, res) {               // JS 语法\n                    console.log(`${file.name} 上传出错`, err, res)\n                },\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\n                customInsert(res, insertFn) {                  // JS 语法\n                    // res 即服务端的返回结果\n                    console.log(res,insertFn)\n                    // 从 res 中找到 url alt href ，然后插入图片\n                    insertFn(res.url)\n                },\n          },\n        },\n        onChange(editor) {\n          var html = editor.getHtml()\n          var num = 0,\n          reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\n          while (num < html.length && html != \"\")\n          {\n            num++;\n            let k = html.match(reg);\n            if (k) {\n              html = html.replace(k[0], \"\");\n            }\n          } \n          document.getElementById(\"editor-content-textarea-'.$rd.'\").value = html\n        }\n      }\n    })\n     class MyMenu'.$rd.' {\n      constructor() {\n        this.title = \"源码\"\n        this.tag = \"button\"\n        this.sourceActive = false\n      }\n      getValue(editor) {\n        if (this.sourceActive) {\n            return editor.getText()\n        } else {\n            return editor.getHtml()\n        }\n    \n      }\n      isActive(editor) {\n         return this.sourceActive\n      }\n      isDisabled(editor) {\n        return false // or true\n      }\n      exec(editor, value) {\n            this.sourceActive = !this.sourceActive\n            editor.clear()\n            E_'.$rd.'.SlateTransforms.setNodes(editor, { type: \"paragraph\" }, { mode: \"highest\"})\n            var num = 0,\n            reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\n            while (num < value.length && value != \"\")\n            {\n              num++;\n              let k = value.match(reg);\n              if (k) {\n                value = value.replace(k[0], \"\");\n              }\n            } \n            if (this.isActive()) {\n                editor.insertText(value)\n            } else {\n                editor.dangerouslyInsertHtml(value)\n            }\n        \n\n\n      }\n    }\n    const myMenuConf'.$rd.' = {\n      key: \"'.$rd.'html\",\n      factory() {\n        return new MyMenu'.$rd.'()\n      }\n    }\n    E_'.$rd.'.Boot.registerMenu(myMenuConf'.$rd.')\n    window.toolbar = E_'.$rd.'.createToolbar({\n      editor,\n      selector: \"#editor-toolbar-'.$rd.'\",\n      config: {\n      \tinsertKeys: {\n          index: 0,\n          keys: [\"'.$rd.'html\"],\n        }\n      }\n    })\n\n    \n\t})\n\t\t</script>';\n            break;\n        default:\n            return '<div class=\"form-control\">\n\t\t            <label for=\"'.$v['field'].'\">'.$v['fieldname'].'：</label>\n\t\t            <div class=\"layui-input-block\" style=\"width:100%;\">\n\t\t            \n\t\t                <div style=\"border: 1px solid #ccc;\">\n                            <div id=\"editor-toolbar-'.$v['field'].$rd.'\" style=\"border-bottom: 1px solid #ccc;\"></div>\n                            <div id=\"editor-text-area-'.$v['field'].$rd.'\" style=\"height: 350px\"></div>\n                        </div>\n                        <textarea id=\"editor-content-textarea-'.$v['field'].$rd.'\" style=\"display:none\" name=\"'.$v['field'].'\">'.$data[$v['field']].'</textarea>\n\t\t            \n\t\t\t\t\t</div>\n\t\t            <label  class=\"fields_tips\">'.$must.$v['tips'].'</label>\n\t\t        </div><script>\n\t\t\t\t\t\t    \n\t$(document).ready(function (){\n    var html = document.getElementById(\"editor-content-textarea-'.$v['field'].$rd.'\").value\n     var E_'.$v['field'].$rd.' = window.wangEditor\n    // 切换语言\n    E_'.$v['field'].$rd.'.i18nChangeLanguage(\"zh-CN\")\n    window.editor = E_'.$v['field'].$rd.'.createEditor({\n      selector: \"#editor-text-area-'.$v['field'].$rd.'\",\n      html: html,\n      config: {\n        placeholder: \"请输入内容...\",\n        MENU_CONF: {\n            uploadImage: {\n                fieldName: \"file\",\n                server: \"'.U('common/uploads').'\",\n                 // 单个文件的最大体积限制，默认为 2M\n                maxFileSize: 1 * 1024 * 1024, // 1M\n            \n                // 最多可上传几个文件，默认为 100\n                maxNumberOfFiles: 10,\n           \n                allowedFileTypes: [\"image/*\"],\n                // 超时时间，默认为 10 秒\n                timeout: 30 * 1000, // 5 秒\n                 // 单个文件上传成功之后\n                //onSuccess(file: File, res: any) {  // TS 语法\n                onSuccess(file, res) {          // JS 语法\n                    console.log(`${file.name} 上传成功`, res)\n                    if(res.code!=0){\n                        alert(res.error)\n                    }\n                },\n            \n                // 单个文件上传失败\n                //onFailed(file: File, res: any) {   // TS 语法\n                onFailed(file, res) {           // JS 语法\n                    console.log(`${file.name} 上传失败`, res)\n                },\n            \n                // 上传错误，或者触发 timeout 超时\n                //onError(file: File, err: any, res: any) {  // TS 语法\n                onError(file, err, res) {               // JS 语法\n                    console.log(`${file.name} 上传出错`, err, res)\n                },\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\n                customInsert(res, insertFn) {                  // JS 语法\n                    // res 即服务端的返回结果\n                    console.log(res,insertFn)\n                    // 从 res 中找到 url alt href ，然后插入图片\n                    insertFn(res.url)\n                },\n          },\n            uploadVideo: {\n                fieldName: \"file\",\n                server: \"'.U('common/uploads').'\",\n                 // 单个文件的最大体积限制，默认为 2M\n                maxFileSize: 10 * 1024 * 1024 * 1024, // 1M\n            \n                // 最多可上传几个文件，默认为 100\n                maxNumberOfFiles: 100,\n     \n                allowedFileTypes: [\"video/*\"],\n                // 超时时间，默认为 10 秒\n                timeout: 60 * 1000, // 5 秒\n                 // 单个文件上传成功之后\n                //onSuccess(file: File, res: any) {  // TS 语法\n                onSuccess(file, res) {          // JS 语法\n                    console.log(`${file.name} 上传成功`, res)\n                    if(res.code!=0){\n                        alert(res.error)\n                    }\n                },\n            \n                // 单个文件上传失败\n                //onFailed(file: File, res: any) {   // TS 语法\n                onFailed(file, res) {           // JS 语法\n                    console.log(`${file.name} 上传失败`, res)\n                },\n            \n                // 上传错误，或者触发 timeout 超时\n                //onError(file: File, err: any, res: any) {  // TS 语法\n                onError(file, err, res) {               // JS 语法\n                    console.log(`${file.name} 上传出错`, err, res)\n                },\n                //customInsert(res: any, insertFn: InsertFnType) {  // TS 语法\n                customInsert(res, insertFn) {                  // JS 语法\n                    // res 即服务端的返回结果\n                    console.log(res,insertFn)\n                    // 从 res 中找到 url alt href ，然后插入图片\n                    insertFn(res.url)\n                },\n          },\n        },\n        onChange(editor) {\n          var html = editor.getHtml()\n          var num = 0,\n          reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\n          while (num < html.length && html != \"\")\n          {\n            num++;\n            let k = html.match(reg);\n            if (k) {\n              html = html.replace(k[0], \"\");\n            }\n          } \n          document.getElementById(\"editor-content-textarea-'.$v['field'].$rd.'\").value = html\n        }\n      }\n    })\n    class MyMenu'.$v['field'].$rd.' {\n      constructor() {\n        this.title = \"源码\"\n        this.tag = \"button\"\n        this.sourceActive = false\n      }\n      getValue(editor) {\n        if (this.sourceActive) {\n            return editor.getText()\n        } else {\n            return editor.getHtml()\n        }\n    \n      }\n      isActive(editor) {\n         return this.sourceActive\n      }\n      isDisabled(editor) {\n        return false // or true\n      }\n      exec(editor, value) {\n            this.sourceActive = !this.sourceActive\n            editor.clear()\n            E_'.$v['field'].$rd.'.SlateTransforms.setNodes(editor, { type: \"paragraph\" }, { mode: \"highest\"})\n            var num = 0,\n            reg = /<p>(&nbsp;|&nbsp;\\s+)+<\\/p>|<p>(<br>)+<\\/p>/g;\n            while (num < value.length && value != \"\")\n            {\n              num++;\n              let k = value.match(reg);\n              if (k) {\n                value = value.replace(k[0], \"\");\n              }\n            } \n            if (this.isActive()) {\n                editor.insertText(value)\n            } else {\n                editor.dangerouslyInsertHtml(value)\n            }\n        \n\n\n      }\n    }\n    const myMenuConf'.$v['field'].$rd.' = {\n      key: \"'.$v['field'].$rd.'html\",\n      factory() {\n        return new MyMenu'.$v['field'].$rd.'()\n      }\n    }\n    E_'.$v['field'].$rd.'.Boot.registerMenu(myMenuConf'.$v['field'].$rd.')\n    window.toolbar = E_'.$v['field'].$rd.'.createToolbar({\n      editor,\n      selector: \"#editor-toolbar-'.$v['field'].$rd.'\",\n      config: {\n      \tinsertKeys: {\n          index: 0,\n          keys: [\"'.$v['field'].$rd.'html\"],\n        }\n      }\n    })\n    \n\n    \n\t})\n\t\t\t\t\t\t</script>';\n            break;\n\n    }\n}\n\n\n"
  },
  {
    "path": "static/common/user/css/font_1546140_sw4m5ivcrg9.css",
    "content": "@font-face {font-family: \"iconfont\";\n  src: url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.eot?t=1575558014483'); /* IE9 */\n  src: url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.eot?t=1575558014483#iefix') format('embedded-opentype'), /* IE6-IE8 */\n  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAG88AAsAAAAAuvwAAG7oAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCQagqCzQyCgGABNgIkA4NEC4FkAAQgBYRtB4oVGyGTF1SvOcbdDsBx0afHHVE1K41E2AtOisn+//+aIMcYjWkHaJX/gqzWovet8gSWWk9cEe3d8R2q0F/Igf7m39NaR4xhMOCId0jG1pzsUHFhYYQnZmimpF1cprBN3DnWp7/sUIbAjI2tPXYqvkvpwIA2jkowBFQob7oCmQgd8n23O/qVSZWD6z0q979gl+kR7FJe5JCkaJrwD4zD3kCwkyVDpW35xH8O+Q51vq+zgE6y0I4TfnGRePy8dpj+unVbCgLomc4n6F/mvk6/ckdIuOvDxLBAvkym//b8/dpUjZFtJUaimcYDzzX/RfJoggPe8xNaBQCmSDbw3gUAz///ffpz98kwUwBT7PrYlmfjggTwmxW02gDFO/H8hufn1vv/L5PIFdELKlbA6I1IiRqhwgBhiIqkDBOQPkXCAgurETPPs9A+o7AuLNr8fOD/UW0WfOE7EplhIpDAoBEkIepkk+rusGdZUftO7qlq1V3r8r3z+d6pNSPFBzOSvSBIckCB5S/CvwPMqyBUCJXJB5p3fzO/ZHPaGgItB2g5tMCSfQT//6uufx149Qhu3WcfW0rIFNlyYsqdSyDQb2du6SqUWwKhTGvrDYN/pF/p9xSXEHgzdqfVIWV6seVXQJ17hJLjDBZV1QjggTjcc+t8iXT3REtljInRHuc5FBZx598c//yrmq7g8Qp1TpFSZU+nd8+tD0tK3zxsWcb/PyAJHyApflLSCYB0R1CyI5DKhYBc+CGdS+XJ6X2qfcMHdQ5AuQBUCimlAKliKpUqe3PGTG5Thi0ZlkmXqdRly7Csgf9Zo+IV62HnBB+oVm0zyRiMuTyoH1OflMx8QhzM9238GGMYcxWl1e3Gdi1QKSk3oKD2/xkGCJaWohm0r9XNKDBx2QBnIxobQFHqYIqoAVUXkrdxcjB0CRXu1SVwwv/e4EcrmEEM8Yj4q/pOyTD5J7+q1bXod9JRHeZGwNY7ghFCNDBGjJrSqWGDUV6K5hUj+zXj4CfI5c/Y8lmjXpMWbXoMGDFmwrxVm7btO3bq3pOXy3Ql97Km7fa76svV5Gur3+ov0DXQHRlOy9Kz4o2By14lgW1kn+r1n8RDGEdWRiEixbDTWIpjSzouiYkDLEWukqVwkilHPhNrN9R0dMk80WeTxYuFcwoFxctTZcCgydjE1MzcQltIp5UoZz12to5ObszGPbx9/Qy9/Om4K5AyzG/AxZVbKYWvJO5ZUzIyVykuVTHBWQFs3JVVIm2GQ5og/iZhkIJTawRMKrqchwCDMAgCRwgGK0QIBEMoCIHQEAlhIAbCgh0iHBgiwoMvRIA4iAi2iEgl0BUZkAhRIAmiggkiGkRBdLBExAAHiAmuEAuSITakQEbgBBlDJmQCOZAp5ENmZcSqOcAakQUUQZZQBllBDWQNtRAHTBFxoQ7iQT3EBx9IAFmQDXhBtmCByA4yIHsohBzKoOoIiIecIA9yhirIBRogV3CD3KAJEkIzJIIWSAytkATaIHdohzygA/KEasgLIiBv6IR8oAvyhWjID5whf+iBAqAPCoReKAgGISkMQTIYg+TgCSlgHFLCBBQM01AIzEKhMAepoBEKgykoPHP5q0YAXKBIcIeioABSQwIUB8NQAoRCSTAAzYIRKB1GoWwIhPKgFMoHc0QF0A8VgTEiHVRAFWVcVOcB7KFKMEJUBd5QTZk+V5cAYqGlkAqthGKoDQwQ7YZ0aB8EQFfABtFfUI4fnpCLH1FQgh9LIBs/lsIMfnSBH348hTT8dIEg/CKO8Hd/I4sHJgEs4MUXwGiBlA0KR8QJo97DoTHANGkyaBiyQumMYhxKHBPAJAuBWeQBYG5IHCOKUiAohUaIoFTmXBEaIosO53dAz8DgJMXQwYhSMCWzUiOuocxEC8wFiUy3T0QNZi4gICSiROvYB+3IAxMyM42Lan+PkdoVuiB37IOygXnpEGsc4FvbdxCYVw6Gbn+Bg+v0E++l1V6DsLPMIbDoMn7wq/8+UGQIWFU6H++dhLnVy6lZcl8mfTAmGUAJY/De+FAM+k6BBSIbSnCnJwIXGLG9kPI91CbtjLqDuUrJqLhHfFs9BK8yhjewOM7VAVfk5jKFBFRYc9Jj32oIoSRsceFSloYxlAW3wRDjYbZRWklmdTCNxeI3uN2kGG2CyINOtiIw52ZHtl11rb+MRpjWnO9rTeNQuvoWeg+616dP79XSQg8LYcFRBRHn6KGitDEewZUpFvgjB/GY80atK6dYVMt/vtxA7SZM9KGN0zJai7i20cNq/8Rv2mI1ggpnmyrezCrCWKbUkSPDdIrSSHCgQTKTqzkCn85yY40AExAYeztuSkmUC6vuTCCsDgyttIUAKIWK3EgBvBiwb8/RFaLBjiARHBQx5eiddifdTGxlweWzM1Wb3P6Oy2EWlwY3SbMK5AzWimUSL+5T1sEBMnAhzhC3Os1PCmK3X+duHF8Krb1vd+Un4Rx6b73Q6ErnB3MpXET37Mz5vgWYVAcTSBnxGgy4KKoY+z+2nFPOaJyXsZmivNEpa/iiv6EUHtPNXGa7W9hkmf2ID6+vt/vNUEOWrZIateWZXPJo60V0flnHQ55ET7xaT6EKydws1EkUxq2uhx3TdPN2fW0w53F1PNWF2bD07Wq5GSvAcl+Ha9di9HG73b1r3KzdcTOMXOx3EXE2Tjwr1bFKULDCxgXrQPuW87t2MahfKdLapZzXdP7QvuPsq57P+1VDmHs5o7Za8Gt5r7qY39+664atWZjLBbN51Q477u9bt92DjSUraMxCP7BJ4U2Pg5er5nK+ZPsUBk7TccyY3gaL7WLRgb4e89CqW1ZAMOJqHtoN2w4UeUMy3+24bmjEjL4GC61CgZivwTozX8vnuz2fKd4mkUgW4+KFr6zy19nlb53KN/sMHWkGMDWsm9la19Byy853GqvWvxbXTLM5iPvUiBE6ouBM2O+KXujPEyUAPGmGrMNVHwNfdPgxXcdANeGwqJ0x7uMc+D0/PRzYVnX7l1aT5YmIQXIDMg7TbtQzMwy13shMmDJaLSAdHZpC2mnq3MowgviiJInoB+qrr94yVFZfHAzumgfvDBoxKfRR1dFSFkm90eCx3Xjj6oO7d012+36P9a7na4YQNahWBUwQn40sdRhTnkodoWZBCH3VbzdzD4nqYrtPxBCq3eyySb92//33q7dtm5oikCC4gGvA3DqjthytFDZq+ZV0zV5vNtfi1WMPxBpeisUN4fy4JiWvm3+2XqQSvuOzaJreDKa0HOoLlTuFmQaVt2+p3aSnbpNKCHbdcCtTEUlz1ZiPb8lOkeoYV7OAQ3o08ILSSgGUQMJkXCskIeNEWURuRYIxuFEV5tnJIkVUDpXVvIEHUojdjkVggaLaL9SJAaGQzHQNWsuRSHIzzkAuGRGmQqPYRqQpUOkA84woGRKWMFNQECFECX+MSEqB3C2JGggrOGGcvLO94cP7BwhsOIRXWe+noaBdR7AZZNMLyxP/Ul7Z8d3ltal/raw+gXTs36QInH3ZihF1kuMpBLF2CA/Kz2CY2ZoQJHCkyEOd9iLH21ifQ11ng18Pk2CgXsQpRPvxwDRZL/9vOUfcMLRQQQasjoe3pA3MfC8d2GYBQnkL07yNNRVnVJNe+SY3aKCIrU9g4x1/9dv84td29FYYXkFUEZ0opFzAukhQtPRNCBJ1/t5cOXhmLd1/auXSLKXCAKUvBKyuzZkH55LSSXNxZdKozRZMM9L5ms1BhcyoOzRNv/J1RF8XC9O3znAkgMh4c2a1Mi0j2CfaOKPasEtUDZDriZeCheIe1YSSI31AxbysG7g1ByFAE23ipr1N14MDlIM6jW5u8b0dmyhAM8mMqHe37CwAeD9iXCL9E/0W2TJx3QBifBN915LBHaq/nm1bKEPPB1+AtdtY3s7lnu+LlagKaRZNaNKHkiTjWSKpanmw4/vpdG/CoLTUnYzytfsmHjbCdfdBWmjl/xYPXjt81WxVJzC8nfnbJNjoHh0adXwzC1AvRs3CtVFTCVjSeF6qpmC18lOb5WSzWmP3R+AwwrK2nxx9a2QLXyW8kU25GU+sbVXtTCqs7HaqrocQQQRSwxDvhwIEMQQBbaACvRZchU5+tcSHgnFVhBUfpqPpzZINpoxwdrrcnxlsKw5BsE9FXzX3i0H5q+zW0ZEhPWdKAvKaH1p+vGu8r8eBwM42B3/SeXKG6fIydgE8ml2zdwdjBZBj075oS97IbYbNYYPlGaq00/Dk9yUTOtZ2DfIG59tsm3RbP0ac2eEiQAfLTnqgZ3ZX+Ik/wcbITRiT+W/MFrP7jRxsEQ5C8gDOJHN7byhVcN1gG7enyPct3IobaebA7bHtLNJRCytXK9sjuTCMJpKNz2W5GCHaMibh13lUGekYYBSWujk8d4M0frNR7oFZC8qQkbP0G2b6TPPSy7cQRiKXobAOPkT6SdfgaQUA9FQ6ICCaYQ+h+8b28ezXs9XBwlb291amkZqG0zeHrTGSYH3v8+7jqfnTpq0VKooIUTwUS6MCAfd2Af+LXTMBkvnS6KRUVCUzG8ZSVPilWRd2LO9aBLO7S8U2RXCYUor9GdXvo9KmYIUWh6Pf7jF5ZnZuFyTrubrTYhKtqdmFak6EQHX/SINfv5Qc18Am1pRP0z7oUMvYwZgBfS5hOy9Nl9fGw8yLJkBUY0tcad54I5stdNjxdhZA0tolJqRZf9+prmJ2mRNzS+6jzRYDY3voqvIqy+MoLvtlPsRMzAhs5lBTBgPUD2PixQclGiLnkEadwByoTUqRyrpN2gLxtkWKrgl7qJUoJGTObFusLG/UngUKsJCMFAYFs9nLGbUZ6lBCKCqbcEERsH9aKxkCTcUfTkNujxA2Xgth0WSMzOZ8g9qFsbIu2eCkOW2+x2DeOWOyHn7qDEX1tYkMFrSoy4wc7xP91EM1+pFhWs8PF6bQx/oLlu0Uc05hYdp2i5ZTzOcCt0Bux3NOfr5glU4dJFfPebThFPK2awUzYaR8aLUyvJitpH2FYHj3B7xA/buOL+6l4TPRsCc5GBK26PLac0n3NlnUYJK1W/dHQcO6+oa49LsCwOKa274A7juBUsvd0GVz+dl8hfCsvThrzf3ZZTwPk1KA40prtDwrfEhya5gmzrihsylEl4WTDnr+z+yjHBhVPx9Eh3vWo3PW7GOuRpwNY1Acy3Uru/nHfRH3vZhKkyD0reCQy+c8+NfhtmPZEOTq2T9PsJjyCF6cu47tT5vLY0feSTIPvTfg/IgVPVWKJCOkufp6liLAaavQQkv4DJ+aws3glZZ0ynyKbquBZ4peXgRUs4iX8/MYfY4YwrSBtIz9NAeCPX44wDAxb+EJBh5v9+s8RDQ+6ChcFLEvosrfri/977XyX67O///GXvyCJDppU1SrghHZ8tx//mj/658D//+7629/jRP7SxQ029KnRYER+wefWRcNuR6ju7a9Mf6cBKKrU401E8OFYcO2MqsfEn36yDMeMOsrRmk3gMCdRD76yLBBWserQ+RL7zyUDgdj+jjbWjl/aqXYvpKpz16q1lfnOh9L6StlZZumadUA5cT2mTRNpkmxT43rWV1GSUNYQwQvV9zQzvu2eCDb0KyyERM1dv5zn+a1KcWP6Yb/jbyy8JkVvZ1d/tKpvgNUxTqV1ebCwleHf13g2kfNnVfm45kD/aT0J/+p4KQfeOFYutaNeoXvNgeE9CuoWZeE65qj9KPozOYrM/1PArS0POqcLVDmtrmxUW9yzmRhnQkLq4F6wFvEIGW0WOp+FJaoxkuJ5lqz9D7rjTQioP2JO7f0GhNs2MQ4kGeLnXTjkAmMEd8LTJlCT0O6ZyycSlpr+XJrrLP6A4KFUzGD+CjEl0T7gsy80Ke1S0f94dC/W5b9+oUM4YV3iZdivjLihXIqFypyPnBKrEGeLFrz1qT545pvXsofqd13K52r1tH6m87ZeoNXdI8dkVU4K9pYSUesP1OB+Cz0j+mWZ0cknh0iK/t81LznltyUURpbSAz1j/SekQzihntKrNJtF+3wdMVuMeg0LMnPX5r1bt2xAncyDLzu0C+DMQjpLlzcfPsQF/Be7uYuhQ/K7Zlr+xQOxs6zTbA0f44x9Fdzc7Hl1vJh3hMQcq9XGNiBwqJdkCys5g5tgtfEz3dnFc5pfOQXfk+wJ9UcDHLTjifehmVGuTBf0eWyHrPZUYbDn074k69G3dkh1O5MXdgeXl0rfyuOYIi8eWJMytaPI01ZnCTrmwxCfwT/RZo7j5tjMvVKFjZqQy1Gs/y+CWEGNxtkuNCGyqOzdfnb5odxKtCyl8cunR+D1VECJk3NrcuXd8lXqNu96NJrtBik4tt884p9LJBLFwbuQlh8kN7P+8frvfOL4B3JL96r1Niw7cOaijPqKfTr2XJAYeOGxZXPXDpm1OcKqGRMWPONjYWRqn4LHcU5vbEDiouF23JEsB0t1nn5zgbbDoTjdAwxhI8PwwtZmHuvPvL/ok165O2ncctiXEGzvo0Jk1o58BZlnuy7+cltXbKKojGMAdVlBcLDlEWbWJKTpVs/5iRzjb7aJtQeDp5IVMzDDbTeME3FpBEYvE94jO9OqwbeRiYjUUFtpS1chCFqWvnjoNkc+9ukVT7QIExns36k1uLZ3ofrwxF4SSbg+aFS+EIYvOGHwYgxw5rK37VLS81NerW+HZ5pUqXLHDZLNGmaYru/RPTsQ9llALr0lU/AILVY60Yfj4frhbTFWvnDNbEqjcj/Y7OBaoHd7p2PFru3kjv9pfjC4O5xUzz/ZK1aFbzFezTtZ5gRzRS/Q/v9JQwyjmi7XidkUDC9p1heymXy2ef8EyMmxKAWsRTp/E1SJXe+5/3jpuzo+jStLRundhAD6AOap1nd9V9uyd4DSKtB8FBj0hnRjUEM0UT4gh+EQeB5/tT4gZFgIvTHPF98QKdujIczW7K2Q5qgXKXLHS2+E74ukiKrdJL2B2yj6nXpgVp/UMj2PD3YOKZNbSKbdF9m4KFsNS2yD5UO+WFqL6/P4XjyyAYRsJlMuSawYAfR2qXPKd3Nu+80RAYUjEWmL5nzop1RpOqoEtgHQlArMsiY4sSNY+Kgwk1BUQa2xExeQ9vsIFeVFr9nRLGn/GR7vJ0t0EqiMBn6hEg1j78NMn08yg3xdsULMQ4fcEGyfCXMl722cUbFA/pqjl41uIhqd/uZNBp1z6BVLclKp5HopfVdJV3/ip99uZCUGxm43633jI5897lMKu3TNoGkk0oDRLmNPGBe6Q5oSc5UNpnRPUM5mRSO3FOpMxZ38EI42meWS91rE9XFXI/XHgleJjfG6QcZOT/cHEXqatkuc3UHM97IlnA6GaPGF/P+SOrUZ1Op5uP/65TmscJ6ViXbk7VRpQA9nJ/kpri5Dif+TzDjlHzJeYwY8lTqDilkhl/rMTHUZGaosfmmAJBv69dA8h2DNrdIxmQTVJ+oDpfzFgYituVyTchIoNpqKRRdIJNVarYlF/XoHkubovPHJ2NUqhljlWpj3Iib/plSkJes1AxDadeVW9jjyi3UA55uEQKxvEtILQEsdH+dGDOGkmjGvIyKBLgwdtspFttezSmt6U75j5rlI/hdmAoIQyRsO63Hz99vWQk4nsUIxGdSFVqNCib3ZBnJzU5PSJr8YGKSfJ9rrrCYIHqRYUsBpR15xm1XxzgzNTvjD4Evw6UJKHc0vzkW/X9ElcxbxYQ8DlU+Nz1V5jstRa5YuSFO55adIfLWWN8u+bH+Iaun7odUmv823hbqDdS0A29N1D4KU5HqsrzL745tjYYGD3ChuVuQiFZZrwHE8h5x0c5JELJQjZi2i0px/hrXrwdsNQUnp2Bbsvdep5tkC3H44Ofv/NbVW78GkXWMNy1ZSzP9mXZxxjmDzXul7tKJam7R4DkQhcPG8rLGZC/fmIH13bjnzM42713KXXz4fIv90vfx7a2Z/9T9bOwjb2QXM3ejx65Xrtao5UH8482eL7OG2lALgzD0/XMUjEtb6Hq5S3Av2aOuWEpzzWpf813Tip3w8En6h+kd7GdOqBQGZ/fql/lQax5e/XLhxySX5+gvfm6Xh1EPBPjQP2B7QL3arYoIOCJPdIF6CxPV89O+PG8ArzQtUzfUdxnz7+/VF6ygfpWHeCz1i0H7TQzq/UoAW6GMOUR4BWVZBoCPEKNciy/WeibuOX69mA0aS0+xHmsnjh68tvRFFc59tjSknZqfPiQT8Ylr+csji9eYqTQfw5WwZMqIPVzN1BI5aO6Q0HHzpbcUVO/F3z7cXt20PqOVlp0NMGQDm96iPjhco843qidg+490N3d8FLJs9Ks8jL+gp35TR+h3En0m1J4mQns7yEaj9eheUaLDDY/7+EzFEO2pUZfWZ/2NQetDZa3a9Bxfal5CkfL7oaozHhQfkJ5fQ/P3z3AYTC8zwVq9WrTYbSZtYyluDDrU7UBtf4NMeEWqfI8avvnXR42jdTy6fA4TsVPK/KfBuJTcNa+i+AyIxW6Cf/kMPTX1O47lu+J//aavnyl3Y1GnVsJizfRzUhCFfRwLAAteAde7YC3m6kGazXzFW4CUFF687I7PtauTn2Rc1jnXHTZiR4AG93CAZkkdX8+6vlITK8OaUlHRq6+31J+J6rvxz+WiLyWsjpL5/OTR17MhqQNZadLQ+MtGrke0sU6ufzP0n6X0K+sv5WtfZ/GikUOo4byn6grkz+vJuLg+Nw56zFzM42aJ+dIbc0fIssrAbDPWW2zSU+QKQVLmuOIbhQGMDIKV1Z0bRMAFgwptNNxxLY+dUZ/KPlF8UJ6po7p3EL2Njk3/uefC746uH0okm97sf0ndT5UJQ4IHkVH+kq38wmi5sS24N5zOZLMYpuBrezAjBpJNUYVCRNJcHR3GAq2ClCbT/FNaLBXlVcNRaMEFDdrzr8h3Kam3m1Dq7hp+oyHeBVxCMlN9PLm6wiQ3VYP/6yXZ7kZsBaFvB496Kedr4yNKEENSO1Ts5WmAx8p1lqJayaOVwsD+rGt2lyCXgiThLUyhQA/xmJMd52TAx0KlfT+lZ8SbHFzV5riR/JW1TwiCGZdHJHiBFIL5MuWhPlkBZjrsz53g9YjnDfomgZXBjo2QDKZPyRp0LlkbbfucQRv3JtZFY02nAkasRKpF7EqaiUJyLmU59y+Ml/TdVCF2bRxixiq/FzGznwozGYkjBvv06nia/jLbsT4sHPhA3FihsFFuO7fUFL0iYcSDI6hxlNwqhKPO680rRYl53Knq4xfuci/WysG52WbXKDByTsIeBkz/SNZYrUCa5TOD+AWI6GrRcF0z8fKUtpZ2Uup0JEhkQGuRmZgNuCZQ1evtCkrQMFqqmvioz6B8vzO4w0L/5AMdpCjpJ+kjG9RXouVkNV47YkB59dDAHjWyxz7ZL5Xv843Nm5ziltJ2i2PUN1HUKYLZagxe9UMPNPnhwZPCYR33oAAhZUtmiVEdVKAPyrWtw0hqjfUZJSJWCxjvFKSRtvNj2qyIy3UgU5VJzYQFswviGg3lK01P0HxvhzhVtkqMXCelkYkR0pynmsjfckf3Tjo8jU2Nfy7lkE6SN2yttiuYEPyScZvHryCIXQxvbmfXfuTFnDMQhs8VJxhEtinMDCOuJJDg0qaMS2pIAai5Nk3BfAlGxGl6ojaj+lbM03aEqNImVtIQedYym+WGrTQzWQSUGlDD5B7rziavQqIoB4NSYQg7jj+g0ARiFeNZohSltpjZUCFm0uAWjctIFIHoQCtuQpKyMwlN8+u1Og1S6Buc1hut2jOiACwtar0/qcyltVeNOlNoC/IrkNSYyev97lEUtTpxu2k5r0x1rBJhErVW2mlUfIiSOl75jcj/9xBalj+aysF7QzuRok3bG0tcP3DTlULn2+H6x7H6orOhsWS64Qkq0jhZgCkf+lxz9vy1X2y/Rh8vrISlr7zfQl1ckigVM2kTjc0AJgd8LlBbHXLl/GHrI+lxPKA02y8Lkh/UCvaJo+LjLMB8hV36CgaPeFZ9mptIHTE2ORpJqRPZ0ehRKLOc8GipCsafxJif7NjTuIz97brM+/vfQ//9s+Pyqf/q369wl054XAqcUfrP6ld6/EktoSQUT/441yqvydRn/Dnx3nDk9mVCMM2jv0ec4Xo/jL27YE4eufzy8MS8OiZqcFg08YSq82O6w440P/jptcfXPvy28taQ5z9uDLoXQ3/+jRufhE8uqNvslFyEeXEHT6sGryiFbVdr3mA2W2g5QkDVOnvhC/k5/qg+ca5I4AxXN7BegGjecUSV1aznCIGGnpT6nXt9krWEQrxyc/x10pYCvGeFHfdJ6Uz7ih0Gc0s2KT5wQ4FHv1+/v6Tk+flLTvfEiK2Nd6wgVBZyjXog20lkllfLiRrzPV5ruaYr471ocNTeES3TNF0lqSYOZfsJFNFb3UWjQ/JtSZGl/p1XisXwJ3/b0PVsbH2slIco23ZRFK9++uWHj167R+k3m2S301qtsY1Kz58XmapRpyHKfLUGn5w2Q/NjA+zKF94PFuLCAEKEjjK5G5SqcWCwUsnq3vqtmcaOCQtuxke9rHYdNWoQMJ/fEM6n05VMQQtnNjY1m5bPjCn3BsClL8K8XW/wD2WtqL76AcnI4YQsEJ/nrePCGOQf8T9QU/mu6gVLtaDuIVGDtMeOia4BRFVfTAr9w7wbdWyXHGsRLUjpG5AZ3yaHC4NsuTxxPlctiS40k08+eo2Qcdxarrehu5yrXjSi5Ne21TH9TiHy+o1VD5oh+0kXIIeq1N6qkMO5+ClISCTnTDHmrZ0D6qrxN98PQ5hUS/FKptCKjQbd2C5/nrXN/keJWrArzlUyd1KOasMzH4l0i8zniAsNhJTjY99QJgJwCGVmfeyMi5FRmzr5vhpFWzTch7Eiu8PcZMSFeuyqEl86kyeoQyWhiJRC0Ilh0ccMZoo9x16PpRqQhEGjkU30lZ8mynRjcAt4EwT7RnPJ3uYMyVfVqJL7GYsu5gC6H3nfuQ7WX8dtgtOMJ16DrsJibcttzIsO17L6hBJNypXisfYE13UQbSWErVvreQrroiYojPH1Q4WYEAlUEidBvKg9CsquOQEQABtscNHbJaGOalPUk9DHg855yukOWhSoFGfoZkbFVUrgd9xMwSR//11dCpLciVo3rCuBVHGG2VNtNk2sWEqDzYWUTY9eDQTJpUyo7+qP40d0aTKiNCY3wye5GzTXLzfDVC0mpWlLY2YY3BomildeSj+6ajw4BBkIMlqbW6/UMxigx0zG10ukHNYJeUZpQooim5kW4ve2zAv+nADJzMVxv7I+LPgK9wXhfPyNFz1Z8K2hP5t+e2Q5ydfx0WvxzbVPF7798NXoWgUV3izSnIpp1/MIrUnKEnZ6vis7HQ/+zvvw1CJhrgSNVHa4cMc521yUsiduX/7C45e5wqNKJ+SmBbGfobaiFWtNpHLL0sls1G4vOO6aZC4RyhX9l2cAGPm0nZ33lOPBlLWp7NwoWO2tzhDAAisqrkb1MWom2oNneeG+oILFFi5qENaSKH2FcdlMiVYgTHxJ26xlAtdXvVw3Lh13vGq8spSciIkkuPdWsAK/Q3NfDhXvvLOUXFYZT0abXiwUXPNuIwWuMODJWOEud1XTSBVUjjQLo6TPcRGZCBbAlBxJ8cqiI6icKHSR3W0Ymy1SjalisjEZfrYt2Q6bca+Veqx5NlWqKsUZBh607m4MFSWkXnaeiboPh1hsAODL9bjEi4/WPJkf+8Wbx0ho/0cmaMaYoZuTGh7aZ6aA4UMMPJAJzyNAQgd8EcAbSA7Wj36FHZG0Ryhua7SUZgXJy1qyXHRdNQJHGJ1CoC/E8NDEa9Fl/39lXxF3SJv6SKiFSVdsbxSJTSJK43Ne2aDuHFuwZGjgN7rQAPUebvpQt9ml9XfRbmsWVTIPrXdyRlswwOTSegE8YsgOvhy+1yNoVEUSgsHSFxW2hc8sD6rGtWR01cRsnL41osPi4E6xTTwdcU+myZFCHxO4t/NO5q4MEZwqAOmdImLSNUCim9o/Yi0e+vN7HxvP+jG8MA6yP3/pA5EXQzBxpIJtKkHHqDmBdoPffS/0ebhOJz8e9OhO3ws29gVr4/Rrdeu9gWBnmKCX8VMJO0qHpostRCvp2sLp9eLVMXZECca+ITvGUH1AfRMz+M44uzxK4vvZ0JiLu6g225idh/goS85V70ay0Wmx0VHYDASy3pRuiWc6JlmFkwL+yfXA1T0mFwE+n6xPS36svSlu8MHt6d5iqbcFlSS7l1bN+0sDt9OSWwxQQpFoBQkXZCUK4zUKS9atmRt9ymS9Whe+Q2mpNJhS8D2rvptv9S1kvynns7HSZ95PoXiiPPwFwXOfwJufRhPPyt635ZfS+pFJjBQqPUQpTdnPxVufHehjQgX2JkuPYFYr38vVjPahxETLR9jQkBRg+uI+GKPSobxvq00aZMlVQBdWzFNUyc37dFOke3n3hpiTd6uiDZVRMSBHWfFIKL6+KnpNNJY22fG8oLPajs67VjT74rL2lfkCXyqhCgLO8zC3aRbLbU5LyLt2AX4xedQ9zJkuDfzZQAA27IZ1MrTfC84zcHXqqKgz94iHoRWqxLjXYm58hKpj2GlJgEP2Drm4pxLanmQSCq4FXZIIact5ePYRh80G/mtRDSwu2SEV8+i7llPFTc5fJxt753LI5hK0lfn0kcXg2jvAMzEvuBr+Gpdy3V04sDUvCYEo7CQWppmrWi484qD7SJK1k3yLblgOA2ktFmI1V4WUtbRlS6EACIe2NSrAywQ9BOMIENaGJdXryw4PvYeeGdHJm5SbLRyXfKFz+/5lQ7s23KtF0nw41UR/dr6ZFE9ULkuzyjfLD+b0uBISIlFN3Cm6xxtFxnyC6KM0Vo1XYb55Ao6ynqhi1kgYZ3zax1nRxmkliu6wIipdn+wxHgy9OwATEMRkb5eb+Z7QDCYNj1puptJtFwQTY75mr4qKqvebIGrbVQzZ7laZ/LrTG2Uphb1R9gaRLuPh7XTOl623wnAgu27qy3QQY/Dl7+bEmMSDR7lnO1wbdcLZYWvcv3oHdv2MGE+YjMAP+QGeFDeSUq7JVYiOZRNw6MRYMTSsyVHE9L53gCEeQCDacGhjlUAEBC4Vss+g/XpO63qo+cL4xj1rT4ASoA51NsJRAGIR257iAQxmrNhOePfrUDdusoj3d6Z4wx7PvvPb+U/zTZebQsVexlnopl1obS/3ee+XTDBmOOcnJTNyF4c9HHIlGHBvlwAHgKJ90oK3+tNjpt3cw2EIuZwAzd+lehzYhnJOM+oQCPp+QTCnl1XKTufIj5BcQd85RyGecrSRZebijnhN0/enV7b0krMozGbenxLnx/KEwr6lyMAJDs/xPGIlv4kdhpd4/lSRsafZWeQME8DGST+Fr7JkoNkIcAGeW5PTxg8ubKt9OIHPA+AHyJ6FeZoFyJ/A45DyKSTHYBZNhC87IUUW/mblfAIDZJgSAO085hv4uLngApr98BKj86xi5HKAj5KyxCtbFZHFmdVWMePbOLI7wWFfCQRc+tHihABAPsW5ncu288Zaubx37zQ+fc60C4owTc/p/m42zX6a35LPM1qfzBu5iXOaX5i6uU1zuLT50kNDdm//yu85nkAfjz8p4HcOJOAo+qxDHQUJrgp3tovZzBMzV7bWp31vhFp1Wxpd5pn5suZuucwB9gFAKQH6DP1OTH/N6oUdkhmoFNA9zxz7KcTiHuzPKAy42VXbli9vmQZl8bZ+TBSixknJzk/2piUDHQMpXN36TvOU5nMpMy0AxwGkcoYZALt8DjZBcbs+B2g3ku+cIrY0FWMGdQCNtYNg0EP7aGjDQzTkIQCWGQB4rIDFj0D7degQQlzTZudyU49OHJGssMAMQOI+J+FI4WXrIfushFMu7Cw4C2HCHHA5C7RkgBV6xD2N1Dpr8K9QC540LRq6L7AKHscj5zAv42HNPM4ZuPwcnMKX4LWZ33Gchye5Z+ACh2dY5bvmKB7Bk9xYkOc/nLP8BDvOj6HPf8SBW0fHcBI9DueggmfhNTyKf+chBvgEg5CjygN1pAM8xT3ispd+FYBz3ngeAj7nwDqNZ4kdGngOnvRiP8MWeGhaOM+QPZVWvC8o+wwJnGdgCp7Fw/wfKFt8Gp/kBoHuf4ELewFgo/N34j51UjmQUPgfdt180sAzBvVs4AT/0jURckODDkt8c+cnQ9sDC7vu7QLN1377MQ0mbG/Rvhm261p9jmSXJ0fl1/Gh3I9eKkHp+Rl/BgsmDJcl24A/5Vl3Xi4bJdcAD0J+Ynqkb9MKlGaGFDzUqFCZsThBgwt7TArwBJN5l8t2LBVzLVkoBeqCZL4UfjUmwEHQST4SxOeH50t7FGrWKtyeG8/O37Q1t2MtjYA/AvkVHcIw+SIOClek1M7JRHqa2JfJUvyPWsaMARJDMsltzSSUkJMEzFA1+F79E3awoFLQdL69D0tUCQhA3cAZnmoe7pLVZIEJaOalMfFIwx6KNutYSAxpQ8ZAVFkUsha3xxllGZREoPCrglDv5tlOyxZ3dWpYoB8UC9pCb7jItTVn8RjDNFvnac8K0zUuzhEoa49DFbZCG7lQpI62Jd2pY4K444FiUxJUS8B4ncOBQWnZbAuA41QepQiK1E8TVFAQu2Rbag/cjquzBjsk0CCUTrOQE1yianV+pVDrIAYCYq0ofUQ7kRUkgGCRQS45uUOBJMYxiVsVUS1si4THEZFQHD6kJFi+wqnmTywX0CQUEPqFdLN+v8cH4aOxUi1rFWOap5Lk5EEVSLMgRbqhw+ePpzzG1HNPReHJUt1PjwoCV6nYX6EAhX9S6ItXU5q8aTmfEIfpRA1CFMpTCi2utYKiwlgJpM6ngIi3JCcld5n0XCsxdYqWIlmibSkCySgZ3krU2wBInbO0Sua3QL3yPLgV0II86tnhY54Ffs0NdWMr1Kpq9Ap/FoYJ2DcfaRWqJTaYuj1n3aJFCz2FIXp1C2r5XZvg4bCWaxeDVoGPHu5qEPvmCkEav7J/e3Eza9g+D/buLVukAIdJTMs/e7wbXv43IWGKdpENfPiS2xI4lZlqUDl99v0Y3lUOtQHcwPGz/5yBAyLHuRxa+KxzCP97gpgJG6Zl61PskH1AoBpwU/QQYfNM2DrhB3131GnIPjmxPf7H9zDcYxyYIESk/FUdo1i79IqInh9DUpa7YAr6f5j4dw9hwgRgUsfRMTRk3Wve9fUh1KVnbaU7/ab11OvmLxdupoa6P9F5Z+1U0kMPbPvP/DpV/9hvyF6xrzqEqrDGeGMsFCp6wXp7xZDfYz31mrnUYe05WqhyZ5a37pNATGeI3oWvzK9R9dN+O22l+6pVdIVF/Z1ozSoWN2hN1+Suvu+ZqkIp1KI032NhiXeNCkzEEr6JqfaONu1Kmk8cRowO9c6436BZk2/aIXYX0oWFRgOxnfe8M1Qod40o3fdKasEdk3wHvjskQIyKXieGHUv1VmAUiJdX2v298QNaow5my7EQKCMDajHkAIyFFktC2dMfqNQP0+T6IOjJ/b6+SyeewEMzSqtiWFP6psF0HwX6eHG4ND1fz+DKQUoyJIcAG/wTwUKlHrGGtK8Xge5hb0f7djNinQReY4+h03jlceFVQv3/xgWIPjZsibDgu1EBKkYbF1YlLXhYiFTFhi8R6h8VMEGVFyyXczi1a8Fn9kOXlJcgLDveSrcWKirBE1sPMbS8fPpCuparpR8kteJLQdHctclWbLCZ8Wyu4XTfmT7D3GeM/SDgcp3cUxRqFu/myA7nGhlPytD/hHopmnGyConPTscw8zsEXi6LTE+4l9Dhq9f0bKvBZBVYB9h//xW+OJ9hfLfsRU2Ys18QNy5VRKKtvl8+CMpM3FPtFEq71MIF9lSqbRE3K0Vm5wFA+4UY0/uvcx87b/33BDXbXBHlPWfysEnmpGPF0V+a/zebWbzaCcLBi3vWyYmi99dTPPH45MfkhwNqb+Eg01ZTSAzq/lWpGCKliLt1Gw/3Y6B/FD45UVcHxJDpQudt2y7lAA4iP476+RPV4vEDYrSoISF+Q8hffyGIQ54bQiUAUlj8y7gQbbv7tr/HRRlcPThYjWB7qa24JfDuPXAzFG4lt2rX5TssUVKXkpWXypyl2F5KL7ZEEMNLXw4SQXxya6RAE5l+UpNgn90PMkB2wZoUWxFCSMFE5oDAMzgl+L0PeLyYjzZBr7d1h65QVpF/Qw1QT7+sdvoz7GWzUWpii95VyQZAzkZ35ZO6jAHA/DFhfMJaEMsC1Ls6PjP4HzC3NAfEYib6wQKpBrviEwDX/8CWM3lAtzosCaRiuUmxUCoKlQwDWirIwVJWgj8fboHjAeipA8QeMDD497w4sBoHgLUp6JHqS40WTgC0DIBwUH818PPce7RL0D3oEo1H6jvjy/b9viJHpMjzZS+2f+Rg+S/QL4n19LxDoZJvB285YO6q8bRoU9FZB0AEyqrF/t7W/8DxgStFJfXLuuR8KcvvbIviMuX4YNsfvzGya7uvGT1wnjJCGV1Gm6EvqVHql/MDIHxyj7qkGxMZVF9fnhgXiH/A4QAfcoGTl1TlQwnmlHByt5Wahy5E89QWvN3HEQ6sPts+lsNWYE0cm5gYI1qDrQCIp+VlpBmSqRvjZeMfiTgfSTc943/Xxj02h1a1ctI4rUPmj+OEn8Zvygyu9BfyQehbWw3cwOJqP+EH5Bd2Rhf/G/4oLBN+hH8nZM2ALPlV2yNTLoy1tgZb2k41Ot2D9H7Qsq7b2de9QFnNquYZhC2SFsXIZHZKtCAMCskPSRa4ohur4/QSg7SFYWAZJNXuvs7ddRZSIiIpnNt6nH089Ipqtp5nYJuDPm71ZBHOgviQbIwpooXZ/MnVcVXuwDzD8wq9R7hFepLMx81NiOoV2aFhXpiwEPUnpUJ3WQWCri6WewlDzOJdHVnhHLbxpBT9j1eoohInK+d773QKM/+LwChnk+jxF/JX+1RLN22rYWcXWLl4vyH51V6Sh85nv1iqOoujSBM6Zef7SlLt5Aq71AKBPZVqWwhAtH3tsXW182g7F2N6727OY/81l2JHM0W6d9qNLfYlux3LLDIZbtSM+AoE1TEI7rYNxxLx5XZMAav07YdvTCf8tql2W8f7U6Y9PxymDROrvfVz7X50f/12cfa9/rhA76X/xBGZVx3fO1TDmWYNCYDDBw5ban0um/EjwnTjnk6Pjrim70VmXslqbhSnSs+J4saAJCp33uelZGxus+TdD8JPzVU8nY4aul3fz0ZDz1ht11i+eiiN4ZgcE3H6nojkqpNZp4gjSu1H47s4lHB1vWmgarb9EvE15uGM0Gt64W9UgWBZLo5ckywZerEkxZJtmbqERQ7xY/sFk1OsQzghzBA/XbCDrYMlnGCO82xJ9f6F2xz/1UtY1tes8w4tu39l6gPFILRmWnuxvOyYtiMP05wcH7QNeP9ohfa/PpRt4ZecbteaZBS7wWfPs5PhAdms+LsnthKWD8azPPDopA2rkZUPoq9p02sJ2P6waAp+XnvuowwL7nwQpuxEVx/CeztHfZVhz/nXHb+TmpZWeMb79nX2hvepBmLXqj7+vG99BRJEK8I7X3R+Fc8xDZZy/b31zztfvzb03bZWGR0fraAZwka9B8JCwxSN8WGS8PWGzgQfbb7KF1yg4F93f9SoXK/srE6xGDIsOixGkY5OV0aHRytXB6dMpcoZipiEoKmG/V53PV9/d/3zVc89PjQqu5Sf+/IN+93o946OUwgUcTHefWEz/vJ0Sxu/idbO2SuZ6Aos8BKL491AaGZmCFR3zVuUxFiZLQy5fHiRklcXAmVmglC3eGHIyuwkRqr7AHLjBRkwcvxqAp7ksZ0v6QO3urwerl0Lej6kZ06PCa1cKE9OlgMZmGtBcrYc2OeDQBYf9ed+k2att1jNVdEtXfPJQmCohgugvMbWXKxx9OLcBFAELV0GF5KIUfi8EigGiq/IPDP0T80I8IPGmxpZffZ9rMbsrwS7ftDz2ASvzOYET36L5mHuYt0FioT/EiJjoDnWgXj1nKcxLpfmWJUy5cS5AU09eGWgwRKNTHPo2GX1aowMh0UY4aFi/vzURZ/alxBJ8WD/oefDbwiUMaWCi8DB+Ivg8LiSFyJk0ETTODrGL+5/KkR1YjAgepaxJZd/WiLGCFz81zSPuOGvECYm3ZW/Nu+/g+SdkYn395H5RIUk99DqSkczq36PXPyaHS9eCrC5APh/qkMifpy4gruAmzmORKGilsd53DXc/8cvdKVDi+qgrAQcS4cyiuqMmJ0xGkuLwjt5ysJyHcCXDrqP5B7p7jmSc6Sn+3Du4Xx3Md7b21uZY6d+AZ5zdxux0YUKjOjB7Lm6JhO468zpTiSgxPbFi1Jb/y7k9GmkizVhyClT0G9hEN35BdLhhthQV4r+xYusbDtgHZdFUD80+klkXkJRMOhT0Hzd2eygJZLkGgourzi49iFYgr7nzHuKNv4AwXoMZiHEEFXDYvQCBELs+o+jZv5hBxNM5RdqAvW7AJwGJ1Bxv9zd1+Cvc4HsBEHXsgOcYOAqoM6uDuASZprlNmiJAq5PRU48dhv9Iw7i2jJU2GSc2VLICvMF787N+ksVYZ+UNb5zKWYXxoORNQEAzTCGDfG5jePgtv/8pYR6CJRjw5YC5XbwlgIA5TxUbT89Zh8GTjFxneDG73WLISgbAwB92DmMsCb0LljUBB3gh4Dlx8E3FxaZRm5jwzyq9HwdI5/mT8tn6C4GELYTe8f9x3uJmm2BAXDRckMerIWXLYO0Ad87AKnbtr0OXgxvH0OaQNRS1/rm5nrX4Flp6TCkTQn08q+oWr/JLD/VhFqw/kn5M3gDtTLVxS6gPGHvq6uu9V1d9a4hERH9jMpwE2v9+uvlN8dFdG2Ya6jLvKr12JOud9AcDrrFOwfEaFFDXn3nAopMRiFecIhRWkPavWQv8vkzgrjXIUZpDTFXsQ31998oxG0OwdNoA3gV9MquMitthH+Ia5l37Hh2gNY/0co1G1pZycqEGSnNJWnASW1htvagc8xaaau8B0qmWdYnX+zjlqMZDio00mid8toirnwfpxxNucdV3PVd0bJCfdxQ46B/HHNMv2PhXZ9bhuev2BnlIXtihUx4W4SpXpFMiaQy/Sn0+aXfdY13x0NNfe75hpjsvGtfZrshEUTci5Ab2ZbW1jrctZcZcTLUizwiYyNbInMjb/vF+mV+FzFj/Bc0uxkOurUWGvRRB6MKDBH8fJSvRrMP4iCwZWKwsW3pN3r59i0fAjsmfLfn6VMaOO58q/6r/k3Uveg3+oFv7YckovLqEZtDXBO/k6NnPDVMFJg4VEuP85a41aATiXmJVHSVNV/tvcWircXs1P/IXnTX14a10FrwtQnTgdr7K6xmPgXDx1ASVOQsHp+oyqAY8Y0oGQ7ci04xvZaakdLnu6nPfH58QnTYZ6H0XZKRo7mGAWQ8JdUBeMUes+HkkmQmcvNI16tZERpwgZdTLoljM5+w+ufrOZgEDtxloHDtEnxe4sTD+rvN88dQv36hWjzmEKOFyWX0oOXogbg8OqEk9U+r+0nKidEDB3Nu1DLBUvC2Amt21mFXPPGqCfdfXG+PKgAMuMCrvSde4dlfp/Tt1ni6q/GL6SLKTzNtCEaydAvBy5vQ4haHKBC8C7D+3vyiMGHERHolIx3AvNnMbuN2gOwHGzdSf04GdqCAXKsdiGWceofLT8n537+Wm7fFrJpLqTTd2o7RUWA6NdLaPXMM/TvkMnGg1nJzZt1LDnk+NbPvfCg+fO7j0wqHtacGy80+xqxsuCzDyGmqDj9lTcJKu3zb043V1IHa+EOJmxxmJ/euFUiIl5ViZesD+QjVG/hMnqjgkGaTn5ExzayIZu6Ch4k4G9JPPEdIR85Yzj0dI4RQJgXsULtOWihN1VJ/h/yBTPeb9L3IWUA0q0O++Svf+r8NWBQpM+ff4d2WGRfG+/qV0ssCQoOy/EP4tzScWZiyp7Y68gfTj6YzOKvkyixGFD2ajglm8OYtSJl9jAN4Tu4W+NiLFb4VvNbWqc7VI2s7O7dp5Zcuyb7P68865HYoCzvbmHUMuMNRXQPiiyQt456z1bnN742N328+Z+V8j0HSXhQPdJm7E19kEZiH6fRDLELWC6L7z1W/1UzM53xaivE1evz5wWsggi0jWhFTaPlf1Ez17ykjWTjIrhs8H0+/RjnJ4Ay6E15krXtOcB/k2GYB608TWRPxNtu3KxSVXpeRtNMi2bFu0sXqu0Q5Tmncfm2yg3wKC0HYU+SOyWsdxkqcgpSDN4YYYYiKrMIeZ/8mkCfQr9093qAnyITf7OPYY6awk64bvOMkzZJevYpeAsJdg0G9qfqAf2SqsqLR2qBFtJ2bNu+UFs2ZW1Qf3tm6f5BXvSAz/DF79Tef7gVm3N6z7gdGCs+a8wzLox0DbicogjVu8UplqEbssYVZ0+vVwu9fg3c6fRkPDDcK+vEl6vh4EO8ZkrklVC47ExJxWF24G8bccth01rHv24Tr6yJ9oOOvqbxYGn/afS95qKdnSJqycFHy3qxhdyH2px1sbzkwJCxalB7mcTUDbAkxcdXQiENdCUtu3TfIn1+jDoteb/RKoc+8+VjLMM4ydSCm8Rq6NzfzaLKtLoVn3Ll13QFNfJrM6WvwwnuqvTybKYhhy9c96Z6/Ke7YgBLbOnr6vWWEuarK5nmsGSuQvpOQcpgTfcOfXGaZpLcmkxOMZMnipCnHUlR8/rnS6dr9lX2U8Nao+iX1MSyjBI0OG2GwV7N+pVvN69Z2czFOazaK2/elf5NHVbqUlhTBskFbMBgt/CTgwnfjVd73TrUOFqpVs7cVPxSLGu7cez29DzplmWGTYyQwoMLsOflY0+qEazc8CwsLCm9qJ3s2eQGv8gchkccTSsFdFIeDMvHuAcEXPRFm2+zw/fu79yrVyHpQxvnthy6rvwcP44mG9eO7/nOXW+kW7eHHohVvLfYzAxeLAFjfq+mHrX8YHaQ1cRrAjLk5B8QTIhQ9oZM6fQVS6Gj8/oEc774lN8C12Ja9fMYoFFRD1lC1oJBh/5fJR+HH6d9u00DEmU03+aD/pDftMMG6i6Cj4x9Hz73JwbhVfuzwdPRs2K1iXeTfz/fOrOxygzz+MQMSzUwOPH906JbZc2wInp/dFBaOrsCpI8d9x3tjuApYGsqLWTR7wbZpisX96cdvSVaPKqMGYqDYeSXvcWNUlMCxMYBSIRc/TqUmkVVHj65CNLMA6ykz2JIRkxmdRg+vHUD0kxjrAbFu5vxmXZ2xcvwJXn8s9Z15fpCTcq3MLNw7LTRt5dsi14xlVS+zLSMeOKpPNK8wWl1RHt9t62Y0/zwozUUSn1SMwgmmgCQWIrQAX2JZ9sIT8n/QJIFCEknof07IFzxH9WGTipfPCdLeIjx/OakAP8mEQWgd7u+zVmtgMs2cRkGzTFbsudXiliuV33EpEc++lFVhVc6rOUquYlSNdertsqHmWmw2kl21IoucBQ0StFBLC6xNMHGZnXSl/lVY0MKeYeulUhH19Wtq0bcLepJZeNEpHRVQbxcWjd6e2784JuIHow/AS3P3g9e34upzN9pwhMX9G4bv8H4a5XfxIjFBD8y2MPwC14sQ81fJeiHL++w+2gKuDjw2/U6LanfP307eHhxcWFgO7x0Pwkfa7AoLecq9eIHDdeHXeEing+K/AvYbxEOlakt5c/OkJy9ynpPndv1t+7sw9xbwmbZkfVh38SOrm/WvTc1T5k9MYlafWotZ+i4r14GA9nXjvTRcuZhm3qkRj5ObV89+qn4BH7tv8/YIm3EskY3n3J8CkYVMl96ndk/7XO2t+kZUr+UxiBnQ90Q4GGjX00/6LI8HW/y+jfOJnLqz2NKMnIYRObICx01Zu5yHXd1+MwpMaqOo0adDCexDWQXs5dcdpMZWAYndqXUQ/4ARABGdvfuD9vcuIvAGnRWVXLynUgolopsXe9sbFhO7FPJU4rnNCtc2sfmB+21IQaqHz2xBca6213eWpwCq2z0nVwB/D0rC8wZNu/w7LesETUwJ7AlAAkBoWpe/xf4w1Jl57Qe8SwYSDLiK56LYpesyWLfdj8ziN06DBVYt+CGThoSglqL6iBQHM6cxykpvtZRlcLzm+kYakTi9ZtrXov1RDyzMgSnpo/FHkgkqk9eMnIE6LnIW2KBsaAjeeEBggds0C6DTwEaBUwLHjfg0aUCodkffiYXjIpeDupNggpVEaiGDAcoHMv8iTpbNgiFCsRSJCJgrBbWeWMTJiVS5sa8aDgGNQv8iIIPzWwza9ZGQNh9qMXJBFKD8Aqyoku7DCIAhTxhOGKFxXMnADJBfeXO1BlPDmDsEQygEBeWXQ9GYhWBgIxsAFLlSDtykzYlXXtyCFpOeLTwIeH2qi6gs83nmP6uh8WBjQ3rA06/qiEpZ/tnqN4pAICBMtQWmpATip5hTeKdLTvgHG/fQ24LL37Zi3i4NLmvn/XBlBA3Im1nedu3maF/99t0Uf2rJ0g+8S7tYWHjh/Gud523ARVeHwRn7E9GB9Bj/hLTfgThtRs8kPCYde5r59CD9ZDiZT+Fb8S1ZiXuKT56ZeVY87lU+JUNJWx7Peo0/Gr0y+aXuyfpg/Ar9cbPfqkerGjxJVHKJ15jOkOZQpmvIa6qEOPPlTJxDpgFnBX8w3yMoaAUdLIZX/AHPAwqX3K7Yyukbfm95b50+3biru5xzIQU874//jQG4JxclYrvkcr+4CPPoQ+P5zfauOFMLEpCPW8PsjJIDMamx4mKb08MK+NTXYKM1jTsVgHpaah6G5yrAbIds6Kjpny2vVkum3NtTVjoFO8kl2kZ5HUMXK7MTat5trMog4LHM12v+e9F3duzmmq97GbYdK9P8zh43q2892fXudkpSfG2M79mMh9WqlZdPpF/PXgPt3w8xGAnu/8NsmT/cpqlXsZL/tAIJiZ7lIT5pnnnJXjl1/2/cyCxxl0vtFKwIDyhNYiMQQCtpdBwCpXNovHS/c3eglfl5bwT/IE80HNl/yYBzggfXc2nnwKECOEdEMkXUuJ1bGz5DppZiZ5qxn0RHg88hNtw5ybSzi5igDt8EKRPN1tGkLCuaF1BUC6E67zjd0OdSO+Y12ND3F3OW0XiWDpz7cscUdt/m5QX6/YBPeMcoJAr1Oly/yvFGSg0051kZ2NEOvRLuo63cvw+2c5AVbqHiY/eGOmsEFTnwDXhxJAuTsOR0uaZveTu4G+byGtg6KpVnr2XZnJeDjXfrzuyVQRVHtkC0CS68cuW9UARNwKJp8+wOCwSvPkthkFxh9eWy7yx8uM95ZFvnP7Y3CC0ez2YrpThIptPZB6Vvf4wG/gGtIp8NrHqJ8woWkHBuviHBke6rSBMGUkzQQXEOWYH/iWHRQ//ulGJz5OX/VjjlDZd7z5pH76Gy8CZv+1Yt9xCu+/oMs9d8MKtucJwpNzqhcrGPTD2IxKbuX6dY1ii773wWxlhspIl2CgDr0u6YXFGsdd6lQ3zatTmL0SV1Xw/1OARZg9AJub7e16zK/U4k6h771tHyo2W3lpFeC2PTOqJaHyE1OaBpQGUh3T5dgMvMjluSvGABldhcbSOR1jZE4soyW1ObZDKRrOGpOhsXVb8qyNNOv4RIiXaqCTmfvcp/r/7XIZQ52XdW/5TAc+tWO0ydoF0cUvokORj3B3X53/4W8rDC0twYtWfiPK1njDo3vyI/VxNT6FRR6KSOqcivyP+zRmvUm6eTz2us9MnjdJeXbqBGtSiXryKAhcsY1QK9oEVgoJfFd30IiA/40BFnGxW7Z84xjbAuqG7OHmcDo0XQIjAIDMx7jPC3t0zk1UwDOsgmPW+KFrprvGbJQor4oDi4iXlQtYkd2JQoQJoYicXju+ghF9Kz0m15xm2JxsrRcFgyT86aJ7d0IOZKaOjdMsOcf76gmhgvDmj20bLztx4go4xWZZx96xgxX/48e5ekWt4d8vZGktGqYExRfuHHc89eyJsYMsvAgPrV34D3xHBCRgdQuMyPTy/aA1PeP3kyZQWvnx+f7jJf2ZGYcUTzcRfjYrcmpK1NE9J9kT75SNpTylid0ShuzBiBmHiAXrRnEbp+UX7pKFy5Ym0RUoSsXANVjeaXTr692J13M6QbfF7viM21Iz0+AY//JuAabDQzR0SAExcZCmWlI6EPaAYbA030EQqNzhxfMR6TCUI/ujAMtgbGFSQ0K2N4A986wppvM6B2xXyEptGu6hXAr5gaBqPhMOswJpoZ1kULY6KZYdZhMBoOW0MNg3ccaYCD+LnEcH5z1Cka/B3DTc194D4A5w9qjpOyBh4ZgRfANYNrxpBCAKLnK35RJJRsQRI/vqEhgZ9kkxWk52Tg7Ri41/nmnrEd/uUV/h2xZL4nbeoQRWwpocwjK7EUU2j96UVLzWOH+mYVFfDL8fiyCmtR8eOxWUX94/704sSABNDuvSdGOhuoZetpVe8+IIs2baxFEji4WvhQ9W7I79rx/s1Lr5LsPsB5zc0vtoDVIZz3IWVnO8irZ/5qeWRzreWX7fuWazaPWt4PQwxLvTCktxSQ9T2tJ+/imE/txdrtdqzZHrt3rvl/5ITnrnYsM/N/mW3m61wTzqioLic9Ccxeo2xm8Ql7qZGlvwL4ltvx1NU1MVyN2CoEysiEQsks4+sgzq9d1X8R0QsOP2Tq7ZqlMKYOr93OR/pUvh0gFrXz1bsdSDq+ftfXvxQ5eAheAS8fcNUsQw4cQpYjK6i2rtjKqGa8KtGG4pF6mv7oNPsxxsMKCsvKVkFWcWoNf8FCXizA11Ho5Hoyz5KHqMRkwomENQH3NnPCBYnY/c6xbkka730j33z2K900XYmhHrUFuY3u7doNtDmei0MTNV3BbhvD54OakY2x3m5JzrHY/YJETnhVWaS12hpIdTYM3s9mHXmCrHCLzaqrg7evEsfFJ914eoeHV6lKz9UmhBLnii037liBjWeiNkSF3gkJzegu+LiuFSMPlUuDQ42wyhCpWhFc9pv5OCmmhGVLPjFBtjC3gBJpeJARS2YTIBbEBJ3TRUIOie87foKbrJhRGlGoroIIQ/xOJRRC++7jk2VFlbHKgDm3Ueo0IJnm4hpCTQHGpLM4lhTwQ2r8wXg5CxH639Js/CB2kMC1El7jgjGAjby41yk8Cx4lJ4ShUHCWc1phhOYIi7nbUyk8SqYcpnXL596BzJBLdxjYtJ63cCFvGfH9YDxcpoPiCY8iI8/mpRuiZj0aXI3WAJVVf6BaWjIXjSa0NKobQTykK4PjgSo8fCYrUZJddGl1BxwNFGbt0fTntbXRwLQaiDUNSllVG/pr3cTMbIZ8wSl+tijhAvkLjowP/qv0kaLcfovyH/zEZ8KpVSM9k4ZBKkhPWhspGm8t/h9lumfeMTAHKig4KA3FN9trDWdOx0hdF3D721vw6/Cqa7s4Aav8ZqRL6khN18gvwMOS0UF3s/5E++y5CpHQb+5uPgZmRPNbxDVuqyBo9GC+rzWgYz1Orf3mEvNRuSJkyzGjdCtYg5yzh3ecFziOidvvKMVt7PEE0phFQpSblqMVPmDducD66wIbzCw+e3re01rcCzrx26XEHYY3gjcNzra+EelIqf+t8uNr1mR5gWen9i6/kQwgzJ9XsveUZtXlbOyfEPgV3d7l4JqiqurbN5lMudtPGRbGw4t//SogmY3rw8IO1/53OOH1a4MRzdjwvx09mLzBFpAcruIe6NifjZ+96+npMgrWxmo2rKtIIyLL5hJIX7KXXdOcNX5r/urxX0vZoUAeAjRZcEKIZykExDrPaKFSBppA54RFecLjLlITqetxND+aI8xRtEgb8euhnD1L6SFeZl3uJF0hTLGmCFfm4LtSAH3sB6lL7Pq1Uk+w56FDKpMkGPQZdLfca+E+4TeZzxLBTZvHQ9ZVTmBtcORKsomNcWlqIu1WLgAtkeS7x3i3X359PrRkCZQH5YPzx4BBOB/O2yL01sx1K2iEeRlB/wuorxXOUQ0DAmvg+2QLn3/IHOPMbpoy/4i/gv/Q9tAMhSbkFXzWAZ2YH7+sLq4m4A9+Am8eP56/PsuTDEzqdtCRqcgMK6BUwKqsHBXM45fQZdZEEgrnPh0HvIez10NJMdw4EznKLNluPfsC25x9XkqVHkSZow7psMXEw+zDRMzex82izO2hmL/Uj4f6h3oz1loyKpEupfzlIVW8Olcb7kg8wjpCdCT4bveA/T7qIIf4VEKFYbQsnBKHliea5ESgrKM8JtnyQ8XSt46XnB+gWBdBuC6Ktyg3syDT2v1E18FUsyTu/0ZeRvj4C684KDn99T0aAvHecbjH3/MSuL930ulamCfkwWYSmgxN+6RiQTRjvhQrzA/joKBMNCagmJfAM2id4CxnGgwt613CUfCreuYLlF5CLOrGKaGt+KYJDYlRTDgUnIVG4VGQkQeSww213wUxYCPLd3heMMfxPYxKDsRd4HK3X9b0kDo8AeIn4g3vZHq8E+sBcrj/8VNIIIXPPcC0furObcAzy7T0wJvRgcIivD14VgIs/uIwYw5UCAPDNAwPDQGQ7g3y7pUtN1IgqOX9APz5aliNWXraF/6Yhdm9mFpwKCWD0u9UrVkn8Vg8vVCjhylMufvsYrLT/X/G+KlhFEvJGj1oCqHIHkVcxBtFQSSIGk3JUmh1K6jcXBSFoiapvdoyKbACwWAo0c0Ws9Genug5G9mpBBS+bYen4RPQBI0rdYfAwj84p2SMhkvW979II4aLo2ZnzrSd3lwgLWMo2ourDad9hZYq9vAQux2QYAVIiu/oSRrrQXUybNi71wAnGN8baRwK15xOhj49Ga5nEh3fTUo70vPI6AJiAYF1UC5zJ59dYb7oL4u/FpmvOFuQsuLIzPa5h+Z1W3zVgo/L/Xibq05yNS30X69tFu9/7o4hyV+2+/07DseJ2dhoPk93da/V2bIF2d2F7a6S1SORu+su7CSt1hSY47FUGpXNoGCqydUkQji4Hs9TPtPj6doKRL7ccw1fSxxMGSQS79XV3TOF/1W9hBFLuWWL0oy6doXlyoFmshnxA/uD0Xv2ezmWgQ82AddLNWRhGZhWah91diqbzqoqUPChEhR4T7+2JCwbkkkhIJMBmlRGo0ulosfOxhnmxEF5O4ztxQYwCsYasAGYVnvOYbKGso+HEoqZtoD8ARX8DMN7b8LiCTqqLudoHP7IQaMQ/OZnsgmHGReZFxmH0wxG+AwmDheBah3xbmXlXaKBAV1bdw1F6GAbdeBXzsiIyxSrATZo82ZpBNjNm7DSvKHXl9wreVOCfN5lSRX/gSDOZUqslTyQ5LtDZPfQSi7L893h9HKuXqCXV7Faoaw6RQUbL1A6FCgM7gXyFoVcq2hx14ubPaH/xgsYSq6WyRAWaFHNcNfncxVMprjMSvqUDG+JCIK8bjCctu4vmvXUsLD7zNF/tmjOtpmz8UyN3/ZhtN2PfWfDvrszI7vNXtJ7wxbLmiSxYbWyxnFab7FdwdWXuBXUv1bWvSq48gq3knp78eJXEmm+8VgZjOgOYUVc7KGoWd0YVsjxlB3LfxNO3k4OT5vkBQxiU1S75gV2NTl530K0Ud3zzJOe7bu3YO312jcWC072VvfvDuoTd/AXiG4rHW+qFwgcRCtSwAsRy/dIerbjwLZQR1uG2pxbvRS6XAAZAhuvCNIO72sV93ft2iv8xqCP2+mdy/7aNt4WgRqw9VxuE46YDywFdncGuj7GQ/YP2h7Y5p6zJ7C/h+WcfWAnr3SI0w50OtzBl5OI+FzgOXldj99CH8PrTXimkaZ004sMfLx4Jnr8GH0LXs8KPPKMFWlB2y626fGRrGdHAp/nY7fQt+AgaUKCFEowBSA95UkISE90MI021ciFSTKhmebesENIYHreQ+JFj7CC9bFHLWyU9e64MRxCGhkeR3Rj7MNTln5weIQ4R4Mfw12fdyJdx409S5bgDuGTyknnXR4eFl7urTuE+4lvzDzREz+GtyW7kW1xh3GebkQwdyH9XcJD3sOE9/yp/Cu8K/kPDBD9XW6+rH3He6e9LOzkd5t+mx7ZjbFTTO52MrtLUp9xsmHgTf9irPp/wEU9qqBYDivxjBZWGiP1uH0MxsJXxrcIq6pyFyuAl3iDOvIqWhMaF3IViY6IigE3IzRe7r3yXg9RjAa+MVCNwd8z6TK7NWTmPjTkEy+9bzYEhO869A6LLVJSLBY7nL/K5obSz/OVNVKcTW52dq4NTlqjnP+5JC+1hHwsR5IrzOPejFKro25y84S5kpxj5JJnNRazZlnU8OV7neFtK/77UmO5kBrHi6NOej0Opv1B9bD2oP4B3KnIY4l14gACF4GaeZdvLvggsKsWoI7+/Hm04bvuesKvKO5J99fUbjbCw4KpbQl/DN4+Iuvf8gfXjqt4uSHia+cmofHG2+0Wbry4o/UdaZCGd1kQRzHfXebQPUamkyeJDHMwuwkZAEs+6dHQsbmLCnlWhOT38Cy7mHBbGVRFFEGP9yd7BXcGtKg8y8cadkSaRPNx483WVfWJZVxBlmGvvBfOzl+X5PxvsGsiCHb7N9kpfxDO6TngHDGn3Nq2I29DdkANnBu4KafDllo2yynigFzwZKHX/bA/vtQ4qizjtHsOwEk5LbEWJINvL0ljeX8O4cQDe2K1z725lp+2khWlB7NVjlGU5w3FiEbf2RUo0s0pShXMLs6wlD6XLIlCtjx/vgUROQDeUe7NTQP3ck9PGMAoGgwBKAow7USHaDCvjPVbxtgEoHlKM0yj9yEQbVrhoWm4wxiAYF6GdwxHBOFpcQ8z3RkTHYjXoACcADrNt/QQlgpSVE/a3R5DE6CIEB7ChT+MAA1ue2L+oUZMUnTBctNPX4OXFvTKDoQuTXj+yRRSpM1SsARKTF1nzEjgJ4do+YM8j+6IzU0ZlNb61Weyh1lsR/Hp/eS2DUUsbNdns/GKm8WTT4bPDIWbx44sSUORydvI1GGUAqaJe0fchXaJAliP7jkM6I06T4ZQ0qPpjEcALVZ+IApAUDrv7EkYYpxcQpTAMMR7AYdE7wNTTINbjGC60wSd7LN5TNlPmFccZjDWH8/ROUUuU4DMFQTfDKB0Eufe6F8mp2aZxtljPRjzzpPwDTADRhlhdLtQ4rqmci+Yfj3SpwbFdpQ7r8arKh9JPX+o3eMJ3gQ0kuPogaqJ9BlvxsI5MFoqhjFtsgoaHe5g+zfTPWGUKsuUKlse4j7U4ugOZeSWZnAAbatzHR03lhhifXH8yTjlKoUMSNeuXiMBlOFadNZ8DAUMr6PZK4YNZpLTy6yGKqQXLSb8SaeM65ZbnlY6LZlkhgxRgW/73/lxLK0KnqLXzq7A676LalZwJvWRJj5e84iaGTxL5XLfqyA8PD+/t/pTvY9Qav21fex7lQ8kwx9alIQsReZO/s5MZRZB2TLINNtqzjerNJcQtppJ4izZl5wS020S4TIhAQU2nj8Zf2KfkR+IE/ueD7h1b1bgjUVR207vJu5yC3FKuiz3qee5AE+XPDxIzwd4BHoJ3/gG60Yf7VZie5E52JCRR605weE/P7U1DnYcXOHlZLp8y8PwkLL+q7vi/+1FFRt7rn/YmpOQ+utdV8N4+4EVXkSz5XcW/q6NNsYtCihU2cfS55qU0isYZ2rlmdJZJiX0WFRsNbys7j+nL9LaKGP8wsDqGi/PKDEpYTxdg4oLuVBz/maIUxRy+3alWaE8PMPnT4Gy56Xw1wvq9JlK0yJ5WKbPGRvlSdx3eCeZrf7kFjRsNZzNUVspHeX7dW5KZFb3g5Dymi3mgu0PABv8Y1nParshfPI1wVZv+f/f24/m+gflBqwjJa2yGbt6Vjv51XLX2szdVl9y/AdGBvAuqZ1JHqfdziR7BGq3bLmQ55ZXlvzq0Ct83P+HXvvoel/1seT/bU/t+9/ntmxl7H25n8hpmcex+rDqC/45xuwjA5U/OB2nsvc0COPEsz+/Iib85NakFsouxreNB+Um/Ku1PFqw46ZlRDaj8N3U8DY1kNe9RLrPnu1uETkgRoounWPm83V81AmToQhTO4pXkxevlDqL6ufIz+c7l3jN9+LlUtVUs+Jgr2BPbYhXCKeT3kCvE+JgvWvKjbFGQ1AhfZJut8mL6uVN86ZOpaO2Zra2prZ2Znb2vWuNpCPdHAHjK53xJ8Od08phoLgymIBwDVyMcAkHIcAynvFawpRRYvKXLsAdpt+4m+mH4lrwY4wb9BJjSyb2BRJE/S9n6cnVlGqyPpF2iDRjPGPyAhBz/7ixiXHQoA2rz64Xeh8jYqIRy5RmRrtlStfytTx2fpqM+JD90EiBeEBAdIYmJVo8rr/FpXJPao4TcVS8GdV0HHFmNCDZ9frIK6VrIi6vjqh5aD2ap67iFEqSCTi9tn1JiN7oYecJnC2e7EzG2+J6dk1yfFCYk8w0AqDIcQEAxUh+tGuTQ7n9kqHMZ+x1PIJPjl+3N+Qaa3vzZp2uZgGN7eSzWFu3uo1yWw/DF0H2dAIngZZNS+DGGyRAOY2Rj3/aqTL6YRFjmQw0Jj/M1eYuwHz+/GwdPZh2BVdQd7leiwd9G/DBJqGoclR+GwVT9TftaWDo+ZL8yNiYpE1prCpNPFrFVjHLjarNQocsebPpaZQEb9Z5S9OJz27HzKbW2LD2CNYrjT3XvuiS+rw3kiG0zyFvCwd0gsJ6kcAYVdBBwXb5BWXEOgdFXY91o/TOorX+3EKzSDThpzPyb25sCk0uKylJS1mcAea/wkESuoQmAaHxppAEJDXQPbOjqB8/UD1/5MfPowhgPFFHAOrojx9HUZox1NMnyBj606djqIJ7qgJkdNyBajwjsMpFEWLX3h5iq3TWZgYOgh8BR5GfP7Xw3YKWgom8oLQUiYUiOXuJxHtZ6pIcb3HaMk+Id1xheNzf3AVm7Ql4H9cD2z33eB8PcL5FrN5zrJD9W6of2XJuaIn0I0r/YHdlGwiws4/ZQ/90YkWpdFvCy6ez2s4uWoX6KCc3GrhfEKOj661Z7hnC9NT2jRpRpJAuo9Ms1ilzbZQwF2YfEcIC2EjtOlBOZhuJ1sSNZnSpbYP1hGxEJrSCjVgnTv2k5cY4fIYopcuq68nPFkHAi16H3epCk2JdVUQDUfW0bvrGBfWFSSmt7ilRZVARXbE0qctW9VbnncVVK1La5Ji7sU/H4Wqdt5bFCoODEcQzQv5fV+B1XXjTKHxuYRgrkt5h03hzrNQ1sBgM1RBc6sCNCkVuV6ju2YJGcBNlzSBf20CZpAIjCaeeqyqeqqoHV1EWRMYlDTvGOfS6pOZWLbisk2UcFzcVO47nQ2vLOdnHxIxjlP8bkduLjJVF2atsllmfJwof3wKyP310OisVM4TrUlydqiY+tu56+9DyVp3L8VcbaJNHdIUs2m/KN73648esFou6G1bcVB1pktHZcHoD4wRRF85znvBrHEez540cgehtaHRl1MXupe5b6pPqMbla9qb3trXdCeff2622hTtRaERiPtvFJH1+q7Q3jEO+9JbTIZ9z3CzK6C+GyunZPnVuEwnB/tawg+PZqUvKjKoc1TrbJ44iXb1w37azNyY3BQd6Af+yErlD/ZdBTbKBb4t2wpT9tbhAx86TvzzxvwbVZJQQI/33RvqLM86u5oX09tsYv1aGUGX7SOyrb0BV/7XqNivybNNffXX/1hHj/+38d9PyrosQiPPrG0H+LXAw9mLkH6bapZuYoNCxHkHsIFqxEN1g+tnOiLfgoLfDHXQWkw9DIbLsRlvLUktW1J6lkqigBI+Nf4fUGzVvFp7qVJAEFXb/BsGVWnyADCWU/bXDuGmvj/Eq2WT9ov2F+b8rGN9lp4Hk+pueWnexGNxzbdS1j6ikYu0R8kT/BPmI8Y6wU2W7toURZygcpRLWsyXGq+0aBjo6age8Go0l7EpEHuzx5HEheYZMwdYUxkQtTRGmNA2IBo0l436sUTbL+s9B9sD6nBZ/vBbv35yzvjS9frKxLiXG8OfflGUMuVIoz1iUjGXkf/ZGLU1OmBLXdnQIa+eQZ0hS0gx541KtL60sqnR9TnPXFCYozPCxb20nuSz2qNTV+WM4q9+hj+WSxRqzH2OFs8fmhLP4JGtUQrEYmxmrzf4gvyIsk1NN2fB2DmJnmMyArGHibC9ZY0361P5h8gD56YH01nahaasg+FZsXCu+N9m0NyXlucp2JVcXcPokgfjTkafTxmp5pY4kAoZ+c68Lr3SFyvZbYlKfqcRkfmwcKgmAokVQU9u5SqdqKpSZV9wjsNsiO5UmgO1MKW6R2dpSls0WJwP8NVVXCC9fBhclcFxI5GUFWGFJ+Xp2lToiLExvNMPWq1Qx4Xr2Y2mL0B9exeYKuOg4UUCilhfLgkNQvoErzHltswd55isCfVHBIUiconjFwdr/ag9dORRkzhv8VzoXdOgHQR39QW4Fw82VUcG0sn7T8ccE3YxO/oPh6gZIMiMxSQ5jYrE6Ql15mzoHlTUi1GTHltXu8K/QgXu6n1zB9pASDgIo3RaR8legxIgIC3OMeATcMtW6K5bBIcdKrv/nNa9xgqRWmJefGFSLOET1uarC91efv/SzCLPzDIKjUEHePJhpz4mwqxAnqa4n/TgjZXJPn9ososPoMi6eEyvE7eRi8YM3jsO7P/x7GL0X+foecxDe8/G/Q8/pCP427TnxnQ6R04TRQxN0bnISz64iAkGlybhMuH6ISZxAAFLOQIwVGFBRJyeJ9z7hMew5NG+pMcLxprkhBKT/LSMWg725AI3GE0OcPu4mPExcSb2OQnl6mYVFvHx+9X1h1ZHXLdWo5wyEsIi68p9bz+EaL1PP8ZvuhsANJ95O2KJEunxmm/C7d5THTiobfrHAJyUSwSFusEI1Yu/vlLMm/c1GOFleTwtld94Jytu/3XYeW2cw4AGvUGMb66n5CWdXB0u0Ie684K+9MJvz96iEtAAF8xcgHOjUDuaF81JE+NqWg3yNhERCJA+BvswX7kIhZ2m0pzRXgqgvhrtoPWMWDAEEYe6nD9JP7+TEcnO5p2likYgr5vyHFqIyRRche7yNqSBeIHmsQSny6cbbRTASwlJOFXppV9DHUYfPWilc1ZRlVfjKjVhFsKR4gEa/SD8VgmGLcdZV0Wy1ycXJtV89hS9sypNvCYcFFafsrz1b/QW1OVYtxpzZFJg/VSi8A/UvQxsHB+NYKKVEV8HGhJzqflqhCbhwTDylyDYnpTQKivJMJyeTEkzaqM+Uir+9XqKEF6Uo7Ve/p2XlMG1EV7bQwz7YKqTQtBNXEV+cxoUtkk1ZaBYqMurpF4UyiMvswVUDMV+xG2sEx/lBp/4rKQxRWnl7LCzTYep45SI0I1bE0XOammTS8jQv7abNhuL0yxYwN604vgLX5NCuC5GWi7OrEXst7FS8xi98ctoqkicuNmzexJd8f7v6XTBlC//TZy1KSoDKJ+eB7Kwyacldku3IR1A0WxQvW4DisItE2aWiawdiUSxTpn/MScwIDS4ve4pGSXXCiaGbaF90GZZGuOGS07UUxX95cEUNh0+wRWj8c718gBLRacJThIuiG0O2q+q/fMmIEBbW/fS36a56e0Qqc3jYIUASBGj6swPFTpdMHNIWockoyXiE1qHHhwPt5HDSNgh4GIe1kFTURJLl8DgNOIU3pQET6Pbmy56n4JmtKJaHjvMkccZLRjAqOO2QE0e5mtDo1mbWXlgQTBDnjthtJRxuNcoq8xRxhCMH11MU1kOv4xww8mHiF9d20k2nETLY88/jiIe+7bUEuH7pzVCv8NWVBAUm66yVXdW2hGVEzJU/s+CM1mBkcqQcKOzLUj3zDkNx2/4yRj7bhvBsMul2sIvtjB3ul8BO1I6zF00b24mkWG+xjmf8kFlxxkMgmMY4LvYILszKquPGRu5Hi9UX0bBQ4+cpVNNsHt7MwR1F5z1BeLSeX54vymQQDS1xUP/5VPHULtbGVQoh7sL4R6jke1LM6kBYGgFgIVbiK93ajNCBqkT8v7U4oRhiwYNXOJ841NU87ErkyGOu/xNOzlfEo4H/dyTynPmLDmM1jH2W4p3nxIHTHM4sPgIQmkgsworaRTShHedoI8KZni8K5x4ooDGhA+OcBs6SL2IbbvAPmENDEOjXdxpHBqNCISQ75ey9gECGt/+/bp0ameCY9+acKtkUHPfvpnlVhGVqquKFvd1GpzuKlWGkD0nKNBttaPJ7lgIVCnOPXSmvmBnTpiT5NIapUNVib9mOpagVo8TlZt++oJJ+kCXv6f2LomA8GebeHuI82Js0kEXaV90SccpBadPlAc0u2yiza0xasMi++dB5mprGjMv1z7W9xuRz48UVIevaQttzQx3xTXwCF8jBMW8JI3heUkWJPFbJPP/mcu/kucddPJ9jjAhykmHIMxUWi97erwj1SLHNneXJQ6RIcYJM5ZFK2ZfMZamlPnYZ9RFwfcXzEheKM8pDjcoeVWZxf6ilssuiWV6IgMuDrVfQQ9bGBRUYvzwunvtDzpC6rNy92yP2JE0KXffIedtZsGCWZ8hNGi9e6Q/N9wyGODKkCZ1ok1vARSO0Q3SElc+JiKSxgC2k7e5SYESrd9PMK/JRE7SuhQwlF84e5ckT40yVaAwj6s4+kfTUbppZRQGcjRoZZYg8o+3rdo7wGze0+6OhfUR12EkB025uzsgNd/HyGgThcJqvAx7aHas5EtikNOFL/o4uiwoMB4XADg4oQfIVxqBGkqSic+gMk0WxHfz/9e4YEmkVeh+pKZRmaj+rN2EBVojzKiqCvUyCgFpW/ybfA036U4W1qX8fbJODE2XbJM3Ka0Nool5zHkVDq3iLy+bqrnuZuH7CZHNQXGVely1J0/9LdNOK6oQ1EGeVp6flckyZAovHnLBgB5mu9MoT56SIcuXcWKmN/uw/cxyduDKmbc7xHdtGhiziJzPsk/gNNvWhdWxEhMJmPRPy+DklVn+fBmiIJ9y7V8w6zYz0tdOxyuJ+xGMJlH3Ncgx3Xj0Khk2ilagsVGMPLHCg0/ttY9/l2PR5xJGIov9e01Bg7nIbxfVY9+/AOyc7dzh11qbU4dxZqambij8B9N5KGUKboymKi/uH28BvOLWlmbGE+rpCOc8xwmiLy2ihIdJZL01c4aJuj1mRqHaJaY9+W9sYBb7PyZkh6arwuxbl1hVbeqpoleQref5aGzmr264zrXo8TMT/3jFPKEQQTVI+D8UVsoYYQh5Kk0Bn0+KUCEwwgYtnifj/tzdxhAgcm6jlITz104I5RikEn/raadY2d1SIRLAWuF/FRTOH6MK5jiYeghD4cDF6IVvEI9TrgXtEzARJVo0ZaI2SBjM5ce5CotP++Fvm0fkqRFwGU5ZgsYfpHB4iS4ARBjc2mMZuTHuTx0OY9zlGCo6NiQrmCxnwIJvGhRB+SFUCHMtgvZE3O4mZzHc8LCJk5XocigftMIK5MIqXpFWiNFzWPcV/SyvNb8X2Ura9d2fAMwaNaAeDEUXuUm2+/4EQQ7E0sBjFhNeRFIS45CcgGjr7jbj7fZSSe/PuAdls/QJOT5A02mO5emGtalzr9/2sd87piAK/rgTm05nLsVmekl1s7DxFXDxNwZTdocUv3vUr5eWCT1mJwFhwtDQt0tk0KM19TpK42vB373x47PnPFo7j5hO12KIRQ6Bh+ALroJdpltecVImly4tAWt1CC+D/ojnRPvSMXfASUeIZUVLVDr6dCDdGaBCGRkefOQNsUyl0CpHMM0+dKPQdAzIyfZBHyTJ6ImuCa86gmCGLMhbV8+SqPyiMnb/2x+I4Y9+rMYX2ccEx6lFpTHBcXQIu277afjjRrCfKMjGGv+D4ixwyg1JO5pGNDOmj1+gUbiJXTNBJTp/+CRLKSfBi6tLlE1wK4vQkPh6SWvd5n3yKi7fuDiCp4zTwH4LucDaFRj20HHivbwGFergPvwOx+pEFZ84sEI6xAGtUOM9cZ/ZF9DzS3y2emfl8B8wgGIcOqGebqHd8qNKMeUOTGmsm3AQtIgWA6CIzAOpjtpBHlTMO8ZU9vb4muUkyU9tFOyawrAyREe2owsWaGscSgygwdNMerk8/aevh7b7LDuzkOfTZe7iVy5YSmh6YrHPGsIdycHinIkQ5cLV6hramCqmrDIaEZLmUm01qR/RDm1AVAh/aEgD+rC+OO1wPnBFQ2a2Opkmyjl033kQ787vVhoqsjF7V56qMvll/tc7AyBzA0OU6mbyUlq9oI8Zs6MhqU2+3R5hLyBttopj5v416T0mUw1yAb6lk5yGSG4ZGrZtiTBJWRf1gV8BAnRjjsQn80MoNWWUxzsgKY3HQSD2tnHecn+uBAUGVXbaJDFV+oNJOGOkzvlJOuFXOucjXRXK3djhYzj7nJC8AiE7XHeCXLmUzol1gaio5MbQ/G4VrFwyvusopuzh2GThZX8t/OwK/hhX8HKrDB60Vop0hcpm8NnTLUQLxKX31H94RUjJCPj4kM0ctH0JhKMp/+GHS9XBZO6mGD7lxKXK10jTeoLZpsksbTNSmoZ31YsjxCZOylCfvVmachhkykIp0ZmYo5cuhztQFWRXaiZK5kI8NHT7ax1uEog14umnObNcjS5xUIQCYa7VuFTqT6v9NYRSIxe2TXcQnZ2o3x7IcwIBOBwD8I5KbEAyt9v+X/nh7hOD50crY3RHEZ4OZ2rutU90eJFbvc1sBQV9pOBkyr/0Yb/O7++365F9kJSqugpr5elMZOgy8ymTik9eUH/KrER3u68dvyBhE5Bl3eM4GjPBaoAwLSRJYZj1W0qpGXH4cl9oDm+BX6OE5Zs8IbYSHQ7BMriH8j485+rDaMy6NUYpVSdg625C0ONuIMiaM9x0824R18mxTypWzLR1Qdt9WskViEFtAiLQVnQ2C67Mb3i9MZfueMcO+92dznX+i4MmBs43XATOgtTt4PrPSgHrCJq+3nIyw1eSUTa//DV0MeiAjo3v6hcNIwjmUz8fHX5FxMOEzzk5Nk83tIG1+jTwwBMm7QW5optLzyu7lfLY7HZRG2oesNKCesMnrLb0yGWH7zqdM+P1/QxeDHhS3enDlXziM9JnnUD43SLzK3OhWQ6HH2amJKDZnxiBtnrlSBUNSkbyTN7qhmUrfwehezmQl21Qu3Wfaqx2Zte824+YLNoqAAgMOAiQo0L9NHQ4QHHhoIcSUS/22xPJk+BLQX8r5Yrlab3a2467de/bu23/g4KHDR44eO37i5KnTZ86eO3/h4qXLV64WiqVy5XukLPVG8+X/DXe6vf5gOBpPprP5Yrni7G++iwH/G3VRU2NoQCwOD3HjTqCFETp6hifGw91T6qp59/GwGp2m7D60rPTWp8U3s92xSgfvu3iCXdmc3LTIb5WhAMPa6V+th38Sp7etrU5G0xum2k2AvrR1cC1+pNsOy4SAk2WRRdJJ43nZgeIRlrD7MCU6Lf0CUNlo2aRw90Y5PDb5mG7DpaxTFCoRRh643QXQzZBmOWmhHIetUUF26Rqni4aqMqMhyUjVQ60xYU+tlPFitd3TYdPqOqaKAigDRh/x1Jy61q4ZjolA10xMZYmn8SQazU55kVFnQyn+ivP0qvmNXNoBnABpJp0OfAFEuGZAl7hEz+7pLuySYEd81P0ZJfSFCy0TSp0jk6B9vCHwwd2TT3ZQm1MkH09DQjbq1/ByWZ7uBtICcsVjWG4fSbPx0cF8xVdZ2VNgk6BXGTwfSKn2sJYJFVvzq5ufZN57JxVmhl1kFJerwRqvZHc7+EZ2jeZG1kCF2Vw0odUnKDPKhm+llzLSIOxOy1KDYyFmOROkSQhopve15TS1yL4L/L5bzYldHik1p2X0ZHihavYeOrO//jFk9e5x9NhXaMKFnxMX6d9YtqEdUSaMDPj2ehe7eRVA2BkH3CDg8Vyt6dMcX3ncCbvjpWT4YlOndHMwnQabjqzmq5XbHOLKHX38uNKhSmiQPS3rcZBrMYFsSK01n61Rk8MbtqoIAAAA') format('woff2'),\n  url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.woff?t=1575558014483') format('woff'),\n  url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.ttf?t=1575558014483') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */\n  url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.svg?t=1575558014483#iconfont') format('svg'); /* iOS 4.1- */\n}\n\n.iconfont {\n  font-family: \"iconfont\" !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.iconshezhi:before {\n  content: \"\\e690\";\n}\n\n.iconguanzhu:before {\n  content: \"\\e608\";\n}\n\n.iconxiugai:before {\n  content: \"\\e675\";\n}\n\n.iconxiaoxi:before {\n  content: \"\\e669\";\n}\n\n.iconhome:before {\n  content: \"\\e60f\";\n}\n\n.iconvip:before {\n  content: \"\\e620\";\n}\n\n.iconguanzhu1:before {\n  content: \"\\e60c\";\n}\n\n.iconhuxiangguanzhu:before {\n  content: \"\\e665\";\n}\n\n.iconjifen:before {\n  content: \"\\e626\";\n}\n\n.iconvip1:before {\n  content: \"\\e611\";\n}\n\n.iconleft_bar_out:before {\n  content: \"\\e602\";\n}\n\n.iconmima:before {\n  content: \"\\e61b\";\n}\n\n.iconzhuye:before {\n  content: \"\\e6ce\";\n}\n\n.iconshezhi1:before {\n  content: \"\\e60b\";\n}\n\n.iconhuiyuan-copy:before {\n  content: \"\\e607\";\n}\n\n.iconwallet:before {\n  content: \"\\e674\";\n}\n\n.iconshenhe:before {\n  content: \"\\e612\";\n}\n\n.icontuxing1:before {\n  content: \"\\e601\";\n}\n\n.iconnaozhong:before {\n  content: \"\\e616\";\n}\n\n.icontougaoqingqiu:before {\n  content: \"\\e63b\";\n}\n\n.iconguanzhu2:before {\n  content: \"\\e64b\";\n}\n\n.iconzijinzhanghu:before {\n  content: \"\\e613\";\n}\n\n.iconyanjing:before {\n  content: \"\\e62e\";\n}\n\n.iconguanzhu3:before {\n  content: \"\\e64c\";\n}\n\n.iconjifen1:before {\n  content: \"\\e61a\";\n}\n\n.iconmima1:before {\n  content: \"\\e642\";\n}\n\n.icondaishenhe:before {\n  content: \"\\e625\";\n}\n\n.iconzijin:before {\n  content: \"\\e676\";\n}\n\n.iconrenzheng:before {\n  content: \"\\e623\";\n}\n\n.iconxxxxxx-:before {\n  content: \"\\e609\";\n}\n\n.iconjifen2:before {\n  content: \"\\e795\";\n}\n\n.iconshangcheng:before {\n  content: \"\\e90b\";\n}\n\n.iconbianji:before {\n  content: \"\\e6b6\";\n}\n\n.iconjifen3:before {\n  content: \"\\e661\";\n}\n\n.iconchongzhi:before {\n  content: \"\\e82d\";\n}\n\n.iconyifabu:before {\n  content: \"\\e603\";\n}\n\n.iconbianji1:before {\n  content: \"\\e604\";\n}\n\n.iconzhengque:before {\n  content: \"\\e655\";\n}\n\n.icondianzan11:before {\n  content: \"\\e600\";\n}\n\n.icontougao:before {\n  content: \"\\e629\";\n}\n\n.iconcuowu:before {\n  content: \"\\e637\";\n}\n\n.iconshoucang2:before {\n  content: \"\\e605\";\n}\n\n.iconmima2:before {\n  content: \"\\e610\";\n}\n\n.icontougao-morenx:before {\n  content: \"\\e63a\";\n}\n\n.iconjifen4:before {\n  content: \"\\e606\";\n}\n\n.iconhuxiangguanzhu1:before {\n  content: \"\\e686\";\n}\n\n.icondianzan:before {\n  content: \"\\e60a\";\n}\n\n.iconxiugai1:before {\n  content: \"\\e62a\";\n}\n\n.iconzijin1:before {\n  content: \"\\e650\";\n}\n\n.icongouwuchekong:before {\n  content: \"\\e60d\";\n}\n\n.iconlipin:before {\n  content: \"\\e60e\";\n}\n\n.iconshoucang:before {\n  content: \"\\e614\";\n}\n\n.iconicon-:before {\n  content: \"\\e615\";\n}\n\n.iconhuxiangguanzhu2:before {\n  content: \"\\e68a\";\n}\n\n.iconyanjing1:before {\n  content: \"\\e7e2\";\n}\n\n.iconzhengque1:before {\n  content: \"\\e6b3\";\n}\n\n.iconrizhi:before {\n  content: \"\\e627\";\n}\n\n.iconshoucang1:before {\n  content: \"\\e617\";\n}\n\n.iconyituihui:before {\n  content: \"\\e624\";\n}\n\n.iconshangyibu:before {\n  content: \"\\e786\";\n}\n\n.iconhuiyuan:before {\n  content: \"\\e618\";\n}\n\n.iconziliao1:before {\n  content: \"\\e736\";\n}\n\n.iconxiaoxi1:before {\n  content: \"\\e62b\";\n}\n\n.iconshanchu:before {\n  content: \"\\e619\";\n}\n\n.iconhuxiangguanzhu3:before {\n  content: \"\\e64d\";\n}\n\n.iconxinxi:before {\n  content: \"\\e628\";\n}\n\n.icongouwuche1:before {\n  content: \"\\e61c\";\n}\n\n.iconnaozhong1:before {\n  content: \"\\e68e\";\n}\n\n.icontuichu:before {\n  content: \"\\e74d\";\n}\n\n.iconziliao2:before {\n  content: \"\\e664\";\n}\n\n.iconshanchu-copy-copy:before {\n  content: \"\\e61d\";\n}\n\n.iconyanjing-guan:before {\n  content: \"\\e6d7\";\n}\n\n.iconxiaoxi2:before {\n  content: \"\\e670\";\n}\n\n.iconxiaoxi3:before {\n  content: \"\\e67a\";\n}\n\n.iconmima3:before {\n  content: \"\\e62c\";\n}\n\n.icontuichu1:before {\n  content: \"\\e636\";\n}\n\n.icondingdanguanli-:before {\n  content: \"\\e61e\";\n}\n\n.iconyiwancheng:before {\n  content: \"\\e61f\";\n}\n\n.icontuichu2:before {\n  content: \"\\e621\";\n}\n\n.iconziliao3:before {\n  content: \"\\e622\";\n}\n\n.iconwuneirong:before {\n  content: \"\\e62d\";\n}\n\n.iconweidenglu:before {\n  content: \"\\e648\";\n}\n\n.iconweidenglu1:before {\n  content: \"\\e62f\";\n}\n\n.iconcollect:before {\n  content: \"\\e630\";\n}\n\n.iconbingliziliao:before {\n  content: \"\\e631\";\n}\n\n.icongouwucheman:before {\n  content: \"\\e632\";\n}\n\n.iconfensi:before {\n  content: \"\\e633\";\n}\n\n.iconchaoshi:before {\n  content: \"\\e634\";\n}\n\n.icontuichu3:before {\n  content: \"\\e635\";\n}\n\n.iconzu:before {\n  content: \"\\e638\";\n}\n\n.icondenglu:before {\n  content: \"\\e639\";\n}\n\n.iconkaifazheshequicon-:before {\n  content: \"\\e673\";\n}\n\n.iconmima4:before {\n  content: \"\\e63c\";\n}\n\n.icondingdan:before {\n  content: \"\\e63e\";\n}\n\n.icondaishenhe2:before {\n  content: \"\\e63d\";\n}\n\n.iconwuneirong1:before {\n  content: \"\\e667\";\n}\n\n.iconziliao4:before {\n  content: \"\\e657\";\n}\n\n.iconshangcheng1:before {\n  content: \"\\e63f\";\n}\n\n.iconfensi1:before {\n  content: \"\\e640\";\n}\n\n.icontougaoshibai:before {\n  content: \"\\e653\";\n}\n\n.icontougaochenggong:before {\n  content: \"\\e65c\";\n}\n\n.iconhuiyuan-:before {\n  content: \"\\e65d\";\n}\n\n.iconshezhi2:before {\n  content: \"\\e641\";\n}\n\n.icondaishenhe1:before {\n  content: \"\\e643\";\n}\n\n.iconwodetougao:before {\n  content: \"\\e644\";\n}\n\n.iconyanjing2:before {\n  content: \"\\eb76\";\n}\n\n.iconyishanchukehu:before {\n  content: \"\\e649\";\n}\n\n.iconzhenggaotougao:before {\n  content: \"\\e645\";\n}\n\n.iconyituihui1:before {\n  content: \"\\e78a\";\n}\n\n.iconyifabu1:before {\n  content: \"\\e646\";\n}\n\n.icondaibandengdaishenhe:before {\n  content: \"\\e647\";\n}\n\n.iconbianji2:before {\n  content: \"\\e64a\";\n}\n\n"
  },
  {
    "path": "static/common/user/css/reset.css",
    "content": "/* reset.css */\nhtml,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul,li{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}\na{text-decoration: none;}\n/* reset.css */"
  },
  {
    "path": "static/common/user/css/user.css",
    "content": "/*\n * @Author: shu binqi \n * @Date: 2019-12-04 22:22:03 \n * @Last Modified by: shu binqi\n * @Last Modified time: 2019-12-07 18:30:09\n */\n\n/* 主题色 #007bff */\n/* ---------- 会员公用样式 ---------- */\nbody {\n  background: #f1f1f1;\n}\n* {\n  box-sizing: border-box;\n  font-family: \"\\5FAE\\8F6F\\96C5\\9ED1\", Arial, Helvetica, sans-serif !important;\n}\n.container {\n  max-width: 1200px;\n  margin: 0 auto;\n}\n.hidden-md {\n  display: none;\n}\n.hidden-sm {\n  display: block;\n}\nimg {\n  display: block;\n  max-width: 100%;\n}\n.fl {\n  float: left;\n}\n.fr {\n  float: right;\n}\nh4.head-title {\n  color: #242424;\n  font-size: 16px;\n  font-weight: 700;\n  text-align: center;\n  margin-bottom: 15px;\n  padding-bottom: 15px;\n  border-bottom: 1px solid #f1f1f1;\n}\n.clearfix:after { content: \".\"; display: block; height: 0; clear: both; visibility: hidden; }\n.clearfix { zoom: 1; }\n/* ---------- 会员公用样式 ---------- */\n/* ---------- 会员公共头部 ---------- */\nheader {\n  height: 55px;\n  background: #fff;\n  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n  margin-bottom: 20px;\n}\nheader .brand {\n  height: 55px;\n  float: left;\n}\nheader .brand a.logo {\n  line-height: 55px;\n  display: block;\n  color: #242424;\n  font-size: 14px;\n}\nheader .brand a.logo:hover {\n  color: #007bff;\n}\nheader .user-center {\n  float: right;\n}\n/* ----- 未登录状态导航 ----- */\nheader .unlogin li {\n  float: left;\n  height: 55px;\n  position: relative;\n}\nheader .unlogin li:first-child:after {\n  content: \"\";\n  width: 1px;\n  height: 15px;\n  position: absolute;\n  top: 20px;\n  right: -1px;\n  background: #ccc;\n}\nheader .unlogin li a {\n  color: #242424;\n  font-size: 14px;\n  display: block;\n  line-height: 55px;\n  padding: 0 15px;\n  margin-left: 5px;\n}\nheader .unlogin li a:hover {\n  color: #007bff;\n}\n/* ----- 未登录状态导航 ----- */\n/* ----- 登录状态导航 ----- */\nheader .user-login > li {\n  float: left;\n  height: 55px;\n  position: relative;\n  margin-left: 10px;\n}\nheader .user-login > li > a {\n  color: #242424;\n  display: block;\n  width: 55px;\n  line-height: 35px;\n  height: 55px;\n  padding: 10px 0;\n  position: relative;\n  text-align: center;\n}\nheader .user-login li i {\n  font-size: 28px;\n}\nheader .user-login li span {\n  font-size: 12px;\n  color: #fff;\n  height: 20px;\n  line-height: 20px;\n  border-radius: 10px;\n  padding: 0 6px;\n  background: #f4523b;\n  position: absolute;\n  right: 8px;\n  top: 10px;\n}\nheader .user-login > li:hover > a {\n  background: #242424;\n  color: #007bff;\n}\nheader .user-login li img {\n  height: 100%;\n  margin: 0 auto;\n}\nheader .user-login .user-icon:hover .user-menu {\n  display: block;\n}\nheader .user-login li .user-menu {\n  display: none;\n  position: absolute;\n  top: 55px;\n  right: 0;\n  background: #fff;\n  width: 160px;\n  border-radius: 0 0 5px 5px;\n  overflow: hidden;\n  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.15);\n  z-index: 99;\n}\n.user-menu li a {\n  color: #242424;\n  display: block;\n  width: 100%;\n  line-height: 35px;\n  padding: 5px 0;\n  position: relative;\n  text-align: center;\n}\n.user-menu li.bt1 {\n  border-top: 1px solid #e1e1e1;\n}\n.user-menu li:hover a {\n  background: #007bff;\n  color: #fff;\n}\n/* ----- 登录状态导航 ----- */\n/* ---------- 会员公共头部  ----------*/\n/* ---------- 会员公共内容  ----------*/\n.page {\n  min-height: 660px;\n}\n/* ---------- 会员左侧内容 ---------- */\n.user-left {\n  width: 220px;\n  margin-bottom: 20px;\n  float: left;\n}\n.user-left .user-card {\n  background: #fff;\n  border-radius: 5px;\n  overflow: hidden;\n  margin-bottom: 10px;\n  padding: 30px 0;\n}\n.user-left .user-card .img-box {\n  width: 100%;\n  margin-bottom: 15px;\n}\n.user-left .user-card .img-box img {\n  width: 80px;\n  margin: 0 auto;\n}\n.user-left .user-card .username-info {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.user-left .user-card .username-info a {\n  color: #242424;\n  font-size: 18px;\n  line-height: 24px;\n  font-weight: 700;\n}\n.user-left .user-card .username-info a:hover {\n  color: #007bff;\n}\n.user-left .user-card .autograph-info {\n  text-align: center;\n  color: #808080;\n  font-size: 12px;\n  line-height: 18px;\n  margin-bottom: 20px;\n}\n.user-left .user-card .btn-area {\n  padding: 0 20px;\n}\n.user-left .user-card .btn-area .btn-default {\n  display: block;\n  height: 40px;\n  line-height: 38px;\n  text-align: center;\n  width: 100%;\n  font-size: 14px;\n  border-radius: 5px;\n}\n.user-left .user-card .btn-area .btn-release {\n  color: #fff;\n  background: #007bff;\n  border: 1px solid #007bff;\n}\n.user-left .user-card .btn-area .btn-sign-out {\n  color: #666;\n  border: 1px solid #ccc;\n}\n.user-left .user-card .btn-area .btn-release:hover {\n  background: #005bbd;\n  border: 1px solid #005bbd;\n}\n.user-left .user-card .btn-area .btn-sign-out:hover {\n  color: #333;\n  border: 1px solid #333;\n}\n.user-left .user-list {\n  background: #fff;\n  border-radius: 5px;\n  overflow: hidden;\n  padding: 10px 0;\n}\n.user-left .user-list li {\n  text-align: center;\n  margin-bottom: 1px;\n}\n.user-left .user-list li:hover a,\n.user-left .user-list li.active a {\n  color: #fff;\n  background: #007bff;\n}\n.user-left .user-list li a {\n  display: block;\n  color: #242424;\n  font-size: 14px;\n  height: 45px;\n  line-height: 45px;\n}\n.user-list a.bt1 {\n  border-top: 1px solid #e1e1e1;\n}\n/* ---------- 会员左侧内容 ---------- */\n/* ---------- 会员右侧内容 ---------- */\n.user-right {\n  padding-left: 240px;\n}\n.user-right .user-tips {\n  height: auto;\n  background: #fff;\n  border-radius: 5px;\n  padding: 8px 15px;\n  margin-bottom: 10px;\n}\n.user-right .user-tips p {\n  line-height: 24px;\n  color: #808080;\n  font-size: 14px;\n}\n.user-content {\n  background: #fff;\n  border-radius: 5px;\n  padding: 15px;\n  margin-bottom: 10px;\n}\n.user-data h2,\n.user-content h2 {\n  color: #242424;\n  font-size: 20px;\n  line-height: 30px;\n  font-weight: 700;\n  padding: 0 10px 5px 15px;\n  border-bottom: 1px solid #e1e1e1;\n  margin-bottom: 20px;\n  position: relative;\n}\n.user-data h2:after,\n.user-content h2:after {\n  content: \"\";\n  width: 2px;\n  height: 26px;\n  background: #007bff;\n  position: absolute;\n  left: 0;\n  top: 3px;\n}\n.user-content .login-tips p {\n  text-align: center;\n}\n.user-content .login-tips i {\n  color: #999;\n  font-size: 200px;\n  display: block;\n  line-height: 300px;\n  text-align: center;\n}\n.user-content .user-tab {\n  display: flex;\n  flex-wrap: wrap;\n}\n.user-content .user-tab .num {\n  width: 25%;\n  padding: 20px 0;\n}\n.user-tab .num a {\n  color: #242424;\n}\n.user-tab .num a:hover {\n  color: #007bff;\n}\n.user-tab .num h4 {\n  font-size: 20px;\n  line-height: 30px;\n  font-weight: 700;\n  text-align: center;\n}\n.user-tab .num p {\n  font-size: 14px;\n  line-height: 20px;\n  text-align: center;\n}\n/* ---------- 会员右侧内容 ---------- */\n.user-data {\n  background: #fff;\n  border-radius: 5px;\n  padding: 20px 15px;\n  margin-bottom: 10px;\n}\n.user-data p {\n  border-bottom: 1px solid #f1f1f1;\n  margin-bottom: 10px;\n  padding-bottom: 10px;\n  display: flex;\n}\n.user-data p span {\n  line-height: 30px;\n  font-size: 14px;\n}\n.user-data p span:first-child {\n  min-width: 86px;\n  text-align: right;\n}\n/* ---------- 会员右侧内容 ---------- */\n/* ---------- 会员公共底部 ---------- */\nfooter {\n  padding: 30px 0;\n  background: #fff;\n}\n.copyright {\n  line-height: 30px;\n}\n.copyright p {\n  font-size: 12px;\n  line-height: 30px;\n  text-align: center;\n  color: #2c2c2c;\n}\n.copyright p span {\n  margin: 0 5px;\n}\n.copyright p a {\n  color: #2c2c2c;\n}\n.copyright p a:hover {\n  color: #007bff;\n}\n/* ---------- 会员公共底部 ---------- */\n/* ---------- 会员修改信息 ---------- */\n.user-form .form-control {\n  min-height: 36px;\n  margin-bottom: 10px;\n  display: flex;\n}\n.user-form .form-control > span {\n  display: inline-block;\n  color: #242424;\n  font-size: 14px;\n  text-align: right;\n  line-height: 36px;\n  min-width: 100px;\n}\n.user-form .form-control label {\n  color: #242424;\n  font-size: 14px;\n  text-align: right;\n  line-height: 36px;\n  min-width: 100px;\n  padding-right: 10px;\n}\n.user-form .form-control > input,.user-form .form-control > select {\n  width: 300px;\n  color: #666;\n  font-size: 14px;\n  line-height: 36px;\n  padding: 0 10px;\n  border: 1px solid #e1e1e1;\n  border-radius: 2px;\n}\n.user-form .form-control > input[type='submit'] {\n  color: #666;\n  font-size: 14px;\n  line-height: 36px;\n  padding: 0 26px;\n  background: #e1e1e1;\n  border: 1px solid #e1e1e1;\n  border-radius: 2px;\n  cursor: pointer;\n}\n.user-form .form-control > input[type='submit']:hover {\n  color: #fff;\n  background: #007bff;\n  border: 1px solid #007bff;\n}\n.user-form .form-control > textarea {\n  width: 100%;\n  height: 120px;\n  line-height: 24px;\n  padding: 5px 10px;\n  border: 1px solid #e1e1e1;\n  border-radius: 2px;\n  resize: none;\n}\n.user-form .check-box {\n  line-height: 36px;\n}\n.user-form .check-box input[type='checkbox'],\n.user-form .check-box input[type='radio'] {\n  transform: translateY(5px);\n  margin-right: 10px;\n}\n/* ----- 密码查看 ----- */\n.form-password {\n  width: 300px;\n  position: relative;\n}\n.form-password input {\n  width: 300px;\n  color: #666;\n  font-size: 14px;\n  line-height: 36px;\n  padding: 0 10px;\n  border: 1px solid #e1e1e1;\n}\n.form-password i {\n  position: absolute;\n  color: #333;\n  width: 30px;\n  height: 36px;\n  line-height: 36px;\n  text-align: center;\n  right: 0;\n  top: 0;\n  cursor: pointer;\n}\n.form-password i.iconyanjing-guan {\n  display: none;\n}\n.form-password i.iconyanjing {\n  display: block;\n}\n/* ---------- 会员修改信息 表单 ---------- */\n\n/* ----- input单选，多选，开关 ----- */\n@supports (-webkit-appearance: none) or (-moz-appearance: none) {\n  input[type='checkbox'],\n  input[type='radio'] {\n    --active: #007bff;\n    --active-inner: #fff;\n    --input-border: #CDD9ED;\n    --input-border-hover: #23C4F8;\n    --background: #fff;\n    --disabled: #F5F9FF;\n    --disabled-inner: #E4ECFA;\n    --shadow-inner: rgba(18, 22, 33, .1);\n    height: 21px;\n    outline: none;\n    position: relative;\n    -webkit-appearance: none;\n    -moz-appearance: none;\n    margin: 0;\n    padding: 0;\n    box-shadow: none;\n    cursor: pointer;\n    height: 21px;\n    border: 1px solid var(--input-border);\n    background: var(--background);\n    transition: background .3s ease, border-color .3s ease;\n  }\n  input[type='checkbox']:after,\n  input[type='radio']:after {\n    content: '';\n    display: block;\n    left: 0;\n    top: 0;\n    position: absolute;\n    transition: opacity .2s ease, -webkit-transform .3s ease, -webkit-filter .3s ease;\n    transition: transform .3s ease, opacity .2s ease, filter .3s ease;\n    transition: transform .3s ease, opacity .2s ease, filter .3s ease, -webkit-transform .3s ease, -webkit-filter .3s ease;\n  }\n  input[type='checkbox']:checked,\n  input[type='radio']:checked {\n    background: var(--active);\n    border-color: var(--active);\n  }\n  input[type='checkbox']:checked:after,\n  input[type='radio']:checked:after {\n    -webkit-filter: drop-shadow(0 1px 2px var(--shadow-inner));\n            filter: drop-shadow(0 1px 2px var(--shadow-inner));\n    transition: opacity 0.3s ease, -webkit-filter 0.3s ease, -webkit-transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2);\n    transition: opacity 0.3s ease, filter 0.3s ease, transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2);\n    transition: opacity 0.3s ease, filter 0.3s ease, transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2), -webkit-filter 0.3s ease, -webkit-transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2);\n  }\n  input[type='checkbox']:disabled,\n  input[type='radio']:disabled {\n    cursor: not-allowed;\n    opacity: .9;\n    background: var(--disabled);\n  }\n  input[type='checkbox']:disabled:checked,\n  input[type='radio']:disabled:checked {\n    background: var(--disabled-inner);\n    border-color: var(--input-border);\n  }\n  input[type='checkbox']:hover:not(:checked):not(:disabled),\n  input[type='radio']:hover:not(:checked):not(:disabled) {\n    border-color: var(--input-border-hover);\n  }\n  input[type='checkbox']:not(.switch),\n  input[type='radio']:not(.switch) {\n    width: 21px;\n  }\n  input[type='checkbox']:not(.switch):after,\n  input[type='radio']:not(.switch):after {\n    opacity: 0;\n  }\n  input[type='checkbox']:not(.switch):checked:after,\n  input[type='radio']:not(.switch):checked:after {\n    opacity: 1;\n  }\n\n  input[type='checkbox']:not(.switch) {\n    border-radius: 6px;\n  }\n  input[type='checkbox']:not(.switch):after {\n    width: 5px;\n    height: 9px;\n    border: 2px solid var(--active-inner);\n    border-top: 0;\n    border-left: 0;\n    left: 6px;\n    top: 2px;\n    -webkit-transform: rotate(20deg);\n            transform: rotate(20deg);\n  }\n  input[type='checkbox']:not(.switch):checked:after {\n    -webkit-transform: rotate(43deg);\n            transform: rotate(43deg);\n  }\n  input[type='checkbox'].switch {\n    width: 38px;\n    border-radius: 11px;\n  }\n  input[type='checkbox'].switch:after {\n    left: 2px;\n    top: 2px;\n    border-radius: 50%;\n    width: 15px;\n    height: 15px;\n    background: var(--input-border);\n  }\n  input[type='checkbox'].switch:checked:after {\n    background: var(--active-inner);\n    -webkit-transform: translateX(17px);\n            transform: translateX(17px);\n  }\n  input[type='checkbox'].switch:disabled:not(:checked):after {\n    opacity: .6;\n  }\n\n  input[type='radio'] {\n    border-radius: 50%;\n  }\n  input[type='radio']:after {\n    width: 19px;\n    height: 19px;\n    border-radius: 50%;\n    background: var(--active-inner);\n    opacity: 0;\n    -webkit-transform: scale(0.7);\n            transform: scale(0.7);\n  }\n  input[type='radio']:checked:after {\n    background: var(--active-inner);\n    -webkit-transform: scale(0.5);\n            transform: scale(0.5);\n  }\n}\n/* ----- input单选，多选，开关 ----- */\n/* ----- 列表页通用tab ----- */\n.common-tab {\n  display: flex;\n  flex-wrap: wrap;\n  margin-bottom: 10px;\n  background: #fff;\n  border-radius: 5px;\n  padding: 0 15px;\n}\n.common-tab h2 {\n  width: 100%;\n}\n.common-tab h2 a {\n  display: inline-block;\n  color: #242424;\n  font-size: 16px;\n  font-weight: 700;\n  line-height: 46px;\n  height: 46px;\n  margin-right: 15px;\n  padding: 0 10px;\n}\n.common-tab h2 a.active {\n  color: #007bff;\n  border-bottom: 3px solid #007bff;\n}\n.common-tab h2 a.btn-info {\n  height: 36px;\n  line-height: 36px;\n  font-size: 14px;\n  color: #fff;\n  text-align: center;\n  background: #007bff;\n  font-weight: 400;\n  margin-right: 0;\n  padding: 0 20px;\n  border-radius: 3px;\n}\n.common-tab h2 a.btn-info:hover {\n  background: #005bbd;\n}\n.common-tab h2 .btn-release {\n  float: right;\n  margin-top: 5px;\n}\n/* ----- 列表页通用tab ----- */\n/* ---------- 关注列表 ---------- */\n.follow-list1 {\n  display: flex;\n  flex-wrap: wrap;\n  margin-bottom: 10px;\n  margin: 0 -5px;\n}\n.follow-list1 li {\n  width: 25%;\n  padding: 0 5px;\n  margin-bottom: 10px;\n}\n.follow-list1 li .follow-list-item {\n  background: #fff;\n  border-radius: 5px;\n  padding: 20px;\n  position: relative;\n}\n.follow-list-item .img-box {\n  margin-bottom: 15px;\n}\n/* ----- 互相关注 ----- */\n.each-other {\n  color: #007bff;\n  font-size: 12px;\n  height: 24px;\n  line-height: 22px;\n  position: absolute;\n  right: 10px;\n  top: 10px;\n  padding: 0 8px;\n  border-radius: 20px;\n  border: 1px solid #007bff;\n}\n/* ----- 互相关注 ----- */\n.follow-list-item img {\n  width: 80px;\n  margin: 0 auto;\n  border-radius: 50%;\n  overflow: hidden;\n}\n.follow-list-item h4 {\n  color: #242424;\n  font-size: 18px;\n  font-weight: 700;\n  line-height: 30px;\n  text-align: center;\n}\n.follow-list-item p {\n  color: #808080;\n  font-size: 12px;\n  line-height: 30px;\n  text-align: center;\n  margin-bottom: 10px;\n}\n.follow-list-item a {\n  display: block;\n  width: 100%;\n  height: 40px;\n  line-height: 38px;\n  text-align: center;\n  border: 1px solid #e1e1e1;\n  color: #666;\n  font-size: 14px;\n  border-radius: 5px;\n}\n.follow-list-item a:hover {\n  color: #fff;\n  background: #007bff;\n  border: 1px solid #007bff;\n}\n/* ---------- 关注列表 ---------- */\n/* ---------- table表格列表 ---------- */\n.release-table {\n  background: #fff;\n  border-radius: 5px;\n  padding: 15px;\n}\ntable {\n  width: 100%;\n  margin-bottom: 10px;\n  white-space: nowrap;\n}\n/* ----- 表格滚动条 ----- */\n.table-scroll {\n  width:100%;\n  overflow-x:auto;\n  overflow-y: hidden;\n}\n.table-scroll::-webkit-scrollbar {\n  width: 10px;\n  height: 6px;\n}\n.table-scroll::-webkit-scrollbar-thumb {\n  -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);\n  background: #535353;\n}\n.table-scroll::-webkit-scrollbar-track {\n  -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);\n  background: #e1e1e1;\n}\n/* ----- 表格滚动条 ----- */\ntr {\n  border: 1px solid #f1f1f1;\n}\ntr td,\ntr th {\n  padding: 12px 15px;\n  font-size: 14px;\n  text-align: center;\n}\ntr th {\n  font-weight: 700;\n}\ntable span.btn-table {\n  display: inline-block;\n  font-size: 12px;\n  line-height: 22px;\n  height: 24px;\n  text-align: center;\n  padding: 0 6px;\n  border-radius: 2px;\n}\ntable a.title {\n  color: #242424;\n  font-size: 14px;\n  font-weight: 700;\n}\ntable a.title:hover {\n  color: #0069d9;\n}\n/* ----------- table表格列表 ---------- */\n\n/* ----- 按钮集合 ----- */\na.btn-check {\n  display: inline-block;\n  font-size: 12px;\n  text-align: center;\n  padding: 6px 8px;\n  border-radius: 2px;\n  color: #fff;\n  background: #138496;\n  border: 1px solid #138496;\n  margin-right: 5px;\n}\na.btn-add {\n  display: inline-block;\n  font-size: 12px;\n  text-align: center;\n  padding: 6px 8px;\n  border-radius: 2px;\n  color: #fff;\n  background: #0069d9;\n  border: 1px solid #0069d9;\n  margin-right: 5px;\n}\na.btn-edit {\n  display: inline-block;\n  font-size: 12px;\n  text-align: center;\n  padding: 6px 8px;\n  border-radius: 2px;\n  color: #fff;\n  background: #218838;\n  border: 1px solid #218838;\n  margin-right: 5px;\n}\na.btn-delete {\n  display: inline-block;\n  font-size: 12px;\n  text-align: center;\n  padding: 6px 8px;\n  border-radius: 2px;\n  color: #fff;\n  background: #c82333;\n  border: 1px solid #c82333;\n}\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border: 1px solid #f8f9fa;\n}\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border: 1px solid #e2e6ea;\n}\n.btn-lg {\n  display: inline-block;\n  font-size: 12px;\n  line-height: 28px;\n  height: 30px;\n  text-align: center;\n  padding: 0 10px;\n  border-radius: 3px;\n}\n.btn-sm,\n.btn-table {\n  display: inline-block;\n  font-size: 12px;\n  line-height: 22px;\n  height: 24px;\n  text-align: center;\n  padding: 0 6px;\n  border-radius: 2px;\n}\n.btn-success {\n  color: #218838;\n  border: 1px solid #218838;\n  transition: all .5s;\n}\n.btn-danger {\n  color: #c82333;\n  border: 1px solid #c82333;\n  transition: all .5s;\n}\n.btn-info {\n  color: #0069d9;\n  border: 1px solid #0069d9;\n  transition: all .5s;\n}\n.btn-warning {\n  color: #ffc107;\n  border: 1px solid #ffc107;\n  transition: all .5s;\n}\n.btn-primary {\n  color: #138496;\n  border: 1px solid #138496;\n  transition: all .5s;\n}\n/* ----- 按钮集合 ----- */\n\n/* ----- 分页通用 ----- */\n.pagebar-common {\n  background: #fff;\n  border-radius: 5px;\n  padding: 5px 10px;\n  margin-top: 10px;\n}\n.pagebar-common .pagination {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n}\n.pagebar-common .pagination li {\n  margin: 0 4px;\n}\n.pagebar-common .pagination li a {\n  display: block;\n  font-size: 12px;\n  line-height: 30px;\n  padding: 0 8px;\n  color: #808080;\n  background: #f1f1f1;\n  border-radius: 3px;\n}\n.pagebar-common .pagination li:hover a,\n.pagebar-common .pagination li.active a {\n  color: #fff;\n  background: #0069d9;\n}\n/* ----- 分页通用 ----- */\n\n/* ----------- 交易记录 ---------- */\n.shop-record-list {\n  background: #fff;\n  border-radius: 5px;\n}\n.release-table {\n  margin-bottom: 10px;\n}\n.shop-record-list li {\n  margin-bottom: 0;\n}\n.shop-record-list .record-item {\n  padding: 15px;\n  background: #fff;\n  border-radius: 5px;\n  transition: all .5s;\n  border-bottom: 1px solid #f1f1f1;\n}\n.shop-record-list .record-item:hover {\n  background: #f1f1f1;\n}\n.record-item p {\n  color: #242424;\n  font-size: 14px;\n  line-height: 30px;\n  margin-bottom: 5px;\n}\n.record-item p a {\n  color: #242424;\n  font-size: 14px;\n  line-height: 30px;\n  margin-bottom: 5px;\n}\n.record-item p a:hover {\n  color: #007bff;\n}\n.record-item p span {\n  margin-top: 3px;\n}\n.record-item h4 {\n  font-size: 18px;\n  font-weight: 700;\n  line-height: 30px;\n}\n.record-item h4 a.change,\n.record-item h4 a.btn-more {\n  display: inline-block;\n  height: 30px;\n  line-height: 28px;\n  color: #fff;\n  font-size: 14px;\n  font-weight: 400;\n  border-radius: 3px;\n  padding: 0 12px;\n  transition: all .5s;\n}\n.record-item h4 a.change {\n  background: #c82333;\n  border: 1px solid #c82333;\n  margin-right: 5px;\n}\n.record-item h4 a.btn-more {\n  background: #007bff;\n  border: 1px solid #007bff;\n}\n.record-item h4 a.btn-more:hover {\n  background: #005bbd;\n  border: 1px solid #005bbd;\n}\n.record-item h4 a.change:hover {\n  background: #6d040f;\n  border: 1px solid #6d040f;\n}\n.text-info {\n  color: #007bff;\n}\n/* ----------- 交易记录 ---------- */\n/* ----------- 订单详情 ---------- */\n.order-details {\n  background: #fff;\n  border-radius: 5px;\n  padding: 15px;\n  margin-bottom: 10px;\n}\n.display-flex-order {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: flex-end;\n}\n.order-left {\n  flex: 1;\n  margin-right: 15px;\n}\n.order-list {\n  width: 100%;\n}\n.order-list li {\n  margin-bottom: 15px;\n  border-bottom: 1px solid #e1e1e1;\n  padding-bottom: 15px;\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: center;\n}\n.order-list li:last-child {\n  margin-bottom: 0;\n  border-bottom: 0;\n  padding-bottom: 0;\n}\n.order-item {\n  display: flex;\n  flex-wrap: wrap;\n}\n.order-item .img-box {\n  height: 120px;\n  max-width: 160px;\n  margin-right: 15px;\n  overflow: hidden;\n}\n.order-item .img-box img {\n  min-width: 100%;\n  height: 100%;\n}\n.order-item h4 {\n  font-size: 14px;\n  font-weight: 700;\n  line-height: 30px;\n}\n.order-item h4 a {\n  color: #242424;\n}\n.order-item h4 a:hover {\n  color: #007bff;\n}\n.order-item p {\n  color: #808080;\n  font-size: 12px;\n  line-height: 30px;\n}\n.order-item-right {\n  display: flex;\n}\n.order-number,\n.order-money {\n  width: 150px;\n}\n.order-number p {\n  color: #666;\n  font-size: 12px;\n  line-height: 20px;\n  text-align: center;\n}\n.order-money p {\n  color: #666;\n  font-size: 12px;\n  line-height: 20px;\n  text-align: center;\n}\n.price {\n  color: #007bff;\n  font-weight: 700;\n}\n.order-right {\n  margin-top: 15px;\n}\n.order-right button {\n  display: block;\n  height: 36px;\n  line-height: 34px;\n  color: #fff;\n  font-size: 14px;\n  font-weight: 400;\n  background: #007bff;\n  border: 1px solid #007bff;\n  border-radius: 3px;\n  padding: 0 36px;\n  transition: all .5s;\n  margin-top: 10px;\n  margin: 10px auto 0 auto;\n  cursor: pointer;\n}\n.order-right .summary {\n  width: 250px;\n  background: #f7fbff;\n  padding: 15px;\n}\n.summary h3 {\n  color: #242424;\n  font-size: 14px;\n  font-weight: 700;\n  line-height: 30px;\n  text-align: center;\n}\n.summary h4 {\n  color: #808080;\n  font-size: 14px;\n  line-height: 28px;\n}\n.summary h4 span:last-child {\n  font-weight: 700;\n}\n/* ---------- 订单详情 ---------- */\n.order-left .information {\n  width: 100%;\n  background: #f7fbff;\n  padding: 15px;\n}\n.information label{\n  display: block;\n\n}\n.information input {\n    width: 240px;\n    height: 40px;\n    line-height: 40px;\n}\n\n.information h3 {\n  color: #242424;\n  font-size: 14px;\n  font-weight: 700;\n  line-height: 30px;\n  text-align: center;\n}\n.information h4 {\n  color: #808080;\n  font-size: 14px;\n  line-height: 28px;\n}\n.information h4 span:last-child {\n  font-weight: 700;\n}\n.payment a{\n  display: inline-block;\n    width: 45%;\n}\n/* ---------- 我的钱包主页 ---------- */\n.wallet {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  background: #fff;\n  border-radius: 5px;\n  padding: 15px;\n  margin-bottom: 10px;\n}\n.wallet-right {\n  padding-left: 15px;\n  border-left: 1px solid #f1f1f1;\n}\n.wallet-right h4 {\n  color: #242424;\n  font-size: 14px;\n  font-weight: 700;\n  line-height: 30px;\n}\n.wallet-right p {\n  color: #808080;\n  font-size: 12px;\n  line-height: 20px;\n}\n.wallet-right p span {\n  color: #242424;\n  display: inline-block;\n  font-weight: 700;\n  min-width: 20px;\n}\n.wallet-left {\n  flex: 1;\n  padding-right: 15px;\n}\n.wallet-rmb {\n  width: 100%;\n  padding: 18px 15px 15px;\n  color: #fff;\n  background-image: linear-gradient(to right,#4b85f0, #4650ef);\n  border-radius: 5px;\n  margin-bottom: 10px;\n}\n.wallet-rmb p,\n.wallet-jifen p {\n  font-size: 12px;\n}\n.mb10 {\n  margin-bottom: 10px;\n}\n.wallet-rmb h4,\n.wallet-jifen h4 {\n  font-size: 24px;\n  line-height: 36px;\n  margin-bottom: 10px;\n}\n.wallet-rmb h4 a,\n.wallet-jifen h4 a {\n  color: #fff;\n  float: right;\n  font-size: 14px;\n  line-height: 36px;\n}\n.wallet-rmb h4 i,\n.wallet-jifen h4 i {\n  font-size: 14px;\n}\n.wallet-jifen {\n  width: 100%;\n  padding: 18px 15px 15px;\n  color: #fff;\n  background-image: linear-gradient(to right,#fb7205, #eb3f33);\n  border-radius: 5px;\n}\n/* ---------- 我的钱包主页 ---------- */\n\n/* ---------- 响应式调节 ---------- */\n@media screen and (max-width:768px) {\n  .container {\n    width: 100%;\n    padding: 0 10px;\n  }\n  .hidden-sm {\n    display: none;\n  }\n  .hidden-md {\n    display: block;\n  }\n  .user-right {\n    padding-left: 0;\n  }\n  .user-form .form-control > span,\n  .user-form .form-control > label {\n    min-width: 80px;\n  }\n  .form-password input {\n    width: 100%;\n  }\n  .follow-list1 {\n    margin: 0 -5px;\n  }\n  .follow-list1 li {\n    width: 50%;\n    padding: 0 5px;\n  }\n  .order-right {\n    width: 100%;\n  }\n  .order-right .summary {\n    width: 100% !important;\n  }\n  .order-list .order-item .img-box {\n    height: 60px;\n  }\n  .order-item-right {\n    margin-top: 10px;\n  }\n  .wallet .wallet-left {\n    padding-right: 0;\n  }\n  .wallet .wallet-right {\n    width: 100%;\n    margin-top: 10px;    \n    padding-left: 0;\n    border-left: 0;\n  }\n}\n.order-title {\n    width: 190px;\n}"
  },
  {
    "path": "static/common/user/js/jquery.min-1.10.2.js",
    "content": "/*!\n * jQuery JavaScript Library v3.5.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-04-10T15:07Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.5.0\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.5\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2020-03-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = Object.create( null );\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = parseInt( trStyle.height ) > 3;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t} );\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "static/common/user/js/user.js",
    "content": "/*\n * @Author: shu binqi \n * @Date: 2019-12-05 00:18:54 \n * @Last Modified by: shu binqi\n * @Last Modified time: 2019-12-05 00:19:04\n */\n// 密码显示隐藏\n$(document).ready(function(){\n  $(\".iconyanjing\").click(function(){\n    $(\".password1\").attr(\"type\",\"text\");\n    $(\".iconyanjing\").hide();\n    $(\".iconyanjing-guan\").show();\n  });\n  $(\".iconyanjing-guan\").click(function(){\n    $(\".password1\").attr(\"type\",\"password\");\n    $(\".iconyanjing-guan\").hide();\n    $(\".iconyanjing\").show();\n  });\n});\n\n$(function(){\n\t\n\tvar interval =  setInterval(function(){\n\t$.ajax({\n\t\t url:\"/common/updateactive\",\n\t\t dataType:\"json\",\n\t\t async:true,\n\t\t type:\"GET\",\n\t\t success:function(r){\n\t\t }\n\t})\n\t},30000);\n\tvar interval2 =  setInterval(function(){\n\t$.ajax({\n\t\t url:\"/user/getmsg\",\n\t\t async:true,\n\t\t type:\"GET\",\n\t\t success:function(r){\n\t\t\tvar n = parseInt(r);\n\t\t\tif(n>0){\n\t\t\t$(\"#notifiy-icon\").addClass('new-notification')\n\t\t\t}else{\n\t\t\t$(\"#notifiy-icon\").removeClass('new-notification')\n\t\t\t}\n\t\t\t$(\"#notifiy-num\").html(n);\n\t\t\t\n\t\t }\n\t})\n\t},30000);\n\n\n })\n\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/anchor/anchor.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n    \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n        <title></title>\n        <style type=\"text/css\">\n            *{color: #838383;margin: 0;padding: 0}\n            html,body {font-size: 12px;overflow: hidden; }\n            .content{padding:5px 0 0 15px;}\n            input{width:210px;height:21px;line-height:21px;margin-left: 4px;}\n        </style>\n    </head>\n    <body>\n        <div class=\"content\">\n            <span><var id=\"lang_input_anchorName\"></var></span><input id=\"anchorName\"  value=\"\" />\n        </div>\n        <script type=\"text/javascript\" src=\"../internal.js\"></script>\n        <script type=\"text/javascript\">\n            var anchorInput = $G('anchorName'),\n                node = editor.selection.getRange().getClosedNode();\n            if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){\n                anchorInput.value = node;\n            }\n            anchorInput.onkeydown = function(evt){\n                evt = evt || window.event;\n                if(evt.keyCode == 13){\n                    editor.execCommand('anchor', anchorInput.value);\n                    dialog.close();\n                    domUtils.preventDefault(evt)\n                }\n            };\n            dialog.onok = function (){\n                editor.execCommand('anchor', anchorInput.value);\n                dialog.close();\n            };\n            $focus(anchorInput);\n        </script>\n    </body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/attachment/attachment.css",
    "content": "@charset \"utf-8\";\n/* dialog样式 */\n.wrapper {\n    zoom: 1;\n    width: 630px;\n    *width: 626px;\n    height: 380px;\n    margin: 0 auto;\n    padding: 10px;\n    position: relative;\n    font-family: sans-serif;\n}\n\n/*tab样式框大小*/\n.tabhead {\n    float:left;\n}\n.tabbody {\n    width: 100%;\n    height: 346px;\n    position: relative;\n    clear: both;\n}\n\n.tabbody .panel {\n    position: absolute;\n    width: 0;\n    height: 0;\n    background: #fff;\n    overflow: hidden;\n    display: none;\n}\n\n.tabbody .panel.focus {\n    width: 100%;\n    height: 346px;\n    display: block;\n}\n\n/* 上传附件 */\n.tabbody #upload.panel {\n    width: 0;\n    height: 0;\n    overflow: hidden;\n    position: absolute !important;\n    clip: rect(1px, 1px, 1px, 1px);\n    background: #fff;\n    display: block;\n}\n\n.tabbody #upload.panel.focus {\n    width: 100%;\n    height: 346px;\n    display: block;\n    clip: auto;\n}\n\n#upload .queueList {\n    margin: 0;\n    width: 100%;\n    height: 100%;\n    position: absolute;\n    overflow: hidden;\n}\n\n#upload p {\n    margin: 0;\n}\n\n.element-invisible {\n    width: 0 !important;\n    height: 0 !important;\n    border: 0;\n    padding: 0;\n    margin: 0;\n    overflow: hidden;\n    position: absolute !important;\n    clip: rect(1px, 1px, 1px, 1px);\n}\n\n#upload .placeholder {\n    margin: 10px;\n    border: 2px dashed #e6e6e6;\n    *border: 0px dashed #e6e6e6;\n    height: 172px;\n    padding-top: 150px;\n    text-align: center;\n    background: url(./images/image.png) center 70px no-repeat;\n    color: #cccccc;\n    font-size: 18px;\n    position: relative;\n    top:0;\n    *top: 10px;\n}\n\n#upload .placeholder .webuploader-pick {\n    font-size: 18px;\n    background: #00b7ee;\n    border-radius: 3px;\n    line-height: 44px;\n    padding: 0 30px;\n    *width: 120px;\n    color: #fff;\n    display: inline-block;\n    margin: 0 auto 20px auto;\n    cursor: pointer;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n}\n\n#upload .placeholder .webuploader-pick-hover {\n    background: #00a2d4;\n}\n\n\n#filePickerContainer {\n    text-align: center;\n}\n\n#upload .placeholder .flashTip {\n    color: #666666;\n    font-size: 12px;\n    position: absolute;\n    width: 100%;\n    text-align: center;\n    bottom: 20px;\n}\n\n#upload .placeholder .flashTip a {\n    color: #0785d1;\n    text-decoration: none;\n}\n\n#upload .placeholder .flashTip a:hover {\n    text-decoration: underline;\n}\n\n#upload .placeholder.webuploader-dnd-over {\n    border-color: #999999;\n}\n\n#upload .filelist {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n    overflow-x: hidden;\n    overflow-y: auto;\n    position: relative;\n    height: 300px;\n}\n\n#upload .filelist:after {\n    content: '';\n    display: block;\n    width: 0;\n    height: 0;\n    overflow: hidden;\n    clear: both;\n}\n\n#upload .filelist li {\n    width: 113px;\n    height: 113px;\n    background: url(./images/bg.png);\n    text-align: center;\n    margin: 9px 0 0 9px;\n    *margin: 6px 0 0 6px;\n    position: relative;\n    display: block;\n    float: left;\n    overflow: hidden;\n    font-size: 12px;\n}\n\n#upload .filelist li p.log {\n    position: relative;\n    top: -45px;\n}\n\n#upload .filelist li p.title {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    top: 5px;\n    text-indent: 5px;\n    text-align: left;\n}\n\n#upload .filelist li p.progress {\n    position: absolute;\n    width: 100%;\n    bottom: 0;\n    left: 0;\n    height: 8px;\n    overflow: hidden;\n    z-index: 50;\n    margin: 0;\n    border-radius: 0;\n    background: none;\n    -webkit-box-shadow: 0 0 0;\n}\n\n#upload .filelist li p.progress span {\n    display: none;\n    overflow: hidden;\n    width: 0;\n    height: 100%;\n    background: #1483d8 url(./images/progress.png) repeat-x;\n\n    -webit-transition: width 200ms linear;\n    -moz-transition: width 200ms linear;\n    -o-transition: width 200ms linear;\n    -ms-transition: width 200ms linear;\n    transition: width 200ms linear;\n\n    -webkit-animation: progressmove 2s linear infinite;\n    -moz-animation: progressmove 2s linear infinite;\n    -o-animation: progressmove 2s linear infinite;\n    -ms-animation: progressmove 2s linear infinite;\n    animation: progressmove 2s linear infinite;\n\n    -webkit-transform: translateZ(0);\n}\n\n@-webkit-keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n@-moz-keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n@keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n#upload .filelist li p.imgWrap {\n    position: relative;\n    z-index: 2;\n    line-height: 113px;\n    vertical-align: middle;\n    overflow: hidden;\n    width: 113px;\n    height: 113px;\n\n    -webkit-transform-origin: 50% 50%;\n    -moz-transform-origin: 50% 50%;\n    -o-transform-origin: 50% 50%;\n    -ms-transform-origin: 50% 50%;\n    transform-origin: 50% 50%;\n\n    -webit-transition: 200ms ease-out;\n    -moz-transition: 200ms ease-out;\n    -o-transition: 200ms ease-out;\n    -ms-transition: 200ms ease-out;\n    transition: 200ms ease-out;\n}\n#upload .filelist li p.imgWrap.notimage {\n    margin-top: 0;\n    width: 111px;\n    height: 111px;\n    border: 1px #eeeeee solid;\n}\n#upload .filelist li p.imgWrap.notimage i.file-preview {\n    margin-top: 15px;\n}\n\n#upload .filelist li img {\n    width: 100%;\n}\n\n#upload .filelist li p.error {\n    background: #f43838;\n    color: #fff;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    height: 28px;\n    line-height: 28px;\n    width: 100%;\n    z-index: 100;\n    display:none;\n}\n\n#upload .filelist li .success {\n    display: block;\n    position: absolute;\n    left: 0;\n    bottom: 0;\n    height: 40px;\n    width: 100%;\n    z-index: 200;\n    background: url(./images/success.png) no-repeat right bottom;\n    background-image: url(./images/success.gif) \\9;\n}\n\n#upload .filelist li.filePickerBlock {\n    width: 113px;\n    height: 113px;\n    background: url(./images/image.png) no-repeat center 12px;\n    border: 1px solid #eeeeee;\n    border-radius: 0;\n}\n#upload .filelist li.filePickerBlock div.webuploader-pick  {\n    width: 100%;\n    height: 100%;\n    margin: 0;\n    padding: 0;\n    opacity: 0;\n    background: none;\n    font-size: 0;\n}\n\n#upload .filelist div.file-panel {\n    position: absolute;\n    height: 0;\n    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \\0;\n    background: rgba(0, 0, 0, 0.5);\n    width: 100%;\n    top: 0;\n    left: 0;\n    overflow: hidden;\n    z-index: 300;\n}\n\n#upload .filelist div.file-panel span {\n    width: 24px;\n    height: 24px;\n    display: inline;\n    float: right;\n    text-indent: -9999px;\n    overflow: hidden;\n    background: url(./images/icons.png) no-repeat;\n    background: url(./images/icons.gif) no-repeat \\9;\n    margin: 5px 1px 1px;\n    cursor: pointer;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n}\n\n#upload .filelist div.file-panel span.rotateLeft {\n    display:none;\n    background-position: 0 -24px;\n}\n\n#upload .filelist div.file-panel span.rotateLeft:hover {\n    background-position: 0 0;\n}\n\n#upload .filelist div.file-panel span.rotateRight {\n    display:none;\n    background-position: -24px -24px;\n}\n\n#upload .filelist div.file-panel span.rotateRight:hover {\n    background-position: -24px 0;\n}\n\n#upload .filelist div.file-panel span.cancel {\n    background-position: -48px -24px;\n}\n\n#upload .filelist div.file-panel span.cancel:hover {\n    background-position: -48px 0;\n}\n\n#upload .statusBar {\n    height: 45px;\n    border-bottom: 1px solid #dadada;\n    margin: 0 10px;\n    padding: 0;\n    line-height: 45px;\n    vertical-align: middle;\n    position: relative;\n}\n\n#upload .statusBar .progress {\n    border: 1px solid #1483d8;\n    width: 198px;\n    background: #fff;\n    height: 18px;\n    position: absolute;\n    top: 12px;\n    display: none;\n    text-align: center;\n    line-height: 18px;\n    color: #6dbfff;\n    margin: 0 10px 0 0;\n}\n#upload .statusBar .progress span.percentage {\n    width: 0;\n    height: 100%;\n    left: 0;\n    top: 0;\n    background: #1483d8;\n    position: absolute;\n}\n#upload .statusBar .progress span.text {\n    position: relative;\n    z-index: 10;\n}\n\n#upload .statusBar .info {\n    display: inline-block;\n    font-size: 14px;\n    color: #666666;\n}\n\n#upload .statusBar .btns {\n    position: absolute;\n    top: 7px;\n    right: 0;\n    line-height: 30px;\n}\n\n#filePickerBtn {\n    display: inline-block;\n    float: left;\n}\n#upload .statusBar .btns .webuploader-pick,\n#upload .statusBar .btns .uploadBtn,\n#upload .statusBar .btns .uploadBtn.state-uploading,\n#upload .statusBar .btns .uploadBtn.state-paused {\n    background: #ffffff;\n    border: 1px solid #cfcfcf;\n    color: #565656;\n    padding: 0 18px;\n    display: inline-block;\n    border-radius: 3px;\n    margin-left: 10px;\n    cursor: pointer;\n    font-size: 14px;\n    float: left;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n}\n#upload .statusBar .btns .webuploader-pick-hover,\n#upload .statusBar .btns .uploadBtn:hover,\n#upload .statusBar .btns .uploadBtn.state-uploading:hover,\n#upload .statusBar .btns .uploadBtn.state-paused:hover {\n    background: #f0f0f0;\n}\n\n#upload .statusBar .btns .uploadBtn,\n#upload .statusBar .btns .uploadBtn.state-paused{\n    background: #00b7ee;\n    color: #fff;\n    border-color: transparent;\n}\n#upload .statusBar .btns .uploadBtn:hover,\n#upload .statusBar .btns .uploadBtn.state-paused:hover{\n    background: #00a2d4;\n}\n\n#upload .statusBar .btns .uploadBtn.disabled {\n    pointer-events: none;\n    filter:alpha(opacity=60);\n    -moz-opacity:0.6;\n    -khtml-opacity: 0.6;\n    opacity: 0.6;\n}\n\n\n\n/* 图片管理样式 */\n#online {\n    width: 100%;\n    height: 336px;\n    padding: 10px 0 0 0;\n}\n#online #fileList{\n    width: 100%;\n    height: 100%;\n    overflow-x: hidden;\n    overflow-y: auto;\n    position: relative;\n}\n#online ul {\n    display: block;\n    list-style: none;\n    margin: 0;\n    padding: 0;\n}\n#online li {\n    float: left;\n    display: block;\n    list-style: none;\n    padding: 0;\n    width: 113px;\n    height: 113px;\n    margin: 0 0 9px 9px;\n    *margin: 0 0 6px 6px;\n    background-color: #eee;\n    overflow: hidden;\n    cursor: pointer;\n    position: relative;\n}\n#online li.clearFloat {\n    float: none;\n    clear: both;\n    display: block;\n    width:0;\n    height:0;\n    margin: 0;\n    padding: 0;\n}\n#online li img {\n    cursor: pointer;\n}\n#online li div.file-wrapper {\n    cursor: pointer;\n    position: absolute;\n    display: block;\n    width: 111px;\n    height: 111px;\n    border: 1px solid #eee;\n    background: url(\"./images/bg.png\") repeat;\n}\n#online li div span.file-title{\n    display: block;\n    padding: 0 3px;\n    margin: 3px 0 0 0;\n    font-size: 12px;\n    height: 13px;\n    color: #555555;\n    text-align: center;\n    width: 107px;\n    white-space: nowrap;\n    word-break: break-all;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n#online li .icon {\n    cursor: pointer;\n    width: 113px;\n    height: 113px;\n    position: absolute;\n    top: 0;\n    left: 0;\n    z-index: 2;\n    border: 0;\n    background-repeat: no-repeat;\n}\n#online li .icon:hover {\n    width: 107px;\n    height: 107px;\n    border: 3px solid #1094fa;\n}\n#online li.selected .icon {\n    background-image: url(images/success.png);\n    background-image: url(images/success.gif) \\9;\n    background-position: 75px 75px;\n}\n#online li.selected .icon:hover {\n    width: 107px;\n    height: 107px;\n    border: 3px solid #1094fa;\n    background-position: 72px 72px;\n}\n\n\n/* 在线文件的文件预览图标 */\ni.file-preview {\n    display: block;\n    margin: 10px auto;\n    width: 70px;\n    height: 70px;\n    background-image: url(\"./images/file-icons.png\");\n    background-image: url(\"./images/file-icons.gif\") \\9;\n    background-position: -140px center;\n    background-repeat: no-repeat;\n}\ni.file-preview.file-type-dir{\n    background-position: 0 center;\n}\ni.file-preview.file-type-file{\n    background-position: -140px center;\n}\ni.file-preview.file-type-filelist{\n    background-position: -210px center;\n}\ni.file-preview.file-type-zip,\ni.file-preview.file-type-rar,\ni.file-preview.file-type-7z,\ni.file-preview.file-type-tar,\ni.file-preview.file-type-gz,\ni.file-preview.file-type-bz2{\n    background-position: -280px center;\n}\ni.file-preview.file-type-xls,\ni.file-preview.file-type-xlsx{\n    background-position: -350px center;\n}\ni.file-preview.file-type-doc,\ni.file-preview.file-type-docx{\n    background-position: -420px center;\n}\ni.file-preview.file-type-ppt,\ni.file-preview.file-type-pptx{\n    background-position: -490px center;\n}\ni.file-preview.file-type-vsd{\n    background-position: -560px center;\n}\ni.file-preview.file-type-pdf{\n    background-position: -630px center;\n}\ni.file-preview.file-type-txt,\ni.file-preview.file-type-md,\ni.file-preview.file-type-json,\ni.file-preview.file-type-htm,\ni.file-preview.file-type-xml,\ni.file-preview.file-type-html,\ni.file-preview.file-type-js,\ni.file-preview.file-type-css,\ni.file-preview.file-type-php,\ni.file-preview.file-type-jsp,\ni.file-preview.file-type-asp{\n    background-position: -700px center;\n}\ni.file-preview.file-type-apk{\n    background-position: -770px center;\n}\ni.file-preview.file-type-exe{\n    background-position: -840px center;\n}\ni.file-preview.file-type-ipa{\n    background-position: -910px center;\n}\ni.file-preview.file-type-mp4,\ni.file-preview.file-type-swf,\ni.file-preview.file-type-mkv,\ni.file-preview.file-type-avi,\ni.file-preview.file-type-flv,\ni.file-preview.file-type-mov,\ni.file-preview.file-type-mpg,\ni.file-preview.file-type-mpeg,\ni.file-preview.file-type-ogv,\ni.file-preview.file-type-webm,\ni.file-preview.file-type-rm,\ni.file-preview.file-type-rmvb{\n    background-position: -980px center;\n}\ni.file-preview.file-type-ogg,\ni.file-preview.file-type-wav,\ni.file-preview.file-type-wmv,\ni.file-preview.file-type-mid,\ni.file-preview.file-type-mp3{\n    background-position: -1050px center;\n}\ni.file-preview.file-type-jpg,\ni.file-preview.file-type-jpeg,\ni.file-preview.file-type-gif,\ni.file-preview.file-type-bmp,\ni.file-preview.file-type-png,\ni.file-preview.file-type-psd{\n    background-position: -140px center;\n}"
  },
  {
    "path": "static/common/user/uedit/dialogs/attachment/attachment.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>ueditor图片对话框</title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n\n    <!-- jquery -->\n    <script type=\"text/javascript\" src=\"../../third-party/jquery-1.10.2.min.js\"></script>\n\n    <!-- webuploader -->\n    <script src=\"../../third-party/webuploader/webuploader.min.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../third-party/webuploader/webuploader.css\">\n\n    <!-- attachment dialog -->\n    <link rel=\"stylesheet\" href=\"attachment.css\" type=\"text/css\" />\n</head>\n<body>\n\n    <div class=\"wrapper\">\n        <div id=\"tabhead\" class=\"tabhead\">\n            <span class=\"tab focus\" data-content-id=\"upload\"><var id=\"lang_tab_upload\"></var></span>\n            <span class=\"tab\" data-content-id=\"online\"><var id=\"lang_tab_online\"></var></span>\n        </div>\n        <div id=\"tabbody\" class=\"tabbody\">\n            <!-- 上传图片 -->\n            <div id=\"upload\" class=\"panel focus\">\n                <div id=\"queueList\" class=\"queueList\">\n                    <div class=\"statusBar element-invisible\">\n                        <div class=\"progress\">\n                            <span class=\"text\">0%</span>\n                            <span class=\"percentage\"></span>\n                        </div><div class=\"info\"></div>\n                        <div class=\"btns\">\n                            <div id=\"filePickerBtn\"></div>\n                            <div class=\"uploadBtn\"><var id=\"lang_start_upload\"></var></div>\n                        </div>\n                    </div>\n                    <div id=\"dndArea\" class=\"placeholder\">\n                        <div class=\"filePickerContainer\">\n                            <div id=\"filePickerReady\"></div>\n                        </div>\n                    </div>\n                    <ul class=\"filelist element-invisible\">\n                        <li id=\"filePickerBlock\" class=\"filePickerBlock\"></li>\n                    </ul>\n                </div>\n            </div>\n\n            <!-- 在线图片 -->\n            <div id=\"online\" class=\"panel\">\n                <div id=\"fileList\"><var id=\"lang_imgLoading\"></var></div>\n            </div>\n\n        </div>\n    </div>\n    <script type=\"text/javascript\" src=\"attachment.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/attachment/attachment.js",
    "content": "/**\n * User: Jinqn\n * Date: 14-04-08\n * Time: 下午16:34\n * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片\n */\n\n(function () {\n\n    var uploadFile,\n        onlineFile;\n\n    window.onload = function () {\n        initTabs();\n        initButtons();\n    };\n\n    /* 初始化tab标签 */\n    function initTabs() {\n        var tabs = $G('tabhead').children;\n        for (var i = 0; i < tabs.length; i++) {\n            domUtils.on(tabs[i], \"click\", function (e) {\n                var target = e.target || e.srcElement;\n                setTabFocus(target.getAttribute('data-content-id'));\n            });\n        }\n\n        setTabFocus('upload');\n    }\n\n    /* 初始化tabbody */\n    function setTabFocus(id) {\n        if(!id) return;\n        var i, bodyId, tabs = $G('tabhead').children;\n        for (i = 0; i < tabs.length; i++) {\n            bodyId = tabs[i].getAttribute('data-content-id')\n            if (bodyId == id) {\n                domUtils.addClass(tabs[i], 'focus');\n                domUtils.addClass($G(bodyId), 'focus');\n            } else {\n                domUtils.removeClasses(tabs[i], 'focus');\n                domUtils.removeClasses($G(bodyId), 'focus');\n            }\n        }\n        switch (id) {\n            case 'upload':\n                uploadFile = uploadFile || new UploadFile('queueList');\n                break;\n            case 'online':\n                onlineFile = onlineFile || new OnlineFile('fileList');\n                break;\n        }\n    }\n\n    /* 初始化onok事件 */\n    function initButtons() {\n\n        dialog.onok = function () {\n            var list = [], id, tabs = $G('tabhead').children;\n            for (var i = 0; i < tabs.length; i++) {\n                if (domUtils.hasClass(tabs[i], 'focus')) {\n                    id = tabs[i].getAttribute('data-content-id');\n                    break;\n                }\n            }\n\n            switch (id) {\n                case 'upload':\n                    list = uploadFile.getInsertList();\n                    var count = uploadFile.getQueueCount();\n                    if (count) {\n                        $('.info', '#queueList').html('<span style=\"color:red;\">' + '还有2个未上传文件'.replace(/[\\d]/, count) + '</span>');\n                        return false;\n                    }\n                    break;\n                case 'online':\n                    list = onlineFile.getInsertList();\n                    break;\n            }\n\n            editor.execCommand('insertfile', list);\n        };\n    }\n\n\n    /* 上传附件 */\n    function UploadFile(target) {\n        this.$wrap = target.constructor == String ? $('#' + target) : $(target);\n        this.init();\n    }\n    UploadFile.prototype = {\n        init: function () {\n            this.fileList = [];\n            this.initContainer();\n            this.initUploader();\n        },\n        initContainer: function () {\n            this.$queue = this.$wrap.find('.filelist');\n        },\n        /* 初始化容器 */\n        initUploader: function () {\n            var _this = this,\n                $ = jQuery,    // just in case. Make sure it's not an other libaray.\n                $wrap = _this.$wrap,\n            // 图片容器\n                $queue = $wrap.find('.filelist'),\n            // 状态栏，包括进度和控制按钮\n                $statusBar = $wrap.find('.statusBar'),\n            // 文件总体选择信息。\n                $info = $statusBar.find('.info'),\n            // 上传按钮\n                $upload = $wrap.find('.uploadBtn'),\n            // 上传按钮\n                $filePickerBtn = $wrap.find('.filePickerBtn'),\n            // 上传按钮\n                $filePickerBlock = $wrap.find('.filePickerBlock'),\n            // 没选择文件之前的内容。\n                $placeHolder = $wrap.find('.placeholder'),\n            // 总体进度条\n                $progress = $statusBar.find('.progress').hide(),\n            // 添加的文件数量\n                fileCount = 0,\n            // 添加的文件总大小\n                fileSize = 0,\n            // 优化retina, 在retina下这个值是2\n                ratio = window.devicePixelRatio || 1,\n            // 缩略图大小\n                thumbnailWidth = 113 * ratio,\n                thumbnailHeight = 113 * ratio,\n            // 可能有pedding, ready, uploading, confirm, done.\n                state = '',\n            // 所有文件的进度信息，key为file id\n                percentages = {},\n                supportTransition = (function () {\n                    var s = document.createElement('p').style,\n                        r = 'transition' in s ||\n                            'WebkitTransition' in s ||\n                            'MozTransition' in s ||\n                            'msTransition' in s ||\n                            'OTransition' in s;\n                    s = null;\n                    return r;\n                })(),\n            // WebUploader实例\n                uploader,\n                actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),\n                fileMaxSize = editor.getOpt('fileMaxSize'),\n                acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\\./g, ',').replace(/^[,]/, '');;\n\n            if (!WebUploader.Uploader.support()) {\n                $('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();\n                return;\n            } else if (!editor.getOpt('fileActionName')) {\n                $('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();\n                return;\n            }\n\n            uploader = _this.uploader = WebUploader.create({\n                pick: {\n                    id: '#filePickerReady',\n                    label: lang.uploadSelectFile\n                },\n                swf: '../../third-party/webuploader/Uploader.swf',\n                server: actionUrl,\n                fileVal: editor.getOpt('fileFieldName'),\n                duplicate: true,\n                fileSingleSizeLimit: fileMaxSize,\n                compress: false\n            });\n            uploader.addButton({\n                id: '#filePickerBlock'\n            });\n            uploader.addButton({\n                id: '#filePickerBtn',\n                label: lang.uploadAddFile\n            });\n\n            setState('pedding');\n\n            // 当有文件添加进来时执行，负责view的创建\n            function addFile(file) {\n                var $li = $('<li id=\"' + file.id + '\">' +\n                        '<p class=\"title\">' + file.name + '</p>' +\n                        '<p class=\"imgWrap\"></p>' +\n                        '<p class=\"progress\"><span></span></p>' +\n                        '</li>'),\n\n                    $btns = $('<div class=\"file-panel\">' +\n                        '<span class=\"cancel\">' + lang.uploadDelete + '</span>' +\n                        '<span class=\"rotateRight\">' + lang.uploadTurnRight + '</span>' +\n                        '<span class=\"rotateLeft\">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),\n                    $prgress = $li.find('p.progress span'),\n                    $wrap = $li.find('p.imgWrap'),\n                    $info = $('<p class=\"error\"></p>').hide().appendTo($li),\n\n                    showError = function (code) {\n                        switch (code) {\n                            case 'exceed_size':\n                                text = lang.errorExceedSize;\n                                break;\n                            case 'interrupt':\n                                text = lang.errorInterrupt;\n                                break;\n                            case 'http':\n                                text = lang.errorHttp;\n                                break;\n                            case 'not_allow_type':\n                                text = lang.errorFileType;\n                                break;\n                            default:\n                                text = lang.errorUploadRetry;\n                                break;\n                        }\n                        $info.text(text).show();\n                    };\n\n                if (file.getStatus() === 'invalid') {\n                    showError(file.statusText);\n                } else {\n                    $wrap.text(lang.uploadPreview);\n                    if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {\n                        $wrap.empty().addClass('notimage').append('<i class=\"file-preview file-type-' + file.ext.toLowerCase() + '\"></i>' +\n                        '<span class=\"file-title\" title=\"' + file.name + '\">' + file.name + '</span>');\n                    } else {\n                        if (browser.ie && browser.version <= 7) {\n                            $wrap.text(lang.uploadNoPreview);\n                        } else {\n                            uploader.makeThumb(file, function (error, src) {\n                                if (error || !src) {\n                                    $wrap.text(lang.uploadNoPreview);\n                                } else {\n                                    var $img = $('<img src=\"' + src + '\">');\n                                    $wrap.empty().append($img);\n                                    $img.on('error', function () {\n                                        $wrap.text(lang.uploadNoPreview);\n                                    });\n                                }\n                            }, thumbnailWidth, thumbnailHeight);\n                        }\n                    }\n                    percentages[ file.id ] = [ file.size, 0 ];\n                    file.rotation = 0;\n\n                    /* 检查文件格式 */\n                    if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {\n                        showError('not_allow_type');\n                        uploader.removeFile(file);\n                    }\n                }\n\n                file.on('statuschange', function (cur, prev) {\n                    if (prev === 'progress') {\n                        $prgress.hide().width(0);\n                    } else if (prev === 'queued') {\n                        $li.off('mouseenter mouseleave');\n                        $btns.remove();\n                    }\n                    // 成功\n                    if (cur === 'error' || cur === 'invalid') {\n                        showError(file.statusText);\n                        percentages[ file.id ][ 1 ] = 1;\n                    } else if (cur === 'interrupt') {\n                        showError('interrupt');\n                    } else if (cur === 'queued') {\n                        percentages[ file.id ][ 1 ] = 0;\n                    } else if (cur === 'progress') {\n                        $info.hide();\n                        $prgress.css('display', 'block');\n                    } else if (cur === 'complete') {\n                    }\n\n                    $li.removeClass('state-' + prev).addClass('state-' + cur);\n                });\n\n                $li.on('mouseenter', function () {\n                    $btns.stop().animate({height: 30});\n                });\n                $li.on('mouseleave', function () {\n                    $btns.stop().animate({height: 0});\n                });\n\n                $btns.on('click', 'span', function () {\n                    var index = $(this).index(),\n                        deg;\n\n                    switch (index) {\n                        case 0:\n                            uploader.removeFile(file);\n                            return;\n                        case 1:\n                            file.rotation += 90;\n                            break;\n                        case 2:\n                            file.rotation -= 90;\n                            break;\n                    }\n\n                    if (supportTransition) {\n                        deg = 'rotate(' + file.rotation + 'deg)';\n                        $wrap.css({\n                            '-webkit-transform': deg,\n                            '-mos-transform': deg,\n                            '-o-transform': deg,\n                            'transform': deg\n                        });\n                    } else {\n                        $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');\n                    }\n\n                });\n\n                $li.insertBefore($filePickerBlock);\n            }\n\n            // 负责view的销毁\n            function removeFile(file) {\n                var $li = $('#' + file.id);\n                delete percentages[ file.id ];\n                updateTotalProgress();\n                $li.off().find('.file-panel').off().end().remove();\n            }\n\n            function updateTotalProgress() {\n                var loaded = 0,\n                    total = 0,\n                    spans = $progress.children(),\n                    percent;\n\n                $.each(percentages, function (k, v) {\n                    total += v[ 0 ];\n                    loaded += v[ 0 ] * v[ 1 ];\n                });\n\n                percent = total ? loaded / total : 0;\n\n                spans.eq(0).text(Math.round(percent * 100) + '%');\n                spans.eq(1).css('width', Math.round(percent * 100) + '%');\n                updateStatus();\n            }\n\n            function setState(val, files) {\n\n                if (val != state) {\n\n                    var stats = uploader.getStats();\n\n                    $upload.removeClass('state-' + state);\n                    $upload.addClass('state-' + val);\n\n                    switch (val) {\n\n                        /* 未选择文件 */\n                        case 'pedding':\n                            $queue.addClass('element-invisible');\n                            $statusBar.addClass('element-invisible');\n                            $placeHolder.removeClass('element-invisible');\n                            $progress.hide(); $info.hide();\n                            uploader.refresh();\n                            break;\n\n                        /* 可以开始上传 */\n                        case 'ready':\n                            $placeHolder.addClass('element-invisible');\n                            $queue.removeClass('element-invisible');\n                            $statusBar.removeClass('element-invisible');\n                            $progress.hide(); $info.show();\n                            $upload.text(lang.uploadStart);\n                            uploader.refresh();\n                            break;\n\n                        /* 上传中 */\n                        case 'uploading':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadPause);\n                            break;\n\n                        /* 暂停上传 */\n                        case 'paused':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadContinue);\n                            break;\n\n                        case 'confirm':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadStart);\n\n                            stats = uploader.getStats();\n                            if (stats.successNum && !stats.uploadFailNum) {\n                                setState('finish');\n                                return;\n                            }\n                            break;\n\n                        case 'finish':\n                            $progress.hide(); $info.show();\n                            if (stats.uploadFailNum) {\n                                $upload.text(lang.uploadRetry);\n                            } else {\n                                $upload.text(lang.uploadStart);\n                            }\n                            break;\n                    }\n\n                    state = val;\n                    updateStatus();\n\n                }\n\n                if (!_this.getQueueCount()) {\n                    $upload.addClass('disabled')\n                } else {\n                    $upload.removeClass('disabled')\n                }\n\n            }\n\n            function updateStatus() {\n                var text = '', stats;\n\n                if (state === 'ready') {\n                    text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));\n                } else if (state === 'confirm') {\n                    stats = uploader.getStats();\n                    if (stats.uploadFailNum) {\n                        text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);\n                    }\n                } else {\n                    stats = uploader.getStats();\n                    text = lang.updateStatusFinish.replace('_', fileCount).\n                        replace('_KB', WebUploader.formatSize(fileSize)).\n                        replace('_', stats.successNum);\n\n                    if (stats.uploadFailNum) {\n                        text += lang.updateStatusError.replace('_', stats.uploadFailNum);\n                    }\n                }\n\n                $info.html(text);\n            }\n\n            uploader.on('fileQueued', function (file) {\n                fileCount++;\n                fileSize += file.size;\n\n                if (fileCount === 1) {\n                    $placeHolder.addClass('element-invisible');\n                    $statusBar.show();\n                }\n\n                addFile(file);\n            });\n\n            uploader.on('fileDequeued', function (file) {\n                fileCount--;\n                fileSize -= file.size;\n\n                removeFile(file);\n                updateTotalProgress();\n            });\n\n            uploader.on('filesQueued', function (file) {\n                if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {\n                    setState('ready');\n                }\n                updateTotalProgress();\n            });\n\n            uploader.on('all', function (type, files) {\n                switch (type) {\n                    case 'uploadFinished':\n                        setState('confirm', files);\n                        break;\n                    case 'startUpload':\n                        /* 添加额外的GET参数 */\n                        var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',\n                            url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);\n                        uploader.option('server', url);\n                        setState('uploading', files);\n                        break;\n                    case 'stopUpload':\n                        setState('paused', files);\n                        break;\n                }\n            });\n\n            uploader.on('uploadBeforeSend', function (file, data, header) {\n                //这里可以通过data对象添加POST参数\n                header['X_Requested_With'] = 'XMLHttpRequest';\n            });\n\n            uploader.on('uploadProgress', function (file, percentage) {\n                var $li = $('#' + file.id),\n                    $percent = $li.find('.progress span');\n\n                $percent.css('width', percentage * 100 + '%');\n                percentages[ file.id ][ 1 ] = percentage;\n                updateTotalProgress();\n            });\n\n            uploader.on('uploadSuccess', function (file, ret) {\n                var $file = $('#' + file.id);\n                try {\n                    var responseText = (ret._raw || ret),\n                        json = utils.str2json(responseText);\n                    if (json.state == 'SUCCESS') {\n\t\t\t\t\t\t_this.fileList[$file.index()] = json;\n                        $file.append('<span class=\"success\"></span>');\n                    } else {\n                        $file.find('.error').text(json.state).show();\n                    }\n                } catch (e) {\n                    $file.find('.error').text(lang.errorServerUpload).show();\n                }\n            });\n\n            uploader.on('uploadError', function (file, code) {\n            });\n            uploader.on('error', function (code, file) {\n                if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {\n                    addFile(file);\n                }\n            });\n            uploader.on('uploadComplete', function (file, ret) {\n            });\n\n            $upload.on('click', function () {\n                if ($(this).hasClass('disabled')) {\n                    return false;\n                }\n\n                if (state === 'ready') {\n                    uploader.upload();\n                } else if (state === 'paused') {\n                    uploader.upload();\n                } else if (state === 'uploading') {\n                    uploader.stop();\n                }\n            });\n\n            $upload.addClass('state-' + state);\n            updateTotalProgress();\n        },\n        getQueueCount: function () {\n            var file, i, status, readyFile = 0, files = this.uploader.getFiles();\n            for (i = 0; file = files[i++]; ) {\n                status = file.getStatus();\n                if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;\n            }\n            return readyFile;\n        },\n        getInsertList: function () {\n            var i, link, data, list = [],\n                prefix = editor.getOpt('fileUrlPrefix');\n            for (i = 0; i < this.fileList.length; i++) {\n                data = this.fileList[i];\n                link = data.url;\n                list.push({\n                    title: data.original || link.substr(link.lastIndexOf('/') + 1),\n                    url: prefix + link\n                });\n            }\n            return list;\n        }\n    };\n\n\n    /* 在线附件 */\n    function OnlineFile(target) {\n        this.container = utils.isString(target) ? document.getElementById(target) : target;\n        this.init();\n    }\n    OnlineFile.prototype = {\n        init: function () {\n            this.initContainer();\n            this.initEvents();\n            this.initData();\n        },\n        /* 初始化容器 */\n        initContainer: function () {\n            this.container.innerHTML = '';\n            this.list = document.createElement('ul');\n            this.clearFloat = document.createElement('li');\n\n            domUtils.addClass(this.list, 'list');\n            domUtils.addClass(this.clearFloat, 'clearFloat');\n\n            this.list.appendChild(this.clearFloat);\n            this.container.appendChild(this.list);\n        },\n        /* 初始化滚动事件,滚动到地步自动拉取数据 */\n        initEvents: function () {\n            var _this = this;\n\n            /* 滚动拉取图片 */\n            domUtils.on($G('fileList'), 'scroll', function(e){\n                var panel = this;\n                if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {\n                    _this.getFileData();\n                }\n            });\n            /* 选中图片 */\n            domUtils.on(this.list, 'click', function (e) {\n                var target = e.target || e.srcElement,\n                    li = target.parentNode;\n\n                if (li.tagName.toLowerCase() == 'li') {\n                    if (domUtils.hasClass(li, 'selected')) {\n                        domUtils.removeClasses(li, 'selected');\n                    } else {\n                        domUtils.addClass(li, 'selected');\n                    }\n                }\n            });\n        },\n        /* 初始化第一次的数据 */\n        initData: function () {\n\n            /* 拉取数据需要使用的值 */\n            this.state = 0;\n            this.listSize = editor.getOpt('fileManagerListSize');\n            this.listIndex = 0;\n            this.listEnd = false;\n\n            /* 第一次拉取数据 */\n            this.getFileData();\n        },\n        /* 向后台拉取图片列表数据 */\n        getFileData: function () {\n            var _this = this;\n\n            if(!_this.listEnd && !this.isLoadingData) {\n                this.isLoadingData = true;\n                ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {\n                    timeout: 100000,\n                    data: utils.extend({\n                            start: this.listIndex,\n                            size: this.listSize\n                        }, editor.queryCommandValue('serverparam')),\n                    method: 'get',\n                    onsuccess: function (r) {\n                        try {\n                            var json = eval('(' + r.responseText + ')');\n                            if (json.state == 'SUCCESS') {\n                                _this.pushData(json.list);\n                                _this.listIndex = parseInt(json.start) + parseInt(json.list.length);\n                                if(_this.listIndex >= json.total) {\n                                    _this.listEnd = true;\n                                }\n                                _this.isLoadingData = false;\n                            }\n                        } catch (e) {\n                            if(r.responseText.indexOf('ue_separate_ue') != -1) {\n                                var list = r.responseText.split(r.responseText);\n                                _this.pushData(list);\n                                _this.listIndex = parseInt(list.length);\n                                _this.listEnd = true;\n                                _this.isLoadingData = false;\n                            }\n                        }\n                    },\n                    onerror: function () {\n                        _this.isLoadingData = false;\n                    }\n                });\n            }\n        },\n        /* 添加图片到列表界面上 */\n        pushData: function (list) {\n            var i, item, img, filetype, preview, icon, _this = this,\n                urlPrefix = editor.getOpt('fileManagerUrlPrefix');\n            for (i = 0; i < list.length; i++) {\n                if(list[i] && list[i].url) {\n                    item = document.createElement('li');\n                    icon = document.createElement('span');\n                    filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);\n\n                    if ( \"png|jpg|jpeg|gif|bmp\".indexOf(filetype) != -1 ) {\n                        preview = document.createElement('img');\n                        domUtils.on(preview, 'load', (function(image){\n                            return function(){\n                                _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);\n                            };\n                        })(preview));\n                        preview.width = 113;\n                        preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );\n                    } else {\n                        var ic = document.createElement('i'),\n                            textSpan = document.createElement('span');\n                        textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1);\n                        preview = document.createElement('div');\n                        preview.appendChild(ic);\n                        preview.appendChild(textSpan);\n                        domUtils.addClass(preview, 'file-wrapper');\n                        domUtils.addClass(textSpan, 'file-title');\n                        domUtils.addClass(ic, 'file-type-' + filetype);\n                        domUtils.addClass(ic, 'file-preview');\n                    }\n                    domUtils.addClass(icon, 'icon');\n                    item.setAttribute('data-url', urlPrefix + list[i].url);\n                    if (list[i].original) {\n                        item.setAttribute('data-title', list[i].original);\n                    }\n\n                    item.appendChild(preview);\n                    item.appendChild(icon);\n                    this.list.insertBefore(item, this.clearFloat);\n                }\n            }\n        },\n        /* 改变图片大小 */\n        scale: function (img, w, h, type) {\n            var ow = img.width,\n                oh = img.height;\n\n            if (type == 'justify') {\n                if (ow >= oh) {\n                    img.width = w;\n                    img.height = h * oh / ow;\n                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';\n                } else {\n                    img.width = w * ow / oh;\n                    img.height = h;\n                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';\n                }\n            } else {\n                if (ow >= oh) {\n                    img.width = w * ow / oh;\n                    img.height = h;\n                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';\n                } else {\n                    img.width = w;\n                    img.height = h * oh / ow;\n                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';\n                }\n            }\n        },\n        getInsertList: function () {\n            var i, lis = this.list.children, list = [];\n            for (i = 0; i < lis.length; i++) {\n                if (domUtils.hasClass(lis[i], 'selected')) {\n                    var url = lis[i].getAttribute('data-url');\n                    var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);\n                    list.push({\n                        title: title,\n                        url: url\n                    });\n                }\n            }\n            return list;\n        }\n    };\n\n\n})();"
  },
  {
    "path": "static/common/user/uedit/dialogs/background/background.css",
    "content": ".wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}\n.tabbody{height:225px;}\n.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}\n.tabbody .focus { display: block;}\n\nbody{font-size: 12px;color: #888;overflow: hidden;}\ninput,label{vertical-align:middle}\n.clear{clear: both;}\n.pl{padding-left: 18px;padding-left: 23px\\9;}\n\n#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}\n#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}\n#imageList img {cursor: pointer;border: 2px solid white;}\n\n.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;}\n.content div{margin: 10px 0 10px 5px;}\n.content .iptradio{margin: 0px 5px 5px 0px;}\n.txt{width:280px;}\n\n.wrapcolor{height: 19px;}\ndiv.color{float: left;margin: 0;}\n#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;}\ndiv.alignment,#custom{margin-left: 23px;margin-left: 28px\\9;}\n#custom input{height: 15px;min-height: 15px;width:20px;}\n#repeatType{width:100px;}\n\n\n/* 图片管理样式 */\n#imgManager {\n    width: 100%;\n    height: 225px;\n}\n#imgManager #imageList{\n    width: 100%;\n    overflow-x: hidden;\n    overflow-y: auto;\n}\n#imgManager ul {\n    display: block;\n    list-style: none;\n    margin: 0;\n    padding: 0;\n}\n#imgManager li {\n    float: left;\n    display: block;\n    list-style: none;\n    padding: 0;\n    width: 113px;\n    height: 113px;\n    margin: 9px 0 0 19px;\n    background-color: #eee;\n    overflow: hidden;\n    cursor: pointer;\n    position: relative;\n}\n#imgManager li.clearFloat {\n    float: none;\n    clear: both;\n    display: block;\n    width:0;\n    height:0;\n    margin: 0;\n    padding: 0;\n}\n#imgManager li img {\n    cursor: pointer;\n}\n#imgManager li .icon {\n    cursor: pointer;\n    width: 113px;\n    height: 113px;\n    position: absolute;\n    top: 0;\n    left: 0;\n    z-index: 2;\n    border: 0;\n    background-repeat: no-repeat;\n}\n#imgManager li .icon:hover {\n    width: 107px;\n    height: 107px;\n    border: 3px solid #1094fa;\n}\n#imgManager li.selected .icon {\n    background-image: url(images/success.png);\n    background-position: 75px 75px;\n}\n#imgManager li.selected .icon:hover {\n    width: 107px;\n    height: 107px;\n    border: 3px solid #1094fa;\n    background-position: 72px 72px;\n}"
  },
  {
    "path": "static/common/user/uedit/dialogs/background/background.html",
    "content": "<!DOCTYPE HTML>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"background.css\">\n</head>\n<body>\n    <div id=\"bg_container\" class=\"wrapper\">\n        <div id=\"tabHeads\" class=\"tabhead\">\n            <span class=\"focus\" data-content-id=\"normal\"><var id=\"lang_background_normal\"></var></span>\n            <span class=\"\" data-content-id=\"imgManager\"><var id=\"lang_background_local\"></var></span>\n        </div>\n        <div id=\"tabBodys\" class=\"tabbody\">\n            <div id=\"normal\" class=\"panel focus\">\n                <fieldset class=\"bgarea\">\n                    <legend><var id=\"lang_background_set\"></var></legend>\n                    <div class=\"content\">\n                        <div>\n                            <label><input id=\"nocolorRadio\" class=\"iptradio\" type=\"radio\" name=\"t\" value=\"none\" checked=\"checked\"><var id=\"lang_background_none\"></var></label>\n                            <label><input id=\"coloredRadio\" class=\"iptradio\" type=\"radio\" name=\"t\" value=\"color\"><var id=\"lang_background_colored\"></var></label>\n                        </div>\n                        <div class=\"wrapcolor pl\">\n                            <div class=\"color\">\n                                <var id=\"lang_background_color\"></var>:\n                            </div>\n                            <div id=\"colorPicker\"></div>\n                            <div class=\"clear\"></div>\n                        </div>\n                        <div class=\"wrapcolor pl\">\n                            <label><var id=\"lang_background_netimg\"></var>:</label><input class=\"txt\" type=\"text\" id=\"url\">\n                        </div>\n                        <div id=\"alignment\" class=\"alignment\">\n                            <var id=\"lang_background_align\"></var>:<select id=\"repeatType\">\n                                <option value=\"center\"></option>\n                                <option value=\"repeat-x\"></option>\n                                <option value=\"repeat-y\"></option>\n                                <option value=\"repeat\"></option>\n                                <option value=\"self\"></option>\n                            </select>\n                        </div>\n                        <div id=\"custom\" >\n                            <var id=\"lang_background_position\"></var>:x:<input type=\"text\" size=\"1\" id=\"x\" maxlength=\"4\" value=\"0\">px&nbsp;&nbsp;y:<input type=\"text\" size=\"1\" id=\"y\" maxlength=\"4\" value=\"0\">px\n                        </div>\n                    </div>\n                </fieldset>\n\n            </div>\n            <div id=\"imgManager\" class=\"panel\">\n                <div id=\"imageList\" style=\"\"></div>\n            </div>\n        </div>\n    </div>\n    <script type=\"text/javascript\" src=\"background.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/background/background.js",
    "content": "(function () {\n\n    var onlineImage,\n        backupStyle = editor.queryCommandValue('background');\n\n    window.onload = function () {\n        initTabs();\n        initColorSelector();\n    };\n\n    /* 初始化tab标签 */\n    function initTabs(){\n        var tabs = $G('tabHeads').children;\n        for (var i = 0; i < tabs.length; i++) {\n            domUtils.on(tabs[i], \"click\", function (e) {\n                var target = e.target || e.srcElement;\n                for (var j = 0; j < tabs.length; j++) {\n                    if(tabs[j] == target){\n                        tabs[j].className = \"focus\";\n                        var contentId = tabs[j].getAttribute('data-content-id');\n                        $G(contentId).style.display = \"block\";\n                        if(contentId == 'imgManager') {\n                            initImagePanel();\n                        }\n                    }else {\n                        tabs[j].className = \"\";\n                        $G(tabs[j].getAttribute('data-content-id')).style.display = \"none\";\n                    }\n                }\n            });\n        }\n    }\n\n    /* 初始化颜色设置 */\n    function initColorSelector () {\n        var obj = editor.queryCommandValue('background');\n        if (obj) {\n            var color = obj['background-color'],\n                repeat = obj['background-repeat'] || 'repeat',\n                image = obj['background-image'] || '',\n                position = obj['background-position'] || 'center center',\n                pos = position.split(' '),\n                x = parseInt(pos[0]) || 0,\n                y = parseInt(pos[1]) || 0;\n\n            if(repeat == 'no-repeat' && (x || y)) repeat = 'self';\n\n            image = image.match(/url[\\s]*\\(([^\\)]*)\\)/);\n            image = image ? image[1]:'';\n            updateFormState('colored', color, image, repeat, x, y);\n        } else {\n            updateFormState();\n        }\n\n        var updateHandler = function () {\n            updateFormState();\n            updateBackground();\n        }\n        domUtils.on($G('nocolorRadio'), 'click', updateBackground);\n        domUtils.on($G('coloredRadio'), 'click', updateHandler);\n        domUtils.on($G('url'), 'keyup', function(){\n            if($G('url').value && $G('alignment').style.display == \"none\") {\n                utils.each($G('repeatType').children, function(item){\n                    item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false);\n                });\n            }\n            updateHandler();\n        });\n        domUtils.on($G('repeatType'), 'change', updateHandler);\n        domUtils.on($G('x'), 'keyup', updateBackground);\n        domUtils.on($G('y'), 'keyup', updateBackground);\n\n        initColorPicker();\n    }\n\n    /* 初始化颜色选择器 */\n    function initColorPicker() {\n        var me = editor,\n            cp = $G(\"colorPicker\");\n\n        /* 生成颜色选择器ui对象 */\n        var popup = new UE.ui.Popup({\n            content: new UE.ui.ColorPicker({\n                noColorText: me.getLang(\"clearColor\"),\n                editor: me,\n                onpickcolor: function (t, color) {\n                    updateFormState('colored', color);\n                    updateBackground();\n                    UE.ui.Popup.postHide();\n                },\n                onpicknocolor: function (t, color) {\n                    updateFormState('colored', 'transparent');\n                    updateBackground();\n                    UE.ui.Popup.postHide();\n                }\n            }),\n            editor: me,\n            onhide: function () {\n            }\n        });\n\n        /* 设置颜色选择器 */\n        domUtils.on(cp, \"click\", function () {\n            popup.showAnchor(this);\n        });\n        domUtils.on(document, 'mousedown', function (evt) {\n            var el = evt.target || evt.srcElement;\n            UE.ui.Popup.postHide(el);\n        });\n        domUtils.on(window, 'scroll', function () {\n            UE.ui.Popup.postHide();\n        });\n    }\n\n    /* 初始化在线图片列表 */\n    function initImagePanel() {\n        onlineImage = onlineImage || new OnlineImage('imageList');\n    }\n\n    /* 更新背景色设置面板 */\n    function updateFormState (radio, color, url, align, x, y) {\n        var nocolorRadio = $G('nocolorRadio'),\n            coloredRadio = $G('coloredRadio');\n\n        if(radio) {\n            nocolorRadio.checked = (radio == 'colored' ? false:'checked');\n            coloredRadio.checked = (radio == 'colored' ? 'checked':false);\n        }\n        if(color) {\n            domUtils.setStyle($G(\"colorPicker\"), \"background-color\", color);\n        }\n\n        if(url && /^\\//.test(url)) {\n            var a = document.createElement('a');\n            a.href = url;\n            browser.ie && (a.href = a.href);\n            url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash);\n        }\n\n        if(url || url === '') {\n            $G('url').value = url;\n        }\n        if(align) {\n            utils.each($G('repeatType').children, function(item){\n                item.selected = (align == item.getAttribute('value') ? 'selected':false);\n            });\n        }\n        if(x || y) {\n            $G('x').value = parseInt(x) || 0;\n            $G('y').value = parseInt(y) || 0;\n        }\n\n        $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none';\n        $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none';\n    }\n\n    /* 更新背景颜色 */\n    function updateBackground () {\n        if ($G('coloredRadio').checked) {\n            var color = domUtils.getStyle($G(\"colorPicker\"), \"background-color\"),\n                bgimg = $G(\"url\").value,\n                align = $G(\"repeatType\").value,\n                backgroundObj = {\n                    \"background-repeat\": \"no-repeat\",\n                    \"background-position\": \"center center\"\n                };\n\n            if (color) backgroundObj[\"background-color\"] = color;\n            if (bgimg) backgroundObj[\"background-image\"] = 'url(' + bgimg + ')';\n            if (align == 'self') {\n                backgroundObj[\"background-position\"] = $G(\"x\").value + \"px \" + $G(\"y\").value + \"px\";\n            } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {\n                backgroundObj[\"background-repeat\"] = align;\n            }\n\n            editor.execCommand('background', backgroundObj);\n        } else {\n            editor.execCommand('background', null);\n        }\n    }\n\n\n    /* 在线图片 */\n    function OnlineImage(target) {\n        this.container = utils.isString(target) ? document.getElementById(target) : target;\n        this.init();\n    }\n    OnlineImage.prototype = {\n        init: function () {\n            this.reset();\n            this.initEvents();\n        },\n        /* 初始化容器 */\n        initContainer: function () {\n            this.container.innerHTML = '';\n            this.list = document.createElement('ul');\n            this.clearFloat = document.createElement('li');\n\n            domUtils.addClass(this.list, 'list');\n            domUtils.addClass(this.clearFloat, 'clearFloat');\n\n            this.list.id = 'imageListUl';\n            this.list.appendChild(this.clearFloat);\n            this.container.appendChild(this.list);\n        },\n        /* 初始化滚动事件,滚动到地步自动拉取数据 */\n        initEvents: function () {\n            var _this = this;\n\n            /* 滚动拉取图片 */\n            domUtils.on($G('imageList'), 'scroll', function(e){\n                var panel = this;\n                if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {\n                    _this.getImageData();\n                }\n            });\n            /* 选中图片 */\n            domUtils.on(this.container, 'click', function (e) {\n                var target = e.target || e.srcElement,\n                    li = target.parentNode,\n                    nodes = $G('imageListUl').childNodes;\n\n                if (li.tagName.toLowerCase() == 'li') {\n                    updateFormState('nocolor', null, '');\n                    for (var i = 0, node; node = nodes[i++];) {\n                        if (node == li && !domUtils.hasClass(node, 'selected')) {\n                            domUtils.addClass(node, 'selected');\n                            updateFormState('colored', null, li.firstChild.getAttribute(\"_src\"), 'repeat');\n                        } else {\n                            domUtils.removeClasses(node, 'selected');\n                        }\n                    }\n                    updateBackground();\n                }\n            });\n        },\n        /* 初始化第一次的数据 */\n        initData: function () {\n\n            /* 拉取数据需要使用的值 */\n            this.state = 0;\n            this.listSize = editor.getOpt('imageManagerListSize');\n            this.listIndex = 0;\n            this.listEnd = false;\n\n            /* 第一次拉取数据 */\n            this.getImageData();\n        },\n        /* 重置界面 */\n        reset: function() {\n            this.initContainer();\n            this.initData();\n        },\n        /* 向后台拉取图片列表数据 */\n        getImageData: function () {\n            var _this = this;\n\n            if(!_this.listEnd && !this.isLoadingData) {\n                this.isLoadingData = true;\n                var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),\n                    isJsonp = utils.isCrossDomainUrl(url);\n                ajax.request(url, {\n                    'timeout': 100000,\n                    'dataType': isJsonp ? 'jsonp':'',\n                    'data': utils.extend({\n                            start: this.listIndex,\n                            size: this.listSize\n                        }, editor.queryCommandValue('serverparam')),\n                    'method': 'get',\n                    'onsuccess': function (r) {\n                        try {\n                            var json = isJsonp ? r:eval('(' + r.responseText + ')');\n                            if (json.state == 'SUCCESS') {\n                                _this.pushData(json.list);\n                                _this.listIndex = parseInt(json.start) + parseInt(json.list.length);\n                                if(_this.listIndex >= json.total) {\n                                    _this.listEnd = true;\n                                }\n                                _this.isLoadingData = false;\n                            }\n                        } catch (e) {\n                            if(r.responseText.indexOf('ue_separate_ue') != -1) {\n                                var list = r.responseText.split(r.responseText);\n                                _this.pushData(list);\n                                _this.listIndex = parseInt(list.length);\n                                _this.listEnd = true;\n                                _this.isLoadingData = false;\n                            }\n                        }\n                    },\n                    'onerror': function () {\n                        _this.isLoadingData = false;\n                    }\n                });\n            }\n        },\n        /* 添加图片到列表界面上 */\n        pushData: function (list) {\n            var i, item, img, icon, _this = this,\n                urlPrefix = editor.getOpt('imageManagerUrlPrefix');\n            for (i = 0; i < list.length; i++) {\n                if(list[i] && list[i].url) {\n                    item = document.createElement('li');\n                    img = document.createElement('img');\n                    icon = document.createElement('span');\n\n                    domUtils.on(img, 'load', (function(image){\n                        return function(){\n                            _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);\n                        }\n                    })(img));\n                    img.width = 113;\n                    img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );\n                    img.setAttribute('_src', urlPrefix + list[i].url);\n                    domUtils.addClass(icon, 'icon');\n\n                    item.appendChild(img);\n                    item.appendChild(icon);\n                    this.list.insertBefore(item, this.clearFloat);\n                }\n            }\n        },\n        /* 改变图片大小 */\n        scale: function (img, w, h, type) {\n            var ow = img.width,\n                oh = img.height;\n\n            if (type == 'justify') {\n                if (ow >= oh) {\n                    img.width = w;\n                    img.height = h * oh / ow;\n                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';\n                } else {\n                    img.width = w * ow / oh;\n                    img.height = h;\n                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';\n                }\n            } else {\n                if (ow >= oh) {\n                    img.width = w * ow / oh;\n                    img.height = h;\n                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';\n                } else {\n                    img.width = w;\n                    img.height = h * oh / ow;\n                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';\n                }\n            }\n        },\n        getInsertList: function () {\n            var i, lis = this.list.children, list = [], align = getAlign();\n            for (i = 0; i < lis.length; i++) {\n                if (domUtils.hasClass(lis[i], 'selected')) {\n                    var img = lis[i].firstChild,\n                        src = img.getAttribute('_src');\n                    list.push({\n                        src: src,\n                        _src: src,\n                        floatStyle: align\n                    });\n                }\n\n            }\n            return list;\n        }\n    };\n\n    dialog.onok = function () {\n        updateBackground();\n        editor.fireEvent('saveScene');\n    };\n    dialog.oncancel = function () {\n        editor.execCommand('background', backupStyle);\n    };\n\n})();"
  },
  {
    "path": "static/common/user/uedit/dialogs/charts/chart.config.js",
    "content": "/*\n * 图表配置文件\n * */\n\n\n//不同类型的配置\nvar typeConfig = [\n    {\n        chart: {\n            type: 'line'\n        },\n        plotOptions: {\n            line: {\n                dataLabels: {\n                    enabled: false\n                },\n                enableMouseTracking: true\n            }\n        }\n    }, {\n        chart: {\n            type: 'line'\n        },\n        plotOptions: {\n            line: {\n                dataLabels: {\n                    enabled: true\n                },\n                enableMouseTracking: false\n            }\n        }\n    }, {\n        chart: {\n            type: 'area'\n        }\n    }, {\n        chart: {\n            type: 'bar'\n        }\n    }, {\n        chart: {\n            type: 'column'\n        }\n    }, {\n        chart: {\n            plotBackgroundColor: null,\n            plotBorderWidth: null,\n            plotShadow: false\n        },\n        plotOptions: {\n            pie: {\n                allowPointSelect: true,\n                cursor: 'pointer',\n                dataLabels: {\n                    enabled: true,\n                    color: '#000000',\n                    connectorColor: '#000000',\n                    formatter: function() {\n                        return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';\n                    }\n                }\n            }\n        }\n    }\n];\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/charts/charts.css",
    "content": "html, body {\n    width: 100%;\n    height: 100%;\n    margin: 0;\n    padding: 0;\n    overflow-x: hidden;\n}\n\n.main {\n    width: 100%;\n    overflow: hidden;\n}\n\n.table-view {\n    height: 100%;\n    float: left;\n    margin: 20px;\n    width: 40%;\n}\n\n.table-view .table-container {\n    width: 100%;\n    margin-bottom: 50px;\n    overflow: scroll;\n}\n\n.table-view th {\n    padding: 5px 10px;\n    background-color: #F7F7F7;\n}\n\n.table-view td {\n    width: 50px;\n    text-align: center;\n    padding:0;\n}\n\n.table-container input {\n    width: 40px;\n    padding: 5px;\n    border: none;\n    outline: none;\n}\n\n.table-view caption {\n    font-size: 18px;\n    text-align: left;\n}\n\n.charts-view {\n    /*margin-left: 49%!important;*/\n    width: 50%;\n    margin-left: 49%;\n    height: 400px;\n}\n\n.charts-container {\n    border-left: 1px solid #c3c3c3;\n}\n\n.charts-format fieldset {\n    padding-left: 20px;\n    margin-bottom: 50px;\n}\n\n.charts-format legend {\n    padding-left: 10px;\n    padding-right: 10px;\n}\n\n.format-item-container {\n    padding: 20px;\n}\n\n.format-item-container label {\n    display: block;\n    margin: 10px 0;\n}\n\n.charts-format .data-item {\n    border: 1px solid black;\n    outline: none;\n    padding: 2px 3px;\n}\n\n/* 图表类型 */\n\n.charts-type {\n    margin-top: 50px;\n    height: 300px;\n}\n\n.scroll-view {\n    border: 1px solid #c3c3c3;\n    border-left: none;\n    border-right: none;\n    overflow: hidden;\n}\n\n.scroll-container {\n    margin: 20px;\n    width: 100%;\n    overflow: hidden;\n}\n\n.scroll-bed {\n    width: 10000px;\n    _margin-top: 20px;\n    -webkit-transition: margin-left .5s ease;\n    -moz-transition: margin-left .5s ease;\n    transition: margin-left .5s ease;\n}\n\n.view-box {\n    display: inline-block;\n    *display: inline;\n    *zoom: 1;\n    margin-right: 20px;\n    border: 2px solid white;\n    line-height: 0;\n    overflow: hidden;\n    cursor: pointer;\n}\n\n.view-box img {\n    border: 1px solid #cecece;\n}\n\n.view-box.selected {\n    border-color: #7274A7;\n}\n\n.button-container {\n    margin-bottom: 20px;\n    text-align: center;\n}\n\n.button-container a {\n    display: inline-block;\n    width: 100px;\n    height: 25px;\n    line-height: 25px;\n    border: 1px solid #c2ccd1;\n    margin-right: 30px;\n    text-decoration: none;\n    color: black;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n    border-radius: 2px;\n}\n\n.button-container a:HOVER {\n    background: #fcfcfc;\n}\n\n.button-container a:ACTIVE {\n    border-top-color: #c2ccd1;\n    box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1);\n}\n\n.edui-charts-not-data {\n    height: 100px;\n    line-height: 100px;\n    text-align: center;\n}"
  },
  {
    "path": "static/common/user/uedit/dialogs/charts/charts.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>chart</title>\n        <meta chartset=\"utf-8\">\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"charts.css\">\n        <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    </head>\n    <body>\n        <div class=\"main\">\n            <div class=\"table-view\">\n                <h3><var id=\"lang_data_source\"></var></h3>\n                <div id=\"tableContainer\" class=\"table-container\"></div>\n                <h3><var id=\"lang_chart_format\"></var></h3>\n                <form name=\"data-form\">\n                    <div class=\"charts-format\">\n                        <fieldset>\n                            <legend><var id=\"lang_data_align\"></var></legend>\n                            <div class=\"format-item-container\">\n                                <label>\n                                    <input type=\"radio\" class=\"format-ctrl not-pie-item\" name=\"charts-format\" value=\"1\" checked=\"checked\">\n                                    <var id=\"lang_chart_align_same\"></var>\n                                </label>\n                                <label>\n                                    <input type=\"radio\" class=\"format-ctrl not-pie-item\" name=\"charts-format\" value=\"-1\">\n                                    <var id=\"lang_chart_align_reverse\"></var>\n                                </label>\n                                <br>\n                            </div>\n                        </fieldset>\n                        <fieldset>\n                            <legend><var id=\"lang_chart_title\"></var></legend>\n                            <div class=\"format-item-container\">\n                                <label>\n                                    <var id=\"lang_chart_main_title\"></var><input type=\"text\" name=\"title\" class=\"data-item\">\n                                </label>\n                                <label>\n                                    <var id=\"lang_chart_sub_title\"></var><input type=\"text\" name=\"sub-title\" class=\"data-item not-pie-item\">\n                                </label>\n                                <label>\n                                    <var id=\"lang_chart_x_title\"></var><input type=\"text\" name=\"x-title\" class=\"data-item not-pie-item\">\n                                </label>\n                                <label>\n                                    <var id=\"lang_chart_y_title\"></var><input type=\"text\" name=\"y-title\" class=\"data-item not-pie-item\">\n                                </label>\n                            </div>\n                        </fieldset>\n                        <fieldset>\n                            <legend><var id=\"lang_chart_tip\"></var></legend>\n                            <div class=\"format-item-container\">\n                                <label>\n                                    <var id=\"lang_cahrt_tip_prefix\"></var>\n                                    <input type=\"text\" id=\"tipInput\" name=\"tip\" class=\"data-item\" disabled=\"disabled\">\n                                </label>\n                                <p><var id=\"lang_cahrt_tip_description\"></var></p>\n                            </div>\n                        </fieldset>\n                        <fieldset>\n                            <legend><var id=\"lang_chart_data_unit\"></var></legend>\n                            <div class=\"format-item-container\">\n                                <label><var id=\"lang_chart_data_unit_title\"></var><input type=\"text\" name=\"unit\" class=\"data-item\"></label>\n                                <p><var id=\"lang_chart_data_unit_description\"></var></p>\n                            </div>\n                        </fieldset>\n                    </div>\n                </form>\n            </div>\n            <div class=\"charts-view\">\n                <div id=\"chartsContainer\" class=\"charts-container\"></div>\n                <div id=\"chartsType\" class=\"charts-type\">\n                    <h3><var id=\"lang_chart_type\"></var></h3>\n                    <div class=\"scroll-view\">\n                        <div class=\"scroll-container\">\n                            <div id=\"scrollBed\" class=\"scroll-bed\"></div>\n                        </div>\n                        <div id=\"buttonContainer\" class=\"button-container\">\n                            <a href=\"#\" data-title=\"prev\"><var id=\"lang_prev_btn\"></var></a>\n                            <a href=\"#\" data-title=\"next\"><var id=\"lang_next_btn\"></var></a>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <script src=\"../../third-party/jquery-1.10.2.min.js\"></script>\n        <script src=\"../../third-party/highcharts/highcharts.js\"></script>\n        <script src=\"chart.config.js\"></script>\n        <script src=\"charts.js\"></script>\n    </body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/charts/charts.js",
    "content": "/*\n * 图片转换对话框脚本\n **/\n\nvar tableData = [],\n    //编辑器页面table\n    editorTable = null,\n    chartsConfig = window.typeConfig,\n    resizeTimer = null,\n    //初始默认图表类型\n    currentChartType = 0;\n\nwindow.onload = function () {\n\n    editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);\n\n    //未找到表格， 显示错误页面\n    if ( !editorTable ) {\n        document.body.innerHTML = \"<div class='edui-charts-not-data'>未找到数据</div>\";\n        return;\n    }\n\n    //初始化图表类型选择\n    initChartsTypeView();\n    renderTable( editorTable );\n    initEvent();\n    initUserConfig( editorTable.getAttribute( \"data-chart\" ) );\n    $( \"#scrollBed .view-box:eq(\"+ currentChartType +\")\" ).trigger( \"click\" );\n    updateViewType( currentChartType );\n\n    dialog.addListener( \"resize\", function () {\n\n        if ( resizeTimer != null ) {\n            window.clearTimeout( resizeTimer );\n        }\n\n        resizeTimer = window.setTimeout( function () {\n\n            resizeTimer = null;\n\n            renderCharts();\n\n        }, 500 );\n\n    } );\n\n};\n\nfunction initChartsTypeView () {\n\n    var contents = [];\n\n    for ( var i = 0, len = chartsConfig.length; i<len; i++ ) {\n\n        contents.push( '<div class=\"view-box\" data-chart-type=\"'+ i +'\"><img width=\"300\" src=\"images/charts'+ i +'.png\"></div>' );\n\n    }\n\n    $( \"#scrollBed\" ).html( contents.join( \"\" ) );\n\n}\n\n//渲染table， 以便用户修改数据\nfunction renderTable ( table ) {\n\n    var tableHtml = [];\n\n    //构造数据\n    for ( var i = 0, row; row = table.rows[ i ]; i++ ) {\n\n        tableData[ i ] = [];\n        tableHtml[ i ] = [];\n\n        for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {\n\n            var value = getCellValue( cell );\n\n            if ( i > 0 && j > 0 ) {\n                value = +value;\n            }\n\n            if ( i === 0 || j === 0 ) {\n                tableHtml[ i ].push( '<th>'+ value +'</th>' );\n            } else {\n                tableHtml[ i ].push( '<td><input type=\"text\" class=\"data-item\" value=\"'+ value +'\"></td>' );\n            }\n\n            tableData[ i ][ j ] = value;\n\n        }\n\n        tableHtml[ i ] = tableHtml[ i ].join( \"\" );\n\n    }\n\n    //draw 表格\n    $( \"#tableContainer\" ).html( '<table id=\"showTable\" border=\"1\"><tbody><tr>'+ tableHtml.join( \"</tr><tr>\" ) +'</tr></tbody></table>' );\n\n}\n\n/*\n * 根据表格已有的图表属性初始化当前图表属性\n */\nfunction initUserConfig ( config ) {\n\n    var parsedConfig = {};\n\n    if ( !config ) {\n        return;\n    }\n\n    config = config.split( \";\" );\n\n    $.each( config, function ( index, item ) {\n\n        item = item.split( \":\" );\n        parsedConfig[ item[ 0 ] ] = item[ 1 ];\n\n    } );\n\n    setUserConfig( parsedConfig );\n\n}\n\nfunction initEvent () {\n\n    var cacheValue = null,\n        //图表类型数\n        typeViewCount = chartsConfig.length- 1,\n        $chartsTypeViewBox = $( '#scrollBed .view-box' );\n\n    $( \".charts-format\" ).delegate( \".format-ctrl\", \"change\", function () {\n\n        renderCharts();\n\n    } )\n\n    $( \".table-view\" ).delegate( \".data-item\", \"focus\", function () {\n\n        cacheValue = this.value;\n\n    } ).delegate( \".data-item\", \"blur\", function () {\n\n        if ( this.value !== cacheValue ) {\n            renderCharts();\n        }\n\n        cacheValue = null;\n\n    } );\n\n    $( \"#buttonContainer\" ).delegate( \"a\", \"click\", function (e) {\n\n        e.preventDefault();\n\n        if ( this.getAttribute( \"data-title\" ) === 'prev' ) {\n\n            if ( currentChartType > 0 ) {\n                currentChartType--;\n                updateViewType( currentChartType );\n            }\n\n        } else {\n\n            if ( currentChartType < typeViewCount ) {\n                currentChartType++;\n                updateViewType( currentChartType );\n            }\n\n        }\n\n    } );\n\n    //图表类型变化\n    $( '#scrollBed' ).delegate( \".view-box\", \"click\", function (e) {\n\n        var index = $( this ).attr( \"data-chart-type\" );\n        $chartsTypeViewBox.removeClass( \"selected\" );\n        $( $chartsTypeViewBox[ index ] ).addClass( \"selected\" );\n\n        currentChartType = index | 0;\n\n        //饼图， 禁用部分配置\n        if ( currentChartType === chartsConfig.length - 1 ) {\n\n            disableNotPieConfig();\n\n        //启用完整配置\n        } else {\n\n            enableNotPieConfig();\n\n        }\n\n        renderCharts();\n\n    } );\n\n}\n\nfunction renderCharts () {\n\n    var data = collectData();\n\n    $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {\n\n        credits: {\n            enabled: false\n        },\n        exporting: {\n            enabled: false\n        },\n        title: {\n            text: data.title,\n            x: -20 //center\n        },\n        subtitle: {\n            text: data.subTitle,\n            x: -20\n        },\n        xAxis: {\n            title: {\n                text: data.xTitle\n            },\n            categories: data.categories\n        },\n        yAxis: {\n            title: {\n                text: data.yTitle\n            },\n            plotLines: [{\n                value: 0,\n                width: 1,\n                color: '#808080'\n            }]\n        },\n        tooltip: {\n            enabled: true,\n            valueSuffix: data.suffix\n        },\n        legend: {\n            layout: 'vertical',\n            align: 'right',\n            verticalAlign: 'middle',\n            borderWidth: 1\n        },\n        series: data.series\n\n    } ));\n\n}\n\nfunction updateViewType ( index ) {\n\n    $( \"#scrollBed\" ).css( 'marginLeft', -index*324+'px' );\n\n}\n\nfunction collectData () {\n\n    var form = document.forms[ 'data-form' ],\n        data = null;\n\n    if ( currentChartType !== chartsConfig.length - 1 ) {\n\n        data = getSeriesAndCategories();\n        $.extend( data, getUserConfig() );\n\n    //饼图数据格式\n    } else {\n        data = getSeriesForPieChart();\n        data.title = form[ 'title' ].value;\n        data.suffix = form[ 'unit' ].value;\n    }\n\n    return data;\n\n}\n\n/**\n * 获取用户配置信息\n */\nfunction getUserConfig () {\n\n    var form = document.forms[ 'data-form' ],\n        info = {\n            title: form[ 'title' ].value,\n            subTitle: form[ 'sub-title' ].value,\n            xTitle: form[ 'x-title' ].value,\n            yTitle: form[ 'y-title' ].value,\n            suffix: form[ 'unit' ].value,\n            //数据对齐方式\n            tableDataFormat: getTableDataFormat (),\n            //饼图提示文字\n            tip: $( \"#tipInput\" ).val()\n        };\n\n    return info;\n\n}\n\nfunction setUserConfig ( config ) {\n\n    var form = document.forms[ 'data-form' ];\n\n    config.title && ( form[ 'title' ].value = config.title );\n    config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );\n    config.xTitle && ( form[ 'x-title' ].value = config.xTitle );\n    config.yTitle && ( form[ 'y-title' ].value = config.yTitle );\n    config.suffix && ( form[ 'unit' ].value = config.suffix );\n    config.dataFormat == \"-1\" && ( form[ 'charts-format' ][ 1 ].checked = true );\n    config.tip && ( form[ 'tip' ].value = config.tip );\n    currentChartType = config.chartType || 0;\n\n}\n\nfunction getSeriesAndCategories () {\n\n    var form = document.forms[ 'data-form' ],\n        series = [],\n        categories = [],\n        tmp = [],\n        tableData = getTableData();\n\n    //反转数据\n    if ( getTableDataFormat() === \"-1\" ) {\n\n        for ( var i = 0, len = tableData.length; i < len; i++ ) {\n\n            for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {\n\n                if ( !tmp[ j ] ) {\n                    tmp[ j ] = [];\n                }\n\n                tmp[ j ][ i ] = tableData[ i ][ j ];\n\n            }\n\n        }\n\n        tableData = tmp;\n\n    }\n\n    categories = tableData[0].slice( 1 );\n\n    for ( var i = 1, data; data = tableData[ i ]; i++ ) {\n\n        series.push( {\n            name: data[ 0 ],\n            data: data.slice( 1 )\n        } );\n\n    }\n\n    return {\n        series: series,\n        categories: categories\n    };\n\n}\n\n/*\n * 获取数据源数据对齐方式\n */\nfunction getTableDataFormat () {\n\n    var form = document.forms[ 'data-form' ],\n        items = form['charts-format'];\n\n    return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;\n\n}\n\n/*\n * 禁用非饼图类型的配置项\n */\nfunction disableNotPieConfig() {\n\n    updateConfigItem( 'disable' );\n\n}\n\n/*\n * 启用非饼图类型的配置项\n */\nfunction enableNotPieConfig() {\n\n    updateConfigItem( 'enable' );\n\n}\n\nfunction updateConfigItem ( value ) {\n\n    var table = $( \"#showTable\" )[ 0 ],\n        isDisable = value === 'disable' ? true : false;\n\n    //table中的input处理\n    for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {\n\n        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {\n\n            $( \"input\", cell ).attr( \"disabled\", isDisable );\n\n        }\n\n    }\n\n    //其他项处理\n    $( \"input.not-pie-item\" ).attr( \"disabled\", isDisable );\n    $( \"#tipInput\" ).attr( \"disabled\", !isDisable )\n\n}\n\n/*\n * 获取饼图数据\n * 饼图的数据只取第一行的\n **/\nfunction getSeriesForPieChart () {\n\n    var series = {\n            type: 'pie',\n            name: $(\"#tipInput\").val(),\n            data: []\n        },\n        tableData = getTableData();\n\n\n    for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {\n\n        var title = tableData[ 0 ][ j ],\n            val = tableData[ 1 ][ j ];\n\n        series.data.push( [ title, val ] );\n\n    }\n\n    return {\n        series: [ series ]\n    };\n\n}\n\nfunction getTableData () {\n\n    var table = document.getElementById( \"showTable\" ),\n        xCount = table.rows[0].cells.length - 1,\n        values = getTableInputValue();\n\n    for ( var i = 0, value; value = values[ i ]; i++ ) {\n\n        tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];\n\n    }\n\n    return tableData;\n\n}\n\nfunction getTableInputValue () {\n\n    var table = document.getElementById( \"showTable\" ),\n        inputs = table.getElementsByTagName( \"input\" ),\n        values = [];\n\n    for ( var i = 0, input; input = inputs[ i ]; i++ ) {\n        values.push( input.value | 0 );\n    }\n\n    return values;\n\n}\n\nfunction getCellValue ( cell ) {\n\n    var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );\n\n    return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\\s+|\\s+$/g, '' );\n\n}\n\n\n//dialog确认事件\ndialog.onok = function () {\n\n    //收集信息\n    var form = document.forms[ 'data-form' ],\n        info = getUserConfig();\n\n    //添加图表类型\n    info.chartType = currentChartType;\n\n    //同步表格数据到编辑器\n    syncTableData();\n\n    //执行图表命令\n    editor.execCommand( 'charts', info );\n\n};\n\n/*\n * 同步图表编辑视图的表格数据到编辑器里的原始表格\n */\nfunction syncTableData () {\n\n    var tableData = getTableData();\n\n    for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {\n\n        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {\n\n            cell.innerHTML = tableData[ i ] [ j ];\n\n        }\n\n    }\n\n}"
  },
  {
    "path": "static/common/user/uedit/dialogs/emotion/emotion.css",
    "content": ".jd img{\n    background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;\n    cursor:pointer;width:35px;height:35px;display:block;\n}\n.pp img{\n    background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;\n    cursor:pointer;width:25px;height:25px;display:block;\n}\n.ldw img{\n    background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;\n    cursor:pointer;width:35px;height:35px;display:block;\n}\n.tsj img{\n    background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;\n    cursor:pointer;width:35px;height:35px;display:block;\n}\n.cat img{\n    background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;\n    cursor:pointer;width:35px;height:35px;display:block;\n}\n.bb img{\n    background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;\n    cursor:pointer;width:35px;height:35px;display:block;\n}\n.youa img{\n    background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;\n    cursor:pointer;width:35px;height:35px;display:block;\n}\n\n.smileytable td {height: 37px;}\n#tabPanel{margin-left:5px;overflow: hidden;}\n#tabContent {float:left;background:#FFFFFF;}\n#tabContent div{display: none;width:480px;overflow:hidden;}\n#tabIconReview.show{left:17px;display:block;}\n.menuFocus{background:#ACCD3C;}\n.menuDefault{background:#FFFFFF;}\n#tabIconReview{position:absolute;left:406px;left:398px \\9;top:41px;z-index:65533;width:90px;height:76px;}\nimg.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}\n\n.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}\n.tabbody table{width: 100%;}\n.tabbody td{border:1px solid #BAC498;}\n.tabbody td span{display: block;zoom:1;padding:0 4px;}"
  },
  {
    "path": "static/common/user/uedit/dialogs/emotion/emotion.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" >\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <meta name=\"robots\" content=\"noindex, nofollow\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"emotion.css\">\n</head>\n<body>\n<div id=\"tabPanel\" class=\"wrapper\">\n    <div id=\"tabHeads\" class=\"tabhead\">\n        <span><var id=\"lang_input_choice\"></var></span>\n        <span><var id=\"lang_input_Tuzki\"></var></span>\n        <span><var id=\"lang_input_lvdouwa\"></var></span>\n        <span><var id=\"lang_input_BOBO\"></var></span>\n        <span><var id=\"lang_input_babyCat\"></var></span>\n        <span><var id=\"lang_input_bubble\"></var></span>\n        <span><var id=\"lang_input_youa\"></var></span>\n    </div>\n    <div id=\"tabBodys\" class=\"tabbody\">\n        <div id=\"tab0\"></div>\n        <div id=\"tab1\"></div>\n        <div id=\"tab2\"></div>\n        <div id=\"tab3\"></div>\n        <div id=\"tab4\"></div>\n        <div id=\"tab5\"></div>\n        <div id=\"tab6\"></div>\n    </div>\n</div>\n<div id=\"tabIconReview\">\n    <img id='faceReview' class='review' src=\"../../themes/default/images/spacer.gif\"/>\n</div>\n<script type=\"text/javascript\" src=\"emotion.js\"></script>\n<script type=\"text/javascript\">\n    var emotion = {\n        tabNum:7, //切换面板数量\n        SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名\n        imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径\n        imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名\n        imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移\n        SmileyInfor:{\n            tab0:['Kiss', 'Love', 'Yeah', '啊！', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],\n            tab1:['Kiss', 'Love', 'Yeah', '啊！', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么？', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],\n            tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢？', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],\n            tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],\n            tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],\n            tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],\n            tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']\n        }\n    };\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/emotion/emotion.js",
    "content": "window.onload = function () {\n    editor.setOpt({\n        emotionLocalization:false\n    });\n\n    emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : \"http://img.baidu.com/hi/\";\n    emotion.SmileyBox = createTabList( emotion.tabNum );\n    emotion.tabExist = createArr( emotion.tabNum );\n\n    initImgName();\n    initEvtHandler( \"tabHeads\" );\n};\n\nfunction initImgName() {\n    for ( var pro in emotion.SmilmgName ) {\n        var tempName = emotion.SmilmgName[pro],\n                tempBox = emotion.SmileyBox[pro],\n                tempStr = \"\";\n\n        if ( tempBox.length ) return;\n        for ( var i = 1; i <= tempName[1]; i++ ) {\n            tempStr = tempName[0];\n            if ( i < 10 ) tempStr = tempStr + '0';\n            tempStr = tempStr + i + '.gif';\n            tempBox.push( tempStr );\n        }\n    }\n}\n\nfunction initEvtHandler( conId ) {\n    var tabHeads = $G( conId );\n    for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) {\n        var tabObj = tabHeads.childNodes[i];\n        if ( tabObj.nodeType == 1 ) {\n            domUtils.on( tabObj, \"click\", (function ( index ) {\n                return function () {\n                    switchTab( index );\n                };\n            })( j ) );\n            j++;\n        }\n    }\n    switchTab( 0 );\n    $G( \"tabIconReview\" ).style.display = 'none';\n}\n\nfunction InsertSmiley( url, evt ) {\n    var obj = {\n        src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + \"dialogs/emotion/\" + url : url\n    };\n    obj._src = obj.src;\n    editor.execCommand( 'insertimage', obj );\n    if ( !evt.ctrlKey ) {\n        dialog.popup.hide();\n    }\n}\n\nfunction switchTab( index ) {\n\n    autoHeight( index );\n    if ( emotion.tabExist[index] == 0 ) {\n        emotion.tabExist[index] = 1;\n        createTab( 'tab' + index );\n    }\n    //获取呈现元素句柄数组\n    var tabHeads = $G( \"tabHeads\" ).getElementsByTagName( \"span\" ),\n            tabBodys = $G( \"tabBodys\" ).getElementsByTagName( \"div\" ),\n            i = 0, L = tabHeads.length;\n    //隐藏所有呈现元素\n    for ( ; i < L; i++ ) {\n        tabHeads[i].className = \"\";\n        tabBodys[i].style.display = \"none\";\n    }\n    //显示对应呈现元素\n    tabHeads[index].className = \"focus\";\n    tabBodys[index].style.display = \"block\";\n}\n\nfunction autoHeight( index ) {\n    var iframe = dialog.getDom( \"iframe\" ),\n            parent = iframe.parentNode.parentNode;\n    switch ( index ) {\n        case 0:\n            iframe.style.height = \"380px\";\n            parent.style.height = \"392px\";\n            break;\n        case 1:\n            iframe.style.height = \"220px\";\n            parent.style.height = \"232px\";\n            break;\n        case 2:\n            iframe.style.height = \"260px\";\n            parent.style.height = \"272px\";\n            break;\n        case 3:\n            iframe.style.height = \"300px\";\n            parent.style.height = \"312px\";\n            break;\n        case 4:\n            iframe.style.height = \"140px\";\n            parent.style.height = \"152px\";\n            break;\n        case 5:\n            iframe.style.height = \"260px\";\n            parent.style.height = \"272px\";\n            break;\n        case 6:\n            iframe.style.height = \"230px\";\n            parent.style.height = \"242px\";\n            break;\n        default:\n\n    }\n}\n\n\nfunction createTab( tabName ) {\n    var faceVersion = \"?v=1.1\", //版本号\n            tab = $G( tabName ), //获取将要生成的Div句柄\n            imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径\n            positionLine = 11 / 2, //中间数\n            iWidth = iHeight = 35, //图片长宽\n            iColWidth = 3, //表格剩余空间的显示比例\n            tableCss = emotion.imageCss[tabName],\n            cssOffset = emotion.imageCssOffset[tabName],\n            textHTML = ['<table class=\"smileytable\">'],\n            i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,\n            sUrl, realUrl, posflag, offset, infor;\n\n    for ( ; i < imgNum; ) {\n        textHTML.push( '<tr>' );\n        for ( var j = 0; j < imgColNum; j++, i++ ) {\n            faceImage = emotion.SmileyBox[tabName][i];\n            if ( faceImage ) {\n                sUrl = imagePath + faceImage + faceVersion;\n                realUrl = imagePath + faceImage;\n                posflag = j < positionLine ? 0 : 1;\n                offset = cssOffset * i * (-1) - 1;\n                infor = emotion.SmileyInfor[tabName][i];\n\n                textHTML.push( '<td  class=\"' + tableCss + '\"   border=\"1\" width=\"' + iColWidth + '%\" style=\"border-collapse:collapse;\" align=\"center\"  bgcolor=\"transparent\" onclick=\"InsertSmiley(\\'' + realUrl.replace( /'/g, \"\\\\'\" ) + '\\',event)\" onmouseover=\"over(this,\\'' + sUrl + '\\',\\'' + posflag + '\\')\" onmouseout=\"out(this)\">' );\n                textHTML.push( '<span>' );\n                textHTML.push( '<img  style=\"background-position:left ' + offset + 'px;\" title=\"' + infor + '\" src=\"' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif\" width=\"' : 'default/0.gif\" width=\"') + iWidth + '\" height=\"' + iHeight + '\"></img>' );\n                textHTML.push( '</span>' );\n            } else {\n                textHTML.push( '<td width=\"' + iColWidth + '%\"   bgcolor=\"#FFFFFF\">' );\n            }\n            textHTML.push( '</td>' );\n        }\n        textHTML.push( '</tr>' );\n    }\n    textHTML.push( '</table>' );\n    textHTML = textHTML.join( \"\" );\n    tab.innerHTML = textHTML;\n}\n\nfunction over( td, srcPath, posFlag ) {\n    td.style.backgroundColor = \"#ACCD3C\";\n    $G( 'faceReview' ).style.backgroundImage = \"url(\" + srcPath + \")\";\n    if ( posFlag == 1 ) $G( \"tabIconReview\" ).className = \"show\";\n    $G( \"tabIconReview\" ).style.display = 'block';\n}\n\nfunction out( td ) {\n    td.style.backgroundColor = \"transparent\";\n    var tabIconRevew = $G( \"tabIconReview\" );\n    tabIconRevew.className = \"\";\n    tabIconRevew.style.display = 'none';\n}\n\nfunction createTabList( tabNum ) {\n    var obj = {};\n    for ( var i = 0; i < tabNum; i++ ) {\n        obj[\"tab\" + i] = [];\n    }\n    return obj;\n}\n\nfunction createArr( tabNum ) {\n    var arr = [];\n    for ( var i = 0; i < tabNum; i++ ) {\n        arr[i] = 0;\n    }\n    return arr;\n}\n\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/gmap/gmap.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n        \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title></title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        .content{width:530px; height: 350px;margin: 10px auto;}\n        .content table{width: 100%}\n        .content table td{vertical-align: middle;}\n        #address{width:220px;height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}\n    </style>\n    <script type=\"text/javascript\" src=\"http://maps.googleapis.com/maps/api/js?sensor=false\"></script>\n</head>\n<body>\n<div class=\"content\">\n    <table>\n        <tr>\n            <td><label for=\"address\"><var id=\"lang_input_address\"></var></label></td>\n            <td><input id=\"address\" type=\"text\" /></td>\n            <td><a id=\"doSearch\" href=\"javascript:void(0)\" class=\"button\"><var id=\"lang_input_search\"></var></a></td>\n        </tr>\n    </table>\n    <div id=\"container\" style=\"width: 100%; height: 340px;margin: 5px auto; border: 1px solid gray;\"></div>\n</div>\n<script type=\"text/javascript\">\n    domUtils.on(window,\"load\",function(){\n        var map = new google.maps.Map(document.getElementById('container'), {\n                zoom: 3,\n                streetViewControl: false,\n                scaleControl: true,\n                mapTypeId: google.maps.MapTypeId.ROADMAP\n            });\n            var imgcss;\n            var marker = new google.maps.Marker({\n                map: map,\n                draggable: true\n            });\n            function doSearch(){\n                var address = document.getElementById('address').value;\n                var geocoder = new google.maps.Geocoder();\n                geocoder.geocode( { 'address': address}, function (results, status) {\n                    if (status == google.maps.GeocoderStatus.OK) {\n                        var bounds = results[0].geometry.viewport;\n                        map.fitBounds(bounds);\n                        marker.setPosition(results[0].geometry.location);\n                        marker.setTitle(address);\n                    } else alert(lang.searchError);\n                });\n            }\n            $G('address').onkeydown = function (evt){\n                evt = evt || event;\n                if (evt.keyCode == 13) {\n                    doSearch();\n                }\n            };\n            $G(\"doSearch\").onclick = doSearch;\n            dialog.onok = function (){\n                var center = map.getCenter();\n                var point = marker.getPosition();\n                var url = \"http://maps.googleapis.com/maps/api/staticmap?center=\" + center.lat() + ',' + center.lng() + \"&zoom=\" + map.zoom + \"&size=520x340&maptype=\" + map.getMapTypeId() + \"&markers=\" + point.lat() + ',' + point.lng() + \"&sensor=false\";\n                editor.execCommand('inserthtml', '<img width=\"520\" height=\"340\" src=\"' + url + '\"' + (imgcss ? ' style=\"' + imgcss + '\"' :'') + '/>');\n            };\n\n            function getPars(str,par){\n                var reg = new RegExp(par+\"=((\\\\d+|[.,])*)\",\"g\");\n                return reg.exec(str)[1];\n            }\n            var img = editor.selection.getRange().getClosedNode();\n            if(img && img.src.indexOf(\"http://maps.googleapis.com/maps/api/staticmap\")!=-1){\n                var url = img.getAttribute(\"src\");\n                var centers = getPars(url,\"center\").split(\",\");\n                point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));\n                map.setCenter(point);\n                map.setZoom(Number(getPars(url,\"zoom\")));\n                centers = getPars(url,\"markers\").split(\",\");\n                marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));\n                imgcss = img.style.cssText;\n            }else{\n                setTimeout(function(){\n                    doSearch();\n                },30)\n            }\n    });\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/help/help.css",
    "content": ".wrapper{width: 370px;margin: 10px auto;zoom: 1;}\n.tabbody{height: 360px;}\n.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;}\n.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;}\n.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;}\n.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;}\n.tabbody table thead{font-weight: bold;line-height: 25px;}"
  },
  {
    "path": "static/common/user/uedit/dialogs/help/help.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n        \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n    <title>帮助</title>\n    <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"help.css\">\n</head>\n<body>\n<div class=\"wrapper\" id=\"helptab\">\n    <div id=\"tabHeads\" class=\"tabhead\">\n        <span class=\"focus\" tabsrc=\"about\"><var id=\"lang_input_about\"></var></span>\n        <span tabsrc=\"shortcuts\"><var id=\"lang_input_shortcuts\"></var></span>\n    </div>\n    <div id=\"tabBodys\" class=\"tabbody\">\n        <div id=\"about\" class=\"panel\">\n            <h1>UEditor</h1>\n            <p id=\"version\"></p>\n            <p><var id=\"lang_input_introduction\"></var></p>\n        </div>\n        <div id=\"shortcuts\" class=\"panel\">\n            <table>\n                <thead>\n                <tr>\n                    <td><var id=\"lang_Txt_shortcuts\"></var></td>\n                    <td><var id=\"lang_Txt_func\"></var></td>\n                </tr>\n                </thead>\n                <tbody>\n                <tr>\n                    <td>ctrl+b</td>\n                    <td><var id=\"lang_Txt_bold\"></var></td>\n                </tr>\n                <tr>\n                    <td>ctrl+c</td>\n                    <td><var id=\"lang_Txt_copy\"></var></td>\n                </tr>\n                <tr>\n                    <td>ctrl+x</td>\n                    <td><var id=\"lang_Txt_cut\"></var></td>\n                </tr>\n                <tr>\n                    <td>ctrl+v</td>\n                    <td><var id=\"lang_Txt_Paste\"></var></td>\n                </tr>\n                <tr>\n                    <td>ctrl+y</td>\n                    <td><var id=\"lang_Txt_undo\"></var></td>\n                </tr>\n                <tr>\n                    <td>ctrl+z</td>\n                    <td><var id=\"lang_Txt_redo\"></var></td>\n                </tr>\n                <tr>\n                    <td>ctrl+i</td>\n                    <td><var id=\"lang_Txt_italic\"></var></td>\n                </tr>\n                <tr>\n                    <td>ctrl+u</td>\n                    <td><var id=\"lang_Txt_underline\"></var></td>\n                </tr>\n                <tr>\n                    <td>ctrl+a</td>\n                    <td><var id=\"lang_Txt_selectAll\"></var></td>\n                </tr>\n                <tr>\n                    <td>shift+enter</td>\n                    <td><var id=\"lang_Txt_visualEnter\"></var></td>\n                </tr>\n                <tr>\n                    <td>alt+z</td>\n                    <td><var id=\"lang_Txt_fullscreen\"></var></td>\n                </tr>\n                </tbody>\n            </table>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" src=\"help.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/help/help.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: xuheng\n * Date: 12-9-26\n * Time: 下午1:06\n * To change this template use File | Settings | File Templates.\n */\n/**\n * tab点击处理事件\n * @param tabHeads\n * @param tabBodys\n * @param obj\n */\nfunction clickHandler( tabHeads,tabBodys,obj ) {\n    //head样式更改\n    for ( var k = 0, len = tabHeads.length; k < len; k++ ) {\n        tabHeads[k].className = \"\";\n    }\n    obj.className = \"focus\";\n    //body显隐\n    var tabSrc = obj.getAttribute( \"tabSrc\" );\n    for ( var j = 0, length = tabBodys.length; j < length; j++ ) {\n        var body = tabBodys[j],\n            id = body.getAttribute( \"id\" );\n        body.onclick = function(){\n            this.style.zoom = 1;\n        };\n        if ( id != tabSrc ) {\n            body.style.zIndex = 1;\n        } else {\n            body.style.zIndex = 200;\n        }\n    }\n\n}\n\n/**\n * TAB切换\n * @param tabParentId  tab的父节点ID或者对象本身\n */\nfunction switchTab( tabParentId ) {\n    var tabElements = $G( tabParentId ).children,\n        tabHeads = tabElements[0].children,\n        tabBodys = tabElements[1].children;\n\n    for ( var i = 0, length = tabHeads.length; i < length; i++ ) {\n        var head = tabHeads[i];\n        if ( head.className === \"focus\" )clickHandler(tabHeads,tabBodys, head );\n        head.onclick = function () {\n            clickHandler(tabHeads,tabBodys,this);\n        }\n    }\n}\nswitchTab(\"helptab\");\n\ndocument.getElementById('version').innerHTML = parent.UE.version;"
  },
  {
    "path": "static/common/user/uedit/dialogs/image/image.css",
    "content": "@charset \"utf-8\";\n/* dialog样式 */\n.wrapper {\n    zoom: 1;\n    width: 630px;\n    *width: 626px;\n    height: 380px;\n    margin: 0 auto;\n    padding: 10px;\n    position: relative;\n    font-family: sans-serif;\n}\n\n/*tab样式框大小*/\n.tabhead {\n    float:left;\n}\n.tabbody {\n    width: 100%;\n    height: 346px;\n    position: relative;\n    clear: both;\n}\n\n.tabbody .panel {\n    position: absolute;\n    width: 0;\n    height: 0;\n    background: #fff;\n    overflow: hidden;\n    display: none;\n}\n\n.tabbody .panel.focus {\n    width: 100%;\n    height: 346px;\n    display: block;\n}\n\n/* 图片对齐方式 */\n.alignBar{\n    float:right;\n    margin-top: 5px;\n    position: relative;\n}\n\n.alignBar .algnLabel{\n    float:left;\n    height: 20px;\n    line-height: 20px;\n}\n\n.alignBar #alignIcon{\n    zoom:1;\n    _display: inline;\n    display: inline-block;\n    position: relative;\n}\n.alignBar #alignIcon span{\n    float: left;\n    cursor: pointer;\n    display: block;\n    width: 19px;\n    height: 17px;\n    margin-right: 3px;\n    margin-left: 3px;\n    background-image: url(./images/alignicon.jpg);\n}\n.alignBar #alignIcon .none-align{\n    background-position: 0 -18px;\n}\n.alignBar #alignIcon .left-align{\n    background-position: -20px -18px;\n}\n.alignBar #alignIcon .right-align{\n    background-position: -40px -18px;\n}\n.alignBar #alignIcon .center-align{\n    background-position: -60px -18px;\n}\n.alignBar #alignIcon .none-align.focus{\n    background-position: 0 0;\n}\n.alignBar #alignIcon .left-align.focus{\n    background-position: -20px 0;\n}\n.alignBar #alignIcon .right-align.focus{\n    background-position: -40px 0;\n}\n.alignBar #alignIcon .center-align.focus{\n    background-position: -60px 0;\n}\n\n\n\n\n/* 远程图片样式 */\n#remote {\n    z-index: 200;\n}\n\n#remote .top{\n    width: 100%;\n    margin-top: 25px;\n}\n#remote .left{\n    display: block;\n    float: left;\n    width: 300px;\n    height:10px;\n}\n#remote .right{\n    display: block;\n    float: right;\n    width: 300px;\n    height:10px;\n}\n#remote .row{\n    margin-left: 20px;\n    clear: both;\n    height: 40px;\n}\n\n#remote .row label{\n    text-align: center;\n    width: 50px;\n    zoom:1;\n    _display: inline;\n    display:inline-block;\n    vertical-align: middle;\n}\n#remote .row label.algnLabel{\n    float: left;\n\n}\n\n#remote input.text{\n    width: 150px;\n    padding: 3px 6px;\n    font-size: 14px;\n    line-height: 1.42857143;\n    color: #555;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n#remote input.text:focus {\n    border-color: #66afe9;\n    outline: 0;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);\n}\n#remote #url{\n    width: 500px;\n    margin-bottom: 2px;\n}\n#remote #width,\n#remote #height{\n    width: 20px;\n    margin-left: 2px;\n    margin-right: 2px;\n}\n#remote #border,\n#remote #vhSpace,\n#remote #title{\n    width: 180px;\n    margin-right: 5px;\n}\n#remote #lock{\n}\n#remote #lockicon{\n    zoom: 1;\n    _display:inline;\n    display: inline-block;\n    width: 20px;\n    height: 20px;\n    background: url(\"../../themes/default/images/lock.gif\") -13px -13px no-repeat;\n    vertical-align: middle;\n}\n#remote #preview{\n    clear: both;\n    width: 260px;\n    height: 240px;\n    z-index: 9999;\n    margin-top: 10px;\n    background-color: #eee;\n    overflow: hidden;\n}\n\n/* 上传图片 */\n.tabbody #upload.panel {\n    width: 0;\n    height: 0;\n    overflow: hidden;\n    position: absolute !important;\n    clip: rect(1px, 1px, 1px, 1px);\n    background: #fff;\n    display: block;\n}\n\n.tabbody #upload.panel.focus {\n    width: 100%;\n    height: 346px;\n    display: block;\n    clip: auto;\n}\n\n#upload .queueList {\n    margin: 0;\n    width: 100%;\n    height: 100%;\n    position: absolute;\n    overflow: hidden;\n}\n\n#upload p {\n    margin: 0;\n}\n\n.element-invisible {\n    width: 0 !important;\n    height: 0 !important;\n    border: 0;\n    padding: 0;\n    margin: 0;\n    overflow: hidden;\n    position: absolute !important;\n    clip: rect(1px, 1px, 1px, 1px);\n}\n\n#upload .placeholder {\n    margin: 10px;\n    border: 2px dashed #e6e6e6;\n    *border: 0px dashed #e6e6e6;\n    height: 172px;\n    padding-top: 150px;\n    text-align: center;\n    background: url(./images/image.png) center 70px no-repeat;\n    color: #cccccc;\n    font-size: 18px;\n    position: relative;\n    top:0;\n    *top: 10px;\n}\n\n#upload .placeholder .webuploader-pick {\n    font-size: 18px;\n    background: #00b7ee;\n    border-radius: 3px;\n    line-height: 44px;\n    padding: 0 30px;\n    *width: 120px;\n    color: #fff;\n    display: inline-block;\n    margin: 0 auto 20px auto;\n    cursor: pointer;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n}\n\n#upload .placeholder .webuploader-pick-hover {\n    background: #00a2d4;\n}\n\n\n#filePickerContainer {\n    text-align: center;\n}\n\n#upload .placeholder .flashTip {\n    color: #666666;\n    font-size: 12px;\n    position: absolute;\n    width: 100%;\n    text-align: center;\n    bottom: 20px;\n}\n\n#upload .placeholder .flashTip a {\n    color: #0785d1;\n    text-decoration: none;\n}\n\n#upload .placeholder .flashTip a:hover {\n    text-decoration: underline;\n}\n\n#upload .placeholder.webuploader-dnd-over {\n    border-color: #999999;\n}\n\n#upload .filelist {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n    overflow-x: hidden;\n    overflow-y: auto;\n    position: relative;\n    height: 300px;\n}\n\n#upload .filelist:after {\n    content: '';\n    display: block;\n    width: 0;\n    height: 0;\n    overflow: hidden;\n    clear: both;\n    position: relative;\n}\n\n#upload .filelist li {\n    width: 113px;\n    height: 113px;\n    background: url(./images/bg.png);\n    text-align: center;\n    margin: 9px 0 0 9px;\n    *margin: 6px 0 0 6px;\n    position: relative;\n    display: block;\n    float: left;\n    overflow: hidden;\n    font-size: 12px;\n}\n\n#upload .filelist li p.log {\n    position: relative;\n    top: -45px;\n}\n\n#upload .filelist li p.title {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    top: 5px;\n    text-indent: 5px;\n    text-align: left;\n}\n\n#upload .filelist li p.progress {\n    position: absolute;\n    width: 100%;\n    bottom: 0;\n    left: 0;\n    height: 8px;\n    overflow: hidden;\n    z-index: 50;\n    margin: 0;\n    border-radius: 0;\n    background: none;\n    -webkit-box-shadow: 0 0 0;\n}\n\n#upload .filelist li p.progress span {\n    display: none;\n    overflow: hidden;\n    width: 0;\n    height: 100%;\n    background: #1483d8 url(./images/progress.png) repeat-x;\n\n    -webit-transition: width 200ms linear;\n    -moz-transition: width 200ms linear;\n    -o-transition: width 200ms linear;\n    -ms-transition: width 200ms linear;\n    transition: width 200ms linear;\n\n    -webkit-animation: progressmove 2s linear infinite;\n    -moz-animation: progressmove 2s linear infinite;\n    -o-animation: progressmove 2s linear infinite;\n    -ms-animation: progressmove 2s linear infinite;\n    animation: progressmove 2s linear infinite;\n\n    -webkit-transform: translateZ(0);\n}\n\n@-webkit-keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n@-moz-keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n@keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n#upload .filelist li p.imgWrap {\n    position: relative;\n    z-index: 2;\n    line-height: 113px;\n    vertical-align: middle;\n    overflow: hidden;\n    width: 113px;\n    height: 113px;\n\n    -webkit-transform-origin: 50% 50%;\n    -moz-transform-origin: 50% 50%;\n    -o-transform-origin: 50% 50%;\n    -ms-transform-origin: 50% 50%;\n    transform-origin: 50% 50%;\n\n    -webit-transition: 200ms ease-out;\n    -moz-transition: 200ms ease-out;\n    -o-transition: 200ms ease-out;\n    -ms-transition: 200ms ease-out;\n    transition: 200ms ease-out;\n}\n\n#upload .filelist li img {\n    width: 100%;\n}\n\n#upload .filelist li p.error {\n    background: #f43838;\n    color: #fff;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    height: 28px;\n    line-height: 28px;\n    width: 100%;\n    z-index: 100;\n    display:none;\n}\n\n#upload .filelist li .success {\n    display: block;\n    position: absolute;\n    left: 0;\n    bottom: 0;\n    height: 40px;\n    width: 100%;\n    z-index: 200;\n    background: url(./images/success.png) no-repeat right bottom;\n    background: url(./images/success.gif) no-repeat right bottom \\9;\n}\n\n#upload .filelist li.filePickerBlock {\n    width: 113px;\n    height: 113px;\n    background: url(./images/image.png) no-repeat center 12px;\n    border: 1px solid #eeeeee;\n    border-radius: 0;\n}\n#upload .filelist li.filePickerBlock div.webuploader-pick  {\n    width: 100%;\n    height: 100%;\n    margin: 0;\n    padding: 0;\n    opacity: 0;\n    background: none;\n    font-size: 0;\n}\n\n#upload .filelist div.file-panel {\n    position: absolute;\n    height: 0;\n    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \\0;\n    background: rgba(0, 0, 0, 0.5);\n    width: 100%;\n    top: 0;\n    left: 0;\n    overflow: hidden;\n    z-index: 300;\n}\n\n#upload .filelist div.file-panel span {\n    width: 24px;\n    height: 24px;\n    display: inline;\n    float: right;\n    text-indent: -9999px;\n    overflow: hidden;\n    background: url(./images/icons.png) no-repeat;\n    background: url(./images/icons.gif) no-repeat \\9;\n    margin: 5px 1px 1px;\n    cursor: pointer;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n}\n\n#upload .filelist div.file-panel span.rotateLeft {\n    display:none;\n    background-position: 0 -24px;\n}\n\n#upload .filelist div.file-panel span.rotateLeft:hover {\n    background-position: 0 0;\n}\n\n#upload .filelist div.file-panel span.rotateRight {\n    display:none;\n    background-position: -24px -24px;\n}\n\n#upload .filelist div.file-panel span.rotateRight:hover {\n    background-position: -24px 0;\n}\n\n#upload .filelist div.file-panel span.cancel {\n    background-position: -48px -24px;\n}\n\n#upload .filelist div.file-panel span.cancel:hover {\n    background-position: -48px 0;\n}\n\n#upload .statusBar {\n    height: 45px;\n    border-bottom: 1px solid #dadada;\n    margin: 0 10px;\n    padding: 0;\n    line-height: 45px;\n    vertical-align: middle;\n    position: relative;\n}\n\n#upload .statusBar .progress {\n    border: 1px solid #1483d8;\n    width: 198px;\n    background: #fff;\n    height: 18px;\n    position: absolute;\n    top: 12px;\n    display: none;\n    text-align: center;\n    line-height: 18px;\n    color: #6dbfff;\n    margin: 0 10px 0 0;\n}\n#upload .statusBar .progress span.percentage {\n    width: 0;\n    height: 100%;\n    left: 0;\n    top: 0;\n    background: #1483d8;\n    position: absolute;\n}\n#upload .statusBar .progress span.text {\n    position: relative;\n    z-index: 10;\n}\n\n#upload .statusBar .info {\n    display: inline-block;\n    font-size: 14px;\n    color: #666666;\n}\n\n#upload .statusBar .btns {\n    position: absolute;\n    top: 7px;\n    right: 0;\n    line-height: 30px;\n}\n\n#filePickerBtn {\n    display: inline-block;\n    float: left;\n}\n#upload .statusBar .btns .webuploader-pick,\n#upload .statusBar .btns .uploadBtn,\n#upload .statusBar .btns .uploadBtn.state-uploading,\n#upload .statusBar .btns .uploadBtn.state-paused {\n    background: #ffffff;\n    border: 1px solid #cfcfcf;\n    color: #565656;\n    padding: 0 18px;\n    display: inline-block;\n    border-radius: 3px;\n    margin-left: 10px;\n    cursor: pointer;\n    font-size: 14px;\n    float: left;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n}\n#upload .statusBar .btns .webuploader-pick-hover,\n#upload .statusBar .btns .uploadBtn:hover,\n#upload .statusBar .btns .uploadBtn.state-uploading:hover,\n#upload .statusBar .btns .uploadBtn.state-paused:hover {\n    background: #f0f0f0;\n}\n\n#upload .statusBar .btns .uploadBtn,\n#upload .statusBar .btns .uploadBtn.state-paused{\n    background: #00b7ee;\n    color: #fff;\n    border-color: transparent;\n}\n#upload .statusBar .btns .uploadBtn:hover,\n#upload .statusBar .btns .uploadBtn.state-paused:hover{\n    background: #00a2d4;\n}\n\n#upload .statusBar .btns .uploadBtn.disabled {\n    pointer-events: none;\n    filter:alpha(opacity=60);\n    -moz-opacity:0.6;\n    -khtml-opacity: 0.6;\n    opacity: 0.6;\n}\n\n\n\n/* 图片管理样式 */\n#online {\n    width: 100%;\n    height: 336px;\n    padding: 10px 0 0 0;\n}\n#online #imageList{\n    width: 100%;\n    height: 100%;\n    overflow-x: hidden;\n    overflow-y: auto;\n    position: relative;\n}\n#online ul {\n    display: block;\n    list-style: none;\n    margin: 0;\n    padding: 0;\n}\n#online li {\n    float: left;\n    display: block;\n    list-style: none;\n    padding: 0;\n    width: 113px;\n    height: 113px;\n    margin: 0 0 9px 9px;\n    *margin: 0 0 6px 6px;\n    background-color: #eee;\n    overflow: hidden;\n    cursor: pointer;\n    position: relative;\n}\n#online li.clearFloat {\n    float: none;\n    clear: both;\n    display: block;\n    width:0;\n    height:0;\n    margin: 0;\n    padding: 0;\n}\n#online li img {\n    cursor: pointer;\n}\n#online li .icon {\n    cursor: pointer;\n    width: 113px;\n    height: 113px;\n    position: absolute;\n    top: 0;\n    left: 0;\n    z-index: 2;\n    border: 0;\n    background-repeat: no-repeat;\n}\n#online li .icon:hover {\n    width: 107px;\n    height: 107px;\n    border: 3px solid #1094fa;\n}\n#online li.selected .icon {\n    background-image: url(images/success.png);\n    background-image: url(images/success.gif)\\9;\n    background-position: 75px 75px;\n}\n#online li.selected .icon:hover {\n    width: 107px;\n    height: 107px;\n    border: 3px solid #1094fa;\n    background-position: 72px 72px;\n}\n\n\n/* 图片搜索样式 */\n#search .searchBar {\n    width: 100%;\n    height: 30px;\n    margin: 10px 0 5px 0;\n    padding: 0;\n}\n\n#search input.text{\n    width: 150px;\n    padding: 3px 6px;\n    font-size: 14px;\n    line-height: 1.42857143;\n    color: #555;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n#search input.text:focus {\n    border-color: #66afe9;\n    outline: 0;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);\n    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);\n}\n#search input.searchTxt {\n    margin-left:5px;\n    padding-left: 5px;\n    background: #FFF;\n    width: 300px;\n    *width: 260px;\n    height: 21px;\n    line-height: 21px;\n    float: left;\n    dislay: block;\n}\n\n#search .searchType {\n    width: 65px;\n    height: 28px;\n    padding:0;\n    line-height: 28px;\n    border: 1px solid #d7d7d7;\n    border-radius: 0;\n    vertical-align: top;\n    margin-left: 5px;\n    float: left;\n    dislay: block;\n}\n\n#search #searchBtn,\n#search #searchReset {\n    display: inline-block;\n    margin-bottom: 0;\n    margin-right: 5px;\n    padding: 4px 10px;\n    font-weight: 400;\n    text-align: center;\n    vertical-align: middle;\n    cursor: pointer;\n    background-image: none;\n    border: 1px solid transparent;\n    white-space: nowrap;\n    font-size: 14px;\n    border-radius: 4px;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    vertical-align: top;\n    float: right;\n}\n\n#search #searchBtn {\n    color: white;\n    border-color: #285e8e;\n    background-color: #3b97d7;\n}\n#search #searchReset {\n    color: #333;\n    border-color: #ccc;\n    background-color: #fff;\n}\n#search #searchBtn:hover {\n    background-color: #3276b1;\n}\n#search #searchReset:hover {\n    background-color: #eee;\n}\n\n#search .msg {\n    margin-left: 5px;\n}\n\n#search .searchList{\n    width: 100%;\n    height: 300px;\n    overflow: hidden;\n    clear: both;\n}\n#search .searchList ul{\n    margin:0;\n    padding:0;\n    list-style:none;\n    clear: both;\n    width: 100%;\n    height: 100%;\n    overflow-x: hidden;\n    overflow-y: auto;\n    zoom: 1;\n    position: relative;\n}\n\n#search .searchList li {\n    list-style:none;\n    float: left;\n    display: block;\n    width: 115px;\n    margin: 5px 10px 5px 20px;\n    *margin: 5px 10px 5px 15px;\n    padding:0;\n    font-size: 12px;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, .3);\n    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);\n    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);\n    position: relative;\n    vertical-align: top;\n    text-align: center;\n    overflow: hidden;\n    cursor: pointer;\n    filter: alpha(Opacity=100);\n    -moz-opacity: 1;\n    opacity: 1;\n    border: 2px solid #eee;\n}\n\n#search .searchList li.selected {\n    filter: alpha(Opacity=40);\n    -moz-opacity: 0.4;\n    opacity: 0.4;\n    border: 2px solid #00a0e9;\n}\n\n#search .searchList li p {\n    background-color: #eee;\n    margin: 0;\n    padding: 0;\n    position: relative;\n    width:100%;\n    height:115px;\n    overflow: hidden;\n}\n\n#search .searchList li p img {\n    cursor: pointer;\n    border: 0;\n}\n\n#search .searchList li a {\n    color: #999;\n    border-top: 1px solid #F2F2F2;\n    background: #FAFAFA;\n    text-align: center;\n    display: block;\n    padding: 0 5px;\n    width: 105px;\n    height:32px;\n    line-height:32px;\n    white-space:nowrap;\n    text-overflow:ellipsis;\n    text-decoration: none;\n    overflow: hidden;\n    word-break: break-all;\n}\n\n#search .searchList a:hover {\n    text-decoration: underline;\n    color: #333;\n}\n#search .searchList .clearFloat{\n    clear: both;\n}"
  },
  {
    "path": "static/common/user/uedit/dialogs/image/image.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>ueditor图片对话框</title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n\n    <!-- jquery -->\n    <script type=\"text/javascript\" src=\"../../third-party/jquery-1.10.2.min.js\"></script>\n\n    <!-- webuploader -->\n    <script src=\"../../third-party/webuploader/webuploader.min.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../third-party/webuploader/webuploader.css\">\n\n    <!-- image dialog -->\n    <link rel=\"stylesheet\" href=\"image.css\" type=\"text/css\" />\n</head>\n<body>\n\n    <div class=\"wrapper\">\n        <div id=\"tabhead\" class=\"tabhead\">\n            <span class=\"tab\" data-content-id=\"remote\"><var id=\"lang_tab_remote\"></var></span>\n            <span class=\"tab focus\" data-content-id=\"upload\"><var id=\"lang_tab_upload\"></var></span>\n            <span class=\"tab\" data-content-id=\"online\"><var id=\"lang_tab_online\"></var></span>\n            <!--span class=\"tab\" data-content-id=\"search\"><var id=\"lang_tab_search\"></var></span-->\n        </div>\n        <div class=\"alignBar\">\n            <label class=\"algnLabel\"><var id=\"lang_input_align\"></var></label>\n                    <span id=\"alignIcon\">\n                        <span id=\"noneAlign\" class=\"none-align focus\" data-align=\"none\"></span>\n                        <span id=\"leftAlign\" class=\"left-align\" data-align=\"left\"></span>\n                        <span id=\"rightAlign\" class=\"right-align\" data-align=\"right\"></span>\n                        <span id=\"centerAlign\" class=\"center-align\" data-align=\"center\"></span>\n                    </span>\n            <input id=\"align\" name=\"align\" type=\"hidden\" value=\"none\"/>\n        </div>\n        <div id=\"tabbody\" class=\"tabbody\">\n\n            <!-- 远程图片 -->\n            <div id=\"remote\" class=\"panel\">\n                <div class=\"top\">\n                    <div class=\"row\">\n                        <label for=\"url\"><var id=\"lang_input_url\"></var></label>\n                        <span><input class=\"text\" id=\"url\" type=\"text\"/></span>\n                    </div>\n                </div>\n                <div class=\"left\">\n                    <div class=\"row\">\n                        <label><var id=\"lang_input_size\"></var></label>\n                        <span><var id=\"lang_input_width\">&nbsp;&nbsp;</var><input class=\"text\" type=\"text\" id=\"width\"/>px </span>\n                        <span><var id=\"lang_input_height\">&nbsp;&nbsp;</var><input class=\"text\" type=\"text\" id=\"height\"/>px </span>\n                        <span><input id=\"lock\" type=\"checkbox\" disabled=\"disabled\"><span id=\"lockicon\"></span></span>\n                    </div>\n                    <div class=\"row\">\n                        <label><var id=\"lang_input_border\"></var></label>\n                        <span><input class=\"text\" type=\"text\" id=\"border\"/>px </span>\n                    </div>\n                    <div class=\"row\">\n                        <label><var id=\"lang_input_vhspace\"></var></label>\n                        <span><input class=\"text\" type=\"text\" id=\"vhSpace\"/>px </span>\n                    </div>\n                    <div class=\"row\">\n                        <label><var id=\"lang_input_title\"></var></label>\n                        <span><input class=\"text\" type=\"text\" id=\"title\"/></span>\n                    </div>\n                </div>\n                <div class=\"right\"><div id=\"preview\"></div></div>\n            </div>\n\n            <!-- 上传图片 -->\n            <div id=\"upload\" class=\"panel focus\">\n                <div id=\"queueList\" class=\"queueList\">\n                    <div class=\"statusBar element-invisible\">\n                        <div class=\"progress\">\n                            <span class=\"text\">0%</span>\n                            <span class=\"percentage\"></span>\n                        </div><div class=\"info\"></div>\n                        <div class=\"btns\">\n                            <div id=\"filePickerBtn\"></div>\n                            <div class=\"uploadBtn\"><var id=\"lang_start_upload\"></var></div>\n                        </div>\n                    </div>\n                    <div id=\"dndArea\" class=\"placeholder\">\n                        <div class=\"filePickerContainer\">\n                            <div id=\"filePickerReady\"></div>\n                        </div>\n                    </div>\n                    <ul class=\"filelist element-invisible\">\n                        <li id=\"filePickerBlock\" class=\"filePickerBlock\"></li>\n                    </ul>\n                </div>\n            </div>\n\n            <!-- 在线图片 -->\n            <div id=\"online\" class=\"panel\">\n                <div id=\"imageList\"><var id=\"lang_imgLoading\"></var></div>\n            </div>\n\n            <!-- 搜索图片 -->\n            <div id=\"search\" class=\"panel\">\n                <div class=\"searchBar\">\n                    <input id=\"searchTxt\" class=\"searchTxt text\" type=\"text\" />\n                    <select id=\"searchType\" class=\"searchType\">\n                        <option value=\"&s=4&z=0\"></option>\n                        <option value=\"&s=1&z=19\"></option>\n                        <option value=\"&s=2&z=0\"></option>\n                        <option value=\"&s=3&z=0\"></option>\n                    </select>\n                    <input id=\"searchReset\" type=\"button\"  />\n                    <input id=\"searchBtn\" type=\"button\"  />\n                </div>\n                <div id=\"searchList\" class=\"searchList\"><ul id=\"searchListUl\"></ul></div>\n            </div>\n\n        </div>\n    </div>\n    <script type=\"text/javascript\" src=\"image.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/image/image.js",
    "content": "/**\n * User: Jinqn\n * Date: 14-04-08\n * Time: 下午16:34\n * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片\n */\n\n(function () {\n\n    var remoteImage,\n        uploadImage,\n        onlineImage,\n        searchImage;\n\n    window.onload = function () {\n        initTabs();\n        initAlign();\n        initButtons();\n    };\n\n    /* 初始化tab标签 */\n    function initTabs() {\n        var tabs = $G('tabhead').children;\n        for (var i = 0; i < tabs.length; i++) {\n            domUtils.on(tabs[i], \"click\", function (e) {\n                var target = e.target || e.srcElement;\n                setTabFocus(target.getAttribute('data-content-id'));\n            });\n        }\n\n        var img = editor.selection.getRange().getClosedNode();\n        if (img && img.tagName && img.tagName.toLowerCase() == 'img') {\n            setTabFocus('remote');\n        } else {\n            setTabFocus('upload');\n        }\n    }\n\n    /* 初始化tabbody */\n    function setTabFocus(id) {\n        if(!id) return;\n        var i, bodyId, tabs = $G('tabhead').children;\n        for (i = 0; i < tabs.length; i++) {\n            bodyId = tabs[i].getAttribute('data-content-id');\n            if (bodyId == id) {\n                domUtils.addClass(tabs[i], 'focus');\n                domUtils.addClass($G(bodyId), 'focus');\n            } else {\n                domUtils.removeClasses(tabs[i], 'focus');\n                domUtils.removeClasses($G(bodyId), 'focus');\n            }\n        }\n        switch (id) {\n            case 'remote':\n                remoteImage = remoteImage || new RemoteImage();\n                break;\n            case 'upload':\n                setAlign(editor.getOpt('imageInsertAlign'));\n                uploadImage = uploadImage || new UploadImage('queueList');\n                break;\n            case 'online':\n                setAlign(editor.getOpt('imageManagerInsertAlign'));\n                onlineImage = onlineImage || new OnlineImage('imageList');\n                onlineImage.reset();\n                break;\n            case 'search':\n                setAlign(editor.getOpt('imageManagerInsertAlign'));\n                searchImage = searchImage || new SearchImage();\n                break;\n        }\n    }\n\n    /* 初始化onok事件 */\n    function initButtons() {\n\n        dialog.onok = function () {\n            var remote = false, list = [], id, tabs = $G('tabhead').children;\n            for (var i = 0; i < tabs.length; i++) {\n                if (domUtils.hasClass(tabs[i], 'focus')) {\n                    id = tabs[i].getAttribute('data-content-id');\n                    break;\n                }\n            }\n\n            switch (id) {\n                case 'remote':\n                    list = remoteImage.getInsertList();\n                    break;\n                case 'upload':\n                    list = uploadImage.getInsertList();\n                    var count = uploadImage.getQueueCount();\n                    if (count) {\n                        $('.info', '#queueList').html('<span style=\"color:red;\">' + '还有2个未上传文件'.replace(/[\\d]/, count) + '</span>');\n                        return false;\n                    }\n                    break;\n                case 'online':\n                    list = onlineImage.getInsertList();\n                    break;\n                case 'search':\n                    list = searchImage.getInsertList();\n                    remote = true;\n                    break;\n            }\n\n            if(list) {\n                editor.execCommand('insertimage', list);\n                remote && editor.fireEvent(\"catchRemoteImage\");\n            }\n        };\n    }\n\n\n    /* 初始化对其方式的点击事件 */\n    function initAlign(){\n        /* 点击align图标 */\n        domUtils.on($G(\"alignIcon\"), 'click', function(e){\n            var target = e.target || e.srcElement;\n            if(target.className && target.className.indexOf('-align') != -1) {\n                setAlign(target.getAttribute('data-align'));\n            }\n        });\n    }\n\n    /* 设置对齐方式 */\n    function setAlign(align){\n        align = align || 'none';\n        var aligns = $G(\"alignIcon\").children;\n        for(i = 0; i < aligns.length; i++){\n            if(aligns[i].getAttribute('data-align') == align) {\n                domUtils.addClass(aligns[i], 'focus');\n                $G(\"align\").value = aligns[i].getAttribute('data-align');\n            } else {\n                domUtils.removeClasses(aligns[i], 'focus');\n            }\n        }\n    }\n    /* 获取对齐方式 */\n    function getAlign(){\n        var align = $G(\"align\").value || 'none';\n        return align == 'none' ? '':align;\n    }\n\n\n    /* 在线图片 */\n    function RemoteImage(target) {\n        this.container = utils.isString(target) ? document.getElementById(target) : target;\n        this.init();\n    }\n    RemoteImage.prototype = {\n        init: function () {\n            this.initContainer();\n            this.initEvents();\n        },\n        initContainer: function () {\n            this.dom = {\n                'url': $G('url'),\n                'width': $G('width'),\n                'height': $G('height'),\n                'border': $G('border'),\n                'vhSpace': $G('vhSpace'),\n                'title': $G('title'),\n                'align': $G('align')\n            };\n            var img = editor.selection.getRange().getClosedNode();\n            if (img) {\n                this.setImage(img);\n            }\n        },\n        initEvents: function () {\n            var _this = this,\n                locker = $G('lock');\n\n            /* 改变url */\n            domUtils.on($G(\"url\"), 'keyup', updatePreview);\n            domUtils.on($G(\"border\"), 'keyup', updatePreview);\n            domUtils.on($G(\"title\"), 'keyup', updatePreview);\n\n            domUtils.on($G(\"width\"), 'keyup', function(){\n                updatePreview();\n                if(locker.checked) {\n                    var proportion =locker.getAttribute('data-proportion');\n                    $G('height').value = Math.round(this.value / proportion);\n                } else {\n                    _this.updateLocker();\n                }\n            });\n            domUtils.on($G(\"height\"), 'keyup', function(){\n                updatePreview();\n                if(locker.checked) {\n                    var proportion =locker.getAttribute('data-proportion');\n                    $G('width').value = Math.round(this.value * proportion);\n                } else {\n                    _this.updateLocker();\n                }\n            });\n            domUtils.on($G(\"lock\"), 'change', function(){\n                var proportion = parseInt($G(\"width\").value) /parseInt($G(\"height\").value);\n                locker.setAttribute('data-proportion', proportion);\n            });\n\n            function updatePreview(){\n                _this.setPreview();\n            }\n        },\n        updateLocker: function(){\n            var width = $G('width').value,\n                height = $G('height').value,\n                locker = $G('lock');\n            if(width && height && width == parseInt(width) && height == parseInt(height)) {\n                locker.disabled = false;\n                locker.title = '';\n            } else {\n                locker.checked = false;\n                locker.disabled = 'disabled';\n                locker.title = lang.remoteLockError;\n            }\n        },\n        setImage: function(img){\n            /* 不是正常的图片 */\n            if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute(\"src\") || !img.src) return;\n\n            var wordImgFlag = img.getAttribute(\"word_img\"),\n                src = wordImgFlag ? wordImgFlag.replace(\"&amp;\", \"&\") : (img.getAttribute('_src') || img.getAttribute(\"src\", 2).replace(\"&amp;\", \"&\")),\n                align = editor.queryCommandValue(\"imageFloat\");\n\n            /* 防止onchange事件循环调用 */\n            if (src !== $G(\"url\").value) $G(\"url\").value = src;\n            if(src) {\n                /* 设置表单内容 */\n                $G(\"width\").value = img.width || '';\n                $G(\"height\").value = img.height || '';\n                $G(\"border\").value = img.getAttribute(\"border\") || '0';\n                $G(\"vhSpace\").value = img.getAttribute(\"vspace\") || '0';\n                $G(\"title\").value = img.title || img.alt || '';\n                setAlign(align);\n                this.setPreview();\n                this.updateLocker();\n            }\n        },\n        getData: function(){\n            var data = {};\n            for(var k in this.dom){\n                data[k] = this.dom[k].value;\n            }\n            return data;\n        },\n        setPreview: function(){\n            var url = $G('url').value,\n                ow = parseInt($G('width').value, 10) || 0,\n                oh = parseInt($G('height').value, 10) || 0,\n                border = parseInt($G('border').value, 10) || 0,\n                title = $G('title').value,\n                preview = $G('preview'),\n                width,\n                height;\n\n            url = utils.unhtmlForUrl(url);\n            title = utils.unhtml(title);\n\n            width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth));\n            width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2));\n            height = (!ow || !oh) ? '':width*oh/ow;\n\n            if(url) {\n                preview.innerHTML = '<img src=\"' + url + '\" width=\"' + width + '\" height=\"' + height + '\" border=\"' + border + 'px solid #000\" title=\"' + title + '\" />';\n            }\n        },\n        getInsertList: function () {\n            var data = this.getData();\n            if(data['url']) {\n                return [{\n                    src: data['url'],\n                    _src: data['url'],\n                    width: data['width'] || '',\n                    height: data['height'] || '',\n                    border: data['border'] || '',\n                    floatStyle: data['align'] || '',\n                    vspace: data['vhSpace'] || '',\n                    title: data['title'] || '',\n                    alt: data['title'] || '',\n                    style: \"width:\" + data['width'] + \"px;height:\" + data['height'] + \"px;\"\n                }];\n            } else {\n                return [];\n            }\n        }\n    };\n\n\n\n    /* 上传图片 */\n    function UploadImage(target) {\n        this.$wrap = target.constructor == String ? $('#' + target) : $(target);\n        this.init();\n    }\n    UploadImage.prototype = {\n        init: function () {\n            this.imageList = [];\n            this.initContainer();\n            this.initUploader();\n        },\n        initContainer: function () {\n            this.$queue = this.$wrap.find('.filelist');\n        },\n        /* 初始化容器 */\n        initUploader: function () {\n            var _this = this,\n                $ = jQuery,    // just in case. Make sure it's not an other libaray.\n                $wrap = _this.$wrap,\n            // 图片容器\n                $queue = $wrap.find('.filelist'),\n            // 状态栏，包括进度和控制按钮\n                $statusBar = $wrap.find('.statusBar'),\n            // 文件总体选择信息。\n                $info = $statusBar.find('.info'),\n            // 上传按钮\n                $upload = $wrap.find('.uploadBtn'),\n            // 上传按钮\n                $filePickerBtn = $wrap.find('.filePickerBtn'),\n            // 上传按钮\n                $filePickerBlock = $wrap.find('.filePickerBlock'),\n            // 没选择文件之前的内容。\n                $placeHolder = $wrap.find('.placeholder'),\n            // 总体进度条\n                $progress = $statusBar.find('.progress').hide(),\n            // 添加的文件数量\n                fileCount = 0,\n            // 添加的文件总大小\n                fileSize = 0,\n            // 优化retina, 在retina下这个值是2\n                ratio = window.devicePixelRatio || 1,\n            // 缩略图大小\n                thumbnailWidth = 113 * ratio,\n                thumbnailHeight = 113 * ratio,\n            // 可能有pedding, ready, uploading, confirm, done.\n                state = '',\n            // 所有文件的进度信息，key为file id\n                percentages = {},\n                supportTransition = (function () {\n                    var s = document.createElement('p').style,\n                        r = 'transition' in s ||\n                            'WebkitTransition' in s ||\n                            'MozTransition' in s ||\n                            'msTransition' in s ||\n                            'OTransition' in s;\n                    s = null;\n                    return r;\n                })(),\n            // WebUploader实例\n                uploader,\n                actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')),\n                acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\\./g, ',').replace(/^[,]/, ''),\n                imageMaxSize = editor.getOpt('imageMaxSize'),\n                imageCompressBorder = editor.getOpt('imageCompressBorder');\n\n            if (!WebUploader.Uploader.support()) {\n                $('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();\n                return;\n            } else if (!editor.getOpt('imageActionName')) {\n                $('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();\n                return;\n            }\n\n            uploader = _this.uploader = WebUploader.create({\n                pick: {\n                    id: '#filePickerReady',\n                    label: lang.uploadSelectFile\n                },\n                accept: {\n                    title: 'Images',\n                    extensions: acceptExtensions,\n                    mimeTypes: 'image/*'\n                },\n                swf: '../../third-party/webuploader/Uploader.swf',\n                server: actionUrl,\n                fileVal: editor.getOpt('imageFieldName'),\n                duplicate: true,\n                fileSingleSizeLimit: imageMaxSize,    // 默认 2 M\n                compress: editor.getOpt('imageCompressEnable') ? {\n                    width: imageCompressBorder,\n                    height: imageCompressBorder,\n                    // 图片质量，只有type为`image/jpeg`的时候才有效。\n                    quality: 90,\n                    // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n                    allowMagnify: false,\n                    // 是否允许裁剪。\n                    crop: false,\n                    // 是否保留头部meta信息。\n                    preserveHeaders: true\n                }:false\n            });\n            uploader.addButton({\n                id: '#filePickerBlock'\n            });\n            uploader.addButton({\n                id: '#filePickerBtn',\n                label: lang.uploadAddFile\n            });\n\n            setState('pedding');\n\n            // 当有文件添加进来时执行，负责view的创建\n            function addFile(file) {\n                var $li = $('<li id=\"' + file.id + '\">' +\n                        '<p class=\"title\">' + file.name + '</p>' +\n                        '<p class=\"imgWrap\"></p>' +\n                        '<p class=\"progress\"><span></span></p>' +\n                        '</li>'),\n\n                    $btns = $('<div class=\"file-panel\">' +\n                        '<span class=\"cancel\">' + lang.uploadDelete + '</span>' +\n                        '<span class=\"rotateRight\">' + lang.uploadTurnRight + '</span>' +\n                        '<span class=\"rotateLeft\">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),\n                    $prgress = $li.find('p.progress span'),\n                    $wrap = $li.find('p.imgWrap'),\n                    $info = $('<p class=\"error\"></p>').hide().appendTo($li),\n\n                    showError = function (code) {\n                        switch (code) {\n                            case 'exceed_size':\n                                text = lang.errorExceedSize;\n                                break;\n                            case 'interrupt':\n                                text = lang.errorInterrupt;\n                                break;\n                            case 'http':\n                                text = lang.errorHttp;\n                                break;\n                            case 'not_allow_type':\n                                text = lang.errorFileType;\n                                break;\n                            default:\n                                text = lang.errorUploadRetry;\n                                break;\n                        }\n                        $info.text(text).show();\n                    };\n\n                if (file.getStatus() === 'invalid') {\n                    showError(file.statusText);\n                } else {\n                    $wrap.text(lang.uploadPreview);\n                    if (browser.ie && browser.version <= 7) {\n                        $wrap.text(lang.uploadNoPreview);\n                    } else {\n                        uploader.makeThumb(file, function (error, src) {\n                            if (error || !src) {\n                                $wrap.text(lang.uploadNoPreview);\n                            } else {\n                                var $img = $('<img src=\"' + src + '\">');\n                                $wrap.empty().append($img);\n                                $img.on('error', function () {\n                                    $wrap.text(lang.uploadNoPreview);\n                                });\n                            }\n                        }, thumbnailWidth, thumbnailHeight);\n                    }\n                    percentages[ file.id ] = [ file.size, 0 ];\n                    file.rotation = 0;\n\n                    /* 检查文件格式 */\n                    if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {\n                        showError('not_allow_type');\n                        uploader.removeFile(file);\n                    }\n                }\n\n                file.on('statuschange', function (cur, prev) {\n                    if (prev === 'progress') {\n                        $prgress.hide().width(0);\n                    } else if (prev === 'queued') {\n                        $li.off('mouseenter mouseleave');\n                        $btns.remove();\n                    }\n                    // 成功\n                    if (cur === 'error' || cur === 'invalid') {\n                        showError(file.statusText);\n                        percentages[ file.id ][ 1 ] = 1;\n                    } else if (cur === 'interrupt') {\n                        showError('interrupt');\n                    } else if (cur === 'queued') {\n                        percentages[ file.id ][ 1 ] = 0;\n                    } else if (cur === 'progress') {\n                        $info.hide();\n                        $prgress.css('display', 'block');\n                    } else if (cur === 'complete') {\n                    }\n\n                    $li.removeClass('state-' + prev).addClass('state-' + cur);\n                });\n\n                $li.on('mouseenter', function () {\n                    $btns.stop().animate({height: 30});\n                });\n                $li.on('mouseleave', function () {\n                    $btns.stop().animate({height: 0});\n                });\n\n                $btns.on('click', 'span', function () {\n                    var index = $(this).index(),\n                        deg;\n\n                    switch (index) {\n                        case 0:\n                            uploader.removeFile(file);\n                            return;\n                        case 1:\n                            file.rotation += 90;\n                            break;\n                        case 2:\n                            file.rotation -= 90;\n                            break;\n                    }\n\n                    if (supportTransition) {\n                        deg = 'rotate(' + file.rotation + 'deg)';\n                        $wrap.css({\n                            '-webkit-transform': deg,\n                            '-mos-transform': deg,\n                            '-o-transform': deg,\n                            'transform': deg\n                        });\n                    } else {\n                        $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');\n                    }\n\n                });\n\n                $li.insertBefore($filePickerBlock);\n            }\n\n            // 负责view的销毁\n            function removeFile(file) {\n                var $li = $('#' + file.id);\n                delete percentages[ file.id ];\n                updateTotalProgress();\n                $li.off().find('.file-panel').off().end().remove();\n            }\n\n            function updateTotalProgress() {\n                var loaded = 0,\n                    total = 0,\n                    spans = $progress.children(),\n                    percent;\n\n                $.each(percentages, function (k, v) {\n                    total += v[ 0 ];\n                    loaded += v[ 0 ] * v[ 1 ];\n                });\n\n                percent = total ? loaded / total : 0;\n\n                spans.eq(0).text(Math.round(percent * 100) + '%');\n                spans.eq(1).css('width', Math.round(percent * 100) + '%');\n                updateStatus();\n            }\n\n            function setState(val, files) {\n\n                if (val != state) {\n\n                    var stats = uploader.getStats();\n\n                    $upload.removeClass('state-' + state);\n                    $upload.addClass('state-' + val);\n\n                    switch (val) {\n\n                        /* 未选择文件 */\n                        case 'pedding':\n                            $queue.addClass('element-invisible');\n                            $statusBar.addClass('element-invisible');\n                            $placeHolder.removeClass('element-invisible');\n                            $progress.hide(); $info.hide();\n                            uploader.refresh();\n                            break;\n\n                        /* 可以开始上传 */\n                        case 'ready':\n                            $placeHolder.addClass('element-invisible');\n                            $queue.removeClass('element-invisible');\n                            $statusBar.removeClass('element-invisible');\n                            $progress.hide(); $info.show();\n                            $upload.text(lang.uploadStart);\n                            uploader.refresh();\n                            break;\n\n                        /* 上传中 */\n                        case 'uploading':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadPause);\n                            break;\n\n                        /* 暂停上传 */\n                        case 'paused':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadContinue);\n                            break;\n\n                        case 'confirm':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadStart);\n\n                            stats = uploader.getStats();\n                            if (stats.successNum && !stats.uploadFailNum) {\n                                setState('finish');\n                                return;\n                            }\n                            break;\n\n                        case 'finish':\n                            $progress.hide(); $info.show();\n                            if (stats.uploadFailNum) {\n                                $upload.text(lang.uploadRetry);\n                            } else {\n                                $upload.text(lang.uploadStart);\n                            }\n                            break;\n                    }\n\n                    state = val;\n                    updateStatus();\n\n                }\n\n                if (!_this.getQueueCount()) {\n                    $upload.addClass('disabled')\n                } else {\n                    $upload.removeClass('disabled')\n                }\n\n            }\n\n            function updateStatus() {\n                var text = '', stats;\n\n                if (state === 'ready') {\n                    text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));\n                } else if (state === 'confirm') {\n                    stats = uploader.getStats();\n                    if (stats.uploadFailNum) {\n                        text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);\n                    }\n                } else {\n                    stats = uploader.getStats();\n                    text = lang.updateStatusFinish.replace('_', fileCount).\n                        replace('_KB', WebUploader.formatSize(fileSize)).\n                        replace('_', stats.successNum);\n\n                    if (stats.uploadFailNum) {\n                        text += lang.updateStatusError.replace('_', stats.uploadFailNum);\n                    }\n                }\n\n                $info.html(text);\n            }\n\n            uploader.on('fileQueued', function (file) {\n                fileCount++;\n                fileSize += file.size;\n\n                if (fileCount === 1) {\n                    $placeHolder.addClass('element-invisible');\n                    $statusBar.show();\n                }\n\n                addFile(file);\n            });\n\n            uploader.on('fileDequeued', function (file) {\n                fileCount--;\n                fileSize -= file.size;\n\n                removeFile(file);\n                updateTotalProgress();\n            });\n\n            uploader.on('filesQueued', function (file) {\n                if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {\n                    setState('ready');\n                }\n                updateTotalProgress();\n            });\n\n            uploader.on('all', function (type, files) {\n                switch (type) {\n                    case 'uploadFinished':\n                        setState('confirm', files);\n                        break;\n                    case 'startUpload':\n                        /* 添加额外的GET参数 */\n                        var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',\n                            url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);\n                        uploader.option('server', url);\n                        setState('uploading', files);\n                        break;\n                    case 'stopUpload':\n                        setState('paused', files);\n                        break;\n                }\n            });\n\n            uploader.on('uploadBeforeSend', function (file, data, header) {\n                //这里可以通过data对象添加POST参数\n                header['X_Requested_With'] = 'XMLHttpRequest';\n            });\n\n            uploader.on('uploadProgress', function (file, percentage) {\n                var $li = $('#' + file.id),\n                    $percent = $li.find('.progress span');\n\n                $percent.css('width', percentage * 100 + '%');\n                percentages[ file.id ][ 1 ] = percentage;\n                updateTotalProgress();\n            });\n\n            uploader.on('uploadSuccess', function (file, ret) {\n                var $file = $('#' + file.id);\n                try {\n                    var responseText = (ret._raw || ret),\n                        json = utils.str2json(responseText);\n                    if (json.state == 'SUCCESS') {\n                        _this.imageList[$file.index()] = json;\n                        $file.append('<span class=\"success\"></span>');\n                    } else {\n                        $file.find('.error').text(json.state).show();\n                    }\n                } catch (e) {\n                    $file.find('.error').text(lang.errorServerUpload).show();\n                }\n            });\n\n            uploader.on('uploadError', function (file, code) {\n            });\n            uploader.on('error', function (code, file) {\n                if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {\n                    addFile(file);\n                }\n            });\n            uploader.on('uploadComplete', function (file, ret) {\n            });\n\n            $upload.on('click', function () {\n                if ($(this).hasClass('disabled')) {\n                    return false;\n                }\n\n                if (state === 'ready') {\n                    uploader.upload();\n                } else if (state === 'paused') {\n                    uploader.upload();\n                } else if (state === 'uploading') {\n                    uploader.stop();\n                }\n            });\n\n            $upload.addClass('state-' + state);\n            updateTotalProgress();\n        },\n        getQueueCount: function () {\n            var file, i, status, readyFile = 0, files = this.uploader.getFiles();\n            for (i = 0; file = files[i++]; ) {\n                status = file.getStatus();\n                if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;\n            }\n            return readyFile;\n        },\n        destroy: function () {\n            this.$wrap.remove();\n        },\n        getInsertList: function () {\n            var i, data, list = [],\n                align = getAlign(),\n                prefix = editor.getOpt('imageUrlPrefix');\n            for (i = 0; i < this.imageList.length; i++) {\n                data = this.imageList[i];\n                list.push({\n                    src: prefix + data.url,\n                    _src: prefix + data.url,\n                    title: data.title,\n                    alt: data.original,\n                    floatStyle: align\n                });\n            }\n            return list;\n        }\n    };\n\n\n    /* 在线图片 */\n    function OnlineImage(target) {\n        this.container = utils.isString(target) ? document.getElementById(target) : target;\n        this.init();\n    }\n    OnlineImage.prototype = {\n        init: function () {\n            this.reset();\n            this.initEvents();\n        },\n        /* 初始化容器 */\n        initContainer: function () {\n            this.container.innerHTML = '';\n            this.list = document.createElement('ul');\n            this.clearFloat = document.createElement('li');\n\n            domUtils.addClass(this.list, 'list');\n            domUtils.addClass(this.clearFloat, 'clearFloat');\n\n            this.list.appendChild(this.clearFloat);\n            this.container.appendChild(this.list);\n        },\n        /* 初始化滚动事件,滚动到地步自动拉取数据 */\n        initEvents: function () {\n            var _this = this;\n\n            /* 滚动拉取图片 */\n            domUtils.on($G('imageList'), 'scroll', function(e){\n                var panel = this;\n                if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {\n                    _this.getImageData();\n                }\n            });\n            /* 选中图片 */\n            domUtils.on(this.container, 'click', function (e) {\n                var target = e.target || e.srcElement,\n                    li = target.parentNode;\n\n                if (li.tagName.toLowerCase() == 'li') {\n                    if (domUtils.hasClass(li, 'selected')) {\n                        domUtils.removeClasses(li, 'selected');\n                    } else {\n                        domUtils.addClass(li, 'selected');\n                    }\n                }\n            });\n        },\n        /* 初始化第一次的数据 */\n        initData: function () {\n\n            /* 拉取数据需要使用的值 */\n            this.state = 0;\n            this.listSize = editor.getOpt('imageManagerListSize');\n            this.listIndex = 0;\n            this.listEnd = false;\n\n            /* 第一次拉取数据 */\n            this.getImageData();\n        },\n        /* 重置界面 */\n        reset: function() {\n            this.initContainer();\n            this.initData();\n        },\n        /* 向后台拉取图片列表数据 */\n        getImageData: function () {\n            var _this = this;\n\n            if(!_this.listEnd && !this.isLoadingData) {\n                this.isLoadingData = true;\n                var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),\n                    isJsonp = utils.isCrossDomainUrl(url);\n                ajax.request(url, {\n                    'timeout': 100000,\n                    'dataType': isJsonp ? 'jsonp':'',\n                    'data': utils.extend({\n                            start: this.listIndex,\n                            size: this.listSize\n                        }, editor.queryCommandValue('serverparam')),\n                    'method': 'get',\n                    'onsuccess': function (r) {\n                        try {\n                            var json = isJsonp ? r:eval('(' + r.responseText + ')');\n                            if (json.state == 'SUCCESS') {\n                                _this.pushData(json.list);\n                                _this.listIndex = parseInt(json.start) + parseInt(json.list.length);\n                                if(_this.listIndex >= json.total) {\n                                    _this.listEnd = true;\n                                }\n                                _this.isLoadingData = false;\n                            }\n                        } catch (e) {\n                            if(r.responseText.indexOf('ue_separate_ue') != -1) {\n                                var list = r.responseText.split(r.responseText);\n                                _this.pushData(list);\n                                _this.listIndex = parseInt(list.length);\n                                _this.listEnd = true;\n                                _this.isLoadingData = false;\n                            }\n                        }\n                    },\n                    'onerror': function () {\n                        _this.isLoadingData = false;\n                    }\n                });\n            }\n        },\n        /* 添加图片到列表界面上 */\n        pushData: function (list) {\n            var i, item, img, icon, _this = this,\n                urlPrefix = editor.getOpt('imageManagerUrlPrefix');\n            for (i = 0; i < list.length; i++) {\n                if(list[i] && list[i].url) {\n                    item = document.createElement('li');\n                    img = document.createElement('img');\n                    icon = document.createElement('span');\n\n                    domUtils.on(img, 'load', (function(image){\n                        return function(){\n                            _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);\n                        }\n                    })(img));\n                    img.width = 113;\n                    img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );\n                    img.setAttribute('_src', urlPrefix + list[i].url);\n                    domUtils.addClass(icon, 'icon');\n\n                    item.appendChild(img);\n                    item.appendChild(icon);\n                    this.list.insertBefore(item, this.clearFloat);\n                }\n            }\n        },\n        /* 改变图片大小 */\n        scale: function (img, w, h, type) {\n            var ow = img.width,\n                oh = img.height;\n\n            if (type == 'justify') {\n                if (ow >= oh) {\n                    img.width = w;\n                    img.height = h * oh / ow;\n                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';\n                } else {\n                    img.width = w * ow / oh;\n                    img.height = h;\n                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';\n                }\n            } else {\n                if (ow >= oh) {\n                    img.width = w * ow / oh;\n                    img.height = h;\n                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';\n                } else {\n                    img.width = w;\n                    img.height = h * oh / ow;\n                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';\n                }\n            }\n        },\n        getInsertList: function () {\n            var i, lis = this.list.children, list = [], align = getAlign();\n            for (i = 0; i < lis.length; i++) {\n                if (domUtils.hasClass(lis[i], 'selected')) {\n                    var img = lis[i].firstChild,\n                        src = img.getAttribute('_src');\n                    list.push({\n                        src: src,\n                        _src: src,\n                        alt: src.substr(src.lastIndexOf('/') + 1),\n                        floatStyle: align\n                    });\n                }\n\n            }\n            return list;\n        }\n    };\n\n    /*搜索图片 */\n    function SearchImage() {\n        this.init();\n    }\n    SearchImage.prototype = {\n        init: function () {\n            this.initEvents();\n        },\n        initEvents: function(){\n            var _this = this;\n\n            /* 点击搜索按钮 */\n            domUtils.on($G('searchBtn'), 'click', function(){\n                var key = $G('searchTxt').value;\n                if(key && key != lang.searchRemind) {\n                    _this.getImageData();\n                }\n            });\n            /* 点击清除妞 */\n            domUtils.on($G('searchReset'), 'click', function(){\n                $G('searchTxt').value = lang.searchRemind;\n                $G('searchListUl').innerHTML = '';\n                $G('searchType').selectedIndex = 0;\n            });\n            /* 搜索框聚焦 */\n            domUtils.on($G('searchTxt'), 'focus', function(){\n                var key = $G('searchTxt').value;\n                if(key && key == lang.searchRemind) {\n                    $G('searchTxt').value = '';\n                }\n            });\n            /* 搜索框回车键搜索 */\n            domUtils.on($G('searchTxt'), 'keydown', function(e){\n                var keyCode = e.keyCode || e.which;\n                if (keyCode == 13) {\n                    $G('searchBtn').click();\n                }\n            });\n\n            /* 选中图片 */\n            domUtils.on($G('searchList'), 'click', function(e){\n                var target = e.target || e.srcElement,\n                    li = target.parentNode.parentNode;\n\n                if (li.tagName.toLowerCase() == 'li') {\n                    if (domUtils.hasClass(li, 'selected')) {\n                        domUtils.removeClasses(li, 'selected');\n                    } else {\n                        domUtils.addClass(li, 'selected');\n                    }\n                }\n            });\n        },\n        encodeToGb2312:function (str){\n            if(!str) return '';\n            var strOut = \"\",\n                z = 'D2BBB6A18140C6DF814181428143CDF2D5C9C8FDC9CFCFC2D8A2B2BBD3EB8144D8A4B3F38145D7A8C7D2D8A7CAC08146C7F0B1FBD2B5B4D4B6ABCBBFD8A9814781488149B6AA814AC1BDD1CF814BC9A5D8AD814CB8F6D1BEE3DCD6D0814D814EB7E1814FB4AE8150C1D98151D8BC8152CDE8B5A4CEAAD6F78153C0F6BED9D8AF815481558156C4CB8157BEC38158D8B1C3B4D2E58159D6AECEDAD5A7BAF5B7A6C0D6815AC6B9C5D2C7C7815BB9D4815CB3CBD2D2815D815ED8BFBEC5C6F2D2B2CFB0CFE7815F816081618162CAE981638164D8C081658166816781688169816AC2F2C2D2816BC8E9816C816D816E816F817081718172817381748175C7AC8176817781788179817A817B817CC1CB817DD3E8D5F9817ECAC2B6FED8A1D3DABFF78180D4C6BBA5D8C1CEE5BEAE81818182D8A88183D1C7D0A9818481858186D8BDD9EFCDF6BFBA8187BDBBBAA5D2E0B2FABAE0C4B68188CFEDBEA9CDA4C1C18189818A818BC7D7D9F1818CD9F4818D818E818F8190C8CBD8E9819181928193D2DACAB2C8CAD8ECD8EAD8C6BDF6C6CDB3F08194D8EBBDF1BDE98195C8D4B4D381968197C2D88198B2D6D7D0CACBCBFBD5CCB8B6CFC98199819A819BD9DAD8F0C7AA819CD8EE819DB4FAC1EED2D4819E819FD8ED81A0D2C7D8EFC3C781A181A281A3D1F681A4D6D9D8F281A5D8F5BCFEBCDB81A681A781A8C8CE81A9B7DD81AAB7C281ABC6F381AC81AD81AE81AF81B081B181B2D8F8D2C181B381B4CEE9BCBFB7FCB7A5D0DD81B581B681B781B881B9D6DAD3C5BBEFBBE1D8F181BA81BBC9A1CEB0B4AB81BCD8F381BDC9CBD8F6C2D7D8F781BE81BFCEB1D8F981C081C181C2B2AEB9C081C3D9A381C4B0E981C5C1E681C6C9EC81C7CBC581C8CBC6D9A481C981CA81CB81CC81CDB5E881CE81CFB5AB81D081D181D281D381D481D5CEBBB5CDD7A1D7F4D3D381D6CCE581D7BACE81D8D9A2D9DCD3E0D8FDB7F0D7F7D8FED8FAD9A1C4E381D981DAD3B6D8F4D9DD81DBD8FB81DCC5E581DD81DEC0D081DF81E0D1F0B0DB81E181E2BCD1D9A681E3D9A581E481E581E681E7D9ACD9AE81E8D9ABCAB981E981EA81EBD9A9D6B681EC81ED81EEB3DED9A881EFC0FD81F0CACC81F1D9AA81F2D9A781F381F4D9B081F581F6B6B181F781F881F9B9A981FAD2C081FB81FCCFC081FD81FEC2C28240BDC4D5ECB2E0C7C8BFEBD9AD8241D9AF8242CEEABAEE82438244824582468247C7D682488249824A824B824C824D824E824F8250B1E3825182528253B4D9B6EDD9B48254825582568257BFA182588259825AD9DEC7CEC0FED9B8825B825C825D825E825FCBD7B7FD8260D9B58261D9B7B1A3D3E1D9B98262D0C58263D9B682648265D9B18266D9B2C1A9D9B382678268BCF3D0DEB8A98269BEE3826AD9BD826B826C826D826ED9BA826FB0B3827082718272D9C28273827482758276827782788279827A827B827C827D827E8280D9C4B1B68281D9BF82828283B5B98284BEF3828582868287CCC8BAF2D2D08288D9C38289828ABDE8828BB3AB828C828D828ED9C5BEEB828FD9C6D9BBC4DF8290D9BED9C1D9C0829182928293829482958296829782988299829A829BD5AE829CD6B5829DC7E3829E829F82A082A1D9C882A282A382A4BCD9D9CA82A582A682A7D9BC82A8D9CBC6AB82A982AA82AB82AC82ADD9C982AE82AF82B082B1D7F682B2CDA382B382B482B582B682B782B882B982BABDA182BB82BC82BD82BE82BF82C0D9CC82C182C282C382C482C582C682C782C882C9C5BCCDB582CA82CB82CCD9CD82CD82CED9C7B3A5BFFE82CF82D082D182D2B8B582D382D4C0FC82D582D682D782D8B0F882D982DA82DB82DC82DD82DE82DF82E082E182E282E382E482E582E682E782E882E982EA82EB82EC82EDB4F682EED9CE82EFD9CFB4A2D9D082F082F1B4DF82F282F382F482F582F6B0C182F782F882F982FA82FB82FC82FDD9D1C9B582FE8340834183428343834483458346834783488349834A834B834C834D834E834F83508351CFF1835283538354835583568357D9D283588359835AC1C5835B835C835D835E835F836083618362836383648365D9D6C9AE8366836783688369D9D5D9D4D9D7836A836B836C836DCBDB836EBDA9836F8370837183728373C6A7837483758376837783788379837A837B837C837DD9D3D9D8837E83808381D9D9838283838384838583868387C8E583888389838A838B838C838D838E838F839083918392839383948395C0DC8396839783988399839A839B839C839D839E839F83A083A183A283A383A483A583A683A783A883A983AA83AB83AC83AD83AE83AF83B083B183B2B6F9D8A3D4CA83B3D4AAD0D6B3E4D5D783B4CFC8B9E283B5BFCB83B6C3E283B783B883B9B6D283BA83BBCDC3D9EED9F083BC83BD83BEB5B383BFB6B583C083C183C283C383C4BEA483C583C6C8EB83C783C8C8AB83C983CAB0CBB9ABC1F9D9E283CBC0BCB9B283CCB9D8D0CBB1F8C6E4BEDFB5E4D7C883CDD1F8BCE6CADE83CE83CFBCBDD9E6D8E783D083D1C4DA83D283D3B8D4C8BD83D483D5B2E1D4D983D683D783D883D9C3B083DA83DBC3E1DAA2C8DF83DCD0B483DDBEFCC5A983DE83DF83E0B9DA83E1DAA383E2D4A9DAA483E383E483E583E683E7D9FBB6AC83E883E9B7EBB1F9D9FCB3E5BEF683EABFF6D2B1C0E483EB83EC83EDB6B3D9FED9FD83EE83EFBEBB83F083F183F2C6E083F3D7BCDAA183F4C1B983F5B5F2C1E883F683F7BCF583F8B4D583F983FA83FB83FC83FD83FE844084418442C1DD8443C4FD84448445BCB8B7B284468447B7EF84488449844A844B844C844DD9EC844EC6BE844FBFADBBCB84508451B5CA8452DBC9D0D78453CDB9B0BCB3F6BBF7DBCABAAF8454D4E4B5B6B5F3D8D6C8D084558456B7D6C7D0D8D78457BFAF84588459DBBBD8D8845A845BD0CCBBAE845C845D845EEBBEC1D0C1F5D4F2B8D5B4B4845FB3F584608461C9BE846284638464C5D0846584668467C5D9C0FB8468B1F08469D8D9B9CE846AB5BD846B846CD8DA846D846ED6C6CBA2C8AFC9B2B4CCBFCC846FB9F48470D8DBD8DCB6E7BCC1CCEA847184728473847484758476CFF78477D8DDC7B084788479B9D0BDA3847A847BCCDE847CC6CA847D847E848084818482D8E08483D8DE84848485D8DF848684878488B0FE8489BEE7848ACAA3BCF4848B848C848D848EB8B1848F8490B8EE849184928493849484958496849784988499849AD8E2849BBDCB849CD8E4D8E3849D849E849F84A084A1C5FC84A284A384A484A584A684A784A8D8E584A984AAD8E684AB84AC84AD84AE84AF84B084B1C1A684B2C8B0B0ECB9A6BCD3CEF1DBBDC1D384B384B484B584B6B6AFD6FAC5ACBDD9DBBEDBBF84B784B884B9C0F8BEA2C0CD84BA84BB84BC84BD84BE84BF84C084C184C284C3DBC0CAC684C484C584C6B2AA84C784C884C9D3C284CAC3E384CBD1AB84CC84CD84CE84CFDBC284D0C0D584D184D284D3DBC384D4BFB184D584D684D784D884D984DAC4BC84DB84DC84DD84DEC7DA84DF84E084E184E284E384E484E584E684E784E884E9DBC484EA84EB84EC84ED84EE84EF84F084F1D9E8C9D784F284F384F4B9B4CEF0D4C884F584F684F784F8B0FCB4D284F9D0D984FA84FB84FC84FDD9E984FEDECBD9EB8540854185428543D8B0BBAFB1B18544B3D7D8CE85458546D4D185478548BDB3BFEF8549CFBB854A854BD8D0854C854D854EB7CB854F85508551D8D185528553855485558556855785588559855A855BC6A5C7F8D2BD855C855DD8D2C4E4855ECAAE855FC7A78560D8A68561C9FDCEE7BBDCB0EB856285638564BBAAD0AD8565B1B0D7E4D7BF8566B5A5C2F4C4CF85678568B2A98569B2B7856AB1E5DFB2D5BCBFA8C2ACD8D5C2B1856BD8D4CED4856CDAE0856DCEC0856E856FD8B4C3AED3A1CEA38570BCB4C8B4C2D18571BEEDD0B68572DAE18573857485758576C7E485778578B3A78579B6F2CCFCC0FA857A857BC0F7857CD1B9D1E1D8C7857D857E85808581858285838584B2DE85858586C0E58587BAF185888589D8C8858AD4AD858B858CCFE1D8C9858DD8CACFC3858EB3F8BEC7858F859085918592D8CB8593859485958596859785988599DBCC859A859B859C859DC8A5859E859F85A0CFD885A1C8FEB2CE85A285A385A485A585A6D3D6B2E6BCB0D3D1CBABB7B485A785A885A9B7A285AA85ABCAE585ACC8A1CADCB1E4D0F085ADC5D185AE85AF85B0DBC5B5FE85B185B2BFDAB9C5BEE4C1ED85B3DFB6DFB5D6BBBDD0D5D9B0C8B6A3BFC9CCA8DFB3CAB7D3D285B4D8CFD2B6BAC5CBBECCBE85B5DFB7B5F0DFB485B685B785B8D3F585B9B3D4B8F785BADFBA85BBBACFBCAAB5F585BCCDACC3FBBAF3C0F4CDC2CFF2DFB8CFC585BDC2C0DFB9C2F085BE85BF85C0BEFD85C1C1DFCDCCD2F7B7CDDFC185C2DFC485C385C4B7F1B0C9B6D6B7D485C5BAACCCFDBFD4CBB1C6F485C6D6A8DFC585C7CEE2B3B385C885C9CEFCB4B585CACEC7BAF085CBCEE185CCD1BD85CD85CEDFC085CF85D0B4F485D1B3CA85D2B8E6DFBB85D385D485D585D6C4C585D7DFBCDFBDDFBEC5BBDFBFDFC2D4B1DFC385D8C7BACED885D985DA85DB85DC85DDC4D885DEDFCA85DFDFCF85E0D6DC85E185E285E385E485E585E685E785E8DFC9DFDACEB685E9BAC7DFCEDFC8C5DE85EA85EBC9EBBAF4C3FC85EC85EDBED785EEDFC685EFDFCD85F0C5D885F185F285F385F4D5A6BACD85F5BECCD3BDB8C085F6D6E485F7DFC7B9BEBFA785F885F9C1FCDFCBDFCC85FADFD085FB85FC85FD85FE8640DFDBDFE58641DFD7DFD6D7C9DFE3DFE4E5EBD2A7DFD28642BFA98643D4DB8644BFC8DFD4864586468647CFCC86488649DFDD864AD1CA864BDFDEB0A7C6B7DFD3864CBAE5864DB6DFCDDBB9FED4D5864E864FDFDFCFECB0A5DFE7DFD1D1C6DFD5DFD8DFD9DFDC8650BBA98651DFE0DFE18652DFE2DFE6DFE8D3B486538654865586568657B8E7C5B6DFEAC9DAC1A8C4C486588659BFDECFF8865A865B865CD5DCDFEE865D865E865F866086618662B2B88663BADFDFEC8664DBC18665D1E48666866786688669CBF4B4BD866AB0A6866B866C866D866E866FDFF1CCC6DFF286708671DFED867286738674867586768677DFE986788679867A867BDFEB867CDFEFDFF0BBBD867D867EDFF386808681DFF48682BBA38683CADBCEA8E0A7B3AA8684E0A6868586868687E0A186888689868A868BDFFE868CCDD9DFFC868DDFFA868EBFD0D7C4868FC9CC86908691DFF8B0A186928693869486958696DFFD869786988699869ADFFBE0A2869B869C869D869E869FE0A886A086A186A286A3B7C886A486A5C6A1C9B6C0B2DFF586A686A7C5BE86A8D8C4DFF9C4F686A986AA86AB86AC86AD86AEE0A3E0A4E0A5D0A586AF86B0E0B4CCE486B1E0B186B2BFA6E0AFCEB9E0ABC9C686B386B4C0AEE0AEBAEDBAB0E0A986B586B686B7DFF686B8E0B386B986BAE0B886BB86BC86BDB4ADE0B986BE86BFCFB2BAC886C0E0B086C186C286C386C486C586C686C7D0FA86C886C986CA86CB86CC86CD86CE86CF86D0E0AC86D1D4FB86D2DFF786D3C5E786D4E0AD86D5D3F786D6E0B6E0B786D786D886D986DA86DBE0C4D0E186DC86DD86DEE0BC86DF86E0E0C9E0CA86E186E286E3E0BEE0AAC9A4E0C186E4E0B286E586E686E786E886E9CAC8E0C386EAE0B586EBCECB86ECCBC3E0CDE0C6E0C286EDE0CB86EEE0BAE0BFE0C086EF86F0E0C586F186F2E0C7E0C886F3E0CC86F4E0BB86F586F686F786F886F9CBD4E0D586FAE0D6E0D286FB86FC86FD86FE87408741E0D0BCCE87428743E0D18744B8C2D8C587458746874787488749874A874B874CD0EA874D874EC2EF874F8750E0CFE0BD875187528753E0D4E0D387548755E0D78756875787588759E0DCE0D8875A875B875CD6F6B3B0875DD7EC875ECBBB875F8760E0DA8761CEFB876287638764BAD987658766876787688769876A876B876C876D876E876F8770E0E1E0DDD2AD87718772877387748775E0E287768777E0DBE0D9E0DF87788779E0E0877A877B877C877D877EE0DE8780E0E4878187828783C6F7D8ACD4EBE0E6CAC98784878587868787E0E587888789878A878BB8C1878C878D878E878FE0E7E0E887908791879287938794879587968797E0E9E0E387988799879A879B879C879D879EBABFCCE7879F87A087A1E0EA87A287A387A487A587A687A787A887A987AA87AB87AC87AD87AE87AF87B0CFF987B187B287B387B487B587B687B787B887B987BA87BBE0EB87BC87BD87BE87BF87C087C187C2C8C287C387C487C587C6BDC087C787C887C987CA87CB87CC87CD87CE87CF87D087D187D287D3C4D287D487D587D687D787D887D987DA87DB87DCE0EC87DD87DEE0ED87DF87E0C7F4CBC487E1E0EEBBD8D8B6D2F2E0EFCDC587E2B6DA87E387E487E587E687E787E8E0F187E9D4B087EA87EBC0A7B4D187EC87EDCEA7E0F087EE87EF87F0E0F2B9CC87F187F2B9FACDBCE0F387F387F487F5C6D4E0F487F6D4B287F7C8A6E0F6E0F587F887F987FA87FB87FC87FD87FE8840884188428843884488458846884788488849E0F7884A884BCDC1884C884D884ECAA5884F885088518852D4DADBD7DBD98853DBD8B9E7DBDCDBDDB5D888548855DBDA8856885788588859885ADBDBB3A1DBDF885B885CBBF8885DD6B7885EDBE0885F886088618862BEF988638864B7BB8865DBD0CCAEBFB2BBB5D7F8BFD38866886788688869886ABFE9886B886CBCE1CCB3DBDEB0D3CEEBB7D8D7B9C6C2886D886EC0A4886FCCB98870DBE7DBE1C6BADBE38871DBE88872C5F7887388748875DBEA88768877DBE9BFC088788879887ADBE6DBE5887B887C887D887E8880B4B9C0ACC2A2DBE2DBE48881888288838884D0CDDBED88858886888788888889C0DDDBF2888A888B888C888D888E888F8890B6E28891889288938894DBF3DBD2B9B8D4ABDBEC8895BFD1DBF08896DBD18897B5E68898DBEBBFE58899889A889BDBEE889CDBF1889D889E889FDBF988A088A188A288A388A488A588A688A788A8B9A1B0A388A988AA88AB88AC88AD88AE88AFC2F188B088B1B3C7DBEF88B288B3DBF888B4C6D2DBF488B588B6DBF5DBF7DBF688B788B8DBFE88B9D3F2B2BA88BA88BB88BCDBFD88BD88BE88BF88C088C188C288C388C4DCA488C5DBFB88C688C788C888C9DBFA88CA88CB88CCDBFCC5E0BBF988CD88CEDCA388CF88D0DCA588D1CCC388D288D388D4B6D1DDC088D588D688D7DCA188D8DCA288D988DA88DBC7B588DC88DD88DEB6E988DF88E088E1DCA788E288E388E488E5DCA688E6DCA9B1A488E788E8B5CC88E988EA88EB88EC88EDBFB088EE88EF88F088F188F2D1DF88F388F488F588F6B6C288F788F888F988FA88FB88FC88FD88FE894089418942894389448945DCA88946894789488949894A894B894CCBFAEBF3894D894E894FCBDC89508951CBFE895289538954CCC189558956895789588959C8FB895A895B895C895D895E895FDCAA89608961896289638964CCEEDCAB89658966896789688969896A896B896C896D896E896F897089718972897389748975DBD38976DCAFDCAC8977BEB38978CAFB8979897A897BDCAD897C897D897E89808981898289838984C9CAC4B989858986898789888989C7BDDCAE898A898B898CD4F6D0E6898D898E898F89908991899289938994C4ABB6D589958996899789988999899A899B899C899D899E899F89A089A189A289A389A489A589A6DBD489A789A889A989AAB1DA89AB89AC89ADDBD589AE89AF89B089B189B289B389B489B589B689B789B8DBD689B989BA89BBBABE89BC89BD89BE89BF89C089C189C289C389C489C589C689C789C889C9C8C089CA89CB89CC89CD89CE89CFCABFC8C989D0D7B389D1C9F989D289D3BFC789D489D5BAF889D689D7D2BC89D889D989DA89DB89DC89DD89DE89DFE2BA89E0B4A689E189E2B1B889E389E489E589E689E7B8B489E8CFC489E989EA89EB89ECD9E7CFA6CDE289ED89EED9EDB6E089EFD2B989F089F1B9BB89F289F389F489F5E2B9E2B789F6B4F389F7CCECCCABB7F289F8D8B2D1EBBABB89F9CAA789FA89FBCDB789FC89FDD2C4BFE4BCD0B6E189FEDEC58A408A418A428A43DEC6DBBC8A44D1D98A458A46C6E6C4CEB7EE8A47B7DC8A488A49BFFCD7E08A4AC6F58A4B8A4CB1BCDEC8BDB1CCD7DECA8A4DDEC98A4E8A4F8A508A518A52B5EC8A53C9DD8A548A55B0C28A568A578A588A598A5A8A5B8A5C8A5D8A5E8A5F8A608A618A62C5AEC5AB8A63C4CC8A64BCE9CBFD8A658A668A67BAC38A688A698A6AE5F9C8E7E5FACDFD8A6BD7B1B8BEC2E88A6CC8D18A6D8A6EE5FB8A6F8A708A718A72B6CABCCB8A738A74D1FDE6A18A75C3EE8A768A778A788A79E6A48A7A8A7B8A7C8A7DE5FEE6A5CDD78A7E8A80B7C1E5FCE5FDE6A38A818A82C4DDE6A88A838A84E6A78A858A868A878A888A898A8AC3C38A8BC6DE8A8C8A8DE6AA8A8E8A8F8A908A918A928A938A94C4B78A958A968A97E6A2CABC8A988A998A9A8A9BBDE3B9C3E6A6D0D5CEAF8A9C8A9DE6A9E6B08A9ED2A68A9FBDAAE6AD8AA08AA18AA28AA38AA4E6AF8AA5C0D18AA68AA7D2CC8AA88AA98AAABCA78AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB38AB48AB58AB6E6B18AB7D2F68AB88AB98ABAD7CB8ABBCDFE8ABCCDDEC2A6E6ABE6ACBDBFE6AEE6B38ABD8ABEE6B28ABF8AC08AC18AC2E6B68AC3E6B88AC48AC58AC68AC7C4EF8AC88AC98ACAC4C88ACB8ACCBEEAC9EF8ACD8ACEE6B78ACFB6F08AD08AD18AD2C3E48AD38AD48AD58AD68AD78AD88AD9D3E9E6B48ADAE6B58ADBC8A28ADC8ADD8ADE8ADF8AE0E6BD8AE18AE28AE3E6B98AE48AE58AE68AE78AE8C6C58AE98AEACDF1E6BB8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF38AF4E6BC8AF58AF68AF78AF8BBE98AF98AFA8AFB8AFC8AFD8AFE8B40E6BE8B418B428B438B44E6BA8B458B46C0B78B478B488B498B4A8B4B8B4C8B4D8B4E8B4FD3A4E6BFC9F4E6C38B508B51E6C48B528B538B548B55D0F68B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B658B668B67C3BD8B688B698B6A8B6B8B6C8B6D8B6EC3C4E6C28B6F8B708B718B728B738B748B758B768B778B788B798B7A8B7B8B7CE6C18B7D8B7E8B808B818B828B838B84E6C7CFB18B85EBF48B868B87E6CA8B888B898B8A8B8B8B8CE6C58B8D8B8EBCDEC9A98B8F8B908B918B928B938B94BCB58B958B96CFD38B978B988B998B9A8B9BE6C88B9CE6C98B9DE6CE8B9EE6D08B9F8BA08BA1E6D18BA28BA38BA4E6CBB5D58BA5E6CC8BA68BA7E6CF8BA88BA9C4DB8BAAE6C68BAB8BAC8BAD8BAE8BAFE6CD8BB08BB18BB28BB38BB48BB58BB68BB78BB88BB98BBA8BBB8BBC8BBD8BBE8BBF8BC08BC18BC28BC38BC48BC58BC6E6D28BC78BC88BC98BCA8BCB8BCC8BCD8BCE8BCF8BD08BD18BD2E6D4E6D38BD38BD48BD58BD68BD78BD88BD98BDA8BDB8BDC8BDD8BDE8BDF8BE08BE18BE28BE38BE48BE58BE68BE78BE88BE98BEA8BEB8BECE6D58BEDD9F88BEE8BEFE6D68BF08BF18BF28BF38BF48BF58BF68BF7E6D78BF88BF98BFA8BFB8BFC8BFD8BFE8C408C418C428C438C448C458C468C47D7D3E6DD8C48E6DEBFD7D4D08C49D7D6B4E6CBEFE6DAD8C3D7CED0A28C4AC3CF8C4B8C4CE6DFBCBEB9C2E6DBD1A78C4D8C4EBAA2C2CF8C4FD8AB8C508C518C52CAEBE5EE8C53E6DC8C54B7F58C558C568C578C58C8E68C598C5AC4F58C5B8C5CE5B2C4FE8C5DCBFCE5B3D5AC8C5ED3EECAD8B0B28C5FCBCECDEA8C608C61BAEA8C628C638C64E5B58C65E5B48C66D7DAB9D9D6E6B6A8CDF0D2CBB1A6CAB58C67B3E8C9F3BFCDD0FBCAD2E5B6BBC28C688C698C6ACFDCB9AC8C6B8C6C8C6D8C6ED4D78C6F8C70BAA6D1E7CFFCBCD28C71E5B7C8DD8C728C738C74BFEDB1F6CBDE8C758C76BCC58C77BCC4D2FAC3DCBFDC8C788C798C7A8C7BB8BB8C7C8C7D8C7EC3C28C80BAAED4A28C818C828C838C848C858C868C878C888C89C7DEC4AFB2EC8C8AB9D18C8B8C8CE5BBC1C88C8D8C8ED5AF8C8F8C908C918C928C93E5BC8C94E5BE8C958C968C978C988C998C9A8C9BB4E7B6D4CBC2D1B0B5BC8C9C8C9DCAD98C9EB7E28C9F8CA0C9E48CA1BDAB8CA28CA3CEBED7F08CA48CA58CA68CA7D0A18CA8C9D98CA98CAAB6FBE6D8BCE28CABB3BE8CACC9D08CADE6D9B3A28CAE8CAF8CB08CB1DECC8CB2D3C8DECD8CB3D2A28CB48CB58CB68CB7DECE8CB88CB98CBA8CBBBECD8CBC8CBDDECF8CBE8CBF8CC0CAACD2FCB3DFE5EAC4E1BEA1CEB2C4F2BED6C6A8B2E38CC18CC2BED38CC38CC4C7FCCCEBBDECCEDD8CC58CC6CABAC6C1E5ECD0BC8CC78CC88CC9D5B98CCA8CCB8CCCE5ED8CCD8CCE8CCF8CD0CAF48CD1CDC0C2C58CD2E5EF8CD3C2C4E5F08CD48CD58CD68CD78CD88CD98CDAE5F8CDCD8CDBC9BD8CDC8CDD8CDE8CDF8CE08CE18CE2D2D9E1A88CE38CE48CE58CE6D3EC8CE7CBEAC6F18CE88CE98CEA8CEB8CECE1AC8CED8CEE8CEFE1A7E1A98CF08CF1E1AAE1AF8CF28CF3B2ED8CF4E1ABB8DAE1ADE1AEE1B0B5BAE1B18CF58CF68CF78CF88CF9E1B3E1B88CFA8CFB8CFC8CFD8CFED1D28D40E1B6E1B5C1EB8D418D428D43E1B78D44D4C08D45E1B28D46E1BAB0B68D478D488D498D4AE1B48D4BBFF98D4CE1B98D4D8D4EE1BB8D4F8D508D518D528D538D54E1BE8D558D568D578D588D598D5AE1BC8D5B8D5C8D5D8D5E8D5F8D60D6C58D618D628D638D648D658D668D67CFBF8D688D69E1BDE1BFC2CD8D6AB6EB8D6BD3F88D6C8D6DC7CD8D6E8D6FB7E58D708D718D728D738D748D758D768D778D788D79BEFE8D7A8D7B8D7C8D7D8D7E8D80E1C0E1C18D818D82E1C7B3E78D838D848D858D868D878D88C6E98D898D8A8D8B8D8C8D8DB4DE8D8ED1C28D8F8D908D918D92E1C88D938D94E1C68D958D968D978D988D99E1C58D9AE1C3E1C28D9BB1C08D9C8D9D8D9ED5B8E1C48D9F8DA08DA18DA28DA3E1CB8DA48DA58DA68DA78DA88DA98DAA8DABE1CCE1CA8DAC8DAD8DAE8DAF8DB08DB18DB28DB3EFFA8DB48DB5E1D3E1D2C7B68DB68DB78DB88DB98DBA8DBB8DBC8DBD8DBE8DBF8DC0E1C98DC18DC2E1CE8DC3E1D08DC48DC58DC68DC78DC88DC98DCA8DCB8DCC8DCD8DCEE1D48DCFE1D1E1CD8DD08DD1E1CF8DD28DD38DD48DD5E1D58DD68DD78DD88DD98DDA8DDB8DDC8DDD8DDE8DDF8DE08DE18DE2E1D68DE38DE48DE58DE68DE78DE88DE98DEA8DEB8DEC8DED8DEE8DEF8DF08DF18DF28DF38DF48DF58DF68DF78DF8E1D78DF98DFA8DFBE1D88DFC8DFD8DFE8E408E418E428E438E448E458E468E478E488E498E4A8E4B8E4C8E4D8E4E8E4F8E508E518E528E538E548E55E1DA8E568E578E588E598E5A8E5B8E5C8E5D8E5E8E5F8E608E618E62E1DB8E638E648E658E668E678E688E69CEA18E6A8E6B8E6C8E6D8E6E8E6F8E708E718E728E738E748E758E76E7DD8E77B4A8D6DD8E788E79D1B2B3B28E7A8E7BB9A4D7F3C7C9BEDEB9AE8E7CCED78E7D8E7EB2EEDBCF8E80BCBAD2D1CBC8B0CD8E818E82CFEF8E838E848E858E868E87D9E3BDED8E888E89B1D2CAD0B2BC8E8ACBA7B7AB8E8BCAA68E8C8E8D8E8ECFA38E8F8E90E0F8D5CAE0FB8E918E92E0FAC5C1CCFB8E93C1B1E0F9D6E3B2AFD6C4B5DB8E948E958E968E978E988E998E9A8E9BB4F8D6A18E9C8E9D8E9E8E9F8EA0CFAFB0EF8EA18EA2E0FC8EA38EA48EA58EA68EA7E1A1B3A38EA88EA9E0FDE0FEC3B18EAA8EAB8EAC8EADC3DD8EAEE1A2B7F98EAF8EB08EB18EB28EB38EB4BBCF8EB58EB68EB78EB88EB98EBA8EBBE1A3C4BB8EBC8EBD8EBE8EBF8EC0E1A48EC18EC2E1A58EC38EC4E1A6B4B18EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECE8ECF8ED08ED18ED28ED3B8C9C6BDC4EA8ED4B2A28ED5D0D28ED6E7DBBBC3D3D7D3C48ED7B9E3E2CF8ED88ED98EDAD7AF8EDBC7ECB1D38EDC8EDDB4B2E2D18EDE8EDF8EE0D0F2C2AEE2D08EE1BFE2D3A6B5D7E2D2B5EA8EE2C3EDB8FD8EE3B8AE8EE4C5D3B7CFE2D48EE58EE68EE78EE8E2D3B6C8D7F98EE98EEA8EEB8EEC8EEDCDA58EEE8EEF8EF08EF18EF2E2D88EF3E2D6CAFCBFB5D3B9E2D58EF48EF58EF68EF7E2D78EF88EF98EFA8EFB8EFC8EFD8EFE8F408F418F42C1AEC0C88F438F448F458F468F478F48E2DBE2DAC0AA8F498F4AC1CE8F4B8F4C8F4D8F4EE2DC8F4F8F508F518F528F538F548F558F568F578F588F598F5AE2DD8F5BE2DE8F5C8F5D8F5E8F5F8F608F618F628F638F64DBC88F65D1D3CDA28F668F67BDA88F688F698F6ADEC3D8A5BFAADBCDD2ECC6FAC5AA8F6B8F6C8F6DDEC48F6EB1D7DFAE8F6F8F708F71CABD8F72DFB18F73B9AD8F74D2FD8F75B8A5BAEB8F768F77B3DA8F788F798F7AB5DCD5C58F7B8F7C8F7D8F7EC3D6CFD2BBA18F80E5F3E5F28F818F82E5F48F83CDE48F84C8F58F858F868F878F888F898F8A8F8BB5AFC7BF8F8CE5F68F8D8F8E8F8FECB08F908F918F928F938F948F958F968F978F988F998F9A8F9B8F9C8F9D8F9EE5E68F9FB9E9B5B18FA0C2BCE5E8E5E7E5E98FA18FA28FA38FA4D2CD8FA58FA68FA7E1EAD0CE8FA8CDAE8FA9D1E58FAA8FABB2CAB1EB8FACB1F2C5ED8FAD8FAED5C3D3B08FAFE1DC8FB08FB18FB2E1DD8FB3D2DB8FB4B3B9B1CB8FB58FB68FB7CDF9D5F7E1DE8FB8BEB6B4FD8FB9E1DFBADCE1E0BBB2C2C9E1E18FBA8FBB8FBCD0EC8FBDCDBD8FBE8FBFE1E28FC0B5C3C5C7E1E38FC18FC2E1E48FC38FC48FC58FC6D3F98FC78FC88FC98FCA8FCB8FCCE1E58FCDD1AD8FCE8FCFE1E6CEA28FD08FD18FD28FD38FD48FD5E1E78FD6B5C28FD78FD88FD98FDAE1E8BBD58FDB8FDC8FDD8FDE8FDFD0C4E2E0B1D8D2E48FE08FE1E2E18FE28FE3BCC9C8CC8FE4E2E3ECFEECFDDFAF8FE58FE68FE7E2E2D6BECDFCC3A68FE88FE98FEAE3C38FEB8FECD6D2E2E78FED8FEEE2E88FEF8FF0D3C78FF18FF2E2ECBFEC8FF3E2EDE2E58FF48FF5B3C08FF68FF78FF8C4EE8FF98FFAE2EE8FFB8FFCD0C38FFDBAF6E2E9B7DEBBB3CCACCBCBE2E4E2E6E2EAE2EB8FFE90409041E2F790429043E2F4D4F5E2F390449045C5AD9046D5FAC5C2B2C090479048E2EF9049E2F2C1AFCBBC904A904BB5A1E2F9904C904D904EBCB1E2F1D0D4D4B9E2F5B9D6E2F6904F90509051C7D390529053905490559056E2F0905790589059905A905BD7DCEDA1905C905DE2F8905EEDA5E2FECAD1905F906090619062906390649065C1B59066BBD090679068BFD69069BAE3906A906BCBA1906C906D906EEDA6EDA3906F9070EDA29071907290739074BBD6EDA7D0F490759076EDA4BADEB6F7E3A1B6B2CCF1B9A79077CFA2C7A190789079BFD2907A907BB6F1907CE2FAE2FBE2FDE2FCC4D5E3A2907DD3C1907E90809081E3A7C7C49082908390849085CFA490869087E3A9BAB790889089908A908BE3A8908CBBDA908DE3A3908E908F9090E3A4E3AA9091E3A69092CEF2D3C690939094BBBC90959096D4C39097C4FA90989099EDA8D0FCE3A5909AC3F5909BE3ADB1AF909CE3B2909D909E909FBCC290A090A1E3ACB5BF90A290A390A490A590A690A790A890A9C7E9E3B090AA90AB90ACBEAACDEF90AD90AE90AF90B090B1BBF390B290B390B4CCE890B590B6E3AF90B7E3B190B8CFA7E3AE90B9CEA9BBDD90BA90BB90BC90BD90BEB5EBBEE5B2D2B3CD90BFB1B9E3ABB2D1B5ACB9DFB6E890C090C1CFEBE3B790C2BBCC90C390C4C8C7D0CA90C590C690C790C890C9E3B8B3EE90CA90CB90CC90CDEDA990CED3FAD3E490CF90D090D1EDAAE3B9D2E290D290D390D490D590D6E3B590D790D890D990DAD3DE90DB90DC90DD90DEB8D0E3B390DF90E0E3B6B7DF90E1E3B4C0A290E290E390E4E3BA90E590E690E790E890E990EA90EB90EC90ED90EE90EF90F090F190F290F390F490F590F690F7D4B890F890F990FA90FB90FC90FD90FE9140B4C89141E3BB9142BBC59143C9F791449145C9E5914691479148C4BD9149914A914B914C914D914E914FEDAB9150915191529153C2FD9154915591569157BBDBBFAE91589159915A915B915C915D915ECEBF915F916091619162E3BC9163BFB6916491659166916791689169916A916B916C916D916E916F9170917191729173917491759176B1EF91779178D4F79179917A917B917C917DE3BE917E9180918191829183918491859186EDAD918791889189918A918B918C918D918E918FE3BFBAA9EDAC91909191E3BD91929193919491959196919791989199919A919BE3C0919C919D919E919F91A091A1BAB691A291A391A4B6AE91A591A691A791A891A9D0B891AAB0C3EDAE91AB91AC91AD91AE91AFEDAFC0C191B0E3C191B191B291B391B491B591B691B791B891B991BA91BB91BC91BD91BE91BF91C091C1C5B391C291C391C491C591C691C791C891C991CA91CB91CC91CD91CE91CFE3C291D091D191D291D391D491D591D691D791D8DCB291D991DA91DB91DC91DD91DEEDB091DFB8EA91E0CEECEAA7D0E7CAF9C8D6CFB7B3C9CED2BDE491E191E2E3DEBBF2EAA8D5BD91E3C6DDEAA991E491E591E6EAAA91E7EAACEAAB91E8EAAEEAAD91E991EA91EB91ECBDD891EDEAAF91EEC2BE91EF91F091F191F2B4C1B4F791F391F4BBA791F591F691F791F891F9ECE6ECE5B7BFCBF9B1E291FAECE791FB91FC91FDC9C8ECE8ECE991FECAD6DED0B2C5D4FA92409241C6CBB0C7B4F2C8D3924292439244CDD092459246BFB8924792489249924A924B924C924DBFDB924E924FC7A4D6B49250C0A9DED1C9A8D1EFC5A4B0E7B3B6C8C592519252B0E292539254B7F692559256C5FA92579258B6F39259D5D2B3D0BCBC925A925B925CB3AD925D925E925F9260BEF1B0D1926192629263926492659266D2D6CAE3D7A59267CDB6B6B6BFB9D5DB9268B8A7C5D79269926A926BDED2BFD9C2D5C7C0926CBBA4B1A8926D926EC5EA926F9270C5FBCCA79271927292739274B1A7927592769277B5D692789279927AC4A8927BDED3D1BAB3E9927CC3F2927D927EB7F79280D6F4B5A3B2F0C4B4C4E9C0ADDED49281B0E8C5C4C1E09282B9D59283BEDCCDD8B0CE9284CDCFDED6BED0D7BEDED5D5D0B0DD92859286C4E292879288C2A3BCF09289D3B5C0B9C5A1B2A6D4F1928A928BC0A8CAC3DED7D5FC928CB9B0928DC8ADCBA9928EDED9BFBD928F929092919292C6B4D7A7CAB0C4C39293B3D6B9D29294929592969297D6B8EAFCB0B492989299929A929BBFE6929C929DCCF4929E929F92A092A1CDDA92A292A392A4D6BFC2CE92A5CECECCA2D0AEC4D3B5B2DED8D5F5BCB7BBD392A692A7B0A492A8C5B2B4EC92A992AA92ABD5F192AC92ADEAFD92AE92AF92B092B192B292B3DEDACDA692B492B5CDEC92B692B792B892B9CEE6DEDC92BACDB1C0A692BB92BCD7BD92BDDEDBB0C6BAB4C9D3C4F3BEE892BE92BF92C092C1B2B692C292C392C492C592C692C792C892C9C0CCCBF092CABCF1BBBBB5B792CB92CC92CDC5F592CEDEE692CF92D092D1DEE3BEDD92D292D3DEDF92D492D592D692D7B4B7BDDD92D892D9DEE0C4ED92DA92DB92DC92DDCFC692DEB5E092DF92E092E192E2B6DECADAB5F4DEE592E3D5C692E4DEE1CCCDC6FE92E5C5C592E692E792E8D2B492E9BEF292EA92EB92EC92ED92EE92EF92F0C2D392F1CCBDB3B892F2BDD392F3BFD8CDC6D1DAB4EB92F4DEE4DEDDDEE792F5EAFE92F692F7C2B0DEE292F892F9D6C0B5A792FAB2F492FBDEE892FCDEF292FD92FE934093419342DEED9343DEF193449345C8E0934693479348D7E1DEEFC3E8CCE19349B2E5934A934B934CD2BE934D934E934F9350935193529353DEEE9354DEEBCED59355B4A79356935793589359935ABFABBEBE935B935CBDD2935D935E935F9360DEE99361D4AE9362DEDE9363DEEA9364936593669367C0BF9368DEECB2F3B8E9C2A79369936ABDC1936B936C936D936E936FDEF5DEF893709371B2ABB4A493729373B4EAC9A6937493759376937793789379DEF6CBD1937AB8E3937BDEF7DEFA937C937D937E9380DEF9938193829383CCC29384B0E1B4EE93859386938793889389938AE5BA938B938C938D938E938FD0AF93909391B2EB9392EBA19393DEF493949395C9E3DEF3B0DAD2A1B1F79396CCAF939793989399939A939B939C939DDEF0939ECBA4939F93A093A1D5AA93A293A393A493A593A6DEFB93A793A893A993AA93AB93AC93AD93AEB4DD93AFC4A693B093B193B2DEFD93B393B493B593B693B793B893B993BA93BB93BCC3FEC4A1DFA193BD93BE93BF93C093C193C293C3C1CC93C4DEFCBEEF93C5C6B293C693C793C893C993CA93CB93CC93CD93CEB3C5C8F693CF93D0CBBADEFE93D193D2DFA493D393D493D593D6D7B293D793D893D993DA93DBB3B793DC93DD93DE93DFC1C393E093E1C7CBB2A5B4E993E2D7AB93E393E493E593E6C4EC93E7DFA2DFA393E8DFA593E9BAB393EA93EB93ECDFA693EDC0DE93EE93EFC9C393F093F193F293F393F493F593F6B2D9C7E693F7DFA793F8C7DC93F993FA93FB93FCDFA8EBA293FD93FE944094419442CBD3944394449445DFAA9446DFA99447B2C194489449944A944B944C944D944E944F9450945194529453945494559456945794589459945A945B945C945D945E945F9460C5CA94619462946394649465946694679468DFAB9469946A946B946C946D946E946F9470D4DC94719472947394749475C8C19476947794789479947A947B947C947D947E948094819482DFAC94839484948594869487BEF094889489DFADD6A7948A948B948C948DEAB7EBB6CAD5948ED8FCB8C4948FB9A594909491B7C5D5FE94929493949494959496B9CA94979498D0A7F4CD9499949AB5D0949B949CC3F4949DBEC8949E949F94A0EBB7B0BD94A194A2BDCC94A3C1B294A4B1D6B3A894A594A694A7B8D2C9A294A894A9B6D894AA94AB94AC94ADEBB8BEB494AE94AF94B0CAFD94B1C7C394B2D5FB94B394B4B7F394B594B694B794B894B994BA94BB94BC94BD94BE94BF94C094C194C294C3CEC494C494C594C6D5ABB1F394C794C894C9ECB3B0DF94CAECB594CB94CC94CDB6B794CEC1CF94CFF5FAD0B194D094D1D5E594D2CED394D394D4BDEFB3E294D5B8AB94D6D5B694D7EDBD94D8B6CF94D9CBB9D0C294DA94DB94DC94DD94DE94DF94E094E1B7BD94E294E3ECB6CAA994E494E594E6C5D494E7ECB9ECB8C2C3ECB794E894E994EA94EBD0FDECBA94ECECBBD7E594ED94EEECBC94EF94F094F1ECBDC6EC94F294F394F494F594F694F794F894F9CEDE94FABCC894FB94FCC8D5B5A9BEC9D6BCD4E794FD94FED1AED0F1EAB8EAB9EABABAB59540954195429543CAB1BFF595449545CDFA9546954795489549954AEAC0954BB0BAEABE954C954DC0A5954E954F9550EABB9551B2FD9552C3F7BBE8955395549555D2D7CEF4EABF955695579558EABC9559955A955BEAC3955CD0C7D3B3955D955E955F9560B4BA9561C3C1D7F29562956395649565D5D19566CAC79567EAC595689569EAC4EAC7EAC6956A956B956C956D956ED6E7956FCFD495709571EACB9572BBCE9573957495759576957795789579BDFAC9CE957A957BEACC957C957DC9B9CFFEEACAD4CEEACDEACF957E9580CDED9581958295839584EAC99585EACE95869587CEEE9588BBDE9589B3BF958A958B958C958D958EC6D5BEB0CEFA958F95909591C7E79592BEA7EAD095939594D6C7959595969597C1C095989599959AD4DD959BEAD1959C959DCFBE959E959F95A095A1EAD295A295A395A495A5CAEE95A695A795A895A9C5AFB0B595AA95AB95AC95AD95AEEAD495AF95B095B195B295B395B495B595B695B7EAD3F4DF95B895B995BA95BB95BCC4BA95BD95BE95BF95C095C1B1A995C295C395C495C5E5DF95C695C795C895C9EAD595CA95CB95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB95DC95DD95DE95DF95E095E195E295E3CAEF95E4EAD6EAD7C6D895E595E695E795E895E995EA95EB95ECEAD895ED95EEEAD995EF95F095F195F295F395F4D4BB95F5C7FAD2B7B8FC95F695F7EAC295F8B2DC95F995FAC2FC95FBD4F8CCE6D7EE95FC95FD95FE9640964196429643D4C2D3D0EBC3C5F39644B7FE96459646EBD4964796489649CBB7EBDE964AC0CA964B964C964DCDFB964EB3AF964FC6DA965096519652965396549655EBFC9656C4BE9657CEB4C4A9B1BED4FD9658CAF59659D6EC965A965BC6D3B6E4965C965D965E965FBBFA96609661D0E096629663C9B19664D4D3C8A896659666B8CB9667E8BEC9BC96689669E8BB966AC0EED0D3B2C4B4E5966BE8BC966C966DD5C8966E966F967096719672B6C59673E8BDCAF8B8DCCCF5967496759676C0B496779678D1EEE8BFE8C29679967ABABC967BB1ADBDDC967CEABDE8C3967DE8C6967EE8CB9680968196829683E8CC9684CBC9B0E59685BCAB96869687B9B996889689E8C1968ACDF7968BE8CA968C968D968E968FCEF69690969196929693D5ED9694C1D6E8C49695C3B69696B9FBD6A6E8C8969796989699CAE0D4E6969AE8C0969BE8C5E8C7969CC7B9B7E3969DE8C9969EBFDDE8D2969F96A0E8D796A1E8D5BCDCBCCFE8DB96A296A396A496A596A696A796A896A9E8DE96AAE8DAB1FA96AB96AC96AD96AE96AF96B096B196B296B396B4B0D8C4B3B8CCC6E2C8BEC8E196B596B696B7E8CFE8D4E8D696B8B9F1E8D8D7F596B9C4FB96BAE8DC96BB96BCB2E996BD96BE96BFE8D196C096C1BCED96C296C3BFC2E8CDD6F996C4C1F8B2F196C596C696C796C896C996CA96CB96CCE8DF96CDCAC1E8D996CE96CF96D096D1D5A496D2B1EAD5BBE8CEE8D0B6B0E8D396D3E8DDC0B896D4CAF796D5CBA896D696D7C6DCC0F596D896D996DA96DB96DCE8E996DD96DE96DFD0A396E096E196E296E396E496E596E6E8F2D6EA96E796E896E996EA96EB96EC96EDE8E0E8E196EE96EF96F0D1F9BACBB8F996F196F2B8F1D4D4E8EF96F3E8EEE8ECB9F0CCD2E8E6CEA6BFF296F4B0B8E8F1E8F096F5D7C096F6E8E496F7CDA9C9A396F8BBB8BDDBE8EA96F996FA96FB96FC96FD96FE9740974197429743E8E2E8E3E8E5B5B5E8E7C7C5E8EBE8EDBDB0D7AE9744E8F897459746974797489749974A974B974CE8F5974DCDB0E8F6974E974F9750975197529753975497559756C1BA9757E8E89758C3B7B0F09759975A975B975C975D975E975F9760E8F4976197629763E8F7976497659766B9A3976797689769976A976B976C976D976E976F9770C9D2977197729773C3CECEE0C0E69774977597769777CBF39778CCDDD0B59779977ACAE1977BE8F3977C977D977E9780978197829783978497859786BCEC9787E8F997889789978A978B978C978DC3DE978EC6E5978FB9F79790979197929793B0F497949795D7D897969797BCAC9798C5EF9799979A979B979C979DCCC4979E979FE9A697A097A197A297A397A497A597A697A797A897A9C9AD97AAE9A2C0E297AB97AC97ADBFC397AE97AF97B0E8FEB9D797B1E8FB97B297B397B497B5E9A497B697B797B8D2CE97B997BA97BB97BC97BDE9A397BED6B2D7B597BFE9A797C0BDB797C197C297C397C497C597C697C797C897C997CA97CB97CCE8FCE8FD97CD97CE97CFE9A197D097D197D297D397D497D597D697D7CDD697D897D9D2AC97DA97DB97DCE9B297DD97DE97DF97E0E9A997E197E297E3B4AA97E4B4BB97E597E6E9AB97E797E897E997EA97EB97EC97ED97EE97EF97F097F197F297F397F497F597F697F7D0A897F897F9E9A597FA97FBB3FE97FC97FDE9ACC0E397FEE9AA98409841E9B998429843E9B89844984598469847E9AE98489849E8FA984A984BE9A8984C984D984E984F9850BFACE9B1E9BA98519852C2A5985398549855E9AF9856B8C59857E9AD9858D3DCE9B4E9B5E9B79859985A985BE9C7985C985D985E985F98609861C0C6E9C598629863E9B098649865E9BBB0F19866986798689869986A986B986C986D986E986FE9BCD5A598709871E9BE9872E9BF987398749875E9C198769877C1F198789879C8B6987A987B987CE9BD987D987E988098819882E9C29883988498859886988798889889988AE9C3988BE9B3988CE9B6988DBBB1988E988F9890E9C0989198929893989498959896BCF7989798989899E9C4E9C6989A989B989C989D989E989F98A098A198A298A398A498A5E9CA98A698A798A898A9E9CE98AA98AB98AC98AD98AE98AF98B098B198B298B3B2DB98B4E9C898B598B698B798B898B998BA98BB98BC98BD98BEB7AE98BF98C098C198C298C398C498C598C698C798C898C998CAE9CBE9CC98CB98CC98CD98CE98CF98D0D5C198D1C4A398D298D398D498D598D698D7E9D898D8BAE198D998DA98DB98DCE9C998DDD3A398DE98DF98E0E9D498E198E298E398E498E598E698E7E9D7E9D098E898E998EA98EB98ECE9CF98ED98EEC7C198EF98F098F198F298F398F498F598F6E9D298F798F898F998FA98FB98FC98FDE9D9B3C898FEE9D399409941994299439944CFF0994599469947E9CD99489949994A994B994C994D994E994F995099519952B3F79953995499559956995799589959E9D6995A995BE9DA995C995D995ECCB4995F99609961CFAD99629963996499659966996799689969996AE9D5996BE9DCE9DB996C996D996E996F9970E9DE99719972997399749975997699779978E9D19979997A997B997C997D997E99809981E9DD9982E9DFC3CA9983998499859986998799889989998A998B998C998D998E998F9990999199929993999499959996999799989999999A999B999C999D999E999F99A099A199A299A399A499A599A699A799A899A999AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B999BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C999CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D899D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E899E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F5C7B7B4CEBBB6D0C0ECA399F699F7C5B799F899F999FA99FB99FC99FD99FE9A409A419A42D3FB9A439A449A459A46ECA49A47ECA5C6DB9A489A499A4ABFEE9A4B9A4C9A4D9A4EECA69A4F9A50ECA7D0AA9A51C7B89A529A53B8E89A549A559A569A579A589A599A5A9A5B9A5C9A5D9A5E9A5FECA89A609A619A629A639A649A659A669A67D6B9D5FDB4CBB2BDCEE4C6E79A689A69CDE19A6A9A6B9A6C9A6D9A6E9A6F9A709A719A729A739A749A759A769A77B4F59A78CBC0BCDF9A799A7A9A7B9A7CE9E2E9E3D1EAE9E59A7DB4F9E9E49A7ED1B3CAE2B2D09A80E9E89A819A829A839A84E9E6E9E79A859A86D6B39A879A889A89E9E9E9EA9A8A9A8B9A8C9A8D9A8EE9EB9A8F9A909A919A929A939A949A959A96E9EC9A979A989A999A9A9A9B9A9C9A9D9A9EECAFC5B9B6CE9A9FD2F39AA09AA19AA29AA39AA49AA59AA6B5EE9AA7BBD9ECB19AA89AA9D2E39AAA9AAB9AAC9AAD9AAECEE39AAFC4B89AB0C3BF9AB19AB2B6BED8B9B1C8B1CFB1D1C5FE9AB3B1D09AB4C3AB9AB59AB69AB79AB89AB9D5B19ABA9ABB9ABC9ABD9ABE9ABF9AC09AC1EBA4BAC19AC29AC39AC4CCBA9AC59AC69AC7EBA59AC8EBA79AC99ACA9ACBEBA89ACC9ACD9ACEEBA69ACF9AD09AD19AD29AD39AD49AD5EBA9EBABEBAA9AD69AD79AD89AD99ADAEBAC9ADBCACFD8B5C3F19ADCC3A5C6F8EBADC4CA9ADDEBAEEBAFEBB0B7D59ADE9ADF9AE0B7FA9AE1EBB1C7E29AE2EBB39AE3BAA4D1F5B0B1EBB2EBB49AE49AE59AE6B5AAC2C8C7E89AE7EBB59AE8CBAEE3DF9AE99AEAD3C09AEB9AEC9AED9AEED9DB9AEF9AF0CDA1D6ADC7F39AF19AF29AF3D9E0BBE39AF4BABAE3E29AF59AF69AF79AF89AF9CFAB9AFA9AFB9AFCE3E0C9C79AFDBAB99AFE9B409B41D1B4E3E1C8EAB9AFBDADB3D8CEDB9B429B43CCC09B449B459B46E3E8E3E9CDF49B479B489B499B4A9B4BCCAD9B4CBCB39B4DE3EA9B4EE3EB9B4F9B50D0DA9B519B529B53C6FBB7DA9B549B55C7DFD2CACED69B56E3E4E3EC9B57C9F2B3C19B589B59E3E79B5A9B5BC6E3E3E59B5C9B5DEDB3E3E69B5E9B5F9B609B61C9B39B62C5E69B639B649B65B9B59B66C3BB9B67E3E3C5BDC1A4C2D9B2D79B68E3EDBBA6C4AD9B69E3F0BEDA9B6A9B6BE3FBE3F5BAD39B6C9B6D9B6E9B6FB7D0D3CD9B70D6CED5D3B9C1D5B4D1D89B719B729B739B74D0B9C7F69B759B769B77C8AAB2B49B78C3DA9B799B7A9B7BE3EE9B7C9B7DE3FCE3EFB7A8E3F7E3F49B7E9B809B81B7BA9B829B83C5A29B84E3F6C5DDB2A8C6FC9B85C4E09B869B87D7A29B88C0E1E3F99B899B8AE3FAE3FDCCA9E3F39B8BD3BE9B8CB1C3EDB4E3F1E3F29B8DE3F8D0BAC6C3D4F3E3FE9B8E9B8FBDE09B909B91E4A79B929B93E4A69B949B959B96D1F3E4A39B97E4A99B989B999B9AC8F79B9B9B9C9B9D9B9ECFB49B9FE4A8E4AEC2E59BA09BA1B6B49BA29BA39BA49BA59BA69BA7BDF29BA8E4A29BA99BAABAE9E4AA9BAB9BACE4AC9BAD9BAEB6FDD6DEE4B29BAFE4AD9BB09BB19BB2E4A19BB3BBEECDDDC7A2C5C99BB49BB5C1F79BB6E4A49BB7C7B3BDACBDBDE4A59BB8D7C7B2E29BB9E4ABBCC3E4AF9BBABBEBE4B0C5A8E4B19BBB9BBC9BBD9BBED5E3BFA39BBFE4BA9BC0E4B79BC1E4BB9BC29BC3E4BD9BC49BC5C6D69BC69BC7BAC6C0CB9BC89BC99BCAB8A1E4B49BCB9BCC9BCD9BCED4A19BCF9BD0BAA3BDFE9BD19BD29BD3E4BC9BD49BD59BD69BD79BD8CDBF9BD99BDAC4F99BDB9BDCCFFBC9E69BDD9BDED3BF9BDFCFD19BE09BE1E4B39BE2E4B8E4B9CCE99BE39BE49BE59BE69BE7CCCE9BE8C0D4E4B5C1B0E4B6CED09BE9BBC1B5D39BEAC8F3BDA7D5C7C9ACB8A2E4CA9BEB9BECE4CCD1C49BED9BEED2BA9BEF9BF0BAAD9BF19BF2BAD49BF39BF49BF59BF69BF79BF8E4C3B5ED9BF99BFA9BFBD7CDE4C0CFFDE4BF9BFC9BFD9BFEC1DCCCCA9C409C419C429C43CAE79C449C459C469C47C4D79C48CCD4E4C89C499C4A9C4BE4C7E4C19C4CE4C4B5AD9C4D9C4ED3D99C4FE4C69C509C519C529C53D2F9B4E39C54BBB49C559C56C9EE9C57B4BE9C589C599C5ABBEC9C5BD1CD9C5CCCEDEDB59C5D9C5E9C5F9C609C619C629C639C64C7E59C659C669C679C68D4A89C69E4CBD7D5E4C29C6ABDA5E4C59C6B9C6CD3E69C6DE4C9C9F89C6E9C6FE4BE9C709C71D3E59C729C73C7FEB6C99C74D4FCB2B3E4D79C759C769C77CEC29C78E4CD9C79CEBC9C7AB8DB9C7B9C7CE4D69C7DBFCA9C7E9C809C81D3CE9C82C3EC9C839C849C859C869C879C889C899C8AC5C8E4D89C8B9C8C9C8D9C8E9C8F9C909C919C92CDC4E4CF9C939C949C959C96E4D4E4D59C97BAFE9C98CFE69C999C9AD5BF9C9B9C9C9C9DE4D29C9E9C9F9CA09CA19CA29CA39CA49CA59CA69CA79CA8E4D09CA99CAAE4CE9CAB9CAC9CAD9CAE9CAF9CB09CB19CB29CB39CB49CB59CB69CB79CB89CB9CDE5CAAA9CBA9CBB9CBCC0A39CBDBDA6E4D39CBE9CBFB8C89CC09CC19CC29CC39CC4E4E7D4B49CC59CC69CC79CC89CC99CCA9CCBE4DB9CCC9CCD9CCEC1EF9CCF9CD0E4E99CD19CD2D2E79CD39CD4E4DF9CD5E4E09CD69CD7CFAA9CD89CD99CDA9CDBCBDD9CDCE4DAE4D19CDDE4E59CDEC8DCE4E39CDF9CE0C4E7E4E29CE1E4E19CE29CE39CE4B3FCE4E89CE59CE69CE79CE8B5E19CE99CEA9CEBD7CC9CEC9CED9CEEE4E69CEFBBAC9CF0D7D2CCCFEBF89CF1E4E49CF29CF3B9F69CF49CF59CF6D6CDE4D9E4DCC2FAE4DE9CF7C2CBC0C4C2D09CF8B1F5CCB29CF99CFA9CFB9CFC9CFD9CFE9D409D419D429D43B5CE9D449D459D469D47E4EF9D489D499D4A9D4B9D4C9D4D9D4E9D4FC6AF9D509D519D52C6E19D539D54E4F59D559D569D579D589D59C2A99D5A9D5B9D5CC0ECD1DDE4EE9D5D9D5E9D5F9D609D619D629D639D649D659D66C4AE9D679D689D69E4ED9D6A9D6B9D6C9D6DE4F6E4F4C2FE9D6EE4DD9D6FE4F09D70CAFE9D71D5C49D729D73E4F19D749D759D769D779D789D799D7AD1FA9D7B9D7C9D7D9D7E9D809D819D82E4EBE4EC9D839D849D85E4F29D86CEAB9D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D90C5CB9D919D929D93C7B19D94C2BA9D959D969D97E4EA9D989D999D9AC1CA9D9B9D9C9D9D9D9E9D9F9DA0CCB6B3B19DA19DA29DA3E4FB9DA4E4F39DA59DA69DA7E4FA9DA8E4FD9DA9E4FC9DAA9DAB9DAC9DAD9DAE9DAF9DB0B3CE9DB19DB29DB3B3BAE4F79DB49DB5E4F9E4F8C5EC9DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2C0BD9DC39DC49DC59DC6D4E89DC79DC89DC99DCA9DCBE5A29DCC9DCD9DCE9DCF9DD09DD19DD29DD39DD49DD59DD6B0C49DD79DD8E5A49DD99DDAE5A39DDB9DDC9DDD9DDE9DDF9DE0BCA49DE1E5A59DE29DE39DE49DE59DE69DE7E5A19DE89DE99DEA9DEB9DEC9DED9DEEE4FEB1F49DEF9DF09DF19DF29DF39DF49DF59DF69DF79DF89DF9E5A89DFAE5A9E5A69DFB9DFC9DFD9DFE9E409E419E429E439E449E459E469E47E5A7E5AA9E489E499E4A9E4B9E4C9E4D9E4E9E4F9E509E519E529E539E549E559E569E579E589E599E5A9E5B9E5C9E5D9E5E9E5F9E609E619E629E639E649E659E669E679E68C6D99E699E6A9E6B9E6C9E6D9E6E9E6F9E70E5ABE5AD9E719E729E739E749E759E769E77E5AC9E789E799E7A9E7B9E7C9E7D9E7E9E809E819E829E839E849E859E869E879E889E89E5AF9E8A9E8B9E8CE5AE9E8D9E8E9E8F9E909E919E929E939E949E959E969E979E989E999E9A9E9B9E9C9E9D9E9EB9E09E9F9EA0E5B09EA19EA29EA39EA49EA59EA69EA79EA89EA99EAA9EAB9EAC9EAD9EAEE5B19EAF9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EBABBF0ECE1C3F09EBBB5C6BBD29EBC9EBD9EBE9EBFC1E9D4EE9EC0BEC49EC19EC29EC3D7C69EC4D4D6B2D3ECBE9EC59EC69EC79EC8EAC19EC99ECA9ECBC2AFB4B69ECC9ECD9ECED1D79ECF9ED09ED1B3B49ED2C8B2BFBBECC09ED39ED4D6CB9ED59ED6ECBFECC19ED79ED89ED99EDA9EDB9EDC9EDD9EDE9EDF9EE09EE19EE29EE3ECC5BEE6CCBFC5DABEBC9EE4ECC69EE5B1FE9EE69EE79EE8ECC4D5A8B5E39EE9ECC2C1B6B3E39EEA9EEBECC3CBB8C0C3CCFE9EEC9EED9EEE9EEFC1D29EF0ECC89EF19EF29EF39EF49EF59EF69EF79EF89EF99EFA9EFB9EFC9EFDBAE6C0D39EFED6F29F409F419F42D1CC9F439F449F459F46BFBE9F47B7B3C9D5ECC7BBE29F48CCCCBDFDC8C89F49CFA99F4A9F4B9F4C9F4D9F4E9F4F9F50CDE99F51C5EB9F529F539F54B7E99F559F569F579F589F599F5A9F5B9F5C9F5D9F5E9F5FD1C9BAB89F609F619F629F639F64ECC99F659F66ECCA9F67BBC0ECCB9F68ECE2B1BAB7D99F699F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F73BDB99F749F759F769F779F789F799F7A9F7BECCCD1E6ECCD9F7C9F7D9F7E9F80C8BB9F819F829F839F849F859F869F879F889F899F8A9F8B9F8C9F8D9F8EECD19F8F9F909F919F92ECD39F93BBCD9F94BCE59F959F969F979F989F999F9A9F9B9F9C9F9D9F9E9F9F9FA09FA1ECCF9FA2C9B79FA39FA49FA59FA69FA7C3BA9FA8ECE3D5D5ECD09FA99FAA9FAB9FAC9FADD6F39FAE9FAF9FB0ECD2ECCE9FB19FB29FB39FB4ECD49FB5ECD59FB69FB7C9BF9FB89FB99FBA9FBB9FBC9FBDCFA89FBE9FBF9FC09FC19FC2D0DC9FC39FC49FC59FC6D1AC9FC79FC89FC99FCAC8DB9FCB9FCC9FCDECD6CEF59FCE9FCF9FD09FD19FD2CAECECDA9FD39FD49FD59FD69FD79FD89FD9ECD99FDA9FDB9FDCB0BE9FDD9FDE9FDF9FE09FE19FE2ECD79FE3ECD89FE49FE59FE6ECE49FE79FE89FE99FEA9FEB9FEC9FED9FEE9FEFC8BC9FF09FF19FF29FF39FF49FF59FF69FF79FF89FF9C1C79FFA9FFB9FFC9FFD9FFEECDCD1E0A040A041A042A043A044A045A046A047A048A049ECDBA04AA04BA04CA04DD4EFA04EECDDA04FA050A051A052A053A054DBC6A055A056A057A058A059A05AA05BA05CA05DA05EECDEA05FA060A061A062A063A064A065A066A067A068A069A06AB1ACA06BA06CA06DA06EA06FA070A071A072A073A074A075A076A077A078A079A07AA07BA07CA07DA07EA080A081ECDFA082A083A084A085A086A087A088A089A08AA08BECE0A08CD7A6A08DC5C0A08EA08FA090EBBCB0AEA091A092A093BEF4B8B8D2AFB0D6B5F9A094D8B3A095CBACA096E3DDA097A098A099A09AA09BA09CA09DC6ACB0E6A09EA09FA0A0C5C6EBB9A0A1A0A2A0A3A0A4EBBAA0A5A0A6A0A7EBBBA0A8A0A9D1C0A0AAC5A3A0ABEAF2A0ACC4B2A0ADC4B5C0CEA0AEA0AFA0B0EAF3C4C1A0B1CEEFA0B2A0B3A0B4A0B5EAF0EAF4A0B6A0B7C9FCA0B8A0B9C7A3A0BAA0BBA0BCCCD8CEFEA0BDA0BEA0BFEAF5EAF6CFACC0E7A0C0A0C1EAF7A0C2A0C3A0C4A0C5A0C6B6BFEAF8A0C7EAF9A0C8EAFAA0C9A0CAEAFBA0CBA0CCA0CDA0CEA0CFA0D0A0D1A0D2A0D3A0D4A0D5A0D6EAF1A0D7A0D8A0D9A0DAA0DBA0DCA0DDA0DEA0DFA0E0A0E1A0E2C8AEE1EBA0E3B7B8E1ECA0E4A0E5A0E6E1EDA0E7D7B4E1EEE1EFD3CCA0E8A0E9A0EAA0EBA0ECA0EDA0EEE1F1BFF1E1F0B5D2A0EFA0F0A0F1B1B7A0F2A0F3A0F4A0F5E1F3E1F2A0F6BAFCA0F7E1F4A0F8A0F9A0FAA0FBB9B7A0FCBED1A0FDA0FEAA40AA41C4FCAA42BADDBDC6AA43AA44AA45AA46AA47AA48E1F5E1F7AA49AA4AB6C0CFC1CAA8E1F6D5F8D3FCE1F8E1FCE1F9AA4BAA4CE1FAC0EAAA4DE1FEE2A1C0C7AA4EAA4FAA50AA51E1FBAA52E1FDAA53AA54AA55AA56AA57AA58E2A5AA59AA5AAA5BC1D4AA5CAA5DAA5EAA5FE2A3AA60E2A8B2FEE2A2AA61AA62AA63C3CDB2C2E2A7E2A6AA64AA65E2A4E2A9AA66AA67E2ABAA68AA69AA6AD0C9D6EDC3A8E2ACAA6BCFD7AA6CAA6DE2AEAA6EAA6FBAEFAA70AA71E9E0E2ADE2AAAA72AA73AA74AA75BBABD4B3AA76AA77AA78AA79AA7AAA7BAA7CAA7DAA7EAA80AA81AA82AA83E2B0AA84AA85E2AFAA86E9E1AA87AA88AA89AA8AE2B1AA8BAA8CAA8DAA8EAA8FAA90AA91AA92E2B2AA93AA94AA95AA96AA97AA98AA99AA9AAA9BAA9CAA9DE2B3CCA1AA9EE2B4AA9FAAA0AB40AB41AB42AB43AB44AB45AB46AB47AB48AB49AB4AAB4BE2B5AB4CAB4DAB4EAB4FAB50D0FEAB51AB52C2CAAB53D3F1AB54CDF5AB55AB56E7E0AB57AB58E7E1AB59AB5AAB5BAB5CBEC1AB5DAB5EAB5FAB60C2EAAB61AB62AB63E7E4AB64AB65E7E3AB66AB67AB68AB69AB6AAB6BCDE6AB6CC3B5AB6DAB6EE7E2BBB7CFD6AB6FC1E1E7E9AB70AB71AB72E7E8AB73AB74E7F4B2A3AB75AB76AB77AB78E7EAAB79E7E6AB7AAB7BAB7CAB7DAB7EE7ECE7EBC9BAAB80AB81D5E4AB82E7E5B7A9E7E7AB83AB84AB85AB86AB87AB88AB89E7EEAB8AAB8BAB8CAB8DE7F3AB8ED6E9AB8FAB90AB91AB92E7EDAB93E7F2AB94E7F1AB95AB96AB97B0E0AB98AB99AB9AAB9BE7F5AB9CAB9DAB9EAB9FABA0AC40AC41AC42AC43AC44AC45AC46AC47AC48AC49AC4AC7F2AC4BC0C5C0EDAC4CAC4DC1F0E7F0AC4EAC4FAC50AC51E7F6CBF6AC52AC53AC54AC55AC56AC57AC58AC59AC5AE8A2E8A1AC5BAC5CAC5DAC5EAC5FAC60D7C1AC61AC62E7FAE7F9AC63E7FBAC64E7F7AC65E7FEAC66E7FDAC67E7FCAC68AC69C1D5C7D9C5FDC5C3AC6AAC6BAC6CAC6DAC6EC7EDAC6FAC70AC71AC72E8A3AC73AC74AC75AC76AC77AC78AC79AC7AAC7BAC7CAC7DAC7EAC80AC81AC82AC83AC84AC85AC86E8A6AC87E8A5AC88E8A7BAF7E7F8E8A4AC89C8F0C9AAAC8AAC8BAC8CAC8DAC8EAC8FAC90AC91AC92AC93AC94AC95AC96E8A9AC97AC98B9E5AC99AC9AAC9BAC9CAC9DD1FEE8A8AC9EAC9FACA0AD40AD41AD42E8AAAD43E8ADE8AEAD44C1A7AD45AD46AD47E8AFAD48AD49AD4AE8B0AD4BAD4CE8ACAD4DE8B4AD4EAD4FAD50AD51AD52AD53AD54AD55AD56AD57AD58E8ABAD59E8B1AD5AAD5BAD5CAD5DAD5EAD5FAD60AD61E8B5E8B2E8B3AD62AD63AD64AD65AD66AD67AD68AD69AD6AAD6BAD6CAD6DAD6EAD6FAD70AD71E8B7AD72AD73AD74AD75AD76AD77AD78AD79AD7AAD7BAD7CAD7DAD7EAD80AD81AD82AD83AD84AD85AD86AD87AD88AD89E8B6AD8AAD8BAD8CAD8DAD8EAD8FAD90AD91AD92B9CFAD93F0ACAD94F0ADAD95C6B0B0EAC8BFAD96CDDFAD97AD98AD99AD9AAD9BAD9CAD9DCECDEAB1AD9EAD9FADA0AE40EAB2AE41C6BFB4C9AE42AE43AE44AE45AE46AE47AE48EAB3AE49AE4AAE4BAE4CD5E7AE4DAE4EAE4FAE50AE51AE52AE53AE54DDF9AE55EAB4AE56EAB5AE57EAB6AE58AE59AE5AAE5BB8CADFB0C9F5AE5CCCF0AE5DAE5EC9FAAE5FAE60AE61AE62AE63C9FBAE64AE65D3C3CBA6AE66B8A6F0AEB1C2AE67E5B8CCEFD3C9BCD7C9EAAE68B5E7AE69C4D0B5E9AE6AEEAEBBADAE6BAE6CE7DEAE6DEEAFAE6EAE6FAE70AE71B3A9AE72AE73EEB2AE74AE75EEB1BDE7AE76EEB0CEB7AE77AE78AE79AE7AC5CFAE7BAE7CAE7DAE7EC1F4DBCEEEB3D0F3AE80AE81AE82AE83AE84AE85AE86AE87C2D4C6E8AE88AE89AE8AB7ACAE8BAE8CAE8DAE8EAE8FAE90AE91EEB4AE92B3EBAE93AE94AE95BBFBEEB5AE96AE97AE98AE99AE9AE7DCAE9BAE9CAE9DEEB6AE9EAE9FBDAEAEA0AF40AF41AF42F1E2AF43AF44AF45CAE8AF46D2C9F0DAAF47F0DBAF48F0DCC1C6AF49B8EDBECEAF4AAF4BF0DEAF4CC5B1F0DDD1F1AF4DF0E0B0CCBDEAAF4EAF4FAF50AF51AF52D2DFF0DFAF53B4AFB7E8F0E6F0E5C6A3F0E1F0E2B4C3AF54AF55F0E3D5EEAF56AF57CCDBBED2BCB2AF58AF59AF5AF0E8F0E7F0E4B2A1AF5BD6A2D3B8BEB7C8ACAF5CAF5DF0EAAF5EAF5FAF60AF61D1F7AF62D6CCBADBF0E9AF63B6BBAF64AF65CDB4AF66AF67C6A6AF68AF69AF6AC1A1F0EBF0EEAF6BF0EDF0F0F0ECAF6CBBBEF0EFAF6DAF6EAF6FAF70CCB5F0F2AF71AF72B3D5AF73AF74AF75AF76B1D4AF77AF78F0F3AF79AF7AF0F4F0F6B4E1AF7BF0F1AF7CF0F7AF7DAF7EAF80AF81F0FAAF82F0F8AF83AF84AF85F0F5AF86AF87AF88AF89F0FDAF8AF0F9F0FCF0FEAF8BF1A1AF8CAF8DAF8ECEC1F1A4AF8FF1A3AF90C1F6F0FBCADDAF91AF92B4F1B1F1CCB1AF93F1A6AF94AF95F1A7AF96AF97F1ACD5CEF1A9AF98AF99C8B3AF9AAF9BAF9CF1A2AF9DF1ABF1A8F1A5AF9EAF9FF1AAAFA0B040B041B042B043B044B045B046B0A9F1ADB047B048B049B04AB04BB04CF1AFB04DF1B1B04EB04FB050B051B052F1B0B053F1AEB054B055B056B057D1A2B058B059B05AB05BB05CB05DB05EF1B2B05FB060B061F1B3B062B063B064B065B066B067B068B069B9EFB06AB06BB5C7B06CB0D7B0D9B06DB06EB06FD4EDB070B5C4B071BDD4BBCAF0A7B072B073B8DEB074B075F0A8B076B077B0A8B078F0A9B079B07ACDEEB07BB07CF0AAB07DB07EB080B081B082B083B084B085B086B087F0ABB088B089B08AB08BB08CB08DB08EB08FB090C6A4B091B092D6E5F1E4B093F1E5B094B095B096B097B098B099B09AB09BB09CB09DC3F3B09EB09FD3DBB0A0B140D6D1C5E8B141D3AFB142D2E6B143B144EEC1B0BBD5B5D1CEBCE0BAD0B145BFF8B146B8C7B5C1C5CCB147B148CAA2B149B14AB14BC3CBB14CB14DB14EB14FB150EEC2B151B152B153B154B155B156B157B158C4BFB6A2B159EDECC3A4B15AD6B1B15BB15CB15DCFE0EDEFB15EB15FC5CEB160B6DCB161B162CAA1B163B164EDEDB165B166EDF0EDF1C3BCB167BFB4B168EDEEB169B16AB16BB16CB16DB16EB16FB170B171B172B173EDF4EDF2B174B175B176B177D5E6C3DFB178EDF3B179B17AB17BEDF6B17CD5A3D1A3B17DB17EB180EDF5B181C3D0B182B183B184B185B186EDF7BFF4BEECEDF8B187CCF7B188D1DBB189B18AB18BD7C5D5F6B18CEDFCB18DB18EB18FEDFBB190B191B192B193B194B195B196B197EDF9EDFAB198B199B19AB19BB19CB19DB19EB19FEDFDBEA6B1A0B240B241B242B243CBAFEEA1B6BDB244EEA2C4C0B245EDFEB246B247BDDEB2C7B248B249B24AB24BB24CB24DB24EB24FB250B251B252B253B6C3B254B255B256EEA5D8BAEEA3EEA6B257B258B259C3E9B3F2B25AB25BB25CB25DB25EB25FEEA7EEA4CFB9B260B261EEA8C2F7B262B263B264B265B266B267B268B269B26AB26BB26CB26DEEA9EEAAB26EDEABB26FB270C6B3B271C7C6B272D6F5B5C9B273CBB2B274B275B276EEABB277B278CDABB279EEACB27AB27BB27CB27DB27ED5B0B280EEADB281F6C4B282B283B284B285B286B287B288B289B28AB28BB28CB28DB28EDBC7B28FB290B291B292B293B294B295B296B297B4A3B298B299B29AC3ACF1E6B29BB29CB29DB29EB29FCAB8D2D3B2A0D6AAB340EFF2B341BED8B342BDC3EFF3B6CCB0ABB343B344B345B346CAAFB347B348EDB6B349EDB7B34AB34BB34CB34DCEF9B7AFBFF3EDB8C2EBC9B0B34EB34FB350B351B352B353EDB9B354B355C6F6BFB3B356B357B358EDBCC5F8B359D1D0B35AD7A9EDBAEDBBB35BD1E2B35CEDBFEDC0B35DEDC4B35EB35FB360EDC8B361EDC6EDCED5E8B362EDC9B363B364EDC7EDBEB365B366C5E9B367B368B369C6C6B36AB36BC9E9D4D2EDC1EDC2EDC3EDC5B36CC0F9B36DB4A1B36EB36FB370B371B9E8B372EDD0B373B374B375B376EDD1B377EDCAB378EDCFB379CEF8B37AB37BCBB6EDCCEDCDB37CB37DB37EB380B381CFF5B382B383B384B385B386B387B388B389B38AB38BB38CB38DEDD2C1F2D3B2EDCBC8B7B38EB38FB390B391B392B393B394B395BCEFB396B397B398B399C5F0B39AB39BB39CB39DB39EB39FB3A0B440B441B442EDD6B443B5EFB444B445C2B5B0ADCBE9B446B447B1AEB448EDD4B449B44AB44BCDEBB5E2B44CEDD5EDD3EDD7B44DB44EB5FAB44FEDD8B450EDD9B451EDDCB452B1CCB453B454B455B456B457B458B459B45AC5F6BCEEEDDACCBCB2EAB45BB45CB45DB45EEDDBB45FB460B461B462C4EBB463B464B4C5B465B466B467B0F5B468B469B46AEDDFC0DAB4E8B46BB46CB46DB46EC5CDB46FB470B471EDDDBFC4B472B473B474EDDEB475B476B477B478B479B47AB47BB47CB47DB47EB480B481B482B483C4A5B484B485B486EDE0B487B488B489B48AB48BEDE1B48CEDE3B48DB48EC1D7B48FB490BBC7B491B492B493B494B495B496BDB8B497B498B499EDE2B49AB49BB49CB49DB49EB49FB4A0B540B541B542B543B544B545EDE4B546B547B548B549B54AB54BB54CB54DB54EB54FEDE6B550B551B552B553B554EDE5B555B556B557B558B559B55AB55BB55CB55DB55EB55FB560B561B562B563EDE7B564B565B566B567B568CABEECEAC0F1B569C9E7B56AECEBC6EEB56BB56CB56DB56EECECB56FC6EDECEDB570B571B572B573B574B575B576B577B578ECF0B579B57AD7E6ECF3B57BB57CECF1ECEEECEFD7A3C9F1CBEEECF4B57DECF2B57EB580CFE9B581ECF6C6B1B582B583B584B585BCC0B586ECF5B587B588B589B58AB58BB58CB58DB5BBBBF6B58EECF7B58FB590B591B592B593D9F7BDFBB594B595C2BBECF8B596B597B598B599ECF9B59AB59BB59CB59DB8A3B59EB59FB5A0B640B641B642B643B644B645B646ECFAB647B648B649B64AB64BB64CB64DB64EB64FB650B651B652ECFBB653B654B655B656B657B658B659B65AB65BB65CB65DECFCB65EB65FB660B661B662D3EDD8AEC0EBB663C7DDBACCB664D0E3CBBDB665CDBAB666B667B8D1B668B669B1FCB66AC7EFB66BD6D6B66CB66DB66EBFC6C3EBB66FB670EFF5B671B672C3D8B673B674B675B676B677B678D7E2B679B67AB67BEFF7B3D3B67CC7D8D1EDB67DD6C8B67EEFF8B680EFF6B681BBFDB3C6B682B683B684B685B686B687B688BDD5B689B68AD2C6B68BBBE0B68CB68DCFA1B68EEFFCEFFBB68FB690EFF9B691B692B693B694B3CCB695C9D4CBB0B696B697B698B699B69AEFFEB69BB69CB0DEB69DB69ED6C9B69FB6A0B740EFFDB741B3EDB742B743F6D5B744B745B746B747B748B749B74AB74BB74CB74DB74EB74FB750B751B752CEC8B753B754B755F0A2B756F0A1B757B5BEBCDABBFCB758B8E5B759B75AB75BB75CB75DB75EC4C2B75FB760B761B762B763B764B765B766B767B768F0A3B769B76AB76BB76CB76DCBEBB76EB76FB770B771B772B773B774B775B776B777B778B779B77AB77BB77CB77DB77EB780B781B782B783B784B785B786F0A6B787B788B789D1A8B78ABEBFC7EEF1B6F1B7BFD5B78BB78CB78DB78EB4A9F1B8CDBBB78FC7D4D5ADB790F1B9B791F1BAB792B793B794B795C7CFB796B797B798D2A4D6CFB799B79AF1BBBDD1B4B0BEBDB79BB79CB79DB4DCCED1B79EBFDFF1BDB79FB7A0B840B841BFFAF1BCB842F1BFB843B844B845F1BEF1C0B846B847B848B849B84AF1C1B84BB84CB84DB84EB84FB850B851B852B853B854B855C1FEB856B857B858B859B85AB85BB85CB85DB85EB85FB860C1A2B861B862B863B864B865B866B867B868B869B86ACAFAB86BB86CD5BEB86DB86EB86FB870BEBABEB9D5C2B871B872BFA2B873CDAFF1B5B874B875B876B877B878B879BDDFB87AB6CBB87BB87CB87DB87EB880B881B882B883B884D6F1F3C3B885B886F3C4B887B8CDB888B889B88AF3C6F3C7B88BB0CAB88CF3C5B88DF3C9CBF1B88EB88FB890F3CBB891D0A6B892B893B1CAF3C8B894B895B896F3CFB897B5D1B898B899F3D7B89AF3D2B89BB89CB89DF3D4F3D3B7FBB89EB1BFB89FF3CEF3CAB5DAB8A0F3D0B940B941F3D1B942F3D5B943B944B945B946F3CDB947BCE3B948C1FDB949F3D6B94AB94BB94CB94DB94EB94FF3DAB950F3CCB951B5C8B952BDEEF3DCB953B954B7A4BFF0D6FECDB2B955B4F0B956B2DFB957F3D8B958F3D9C9B8B959F3DDB95AB95BF3DEB95CF3E1B95DB95EB95FB960B961B962B963B964B965B966B967F3DFB968B969F3E3F3E2B96AB96BF3DBB96CBFEAB96DB3EFB96EF3E0B96FB970C7A9B971BCF2B972B973B974B975F3EBB976B977B978B979B97AB97BB97CB9BFB97DB97EF3E4B980B981B982B2ADBBFEB983CBE3B984B985B986B987F3EDF3E9B988B989B98AB9DCF3EEB98BB98CB98DF3E5F3E6F3EAC2E1F3ECF3EFF3E8BCFDB98EB98FB990CFE4B991B992F3F0B993B994B995F3E7B996B997B998B999B99AB99BB99CB99DF3F2B99EB99FB9A0BA40D7ADC6AABA41BA42BA43BA44F3F3BA45BA46BA47BA48F3F1BA49C2A8BA4ABA4BBA4CBA4DBA4EB8DDF3F5BA4FBA50F3F4BA51BA52BA53B4DBBA54BA55BA56F3F6F3F7BA57BA58BA59F3F8BA5ABA5BBA5CC0BABA5DBA5EC0E9BA5FBA60BA61BA62BA63C5F1BA64BA65BA66BA67F3FBBA68F3FABA69BA6ABA6BBA6CBA6DBA6EBA6FBA70B4D8BA71BA72BA73F3FEF3F9BA74BA75F3FCBA76BA77BA78BA79BA7ABA7BF3FDBA7CBA7DBA7EBA80BA81BA82BA83BA84F4A1BA85BA86BA87BA88BA89BA8AF4A3BBC9BA8BBA8CF4A2BA8DBA8EBA8FBA90BA91BA92BA93BA94BA95BA96BA97BA98BA99F4A4BA9ABA9BBA9CBA9DBA9EBA9FB2BEF4A6F4A5BAA0BB40BB41BB42BB43BB44BB45BB46BB47BB48BB49BCAEBB4ABB4BBB4CBB4DBB4EBB4FBB50BB51BB52BB53BB54BB55BB56BB57BB58BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB61BB62BB63BB64BB65BB66BB67BB68BB69BB6ABB6BBB6CBB6DBB6EC3D7D9E1BB6FBB70BB71BB72BB73BB74C0E0F4CCD7D1BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB80B7DBBB81BB82BB83BB84BB85BB86BB87F4CEC1A3BB88BB89C6C9BB8AB4D6D5B3BB8BBB8CBB8DF4D0F4CFF4D1CBDABB8EBB8FF4D2BB90D4C1D6E0BB91BB92BB93BB94B7E0BB95BB96BB97C1B8BB98BB99C1BBF4D3BEACBB9ABB9BBB9CBB9DBB9EB4E2BB9FBBA0F4D4F4D5BEABBC40BC41F4D6BC42BC43BC44F4DBBC45F4D7F4DABC46BAFDBC47F4D8F4D9BC48BC49BC4ABC4BBC4CBC4DBC4EB8E2CCC7F4DCBC4FB2DABC50BC51C3D3BC52BC53D4E3BFB7BC54BC55BC56BC57BC58BC59BC5AF4DDBC5BBC5CBC5DBC5EBC5FBC60C5B4BC61BC62BC63BC64BC65BC66BC67BC68F4E9BC69BC6ACFB5BC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78CEC9BC79BC7ABC7BBC7CBC7DBC7EBC80BC81BC82BC83BC84BC85BC86BC87BC88BC89BC8ABC8BBC8CBC8DBC8ECBD8BC8FCBF7BC90BC91BC92BC93BDF4BC94BC95BC96D7CFBC97BC98BC99C0DBBC9ABC9BBC9CBC9DBC9EBC9FBCA0BD40BD41BD42BD43BD44BD45BD46BD47BD48BD49BD4ABD4BBD4CBD4DBD4EBD4FBD50BD51BD52BD53BD54BD55BD56BD57BD58BD59BD5ABD5BBD5CBD5DBD5EBD5FBD60BD61BD62BD63BD64BD65BD66BD67BD68BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71BD72BD73BD74BD75BD76D0F5BD77BD78BD79BD7ABD7BBD7CBD7DBD7EF4EABD80BD81BD82BD83BD84BD85BD86BD87BD88BD89BD8ABD8BBD8CBD8DBD8EBD8FBD90BD91BD92BD93BD94BD95BD96BD97BD98BD99BD9ABD9BBD9CBD9DBD9EBD9FBDA0BE40BE41BE42BE43BE44BE45BE46BE47BE48BE49BE4ABE4BBE4CF4EBBE4DBE4EBE4FBE50BE51BE52BE53F4ECBE54BE55BE56BE57BE58BE59BE5ABE5BBE5CBE5DBE5EBE5FBE60BE61BE62BE63BE64BE65BE66BE67BE68BE69BE6ABE6BBE6CBE6DBE6EBE6FBE70BE71BE72BE73BE74BE75BE76BE77BE78BE79BE7ABE7BBE7CBE7DBE7EBE80BE81BE82BE83BE84BE85BE86BE87BE88BE89BE8ABE8BBE8CBE8DBE8EBE8FBE90BE91BE92BE93BE94BE95BE96BE97BE98BE99BE9ABE9BBE9CBE9DBE9EBE9FBEA0BF40BF41BF42BF43BF44BF45BF46BF47BF48BF49BF4ABF4BBF4CBF4DBF4EBF4FBF50BF51BF52BF53BF54BF55BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF80F7E3BF81BF82BF83BF84BF85B7B1BF86BF87BF88BF89BF8AF4EDBF8BBF8CBF8DBF8EBF8FBF90BF91BF92BF93BF94BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9DBF9EBF9FBFA0C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04EC04FC050C051C052C053C054C055C056C057C058C059C05AC05BC05CC05DC05EC05FC060C061C062C063D7EBC064C065C066C067C068C069C06AC06BC06CC06DC06EC06FC070C071C072C073C074C075C076C077C078C079C07AC07BF4EEC07CC07DC07EE6F9BEC0E6FABAECE6FBCFCBE6FCD4BCBCB6E6FDE6FEBCCDC8D2CEB3E7A1C080B4BFE7A2C9B4B8D9C4C9C081D7DDC2DAB7D7D6BDCEC6B7C4C082C083C5A6E7A3CFDFE7A4E7A5E7A6C1B7D7E9C9F0CFB8D6AFD6D5E7A7B0EDE7A8E7A9C9DCD2EFBEADE7AAB0F3C8DEBDE1E7ABC8C6C084E7ACBBE6B8F8D1A4E7ADC2E7BEF8BDCACDB3E7AEE7AFBEEED0E5C085CBE7CCD0BCCCE7B0BCA8D0F7E7B1C086D0F8E7B2E7B3B4C2E7B4E7B5C9FECEACC3E0E7B7B1C1B3F1C087E7B8E7B9D7DBD5C0E7BAC2CCD7BAE7BBE7BCE7BDBCEAC3E5C0C2E7BEE7BFBCA9C088E7C0E7C1E7B6B6D0E7C2C089E7C3E7C4BBBAB5DEC2C6B1E0E7C5D4B5E7C6B8BFE7C8E7C7B7ECC08AE7C9B2F8E7CAE7CBE7CCE7CDE7CEE7CFE7D0D3A7CBF5E7D1E7D2E7D3E7D4C9C9E7D5E7D6E7D7E7D8E7D9BDC9E7DAF3BEC08BB8D7C08CC8B1C08DC08EC08FC090C091C092C093F3BFC094F3C0F3C1C095C096C097C098C099C09AC09BC09CC09DC09EB9DECDF8C09FC0A0D8E8BAB1C140C2DEEEB7C141B7A3C142C143C144C145EEB9C146EEB8B0D5C147C148C149C14AC14BEEBBD5D6D7EFC14CC14DC14ED6C3C14FC150EEBDCAF0C151EEBCC152C153C154C155EEBEC156C157C158C159EEC0C15AC15BEEBFC15CC15DC15EC15FC160C161C162C163D1F2C164C7BCC165C3C0C166C167C168C169C16AB8E1C16BC16CC16DC16EC16FC1E7C170C171F4C6D0DFF4C7C172CFDBC173C174C8BAC175C176F4C8C177C178C179C17AC17BC17CC17DF4C9F4CAC17EF4CBC180C181C182C183C184D9FAB8FEC185C186E5F1D3F0C187F4E0C188CECCC189C18AC18BB3E1C18CC18DC18EC18FF1B4C190D2EEC191F4E1C192C193C194C195C196CFE8F4E2C197C198C7CCC199C19AC19BC19CC19DC19EB5D4B4E4F4E4C19FC1A0C240F4E3F4E5C241C242F4E6C243C244C245C246F4E7C247BAB2B0BFC248F4E8C249C24AC24BC24CC24DC24EC24FB7ADD2EDC250C251C252D2ABC0CFC253BFBCEBA3D5DFEAC8C254C255C256C257F1F3B6F8CBA3C258C259C4CDC25AF1E7C25BF1E8B8FBF1E9BAC4D4C5B0D2C25CC25DF1EAC25EC25FC260F1EBC261F1ECC262C263F1EDF1EEF1EFF1F1F1F0C5D5C264C265C266C267C268C269F1F2C26AB6FAC26BF1F4D2AEDEC7CBCAC26CC26DB3DCC26EB5A2C26FB9A2C270C271C4F4F1F5C272C273F1F6C274C275C276C1C4C1FBD6B0F1F7C277C278C279C27AF1F8C27BC1AAC27CC27DC27EC6B8C280BEDBC281C282C283C284C285C286C287C288C289C28AC28BC28CC28DC28EF1F9B4CFC28FC290C291C292C293C294F1FAC295C296C297C298C299C29AC29BC29CC29DC29EC29FC2A0C340EDB2EDB1C341C342CBE0D2DEC343CBC1D5D8C344C8E2C345C0DFBCA1C346C347C348C349C34AC34BEBC1C34CC34DD0A4C34ED6E2C34FB6C7B8D8EBC0B8CEC350EBBFB3A6B9C9D6ABC351B7F4B7CAC352C353C354BCE7B7BEEBC6C355EBC7B0B9BFCFC356EBC5D3FDC357EBC8C358C359EBC9C35AC35BB7CEC35CEBC2EBC4C9F6D6D7D5CDD0B2EBCFCEB8EBD0C35DB5A8C35EC35FC360C361C362B1B3EBD2CCA5C363C364C365C366C367C368C369C5D6EBD3C36AEBD1C5DFEBCECAA4EBD5B0FBC36BC36CBAFAC36DC36ED8B7F1E3C36FEBCAEBCBEBCCEBCDEBD6E6C0EBD9C370BFE8D2C8EBD7EBDCB8ECEBD8C371BDBAC372D0D8C373B0B7C374EBDDC4DCC375C376C377C378D6ACC379C37AC37BB4E0C37CC37DC2F6BCB9C37EC380EBDAEBDBD4E0C6EAC4D4EBDFC5A7D9F5C381B2B1C382EBE4C383BDC5C384C385C386EBE2C387C388C389C38AC38BC38CC38DC38EC38FC390C391C392C393EBE3C394C395B8ACC396CDD1EBE5C397C398C399EBE1C39AC1B3C39BC39CC39DC39EC39FC6A2C3A0C440C441C442C443C444C445CCF3C446EBE6C447C0B0D2B8EBE7C448C449C44AB8AFB8ADC44BEBE8C7BBCDF3C44CC44DC44EEBEAEBEBC44FC450C451C452C453EBEDC454C455C456C457D0C8C458EBF2C459EBEEC45AC45BC45CEBF1C8F9C45DD1FCEBECC45EC45FEBE9C460C461C462C463B8B9CFD9C4E5EBEFEBF0CCDACDC8B0F2C464EBF6C465C466C467C468C469EBF5C46AB2B2C46BC46CC46DC46EB8E0C46FEBF7C470C471C472C473C474C475B1ECC476C477CCC5C4A4CFA5C478C479C47AC47BC47CEBF9C47DC47EECA2C480C5F2C481EBFAC482C483C484C485C486C487C488C489C9C5C48AC48BC48CC48DC48EC48FE2DFEBFEC490C491C492C493CDCEECA1B1DBD3B7C494C495D2DCC496C497C498EBFDC499EBFBC49AC49BC49CC49DC49EC49FC4A0C540C541C542C543C544C545C546C547C548C549C54AC54BC54CC54DC54EB3BCC54FC550C551EAB0C552C553D7D4C554F4ABB3F4C555C556C557C558C559D6C1D6C2C55AC55BC55CC55DC55EC55FD5E9BECAC560F4A7C561D2A8F4A8F4A9C562F4AABECBD3DFC563C564C565C566C567C9E0C9E1C568C569F3C2C56ACAE6C56BCCF2C56CC56DC56EC56FC570C571E2B6CBB4C572CEE8D6DBC573F4ADF4AEF4AFC574C575C576C577F4B2C578BABDF4B3B0E3F4B0C579F4B1BDA2B2D5C57AF4B6F4B7B6E6B2B0CFCFF4B4B4ACC57BF4B5C57CC57DF4B8C57EC580C581C582C583F4B9C584C585CDA7C586F4BAC587F4BBC588C589C58AF4BCC58BC58CC58DC58EC58FC590C591C592CBD2C593F4BDC594C595C596C597F4BEC598C599C59AC59BC59CC59DC59EC59FF4BFC5A0C640C641C642C643F4DEC1BCBCE8C644C9ABD1DEE5F5C645C646C647C648DCB3D2D5C649C64ADCB4B0ACDCB5C64BC64CBDDAC64DDCB9C64EC64FC650D8C2C651DCB7D3F3C652C9D6DCBADCB6C653DCBBC3A2C654C655C656C657DCBCDCC5DCBDC658C659CEDFD6A5C65ADCCFC65BDCCDC65CC65DDCD2BDE6C2ABC65EDCB8DCCBDCCEDCBEB7D2B0C5DCC7D0BEDCC1BBA8C65FB7BCDCCCC660C661DCC6DCBFC7DBC662C663C664D1BFDCC0C665C666DCCAC667C668DCD0C669C66ACEADDCC2C66BDCC3DCC8DCC9B2D4DCD1CBD5C66CD4B7DCDBDCDFCCA6DCE6C66DC3E7DCDCC66EC66FBFC1DCD9C670B0FAB9B6DCE5DCD3C671DCC4DCD6C8F4BFE0C672C673C674C675C9BBC676C677C678B1BDC679D3A2C67AC67BDCDAC67CC67DDCD5C67EC6BBC680DCDEC681C682C683C684C685D7C2C3AFB7B6C7D1C3A9DCE2DCD8DCEBDCD4C686C687DCDDC688BEA5DCD7C689DCE0C68AC68BDCE3DCE4C68CDCF8C68DC68EDCE1DDA2DCE7C68FC690C691C692C693C694C695C696C697C698BCEBB4C4C699C69AC3A3B2E7DCFAC69BDCF2C69CDCEFC69DDCFCDCEED2F0B2E8C69EC8D7C8E3DCFBC69FDCEDC6A0C740C741DCF7C742C743DCF5C744C745BEA3DCF4C746B2DDC747C748C749C74AC74BDCF3BCF6DCE8BBC4C74CC0F3C74DC74EC74FC750C751BCD4DCE9DCEAC752DCF1DCF6DCF9B5B4C753C8D9BBE7DCFEDCFDD3ABDDA1DDA3DDA5D2F1DDA4DDA6DDA7D2A9C754C755C756C757C758C759C75ABAC9DDA9C75BC75CDDB6DDB1DDB4C75DC75EC75FC760C761C762C763DDB0C6CEC764C765C0F2C766C767C768C769C9AFC76AC76BC76CDCECDDAEC76DC76EC76FC770DDB7C771C772DCF0DDAFC773DDB8C774DDACC775C776C777C778C779C77AC77BDDB9DDB3DDADC4AAC77CC77DC77EC780DDA8C0B3C1ABDDAADDABC781DDB2BBF1DDB5D3A8DDBAC782DDBBC3A7C783C784DDD2DDBCC785C786C787DDD1C788B9BDC789C78ABED5C78BBEFAC78CC78DBACAC78EC78FC790C791DDCAC792DDC5C793DDBFC794C795C796B2CBDDC3C797DDCBB2A4DDD5C798C799C79ADDBEC79BC79CC79DC6D0DDD0C79EC79FC7A0C840C841DDD4C1E2B7C6C842C843C844C845C846DDCEDDCFC847C848C849DDC4C84AC84BC84CDDBDC84DDDCDCCD1C84EDDC9C84FC850C851C852DDC2C3C8C6BCCEAEDDCCC853DDC8C854C855C856C857C858C859DDC1C85AC85BC85CDDC6C2DCC85DC85EC85FC860C861C862D3A9D3AADDD3CFF4C8F8C863C864C865C866C867C868C869C86ADDE6C86BC86CC86DC86EC86FC870DDC7C871C872C873DDE0C2E4C874C875C876C877C878C879C87AC87BDDE1C87CC87DC87EC880C881C882C883C884C885C886DDD7C887C888C889C88AC88BD6F8C88CDDD9DDD8B8F0DDD6C88DC88EC88FC890C6CFC891B6ADC892C893C894C895C896DDE2C897BAF9D4E1DDE7C898C899C89AB4D0C89BDDDAC89CBFFBDDE3C89DDDDFC89EDDDDC89FC8A0C940C941C942C943C944B5D9C945C946C947C948DDDBDDDCDDDEC949BDAFDDE4C94ADDE5C94BC94CC94DC94EC94FC950C951C952DDF5C953C3C9C954C955CBE2C956C957C958C959DDF2C95AC95BC95CC95DC95EC95FC960C961C962C963C964C965C966D8E1C967C968C6D1C969DDF4C96AC96BC96CD5F4DDF3DDF0C96DC96EDDECC96FDDEFC970DDE8C971C972D0EEC973C974C975C976C8D8DDEEC977C978DDE9C979C97ADDEACBF2C97BDDEDC97CC97DB1CDC97EC980C981C982C983C984C0B6C985BCBBDDF1C986C987DDF7C988DDF6DDEBC989C98AC98BC98CC98DC5EEC98EC98FC990DDFBC991C992C993C994C995C996C997C998C999C99AC99BDEA4C99CC99DDEA3C99EC99FC9A0CA40CA41CA42CA43CA44CA45CA46CA47CA48DDF8CA49CA4ACA4BCA4CC3EFCA4DC2FBCA4ECA4FCA50D5E1CA51CA52CEB5CA53CA54CA55CA56DDFDCA57B2CCCA58CA59CA5ACA5BCA5CCA5DCA5ECA5FCA60C4E8CADFCA61CA62CA63CA64CA65CA66CA67CA68CA69CA6AC7BEDDFADDFCDDFEDEA2B0AAB1CECA6BCA6CCA6DCA6ECA6FDEACCA70CA71CA72CA73DEA6BDB6C8EFCA74CA75CA76CA77CA78CA79CA7ACA7BCA7CCA7DCA7EDEA1CA80CA81DEA5CA82CA83CA84CA85DEA9CA86CA87CA88CA89CA8ADEA8CA8BCA8CCA8DDEA7CA8ECA8FCA90CA91CA92CA93CA94CA95CA96DEADCA97D4CCCA98CA99CA9ACA9BDEB3DEAADEAECA9CCA9DC0D9CA9ECA9FCAA0CB40CB41B1A1DEB6CB42DEB1CB43CB44CB45CB46CB47CB48CB49DEB2CB4ACB4BCB4CCB4DCB4ECB4FCB50CB51CB52CB53CB54D1A6DEB5CB55CB56CB57CB58CB59CB5ACB5BDEAFCB5CCB5DCB5EDEB0CB5FD0BDCB60CB61CB62DEB4CAEDDEB9CB63CB64CB65CB66CB67CB68DEB8CB69DEB7CB6ACB6BCB6CCB6DCB6ECB6FCB70DEBBCB71CB72CB73CB74CB75CB76CB77BDE5CB78CB79CB7ACB7BCB7CB2D8C3EACB7DCB7EDEBACB80C5BACB81CB82CB83CB84CB85CB86DEBCCB87CB88CB89CB8ACB8BCB8CCB8DCCD9CB8ECB8FCB90CB91B7AACB92CB93CB94CB95CB96CB97CB98CB99CB9ACB9BCB9CCB9DCB9ECB9FCBA0CC40CC41D4E5CC42CC43CC44DEBDCC45CC46CC47CC48CC49DEBFCC4ACC4BCC4CCC4DCC4ECC4FCC50CC51CC52CC53CC54C4A2CC55CC56CC57CC58DEC1CC59CC5ACC5BCC5CCC5DCC5ECC5FCC60CC61CC62CC63CC64CC65CC66CC67CC68DEBECC69DEC0CC6ACC6BCC6CCC6DCC6ECC6FCC70CC71CC72CC73CC74CC75CC76CC77D5BACC78CC79CC7ADEC2CC7BCC7CCC7DCC7ECC80CC81CC82CC83CC84CC85CC86CC87CC88CC89CC8ACC8BF2AEBBA2C2B2C5B0C2C7CC8CCC8DF2AFCC8ECC8FCC90CC91CC92D0E9CC93CC94CC95D3DDCC96CC97CC98EBBDCC99CC9ACC9BCC9CCC9DCC9ECC9FCCA0B3E6F2B0CD40F2B1CD41CD42CAADCD43CD44CD45CD46CD47CD48CD49BAE7F2B3F2B5F2B4CBE4CFBAF2B2CAB4D2CFC2ECCD4ACD4BCD4CCD4DCD4ECD4FCD50CEC3F2B8B0F6F2B7CD51CD52CD53CD54CD55F2BECD56B2CFCD57CD58CD59CD5ACD5BCD5CD1C1F2BACD5DCD5ECD5FCD60CD61F2BCD4E9CD62CD63F2BBF2B6F2BFF2BDCD64F2B9CD65CD66F2C7F2C4F2C6CD67CD68F2CAF2C2F2C0CD69CD6ACD6BF2C5CD6CCD6DCD6ECD6FCD70D6FBCD71CD72CD73F2C1CD74C7F9C9DFCD75F2C8B9C6B5B0CD76CD77F2C3F2C9F2D0F2D6CD78CD79BBD7CD7ACD7BCD7CF2D5CDDCCD7DD6EBCD7ECD80F2D2F2D4CD81CD82CD83CD84B8F2CD85CD86CD87CD88F2CBCD89CD8ACD8BF2CEC2F9CD8CD5DDF2CCF2CDF2CFF2D3CD8DCD8ECD8FF2D9D3BCCD90CD91CD92CD93B6EACD94CAF1CD95B7E4F2D7CD96CD97CD98F2D8F2DAF2DDF2DBCD99CD9AF2DCCD9BCD9CCD9DCD9ED1D1F2D1CD9FCDC9CDA0CECFD6A9CE40F2E3CE41C3DBCE42F2E0CE43CE44C0AFF2ECF2DECE45F2E1CE46CE47CE48F2E8CE49CE4ACE4BCE4CF2E2CE4DCE4EF2E7CE4FCE50F2E6CE51CE52F2E9CE53CE54CE55F2DFCE56CE57F2E4F2EACE58CE59CE5ACE5BCE5CCE5DCE5ED3ACF2E5B2F5CE5FCE60F2F2CE61D0ABCE62CE63CE64CE65F2F5CE66CE67CE68BBC8CE69F2F9CE6ACE6BCE6CCE6DCE6ECE6FF2F0CE70CE71F2F6F2F8F2FACE72CE73CE74CE75CE76CE77CE78CE79F2F3CE7AF2F1CE7BCE7CCE7DBAFBCE7EB5FBCE80CE81CE82CE83F2EFF2F7F2EDF2EECE84CE85CE86F2EBF3A6CE87F3A3CE88CE89F3A2CE8ACE8BF2F4CE8CC8DACE8DCE8ECE8FCE90CE91F2FBCE92CE93CE94F3A5CE95CE96CE97CE98CE99CE9ACE9BC3F8CE9CCE9DCE9ECE9FCEA0CF40CF41CF42F2FDCF43CF44F3A7F3A9F3A4CF45F2FCCF46CF47CF48F3ABCF49F3AACF4ACF4BCF4CCF4DC2DDCF4ECF4FF3AECF50CF51F3B0CF52CF53CF54CF55CF56F3A1CF57CF58CF59F3B1F3ACCF5ACF5BCF5CCF5DCF5EF3AFF2FEF3ADCF5FCF60CF61CF62CF63CF64CF65F3B2CF66CF67CF68CF69F3B4CF6ACF6BCF6CCF6DF3A8CF6ECF6FCF70CF71F3B3CF72CF73CF74F3B5CF75CF76CF77CF78CF79CF7ACF7BCF7CCF7DCF7ED0B7CF80CF81CF82CF83F3B8CF84CF85CF86CF87D9F9CF88CF89CF8ACF8BCF8CCF8DF3B9CF8ECF8FCF90CF91CF92CF93CF94CF95F3B7CF96C8E4F3B6CF97CF98CF99CF9AF3BACF9BCF9CCF9DCF9ECF9FF3BBB4C0CFA0D040D041D042D043D044D045D046D047D048D049D04AD04BD04CD04DEEC3D04ED04FD050D051D052D053F3BCD054D055F3BDD056D057D058D1AAD059D05AD05BF4ACD0C6D05CD05DD05ED05FD060D061D0D0D1DCD062D063D064D065D066D067CFCED068D069BDD6D06AD1C3D06BD06CD06DD06ED06FD070D071BAE2E1E9D2C2F1C2B2B9D072D073B1EDF1C3D074C9C0B3C4D075D9F2D076CBA5D077F1C4D078D079D07AD07BD6D4D07CD07DD07ED080D081F1C5F4C0F1C6D082D4ACF1C7D083B0C0F4C1D084D085F4C2D086D087B4FCD088C5DBD089D08AD08BD08CCCBBD08DD08ED08FD0E4D090D091D092D093D094CDE0D095D096D097D098D099F1C8D09AD9F3D09BD09CD09DD09ED09FD0A0B1BBD140CFAED141D142D143B8A4D144D145D146D147D148F1CAD149D14AD14BD14CF1CBD14DD14ED14FD150B2C3C1D1D151D152D7B0F1C9D153D154F1CCD155D156D157D158F1CED159D15AD15BD9F6D15CD2E1D4A3D15DD15EF4C3C8B9D15FD160D161D162D163F4C4D164D165F1CDF1CFBFE3F1D0D166D167F1D4D168D169D16AD16BD16CD16DD16EF1D6F1D1D16FC9D1C5E1D170D171D172C2E3B9FCD173D174F1D3D175F1D5D176D177D178B9D3D179D17AD17BD17CD17DD17ED180F1DBD181D182D183D184D185BAD6D186B0FDF1D9D187D188D189D18AD18BF1D8F1D2F1DAD18CD18DD18ED18FD190F1D7D191D192D193C8ECD194D195D196D197CDCAF1DDD198D199D19AD19BE5BDD19CD19DD19EF1DCD19FF1DED1A0D240D241D242D243D244D245D246D247D248F1DFD249D24ACFE5D24BD24CD24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25BD25CD25DD25ED25FD260D261D262D263F4C5BDF3D264D265D266D267D268D269F1E0D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277D278D279D27AD27BD27CD27DF1E1D27ED280D281CEF7D282D2AAD283F1FBD284D285B8B2D286D287D288D289D28AD28BD28CD28DD28ED28FD290D291D292D293D294D295D296D297D298D299D29AD29BD29CD29DD29ED29FD2A0D340D341D342D343D344D345D346D347D348D349D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358D359D35AD35BD35CD35DD35EBCFBB9DBD35FB9E6C3D9CAD3EAE8C0C0BEF5EAE9EAEAEAEBD360EAECEAEDEAEEEAEFBDC7D361D362D363F5FBD364D365D366F5FDD367F5FED368F5FCD369D36AD36BD36CBDE2D36DF6A1B4A5D36ED36FD370D371F6A2D372D373D374F6A3D375D376D377ECB2D378D379D37AD37BD37CD37DD37ED380D381D382D383D384D1D4D385D386D387D388D389D38AD9EAD38BD38CD38DD38ED38FD390D391D392D393D394D395D396D397D398D399D39AD39BD39CD39DD39ED39FD3A0D440D441D442D443D444D445D446D447D448D449D44AD44BD44CD44DD44ED44FD450D451D452D453D454D455D456D457D458D459D45AD45BD45CD45DD45ED45FF6A4D460D461D462D463D464D465D466D467D468EEBAD469D46AD46BD46CD46DD46ED46FD470D471D472D473D474D475D476D477D478D479D47AD47BD47CD47DD47ED480D481D482D483D484D485D486D487D488D489D48AD48BD48CD48DD48ED48FD490D491D492D493D494D495D496D497D498D499D5B2D49AD49BD49CD49DD49ED49FD4A0D540D541D542D543D544D545D546D547D3FECCDCD548D549D54AD54BD54CD54DD54ED54FCAC4D550D551D552D553D554D555D556D557D558D559D55AD55BD55CD55DD55ED55FD560D561D562D563D564D565D566D567D568D569D56AD56BD56CD56DD56ED56FD570D571D572D573D574D575D576D577D578D579D57AD57BD57CD57DD57ED580D581D582D583D584D585D586D587D588D589D58AD58BD58CD58DD58ED58FD590D591D592D593D594D595D596D597D598D599D59AD59BD59CD59DD59ED59FD5A0D640D641D642D643D644D645D646D647D648D649D64AD64BD64CD64DD64ED64FD650D651D652D653D654D655D656D657D658D659D65AD65BD65CD65DD65ED65FD660D661D662E5C0D663D664D665D666D667D668D669D66AD66BD66CD66DD66ED66FD670D671D672D673D674D675D676D677D678D679D67AD67BD67CD67DD67ED680D681F6A5D682D683D684D685D686D687D688D689D68AD68BD68CD68DD68ED68FD690D691D692D693D694D695D696D697D698D699D69AD69BD69CD69DD69ED69FD6A0D740D741D742D743D744D745D746D747D748D749D74AD74BD74CD74DD74ED74FD750D751D752D753D754D755D756D757D758D759D75AD75BD75CD75DD75ED75FBEAFD760D761D762D763D764C6A9D765D766D767D768D769D76AD76BD76CD76DD76ED76FD770D771D772D773D774D775D776D777D778D779D77AD77BD77CD77DD77ED780D781D782D783D784D785D786D787D788D789D78AD78BD78CD78DD78ED78FD790D791D792D793D794D795D796D797D798DAA5BCC6B6A9B8BCC8CFBCA5DAA6DAA7CCD6C8C3DAA8C6FDD799D1B5D2E9D1B6BCC7D79ABDB2BBE4DAA9DAAAD1C8DAABD0EDB6EFC2DBD79BCBCFB7EDC9E8B7C3BEF7D6A4DAACDAADC6C0D7E7CAB6D79CD5A9CBDFD5EFDAAED6DFB4CADAB0DAAFD79DD2EBDAB1DAB2DAB3CAD4DAB4CAABDAB5DAB6B3CFD6EFDAB7BBB0B5AEDAB8DAB9B9EED1AFD2E8DABAB8C3CFEAB2EFDABBDABCD79EBDEBCEDCD3EFDABDCEF3DABED3D5BBE5DABFCBB5CBD0DAC0C7EBD6EEDAC1C5B5B6C1DAC2B7CCBFCEDAC3DAC4CBADDAC5B5F7DAC6C1C2D7BBDAC7CCB8D79FD2EAC4B1DAC8B5FDBBD1DAC9D0B3DACADACBCEBDDACCDACDDACEB2F7DAD1DACFD1E8DAD0C3D5DAD2D7A0DAD3DAD4DAD5D0BBD2A5B0F9DAD6C7ABDAD7BDF7C3A1DAD8DAD9C3FDCCB7DADADADBC0BEC6D7DADCDADDC7B4DADEDADFB9C8D840D841D842D843D844D845D846D847D848BBEDD849D84AD84BD84CB6B9F4F8D84DF4F9D84ED84FCDE3D850D851D852D853D854D855D856D857F5B9D858D859D85AD85BEBE0D85CD85DD85ED85FD860D861CFF3BBBFD862D863D864D865D866D867D868BAC0D4A5D869D86AD86BD86CD86DD86ED86FE1D9D870D871D872D873F5F4B1AAB2F2D874D875D876D877D878D879D87AF5F5D87BD87CF5F7D87DD87ED880BAD1F5F6D881C3B2D882D883D884D885D886D887D888F5F9D889D88AD88BF5F8D88CD88DD88ED88FD890D891D892D893D894D895D896D897D898D899D89AD89BD89CD89DD89ED89FD8A0D940D941D942D943D944D945D946D947D948D949D94AD94BD94CD94DD94ED94FD950D951D952D953D954D955D956D957D958D959D95AD95BD95CD95DD95ED95FD960D961D962D963D964D965D966D967D968D969D96AD96BD96CD96DD96ED96FD970D971D972D973D974D975D976D977D978D979D97AD97BD97CD97DD97ED980D981D982D983D984D985D986D987D988D989D98AD98BD98CD98DD98ED98FD990D991D992D993D994D995D996D997D998D999D99AD99BD99CD99DD99ED99FD9A0DA40DA41DA42DA43DA44DA45DA46DA47DA48DA49DA4ADA4BDA4CDA4DDA4EB1B4D5EAB8BADA4FB9B1B2C6D4F0CFCDB0DCD5CBBBF5D6CAB7B7CCB0C6B6B1E1B9BAD6FCB9E1B7A1BCFAEADAEADBCCF9B9F3EADCB4FBC3B3B7D1BAD8EADDD4F4EADEBCD6BBDFEADFC1DEC2B8D4DFD7CAEAE0EAE1EAE4EAE2EAE3C9DEB8B3B6C4EAE5CAEAC9CDB4CDDA50DA51E2D9C5E2EAE6C0B5DA52D7B8EAE7D7ACC8FCD8D3D8CDD4DEDA53D4F9C9C4D3AEB8D3B3E0DA54C9E2F4F6DA55DA56DA57BAD5DA58F4F7DA59DA5AD7DFDA5BDA5CF4F1B8B0D5D4B8CFC6F0DA5DDA5EDA5FDA60DA61DA62DA63DA64DA65B3C3DA66DA67F4F2B3ACDA68DA69DA6ADA6BD4BDC7F7DA6CDA6DDA6EDA6FDA70F4F4DA71DA72F4F3DA73DA74DA75DA76DA77DA78DA79DA7ADA7BDA7CCCCBDA7DDA7EDA80C8A4DA81DA82DA83DA84DA85DA86DA87DA88DA89DA8ADA8BDA8CDA8DF4F5DA8ED7E3C5BFF5C0DA8FDA90F5BBDA91F5C3DA92F5C2DA93D6BAF5C1DA94DA95DA96D4BEF5C4DA97F5CCDA98DA99DA9ADA9BB0CFB5F8DA9CF5C9F5CADA9DC5DCDA9EDA9FDAA0DB40F5C5F5C6DB41DB42F5C7F5CBDB43BEE0F5C8B8FADB44DB45DB46F5D0F5D3DB47DB48DB49BFE7DB4AB9F2F5BCF5CDDB4BDB4CC2B7DB4DDB4EDB4FCCF8DB50BCF9DB51F5CEF5CFF5D1B6E5F5D2DB52F5D5DB53DB54DB55DB56DB57DB58DB59F5BDDB5ADB5BDB5CF5D4D3BBDB5DB3ECDB5EDB5FCCA4DB60DB61DB62DB63F5D6DB64DB65DB66DB67DB68DB69DB6ADB6BF5D7BEE1F5D8DB6CDB6DCCDFF5DBDB6EDB6FDB70DB71DB72B2C8D7D9DB73F5D9DB74F5DAF5DCDB75F5E2DB76DB77DB78F5E0DB79DB7ADB7BF5DFF5DDDB7CDB7DF5E1DB7EDB80F5DEF5E4F5E5DB81CCE3DB82DB83E5BFB5B8F5E3F5E8CCA3DB84DB85DB86DB87DB88F5E6F5E7DB89DB8ADB8BDB8CDB8DDB8EF5BEDB8FDB90DB91DB92DB93DB94DB95DB96DB97DB98DB99DB9AB1C4DB9BDB9CF5BFDB9DDB9EB5C5B2E4DB9FF5ECF5E9DBA0B6D7DC40F5EDDC41F5EADC42DC43DC44DC45DC46F5EBDC47DC48B4DADC49D4EADC4ADC4BDC4CF5EEDC4DB3F9DC4EDC4FDC50DC51DC52DC53DC54F5EFF5F1DC55DC56DC57F5F0DC58DC59DC5ADC5BDC5CDC5DDC5EF5F2DC5FF5F3DC60DC61DC62DC63DC64DC65DC66DC67DC68DC69DC6ADC6BC9EDB9AADC6CDC6DC7FBDC6EDC6FB6E3DC70DC71DC72DC73DC74DC75DC76CCC9DC77DC78DC79DC7ADC7BDC7CDC7DDC7EDC80DC81DC82DC83DC84DC85DC86DC87DC88DC89DC8AEAA6DC8BDC8CDC8DDC8EDC8FDC90DC91DC92DC93DC94DC95DC96DC97DC98DC99DC9ADC9BDC9CDC9DDC9EDC9FDCA0DD40DD41DD42DD43DD44DD45DD46DD47DD48DD49DD4ADD4BDD4CDD4DDD4EDD4FDD50DD51DD52DD53DD54DD55DD56DD57DD58DD59DD5ADD5BDD5CDD5DDD5EDD5FDD60DD61DD62DD63DD64DD65DD66DD67DD68DD69DD6ADD6BDD6CDD6DDD6EDD6FDD70DD71DD72DD73DD74DD75DD76DD77DD78DD79DD7ADD7BDD7CDD7DDD7EDD80DD81DD82DD83DD84DD85DD86DD87DD88DD89DD8ADD8BDD8CDD8DDD8EDD8FDD90DD91DD92DD93DD94DD95DD96DD97DD98DD99DD9ADD9BDD9CDD9DDD9EDD9FDDA0DE40DE41DE42DE43DE44DE45DE46DE47DE48DE49DE4ADE4BDE4CDE4DDE4EDE4FDE50DE51DE52DE53DE54DE55DE56DE57DE58DE59DE5ADE5BDE5CDE5DDE5EDE5FDE60B3B5D4FEB9ECD0F9DE61E9EDD7AAE9EEC2D6C8EDBAE4E9EFE9F0E9F1D6E1E9F2E9F3E9F5E9F4E9F6E9F7C7E1E9F8D4D8E9F9BDCEDE62E9FAE9FBBDCFE9FCB8A8C1BEE9FDB1B2BBD4B9F5E9FEDE63EAA1EAA2EAA3B7F8BCADDE64CAE4E0CED4AFCFBDD5B7EAA4D5DEEAA5D0C1B9BCDE65B4C7B1D9DE66DE67DE68C0B1DE69DE6ADE6BDE6CB1E6B1E7DE6DB1E8DE6EDE6FDE70DE71B3BDC8E8DE72DE73DE74DE75E5C1DE76DE77B1DFDE78DE79DE7AC1C9B4EFDE7BDE7CC7A8D3D8DE7DC6F9D1B8DE7EB9FDC2F5DE80DE81DE82DE83DE84D3ADDE85D4CBBDFCDE86E5C2B7B5E5C3DE87DE88BBB9D5E2DE89BDF8D4B6CEA5C1ACB3D9DE8ADE8BCCF6DE8CE5C6E5C4E5C8DE8DE5CAE5C7B5CFC6C8DE8EB5FCE5C5DE8FCAF6DE90DE91E5C9DE92DE93DE94C3D4B1C5BCA3DE95DE96DE97D7B7DE98DE99CDCBCBCDCACACCD3E5CCE5CBC4E6DE9ADE9BD1A1D1B7E5CDDE9CE5D0DE9DCDB8D6F0E5CFB5DDDE9ECDBEDE9FE5D1B6BADEA0DF40CDA8B9E4DF41CAC5B3D1CBD9D4ECE5D2B7EADF42DF43DF44E5CEDF45DF46DF47DF48DF49DF4AE5D5B4FEE5D6DF4BDF4CDF4DDF4EDF4FE5D3E5D4DF50D2DDDF51DF52C2DFB1C6DF53D3E2DF54DF55B6DDCBECDF56E5D7DF57DF58D3F6DF59DF5ADF5BDF5CDF5DB1E9DF5EB6F4E5DAE5D8E5D9B5C0DF5FDF60DF61D2C5E5DCDF62DF63E5DEDF64DF65DF66DF67DF68DF69E5DDC7B2DF6AD2A3DF6BDF6CE5DBDF6DDF6EDF6FDF70D4E2D5DADF71DF72DF73DF74DF75E5E0D7F1DF76DF77DF78DF79DF7ADF7BDF7CE5E1DF7DB1DCD1FBDF7EE5E2E5E4DF80DF81DF82DF83E5E3DF84DF85E5E5DF86DF87DF88DF89DF8AD2D8DF8BB5CBDF8CE7DFDF8DDAF5DF8EDAF8DF8FDAF6DF90DAF7DF91DF92DF93DAFAD0CFC4C7DF94DF95B0EEDF96DF97DF98D0B0DF99DAF9DF9AD3CABAAADBA2C7F1DF9BDAFCDAFBC9DBDAFDDF9CDBA1D7DEDAFEC1DADF9DDF9EDBA5DF9FDFA0D3F4E040E041DBA7DBA4E042DBA8E043E044BDBCE045E046E047C0C9DBA3DBA6D6A3E048DBA9E049E04AE04BDBADE04CE04DE04EDBAEDBACBAC2E04FE050E051BFA4DBABE052E053E054DBAAD4C7B2BFE055E056DBAFE057B9F9E058DBB0E059E05AE05BE05CB3BBE05DE05EE05FB5A6E060E061E062E063B6BCDBB1E064E065E066B6F5E067DBB2E068E069E06AE06BE06CE06DE06EE06FE070E071E072E073E074E075E076E077E078E079E07AE07BB1C9E07CE07DE07EE080DBB4E081E082E083DBB3DBB5E084E085E086E087E088E089E08AE08BE08CE08DE08EDBB7E08FDBB6E090E091E092E093E094E095E096DBB8E097E098E099E09AE09BE09CE09DE09EE09FDBB9E0A0E140DBBAE141E142D3CFF4FAC7F5D7C3C5E4F4FCF4FDF4FBE143BEC6E144E145E146E147D0EFE148E149B7D3E14AE14BD4CDCCAAE14CE14DF5A2F5A1BAA8F4FECBD6E14EE14FE150F5A4C0D2E151B3EAE152CDAAF5A5F5A3BDB4F5A8E153F5A9BDCDC3B8BFE1CBE1F5AAE154E155E156F5A6F5A7C4F0E157E158E159E15AE15BF5ACE15CB4BCE15DD7EDE15EB4D7F5ABF5AEE15FE160F5ADF5AFD0D1E161E162E163E164E165E166E167C3D1C8A9E168E169E16AE16BE16CE16DF5B0F5B1E16EE16FE170E171E172E173F5B2E174E175F5B3F5B4F5B5E176E177E178E179F5B7F5B6E17AE17BE17CE17DF5B8E17EE180E181E182E183E184E185E186E187E188E189E18AB2C9E18BD3D4CACDE18CC0EFD6D8D2B0C1BFE18DBDF0E18EE18FE190E191E192E193E194E195E196E197B8AAE198E199E19AE19BE19CE19DE19EE19FE1A0E240E241E242E243E244E245E246E247E248E249E24AE24BE24CE24DE24EE24FE250E251E252E253E254E255E256E257E258E259E25AE25BE25CE25DE25EE25FE260E261E262E263E264E265E266E267E268E269E26AE26BE26CE26DE26EE26FE270E271E272E273E274E275E276E277E278E279E27AE27BE27CE27DE27EE280E281E282E283E284E285E286E287E288E289E28AE28BE28CE28DE28EE28FE290E291E292E293E294E295E296E297E298E299E29AE29BE29CE29DE29EE29FE2A0E340E341E342E343E344E345E346E347E348E349E34AE34BE34CE34DE34EE34FE350E351E352E353E354E355E356E357E358E359E35AE35BE35CE35DE35EE35FE360E361E362E363E364E365E366E367E368E369E36AE36BE36CE36DBCF8E36EE36FE370E371E372E373E374E375E376E377E378E379E37AE37BE37CE37DE37EE380E381E382E383E384E385E386E387F6C6E388E389E38AE38BE38CE38DE38EE38FE390E391E392E393E394E395E396E397E398E399E39AE39BE39CE39DE39EE39FE3A0E440E441E442E443E444E445F6C7E446E447E448E449E44AE44BE44CE44DE44EE44FE450E451E452E453E454E455E456E457E458E459E45AE45BE45CE45DE45EF6C8E45FE460E461E462E463E464E465E466E467E468E469E46AE46BE46CE46DE46EE46FE470E471E472E473E474E475E476E477E478E479E47AE47BE47CE47DE47EE480E481E482E483E484E485E486E487E488E489E48AE48BE48CE48DE48EE48FE490E491E492E493E494E495E496E497E498E499E49AE49BE49CE49DE49EE49FE4A0E540E541E542E543E544E545E546E547E548E549E54AE54BE54CE54DE54EE54FE550E551E552E553E554E555E556E557E558E559E55AE55BE55CE55DE55EE55FE560E561E562E563E564E565E566E567E568E569E56AE56BE56CE56DE56EE56FE570E571E572E573F6C9E574E575E576E577E578E579E57AE57BE57CE57DE57EE580E581E582E583E584E585E586E587E588E589E58AE58BE58CE58DE58EE58FE590E591E592E593E594E595E596E597E598E599E59AE59BE59CE59DE59EE59FF6CAE5A0E640E641E642E643E644E645E646E647E648E649E64AE64BE64CE64DE64EE64FE650E651E652E653E654E655E656E657E658E659E65AE65BE65CE65DE65EE65FE660E661E662F6CCE663E664E665E666E667E668E669E66AE66BE66CE66DE66EE66FE670E671E672E673E674E675E676E677E678E679E67AE67BE67CE67DE67EE680E681E682E683E684E685E686E687E688E689E68AE68BE68CE68DE68EE68FE690E691E692E693E694E695E696E697E698E699E69AE69BE69CE69DF6CBE69EE69FE6A0E740E741E742E743E744E745E746E747F7E9E748E749E74AE74BE74CE74DE74EE74FE750E751E752E753E754E755E756E757E758E759E75AE75BE75CE75DE75EE75FE760E761E762E763E764E765E766E767E768E769E76AE76BE76CE76DE76EE76FE770E771E772E773E774E775E776E777E778E779E77AE77BE77CE77DE77EE780E781E782E783E784E785E786E787E788E789E78AE78BE78CE78DE78EE78FE790E791E792E793E794E795E796E797E798E799E79AE79BE79CE79DE79EE79FE7A0E840E841E842E843E844E845E846E847E848E849E84AE84BE84CE84DE84EF6CDE84FE850E851E852E853E854E855E856E857E858E859E85AE85BE85CE85DE85EE85FE860E861E862E863E864E865E866E867E868E869E86AE86BE86CE86DE86EE86FE870E871E872E873E874E875E876E877E878E879E87AF6CEE87BE87CE87DE87EE880E881E882E883E884E885E886E887E888E889E88AE88BE88CE88DE88EE88FE890E891E892E893E894EEC4EEC5EEC6D5EBB6A4EEC8EEC7EEC9EECAC7A5EECBEECCE895B7B0B5F6EECDEECFE896EECEE897B8C6EED0EED1EED2B6DBB3AED6D3C4C6B1B5B8D6EED3EED4D4BFC7D5BEFBCED9B9B3EED6EED5EED8EED7C5A5EED9EEDAC7AEEEDBC7AFEEDCB2A7EEDDEEDEEEDFEEE0EEE1D7EAEEE2EEE3BCD8EEE4D3CBCCFAB2ACC1E5EEE5C7A6C3ADE898EEE6EEE7EEE8EEE9EEEAEEEBEEECE899EEEDEEEEEEEFE89AE89BEEF0EEF1EEF2EEF4EEF3E89CEEF5CDADC2C1EEF6EEF7EEF8D5A1EEF9CFB3EEFAEEFBE89DEEFCEEFDEFA1EEFEEFA2B8F5C3FAEFA3EFA4BDC2D2BFB2F9EFA5EFA6EFA7D2F8EFA8D6FDEFA9C6CCE89EEFAAEFABC1B4EFACCFFACBF8EFAEEFADB3FAB9F8EFAFEFB0D0E2EFB1EFB2B7E6D0BFEFB3EFB4EFB5C8F1CCE0EFB6EFB7EFB8EFB9EFBAD5E0EFBBB4EDC3AAEFBCE89FEFBDEFBEEFBFE8A0CEFDEFC0C2E0B4B8D7B6BDF5E940CFC7EFC3EFC1EFC2EFC4B6A7BCFCBEE2C3CCEFC5EFC6E941EFC7EFCFEFC8EFC9EFCAC7C2EFF1B6CDEFCBE942EFCCEFCDB6C6C3BEEFCEE943EFD0EFD1EFD2D5F2E944EFD3C4F7E945EFD4C4F8EFD5EFD6B8E4B0F7EFD7EFD8EFD9E946EFDAEFDBEFDCEFDDE947EFDEBEB5EFE1EFDFEFE0E948EFE2EFE3C1CDEFE4EFE5EFE6EFE7EFE8EFE9EFEAEFEBEFECC0D8E949EFEDC1ADEFEEEFEFEFF0E94AE94BCFE2E94CE94DE94EE94FE950E951E952E953B3A4E954E955E956E957E958E959E95AE95BE95CE95DE95EE95FE960E961E962E963E964E965E966E967E968E969E96AE96BE96CE96DE96EE96FE970E971E972E973E974E975E976E977E978E979E97AE97BE97CE97DE97EE980E981E982E983E984E985E986E987E988E989E98AE98BE98CE98DE98EE98FE990E991E992E993E994E995E996E997E998E999E99AE99BE99CE99DE99EE99FE9A0EA40EA41EA42EA43EA44EA45EA46EA47EA48EA49EA4AEA4BEA4CEA4DEA4EEA4FEA50EA51EA52EA53EA54EA55EA56EA57EA58EA59EA5AEA5BC3C5E3C5C9C1E3C6EA5CB1D5CECAB4B3C8F2E3C7CFD0E3C8BCE4E3C9E3CAC3C6D5A2C4D6B9EBCEC5E3CBC3F6E3CCEA5DB7A7B8F3BAD2E3CDE3CED4C4E3CFEA5EE3D0D1CBE3D1E3D2E3D3E3D4D1D6E3D5B2FBC0BBE3D6EA5FC0ABE3D7E3D8E3D9EA60E3DAE3DBEA61B8B7DAE2EA62B6D3EA63DAE4DAE3EA64EA65EA66EA67EA68EA69EA6ADAE6EA6BEA6CEA6DC8EEEA6EEA6FDAE5B7C0D1F4D2F5D5F3BDD7EA70EA71EA72EA73D7E8DAE8DAE7EA74B0A2CDD3EA75DAE9EA76B8BDBCCAC2BDC2A4B3C2DAEAEA77C2AAC4B0BDB5EA78EA79CFDEEA7AEA7BEA7CDAEBC9C2EA7DEA7EEA80EA81EA82B1DDEA83EA84EA85DAECEA86B6B8D4BAEA87B3FDEA88EA89DAEDD4C9CFD5C5E3EA8ADAEEEA8BEA8CEA8DEA8EEA8FDAEFEA90DAF0C1EACCD5CFDDEA91EA92EA93EA94EA95EA96EA97EA98EA99EA9AEA9BEA9CEA9DD3E7C2A1EA9EDAF1EA9FEAA0CBE5EB40DAF2EB41CBE6D2FEEB42EB43EB44B8F4EB45EB46DAF3B0AFCFB6EB47EB48D5CFEB49EB4AEB4BEB4CEB4DEB4EEB4FEB50EB51EB52CBEDEB53EB54EB55EB56EB57EB58EB59EB5ADAF4EB5BEB5CE3C4EB5DEB5EC1A5EB5FEB60F6BFEB61EB62F6C0F6C1C4D1EB63C8B8D1E3EB64EB65D0DBD1C5BCAFB9CDEB66EFF4EB67EB68B4C6D3BAF6C2B3FBEB69EB6AF6C3EB6BEB6CB5F1EB6DEB6EEB6FEB70EB71EB72EB73EB74EB75EB76F6C5EB77EB78EB79EB7AEB7BEB7CEB7DD3EAF6A7D1A9EB7EEB80EB81EB82F6A9EB83EB84EB85F6A8EB86EB87C1E3C0D7EB88B1A2EB89EB8AEB8BEB8CCEEDEB8DD0E8F6ABEB8EEB8FCFF6EB90F6AAD5F0F6ACC3B9EB91EB92EB93BBF4F6AEF6ADEB94EB95EB96C4DEEB97EB98C1D8EB99EB9AEB9BEB9CEB9DCBAAEB9ECFBCEB9FEBA0EC40EC41EC42EC43EC44EC45EC46EC47EC48F6AFEC49EC4AF6B0EC4BEC4CF6B1EC4DC2B6EC4EEC4FEC50EC51EC52B0D4C5F9EC53EC54EC55EC56F6B2EC57EC58EC59EC5AEC5BEC5CEC5DEC5EEC5FEC60EC61EC62EC63EC64EC65EC66EC67EC68EC69C7E0F6A6EC6AEC6BBEB8EC6CEC6DBEB2EC6EB5E5EC6FEC70B7C7EC71BFBFC3D2C3E6EC72EC73D8CCEC74EC75EC76B8EFEC77EC78EC79EC7AEC7BEC7CEC7DEC7EEC80BDF9D1A5EC81B0D0EC82EC83EC84EC85EC86F7B0EC87EC88EC89EC8AEC8BEC8CEC8DEC8EF7B1EC8FEC90EC91EC92EC93D0ACEC94B0B0EC95EC96EC97F7B2F7B3EC98F7B4EC99EC9AEC9BC7CAEC9CEC9DEC9EEC9FECA0ED40ED41BECFED42ED43F7B7ED44ED45ED46ED47ED48ED49ED4AF7B6ED4BB1DEED4CF7B5ED4DED4EF7B8ED4FF7B9ED50ED51ED52ED53ED54ED55ED56ED57ED58ED59ED5AED5BED5CED5DED5EED5FED60ED61ED62ED63ED64ED65ED66ED67ED68ED69ED6AED6BED6CED6DED6EED6FED70ED71ED72ED73ED74ED75ED76ED77ED78ED79ED7AED7BED7CED7DED7EED80ED81CEA4C8CDED82BAABE8B8E8B9E8BABEC2ED83ED84ED85ED86ED87D2F4ED88D4CFC9D8ED89ED8AED8BED8CED8DED8EED8FED90ED91ED92ED93ED94ED95ED96ED97ED98ED99ED9AED9BED9CED9DED9EED9FEDA0EE40EE41EE42EE43EE44EE45EE46EE47EE48EE49EE4AEE4BEE4CEE4DEE4EEE4FEE50EE51EE52EE53EE54EE55EE56EE57EE58EE59EE5AEE5BEE5CEE5DEE5EEE5FEE60EE61EE62EE63EE64EE65EE66EE67EE68EE69EE6AEE6BEE6CEE6DEE6EEE6FEE70EE71EE72EE73EE74EE75EE76EE77EE78EE79EE7AEE7BEE7CEE7DEE7EEE80EE81EE82EE83EE84EE85EE86EE87EE88EE89EE8AEE8BEE8CEE8DEE8EEE8FEE90EE91EE92EE93EE94EE95EE96EE97EE98EE99EE9AEE9BEE9CEE9DEE9EEE9FEEA0EF40EF41EF42EF43EF44EF45D2B3B6A5C7EAF1FCCFEECBB3D0EBE7EFCDE7B9CBB6D9F1FDB0E4CBCCF1FED4A4C2ADC1ECC6C4BEB1F2A1BCD5EF46F2A2F2A3EF47F2A4D2C3C6B5EF48CDC7F2A5EF49D3B1BFC5CCE2EF4AF2A6F2A7D1D5B6EEF2A8F2A9B5DFF2AAF2ABEF4BB2FCF2ACF2ADC8A7EF4CEF4DEF4EEF4FEF50EF51EF52EF53EF54EF55EF56EF57EF58EF59EF5AEF5BEF5CEF5DEF5EEF5FEF60EF61EF62EF63EF64EF65EF66EF67EF68EF69EF6AEF6BEF6CEF6DEF6EEF6FEF70EF71B7E7EF72EF73ECA9ECAAECABEF74ECACEF75EF76C6AEECADECAEEF77EF78EF79B7C9CAB3EF7AEF7BEF7CEF7DEF7EEF80EF81E2B8F7CFEF82EF83EF84EF85EF86EF87EF88EF89EF8AEF8BEF8CEF8DEF8EEF8FEF90EF91EF92EF93EF94EF95EF96EF97EF98EF99EF9AEF9BEF9CEF9DEF9EEF9FEFA0F040F041F042F043F044F7D0F045F046B2CDF047F048F049F04AF04BF04CF04DF04EF04FF050F051F052F053F054F055F056F057F058F059F05AF05BF05CF05DF05EF05FF060F061F062F063F7D1F064F065F066F067F068F069F06AF06BF06CF06DF06EF06FF070F071F072F073F074F075F076F077F078F079F07AF07BF07CF07DF07EF080F081F082F083F084F085F086F087F088F089F7D3F7D2F08AF08BF08CF08DF08EF08FF090F091F092F093F094F095F096E2BBF097BCA2F098E2BCE2BDE2BEE2BFE2C0E2C1B7B9D2FBBDA4CACEB1A5CBC7F099E2C2B6FCC8C4E2C3F09AF09BBDC8F09CB1FDE2C4F09DB6F6E2C5C4D9F09EF09FE2C6CFDAB9DDE2C7C0A1F0A0E2C8B2F6F140E2C9F141C1F3E2CAE2CBC2F8E2CCE2CDE2CECAD7D8B8D9E5CFE3F142F143F144F145F146F147F148F149F14AF14BF14CF0A5F14DF14EDCB0F14FF150F151F152F153F154F155F156F157F158F159F15AF15BF15CF15DF15EF15FF160F161F162F163F164F165F166F167F168F169F16AF16BF16CF16DF16EF16FF170F171F172F173F174F175F176F177F178F179F17AF17BF17CF17DF17EF180F181F182F183F184F185F186F187F188F189F18AF18BF18CF18DF18EF18FF190F191F192F193F194F195F196F197F198F199F19AF19BF19CF19DF19EF19FF1A0F240F241F242F243F244F245F246F247F248F249F24AF24BF24CF24DF24EF24FF250F251F252F253F254F255F256F257F258F259F25AF25BF25CF25DF25EF25FF260F261F262F263F264F265F266F267F268F269F26AF26BF26CF26DF26EF26FF270F271F272F273F274F275F276F277F278F279F27AF27BF27CF27DF27EF280F281F282F283F284F285F286F287F288F289F28AF28BF28CF28DF28EF28FF290F291F292F293F294F295F296F297F298F299F29AF29BF29CF29DF29EF29FF2A0F340F341F342F343F344F345F346F347F348F349F34AF34BF34CF34DF34EF34FF350F351C2EDD4A6CDD4D1B1B3DBC7FDF352B2B5C2BFE6E0CABBE6E1E6E2BED4E6E3D7A4CDD5E6E5BCDDE6E4E6E6E6E7C2EEF353BDBEE6E8C2E6BAA7E6E9F354E6EAB3D2D1E9F355F356BFA5E6EBC6EFE6ECE6EDF357F358E6EEC6ADE6EFF359C9A7E6F0E6F1E6F2E5B9E6F3E6F4C2E2E6F5E6F6D6E8E6F7F35AE6F8B9C7F35BF35CF35DF35EF35FF360F361F7BBF7BAF362F363F364F365F7BEF7BCBAA1F366F7BFF367F7C0F368F369F36AF7C2F7C1F7C4F36BF36CF7C3F36DF36EF36FF370F371F7C5F7C6F372F373F374F375F7C7F376CBE8F377F378F379F37AB8DFF37BF37CF37DF37EF380F381F7D4F382F7D5F383F384F385F386F7D6F387F388F389F38AF7D8F38BF7DAF38CF7D7F38DF38EF38FF390F391F392F393F394F395F7DBF396F7D9F397F398F399F39AF39BF39CF39DD7D7F39EF39FF3A0F440F7DCF441F442F443F444F445F446F7DDF447F448F449F7DEF44AF44BF44CF44DF44EF44FF450F451F452F453F454F7DFF455F456F457F7E0F458F459F45AF45BF45CF45DF45EF45FF460F461F462DBCBF463F464D8AAF465F466F467F468F469F46AF46BF46CE5F7B9EDF46DF46EF46FF470BFFDBBEAF7C9C6C7F7C8F471F7CAF7CCF7CBF472F473F474F7CDF475CEBAF476F7CEF477F478C4A7F479F47AF47BF47CF47DF47EF480F481F482F483F484F485F486F487F488F489F48AF48BF48CF48DF48EF48FF490F491F492F493F494F495F496F497F498F499F49AF49BF49CF49DF49EF49FF4A0F540F541F542F543F544F545F546F547F548F549F54AF54BF54CF54DF54EF54FF550F551F552F553F554F555F556F557F558F559F55AF55BF55CF55DF55EF55FF560F561F562F563F564F565F566F567F568F569F56AF56BF56CF56DF56EF56FF570F571F572F573F574F575F576F577F578F579F57AF57BF57CF57DF57EF580F581F582F583F584F585F586F587F588F589F58AF58BF58CF58DF58EF58FF590F591F592F593F594F595F596F597F598F599F59AF59BF59CF59DF59EF59FF5A0F640F641F642F643F644F645F646F647F648F649F64AF64BF64CF64DF64EF64FF650F651F652F653F654F655F656F657F658F659F65AF65BF65CF65DF65EF65FF660F661F662F663F664F665F666F667F668F669F66AF66BF66CF66DF66EF66FF670F671F672F673F674F675F676F677F678F679F67AF67BF67CF67DF67EF680F681F682F683F684F685F686F687F688F689F68AF68BF68CF68DF68EF68FF690F691F692F693F694F695F696F697F698F699F69AF69BF69CF69DF69EF69FF6A0F740F741F742F743F744F745F746F747F748F749F74AF74BF74CF74DF74EF74FF750F751F752F753F754F755F756F757F758F759F75AF75BF75CF75DF75EF75FF760F761F762F763F764F765F766F767F768F769F76AF76BF76CF76DF76EF76FF770F771F772F773F774F775F776F777F778F779F77AF77BF77CF77DF77EF780D3E3F781F782F6CFF783C2B3F6D0F784F785F6D1F6D2F6D3F6D4F786F787F6D6F788B1ABF6D7F789F6D8F6D9F6DAF78AF6DBF6DCF78BF78CF78DF78EF6DDF6DECFCAF78FF6DFF6E0F6E1F6E2F6E3F6E4C0F0F6E5F6E6F6E7F6E8F6E9F790F6EAF791F6EBF6ECF792F6EDF6EEF6EFF6F0F6F1F6F2F6F3F6F4BEA8F793F6F5F6F6F6F7F6F8F794F795F796F797F798C8FAF6F9F6FAF6FBF6FCF799F79AF6FDF6FEF7A1F7A2F7A3F7A4F7A5F79BF79CF7A6F7A7F7A8B1EEF7A9F7AAF7ABF79DF79EF7ACF7ADC1DBF7AEF79FF7A0F7AFF840F841F842F843F844F845F846F847F848F849F84AF84BF84CF84DF84EF84FF850F851F852F853F854F855F856F857F858F859F85AF85BF85CF85DF85EF85FF860F861F862F863F864F865F866F867F868F869F86AF86BF86CF86DF86EF86FF870F871F872F873F874F875F876F877F878F879F87AF87BF87CF87DF87EF880F881F882F883F884F885F886F887F888F889F88AF88BF88CF88DF88EF88FF890F891F892F893F894F895F896F897F898F899F89AF89BF89CF89DF89EF89FF8A0F940F941F942F943F944F945F946F947F948F949F94AF94BF94CF94DF94EF94FF950F951F952F953F954F955F956F957F958F959F95AF95BF95CF95DF95EF95FF960F961F962F963F964F965F966F967F968F969F96AF96BF96CF96DF96EF96FF970F971F972F973F974F975F976F977F978F979F97AF97BF97CF97DF97EF980F981F982F983F984F985F986F987F988F989F98AF98BF98CF98DF98EF98FF990F991F992F993F994F995F996F997F998F999F99AF99BF99CF99DF99EF99FF9A0FA40FA41FA42FA43FA44FA45FA46FA47FA48FA49FA4AFA4BFA4CFA4DFA4EFA4FFA50FA51FA52FA53FA54FA55FA56FA57FA58FA59FA5AFA5BFA5CFA5DFA5EFA5FFA60FA61FA62FA63FA64FA65FA66FA67FA68FA69FA6AFA6BFA6CFA6DFA6EFA6FFA70FA71FA72FA73FA74FA75FA76FA77FA78FA79FA7AFA7BFA7CFA7DFA7EFA80FA81FA82FA83FA84FA85FA86FA87FA88FA89FA8AFA8BFA8CFA8DFA8EFA8FFA90FA91FA92FA93FA94FA95FA96FA97FA98FA99FA9AFA9BFA9CFA9DFA9EFA9FFAA0FB40FB41FB42FB43FB44FB45FB46FB47FB48FB49FB4AFB4BFB4CFB4DFB4EFB4FFB50FB51FB52FB53FB54FB55FB56FB57FB58FB59FB5AFB5BC4F1F0AFBCA6F0B0C3F9FB5CC5B8D1BBFB5DF0B1F0B2F0B3F0B4F0B5D1BCFB5ED1ECFB5FF0B7F0B6D4A7FB60CDD2F0B8F0BAF0B9F0BBF0BCFB61FB62B8EBF0BDBAE8FB63F0BEF0BFBEE9F0C0B6ECF0C1F0C2F0C3F0C4C8B5F0C5F0C6FB64F0C7C5F4FB65F0C8FB66FB67FB68F0C9FB69F0CAF7BDFB6AF0CBF0CCF0CDFB6BF0CEFB6CFB6DFB6EFB6FF0CFBAD7FB70F0D0F0D1F0D2F0D3F0D4F0D5F0D6F0D8FB71FB72D3A5F0D7FB73F0D9FB74FB75FB76FB77FB78FB79FB7AFB7BFB7CFB7DF5BAC2B9FB7EFB80F7E4FB81FB82FB83FB84F7E5F7E6FB85FB86F7E7FB87FB88FB89FB8AFB8BFB8CF7E8C2B4FB8DFB8EFB8FFB90FB91FB92FB93FB94FB95F7EAFB96F7EBFB97FB98FB99FB9AFB9BFB9CC2F3FB9DFB9EFB9FFBA0FC40FC41FC42FC43FC44FC45FC46FC47FC48F4F0FC49FC4AFC4BF4EFFC4CFC4DC2E9FC4EF7E1F7E2FC4FFC50FC51FC52FC53BBC6FC54FC55FC56FC57D9E4FC58FC59FC5ACAF2C0E8F0A4FC5BBADAFC5CFC5DC7ADFC5EFC5FFC60C4ACFC61FC62F7ECF7EDF7EEFC63F7F0F7EFFC64F7F1FC65FC66F7F4FC67F7F3FC68F7F2F7F5FC69FC6AFC6BFC6CF7F6FC6DFC6EFC6FFC70FC71FC72FC73FC74FC75EDE9FC76EDEAEDEBFC77F6BCFC78FC79FC7AFC7BFC7CFC7DFC7EFC80FC81FC82FC83FC84F6BDFC85F6BEB6A6FC86D8BEFC87FC88B9C4FC89FC8AFC8BD8BBFC8CDCB1FC8DFC8EFC8FFC90FC91FC92CAF3FC93F7F7FC94FC95FC96FC97FC98FC99FC9AFC9BFC9CF7F8FC9DFC9EF7F9FC9FFCA0FD40FD41FD42FD43FD44F7FBFD45F7FAFD46B1C7FD47F7FCF7FDFD48FD49FD4AFD4BFD4CF7FEFD4DFD4EFD4FFD50FD51FD52FD53FD54FD55FD56FD57C6EBECB4FD58FD59FD5AFD5BFD5CFD5DFD5EFD5FFD60FD61FD62FD63FD64FD65FD66FD67FD68FD69FD6AFD6BFD6CFD6DFD6EFD6FFD70FD71FD72FD73FD74FD75FD76FD77FD78FD79FD7AFD7BFD7CFD7DFD7EFD80FD81FD82FD83FD84FD85B3DDF6B3FD86FD87F6B4C1E4F6B5F6B6F6B7F6B8F6B9F6BAC8A3F6BBFD88FD89FD8AFD8BFD8CFD8DFD8EFD8FFD90FD91FD92FD93C1FAB9A8EDE8FD94FD95FD96B9EAD9DFFD97FD98FD99FD9AFD9';\n\n            for (var i = 0; i < str.length; i++) {\n                var c = str.charAt(i),\n                    code = str.charCodeAt(i);\n                if (c == \" \") strOut += \"+\";\n                else if (code >= 19968 && code <= 40869) {\n                    var index = code - 19968;\n                    strOut += \"%\" + z.substr(index * 4, 2) + \"%\" + z.substr(index * 4 + 2, 2);\n                } else {\n                    strOut += \"%\" + str.charCodeAt(i).toString(16);\n                }\n            }\n            return strOut;\n        },\n        /* 改变图片大小 */\n        scale: function (img, w, h) {\n            var ow = img.width,\n                oh = img.height;\n\n            if (ow >= oh) {\n                img.width = w * ow / oh;\n                img.height = h;\n                img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';\n            } else {\n                img.width = w;\n                img.height = h * oh / ow;\n                img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';\n            }\n        },\n        getImageData: function(){\n            var _this = this,\n                key = $G('searchTxt').value,\n                type = $G('searchType').value,\n                keepOriginName = editor.options.keepOriginName ? \"1\" : \"0\",\n                url = \"https://image.baidu.com/search/index?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimage&istype=2&rn=32&fm=index&pv=&word=\" + _this.encodeToGb2312(key) + type + \"&keeporiginname=\" + keepOriginName + \"&\" + +new Date;\n\n            $G('searchListUl').innerHTML = lang.searchLoading;\n            ajax.request(url, {\n                'dataType': 'jsonp',\n                'charset': 'GB18030',\n                'onsuccess':function(json){\n\t\t\t\t\tconsole.log(json);\n                    var list = [];\n                    if(json && json.data) {\n                        for(var i = 0; i < json.data.length; i++) {\n                            if(json.data[i].objURL) {\n                                list.push({\n                                    title: json.data[i].fromPageTitleEnc,\n                                    src: json.data[i].objURL,\n                                    url: json.data[i].fromURL\n                                });\n                            }\n                        }\n                    }\n                    _this.setList(list);\n                },\n                'onerror':function(){\n                    $G('searchListUl').innerHTML = lang.searchRetry;\n                }\n            });\n        },\n        /* 添加图片到列表界面上 */\n        setList: function (list) {\n            var i, item, p, img, link, _this = this,\n                listUl = $G('searchListUl');\n\n            listUl.innerHTML = '';\n            if(list.length) {\n                for (i = 0; i < list.length; i++) {\n                    item = document.createElement('li');\n                    p = document.createElement('p');\n                    img = document.createElement('img');\n                    link = document.createElement('a');\n\n                    img.onload = function () {\n                        _this.scale(this, 113, 113);\n                    };\n                    img.width = 113;\n                    img.setAttribute('src', list[i].src);\n\n                    link.href = list[i].url;\n                    link.target = '_blank';\n                    link.title = list[i].title;\n                    link.innerHTML = list[i].title;\n\n                    p.appendChild(img);\n                    item.appendChild(p);\n                    item.appendChild(link);\n                    listUl.appendChild(item);\n                }\n            } else {\n                listUl.innerHTML = lang.searchRetry;\n            }\n        },\n        getInsertList: function () {\n            var child,\n                src,\n                align = getAlign(),\n                list = [],\n                items = $G('searchListUl').children;\n            for(var i = 0; i < items.length; i++) {\n                child = items[i].firstChild && items[i].firstChild.firstChild;\n                if(child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) {\n                    src = child.src;\n                    list.push({\n                        src: src,\n                        _src: src,\n                        alt: src.substr(src.lastIndexOf('/') + 1),\n                        floatStyle: align\n                    });\n                }\n            }\n            return list;\n        }\n    };\n\n})();\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/insertframe/insertframe.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <title></title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        .warp {width: 320px;height: 153px;margin-left:5px;padding: 20px 0 0 15px;position: relative;}\n        #url {width: 290px; margin-bottom: 2px; margin-left: -6px; margin-left: -2px\\9;*margin-left:0;_margin-left:0; }\n        .format span{display: inline-block; width: 58px;text-align: center; zoom:1;}\n        table td{padding:5px 0;}\n        #align{width: 65px;height: 23px;line-height: 22px;}\n    </style>\n</head>\n<body>\n<div class=\"warp\">\n        <table width=\"300\" cellpadding=\"0\" cellspacing=\"0\">\n            <tr>\n                <td colspan=\"2\" class=\"format\">\n                    <span><var id=\"lang_input_address\"></var></span>\n                    <input style=\"width:200px\" id=\"url\" type=\"text\" value=\"\"/>\n                </td>\n            </tr>\n            <tr>\n                <td colspan=\"2\" class=\"format\"><span><var id=\"lang_input_width\"></var></span><input style=\"width:200px\" type=\"text\" id=\"width\"/> px</td>\n\n            </tr>\n            <tr>\n                <td colspan=\"2\" class=\"format\"><span><var id=\"lang_input_height\"></var></span><input style=\"width:200px\" type=\"text\" id=\"height\"/> px</td>\n            </tr>\n            <tr>\n                <td><span><var id=\"lang_input_isScroll\"></var></span><input type=\"checkbox\" id=\"scroll\"/> </td>\n                <td><span><var id=\"lang_input_frameborder\"></var></span><input type=\"checkbox\" id=\"frameborder\"/> </td>\n            </tr>\n\n            <tr>\n                <td colspan=\"2\"><span><var id=\"lang_input_alignMode\"></var></span>\n                    <select id=\"align\">\n                        <option value=\"\"></option>\n                        <option value=\"left\"></option>\n                        <option value=\"right\"></option>\n                    </select>\n                </td>\n            </tr>\n        </table>\n</div>\n<script type=\"text/javascript\">\n    var iframe = editor._iframe;\n    if(iframe){\n        $G(\"url\").value = iframe.getAttribute(\"src\")||\"\";\n        $G(\"width\").value = iframe.getAttribute(\"width\")||iframe.style.width.replace(\"px\",\"\")||\"\";\n        $G(\"height\").value = iframe.getAttribute(\"height\") || iframe.style.height.replace(\"px\",\"\") ||\"\";\n        $G(\"scroll\").checked = (iframe.getAttribute(\"scrolling\") == \"yes\") ? true : false;\n        $G(\"frameborder\").checked = (iframe.getAttribute(\"frameborder\") == \"1\") ? true : false;\n        $G(\"align\").value = iframe.align ? iframe.align : \"\";\n    }\n    function queding(){\n        var  url = $G(\"url\").value.replace(/^\\s*|\\s*$/ig,\"\"),\n                width = $G(\"width\").value,\n                height = $G(\"height\").value,\n                scroll = $G(\"scroll\"),\n                frameborder = $G(\"frameborder\"),\n                float = $G(\"align\").value,\n                newIframe = editor.document.createElement(\"iframe\"),\n                div;\n        if(!url){\n            alert(lang.enterAddress);\n            return false;\n        }\n        newIframe.setAttribute(\"src\",/http:\\/\\/|https:\\/\\//ig.test(url) ? url : \"http://\"+url);\n        /^[1-9]+[.]?\\d*$/g.test( width ) ? newIframe.setAttribute(\"width\",width) : \"\";\n        /^[1-9]+[.]?\\d*$/g.test( height ) ? newIframe.setAttribute(\"height\",height) : \"\";\n        scroll.checked ?  newIframe.setAttribute(\"scrolling\",\"yes\") : newIframe.setAttribute(\"scrolling\",\"no\");\n        frameborder.checked ?  newIframe.setAttribute(\"frameborder\",\"1\",0) : newIframe.setAttribute(\"frameborder\",\"0\",0);\n        float ? newIframe.setAttribute(\"align\",float) :  newIframe.setAttribute(\"align\",\"\");\n        if(iframe){\n            iframe.parentNode.insertBefore(newIframe,iframe);\n            domUtils.remove(iframe);\n        }else{\n            div = editor.document.createElement(\"div\");\n            div.appendChild(newIframe);\n            editor.execCommand(\"inserthtml\",div.innerHTML);\n        }\n        editor._iframe = null;\n        dialog.close();\n    }\n    dialog.onok = queding;\n    $G(\"url\").onkeydown = function(evt){\n        evt = evt || event;\n        if(evt.keyCode == 13){\n            queding();\n        }\n    };\n    $focus($G( \"url\" ));\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/internal.js",
    "content": "(function () {\n    var parent = window.parent;\n    //dialog对象\n    dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];\n    //当前打开dialog的编辑器实例\n    editor = dialog.editor;\n\n    UE = parent.UE;\n\n    domUtils = UE.dom.domUtils;\n\n    utils = UE.utils;\n\n    browser = UE.browser;\n\n    ajax = UE.ajax;\n\n    $G = function ( id ) {\n        return document.getElementById( id )\n    };\n    //focus元素\n    $focus = function ( node ) {\n        setTimeout( function () {\n            if ( browser.ie ) {\n                var r = node.createTextRange();\n                r.collapse( false );\n                r.select();\n            } else {\n                node.focus()\n            }\n        }, 0 )\n    };\n    utils.loadFile(document,{\n        href:editor.options.themePath + editor.options.theme + \"/dialogbase.css?cache=\"+Math.random(),\n        tag:\"link\",\n        type:\"text/css\",\n        rel:\"stylesheet\"\n    });\n    lang = editor.getLang(dialog.className.split( \"-\" )[2]);\n    if(lang){\n        domUtils.on(window,'load',function () {\n\n            var langImgPath = editor.options.langPath + editor.options.lang + \"/images/\";\n            //针对静态资源\n            for ( var i in lang[\"static\"] ) {\n                var dom = $G( i );\n                if(!dom) continue;\n                var tagName = dom.tagName,\n                    content = lang[\"static\"][i];\n                if(content.src){\n                    //clone\n                    content = utils.extend({},content,false);\n                    content.src = langImgPath + content.src;\n                }\n                if(content.style){\n                    content = utils.extend({},content,false);\n                    content.style = content.style.replace(/url\\s*\\(/g,\"url(\" + langImgPath)\n                }\n                switch ( tagName.toLowerCase() ) {\n                    case \"var\":\n                        dom.parentNode.replaceChild( document.createTextNode( content ), dom );\n                        break;\n                    case \"select\":\n                        var ops = dom.options;\n                        for ( var j = 0, oj; oj = ops[j]; ) {\n                            oj.innerHTML = content.options[j++];\n                        }\n                        for ( var p in content ) {\n                            p != \"options\" && dom.setAttribute( p, content[p] );\n                        }\n                        break;\n                    default :\n                        domUtils.setAttributes( dom, content);\n                }\n            }\n        } );\n    }\n\n\n})();\n\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/link/link.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n        \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        *{margin:0;padding:0;color: #838383;}\n        table{font-size: 12px;margin: 10px;line-height: 30px}\n        .txt{width:300px;height:21px;line-height:21px;border:1px solid #d7d7d7;}\n    </style>\n</head>\n<body>\n    <table>\n        <tr>\n            <td><label for=\"text\"> <var id=\"lang_input_text\"></var></label></td>\n            <td><input class=\"txt\" id=\"text\" type=\"text\" disabled=\"true\"/></td>\n        </tr>\n        <tr>\n            <td><label for=\"href\"> <var id=\"lang_input_url\"></var></label></td>\n            <td><input class=\"txt\" id=\"href\" type=\"text\" /></td>\n        </tr>\n        <tr>\n            <td><label for=\"title\"> <var id=\"lang_input_title\"></var></label></td>\n            <td><input class=\"txt\" id=\"title\" type=\"text\"/></td>\n        </tr>\n        <tr>\n             <td colspan=\"2\">\n                 <label for=\"target\"><var id=\"lang_input_target\"></var></label>\n                 <input id=\"target\" type=\"checkbox\"/>\n             </td>\n        </tr>\n        <tr>\n            <td colspan=\"2\" id=\"msg\"></td>\n        </tr>\n    </table>\n<script type=\"text/javascript\">\n    var range = editor.selection.getRange(),\n        link = range.collapsed ? editor.queryCommandValue( \"link\" ) : editor.selection.getStart(),\n        url,\n        text = $G('text'),\n        rangeLink = domUtils.findParentByTagName(range.getCommonAncestor(),'a',true),\n        orgText;\n    link = domUtils.findParentByTagName( link, \"a\", true );\n    if(link){\n        url = utils.html(link.getAttribute( '_href' ) || link.getAttribute( 'href', 2 ));\n\n        if(rangeLink === link && !link.getElementsByTagName('img').length){\n            text.removeAttribute('disabled');\n            orgText = text.value = link[browser.ie ? 'innerText':'textContent'];\n        }else{\n            text.setAttribute('disabled','true');\n            text.value = lang.validLink;\n        }\n\n    }else{\n        if(range.collapsed){\n            text.removeAttribute('disabled');\n            text.value = '';\n        }else{\n            text.setAttribute('disabled','true');\n            text.value = lang.validLink;\n        }\n\n    }\n    $G(\"title\").value = url ? link.title : \"\";\n    $G(\"href\").value = url ? url: '';\n    $G(\"target\").checked = url && link.target == \"_blank\" ? true :  false;\n    $focus($G(\"href\"));\n\n    function handleDialogOk(){\n        var href =$G('href').value.replace(/^\\s+|\\s+$/g, '');\n        if(href){\n            if(!hrefStartWith(href,[\"http\",\"/\",\"ftp://\",'#'])) {\n                href  = \"http://\" + href;\n            }\n            var obj = {\n                'href' : href,\n                'target' : $G(\"target\").checked ? \"_blank\" : '_self',\n                'title' : $G(\"title\").value.replace(/^\\s+|\\s+$/g, ''),\n                '_href':href\n            };\n            //修改链接内容的情况太特殊了，所以先做到这里了\n            //todo:情况多的时候，做到command里\n            if(orgText && text.value != orgText){\n                link[browser.ie ? 'innerText' : 'textContent'] =  obj.textValue = text.value;\n                range.selectNode(link).select()\n            }\n            if(range.collapsed){\n                obj.textValue = text.value;\n            }\n            editor.execCommand('link',utils.clearEmptyAttrs(obj) );\n            dialog.close();\n        }\n    }\n    dialog.onok = handleDialogOk;\n    $G('href').onkeydown = $G('title').onkeydown = function(evt){\n        evt = evt || window.event;\n        if (evt.keyCode == 13) {\n            handleDialogOk();\n            return false;\n        }\n    };\n    $G('href').onblur = function(){\n        if(!hrefStartWith(this.value,[\"http\",\"/\",\"ftp://\",'#'])){\n            $G(\"msg\").innerHTML = \"<span style='color: red'>\"+lang.httpPrompt+\"</span>\";\n        }else{\n            $G(\"msg\").innerHTML = \"\";\n        }\n    };\n\n    function hrefStartWith(href,arr){\n        href = href.replace(/^\\s+|\\s+$/g, '');\n        for(var i=0,ai;ai=arr[i++];){\n            if(href.indexOf(ai)==0){\n                return true;\n            }\n        }\n        return false;\n    }\n\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/map/map.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title></title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <script type=\"text/javascript\" src=\"http://api.map.baidu.com/api?v=1.1&services=true\"></script>\n    <style type=\"text/css\">\n        .content{width:530px; height: 350px;margin: 10px auto;}\n        .content table{width: 100%}\n        .content table td{vertical-align: middle;}\n        #city,#address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}\n        #city{width:60px}\n        #address{width:130px}\n        #is_dynamic_label span{vertical-align:middle;margin: 3px 0px 3px 3px;}\n        #is_dynamic_label input{vertical-align:middle;margin: 3px 3px 3px 50px;}\n    </style>\n</head>\n<body>\n<div class=\"content\">\n    <table>\n        <tr>\n            <td><var id=\"lang_city\"></var>:</td>\n            <td><input id=\"city\" type=\"text\" /></td>\n            <td><var id=\"lang_address\"></var>:</td>\n            <td><input id=\"address\" type=\"text\" value=\"\" /></td>\n            <td><a href=\"javascript:doSearch()\" class=\"button\"><var id=\"lang_search\"></var></a></td>\n            <td><label id=\"is_dynamic_label\" for=\"is_dynamic\"><input id=\"is_dynamic\" type=\"checkbox\" name=\"is_dynamic\" /><span><var id=\"lang_dynamicmap\"></var></span></label></td>\n        </tr>\n    </table>\n    <div style=\"width:100%;height:340px;margin:5px auto;border:1px solid gray\" id=\"container\"></div>\n\n</div>\n<script type=\"text/javascript\">\n    var map = new BMap.Map(\"container\"),marker,point,styleStr;\n    map.enableScrollWheelZoom();\n    map.enableContinuousZoom();\n    function doSearch(){\n        if (!document.getElementById('city').value) {\n            alert(lang.cityMsg);\n            return;\n        }\n        var search = new BMap.LocalSearch(document.getElementById('city').value, {\n            onSearchComplete: function (results){\n                if (results && results.getNumPois()) {\n                    var points = [];\n                    for (var i=0; i<results.getCurrentNumPois(); i++) {\n                        points.push(results.getPoi(i).point);\n                    }\n                    if (points.length > 1) {\n                        map.setViewport(points);\n                    } else {\n                        map.centerAndZoom(points[0], 13);\n                    }\n                    point = map.getCenter();\n                    marker.setPoint(point);\n                } else {\n                    alert(lang.errorMsg);\n                }\n            }\n        });\n        search.search(document.getElementById('address').value || document.getElementById('city').value);\n    }\n    //获得参数\n    function getPars(str,par){\n        var reg = new RegExp(par+\"=((\\\\d+|[.,])*)\",\"g\");\n        return reg.exec(str)[1];\n    }\n    function init(){\n        var mapNode = editor.selection.getRange().getClosedNode(),\n            isMapImg = mapNode && /api[.]map[.]baidu[.]com/ig.test(mapNode.getAttribute(\"src\")),\n            isMapIframe = mapNode && domUtils.hasClass(mapNode, 'ueditor_baidumap');\n        if(isMapImg || isMapIframe){\n            var url, centerPos, markerPos;\n            if(isMapIframe) {\n                url = decodeURIComponent(mapNode.getAttribute(\"src\"));\n                $G('is_dynamic').checked = true;\n                styleStr = mapNode.style.cssText;\n            } else {\n                url = mapNode.getAttribute(\"src\");\n                styleStr = mapNode.style.cssText;\n            }\n\n            centerPos = getPars(url,\"center\").split(\",\");\n            markerPos = getPars(url, \"markers\").split(\",\");\n            point = new BMap.Point(Number(centerPos[0]),Number(centerPos[1]));\n            marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1])));\n            map.addControl(new BMap.NavigationControl());\n            map.centerAndZoom(point, Number(getPars(url,\"zoom\")));\n        }else{\n            point = new BMap.Point(116.404, 39.915);    // 创建点坐标\n            marker = new BMap.Marker(point);\n            map.addControl(new BMap.NavigationControl());\n            map.centerAndZoom(point, 10);                     // 初始化地图,设置中心点坐标和地图级别。\n        }\n        marker.enableDragging();\n        map.addOverlay(marker);\n    }\n    init();\n    document.getElementById('address').onkeydown = function (evt){\n        evt = evt || event;\n        if (evt.keyCode == 13) {\n            doSearch();\n        }\n    };\n    dialog.onok = function (){\n        var center = map.getCenter();\n        var zoom = map.zoomLevel;\n        var size = map.getSize();\n        var mapWidth = size.width;\n        var mapHeight = size.height;\n        var point = marker.getPoint();\n\n        if($G('is_dynamic').checked) {\n            var URL = editor.options.UEDITOR_HOME_URL,\n                url = [URL + (/\\/$/.test(URL) ? '':'/') + \"dialogs/map/show.html\" +\n                    '#center=' + center.lng + ',' + center.lat,\n                    '&zoom=' + zoom,\n                    '&width=' + mapWidth,\n                    '&height=' + mapHeight,\n                    '&markers=' + point.lng + ',' + point.lat,\n                    '&markerStyles=' + 'l,A'].join('');\n            editor.execCommand('inserthtml', '<iframe class=\"ueditor_baidumap\" src=\"' + url + '\"' + (styleStr ? ' style=\"' + styleStr + '\"' :'') + ' frameborder=\"0\" width=\"' + (mapWidth+4) + '\" height=\"' + (mapHeight+4) + '\"></iframe>');\n        } else {\n            var url = \"http://api.map.baidu.com/staticimage?center=\" + center.lng + ',' + center.lat +\n                    \"&zoom=\" + zoom + \"&width=\" + size.width + '&height=' + size.height + \"&markers=\" + point.lng + ',' + point.lat;\n            editor.execCommand('inserthtml', '<img width=\"'+ size.width +'\"height=\"'+ size.height +'\" src=\"' + url + '\"' + (styleStr ? ' style=\"' + styleStr + '\"' :'') + '/>');\n        }\n    };\n    document.getElementById(\"address\").focus();\n</script>\n\n\n</body>\n</html>\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/map/show.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n        \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <meta charset=\"utf-8\"/>\n    <meta name=\"keywords\" content=\"百度地图,百度地图API，百度地图自定义工具，百度地图所见即所得工具\"/>\n    <meta name=\"description\" content=\"百度地图API自定义地图，帮助用户在可视化操作下生成百度地图\"/>\n    <title>百度地图API自定义地图</title>\n    <!--引用百度地图API-->\n    <style type=\"text/css\">\n        html, body {\n            margin: 0;\n            padding: 0;\n            overflow: hidden;\n        }\n    </style>\n    <script type=\"text/javascript\" src=\"http://api.map.baidu.com/api?key=&v=1.1&services=true\"></script>\n</head>\n\n<body onload=\"initMap();\">\n<!--百度地图容器-->\n<div style=\"width:697px;height:550px;border:#ccc solid 1px;\" id=\"dituContent\"></div>\n</body>\n<script type=\"text/javascript\">\n    function getParam(name) {\n        return location.href.match(new RegExp('[?#&]' + name + '=([^?#&]+)', 'i')) ? RegExp.$1 : '';\n    }\n    var map, marker;\n    var centerParam = getParam('center');\n    var zoomParam = getParam('zoom');\n    var widthParam = getParam('width');\n    var heightParam = getParam('height');\n    var markersParam = getParam('markers');\n    var markerStylesParam = getParam('markerStyles');\n\n    //创建和初始化地图函数：\n    function initMap() {\n        // [FF]切换模式后报错\n        if (!window.BMap) {\n            return;\n        }\n        var dituContent = document.getElementById('dituContent');\n        dituContent.style.width = widthParam + 'px';\n        dituContent.style.height = heightParam + 'px';\n\n        createMap();//创建地图\n        setMapEvent();//设置地图事件\n        addMapControl();//向地图添加控件\n\n        // 创建标注\n        var markersArr = markersParam.split(',');\n        var point = new BMap.Point(markersArr[0], markersArr[1]);\n        marker = new BMap.Marker(point);\n        marker.enableDragging();\n        map.addOverlay(marker); // 将标注添加到地图中\n\n        if(parent.editor && parent.document.body.contentEditable==\"true\") { //在编辑状态下\n            setMapListener();//地图改变修改外层的iframe标签src属性\n        }\n    }\n\n    //创建地图函数：\n    function createMap() {\n        map = new BMap.Map(\"dituContent\");//在百度地图容器中创建一个地图\n        var centerArr = centerParam.split(',');\n        var point = new BMap.Point(parseFloat(centerArr[0]), parseFloat(centerArr[1]));//定义一个中心点坐标\n        map.centerAndZoom(point, parseInt(zoomParam));//设定地图的中心点和坐标并将地图显示在地图容器中\n    }\n\n    //地图事件设置函数：\n    function setMapEvent() {\n        map.enableDragging();//启用地图拖拽事件，默认启用(可不写)\n        map.enableScrollWheelZoom();//启用地图滚轮放大缩小\n        map.enableDoubleClickZoom();//启用鼠标双击放大，默认启用(可不写)\n        map.enableKeyboard();//启用键盘上下左右键移动地图\n    }\n\n    //地图控件添加函数：\n    function addMapControl() {\n        //向地图中添加缩放控件\n        var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE});\n        map.addControl(ctrl_nav);\n        //向地图中添加缩略图控件\n        var ctrl_ove = new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1});\n        map.addControl(ctrl_ove);\n        //向地图中添加比例尺控件\n        var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});\n        map.addControl(ctrl_sca);\n    }\n\n    function setMapListener() {\n        var editor = parent.editor, containerIframe,\n            iframes = parent.document.getElementsByTagName('iframe');\n        for (var key in iframes) {\n            if (iframes[key].contentWindow == window) {\n                containerIframe = iframes[key];\n                break;\n            }\n        }\n        if (containerIframe) {\n            map.addEventListener('moveend', mapListenerHandler);\n            map.addEventListener('zoomend', mapListenerHandler);\n            marker.addEventListener('dragend', mapListenerHandler);\n        }\n\n        function mapListenerHandler() {\n            var zoom = map.getZoom(),\n                center = map.getCenter(),\n                marker = window.marker.getPoint();\n            containerIframe.src = containerIframe.src.\n                replace(new RegExp('([?#&])center=([^?#&]+)', 'i'), '$1center=' + center.lng + ',' + center.lat).\n                replace(new RegExp('([?#&])markers=([^?#&]+)', 'i'), '$1markers=' + marker.lng + ',' + marker.lat).\n                replace(new RegExp('([?#&])zoom=([^?#&]+)', 'i'), '$1zoom=' + zoom);\n            editor.fireEvent('saveScene');\n        }\n    }\n</script>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/music/music.css",
    "content": ".wrapper{margin: 5px 10px;}\n\n.searchBar{height:30px;padding:7px 0 3px;text-align:center;}\n.searchBtn{font-size:13px;height:24px;}\n\n.resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;}\n\n.listPanel{overflow: hidden;}\n.panelon{display:block;}\n.paneloff{display:none}\n\n.page{width:220px;margin:20px auto;overflow: hidden;}\n.pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center}\n.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff;\n   border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;}\n\n.m-box{width:460px;}\n.m-m{float: left;line-height: 20px;height: 20px;}\n.m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;}\n.m-l{float:left;width:40px; }\n.m-t{float:left;width:140px;}\n.m-s{float:left;width:110px;}\n.m-z{float:left;width:100px;}\n.m-try-t{float: left;width: 60px;;}\n\n.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;}\n.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;}\n\n.loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat}\n.empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;}"
  },
  {
    "path": "static/common/user/uedit/dialogs/music/music.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>插入音乐</title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"music.css\">\n</head>\n<body>\n<div class=\"wrapper\">\n    <div class=\"searchBar\">\n        <input id=\"J_searchName\" type=\"text\"/>\n        <input type=\"button\" class=\"searchBtn\" id=\"J_searchBtn\">\n    </div>\n    <div class=\"resultBar\" id=\"J_resultBar\">\n        <div class=\"loading\" style=\"display:none\"></div>\n        <div class=\"empty\"><var id=\"lang_input_tips\"></var></div>\n    </div>\n    <div id=\"J_preview\"></div>\n</div>\n<script type=\"text/javascript\" src=\"music.js\"></script>\n<script type=\"text/javascript\">\n    var music = new Music;\n    dialog.onok = function () {\n        music.exec();\n    };\n    dialog.oncancel = function () {\n        $G('J_preview').innerHTML = \"\";\n    };\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/music/music.js",
    "content": "function Music() {\n    this.init();\n}\n(function () {\n    var pages = [],\n        panels = [],\n        selectedItem = null;\n    Music.prototype = {\n        total:70,\n        pageSize:10,\n        dataUrl:\"http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common\",\n        playerUrl:\"http://box.baidu.com/widget/flash/bdspacesong.swf\",\n\n        init:function () {\n            var me = this;\n            domUtils.on($G(\"J_searchName\"), \"keyup\", function (event) {\n                var e = window.event || event;\n                if (e.keyCode == 13) {\n                    me.dosearch();\n                }\n            });\n            domUtils.on($G(\"J_searchBtn\"), \"click\", function () {\n                me.dosearch();\n            });\n        },\n        callback:function (data) {\n            var me = this;\n            me.data = data.song_list;\n            setTimeout(function () {\n                $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list);\n            }, 300);\n        },\n        dosearch:function () {\n            var me = this;\n            selectedItem = null;\n            var key = $G('J_searchName').value;\n            if (utils.trim(key) == \"\")return false;\n            key = encodeURIComponent(key);\n            me._sent(key);\n        },\n        doselect:function (i) {\n            var me = this;\n            if (typeof i == 'object') {\n                selectedItem = i;\n            } else if (typeof i == 'number') {\n                selectedItem = me.data[i];\n            }\n        },\n        onpageclick:function (id) {\n            var me = this;\n            for (var i = 0; i < pages.length; i++) {\n                $G(pages[i]).className = 'pageoff';\n                $G(panels[i]).className = 'paneloff';\n            }\n            $G('page' + id).className = 'pageon';\n            $G('panel' + id).className = 'panelon';\n        },\n        listenTest:function (elem) {\n            var me = this,\n                view = $G('J_preview'),\n                is_play_action = (elem.className == 'm-try'),\n                old_trying = me._getTryingElem();\n\n            if (old_trying) {\n                old_trying.className = 'm-try';\n                view.innerHTML = '';\n            }\n            if (is_play_action) {\n                elem.className = 'm-trying';\n                view.innerHTML = me._buildMusicHtml(me._getUrl(true));\n            }\n        },\n        _sent:function (param) {\n            var me = this;\n            $G('J_resultBar').innerHTML = '<div class=\"loading\"></div>';\n\n            utils.loadFile(document, {\n                src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(),\n                tag:\"script\",\n                type:\"text/javascript\",\n                defer:\"defer\"\n            });\n        },\n        _removeHtml:function (str) {\n            var reg = /<\\s*\\/?\\s*[^>]*\\s*>/gi;\n            return str.replace(reg, \"\");\n        },\n        _getUrl:function (isTryListen) {\n            var me = this;\n            var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist='\n                + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra='\n                + encodeURIComponent(me._removeHtml(selectedItem.album_title))\n                + '&autoPlay='+isTryListen+'' + '&loop=true';\n            return  me.playerUrl + \"?\" + param;\n        },\n        _getTryingElem:function () {\n            var s = $G('J_listPanel').getElementsByTagName('span');\n\n            for (var i = 0; i < s.length; i++) {\n                if (s[i].className == 'm-trying')\n                    return s[i];\n            }\n            return null;\n        },\n        _buildMusicHtml:function (playerUrl) {\n            var html = '<embed class=\"BDE_try_Music\" allowfullscreen=\"false\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"';\n            html += ' src=\"' + playerUrl + '\"';\n            html += ' width=\"1\" height=\"1\" style=\"position:absolute;left:-2000px;\"';\n            html += ' type=\"application/x-shockwave-flash\" wmode=\"transparent\" play=\"true\" loop=\"false\"';\n            html += ' menu=\"false\" allowscriptaccess=\"never\" scale=\"noborder\">';\n            return html;\n        },\n        _byteLength:function (str) {\n            return str.replace(/[^\\u0000-\\u007f]/g, \"\\u0061\\u0061\").length;\n        },\n        _getMaxText:function (s) {\n            var me = this;\n            s = me._removeHtml(s);\n            if (me._byteLength(s) > 12)\n                return s.substring(0, 5) + '...';\n            if (!s) s = \"&nbsp;\";\n            return s;\n        },\n        _rebuildData:function (data) {\n            var me = this,\n                newData = [],\n                d = me.pageSize,\n                itembox;\n            for (var i = 0; i < data.length; i++) {\n                if ((i + d) % d == 0) {\n                    itembox = [];\n                    newData.push(itembox)\n                }\n                itembox.push(data[i]);\n            }\n            return newData;\n        },\n        _renderTemplate:function (data) {\n            var me = this;\n            if (data.length == 0)return '<div class=\"empty\">' + lang.emptyTxt + '</div>';\n            data = me._rebuildData(data);\n            var s = [], p = [], t = [];\n            s.push('<div id=\"J_listPanel\" class=\"listPanel\">');\n            p.push('<div class=\"page\">');\n            for (var i = 0, tmpList; tmpList = data[i++];) {\n                panels.push('panel' + i);\n                pages.push('page' + i);\n                if (i == 1) {\n                    s.push('<div id=\"panel' + i + '\" class=\"panelon\">');\n                    if (data.length != 1) {\n                        t.push('<div id=\"page' + i + '\" onclick=\"music.onpageclick(' + i + ')\" class=\"pageon\">' + (i ) + '</div>');\n                    }\n                } else {\n                    s.push('<div id=\"panel' + i + '\" class=\"paneloff\">');\n                    t.push('<div id=\"page' + i + '\" onclick=\"music.onpageclick(' + i + ')\" class=\"pageoff\">' + (i ) + '</div>');\n                }\n                s.push('<div class=\"m-box\">');\n                s.push('<div class=\"m-h\"><span class=\"m-t\">' + lang.chapter + '</span><span class=\"m-s\">' + lang.singer\n                    + '</span><span class=\"m-z\">' + lang.special + '</span><span class=\"m-try-t\">' + lang.listenTest + '</span></div>');\n                for (var j = 0, tmpObj; tmpObj = tmpList[j++];) {\n                    s.push('<label for=\"radio-' + i + '-' + j + '\" class=\"m-m\">');\n                    s.push('<input type=\"radio\" id=\"radio-' + i + '-' + j + '\" name=\"musicId\" class=\"m-l\" onclick=\"music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ')\"/>');\n                    s.push('<span class=\"m-t\">' + me._getMaxText(tmpObj.title) + '</span>');\n                    s.push('<span class=\"m-s\">' + me._getMaxText(tmpObj.author) + '</span>');\n                    s.push('<span class=\"m-z\">' + me._getMaxText(tmpObj.album_title) + '</span>');\n                    s.push('<span class=\"m-try\" onclick=\"music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ');music.listenTest(this)\"></span>');\n                    s.push('</label>');\n                }\n                s.push('</div>');\n                s.push('</div>');\n            }\n            t.reverse();\n            p.push(t.join(''));\n            s.push('</div>');\n            p.push('</div>');\n            return s.join('') + p.join('');\n        },\n        exec:function () {\n            var me = this;\n            if (selectedItem == null)   return;\n            $G('J_preview').innerHTML = \"\";\n            editor.execCommand('music', {\n                url:me._getUrl(false),\n                width:400,\n                height:95\n            });\n        }\n    };\n})();\n\n\n\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/preview/preview.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n    \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n        <style>\n            html,body{\n                height:100%;\n                width:100%;\n                padding:0;\n                margin:0;\n            }\n            #preview{\n                width:100%;\n                height:100%;\n                padding:0;\n                margin:0;\n            }\n            #preview *{font-family:sans-serif;font-size:16px;}\n        </style>\n        <script type=\"text/javascript\" src=\"../internal.js\"></script>\n        <script src=\"../../ueditor.parse.js\"></script>\n        <title></title>\n    </head>\n    <body class=\"view\">\n        <div id=\"preview\" style=\"margin:8px\">\n\n        </div>\n    </body>\n    <script>\n        document.getElementById('preview').innerHTML = editor.getContent();\n        uParse('#preview',{\n            rootPath : '../../',\n            chartContainerHeight:500\n        })\n        dialog.oncancel = function(){\n            document.getElementById('preview').innerHTML = '';\n        }\n    </script>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/scrawl/scrawl.css",
    "content": "/*common\n*/\nbody{margin: 0;}\ntable{width:100%;}\ntable td{padding:2px 4px;vertical-align: middle;}\na{text-decoration: none;}\nem{font-style: normal;}\n.border_style1{border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;}\n/*module\n*/\n.main{margin: 8px;overflow: hidden;}\n\n.hot{float:left;height:335px;}\n.drawBoard{position: relative; cursor: crosshair;}\n.brushBorad{position: absolute;left:0;top:0;z-index: 998;}\n.picBoard{border: none;text-align: center;line-height: 300px;cursor: default;}\n.operateBar{margin-top:10px;font-size:12px;text-align: center;}\n.operateBar span{margin-left: 10px;}\n\n.drawToolbar{float:right;width:110px;height:300px;overflow: hidden;}\n.colorBar{margin-top:10px;font-size: 12px;text-align: center;}\n.colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3}\n.sectionBar{margin-top:15px;font-size: 12px;text-align: center;}\n.sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3}\n.size1{background: url('images/size.png') 1px center no-repeat ;}\n.size2{background: url('images/size.png') -10px center no-repeat;}\n.size3{background: url('images/size.png') -22px center no-repeat;}\n.size4{background: url('images/size.png') -35px center no-repeat;}\n\n.addImgH{position: relative;}\n.addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;}\n.addImgH_form input{width: 100%;}\n/*scrawl遮罩层\n*/\n.maskLayerNull{display: none;}\n.maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7;\n    background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;}\n/*btn state\n*/\n.previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;}\n.previousStepH .text{color:#888;cursor:pointer;}\n.previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;}\n.previousStep .text{color:#ccc;cursor:default;}\n\n.nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;}\n.nextStepH .text{color:#888;cursor:pointer;}\n.nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;}\n.nextStep .text{color:#ccc;cursor:default;}\n\n.clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;}\n.clearBoardH .text{color:#888;cursor:pointer;}\n.clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;}\n.clearBoard .text{color:#ccc;cursor:default;}\n\n.scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;}\n.scaleBoardH .text{color:#888;cursor:pointer;}\n.scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;}\n.scaleBoard .text{color:#ccc;cursor:default;}\n\n.removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;}\n.removeImgH .text{color:#888;cursor:pointer;}\n.removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;}\n.removeImg .text{color:#ccc;cursor:default;}\n\n.addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')}\n.addImgH .text{color:#888;cursor:pointer;}\n/*icon\n*/\n.brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')}\n.eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')}\n\n\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/scrawl/scrawl.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <meta name=\"robots\" content=\"noindex, nofollow\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"scrawl.css\">\n</head>\n<body>\n<div class=\"main\" id=\"J_wrap\">\n    <div class=\"hot\">\n        <div class=\"drawBoard border_style1\">\n            <canvas id=\"J_brushBoard\" class=\"brushBorad\" width=\"360\" height=\"300\"></canvas>\n            <div id=\"J_picBoard\" class=\"picBoard\" style=\"width: 360px;height: 300px\"></div>\n        </div>\n        <div id=\"J_operateBar\" class=\"operateBar\">\n            <span id=\"J_previousStep\" class=\"previousStep\">\n                <em class=\"icon\"></em>\n                <em class=\"text\"><var id=\"lang_input_previousStep\"></var></em>\n            </span>\n            <span id=\"J_nextStep\" class=\"nextStep\">\n                <em class=\"icon\"></em>\n                <em class=\"text\"><var id=\"lang_input_nextsStep\"></var></em>\n            </span>\n            <span id=\"J_clearBoard\" class=\"clearBoard\">\n                <em class=\"icon\"></em>\n                <em class=\"text\"><var id=\"lang_input_clear\"></var></em>\n            </span>\n            <span id=\"J_sacleBoard\" class=\"scaleBoard\">\n                <em class=\"icon\"></em>\n                <em class=\"text\"><var id=\"lang_input_ScalePic\"></var></em>\n            </span>\n        </div>\n    </div>\n    <div class=\"drawToolbar border_style1\">\n        <div id=\"J_colorBar\" class=\"colorBar\"></div>\n        <div id=\"J_brushBar\" class=\"sectionBar\">\n            <em class=\"brushIcon\"></em>\n            <a href=\"javascript:void(0)\" class=\"size1\">1</a>\n            <a href=\"javascript:void(0)\" class=\"size2\">3</a>\n            <a href=\"javascript:void(0)\" class=\"size3\">5</a>\n            <a href=\"javascript:void(0)\" class=\"size4\">7</a>\n        </div>\n        <div id=\"J_eraserBar\" class=\"sectionBar\">\n            <em class=\"eraserIcon\"></em>\n            <a href=\"javascript:void(0)\" class=\"size1\">1</a>\n            <a href=\"javascript:void(0)\" class=\"size2\">3</a>\n            <a href=\"javascript:void(0)\" class=\"size3\">5</a>\n            <a href=\"javascript:void(0)\" class=\"size4\">7</a>\n        </div>\n        <div class=\"sectionBar\">\n            <div id=\"J_addImg\" class=\"addImgH\">\n                <em class=\"icon\"></em>\n                <em class=\"text\"><var id=\"lang_input_addPic\"></var></em>\n                <form method=\"post\" id=\"fileForm\" enctype=\"multipart/form-data\" class=\"addImgH_form\" target=\"up\">\n                    <input type=\"file\" name=\"upfile\" id=\"J_imgTxt\"\n                           accept=\"image/gif,image/jpeg,image/png,image/jpg,image/bmp\"/>\n                </form>\n                <iframe name=\"up\" style=\"display: none\"></iframe>\n            </div>\n        </div>\n        <div class=\"sectionBar\">\n            <span id=\"J_removeImg\" class=\"removeImg\">\n                <em class=\"icon\"></em>\n                <em class=\"text\"><var id=\"lang_input_removePic\"></var></em>\n            </span>\n        </div>\n    </div>\n</div>\n<div id=\"J_maskLayer\" class=\"maskLayerNull\"></div>\n\n<script type=\"text/javascript\" src=\"scrawl.js\"></script>\n<script type=\"text/javascript\">\n    var settings = {\n        drawBrushSize:3, //画笔初始大小\n        drawBrushColor:\"#4bacc6\", //画笔初始颜色\n        colorList:['c00000', 'ff0000', 'ffc000', 'ffff00', '92d050', '00b050', '00b0f0', '0070c0', '002060', '7030a0', 'ffffff',\n            '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646'], //画笔选择颜色\n        saveNum:10  //撤销次数\n    };\n\n    var scrawlObj = new scrawl( settings );\n    scrawlObj.isCancelScrawl = false;\n\n    dialog.onok = function () {\n        exec( scrawlObj );\n        return false;\n    };\n    dialog.oncancel = function () {\n        scrawlObj.isCancelScrawl = true;\n    };\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/scrawl/scrawl.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: xuheng\n * Date: 12-5-22\n * Time: 上午11:38\n * To change this template use File | Settings | File Templates.\n */\nvar scrawl = function (options) {\n    options && this.initOptions(options);\n};\n(function () {\n    var canvas = $G(\"J_brushBoard\"),\n        context = canvas.getContext('2d'),\n        drawStep = [], //undo redo存储\n        drawStepIndex = 0; //undo redo指针\n\n    scrawl.prototype = {\n        isScrawl:false, //是否涂鸦\n        brushWidth:-1, //画笔粗细\n        brushColor:\"\", //画笔颜色\n\n        initOptions:function (options) {\n            var me = this;\n            me.originalState(options);//初始页面状态\n            me._buildToolbarColor(options.colorList);//动态生成颜色选择集合\n\n            me._addBoardListener(options.saveNum);//添加画板处理\n            me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理\n            me._addColorBarListener();//添加颜色选择处理\n            me._addBrushBarListener();//添加画笔大小处理\n            me._addEraserBarListener();//添加橡皮大小处理\n            me._addAddImgListener();//添加增添背景图片处理\n            me._addRemoveImgListenter();//删除背景图片处理\n            me._addScalePicListenter();//添加缩放处理\n            me._addClearSelectionListenter();//添加清楚选中状态处理\n\n            me._originalColorSelect(options.drawBrushColor);//初始化颜色选中\n            me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中\n            me._clearSelection();//清楚选中状态\n        },\n\n        originalState:function (options) {\n            var me = this;\n\n            me.brushWidth = options.drawBrushSize;//同步画笔粗细\n            me.brushColor = options.drawBrushColor;//同步画笔颜色\n\n            context.lineWidth = me.brushWidth;//初始画笔大小\n            context.strokeStyle = me.brushColor;//初始画笔颜色\n            context.fillStyle = \"transparent\";//初始画布背景颜色\n            context.lineCap = \"round\";//去除锯齿\n            context.fill();\n        },\n        _buildToolbarColor:function (colorList) {\n            var tmp = null, arr = [];\n            arr.push(\"<table id='J_colorList'>\");\n            for (var i = 0, color; color = colorList[i++];) {\n                if ((i - 1) % 5 == 0) {\n                    if (i != 1) {\n                        arr.push(\"</tr>\");\n                    }\n                    arr.push(\"<tr>\");\n                }\n                tmp = '#' + color;\n                arr.push(\"<td><a title='\" + tmp + \"' href='javascript:void(0)' style='background-color:\" + tmp + \"'></a></td>\");\n            }\n            arr.push(\"</tr></table>\");\n            $G(\"J_colorBar\").innerHTML = arr.join(\"\");\n        },\n\n        _addBoardListener:function (saveNum) {\n            var me = this,\n                margin = 0,\n                startX = -1,\n                startY = -1,\n                isMouseDown = false,\n                isMouseMove = false,\n                isMouseUp = false,\n                buttonPress = 0, button, flag = '';\n\n            margin = parseInt(domUtils.getComputedStyle($G(\"J_wrap\"), \"margin-left\"));\n            drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));\n            drawStepIndex += 1;\n\n            domUtils.on(canvas, [\"mousedown\", \"mousemove\", \"mouseup\", \"mouseout\"], function (e) {\n                button = browser.webkit ? e.which : buttonPress;\n                switch (e.type) {\n                    case 'mousedown':\n                        buttonPress = 1;\n                        flag = 1;\n                        isMouseDown = true;\n                        isMouseUp = false;\n                        isMouseMove = false;\n                        me.isScrawl = true;\n                        startX = e.clientX - margin;//10为外边距总和\n                        startY = e.clientY - margin;\n                        context.beginPath();\n                        break;\n                    case 'mousemove' :\n                        if (!flag && button == 0) {\n                            return;\n                        }\n                        if (!flag && button) {\n                            startX = e.clientX - margin;//10为外边距总和\n                            startY = e.clientY - margin;\n                            context.beginPath();\n                            flag = 1;\n                        }\n                        if (isMouseUp || !isMouseDown) {\n                            return;\n                        }\n                        var endX = e.clientX - margin,\n                            endY = e.clientY - margin;\n\n                        context.moveTo(startX, startY);\n                        context.lineTo(endX, endY);\n                        context.stroke();\n                        startX = endX;\n                        startY = endY;\n                        isMouseMove = true;\n                        break;\n                    case 'mouseup':\n                        buttonPress = 0;\n                        if (!isMouseDown)return;\n                        if (!isMouseMove) {\n                            context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false);\n                            context.fillStyle = context.strokeStyle;\n                            context.fill();\n                        }\n                        context.closePath();\n                        me._saveOPerate(saveNum);\n                        isMouseDown = false;\n                        isMouseMove = false;\n                        isMouseUp = true;\n                        startX = -1;\n                        startY = -1;\n                        break;\n                    case 'mouseout':\n                        flag = '';\n                        buttonPress = 0;\n                        if (button == 1) return;\n                        context.closePath();\n                        break;\n                }\n            });\n        },\n        _addOPerateListener:function (saveNum) {\n            var me = this;\n            domUtils.on($G(\"J_previousStep\"), \"click\", function () {\n                if (drawStepIndex > 1) {\n                    drawStepIndex -= 1;\n                    context.clearRect(0, 0, context.canvas.width, context.canvas.height);\n                    context.putImageData(drawStep[drawStepIndex - 1], 0, 0);\n                    me.btn2Highlight(\"J_nextStep\");\n                    drawStepIndex == 1 && me.btn2disable(\"J_previousStep\");\n                }\n            });\n            domUtils.on($G(\"J_nextStep\"), \"click\", function () {\n                if (drawStepIndex > 0 && drawStepIndex < drawStep.length) {\n                    context.clearRect(0, 0, context.canvas.width, context.canvas.height);\n                    context.putImageData(drawStep[drawStepIndex], 0, 0);\n                    drawStepIndex += 1;\n                    me.btn2Highlight(\"J_previousStep\");\n                    drawStepIndex == drawStep.length && me.btn2disable(\"J_nextStep\");\n                }\n            });\n            domUtils.on($G(\"J_clearBoard\"), \"click\", function () {\n                context.clearRect(0, 0, context.canvas.width, context.canvas.height);\n                drawStep = [];\n                me._saveOPerate(saveNum);\n                drawStepIndex = 1;\n                me.isScrawl = false;\n                me.btn2disable(\"J_previousStep\");\n                me.btn2disable(\"J_nextStep\");\n                me.btn2disable(\"J_clearBoard\");\n            });\n        },\n        _addColorBarListener:function () {\n            var me = this;\n            domUtils.on($G(\"J_colorBar\"), \"click\", function (e) {\n                var target = me.getTarget(e),\n                    color = target.title;\n                if (!!color) {\n                    me._addColorSelect(target);\n\n                    me.brushColor = color;\n                    context.globalCompositeOperation = \"source-over\";\n                    context.lineWidth = me.brushWidth;\n                    context.strokeStyle = color;\n                }\n            });\n        },\n        _addBrushBarListener:function () {\n            var me = this;\n            domUtils.on($G(\"J_brushBar\"), \"click\", function (e) {\n                var target = me.getTarget(e),\n                    size = browser.ie ? target.innerText : target.text;\n                if (!!size) {\n                    me._addBESelect(target);\n\n                    context.globalCompositeOperation = \"source-over\";\n                    context.lineWidth = parseInt(size);\n                    context.strokeStyle = me.brushColor;\n                    me.brushWidth = context.lineWidth;\n                }\n            });\n        },\n        _addEraserBarListener:function () {\n            var me = this;\n            domUtils.on($G(\"J_eraserBar\"), \"click\", function (e) {\n                var target = me.getTarget(e),\n                    size = browser.ie ? target.innerText : target.text;\n                if (!!size) {\n                    me._addBESelect(target);\n\n                    context.lineWidth = parseInt(size);\n                    context.globalCompositeOperation = \"destination-out\";\n                    context.strokeStyle = \"#FFF\";\n                }\n            });\n        },\n        _addAddImgListener:function () {\n            var file = $G(\"J_imgTxt\");\n            if (!window.FileReader) {\n                $G(\"J_addImg\").style.display = 'none';\n                $G(\"J_removeImg\").style.display = 'none';\n                $G(\"J_sacleBoard\").style.display = 'none';\n            }\n            domUtils.on(file, \"change\", function (e) {\n                var frm = file.parentNode;\n                addMaskLayer(lang.backgroundUploading);\n\n                var target = e.target || e.srcElement,\n                    reader = new FileReader();\n                reader.onload = function(evt){\n                    var target = evt.target || evt.srcElement;\n                    ue_callback(target.result, 'SUCCESS');\n                };\n                reader.readAsDataURL(target.files[0]);\n                frm.reset();\n            });\n        },\n        _addRemoveImgListenter:function () {\n            var me = this;\n            domUtils.on($G(\"J_removeImg\"), \"click\", function () {\n                $G(\"J_picBoard\").innerHTML = \"\";\n                me.btn2disable(\"J_removeImg\");\n                me.btn2disable(\"J_sacleBoard\");\n            });\n        },\n        _addScalePicListenter:function () {\n            domUtils.on($G(\"J_sacleBoard\"), \"click\", function () {\n                var picBoard = $G(\"J_picBoard\"),\n                    scaleCon = $G(\"J_scaleCon\"),\n                    img = picBoard.children[0];\n\n                if (img) {\n                    if (!scaleCon) {\n                        picBoard.style.cssText = \"position:relative;z-index:999;\"+picBoard.style.cssText;\n                        img.style.cssText = \"position: absolute;top:\" + (canvas.height - img.height) / 2 + \"px;left:\" + (canvas.width - img.width) / 2 + \"px;\";\n                        var scale = new ScaleBoy();\n                        picBoard.appendChild(scale.init());\n                        scale.startScale(img);\n                    } else {\n                        if (scaleCon.style.visibility == \"visible\") {\n                            scaleCon.style.visibility = \"hidden\";\n                            picBoard.style.position = \"\";\n                            picBoard.style.zIndex = \"\";\n                        } else {\n                            scaleCon.style.visibility = \"visible\";\n                            picBoard.style.cssText += \"position:relative;z-index:999\";\n                        }\n                    }\n                }\n            });\n        },\n        _addClearSelectionListenter:function () {\n            var doc = document;\n            domUtils.on(doc, 'mousemove', function (e) {\n                if (browser.ie && browser.version < 11)\n                    doc.selection.clear();\n                else\n                    window.getSelection().removeAllRanges();\n            });\n        },\n        _clearSelection:function () {\n            var list = [\"J_operateBar\", \"J_colorBar\", \"J_brushBar\", \"J_eraserBar\", \"J_picBoard\"];\n            for (var i = 0, group; group = list[i++];) {\n                domUtils.unSelectable($G(group));\n            }\n        },\n\n        _saveOPerate:function (saveNum) {\n            var me = this;\n            if (drawStep.length <= saveNum) {\n                if(drawStepIndex<drawStep.length){\n                    me.btn2disable(\"J_nextStep\");\n                    drawStep.splice(drawStepIndex);\n                }\n                drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));\n                drawStepIndex = drawStep.length;\n            } else {\n                drawStep.shift();\n                drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height));\n                drawStepIndex = drawStep.length;\n            }\n            me.btn2Highlight(\"J_previousStep\");\n            me.btn2Highlight(\"J_clearBoard\");\n        },\n\n        _originalColorSelect:function (title) {\n            var colorList = $G(\"J_colorList\").getElementsByTagName(\"td\");\n            for (var j = 0, cell; cell = colorList[j++];) {\n                if (cell.children[0].title.toLowerCase() == title) {\n                    cell.children[0].style.opacity = 1;\n                }\n            }\n        },\n        _originalBrushSelect:function (text) {\n            var brushList = $G(\"J_brushBar\").children;\n            for (var i = 0, ele; ele = brushList[i++];) {\n                if (ele.tagName.toLowerCase() == \"a\") {\n                    var size = browser.ie ? ele.innerText : ele.text;\n                    if (size.toLowerCase() == text) {\n                        ele.style.opacity = 1;\n                    }\n                }\n            }\n        },\n        _addColorSelect:function (target) {\n            var me = this,\n                colorList = $G(\"J_colorList\").getElementsByTagName(\"td\"),\n                eraserList = $G(\"J_eraserBar\").children,\n                brushList = $G(\"J_brushBar\").children;\n\n            for (var i = 0, cell; cell = colorList[i++];) {\n                cell.children[0].style.opacity = 0.3;\n            }\n            for (var k = 0, ele; ele = brushList[k++];) {\n                if (ele.tagName.toLowerCase() == \"a\") {\n                    ele.style.opacity = 0.3;\n                    var size = browser.ie ? ele.innerText : ele.text;\n                    if (size.toLowerCase() == this.brushWidth) {\n                        ele.style.opacity = 1;\n                    }\n                }\n            }\n            for (var j = 0, node; node = eraserList[j++];) {\n                if (node.tagName.toLowerCase() == \"a\") {\n                    node.style.opacity = 0.3;\n                }\n            }\n\n            target.style.opacity = 1;\n            target.blur();\n        },\n        _addBESelect:function (target) {\n            var brushList = $G(\"J_brushBar\").children;\n            var eraserList = $G(\"J_eraserBar\").children;\n\n            for (var i = 0, ele; ele = brushList[i++];) {\n                if (ele.tagName.toLowerCase() == \"a\") {\n                    ele.style.opacity = 0.3;\n                }\n            }\n            for (var j = 0, node; node = eraserList[j++];) {\n                if (node.tagName.toLowerCase() == \"a\") {\n                    node.style.opacity = 0.3;\n                }\n            }\n\n            target.style.opacity = 1;\n            target.blur();\n        },\n        getCanvasData:function () {\n            var picContainer = $G(\"J_picBoard\"),\n                img = picContainer.children[0];\n            if (img) {\n                var x, y;\n                if (img.style.position == \"absolute\") {\n                    x = parseInt(img.style.left);\n                    y = parseInt(img.style.top);\n                } else {\n                    x = (picContainer.offsetWidth - img.width) / 2;\n                    y = (picContainer.offsetHeight - img.height) / 2;\n                }\n                context.globalCompositeOperation = \"destination-over\";\n                context.drawImage(img, x, y, img.width, img.height);\n            } else {\n                context.globalCompositeOperation = \"destination-atop\";\n                context.fillStyle = \"#fff\";//重置画布背景白色\n                context.fillRect(0, 0, canvas.width, canvas.height);\n            }\n            try {\n                return canvas.toDataURL(\"image/png\").substring(22);\n            } catch (e) {\n                return \"\";\n            }\n        },\n        btn2Highlight:function (id) {\n            var cur = $G(id);\n            cur.className.indexOf(\"H\") == -1 && (cur.className += \"H\");\n        },\n        btn2disable:function (id) {\n            var cur = $G(id);\n            cur.className.indexOf(\"H\") != -1 && (cur.className = cur.className.replace(\"H\", \"\"));\n        },\n        getTarget:function (evt) {\n            return evt.target || evt.srcElement;\n        }\n    };\n})();\n\nvar ScaleBoy = function () {\n    this.dom = null;\n    this.scalingElement = null;\n};\n(function () {\n    function _appendStyle() {\n        var doc = document,\n            head = doc.getElementsByTagName('head')[0],\n            style = doc.createElement('style'),\n            cssText = '.scale{visibility:hidden;cursor:move;position:absolute;left:0;top:0;width:100px;height:50px;background-color:#fff;font-size:0;line-height:0;opacity:.4;filter:Alpha(opacity=40);}'\n                + '.scale span{position:absolute;left:0;top:0;width:6px;height:6px;background-color:#006DAE;}'\n                + '.scale .hand0, .scale .hand7{cursor:nw-resize;}'\n                + '.scale .hand1, .scale .hand6{left:50%;margin-left:-3px;cursor:n-resize;}'\n                + '.scale .hand2, .scale .hand4, .scale .hand7{left:100%;margin-left:-6px;}'\n                + '.scale .hand3, .scale .hand4{top:50%;margin-top:-3px;cursor:w-resize;}'\n                + '.scale .hand5, .scale .hand6, .scale .hand7{margin-top:-6px;top:100%;}'\n                + '.scale .hand2, .scale .hand5{cursor:ne-resize;}';\n        style.type = 'text/css';\n\n        try {\n            style.appendChild(doc.createTextNode(cssText));\n        } catch (e) {\n            style.styleSheet.cssText = cssText;\n        }\n        head.appendChild(style);\n    }\n\n    function _getDom() {\n        var doc = document,\n            hand,\n            arr = [],\n            scale = doc.createElement('div');\n\n        scale.id = 'J_scaleCon';\n        scale.className = 'scale';\n        for (var i = 0; i < 8; i++) {\n            arr.push(\"<span class='hand\" + i + \"'></span>\");\n        }\n        scale.innerHTML = arr.join(\"\");\n        return scale;\n    }\n\n    var rect = [\n        //[left, top, width, height]\n        [1, 1, -1, -1],\n        [0, 1, 0, -1],\n        [0, 1, 1, -1],\n        [1, 0, -1, 0],\n        [0, 0, 1, 0],\n        [1, 0, -1, 1],\n        [0, 0, 0, 1],\n        [0, 0, 1, 1]\n    ];\n    ScaleBoy.prototype = {\n        init:function () {\n            _appendStyle();\n            var me = this,\n                scale = me.dom = _getDom();\n\n            me.scaleMousemove.fp = me;\n            domUtils.on(scale, 'mousedown', function (e) {\n                var target = e.target || e.srcElement;\n                me.start = {x:e.clientX, y:e.clientY};\n                if (target.className.indexOf('hand') != -1) {\n                    me.dir = target.className.replace('hand', '');\n                }\n                domUtils.on(document.body, 'mousemove', me.scaleMousemove);\n                e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;\n            });\n            domUtils.on(document.body, 'mouseup', function (e) {\n                if (me.start) {\n                    domUtils.un(document.body, 'mousemove', me.scaleMousemove);\n                    if (me.moved) {\n                        me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}});\n                    }\n                    delete me.start;\n                    delete me.moved;\n                    delete me.dir;\n                }\n            });\n            return scale;\n        },\n        startScale:function (objElement) {\n            var me = this, Idom = me.dom;\n\n            Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;';\n            me.scalingElement = objElement;\n        },\n        updateScaledElement:function (objStyle) {\n            var cur = this.scalingElement,\n                pos = objStyle.position,\n                size = objStyle.size;\n            if (pos) {\n                typeof pos.x != 'undefined' && (cur.style.left = pos.x);\n                typeof pos.y != 'undefined' && (cur.style.top = pos.y);\n            }\n            if (size) {\n                size.w && (cur.style.width = size.w);\n                size.h && (cur.style.height = size.h);\n            }\n        },\n        updateStyleByDir:function (dir, offset) {\n            var me = this,\n                dom = me.dom, tmp;\n\n            rect['def'] = [1, 1, 0, 0];\n            if (rect[dir][0] != 0) {\n                tmp = parseInt(dom.style.left) + offset.x;\n                dom.style.left = me._validScaledProp('left', tmp) + 'px';\n            }\n            if (rect[dir][1] != 0) {\n                tmp = parseInt(dom.style.top) + offset.y;\n                dom.style.top = me._validScaledProp('top', tmp) + 'px';\n            }\n            if (rect[dir][2] != 0) {\n                tmp = dom.clientWidth + rect[dir][2] * offset.x;\n                dom.style.width = me._validScaledProp('width', tmp) + 'px';\n            }\n            if (rect[dir][3] != 0) {\n                tmp = dom.clientHeight + rect[dir][3] * offset.y;\n                dom.style.height = me._validScaledProp('height', tmp) + 'px';\n            }\n            if (dir === 'def') {\n                me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}});\n            }\n        },\n        scaleMousemove:function (e) {\n            var me = arguments.callee.fp,\n                start = me.start,\n                dir = me.dir || 'def',\n                offset = {x:e.clientX - start.x, y:e.clientY - start.y};\n\n            me.updateStyleByDir(dir, offset);\n            arguments.callee.fp.start = {x:e.clientX, y:e.clientY};\n            arguments.callee.fp.moved = 1;\n        },\n        _validScaledProp:function (prop, value) {\n            var ele = this.dom,\n                wrap = $G(\"J_picBoard\");\n\n            value = isNaN(value) ? 0 : value;\n            switch (prop) {\n                case 'left':\n                    return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value;\n                case 'top':\n                    return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value;\n                case 'width':\n                    return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value;\n                case 'height':\n                    return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value;\n            }\n        }\n    };\n})();\n\n//后台回调\nfunction ue_callback(url, state) {\n    var doc = document,\n        picBorard = $G(\"J_picBoard\"),\n        img = doc.createElement(\"img\");\n\n    //图片缩放\n    function scale(img, max, oWidth, oHeight) {\n        var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight;\n        if (ow > max || oh > max) {\n            if (ow >= oh) {\n                if (width = ow - max) {\n                    percent = (width / ow).toFixed(2);\n                    img.height = oh - oh * percent;\n                    img.width = max;\n                }\n            } else {\n                if (height = oh - max) {\n                    percent = (height / oh).toFixed(2);\n                    img.width = ow - ow * percent;\n                    img.height = max;\n                }\n            }\n        }\n    }\n\n    //移除遮罩层\n    removeMaskLayer();\n    //状态响应\n    if (state == \"SUCCESS\") {\n        picBorard.innerHTML = \"\";\n        img.onload = function () {\n            scale(this, 300);\n            picBorard.appendChild(img);\n\n            var obj = new scrawl();\n            obj.btn2Highlight(\"J_removeImg\");\n            //trace 2457\n            obj.btn2Highlight(\"J_sacleBoard\");\n        };\n        img.src = url;\n    } else {\n        alert(state);\n    }\n}\n//去掉遮罩层\nfunction removeMaskLayer() {\n    var maskLayer = $G(\"J_maskLayer\");\n    maskLayer.className = \"maskLayerNull\";\n    maskLayer.innerHTML = \"\";\n    dialog.buttons[0].setDisabled(false);\n}\n//添加遮罩层\nfunction addMaskLayer(html) {\n    var maskLayer = $G(\"J_maskLayer\");\n    dialog.buttons[0].setDisabled(true);\n    maskLayer.className = \"maskLayer\";\n    maskLayer.innerHTML = html;\n}\n//执行确认按钮方法\nfunction exec(scrawlObj) {\n    if (scrawlObj.isScrawl) {\n        addMaskLayer(lang.scrawlUpLoading);\n        var base64 = scrawlObj.getCanvasData();\n        if (!!base64) {\n            var options = {\n                timeout:100000,\n                onsuccess:function (xhr) {\n                    if (!scrawlObj.isCancelScrawl) {\n                        var responseObj;\n                        responseObj = eval(\"(\" + xhr.responseText + \")\");\n                        if (responseObj.state == \"SUCCESS\") {\n                            var imgObj = {},\n                                url = editor.options.scrawlUrlPrefix + responseObj.url;\n                            imgObj.src = url;\n                            imgObj._src = url;\n                            imgObj.alt = responseObj.original || '';\n                            imgObj.title = responseObj.title || '';\n                            editor.execCommand(\"insertImage\", imgObj);\n                            dialog.close();\n                        } else {\n                            alert(responseObj.state);\n                        }\n\n                    }\n                },\n                onerror:function () {\n                    alert(lang.imageError);\n                    dialog.close();\n                }\n            };\n            options[editor.getOpt('scrawlFieldName')] = base64;\n\n            var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')),\n                params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',\n                url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params);\n            ajax.request(url, options);\n        }\n    } else {\n        addMaskLayer(lang.noScarwl + \"&nbsp;&nbsp;&nbsp;<input type='button' value='\" + lang.continueBtn + \"'  onclick='removeMaskLayer()'/>\");\n    }\n}\n\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/searchreplace/searchreplace.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n        \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n    <title></title>\n    <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        .warpper{ position:relative;width: 380px; height: 100%; margin: 10px auto;}\n        .tabbody{height: 160px;}\n        .tabbody table{width:100%;border-collapse: separate;border-spacing: 3px;}\n        .tabbody .panel{width:373px;height:100%;padding-left: 5px;position: absolute;background-color: #fff;}\n        .tabbody input.int{ width:190px;height:21px;border:1px solid #d7d7d7;line-height:21px;}\n        .tabbody input.btn{padding: 0 5px; text-align:center;line-height:24px; text-decoration: none;height:24px;background:url(\"../../themes/default/images/dialog-title-bg.png\") repeat-x;border:1px solid #ccc; }\n    </style>\n</head>\n<body>\n<div class=\"warpper\" id=\"searchtab\">\n    <div id=\"head\" class=\"tabhead\">\n        <span  tabsrc=\"find\" class=\"focus\"><var id=\"lang_tab_search\"></var></span>\n        <span  tabsrc=\"replace\" ><var id=\"lang_tab_replace\"></var></span>\n    </div>\n    <div class=\"tabbody\">\n        <div class=\"panel\" id=\"find\">\n            <table>\n                <tr>\n                    <td width=\"80\"><var id=\"lang_search1\"></var>: </td>\n                    <td><input id=\"findtxt\" type=\"text\" class=\"int\" /></td>\n                </tr>\n                <!--<tr>-->\n\n                    <!--<td colspan=\"2\"><span style=\"color:red\"><var id=\"lang_searchReg\"></var></span></td>-->\n                <!--</tr>-->\n                <tr>\n                    <td><var id=\"lang_case_sensitive1\"></var></td>\n                    <td>\n                        <input id=\"matchCase\" type=\"checkbox\" />\n                    </td>\n                </tr>\n                <tr>\n                    <td colspan=\"2\">\n                        <input id=\"nextFindBtn\" type=\"button\" class=\"btn\" />\n                        <input id=\"preFindBtn\" type=\"button\" class=\"btn\" />\n                    </td>\n                </tr>\n                <tr>\n                    <td colspan=\"2\">\n                        &nbsp;\n                    </td>\n                </tr>\n                <tr>\n                    <td colspan=\"2\">\n                        <span id=\"search-msg\" style=\"color:red\"></span>\n                    </td>\n                </tr>\n            </table>\n        </div>\n        <div class=\"panel\" id=\"replace\">\n            <table>\n                <tr>\n                    <td width=\"80\"><var id=\"lang_search2\"></var>: </td>\n                    <td><input id=\"findtxt1\" type=\"text\" class=\"int\"  /></td>\n                </tr>\n                <!--<tr>-->\n\n                    <!--<td colspan=\"2\"><span style=\"color:red\"><var id=\"lang_searchReg1\"></var></span></td>-->\n                <!--</tr>-->\n                <tr>\n                    <td><var id=\"lang_replace\"></var>: </td>\n                    <td><input id=\"replacetxt\" type=\"text\" class=\"int\" /></td>\n                </tr>\n                <tr>\n                    <td><var id=\"lang_case_sensitive2\"></var></td>\n                    <td>\n                        <input id=\"matchCase1\" type=\"checkbox\" />\n                    </td>\n                </tr>\n                <tr>\n                    <td colspan=\"2\">\n                        <input id=\"nextReplaceBtn\" type=\"button\" class=\"btn\" />\n                        <input id=\"preReplaceBtn\" type=\"button\" class=\"btn\" />\n                        <input id=\"repalceBtn\" type=\"button\" class=\"btn\" />\n                        <input id=\"repalceAllBtn\" type=\"button\" class=\"btn\" />\n                    </td>\n                </tr>\n                <tr>\n                    <td colspan=\"2\">\n                        &nbsp;\n                    </td>\n                </tr>\n                <tr>\n                    <td colspan=\"2\">\n                        <span id=\"replace-msg\" style=\"color:red\"></span>\n                    </td>\n                </tr>\n            </table>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" src=\"searchreplace.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/searchreplace/searchreplace.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: xuheng\n * Date: 12-9-26\n * Time: 下午12:29\n * To change this template use File | Settings | File Templates.\n */\n\n//清空上次查选的痕迹\neditor.firstForSR = 0;\neditor.currentRangeForSR = null;\n//给tab注册切换事件\n/**\n * tab点击处理事件\n * @param tabHeads\n * @param tabBodys\n * @param obj\n */\nfunction clickHandler( tabHeads,tabBodys,obj ) {\n    //head样式更改\n    for ( var k = 0, len = tabHeads.length; k < len; k++ ) {\n        tabHeads[k].className = \"\";\n    }\n    obj.className = \"focus\";\n    //body显隐\n    var tabSrc = obj.getAttribute( \"tabSrc\" );\n    for ( var j = 0, length = tabBodys.length; j < length; j++ ) {\n        var body = tabBodys[j],\n            id = body.getAttribute( \"id\" );\n        if ( id != tabSrc ) {\n            body.style.zIndex = 1;\n        } else {\n            body.style.zIndex = 200;\n        }\n    }\n\n}\n\n/**\n * TAB切换\n * @param tabParentId  tab的父节点ID或者对象本身\n */\nfunction switchTab( tabParentId ) {\n    var tabElements = $G( tabParentId ).children,\n        tabHeads = tabElements[0].children,\n        tabBodys = tabElements[1].children;\n\n    for ( var i = 0, length = tabHeads.length; i < length; i++ ) {\n        var head = tabHeads[i];\n        if ( head.className === \"focus\" )clickHandler(tabHeads,tabBodys, head );\n        head.onclick = function () {\n            clickHandler(tabHeads,tabBodys,this);\n        }\n    }\n}\n$G('searchtab').onmousedown = function(){\n    $G('search-msg').innerHTML = '';\n    $G('replace-msg').innerHTML = ''\n}\n//是否区分大小写\nfunction getMatchCase(id) {\n    return $G(id).checked ? true : false;\n}\n//查找\n$G(\"nextFindBtn\").onclick = function (txt, dir, mcase) {\n    var findtxt = $G(\"findtxt\").value, obj;\n    if (!findtxt) {\n        return false;\n    }\n    obj = {\n        searchStr:findtxt,\n        dir:1,\n        casesensitive:getMatchCase(\"matchCase\")\n    };\n    if (!frCommond(obj)) {\n        var bk = editor.selection.getRange().createBookmark();\n        $G('search-msg').innerHTML = lang.getEnd;\n        editor.selection.getRange().moveToBookmark(bk).select();\n\n\n    }\n};\n$G(\"nextReplaceBtn\").onclick = function (txt, dir, mcase) {\n    var findtxt = $G(\"findtxt1\").value, obj;\n    if (!findtxt) {\n        return false;\n    }\n    obj = {\n        searchStr:findtxt,\n        dir:1,\n        casesensitive:getMatchCase(\"matchCase1\")\n    };\n    frCommond(obj);\n};\n$G(\"preFindBtn\").onclick = function (txt, dir, mcase) {\n    var findtxt = $G(\"findtxt\").value, obj;\n    if (!findtxt) {\n        return false;\n    }\n    obj = {\n        searchStr:findtxt,\n        dir:-1,\n        casesensitive:getMatchCase(\"matchCase\")\n    };\n    if (!frCommond(obj)) {\n        $G('search-msg').innerHTML = lang.getStart;\n    }\n};\n$G(\"preReplaceBtn\").onclick = function (txt, dir, mcase) {\n    var findtxt = $G(\"findtxt1\").value, obj;\n    if (!findtxt) {\n        return false;\n    }\n    obj = {\n        searchStr:findtxt,\n        dir:-1,\n        casesensitive:getMatchCase(\"matchCase1\")\n    };\n    frCommond(obj);\n};\n//替换\n$G(\"repalceBtn\").onclick = function () {\n    var findtxt = $G(\"findtxt1\").value.replace(/^\\s|\\s$/g, \"\"), obj,\n        replacetxt = $G(\"replacetxt\").value.replace(/^\\s|\\s$/g, \"\");\n    if (!findtxt) {\n        return false;\n    }\n    if (findtxt == replacetxt || (!getMatchCase(\"matchCase1\") && findtxt.toLowerCase() == replacetxt.toLowerCase())) {\n        return false;\n    }\n    obj = {\n        searchStr:findtxt,\n        dir:1,\n        casesensitive:getMatchCase(\"matchCase1\"),\n        replaceStr:replacetxt\n    };\n    frCommond(obj);\n};\n//全部替换\n$G(\"repalceAllBtn\").onclick = function () {\n    var findtxt = $G(\"findtxt1\").value.replace(/^\\s|\\s$/g, \"\"), obj,\n        replacetxt = $G(\"replacetxt\").value.replace(/^\\s|\\s$/g, \"\");\n    if (!findtxt) {\n        return false;\n    }\n    if (findtxt == replacetxt || (!getMatchCase(\"matchCase1\") && findtxt.toLowerCase() == replacetxt.toLowerCase())) {\n        return false;\n    }\n    obj = {\n        searchStr:findtxt,\n        casesensitive:getMatchCase(\"matchCase1\"),\n        replaceStr:replacetxt,\n        all:true\n    };\n    var num = frCommond(obj);\n    if (num) {\n        $G('replace-msg').innerHTML = lang.countMsg.replace(\"{#count}\", num);\n    }\n};\n//执行\nvar frCommond = function (obj) {\n    return editor.execCommand(\"searchreplace\", obj);\n};\nswitchTab(\"searchtab\");"
  },
  {
    "path": "static/common/user/uedit/dialogs/snapscreen/snapscreen.html",
    "content": "<!DOCTYPE HTML>\n<html>\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n        <title></title>\n        <script type=\"text/javascript\" src=\"../internal.js\"></script>\n        <style type=\"text/css\">\n            *{color: #838383}\n            html,body {\n                font-size: 12px;\n                width:100%;\n                height:100%;\n                overflow: hidden;\n                margin:0px;\n                padding:0px;\n            }\n            h2 { font-size: 16px; margin: 20px auto;}\n            .content{\n                padding:5px 15px 0 15px;\n                height:100%;\n            }\n            dt,dd { margin-left: 0; padding-left: 0;}\n            dt a { display: block;\n                    height: 30px;\n                    line-height: 30px;\n                    width: 55px;\n                    background: #EFEFEF;\n                    border: 1px solid #CCC;\n                    padding: 0 10px;\n                    text-decoration: none;\n            }\n            dt a:hover{\n                background: #e0e0e0;\n                border-color: #999\n            }\n            dt a:active{\n                background: #ccc;\n                border-color: #999;\n                color: #666;\n            }\n            dd { line-height:20px;margin-top: 10px;}\n            span{ padding-right:4px;}\n            input{width:210px;height:21px;background: #FFF;border:1px solid #d7d7d7;padding: 0px; margin: 0px; }\n\n\n        </style>\n    </head>\n    <body>\n        <div class=\"content\">\n            <h2><var id=\"lang_showMsg\"></var></h2>\n            <dl>\n                <dt><a href=\"../../third-party/snapscreen/UEditorSnapscreen.exe\" target=\"_blank\" id=\"downlink\"><var id=\"lang_download\"></var></a></dt>\n                <dd><var id=\"lang_step1\"></var></dd>\n                <dd><var id=\"lang_step2\"></var></dd>\n            </dl>\n        </div>\n    </body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/spechars/spechars.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n        \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        html,body{overflow:hidden;}\n        #specharsTab{width: 97%;margin: 10px auto; zoom:1;position: relative}\n        .tabbody {height:447px;}\n        .tabbody span{ margin: 5px 3px;text-align: center;display:inline-block;width: 40px;height:16px;line-height: 16px;cursor: pointer; }\n    </style>\n</head>\n<body>\n    <div id=\"specharsTab\">\n        <div id=\"tabHeads\" class=\"tabhead\"></div><div id=\"tabBodys\" class=\"tabbody\"></div>\n    </div>\n<script type=\"text/javascript\" src=\"spechars.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/spechars/spechars.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: xuheng\n * Date: 12-9-26\n * Time: 下午1:09\n * To change this template use File | Settings | File Templates.\n */\nvar charsContent = [\n    { name:\"tsfh\", title:lang.tsfh, content:toArray(\"、,。,·,ˉ,ˇ,¨,〃,々,—,～,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,＄,¤,￠,￡,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,￢,￤,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞\")},\n    { name:\"lmsz\", title:lang.lmsz, content:toArray(\"ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ\")},\n    { name:\"szfh\", title:lang.szfh, content:toArray(\"⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩\")},\n    { name:\"rwfh\", title:lang.rwfh, content:toArray(\"ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ\")},\n    { name:\"xlzm\", title:lang.xlzm, content:toArray(\"Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω\")},\n    { name:\"ewzm\", title:lang.ewzm, content:toArray(\"А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я\")},\n    { name:\"pyzm\", title:lang.pyzm, content:toArray(\"ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü\")},\n    { name:\"yyyb\", title:lang.yyyb, content:toArray(\"i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,\")},\n    { name:\"zyzf\", title:lang.zyzf, content:toArray(\"ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ\")}\n];\n(function createTab(content) {\n    for (var i = 0, ci; ci = content[i++];) {\n        var span = document.createElement(\"span\");\n        span.setAttribute(\"tabSrc\", ci.name);\n        span.innerHTML = ci.title;\n        if (i == 1)span.className = \"focus\";\n        domUtils.on(span, \"click\", function () {\n            var tmps = $G(\"tabHeads\").children;\n            for (var k = 0, sk; sk = tmps[k++];) {\n                sk.className = \"\";\n            }\n            tmps = $G(\"tabBodys\").children;\n            for (var k = 0, sk; sk = tmps[k++];) {\n                sk.style.display = \"none\";\n            }\n            this.className = \"focus\";\n            $G(this.getAttribute(\"tabSrc\")).style.display = \"\";\n        });\n        $G(\"tabHeads\").appendChild(span);\n        domUtils.insertAfter(span, document.createTextNode(\"\\n\"));\n        var div = document.createElement(\"div\");\n        div.id = ci.name;\n        div.style.display = (i == 1) ? \"\" : \"none\";\n        var cons = ci.content;\n        for (var j = 0, con; con = cons[j++];) {\n            var charSpan = document.createElement(\"span\");\n            charSpan.innerHTML = con;\n            domUtils.on(charSpan, \"click\", function () {\n                editor.execCommand(\"insertHTML\", this.innerHTML);\n                dialog.close();\n            });\n            div.appendChild(charSpan);\n        }\n        $G(\"tabBodys\").appendChild(div);\n    }\n})(charsContent);\nfunction toArray(str) {\n    return str.split(\",\");\n}\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/table/edittable.css",
    "content": "body{\n    overflow: hidden;\n    width: 540px;\n}\n.wrapper {\n    margin: 10px auto 0;\n    font-size: 12px;\n    overflow: hidden;\n    width: 520px;\n    height: 315px;\n}\n\n.clear {\n    clear: both;\n}\n\n.wrapper .left {\n    float: left;\n    margin-left: 10px;;\n}\n\n.wrapper .right {\n    float: right;\n    border-left: 2px dotted #EDEDED;\n    padding-left: 15px;\n}\n\n.section {\n    margin-bottom: 15px;\n    width: 240px;\n    overflow: hidden;\n}\n\n.section h3 {\n    font-weight: bold;\n    padding: 5px 0;\n    margin-bottom: 10px;\n    border-bottom: 1px solid #EDEDED;\n    font-size: 12px;\n}\n\n.section ul {\n    list-style: none;\n    overflow: hidden;\n    clear: both;\n\n}\n\n.section li {\n    float: left;\n    width: 120px;;\n}\n\n.section .tone {\n    width: 80px;;\n}\n\n.section .preview {\n    width: 220px;\n}\n\n.section .preview table {\n    text-align: center;\n    vertical-align: middle;\n    color: #666;\n}\n\n.section .preview caption {\n    font-weight: bold;\n}\n\n.section .preview td {\n    border-width: 1px;\n    border-style: solid;\n    height: 22px;\n}\n\n.section .preview th {\n    border-style: solid;\n    border-color: #DDD;\n    border-width: 2px 1px 1px 1px;\n    height: 22px;\n    background-color: #F7F7F7;\n}"
  },
  {
    "path": "static/common/user/uedit/dialogs/table/edittable.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"edittable.css\">\n</head>\n<body>\n<div class=\"wrapper\">\n    <div class=\"left\">\n        <div class=\"section\">\n            <h3><var id=\"lang_tableStyle\"></var></h3>\n            <ul>\n                <li>\n                    <label onselectstart=\"return false\"><input type=\"checkbox\" id=\"J_title\" name=\"style\"/><var id=\"lang_insertTitle\"></var></label>\n                </li>\n                <li>\n                    <label onselectstart=\"return false\"><input type=\"checkbox\" id=\"J_titleCol\" name=\"style\"/><var id=\"lang_insertTitleCol\"></var></label>\n                </li>\n            </ul>\n            <ul>\n                <li>\n                    <label onselectstart=\"return false\"><input type=\"checkbox\" id=\"J_caption\" name=\"style\"/><var id=\"lang_insertCaption\"></var></label>\n                </li>\n                <li>\n                    <label onselectstart=\"return false\"><input type=\"checkbox\" id=\"J_sorttable\" name=\"style\"/><var id=\"lang_orderbycontent\"></var></label>\n                </li>\n            </ul>\n            <div class=\"clear\"></div>\n        </div>\n        <div class=\"section\">\n            <h3><var id=\"lang_tableSize\"></var></h3>\n            <ul>\n                <li>\n                    <label><input type=\"radio\" id=\"J_autoSizeContent\" name=\"size\"/><var id=\"lang_autoSizeContent\"></var></label>\n                </li>\n                <li>\n                    <label><input type=\"radio\" id=\"J_autoSizePage\" name=\"size\"/><var id=\"lang_autoSizePage\"></var></label>\n                </li>\n            </ul>\n            <div class=\"clear\"></div>\n        </div>\n        <div class=\"section\">\n            <h3><var id=\"lang_borderStyle\"></var></h3>\n            <ul>\n                <li>\n                    <span><var id=\"lang_color\"></var></span>\n                    <input type=\"text\" class=\"tone\" id=\"J_tone\" readonly='readonly' />\n                </li>\n            </ul>\n            <div class=\"clear\"></div>\n        </div>\n    </div>\n    <div class=\"right\">\n        <div class=\"section\">\n            <h3><var id=\"lang_example\"></var></h3>\n            <div class=\"preview\" id=\"J_preview\">\n            </div>\n        </div>\n    </div>\n</div>\n<script type=\"text/javascript\" src=\"edittable.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/table/edittable.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: xuheng\n * Date: 12-12-19\n * Time: 下午4:55\n * To change this template use File | Settings | File Templates.\n */\n(function () {\n    var title = $G(\"J_title\"),\n        titleCol = $G(\"J_titleCol\"),\n        caption = $G(\"J_caption\"),\n        sorttable = $G(\"J_sorttable\"),\n        autoSizeContent = $G(\"J_autoSizeContent\"),\n        autoSizePage = $G(\"J_autoSizePage\"),\n        tone = $G(\"J_tone\"),\n        me,\n        preview = $G(\"J_preview\");\n\n    var editTable = function () {\n        me = this;\n        me.init();\n    };\n    editTable.prototype = {\n        init:function () {\n            var colorPiker = new UE.ui.ColorPicker({\n                    editor:editor\n                }),\n                colorPop = new UE.ui.Popup({\n                    editor:editor,\n                    content:colorPiker\n                });\n\n            title.checked = editor.queryCommandState(\"inserttitle\") == -1;\n            titleCol.checked = editor.queryCommandState(\"inserttitlecol\") == -1;\n            caption.checked = editor.queryCommandState(\"insertcaption\") == -1;\n            sorttable.checked = editor.queryCommandState(\"enablesort\") == 1;\n\n            var enablesortState = editor.queryCommandState(\"enablesort\"),\n                disablesortState = editor.queryCommandState(\"disablesort\");\n\n            sorttable.checked = !!(enablesortState < 0 && disablesortState >=0);\n            sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0);\n            sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:'';\n\n            me.createTable(title.checked, titleCol.checked, caption.checked);\n            me.setAutoSize();\n            me.setColor(me.getColor());\n\n            domUtils.on(title, \"click\", me.titleHanler);\n            domUtils.on(titleCol, \"click\", me.titleColHanler);\n            domUtils.on(caption, \"click\", me.captionHanler);\n            domUtils.on(sorttable, \"click\", me.sorttableHanler);\n            domUtils.on(autoSizeContent, \"click\", me.autoSizeContentHanler);\n            domUtils.on(autoSizePage, \"click\", me.autoSizePageHanler);\n\n            domUtils.on(tone, \"click\", function () {\n                colorPop.showAnchor(tone);\n            });\n            domUtils.on(document, 'mousedown', function () {\n                colorPop.hide();\n            });\n            colorPiker.addListener(\"pickcolor\", function () {\n                me.setColor(arguments[1]);\n                colorPop.hide();\n            });\n            colorPiker.addListener(\"picknocolor\", function () {\n                me.setColor(\"\");\n                colorPop.hide();\n            });\n        },\n\n        createTable:function (hasTitle, hasTitleCol, hasCaption) {\n            var arr = [],\n                sortSpan = '<span>^</span>';\n            arr.push(\"<table id='J_example'>\");\n            if (hasCaption) {\n                arr.push(\"<caption>\" + lang.captionName + \"</caption>\")\n            }\n            if (hasTitle) {\n                arr.push(\"<tr>\");\n                if(hasTitleCol) { arr.push(\"<th>\" + lang.titleName + \"</th>\"); }\n                for (var j = 0; j < 5; j++) {\n                    arr.push(\"<th>\" + lang.titleName + \"</th>\");\n                }\n                arr.push(\"</tr>\");\n            }\n            for (var i = 0; i < 6; i++) {\n                arr.push(\"<tr>\");\n                if(hasTitleCol) { arr.push(\"<th>\" + lang.titleName + \"</th>\") }\n                for (var k = 0; k < 5; k++) {\n                    arr.push(\"<td>\" + lang.cellsName + \"</td>\")\n                }\n                arr.push(\"</tr>\");\n            }\n            arr.push(\"</table>\");\n            preview.innerHTML = arr.join(\"\");\n            this.updateSortSpan();\n        },\n        titleHanler:function () {\n            var example = $G(\"J_example\"),\n                frg=document.createDocumentFragment(),\n                color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, \"td\")[0], \"border-color\"),\n                colCount = example.rows[0].children.length;\n\n            if (title.checked) {\n                example.insertRow(0);\n                for (var i = 0, node; i < colCount; i++) {\n                    node = document.createElement(\"th\");\n                    node.innerHTML = lang.titleName;\n                    frg.appendChild(node);\n                }\n                example.rows[0].appendChild(frg);\n\n            } else {\n                domUtils.remove(example.rows[0]);\n            }\n            me.setColor(color);\n            me.updateSortSpan();\n        },\n        titleColHanler:function () {\n            var example = $G(\"J_example\"),\n                color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, \"td\")[0], \"border-color\"),\n                colArr = example.rows,\n                colCount = colArr.length;\n\n            if (titleCol.checked) {\n                for (var i = 0, node; i < colCount; i++) {\n                    node = document.createElement(\"th\");\n                    node.innerHTML = lang.titleName;\n                    colArr[i].insertBefore(node, colArr[i].children[0]);\n                }\n            } else {\n                for (var i = 0; i < colCount; i++) {\n                    domUtils.remove(colArr[i].children[0]);\n                }\n            }\n            me.setColor(color);\n            me.updateSortSpan();\n        },\n        captionHanler:function () {\n            var example = $G(\"J_example\");\n            if (caption.checked) {\n                var row = document.createElement('caption');\n                row.innerHTML = lang.captionName;\n                example.insertBefore(row, example.firstChild);\n            } else {\n                domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]);\n            }\n        },\n        sorttableHanler:function(){\n            me.updateSortSpan();\n        },\n        autoSizeContentHanler:function () {\n            var example = $G(\"J_example\");\n            example.removeAttribute(\"width\");\n        },\n        autoSizePageHanler:function () {\n            var example = $G(\"J_example\");\n            var tds = example.getElementsByTagName(example, \"td\");\n            utils.each(tds, function (td) {\n                td.removeAttribute(\"width\");\n            });\n            example.setAttribute('width', '100%');\n        },\n        updateSortSpan: function(){\n            var example = $G(\"J_example\"),\n                row = example.rows[0];\n\n            var spans = domUtils.getElementsByTagName(example,\"span\");\n            utils.each(spans,function(span){\n                span.parentNode.removeChild(span);\n            });\n            if (sorttable.checked) {\n                utils.each(row.cells, function(cell, i){\n                    var span = document.createElement(\"span\");\n                    span.innerHTML = \"^\";\n                    cell.appendChild(span);\n                });\n            }\n        },\n        getColor:function () {\n            var start = editor.selection.getStart(), color,\n                cell = domUtils.findParentByTagName(start, [\"td\", \"th\", \"caption\"], true);\n            color = cell && domUtils.getComputedStyle(cell, \"border-color\");\n            if (!color)  color = \"#DDDDDD\";\n            return color;\n        },\n        setColor:function (color) {\n            var example = $G(\"J_example\"),\n                arr = domUtils.getElementsByTagName(example, \"td\").concat(\n                    domUtils.getElementsByTagName(example, \"th\"),\n                    domUtils.getElementsByTagName(example, \"caption\")\n                );\n\n            tone.value = color;\n            utils.each(arr, function (node) {\n                node.style.borderColor = color;\n            });\n\n        },\n        setAutoSize:function () {\n            var me = this;\n            autoSizePage.checked = true;\n            me.autoSizePageHanler();\n        }\n    };\n\n    new editTable;\n\n    dialog.onok = function () {\n        editor.__hasEnterExecCommand = true;\n\n        var checks = {\n            title:\"inserttitle deletetitle\",\n            titleCol:\"inserttitlecol deletetitlecol\",\n            caption:\"insertcaption deletecaption\",\n            sorttable:\"enablesort disablesort\"\n        };\n        editor.fireEvent('saveScene');\n        for(var i in checks){\n            var cmds = checks[i].split(\" \"),\n                input = $G(\"J_\" + i);\n            if(input[\"checked\"]){\n                editor.queryCommandState(cmds[0])!=-1 &&editor.execCommand(cmds[0]);\n            }else{\n                editor.queryCommandState(cmds[1])!=-1 &&editor.execCommand(cmds[1]);\n            }\n        }\n\n        editor.execCommand(\"edittable\", tone.value);\n        autoSizeContent.checked ?editor.execCommand('adaptbytext') : \"\";\n        autoSizePage.checked ? editor.execCommand(\"adaptbywindow\") : \"\";\n        editor.fireEvent('saveScene');\n\n        editor.__hasEnterExecCommand = false;\n    };\n})();"
  },
  {
    "path": "static/common/user/uedit/dialogs/table/edittd.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        .section {\n            text-align: center;\n            margin-top: 10px;\n        }\n        .section input {\n            margin-left: 5px;\n            width: 70px;\n        }\n    </style>\n</head>\n<body>\n<div class=\"section\">\n    <span><var id=\"lang_tdBkColor\"></var></span>\n    <input type=\"text\" id=\"J_tone\"/>\n</div>\n<script type=\"text/javascript\">\n    var tone = $G(\"J_tone\"),\n            colorPiker = new UE.ui.ColorPicker({\n                editor:editor\n            }),\n            colorPop = new UE.ui.Popup({\n                editor:editor,\n                content:colorPiker\n            });\n    domUtils.on(tone, \"click\", function () {\n        colorPop.showAnchor(tone);\n    });\n    domUtils.on(document, 'mousedown', function () {\n        colorPop.hide();\n    });\n    colorPiker.addListener(\"pickcolor\", function () {\n        tone.value = arguments[1];\n        colorPop.hide();\n    });\n    colorPiker.addListener(\"picknocolor\", function () {\n        tone.value=\"\";\n        colorPop.hide();\n    });\n    dialog.onok=function(){\n        editor.execCommand(\"edittd\",tone.value);\n    };\n\n    var start = editor.selection.getStart(),\n        cell = start && domUtils.findParentByTagName(start, [\"td\", \"th\"], true);\n    if(cell){\n        var color = domUtils.getComputedStyle(cell,'background-color');\n        if(/^#/.test(color)){\n            tone.value = color\n        }\n\n    }\n\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/table/edittip.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>表格删除提示</title>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        .section {\n            width: 200px;\n            margin: 10px auto 0;\n            font-size: 14px;\n        }\n\n        .item {\n            text-align: center;\n        }\n    </style>\n</head>\n<body>\n<div class=\"section\">\n    <div class=\"item\">\n        <label><input type=\"radio\" id=\"J_delRow\" name=\"cmd\" checked/><var id=\"lang_delRow\"></var></label>\n    </div>\n    <div class=\"item\">\n        <label><input type=\"radio\" id=\"J_delCol\" name=\"cmd\"/><var id=\"lang_delCol\"></var></label>\n    </div>\n</div>\n<script type=\"text/javascript\">\n    dialog.onok = function () {\n        $G(\"J_delRow\").checked ? editor.execCommand(\"deleterow\") : editor.execCommand(\"deletecol\");\n    };\n</script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/template/config.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: xuheng\n * Date: 12-8-8\n * Time: 下午2:00\n * To change this template use File | Settings | File Templates.\n */\nvar templates = [\n    {\n        \"pre\":\"pre0.png\",\n        'title':lang.blank,\n        'preHtml':'<p class=\"ue_t\">&nbsp;欢迎使用UEditor！</p>',\n        \"html\":'<p class=\"ue_t\">欢迎使用UEditor！</p>'\n\n    },\n    {\n        \"pre\":\"pre1.png\",\n        'title':lang.blog,\n        'preHtml':'<h1 label=\"Title center\" name=\"tc\" style=\"border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;\"><span style=\"color:#c0504d;\">深入理解Range</span></h1><p style=\"text-align:center;\"><strong class=\" \">UEditor二次开发</strong></p><h3><span class=\" \" style=\"font-family:幼圆\">什么是Range</span></h3><p style=\"text-indent:2em;\">对于“插入”选项卡上的库，在设计时都充分考虑了其中的项与文档整体外观的协调性。 </p><br /><h3><span class=\" \" style=\"font-family:幼圆\">Range能干什么</span></h3><p style=\"text-indent:2em;\">在“开始”选项卡上，通过从快速样式库中为所选文本选择一种外观，您可以方便地更改文档中所选文本的格式。</p>',\n        \"html\":'<h1 class=\"ue_t\" label=\"Title center\" name=\"tc\" style=\"border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;\"><span style=\"color:#c0504d;\">[键入文档标题]</span></h1><p style=\"text-align:center;\"><strong class=\"ue_t\">[键入文档副标题]</strong></p><h3><span class=\"ue_t\" style=\"font-family:幼圆\">[标题 1]</span></h3><p class=\"ue_t\"  style=\"text-indent:2em;\">对于“插入”选项卡上的库，在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。</p><h3><span class=\"ue_t\" style=\"font-family:幼圆\">[标题 2]</span></h3><p class=\"ue_t\"  style=\"text-indent:2em;\">在“开始”选项卡上，通过从快速样式库中为所选文本选择一种外观，您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观，还是使用某种直接指定的格式。 </p><h3><span class=\"ue_t\" style=\"font-family:幼圆\">[标题 3]</span></h3><p class=\"ue_t\">对于“插入”选项卡上的库，在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。</p><p class=\"ue_t\"><br /></p>'\n\n    },\n    {\n        \"pre\":\"pre2.png\",\n        'title':lang.resume,\n        'preHtml':'<h1 label=\"Title left\" name=\"tl\" style=\"border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;\"><span style=\"color:#e36c09;\" class=\" \">WEB前端开发简历</span></h1><table width=\"100%\" border=\"1\" bordercolor=\"#95B3D7\" style=\"border-collapse:collapse;\"><tbody><tr><td width=\"100\" style=\"text-align:center;\"><p><span style=\"background-color:transparent;\">插</span><br /></p><p>入</p><p>照</p><p>片</p></td><td><p><span style=\"background-color:transparent;\"> 联系电话：</span><span class=\"ue_t\" style=\"background-color:transparent;\">[键入您的电话]</span><br /></p><p><span style=\"background-color:transparent;\"> 电子邮件：</span><span class=\"ue_t\" style=\"background-color:transparent;\">[键入您的电子邮件地址]</span><br /></p><p><span style=\"background-color:transparent;\"> 家庭住址：</span><span class=\"ue_t\" style=\"background-color:transparent;\">[键入您的地址]</span><br /></p></td></tr></tbody></table><h3><span style=\"color:#E36C09;font-size:20px;\">目标职位</span></h3><p style=\"text-indent:2em;\" class=\" \">WEB前端研发工程师</p><h3><span style=\"color:#e36c09;font-size:20px;\">学历</span></h3><p><span style=\"display:none;line-height:0px;\" id=\"_baidu_bookmark_start_26\">﻿</span></p><ol style=\"list-style-type:decimal;\"><li><p><span class=\"ue_t\">[起止时间]</span> <span class=\"ue_t\">[学校名称] </span> <span class=\"ue_t\">[所学专业]</span> <span class=\"ue_t\">[所获学位]</span></p></li></ol><h3><span style=\"color:#e36c09;font-size:20px;\" class=\"ue_t\">工作经验</span></h3><p><br /></p>',\n        \"html\":'<h1 label=\"Title left\" name=\"tl\" style=\"border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;\"><span style=\"color:#e36c09;\" class=\"ue_t\">[此处键入简历标题]</span></h1><p><span style=\"color:#e36c09;\"><br /></span></p><table width=\"100%\" border=\"1\" bordercolor=\"#95B3D7\" style=\"border-collapse:collapse;\"><tbody><tr><td width=\"200\" style=\"text-align:center;\" class=\"ue_t\">【此处插入照片】</td><td><p><br /></p><p> 联系电话：<span class=\"ue_t\">[键入您的电话]</span></p><p><br /></p><p> 电子邮件：<span class=\"ue_t\">[键入您的电子邮件地址]</span></p><p><br /></p><p> 家庭住址：<span class=\"ue_t\">[键入您的地址]</span></p><p><br /></p></td></tr></tbody></table><h3><span style=\"color:#e36c09;font-size:20px;\">目标职位</span></h3><p style=\"text-indent:2em;\" class=\"ue_t\">[此处键入您的期望职位]</p><h3><span style=\"color:#e36c09;font-size:20px;\">学历</span></h3><p><span style=\"display:none;line-height:0px;\" id=\"_baidu_bookmark_start_26\">﻿</span></p><ol style=\"list-style-type:decimal;\"><li><p><span class=\"ue_t\">[键入起止时间]</span> <span class=\"ue_t\">[键入学校名称] </span> <span class=\"ue_t\">[键入所学专业]</span> <span class=\"ue_t\">[键入所获学位]</span></p></li><li><p><span class=\"ue_t\">[键入起止时间]</span> <span class=\"ue_t\">[键入学校名称]</span> <span class=\"ue_t\">[键入所学专业]</span> <span class=\"ue_t\">[键入所获学位]</span></p></li></ol><h3><span style=\"color:#e36c09;font-size:20px;\" class=\"ue_t\">工作经验</span></h3><ol style=\"list-style-type:decimal;\"><li><p><span class=\"ue_t\">[键入起止时间]</span> <span class=\"ue_t\">[键入公司名称]</span> <span class=\"ue_t\">[键入职位名称]</span> </p></li><ol style=\"list-style-type:lower-alpha;\"><li><p><span class=\"ue_t\">[键入负责项目]</span> <span class=\"ue_t\">[键入项目简介]</span></p></li><li><p><span class=\"ue_t\">[键入负责项目]</span> <span class=\"ue_t\">[键入项目简介]</span></p></li></ol><li><p><span class=\"ue_t\">[键入起止时间]</span> <span class=\"ue_t\">[键入公司名称]</span> <span class=\"ue_t\">[键入职位名称]</span> </p></li><ol style=\"list-style-type:lower-alpha;\"><li><p><span class=\"ue_t\">[键入负责项目]</span> <span class=\"ue_t\">[键入项目简介]</span></p></li></ol></ol><p><span style=\"color:#e36c09;font-size:20px;\">掌握技能</span></p><p style=\"text-indent:2em;\"> &nbsp;<span class=\"ue_t\">[这里可以键入您所掌握的技能]</span><br /></p>'\n\n    },\n    {\n        \"pre\":\"pre3.png\",\n        'title':lang.richText,\n        'preHtml':'<h1 label=\"Title center\" name=\"tc\" style=\"border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;\" class=\"ue_t\">[此处键入文章标题]</h1><p><img src=\"http://img.baidu.com/hi/youa/y_0034.gif\" width=\"150\" height=\"100\" border=\"0\" hspace=\"0\" vspace=\"0\" style=\"width:150px;height:100px;float:left;\" />图文混排方法</p><p>图片居左，文字围绕图片排版</p><p>方法：在文字前面插入图片，设置居左对齐，然后即可在右边输入多行文</p><p><br /></p><p><img src=\"http://img.baidu.com/hi/youa/y_0040.gif\" width=\"100\" height=\"100\" border=\"0\" hspace=\"0\" vspace=\"0\" style=\"width:100px;height:100px;float:right;\" /></p><p>还有没有什么其他的环绕方式呢？这里是居右环绕</p><p><br /></p><p>欢迎大家多多尝试，为UEditor提供更多高质量模板！</p>',\n        \"html\":'<p><br /></p><h1 label=\"Title center\" name=\"tc\" style=\"border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;\" class=\"ue_t\">[此处键入文章标题]</h1><p><img src=\"http://img.baidu.com/hi/youa/y_0034.gif\" width=\"300\" height=\"200\" border=\"0\" hspace=\"0\" vspace=\"0\" style=\"width:300px;height:200px;float:left;\" />图文混排方法</p><p>1. 图片居左，文字围绕图片排版</p><p>方法：在文字前面插入图片，设置居左对齐，然后即可在右边输入多行文本</p><p><br /></p><p>2. 图片居右，文字围绕图片排版</p><p>方法：在文字前面插入图片，设置居右对齐，然后即可在左边输入多行文本</p><p><br /></p><p>3. 图片居中环绕排版</p><p>方法：亲，这个真心没有办法。。。</p><p><br /></p><p><br /></p><p><img src=\"http://img.baidu.com/hi/youa/y_0040.gif\" width=\"300\" height=\"300\" border=\"0\" hspace=\"0\" vspace=\"0\" style=\"width:300px;height:300px;float:right;\" /></p><p>还有没有什么其他的环绕方式呢？这里是居右环绕</p><p><br /></p><p>欢迎大家多多尝试，为UEditor提供更多高质量模板！</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p><br /></p>'\n    },\n    {\n        \"pre\":\"pre4.png\",\n        'title':lang.sciPapers,\n        'preHtml':'<h2 style=\"border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;text-align:center;\" class=\"ue_t\">[键入文章标题]</h2><p><strong><span style=\"font-size:12px;\">摘要</span></strong><span style=\"font-size:12px;\" class=\"ue_t\">：这里可以输入很长很长很长很长很长很长很长很长很差的摘要</span></p><p style=\"line-height:1.5em;\"><strong>标题 1</strong></p><p style=\"text-indent:2em;\"><span style=\"font-size:14px;\" class=\"ue_t\">这里可以输入很多内容，可以图文混排，可以有列表等。</span></p><p style=\"line-height:1.5em;\"><strong>标题 2</strong></p><ol style=\"list-style-type:lower-alpha;\"><li><p class=\"ue_t\">列表 1</p></li><li><p class=\"ue_t\">列表 2</p></li><ol style=\"list-style-type:lower-roman;\"><li><p class=\"ue_t\">多级列表 1</p></li><li><p class=\"ue_t\">多级列表 2</p></li></ol><li><p class=\"ue_t\">列表 3<br /></p></li></ol><p style=\"line-height:1.5em;\"><strong>标题 3</strong></p><p style=\"text-indent:2em;\"><span style=\"font-size:14px;\" class=\"ue_t\">来个文字图文混排的</span></p><p style=\"text-indent:2em;\"><br /></p>',\n        'html':'<h2 style=\"border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;text-align:center;\" class=\"ue_t\">[键入文章标题]</h2><p><strong><span style=\"font-size:12px;\">摘要</span></strong><span style=\"font-size:12px;\" class=\"ue_t\">：这里可以输入很长很长很长很长很长很长很长很长很差的摘要</span></p><p style=\"line-height:1.5em;\"><strong>标题 1</strong></p><p style=\"text-indent:2em;\"><span style=\"font-size:14px;\" class=\"ue_t\">这里可以输入很多内容，可以图文混排，可以有列表等。</span></p><p style=\"line-height:1.5em;\"><strong>标题 2</strong></p><p style=\"text-indent:2em;\"><span style=\"font-size:14px;\" class=\"ue_t\">来个列表瞅瞅：</span></p><ol style=\"list-style-type:lower-alpha;\"><li><p class=\"ue_t\">列表 1</p></li><li><p class=\"ue_t\">列表 2</p></li><ol style=\"list-style-type:lower-roman;\"><li><p class=\"ue_t\">多级列表 1</p></li><li><p class=\"ue_t\">多级列表 2</p></li></ol><li><p class=\"ue_t\">列表 3<br /></p></li></ol><p style=\"line-height:1.5em;\"><strong>标题 3</strong></p><p style=\"text-indent:2em;\"><span style=\"font-size:14px;\" class=\"ue_t\">来个文字图文混排的</span></p><p style=\"text-indent:2em;\"><span style=\"font-size:14px;\" class=\"ue_t\">这里可以多行</span></p><p style=\"text-indent:2em;\"><span style=\"font-size:14px;\" class=\"ue_t\">右边是图片</span></p><p style=\"text-indent:2em;\"><span style=\"font-size:14px;\" class=\"ue_t\">绝对没有问题的，不信你也可以试试看</span></p><p><br /></p>'\n    }\n];"
  },
  {
    "path": "static/common/user/uedit/dialogs/template/template.css",
    "content": ".wrap{ padding: 5px;font-size: 14px;}\n.left{width:425px;float: left;}\n.right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;}\n.right .pre{height: 332px;overflow-y: auto;}\n.right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;}\n.right .preitem:hover{background-color: lemonChiffon;cursor: pointer;border: #ccc 1px solid;}\n.right .preitem img{display: block;margin: 0 auto;width:100px;}\n.clear{clear: both;}\n.top{height:26px;line-height: 26px;padding: 5px;}\n.bottom{height:320px;width:100%;margin: 0 auto;}\n.transparent{ background: url(\"images/bg.gif\") repeat;}\n.bottom table tr td{border:1px dashed #ccc;}\n#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;}\n.border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;}\np{margin: 5px 0}\ntable{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;}\nli{clear:both}\nol{padding-left:40px; }"
  },
  {
    "path": "static/common/user/uedit/dialogs/template/template.html",
    "content": "<!DOCTYPE HTML>\n<html>\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"template.css\">\n</head>\n<body>\n    <div class=\"wrap\">\n        <div class=\"left\">\n            <div class=\"top\">\n                <label><var id=\"lang_template_clear\"></var>：<input id=\"issave\" type=\"checkbox\"></label>\n            </div>\n            <div class=\"bottom border_style1\" id=\"preview\"></div>\n        </div>\n        <fieldset  class=\"right border_style1\">\n            <legend><var id=\"lang_template_select\"></var></legend>\n            <div class=\"pre\" id=\"preitem\"></div>\n        </fieldset>\n        <div class=\"clear\"></div>\n    </div>\n    <script type=\"text/javascript\" src=\"config.js\"></script>\n    <script type=\"text/javascript\" src=\"template.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/template/template.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: xuheng\n * Date: 12-8-8\n * Time: 下午2:09\n * To change this template use File | Settings | File Templates.\n */\n(function () {\n    var me = editor,\n            preview = $G( \"preview\" ),\n            preitem = $G( \"preitem\" ),\n            tmps = templates,\n            currentTmp;\n    var initPre = function () {\n        var str = \"\";\n        for ( var i = 0, tmp; tmp = tmps[i++]; ) {\n            str += '<div class=\"preitem\" onclick=\"pre(' + i + ')\"><img src=\"' + \"images/\" + tmp.pre + '\" ' + (tmp.title ? \"alt=\" + tmp.title + \" title=\" + tmp.title + \"\" : \"\") + '></div>';\n        }\n        preitem.innerHTML = str;\n    };\n    var pre = function ( n ) {\n        var tmp = tmps[n - 1];\n        currentTmp = tmp;\n        clearItem();\n        domUtils.setStyles( preitem.childNodes[n - 1], {\n            \"background-color\":\"lemonChiffon\",\n            \"border\":\"#ccc 1px solid\"\n        } );\n        preview.innerHTML = tmp.preHtml ? tmp.preHtml : \"\";\n    };\n    var clearItem = function () {\n        var items = preitem.children;\n        for ( var i = 0, item; item = items[i++]; ) {\n            domUtils.setStyles( item, {\n                \"background-color\":\"\",\n                \"border\":\"white 1px solid\"\n            } );\n        }\n    };\n    dialog.onok = function () {\n        if ( !$G( \"issave\" ).checked ){\n            me.execCommand( \"cleardoc\" );\n        }\n        var obj = {\n            html:currentTmp && currentTmp.html\n        };\n        me.execCommand( \"template\", obj );\n    };\n    initPre();\n    window.pre = pre;\n    pre(2)\n\n})();"
  },
  {
    "path": "static/common/user/uedit/dialogs/video/video.css",
    "content": "@charset \"utf-8\";\n.wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative}\n.tabbody{height: 335px;}\n.tabbody .panel {\n    position: absolute;\n    width: 0;\n    height: 0;\n    background: #fff;\n    overflow: hidden;\n    display: none;\n}\n.tabbody .panel.focus {\n    width: 100%;\n    height: 335px;\n    display: block;\n}\n\n.tabbody .panel table td{vertical-align: middle;}\n#videoUrl {\n    width: 490px;\n    height: 21px;\n    line-height: 21px;\n    margin: 8px 5px;\n    background: #FFF;\n    border: 1px solid #d7d7d7;\n}\n#videoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;}\n#searchList{width: 570px;overflow: auto;zoom:1;height: 270px;}\n#searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;}\n#searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/\n#searchList p{margin-left: 10px;}\n#videoType{\n    width: 65px;\n    height: 23px;\n    line-height: 22px;\n    border: 1px solid #d7d7d7;\n}\n#videoSearchBtn,#videoSearchReset{\n    /*width: 80px;*/\n    height: 25px;\n    line-height: 25px;\n    background: #eee;\n    border: 1px solid #d7d7d7;\n    cursor: pointer;\n    padding: 0 5px;\n}\n\n\n\n#preview{position: relative;width: 420px;padding:0;overflow: hidden; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left}\n#preview .previewMsg {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;background-color: #666;}\n#preview .previewMsg span{display:block;margin: 125px auto 0 auto;text-align:center;font-size:18px;color:#fff;}\n#preview .previewVideo {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;}\n.edui-video-wrapper fieldset{\n    border: 1px solid #ddd;\n    padding-left: 5px;\n    margin-bottom: 20px;\n    padding-bottom: 5px;\n    width: 115px;\n}\n\n#videoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;}\nfieldset{\n    border: 1px solid #ddd;\n    padding-left: 5px;\n    margin-bottom: 20px;\n    padding-bottom: 5px;\n    width: 115px;\n}\nfieldset legend{font-weight: bold;}\nfieldset p{line-height: 30px;}\nfieldset input.txt{\n    width: 65px;\n    height: 21px;\n    line-height: 21px;\n    margin: 8px 5px;\n    background: #FFF;\n    border: 1px solid #d7d7d7;\n}\nlabel.url{font-weight: bold;margin-left: 5px;color: #06c;}\n#videoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}\n#videoFloat .focus{opacity: 1;filter: alpha(opacity = 100)}\nspan.view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue}\n\n\n\n\n/* upload video */\n.tabbody #upload.panel {\n    width: 0;\n    height: 0;\n    overflow: hidden;\n    position: absolute !important;\n    clip: rect(1px, 1px, 1px, 1px);\n    background: #fff;\n    display: block;\n}\n.tabbody #upload.panel.focus {\n    width: 100%;\n    height: 335px;\n    display: block;\n    clip: auto;\n}\n#upload_alignment div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}\n#upload_alignment .focus{opacity: 1;filter: alpha(opacity = 100)}\n#upload_left { width:427px; float:left; }\n#upload_left .controller { height: 30px; clear: both; }\n#uploadVideoInfo{margin-top:10px;float:right;padding-right:8px;}\n\n#upload .queueList {\n    margin: 0;\n}\n\n#upload p {\n    margin: 0;\n}\n\n.element-invisible {\n    width: 0 !important;\n    height: 0 !important;\n    border: 0;\n    padding: 0;\n    margin: 0;\n    overflow: hidden;\n    position: absolute !important;\n    clip: rect(1px, 1px, 1px, 1px);\n}\n\n#upload .placeholder {\n    margin: 10px;\n    margin-right:0;\n    border: 2px dashed #e6e6e6;\n    *border: 0px dashed #e6e6e6;\n    height: 161px;\n    padding-top: 150px;\n    text-align: center;\n    width: 97%;\n    float: left;\n    background: url(./images/image.png) center 70px no-repeat;\n    color: #cccccc;\n    font-size: 18px;\n    position: relative;\n    top:0;\n    *margin-left: 0;\n    *left: 10px;\n}\n\n#upload .placeholder .webuploader-pick {\n    font-size: 18px;\n    background: #00b7ee;\n    border-radius: 3px;\n    line-height: 44px;\n    padding: 0 30px;\n    *width: 120px;\n    color: #fff;\n    display: inline-block;\n    margin: 0 auto 20px auto;\n    cursor: pointer;\n    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n}\n\n#upload .placeholder .webuploader-pick-hover {\n    background: #00a2d4;\n}\n\n\n#filePickerContainer {\n    text-align: center;\n}\n\n#upload .placeholder .flashTip {\n    color: #666666;\n    font-size: 12px;\n    position: absolute;\n    width: 100%;\n    text-align: center;\n    bottom: 20px;\n}\n\n#upload .placeholder .flashTip a {\n    color: #0785d1;\n    text-decoration: none;\n}\n\n#upload .placeholder .flashTip a:hover {\n    text-decoration: underline;\n}\n\n#upload .placeholder.webuploader-dnd-over {\n    border-color: #999999;\n}\n\n#upload .filelist {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n    overflow-x: hidden;\n    overflow-y: auto;\n    position: relative;\n    height: 285px;\n}\n\n#upload .filelist:after {\n    content: '';\n    display: block;\n    width: 0;\n    height: 0;\n    overflow: hidden;\n    clear: both;\n}\n\n#upload .filelist li {\n    width: 113px;\n    height: 113px;\n    background: url(./images/bg.png);\n    text-align: center;\n    margin: 15px 0 0 20px;\n    *margin: 15px 0 0 15px;\n    position: relative;\n    display: block;\n    float: left;\n    overflow: hidden;\n    font-size: 12px;\n}\n\n#upload .filelist li p.log {\n    position: relative;\n    top: -45px;\n}\n\n#upload .filelist li p.title {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    top: 5px;\n    text-indent: 5px;\n    text-align: left;\n}\n\n#upload .filelist li p.progress {\n    position: absolute;\n    width: 100%;\n    bottom: 0;\n    left: 0;\n    height: 8px;\n    overflow: hidden;\n    z-index: 50;\n    margin: 0;\n    border-radius: 0;\n    background: none;\n    -webkit-box-shadow: 0 0 0;\n}\n\n#upload .filelist li p.progress span {\n    display: none;\n    overflow: hidden;\n    width: 0;\n    height: 100%;\n    background: #1483d8 url(./images/progress.png) repeat-x;\n\n    -webit-transition: width 200ms linear;\n    -moz-transition: width 200ms linear;\n    -o-transition: width 200ms linear;\n    -ms-transition: width 200ms linear;\n    transition: width 200ms linear;\n\n    -webkit-animation: progressmove 2s linear infinite;\n    -moz-animation: progressmove 2s linear infinite;\n    -o-animation: progressmove 2s linear infinite;\n    -ms-animation: progressmove 2s linear infinite;\n    animation: progressmove 2s linear infinite;\n\n    -webkit-transform: translateZ(0);\n}\n\n@-webkit-keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n@-moz-keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n@keyframes progressmove {\n    0% {\n        background-position: 0 0;\n    }\n    100% {\n        background-position: 17px 0;\n    }\n}\n\n#upload .filelist li p.imgWrap {\n    position: relative;\n    z-index: 2;\n    line-height: 113px;\n    vertical-align: middle;\n    overflow: hidden;\n    width: 113px;\n    height: 113px;\n\n    -webkit-transform-origin: 50% 50%;\n    -moz-transform-origin: 50% 50%;\n    -o-transform-origin: 50% 50%;\n    -ms-transform-origin: 50% 50%;\n    transform-origin: 50% 50%;\n\n    -webit-transition: 200ms ease-out;\n    -moz-transition: 200ms ease-out;\n    -o-transition: 200ms ease-out;\n    -ms-transition: 200ms ease-out;\n    transition: 200ms ease-out;\n}\n#upload .filelist li p.imgWrap.notimage {\n    margin-top: 0;\n    width: 111px;\n    height: 111px;\n    border: 1px #eeeeee solid;\n}\n#upload .filelist li p.imgWrap.notimage i.file-preview {\n    margin-top: 15px;\n}\n\n#upload .filelist li img {\n    width: 100%;\n}\n\n#upload .filelist li p.error {\n    background: #f43838;\n    color: #fff;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    height: 28px;\n    line-height: 28px;\n    width: 100%;\n    z-index: 100;\n    display:none;\n}\n\n#upload .filelist li .success {\n    display: block;\n    position: absolute;\n    left: 0;\n    bottom: 0;\n    height: 40px;\n    width: 100%;\n    z-index: 200;\n    background: url(./images/success.png) no-repeat right bottom;\n    background-image: url(./images/success.gif) \\9;\n}\n\n#upload .filelist li.filePickerBlock {\n    width: 113px;\n    height: 113px;\n    background: url(./images/image.png) no-repeat center 12px;\n    border: 1px solid #eeeeee;\n    border-radius: 0;\n}\n#upload .filelist li.filePickerBlock div.webuploader-pick  {\n    width: 100%;\n    height: 100%;\n    margin: 0;\n    padding: 0;\n    opacity: 0;\n    background: none;\n    font-size: 0;\n}\n\n#upload .filelist div.file-panel {\n    position: absolute;\n    height: 0;\n    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \\0;\n    background: rgba(0, 0, 0, 0.5);\n    width: 100%;\n    top: 0;\n    left: 0;\n    overflow: hidden;\n    z-index: 300;\n}\n\n#upload .filelist div.file-panel span {\n    width: 24px;\n    height: 24px;\n    display: inline;\n    float: right;\n    text-indent: -9999px;\n    overflow: hidden;\n    background: url(./images/icons.png) no-repeat;\n    background: url(./images/icons.gif) no-repeat \\9;\n    margin: 5px 1px 1px;\n    cursor: pointer;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n}\n\n#upload .filelist div.file-panel span.rotateLeft {\n    display:none;\n    background-position: 0 -24px;\n}\n\n#upload .filelist div.file-panel span.rotateLeft:hover {\n    background-position: 0 0;\n}\n\n#upload .filelist div.file-panel span.rotateRight {\n    display:none;\n    background-position: -24px -24px;\n}\n\n#upload .filelist div.file-panel span.rotateRight:hover {\n    background-position: -24px 0;\n}\n\n#upload .filelist div.file-panel span.cancel {\n    background-position: -48px -24px;\n}\n\n#upload .filelist div.file-panel span.cancel:hover {\n    background-position: -48px 0;\n}\n\n#upload .statusBar {\n    height: 45px;\n    border-bottom: 1px solid #dadada;\n    margin: 0 10px;\n    padding: 0;\n    line-height: 45px;\n    vertical-align: middle;\n    position: relative;\n}\n\n#upload .statusBar .progress {\n    border: 1px solid #1483d8;\n    width: 198px;\n    background: #fff;\n    height: 18px;\n    position: absolute;\n    top: 12px;\n    display: none;\n    text-align: center;\n    line-height: 18px;\n    color: #6dbfff;\n    margin: 0 10px 0 0;\n}\n#upload .statusBar .progress span.percentage {\n    width: 0;\n    height: 100%;\n    left: 0;\n    top: 0;\n    background: #1483d8;\n    position: absolute;\n}\n#upload .statusBar .progress span.text {\n    position: relative;\n    z-index: 10;\n}\n\n#upload .statusBar .info {\n    display: inline-block;\n    font-size: 14px;\n    color: #666666;\n}\n\n#upload .statusBar .btns {\n    position: absolute;\n    top: 7px;\n    right: 0;\n    line-height: 30px;\n}\n\n#filePickerBtn {\n    display: inline-block;\n    float: left;\n}\n#upload .statusBar .btns .webuploader-pick,\n#upload .statusBar .btns .uploadBtn,\n#upload .statusBar .btns .uploadBtn.state-uploading,\n#upload .statusBar .btns .uploadBtn.state-paused {\n    background: #ffffff;\n    border: 1px solid #cfcfcf;\n    color: #565656;\n    padding: 0 18px;\n    display: inline-block;\n    border-radius: 3px;\n    margin-left: 10px;\n    cursor: pointer;\n    font-size: 14px;\n    float: left;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n}\n#upload .statusBar .btns .webuploader-pick-hover,\n#upload .statusBar .btns .uploadBtn:hover,\n#upload .statusBar .btns .uploadBtn.state-uploading:hover,\n#upload .statusBar .btns .uploadBtn.state-paused:hover {\n    background: #f0f0f0;\n}\n\n#upload .statusBar .btns .uploadBtn,\n#upload .statusBar .btns .uploadBtn.state-paused{\n    background: #00b7ee;\n    color: #fff;\n    border-color: transparent;\n}\n#upload .statusBar .btns .uploadBtn:hover,\n#upload .statusBar .btns .uploadBtn.state-paused:hover{\n    background: #00a2d4;\n}\n\n#upload .statusBar .btns .uploadBtn.disabled {\n    pointer-events: none;\n    filter:alpha(opacity=60);\n    -moz-opacity:0.6;\n    -khtml-opacity: 0.6;\n    opacity: 0.6;\n}\n\n\n/* 在线文件的文件预览图标 */\ni.file-preview {\n    display: block;\n    margin: 10px auto;\n    width: 70px;\n    height: 70px;\n    background-image: url(\"./images/file-icons.png\");\n    background-image: url(\"./images/file-icons.gif\") \\9;\n    background-position: -140px center;\n    background-repeat: no-repeat;\n}\ni.file-preview.file-type-dir{\n    background-position: 0 center;\n}\ni.file-preview.file-type-file{\n    background-position: -140px center;\n}\ni.file-preview.file-type-filelist{\n    background-position: -210px center;\n}\ni.file-preview.file-type-zip,\ni.file-preview.file-type-rar,\ni.file-preview.file-type-7z,\ni.file-preview.file-type-tar,\ni.file-preview.file-type-gz,\ni.file-preview.file-type-bz2{\n    background-position: -280px center;\n}\ni.file-preview.file-type-xls,\ni.file-preview.file-type-xlsx{\n    background-position: -350px center;\n}\ni.file-preview.file-type-doc,\ni.file-preview.file-type-docx{\n    background-position: -420px center;\n}\ni.file-preview.file-type-ppt,\ni.file-preview.file-type-pptx{\n    background-position: -490px center;\n}\ni.file-preview.file-type-vsd{\n    background-position: -560px center;\n}\ni.file-preview.file-type-pdf{\n    background-position: -630px center;\n}\ni.file-preview.file-type-txt,\ni.file-preview.file-type-md,\ni.file-preview.file-type-json,\ni.file-preview.file-type-htm,\ni.file-preview.file-type-xml,\ni.file-preview.file-type-html,\ni.file-preview.file-type-js,\ni.file-preview.file-type-css,\ni.file-preview.file-type-php,\ni.file-preview.file-type-jsp,\ni.file-preview.file-type-asp{\n    background-position: -700px center;\n}\ni.file-preview.file-type-apk{\n    background-position: -770px center;\n}\ni.file-preview.file-type-exe{\n    background-position: -840px center;\n}\ni.file-preview.file-type-ipa{\n    background-position: -910px center;\n}\ni.file-preview.file-type-mp4,\ni.file-preview.file-type-swf,\ni.file-preview.file-type-mkv,\ni.file-preview.file-type-avi,\ni.file-preview.file-type-flv,\ni.file-preview.file-type-mov,\ni.file-preview.file-type-mpg,\ni.file-preview.file-type-mpeg,\ni.file-preview.file-type-ogv,\ni.file-preview.file-type-webm,\ni.file-preview.file-type-rm,\ni.file-preview.file-type-rmvb{\n    background-position: -980px center;\n}\ni.file-preview.file-type-ogg,\ni.file-preview.file-type-wav,\ni.file-preview.file-type-wmv,\ni.file-preview.file-type-mid,\ni.file-preview.file-type-mp3{\n    background-position: -1050px center;\n}\ni.file-preview.file-type-jpg,\ni.file-preview.file-type-jpeg,\ni.file-preview.file-type-gif,\ni.file-preview.file-type-bmp,\ni.file-preview.file-type-png,\ni.file-preview.file-type-psd{\n    background-position: -140px center;\n}"
  },
  {
    "path": "static/common/user/uedit/dialogs/video/video.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n        \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"video.css\" />\n</head>\n<body>\n<div class=\"wrapper\">\n    <div id=\"videoTab\">\n        <div id=\"tabHeads\" class=\"tabhead\">\n            <span tabSrc=\"video\" class=\"focus\" data-content-id=\"video\"><var id=\"lang_tab_insertV\"></var></span>\n            <span tabSrc=\"upload\" data-content-id=\"upload\"><var id=\"lang_tab_uploadV\"></var></span>\n        </div>\n        <div id=\"tabBodys\" class=\"tabbody\">\n            <div id=\"video\" class=\"panel focus\">\n               <table><tr><td><label for=\"videoUrl\" class=\"url\"><var id=\"lang_video_url\"></var></label></td><td><input id=\"videoUrl\" type=\"text\"></td></tr></table>\n               <div id=\"preview\"></div>\n               <div id=\"videoInfo\">\n                   <fieldset>\n                       <legend><var id=\"lang_video_size\"></var></legend>\n                       <table>\n                           <tr><td><label for=\"videoWidth\"><var id=\"lang_videoW\"></var></label></td><td><input class=\"txt\" id=\"videoWidth\" type=\"text\"/></td></tr>\n                           <tr><td><label for=\"videoHeight\"><var id=\"lang_videoH\"></var></label></td><td><input class=\"txt\" id=\"videoHeight\" type=\"text\"/></td></tr>\n                       </table>\n                   </fieldset>\n                   <fieldset>\n                      <legend><var id=\"lang_alignment\"></var></legend>\n                      <div id=\"videoFloat\"></div>\n                  </fieldset>\n               </div>\n            </div>\n            <div id=\"upload\" class=\"panel\">\n                <div id=\"upload_left\">\n                    <div id=\"queueList\" class=\"queueList\">\n                        <div class=\"statusBar element-invisible\">\n                            <div class=\"progress\">\n                                <span class=\"text\">0%</span>\n                                <span class=\"percentage\"></span>\n                            </div><div class=\"info\"></div>\n                            <div class=\"btns\">\n                                <div id=\"filePickerBtn\"></div>\n                                <div class=\"uploadBtn\"><var id=\"lang_start_upload\"></var></div>\n                            </div>\n                        </div>\n                        <div id=\"dndArea\" class=\"placeholder\">\n                            <div class=\"filePickerContainer\">\n                                <div id=\"filePickerReady\"></div>\n                            </div>\n                        </div>\n                        <ul class=\"filelist element-invisible\">\n                            <li id=\"filePickerBlock\" class=\"filePickerBlock\"></li>\n                        </ul>\n                    </div>\n                </div>\n                <div id=\"uploadVideoInfo\">\n                    <fieldset>\n                        <legend><var id=\"lang_upload_size\"></var></legend>\n                        <table>\n                            <tr><td><label><var id=\"lang_upload_width\"></var></label></td><td><input class=\"txt\" id=\"upload_width\" type=\"text\"/></td></tr>\n                            <tr><td><label><var id=\"lang_upload_height\"></var></label></td><td><input class=\"txt\" id=\"upload_height\" type=\"text\"/></td></tr>\n                        </table>\n                    </fieldset>\n                    <fieldset>\n                        <legend><var id=\"lang_upload_alignment\"></var></legend>\n                        <div id=\"upload_alignment\"></div>\n                    </fieldset>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n<!-- jquery -->\n<script type=\"text/javascript\" src=\"../../third-party/jquery-1.10.2.min.js\"></script>\n\n<!-- webuploader -->\n<script type=\"text/javascript\" src=\"../../third-party/webuploader/webuploader.min.js\"></script>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"../../third-party/webuploader/webuploader.css\">\n\n<!-- video -->\n<script type=\"text/javascript\" src=\"video.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/video/video.js",
    "content": "/**\n * Created by JetBrains PhpStorm.\n * User: taoqili\n * Date: 12-2-20\n * Time: 上午11:19\n * To change this template use File | Settings | File Templates.\n */\n\n(function(){\n\n    var video = {},\n        uploadVideoList = [],\n        isModifyUploadVideo = false,\n        uploadFile;\n\n    window.onload = function(){\n        $focus($G(\"videoUrl\"));\n        initTabs();\n        initVideo();\n        initUpload();\n    };\n\n    /* 初始化tab标签 */\n    function initTabs(){\n        var tabs = $G('tabHeads').children;\n        for (var i = 0; i < tabs.length; i++) {\n            domUtils.on(tabs[i], \"click\", function (e) {\n                var j, bodyId, target = e.target || e.srcElement;\n                for (j = 0; j < tabs.length; j++) {\n                    bodyId = tabs[j].getAttribute('data-content-id');\n                    if(tabs[j] == target){\n                        domUtils.addClass(tabs[j], 'focus');\n                        domUtils.addClass($G(bodyId), 'focus');\n                    }else {\n                        domUtils.removeClasses(tabs[j], 'focus');\n                        domUtils.removeClasses($G(bodyId), 'focus');\n                    }\n                }\n            });\n        }\n    }\n\n    function initVideo(){\n        createAlignButton( [\"videoFloat\", \"upload_alignment\"] );\n        addUrlChangeListener($G(\"videoUrl\"));\n        addOkListener();\n\n        //编辑视频时初始化相关信息\n        (function(){\n            var img = editor.selection.getRange().getClosedNode(),url;\n            if(img && img.className){\n                var hasFakedClass = (img.className == \"edui-faked-video\"),\n                    hasUploadClass = img.className.indexOf(\"edui-upload-video\")!=-1;\n                if(hasFakedClass || hasUploadClass) {\n                    $G(\"videoUrl\").value = url = img.getAttribute(\"_url\");\n                    $G(\"videoWidth\").value = img.width;\n                    $G(\"videoHeight\").value = img.height;\n                    var align = domUtils.getComputedStyle(img,\"float\"),\n                        parentAlign = domUtils.getComputedStyle(img.parentNode,\"text-align\");\n                    updateAlignButton(parentAlign===\"center\"?\"center\":align);\n                }\n                if(hasUploadClass) {\n                    isModifyUploadVideo = true;\n                }\n            }\n            createPreviewVideo(url);\n        })();\n    }\n\n    /**\n     * 监听确认和取消两个按钮事件，用户执行插入或者清空正在播放的视频实例操作\n     */\n    function addOkListener(){\n        dialog.onok = function(){\n            $G(\"preview\").innerHTML = \"\";\n            var currentTab =  findFocus(\"tabHeads\",\"tabSrc\");\n            switch(currentTab){\n                case \"video\":\n                    return insertSingle();\n                    break;\n                case \"videoSearch\":\n                    return insertSearch(\"searchList\");\n                    break;\n                case \"upload\":\n                    return insertUpload();\n                    break;\n            }\n        };\n        dialog.oncancel = function(){\n            $G(\"preview\").innerHTML = \"\";\n        };\n    }\n\n    /**\n     * 依据传入的align值更新按钮信息\n     * @param align\n     */\n    function updateAlignButton( align ) {\n        var aligns = $G( \"videoFloat\" ).children;\n        for ( var i = 0, ci; ci = aligns[i++]; ) {\n            if ( ci.getAttribute( \"name\" ) == align ) {\n                if ( ci.className !=\"focus\" ) {\n                    ci.className = \"focus\";\n                }\n            } else {\n                if ( ci.className ==\"focus\" ) {\n                    ci.className = \"\";\n                }\n            }\n        }\n    }\n\n    /**\n     * 将单个视频信息插入编辑器中\n     */\n    function insertSingle(){\n        var width = $G(\"videoWidth\"),\n            height = $G(\"videoHeight\"),\n            url=$G('videoUrl').value,\n            align = findFocus(\"videoFloat\",\"name\");\n        if(!url) return false;\n        if ( !checkNum( [width, height] ) ) return false;\n        editor.execCommand('insertvideo', {\n            url: convert_url(url),\n            width: width.value,\n            height: height.value,\n            align: align\n        }, isModifyUploadVideo ? 'upload':null);\n    }\n\n    /**\n     * 将元素id下的所有代表视频的图片插入编辑器中\n     * @param id\n     */\n    function insertSearch(id){\n        var imgs = domUtils.getElementsByTagName($G(id),\"img\"),\n            videoObjs=[];\n        for(var i=0,img; img=imgs[i++];){\n            if(img.getAttribute(\"selected\")){\n                videoObjs.push({\n                    url:img.getAttribute(\"ue_video_url\"),\n                    width:420,\n                    height:280,\n                    align:\"none\"\n                });\n            }\n        }\n        editor.execCommand('insertvideo',videoObjs);\n    }\n\n    /**\n     * 找到id下具有focus类的节点并返回该节点下的某个属性\n     * @param id\n     * @param returnProperty\n     */\n    function findFocus( id, returnProperty ) {\n        var tabs = $G( id ).children,\n                property;\n        for ( var i = 0, ci; ci = tabs[i++]; ) {\n            if ( ci.className==\"focus\" ) {\n                property = ci.getAttribute( returnProperty );\n                break;\n            }\n        }\n        return property;\n    }\n    function convert_url(url){\n        if ( !url ) return '';\n        url = utils.trim(url)\n            .replace(/v\\.youku\\.com\\/v_show\\/id_([\\w\\-=]+)\\.html/i, 'player.youku.com/player.php/sid/$1/v.swf')\n            .replace(/(www\\.)?youtube\\.com\\/watch\\?v=([\\w\\-]+)/i, \"www.youtube.com/v/$2\")\n            .replace(/youtu.be\\/(\\w+)$/i, \"www.youtube.com/v/$1\")\n            .replace(/v\\.ku6\\.com\\/.+\\/([\\w\\.]+)\\.html.*$/i, \"player.ku6.com/refer/$1/v.swf\")\n            .replace(/www\\.56\\.com\\/u\\d+\\/v_([\\w\\-]+)\\.html/i, \"player.56.com/v_$1.swf\")\n            .replace(/www.56.com\\/w\\d+\\/play_album\\-aid\\-\\d+_vid\\-([^.]+)\\.html/i, \"player.56.com/v_$1.swf\")\n            .replace(/v\\.pps\\.tv\\/play_([\\w]+)\\.html.*$/i, \"player.pps.tv/player/sid/$1/v.swf\")\n            .replace(/www\\.letv\\.com\\/ptv\\/vplay\\/([\\d]+)\\.html.*$/i, \"i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0\")\n            .replace(/www\\.tudou\\.com\\/programs\\/view\\/([\\w\\-]+)\\/?/i, \"www.tudou.com/v/$1\")\n            .replace(/v\\.qq\\.com\\/cover\\/[\\w]+\\/[\\w]+\\/([\\w]+)\\.html/i, \"static.video.qq.com/TPout.swf?vid=$1\")\n            .replace(/v\\.qq\\.com\\/.+[\\?\\&]vid=([^&]+).*$/i, \"static.video.qq.com/TPout.swf?vid=$1\")\n            .replace(/my\\.tv\\.sohu\\.com\\/[\\w]+\\/[\\d]+\\/([\\d]+)\\.shtml.*$/i, \"share.vrs.sohu.com/my/v.swf&id=$1\");\n\n        return url;\n    }\n\n    /**\n      * 检测传入的所有input框中输入的长宽是否是正数\n      * @param nodes input框集合，\n      */\n     function checkNum( nodes ) {\n         for ( var i = 0, ci; ci = nodes[i++]; ) {\n             var value = ci.value;\n             if ( !isNumber( value ) && value) {\n                 alert( lang.numError );\n                 ci.value = \"\";\n                 ci.focus();\n                 return false;\n             }\n         }\n         return true;\n     }\n\n    /**\n     * 数字判断\n     * @param value\n     */\n    function isNumber( value ) {\n        return /(0|^[1-9]\\d*$)/.test( value );\n    }\n\n    /**\n      * 创建图片浮动选择按钮\n      * @param ids\n      */\n     function createAlignButton( ids ) {\n         for ( var i = 0, ci; ci = ids[i++]; ) {\n             var floatContainer = $G( ci ),\n                     nameMaps = {\"none\":lang['default'], \"left\":lang.floatLeft, \"right\":lang.floatRight, \"center\":lang.block};\n             for ( var j in nameMaps ) {\n                 var div = document.createElement( \"div\" );\n                 div.setAttribute( \"name\", j );\n                 if ( j == \"none\" ) div.className=\"focus\";\n                 div.style.cssText = \"background:url(images/\" + j + \"_focus.jpg);\";\n                 div.setAttribute( \"title\", nameMaps[j] );\n                 floatContainer.appendChild( div );\n             }\n             switchSelect( ci );\n         }\n     }\n\n    /**\n     * 选择切换\n     * @param selectParentId\n     */\n    function switchSelect( selectParentId ) {\n        var selects = $G( selectParentId ).children;\n        for ( var i = 0, ci; ci = selects[i++]; ) {\n            domUtils.on( ci, \"click\", function () {\n                for ( var j = 0, cj; cj = selects[j++]; ) {\n                    cj.className = \"\";\n                    cj.removeAttribute && cj.removeAttribute( \"class\" );\n                }\n                this.className = \"focus\";\n            } )\n        }\n    }\n\n    /**\n     * 监听url改变事件\n     * @param url\n     */\n    function addUrlChangeListener(url){\n        if (browser.ie) {\n            url.onpropertychange = function () {\n                createPreviewVideo( this.value );\n            }\n        } else {\n            url.addEventListener( \"input\", function () {\n                createPreviewVideo( this.value );\n            }, false );\n        }\n    }\n\n    /**\n     * 根据url生成视频预览\n     * @param url\n     */\n    function createPreviewVideo(url){\n        if ( !url )return;\n\n        var conUrl = convert_url(url);\n\n        conUrl = utils.unhtmlForUrl(conUrl);\n\n        $G(\"preview\").innerHTML = '<div class=\"previewMsg\"><span>'+lang.urlError+'</span></div>'+\n        '<embed class=\"previewVideo\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"' +\n            ' src=\"' + conUrl + '\"' +\n            ' width=\"' + 420  + '\"' +\n            ' height=\"' + 280  + '\"' +\n            ' wmode=\"transparent\" play=\"true\" loop=\"false\" menu=\"false\" allowscriptaccess=\"never\" allowfullscreen=\"true\" >' +\n        '</embed>';\n    }\n\n\n    /* 插入上传视频 */\n    function insertUpload(){\n        var videoObjs=[],\n            uploadDir = editor.getOpt('videoUrlPrefix'),\n            width = parseInt($G('upload_width').value, 10) || 420,\n            height = parseInt($G('upload_height').value, 10) || 280,\n            align = findFocus(\"upload_alignment\",\"name\") || 'none';\n        for(var key in uploadVideoList) {\n            var file = uploadVideoList[key];\n            videoObjs.push({\n                url: uploadDir + file.url,\n                width:width,\n                height:height,\n                align:align\n            });\n        }\n\n        var count = uploadFile.getQueueCount();\n        if (count) {\n            $('.info', '#queueList').html('<span style=\"color:red;\">' + '还有2个未上传文件'.replace(/[\\d]/, count) + '</span>');\n            return false;\n        } else {\n            editor.execCommand('insertvideo', videoObjs, 'upload');\n        }\n    }\n\n    /*初始化上传标签*/\n    function initUpload(){\n        uploadFile = new UploadFile('queueList');\n    }\n\n\n    /* 上传附件 */\n    function UploadFile(target) {\n        this.$wrap = target.constructor == String ? $('#' + target) : $(target);\n        this.init();\n    }\n    UploadFile.prototype = {\n        init: function () {\n            this.fileList = [];\n            this.initContainer();\n            this.initUploader();\n        },\n        initContainer: function () {\n            this.$queue = this.$wrap.find('.filelist');\n        },\n        /* 初始化容器 */\n        initUploader: function () {\n            var _this = this,\n                $ = jQuery,    // just in case. Make sure it's not an other libaray.\n                $wrap = _this.$wrap,\n            // 图片容器\n                $queue = $wrap.find('.filelist'),\n            // 状态栏，包括进度和控制按钮\n                $statusBar = $wrap.find('.statusBar'),\n            // 文件总体选择信息。\n                $info = $statusBar.find('.info'),\n            // 上传按钮\n                $upload = $wrap.find('.uploadBtn'),\n            // 上传按钮\n                $filePickerBtn = $wrap.find('.filePickerBtn'),\n            // 上传按钮\n                $filePickerBlock = $wrap.find('.filePickerBlock'),\n            // 没选择文件之前的内容。\n                $placeHolder = $wrap.find('.placeholder'),\n            // 总体进度条\n                $progress = $statusBar.find('.progress').hide(),\n            // 添加的文件数量\n                fileCount = 0,\n            // 添加的文件总大小\n                fileSize = 0,\n            // 优化retina, 在retina下这个值是2\n                ratio = window.devicePixelRatio || 1,\n            // 缩略图大小\n                thumbnailWidth = 113 * ratio,\n                thumbnailHeight = 113 * ratio,\n            // 可能有pedding, ready, uploading, confirm, done.\n                state = '',\n            // 所有文件的进度信息，key为file id\n                percentages = {},\n                supportTransition = (function () {\n                    var s = document.createElement('p').style,\n                        r = 'transition' in s ||\n                            'WebkitTransition' in s ||\n                            'MozTransition' in s ||\n                            'msTransition' in s ||\n                            'OTransition' in s;\n                    s = null;\n                    return r;\n                })(),\n            // WebUploader实例\n                uploader,\n                actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')),\n                fileMaxSize = editor.getOpt('videoMaxSize'),\n                acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\\./g, ',').replace(/^[,]/, '');;\n\n            if (!WebUploader.Uploader.support()) {\n                $('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();\n                return;\n            } else if (!editor.getOpt('videoActionName')) {\n                $('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();\n                return;\n            }\n\n            uploader = _this.uploader = WebUploader.create({\n                pick: {\n                    id: '#filePickerReady',\n                    label: lang.uploadSelectFile\n                },\n                swf: '../../third-party/webuploader/Uploader.swf',\n                server: actionUrl,\n                fileVal: editor.getOpt('videoFieldName'),\n                duplicate: true,\n                fileSingleSizeLimit: fileMaxSize,\n                compress: false\n            });\n            uploader.addButton({\n                id: '#filePickerBlock'\n            });\n            uploader.addButton({\n                id: '#filePickerBtn',\n                label: lang.uploadAddFile\n            });\n\n            setState('pedding');\n\n            // 当有文件添加进来时执行，负责view的创建\n            function addFile(file) {\n                var $li = $('<li id=\"' + file.id + '\">' +\n                        '<p class=\"title\">' + file.name + '</p>' +\n                        '<p class=\"imgWrap\"></p>' +\n                        '<p class=\"progress\"><span></span></p>' +\n                        '</li>'),\n\n                    $btns = $('<div class=\"file-panel\">' +\n                        '<span class=\"cancel\">' + lang.uploadDelete + '</span>' +\n                        '<span class=\"rotateRight\">' + lang.uploadTurnRight + '</span>' +\n                        '<span class=\"rotateLeft\">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),\n                    $prgress = $li.find('p.progress span'),\n                    $wrap = $li.find('p.imgWrap'),\n                    $info = $('<p class=\"error\"></p>').hide().appendTo($li),\n\n                    showError = function (code) {\n                        switch (code) {\n                            case 'exceed_size':\n                                text = lang.errorExceedSize;\n                                break;\n                            case 'interrupt':\n                                text = lang.errorInterrupt;\n                                break;\n                            case 'http':\n                                text = lang.errorHttp;\n                                break;\n                            case 'not_allow_type':\n                                text = lang.errorFileType;\n                                break;\n                            default:\n                                text = lang.errorUploadRetry;\n                                break;\n                        }\n                        $info.text(text).show();\n                    };\n\n                if (file.getStatus() === 'invalid') {\n                    showError(file.statusText);\n                } else {\n                    $wrap.text(lang.uploadPreview);\n                    if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {\n                        $wrap.empty().addClass('notimage').append('<i class=\"file-preview file-type-' + file.ext.toLowerCase() + '\"></i>' +\n                            '<span class=\"file-title\">' + file.name + '</span>');\n                    } else {\n                        if (browser.ie && browser.version <= 7) {\n                            $wrap.text(lang.uploadNoPreview);\n                        } else {\n                            uploader.makeThumb(file, function (error, src) {\n                                if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) {\n                                    $wrap.text(lang.uploadNoPreview);\n                                } else {\n                                    var $img = $('<img src=\"' + src + '\">');\n                                    $wrap.empty().append($img);\n                                    $img.on('error', function () {\n                                        $wrap.text(lang.uploadNoPreview);\n                                    });\n                                }\n                            }, thumbnailWidth, thumbnailHeight);\n                        }\n                    }\n                    percentages[ file.id ] = [ file.size, 0 ];\n                    file.rotation = 0;\n\n                    /* 检查文件格式 */\n                    if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {\n                        showError('not_allow_type');\n                        uploader.removeFile(file);\n                    }\n                }\n\n                file.on('statuschange', function (cur, prev) {\n                    if (prev === 'progress') {\n                        $prgress.hide().width(0);\n                    } else if (prev === 'queued') {\n                        $li.off('mouseenter mouseleave');\n                        $btns.remove();\n                    }\n                    // 成功\n                    if (cur === 'error' || cur === 'invalid') {\n                        showError(file.statusText);\n                        percentages[ file.id ][ 1 ] = 1;\n                    } else if (cur === 'interrupt') {\n                        showError('interrupt');\n                    } else if (cur === 'queued') {\n                        percentages[ file.id ][ 1 ] = 0;\n                    } else if (cur === 'progress') {\n                        $info.hide();\n                        $prgress.css('display', 'block');\n                    } else if (cur === 'complete') {\n                    }\n\n                    $li.removeClass('state-' + prev).addClass('state-' + cur);\n                });\n\n                $li.on('mouseenter', function () {\n                    $btns.stop().animate({height: 30});\n                });\n                $li.on('mouseleave', function () {\n                    $btns.stop().animate({height: 0});\n                });\n\n                $btns.on('click', 'span', function () {\n                    var index = $(this).index(),\n                        deg;\n\n                    switch (index) {\n                        case 0:\n                            uploader.removeFile(file);\n                            return;\n                        case 1:\n                            file.rotation += 90;\n                            break;\n                        case 2:\n                            file.rotation -= 90;\n                            break;\n                    }\n\n                    if (supportTransition) {\n                        deg = 'rotate(' + file.rotation + 'deg)';\n                        $wrap.css({\n                            '-webkit-transform': deg,\n                            '-mos-transform': deg,\n                            '-o-transform': deg,\n                            'transform': deg\n                        });\n                    } else {\n                        $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');\n                    }\n\n                });\n\n                $li.insertBefore($filePickerBlock);\n            }\n\n            // 负责view的销毁\n            function removeFile(file) {\n                var $li = $('#' + file.id);\n                delete percentages[ file.id ];\n                updateTotalProgress();\n                $li.off().find('.file-panel').off().end().remove();\n            }\n\n            function updateTotalProgress() {\n                var loaded = 0,\n                    total = 0,\n                    spans = $progress.children(),\n                    percent;\n\n                $.each(percentages, function (k, v) {\n                    total += v[ 0 ];\n                    loaded += v[ 0 ] * v[ 1 ];\n                });\n\n                percent = total ? loaded / total : 0;\n\n                spans.eq(0).text(Math.round(percent * 100) + '%');\n                spans.eq(1).css('width', Math.round(percent * 100) + '%');\n                updateStatus();\n            }\n\n            function setState(val, files) {\n\n                if (val != state) {\n\n                    var stats = uploader.getStats();\n\n                    $upload.removeClass('state-' + state);\n                    $upload.addClass('state-' + val);\n\n                    switch (val) {\n\n                        /* 未选择文件 */\n                        case 'pedding':\n                            $queue.addClass('element-invisible');\n                            $statusBar.addClass('element-invisible');\n                            $placeHolder.removeClass('element-invisible');\n                            $progress.hide(); $info.hide();\n                            uploader.refresh();\n                            break;\n\n                        /* 可以开始上传 */\n                        case 'ready':\n                            $placeHolder.addClass('element-invisible');\n                            $queue.removeClass('element-invisible');\n                            $statusBar.removeClass('element-invisible');\n                            $progress.hide(); $info.show();\n                            $upload.text(lang.uploadStart);\n                            uploader.refresh();\n                            break;\n\n                        /* 上传中 */\n                        case 'uploading':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadPause);\n                            break;\n\n                        /* 暂停上传 */\n                        case 'paused':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadContinue);\n                            break;\n\n                        case 'confirm':\n                            $progress.show(); $info.hide();\n                            $upload.text(lang.uploadStart);\n\n                            stats = uploader.getStats();\n                            if (stats.successNum && !stats.uploadFailNum) {\n                                setState('finish');\n                                return;\n                            }\n                            break;\n\n                        case 'finish':\n                            $progress.hide(); $info.show();\n                            if (stats.uploadFailNum) {\n                                $upload.text(lang.uploadRetry);\n                            } else {\n                                $upload.text(lang.uploadStart);\n                            }\n                            break;\n                    }\n\n                    state = val;\n                    updateStatus();\n\n                }\n\n                if (!_this.getQueueCount()) {\n                    $upload.addClass('disabled')\n                } else {\n                    $upload.removeClass('disabled')\n                }\n\n            }\n\n            function updateStatus() {\n                var text = '', stats;\n\n                if (state === 'ready') {\n                    text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));\n                } else if (state === 'confirm') {\n                    stats = uploader.getStats();\n                    if (stats.uploadFailNum) {\n                        text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);\n                    }\n                } else {\n                    stats = uploader.getStats();\n                    text = lang.updateStatusFinish.replace('_', fileCount).\n                        replace('_KB', WebUploader.formatSize(fileSize)).\n                        replace('_', stats.successNum);\n\n                    if (stats.uploadFailNum) {\n                        text += lang.updateStatusError.replace('_', stats.uploadFailNum);\n                    }\n                }\n\n                $info.html(text);\n            }\n\n            uploader.on('fileQueued', function (file) {\n                fileCount++;\n                fileSize += file.size;\n\n                if (fileCount === 1) {\n                    $placeHolder.addClass('element-invisible');\n                    $statusBar.show();\n                }\n\n                addFile(file);\n            });\n\n            uploader.on('fileDequeued', function (file) {\n                fileCount--;\n                fileSize -= file.size;\n\n                removeFile(file);\n                updateTotalProgress();\n            });\n\n            uploader.on('filesQueued', function (file) {\n                if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {\n                    setState('ready');\n                }\n                updateTotalProgress();\n            });\n\n            uploader.on('all', function (type, files) {\n                switch (type) {\n                    case 'uploadFinished':\n                        setState('confirm', files);\n                        break;\n                    case 'startUpload':\n                        /* 添加额外的GET参数 */\n                        var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',\n                            url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);\n                        uploader.option('server', url);\n                        setState('uploading', files);\n                        break;\n                    case 'stopUpload':\n                        setState('paused', files);\n                        break;\n                }\n            });\n\n            uploader.on('uploadBeforeSend', function (file, data, header) {\n                //这里可以通过data对象添加POST参数\n                header['X_Requested_With'] = 'XMLHttpRequest';\n            });\n\n            uploader.on('uploadProgress', function (file, percentage) {\n                var $li = $('#' + file.id),\n                    $percent = $li.find('.progress span');\n\n                $percent.css('width', percentage * 100 + '%');\n                percentages[ file.id ][ 1 ] = percentage;\n                updateTotalProgress();\n            });\n\n            uploader.on('uploadSuccess', function (file, ret) {\n                var $file = $('#' + file.id);\n                try {\n                    var responseText = (ret._raw || ret),\n                        json = utils.str2json(responseText);\n                    if (json.state == 'SUCCESS') {\n                        uploadVideoList.push({\n                            'url': json.url,\n                            'type': json.type,\n                            'original':json.original\n                        });\n                        $file.append('<span class=\"success\"></span>');\n                    } else {\n                        $file.find('.error').text(json.state).show();\n                    }\n                } catch (e) {\n                    $file.find('.error').text(lang.errorServerUpload).show();\n                }\n            });\n\n            uploader.on('uploadError', function (file, code) {\n            });\n            uploader.on('error', function (code, file) {\n                if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {\n                    addFile(file);\n                }\n            });\n            uploader.on('uploadComplete', function (file, ret) {\n            });\n\n            $upload.on('click', function () {\n                if ($(this).hasClass('disabled')) {\n                    return false;\n                }\n\n                if (state === 'ready') {\n                    uploader.upload();\n                } else if (state === 'paused') {\n                    uploader.upload();\n                } else if (state === 'uploading') {\n                    uploader.stop();\n                }\n            });\n\n            $upload.addClass('state-' + state);\n            updateTotalProgress();\n        },\n        getQueueCount: function () {\n            var file, i, status, readyFile = 0, files = this.uploader.getFiles();\n            for (i = 0; file = files[i++]; ) {\n                status = file.getStatus();\n                if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;\n            }\n            return readyFile;\n        },\n        refresh: function(){\n            this.uploader.refresh();\n        }\n    };\n\n})();\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/webapp/webapp.html",
    "content": "<!DOCTYPE>\n<html>\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        .wrapper{width: 540px; margin: 10px auto;}\n        #appShow {border: 1px solid #ddd;}\n        .errorMsg{font-size: 13px;margin: 10px;color: #dd0000}\n    </style>\n</head>\n<body>\n    <div class=\"wrapper\">\n        <div id=\"appShow\"></div>\n    </div>\n    <script type=\"text/javascript\">\n        //此处配置您在百度上申请到的appkey。\n        var apikey = editor.options.webAppKey;\n        if ( apikey && apikey.length == 24 ) {\n            var searchConfig = {\n                container:'appShow', //容器ID\n                tips:\"\", //该值用于自动清空\n                search:1, //是否显示搜索框\n                ps:12, //每页显示的条数\n                suggest:1, //是否开启搜索自动完成\n                limit:0, //搜索结果显示条数，0表示无限制\n                searchNow:0, //是否在初始化完成时立即搜索\n                apikey:apikey, //每人得\n                pager:1,\n                cid:7134562,\n                outputHTML:1\n            },baiduApp;\n\n            function clickCallback() {\n                baiduApp.addEventListener( 'getAppHTML', function ( e, data ) {\n                    var url = 'http://app.baidu.com/app/enter?appid='+data.data['app_id'] +'&tn=app_canvas&app_spce_id=1&apikey='+apikey+'&api_key=' + apikey;\n                    editor.execCommand( \"webapp\", {url:url,width:data.uniWidth,height:data.uniHeight+60,logo:data.data['app_logo'],title:data.data['app_name']});\n                    dialog.close();\n                } );\n            }\n\n            var script = document.createElement( \"script\" );\n            script.type = \"text/javascript\";\n            script.src = \"http://app.baidu.com/appweb/api/search?auto=yes&container=container&apikey=\" + apikey + \"&instanceName=baiduApp&callback=clickCallback&config=searchConfig\";\n            document.body.appendChild( script );\n        } else {\n            $G( \"appShow\" ).innerHTML = \"<p class='errorMsg'>\"+lang.tip1+\"<a title='\"+lang.anthorApi+\"' href='http://app.baidu.com/static/cms/getapikey.html' target='_blank'>\"+lang.applyFor+\"</a></p><p class='errorMsg'>\"+lang.tip2+\"</p>\" ;\n        }\n\n    </script>\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/wordimage/tangram.js",
    "content": "// Copyright (c) 2009, Baidu Inc. All rights reserved.\n// \n// Licensed under the BSD License\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n//      http:// tangram.baidu.com/license.html\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n /**\n * @namespace T Tangram七巧板\n * @name T\n * @version 1.6.0\n*/\n\n/**\n * 声明baidu包\n * @author: allstar, erik, meizz, berg\n */\nvar T,\n    baidu = T = baidu || {version: \"1.5.0\"};\nbaidu.guid = \"$BAIDU$\";\nbaidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}};\n\n/**\n * 使用flash资源封装的一些功能\n * @namespace baidu.flash\n */\nbaidu.flash = baidu.flash || {};\n\n/**\n * 操作dom的方法\n * @namespace baidu.dom \n */\nbaidu.dom = baidu.dom || {};\n\n\n/**\n * 从文档中获取指定的DOM元素\n * @name baidu.dom.g\n * @function\n * @grammar baidu.dom.g(id)\n * @param {string|HTMLElement} id 元素的id或DOM元素.\n * @shortcut g,T.G\n * @meta standard\n * @see baidu.dom.q\n *\n * @return {HTMLElement|null} 获取的元素，查找不到时返回null,如果参数不合法，直接返回参数.\n */\nbaidu.dom.g = function(id) {\n    if (!id) return null;\n    if ('string' == typeof id || id instanceof String) {\n        return document.getElementById(id);\n    } else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {\n        return id;\n    }\n    return null;\n};\nbaidu.g = baidu.G = baidu.dom.g;\n\n\n/**\n * 操作数组的方法\n * @namespace baidu.array\n */\n\nbaidu.array = baidu.array || {};\n\n\n/**\n * 遍历数组中所有元素\n * @name baidu.array.each\n * @function\n * @grammar baidu.array.each(source, iterator[, thisObject])\n * @param {Array} source 需要遍历的数组\n * @param {Function} iterator 对每个数组元素进行调用的函数，该函数有两个参数，第一个为数组元素，第二个为数组索引值，function (item, index)。\n * @param {Object} [thisObject] 函数调用时的this指针，如果没有此参数，默认是当前遍历的数组\n * @remark\n * each方法不支持对Object的遍历,对Object的遍历使用baidu.object.each 。\n * @shortcut each\n * @meta standard\n *             \n * @returns {Array} 遍历的数组\n */\n \nbaidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) {\n    var returnValue, item, i, len = source.length;\n    \n    if ('function' == typeof iterator) {\n        for (i = 0; i < len; i++) {\n            item = source[i];\n            returnValue = iterator.call(thisObject || source, item, i);\n    \n            if (returnValue === false) {\n                break;\n            }\n        }\n    }\n    return source;\n};\n\n/**\n * 对语言层面的封装，包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。\n * @namespace baidu.lang\n */\nbaidu.lang = baidu.lang || {};\n\n\n/**\n * 判断目标参数是否为function或Function实例\n * @name baidu.lang.isFunction\n * @function\n * @grammar baidu.lang.isFunction(source)\n * @param {Any} source 目标参数\n * @version 1.2\n * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate\n * @meta standard\n * @returns {boolean} 类型判断结果\n */\nbaidu.lang.isFunction = function (source) {\n    return '[object Function]' == Object.prototype.toString.call(source);\n};\n\n/**\n * 判断目标参数是否string类型或String对象\n * @name baidu.lang.isString\n * @function\n * @grammar baidu.lang.isString(source)\n * @param {Any} source 目标参数\n * @shortcut isString\n * @meta standard\n * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate\n *             \n * @returns {boolean} 类型判断结果\n */\nbaidu.lang.isString = function (source) {\n    return '[object String]' == Object.prototype.toString.call(source);\n};\nbaidu.isString = baidu.lang.isString;\n\n\n/**\n * 判断浏览器类型和特性的属性\n * @namespace baidu.browser\n */\nbaidu.browser = baidu.browser || {};\n\n\n/**\n * 判断是否为opera浏览器\n * @property opera opera版本号\n * @grammar baidu.browser.opera\n * @meta standard\n * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome\n * @returns {Number} opera版本号\n */\n\n/**\n * opera 从10开始不是用opera后面的字符串进行版本的判断\n * 在Browser identification最后添加Version + 数字进行版本标识\n * opera后面的数字保持在9.80不变\n */\nbaidu.browser.opera = /opera(\\/| )(\\d+(\\.\\d+)?)(.+?(version\\/(\\d+(\\.\\d+)?)))?/i.test(navigator.userAgent) ?  + ( RegExp[\"\\x246\"] || RegExp[\"\\x242\"] ) : undefined;\n\n\n/**\n * 在目标元素的指定位置插入HTML代码\n * @name baidu.dom.insertHTML\n * @function\n * @grammar baidu.dom.insertHTML(element, position, html)\n * @param {HTMLElement|string} element 目标元素或目标元素的id\n * @param {string} position 插入html的位置信息，取值为beforeBegin,afterBegin,beforeEnd,afterEnd\n * @param {string} html 要插入的html\n * @remark\n * \n * 对于position参数，大小写不敏感<br>\n * 参数的意思：beforeBegin&lt;span&gt;afterBegin   this is span! beforeEnd&lt;/span&gt; afterEnd <br />\n * 此外，如果使用本函数插入带有script标签的HTML字符串，script标签对应的脚本将不会被执行。\n * \n * @shortcut insertHTML\n * @meta standard\n *             \n * @returns {HTMLElement} 目标元素\n */\nbaidu.dom.insertHTML = function (element, position, html) {\n    element = baidu.dom.g(element);\n    var range,begin;\n    if (element.insertAdjacentHTML && !baidu.browser.opera) {\n        element.insertAdjacentHTML(position, html);\n    } else {\n        range = element.ownerDocument.createRange();\n        position = position.toUpperCase();\n        if (position == 'AFTERBEGIN' || position == 'BEFOREEND') {\n            range.selectNodeContents(element);\n            range.collapse(position == 'AFTERBEGIN');\n        } else {\n            begin = position == 'BEFOREBEGIN';\n            range[begin ? 'setStartBefore' : 'setEndAfter'](element);\n            range.collapse(begin);\n        }\n        range.insertNode(range.createContextualFragment(html));\n    }\n    return element;\n};\n\nbaidu.insertHTML = baidu.dom.insertHTML;\n\n/**\n * 操作flash对象的方法，包括创建flash对象、获取flash对象以及判断flash插件的版本号\n * @namespace baidu.swf\n */\nbaidu.swf = baidu.swf || {};\n\n\n/**\n * 浏览器支持的flash插件版本\n * @property version 浏览器支持的flash插件版本\n * @grammar baidu.swf.version\n * @return {String} 版本号\n * @meta standard\n */\nbaidu.swf.version = (function () {\n    var n = navigator;\n    if (n.plugins && n.mimeTypes.length) {\n        var plugin = n.plugins[\"Shockwave Flash\"];\n        if (plugin && plugin.description) {\n            return plugin.description\n                    .replace(/([a-zA-Z]|\\s)+/, \"\")\n                    .replace(/(\\s)+r/, \".\") + \".0\";\n        }\n    } else if (window.ActiveXObject && !window.opera) {\n        for (var i = 12; i >= 2; i--) {\n            try {\n                var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i);\n                if (c) {\n                    var version = c.GetVariable(\"$version\");\n                    return version.replace(/WIN/g,'').replace(/,/g,'.');\n                }\n            } catch(e) {}\n        }\n    }\n})();\n\n/**\n * 操作字符串的方法\n * @namespace baidu.string\n */\nbaidu.string = baidu.string || {};\n\n\n/**\n * 对目标字符串进行html编码\n * @name baidu.string.encodeHTML\n * @function\n * @grammar baidu.string.encodeHTML(source)\n * @param {string} source 目标字符串\n * @remark\n * 编码字符有5个：&<>\"'\n * @shortcut encodeHTML\n * @meta standard\n * @see baidu.string.decodeHTML\n *             \n * @returns {string} html编码后的字符串\n */\nbaidu.string.encodeHTML = function (source) {\n    return String(source)\n                .replace(/&/g,'&amp;')\n                .replace(/</g,'&lt;')\n                .replace(/>/g,'&gt;')\n                .replace(/\"/g, \"&quot;\")\n                .replace(/'/g, \"&#39;\");\n};\n\nbaidu.encodeHTML = baidu.string.encodeHTML;\n\n/**\n * 创建flash对象的html字符串\n * @name baidu.swf.createHTML\n * @function\n * @grammar baidu.swf.createHTML(options)\n * \n * @param {Object} \toptions \t\t\t\t\t创建flash的选项参数\n * @param {string} \toptions.id \t\t\t\t\t要创建的flash的标识\n * @param {string} \toptions.url \t\t\t\tflash文件的url\n * @param {String} \toptions.errorMessage \t\t未安装flash player或flash player版本号过低时的提示\n * @param {string} \toptions.ver \t\t\t\t最低需要的flash player版本号\n * @param {string} \toptions.width \t\t\t\tflash的宽度\n * @param {string} \toptions.height \t\t\t\tflash的高度\n * @param {string} \toptions.align \t\t\t\tflash的对齐方式，允许值：middle/left/right/top/bottom\n * @param {string} \toptions.base \t\t\t\t设置用于解析swf文件中的所有相对路径语句的基本目录或URL\n * @param {string} \toptions.bgcolor \t\t\tswf文件的背景色\n * @param {string} \toptions.salign \t\t\t\t设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值：l/r/t/b/tl/tr/bl/br\n * @param {boolean} options.menu \t\t\t\t是否显示右键菜单，允许值：true/false\n * @param {boolean} options.loop \t\t\t\t播放到最后一帧时是否重新播放，允许值： true/false\n * @param {boolean} options.play \t\t\t\tflash是否在浏览器加载时就开始播放。允许值：true/false\n * @param {string} \toptions.quality \t\t\t设置flash播放的画质，允许值：low/medium/high/autolow/autohigh/best\n * @param {string} \toptions.scale \t\t\t\t设置flash内容如何缩放来适应设置的宽高。允许值：showall/noborder/exactfit\n * @param {string} \toptions.wmode \t\t\t\t设置flash的显示模式。允许值：window/opaque/transparent\n * @param {string} \toptions.allowscriptaccess \t设置flash与页面的通信权限。允许值：always/never/sameDomain\n * @param {string} \toptions.allownetworking \t设置swf文件中允许使用的网络API。允许值：all/internal/none\n * @param {boolean} options.allowfullscreen \t是否允许flash全屏。允许值：true/false\n * @param {boolean} options.seamlesstabbing \t允许设置执行无缝跳格，从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值：true/false\n * @param {boolean} options.devicefont \t\t\t设置静态文本对象是否以设备字体呈现。允许值：true/false\n * @param {boolean} options.swliveconnect \t\t第一次加载flash时浏览器是否应启动Java。允许值：true/false\n * @param {Object} \toptions.vars \t\t\t\t要传递给flash的参数，支持JSON或string类型。\n * \n * @see baidu.swf.create\n * @meta standard\n * @returns {string} flash对象的html字符串\n */\nbaidu.swf.createHTML = function (options) {\n    options = options || {};\n    var version = baidu.swf.version, \n        needVersion = options['ver'] || '6.0.0', \n        vUnit1, vUnit2, i, k, len, item, tmpOpt = {},\n        encodeHTML = baidu.string.encodeHTML;\n    for (k in options) {\n        tmpOpt[k] = options[k];\n    }\n    options = tmpOpt;\n    if (version) {\n        version = version.split('.');\n        needVersion = needVersion.split('.');\n        for (i = 0; i < 3; i++) {\n            vUnit1 = parseInt(version[i], 10);\n            vUnit2 = parseInt(needVersion[i], 10);\n            if (vUnit2 < vUnit1) {\n                break;\n            } else if (vUnit2 > vUnit1) {\n                return '';\n            }\n        }\n    } else {\n        return '';\n    }\n    \n    var vars = options['vars'],\n        objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align'];\n    options['align'] = options['align'] || 'middle';\n    options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000';\n    options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0';\n    options['movie'] = options['url'] || '';\n    delete options['vars'];\n    delete options['url'];\n    if ('string' == typeof vars) {\n        options['flashvars'] = vars;\n    } else {\n        var fvars = [];\n        for (k in vars) {\n            item = vars[k];\n            fvars.push(k + \"=\" + encodeURIComponent(item));\n        }\n        options['flashvars'] = fvars.join('&');\n    }\n    var str = ['<object '];\n    for (i = 0, len = objProperties.length; i < len; i++) {\n        item = objProperties[i];\n        str.push(' ', item, '=\"', encodeHTML(options[item]), '\"');\n    }\n    str.push('>');\n    var params = {\n        'wmode'             : 1,\n        'scale'             : 1,\n        'quality'           : 1,\n        'play'              : 1,\n        'loop'              : 1,\n        'menu'              : 1,\n        'salign'            : 1,\n        'bgcolor'           : 1,\n        'base'              : 1,\n        'allowscriptaccess' : 1,\n        'allownetworking'   : 1,\n        'allowfullscreen'   : 1,\n        'seamlesstabbing'   : 1,\n        'devicefont'        : 1,\n        'swliveconnect'     : 1,\n        'flashvars'         : 1,\n        'movie'             : 1\n    };\n    \n    for (k in options) {\n        item = options[k];\n        k = k.toLowerCase();\n        if (params[k] && (item || item === false || item === 0)) {\n            str.push('<param name=\"' + k + '\" value=\"' + encodeHTML(item) + '\" />');\n        }\n    }\n    options['src']  = options['movie'];\n    options['name'] = options['id'];\n    delete options['id'];\n    delete options['movie'];\n    delete options['classid'];\n    delete options['codebase'];\n    options['type'] = 'application/x-shockwave-flash';\n    options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer';\n    str.push('<embed');\n    var salign;\n    for (k in options) {\n        item = options[k];\n        if (item || item === false || item === 0) {\n            if ((new RegExp(\"^salign\\x24\", \"i\")).test(k)) {\n                salign = item;\n                continue;\n            }\n            \n            str.push(' ', k, '=\"', encodeHTML(item), '\"');\n        }\n    }\n    \n    if (salign) {\n        str.push(' salign=\"', encodeHTML(salign), '\"');\n    }\n    str.push('></embed></object>');\n    \n    return str.join('');\n};\n\n\n/**\n * 在页面中创建一个flash对象\n * @name baidu.swf.create\n * @function\n * @grammar baidu.swf.create(options[, container])\n * \n * @param {Object} \toptions \t\t\t\t\t创建flash的选项参数\n * @param {string} \toptions.id \t\t\t\t\t要创建的flash的标识\n * @param {string} \toptions.url \t\t\t\tflash文件的url\n * @param {String} \toptions.errorMessage \t\t未安装flash player或flash player版本号过低时的提示\n * @param {string} \toptions.ver \t\t\t\t最低需要的flash player版本号\n * @param {string} \toptions.width \t\t\t\tflash的宽度\n * @param {string} \toptions.height \t\t\t\tflash的高度\n * @param {string} \toptions.align \t\t\t\tflash的对齐方式，允许值：middle/left/right/top/bottom\n * @param {string} \toptions.base \t\t\t\t设置用于解析swf文件中的所有相对路径语句的基本目录或URL\n * @param {string} \toptions.bgcolor \t\t\tswf文件的背景色\n * @param {string} \toptions.salign \t\t\t\t设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值：l/r/t/b/tl/tr/bl/br\n * @param {boolean} options.menu \t\t\t\t是否显示右键菜单，允许值：true/false\n * @param {boolean} options.loop \t\t\t\t播放到最后一帧时是否重新播放，允许值： true/false\n * @param {boolean} options.play \t\t\t\tflash是否在浏览器加载时就开始播放。允许值：true/false\n * @param {string} \toptions.quality \t\t\t设置flash播放的画质，允许值：low/medium/high/autolow/autohigh/best\n * @param {string} \toptions.scale \t\t\t\t设置flash内容如何缩放来适应设置的宽高。允许值：showall/noborder/exactfit\n * @param {string} \toptions.wmode \t\t\t\t设置flash的显示模式。允许值：window/opaque/transparent\n * @param {string} \toptions.allowscriptaccess \t设置flash与页面的通信权限。允许值：always/never/sameDomain\n * @param {string} \toptions.allownetworking \t设置swf文件中允许使用的网络API。允许值：all/internal/none\n * @param {boolean} options.allowfullscreen \t是否允许flash全屏。允许值：true/false\n * @param {boolean} options.seamlesstabbing \t允许设置执行无缝跳格，从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值：true/false\n * @param {boolean} options.devicefont \t\t\t设置静态文本对象是否以设备字体呈现。允许值：true/false\n * @param {boolean} options.swliveconnect \t\t第一次加载flash时浏览器是否应启动Java。允许值：true/false\n * @param {Object} \toptions.vars \t\t\t\t要传递给flash的参数，支持JSON或string类型。\n * \n * @param {HTMLElement|string} [container] \t\tflash对象的父容器元素，不传递该参数时在当前代码位置创建flash对象。\n * @meta standard\n * @see baidu.swf.createHTML,baidu.swf.getMovie\n */\nbaidu.swf.create = function (options, target) {\n    options = options || {};\n    var html = baidu.swf.createHTML(options) \n               || options['errorMessage'] \n               || '';\n                \n    if (target && 'string' == typeof target) {\n        target = document.getElementById(target);\n    }\n    baidu.dom.insertHTML( target || document.body ,'beforeEnd',html );\n};\n/**\n * 判断是否为ie浏览器\n * @name baidu.browser.ie\n * @field\n * @grammar baidu.browser.ie\n * @returns {Number} IE版本号\n */\nbaidu.browser.ie = baidu.ie = /msie (\\d+\\.\\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\\x241']) : undefined;\n\n/**\n * 移除数组中的项\n * @name baidu.array.remove\n * @function\n * @grammar baidu.array.remove(source, match)\n * @param {Array} source 需要移除项的数组\n * @param {Any} match 要移除的项\n * @meta standard\n * @see baidu.array.removeAt\n *             \n * @returns {Array} 移除后的数组\n */\nbaidu.array.remove = function (source, match) {\n    var len = source.length;\n        \n    while (len--) {\n        if (len in source && source[len] === match) {\n            source.splice(len, 1);\n        }\n    }\n    return source;\n};\n\n/**\n * 判断目标参数是否Array对象\n * @name baidu.lang.isArray\n * @function\n * @grammar baidu.lang.isArray(source)\n * @param {Any} source 目标参数\n * @meta standard\n * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate\n *             \n * @returns {boolean} 类型判断结果\n */\nbaidu.lang.isArray = function (source) {\n    return '[object Array]' == Object.prototype.toString.call(source);\n};\n\n\n\n/**\n * 将一个变量转换成array\n * @name baidu.lang.toArray\n * @function\n * @grammar baidu.lang.toArray(source)\n * @param {mix} source 需要转换成array的变量\n * @version 1.3\n * @meta standard\n * @returns {array} 转换后的array\n */\nbaidu.lang.toArray = function (source) {\n    if (source === null || source === undefined)\n        return [];\n    if (baidu.lang.isArray(source))\n        return source;\n    if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) {\n        return [source];\n    }\n    if (source.item) {\n        var l = source.length, array = new Array(l);\n        while (l--)\n            array[l] = source[l];\n        return array;\n    }\n\n    return [].slice.call(source);\n};\n\n/**\n * 获得flash对象的实例\n * @name baidu.swf.getMovie\n * @function\n * @grammar baidu.swf.getMovie(name)\n * @param {string} name flash对象的名称\n * @see baidu.swf.create\n * @meta standard\n * @returns {HTMLElement} flash对象的实例\n */\nbaidu.swf.getMovie = function (name) {\n\tvar movie = document[name], ret;\n    return baidu.browser.ie == 9 ?\n    \tmovie && movie.length ? \n    \t\t(ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){\n    \t\t\treturn item.tagName.toLowerCase() != \"embed\";\n    \t\t})).length == 1 ? ret[0] : ret\n    \t\t: movie\n    \t: movie || window[name];\n};\n\n\nbaidu.flash._Base = (function(){\n   \n    var prefix = 'bd__flash__';\n\n    /**\n     * 创建一个随机的字符串\n     * @private\n     * @return {String}\n     */\n    function _createString(){\n        return  prefix + Math.floor(Math.random() * 2147483648).toString(36);\n    };\n   \n    /**\n     * 检查flash状态\n     * @private\n     * @param {Object} target flash对象\n     * @return {Boolean}\n     */\n    function _checkReady(target){\n        if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){\n            return true;\n        }else{\n            return false;\n        }\n    };\n\n    /**\n     * 调用之前进行压栈的函数\n     * @private\n     * @param {Array} callQueue 调用队列\n     * @param {Object} target flash对象\n     * @return {Null}\n     */\n    function _callFn(callQueue, target){\n        var result = null;\n        \n        callQueue = callQueue.reverse();\n        baidu.each(callQueue, function(item){\n            result = target.call(item.fnName, item.params);\n            item.callBack(result);\n        });\n    };\n\n    /**\n     * 为传入的匿名函数创建函数名\n     * @private\n     * @param {String|Function} fun 传入的匿名函数或者函数名\n     * @return {String}\n     */\n    function _createFunName(fun){\n        var name = '';\n\n        if(baidu.lang.isFunction(fun)){\n            name = _createString();\n            window[name] = function(){\n                fun.apply(window, arguments);\n            };\n\n            return name;\n        }else if(baidu.lang.isString){\n            return fun;\n        }\n    };\n\n    /**\n     * 绘制flash\n     * @private\n     * @param {Object} options 创建参数\n     * @return {Object} \n     */\n    function _render(options){\n        if(!options.id){\n            options.id = _createString();\n        }\n        \n        var container = options.container || '';\n        delete(options.container);\n        \n        baidu.swf.create(options, container);\n        \n        return baidu.swf.getMovie(options.id);\n    };\n\n    return function(options, callBack){\n        var me = this,\n            autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true),\n            createOptions = options.createOptions || {},\n            target = null,\n            isReady = false,\n            callQueue = [],\n            timeHandle = null,\n            callBack = callBack || [];\n\n        /**\n         * 将flash文件绘制到页面上\n         * @public\n         * @return {Null}\n         */\n        me.render = function(){\n            target = _render(createOptions);\n            \n            if(callBack.length > 0){\n                baidu.each(callBack, function(funName, index){\n                    callBack[index] = _createFunName(options[funName] || new Function());\n                });    \n            }\n            me.call('setJSFuncName', [callBack]);\n        };\n\n        /**\n         * 返回flash状态\n         * @return {Boolean}\n         */\n        me.isReady = function(){\n            return isReady;\n        };\n\n        /**\n         * 调用flash接口的统一入口\n         * @param {String} fnName 调用的函数名\n         * @param {Array} params 传入的参数组成的数组,若不许要参数，需传入空数组\n         * @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数，如无返回值，可以不传入此参数\n         * @return {Null}\n        */\n        me.call = function(fnName, params, callBack){\n            if(!fnName) return null;\n            callBack = callBack || new Function();\n\n            var result = null;\n    \n            if(isReady){\n                result = target.call(fnName, params);\n                callBack(result);\n            }else{\n                callQueue.push({\n                    fnName: fnName,\n                    params: params,\n                    callBack: callBack\n                });\n    \n                (!timeHandle) && (timeHandle = setInterval(_check, 200));\n            }\n        };\n    \n        /**\n         * 为传入的匿名函数创建函数名\n         * @public\n         * @param {String|Function} fun 传入的匿名函数或者函数名\n         * @return {String}\n         */\n        me.createFunName = function(fun){\n            return _createFunName(fun);    \n        };\n\n        /**\n         * 检查flash是否ready， 并进行调用\n         * @private\n         * @return {Null}\n         */\n        function _check(){\n            if(_checkReady(target)){\n                clearInterval(timeHandle);\n                timeHandle = null;\n                _call();\n\n                isReady = true;\n            }               \n        };\n\n        /**\n         * 调用之前进行压栈的函数\n         * @private\n         * @return {Null}\n         */\n        function _call(){\n            _callFn(callQueue, target);\n            callQueue = [];\n        }\n\n        autoRender && me.render(); \n    };\n})();\n\n\n\n/**\n * 创建flash based imageUploader\n * @class\n * @grammar baidu.flash.imageUploader(options)\n * @param {Object} createOptions 创建flash时需要的参数，请参照baidu.swf.create文档\n * @config {Object} vars 创建imageUploader时所需要的参数\n * @config {Number} vars.gridWidth 每一个预览图片所占的宽度，应该为flash寛的整除\n * @config {Number} vars.gridHeight 每一个预览图片所占的高度，应该为flash高的整除\n * @config {Number} vars.picWidth 单张预览图片的宽度\n * @config {Number} vars.picHeight 单张预览图片的高度\n * @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata'\n * @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc'\n * @config {Number} vars.maxSize 文件的最大体积,单位'MB'\n * @config {Number} vars.compressSize 上传前如果图片体积超过该值，会先压缩\n * @config {Number} vars.maxNum:32 最大上传多少个文件\n * @config {Number} vars.compressLength 能接受的最大边长，超过该值会等比压缩\n * @config {String} vars.url 上传的url地址\n * @config {Number} vars.mode mode == 0时，是使用滚动条，mode == 1时，拉伸flash, 默认值为0\n * @see baidu.swf.createHTML\n * @param {String} backgroundUrl 背景图片路径\n * @param {String} listBacgroundkUrl 布局控件背景\n * @param {String} buttonUrl 按钮图片不背景\n * @param {String|Function} selectFileCallback 选择文件的回调\n * @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调\n * @param {String|Function} deleteFileCallback 删除文件的回调\n * @param {String|Function} startUploadCallback 开始上传某个文件时的回调\n * @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调\n * @param {String|Function} uploadErrorCallback 某个文件上传失败的回调\n * @param {String|Function} allCompleteCallback 全部上传完成时的回调\n * @param {String|Function} changeFlashHeight 改变Flash的高度，mode==1的时候才有用\n */ \nbaidu.flash.imageUploader = baidu.flash.imageUploader || function(options){\n   \n    var me = this,\n        options = options || {},\n        _flash = new baidu.flash._Base(options, [\n            'selectFileCallback', \n            'exceedFileCallback', \n            'deleteFileCallback', \n            'startUploadCallback',\n            'uploadCompleteCallback',\n            'uploadErrorCallback',\n            'allCompleteCallback',\n            'changeFlashHeight'\n        ]);\n    /**\n     * 开始或回复上传图片\n     * @public\n     * @return {Null}\n     */\n    me.upload = function(){\n        _flash.call('upload');\n    };\n\n    /**\n     * 暂停上传图片\n     * @public\n     * @return {Null}\n     */\n    me.pause = function(){\n        _flash.call('pause');\n    };\n    me.addCustomizedParams = function(index,obj){\n        _flash.call('addCustomizedParams',[index,obj]);\n    }\n};\n\n/**\n * 操作原生对象的方法\n * @namespace baidu.object\n */\nbaidu.object = baidu.object || {};\n\n\n/**\n * 将源对象的所有属性拷贝到目标对象中\n * @author erik\n * @name baidu.object.extend\n * @function\n * @grammar baidu.object.extend(target, source)\n * @param {Object} target 目标对象\n * @param {Object} source 源对象\n * @see baidu.array.merge\n * @remark\n * \n1.目标对象中，与源对象key相同的成员将会被覆盖。<br>\n2.源对象的prototype成员不会拷贝。\n\t\t\n * @shortcut extend\n * @meta standard\n *             \n * @returns {Object} 目标对象\n */\nbaidu.extend =\nbaidu.object.extend = function (target, source) {\n    for (var p in source) {\n        if (source.hasOwnProperty(p)) {\n            target[p] = source[p];\n        }\n    }\n    \n    return target;\n};\n\n\n\n\n\n/**\n * 创建flash based fileUploader\n * @class\n * @grammar baidu.flash.fileUploader(options)\n * @param {Object} options\n * @config {Object} createOptions 创建flash时需要的参数，请参照baidu.swf.create文档\n * @config {String} createOptions.width\n * @config {String} createOptions.height\n * @config {Number} maxNum 最大可选文件数\n * @config {Function|String} selectFile\n * @config {Function|String} exceedMaxSize\n * @config {Function|String} deleteFile\n * @config {Function|String} uploadStart\n * @config {Function|String} uploadComplete\n * @config {Function|String} uploadError\n * @config {Function|String} uploadProgress\n */\nbaidu.flash.fileUploader = baidu.flash.fileUploader || function(options){\n    var me = this,\n        options = options || {};\n    \n    options.createOptions = baidu.extend({\n        wmod: 'transparent'\n    },options.createOptions || {});\n    \n    var _flash = new baidu.flash._Base(options, [\n        'selectFile',\n        'exceedMaxSize',\n        'deleteFile',\n        'uploadStart',\n        'uploadComplete',\n        'uploadError', \n        'uploadProgress'\n    ]);\n\n    _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]);\n\n    /**\n     * 设置当鼠标移动到flash上时，是否变成手型\n     * @public\n     * @param {Boolean} isCursor\n     * @return {Null}\n     */\n    me.setHandCursor = function(isCursor){\n        _flash.call('setHandCursor', [isCursor || false]);\n    };\n\n    /**\n     * 设置鼠标相应函数名\n     * @param {String|Function} fun\n     */\n    me.setMSFunName = function(fun){\n        _flash.call('setMSFunName',[_flash.createFunName(fun)]);\n    }; \n\n    /**\n     * 执行上传操作\n     * @param {String} url 上传的url\n     * @param {String} fieldName 上传的表单字段名\n     * @param {Object} postData 键值对，上传的POST数据\n     * @param {Number|Array|null|-1} [index]上传的文件序列\n     *                            Int值上传该文件\n     *                            Array一次串行上传该序列文件\n     *                            -1/null上传所有文件\n     * @return {Null}\n     */\n    me.upload = function(url, fieldName, postData, index){\n\n        if(typeof url !== 'string' || typeof fieldName !== 'string') return null;\n        if(typeof index === 'undefined') index = -1;\n\n        _flash.call('upload', [url, fieldName, postData, index]);\n    };\n\n    /**\n     * 取消上传操作\n     * @public\n     * @param {Number|-1} index\n     */\n    me.cancel = function(index){\n        if(typeof index === 'undefined') index = -1;\n        _flash.call('cancel', [index]);\n    };\n\n    /**\n     * 删除文件\n     * @public\n     * @param {Number|Array} [index] 要删除的index，不传则全部删除\n     * @param {Function} callBack\n     * */\n    me.deleteFile = function(index, callBack){\n\n        var callBackAll = function(list){\n                callBack && callBack(list);\n            };\n\n        if(typeof index === 'undefined'){\n            _flash.call('deleteFilesAll', [], callBackAll);\n            return;\n        };\n        \n        if(typeof index === 'Number') index = [index];\n        index.sort(function(a,b){\n            return b-a;\n        });\n        baidu.each(index, function(item){\n            _flash.call('deleteFileBy', item, callBackAll);\n        });\n    };\n\n    /**\n     * 添加文件类型，支持macType\n     * @public\n     * @param {Object|Array[Object]} type {description:String, extention:String}\n     * @return {Null};\n     */\n    me.addFileType = function(type){\n        var type = type || [[]];\n        \n        if(type instanceof Array) type = [type];\n        else type = [[type]];\n        _flash.call('addFileTypes', type);\n    };\n    \n    /**\n     * 设置文件类型，支持macType\n     * @public\n     * @param {Object|Array[Object]} type {description:String, extention:String}\n     * @return {Null};\n     */\n    me.setFileType = function(type){\n        var type = type || [[]];\n        \n        if(type instanceof Array) type = [type];\n        else type = [[type]];\n        _flash.call('setFileTypes', type);\n    };\n\n    /**\n     * 设置可选文件的数量限制\n     * @public\n     * @param {Number} num\n     * @return {Null}\n     */\n    me.setMaxNum = function(num){\n        _flash.call('setMaxNum', [num]);\n    };\n\n    /**\n     * 设置可选文件大小限制，以兆M为单位\n     * @public\n     * @param {Number} num,0为无限制\n     * @return {Null}\n     */\n    me.setMaxSize = function(num){\n        _flash.call('setMaxSize', [num]);\n    };\n\n    /**\n     * @public\n     */\n    me.getFileAll = function(callBack){\n        _flash.call('getFileAll', [], callBack);\n    };\n\n    /**\n     * @public\n     * @param {Number} index\n     * @param {Function} [callBack]\n     */\n    me.getFileByIndex = function(index, callBack){\n        _flash.call('getFileByIndex', [], callBack);\n    };\n\n    /**\n     * @public\n     * @param {Number} index\n     * @param {function} [callBack]\n     */\n    me.getStatusByIndex = function(index, callBack){\n        _flash.call('getStatusByIndex', [], callBack);\n    };\n};\n\n/**\n * 使用动态script标签请求服务器资源，包括由服务器端的回调和浏览器端的回调\n * @namespace baidu.sio\n */\nbaidu.sio = baidu.sio || {};\n\n/**\n * \n * @param {HTMLElement} src script节点\n * @param {String} url script节点的地址\n * @param {String} [charset] 编码\n */\nbaidu.sio._createScriptTag = function(scr, url, charset){\n    scr.setAttribute('type', 'text/javascript');\n    charset && scr.setAttribute('charset', charset);\n    scr.setAttribute('src', url);\n    document.getElementsByTagName('head')[0].appendChild(scr);\n};\n\n/**\n * 删除script的属性，再删除script标签，以解决修复内存泄漏的问题\n * \n * @param {HTMLElement} src script节点\n */\nbaidu.sio._removeScriptTag = function(scr){\n    if (scr.clearAttributes) {\n        scr.clearAttributes();\n    } else {\n        for (var attr in scr) {\n            if (scr.hasOwnProperty(attr)) {\n                delete scr[attr];\n            }\n        }\n    }\n    if(scr && scr.parentNode){\n        scr.parentNode.removeChild(scr);\n    }\n    scr = null;\n};\n\n\n/**\n * 通过script标签加载数据，加载完成由浏览器端触发回调\n * @name baidu.sio.callByBrowser\n * @function\n * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options)\n * @param {string} url 加载数据的url\n * @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名\n * @param {Object} opt_options 其他可选项\n * @config {String} [charset] script的字符集\n * @config {Integer} [timeOut] 超时时间，超过这个时间将不再响应本请求，并触发onfailure函数\n * @config {Function} [onfailure] timeOut设定后才生效，到达超时时间时触发本函数\n * @remark\n * 1、与callByServer不同，callback参数只支持Function类型，不支持string。\n * 2、如果请求了一个不存在的页面，callback函数在IE/opera下也会被调用，因此使用者需要在onsuccess函数中判断数据是否正确加载。\n * @meta standard\n * @see baidu.sio.callByServer\n */\nbaidu.sio.callByBrowser = function (url, opt_callback, opt_options) {\n    var scr = document.createElement(\"SCRIPT\"),\n        scriptLoaded = 0,\n        options = opt_options || {},\n        charset = options['charset'],\n        callback = opt_callback || function(){},\n        timeOut = options['timeOut'] || 0,\n        timer;\n    scr.onload = scr.onreadystatechange = function () {\n        if (scriptLoaded) {\n            return;\n        }\n        \n        var readyState = scr.readyState;\n        if ('undefined' == typeof readyState\n            || readyState == \"loaded\"\n            || readyState == \"complete\") {\n            scriptLoaded = 1;\n            try {\n                callback();\n                clearTimeout(timer);\n            } finally {\n                scr.onload = scr.onreadystatechange = null;\n                baidu.sio._removeScriptTag(scr);\n            }\n        }\n    };\n\n    if( timeOut ){\n        timer = setTimeout(function(){\n            scr.onload = scr.onreadystatechange = null;\n            baidu.sio._removeScriptTag(scr);\n            options.onfailure && options.onfailure();\n        }, timeOut);\n    }\n    \n    baidu.sio._createScriptTag(scr, url, charset);\n};\n\n/**\n * 通过script标签加载数据，加载完成由服务器端触发回调\n * @name baidu.sio.callByServer\n * @function\n * @grammar baidu.sio.callByServer(url, callback[, opt_options])\n * @param {string} url 加载数据的url.\n * @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数，将在URL中寻找options['queryField']做为callback的方法名.\n * @param {Object} opt_options 加载数据时的选项.\n * @config {string} [charset] script的字符集\n * @config {string} [queryField] 服务器端callback请求字段名，默认为callback\n * @config {Integer} [timeOut] 超时时间(单位：ms)，超过这个时间将不再响应本请求，并触发onfailure函数\n * @config {Function} [onfailure] timeOut设定后才生效，到达超时时间时触发本函数\n * @remark\n * 如果url中已经包含key为“options['queryField']”的query项，将会被替换成callback中参数传递或自动生成的函数名。\n * @meta standard\n * @see baidu.sio.callByBrowser\n */\nbaidu.sio.callByServer = /**@function*/function(url, callback, opt_options) {\n    var scr = document.createElement('SCRIPT'),\n        prefix = 'bd__cbs__',\n        callbackName,\n        callbackImpl,\n        options = opt_options || {},\n        charset = options['charset'],\n        queryField = options['queryField'] || 'callback',\n        timeOut = options['timeOut'] || 0,\n        timer,\n        reg = new RegExp('(\\\\?|&)' + queryField + '=([^&]*)'),\n        matches;\n\n    if (baidu.lang.isFunction(callback)) {\n        callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36);\n        window[callbackName] = getCallBack(0);\n    } else if(baidu.lang.isString(callback)){\n        callbackName = callback;\n    } else {\n        if (matches = reg.exec(url)) {\n            callbackName = matches[2];\n        }\n    }\n\n    if( timeOut ){\n        timer = setTimeout(getCallBack(1), timeOut);\n    }\n    url = url.replace(reg, '\\x241' + queryField + '=' + callbackName);\n    \n    if (url.search(reg) < 0) {\n        url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName;\n    }\n    baidu.sio._createScriptTag(scr, url, charset);\n\n    /*\n     * 返回一个函数，用于立即（挂在window上）或者超时（挂在setTimeout中）时执行\n     */\n    function getCallBack(onTimeOut){\n        /*global callbackName, callback, scr, options;*/\n        return function(){\n            try {\n                if( onTimeOut ){\n                    options.onfailure && options.onfailure();\n                }else{\n                    callback.apply(window, arguments);\n                    clearTimeout(timer);\n                }\n                window[callbackName] = null;\n                delete window[callbackName];\n            } catch (exception) {\n            } finally {\n                baidu.sio._removeScriptTag(scr);\n            }\n        }\n    }\n};\n\n/**\n * 通过请求一个图片的方式令服务器存储一条日志\n * @function\n * @grammar baidu.sio.log(url)\n * @param {string} url 要发送的地址.\n * @author: int08h,leeight\n */\nbaidu.sio.log = function(url) {\n  var img = new Image(),\n      key = 'tangram_sio_log_' + Math.floor(Math.random() *\n            2147483648).toString(36);\n  window[key] = img;\n\n  img.onload = img.onerror = img.onabort = function() {\n    img.onload = img.onerror = img.onabort = null;\n\n    window[key] = null;\n    img = null;\n  };\n  img.src = url;\n};\n\n\n\n/*\n * Tangram\n * Copyright 2009 Baidu Inc. All rights reserved.\n * \n * path: baidu/json.js\n * author: erik\n * version: 1.1.0\n * date: 2009/12/02\n */\n\n\n/**\n * 操作json对象的方法\n * @namespace baidu.json\n */\nbaidu.json = baidu.json || {};\n/*\n * Tangram\n * Copyright 2009 Baidu Inc. All rights reserved.\n * \n * path: baidu/json/parse.js\n * author: erik, berg\n * version: 1.2\n * date: 2009/11/23\n */\n\n\n\n/**\n * 将字符串解析成json对象。注：不会自动祛除空格\n * @name baidu.json.parse\n * @function\n * @grammar baidu.json.parse(data)\n * @param {string} source 需要解析的字符串\n * @remark\n * 该方法的实现与ecma-262第五版中规定的JSON.parse不同，暂时只支持传入一个参数。后续会进行功能丰富。\n * @meta standard\n * @see baidu.json.stringify,baidu.json.decode\n *             \n * @returns {JSON} 解析结果json对象\n */\nbaidu.json.parse = function (data) {\n    //2010/12/09：更新至不使用原生parse，不检测用户输入是否正确\n    return (new Function(\"return (\" + data + \")\"))();\n};\n/*\n * Tangram\n * Copyright 2009 Baidu Inc. All rights reserved.\n * \n * path: baidu/json/decode.js\n * author: erik, cat\n * version: 1.3.4\n * date: 2010/12/23\n */\n\n\n\n/**\n * 将字符串解析成json对象，为过时接口，今后会被baidu.json.parse代替\n * @name baidu.json.decode\n * @function\n * @grammar baidu.json.decode(source)\n * @param {string} source 需要解析的字符串\n * @meta out\n * @see baidu.json.encode,baidu.json.parse\n *             \n * @returns {JSON} 解析结果json对象\n */\nbaidu.json.decode = baidu.json.parse;\n/*\n * Tangram\n * Copyright 2009 Baidu Inc. All rights reserved.\n * \n * path: baidu/json/stringify.js\n * author: erik\n * version: 1.1.0\n * date: 2010/01/11\n */\n\n\n\n/**\n * 将json对象序列化\n * @name baidu.json.stringify\n * @function\n * @grammar baidu.json.stringify(value)\n * @param {JSON} value 需要序列化的json对象\n * @remark\n * 该方法的实现与ecma-262第五版中规定的JSON.stringify不同，暂时只支持传入一个参数。后续会进行功能丰富。\n * @meta standard\n * @see baidu.json.parse,baidu.json.encode\n *             \n * @returns {string} 序列化后的字符串\n */\nbaidu.json.stringify = (function () {\n    /**\n     * 字符串处理时需要转义的字符表\n     * @private\n     */\n    var escapeMap = {\n        \"\\b\": '\\\\b',\n        \"\\t\": '\\\\t',\n        \"\\n\": '\\\\n',\n        \"\\f\": '\\\\f',\n        \"\\r\": '\\\\r',\n        '\"' : '\\\\\"',\n        \"\\\\\": '\\\\\\\\'\n    };\n    \n    /**\n     * 字符串序列化\n     * @private\n     */\n    function encodeString(source) {\n        if (/[\"\\\\\\x00-\\x1f]/.test(source)) {\n            source = source.replace(\n                /[\"\\\\\\x00-\\x1f]/g, \n                function (match) {\n                    var c = escapeMap[match];\n                    if (c) {\n                        return c;\n                    }\n                    c = match.charCodeAt();\n                    return \"\\\\u00\" \n                            + Math.floor(c / 16).toString(16) \n                            + (c % 16).toString(16);\n                });\n        }\n        return '\"' + source + '\"';\n    }\n    \n    /**\n     * 数组序列化\n     * @private\n     */\n    function encodeArray(source) {\n        var result = [\"[\"], \n            l = source.length,\n            preComma, i, item;\n            \n        for (i = 0; i < l; i++) {\n            item = source[i];\n            \n            switch (typeof item) {\n            case \"undefined\":\n            case \"function\":\n            case \"unknown\":\n                break;\n            default:\n                if(preComma) {\n                    result.push(',');\n                }\n                result.push(baidu.json.stringify(item));\n                preComma = 1;\n            }\n        }\n        result.push(\"]\");\n        return result.join(\"\");\n    }\n    \n    /**\n     * 处理日期序列化时的补零\n     * @private\n     */\n    function pad(source) {\n        return source < 10 ? '0' + source : source;\n    }\n    \n    /**\n     * 日期序列化\n     * @private\n     */\n    function encodeDate(source){\n        return '\"' + source.getFullYear() + \"-\" \n                + pad(source.getMonth() + 1) + \"-\" \n                + pad(source.getDate()) + \"T\" \n                + pad(source.getHours()) + \":\" \n                + pad(source.getMinutes()) + \":\" \n                + pad(source.getSeconds()) + '\"';\n    }\n    \n    return function (value) {\n        switch (typeof value) {\n        case 'undefined':\n            return 'undefined';\n            \n        case 'number':\n            return isFinite(value) ? String(value) : \"null\";\n            \n        case 'string':\n            return encodeString(value);\n            \n        case 'boolean':\n            return String(value);\n            \n        default:\n            if (value === null) {\n                return 'null';\n            } else if (value instanceof Array) {\n                return encodeArray(value);\n            } else if (value instanceof Date) {\n                return encodeDate(value);\n            } else {\n                var result = ['{'],\n                    encode = baidu.json.stringify,\n                    preComma,\n                    item;\n                    \n                for (var key in value) {\n                    if (Object.prototype.hasOwnProperty.call(value, key)) {\n                        item = value[key];\n                        switch (typeof item) {\n                        case 'undefined':\n                        case 'unknown':\n                        case 'function':\n                            break;\n                        default:\n                            if (preComma) {\n                                result.push(',');\n                            }\n                            preComma = 1;\n                            result.push(encode(key) + ':' + encode(item));\n                        }\n                    }\n                }\n                result.push('}');\n                return result.join('');\n            }\n        }\n    };\n})();\n/*\n * Tangram\n * Copyright 2009 Baidu Inc. All rights reserved.\n * \n * path: baidu/json/encode.js\n * author: erik, cat\n * version: 1.3.4\n * date: 2010/12/23\n */\n\n\n\n/**\n * 将json对象序列化，为过时接口，今后会被baidu.json.stringify代替\n * @name baidu.json.encode\n * @function\n * @grammar baidu.json.encode(value)\n * @param {JSON} value 需要序列化的json对象\n * @meta out\n * @see baidu.json.decode,baidu.json.stringify\n *             \n * @returns {string} 序列化后的字符串\n */\nbaidu.json.encode = baidu.json.stringify;\n"
  },
  {
    "path": "static/common/user/uedit/dialogs/wordimage/wordimage.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n        \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n    <title></title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n    <script type=\"text/javascript\" src=\"../internal.js\"></script>\n    <style type=\"text/css\">\n        .wrapper{width: 600px;padding: 10px;height: 352px;overflow: hidden;position: relative;border-bottom: 1px solid #d7d7d7}\n        .localPath input{float: left;width: 350px;line-height: 20px;height: 20px;}\n        #clipboard{float:left;width: 70px;height: 30px; }\n        .description{ color: #0066cc; margin-top: 2px; width: 450px; height: 45px;float: left;line-height: 22px}\n        #upload{width: 100px;height: 30px;float: right; margin:10px 2px 0 0;cursor: pointer;}\n        #msg{ width: 140px; height: 30px; line-height:25px;float: left;color: red}\n    </style>\n</head>\n<body>\n    <div class=\"wrapper\">\n        <div class=\"localPath\">\n            <input id=\"localPath\" type=\"text\" readonly />\n            <div id=\"clipboard\"></div>\n            <div id=\"msg\"></div>\n        </div>\n        <div id=\"flashContainer\"></div>\n        <div>\n            <div id=\"upload\" style=\"display: none\" ><img id=\"uploadBtn\"></div>\n            <div class=\"description\">\n                <span style=\"color: red\"><var id=\"lang_resave\"></var>: </span><var id=\"lang_step\"></var>\n            </div>\n          </div>\n    </div>\n    <script type=\"text/javascript\" src=\"tangram.js\"></script>\n    <script type=\"text/javascript\" src=\"wordimage.js\"></script>\n    <script type=\"text/javascript\">\n        editor.setOpt({\n            wordImageFieldName:\"upfile\",\n            compressSide:0,\n            maxImageSideLength:900\n        });\n\n            //全局变量\n        var imageUrls = [],          //用于保存从服务器返回的图片信息数组\n            selectedImageCount = 0,  //当前已选择的但未上传的图片数量\n            optImageUrl = editor.getActionUrl(editor.getOpt('imageActionName')),\n            optImageFieldName = editor.getOpt('imageFieldName'),\n            optImageCompressBorder = editor.getOpt('imageCompressEnable') ? editor.getOpt('imageCompressBorder'):null,\n            maxSize = editor.getOpt('imageMaxSize') / 1024,\n            extension = editor.getOpt('imageAllowFiles').join(';').replace(/\\./g, '*.');\n\n        /* 添加额外的GET参数 */\n        var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',\n            urlWidthParams = optImageUrl + (optImageUrl.indexOf('?') == -1 ? '?':'&') + params;\n\n        utils.domReady(function(){\n            //创建Flash相关的参数集合\n            var flashOptions = {\n                container:\"flashContainer\",                                                    //flash容器id\n                url:urlWidthParams,                                           // 上传处理页面的url地址\n                ext:editor.queryCommandValue('serverParam') || {},                                 //可向服务器提交的自定义参数列表\n                fileType:'{\"description\":\"'+lang.fileType+'\", \"extension\":\"' + extension + '\"}',     //上传文件格式限制\n                flashUrl:'imageUploader.swf',                                                  //上传用的flash组件地址\n                width:600,          //flash的宽度\n                height:272,         //flash的高度\n                gridWidth:120,     // 每一个预览图片所占的宽度\n                gridHeight:120,    // 每一个预览图片所占的高度\n                picWidth:100,      // 单张预览图片的宽度\n                picHeight:100,     // 单张预览图片的高度\n                uploadDataFieldName: optImageFieldName,    // POST请求中图片数据的key\n                picDescFieldName:'pictitle',      // POST请求中图片描述的key\n                maxSize: maxSize,                         // 文件的最大体积,单位M\n                compressSize:1,                   // 上传前如果图片体积超过该值，会先压缩,单位M\n                maxNum:32,                         // 单次最大可上传多少个文件\n                compressSide: 0,                 //等比压缩的基准，0为按照最长边，1为按照宽度，2为按照高度\n                compressLength: optImageCompressBorder        //能接受的最大边长，超过该值Flash会自动等比压缩\n            };\n            //回调函数集合，支持传递函数名的字符串、函数句柄以及函数本身三种类型\n            var callbacks={\n                selectFileCallback: function(selectFiles){                // 选择文件的回调\n                    selectedImageCount += selectFiles.length;\n                    if(selectedImageCount) baidu.g(\"upload\").style.display = \"\";\n                    dialog.buttons[0].setDisabled(true); //初始化时置灰确定按钮\n                },\n                deleteFileCallback: function(delFiles){                 // 删除文件的回调\n                    selectedImageCount -= delFiles.length;\n                    if (!selectedImageCount) {\n                        baidu.g(\"upload\").style.display = \"none\";\n                        dialog.buttons[0].setDisabled(false);         //没有选择图片时重新点亮按钮\n                    }\n                },\n                uploadCompleteCallback: function(data){               // 单个文件上传完成的回调\n                    try{var info = eval(\"(\" + data.info + \")\");\n                    info && imageUrls.push(info);\n                    selectedImageCount--;\n                    }catch(e){}\n                },\n                uploadErrorCallback: function (data){         // 单个文件上传失败的回调,\n                    console && console.log(data);\n                },\n                allCompleteCallback: function(){              // 全部上传完成时的回调\n                    dialog.buttons[0].setDisabled(false);    //上传完毕后点亮按钮\n                }\n                //exceedFileCallback: 'exceedFileCallback',   // 文件超出限制的最大体积时的回调\n                //startUploadCallback: startUploadCallback    // 开始上传某个文件时的回调\n            };\n            wordImage.init(flashOptions,callbacks);\n        });\n\n    </script>\n\n</body>\n</html>"
  },
  {
    "path": "static/common/user/uedit/dialogs/wordimage/wordimage.js",
    "content": "/**\n * Created by JetBrains PhpStorm.\n * User: taoqili\n * Date: 12-1-30\n * Time: 下午12:50\n * To change this template use File | Settings | File Templates.\n */\n\n\n\nvar wordImage = {};\n//(function(){\nvar g = baidu.g,\n\tflashObj,flashContainer;\n\nwordImage.init = function(opt, callbacks) {\n\tshowLocalPath(\"localPath\");\n\t//createCopyButton(\"clipboard\",\"localPath\");\n\tcreateFlashUploader(opt, callbacks);\n\taddUploadListener();\n\taddOkListener();\n};\n\nfunction hideFlash(){\n    flashObj = null;\n    flashContainer.innerHTML = \"\";\n}\nfunction addOkListener() {\n\tdialog.onok = function() {\n\t\tif (!imageUrls.length) return;\n\t\tvar urlPrefix = editor.getOpt('imageUrlPrefix'),\n            images = domUtils.getElementsByTagName(editor.document,\"img\");\n        editor.fireEvent('saveScene');\n\t\tfor (var i = 0,img; img = images[i++];) {\n\t\t\tvar src = img.getAttribute(\"word_img\");\n\t\t\tif (!src) continue;\n\t\t\tfor (var j = 0,url; url = imageUrls[j++];) {\n\t\t\t\tif (src.indexOf(url.original.replace(\" \",\"\")) != -1) {\n\t\t\t\t\timg.src = urlPrefix + url.url;\n\t\t\t\t\timg.setAttribute(\"_src\", urlPrefix + url.url);  //同时修改\"_src\"属性\n\t\t\t\t\timg.setAttribute(\"title\",url.title);\n                    domUtils.removeAttributes(img, [\"word_img\",\"style\",\"width\",\"height\"]);\n\t\t\t\t\teditor.fireEvent(\"selectionchange\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n        editor.fireEvent('saveScene');\n        hideFlash();\n\t};\n    dialog.oncancel = function(){\n        hideFlash();\n    }\n}\n\n/**\n * 绑定开始上传事件\n */\nfunction addUploadListener() {\n\tg(\"upload\").onclick = function () {\n\t\tflashObj.upload();\n\t\tthis.style.display = \"none\";\n\t};\n}\n\nfunction showLocalPath(id) {\n    //单张编辑\n    var img = editor.selection.getRange().getClosedNode();\n    var images = editor.execCommand('wordimage');\n    if(images.length==1 || img && img.tagName == 'IMG'){\n        g(id).value = images[0];\n        return;\n    }\n\tvar path = images[0];\n    var leftSlashIndex  = path.lastIndexOf(\"/\")||0,  //不同版本的doc和浏览器都可能影响到这个符号，故直接判断两种\n        rightSlashIndex = path.lastIndexOf(\"\\\\\")||0,\n        separater = leftSlashIndex > rightSlashIndex ? \"/\":\"\\\\\" ;\n\n\tpath = path.substring(0, path.lastIndexOf(separater)+1);\n\tg(id).value = path;\n}\n\nfunction createFlashUploader(opt, callbacks) {\n    //由于lang.flashI18n是静态属性，不可以直接进行修改，否则会影响到后续内容\n    var i18n = utils.extend({},lang.flashI18n);\n    //处理图片资源地址的编码，补全等问题\n    for(var i in i18n){\n        if(!(i in {\"lang\":1,\"uploadingTF\":1,\"imageTF\":1,\"textEncoding\":1}) && i18n[i]){\n            i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + \"/images/\" + i18n[i]);\n        }\n    }\n    opt = utils.extend(opt,i18n,false);\n\tvar option = {\n\t\tcreateOptions:{\n\t\t\tid:'flash',\n\t\t\turl:opt.flashUrl,\n\t\t\twidth:opt.width,\n\t\t\theight:opt.height,\n\t\t\terrorMessage:lang.flashError,\n\t\t\twmode:browser.safari ? 'transparent' : 'window',\n\t\t\tver:'10.0.0',\n\t\t\tvars:opt,\n\t\t\tcontainer:opt.container\n\t\t}\n\t};\n\n\toption = extendProperty(callbacks, option);\n\tflashObj = new baidu.flash.imageUploader(option);\n    flashContainer = $G(opt.container);\n}\n\nfunction extendProperty(fromObj, toObj) {\n\tfor (var i in fromObj) {\n\t\tif (!toObj[i]) {\n\t\t\ttoObj[i] = fromObj[i];\n\t\t}\n\t}\n\treturn toObj;\n}\n\n//})();\n\nfunction getPasteData(id) {\n\tbaidu.g(\"msg\").innerHTML = lang.copySuccess + \"</br>\";\n\tsetTimeout(function() {\n\t\tbaidu.g(\"msg\").innerHTML = \"\";\n\t}, 5000);\n\treturn baidu.g(id).value;\n}\n\nfunction createCopyButton(id, dataFrom) {\n\tbaidu.swf.create({\n\t\t\tid:\"copyFlash\",\n\t\t\turl:\"fClipboard_ueditor.swf\",\n\t\t\twidth:\"58\",\n\t\t\theight:\"25\",\n\t\t\terrorMessage:\"\",\n\t\t\tbgColor:\"#CBCBCB\",\n\t\t\twmode:\"transparent\",\n\t\t\tver:\"10.0.0\",\n\t\t\tvars:{\n\t\t\t\ttid:dataFrom\n\t\t\t}\n\t\t}, id\n\t);\n\n\tvar clipboard = baidu.swf.getMovie(\"copyFlash\");\n\tvar clipinterval = setInterval(function() {\n\t\tif (clipboard && clipboard.flashInit) {\n\t\t\tclearInterval(clipinterval);\n\t\t\tclipboard.setHandCursor(true);\n\t\t\tclipboard.setContentFuncName(\"getPasteData\");\n\t\t\t//clipboard.setMEFuncName(\"mouseEventHandler\");\n\t\t}\n\t}, 500);\n}\ncreateCopyButton(\"clipboard\", \"localPath\");"
  },
  {
    "path": "static/common/user/uedit/lang/en/en.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: taoqili\n * Date: 12-6-12\n * Time: 下午6:57\n * To change this template use File | Settings | File Templates.\n */\nUE.I18N['en'] = {\n    'labelMap':{\n        'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen',\n        'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border',\n        'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote',\n        'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview',\n        'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date',\n        'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown',\n        'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code',\n        'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle',\n        'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':\"InsertParagraphBeforeTable\",\n        'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link',\n        'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap',\n        'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter',\n        'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL',\n        'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight',\n        'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default',\n        'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage',\n        'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset',\n        'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable',\n        'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts'\n    },\n    'insertorderedlist':{\n        'num':'1,2,3...',\n        'num1':'1),2),3)...',\n        'num2':'(1),(2),(3)...',\n        'cn':'一,二,三....',\n        'cn1':'一),二),三)....',\n        'cn2':'(一),(二),(三)....',\n        'decimal':'1,2,3...',\n        'lower-alpha':'a,b,c...',\n        'lower-roman':'i,ii,iii...',\n        'upper-alpha':'A,B,C...',\n        'upper-roman':'I,II,III...'\n    },\n    'insertunorderedlist':{\n        'circle':'○ Circle',\n        'disc':'● Circle dot',\n        'square':'■ Rectangle ',\n        'dash' :'－ Dash',\n        'dot' : '。dot'\n    },\n    'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'},\n    'fontfamily':{\n        'songti':'Sim Sun',\n        'kaiti':'Sim Kai',\n        'heiti':'Sim Hei',\n        'lishu':'Sim Li',\n        'yahei': 'Microsoft YaHei',\n        'andaleMono':'Andale Mono',\n        'arial': 'Arial',\n        'arialBlack':'Arial Black',\n        'comicSansMs':'Comic Sans MS',\n        'impact':'Impact',\n        'timesNewRoman':'Times New Roman'\n    },\n    'customstyle':{\n        'tc':'Title center',\n        'tl':'Title left',\n        'im':'Important',\n        'hi':'Highlight'\n    },\n    'autoupload': {\n        'exceedSizeError': 'File Size Exceed',\n        'exceedTypeError': 'File Type Not Allow',\n        'jsonEncodeError': 'Server Return Format Error',\n        'loading':\"loading...\",\n        'loadError':\"load error\",\n        'errorLoadConfig': 'Server config not loaded, upload can not work.',\n    },\n    'simpleupload':{\n        'exceedSizeError': 'File Size Exceed',\n        'exceedTypeError': 'File Type Not Allow',\n        'jsonEncodeError': 'Server Return Format Error',\n        'loading':\"loading...\",\n        'loadError':\"load error\",\n        'errorLoadConfig': 'Server config not loaded, upload can not work.',\n    },\n    'elementPathTip':\"Path\",\n    'wordCountTip':\"Word Count\",\n    'wordCountMsg':'{#count} characters entered,{#leave} left. ',\n    'wordOverFlowMsg':'<span style=\"color:red;\">The number of characters has exceeded allowable maximum values, the server may refuse to save!</span>',\n    'ok':\"OK\",\n    'cancel':\"Cancel\",\n    'closeDialog':\"closeDialog\",\n    'tableDrag':\"You must import the file uiUtils.js before drag! \",\n    'autofloatMsg':\"The plugin AutoFloat depends on EditorUI!\",\n    'loadconfigError': 'Get server config error.',\n    'loadconfigFormatError': 'Server config format error.',\n    'loadconfigHttpError': 'Get server config http error.',\n    'snapScreen_plugin':{\n        'browserMsg':\"Only IE supported!\",\n        'callBackErrorMsg':\"The callback data is wrong,please check the config!\",\n        'uploadErrorMsg':\"Upload error,please check your server environment! \"\n    },\n    'insertcode':{\n        'as3':'ActionScript 3',\n        'bash':'Bash/Shell',\n        'cpp':'C/C++',\n        'css':'CSS',\n        'cf':'ColdFusion',\n        'c#':'C#',\n        'delphi':'Delphi',\n        'diff':'Diff',\n        'erlang':'Erlang',\n        'groovy':'Groovy',\n        'html':'HTML',\n        'java':'Java',\n        'jfx':'JavaFX',\n        'js':'JavaScript',\n        'pl':'Perl',\n        'php':'PHP',\n        'plain':'Plain Text',\n        'ps':'PowerShell',\n        'python':'Python',\n        'ruby':'Ruby',\n        'scala':'Scala',\n        'sql':'SQL',\n        'vb':'Visual Basic',\n        'xml':'XML'\n    },\n    'confirmClear':\"Do you confirm to clear the Document?\",\n    'contextMenu':{\n        'delete':\"Delete\",\n        'selectall':\"Select all\",\n        'deletecode':\"Delete Code\",\n        'cleardoc':\"Clear Document\",\n        'confirmclear':\"Do you confirm to clear the Document?\",\n        'unlink':\"Unlink\",\n        'paragraph':\"Paragraph\",\n        'edittable':\"Table property\",\n        'aligncell':'Align cell',\n        'aligntable':'Table alignment',\n        'tableleft':'Left float',\n        'tablecenter':'Center',\n        'tableright':'Right float',\n        'aligntd':'Cell alignment',\n        'edittd':\"Cell property\",\n        'setbordervisible':'set table edge visible',\n        'table':\"Table\",\n        'justifyleft':'Justify Left',\n        'justifyright':'Justify Right',\n        'justifycenter':'Justify Center',\n        'justifyjustify':'Default',\n        'deletetable':\"Delete table\",\n        'insertparagraphbefore':\"InsertedBeforeLine\",\n        'insertparagraphafter':'InsertedAfterLine',\n        'inserttable':'Insert table',\n        'insertcaption':'Insert caption',\n        'deletecaption':'Delete Caption',\n        'inserttitle':'Insert Title',\n        'deletetitle':'Delete Title',\n        'inserttitlecol':'Insert Title Col',\n        'deletetitlecol':'Delete Title Col',\n        'averageDiseRow':'AverageDise Row',\n        'averageDisCol':'AverageDis Col',\n        'deleterow':\"Delete row\",\n        'deletecol':\"Delete col\",\n        'insertrow':\"Insert row\",\n        'insertcol':\"Insert col\",\n        'insertrownext':'Insert Row Next',\n        'insertcolnext':'Insert Col Next',\n        'mergeright':\"Merge right\",\n        'mergeleft':\"Merge left\",\n        'mergedown':\"Merge down\",\n        'mergecells':\"Merge cells\",\n        'splittocells':\"Split to cells\",\n        'splittocols':\"Split to Cols\",\n        'splittorows':\"Split to Rows\",\n        'tablesort':'Table sorting',\n        'enablesort':'Sorting Enable',\n        'disablesort':'Sorting Disable',\n        'reversecurrent':'Reverse current',\n        'orderbyasc':'Order By ASCII',\n        'reversebyasc':'Reverse By ASCII',\n        'orderbynum':'Order By Num',\n        'reversebynum':'Reverse By Num',\n        'borderbk':'Border shading',\n        'setcolor':'interlaced color',\n        'unsetcolor':'Cancel interlacedcolor',\n        'setbackground':'Background interlaced',\n        'unsetbackground':'Cancel Bk interlaced',\n        'redandblue':'Blue and red',\n        'threecolorgradient':'Three-color gradient',\n        'copy':\"Copy(Ctrl + c)\",\n        'copymsg':\"Browser does not support. Please use 'Ctrl + c' instead!\",\n        'paste':\"Paste(Ctrl + v)\",\n        'pastemsg':\"Browser does not support. Please use 'Ctrl + v' instead!\"\n    },\n    'copymsg': \"Browser does not support. Please use 'Ctrl + c' instead!\",\n    'pastemsg': \"Browser does not support. Please use 'Ctrl + v' instead!\",\n    'anthorMsg':\"Link\",\n    'clearColor':'Clear',\n    'standardColor':'Standard color',\n    'themeColor':'Theme color',\n    'property':'Property',\n    'default':'Default',\n    'modify':'Modify',\n    'justifyleft':'Justify Left',\n    'justifyright':'Justify Right',\n    'justifycenter':'Justify Center',\n    'justify':'Default',\n    'clear':'Clear',\n    'anchorMsg':'Anchor',\n    'delete':'Delete',\n    'clickToUpload':\"Click to upload\",\n    'unset':'Language hasn\\'t been set!',\n    't_row':'row',\n    't_col':'col',\n    'pasteOpt':'Paste Option',\n    'pasteSourceFormat':\"Keep Source Formatting\",\n    'tagFormat':'Keep tag',\n    'pasteTextFormat':'Keep Text only',\n    'more':'More',\n    'autoTypeSet':{\n        'mergeLine':\"Merge empty line\",\n        'delLine':\"Del empty line\",\n        'removeFormat':\"Remove format\",\n        'indent':\"Indent\",\n        'alignment':\"Alignment\",\n        'imageFloat':\"Image float\",\n        'removeFontsize':\"Remove font size\",\n        'removeFontFamily':\"Remove fontFamily\",\n        'removeHtml':\"Remove redundant HTML code\",\n        'pasteFilter':\"Paste filter\",\n        'run':\"Done\",\n        'symbol':'Symbol Conversion',\n        'bdc2sb':'Full-width to Half-width',\n        'tobdc':'Half-width to Full-width'\n    },\n\n    'background':{\n        'static':{\n            'lang_background_normal':'Normal',\n            'lang_background_local':'Online',\n            'lang_background_set':'Background Set',\n            'lang_background_none':'No Background',\n            'lang_background_colored':'Colored Background',\n            'lang_background_color':'Color Set',\n            'lang_background_netimg':'Net-Image',\n            'lang_background_align':'Align Type',\n            'lang_background_position':'Position',\n            'repeatType':{'options':[\"Center\", \"Repeat-x\", \"Repeat-y\", \"Tile\",\"Custom\"]}\n        },\n        'noUploadImage':\"No pictures has been uploaded！\",\n        'toggleSelect':'Change the active state by click!\\n Image Size: '\n    },\n    //===============dialog i18N=======================\n    'insertimage':{\n        'static':{\n            'lang_tab_remote':\"Insert\",\n            'lang_tab_upload':\"Local\",\n            'lang_tab_online':\"Manager\",\n            'lang_tab_search':\"Search\",\n            'lang_input_url':\"Address:\",\n            'lang_input_size':\"Size:\",\n            'lang_input_width':\"Width\",\n            'lang_input_height':\"Height\",\n            'lang_input_border':\"Border:\",\n            'lang_input_vhspace':\"Margins:\",\n            'lang_input_title':\"Title:\",\n            'lang_input_align':'Image Float Style:',\n            'lang_imgLoading':\"Loading...\",\n            'lang_start_upload':\"Start Upload\",\n            'lock':{'title':\"Lock rate\"},\n            'searchType':{'title':\"ImageType\", 'options':[\"News\", \"Wallpaper\", \"emotions\", \"photo\"]},\n            'searchTxt':{'value':\"Enter the search keyword!\"},\n            'searchBtn':{'value':\"Search\"},\n            'searchReset':{'value':\"Clear\"},\n            'noneAlign':{'title':'None Float'},\n            'leftAlign':{'title':'Left Float'},\n            'rightAlign':{'title':'Right Float'},\n            'centerAlign':{'title':'Center In A Line'}\n        },\n        'uploadSelectFile':'Select File',\n        'uploadAddFile':'Add File',\n        'uploadStart':'Start Upload',\n        'uploadPause':'Pause Upload',\n        'uploadContinue':'Continue Upload',\n        'uploadRetry':'Retry Upload',\n        'uploadDelete':'Delete',\n        'uploadTurnLeft':'Turn Left',\n        'uploadTurnRight':'Turn Right',\n        'uploadPreview':'Doing Preview',\n        'uploadNoPreview':'Can Not Preview',\n        'updateStatusReady': 'Selected _ pictures, total _KB.',\n        'updateStatusConfirm': '_ uploaded successfully and _ upload failed',\n        'updateStatusFinish': 'Total _ pictures (_KB), _  uploaded successfully',\n        'updateStatusError': ' and _ upload failed',\n        'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',\n        'errorLoadConfig': 'Server config not loaded, upload can not work.',\n        'errorExceedSize':'File Size Exceed',\n        'errorFileType':'File Type Not Allow',\n        'errorInterrupt':'File Upload Interrupted',\n        'errorUploadRetry':'Upload Error, Please Retry.',\n        'errorHttp':'Http Error',\n        'errorServerUpload':'Server Result Error.',\n        'remoteLockError':\"Cannot Lock the Proportion between width and height\",\n        'numError':\"Please enter the correct Num. e.g 123,400\",\n        'imageUrlError':\"The image format may be wrong!\",\n        'imageLoadError':\"Error,please check the network or URL！\",\n        'searchRemind':\"Enter the search keyword!\",\n        'searchLoading':\"Image is loading,please wait...\",\n        'searchRetry':\" Sorry,can't find the image,please try again!\"\n    },\n    'attachment':{\n        'static':{\n            'lang_tab_upload': 'Upload',\n            'lang_tab_online': 'Online',\n            'lang_start_upload':\"Start upload\",\n            'lang_drop_remind':\"You can drop files here, a single maximum of 300 files\"\n        },\n        'uploadSelectFile':'Select File',\n        'uploadAddFile':'Add File',\n        'uploadStart':'Start Upload',\n        'uploadPause':'Pause Upload',\n        'uploadContinue':'Continue Upload',\n        'uploadRetry':'Retry Upload',\n        'uploadDelete':'Delete',\n        'uploadTurnLeft':'Turn Left',\n        'uploadTurnRight':'Turn Right',\n        'uploadPreview':'Doing Preview',\n        'updateStatusReady': 'Selected _ files, total _KB.',\n        'updateStatusConfirm': '_ uploaded successfully and _ upload failed',\n        'updateStatusFinish': 'Total _ files (_KB), _  uploaded successfully',\n        'updateStatusError': ' and _ upload failed',\n        'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',\n        'errorLoadConfig': 'Server config not loaded, upload can not work.',\n        'errorExceedSize':'File Size Exceed',\n        'errorFileType':'File Type Not Allow',\n        'errorInterrupt':'File Upload Interrupted',\n        'errorUploadRetry':'Upload Error, Please Retry.',\n        'errorHttp':'Http Error',\n        'errorServerUpload':'Server Result Error.'\n    },\n\n    'insertvideo':{\n        'static':{\n            'lang_tab_insertV':\"Video\",\n            'lang_tab_searchV':\"Search\",\n            'lang_tab_uploadV':\"Upload\",\n            'lang_video_url':\" URL \",\n            'lang_video_size':\"Video Size\",\n            'lang_videoW':\"Width\",\n            'lang_videoH':\"Height\",\n            'lang_alignment':\"Alignment\",\n            'videoSearchTxt':{'value':\"Enter the search keyword!\"},\n            'videoType':{'options':[\"All\", \"Hot\", \"Entertainment\", \"Funny\", \"Sports\", \"Science\", \"variety\"]},\n            'videoSearchBtn':{'value':\"Search in Baidu\"},\n            'videoSearchReset':{'value':\"Clear result\"},\n\n            'lang_input_fileStatus':' No file uploaded!',\n            'startUpload':{'style':\"background:url(upload.png) no-repeat;\"},\n\n            'lang_upload_size':\"Video Size\",\n            'lang_upload_width':\"Width\",\n            'lang_upload_height':\"Height\",\n            'lang_upload_alignment':\"Alignment\",\n            'lang_format_advice':\"Recommends mp4 format.\"\n        },\n        'numError':\"Please enter the correct Num. e.g 123,400\",\n        'floatLeft':\"Float left\",\n        'floatRight':\"Float right\",\n        'default':\"Default\",\n        'block':\"Display in block\",\n        'urlError':\"The video url format may be wrong!\",\n        'loading':\" &nbsp;The video is loading, please wait…\",\n        'clickToSelect':\"Click to select\",\n        'goToSource':'Visit source video ',\n        'noVideo':\" &nbsp; &nbsp;Sorry,can't find the video,please try again!\",\n\n        'browseFiles':'Open files',\n        'uploadSuccess':'Upload Successful!',\n        'delSuccessFile':'Remove from the success of the queue',\n        'delFailSaveFile':'Remove the save failed file',\n        'statusPrompt':' file(s) uploaded! ',\n        'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!',\n        'flashLoadingError':'The Flash failed loading! Please check the path or network state',\n        'fileUploadReady':'Wait for uploading...',\n        'delUploadQueue':'Remove from the uploading queue ',\n        'limitPrompt1':'Can not choose more than single',\n        'limitPrompt2':'file(s)！Please choose again！',\n        'delFailFile':'Remove failure file',\n        'fileSizeLimit':'File size exceeds the limit！',\n        'emptyFile':'Can not upload an empty file！',\n        'fileTypeError':'File type error！',\n        'unknownError':'Unknown error！',\n        'fileUploading':'Uploading,please wait...',\n        'cancelUpload':'Cancel upload',\n        'netError':'Network error',\n        'failUpload':'Upload failed',\n        'serverIOError':'Server IO error！',\n        'noAuthority':'No Permission！',\n        'fileNumLimit':'Upload limit to the number',\n        'failCheck':'Authentication fails, the upload is skipped!',\n        'fileCanceling':'Cancel, please wait...',\n        'stopUploading':'Upload has stopped...',\n\n        'uploadSelectFile':'Select File',\n        'uploadAddFile':'Add File',\n        'uploadStart':'Start Upload',\n        'uploadPause':'Pause Upload',\n        'uploadContinue':'Continue Upload',\n        'uploadRetry':'Retry Upload',\n        'uploadDelete':'Delete',\n        'uploadTurnLeft':'Turn Left',\n        'uploadTurnRight':'Turn Right',\n        'uploadPreview':'Doing Preview',\n        'updateStatusReady': 'Selected _ files, total _KB.',\n        'updateStatusConfirm': '_ uploaded successfully and _ upload failed',\n        'updateStatusFinish': 'Total _ files (_KB), _  uploaded successfully',\n        'updateStatusError': ' and _ upload failed',\n        'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',\n        'errorLoadConfig': 'Server config not loaded, upload can not work.',\n        'errorExceedSize':'File Size Exceed',\n        'errorFileType':'File Type Not Allow',\n        'errorInterrupt':'File Upload Interrupted',\n        'errorUploadRetry':'Upload Error, Please Retry.',\n        'errorHttp':'Http Error',\n        'errorServerUpload':'Server Result Error.'\n    },\n    'webapp':{\n        'tip1':\"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!\",\n        'tip2':\"And then open the file ueditor.config.js to set it! \",\n        'applyFor':\"APPLY FOR\",\n        'anthorApi':\"Baidu API\"\n    },\n    'template':{\n        'static':{\n            'lang_template_bkcolor':'Background Color',\n            'lang_template_clear' : 'Keep Content',\n            'lang_template_select':'Select Template'\n        },\n        'blank':\"Blank\",\n        'blog':\"Blog\",\n        'resume':\"Resume\",\n        'richText':\"Rich Text\",\n        'scrPapers':\"Scientific Papers\"\n    },\n    scrawl:{\n        'static':{\n            'lang_input_previousStep':\"Previous\",\n            'lang_input_nextsStep':\"Next\",\n            'lang_input_clear':'Clear',\n            'lang_input_addPic':'AddImage',\n            'lang_input_ScalePic':'ScaleImage',\n            'lang_input_removePic':'RemoveImage',\n            'J_imgTxt':{title:'Add background image'}\n        },\n        'noScarwl':\"No paint, a white paper...\",\n        'scrawlUpLoading':\"Image is uploading, please wait...\",\n        'continueBtn':\"Try again\",\n        'imageError':\"Image failed to load!\",\n        'backgroundUploading':'Image is uploading,please wait...'\n    },\n    'music':{\n        'static':{\n            'lang_input_tips':\"Input singer/song/album, search you interested in music!\",\n            'J_searchBtn':{value:'Search songs'}\n        },\n        'emptyTxt':'Not search to the relevant music results, please change a keyword try.',\n        'chapter':'Songs',\n        'singer':'Singer',\n        'special':'Album',\n        'listenTest':'Audition'\n    },\n    anchor:{\n        'static':{\n            'lang_input_anchorName':'Anchor Name:'\n        }\n    },\n    'charts':{\n        'static':{\n            'lang_data_source':'Data source:',\n            'lang_chart_format': 'Chart format:',\n            'lang_data_align': 'Align',\n            'lang_chart_align_same': 'Consistent with the X-axis Y-axis',\n            'lang_chart_align_reverse': 'X-axis Y-axis opposite',\n            'lang_chart_title': 'Title',\n            'lang_chart_main_title': 'main title:',\n            'lang_chart_sub_title': 'sub title:',\n            'lang_chart_x_title': 'X-axis title:',\n            'lang_chart_y_title': 'Y-axis title:',\n            'lang_chart_tip': 'Prompt',\n            'lang_cahrt_tip_prefix': 'prefix:',\n            'lang_cahrt_tip_description': '仅饼图有效， 当鼠标移动到饼图中相应的块上时，提示框内的文字的前缀',\n            'lang_chart_data_unit': 'Unit',\n            'lang_chart_data_unit_title': 'unit:',\n            'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位， 比如： 温度的单位 ℃',\n            'lang_chart_type': 'Chart type:',\n            'lang_prev_btn': 'Previous',\n            'lang_next_btn': 'Next'\n        }\n    },\n    emotion:{\n        'static':{\n            'lang_input_choice':'Choice',\n            'lang_input_Tuzki':'Tuzki',\n            'lang_input_lvdouwa':'LvDouWa',\n            'lang_input_BOBO':'BOBO',\n            'lang_input_babyCat':'BabyCat',\n            'lang_input_bubble':'Bubble',\n            'lang_input_youa':'YouA'\n        }\n    },\n    gmap:{\n        'static':{\n            'lang_input_address':'Address:',\n            'lang_input_search':'Search',\n            'address':{value:\"Beijing\"}\n        },\n        searchError:'Unable to locate the address!'\n    },\n    help:{\n        'static':{\n            'lang_input_about':'About',\n            'lang_input_shortcuts':'Shortcuts',\n            'lang_input_introduction':\"UEditor is developed by Baidu Co.ltd.  It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.\",\n            'lang_Txt_shortcuts':'Shortcuts',\n            'lang_Txt_func':'Function',\n            'lang_Txt_bold':'Bold',\n            'lang_Txt_copy':'Copy',\n            'lang_Txt_cut':'Cut',\n            'lang_Txt_Paste':'Paste',\n            'lang_Txt_undo':'Undo',\n            'lang_Txt_redo':'Redo',\n            'lang_Txt_italic':'Italic',\n            'lang_Txt_underline':'Underline',\n            'lang_Txt_selectAll':'Select All',\n            'lang_Txt_visualEnter':'Submit',\n            'lang_Txt_fullscreen':'Fullscreen'\n        }\n    },\n    insertframe:{\n        'static':{\n            'lang_input_address':'Address：',\n            'lang_input_width':'Width：',\n            'lang_input_height':'height：',\n            'lang_input_isScroll':'Enable scrollbars：',\n            'lang_input_frameborder':'Show frame border：',\n            'lang_input_alignMode':'Alignment：',\n            'align':{title:\"Alignment\", options:[\"Default\", \"Left\", \"Right\", \"Center\"]}\n        },\n        'enterAddress':'Please enter an address!'\n    },\n    link:{\n        'static':{\n            'lang_input_text':'Text：',\n            'lang_input_url':'URL：',\n            'lang_input_title':'Title：',\n            'lang_input_target':'open in new window：'\n        },\n        'validLink':'Supports only effective when a link is selected',\n        'httpPrompt':'The hyperlink you enter should start with \"http|https|ftp://\"!'\n    },\n    map:{\n        'static':{\n            lang_city:\"City\",\n            lang_address:\"Address\",\n            city:{value:\"Beijing\"},\n            lang_search:\"Search\",\n            lang_dynamicmap:\"Dynamic map\"\n        },\n        cityMsg:\"Please enter the city name!\",\n        errorMsg:\"Can't find the place!\"\n    },\n    searchreplace:{\n        'static':{\n            lang_tab_search:\"Search\",\n            lang_tab_replace:\"Replace\",\n            lang_search1:\"Search\",\n            lang_search2:\"Search\",\n            lang_replace:\"Replace\",\n            lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example \"/expression/\"',\n            lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example \"/expression/\"',\n            lang_case_sensitive1:\"Case sense\",\n            lang_case_sensitive2:\"Case sense\",\n            nextFindBtn:{value:\"Next\"},\n            preFindBtn:{value:\"Preview\"},\n            nextReplaceBtn:{value:\"Next\"},\n            preReplaceBtn:{value:\"Preview\"},\n            repalceBtn:{value:\"Replace\"},\n            repalceAllBtn:{value:\"Replace all\"}\n        },\n        getEnd:\"Has the search to the bottom!\",\n        getStart:\"Has the search to the top!\",\n        countMsg:\"Altogether replaced {#count} character(s)!\"\n    },\n    snapscreen:{\n        'static':{\n            lang_showMsg:\"You should install the UEditor screenshots program first!\",\n            lang_download:\"Download!\",\n            lang_step1:\"Step1:Download the program and then run it\",\n            lang_step2:\"Step2:After complete install,try to click the button again\"\n        }\n    },\n    spechars:{\n        'static':{},\n        tsfh:\"Special\",\n        lmsz:\"Roman\",\n        szfh:\"Numeral\",\n        rwfh:\"Japanese\",\n        xlzm:\"The Greek\",\n        ewzm:\"Russian\",\n        pyzm:\"Phonetic\",\n        yyyb:\"English\",\n        zyzf:\"Others\"\n    },\n    'edittable':{\n        'static':{\n            'lang_tableStyle':'Table style',\n            'lang_insertCaption':'Add table header row',\n            'lang_insertTitle':'Add table title row',\n            'lang_insertTitleCol':'Add table title col',\n            'lang_tableSize':'Automatically adjust table size',\n            'lang_autoSizeContent':'Adaptive by form text',\n            'lang_orderbycontent':\"Table of contents sortable\",\n            'lang_autoSizePage':'Page width adaptive',\n            'lang_example':'Example',\n            'lang_borderStyle':'Table Border',\n            'lang_color':'Color:'\n        },\n        captionName:'Caption',\n        titleName:'Title',\n        cellsName:'text',\n        errorMsg:'There are merged cells, can not sort.'\n    },\n    'edittip':{\n        'static':{\n            lang_delRow:'Delete entire row',\n            lang_delCol:'Delete entire col'\n        }\n    },\n    'edittd':{\n        'static':{\n            lang_tdBkColor:'Background Color:'\n        }\n    },\n    'formula':{\n        'static':{\n        }\n    },\n    wordimage:{\n        'static':{\n            lang_resave:\"The re-save step\",\n            uploadBtn:{src:\"upload.png\", alt:\"Upload\"},\n            clipboard:{style:\"background: url(copy.png) -153px -1px no-repeat;\"},\n            lang_step:\" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process.\"\n        },\n        fileType:\"Image\",\n        flashError:\"Flash initialization failed!\",\n        netError:\"Network error! Please try again!\",\n        copySuccess:\"URL has been copied!\",\n\n        'flashI18n':{\n            lang:encodeURI( '{\"UploadingState\":\"totalNum: ${a},uploadComplete: ${b}\", \"BeforeUpload\":\"waitingNum: ${a}\", \"ExceedSize\":\"Size exceed${a}\", \"ErrorInPreview\":\"Preview failed\", \"DefaultDescription\":\"Description\", \"LoadingImage\":\"Loading...\"}' ),\n            uploadingTF:encodeURI( '{\"font\":\"Arial\", \"size\":12, \"color\":\"0x000\", \"bold\":\"true\", \"italic\":\"false\", \"underline\":\"false\"}' ),\n            imageTF:encodeURI( '{\"font\":\"Arial\", \"size\":11, \"color\":\"red\", \"bold\":\"false\", \"italic\":\"false\", \"underline\":\"false\"}' ),\n            textEncoding:\"utf-8\",\n            addImageSkinURL:\"addImage.png\",\n            allDeleteBtnUpSkinURL:\"allDeleteBtnUpSkin.png\",\n            allDeleteBtnHoverSkinURL:\"allDeleteBtnHoverSkin.png\",\n            rotateLeftBtnEnableSkinURL:\"rotateLeftEnable.png\",\n            rotateLeftBtnDisableSkinURL:\"rotateLeftDisable.png\",\n            rotateRightBtnEnableSkinURL:\"rotateRightEnable.png\",\n            rotateRightBtnDisableSkinURL:\"rotateRightDisable.png\",\n            deleteBtnEnableSkinURL:\"deleteEnable.png\",\n            deleteBtnDisableSkinURL:\"deleteDisable.png\",\n            backgroundURL:'',\n            listBackgroundURL:'',\n            buttonURL:'button.png'\n        }\n    },\n    'autosave': {\n        'success':'Local conservation success'\n    }\n};\n"
  },
  {
    "path": "static/common/user/uedit/lang/zh-cn/zh-cn.js",
    "content": "/**\n * Created with JetBrains PhpStorm.\n * User: taoqili\n * Date: 12-6-12\n * Time: 下午5:02\n * To change this template use File | Settings | File Templates.\n */\nUE.I18N['zh-cn'] = {\n    'labelMap':{\n        'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',\n        'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',\n        'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',\n        'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',\n        'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',\n        'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',\n        'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行',\n        'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题',\n        'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':\"表格前插入行\",'insertcode':'代码语言',\n        'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接',\n        'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图',\n        'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',\n        'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',\n        'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',\n        'rowspacingtop':'段前距', 'rowspacingbottom':'段后距',  'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',\n        'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',\n        'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版',\n        'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦',\n        'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表'\n    },\n    'insertorderedlist':{\n        'num':'1,2,3...',\n        'num1':'1),2),3)...',\n        'num2':'(1),(2),(3)...',\n        'cn':'一,二,三....',\n        'cn1':'一),二),三)....',\n        'cn2':'(一),(二),(三)....',\n        'decimal':'1,2,3...',\n        'lower-alpha':'a,b,c...',\n        'lower-roman':'i,ii,iii...',\n        'upper-alpha':'A,B,C...',\n        'upper-roman':'I,II,III...'\n    },\n    'insertunorderedlist':{\n        'circle':'○ 大圆圈',\n        'disc':'● 小黑点',\n        'square':'■ 小方块 ',\n        'dash' :'— 破折号',\n        'dot':' 。 小圆圈'\n    },\n    'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},\n    'fontfamily':{\n        'songti':'宋体',\n        'kaiti':'楷体',\n        'heiti':'黑体',\n        'lishu':'隶书',\n        'yahei':'微软雅黑',\n        'andaleMono':'andale mono',\n        'arial': 'arial',\n        'arialBlack':'arial black',\n        'comicSansMs':'comic sans ms',\n        'impact':'impact',\n        'timesNewRoman':'times new roman'\n    },\n    'customstyle':{\n        'tc':'标题居中',\n        'tl':'标题居左',\n        'im':'强调',\n        'hi':'明显强调'\n    },\n    'autoupload': {\n        'exceedSizeError': '文件大小超出限制',\n        'exceedTypeError': '文件格式不允许',\n        'jsonEncodeError': '服务器返回格式错误',\n        'loading':\"正在上传...\",\n        'loadError':\"上传错误\",\n        'errorLoadConfig': '后端配置项没有正常加载，上传插件不能正常使用！'\n    },\n    'simpleupload':{\n        'exceedSizeError': '文件大小超出限制',\n        'exceedTypeError': '文件格式不允许',\n        'jsonEncodeError': '服务器返回格式错误',\n        'loading':\"正在上传...\",\n        'loadError':\"上传错误\",\n        'errorLoadConfig': '后端配置项没有正常加载，上传插件不能正常使用！'\n    },\n    'elementPathTip':\"元素路径\",\n    'wordCountTip':\"字数统计\",\n    'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ',\n    'wordOverFlowMsg':'<span style=\"color:red;\">字数超出最大允许值，服务器可能拒绝保存！</span>',\n    'ok':\"确认\",\n    'cancel':\"取消\",\n    'closeDialog':\"关闭对话框\",\n    'tableDrag':\"表格拖动必须引入uiUtils.js文件！\",\n    'autofloatMsg':\"工具栏浮动依赖编辑器UI，您首先需要引入UI文件!\",\n    'loadconfigError': '获取后台配置项请求出错，上传功能将不能正常使用！',\n    'loadconfigFormatError': '后台配置项返回格式出错，上传功能将不能正常使用！',\n    'loadconfigHttpError': '请求后台配置项http错误，上传功能将不能正常使用！',\n    'snapScreen_plugin':{\n        'browserMsg':\"仅支持IE浏览器！\",\n        'callBackErrorMsg':\"服务器返回数据有误，请检查配置项之后重试。\",\n        'uploadErrorMsg':\"截图上传失败，请检查服务器端环境! \"\n    },\n    'insertcode':{\n        'as3':'ActionScript 3',\n        'bash':'Bash/Shell',\n        'cpp':'C/C++',\n        'css':'CSS',\n        'cf':'ColdFusion',\n        'c#':'C#',\n        'delphi':'Delphi',\n        'diff':'Diff',\n        'erlang':'Erlang',\n        'groovy':'Groovy',\n        'html':'HTML',\n        'java':'Java',\n        'jfx':'JavaFX',\n        'js':'JavaScript',\n        'pl':'Perl',\n        'php':'PHP',\n        'plain':'Plain Text',\n        'ps':'PowerShell',\n        'python':'Python',\n        'ruby':'Ruby',\n        'scala':'Scala',\n        'sql':'SQL',\n        'vb':'Visual Basic',\n        'xml':'XML'\n    },\n    'confirmClear':\"确定清空当前文档么？\",\n    'contextMenu':{\n        'delete':\"删除\",\n        'selectall':\"全选\",\n        'deletecode':\"删除代码\",\n        'cleardoc':\"清空文档\",\n        'confirmclear':\"确定清空当前文档么？\",\n        'unlink':\"删除超链接\",\n        'paragraph':\"段落格式\",\n        'edittable':\"表格属性\",\n        'aligntd':\"单元格对齐方式\",\n        'aligntable':'表格对齐方式',\n        'tableleft':'左浮动',\n        'tablecenter':'居中显示',\n        'tableright':'右浮动',\n        'edittd':\"单元格属性\",\n        'setbordervisible':'设置表格边线可见',\n        'justifyleft':'左对齐',\n        'justifyright':'右对齐',\n        'justifycenter':'居中对齐',\n        'justifyjustify':'两端对齐',\n        'table':\"表格\",\n        'inserttable':'插入表格',\n        'deletetable':\"删除表格\",\n        'insertparagraphbefore':\"前插入段落\",\n        'insertparagraphafter':'后插入段落',\n        'deleterow':\"删除当前行\",\n        'deletecol':\"删除当前列\",\n        'insertrow':\"前插入行\",\n        'insertcol':\"左插入列\",\n        'insertrownext':'后插入行',\n        'insertcolnext':'右插入列',\n        'insertcaption':'插入表格名称',\n        'deletecaption':'删除表格名称',\n        'inserttitle':'插入表格标题行',\n        'deletetitle':'删除表格标题行',\n        'inserttitlecol':'插入表格标题列',\n        'deletetitlecol':'删除表格标题列',\n        'averageDiseRow':'平均分布各行',\n        'averageDisCol':'平均分布各列',\n        'mergeright':\"向右合并\",\n        'mergeleft':\"向左合并\",\n        'mergedown':\"向下合并\",\n        'mergecells':\"合并单元格\",\n        'splittocells':\"完全拆分单元格\",\n        'splittocols':\"拆分成列\",\n        'splittorows':\"拆分成行\",\n        'tablesort':'表格排序',\n        'enablesort':'设置表格可排序',\n        'disablesort':'取消表格可排序',\n        'reversecurrent':'逆序当前',\n        'orderbyasc':'按ASCII字符升序',\n        'reversebyasc':'按ASCII字符降序',\n        'orderbynum':'按数值大小升序',\n        'reversebynum':'按数值大小降序',\n        'borderbk':'边框底纹',\n        'setcolor':'表格隔行变色',\n        'unsetcolor':'取消表格隔行变色',\n        'setbackground':'选区背景隔行',\n        'unsetbackground':'取消选区背景',\n        'redandblue':'红蓝相间',\n        'threecolorgradient':'三色渐变',\n        'copy':\"复制(Ctrl + c)\",\n        'copymsg': \"浏览器不支持,请使用 'Ctrl + c'\",\n        'paste':\"粘贴(Ctrl + v)\",\n         'pastemsg': \"浏览器不支持,请使用 'Ctrl + v'\"\n    },\n    'copymsg': \"浏览器不支持,请使用 'Ctrl + c'\",\n    'pastemsg': \"浏览器不支持,请使用 'Ctrl + v'\",\n    'anthorMsg':\"链接\",\n    'clearColor':'清空颜色',\n    'standardColor':'标准颜色',\n    'themeColor':'主题颜色',\n    'property':'属性',\n    'default':'默认',\n    'modify':'修改',\n    'justifyleft':'左对齐',\n    'justifyright':'右对齐',\n    'justifycenter':'居中',\n    'justify':'默认',\n    'clear':'清除',\n    'anchorMsg':'锚点',\n    'delete':'删除',\n    'clickToUpload':\"点击上传\",\n    'unset':'尚未设置语言文件',\n    't_row':'行',\n    't_col':'列',\n    'more':'更多',\n    'pasteOpt':'粘贴选项',\n    'pasteSourceFormat':\"保留源格式\",\n    'tagFormat':'只保留标签',\n    'pasteTextFormat':'只保留文本',\n    'autoTypeSet':{\n        'mergeLine':\"合并空行\",\n        'delLine':\"清除空行\",\n        'removeFormat':\"清除格式\",\n        'indent':\"首行缩进\",\n        'alignment':\"对齐方式\",\n        'imageFloat':\"图片浮动\",\n        'removeFontsize':\"清除字号\",\n        'removeFontFamily':\"清除字体\",\n        'removeHtml':\"清除冗余HTML代码\",\n        'pasteFilter':\"粘贴过滤\",\n        'run':\"执行\",\n        'symbol':'符号转换',\n        'bdc2sb':'全角转半角',\n        'tobdc':'半角转全角'\n    },\n\n    'background':{\n        'static':{\n            'lang_background_normal':'背景设置',\n            'lang_background_local':'在线图片',\n            'lang_background_set':'选项',\n            'lang_background_none':'无背景色',\n            'lang_background_colored':'有背景色',\n            'lang_background_color':'颜色设置',\n            'lang_background_netimg':'网络图片',\n            'lang_background_align':'对齐方式',\n            'lang_background_position':'精确定位',\n            'repeatType':{'options':[\"居中\", \"横向重复\", \"纵向重复\", \"平铺\",\"自定义\"]}\n\n        },\n        'noUploadImage':\"当前未上传过任何图片！\",\n        'toggleSelect':\"单击可切换选中状态\\n原图尺寸: \"\n    },\n    //===============dialog i18N=======================\n    'insertimage':{\n        'static':{\n            'lang_tab_remote':\"插入图片\", //节点\n            'lang_tab_upload':\"本地上传\",\n            'lang_tab_online':\"在线管理\",\n            'lang_tab_search':\"图片搜索\",\n            'lang_input_url':\"地 址：\",\n            'lang_input_size':\"大 小：\",\n            'lang_input_width':\"宽度\",\n            'lang_input_height':\"高度\",\n            'lang_input_border':\"边 框：\",\n            'lang_input_vhspace':\"边 距：\",\n            'lang_input_title':\"描 述：\",\n            'lang_input_align':'图片浮动方式：',\n            'lang_imgLoading':\"　图片加载中……\",\n            'lang_start_upload':\"开始上传\",\n            'lock':{'title':\"锁定宽高比例\"}, //属性\n            'searchType':{'title':\"图片类型\", 'options':[\"新闻\", \"壁纸\", \"表情\", \"头像\"]}, //select的option\n            'searchTxt':{'value':\"请输入搜索关键词\"},\n            'searchBtn':{'value':\"百度一下\"},\n            'searchReset':{'value':\"清空搜索\"},\n            'noneAlign':{'title':'无浮动'},\n            'leftAlign':{'title':'左浮动'},\n            'rightAlign':{'title':'右浮动'},\n            'centerAlign':{'title':'居中独占一行'}\n        },\n        'uploadSelectFile':'点击选择图片',\n        'uploadAddFile':'继续添加',\n        'uploadStart':'开始上传',\n        'uploadPause':'暂停上传',\n        'uploadContinue':'继续上传',\n        'uploadRetry':'重试上传',\n        'uploadDelete':'删除',\n        'uploadTurnLeft':'向左旋转',\n        'uploadTurnRight':'向右旋转',\n        'uploadPreview':'预览中',\n        'uploadNoPreview':'不能预览',\n        'updateStatusReady': '选中_张图片，共_KB。',\n        'updateStatusConfirm': '已成功上传_张照片，_张照片上传失败',\n        'updateStatusFinish': '共_张（_KB），_张上传成功',\n        'updateStatusError': '，_张上传失败。',\n        'errorNotSupport': 'WebUploader 不支持您的浏览器！如果你使用的是IE浏览器，请尝试升级 flash 播放器。',\n        'errorLoadConfig': '后端配置项没有正常加载，上传插件不能正常使用！',\n        'errorExceedSize':'文件大小超出',\n        'errorFileType':'文件格式不允许',\n        'errorInterrupt':'文件传输中断',\n        'errorUploadRetry':'上传失败，请重试',\n        'errorHttp':'http请求错误',\n        'errorServerUpload':'服务器返回出错',\n        'remoteLockError':\"宽高不正确,不能所定比例\",\n        'numError':\"请输入正确的长度或者宽度值！例如：123，400\",\n        'imageUrlError':\"不允许的图片格式或者图片域！\",\n        'imageLoadError':\"图片加载失败！请检查链接地址或网络状态！\",\n        'searchRemind':\"请输入搜索关键词\",\n        'searchLoading':\"图片加载中，请稍后……\",\n        'searchRetry':\" :( ，抱歉，没有找到图片！请重试一次！\"\n    },\n    'attachment':{\n        'static':{\n            'lang_tab_upload': '上传附件',\n            'lang_tab_online': '在线附件',\n            'lang_start_upload':\"开始上传\",\n            'lang_drop_remind':\"可以将文件拖到这里，单次最多可选100个文件\"\n        },\n        'uploadSelectFile':'点击选择文件',\n        'uploadAddFile':'继续添加',\n        'uploadStart':'开始上传',\n        'uploadPause':'暂停上传',\n        'uploadContinue':'继续上传',\n        'uploadRetry':'重试上传',\n        'uploadDelete':'删除',\n        'uploadTurnLeft':'向左旋转',\n        'uploadTurnRight':'向右旋转',\n        'uploadPreview':'预览中',\n        'updateStatusReady': '选中_个文件，共_KB。',\n        'updateStatusConfirm': '已成功上传_个文件，_个文件上传失败',\n        'updateStatusFinish': '共_个（_KB），_个上传成功',\n        'updateStatusError': '，_张上传失败。',\n        'errorNotSupport': 'WebUploader 不支持您的浏览器！如果你使用的是IE浏览器，请尝试升级 flash 播放器。',\n        'errorLoadConfig': '后端配置项没有正常加载，上传插件不能正常使用！',\n        'errorExceedSize':'文件大小超出',\n        'errorFileType':'文件格式不允许',\n        'errorInterrupt':'文件传输中断',\n        'errorUploadRetry':'上传失败，请重试',\n        'errorHttp':'http请求错误',\n        'errorServerUpload':'服务器返回出错'\n    },\n    'insertvideo':{\n        'static':{\n            'lang_tab_insertV':\"插入视频\",\n            'lang_tab_searchV':\"搜索视频\",\n            'lang_tab_uploadV':\"上传视频\",\n            'lang_video_url':\"视频网址\",\n            'lang_video_size':\"视频尺寸\",\n            'lang_videoW':\"宽度\",\n            'lang_videoH':\"高度\",\n            'lang_alignment':\"对齐方式\",\n            'videoSearchTxt':{'value':\"请输入搜索关键字！\"},\n            'videoType':{'options':[\"全部\", \"热门\", \"娱乐\", \"搞笑\", \"体育\", \"科技\", \"综艺\"]},\n            'videoSearchBtn':{'value':\"百度一下\"},\n            'videoSearchReset':{'value':\"清空结果\"},\n\n            'lang_input_fileStatus':' 当前未上传文件',\n            'startUpload':{'style':\"background:url(upload.png) no-repeat;\"},\n\n            'lang_upload_size':\"视频尺寸\",\n            'lang_upload_width':\"宽度\",\n            'lang_upload_height':\"高度\",\n            'lang_upload_alignment':\"对齐方式\",\n            'lang_format_advice':\"建议使用mp4格式.\"\n\n        },\n        'numError':\"请输入正确的数值，如123,400\",\n        'floatLeft':\"左浮动\",\n        'floatRight':\"右浮动\",\n        '\"default\"':\"默认\",\n        'block':\"独占一行\",\n        'urlError':\"输入的视频地址有误，请检查后再试！\",\n        'loading':\" &nbsp;视频加载中，请等待……\",\n        'clickToSelect':\"点击选中\",\n        'goToSource':'访问源视频',\n        'noVideo':\" &nbsp; &nbsp;抱歉，找不到对应的视频，请重试！\",\n\n        'browseFiles':'浏览文件',\n        'uploadSuccess':'上传成功!',\n        'delSuccessFile':'从成功队列中移除',\n        'delFailSaveFile':'移除保存失败文件',\n        'statusPrompt':' 个文件已上传！ ',\n        'flashVersionError':'当前Flash版本过低，请更新FlashPlayer后重试！',\n        'flashLoadingError':'Flash加载失败!请检查路径或网络状态',\n        'fileUploadReady':'等待上传……',\n        'delUploadQueue':'从上传队列中移除',\n        'limitPrompt1':'单次不能选择超过',\n        'limitPrompt2':'个文件！请重新选择！',\n        'delFailFile':'移除失败文件',\n        'fileSizeLimit':'文件大小超出限制！',\n        'emptyFile':'空文件无法上传！',\n        'fileTypeError':'文件类型不允许！',\n        'unknownError':'未知错误！',\n        'fileUploading':'上传中，请等待……',\n        'cancelUpload':'取消上传',\n        'netError':'网络错误',\n        'failUpload':'上传失败!',\n        'serverIOError':'服务器IO错误！',\n        'noAuthority':'无权限！',\n        'fileNumLimit':'上传个数限制',\n        'failCheck':'验证失败，本次上传被跳过！',\n        'fileCanceling':'取消中，请等待……',\n        'stopUploading':'上传已停止……',\n\n        'uploadSelectFile':'点击选择文件',\n        'uploadAddFile':'继续添加',\n        'uploadStart':'开始上传',\n        'uploadPause':'暂停上传',\n        'uploadContinue':'继续上传',\n        'uploadRetry':'重试上传',\n        'uploadDelete':'删除',\n        'uploadTurnLeft':'向左旋转',\n        'uploadTurnRight':'向右旋转',\n        'uploadPreview':'预览中',\n        'updateStatusReady': '选中_个文件，共_KB。',\n        'updateStatusConfirm': '成功上传_个，_个失败',\n        'updateStatusFinish': '共_个(_KB)，_个成功上传',\n        'updateStatusError': '，_张上传失败。',\n        'errorNotSupport': 'WebUploader 不支持您的浏览器！如果你使用的是IE浏览器，请尝试升级 flash 播放器。',\n        'errorLoadConfig': '后端配置项没有正常加载，上传插件不能正常使用！',\n        'errorExceedSize':'文件大小超出',\n        'errorFileType':'文件格式不允许',\n        'errorInterrupt':'文件传输中断',\n        'errorUploadRetry':'上传失败，请重试',\n        'errorHttp':'http请求错误',\n        'errorServerUpload':'服务器返回出错'\n    },\n    'webapp':{\n        'tip1':\"本功能由百度APP提供，如看到此页面，请各位站长首先申请百度APPKey!\",\n        'tip2':\"申请完成之后请至ueditor.config.js中配置获得的appkey! \",\n        'applyFor':\"点此申请\",\n        'anthorApi':\"百度API\"\n    },\n    'template':{\n        'static':{\n            'lang_template_bkcolor':'背景颜色',\n            'lang_template_clear' : '保留原有内容',\n            'lang_template_select' : '选择模板'\n        },\n        'blank':\"空白文档\",\n        'blog':\"博客文章\",\n        'resume':\"个人简历\",\n        'richText':\"图文混排\",\n        'sciPapers':\"科技论文\"\n\n\n    },\n    'scrawl':{\n        'static':{\n            'lang_input_previousStep':\"上一步\",\n            'lang_input_nextsStep':\"下一步\",\n            'lang_input_clear':'清空',\n            'lang_input_addPic':'添加背景',\n            'lang_input_ScalePic':'缩放背景',\n            'lang_input_removePic':'删除背景',\n            'J_imgTxt':{title:'添加背景图片'}\n        },\n        'noScarwl':\"尚未作画，白纸一张~\",\n        'scrawlUpLoading':\"涂鸦上传中,别急哦~\",\n        'continueBtn':\"继续\",\n        'imageError':\"糟糕，图片读取失败了！\",\n        'backgroundUploading':'背景图片上传中,别急哦~'\n    },\n    'music':{\n        'static':{\n            'lang_input_tips':\"输入歌手/歌曲/专辑，搜索您感兴趣的音乐！\",\n            'J_searchBtn':{value:'搜索歌曲'}\n        },\n        'emptyTxt':'未搜索到相关音乐结果，请换一个关键词试试。',\n        'chapter':'歌曲',\n        'singer':'歌手',\n        'special':'专辑',\n        'listenTest':'试听'\n    },\n    'anchor':{\n        'static':{\n            'lang_input_anchorName':'锚点名字：'\n        }\n    },\n    'charts':{\n        'static':{\n            'lang_data_source':'数据源：',\n            'lang_chart_format': '图表格式：',\n            'lang_data_align': '数据对齐方式',\n            'lang_chart_align_same': '数据源与图表X轴Y轴一致',\n            'lang_chart_align_reverse': '数据源与图表X轴Y轴相反',\n            'lang_chart_title': '图表标题',\n            'lang_chart_main_title': '主标题：',\n            'lang_chart_sub_title': '子标题：',\n            'lang_chart_x_title': 'X轴标题：',\n            'lang_chart_y_title': 'Y轴标题：',\n            'lang_chart_tip': '提示文字',\n            'lang_cahrt_tip_prefix': '提示文字前缀：',\n            'lang_cahrt_tip_description': '仅饼图有效， 当鼠标移动到饼图中相应的块上时，提示框内的文字的前缀',\n            'lang_chart_data_unit': '数据单位',\n            'lang_chart_data_unit_title': '单位：',\n            'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位， 比如： 温度的单位 ℃',\n            'lang_chart_type': '图表类型：',\n            'lang_prev_btn': '上一个',\n            'lang_next_btn': '下一个'\n        }\n    },\n    'emotion':{\n        'static':{\n            'lang_input_choice':'精选',\n            'lang_input_Tuzki':'兔斯基',\n            'lang_input_BOBO':'BOBO',\n            'lang_input_lvdouwa':'绿豆蛙',\n            'lang_input_babyCat':'baby猫',\n            'lang_input_bubble':'泡泡',\n            'lang_input_youa':'有啊'\n        }\n    },\n    'gmap':{\n        'static':{\n            'lang_input_address':'地址',\n            'lang_input_search':'搜索',\n            'address':{value:\"北京\"}\n        },\n        searchError:'无法定位到该地址!'\n    },\n    'help':{\n        'static':{\n            'lang_input_about':'关于UEditor',\n            'lang_input_shortcuts':'快捷键',\n            'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器，具有轻量，可定制，注重用户体验等特点。开源基于BSD协议，允许自由使用和修改代码。',\n            'lang_Txt_shortcuts':'快捷键',\n            'lang_Txt_func':'功能',\n            'lang_Txt_bold':'给选中字设置为加粗',\n            'lang_Txt_copy':'复制选中内容',\n            'lang_Txt_cut':'剪切选中内容',\n            'lang_Txt_Paste':'粘贴',\n            'lang_Txt_undo':'重新执行上次操作',\n            'lang_Txt_redo':'撤销上一次操作',\n            'lang_Txt_italic':'给选中字设置为斜体',\n            'lang_Txt_underline':'给选中字加下划线',\n            'lang_Txt_selectAll':'全部选中',\n            'lang_Txt_visualEnter':'软回车',\n            'lang_Txt_fullscreen':'全屏'\n        }\n    },\n    'insertframe':{\n        'static':{\n            'lang_input_address':'地址：',\n            'lang_input_width':'宽度：',\n            'lang_input_height':'高度：',\n            'lang_input_isScroll':'允许滚动条：',\n            'lang_input_frameborder':'显示框架边框：',\n            'lang_input_alignMode':'对齐方式：',\n            'align':{title:\"对齐方式\", options:[\"默认\", \"左对齐\", \"右对齐\", \"居中\"]}\n        },\n        'enterAddress':'请输入地址!'\n    },\n    'link':{\n        'static':{\n            'lang_input_text':'文本内容：',\n            'lang_input_url':'链接地址：',\n            'lang_input_title':'标题：',\n            'lang_input_target':'是否在新窗口打开：'\n        },\n        'validLink':'只支持选中一个链接时生效',\n        'httpPrompt':'您输入的超链接中不包含http等协议名称，默认将为您添加http://前缀'\n    },\n    'map':{\n        'static':{\n            lang_city:\"城市\",\n            lang_address:\"地址\",\n            city:{value:\"北京\"},\n            lang_search:\"搜索\",\n            lang_dynamicmap:\"插入动态地图\"\n        },\n        cityMsg:\"请选择城市\",\n        errorMsg:\"抱歉，找不到该位置！\"\n    },\n    'searchreplace':{\n        'static':{\n            lang_tab_search:\"查找\",\n            lang_tab_replace:\"替换\",\n            lang_search1:\"查找\",\n            lang_search2:\"查找\",\n            lang_replace:\"替换\",\n            lang_searchReg:'支持正则表达式，添加前后斜杠标示为正则表达式，例如“/表达式/”',\n            lang_searchReg1:'支持正则表达式，添加前后斜杠标示为正则表达式，例如“/表达式/”',\n            lang_case_sensitive1:\"区分大小写\",\n            lang_case_sensitive2:\"区分大小写\",\n            nextFindBtn:{value:\"下一个\"},\n            preFindBtn:{value:\"上一个\"},\n            nextReplaceBtn:{value:\"下一个\"},\n            preReplaceBtn:{value:\"上一个\"},\n            repalceBtn:{value:\"替换\"},\n            repalceAllBtn:{value:\"全部替换\"}\n        },\n        getEnd:\"已经搜索到文章末尾！\",\n        getStart:\"已经搜索到文章头部\",\n        countMsg:\"总共替换了{#count}处！\"\n    },\n    'snapscreen':{\n        'static':{\n            lang_showMsg:\"截图功能需要首先安装UEditor截图插件！ \",\n            lang_download:\"点此下载\",\n            lang_step1:\"第一步，下载UEditor截图插件并运行安装。\",\n            lang_step2:\"第二步，插件安装完成后即可使用，如不生效，请重启浏览器后再试！\"\n        }\n    },\n    'spechars':{\n        'static':{},\n        tsfh:\"特殊字符\",\n        lmsz:\"罗马字符\",\n        szfh:\"数学字符\",\n        rwfh:\"日文字符\",\n        xlzm:\"希腊字母\",\n        ewzm:\"俄文字符\",\n        pyzm:\"拼音字母\",\n        yyyb:\"英语音标\",\n        zyzf:\"其他\"\n    },\n    'edittable':{\n        'static':{\n            'lang_tableStyle':'表格样式',\n            'lang_insertCaption':'添加表格名称行',\n            'lang_insertTitle':'添加表格标题行',\n            'lang_insertTitleCol':'添加表格标题列',\n            'lang_orderbycontent':\"使表格内容可排序\",\n            'lang_tableSize':'自动调整表格尺寸',\n            'lang_autoSizeContent':'按表格文字自适应',\n            'lang_autoSizePage':'按页面宽度自适应',\n            'lang_example':'示例',\n            'lang_borderStyle':'表格边框',\n            'lang_color':'颜色:'\n        },\n        captionName:'表格名称',\n        titleName:'标题',\n        cellsName:'内容',\n        errorMsg:'有合并单元格，不可排序'\n    },\n    'edittip':{\n        'static':{\n            lang_delRow:'删除整行',\n            lang_delCol:'删除整列'\n        }\n    },\n    'edittd':{\n        'static':{\n            lang_tdBkColor:'背景颜色:'\n        }\n    },\n    'formula':{\n        'static':{\n        }\n    },\n    'wordimage':{\n        'static':{\n            lang_resave:\"转存步骤\",\n            uploadBtn:{src:\"upload.png\",alt:\"上传\"},\n            clipboard:{style:\"background: url(copy.png) -153px -1px no-repeat;\"},\n            lang_step:\"1、点击顶部复制按钮，将地址复制到剪贴板；2、点击添加照片按钮，在弹出的对话框中使用Ctrl+V粘贴地址；3、点击打开后选择图片上传流程。\"\n        },\n        'fileType':\"图片\",\n        'flashError':\"FLASH初始化失败，请检查FLASH插件是否正确安装！\",\n        'netError':\"网络连接错误，请重试！\",\n        'copySuccess':\"图片地址已经复制！\",\n        'flashI18n':{} //留空默认中文\n    },\n    'autosave': {\n        'saving':'保存中...',\n        'success':'本地保存成功'\n    }\n};\n"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/autotypesetpicker.css",
    "content": "/*自动排版弹出菜单*/\n.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body {\n    font-size: 12px;\n    margin-bottom: 3px;\n    clear: both;\n}\n\n.edui-default .edui-autotypesetpicker-body table {\n    border-collapse: separate;\n    border-spacing: 2px;\n}\n\n.edui-default .edui-autotypesetpicker-body td {\n    font-size: 12px;\n    word-wrap:break-word;\n}\n\n.edui-default .edui-autotypesetpicker-body td input {\n    margin: 3px 3px 3px 4px;\n    *margin: 1px 0 0 0;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/button.css",
    "content": "/*普通按钮样式及状态*/\n.edui-default .edui-toolbar .edui-button .edui-icon,\n.edui-default .edui-toolbar .edui-menubutton .edui-icon,\n.edui-default .edui-toolbar .edui-splitbutton .edui-icon {\n    height: 20px !important;\n    width: 20px !important;\n    background-image: url(../images/icons.png);\n    background-image: url(../images/icons.gif) \\9;\n}\n\n.edui-default .edui-toolbar .edui-button .edui-button-wrap {\n    padding: 1px;\n    position: relative;\n}\n\n.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap {\n    background-color: #fff5d4;\n    padding: 0;\n    border: 1px solid #dcac6c;\n}\n\n.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap {\n    background-color: #ffe69f;\n    padding: 0;\n    border: 1px solid #dcac6c;\n    border-radius: 2px;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n}\n\n.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap {\n    background-color: #ffffff;\n    padding: 0;\n    border: 1px solid gray;\n}\n.edui-default .edui-toolbar .edui-state-disabled .edui-label {\n    color: #ccc;\n}\n.edui-default .edui-toolbar .edui-state-disabled .edui-icon {\n    opacity: 0.3;\n    filter: alpha(opacity = 30);\n}\n"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/buttonicon.css",
    "content": "/* toolbar icons */\n.edui-default .edui-for-undo .edui-icon {\n    background-position: -160px 0;\n}\n\n.edui-default  .edui-for-redo .edui-icon {\n    background-position: -100px 0;\n}\n\n.edui-default  .edui-for-bold .edui-icon {\n    background-position: 0 0;\n}\n\n.edui-default  .edui-for-italic .edui-icon {\n    background-position: -60px 0;\n}\n\n.edui-default  .edui-for-fontborder .edui-icon {\n    background-position:-160px -40px;\n}\n.edui-default  .edui-for-underline .edui-icon {\n    background-position: -140px 0;\n}\n\n.edui-default  .edui-for-strikethrough .edui-icon {\n    background-position: -120px 0;\n}\n\n.edui-default  .edui-for-subscript .edui-icon {\n    background-position: -600px 0;\n}\n\n.edui-default  .edui-for-superscript .edui-icon {\n    background-position: -620px 0;\n}\n\n.edui-default  .edui-for-blockquote .edui-icon {\n    background-position: -220px 0;\n}\n\n.edui-default  .edui-for-forecolor .edui-icon {\n    background-position: -720px 0;\n}\n\n.edui-default  .edui-for-backcolor .edui-icon {\n    background-position: -760px 0;\n}\n\n.edui-default  .edui-for-inserttable .edui-icon {\n    background-position: -580px -20px;\n}\n\n.edui-default  .edui-for-autotypeset .edui-icon {\n    background-position: -640px -40px;\n}\n\n.edui-default  .edui-for-justifyleft .edui-icon {\n    background-position: -460px 0;\n}\n\n.edui-default  .edui-for-justifycenter .edui-icon {\n    background-position: -420px 0;\n}\n\n.edui-default  .edui-for-justifyright .edui-icon {\n    background-position: -480px 0;\n}\n\n.edui-default  .edui-for-justifyjustify .edui-icon {\n    background-position: -440px 0;\n}\n\n.edui-default  .edui-for-insertorderedlist .edui-icon {\n    background-position: -80px 0;\n}\n\n.edui-default  .edui-for-insertunorderedlist .edui-icon {\n    background-position: -20px 0;\n}\n\n.edui-default  .edui-for-lineheight .edui-icon {\n    background-position: -725px -40px;\n}\n\n.edui-default  .edui-for-rowspacingbottom .edui-icon {\n    background-position: -745px -40px;\n}\n\n.edui-default  .edui-for-rowspacingtop .edui-icon {\n    background-position: -765px -40px;\n}\n\n.edui-default  .edui-for-horizontal .edui-icon {\n    background-position: -360px 0;\n}\n\n.edui-default  .edui-for-link .edui-icon {\n    background-position: -500px 0;\n}\n\n.edui-default  .edui-for-code .edui-icon {\n    background-position: -440px -40px;\n}\n\n.edui-default  .edui-for-insertimage .edui-icon {\n    background-position: -726px -77px;\n}\n\n.edui-default  .edui-for-insertframe .edui-icon {\n    background-position: -240px -40px;\n}\n\n.edui-default  .edui-for-emoticon .edui-icon {\n    background-position: -60px -20px;\n}\n\n.edui-default  .edui-for-spechars .edui-icon {\n    background-position: -240px 0;\n}\n\n.edui-default  .edui-for-help .edui-icon {\n    background-position: -340px 0;\n}\n\n.edui-default  .edui-for-print .edui-icon {\n    background-position: -440px -20px;\n}\n\n.edui-default  .edui-for-preview .edui-icon {\n    background-position: -420px -20px;\n}\n\n.edui-default  .edui-for-selectall .edui-icon {\n    background-position: -400px -20px;\n}\n\n.edui-default  .edui-for-searchreplace .edui-icon {\n    background-position: -520px -20px;\n}\n\n.edui-default  .edui-for-map .edui-icon {\n    background-position: -40px -40px;\n}\n\n.edui-default  .edui-for-gmap .edui-icon {\n    background-position: -260px -40px;\n}\n\n.edui-default  .edui-for-insertvideo .edui-icon {\n    background-position: -320px -20px;\n}\n\n.edui-default  .edui-for-time .edui-icon {\n    background-position: -160px -20px;\n}\n\n.edui-default  .edui-for-date .edui-icon {\n    background-position: -140px -20px;\n}\n\n.edui-default  .edui-for-cut .edui-icon {\n    background-position: -680px 0;\n}\n\n.edui-default  .edui-for-copy .edui-icon {\n    background-position: -700px 0;\n}\n\n.edui-default  .edui-for-paste .edui-icon {\n    background-position: -560px 0;\n}\n\n.edui-default  .edui-for-formatmatch .edui-icon {\n    background-position: -40px 0;\n}\n\n.edui-default  .edui-for-pasteplain .edui-icon {\n    background-position: -360px -20px;\n}\n\n.edui-default  .edui-for-directionalityltr .edui-icon {\n    background-position: -20px -20px;\n}\n\n.edui-default  .edui-for-directionalityrtl .edui-icon {\n    background-position: -40px -20px;\n}\n\n.edui-default  .edui-for-source .edui-icon {\n    background-position: -261px -0px;\n}\n\n.edui-default  .edui-for-removeformat .edui-icon {\n    background-position: -580px 0;\n}\n\n.edui-default  .edui-for-unlink .edui-icon {\n    background-position: -640px 0;\n}\n\n.edui-default  .edui-for-touppercase .edui-icon {\n    background-position: -786px 0;\n}\n\n.edui-default  .edui-for-tolowercase .edui-icon {\n    background-position: -806px 0;\n}\n\n.edui-default  .edui-for-insertrow .edui-icon {\n    background-position: -478px -76px;\n}\n\n.edui-default  .edui-for-insertrownext .edui-icon {\n    background-position: -498px -76px;\n}\n\n.edui-default  .edui-for-insertcol .edui-icon {\n    background-position: -455px -76px;\n}\n\n.edui-default  .edui-for-insertcolnext  .edui-icon {\n    background-position: -429px -76px;\n}\n\n.edui-default  .edui-for-mergeright .edui-icon {\n    background-position: -60px -40px;\n}\n\n.edui-default  .edui-for-mergedown .edui-icon {\n    background-position: -80px -40px;\n}\n\n.edui-default  .edui-for-splittorows .edui-icon {\n    background-position: -100px -40px;\n}\n\n.edui-default  .edui-for-splittocols .edui-icon {\n    background-position: -120px -40px;\n}\n\n.edui-default  .edui-for-insertparagraphbeforetable .edui-icon {\n    background-position: -140px -40px;\n}\n\n.edui-default  .edui-for-deleterow .edui-icon {\n    background-position: -660px -20px;\n}\n\n.edui-default  .edui-for-deletecol .edui-icon {\n    background-position: -640px -20px;\n}\n\n.edui-default  .edui-for-splittocells .edui-icon {\n    background-position: -800px -20px;\n}\n\n.edui-default  .edui-for-mergecells .edui-icon {\n    background-position: -760px -20px;\n}\n\n.edui-default  .edui-for-deletetable .edui-icon {\n    background-position: -620px -20px;\n}\n\n.edui-default  .edui-for-cleardoc .edui-icon {\n    background-position: -520px 0;\n}\n\n.edui-default  .edui-for-fullscreen .edui-icon {\n    background-position: -100px -20px;\n}\n\n.edui-default  .edui-for-anchor .edui-icon {\n    background-position: -200px 0;\n}\n\n.edui-default  .edui-for-pagebreak .edui-icon {\n    background-position: -460px -40px;\n}\n\n.edui-default  .edui-for-imagenone .edui-icon {\n    background-position: -480px -40px;\n}\n\n.edui-default  .edui-for-imageleft .edui-icon {\n    background-position: -500px -40px;\n}\n\n.edui-default  .edui-for-wordimage .edui-icon {\n    background-position: -660px -40px;\n}\n\n.edui-default  .edui-for-imageright .edui-icon {\n    background-position: -520px -40px;\n}\n\n.edui-default  .edui-for-imagecenter .edui-icon {\n    background-position: -540px -40px;\n}\n\n.edui-default  .edui-for-indent .edui-icon {\n    background-position: -400px 0;\n}\n\n.edui-default  .edui-for-outdent .edui-icon {\n    background-position: -540px 0;\n}\n\n.edui-default  .edui-for-webapp .edui-icon {\n    background-position: -601px -40px\n}\n\n.edui-default  .edui-for-table .edui-icon {\n    background-position: -580px -20px;\n}\n\n.edui-default  .edui-for-edittable .edui-icon {\n    background-position: -420px -40px;\n}\n\n.edui-default  .edui-for-template .edui-icon {\n    background-position: -339px -40px;\n}\n\n.edui-default  .edui-for-delete .edui-icon {\n    background-position: -360px -40px;\n}\n\n.edui-default  .edui-for-attachment .edui-icon {\n    background-position: -620px -40px;\n}\n\n.edui-default  .edui-for-edittd .edui-icon {\n    background-position: -700px -40px;\n}\n\n.edui-default  .edui-for-snapscreen .edui-icon {\n    background-position: -581px -40px\n}\n\n.edui-default  .edui-for-scrawl .edui-icon {\n    background-position: -801px -41px\n}\n\n.edui-default  .edui-for-background .edui-icon {\n    background-position: -680px -40px;\n}\n\n.edui-default  .edui-for-music .edui-icon {\n    background-position: -18px -40px\n}\n\n.edui-default  .edui-for-formula .edui-icon {\n    background-position: -200px -40px\n}\n\n.edui-default  .edui-for-aligntd  .edui-icon {\n    background-position: -236px -76px;\n}\n\n.edui-default  .edui-for-insertparagraphtrue  .edui-icon {\n    background-position: -625px -76px;\n}\n\n.edui-default  .edui-for-insertparagraph  .edui-icon {\n    background-position: -602px -76px;\n}\n\n.edui-default  .edui-for-insertcaption  .edui-icon {\n    background-position: -336px -76px;\n}\n\n.edui-default  .edui-for-deletecaption  .edui-icon {\n    background-position: -362px -76px;\n}\n\n.edui-default  .edui-for-inserttitle  .edui-icon {\n    background-position: -286px -76px;\n}\n\n.edui-default  .edui-for-deletetitle  .edui-icon {\n    background-position: -311px -76px;\n}\n\n.edui-default  .edui-for-aligntable  .edui-icon {\n    background-position: -440px 0;\n}\n\n.edui-default  .edui-for-tablealignment-left  .edui-icon {\n    background-position: -460px 0;\n}\n\n.edui-default  .edui-for-tablealignment-center  .edui-icon {\n    background-position: -420px 0;\n}\n\n.edui-default  .edui-for-tablealignment-right  .edui-icon {\n    background-position: -480px 0;\n}\n\n.edui-default  .edui-for-drafts  .edui-icon {\n    background-position: -560px 0;\n}\n\n.edui-default  .edui-for-charts  .edui-icon {\n    background: url( ../images/charts.png ) no-repeat 2px 3px!important;\n}\n\n.edui-default  .edui-for-inserttitlecol  .edui-icon {\n    background-position: -673px -76px;\n}\n\n.edui-default  .edui-for-deletetitlecol  .edui-icon {\n    background-position: -698px -76px;\n}\n\n.edui-default  .edui-for-simpleupload  .edui-icon {\n    background-position: -380px 0px;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/cellalignpicker.css",
    "content": "/*自动排版弹出菜单*/\n.edui-default .edui-cellalignpicker .edui-cellalignpicker-body {\n    width: 70px;\n    font-size: 12px;\n    cursor: default;\n}\n\n.edui-default .edui-cellalignpicker-body table {\n    border-collapse: separate;\n    border-spacing: 0;\n}\n.edui-default .edui-cellalignpicker-body td{\n    padding: 1px;\n}\n.edui-default .edui-cellalignpicker-body .edui-icon{\n    height: 20px;\n    width: 20px;\n    padding: 1px;\n    background-image: url(../images/table-cell-align.png);\n}\n\n.edui-default .edui-cellalignpicker-body .edui-left{\n    background-position: 0 0;\n}\n\n.edui-default .edui-cellalignpicker-body .edui-center{\n    background-position: -25px 0;\n}\n.edui-default .edui-cellalignpicker-body .edui-right{\n    background-position: -51px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{\n    background-position: -73px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{\n    background-position: -98px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{\n    background-position: -124px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left {\n    background-position: -146px 0;\n    background-color: #f1f4f5;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center {\n    background-position: -245px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right {\n    background-position: -271px 0;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/colorbutton.css",
    "content": "/*颜色按钮 */\n.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump {\n    position: absolute;\n    overflow: hidden;\n    bottom: 1px;\n    left: 1px;\n    width: 18px;\n    height: 4px;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/colorpicker.css",
    "content": "/* 颜色弹出菜单 */\n.edui-default .edui-colorpicker-topbar {\n    height: 27px;\n    width: 200px;\n    /*border-bottom: 1px gray dashed;*/\n}\n\n.edui-default .edui-colorpicker-preview {\n    height: 20px;\n    border: 1px inset black;\n    margin-left: 1px;\n    width: 128px;\n    float: left;\n}\n\n.edui-default .edui-colorpicker-nocolor {\n    float: right;\n    margin-right: 1px;\n    font-size: 12px;\n    line-height: 14px;\n    height: 14px;\n    border: 1px solid #333;\n    padding: 3px 5px;\n    cursor: pointer;\n}\n\n.edui-default .edui-colorpicker-tablefirstrow {\n    height: 30px;\n}\n\n.edui-default .edui-colorpicker-colorcell {\n    width: 14px;\n    height: 14px;\n    display: block;\n    margin: 0;\n    cursor: pointer;\n}\n\n.edui-default .edui-colorpicker-colorcell:hover {\n    width: 14px;\n    height: 14px;\n    margin: 0;\n}\n.edui-default .edui-colorpicker-advbtn{\n    display: block;\n    text-align: center;\n    cursor: pointer;\n    height:20px;\n}\n.arrow_down{\n    background: white url('../images/arrow_down.png') no-repeat center;\n}\n.arrow_up{\n    background: white url('../images/arrow_up.png') no-repeat center;\n}\n/*高级的样式*/\n.edui-colorpicker-adv{\n    position: relative;\n    overflow: hidden;\n    height: 180px;\n    display: none;\n}\n.edui-colorpicker-plant, .edui-colorpicker-hue {\n    border: solid 1px #666;\n}\n.edui-colorpicker-pad {\n    width: 150px;\n    height: 150px;\n    left: 14px;\n    top: 13px;\n    position: absolute;\n    background: red;\n    overflow: hidden;\n    cursor: crosshair;\n}\n.edui-colorpicker-cover{\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 150px;\n    height: 150px;\n    background: url(\"../images/tangram-colorpicker.png\") -160px -200px;\n}\n.edui-colorpicker-padDot{\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 11px;\n    height: 11px;\n    overflow: hidden;\n    background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x;\n    z-index: 1000;\n\n}\n.edui-colorpicker-sliderMain {\n    position: absolute;\n    left: 171px;\n    top: 13px;\n    width: 19px;\n    height: 152px;\n    background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat;\n\n}\n.edui-colorpicker-slider {\n    width: 100%;\n    height: 100%;\n    cursor: pointer;\n}\n.edui-colorpicker-thumb{\n    position: absolute;\n    top: 0;\n    cursor: pointer;\n    height: 3px;\n    left: -1px;\n    right: -1px;\n    border: 1px solid black;\n    background: white;\n    opacity: .8;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/combox.css",
    "content": "/*不可选中菜单按钮 */\n.edui-default .edui-toolbar .edui-combox-body .edui-button-body {\n    width: 60px;\n    font-size: 12px;\n    height: 20px;\n    line-height: 20px;\n    padding-left: 5px;\n    white-space: nowrap;\n    margin: 0 3px 0 0;\n}\n\n.edui-default .edui-toolbar .edui-combox-body .edui-arrow {\n    background: url(../images/icons.png) -741px 0;\n    _background: url(../images/icons.gif) -741px 0;\n    height: 20px;\n    width: 9px;\n}\n\n.edui-default .edui-toolbar .edui-combox .edui-combox-body {\n    border: 1px solid #CCC;\n    background-color: white;\n    border-radius: 2px;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n}\n\n.edui-default .edui-toolbar .edui-combox-body .edui-splitborder {\n    display: none;\n}\n\n.edui-default .edui-toolbar .edui-combox-body .edui-arrow {\n    border-left: 1px solid #CCC;\n}\n\n.edui-default .edui-toolbar .edui-state-hover .edui-combox-body {\n    background-color: #fff5d4;\n    border: 1px solid #dcac6c;\n}\n\n.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow {\n    border-left: 1px solid #dcac6c;\n}\n\n.edui-default .edui-toolbar .edui-state-checked .edui-combox-body {\n    background-color: #FFE69F;\n    border: 1px solid #DCAC6C;\n}\n\n.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow {\n    border-left: 1px solid #DCAC6C;\n}\n\n.edui-toolbar .edui-state-disabled .edui-combox-body {\n    background-color: #F0F0EE;\n    opacity: 0.3;\n    filter: alpha(opacity = 30);\n}\n\n.edui-toolbar .edui-state-opened .edui-combox-body {\n    background-color: white;\n    border: 1px solid gray;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/contextmenu.css",
    "content": "/*contextmenu*/\n.edui-default .edui-hassubmenu .edui-arrow {\n    height: 20px;\n    width: 20px;\n    float: right;\n    background: url(\"../images/icons-all.gif\") no-repeat 10px -233px;\n}\n\n.edui-default .edui-menu-body .edui-menuitem {\n    padding: 1px;\n}\n\n.edui-default .edui-menuseparator {\n    margin: 2px 0;\n    height: 1px;\n    overflow: hidden;\n}\n\n.edui-default .edui-menuseparator-inner {\n    border-bottom: 1px solid #e2e3e3;\n    margin-left: 29px;\n    margin-right: 1px;\n}\n\n.edui-default .edui-menu-body .edui-state-hover {\n    padding: 0 !important;\n    background-color: #fff5d4;\n    border: 1px solid #dcac6c;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/dialog.css",
    "content": "/* 弹出对话框按钮和对话框大小 */\n.edui-default .edui-dialog {\n    z-index: 2000;\n    position: absolute;\n\n}\n\n.edui-dialog div{\n    width:auto;\n}\n\n.edui-default .edui-dialog-wrap {\n    margin-right: 6px;\n    margin-bottom: 6px;\n}\n\n.edui-default .edui-dialog-fullscreen-flag {\n    margin-right: 0;\n    margin-bottom: 0;\n}\n\n.edui-default .edui-dialog-body {\n    position: relative;\n    padding:2px 0 0 2px;\n    _zoom: 1;\n}\n\n.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body {\n    padding: 0;\n}\n\n.edui-default .edui-dialog-shadow {\n    position: absolute;\n    z-index: -1;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n    background-color: #ffffff;\n    border: 1px solid #ccc;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    *border-right-width: 2px;\n    *border-bottom-width: 2px;\n    -webkit-border-radius: 6px;\n    -moz-border-radius: 6px;\n    border-radius: 6px;\n    -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n    -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n    -webkit-background-clip: padding-box;\n    -moz-background-clip: padding;\n    background-clip: padding-box;\n}\n\n.edui-default .edui-dialog-foot {\n    background-color: white;\n}\n\n.edui-default .edui-dialog-titlebar {\n    height: 26px;\n    border-bottom: 1px solid #c6c6c6;\n    background: url(../images/dialog-title-bg.png) repeat-x bottom;\n    position: relative;\n    cursor: move;\n}\n.edui-default .edui-dialog-caption {\n    font-weight: bold;\n    font-size: 12px;\n    line-height: 26px;\n    padding-left: 5px;\n}\n\n.edui-default .edui-dialog-draghandle {\n    height: 26px;\n}\n\n.edui-default .edui-dialog-closebutton {\n    position: absolute !important;\n    right: 5px;\n    top: 3px;\n}\n\n.edui-default .edui-dialog-closebutton .edui-button-body {\n    height: 20px;\n    width: 20px;\n    cursor: pointer;\n    background: url(\"../images/icons-all.gif\") no-repeat 0 -59px;\n}\n\n.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body {\n    background: url(\"../images/icons-all.gif\") no-repeat 0 -89px;\n}\n\n.edui-default .edui-dialog-foot {\n    height: 40px;\n}\n\n.edui-default .edui-dialog-buttons {\n    position: absolute;\n    right: 0;\n}\n\n.edui-default .edui-dialog-buttons .edui-button {\n    margin-right: 10px;\n}\n\n.edui-default .edui-dialog-buttons .edui-button .edui-button-body {\n    background: url(\"../images/icons-all.gif\") no-repeat;\n    height: 24px;\n    width: 96px;\n    font-size: 12px;\n    line-height: 24px;\n    text-align: center;\n    cursor: default;\n}\n\n.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body {\n    background: url(\"../images/icons-all.gif\") no-repeat 0 -30px;\n}\n\n.edui-default .edui-dialog iframe {\n    border: 0;\n    padding: 0;\n    margin: 0;\n    vertical-align: top;\n}\n\n.edui-default .edui-dialog-modalmask {\n    opacity: 0.3;\n    filter: alpha(opacity = 30);\n    background-color: #ccc;\n    position: absolute;\n    /*z-index: 1999;*/\n}\n\n.edui-default .edui-dialog-dragmask {\n    position: absolute;\n    /*z-index: 2001;*/\n    background-color: transparent;\n    cursor: move;\n}\n\n.edui-default .edui-dialog-content {\n    position: relative;\n}\n\n.edui-default .dialogcontmask {\n    cursor: move;\n    visibility: hidden;\n    display: block;\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    opacity: 0;\n    filter: alpha(opacity = 0);\n}\n\n/*link-dialog*/\n.edui-default .edui-for-link .edui-dialog-content {\n    width: 420px;\n    height: 200px;\n    overflow: hidden;\n}\n/*background-dialog*/\n.edui-default .edui-for-background .edui-dialog-content {\n    width: 440px;\n    height: 280px;\n    overflow: hidden;\n}\n\n/*template-dialog*/\n.edui-default .edui-for-template .edui-dialog-content {\n    width: 630px;\n    height: 390px;\n    overflow: hidden;\n}\n\n/*scrawl-dialog*/\n.edui-default .edui-for-scrawl .edui-dialog-content {\n    width: 515px;\n    *width: 506px;\n    height: 360px;\n}\n\n/*spechars-dialog*/\n.edui-default .edui-for-spechars .edui-dialog-content {\n    width: 620px;\n    height: 500px;\n    *width: 630px;\n    *height: 570px;\n}\n\n/*image-dialog*/\n.edui-default .edui-for-insertimage .edui-dialog-content {\n    width: 650px;\n    height: 400px;\n    overflow: hidden;\n}\n/*webapp-dialog*/\n.edui-default .edui-for-webapp .edui-dialog-content {\n    width: 560px;\n    _width: 565px;\n    height: 450px;\n    overflow: hidden;\n}\n\n/*image-insertframe*/\n.edui-default .edui-for-insertframe .edui-dialog-content {\n    width: 350px;\n    height: 200px;\n    overflow: hidden;\n}\n\n/*wordImage-dialog*/\n.edui-default .edui-for-wordimage .edui-dialog-content {\n    width: 620px;\n    height: 380px;\n    overflow: hidden;\n}\n\n/*attachment-dialog*/\n.edui-default .edui-for-attachment .edui-dialog-content {\n    width: 650px;\n    height: 400px;\n    overflow: hidden;\n}\n\n\n/*map-dialog*/\n.edui-default .edui-for-map .edui-dialog-content {\n    width: 550px;\n    height: 400px;\n}\n\n/*gmap-dialog*/\n.edui-default .edui-for-gmap .edui-dialog-content {\n    width: 550px;\n    height: 400px;\n}\n\n/*video-dialog*/\n.edui-default .edui-for-insertvideo .edui-dialog-content {\n    width: 590px;\n    height: 390px;\n}\n\n/*anchor-dialog*/\n.edui-default .edui-for-anchor .edui-dialog-content {\n    width: 320px;\n    height: 60px;\n    overflow: hidden;\n}\n\n/*searchreplace-dialog*/\n.edui-default .edui-for-searchreplace .edui-dialog-content {\n    width: 400px;\n    height: 220px;\n}\n\n/*help-dialog*/\n.edui-default .edui-for-help .edui-dialog-content {\n    width: 400px;\n    height: 420px;\n}\n\n/*edittable-dialog*/\n.edui-default .edui-for-edittable .edui-dialog-content {\n    width: 540px;\n    _width:590px;\n    height: 335px;\n}\n\n/*edittip-dialog*/\n.edui-default .edui-for-edittip .edui-dialog-content {\n    width: 225px;\n    height: 60px;\n}\n\n/*edittd-dialog*/\n.edui-default .edui-for-edittd .edui-dialog-content {\n    width: 240px;\n    height: 50px;\n}\n/*snapscreen-dialog*/\n.edui-default .edui-for-snapscreen .edui-dialog-content {\n    width: 400px;\n    height: 220px;\n}\n\n/*music-dialog*/\n.edui-default .edui-for-music .edui-dialog-content {\n    width: 515px;\n    height: 360px;\n}\n"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/editor.css",
    "content": "/*UI工具栏、编辑区域、底部*/\n.edui-default .edui-editor {\n   border: 1px solid #d4d4d4;\n    background-color: white;\n    position: relative;\n    overflow: visible;\n    -webkit-border-radius: 4px;\n    -moz-border-radius: 4px;\n    border-radius: 4px;\n}\n.edui-editor div{\n    width:auto;\n    height:auto;\n}\n.edui-default .edui-editor-toolbarbox {\n    position: relative;\n    zoom: 1;\n    -webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);\n    -moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);\n    box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);\n    border-top-left-radius:2px;\n    border-top-right-radius:2px;\n}\n\n.edui-default .edui-editor-toolbarboxouter {\n    border-bottom: 1px solid #d4d4d4;\n    background-color: #fafafa;\n    background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));\n    background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);\n    background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);\n    background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);\n    background-repeat: repeat-x;\n    /*border: 1px solid #d4d4d4;*/\n    -webkit-border-radius: 4px 4px 0 0;\n    -moz-border-radius: 4px 4px 0 0;\n    border-radius: 4px 4px 0 0;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);\n    *zoom: 1;\n    -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n    -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n}\n\n.edui-default .edui-editor-toolbarboxinner {\n    padding: 2px;\n}\n\n.edui-default .edui-editor-iframeholder {\n    position: relative;\n    /*for fix ie6 toolbarmsg under iframe bug. relative -> static */\n    /*_position: static !important;*\n}\n\n.edui-default .edui-editor-iframeholder textarea {\n    font-family: consolas, \"Courier New\", \"lucida console\", monospace;\n    font-size: 12px;\n    line-height: 18px;\n}\n\n.edui-default .edui-editor-bottombar {\n    /*border-top: 1px solid #ccc;*/\n    /*height: 20px;*/\n    /*width: 40%;*/\n    /*float: left;*/\n    /*overflow: hidden;*/\n}\n\n.edui-default .edui-editor-bottomContainer {\n    overflow: hidden;\n}\n\n.edui-default .edui-editor-bottomContainer table {\n    width: 100%;\n    height: 0;\n    overflow: hidden;\n    border-spacing: 0;\n}\n\n.edui-default .edui-editor-bottomContainer td {\n    white-space: nowrap;\n    border-top: 1px solid #ccc;\n    line-height: 20px;\n    font-size: 12px;\n    font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif;\n}\n\n.edui-default .edui-editor-wordcount {\n    text-align: right;\n    margin-right: 5px;\n    color: #aaa;\n}\n.edui-default .edui-editor-scale {\n    width: 12px;\n}\n.edui-default .edui-editor-scale .edui-editor-icon {\n    float: right;\n    width: 100%;\n    height: 12px;\n    margin-top: 10px;\n    background: url(../images/scale.png) no-repeat;\n    cursor: se-resize;\n}\n.edui-default .edui-editor-breadcrumb {\n    margin: 2px 0 0 3px;\n}\n\n.edui-default .edui-editor-breadcrumb span {\n    cursor: pointer;\n    text-decoration: underline;\n    color: blue;\n}\n\n.edui-default .edui-toolbar .edui-for-fullscreen {\n    float: right;\n}\n\n.edui-default .edui-bubble .edui-popup-content {\n    border: 1px solid #DCAC6C;\n    background-color: #fff6d9;\n    padding: 5px;\n    font-size: 10pt;\n    font-family: \"宋体\";\n}\n\n.edui-default .edui-bubble .edui-shadow {\n    /*box-shadow: 1px 1px 3px #818181;*/\n    /*-webkit-box-shadow: 2px 2px 3px #818181;*/\n    /*-moz-box-shadow: 2px 2px 3px #818181;*/\n    /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/\n}\n\n.edui-default .edui-editor-toolbarmsg {\n    background-color: #FFF6D9;\n    border-bottom: 1px solid #ccc;\n    position: absolute;\n    bottom: -25px;\n    left: 0;\n    z-index: 1009;\n    width: 99.9%;\n}\n\n.edui-default .edui-editor-toolbarmsg-upload {\n    font-size: 14px;\n    color: blue;\n    width: 100px;\n    height: 16px;\n    line-height: 16px;\n    cursor: pointer;\n    position: absolute;\n    top: 5px;\n    left: 350px;\n}\n\n.edui-default .edui-editor-toolbarmsg-label {\n    font-size: 12px;\n    line-height: 16px;\n    padding: 4px;\n}\n\n.edui-default .edui-editor-toolbarmsg-close {\n    float: right;\n    width: 20px;\n    height: 16px;\n    line-height: 16px;\n    cursor: pointer;\n    color: red;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/menu.css",
    "content": "/* 可选中按钮弹出菜单*/\n.edui-default .edui-menu {\n    z-index: 3000;\n}\n\n.edui-default .edui-menu .edui-popup-content {\n    padding: 3px;\n}\n\n.edui-default .edui-menu-body {\n    _width: 150px;\n    min-width: 170px;\n    background: url(\"../images/sparator_v.png\") repeat-y 25px;\n}\n\n.edui-default .edui-menuitem-body {\n}\n\n.edui-default .edui-menuitem {\n    height: 20px;\n    cursor: default;\n    vertical-align: top;\n}\n\n.edui-default .edui-menuitem .edui-icon {\n    width: 20px !important;\n    height: 20px !important;\n    background: url(../images/icons.png) 0 -4000px;\n    background: url(../images/icons.gif) 0 -4000px\\9;\n}\n\n.edui-default .edui-menuitem .edui-label {\n    font-size: 12px;\n    line-height: 20px;\n    height: 20px;\n    padding-left: 10px;\n}\n\n.edui-default .edui-state-checked .edui-menuitem-body {\n    background: url(\"../images/icons-all.gif\") no-repeat 6px -205px;\n}\n\n.edui-default .edui-state-disabled .edui-menuitem-label {\n    color: gray;\n}\n\n"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/menubutton.css",
    "content": "/*可选中菜单按钮*/\n.edui-default .edui-list .edui-bordereraser {\n    display: none;\n}\n\n.edui-default .edui-listitem {\n    padding: 1px;\n    white-space: nowrap;\n}\n\n.edui-default .edui-list .edui-state-hover {\n    position: relative;\n    background-color: #fff5d4;\n    border: 1px solid #dcac6c;\n    padding: 0;\n}\n\n.edui-default .edui-for-fontfamily .edui-listitem-label {\n    min-width: 130px;\n    _width: 120px;\n    font-size: 12px;\n    height: 22px;\n    line-height: 22px;\n    padding-left: 5px;\n}\n.edui-default .edui-for-insertcode .edui-listitem-label {\n    min-width: 120px;\n    _width: 120px;\n    font-size: 12px;\n    height: 22px;\n    line-height: 22px;\n    padding-left: 5px;\n}\n.edui-default .edui-for-underline .edui-listitem-label {\n    min-width: 120px;\n    _width: 120px;\n    padding: 3px 5px;\n    font-size: 12px;\n}\n\n.edui-default .edui-for-fontsize .edui-listitem-label {\n    min-width: 120px;\n    _width: 120px;\n    padding: 3px 5px;\n\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label {\n    min-width: 200px;\n    _width: 200px;\n    padding: 2px 5px;\n}\n\n.edui-default .edui-for-rowspacingtop .edui-listitem-label,\n.edui-default .edui-for-rowspacingbottom .edui-listitem-label {\n    min-width: 53px;\n    _width: 53px;\n    padding: 2px 5px;\n}\n\n.edui-default .edui-for-lineheight .edui-listitem-label {\n    min-width: 53px;\n    _width: 53px;\n    padding: 2px 5px;\n}\n\n.edui-default .edui-for-customstyle .edui-listitem-label {\n    min-width: 200px;\n    _width: 200px;\n    width: 200px !important;\n    padding: 2px 5px;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/message.css",
    "content": ".edui-default .edui-editor-messageholder {\n    display: block;\n    width: 150px;\n    height: auto;\n    border: 0;\n    margin: 0;\n    padding: 0;\n    position: absolute;\n    top: 28px;\n    right: 3px;\n}\n\n.edui-default .edui-message{\n    min-height: 10px;\n    text-shadow: 0 1px 0 rgba(255,255,255,0.5);\n    padding: 0;\n    margin-bottom: 3px;\n    position: relative;\n}\n.edui-default .edui-message-body{\n    border-radius: 3px;\n    padding: 8px 15px 8px 8px;\n    color: #c09853;\n    background-color: #fcf8e3;\n    border: 1px solid #fbeed5;\n}\n.edui-default .edui-message-type-info{\n    color: #3a87ad;\n    background-color: #d9edf7;\n    border-color: #bce8f1\n}\n.edui-default .edui-message-type-success{\n    color: #468847;\n    background-color: #dff0d8;\n    border-color: #d6e9c6\n}\n.edui-default .edui-message-type-danger,\n.edui-default .edui-message-type-error{\n    color: #b94a48;\n    background-color: #f2dede;\n    border-color: #eed3d7\n}\n.edui-default .edui-message .edui-message-closer {\n    display: block;\n    width: 16px;\n    height: 16px;\n    line-height: 16px;\n    position: absolute;\n    top: 0;\n    right: 0;\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    float: right;\n    font-size: 20px;\n    font-weight: bold;\n    color: #999;\n    text-shadow: 0 1px 0 #fff;\n    font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n}\n.edui-default .edui-message .edui-message-content {\n    font-size: 10pt;\n    word-wrap: break-word;\n    word-break: normal;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/multiMenu.css",
    "content": "/*表情按钮及弹出菜单*/\n/*去除了表情的下拉箭头*/\n.edui-default .edui-for-emotion .edui-icon {\n    background-position: -60px -20px;\n}\n.edui-default .edui-for-emotion .edui-popup-content iframe\n{\n    width: 514px;\n    height: 380px;\n    overflow: hidden;\n}\n.edui-default .edui-for-emotion .edui-popup-content\n{\n    position: relative;\n    z-index: 555\n}\n\n.edui-default .edui-for-emotion .edui-splitborder {\n    display: none\n}\n\n.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow\n{\n    width: 0\n}\n.edui-default .edui-toolbar .edui-for-emotion  .edui-state-active .edui-splitborder\n{\n    border-left: 1px solid transparent;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/paragraphpicker.css",
    "content": "/*段落弹出菜单*/\n.edui-default .edui-for-paragraph .edui-listitem-label {\n    font-family: Tahoma, Verdana, Arial, Helvetica;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p {\n    font-size: 22px;\n    line-height: 27px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 {\n    font-weight: bolder;\n    font-size: 32px;\n    line-height: 36px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 {\n    font-weight: bolder;\n    font-size: 27px;\n    line-height: 29px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 {\n    font-weight: bolder;\n    font-size: 19px;\n    line-height: 23px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 {\n    font-weight: bolder;\n    font-size: 16px;\n    line-height: 19px\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 {\n    font-weight: bolder;\n    font-size: 13px;\n    line-height: 16px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 {\n    font-weight: bolder;\n    font-size: 12px;\n    line-height: 14px;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/pastepicker.css",
    "content": "/*粘贴弹出菜单*/\n.edui-default .edui-wordpastepop .edui-popup-content{\n    border: none;\n    padding: 0;\n    width: 54px;\n    height: 21px;\n}\n.edui-default  .edui-pasteicon {\n    width: 100%;\n    height: 100%;\n    background-image: url('../images/wordpaste.png');\n    background-position: 0 0;\n}\n\n.edui-default  .edui-pasteicon.edui-state-opened {\n    background-position: 0 -34px;\n}\n\n.edui-default  .edui-pastecontainer {\n    position: relative;\n    visibility: hidden;\n    width: 97px;\n    background: #fff;\n    border: 1px solid #ccc;\n}\n\n.edui-default  .edui-pastecontainer .edui-title {\n    font-weight: bold;\n    background: #F8F8FF;\n    height: 25px;\n    line-height: 25px;\n    font-size: 12px;\n    padding-left: 5px;\n}\n\n.edui-default  .edui-pastecontainer .edui-button {\n    overflow: hidden;\n    margin: 3px 0;\n}\n\n.edui-default  .edui-pastecontainer .edui-button .edui-richtxticon,\n.edui-default  .edui-pastecontainer .edui-button .edui-tagicon,\n.edui-default  .edui-pastecontainer .edui-button .edui-plaintxticon{\n    float: left;\n    cursor: pointer;\n    width: 29px;\n    height: 29px;\n    margin-left: 5px;\n    background-image: url('../images/wordpaste.png');\n    background-repeat: no-repeat;\n}\n.edui-default  .edui-pastecontainer .edui-button .edui-richtxticon {\n    margin-left: 0;\n    background-position: -109px 0;\n}\n.edui-default  .edui-pastecontainer .edui-button .edui-tagicon {\n    background-position: -148px 1px;\n}\n\n.edui-default  .edui-pastecontainer .edui-button .edui-plaintxticon {\n    background-position: -72px 0;\n}\n\n.edui-default  .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon {\n    background-position: -109px -34px;\n}\n.edui-default  .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{\n    background-position: -148px -34px;\n}\n.edui-default  .edui-pastecontainer .edui-button  .edui-state-hover .edui-plaintxticon{\n    background-position: -72px -34px;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/popup.css",
    "content": "/* 弹出菜单 */\n.edui-default .edui-popup {\n    z-index: 3000;\n    background-color: #ffffff;\n    width:auto;\n    height:auto;\n\n}\n\n.edui-default .edui-popup .edui-shadow {\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.edui-default .edui-popup-content {\n    border:1px solid #ccc;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    *border-right-width: 2px;\n    *border-bottom-width: 2px;\n    -webkit-border-radius: 6px;\n    -moz-border-radius: 6px;\n    border-radius: 6px;\n    -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);\n    -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);\n    box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);\n    -webkit-background-clip: padding-box;\n    -moz-background-clip: padding;\n    background-clip: padding-box;\n    padding: 5px;\n    background:#ffffff;\n}\n\n.edui-default .edui-popup .edui-bordereraser {\n    background-color: white;\n    height: 3px;\n}\n\n.edui-default .edui-menu .edui-bordereraser {\n    height: 3px;\n}\n\n.edui-default .edui-anchor-topleft .edui-bordereraser {\n    left: 1px;\n    top: -2px;\n}\n\n.edui-default .edui-anchor-topright .edui-bordereraser {\n    right: 1px;\n    top: -2px;\n}\n\n.edui-default .edui-anchor-bottomleft .edui-bordereraser {\n    left: 0;\n    bottom: -6px;\n    height: 7px;\n    border-left: 1px solid gray;\n    border-right: 1px solid gray;\n}\n\n.edui-default .edui-anchor-bottomright .edui-bordereraser {\n    right: 0;\n    bottom: -6px;\n    height: 7px;\n    border-left: 1px solid gray;\n    border-right: 1px solid gray;\n}\n\n.edui-popup div{\n    width:auto;\n    height:auto;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/separtor.css",
    "content": "/*分隔线*/\n.edui-default .edui-toolbar .edui-separator {\n    width: 2px;\n    height: 20px;\n    margin: 2px 4px 2px 3px;\n    background: url(../images/icons.png) -181px 0;\n    background: url(../images/icons.gif) -181px 0 \\9;\n}\n"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/shortcutmenu.css",
    "content": "/*弹出菜单*/\n.edui-default .edui-shortcutmenu {\n    padding: 2px;\n    width: 190px;\n    height: 50px;\n    background-color: #fff;\n    border: 1px solid #ccc;\n    border-radius: 5px;\n}\n"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/splitbutton.css",
    "content": "/*splitbutton*/\n.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,\n.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow {\n    background: url(../images/icons.png) -741px 0;\n    _background: url(../images/icons.gif) -741px 0;\n    height: 20px;\n    width: 9px;\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body {\n    padding: 1px;\n}\n\n.edui-default .edui-toolbar .edui-splitborder {\n    width: 1px;\n    height: 20px;\n}\n\n.edui-default .edui-toolbar .edui-state-hover .edui-splitborder {\n    width: 1px;\n    border-left: 0px solid #dcac6c;\n}\n\n.edui-default .edui-toolbar .edui-state-active .edui-splitborder {\n    width: 0;\n    border-left: 1px solid gray;\n}\n\n.edui-default .edui-toolbar .edui-state-opened .edui-splitborder {\n    width: 1px;\n    border: 0;\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body {\n    background-color: #fff5d4;\n    border: 1px solid #dcac6c;\n    padding: 0;\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body {\n    background-color: #FFE69F;\n    border: 1px solid #DCAC6C;\n    padding: 0;\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body {\n    background-color: #ffffff;\n    border: 1px solid gray;\n    padding: 0;\n}\n\n.edui-default .edui-state-disabled .edui-arrow {\n    opacity: 0.3;\n    _filter: alpha(opacity = 30);\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body {\n    background-color: white;\n    border: 1px solid gray;\n    padding: 0;\n}\n\n.edui-default .edui-for-insertorderedlist .edui-bordereraser,\n.edui-default .edui-for-lineheight .edui-bordereraser,\n.edui-default .edui-for-rowspacingtop .edui-bordereraser,\n.edui-default .edui-for-rowspacingbottom .edui-bordereraser,\n.edui-default .edui-for-insertunorderedlist .edui-bordereraser {\n    background-color: white;\n}\n\n/* 解决嵌套导致的图标问题 */\n.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,\n.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,\n.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,\n.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,\n.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon {\n    /*background-position: 0 -40px;*/\n    background-image: none  ;\n}\n"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/tablepicker.css",
    "content": "/* 表格弹出菜单 */\n.edui-default .edui-for-inserttable .edui-splitborder {\n    display: none\n}\n.edui-default .edui-for-inserttable  .edui-splitbutton-body .edui-arrow {\n    width: 0\n}\n.edui-default .edui-toolbar .edui-for-inserttable  .edui-state-active .edui-splitborder{\n    border-left: 1px solid transparent;\n}\n.edui-default .edui-tablepicker .edui-infoarea {\n    height: 14px;\n    line-height: 14px;\n    font-size: 12px;\n    width: 220px;\n    margin-bottom: 3px;\n    clear: both;\n}\n\n.edui-default .edui-tablepicker .edui-infoarea .edui-label {\n    float: left;\n}\n\n.edui-default .edui-dialog-buttons .edui-label {\n    line-height: 24px;\n}\n\n.edui-default .edui-tablepicker .edui-infoarea .edui-clickable {\n    float: right;\n}\n\n.edui-default .edui-tablepicker .edui-pickarea {\n    background: url(\"../images/unhighlighted.gif\") repeat;\n    height: 220px;\n    width: 220px;\n}\n\n.edui-default .edui-tablepicker .edui-pickarea .edui-overlay {\n    background: url(\"../images/highlighted.gif\") repeat;\n}\n"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/toolbar.css",
    "content": "/* 工具栏 */\n.edui-default .edui-toolbar {\n    cursor: default;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    padding: 1px;\n    overflow: hidden; /*全屏下单独一行不占位*/\n    zoom: 1;\n    width:auto;\n    height:auto;\n}\n\n.edui-default .edui-toolbar .edui-button,\n.edui-default .edui-toolbar .edui-splitbutton,\n.edui-default .edui-toolbar .edui-menubutton,\n.edui-default .edui-toolbar .edui-combox {\n    margin: 1px;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/ueditor.css",
    "content": "/*根据UI结构重写CSS，仅在相应UI组件创建时，加载对应css，顺序加载\n*/\n\n/*-------基础UI构建，必须加载-------*/\n@import \"uibase.css\";\n@import \"toolbar.css\";\n@import \"editor.css\";\n\n\n/*-------可选中菜单按钮，按需加载-------*/\n    /*可选中菜单按钮--依赖splitbutton*/\n@import \"menubutton.css\";\n    /*可选中菜单按钮-弹出菜单*/\n@import \"menu.css\";\n\n\n/*-------不可选中菜单按钮，按需加载-------*/\n    /*不可选中菜单按钮--依赖splitbutton*/\n@import \"combox.css\";\n\n\n/*-------按钮类型，按需加载-------*/\n    /*普通按钮*/\n@import \"button.css\";\n    /*按钮icon*/\n@import \"buttonicon.css\";\n    /*弹出菜单按钮-附加按钮*/\n@import \"splitbutton.css\";\n    /*弹出菜单*/\n@import \"popup.css\";\n    /*提示消息*/\n@import \"message.css\";\n\n\n/*-------独立按钮样式，按需加载-------*/\n    /*弹出对话框样式*/\n@import \"dialog.css\";\n    /*段落格式弹出菜单*/\n@import \"paragraphpicker.css\";\n    /*表格弹出菜单*/\n@import \"tablepicker.css\";\n    /*颜色弹出菜单*/\n@import \"colorpicker.css\";\n    /*自动排版弹出菜单*/\n@import \"autotypesetpicker.css\";\n    /*平均分布菜单*/\n@import \"cellalignpicker.css\";\n    /*分隔线*/\n@import \"separtor.css\";\n    /*颜色按钮--依赖splitbutton*/\n@import \"colorbutton.css\";\n    /*表情按钮--依赖splitbutton*/\n@import \"multiMenu.css\";\n    /*右键菜单*/\n@import \"contextmenu.css\";\n    /*快捷菜单*/\n@import \"shortcutmenu.css\";\n    /*粘贴提示*/\n@import \"pastepicker.css\";"
  },
  {
    "path": "static/common/user/uedit/themes/default/_css/uibase.css",
    "content": "/*基础UI构建\n*/\n/* common layer */\n.edui-default .edui-box {\n    border: none;\n    padding: 0;\n    margin: 0;\n    overflow: hidden;\n}\n\n.edui-default a.edui-box {\n    display: block;\n    text-decoration: none;\n    color: black;\n}\n\n.edui-default a.edui-box:hover {\n    text-decoration: none;\n}\n\n.edui-default a.edui-box:active {\n    text-decoration: none;\n}\n\n.edui-default table.edui-box {\n    border-collapse: collapse;\n}\n\n.edui-default ul.edui-box {\n    list-style-type: none;\n}\n\ndiv.edui-box {\n    position: relative;\n    display: -moz-inline-box !important;\n    display: inline-block !important;\n    vertical-align: top;\n}\n\n.edui-default .edui-clearfix {\n    zoom: 1\n}\n\n.edui-default .edui-clearfix:after {\n    content: '\\20';\n    display: block;\n    clear: both;\n}\n\n * html div.edui-box {\n    display: inline !important;\n}\n\n*:first-child+html div.edui-box {\n    display: inline !important;\n}\n\n/* control layout */\n.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body {\n    position: relative;\n}\n\n.edui-default .edui-popup {\n    position: absolute;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n}\n\n.edui-default .edui-popup .edui-shadow {\n    position: absolute;\n    z-index: -1;\n}\n\n.edui-default .edui-popup .edui-bordereraser {\n    position: absolute;\n    overflow: hidden;\n}\n\n.edui-default .edui-tablepicker .edui-canvas {\n    position: relative;\n}\n\n.edui-default .edui-tablepicker .edui-canvas .edui-overlay {\n    position: absolute;\n}\n\n.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.edui-default .edui-toolbar {\n    position: relative;\n}\n\n/*\n * default theme\n */\n.edui-default .edui-label {\n    cursor: default;\n}\n\n.edui-default span.edui-clickable {\n    color: blue;\n    cursor: pointer;\n    text-decoration: underline;\n}\n\n.edui-default span.edui-unclickable {\n    color: gray;\n    cursor: default;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/css/ueditor.css",
    "content": "/*基础UI构建\n*/\n/* common layer */\n.edui-default .edui-box {\n    border: none;\n    padding: 0;\n    margin: 0;\n    overflow: hidden;\n}\n\n.edui-default a.edui-box {\n    display: block;\n    text-decoration: none;\n    color: black;\n}\n\n.edui-default a.edui-box:hover {\n    text-decoration: none;\n}\n\n.edui-default a.edui-box:active {\n    text-decoration: none;\n}\n\n.edui-default table.edui-box {\n    border-collapse: collapse;\n}\n\n.edui-default ul.edui-box {\n    list-style-type: none;\n}\n\ndiv.edui-box {\n    position: relative;\n    display: -moz-inline-box !important;\n    display: inline-block !important;\n    vertical-align: top;\n}\n\n.edui-default .edui-clearfix {\n    zoom: 1\n}\n\n.edui-default .edui-clearfix:after {\n    content: '\\20';\n    display: block;\n    clear: both;\n}\n\n * html div.edui-box {\n    display: inline !important;\n}\n\n*:first-child+html div.edui-box {\n    display: inline !important;\n}\n\n/* control layout */\n.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body {\n    position: relative;\n}\n\n.edui-default .edui-popup {\n    position: absolute;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n}\n\n.edui-default .edui-popup .edui-shadow {\n    position: absolute;\n    z-index: -1;\n}\n\n.edui-default .edui-popup .edui-bordereraser {\n    position: absolute;\n    overflow: hidden;\n}\n\n.edui-default .edui-tablepicker .edui-canvas {\n    position: relative;\n}\n\n.edui-default .edui-tablepicker .edui-canvas .edui-overlay {\n    position: absolute;\n}\n\n.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.edui-default .edui-toolbar {\n    position: relative;\n}\n\n/*\n * default theme\n */\n.edui-default .edui-label {\n    cursor: default;\n}\n\n.edui-default span.edui-clickable {\n    color: blue;\n    cursor: pointer;\n    text-decoration: underline;\n}\n\n.edui-default span.edui-unclickable {\n    color: gray;\n    cursor: default;\n}\n/* 工具栏 */\n.edui-default .edui-toolbar {\n    cursor: default;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    padding: 1px;\n    overflow: hidden; /*全屏下单独一行不占位*/\n    zoom: 1;\n    width:auto;\n    height:auto;\n}\n\n.edui-default .edui-toolbar .edui-button,\n.edui-default .edui-toolbar .edui-splitbutton,\n.edui-default .edui-toolbar .edui-menubutton,\n.edui-default .edui-toolbar .edui-combox {\n    margin: 1px;\n}\n/*UI工具栏、编辑区域、底部*/\n.edui-default .edui-editor {\n    border: 1px solid #d4d4d4;\n    background-color: white;\n    position: relative;\n    overflow: visible;\n    -webkit-border-radius: 4px;\n    -moz-border-radius: 4px;\n    border-radius: 4px;\n}\n.edui-editor div{\n    width:auto;\n    height:auto;\n}\n.edui-default .edui-editor-toolbarbox {\n    position: relative;\n    zoom: 1;\n    -webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);\n    -moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);\n    box-shadow:0 1px 4px rgba(204, 204, 204, 0.6);\n    border-top-left-radius:2px;\n    border-top-right-radius:2px;\n}\n\n.edui-default .edui-editor-toolbarboxouter {\n    border-bottom: 1px solid #d4d4d4;\n    background-color: #fafafa;\n    background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));\n    background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);\n    background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);\n    background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);\n    background-repeat: repeat-x;\n    /*border: 1px solid #d4d4d4;*/\n    -webkit-border-radius: 4px 4px 0 0;\n    -moz-border-radius: 4px 4px 0 0;\n    border-radius: 4px 4px 0 0;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);\n    *zoom: 1;\n    -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n    -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n}\n\n.edui-default .edui-editor-toolbarboxinner {\n    padding: 2px;\n}\n\n.edui-default .edui-editor-iframeholder {\n    position: relative;\n    /*for fix ie6 toolbarmsg under iframe bug. relative -> static */\n    /*_position: static !important;*\n}\n\n.edui-default .edui-editor-iframeholder textarea {\n    font-family: consolas, \"Courier New\", \"lucida console\", monospace;\n    font-size: 12px;\n    line-height: 18px;\n}\n\n.edui-default .edui-editor-bottombar {\n    /*border-top: 1px solid #ccc;*/\n    /*height: 20px;*/\n    /*width: 40%;*/\n    /*float: left;*/\n    /*overflow: hidden;*/\n}\n\n.edui-default .edui-editor-bottomContainer {\n    overflow: hidden;\n}\n\n.edui-default .edui-editor-bottomContainer table {\n    width: 100%;\n    height: 0;\n    overflow: hidden;\n    border-spacing: 0;\n}\n\n.edui-default .edui-editor-bottomContainer td {\n    white-space: nowrap;\n    border-top: 1px solid #ccc;\n    line-height: 20px;\n    font-size: 12px;\n    font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif;\n}\n\n.edui-default .edui-editor-wordcount {\n    text-align: right;\n    margin-right: 5px;\n    color: #aaa;\n}\n.edui-default .edui-editor-scale {\n    width: 12px;\n}\n.edui-default .edui-editor-scale .edui-editor-icon {\n    float: right;\n    width: 100%;\n    height: 12px;\n    margin-top: 10px;\n    background: url(../images/scale.png) no-repeat;\n    cursor: se-resize;\n}\n.edui-default .edui-editor-breadcrumb {\n    margin: 2px 0 0 3px;\n}\n\n.edui-default .edui-editor-breadcrumb span {\n    cursor: pointer;\n    text-decoration: underline;\n    color: blue;\n}\n\n.edui-default .edui-toolbar .edui-for-fullscreen {\n    float: right;\n}\n\n.edui-default .edui-bubble .edui-popup-content {\n    border: 1px solid #DCAC6C;\n    background-color: #fff6d9;\n    padding: 5px;\n    font-size: 10pt;\n    font-family: \"宋体\";\n}\n\n.edui-default .edui-bubble .edui-shadow {\n    /*box-shadow: 1px 1px 3px #818181;*/\n    /*-webkit-box-shadow: 2px 2px 3px #818181;*/\n    /*-moz-box-shadow: 2px 2px 3px #818181;*/\n    /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/\n}\n\n.edui-default .edui-editor-toolbarmsg {\n    background-color: #FFF6D9;\n    border-bottom: 1px solid #ccc;\n    position: absolute;\n    bottom: -25px;\n    left: 0;\n    z-index: 1009;\n    width: 99.9%;\n}\n\n.edui-default .edui-editor-toolbarmsg-upload {\n    font-size: 14px;\n    color: blue;\n    width: 100px;\n    height: 16px;\n    line-height: 16px;\n    cursor: pointer;\n    position: absolute;\n    top: 5px;\n    left: 350px;\n}\n\n.edui-default .edui-editor-toolbarmsg-label {\n    font-size: 12px;\n    line-height: 16px;\n    padding: 4px;\n}\n\n.edui-default .edui-editor-toolbarmsg-close {\n    float: right;\n    width: 20px;\n    height: 16px;\n    line-height: 16px;\n    cursor: pointer;\n    color: red;\n}\n/*可选中菜单按钮*/\n.edui-default .edui-list .edui-bordereraser {\n    display: none;\n}\n\n.edui-default .edui-listitem {\n    padding: 1px;\n    white-space: nowrap;\n}\n\n.edui-default .edui-list .edui-state-hover {\n    position: relative;\n    background-color: #fff5d4;\n    border: 1px solid #dcac6c;\n    padding: 0;\n}\n\n.edui-default .edui-for-fontfamily .edui-listitem-label {\n    min-width: 130px;\n    _width: 120px;\n    font-size: 12px;\n    height: 22px;\n    line-height: 22px;\n    padding-left: 5px;\n}\n.edui-default .edui-for-insertcode .edui-listitem-label {\n    min-width: 120px;\n    _width: 120px;\n    font-size: 12px;\n    height: 22px;\n    line-height: 22px;\n    padding-left: 5px;\n}\n.edui-default .edui-for-underline .edui-listitem-label {\n    min-width: 120px;\n    _width: 120px;\n    padding: 3px 5px;\n    font-size: 12px;\n}\n\n.edui-default .edui-for-fontsize .edui-listitem-label {\n    min-width: 120px;\n    _width: 120px;\n    padding: 3px 5px;\n\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label {\n    min-width: 200px;\n    _width: 200px;\n    padding: 2px 5px;\n}\n\n.edui-default .edui-for-rowspacingtop .edui-listitem-label,\n.edui-default .edui-for-rowspacingbottom .edui-listitem-label {\n    min-width: 53px;\n    _width: 53px;\n    padding: 2px 5px;\n}\n\n.edui-default .edui-for-lineheight .edui-listitem-label {\n    min-width: 53px;\n    _width: 53px;\n    padding: 2px 5px;\n}\n\n.edui-default .edui-for-customstyle .edui-listitem-label {\n    min-width: 200px;\n    _width: 200px;\n    width: 200px !important;\n    padding: 2px 5px;\n}\n/* 可选中按钮弹出菜单*/\n.edui-default .edui-menu {\n    z-index: 3000;\n}\n\n.edui-default .edui-menu .edui-popup-content {\n    padding: 3px;\n}\n\n.edui-default .edui-menu-body {\n    _width: 150px;\n    min-width: 170px;\n    background: url(\"../images/sparator_v.png\") repeat-y 25px;\n}\n\n.edui-default .edui-menuitem-body {\n}\n\n.edui-default .edui-menuitem {\n    height: 20px;\n    cursor: default;\n    vertical-align: top;\n}\n\n.edui-default .edui-menuitem .edui-icon {\n    width: 20px !important;\n    height: 20px !important;\n    background: url(../images/icons.png) 0 -4000px;\n    background: url(../images/icons.gif) 0 -4000px\\9;\n}\n\n.edui-default .edui-menuitem .edui-label {\n    font-size: 12px;\n    line-height: 20px;\n    height: 20px;\n    padding-left: 10px;\n}\n\n.edui-default .edui-state-checked .edui-menuitem-body {\n    background: url(\"../images/icons-all.gif\") no-repeat 6px -205px;\n}\n\n.edui-default .edui-state-disabled .edui-menuitem-label {\n    color: gray;\n}\n\n\n/*不可选中菜单按钮 */\n.edui-default .edui-toolbar .edui-combox-body .edui-button-body {\n    width: 60px;\n    font-size: 12px;\n    height: 20px;\n    line-height: 20px;\n    padding-left: 5px;\n    white-space: nowrap;\n    margin: 0 3px 0 0;\n}\n\n.edui-default .edui-toolbar .edui-combox-body .edui-arrow {\n    background: url(../images/icons.png) -741px 0;\n    _background: url(../images/icons.gif) -741px 0;\n    height: 20px;\n    width: 9px;\n}\n\n.edui-default .edui-toolbar .edui-combox .edui-combox-body {\n    border: 1px solid #CCC;\n    background-color: white;\n    border-radius: 2px;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n}\n\n.edui-default .edui-toolbar .edui-combox-body .edui-splitborder {\n    display: none;\n}\n\n.edui-default .edui-toolbar .edui-combox-body .edui-arrow {\n    border-left: 1px solid #CCC;\n}\n\n.edui-default .edui-toolbar .edui-state-hover .edui-combox-body {\n    background-color: #fff5d4;\n    border: 1px solid #dcac6c;\n}\n\n.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow {\n    border-left: 1px solid #dcac6c;\n}\n\n.edui-default .edui-toolbar .edui-state-checked .edui-combox-body {\n    background-color: #FFE69F;\n    border: 1px solid #DCAC6C;\n}\n\n.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow {\n    border-left: 1px solid #DCAC6C;\n}\n\n.edui-toolbar .edui-state-disabled .edui-combox-body {\n    background-color: #F0F0EE;\n    opacity: 0.3;\n    filter: alpha(opacity = 30);\n}\n\n.edui-toolbar .edui-state-opened .edui-combox-body {\n    background-color: white;\n    border: 1px solid gray;\n}\n/*普通按钮样式及状态*/\n.edui-default .edui-toolbar .edui-button .edui-icon,\n.edui-default .edui-toolbar .edui-menubutton .edui-icon,\n.edui-default .edui-toolbar .edui-splitbutton .edui-icon {\n    height: 20px !important;\n    width: 20px !important;\n    background-image: url(../images/icons.png);\n    background-image: url(../images/icons.gif) \\9;\n}\n\n.edui-default .edui-toolbar .edui-button .edui-button-wrap {\n    padding: 1px;\n    position: relative;\n}\n\n.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap {\n    background-color: #fff5d4;\n    padding: 0;\n    border: 1px solid #dcac6c;\n}\n\n.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap {\n    background-color: #ffe69f;\n    padding: 0;\n    border: 1px solid #dcac6c;\n    border-radius: 2px;\n    -webkit-border-radius: 2px;\n    -moz-border-radius: 2px;\n}\n\n.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap {\n    background-color: #ffffff;\n    padding: 0;\n    border: 1px solid gray;\n}\n.edui-default .edui-toolbar .edui-state-disabled .edui-label {\n    color: #ccc;\n}\n.edui-default .edui-toolbar .edui-state-disabled .edui-icon {\n    opacity: 0.3;\n    filter: alpha(opacity = 30);\n}\n\n/* toolbar icons */\n.edui-default .edui-for-undo .edui-icon {\n    background-position: -160px 0;\n}\n\n.edui-default  .edui-for-redo .edui-icon {\n    background-position: -100px 0;\n}\n\n.edui-default  .edui-for-bold .edui-icon {\n    background-position: 0 0;\n}\n\n.edui-default  .edui-for-italic .edui-icon {\n    background-position: -60px 0;\n}\n\n.edui-default  .edui-for-fontborder .edui-icon {\n    background-position:-160px -40px;\n}\n.edui-default  .edui-for-underline .edui-icon {\n    background-position: -140px 0;\n}\n\n.edui-default  .edui-for-strikethrough .edui-icon {\n    background-position: -120px 0;\n}\n\n.edui-default  .edui-for-subscript .edui-icon {\n    background-position: -600px 0;\n}\n\n.edui-default  .edui-for-superscript .edui-icon {\n    background-position: -620px 0;\n}\n\n.edui-default  .edui-for-blockquote .edui-icon {\n    background-position: -220px 0;\n}\n\n.edui-default  .edui-for-forecolor .edui-icon {\n    background-position: -720px 0;\n}\n\n.edui-default  .edui-for-backcolor .edui-icon {\n    background-position: -760px 0;\n}\n\n.edui-default  .edui-for-inserttable .edui-icon {\n    background-position: -580px -20px;\n}\n\n.edui-default  .edui-for-autotypeset .edui-icon {\n    background-position: -640px -40px;\n}\n\n.edui-default  .edui-for-justifyleft .edui-icon {\n    background-position: -460px 0;\n}\n\n.edui-default  .edui-for-justifycenter .edui-icon {\n    background-position: -420px 0;\n}\n\n.edui-default  .edui-for-justifyright .edui-icon {\n    background-position: -480px 0;\n}\n\n.edui-default  .edui-for-justifyjustify .edui-icon {\n    background-position: -440px 0;\n}\n\n.edui-default  .edui-for-insertorderedlist .edui-icon {\n    background-position: -80px 0;\n}\n\n.edui-default  .edui-for-insertunorderedlist .edui-icon {\n    background-position: -20px 0;\n}\n\n.edui-default  .edui-for-lineheight .edui-icon {\n    background-position: -725px -40px;\n}\n\n.edui-default  .edui-for-rowspacingbottom .edui-icon {\n    background-position: -745px -40px;\n}\n\n.edui-default  .edui-for-rowspacingtop .edui-icon {\n    background-position: -765px -40px;\n}\n\n.edui-default  .edui-for-horizontal .edui-icon {\n    background-position: -360px 0;\n}\n\n.edui-default  .edui-for-link .edui-icon {\n    background-position: -500px 0;\n}\n\n.edui-default  .edui-for-code .edui-icon {\n    background-position: -440px -40px;\n}\n\n.edui-default  .edui-for-insertimage .edui-icon {\n    background-position: -726px -77px;\n}\n\n.edui-default  .edui-for-insertframe .edui-icon {\n    background-position: -240px -40px;\n}\n\n.edui-default  .edui-for-emoticon .edui-icon {\n    background-position: -60px -20px;\n}\n\n.edui-default  .edui-for-spechars .edui-icon {\n    background-position: -240px 0;\n}\n\n.edui-default  .edui-for-help .edui-icon {\n    background-position: -340px 0;\n}\n\n.edui-default  .edui-for-print .edui-icon {\n    background-position: -440px -20px;\n}\n\n.edui-default  .edui-for-preview .edui-icon {\n    background-position: -420px -20px;\n}\n\n.edui-default  .edui-for-selectall .edui-icon {\n    background-position: -400px -20px;\n}\n\n.edui-default  .edui-for-searchreplace .edui-icon {\n    background-position: -520px -20px;\n}\n\n.edui-default  .edui-for-map .edui-icon {\n    background-position: -40px -40px;\n}\n\n.edui-default  .edui-for-gmap .edui-icon {\n    background-position: -260px -40px;\n}\n\n.edui-default  .edui-for-insertvideo .edui-icon {\n    background-position: -320px -20px;\n}\n\n.edui-default  .edui-for-time .edui-icon {\n    background-position: -160px -20px;\n}\n\n.edui-default  .edui-for-date .edui-icon {\n    background-position: -140px -20px;\n}\n\n.edui-default  .edui-for-cut .edui-icon {\n    background-position: -680px 0;\n}\n\n.edui-default  .edui-for-copy .edui-icon {\n    background-position: -700px 0;\n}\n\n.edui-default  .edui-for-paste .edui-icon {\n    background-position: -560px 0;\n}\n\n.edui-default  .edui-for-formatmatch .edui-icon {\n    background-position: -40px 0;\n}\n\n.edui-default  .edui-for-pasteplain .edui-icon {\n    background-position: -360px -20px;\n}\n\n.edui-default  .edui-for-directionalityltr .edui-icon {\n    background-position: -20px -20px;\n}\n\n.edui-default  .edui-for-directionalityrtl .edui-icon {\n    background-position: -40px -20px;\n}\n\n.edui-default  .edui-for-source .edui-icon {\n    background-position: -261px -0px;\n}\n\n.edui-default  .edui-for-removeformat .edui-icon {\n    background-position: -580px 0;\n}\n\n.edui-default  .edui-for-unlink .edui-icon {\n    background-position: -640px 0;\n}\n\n.edui-default  .edui-for-touppercase .edui-icon {\n    background-position: -786px 0;\n}\n\n.edui-default  .edui-for-tolowercase .edui-icon {\n    background-position: -806px 0;\n}\n\n.edui-default  .edui-for-insertrow .edui-icon {\n    background-position: -478px -76px;\n}\n\n.edui-default  .edui-for-insertrownext .edui-icon {\n    background-position: -498px -76px;\n}\n\n.edui-default  .edui-for-insertcol .edui-icon {\n    background-position: -455px -76px;\n}\n\n.edui-default  .edui-for-insertcolnext  .edui-icon {\n    background-position: -429px -76px;\n}\n\n.edui-default  .edui-for-mergeright .edui-icon {\n    background-position: -60px -40px;\n}\n\n.edui-default  .edui-for-mergedown .edui-icon {\n    background-position: -80px -40px;\n}\n\n.edui-default  .edui-for-splittorows .edui-icon {\n    background-position: -100px -40px;\n}\n\n.edui-default  .edui-for-splittocols .edui-icon {\n    background-position: -120px -40px;\n}\n\n.edui-default  .edui-for-insertparagraphbeforetable .edui-icon {\n    background-position: -140px -40px;\n}\n\n.edui-default  .edui-for-deleterow .edui-icon {\n    background-position: -660px -20px;\n}\n\n.edui-default  .edui-for-deletecol .edui-icon {\n    background-position: -640px -20px;\n}\n\n.edui-default  .edui-for-splittocells .edui-icon {\n    background-position: -800px -20px;\n}\n\n.edui-default  .edui-for-mergecells .edui-icon {\n    background-position: -760px -20px;\n}\n\n.edui-default  .edui-for-deletetable .edui-icon {\n    background-position: -620px -20px;\n}\n\n.edui-default  .edui-for-cleardoc .edui-icon {\n    background-position: -520px 0;\n}\n\n.edui-default  .edui-for-fullscreen .edui-icon {\n    background-position: -100px -20px;\n}\n\n.edui-default  .edui-for-anchor .edui-icon {\n    background-position: -200px 0;\n}\n\n.edui-default  .edui-for-pagebreak .edui-icon {\n    background-position: -460px -40px;\n}\n\n.edui-default  .edui-for-imagenone .edui-icon {\n    background-position: -480px -40px;\n}\n\n.edui-default  .edui-for-imageleft .edui-icon {\n    background-position: -500px -40px;\n}\n\n.edui-default  .edui-for-wordimage .edui-icon {\n    background-position: -660px -40px;\n}\n\n.edui-default  .edui-for-imageright .edui-icon {\n    background-position: -520px -40px;\n}\n\n.edui-default  .edui-for-imagecenter .edui-icon {\n    background-position: -540px -40px;\n}\n\n.edui-default  .edui-for-indent .edui-icon {\n    background-position: -400px 0;\n}\n\n.edui-default  .edui-for-outdent .edui-icon {\n    background-position: -540px 0;\n}\n\n.edui-default  .edui-for-webapp .edui-icon {\n    background-position: -601px -40px\n}\n\n.edui-default  .edui-for-table .edui-icon {\n    background-position: -580px -20px;\n}\n\n.edui-default  .edui-for-edittable .edui-icon {\n    background-position: -420px -40px;\n}\n\n.edui-default  .edui-for-template .edui-icon {\n    background-position: -339px -40px;\n}\n\n.edui-default  .edui-for-delete .edui-icon {\n    background-position: -360px -40px;\n}\n\n.edui-default  .edui-for-attachment .edui-icon {\n    background-position: -620px -40px;\n}\n\n.edui-default  .edui-for-edittd .edui-icon {\n    background-position: -700px -40px;\n}\n\n.edui-default  .edui-for-snapscreen .edui-icon {\n    background-position: -581px -40px\n}\n\n.edui-default  .edui-for-scrawl .edui-icon {\n    background-position: -801px -41px\n}\n\n.edui-default  .edui-for-background .edui-icon {\n    background-position: -680px -40px;\n}\n\n.edui-default  .edui-for-music .edui-icon {\n    background-position: -18px -40px\n}\n\n.edui-default  .edui-for-formula .edui-icon {\n    background-position: -200px -40px\n}\n\n.edui-default  .edui-for-aligntd  .edui-icon {\n    background-position: -236px -76px;\n}\n\n.edui-default  .edui-for-insertparagraphtrue  .edui-icon {\n    background-position: -625px -76px;\n}\n\n.edui-default  .edui-for-insertparagraph  .edui-icon {\n    background-position: -602px -76px;\n}\n\n.edui-default  .edui-for-insertcaption  .edui-icon {\n    background-position: -336px -76px;\n}\n\n.edui-default  .edui-for-deletecaption  .edui-icon {\n    background-position: -362px -76px;\n}\n\n.edui-default  .edui-for-inserttitle  .edui-icon {\n    background-position: -286px -76px;\n}\n\n.edui-default  .edui-for-deletetitle  .edui-icon {\n    background-position: -311px -76px;\n}\n\n.edui-default  .edui-for-aligntable  .edui-icon {\n    background-position: -440px 0;\n}\n\n.edui-default  .edui-for-tablealignment-left  .edui-icon {\n    background-position: -460px 0;\n}\n\n.edui-default  .edui-for-tablealignment-center  .edui-icon {\n    background-position: -420px 0;\n}\n\n.edui-default  .edui-for-tablealignment-right  .edui-icon {\n    background-position: -480px 0;\n}\n\n.edui-default  .edui-for-drafts  .edui-icon {\n    background-position: -560px 0;\n}\n\n.edui-default  .edui-for-charts  .edui-icon {\n    background: url( ../images/charts.png ) no-repeat 2px 3px!important;\n}\n\n.edui-default  .edui-for-inserttitlecol  .edui-icon {\n    background-position: -673px -76px;\n}\n\n.edui-default  .edui-for-deletetitlecol  .edui-icon {\n    background-position: -698px -76px;\n}\n\n.edui-default  .edui-for-simpleupload  .edui-icon {\n    background-position: -380px 0px;\n}\n/*splitbutton*/\n.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,\n.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow {\n    background: url(../images/icons.png) -741px 0;\n    _background: url(../images/icons.gif) -741px 0;\n    height: 20px;\n    width: 9px;\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body {\n    padding: 1px;\n}\n\n.edui-default .edui-toolbar .edui-splitborder {\n    width: 1px;\n    height: 20px;\n}\n\n.edui-default .edui-toolbar .edui-state-hover .edui-splitborder {\n    width: 1px;\n    border-left: 0px solid #dcac6c;\n}\n\n.edui-default .edui-toolbar .edui-state-active .edui-splitborder {\n    width: 0;\n    border-left: 1px solid gray;\n}\n\n.edui-default .edui-toolbar .edui-state-opened .edui-splitborder {\n    width: 1px;\n    border: 0;\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body {\n    background-color: #fff5d4;\n    border: 1px solid #dcac6c;\n    padding: 0;\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body {\n    background-color: #FFE69F;\n    border: 1px solid #DCAC6C;\n    padding: 0;\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body {\n    background-color: #ffffff;\n    border: 1px solid gray;\n    padding: 0;\n}\n\n.edui-default .edui-state-disabled .edui-arrow {\n    opacity: 0.3;\n    _filter: alpha(opacity = 30);\n}\n\n.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,\n.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body {\n    background-color: white;\n    border: 1px solid gray;\n    padding: 0;\n}\n\n.edui-default .edui-for-insertorderedlist .edui-bordereraser,\n.edui-default .edui-for-lineheight .edui-bordereraser,\n.edui-default .edui-for-rowspacingtop .edui-bordereraser,\n.edui-default .edui-for-rowspacingbottom .edui-bordereraser,\n.edui-default .edui-for-insertunorderedlist .edui-bordereraser {\n    background-color: white;\n}\n\n/* 解决嵌套导致的图标问题 */\n.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,\n.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,\n.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,\n.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,\n.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon {\n    /*background-position: 0 -40px;*/\n    background-image: none  ;\n}\n\n/* 弹出菜单 */\n.edui-default .edui-popup {\n    z-index: 3000;\n    background-color: #ffffff;\n    width:auto;\n    height:auto;\n\n}\n\n.edui-default .edui-popup .edui-shadow {\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.edui-default .edui-popup-content {\n    border:1px solid #ccc;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    *border-right-width: 2px;\n    *border-bottom-width: 2px;\n    -webkit-border-radius: 6px;\n    -moz-border-radius: 6px;\n    border-radius: 6px;\n    -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);\n    -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);\n    box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2);\n    -webkit-background-clip: padding-box;\n    -moz-background-clip: padding;\n    background-clip: padding-box;\n    padding: 5px;\n    background:#ffffff;\n}\n\n.edui-default .edui-popup .edui-bordereraser {\n    background-color: white;\n    height: 3px;\n}\n\n.edui-default .edui-menu .edui-bordereraser {\n    height: 3px;\n}\n\n.edui-default .edui-anchor-topleft .edui-bordereraser {\n    left: 1px;\n    top: -2px;\n}\n\n.edui-default .edui-anchor-topright .edui-bordereraser {\n    right: 1px;\n    top: -2px;\n}\n\n.edui-default .edui-anchor-bottomleft .edui-bordereraser {\n    left: 0;\n    bottom: -6px;\n    height: 7px;\n    border-left: 1px solid gray;\n    border-right: 1px solid gray;\n}\n\n.edui-default .edui-anchor-bottomright .edui-bordereraser {\n    right: 0;\n    bottom: -6px;\n    height: 7px;\n    border-left: 1px solid gray;\n    border-right: 1px solid gray;\n}\n\n.edui-popup div{\n    width:auto;\n    height:auto;\n}\n.edui-default .edui-editor-messageholder {\n    display: block;\n    width: 150px;\n    height: auto;\n    border: 0;\n    margin: 0;\n    padding: 0;\n    position: absolute;\n    top: 28px;\n    right: 3px;\n}\n\n.edui-default .edui-message{\n    min-height: 10px;\n    text-shadow: 0 1px 0 rgba(255,255,255,0.5);\n    padding: 0;\n    margin-bottom: 3px;\n    position: relative;\n}\n.edui-default .edui-message-body{\n    border-radius: 3px;\n    padding: 8px 15px 8px 8px;\n    color: #c09853;\n    background-color: #fcf8e3;\n    border: 1px solid #fbeed5;\n}\n.edui-default .edui-message-type-info{\n    color: #3a87ad;\n    background-color: #d9edf7;\n    border-color: #bce8f1\n}\n.edui-default .edui-message-type-success{\n    color: #468847;\n    background-color: #dff0d8;\n    border-color: #d6e9c6\n}\n.edui-default .edui-message-type-danger,\n.edui-default .edui-message-type-error{\n    color: #b94a48;\n    background-color: #f2dede;\n    border-color: #eed3d7\n}\n.edui-default .edui-message .edui-message-closer {\n    display: block;\n    width: 16px;\n    height: 16px;\n    line-height: 16px;\n    position: absolute;\n    top: 0;\n    right: 0;\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    float: right;\n    font-size: 20px;\n    font-weight: bold;\n    color: #999;\n    text-shadow: 0 1px 0 #fff;\n    font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n}\n.edui-default .edui-message .edui-message-content {\n    font-size: 10pt;\n    word-wrap: break-word;\n    word-break: normal;\n}\n/* 弹出对话框按钮和对话框大小 */\n.edui-default .edui-dialog {\n    z-index: 2000;\n    position: absolute;\n\n}\n\n.edui-dialog div{\n    width:auto;\n}\n\n.edui-default .edui-dialog-wrap {\n    margin-right: 6px;\n    margin-bottom: 6px;\n}\n\n.edui-default .edui-dialog-fullscreen-flag {\n    margin-right: 0;\n    margin-bottom: 0;\n}\n\n.edui-default .edui-dialog-body {\n    position: relative;\n    padding:2px 0 0 2px;\n    _zoom: 1;\n}\n\n.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body {\n    padding: 0;\n}\n\n.edui-default .edui-dialog-shadow {\n    position: absolute;\n    z-index: -1;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n    background-color: #ffffff;\n    border: 1px solid #ccc;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    *border-right-width: 2px;\n    *border-bottom-width: 2px;\n    -webkit-border-radius: 6px;\n    -moz-border-radius: 6px;\n    border-radius: 6px;\n    -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n    -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n    -webkit-background-clip: padding-box;\n    -moz-background-clip: padding;\n    background-clip: padding-box;\n}\n\n.edui-default .edui-dialog-foot {\n    background-color: white;\n}\n\n.edui-default .edui-dialog-titlebar {\n    height: 26px;\n    border-bottom: 1px solid #c6c6c6;\n    background: url(../images/dialog-title-bg.png) repeat-x bottom;\n    position: relative;\n    cursor: move;\n}\n.edui-default .edui-dialog-caption {\n    font-weight: bold;\n    font-size: 12px;\n    line-height: 26px;\n    padding-left: 5px;\n}\n\n.edui-default .edui-dialog-draghandle {\n    height: 26px;\n}\n\n.edui-default .edui-dialog-closebutton {\n    position: absolute !important;\n    right: 5px;\n    top: 3px;\n}\n\n.edui-default .edui-dialog-closebutton .edui-button-body {\n    height: 20px;\n    width: 20px;\n    cursor: pointer;\n    background: url(\"../images/icons-all.gif\") no-repeat 0 -59px;\n}\n\n.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body {\n    background: url(\"../images/icons-all.gif\") no-repeat 0 -89px;\n}\n\n.edui-default .edui-dialog-foot {\n    height: 40px;\n}\n\n.edui-default .edui-dialog-buttons {\n    position: absolute;\n    right: 0;\n}\n\n.edui-default .edui-dialog-buttons .edui-button {\n    margin-right: 10px;\n}\n\n.edui-default .edui-dialog-buttons .edui-button .edui-button-body {\n    background: url(\"../images/icons-all.gif\") no-repeat;\n    height: 24px;\n    width: 96px;\n    font-size: 12px;\n    line-height: 24px;\n    text-align: center;\n    cursor: default;\n}\n\n.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body {\n    background: url(\"../images/icons-all.gif\") no-repeat 0 -30px;\n}\n\n.edui-default .edui-dialog iframe {\n    border: 0;\n    padding: 0;\n    margin: 0;\n    vertical-align: top;\n}\n\n.edui-default .edui-dialog-modalmask {\n    opacity: 0.3;\n    filter: alpha(opacity = 30);\n    background-color: #ccc;\n    position: absolute;\n    /*z-index: 1999;*/\n}\n\n.edui-default .edui-dialog-dragmask {\n    position: absolute;\n    /*z-index: 2001;*/\n    background-color: transparent;\n    cursor: move;\n}\n\n.edui-default .edui-dialog-content {\n    position: relative;\n}\n\n.edui-default .dialogcontmask {\n    cursor: move;\n    visibility: hidden;\n    display: block;\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    opacity: 0;\n    filter: alpha(opacity = 0);\n}\n\n/*link-dialog*/\n.edui-default .edui-for-link .edui-dialog-content {\n    width: 420px;\n    height: 200px;\n    overflow: hidden;\n}\n/*background-dialog*/\n.edui-default .edui-for-background .edui-dialog-content {\n    width: 440px;\n    height: 280px;\n    overflow: hidden;\n}\n\n/*template-dialog*/\n.edui-default .edui-for-template .edui-dialog-content {\n    width: 630px;\n    height: 390px;\n    overflow: hidden;\n}\n\n/*scrawl-dialog*/\n.edui-default .edui-for-scrawl .edui-dialog-content {\n    width: 515px;\n    *width: 506px;\n    height: 360px;\n}\n\n/*spechars-dialog*/\n.edui-default .edui-for-spechars .edui-dialog-content {\n    width: 620px;\n    height: 500px;\n    *width: 630px;\n    *height: 570px;\n}\n\n/*image-dialog*/\n.edui-default .edui-for-insertimage .edui-dialog-content {\n    width: 650px;\n    height: 400px;\n    overflow: hidden;\n}\n/*webapp-dialog*/\n.edui-default .edui-for-webapp .edui-dialog-content {\n    width: 560px;\n    _width: 565px;\n    height: 450px;\n    overflow: hidden;\n}\n\n/*image-insertframe*/\n.edui-default .edui-for-insertframe .edui-dialog-content {\n    width: 350px;\n    height: 200px;\n    overflow: hidden;\n}\n\n/*wordImage-dialog*/\n.edui-default .edui-for-wordimage .edui-dialog-content {\n    width: 620px;\n    height: 380px;\n    overflow: hidden;\n}\n\n/*attachment-dialog*/\n.edui-default .edui-for-attachment .edui-dialog-content {\n    width: 650px;\n    height: 400px;\n    overflow: hidden;\n}\n\n\n/*map-dialog*/\n.edui-default .edui-for-map .edui-dialog-content {\n    width: 550px;\n    height: 400px;\n}\n\n/*gmap-dialog*/\n.edui-default .edui-for-gmap .edui-dialog-content {\n    width: 550px;\n    height: 400px;\n}\n\n/*video-dialog*/\n.edui-default .edui-for-insertvideo .edui-dialog-content {\n    width: 590px;\n    height: 390px;\n}\n\n/*anchor-dialog*/\n.edui-default .edui-for-anchor .edui-dialog-content {\n    width: 320px;\n    height: 60px;\n    overflow: hidden;\n}\n\n/*searchreplace-dialog*/\n.edui-default .edui-for-searchreplace .edui-dialog-content {\n    width: 400px;\n    height: 220px;\n}\n\n/*help-dialog*/\n.edui-default .edui-for-help .edui-dialog-content {\n    width: 400px;\n    height: 420px;\n}\n\n/*edittable-dialog*/\n.edui-default .edui-for-edittable .edui-dialog-content {\n    width: 540px;\n    _width:590px;\n    height: 335px;\n}\n\n/*edittip-dialog*/\n.edui-default .edui-for-edittip .edui-dialog-content {\n    width: 225px;\n    height: 60px;\n}\n\n/*edittd-dialog*/\n.edui-default .edui-for-edittd .edui-dialog-content {\n    width: 240px;\n    height: 50px;\n}\n/*snapscreen-dialog*/\n.edui-default .edui-for-snapscreen .edui-dialog-content {\n    width: 400px;\n    height: 220px;\n}\n\n/*music-dialog*/\n.edui-default .edui-for-music .edui-dialog-content {\n    width: 515px;\n    height: 360px;\n}\n\n/*段落弹出菜单*/\n.edui-default .edui-for-paragraph .edui-listitem-label {\n    font-family: Tahoma, Verdana, Arial, Helvetica;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p {\n    font-size: 22px;\n    line-height: 27px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 {\n    font-weight: bolder;\n    font-size: 32px;\n    line-height: 36px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 {\n    font-weight: bolder;\n    font-size: 27px;\n    line-height: 29px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 {\n    font-weight: bolder;\n    font-size: 19px;\n    line-height: 23px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 {\n    font-weight: bolder;\n    font-size: 16px;\n    line-height: 19px\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 {\n    font-weight: bolder;\n    font-size: 13px;\n    line-height: 16px;\n}\n\n.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 {\n    font-weight: bolder;\n    font-size: 12px;\n    line-height: 14px;\n}\n/* 表格弹出菜单 */\n.edui-default .edui-for-inserttable .edui-splitborder {\n    display: none\n}\n.edui-default .edui-for-inserttable  .edui-splitbutton-body .edui-arrow {\n    width: 0\n}\n.edui-default .edui-toolbar .edui-for-inserttable  .edui-state-active .edui-splitborder{\n    border-left: 1px solid transparent;\n}\n.edui-default .edui-tablepicker .edui-infoarea {\n    height: 14px;\n    line-height: 14px;\n    font-size: 12px;\n    width: 220px;\n    margin-bottom: 3px;\n    clear: both;\n}\n\n.edui-default .edui-tablepicker .edui-infoarea .edui-label {\n    float: left;\n}\n\n.edui-default .edui-dialog-buttons .edui-label {\n    line-height: 24px;\n}\n\n.edui-default .edui-tablepicker .edui-infoarea .edui-clickable {\n    float: right;\n}\n\n.edui-default .edui-tablepicker .edui-pickarea {\n    background: url(\"../images/unhighlighted.gif\") repeat;\n    height: 220px;\n    width: 220px;\n}\n\n.edui-default .edui-tablepicker .edui-pickarea .edui-overlay {\n    background: url(\"../images/highlighted.gif\") repeat;\n}\n\n/* 颜色弹出菜单 */\n.edui-default .edui-colorpicker-topbar {\n    height: 27px;\n    width: 200px;\n    /*border-bottom: 1px gray dashed;*/\n}\n\n.edui-default .edui-colorpicker-preview {\n    height: 20px;\n    border: 1px inset black;\n    margin-left: 1px;\n    width: 128px;\n    float: left;\n}\n\n.edui-default .edui-colorpicker-nocolor {\n    float: right;\n    margin-right: 1px;\n    font-size: 12px;\n    line-height: 14px;\n    height: 14px;\n    border: 1px solid #333;\n    padding: 3px 5px;\n    cursor: pointer;\n}\n\n.edui-default .edui-colorpicker-tablefirstrow {\n    height: 30px;\n}\n\n.edui-default .edui-colorpicker-colorcell {\n    width: 14px;\n    height: 14px;\n    display: block;\n    margin: 0;\n    cursor: pointer;\n}\n\n.edui-default .edui-colorpicker-colorcell:hover {\n    width: 14px;\n    height: 14px;\n    margin: 0;\n}\n.edui-default .edui-colorpicker-advbtn{\n    display: block;\n    text-align: center;\n    cursor: pointer;\n    height:20px;\n}\n.arrow_down{\n    background: white url('../images/arrow_down.png') no-repeat center;\n}\n.arrow_up{\n    background: white url('../images/arrow_up.png') no-repeat center;\n}\n/*高级的样式*/\n.edui-colorpicker-adv{\n    position: relative;\n    overflow: hidden;\n    height: 180px;\n    display: none;\n}\n.edui-colorpicker-plant, .edui-colorpicker-hue {\n    border: solid 1px #666;\n}\n.edui-colorpicker-pad {\n    width: 150px;\n    height: 150px;\n    left: 14px;\n    top: 13px;\n    position: absolute;\n    background: red;\n    overflow: hidden;\n    cursor: crosshair;\n}\n.edui-colorpicker-cover{\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 150px;\n    height: 150px;\n    background: url(\"../images/tangram-colorpicker.png\") -160px -200px;\n}\n.edui-colorpicker-padDot{\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 11px;\n    height: 11px;\n    overflow: hidden;\n    background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x;\n    z-index: 1000;\n\n}\n.edui-colorpicker-sliderMain {\n    position: absolute;\n    left: 171px;\n    top: 13px;\n    width: 19px;\n    height: 152px;\n    background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat;\n\n}\n.edui-colorpicker-slider {\n    width: 100%;\n    height: 100%;\n    cursor: pointer;\n}\n.edui-colorpicker-thumb{\n    position: absolute;\n    top: 0;\n    cursor: pointer;\n    height: 3px;\n    left: -1px;\n    right: -1px;\n    border: 1px solid black;\n    background: white;\n    opacity: .8;\n}\n/*自动排版弹出菜单*/\n.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body {\n    font-size: 12px;\n    margin-bottom: 3px;\n    clear: both;\n}\n\n.edui-default .edui-autotypesetpicker-body table {\n    border-collapse: separate;\n    border-spacing: 2px;\n}\n\n.edui-default .edui-autotypesetpicker-body td {\n    font-size: 12px;\n    word-wrap:break-word;\n}\n\n.edui-default .edui-autotypesetpicker-body td input {\n    margin: 3px 3px 3px 4px;\n    *margin: 1px 0 0 0;\n}\n/*自动排版弹出菜单*/\n.edui-default .edui-cellalignpicker .edui-cellalignpicker-body {\n    width: 70px;\n    font-size: 12px;\n    cursor: default;\n}\n\n.edui-default .edui-cellalignpicker-body table {\n    border-collapse: separate;\n    border-spacing: 0;\n}\n.edui-default .edui-cellalignpicker-body td{\n    padding: 1px;\n}\n.edui-default .edui-cellalignpicker-body .edui-icon{\n    height: 20px;\n    width: 20px;\n    padding: 1px;\n    background-image: url(../images/table-cell-align.png);\n}\n\n.edui-default .edui-cellalignpicker-body .edui-left{\n    background-position: 0 0;\n}\n\n.edui-default .edui-cellalignpicker-body .edui-center{\n    background-position: -25px 0;\n}\n.edui-default .edui-cellalignpicker-body .edui-right{\n    background-position: -51px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{\n    background-position: -73px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{\n    background-position: -98px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{\n    background-position: -124px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left {\n    background-position: -146px 0;\n    background-color: #f1f4f5;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center {\n    background-position: -245px 0;\n}\n\n.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right {\n    background-position: -271px 0;\n}\n/*分隔线*/\n.edui-default .edui-toolbar .edui-separator {\n    width: 2px;\n    height: 20px;\n    margin: 2px 4px 2px 3px;\n    background: url(../images/icons.png) -181px 0;\n    background: url(../images/icons.gif) -181px 0 \\9;\n}\n\n/*颜色按钮 */\n.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump {\n    position: absolute;\n    overflow: hidden;\n    bottom: 1px;\n    left: 1px;\n    width: 18px;\n    height: 4px;\n}\n/*表情按钮及弹出菜单*/\n/*去除了表情的下拉箭头*/\n.edui-default .edui-for-emotion .edui-icon {\n    background-position: -60px -20px;\n}\n.edui-default .edui-for-emotion .edui-popup-content iframe\n{\n    width: 514px;\n    height: 380px;\n    overflow: hidden;\n}\n.edui-default .edui-for-emotion .edui-popup-content\n{\n    position: relative;\n    z-index: 555\n}\n\n.edui-default .edui-for-emotion .edui-splitborder {\n    display: none\n}\n\n.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow\n{\n    width: 0\n}\n.edui-default .edui-toolbar .edui-for-emotion  .edui-state-active .edui-splitborder\n{\n    border-left: 1px solid transparent;\n}\n/*contextmenu*/\n.edui-default .edui-hassubmenu .edui-arrow {\n    height: 20px;\n    width: 20px;\n    float: right;\n    background: url(\"../images/icons-all.gif\") no-repeat 10px -233px;\n}\n\n.edui-default .edui-menu-body .edui-menuitem {\n    padding: 1px;\n}\n\n.edui-default .edui-menuseparator {\n    margin: 2px 0;\n    height: 1px;\n    overflow: hidden;\n}\n\n.edui-default .edui-menuseparator-inner {\n    border-bottom: 1px solid #e2e3e3;\n    margin-left: 29px;\n    margin-right: 1px;\n}\n\n.edui-default .edui-menu-body .edui-state-hover {\n    padding: 0 !important;\n    background-color: #fff5d4;\n    border: 1px solid #dcac6c;\n}\n/*弹出菜单*/\n.edui-default .edui-shortcutmenu {\n    padding: 2px;\n    width: 190px;\n    height: 50px;\n    background-color: #fff;\n    border: 1px solid #ccc;\n    border-radius: 5px;\n}\n\n/*粘贴弹出菜单*/\n.edui-default .edui-wordpastepop .edui-popup-content{\n    border: none;\n    padding: 0;\n    width: 54px;\n    height: 21px;\n}\n.edui-default  .edui-pasteicon {\n    width: 100%;\n    height: 100%;\n    background-image: url('../images/wordpaste.png');\n    background-position: 0 0;\n}\n\n.edui-default  .edui-pasteicon.edui-state-opened {\n    background-position: 0 -34px;\n}\n\n.edui-default  .edui-pastecontainer {\n    position: relative;\n    visibility: hidden;\n    width: 97px;\n    background: #fff;\n    border: 1px solid #ccc;\n}\n\n.edui-default  .edui-pastecontainer .edui-title {\n    font-weight: bold;\n    background: #F8F8FF;\n    height: 25px;\n    line-height: 25px;\n    font-size: 12px;\n    padding-left: 5px;\n}\n\n.edui-default  .edui-pastecontainer .edui-button {\n    overflow: hidden;\n    margin: 3px 0;\n}\n\n.edui-default  .edui-pastecontainer .edui-button .edui-richtxticon,\n.edui-default  .edui-pastecontainer .edui-button .edui-tagicon,\n.edui-default  .edui-pastecontainer .edui-button .edui-plaintxticon{\n    float: left;\n    cursor: pointer;\n    width: 29px;\n    height: 29px;\n    margin-left: 5px;\n    background-image: url('../images/wordpaste.png');\n    background-repeat: no-repeat;\n}\n.edui-default  .edui-pastecontainer .edui-button .edui-richtxticon {\n    margin-left: 0;\n    background-position: -109px 0;\n}\n.edui-default  .edui-pastecontainer .edui-button .edui-tagicon {\n    background-position: -148px 1px;\n}\n\n.edui-default  .edui-pastecontainer .edui-button .edui-plaintxticon {\n    background-position: -72px 0;\n}\n\n.edui-default  .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon {\n    background-position: -109px -34px;\n}\n.edui-default  .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{\n    background-position: -148px -34px;\n}\n.edui-default  .edui-pastecontainer .edui-button  .edui-state-hover .edui-plaintxticon{\n    background-position: -72px -34px;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/default/dialogbase.css",
    "content": "/*弹出对话框页面样式组件\n*/\n\n/*reset\n*/\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, font, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td {\n    margin: 0;\n    padding: 0;\n    outline: 0;\n    font-size: 100%;\n}\n\nbody {\n    line-height: 1;\n}\n\nol, ul {\n    list-style: none;\n}\n\nblockquote, q {\n    quotes: none;\n}\n\nins {\n    text-decoration: none;\n}\n\ndel {\n    text-decoration: line-through;\n}\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n\n/*module\n*/\nbody {\n    background-color: #fff;\n    font: 12px/1.5 sans-serif, \"宋体\", \"Arial Narrow\", HELVETICA;\n    color: #646464;\n}\n\n/*tab*/\n.tabhead {\n    position: relative;\n    z-index: 10;\n}\n\n.tabhead span {\n    display: inline-block;\n    padding: 0 5px;\n    height: 30px;\n    border: 1px solid #ccc;\n    background: url(\"images/dialog-title-bg.png\") repeat-x;\n    text-align: center;\n    line-height: 30px;\n    cursor: pointer;\n    *margin-right: 5px;\n}\n\n.tabhead span.focus {\n    height: 31px;\n    border-bottom: none;\n    background: #fff;\n}\n\n.tabbody {\n    position: relative;\n    top: -1px;\n    margin: 0 auto;\n    border: 1px solid #ccc;\n}\n\n/*button*/\na.button {\n    display: block;\n    text-align: center;\n    line-height: 24px;\n    text-decoration: none;\n    height: 24px;\n    width: 95px;\n    border: 0;\n    color: #838383;\n    background: url(../../themes/default/images/icons-all.gif) no-repeat;\n}\n\na.button:hover {\n    background-position: 0 -30px;\n}"
  },
  {
    "path": "static/common/user/uedit/themes/iframe.css",
    "content": "/*可以在这里添加你自己的css*/\n"
  },
  {
    "path": "static/common/user/uedit/third-party/SyntaxHighlighter/shCore.js",
    "content": "// XRegExp 1.5.1\n// (c) 2007-2012 Steven Levithan\n// MIT License\n// <http://xregexp.com>\n// Provides an augmented, extensible, cross-browser implementation of regular expressions,\n// including support for additional syntax, flags, and methods\n\nvar XRegExp;\n\nif (XRegExp) {\n    // Avoid running twice, since that would break references to native globals\n    throw Error(\"can't load XRegExp twice in the same frame\");\n}\n\n// Run within an anonymous function to protect variables and avoid new globals\n(function (undefined) {\n\n    //---------------------------------\n    //  Constructor\n    //---------------------------------\n\n    // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native\n    // regular expression in that additional syntax and flags are supported and cross-browser\n    // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and\n    // converts to type XRegExp\n    XRegExp = function (pattern, flags) {\n        var output = [],\n            currScope = XRegExp.OUTSIDE_CLASS,\n            pos = 0,\n            context, tokenResult, match, chr, regex;\n\n        if (XRegExp.isRegExp(pattern)) {\n            if (flags !== undefined)\n                throw TypeError(\"can't supply flags when constructing one RegExp from another\");\n            return clone(pattern);\n        }\n        // Tokens become part of the regex construction process, so protect against infinite\n        // recursion when an XRegExp is constructed within a token handler or trigger\n        if (isInsideConstructor)\n            throw Error(\"can't call the XRegExp constructor within token definition functions\");\n\n        flags = flags || \"\";\n        context = { // `this` object for custom tokens\n            hasNamedCapture: false,\n            captureNames: [],\n            hasFlag: function (flag) {return flags.indexOf(flag) > -1;},\n            setFlag: function (flag) {flags += flag;}\n        };\n\n        while (pos < pattern.length) {\n            // Check for custom tokens at the current position\n            tokenResult = runTokens(pattern, pos, currScope, context);\n\n            if (tokenResult) {\n                output.push(tokenResult.output);\n                pos += (tokenResult.match[0].length || 1);\n            } else {\n                // Check for native multicharacter metasequences (excluding character classes) at\n                // the current position\n                if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) {\n                    output.push(match[0]);\n                    pos += match[0].length;\n                } else {\n                    chr = pattern.charAt(pos);\n                    if (chr === \"[\")\n                        currScope = XRegExp.INSIDE_CLASS;\n                    else if (chr === \"]\")\n                        currScope = XRegExp.OUTSIDE_CLASS;\n                    // Advance position one character\n                    output.push(chr);\n                    pos++;\n                }\n            }\n        }\n\n        regex = RegExp(output.join(\"\"), nativ.replace.call(flags, flagClip, \"\"));\n        regex._xregexp = {\n            source: pattern,\n            captureNames: context.hasNamedCapture ? context.captureNames : null\n        };\n        return regex;\n    };\n\n\n    //---------------------------------\n    //  Public properties\n    //---------------------------------\n\n    XRegExp.version = \"1.5.1\";\n\n    // Token scope bitflags\n    XRegExp.INSIDE_CLASS = 1;\n    XRegExp.OUTSIDE_CLASS = 2;\n\n\n    //---------------------------------\n    //  Private variables\n    //---------------------------------\n\n    var replacementToken = /\\$(?:(\\d\\d?|[$&`'])|{([$\\w]+)})/g,\n        flagClip = /[^gimy]+|([\\s\\S])(?=[\\s\\S]*\\1)/g, // Nonnative and duplicate flags\n        quantifier = /^(?:[?*+]|{\\d+(?:,\\d*)?})\\??/,\n        isInsideConstructor = false,\n        tokens = [],\n    // Copy native globals for reference (\"native\" is an ES3 reserved keyword)\n        nativ = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = nativ.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            nativ.test.call(x, \"\");\n            return !x.lastIndex;\n        }(),\n        hasNativeY = RegExp.prototype.sticky !== undefined,\n        nativeTokens = {};\n\n    // `nativeTokens` match native multicharacter metasequences only (including deprecated octals,\n    // excluding character classes)\n    nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u[\\dA-Fa-f]{4}|c[A-Za-z]|[\\s\\S]))/;\n    nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u[\\dA-Fa-f]{4}|c[A-Za-z]|[\\s\\S])|\\(\\?[:=!]|[?*+]\\?|{\\d+(?:,\\d*)?}\\??)/;\n\n\n    //---------------------------------\n    //  Public methods\n    //---------------------------------\n\n    // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by\n    // the XRegExp library and can be used to create XRegExp plugins. This function is intended for\n    // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can\n    // be disabled by `XRegExp.freezeTokens`\n    XRegExp.addToken = function (regex, handler, scope, trigger) {\n        tokens.push({\n            pattern: clone(regex, \"g\" + (hasNativeY ? \"y\" : \"\")),\n            handler: handler,\n            scope: scope || XRegExp.OUTSIDE_CLASS,\n            trigger: trigger || null\n        });\n    };\n\n    // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag\n    // combination has previously been cached, the cached copy is returned; otherwise the newly\n    // created regex is cached\n    XRegExp.cache = function (pattern, flags) {\n        var key = pattern + \"/\" + (flags || \"\");\n        return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags));\n    };\n\n    // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh\n    // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global`\n    // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve\n    // special properties required for named capture\n    XRegExp.copyAsGlobal = function (regex) {\n        return clone(regex, \"g\");\n    };\n\n    // Accepts a string; returns the string with regex metacharacters escaped. The returned string\n    // can safely be used at any point within a regex to match the provided literal string. Escaped\n    // characters are [ ] { } ( ) * + ? - . , \\ ^ $ | # and whitespace\n    XRegExp.escape = function (str) {\n        return str.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\n    };\n\n    // Accepts a string to search, regex to search with, position to start the search within the\n    // string (default: 0), and an optional Boolean indicating whether matches must start at-or-\n    // after the position or at the specified position only. This function ignores the `lastIndex`\n    // of the provided regex in its own handling, but updates the property for compatibility\n    XRegExp.execAt = function (str, regex, pos, anchored) {\n        var r2 = clone(regex, \"g\" + ((anchored && hasNativeY) ? \"y\" : \"\")),\n            match;\n        r2.lastIndex = pos = pos || 0;\n        match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.)\n        if (anchored && match && match.index !== pos)\n            match = null;\n        if (regex.global)\n            regex.lastIndex = match ? r2.lastIndex : 0;\n        return match;\n    };\n\n    // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing\n    // syntax and flag changes. Should be run after XRegExp and any plugins are loaded\n    XRegExp.freezeTokens = function () {\n        XRegExp.addToken = function () {\n            throw Error(\"can't run addToken after freezeTokens\");\n        };\n    };\n\n    // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object.\n    // Note that this is also `true` for regex literals and regexes created by the `XRegExp`\n    // constructor. This works correctly for variables created in another frame, when `instanceof`\n    // and `constructor` checks would fail to work as intended\n    XRegExp.isRegExp = function (o) {\n        return Object.prototype.toString.call(o) === \"[object RegExp]\";\n    };\n\n    // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to\n    // iterate over regex matches compared to the traditional approaches of subverting\n    // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop\n    XRegExp.iterate = function (str, regex, callback, context) {\n        var r2 = clone(regex, \"g\"),\n            i = -1, match;\n        while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)\n            if (regex.global)\n                regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback`\n            callback.call(context, match, ++i, str, regex);\n            if (r2.lastIndex === match.index)\n                r2.lastIndex++;\n        }\n        if (regex.global)\n            regex.lastIndex = 0;\n    };\n\n    // Accepts a string and an array of regexes; returns the result of using each successive regex\n    // to search within the matches of the previous regex. The array of regexes can also contain\n    // objects with `regex` and `backref` properties, in which case the named or numbered back-\n    // references specified are passed forward to the next regex or returned. E.g.:\n    // var xregexpImgFileNames = XRegExp.matchChain(html, [\n    //     {regex: /<img\\b([^>]+)>/i, backref: 1}, // <img> tag attributes\n    //     {regex: XRegExp('(?ix) \\\\s src=\" (?<src> [^\"]+ )'), backref: \"src\"}, // src attribute values\n    //     {regex: XRegExp(\"^http://xregexp\\\\.com(/[^#?]+)\", \"i\"), backref: 1}, // xregexp.com paths\n    //     /[^\\/]+$/ // filenames (strip directory paths)\n    // ]);\n    XRegExp.matchChain = function (str, chain) {\n        return function recurseChain (values, level) {\n            var item = chain[level].regex ? chain[level] : {regex: chain[level]},\n                regex = clone(item.regex, \"g\"),\n                matches = [], i;\n            for (i = 0; i < values.length; i++) {\n                XRegExp.iterate(values[i], regex, function (match) {\n                    matches.push(item.backref ? (match[item.backref] || \"\") : match[0]);\n                });\n            }\n            return ((level === chain.length - 1) || !matches.length) ?\n                matches : recurseChain(matches, level + 1);\n        }([str], 0);\n    };\n\n\n    //---------------------------------\n    //  New RegExp prototype methods\n    //---------------------------------\n\n    // Accepts a context object and arguments array; returns the result of calling `exec` with the\n    // first value in the arguments array. the context is ignored but is accepted for congruity\n    // with `Function.prototype.apply`\n    RegExp.prototype.apply = function (context, args) {\n        return this.exec(args[0]);\n    };\n\n    // Accepts a context object and string; returns the result of calling `exec` with the provided\n    // string. the context is ignored but is accepted for congruity with `Function.prototype.call`\n    RegExp.prototype.call = function (context, str) {\n        return this.exec(str);\n    };\n\n\n    //---------------------------------\n    //  Overriden native methods\n    //---------------------------------\n\n    // Adds named capture support (with backreferences returned as `result.name`), and fixes two\n    // cross-browser issues per ES3:\n    // - Captured values for nonparticipating capturing groups should be returned as `undefined`,\n    //   rather than the empty string.\n    // - `lastIndex` should not be incremented after zero-length matches.\n    RegExp.prototype.exec = function (str) {\n        var match, name, r2, origLastIndex;\n        if (!this.global)\n            origLastIndex = this.lastIndex;\n        match = nativ.exec.apply(this, arguments);\n        if (match) {\n            // Fix browsers whose `exec` methods don't consistently return `undefined` for\n            // nonparticipating capturing groups\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), \"g\", \"\"));\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                nativ.replace.call((str + \"\").slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            // Attach named capture properties\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                        match[name] = match[i];\n                }\n            }\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        if (!this.global)\n            this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)\n        return match;\n    };\n\n    // Fix browser bugs in native method\n    RegExp.prototype.test = function (str) {\n        // Use the native `exec` to skip some processing overhead, even though the altered\n        // `exec` would take care of the `lastIndex` fixes\n        var match, origLastIndex;\n        if (!this.global)\n            origLastIndex = this.lastIndex;\n        match = nativ.exec.call(this, str);\n        // Fix browsers that increment `lastIndex` after zero-length matches\n        if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n            this.lastIndex--;\n        if (!this.global)\n            this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)\n        return !!match;\n    };\n\n    // Adds named capture support and fixes browser bugs in native method\n    String.prototype.match = function (regex) {\n        if (!XRegExp.isRegExp(regex))\n            regex = RegExp(regex); // Native `RegExp`\n        if (regex.global) {\n            var result = nativ.match.apply(this, arguments);\n            regex.lastIndex = 0; // Fix IE bug\n            return result;\n        }\n        return regex.exec(this); // Run the altered `exec`\n    };\n\n    // Adds support for `${n}` tokens for named and numbered backreferences in replacement text,\n    // and provides named backreferences to replacement functions as `arguments[0].name`. Also\n    // fixes cross-browser differences in replacement text syntax when performing a replacement\n    // using a nonregex search value, and the value of replacement regexes' `lastIndex` property\n    // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary\n    // third (`flags`) parameter\n    String.prototype.replace = function (search, replacement) {\n        var isRegex = XRegExp.isRegExp(search),\n            captureNames, result, str, origLastIndex;\n\n        // There are too many combinations of search/replacement types/values and browser bugs that\n        // preclude passing to native `replace`, so don't try\n        //if (...)\n        //    return nativ.replace.apply(this, arguments);\n\n        if (isRegex) {\n            if (search._xregexp)\n                captureNames = search._xregexp.captureNames; // Array or `null`\n            if (!search.global)\n                origLastIndex = search.lastIndex;\n        } else {\n            search = search + \"\"; // Type conversion\n        }\n\n        if (Object.prototype.toString.call(replacement) === \"[object Function]\") {\n            result = nativ.replace.call(this + \"\", search, function () {\n                if (captureNames) {\n                    // Change the `arguments[0]` string primitive to a String object which can store properties\n                    arguments[0] = new String(arguments[0]);\n                    // Store named backreferences on `arguments[0]`\n                    for (var i = 0; i < captureNames.length; i++) {\n                        if (captureNames[i])\n                            arguments[0][captureNames[i]] = arguments[i + 1];\n                    }\n                }\n                // Update `lastIndex` before calling `replacement` (fix browsers)\n                if (isRegex && search.global)\n                    search.lastIndex = arguments[arguments.length - 2] + arguments[0].length;\n                return replacement.apply(null, arguments);\n            });\n        } else {\n            str = this + \"\"; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`)\n            result = nativ.replace.call(str, search, function () {\n                var args = arguments; // Keep this function's `arguments` available through closure\n                return nativ.replace.call(replacement + \"\", replacementToken, function ($0, $1, $2) {\n                    // Numbered backreference (without delimiters) or special variable\n                    if ($1) {\n                        switch ($1) {\n                            case \"$\": return \"$\";\n                            case \"&\": return args[0];\n                            case \"`\": return args[args.length - 1].slice(0, args[args.length - 2]);\n                            case \"'\": return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                            // Numbered backreference\n                            default:\n                                // What does \"$10\" mean?\n                                // - Backreference 10, if 10 or more capturing groups exist\n                                // - Backreference 1 followed by \"0\", if 1-9 capturing groups exist\n                                // - Otherwise, it's the string \"$10\"\n                                // Also note:\n                                // - Backreferences cannot be more than two digits (enforced by `replacementToken`)\n                                // - \"$01\" is equivalent to \"$1\" if a capturing group exists, otherwise it's the string \"$01\"\n                                // - There is no \"$0\" token (\"$&\" is the entire match)\n                                var literalNumbers = \"\";\n                                $1 = +$1; // Type conversion; drop leading zero\n                                if (!$1) // `$1` was \"0\" or \"00\"\n                                    return $0;\n                                while ($1 > args.length - 3) {\n                                    literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers;\n                                    $1 = Math.floor($1 / 10); // Drop the last digit\n                                }\n                                return ($1 ? args[$1] || \"\" : \"$\") + literalNumbers;\n                        }\n                        // Named backreference or delimited numbered backreference\n                    } else {\n                        // What does \"${n}\" mean?\n                        // - Backreference to numbered capture n. Two differences from \"$n\":\n                        //   - n can be more than two digits\n                        //   - Backreference 0 is allowed, and is the entire match\n                        // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture\n                        // - Otherwise, it's the string \"${n}\"\n                        var n = +$2; // Type conversion; drop leading zeros\n                        if (n <= args.length - 3)\n                            return args[n];\n                        n = captureNames ? indexOf(captureNames, $2) : -1;\n                        return n > -1 ? args[n + 1] : $0;\n                    }\n                });\n            });\n        }\n\n        if (isRegex) {\n            if (search.global)\n                search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows)\n            else\n                search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)\n        }\n\n        return result;\n    };\n\n    // A consistent cross-browser, ES3 compliant `split`\n    String.prototype.split = function (s /* separator */, limit) {\n        // If separator `s` is not a regex, use the native `split`\n        if (!XRegExp.isRegExp(s))\n            return nativ.split.apply(this, arguments);\n\n        var str = this + \"\", // Type conversion\n            output = [],\n            lastLastIndex = 0,\n            match, lastLength;\n\n        // Behavior for `limit`: if it's...\n        // - `undefined`: No limit\n        // - `NaN` or zero: Return an empty array\n        // - A positive number: Use `Math.floor(limit)`\n        // - A negative number: No limit\n        // - Other: Type-convert, then use the above rules\n        if (limit === undefined || +limit < 0) {\n            limit = Infinity;\n        } else {\n            limit = Math.floor(+limit);\n            if (!limit)\n                return [];\n        }\n\n        // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero\n        // and restore it to its original value when we're done using the regex\n        s = XRegExp.copyAsGlobal(s);\n\n        while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)\n            if (s.lastIndex > lastLastIndex) {\n                output.push(str.slice(lastLastIndex, match.index));\n\n                if (match.length > 1 && match.index < str.length)\n                    Array.prototype.push.apply(output, match.slice(1));\n\n                lastLength = match[0].length;\n                lastLastIndex = s.lastIndex;\n\n                if (output.length >= limit)\n                    break;\n            }\n\n            if (s.lastIndex === match.index)\n                s.lastIndex++;\n        }\n\n        if (lastLastIndex === str.length) {\n            if (!nativ.test.call(s, \"\") || lastLength)\n                output.push(\"\");\n        } else {\n            output.push(str.slice(lastLastIndex));\n        }\n\n        return output.length > limit ? output.slice(0, limit) : output;\n    };\n\n\n    //---------------------------------\n    //  Private helper functions\n    //---------------------------------\n\n    // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp`\n    // instance with a fresh `lastIndex` (set to zero), preserving properties required for named\n    // capture. Also allows adding new flags in the process of copying the regex\n    function clone (regex, additionalFlags) {\n        if (!XRegExp.isRegExp(regex))\n            throw TypeError(\"type RegExp expected\");\n        var x = regex._xregexp;\n        regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || \"\"));\n        if (x) {\n            regex._xregexp = {\n                source: x.source,\n                captureNames: x.captureNames ? x.captureNames.slice(0) : null\n            };\n        }\n        return regex;\n    }\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n            (regex.ignoreCase ? \"i\" : \"\") +\n            (regex.multiline  ? \"m\" : \"\") +\n            (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n            (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function runTokens (pattern, index, scope, context) {\n        var i = tokens.length,\n            result, match, t;\n        // Protect against constructing XRegExps within token handler and trigger functions\n        isInsideConstructor = true;\n        // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws\n        try {\n            while (i--) { // Run in reverse order\n                t = tokens[i];\n                if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) {\n                    t.pattern.lastIndex = index;\n                    match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc.\n                    if (match && match.index === index) {\n                        result = {\n                            output: t.handler.call(context, match, scope),\n                            match: match\n                        };\n                        break;\n                    }\n                }\n            }\n        } catch (err) {\n            throw err;\n        } finally {\n            isInsideConstructor = false;\n        }\n        return result;\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n\n    //---------------------------------\n    //  Built-in tokens\n    //---------------------------------\n\n    // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the\n    // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS`\n\n    // Comment pattern: (?# )\n    XRegExp.addToken(\n        /\\(\\?#[^)]*\\)/,\n        function (match) {\n            // Keep tokens separated unless the following token is a quantifier\n            return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? \"\" : \"(?:)\";\n        }\n    );\n\n    // Capturing group (match the opening parenthesis only).\n    // Required for support of named capturing groups\n    XRegExp.addToken(\n        /\\((?!\\?)/,\n        function () {\n            this.captureNames.push(null);\n            return \"(\";\n        }\n    );\n\n    // Named capturing group (match the opening delimiter only): (?<name>\n    XRegExp.addToken(\n        /\\(\\?<([$\\w]+)>/,\n        function (match) {\n            this.captureNames.push(match[1]);\n            this.hasNamedCapture = true;\n            return \"(\";\n        }\n    );\n\n    // Named backreference: \\k<name>\n    XRegExp.addToken(\n        /\\\\k<([\\w$]+)>/,\n        function (match) {\n            var index = indexOf(this.captureNames, match[1]);\n            // Keep backreferences separate from subsequent literal numbers. Preserve back-\n            // references to named groups that are undefined at this point as literal strings\n            return index > -1 ?\n                \"\\\\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? \"\" : \"(?:)\") :\n                match[0];\n        }\n    );\n\n    // Empty character class: [] or [^]\n    XRegExp.addToken(\n        /\\[\\^?]/,\n        function (match) {\n            // For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n            // (?!) should work like \\b\\B, but is unreliable in Firefox\n            return match[0] === \"[]\" ? \"\\\\b\\\\B\" : \"[\\\\s\\\\S]\";\n        }\n    );\n\n    // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx)\n    // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc.\n    XRegExp.addToken(\n        /^\\(\\?([imsx]+)\\)/,\n        function (match) {\n            this.setFlag(match[1]);\n            return \"\";\n        }\n    );\n\n    // Whitespace and comments, in free-spacing (aka extended) mode only\n    XRegExp.addToken(\n        /(?:\\s+|#.*)+/,\n        function (match) {\n            // Keep tokens separated unless the following token is a quantifier\n            return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? \"\" : \"(?:)\";\n        },\n        XRegExp.OUTSIDE_CLASS,\n        function () {return this.hasFlag(\"x\");}\n    );\n\n    // Dot, in dotall (aka singleline) mode only\n    XRegExp.addToken(\n        /\\./,\n        function () {return \"[\\\\s\\\\S]\";},\n        XRegExp.OUTSIDE_CLASS,\n        function () {return this.hasFlag(\"s\");}\n    );\n\n\n    //---------------------------------\n    //  Backward compatibility\n    //---------------------------------\n\n    // Uncomment the following block for compatibility with XRegExp 1.0-1.2:\n    /*\n     XRegExp.matchWithinChain = XRegExp.matchChain;\n     RegExp.prototype.addFlags = function (s) {return clone(this, s);};\n     RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;};\n     RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);};\n     RegExp.prototype.validate = function (s) {var r = RegExp(\"^(?:\" + this.source + \")$(?!\\\\s)\", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;};\n     */\n\n})();\n\n//\n// Begin anonymous function. This is used to contain local scope variables without polutting global scope.\n//\nif (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() {\n\n// CommonJS\n    if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined')\n    {\n        XRegExp = require('XRegExp').XRegExp;\n    }\n\n// Shortcut object which will be assigned to the SyntaxHighlighter variable.\n// This is a shorthand for local reference in order to avoid long namespace\n// references to SyntaxHighlighter.whatever...\n    var sh = {\n        defaults : {\n            /** Additional CSS class names to be added to highlighter elements. */\n            'class-name' : '',\n\n            /** First line number. */\n            'first-line' : 1,\n\n            /**\n             * Pads line numbers. Possible values are:\n             *\n             *   false - don't pad line numbers.\n             *   true  - automaticaly pad numbers with minimum required number of leading zeroes.\n             *   [int] - length up to which pad line numbers.\n             */\n            'pad-line-numbers' : false,\n\n            /** Lines to highlight. */\n            'highlight' : false,\n\n            /** Title to be displayed above the code block. */\n            'title' : null,\n\n            /** Enables or disables smart tabs. */\n            'smart-tabs' : true,\n\n            /** Gets or sets tab size. */\n            'tab-size' : 4,\n\n            /** Enables or disables gutter. */\n            'gutter' : true,\n\n            /** Enables or disables toolbar. */\n            'toolbar' : true,\n\n            /** Enables quick code copy and paste from double click. */\n            'quick-code' : true,\n\n            /** Forces code view to be collapsed. */\n            'collapse' : false,\n\n            /** Enables or disables automatic links. */\n            'auto-links' : false,\n\n            /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */\n            'light' : false,\n\n            'unindent' : true,\n\n            'html-script' : false\n        },\n\n        config : {\n            space : '&nbsp;',\n\n            /** Enables use of <SCRIPT type=\"syntaxhighlighter\" /> tags. */\n            useScriptTags : true,\n\n            /** Blogger mode flag. */\n            bloggerMode : false,\n\n            stripBrs : false,\n\n            /** Name of the tag that SyntaxHighlighter will automatically look for. */\n            tagName : 'pre',\n\n            strings : {\n                expandSource : 'expand source',\n                help : '?',\n                alert: 'SyntaxHighlighter\\n\\n',\n                noBrush : 'Can\\'t find brush for: ',\n                brushNotHtmlScript : 'Brush wasn\\'t configured for html-script option: ',\n\n                // this is populated by the build script\n                aboutDialog : '@ABOUT@'\n            }\n        },\n\n        /** Internal 'global' variables. */\n        vars : {\n            discoveredBrushes : null,\n            highlighters : {}\n        },\n\n        /** This object is populated by user included external brush files. */\n        brushes : {},\n\n        /** Common regular expressions. */\n        regexLib : {\n            multiLineCComments\t\t\t: /\\/\\*[\\s\\S]*?\\*\\//gm,\n            singleLineCComments\t\t\t: /\\/\\/.*$/gm,\n            singleLinePerlComments\t\t: /#.*$/gm,\n            doubleQuotedString\t\t\t: /\"([^\\\\\"\\n]|\\\\.)*\"/g,\n            singleQuotedString\t\t\t: /'([^\\\\'\\n]|\\\\.)*'/g,\n            multiLineDoubleQuotedString\t: new XRegExp('\"([^\\\\\\\\\"]|\\\\\\\\.)*\"', 'gs'),\n            multiLineSingleQuotedString\t: new XRegExp(\"'([^\\\\\\\\']|\\\\\\\\.)*'\", 'gs'),\n            xmlComments\t\t\t\t\t: /(&lt;|<)!--[\\s\\S]*?--(&gt;|>)/gm,\n            url\t\t\t\t\t\t\t: /\\w+:\\/\\/[\\w-.\\/?%&=:@;#]*/g,\n\n            /** <?= ?> tags. */\n            phpScriptTags \t\t\t\t: { left: /(&lt;|<)\\?(?:=|php)?/g, right: /\\?(&gt;|>)/g, 'eof' : true },\n\n            /** <%= %> tags. */\n            aspScriptTags\t\t\t\t: { left: /(&lt;|<)%=?/g, right: /%(&gt;|>)/g },\n\n            /** <script> tags. */\n            scriptScriptTags\t\t\t: { left: /(&lt;|<)\\s*script.*?(&gt;|>)/gi, right: /(&lt;|<)\\/\\s*script\\s*(&gt;|>)/gi }\n        },\n\n        toolbar: {\n            /**\n             * Generates HTML markup for the toolbar.\n             * @param {Highlighter} highlighter Highlighter instance.\n             * @return {String} Returns HTML markup.\n             */\n            getHtml: function(highlighter)\n            {\n                var html = '<div class=\"toolbar\">',\n                    items = sh.toolbar.items,\n                    list = items.list\n                    ;\n\n                function defaultGetHtml(highlighter, name)\n                {\n                    return sh.toolbar.getButtonHtml(highlighter, name, sh.config.strings[name]);\n                };\n\n                for (var i = 0; i < list.length; i++)\n                    html += (items[list[i]].getHtml || defaultGetHtml)(highlighter, list[i]);\n\n                html += '</div>';\n\n                return html;\n            },\n\n            /**\n             * Generates HTML markup for a regular button in the toolbar.\n             * @param {Highlighter} highlighter Highlighter instance.\n             * @param {String} commandName\t\tCommand name that would be executed.\n             * @param {String} label\t\t\tLabel text to display.\n             * @return {String}\t\t\t\t\tReturns HTML markup.\n             */\n            getButtonHtml: function(highlighter, commandName, label)\n            {\n                return '<span><a href=\"#\" class=\"toolbar_item'\n                    + ' command_' + commandName\n                    + ' ' + commandName\n                    + '\">' + label + '</a></span>'\n                    ;\n            },\n\n            /**\n             * Event handler for a toolbar anchor.\n             */\n            handler: function(e)\n            {\n                var target = e.target,\n                    className = target.className || ''\n                    ;\n\n                function getValue(name)\n                {\n                    var r = new RegExp(name + '_(\\\\w+)'),\n                        match = r.exec(className)\n                        ;\n\n                    return match ? match[1] : null;\n                };\n\n                var highlighter = getHighlighterById(findParentElement(target, '.syntaxhighlighter').id),\n                    commandName = getValue('command')\n                    ;\n\n                // execute the toolbar command\n                if (highlighter && commandName)\n                    sh.toolbar.items[commandName].execute(highlighter);\n\n                // disable default A click behaviour\n                e.preventDefault();\n            },\n\n            /** Collection of toolbar items. */\n            items : {\n                // Ordered lis of items in the toolbar. Can't expect `for (var n in items)` to be consistent.\n                list: ['expandSource', 'help'],\n\n                expandSource: {\n                    getHtml: function(highlighter)\n                    {\n                        if (highlighter.getParam('collapse') != true)\n                            return '';\n\n                        var title = highlighter.getParam('title');\n                        return sh.toolbar.getButtonHtml(highlighter, 'expandSource', title ? title : sh.config.strings.expandSource);\n                    },\n\n                    execute: function(highlighter)\n                    {\n                        var div = getHighlighterDivById(highlighter.id);\n                        removeClass(div, 'collapsed');\n                    }\n                },\n\n                /** Command to display the about dialog window. */\n                help: {\n                    execute: function(highlighter)\n                    {\n                        var wnd = popup('', '_blank', 500, 250, 'scrollbars=0'),\n                            doc = wnd.document\n                            ;\n\n                        doc.write(sh.config.strings.aboutDialog);\n                        doc.close();\n                        wnd.focus();\n                    }\n                }\n            }\n        },\n\n        /**\n         * Finds all elements on the page which should be processes by SyntaxHighlighter.\n         *\n         * @param {Object} globalParams\t\tOptional parameters which override element's\n         * \t\t\t\t\t\t\t\t\tparameters. Only used if element is specified.\n         *\n         * @param {Object} element\tOptional element to highlight. If none is\n         * \t\t\t\t\t\t\tprovided, all elements in the current document\n         * \t\t\t\t\t\t\tare returned which qualify.\n         *\n         * @return {Array}\tReturns list of <code>{ target: DOMElement, params: Object }</code> objects.\n         */\n        findElements: function(globalParams, element)\n        {\n            var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)),\n                conf = sh.config,\n                result = []\n                ;\n\n            // support for <SCRIPT TYPE=\"syntaxhighlighter\" /> feature\n            if (conf.useScriptTags)\n                elements = elements.concat(getSyntaxHighlighterScriptTags());\n\n            if (elements.length === 0)\n                return result;\n\n            for (var i = 0; i < elements.length; i++)\n            {\n                var item = {\n                    target: elements[i],\n                    // local params take precedence over globals\n                    params: merge(globalParams, parseParams(elements[i].className))\n                };\n\n                if (item.params['brush'] == null)\n                    continue;\n\n                result.push(item);\n            }\n\n            return result;\n        },\n\n        /**\n         * Shorthand to highlight all elements on the page that are marked as\n         * SyntaxHighlighter source code.\n         *\n         * @param {Object} globalParams\t\tOptional parameters which override element's\n         * \t\t\t\t\t\t\t\t\tparameters. Only used if element is specified.\n         *\n         * @param {Object} element\tOptional element to highlight. If none is\n         * \t\t\t\t\t\t\tprovided, all elements in the current document\n         * \t\t\t\t\t\t\tare highlighted.\n         */\n        highlight: function(globalParams, element)\n        {\n            var elements = this.findElements(globalParams, element),\n                propertyName = 'innerHTML',\n                highlighter = null,\n                conf = sh.config\n                ;\n\n            if (elements.length === 0)\n                return;\n\n            for (var i = 0; i < elements.length; i++)\n            {\n                var element = elements[i],\n                    target = element.target,\n                    params = element.params,\n                    brushName = params.brush,\n                    code\n                    ;\n\n                if (brushName == null)\n                    continue;\n\n                // Instantiate a brush\n                if (params['html-script'] == 'true' || sh.defaults['html-script'] == true)\n                {\n                    highlighter = new sh.HtmlScript(brushName);\n                    brushName = 'htmlscript';\n                }\n                else\n                {\n                    var brush = findBrush(brushName);\n\n                    if (brush)\n                        highlighter = new brush();\n                    else\n                        continue;\n                }\n\n                code = target[propertyName];\n\n                // remove CDATA from <SCRIPT/> tags if it's present\n                if (conf.useScriptTags)\n                    code = stripCData(code);\n\n                // Inject title if the attribute is present\n                if ((target.title || '') != '')\n                    params.title = target.title;\n\n                params['brush'] = brushName;\n                highlighter.init(params);\n                element = highlighter.getDiv(code);\n\n                // carry over ID\n                if ((target.id || '') != '')\n                    element.id = target.id;\n                //by zhanyi 去掉多余的外围div\n                var tmp = element.firstChild.firstChild;\n                tmp.className = element.firstChild.className;\n\n                target.parentNode.replaceChild(tmp, target);\n            }\n        },\n\n        /**\n         * Main entry point for the SyntaxHighlighter.\n         * @param {Object} params Optional params to apply to all highlighted elements.\n         */\n        all: function(params)\n        {\n            attachEvent(\n                window,\n                'load',\n                function() { sh.highlight(params); }\n            );\n        }\n    }; // end of sh\n\n    /**\n     * Checks if target DOM elements has specified CSS class.\n     * @param {DOMElement} target Target DOM element to check.\n     * @param {String} className Name of the CSS class to check for.\n     * @return {Boolean} Returns true if class name is present, false otherwise.\n     */\n    function hasClass(target, className)\n    {\n        return target.className.indexOf(className) != -1;\n    };\n\n    /**\n     * Adds CSS class name to the target DOM element.\n     * @param {DOMElement} target Target DOM element.\n     * @param {String} className New CSS class to add.\n     */\n    function addClass(target, className)\n    {\n        if (!hasClass(target, className))\n            target.className += ' ' + className;\n    };\n\n    /**\n     * Removes CSS class name from the target DOM element.\n     * @param {DOMElement} target Target DOM element.\n     * @param {String} className CSS class to remove.\n     */\n    function removeClass(target, className)\n    {\n        target.className = target.className.replace(className, '');\n    };\n\n    /**\n     * Converts the source to array object. Mostly used for function arguments and\n     * lists returned by getElementsByTagName() which aren't Array objects.\n     * @param {List} source Source list.\n     * @return {Array} Returns array.\n     */\n    function toArray(source)\n    {\n        var result = [];\n\n        for (var i = 0; i < source.length; i++)\n            result.push(source[i]);\n\n        return result;\n    };\n\n    /**\n     * Splits block of text into lines.\n     * @param {String} block Block of text.\n     * @return {Array} Returns array of lines.\n     */\n    function splitLines(block)\n    {\n        return block.split(/\\r?\\n/);\n    }\n\n    /**\n     * Generates HTML ID for the highlighter.\n     * @param {String} highlighterId Highlighter ID.\n     * @return {String} Returns HTML ID.\n     */\n    function getHighlighterId(id)\n    {\n        var prefix = 'highlighter_';\n        return id.indexOf(prefix) == 0 ? id : prefix + id;\n    };\n\n    /**\n     * Finds Highlighter instance by ID.\n     * @param {String} highlighterId Highlighter ID.\n     * @return {Highlighter} Returns instance of the highlighter.\n     */\n    function getHighlighterById(id)\n    {\n        return sh.vars.highlighters[getHighlighterId(id)];\n    };\n\n    /**\n     * Finds highlighter's DIV container.\n     * @param {String} highlighterId Highlighter ID.\n     * @return {Element} Returns highlighter's DIV element.\n     */\n    function getHighlighterDivById(id)\n    {\n        return document.getElementById(getHighlighterId(id));\n    };\n\n    /**\n     * Stores highlighter so that getHighlighterById() can do its thing. Each\n     * highlighter must call this method to preserve itself.\n     * @param {Highilghter} highlighter Highlighter instance.\n     */\n    function storeHighlighter(highlighter)\n    {\n        sh.vars.highlighters[getHighlighterId(highlighter.id)] = highlighter;\n    };\n\n    /**\n     * Looks for a child or parent node which has specified classname.\n     * Equivalent to jQuery's $(container).find(\".className\")\n     * @param {Element} target Target element.\n     * @param {String} search Class name or node name to look for.\n     * @param {Boolean} reverse If set to true, will go up the node tree instead of down.\n     * @return {Element} Returns found child or parent element on null.\n     */\n    function findElement(target, search, reverse /* optional */)\n    {\n        if (target == null)\n            return null;\n\n        var nodes\t\t\t= reverse != true ? target.childNodes : [ target.parentNode ],\n            propertyToFind\t= { '#' : 'id', '.' : 'className' }[search.substr(0, 1)] || 'nodeName',\n            expectedValue,\n            found\n            ;\n\n        expectedValue = propertyToFind != 'nodeName'\n            ? search.substr(1)\n            : search.toUpperCase()\n        ;\n\n        // main return of the found node\n        if ((target[propertyToFind] || '').indexOf(expectedValue) != -1)\n            return target;\n\n        for (var i = 0; nodes && i < nodes.length && found == null; i++)\n            found = findElement(nodes[i], search, reverse);\n\n        return found;\n    };\n\n    /**\n     * Looks for a parent node which has specified classname.\n     * This is an alias to <code>findElement(container, className, true)</code>.\n     * @param {Element} target Target element.\n     * @param {String} className Class name to look for.\n     * @return {Element} Returns found parent element on null.\n     */\n    function findParentElement(target, className)\n    {\n        return findElement(target, className, true);\n    };\n\n    /**\n     * Finds an index of element in the array.\n     * @ignore\n     * @param {Object} searchElement\n     * @param {Number} fromIndex\n     * @return {Number} Returns index of element if found; -1 otherwise.\n     */\n    function indexOf(array, searchElement, fromIndex)\n    {\n        fromIndex = Math.max(fromIndex || 0, 0);\n\n        for (var i = fromIndex; i < array.length; i++)\n            if(array[i] == searchElement)\n                return i;\n\n        return -1;\n    };\n\n    /**\n     * Generates a unique element ID.\n     */\n    function guid(prefix)\n    {\n        return (prefix || '') + Math.round(Math.random() * 1000000).toString();\n    };\n\n    /**\n     * Merges two objects. Values from obj2 override values in obj1.\n     * Function is NOT recursive and works only for one dimensional objects.\n     * @param {Object} obj1 First object.\n     * @param {Object} obj2 Second object.\n     * @return {Object} Returns combination of both objects.\n     */\n    function merge(obj1, obj2)\n    {\n        var result = {}, name;\n\n        for (name in obj1)\n            result[name] = obj1[name];\n\n        for (name in obj2)\n            result[name] = obj2[name];\n\n        return result;\n    };\n\n    /**\n     * Attempts to convert string to boolean.\n     * @param {String} value Input string.\n     * @return {Boolean} Returns true if input was \"true\", false if input was \"false\" and value otherwise.\n     */\n    function toBoolean(value)\n    {\n        var result = { \"true\" : true, \"false\" : false }[value];\n        return result == null ? value : result;\n    };\n\n    /**\n     * Opens up a centered popup window.\n     * @param {String} url\t\tURL to open in the window.\n     * @param {String} name\t\tPopup name.\n     * @param {int} width\t\tPopup width.\n     * @param {int} height\t\tPopup height.\n     * @param {String} options\twindow.open() options.\n     * @return {Window}\t\t\tReturns window instance.\n     */\n    function popup(url, name, width, height, options)\n    {\n        var x = (screen.width - width) / 2,\n            y = (screen.height - height) / 2\n            ;\n\n        options +=\t', left=' + x +\n            ', top=' + y +\n            ', width=' + width +\n            ', height=' + height\n        ;\n        options = options.replace(/^,/, '');\n\n        var win = window.open(url, name, options);\n        win.focus();\n        return win;\n    };\n\n    /**\n     * Adds event handler to the target object.\n     * @param {Object} obj\t\tTarget object.\n     * @param {String} type\t\tName of the event.\n     * @param {Function} func\tHandling function.\n     */\n    function attachEvent(obj, type, func, scope)\n    {\n        function handler(e)\n        {\n            e = e || window.event;\n\n            if (!e.target)\n            {\n                e.target = e.srcElement;\n                e.preventDefault = function()\n                {\n                    this.returnValue = false;\n                };\n            }\n\n            func.call(scope || window, e);\n        };\n\n        if (obj.attachEvent)\n        {\n            obj.attachEvent('on' + type, handler);\n        }\n        else\n        {\n            obj.addEventListener(type, handler, false);\n        }\n    };\n\n    /**\n     * Displays an alert.\n     * @param {String} str String to display.\n     */\n    function alert(str)\n    {\n        window.alert(sh.config.strings.alert + str);\n    };\n\n    /**\n     * Finds a brush by its alias.\n     *\n     * @param {String} alias\t\tBrush alias.\n     * @param {Boolean} showAlert\tSuppresses the alert if false.\n     * @return {Brush}\t\t\t\tReturns bursh constructor if found, null otherwise.\n     */\n    function findBrush(alias, showAlert)\n    {\n        var brushes = sh.vars.discoveredBrushes,\n            result = null\n            ;\n\n        if (brushes == null)\n        {\n            brushes = {};\n\n            // Find all brushes\n            for (var brush in sh.brushes)\n            {\n                var info = sh.brushes[brush],\n                    aliases = info.aliases\n                    ;\n\n                if (aliases == null)\n                    continue;\n\n                // keep the brush name\n                info.brushName = brush.toLowerCase();\n\n                for (var i = 0; i < aliases.length; i++)\n                    brushes[aliases[i]] = brush;\n            }\n\n            sh.vars.discoveredBrushes = brushes;\n        }\n\n        result = sh.brushes[brushes[alias]];\n\n        if (result == null && showAlert)\n            alert(sh.config.strings.noBrush + alias);\n\n        return result;\n    };\n\n    /**\n     * Executes a callback on each line and replaces each line with result from the callback.\n     * @param {Object} str\t\t\tInput string.\n     * @param {Object} callback\t\tCallback function taking one string argument and returning a string.\n     */\n    function eachLine(str, callback)\n    {\n        var lines = splitLines(str);\n\n        for (var i = 0; i < lines.length; i++)\n            lines[i] = callback(lines[i], i);\n\n        // include \\r to enable copy-paste on windows (ie8) without getting everything on one line\n        return lines.join('\\r\\n');\n    };\n\n    /**\n     * This is a special trim which only removes first and last empty lines\n     * and doesn't affect valid leading space on the first line.\n     *\n     * @param {String} str   Input string\n     * @return {String}      Returns string without empty first and last lines.\n     */\n    function trimFirstAndLastLines(str)\n    {\n        return str.replace(/^[ ]*[\\n]+|[\\n]*[ ]*$/g, '');\n    };\n\n    /**\n     * Parses key/value pairs into hash object.\n     *\n     * Understands the following formats:\n     * - name: word;\n     * - name: [word, word];\n     * - name: \"string\";\n     * - name: 'string';\n     *\n     * For example:\n     *   name1: value; name2: [value, value]; name3: 'value'\n     *\n     * @param {String} str    Input string.\n     * @return {Object}       Returns deserialized object.\n     */\n    function parseParams(str)\n    {\n        var match,\n            result = {},\n            arrayRegex = new XRegExp(\"^\\\\[(?<values>(.*?))\\\\]$\"),\n            regex = new XRegExp(\n                \"(?<name>[\\\\w-]+)\" +\n                    \"\\\\s*:\\\\s*\" +\n                    \"(?<value>\" +\n                    \"[\\\\w-%#]+|\" +\t\t// word\n                    \"\\\\[.*?\\\\]|\" +\t\t// [] array\n                    '\".*?\"|' +\t\t\t// \"\" string\n                    \"'.*?'\" +\t\t\t// '' string\n                    \")\\\\s*;?\",\n                \"g\"\n            )\n            ;\n\n        while ((match = regex.exec(str)) != null)\n        {\n            var value = match.value\n                    .replace(/^['\"]|['\"]$/g, '') // strip quotes from end of strings\n                ;\n\n            // try to parse array value\n            if (value != null && arrayRegex.test(value))\n            {\n                var m = arrayRegex.exec(value);\n                value = m.values.length > 0 ? m.values.split(/\\s*,\\s*/) : [];\n            }\n\n            result[match.name] = value;\n        }\n\n        return result;\n    };\n\n    /**\n     * Wraps each line of the string into <code/> tag with given style applied to it.\n     *\n     * @param {String} str   Input string.\n     * @param {String} css   Style name to apply to the string.\n     * @return {String}      Returns input string with each line surrounded by <span/> tag.\n     */\n    function wrapLinesWithCode(str, css)\n    {\n        if (str == null || str.length == 0 || str == '\\n')\n            return str;\n\n        str = str.replace(/</g, '&lt;');\n\n        // Replace two or more sequential spaces with &nbsp; leaving last space untouched.\n        str = str.replace(/ {2,}/g, function(m)\n        {\n            var spaces = '';\n\n            for (var i = 0; i < m.length - 1; i++)\n                spaces += sh.config.space;\n\n            return spaces + ' ';\n        });\n\n        // Split each line and apply <span class=\"...\">...</span> to them so that\n        // leading spaces aren't included.\n        if (css != null)\n            str = eachLine(str, function(line)\n            {\n                if (line.length == 0)\n                    return '';\n\n                var spaces = '';\n\n                line = line.replace(/^(&nbsp;| )+/, function(s)\n                {\n                    spaces = s;\n                    return '';\n                });\n\n                if (line.length == 0)\n                    return spaces;\n\n                return spaces + '<code class=\"' + css + '\">' + line + '</code>';\n            });\n\n        return str;\n    };\n\n    /**\n     * Pads number with zeros until it's length is the same as given length.\n     *\n     * @param {Number} number\tNumber to pad.\n     * @param {Number} length\tMax string length with.\n     * @return {String}\t\t\tReturns a string padded with proper amount of '0'.\n     */\n    function padNumber(number, length)\n    {\n        var result = number.toString();\n\n        while (result.length < length)\n            result = '0' + result;\n\n        return result;\n    };\n\n    /**\n     * Replaces tabs with spaces.\n     *\n     * @param {String} code\t\tSource code.\n     * @param {Number} tabSize\tSize of the tab.\n     * @return {String}\t\t\tReturns code with all tabs replaces by spaces.\n     */\n    function processTabs(code, tabSize)\n    {\n        var tab = '';\n\n        for (var i = 0; i < tabSize; i++)\n            tab += ' ';\n\n        return code.replace(/\\t/g, tab);\n    };\n\n    /**\n     * Replaces tabs with smart spaces.\n     *\n     * @param {String} code    Code to fix the tabs in.\n     * @param {Number} tabSize Number of spaces in a column.\n     * @return {String}        Returns code with all tabs replaces with roper amount of spaces.\n     */\n    function processSmartTabs(code, tabSize)\n    {\n        var lines = splitLines(code),\n            tab = '\\t',\n            spaces = ''\n            ;\n\n        // Create a string with 1000 spaces to copy spaces from...\n        // It's assumed that there would be no indentation longer than that.\n        for (var i = 0; i < 50; i++)\n            spaces += '                    '; // 20 spaces * 50\n\n        // This function inserts specified amount of spaces in the string\n        // where a tab is while removing that given tab.\n        function insertSpaces(line, pos, count)\n        {\n            return line.substr(0, pos)\n                + spaces.substr(0, count)\n                + line.substr(pos + 1, line.length) // pos + 1 will get rid of the tab\n                ;\n        };\n\n        // Go through all the lines and do the 'smart tabs' magic.\n        code = eachLine(code, function(line)\n        {\n            if (line.indexOf(tab) == -1)\n                return line;\n\n            var pos = 0;\n\n            while ((pos = line.indexOf(tab)) != -1)\n            {\n                // This is pretty much all there is to the 'smart tabs' logic.\n                // Based on the position within the line and size of a tab,\n                // calculate the amount of spaces we need to insert.\n                var spaces = tabSize - pos % tabSize;\n                line = insertSpaces(line, pos, spaces);\n            }\n\n            return line;\n        });\n\n        return code;\n    };\n\n    /**\n     * Performs various string fixes based on configuration.\n     */\n    function fixInputString(str)\n    {\n        var br = /<br\\s*\\/?>|&lt;br\\s*\\/?&gt;/gi;\n\n        if (sh.config.bloggerMode == true)\n            str = str.replace(br, '\\n');\n\n        if (sh.config.stripBrs == true)\n            str = str.replace(br, '');\n\n        return str;\n    };\n\n    /**\n     * Removes all white space at the begining and end of a string.\n     *\n     * @param {String} str   String to trim.\n     * @return {String}      Returns string without leading and following white space characters.\n     */\n    function trim(str)\n    {\n        return str.replace(/^\\s+|\\s+$/g, '');\n    };\n\n    /**\n     * Unindents a block of text by the lowest common indent amount.\n     * @param {String} str   Text to unindent.\n     * @return {String}      Returns unindented text block.\n     */\n    function unindent(str)\n    {\n        var lines = splitLines(fixInputString(str)),\n            indents = new Array(),\n            regex = /^\\s*/,\n            min = 1000\n            ;\n\n        // go through every line and check for common number of indents\n        for (var i = 0; i < lines.length && min > 0; i++)\n        {\n            var line = lines[i];\n\n            if (trim(line).length == 0)\n                continue;\n\n            var matches = regex.exec(line);\n\n            // In the event that just one line doesn't have leading white space\n            // we can't unindent anything, so bail completely.\n            if (matches == null)\n                return str;\n\n            min = Math.min(matches[0].length, min);\n        }\n\n        // trim minimum common number of white space from the begining of every line\n        if (min > 0)\n            for (var i = 0; i < lines.length; i++)\n                lines[i] = lines[i].substr(min);\n\n        return lines.join('\\n');\n    };\n\n    /**\n     * Callback method for Array.sort() which sorts matches by\n     * index position and then by length.\n     *\n     * @param {Match} m1\tLeft object.\n     * @param {Match} m2    Right object.\n     * @return {Number}     Returns -1, 0 or -1 as a comparison result.\n     */\n    function matchesSortCallback(m1, m2)\n    {\n        // sort matches by index first\n        if(m1.index < m2.index)\n            return -1;\n        else if(m1.index > m2.index)\n            return 1;\n        else\n        {\n            // if index is the same, sort by length\n            if(m1.length < m2.length)\n                return -1;\n            else if(m1.length > m2.length)\n                return 1;\n        }\n\n        return 0;\n    };\n\n    /**\n     * Executes given regular expression on provided code and returns all\n     * matches that are found.\n     *\n     * @param {String} code    Code to execute regular expression on.\n     * @param {Object} regex   Regular expression item info from <code>regexList</code> collection.\n     * @return {Array}         Returns a list of Match objects.\n     */\n    function getMatches(code, regexInfo)\n    {\n        function defaultAdd(match, regexInfo)\n        {\n            return match[0];\n        };\n\n        var index = 0,\n            match = null,\n            matches = [],\n            func = regexInfo.func ? regexInfo.func : defaultAdd\n            ;\n\n        while((match = regexInfo.regex.exec(code)) != null)\n        {\n            var resultMatch = func(match, regexInfo);\n\n            if (typeof(resultMatch) == 'string')\n                resultMatch = [new sh.Match(resultMatch, match.index, regexInfo.css)];\n\n            matches = matches.concat(resultMatch);\n        }\n\n        return matches;\n    };\n\n    /**\n     * Turns all URLs in the code into <a/> tags.\n     * @param {String} code Input code.\n     * @return {String} Returns code with </a> tags.\n     */\n    function processUrls(code)\n    {\n        var gt = /(.*)((&gt;|&lt;).*)/;\n\n        return code.replace(sh.regexLib.url, function(m)\n        {\n            var suffix = '',\n                match = null\n                ;\n\n            // We include &lt; and &gt; in the URL for the common cases like <http://google.com>\n            // The problem is that they get transformed into &lt;http://google.com&gt;\n            // Where as &gt; easily looks like part of the URL string.\n\n            if (match = gt.exec(m))\n            {\n                m = match[1];\n                suffix = match[2];\n            }\n\n            return '<a href=\"' + m + '\">' + m + '</a>' + suffix;\n        });\n    };\n\n    /**\n     * Finds all <SCRIPT TYPE=\"syntaxhighlighter\" /> elementss.\n     * @return {Array} Returns array of all found SyntaxHighlighter tags.\n     */\n    function getSyntaxHighlighterScriptTags()\n    {\n        var tags = document.getElementsByTagName('script'),\n            result = []\n            ;\n\n        for (var i = 0; i < tags.length; i++)\n            if (tags[i].type == 'syntaxhighlighter')\n                result.push(tags[i]);\n\n        return result;\n    };\n\n    /**\n     * Strips <![CDATA[]]> from <SCRIPT /> content because it should be used\n     * there in most cases for XHTML compliance.\n     * @param {String} original\tInput code.\n     * @return {String} Returns code without leading <![CDATA[]]> tags.\n     */\n    function stripCData(original)\n    {\n        var left = '<![CDATA[',\n            right = ']]>',\n        // for some reason IE inserts some leading blanks here\n            copy = trim(original),\n            changed = false,\n            leftLength = left.length,\n            rightLength = right.length\n            ;\n\n        if (copy.indexOf(left) == 0)\n        {\n            copy = copy.substring(leftLength);\n            changed = true;\n        }\n\n        var copyLength = copy.length;\n\n        if (copy.indexOf(right) == copyLength - rightLength)\n        {\n            copy = copy.substring(0, copyLength - rightLength);\n            changed = true;\n        }\n\n        return changed ? copy : original;\n    };\n\n\n    /**\n     * Quick code mouse double click handler.\n     */\n    function quickCodeHandler(e)\n    {\n        var target = e.target,\n            highlighterDiv = findParentElement(target, '.syntaxhighlighter'),\n            container = findParentElement(target, '.container'),\n            textarea = document.createElement('textarea'),\n            highlighter\n            ;\n\n        if (!container || !highlighterDiv || findElement(container, 'textarea'))\n            return;\n\n        highlighter = getHighlighterById(highlighterDiv.id);\n\n        // add source class name\n        addClass(highlighterDiv, 'source');\n\n        // Have to go over each line and grab it's text, can't just do it on the\n        // container because Firefox loses all \\n where as Webkit doesn't.\n        var lines = container.childNodes,\n            code = []\n            ;\n\n        for (var i = 0; i < lines.length; i++)\n            code.push(lines[i].innerText || lines[i].textContent);\n\n        // using \\r instead of \\r or \\r\\n makes this work equally well on IE, FF and Webkit\n        code = code.join('\\r');\n\n        // For Webkit browsers, replace nbsp with a breaking space\n        code = code.replace(/\\u00a0/g, \" \");\n\n        // inject <textarea/> tag\n        textarea.appendChild(document.createTextNode(code));\n        container.appendChild(textarea);\n\n        // preselect all text\n        textarea.focus();\n        textarea.select();\n\n        // set up handler for lost focus\n        attachEvent(textarea, 'blur', function(e)\n        {\n            textarea.parentNode.removeChild(textarea);\n            removeClass(highlighterDiv, 'source');\n        });\n    };\n\n    /**\n     * Match object.\n     */\n    sh.Match = function(value, index, css)\n    {\n        this.value = value;\n        this.index = index;\n        this.length = value.length;\n        this.css = css;\n        this.brushName = null;\n    };\n\n    sh.Match.prototype.toString = function()\n    {\n        return this.value;\n    };\n\n    /**\n     * Simulates HTML code with a scripting language embedded.\n     *\n     * @param {String} scriptBrushName Brush name of the scripting language.\n     */\n    sh.HtmlScript = function(scriptBrushName)\n    {\n        var brushClass = findBrush(scriptBrushName),\n            scriptBrush,\n            xmlBrush = new sh.brushes.Xml(),\n            bracketsRegex = null,\n            ref = this,\n            methodsToExpose = 'getDiv getHtml init'.split(' ')\n            ;\n\n        if (brushClass == null)\n            return;\n\n        scriptBrush = new brushClass();\n\n        for(var i = 0; i < methodsToExpose.length; i++)\n            // make a closure so we don't lose the name after i changes\n            (function() {\n                var name = methodsToExpose[i];\n\n                ref[name] = function()\n                {\n                    return xmlBrush[name].apply(xmlBrush, arguments);\n                };\n            })();\n\n        if (scriptBrush.htmlScript == null)\n        {\n            alert(sh.config.strings.brushNotHtmlScript + scriptBrushName);\n            return;\n        }\n\n        xmlBrush.regexList.push(\n            { regex: scriptBrush.htmlScript.code, func: process }\n        );\n\n        function offsetMatches(matches, offset)\n        {\n            for (var j = 0; j < matches.length; j++)\n                matches[j].index += offset;\n        }\n\n        function process(match, info)\n        {\n            var code = match.code,\n                matches = [],\n                regexList = scriptBrush.regexList,\n                offset = match.index + match.left.length,\n                htmlScript = scriptBrush.htmlScript,\n                result\n                ;\n\n            // add all matches from the code\n            for (var i = 0; i < regexList.length; i++)\n            {\n                result = getMatches(code, regexList[i]);\n                offsetMatches(result, offset);\n                matches = matches.concat(result);\n            }\n\n            // add left script bracket\n            if (htmlScript.left != null && match.left != null)\n            {\n                result = getMatches(match.left, htmlScript.left);\n                offsetMatches(result, match.index);\n                matches = matches.concat(result);\n            }\n\n            // add right script bracket\n            if (htmlScript.right != null && match.right != null)\n            {\n                result = getMatches(match.right, htmlScript.right);\n                offsetMatches(result, match.index + match[0].lastIndexOf(match.right));\n                matches = matches.concat(result);\n            }\n\n            for (var j = 0; j < matches.length; j++)\n                matches[j].brushName = brushClass.brushName;\n\n            return matches;\n        }\n    };\n\n    /**\n     * Main Highlither class.\n     * @constructor\n     */\n    sh.Highlighter = function()\n    {\n        // not putting any code in here because of the prototype inheritance\n    };\n\n    sh.Highlighter.prototype = {\n        /**\n         * Returns value of the parameter passed to the highlighter.\n         * @param {String} name\t\t\t\tName of the parameter.\n         * @param {Object} defaultValue\t\tDefault value.\n         * @return {Object}\t\t\t\t\tReturns found value or default value otherwise.\n         */\n        getParam: function(name, defaultValue)\n        {\n            var result = this.params[name];\n            return toBoolean(result == null ? defaultValue : result);\n        },\n\n        /**\n         * Shortcut to document.createElement().\n         * @param {String} name\t\tName of the element to create (DIV, A, etc).\n         * @return {HTMLElement}\tReturns new HTML element.\n         */\n        create: function(name)\n        {\n            return document.createElement(name);\n        },\n\n        /**\n         * Applies all regular expression to the code and stores all found\n         * matches in the `this.matches` array.\n         * @param {Array} regexList\t\tList of regular expressions.\n         * @param {String} code\t\t\tSource code.\n         * @return {Array}\t\t\t\tReturns list of matches.\n         */\n        findMatches: function(regexList, code)\n        {\n            var result = [];\n\n            if (regexList != null)\n                for (var i = 0; i < regexList.length; i++)\n                    // BUG: length returns len+1 for array if methods added to prototype chain (oising@gmail.com)\n                    if (typeof (regexList[i]) == \"object\")\n                        result = result.concat(getMatches(code, regexList[i]));\n\n            // sort and remove nested the matches\n            return this.removeNestedMatches(result.sort(matchesSortCallback));\n        },\n\n        /**\n         * Checks to see if any of the matches are inside of other matches.\n         * This process would get rid of highligted strings inside comments,\n         * keywords inside strings and so on.\n         */\n        removeNestedMatches: function(matches)\n        {\n            // Optimized by Jose Prado (http://joseprado.com)\n            for (var i = 0; i < matches.length; i++)\n            {\n                if (matches[i] === null)\n                    continue;\n\n                var itemI = matches[i],\n                    itemIEndPos = itemI.index + itemI.length\n                    ;\n\n                for (var j = i + 1; j < matches.length && matches[i] !== null; j++)\n                {\n                    var itemJ = matches[j];\n\n                    if (itemJ === null)\n                        continue;\n                    else if (itemJ.index > itemIEndPos)\n                        break;\n                    else if (itemJ.index == itemI.index && itemJ.length > itemI.length)\n                        matches[i] = null;\n                    else if (itemJ.index >= itemI.index && itemJ.index < itemIEndPos)\n                        matches[j] = null;\n                }\n            }\n\n            return matches;\n        },\n\n        /**\n         * Creates an array containing integer line numbers starting from the 'first-line' param.\n         * @return {Array} Returns array of integers.\n         */\n        figureOutLineNumbers: function(code)\n        {\n            var lines = [],\n                firstLine = parseInt(this.getParam('first-line'))\n                ;\n\n            eachLine(code, function(line, index)\n            {\n                lines.push(index + firstLine);\n            });\n\n            return lines;\n        },\n\n        /**\n         * Determines if specified line number is in the highlighted list.\n         */\n        isLineHighlighted: function(lineNumber)\n        {\n            var list = this.getParam('highlight', []);\n\n            if (typeof(list) != 'object' && list.push == null)\n                list = [ list ];\n\n            return indexOf(list, lineNumber.toString()) != -1;\n        },\n\n        /**\n         * Generates HTML markup for a single line of code while determining alternating line style.\n         * @param {Integer} lineNumber\tLine number.\n         * @param {String} code Line\tHTML markup.\n         * @return {String}\t\t\t\tReturns HTML markup.\n         */\n        getLineHtml: function(lineIndex, lineNumber, code)\n        {\n            var classes = [\n                'line',\n                'number' + lineNumber,\n                'index' + lineIndex,\n                'alt' + (lineNumber % 2 == 0 ? 1 : 2).toString()\n            ];\n\n            if (this.isLineHighlighted(lineNumber))\n                classes.push('highlighted');\n\n            if (lineNumber == 0)\n                classes.push('break');\n\n            return '<div class=\"' + classes.join(' ') + '\">' + code + '</div>';\n        },\n\n        /**\n         * Generates HTML markup for line number column.\n         * @param {String} code\t\t\tComplete code HTML markup.\n         * @param {Array} lineNumbers\tCalculated line numbers.\n         * @return {String}\t\t\t\tReturns HTML markup.\n         */\n        getLineNumbersHtml: function(code, lineNumbers)\n        {\n            var html = '',\n                count = splitLines(code).length,\n                firstLine = parseInt(this.getParam('first-line')),\n                pad = this.getParam('pad-line-numbers')\n                ;\n\n            if (pad == true)\n                pad = (firstLine + count - 1).toString().length;\n            else if (isNaN(pad) == true)\n                pad = 0;\n\n            for (var i = 0; i < count; i++)\n            {\n                var lineNumber = lineNumbers ? lineNumbers[i] : firstLine + i,\n                    code = lineNumber == 0 ? sh.config.space : padNumber(lineNumber, pad)\n                    ;\n\n                html += this.getLineHtml(i, lineNumber, code);\n            }\n\n            return html;\n        },\n\n        /**\n         * Splits block of text into individual DIV lines.\n         * @param {String} code\t\t\tCode to highlight.\n         * @param {Array} lineNumbers\tCalculated line numbers.\n         * @return {String}\t\t\t\tReturns highlighted code in HTML form.\n         */\n        getCodeLinesHtml: function(html, lineNumbers)\n        {\n            html = trim(html);\n\n            var lines = splitLines(html),\n                padLength = this.getParam('pad-line-numbers'),\n                firstLine = parseInt(this.getParam('first-line')),\n                html = '',\n                brushName = this.getParam('brush')\n                ;\n\n            for (var i = 0; i < lines.length; i++)\n            {\n                var line = lines[i],\n                    indent = /^(&nbsp;|\\s)+/.exec(line),\n                    spaces = null,\n                    lineNumber = lineNumbers ? lineNumbers[i] : firstLine + i;\n                ;\n\n                if (indent != null)\n                {\n                    spaces = indent[0].toString();\n                    line = line.substr(spaces.length);\n                    spaces = spaces.replace(' ', sh.config.space);\n                }\n\n                line = trim(line);\n\n                if (line.length == 0)\n                    line = sh.config.space;\n\n                html += this.getLineHtml(\n                    i,\n                    lineNumber,\n                    (spaces != null ? '<code class=\"' + brushName + ' spaces\">' + spaces + '</code>' : '') + line\n                );\n            }\n\n            return html;\n        },\n\n        /**\n         * Returns HTML for the table title or empty string if title is null.\n         */\n        getTitleHtml: function(title)\n        {\n            return title ? '<caption>' + title + '</caption>' : '';\n        },\n\n        /**\n         * Finds all matches in the source code.\n         * @param {String} code\t\tSource code to process matches in.\n         * @param {Array} matches\tDiscovered regex matches.\n         * @return {String} Returns formatted HTML with processed mathes.\n         */\n        getMatchesHtml: function(code, matches)\n        {\n            var pos = 0,\n                result = '',\n                brushName = this.getParam('brush', '')\n                ;\n\n            function getBrushNameCss(match)\n            {\n                var result = match ? (match.brushName || brushName) : brushName;\n                return result ? result + ' ' : '';\n            };\n\n            // Finally, go through the final list of matches and pull the all\n            // together adding everything in between that isn't a match.\n            for (var i = 0; i < matches.length; i++)\n            {\n                var match = matches[i],\n                    matchBrushName\n                    ;\n\n                if (match === null || match.length === 0)\n                    continue;\n\n                matchBrushName = getBrushNameCss(match);\n\n                result += wrapLinesWithCode(code.substr(pos, match.index - pos), matchBrushName + 'plain')\n                    + wrapLinesWithCode(match.value, matchBrushName + match.css)\n                ;\n\n                pos = match.index + match.length + (match.offset || 0);\n            }\n\n            // don't forget to add whatever's remaining in the string\n            result += wrapLinesWithCode(code.substr(pos), getBrushNameCss() + 'plain');\n\n            return result;\n        },\n\n        /**\n         * Generates HTML markup for the whole syntax highlighter.\n         * @param {String} code Source code.\n         * @return {String} Returns HTML markup.\n         */\n        getHtml: function(code)\n        {\n            var html = '',\n                classes = [ 'syntaxhighlighter' ],\n                tabSize,\n                matches,\n                lineNumbers\n                ;\n\n            // process light mode\n            if (this.getParam('light') == true)\n                this.params.toolbar = this.params.gutter = false;\n\n            className = 'syntaxhighlighter';\n\n            if (this.getParam('collapse') == true)\n                classes.push('collapsed');\n\n            if ((gutter = this.getParam('gutter')) == false)\n                classes.push('nogutter');\n\n            // add custom user style name\n            classes.push(this.getParam('class-name'));\n\n            // add brush alias to the class name for custom CSS\n            classes.push(this.getParam('brush'));\n\n            code = trimFirstAndLastLines(code)\n                .replace(/\\r/g, ' ') // IE lets these buggers through\n            ;\n\n            tabSize = this.getParam('tab-size');\n\n            // replace tabs with spaces\n            code = this.getParam('smart-tabs') == true\n                ? processSmartTabs(code, tabSize)\n                : processTabs(code, tabSize)\n            ;\n\n            // unindent code by the common indentation\n            if (this.getParam('unindent'))\n                code = unindent(code);\n\n            if (gutter)\n                lineNumbers = this.figureOutLineNumbers(code);\n\n            // find matches in the code using brushes regex list\n            matches = this.findMatches(this.regexList, code);\n            // processes found matches into the html\n            html = this.getMatchesHtml(code, matches);\n            // finally, split all lines so that they wrap well\n            html = this.getCodeLinesHtml(html, lineNumbers);\n\n            // finally, process the links\n            if (this.getParam('auto-links'))\n                html = processUrls(html);\n\n            if (typeof(navigator) != 'undefined' && navigator.userAgent && navigator.userAgent.match(/MSIE/))\n                classes.push('ie');\n\n            html =\n                '<div id=\"' + getHighlighterId(this.id) + '\" class=\"' + classes.join(' ') + '\">'\n                    + (this.getParam('toolbar') ? sh.toolbar.getHtml(this) : '')\n                    + '<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">'\n                    + this.getTitleHtml(this.getParam('title'))\n                    + '<tbody>'\n                    + '<tr>'\n                    + (gutter ? '<td class=\"gutter\">' + this.getLineNumbersHtml(code) + '</td>' : '')\n                    + '<td class=\"code\">'\n                    + '<div class=\"container\">'\n                    + html\n                    + '</div>'\n                    + '</td>'\n                    + '</tr>'\n                    + '</tbody>'\n                    + '</table>'\n                    + '</div>'\n            ;\n\n            return html;\n        },\n\n        /**\n         * Highlights the code and returns complete HTML.\n         * @param {String} code     Code to highlight.\n         * @return {Element}        Returns container DIV element with all markup.\n         */\n        getDiv: function(code)\n        {\n            if (code === null)\n                code = '';\n\n            this.code = code;\n\n            var div = this.create('div');\n\n            // create main HTML\n            div.innerHTML = this.getHtml(code);\n\n            // set up click handlers\n            if (this.getParam('toolbar'))\n                attachEvent(findElement(div, '.toolbar'), 'click', sh.toolbar.handler);\n\n            if (this.getParam('quick-code'))\n                attachEvent(findElement(div, '.code'), 'dblclick', quickCodeHandler);\n\n            return div;\n        },\n\n        /**\n         * Initializes the highlighter/brush.\n         *\n         * Constructor isn't used for initialization so that nothing executes during necessary\n         * `new SyntaxHighlighter.Highlighter()` call when setting up brush inheritence.\n         *\n         * @param {Hash} params Highlighter parameters.\n         */\n        init: function(params)\n        {\n            this.id = guid();\n\n            // register this instance in the highlighters list\n            storeHighlighter(this);\n\n            // local params take precedence over defaults\n            this.params = merge(sh.defaults, params || {})\n\n            // process light mode\n            if (this.getParam('light') == true)\n                this.params.toolbar = this.params.gutter = false;\n        },\n\n        /**\n         * Converts space separated list of keywords into a regular expression string.\n         * @param {String} str    Space separated keywords.\n         * @return {String}       Returns regular expression string.\n         */\n        getKeywords: function(str)\n        {\n            str = str\n                .replace(/^\\s+|\\s+$/g, '')\n                .replace(/\\s+/g, '|')\n            ;\n\n            return '\\\\b(?:' + str + ')\\\\b';\n        },\n\n        /**\n         * Makes a brush compatible with the `html-script` functionality.\n         * @param {Object} regexGroup Object containing `left` and `right` regular expressions.\n         */\n        forHtmlScript: function(regexGroup)\n        {\n            var regex = { 'end' : regexGroup.right.source };\n\n            if(regexGroup.eof)\n                regex.end = \"(?:(?:\" + regex.end + \")|$)\";\n\n            this.htmlScript = {\n                left : { regex: regexGroup.left, css: 'script' },\n                right : { regex: regexGroup.right, css: 'script' },\n                code : new XRegExp(\n                    \"(?<left>\" + regexGroup.left.source + \")\" +\n                        \"(?<code>.*?)\" +\n                        \"(?<right>\" + regex.end + \")\",\n                    \"sgi\"\n                )\n            };\n        }\n    }; // end of Highlighter\n\n    return sh;\n}(); // end of anonymous function\n\n// CommonJS\ntypeof(exports) != 'undefined' ? exports.SyntaxHighlighter = SyntaxHighlighter : null;\n\n;(function()\n{\n    // CommonJS\n    SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n    function Brush()\n    {\n        // Created by Peter Atoria @ http://iAtoria.com\n\n        var inits \t =  'class interface function package';\n\n        var keywords =\t'-Infinity ...rest Array as AS3 Boolean break case catch const continue Date decodeURI ' +\n                'decodeURIComponent default delete do dynamic each else encodeURI encodeURIComponent escape ' +\n                'extends false final finally flash_proxy for get if implements import in include Infinity ' +\n                'instanceof int internal is isFinite isNaN isXMLName label namespace NaN native new null ' +\n                'Null Number Object object_proxy override parseFloat parseInt private protected public ' +\n                'return set static String super switch this throw true try typeof uint undefined unescape ' +\n                'use void while with'\n            ;\n\n        this.regexList = [\n            { regex: SyntaxHighlighter.regexLib.singleLineCComments,\tcss: 'comments' },\t\t// one line comments\n            { regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\tcss: 'comments' },\t\t// multiline comments\n            { regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\t\t// double quoted strings\n            { regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t\t// single quoted strings\n            { regex: /\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b/gi,\t\t\t\tcss: 'value' },\t\t\t// numbers\n            { regex: new RegExp(this.getKeywords(inits), 'gm'),\t\t\tcss: 'color3' },\t\t// initializations\n            { regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\tcss: 'keyword' },\t\t// keywords\n            { regex: new RegExp('var', 'gm'),\t\t\t\t\t\t\tcss: 'variable' },\t\t// variable\n            { regex: new RegExp('trace', 'gm'),\t\t\t\t\t\t\tcss: 'color1' }\t\t\t// trace\n        ];\n\n        this.forHtmlScript(SyntaxHighlighter.regexLib.scriptScriptTags);\n    };\n\n    Brush.prototype\t= new SyntaxHighlighter.Highlighter();\n    Brush.aliases\t= ['actionscript3', 'as3'];\n\n    SyntaxHighlighter.brushes.AS3 = Brush;\n\n    // CommonJS\n    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n\n;(function()\n{\n    // CommonJS\n    SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n    function Brush()\n    {\n        // AppleScript brush by David Chambers\n        // http://davidchambersdesign.com/\n        var keywords   = 'after before beginning continue copy each end every from return get global in local named of set some that the then times to where whose with without';\n        var ordinals   = 'first second third fourth fifth sixth seventh eighth ninth tenth last front back middle';\n        var specials   = 'activate add alias AppleScript ask attachment boolean class constant delete duplicate empty exists false id integer list make message modal modified new no paragraph pi properties quit real record remove rest result reveal reverse run running save string true word yes';\n\n        this.regexList = [\n\n            { regex: /(--|#).*$/gm,\n                css: 'comments' },\n\n            { regex: /\\(\\*(?:[\\s\\S]*?\\(\\*[\\s\\S]*?\\*\\))*[\\s\\S]*?\\*\\)/gm, // support nested comments\n                css: 'comments' },\n\n            { regex: /\"[\\s\\S]*?\"/gm,\n                css: 'string' },\n\n            { regex: /(?:,|:|¬|'s\\b|\\(|\\)|\\{|\\}|«|\\b\\w*»)/g,\n                css: 'color1' },\n\n            { regex: /(-)?(\\d)+(\\.(\\d)?)?(E\\+(\\d)+)?/g, // numbers\n                css: 'color1' },\n\n            { regex: /(?:&(amp;|gt;|lt;)?|=|� |>|<|≥|>=|≤|<=|\\*|\\+|-|\\/|÷|\\^)/g,\n                css: 'color2' },\n\n            { regex: /\\b(?:and|as|div|mod|not|or|return(?!\\s&)(ing)?|equals|(is(n't| not)? )?equal( to)?|does(n't| not) equal|(is(n't| not)? )?(greater|less) than( or equal( to)?)?|(comes|does(n't| not) come) (after|before)|is(n't| not)?( in)? (back|front) of|is(n't| not)? behind|is(n't| not)?( (in|contained by))?|does(n't| not) contain|contain(s)?|(start|begin|end)(s)? with|((but|end) )?(consider|ignor)ing|prop(erty)?|(a )?ref(erence)?( to)?|repeat (until|while|with)|((end|exit) )?repeat|((else|end) )?if|else|(end )?(script|tell|try)|(on )?error|(put )?into|(of )?(it|me)|its|my|with (timeout( of)?|transaction)|end (timeout|transaction))\\b/g,\n                css: 'keyword' },\n\n            { regex: /\\b\\d+(st|nd|rd|th)\\b/g, // ordinals\n                css: 'keyword' },\n\n            { regex: /\\b(?:about|above|against|around|at|below|beneath|beside|between|by|(apart|aside) from|(instead|out) of|into|on(to)?|over|since|thr(ough|u)|under)\\b/g,\n                css: 'color3' },\n\n            { regex: /\\b(?:adding folder items to|after receiving|choose( ((remote )?application|color|folder|from list|URL))?|clipboard info|set the clipboard to|(the )?clipboard|entire contents|display(ing| (alert|dialog|mode))?|document( (edited|file|nib name))?|file( (name|type))?|(info )?for|giving up after|(name )?extension|quoted form|return(ed)?|second(?! item)(s)?|list (disks|folder)|text item(s| delimiters)?|(Unicode )?text|(disk )?item(s)?|((current|list) )?view|((container|key) )?window|with (data|icon( (caution|note|stop))?|parameter(s)?|prompt|properties|seed|title)|case|diacriticals|hyphens|numeric strings|punctuation|white space|folder creation|application(s( folder)?| (processes|scripts position|support))?|((desktop )?(pictures )?|(documents|downloads|favorites|home|keychain|library|movies|music|public|scripts|sites|system|users|utilities|workflows) )folder|desktop|Folder Action scripts|font(s| panel)?|help|internet plugins|modem scripts|(system )?preferences|printer descriptions|scripting (additions|components)|shared (documents|libraries)|startup (disk|items)|temporary items|trash|on server|in AppleTalk zone|((as|long|short) )?user name|user (ID|locale)|(with )?password|in (bundle( with identifier)?|directory)|(close|open for) access|read|write( permission)?|(g|s)et eof|using( delimiters)?|starting at|default (answer|button|color|country code|entr(y|ies)|identifiers|items|name|location|script editor)|hidden( answer)?|open(ed| (location|untitled))?|error (handling|reporting)|(do( shell)?|load|run|store) script|administrator privileges|altering line endings|get volume settings|(alert|boot|input|mount|output|set) volume|output muted|(fax|random )?number|round(ing)?|up|down|toward zero|to nearest|as taught in school|system (attribute|info)|((AppleScript( Studio)?|system) )?version|(home )?directory|(IPv4|primary Ethernet) address|CPU (type|speed)|physical memory|time (stamp|to GMT)|replacing|ASCII (character|number)|localized string|from table|offset|summarize|beep|delay|say|(empty|multiple) selections allowed|(of|preferred) type|invisibles|showing( package contents)?|editable URL|(File|FTP|News|Media|Web) [Ss]ervers|Telnet hosts|Directory services|Remote applications|waiting until completion|saving( (in|to))?|path (for|to( (((current|frontmost) )?application|resource))?)|POSIX (file|path)|(background|RGB) color|(OK|cancel) button name|cancel button|button(s)?|cubic ((centi)?met(re|er)s|yards|feet|inches)|square ((kilo)?met(re|er)s|miles|yards|feet)|(centi|kilo)?met(re|er)s|miles|yards|feet|inches|lit(re|er)s|gallons|quarts|(kilo)?grams|ounces|pounds|degrees (Celsius|Fahrenheit|Kelvin)|print( (dialog|settings))?|clos(e(able)?|ing)|(de)?miniaturized|miniaturizable|zoom(ed|able)|attribute run|action (method|property|title)|phone|email|((start|end)ing|home) page|((birth|creation|current|custom|modification) )?date|((((phonetic )?(first|last|middle))|computer|host|maiden|related) |nick)?name|aim|icq|jabber|msn|yahoo|address(es)?|save addressbook|should enable action|city|country( code)?|formatte(r|d address)|(palette )?label|state|street|zip|AIM [Hh]andle(s)?|my card|select(ion| all)?|unsaved|(alpha )?value|entr(y|ies)|group|(ICQ|Jabber|MSN) handle|person|people|company|department|icon image|job title|note|organization|suffix|vcard|url|copies|collating|pages (across|down)|request print time|target( printer)?|((GUI Scripting|Script menu) )?enabled|show Computer scripts|(de)?activated|awake from nib|became (key|main)|call method|of (class|object)|center|clicked toolbar item|closed|for document|exposed|(can )?hide|idle|keyboard (down|up)|event( (number|type))?|launch(ed)?|load (image|movie|nib|sound)|owner|log|mouse (down|dragged|entered|exited|moved|up)|move|column|localization|resource|script|register|drag (info|types)|resigned (active|key|main)|resiz(e(d)?|able)|right mouse (down|dragged|up)|scroll wheel|(at )?index|should (close|open( untitled)?|quit( after last window closed)?|zoom)|((proposed|screen) )?bounds|show(n)?|behind|in front of|size (mode|to fit)|update(d| toolbar item)?|was (hidden|miniaturized)|will (become active|close|finish launching|hide|miniaturize|move|open|quit|(resign )?active|((maximum|minimum|proposed) )?size|show|zoom)|bundle|data source|movie|pasteboard|sound|tool(bar| tip)|(color|open|save) panel|coordinate system|frontmost|main( (bundle|menu|window))?|((services|(excluded from )?windows) )?menu|((executable|frameworks|resource|scripts|shared (frameworks|support)) )?path|(selected item )?identifier|data|content(s| view)?|character(s)?|click count|(command|control|option|shift) key down|context|delta (x|y|z)|key( code)?|location|pressure|unmodified characters|types|(first )?responder|playing|(allowed|selectable) identifiers|allows customization|(auto saves )?configuration|visible|image( name)?|menu form representation|tag|user(-| )defaults|associated file name|(auto|needs) display|current field editor|floating|has (resize indicator|shadow)|hides when deactivated|level|minimized (image|title)|opaque|position|release when closed|sheet|title(d)?)\\b/g,\n                css: 'color3' },\n\n            { regex: new RegExp(this.getKeywords(specials), 'gm'), css: 'color3' },\n            { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' },\n            { regex: new RegExp(this.getKeywords(ordinals), 'gm'), css: 'keyword' }\n        ];\n    };\n\n    Brush.prototype = new SyntaxHighlighter.Highlighter();\n    Brush.aliases = ['applescript'];\n\n    SyntaxHighlighter.brushes.AppleScript = Brush;\n\n    // CommonJS\n    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar keywords =\t'if fi then elif else for do done until while break continue case esac function return in eq ne ge le';\n\t\tvar commands =  'alias apropos awk basename bash bc bg builtin bzip2 cal cat cd cfdisk chgrp chmod chown chroot' +\n\t\t\t\t\t\t'cksum clear cmp comm command cp cron crontab csplit cut date dc dd ddrescue declare df ' +\n\t\t\t\t\t\t'diff diff3 dig dir dircolors dirname dirs du echo egrep eject enable env ethtool eval ' +\n\t\t\t\t\t\t'exec exit expand export expr false fdformat fdisk fg fgrep file find fmt fold format ' +\n\t\t\t\t\t\t'free fsck ftp gawk getopts grep groups gzip hash head history hostname id ifconfig ' +\n\t\t\t\t\t\t'import install join kill less let ln local locate logname logout look lpc lpr lprint ' +\n\t\t\t\t\t\t'lprintd lprintq lprm ls lsof make man mkdir mkfifo mkisofs mknod more mount mtools ' +\n\t\t\t\t\t\t'mv netstat nice nl nohup nslookup open op passwd paste pathchk ping popd pr printcap ' +\n\t\t\t\t\t\t'printenv printf ps pushd pwd quota quotacheck quotactl ram rcp read readonly renice ' +\n\t\t\t\t\t\t'remsync rm rmdir rsync screen scp sdiff sed select seq set sftp shift shopt shutdown ' +\n\t\t\t\t\t\t'sleep sort source split ssh strace su sudo sum symlink sync tail tar tee test time ' +\n\t\t\t\t\t\t'times touch top traceroute trap tr true tsort tty type ulimit umask umount unalias ' +\n\t\t\t\t\t\t'uname unexpand uniq units unset unshar useradd usermod users uuencode uudecode v vdir ' +\n\t\t\t\t\t\t'vi watch wc whereis which who whoami Wget xargs yes'\n\t\t\t\t\t\t;\n\n\t\tthis.regexList = [\n\t\t\t{ regex: /^#!.*$/gm,\t\t\t\t\t\t\t\t\t\t\tcss: 'preprocessor bold' },\n\t\t\t{ regex: /\\/[\\w-\\/]+/gm,\t\t\t\t\t\t\t\t\t\tcss: 'plain' },\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,\t\tcss: 'comments' },\t\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\t\tcss: 'string' },\t\t// double quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\t\tcss: 'string' },\t\t// single quoted strings\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\t\tcss: 'keyword' },\t\t// keywords\n\t\t\t{ regex: new RegExp(this.getKeywords(commands), 'gm'),\t\t\tcss: 'functions' }\t\t// commands\n\t\t\t];\n\t}\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['bash', 'shell', 'sh'];\n\n\tSyntaxHighlighter.brushes.Bash = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by Jen\n\t\t// http://www.jensbits.com/2009/05/14/coldfusion-brush-for-syntaxhighlighter-plus\n\t\n\t\tvar funcs\t=\t'Abs ACos AddSOAPRequestHeader AddSOAPResponseHeader AjaxLink AjaxOnLoad ArrayAppend ArrayAvg ArrayClear ArrayDeleteAt ' + \n\t\t\t\t\t\t'ArrayInsertAt ArrayIsDefined ArrayIsEmpty ArrayLen ArrayMax ArrayMin ArraySet ArraySort ArraySum ArraySwap ArrayToList ' + \n\t\t\t\t\t\t'Asc ASin Atn BinaryDecode BinaryEncode BitAnd BitMaskClear BitMaskRead BitMaskSet BitNot BitOr BitSHLN BitSHRN BitXor ' + \n\t\t\t\t\t\t'Ceiling CharsetDecode CharsetEncode Chr CJustify Compare CompareNoCase Cos CreateDate CreateDateTime CreateObject ' + \n\t\t\t\t\t\t'CreateODBCDate CreateODBCDateTime CreateODBCTime CreateTime CreateTimeSpan CreateUUID DateAdd DateCompare DateConvert ' + \n\t\t\t\t\t\t'DateDiff DateFormat DatePart Day DayOfWeek DayOfWeekAsString DayOfYear DaysInMonth DaysInYear DE DecimalFormat DecrementValue ' + \n\t\t\t\t\t\t'Decrypt DecryptBinary DeleteClientVariable DeserializeJSON DirectoryExists DollarFormat DotNetToCFType Duplicate Encrypt ' + \n\t\t\t\t\t\t'EncryptBinary Evaluate Exp ExpandPath FileClose FileCopy FileDelete FileExists FileIsEOF FileMove FileOpen FileRead ' + \n\t\t\t\t\t\t'FileReadBinary FileReadLine FileSetAccessMode FileSetAttribute FileSetLastModified FileWrite Find FindNoCase FindOneOf ' + \n\t\t\t\t\t\t'FirstDayOfMonth Fix FormatBaseN GenerateSecretKey GetAuthUser GetBaseTagData GetBaseTagList GetBaseTemplatePath ' + \n\t\t\t\t\t\t'GetClientVariablesList GetComponentMetaData GetContextRoot GetCurrentTemplatePath GetDirectoryFromPath GetEncoding ' + \n\t\t\t\t\t\t'GetException GetFileFromPath GetFileInfo GetFunctionList GetGatewayHelper GetHttpRequestData GetHttpTimeString ' + \n\t\t\t\t\t\t'GetK2ServerDocCount GetK2ServerDocCountLimit GetLocale GetLocaleDisplayName GetLocalHostIP GetMetaData GetMetricData ' + \n\t\t\t\t\t\t'GetPageContext GetPrinterInfo GetProfileSections GetProfileString GetReadableImageFormats GetSOAPRequest GetSOAPRequestHeader ' + \n\t\t\t\t\t\t'GetSOAPResponse GetSOAPResponseHeader GetTempDirectory GetTempFile GetTemplatePath GetTickCount GetTimeZoneInfo GetToken ' + \n\t\t\t\t\t\t'GetUserRoles GetWriteableImageFormats Hash Hour HTMLCodeFormat HTMLEditFormat IIf ImageAddBorder ImageBlur ImageClearRect ' + \n\t\t\t\t\t\t'ImageCopy ImageCrop ImageDrawArc ImageDrawBeveledRect ImageDrawCubicCurve ImageDrawLine ImageDrawLines ImageDrawOval ' + \n\t\t\t\t\t\t'ImageDrawPoint ImageDrawQuadraticCurve ImageDrawRect ImageDrawRoundRect ImageDrawText ImageFlip ImageGetBlob ImageGetBufferedImage ' + \n\t\t\t\t\t\t'ImageGetEXIFTag ImageGetHeight ImageGetIPTCTag ImageGetWidth ImageGrayscale ImageInfo ImageNegative ImageNew ImageOverlay ImagePaste ' + \n\t\t\t\t\t\t'ImageRead ImageReadBase64 ImageResize ImageRotate ImageRotateDrawingAxis ImageScaleToFit ImageSetAntialiasing ImageSetBackgroundColor ' + \n\t\t\t\t\t\t'ImageSetDrawingColor ImageSetDrawingStroke ImageSetDrawingTransparency ImageSharpen ImageShear ImageShearDrawingAxis ImageTranslate ' + \n\t\t\t\t\t\t'ImageTranslateDrawingAxis ImageWrite ImageWriteBase64 ImageXORDrawingMode IncrementValue InputBaseN Insert Int IsArray IsBinary ' + \n\t\t\t\t\t\t'IsBoolean IsCustomFunction IsDate IsDDX IsDebugMode IsDefined IsImage IsImageFile IsInstanceOf IsJSON IsLeapYear IsLocalHost ' + \n\t\t\t\t\t\t'IsNumeric IsNumericDate IsObject IsPDFFile IsPDFObject IsQuery IsSimpleValue IsSOAPRequest IsStruct IsUserInAnyRole IsUserInRole ' + \n\t\t\t\t\t\t'IsUserLoggedIn IsValid IsWDDX IsXML IsXmlAttribute IsXmlDoc IsXmlElem IsXmlNode IsXmlRoot JavaCast JSStringFormat LCase Left Len ' + \n\t\t\t\t\t\t'ListAppend ListChangeDelims ListContains ListContainsNoCase ListDeleteAt ListFind ListFindNoCase ListFirst ListGetAt ListInsertAt ' + \n\t\t\t\t\t\t'ListLast ListLen ListPrepend ListQualify ListRest ListSetAt ListSort ListToArray ListValueCount ListValueCountNoCase LJustify Log ' + \n\t\t\t\t\t\t'Log10 LSCurrencyFormat LSDateFormat LSEuroCurrencyFormat LSIsCurrency LSIsDate LSIsNumeric LSNumberFormat LSParseCurrency LSParseDateTime ' + \n\t\t\t\t\t\t'LSParseEuroCurrency LSParseNumber LSTimeFormat LTrim Max Mid Min Minute Month MonthAsString Now NumberFormat ParagraphFormat ParseDateTime ' + \n\t\t\t\t\t\t'Pi PrecisionEvaluate PreserveSingleQuotes Quarter QueryAddColumn QueryAddRow QueryConvertForGrid QueryNew QuerySetCell QuotedValueList Rand ' + \n\t\t\t\t\t\t'Randomize RandRange REFind REFindNoCase ReleaseComObject REMatch REMatchNoCase RemoveChars RepeatString Replace ReplaceList ReplaceNoCase ' + \n\t\t\t\t\t\t'REReplace REReplaceNoCase Reverse Right RJustify Round RTrim Second SendGatewayMessage SerializeJSON SetEncoding SetLocale SetProfileString ' + \n\t\t\t\t\t\t'SetVariable Sgn Sin Sleep SpanExcluding SpanIncluding Sqr StripCR StructAppend StructClear StructCopy StructCount StructDelete StructFind ' + \n\t\t\t\t\t\t'StructFindKey StructFindValue StructGet StructInsert StructIsEmpty StructKeyArray StructKeyExists StructKeyList StructKeyList StructNew ' + \n\t\t\t\t\t\t'StructSort StructUpdate Tan TimeFormat ToBase64 ToBinary ToScript ToString Trim UCase URLDecode URLEncodedFormat URLSessionFormat Val ' + \n\t\t\t\t\t\t'ValueList VerifyClient Week Wrap Wrap WriteOutput XmlChildPos XmlElemNew XmlFormat XmlGetNodeType XmlNew XmlParse XmlSearch XmlTransform ' + \n\t\t\t\t\t\t'XmlValidate Year YesNoFormat';\n\n\t\tvar keywords =\t'cfabort cfajaximport cfajaxproxy cfapplet cfapplication cfargument cfassociate cfbreak cfcache cfcalendar ' + \n\t\t\t\t\t\t'cfcase cfcatch cfchart cfchartdata cfchartseries cfcol cfcollection cfcomponent cfcontent cfcookie cfdbinfo ' + \n\t\t\t\t\t\t'cfdefaultcase cfdirectory cfdiv cfdocument cfdocumentitem cfdocumentsection cfdump cfelse cfelseif cferror ' + \n\t\t\t\t\t\t'cfexchangecalendar cfexchangeconnection cfexchangecontact cfexchangefilter cfexchangemail cfexchangetask ' + \n\t\t\t\t\t\t'cfexecute cfexit cffeed cffile cfflush cfform cfformgroup cfformitem cfftp cffunction cfgrid cfgridcolumn ' + \n\t\t\t\t\t\t'cfgridrow cfgridupdate cfheader cfhtmlhead cfhttp cfhttpparam cfif cfimage cfimport cfinclude cfindex ' + \n\t\t\t\t\t\t'cfinput cfinsert cfinterface cfinvoke cfinvokeargument cflayout cflayoutarea cfldap cflocation cflock cflog ' + \n\t\t\t\t\t\t'cflogin cfloginuser cflogout cfloop cfmail cfmailparam cfmailpart cfmenu cfmenuitem cfmodule cfNTauthenticate ' + \n\t\t\t\t\t\t'cfobject cfobjectcache cfoutput cfparam cfpdf cfpdfform cfpdfformparam cfpdfparam cfpdfsubform cfpod cfpop ' + \n\t\t\t\t\t\t'cfpresentation cfpresentationslide cfpresenter cfprint cfprocessingdirective cfprocparam cfprocresult ' + \n\t\t\t\t\t\t'cfproperty cfquery cfqueryparam cfregistry cfreport cfreportparam cfrethrow cfreturn cfsavecontent cfschedule ' + \n\t\t\t\t\t\t'cfscript cfsearch cfselect cfset cfsetting cfsilent cfslider cfsprydataset cfstoredproc cfswitch cftable ' + \n\t\t\t\t\t\t'cftextarea cfthread cfthrow cftimer cftooltip cftrace cftransaction cftree cftreeitem cftry cfupdate cfwddx ' + \n\t\t\t\t\t\t'cfwindow cfxml cfzip cfzipparam';\n\n\t\tvar operators =\t'all and any between cross in join like not null or outer some';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: new RegExp('--(.*)$', 'gm'),\t\t\t\t\t\tcss: 'comments' },  // one line and multiline comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.xmlComments,\t\t\tcss: 'comments' },    // single quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },    // double quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },    // single quoted strings\n\t\t\t{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),\t\tcss: 'functions' }, // functions\n\t\t\t{ regex: new RegExp(this.getKeywords(operators), 'gmi'),\tcss: 'color1' },    // operators and such\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),\t\tcss: 'keyword' }    // keyword\n\t\t\t];\n\t}\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['coldfusion','cf'];\n\t\n\tSyntaxHighlighter.brushes.ColdFusion = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Copyright 2006 Shin, YoungJin\n\t\n\t\tvar datatypes =\t'ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR ' +\n\t\t\t\t\t\t'DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH ' +\n\t\t\t\t\t\t'HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP ' +\n\t\t\t\t\t\t'HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY ' +\n\t\t\t\t\t\t'HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT ' +\n\t\t\t\t\t\t'HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE ' +\n\t\t\t\t\t\t'LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF ' +\n\t\t\t\t\t\t'LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR ' +\n\t\t\t\t\t\t'LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR ' +\n\t\t\t\t\t\t'PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT ' +\n\t\t\t\t\t\t'PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 ' +\n\t\t\t\t\t\t'POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR ' +\n\t\t\t\t\t\t'PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 ' +\n\t\t\t\t\t\t'PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT ' +\n\t\t\t\t\t\t'SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG ' +\n\t\t\t\t\t\t'ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM ' +\n\t\t\t\t\t\t'char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t ' +\n\t\t\t\t\t\t'clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS ' +\n\t\t\t\t\t\t'FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t ' +\n\t\t\t\t\t\t'__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t ' +\n\t\t\t\t\t\t'jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler ' +\n\t\t\t\t\t\t'sig_atomic_t size_t _stat __stat64 _stati64 terminate_function ' +\n\t\t\t\t\t\t'time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf ' +\n\t\t\t\t\t\t'va_list wchar_t wctrans_t wctype_t wint_t signed';\n\n\t\tvar keywords =\t'auto break case catch class const decltype __finally __exception __try ' +\n\t\t\t\t\t\t'const_cast continue private public protected __declspec ' +\n\t\t\t\t\t\t'default delete deprecated dllexport dllimport do dynamic_cast ' +\n\t\t\t\t\t\t'else enum explicit extern if for friend goto inline ' +\n\t\t\t\t\t\t'mutable naked namespace new noinline noreturn nothrow ' +\n\t\t\t\t\t\t'register reinterpret_cast return selectany ' +\n\t\t\t\t\t\t'sizeof static static_cast struct switch template this ' +\n\t\t\t\t\t\t'thread throw true false try typedef typeid typename union ' +\n\t\t\t\t\t\t'using uuid virtual void volatile whcar_t while';\n\t\t\t\t\t\n\t\tvar functions =\t'assert isalnum isalpha iscntrl isdigit isgraph islower isprint' +\n\t\t\t\t\t\t'ispunct isspace isupper isxdigit tolower toupper errno localeconv ' +\n\t\t\t\t\t\t'setlocale acos asin atan atan2 ceil cos cosh exp fabs floor fmod ' +\n\t\t\t\t\t\t'frexp ldexp log log10 modf pow sin sinh sqrt tan tanh jmp_buf ' +\n\t\t\t\t\t\t'longjmp setjmp raise signal sig_atomic_t va_arg va_end va_start ' +\n\t\t\t\t\t\t'clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen ' +\n\t\t\t\t\t\t'fprintf fputc fputs fread freopen fscanf fseek fsetpos ftell ' +\n\t\t\t\t\t\t'fwrite getc getchar gets perror printf putc putchar puts remove ' +\n\t\t\t\t\t\t'rename rewind scanf setbuf setvbuf sprintf sscanf tmpfile tmpnam ' +\n\t\t\t\t\t\t'ungetc vfprintf vprintf vsprintf abort abs atexit atof atoi atol ' +\n\t\t\t\t\t\t'bsearch calloc div exit free getenv labs ldiv malloc mblen mbstowcs ' +\n\t\t\t\t\t\t'mbtowc qsort rand realloc srand strtod strtol strtoul system ' +\n\t\t\t\t\t\t'wcstombs wctomb memchr memcmp memcpy memmove memset strcat strchr ' +\n\t\t\t\t\t\t'strcmp strcoll strcpy strcspn strerror strlen strncat strncmp ' +\n\t\t\t\t\t\t'strncpy strpbrk strrchr strspn strstr strtok strxfrm asctime ' +\n\t\t\t\t\t\t'clock ctime difftime gmtime localtime mktime strftime time';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\tcss: 'comments' },\t\t\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\tcss: 'comments' },\t\t\t// multiline comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\t\t\t// strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t\t\t// strings\n\t\t\t{ regex: /^ *#.*/gm,\t\t\t\t\t\t\t\t\t\tcss: 'preprocessor' },\n\t\t\t{ regex: new RegExp(this.getKeywords(datatypes), 'gm'),\t\tcss: 'color1 bold' },\n\t\t\t{ regex: new RegExp(this.getKeywords(functions), 'gm'),\t\tcss: 'functions bold' },\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\tcss: 'keyword bold' }\n\t\t\t];\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['cpp', 'c'];\n\n\tSyntaxHighlighter.brushes.Cpp = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar keywords =\t'abstract as base bool break byte case catch char checked class const ' +\n\t\t\t\t\t\t'continue decimal default delegate do double else enum event explicit volatile ' +\n\t\t\t\t\t\t'extern false finally fixed float for foreach get goto if implicit in int ' +\n\t\t\t\t\t\t'interface internal is lock long namespace new null object operator out ' +\n\t\t\t\t\t\t'override params private protected public readonly ref return sbyte sealed set ' +\n\t\t\t\t\t\t'short sizeof stackalloc static string struct switch this throw true try ' +\n\t\t\t\t\t\t'typeof uint ulong unchecked unsafe ushort using virtual void while var ' +\n\t\t\t\t\t\t'from group by into select let where orderby join on equals ascending descending';\n\n\t\tfunction fixComments(match, regexInfo)\n\t\t{\n\t\t\tvar css = (match[0].indexOf(\"///\") == 0)\n\t\t\t\t? 'color1'\n\t\t\t\t: 'comments'\n\t\t\t\t;\n\t\t\t\n\t\t\treturn [new SyntaxHighlighter.Match(match[0], match.index, css)];\n\t\t}\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\tfunc : fixComments },\t\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\tcss: 'comments' },\t\t\t// multiline comments\n\t\t\t{ regex: /@\"(?:[^\"]|\"\")*\"/g,\t\t\t\t\t\t\t\tcss: 'string' },\t\t\t// @-quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\t\t\t// strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t\t\t// strings\n\t\t\t{ regex: /^\\s*#.*/gm,\t\t\t\t\t\t\t\t\t\tcss: 'preprocessor' },\t\t// preprocessor tags like #region and #endregion\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\tcss: 'keyword' },\t\t\t// c# keyword\n\t\t\t{ regex: /\\bpartial(?=\\s+(?:class|interface|struct)\\b)/g,\tcss: 'keyword' },\t\t\t// contextual keyword: 'partial'\n\t\t\t{ regex: /\\byield(?=\\s+(?:return|break)\\b)/g,\t\t\t\tcss: 'keyword' }\t\t\t// contextual keyword: 'yield'\n\t\t\t];\n\t\t\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['c#', 'c-sharp', 'csharp'];\n\n\tSyntaxHighlighter.brushes.CSharp = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tfunction getKeywordsCSS(str)\n\t\t{\n\t\t\treturn '\\\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\\\b|\\\\b([a-z_\\\\*]|\\\\*|)') + '(?=:)\\\\b';\n\t\t};\n\t\n\t\tfunction getValuesCSS(str)\n\t\t{\n\t\t\treturn '\\\\b' + str.replace(/ /g, '(?!-)(?!:)\\\\b|\\\\b()') + '\\:\\\\b';\n\t\t};\n\n\t\tvar keywords =\t'ascent azimuth background-attachment background-color background-image background-position ' +\n\t\t\t\t\t\t'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +\n\t\t\t\t\t\t'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +\n\t\t\t\t\t\t'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +\n\t\t\t\t\t\t'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +\n\t\t\t\t\t\t'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +\n\t\t\t\t\t\t'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +\n\t\t\t\t\t\t'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +\n\t\t\t\t\t\t'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +\n\t\t\t\t\t\t'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +\n\t\t\t\t\t\t'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +\n\t\t\t\t\t\t'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +\n\t\t\t\t\t\t'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +\n\t\t\t\t\t\t'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';\n\n\t\tvar values =\t'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+\n\t\t\t\t\t\t'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+\n\t\t\t\t\t\t'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+\n\t\t\t\t\t\t'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+\n\t\t\t\t\t\t'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+\n\t\t\t\t\t\t'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+\n\t\t\t\t\t\t'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+\n\t\t\t\t\t\t'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+\n\t\t\t\t\t\t'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+\n\t\t\t\t\t\t'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+\n\t\t\t\t\t\t'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+\n\t\t\t\t\t\t'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+\n\t\t\t\t\t\t'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+\n\t\t\t\t\t\t'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';\n\n\t\tvar fonts =\t\t'[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';\n\t\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\tcss: 'comments' },\t// multiline comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\t// double quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t// single quoted strings\n\t\t\t{ regex: /\\#[a-fA-F0-9]{3,6}/g,\t\t\t\t\t\t\t\tcss: 'value' },\t\t// html colors\n\t\t\t{ regex: /(-?\\d+)(\\.\\d+)?(px|em|pt|\\:|\\%|)/g,\t\t\t\tcss: 'value' },\t\t// sizes\n\t\t\t{ regex: /!important/g,\t\t\t\t\t\t\t\t\t\tcss: 'color3' },\t// !important\n\t\t\t{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'),\t\tcss: 'keyword' },\t// keywords\n\t\t\t{ regex: new RegExp(getValuesCSS(values), 'g'),\t\t\t\tcss: 'value' },\t\t// values\n\t\t\t{ regex: new RegExp(this.getKeywords(fonts), 'g'),\t\t\tcss: 'color1' }\t\t// fonts\n\t\t\t];\n\n\t\tthis.forHtmlScript({ \n\t\t\tleft: /(&lt;|<)\\s*style.*?(&gt;|>)/gi, \n\t\t\tright: /(&lt;|<)\\/\\s*style\\s*(&gt;|>)/gi \n\t\t\t});\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['css'];\n\n\tSyntaxHighlighter.brushes.CSS = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar keywords =\t'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' +\n\t\t\t\t\t\t'case char class comp const constructor currency destructor div do double ' +\n\t\t\t\t\t\t'downto else end except exports extended false file finalization finally ' +\n\t\t\t\t\t\t'for function goto if implementation in inherited int64 initialization ' +\n\t\t\t\t\t\t'integer interface is label library longint longword mod nil not object ' +\n\t\t\t\t\t\t'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' +\n\t\t\t\t\t\t'pint64 pointer private procedure program property pshortstring pstring ' +\n\t\t\t\t\t\t'pvariant pwidechar pwidestring protected public published raise real real48 ' +\n\t\t\t\t\t\t'record repeat set shl shortint shortstring shr single smallint string then ' +\n\t\t\t\t\t\t'threadvar to true try type unit until uses val var varirnt while widechar ' +\n\t\t\t\t\t\t'widestring with word write writeln xor';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: /\\(\\*[\\s\\S]*?\\*\\)/gm,\t\t\t\t\t\t\t\tcss: 'comments' },  \t// multiline comments (* *)\n\t\t\t{ regex: /{(?!\\$)[\\s\\S]*?}/gm,\t\t\t\t\t\t\t\tcss: 'comments' },  \t// multiline comments { }\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\tcss: 'comments' },  \t// one line\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t\t// strings\n\t\t\t{ regex: /\\{\\$[a-zA-Z]+ .+\\}/g,\t\t\t\t\t\t\t\tcss: 'color1' },\t\t// compiler Directives and Region tags\n\t\t\t{ regex: /\\b[\\d\\.]+\\b/g,\t\t\t\t\t\t\t\t\tcss: 'value' },\t\t\t// numbers 12345\n\t\t\t{ regex: /\\$[a-zA-Z0-9]+\\b/g,\t\t\t\t\t\t\t\tcss: 'value' },\t\t\t// numbers $F5D3\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),\t\tcss: 'keyword' }\t\t// keyword\n\t\t\t];\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['delphi', 'pascal', 'pas'];\n\n\tSyntaxHighlighter.brushes.Delphi = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tthis.regexList = [\n\t\t\t{ regex: /^\\+\\+\\+ .*$/gm,\tcss: 'color2' },\t// new file\n\t\t\t{ regex: /^\\-\\-\\- .*$/gm,\tcss: 'color2' },\t// old file\n\t\t\t{ regex: /^\\s.*$/gm,\t\tcss: 'color1' },\t// unchanged\n\t\t\t{ regex: /^@@.*@@.*$/gm,\tcss: 'variable' },\t// location\n\t\t\t{ regex: /^\\+.*$/gm,\t\tcss: 'string' },\t// additions\n\t\t\t{ regex: /^\\-.*$/gm,\t\tcss: 'color3' }\t\t// deletions\n\t\t\t];\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['diff', 'patch'];\n\n\tSyntaxHighlighter.brushes.Diff = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by Jean-Lou Dupont\n\t\t// http://jldupont.blogspot.com/2009/06/erlang-syntax-highlighter.html  \n\n\t\t// According to: http://erlang.org/doc/reference_manual/introduction.html#1.5\n\t\tvar keywords = 'after and andalso band begin bnot bor bsl bsr bxor '+\n\t\t\t'case catch cond div end fun if let not of or orelse '+\n\t\t\t'query receive rem try when xor'+\n\t\t\t// additional\n\t\t\t' module export import define';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: new RegExp(\"[A-Z][A-Za-z0-9_]+\", 'g'), \t\t\tcss: 'constants' },\n\t\t\t{ regex: new RegExp(\"\\\\%.+\", 'gm'), \t\t\t\t\t\tcss: 'comments' },\n\t\t\t{ regex: new RegExp(\"\\\\?[A-Za-z0-9_]+\", 'g'), \t\t\t\tcss: 'preprocessor' },\n\t\t\t{ regex: new RegExp(\"[a-z0-9_]+:[a-z0-9_]+\", 'g'), \t\t\tcss: 'functions' },\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords),\t'gm'),\t\tcss: 'keyword' }\n\t\t\t];\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['erl', 'erlang'];\n\n\tSyntaxHighlighter.brushes.Erland = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by Andres Almiray\n\t\t// http://jroller.com/aalmiray/entry/nice_source_code_syntax_highlighter\n\n\t\tvar keywords =\t'as assert break case catch class continue def default do else extends finally ' +\n\t\t\t\t\t\t'if in implements import instanceof interface new package property return switch ' +\n\t\t\t\t\t\t'throw throws try while public protected private static';\n\t\tvar types    =  'void boolean byte char short int long float double';\n\t\tvar constants = 'null';\n\t\tvar methods   = 'allProperties count get size '+\n\t\t\t\t\t\t'collect each eachProperty eachPropertyName eachWithIndex find findAll ' +\n\t\t\t\t\t\t'findIndexOf grep inject max min reverseEach sort ' +\n\t\t\t\t\t\t'asImmutable asSynchronized flatten intersect join pop reverse subMap toList ' +\n\t\t\t\t\t\t'padRight padLeft contains eachMatch toCharacter toLong toUrl tokenize ' +\n\t\t\t\t\t\t'eachFile eachFileRecurse eachB yte eachLine readBytes readLine getText ' +\n\t\t\t\t\t\t'splitEachLine withReader append encodeBase64 decodeBase64 filterLine ' +\n\t\t\t\t\t\t'transformChar transformLine withOutputStream withPrintWriter withStream ' +\n\t\t\t\t\t\t'withStreams withWriter withWriterAppend write writeLine '+\n\t\t\t\t\t\t'dump inspect invokeMethod print println step times upto use waitForOrKill '+\n\t\t\t\t\t\t'getText';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\t\t\t\tcss: 'comments' },\t\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\t\t\t\tcss: 'comments' },\t\t// multiline comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\t\t\t\tcss: 'string' },\t\t// strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\t\t\t\tcss: 'string' },\t\t// strings\n\t\t\t{ regex: /\"\"\".*\"\"\"/g,\t\t\t\t\t\t\t\t\t\t\t\t\tcss: 'string' },\t\t// GStrings\n\t\t\t{ regex: new RegExp('\\\\b([\\\\d]+(\\\\.[\\\\d]+)?|0x[a-f0-9]+)\\\\b', 'gi'),\tcss: 'value' },\t\t\t// numbers\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\t\t\t\tcss: 'keyword' },\t\t// goovy keyword\n\t\t\t{ regex: new RegExp(this.getKeywords(types), 'gm'),\t\t\t\t\t\tcss: 'color1' },\t\t// goovy/java type\n\t\t\t{ regex: new RegExp(this.getKeywords(constants), 'gm'),\t\t\t\t\tcss: 'constants' },\t\t// constants\n\t\t\t{ regex: new RegExp(this.getKeywords(methods), 'gm'),\t\t\t\t\tcss: 'functions' }\t\t// methods\n\t\t\t];\n\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);\n\t}\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['groovy'];\n\n\tSyntaxHighlighter.brushes.Groovy = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar keywords =\t'abstract assert boolean break byte case catch char class const ' +\n\t\t\t\t\t\t'continue default do double else enum extends ' +\n\t\t\t\t\t\t'false final finally float for goto if implements import ' +\n\t\t\t\t\t\t'instanceof int interface long native new null ' +\n\t\t\t\t\t\t'package private protected public return ' +\n\t\t\t\t\t\t'short static strictfp super switch synchronized this throw throws true ' +\n\t\t\t\t\t\t'transient try void volatile while';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\tcss: 'comments' },\t\t// one line comments\n\t\t\t{ regex: /\\/\\*([^\\*][\\s\\S]*)?\\*\\//gm,\t\t\t\t\t\tcss: 'comments' },\t \t// multiline comments\n\t\t\t{ regex: /\\/\\*(?!\\*\\/)\\*[\\s\\S]*?\\*\\//gm,\t\t\t\t\tcss: 'preprocessor' },\t// documentation comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\t\t// strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t\t// strings\n\t\t\t{ regex: /\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b/gi,\t\t\t\tcss: 'value' },\t\t\t// numbers\n\t\t\t{ regex: /(?!\\@interface\\b)\\@[\\$\\w]+\\b/g,\t\t\t\t\tcss: 'color1' },\t\t// annotation @anno\n\t\t\t{ regex: /\\@interface\\b/g,\t\t\t\t\t\t\t\t\tcss: 'color2' },\t\t// @interface keyword\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\tcss: 'keyword' }\t\t// java keyword\n\t\t\t];\n\n\t\tthis.forHtmlScript({\n\t\t\tleft\t: /(&lt;|<)%[@!=]?/g, \n\t\t\tright\t: /%(&gt;|>)/g \n\t\t});\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['java'];\n\n\tSyntaxHighlighter.brushes.Java = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by Patrick Webster\n\t\t// http://patrickwebster.blogspot.com/2009/04/javafx-brush-for-syntaxhighlighter.html\n\t\tvar datatypes =\t'Boolean Byte Character Double Duration '\n\t\t\t\t\t\t+ 'Float Integer Long Number Short String Void'\n\t\t\t\t\t\t;\n\n\t\tvar keywords = 'abstract after and as assert at before bind bound break catch class '\n\t\t\t\t\t\t+ 'continue def delete else exclusive extends false finally first for from '\n\t\t\t\t\t\t+ 'function if import in indexof init insert instanceof into inverse last '\n\t\t\t\t\t\t+ 'lazy mixin mod nativearray new not null on or override package postinit '\n\t\t\t\t\t\t+ 'protected public public-init public-read replace return reverse sizeof '\n\t\t\t\t\t\t+ 'step super then this throw true try tween typeof var where while with '\n\t\t\t\t\t\t+ 'attribute let private readonly static trigger'\n\t\t\t\t\t\t;\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\tcss: 'comments' },\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\tcss: 'comments' },\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\n\t\t\t{ regex: /(-?\\.?)(\\b(\\d*\\.?\\d+|\\d+\\.?\\d*)(e[+-]?\\d+)?|0x[a-f\\d]+)\\b\\.?/gi, css: 'color2' },\t// numbers\n\t\t\t{ regex: new RegExp(this.getKeywords(datatypes), 'gm'),\t\tcss: 'variable' },\t// datatypes\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\tcss: 'keyword' }\n\t\t];\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['jfx', 'javafx'];\n\n\tSyntaxHighlighter.brushes.JavaFX = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar keywords =\t'break case catch continue ' +\n\t\t\t\t\t\t'default delete do else false  ' +\n\t\t\t\t\t\t'for function if in instanceof ' +\n\t\t\t\t\t\t'new null return super switch ' +\n\t\t\t\t\t\t'this throw true try typeof var while with'\n\t\t\t\t\t\t;\n\n\t\tvar r = SyntaxHighlighter.regexLib;\n\t\t\n\t\tthis.regexList = [\n\t\t\t{ regex: r.multiLineDoubleQuotedString,\t\t\t\t\tcss: 'string' },\t\t\t// double quoted strings\n\t\t\t{ regex: r.multiLineSingleQuotedString,\t\t\t\t\tcss: 'string' },\t\t\t// single quoted strings\n\t\t\t{ regex: r.singleLineCComments,\t\t\t\t\t\t\tcss: 'comments' },\t\t\t// one line comments\n\t\t\t{ regex: r.multiLineCComments,\t\t\t\t\t\t\tcss: 'comments' },\t\t\t// multiline comments\n\t\t\t{ regex: /\\s*#.*/gm,\t\t\t\t\t\t\t\t\tcss: 'preprocessor' },\t\t// preprocessor tags like #region and #endregion\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\tcss: 'keyword' }\t\t\t// keywords\n\t\t\t];\n\t\n\t\tthis.forHtmlScript(r.scriptScriptTags);\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['js', 'jscript', 'javascript'];\n\n\tSyntaxHighlighter.brushes.JScript = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by David Simmons-Duffin and Marty Kube\n\t\n\t\tvar funcs = \n\t\t\t'abs accept alarm atan2 bind binmode chdir chmod chomp chop chown chr ' + \n\t\t\t'chroot close closedir connect cos crypt defined delete each endgrent ' + \n\t\t\t'endhostent endnetent endprotoent endpwent endservent eof exec exists ' + \n\t\t\t'exp fcntl fileno flock fork format formline getc getgrent getgrgid ' + \n\t\t\t'getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr ' + \n\t\t\t'getnetbyname getnetent getpeername getpgrp getppid getpriority ' + \n\t\t\t'getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid ' + \n\t\t\t'getservbyname getservbyport getservent getsockname getsockopt glob ' + \n\t\t\t'gmtime grep hex index int ioctl join keys kill lc lcfirst length link ' + \n\t\t\t'listen localtime lock log lstat map mkdir msgctl msgget msgrcv msgsnd ' + \n\t\t\t'oct open opendir ord pack pipe pop pos print printf prototype push ' + \n\t\t\t'quotemeta rand read readdir readline readlink readpipe recv rename ' + \n\t\t\t'reset reverse rewinddir rindex rmdir scalar seek seekdir select semctl ' + \n\t\t\t'semget semop send setgrent sethostent setnetent setpgrp setpriority ' + \n\t\t\t'setprotoent setpwent setservent setsockopt shift shmctl shmget shmread ' + \n\t\t\t'shmwrite shutdown sin sleep socket socketpair sort splice split sprintf ' + \n\t\t\t'sqrt srand stat study substr symlink syscall sysopen sysread sysseek ' + \n\t\t\t'system syswrite tell telldir time times tr truncate uc ucfirst umask ' + \n\t\t\t'undef unlink unpack unshift utime values vec wait waitpid warn write ' +\n\t\t\t// feature\n\t\t\t'say';\n    \n\t\tvar keywords =  \n\t\t\t'bless caller continue dbmclose dbmopen die do dump else elsif eval exit ' +\n\t\t\t'for foreach goto if import last local my next no our package redo ref ' + \n\t\t\t'require return sub tie tied unless untie until use wantarray while ' +\n\t\t\t// feature\n\t\t\t'given when default ' +\n\t\t\t// Try::Tiny\n\t\t\t'try catch finally ' +\n\t\t\t// Moose\n\t\t\t'has extends with before after around override augment';\n    \n\t\tthis.regexList = [\n\t\t\t{ regex: /(<<|&lt;&lt;)((\\w+)|(['\"])(.+?)\\4)[\\s\\S]+?\\n\\3\\5\\n/g,\tcss: 'string' },\t// here doc (maybe html encoded)\n\t\t\t{ regex: /#.*$/gm,\t\t\t\t\t\t\t\t\t\tcss: 'comments' },\n\t\t\t{ regex: /^#!.*\\n/g,\t\t\t\t\t\t\t\t\tcss: 'preprocessor' },\t// shebang\n\t\t\t{ regex: /-?\\w+(?=\\s*=(>|&gt;))/g,\tcss: 'string' }, // fat comma\n\n\t\t\t// is this too much?\n\t\t\t{ regex: /\\bq[qwxr]?\\([\\s\\S]*?\\)/g,\tcss: 'string' }, // quote-like operators ()\n\t\t\t{ regex: /\\bq[qwxr]?\\{[\\s\\S]*?\\}/g,\tcss: 'string' }, // quote-like operators {}\n\t\t\t{ regex: /\\bq[qwxr]?\\[[\\s\\S]*?\\]/g,\tcss: 'string' }, // quote-like operators []\n\t\t\t{ regex: /\\bq[qwxr]?(<|&lt;)[\\s\\S]*?(>|&gt;)/g,\tcss: 'string' }, // quote-like operators <>\n\t\t\t{ regex: /\\bq[qwxr]?([^\\w({<[])[\\s\\S]*?\\1/g,\tcss: 'string' }, // quote-like operators non-paired\n\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\tcss: 'string' },\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\tcss: 'string' },\n\t\t\t// currently ignoring single quote package separator and utf8 names\n\t\t\t{ regex: /(?:&amp;|[$@%*]|\\$#)[a-zA-Z_](\\w+|::)*/g,   \t\tcss: 'variable' },\n\t\t\t{ regex: /\\b__(?:END|DATA)__\\b[\\s\\S]*$/g,\t\t\t\tcss: 'comments' },\n\t\t\t{ regex: /(^|\\n)=\\w[\\s\\S]*?(\\n=cut\\s*\\n|$)/g,\t\t\t\tcss: 'comments' },\t\t// pod\n\t\t\t{ regex: new RegExp(this.getKeywords(funcs), 'gm'),\t\tcss: 'functions' },\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\tcss: 'keyword' }\n\t\t];\n\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);\n\t}\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t\t= ['perl', 'Perl', 'pl'];\n\n\tSyntaxHighlighter.brushes.Perl = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar funcs\t=\t'abs acos acosh addcslashes addslashes ' +\n\t\t\t\t\t\t'array_change_key_case array_chunk array_combine array_count_values array_diff '+\n\t\t\t\t\t\t'array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill '+\n\t\t\t\t\t\t'array_filter array_flip array_intersect array_intersect_assoc array_intersect_key '+\n\t\t\t\t\t\t'array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map '+\n\t\t\t\t\t\t'array_merge array_merge_recursive array_multisort array_pad array_pop array_product '+\n\t\t\t\t\t\t'array_push array_rand array_reduce array_reverse array_search array_shift '+\n\t\t\t\t\t\t'array_slice array_splice array_sum array_udiff array_udiff_assoc '+\n\t\t\t\t\t\t'array_udiff_uassoc array_uintersect array_uintersect_assoc '+\n\t\t\t\t\t\t'array_uintersect_uassoc array_unique array_unshift array_values array_walk '+\n\t\t\t\t\t\t'array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert '+\n\t\t\t\t\t\t'basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress '+\n\t\t\t\t\t\t'bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir '+\n\t\t\t\t\t\t'checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists '+\n\t\t\t\t\t\t'closedir closelog copy cos cosh count count_chars date decbin dechex decoct '+\n\t\t\t\t\t\t'deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log '+\n\t\t\t\t\t\t'error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded '+\n\t\t\t\t\t\t'feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents '+\n\t\t\t\t\t\t'fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype '+\n\t\t\t\t\t\t'floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf '+\n\t\t\t\t\t\t'fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname '+\n\t\t\t\t\t\t'gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt '+\n\t\t\t\t\t\t'getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext '+\n\t\t\t\t\t\t'gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set '+\n\t\t\t\t\t\t'interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double '+\n\t\t\t\t\t\t'is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long '+\n\t\t\t\t\t\t'is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault '+\n\t\t\t\t\t\t'is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br '+\n\t\t\t\t\t\t'parse_ini_file parse_str parse_url passthru pathinfo print readlink realpath rewind rewinddir rmdir '+\n\t\t\t\t\t\t'round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split '+\n\t\t\t\t\t\t'str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes '+\n\t\t\t\t\t\t'stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk '+\n\t\t\t\t\t\t'strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime '+\n\t\t\t\t\t\t'strtoupper strtr strval substr substr_compare';\n\n\t\tvar keywords =\t'abstract and array as break case catch cfunction class clone const continue declare default die do ' +\n\t\t\t\t\t\t'else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach ' +\n\t\t\t\t\t\t'function global goto if implements include include_once interface instanceof insteadof namespace new ' +\n\t\t\t\t\t\t'old_function or private protected public return require require_once static switch ' +\n\t\t\t\t\t\t'trait throw try use var while xor ';\n\t\t\n\t\tvar constants\t= '__FILE__ __LINE__ __METHOD__ __FUNCTION__ __CLASS__';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\tcss: 'comments' },\t\t\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\tcss: 'comments' },\t\t\t// multiline comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\t\t\t// double quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t\t\t// single quoted strings\n\t\t\t{ regex: /\\$\\w+/g,\t\t\t\t\t\t\t\t\t\t\tcss: 'variable' },\t\t\t// variables\n\t\t\t{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),\t\tcss: 'functions' },\t\t\t// common functions\n\t\t\t{ regex: new RegExp(this.getKeywords(constants), 'gmi'),\tcss: 'constants' },\t\t\t// constants\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\tcss: 'keyword' }\t\t\t// keyword\n\t\t\t];\n\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['php'];\n\n\tSyntaxHighlighter.brushes.Php = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['text', 'plain'];\n\n\tSyntaxHighlighter.brushes.Plain = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by Joel 'Jaykul' Bennett, http://PoshCode.org | http://HuddledMasses.org\n\t\tvar keywords =\t'while validateset validaterange validatepattern validatelength validatecount ' +\n\t\t\t\t\t\t'until trap switch return ref process param parameter in if global: '+\n\t\t\t\t\t\t'function foreach for finally filter end elseif else dynamicparam do default ' +\n\t\t\t\t\t\t'continue cmdletbinding break begin alias \\\\? % #script #private #local #global '+\n\t\t\t\t\t\t'mandatory parametersetname position valuefrompipeline ' +\n\t\t\t\t\t\t'valuefrompipelinebypropertyname valuefromremainingarguments helpmessage ';\n\n\t\tvar operators =\t' and as band bnot bor bxor casesensitive ccontains ceq cge cgt cle ' +\n\t\t\t\t\t\t'clike clt cmatch cne cnotcontains cnotlike cnotmatch contains ' +\n\t\t\t\t\t\t'creplace eq exact f file ge gt icontains ieq ige igt ile ilike ilt ' +\n\t\t\t\t\t\t'imatch ine inotcontains inotlike inotmatch ireplace is isnot le like ' +\n\t\t\t\t\t\t'lt match ne not notcontains notlike notmatch or regex replace wildcard';\n\t\t\t\t\t\t\n\t\tvar verbs =\t\t'write where wait use update unregister undo trace test tee take suspend ' +\n\t\t\t\t\t\t'stop start split sort skip show set send select scroll resume restore ' +\n\t\t\t\t\t\t'restart resolve resize reset rename remove register receive read push ' +\n\t\t\t\t\t\t'pop ping out new move measure limit join invoke import group get format ' +\n\t\t\t\t\t\t'foreach export expand exit enter enable disconnect disable debug cxnew ' +\n\t\t\t\t\t\t'copy convertto convertfrom convert connect complete compare clear ' +\n\t\t\t\t\t\t'checkpoint aggregate add';\n\n\t\t// I can't find a way to match the comment based help in multi-line comments, because SH won't highlight in highlights, and javascript doesn't support lookbehind\n\t\tvar commenthelp = ' component description example externalhelp forwardhelpcategory forwardhelptargetname forwardhelptargetname functionality inputs link notes outputs parameter remotehelprunspace role synopsis';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: new RegExp('^\\\\s*#[#\\\\s]*\\\\.('+this.getKeywords(commenthelp)+').*$', 'gim'),\t\t\tcss: 'preprocessor help bold' },\t\t// comment-based help\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,\t\t\t\t\t\t\t\t\t\tcss: 'comments' },\t\t\t\t\t\t// one line comments\n\t\t\t{ regex: /(&lt;|<)#[\\s\\S]*?#(&gt;|>)/gm,\t\t\t\t\t\t\t\t\t\t\t\t\t\tcss: 'comments here' },\t\t\t\t\t// multi-line comments\n\t\t\t\n\t\t\t{ regex: new RegExp('@\"\\\\n[\\\\s\\\\S]*?\\\\n\"@', 'gm'),\t\t\t\t\t\t\t\t\t\t\t\tcss: 'script string here' },\t\t\t// double quoted here-strings\n\t\t\t{ regex: new RegExp(\"@'\\\\n[\\\\s\\\\S]*?\\\\n'@\", 'gm'),\t\t\t\t\t\t\t\t\t\t\t\tcss: 'script string single here' },\t\t// single quoted here-strings\n\t\t\t{ regex: new RegExp('\"(?:\\\\$\\\\([^\\\\)]*\\\\)|[^\"]|`\"|\"\")*[^`]\"','g'),\t\t\t\t\t\t\t\tcss: 'string' },\t\t\t\t\t\t// double quoted strings\n\t\t\t{ regex: new RegExp(\"'(?:[^']|'')*'\", 'g'),\t\t\t\t\t\t\t\t\t\t\t\t\t\tcss: 'string single' },\t\t\t\t\t// single quoted strings\n\t\t\t\n\t\t\t{ regex: new RegExp('[\\\\$|@|@@](?:(?:global|script|private|env):)?[A-Z0-9_]+', 'gi'),\t\t\tcss: 'variable' },\t\t\t\t\t\t// $variables\n\t\t\t{ regex: new RegExp('(?:\\\\b'+verbs.replace(/ /g, '\\\\b|\\\\b')+')-[a-zA-Z_][a-zA-Z0-9_]*', 'gmi'),\tcss: 'functions' },\t\t\t\t\t\t// functions and cmdlets\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),\t\t\t\t\t\t\t\t\t\t\tcss: 'keyword' },\t\t\t\t\t\t// keywords\n\t\t\t{ regex: new RegExp('-'+this.getKeywords(operators), 'gmi'),\t\t\t\t\t\t\t\t\tcss: 'operator value' },\t\t\t\t// operators\n\t\t\t{ regex: new RegExp('\\\\[[A-Z_\\\\[][A-Z0-9_. `,\\\\[\\\\]]*\\\\]', 'gi'),\t\t\t\t\t\t\t\tcss: 'constants' },\t\t\t\t\t\t// .Net [Type]s\n\t\t\t{ regex: new RegExp('\\\\s+-(?!'+this.getKeywords(operators)+')[a-zA-Z_][a-zA-Z0-9_]*', 'gmi'),\tcss: 'color1' },\t\t\t\t\t\t// parameters\t  \n\t\t];\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['powershell', 'ps', 'posh'];\n\n\tSyntaxHighlighter.brushes.PowerShell = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by Gheorghe Milas and Ahmad Sherif\n\t\n\t\tvar keywords =  'and assert break class continue def del elif else ' +\n\t\t\t\t\t\t'except exec finally for from global if import in is ' +\n\t\t\t\t\t\t'lambda not or pass print raise return try yield while';\n\n\t\tvar funcs = '__import__ abs all any apply basestring bin bool buffer callable ' +\n\t\t\t\t\t'chr classmethod cmp coerce compile complex delattr dict dir ' +\n\t\t\t\t\t'divmod enumerate eval execfile file filter float format frozenset ' +\n\t\t\t\t\t'getattr globals hasattr hash help hex id input int intern ' +\n\t\t\t\t\t'isinstance issubclass iter len list locals long map max min next ' +\n\t\t\t\t\t'object oct open ord pow print property range raw_input reduce ' +\n\t\t\t\t\t'reload repr reversed round set setattr slice sorted staticmethod ' +\n\t\t\t\t\t'str sum super tuple type type unichr unicode vars xrange zip';\n\n\t\tvar special =  'None True False self cls class_';\n\n\t\tthis.regexList = [\n\t\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' },\n\t\t\t\t{ regex: /^\\s*@\\w+/gm, \t\t\t\t\t\t\t\t\t\tcss: 'decorator' },\n\t\t\t\t{ regex: /(['\\\"]{3})([^\\1])*?\\1/gm, \t\t\t\t\t\tcss: 'comments' },\n\t\t\t\t{ regex: /\"(?!\")(?:\\.|\\\\\\\"|[^\\\"\"\\n])*\"/gm, \t\t\t\t\tcss: 'string' },\n\t\t\t\t{ regex: /'(?!')(?:\\.|(\\\\\\')|[^\\''\\n])*'/gm, \t\t\t\tcss: 'string' },\n\t\t\t\t{ regex: /\\+|\\-|\\*|\\/|\\%|=|==/gm, \t\t\t\t\t\t\tcss: 'keyword' },\n\t\t\t\t{ regex: /\\b\\d+\\.?\\w*/g, \t\t\t\t\t\t\t\t\tcss: 'value' },\n\t\t\t\t{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),\t\tcss: 'functions' },\n\t\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'), \t\tcss: 'keyword' },\n\t\t\t\t{ regex: new RegExp(this.getKeywords(special), 'gm'), \t\tcss: 'color1' }\n\t\t\t\t];\n\t\t\t\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['py', 'python'];\n\n\tSyntaxHighlighter.brushes.Python = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by Erik Peterson.\n\t\n\t\tvar keywords =\t'alias and BEGIN begin break case class def define_method defined do each else elsif ' +\n\t\t\t\t\t\t'END end ensure false for if in module new next nil not or raise redo rescue retry return ' +\n\t\t\t\t\t\t'self super then throw true undef unless until when while yield';\n\n\t\tvar builtins =\t'Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload ' +\n\t\t\t\t\t\t'Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol ' +\n\t\t\t\t\t\t'ThreadGroup Thread Time TrueClass';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,\tcss: 'comments' },\t\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\t\tcss: 'string' },\t\t// double quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\tcss: 'string' },\t\t// single quoted strings\n\t\t\t{ regex: /\\b[A-Z0-9_]+\\b/g,\t\t\t\t\t\t\t\t\tcss: 'constants' },\t\t// constants\n\t\t\t{ regex: /:[a-z][A-Za-z0-9_]*/g,\t\t\t\t\t\t\tcss: 'color2' },\t\t// symbols\n\t\t\t{ regex: /(\\$|@@|@)\\w+/g,\t\t\t\t\t\t\t\t\tcss: 'variable bold' },\t// $global, @instance, and @@class variables\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\tcss: 'keyword' },\t\t// keywords\n\t\t\t{ regex: new RegExp(this.getKeywords(builtins), 'gm'),\t\tcss: 'color1' }\t\t\t// builtins\n\t\t\t];\n\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['ruby', 'rails', 'ror', 'rb'];\n\n\tSyntaxHighlighter.brushes.Ruby = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tfunction getKeywordsCSS(str)\n\t\t{\n\t\t\treturn '\\\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\\\b|\\\\b([a-z_\\\\*]|\\\\*|)') + '(?=:)\\\\b';\n\t\t};\n\t\n\t\tfunction getValuesCSS(str)\n\t\t{\n\t\t\treturn '\\\\b' + str.replace(/ /g, '(?!-)(?!:)\\\\b|\\\\b()') + '\\:\\\\b';\n\t\t};\n\n\t\tvar keywords =\t'ascent azimuth background-attachment background-color background-image background-position ' +\n\t\t\t\t\t\t'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +\n\t\t\t\t\t\t'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +\n\t\t\t\t\t\t'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +\n\t\t\t\t\t\t'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +\n\t\t\t\t\t\t'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +\n\t\t\t\t\t\t'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +\n\t\t\t\t\t\t'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +\n\t\t\t\t\t\t'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +\n\t\t\t\t\t\t'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +\n\t\t\t\t\t\t'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +\n\t\t\t\t\t\t'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +\n\t\t\t\t\t\t'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +\n\t\t\t\t\t\t'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';\n\t\t\n\t\tvar values =\t'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+\n\t\t\t\t\t\t'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+\n\t\t\t\t\t\t'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero digits disc dotted double '+\n\t\t\t\t\t\t'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+\n\t\t\t\t\t\t'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+\n\t\t\t\t\t\t'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+\n\t\t\t\t\t\t'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+\n\t\t\t\t\t\t'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+\n\t\t\t\t\t\t'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+\n\t\t\t\t\t\t'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+\n\t\t\t\t\t\t'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+\n\t\t\t\t\t\t'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+\n\t\t\t\t\t\t'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+\n\t\t\t\t\t\t'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';\n\t\t\n\t\tvar fonts =\t\t'[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';\n\t\t\n\t\tvar statements\t\t= '!important !default';\n\t\tvar preprocessor\t= '@import @extend @debug @warn @if @for @while @mixin @include';\n\t\t\n\t\tvar r = SyntaxHighlighter.regexLib;\n\t\t\n\t\tthis.regexList = [\n\t\t\t{ regex: r.multiLineCComments,\t\t\t\t\t\t\t\tcss: 'comments' },\t\t// multiline comments\n\t\t\t{ regex: r.singleLineCComments,\t\t\t\t\t\t\t\tcss: 'comments' },\t\t// singleline comments\n\t\t\t{ regex: r.doubleQuotedString,\t\t\t\t\t\t\t\tcss: 'string' },\t\t// double quoted strings\n\t\t\t{ regex: r.singleQuotedString,\t\t\t\t\t\t\t\tcss: 'string' },\t\t// single quoted strings\n\t\t\t{ regex: /\\#[a-fA-F0-9]{3,6}/g,\t\t\t\t\t\t\t\tcss: 'value' },\t\t\t// html colors\n\t\t\t{ regex: /\\b(-?\\d+)(\\.\\d+)?(px|em|pt|\\:|\\%|)\\b/g,\t\t\tcss: 'value' },\t\t\t// sizes\n\t\t\t{ regex: /\\$\\w+/g,\t\t\t\t\t\t\t\t\t\t\tcss: 'variable' },\t\t// variables\n\t\t\t{ regex: new RegExp(this.getKeywords(statements), 'g'),\t\tcss: 'color3' },\t\t// statements\n\t\t\t{ regex: new RegExp(this.getKeywords(preprocessor), 'g'),\tcss: 'preprocessor' },\t// preprocessor\n\t\t\t{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'),\t\tcss: 'keyword' },\t\t// keywords\n\t\t\t{ regex: new RegExp(getValuesCSS(values), 'g'),\t\t\t\tcss: 'value' },\t\t\t// values\n\t\t\t{ regex: new RegExp(this.getKeywords(fonts), 'g'),\t\t\tcss: 'color1' }\t\t\t// fonts\n\t\t\t];\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['sass', 'scss'];\n\n\tSyntaxHighlighter.brushes.Sass = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\t// Contributed by Yegor Jbanov and David Bernard.\n\t\n\t\tvar keywords =\t'val sealed case def true trait implicit forSome import match object null finally super ' +\n\t\t\t\t\t\t'override try lazy for var catch throw type extends class while with new final yield abstract ' +\n\t\t\t\t\t\t'else do if return protected private this package false';\n\n\t\tvar keyops =\t'[_:=><%#@]+';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleLineCComments,\t\t\tcss: 'comments' },\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineCComments,\t\t\t\tcss: 'comments' },\t// multiline comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString,\tcss: 'string' },\t// multi-line strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString,    css: 'string' },\t// double-quoted string\n\t\t\t{ regex: SyntaxHighlighter.regexLib.singleQuotedString,\t\t\t\tcss: 'string' },\t// strings\n\t\t\t{ regex: /0x[a-f0-9]+|\\d+(\\.\\d+)?/gi,\t\t\t\t\t\t\t\tcss: 'value' },\t\t// numbers\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\t\t\t\tcss: 'keyword' },\t// keywords\n\t\t\t{ regex: new RegExp(keyops, 'gm'),\t\t\t\t\t\t\t\t\tcss: 'keyword' }\t// scala keyword\n\t\t\t];\n\t}\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['scala'];\n\n\tSyntaxHighlighter.brushes.Scala = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar funcs\t=\t'abs avg case cast coalesce convert count current_timestamp ' +\n\t\t\t\t\t\t'current_user day isnull left lower month nullif replace right ' +\n\t\t\t\t\t\t'session_user space substring sum system_user upper user year';\n\n\t\tvar keywords =\t'absolute action add after alter as asc at authorization begin bigint ' +\n\t\t\t\t\t\t'binary bit by cascade char character check checkpoint close collate ' +\n\t\t\t\t\t\t'column commit committed connect connection constraint contains continue ' +\n\t\t\t\t\t\t'create cube current current_date current_time cursor database date ' +\n\t\t\t\t\t\t'deallocate dec decimal declare default delete desc distinct double drop ' +\n\t\t\t\t\t\t'dynamic else end end-exec escape except exec execute false fetch first ' +\n\t\t\t\t\t\t'float for force foreign forward free from full function global goto grant ' +\n\t\t\t\t\t\t'group grouping having hour ignore index inner insensitive insert instead ' +\n\t\t\t\t\t\t'int integer intersect into is isolation key last level load local max min ' +\n\t\t\t\t\t\t'minute modify move name national nchar next no numeric of off on only ' +\n\t\t\t\t\t\t'open option order out output partial password precision prepare primary ' +\n\t\t\t\t\t\t'prior privileges procedure public read real references relative repeatable ' +\n\t\t\t\t\t\t'restrict return returns revoke rollback rollup rows rule schema scroll ' +\n\t\t\t\t\t\t'second section select sequence serializable set size smallint static ' +\n\t\t\t\t\t\t'statistics table temp temporary then time timestamp to top transaction ' +\n\t\t\t\t\t\t'translation trigger true truncate uncommitted union unique update values ' +\n\t\t\t\t\t\t'varchar varying view when where with work';\n\n\t\tvar operators =\t'all and any between cross in join like not null or outer some';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: /--(.*)$/gm,\t\t\t\t\t\t\t\t\t\t\t\tcss: 'comments' },\t\t\t// one line and multiline comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString,\tcss: 'string' },\t\t\t// double quoted strings\n\t\t\t{ regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString,\tcss: 'string' },\t\t\t// single quoted strings\n\t\t\t{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),\t\t\t\tcss: 'color2' },\t\t\t// functions\n\t\t\t{ regex: new RegExp(this.getKeywords(operators), 'gmi'),\t\t\tcss: 'color1' },\t\t\t// operators and such\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),\t\t\t\tcss: 'keyword' }\t\t\t// keyword\n\t\t\t];\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['sql'];\n\n\tSyntaxHighlighter.brushes.Sql = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tvar keywords =\t'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' +\n\t\t\t\t\t\t'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' +\n\t\t\t\t\t\t'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' +\n\t\t\t\t\t\t'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' +\n\t\t\t\t\t\t'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' +\n\t\t\t\t\t\t'Function Get GetType GoSub GoTo Handles If Implements Imports In ' +\n\t\t\t\t\t\t'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' +\n\t\t\t\t\t\t'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' +\n\t\t\t\t\t\t'NotInheritable NotOverridable Object On Option Optional Or OrElse ' +\n\t\t\t\t\t\t'Overloads Overridable Overrides ParamArray Preserve Private Property ' +\n\t\t\t\t\t\t'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' +\n\t\t\t\t\t\t'Return Select Set Shadows Shared Short Single Static Step Stop String ' +\n\t\t\t\t\t\t'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' +\n\t\t\t\t\t\t'Variant When While With WithEvents WriteOnly Xor';\n\n\t\tthis.regexList = [\n\t\t\t{ regex: /'.*$/gm,\t\t\t\t\t\t\t\t\t\tcss: 'comments' },\t\t\t// one line comments\n\t\t\t{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,\tcss: 'string' },\t\t\t// strings\n\t\t\t{ regex: /^\\s*#.*$/gm,\t\t\t\t\t\t\t\t\tcss: 'preprocessor' },\t\t// preprocessor tags like #region and #endregion\n\t\t\t{ regex: new RegExp(this.getKeywords(keywords), 'gm'),\tcss: 'keyword' }\t\t\t// vb keyword\n\t\t\t];\n\n\t\tthis.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['vb', 'vbnet'];\n\n\tSyntaxHighlighter.brushes.Vb = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n;(function()\n{\n\t// CommonJS\n\tSyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);\n\n\tfunction Brush()\n\t{\n\t\tfunction process(match, regexInfo)\n\t\t{\n\t\t\tvar constructor = SyntaxHighlighter.Match,\n\t\t\t\tcode = match[0],\n\t\t\t\ttag = new XRegExp('(&lt;|<)[\\\\s\\\\/\\\\?]*(?<name>[:\\\\w-\\\\.]+)', 'xg').exec(code),\n\t\t\t\tresult = []\n\t\t\t\t;\n\t\t\n\t\t\tif (match.attributes != null) \n\t\t\t{\n\t\t\t\tvar attributes,\n\t\t\t\t\tregex = new XRegExp('(?<name> [\\\\w:\\\\-\\\\.]+)' +\n\t\t\t\t\t\t\t\t\t\t'\\\\s*=\\\\s*' +\n\t\t\t\t\t\t\t\t\t\t'(?<value> \".*?\"|\\'.*?\\'|\\\\w+)',\n\t\t\t\t\t\t\t\t\t\t'xg');\n\n\t\t\t\twhile ((attributes = regex.exec(code)) != null) \n\t\t\t\t{\n\t\t\t\t\tresult.push(new constructor(attributes.name, match.index + attributes.index, 'color1'));\n\t\t\t\t\tresult.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string'));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tag != null)\n\t\t\t\tresult.push(\n\t\t\t\t\tnew constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword')\n\t\t\t\t);\n\n\t\t\treturn result;\n\t\t}\n\t\n\t\tthis.regexList = [\n\t\t\t{ regex: new XRegExp('(\\\\&lt;|<)\\\\!\\\\[[\\\\w\\\\s]*?\\\\[(.|\\\\s)*?\\\\]\\\\](\\\\&gt;|>)', 'gm'),\t\t\tcss: 'color2' },\t// <![ ... [ ... ]]>\n\t\t\t{ regex: SyntaxHighlighter.regexLib.xmlComments,\t\t\t\t\t\t\t\t\t\t\t\tcss: 'comments' },\t// <!-- ... -->\n\t\t\t{ regex: new XRegExp('(&lt;|<)[\\\\s\\\\/\\\\?]*(\\\\w+)(?<attributes>.*?)[\\\\s\\\\/\\\\?]*(&gt;|>)', 'sg'), func: process }\n\t\t];\n\t};\n\n\tBrush.prototype\t= new SyntaxHighlighter.Highlighter();\n\tBrush.aliases\t= ['xml', 'xhtml', 'xslt', 'html'];\n\n\tSyntaxHighlighter.brushes.Xml = Brush;\n\n\t// CommonJS\n\ttypeof(exports) != 'undefined' ? exports.Brush = Brush : null;\n})();\n"
  },
  {
    "path": "static/common/user/uedit/third-party/SyntaxHighlighter/shCoreDefault.css",
    "content": ".syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter,.syntaxhighlighter td,.syntaxhighlighter tr,.syntaxhighlighter tbody,.syntaxhighlighter thead,.syntaxhighlighter caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0!important;-webkit-border-radius:0 0 0 0!important;background:none!important;border:0!important;bottom:auto!important;float:none!important;left:auto!important;line-height:1.1em!important;margin:0!important;outline:0!important;overflow:visible!important;padding:0!important;position:static!important;right:auto!important;text-align:left!important;top:auto!important;vertical-align:baseline!important;width:auto!important;box-sizing:content-box!important;font-family:Monaco,Menlo,Consolas,\"Courier New\",monospace;font-weight:normal!important;font-style:normal!important;min-height:inherit!important;min-height:auto!important;font-size:13px!important}.syntaxhighlighter{width:100%!important;margin:.3em 0 .3em 0!important;position:relative!important;overflow:auto!important;background-color:#f5f5f5!important;border:1px solid #ccc!important;border-radius:4px!important;border-collapse:separate!important}.syntaxhighlighter.source{overflow:hidden!important}.syntaxhighlighter .bold{font-weight:bold!important}.syntaxhighlighter .italic{font-style:italic!important}.syntaxhighlighter .gutter div{white-space:pre!important;word-wrap:normal}.syntaxhighlighter caption{text-align:left!important;padding:.5em 0 .5em 1em!important}.syntaxhighlighter td.code{width:100%!important}.syntaxhighlighter td.code .container{position:relative!important}.syntaxhighlighter td.code .container textarea{box-sizing:border-box!important;position:absolute!important;left:0!important;top:0!important;width:100%!important;border:none!important;background:white!important;padding-left:1em!important;overflow:hidden!important;white-space:pre!important}.syntaxhighlighter td.gutter .line{text-align:right!important;padding:0 .5em 0 1em!important}.syntaxhighlighter td.code .line{padding:0 1em!important}.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0!important}.syntaxhighlighter.show{display:block!important}.syntaxhighlighter.collapsed table{display:none!important}.syntaxhighlighter.collapsed .toolbar{padding:.1em .8em 0 .8em!important;font-size:1em!important;position:static!important;width:auto!important}.syntaxhighlighter.collapsed .toolbar span{display:inline!important;margin-right:1em!important}.syntaxhighlighter.collapsed .toolbar span a{padding:0!important;display:none!important}.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline!important}.syntaxhighlighter .toolbar{position:absolute!important;right:1px!important;top:1px!important;width:11px!important;height:11px!important;font-size:10px!important;z-index:10!important}.syntaxhighlighter .toolbar span.title{display:inline!important}.syntaxhighlighter .toolbar a{display:block!important;text-align:center!important;text-decoration:none!important;padding-top:1px!important}.syntaxhighlighter .toolbar a.expandSource{display:none!important}.syntaxhighlighter.ie{font-size:.9em!important;padding:1px 0 1px 0!important}.syntaxhighlighter.ie .toolbar{line-height:8px!important}.syntaxhighlighter.ie .toolbar a{padding-top:0!important}.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none!important}.syntaxhighlighter.printing .line .number{color:#bbb!important}.syntaxhighlighter.printing .line .content{color:black!important}.syntaxhighlighter.printing .toolbar{display:none!important}.syntaxhighlighter.printing a{text-decoration:none!important}.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black!important}.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200!important}.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue!important}.syntaxhighlighter.printing .keyword{color:#ff7800!important;font-weight:bold!important}.syntaxhighlighter.printing .preprocessor{color:gray!important}.syntaxhighlighter.printing .variable{color:#a70!important}.syntaxhighlighter.printing .value{color:#090!important}.syntaxhighlighter.printing .functions{color:#ff1493!important}.syntaxhighlighter.printing .constants{color:#06c!important}.syntaxhighlighter.printing .script{font-weight:bold!important}.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray!important}.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493!important}.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red!important}.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black!important}.syntaxhighlighter{background-color:#f5f5f5!important}.syntaxhighlighter .line.highlighted.number{color:black!important}.syntaxhighlighter caption{color:black!important}.syntaxhighlighter .gutter{color:#afafaf!important;background-color:#f7f7f9!important;border-right:1px solid #e1e1e8!important;padding:9.5px 0 9.5px 9.5px!important;border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;user-select:none!important;-moz-user-select:none!important;-webkit-user-select:none!important}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important}.syntaxhighlighter.printing .line .content{border:none!important}.syntaxhighlighter.collapsed{overflow:visible!important}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important}.syntaxhighlighter.collapsed .toolbar a{color:blue!important}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important}.syntaxhighlighter .toolbar a{color:white!important}.syntaxhighlighter .toolbar a:hover{color:black!important}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important}.syntaxhighlighter .keyword{color:#ff7800!important}.syntaxhighlighter .preprocessor{color:gray!important}.syntaxhighlighter .variable{color:#a70!important}.syntaxhighlighter .value{color:#090!important}.syntaxhighlighter .functions{color:#ff1493!important}.syntaxhighlighter .constants{color:#06c!important}.syntaxhighlighter .script{font-weight:bold!important;color:#ff7800!important;background-color:none!important}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important}.syntaxhighlighter .keyword{font-weight:bold!important}"
  },
  {
    "path": "static/common/user/uedit/third-party/codemirror/codemirror.css",
    "content": ".CodeMirror {\n    line-height: 1em;\n    font-family: monospace;\n}\n\n.CodeMirror-scroll {\n    overflow: auto;\n    height: 300px;\n    /* This is needed to prevent an IE[67] bug where the scrolled content\n       is visible outside of the scrolling box. */\n    position: relative;\n}\n\n.CodeMirror-gutter {\n    position: absolute; left: 0; top: 0;\n    z-index: 10;\n    background-color: #f7f7f7;\n    border-right: 1px solid #eee;\n    min-width: 2em;\n    height: 100%;\n}\n.CodeMirror-gutter-text {\n    color: #aaa;\n    text-align: right;\n    padding: .4em .2em .4em .4em;\n    white-space: pre !important;\n}\n.CodeMirror-lines {\n    padding: .4em;\n}\n\n.CodeMirror pre {\n    -moz-border-radius: 0;\n    -webkit-border-radius: 0;\n    -o-border-radius: 0;\n    border-radius: 0;\n    border-width: 0; margin: 0; padding: 0; background: transparent;\n    font-family: inherit;\n    font-size: inherit;\n    padding: 0; margin: 0;\n    white-space: pre;\n    word-wrap: normal;\n}\n\n.CodeMirror-wrap pre {\n    word-wrap: break-word;\n    white-space: pre-wrap;\n}\n.CodeMirror-wrap .CodeMirror-scroll {\n    overflow-x: hidden;\n}\n\n.CodeMirror textarea {\n    outline: none !important;\n}\n\n.CodeMirror pre.CodeMirror-cursor {\n    z-index: 10;\n    position: absolute;\n    visibility: hidden;\n    border-left: 1px solid black;\n}\n.CodeMirror-focused pre.CodeMirror-cursor {\n    visibility: visible;\n}\n\nspan.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused span.CodeMirror-selected { background: #d2dcf8; }\n\n.CodeMirror-searching {background: #ffa;}\n\n/* Default theme */\n\n.cm-s-default span.cm-keyword {color: #708;}\n.cm-s-default span.cm-atom {color: #219;}\n.cm-s-default span.cm-number {color: #164;}\n.cm-s-default span.cm-def {color: #00f;}\n.cm-s-default span.cm-variable {color: black;}\n.cm-s-default span.cm-variable-2 {color: #05a;}\n.cm-s-default span.cm-variable-3 {color: #085;}\n.cm-s-default span.cm-property {color: black;}\n.cm-s-default span.cm-operator {color: black;}\n.cm-s-default span.cm-comment {color: #a50;}\n.cm-s-default span.cm-string {color: #a11;}\n.cm-s-default span.cm-string-2 {color: #f50;}\n.cm-s-default span.cm-meta {color: #555;}\n.cm-s-default span.cm-error {color: #f00;}\n.cm-s-default span.cm-qualifier {color: #555;}\n.cm-s-default span.cm-builtin {color: #30a;}\n.cm-s-default span.cm-bracket {color: #cc7;}\n.cm-s-default span.cm-tag {color: #170;}\n.cm-s-default span.cm-attribute {color: #00c;}\n.cm-s-default span.cm-header {color: #a0a;}\n.cm-s-default span.cm-quote {color: #090;}\n.cm-s-default span.cm-hr {color: #999;}\n.cm-s-default span.cm-link {color: #00c;}\n\nspan.cm-header, span.cm-strong {font-weight: bold;}\nspan.cm-em {font-style: italic;}\nspan.cm-emstrong {font-style: italic; font-weight: bold;}\nspan.cm-link {text-decoration: underline;}\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}\n"
  },
  {
    "path": "static/common/user/uedit/third-party/codemirror/codemirror.js",
    "content": "// CodeMirror version 2.2\n//\n// All functions that need access to the editor's state live inside\n// the CodeMirror function. Below that, at the bottom of the file,\n// some utilities are defined.\n\n// CodeMirror is the only global var we claim\nvar CodeMirror = (function() {\n    // This is the function that produces an editor instance. It's\n    // closure is used to store the editor state.\n    function CodeMirror(place, givenOptions) {\n        // Determine effective options based on given values and defaults.\n        var options = {}, defaults = CodeMirror.defaults;\n        for (var opt in defaults)\n            if (defaults.hasOwnProperty(opt))\n                options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];\n\n        var targetDocument = options[\"document\"];\n        // The element in which the editor lives.\n        var wrapper = targetDocument.createElement(\"div\");\n        wrapper.className = \"CodeMirror\" + (options.lineWrapping ? \" CodeMirror-wrap\" : \"\");\n        // This mess creates the base DOM structure for the editor.\n        wrapper.innerHTML =\n            '<div style=\"overflow: hidden; position: relative; width: 3px; height: 0px;\">' + // Wraps and hides input textarea\n                '<textarea style=\"position: absolute; padding: 0; width: 1px;\" wrap=\"off\" ' +\n                'autocorrect=\"off\" autocapitalize=\"off\"></textarea></div>' +\n                '<div class=\"CodeMirror-scroll\" tabindex=\"-1\">' +\n                '<div style=\"position: relative\">' + // Set to the height of the text, causes scrolling\n                '<div style=\"position: relative\">' + // Moved around its parent to cover visible view\n                '<div class=\"CodeMirror-gutter\"><div class=\"CodeMirror-gutter-text\"></div></div>' +\n                // Provides positioning relative to (visible) text origin\n                '<div class=\"CodeMirror-lines\"><div style=\"position: relative\">' +\n                '<div style=\"position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden\"></div>' +\n                '<pre class=\"CodeMirror-cursor\">&#160;</pre>' + // Absolutely positioned blinky cursor\n                '<div></div>' + // This DIV contains the actual code\n                '</div></div></div></div></div>';\n        if (place.appendChild) place.appendChild(wrapper); else place(wrapper);\n        // I've never seen more elegant code in my life.\n        var inputDiv = wrapper.firstChild, input = inputDiv.firstChild,\n            scroller = wrapper.lastChild, code = scroller.firstChild,\n            mover = code.firstChild, gutter = mover.firstChild, gutterText = gutter.firstChild,\n            lineSpace = gutter.nextSibling.firstChild, measure = lineSpace.firstChild,\n            cursor = measure.nextSibling, lineDiv = cursor.nextSibling;\n        themeChanged();\n        // Needed to hide big blue blinking cursor on Mobile Safari\n        if (/AppleWebKit/.test(navigator.userAgent) && /Mobile\\/\\w+/.test(navigator.userAgent)) input.style.width = \"0px\";\n        if (!webkit) lineSpace.draggable = true;\n        if (options.tabindex != null) input.tabIndex = options.tabindex;\n        if (!options.gutter && !options.lineNumbers) gutter.style.display = \"none\";\n\n        // Check for problem with IE innerHTML not working when we have a\n        // P (or similar) parent node.\n        try { stringWidth(\"x\"); }\n        catch (e) {\n            if (e.message.match(/runtime/i))\n                e = new Error(\"A CodeMirror inside a P-style element does not work in Internet Explorer. (innerHTML bug)\");\n            throw e;\n        }\n\n        // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval.\n        var poll = new Delayed(), highlight = new Delayed(), blinker;\n\n        // mode holds a mode API object. doc is the tree of Line objects,\n        // work an array of lines that should be parsed, and history the\n        // undo history (instance of History constructor).\n        var mode, doc = new BranchChunk([new LeafChunk([new Line(\"\")])]), work, focused;\n        loadMode();\n        // The selection. These are always maintained to point at valid\n        // positions. Inverted is used to remember that the user is\n        // selecting bottom-to-top.\n        var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false};\n        // Selection-related flags. shiftSelecting obviously tracks\n        // whether the user is holding shift.\n        var shiftSelecting, lastClick, lastDoubleClick, draggingText, overwrite = false;\n        // Variables used by startOperation/endOperation to track what\n        // happened during the operation.\n        var updateInput, userSelChange, changes, textChanged, selectionChanged, leaveInputAlone,\n            gutterDirty, callbacks;\n        // Current visible range (may be bigger than the view window).\n        var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0;\n        // bracketHighlighted is used to remember that a backet has been\n        // marked.\n        var bracketHighlighted;\n        // Tracks the maximum line length so that the horizontal scrollbar\n        // can be kept static when scrolling.\n        var maxLine = \"\", maxWidth, tabText = computeTabText();\n\n        // Initialize the content.\n        operation(function(){setValue(options.value || \"\"); updateInput = false;})();\n        var history = new History();\n\n        // Register our event handlers.\n        connect(scroller, \"mousedown\", operation(onMouseDown));\n        connect(scroller, \"dblclick\", operation(onDoubleClick));\n        connect(lineSpace, \"dragstart\", onDragStart);\n        connect(lineSpace, \"selectstart\", e_preventDefault);\n        // Gecko browsers fire contextmenu *after* opening the menu, at\n        // which point we can't mess with it anymore. Context menu is\n        // handled in onMouseDown for Gecko.\n        if (!gecko) connect(scroller, \"contextmenu\", onContextMenu);\n        connect(scroller, \"scroll\", function() {\n            updateDisplay([]);\n            if (options.fixedGutter) gutter.style.left = scroller.scrollLeft + \"px\";\n            if (options.onScroll) options.onScroll(instance);\n        });\n        connect(window, \"resize\", function() {updateDisplay(true);});\n        connect(input, \"keyup\", operation(onKeyUp));\n        connect(input, \"input\", fastPoll);\n        connect(input, \"keydown\", operation(onKeyDown));\n        connect(input, \"keypress\", operation(onKeyPress));\n        connect(input, \"focus\", onFocus);\n        connect(input, \"blur\", onBlur);\n\n        connect(scroller, \"dragenter\", e_stop);\n        connect(scroller, \"dragover\", e_stop);\n        connect(scroller, \"drop\", operation(onDrop));\n        connect(scroller, \"paste\", function(){focusInput(); fastPoll();});\n        connect(input, \"paste\", fastPoll);\n        connect(input, \"cut\", operation(function(){replaceSelection(\"\");}));\n\n        // IE throws unspecified error in certain cases, when\n        // trying to access activeElement before onload\n        var hasFocus; try { hasFocus = (targetDocument.activeElement == input); } catch(e) { }\n        if (hasFocus) setTimeout(onFocus, 20);\n        else onBlur();\n\n        function isLine(l) {return l >= 0 && l < doc.size;}\n        // The instance object that we'll return. Mostly calls out to\n        // local functions in the CodeMirror function. Some do some extra\n        // range checking and/or clipping. operation is used to wrap the\n        // call so that changes it makes are tracked, and the display is\n        // updated afterwards.\n        var instance = wrapper.CodeMirror = {\n            getValue: getValue,\n            setValue: operation(setValue),\n            getSelection: getSelection,\n            replaceSelection: operation(replaceSelection),\n            focus: function(){focusInput(); onFocus(); fastPoll();},\n            setOption: function(option, value) {\n                var oldVal = options[option];\n                options[option] = value;\n                if (option == \"mode\" || option == \"indentUnit\") loadMode();\n                else if (option == \"readOnly\" && value) {onBlur(); input.blur();}\n                else if (option == \"theme\") themeChanged();\n                else if (option == \"lineWrapping\" && oldVal != value) operation(wrappingChanged)();\n                else if (option == \"tabSize\") operation(tabsChanged)();\n                if (option == \"lineNumbers\" || option == \"gutter\" || option == \"firstLineNumber\" || option == \"theme\")\n                    operation(gutterChanged)();\n            },\n            getOption: function(option) {return options[option];},\n            undo: operation(undo),\n            redo: operation(redo),\n            indentLine: operation(function(n, dir) {\n                if (isLine(n)) indentLine(n, dir == null ? \"smart\" : dir ? \"add\" : \"subtract\");\n            }),\n            indentSelection: operation(indentSelected),\n            historySize: function() {return {undo: history.done.length, redo: history.undone.length};},\n            clearHistory: function() {history = new History();},\n            matchBrackets: operation(function(){matchBrackets(true);}),\n            getTokenAt: operation(function(pos) {\n                pos = clipPos(pos);\n                return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), pos.ch);\n            }),\n            getStateAfter: function(line) {\n                line = clipLine(line == null ? doc.size - 1: line);\n                return getStateBefore(line + 1);\n            },\n            cursorCoords: function(start){\n                if (start == null) start = sel.inverted;\n                return pageCoords(start ? sel.from : sel.to);\n            },\n            charCoords: function(pos){return pageCoords(clipPos(pos));},\n            coordsChar: function(coords) {\n                var off = eltOffset(lineSpace);\n                return coordsChar(coords.x - off.left, coords.y - off.top);\n            },\n            markText: operation(markText),\n            setBookmark: setBookmark,\n            setMarker: operation(addGutterMarker),\n            clearMarker: operation(removeGutterMarker),\n            setLineClass: operation(setLineClass),\n            hideLine: operation(function(h) {return setLineHidden(h, true);}),\n            showLine: operation(function(h) {return setLineHidden(h, false);}),\n            onDeleteLine: function(line, f) {\n                if (typeof line == \"number\") {\n                    if (!isLine(line)) return null;\n                    line = getLine(line);\n                }\n                (line.handlers || (line.handlers = [])).push(f);\n                return line;\n            },\n            lineInfo: lineInfo,\n            addWidget: function(pos, node, scroll, vert, horiz) {\n                pos = localCoords(clipPos(pos));\n                var top = pos.yBot, left = pos.x;\n                node.style.position = \"absolute\";\n                code.appendChild(node);\n                if (vert == \"over\") top = pos.y;\n                else if (vert == \"near\") {\n                    var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()),\n                        hspace = Math.max(code.clientWidth, lineSpace.clientWidth) - paddingLeft();\n                    if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight)\n                        top = pos.y - node.offsetHeight;\n                    if (left + node.offsetWidth > hspace)\n                        left = hspace - node.offsetWidth;\n                }\n                node.style.top = (top + paddingTop()) + \"px\";\n                node.style.left = node.style.right = \"\";\n                if (horiz == \"right\") {\n                    left = code.clientWidth - node.offsetWidth;\n                    node.style.right = \"0px\";\n                } else {\n                    if (horiz == \"left\") left = 0;\n                    else if (horiz == \"middle\") left = (code.clientWidth - node.offsetWidth) / 2;\n                    node.style.left = (left + paddingLeft()) + \"px\";\n                }\n                if (scroll)\n                    scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight);\n            },\n\n            lineCount: function() {return doc.size;},\n            clipPos: clipPos,\n            getCursor: function(start) {\n                if (start == null) start = sel.inverted;\n                return copyPos(start ? sel.from : sel.to);\n            },\n            somethingSelected: function() {return !posEq(sel.from, sel.to);},\n            setCursor: operation(function(line, ch, user) {\n                if (ch == null && typeof line.line == \"number\") setCursor(line.line, line.ch, user);\n                else setCursor(line, ch, user);\n            }),\n            setSelection: operation(function(from, to, user) {\n                (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from));\n            }),\n            getLine: function(line) {if (isLine(line)) return getLine(line).text;},\n            getLineHandle: function(line) {if (isLine(line)) return getLine(line);},\n            setLine: operation(function(line, text) {\n                if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length});\n            }),\n            removeLine: operation(function(line) {\n                if (isLine(line)) replaceRange(\"\", {line: line, ch: 0}, clipPos({line: line+1, ch: 0}));\n            }),\n            replaceRange: operation(replaceRange),\n            getRange: function(from, to) {return getRange(clipPos(from), clipPos(to));},\n\n            execCommand: function(cmd) {return commands[cmd](instance);},\n            // Stuff used by commands, probably not much use to outside code.\n            moveH: operation(moveH),\n            deleteH: operation(deleteH),\n            moveV: operation(moveV),\n            toggleOverwrite: function() {overwrite = !overwrite;},\n\n            posFromIndex: function(off) {\n                var lineNo = 0, ch;\n                doc.iter(0, doc.size, function(line) {\n                    var sz = line.text.length + 1;\n                    if (sz > off) { ch = off; return true; }\n                    off -= sz;\n                    ++lineNo;\n                });\n                return clipPos({line: lineNo, ch: ch});\n            },\n            indexFromPos: function (coords) {\n                if (coords.line < 0 || coords.ch < 0) return 0;\n                var index = coords.ch;\n                doc.iter(0, coords.line, function (line) {\n                    index += line.text.length + 1;\n                });\n                return index;\n            },\n\n            operation: function(f){return operation(f)();},\n            refresh: function(){updateDisplay(true);},\n            getInputField: function(){return input;},\n            getWrapperElement: function(){return wrapper;},\n            getScrollerElement: function(){return scroller;},\n            getGutterElement: function(){return gutter;}\n        };\n\n        function getLine(n) { return getLineAt(doc, n); }\n        function updateLineHeight(line, height) {\n            gutterDirty = true;\n            var diff = height - line.height;\n            for (var n = line; n; n = n.parent) n.height += diff;\n        }\n\n        function setValue(code) {\n            var top = {line: 0, ch: 0};\n            updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length},\n                splitLines(code), top, top);\n            updateInput = true;\n        }\n        function getValue(code) {\n            var text = [];\n            doc.iter(0, doc.size, function(line) { text.push(line.text); });\n            return text.join(\"\\n\");\n        }\n\n        function onMouseDown(e) {\n            setShift(e.shiftKey);\n            // Check whether this is a click in a widget\n            for (var n = e_target(e); n != wrapper; n = n.parentNode)\n                if (n.parentNode == code && n != mover) return;\n\n            // See if this is a click in the gutter\n            for (var n = e_target(e); n != wrapper; n = n.parentNode)\n                if (n.parentNode == gutterText) {\n                    if (options.onGutterClick)\n                        options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e);\n                    return e_preventDefault(e);\n                }\n\n            var start = posFromMouse(e);\n\n            switch (e_button(e)) {\n                case 3:\n                    if (gecko && !mac) onContextMenu(e);\n                    return;\n                case 2:\n                    if (start) setCursor(start.line, start.ch, true);\n                    return;\n            }\n            // For button 1, if it was clicked inside the editor\n            // (posFromMouse returning non-null), we have to adjust the\n            // selection.\n            if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;}\n\n            if (!focused) onFocus();\n\n            var now = +new Date;\n            if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {\n                e_preventDefault(e);\n                setTimeout(focusInput, 20);\n                return selectLine(start.line);\n            } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {\n                lastDoubleClick = {time: now, pos: start};\n                e_preventDefault(e);\n                return selectWordAt(start);\n            } else { lastClick = {time: now, pos: start}; }\n\n            var last = start, going;\n            if (dragAndDrop && !posEq(sel.from, sel.to) &&\n                !posLess(start, sel.from) && !posLess(sel.to, start)) {\n                // Let the drag handler handle this.\n                if (webkit) lineSpace.draggable = true;\n                var up = connect(targetDocument, \"mouseup\", operation(function(e2) {\n                    if (webkit) lineSpace.draggable = false;\n                    draggingText = false;\n                    up();\n                    if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {\n                        e_preventDefault(e2);\n                        setCursor(start.line, start.ch, true);\n                        focusInput();\n                    }\n                }), true);\n                draggingText = true;\n                return;\n            }\n            e_preventDefault(e);\n            setCursor(start.line, start.ch, true);\n\n            function extend(e) {\n                var cur = posFromMouse(e, true);\n                if (cur && !posEq(cur, last)) {\n                    if (!focused) onFocus();\n                    last = cur;\n                    setSelectionUser(start, cur);\n                    updateInput = false;\n                    var visible = visibleLines();\n                    if (cur.line >= visible.to || cur.line < visible.from)\n                        going = setTimeout(operation(function(){extend(e);}), 150);\n                }\n            }\n\n            var move = connect(targetDocument, \"mousemove\", operation(function(e) {\n                clearTimeout(going);\n                e_preventDefault(e);\n                extend(e);\n            }), true);\n            var up = connect(targetDocument, \"mouseup\", operation(function(e) {\n                clearTimeout(going);\n                var cur = posFromMouse(e);\n                if (cur) setSelectionUser(start, cur);\n                e_preventDefault(e);\n                focusInput();\n                updateInput = true;\n                move(); up();\n            }), true);\n        }\n        function onDoubleClick(e) {\n            for (var n = e_target(e); n != wrapper; n = n.parentNode)\n                if (n.parentNode == gutterText) return e_preventDefault(e);\n            var start = posFromMouse(e);\n            if (!start) return;\n            lastDoubleClick = {time: +new Date, pos: start};\n            e_preventDefault(e);\n            selectWordAt(start);\n        }\n        function onDrop(e) {\n            e.preventDefault();\n            var pos = posFromMouse(e, true), files = e.dataTransfer.files;\n            if (!pos || options.readOnly) return;\n            if (files && files.length && window.FileReader && window.File) {\n                function loadFile(file, i) {\n                    var reader = new FileReader;\n                    reader.onload = function() {\n                        text[i] = reader.result;\n                        if (++read == n) {\n                            pos = clipPos(pos);\n                            operation(function() {\n                                var end = replaceRange(text.join(\"\"), pos, pos);\n                                setSelectionUser(pos, end);\n                            })();\n                        }\n                    };\n                    reader.readAsText(file);\n                }\n                var n = files.length, text = Array(n), read = 0;\n                for (var i = 0; i < n; ++i) loadFile(files[i], i);\n            }\n            else {\n                try {\n                    var text = e.dataTransfer.getData(\"Text\");\n                    if (text) {\n                        var end = replaceRange(text, pos, pos);\n                        var curFrom = sel.from, curTo = sel.to;\n                        setSelectionUser(pos, end);\n                        if (draggingText) replaceRange(\"\", curFrom, curTo);\n                        focusInput();\n                    }\n                }\n                catch(e){}\n            }\n        }\n        function onDragStart(e) {\n            var txt = getSelection();\n            // This will reset escapeElement\n            htmlEscape(txt);\n            e.dataTransfer.setDragImage(escapeElement, 0, 0);\n            e.dataTransfer.setData(\"Text\", txt);\n        }\n        function handleKeyBinding(e) {\n            var name = keyNames[e.keyCode], next = keyMap[options.keyMap].auto, bound, dropShift;\n            if (name == null || e.altGraphKey) {\n                if (next) options.keyMap = next;\n                return null;\n            }\n            if (e.altKey) name = \"Alt-\" + name;\n            if (e.ctrlKey) name = \"Ctrl-\" + name;\n            if (e.metaKey) name = \"Cmd-\" + name;\n            if (e.shiftKey && (bound = lookupKey(\"Shift-\" + name, options.extraKeys, options.keyMap))) {\n                dropShift = true;\n            } else {\n                bound = lookupKey(name, options.extraKeys, options.keyMap);\n            }\n            if (typeof bound == \"string\") {\n                if (commands.propertyIsEnumerable(bound)) bound = commands[bound];\n                else bound = null;\n            }\n            if (next && (bound || !isModifierKey(e))) options.keyMap = next;\n            if (!bound) return false;\n            if (dropShift) {\n                var prevShift = shiftSelecting;\n                shiftSelecting = null;\n                bound(instance);\n                shiftSelecting = prevShift;\n            } else bound(instance);\n            e_preventDefault(e);\n            return true;\n        }\n        var lastStoppedKey = null;\n        function onKeyDown(e) {\n            if (!focused) onFocus();\n            var code = e.keyCode;\n            // IE does strange things with escape.\n            if (ie && code == 27) { e.returnValue = false; }\n            setShift(code == 16 || e.shiftKey);\n            // First give onKeyEvent option a chance to handle this.\n            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;\n            var handled = handleKeyBinding(e);\n            if (window.opera) {\n                lastStoppedKey = handled ? e.keyCode : null;\n                // Opera has no cut event... we try to at least catch the key combo\n                if (!handled && (mac ? e.metaKey : e.ctrlKey) && e.keyCode == 88)\n                    replaceSelection(\"\");\n            }\n        }\n        function onKeyPress(e) {\n            if (window.opera && e.keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}\n            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;\n            if (window.opera && !e.which && handleKeyBinding(e)) return;\n            if (options.electricChars && mode.electricChars) {\n                var ch = String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode);\n                if (mode.electricChars.indexOf(ch) > -1)\n                    setTimeout(operation(function() {indentLine(sel.to.line, \"smart\");}), 75);\n            }\n            fastPoll();\n        }\n        function onKeyUp(e) {\n            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;\n            if (e.keyCode == 16) shiftSelecting = null;\n        }\n\n        function onFocus() {\n            if (options.readOnly) return;\n            if (!focused) {\n                if (options.onFocus) options.onFocus(instance);\n                focused = true;\n                if (wrapper.className.search(/\\bCodeMirror-focused\\b/) == -1)\n                    wrapper.className += \" CodeMirror-focused\";\n                if (!leaveInputAlone) resetInput(true);\n            }\n            slowPoll();\n            restartBlink();\n        }\n        function onBlur() {\n            if (focused) {\n                if (options.onBlur) options.onBlur(instance);\n                focused = false;\n                wrapper.className = wrapper.className.replace(\" CodeMirror-focused\", \"\");\n            }\n            clearInterval(blinker);\n            setTimeout(function() {if (!focused) shiftSelecting = null;}, 150);\n        }\n\n        // Replace the range from from to to by the strings in newText.\n        // Afterwards, set the selection to selFrom, selTo.\n        function updateLines(from, to, newText, selFrom, selTo) {\n            if (history) {\n                var old = [];\n                doc.iter(from.line, to.line + 1, function(line) { old.push(line.text); });\n                history.addChange(from.line, newText.length, old);\n                while (history.done.length > options.undoDepth) history.done.shift();\n            }\n            updateLinesNoUndo(from, to, newText, selFrom, selTo);\n        }\n        function unredoHelper(from, to) {\n            var change = from.pop();\n            if (change) {\n                var replaced = [], end = change.start + change.added;\n                doc.iter(change.start, end, function(line) { replaced.push(line.text); });\n                to.push({start: change.start, added: change.old.length, old: replaced});\n                var pos = clipPos({line: change.start + change.old.length - 1,\n                    ch: editEnd(replaced[replaced.length-1], change.old[change.old.length-1])});\n                updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length}, change.old, pos, pos);\n                updateInput = true;\n            }\n        }\n        function undo() {unredoHelper(history.done, history.undone);}\n        function redo() {unredoHelper(history.undone, history.done);}\n\n        function updateLinesNoUndo(from, to, newText, selFrom, selTo) {\n            var recomputeMaxLength = false, maxLineLength = maxLine.length;\n            if (!options.lineWrapping)\n                doc.iter(from.line, to.line, function(line) {\n                    if (line.text.length == maxLineLength) {recomputeMaxLength = true; return true;}\n                });\n            if (from.line != to.line || newText.length > 1) gutterDirty = true;\n\n            var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line);\n            // First adjust the line structure, taking some care to leave highlighting intact.\n            if (from.ch == 0 && to.ch == 0 && newText[newText.length - 1] == \"\") {\n                // This is a whole-line replace. Treated specially to make\n                // sure line objects move the way they are supposed to.\n                var added = [], prevLine = null;\n                if (from.line) {\n                    prevLine = getLine(from.line - 1);\n                    prevLine.fixMarkEnds(lastLine);\n                } else lastLine.fixMarkStarts();\n                for (var i = 0, e = newText.length - 1; i < e; ++i)\n                    added.push(Line.inheritMarks(newText[i], prevLine));\n                if (nlines) doc.remove(from.line, nlines, callbacks);\n                if (added.length) doc.insert(from.line, added);\n            } else if (firstLine == lastLine) {\n                if (newText.length == 1)\n                    firstLine.replace(from.ch, to.ch, newText[0]);\n                else {\n                    lastLine = firstLine.split(to.ch, newText[newText.length-1]);\n                    firstLine.replace(from.ch, null, newText[0]);\n                    firstLine.fixMarkEnds(lastLine);\n                    var added = [];\n                    for (var i = 1, e = newText.length - 1; i < e; ++i)\n                        added.push(Line.inheritMarks(newText[i], firstLine));\n                    added.push(lastLine);\n                    doc.insert(from.line + 1, added);\n                }\n            } else if (newText.length == 1) {\n                firstLine.replace(from.ch, null, newText[0]);\n                lastLine.replace(null, to.ch, \"\");\n                firstLine.append(lastLine);\n                doc.remove(from.line + 1, nlines, callbacks);\n            } else {\n                var added = [];\n                firstLine.replace(from.ch, null, newText[0]);\n                lastLine.replace(null, to.ch, newText[newText.length-1]);\n                firstLine.fixMarkEnds(lastLine);\n                for (var i = 1, e = newText.length - 1; i < e; ++i)\n                    added.push(Line.inheritMarks(newText[i], firstLine));\n                if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks);\n                doc.insert(from.line + 1, added);\n            }\n            if (options.lineWrapping) {\n                var perLine = scroller.clientWidth / charWidth() - 3;\n                doc.iter(from.line, from.line + newText.length, function(line) {\n                    if (line.hidden) return;\n                    var guess = Math.ceil(line.text.length / perLine) || 1;\n                    if (guess != line.height) updateLineHeight(line, guess);\n                });\n            } else {\n                doc.iter(from.line, i + newText.length, function(line) {\n                    var l = line.text;\n                    if (l.length > maxLineLength) {\n                        maxLine = l; maxLineLength = l.length; maxWidth = null;\n                        recomputeMaxLength = false;\n                    }\n                });\n                if (recomputeMaxLength) {\n                    maxLineLength = 0; maxLine = \"\"; maxWidth = null;\n                    doc.iter(0, doc.size, function(line) {\n                        var l = line.text;\n                        if (l.length > maxLineLength) {\n                            maxLineLength = l.length; maxLine = l;\n                        }\n                    });\n                }\n            }\n\n            // Add these lines to the work array, so that they will be\n            // highlighted. Adjust work lines if lines were added/removed.\n            var newWork = [], lendiff = newText.length - nlines - 1;\n            for (var i = 0, l = work.length; i < l; ++i) {\n                var task = work[i];\n                if (task < from.line) newWork.push(task);\n                else if (task > to.line) newWork.push(task + lendiff);\n            }\n            var hlEnd = from.line + Math.min(newText.length, 500);\n            highlightLines(from.line, hlEnd);\n            newWork.push(hlEnd);\n            work = newWork;\n            startWorker(100);\n            // Remember that these lines changed, for updating the display\n            changes.push({from: from.line, to: to.line + 1, diff: lendiff});\n            var changeObj = {from: from, to: to, text: newText};\n            if (textChanged) {\n                for (var cur = textChanged; cur.next; cur = cur.next) {}\n                cur.next = changeObj;\n            } else textChanged = changeObj;\n\n            // Update the selection\n            function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;}\n            setSelection(selFrom, selTo, updateLine(sel.from.line), updateLine(sel.to.line));\n\n            // Make sure the scroll-size div has the correct height.\n            code.style.height = (doc.height * textHeight() + 2 * paddingTop()) + \"px\";\n        }\n\n        function replaceRange(code, from, to) {\n            from = clipPos(from);\n            if (!to) to = from; else to = clipPos(to);\n            code = splitLines(code);\n            function adjustPos(pos) {\n                if (posLess(pos, from)) return pos;\n                if (!posLess(to, pos)) return end;\n                var line = pos.line + code.length - (to.line - from.line) - 1;\n                var ch = pos.ch;\n                if (pos.line == to.line)\n                    ch += code[code.length-1].length - (to.ch - (to.line == from.line ? from.ch : 0));\n                return {line: line, ch: ch};\n            }\n            var end;\n            replaceRange1(code, from, to, function(end1) {\n                end = end1;\n                return {from: adjustPos(sel.from), to: adjustPos(sel.to)};\n            });\n            return end;\n        }\n        function replaceSelection(code, collapse) {\n            replaceRange1(splitLines(code), sel.from, sel.to, function(end) {\n                if (collapse == \"end\") return {from: end, to: end};\n                else if (collapse == \"start\") return {from: sel.from, to: sel.from};\n                else return {from: sel.from, to: end};\n            });\n        }\n        function replaceRange1(code, from, to, computeSel) {\n            var endch = code.length == 1 ? code[0].length + from.ch : code[code.length-1].length;\n            var newSel = computeSel({line: from.line + code.length - 1, ch: endch});\n            updateLines(from, to, code, newSel.from, newSel.to);\n        }\n\n        function getRange(from, to) {\n            var l1 = from.line, l2 = to.line;\n            if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch);\n            var code = [getLine(l1).text.slice(from.ch)];\n            doc.iter(l1 + 1, l2, function(line) { code.push(line.text); });\n            code.push(getLine(l2).text.slice(0, to.ch));\n            return code.join(\"\\n\");\n        }\n        function getSelection() {\n            return getRange(sel.from, sel.to);\n        }\n\n        var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll\n        function slowPoll() {\n            if (pollingFast) return;\n            poll.set(options.pollInterval, function() {\n                startOperation();\n                readInput();\n                if (focused) slowPoll();\n                endOperation();\n            });\n        }\n        function fastPoll() {\n            var missed = false;\n            pollingFast = true;\n            function p() {\n                startOperation();\n                var changed = readInput();\n                if (!changed && !missed) {missed = true; poll.set(60, p);}\n                else {pollingFast = false; slowPoll();}\n                endOperation();\n            }\n            poll.set(20, p);\n        }\n\n        // Previnput is a hack to work with IME. If we reset the textarea\n        // on every change, that breaks IME. So we look for changes\n        // compared to the previous content instead. (Modern browsers have\n        // events that indicate IME taking place, but these are not widely\n        // supported or compatible enough yet to rely on.)\n        var prevInput = \"\";\n        function readInput() {\n            if (leaveInputAlone || !focused || hasSelection(input)) return false;\n            var text = input.value;\n            if (text == prevInput) return false;\n            shiftSelecting = null;\n            var same = 0, l = Math.min(prevInput.length, text.length);\n            while (same < l && prevInput[same] == text[same]) ++same;\n            if (same < prevInput.length)\n                sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)};\n            else if (overwrite && posEq(sel.from, sel.to))\n                sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))};\n            replaceSelection(text.slice(same), \"end\");\n            prevInput = text;\n            return true;\n        }\n        function resetInput(user) {\n            if (!posEq(sel.from, sel.to)) {\n                prevInput = \"\";\n                input.value = getSelection();\n                input.select();\n            } else if (user) prevInput = input.value = \"\";\n        }\n\n        function focusInput() {\n            if (!options.readOnly) input.focus();\n        }\n\n        function scrollEditorIntoView() {\n            if (!cursor.getBoundingClientRect) return;\n            var rect = cursor.getBoundingClientRect();\n            // IE returns bogus coordinates when the instance sits inside of an iframe and the cursor is hidden\n            if (ie && rect.top == rect.bottom) return;\n            var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);\n            if (rect.top < 0 || rect.bottom > winH) cursor.scrollIntoView();\n        }\n        function scrollCursorIntoView() {\n            var cursor = localCoords(sel.inverted ? sel.from : sel.to);\n            var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x;\n            return scrollIntoView(x, cursor.y, x, cursor.yBot);\n        }\n        function scrollIntoView(x1, y1, x2, y2) {\n            var pl = paddingLeft(), pt = paddingTop(), lh = textHeight();\n            y1 += pt; y2 += pt; x1 += pl; x2 += pl;\n            var screen = scroller.clientHeight, screentop = scroller.scrollTop, scrolled = false, result = true;\n            if (y1 < screentop) {scroller.scrollTop = Math.max(0, y1 - 2*lh); scrolled = true;}\n            else if (y2 > screentop + screen) {scroller.scrollTop = y2 + lh - screen; scrolled = true;}\n\n            var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft;\n            var gutterw = options.fixedGutter ? gutter.clientWidth : 0;\n            if (x1 < screenleft + gutterw) {\n                if (x1 < 50) x1 = 0;\n                scroller.scrollLeft = Math.max(0, x1 - 10 - gutterw);\n                scrolled = true;\n            }\n            else if (x2 > screenw + screenleft - 3) {\n                scroller.scrollLeft = x2 + 10 - screenw;\n                scrolled = true;\n                if (x2 > code.clientWidth) result = false;\n            }\n            if (scrolled && options.onScroll) options.onScroll(instance);\n            return result;\n        }\n\n        function visibleLines() {\n            var lh = textHeight(), top = scroller.scrollTop - paddingTop();\n            var from_height = Math.max(0, Math.floor(top / lh));\n            var to_height = Math.ceil((top + scroller.clientHeight) / lh);\n            return {from: lineAtHeight(doc, from_height),\n                to: lineAtHeight(doc, to_height)};\n        }\n        // Uses a set of changes plus the current scroll position to\n        // determine which DOM updates have to be made, and makes the\n        // updates.\n        function updateDisplay(changes, suppressCallback) {\n            if (!scroller.clientWidth) {\n                showingFrom = showingTo = displayOffset = 0;\n                return;\n            }\n            // Compute the new visible window\n            var visible = visibleLines();\n            // Bail out if the visible area is already rendered and nothing changed.\n            if (changes !== true && changes.length == 0 && visible.from >= showingFrom && visible.to <= showingTo) return;\n            var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100);\n            if (showingFrom < from && from - showingFrom < 20) from = showingFrom;\n            if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo);\n\n            // Create a range of theoretically intact lines, and punch holes\n            // in that using the change info.\n            var intact = changes === true ? [] :\n                computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes);\n            // Clip off the parts that won't be visible\n            var intactLines = 0;\n            for (var i = 0; i < intact.length; ++i) {\n                var range = intact[i];\n                if (range.from < from) {range.domStart += (from - range.from); range.from = from;}\n                if (range.to > to) range.to = to;\n                if (range.from >= range.to) intact.splice(i--, 1);\n                else intactLines += range.to - range.from;\n            }\n            if (intactLines == to - from) return;\n            intact.sort(function(a, b) {return a.domStart - b.domStart;});\n\n            var th = textHeight(), gutterDisplay = gutter.style.display;\n            lineDiv.style.display = gutter.style.display = \"none\";\n            patchDisplay(from, to, intact);\n            lineDiv.style.display = \"\";\n\n            // Position the mover div to align with the lines it's supposed\n            // to be showing (which will cover the visible display)\n            var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th;\n            // This is just a bogus formula that detects when the editor is\n            // resized or the font size changes.\n            if (different) lastSizeC = scroller.clientHeight + th;\n            showingFrom = from; showingTo = to;\n            displayOffset = heightAtLine(doc, from);\n            mover.style.top = (displayOffset * th) + \"px\";\n            code.style.height = (doc.height * th + 2 * paddingTop()) + \"px\";\n\n            // Since this is all rather error prone, it is honoured with the\n            // only assertion in the whole file.\n            if (lineDiv.childNodes.length != showingTo - showingFrom)\n                throw new Error(\"BAD PATCH! \" + JSON.stringify(intact) + \" size=\" + (showingTo - showingFrom) +\n                    \" nodes=\" + lineDiv.childNodes.length);\n\n            if (options.lineWrapping) {\n                maxWidth = scroller.clientWidth;\n                var curNode = lineDiv.firstChild;\n                doc.iter(showingFrom, showingTo, function(line) {\n                    if (!line.hidden) {\n                        var height = Math.round(curNode.offsetHeight / th) || 1;\n                        if (line.height != height) {updateLineHeight(line, height); gutterDirty = true;}\n                    }\n                    curNode = curNode.nextSibling;\n                });\n            } else {\n                if (maxWidth == null) maxWidth = stringWidth(maxLine);\n                if (maxWidth > scroller.clientWidth) {\n                    lineSpace.style.width = maxWidth + \"px\";\n                    // Needed to prevent odd wrapping/hiding of widgets placed in here.\n                    code.style.width = \"\";\n                    code.style.width = scroller.scrollWidth + \"px\";\n                } else {\n                    lineSpace.style.width = code.style.width = \"\";\n                }\n            }\n            gutter.style.display = gutterDisplay;\n            if (different || gutterDirty) updateGutter();\n            updateCursor();\n            if (!suppressCallback && options.onUpdate) options.onUpdate(instance);\n            return true;\n        }\n\n        function computeIntact(intact, changes) {\n            for (var i = 0, l = changes.length || 0; i < l; ++i) {\n                var change = changes[i], intact2 = [], diff = change.diff || 0;\n                for (var j = 0, l2 = intact.length; j < l2; ++j) {\n                    var range = intact[j];\n                    if (change.to <= range.from && change.diff)\n                        intact2.push({from: range.from + diff, to: range.to + diff,\n                            domStart: range.domStart});\n                    else if (change.to <= range.from || change.from >= range.to)\n                        intact2.push(range);\n                    else {\n                        if (change.from > range.from)\n                            intact2.push({from: range.from, to: change.from, domStart: range.domStart});\n                        if (change.to < range.to)\n                            intact2.push({from: change.to + diff, to: range.to + diff,\n                                domStart: range.domStart + (change.to - range.from)});\n                    }\n                }\n                intact = intact2;\n            }\n            return intact;\n        }\n\n        function patchDisplay(from, to, intact) {\n            // The first pass removes the DOM nodes that aren't intact.\n            if (!intact.length) lineDiv.innerHTML = \"\";\n            else {\n                function killNode(node) {\n                    var tmp = node.nextSibling;\n                    node.parentNode.removeChild(node);\n                    return tmp;\n                }\n                var domPos = 0, curNode = lineDiv.firstChild, n;\n                for (var i = 0; i < intact.length; ++i) {\n                    var cur = intact[i];\n                    while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;}\n                    for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;}\n                }\n                while (curNode) curNode = killNode(curNode);\n            }\n            // This pass fills in the lines that actually changed.\n            var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from;\n            var sfrom = sel.from.line, sto = sel.to.line, inSel = sfrom < from && sto >= from;\n            var scratch = targetDocument.createElement(\"div\"), newElt;\n            doc.iter(from, to, function(line) {\n                var ch1 = null, ch2 = null;\n                if (inSel) {\n                    ch1 = 0;\n                    if (sto == j) {inSel = false; ch2 = sel.to.ch;}\n                } else if (sfrom == j) {\n                    if (sto == j) {ch1 = sel.from.ch; ch2 = sel.to.ch;}\n                    else {inSel = true; ch1 = sel.from.ch;}\n                }\n                if (nextIntact && nextIntact.to == j) nextIntact = intact.shift();\n                if (!nextIntact || nextIntact.from > j) {\n                    if (line.hidden) scratch.innerHTML = \"<pre></pre>\";\n                    else scratch.innerHTML = line.getHTML(ch1, ch2, true, tabText);\n                    lineDiv.insertBefore(scratch.firstChild, curNode);\n                } else {\n                    curNode = curNode.nextSibling;\n                }\n                ++j;\n            });\n        }\n\n        function updateGutter() {\n            if (!options.gutter && !options.lineNumbers) return;\n            var hText = mover.offsetHeight, hEditor = scroller.clientHeight;\n            gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + \"px\";\n            var html = [], i = showingFrom;\n            doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) {\n                if (line.hidden) {\n                    html.push(\"<pre></pre>\");\n                } else {\n                    var marker = line.gutterMarker;\n                    var text = options.lineNumbers ? i + options.firstLineNumber : null;\n                    if (marker && marker.text)\n                        text = marker.text.replace(\"%N%\", text != null ? text : \"\");\n                    else if (text == null)\n                        text = \"\\u00a0\";\n                    html.push((marker && marker.style ? '<pre class=\"' + marker.style + '\">' : \"<pre>\"), text);\n                    for (var j = 1; j < line.height; ++j) html.push(\"<br/>&#160;\");\n                    html.push(\"</pre>\");\n                }\n                ++i;\n            });\n            gutter.style.display = \"none\";\n            gutterText.innerHTML = html.join(\"\");\n            var minwidth = String(doc.size).length, firstNode = gutterText.firstChild, val = eltText(firstNode), pad = \"\";\n            while (val.length + pad.length < minwidth) pad += \"\\u00a0\";\n            if (pad) firstNode.insertBefore(targetDocument.createTextNode(pad), firstNode.firstChild);\n            gutter.style.display = \"\";\n            lineSpace.style.marginLeft = gutter.offsetWidth + \"px\";\n            gutterDirty = false;\n        }\n        function updateCursor() {\n            var head = sel.inverted ? sel.from : sel.to, lh = textHeight();\n            var pos = localCoords(head, true);\n            var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv);\n            inputDiv.style.top = (pos.y + lineOff.top - wrapOff.top) + \"px\";\n            inputDiv.style.left = (pos.x + lineOff.left - wrapOff.left) + \"px\";\n            if (posEq(sel.from, sel.to)) {\n                cursor.style.top = pos.y + \"px\";\n                cursor.style.left = (options.lineWrapping ? Math.min(pos.x, lineSpace.offsetWidth) : pos.x) + \"px\";\n                cursor.style.display = \"\";\n            }\n            else cursor.style.display = \"none\";\n        }\n\n        function setShift(val) {\n            if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from);\n            else shiftSelecting = null;\n        }\n        function setSelectionUser(from, to) {\n            var sh = shiftSelecting && clipPos(shiftSelecting);\n            if (sh) {\n                if (posLess(sh, from)) from = sh;\n                else if (posLess(to, sh)) to = sh;\n            }\n            setSelection(from, to);\n            userSelChange = true;\n        }\n        // Update the selection. Last two args are only used by\n        // updateLines, since they have to be expressed in the line\n        // numbers before the update.\n        function setSelection(from, to, oldFrom, oldTo) {\n            goalColumn = null;\n            if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;}\n            if (posEq(sel.from, from) && posEq(sel.to, to)) return;\n            if (posLess(to, from)) {var tmp = to; to = from; from = tmp;}\n\n            // Skip over hidden lines.\n            if (from.line != oldFrom) from = skipHidden(from, oldFrom, sel.from.ch);\n            if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch);\n\n            if (posEq(from, to)) sel.inverted = false;\n            else if (posEq(from, sel.to)) sel.inverted = false;\n            else if (posEq(to, sel.from)) sel.inverted = true;\n\n            // Some ugly logic used to only mark the lines that actually did\n            // see a change in selection as changed, rather than the whole\n            // selected range.\n            if (posEq(from, to)) {\n                if (!posEq(sel.from, sel.to))\n                    changes.push({from: oldFrom, to: oldTo + 1});\n            }\n            else if (posEq(sel.from, sel.to)) {\n                changes.push({from: from.line, to: to.line + 1});\n            }\n            else {\n                if (!posEq(from, sel.from)) {\n                    if (from.line < oldFrom)\n                        changes.push({from: from.line, to: Math.min(to.line, oldFrom) + 1});\n                    else\n                        changes.push({from: oldFrom, to: Math.min(oldTo, from.line) + 1});\n                }\n                if (!posEq(to, sel.to)) {\n                    if (to.line < oldTo)\n                        changes.push({from: Math.max(oldFrom, from.line), to: oldTo + 1});\n                    else\n                        changes.push({from: Math.max(from.line, oldTo), to: to.line + 1});\n                }\n            }\n            sel.from = from; sel.to = to;\n            selectionChanged = true;\n        }\n        function skipHidden(pos, oldLine, oldCh) {\n            function getNonHidden(dir) {\n                var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1;\n                while (lNo != end) {\n                    var line = getLine(lNo);\n                    if (!line.hidden) {\n                        var ch = pos.ch;\n                        if (ch > oldCh || ch > line.text.length) ch = line.text.length;\n                        return {line: lNo, ch: ch};\n                    }\n                    lNo += dir;\n                }\n            }\n            var line = getLine(pos.line);\n            if (!line.hidden) return pos;\n            if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1);\n            else return getNonHidden(-1) || getNonHidden(1);\n        }\n        function setCursor(line, ch, user) {\n            var pos = clipPos({line: line, ch: ch || 0});\n            (user ? setSelectionUser : setSelection)(pos, pos);\n        }\n\n        function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));}\n        function clipPos(pos) {\n            if (pos.line < 0) return {line: 0, ch: 0};\n            if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length};\n            var ch = pos.ch, linelen = getLine(pos.line).text.length;\n            if (ch == null || ch > linelen) return {line: pos.line, ch: linelen};\n            else if (ch < 0) return {line: pos.line, ch: 0};\n            else return pos;\n        }\n\n        function findPosH(dir, unit) {\n            var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch;\n            var lineObj = getLine(line);\n            function findNextLine() {\n                for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) {\n                    var lo = getLine(l);\n                    if (!lo.hidden) { line = l; lineObj = lo; return true; }\n                }\n            }\n            function moveOnce(boundToLine) {\n                if (ch == (dir < 0 ? 0 : lineObj.text.length)) {\n                    if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0;\n                    else return false;\n                } else ch += dir;\n                return true;\n            }\n            if (unit == \"char\") moveOnce();\n            else if (unit == \"column\") moveOnce(true);\n            else if (unit == \"word\") {\n                var sawWord = false;\n                for (;;) {\n                    if (dir < 0) if (!moveOnce()) break;\n                    if (isWordChar(lineObj.text.charAt(ch))) sawWord = true;\n                    else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;}\n                    if (dir > 0) if (!moveOnce()) break;\n                }\n            }\n            return {line: line, ch: ch};\n        }\n        function moveH(dir, unit) {\n            var pos = dir < 0 ? sel.from : sel.to;\n            if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit);\n            setCursor(pos.line, pos.ch, true);\n        }\n        function deleteH(dir, unit) {\n            if (!posEq(sel.from, sel.to)) replaceRange(\"\", sel.from, sel.to);\n            else if (dir < 0) replaceRange(\"\", findPosH(dir, unit), sel.to);\n            else replaceRange(\"\", sel.from, findPosH(dir, unit));\n            userSelChange = true;\n        }\n        var goalColumn = null;\n        function moveV(dir, unit) {\n            var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true);\n            if (goalColumn != null) pos.x = goalColumn;\n            if (unit == \"page\") dist = scroller.clientHeight;\n            else if (unit == \"line\") dist = textHeight();\n            var target = coordsChar(pos.x, pos.y + dist * dir + 2);\n            setCursor(target.line, target.ch, true);\n            goalColumn = pos.x;\n        }\n\n        function selectWordAt(pos) {\n            var line = getLine(pos.line).text;\n            var start = pos.ch, end = pos.ch;\n            while (start > 0 && isWordChar(line.charAt(start - 1))) --start;\n            while (end < line.length && isWordChar(line.charAt(end))) ++end;\n            setSelectionUser({line: pos.line, ch: start}, {line: pos.line, ch: end});\n        }\n        function selectLine(line) {\n            setSelectionUser({line: line, ch: 0}, {line: line, ch: getLine(line).text.length});\n        }\n        function indentSelected(mode) {\n            if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode);\n            var e = sel.to.line - (sel.to.ch ? 0 : 1);\n            for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode);\n        }\n\n        function indentLine(n, how) {\n            if (!how) how = \"add\";\n            if (how == \"smart\") {\n                if (!mode.indent) how = \"prev\";\n                else var state = getStateBefore(n);\n            }\n\n            var line = getLine(n), curSpace = line.indentation(options.tabSize),\n                curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n            if (how == \"prev\") {\n                if (n) indentation = getLine(n-1).indentation(options.tabSize);\n                else indentation = 0;\n            }\n            else if (how == \"smart\") indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n            else if (how == \"add\") indentation = curSpace + options.indentUnit;\n            else if (how == \"subtract\") indentation = curSpace - options.indentUnit;\n            indentation = Math.max(0, indentation);\n            var diff = indentation - curSpace;\n\n            if (!diff) {\n                if (sel.from.line != n && sel.to.line != n) return;\n                var indentString = curSpaceString;\n            }\n            else {\n                var indentString = \"\", pos = 0;\n                if (options.indentWithTabs)\n                    for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += \"\\t\";}\n                while (pos < indentation) {++pos; indentString += \" \";}\n            }\n\n            replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});\n        }\n\n        function loadMode() {\n            mode = CodeMirror.getMode(options, options.mode);\n            doc.iter(0, doc.size, function(line) { line.stateAfter = null; });\n            work = [0];\n            startWorker();\n        }\n        function gutterChanged() {\n            var visible = options.gutter || options.lineNumbers;\n            gutter.style.display = visible ? \"\" : \"none\";\n            if (visible) gutterDirty = true;\n            else lineDiv.parentNode.style.marginLeft = 0;\n        }\n        function wrappingChanged(from, to) {\n            if (options.lineWrapping) {\n                wrapper.className += \" CodeMirror-wrap\";\n                var perLine = scroller.clientWidth / charWidth() - 3;\n                doc.iter(0, doc.size, function(line) {\n                    if (line.hidden) return;\n                    var guess = Math.ceil(line.text.length / perLine) || 1;\n                    if (guess != 1) updateLineHeight(line, guess);\n                });\n                lineSpace.style.width = code.style.width = \"\";\n            } else {\n                wrapper.className = wrapper.className.replace(\" CodeMirror-wrap\", \"\");\n                maxWidth = null; maxLine = \"\";\n                doc.iter(0, doc.size, function(line) {\n                    if (line.height != 1 && !line.hidden) updateLineHeight(line, 1);\n                    if (line.text.length > maxLine.length) maxLine = line.text;\n                });\n            }\n            changes.push({from: 0, to: doc.size});\n        }\n        function computeTabText() {\n            for (var str = '<span class=\"cm-tab\">', i = 0; i < options.tabSize; ++i) str += \" \";\n            return str + \"</span>\";\n        }\n        function tabsChanged() {\n            tabText = computeTabText();\n            updateDisplay(true);\n        }\n        function themeChanged() {\n            scroller.className = scroller.className.replace(/\\s*cm-s-\\w+/g, \"\") +\n                options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n        }\n\n        function TextMarker() { this.set = []; }\n        TextMarker.prototype.clear = operation(function() {\n            var min = Infinity, max = -Infinity;\n            for (var i = 0, e = this.set.length; i < e; ++i) {\n                var line = this.set[i], mk = line.marked;\n                if (!mk || !line.parent) continue;\n                var lineN = lineNo(line);\n                min = Math.min(min, lineN); max = Math.max(max, lineN);\n                for (var j = 0; j < mk.length; ++j)\n                    if (mk[j].set == this.set) mk.splice(j--, 1);\n            }\n            if (min != Infinity)\n                changes.push({from: min, to: max + 1});\n        });\n        TextMarker.prototype.find = function() {\n            var from, to;\n            for (var i = 0, e = this.set.length; i < e; ++i) {\n                var line = this.set[i], mk = line.marked;\n                for (var j = 0; j < mk.length; ++j) {\n                    var mark = mk[j];\n                    if (mark.set == this.set) {\n                        if (mark.from != null || mark.to != null) {\n                            var found = lineNo(line);\n                            if (found != null) {\n                                if (mark.from != null) from = {line: found, ch: mark.from};\n                                if (mark.to != null) to = {line: found, ch: mark.to};\n                            }\n                        }\n                    }\n                }\n            }\n            return {from: from, to: to};\n        };\n\n        function markText(from, to, className) {\n            from = clipPos(from); to = clipPos(to);\n            var tm = new TextMarker();\n            function add(line, from, to, className) {\n                getLine(line).addMark(new MarkedText(from, to, className, tm.set));\n            }\n            if (from.line == to.line) add(from.line, from.ch, to.ch, className);\n            else {\n                add(from.line, from.ch, null, className);\n                for (var i = from.line + 1, e = to.line; i < e; ++i)\n                    add(i, null, null, className);\n                add(to.line, null, to.ch, className);\n            }\n            changes.push({from: from.line, to: to.line + 1});\n            return tm;\n        }\n\n        function setBookmark(pos) {\n            pos = clipPos(pos);\n            var bm = new Bookmark(pos.ch);\n            getLine(pos.line).addMark(bm);\n            return bm;\n        }\n\n        function addGutterMarker(line, text, className) {\n            if (typeof line == \"number\") line = getLine(clipLine(line));\n            line.gutterMarker = {text: text, style: className};\n            gutterDirty = true;\n            return line;\n        }\n        function removeGutterMarker(line) {\n            if (typeof line == \"number\") line = getLine(clipLine(line));\n            line.gutterMarker = null;\n            gutterDirty = true;\n        }\n\n        function changeLine(handle, op) {\n            var no = handle, line = handle;\n            if (typeof handle == \"number\") line = getLine(clipLine(handle));\n            else no = lineNo(handle);\n            if (no == null) return null;\n            if (op(line, no)) changes.push({from: no, to: no + 1});\n            else return null;\n            return line;\n        }\n        function setLineClass(handle, className) {\n            return changeLine(handle, function(line) {\n                if (line.className != className) {\n                    line.className = className;\n                    return true;\n                }\n            });\n        }\n        function setLineHidden(handle, hidden) {\n            return changeLine(handle, function(line, no) {\n                if (line.hidden != hidden) {\n                    line.hidden = hidden;\n                    updateLineHeight(line, hidden ? 0 : 1);\n                    if (hidden && (sel.from.line == no || sel.to.line == no))\n                        setSelection(skipHidden(sel.from, sel.from.line, sel.from.ch),\n                            skipHidden(sel.to, sel.to.line, sel.to.ch));\n                    return (gutterDirty = true);\n                }\n            });\n        }\n\n        function lineInfo(line) {\n            if (typeof line == \"number\") {\n                if (!isLine(line)) return null;\n                var n = line;\n                line = getLine(line);\n                if (!line) return null;\n            }\n            else {\n                var n = lineNo(line);\n                if (n == null) return null;\n            }\n            var marker = line.gutterMarker;\n            return {line: n, handle: line, text: line.text, markerText: marker && marker.text,\n                markerClass: marker && marker.style, lineClass: line.className};\n        }\n\n        function stringWidth(str) {\n            measure.innerHTML = \"<pre><span>x</span></pre>\";\n            measure.firstChild.firstChild.firstChild.nodeValue = str;\n            return measure.firstChild.firstChild.offsetWidth || 10;\n        }\n        // These are used to go from pixel positions to character\n        // positions, taking varying character widths into account.\n        function charFromX(line, x) {\n            if (x <= 0) return 0;\n            var lineObj = getLine(line), text = lineObj.text;\n            function getX(len) {\n                measure.innerHTML = \"<pre><span>\" + lineObj.getHTML(null, null, false, tabText, len) + \"</span></pre>\";\n                return measure.firstChild.firstChild.offsetWidth;\n            }\n            var from = 0, fromX = 0, to = text.length, toX;\n            // Guess a suitable upper bound for our search.\n            var estimated = Math.min(to, Math.ceil(x / charWidth()));\n            for (;;) {\n                var estX = getX(estimated);\n                if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));\n                else {toX = estX; to = estimated; break;}\n            }\n            if (x > toX) return to;\n            // Try to guess a suitable lower bound as well.\n            estimated = Math.floor(to * 0.8); estX = getX(estimated);\n            if (estX < x) {from = estimated; fromX = estX;}\n            // Do a binary search between these bounds.\n            for (;;) {\n                if (to - from <= 1) return (toX - x > x - fromX) ? from : to;\n                var middle = Math.ceil((from + to) / 2), middleX = getX(middle);\n                if (middleX > x) {to = middle; toX = middleX;}\n                else {from = middle; fromX = middleX;}\n            }\n        }\n\n        var tempId = Math.floor(Math.random() * 0xffffff).toString(16);\n        function measureLine(line, ch) {\n            var extra = \"\";\n            // Include extra text at the end to make sure the measured line is wrapped in the right way.\n            if (options.lineWrapping) {\n                var end = line.text.indexOf(\" \", ch + 2);\n                extra = htmlEscape(line.text.slice(ch + 1, end < 0 ? line.text.length : end + (ie ? 5 : 0)));\n            }\n            measure.innerHTML = \"<pre>\" + line.getHTML(null, null, false, tabText, ch) +\n                '<span id=\"CodeMirror-temp-' + tempId + '\">' + htmlEscape(line.text.charAt(ch) || \" \") + \"</span>\" +\n                extra + \"</pre>\";\n            var elt = document.getElementById(\"CodeMirror-temp-\" + tempId);\n            var top = elt.offsetTop, left = elt.offsetLeft;\n            // Older IEs report zero offsets for spans directly after a wrap\n            if (ie && ch && top == 0 && left == 0) {\n                var backup = document.createElement(\"span\");\n                backup.innerHTML = \"x\";\n                elt.parentNode.insertBefore(backup, elt.nextSibling);\n                top = backup.offsetTop;\n            }\n            return {top: top, left: left};\n        }\n        function localCoords(pos, inLineWrap) {\n            var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0));\n            if (pos.ch == 0) x = 0;\n            else {\n                var sp = measureLine(getLine(pos.line), pos.ch);\n                x = sp.left;\n                if (options.lineWrapping) y += Math.max(0, sp.top);\n            }\n            return {x: x, y: y, yBot: y + lh};\n        }\n        // Coords must be lineSpace-local\n        function coordsChar(x, y) {\n            if (y < 0) y = 0;\n            var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th);\n            var lineNo = lineAtHeight(doc, heightPos);\n            if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length};\n            var lineObj = getLine(lineNo), text = lineObj.text;\n            var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0;\n            if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0};\n            function getX(len) {\n                var sp = measureLine(lineObj, len);\n                if (tw) {\n                    var off = Math.round(sp.top / th);\n                    return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth);\n                }\n                return sp.left;\n            }\n            var from = 0, fromX = 0, to = text.length, toX;\n            // Guess a suitable upper bound for our search.\n            var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw));\n            for (;;) {\n                var estX = getX(estimated);\n                if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));\n                else {toX = estX; to = estimated; break;}\n            }\n            if (x > toX) return {line: lineNo, ch: to};\n            // Try to guess a suitable lower bound as well.\n            estimated = Math.floor(to * 0.8); estX = getX(estimated);\n            if (estX < x) {from = estimated; fromX = estX;}\n            // Do a binary search between these bounds.\n            for (;;) {\n                if (to - from <= 1) return {line: lineNo, ch: (toX - x > x - fromX) ? from : to};\n                var middle = Math.ceil((from + to) / 2), middleX = getX(middle);\n                if (middleX > x) {to = middle; toX = middleX;}\n                else {from = middle; fromX = middleX;}\n            }\n        }\n        function pageCoords(pos) {\n            var local = localCoords(pos, true), off = eltOffset(lineSpace);\n            return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot};\n        }\n\n        var cachedHeight, cachedHeightFor, measureText;\n        function textHeight() {\n            if (measureText == null) {\n                measureText = \"<pre>\";\n                for (var i = 0; i < 49; ++i) measureText += \"x<br/>\";\n                measureText += \"x</pre>\";\n            }\n            var offsetHeight = lineDiv.clientHeight;\n            if (offsetHeight == cachedHeightFor) return cachedHeight;\n            cachedHeightFor = offsetHeight;\n            measure.innerHTML = measureText;\n            cachedHeight = measure.firstChild.offsetHeight / 50 || 1;\n            measure.innerHTML = \"\";\n            return cachedHeight;\n        }\n        var cachedWidth, cachedWidthFor = 0;\n        function charWidth() {\n            if (scroller.clientWidth == cachedWidthFor) return cachedWidth;\n            cachedWidthFor = scroller.clientWidth;\n            return (cachedWidth = stringWidth(\"x\"));\n        }\n        function paddingTop() {return lineSpace.offsetTop;}\n        function paddingLeft() {return lineSpace.offsetLeft;}\n\n        function posFromMouse(e, liberal) {\n            var offW = eltOffset(scroller, true), x, y;\n            // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n            try { x = e.clientX; y = e.clientY; } catch (e) { return null; }\n            // This is a mess of a heuristic to try and determine whether a\n            // scroll-bar was clicked or not, and to return null if one was\n            // (and !liberal).\n            if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight))\n                return null;\n            var offL = eltOffset(lineSpace, true);\n            return coordsChar(x - offL.left, y - offL.top);\n        }\n        function onContextMenu(e) {\n            var pos = posFromMouse(e);\n            if (!pos || window.opera) return; // Opera is difficult.\n            if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))\n                operation(setCursor)(pos.line, pos.ch);\n\n            var oldCSS = input.style.cssText;\n            inputDiv.style.position = \"absolute\";\n            input.style.cssText = \"position: fixed; width: 30px; height: 30px; top: \" + (e.clientY - 5) +\n                \"px; left: \" + (e.clientX - 5) + \"px; z-index: 1000; background: white; \" +\n                \"border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n            leaveInputAlone = true;\n            var val = input.value = getSelection();\n            focusInput();\n            input.select();\n            function rehide() {\n                var newVal = splitLines(input.value).join(\"\\n\");\n                if (newVal != val) operation(replaceSelection)(newVal, \"end\");\n                inputDiv.style.position = \"relative\";\n                input.style.cssText = oldCSS;\n                leaveInputAlone = false;\n                resetInput(true);\n                slowPoll();\n            }\n\n            if (gecko) {\n                e_stop(e);\n                var mouseup = connect(window, \"mouseup\", function() {\n                    mouseup();\n                    setTimeout(rehide, 20);\n                }, true);\n            }\n            else {\n                setTimeout(rehide, 50);\n            }\n        }\n\n        // Cursor-blinking\n        function restartBlink() {\n            clearInterval(blinker);\n            var on = true;\n            cursor.style.visibility = \"\";\n            blinker = setInterval(function() {\n                cursor.style.visibility = (on = !on) ? \"\" : \"hidden\";\n            }, 650);\n        }\n\n        var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\"};\n        function matchBrackets(autoclear) {\n            var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1;\n            var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];\n            if (!match) return;\n            var ch = match.charAt(0), forward = match.charAt(1) == \">\", d = forward ? 1 : -1, st = line.styles;\n            for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2)\n                if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;}\n\n            var stack = [line.text.charAt(pos)], re = /[(){}[\\]]/;\n            function scan(line, from, to) {\n                if (!line.text) return;\n                var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur;\n                for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) {\n                    var text = st[i];\n                    if (st[i+1] != null && st[i+1] != style) {pos += d * text.length; continue;}\n                    for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) {\n                        if (pos >= from && pos < to && re.test(cur = text.charAt(j))) {\n                            var match = matching[cur];\n                            if (match.charAt(1) == \">\" == forward) stack.push(cur);\n                            else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};\n                            else if (!stack.length) return {pos: pos, match: true};\n                        }\n                    }\n                }\n            }\n            for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) {\n                var line = getLine(i), first = i == head.line;\n                var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length);\n                if (found) break;\n            }\n            if (!found) found = {pos: null, match: false};\n            var style = found.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n            var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style),\n                two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style);\n            var clear = operation(function(){one.clear(); two && two.clear();});\n            if (autoclear) setTimeout(clear, 800);\n            else bracketHighlighted = clear;\n        }\n\n        // Finds the line to start with when starting a parse. Tries to\n        // find a line with a stateAfter, so that it can start with a\n        // valid state. If that fails, it returns the line with the\n        // smallest indentation, which tends to need the least context to\n        // parse correctly.\n        function findStartLine(n) {\n            var minindent, minline;\n            for (var search = n, lim = n - 40; search > lim; --search) {\n                if (search == 0) return 0;\n                var line = getLine(search-1);\n                if (line.stateAfter) return search;\n                var indented = line.indentation(options.tabSize);\n                if (minline == null || minindent > indented) {\n                    minline = search - 1;\n                    minindent = indented;\n                }\n            }\n            return minline;\n        }\n        function getStateBefore(n) {\n            var start = findStartLine(n), state = start && getLine(start-1).stateAfter;\n            if (!state) state = startState(mode);\n            else state = copyState(mode, state);\n            doc.iter(start, n, function(line) {\n                line.highlight(mode, state, options.tabSize);\n                line.stateAfter = copyState(mode, state);\n            });\n            if (start < n) changes.push({from: start, to: n});\n            if (n < doc.size && !getLine(n).stateAfter) work.push(n);\n            return state;\n        }\n        function highlightLines(start, end) {\n            var state = getStateBefore(start);\n            doc.iter(start, end, function(line) {\n                line.highlight(mode, state, options.tabSize);\n                line.stateAfter = copyState(mode, state);\n            });\n        }\n        function highlightWorker() {\n            var end = +new Date + options.workTime;\n            var foundWork = work.length;\n            while (work.length) {\n                if (!getLine(showingFrom).stateAfter) var task = showingFrom;\n                else var task = work.pop();\n                if (task >= doc.size) continue;\n                var start = findStartLine(task), state = start && getLine(start-1).stateAfter;\n                if (state) state = copyState(mode, state);\n                else state = startState(mode);\n\n                var unchanged = 0, compare = mode.compareStates, realChange = false,\n                    i = start, bail = false;\n                doc.iter(i, doc.size, function(line) {\n                    var hadState = line.stateAfter;\n                    if (+new Date > end) {\n                        work.push(i);\n                        startWorker(options.workDelay);\n                        if (realChange) changes.push({from: task, to: i + 1});\n                        return (bail = true);\n                    }\n                    var changed = line.highlight(mode, state, options.tabSize);\n                    if (changed) realChange = true;\n                    line.stateAfter = copyState(mode, state);\n                    if (compare) {\n                        if (hadState && compare(hadState, state)) return true;\n                    } else {\n                        if (changed !== false || !hadState) unchanged = 0;\n                        else if (++unchanged > 3 && (!mode.indent || mode.indent(hadState, \"\") == mode.indent(state, \"\")))\n                            return true;\n                    }\n                    ++i;\n                });\n                if (bail) return;\n                if (realChange) changes.push({from: task, to: i + 1});\n            }\n            if (foundWork && options.onHighlightComplete)\n                options.onHighlightComplete(instance);\n        }\n        function startWorker(time) {\n            if (!work.length) return;\n            highlight.set(time, operation(highlightWorker));\n        }\n\n        // Operations are used to wrap changes in such a way that each\n        // change won't have to update the cursor and display (which would\n        // be awkward, slow, and error-prone), but instead updates are\n        // batched and then all combined and executed at once.\n        function startOperation() {\n            updateInput = userSelChange = textChanged = null;\n            changes = []; selectionChanged = false; callbacks = [];\n        }\n        function endOperation() {\n            var reScroll = false, updated;\n            if (selectionChanged) reScroll = !scrollCursorIntoView();\n            if (changes.length) updated = updateDisplay(changes, true);\n            else {\n                if (selectionChanged) updateCursor();\n                if (gutterDirty) updateGutter();\n            }\n            if (reScroll) scrollCursorIntoView();\n            if (selectionChanged) {scrollEditorIntoView(); restartBlink();}\n\n            if (focused && !leaveInputAlone &&\n                (updateInput === true || (updateInput !== false && selectionChanged)))\n                resetInput(userSelChange);\n\n            if (selectionChanged && options.matchBrackets)\n                setTimeout(operation(function() {\n                    if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;}\n                    if (posEq(sel.from, sel.to)) matchBrackets(false);\n                }), 20);\n            var tc = textChanged, cbs = callbacks; // these can be reset by callbacks\n            if (selectionChanged && options.onCursorActivity)\n                options.onCursorActivity(instance);\n            if (tc && options.onChange && instance)\n                options.onChange(instance, tc);\n            for (var i = 0; i < cbs.length; ++i) cbs[i](instance);\n            if (updated && options.onUpdate) options.onUpdate(instance);\n        }\n        var nestedOperation = 0;\n        function operation(f) {\n            return function() {\n                if (!nestedOperation++) startOperation();\n                try {var result = f.apply(this, arguments);}\n                finally {if (!--nestedOperation) endOperation();}\n                return result;\n            };\n        }\n\n        for (var ext in extensions)\n            if (extensions.propertyIsEnumerable(ext) &&\n                !instance.propertyIsEnumerable(ext))\n                instance[ext] = extensions[ext];\n        return instance;\n    } // (end of function CodeMirror)\n\n    // The default configuration options.\n    CodeMirror.defaults = {\n        value: \"\",\n        mode: null,\n        theme: \"default\",\n        indentUnit: 2,\n        indentWithTabs: false,\n        tabSize: 4,\n        keyMap: \"default\",\n        extraKeys: null,\n        electricChars: true,\n        onKeyEvent: null,\n        lineWrapping: false,\n        lineNumbers: false,\n        gutter: false,\n        fixedGutter: false,\n        firstLineNumber: 1,\n        readOnly: false,\n        onChange: null,\n        onCursorActivity: null,\n        onGutterClick: null,\n        onHighlightComplete: null,\n        onUpdate: null,\n        onFocus: null, onBlur: null, onScroll: null,\n        matchBrackets: false,\n        workTime: 100,\n        workDelay: 200,\n        pollInterval: 100,\n        undoDepth: 40,\n        tabindex: null,\n        document: window.document\n    };\n\n    var mac = /Mac/.test(navigator.platform);\n    var win = /Win/.test(navigator.platform);\n\n    // Known modes, by name and by MIME\n    var modes = {}, mimeModes = {};\n    CodeMirror.defineMode = function(name, mode) {\n        if (!CodeMirror.defaults.mode && name != \"null\") CodeMirror.defaults.mode = name;\n        modes[name] = mode;\n    };\n    CodeMirror.defineMIME = function(mime, spec) {\n        mimeModes[mime] = spec;\n    };\n    CodeMirror.getMode = function(options, spec) {\n        if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec))\n            spec = mimeModes[spec];\n        if (typeof spec == \"string\")\n            var mname = spec, config = {};\n        else if (spec != null)\n            var mname = spec.name, config = spec;\n        var mfactory = modes[mname];\n        if (!mfactory) {\n            if (window.console) console.warn(\"No mode \" + mname + \" found, falling back to plain text.\");\n            return CodeMirror.getMode(options, \"text/plain\");\n        }\n        return mfactory(options, config || {});\n    };\n    CodeMirror.listModes = function() {\n        var list = [];\n        for (var m in modes)\n            if (modes.propertyIsEnumerable(m)) list.push(m);\n        return list;\n    };\n    CodeMirror.listMIMEs = function() {\n        var list = [];\n        for (var m in mimeModes)\n            if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]});\n        return list;\n    };\n\n    var extensions = CodeMirror.extensions = {};\n    CodeMirror.defineExtension = function(name, func) {\n        extensions[name] = func;\n    };\n\n    var commands = CodeMirror.commands = {\n        selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});},\n        killLine: function(cm) {\n            var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);\n            if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange(\"\", from, {line: from.line + 1, ch: 0});\n            else cm.replaceRange(\"\", from, sel ? to : {line: from.line});\n        },\n        deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange(\"\", {line: l, ch: 0}, {line: l});},\n        undo: function(cm) {cm.undo();},\n        redo: function(cm) {cm.redo();},\n        goDocStart: function(cm) {cm.setCursor(0, 0, true);},\n        goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);},\n        goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);},\n        goLineStartSmart: function(cm) {\n            var cur = cm.getCursor();\n            var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\\S/));\n            cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true);\n        },\n        goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);},\n        goLineUp: function(cm) {cm.moveV(-1, \"line\");},\n        goLineDown: function(cm) {cm.moveV(1, \"line\");},\n        goPageUp: function(cm) {cm.moveV(-1, \"page\");},\n        goPageDown: function(cm) {cm.moveV(1, \"page\");},\n        goCharLeft: function(cm) {cm.moveH(-1, \"char\");},\n        goCharRight: function(cm) {cm.moveH(1, \"char\");},\n        goColumnLeft: function(cm) {cm.moveH(-1, \"column\");},\n        goColumnRight: function(cm) {cm.moveH(1, \"column\");},\n        goWordLeft: function(cm) {cm.moveH(-1, \"word\");},\n        goWordRight: function(cm) {cm.moveH(1, \"word\");},\n        delCharLeft: function(cm) {cm.deleteH(-1, \"char\");},\n        delCharRight: function(cm) {cm.deleteH(1, \"char\");},\n        delWordLeft: function(cm) {cm.deleteH(-1, \"word\");},\n        delWordRight: function(cm) {cm.deleteH(1, \"word\");},\n        indentAuto: function(cm) {cm.indentSelection(\"smart\");},\n        indentMore: function(cm) {cm.indentSelection(\"add\");},\n        indentLess: function(cm) {cm.indentSelection(\"subtract\");},\n        insertTab: function(cm) {cm.replaceSelection(\"\\t\", \"end\");},\n        transposeChars: function(cm) {\n            var cur = cm.getCursor(), line = cm.getLine(cur.line);\n            if (cur.ch > 0 && cur.ch < line.length - 1)\n                cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),\n                    {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1});\n        },\n        newlineAndIndent: function(cm) {\n            cm.replaceSelection(\"\\n\", \"end\");\n            cm.indentLine(cm.getCursor().line);\n        },\n        toggleOverwrite: function(cm) {cm.toggleOverwrite();}\n    };\n\n    var keyMap = CodeMirror.keyMap = {};\n    keyMap.basic = {\n        \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n        \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n        \"Delete\": \"delCharRight\", \"Backspace\": \"delCharLeft\", \"Tab\": \"indentMore\", \"Shift-Tab\": \"indentLess\",\n        \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\"\n    };\n    // Note that the save and find-related commands aren't defined by\n    // default. Unknown commands are simply ignored.\n    keyMap.pcDefault = {\n        \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n        \"Ctrl-Home\": \"goDocStart\", \"Alt-Up\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Down\": \"goDocEnd\",\n        \"Ctrl-Left\": \"goWordLeft\", \"Ctrl-Right\": \"goWordRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n        \"Ctrl-Backspace\": \"delWordLeft\", \"Ctrl-Delete\": \"delWordRight\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n        \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n        fallthrough: \"basic\"\n    };\n    keyMap.macDefault = {\n        \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n        \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goWordLeft\",\n        \"Alt-Right\": \"goWordRight\", \"Cmd-Left\": \"goLineStart\", \"Cmd-Right\": \"goLineEnd\", \"Alt-Backspace\": \"delWordLeft\",\n        \"Ctrl-Alt-Backspace\": \"delWordRight\", \"Alt-Delete\": \"delWordRight\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n        \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n        fallthrough: [\"basic\", \"emacsy\"]\n    };\n    keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n    keyMap.emacsy = {\n        \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n        \"Alt-F\": \"goWordRight\", \"Alt-B\": \"goWordLeft\", \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n        \"Ctrl-V\": \"goPageUp\", \"Shift-Ctrl-V\": \"goPageDown\", \"Ctrl-D\": \"delCharRight\", \"Ctrl-H\": \"delCharLeft\",\n        \"Alt-D\": \"delWordRight\", \"Alt-Backspace\": \"delWordLeft\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\"\n    };\n\n    function lookupKey(name, extraMap, map) {\n        function lookup(name, map, ft) {\n            var found = map[name];\n            if (found != null) return found;\n            if (ft == null) ft = map.fallthrough;\n            if (ft == null) return map.catchall;\n            if (typeof ft == \"string\") return lookup(name, keyMap[ft]);\n            for (var i = 0, e = ft.length; i < e; ++i) {\n                found = lookup(name, keyMap[ft[i]]);\n                if (found != null) return found;\n            }\n            return null;\n        }\n        return extraMap ? lookup(name, extraMap, map) : lookup(name, keyMap[map]);\n    }\n    function isModifierKey(event) {\n        var name = keyNames[event.keyCode];\n        return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\";\n    }\n\n    CodeMirror.fromTextArea = function(textarea, options) {\n        if (!options) options = {};\n        options.value = textarea.value;\n        if (!options.tabindex && textarea.tabindex)\n            options.tabindex = textarea.tabindex;\n\n        function save() {textarea.value = instance.getValue();}\n        if (textarea.form) {\n            // Deplorable hack to make the submit method do the right thing.\n            var rmSubmit = connect(textarea.form, \"submit\", save, true);\n            if (typeof textarea.form.submit == \"function\") {\n                var realSubmit = textarea.form.submit;\n                function wrappedSubmit() {\n                    save();\n                    textarea.form.submit = realSubmit;\n                    textarea.form.submit();\n                    textarea.form.submit = wrappedSubmit;\n                }\n                textarea.form.submit = wrappedSubmit;\n            }\n        }\n\n        textarea.style.display = \"none\";\n        var instance = CodeMirror(function(node) {\n            textarea.parentNode.insertBefore(node, textarea.nextSibling);\n        }, options);\n        instance.save = save;\n        instance.getTextArea = function() { return textarea; };\n        instance.toTextArea = function() {\n            save();\n            textarea.parentNode.removeChild(instance.getWrapperElement());\n            textarea.style.display = \"\";\n            if (textarea.form) {\n                rmSubmit();\n                if (typeof textarea.form.submit == \"function\")\n                    textarea.form.submit = realSubmit;\n            }\n        };\n        return instance;\n    };\n\n    // Utility functions for working with state. Exported because modes\n    // sometimes need to do this.\n    function copyState(mode, state) {\n        if (state === true) return state;\n        if (mode.copyState) return mode.copyState(state);\n        var nstate = {};\n        for (var n in state) {\n            var val = state[n];\n            if (val instanceof Array) val = val.concat([]);\n            nstate[n] = val;\n        }\n        return nstate;\n    }\n    CodeMirror.copyState = copyState;\n    function startState(mode, a1, a2) {\n        return mode.startState ? mode.startState(a1, a2) : true;\n    }\n    CodeMirror.startState = startState;\n\n    // The character stream used by a mode's parser.\n    function StringStream(string, tabSize) {\n        this.pos = this.start = 0;\n        this.string = string;\n        this.tabSize = tabSize || 8;\n    }\n    StringStream.prototype = {\n        eol: function() {return this.pos >= this.string.length;},\n        sol: function() {return this.pos == 0;},\n        peek: function() {return this.string.charAt(this.pos);},\n        next: function() {\n            if (this.pos < this.string.length)\n                return this.string.charAt(this.pos++);\n        },\n        eat: function(match) {\n            var ch = this.string.charAt(this.pos);\n            if (typeof match == \"string\") var ok = ch == match;\n            else var ok = ch && (match.test ? match.test(ch) : match(ch));\n            if (ok) {++this.pos; return ch;}\n        },\n        eatWhile: function(match) {\n            var start = this.pos;\n            while (this.eat(match)){}\n            return this.pos > start;\n        },\n        eatSpace: function() {\n            var start = this.pos;\n            while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;\n            return this.pos > start;\n        },\n        skipToEnd: function() {this.pos = this.string.length;},\n        skipTo: function(ch) {\n            var found = this.string.indexOf(ch, this.pos);\n            if (found > -1) {this.pos = found; return true;}\n        },\n        backUp: function(n) {this.pos -= n;},\n        column: function() {return countColumn(this.string, this.start, this.tabSize);},\n        indentation: function() {return countColumn(this.string, null, this.tabSize);},\n        match: function(pattern, consume, caseInsensitive) {\n            if (typeof pattern == \"string\") {\n                function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}\n                if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {\n                    if (consume !== false) this.pos += pattern.length;\n                    return true;\n                }\n            }\n            else {\n                var match = this.string.slice(this.pos).match(pattern);\n                if (match && consume !== false) this.pos += match[0].length;\n                return match;\n            }\n        },\n        current: function(){return this.string.slice(this.start, this.pos);}\n    };\n    CodeMirror.StringStream = StringStream;\n\n    function MarkedText(from, to, className, set) {\n        this.from = from; this.to = to; this.style = className; this.set = set;\n    }\n    MarkedText.prototype = {\n        attach: function(line) { this.set.push(line); },\n        detach: function(line) {\n            var ix = indexOf(this.set, line);\n            if (ix > -1) this.set.splice(ix, 1);\n        },\n        split: function(pos, lenBefore) {\n            if (this.to <= pos && this.to != null) return null;\n            var from = this.from < pos || this.from == null ? null : this.from - pos + lenBefore;\n            var to = this.to == null ? null : this.to - pos + lenBefore;\n            return new MarkedText(from, to, this.style, this.set);\n        },\n        dup: function() { return new MarkedText(null, null, this.style, this.set); },\n        clipTo: function(fromOpen, from, toOpen, to, diff) {\n            if (this.from != null && this.from >= from)\n                this.from = Math.max(to, this.from) + diff;\n            if (this.to != null && this.to > from)\n                this.to = to < this.to ? this.to + diff : from;\n            if (fromOpen && to > this.from && (to < this.to || this.to == null))\n                this.from = null;\n            if (toOpen && (from < this.to || this.to == null) && (from > this.from || this.from == null))\n                this.to = null;\n        },\n        isDead: function() { return this.from != null && this.to != null && this.from >= this.to; },\n        sameSet: function(x) { return this.set == x.set; }\n    };\n\n    function Bookmark(pos) {\n        this.from = pos; this.to = pos; this.line = null;\n    }\n    Bookmark.prototype = {\n        attach: function(line) { this.line = line; },\n        detach: function(line) { if (this.line == line) this.line = null; },\n        split: function(pos, lenBefore) {\n            if (pos < this.from) {\n                this.from = this.to = (this.from - pos) + lenBefore;\n                return this;\n            }\n        },\n        isDead: function() { return this.from > this.to; },\n        clipTo: function(fromOpen, from, toOpen, to, diff) {\n            if ((fromOpen || from < this.from) && (toOpen || to > this.to)) {\n                this.from = 0; this.to = -1;\n            } else if (this.from > from) {\n                this.from = this.to = Math.max(to, this.from) + diff;\n            }\n        },\n        sameSet: function(x) { return false; },\n        find: function() {\n            if (!this.line || !this.line.parent) return null;\n            return {line: lineNo(this.line), ch: this.from};\n        },\n        clear: function() {\n            if (this.line) {\n                var found = indexOf(this.line.marked, this);\n                if (found != -1) this.line.marked.splice(found, 1);\n                this.line = null;\n            }\n        }\n    };\n\n    // Line objects. These hold state related to a line, including\n    // highlighting info (the styles array).\n    function Line(text, styles) {\n        this.styles = styles || [text, null];\n        this.text = text;\n        this.height = 1;\n        this.marked = this.gutterMarker = this.className = this.handlers = null;\n        this.stateAfter = this.parent = this.hidden = null;\n    }\n    Line.inheritMarks = function(text, orig) {\n        var ln = new Line(text), mk = orig && orig.marked;\n        if (mk) {\n            for (var i = 0; i < mk.length; ++i) {\n                if (mk[i].to == null && mk[i].style) {\n                    var newmk = ln.marked || (ln.marked = []), mark = mk[i];\n                    var nmark = mark.dup(); newmk.push(nmark); nmark.attach(ln);\n                }\n            }\n        }\n        return ln;\n    }\n    Line.prototype = {\n        // Replace a piece of a line, keeping the styles around it intact.\n        replace: function(from, to_, text) {\n            var st = [], mk = this.marked, to = to_ == null ? this.text.length : to_;\n            copyStyles(0, from, this.styles, st);\n            if (text) st.push(text, null);\n            copyStyles(to, this.text.length, this.styles, st);\n            this.styles = st;\n            this.text = this.text.slice(0, from) + text + this.text.slice(to);\n            this.stateAfter = null;\n            if (mk) {\n                var diff = text.length - (to - from);\n                for (var i = 0, mark = mk[i]; i < mk.length; ++i) {\n                    mark.clipTo(from == null, from || 0, to_ == null, to, diff);\n                    if (mark.isDead()) {mark.detach(this); mk.splice(i--, 1);}\n                }\n            }\n        },\n        // Split a part off a line, keeping styles and markers intact.\n        split: function(pos, textBefore) {\n            var st = [textBefore, null], mk = this.marked;\n            copyStyles(pos, this.text.length, this.styles, st);\n            var taken = new Line(textBefore + this.text.slice(pos), st);\n            if (mk) {\n                for (var i = 0; i < mk.length; ++i) {\n                    var mark = mk[i];\n                    var newmark = mark.split(pos, textBefore.length);\n                    if (newmark) {\n                        if (!taken.marked) taken.marked = [];\n                        taken.marked.push(newmark); newmark.attach(taken);\n                    }\n                }\n            }\n            return taken;\n        },\n        append: function(line) {\n            var mylen = this.text.length, mk = line.marked, mymk = this.marked;\n            this.text += line.text;\n            copyStyles(0, line.text.length, line.styles, this.styles);\n            if (mymk) {\n                for (var i = 0; i < mymk.length; ++i)\n                    if (mymk[i].to == null) mymk[i].to = mylen;\n            }\n            if (mk && mk.length) {\n                if (!mymk) this.marked = mymk = [];\n                outer: for (var i = 0; i < mk.length; ++i) {\n                    var mark = mk[i];\n                    if (!mark.from) {\n                        for (var j = 0; j < mymk.length; ++j) {\n                            var mymark = mymk[j];\n                            if (mymark.to == mylen && mymark.sameSet(mark)) {\n                                mymark.to = mark.to == null ? null : mark.to + mylen;\n                                if (mymark.isDead()) {\n                                    mymark.detach(this);\n                                    mk.splice(i--, 1);\n                                }\n                                continue outer;\n                            }\n                        }\n                    }\n                    mymk.push(mark);\n                    mark.attach(this);\n                    mark.from += mylen;\n                    if (mark.to != null) mark.to += mylen;\n                }\n            }\n        },\n        fixMarkEnds: function(other) {\n            var mk = this.marked, omk = other.marked;\n            if (!mk) return;\n            for (var i = 0; i < mk.length; ++i) {\n                var mark = mk[i], close = mark.to == null;\n                if (close && omk) {\n                    for (var j = 0; j < omk.length; ++j)\n                        if (omk[j].sameSet(mark)) {close = false; break;}\n                }\n                if (close) mark.to = this.text.length;\n            }\n        },\n        fixMarkStarts: function() {\n            var mk = this.marked;\n            if (!mk) return;\n            for (var i = 0; i < mk.length; ++i)\n                if (mk[i].from == null) mk[i].from = 0;\n        },\n        addMark: function(mark) {\n            mark.attach(this);\n            if (this.marked == null) this.marked = [];\n            this.marked.push(mark);\n            this.marked.sort(function(a, b){return (a.from || 0) - (b.from || 0);});\n        },\n        // Run the given mode's parser over a line, update the styles\n        // array, which contains alternating fragments of text and CSS\n        // classes.\n        highlight: function(mode, state, tabSize) {\n            var stream = new StringStream(this.text, tabSize), st = this.styles, pos = 0;\n            var changed = false, curWord = st[0], prevWord;\n            if (this.text == \"\" && mode.blankLine) mode.blankLine(state);\n            while (!stream.eol()) {\n                var style = mode.token(stream, state);\n                var substr = this.text.slice(stream.start, stream.pos);\n                stream.start = stream.pos;\n                if (pos && st[pos-1] == style)\n                    st[pos-2] += substr;\n                else if (substr) {\n                    if (!changed && (st[pos+1] != style || (pos && st[pos-2] != prevWord))) changed = true;\n                    st[pos++] = substr; st[pos++] = style;\n                    prevWord = curWord; curWord = st[pos];\n                }\n                // Give up when line is ridiculously long\n                if (stream.pos > 5000) {\n                    st[pos++] = this.text.slice(stream.pos); st[pos++] = null;\n                    break;\n                }\n            }\n            if (st.length != pos) {st.length = pos; changed = true;}\n            if (pos && st[pos-2] != prevWord) changed = true;\n            // Short lines with simple highlights return null, and are\n            // counted as changed by the driver because they are likely to\n            // highlight the same way in various contexts.\n            return changed || (st.length < 5 && this.text.length < 10 ? null : false);\n        },\n        // Fetch the parser token for a given character. Useful for hacks\n        // that want to inspect the mode state (say, for completion).\n        getTokenAt: function(mode, state, ch) {\n            var txt = this.text, stream = new StringStream(txt);\n            while (stream.pos < ch && !stream.eol()) {\n                stream.start = stream.pos;\n                var style = mode.token(stream, state);\n            }\n            return {start: stream.start,\n                end: stream.pos,\n                string: stream.current(),\n                className: style || null,\n                state: state};\n        },\n        indentation: function(tabSize) {return countColumn(this.text, null, tabSize);},\n        // Produces an HTML fragment for the line, taking selection,\n        // marking, and highlighting into account.\n        getHTML: function(sfrom, sto, includePre, tabText, endAt) {\n            var html = [], first = true;\n            if (includePre)\n                html.push(this.className ? '<pre class=\"' + this.className + '\">': \"<pre>\");\n            function span(text, style) {\n                if (!text) return;\n                // Work around a bug where, in some compat modes, IE ignores leading spaces\n                if (first && ie && text.charAt(0) == \" \") text = \"\\u00a0\" + text.slice(1);\n                first = false;\n                if (style) html.push('<span class=\"', style, '\">', htmlEscape(text).replace(/\\t/g, tabText), \"</span>\");\n                else html.push(htmlEscape(text).replace(/\\t/g, tabText));\n            }\n            var st = this.styles, allText = this.text, marked = this.marked;\n            if (sfrom == sto) sfrom = null;\n            var len = allText.length;\n            if (endAt != null) len = Math.min(endAt, len);\n\n            if (!allText && endAt == null)\n                span(\" \", sfrom != null && sto == null ? \"CodeMirror-selected\" : null);\n            else if (!marked && sfrom == null)\n                for (var i = 0, ch = 0; ch < len; i+=2) {\n                    var str = st[i], style = st[i+1], l = str.length;\n                    if (ch + l > len) str = str.slice(0, len - ch);\n                    ch += l;\n                    span(str, style && \"cm-\" + style);\n                }\n            else {\n                var pos = 0, i = 0, text = \"\", style, sg = 0;\n                var markpos = -1, mark = null;\n                function nextMark() {\n                    if (marked) {\n                        markpos += 1;\n                        mark = (markpos < marked.length) ? marked[markpos] : null;\n                    }\n                }\n                nextMark();\n                while (pos < len) {\n                    var upto = len;\n                    var extraStyle = \"\";\n                    if (sfrom != null) {\n                        if (sfrom > pos) upto = sfrom;\n                        else if (sto == null || sto > pos) {\n                            extraStyle = \" CodeMirror-selected\";\n                            if (sto != null) upto = Math.min(upto, sto);\n                        }\n                    }\n                    while (mark && mark.to != null && mark.to <= pos) nextMark();\n                    if (mark) {\n                        if (mark.from > pos) upto = Math.min(upto, mark.from);\n                        else {\n                            extraStyle += \" \" + mark.style;\n                            if (mark.to != null) upto = Math.min(upto, mark.to);\n                        }\n                    }\n                    for (;;) {\n                        var end = pos + text.length;\n                        var appliedStyle = style;\n                        if (extraStyle) appliedStyle = style ? style + extraStyle : extraStyle;\n                        span(end > upto ? text.slice(0, upto - pos) : text, appliedStyle);\n                        if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}\n                        pos = end;\n                        text = st[i++]; style = \"cm-\" + st[i++];\n                    }\n                }\n                if (sfrom != null && sto == null) span(\" \", \"CodeMirror-selected\");\n            }\n            if (includePre) html.push(\"</pre>\");\n            return html.join(\"\");\n        },\n        cleanUp: function() {\n            this.parent = null;\n            if (this.marked)\n                for (var i = 0, e = this.marked.length; i < e; ++i) this.marked[i].detach(this);\n        }\n    };\n    // Utility used by replace and split above\n    function copyStyles(from, to, source, dest) {\n        for (var i = 0, pos = 0, state = 0; pos < to; i+=2) {\n            var part = source[i], end = pos + part.length;\n            if (state == 0) {\n                if (end > from) dest.push(part.slice(from - pos, Math.min(part.length, to - pos)), source[i+1]);\n                if (end >= from) state = 1;\n            }\n            else if (state == 1) {\n                if (end > to) dest.push(part.slice(0, to - pos), source[i+1]);\n                else dest.push(part, source[i+1]);\n            }\n            pos = end;\n        }\n    }\n\n    // Data structure that holds the sequence of lines.\n    function LeafChunk(lines) {\n        this.lines = lines;\n        this.parent = null;\n        for (var i = 0, e = lines.length, height = 0; i < e; ++i) {\n            lines[i].parent = this;\n            height += lines[i].height;\n        }\n        this.height = height;\n    }\n    LeafChunk.prototype = {\n        chunkSize: function() { return this.lines.length; },\n        remove: function(at, n, callbacks) {\n            for (var i = at, e = at + n; i < e; ++i) {\n                var line = this.lines[i];\n                this.height -= line.height;\n                line.cleanUp();\n                if (line.handlers)\n                    for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]);\n            }\n            this.lines.splice(at, n);\n        },\n        collapse: function(lines) {\n            lines.splice.apply(lines, [lines.length, 0].concat(this.lines));\n        },\n        insertHeight: function(at, lines, height) {\n            this.height += height;\n            this.lines.splice.apply(this.lines, [at, 0].concat(lines));\n            for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;\n        },\n        iterN: function(at, n, op) {\n            for (var e = at + n; at < e; ++at)\n                if (op(this.lines[at])) return true;\n        }\n    };\n    function BranchChunk(children) {\n        this.children = children;\n        var size = 0, height = 0;\n        for (var i = 0, e = children.length; i < e; ++i) {\n            var ch = children[i];\n            size += ch.chunkSize(); height += ch.height;\n            ch.parent = this;\n        }\n        this.size = size;\n        this.height = height;\n        this.parent = null;\n    }\n    BranchChunk.prototype = {\n        chunkSize: function() { return this.size; },\n        remove: function(at, n, callbacks) {\n            this.size -= n;\n            for (var i = 0; i < this.children.length; ++i) {\n                var child = this.children[i], sz = child.chunkSize();\n                if (at < sz) {\n                    var rm = Math.min(n, sz - at), oldHeight = child.height;\n                    child.remove(at, rm, callbacks);\n                    this.height -= oldHeight - child.height;\n                    if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n                    if ((n -= rm) == 0) break;\n                    at = 0;\n                } else at -= sz;\n            }\n            if (this.size - n < 25) {\n                var lines = [];\n                this.collapse(lines);\n                this.children = [new LeafChunk(lines)];\n            }\n        },\n        collapse: function(lines) {\n            for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);\n        },\n        insert: function(at, lines) {\n            var height = 0;\n            for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;\n            this.insertHeight(at, lines, height);\n        },\n        insertHeight: function(at, lines, height) {\n            this.size += lines.length;\n            this.height += height;\n            for (var i = 0, e = this.children.length; i < e; ++i) {\n                var child = this.children[i], sz = child.chunkSize();\n                if (at <= sz) {\n                    child.insertHeight(at, lines, height);\n                    if (child.lines && child.lines.length > 50) {\n                        while (child.lines.length > 50) {\n                            var spilled = child.lines.splice(child.lines.length - 25, 25);\n                            var newleaf = new LeafChunk(spilled);\n                            child.height -= newleaf.height;\n                            this.children.splice(i + 1, 0, newleaf);\n                            newleaf.parent = this;\n                        }\n                        this.maybeSpill();\n                    }\n                    break;\n                }\n                at -= sz;\n            }\n        },\n        maybeSpill: function() {\n            if (this.children.length <= 10) return;\n            var me = this;\n            do {\n                var spilled = me.children.splice(me.children.length - 5, 5);\n                var sibling = new BranchChunk(spilled);\n                if (!me.parent) { // Become the parent node\n                    var copy = new BranchChunk(me.children);\n                    copy.parent = me;\n                    me.children = [copy, sibling];\n                    me = copy;\n                } else {\n                    me.size -= sibling.size;\n                    me.height -= sibling.height;\n                    var myIndex = indexOf(me.parent.children, me);\n                    me.parent.children.splice(myIndex + 1, 0, sibling);\n                }\n                sibling.parent = me.parent;\n            } while (me.children.length > 10);\n            me.parent.maybeSpill();\n        },\n        iter: function(from, to, op) { this.iterN(from, to - from, op); },\n        iterN: function(at, n, op) {\n            for (var i = 0, e = this.children.length; i < e; ++i) {\n                var child = this.children[i], sz = child.chunkSize();\n                if (at < sz) {\n                    var used = Math.min(n, sz - at);\n                    if (child.iterN(at, used, op)) return true;\n                    if ((n -= used) == 0) break;\n                    at = 0;\n                } else at -= sz;\n            }\n        }\n    };\n\n    function getLineAt(chunk, n) {\n        while (!chunk.lines) {\n            for (var i = 0;; ++i) {\n                var child = chunk.children[i], sz = child.chunkSize();\n                if (n < sz) { chunk = child; break; }\n                n -= sz;\n            }\n        }\n        return chunk.lines[n];\n    }\n    function lineNo(line) {\n        if (line.parent == null) return null;\n        var cur = line.parent, no = indexOf(cur.lines, line);\n        for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n            for (var i = 0, e = chunk.children.length; ; ++i) {\n                if (chunk.children[i] == cur) break;\n                no += chunk.children[i].chunkSize();\n            }\n        }\n        return no;\n    }\n    function lineAtHeight(chunk, h) {\n        var n = 0;\n        outer: do {\n            for (var i = 0, e = chunk.children.length; i < e; ++i) {\n                var child = chunk.children[i], ch = child.height;\n                if (h < ch) { chunk = child; continue outer; }\n                h -= ch;\n                n += child.chunkSize();\n            }\n            return n;\n        } while (!chunk.lines);\n        for (var i = 0, e = chunk.lines.length; i < e; ++i) {\n            var line = chunk.lines[i], lh = line.height;\n            if (h < lh) break;\n            h -= lh;\n        }\n        return n + i;\n    }\n    function heightAtLine(chunk, n) {\n        var h = 0;\n        outer: do {\n            for (var i = 0, e = chunk.children.length; i < e; ++i) {\n                var child = chunk.children[i], sz = child.chunkSize();\n                if (n < sz) { chunk = child; continue outer; }\n                n -= sz;\n                h += child.height;\n            }\n            return h;\n        } while (!chunk.lines);\n        for (var i = 0; i < n; ++i) h += chunk.lines[i].height;\n        return h;\n    }\n\n    // The history object 'chunks' changes that are made close together\n    // and at almost the same time into bigger undoable units.\n    function History() {\n        this.time = 0;\n        this.done = []; this.undone = [];\n    }\n    History.prototype = {\n        addChange: function(start, added, old) {\n            this.undone.length = 0;\n            var time = +new Date, last = this.done[this.done.length - 1];\n            if (time - this.time > 400 || !last ||\n                last.start > start + added || last.start + last.added < start - last.added + last.old.length)\n                this.done.push({start: start, added: added, old: old});\n            else {\n                var oldoff = 0;\n                if (start < last.start) {\n                    for (var i = last.start - start - 1; i >= 0; --i)\n                        last.old.unshift(old[i]);\n                    last.added += last.start - start;\n                    last.start = start;\n                }\n                else if (last.start < start) {\n                    oldoff = start - last.start;\n                    added += oldoff;\n                }\n                for (var i = last.added - oldoff, e = old.length; i < e; ++i)\n                    last.old.push(old[i]);\n                if (last.added < added) last.added = added;\n            }\n            this.time = time;\n        }\n    };\n\n    function stopMethod() {e_stop(this);}\n    // Ensure an event has a stop method.\n    function addStop(event) {\n        if (!event.stop) event.stop = stopMethod;\n        return event;\n    }\n\n    function e_preventDefault(e) {\n        if (e.preventDefault) e.preventDefault();\n        else e.returnValue = false;\n    }\n    function e_stopPropagation(e) {\n        if (e.stopPropagation) e.stopPropagation();\n        else e.cancelBubble = true;\n    }\n    function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n    CodeMirror.e_stop = e_stop;\n    CodeMirror.e_preventDefault = e_preventDefault;\n    CodeMirror.e_stopPropagation = e_stopPropagation;\n\n    function e_target(e) {return e.target || e.srcElement;}\n    function e_button(e) {\n        if (e.which) return e.which;\n        else if (e.button & 1) return 1;\n        else if (e.button & 2) return 3;\n        else if (e.button & 4) return 2;\n    }\n\n    // Event handler registration. If disconnect is true, it'll return a\n    // function that unregisters the handler.\n    function connect(node, type, handler, disconnect) {\n        if (typeof node.addEventListener == \"function\") {\n            node.addEventListener(type, handler, false);\n            if (disconnect) return function() {node.removeEventListener(type, handler, false);};\n        }\n        else {\n            var wrapHandler = function(event) {handler(event || window.event);};\n            node.attachEvent(\"on\" + type, wrapHandler);\n            if (disconnect) return function() {node.detachEvent(\"on\" + type, wrapHandler);};\n        }\n    }\n    CodeMirror.connect = connect;\n\n    function Delayed() {this.id = null;}\n    Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};\n\n    // Detect drag-and-drop\n    var dragAndDrop = function() {\n        // IE8 has ondragstart and ondrop properties, but doesn't seem to\n        // actually support ondragstart the way it's supposed to work.\n        if (/MSIE [1-8]\\b/.test(navigator.userAgent)) return false;\n        var div = document.createElement('div');\n        return \"draggable\" in div;\n    }();\n\n    var gecko = /gecko\\/\\d{7}/i.test(navigator.userAgent);\n    var ie = /MSIE \\d/.test(navigator.userAgent);\n    var webkit = /WebKit\\//.test(navigator.userAgent);\n\n    var lineSep = \"\\n\";\n    // Feature-detect whether newlines in textareas are converted to \\r\\n\n    (function () {\n        var te = document.createElement(\"textarea\");\n        te.value = \"foo\\nbar\";\n        if (te.value.indexOf(\"\\r\") > -1) lineSep = \"\\r\\n\";\n    }());\n\n    // Counts the column offset in a string, taking tabs into account.\n    // Used mostly to find indentation.\n    function countColumn(string, end, tabSize) {\n        if (end == null) {\n            end = string.search(/[^\\s\\u00a0]/);\n            if (end == -1) end = string.length;\n        }\n        for (var i = 0, n = 0; i < end; ++i) {\n            if (string.charAt(i) == \"\\t\") n += tabSize - (n % tabSize);\n            else ++n;\n        }\n        return n;\n    }\n\n    function computedStyle(elt) {\n        if (elt.currentStyle) return elt.currentStyle;\n        return window.getComputedStyle(elt, null);\n    }\n\n    // Find the position of an element by following the offsetParent chain.\n    // If screen==true, it returns screen (rather than page) coordinates.\n    function eltOffset(node, screen) {\n        var bod = node.ownerDocument.body;\n        var x = 0, y = 0, skipBody = false;\n        for (var n = node; n; n = n.offsetParent) {\n            var ol = n.offsetLeft, ot = n.offsetTop;\n            // Firefox reports weird inverted offsets when the body has a border.\n            if (n == bod) { x += Math.abs(ol); y += Math.abs(ot); }\n            else { x += ol, y += ot; }\n            if (screen && computedStyle(n).position == \"fixed\")\n                skipBody = true;\n        }\n        var e = screen && !skipBody ? null : bod;\n        for (var n = node.parentNode; n != e; n = n.parentNode)\n            if (n.scrollLeft != null) { x -= n.scrollLeft; y -= n.scrollTop;}\n        return {left: x, top: y};\n    }\n    // Use the faster and saner getBoundingClientRect method when possible.\n    if (document.documentElement.getBoundingClientRect != null) eltOffset = function(node, screen) {\n        // Take the parts of bounding client rect that we are interested in so we are able to edit if need be,\n        // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page)\n        try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; }\n        catch(e) { box = {top: 0, left: 0}; }\n        if (!screen) {\n            // Get the toplevel scroll, working around browser differences.\n            if (window.pageYOffset == null) {\n                var t = document.documentElement || document.body.parentNode;\n                if (t.scrollTop == null) t = document.body;\n                box.top += t.scrollTop; box.left += t.scrollLeft;\n            } else {\n                box.top += window.pageYOffset; box.left += window.pageXOffset;\n            }\n        }\n        return box;\n    };\n\n    // Get a node's text content.\n    function eltText(node) {\n        return node.textContent || node.innerText || node.nodeValue || \"\";\n    }\n\n    // Operations on {line, ch} objects.\n    function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}\n    function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}\n    function copyPos(x) {return {line: x.line, ch: x.ch};}\n\n    var escapeElement = document.createElement(\"pre\");\n    function htmlEscape(str) {\n        escapeElement.textContent = str;\n        return escapeElement.innerHTML;\n    }\n    // Recent (late 2011) Opera betas insert bogus newlines at the start\n    // of the textContent, so we strip those.\n    if (htmlEscape(\"a\") == \"\\na\")\n        htmlEscape = function(str) {\n            escapeElement.textContent = str;\n            return escapeElement.innerHTML.slice(1);\n        };\n    // Some IEs don't preserve tabs through innerHTML\n    else if (htmlEscape(\"\\t\") != \"\\t\")\n        htmlEscape = function(str) {\n            escapeElement.innerHTML = \"\";\n            escapeElement.appendChild(document.createTextNode(str));\n            return escapeElement.innerHTML;\n        };\n    CodeMirror.htmlEscape = htmlEscape;\n\n    // Used to position the cursor after an undo/redo by finding the\n    // last edited character.\n    function editEnd(from, to) {\n        if (!to) return from ? from.length : 0;\n        if (!from) return to.length;\n        for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)\n            if (from.charAt(i) != to.charAt(j)) break;\n        return j + 1;\n    }\n\n    function indexOf(collection, elt) {\n        if (collection.indexOf) return collection.indexOf(elt);\n        for (var i = 0, e = collection.length; i < e; ++i)\n            if (collection[i] == elt) return i;\n        return -1;\n    }\n    function isWordChar(ch) {\n        return /\\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase();\n    }\n\n    // See if \"\".split is the broken IE version, if so, provide an\n    // alternative way to split lines.\n    var splitLines = \"\\n\\nb\".split(/\\n/).length != 3 ? function(string) {\n        var pos = 0, nl, result = [];\n        while ((nl = string.indexOf(\"\\n\", pos)) > -1) {\n            result.push(string.slice(pos, string.charAt(nl-1) == \"\\r\" ? nl - 1 : nl));\n            pos = nl + 1;\n        }\n        result.push(string.slice(pos));\n        return result;\n    } : function(string){return string.split(/\\r?\\n/);};\n    CodeMirror.splitLines = splitLines;\n\n    var hasSelection = window.getSelection ? function(te) {\n        try { return te.selectionStart != te.selectionEnd; }\n        catch(e) { return false; }\n    } : function(te) {\n        try {var range = te.ownerDocument.selection.createRange();}\n        catch(e) {}\n        if (!range || range.parentElement() != te) return false;\n        return range.compareEndPoints(\"StartToEnd\", range) != 0;\n    };\n\n    CodeMirror.defineMode(\"null\", function() {\n        return {token: function(stream) {stream.skipToEnd();}};\n    });\n    CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n    var keyNames = {3: \"Enter\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n        19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n        36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n        46: \"Delete\", 59: \";\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\", 186: \";\", 187: \"=\", 188: \",\",\n        189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\", 221: \"]\", 222: \"'\", 63276: \"PageUp\",\n        63277: \"PageDown\", 63275: \"End\", 63273: \"Home\", 63234: \"Left\", 63232: \"Up\", 63235: \"Right\",\n        63233: \"Down\", 63302: \"Insert\", 63272: \"Delete\"};\n    CodeMirror.keyNames = keyNames;\n    (function() {\n        // Number keys\n        for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);\n        // Alphabetic keys\n        for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);\n        // Function keys\n        for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = \"F\" + i;\n    })();\n\n    return CodeMirror;\n})();\nCodeMirror.defineMode(\"xml\", function(config, parserConfig) {\n    var indentUnit = config.indentUnit;\n    var Kludges = parserConfig.htmlMode ? {\n        autoSelfClosers: {\"br\": true, \"img\": true, \"hr\": true, \"link\": true, \"input\": true,\n            \"meta\": true, \"col\": true, \"frame\": true, \"base\": true, \"area\": true},\n        doNotIndent: {\"pre\": true},\n        allowUnquoted: true\n    } : {autoSelfClosers: {}, doNotIndent: {}, allowUnquoted: false};\n    var alignCDATA = parserConfig.alignCDATA;\n\n    // Return variables for tokenizers\n    var tagName, type;\n\n    function inText(stream, state) {\n        function chain(parser) {\n            state.tokenize = parser;\n            return parser(stream, state);\n        }\n\n        var ch = stream.next();\n        if (ch == \"<\") {\n            if (stream.eat(\"!\")) {\n                if (stream.eat(\"[\")) {\n                    if (stream.match(\"CDATA[\")) return chain(inBlock(\"atom\", \"]]>\"));\n                    else return null;\n                }\n                else if (stream.match(\"--\")) return chain(inBlock(\"comment\", \"-->\"));\n                else if (stream.match(\"DOCTYPE\", true, true)) {\n                    stream.eatWhile(/[\\w\\._\\-]/);\n                    return chain(doctype(1));\n                }\n                else return null;\n            }\n            else if (stream.eat(\"?\")) {\n                stream.eatWhile(/[\\w\\._\\-]/);\n                state.tokenize = inBlock(\"meta\", \"?>\");\n                return \"meta\";\n            }\n            else {\n                type = stream.eat(\"/\") ? \"closeTag\" : \"openTag\";\n                stream.eatSpace();\n                tagName = \"\";\n                var c;\n                while ((c = stream.eat(/[^\\s\\u00a0=<>\\\"\\'\\/?]/))) tagName += c;\n                state.tokenize = inTag;\n                return \"tag\";\n            }\n        }\n        else if (ch == \"&\") {\n            stream.eatWhile(/[^;]/);\n            stream.eat(\";\");\n            return \"atom\";\n        }\n        else {\n            stream.eatWhile(/[^&<]/);\n            return null;\n        }\n    }\n\n    function inTag(stream, state) {\n        var ch = stream.next();\n        if (ch == \">\" || (ch == \"/\" && stream.eat(\">\"))) {\n            state.tokenize = inText;\n            type = ch == \">\" ? \"endTag\" : \"selfcloseTag\";\n            return \"tag\";\n        }\n        else if (ch == \"=\") {\n            type = \"equals\";\n            return null;\n        }\n        else if (/[\\'\\\"]/.test(ch)) {\n            state.tokenize = inAttribute(ch);\n            return state.tokenize(stream, state);\n        }\n        else {\n            stream.eatWhile(/[^\\s\\u00a0=<>\\\"\\'\\/?]/);\n            return \"word\";\n        }\n    }\n\n    function inAttribute(quote) {\n        return function(stream, state) {\n            while (!stream.eol()) {\n                if (stream.next() == quote) {\n                    state.tokenize = inTag;\n                    break;\n                }\n            }\n            return \"string\";\n        };\n    }\n\n    function inBlock(style, terminator) {\n        return function(stream, state) {\n            while (!stream.eol()) {\n                if (stream.match(terminator)) {\n                    state.tokenize = inText;\n                    break;\n                }\n                stream.next();\n            }\n            return style;\n        };\n    }\n    function doctype(depth) {\n        return function(stream, state) {\n            var ch;\n            while ((ch = stream.next()) != null) {\n                if (ch == \"<\") {\n                    state.tokenize = doctype(depth + 1);\n                    return state.tokenize(stream, state);\n                } else if (ch == \">\") {\n                    if (depth == 1) {\n                        state.tokenize = inText;\n                        break;\n                    } else {\n                        state.tokenize = doctype(depth - 1);\n                        return state.tokenize(stream, state);\n                    }\n                }\n            }\n            return \"meta\";\n        };\n    }\n\n    var curState, setStyle;\n    function pass() {\n        for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);\n    }\n    function cont() {\n        pass.apply(null, arguments);\n        return true;\n    }\n\n    function pushContext(tagName, startOfLine) {\n        var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent);\n        curState.context = {\n            prev: curState.context,\n            tagName: tagName,\n            indent: curState.indented,\n            startOfLine: startOfLine,\n            noIndent: noIndent\n        };\n    }\n    function popContext() {\n        if (curState.context) curState.context = curState.context.prev;\n    }\n\n    function element(type) {\n        if (type == \"openTag\") {\n            curState.tagName = tagName;\n            return cont(attributes, endtag(curState.startOfLine));\n        } else if (type == \"closeTag\") {\n            var err = false;\n            if (curState.context) {\n                err = curState.context.tagName != tagName;\n            } else {\n                err = true;\n            }\n            if (err) setStyle = \"error\";\n            return cont(endclosetag(err));\n        }\n        return cont();\n    }\n    function endtag(startOfLine) {\n        return function(type) {\n            if (type == \"selfcloseTag\" ||\n                (type == \"endTag\" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase())))\n                return cont();\n            if (type == \"endTag\") {pushContext(curState.tagName, startOfLine); return cont();}\n            return cont();\n        };\n    }\n    function endclosetag(err) {\n        return function(type) {\n            if (err) setStyle = \"error\";\n            if (type == \"endTag\") { popContext(); return cont(); }\n            setStyle = \"error\";\n            return cont(arguments.callee);\n        }\n    }\n\n    function attributes(type) {\n        if (type == \"word\") {setStyle = \"attribute\"; return cont(attributes);}\n        if (type == \"equals\") return cont(attvalue, attributes);\n        if (type == \"string\") {setStyle = \"error\"; return cont(attributes);}\n        return pass();\n    }\n    function attvalue(type) {\n        if (type == \"word\" && Kludges.allowUnquoted) {setStyle = \"string\"; return cont();}\n        if (type == \"string\") return cont(attvaluemaybe);\n        return pass();\n    }\n    function attvaluemaybe(type) {\n        if (type == \"string\") return cont(attvaluemaybe);\n        else return pass();\n    }\n\n    return {\n        startState: function() {\n            return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null};\n        },\n\n        token: function(stream, state) {\n            if (stream.sol()) {\n                state.startOfLine = true;\n                state.indented = stream.indentation();\n            }\n            if (stream.eatSpace()) return null;\n\n            setStyle = type = tagName = null;\n            var style = state.tokenize(stream, state);\n            state.type = type;\n            if ((style || type) && style != \"comment\") {\n                curState = state;\n                while (true) {\n                    var comb = state.cc.pop() || element;\n                    if (comb(type || style)) break;\n                }\n            }\n            state.startOfLine = false;\n            return setStyle || style;\n        },\n\n        indent: function(state, textAfter, fullLine) {\n            var context = state.context;\n            if ((state.tokenize != inTag && state.tokenize != inText) ||\n                context && context.noIndent)\n                return fullLine ? fullLine.match(/^(\\s*)/)[0].length : 0;\n            if (alignCDATA && /<!\\[CDATA\\[/.test(textAfter)) return 0;\n            if (context && /^<\\//.test(textAfter))\n                context = context.prev;\n            while (context && !context.startOfLine)\n                context = context.prev;\n            if (context) return context.indent + indentUnit;\n            else return 0;\n        },\n\n        compareStates: function(a, b) {\n            if (a.indented != b.indented || a.tokenize != b.tokenize) return false;\n            for (var ca = a.context, cb = b.context; ; ca = ca.prev, cb = cb.prev) {\n                if (!ca || !cb) return ca == cb;\n                if (ca.tagName != cb.tagName) return false;\n            }\n        },\n\n        electricChars: \"/\"\n    };\n});\n\nCodeMirror.defineMIME(\"application/xml\", \"xml\");\nCodeMirror.defineMIME(\"text/html\", {name: \"xml\", htmlMode: true});\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n    var indentUnit = config.indentUnit;\n    var jsonMode = parserConfig.json;\n\n    // Tokenizer\n\n    var keywords = function(){\n        function kw(type) {return {type: type, style: \"keyword\"};}\n        var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\");\n        var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n        return {\n            \"if\": A, \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n            \"return\": C, \"break\": C, \"continue\": C, \"new\": C, \"delete\": C, \"throw\": C,\n            \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n            \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n            \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n            \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n            \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom\n        };\n    }();\n\n    var isOperatorChar = /[+\\-*&%=<>!?|]/;\n\n    function chain(stream, state, f) {\n        state.tokenize = f;\n        return f(stream, state);\n    }\n\n    function nextUntilUnescaped(stream, end) {\n        var escaped = false, next;\n        while ((next = stream.next()) != null) {\n            if (next == end && !escaped)\n                return false;\n            escaped = !escaped && next == \"\\\\\";\n        }\n        return escaped;\n    }\n\n    // Used as scratch variables to communicate multiple values without\n    // consing up tons of objects.\n    var type, content;\n    function ret(tp, style, cont) {\n        type = tp; content = cont;\n        return style;\n    }\n\n    function jsTokenBase(stream, state) {\n        var ch = stream.next();\n        if (ch == '\"' || ch == \"'\")\n            return chain(stream, state, jsTokenString(ch));\n        else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch))\n            return ret(ch);\n        else if (ch == \"0\" && stream.eat(/x/i)) {\n            stream.eatWhile(/[\\da-f]/i);\n            return ret(\"number\", \"number\");\n        }\n        else if (/\\d/.test(ch)) {\n            stream.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/);\n            return ret(\"number\", \"number\");\n        }\n        else if (ch == \"/\") {\n            if (stream.eat(\"*\")) {\n                return chain(stream, state, jsTokenComment);\n            }\n            else if (stream.eat(\"/\")) {\n                stream.skipToEnd();\n                return ret(\"comment\", \"comment\");\n            }\n            else if (state.reAllowed) {\n                nextUntilUnescaped(stream, \"/\");\n                stream.eatWhile(/[gimy]/); // 'y' is \"sticky\" option in Mozilla\n                return ret(\"regexp\", \"string\");\n            }\n            else {\n                stream.eatWhile(isOperatorChar);\n                return ret(\"operator\", null, stream.current());\n            }\n        }\n        else if (ch == \"#\") {\n            stream.skipToEnd();\n            return ret(\"error\", \"error\");\n        }\n        else if (isOperatorChar.test(ch)) {\n            stream.eatWhile(isOperatorChar);\n            return ret(\"operator\", null, stream.current());\n        }\n        else {\n            stream.eatWhile(/[\\w\\$_]/);\n            var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n            return (known && state.kwAllowed) ? ret(known.type, known.style, word) :\n                ret(\"variable\", \"variable\", word);\n        }\n    }\n\n    function jsTokenString(quote) {\n        return function(stream, state) {\n            if (!nextUntilUnescaped(stream, quote))\n                state.tokenize = jsTokenBase;\n            return ret(\"string\", \"string\");\n        };\n    }\n\n    function jsTokenComment(stream, state) {\n        var maybeEnd = false, ch;\n        while (ch = stream.next()) {\n            if (ch == \"/\" && maybeEnd) {\n                state.tokenize = jsTokenBase;\n                break;\n            }\n            maybeEnd = (ch == \"*\");\n        }\n        return ret(\"comment\", \"comment\");\n    }\n\n    // Parser\n\n    var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true};\n\n    function JSLexical(indented, column, type, align, prev, info) {\n        this.indented = indented;\n        this.column = column;\n        this.type = type;\n        this.prev = prev;\n        this.info = info;\n        if (align != null) this.align = align;\n    }\n\n    function inScope(state, varname) {\n        for (var v = state.localVars; v; v = v.next)\n            if (v.name == varname) return true;\n    }\n\n    function parseJS(state, style, type, content, stream) {\n        var cc = state.cc;\n        // Communicate our context to the combinators.\n        // (Less wasteful than consing up a hundred closures on every call.)\n        cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;\n\n        if (!state.lexical.hasOwnProperty(\"align\"))\n            state.lexical.align = true;\n\n        while(true) {\n            var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n            if (combinator(type, content)) {\n                while(cc.length && cc[cc.length - 1].lex)\n                    cc.pop()();\n                if (cx.marked) return cx.marked;\n                if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n                return style;\n            }\n        }\n    }\n\n    // Combinator utils\n\n    var cx = {state: null, column: null, marked: null, cc: null};\n    function pass() {\n        for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n    }\n    function cont() {\n        pass.apply(null, arguments);\n        return true;\n    }\n    function register(varname) {\n        var state = cx.state;\n        if (state.context) {\n            cx.marked = \"def\";\n            for (var v = state.localVars; v; v = v.next)\n                if (v.name == varname) return;\n            state.localVars = {name: varname, next: state.localVars};\n        }\n    }\n\n    // Combinators\n\n    var defaultVars = {name: \"this\", next: {name: \"arguments\"}};\n    function pushcontext() {\n        if (!cx.state.context) cx.state.localVars = defaultVars;\n        cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n    }\n    function popcontext() {\n        cx.state.localVars = cx.state.context.vars;\n        cx.state.context = cx.state.context.prev;\n    }\n    function pushlex(type, info) {\n        var result = function() {\n            var state = cx.state;\n            state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)\n        };\n        result.lex = true;\n        return result;\n    }\n    function poplex() {\n        var state = cx.state;\n        if (state.lexical.prev) {\n            if (state.lexical.type == \")\")\n                state.indented = state.lexical.indented;\n            state.lexical = state.lexical.prev;\n        }\n    }\n    poplex.lex = true;\n\n    function expect(wanted) {\n        return function expecting(type) {\n            if (type == wanted) return cont();\n            else if (wanted == \";\") return pass();\n            else return cont(arguments.callee);\n        };\n    }\n\n    function statement(type) {\n        if (type == \"var\") return cont(pushlex(\"vardef\"), vardef1, expect(\";\"), poplex);\n        if (type == \"keyword a\") return cont(pushlex(\"form\"), expression, statement, poplex);\n        if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n        if (type == \"{\") return cont(pushlex(\"}\"), block, poplex);\n        if (type == \";\") return cont();\n        if (type == \"function\") return cont(functiondef);\n        if (type == \"for\") return cont(pushlex(\"form\"), expect(\"(\"), pushlex(\")\"), forspec1, expect(\")\"),\n            poplex, statement, poplex);\n        if (type == \"variable\") return cont(pushlex(\"stat\"), maybelabel);\n        if (type == \"switch\") return cont(pushlex(\"form\"), expression, pushlex(\"}\", \"switch\"), expect(\"{\"),\n            block, poplex, poplex);\n        if (type == \"case\") return cont(expression, expect(\":\"));\n        if (type == \"default\") return cont(expect(\":\"));\n        if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n            statement, poplex, popcontext);\n        return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n    }\n    function expression(type) {\n        if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);\n        if (type == \"function\") return cont(functiondef);\n        if (type == \"keyword c\") return cont(maybeexpression);\n        if (type == \"(\") return cont(pushlex(\")\"), expression, expect(\")\"), poplex, maybeoperator);\n        if (type == \"operator\") return cont(expression);\n        if (type == \"[\") return cont(pushlex(\"]\"), commasep(expression, \"]\"), poplex, maybeoperator);\n        if (type == \"{\") return cont(pushlex(\"}\"), commasep(objprop, \"}\"), poplex, maybeoperator);\n        return cont();\n    }\n    function maybeexpression(type) {\n        if (type.match(/[;\\}\\)\\],]/)) return pass();\n        return pass(expression);\n    }\n\n    function maybeoperator(type, value) {\n        if (type == \"operator\" && /\\+\\+|--/.test(value)) return cont(maybeoperator);\n        if (type == \"operator\") return cont(expression);\n        if (type == \";\") return;\n        if (type == \"(\") return cont(pushlex(\")\"), commasep(expression, \")\"), poplex, maybeoperator);\n        if (type == \".\") return cont(property, maybeoperator);\n        if (type == \"[\") return cont(pushlex(\"]\"), expression, expect(\"]\"), poplex, maybeoperator);\n    }\n    function maybelabel(type) {\n        if (type == \":\") return cont(poplex, statement);\n        return pass(maybeoperator, expect(\";\"), poplex);\n    }\n    function property(type) {\n        if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n    }\n    function objprop(type) {\n        if (type == \"variable\") cx.marked = \"property\";\n        if (atomicTypes.hasOwnProperty(type)) return cont(expect(\":\"), expression);\n    }\n    function commasep(what, end) {\n        function proceed(type) {\n            if (type == \",\") return cont(what, proceed);\n            if (type == end) return cont();\n            return cont(expect(end));\n        }\n        return function commaSeparated(type) {\n            if (type == end) return cont();\n            else return pass(what, proceed);\n        };\n    }\n    function block(type) {\n        if (type == \"}\") return cont();\n        return pass(statement, block);\n    }\n    function vardef1(type, value) {\n        if (type == \"variable\"){register(value); return cont(vardef2);}\n        return cont();\n    }\n    function vardef2(type, value) {\n        if (value == \"=\") return cont(expression, vardef2);\n        if (type == \",\") return cont(vardef1);\n    }\n    function forspec1(type) {\n        if (type == \"var\") return cont(vardef1, forspec2);\n        if (type == \";\") return pass(forspec2);\n        if (type == \"variable\") return cont(formaybein);\n        return pass(forspec2);\n    }\n    function formaybein(type, value) {\n        if (value == \"in\") return cont(expression);\n        return cont(maybeoperator, forspec2);\n    }\n    function forspec2(type, value) {\n        if (type == \";\") return cont(forspec3);\n        if (value == \"in\") return cont(expression);\n        return cont(expression, expect(\";\"), forspec3);\n    }\n    function forspec3(type) {\n        if (type != \")\") cont(expression);\n    }\n    function functiondef(type, value) {\n        if (type == \"variable\") {register(value); return cont(functiondef);}\n        if (type == \"(\") return cont(pushlex(\")\"), pushcontext, commasep(funarg, \")\"), poplex, statement, popcontext);\n    }\n    function funarg(type, value) {\n        if (type == \"variable\") {register(value); return cont();}\n    }\n\n    // Interface\n\n    return {\n        startState: function(basecolumn) {\n            return {\n                tokenize: jsTokenBase,\n                reAllowed: true,\n                kwAllowed: true,\n                cc: [],\n                lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n                localVars: null,\n                context: null,\n                indented: 0\n            };\n        },\n\n        token: function(stream, state) {\n            if (stream.sol()) {\n                if (!state.lexical.hasOwnProperty(\"align\"))\n                    state.lexical.align = false;\n                state.indented = stream.indentation();\n            }\n            if (stream.eatSpace()) return null;\n            var style = state.tokenize(stream, state);\n            if (type == \"comment\") return style;\n            state.reAllowed = type == \"operator\" || type == \"keyword c\" || type.match(/^[\\[{}\\(,;:]$/);\n            state.kwAllowed = type != '.';\n            return parseJS(state, style, type, content, stream);\n        },\n\n        indent: function(state, textAfter) {\n            if (state.tokenize != jsTokenBase) return 0;\n            var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,\n                type = lexical.type, closing = firstChar == type;\n            if (type == \"vardef\") return lexical.indented + 4;\n            else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n            else if (type == \"stat\" || type == \"form\") return lexical.indented + indentUnit;\n            else if (lexical.info == \"switch\" && !closing)\n                return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n            else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n            else return lexical.indented + (closing ? 0 : indentUnit);\n        },\n\n        electricChars: \":{}\"\n    };\n});\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\n\nCodeMirror.defineMode(\"css\", function(config) {\n    var indentUnit = config.indentUnit, type;\n    function ret(style, tp) {type = tp; return style;}\n\n    function tokenBase(stream, state) {\n        var ch = stream.next();\n        if (ch == \"@\") {stream.eatWhile(/[\\w\\\\\\-]/); return ret(\"meta\", stream.current());}\n        else if (ch == \"/\" && stream.eat(\"*\")) {\n            state.tokenize = tokenCComment;\n            return tokenCComment(stream, state);\n        }\n        else if (ch == \"<\" && stream.eat(\"!\")) {\n            state.tokenize = tokenSGMLComment;\n            return tokenSGMLComment(stream, state);\n        }\n        else if (ch == \"=\") ret(null, \"compare\");\n        else if ((ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) return ret(null, \"compare\");\n        else if (ch == \"\\\"\" || ch == \"'\") {\n            state.tokenize = tokenString(ch);\n            return state.tokenize(stream, state);\n        }\n        else if (ch == \"#\") {\n            stream.eatWhile(/[\\w\\\\\\-]/);\n            return ret(\"atom\", \"hash\");\n        }\n        else if (ch == \"!\") {\n            stream.match(/^\\s*\\w*/);\n            return ret(\"keyword\", \"important\");\n        }\n        else if (/\\d/.test(ch)) {\n            stream.eatWhile(/[\\w.%]/);\n            return ret(\"number\", \"unit\");\n        }\n        else if (/[,.+>*\\/]/.test(ch)) {\n            return ret(null, \"select-op\");\n        }\n        else if (/[;{}:\\[\\]]/.test(ch)) {\n            return ret(null, ch);\n        }\n        else {\n            stream.eatWhile(/[\\w\\\\\\-]/);\n            return ret(\"variable\", \"variable\");\n        }\n    }\n\n    function tokenCComment(stream, state) {\n        var maybeEnd = false, ch;\n        while ((ch = stream.next()) != null) {\n            if (maybeEnd && ch == \"/\") {\n                state.tokenize = tokenBase;\n                break;\n            }\n            maybeEnd = (ch == \"*\");\n        }\n        return ret(\"comment\", \"comment\");\n    }\n\n    function tokenSGMLComment(stream, state) {\n        var dashes = 0, ch;\n        while ((ch = stream.next()) != null) {\n            if (dashes >= 2 && ch == \">\") {\n                state.tokenize = tokenBase;\n                break;\n            }\n            dashes = (ch == \"-\") ? dashes + 1 : 0;\n        }\n        return ret(\"comment\", \"comment\");\n    }\n\n    function tokenString(quote) {\n        return function(stream, state) {\n            var escaped = false, ch;\n            while ((ch = stream.next()) != null) {\n                if (ch == quote && !escaped)\n                    break;\n                escaped = !escaped && ch == \"\\\\\";\n            }\n            if (!escaped) state.tokenize = tokenBase;\n            return ret(\"string\", \"string\");\n        };\n    }\n\n    return {\n        startState: function(base) {\n            return {tokenize: tokenBase,\n                baseIndent: base || 0,\n                stack: []};\n        },\n\n        token: function(stream, state) {\n            if (stream.eatSpace()) return null;\n            var style = state.tokenize(stream, state);\n\n            var context = state.stack[state.stack.length-1];\n            if (type == \"hash\" && context == \"rule\") style = \"atom\";\n            else if (style == \"variable\") {\n                if (context == \"rule\") style = \"number\";\n                else if (!context || context == \"@media{\") style = \"tag\";\n            }\n\n            if (context == \"rule\" && /^[\\{\\};]$/.test(type))\n                state.stack.pop();\n            if (type == \"{\") {\n                if (context == \"@media\") state.stack[state.stack.length-1] = \"@media{\";\n                else state.stack.push(\"{\");\n            }\n            else if (type == \"}\") state.stack.pop();\n            else if (type == \"@media\") state.stack.push(\"@media\");\n            else if (context == \"{\" && type != \"comment\") state.stack.push(\"rule\");\n            return style;\n        },\n\n        indent: function(state, textAfter) {\n            var n = state.stack.length;\n            if (/^\\}/.test(textAfter))\n                n -= state.stack[state.stack.length-1] == \"rule\" ? 2 : 1;\n            return state.baseIndent + n * indentUnit;\n        },\n\n        electricChars: \"}\"\n    };\n});\n\nCodeMirror.defineMIME(\"text/css\", \"css\");\nCodeMirror.defineMode(\"htmlmixed\", function(config, parserConfig) {\n    var htmlMode = CodeMirror.getMode(config, {name: \"xml\", htmlMode: true});\n    var jsMode = CodeMirror.getMode(config, \"javascript\");\n    var cssMode = CodeMirror.getMode(config, \"css\");\n\n    function html(stream, state) {\n        var style = htmlMode.token(stream, state.htmlState);\n        if (style == \"tag\" && stream.current() == \">\" && state.htmlState.context) {\n            if (/^script$/i.test(state.htmlState.context.tagName)) {\n                state.token = javascript;\n                state.localState = jsMode.startState(htmlMode.indent(state.htmlState, \"\"));\n                state.mode = \"javascript\";\n            }\n            else if (/^style$/i.test(state.htmlState.context.tagName)) {\n                state.token = css;\n                state.localState = cssMode.startState(htmlMode.indent(state.htmlState, \"\"));\n                state.mode = \"css\";\n            }\n        }\n        return style;\n    }\n    function maybeBackup(stream, pat, style) {\n        var cur = stream.current();\n        var close = cur.search(pat);\n        if (close > -1) stream.backUp(cur.length - close);\n        return style;\n    }\n    function javascript(stream, state) {\n        if (stream.match(/^<\\/\\s*script\\s*>/i, false)) {\n            state.token = html;\n            state.curState = null;\n            state.mode = \"html\";\n            return html(stream, state);\n        }\n        return maybeBackup(stream, /<\\/\\s*script\\s*>/,\n            jsMode.token(stream, state.localState));\n    }\n    function css(stream, state) {\n        if (stream.match(/^<\\/\\s*style\\s*>/i, false)) {\n            state.token = html;\n            state.localState = null;\n            state.mode = \"html\";\n            return html(stream, state);\n        }\n        return maybeBackup(stream, /<\\/\\s*style\\s*>/,\n            cssMode.token(stream, state.localState));\n    }\n\n    return {\n        startState: function() {\n            var state = htmlMode.startState();\n            return {token: html, localState: null, mode: \"html\", htmlState: state};\n        },\n\n        copyState: function(state) {\n            if (state.localState)\n                var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);\n            return {token: state.token, localState: local, mode: state.mode,\n                htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};\n        },\n\n        token: function(stream, state) {\n            return state.token(stream, state);\n        },\n\n        indent: function(state, textAfter) {\n            if (state.token == html || /^\\s*<\\//.test(textAfter))\n                return htmlMode.indent(state.htmlState, textAfter);\n            else if (state.token == javascript)\n                return jsMode.indent(state.localState, textAfter);\n            else\n                return cssMode.indent(state.localState, textAfter);\n        },\n\n        compareStates: function(a, b) {\n            return htmlMode.compareStates(a.htmlState, b.htmlState);\n        },\n\n        electricChars: \"/{}:\"\n    }\n});\n\nCodeMirror.defineMIME(\"text/html\", \"htmlmixed\");\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/adapters/mootools-adapter.js",
    "content": "/*\n Highcharts JS v3.0.6 (2013-10-04)\n MooTools adapter\n\n (c) 2010-2013 Torstein Hønsi\n\n License: www.highcharts.com/license\n*/\n(function(){var e=window,h=document,f=e.MooTools.version.substring(0,3),i=f===\"1.2\"||f===\"1.1\",j=i||f===\"1.3\",g=e.$extend||function(){return Object.append.apply(Object,arguments)};e.HighchartsAdapter={init:function(a){var b=Fx.prototype,c=b.start,d=Fx.Morph.prototype,e=d.compute;b.start=function(b,d){var e=this.element;if(b.d)this.paths=a.init(e,e.d,this.toD);c.apply(this,arguments);return this};d.compute=function(b,c,d){var f=this.paths;if(f)this.element.attr(\"d\",a.step(f[0],f[1],d,this.toD));else return e.apply(this,\narguments)}},adapterRun:function(a,b){if(b===\"width\"||b===\"height\")return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=h.getElementsByTagName(\"head\")[0],d=h.createElement(\"script\");d.type=\"text/javascript\";d.src=a;d.onload=b;c.appendChild(d)},animate:function(a,b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle)a.getStyle=a.attr,a.setStyle=function(){var a=arguments;this.attr.call(this,a[0],a[1][0])},a.$family=function(){return!0};e.HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),\ng({transition:Fx.Transitions.Quad.easeInOut},c));if(d)c.element=a;if(b.d)c.toD=b.d;f&&c.addEvent(\"complete\",f);c.start(b);a.fx=c},each:function(a,b){return i?$each(a,b):Array.each(a,b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},inArray:function(a,b,c){return b?b.indexOf(a,c):-1},offset:function(a){a=a.getPosition();return{left:a.x,top:a.y}},extendWithEvents:function(a){a.addEvent||(a.nodeName?$(a):g(a,new Events))},addEvent:function(a,b,c){typeof b===\"string\"&&(b===\n\"unload\"&&(b=\"beforeunload\"),e.HighchartsAdapter.extendWithEvents(a),a.addEvent(b,c))},removeEvent:function(a,b,c){typeof a!==\"string\"&&a.addEvent&&(b?(b===\"unload\"&&(b=\"beforeunload\"),c?a.removeEvent(b,c):a.removeEvents&&a.removeEvents(b)):a.removeEvents())},fireEvent:function(a,b,c,d){b={type:b,target:a};b=j?new Event(b):new DOMEvent(b);b=g(b,c);if(!b.target&&b.event)b.target=b.event.target;b.preventDefault=function(){d=null};a.fireEvent&&a.fireEvent(b.type,b);d&&d(b)},washMouseEvent:function(a){if(a.page)a.pageX=\na.page.x,a.pageY=a.page.y;return a},stop:function(a){a.fx&&a.fx.cancel()}}})();\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/adapters/mootools-adapter.src.js",
    "content": "/**\n * @license Highcharts JS v3.0.6 (2013-10-04)\n * MooTools adapter\n *\n * (c) 2010-2013 Torstein Hønsi\n *\n * License: www.highcharts.com/license\n */\n\n// JSLint options:\n/*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */\n\n(function () {\n\nvar win = window,\n\tdoc = document,\n\tmooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number\n\tlegacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not.\n\tlegacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent.\n\t$extend = win.$extend || function () {\n\t\treturn Object.append.apply(Object, arguments);\n\t};\n\nwin.HighchartsAdapter = {\n\t/**\n\t * Initialize the adapter. This is run once as Highcharts is first run.\n\t * @param {Object} pathAnim The helper object to do animations across adapters.\n\t */\n\tinit: function (pathAnim) {\n\t\tvar fxProto = Fx.prototype,\n\t\t\tfxStart = fxProto.start,\n\t\t\tmorphProto = Fx.Morph.prototype,\n\t\t\tmorphCompute = morphProto.compute;\n\n\t\t// override Fx.start to allow animation of SVG element wrappers\n\t\t/*jslint unparam: true*//* allow unused parameters in fx functions */\n\t\tfxProto.start = function (from, to) {\n\t\t\tvar fx = this,\n\t\t\t\telem = fx.element;\n\n\t\t\t// special for animating paths\n\t\t\tif (from.d) {\n\t\t\t\t//this.fromD = this.element.d.split(' ');\n\t\t\t\tfx.paths = pathAnim.init(\n\t\t\t\t\telem,\n\t\t\t\t\telem.d,\n\t\t\t\t\tfx.toD\n\t\t\t\t);\n\t\t\t}\n\t\t\tfxStart.apply(fx, arguments);\n\n\t\t\treturn this; // chainable\n\t\t};\n\n\t\t// override Fx.step to allow animation of SVG element wrappers\n\t\tmorphProto.compute = function (from, to, delta) {\n\t\t\tvar fx = this,\n\t\t\t\tpaths = fx.paths;\n\n\t\t\tif (paths) {\n\t\t\t\tfx.element.attr(\n\t\t\t\t\t'd',\n\t\t\t\t\tpathAnim.step(paths[0], paths[1], delta, fx.toD)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\treturn morphCompute.apply(fx, arguments);\n\t\t\t}\n\t\t};\n\t\t/*jslint unparam: false*/\n\t},\n\t\n\t/**\n\t * Run a general method on the framework, following jQuery syntax\n\t * @param {Object} el The HTML element\n\t * @param {String} method Which method to run on the wrapped element\n\t */\n\tadapterRun: function (el, method) {\n\t\t\n\t\t// This currently works for getting inner width and height. If adding\n\t\t// more methods later, we need a conditional implementation for each.\n\t\tif (method === 'width' || method === 'height') {\n\t\t\treturn parseInt($(el).getStyle(method), 10);\n\t\t}\n\t},\n\n\t/**\n\t * Downloads a script and executes a callback when done.\n\t * @param {String} scriptLocation\n\t * @param {Function} callback\n\t */\n\tgetScript: function (scriptLocation, callback) {\n\t\t// We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.\n\t\tvar head = doc.getElementsByTagName('head')[0];\n\t\tvar script = doc.createElement('script');\n\n\t\tscript.type = 'text/javascript';\n\t\tscript.src = scriptLocation;\n\t\tscript.onload = callback;\n\n\t\thead.appendChild(script);\n\t},\n\n\t/**\n\t * Animate a HTML element or SVG element wrapper\n\t * @param {Object} el\n\t * @param {Object} params\n\t * @param {Object} options jQuery-like animation options: duration, easing, callback\n\t */\n\tanimate: function (el, params, options) {\n\t\tvar isSVGElement = el.attr,\n\t\t\teffect,\n\t\t\tcomplete = options && options.complete;\n\n\t\tif (isSVGElement && !el.setStyle) {\n\t\t\t// add setStyle and getStyle methods for internal use in Moo\n\t\t\tel.getStyle = el.attr;\n\t\t\tel.setStyle = function () { // property value is given as array in Moo - break it down\n\t\t\t\tvar args = arguments;\n\t\t\t\tthis.attr.call(this, args[0], args[1][0]);\n\t\t\t};\n\t\t\t// dirty hack to trick Moo into handling el as an element wrapper\n\t\t\tel.$family = function () { return true; };\n\t\t}\n\n\t\t// stop running animations\n\t\twin.HighchartsAdapter.stop(el);\n\n\t\t// define and run the effect\n\t\teffect = new Fx.Morph(\n\t\t\tisSVGElement ? el : $(el),\n\t\t\t$extend({\n\t\t\t\ttransition: Fx.Transitions.Quad.easeInOut\n\t\t\t}, options)\n\t\t);\n\n\t\t// Make sure that the element reference is set when animating svg elements\n\t\tif (isSVGElement) {\n\t\t\teffect.element = el;\n\t\t}\n\n\t\t// special treatment for paths\n\t\tif (params.d) {\n\t\t\teffect.toD = params.d;\n\t\t}\n\n\t\t// jQuery-like events\n\t\tif (complete) {\n\t\t\teffect.addEvent('complete', complete);\n\t\t}\n\n\t\t// run\n\t\teffect.start(params);\n\n\t\t// record for use in stop method\n\t\tel.fx = effect;\n\t},\n\n\t/**\n\t * MooTool's each function\n\t *\n\t */\n\teach: function (arr, fn) {\n\t\treturn legacy ?\n\t\t\t$each(arr, fn) :\n\t\t\tArray.each(arr, fn);\n\t},\n\n\t/**\n\t * Map an array\n\t * @param {Array} arr\n\t * @param {Function} fn\n\t */\n\tmap: function (arr, fn) {\n\t\treturn arr.map(fn);\n\t},\n\n\t/**\n\t * Grep or filter an array\n\t * @param {Array} arr\n\t * @param {Function} fn\n\t */\n\tgrep: function (arr, fn) {\n\t\treturn arr.filter(fn);\n\t},\n\t\n\t/**\n\t * Return the index of an item in an array, or -1 if not matched\n\t */\n\tinArray: function (item, arr, from) {\n\t\treturn arr ? arr.indexOf(item, from) : -1;\n\t},\n\n\t/**\n\t * Get the offset of an element relative to the top left corner of the web page\n\t */\n\toffset: function (el) {\n\t\tvar offsets = el.getPosition(); // #1496\n\t\treturn {\n\t\t\tleft: offsets.x,\n\t\t\ttop: offsets.y\n\t\t};\n\t},\n\n\t/**\n\t * Extends an object with Events, if its not done\n\t */\n\textendWithEvents: function (el) {\n\t\t// if the addEvent method is not defined, el is a custom Highcharts object\n\t\t// like series or point\n\t\tif (!el.addEvent) {\n\t\t\tif (el.nodeName) {\n\t\t\t\tel = $(el); // a dynamically generated node\n\t\t\t} else {\n\t\t\t\t$extend(el, new Events()); // a custom object\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Add an event listener\n\t * @param {Object} el HTML element or custom object\n\t * @param {String} type Event type\n\t * @param {Function} fn Event handler\n\t */\n\taddEvent: function (el, type, fn) {\n\t\tif (typeof type === 'string') { // chart broke due to el being string, type function\n\n\t\t\tif (type === 'unload') { // Moo self destructs before custom unload events\n\t\t\t\ttype = 'beforeunload';\n\t\t\t}\n\n\t\t\twin.HighchartsAdapter.extendWithEvents(el);\n\n\t\t\tel.addEvent(type, fn);\n\t\t}\n\t},\n\n\tremoveEvent: function (el, type, fn) {\n\t\tif (typeof el === 'string') {\n\t\t\t// el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (el.addEvent) { // If el doesn't have an addEvent method, there are no events to remove\n\t\t\tif (type) {\n\t\t\t\tif (type === 'unload') { // Moo self destructs before custom unload events\n\t\t\t\t\ttype = 'beforeunload';\n\t\t\t\t}\n\t\n\t\t\t\tif (fn) {\n\t\t\t\t\tel.removeEvent(type, fn);\n\t\t\t\t} else if (el.removeEvents) { // #958\n\t\t\t\t\tel.removeEvents(type);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tel.removeEvents();\n\t\t\t}\n\t\t}\n\t},\n\n\tfireEvent: function (el, event, eventArguments, defaultFunction) {\n\t\tvar eventArgs = {\n\t\t\ttype: event,\n\t\t\ttarget: el\n\t\t};\n\t\t// create an event object that keeps all functions\n\t\tevent = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs);\n\t\tevent = $extend(event, eventArguments);\n\n\t\t// When running an event on the Chart.prototype, MooTools nests the target in event.event\n\t\tif (!event.target && event.event) {\n\t\t\tevent.target = event.event.target;\n\t\t}\n\n\t\t// override the preventDefault function to be able to use\n\t\t// this for custom events\n\t\tevent.preventDefault = function () {\n\t\t\tdefaultFunction = null;\n\t\t};\n\t\t// if fireEvent is not available on the object, there hasn't been added\n\t\t// any events to it above\n\t\tif (el.fireEvent) {\n\t\t\tel.fireEvent(event.type, event);\n\t\t}\n\n\t\t// fire the default if it is passed and it is not prevented above\n\t\tif (defaultFunction) {\n\t\t\tdefaultFunction(event);\n\t\t}\n\t},\n\t\n\t/**\n\t * Set back e.pageX and e.pageY that MooTools has abstracted away. #1165, #1346.\n\t */\n\twashMouseEvent: function (e) {\n\t\tif (e.page) {\n\t\t\te.pageX = e.page.x;\n\t\t\te.pageY = e.page.y;\n\t\t}\n\t\treturn e;\n\t},\n\n\t/**\n\t * Stop running animations on the object\n\t */\n\tstop: function (el) {\n\t\tif (el.fx) {\n\t\t\tel.fx.cancel();\n\t\t}\n\t}\n};\n\n}());\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/adapters/prototype-adapter.js",
    "content": "/*\n Highcharts JS v3.0.6 (2013-10-04)\n Prototype adapter\n\n @author Michael Nelson, Torstein Hønsi.\n\n Feel free to use and modify this script.\n Highcharts license: www.highcharts.com/license.\n*/\nvar HighchartsAdapter=function(){var f=typeof Effect!==\"undefined\";return{init:function(a){if(f)Effect.HighchartsTransition=Class.create(Effect.Base,{initialize:function(b,c,d,g){var e;this.element=b;this.key=c;e=b.attr?b.attr(c):$(b).getStyle(c);if(c===\"d\")this.paths=a.init(b,b.d,d),this.toD=d,e=0,d=1;this.start(Object.extend(g||{},{from:e,to:d,attribute:c}))},setup:function(){HighchartsAdapter._extend(this.element);if(!this.element._highchart_animation)this.element._highchart_animation={};this.element._highchart_animation[this.key]=\nthis},update:function(b){var c=this.paths,d=this.element;c&&(b=a.step(c[0],c[1],b,this.toD));d.attr?d.element&&d.attr(this.options.attribute,b):(c={},c[this.options.attribute]=b,$(d).setStyle(c))},finish:function(){this.element&&this.element._highchart_animation&&delete this.element._highchart_animation[this.key]}})},adapterRun:function(a,b){return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=$$(\"head\")[0];c&&c.appendChild((new Element(\"script\",{type:\"text/javascript\",src:a})).observe(\"load\",\nb))},addNS:function(a){var b=/^(?:click|mouse(?:down|up|over|move|out))$/;return/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/.test(a)||b.test(a)?a:\"h:\"+a},addEvent:function(a,b,c){a.addEventListener||a.attachEvent?Event.observe($(a),HighchartsAdapter.addNS(b),c):(HighchartsAdapter._extend(a),a._highcharts_observe(b,c))},animate:function(a,b,c){var d,c=c||{};c.delay=0;c.duration=(c.duration||500)/1E3;c.afterFinish=c.complete;if(f)for(d in b)new Effect.HighchartsTransition($(a),\nd,b[d],c);else{if(a.attr)for(d in b)a.attr(d,b[d]);c.complete&&c.complete()}a.attr||$(a).setStyle(b)},stop:function(a){var b;if(a._highcharts_extended&&a._highchart_animation)for(b in a._highchart_animation)a._highchart_animation[b].cancel()},each:function(a,b){$A(a).each(b)},inArray:function(a,b,c){return b?b.indexOf(a,c):-1},offset:function(a){return $(a).cumulativeOffset()},fireEvent:function(a,b,c,d){a.fire?a.fire(HighchartsAdapter.addNS(b),c):a._highcharts_extended&&(c=c||{},a._highcharts_fire(b,\nc));c&&c.defaultPrevented&&(d=null);d&&d(c)},removeEvent:function(a,b,c){$(a).stopObserving&&(b&&(b=HighchartsAdapter.addNS(b)),$(a).stopObserving(b,c));window===a?Event.stopObserving(a,b,c):(HighchartsAdapter._extend(a),a._highcharts_stop_observing(b,c))},washMouseEvent:function(a){return a},grep:function(a,b){return a.findAll(b)},map:function(a,b){return a.map(b)},_extend:function(a){a._highcharts_extended||Object.extend(a,{_highchart_events:{},_highchart_animation:null,_highcharts_extended:!0,\n_highcharts_observe:function(b,a){this._highchart_events[b]=[this._highchart_events[b],a].compact().flatten()},_highcharts_stop_observing:function(b,a){b?a?this._highchart_events[b]=[this._highchart_events[b]].compact().flatten().without(a):delete this._highchart_events[b]:this._highchart_events={}},_highcharts_fire:function(a,c){var d=this;(this._highchart_events[a]||[]).each(function(a){if(!c.stopped)c.preventDefault=function(){c.defaultPrevented=!0},c.target=d,a.bind(this)(c)===!1&&c.preventDefault()}.bind(this))}})}}}();\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/adapters/prototype-adapter.src.js",
    "content": "/**\n * @license Highcharts JS v3.0.6 (2013-10-04)\n * Prototype adapter\n *\n * @author Michael Nelson, Torstein Hønsi.\n *\n * Feel free to use and modify this script.\n * Highcharts license: www.highcharts.com/license.\n */\n\n// JSLint options:\n/*global Effect, Class, Event, Element, $, $$, $A */\n\n// Adapter interface between prototype and the Highcharts charting library\nvar HighchartsAdapter = (function () {\n\nvar hasEffect = typeof Effect !== 'undefined';\n\nreturn {\n\n\t/**\n\t * Initialize the adapter. This is run once as Highcharts is first run.\n\t * @param {Object} pathAnim The helper object to do animations across adapters.\n\t */\n\tinit: function (pathAnim) {\n\t\tif (hasEffect) {\n\t\t\t/**\n\t\t\t * Animation for Highcharts SVG element wrappers only\n\t\t\t * @param {Object} element\n\t\t\t * @param {Object} attribute\n\t\t\t * @param {Object} to\n\t\t\t * @param {Object} options\n\t\t\t */\n\t\t\tEffect.HighchartsTransition = Class.create(Effect.Base, {\n\t\t\t\tinitialize: function (element, attr, to, options) {\n\t\t\t\t\tvar from,\n\t\t\t\t\t\topts;\n\n\t\t\t\t\tthis.element = element;\n\t\t\t\t\tthis.key = attr;\n\t\t\t\t\tfrom = element.attr ? element.attr(attr) : $(element).getStyle(attr);\n\n\t\t\t\t\t// special treatment for paths\n\t\t\t\t\tif (attr === 'd') {\n\t\t\t\t\t\tthis.paths = pathAnim.init(\n\t\t\t\t\t\t\telement,\n\t\t\t\t\t\t\telement.d,\n\t\t\t\t\t\t\tto\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.toD = to;\n\n\n\t\t\t\t\t\t// fake values in order to read relative position as a float in update\n\t\t\t\t\t\tfrom = 0;\n\t\t\t\t\t\tto = 1;\n\t\t\t\t\t}\n\n\t\t\t\t\topts = Object.extend((options || {}), {\n\t\t\t\t\t\tfrom: from,\n\t\t\t\t\t\tto: to,\n\t\t\t\t\t\tattribute: attr\n\t\t\t\t\t});\n\t\t\t\t\tthis.start(opts);\n\t\t\t\t},\n\t\t\t\tsetup: function () {\n\t\t\t\t\tHighchartsAdapter._extend(this.element);\n\t\t\t\t\t// If this is the first animation on this object, create the _highcharts_animation helper that\n\t\t\t\t\t// contain pointers to the animation objects.\n\t\t\t\t\tif (!this.element._highchart_animation) {\n\t\t\t\t\t\tthis.element._highchart_animation = {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store a reference to this animation instance.\n\t\t\t\t\tthis.element._highchart_animation[this.key] = this;\n\t\t\t\t},\n\t\t\t\tupdate: function (position) {\n\t\t\t\t\tvar paths = this.paths,\n\t\t\t\t\t\telement = this.element,\n\t\t\t\t\t\tobj;\n\n\t\t\t\t\tif (paths) {\n\t\t\t\t\t\tposition = pathAnim.step(paths[0], paths[1], position, this.toD);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.attr) { // SVGElement\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (element.element) { // If not, it has been destroyed (#1405)\n\t\t\t\t\t\t\telement.attr(this.options.attribute, position);\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t} else { // HTML, #409\n\t\t\t\t\t\tobj = {};\n\t\t\t\t\t\tobj[this.options.attribute] = position;\n\t\t\t\t\t\t$(element).setStyle(obj);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t},\n\t\t\t\tfinish: function () {\n\t\t\t\t\t// Delete the property that holds this animation now that it is finished.\n\t\t\t\t\t// Both canceled animations and complete ones gets a 'finish' call.\n\t\t\t\t\tif (this.element && this.element._highchart_animation) { // #1405\n\t\t\t\t\t\tdelete this.element._highchart_animation[this.key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\t\n\t/**\n\t * Run a general method on the framework, following jQuery syntax\n\t * @param {Object} el The HTML element\n\t * @param {String} method Which method to run on the wrapped element\n\t */\n\tadapterRun: function (el, method) {\n\t\t\n\t\t// This currently works for getting inner width and height. If adding\n\t\t// more methods later, we need a conditional implementation for each.\n\t\treturn parseInt($(el).getStyle(method), 10);\n\t\t\n\t},\n\n\t/**\n\t * Downloads a script and executes a callback when done.\n\t * @param {String} scriptLocation\n\t * @param {Function} callback\n\t */\n\tgetScript: function (scriptLocation, callback) {\n\t\tvar head = $$('head')[0]; // Returns an array, so pick the first element.\n\t\tif (head) {\n\t\t\t// Append a new 'script' element, set its type and src attributes, add a 'load' handler that calls the callback\n\t\t\thead.appendChild(new Element('script', { type: 'text/javascript', src: scriptLocation}).observe('load', callback));\n\t\t}\n\t},\n\n\t/**\n\t * Custom events in prototype needs to be namespaced. This method adds a namespace 'h:' in front of\n\t * events that are not recognized as native.\n\t */\n\taddNS: function (eventName) {\n\t\tvar HTMLEvents = /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,\n\t\t\tMouseEvents = /^(?:click|mouse(?:down|up|over|move|out))$/;\n\t\treturn (HTMLEvents.test(eventName) || MouseEvents.test(eventName)) ?\n\t\t\teventName :\n\t\t\t'h:' + eventName;\n\t},\n\n\t// el needs an event to be attached. el is not necessarily a dom element\n\taddEvent: function (el, event, fn) {\n\t\tif (el.addEventListener || el.attachEvent) {\n\t\t\tEvent.observe($(el), HighchartsAdapter.addNS(event), fn);\n\n\t\t} else {\n\t\t\tHighchartsAdapter._extend(el);\n\t\t\tel._highcharts_observe(event, fn);\n\t\t}\n\t},\n\n\t// motion makes things pretty. use it if effects is loaded, if not... still get to the end result.\n\tanimate: function (el, params, options) {\n\t\tvar key,\n\t\t\tfx;\n\n\t\t// default options\n\t\toptions = options || {};\n\t\toptions.delay = 0;\n\t\toptions.duration = (options.duration || 500) / 1000;\n\t\toptions.afterFinish = options.complete;\n\n\t\t// animate wrappers and DOM elements\n\t\tif (hasEffect) {\n\t\t\tfor (key in params) {\n\t\t\t\t// The fx variable is seemingly thrown away here, but the Effect.setup will add itself to the _highcharts_animation object\n\t\t\t\t// on the element itself so its not really lost.\n\t\t\t\tfx = new Effect.HighchartsTransition($(el), key, params[key], options);\n\t\t\t}\n\t\t} else {\n\t\t\tif (el.attr) { // #409 without effects\n\t\t\t\tfor (key in params) {\n\t\t\t\t\tel.attr(key, params[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (options.complete) {\n\t\t\t\toptions.complete();\n\t\t\t}\n\t\t}\n\n\t\tif (!el.attr) { // HTML element, #409\n\t\t\t$(el).setStyle(params);\n\t\t}\n\t},\n\n\t// this only occurs in higcharts 2.0+\n\tstop: function (el) {\n\t\tvar key;\n\t\tif (el._highcharts_extended && el._highchart_animation) {\n\t\t\tfor (key in el._highchart_animation) {\n\t\t\t\t// Cancel the animation\n\t\t\t\t// The 'finish' function in the Effect object will remove the reference\n\t\t\t\tel._highchart_animation[key].cancel();\n\t\t\t}\n\t\t}\n\t},\n\n\t// um.. each\n\teach: function (arr, fn) {\n\t\t$A(arr).each(fn);\n\t},\n\t\n\tinArray: function (item, arr, from) {\n\t\treturn arr ? arr.indexOf(item, from) : -1;\n\t},\n\n\t/**\n\t * Get the cumulative offset relative to the top left of the page. This method, unlike its\n\t * jQuery and MooTools counterpart, still suffers from issue #208 regarding the position\n\t * of a chart within a fixed container.\n\t */\n\toffset: function (el) {\n\t\treturn $(el).cumulativeOffset();\n\t},\n\n\t// fire an event based on an event name (event) and an object (el).\n\t// again, el may not be a dom element\n\tfireEvent: function (el, event, eventArguments, defaultFunction) {\n\t\tif (el.fire) {\n\t\t\tel.fire(HighchartsAdapter.addNS(event), eventArguments);\n\t\t} else if (el._highcharts_extended) {\n\t\t\teventArguments = eventArguments || {};\n\t\t\tel._highcharts_fire(event, eventArguments);\n\t\t}\n\n\t\tif (eventArguments && eventArguments.defaultPrevented) {\n\t\t\tdefaultFunction = null;\n\t\t}\n\n\t\tif (defaultFunction) {\n\t\t\tdefaultFunction(eventArguments);\n\t\t}\n\t},\n\n\tremoveEvent: function (el, event, handler) {\n\t\tif ($(el).stopObserving) {\n\t\t\tif (event) {\n\t\t\t\tevent = HighchartsAdapter.addNS(event);\n\t\t\t}\n\t\t\t$(el).stopObserving(event, handler);\n\t\t} if (window === el) {\n\t\t\tEvent.stopObserving(el, event, handler);\n\t\t} else {\n\t\t\tHighchartsAdapter._extend(el);\n\t\t\tel._highcharts_stop_observing(event, handler);\n\t\t}\n\t},\n\t\n\twashMouseEvent: function (e) {\n\t\treturn e;\n\t},\n\n\t// um, grep\n\tgrep: function (arr, fn) {\n\t\treturn arr.findAll(fn);\n\t},\n\n\t// um, map\n\tmap: function (arr, fn) {\n\t\treturn arr.map(fn);\n\t},\n\n\t// extend an object to handle highchart events (highchart objects, not svg elements).\n\t// this is a very simple way of handling events but whatever, it works (i think)\n\t_extend: function (object) {\n\t\tif (!object._highcharts_extended) {\n\t\t\tObject.extend(object, {\n\t\t\t\t_highchart_events: {},\n\t\t\t\t_highchart_animation: null,\n\t\t\t\t_highcharts_extended: true,\n\t\t\t\t_highcharts_observe: function (name, fn) {\n\t\t\t\t\tthis._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten();\n\t\t\t\t},\n\t\t\t\t_highcharts_stop_observing: function (name, fn) {\n\t\t\t\t\tif (name) {\n\t\t\t\t\t\tif (fn) {\n\t\t\t\t\t\t\tthis._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdelete this._highchart_events[name];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._highchart_events = {};\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t_highcharts_fire: function (name, args) {\n\t\t\t\t\tvar target = this;\n\t\t\t\t\t(this._highchart_events[name] || []).each(function (fn) {\n\t\t\t\t\t\t// args is never null here\n\t\t\t\t\t\tif (args.stopped) {\n\t\t\t\t\t\t\treturn; // \"throw $break\" wasn't working. i think because of the scope of 'this'.\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Attach a simple preventDefault function to skip default handler if called\n\t\t\t\t\t\targs.preventDefault = function () {\n\t\t\t\t\t\t\targs.defaultPrevented = true;\n\t\t\t\t\t\t};\n\t\t\t\t\t\targs.target = target;\n\n\t\t\t\t\t\t// If the event handler return false, prevent the default handler from executing\n\t\t\t\t\t\tif (fn.bind(this)(args) === false) {\n\t\t\t\t\t\t\targs.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n.bind(this));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n};\n}());\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/adapters/standalone-framework.js",
    "content": "/*\n Highcharts JS v3.0.6 (2013-10-04)\n\n Standalone Highcharts Framework\n\n License: MIT License\n*/\nvar HighchartsAdapter=function(){function o(c){function a(a,b,d){a.removeEventListener(b,d,!1)}function d(a,b,d){d=a.HCProxiedMethods[d.toString()];a.detachEvent(\"on\"+b,d)}function b(b,c){var f=b.HCEvents,i,g,k,j;if(b.removeEventListener)i=a;else if(b.attachEvent)i=d;else return;c?(g={},g[c]=!0):g=f;for(j in g)if(f[j])for(k=f[j].length;k--;)i(b,j,f[j][k])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(b,a){var d=this,c=this.HCEvents,g;if(d.addEventListener)d.addEventListener(b,\na,!1);else if(d.attachEvent){g=function(b){a.call(d,b)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[a.toString()]=g;d.attachEvent(\"on\"+b,g)}c[b]===r&&(c[b]=[]);c[b].push(a)},unbind:function(c,h){var f,i;c?(f=this.HCEvents[c]||[],h?(i=HighchartsAdapter.inArray(h,f),i>-1&&(f.splice(i,1),this.HCEvents[c]=f),this.removeEventListener?a(this,c,h):this.attachEvent&&d(this,c,h)):(b(this,c),this.HCEvents[c]=[])):(b(this),this.HCEvents={})},trigger:function(b,a){var d=this.HCEvents[b]||\n[],c=d.length,g,k,j;k=function(){a.defaultPrevented=!0};for(g=0;g<c;g++){j=d[g];if(a.stopped)break;a.preventDefault=k;a.target=this;a.type=b;j.call(this,a)===!1&&a.preventDefault()}}});return c}var r,l=document,p=[],m=[],q,n;Math.easeInOutSine=function(c,a,d,b){return-d/2*(Math.cos(Math.PI*c/b)-1)+a};return{init:function(c){if(!l.defaultView)this._getStyle=function(a,d){var b;return a.style[d]?a.style[d]:(d===\"opacity\"&&(d=\"filter\"),b=a.currentStyle[d.replace(/\\-(\\w)/g,function(a,b){return b.toUpperCase()})],\nd===\"filter\"&&(b=b.replace(/alpha\\(opacity=([0-9]+)\\)/,function(b,a){return a/100})),b===\"\"?1:b)},this.adapterRun=function(a,d){var b={width:\"clientWidth\",height:\"clientHeight\"}[d];if(b)return a.style.zoom=1,a[b]-2*parseInt(HighchartsAdapter._getStyle(a,\"padding\"),10)};if(!Array.prototype.forEach)this.each=function(a,d){for(var b=0,c=a.length;b<c;b++)if(d.call(a[b],a[b],b,a)===!1)return b};if(!Array.prototype.indexOf)this.inArray=function(a,d){var b,c=0;if(d)for(b=d.length;c<b;c++)if(d[c]===a)return c;\nreturn-1};if(!Array.prototype.filter)this.grep=function(a,d){for(var b=[],c=0,h=a.length;c<h;c++)d(a[c],c)&&b.push(a[c]);return b};n=function(a,c,b){this.options=c;this.elem=a;this.prop=b};n.prototype={update:function(){var a;a=this.paths;var d=this.elem,b=d.element;a&&b?d.attr(\"d\",c.step(a[0],a[1],this.now,this.toD)):d.attr?b&&d.attr(this.prop,this.now):(a={},a[d]=this.now+this.unit,Highcharts.css(d,a));this.options.step&&this.options.step.call(this.elem,this.now,this)},custom:function(a,c,b){var e=\nthis,h=function(a){return e.step(a)},f;this.startTime=+new Date;this.start=a;this.end=c;this.unit=b;this.now=this.start;this.pos=this.state=0;h.elem=this.elem;h()&&m.push(h)===1&&(q=setInterval(function(){for(f=0;f<m.length;f++)m[f]()||m.splice(f--,1);m.length||clearInterval(q)},13))},step:function(a){var c=+new Date,b;b=this.options;var e;if(this.elem.stopAnimation)b=!1;else if(a||c>=b.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();a=this.options.curAnim[this.prop]=\n!0;for(e in b.curAnim)b.curAnim[e]!==!0&&(a=!1);a&&b.complete&&b.complete.call(this.elem);b=!1}else e=c-this.startTime,this.state=e/b.duration,this.pos=b.easing(e,0,1,b.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b}};this.animate=function(a,d,b){var e,h=\"\",f,i,g;a.stopAnimation=!1;if(typeof b!==\"object\"||b===null)e=arguments,b={duration:e[2],easing:e[3],complete:e[4]};if(typeof b.duration!==\"number\")b.duration=400;b.easing=Math[b.easing]||Math.easeInOutSine;\nb.curAnim=Highcharts.extend({},d);for(g in d)i=new n(a,b,g),f=null,g===\"d\"?(i.paths=c.init(a,a.d,d.d),i.toD=d.d,e=0,f=1):a.attr?e=a.attr(g):(e=parseFloat(HighchartsAdapter._getStyle(a,g))||0,g!==\"opacity\"&&(h=\"px\")),f||(f=parseFloat(d[g])),i.custom(e,f,h)}},_getStyle:function(c,a){return window.getComputedStyle(c).getPropertyValue(a)},getScript:function(c,a){var d=l.getElementsByTagName(\"head\")[0],b=l.createElement(\"script\");b.type=\"text/javascript\";b.src=c;b.onload=a;d.appendChild(b)},inArray:function(c,\na){return a.indexOf?a.indexOf(c):p.indexOf.call(a,c)},adapterRun:function(c,a){return parseInt(HighchartsAdapter._getStyle(c,a),10)},grep:function(c,a){return p.filter.call(c,a)},map:function(c,a){for(var d=[],b=0,e=c.length;b<e;b++)d[b]=a.call(c[b],c[b],b,c);return d},offset:function(c){for(var a=0,d=0;c;)a+=c.offsetLeft,d+=c.offsetTop,c=c.offsetParent;return{left:a,top:d}},addEvent:function(c,a,d){o(c).bind(a,d)},removeEvent:function(c,a,d){o(c).unbind(a,d)},fireEvent:function(c,a,d,b){var e;l.createEvent&&\n(c.dispatchEvent||c.fireEvent)?(e=l.createEvent(\"Events\"),e.initEvent(a,!0,!0),e.target=c,Highcharts.extend(e,d),c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(a,e)):c.HCExtended===!0&&(d=d||{},c.trigger(a,d));d&&d.defaultPrevented&&(b=null);b&&b(d)},washMouseEvent:function(c){return c},stop:function(c){c.stopAnimation=!0},each:function(c,a){return Array.prototype.forEach.call(c,a)}}}();\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/adapters/standalone-framework.src.js",
    "content": "/**\n * @license Highcharts JS v3.0.6 (2013-10-04)\n *\n * Standalone Highcharts Framework\n *\n * License: MIT License\n */\n\n\n/*global Highcharts */\nvar HighchartsAdapter = (function () {\n\nvar UNDEFINED,\n\tdoc = document,\n\temptyArray = [],\n\ttimers = [],\n\ttimerId,\n\tFx;\n\nMath.easeInOutSine = function (t, b, c, d) {\n\treturn -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n};\n\n\n\n/**\n * Extend given object with custom events\n */\nfunction augment(obj) {\n\tfunction removeOneEvent(el, type, fn) {\n\t\tel.removeEventListener(type, fn, false);\n\t}\n\n\tfunction IERemoveOneEvent(el, type, fn) {\n\t\tfn = el.HCProxiedMethods[fn.toString()];\n\t\tel.detachEvent('on' + type, fn);\n\t}\n\n\tfunction removeAllEvents(el, type) {\n\t\tvar events = el.HCEvents,\n\t\t\tremove,\n\t\t\ttypes,\n\t\t\tlen,\n\t\t\tn;\n\n\t\tif (el.removeEventListener) {\n\t\t\tremove = removeOneEvent;\n\t\t} else if (el.attachEvent) {\n\t\t\tremove = IERemoveOneEvent;\n\t\t} else {\n\t\t\treturn; // break on non-DOM events\n\t\t}\n\n\n\t\tif (type) {\n\t\t\ttypes = {};\n\t\t\ttypes[type] = true;\n\t\t} else {\n\t\t\ttypes = events;\n\t\t}\n\n\t\tfor (n in types) {\n\t\t\tif (events[n]) {\n\t\t\t\tlen = events[n].length;\n\t\t\t\twhile (len--) {\n\t\t\t\t\tremove(el, n, events[n][len]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!obj.HCExtended) {\n\t\tHighcharts.extend(obj, {\n\t\t\tHCExtended: true,\n\n\t\t\tHCEvents: {},\n\n\t\t\tbind: function (name, fn) {\n\t\t\t\tvar el = this,\n\t\t\t\t\tevents = this.HCEvents,\n\t\t\t\t\twrappedFn;\n\n\t\t\t\t// handle DOM events in modern browsers\n\t\t\t\tif (el.addEventListener) {\n\t\t\t\t\tel.addEventListener(name, fn, false);\n\n\t\t\t\t// handle old IE implementation\n\t\t\t\t} else if (el.attachEvent) {\n\t\t\t\t\t\n\t\t\t\t\twrappedFn = function (e) {\n\t\t\t\t\t\tfn.call(el, e);\n\t\t\t\t\t};\n\n\t\t\t\t\tif (!el.HCProxiedMethods) {\n\t\t\t\t\t\tel.HCProxiedMethods = {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// link wrapped fn with original fn, so we can get this in removeEvent\n\t\t\t\t\tel.HCProxiedMethods[fn.toString()] = wrappedFn;\n\n\t\t\t\t\tel.attachEvent('on' + name, wrappedFn);\n\t\t\t\t}\n\n\n\t\t\t\tif (events[name] === UNDEFINED) {\n\t\t\t\t\tevents[name] = [];\n\t\t\t\t}\n\n\t\t\t\tevents[name].push(fn);\n\t\t\t},\n\n\t\t\tunbind: function (name, fn) {\n\t\t\t\tvar events,\n\t\t\t\t\tindex;\n\n\t\t\t\tif (name) {\n\t\t\t\t\tevents = this.HCEvents[name] || [];\n\t\t\t\t\tif (fn) {\n\t\t\t\t\t\tindex = HighchartsAdapter.inArray(fn, events);\n\t\t\t\t\t\tif (index > -1) {\n\t\t\t\t\t\t\tevents.splice(index, 1);\n\t\t\t\t\t\t\tthis.HCEvents[name] = events;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.removeEventListener) {\n\t\t\t\t\t\t\tremoveOneEvent(this, name, fn);\n\t\t\t\t\t\t} else if (this.attachEvent) {\n\t\t\t\t\t\t\tIERemoveOneEvent(this, name, fn);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tremoveAllEvents(this, name);\n\t\t\t\t\t\tthis.HCEvents[name] = [];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tremoveAllEvents(this);\n\t\t\t\t\tthis.HCEvents = {};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\ttrigger: function (name, args) {\n\t\t\t\tvar events = this.HCEvents[name] || [],\n\t\t\t\t\ttarget = this,\n\t\t\t\t\tlen = events.length,\n\t\t\t\t\ti,\n\t\t\t\t\tpreventDefault,\n\t\t\t\t\tfn;\n\n\t\t\t\t// Attach a simple preventDefault function to skip default handler if called\n\t\t\t\tpreventDefault = function () {\n\t\t\t\t\targs.defaultPrevented = true;\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tfn = events[i];\n\n\t\t\t\t\t// args is never null here\n\t\t\t\t\tif (args.stopped) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\targs.preventDefault = preventDefault;\n\t\t\t\t\targs.target = target;\n\t\t\t\t\targs.type = name; // #2297\t\n\t\t\t\t\t\n\t\t\t\t\t// If the event handler return false, prevent the default handler from executing\n\t\t\t\t\tif (fn.call(this, args) === false) {\n\t\t\t\t\t\targs.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\treturn obj;\n}\n\n\nreturn {\n\t/**\n\t * Initialize the adapter. This is run once as Highcharts is first run.\n\t */\n\tinit: function (pathAnim) {\n\n\t\t/**\n\t\t * Compatibility section to add support for legacy IE. This can be removed if old IE \n\t\t * support is not needed.\n\t\t */\n\t\tif (!doc.defaultView) {\n\t\t\tthis._getStyle = function (el, prop) {\n\t\t\t\tvar val;\n\t\t\t\tif (el.style[prop]) {\n\t\t\t\t\treturn el.style[prop];\n\t\t\t\t} else {\n\t\t\t\t\tif (prop === 'opacity') {\n\t\t\t\t\t\tprop = 'filter';\n\t\t\t\t\t}\n\t\t\t\t\t/*jslint unparam: true*/\n\t\t\t\t\tval = el.currentStyle[prop.replace(/\\-(\\w)/g, function (a, b) { return b.toUpperCase(); })];\n\t\t\t\t\tif (prop === 'filter') {\n\t\t\t\t\t\tval = val.replace(\n\t\t\t\t\t\t\t/alpha\\(opacity=([0-9]+)\\)/, \n\t\t\t\t\t\t\tfunction (a, b) { \n\t\t\t\t\t\t\t\treturn b / 100; \n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t/*jslint unparam: false*/\n\t\t\t\t\treturn val === '' ? 1 : val;\n\t\t\t\t} \n\t\t\t};\n\t\t\tthis.adapterRun = function (elem, method) {\n\t\t\t\tvar alias = { width: 'clientWidth', height: 'clientHeight' }[method];\n\n\t\t\t\tif (alias) {\n\t\t\t\t\telem.style.zoom = 1;\n\t\t\t\t\treturn elem[alias] - 2 * parseInt(HighchartsAdapter._getStyle(elem, 'padding'), 10);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tif (!Array.prototype.forEach) {\n\t\t\tthis.each = function (arr, fn) { // legacy\n\t\t\t\tvar i = 0, \n\t\t\t\t\tlen = arr.length;\n\t\t\t\tfor (; i < len; i++) {\n\t\t\t\t\tif (fn.call(arr[i], arr[i], i, arr) === false) {\n\t\t\t\t\t\treturn i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tif (!Array.prototype.indexOf) {\n\t\t\tthis.inArray = function (item, arr) {\n\t\t\t\tvar len, \n\t\t\t\t\ti = 0;\n\n\t\t\t\tif (arr) {\n\t\t\t\t\tlen = arr.length;\n\t\t\t\t\t\n\t\t\t\t\tfor (; i < len; i++) {\n\t\t\t\t\t\tif (arr[i] === item) {\n\t\t\t\t\t\t\treturn i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t};\n\t\t}\n\n\t\tif (!Array.prototype.filter) {\n\t\t\tthis.grep = function (elements, callback) {\n\t\t\t\tvar ret = [],\n\t\t\t\t\ti = 0,\n\t\t\t\t\tlength = elements.length;\n\n\t\t\t\tfor (; i < length; i++) {\n\t\t\t\t\tif (!!callback(elements[i], i)) {\n\t\t\t\t\t\tret.push(elements[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn ret;\n\t\t\t};\n\t\t}\n\n\t\t//--- End compatibility section ---\n\n\n\t\t/**\n\t\t * Start of animation specific code\n\t\t */\n\t\tFx = function (elem, options, prop) {\n\t\t\tthis.options = options;\n\t\t\tthis.elem = elem;\n\t\t\tthis.prop = prop;\n\t\t};\n\t\tFx.prototype = {\n\t\t\t\n\t\t\tupdate: function () {\n\t\t\t\tvar styles,\n\t\t\t\t\tpaths = this.paths,\n\t\t\t\t\telem = this.elem,\n\t\t\t\t\telemelem = elem.element; // if destroyed, it is null\n\n\t\t\t\t// Animating a path definition on SVGElement\n\t\t\t\tif (paths && elemelem) {\n\t\t\t\t\telem.attr('d', pathAnim.step(paths[0], paths[1], this.now, this.toD));\n\t\t\t\t\n\t\t\t\t// Other animations on SVGElement\n\t\t\t\t} else if (elem.attr) {\n\t\t\t\t\tif (elemelem) {\n\t\t\t\t\t\telem.attr(this.prop, this.now);\n\t\t\t\t\t}\n\n\t\t\t\t// HTML styles\n\t\t\t\t} else {\n\t\t\t\t\tstyles = {};\n\t\t\t\t\tstyles[elem] = this.now + this.unit;\n\t\t\t\t\tHighcharts.css(elem, styles);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (this.options.step) {\n\t\t\t\t\tthis.options.step.call(this.elem, this.now, this);\n\t\t\t\t}\n\n\t\t\t},\n\t\t\tcustom: function (from, to, unit) {\n\t\t\t\tvar self = this,\n\t\t\t\t\tt = function (gotoEnd) {\n\t\t\t\t\t\treturn self.step(gotoEnd);\n\t\t\t\t\t},\n\t\t\t\t\ti;\n\n\t\t\t\tthis.startTime = +new Date();\n\t\t\t\tthis.start = from;\n\t\t\t\tthis.end = to;\n\t\t\t\tthis.unit = unit;\n\t\t\t\tthis.now = this.start;\n\t\t\t\tthis.pos = this.state = 0;\n\n\t\t\t\tt.elem = this.elem;\n\n\t\t\t\tif (t() && timers.push(t) === 1) {\n\t\t\t\t\ttimerId = setInterval(function () {\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor (i = 0; i < timers.length; i++) {\n\t\t\t\t\t\t\tif (!timers[i]()) {\n\t\t\t\t\t\t\t\ttimers.splice(i--, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!timers.length) {\n\t\t\t\t\t\t\tclearInterval(timerId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 13);\n\t\t\t\t}\n\t\t\t},\n\t\t\t\n\t\t\tstep: function (gotoEnd) {\n\t\t\t\tvar t = +new Date(),\n\t\t\t\t\tret,\n\t\t\t\t\tdone,\n\t\t\t\t\toptions = this.options,\n\t\t\t\t\ti;\n\n\t\t\t\tif (this.elem.stopAnimation) {\n\t\t\t\t\tret = false;\n\n\t\t\t\t} else if (gotoEnd || t >= options.duration + this.startTime) {\n\t\t\t\t\tthis.now = this.end;\n\t\t\t\t\tthis.pos = this.state = 1;\n\t\t\t\t\tthis.update();\n\n\t\t\t\t\tthis.options.curAnim[this.prop] = true;\n\n\t\t\t\t\tdone = true;\n\t\t\t\t\tfor (i in options.curAnim) {\n\t\t\t\t\t\tif (options.curAnim[i] !== true) {\n\t\t\t\t\t\t\tdone = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\tif (options.complete) {\n\t\t\t\t\t\t\toptions.complete.call(this.elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tret = false;\n\n\t\t\t\t} else {\n\t\t\t\t\tvar n = t - this.startTime;\n\t\t\t\t\tthis.state = n / options.duration;\n\t\t\t\t\tthis.pos = options.easing(n, 0, 1, options.duration);\n\t\t\t\t\tthis.now = this.start + ((this.end - this.start) * this.pos);\n\t\t\t\t\tthis.update();\n\t\t\t\t\tret = true;\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * The adapter animate method\n\t\t */\n\t\tthis.animate = function (el, prop, opt) {\n\t\t\tvar start,\n\t\t\t\tunit = '',\n\t\t\t\tend,\n\t\t\t\tfx,\n\t\t\t\targs,\n\t\t\t\tname;\n\n\t\t\tel.stopAnimation = false; // ready for new\n\n\t\t\tif (typeof opt !== 'object' || opt === null) {\n\t\t\t\targs = arguments;\n\t\t\t\topt = {\n\t\t\t\t\tduration: args[2],\n\t\t\t\t\teasing: args[3],\n\t\t\t\t\tcomplete: args[4]\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (typeof opt.duration !== 'number') {\n\t\t\t\topt.duration = 400;\n\t\t\t}\n\t\t\topt.easing = Math[opt.easing] || Math.easeInOutSine;\n\t\t\topt.curAnim = Highcharts.extend({}, prop);\n\t\t\t\n\t\t\tfor (name in prop) {\n\t\t\t\tfx = new Fx(el, opt, name);\n\t\t\t\tend = null;\n\t\t\t\t\n\t\t\t\tif (name === 'd') {\n\t\t\t\t\tfx.paths = pathAnim.init(\n\t\t\t\t\t\tel,\n\t\t\t\t\t\tel.d,\n\t\t\t\t\t\tprop.d\n\t\t\t\t\t);\n\t\t\t\t\tfx.toD = prop.d;\n\t\t\t\t\tstart = 0;\n\t\t\t\t\tend = 1;\n\t\t\t\t} else if (el.attr) {\n\t\t\t\t\tstart = el.attr(name);\n\t\t\t\t} else {\n\t\t\t\t\tstart = parseFloat(HighchartsAdapter._getStyle(el, name)) || 0;\n\t\t\t\t\tif (name !== 'opacity') {\n\t\t\t\t\t\tunit = 'px';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\tif (!end) {\n\t\t\t\t\tend = parseFloat(prop[name]);\n\t\t\t\t}\n\t\t\t\tfx.custom(start, end, unit);\n\t\t\t}\t\n\t\t};\n\t},\n\n\t/**\n\t * Internal method to return CSS value for given element and property\n\t */\n\t_getStyle: function (el, prop) {\n\t\treturn window.getComputedStyle(el).getPropertyValue(prop);\n\t},\n\n\t/**\n\t * Downloads a script and executes a callback when done.\n\t * @param {String} scriptLocation\n\t * @param {Function} callback\n\t */\n\tgetScript: function (scriptLocation, callback) {\n\t\t// We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.\n\t\tvar head = doc.getElementsByTagName('head')[0],\n\t\t\tscript = doc.createElement('script');\n\n\t\tscript.type = 'text/javascript';\n\t\tscript.src = scriptLocation;\n\t\tscript.onload = callback;\n\n\t\thead.appendChild(script);\n\t},\n\n\t/**\n\t * Return the index of an item in an array, or -1 if not found\n\t */\n\tinArray: function (item, arr) {\n\t\treturn arr.indexOf ? arr.indexOf(item) : emptyArray.indexOf.call(arr, item);\n\t},\n\n\n\t/**\n\t * A direct link to adapter methods\n\t */\n\tadapterRun: function (elem, method) {\n\t\treturn parseInt(HighchartsAdapter._getStyle(elem, method), 10);\n\t},\n\n\t/**\n\t * Filter an array\n\t */\n\tgrep: function (elements, callback) {\n\t\treturn emptyArray.filter.call(elements, callback);\n\t},\n\n\t/**\n\t * Map an array\n\t */\n\tmap: function (arr, fn) {\n\t\tvar results = [], i = 0, len = arr.length;\n\n\t\tfor (; i < len; i++) {\n\t\t\tresults[i] = fn.call(arr[i], arr[i], i, arr);\n\t\t}\n\n\t\treturn results;\n\t},\n\n\toffset: function (el) {\n\t\tvar left = 0,\n\t\t\ttop = 0;\n\n\t\twhile (el) {\n\t\t\tleft += el.offsetLeft;\n\t\t\ttop += el.offsetTop;\n\t\t\tel = el.offsetParent;\n\t\t}\n\n\t\treturn {\n\t\t\tleft: left,\n\t\t\ttop: top\n\t\t};\n\t},\n\n\t/**\n\t * Add an event listener\n\t */\n\taddEvent: function (el, type, fn) {\n\t\taugment(el).bind(type, fn);\n\t},\n\n\t/**\n\t * Remove event added with addEvent\n\t */\n\tremoveEvent: function (el, type, fn) {\n\t\taugment(el).unbind(type, fn);\n\t},\n\n\t/**\n\t * Fire an event on a custom object\n\t */\n\tfireEvent: function (el, type, eventArguments, defaultFunction) {\n\t\tvar e;\n\n\t\tif (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {\n\t\t\te = doc.createEvent('Events');\n\t\t\te.initEvent(type, true, true);\n\t\t\te.target = el;\n\n\t\t\tHighcharts.extend(e, eventArguments);\n\n\t\t\tif (el.dispatchEvent) {\n\t\t\t\tel.dispatchEvent(e);\n\t\t\t} else {\n\t\t\t\tel.fireEvent(type, e);\n\t\t\t}\n\n\t\t} else if (el.HCExtended === true) {\n\t\t\teventArguments = eventArguments || {};\n\t\t\tel.trigger(type, eventArguments);\n\t\t}\n\n\t\tif (eventArguments && eventArguments.defaultPrevented) {\n\t\t\tdefaultFunction = null;\n\t\t}\n\n\t\tif (defaultFunction) {\n\t\t\tdefaultFunction(eventArguments);\n\t\t}\n\t},\n\n\twashMouseEvent: function (e) {\n\t\treturn e;\n\t},\n\n\n\t/**\n\t * Stop running animation\n\t */\n\tstop: function (el) {\n\t\tel.stopAnimation = true;\n\t},\n\n\t/**\n\t * Utility for iterating over an array. Parameters are reversed compared to jQuery.\n\t * @param {Array} arr\n\t * @param {Function} fn\n\t */\n\teach: function (arr, fn) { // modern browsers\n\t\treturn Array.prototype.forEach.call(arr, fn);\n\t}\n};\n}());\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/highcharts-more.js",
    "content": "/*\n Highcharts JS v3.0.6 (2013-10-04)\n\n (c) 2009-2013 Torstein Hønsi\n\n License: www.highcharts.com/license\n*/\n(function(j,C){function J(a,b,c){this.init.call(this,a,b,c)}function K(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var c=this.xAxis.center;a.push(\"L\",c[0],c[1])},this.closedStacks=!0}function L(a,b){var c=this.chart,d=this.options.animation,g=this.group,f=this.markerGroup,e=this.xAxis.center,i=c.plotLeft,n=c.plotTop;if(c.polar){if(c.renderer.isSVG)if(d===!0&&(d={}),b){if(c={translateX:e[0]+i,translateY:e[1]+n,scaleX:0.001,scaleY:0.001},g.attr(c),f)f.attrSetters=g.attrSetters,\nf.attr(c)}else c={translateX:i,translateY:n,scaleX:1,scaleY:1},g.animate(c,d),f&&f.animate(c,d),this.animate=null}else a.call(this,b)}var P=j.arrayMin,Q=j.arrayMax,s=j.each,F=j.extend,p=j.merge,R=j.map,r=j.pick,v=j.pInt,m=j.getOptions().plotOptions,h=j.seriesTypes,x=j.extendClass,M=j.splat,o=j.wrap,N=j.Axis,u=j.Tick,z=j.Series,q=h.column.prototype,t=Math,D=t.round,A=t.floor,S=t.max,w=function(){};F(J.prototype,{init:function(a,b,c){var d=this,g=d.defaultOptions;d.chart=b;if(b.angular)g.background=\n{};d.options=a=p(g,a);(a=a.background)&&s([].concat(M(a)).reverse(),function(a){var b=a.backgroundColor,a=p(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a)})},defaultOptions:{center:[\"50%\",\"50%\"],size:\"85%\",startAngle:0},defaultBackgroundOptions:{shape:\"circle\",borderWidth:1,borderColor:\"silver\",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,\"#FFF\"],[1,\"#DDD\"]]},from:Number.MIN_VALUE,innerRadius:0,to:Number.MAX_VALUE,\nouterRadius:\"105%\"}});var G=N.prototype,u=u.prototype,T={getOffset:w,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:w,setCategories:w,setTitle:w},O={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:\"center\",x:0,y:null},minorGridLineWidth:0,minorTickInterval:\"auto\",minorTickLength:10,minorTickPosition:\"inside\",minorTickWidth:1,plotBands:[],tickLength:10,tickPosition:\"inside\",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,\ndistance:15,x:0,y:null},maxPadding:0,minPadding:0,plotBands:[],showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:\"circle\",labels:{align:\"right\",x:-3,y:-2},plotBands:[],showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){this.options=p(this.defaultOptions,this.defaultRadialOptions,a)},getOffset:function(){G.getOffset.call(this);this.chart.axisOffset[this.side]=0},getLinePath:function(a,b){var c=this.center,b=r(b,c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+\nc[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){G.setAxisTranslation.call(this);if(this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.isXAxis))this.minPixelPadding=this.transA*this.minPointOffset+(this.reversed?(this.endAngleRad-this.startAngleRad)/4:0)},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.categories&&\n1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){G.setAxisSize.call(this);if(this.isRadial)this.center=this.pane.center=h.pie.prototype.getCenter.call(this.pane),this.len=this.width=this.height=this.isCircular?this.center[2]*(this.endAngleRad-this.startAngleRad)/2:this.center[2]/2},getPosition:function(a,b){if(!this.isCircular)b=this.translate(a),a=this.min;return this.postTranslate(this.translate(a),r(b,this.center[2]/2)-this.offset)},postTranslate:function(a,b){var c=this.chart,\nd=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,g=this.startAngleRad,f=d[2]/2,e=[r(c.outerRadius,\"100%\"),c.innerRadius,r(c.thickness,10)],i=/%$/,n,l=this.isCircular;this.options.gridLineInterpolation===\"polygon\"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(l||(e[0]=this.translate(a),e[1]=this.translate(b)),e=R(e,function(a){i.test(a)&&(a=v(a,10)*f/100);return a}),c.shape===\n\"circle\"||!l?(a=-Math.PI/2,b=Math.PI*1.5,n=!0):(a=g+this.translate(a),b=g+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],e[0],e[0],{start:a,end:b,innerR:r(e[1],e[0]-e[2]),open:n}));return d},getPlotLinePath:function(a,b){var c=this.center,d=this.chart,g=this.getPosition(a),f,e,i;this.isCircular?i=[\"M\",c[0]+d.plotLeft,c[1]+d.plotTop,\"L\",g.x,g.y]:this.options.gridLineInterpolation===\"circle\"?(a=this.translate(a))&&(i=this.getLinePath(0,a)):(f=d.xAxis[0],i=[],a=this.translate(a),\nc=f.tickPositions,f.autoConnect&&(c=c.concat([c[0]])),b&&(c=[].concat(c).reverse()),s(c,function(c,b){e=f.getPosition(c,a);i.push(b?\"L\":\"M\",e.x,e.y)}));return i},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};o(G,\"init\",function(a,b,c){var k;var d=b.angular,g=b.polar,f=c.isX,e=d&&f,i,n;n=b.options;var l=c.pane||0;if(d){if(F(this,e?T:O),i=!f)this.defaultRadialOptions=\nthis.defaultRadialGaugeOptions}else if(g)F(this,O),this.defaultRadialOptions=(i=f)?this.defaultRadialXOptions:p(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!e&&(d||g)){a=this.options;if(!b.panes)b.panes=[];this.pane=(k=b.panes[l]=b.panes[l]||new J(M(n.pane)[l],b,this),l=k);l=l.options;b.inverted=!1;n.chart.zoomType=null;this.startAngleRad=b=(l.startAngle-90)*Math.PI/180;this.endAngleRad=n=(r(l.endAngle,l.startAngle+360)-90)*Math.PI/180;this.offset=a.offset||0;if((this.isCircular=\ni)&&c.max===C&&n-b===2*Math.PI)this.autoConnect=!0}});o(u,\"getPosition\",function(a,b,c,d,g){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,g)});o(u,\"getLabelPosition\",function(a,b,c,d,g,f,e,i,n){var l=this.axis,k=f.y,h=f.align,j=(l.translate(this.pos)+l.startAngleRad+Math.PI/2)/Math.PI*180%360;l.isRadial?(a=l.getPosition(this.pos,l.center[2]/2+r(f.distance,-25)),f.rotation===\"auto\"?d.attr({rotation:j}):k===null&&(k=v(d.styles.lineHeight)*0.9-d.getBBox().height/2),h===null&&\n(h=l.isCircular?j>20&&j<160?\"left\":j>200&&j<340?\"right\":\"center\":\"center\",d.attr({align:h})),a.x+=f.x,a.y+=k):a=a.call(this,b,c,d,g,f,e,i,n);return a});o(u,\"getMarkPath\",function(a,b,c,d,g,f,e){var i=this.axis;i.isRadial?(a=i.getPosition(this.pos,i.center[2]/2+d),b=[\"M\",b,c,\"L\",a.x,a.y]):b=a.call(this,b,c,d,g,f,e);return b});m.arearange=p(m.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.low}</b> - <b>{point.high}</b><br/>'},\ntrackByArea:!0,dataLabels:{verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0}});h.arearange=j.extendClass(h.area,{type:\"arearange\",pointArrayMap:[\"low\",\"high\"],toYData:function(a){return[a.low,a.high]},pointValKey:\"low\",getSegments:function(){var a=this;s(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y=null;else if(b.low===null&&b.high!==null)b.y=b.high});z.prototype.getSegments.call(this)},translate:function(){var a=this.yAxis;h.area.prototype.translate.apply(this);\ns(this.points,function(b){var c=b.low,d=b.high,g=b.plotY;d===null&&c===null?b.y=null:c===null?(b.plotLow=b.plotY=null,b.plotHigh=a.translate(d,0,1,0,1)):d===null?(b.plotLow=g,b.plotHigh=null):(b.plotLow=g,b.plotHigh=a.translate(d,0,1,0,1))})},getSegmentPath:function(a){var b,c=[],d=a.length,g=z.prototype.getSegmentPath,f,e;e=this.options;var i=e.step;for(b=HighchartsAdapter.grep(a,function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotX,plotY:f.plotHigh});a=g.call(this,\nb);if(i)i===!0&&(i=\"left\"),e.step={left:\"right\",center:\"center\",right:\"left\"}[i];c=g.call(this,c);e.step=i;e=[].concat(a,c);c[0]=\"L\";this.areaPath=this.areaPath.concat(a,c);return e},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],g=z.prototype,f=this.options.dataLabels,e,i=this.chart.inverted;if(f.enabled||this._hasPointLabels){for(c=b;c--;)e=a[c],e.y=e.high,e.plotY=e.plotHigh,d[c]=e.dataLabel,e.dataLabel=e.dataLabelUpper,e.below=!1,i?(f.align=\"left\",f.x=f.xHigh):f.y=f.yHigh;g.drawDataLabels.apply(this,\narguments);for(c=b;c--;)e=a[c],e.dataLabelUpper=e.dataLabel,e.dataLabel=d[c],e.y=e.low,e.plotY=e.plotLow,e.below=!0,i?(f.align=\"right\",f.x=f.xLow):f.y=f.yLow;g.drawDataLabels.apply(this,arguments)}},alignDataLabel:h.column.prototype.alignDataLabel,getSymbol:h.column.prototype.getSymbol,drawPoints:w});m.areasplinerange=p(m.arearange);h.areasplinerange=x(h.arearange,{type:\"areasplinerange\",getPointSpline:h.spline.prototype.getPointSpline});m.columnrange=p(m.column,m.arearange,{lineWidth:1,pointRange:null});\nh.columnrange=x(h.arearange,{type:\"columnrange\",translate:function(){var a=this,b=a.yAxis,c;q.translate.apply(a);s(a.points,function(d){var g=d.shapeArgs,f=a.options.minPointLength,e;d.plotHigh=c=b.translate(d.high,0,1,0,1);d.plotLow=d.plotY;e=c;d=d.plotY-c;d<f&&(f-=d,d+=f,e-=f/2);g.height=d;g.y=e})},trackerGroups:[\"group\",\"dataLabels\"],drawGraph:w,pointAttrToOptions:q.pointAttrToOptions,drawPoints:q.drawPoints,drawTracker:q.drawTracker,animate:q.animate,getColumnMetrics:q.getColumnMetrics});m.gauge=\np(m.line,{dataLabels:{enabled:!0,y:15,borderWidth:1,borderColor:\"silver\",borderRadius:3,style:{fontWeight:\"bold\"},verticalAlign:\"top\",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:\"\"},showInLegend:!1});u={type:\"gauge\",pointClass:j.extendClass(j.Point,{setState:function(a){this.state=a}}),angular:!0,drawGraph:w,fixedBox:!0,trackerGroups:[\"group\",\"dataLabels\"],translate:function(){var a=this.yAxis,b=this.options,c=a.center;this.generatePoints();s(this.points,function(d){var g=p(b.dial,d.dial),f=\nv(r(g.radius,80))*c[2]/200,e=v(r(g.baseLength,70))*f/100,i=v(r(g.rearLength,10))*f/100,n=g.baseWidth||3,l=g.topWidth||1,k=a.startAngleRad+a.translate(d.y,null,null,null,!0);b.wrap===!1&&(k=Math.max(a.startAngleRad,Math.min(a.endAngleRad,k)));k=k*180/Math.PI;d.shapeType=\"path\";d.shapeArgs={d:g.path||[\"M\",-i,-n/2,\"L\",e,-n/2,f,-l/2,f,l/2,e,n/2,-i,n/2,\"z\"],translateX:c[0],translateY:c[1],rotation:k};d.plotX=c[0];d.plotY=c[1]})},drawPoints:function(){var a=this,b=a.yAxis.center,c=a.pivot,d=a.options,g=\nd.pivot,f=a.chart.renderer;s(a.points,function(c){var b=c.graphic,g=c.shapeArgs,l=g.d,k=p(d.dial,c.dial);b?(b.animate(g),g.d=l):c.graphic=f[c.shapeType](g).attr({stroke:k.borderColor||\"none\",\"stroke-width\":k.borderWidth||0,fill:k.backgroundColor||\"black\",rotation:g.rotation}).add(a.group)});c?c.animate({translateX:b[0],translateY:b[1]}):a.pivot=f.circle(0,0,r(g.radius,5)).attr({\"stroke-width\":g.borderWidth||0,stroke:g.borderColor||\"silver\",fill:g.backgroundColor||\"black\"}).translate(b[0],b[1]).add(a.group)},\nanimate:function(a){var b=this;if(!a)s(b.points,function(a){var d=a.graphic;d&&(d.attr({rotation:b.yAxis.startAngleRad*180/Math.PI}),d.animate({rotation:a.shapeArgs.rotation},b.options.animation))}),b.animate=null},render:function(){this.group=this.plotGroup(\"group\",\"series\",this.visible?\"visible\":\"hidden\",this.options.zIndex,this.chart.seriesGroup);h.pie.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:h.pie.prototype.setData,drawTracker:h.column.prototype.drawTracker};h.gauge=\nj.extendClass(h.line,u);m.boxplot=p(m.column,{fillColor:\"#FFFFFF\",lineWidth:1,medianWidth:2,states:{hover:{brightness:-0.3}},threshold:null,tooltip:{pointFormat:'<span style=\"color:{series.color};font-weight:bold\">{series.name}</span><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'},whiskerLength:\"50%\",whiskerWidth:2});h.boxplot=x(h.column,{type:\"boxplot\",pointArrayMap:[\"low\",\"q1\",\"median\",\"q3\",\"high\"],\ntoYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:\"high\",pointAttrToOptions:{fill:\"fillColor\",stroke:\"color\",\"stroke-width\":\"lineWidth\"},drawDataLabels:w,translate:function(){var a=this.yAxis,b=this.pointArrayMap;h.column.prototype.translate.apply(this);s(this.points,function(c){s(b,function(b){c[b]!==null&&(c[b+\"Plot\"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a=this,b=a.points,c=a.options,d=a.chart.renderer,g,f,e,i,n,l,k,h,j,m,o,H,p,E,I,q,w,t,v,u,z,y,x=a.doQuartiles!==\n!1,B=parseInt(a.options.whiskerLength,10)/100;s(b,function(b){j=b.graphic;z=b.shapeArgs;o={};E={};q={};y=b.color||a.color;if(b.plotY!==C)if(g=b.pointAttr[b.selected?\"selected\":\"\"],w=z.width,t=A(z.x),v=t+w,u=D(w/2),f=A(x?b.q1Plot:b.lowPlot),e=A(x?b.q3Plot:b.lowPlot),i=A(b.highPlot),n=A(b.lowPlot),o.stroke=b.stemColor||c.stemColor||y,o[\"stroke-width\"]=r(b.stemWidth,c.stemWidth,c.lineWidth),o.dashstyle=b.stemDashStyle||c.stemDashStyle,E.stroke=b.whiskerColor||c.whiskerColor||y,E[\"stroke-width\"]=r(b.whiskerWidth,\nc.whiskerWidth,c.lineWidth),q.stroke=b.medianColor||c.medianColor||y,q[\"stroke-width\"]=r(b.medianWidth,c.medianWidth,c.lineWidth),k=o[\"stroke-width\"]%2/2,h=t+u+k,m=[\"M\",h,e,\"L\",h,i,\"M\",h,f,\"L\",h,n,\"z\"],x&&(k=g[\"stroke-width\"]%2/2,h=A(h)+k,f=A(f)+k,e=A(e)+k,t+=k,v+=k,H=[\"M\",t,e,\"L\",t,f,\"L\",v,f,\"L\",v,e,\"L\",t,e,\"z\"]),B&&(k=E[\"stroke-width\"]%2/2,i+=k,n+=k,p=[\"M\",h-u*B,i,\"L\",h+u*B,i,\"M\",h-u*B,n,\"L\",h+u*B,n]),k=q[\"stroke-width\"]%2/2,l=D(b.medianPlot)+k,I=[\"M\",t,l,\"L\",v,l,\"z\"],j)b.stem.animate({d:m}),B&&\nb.whiskers.animate({d:p}),x&&b.box.animate({d:H}),b.medianShape.animate({d:I});else{b.graphic=j=d.g().add(a.group);b.stem=d.path(m).attr(o).add(j);if(B)b.whiskers=d.path(p).attr(E).add(j);if(x)b.box=d.path(H).attr(g).add(j);b.medianShape=d.path(I).attr(q).add(j)}})}});m.errorbar=p(m.boxplot,{color:\"#000000\",grouping:!1,linkedTo:\":previous\",tooltip:{pointFormat:m.arearange.tooltip.pointFormat},whiskerWidth:null});h.errorbar=x(h.boxplot,{type:\"errorbar\",pointArrayMap:[\"low\",\"high\"],toYData:function(a){return[a.low,\na.high]},pointValKey:\"high\",doQuartiles:!1,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||h.column.prototype.getColumnMetrics.call(this)}});m.waterfall=p(m.column,{lineWidth:1,lineColor:\"#333\",dashStyle:\"dot\",borderColor:\"#333\"});h.waterfall=x(h.column,{type:\"waterfall\",upColorProp:\"fill\",pointArrayMap:[\"low\",\"y\"],pointValKey:\"y\",init:function(a,b){b.stacking=!0;h.column.prototype.init.call(this,a,b)},translate:function(){var a=this.options,b=this.yAxis,c,d,\ng,f,e,i,n,l,k;c=a.threshold;a=a.borderWidth%2/2;h.column.prototype.translate.apply(this);l=c;g=this.points;for(d=0,c=g.length;d<c;d++){f=g[d];e=f.shapeArgs;i=this.getStack(d);k=i.points[this.index];if(isNaN(f.y))f.y=this.yData[d];n=S(l,l+f.y)+k[0];e.y=b.translate(n,0,1);f.isSum||f.isIntermediateSum?(e.y=b.translate(k[1],0,1),e.height=b.translate(k[0],0,1)-e.y):l+=i.total;e.height<0&&(e.y+=e.height,e.height*=-1);f.plotY=e.y=D(e.y)-a;e.height=D(e.height);f.yBottom=e.y+e.height}},processData:function(a){var b=\nthis.yData,c=this.points,d,g=b.length,f=this.options.threshold||0,e,i,h,l,k,j;i=e=h=l=f;for(j=0;j<g;j++)k=b[j],d=c&&c[j]?c[j]:{},k===\"sum\"||d.isSum?b[j]=i:k===\"intermediateSum\"||d.isIntermediateSum?(b[j]=e,e=f):(i+=k,e+=k),h=Math.min(i,h),l=Math.max(i,l);z.prototype.processData.call(this,a);this.dataMin=h;this.dataMax=l},toYData:function(a){if(a.isSum)return\"sum\";else if(a.isIntermediateSum)return\"intermediateSum\";return a.y},getAttribs:function(){h.column.prototype.getAttribs.apply(this,arguments);\nvar a=this.options,b=a.states,c=a.upColor||this.color,a=j.Color(c).brighten(0.1).get(),d=p(this.pointAttr),g=this.upColorProp;d[\"\"][g]=c;d.hover[g]=b.hover.upColor||a;d.select[g]=b.select.upColor||c;s(this.points,function(a){if(a.y>0&&!a.color)a.pointAttr=d,a.color=c})},getGraphPath:function(){var a=this.data,b=a.length,c=D(this.options.lineWidth+this.options.borderWidth)%2/2,d=[],g,f,e;for(e=1;e<b;e++)f=a[e].shapeArgs,g=a[e-1].shapeArgs,f=[\"M\",g.x+g.width,g.y+c,\"L\",f.x,g.y+c],a[e-1].y<0&&(f[2]+=\ng.height,f[5]+=g.height),d=d.concat(f);return d},getExtremes:w,getStack:function(a){var b=this.yAxis.stacks,c=this.stackKey;this.processedYData[a]<this.options.threshold&&(c=\"-\"+c);return b[c][a]},drawGraph:z.prototype.drawGraph});m.bubble=p(m.scatter,{dataLabels:{inside:!0,style:{color:\"white\",textShadow:\"0px 0px 3px black\"},verticalAlign:\"middle\"},marker:{lineColor:null,lineWidth:1},minSize:8,maxSize:\"20%\",tooltip:{pointFormat:\"({point.x}, {point.y}), Size: {point.z}\"},turboThreshold:0,zThreshold:0});\nh.bubble=x(h.scatter,{type:\"bubble\",pointArrayMap:[\"y\",\"z\"],trackerGroups:[\"group\",\"dataLabelsGroup\"],pointAttrToOptions:{stroke:\"lineColor\",\"stroke-width\":\"lineWidth\",fill:\"fillColor\"},applyOpacity:function(a){var b=this.options.marker,c=r(b.fillOpacity,0.5),a=a||b.fillColor||this.color;c!==1&&(a=j.Color(a).setOpacity(c).get(\"rgba\"));return a},convertAttribs:function(){var a=z.prototype.convertAttribs.apply(this,arguments);a.fill=this.applyOpacity(a.fill);return a},getRadii:function(a,b,c,d){var g,\nf,e,i=this.zData,h=[];for(f=0,g=i.length;f<g;f++)e=b-a,e=e>0?(i[f]-a)/(b-a):0.5,h.push(t.ceil(c+e*(d-c))/2);this.radii=h},animate:function(a){var b=this.options.animation;if(!a)s(this.points,function(a){var d=a.graphic,a=a.shapeArgs;d&&a&&(d.attr(\"r\",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,g=this.radii;h.scatter.prototype.translate.call(this);for(a=b.length;a--;)c=b[a],d=g?g[a]:0,c.negative=c.z<(this.options.zThreshold||0),d>=this.minPxSize/2?(c.shapeType=\n\"circle\",c.shapeArgs={x:c.plotX,y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d,height:2*d}):c.shapeArgs=c.plotY=c.dlBox=C},drawLegendSymbol:function(a,b){var c=v(a.itemStyle.fontSize)/2;b.legendSymbol=this.chart.renderer.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker=!0},drawPoints:h.column.prototype.drawPoints,alignDataLabel:h.column.prototype.alignDataLabel});N.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,g=b,f=this.isXAxis,\ne=f?\"xData\":\"yData\",i=this.min,h={},j=t.min(c.plotWidth,c.plotHeight),k=Number.MAX_VALUE,m=-Number.MAX_VALUE,o=this.max-i,p=b/o,q=[];this.tickPositions&&(s(this.series,function(b){var c=b.options;if(b.type===\"bubble\"&&b.visible&&(a.allowZoomOutside=!0,q.push(b),f))s([\"minSize\",\"maxSize\"],function(a){var b=c[a],d=/%$/.test(b),b=v(b);h[a]=d?j*b/100:b}),b.minPxSize=h.minSize,b=b.zData,b.length&&(k=t.min(k,t.max(P(b),c.displayNegative===!1?c.zThreshold:-Number.MAX_VALUE)),m=t.max(m,Q(b)))}),s(q,function(a){var b=\na[e],c=b.length,j;f&&a.getRadii(k,m,h.minSize,h.maxSize);if(o>0)for(;c--;)j=a.radii[c],d=Math.min((b[c]-i)*p-j,d),g=Math.max((b[c]-i)*p+j,g)}),q.length&&o>0&&r(this.options.min,this.userMin)===C&&r(this.options.max,this.userMax)===C&&(g-=b,p*=(b+d-g)/b,this.min+=d/p,this.max+=g/p))};var y=z.prototype,m=j.Pointer.prototype;y.toXY=function(a){var b,c=this.chart;b=a.plotX;var d=a.plotY;a.rectPlotX=b;a.rectPlotY=d;a.clientX=(b/Math.PI*180+this.xAxis.pane.options.startAngle)%360;b=this.xAxis.postTranslate(a.plotX,\nthis.yAxis.len-d);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop};y.orderTooltipPoints=function(a){if(this.chart.polar&&(a.sort(function(a,c){return a.clientX-c.clientX}),a[0]))a[0].wrappedClientX=a[0].clientX+360,a.push(a[0])};o(h.area.prototype,\"init\",K);o(h.areaspline.prototype,\"init\",K);o(h.spline.prototype,\"getPointSpline\",function(a,b,c,d){var g,f,e,i,h,j,k;if(this.chart.polar){g=c.plotX;f=c.plotY;a=b[d-1];e=b[d+1];this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1]));\nif(a&&e)i=a.plotX,h=a.plotY,b=e.plotX,j=e.plotY,i=(1.5*g+i)/2.5,h=(1.5*f+h)/2.5,e=(1.5*g+b)/2.5,k=(1.5*f+j)/2.5,b=Math.sqrt(Math.pow(i-g,2)+Math.pow(h-f,2)),j=Math.sqrt(Math.pow(e-g,2)+Math.pow(k-f,2)),i=Math.atan2(h-f,i-g),h=Math.atan2(k-f,e-g),k=Math.PI/2+(i+h)/2,Math.abs(i-k)>Math.PI/2&&(k-=Math.PI),i=g+Math.cos(k)*b,h=f+Math.sin(k)*b,e=g+Math.cos(Math.PI+k)*j,k=f+Math.sin(Math.PI+k)*j,c.rightContX=e,c.rightContY=k;d?(c=[\"C\",a.rightContX||a.plotX,a.rightContY||a.plotY,i||g,h||f,g,f],a.rightContX=\na.rightContY=null):c=[\"M\",g,f]}else c=a.call(this,b,c,d);return c});o(y,\"translate\",function(a){a.call(this);if(this.chart.polar&&!this.preventPostTranslate)for(var a=this.points,b=a.length;b--;)this.toXY(a[b])});o(y,\"getSegmentPath\",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});o(y,\"animate\",L);o(q,\"animate\",L);o(y,\"setTooltipPoints\",function(a,b){this.chart.polar&&\nF(this.xAxis,{tooltipLen:360});return a.call(this,b)});o(q,\"translate\",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,g=b.startAngleRad,f=this.chart.renderer,e,h;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(h=b.length;h--;)e=b[h],a=e.barX+g,e.shapeType=\"path\",e.shapeArgs={d:f.symbols.arc(d[0],d[1],c-e.plotY,null,{start:a,end:a+e.pointWidth,innerR:c-r(e.yBottom,c)})},this.toXY(e)}});o(q,\"alignDataLabel\",function(a,b,c,d,g,f){if(this.chart.polar){a=b.rectPlotX/\nMath.PI*180;if(d.align===null)d.align=a>20&&a<160?\"left\":a>200&&a<340?\"right\":\"center\";if(d.verticalAlign===null)d.verticalAlign=a<45||a>315?\"bottom\":a>135&&a<225?\"top\":\"middle\";y.alignDataLabel.call(this,b,c,d,g,f)}else a.call(this,b,c,d,g,f)});o(m,\"getIndex\",function(a,b){var c,d=this.chart,g;d.polar?(g=d.xAxis[0].center,c=b.chartX-g[0]-d.plotLeft,d=b.chartY-g[1]-d.plotTop,c=180-Math.round(Math.atan2(c,d)/Math.PI*180)):c=a.call(this,b);return c});o(m,\"getCoordinates\",function(a,b){var c=this.chart,\nd={xAxis:[],yAxis:[]};c.polar?s(c.axes,function(a){var f=a.isXAxis,e=a.center,h=b.chartX-e[0]-c.plotLeft,e=b.chartY-e[1]-c.plotTop;d[f?\"xAxis\":\"yAxis\"].push({axis:a,value:a.translate(f?Math.PI-Math.atan2(h,e):Math.sqrt(Math.pow(h,2)+Math.pow(e,2)),!0)})}):d=a.call(this,b);return d})})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/highcharts-more.src.js",
    "content": "// ==ClosureCompiler==\n// @compilation_level SIMPLE_OPTIMIZATIONS\n\n/**\n * @license Highcharts JS v3.0.6 (2013-10-04)\n *\n * (c) 2009-2013 Torstein Hønsi\n *\n * License: www.highcharts.com/license\n */\n\n// JSLint options:\n/*global Highcharts, HighchartsAdapter, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console */\n\n(function (Highcharts, UNDEFINED) {\nvar arrayMin = Highcharts.arrayMin,\n\tarrayMax = Highcharts.arrayMax,\n\teach = Highcharts.each,\n\textend = Highcharts.extend,\n\tmerge = Highcharts.merge,\n\tmap = Highcharts.map,\n\tpick = Highcharts.pick,\n\tpInt = Highcharts.pInt,\n\tdefaultPlotOptions = Highcharts.getOptions().plotOptions,\n\tseriesTypes = Highcharts.seriesTypes,\n\textendClass = Highcharts.extendClass,\n\tsplat = Highcharts.splat,\n\twrap = Highcharts.wrap,\n\tAxis = Highcharts.Axis,\n\tTick = Highcharts.Tick,\n\tSeries = Highcharts.Series,\n\tcolProto = seriesTypes.column.prototype,\n\tmath = Math,\n\tmathRound = math.round,\n\tmathFloor = math.floor,\n\tmathMax = math.max,\n\tnoop = function () {};/**\n * The Pane object allows options that are common to a set of X and Y axes.\n * \n * In the future, this can be extended to basic Highcharts and Highstock.\n */\nfunction Pane(options, chart, firstAxis) {\n\tthis.init.call(this, options, chart, firstAxis);\n}\n\n// Extend the Pane prototype\nextend(Pane.prototype, {\n\t\n\t/**\n\t * Initiate the Pane object\n\t */\n\tinit: function (options, chart, firstAxis) {\n\t\tvar pane = this,\n\t\t\tbackgroundOption,\n\t\t\tdefaultOptions = pane.defaultOptions;\n\t\t\n\t\tpane.chart = chart;\n\t\t\n\t\t// Set options\n\t\tif (chart.angular) { // gauges\n\t\t\tdefaultOptions.background = {}; // gets extended by this.defaultBackgroundOptions\n\t\t}\n\t\tpane.options = options = merge(defaultOptions, options);\n\t\t\n\t\tbackgroundOption = options.background;\n\t\t\n\t\t// To avoid having weighty logic to place, update and remove the backgrounds,\n\t\t// push them to the first axis' plot bands and borrow the existing logic there.\n\t\tif (backgroundOption) {\n\t\t\teach([].concat(splat(backgroundOption)).reverse(), function (config) {\n\t\t\t\tvar backgroundColor = config.backgroundColor; // if defined, replace the old one (specific for gradients)\n\t\t\t\tconfig = merge(pane.defaultBackgroundOptions, config);\n\t\t\t\tif (backgroundColor) {\n\t\t\t\t\tconfig.backgroundColor = backgroundColor;\n\t\t\t\t}\n\t\t\t\tconfig.color = config.backgroundColor; // due to naming in plotBands\n\t\t\t\tfirstAxis.options.plotBands.unshift(config);\n\t\t\t});\n\t\t}\n\t},\n\t\n\t/**\n\t * The default options object\n\t */\n\tdefaultOptions: {\n\t\t// background: {conditional},\n\t\tcenter: ['50%', '50%'],\n\t\tsize: '85%',\n\t\tstartAngle: 0\n\t\t//endAngle: startAngle + 360\n\t},\t\n\t\n\t/**\n\t * The default background options\n\t */\n\tdefaultBackgroundOptions: {\n\t\tshape: 'circle',\n\t\tborderWidth: 1,\n\t\tborderColor: 'silver',\n\t\tbackgroundColor: {\n\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\tstops: [\n\t\t\t\t[0, '#FFF'],\n\t\t\t\t[1, '#DDD']\n\t\t\t]\n\t\t},\n\t\tfrom: Number.MIN_VALUE, // corrected to axis min\n\t\tinnerRadius: 0,\n\t\tto: Number.MAX_VALUE, // corrected to axis max\n\t\touterRadius: '105%'\n\t}\n\t\n});\nvar axisProto = Axis.prototype,\n\ttickProto = Tick.prototype;\n\t\n/**\n * Augmented methods for the x axis in order to hide it completely, used for the X axis in gauges\n */\nvar hiddenAxisMixin = {\n\tgetOffset: noop,\n\tredraw: function () {\n\t\tthis.isDirty = false; // prevent setting Y axis dirty\n\t},\n\trender: function () {\n\t\tthis.isDirty = false; // prevent setting Y axis dirty\n\t},\n\tsetScale: noop,\n\tsetCategories: noop,\n\tsetTitle: noop\n};\n\n/**\n * Augmented methods for the value axis\n */\n/*jslint unparam: true*/\nvar radialAxisMixin = {\n\tisRadial: true,\n\t\n\t/**\n\t * The default options extend defaultYAxisOptions\n\t */\n\tdefaultRadialGaugeOptions: {\n\t\tlabels: {\n\t\t\talign: 'center',\n\t\t\tx: 0,\n\t\t\ty: null // auto\n\t\t},\n\t\tminorGridLineWidth: 0,\n\t\tminorTickInterval: 'auto',\n\t\tminorTickLength: 10,\n\t\tminorTickPosition: 'inside',\n\t\tminorTickWidth: 1,\n\t\tplotBands: [],\n\t\ttickLength: 10,\n\t\ttickPosition: 'inside',\n\t\ttickWidth: 2,\n\t\ttitle: {\n\t\t\trotation: 0\n\t\t},\n\t\tzIndex: 2 // behind dials, points in the series group\n\t},\n\t\n\t// Circular axis around the perimeter of a polar chart\n\tdefaultRadialXOptions: {\n\t\tgridLineWidth: 1, // spokes\n\t\tlabels: {\n\t\t\talign: null, // auto\n\t\t\tdistance: 15,\n\t\t\tx: 0,\n\t\t\ty: null // auto\n\t\t},\n\t\tmaxPadding: 0,\n\t\tminPadding: 0,\n\t\tplotBands: [],\n\t\tshowLastLabel: false, \n\t\ttickLength: 0\n\t},\n\t\n\t// Radial axis, like a spoke in a polar chart\n\tdefaultRadialYOptions: {\n\t\tgridLineInterpolation: 'circle',\n\t\tlabels: {\n\t\t\talign: 'right',\n\t\t\tx: -3,\n\t\t\ty: -2\n\t\t},\n\t\tplotBands: [],\n\t\tshowLastLabel: false,\n\t\ttitle: {\n\t\t\tx: 4,\n\t\t\ttext: null,\n\t\t\trotation: 90\n\t\t}\n\t},\n\t\n\t/**\n\t * Merge and set options\n\t */\n\tsetOptions: function (userOptions) {\n\t\t\n\t\tthis.options = merge(\n\t\t\tthis.defaultOptions,\n\t\t\tthis.defaultRadialOptions,\n\t\t\tuserOptions\n\t\t);\n\t\t\n\t},\n\t\n\t/**\n\t * Wrap the getOffset method to return zero offset for title or labels in a radial \n\t * axis\n\t */\n\tgetOffset: function () {\n\t\t// Call the Axis prototype method (the method we're in now is on the instance)\n\t\taxisProto.getOffset.call(this);\n\t\t\n\t\t// Title or label offsets are not counted\n\t\tthis.chart.axisOffset[this.side] = 0;\n\t},\n\n\n\t/**\n\t * Get the path for the axis line. This method is also referenced in the getPlotLinePath\n\t * method.\n\t */\n\tgetLinePath: function (lineWidth, radius) {\n\t\tvar center = this.center;\n\t\tradius = pick(radius, center[2] / 2 - this.offset);\n\t\t\n\t\treturn this.chart.renderer.symbols.arc(\n\t\t\tthis.left + center[0],\n\t\t\tthis.top + center[1],\n\t\t\tradius,\n\t\t\tradius, \n\t\t\t{\n\t\t\t\tstart: this.startAngleRad,\n\t\t\t\tend: this.endAngleRad,\n\t\t\t\topen: true,\n\t\t\t\tinnerR: 0\n\t\t\t}\n\t\t);\n\t},\n\n\t/**\n\t * Override setAxisTranslation by setting the translation to the difference\n\t * in rotation. This allows the translate method to return angle for \n\t * any given value.\n\t */\n\tsetAxisTranslation: function () {\n\t\t\n\t\t// Call uber method\t\t\n\t\taxisProto.setAxisTranslation.call(this);\n\t\t\t\n\t\t// Set transA and minPixelPadding\n\t\tif (this.center) { // it's not defined the first time\n\t\t\tif (this.isCircular) {\n\t\t\t\t\n\t\t\t\tthis.transA = (this.endAngleRad - this.startAngleRad) / \n\t\t\t\t\t((this.max - this.min) || 1);\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t} else { \n\t\t\t\tthis.transA = (this.center[2] / 2) / ((this.max - this.min) || 1);\n\t\t\t}\n\t\t\t\n\t\t\tif (this.isXAxis) {\n\t\t\t\tthis.minPixelPadding = this.transA * this.minPointOffset +\n\t\t\t\t\t(this.reversed ? (this.endAngleRad - this.startAngleRad) / 4 : 0); // ???\n\t\t\t}\n\t\t}\n\t},\n\t\n\t/**\n\t * In case of auto connect, add one closestPointRange to the max value right before\n\t * tickPositions are computed, so that ticks will extend passed the real max.\n\t */\n\tbeforeSetTickPositions: function () {\n\t\tif (this.autoConnect) {\n\t\t\tthis.max += (this.categories && 1) || this.pointRange || this.closestPointRange || 0; // #1197, #2260\n\t\t}\n\t},\n\t\n\t/**\n\t * Override the setAxisSize method to use the arc's circumference as length. This\n\t * allows tickPixelInterval to apply to pixel lengths along the perimeter\n\t */\n\tsetAxisSize: function () {\n\t\t\n\t\taxisProto.setAxisSize.call(this);\n\n\t\tif (this.isRadial) {\n\n\t\t\t// Set the center array\n\t\t\tthis.center = this.pane.center = seriesTypes.pie.prototype.getCenter.call(this.pane);\n\t\t\t\n\t\t\tthis.len = this.width = this.height = this.isCircular ?\n\t\t\t\tthis.center[2] * (this.endAngleRad - this.startAngleRad) / 2 :\n\t\t\t\tthis.center[2] / 2;\n\t\t}\n\t},\n\t\n\t/**\n\t * Returns the x, y coordinate of a point given by a value and a pixel distance\n\t * from center\n\t */\n\tgetPosition: function (value, length) {\n\t\tif (!this.isCircular) {\n\t\t\tlength = this.translate(value);\n\t\t\tvalue = this.min;\t\n\t\t}\n\t\t\n\t\treturn this.postTranslate(\n\t\t\tthis.translate(value),\n\t\t\tpick(length, this.center[2] / 2) - this.offset\n\t\t);\t\t\n\t},\n\t\n\t/**\n\t * Translate from intermediate plotX (angle), plotY (axis.len - radius) to final chart coordinates. \n\t */\n\tpostTranslate: function (angle, radius) {\n\t\t\n\t\tvar chart = this.chart,\n\t\t\tcenter = this.center;\n\t\t\t\n\t\tangle = this.startAngleRad + angle;\n\t\t\n\t\treturn {\n\t\t\tx: chart.plotLeft + center[0] + Math.cos(angle) * radius,\n\t\t\ty: chart.plotTop + center[1] + Math.sin(angle) * radius\n\t\t}; \n\t\t\n\t},\n\t\n\t/**\n\t * Find the path for plot bands along the radial axis\n\t */\n\tgetPlotBandPath: function (from, to, options) {\n\t\tvar center = this.center,\n\t\t\tstartAngleRad = this.startAngleRad,\n\t\t\tfullRadius = center[2] / 2,\n\t\t\tradii = [\n\t\t\t\tpick(options.outerRadius, '100%'),\n\t\t\t\toptions.innerRadius,\n\t\t\t\tpick(options.thickness, 10)\n\t\t\t],\n\t\t\tpercentRegex = /%$/,\n\t\t\tstart,\n\t\t\tend,\n\t\t\topen,\n\t\t\tisCircular = this.isCircular, // X axis in a polar chart\n\t\t\tret;\n\t\t\t\n\t\t// Polygonal plot bands\n\t\tif (this.options.gridLineInterpolation === 'polygon') {\n\t\t\tret = this.getPlotLinePath(from).concat(this.getPlotLinePath(to, true));\n\t\t\n\t\t// Circular grid bands\n\t\t} else {\n\t\t\t\n\t\t\t// Plot bands on Y axis (radial axis) - inner and outer radius depend on to and from\n\t\t\tif (!isCircular) {\n\t\t\t\tradii[0] = this.translate(from);\n\t\t\t\tradii[1] = this.translate(to);\n\t\t\t}\n\t\t\t\n\t\t\t// Convert percentages to pixel values\n\t\t\tradii = map(radii, function (radius) {\n\t\t\t\tif (percentRegex.test(radius)) {\n\t\t\t\t\tradius = (pInt(radius, 10) * fullRadius) / 100;\n\t\t\t\t}\n\t\t\t\treturn radius;\n\t\t\t});\n\t\t\t\n\t\t\t// Handle full circle\n\t\t\tif (options.shape === 'circle' || !isCircular) {\n\t\t\t\tstart = -Math.PI / 2;\n\t\t\t\tend = Math.PI * 1.5;\n\t\t\t\topen = true;\n\t\t\t} else {\n\t\t\t\tstart = startAngleRad + this.translate(from);\n\t\t\t\tend = startAngleRad + this.translate(to);\n\t\t\t}\n\t\t\n\t\t\n\t\t\tret = this.chart.renderer.symbols.arc(\n\t\t\t\tthis.left + center[0],\n\t\t\t\tthis.top + center[1],\n\t\t\t\tradii[0],\n\t\t\t\tradii[0],\n\t\t\t\t{\n\t\t\t\t\tstart: start,\n\t\t\t\t\tend: end,\n\t\t\t\t\tinnerR: pick(radii[1], radii[0] - radii[2]),\n\t\t\t\t\topen: open\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t \n\t\treturn ret;\n\t},\n\t\n\t/**\n\t * Find the path for plot lines perpendicular to the radial axis.\n\t */\n\tgetPlotLinePath: function (value, reverse) {\n\t\tvar axis = this,\n\t\t\tcenter = axis.center,\n\t\t\tchart = axis.chart,\n\t\t\tend = axis.getPosition(value),\n\t\t\txAxis,\n\t\t\txy,\n\t\t\ttickPositions,\n\t\t\tret;\n\t\t\n\t\t// Spokes\n\t\tif (axis.isCircular) {\n\t\t\tret = ['M', center[0] + chart.plotLeft, center[1] + chart.plotTop, 'L', end.x, end.y];\n\t\t\n\t\t// Concentric circles\t\t\t\n\t\t} else if (axis.options.gridLineInterpolation === 'circle') {\n\t\t\tvalue = axis.translate(value);\n\t\t\tif (value) { // a value of 0 is in the center\n\t\t\t\tret = axis.getLinePath(0, value);\n\t\t\t}\n\t\t// Concentric polygons \n\t\t} else {\n\t\t\txAxis = chart.xAxis[0];\n\t\t\tret = [];\n\t\t\tvalue = axis.translate(value);\n\t\t\ttickPositions = xAxis.tickPositions;\n\t\t\tif (xAxis.autoConnect) {\n\t\t\t\ttickPositions = tickPositions.concat([tickPositions[0]]);\n\t\t\t}\n\t\t\t// Reverse the positions for concatenation of polygonal plot bands\n\t\t\tif (reverse) {\n\t\t\t\ttickPositions = [].concat(tickPositions).reverse();\n\t\t\t}\n\t\t\t\t\n\t\t\teach(tickPositions, function (pos, i) {\n\t\t\t\txy = xAxis.getPosition(pos, value);\n\t\t\t\tret.push(i ? 'L' : 'M', xy.x, xy.y);\n\t\t\t});\n\t\t\t\n\t\t}\n\t\treturn ret;\n\t},\n\t\n\t/**\n\t * Find the position for the axis title, by default inside the gauge\n\t */\n\tgetTitlePosition: function () {\n\t\tvar center = this.center,\n\t\t\tchart = this.chart,\n\t\t\ttitleOptions = this.options.title;\n\t\t\n\t\treturn { \n\t\t\tx: chart.plotLeft + center[0] + (titleOptions.x || 0), \n\t\t\ty: chart.plotTop + center[1] - ({ high: 0.5, middle: 0.25, low: 0 }[titleOptions.align] * \n\t\t\t\tcenter[2]) + (titleOptions.y || 0)  \n\t\t};\n\t}\n\t\n};\n/*jslint unparam: false*/\n\n/**\n * Override axisProto.init to mix in special axis instance functions and function overrides\n */\nwrap(axisProto, 'init', function (proceed, chart, userOptions) {\n\tvar axis = this,\n\t\tangular = chart.angular,\n\t\tpolar = chart.polar,\n\t\tisX = userOptions.isX,\n\t\tisHidden = angular && isX,\n\t\tisCircular,\n\t\tstartAngleRad,\n\t\tendAngleRad,\n\t\toptions,\n\t\tchartOptions = chart.options,\n\t\tpaneIndex = userOptions.pane || 0,\n\t\tpane,\n\t\tpaneOptions;\n\t\t\n\t// Before prototype.init\n\tif (angular) {\n\t\textend(this, isHidden ? hiddenAxisMixin : radialAxisMixin);\n\t\tisCircular =  !isX;\n\t\tif (isCircular) {\n\t\t\tthis.defaultRadialOptions = this.defaultRadialGaugeOptions;\n\t\t}\n\t\t\n\t} else if (polar) {\n\t\t//extend(this, userOptions.isX ? radialAxisMixin : radialAxisMixin);\n\t\textend(this, radialAxisMixin);\n\t\tisCircular = isX;\n\t\tthis.defaultRadialOptions = isX ? this.defaultRadialXOptions : merge(this.defaultYAxisOptions, this.defaultRadialYOptions);\n\t\t\n\t}\n\t\n\t// Run prototype.init\n\tproceed.call(this, chart, userOptions);\n\t\n\tif (!isHidden && (angular || polar)) {\n\t\toptions = this.options;\n\t\t\n\t\t// Create the pane and set the pane options.\n\t\tif (!chart.panes) {\n\t\t\tchart.panes = [];\n\t\t}\n\t\tthis.pane = pane = chart.panes[paneIndex] = chart.panes[paneIndex] || new Pane(\n\t\t\tsplat(chartOptions.pane)[paneIndex],\n\t\t\tchart,\n\t\t\taxis\n\t\t);\n\t\tpaneOptions = pane.options;\n\t\t\n\t\t\t\n\t\t// Disable certain features on angular and polar axes\n\t\tchart.inverted = false;\n\t\tchartOptions.chart.zoomType = null;\n\t\t\n\t\t// Start and end angle options are\n\t\t// given in degrees relative to top, while internal computations are\n\t\t// in radians relative to right (like SVG).\n\t\tthis.startAngleRad = startAngleRad = (paneOptions.startAngle - 90) * Math.PI / 180;\n\t\tthis.endAngleRad = endAngleRad = (pick(paneOptions.endAngle, paneOptions.startAngle + 360)  - 90) * Math.PI / 180;\n\t\tthis.offset = options.offset || 0;\n\t\t\n\t\tthis.isCircular = isCircular;\n\t\t\n\t\t// Automatically connect grid lines?\n\t\tif (isCircular && userOptions.max === UNDEFINED && endAngleRad - startAngleRad === 2 * Math.PI) {\n\t\t\tthis.autoConnect = true;\n\t\t}\n\t}\n\t\n});\n\n/**\n * Add special cases within the Tick class' methods for radial axes.\n */\t\nwrap(tickProto, 'getPosition', function (proceed, horiz, pos, tickmarkOffset, old) {\n\tvar axis = this.axis;\n\t\n\treturn axis.getPosition ? \n\t\taxis.getPosition(pos) :\n\t\tproceed.call(this, horiz, pos, tickmarkOffset, old);\t\n});\n\n/**\n * Wrap the getLabelPosition function to find the center position of the label\n * based on the distance option\n */\t\nwrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n\tvar axis = this.axis,\n\t\toptionsY = labelOptions.y,\n\t\tret,\n\t\talign = labelOptions.align,\n\t\tangle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;\n\t\n\tif (axis.isRadial) {\n\t\tret = axis.getPosition(this.pos, (axis.center[2] / 2) + pick(labelOptions.distance, -25));\n\t\t\n\t\t// Automatically rotated\n\t\tif (labelOptions.rotation === 'auto') {\n\t\t\tlabel.attr({ \n\t\t\t\trotation: angle\n\t\t\t});\n\t\t\n\t\t// Vertically centered\n\t\t} else if (optionsY === null) {\n\t\t\toptionsY = pInt(label.styles.lineHeight) * 0.9 - label.getBBox().height / 2;\n\t\t\n\t\t}\n\t\t\n\t\t// Automatic alignment\n\t\tif (align === null) {\n\t\t\tif (axis.isCircular) {\n\t\t\t\tif (angle > 20 && angle < 160) {\n\t\t\t\t\talign = 'left'; // right hemisphere\n\t\t\t\t} else if (angle > 200 && angle < 340) {\n\t\t\t\t\talign = 'right'; // left hemisphere\n\t\t\t\t} else {\n\t\t\t\t\talign = 'center'; // top or bottom\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\talign = 'center';\n\t\t\t}\n\t\t\tlabel.attr({\n\t\t\t\talign: align\n\t\t\t});\n\t\t}\n\t\t\n\t\tret.x += labelOptions.x;\n\t\tret.y += optionsY;\n\t\t\n\t} else {\n\t\tret = proceed.call(this, x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n\t}\n\treturn ret;\n});\n\n/**\n * Wrap the getMarkPath function to return the path of the radial marker\n */\nwrap(tickProto, 'getMarkPath', function (proceed, x, y, tickLength, tickWidth, horiz, renderer) {\n\tvar axis = this.axis,\n\t\tendPoint,\n\t\tret;\n\t\t\n\tif (axis.isRadial) {\n\t\tendPoint = axis.getPosition(this.pos, axis.center[2] / 2 + tickLength);\n\t\tret = [\n\t\t\t'M',\n\t\t\tx,\n\t\t\ty,\n\t\t\t'L',\n\t\t\tendPoint.x,\n\t\t\tendPoint.y\n\t\t];\n\t} else {\n\t\tret = proceed.call(this, x, y, tickLength, tickWidth, horiz, renderer);\n\t}\n\treturn ret;\n});/* \n * The AreaRangeSeries class\n * \n */\n\n/**\n * Extend the default options with map options\n */\ndefaultPlotOptions.arearange = merge(defaultPlotOptions.area, {\n\tlineWidth: 1,\n\tmarker: null,\n\tthreshold: null,\n\ttooltip: {\n\t\tpointFormat: '<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.low}</b> - <b>{point.high}</b><br/>' \n\t},\n\ttrackByArea: true,\n\tdataLabels: {\n\t\tverticalAlign: null,\n\t\txLow: 0,\n\t\txHigh: 0,\n\t\tyLow: 0,\n\t\tyHigh: 0\t\n\t}\n});\n\n/**\n * Add the series type\n */\nseriesTypes.arearange = Highcharts.extendClass(seriesTypes.area, {\n\ttype: 'arearange',\n\tpointArrayMap: ['low', 'high'],\n\ttoYData: function (point) {\n\t\treturn [point.low, point.high];\n\t},\n\tpointValKey: 'low',\n\t\n\t/**\n\t * Extend getSegments to force null points if the higher value is null. #1703.\n\t */\n\tgetSegments: function () {\n\t\tvar series = this;\n\n\t\teach(series.points, function (point) {\n\t\t\tif (!series.options.connectNulls && (point.low === null || point.high === null)) {\n\t\t\t\tpoint.y = null;\n\t\t\t} else if (point.low === null && point.high !== null) {\n\t\t\t\tpoint.y = point.high;\n\t\t\t}\n\t\t});\n\t\tSeries.prototype.getSegments.call(this);\n\t},\n\t\n\t/**\n\t * Translate data points from raw values x and y to plotX and plotY\n\t */\n\ttranslate: function () {\n\t\tvar series = this,\n\t\t\tyAxis = series.yAxis;\n\n\t\tseriesTypes.area.prototype.translate.apply(series);\n\n\t\t// Set plotLow and plotHigh\n\t\teach(series.points, function (point) {\n\n\t\t\tvar low = point.low,\n\t\t\t\thigh = point.high,\n\t\t\t\tplotY = point.plotY;\n\n\t\t\tif (high === null && low === null) {\n\t\t\t\tpoint.y = null;\n\t\t\t} else if (low === null) {\n\t\t\t\tpoint.plotLow = point.plotY = null;\n\t\t\t\tpoint.plotHigh = yAxis.translate(high, 0, 1, 0, 1);\n\t\t\t} else if (high === null) {\n\t\t\t\tpoint.plotLow = plotY;\n\t\t\t\tpoint.plotHigh = null;\n\t\t\t} else {\n\t\t\t\tpoint.plotLow = plotY;\n\t\t\t\tpoint.plotHigh = yAxis.translate(high, 0, 1, 0, 1);\n\t\t\t}\n\t\t});\n\t},\n\t\n\t/**\n\t * Extend the line series' getSegmentPath method by applying the segment\n\t * path to both lower and higher values of the range\n\t */\n\tgetSegmentPath: function (segment) {\n\t\t\n\t\tvar lowSegment,\n\t\t\thighSegment = [],\n\t\t\ti = segment.length,\n\t\t\tbaseGetSegmentPath = Series.prototype.getSegmentPath,\n\t\t\tpoint,\n\t\t\tlinePath,\n\t\t\tlowerPath,\n\t\t\toptions = this.options,\n\t\t\tstep = options.step,\n\t\t\thigherPath;\n\t\t\t\n\t\t// Remove nulls from low segment\n\t\tlowSegment = HighchartsAdapter.grep(segment, function (point) {\n\t\t\treturn point.plotLow !== null;\n\t\t});\n\t\t\n\t\t// Make a segment with plotX and plotY for the top values\n\t\twhile (i--) {\n\t\t\tpoint = segment[i];\n\t\t\tif (point.plotHigh !== null) {\n\t\t\t\thighSegment.push({\n\t\t\t\t\tplotX: point.plotX,\n\t\t\t\t\tplotY: point.plotHigh\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Get the paths\n\t\tlowerPath = baseGetSegmentPath.call(this, lowSegment);\n\t\tif (step) {\n\t\t\tif (step === true) {\n\t\t\t\tstep = 'left';\n\t\t\t}\n\t\t\toptions.step = { left: 'right', center: 'center', right: 'left' }[step]; // swap for reading in getSegmentPath\n\t\t}\n\t\thigherPath = baseGetSegmentPath.call(this, highSegment);\n\t\toptions.step = step;\n\t\t\n\t\t// Create a line on both top and bottom of the range\n\t\tlinePath = [].concat(lowerPath, higherPath);\n\t\t\n\t\t// For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'\n\t\thigherPath[0] = 'L'; // this probably doesn't work for spline\t\t\t\n\t\tthis.areaPath = this.areaPath.concat(lowerPath, higherPath);\n\t\t\n\t\treturn linePath;\n\t},\n\t\n\t/**\n\t * Extend the basic drawDataLabels method by running it for both lower and higher\n\t * values.\n\t */\n\tdrawDataLabels: function () {\n\t\t\n\t\tvar data = this.data,\n\t\t\tlength = data.length,\n\t\t\ti,\n\t\t\toriginalDataLabels = [],\n\t\t\tseriesProto = Series.prototype,\n\t\t\tdataLabelOptions = this.options.dataLabels,\n\t\t\tpoint,\n\t\t\tinverted = this.chart.inverted;\n\t\t\t\n\t\tif (dataLabelOptions.enabled || this._hasPointLabels) {\n\t\t\t\n\t\t\t// Step 1: set preliminary values for plotY and dataLabel and draw the upper labels\n\t\t\ti = length;\n\t\t\twhile (i--) {\n\t\t\t\tpoint = data[i];\n\t\t\t\t\n\t\t\t\t// Set preliminary values\n\t\t\t\tpoint.y = point.high;\n\t\t\t\tpoint.plotY = point.plotHigh;\n\t\t\t\t\n\t\t\t\t// Store original data labels and set preliminary label objects to be picked up \n\t\t\t\t// in the uber method\n\t\t\t\toriginalDataLabels[i] = point.dataLabel;\n\t\t\t\tpoint.dataLabel = point.dataLabelUpper;\n\t\t\t\t\n\t\t\t\t// Set the default offset\n\t\t\t\tpoint.below = false;\n\t\t\t\tif (inverted) {\n\t\t\t\t\tdataLabelOptions.align = 'left';\n\t\t\t\t\tdataLabelOptions.x = dataLabelOptions.xHigh;\t\t\t\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\tdataLabelOptions.y = dataLabelOptions.yHigh;\n\t\t\t\t}\n\t\t\t}\n\t\t\tseriesProto.drawDataLabels.apply(this, arguments); // #1209\n\t\t\t\n\t\t\t// Step 2: reorganize and handle data labels for the lower values\n\t\t\ti = length;\n\t\t\twhile (i--) {\n\t\t\t\tpoint = data[i];\n\t\t\t\t\n\t\t\t\t// Move the generated labels from step 1, and reassign the original data labels\n\t\t\t\tpoint.dataLabelUpper = point.dataLabel;\n\t\t\t\tpoint.dataLabel = originalDataLabels[i];\n\t\t\t\t\n\t\t\t\t// Reset values\n\t\t\t\tpoint.y = point.low;\n\t\t\t\tpoint.plotY = point.plotLow;\n\t\t\t\t\n\t\t\t\t// Set the default offset\n\t\t\t\tpoint.below = true;\n\t\t\t\tif (inverted) {\n\t\t\t\t\tdataLabelOptions.align = 'right';\n\t\t\t\t\tdataLabelOptions.x = dataLabelOptions.xLow;\n\t\t\t\t} else {\n\t\t\t\t\tdataLabelOptions.y = dataLabelOptions.yLow;\n\t\t\t\t}\n\t\t\t}\n\t\t\tseriesProto.drawDataLabels.apply(this, arguments);\n\t\t}\n\t\n\t},\n\t\n\talignDataLabel: seriesTypes.column.prototype.alignDataLabel,\n\t\n\tgetSymbol: seriesTypes.column.prototype.getSymbol,\n\t\n\tdrawPoints: noop\n});/**\n * The AreaSplineRangeSeries class\n */\n\ndefaultPlotOptions.areasplinerange = merge(defaultPlotOptions.arearange);\n\n/**\n * AreaSplineRangeSeries object\n */\nseriesTypes.areasplinerange = extendClass(seriesTypes.arearange, {\n\ttype: 'areasplinerange',\n\tgetPointSpline: seriesTypes.spline.prototype.getPointSpline\n});/**\n * The ColumnRangeSeries class\n */\ndefaultPlotOptions.columnrange = merge(defaultPlotOptions.column, defaultPlotOptions.arearange, {\n\tlineWidth: 1,\n\tpointRange: null\n});\n\n/**\n * ColumnRangeSeries object\n */\nseriesTypes.columnrange = extendClass(seriesTypes.arearange, {\n\ttype: 'columnrange',\n\t/**\n\t * Translate data points from raw values x and y to plotX and plotY\n\t */\n\ttranslate: function () {\n\t\tvar series = this,\n\t\t\tyAxis = series.yAxis,\n\t\t\tplotHigh;\n\n\t\tcolProto.translate.apply(series);\n\n\t\t// Set plotLow and plotHigh\n\t\teach(series.points, function (point) {\n\t\t\tvar shapeArgs = point.shapeArgs,\n\t\t\t\tminPointLength = series.options.minPointLength,\n\t\t\t\theightDifference,\n\t\t\t\theight,\n\t\t\t\ty;\n\n\t\t\tpoint.plotHigh = plotHigh = yAxis.translate(point.high, 0, 1, 0, 1);\n\t\t\tpoint.plotLow = point.plotY;\n\n\t\t\t// adjust shape\n\t\t\ty = plotHigh;\n\t\t\theight = point.plotY - plotHigh;\n\n\t\t\tif (height < minPointLength) {\n\t\t\t\theightDifference = (minPointLength - height);\n\t\t\t\theight += heightDifference;\n\t\t\t\ty -= heightDifference / 2;\n\t\t\t}\n\t\t\tshapeArgs.height = height;\n\t\t\tshapeArgs.y = y;\n\t\t});\n\t},\n\ttrackerGroups: ['group', 'dataLabels'],\n\tdrawGraph: noop,\n\tpointAttrToOptions: colProto.pointAttrToOptions,\n\tdrawPoints: colProto.drawPoints,\n\tdrawTracker: colProto.drawTracker,\n\tanimate: colProto.animate,\n\tgetColumnMetrics: colProto.getColumnMetrics\n});\n/* \n * The GaugeSeries class\n */\n\n\n\n/**\n * Extend the default options\n */\ndefaultPlotOptions.gauge = merge(defaultPlotOptions.line, {\n\tdataLabels: {\n\t\tenabled: true,\n\t\ty: 15,\n\t\tborderWidth: 1,\n\t\tborderColor: 'silver',\n\t\tborderRadius: 3,\n\t\tstyle: {\n\t\t\tfontWeight: 'bold'\n\t\t},\n\t\tverticalAlign: 'top',\n\t\tzIndex: 2\n\t},\n\tdial: {\n\t\t// radius: '80%',\n\t\t// backgroundColor: 'black',\n\t\t// borderColor: 'silver',\n\t\t// borderWidth: 0,\n\t\t// baseWidth: 3,\n\t\t// topWidth: 1,\n\t\t// baseLength: '70%' // of radius\n\t\t// rearLength: '10%'\n\t},\n\tpivot: {\n\t\t//radius: 5,\n\t\t//borderWidth: 0\n\t\t//borderColor: 'silver',\n\t\t//backgroundColor: 'black'\n\t},\n\ttooltip: {\n\t\theaderFormat: ''\n\t},\n\tshowInLegend: false\n});\n\n/**\n * Extend the point object\n */\nvar GaugePoint = Highcharts.extendClass(Highcharts.Point, {\n\t/**\n\t * Don't do any hover colors or anything\n\t */\n\tsetState: function (state) {\n\t\tthis.state = state;\n\t}\n});\n\n\n/**\n * Add the series type\n */\nvar GaugeSeries = {\n\ttype: 'gauge',\n\tpointClass: GaugePoint,\n\t\n\t// chart.angular will be set to true when a gauge series is present, and this will\n\t// be used on the axes\n\tangular: true, \n\tdrawGraph: noop,\n\tfixedBox: true,\n\ttrackerGroups: ['group', 'dataLabels'],\n\t\n\t/**\n\t * Calculate paths etc\n\t */\n\ttranslate: function () {\n\t\t\n\t\tvar series = this,\n\t\t\tyAxis = series.yAxis,\n\t\t\toptions = series.options,\n\t\t\tcenter = yAxis.center;\n\t\t\t\n\t\tseries.generatePoints();\n\t\t\n\t\teach(series.points, function (point) {\n\t\t\t\n\t\t\tvar dialOptions = merge(options.dial, point.dial),\n\t\t\t\tradius = (pInt(pick(dialOptions.radius, 80)) * center[2]) / 200,\n\t\t\t\tbaseLength = (pInt(pick(dialOptions.baseLength, 70)) * radius) / 100,\n\t\t\t\trearLength = (pInt(pick(dialOptions.rearLength, 10)) * radius) / 100,\n\t\t\t\tbaseWidth = dialOptions.baseWidth || 3,\n\t\t\t\ttopWidth = dialOptions.topWidth || 1,\n\t\t\t\trotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true);\n\n\t\t\t// Handle the wrap option\n\t\t\tif (options.wrap === false) {\n\t\t\t\trotation = Math.max(yAxis.startAngleRad, Math.min(yAxis.endAngleRad, rotation));\n\t\t\t}\n\t\t\trotation = rotation * 180 / Math.PI;\n\t\t\t\t\n\t\t\tpoint.shapeType = 'path';\n\t\t\tpoint.shapeArgs = {\n\t\t\t\td: dialOptions.path || [\n\t\t\t\t\t'M', \n\t\t\t\t\t-rearLength, -baseWidth / 2, \n\t\t\t\t\t'L', \n\t\t\t\t\tbaseLength, -baseWidth / 2,\n\t\t\t\t\tradius, -topWidth / 2,\n\t\t\t\t\tradius, topWidth / 2,\n\t\t\t\t\tbaseLength, baseWidth / 2,\n\t\t\t\t\t-rearLength, baseWidth / 2,\n\t\t\t\t\t'z'\n\t\t\t\t],\n\t\t\t\ttranslateX: center[0],\n\t\t\t\ttranslateY: center[1],\n\t\t\t\trotation: rotation\n\t\t\t};\n\t\t\t\n\t\t\t// Positions for data label\n\t\t\tpoint.plotX = center[0];\n\t\t\tpoint.plotY = center[1];\n\t\t});\n\t},\n\t\n\t/**\n\t * Draw the points where each point is one needle\n\t */\n\tdrawPoints: function () {\n\t\t\n\t\tvar series = this,\n\t\t\tcenter = series.yAxis.center,\n\t\t\tpivot = series.pivot,\n\t\t\toptions = series.options,\n\t\t\tpivotOptions = options.pivot,\n\t\t\trenderer = series.chart.renderer;\n\t\t\n\t\teach(series.points, function (point) {\n\t\t\t\n\t\t\tvar graphic = point.graphic,\n\t\t\t\tshapeArgs = point.shapeArgs,\n\t\t\t\td = shapeArgs.d,\n\t\t\t\tdialOptions = merge(options.dial, point.dial); // #1233\n\t\t\t\n\t\t\tif (graphic) {\n\t\t\t\tgraphic.animate(shapeArgs);\n\t\t\t\tshapeArgs.d = d; // animate alters it\n\t\t\t} else {\n\t\t\t\tpoint.graphic = renderer[point.shapeType](shapeArgs)\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tstroke: dialOptions.borderColor || 'none',\n\t\t\t\t\t\t'stroke-width': dialOptions.borderWidth || 0,\n\t\t\t\t\t\tfill: dialOptions.backgroundColor || 'black',\n\t\t\t\t\t\trotation: shapeArgs.rotation // required by VML when animation is false\n\t\t\t\t\t})\n\t\t\t\t\t.add(series.group);\n\t\t\t}\n\t\t});\n\t\t\n\t\t// Add or move the pivot\n\t\tif (pivot) {\n\t\t\tpivot.animate({ // #1235\n\t\t\t\ttranslateX: center[0],\n\t\t\t\ttranslateY: center[1]\n\t\t\t});\n\t\t} else {\n\t\t\tseries.pivot = renderer.circle(0, 0, pick(pivotOptions.radius, 5))\n\t\t\t\t.attr({\n\t\t\t\t\t'stroke-width': pivotOptions.borderWidth || 0,\n\t\t\t\t\tstroke: pivotOptions.borderColor || 'silver',\n\t\t\t\t\tfill: pivotOptions.backgroundColor || 'black'\n\t\t\t\t})\n\t\t\t\t.translate(center[0], center[1])\n\t\t\t\t.add(series.group);\n\t\t}\n\t},\n\t\n\t/**\n\t * Animate the arrow up from startAngle\n\t */\n\tanimate: function (init) {\n\t\tvar series = this;\n\n\t\tif (!init) {\n\t\t\teach(series.points, function (point) {\n\t\t\t\tvar graphic = point.graphic;\n\n\t\t\t\tif (graphic) {\n\t\t\t\t\t// start value\n\t\t\t\t\tgraphic.attr({\n\t\t\t\t\t\trotation: series.yAxis.startAngleRad * 180 / Math.PI\n\t\t\t\t\t});\n\n\t\t\t\t\t// animate\n\t\t\t\t\tgraphic.animate({\n\t\t\t\t\t\trotation: point.shapeArgs.rotation\n\t\t\t\t\t}, series.options.animation);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// delete this function to allow it only once\n\t\t\tseries.animate = null;\n\t\t}\n\t},\n\t\n\trender: function () {\n\t\tthis.group = this.plotGroup(\n\t\t\t'group', \n\t\t\t'series', \n\t\t\tthis.visible ? 'visible' : 'hidden', \n\t\t\tthis.options.zIndex, \n\t\t\tthis.chart.seriesGroup\n\t\t);\n\t\tseriesTypes.pie.prototype.render.call(this);\n\t\tthis.group.clip(this.chart.clipRect);\n\t},\n\t\n\tsetData: seriesTypes.pie.prototype.setData,\n\tdrawTracker: seriesTypes.column.prototype.drawTracker\n};\nseriesTypes.gauge = Highcharts.extendClass(seriesTypes.line, GaugeSeries);/* ****************************************************************************\n * Start Box plot series code\t\t\t\t\t\t\t\t\t\t\t      *\n *****************************************************************************/\n\n// Set default options\ndefaultPlotOptions.boxplot = merge(defaultPlotOptions.column, {\n\tfillColor: '#FFFFFF',\n\tlineWidth: 1,\n\t//medianColor: null,\n\tmedianWidth: 2,\n\tstates: {\n\t\thover: {\n\t\t\tbrightness: -0.3\n\t\t}\n\t},\n\t//stemColor: null,\n\t//stemDashStyle: 'solid'\n\t//stemWidth: null,\n\tthreshold: null,\n\ttooltip: {\n\t\tpointFormat: '<span style=\"color:{series.color};font-weight:bold\">{series.name}</span><br/>' +\n\t\t\t'Maximum: {point.high}<br/>' +\n\t\t\t'Upper quartile: {point.q3}<br/>' +\n\t\t\t'Median: {point.median}<br/>' +\n\t\t\t'Lower quartile: {point.q1}<br/>' +\n\t\t\t'Minimum: {point.low}<br/>'\n\t\t\t\n\t},\n\t//whiskerColor: null,\n\twhiskerLength: '50%',\n\twhiskerWidth: 2\n});\n\n// Create the series object\nseriesTypes.boxplot = extendClass(seriesTypes.column, {\n\ttype: 'boxplot',\n\tpointArrayMap: ['low', 'q1', 'median', 'q3', 'high'], // array point configs are mapped to this\n\ttoYData: function (point) { // return a plain array for speedy calculation\n\t\treturn [point.low, point.q1, point.median, point.q3, point.high];\n\t},\n\tpointValKey: 'high', // defines the top of the tracker\n\t\n\t/**\n\t * One-to-one mapping from options to SVG attributes\n\t */\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n\t\tfill: 'fillColor',\n\t\tstroke: 'color',\n\t\t'stroke-width': 'lineWidth'\n\t},\n\t\n\t/**\n\t * Disable data labels for box plot\n\t */\n\tdrawDataLabels: noop,\n\n\t/**\n\t * Translate data points from raw values x and y to plotX and plotY\n\t */\n\ttranslate: function () {\n\t\tvar series = this,\n\t\t\tyAxis = series.yAxis,\n\t\t\tpointArrayMap = series.pointArrayMap;\n\n\t\tseriesTypes.column.prototype.translate.apply(series);\n\n\t\t// do the translation on each point dimension\n\t\teach(series.points, function (point) {\n\t\t\teach(pointArrayMap, function (key) {\n\t\t\t\tif (point[key] !== null) {\n\t\t\t\t\tpoint[key + 'Plot'] = yAxis.translate(point[key], 0, 1, 0, 1);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n\t * Draw the data points\n\t */\n\tdrawPoints: function () {\n\t\tvar series = this,  //state = series.state,\n\t\t\tpoints = series.points,\n\t\t\toptions = series.options,\n\t\t\tchart = series.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\tpointAttr,\n\t\t\tq1Plot,\n\t\t\tq3Plot,\n\t\t\thighPlot,\n\t\t\tlowPlot,\n\t\t\tmedianPlot,\n\t\t\tcrispCorr,\n\t\t\tcrispX,\n\t\t\tgraphic,\n\t\t\tstemPath,\n\t\t\tstemAttr,\n\t\t\tboxPath,\n\t\t\twhiskersPath,\n\t\t\twhiskersAttr,\n\t\t\tmedianPath,\n\t\t\tmedianAttr,\n\t\t\twidth,\n\t\t\tleft,\n\t\t\tright,\n\t\t\thalfWidth,\n\t\t\tshapeArgs,\n\t\t\tcolor,\n\t\t\tdoQuartiles = series.doQuartiles !== false, // error bar inherits this series type but doesn't do quartiles\n\t\t\twhiskerLength = parseInt(series.options.whiskerLength, 10) / 100;\n\n\n\t\teach(points, function (point) {\n\n\t\t\tgraphic = point.graphic;\n\t\t\tshapeArgs = point.shapeArgs; // the box\n\t\t\tstemAttr = {};\n\t\t\twhiskersAttr = {};\n\t\t\tmedianAttr = {};\n\t\t\tcolor = point.color || series.color;\n\t\t\t\n\t\t\tif (point.plotY !== UNDEFINED) {\n\n\t\t\t\tpointAttr = point.pointAttr[point.selected ? 'selected' : ''];\n\n\t\t\t\t// crisp vector coordinates\n\t\t\t\twidth = shapeArgs.width;\n\t\t\t\tleft = mathFloor(shapeArgs.x);\n\t\t\t\tright = left + width;\n\t\t\t\thalfWidth = mathRound(width / 2);\n\t\t\t\t//crispX = mathRound(left + halfWidth) + crispCorr;\n\t\t\t\tq1Plot = mathFloor(doQuartiles ? point.q1Plot : point.lowPlot);// + crispCorr;\n\t\t\t\tq3Plot = mathFloor(doQuartiles ? point.q3Plot : point.lowPlot);// + crispCorr;\n\t\t\t\thighPlot = mathFloor(point.highPlot);// + crispCorr;\n\t\t\t\tlowPlot = mathFloor(point.lowPlot);// + crispCorr;\n\t\t\t\t\n\t\t\t\t// Stem attributes\n\t\t\t\tstemAttr.stroke = point.stemColor || options.stemColor || color;\n\t\t\t\tstemAttr['stroke-width'] = pick(point.stemWidth, options.stemWidth, options.lineWidth);\n\t\t\t\tstemAttr.dashstyle = point.stemDashStyle || options.stemDashStyle;\n\t\t\t\t\n\t\t\t\t// Whiskers attributes\n\t\t\t\twhiskersAttr.stroke = point.whiskerColor || options.whiskerColor || color;\n\t\t\t\twhiskersAttr['stroke-width'] = pick(point.whiskerWidth, options.whiskerWidth, options.lineWidth);\n\t\t\t\t\n\t\t\t\t// Median attributes\n\t\t\t\tmedianAttr.stroke = point.medianColor || options.medianColor || color;\n\t\t\t\tmedianAttr['stroke-width'] = pick(point.medianWidth, options.medianWidth, options.lineWidth);\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t// The stem\n\t\t\t\tcrispCorr = (stemAttr['stroke-width'] % 2) / 2;\n\t\t\t\tcrispX = left + halfWidth + crispCorr;\t\t\t\t\n\t\t\t\tstemPath = [\n\t\t\t\t\t// stem up\n\t\t\t\t\t'M',\n\t\t\t\t\tcrispX, q3Plot,\n\t\t\t\t\t'L',\n\t\t\t\t\tcrispX, highPlot,\n\t\t\t\t\t\n\t\t\t\t\t// stem down\n\t\t\t\t\t'M',\n\t\t\t\t\tcrispX, q1Plot,\n\t\t\t\t\t'L',\n\t\t\t\t\tcrispX, lowPlot,\n\t\t\t\t\t'z'\n\t\t\t\t];\n\t\t\t\t\n\t\t\t\t// The box\n\t\t\t\tif (doQuartiles) {\n\t\t\t\t\tcrispCorr = (pointAttr['stroke-width'] % 2) / 2;\n\t\t\t\t\tcrispX = mathFloor(crispX) + crispCorr;\n\t\t\t\t\tq1Plot = mathFloor(q1Plot) + crispCorr;\n\t\t\t\t\tq3Plot = mathFloor(q3Plot) + crispCorr;\n\t\t\t\t\tleft += crispCorr;\n\t\t\t\t\tright += crispCorr;\n\t\t\t\t\tboxPath = [\n\t\t\t\t\t\t'M',\n\t\t\t\t\t\tleft, q3Plot,\n\t\t\t\t\t\t'L',\n\t\t\t\t\t\tleft, q1Plot,\n\t\t\t\t\t\t'L',\n\t\t\t\t\t\tright, q1Plot,\n\t\t\t\t\t\t'L',\n\t\t\t\t\t\tright, q3Plot,\n\t\t\t\t\t\t'L',\n\t\t\t\t\t\tleft, q3Plot,\n\t\t\t\t\t\t'z'\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// The whiskers\n\t\t\t\tif (whiskerLength) {\n\t\t\t\t\tcrispCorr = (whiskersAttr['stroke-width'] % 2) / 2;\n\t\t\t\t\thighPlot = highPlot + crispCorr;\n\t\t\t\t\tlowPlot = lowPlot + crispCorr;\n\t\t\t\t\twhiskersPath = [\n\t\t\t\t\t\t// High whisker\n\t\t\t\t\t\t'M',\n\t\t\t\t\t\tcrispX - halfWidth * whiskerLength, \n\t\t\t\t\t\thighPlot,\n\t\t\t\t\t\t'L',\n\t\t\t\t\t\tcrispX + halfWidth * whiskerLength, \n\t\t\t\t\t\thighPlot,\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Low whisker\n\t\t\t\t\t\t'M',\n\t\t\t\t\t\tcrispX - halfWidth * whiskerLength, \n\t\t\t\t\t\tlowPlot,\n\t\t\t\t\t\t'L',\n\t\t\t\t\t\tcrispX + halfWidth * whiskerLength, \n\t\t\t\t\t\tlowPlot\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// The median\n\t\t\t\tcrispCorr = (medianAttr['stroke-width'] % 2) / 2;\t\t\t\t\n\t\t\t\tmedianPlot = mathRound(point.medianPlot) + crispCorr;\n\t\t\t\tmedianPath = [\n\t\t\t\t\t'M',\n\t\t\t\t\tleft, \n\t\t\t\t\tmedianPlot,\n\t\t\t\t\t'L',\n\t\t\t\t\tright, \n\t\t\t\t\tmedianPlot,\n\t\t\t\t\t'z'\n\t\t\t\t];\n\t\t\t\t\n\t\t\t\t// Create or update the graphics\n\t\t\t\tif (graphic) { // update\n\t\t\t\t\t\n\t\t\t\t\tpoint.stem.animate({ d: stemPath });\n\t\t\t\t\tif (whiskerLength) {\n\t\t\t\t\t\tpoint.whiskers.animate({ d: whiskersPath });\n\t\t\t\t\t}\n\t\t\t\t\tif (doQuartiles) {\n\t\t\t\t\t\tpoint.box.animate({ d: boxPath });\n\t\t\t\t\t}\n\t\t\t\t\tpoint.medianShape.animate({ d: medianPath });\n\t\t\t\t\t\n\t\t\t\t} else { // create new\n\t\t\t\t\tpoint.graphic = graphic = renderer.g()\n\t\t\t\t\t\t.add(series.group);\n\t\t\t\t\t\n\t\t\t\t\tpoint.stem = renderer.path(stemPath)\n\t\t\t\t\t\t.attr(stemAttr)\n\t\t\t\t\t\t.add(graphic);\n\t\t\t\t\t\t\n\t\t\t\t\tif (whiskerLength) {\n\t\t\t\t\t\tpoint.whiskers = renderer.path(whiskersPath) \n\t\t\t\t\t\t\t.attr(whiskersAttr)\n\t\t\t\t\t\t\t.add(graphic);\n\t\t\t\t\t}\n\t\t\t\t\tif (doQuartiles) {\n\t\t\t\t\t\tpoint.box = renderer.path(boxPath)\n\t\t\t\t\t\t\t.attr(pointAttr)\n\t\t\t\t\t\t\t.add(graphic);\n\t\t\t\t\t}\t\n\t\t\t\t\tpoint.medianShape = renderer.path(medianPath)\n\t\t\t\t\t\t.attr(medianAttr)\n\t\t\t\t\t\t.add(graphic);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t}\n\n\n});\n\n/* ****************************************************************************\n * End Box plot series code\t\t\t\t\t\t\t\t\t\t\t\t*\n *****************************************************************************/\n/* ****************************************************************************\n * Start error bar series code                                                *\n *****************************************************************************/\n\n// 1 - set default options\ndefaultPlotOptions.errorbar = merge(defaultPlotOptions.boxplot, {\n\tcolor: '#000000',\n\tgrouping: false,\n\tlinkedTo: ':previous',\n\ttooltip: {\n\t\tpointFormat: defaultPlotOptions.arearange.tooltip.pointFormat\n\t},\n\twhiskerWidth: null\n});\n\n// 2 - Create the series object\nseriesTypes.errorbar = extendClass(seriesTypes.boxplot, {\n\ttype: 'errorbar',\n\tpointArrayMap: ['low', 'high'], // array point configs are mapped to this\n\ttoYData: function (point) { // return a plain array for speedy calculation\n\t\treturn [point.low, point.high];\n\t},\n\tpointValKey: 'high', // defines the top of the tracker\n\tdoQuartiles: false,\n\n\t/**\n\t * Get the width and X offset, either on top of the linked series column\n\t * or standalone\n\t */\n\tgetColumnMetrics: function () {\n\t\treturn (this.linkedParent && this.linkedParent.columnMetrics) || \n\t\t\tseriesTypes.column.prototype.getColumnMetrics.call(this);\n\t}\n});\n\n/* ****************************************************************************\n * End error bar series code                                                  *\n *****************************************************************************/\n/* ****************************************************************************\n * Start Waterfall series code                                                *\n *****************************************************************************/\n\n// 1 - set default options\ndefaultPlotOptions.waterfall = merge(defaultPlotOptions.column, {\n\tlineWidth: 1,\n\tlineColor: '#333',\n\tdashStyle: 'dot',\n\tborderColor: '#333'\n});\n\n\n// 2 - Create the series object\nseriesTypes.waterfall = extendClass(seriesTypes.column, {\n\ttype: 'waterfall',\n\n\tupColorProp: 'fill',\n\n\tpointArrayMap: ['low', 'y'],\n\n\tpointValKey: 'y',\n\n\t/**\n\t * Init waterfall series, force stacking\n\t */\n\tinit: function (chart, options) {\n\t\t// force stacking\n\t\toptions.stacking = true;\n\n\t\tseriesTypes.column.prototype.init.call(this, chart, options);\n\t},\n\n\n\t/**\n\t * Translate data points from raw values\n\t */\n\ttranslate: function () {\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\taxis = series.yAxis,\n\t\t\tlen,\n\t\t\ti,\n\t\t\tpoints,\n\t\t\tpoint,\n\t\t\tshapeArgs,\n\t\t\tstack,\n\t\t\ty,\n\t\t\tpreviousY,\n\t\t\tstackPoint,\n\t\t\tthreshold = options.threshold,\n\t\t\tcrispCorr = (options.borderWidth % 2) / 2;\n\n\t\t// run column series translate\n\t\tseriesTypes.column.prototype.translate.apply(this);\n\n\t\tpreviousY = threshold;\n\t\tpoints = series.points;\n\n\t\tfor (i = 0, len = points.length; i < len; i++) {\n\t\t\t// cache current point object\n\t\t\tpoint = points[i];\n\t\t\tshapeArgs = point.shapeArgs;\n\n\t\t\t// get current stack\n\t\t\tstack = series.getStack(i);\n\t\t\tstackPoint = stack.points[series.index];\n\n\t\t\t// override point value for sums\n\t\t\tif (isNaN(point.y)) {\n\t\t\t\tpoint.y = series.yData[i];\n\t\t\t}\n\n\t\t\t// up points\n\t\t\ty = mathMax(previousY, previousY + point.y) + stackPoint[0];\n\t\t\tshapeArgs.y = axis.translate(y, 0, 1);\n\n\n\t\t\t// sum points\n\t\t\tif (point.isSum || point.isIntermediateSum) {\n\t\t\t\tshapeArgs.y = axis.translate(stackPoint[1], 0, 1);\n\t\t\t\tshapeArgs.height = axis.translate(stackPoint[0], 0, 1) - shapeArgs.y;\n\n\t\t\t// if it's not the sum point, update previous stack end position\n\t\t\t} else {\n\t\t\t\tpreviousY += stack.total;\n\t\t\t}\n\n\t\t\t// negative points\n\t\t\tif (shapeArgs.height < 0) {\n\t\t\t\tshapeArgs.y += shapeArgs.height;\n\t\t\t\tshapeArgs.height *= -1;\n\t\t\t}\n\n\t\t\tpoint.plotY = shapeArgs.y = mathRound(shapeArgs.y) - crispCorr;\n\t\t\tshapeArgs.height = mathRound(shapeArgs.height);\n\t\t\tpoint.yBottom = shapeArgs.y + shapeArgs.height;\n\t\t}\n\t},\n\n\t/**\n\t * Call default processData then override yData to reflect waterfall's extremes on yAxis\n\t */\n\tprocessData: function (force) {\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\tyData = series.yData,\n\t\t\tpoints = series.points,\n\t\t\tpoint,\n\t\t\tdataLength = yData.length,\n\t\t\tthreshold = options.threshold || 0,\n\t\t\tsubSum,\n\t\t\tsum,\n\t\t\tdataMin,\n\t\t\tdataMax,\n\t\t\ty,\n\t\t\ti;\n\n\t\tsum = subSum = dataMin = dataMax = threshold;\n\n\t\tfor (i = 0; i < dataLength; i++) {\n\t\t\ty = yData[i];\n\t\t\tpoint = points && points[i] ? points[i] : {};\n\n\t\t\tif (y === \"sum\" || point.isSum) {\n\t\t\t\tyData[i] = sum;\n\t\t\t} else if (y === \"intermediateSum\" || point.isIntermediateSum) {\n\t\t\t\tyData[i] = subSum;\n\t\t\t\tsubSum = threshold;\n\t\t\t} else {\n\t\t\t\tsum += y;\n\t\t\t\tsubSum += y;\n\t\t\t}\n\t\t\tdataMin = Math.min(sum, dataMin);\n\t\t\tdataMax = Math.max(sum, dataMax);\n\t\t}\n\n\t\tSeries.prototype.processData.call(this, force);\n\n\t\t// Record extremes\n\t\tseries.dataMin = dataMin;\n\t\tseries.dataMax = dataMax;\n\t},\n\n\t/**\n\t * Return y value or string if point is sum\n\t */\n\ttoYData: function (pt) {\n\t\tif (pt.isSum) {\n\t\t\treturn \"sum\";\n\t\t} else if (pt.isIntermediateSum) {\n\t\t\treturn \"intermediateSum\";\n\t\t}\n\n\t\treturn pt.y;\n\t},\n\n\t/**\n\t * Postprocess mapping between options and SVG attributes\n\t */\n\tgetAttribs: function () {\n\t\tseriesTypes.column.prototype.getAttribs.apply(this, arguments);\n\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\tstateOptions = options.states,\n\t\t\tupColor = options.upColor || series.color,\n\t\t\thoverColor = Highcharts.Color(upColor).brighten(0.1).get(),\n\t\t\tseriesDownPointAttr = merge(series.pointAttr),\n\t\t\tupColorProp = series.upColorProp;\n\n\t\tseriesDownPointAttr[''][upColorProp] = upColor;\n\t\tseriesDownPointAttr.hover[upColorProp] = stateOptions.hover.upColor || hoverColor;\n\t\tseriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;\n\n\t\teach(series.points, function (point) {\n\t\t\tif (point.y > 0 && !point.color) {\n\t\t\t\tpoint.pointAttr = seriesDownPointAttr;\n\t\t\t\tpoint.color = upColor;\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Draw columns' connector lines\n\t */\n\tgetGraphPath: function () {\n\n\t\tvar data = this.data,\n\t\t\tlength = data.length,\n\t\t\tlineWidth = this.options.lineWidth + this.options.borderWidth,\n\t\t\tnormalizer = mathRound(lineWidth) % 2 / 2,\n\t\t\tpath = [],\n\t\t\tM = 'M',\n\t\t\tL = 'L',\n\t\t\tprevArgs,\n\t\t\tpointArgs,\n\t\t\ti,\n\t\t\td;\n\n\t\tfor (i = 1; i < length; i++) {\n\t\t\tpointArgs = data[i].shapeArgs;\n\t\t\tprevArgs = data[i - 1].shapeArgs;\n\n\t\t\td = [\n\t\t\t\tM,\n\t\t\t\tprevArgs.x + prevArgs.width, prevArgs.y + normalizer,\n\t\t\t\tL,\n\t\t\t\tpointArgs.x, prevArgs.y + normalizer\n\t\t\t];\n\n\t\t\tif (data[i - 1].y < 0) {\n\t\t\t\td[2] += prevArgs.height;\n\t\t\t\td[5] += prevArgs.height;\n\t\t\t}\n\n\t\t\tpath = path.concat(d);\n\t\t}\n\n\t\treturn path;\n\t},\n\n\t/**\n\t * Extremes are recorded in processData\n\t */\n\tgetExtremes: noop,\n\n\t/**\n\t * Return stack for given index\n\t */\n\tgetStack: function (i) {\n\t\tvar axis = this.yAxis,\n\t\t\tstacks = axis.stacks,\n\t\t\tkey = this.stackKey;\n\n\t\tif (this.processedYData[i] < this.options.threshold) {\n\t\t\tkey = '-' + key;\n\t\t}\n\n\t\treturn stacks[key][i];\n\t},\n\n\tdrawGraph: Series.prototype.drawGraph\n});\n\n/* ****************************************************************************\n * End Waterfall series code                                                  *\n *****************************************************************************/\n/* ****************************************************************************\n * Start Bubble series code\t\t\t\t\t\t\t\t\t\t\t          *\n *****************************************************************************/\n\n// 1 - set default options\ndefaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {\n\tdataLabels: {\n\t\tinside: true,\n\t\tstyle: {\n\t\t\tcolor: 'white',\n\t\t\ttextShadow: '0px 0px 3px black'\n\t\t},\n\t\tverticalAlign: 'middle'\n\t},\n\t// displayNegative: true,\n\tmarker: {\n\t\t// fillOpacity: 0.5,\n\t\tlineColor: null, // inherit from series.color\n\t\tlineWidth: 1\n\t},\n\tminSize: 8,\n\tmaxSize: '20%',\n\t// negativeColor: null,\n\ttooltip: {\n\t\tpointFormat: '({point.x}, {point.y}), Size: {point.z}'\n\t},\n\tturboThreshold: 0,\n\tzThreshold: 0\n});\n\n// 2 - Create the series object\nseriesTypes.bubble = extendClass(seriesTypes.scatter, {\n\ttype: 'bubble',\n\tpointArrayMap: ['y', 'z'],\n\ttrackerGroups: ['group', 'dataLabelsGroup'],\n\t\n\t/**\n\t * Mapping between SVG attributes and the corresponding options\n\t */\n\tpointAttrToOptions: { \n\t\tstroke: 'lineColor',\n\t\t'stroke-width': 'lineWidth',\n\t\tfill: 'fillColor'\n\t},\n\t\n\t/**\n\t * Apply the fillOpacity to all fill positions\n\t */\n\tapplyOpacity: function (fill) {\n\t\tvar markerOptions = this.options.marker,\n\t\t\tfillOpacity = pick(markerOptions.fillOpacity, 0.5);\n\t\t\n\t\t// When called from Legend.colorizeItem, the fill isn't predefined\n\t\tfill = fill || markerOptions.fillColor || this.color; \n\t\t\n\t\tif (fillOpacity !== 1) {\n\t\t\tfill = Highcharts.Color(fill).setOpacity(fillOpacity).get('rgba');\n\t\t}\n\t\treturn fill;\n\t},\n\t\n\t/**\n\t * Extend the convertAttribs method by applying opacity to the fill\n\t */\n\tconvertAttribs: function () {\n\t\tvar obj = Series.prototype.convertAttribs.apply(this, arguments);\n\t\t\n\t\tobj.fill = this.applyOpacity(obj.fill);\n\t\t\n\t\treturn obj;\n\t},\n\n\t/**\n\t * Get the radius for each point based on the minSize, maxSize and each point's Z value. This\n\t * must be done prior to Series.translate because the axis needs to add padding in \n\t * accordance with the point sizes.\n\t */\n\tgetRadii: function (zMin, zMax, minSize, maxSize) {\n\t\tvar len,\n\t\t\ti,\n\t\t\tpos,\n\t\t\tzData = this.zData,\n\t\t\tradii = [],\n\t\t\tzRange;\n\t\t\n\t\t// Set the shape type and arguments to be picked up in drawPoints\n\t\tfor (i = 0, len = zData.length; i < len; i++) {\n\t\t\tzRange = zMax - zMin;\n\t\t\tpos = zRange > 0 ? // relative size, a number between 0 and 1\n\t\t\t\t(zData[i] - zMin) / (zMax - zMin) : \n\t\t\t\t0.5;\n\t\t\tradii.push(math.ceil(minSize + pos * (maxSize - minSize)) / 2);\n\t\t}\n\t\tthis.radii = radii;\n\t},\n\t\n\t/**\n\t * Perform animation on the bubbles\n\t */\n\tanimate: function (init) {\n\t\tvar animation = this.options.animation;\n\t\t\n\t\tif (!init) { // run the animation\n\t\t\teach(this.points, function (point) {\n\t\t\t\tvar graphic = point.graphic,\n\t\t\t\t\tshapeArgs = point.shapeArgs;\n\n\t\t\t\tif (graphic && shapeArgs) {\n\t\t\t\t\t// start values\n\t\t\t\t\tgraphic.attr('r', 1);\n\n\t\t\t\t\t// animate\n\t\t\t\t\tgraphic.animate({\n\t\t\t\t\t\tr: shapeArgs.r\n\t\t\t\t\t}, animation);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// delete this function to allow it only once\n\t\t\tthis.animate = null;\n\t\t}\n\t},\n\t\n\t/**\n\t * Extend the base translate method to handle bubble size\n\t */\n\ttranslate: function () {\n\t\t\n\t\tvar i,\n\t\t\tdata = this.data,\n\t\t\tpoint,\n\t\t\tradius,\n\t\t\tradii = this.radii;\n\t\t\n\t\t// Run the parent method\n\t\tseriesTypes.scatter.prototype.translate.call(this);\n\t\t\n\t\t// Set the shape type and arguments to be picked up in drawPoints\n\t\ti = data.length;\n\t\t\n\t\twhile (i--) {\n\t\t\tpoint = data[i];\n\t\t\tradius = radii ? radii[i] : 0; // #1737\n\n\t\t\t// Flag for negativeColor to be applied in Series.js\n\t\t\tpoint.negative = point.z < (this.options.zThreshold || 0);\n\t\t\t\n\t\t\tif (radius >= this.minPxSize / 2) {\n\t\t\t\t// Shape arguments\n\t\t\t\tpoint.shapeType = 'circle';\n\t\t\t\tpoint.shapeArgs = {\n\t\t\t\t\tx: point.plotX,\n\t\t\t\t\ty: point.plotY,\n\t\t\t\t\tr: radius\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\t// Alignment box for the data label\n\t\t\t\tpoint.dlBox = {\n\t\t\t\t\tx: point.plotX - radius,\n\t\t\t\t\ty: point.plotY - radius,\n\t\t\t\t\twidth: 2 * radius,\n\t\t\t\t\theight: 2 * radius\n\t\t\t\t};\n\t\t\t} else { // below zThreshold\n\t\t\t\tpoint.shapeArgs = point.plotY = point.dlBox = UNDEFINED; // #1691\n\t\t\t}\n\t\t}\n\t},\n\t\n\t/**\n\t * Get the series' symbol in the legend\n\t * \n\t * @param {Object} legend The legend object\n\t * @param {Object} item The series (this) or point\n\t */\n\tdrawLegendSymbol: function (legend, item) {\n\t\tvar radius = pInt(legend.itemStyle.fontSize) / 2;\n\t\t\n\t\titem.legendSymbol = this.chart.renderer.circle(\n\t\t\tradius,\n\t\t\tlegend.baseline - radius,\n\t\t\tradius\n\t\t).attr({\n\t\t\tzIndex: 3\n\t\t}).add(item.legendGroup);\n\t\titem.legendSymbol.isMarker = true;\t\n\t\t\n\t},\n\t\n\tdrawPoints: seriesTypes.column.prototype.drawPoints,\n\talignDataLabel: seriesTypes.column.prototype.alignDataLabel\n});\n\n/**\n * Add logic to pad each axis with the amount of pixels\n * necessary to avoid the bubbles to overflow.\n */\nAxis.prototype.beforePadding = function () {\n\tvar axis = this,\n\t\taxisLength = this.len,\n\t\tchart = this.chart,\n\t\tpxMin = 0, \n\t\tpxMax = axisLength,\n\t\tisXAxis = this.isXAxis,\n\t\tdataKey = isXAxis ? 'xData' : 'yData',\n\t\tmin = this.min,\n\t\textremes = {},\n\t\tsmallestSize = math.min(chart.plotWidth, chart.plotHeight),\n\t\tzMin = Number.MAX_VALUE,\n\t\tzMax = -Number.MAX_VALUE,\n\t\trange = this.max - min,\n\t\ttransA = axisLength / range,\n\t\tactiveSeries = [];\n\n\t// Handle padding on the second pass, or on redraw\n\tif (this.tickPositions) {\n\t\teach(this.series, function (series) {\n\n\t\t\tvar seriesOptions = series.options,\n\t\t\t\tzData;\n\n\t\t\tif (series.type === 'bubble' && series.visible) {\n\n\t\t\t\t// Correction for #1673\n\t\t\t\taxis.allowZoomOutside = true;\n\n\t\t\t\t// Cache it\n\t\t\t\tactiveSeries.push(series);\n\n\t\t\t\tif (isXAxis) { // because X axis is evaluated first\n\t\t\t\t\n\t\t\t\t\t// For each series, translate the size extremes to pixel values\n\t\t\t\t\teach(['minSize', 'maxSize'], function (prop) {\n\t\t\t\t\t\tvar length = seriesOptions[prop],\n\t\t\t\t\t\t\tisPercent = /%$/.test(length);\n\t\t\t\t\t\t\n\t\t\t\t\t\tlength = pInt(length);\n\t\t\t\t\t\textremes[prop] = isPercent ?\n\t\t\t\t\t\t\tsmallestSize * length / 100 :\n\t\t\t\t\t\t\tlength;\n\t\t\t\t\t\t\n\t\t\t\t\t});\n\t\t\t\t\tseries.minPxSize = extremes.minSize;\n\t\t\t\t\t\n\t\t\t\t\t// Find the min and max Z\n\t\t\t\t\tzData = series.zData;\n\t\t\t\t\tif (zData.length) { // #1735\n\t\t\t\t\t\tzMin = math.min(\n\t\t\t\t\t\t\tzMin,\n\t\t\t\t\t\t\tmath.max(\n\t\t\t\t\t\t\t\tarrayMin(zData), \n\t\t\t\t\t\t\t\tseriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tzMax = math.max(zMax, arrayMax(zData));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\teach(activeSeries, function (series) {\n\n\t\t\tvar data = series[dataKey],\n\t\t\t\ti = data.length,\n\t\t\t\tradius;\n\n\t\t\tif (isXAxis) {\n\t\t\t\tseries.getRadii(zMin, zMax, extremes.minSize, extremes.maxSize);\n\t\t\t}\n\t\t\t\n\t\t\tif (range > 0) {\n\t\t\t\twhile (i--) {\n\t\t\t\t\tradius = series.radii[i];\n\t\t\t\t\tpxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);\n\t\t\t\t\tpxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tif (activeSeries.length && range > 0 && pick(this.options.min, this.userMin) === UNDEFINED && pick(this.options.max, this.userMax) === UNDEFINED) {\n\t\t\tpxMax -= axisLength;\n\t\t\ttransA *= (axisLength + pxMin - pxMax) / axisLength;\n\t\t\tthis.min += pxMin / transA;\n\t\t\tthis.max += pxMax / transA;\n\t\t}\n\t}\n};\n\n/* ****************************************************************************\n * End Bubble series code                                                     *\n *****************************************************************************/\n/**\n * Extensions for polar charts. Additionally, much of the geometry required for polar charts is\n * gathered in RadialAxes.js.\n * \n */\n\nvar seriesProto = Series.prototype,\n\tpointerProto = Highcharts.Pointer.prototype;\n\n\n\n/**\n * Translate a point's plotX and plotY from the internal angle and radius measures to \n * true plotX, plotY coordinates\n */\nseriesProto.toXY = function (point) {\n\tvar xy,\n\t\tchart = this.chart,\n\t\tplotX = point.plotX,\n\t\tplotY = point.plotY;\n\t\n\t// Save rectangular plotX, plotY for later computation\n\tpoint.rectPlotX = plotX;\n\tpoint.rectPlotY = plotY;\n\t\n\t// Record the angle in degrees for use in tooltip\n\tpoint.clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;\n\t\n\t// Find the polar plotX and plotY\n\txy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);\n\tpoint.plotX = point.polarPlotX = xy.x - chart.plotLeft;\n\tpoint.plotY = point.polarPlotY = xy.y - chart.plotTop;\n};\n\n/** \n * Order the tooltip points to get the mouse capture ranges correct. #1915. \n */\nseriesProto.orderTooltipPoints = function (points) {\n\tif (this.chart.polar) {\n\t\tpoints.sort(function (a, b) {\n\t\t\treturn a.clientX - b.clientX;\n\t\t});\n\n\t\t// Wrap mouse tracking around to capture movement on the segment to the left\n\t\t// of the north point (#1469, #2093).\n\t\tif (points[0]) {\n\t\t\tpoints[0].wrappedClientX = points[0].clientX + 360;\n\t\t\tpoints.push(points[0]);\n\t\t}\n\t}\n};\n\n\n/**\n * Add some special init logic to areas and areasplines\n */\nfunction initArea(proceed, chart, options) {\n\tproceed.call(this, chart, options);\n\tif (this.chart.polar) {\n\t\t\n\t\t/**\n\t\t * Overridden method to close a segment path. While in a cartesian plane the area \n\t\t * goes down to the threshold, in the polar chart it goes to the center.\n\t\t */\n\t\tthis.closeSegment = function (path) {\n\t\t\tvar center = this.xAxis.center;\n\t\t\tpath.push(\n\t\t\t\t'L',\n\t\t\t\tcenter[0],\n\t\t\t\tcenter[1]\n\t\t\t);\t\t\t\n\t\t};\n\t\t\n\t\t// Instead of complicated logic to draw an area around the inner area in a stack,\n\t\t// just draw it behind\n\t\tthis.closedStacks = true;\n\t}\n}\nwrap(seriesTypes.area.prototype, 'init', initArea);\nwrap(seriesTypes.areaspline.prototype, 'init', initArea);\n\t\t\n\n/**\n * Overridden method for calculating a spline from one point to the next\n */\nwrap(seriesTypes.spline.prototype, 'getPointSpline', function (proceed, segment, point, i) {\n\t\n\tvar ret,\n\t\tsmoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc;\n\t\tdenom = smoothing + 1,\n\t\tplotX, \n\t\tplotY,\n\t\tlastPoint,\n\t\tnextPoint,\n\t\tlastX,\n\t\tlastY,\n\t\tnextX,\n\t\tnextY,\n\t\tleftContX,\n\t\tleftContY,\n\t\trightContX,\n\t\trightContY,\n\t\tdistanceLeftControlPoint,\n\t\tdistanceRightControlPoint,\n\t\tleftContAngle,\n\t\trightContAngle,\n\t\tjointAngle;\n\t\t\n\t\t\n\tif (this.chart.polar) {\n\t\t\n\t\tplotX = point.plotX;\n\t\tplotY = point.plotY;\n\t\tlastPoint = segment[i - 1];\n\t\tnextPoint = segment[i + 1];\n\t\t\t\n\t\t// Connect ends\n\t\tif (this.connectEnds) {\n\t\t\tif (!lastPoint) {\n\t\t\t\tlastPoint = segment[segment.length - 2]; // not the last but the second last, because the segment is already connected\n\t\t\t}\n\t\t\tif (!nextPoint) {\n\t\t\t\tnextPoint = segment[1];\n\t\t\t}\t\n\t\t}\n\n\t\t// find control points\n\t\tif (lastPoint && nextPoint) {\n\t\t\n\t\t\tlastX = lastPoint.plotX;\n\t\t\tlastY = lastPoint.plotY;\n\t\t\tnextX = nextPoint.plotX;\n\t\t\tnextY = nextPoint.plotY;\n\t\t\tleftContX = (smoothing * plotX + lastX) / denom;\n\t\t\tleftContY = (smoothing * plotY + lastY) / denom;\n\t\t\trightContX = (smoothing * plotX + nextX) / denom;\n\t\t\trightContY = (smoothing * plotY + nextY) / denom;\n\t\t\tdistanceLeftControlPoint = Math.sqrt(Math.pow(leftContX - plotX, 2) + Math.pow(leftContY - plotY, 2));\n\t\t\tdistanceRightControlPoint = Math.sqrt(Math.pow(rightContX - plotX, 2) + Math.pow(rightContY - plotY, 2));\n\t\t\tleftContAngle = Math.atan2(leftContY - plotY, leftContX - plotX);\n\t\t\trightContAngle = Math.atan2(rightContY - plotY, rightContX - plotX);\n\t\t\tjointAngle = (Math.PI / 2) + ((leftContAngle + rightContAngle) / 2);\n\t\t\t\t\n\t\t\t\t\n\t\t\t// Ensure the right direction, jointAngle should be in the same quadrant as leftContAngle\n\t\t\tif (Math.abs(leftContAngle - jointAngle) > Math.PI / 2) {\n\t\t\t\tjointAngle -= Math.PI;\n\t\t\t}\n\t\t\t\n\t\t\t// Find the corrected control points for a spline straight through the point\n\t\t\tleftContX = plotX + Math.cos(jointAngle) * distanceLeftControlPoint;\n\t\t\tleftContY = plotY + Math.sin(jointAngle) * distanceLeftControlPoint;\n\t\t\trightContX = plotX + Math.cos(Math.PI + jointAngle) * distanceRightControlPoint;\n\t\t\trightContY = plotY + Math.sin(Math.PI + jointAngle) * distanceRightControlPoint;\n\t\t\t\n\t\t\t// Record for drawing in next point\n\t\t\tpoint.rightContX = rightContX;\n\t\t\tpoint.rightContY = rightContY;\n\n\t\t}\n\t\t\n\t\t\n\t\t// moveTo or lineTo\n\t\tif (!i) {\n\t\t\tret = ['M', plotX, plotY];\n\t\t} else { // curve from last point to this\n\t\t\tret = [\n\t\t\t\t'C',\n\t\t\t\tlastPoint.rightContX || lastPoint.plotX,\n\t\t\t\tlastPoint.rightContY || lastPoint.plotY,\n\t\t\t\tleftContX || plotX,\n\t\t\t\tleftContY || plotY,\n\t\t\t\tplotX,\n\t\t\t\tplotY\n\t\t\t];\n\t\t\tlastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later\n\t\t}\n\t\t\n\t\t\n\t} else {\n\t\tret = proceed.call(this, segment, point, i);\n\t}\n\treturn ret;\n});\n\n/**\n * Extend translate. The plotX and plotY values are computed as if the polar chart were a\n * cartesian plane, where plotX denotes the angle in radians and (yAxis.len - plotY) is the pixel distance from\n * center. \n */\nwrap(seriesProto, 'translate', function (proceed) {\n\t\t\n\t// Run uber method\n\tproceed.call(this);\n\t\n\t// Postprocess plot coordinates\n\tif (this.chart.polar && !this.preventPostTranslate) {\n\t\tvar points = this.points,\n\t\t\ti = points.length;\n\t\twhile (i--) {\n\t\t\t// Translate plotX, plotY from angle and radius to true plot coordinates\n\t\t\tthis.toXY(points[i]);\n\t\t}\n\t}\n});\n\n/** \n * Extend getSegmentPath to allow connecting ends across 0 to provide a closed circle in \n * line-like series.\n */\nwrap(seriesProto, 'getSegmentPath', function (proceed, segment) {\n\t\t\n\tvar points = this.points;\n\t\n\t// Connect the path\n\tif (this.chart.polar && this.options.connectEnds !== false && \n\t\t\tsegment[segment.length - 1] === points[points.length - 1] && points[0].y !== null) {\n\t\tthis.connectEnds = true; // re-used in splines\n\t\tsegment = [].concat(segment, [points[0]]);\n\t}\n\t\n\t// Run uber method\n\treturn proceed.call(this, segment);\n\t\n});\n\n\nfunction polarAnimate(proceed, init) {\n\tvar chart = this.chart,\n\t\tanimation = this.options.animation,\n\t\tgroup = this.group,\n\t\tmarkerGroup = this.markerGroup,\n\t\tcenter = this.xAxis.center,\n\t\tplotLeft = chart.plotLeft,\n\t\tplotTop = chart.plotTop,\n\t\tattribs;\n\n\t// Specific animation for polar charts\n\tif (chart.polar) {\n\t\t\n\t\t// Enable animation on polar charts only in SVG. In VML, the scaling is different, plus animation\n\t\t// would be so slow it would't matter.\n\t\tif (chart.renderer.isSVG) {\n\n\t\t\tif (animation === true) {\n\t\t\t\tanimation = {};\n\t\t\t}\n\t\n\t\t\t// Initialize the animation\n\t\t\tif (init) {\n\t\t\t\t\n\t\t\t\t// Scale down the group and place it in the center\n\t\t\t\tattribs = {\n\t\t\t\t\ttranslateX: center[0] + plotLeft,\n\t\t\t\t\ttranslateY: center[1] + plotTop,\n\t\t\t\t\tscaleX: 0.001, // #1499\n\t\t\t\t\tscaleY: 0.001\n\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\tgroup.attr(attribs);\n\t\t\t\tif (markerGroup) {\n\t\t\t\t\tmarkerGroup.attrSetters = group.attrSetters;\n\t\t\t\t\tmarkerGroup.attr(attribs);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t// Run the animation\n\t\t\t} else {\n\t\t\t\tattribs = {\n\t\t\t\t\ttranslateX: plotLeft,\n\t\t\t\t\ttranslateY: plotTop,\n\t\t\t\t\tscaleX: 1,\n\t\t\t\t\tscaleY: 1\n\t\t\t\t};\n\t\t\t\tgroup.animate(attribs, animation);\n\t\t\t\tif (markerGroup) {\n\t\t\t\t\tmarkerGroup.animate(attribs, animation);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Delete this function to allow it only once\n\t\t\t\tthis.animate = null;\n\t\t\t}\n\t\t}\n\t\n\t// For non-polar charts, revert to the basic animation\n\t} else {\n\t\tproceed.call(this, init);\n\t} \n}\n\n// Define the animate method for both regular series and column series and their derivatives\nwrap(seriesProto, 'animate', polarAnimate);\nwrap(colProto, 'animate', polarAnimate);\n\n\n/**\n * Throw in a couple of properties to let setTooltipPoints know we're indexing the points\n * in degrees (0-360), not plot pixel width.\n */\nwrap(seriesProto, 'setTooltipPoints', function (proceed, renew) {\n\t\t\n\tif (this.chart.polar) {\n\t\textend(this.xAxis, {\n\t\t\ttooltipLen: 360 // degrees are the resolution unit of the tooltipPoints array\n\t\t});\t\n\t}\n\t\n\t// Run uber method\n\treturn proceed.call(this, renew);\n});\n\n\n/**\n * Extend the column prototype's translate method\n */\nwrap(colProto, 'translate', function (proceed) {\n\t\t\n\tvar xAxis = this.xAxis,\n\t\tlen = this.yAxis.len,\n\t\tcenter = xAxis.center,\n\t\tstartAngleRad = xAxis.startAngleRad,\n\t\trenderer = this.chart.renderer,\n\t\tstart,\n\t\tpoints,\n\t\tpoint,\n\t\ti;\n\t\n\tthis.preventPostTranslate = true;\n\t\n\t// Run uber method\n\tproceed.call(this);\n\t\n\t// Postprocess plot coordinates\n\tif (xAxis.isRadial) {\n\t\tpoints = this.points;\n\t\ti = points.length;\n\t\twhile (i--) {\n\t\t\tpoint = points[i];\n\t\t\tstart = point.barX + startAngleRad;\n\t\t\tpoint.shapeType = 'path';\n\t\t\tpoint.shapeArgs = {\n\t\t\t\td: renderer.symbols.arc(\n\t\t\t\t\tcenter[0],\n\t\t\t\t\tcenter[1],\n\t\t\t\t\tlen - point.plotY,\n\t\t\t\t\tnull, \n\t\t\t\t\t{\n\t\t\t\t\t\tstart: start,\n\t\t\t\t\t\tend: start + point.pointWidth,\n\t\t\t\t\t\tinnerR: len - pick(point.yBottom, len)\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t};\n\t\t\tthis.toXY(point); // provide correct plotX, plotY for tooltip\n\t\t}\n\t}\n});\n\n\n/**\n * Align column data labels outside the columns. #1199.\n */\nwrap(colProto, 'alignDataLabel', function (proceed, point, dataLabel, options, alignTo, isNew) {\n\t\n\tif (this.chart.polar) {\n\t\tvar angle = point.rectPlotX / Math.PI * 180,\n\t\t\talign,\n\t\t\tverticalAlign;\n\t\t\n\t\t// Align nicely outside the perimeter of the columns\n\t\tif (options.align === null) {\n\t\t\tif (angle > 20 && angle < 160) {\n\t\t\t\talign = 'left'; // right hemisphere\n\t\t\t} else if (angle > 200 && angle < 340) {\n\t\t\t\talign = 'right'; // left hemisphere\n\t\t\t} else {\n\t\t\t\talign = 'center'; // top or bottom\n\t\t\t}\n\t\t\toptions.align = align;\n\t\t}\n\t\tif (options.verticalAlign === null) {\n\t\t\tif (angle < 45 || angle > 315) {\n\t\t\t\tverticalAlign = 'bottom'; // top part\n\t\t\t} else if (angle > 135 && angle < 225) {\n\t\t\t\tverticalAlign = 'top'; // bottom part\n\t\t\t} else {\n\t\t\t\tverticalAlign = 'middle'; // left or right\n\t\t\t}\n\t\t\toptions.verticalAlign = verticalAlign;\n\t\t}\n\t\t\n\t\tseriesProto.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n\t} else {\n\t\tproceed.call(this, point, dataLabel, options, alignTo, isNew);\n\t}\n\t\n});\n\n/**\n * Extend the mouse tracker to return the tooltip position index in terms of\n * degrees rather than pixels\n */\nwrap(pointerProto, 'getIndex', function (proceed, e) {\n\tvar ret,\n\t\tchart = this.chart,\n\t\tcenter,\n\t\tx,\n\t\ty;\n\t\n\tif (chart.polar) {\n\t\tcenter = chart.xAxis[0].center;\n\t\tx = e.chartX - center[0] - chart.plotLeft;\n\t\ty = e.chartY - center[1] - chart.plotTop;\n\t\t\n\t\tret = 180 - Math.round(Math.atan2(x, y) / Math.PI * 180);\n\t\n\t} else {\n\t\n\t\t// Run uber method\n\t\tret = proceed.call(this, e);\n\t}\n\treturn ret;\n});\n\n/**\n * Extend getCoordinates to prepare for polar axis values\n */\nwrap(pointerProto, 'getCoordinates', function (proceed, e) {\n\tvar chart = this.chart,\n\t\tret = {\n\t\t\txAxis: [],\n\t\t\tyAxis: []\n\t\t};\n\t\n\tif (chart.polar) {\t\n\n\t\teach(chart.axes, function (axis) {\n\t\t\tvar isXAxis = axis.isXAxis,\n\t\t\t\tcenter = axis.center,\n\t\t\t\tx = e.chartX - center[0] - chart.plotLeft,\n\t\t\t\ty = e.chartY - center[1] - chart.plotTop;\n\t\t\t\n\t\t\tret[isXAxis ? 'xAxis' : 'yAxis'].push({\n\t\t\t\taxis: axis,\n\t\t\t\tvalue: axis.translate(\n\t\t\t\t\tisXAxis ?\n\t\t\t\t\t\tMath.PI - Math.atan2(x, y) : // angle \n\t\t\t\t\t\tMath.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), // distance from center\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t});\n\t\t});\n\t\t\n\t} else {\n\t\tret = proceed.call(this, e);\n\t}\n\t\n\treturn ret;\n});\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/highcharts.js",
    "content": "/*\n Highcharts JS v3.0.6 (2013-10-04)\n\n (c) 2009-2013 Torstein Hønsi\n\n License: www.highcharts.com/license\n*/\n(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function x(){var a,b=arguments.length,c={},d=function(a,b){var c,h;typeof a!==\"object\"&&(a={});for(h in b)b.hasOwnProperty(h)&&(c=b[h],a[h]=c&&typeof c===\"object\"&&Object.prototype.toString.call(c)!==\"[object Array]\"&&typeof c.nodeType!==\"number\"?d(a[h]||{},c):b[h]);return a};for(a=0;a<b;a++)c=d(c,arguments[a]);return c}function C(a,b){return parseInt(a,b||10)}function ea(a){return typeof a===\"string\"}function T(a){return typeof a===\n\"object\"}function Ia(a){return Object.prototype.toString.call(a)===\"[object Array]\"}function sa(a){return typeof a===\"number\"}function na(a){return R.log(a)/R.LN10}function fa(a){return R.pow(10,a)}function ga(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function u(a){return a!==w&&a!==null}function v(a,b,c){var d,e;if(ea(b))u(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(u(b)&&T(b))for(d in b)a.setAttribute(d,b[d]);return e}function ja(a){return Ia(a)?\na:[a]}function o(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],typeof c!==\"undefined\"&&c!==null)return c}function K(a,b){if(ta&&b&&b.opacity!==w)b.filter=\"alpha(opacity=\"+b.opacity*100+\")\";r(a.style,b)}function U(a,b,c,d,e){a=y.createElement(a);b&&r(a,b);e&&K(a,{padding:0,border:S,margin:0});c&&K(a,c);d&&d.appendChild(a);return a}function ha(a,b){var c=function(){};c.prototype=new a;r(c.prototype,b);return c}function Aa(a,b,c,d){var e=M.lang,a=+a||0,f=b===-1?(a.toString().split(\".\")[1]||\n\"\").length:isNaN(b=N(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?\"-\":\"\",c=String(C(a=N(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:\"\")+c.substr(g).replace(/(\\d{3})(?=\\d)/g,\"$1\"+d)+(f?b+N(a-c).toFixed(f).slice(2):\"\")}function Ba(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function mb(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}}function Ca(a,b){for(var c=\"{\",d=!1,\ne,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(\":\");g=f.shift().split(\".\");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(\":\"),g=/\\.([0-9])/,h=M.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e=Aa(e,i,h.decimalPoint,f.indexOf(\",\")>-1?h.thousandsSep:\"\")):e=Xa(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?\"}\":\"{\"}j.push(a);return j.join(\"\")}function nb(a){return R.pow(10,P(R.log(a)/R.LN10))}function ob(a,b,c,d){var e,c=o(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===\n!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(a=b[d],e<=(b[d]+(b[d+1]||b[d]))/2)break;a*=c;return a}function Cb(a,b){var c=b||[[Db,[1,2,5,10,20,25,50,100,200,500]],[pb,[1,2,5,10,15,30]],[Ya,[1,2,5,10,15,30]],[Qa,[1,2,3,4,6,8,12]],[ua,[1,2]],[Za,[1,2]],[Ra,[1,2,3,4,6]],[Da,null]],d=c[c.length-1],e=D[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=D[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+D[c[g+1][0]])/2)break;e===D[Da]&&a<5*e&&(f=[1,2,5]);c=ob(a/e,f,d[0]===Da?nb(a/e):1);\nreturn{unitRange:e,count:c,unitName:d[0]}}function Eb(a,b,c,d){var e=[],f={},g=M.global.useUTC,h,i=new Date(b),j=a.unitRange,k=a.count;if(u(b)){j>=D[pb]&&(i.setMilliseconds(0),i.setSeconds(j>=D[Ya]?0:k*P(i.getSeconds()/k)));if(j>=D[Ya])i[Fb](j>=D[Qa]?0:k*P(i[qb]()/k));if(j>=D[Qa])i[Gb](j>=D[ua]?0:k*P(i[rb]()/k));if(j>=D[ua])i[sb](j>=D[Ra]?1:k*P(i[Sa]()/k));j>=D[Ra]&&(i[Hb](j>=D[Da]?0:k*P(i[$a]()/k)),h=i[ab]());j>=D[Da]&&(h-=h%k,i[Ib](h));if(j===D[Za])i[sb](i[Sa]()-i[tb]()+o(d,1));b=1;h=i[ab]();for(var d=\ni.getTime(),l=i[$a](),m=i[Sa](),p=g?0:(864E5+i.getTimezoneOffset()*6E4)%864E5;d<c;)e.push(d),j===D[Da]?d=bb(h+b*k,0):j===D[Ra]?d=bb(h,l+b*k):!g&&(j===D[ua]||j===D[Za])?d=bb(h,l,m+b*k*(j===D[ua]?1:7)):d+=j*k,b++;e.push(d);n(ub(e,function(a){return j<=D[Qa]&&a%D[ua]===p}),function(a){f[a]=ua})}e.info=r(a,{higherRanks:f,totalRange:j*k});return e}function Jb(){this.symbol=this.color=0}function Kb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:\nd});for(e=0;e<c;e++)delete a[e].ss_i}function Ja(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function va(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Ka(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Ta(a){cb||(cb=U(Ea));a&&cb.appendChild(a);cb.innerHTML=\"\"}function ka(a,b){var c=\"Highcharts error #\"+a+\": www.highcharts.com/errors/\"+a;if(b)throw c;else O.console&&console.log(c)}function ia(a){return parseFloat(a.toPrecision(14))}\nfunction La(a,b){Fa=o(a,b.animation)}function Lb(){var a=M.global.useUTC,b=a?\"getUTC\":\"get\",c=a?\"setUTC\":\"set\";bb=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,o(c,1),o(g,0),o(h,0),o(i,0))).getTime()};qb=b+\"Minutes\";rb=b+\"Hours\";tb=b+\"Day\";Sa=b+\"Date\";$a=b+\"Month\";ab=b+\"FullYear\";Fb=c+\"Minutes\";Gb=c+\"Hours\";sb=c+\"Date\";Hb=c+\"Month\";Ib=c+\"FullYear\"}function wa(){}function Ma(a,b,c,d){this.axis=a;this.pos=b;this.type=c||\"\";this.isNew=!0;!c&&!d&&this.addLabel()}function vb(a,b){this.axis=a;if(b)this.options=\nb,this.id=b.id}function Mb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.percent=f===\"percent\";this.alignOptions={align:b.align||(g?c?\"left\":\"right\":\"center\"),verticalAlign:b.verticalAlign||(g?\"middle\":c?\"bottom\":\"top\"),y:o(b.y,g?4:c?14:-6),x:o(b.x,g?c?-6:6:0)};this.textAlign=b.textAlign||(g?c?\"right\":\"left\":\"center\")}function db(){this.init.apply(this,arguments)}function wb(){this.init.apply(this,arguments)}\nfunction xb(a,b){this.init(a,b)}function eb(a,b){this.init(a,b)}function yb(){this.init.apply(this,arguments)}var w,y=document,O=window,R=Math,t=R.round,P=R.floor,xa=R.ceil,s=R.max,I=R.min,N=R.abs,V=R.cos,ca=R.sin,ya=R.PI,Ua=ya*2/360,oa=navigator.userAgent,Nb=O.opera,ta=/msie/i.test(oa)&&!Nb,fb=y.documentMode===8,gb=/AppleWebKit/.test(oa),hb=/Firefox/.test(oa),Ob=/(Mobile|Android|Windows Phone)/.test(oa),za=\"http://www.w3.org/2000/svg\",Z=!!y.createElementNS&&!!y.createElementNS(za,\"svg\").createSVGRect,\nUb=hb&&parseInt(oa.split(\"Firefox/\")[1],10)<4,$=!Z&&!ta&&!!y.createElement(\"canvas\").getContext,Va,ib=y.documentElement.ontouchstart!==w,Pb={},zb=0,cb,M,Xa,Fa,Ab,D,pa=function(){},Ga=[],Ea=\"div\",S=\"none\",Qb=\"rgba(192,192,192,\"+(Z?1.0E-4:0.002)+\")\",Db=\"millisecond\",pb=\"second\",Ya=\"minute\",Qa=\"hour\",ua=\"day\",Za=\"week\",Ra=\"month\",Da=\"year\",Rb=\"stroke-width\",bb,qb,rb,tb,Sa,$a,ab,Fb,Gb,sb,Hb,Ib,W={};O.Highcharts=O.Highcharts?ka(16,!0):{};Xa=function(a,b,c){if(!u(b)||isNaN(b))return\"Invalid date\";var a=\no(a,\"%Y-%m-%d %H:%M:%S\"),d=new Date(b),e,f=d[rb](),g=d[tb](),h=d[Sa](),i=d[$a](),j=d[ab](),k=M.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Ba(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ba(i+1),y:j.toString().substr(2,2),Y:j,H:Ba(f),I:Ba(f%12||12),l:f%12||12,M:Ba(d[qb]()),p:f<12?\"AM\":\"PM\",P:f<12?\"am\":\"pm\",S:Ba(d.getSeconds()),L:Ba(t(b%1E3),3)},Highcharts.dateFormats);for(e in d)for(;a.indexOf(\"%\"+e)!==-1;)a=a.replace(\"%\"+e,typeof d[e]===\"function\"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+\na.substr(1):a};Jb.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};D=function(){for(var a=0,b=arguments,c=b.length,d={};a<c;a++)d[b[a++]]=b[a];return d}(Db,1,pb,1E3,Ya,6E4,Qa,36E5,ua,864E5,Za,6048E5,Ra,26784E5,Da,31556952E3);Ab={init:function(a,b,c){var b=b||\"\",d=a.shift,e=b.indexOf(\"C\")>-1,f=e?7:3,g,b=b.split(\" \"),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]===\"M\"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&\n(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};\n(function(a){O.HighchartsAdapter=O.HighchartsAdapter||a&&{init:function(b){var c=a.fx,d=c.step,e,f=a.Tween,g=f&&f.propHooks;e=a.cssHooks.opacity;a.extend(a.easing,{easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}});a.each([\"cur\",\"_default\",\"width\",\"height\",\"opacity\"],function(a,b){var e=d,k,l;b===\"cur\"?e=c.prototype:b===\"_default\"&&f&&(e=g[b],b=\"set\");(k=e[b])&&(e[b]=function(c){c=a?c:this;if(c.prop!==\"align\")return l=c.elem,l.attr?l.attr(c.prop,b===\"cur\"?w:c.now):k.apply(this,arguments)})});\nmb(e,\"get\",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});e=function(a){var c=a.elem,d;if(!a.started)d=b.init(c,c.d,c.toD),a.start=d[0],a.end=d[1],a.started=!0;c.attr(\"d\",b.step(a.start,a.end,a.pos,c.toD))};f?g.d={set:e}:d.d=e;this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a=\"Chart\",b=arguments,c,d;ea(b[0])&&(a=b[0],b=Array.prototype.slice.call(b,\n1));c=b[0];if(c!==w)c.chart=c.chart||{},c.chart.renderTo=this[0],new Highcharts[a](c,b[1]),d=this;c===w&&(d=Ga[v(this[0],\"data-highcharts-chart\")]);return d}},getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=y.removeEventListener?\"removeEventListener\":\n\"detachEvent\";y[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g=\"detached\"+c,h;!ta&&d&&(delete d.layerX,delete d.layerY);r(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each([\"preventDefault\",\"stopPropagation\"],function(a,b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b===\"preventDefault\"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===w)c.pageX=\na.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==w&&b.attr&&(c.opacity+=\"px\");e.animate(c,d)},stop:function(b){a(b).stop()}}})(O.jQuery);var X=O.HighchartsAdapter,G=X||{};X&&X.init.call(X,Ab);var jb=G.adapterRun,Vb=G.getScript,qa=G.inArray,n=G.each,ub=G.grep,Wb=G.offset,Na=G.map,J=G.addEvent,aa=G.removeEvent,z=G.fireEvent,Xb=G.washMouseEvent,Bb=G.animate,Wa=G.stop,G={enabled:!0,x:0,y:15,style:{color:\"#666\",cursor:\"default\",\nfontSize:\"11px\",lineHeight:\"14px\"}};M={colors:\"#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a\".split(\",\"),symbols:[\"circle\",\"diamond\",\"square\",\"triangle\",\"triangle-down\"],lang:{loading:\"Loading...\",months:\"January,February,March,April,May,June,July,August,September,October,November,December\".split(\",\"),shortMonths:\"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec\".split(\",\"),weekdays:\"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday\".split(\",\"),decimalPoint:\".\",\nnumericSymbols:\"k,M,G,T,P,E\".split(\",\"),resetZoom:\"Reset zoom\",resetZoomTitle:\"Reset zoom level 1:1\",thousandsSep:\",\"},global:{useUTC:!0,canvasToolsURL:\"http://code.highcharts.com/3.0.6/modules/canvas-tools.js\",VMLRadialGradientURL:\"http://code.highcharts.com/3.0.6/gfx/vml-radial-gradient.png\"},chart:{borderColor:\"#4572A7\",borderRadius:5,defaultSeriesType:\"line\",ignoreHiddenSeries:!0,spacing:[10,10,15,10],style:{fontFamily:'\"Lucida Grande\", \"Lucida Sans Unicode\", Verdana, Arial, Helvetica, sans-serif',\nfontSize:\"12px\"},backgroundColor:\"#FFFFFF\",plotBorderColor:\"#C0C0C0\",resetZoomButton:{theme:{zIndex:20},position:{align:\"right\",x:-10,y:10}}},title:{text:\"Chart title\",align:\"center\",margin:15,style:{color:\"#274b6d\",fontSize:\"16px\"}},subtitle:{text:\"\",align:\"center\",style:{color:\"#4d759e\"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:\"#FFFFFF\",states:{hover:{enabled:!0},select:{fillColor:\"#FFFFFF\",\nlineColor:\"#000000\",lineWidth:2}}},point:{events:{}},dataLabels:x(G,{align:\"center\",enabled:!1,formatter:function(){return this.y===null?\"\":Aa(this.y,-1)},verticalAlign:\"bottom\",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0}},labels:{style:{position:\"absolute\",color:\"#3E576F\"}},legend:{enabled:!0,align:\"center\",layout:\"horizontal\",labelFormatter:function(){return this.name},borderWidth:1,borderColor:\"#909090\",borderRadius:5,navigation:{activeColor:\"#274b6d\",\ninactiveColor:\"#CCC\"},shadow:!1,itemStyle:{cursor:\"pointer\",color:\"#274b6d\",fontSize:\"12px\"},itemHoverStyle:{color:\"#000\"},itemHiddenStyle:{color:\"#CCC\"},itemCheckboxStyle:{position:\"absolute\",width:\"13px\",height:\"13px\"},symbolWidth:16,symbolPadding:5,verticalAlign:\"bottom\",x:0,y:0,title:{style:{fontWeight:\"bold\"}}},loading:{labelStyle:{fontWeight:\"bold\",position:\"relative\",top:\"1em\"},style:{position:\"absolute\",backgroundColor:\"white\",opacity:0.5,textAlign:\"center\"}},tooltip:{enabled:!0,animation:Z,\nbackgroundColor:\"rgba(255, 255, 255, .85)\",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:\"%A, %b %e, %H:%M:%S.%L\",second:\"%A, %b %e, %H:%M:%S\",minute:\"%A, %b %e, %H:%M\",hour:\"%A, %b %e, %H:%M\",day:\"%A, %b %e, %Y\",week:\"Week from %A, %b %e, %Y\",month:\"%B %Y\",year:\"%Y\"},headerFormat:'<span style=\"font-size: 10px\">{point.key}</span><br/>',pointFormat:'<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,snap:Ob?25:10,style:{color:\"#333333\",cursor:\"default\",\nfontSize:\"12px\",padding:\"8px\",whiteSpace:\"nowrap\"}},credits:{enabled:!0,text:\"Highcharts.com\",href:\"http://www.highcharts.com\",position:{align:\"right\",x:-10,verticalAlign:\"bottom\",y:-5},style:{cursor:\"pointer\",color:\"#909090\",fontSize:\"9px\"}}};var Y=M.plotOptions,X=Y.line;Lb();var ra=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Na(a.stops,function(a){return ra(a[1])}):(c=/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/.exec(a))?b=[C(c[1]),C(c[2]),\nC(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))?b=[C(c[1],16),C(c[2],16),C(c[3],16),1]:(c=/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(a))&&(b=[C(c[1]),C(c[2]),C(c[3]),1])})(a);return{get:function(c){var f;d?(f=x(a),f.stops=[].concat(f.stops),n(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c===\"rgb\"?\"rgb(\"+b[0]+\",\"+b[1]+\",\"+b[2]+\")\":c===\"a\"?b[3]:\"rgba(\"+b.join(\",\")+\")\":a;return f},brighten:function(a){if(d)n(d,\nfunction(b){b.brighten(a)});else if(sa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=C(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};wa.prototype={init:function(a,b){this.element=b===\"span\"?U(b):y.createElementNS(za,b);this.renderer=a;this.attrSetters={}},opacity:1,animate:function(a,b,c){b=o(b,Fa,!0);Wa(this);if(b){b=x(b);if(c)b.complete=c;Bb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(),\ni=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,h===\"circle\"?c={x:\"cx\",y:\"cy\"}[c]||c:c===\"strokeWidth\"&&(c=\"stroke-width\"),q=v(g,c)||this[c]||0,c!==\"d\"&&c!==\"visibility\"&&c!==\"fill\"&&(q=parseFloat(q));else{for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==w&&(d=e);if(c===\"d\")d&&d.join&&(d=d.join(\" \")),/(NaN| {2}|^$)/.test(d)&&(d=\"M 0 0\");else if(c===\"x\"&&h===\"text\")for(e=0;e<g.childNodes.length;e++)f=g.childNodes[e],v(f,\"x\")===\nv(g,\"x\")&&v(f,\"x\",d);else if(this.rotation&&(c===\"x\"||c===\"y\"))p=!0;else if(c===\"fill\")d=i.color(d,g,c);else if(h===\"circle\"&&(c===\"x\"||c===\"y\"))c={x:\"cx\",y:\"cy\"}[c]||c;else if(h===\"rect\"&&c===\"r\")v(g,{rx:d,ry:d}),j=!0;else if(c===\"translateX\"||c===\"translateY\"||c===\"rotation\"||c===\"verticalAlign\"||c===\"scaleX\"||c===\"scaleY\")j=p=!0;else if(c===\"stroke\")d=i.color(d,g,c);else if(c===\"dashstyle\")if(c=\"stroke-dasharray\",d=d&&d.toLowerCase(),d===\"solid\")d=S;else{if(d){d=d.replace(\"shortdashdotdot\",\"3,1,1,1,1,1,\").replace(\"shortdashdot\",\n\"3,1,1,1\").replace(\"shortdot\",\"1,1,\").replace(\"shortdash\",\"3,1,\").replace(\"longdash\",\"8,3,\").replace(/dot/g,\"1,3,\").replace(\"dash\",\"4,3,\").replace(/,$/,\"\").split(\",\");for(e=d.length;e--;)d[e]=C(d[e])*o(a[\"stroke-width\"],this[\"stroke-width\"]);d=d.join(\",\")}}else if(c===\"width\")d=C(d);else if(c===\"align\")c=\"text-anchor\",d={left:\"start\",center:\"middle\",right:\"end\"}[d];else if(c===\"title\")e=g.getElementsByTagName(\"title\")[0],e||(e=y.createElementNS(za,\"title\"),g.appendChild(e)),e.textContent=d;c===\"strokeWidth\"&&\n(c=\"stroke-width\");if(c===\"stroke-width\"||c===\"stroke\"){this[c]=d;if(this.stroke&&this[\"stroke-width\"])v(g,\"stroke\",this.stroke),v(g,\"stroke-width\",this[\"stroke-width\"]),this.hasStroke=!0;else if(c===\"stroke-width\"&&d===0&&this.hasStroke)g.removeAttribute(\"stroke\"),this.hasStroke=!1;j=!0}this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&&(m||(this.symbolAttr(a),m=!0),j=!0);if(l&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c))for(e=l.length;e--;)v(l[e],\nc,c===\"height\"?s(d-(l[e].cutHeight||0),0):d);if((c===\"width\"||c===\"height\")&&h===\"rect\"&&d<0)d=0;this[c]=d;c===\"text\"?(d!==this.textStr&&delete this.bBox,this.textStr=d,this.added&&i.buildText(this)):j||v(g,c,d)}p&&this.updateTransform()}return q},addClass:function(a){var b=this.element,c=v(b,\"class\")||\"\";c.indexOf(a)===-1&&v(b,\"class\",c+\" \"+a);return this},symbolAttr:function(a){var b=this;n(\"x,y,r,start,end,width,height,innerR,anchorX,anchorY\".split(\",\"),function(c){b[c]=o(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,\nb.y,b.width,b.height,b)})},clip:function(a){return this.attr(\"clip-path\",a?\"url(\"+this.renderer.url+\"#\"+a.id+\")\":S)},crisp:function(a,b,c,d,e){var f,g={},h={},i,a=a||this.strokeWidth||this.attr&&this.attr(\"stroke-width\")||0;i=t(a)%2/2;h.x=P(b||this.x||0)+i;h.y=P(c||this.y||0)+i;h.width=P((d||this.width||0)-2*i);h.height=P((e||this.height||0)-2*i);h.strokeWidth=a;for(f in h)this[f]!==h[f]&&(this[f]=g[f]=h[f]);return g},css:function(a){var b=this.element,c=a&&a.width&&b.nodeName.toLowerCase()===\"text\",\nd,e=\"\",f=function(a,b){return\"-\"+b.toLowerCase()};if(a&&a.color)a.fill=a.color;this.styles=a=r(this.styles,a);$&&c&&delete a.width;if(ta&&!Z)c&&delete a.width,K(this.element,a);else{for(d in a)e+=d.replace(/([A-Z])/g,f)+\":\"+a[d]+\";\";v(b,\"style\",e)}c&&this.added&&this.renderer.buildText(this);return this},on:function(a,b){var c=this,d=c.element;ib&&a===\"click\"?(d.ontouchstart=function(a){c.touchEventFired=Date.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(oa.indexOf(\"Android\")===-1||\nDate.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d[\"on\"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},htmlCss:function(a){var b=this.element;if(b=a&&b.tagName===\"SPAN\"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=r(this.styles,a);K(this.element,a);return this},htmlGetBBox:function(){var a=\nthis.element,b=this.bBox;if(!b){if(a.nodeName===\"text\")a.style.position=\"absolute\";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||\"left\",h={left:0,center:0.5,right:1}[g],i=g&&g!==\"left\",j=this.shadows;K(b,{marginLeft:c,marginTop:d});j&&n(j,function(a){K(a,{marginLeft:c+1,marginTop:d+1})});\nthis.inverted&&n(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName===\"SPAN\"){var k,l,j=this.rotation,m;k=0;var p=1,q=0,ba;m=C(this.textWidth);var A=this.xCorr||0,L=this.yCorr||0,Sb=[j,g,b.innerHTML,this.textWidth].join(\",\");if(Sb!==this.cTT){u(j)&&(k=j*Ua,p=V(k),q=ca(k),this.setSpanRotation(j,q,p));k=o(this.elemWidth,b.offsetWidth);l=o(this.elemHeight,b.offsetHeight);if(k>m&&/[ \\-]/.test(b.textContent||b.innerText))K(b,{width:m+\"px\",display:\"block\",whiteSpace:\"normal\"}),k=m;m=a.fontMetrics(b.style.fontSize).b;\nA=p<0&&-k;L=q<0&&-l;ba=p*q<0;A+=q*m*(ba?1-h:h);L-=p*m*(j?ba?h:1-h:1);i&&(A-=k*h*(p<0?-1:1),j&&(L-=l*h*(q<0?-1:1)),K(b,{textAlign:g}));this.xCorr=A;this.yCorr=L}K(b,{left:e+A+\"px\",top:f+L+\"px\"});if(gb)l=b.offsetHeight;this.cTT=Sb}}else this.alignOnAdd=!0},setSpanRotation:function(a){var b={};b[ta?\"-ms-transform\":gb?\"-webkit-transform\":hb?\"MozTransform\":Nb?\"-o-transform\":\"\"]=b.transform=\"rotate(\"+a+\"deg)\";K(this.element,b)},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=\nthis.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation;e&&(a+=this.attr(\"width\"),b+=this.attr(\"height\"));a=[\"translate(\"+a+\",\"+b+\")\"];e?a.push(\"rotate(90) scale(-1,1)\"):f&&a.push(\"rotate(\"+f+\" \"+(this.x||0)+\" \"+(this.y||0)+\")\");(u(c)||u(d))&&a.push(\"scale(\"+o(c,1)+\" \"+o(d,1)+\")\");a.length&&v(this.element,\"transform\",a.join(\" \"))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=\na,this.alignByTranslate=b,!c||ea(c))this.alignTo=d=c||\"renderer\",ga(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=o(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d===\"right\"||d===\"center\")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?\"translateX\":\"x\"]=t(f);if(e===\"bottom\"||e===\"middle\")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?\"translateY\":\"y\"]=t(g);this[this.placed?\"animate\":\"attr\"](h);this.placed=\n!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d=this.rotation;c=this.element;var e=this.styles,f=d*Ua;if(!a){if(c.namespaceURI===za||b.forExport){try{a=c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(g){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){b=a.width;c=a.height;if(ta&&e&&e.fontSize===\"11px\"&&c.toPrecision(3)===\"22.7\")a.height=c=14;if(d)a.width=N(c*ca(f))+N(b*V(f)),a.height=N(c*V(f))+N(b*ca(f))}this.bBox=\na}return a},show:function(){return this.attr({visibility:\"visible\"})},hide:function(){return this.attr({visibility:\"hidden\"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=v(f,\"zIndex\"),h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=C(g);if(c.handleZ)for(c=0;c<e.length;c++)if(a=\ne[c],b=v(a,\"zIndex\"),a!==f&&(C(b)>g||!u(g)&&u(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;z(this,\"add\");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName===\"SPAN\"&&b.parentNode,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Wa(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();\na.stops=null}a.safeRemoveChild(b);for(c&&n(c,function(b){a.safeRemoveChild(b)});d&&d.childNodes.length===0;)b=d.parentNode,a.safeRemoveChild(d),d=b;a.alignTo&&ga(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=o(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?\"(-1,-1)\":\"(\"+o(a.offsetX,1)+\", \"+o(a.offsetY,1)+\")\";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;v(f,{isShadow:\"true\",stroke:a.color||\"black\",\"stroke-opacity\":j*\ne,\"stroke-width\":h,transform:\"translate\"+k,fill:S});if(c)v(f,\"height\",s(v(f,\"height\")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this}};var Ha=function(){this.init.apply(this,arguments)};Ha.prototype={Element:wa,init:function(a,b,c,d){var e=location,f,g;f=this.createElement(\"svg\").attr({version:\"1.1\"});g=f.element;a.appendChild(g);a.innerHTML.indexOf(\"xmlns\")===-1&&v(g,\"xmlns\",za);this.isSVG=!0;this.box=g;this.boxWrapper=f;this.alignedObjects=\n[];this.url=(hb||gb)&&y.getElementsByTagName(\"base\").length?e.href.replace(/#.*?$/,\"\").replace(/([\\('\\)])/g,\"\\\\$1\").replace(/ /g,\"%20\"):\"\";this.createElement(\"desc\").add().element.appendChild(y.createTextNode(\"Created with Highcharts 3.0.6\"));this.defs=this.createElement(\"defs\").add();this.forExport=d;this.gradients={};this.setSize(b,c,!1);var h;if(hb&&a.getBoundingClientRect)this.subPixelFix=b=function(){K(a,{left:0,top:0});h=a.getBoundingClientRect();K(a,{left:xa(h.left)-h.left+\"px\",top:xa(h.top)-\nh.top+\"px\"})},b(),J(O,\"resize\",b)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Ka(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&aa(O,\"resize\",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;b.init(this,a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=o(a.textStr,\n\"\").toString().replace(/<(b|strong)>/g,'<span style=\"font-weight:bold\">').replace(/<(i|em)>/g,'<span style=\"font-style:italic\">').replace(/<a/g,\"<span\").replace(/<\\/(b|strong|i|em|a)>/g,\"</span>\").split(/<br.*?>/g),f=b.childNodes,g=/style=\"([^\"]+)\"/,h=/href=\"(http[^\"]+)\"/,i=v(b,\"x\"),j=a.styles,k=j&&j.width&&C(j.width),l=j&&j.lineHeight,m=f.length;m--;)b.removeChild(f[m]);k&&!a.added&&this.box.appendChild(b);e[e.length-1]===\"\"&&e.pop();n(e,function(e,f){var m,o=0,e=e.replace(/<span/g,\"|||<span\").replace(/<\\/span>/g,\n\"</span>|||\");m=e.split(\"|||\");n(m,function(e){if(e!==\"\"||m.length===1){var p={},n=y.createElementNS(za,\"tspan\"),s;g.test(e)&&(s=e.match(g)[1].replace(/(;| |^)color([ :])/,\"$1fill$2\"),v(n,\"style\",s));h.test(e)&&!d&&(v(n,\"onclick\",'location.href=\"'+e.match(h)[1]+'\"'),K(n,{cursor:\"pointer\"}));e=(e.replace(/<(.|\\n)*?>/g,\"\")||\" \").replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\");if(e!==\" \"&&(n.appendChild(y.createTextNode(e)),o?p.dx=0:p.x=i,v(n,p),!o&&f&&(!Z&&d&&K(n,{display:\"block\"}),v(n,\"dy\",l||c.fontMetrics(/px$/.test(n.style.fontSize)?\nn.style.fontSize:j.fontSize).h,gb&&n.offsetHeight)),b.appendChild(n),o++,k))for(var e=e.replace(/([^\\^])-/g,\"$1- \").split(\" \"),u,t,p=a._clipHeight,E=[],w=C(l||16),B=1;e.length||E.length;)delete a.bBox,u=a.getBBox(),t=u.width,u=t>k,!u||e.length===1?(e=E,E=[],e.length&&(B++,p&&B*w>p?(e=[\"...\"],a.attr(\"title\",a.textStr)):(n=y.createElementNS(za,\"tspan\"),v(n,{dy:w,x:i}),s&&v(n,\"style\",s),b.appendChild(n),t>k&&(k=t)))):(n.removeChild(n.firstChild),E.unshift(e.pop())),e.length&&n.appendChild(y.createTextNode(e.join(\" \").replace(/- /g,\n\"-\")))}})})},button:function(a,b,c,d,e,f,g,h){var i=this.label(a,b,c,null,null,null,null,null,\"button\"),j=0,k,l,m,p,q,n,a={x1:0,y1:0,x2:0,y2:1},e=x({\"stroke-width\":1,stroke:\"#CCCCCC\",fill:{linearGradient:a,stops:[[0,\"#FEFEFE\"],[1,\"#F6F6F6\"]]},r:2,padding:5,style:{color:\"black\"}},e);m=e.style;delete e.style;f=x(e,{stroke:\"#68A\",fill:{linearGradient:a,stops:[[0,\"#FFF\"],[1,\"#ACF\"]]}},f);p=f.style;delete f.style;g=x(e,{stroke:\"#68A\",fill:{linearGradient:a,stops:[[0,\"#9BD\"],[1,\"#CDF\"]]}},g);q=g.style;\ndelete g.style;h=x(e,{style:{color:\"#CCC\"}},h);n=h.style;delete h.style;J(i.element,ta?\"mouseover\":\"mouseenter\",function(){j!==3&&i.attr(f).css(p)});J(i.element,ta?\"mouseout\":\"mouseleave\",function(){j!==3&&(k=[e,f,g][j],l=[m,p,q][j],i.attr(k).css(l))});i.setState=function(a){(i.state=j=a)?a===2?i.attr(g).css(q):a===3&&i.attr(h).css(n):i.attr(e).css(m)};return i.on(\"click\",function(){j!==3&&d.call(i)}).attr(e).css(r({cursor:\"default\"},m))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=t(a[1])-b%\n2/2);a[2]===a[5]&&(a[2]=a[5]=t(a[2])+b%2/2);return a},path:function(a){var b={fill:S};Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement(\"path\").attr(b)},circle:function(a,b,c){a=T(a)?a:{x:a,y:b,r:c};return this.createElement(\"circle\").attr(a)},arc:function(a,b,c,d,e,f){if(T(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol(\"arc\",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){e=T(a)?a.r:e;e=this.createElement(\"rect\").attr({rx:e,ry:e,\nfill:S});return e.attr(T(a)?a:e.crisp(f,a,b,s(c,0),s(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[o(c,!0)?\"animate\":\"attr\"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement(\"g\");return u(a)?b.attr({\"class\":\"highcharts-\"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:S};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement(\"image\").attr(f);f.element.setAttributeNS?f.element.setAttributeNS(\"http://www.w3.org/1999/xlink\",\n\"href\",a):f.element.setAttribute(\"hc-svg-href\",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(t(b),t(c),d,e,f),i=/^url\\((.*?)\\)$/,j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(t((d-b[0])/2),t((e-b[1])/2)))},j=a.match(i)[1],a=Pb[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),U(\"img\",{onload:function(){k(g,\nPb[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return[\"M\",a+c/2,b,\"C\",a+c+e,b,a+c+e,b+d,a+c/2,b+d,\"C\",a-e,b+d,a-e,b,a+c/2,b,\"Z\"]},square:function(a,b,c,d){return[\"M\",a,b,\"L\",a+c,b,a+c,b+d,a,b+d,\"Z\"]},triangle:function(a,b,c,d){return[\"M\",a+c/2,b,\"L\",a+c,b+d,a,b+d,\"Z\"]},\"triangle-down\":function(a,b,c,d){return[\"M\",a,b,\"L\",a+c,b,a+c/2,b+d,\"Z\"]},diamond:function(a,b,c,d){return[\"M\",a+c/2,b,\"L\",a+c,b+d/2,a+c/2,b+d,a,b+d/2,\"Z\"]},arc:function(a,b,c,d,\ne){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=V(f),j=ca(f),k=V(g),g=ca(g),e=e.end-f<ya?0:1;return[\"M\",a+c*i,b+c*j,\"A\",c,c,0,e,1,a+c*k,b+c*g,h?\"M\":\"L\",a+d*k,b+d*g,\"A\",d,d,0,e,0,a+d*i,b+d*j,h?\"\":\"Z\"]}},clipRect:function(a,b,c,d){var e=\"highcharts-\"+zb++,f=this.createElement(\"clipPath\").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;return a},color:function(a,b,c){var d=this,e,f=/^rgba/,g,h,i,j,k,l,m,p=[];a&&a.linearGradient?g=\"linearGradient\":a&&a.radialGradient&&\n(g=\"radialGradient\");if(g){c=a[g];h=d.gradients;j=a.stops;b=b.radialReference;Ia(c)&&(a[g]=c={x1:c[0],y1:c[1],x2:c[2],y2:c[3],gradientUnits:\"userSpaceOnUse\"});g===\"radialGradient\"&&b&&!u(c.gradientUnits)&&(c=x(c,{cx:b[0]-b[2]/2+c.cx*b[2],cy:b[1]-b[2]/2+c.cy*b[2],r:c.r*b[2],gradientUnits:\"userSpaceOnUse\"}));for(m in c)m!==\"id\"&&p.push(m,c[m]);for(m in j)p.push(j[m]);p=p.join(\",\");h[p]?a=h[p].id:(c.id=a=\"highcharts-\"+zb++,h[p]=i=d.createElement(g).attr(c).add(d.defs),i.stops=[],n(j,function(a){f.test(a[1])?\n(e=ra(a[1]),k=e.get(\"rgb\"),l=e.get(\"a\")):(k=a[1],l=1);a=d.createElement(\"stop\").attr({offset:a[0],\"stop-color\":k,\"stop-opacity\":l}).add(i);i.stops.push(a)}));return\"url(\"+d.url+\"#\"+a+\")\"}else return f.test(a)?(e=ra(a),v(b,c+\"-opacity\",e.get(\"a\")),e.get(\"rgb\")):(b.removeAttribute(c+\"-opacity\"),a)},text:function(a,b,c,d){var e=M.chart.style,f=$||!Z&&this.forExport;if(d&&!this.forExport)return this.html(a,b,c);b=t(o(b,0));c=t(o(c,0));a=this.createElement(\"text\").attr({x:b,y:c,text:a}).css({fontFamily:e.fontFamily,\nfontSize:e.fontSize});f&&a.css({position:\"absolute\"});a.x=b;a.y=c;return a},html:function(a,b,c){var d=M.chart.style,e=this.createElement(\"span\"),f=e.attrSetters,g=e.element,h=e.renderer;f.text=function(a){a!==g.innerHTML&&delete this.bBox;g.innerHTML=a;return!1};f.x=f.y=f.align=function(a,b){b===\"align\"&&(b=\"textAlign\");e[b]=a;e.htmlUpdateTransform();return!1};e.attr({text:a,x:t(b),y:t(c)}).css({position:\"absolute\",whiteSpace:\"nowrap\",fontFamily:d.fontFamily,fontSize:d.fontSize});e.css=e.htmlCss;\nif(h.isSVG)e.add=function(a){var b,c=h.box.parentNode,d=[];if(a){if(b=a.div,!b){for(;a;)d.push(a),a=a.parentGroup;n(d.reverse(),function(a){var d;b=a.div=a.div||U(Ea,{className:v(a.element,\"class\")},{position:\"absolute\",left:(a.translateX||0)+\"px\",top:(a.translateY||0)+\"px\"},b||c);d=b.style;r(a.attrSetters,{translateX:function(a){d.left=a+\"px\"},translateY:function(a){d.top=a+\"px\"},visibility:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(g);e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e};\nreturn e},fontMetrics:function(a){var a=C(a||11),a=a<24?a+4:t(a*1.2),b=t(a*0.8);return{h:a,b:b}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=o.element.style;L=(Oa===void 0||la===void 0||q.styles.textAlign)&&o.getBBox();q.width=(Oa||L.width||0)+2*da+kb;q.height=(la||L.height||0)+2*da;v=da+p.fontMetrics(a&&a.fontSize).b;if(C){if(!A)a=t(-s*da),b=h?-v:0,q.box=A=d?p.symbol(d,a,b,q.width,q.height):p.rect(a,b,q.width,q.height,0,lb[Rb]),A.add(q);A.isImg||A.attr(x({width:q.width,height:q.height},\nlb));lb=null}}function k(){var a=q.styles,a=a&&a.textAlign,b=kb+da*(1-s),c;c=h?0:v;if(u(Oa)&&(a===\"center\"||a===\"right\"))b+={center:0.5,right:1}[a]*(Oa-L.width);(b!==o.x||c!==o.y)&&o.attr({x:b,y:c});o.x=b;o.y=c}function l(a,b){A?A.attr(a,b):lb[a]=b}function m(){o.add(q);q.attr({text:a,x:b,y:c});A&&u(e)&&q.attr({anchorX:e,anchorY:f})}var p=this,q=p.g(i),o=p.text(\"\",0,0,g).attr({zIndex:1}),A,L,s=0,da=3,kb=0,Oa,la,E,H,B=0,lb={},v,g=q.attrSetters,C;J(q,\"add\",m);g.width=function(a){Oa=a;return!1};g.height=\nfunction(a){la=a;return!1};g.padding=function(a){u(a)&&a!==da&&(da=a,k());return!1};g.paddingLeft=function(a){u(a)&&a!==kb&&(kb=a,k());return!1};g.align=function(a){s={left:0,center:0.5,right:1}[a];return!1};g.text=function(a,b){o.attr(b,a);j();k();return!1};g[Rb]=function(a,b){C=!0;B=a%2/2;l(b,a);return!1};g.stroke=g.fill=g.r=function(a,b){b===\"fill\"&&(C=!0);l(b,a);return!1};g.anchorX=function(a,b){e=a;l(b,a+B-E);return!1};g.anchorY=function(a,b){f=a;l(b,a-H);return!1};g.x=function(a){q.x=a;a-=s*\n((Oa||L.width)+da);E=t(a);q.attr(\"translateX\",E);return!1};g.y=function(a){H=q.y=t(a);q.attr(\"translateY\",H);return!1};var y=q.css;return r(q,{css:function(a){if(a){var b={},a=x(a);n(\"fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow\".split(\",\"),function(c){a[c]!==w&&(b[c]=a[c],delete a[c])});o.css(b)}return y.call(q,a)},getBBox:function(){return{width:L.width+2*da,height:L.height+2*da,x:L.x-da,y:L.y-da}},shadow:function(a){A&&A.shadow(a);return q},destroy:function(){aa(q,\n\"add\",m);aa(q.element,\"mouseenter\");aa(q.element,\"mouseleave\");o&&(o=o.destroy());A&&(A=A.destroy());wa.prototype.destroy.call(q);q=p=j=k=l=m=null}})}};Va=Ha;var F;if(!Z&&!$){Highcharts.VMLElement=F={init:function(a,b){var c=[\"<\",b,' filled=\"f\" stroked=\"f\"'],d=[\"position: \",\"absolute\",\";\"],e=b===Ea;(b===\"shape\"||e)&&d.push(\"left:0;top:0;width:1px;height:1px;\");d.push(\"visibility: \",e?\"hidden\":\"visible\");c.push(' style=\"',d.join(\"\"),'\"/>');if(b)c=e||b===\"span\"||b===\"img\"?c.join(\"\"):a.prepVML(c),this.element=\nU(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();z(this,\"add\");return this},updateTransform:wa.prototype.htmlUpdateTransform,setSpanRotation:function(a,b,c){K(this.element,{filter:a?[\"progid:DXImageTransform.Microsoft.Matrix(M11=\",c,\", M12=\",-b,\", M21=\",b,\", M22=\",c,\", sizingMethod='auto expand')\"].join(\"\"):\nS})},pathToVML:function(a){for(var b=a.length,c=[],d;b--;)if(sa(a[b]))c[b]=t(a[b]*10)-5;else if(a[b]===\"Z\")c[b]=\"x\";else if(c[b]=a[b],a.isArc&&(a[b]===\"wa\"||a[b]===\"at\"))d=a[b]===\"wa\"?1:-1,c[b+5]===c[b+7]&&(c[b+7]-=d),c[b+6]===c[b+8]&&(c[b+8]-=d);return c.join(\" \")||\"x\"},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,p=this.attrSetters,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,q=c===\"strokeWidth\"||c===\"stroke-width\"?\nthis.strokeweight:this[c];else for(c in a)if(d=a[c],m=!1,e=p[c]&&p[c].call(this,d,c),e!==!1&&d!==null){e!==w&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k||(this.symbolAttr(a),k=!0),m=!0;else if(c===\"d\"){d=d||[];this.d=d.join(\" \");f.path=d=this.pathToVML(d);if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c===\"visibility\"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h===\"DIV\"&&(d=d===\"hidden\"?\"-999em\":0,fb||(g[c]=d?\"visible\":\n\"hidden\"),c=\"top\");g[c]=d;m=!0}else if(c===\"zIndex\")d&&(g[c]=d),m=!0;else if(qa(c,[\"x\",\"y\",\"width\",\"height\"])!==-1)this[c]=d,c===\"x\"||c===\"y\"?c={x:\"left\",y:\"top\"}[c]:d=s(0,d),this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,m=!0;else if(c===\"class\"&&h===\"DIV\")f.className=d;else if(c===\"stroke\")d=i.color(d,f,c),c=\"strokecolor\";else if(c===\"stroke-width\"||c===\"strokeWidth\")f.stroked=d?!0:!1,c=\"strokeweight\",this[c]=d,sa(d)&&(d+=\"px\");else if(c===\"dashstyle\")(f.getElementsByTagName(\"stroke\")[0]||\nU(i.prepVML([\"<stroke/>\"]),null,null,f))[c]=d||\"solid\",this.dashstyle=d,m=!0;else if(c===\"fill\")if(h===\"SPAN\")g.color=d;else{if(h!==\"IMG\")f.filled=d!==S?!0:!1,d=i.color(d,f,c,this),c=\"fillcolor\"}else if(c===\"opacity\")m=!0;else if(h===\"shape\"&&c===\"rotation\")this[c]=f.style[c]=d,f.style.left=-t(ca(d*Ua)+1)+\"px\",f.style.top=t(V(d*Ua))+\"px\";else if(c===\"translateX\"||c===\"translateY\"||c===\"rotation\")this[c]=d,this.updateTransform(),m=!0;else if(c===\"text\")this.bBox=null,f.innerHTML=d,m=!0;m||(fb?f[c]=\nd:v(f,c,d))}return q},clip:function(a){var b=this,c;a?(c=a.members,ga(c,b),c.push(b),b.destroyClip=function(){ga(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:fb?\"inherit\":\"rect(auto)\"});return b.css(a)},css:wa.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Ta(a)},destroy:function(){this.destroyClip&&this.destroyClip();return wa.prototype.destroy.apply(this)},on:function(a,b){this.element[\"on\"+a]=function(){var a=O.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,\nb){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=C(a[c-2])-10*b;return a.join(\" \")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,p,q;k&&typeof k.value!==\"string\"&&(k=\"x\");m=k;if(a){p=o(a.width,3);q=(a.opacity||0.15)/p;for(e=1;e<=3;e++){l=p*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=['<shape isShadow=\"true\" strokeweight=\"',l,'\" filled=\"false\" path=\"',m,'\" coordsize=\"10 10\" style=\"',f.style.cssText,'\" />'];h=U(g.prepVML(j),null,\n{left:C(i.left)+o(a.offsetX,1),top:C(i.top)+o(a.offsetY,1)});if(c)h.cutOff=l+1;j=['<stroke color=\"',a.color||\"black\",'\" opacity=\"',q*e,'\"/>'];U(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};F=ha(wa,F);var ma={Element:F,isIE8:oa.indexOf(\"MSIE 8.0\")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ea);e=d.element;e.style.position=\"relative\";a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=\nd;this.setSize(b,c,!1);y.namespaces.hcv||(y.namespaces.add(\"hcv\",\"urn:schemas-microsoft-com:vml\"),(y.styleSheets.length?y.styleSheets[0]:y.createStyleSheet()).cssText+=\"hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke{ behavior:url(#default#VML); display: inline-block; } \")},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=T(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=\na.element,c=b.nodeName,a=a.inverted,d=this.top-(c===\"shape\"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:\"rect(\"+t(a?e:d)+\"px,\"+t(a?f:b)+\"px,\"+t(a?b:f)+\"px,\"+t(a?d:e)+\"px)\"};!a&&fb&&c===\"DIV\"&&r(d,{width:b+\"px\",height:f+\"px\"});return d},updateClipping:function(){n(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=S;a&&a.linearGradient?i=\"gradient\":a&&a.radialGradient&&(i=\"pattern\");if(i){var k,l,m=a.linearGradient||a.radialGradient,\np,q,o,A,L,s=\"\",a=a.stops,u,t=[],w=function(){h=['<fill colors=\"'+t.join(\",\")+'\" opacity=\"',o,'\" o:opacity2=\"',q,'\" type=\"',i,'\" ',s,'focus=\"100%\" method=\"any\" />'];U(e.prepVML(h),null,null,b)};p=a[0];u=a[a.length-1];p[0]>0&&a.unshift([0,p[1]]);u[0]<1&&a.push([1,u[1]]);n(a,function(a,b){g.test(a[1])?(f=ra(a[1]),k=f.get(\"rgb\"),l=f.get(\"a\")):(k=a[1],l=1);t.push(a[0]*100+\"% \"+k);b?(o=l,A=k):(q=l,L=k)});if(c===\"fill\")if(i===\"gradient\")c=m.x1||m[0]||0,a=m.y1||m[1]||0,p=m.x2||m[2]||0,m=m.y2||m[3]||0,s='angle=\"'+\n(90-R.atan((m-a)/(p-c))*180/ya)+'\"',w();else{var j=m.r,r=j*2,E=j*2,H=m.cx,B=m.cy,x=b.radialReference,v,j=function(){x&&(v=d.getBBox(),H+=(x[0]-v.x)/v.width-0.5,B+=(x[1]-v.y)/v.height-0.5,r*=x[2]/v.width,E*=x[2]/v.height);s='src=\"'+M.global.VMLRadialGradientURL+'\" size=\"'+r+\",\"+E+'\" origin=\"0.5,0.5\" position=\"'+H+\",\"+B+'\" color2=\"'+L+'\" ';w()};d.added?j():J(d,\"add\",j);j=A}else j=k}else if(g.test(a)&&b.tagName!==\"IMG\")f=ra(a),h=[\"<\",c,' opacity=\"',f.get(\"a\"),'\"/>'],U(this.prepVML(h),null,null,b),j=\nf.get(\"rgb\");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type=\"solid\";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join(\"\");b?(a=a.replace(\"/>\",' xmlns=\"urn:schemas-microsoft-com:vml\" />'),a=a.indexOf('style=\"')===-1?a.replace(\"/>\",' style=\"display:inline-block;behavior:url(#default#VML);\" />'):a.replace('style=\"','style=\"display:inline-block;behavior:url(#default#VML);')):a=a.replace(\"<\",\"<hcv:\");return a},text:Ha.prototype.html,path:function(a){var b={coordsize:\"10 10\"};\nIa(a)?b.d=a:T(a)&&r(b,a);return this.createElement(\"shape\").attr(b)},circle:function(a,b,c){var d=this.symbol(\"circle\");if(T(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:\"highcharts-\"+a,\"class\":\"highcharts-\"+a});return this.createElement(Ea).attr(b)},image:function(a,b,c,d,e){var f=this.createElement(\"img\").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){var g=this.symbol(\"rect\");g.r=\nT(a)?a.r:e;return g.attr(T(a)?a:g.crisp(f,a,b,s(c,0),s(d,0)))},invertChild:function(a,b){var c=b.style;K(a,{flip:\"x\",left:C(c.width)-1,top:C(c.height)-1,rotation:-90})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=V(f),i=ca(f),j=V(g),k=ca(g);if(g-f===0)return[\"x\"];f=[\"wa\",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push(\"e\",\"M\",a,b);f.push(\"at\",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,\"x\",\"e\");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);\ne&&e.isCircle&&(a-=c/2,b-=d/2);return[\"wa\",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,\"e\"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!u(e)||!e.r?f=Ha.prototype.symbols.square.apply(0,arguments):(h=I(e.r,c,d),f=[\"M\",a+h,b,\"L\",f-h,b,\"wa\",f-2*h,b,f,b+2*h,f-h,b,f,b+h,\"L\",f,g-h,\"wa\",f-2*h,g-2*h,f,g,f,g-h,f-h,g,\"L\",a+h,g,\"wa\",a,g-2*h,a+2*h,g,a+h,g,a,g-h,\"L\",a,b+h,\"wa\",a,b,a+2*h,b+2*h,a,b+h,a+h,b,\"x\",\"e\"]);return f}}};Highcharts.VMLRenderer=F=function(){this.init.apply(this,arguments)};F.prototype=x(Ha.prototype,\nma);Va=F}var Tb;if($)Highcharts.CanVGRenderer=F=function(){za=\"http://www.w3.org/1999/xhtml\"},F.prototype.symbols={},Tb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Vb(d,a);b.push(c)}}}(),Va=F;Ma.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.horiz,e=a.categories,f=a.series[0]&&a.series[0].names,g=this.pos,h=b.labels,i=a.tickPositions,d=d&&e&&!h.step&&!h.staggerLines&&!h.rotation&&c.plotWidth/i.length||\n!d&&(c.margin[3]||c.chartWidth*0.33),j=g===i[0],k=g===i[i.length-1],l,f=e?o(e[g],f&&f[g],g):g,e=this.label,m=i.info;a.isDatetimeAxis&&m&&(l=b.dateTimeLabelFormats[m.higherRanks[g]||m.unitName]);this.isFirst=j;this.isLast=k;b=a.labelFormatter.call({axis:a,chart:c,isFirst:j,isLast:k,dateTimeLabelFormat:l,value:a.isLog?ia(fa(f)):f});g=d&&{width:s(1,t(d-2*(h.padding||10)))+\"px\"};g=r(g,h.style);if(u(e))e&&e.attr({text:b}).css(g);else{l={align:a.labelAlign};if(sa(h.rotation))l.rotation=h.rotation;if(d&&\nh.ellipsis)l._clipHeight=a.len/i.length;this.label=u(b)&&h.enabled?c.renderer.text(b,0,0,h.useHTML).attr(l).css(g).add(a.labelGroup):null}},getLabelSize:function(){var a=this.label,b=this.axis;return a?(this.labelBBox=a.getBBox())[b.horiz?\"height\":\"width\"]:0},getLabelSides:function(){var a=this.axis,b=this.labelBBox.width,a=b*{left:0,center:0.5,right:1}[a.labelAlign]-a.options.labels.x;return[-a,b-a]},handleOverflow:function(a,b){var c=!0,d=this.axis,e=d.chart,f=this.isFirst,g=this.isLast,h=b.x,i=\nd.reversed,j=d.tickPositions;if(f||g){var k=this.getLabelSides(),l=k[0],k=k[1],e=e.plotLeft,m=e+d.len,j=(d=d.ticks[j[a+(f?1:-1)]])&&d.label.xy&&d.label.xy.x+d.getLabelSides()[f?0:1];f&&!i||g&&i?h+l<e&&(h=e-l,d&&h+k>j&&(c=!1)):h+k>m&&(h=m-k,d&&h+l<j&&(c=!1));b.x=h}return c},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?\ng-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,l=i.staggerLines,m=i.chart.renderer.fontMetrics(e.style.fontSize).b,p=e.rotation,a=a+e.x-(f&&d?f*j*(k?-1:1):0),b=b+e.y-(f&&!d?f*j*(k?1:-1):0);p&&i.side===2&&(b-=m-m*V(p*Ua));!u(e.y)&&!p&&(b+=m-c.getBBox().height/2);l&&(b+=g/(h||1)%l*(i.labelOffset/l));return{x:a,y:b}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine([\"M\",a,b,\"L\",\na+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,l=this.gridLine,m=h?h+\"Grid\":\"grid\",p=h?h+\"Tick\":\"tick\",q=e[m+\"LineWidth\"],n=e[m+\"LineColor\"],A=e[m+\"LineDashStyle\"],s=e[p+\"Length\"],m=e[p+\"Width\"]||0,u=e[p+\"Color\"],t=e[p+\"Position\"],p=this.mark,r=k.step,v=!0,x=d.tickmarkOffset,E=this.getPosition(g,j,x,b),H=E.x,E=E.y,B=g&&H===d.pos+d.len||!g&&E===d.pos?-1:1,C=d.staggerLines;this.isActive=!0;if(q){j=\nd.getPlotLinePath(j+x,q*B,b,!0);if(l===w){l={stroke:n,\"stroke-width\":q};if(A)l.dashstyle=A;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=q?f.path(j).attr(l).add(d.gridGroup):null}if(!b&&l&&j)l[this.isNew?\"attr\":\"animate\"]({d:j,opacity:c})}if(m&&s)t===\"inside\"&&(s=-s),d.opposite&&(s=-s),b=this.getMarkPath(H,E,s,m*B,g,f),p?p.animate({d:b,opacity:c}):this.mark=f.path(b).attr({stroke:u,\"stroke-width\":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(H))i.xy=E=this.getLabelPosition(H,E,i,g,k,x,a,r),this.isFirst&&\n!this.isLast&&!o(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!o(e.showLastLabel,1)?v=!1:!C&&g&&k.overflow===\"justify\"&&!this.handleOverflow(a,E)&&(v=!1),r&&a%r&&(v=!1),v&&!isNaN(E.y)?(E.opacity=c,i[this.isNew?\"attr\":\"animate\"](E),this.isNew=!1):i.attr(\"y\",-9999)},destroy:function(){Ka(this,this.axis)}};vb.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=(b.pointRange||0)/2,e=a.options,f=e.label,g=a.label,h=e.width,i=e.to,j=e.from,k=u(j)&&u(i),l=e.value,m=e.dashStyle,p=a.svgElem,q=\n[],n,A=e.color,L=e.zIndex,t=e.events,w=b.chart.renderer;b.isLog&&(j=na(j),i=na(i),l=na(l));if(h){if(q=b.getPlotLinePath(l,h),d={stroke:A,\"stroke-width\":h},m)d.dashstyle=m}else if(k){if(j=s(j,b.min-d),i=I(i,b.max+d),q=b.getPlotBandPath(j,i,e),d={fill:A},e.borderWidth)d.stroke=e.borderColor,d[\"stroke-width\"]=e.borderWidth}else return;if(u(L))d.zIndex=L;if(p)q?p.animate({d:q},null,p.onGetPath):(p.hide(),p.onGetPath=function(){p.show()});else if(q&&q.length&&(a.svgElem=p=w.path(q).attr(d).add(),t))for(n in e=\nfunction(b){p.on(b,function(c){t[b].apply(a,[c])})},t)e(n);if(f&&u(f.text)&&q&&q.length&&b.width>0&&b.height>0){f=x({align:c&&k&&\"center\",x:c?!k&&4:10,verticalAlign:!c&&k&&\"middle\",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=w.text(f.text,0,0,f.useHTML).attr({align:f.textAlign||f.align,rotation:f.rotation,zIndex:L}).css(f.style).add();b=[q[1],q[4],o(q[6],q[1])];q=[q[2],q[5],o(q[7],q[2])];c=Ja(b);k=Ja(q);g.align(f,!1,{x:c,y:k,width:va(b)-c,height:va(q)-k});g.show()}else g&&g.hide();return a},\ndestroy:function(){ga(this.axis.plotLinesAndBands,this);delete this.axis;Ka(this)}};Mb.prototype={destroy:function(){Ka(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ca(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:\"hidden\"}):this.label=this.axis.chart.renderer.text(c,0,0,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:\"hidden\"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative,\ng=c.translate(this.percent?100:this.total,0,0,0,1),c=c.translate(0),c=N(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e.attr({visibility:this.options.crop===!1||d.isInsidePlot(f.x,f.y)?Z?\"inherit\":\"visible\":\"hidden\"})}};db.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:\"%H:%M:%S.%L\",second:\"%H:%M:%S\",minute:\"%H:%M\",hour:\"%H:%M\",day:\"%e. %b\",week:\"%e. %b\",\nmonth:\"%b '%y\",year:\"%Y\"},endOnTick:!1,gridLineColor:\"#C0C0C0\",labels:G,lineColor:\"#C0D0E0\",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:\"#E0E0E0\",minorGridLineWidth:1,minorTickColor:\"#A0A0A0\",minorTickLength:2,minorTickPosition:\"outside\",startOfWeek:1,startOnTick:!1,tickColor:\"#C0D0E0\",tickLength:5,tickmarkPlacement:\"between\",tickPixelInterval:100,tickPosition:\"outside\",tickWidth:1,title:{align:\"middle\",style:{color:\"#4d759e\",fontWeight:\"bold\"}},type:\"linear\"},defaultYAxisOptions:{endOnTick:!0,\ngridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:\"Values\"},stackLabels:{enabled:!1,formatter:function(){return Aa(this.total,-1)},style:G.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},\ntitle:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.xOrY=(this.isXAxis=c)?\"x\":\"y\";this.opposite=b.opposite;this.side=this.horiz?this.opposite?0:2:this.opposite?1:3;this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e===\"category\";this.isLog=e===\"logarithmic\";this.isDatetimeAxis=\ne===\"datetime\";this.isLinked=u(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement===\"between\"?0.5:0;this.ticks={};this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stackExtremes={};this.min=this.max=null;var f,d=this.options.events;qa(this,a.axes)===-1&&(a.axes.push(this),a[c?\"xAxis\":\"yAxis\"].push(this));this.series=this.series||\n[];if(a.inverted&&c&&this.reversed===w)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)J(this,f,d[f]);if(this.isLog)this.val2lin=na,this.lin2val=fa},setOptions:function(a){this.options=x(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(M[this.isXAxis?\"xAxis\":\"yAxis\"],a))},update:function(a,b){var c=this.chart,a=c.options[this.xOrY+\n\"Axis\"][this.options.index]=x(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.userMin=this.userMax=w;this.init(c,r(a,{events:w}));c.isDirtyBox=!0;o(b,!0)&&c.redraw()},remove:function(a){var b=this.chart,c=this.xOrY+\"Axis\";n(this.series,function(a){a.remove(!1)});ga(b.axes,this);ga(b[c],this);b.options[c].splice(this.options.index,1);n(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;o(a,!0)&&b.redraw()},defaultLabelFormatter:function(){var a=this.axis,b=this.value,\nc=a.categories,d=this.dateTimeLabelFormat,e=M.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ca(h,this);else if(c)g=b;else if(d)g=Xa(d,b);else if(f&&a>=1E3)for(;f--&&g===w;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Aa(b/c,-1)+e[f]);g===w&&(g=b>=1E3?Aa(b,0):Aa(b,-1));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.stackExtremes={};a.buildStacks();n(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d;\nd=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=I(o(a.dataMin,d[0]),Ja(d)),a.dataMax=s(o(a.dataMax,d[0]),va(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(u(c)&&u(e))a.dataMin=I(o(a.dataMin,c),c),a.dataMax=s(o(a.dataMax,e),e);if(u(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMax<d)a.dataMax=d,a.ignoreMaxPadding=!0}}})},translate:function(a,b,c,d,e,f){var g=this.len,h=1,i=0,j=d?this.oldTransA:this.transA,\nd=d?this.oldMin:this.min,k=this.minPixelPadding,e=(this.options.ordinal||this.isLog&&e)&&this.lin2val;if(!j)j=this.transA;c&&(h*=-1,i=g);this.reversed&&(h*=-1,i-=h*g);b?(a=a*h+i,a-=k,a=a/j+d,e&&(a=this.lin2val(a))):(e&&(a=this.val2lin(a)),f===\"between\"&&(f=0.5),a=h*(a-d)*j+i+h*k+(sa(f)?j*f*this.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,\nb,c,d){var e=this.chart,f=this.left,g=this.top,h,i,j,a=this.translate(a,null,null,c),k=c&&e.oldChartHeight||e.chartHeight,l=c&&e.oldChartWidth||e.chartWidth,m;h=this.transB;c=i=t(a+h);h=j=t(k-a-h);if(isNaN(a))m=!0;else if(this.horiz){if(h=g,j=k-this.bottom,c<f||c>f+this.width)m=!0}else if(c=f,i=l-this.right,h<g||h>g+this.height)m=!0;return m&&!d?null:e.renderer.crispLine([\"M\",c,h,\"L\",i,j],b||0)},getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4],\nc[5],c[1],c[2]):d=null;return d},getLinearTickPositions:function(a,b,c){for(var d,b=ia(P(b/a)*a),c=ia(xa(c/a)*a),e=[];b<=c;){e.push(b);b=ia(b+a);if(b===d)break;d=b}return e},getLogTickPositions:function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=t(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=P(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)j=na(fa(f)*e[h]),j>b&&(!d||\nk<=c)&&g.push(k),k>c&&(l=!0),k=j}else if(b=fa(b),c=fa(c),a=e[d?\"minorTickInterval\":\"tickInterval\"],a=o(a===\"auto\"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=ob(a,null,nb(a)),g=Na(this.getLinearTickPositions(a,b,c),na),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a<e;a++)d=d.concat(this.getLogTickPositions(c,\nb[a-1],b[a],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval===\"auto\")d=d.concat(Eb(Cb(c),this.min,this.max,a.startOfWeek)),d[0]<this.min&&d.shift();else for(b=this.min+(b[0]-this.min)%c;b<=this.max;b+=c)d.push(b);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===w&&!this.isLog)u(a.min)||u(a.max)?this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-\n1;g>0;g--)if(h=i[g]-i[g-1],f===w||h<f)f=h}),this.minRange=I(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){var k=this.minRange;d=(k-c+b)/2;d=[b-d,o(a.min,b-d)];if(e)d[2]=this.dataMin;b=va(d);c=[b+k,o(a.max,b+k)];if(e)c[2]=this.dataMax;c=Ja(c);c-b<k&&(d[0]=c-k,d[1]=o(a.min,c-k),b=va(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this.max-this.min,c=0,d,e=0,f=0,g=this.linkedParent,h=this.transA;if(this.isXAxis)g?(e=g.minPointOffset,f=g.pointRangePadding):n(this.series,function(a){var g=\na.pointRange,h=a.options.pointPlacement,l=a.closestPointRange;g>b&&(g=0);c=s(c,g);e=s(e,ea(h)?0:g/2);f=s(f,h===\"on\"?0:g);!a.noSharedTooltip&&u(l)&&(d=u(d)?I(d,l):l)}),g=this.ordinalSlope&&d?this.ordinalSlope/d:1,this.minPointOffset=e*=g,this.pointRangePadding=f*=g,this.pointRange=I(c,b),this.closestPointRange=d;if(a)this.oldTransA=h;this.translationSlope=this.transA=h=this.len/(b+f||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=h*e},setTickPositions:function(a){var b=this,c=\nb.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval,m=d.minTickInterval,p=d.tickPixelInterval,q,ba=b.categories;h?(b.linkedParent=c[g?\"xAxis\":\"yAxis\"][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=o(c.min,c.dataMin),b.max=o(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&ka(11,1)):(b.min=o(b.userMin,d.min,b.dataMin),b.max=o(b.userMax,d.max,b.dataMax));if(e)!a&&I(b.min,o(b.dataMin,b.min))<=0&&\nka(10,1),b.min=ia(na(b.min)),b.max=ia(na(b.max));if(b.range&&(b.userMin=b.min=s(b.min,b.max-b.range),b.userMax=b.max,a))b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!ba&&!b.usePercentage&&!h&&u(b.min)&&u(b.max)&&(c=b.max-b.min)){if(!u(d.min)&&!u(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*k;if(!u(d.max)&&!u(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:h&&!l&&p===b.linkedParent.options.tickPixelInterval?\nb.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=o(l,ba?1:(b.max-b.min)*p/s(b.len,p)),!u(l)&&b.len<p&&!this.isRadial&&(q=!0,b.tickInterval/=4));g&&!a&&n(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=s(b.pointRange,b.tickInterval);if(!l&&b.tickInterval<m)b.tickInterval=\nm;if(!f&&!e&&!l)b.tickInterval=ob(b.tickInterval,null,nb(b.tickInterval),d);b.minorTickInterval=d.minorTickInterval===\"auto\"&&b.tickInterval?b.tickInterval/5:d.minorTickInterval;b.tickPositions=a=d.tickPositions?[].concat(d.tickPositions):i&&i.apply(b,[b.min,b.max]);if(!a)!b.ordinalPositions&&(b.max-b.min)/b.tickInterval>s(2*b.len,200)&&ka(19,!0),a=f?(b.getNonLinearTimeTicks||Eb)(Cb(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):e?b.getLogTickPositions(b.tickInterval,\nb.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),q&&a.splice(1,a.length-2),b.tickPositions=a;if(!h)e=a[0],f=a[a.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&a.shift(),d.endOnTick?b.max=f:b.max+h<f&&a.pop(),a.length===1&&(b.min-=0.001,b.max+=0.001)},setMaxTicks:function(){var a=this.chart,b=a.maxTicks||{},c=this.tickPositions,d=this._maxTicksKey=[this.xOrY,this.pos,this.len].join(\"-\");if(!this.isLinked&&!this.isDatetimeAxis&&c&&c.length>(b[d]||0)&&this.options.alignTicks!==\n!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e<a){for(;b.length<a;)b.push(ia(b[b.length-1]+this.tickInterval));this.transA*=(e-1)/(a-1);this.max=b[b.length-1]}if(u(d)&&a!==d)this.isDirty=!0}},setScale:function(){var a=this.stacks,b,c,d,e;this.oldMin=this.min;this.oldMax=\nthis.max;this.oldAxisLength=this.len;this.setAxisSize();e=this.len!==this.oldAxisLength;n(this.series,function(a){if(a.isDirtyData||a.isDirty||a.xAxis.isDirty)d=!0});if(e||d||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(!this.isXAxis)for(b in a)delete a[b];this.forceRedraw=!1;this.getSeriesExtremes();this.setTickPositions();this.oldUserMin=this.userMin;this.oldUserMax=this.userMax;if(!this.isDirty)this.isDirty=e||this.min!==this.oldMin||this.max!==\nthis.oldMax}else if(!this.isXAxis){if(this.oldStacks)a=this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}this.setMaxTicks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=o(c,!0),e=r(e,{min:a,max:b});z(f,\"setExtremes\",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;f.isDirtyExtremes=!0;c&&g.redraw(d)})},zoom:function(a,b){this.allowZoomOutside||(u(this.dataMin)&&a<=this.dataMin&&(a=w),u(this.dataMax)&&b>=this.dataMax&&(b=w));this.displayBtn=a!==w||b!==w;this.setExtremes(a,\nb,!1,w,{trigger:\"zoom\"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0,e=this.horiz,f,g;this.left=g=o(b.left,a.plotLeft+c);this.top=f=o(b.top,a.plotTop);this.width=c=o(b.width,a.plotWidth-c+d);this.height=b=o(b.height,a.plotHeight);this.bottom=a.chartHeight-b-f;this.right=a.chartWidth-c-g;this.len=s(e?c:b,0);this.pos=e?g:f},getExtremes:function(){var a=this.isLog;return{min:a?ia(fa(this.min)):this.min,max:a?ia(fa(this.max)):this.max,dataMin:this.dataMin,\ndataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?fa(this.min):this.min,b=b?fa(this.max):this.max;c>a||a===null?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},addPlotBand:function(a){this.addPlotBandOrLine(a,\"plotBands\")},addPlotLine:function(a){this.addPlotBandOrLine(a,\"plotLines\")},addPlotBandOrLine:function(a,b){var c=(new vb(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},\nautoLabelAlign:function(a){a=(o(a,0)-this.side*90+720)%360;return a>15&&a<165?\"right\":a>195&&a<345?\"left\":\"center\"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k=0,l,m=0,p=d.title,q=d.labels,ba=0,A=b.axisOffset,L=b.clipOffset,t=[-1,1,1,-1][h],r,v=1,x=o(q.maxStaggerLines,5),la,E,H,B;a.hasData=j=a.hasVisibleSeries||u(a.min)&&u(a.max)&&!!e;a.showAxis=b=j||o(d.showEmpty,!0);a.staggerLines=a.horiz&&q.staggerLines;\nif(!a.axisGroup)a.gridGroup=c.g(\"grid\").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g(\"axis\").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g(\"axis-labels\").attr({zIndex:q.zIndex||7}).add();if(j||a.isLinked){a.labelAlign=o(q.align||a.autoLabelAlign(q.rotation));n(e,function(b){f[b]?f[b].addLabel():f[b]=new Ma(a,b)});if(a.horiz&&!a.staggerLines&&x&&!q.rotation){for(r=a.reversed?[].concat(e).reverse():e;v<x;){j=[];la=!1;for(q=0;q<r.length;q++)E=r[q],H=(H=f[E].label&&f[E].label.getBBox())?H.width:\n0,B=q%v,H&&(E=a.translate(E),j[B]!==w&&E<j[B]&&(la=!0),j[B]=E+H);if(la)v++;else break}if(v>1)a.staggerLines=v}n(e,function(b){if(h===0||h===2||{1:\"left\",3:\"right\"}[h]===a.labelAlign)ba=s(f[b].getLabelSize(),ba)});if(a.staggerLines)ba*=a.staggerLines,a.labelOffset=ba}else for(r in f)f[r].destroy(),delete f[r];if(p&&p.text&&p.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(p.text,0,0,p.useHTML).attr({zIndex:7,rotation:p.rotation||0,align:p.textAlign||{low:\"left\",middle:\"center\",high:\"right\"}[p.align]}).css(p.style).add(a.axisGroup),\na.axisTitle.isNew=!0;if(b)k=a.axisTitle.getBBox()[g?\"height\":\"width\"],m=o(p.margin,g?5:10),l=p.offset;a.axisTitle[b?\"show\":\"hide\"]()}a.offset=t*o(d.offset,A[h]);a.axisTitleMargin=o(l,ba+m+(h!==2&&ba&&t*d.labels[g?\"y\":\"x\"]));A[h]=s(A[h],a.axisTitleMargin+k+t*a.offset);L[i]=s(L[i],P(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine([\"M\",\ne?this.left:f,e?d:this.top,\"L\",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=C(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,\nb=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.stacks,j=a.ticks,k=a.minorTicks,l=a.alternateBands,m=d.stackLabels,p=d.alternateGridColor,q=a.tickmarkOffset,o=d.lineWidth,A,s=b.hasRendered&&u(a.oldMin)&&!isNaN(a.oldMin);A=a.hasData;var t=a.showAxis,r,v;n([j,k,l],function(a){for(var b in a)a[b].isActive=!1});if(A||f)if(a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Ma(a,b,\"minor\"));s&&k[b].isNew&&k[b].render(null,\n!0);k[b].render(null,!1,1)}),g.length&&(n(g.slice(1).concat([g[0]]),function(b,c){c=c===g.length-1?0:c+1;if(!f||b>=a.min&&b<=a.max)j[b]||(j[b]=new Ma(a,b)),s&&j[b].isNew&&j[b].render(c,!0),j[b].render(c,!1,1)}),q&&a.min===0&&(j[-1]||(j[-1]=new Ma(a,-1,null,!0)),j[-1].render(-1))),p&&n(g,function(b,c){if(c%2===0&&b<a.max)l[b]||(l[b]=new vb(a)),r=b+q,v=g[c+1]!==w?g[c+1]+q:a.max,l[b].options={from:e?fa(r):r,to:e?fa(v):v,color:p},l[b].render(),l[b].isActive=!0}),!a._addedPlotLB)n((d.plotLines||[]).concat(d.plotBands||\n[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0;n([j,k,l],function(a){var c,d,e=[],f=Fa?Fa.duration||500:0,g=function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])};for(c in a)if(!a[c].isActive)a[c].render(c,!1,0),a[c].isActive=!1,e.push(c);a===l||!b.hasRendered||!f?g():f&&setTimeout(g,f)});if(o)A=a.getLinePath(o),a.axisLine?a.axisLine.animate({d:A}):a.axisLine=c.path(A).attr({stroke:d.lineColor,\"stroke-width\":o,zIndex:7}).add(a.axisGroup),a.axisLine[t?\n\"show\":\"hide\"]();if(h&&t)h[h.isNew?\"attr\":\"animate\"](a.getTitlePosition()),h.isNew=!1;if(m&&m.enabled){var x,la,d=a.stackTotalGroup;if(!d)a.stackTotalGroup=d=c.g(\"stack-labels\").attr({visibility:\"visible\",zIndex:6}).add();d.translate(b.plotLeft,b.plotTop);for(x in i)for(la in c=i[x],c)c[la].render(d)}a.isDirty=!1},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();n([c.plotLines||[],d.plotLines||[],c.plotBands||\n[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&ga(b,b[e])})},setTitle:function(a,b){this.update({title:a},b)},redraw:function(){var a=this.chart.pointer;a.reset&&a.reset(!0);this.render();n(this.plotLinesAndBands,function(a){a.render()});n(this.series,function(a){a.isDirty=!0})},buildStacks:function(){var a=this.series,b=a.length;if(!this.isXAxis){for(;b--;)a[b].setStackedPoints();if(this.usePercentage)for(b=0;b<a.length;b++)a[b].setPercentStacks()}},setCategories:function(a,b){this.update({categories:a},\nb)},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||aa(b);for(d in c)Ka(c[d]),c[d]=null;n([b.ticks,b.minorTicks,b.alternateBands],function(a){Ka(a)});for(a=e.length;a--;)e[a].destroy();n(\"stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle\".split(\",\"),function(a){b[a]&&(b[a]=b[a].destroy())})}};wb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=C(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=\na.renderer.label(\"\",0,0,b.shape,null,null,b.useHTML,null,\"tooltip\").attr({padding:e,fill:b.backgroundColor,\"stroke-width\":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-999});$||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){n(this.crosshairs,function(a){a&&a.destroy()});if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden;\nr(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:g?(2*f.anchorX+c)/3:c,anchorY:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g&&(N(a-f.x)>1||N(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},o(this.options.hideDelay,500)),b&&n(b,function(a){a.setState()}),this.chart.hoverPoints=\nnull},hideCrosshairs:function(){n(this.crosshairs,function(a){a&&a.hide()})},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ja(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===w&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(n(a,function(a){i=a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:\nh]);return Na(c,t)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=o(this.options.distance,12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+s(j,0)+i);d+a>e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k<f+5&&(k=f+5,l&&c>=k&&c<=k+b&&(k=c+f+i));k+b>f+h&&(k=s(f,f+h-b-i));return{x:d,y:k}},defaultFormatter:function(a){var b=this.points||ja(this),c=b[0].series,d;d=[c.tooltipHeaderFormatter(b[0])];n(b,function(a){c=a.series;d.push(c.tooltipFormatter&&\nc.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||\"\");return d.join(\"\")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=e.crosshairs,m=this.shared;clearTimeout(this.hideTimer);this.followPointer=ja(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];m&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&n(h,\nfunction(a){a.setState()}),n(a,function(a){a.setState(\"hover\");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;i===!1?this.hide():(this.isHidden&&(Wa(d),d.attr(\"opacity\",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||\"#606060\",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g}),this.isHidden=!1);if(l){l=ja(l);for(d=l.length;d--;)if(m=a.series,e=m[d?\"yAxis\":\"xAxis\"],l[d]&&e)if(h=d?o(a.stackY,a.y):a.x,\ne.isLog&&(h=na(h)),d===1&&m.modifyValue&&(h=m.modifyValue(h)),e=e.getPlotLinePath(h,1),this.crosshairs[d])this.crosshairs[d].attr({d:e,visibility:\"visible\"});else{h={\"stroke-width\":l[d].width||1,stroke:l[d].color||\"#C0C0C0\",zIndex:l[d].zIndex||2};if(l[d].dashStyle)h.dashstyle=l[d].dashStyle;this.crosshairs[d]=c.renderer.path(e).attr(h).add()}}z(c,\"tooltipRefresh\",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||\nthis.getPosition).call(this,c.width,c.height,a);this.move(t(c.x),t(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)}};xb.prototype={init:function(a,b){var c=b.chart,d=c.events,e=$?\"\":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(b.tooltip.enabled)a.tooltip=new wb(a,b.tooltip);this.setDOMEvents()},normalize:function(a,b){var c,\nd,a=a||O.event;if(!a.target)a.target=a.srcElement;a=Xb(a);d=a.touches?a.touches.item(0):a;if(!b)this.chartPosition=b=Wb(this.chart.container);d.pageX===w?(c=s(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return r(a,{chartX:t(c),chartY:t(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};n(this.chart.axes,function(c){b[c.isXAxis?\"xAxis\":\"yAxis\"].push({axis:c,value:c.toValue(a[c.horiz?\"chartX\":\"chartY\"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?\nb.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f=b.hoverPoint,g=b.hoverSeries,h,i,j=b.chartWidth,k=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!g||!g.noSharedTooltip)){e=[];h=c.length;for(i=0;i<h;i++)if(c[i].visible&&c[i].options.enableMouseTracking!==!1&&!c[i].noSharedTooltip&&c[i].tooltipPoints.length&&(b=c[i].tooltipPoints[k])&&b.series)b._dist=N(k-b.clientX),j=I(j,b._dist),e.push(b);for(h=e.length;h--;)e[h]._dist>\nj&&e.splice(h,1);if(e.length&&e[0].clientX!==this.hoverX)d.refresh(e,a),this.hoverX=e[0].clientX}if(g&&g.tracker){if((b=g.tooltipPoints[k])&&b!==f)b.onMouseOver(a)}else d&&d.followPointer&&!d.isHidden&&(a=d.getAnchor([{}],a),d.updatePosition({plotX:a[0],plotY:a[1]}))},reset:function(a){var b=this.chart,c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,b=e&&e.shared?b.hoverPoints:d;(a=a&&e&&b)&&ja(b)[0].plotX===w&&(a=!1);if(a)e.refresh(b);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&(e.hide(),e.hideCrosshairs());\nthis.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;n(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},pinchTranslateDirection:function(a,b,c,d,e,f,g){var h=this.chart,i=a?\"x\":\"y\",j=a?\"X\":\"Y\",k=\"chart\"+j,l=a?\"width\":\"height\",m=h[\"plot\"+(a?\"Left\":\"Top\")],p,q,o=1,n=h.inverted,s=h.bounds[a?\"h\":\"v\"],\nt=b.length===1,u=b[0][k],r=c[0][k],w=!t&&b[1][k],v=!t&&c[1][k],x,c=function(){!t&&N(u-w)>20&&(o=N(r-v)/N(u-w));q=(m-r)/o+u;p=h[\"plot\"+(a?\"Width\":\"Height\")]/o};c();b=q;b<s.min?(b=s.min,x=!0):b+p>s.max&&(b=s.max-p,x=!0);x?(r-=0.8*(r-g[i][0]),t||(v-=0.8*(v-g[i][1])),c()):g[i]=[r,v];n||(f[i]=q-m,f[l]=p);f=n?1/o:o;e[l]=p;e[i]=b;d[n?a?\"scaleY\":\"scaleX\":\"scale\"+j]=o;d[\"translate\"+j]=f*m+(r-f*u)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=c.tooltip&&c.tooltip.options.followTouchMove,f=a.touches,\ng=f.length,h=b.lastValidTouch,i=b.zoomHor||b.pinchHor,j=b.zoomVert||b.pinchVert,k=i||j,l=b.selectionMarker,m={},p=g===1&&(b.inClass(a.target,\"highcharts-tracker\")&&c.runTrackerClick||c.runChartClick),q={};(k||e)&&!p&&a.preventDefault();Na(f,function(a){return b.normalize(a)});if(a.type===\"touchstart\")n(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],n(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?\"h\":\"v\"],\nd=a.minPixelPadding,e=a.toPixels(a.dataMin),f=a.toPixels(a.dataMax),g=I(e,f),e=s(e,f);b.min=I(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}});else if(d.length){if(!l)b.selectionMarker=l=r({destroy:pa},c.plotBox);i&&b.pinchTranslateDirection(!0,d,f,m,l,q,h);j&&b.pinchTranslateDirection(!1,d,f,m,l,q,h);b.hasPinched=k;b.scaleGroups(m,q);!k&&e&&g===1&&this.runPointActions(b.normalize(a))}},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=\nthis.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,p=this.mouseDownY;d<h?d=h:d>h+j&&(d=h+j);e<i?e=i:e>i+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(p-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,p-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?\n1:k,0).attr({fill:c.selectionMarkerFill||\"rgba(69,114,167,0.25)\",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:N(d),x:(d>0?0:d)+m}));this.selectionMarker&&g&&(d=e-p,this.selectionMarker.attr({height:N(d),y:(d>0?0:d)+p}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.x,g=e.y,h;if(this.hasDragged||\nc)n(b.axes,function(a){if(a.zoomEnabled){var b=a.horiz,c=a.toValue(b?f:g),b=a.toValue(b?f+e.width:g+e.height);!isNaN(c)&&!isNaN(b)&&(d[a.xOrY+\"Axis\"].push({axis:a,min:I(c,b),max:s(c,b)}),h=!0)}}),h&&z(b,\"selection\",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)K(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=\nthis.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){this.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,\"highcharts-tracker\")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart,a=this.normalize(a);a.returnValue=\n!1;b.mouseIsDown===\"mousedown\"&&this.drag(a);(this.inClass(a.target,\"highcharts-tracker\")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=v(a,\"class\"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf(\"highcharts-container\")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;if(b&&!b.options.stickyTracking&&!this.inClass(a.toElement||a.relatedTarget,\"highcharts-tooltip\"))b.onMouseOut()},\nonContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,f=b.inverted,g,h,i,a=this.normalize(a);a.cancelBubble=!0;if(!b.cancelClick)c&&this.inClass(a.target,\"highcharts-tracker\")?(g=this.chartPosition,h=c.plotX,i=c.plotY,r(c,{pageX:g.left+d+(f?b.plotWidth-i:h),pageY:g.top+e+(f?b.plotHeight-h:i)}),z(c.series,\"click\",r(a,{point:c})),b.hoverPoint&&c.firePointEvent(\"click\",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&z(b,\"click\",a))},onContainerTouchStart:function(a){var b=\nthis.chart;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){this.drop(a)},setDOMEvents:function(){var a=this,b=a.chart.container,c;this._events=c=[[b,\"onmousedown\",\"onContainerMouseDown\"],[b,\"onmousemove\",\"onContainerMouseMove\"],[b,\"onclick\",\n\"onContainerClick\"],[b,\"mouseleave\",\"onContainerMouseLeave\"],[y,\"mousemove\",\"onDocumentMouseMove\"],[y,\"mouseup\",\"onDocumentMouseUp\"]];ib&&c.push([b,\"ontouchstart\",\"onContainerTouchStart\"],[b,\"ontouchmove\",\"onContainerTouchMove\"],[y,\"touchend\",\"onDocumentTouchEnd\"]);n(c,function(b){a[\"_\"+b[2]]=function(c){a[b[2]](c)};b[1].indexOf(\"on\")===0?b[0][b[1]]=a[\"_\"+b[2]]:J(b[0],b[1],a[\"_\"+b[2]])})},destroy:function(){var a=this;n(a._events,function(b){b[1].indexOf(\"on\")===0?b[0][b[1]]=null:aa(b[0],b[1],a[\"_\"+\nb[2]])});delete a._events;clearInterval(a.tooltipTimeout)}};eb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=o(b.padding,8),f=b.itemMarginTop||0;this.options=b;if(b.enabled)c.baseline=C(d.fontSize)+3+f,c.itemStyle=d,c.itemHiddenStyle=x(d,b.itemHiddenStyle),c.itemMarginTop=f,c.padding=e,c.initialItemX=e,c.initialItemY=e-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.lastLineHeight=0,c.render(),J(c.chart,\"endResize\",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,\nd=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.color:g,g=a.options&&a.options.marker,i={stroke:h,fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in g=a.convertAttribs(g),g)d=g[j],d!==w&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=\ne,f.y=d},destroyItem:function(a){var b=a.checkbox;n([\"legendItem\",\"legendLine\",\"legendSymbol\",\"legendGroup\"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ta(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY,n(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,K(f,{left:b.translateX+e.legendItemWidth+f.x-\n20+\"px\",top:g+\"px\",display:g>c-6&&g<c+d-6?\"\":S}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,a-3,a-4,null,null,null,null,null,\"legend-title\").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},renderItem:function(a){var B;var b=this,c=b.chart,d=c.renderer,e=b.options,f=e.layout===\"horizontal\",\ng=e.symbolWidth,h=e.symbolPadding,i=b.itemStyle,j=b.itemHiddenStyle,k=b.padding,l=f?o(e.itemDistance,8):0,m=!e.rtl,p=e.width,q=e.itemMarginBottom||0,n=b.itemMarginTop,A=b.initialItemX,t=a.legendItem,u=a.series||a,r=u.options,w=r.showCheckbox,v=e.useHTML;if(!t&&(a.legendGroup=d.g(\"legend-item\").attr({zIndex:1}).add(b.scrollGroup),u.drawLegendSymbol(b,a),a.legendItem=t=d.text(e.labelFormat?Ca(e.labelFormat,a):e.labelFormatter.call(a),m?g+h:-h,b.baseline,v).css(x(a.visible?i:j)).attr({align:m?\"left\":\n\"right\",zIndex:2}).add(a.legendGroup),(v?t:a.legendGroup).on(\"mouseover\",function(){a.setState(\"hover\");t.css(b.options.itemHoverStyle)}).on(\"mouseout\",function(){t.css(a.visible?i:j);a.setState()}).on(\"click\",function(b){var c=function(){a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent(\"legendItemClick\",b,c):z(a,\"legendItemClick\",b,c)}),b.colorizeItem(a,a.visible),r&&w))a.checkbox=U(\"input\",{type:\"checkbox\",checked:a.selected,defaultChecked:a.selected},e.itemCheckboxStyle,c.container),\nJ(a.checkbox,\"click\",function(b){z(a,\"checkboxClick\",{checked:b.target.checked},function(){a.select()})});d=t.getBBox();B=a.legendItemWidth=e.itemWidth||g+h+d.width+l+(w?20:0),e=B;b.itemHeight=g=d.height;if(f&&b.itemX-A+e>(p||c.chartWidth-2*k-A))b.itemX=A,b.itemY+=n+b.lastLineHeight+q,b.lastLineHeight=0;b.maxItemWidth=s(b.maxItemWidth,e);b.lastItemY=n+b.itemY+q;b.lastLineHeight=s(g,b.lastLineHeight);a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=n+g+q,b.lastLineHeight=g);b.offsetWidth=\np||s((f?b.itemX-A-l:e)+k,b.offsetWidth)},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g(\"legend\").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=[];n(b.series,function(a){var b=a.options;b.showInLegend&&!u(b.linkedTo)&&(e=e.concat(a.legendItems||\n(b.legendType===\"point\"?a.data:a)))});Kb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;n(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?\"attr\":\"animate\"](i.crisp(null,null,null,g,h)),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,\n\"stroke-width\":l||0,fill:m||S}).add(d).shadow(j.shadow),i.isNew=!0;i[f?\"show\":\"hide\"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,\"spacingBox\");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign===\"top\"?-f:f)-this.padding,g=e.maxHeight,h=this.clipRect,i=e.navigation,j=o(i.animation,!0),k=i.arrowSize||12,l=this.nav;e.layout===\n\"horizontal\"&&(f/=2);g&&(f=I(f,g));if(a>f&&!e.useHTML){this.clipHeight=c=f-20-this.titleHeight;this.pageCount=xa(a/c);this.currentPage=o(this.currentPage,1);this.fullHeight=a;if(!h)h=b.clipRect=d.clipRect(0,0,9999,0),b.contentGroup.clip(h);h.attr({height:c});if(!l)this.nav=l=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol(\"triangle\",0,0,k,k).on(\"click\",function(){b.scroll(-1,j)}).add(l),this.pager=d.text(\"\",15,10).css(i.style).add(l),this.down=d.symbol(\"triangle-down\",0,0,k,k).on(\"click\",\nfunction(){b.scroll(1,j)}).add(l);b.scroll(0);a=f}else if(l)h.attr({height:c.chartHeight}),l.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pageCount,d=this.currentPage+a,e=this.clipHeight,f=this.options.navigation,g=f.activeColor,h=f.inactiveColor,f=this.pager,i=this.padding;d>c&&(d=c);if(d>0)b!==w&&La(b,this.chart),this.nav.attr({translateX:i,translateY:e+7+this.titleHeight,visibility:\"visible\"}),this.up.attr({fill:d===1?h:g}).css({cursor:d===\n1?\"default\":\"pointer\"}),f.attr({text:d+\"/\"+this.pageCount}),this.down.attr({x:18+this.pager.getBBox().width,fill:d===c?h:g}).css({cursor:d===c?\"default\":\"pointer\"}),e=-I(e*(d-1),this.fullHeight-e+i)+1,this.scrollGroup.animate({translateY:e}),f.attr({text:d+\"/\"+c}),this.currentPage=d,this.positionCheckboxes(e)}};/Trident.*?11\\.0/.test(oa)&&mb(eb.prototype,\"positionItem\",function(a,b){var c=this;setTimeout(function(){a.call(c,b)})});yb.prototype={init:function(a,b){var c,d=a.series;a.series=null;c=\nx(M,a);c.series=a.series=d;d=c.chart;this.margin=this.splashArray(\"margin\",d);this.spacing=this.splashArray(\"spacing\",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=Ga.length;Ga.push(f);d.reflow!==!1&&J(f,\"load\",function(){f.initReflow()});if(e)for(g in e)J(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=$?!1:o(d.animation,!0);f.pointCount=0;f.counters=new Jb;f.firstRender()},\ninitSeries:function(a){var b=this.options.chart;(b=W[a.type||b.type||b.defaultSeriesType])||ka(17,!0);b=new b;b.init(this,a);return b},addSeries:function(a,b,c){var d,e=this;a&&(b=o(b,!0),z(e,\"addSeries\",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?\"xAxis\":\"yAxis\",f=this.options;new db(this,x(a,{index:this[e].length,isX:b}));f[e]=ja(f[e]||{});f[e].push(a);o(c,!0)&&this.redraw(d)},isInsidePlot:function(a,b,\nc){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&n(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.isDirtyBox,j=c.length,k=j,l=this.renderer,m=l.isHidden(),p=[];La(a,this);m&&this.cloneRenderTo();for(this.layOutTitles();k--;)if(a=c[k],a.options.stacking&&(g=!0,a.isDirty)){h=!0;\nbreak}if(h)for(k=j;k--;)if(a=c[k],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType===\"point\"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()});this.adjustTickAmounts();this.getMargins();n(b,function(a){a.isDirty&&(i=!0)});n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,p.push(function(){z(a,\"afterSetExtremes\",r(a.eventArgs,\na.getExtremes()));delete a.eventArgs});(i||g)&&a.redraw()})}i&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset&&d.reset(!0);l.draw();z(this,\"redraw\");m&&this.cloneRenderTo(!0);n(p,function(a){a.call()})},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading;if(!c)this.loadingDiv=c=U(Ea,{className:\"highcharts-loading\"},r(d.style,{zIndex:10,display:S}),this.container),this.loadingSpan=U(\"span\",null,d.labelStyle,c);this.loadingSpan.innerHTML=\na||b.lang.loading;if(!this.loadingShown)K(c,{opacity:0,display:\"\",left:this.plotLeft+\"px\",top:this.plotTop+\"px\",width:this.plotWidth+\"px\",height:this.plotHeight+\"px\"}),Bb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&Bb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){K(b,{display:S})}});this.loadingShown=!1},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===\na)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ja(b.xAxis||{}),b=b.yAxis=ja(b.yAxis||{});n(c,function(a,b){a.index=b;a.isX=!0});n(b,function(a,b){a.index=b});c=c.concat(b);n(c,function(b){new db(a,b)});a.adjustTickAmounts()},getSelectedPoints:function(){var a=[];n(this.series,function(b){a=a.concat(ub(b.points||[],\nfunction(a){return a.selected}))});return a},getSelectedSeries:function(){return ub(this.series,function(a){return a.selected})},getStacks:function(){var a=this;n(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});n(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+o(b.options.stack,\"\")})},showResetZoom:function(){var a=this,b=M.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo===\n\"chart\"?null:\"plotBox\";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;z(a,\"selection\",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?n(this.axes,function(a){b=a.zoom()}):n(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?\"zoomX\":\"zoomY\"]||c[h?\"pinchX\":\"pinchY\"])b=\ne.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&T(e))this.resetZoomButton=e.destroy();b&&this.redraw(o(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&n(d,function(a){a.setState()});n(b===\"xy\"?[1,0]:[1],function(b){var d=a[b?\"chartX\":\"chartY\"],h=c[b?\"xAxis\":\"yAxis\"][0],i=c[b?\"mouseDownX\":\"mouseDownY\"],j=(h.pointRange||0)/2,k=h.getExtremes(),l=h.toValue(i-d,!0)+j,i=h.toValue(i+\nc[b?\"plotWidth\":\"plotHeight\"]-d,!0)-j;h.series.length&&l>I(k.dataMin,k.min)&&i<s(k.dataMax,k.max)&&(h.setExtremes(l,i,!1,!1,{trigger:\"pan\"}),e=!0);c[b?\"mouseDownX\":\"mouseDownY\"]=d});e&&c.redraw(!1);K(c.container,{cursor:\"move\"})},setTitle:function(a,b){var f;var c=this,d=c.options,e;e=d.title=x(d.title,a);f=d.subtitle=x(d.subtitle,b),d=f;n([[\"title\",a,e],[\"subtitle\",b,d]],function(a){var b=a[0],d=c[b],e=a[1],a=a[2];d&&e&&(c[b]=d=d.destroy());a&&a.text&&!d&&(c[b]=c.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,\n\"class\":\"highcharts-\"+b,zIndex:a.zIndex||4}).css(a.style).add())});c.layOutTitles()},layOutTitles:function(){var a=0,b=this.title,c=this.subtitle,d=this.options,e=d.title,d=d.subtitle,f=this.spacingBox.width-44;if(b&&(b.css({width:(e.width||f)+\"px\"}).align(r({y:15},e),!1,\"spacingBox\"),!e.floating&&!e.verticalAlign))a=b.getBBox().height,a>=18&&a<=25&&(a=15);c&&(c.css({width:(d.width||f)+\"px\"}).align(r({y:a+e.margin},d),!1,\"spacingBox\"),!d.floating&&!d.verticalAlign&&(a=xa(a+c.getBBox().height)));this.titleOffset=\na},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=jb(b,\"width\");this.containerHeight=jb(b,\"height\");this.chartWidth=s(0,a.width||this.containerWidth||600);this.chartHeight=s(0,o(a.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ta(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=\nb=this.renderTo.cloneNode(0),K(b,{position:\"absolute\",top:\"-9999px\",display:\"block\"}),y.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e=\"highcharts-\"+zb++;if(ea(a))this.renderTo=a=y.getElementById(a);a||ka(13,!0);c=C(v(a,\"data-highcharts-chart\"));!isNaN(c)&&Ga[c]&&Ga[c].destroy();v(a,\"data-highcharts-chart\",this.index);a.innerHTML=\"\";a.offsetWidth||this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;\nthis.container=a=U(Ea,{className:\"highcharts-container\"+(b.className?\" \"+b.className:\"\"),id:e},r({position:\"relative\",overflow:\"hidden\",width:c+\"px\",height:d+\"px\",textAlign:\"left\",lineHeight:\"normal\",zIndex:0,\"-webkit-tap-highlight-color\":\"rgba(0,0,0,0)\"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new Ha(a,c,d,!0):new Va(a,c,d);$&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend,\nf=o(e.margin,10),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!u(d[0]))this.plotTop=s(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i===\"right\"){if(!u(d[1]))this.marginRight=s(this.marginRight,c.legendWidth-g+f+a[1])}else if(i===\"left\"){if(!u(d[3]))this.plotLeft=s(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j===\"top\"){if(!u(d[0]))this.plotTop=s(this.plotTop,c.legendHeight+h+f+a[0])}else if(j===\"bottom\"&&!u(d[2]))this.marginBottom=\ns(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&n(this.axes,function(a){a.getOffset()});u(d[3])||(this.plotLeft+=b[3]);u(d[0])||(this.plotTop+=b[0]);u(d[2])||(this.marginBottom+=b[2]);u(d[1])||(this.marginRight+=b[1]);this.setChartSize()},initReflow:function(){function a(a){var g=c.width||jb(d,\"width\"),h=c.height||jb(d,\"height\"),a=a?a.target:O;if(!b.hasUserSize&&\ng&&h&&(a===O||a===y)){if(g!==b.containerWidth||h!==b.containerHeight)clearTimeout(e),b.reflowTimeout=e=setTimeout(function(){if(b.container)b.setSize(g,h,!1),b.hasUserSize=null},100);b.containerWidth=g;b.containerHeight=h}}var b=this,c=b.options.chart,d=b.renderTo,e;b.reflow=a;J(O,\"resize\",a);J(b,\"destroy\",function(){aa(O,\"resize\",a)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&z(d,\"endResize\",null,function(){d.isResizing-=1})};La(c,d);d.oldChartHeight=d.chartHeight;\nd.oldChartWidth=d.chartWidth;if(u(a))d.chartWidth=e=s(0,t(a)),d.hasUserSize=!!e;if(u(b))d.chartHeight=f=s(0,t(b));K(d.container,{width:e+\"px\",height:f+\"px\"});d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()});n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();d.redraw(c);d.oldChartHeight=null;z(d,\"resize\");Fa===!1?g():setTimeout(g,Fa&&Fa.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,\nd=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=t(this.plotLeft);this.plotTop=j=t(this.plotTop);this.plotWidth=k=s(0,t(d-i-this.marginRight));this.plotHeight=l=s(0,t(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*P(this.plotBorderWidth/2);\nb=xa(s(d,h[3])/2);c=xa(s(d,h[0])/2);this.clipBox={x:b,y:c,width:P(this.plotSizeX-s(d,h[1])/2-b),height:P(this.plotSizeY-s(d,h[2])/2-c)};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=o(b[0],a[0]);this.marginRight=o(b[1],a[1]);this.marginBottom=o(b[2],a[2]);this.plotLeft=o(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,\nd=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,p,q=this.plotLeft,o=this.plotTop,n=this.plotWidth,s=this.plotHeight,t=this.plotBox,u=this.clipRect,r=this.clipBox;p=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null,null,null,c-p,d-p));else{e={fill:j||S};if(i)e.stroke=a.borderColor,e[\"stroke-width\"]=i;this.chartBackground=b.rect(p/2,p/\n2,c-p,d-p,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(t):this.plotBackground=b.rect(q,o,n,s,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(t):this.plotBGImage=b.image(l,q,o,n,s).add();u?u.animate({width:r.width,height:r.height}):this.clipRect=b.clipRect(r);if(m)g?g.animate(g.crisp(null,q,o,n,s)):this.plotBorder=b.rect(q,o,n,s,0,-m).attr({stroke:a.plotBorderColor,\"stroke-width\":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,\nc,d=a.options.series,e,f;n([\"inverted\",\"angular\",\"polar\"],function(g){c=W[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=W[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var d=b.options.linkedTo;if(ea(d)&&(d=d===\":previous\"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},render:function(){var a=this,b=a.axes,c=a.renderer,d=a.options,\ne=d.labels,f=d.credits,g;a.setTitle();a.legend=new eb(a,d.legend);a.getStacks();n(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;n(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox();a.hasCartesianSeries&&n(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g(\"series-group\").attr({zIndex:3}).add();n(a.series,function(a){a.translate();a.setTooltipPoints();a.render()});e.items&&n(e.items,function(b){var d=r(e.style,b.style),\nf=C(d.left)+a.plotLeft,g=C(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,g).attr({zIndex:2}).css(d).add()});if(f.enabled&&!a.credits)g=f.href,a.credits=c.text(f.text,0,0).on(\"click\",function(){if(g)location.href=g}).attr({align:f.position.align,zIndex:8}).css(f.style).add().align(f.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;z(a,\"destroy\");Ga[a.index]=w;a.renderTo.removeAttribute(\"data-highcharts-chart\");aa(a);for(e=\nb.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n(\"title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer\".split(\",\"),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML=\"\",aa(d),f&&Ta(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!Z&&O==O.top&&y.readyState!==\"complete\"||$&&!O.canvg?($?Tb.push(function(){a.firstRender()},\na.options.global.canvasToolsURL):y.attachEvent(\"onreadystatechange\",function(){y.detachEvent(\"onreadystatechange\",a.firstRender);y.readyState===\"complete\"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender())a.getContainer(),z(a,\"init\"),a.resetMargins(),a.setChartSize(),a.propFromSeries(),a.getAxes(),n(b.series||[],function(b){a.initSeries(b)}),a.linkSeries(),z(a,\"beforeRender\"),a.pointer=new xb(a,b),a.render(),a.renderer.draw(),c&&c.apply(a,\n[a]),n(a.callbacks,function(b){b.apply(a,[a])}),a.cloneRenderTo(!0),z(a,\"load\")},splashArray:function(a,b){var c=b[a],c=T(c)?c:[c,c,c,c];return[o(b[a+\"Top\"],c[0]),o(b[a+\"Right\"],c[1]),o(b[a+\"Bottom\"],c[2]),o(b[a+\"Left\"],c[3])]}};yb.prototype.callbacks=[];var Pa=function(){};Pa.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=\n0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.pointValKey,a=Pa.prototype.optionsToObject.call(this,a);r(this,a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===w&&c)this.x=b===w?c.autoIncrement():b;return this},optionsToObject:function(a){var b,c=this.series,d=c.pointArrayMap||[\"y\"],e=d.length,f=0,g=0;if(typeof a===\"number\"||a===null)b={y:a};else if(Ia(a)){b={};if(a.length>e){c=typeof a[0];if(c===\"string\")b.name=a[0];else if(c===\n\"number\")b.x=a[0];f++}for(;g<e;)b[d[g++]]=a[f++]}else if(typeof a===\"object\"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ga(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)aa(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=\n\"graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup\".split(\",\"),b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(a,b){var c=this,d=c.series,e=d.chart,a=o(a,!c.selected);c.firePointEvent(a?\"select\":\"unselect\",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[qa(c,d.data)]=\nc.options;c.setState(a&&\"select\");b||n(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[qa(a,d.data)]=a.options,a.setState(\"\"),a.firePointEvent(\"unselect\")})})},onMouseOver:function(a){var b=this.series,c=b.chart,d=c.tooltip,e=c.hoverPoint;if(e&&e!==this)e.onMouseOut();this.firePointEvent(\"mouseOver\");d&&(!d.shared||b.noSharedTooltip)&&d.refresh(this,a);this.setState(\"hover\");c.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;\nif(!b||qa(this,b)===-1)this.firePointEvent(\"mouseOut\"),this.setState(),a.hoverPoint=null},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=o(c.valueDecimals,\"\"),e=c.valuePrefix||\"\",f=c.valueSuffix||\"\";n(b.pointArrayMap||[\"y\"],function(b){b=\"{point.\"+b;if(e||f)a=a.replace(b+\"}\",e+b+\"}\"+f);a=a.replace(b+\"}\",b+\":,.\"+d+\"f}\")});return Ca(a,{point:this,series:this.series})},update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=o(b,!0);d.firePointEvent(\"update\",\n{options:a},function(){d.applyOptions(a);if(T(a)&&(e.getAttribs(),f))a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||\"\"]);g=qa(d,h);e.xData[g]=d.x;e.yData[g]=e.toYData?e.toYData(d):d.y;e.zData[g]=d.z;j.data[g]=d.options;e.isDirty=e.isDirtyData=!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType===\"point\"&&i.legend.destroyItem(d);b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,f=d.chart,g,h=d.data;La(b,f);a=o(a,!0);c.firePointEvent(\"remove\",\nnull,function(){g=qa(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.xData.splice(g,1);d.yData.splice(g,1);d.zData.splice(g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a===\"click\"&&e.allowPointSelect&&(c=function(a){d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});z(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a=\nx(this.series.options.point,this.options).events,b;this.events=a;for(b in a)J(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a){var b=this.plotX,c=this.plotY,d=this.series,e=d.options.states,f=Y[d.type].marker&&d.options.marker,g=f&&!f.enabled,h=f&&f.states[a],i=h&&h.enabled===!1,j=d.stateMarkerGraphic,k=this.marker||{},l=d.chart,m=this.pointAttr,a=a||\"\";if(!(a===this.state||this.selected&&a!==\"select\"||e[a]&&e[a].enabled===!1||a&&(i||g&&!h.enabled))){if(this.graphic)e=f&&this.graphic.symbolName&&\nm[a].r,this.graphic.attr(x(m[a],e?{x:b-e,y:c-e,width:2*e,height:2*e}:{}));else{if(a&&h)e=h.radius,k=k.symbol||d.symbol,j&&j.currentSymbol!==k&&(j=j.destroy()),j?j.attr({x:b-e,y:c-e}):(d.stateMarkerGraphic=j=l.renderer.symbol(k,b-e,c-e,2*e,2*e).attr(m[a]).add(d.markerGroup),j.currentSymbol=k);if(j)j[a&&l.isInsidePlot(b,c)?\"show\":\"hide\"]()}this.state=a}}};var Q=function(){};Q.prototype={isCartesian:!0,type:\"line\",pointClass:Pa,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:\"lineColor\",\"stroke-width\":\"lineWidth\",\nfill:\"fillColor\",r:\"radius\"},colorCounter:0,init:function(a,b){var c,d,e=a.series;this.chart=a;this.options=b=this.setOptions(b);this.linkedSeries=[];this.bindAxes();r(this,{name:b.name,state:\"\",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if($)b.animation=!1;d=b.events;for(c in d)J(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;this.getColor();this.getSymbol();this.setData(b.data,!1);if(this.isCartesian)a.hasCartesianSeries=\n!0;e.push(this);this._i=e.length-1;Kb(e,function(a,b){return o(a.options.index,a._i)-o(b.options.index,a._i)});n(e,function(a,b){a.index=b;a.name=a.name||\"Series \"+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;a.isCartesian&&n([\"xAxis\",\"yAxis\"],function(e){n(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==w&&b[e]===d.id||b[e]===w&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});a[e]||ka(18,!0)})},autoIncrement:function(){var a=this.options,b=this.xIncrement,b=o(b,a.pointStart,\n0);this.pointInterval=o(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else n(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=c[this.type];this.userOptions=a;a=x(d,c.series,\na);this.tooltipOptions=x(b.tooltip,a.tooltip);d.marker===null&&delete a.marker;return a},getColor:function(){var a=this.options,b=this.userOptions,c=this.chart.options.colors,d=this.chart.counters,e;e=a.color||Y[this.type].color;if(!e&&!a.colorByPoint)u(b._colorIndex)?a=b._colorIndex:(b._colorIndex=d.color,a=d.color++),e=c[a];this.color=e;d.wrapColor(c.length)},getSymbol:function(){var a=this.userOptions,b=this.options.marker,c=this.chart,d=c.options.symbols,c=c.counters;this.symbol=b.symbol;if(!this.symbol)u(a._symbolIndex)?\na=a._symbolIndex:(a._symbolIndex=c.symbol,a=c.symbol++),this.symbol=d[a];if(/^url/.test(this.symbol))b.radius=0;c.wrapSymbol(d.length)},drawLegendSymbol:function(a){var b=this.options,c=b.marker,d=a.options,e;e=d.symbolWidth;var f=this.chart.renderer,g=this.legendGroup,a=a.baseline-t(f.fontMetrics(d.itemStyle.fontSize).b*0.3);if(b.lineWidth){d={\"stroke-width\":b.lineWidth};if(b.dashStyle)d.dashstyle=b.dashStyle;this.legendLine=f.path([\"M\",0,a,\"L\",e,a]).attr(d).add(g)}if(c&&c.enabled)b=c.radius,this.legendSymbol=\ne=f.symbol(this.symbol,e/2-b,a-b,2*b,2*b).add(g),e.isMarker=!0},addPoint:function(a,b,c,d){var e=this.options,f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xData,k=this.yData,l=this.zData,m=this.names,p=g&&g.shift||0,q=e.data,s;La(d,i);c&&n([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=p+1});if(h)h.isArea=!0;b=o(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=j.length;if(this.requireSorting&&g<j[h-1])for(s=!0;h&&j[h-1]>g;)h--;j.splice(h,0,g);\nk.splice(h,0,this.toYData?this.toYData(d):d.y);l.splice(h,0,d.z);if(m)m[g]=d.name;q.splice(h,0,a);s&&(this.data.splice(h,0,null),this.processData());e.legendType===\"point\"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),j.shift(),k.shift(),l.shift(),q.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},setData:function(a,b){var c=this.points,d=this.options,e=this.chart,f=null,g=this.xAxis,h=g&&g.categories&&!g.categories.length?[]:null,i;this.xIncrement=\nnull;this.pointRange=g&&g.categories?1:d.pointRange;this.colorCounter=0;var j=[],k=[],l=[],m=a?a.length:[];i=o(d.turboThreshold,1E3);var p=this.pointArrayMap,p=p&&p.length,q=!!this.toYData;if(i&&m>i){for(i=0;f===null&&i<m;)f=a[i],i++;if(sa(f)){f=o(d.pointStart,0);d=o(d.pointInterval,1);for(i=0;i<m;i++)j[i]=f,k[i]=a[i],f+=d;this.xIncrement=f}else if(Ia(f))if(p)for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d.slice(1,p+1);else for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d[1];else ka(12)}else for(i=0;i<m;i++)if(a[i]!==\nw&&(d={series:this},this.pointClass.prototype.applyOptions.apply(d,[a[i]]),j[i]=d.x,k[i]=q?this.toYData(d):d.y,l[i]=d.z,h&&d.name))h[d.x]=d.name;ea(k[0])&&ka(14,!0);this.data=[];this.options.data=a;this.xData=j;this.yData=k;this.zData=l;this.names=h;for(i=c&&c.length||0;i--;)c[i]&&c[i].destroy&&c[i].destroy();if(g)g.minRange=g.userMinRange;this.isDirty=this.isDirtyData=e.isDirtyBox=!0;o(b,!0)&&e.redraw(!1)},remove:function(a,b){var c=this,d=c.chart,a=o(a,!0);if(!c.isRemoving)c.isRemoving=!0,z(c,\"remove\",\nnull,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i=this.options,j=i.cropThreshold,k=this.isCartesian;if(k&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(k&&this.sorted&&(!j||d>j||this.forceCrop))if(a=h.min,h=h.max,b[d-1]<a||b[0]>h)b=[],c=[];else if(b[0]<a||b[d-1]>h)e=this.cropData(this.xData,this.yData,a,h),b=e.xData,c=e.yData,e=e.start,\nf=!0;for(h=b.length-1;h>=0;h--)d=b[h]-b[h-1],d>0&&(g===w||d<g)?g=d:d<0&&this.requireSorting&&ka(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;if(i.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=o(this.cropShoulder,1),i;for(i=0;i<e;i++)if(a[i]>=c){f=s(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,\nb=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,j?l[m]=(new f).init(this,[d[m]].concat(ja(e[m]))):(b[i]?k=b[i]:a[i]!==w&&(b[i]=k=(new f).init(this,a[i],d[m])),l[m]=k);if(b&&(g!==(c=b.length)||j))for(m=0;m<c;m++)if(m===h&&!j&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=w;this.data=b;this.points=l},setStackedPoints:function(){if(this.options.stacking&&\n!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.stack,e=e.stacking,h=this.stackKey,i=\"-\"+h,j=this.negStacks,k=this.yAxis,l=k.stacks,m=k.oldStacks,p,q,o,n,t;for(o=0;o<d;o++){n=a[o];t=b[o];q=(p=j&&t<f)?i:h;l[q]||(l[q]={});if(!l[q][n])m[q]&&m[q][n]?(l[q][n]=m[q][n],l[q][n].total=null):l[q][n]=new Mb(k,k.options.stackLabels,p,n,g,e);q=l[q][n];q.points[this.index]=[q.cum||0];e===\"percent\"?\n(p=p?h:i,j&&l[p]&&l[p][n]?(p=l[p][n],q.total=p.total=s(p.total,q.total)+N(t)||0):q.total+=N(t)||0):q.total+=t||0;q.cum=(q.cum||0)+(t||0);q.points[this.index].push(q.cum);c[o]=q.cum}if(e===\"percent\")k.usePercentage=!0;this.stackedYData=c;k.oldStacks={}}},setPercentStacks:function(){var a=this,b=a.stackKey,c=a.yAxis.stacks;n([b,\"-\"+b],function(b){var d;for(var e=a.xData.length,f,g;e--;)if(f=a.xData[e],d=(g=c[b]&&c[b][f])&&g.points[a.index],f=d)g=g.total?100/g.total:0,f[0]=ia(f[0]*g),f[1]=ia(f[1]*g),\na.stackedYData[e]=f[1]})},getExtremes:function(){var a=this.yAxis,b=this.processedXData,c=this.stackedYData||this.processedYData,d=c.length,e=[],f=0,g=this.xAxis.getExtremes(),h=g.min,g=g.max,i,j,k,l;for(l=0;l<d;l++)if(j=b[l],k=c[l],i=k!==null&&k!==w&&(!a.isLog||k.length||k>0),j=this.getExtremesFromAll||this.cropped||(b[l+1]||j)>=h&&(b[l-1]||j)<=g,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=o(void 0,Ja(e));this.dataMax=o(void 0,va(e))},translate:function(){this.processedXData||\nthis.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i===\"between\"||sa(i),k=a.threshold,a=0;a<g;a++){var l=f[a],m=l.x,p=l.y,q=l.low,n=e.stacks[(this.negStacks&&p<k?\"-\":\"\")+this.stackKey];if(e.isLog&&p<=0)l.y=p=null;l.plotX=c.translate(m,0,0,0,1,i,this.type===\"flags\");if(b&&this.visible&&n&&n[m])n=n[m],p=n.points[this.index],q=p[0],p=p[1],q===0&&(q=o(k,e.min)),e.isLog&&\nq<=0&&(q=null),l.percentage=b===\"percent\"&&p,l.total=l.stackTotal=n.total,l.stackY=p,n.setOffset(this.pointXOffset||0,this.barW||0);l.yBottom=u(q)?e.translate(q,0,1,0,1):null;h&&(p=this.modifyValue(p,l));l.plotY=typeof p===\"number\"&&p!==Infinity?e.translate(p,0,1,0,1):w;l.clientX=j?c.translate(m,0,0,0,1):l.plotX;l.negative=l.y<(k||0);l.category=d&&d[l.x]!==w?d[l.x]:l.x}this.getSegments()},setTooltipPoints:function(a){var b=[],c,d,e=this.xAxis,f=e&&e.getExtremes(),g=e?e.tooltipLen||e.len:this.chart.plotSizeX,\nh,i,j=[];if(this.options.enableMouseTracking!==!1){if(a)this.tooltipPoints=null;n(this.segments||this.points,function(a){b=b.concat(a)});e&&e.reversed&&(b=b.reverse());this.orderTooltipPoints&&this.orderTooltipPoints(b);a=b.length;for(i=0;i<a;i++)if(e=b[i],c=e.x,c>=f.min&&c<=f.max){h=b[i+1];c=d===w?0:d+1;for(d=b[i+1]?I(s(0,P((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.xDateFormat,\nd=b.dateTimeLabelFormats,e=this.xAxis,f=e&&e.options.type===\"datetime\",b=b.headerFormat,e=e&&e.closestPointRange,g;if(f&&!c)if(e)for(g in D){if(D[g]>=e){c=d[g];break}}else c=d.day;f&&c&&sa(a.key)&&(b=b.replace(\"{point.key}\",\"{point.key:\"+c+\"}\"));return Ca(b,{point:a,series:this})},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&z(this,\"mouseOver\");this.setState(\"hover\");a.hoverSeries=this},onMouseOut:function(){var a=this.options,\nb=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&z(this,\"mouseOut\");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!T(e))e=Y[b.type].animation;h=\"_sharedClip\"+e.duration+e.easing;if(a)a=c[h],e=c[h+\"m\"],a||(c[h]=a=d.clipRect(r(f,{width:0})),c[h+\"m\"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g?\nc.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+\"m\"].animate({width:c.plotSizeX+99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()},e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+\"m\"]=a[b+\"m\"].destroy())},100)},drawPoints:function(){var a,\nb=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m,p=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=P(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled===w||i.enabled,m=c.isInsidePlot(t(d),e,c.inverted),a&&e!==w&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?\"select\":\"\"],h=a.r,i=o(i.symbol,this.symbol),j=i.indexOf(\"url\")===0,k)k.attr({visibility:m?Z?\"inherit\":\"visible\":\"hidden\"}).animate(r({x:d-h,y:e-h},k.symbolName?{width:2*\nh,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(p)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=o(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=Y[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h={stroke:g,fill:g},i=a.points||[],j=[],k,l=a.pointAttrToOptions,m=b.negativeColor,p=c.lineColor,q;\nb.marker?(e.radius=e.radius||c.radius+2,e.lineWidth=e.lineWidth||c.lineWidth+1):e.color=e.color||ra(e.color||g).brighten(e.brightness).get();j[\"\"]=a.convertAttribs(c,h);n([\"hover\",\"select\"],function(b){j[b]=a.convertAttribs(d[b],j[\"\"])});a.pointAttr=j;for(g=i.length;g--;){h=i[g];if((c=h.options&&h.options.marker||h.options)&&c.enabled===!1)c.radius=0;if(h.negative&&m)h.color=h.fillColor=m;f=b.colorByPoint||h.color;if(h.options)for(q in l)u(c[l[q]])&&(f=!0);if(f){c=c||{};k=[];d=c.states||{};f=d.hover=\nd.hover||{};if(!b.marker)f.color=ra(f.color||h.color).brighten(f.brightness||e.brightness).get();k[\"\"]=a.convertAttribs(r({color:h.color,fillColor:h.color,lineColor:p===null?h.color:w},c),j[\"\"]);k.hover=a.convertAttribs(d.hover,j.hover,k[\"\"]);k.select=a.convertAttribs(d.select,j.select,k[\"\"])}else k=j;h.pointAttr=k}},update:function(a,b){var c=this.chart,d=this.type,e=W[d].prototype,f,a=x(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);\nfor(f in e)e.hasOwnProperty(f)&&(this[f]=w);r(this,W[a.type||d].prototype);this.init(c,a);o(b,!0)&&c.redraw(!1)},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\\/533/.test(oa),d,e,f=a.data||[],g,h,i;z(a,\"destroy\");aa(a);n([\"xAxis\",\"yAxis\"],function(b){if(i=a[b])ga(i.series,a),i.isDirty=i.forceRedraw=!0,i.stacks={}});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);n(\"area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip\".split(\",\"),\nfunction(b){a[b]&&(d=c&&b===\"group\"?\"hide\":\"destroy\",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;ga(b.series,a);for(h in a)delete a[h]},drawDataLabels:function(){var a=this,b=a.options.dataLabels,c=a.points,d,e,f,g;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),g=a.plotGroup(\"dataLabelsGroup\",\"data-labels\",a.visible?\"visible\":\"hidden\",b.zIndex||6),e=b,n(c,function(c){var i,j=c.dataLabel,k,l,m=c.connector,p=!0;d=c.options&&c.options.dataLabels;i=o(d&&d.enabled,e.enabled);\nif(j&&!i)c.dataLabel=j.destroy();else if(i){b=x(e,d);i=b.rotation;k=c.getLabelConfig();f=b.format?Ca(b.format,k):b.formatter.call(k,b);b.style.color=o(b.color,b.style.color,a.color,\"black\");if(j)if(u(f))j.attr({text:f}),p=!1;else{if(c.dataLabel=j=j.destroy(),m)c.connector=m.destroy()}else if(u(f)){j={fill:b.backgroundColor,stroke:b.borderColor,\"stroke-width\":b.borderWidth,r:b.borderRadius||0,rotation:i,padding:b.padding,zIndex:1};for(l in j)j[l]===w&&delete j[l];j=c.dataLabel=a.chart.renderer[i?\"text\":\n\"label\"](f,0,-999,null,null,null,b.useHTML).attr(j).css(b.style).add(g).shadow(b.shadow)}j&&a.alignDataLabel(c,j,b,null,p)}})},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=o(a.plotX,-999),i=o(a.plotY,-999),j=b.getBBox();if(a=this.visible&&f.isInsidePlot(a.plotX,a.plotY,g))d=r({x:g?f.plotWidth-i:h,y:t(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?(g={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?\"attr\":\"animate\"](g)):(b.align(c,\nnull,d),g=b.alignAttr,o(c.overflow,\"justify\")===\"justify\"?this.justifyDataLabel(b,c,g,j,d,e):o(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)));a||b.attr({y:-999})},justifyDataLabel:function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h===\"right\"?b.align=\"left\":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h===\"left\"?b.align=\"right\":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i===\"bottom\"?b.verticalAlign=\"top\":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i===\n\"top\"?b.verticalAlign=\"bottom\":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;n(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?\"L\":\"M\"),d&&f&&(i=a[f-1],d===\"right\"?c.push(i.plotX,h):d===\"center\"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];n(a.segments,function(e){c=\na.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[[\"graph\",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=this.getGraphPath(),g=b.negativeColor;g&&c.push([\"graphNeg\",g]);n(c,function(c,g){var j=c[0],k=a[j];if(k)Wa(k),k.animate({d:f});else if(d&&f.length)k={stroke:c[1],\"stroke-width\":d,zIndex:1},e?k.dashstyle=e:k[\"stroke-linecap\"]=k[\"stroke-linejoin\"]=\"round\",a[j]=a.chart.renderer.path(f).attr(k).add(a.group).shadow(!g&&\nb.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=s(e,j),l=this.yAxis;if(d&&(f||g)){d=t(l.toPixels(a.threshold||0,!0));a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});l.reversed?\n(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n([\"group\",\"markerGroup\"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)J(c,\"resize\",a),J(b,\"destroy\",function(){aa(c,\"resize\",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],\ng=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?\"attr\":\"animate\"](this.getPlotBox());return f},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this.chart,b,c=this.options,d=c.animation&&!!this.animate&&a.renderer.isSVG,e=this.visible?\"visible\":\"hidden\",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup(\"group\",\n\"series\",e,f,h);this.markerGroup=this.plotGroup(\"markerGroup\",\"markers\",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=this.isCartesian?a.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels();this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&&!g&&b.clip(a.clipRect);d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a=\nthis.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:o(d&&d.left,a.plotLeft),translateY:o(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints(!0);this.render();b&&z(this,\"updatedData\")},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||\"\";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+1),c&&!c.dashstyle&&\n(a={\"stroke-width\":b},c.attr(a),d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===w?!h:a)?\"show\":\"hide\";n([\"group\",\"dataLabelsGroup\",\"markerGroup\",\"tracker\"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});n(c.linkedSeries,function(b){b.setVisible(a,\n!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();z(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===w?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;z(this,a?\"select\":\"unselect\")},drawTracker:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,p=function(){if(f.hoverSeries!==\na)a.onMouseOver()};if(e&&!c)for(m=e+1;m--;)d[m]===\"M\"&&d.splice(m+1,0,d[m+1]-i,d[m+2],\"L\"),(m&&d[m]===\"M\"||m===e)&&d.splice(m,0,\"L\",d[m-2]+i,d[m-1]);for(m=0;m<k.length;m++)e=k[m],d.push(\"M\",e.plotX-i,e.plotY,\"L\",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({\"stroke-linejoin\":\"round\",visibility:a.visible?\"visible\":\"hidden\",stroke:Qb,fill:c?Qb:S,\"stroke-width\":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),n([a.tracker,a.markerGroup],function(a){a.addClass(\"highcharts-tracker\").on(\"mouseover\",\np).on(\"mouseout\",function(a){g.onTrackerMouseOut(a)}).css(l);if(ib)a.on(\"touchstart\",p)}))}};G=ha(Q);W.line=G;Y.area=x(X,{threshold:0});G=ha(Q,{type:\"area\",getSegments:function(){var a=[],b=[],c=[],d=this.xAxis,e=this.yAxis,f=e.stacks[this.stackKey],g={},h,i,j=this.points,k=this.options.connectNulls,l,m,p;if(this.options.stacking&&!this.cropped){for(m=0;m<j.length;m++)g[j[m].x]=j[m];for(p in f)c.push(+p);c.sort(function(a,b){return a-b});n(c,function(a){if(!k||g[a]&&g[a].y!==null)g[a]?b.push(g[a]):\n(h=d.translate(a),l=f[a].percent?f[a].total?f[a].cum*100/f[a].total:0:f[a].cum,i=e.toPixels(l,!0),b.push({y:null,plotX:h,clientX:h,plotY:i,yBottom:i,onMouseOver:pa}))});b.length&&a.push(b)}else Q.prototype.getSegments.call(this),a=this.segments;this.segments=a},getSegmentPath:function(a){var b=Q.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),g;d===3&&c.push(\"L\",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-\n1;d>=0;d--)g=o(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push(\"L\",b[b.length-1].plotX,c,\"L\",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];Q.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=c.negativeColor,e=c.negativeFillColor,f=[[\"area\",this.color,c.fillColor]];(d||e)&&f.push([\"areaNeg\",d,e]);n(f,function(d){var e=d[0],\nf=a[e];f?f.animate({d:b}):a[e]=a.chart.renderer.path(b).attr({fill:o(d[2],ra(d[1]).setOpacity(o(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:function(a,b){b.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,a.options.symbolWidth,12,2).attr({zIndex:3}).add(b.legendGroup)}});W.area=G;Y.spline=x(X);F=ha(Q,{type:\"spline\",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,l;h=(1.5*d+f.plotX)/2.5;i=(1.5*\ne+a)/2.5;j=(1.5*d+j)/2.5;k=(1.5*e+g)/2.5;l=(k-i)*(j-d)/(j-h)+e-k;i+=l;k+=l;i>a&&i>e?(i=s(a,e),k=2*e-i):i<a&&i<e&&(i=I(a,e),k=2*e-i);k>g&&k>e?(k=s(g,e),i=2*e-k):k<g&&k<e&&(k=I(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=[\"C\",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=[\"M\",d,e];return b}});W.spline=F;Y.areaspline=x(Y.area);ma=G.prototype;F=ha(F,{type:\"areaspline\",closedStacks:!0,getSegmentPath:ma.getSegmentPath,closeSegment:ma.closeSegment,drawGraph:ma.drawGraph,\ndrawLegendSymbol:ma.drawLegendSymbol});W.areaspline=F;Y.column=x(X,{borderColor:\"#FFFFFF\",borderWidth:1,borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1},select:{color:\"#C0C0C0\",borderColor:\"#000000\",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,threshold:0});F=ha(Q,{type:\"column\",pointAttrToOptions:{stroke:\"borderColor\",\"stroke-width\":\"borderWidth\",fill:\"color\",\nr:\"borderRadius\"},cropShoulder:0,trackerGroups:[\"group\",\"dataLabelsGroup\"],negStacks:!0,init:function(){Q.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:n(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]===\nw&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var c=I(N(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||1),c.len),j=c*b.groupPadding,k=(c-2*j)/i,l=b.pointWidth,b=u(l)?(k-l)/2:k*b.pointPadding,l=o(l,k-2*b);return a.columnMetrics={width:l,offset:b+(j+((e?i-(a.columnIndex||0):a.columnIndex)||0)*k-c/2)*(e?-1:1)}},translate:function(){var a=this.chart,b=this.options,c=b.borderWidth,d=this.yAxis,e=this.translatedThreshold=d.getThreshold(b.threshold),f=o(b.minPointLength,\n5),b=this.getColumnMetrics(),g=b.width,h=this.barW=xa(s(g,1+2*c)),i=this.pointXOffset=b.offset,j=-(c%2?0.5:0),k=c%2?0.5:1;a.renderer.isVML&&a.inverted&&(k+=1);Q.prototype.translate.apply(this);n(this.points,function(a){var b=o(a.yBottom,e),c=I(s(-999-b,a.plotY),d.len+999+b),n=a.plotX+i,u=h,r=I(c,b),w,c=s(c,b)-r;N(c)<f&&f&&(c=f,r=t(N(r-e)>f?b-f:e-(d.translate(a.y,0,1,0,1)<=e?f:0)));a.barX=n;a.pointWidth=g;b=N(n)<0.5;u=t(n+u)+j;n=t(n)+j;u-=n;w=N(r)<0.5;c=t(r+c)+k;r=t(r)+k;c-=r;b&&(n+=1,u-=1);w&&(r-=\n1,c+=1);a.shapeType=\"rect\";a.shapeArgs={x:n,y:r,width:u,height:c}})},getSymbol:pa,drawLegendSymbol:G.prototype.drawLegendSymbol,drawGraph:pa,drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d;n(a.points,function(e){var f=e.plotY,g=e.graphic;if(f!==w&&!isNaN(f)&&e.y!==null)d=e.shapeArgs,g?(Wa(g),g.animate(x(d))):e.graphic=c[e.shapeType](d).attr(e.pointAttr[e.selected?\"select\":\"\"]).add(a.group).shadow(b.shadow,null,b.stacking&&!b.borderRadius);else if(g)e.graphic=g.destroy()})},drawTracker:function(){var a=\nthis,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,d=d.parentNode;if(e!==w&&e!==b.hoverPoint)e.onMouseOver(c)};n(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)n(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass(\"highcharts-tracker\").on(\"mouseover\",f).on(\"mouseout\",function(a){c.onTrackerMouseOut(a)}).css(e),ib))a[b].on(\"touchstart\",\nf)}),a._hasTracking=!0},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=a.dlBox||a.shapeArgs,i=a.below||a.plotY>o(this.translatedThreshold,f.plotSizeY),j=o(c.inside,!!this.options.stacking);if(h&&(d=x(h),g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=o(c.align,!g||j?\"center\":i?\"right\":\"left\");c.verticalAlign=o(c.verticalAlign,g||j?\"middle\":i?\"top\":\"bottom\");Q.prototype.alignDataLabel.call(this,\na,b,c,d,e)},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(Z)a?(e.scaleY=0.001,a=I(b.pos+b.len,s(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?\"translateX\":\"translateY\"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0});Q.prototype.remove.apply(a,arguments)}});W.column=F;Y.bar=\nx(Y.column);ma=ha(F,{type:\"bar\",inverted:!0});W.bar=ma;Y.scatter=x(X,{lineWidth:0,tooltip:{headerFormat:'<span style=\"font-size: 10px; color:{series.color}\">{series.name}</span><br/>',pointFormat:\"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>\",followPointer:!0},stickyTracking:!1});ma=ha(Q,{type:\"scatter\",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:[\"markerGroup\"],drawTracker:F.prototype.drawTracker,setTooltipPoints:pa});W.scatter=ma;Y.pie=x(X,{borderColor:\"#FFFFFF\",borderWidth:1,\ncenter:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:\"point\",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});X={type:\"pie\",isCartesian:!1,pointClass:ha(Pa,{init:function(){Pa.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:o(a.name,\"Slice\")});b=function(b){a.slice(b.type===\n\"select\")};J(a,\"select\",b);J(a,\"unselect\",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e;b.visible=b.options.visible=a=a===w?!b.visible:a;c.options.data[qa(b,c.data)]=b.options;e=a?\"show\":\"hide\";n([\"graphic\",\"dataLabel\",\"connector\",\"shadowGroup\"],function(a){if(b[a])b[a][e]()});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;La(c,d.chart);o(b,!0);this.sliced=this.options.sliced=\na=u(a)?a:!this.sliced;d.options.data[qa(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"],pointAttrToOptions:{stroke:\"borderColor\",\"stroke-width\":\"borderWidth\",fill:\"color\"},getColor:pa,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/\n2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b){Q.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;Q.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0?e.y/b*100:0,e.total=b},getCenter:function(){var a=\nthis.options,b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[o(b[0],\"50%\"),o(b[1],\"50%\"),a.size||\"100%\",a.innerSize||0],g=I(e,f),h;return Na(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*C(a)/100:a)+(d?c:0)})},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=ya/180*(i-90),i=(this.endAngleRad=ya/180*((c.endAngle||i+360)-90))-j,k=this.points,\nl=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=R.asin((b-a[1])/(a[2]/2+l));return a[0]+(c?-1:1)*V(h)*(a[2]/2+l)};for(m=0;m<n;m++){o=k[m];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType=\"arc\";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:t(f*1E3)/1E3,end:t(g*1E3)/1E3};h=(g+f)/2;h>0.75*i&&(h-=2*ya);o.slicedTranslation={translateX:t(V(h)*d),translateY:t(ca(h)*d)};f=V(h)*a[2]/2;g=ca(h)*a[2]/2;o.tooltipPos=\n[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-ya/2||h>ya/2?1:0;o.angle=h;e=I(e,l/2);o.labelPos=[a[0]+f+V(h)*l,a[1]+g+ca(h)*l,a[0]+f+V(h)*e,a[1]+g+ca(h)*e,a[0]+f,a[1]+g,l<0?\"center\":o.half?\"right\":\"left\",h]}},setTooltipPoints:pa,drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g(\"shadow\").add(a.group);n(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g(\"shadow\").add(a.shadowGroup);c=h.sliced?\nh.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected?\"select\":\"\"]).attr({\"stroke-linejoin\":\"round\"}).attr(c).add(a.group).shadow(e,f);h.visible===!1&&h.setVisible(!1)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawDataLabels:function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=o(e.connectorPadding,10),g=o(e.connectorWidth,1),\nh=d.plotWidth,d=d.plotHeight,i,j,k=o(e.softConnector,!0),l=e.distance,m=a.center,p=m[2]/2,q=m[1],u=l>0,r,w,v,x,C=[[],[]],y,z,E,H,B,D=[0,0,0,0],I=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){Q.prototype.drawDataLabels.apply(a);n(b,function(a){a.dataLabel&&C[a.half].push(a)});for(H=0;!x&&b[H];)x=b[H]&&b[H].dataLabel&&(b[H].dataLabel.getBBox().height||21),H++;for(H=2;H--;){var b=[],K=[],G=C[H],J=G.length,F;a.sortByAngle(G,H-0.5);if(l>0){for(B=q-p-l;B<=q+p+l;B+=x)b.push(B);\nw=b.length;if(J>w){c=[].concat(G);c.sort(I);for(B=J;B--;)c[B].rank=B;for(B=J;B--;)G[B].rank>=w&&G.splice(B,1);J=G.length}for(B=0;B<J;B++){c=G[B];v=c.labelPos;c=9999;var O,M;for(M=0;M<w;M++)O=N(b[M]-v[1]),O<c&&(c=O,F=M);if(F<B&&b[B]!==null)F=B;else for(w<J-B+F&&b[B]!==null&&(F=w-J+B);b[F]===null;)F++;K.push({i:F,y:b[F]});b[F]=null}K.sort(I)}for(B=0;B<J;B++){c=G[B];v=c.labelPos;r=c.dataLabel;E=c.visible===!1?\"hidden\":\"visible\";c=v[1];if(l>0){if(w=K.pop(),F=w.i,z=w.y,c>z&&b[F+1]!==null||c<z&&b[F-1]!==\nnull)z=c}else z=c;y=e.justify?m[0]+(H?-1:1)*(p+l):a.getX(F===0||F===b.length-1?c:z,H);r._attr={visibility:E,align:v[6]};r._pos={x:y+e.x+({left:f,right:-f}[v[6]]||0),y:z+e.y-10};r.connX=y;r.connY=z;if(this.options.size===null)w=r.width,y-w<f?D[3]=s(t(w-y+f),D[3]):y+w>h-f&&(D[1]=s(t(y+w-h+f),D[1])),z-x/2<0?D[0]=s(t(-z+x/2),D[0]):z+x/2>d&&(D[2]=s(t(z+x/2-d),D[2]))}}if(va(D)===0||this.verifyDataLabelOverflow(D))this.placeDataLabels(),u&&g&&n(this.points,function(b){i=b.connector;v=b.labelPos;if((r=b.dataLabel)&&\nr._pos)E=r._attr.visibility,y=r.connX,z=r.connY,j=k?[\"M\",y+(v[6]===\"left\"?5:-5),z,\"C\",y,z,2*v[2]-v[4],2*v[3]-v[5],v[2],v[3],\"L\",v[4],v[5]]:[\"M\",y+(v[6]===\"left\"?5:-5),z,\"L\",v[2],v[3],\"L\",v[4],v[5]],i?(i.animate({d:j}),i.attr(\"visibility\",E)):b.connector=i=a.chart.renderer.path(j).attr({\"stroke-width\":g,stroke:e.connectorColor||b.color||\"#606060\",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},verifyDataLabelOverflow:function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||\n80,f;d[0]!==null?e=s(b[2]-s(a[1],a[3]),c):(e=s(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=s(I(e,b[2]-s(a[0],a[2])),c):(e=s(I(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e<b[2]?(b[2]=e,this.translate(b),n(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels()):f=!0;return f},placeDataLabels:function(){n(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?\"animate\":\"attr\"](b),a.moved=!0):a&&a.attr({y:-999})})},alignDataLabel:pa,\ndrawTracker:F.prototype.drawTracker,drawLegendSymbol:G.prototype.drawLegendSymbol,getSymbol:pa};X=ha(Q,X);W.pie=X;r(Highcharts,{Axis:db,Chart:yb,Color:ra,Legend:eb,Pointer:xb,Point:Pa,Tick:Ma,Tooltip:wb,Renderer:Va,Series:Q,SVGElement:wa,SVGRenderer:Ha,arrayMin:Ja,arrayMax:va,charts:Ga,dateFormat:Xa,format:Ca,pathAnim:Ab,getOptions:function(){return M},hasBidiBug:Ub,isTouchDevice:Ob,numberFormat:Aa,seriesTypes:W,setOptions:function(a){M=x(M,a);Lb();return M},addEvent:J,removeEvent:aa,createElement:U,\ndiscardElement:Ta,css:K,each:n,extend:r,map:Na,merge:x,pick:o,splat:ja,extendClass:ha,pInt:C,wrap:mb,svg:Z,canvas:$,vml:!Z&&!$,product:\"Highcharts\",version:\"3.0.6\"})})();\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/highcharts.src.js",
    "content": "// ==ClosureCompiler==\n// @compilation_level SIMPLE_OPTIMIZATIONS\n\n/**\n * @license Highcharts JS v3.0.6 (2013-10-04)\n *\n * (c) 2009-2013 Torstein Hønsi\n *\n * License: www.highcharts.com/license\n */\n\n// JSLint options:\n/*global Highcharts, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console, each, grep */\n\n(function () {\n// encapsulated variables\nvar UNDEFINED,\n\tdoc = document,\n\twin = window,\n\tmath = Math,\n\tmathRound = math.round,\n\tmathFloor = math.floor,\n\tmathCeil = math.ceil,\n\tmathMax = math.max,\n\tmathMin = math.min,\n\tmathAbs = math.abs,\n\tmathCos = math.cos,\n\tmathSin = math.sin,\n\tmathPI = math.PI,\n\tdeg2rad = mathPI * 2 / 360,\n\n\n\t// some variables\n\tuserAgent = navigator.userAgent,\n\tisOpera = win.opera,\n\tisIE = /msie/i.test(userAgent) && !isOpera,\n\tdocMode8 = doc.documentMode === 8,\n\tisWebKit = /AppleWebKit/.test(userAgent),\n\tisFirefox = /Firefox/.test(userAgent),\n\tisTouchDevice = /(Mobile|Android|Windows Phone)/.test(userAgent),\n\tSVG_NS = 'http://www.w3.org/2000/svg',\n\thasSVG = !!doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,\n\thasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4, // issue #38\n\tuseCanVG = !hasSVG && !isIE && !!doc.createElement('canvas').getContext,\n\tRenderer,\n\thasTouch = doc.documentElement.ontouchstart !== UNDEFINED,\n\tsymbolSizes = {},\n\tidCounter = 0,\n\tgarbageBin,\n\tdefaultOptions,\n\tdateFormat, // function\n\tglobalAnimation,\n\tpathAnim,\n\ttimeUnits,\n\tnoop = function () {},\n\tcharts = [],\n\tPRODUCT = 'Highcharts',\n\tVERSION = '3.0.6',\n\n\t// some constants for frequently used strings\n\tDIV = 'div',\n\tABSOLUTE = 'absolute',\n\tRELATIVE = 'relative',\n\tHIDDEN = 'hidden',\n\tPREFIX = 'highcharts-',\n\tVISIBLE = 'visible',\n\tPX = 'px',\n\tNONE = 'none',\n\tM = 'M',\n\tL = 'L',\n\t/*\n\t * Empirical lowest possible opacities for TRACKER_FILL\n\t * IE6: 0.002\n\t * IE7: 0.002\n\t * IE8: 0.002\n\t * IE9: 0.00000000001 (unlimited)\n\t * IE10: 0.0001 (exporting only)\n\t * FF: 0.00000000001 (unlimited)\n\t * Chrome: 0.000001\n\t * Safari: 0.000001\n\t * Opera: 0.00000000001 (unlimited)\n\t */\n\tTRACKER_FILL = 'rgba(192,192,192,' + (hasSVG ? 0.0001 : 0.002) + ')', // invisible but clickable\n\t//TRACKER_FILL = 'rgba(192,192,192,0.5)',\n\tNORMAL_STATE = '',\n\tHOVER_STATE = 'hover',\n\tSELECT_STATE = 'select',\n\tMILLISECOND = 'millisecond',\n\tSECOND = 'second',\n\tMINUTE = 'minute',\n\tHOUR = 'hour',\n\tDAY = 'day',\n\tWEEK = 'week',\n\tMONTH = 'month',\n\tYEAR = 'year',\n\n\t// constants for attributes\n\tLINEAR_GRADIENT = 'linearGradient',\n\tSTOPS = 'stops',\n\tSTROKE_WIDTH = 'stroke-width',\n\n\t// time methods, changed based on whether or not UTC is used\n\tmakeTime,\n\tgetMinutes,\n\tgetHours,\n\tgetDay,\n\tgetDate,\n\tgetMonth,\n\tgetFullYear,\n\tsetMinutes,\n\tsetHours,\n\tsetDate,\n\tsetMonth,\n\tsetFullYear,\n\n\n\t// lookup over the types and the associated classes\n\tseriesTypes = {};\n\n// The Highcharts namespace\nwin.Highcharts = win.Highcharts ? error(16, true) : {};\n\n/**\n * Extend an object with the members of another\n * @param {Object} a The object to be extended\n * @param {Object} b The object to add to the first one\n */\nfunction extend(a, b) {\n\tvar n;\n\tif (!a) {\n\t\ta = {};\n\t}\n\tfor (n in b) {\n\t\ta[n] = b[n];\n\t}\n\treturn a;\n}\n\t\n/**\n * Deep merge two or more objects and return a third object.\n * Previously this function redirected to jQuery.extend(true), but this had two limitations.\n * First, it deep merged arrays, which lead to workarounds in Highcharts. Second,\n * it copied properties from extended prototypes. \n */\nfunction merge() {\n\tvar i,\n\t\tlen = arguments.length,\n\t\tret = {},\n\t\tdoCopy = function (copy, original) {\n\t\t\tvar value, key;\n\n\t\t\t// An object is replacing a primitive\n\t\t\tif (typeof copy !== 'object') {\n\t\t\t\tcopy = {};\n\t\t\t}\n\n\t\t\tfor (key in original) {\n\t\t\t\tif (original.hasOwnProperty(key)) {\n\t\t\t\t\tvalue = original[key];\n\n\t\t\t\t\t// Copy the contents of objects, but not arrays or DOM nodes\n\t\t\t\t\tif (value && typeof value === 'object' && Object.prototype.toString.call(value) !== '[object Array]'\n\t\t\t\t\t\t\t&& typeof value.nodeType !== 'number') {\n\t\t\t\t\t\tcopy[key] = doCopy(copy[key] || {}, value);\n\t\t\t\t\n\t\t\t\t\t// Primitives and arrays are copied over directly\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcopy[key] = original[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn copy;\n\t\t};\n\n\t// For each argument, extend the return\n\tfor (i = 0; i < len; i++) {\n\t\tret = doCopy(ret, arguments[i]);\n\t}\n\n\treturn ret;\n}\n\n/**\n * Take an array and turn into a hash with even number arguments as keys and odd numbers as\n * values. Allows creating constants for commonly used style properties, attributes etc.\n * Avoid it in performance critical situations like looping\n */\nfunction hash() {\n\tvar i = 0,\n\t\targs = arguments,\n\t\tlength = args.length,\n\t\tobj = {};\n\tfor (; i < length; i++) {\n\t\tobj[args[i++]] = args[i];\n\t}\n\treturn obj;\n}\n\n/**\n * Shortcut for parseInt\n * @param {Object} s\n * @param {Number} mag Magnitude\n */\nfunction pInt(s, mag) {\n\treturn parseInt(s, mag || 10);\n}\n\n/**\n * Check for string\n * @param {Object} s\n */\nfunction isString(s) {\n\treturn typeof s === 'string';\n}\n\n/**\n * Check for object\n * @param {Object} obj\n */\nfunction isObject(obj) {\n\treturn typeof obj === 'object';\n}\n\n/**\n * Check for array\n * @param {Object} obj\n */\nfunction isArray(obj) {\n\treturn Object.prototype.toString.call(obj) === '[object Array]';\n}\n\n/**\n * Check for number\n * @param {Object} n\n */\nfunction isNumber(n) {\n\treturn typeof n === 'number';\n}\n\nfunction log2lin(num) {\n\treturn math.log(num) / math.LN10;\n}\nfunction lin2log(num) {\n\treturn math.pow(10, num);\n}\n\n/**\n * Remove last occurence of an item from an array\n * @param {Array} arr\n * @param {Mixed} item\n */\nfunction erase(arr, item) {\n\tvar i = arr.length;\n\twhile (i--) {\n\t\tif (arr[i] === item) {\n\t\t\tarr.splice(i, 1);\n\t\t\tbreak;\n\t\t}\n\t}\n\t//return arr;\n}\n\n/**\n * Returns true if the object is not null or undefined. Like MooTools' $.defined.\n * @param {Object} obj\n */\nfunction defined(obj) {\n\treturn obj !== UNDEFINED && obj !== null;\n}\n\n/**\n * Set or get an attribute or an object of attributes. Can't use jQuery attr because\n * it attempts to set expando properties on the SVG element, which is not allowed.\n *\n * @param {Object} elem The DOM element to receive the attribute(s)\n * @param {String|Object} prop The property or an abject of key-value pairs\n * @param {String} value The value if a single property is set\n */\nfunction attr(elem, prop, value) {\n\tvar key,\n\t\tsetAttribute = 'setAttribute',\n\t\tret;\n\n\t// if the prop is a string\n\tif (isString(prop)) {\n\t\t// set the value\n\t\tif (defined(value)) {\n\n\t\t\telem[setAttribute](prop, value);\n\n\t\t// get the value\n\t\t} else if (elem && elem.getAttribute) { // elem not defined when printing pie demo...\n\t\t\tret = elem.getAttribute(prop);\n\t\t}\n\n\t// else if prop is defined, it is a hash of key/value pairs\n\t} else if (defined(prop) && isObject(prop)) {\n\t\tfor (key in prop) {\n\t\t\telem[setAttribute](key, prop[key]);\n\t\t}\n\t}\n\treturn ret;\n}\n/**\n * Check if an element is an array, and if not, make it into an array. Like\n * MooTools' $.splat.\n */\nfunction splat(obj) {\n\treturn isArray(obj) ? obj : [obj];\n}\n\n\n/**\n * Return the first value that is defined. Like MooTools' $.pick.\n */\nfunction pick() {\n\tvar args = arguments,\n\t\ti,\n\t\targ,\n\t\tlength = args.length;\n\tfor (i = 0; i < length; i++) {\n\t\targ = args[i];\n\t\tif (typeof arg !== 'undefined' && arg !== null) {\n\t\t\treturn arg;\n\t\t}\n\t}\n}\n\n/**\n * Set CSS on a given element\n * @param {Object} el\n * @param {Object} styles Style object with camel case property names\n */\nfunction css(el, styles) {\n\tif (isIE) {\n\t\tif (styles && styles.opacity !== UNDEFINED) {\n\t\t\tstyles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';\n\t\t}\n\t}\n\textend(el.style, styles);\n}\n\n/**\n * Utility function to create element with attributes and styles\n * @param {Object} tag\n * @param {Object} attribs\n * @param {Object} styles\n * @param {Object} parent\n * @param {Object} nopad\n */\nfunction createElement(tag, attribs, styles, parent, nopad) {\n\tvar el = doc.createElement(tag);\n\tif (attribs) {\n\t\textend(el, attribs);\n\t}\n\tif (nopad) {\n\t\tcss(el, {padding: 0, border: NONE, margin: 0});\n\t}\n\tif (styles) {\n\t\tcss(el, styles);\n\t}\n\tif (parent) {\n\t\tparent.appendChild(el);\n\t}\n\treturn el;\n}\n\n/**\n * Extend a prototyped class by new members\n * @param {Object} parent\n * @param {Object} members\n */\nfunction extendClass(parent, members) {\n\tvar object = function () {};\n\tobject.prototype = new parent();\n\textend(object.prototype, members);\n\treturn object;\n}\n\n/**\n * Format a number and return a string based on input settings\n * @param {Number} number The input number to format\n * @param {Number} decimals The amount of decimals\n * @param {String} decPoint The decimal point, defaults to the one given in the lang options\n * @param {String} thousandsSep The thousands separator, defaults to the one given in the lang options\n */\nfunction numberFormat(number, decimals, decPoint, thousandsSep) {\n\tvar lang = defaultOptions.lang,\n\t\t// http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/\n\t\tn = +number || 0,\n\t\tc = decimals === -1 ?\n\t\t\t(n.toString().split('.')[1] || '').length : // preserve decimals\n\t\t\t(isNaN(decimals = mathAbs(decimals)) ? 2 : decimals),\n\t\td = decPoint === undefined ? lang.decimalPoint : decPoint,\n\t\tt = thousandsSep === undefined ? lang.thousandsSep : thousandsSep,\n\t\ts = n < 0 ? \"-\" : \"\",\n\t\ti = String(pInt(n = mathAbs(n).toFixed(c))),\n\t\tj = i.length > 3 ? i.length % 3 : 0;\n\n\treturn s + (j ? i.substr(0, j) + t : \"\") + i.substr(j).replace(/(\\d{3})(?=\\d)/g, \"$1\" + t) +\n\t\t(c ? d + mathAbs(n - i).toFixed(c).slice(2) : \"\");\n}\n\n/**\n * Pad a string to a given length by adding 0 to the beginning\n * @param {Number} number\n * @param {Number} length\n */\nfunction pad(number, length) {\n\t// Create an array of the remaining length +1 and join it with 0's\n\treturn new Array((length || 2) + 1 - String(number).length).join(0) + number;\n}\n\n/**\n * Wrap a method with extended functionality, preserving the original function\n * @param {Object} obj The context object that the method belongs to \n * @param {String} method The name of the method to extend\n * @param {Function} func A wrapper function callback. This function is called with the same arguments\n * as the original function, except that the original function is unshifted and passed as the first \n * argument. \n */\nfunction wrap(obj, method, func) {\n\tvar proceed = obj[method];\n\tobj[method] = function () {\n\t\tvar args = Array.prototype.slice.call(arguments);\n\t\targs.unshift(proceed);\n\t\treturn func.apply(this, args);\n\t};\n}\n\n/**\n * Based on http://www.php.net/manual/en/function.strftime.php\n * @param {String} format\n * @param {Number} timestamp\n * @param {Boolean} capitalize\n */\ndateFormat = function (format, timestamp, capitalize) {\n\tif (!defined(timestamp) || isNaN(timestamp)) {\n\t\treturn 'Invalid date';\n\t}\n\tformat = pick(format, '%Y-%m-%d %H:%M:%S');\n\n\tvar date = new Date(timestamp),\n\t\tkey, // used in for constuct below\n\t\t// get the basic time values\n\t\thours = date[getHours](),\n\t\tday = date[getDay](),\n\t\tdayOfMonth = date[getDate](),\n\t\tmonth = date[getMonth](),\n\t\tfullYear = date[getFullYear](),\n\t\tlang = defaultOptions.lang,\n\t\tlangWeekdays = lang.weekdays,\n\n\t\t// List all format keys. Custom formats can be added from the outside. \n\t\treplacements = extend({\n\n\t\t\t// Day\n\t\t\t'a': langWeekdays[day].substr(0, 3), // Short weekday, like 'Mon'\n\t\t\t'A': langWeekdays[day], // Long weekday, like 'Monday'\n\t\t\t'd': pad(dayOfMonth), // Two digit day of the month, 01 to 31\n\t\t\t'e': dayOfMonth, // Day of the month, 1 through 31\n\n\t\t\t// Week (none implemented)\n\t\t\t//'W': weekNumber(),\n\n\t\t\t// Month\n\t\t\t'b': lang.shortMonths[month], // Short month, like 'Jan'\n\t\t\t'B': lang.months[month], // Long month, like 'January'\n\t\t\t'm': pad(month + 1), // Two digit month number, 01 through 12\n\n\t\t\t// Year\n\t\t\t'y': fullYear.toString().substr(2, 2), // Two digits year, like 09 for 2009\n\t\t\t'Y': fullYear, // Four digits year, like 2009\n\n\t\t\t// Time\n\t\t\t'H': pad(hours), // Two digits hours in 24h format, 00 through 23\n\t\t\t'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11\n\t\t\t'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12\n\t\t\t'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59\n\t\t\t'p': hours < 12 ? 'AM' : 'PM', // Upper case AM or PM\n\t\t\t'P': hours < 12 ? 'am' : 'pm', // Lower case AM or PM\n\t\t\t'S': pad(date.getSeconds()), // Two digits seconds, 00 through  59\n\t\t\t'L': pad(mathRound(timestamp % 1000), 3) // Milliseconds (naming from Ruby)\n\t\t}, Highcharts.dateFormats);\n\n\n\t// do the replaces\n\tfor (key in replacements) {\n\t\twhile (format.indexOf('%' + key) !== -1) { // regex would do it in one line, but this is faster\n\t\t\tformat = format.replace('%' + key, typeof replacements[key] === 'function' ? replacements[key](timestamp) : replacements[key]);\n\t\t}\n\t}\n\n\t// Optionally capitalize the string and return\n\treturn capitalize ? format.substr(0, 1).toUpperCase() + format.substr(1) : format;\n};\n\n/** \n * Format a single variable. Similar to sprintf, without the % prefix.\n */\nfunction formatSingle(format, val) {\n\tvar floatRegex = /f$/,\n\t\tdecRegex = /\\.([0-9])/,\n\t\tlang = defaultOptions.lang,\n\t\tdecimals;\n\n\tif (floatRegex.test(format)) { // float\n\t\tdecimals = format.match(decRegex);\n\t\tdecimals = decimals ? decimals[1] : -1;\n\t\tval = numberFormat(\n\t\t\tval,\n\t\t\tdecimals,\n\t\t\tlang.decimalPoint,\n\t\t\tformat.indexOf(',') > -1 ? lang.thousandsSep : ''\n\t\t);\n\t} else {\n\t\tval = dateFormat(format, val);\n\t}\n\treturn val;\n}\n\n/**\n * Format a string according to a subset of the rules of Python's String.format method.\n */\nfunction format(str, ctx) {\n\tvar splitter = '{',\n\t\tisInside = false,\n\t\tsegment,\n\t\tvalueAndFormat,\n\t\tpath,\n\t\ti,\n\t\tlen,\n\t\tret = [],\n\t\tval,\n\t\tindex;\n\t\n\twhile ((index = str.indexOf(splitter)) !== -1) {\n\t\t\n\t\tsegment = str.slice(0, index);\n\t\tif (isInside) { // we're on the closing bracket looking back\n\t\t\t\n\t\t\tvalueAndFormat = segment.split(':');\n\t\t\tpath = valueAndFormat.shift().split('.'); // get first and leave format\n\t\t\tlen = path.length;\n\t\t\tval = ctx;\n\n\t\t\t// Assign deeper paths\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tval = val[path[i]];\n\t\t\t}\n\n\t\t\t// Format the replacement\n\t\t\tif (valueAndFormat.length) {\n\t\t\t\tval = formatSingle(valueAndFormat.join(':'), val);\n\t\t\t}\n\n\t\t\t// Push the result and advance the cursor\n\t\t\tret.push(val);\n\t\t\t\n\t\t} else {\n\t\t\tret.push(segment);\n\t\t\t\n\t\t}\n\t\tstr = str.slice(index + 1); // the rest\n\t\tisInside = !isInside; // toggle\n\t\tsplitter = isInside ? '}' : '{'; // now look for next matching bracket\n\t}\n\tret.push(str);\n\treturn ret.join('');\n}\n\n/**\n * Get the magnitude of a number\n */\nfunction getMagnitude(num) {\n\treturn math.pow(10, mathFloor(math.log(num) / math.LN10));\n}\n\n/**\n * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5\n * @param {Number} interval\n * @param {Array} multiples\n * @param {Number} magnitude\n * @param {Object} options\n */\nfunction normalizeTickInterval(interval, multiples, magnitude, options) {\n\tvar normalized, i;\n\n\t// round to a tenfold of 1, 2, 2.5 or 5\n\tmagnitude = pick(magnitude, 1);\n\tnormalized = interval / magnitude;\n\n\t// multiples for a linear scale\n\tif (!multiples) {\n\t\tmultiples = [1, 2, 2.5, 5, 10];\n\n\t\t// the allowDecimals option\n\t\tif (options && options.allowDecimals === false) {\n\t\t\tif (magnitude === 1) {\n\t\t\t\tmultiples = [1, 2, 5, 10];\n\t\t\t} else if (magnitude <= 0.1) {\n\t\t\t\tmultiples = [1 / magnitude];\n\t\t\t}\n\t\t}\n\t}\n\n\t// normalize the interval to the nearest multiple\n\tfor (i = 0; i < multiples.length; i++) {\n\t\tinterval = multiples[i];\n\t\tif (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// multiply back to the correct magnitude\n\tinterval *= magnitude;\n\n\treturn interval;\n}\n\n/**\n * Get a normalized tick interval for dates. Returns a configuration object with\n * unit range (interval), count and name. Used to prepare data for getTimeTicks. \n * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs\n * of segments in stock charts, the normalizing logic was extracted in order to \n * prevent it for running over again for each segment having the same interval. \n * #662, #697.\n */\nfunction normalizeTimeTickInterval(tickInterval, unitsOption) {\n\tvar units = unitsOption || [[\n\t\t\t\tMILLISECOND, // unit name\n\t\t\t\t[1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n\t\t\t], [\n\t\t\t\tSECOND,\n\t\t\t\t[1, 2, 5, 10, 15, 30]\n\t\t\t], [\n\t\t\t\tMINUTE,\n\t\t\t\t[1, 2, 5, 10, 15, 30]\n\t\t\t], [\n\t\t\t\tHOUR,\n\t\t\t\t[1, 2, 3, 4, 6, 8, 12]\n\t\t\t], [\n\t\t\t\tDAY,\n\t\t\t\t[1, 2]\n\t\t\t], [\n\t\t\t\tWEEK,\n\t\t\t\t[1, 2]\n\t\t\t], [\n\t\t\t\tMONTH,\n\t\t\t\t[1, 2, 3, 4, 6]\n\t\t\t], [\n\t\t\t\tYEAR,\n\t\t\t\tnull\n\t\t\t]],\n\t\tunit = units[units.length - 1], // default unit is years\n\t\tinterval = timeUnits[unit[0]],\n\t\tmultiples = unit[1],\n\t\tcount,\n\t\ti;\n\t\t\n\t// loop through the units to find the one that best fits the tickInterval\n\tfor (i = 0; i < units.length; i++) {\n\t\tunit = units[i];\n\t\tinterval = timeUnits[unit[0]];\n\t\tmultiples = unit[1];\n\n\n\t\tif (units[i + 1]) {\n\t\t\t// lessThan is in the middle between the highest multiple and the next unit.\n\t\t\tvar lessThan = (interval * multiples[multiples.length - 1] +\n\t\t\t\t\t\ttimeUnits[units[i + 1][0]]) / 2;\n\n\t\t\t// break and keep the current unit\n\t\t\tif (tickInterval <= lessThan) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// prevent 2.5 years intervals, though 25, 250 etc. are allowed\n\tif (interval === timeUnits[YEAR] && tickInterval < 5 * interval) {\n\t\tmultiples = [1, 2, 5];\n\t}\n\n\t// get the count\n\tcount = normalizeTickInterval(\n\t\ttickInterval / interval, \n\t\tmultiples,\n\t\tunit[0] === YEAR ? getMagnitude(tickInterval / interval) : 1 // #1913\n\t);\n\t\n\treturn {\n\t\tunitRange: interval,\n\t\tcount: count,\n\t\tunitName: unit[0]\n\t};\n}\n\n/**\n * Set the tick positions to a time unit that makes sense, for example\n * on the first of each month or on every Monday. Return an array\n * with the time positions. Used in datetime axes as well as for grouping\n * data on a datetime axis.\n *\n * @param {Object} normalizedInterval The interval in axis values (ms) and the count\n * @param {Number} min The minimum in axis values\n * @param {Number} max The maximum in axis values\n * @param {Number} startOfWeek\n */\nfunction getTimeTicks(normalizedInterval, min, max, startOfWeek) {\n\tvar tickPositions = [],\n\t\ti,\n\t\thigherRanks = {},\n\t\tuseUTC = defaultOptions.global.useUTC,\n\t\tminYear, // used in months and years as a basis for Date.UTC()\n\t\tminDate = new Date(min),\n\t\tinterval = normalizedInterval.unitRange,\n\t\tcount = normalizedInterval.count;\n\n\tif (defined(min)) { // #1300\n\t\tif (interval >= timeUnits[SECOND]) { // second\n\t\t\tminDate.setMilliseconds(0);\n\t\t\tminDate.setSeconds(interval >= timeUnits[MINUTE] ? 0 :\n\t\t\t\tcount * mathFloor(minDate.getSeconds() / count));\n\t\t}\n\t\n\t\tif (interval >= timeUnits[MINUTE]) { // minute\n\t\t\tminDate[setMinutes](interval >= timeUnits[HOUR] ? 0 :\n\t\t\t\tcount * mathFloor(minDate[getMinutes]() / count));\n\t\t}\n\t\n\t\tif (interval >= timeUnits[HOUR]) { // hour\n\t\t\tminDate[setHours](interval >= timeUnits[DAY] ? 0 :\n\t\t\t\tcount * mathFloor(minDate[getHours]() / count));\n\t\t}\n\t\n\t\tif (interval >= timeUnits[DAY]) { // day\n\t\t\tminDate[setDate](interval >= timeUnits[MONTH] ? 1 :\n\t\t\t\tcount * mathFloor(minDate[getDate]() / count));\n\t\t}\n\t\n\t\tif (interval >= timeUnits[MONTH]) { // month\n\t\t\tminDate[setMonth](interval >= timeUnits[YEAR] ? 0 :\n\t\t\t\tcount * mathFloor(minDate[getMonth]() / count));\n\t\t\tminYear = minDate[getFullYear]();\n\t\t}\n\t\n\t\tif (interval >= timeUnits[YEAR]) { // year\n\t\t\tminYear -= minYear % count;\n\t\t\tminDate[setFullYear](minYear);\n\t\t}\n\t\n\t\t// week is a special case that runs outside the hierarchy\n\t\tif (interval === timeUnits[WEEK]) {\n\t\t\t// get start of current week, independent of count\n\t\t\tminDate[setDate](minDate[getDate]() - minDate[getDay]() +\n\t\t\t\tpick(startOfWeek, 1));\n\t\t}\n\t\n\t\n\t\t// get tick positions\n\t\ti = 1;\n\t\tminYear = minDate[getFullYear]();\n\t\tvar time = minDate.getTime(),\n\t\t\tminMonth = minDate[getMonth](),\n\t\t\tminDateDate = minDate[getDate](),\n\t\t\ttimezoneOffset = useUTC ? \n\t\t\t\t0 : \n\t\t\t\t(24 * 3600 * 1000 + minDate.getTimezoneOffset() * 60 * 1000) % (24 * 3600 * 1000); // #950\n\t\n\t\t// iterate and add tick positions at appropriate values\n\t\twhile (time < max) {\n\t\t\ttickPositions.push(time);\n\t\n\t\t\t// if the interval is years, use Date.UTC to increase years\n\t\t\tif (interval === timeUnits[YEAR]) {\n\t\t\t\ttime = makeTime(minYear + i * count, 0);\n\t\n\t\t\t// if the interval is months, use Date.UTC to increase months\n\t\t\t} else if (interval === timeUnits[MONTH]) {\n\t\t\t\ttime = makeTime(minYear, minMonth + i * count);\n\t\n\t\t\t// if we're using global time, the interval is not fixed as it jumps\n\t\t\t// one hour at the DST crossover\n\t\t\t} else if (!useUTC && (interval === timeUnits[DAY] || interval === timeUnits[WEEK])) {\n\t\t\t\ttime = makeTime(minYear, minMonth, minDateDate +\n\t\t\t\t\ti * count * (interval === timeUnits[DAY] ? 1 : 7));\n\t\n\t\t\t// else, the interval is fixed and we use simple addition\n\t\t\t} else {\n\t\t\t\ttime += interval * count;\n\t\t\t}\n\t\n\t\t\ti++;\n\t\t}\n\t\n\t\t// push the last time\n\t\ttickPositions.push(time);\n\n\n\t\t// mark new days if the time is dividible by day (#1649, #1760)\n\t\teach(grep(tickPositions, function (time) {\n\t\t\treturn interval <= timeUnits[HOUR] && time % timeUnits[DAY] === timezoneOffset;\n\t\t}), function (time) {\n\t\t\thigherRanks[time] = DAY;\n\t\t});\n\t}\n\n\n\t// record information on the chosen unit - for dynamic label formatter\n\ttickPositions.info = extend(normalizedInterval, {\n\t\thigherRanks: higherRanks,\n\t\ttotalRange: interval * count\n\t});\n\n\treturn tickPositions;\n}\n\n/**\n * Helper class that contains variuos counters that are local to the chart.\n */\nfunction ChartCounters() {\n\tthis.color = 0;\n\tthis.symbol = 0;\n}\n\nChartCounters.prototype =  {\n\t/**\n\t * Wraps the color counter if it reaches the specified length.\n\t */\n\twrapColor: function (length) {\n\t\tif (this.color >= length) {\n\t\t\tthis.color = 0;\n\t\t}\n\t},\n\n\t/**\n\t * Wraps the symbol counter if it reaches the specified length.\n\t */\n\twrapSymbol: function (length) {\n\t\tif (this.symbol >= length) {\n\t\t\tthis.symbol = 0;\n\t\t}\n\t}\n};\n\n\n/**\n * Utility method that sorts an object array and keeping the order of equal items.\n * ECMA script standard does not specify the behaviour when items are equal.\n */\nfunction stableSort(arr, sortFunction) {\n\tvar length = arr.length,\n\t\tsortValue,\n\t\ti;\n\n\t// Add index to each item\n\tfor (i = 0; i < length; i++) {\n\t\tarr[i].ss_i = i; // stable sort index\n\t}\n\n\tarr.sort(function (a, b) {\n\t\tsortValue = sortFunction(a, b);\n\t\treturn sortValue === 0 ? a.ss_i - b.ss_i : sortValue;\n\t});\n\n\t// Remove index from items\n\tfor (i = 0; i < length; i++) {\n\t\tdelete arr[i].ss_i; // stable sort index\n\t}\n}\n\n/**\n * Non-recursive method to find the lowest member of an array. Math.min raises a maximum\n * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This\n * method is slightly slower, but safe.\n */\nfunction arrayMin(data) {\n\tvar i = data.length,\n\t\tmin = data[0];\n\n\twhile (i--) {\n\t\tif (data[i] < min) {\n\t\t\tmin = data[i];\n\t\t}\n\t}\n\treturn min;\n}\n\n/**\n * Non-recursive method to find the lowest member of an array. Math.min raises a maximum\n * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This\n * method is slightly slower, but safe.\n */\nfunction arrayMax(data) {\n\tvar i = data.length,\n\t\tmax = data[0];\n\n\twhile (i--) {\n\t\tif (data[i] > max) {\n\t\t\tmax = data[i];\n\t\t}\n\t}\n\treturn max;\n}\n\n/**\n * Utility method that destroys any SVGElement or VMLElement that are properties on the given object.\n * It loops all properties and invokes destroy if there is a destroy method. The property is\n * then delete'ed.\n * @param {Object} The object to destroy properties on\n * @param {Object} Exception, do not destroy this property, only delete it.\n */\nfunction destroyObjectProperties(obj, except) {\n\tvar n;\n\tfor (n in obj) {\n\t\t// If the object is non-null and destroy is defined\n\t\tif (obj[n] && obj[n] !== except && obj[n].destroy) {\n\t\t\t// Invoke the destroy\n\t\t\tobj[n].destroy();\n\t\t}\n\n\t\t// Delete the property from the object.\n\t\tdelete obj[n];\n\t}\n}\n\n\n/**\n * Discard an element by moving it to the bin and delete\n * @param {Object} The HTML node to discard\n */\nfunction discardElement(element) {\n\t// create a garbage bin element, not part of the DOM\n\tif (!garbageBin) {\n\t\tgarbageBin = createElement(DIV);\n\t}\n\n\t// move the node and empty bin\n\tif (element) {\n\t\tgarbageBin.appendChild(element);\n\t}\n\tgarbageBin.innerHTML = '';\n}\n\n/**\n * Provide error messages for debugging, with links to online explanation \n */\nfunction error(code, stop) {\n\tvar msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;\n\tif (stop) {\n\t\tthrow msg;\n\t} else if (win.console) {\n\t\tconsole.log(msg);\n\t}\n}\n\n/**\n * Fix JS round off float errors\n * @param {Number} num\n */\nfunction correctFloat(num) {\n\treturn parseFloat(\n\t\tnum.toPrecision(14)\n\t);\n}\n\n/**\n * Set the global animation to either a given value, or fall back to the\n * given chart's animation option\n * @param {Object} animation\n * @param {Object} chart\n */\nfunction setAnimation(animation, chart) {\n\tglobalAnimation = pick(animation, chart.animation);\n}\n\n/**\n * The time unit lookup\n */\n/*jslint white: true*/\ntimeUnits = hash(\n\tMILLISECOND, 1,\n\tSECOND, 1000,\n\tMINUTE, 60000,\n\tHOUR, 3600000,\n\tDAY, 24 * 3600000,\n\tWEEK, 7 * 24 * 3600000,\n\tMONTH, 31 * 24 * 3600000,\n\tYEAR, 31556952000\n);\n/*jslint white: false*/\n/**\n * Path interpolation algorithm used across adapters\n */\npathAnim = {\n\t/**\n\t * Prepare start and end values so that the path can be animated one to one\n\t */\n\tinit: function (elem, fromD, toD) {\n\t\tfromD = fromD || '';\n\t\tvar shift = elem.shift,\n\t\t\tbezier = fromD.indexOf('C') > -1,\n\t\t\tnumParams = bezier ? 7 : 3,\n\t\t\tendLength,\n\t\t\tslice,\n\t\t\ti,\n\t\t\tstart = fromD.split(' '),\n\t\t\tend = [].concat(toD), // copy\n\t\t\tstartBaseLine,\n\t\t\tendBaseLine,\n\t\t\tsixify = function (arr) { // in splines make move points have six parameters like bezier curves\n\t\t\t\ti = arr.length;\n\t\t\t\twhile (i--) {\n\t\t\t\t\tif (arr[i] === M) {\n\t\t\t\t\t\tarr.splice(i + 1, 0, arr[i + 1], arr[i + 2], arr[i + 1], arr[i + 2]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\tif (bezier) {\n\t\t\tsixify(start);\n\t\t\tsixify(end);\n\t\t}\n\n\t\t// pull out the base lines before padding\n\t\tif (elem.isArea) {\n\t\t\tstartBaseLine = start.splice(start.length - 6, 6);\n\t\t\tendBaseLine = end.splice(end.length - 6, 6);\n\t\t}\n\n\t\t// if shifting points, prepend a dummy point to the end path\n\t\tif (shift <= end.length / numParams && start.length === end.length) {\n\t\t\twhile (shift--) {\n\t\t\t\tend = [].concat(end).splice(0, numParams).concat(end);\n\t\t\t}\n\t\t}\n\t\telem.shift = 0; // reset for following animations\n\n\t\t// copy and append last point until the length matches the end length\n\t\tif (start.length) {\n\t\t\tendLength = end.length;\n\t\t\twhile (start.length < endLength) {\n\n\t\t\t\t//bezier && sixify(start);\n\t\t\t\tslice = [].concat(start).splice(start.length - numParams, numParams);\n\t\t\t\tif (bezier) { // disable first control point\n\t\t\t\t\tslice[numParams - 6] = slice[numParams - 2];\n\t\t\t\t\tslice[numParams - 5] = slice[numParams - 1];\n\t\t\t\t}\n\t\t\t\tstart = start.concat(slice);\n\t\t\t}\n\t\t}\n\n\t\tif (startBaseLine) { // append the base lines for areas\n\t\t\tstart = start.concat(startBaseLine);\n\t\t\tend = end.concat(endBaseLine);\n\t\t}\n\t\treturn [start, end];\n\t},\n\n\t/**\n\t * Interpolate each value of the path and return the array\n\t */\n\tstep: function (start, end, pos, complete) {\n\t\tvar ret = [],\n\t\t\ti = start.length,\n\t\t\tstartVal;\n\n\t\tif (pos === 1) { // land on the final path without adjustment points appended in the ends\n\t\t\tret = complete;\n\n\t\t} else if (i === end.length && pos < 1) {\n\t\t\twhile (i--) {\n\t\t\t\tstartVal = parseFloat(start[i]);\n\t\t\t\tret[i] =\n\t\t\t\t\tisNaN(startVal) ? // a letter instruction like M or L\n\t\t\t\t\t\tstart[i] :\n\t\t\t\t\t\tpos * (parseFloat(end[i] - startVal)) + startVal;\n\n\t\t\t}\n\t\t} else { // if animation is finished or length not matching, land on right value\n\t\t\tret = end;\n\t\t}\n\t\treturn ret;\n\t}\n};\n\n(function ($) {\n\t/**\n\t * The default HighchartsAdapter for jQuery\n\t */\n\twin.HighchartsAdapter = win.HighchartsAdapter || ($ && {\n\t\t\n\t\t/**\n\t\t * Initialize the adapter by applying some extensions to jQuery\n\t\t */\n\t\tinit: function (pathAnim) {\n\t\t\t\n\t\t\t// extend the animate function to allow SVG animations\n\t\t\tvar Fx = $.fx,\n\t\t\t\tStep = Fx.step,\n\t\t\t\tdSetter,\n\t\t\t\tTween = $.Tween,\n\t\t\t\tpropHooks = Tween && Tween.propHooks,\n\t\t\t\topacityHook = $.cssHooks.opacity;\n\t\t\t\n\t\t\t/*jslint unparam: true*//* allow unused param x in this function */\n\t\t\t$.extend($.easing, {\n\t\t\t\teaseOutQuad: function (x, t, b, c, d) {\n\t\t\t\t\treturn -c * (t /= d) * (t - 2) + b;\n\t\t\t\t}\n\t\t\t});\n\t\t\t/*jslint unparam: false*/\n\t\t\n\t\t\t// extend some methods to check for elem.attr, which means it is a Highcharts SVG object\n\t\t\t$.each(['cur', '_default', 'width', 'height', 'opacity'], function (i, fn) {\n\t\t\t\tvar obj = Step,\n\t\t\t\t\tbase,\n\t\t\t\t\telem;\n\t\t\t\t\t\n\t\t\t\t// Handle different parent objects\n\t\t\t\tif (fn === 'cur') {\n\t\t\t\t\tobj = Fx.prototype; // 'cur', the getter, relates to Fx.prototype\n\t\t\t\t\n\t\t\t\t} else if (fn === '_default' && Tween) { // jQuery 1.8 model\n\t\t\t\t\tobj = propHooks[fn];\n\t\t\t\t\tfn = 'set';\n\t\t\t\t}\n\t\t\n\t\t\t\t// Overwrite the method\n\t\t\t\tbase = obj[fn];\n\t\t\t\tif (base) { // step.width and step.height don't exist in jQuery < 1.7\n\t\t\n\t\t\t\t\t// create the extended function replacement\n\t\t\t\t\tobj[fn] = function (fx) {\n\t\t\n\t\t\t\t\t\t// Fx.prototype.cur does not use fx argument\n\t\t\t\t\t\tfx = i ? fx : this;\n\n\t\t\t\t\t\t// Don't run animations on textual properties like align (#1821)\n\t\t\t\t\t\tif (fx.prop === 'align') {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\telem = fx.elem;\n\t\t\n\t\t\t\t\t\t// Fx.prototype.cur returns the current value. The other ones are setters\n\t\t\t\t\t\t// and returning a value has no effect.\n\t\t\t\t\t\treturn elem.attr ? // is SVG element wrapper\n\t\t\t\t\t\t\telem.attr(fx.prop, fn === 'cur' ? UNDEFINED : fx.now) : // apply the SVG wrapper's method\n\t\t\t\t\t\t\tbase.apply(this, arguments); // use jQuery's built-in method\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Extend the opacity getter, needed for fading opacity with IE9 and jQuery 1.10+\n\t\t\twrap(opacityHook, 'get', function (proceed, elem, computed) {\n\t\t\t\treturn elem.attr ? (elem.opacity || 0) : proceed.call(this, elem, computed);\n\t\t\t});\n\t\t\t\n\t\t\t\n\t\t\t// Define the setter function for d (path definitions)\n\t\t\tdSetter = function (fx) {\n\t\t\t\tvar elem = fx.elem,\n\t\t\t\t\tends;\n\t\t\n\t\t\t\t// Normally start and end should be set in state == 0, but sometimes,\n\t\t\t\t// for reasons unknown, this doesn't happen. Perhaps state == 0 is skipped\n\t\t\t\t// in these cases\n\t\t\t\tif (!fx.started) {\n\t\t\t\t\tends = pathAnim.init(elem, elem.d, elem.toD);\n\t\t\t\t\tfx.start = ends[0];\n\t\t\t\t\tfx.end = ends[1];\n\t\t\t\t\tfx.started = true;\n\t\t\t\t}\n\t\t\n\t\t\n\t\t\t\t// interpolate each value of the path\n\t\t\t\telem.attr('d', pathAnim.step(fx.start, fx.end, fx.pos, elem.toD));\n\t\t\t};\n\t\t\t\n\t\t\t// jQuery 1.8 style\n\t\t\tif (Tween) {\n\t\t\t\tpropHooks.d = {\n\t\t\t\t\tset: dSetter\n\t\t\t\t};\n\t\t\t// pre 1.8\n\t\t\t} else {\n\t\t\t\t// animate paths\n\t\t\t\tStep.d = dSetter;\n\t\t\t}\n\t\t\t\n\t\t\t/**\n\t\t\t * Utility for iterating over an array. Parameters are reversed compared to jQuery.\n\t\t\t * @param {Array} arr\n\t\t\t * @param {Function} fn\n\t\t\t */\n\t\t\tthis.each = Array.prototype.forEach ?\n\t\t\t\tfunction (arr, fn) { // modern browsers\n\t\t\t\t\treturn Array.prototype.forEach.call(arr, fn);\n\t\t\t\t\t\n\t\t\t\t} : \n\t\t\t\tfunction (arr, fn) { // legacy\n\t\t\t\t\tvar i = 0, \n\t\t\t\t\t\tlen = arr.length;\n\t\t\t\t\tfor (; i < len; i++) {\n\t\t\t\t\t\tif (fn.call(arr[i], arr[i], i, arr) === false) {\n\t\t\t\t\t\t\treturn i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\n\t\t\t/**\n\t\t\t * Register Highcharts as a plugin in the respective framework\n\t\t\t */\n\t\t\t$.fn.highcharts = function () {\n\t\t\t\tvar constr = 'Chart', // default constructor\n\t\t\t\t\targs = arguments,\n\t\t\t\t\toptions,\n\t\t\t\t\tret,\n\t\t\t\t\tchart;\n\n\t\t\t\tif (isString(args[0])) {\n\t\t\t\t\tconstr = args[0];\n\t\t\t\t\targs = Array.prototype.slice.call(args, 1); \n\t\t\t\t}\n\t\t\t\toptions = args[0];\n\n\t\t\t\t// Create the chart\n\t\t\t\tif (options !== UNDEFINED) {\n\t\t\t\t\t/*jslint unused:false*/\n\t\t\t\t\toptions.chart = options.chart || {};\n\t\t\t\t\toptions.chart.renderTo = this[0];\n\t\t\t\t\tchart = new Highcharts[constr](options, args[1]);\n\t\t\t\t\tret = this;\n\t\t\t\t\t/*jslint unused:true*/\n\t\t\t\t}\n\n\t\t\t\t// When called without parameters or with the return argument, get a predefined chart\n\t\t\t\tif (options === UNDEFINED) {\n\t\t\t\t\tret = charts[attr(this[0], 'data-highcharts-chart')];\n\t\t\t\t}\t\n\n\t\t\t\treturn ret;\n\t\t\t};\n\n\t\t},\n\n\t\t\n\t\t/**\n\t\t * Downloads a script and executes a callback when done.\n\t\t * @param {String} scriptLocation\n\t\t * @param {Function} callback\n\t\t */\n\t\tgetScript: $.getScript,\n\t\t\n\t\t/**\n\t\t * Return the index of an item in an array, or -1 if not found\n\t\t */\n\t\tinArray: $.inArray,\n\t\t\n\t\t/**\n\t\t * A direct link to jQuery methods. MooTools and Prototype adapters must be implemented for each case of method.\n\t\t * @param {Object} elem The HTML element\n\t\t * @param {String} method Which method to run on the wrapped element\n\t\t */\n\t\tadapterRun: function (elem, method) {\n\t\t\treturn $(elem)[method]();\n\t\t},\n\t\n\t\t/**\n\t\t * Filter an array\n\t\t */\n\t\tgrep: $.grep,\n\t\n\t\t/**\n\t\t * Map an array\n\t\t * @param {Array} arr\n\t\t * @param {Function} fn\n\t\t */\n\t\tmap: function (arr, fn) {\n\t\t\t//return jQuery.map(arr, fn);\n\t\t\tvar results = [],\n\t\t\t\ti = 0,\n\t\t\t\tlen = arr.length;\n\t\t\tfor (; i < len; i++) {\n\t\t\t\tresults[i] = fn.call(arr[i], arr[i], i, arr);\n\t\t\t}\n\t\t\treturn results;\n\t\n\t\t},\n\t\n\t\t/**\n\t\t * Get the position of an element relative to the top left of the page\n\t\t */\n\t\toffset: function (el) {\n\t\t\treturn $(el).offset();\n\t\t},\n\t\n\t\t/**\n\t\t * Add an event listener\n\t\t * @param {Object} el A HTML element or custom object\n\t\t * @param {String} event The event type\n\t\t * @param {Function} fn The event handler\n\t\t */\n\t\taddEvent: function (el, event, fn) {\n\t\t\t$(el).bind(event, fn);\n\t\t},\n\t\n\t\t/**\n\t\t * Remove event added with addEvent\n\t\t * @param {Object} el The object\n\t\t * @param {String} eventType The event type. Leave blank to remove all events.\n\t\t * @param {Function} handler The function to remove\n\t\t */\n\t\tremoveEvent: function (el, eventType, handler) {\n\t\t\t// workaround for jQuery issue with unbinding custom events:\n\t\t\t// http://forum.jQuery.com/topic/javascript-error-when-unbinding-a-custom-event-using-jQuery-1-4-2\n\t\t\tvar func = doc.removeEventListener ? 'removeEventListener' : 'detachEvent';\n\t\t\tif (doc[func] && el && !el[func]) {\n\t\t\t\tel[func] = function () {};\n\t\t\t}\n\t\n\t\t\t$(el).unbind(eventType, handler);\n\t\t},\n\t\n\t\t/**\n\t\t * Fire an event on a custom object\n\t\t * @param {Object} el\n\t\t * @param {String} type\n\t\t * @param {Object} eventArguments\n\t\t * @param {Function} defaultFunction\n\t\t */\n\t\tfireEvent: function (el, type, eventArguments, defaultFunction) {\n\t\t\tvar event = $.Event(type),\n\t\t\t\tdetachedType = 'detached' + type,\n\t\t\t\tdefaultPrevented;\n\t\n\t\t\t// Remove warnings in Chrome when accessing layerX and layerY. Although Highcharts\n\t\t\t// never uses these properties, Chrome includes them in the default click event and\n\t\t\t// raises the warning when they are copied over in the extend statement below.\n\t\t\t//\n\t\t\t// To avoid problems in IE (see #1010) where we cannot delete the properties and avoid\n\t\t\t// testing if they are there (warning in chrome) the only option is to test if running IE.\n\t\t\tif (!isIE && eventArguments) {\n\t\t\t\tdelete eventArguments.layerX;\n\t\t\t\tdelete eventArguments.layerY;\n\t\t\t}\n\t\n\t\t\textend(event, eventArguments);\n\t\n\t\t\t// Prevent jQuery from triggering the object method that is named the\n\t\t\t// same as the event. For example, if the event is 'select', jQuery\n\t\t\t// attempts calling el.select and it goes into a loop.\n\t\t\tif (el[type]) {\n\t\t\t\tel[detachedType] = el[type];\n\t\t\t\tel[type] = null;\n\t\t\t}\n\t\n\t\t\t// Wrap preventDefault and stopPropagation in try/catch blocks in\n\t\t\t// order to prevent JS errors when cancelling events on non-DOM\n\t\t\t// objects. #615.\n\t\t\t/*jslint unparam: true*/\n\t\t\t$.each(['preventDefault', 'stopPropagation'], function (i, fn) {\n\t\t\t\tvar base = event[fn];\n\t\t\t\tevent[fn] = function () {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tbase.call(event);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (fn === 'preventDefault') {\n\t\t\t\t\t\t\tdefaultPrevented = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t});\n\t\t\t/*jslint unparam: false*/\n\t\n\t\t\t// trigger it\n\t\t\t$(el).trigger(event);\n\t\n\t\t\t// attach the method\n\t\t\tif (el[detachedType]) {\n\t\t\t\tel[type] = el[detachedType];\n\t\t\t\tel[detachedType] = null;\n\t\t\t}\n\t\n\t\t\tif (defaultFunction && !event.isDefaultPrevented() && !defaultPrevented) {\n\t\t\t\tdefaultFunction(event);\n\t\t\t}\n\t\t},\n\t\t\n\t\t/**\n\t\t * Extension method needed for MooTools\n\t\t */\n\t\twashMouseEvent: function (e) {\n\t\t\tvar ret = e.originalEvent || e;\n\t\t\t\n\t\t\t// computed by jQuery, needed by IE8\n\t\t\tif (ret.pageX === UNDEFINED) { // #1236\n\t\t\t\tret.pageX = e.pageX;\n\t\t\t\tret.pageY = e.pageY;\n\t\t\t}\n\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\n\t\t/**\n\t\t * Animate a HTML element or SVG element wrapper\n\t\t * @param {Object} el\n\t\t * @param {Object} params\n\t\t * @param {Object} options jQuery-like animation options: duration, easing, callback\n\t\t */\n\t\tanimate: function (el, params, options) {\n\t\t\tvar $el = $(el);\n\t\t\tif (!el.style) {\n\t\t\t\tel.style = {}; // #1881\n\t\t\t}\n\t\t\tif (params.d) {\n\t\t\t\tel.toD = params.d; // keep the array form for paths, used in $.fx.step.d\n\t\t\t\tparams.d = 1; // because in jQuery, animating to an array has a different meaning\n\t\t\t}\n\t\n\t\t\t$el.stop();\n\t\t\tif (params.opacity !== UNDEFINED && el.attr) {\n\t\t\t\tparams.opacity += 'px'; // force jQuery to use same logic as width and height (#2161)\n\t\t\t}\n\t\t\t$el.animate(params, options);\n\t\n\t\t},\n\t\t/**\n\t\t * Stop running animation\n\t\t */\n\t\tstop: function (el) {\n\t\t\t$(el).stop();\n\t\t}\n\t});\n}(win.jQuery));\n\n\n// check for a custom HighchartsAdapter defined prior to this file\nvar globalAdapter = win.HighchartsAdapter,\n\tadapter = globalAdapter || {};\n\t\n// Initialize the adapter\nif (globalAdapter) {\n\tglobalAdapter.init.call(globalAdapter, pathAnim);\n}\n\n\n// Utility functions. If the HighchartsAdapter is not defined, adapter is an empty object\n// and all the utility functions will be null. In that case they are populated by the\n// default adapters below.\nvar adapterRun = adapter.adapterRun,\n\tgetScript = adapter.getScript,\n\tinArray = adapter.inArray,\n\teach = adapter.each,\n\tgrep = adapter.grep,\n\toffset = adapter.offset,\n\tmap = adapter.map,\n\taddEvent = adapter.addEvent,\n\tremoveEvent = adapter.removeEvent,\n\tfireEvent = adapter.fireEvent,\n\twashMouseEvent = adapter.washMouseEvent,\n\tanimate = adapter.animate,\n\tstop = adapter.stop;\n\n\n\n/* ****************************************************************************\n * Handle the options                                                         *\n *****************************************************************************/\nvar\n\ndefaultLabelOptions = {\n\tenabled: true,\n\t// rotation: 0,\n\t// align: 'center',\n\tx: 0,\n\ty: 15,\n\t/*formatter: function () {\n\t\treturn this.value;\n\t},*/\n\tstyle: {\n\t\tcolor: '#666',\n\t\tcursor: 'default',\n\t\tfontSize: '11px',\n\t\tlineHeight: '14px'\n\t}\n};\n\ndefaultOptions = {\n\tcolors: ['#2f7ed8', '#0d233a', '#8bbc21', '#910000', '#1aadce', '#492970',\n\t\t'#f28f43', '#77a1e5', '#c42525', '#a6c96a'],\n\tsymbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n\tlang: {\n\t\tloading: 'Loading...',\n\t\tmonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July',\n\t\t\t\t'August', 'September', 'October', 'November', 'December'],\n\t\tshortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n\t\tweekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n\t\tdecimalPoint: '.',\n\t\tnumericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels\n\t\tresetZoom: 'Reset zoom',\n\t\tresetZoomTitle: 'Reset zoom level 1:1',\n\t\tthousandsSep: ','\n\t},\n\tglobal: {\n\t\tuseUTC: true,\n\t\tcanvasToolsURL: 'http://code.highcharts.com/3.0.6/modules/canvas-tools.js',\n\t\tVMLRadialGradientURL: 'http://code.highcharts.com/3.0.6/gfx/vml-radial-gradient.png'\n\t},\n\tchart: {\n\t\t//animation: true,\n\t\t//alignTicks: false,\n\t\t//reflow: true,\n\t\t//className: null,\n\t\t//events: { load, selection },\n\t\t//margin: [null],\n\t\t//marginTop: null,\n\t\t//marginRight: null,\n\t\t//marginBottom: null,\n\t\t//marginLeft: null,\n\t\tborderColor: '#4572A7',\n\t\t//borderWidth: 0,\n\t\tborderRadius: 5,\n\t\tdefaultSeriesType: 'line',\n\t\tignoreHiddenSeries: true,\n\t\t//inverted: false,\n\t\t//shadow: false,\n\t\tspacing: [10, 10, 15, 10],\n\t\t//spacingTop: 10,\n\t\t//spacingRight: 10,\n\t\t//spacingBottom: 15,\n\t\t//spacingLeft: 10,\n\t\tstyle: {\n\t\t\tfontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", Verdana, Arial, Helvetica, sans-serif', // default font\n\t\t\tfontSize: '12px'\n\t\t},\n\t\tbackgroundColor: '#FFFFFF',\n\t\t//plotBackgroundColor: null,\n\t\tplotBorderColor: '#C0C0C0',\n\t\t//plotBorderWidth: 0,\n\t\t//plotShadow: false,\n\t\t//zoomType: ''\n\t\tresetZoomButton: {\n\t\t\ttheme: {\n\t\t\t\tzIndex: 20\n\t\t\t},\n\t\t\tposition: {\n\t\t\t\talign: 'right',\n\t\t\t\tx: -10,\n\t\t\t\t//verticalAlign: 'top',\n\t\t\t\ty: 10\n\t\t\t}\n\t\t\t// relativeTo: 'plot'\n\t\t}\n\t},\n\ttitle: {\n\t\ttext: 'Chart title',\n\t\talign: 'center',\n\t\t// floating: false,\n\t\tmargin: 15,\n\t\t// x: 0,\n\t\t// verticalAlign: 'top',\n\t\t// y: null,\n\t\tstyle: {\n\t\t\tcolor: '#274b6d',//#3E576F',\n\t\t\tfontSize: '16px'\n\t\t}\n\n\t},\n\tsubtitle: {\n\t\ttext: '',\n\t\talign: 'center',\n\t\t// floating: false\n\t\t// x: 0,\n\t\t// verticalAlign: 'top',\n\t\t// y: null,\n\t\tstyle: {\n\t\t\tcolor: '#4d759e'\n\t\t}\n\t},\n\n\tplotOptions: {\n\t\tline: { // base series options\n\t\t\tallowPointSelect: false,\n\t\t\tshowCheckbox: false,\n\t\t\tanimation: {\n\t\t\t\tduration: 1000\n\t\t\t},\n\t\t\t//connectNulls: false,\n\t\t\t//cursor: 'default',\n\t\t\t//clip: true,\n\t\t\t//dashStyle: null,\n\t\t\t//enableMouseTracking: true,\n\t\t\tevents: {},\n\t\t\t//legendIndex: 0,\n\t\t\tlineWidth: 2,\n\t\t\t//shadow: false,\n\t\t\t// stacking: null,\n\t\t\tmarker: {\n\t\t\t\tenabled: true,\n\t\t\t\t//symbol: null,\n\t\t\t\tlineWidth: 0,\n\t\t\t\tradius: 4,\n\t\t\t\tlineColor: '#FFFFFF',\n\t\t\t\t//fillColor: null,\n\t\t\t\tstates: { // states for a single point\n\t\t\t\t\thover: {\n\t\t\t\t\t\tenabled: true\n\t\t\t\t\t\t//radius: base + 2\n\t\t\t\t\t},\n\t\t\t\t\tselect: {\n\t\t\t\t\t\tfillColor: '#FFFFFF',\n\t\t\t\t\t\tlineColor: '#000000',\n\t\t\t\t\t\tlineWidth: 2\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tpoint: {\n\t\t\t\tevents: {}\n\t\t\t},\n\t\t\tdataLabels: merge(defaultLabelOptions, {\n\t\t\t\talign: 'center',\n\t\t\t\tenabled: false,\n\t\t\t\tformatter: function () {\n\t\t\t\t\treturn this.y === null ? '' : numberFormat(this.y, -1);\n\t\t\t\t},\n\t\t\t\tverticalAlign: 'bottom', // above singular point\n\t\t\t\ty: 0\n\t\t\t\t// backgroundColor: undefined,\n\t\t\t\t// borderColor: undefined,\n\t\t\t\t// borderRadius: undefined,\n\t\t\t\t// borderWidth: undefined,\n\t\t\t\t// padding: 3,\n\t\t\t\t// shadow: false\n\t\t\t}),\n\t\t\tcropThreshold: 300, // draw points outside the plot area when the number of points is less than this\n\t\t\tpointRange: 0,\n\t\t\t//pointStart: 0,\n\t\t\t//pointInterval: 1,\n\t\t\tshowInLegend: true,\n\t\t\tstates: { // states for the entire series\n\t\t\t\thover: {\n\t\t\t\t\t//enabled: false,\n\t\t\t\t\t//lineWidth: base + 1,\n\t\t\t\t\tmarker: {\n\t\t\t\t\t\t// lineWidth: base + 1,\n\t\t\t\t\t\t// radius: base + 1\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tselect: {\n\t\t\t\t\tmarker: {}\n\t\t\t\t}\n\t\t\t},\n\t\t\tstickyTracking: true\n\t\t\t//tooltip: {\n\t\t\t\t//pointFormat: '<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.y}</b>'\n\t\t\t\t//valueDecimals: null,\n\t\t\t\t//xDateFormat: '%A, %b %e, %Y',\n\t\t\t\t//valuePrefix: '',\n\t\t\t\t//ySuffix: ''\t\t\t\t\n\t\t\t//}\n\t\t\t// turboThreshold: 1000\n\t\t\t// zIndex: null\n\t\t}\n\t},\n\tlabels: {\n\t\t//items: [],\n\t\tstyle: {\n\t\t\t//font: defaultFont,\n\t\t\tposition: ABSOLUTE,\n\t\t\tcolor: '#3E576F'\n\t\t}\n\t},\n\tlegend: {\n\t\tenabled: true,\n\t\talign: 'center',\n\t\t//floating: false,\n\t\tlayout: 'horizontal',\n\t\tlabelFormatter: function () {\n\t\t\treturn this.name;\n\t\t},\n\t\tborderWidth: 1,\n\t\tborderColor: '#909090',\n\t\tborderRadius: 5,\n\t\tnavigation: {\n\t\t\t// animation: true,\n\t\t\tactiveColor: '#274b6d',\n\t\t\t// arrowSize: 12\n\t\t\tinactiveColor: '#CCC'\n\t\t\t// style: {} // text styles\n\t\t},\n\t\t// margin: 10,\n\t\t// reversed: false,\n\t\tshadow: false,\n\t\t// backgroundColor: null,\n\t\t/*style: {\n\t\t\tpadding: '5px'\n\t\t},*/\n\t\titemStyle: {\n\t\t\tcursor: 'pointer',\n\t\t\tcolor: '#274b6d',\n\t\t\tfontSize: '12px'\n\t\t},\n\t\titemHoverStyle: {\n\t\t\t//cursor: 'pointer', removed as of #601\n\t\t\tcolor: '#000'\n\t\t},\n\t\titemHiddenStyle: {\n\t\t\tcolor: '#CCC'\n\t\t},\n\t\titemCheckboxStyle: {\n\t\t\tposition: ABSOLUTE,\n\t\t\twidth: '13px', // for IE precision\n\t\t\theight: '13px'\n\t\t},\n\t\t// itemWidth: undefined,\n\t\tsymbolWidth: 16,\n\t\tsymbolPadding: 5,\n\t\tverticalAlign: 'bottom',\n\t\t// width: undefined,\n\t\tx: 0,\n\t\ty: 0,\n\t\ttitle: {\n\t\t\t//text: null,\n\t\t\tstyle: {\n\t\t\t\tfontWeight: 'bold'\n\t\t\t}\n\t\t}\t\t\t\n\t},\n\n\tloading: {\n\t\t// hideDuration: 100,\n\t\tlabelStyle: {\n\t\t\tfontWeight: 'bold',\n\t\t\tposition: RELATIVE,\n\t\t\ttop: '1em'\n\t\t},\n\t\t// showDuration: 0,\n\t\tstyle: {\n\t\t\tposition: ABSOLUTE,\n\t\t\tbackgroundColor: 'white',\n\t\t\topacity: 0.5,\n\t\t\ttextAlign: 'center'\n\t\t}\n\t},\n\n\ttooltip: {\n\t\tenabled: true,\n\t\tanimation: hasSVG,\n\t\t//crosshairs: null,\n\t\tbackgroundColor: 'rgba(255, 255, 255, .85)',\n\t\tborderWidth: 1,\n\t\tborderRadius: 3,\n\t\tdateTimeLabelFormats: { \n\t\t\tmillisecond: '%A, %b %e, %H:%M:%S.%L',\n\t\t\tsecond: '%A, %b %e, %H:%M:%S',\n\t\t\tminute: '%A, %b %e, %H:%M',\n\t\t\thour: '%A, %b %e, %H:%M',\n\t\t\tday: '%A, %b %e, %Y',\n\t\t\tweek: 'Week from %A, %b %e, %Y',\n\t\t\tmonth: '%B %Y',\n\t\t\tyear: '%Y'\n\t\t},\n\t\t//formatter: defaultFormatter,\n\t\theaderFormat: '<span style=\"font-size: 10px\">{point.key}</span><br/>',\n\t\tpointFormat: '<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.y}</b><br/>',\n\t\tshadow: true,\n\t\t//shared: false,\n\t\tsnap: isTouchDevice ? 25 : 10,\n\t\tstyle: {\n\t\t\tcolor: '#333333',\n\t\t\tcursor: 'default',\n\t\t\tfontSize: '12px',\n\t\t\tpadding: '8px',\n\t\t\twhiteSpace: 'nowrap'\n\t\t}\n\t\t//xDateFormat: '%A, %b %e, %Y',\n\t\t//valueDecimals: null,\n\t\t//valuePrefix: '',\n\t\t//valueSuffix: ''\n\t},\n\n\tcredits: {\n\t\tenabled: true,\n\t\ttext: 'Highcharts.com',\n\t\thref: 'http://www.highcharts.com',\n\t\tposition: {\n\t\t\talign: 'right',\n\t\t\tx: -10,\n\t\t\tverticalAlign: 'bottom',\n\t\t\ty: -5\n\t\t},\n\t\tstyle: {\n\t\t\tcursor: 'pointer',\n\t\t\tcolor: '#909090',\n\t\t\tfontSize: '9px'\n\t\t}\n\t}\n};\n\n\n\n\n// Series defaults\nvar defaultPlotOptions = defaultOptions.plotOptions,\n\tdefaultSeriesOptions = defaultPlotOptions.line;\n\n// set the default time methods\nsetTimeMethods();\n\n\n\n/**\n * Set the time methods globally based on the useUTC option. Time method can be either\n * local time or UTC (default).\n */\nfunction setTimeMethods() {\n\tvar useUTC = defaultOptions.global.useUTC,\n\t\tGET = useUTC ? 'getUTC' : 'get',\n\t\tSET = useUTC ? 'setUTC' : 'set';\n\n\tmakeTime = useUTC ? Date.UTC : function (year, month, date, hours, minutes, seconds) {\n\t\treturn new Date(\n\t\t\tyear,\n\t\t\tmonth,\n\t\t\tpick(date, 1),\n\t\t\tpick(hours, 0),\n\t\t\tpick(minutes, 0),\n\t\t\tpick(seconds, 0)\n\t\t).getTime();\n\t};\n\tgetMinutes =  GET + 'Minutes';\n\tgetHours =    GET + 'Hours';\n\tgetDay =      GET + 'Day';\n\tgetDate =     GET + 'Date';\n\tgetMonth =    GET + 'Month';\n\tgetFullYear = GET + 'FullYear';\n\tsetMinutes =  SET + 'Minutes';\n\tsetHours =    SET + 'Hours';\n\tsetDate =     SET + 'Date';\n\tsetMonth =    SET + 'Month';\n\tsetFullYear = SET + 'FullYear';\n\n}\n\n/**\n * Merge the default options with custom options and return the new options structure\n * @param {Object} options The new custom options\n */\nfunction setOptions(options) {\n\t\n\t// Pull out axis options and apply them to the respective default axis options \n\t/*defaultXAxisOptions = merge(defaultXAxisOptions, options.xAxis);\n\tdefaultYAxisOptions = merge(defaultYAxisOptions, options.yAxis);\n\toptions.xAxis = options.yAxis = UNDEFINED;*/\n\t\n\t// Merge in the default options\n\tdefaultOptions = merge(defaultOptions, options);\n\t\n\t// Apply UTC\n\tsetTimeMethods();\n\n\treturn defaultOptions;\n}\n\n/**\n * Get the updated default options. Merely exposing defaultOptions for outside modules\n * isn't enough because the setOptions method creates a new object.\n */\nfunction getOptions() {\n\treturn defaultOptions;\n}\n\n\n/**\n * Handle color operations. The object methods are chainable.\n * @param {String} input The input color in either rbga or hex format\n */\nvar Color = function (input) {\n\t// declare variables\n\tvar rgba = [], result, stops;\n\n\t/**\n\t * Parse the input color to rgba array\n\t * @param {String} input\n\t */\n\tfunction init(input) {\n\n\t\t// Gradients\n\t\tif (input && input.stops) {\n\t\t\tstops = map(input.stops, function (stop) {\n\t\t\t\treturn Color(stop[1]);\n\t\t\t});\n\n\t\t// Solid colors\n\t\t} else {\n\t\t\t// rgba\n\t\t\tresult = /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/.exec(input);\n\t\t\tif (result) {\n\t\t\t\trgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];\n\t\t\t} else { \n\t\t\t\t// hex\n\t\t\t\tresult = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(input);\n\t\t\t\tif (result) {\n\t\t\t\t\trgba = [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];\n\t\t\t\t} else {\n\t\t\t\t\t// rgb\n\t\t\t\t\tresult = /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(input);\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\trgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\t\n\n\t}\n\t/**\n\t * Return the color a specified format\n\t * @param {String} format\n\t */\n\tfunction get(format) {\n\t\tvar ret;\n\n\t\tif (stops) {\n\t\t\tret = merge(input);\n\t\t\tret.stops = [].concat(ret.stops);\n\t\t\teach(stops, function (stop, i) {\n\t\t\t\tret.stops[i] = [ret.stops[i][0], stop.get(format)];\n\t\t\t});\n\n\t\t// it's NaN if gradient colors on a column chart\n\t\t} else if (rgba && !isNaN(rgba[0])) {\n\t\t\tif (format === 'rgb') {\n\t\t\t\tret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n\t\t\t} else if (format === 'a') {\n\t\t\t\tret = rgba[3];\n\t\t\t} else {\n\t\t\t\tret = 'rgba(' + rgba.join(',') + ')';\n\t\t\t}\n\t\t} else {\n\t\t\tret = input;\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/**\n\t * Brighten the color\n\t * @param {Number} alpha\n\t */\n\tfunction brighten(alpha) {\n\t\tif (stops) {\n\t\t\teach(stops, function (stop) {\n\t\t\t\tstop.brighten(alpha);\n\t\t\t});\n\t\t\n\t\t} else if (isNumber(alpha) && alpha !== 0) {\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < 3; i++) {\n\t\t\t\trgba[i] += pInt(alpha * 255);\n\n\t\t\t\tif (rgba[i] < 0) {\n\t\t\t\t\trgba[i] = 0;\n\t\t\t\t}\n\t\t\t\tif (rgba[i] > 255) {\n\t\t\t\t\trgba[i] = 255;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\t/**\n\t * Set the color's opacity to a given alpha value\n\t * @param {Number} alpha\n\t */\n\tfunction setOpacity(alpha) {\n\t\trgba[3] = alpha;\n\t\treturn this;\n\t}\n\n\t// initialize: parse the input\n\tinit(input);\n\n\t// public methods\n\treturn {\n\t\tget: get,\n\t\tbrighten: brighten,\n\t\trgba: rgba,\n\t\tsetOpacity: setOpacity\n\t};\n};\n\n\n/**\n * A wrapper object for SVG elements\n */\nfunction SVGElement() {}\n\nSVGElement.prototype = {\n\t/**\n\t * Initialize the SVG renderer\n\t * @param {Object} renderer\n\t * @param {String} nodeName\n\t */\n\tinit: function (renderer, nodeName) {\n\t\tvar wrapper = this;\n\t\twrapper.element = nodeName === 'span' ?\n\t\t\tcreateElement(nodeName) :\n\t\t\tdoc.createElementNS(SVG_NS, nodeName);\n\t\twrapper.renderer = renderer;\n\t\t/**\n\t\t * A collection of attribute setters. These methods, if defined, are called right before a certain\n\t\t * attribute is set on an element wrapper. Returning false prevents the default attribute\n\t\t * setter to run. Returning a value causes the default setter to set that value. Used in\n\t\t * Renderer.label.\n\t\t */\n\t\twrapper.attrSetters = {};\n\t},\n\t/**\n\t * Default base for animation\n\t */\n\topacity: 1,\n\t/**\n\t * Animate a given attribute\n\t * @param {Object} params\n\t * @param {Number} options The same options as in jQuery animation\n\t * @param {Function} complete Function to perform at the end of animation\n\t */\n\tanimate: function (params, options, complete) {\n\t\tvar animOptions = pick(options, globalAnimation, true);\n\t\tstop(this); // stop regardless of animation actually running, or reverting to .attr (#607)\n\t\tif (animOptions) {\n\t\t\tanimOptions = merge(animOptions);\n\t\t\tif (complete) { // allows using a callback with the global animation without overwriting it\n\t\t\t\tanimOptions.complete = complete;\n\t\t\t}\n\t\t\tanimate(this, params, animOptions);\n\t\t} else {\n\t\t\tthis.attr(params);\n\t\t\tif (complete) {\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\t},\n\t/**\n\t * Set or get a given attribute\n\t * @param {Object|String} hash\n\t * @param {Mixed|Undefined} val\n\t */\n\tattr: function (hash, val) {\n\t\tvar wrapper = this,\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tresult,\n\t\t\ti,\n\t\t\tchild,\n\t\t\telement = wrapper.element,\n\t\t\tnodeName = element.nodeName.toLowerCase(), // Android2 requires lower for \"text\"\n\t\t\trenderer = wrapper.renderer,\n\t\t\tskipAttr,\n\t\t\ttitleNode,\n\t\t\tattrSetters = wrapper.attrSetters,\n\t\t\tshadows = wrapper.shadows,\n\t\t\thasSetSymbolSize,\n\t\t\tdoTransform,\n\t\t\tret = wrapper;\n\n\t\t// single key-value pair\n\t\tif (isString(hash) && defined(val)) {\n\t\t\tkey = hash;\n\t\t\thash = {};\n\t\t\thash[key] = val;\n\t\t}\n\n\t\t// used as a getter: first argument is a string, second is undefined\n\t\tif (isString(hash)) {\n\t\t\tkey = hash;\n\t\t\tif (nodeName === 'circle') {\n\t\t\t\tkey = { x: 'cx', y: 'cy' }[key] || key;\n\t\t\t} else if (key === 'strokeWidth') {\n\t\t\t\tkey = 'stroke-width';\n\t\t\t}\n\t\t\tret = attr(element, key) || wrapper[key] || 0;\n\t\t\tif (key !== 'd' && key !== 'visibility' && key !== 'fill') { // 'd' is string in animation step\n\t\t\t\tret = parseFloat(ret);\n\t\t\t}\n\n\t\t// setter\n\t\t} else {\n\n\t\t\tfor (key in hash) {\n\t\t\t\tskipAttr = false; // reset\n\t\t\t\tvalue = hash[key];\n\n\t\t\t\t// check for a specific attribute setter\n\t\t\t\tresult = attrSetters[key] && attrSetters[key].call(wrapper, value, key);\n\n\t\t\t\tif (result !== false) {\n\t\t\t\t\tif (result !== UNDEFINED) {\n\t\t\t\t\t\tvalue = result; // the attribute setter has returned a new value to set\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// paths\n\t\t\t\t\tif (key === 'd') {\n\t\t\t\t\t\tif (value && value.join) { // join path\n\t\t\t\t\t\t\tvalue = value.join(' ');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (/(NaN| {2}|^$)/.test(value)) {\n\t\t\t\t\t\t\tvalue = 'M 0 0';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//wrapper.d = value; // shortcut for animations\n\n\t\t\t\t\t// update child tspans x values\n\t\t\t\t\t} else if (key === 'x' && nodeName === 'text') {\n\t\t\t\t\t\tfor (i = 0; i < element.childNodes.length; i++) {\n\t\t\t\t\t\t\tchild = element.childNodes[i];\n\t\t\t\t\t\t\t// if the x values are equal, the tspan represents a linebreak\n\t\t\t\t\t\t\tif (attr(child, 'x') === attr(element, 'x')) {\n\t\t\t\t\t\t\t\t//child.setAttribute('x', value);\n\t\t\t\t\t\t\t\tattr(child, 'x', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (wrapper.rotation && (key === 'x' || key === 'y')) {\n\t\t\t\t\t\tdoTransform = true;\n\n\t\t\t\t\t// apply gradients\n\t\t\t\t\t} else if (key === 'fill') {\n\t\t\t\t\t\tvalue = renderer.color(value, element, key);\n\n\t\t\t\t\t// circle x and y\n\t\t\t\t\t} else if (nodeName === 'circle' && (key === 'x' || key === 'y')) {\n\t\t\t\t\t\tkey = { x: 'cx', y: 'cy' }[key] || key;\n\n\t\t\t\t\t// rectangle border radius\n\t\t\t\t\t} else if (nodeName === 'rect' && key === 'r') {\n\t\t\t\t\t\tattr(element, {\n\t\t\t\t\t\t\trx: value,\n\t\t\t\t\t\t\try: value\n\t\t\t\t\t\t});\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// translation and text rotation\n\t\t\t\t\t} else if (key === 'translateX' || key === 'translateY' || key === 'rotation' ||\n\t\t\t\t\t\t\tkey === 'verticalAlign' || key === 'scaleX' || key === 'scaleY') {\n\t\t\t\t\t\tdoTransform = true;\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// apply opacity as subnode (required by legacy WebKit and Batik)\n\t\t\t\t\t} else if (key === 'stroke') {\n\t\t\t\t\t\tvalue = renderer.color(value, element, key);\n\n\t\t\t\t\t// emulate VML's dashstyle implementation\n\t\t\t\t\t} else if (key === 'dashstyle') {\n\t\t\t\t\t\tkey = 'stroke-dasharray';\n\t\t\t\t\t\tvalue = value && value.toLowerCase();\n\t\t\t\t\t\tif (value === 'solid') {\n\t\t\t\t\t\t\tvalue = NONE;\n\t\t\t\t\t\t} else if (value) {\n\t\t\t\t\t\t\tvalue = value\n\t\t\t\t\t\t\t\t.replace('shortdashdotdot', '3,1,1,1,1,1,')\n\t\t\t\t\t\t\t\t.replace('shortdashdot', '3,1,1,1')\n\t\t\t\t\t\t\t\t.replace('shortdot', '1,1,')\n\t\t\t\t\t\t\t\t.replace('shortdash', '3,1,')\n\t\t\t\t\t\t\t\t.replace('longdash', '8,3,')\n\t\t\t\t\t\t\t\t.replace(/dot/g, '1,3,')\n\t\t\t\t\t\t\t\t.replace('dash', '4,3,')\n\t\t\t\t\t\t\t\t.replace(/,$/, '')\n\t\t\t\t\t\t\t\t.split(','); // ending comma\n\n\t\t\t\t\t\t\ti = value.length;\n\t\t\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\t\t\tvalue[i] = pInt(value[i]) * pick(hash['stroke-width'], wrapper['stroke-width']);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvalue = value.join(',');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// IE9/MooTools combo: MooTools returns objects instead of numbers and IE9 Beta 2\n\t\t\t\t\t// is unable to cast them. Test again with final IE9.\n\t\t\t\t\t} else if (key === 'width') {\n\t\t\t\t\t\tvalue = pInt(value);\n\n\t\t\t\t\t// Text alignment\n\t\t\t\t\t} else if (key === 'align') {\n\t\t\t\t\t\tkey = 'text-anchor';\n\t\t\t\t\t\tvalue = { left: 'start', center: 'middle', right: 'end' }[value];\n\n\t\t\t\t\t// Title requires a subnode, #431\n\t\t\t\t\t} else if (key === 'title') {\n\t\t\t\t\t\ttitleNode = element.getElementsByTagName('title')[0];\n\t\t\t\t\t\tif (!titleNode) {\n\t\t\t\t\t\t\ttitleNode = doc.createElementNS(SVG_NS, 'title');\n\t\t\t\t\t\t\telement.appendChild(titleNode);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitleNode.textContent = value;\n\t\t\t\t\t}\n\n\t\t\t\t\t// jQuery animate changes case\n\t\t\t\t\tif (key === 'strokeWidth') {\n\t\t\t\t\t\tkey = 'stroke-width';\n\t\t\t\t\t}\n\n\t\t\t\t\t// In Chrome/Win < 6 as well as Batik, the stroke attribute can't be set when the stroke-\n\t\t\t\t\t// width is 0. #1369\n\t\t\t\t\tif (key === 'stroke-width' || key === 'stroke') {\n\t\t\t\t\t\twrapper[key] = value;\n\t\t\t\t\t\t// Only apply the stroke attribute if the stroke width is defined and larger than 0\n\t\t\t\t\t\tif (wrapper.stroke && wrapper['stroke-width']) {\n\t\t\t\t\t\t\tattr(element, 'stroke', wrapper.stroke);\n\t\t\t\t\t\t\tattr(element, 'stroke-width', wrapper['stroke-width']);\n\t\t\t\t\t\t\twrapper.hasStroke = true;\n\t\t\t\t\t\t} else if (key === 'stroke-width' && value === 0 && wrapper.hasStroke) {\n\t\t\t\t\t\t\telement.removeAttribute('stroke');\n\t\t\t\t\t\t\twrapper.hasStroke = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tskipAttr = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// symbols\n\t\t\t\t\tif (wrapper.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {\n\n\n\t\t\t\t\t\tif (!hasSetSymbolSize) {\n\t\t\t\t\t\t\twrapper.symbolAttr(hash);\n\t\t\t\t\t\t\thasSetSymbolSize = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tskipAttr = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// let the shadow follow the main element\n\t\t\t\t\tif (shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {\n\t\t\t\t\t\ti = shadows.length;\n\t\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\t\tattr(\n\t\t\t\t\t\t\t\tshadows[i],\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\tkey === 'height' ?\n\t\t\t\t\t\t\t\t\tmathMax(value - (shadows[i].cutHeight || 0), 0) :\n\t\t\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// validate heights\n\t\t\t\t\tif ((key === 'width' || key === 'height') && nodeName === 'rect' && value < 0) {\n\t\t\t\t\t\tvalue = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Record for animation and quick access without polling the DOM\n\t\t\t\t\twrapper[key] = value;\n\n\n\t\t\t\t\tif (key === 'text') {\n\t\t\t\t\t\t// Delete bBox memo when the text changes\n\t\t\t\t\t\tif (value !== wrapper.textStr) {\n\t\t\t\t\t\t\tdelete wrapper.bBox;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twrapper.textStr = value;\n\t\t\t\t\t\tif (wrapper.added) {\n\t\t\t\t\t\t\trenderer.buildText(wrapper);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (!skipAttr) {\n\t\t\t\t\t\tattr(element, key, value);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Update transform. Do this outside the loop to prevent redundant updating for batch setting\n\t\t\t// of attributes.\n\t\t\tif (doTransform) {\n\t\t\t\twrapper.updateTransform();\n\t\t\t}\n\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\n\t/**\n\t * Add a class name to an element\n\t */\n\taddClass: function (className) {\n\t\tvar element = this.element,\n\t\t\tcurrentClassName = attr(element, 'class') || '';\n\n\t\tif (currentClassName.indexOf(className) === -1) {\n\t\t\tattr(element, 'class', currentClassName + ' ' + className);\n\t\t}\n\t\treturn this;\n\t},\n\t/* hasClass and removeClass are not (yet) needed\n\thasClass: function (className) {\n\t\treturn attr(this.element, 'class').indexOf(className) !== -1;\n\t},\n\tremoveClass: function (className) {\n\t\tattr(this.element, 'class', attr(this.element, 'class').replace(className, ''));\n\t\treturn this;\n\t},\n\t*/\n\n\t/**\n\t * If one of the symbol size affecting parameters are changed,\n\t * check all the others only once for each call to an element's\n\t * .attr() method\n\t * @param {Object} hash\n\t */\n\tsymbolAttr: function (hash) {\n\t\tvar wrapper = this;\n\n\t\teach(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function (key) {\n\t\t\twrapper[key] = pick(hash[key], wrapper[key]);\n\t\t});\n\n\t\twrapper.attr({\n\t\t\td: wrapper.renderer.symbols[wrapper.symbolName](\n\t\t\t\twrapper.x,\n\t\t\t\twrapper.y,\n\t\t\t\twrapper.width,\n\t\t\t\twrapper.height,\n\t\t\t\twrapper\n\t\t\t)\n\t\t});\n\t},\n\n\t/**\n\t * Apply a clipping path to this object\n\t * @param {String} id\n\t */\n\tclip: function (clipRect) {\n\t\treturn this.attr('clip-path', clipRect ? 'url(' + this.renderer.url + '#' + clipRect.id + ')' : NONE);\n\t},\n\n\t/**\n\t * Calculate the coordinates needed for drawing a rectangle crisply and return the\n\t * calculated attributes\n\t * @param {Number} strokeWidth\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} width\n\t * @param {Number} height\n\t */\n\tcrisp: function (strokeWidth, x, y, width, height) {\n\n\t\tvar wrapper = this,\n\t\t\tkey,\n\t\t\tattribs = {},\n\t\t\tvalues = {},\n\t\t\tnormalizer;\n\n\t\tstrokeWidth = strokeWidth || wrapper.strokeWidth || (wrapper.attr && wrapper.attr('stroke-width')) || 0;\n\t\tnormalizer = mathRound(strokeWidth) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors\n\n\t\t// normalize for crisp edges\n\t\tvalues.x = mathFloor(x || wrapper.x || 0) + normalizer;\n\t\tvalues.y = mathFloor(y || wrapper.y || 0) + normalizer;\n\t\tvalues.width = mathFloor((width || wrapper.width || 0) - 2 * normalizer);\n\t\tvalues.height = mathFloor((height || wrapper.height || 0) - 2 * normalizer);\n\t\tvalues.strokeWidth = strokeWidth;\n\n\t\tfor (key in values) {\n\t\t\tif (wrapper[key] !== values[key]) { // only set attribute if changed\n\t\t\t\twrapper[key] = attribs[key] = values[key];\n\t\t\t}\n\t\t}\n\n\t\treturn attribs;\n\t},\n\n\t/**\n\t * Set styles for the element\n\t * @param {Object} styles\n\t */\n\tcss: function (styles) {\n\t\t/*jslint unparam: true*//* allow unused param a in the regexp function below */\n\t\tvar elemWrapper = this,\n\t\t\telem = elemWrapper.element,\n\t\t\ttextWidth = styles && styles.width && elem.nodeName.toLowerCase() === 'text',\n\t\t\tn,\n\t\t\tserializedCss = '',\n\t\t\thyphenate = function (a, b) { return '-' + b.toLowerCase(); };\n\t\t/*jslint unparam: false*/\n\n\t\t// convert legacy\n\t\tif (styles && styles.color) {\n\t\t\tstyles.fill = styles.color;\n\t\t}\n\n\t\t// Merge the new styles with the old ones\n\t\tstyles = extend(\n\t\t\telemWrapper.styles,\n\t\t\tstyles\n\t\t);\n\n\t\t// store object\n\t\telemWrapper.styles = styles;\n\n\n\t\t// Don't handle line wrap on canvas\n\t\tif (useCanVG && textWidth) {\n\t\t\tdelete styles.width;\n\t\t}\n\n\t\t// serialize and set style attribute\n\t\tif (isIE && !hasSVG) { // legacy IE doesn't support setting style attribute\n\t\t\tif (textWidth) {\n\t\t\t\tdelete styles.width;\n\t\t\t}\n\t\t\tcss(elemWrapper.element, styles);\n\t\t} else {\n\t\t\tfor (n in styles) {\n\t\t\t\tserializedCss += n.replace(/([A-Z])/g, hyphenate) + ':' + styles[n] + ';';\n\t\t\t}\n\t\t\tattr(elem, 'style', serializedCss); // #1881\n\t\t}\n\n\n\t\t// re-build text\n\t\tif (textWidth && elemWrapper.added) {\n\t\t\telemWrapper.renderer.buildText(elemWrapper);\n\t\t}\n\n\t\treturn elemWrapper;\n\t},\n\n\t/**\n\t * Add an event listener\n\t * @param {String} eventType\n\t * @param {Function} handler\n\t */\n\ton: function (eventType, handler) {\n\t\tvar svgElement = this,\n\t\t\telement = svgElement.element;\n\t\t\n\t\t// touch\n\t\tif (hasTouch && eventType === 'click') {\n\t\t\telement.ontouchstart = function (e) {\t\t\t\n\t\t\t\tsvgElement.touchEventFired = Date.now();\t\t\t\t\n\t\t\t\te.preventDefault();\n\t\t\t\thandler.call(element, e);\n\t\t\t};\n\t\t\telement.onclick = function (e) {\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tif (userAgent.indexOf('Android') === -1 || Date.now() - (svgElement.touchEventFired || 0) > 1100) { // #2269\n\t\t\t\t\thandler.call(element, e);\n\t\t\t\t}\n\t\t\t};\t\t\t\n\t\t} else {\n\t\t\t// simplest possible event model for internal use\n\t\t\telement['on' + eventType] = handler;\n\t\t}\n\t\treturn this;\n\t},\n\n\t/**\n\t * Set the coordinates needed to draw a consistent radial gradient across\n\t * pie slices regardless of positioning inside the chart. The format is\n\t * [centerX, centerY, diameter] in pixels.\n\t */\n\tsetRadialReference: function (coordinates) {\n\t\tthis.element.radialReference = coordinates;\n\t\treturn this;\n\t},\n\n\t/**\n\t * Move an object and its children by x and y values\n\t * @param {Number} x\n\t * @param {Number} y\n\t */\n\ttranslate: function (x, y) {\n\t\treturn this.attr({\n\t\t\ttranslateX: x,\n\t\t\ttranslateY: y\n\t\t});\n\t},\n\n\t/**\n\t * Invert a group, rotate and flip\n\t */\n\tinvert: function () {\n\t\tvar wrapper = this;\n\t\twrapper.inverted = true;\n\t\twrapper.updateTransform();\n\t\treturn wrapper;\n\t},\n\n\t/**\n\t * Apply CSS to HTML elements. This is used in text within SVG rendering and\n\t * by the VML renderer\n\t */\n\thtmlCss: function (styles) {\n\t\tvar wrapper = this,\n\t\t\telement = wrapper.element,\n\t\t\ttextWidth = styles && element.tagName === 'SPAN' && styles.width;\n\n\t\tif (textWidth) {\n\t\t\tdelete styles.width;\n\t\t\twrapper.textWidth = textWidth;\n\t\t\twrapper.updateTransform();\n\t\t}\n\n\t\twrapper.styles = extend(wrapper.styles, styles);\n\t\tcss(wrapper.element, styles);\n\n\t\treturn wrapper;\n\t},\n\n\n\n\t/**\n\t * VML and useHTML method for calculating the bounding box based on offsets\n\t * @param {Boolean} refresh Whether to force a fresh value from the DOM or to\n\t * use the cached value\n\t *\n\t * @return {Object} A hash containing values for x, y, width and height\n\t */\n\n\thtmlGetBBox: function () {\n\t\tvar wrapper = this,\n\t\t\telement = wrapper.element,\n\t\t\tbBox = wrapper.bBox;\n\n\t\t// faking getBBox in exported SVG in legacy IE\n\t\tif (!bBox) {\n\t\t\t// faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)\n\t\t\tif (element.nodeName === 'text') {\n\t\t\t\telement.style.position = ABSOLUTE;\n\t\t\t}\n\n\t\t\tbBox = wrapper.bBox = {\n\t\t\t\tx: element.offsetLeft,\n\t\t\t\ty: element.offsetTop,\n\t\t\t\twidth: element.offsetWidth,\n\t\t\t\theight: element.offsetHeight\n\t\t\t};\n\t\t}\n\n\t\treturn bBox;\n\t},\n\n\t/**\n\t * VML override private method to update elements based on internal\n\t * properties based on SVG transform\n\t */\n\thtmlUpdateTransform: function () {\n\t\t// aligning non added elements is expensive\n\t\tif (!this.added) {\n\t\t\tthis.alignOnAdd = true;\n\t\t\treturn;\n\t\t}\n\n\t\tvar wrapper = this,\n\t\t\trenderer = wrapper.renderer,\n\t\t\telem = wrapper.element,\n\t\t\ttranslateX = wrapper.translateX || 0,\n\t\t\ttranslateY = wrapper.translateY || 0,\n\t\t\tx = wrapper.x || 0,\n\t\t\ty = wrapper.y || 0,\n\t\t\talign = wrapper.textAlign || 'left',\n\t\t\talignCorrection = { left: 0, center: 0.5, right: 1 }[align],\n\t\t\tnonLeft = align && align !== 'left',\n\t\t\tshadows = wrapper.shadows;\n\n\t\t// apply translate\n\t\tcss(elem, {\n\t\t\tmarginLeft: translateX,\n\t\t\tmarginTop: translateY\n\t\t});\n\t\tif (shadows) { // used in labels/tooltip\n\t\t\teach(shadows, function (shadow) {\n\t\t\t\tcss(shadow, {\n\t\t\t\t\tmarginLeft: translateX + 1,\n\t\t\t\t\tmarginTop: translateY + 1\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// apply inversion\n\t\tif (wrapper.inverted) { // wrapper is a group\n\t\t\teach(elem.childNodes, function (child) {\n\t\t\t\trenderer.invertChild(child, elem);\n\t\t\t});\n\t\t}\n\n\t\tif (elem.tagName === 'SPAN') {\n\n\t\t\tvar width, height,\n\t\t\t\trotation = wrapper.rotation,\n\t\t\t\tbaseline,\n\t\t\t\tradians = 0,\n\t\t\t\tcostheta = 1,\n\t\t\t\tsintheta = 0,\n\t\t\t\tquad,\n\t\t\t\ttextWidth = pInt(wrapper.textWidth),\n\t\t\t\txCorr = wrapper.xCorr || 0,\n\t\t\t\tyCorr = wrapper.yCorr || 0,\n\t\t\t\tcurrentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(',');\n\n\t\t\tif (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed\n\n\t\t\t\tif (defined(rotation)) {\n\n\t\t\t\t\tradians = rotation * deg2rad; // deg to rad\n\t\t\t\t\tcostheta = mathCos(radians);\n\t\t\t\t\tsintheta = mathSin(radians);\n\n\t\t\t\t\twrapper.setSpanRotation(rotation, sintheta, costheta);\n\n\t\t\t\t}\n\n\t\t\t\twidth = pick(wrapper.elemWidth, elem.offsetWidth);\n\t\t\t\theight = pick(wrapper.elemHeight, elem.offsetHeight);\n\n\t\t\t\t// update textWidth\n\t\t\t\tif (width > textWidth && /[ \\-]/.test(elem.textContent || elem.innerText)) { // #983, #1254\n\t\t\t\t\tcss(elem, {\n\t\t\t\t\t\twidth: textWidth + PX,\n\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\twhiteSpace: 'normal'\n\t\t\t\t\t});\n\t\t\t\t\twidth = textWidth;\n\t\t\t\t}\n\n\t\t\t\t// correct x and y\n\t\t\t\tbaseline = renderer.fontMetrics(elem.style.fontSize).b;\n\t\t\t\txCorr = costheta < 0 && -width;\n\t\t\t\tyCorr = sintheta < 0 && -height;\n\n\t\t\t\t// correct for baseline and corners spilling out after rotation\n\t\t\t\tquad = costheta * sintheta < 0;\n\t\t\t\txCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);\n\t\t\t\tyCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);\n\n\t\t\t\t// correct for the length/height of the text\n\t\t\t\tif (nonLeft) {\n\t\t\t\t\txCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);\n\t\t\t\t\tif (rotation) {\n\t\t\t\t\t\tyCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);\n\t\t\t\t\t}\n\t\t\t\t\tcss(elem, {\n\t\t\t\t\t\ttextAlign: align\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// record correction\n\t\t\t\twrapper.xCorr = xCorr;\n\t\t\t\twrapper.yCorr = yCorr;\n\t\t\t}\n\n\t\t\t// apply position with correction\n\t\t\tcss(elem, {\n\t\t\t\tleft: (x + xCorr) + PX,\n\t\t\t\ttop: (y + yCorr) + PX\n\t\t\t});\n\n\t\t\t// force reflow in webkit to apply the left and top on useHTML element (#1249)\n\t\t\tif (isWebKit) {\n\t\t\t\theight = elem.offsetHeight; // assigned to height for JSLint purpose\n\t\t\t}\n\n\t\t\t// record current text transform\n\t\t\twrapper.cTT = currentTextTransform;\n\t\t}\n\t},\n\n\t/**\n\t * Set the rotation of an individual HTML span\n\t */\n\tsetSpanRotation: function (rotation) {\n\t\tvar rotationStyle = {},\n\t\t\tcssTransformKey = isIE ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : isOpera ? '-o-transform' : '';\n\n\t\trotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';\n\t\tcss(this.element, rotationStyle);\n\t},\n\n\t/**\n\t * Private method to update the transform attribute based on internal\n\t * properties\n\t */\n\tupdateTransform: function () {\n\t\tvar wrapper = this,\n\t\t\ttranslateX = wrapper.translateX || 0,\n\t\t\ttranslateY = wrapper.translateY || 0,\n\t\t\tscaleX = wrapper.scaleX,\n\t\t\tscaleY = wrapper.scaleY,\n\t\t\tinverted = wrapper.inverted,\n\t\t\trotation = wrapper.rotation,\n\t\t\ttransform;\n\n\t\t// flipping affects translate as adjustment for flipping around the group's axis\n\t\tif (inverted) {\n\t\t\ttranslateX += wrapper.attr('width');\n\t\t\ttranslateY += wrapper.attr('height');\n\t\t}\n\n\t\t// Apply translate. Nearly all transformed elements have translation, so instead\n\t\t// of checking for translate = 0, do it always (#1767, #1846).\n\t\ttransform = ['translate(' + translateX + ',' + translateY + ')'];\n\n\t\t// apply rotation\n\t\tif (inverted) {\n\t\t\ttransform.push('rotate(90) scale(-1,1)');\n\t\t} else if (rotation) { // text rotation\n\t\t\ttransform.push('rotate(' + rotation + ' ' + (wrapper.x || 0) + ' ' + (wrapper.y || 0) + ')');\n\t\t}\n\n\t\t// apply scale\n\t\tif (defined(scaleX) || defined(scaleY)) {\n\t\t\ttransform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\n\t\t}\n\n\t\tif (transform.length) {\n\t\t\tattr(wrapper.element, 'transform', transform.join(' '));\n\t\t}\n\t},\n\t/**\n\t * Bring the element to the front\n\t */\n\ttoFront: function () {\n\t\tvar element = this.element;\n\t\telement.parentNode.appendChild(element);\n\t\treturn this;\n\t},\n\n\n\t/**\n\t * Break down alignment options like align, verticalAlign, x and y\n\t * to x and y relative to the chart.\n\t *\n\t * @param {Object} alignOptions\n\t * @param {Boolean} alignByTranslate\n\t * @param {String[Object} box The box to align to, needs a width and height. When the\n\t *        box is a string, it refers to an object in the Renderer. For example, when\n\t *        box is 'spacingBox', it refers to Renderer.spacingBox which holds width, height\n\t *        x and y properties.\n\t *\n\t */\n\talign: function (alignOptions, alignByTranslate, box) {\n\t\tvar align,\n\t\t\tvAlign,\n\t\t\tx,\n\t\t\ty,\n\t\t\tattribs = {},\n\t\t\talignTo,\n\t\t\trenderer = this.renderer,\n\t\t\talignedObjects = renderer.alignedObjects;\n\n\t\t// First call on instanciate\n\t\tif (alignOptions) {\n\t\t\tthis.alignOptions = alignOptions;\n\t\t\tthis.alignByTranslate = alignByTranslate;\n\t\t\tif (!box || isString(box)) { // boxes other than renderer handle this internally\n\t\t\t\tthis.alignTo = alignTo = box || 'renderer';\n\t\t\t\terase(alignedObjects, this); // prevent duplicates, like legendGroup after resize\n\t\t\t\talignedObjects.push(this);\n\t\t\t\tbox = null; // reassign it below\n\t\t\t}\n\n\t\t// When called on resize, no arguments are supplied\n\t\t} else {\n\t\t\talignOptions = this.alignOptions;\n\t\t\talignByTranslate = this.alignByTranslate;\n\t\t\talignTo = this.alignTo;\n\t\t}\n\n\t\tbox = pick(box, renderer[alignTo], renderer);\n\n\t\t// Assign variables\n\t\talign = alignOptions.align;\n\t\tvAlign = alignOptions.verticalAlign;\n\t\tx = (box.x || 0) + (alignOptions.x || 0); // default: left align\n\t\ty = (box.y || 0) + (alignOptions.y || 0); // default: top align\n\n\t\t// Align\n\t\tif (align === 'right' || align === 'center') {\n\t\t\tx += (box.width - (alignOptions.width || 0)) /\n\t\t\t\t\t{ right: 1, center: 2 }[align];\n\t\t}\n\t\tattribs[alignByTranslate ? 'translateX' : 'x'] = mathRound(x);\n\n\n\t\t// Vertical align\n\t\tif (vAlign === 'bottom' || vAlign === 'middle') {\n\t\t\ty += (box.height - (alignOptions.height || 0)) /\n\t\t\t\t\t({ bottom: 1, middle: 2 }[vAlign] || 1);\n\n\t\t}\n\t\tattribs[alignByTranslate ? 'translateY' : 'y'] = mathRound(y);\n\n\t\t// Animate only if already placed\n\t\tthis[this.placed ? 'animate' : 'attr'](attribs);\n\t\tthis.placed = true;\n\t\tthis.alignAttr = attribs;\n\n\t\treturn this;\n\t},\n\n\t/**\n\t * Get the bounding box (width, height, x and y) for the element\n\t */\n\tgetBBox: function () {\n\t\tvar wrapper = this,\n\t\t\tbBox = wrapper.bBox,\n\t\t\trenderer = wrapper.renderer,\n\t\t\twidth,\n\t\t\theight,\n\t\t\trotation = wrapper.rotation,\n\t\t\telement = wrapper.element,\n\t\t\tstyles = wrapper.styles,\n\t\t\trad = rotation * deg2rad;\n\n\t\tif (!bBox) {\n\t\t\t// SVG elements\n\t\t\tif (element.namespaceURI === SVG_NS || renderer.forExport) {\n\t\t\t\ttry { // Fails in Firefox if the container has display: none.\n\n\t\t\t\t\tbBox = element.getBBox ?\n\t\t\t\t\t\t// SVG: use extend because IE9 is not allowed to change width and height in case\n\t\t\t\t\t\t// of rotation (below)\n\t\t\t\t\t\textend({}, element.getBBox()) :\n\t\t\t\t\t\t// Canvas renderer and legacy IE in export mode\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twidth: element.offsetWidth,\n\t\t\t\t\t\t\theight: element.offsetHeight\n\t\t\t\t\t\t};\n\t\t\t\t} catch (e) {}\n\n\t\t\t\t// If the bBox is not set, the try-catch block above failed. The other condition\n\t\t\t\t// is for Opera that returns a width of -Infinity on hidden elements.\n\t\t\t\tif (!bBox || bBox.width < 0) {\n\t\t\t\t\tbBox = { width: 0, height: 0 };\n\t\t\t\t}\n\n\n\t\t\t// VML Renderer or useHTML within SVG\n\t\t\t} else {\n\n\t\t\t\tbBox = wrapper.htmlGetBBox();\n\n\t\t\t}\n\n\t\t\t// True SVG elements as well as HTML elements in modern browsers using the .useHTML option\n\t\t\t// need to compensated for rotation\n\t\t\tif (renderer.isSVG) {\n\t\t\t\twidth = bBox.width;\n\t\t\t\theight = bBox.height;\n\n\t\t\t\t// Workaround for wrong bounding box in IE9 and IE10 (#1101, #1505, #1669)\n\t\t\t\tif (isIE && styles && styles.fontSize === '11px' && height.toPrecision(3) === '22.7') {\n\t\t\t\t\tbBox.height = height = 14;\n\t\t\t\t}\n\n\t\t\t\t// Adjust for rotated text\n\t\t\t\tif (rotation) {\n\t\t\t\t\tbBox.width = mathAbs(height * mathSin(rad)) + mathAbs(width * mathCos(rad));\n\t\t\t\t\tbBox.height = mathAbs(height * mathCos(rad)) + mathAbs(width * mathSin(rad));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twrapper.bBox = bBox;\n\t\t}\n\t\treturn bBox;\n\t},\n\n\t/**\n\t * Show the element\n\t */\n\tshow: function () {\n\t\treturn this.attr({ visibility: VISIBLE });\n\t},\n\n\t/**\n\t * Hide the element\n\t */\n\thide: function () {\n\t\treturn this.attr({ visibility: HIDDEN });\n\t},\n\n\tfadeOut: function (duration) {\n\t\tvar elemWrapper = this;\n\t\telemWrapper.animate({\n\t\t\topacity: 0\n\t\t}, {\n\t\t\tduration: duration || 150,\n\t\t\tcomplete: function () {\n\t\t\t\telemWrapper.hide();\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Add the element\n\t * @param {Object|Undefined} parent Can be an element, an element wrapper or undefined\n\t *    to append the element to the renderer.box.\n\t */\n\tadd: function (parent) {\n\n\t\tvar renderer = this.renderer,\n\t\t\tparentWrapper = parent || renderer,\n\t\t\tparentNode = parentWrapper.element || renderer.box,\n\t\t\tchildNodes = parentNode.childNodes,\n\t\t\telement = this.element,\n\t\t\tzIndex = attr(element, 'zIndex'),\n\t\t\totherElement,\n\t\t\totherZIndex,\n\t\t\ti,\n\t\t\tinserted;\n\n\t\tif (parent) {\n\t\t\tthis.parentGroup = parent;\n\t\t}\n\n\t\t// mark as inverted\n\t\tthis.parentInverted = parent && parent.inverted;\n\n\t\t// build formatted text\n\t\tif (this.textStr !== undefined) {\n\t\t\trenderer.buildText(this);\n\t\t}\n\n\t\t// mark the container as having z indexed children\n\t\tif (zIndex) {\n\t\t\tparentWrapper.handleZ = true;\n\t\t\tzIndex = pInt(zIndex);\n\t\t}\n\n\t\t// insert according to this and other elements' zIndex\n\t\tif (parentWrapper.handleZ) { // this element or any of its siblings has a z index\n\t\t\tfor (i = 0; i < childNodes.length; i++) {\n\t\t\t\totherElement = childNodes[i];\n\t\t\t\totherZIndex = attr(otherElement, 'zIndex');\n\t\t\t\tif (otherElement !== element && (\n\t\t\t\t\t\t// insert before the first element with a higher zIndex\n\t\t\t\t\t\tpInt(otherZIndex) > zIndex ||\n\t\t\t\t\t\t// if no zIndex given, insert before the first element with a zIndex\n\t\t\t\t\t\t(!defined(zIndex) && defined(otherZIndex))\n\n\t\t\t\t\t\t)) {\n\t\t\t\t\tparentNode.insertBefore(element, otherElement);\n\t\t\t\t\tinserted = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// default: append at the end\n\t\tif (!inserted) {\n\t\t\tparentNode.appendChild(element);\n\t\t}\n\n\t\t// mark as added\n\t\tthis.added = true;\n\n\t\t// fire an event for internal hooks\n\t\tfireEvent(this, 'add');\n\n\t\treturn this;\n\t},\n\n\t/**\n\t * Removes a child either by removeChild or move to garbageBin.\n\t * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.\n\t */\n\tsafeRemoveChild: function (element) {\n\t\tvar parentNode = element.parentNode;\n\t\tif (parentNode) {\n\t\t\tparentNode.removeChild(element);\n\t\t}\n\t},\n\n\t/**\n\t * Destroy the element and element wrapper\n\t */\n\tdestroy: function () {\n\t\tvar wrapper = this,\n\t\t\telement = wrapper.element || {},\n\t\t\tshadows = wrapper.shadows,\n\t\t\tparentToClean = wrapper.renderer.isSVG && element.nodeName === 'SPAN' && element.parentNode,\n\t\t\tgrandParent,\n\t\t\tkey,\n\t\t\ti;\n\n\t\t// remove events\n\t\telement.onclick = element.onmouseout = element.onmouseover = element.onmousemove = element.point = null;\n\t\tstop(wrapper); // stop running animations\n\n\t\tif (wrapper.clipPath) {\n\t\t\twrapper.clipPath = wrapper.clipPath.destroy();\n\t\t}\n\n\t\t// Destroy stops in case this is a gradient object\n\t\tif (wrapper.stops) {\n\t\t\tfor (i = 0; i < wrapper.stops.length; i++) {\n\t\t\t\twrapper.stops[i] = wrapper.stops[i].destroy();\n\t\t\t}\n\t\t\twrapper.stops = null;\n\t\t}\n\n\t\t// remove element\n\t\twrapper.safeRemoveChild(element);\n\n\t\t// destroy shadows\n\t\tif (shadows) {\n\t\t\teach(shadows, function (shadow) {\n\t\t\t\twrapper.safeRemoveChild(shadow);\n\t\t\t});\n\t\t}\n\n\t\t// In case of useHTML, clean up empty containers emulating SVG groups (#1960).\n\t\twhile (parentToClean && parentToClean.childNodes.length === 0) {\n\t\t\tgrandParent = parentToClean.parentNode;\n\t\t\twrapper.safeRemoveChild(parentToClean);\n\t\t\tparentToClean = grandParent;\n\t\t}\n\n\t\t// remove from alignObjects\n\t\tif (wrapper.alignTo) {\n\t\t\terase(wrapper.renderer.alignedObjects, wrapper);\n\t\t}\n\n\t\tfor (key in wrapper) {\n\t\t\tdelete wrapper[key];\n\t\t}\n\n\t\treturn null;\n\t},\n\n\t/**\n\t * Add a shadow to the element. Must be done after the element is added to the DOM\n\t * @param {Boolean|Object} shadowOptions\n\t */\n\tshadow: function (shadowOptions, group, cutOff) {\n\t\tvar shadows = [],\n\t\t\ti,\n\t\t\tshadow,\n\t\t\telement = this.element,\n\t\t\tstrokeWidth,\n\t\t\tshadowWidth,\n\t\t\tshadowElementOpacity,\n\n\t\t\t// compensate for inverted plot area\n\t\t\ttransform;\n\n\n\t\tif (shadowOptions) {\n\t\t\tshadowWidth = pick(shadowOptions.width, 3);\n\t\t\tshadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\n\t\t\ttransform = this.parentInverted ?\n\t\t\t\t'(-1,-1)' :\n\t\t\t\t'(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';\n\t\t\tfor (i = 1; i <= shadowWidth; i++) {\n\t\t\t\tshadow = element.cloneNode(0);\n\t\t\t\tstrokeWidth = (shadowWidth * 2) + 1 - (2 * i);\n\t\t\t\tattr(shadow, {\n\t\t\t\t\t'isShadow': 'true',\n\t\t\t\t\t'stroke': shadowOptions.color || 'black',\n\t\t\t\t\t'stroke-opacity': shadowElementOpacity * i,\n\t\t\t\t\t'stroke-width': strokeWidth,\n\t\t\t\t\t'transform': 'translate' + transform,\n\t\t\t\t\t'fill': NONE\n\t\t\t\t});\n\t\t\t\tif (cutOff) {\n\t\t\t\t\tattr(shadow, 'height', mathMax(attr(shadow, 'height') - strokeWidth, 0));\n\t\t\t\t\tshadow.cutHeight = strokeWidth;\n\t\t\t\t}\n\n\t\t\t\tif (group) {\n\t\t\t\t\tgroup.element.appendChild(shadow);\n\t\t\t\t} else {\n\t\t\t\t\telement.parentNode.insertBefore(shadow, element);\n\t\t\t\t}\n\n\t\t\t\tshadows.push(shadow);\n\t\t\t}\n\n\t\t\tthis.shadows = shadows;\n\t\t}\n\t\treturn this;\n\n\t}\n};\n\n\n/**\n * The default SVG renderer\n */\nvar SVGRenderer = function () {\n\tthis.init.apply(this, arguments);\n};\nSVGRenderer.prototype = {\n\tElement: SVGElement,\n\n\t/**\n\t * Initialize the SVGRenderer\n\t * @param {Object} container\n\t * @param {Number} width\n\t * @param {Number} height\n\t * @param {Boolean} forExport\n\t */\n\tinit: function (container, width, height, forExport) {\n\t\tvar renderer = this,\n\t\t\tloc = location,\n\t\t\tboxWrapper,\n\t\t\telement,\n\t\t\tdesc;\n\n\t\tboxWrapper = renderer.createElement('svg')\n\t\t\t.attr({\n\t\t\t\tversion: '1.1'\n\t\t\t});\n\t\telement = boxWrapper.element;\n\t\tcontainer.appendChild(element);\n\n\t\t// For browsers other than IE, add the namespace attribute (#1978)\n\t\tif (container.innerHTML.indexOf('xmlns') === -1) {\n\t\t\tattr(element, 'xmlns', SVG_NS);\n\t\t}\n\n\t\t// object properties\n\t\trenderer.isSVG = true;\n\t\trenderer.box = element;\n\t\trenderer.boxWrapper = boxWrapper;\n\t\trenderer.alignedObjects = [];\n\n\t\t// Page url used for internal references. #24, #672, #1070\n\t\trenderer.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?\n\t\t\tloc.href\n\t\t\t\t.replace(/#.*?$/, '') // remove the hash\n\t\t\t\t.replace(/([\\('\\)])/g, '\\\\$1') // escape parantheses and quotes\n\t\t\t\t.replace(/ /g, '%20') : // replace spaces (needed for Safari only)\n\t\t\t'';\n\n\t\t// Add description\n\t\tdesc = this.createElement('desc').add();\n\t\tdesc.element.appendChild(doc.createTextNode('Created with ' + PRODUCT + ' ' + VERSION));\n\n\n\t\trenderer.defs = this.createElement('defs').add();\n\t\trenderer.forExport = forExport;\n\t\trenderer.gradients = {}; // Object where gradient SvgElements are stored\n\n\t\trenderer.setSize(width, height, false);\n\n\n\n\t\t// Issue 110 workaround:\n\t\t// In Firefox, if a div is positioned by percentage, its pixel position may land\n\t\t// between pixels. The container itself doesn't display this, but an SVG element\n\t\t// inside this container will be drawn at subpixel precision. In order to draw\n\t\t// sharp lines, this must be compensated for. This doesn't seem to work inside\n\t\t// iframes though (like in jsFiddle).\n\t\tvar subPixelFix, rect;\n\t\tif (isFirefox && container.getBoundingClientRect) {\n\t\t\trenderer.subPixelFix = subPixelFix = function () {\n\t\t\t\tcss(container, { left: 0, top: 0 });\n\t\t\t\trect = container.getBoundingClientRect();\n\t\t\t\tcss(container, {\n\t\t\t\t\tleft: (mathCeil(rect.left) - rect.left) + PX,\n\t\t\t\t\ttop: (mathCeil(rect.top) - rect.top) + PX\n\t\t\t\t});\n\t\t\t};\n\n\t\t\t// run the fix now\n\t\t\tsubPixelFix();\n\n\t\t\t// run it on resize\n\t\t\taddEvent(win, 'resize', subPixelFix);\n\t\t}\n\t},\n\n\t/**\n\t * Detect whether the renderer is hidden. This happens when one of the parent elements\n\t * has display: none. #608.\n\t */\n\tisHidden: function () {\n\t\treturn !this.boxWrapper.getBBox().width;\n\t},\n\n\t/**\n\t * Destroys the renderer and its allocated members.\n\t */\n\tdestroy: function () {\n\t\tvar renderer = this,\n\t\t\trendererDefs = renderer.defs;\n\t\trenderer.box = null;\n\t\trenderer.boxWrapper = renderer.boxWrapper.destroy();\n\n\t\t// Call destroy on all gradient elements\n\t\tdestroyObjectProperties(renderer.gradients || {});\n\t\trenderer.gradients = null;\n\n\t\t// Defs are null in VMLRenderer\n\t\t// Otherwise, destroy them here.\n\t\tif (rendererDefs) {\n\t\t\trenderer.defs = rendererDefs.destroy();\n\t\t}\n\n\t\t// Remove sub pixel fix handler\n\t\t// We need to check that there is a handler, otherwise all functions that are registered for event 'resize' are removed\n\t\t// See issue #982\n\t\tif (renderer.subPixelFix) {\n\t\t\tremoveEvent(win, 'resize', renderer.subPixelFix);\n\t\t}\n\n\t\trenderer.alignedObjects = null;\n\n\t\treturn null;\n\t},\n\n\t/**\n\t * Create a wrapper for an SVG element\n\t * @param {Object} nodeName\n\t */\n\tcreateElement: function (nodeName) {\n\t\tvar wrapper = new this.Element();\n\t\twrapper.init(this, nodeName);\n\t\treturn wrapper;\n\t},\n\n\t/**\n\t * Dummy function for use in canvas renderer\n\t */\n\tdraw: function () {},\n\n\t/**\n\t * Parse a simple HTML string into SVG tspans\n\t *\n\t * @param {Object} textNode The parent text SVG node\n\t */\n\tbuildText: function (wrapper) {\n\t\tvar textNode = wrapper.element,\n\t\t\trenderer = this,\n\t\t\tforExport = renderer.forExport,\n\t\t\tlines = pick(wrapper.textStr, '').toString()\n\t\t\t\t.replace(/<(b|strong)>/g, '<span style=\"font-weight:bold\">')\n\t\t\t\t.replace(/<(i|em)>/g, '<span style=\"font-style:italic\">')\n\t\t\t\t.replace(/<a/g, '<span')\n\t\t\t\t.replace(/<\\/(b|strong|i|em|a)>/g, '</span>')\n\t\t\t\t.split(/<br.*?>/g),\n\t\t\tchildNodes = textNode.childNodes,\n\t\t\tstyleRegex = /style=\"([^\"]+)\"/,\n\t\t\threfRegex = /href=\"(http[^\"]+)\"/,\n\t\t\tparentX = attr(textNode, 'x'),\n\t\t\ttextStyles = wrapper.styles,\n\t\t\twidth = textStyles && textStyles.width && pInt(textStyles.width),\n\t\t\ttextLineHeight = textStyles && textStyles.lineHeight,\n\t\t\ti = childNodes.length;\n\n\t\t/// remove old text\n\t\twhile (i--) {\n\t\t\ttextNode.removeChild(childNodes[i]);\n\t\t}\n\n\t\tif (width && !wrapper.added) {\n\t\t\tthis.box.appendChild(textNode); // attach it to the DOM to read offset width\n\t\t}\n\n\t\t// remove empty line at end\n\t\tif (lines[lines.length - 1] === '') {\n\t\t\tlines.pop();\n\t\t}\n\n\t\t// build the lines\n\t\teach(lines, function (line, lineNo) {\n\t\t\tvar spans, spanNo = 0;\n\n\t\t\tline = line.replace(/<span/g, '|||<span').replace(/<\\/span>/g, '</span>|||');\n\t\t\tspans = line.split('|||');\n\n\t\t\teach(spans, function (span) {\n\t\t\t\tif (span !== '' || spans.length === 1) {\n\t\t\t\t\tvar attributes = {},\n\t\t\t\t\t\ttspan = doc.createElementNS(SVG_NS, 'tspan'),\n\t\t\t\t\t\tspanStyle; // #390\n\t\t\t\t\tif (styleRegex.test(span)) {\n\t\t\t\t\t\tspanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');\n\t\t\t\t\t\tattr(tspan, 'style', spanStyle);\n\t\t\t\t\t}\n\t\t\t\t\tif (hrefRegex.test(span) && !forExport) { // Not for export - #1529\n\t\t\t\t\t\tattr(tspan, 'onclick', 'location.href=\\\"' + span.match(hrefRegex)[1] + '\\\"');\n\t\t\t\t\t\tcss(tspan, { cursor: 'pointer' });\n\t\t\t\t\t}\n\n\t\t\t\t\tspan = (span.replace(/<(.|\\n)*?>/g, '') || ' ')\n\t\t\t\t\t\t.replace(/&lt;/g, '<')\n\t\t\t\t\t\t.replace(/&gt;/g, '>');\n\n\t\t\t\t\t// Nested tags aren't supported, and cause crash in Safari (#1596)\n\t\t\t\t\tif (span !== ' ') {\n\n\t\t\t\t\t\t// add the text node\n\t\t\t\t\t\ttspan.appendChild(doc.createTextNode(span));\n\n\t\t\t\t\t\tif (!spanNo) { // first span in a line, align it to the left\n\t\t\t\t\t\t\tattributes.x = parentX;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tattributes.dx = 0; // #16\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// add attributes\n\t\t\t\t\t\tattr(tspan, attributes);\n\n\t\t\t\t\t\t// first span on subsequent line, add the line height\n\t\t\t\t\t\tif (!spanNo && lineNo) {\n\n\t\t\t\t\t\t\t// allow getting the right offset height in exporting in IE\n\t\t\t\t\t\t\tif (!hasSVG && forExport) {\n\t\t\t\t\t\t\t\tcss(tspan, { display: 'block' });\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Set the line height based on the font size of either\n\t\t\t\t\t\t\t// the text element or the tspan element\n\t\t\t\t\t\t\tattr(\n\t\t\t\t\t\t\t\ttspan,\n\t\t\t\t\t\t\t\t'dy',\n\t\t\t\t\t\t\t\ttextLineHeight || renderer.fontMetrics(\n\t\t\t\t\t\t\t\t\t/px$/.test(tspan.style.fontSize) ?\n\t\t\t\t\t\t\t\t\t\ttspan.style.fontSize :\n\t\t\t\t\t\t\t\t\t\ttextStyles.fontSize\n\t\t\t\t\t\t\t\t).h,\n\t\t\t\t\t\t\t\t// Safari 6.0.2 - too optimized for its own good (#1539)\n\t\t\t\t\t\t\t\t// TODO: revisit this with future versions of Safari\n\t\t\t\t\t\t\t\tisWebKit && tspan.offsetHeight\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Append it\n\t\t\t\t\t\ttextNode.appendChild(tspan);\n\n\t\t\t\t\t\tspanNo++;\n\n\t\t\t\t\t\t// check width and apply soft breaks\n\t\t\t\t\t\tif (width) {\n\t\t\t\t\t\t\tvar words = span.replace(/([^\\^])-/g, '$1- ').split(' '), // #1273\n\t\t\t\t\t\t\t\ttooLong,\n\t\t\t\t\t\t\t\tactualWidth,\n\t\t\t\t\t\t\t\tclipHeight = wrapper._clipHeight,\n\t\t\t\t\t\t\t\trest = [],\n\t\t\t\t\t\t\t\tdy = pInt(textLineHeight || 16),\n\t\t\t\t\t\t\t\tsoftLineNo = 1,\n\t\t\t\t\t\t\t\tbBox;\n\n\t\t\t\t\t\t\twhile (words.length || rest.length) {\n\t\t\t\t\t\t\t\tdelete wrapper.bBox; // delete cache\n\t\t\t\t\t\t\t\tbBox = wrapper.getBBox();\n\t\t\t\t\t\t\t\tactualWidth = bBox.width;\n\t\t\t\t\t\t\t\ttooLong = actualWidth > width;\n\t\t\t\t\t\t\t\tif (!tooLong || words.length === 1) { // new line needed\n\t\t\t\t\t\t\t\t\twords = rest;\n\t\t\t\t\t\t\t\t\trest = [];\n\t\t\t\t\t\t\t\t\tif (words.length) {\n\t\t\t\t\t\t\t\t\t\tsoftLineNo++;\n\n\t\t\t\t\t\t\t\t\t\tif (clipHeight && softLineNo * dy > clipHeight) {\n\t\t\t\t\t\t\t\t\t\t\twords = ['...'];\n\t\t\t\t\t\t\t\t\t\t\twrapper.attr('title', wrapper.textStr);\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\ttspan = doc.createElementNS(SVG_NS, 'tspan');\n\t\t\t\t\t\t\t\t\t\t\tattr(tspan, {\n\t\t\t\t\t\t\t\t\t\t\t\tdy: dy,\n\t\t\t\t\t\t\t\t\t\t\t\tx: parentX\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\tif (spanStyle) { // #390\n\t\t\t\t\t\t\t\t\t\t\t\tattr(tspan, 'style', spanStyle);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\ttextNode.appendChild(tspan);\n\n\t\t\t\t\t\t\t\t\t\t\tif (actualWidth > width) { // a single word is pressing it out\n\t\t\t\t\t\t\t\t\t\t\t\twidth = actualWidth;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else { // append to existing line tspan\n\t\t\t\t\t\t\t\t\ttspan.removeChild(tspan.firstChild);\n\t\t\t\t\t\t\t\t\trest.unshift(words.pop());\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (words.length) {\n\t\t\t\t\t\t\t\t\ttspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n\t * Create a button with preset states\n\t * @param {String} text\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Function} callback\n\t * @param {Object} normalState\n\t * @param {Object} hoverState\n\t * @param {Object} pressedState\n\t */\n\tbutton: function (text, x, y, callback, normalState, hoverState, pressedState, disabledState) {\n\t\tvar label = this.label(text, x, y, null, null, null, null, null, 'button'),\n\t\t\tcurState = 0,\n\t\t\tstateOptions,\n\t\t\tstateStyle,\n\t\t\tnormalStyle,\n\t\t\thoverStyle,\n\t\t\tpressedStyle,\n\t\t\tdisabledStyle,\n\t\t\tSTYLE = 'style',\n\t\t\tverticalGradient = { x1: 0, y1: 0, x2: 0, y2: 1 };\n\n\t\t// Normal state - prepare the attributes\n\t\tnormalState = merge({\n\t\t\t'stroke-width': 1,\n\t\t\tstroke: '#CCCCCC',\n\t\t\tfill: {\n\t\t\t\tlinearGradient: verticalGradient,\n\t\t\t\tstops: [\n\t\t\t\t\t[0, '#FEFEFE'],\n\t\t\t\t\t[1, '#F6F6F6']\n\t\t\t\t]\n\t\t\t},\n\t\t\tr: 2,\n\t\t\tpadding: 5,\n\t\t\tstyle: {\n\t\t\t\tcolor: 'black'\n\t\t\t}\n\t\t}, normalState);\n\t\tnormalStyle = normalState[STYLE];\n\t\tdelete normalState[STYLE];\n\n\t\t// Hover state\n\t\thoverState = merge(normalState, {\n\t\t\tstroke: '#68A',\n\t\t\tfill: {\n\t\t\t\tlinearGradient: verticalGradient,\n\t\t\t\tstops: [\n\t\t\t\t\t[0, '#FFF'],\n\t\t\t\t\t[1, '#ACF']\n\t\t\t\t]\n\t\t\t}\n\t\t}, hoverState);\n\t\thoverStyle = hoverState[STYLE];\n\t\tdelete hoverState[STYLE];\n\n\t\t// Pressed state\n\t\tpressedState = merge(normalState, {\n\t\t\tstroke: '#68A',\n\t\t\tfill: {\n\t\t\t\tlinearGradient: verticalGradient,\n\t\t\t\tstops: [\n\t\t\t\t\t[0, '#9BD'],\n\t\t\t\t\t[1, '#CDF']\n\t\t\t\t]\n\t\t\t}\n\t\t}, pressedState);\n\t\tpressedStyle = pressedState[STYLE];\n\t\tdelete pressedState[STYLE];\n\n\t\t// Disabled state\n\t\tdisabledState = merge(normalState, {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#CCC'\n\t\t\t}\n\t\t}, disabledState);\n\t\tdisabledStyle = disabledState[STYLE];\n\t\tdelete disabledState[STYLE];\n\n\t\t// Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).\n\t\taddEvent(label.element, isIE ? 'mouseover' : 'mouseenter', function () {\n\t\t\tif (curState !== 3) {\n\t\t\t\tlabel.attr(hoverState)\n\t\t\t\t\t.css(hoverStyle);\n\t\t\t}\n\t\t});\n\t\taddEvent(label.element, isIE ? 'mouseout' : 'mouseleave', function () {\n\t\t\tif (curState !== 3) {\n\t\t\t\tstateOptions = [normalState, hoverState, pressedState][curState];\n\t\t\t\tstateStyle = [normalStyle, hoverStyle, pressedStyle][curState];\n\t\t\t\tlabel.attr(stateOptions)\n\t\t\t\t\t.css(stateStyle);\n\t\t\t}\n\t\t});\n\n\t\tlabel.setState = function (state) {\n\t\t\tlabel.state = curState = state;\n\t\t\tif (!state) {\n\t\t\t\tlabel.attr(normalState)\n\t\t\t\t\t.css(normalStyle);\n\t\t\t} else if (state === 2) {\n\t\t\t\tlabel.attr(pressedState)\n\t\t\t\t\t.css(pressedStyle);\n\t\t\t} else if (state === 3) {\n\t\t\t\tlabel.attr(disabledState)\n\t\t\t\t\t.css(disabledStyle);\n\t\t\t}\n\t\t};\n\n\t\treturn label\n\t\t\t.on('click', function () {\n\t\t\t\tif (curState !== 3) {\n\t\t\t\t\tcallback.call(label);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.attr(normalState)\n\t\t\t.css(extend({ cursor: 'default' }, normalStyle));\n\t},\n\n\t/**\n\t * Make a straight line crisper by not spilling out to neighbour pixels\n\t * @param {Array} points\n\t * @param {Number} width\n\t */\n\tcrispLine: function (points, width) {\n\t\t// points format: [M, 0, 0, L, 100, 0]\n\t\t// normalize to a crisp line\n\t\tif (points[1] === points[4]) {\n\t\t\t// Substract due to #1129. Now bottom and left axis gridlines behave the same.\n\t\t\tpoints[1] = points[4] = mathRound(points[1]) - (width % 2 / 2);\n\t\t}\n\t\tif (points[2] === points[5]) {\n\t\t\tpoints[2] = points[5] = mathRound(points[2]) + (width % 2 / 2);\n\t\t}\n\t\treturn points;\n\t},\n\n\n\t/**\n\t * Draw a path\n\t * @param {Array} path An SVG path in array form\n\t */\n\tpath: function (path) {\n\t\tvar attr = {\n\t\t\tfill: NONE\n\t\t};\n\t\tif (isArray(path)) {\n\t\t\tattr.d = path;\n\t\t} else if (isObject(path)) { // attributes\n\t\t\textend(attr, path);\n\t\t}\n\t\treturn this.createElement('path').attr(attr);\n\t},\n\n\t/**\n\t * Draw and return an SVG circle\n\t * @param {Number} x The x position\n\t * @param {Number} y The y position\n\t * @param {Number} r The radius\n\t */\n\tcircle: function (x, y, r) {\n\t\tvar attr = isObject(x) ?\n\t\t\tx :\n\t\t\t{\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tr: r\n\t\t\t};\n\n\t\treturn this.createElement('circle').attr(attr);\n\t},\n\n\t/**\n\t * Draw and return an arc\n\t * @param {Number} x X position\n\t * @param {Number} y Y position\n\t * @param {Number} r Radius\n\t * @param {Number} innerR Inner radius like used in donut charts\n\t * @param {Number} start Starting angle\n\t * @param {Number} end Ending angle\n\t */\n\tarc: function (x, y, r, innerR, start, end) {\n\t\tvar arc;\n\n\t\tif (isObject(x)) {\n\t\t\ty = x.y;\n\t\t\tr = x.r;\n\t\t\tinnerR = x.innerR;\n\t\t\tstart = x.start;\n\t\t\tend = x.end;\n\t\t\tx = x.x;\n\t\t}\n\n\t\t// Arcs are defined as symbols for the ability to set\n\t\t// attributes in attr and animate\n\t\tarc = this.symbol('arc', x || 0, y || 0, r || 0, r || 0, {\n\t\t\tinnerR: innerR || 0,\n\t\t\tstart: start || 0,\n\t\t\tend: end || 0\n\t\t});\n\t\tarc.r = r; // #959\n\t\treturn arc;\n\t},\n\n\t/**\n\t * Draw and return a rectangle\n\t * @param {Number} x Left position\n\t * @param {Number} y Top position\n\t * @param {Number} width\n\t * @param {Number} height\n\t * @param {Number} r Border corner radius\n\t * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing\n\t */\n\trect: function (x, y, width, height, r, strokeWidth) {\n\n\t\tr = isObject(x) ? x.r : r;\n\n\t\tvar wrapper = this.createElement('rect').attr({\n\t\t\t\trx: r,\n\t\t\t\try: r,\n\t\t\t\tfill: NONE\n\t\t\t});\n\t\treturn wrapper.attr(\n\t\t\t\tisObject(x) ?\n\t\t\t\t\tx :\n\t\t\t\t\t// do not crispify when an object is passed in (as in column charts)\n\t\t\t\t\twrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))\n\t\t\t);\n\t},\n\n\t/**\n\t * Resize the box and re-align all aligned elements\n\t * @param {Object} width\n\t * @param {Object} height\n\t * @param {Boolean} animate\n\t *\n\t */\n\tsetSize: function (width, height, animate) {\n\t\tvar renderer = this,\n\t\t\talignedObjects = renderer.alignedObjects,\n\t\t\ti = alignedObjects.length;\n\n\t\trenderer.width = width;\n\t\trenderer.height = height;\n\n\t\trenderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t});\n\n\t\twhile (i--) {\n\t\t\talignedObjects[i].align();\n\t\t}\n\t},\n\n\t/**\n\t * Create a group\n\t * @param {String} name The group will be given a class name of 'highcharts-{name}'.\n\t *     This can be used for styling and scripting.\n\t */\n\tg: function (name) {\n\t\tvar elem = this.createElement('g');\n\t\treturn defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem;\n\t},\n\n\t/**\n\t * Display an image\n\t * @param {String} src\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} width\n\t * @param {Number} height\n\t */\n\timage: function (src, x, y, width, height) {\n\t\tvar attribs = {\n\t\t\t\tpreserveAspectRatio: NONE\n\t\t\t},\n\t\t\telemWrapper;\n\n\t\t// optional properties\n\t\tif (arguments.length > 1) {\n\t\t\textend(attribs, {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t});\n\t\t}\n\n\t\telemWrapper = this.createElement('image').attr(attribs);\n\n\t\t// set the href in the xlink namespace\n\t\tif (elemWrapper.element.setAttributeNS) {\n\t\t\telemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',\n\t\t\t\t'href', src);\n\t\t} else {\n\t\t\t// could be exporting in IE\n\t\t\t// using href throws \"not supported\" in ie7 and under, requries regex shim to fix later\n\t\t\telemWrapper.element.setAttribute('hc-svg-href', src);\n\t}\n\n\t\treturn elemWrapper;\n\t},\n\n\t/**\n\t * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object.\n\t *\n\t * @param {Object} symbol\n\t * @param {Object} x\n\t * @param {Object} y\n\t * @param {Object} radius\n\t * @param {Object} options\n\t */\n\tsymbol: function (symbol, x, y, width, height, options) {\n\n\t\tvar obj,\n\n\t\t\t// get the symbol definition function\n\t\t\tsymbolFn = this.symbols[symbol],\n\n\t\t\t// check if there's a path defined for this symbol\n\t\t\tpath = symbolFn && symbolFn(\n\t\t\t\tmathRound(x),\n\t\t\t\tmathRound(y),\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\toptions\n\t\t\t),\n\n\t\t\timageElement,\n\t\t\timageRegex = /^url\\((.*?)\\)$/,\n\t\t\timageSrc,\n\t\t\timageSize,\n\t\t\tcenterImage;\n\n\t\tif (path) {\n\n\t\t\tobj = this.path(path);\n\t\t\t// expando properties for use in animate and attr\n\t\t\textend(obj, {\n\t\t\t\tsymbolName: symbol,\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t});\n\t\t\tif (options) {\n\t\t\t\textend(obj, options);\n\t\t\t}\n\n\n\t\t// image symbols\n\t\t} else if (imageRegex.test(symbol)) {\n\n\t\t\t// On image load, set the size and position\n\t\t\tcenterImage = function (img, size) {\n\t\t\t\tif (img.element) { // it may be destroyed in the meantime (#1390)\n\t\t\t\t\timg.attr({\n\t\t\t\t\t\twidth: size[0],\n\t\t\t\t\t\theight: size[1]\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!img.alignByTranslate) { // #185\n\t\t\t\t\t\timg.translate(\n\t\t\t\t\t\t\tmathRound((width - size[0]) / 2), // #1378\n\t\t\t\t\t\t\tmathRound((height - size[1]) / 2)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\timageSrc = symbol.match(imageRegex)[1];\n\t\t\timageSize = symbolSizes[imageSrc];\n\n\t\t\t// Ireate the image synchronously, add attribs async\n\t\t\tobj = this.image(imageSrc)\n\t\t\t\t.attr({\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: y\n\t\t\t\t});\n\t\t\tobj.isImg = true;\n\n\t\t\tif (imageSize) {\n\t\t\t\tcenterImage(obj, imageSize);\n\t\t\t} else {\n\t\t\t\t// Initialize image to be 0 size so export will still function if there's no cached sizes.\n\t\t\t\t//\n\t\t\t\tobj.attr({ width: 0, height: 0 });\n\n\t\t\t\t// Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,\n\t\t\t\t// the created element must be assigned to a variable in order to load (#292).\n\t\t\t\timageElement = createElement('img', {\n\t\t\t\t\tonload: function () {\n\t\t\t\t\t\tcenterImage(obj, symbolSizes[imageSrc] = [this.width, this.height]);\n\t\t\t\t\t},\n\t\t\t\t\tsrc: imageSrc\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t/**\n\t * An extendable collection of functions for defining symbol paths.\n\t */\n\tsymbols: {\n\t\t'circle': function (x, y, w, h) {\n\t\t\tvar cpw = 0.166 * w;\n\t\t\treturn [\n\t\t\t\tM, x + w / 2, y,\n\t\t\t\t'C', x + w + cpw, y, x + w + cpw, y + h, x + w / 2, y + h,\n\t\t\t\t'C', x - cpw, y + h, x - cpw, y, x + w / 2, y,\n\t\t\t\t'Z'\n\t\t\t];\n\t\t},\n\n\t\t'square': function (x, y, w, h) {\n\t\t\treturn [\n\t\t\t\tM, x, y,\n\t\t\t\tL, x + w, y,\n\t\t\t\tx + w, y + h,\n\t\t\t\tx, y + h,\n\t\t\t\t'Z'\n\t\t\t];\n\t\t},\n\n\t\t'triangle': function (x, y, w, h) {\n\t\t\treturn [\n\t\t\t\tM, x + w / 2, y,\n\t\t\t\tL, x + w, y + h,\n\t\t\t\tx, y + h,\n\t\t\t\t'Z'\n\t\t\t];\n\t\t},\n\n\t\t'triangle-down': function (x, y, w, h) {\n\t\t\treturn [\n\t\t\t\tM, x, y,\n\t\t\t\tL, x + w, y,\n\t\t\t\tx + w / 2, y + h,\n\t\t\t\t'Z'\n\t\t\t];\n\t\t},\n\t\t'diamond': function (x, y, w, h) {\n\t\t\treturn [\n\t\t\t\tM, x + w / 2, y,\n\t\t\t\tL, x + w, y + h / 2,\n\t\t\t\tx + w / 2, y + h,\n\t\t\t\tx, y + h / 2,\n\t\t\t\t'Z'\n\t\t\t];\n\t\t},\n\t\t'arc': function (x, y, w, h, options) {\n\t\t\tvar start = options.start,\n\t\t\t\tradius = options.r || w || h,\n\t\t\t\tend = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)\n\t\t\t\tinnerRadius = options.innerR,\n\t\t\t\topen = options.open,\n\t\t\t\tcosStart = mathCos(start),\n\t\t\t\tsinStart = mathSin(start),\n\t\t\t\tcosEnd = mathCos(end),\n\t\t\t\tsinEnd = mathSin(end),\n\t\t\t\tlongArc = options.end - start < mathPI ? 0 : 1;\n\n\t\t\treturn [\n\t\t\t\tM,\n\t\t\t\tx + radius * cosStart,\n\t\t\t\ty + radius * sinStart,\n\t\t\t\t'A', // arcTo\n\t\t\t\tradius, // x radius\n\t\t\t\tradius, // y radius\n\t\t\t\t0, // slanting\n\t\t\t\tlongArc, // long or short arc\n\t\t\t\t1, // clockwise\n\t\t\t\tx + radius * cosEnd,\n\t\t\t\ty + radius * sinEnd,\n\t\t\t\topen ? M : L,\n\t\t\t\tx + innerRadius * cosEnd,\n\t\t\t\ty + innerRadius * sinEnd,\n\t\t\t\t'A', // arcTo\n\t\t\t\tinnerRadius, // x radius\n\t\t\t\tinnerRadius, // y radius\n\t\t\t\t0, // slanting\n\t\t\t\tlongArc, // long or short arc\n\t\t\t\t0, // clockwise\n\t\t\t\tx + innerRadius * cosStart,\n\t\t\t\ty + innerRadius * sinStart,\n\n\t\t\t\topen ? '' : 'Z' // close\n\t\t\t];\n\t\t}\n\t},\n\n\t/**\n\t * Define a clipping rectangle\n\t * @param {String} id\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} width\n\t * @param {Number} height\n\t */\n\tclipRect: function (x, y, width, height) {\n\t\tvar wrapper,\n\t\t\tid = PREFIX + idCounter++,\n\n\t\t\tclipPath = this.createElement('clipPath').attr({\n\t\t\t\tid: id\n\t\t\t}).add(this.defs);\n\n\t\twrapper = this.rect(x, y, width, height, 0).add(clipPath);\n\t\twrapper.id = id;\n\t\twrapper.clipPath = clipPath;\n\n\t\treturn wrapper;\n\t},\n\n\n\t/**\n\t * Take a color and return it if it's a string, make it a gradient if it's a\n\t * gradient configuration object. Prior to Highstock, an array was used to define\n\t * a linear gradient with pixel positions relative to the SVG. In newer versions\n\t * we change the coordinates to apply relative to the shape, using coordinates\n\t * 0-1 within the shape. To preserve backwards compatibility, linearGradient\n\t * in this definition is an object of x1, y1, x2 and y2.\n\t *\n\t * @param {Object} color The color or config object\n\t */\n\tcolor: function (color, elem, prop) {\n\t\tvar renderer = this,\n\t\t\tcolorObject,\n\t\t\tregexRgba = /^rgba/,\n\t\t\tgradName,\n\t\t\tgradAttr,\n\t\t\tgradients,\n\t\t\tgradientObject,\n\t\t\tstops,\n\t\t\tstopColor,\n\t\t\tstopOpacity,\n\t\t\tradialReference,\n\t\t\tn,\n\t\t\tid,\n\t\t\tkey = [];\n\n\t\t// Apply linear or radial gradients\n\t\tif (color && color.linearGradient) {\n\t\t\tgradName = 'linearGradient';\n\t\t} else if (color && color.radialGradient) {\n\t\t\tgradName = 'radialGradient';\n\t\t}\n\n\t\tif (gradName) {\n\t\t\tgradAttr = color[gradName];\n\t\t\tgradients = renderer.gradients;\n\t\t\tstops = color.stops;\n\t\t\tradialReference = elem.radialReference;\n\n\t\t\t// Keep < 2.2 kompatibility\n\t\t\tif (isArray(gradAttr)) {\n\t\t\t\tcolor[gradName] = gradAttr = {\n\t\t\t\t\tx1: gradAttr[0],\n\t\t\t\t\ty1: gradAttr[1],\n\t\t\t\t\tx2: gradAttr[2],\n\t\t\t\t\ty2: gradAttr[3],\n\t\t\t\t\tgradientUnits: 'userSpaceOnUse'\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Correct the radial gradient for the radial reference system\n\t\t\tif (gradName === 'radialGradient' && radialReference && !defined(gradAttr.gradientUnits)) {\n\t\t\t\tgradAttr = merge(gradAttr, {\n\t\t\t\t\tcx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],\n\t\t\t\t\tcy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],\n\t\t\t\t\tr: gradAttr.r * radialReference[2],\n\t\t\t\t\tgradientUnits: 'userSpaceOnUse'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Build the unique key to detect whether we need to create a new element (#1282)\n\t\t\tfor (n in gradAttr) {\n\t\t\t\tif (n !== 'id') {\n\t\t\t\t\tkey.push(n, gradAttr[n]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (n in stops) {\n\t\t\t\tkey.push(stops[n]);\n\t\t\t}\n\t\t\tkey = key.join(',');\n\n\t\t\t// Check if a gradient object with the same config object is created within this renderer\n\t\t\tif (gradients[key]) {\n\t\t\t\tid = gradients[key].id;\n\n\t\t\t} else {\n\n\t\t\t\t// Set the id and create the element\n\t\t\t\tgradAttr.id = id = PREFIX + idCounter++;\n\t\t\t\tgradients[key] = gradientObject = renderer.createElement(gradName)\n\t\t\t\t\t.attr(gradAttr)\n\t\t\t\t\t.add(renderer.defs);\n\n\n\t\t\t\t// The gradient needs to keep a list of stops to be able to destroy them\n\t\t\t\tgradientObject.stops = [];\n\t\t\t\teach(stops, function (stop) {\n\t\t\t\t\tvar stopObject;\n\t\t\t\t\tif (regexRgba.test(stop[1])) {\n\t\t\t\t\t\tcolorObject = Color(stop[1]);\n\t\t\t\t\t\tstopColor = colorObject.get('rgb');\n\t\t\t\t\t\tstopOpacity = colorObject.get('a');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstopColor = stop[1];\n\t\t\t\t\t\tstopOpacity = 1;\n\t\t\t\t\t}\n\t\t\t\t\tstopObject = renderer.createElement('stop').attr({\n\t\t\t\t\t\toffset: stop[0],\n\t\t\t\t\t\t'stop-color': stopColor,\n\t\t\t\t\t\t'stop-opacity': stopOpacity\n\t\t\t\t\t}).add(gradientObject);\n\n\t\t\t\t\t// Add the stop element to the gradient\n\t\t\t\t\tgradientObject.stops.push(stopObject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Return the reference to the gradient object\n\t\t\treturn 'url(' + renderer.url + '#' + id + ')';\n\n\t\t// Webkit and Batik can't show rgba.\n\t\t} else if (regexRgba.test(color)) {\n\t\t\tcolorObject = Color(color);\n\t\t\tattr(elem, prop + '-opacity', colorObject.get('a'));\n\n\t\t\treturn colorObject.get('rgb');\n\n\n\t\t} else {\n\t\t\t// Remove the opacity attribute added above. Does not throw if the attribute is not there.\n\t\t\telem.removeAttribute(prop + '-opacity');\n\n\t\t\treturn color;\n\t\t}\n\n\t},\n\n\n\t/**\n\t * Add text to the SVG object\n\t * @param {String} str\n\t * @param {Number} x Left position\n\t * @param {Number} y Top position\n\t * @param {Boolean} useHTML Use HTML to render the text\n\t */\n\ttext: function (str, x, y, useHTML) {\n\n\t\t// declare variables\n\t\tvar renderer = this,\n\t\t\tdefaultChartStyle = defaultOptions.chart.style,\n\t\t\tfakeSVG = useCanVG || (!hasSVG && renderer.forExport),\n\t\t\twrapper;\n\n\t\tif (useHTML && !renderer.forExport) {\n\t\t\treturn renderer.html(str, x, y);\n\t\t}\n\n\t\tx = mathRound(pick(x, 0));\n\t\ty = mathRound(pick(y, 0));\n\n\t\twrapper = renderer.createElement('text')\n\t\t\t.attr({\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\ttext: str\n\t\t\t})\n\t\t\t.css({\n\t\t\t\tfontFamily: defaultChartStyle.fontFamily,\n\t\t\t\tfontSize: defaultChartStyle.fontSize\n\t\t\t});\n\n\t\t// Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)\n\t\tif (fakeSVG) {\n\t\t\twrapper.css({\n\t\t\t\tposition: ABSOLUTE\n\t\t\t});\n\t\t}\n\n\t\twrapper.x = x;\n\t\twrapper.y = y;\n\t\treturn wrapper;\n\t},\n\n\n\t/**\n\t * Create HTML text node. This is used by the VML renderer as well as the SVG\n\t * renderer through the useHTML option.\n\t *\n\t * @param {String} str\n\t * @param {Number} x\n\t * @param {Number} y\n\t */\n\thtml: function (str, x, y) {\n\t\tvar defaultChartStyle = defaultOptions.chart.style,\n\t\t\twrapper = this.createElement('span'),\n\t\t\tattrSetters = wrapper.attrSetters,\n\t\t\telement = wrapper.element,\n\t\t\trenderer = wrapper.renderer;\n\n\t\t// Text setter\n\t\tattrSetters.text = function (value) {\n\t\t\tif (value !== element.innerHTML) {\n\t\t\t\tdelete this.bBox;\n\t\t\t}\n\t\t\telement.innerHTML = value;\n\t\t\treturn false;\n\t\t};\n\n\t\t// Various setters which rely on update transform\n\t\tattrSetters.x = attrSetters.y = attrSetters.align = function (value, key) {\n\t\t\tif (key === 'align') {\n\t\t\t\tkey = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.\n\t\t\t}\n\t\t\twrapper[key] = value;\n\t\t\twrapper.htmlUpdateTransform();\n\t\t\treturn false;\n\t\t};\n\n\t\t// Set the default attributes\n\t\twrapper.attr({\n\t\t\t\ttext: str,\n\t\t\t\tx: mathRound(x),\n\t\t\t\ty: mathRound(y)\n\t\t\t})\n\t\t\t.css({\n\t\t\t\tposition: ABSOLUTE,\n\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\tfontFamily: defaultChartStyle.fontFamily,\n\t\t\t\tfontSize: defaultChartStyle.fontSize\n\t\t\t});\n\n\t\t// Use the HTML specific .css method\n\t\twrapper.css = wrapper.htmlCss;\n\n\t\t// This is specific for HTML within SVG\n\t\tif (renderer.isSVG) {\n\t\t\twrapper.add = function (svgGroupWrapper) {\n\n\t\t\t\tvar htmlGroup,\n\t\t\t\t\tcontainer = renderer.box.parentNode,\n\t\t\t\t\tparentGroup,\n\t\t\t\t\tparents = [];\n\n\t\t\t\t// Create a mock group to hold the HTML elements\n\t\t\t\tif (svgGroupWrapper) {\n\t\t\t\t\thtmlGroup = svgGroupWrapper.div;\n\t\t\t\t\tif (!htmlGroup) {\n\n\t\t\t\t\t\t// Read the parent chain into an array and read from top down\n\t\t\t\t\t\tparentGroup = svgGroupWrapper;\n\t\t\t\t\t\twhile (parentGroup) {\n\n\t\t\t\t\t\t\tparents.push(parentGroup);\n\n\t\t\t\t\t\t\t// Move up to the next parent group\n\t\t\t\t\t\t\tparentGroup = parentGroup.parentGroup;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Ensure dynamically updating position when any parent is translated\n\t\t\t\t\t\teach(parents.reverse(), function (parentGroup) {\n\t\t\t\t\t\t\tvar htmlGroupStyle;\n\n\t\t\t\t\t\t\t// Create a HTML div and append it to the parent div to emulate\n\t\t\t\t\t\t\t// the SVG group structure\n\t\t\t\t\t\t\thtmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, {\n\t\t\t\t\t\t\t\tclassName: attr(parentGroup.element, 'class')\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tposition: ABSOLUTE,\n\t\t\t\t\t\t\t\tleft: (parentGroup.translateX || 0) + PX,\n\t\t\t\t\t\t\t\ttop: (parentGroup.translateY || 0) + PX\n\t\t\t\t\t\t\t}, htmlGroup || container); // the top group is appended to container\n\n\t\t\t\t\t\t\t// Shortcut\n\t\t\t\t\t\t\thtmlGroupStyle = htmlGroup.style;\n\n\t\t\t\t\t\t\t// Set listeners to update the HTML div's position whenever the SVG group\n\t\t\t\t\t\t\t// position is changed\n\t\t\t\t\t\t\textend(parentGroup.attrSetters, {\n\t\t\t\t\t\t\t\ttranslateX: function (value) {\n\t\t\t\t\t\t\t\t\thtmlGroupStyle.left = value + PX;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\ttranslateY: function (value) {\n\t\t\t\t\t\t\t\t\thtmlGroupStyle.top = value + PX;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tvisibility: function (value, key) {\n\t\t\t\t\t\t\t\t\thtmlGroupStyle[key] = value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\thtmlGroup = container;\n\t\t\t\t}\n\n\t\t\t\thtmlGroup.appendChild(element);\n\n\t\t\t\t// Shared with VML:\n\t\t\t\twrapper.added = true;\n\t\t\t\tif (wrapper.alignOnAdd) {\n\t\t\t\t\twrapper.htmlUpdateTransform();\n\t\t\t\t}\n\n\t\t\t\treturn wrapper;\n\t\t\t};\n\t\t}\n\t\treturn wrapper;\n\t},\n\n\t/**\n\t * Utility to return the baseline offset and total line height from the font size\n\t */\n\tfontMetrics: function (fontSize) {\n\t\tfontSize = pInt(fontSize || 11);\n\n\t\t// Empirical values found by comparing font size and bounding box height.\n\t\t// Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/\n\t\tvar lineHeight = fontSize < 24 ? fontSize + 4 : mathRound(fontSize * 1.2),\n\t\t\tbaseline = mathRound(lineHeight * 0.8);\n\n\t\treturn {\n\t\t\th: lineHeight,\n\t\t\tb: baseline\n\t\t};\n\t},\n\n\t/**\n\t * Add a label, a text item that can hold a colored or gradient background\n\t * as well as a border and shadow.\n\t * @param {string} str\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {String} shape\n\t * @param {Number} anchorX In case the shape has a pointer, like a flag, this is the\n\t *    coordinates it should be pinned to\n\t * @param {Number} anchorY\n\t * @param {Boolean} baseline Whether to position the label relative to the text baseline,\n\t *    like renderer.text, or to the upper border of the rectangle.\n\t * @param {String} className Class name for the group\n\t */\n\tlabel: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n\n\t\tvar renderer = this,\n\t\t\twrapper = renderer.g(className),\n\t\t\ttext = renderer.text('', 0, 0, useHTML)\n\t\t\t\t.attr({\n\t\t\t\t\tzIndex: 1\n\t\t\t\t}),\n\t\t\t\t//.add(wrapper),\n\t\t\tbox,\n\t\t\tbBox,\n\t\t\talignFactor = 0,\n\t\t\tpadding = 3,\n\t\t\tpaddingLeft = 0,\n\t\t\twidth,\n\t\t\theight,\n\t\t\twrapperX,\n\t\t\twrapperY,\n\t\t\tcrispAdjust = 0,\n\t\t\tdeferredAttr = {},\n\t\t\tbaselineOffset,\n\t\t\tattrSetters = wrapper.attrSetters,\n\t\t\tneedsBox;\n\n\t\t/**\n\t\t * This function runs after the label is added to the DOM (when the bounding box is\n\t\t * available), and after the text of the label is updated to detect the new bounding\n\t\t * box and reflect it in the border box.\n\t\t */\n\t\tfunction updateBoxSize() {\n\t\t\tvar boxX,\n\t\t\t\tboxY,\n\t\t\t\tstyle = text.element.style;\n\n\t\t\tbBox = (width === undefined || height === undefined || wrapper.styles.textAlign) &&\n\t\t\t\ttext.getBBox();\n\t\t\twrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;\n\t\t\twrapper.height = (height || bBox.height || 0) + 2 * padding;\n\n\t\t\t// update the label-scoped y offset\n\t\t\tbaselineOffset = padding + renderer.fontMetrics(style && style.fontSize).b;\n\n\t\t\tif (needsBox) {\n\n\t\t\t\t// create the border box if it is not already present\n\t\t\t\tif (!box) {\n\t\t\t\t\tboxX = mathRound(-alignFactor * padding);\n\t\t\t\t\tboxY = baseline ? -baselineOffset : 0;\n\n\t\t\t\t\twrapper.box = box = shape ?\n\t\t\t\t\t\trenderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height) :\n\t\t\t\t\t\trenderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);\n\t\t\t\t\tbox.add(wrapper);\n\t\t\t\t}\n\n\t\t\t\t// apply the box attributes\n\t\t\t\tif (!box.isImg) { // #1630\n\t\t\t\t\tbox.attr(merge({\n\t\t\t\t\t\twidth: wrapper.width,\n\t\t\t\t\t\theight: wrapper.height\n\t\t\t\t\t}, deferredAttr));\n\t\t\t\t}\n\t\t\t\tdeferredAttr = null;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * This function runs after setting text or padding, but only if padding is changed\n\t\t */\n\t\tfunction updateTextPadding() {\n\t\t\tvar styles = wrapper.styles,\n\t\t\t\ttextAlign = styles && styles.textAlign,\n\t\t\t\tx = paddingLeft + padding * (1 - alignFactor),\n\t\t\t\ty;\n\n\t\t\t// determin y based on the baseline\n\t\t\ty = baseline ? 0 : baselineOffset;\n\n\t\t\t// compensate for alignment\n\t\t\tif (defined(width) && (textAlign === 'center' || textAlign === 'right')) {\n\t\t\t\tx += { center: 0.5, right: 1 }[textAlign] * (width - bBox.width);\n\t\t\t}\n\n\t\t\t// update if anything changed\n\t\t\tif (x !== text.x || y !== text.y) {\n\t\t\t\ttext.attr({\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: y\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// record current values\n\t\t\ttext.x = x;\n\t\t\ttext.y = y;\n\t\t}\n\n\t\t/**\n\t\t * Set a box attribute, or defer it if the box is not yet created\n\t\t * @param {Object} key\n\t\t * @param {Object} value\n\t\t */\n\t\tfunction boxAttr(key, value) {\n\t\t\tif (box) {\n\t\t\t\tbox.attr(key, value);\n\t\t\t} else {\n\t\t\t\tdeferredAttr[key] = value;\n\t\t\t}\n\t\t}\n\n\t\tfunction getSizeAfterAdd() {\n\t\t\ttext.add(wrapper);\n\t\t\twrapper.attr({\n\t\t\t\ttext: str, // alignment is available now\n\t\t\t\tx: x,\n\t\t\t\ty: y\n\t\t\t});\n\n\t\t\tif (box && defined(anchorX)) {\n\t\t\t\twrapper.attr({\n\t\t\t\t\tanchorX: anchorX,\n\t\t\t\t\tanchorY: anchorY\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * After the text element is added, get the desired size of the border box\n\t\t * and add it before the text in the DOM.\n\t\t */\n\t\taddEvent(wrapper, 'add', getSizeAfterAdd);\n\n\t\t/*\n\t\t * Add specific attribute setters.\n\t\t */\n\n\t\t// only change local variables\n\t\tattrSetters.width = function (value) {\n\t\t\twidth = value;\n\t\t\treturn false;\n\t\t};\n\t\tattrSetters.height = function (value) {\n\t\t\theight = value;\n\t\t\treturn false;\n\t\t};\n\t\tattrSetters.padding =  function (value) {\n\t\t\tif (defined(value) && value !== padding) {\n\t\t\t\tpadding = value;\n\t\t\t\tupdateTextPadding();\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\t\tattrSetters.paddingLeft =  function (value) {\n\t\t\tif (defined(value) && value !== paddingLeft) {\n\t\t\t\tpaddingLeft = value;\n\t\t\t\tupdateTextPadding();\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\n\t\t// change local variable and set attribue as well\n\t\tattrSetters.align = function (value) {\n\t\t\talignFactor = { left: 0, center: 0.5, right: 1 }[value];\n\t\t\treturn false; // prevent setting text-anchor on the group\n\t\t};\n\n\t\t// apply these to the box and the text alike\n\t\tattrSetters.text = function (value, key) {\n\t\t\ttext.attr(key, value);\n\t\t\tupdateBoxSize();\n\t\t\tupdateTextPadding();\n\t\t\treturn false;\n\t\t};\n\n\t\t// apply these to the box but not to the text\n\t\tattrSetters[STROKE_WIDTH] = function (value, key) {\n\t\t\tneedsBox = true;\n\t\t\tcrispAdjust = value % 2 / 2;\n\t\t\tboxAttr(key, value);\n\t\t\treturn false;\n\t\t};\n\t\tattrSetters.stroke = attrSetters.fill = attrSetters.r = function (value, key) {\n\t\t\tif (key === 'fill') {\n\t\t\t\tneedsBox = true;\n\t\t\t}\n\t\t\tboxAttr(key, value);\n\t\t\treturn false;\n\t\t};\n\t\tattrSetters.anchorX = function (value, key) {\n\t\t\tanchorX = value;\n\t\t\tboxAttr(key, value + crispAdjust - wrapperX);\n\t\t\treturn false;\n\t\t};\n\t\tattrSetters.anchorY = function (value, key) {\n\t\t\tanchorY = value;\n\t\t\tboxAttr(key, value - wrapperY);\n\t\t\treturn false;\n\t\t};\n\n\t\t// rename attributes\n\t\tattrSetters.x = function (value) {\n\t\t\twrapper.x = value; // for animation getter\n\t\t\tvalue -= alignFactor * ((width || bBox.width) + padding);\n\t\t\twrapperX = mathRound(value);\n\n\t\t\twrapper.attr('translateX', wrapperX);\n\t\t\treturn false;\n\t\t};\n\t\tattrSetters.y = function (value) {\n\t\t\twrapperY = wrapper.y = mathRound(value);\n\t\t\twrapper.attr('translateY', wrapperY);\n\t\t\treturn false;\n\t\t};\n\n\t\t// Redirect certain methods to either the box or the text\n\t\tvar baseCss = wrapper.css;\n\t\treturn extend(wrapper, {\n\t\t\t/**\n\t\t\t * Pick up some properties and apply them to the text instead of the wrapper\n\t\t\t */\n\t\t\tcss: function (styles) {\n\t\t\t\tif (styles) {\n\t\t\t\t\tvar textStyles = {};\n\t\t\t\t\tstyles = merge(styles); // create a copy to avoid altering the original object (#537)\n\t\t\t\t\teach(['fontSize', 'fontWeight', 'fontFamily', 'color', 'lineHeight', 'width', 'textDecoration', 'textShadow'], function (prop) {\n\t\t\t\t\t\tif (styles[prop] !== UNDEFINED) {\n\t\t\t\t\t\t\ttextStyles[prop] = styles[prop];\n\t\t\t\t\t\t\tdelete styles[prop];\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\ttext.css(textStyles);\n\t\t\t\t}\n\t\t\t\treturn baseCss.call(wrapper, styles);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Return the bounding box of the box, not the group\n\t\t\t */\n\t\t\tgetBBox: function () {\n\t\t\t\treturn {\n\t\t\t\t\twidth: bBox.width + 2 * padding,\n\t\t\t\t\theight: bBox.height + 2 * padding,\n\t\t\t\t\tx: bBox.x - padding,\n\t\t\t\t\ty: bBox.y - padding\n\t\t\t\t};\n\t\t\t},\n\t\t\t/**\n\t\t\t * Apply the shadow to the box\n\t\t\t */\n\t\t\tshadow: function (b) {\n\t\t\t\tif (box) {\n\t\t\t\t\tbox.shadow(b);\n\t\t\t\t}\n\t\t\t\treturn wrapper;\n\t\t\t},\n\t\t\t/**\n\t\t\t * Destroy and release memory.\n\t\t\t */\n\t\t\tdestroy: function () {\n\t\t\t\tremoveEvent(wrapper, 'add', getSizeAfterAdd);\n\n\t\t\t\t// Added by button implementation\n\t\t\t\tremoveEvent(wrapper.element, 'mouseenter');\n\t\t\t\tremoveEvent(wrapper.element, 'mouseleave');\n\n\t\t\t\tif (text) {\n\t\t\t\t\ttext = text.destroy();\n\t\t\t\t}\n\t\t\t\tif (box) {\n\t\t\t\t\tbox = box.destroy();\n\t\t\t\t}\n\t\t\t\t// Call base implementation to destroy the rest\n\t\t\t\tSVGElement.prototype.destroy.call(wrapper);\n\n\t\t\t\t// Release local pointers (#1298)\n\t\t\t\twrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = getSizeAfterAdd = null;\n\t\t\t}\n\t\t});\n\t}\n}; // end SVGRenderer\n\n\n// general renderer\nRenderer = SVGRenderer;\n\n\n/* ****************************************************************************\n *                                                                            *\n * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE                              *\n *                                                                            *\n * For applications and websites that don't need IE support, like platform    *\n * targeted mobile apps and web apps, this code can be removed.               *\n *                                                                            *\n *****************************************************************************/\n\n/**\n * @constructor\n */\nvar VMLRenderer, VMLElement;\nif (!hasSVG && !useCanVG) {\n\n/**\n * The VML element wrapper.\n */\nHighcharts.VMLElement = VMLElement = {\n\n\t/**\n\t * Initialize a new VML element wrapper. It builds the markup as a string\n\t * to minimize DOM traffic.\n\t * @param {Object} renderer\n\t * @param {Object} nodeName\n\t */\n\tinit: function (renderer, nodeName) {\n\t\tvar wrapper = this,\n\t\t\tmarkup =  ['<', nodeName, ' filled=\"f\" stroked=\"f\"'],\n\t\t\tstyle = ['position: ', ABSOLUTE, ';'],\n\t\t\tisDiv = nodeName === DIV;\n\n\t\t// divs and shapes need size\n\t\tif (nodeName === 'shape' || isDiv) {\n\t\t\tstyle.push('left:0;top:0;width:1px;height:1px;');\n\t\t}\n\t\tstyle.push('visibility: ', isDiv ? HIDDEN : VISIBLE);\n\n\t\tmarkup.push(' style=\"', style.join(''), '\"/>');\n\n\t\t// create element with default attributes and style\n\t\tif (nodeName) {\n\t\t\tmarkup = isDiv || nodeName === 'span' || nodeName === 'img' ?\n\t\t\t\tmarkup.join('')\n\t\t\t\t: renderer.prepVML(markup);\n\t\t\twrapper.element = createElement(markup);\n\t\t}\n\n\t\twrapper.renderer = renderer;\n\t\twrapper.attrSetters = {};\n\t},\n\n\t/**\n\t * Add the node to the given parent\n\t * @param {Object} parent\n\t */\n\tadd: function (parent) {\n\t\tvar wrapper = this,\n\t\t\trenderer = wrapper.renderer,\n\t\t\telement = wrapper.element,\n\t\t\tbox = renderer.box,\n\t\t\tinverted = parent && parent.inverted,\n\n\t\t\t// get the parent node\n\t\t\tparentNode = parent ?\n\t\t\t\tparent.element || parent :\n\t\t\t\tbox;\n\n\n\t\t// if the parent group is inverted, apply inversion on all children\n\t\tif (inverted) { // only on groups\n\t\t\trenderer.invertChild(element, parentNode);\n\t\t}\n\n\t\t// append it\n\t\tparentNode.appendChild(element);\n\n\t\t// align text after adding to be able to read offset\n\t\twrapper.added = true;\n\t\tif (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {\n\t\t\twrapper.updateTransform();\n\t\t}\n\n\t\t// fire an event for internal hooks\n\t\tfireEvent(wrapper, 'add');\n\n\t\treturn wrapper;\n\t},\n\n\t/**\n\t * VML always uses htmlUpdateTransform\n\t */\n\tupdateTransform: SVGElement.prototype.htmlUpdateTransform,\n\n\t/**\n\t * Set the rotation of a span with oldIE's filter\n\t */\n\tsetSpanRotation: function (rotation, sintheta, costheta) {\n\t\t// Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented\n\t\t// but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+\n\t\t// has support for CSS3 transform. The getBBox method also needs to be updated\n\t\t// to compensate for the rotation, like it currently does for SVG.\n\t\t// Test case: http://highcharts.com/tests/?file=text-rotation\n\t\tcss(this.element, {\n\t\t\tfilter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,\n\t\t\t\t', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,\n\t\t\t\t', sizingMethod=\\'auto expand\\')'].join('') : NONE\n\t\t});\n\t},\n\n\t/**\n\t * Converts a subset of an SVG path definition to its VML counterpart. Takes an array\n\t * as the parameter and returns a string.\n\t */\n\tpathToVML: function (value) {\n\t\t// convert paths\n\t\tvar i = value.length,\n\t\t\tpath = [],\n\t\t\tclockwise;\n\n\t\twhile (i--) {\n\n\t\t\t// Multiply by 10 to allow subpixel precision.\n\t\t\t// Substracting half a pixel seems to make the coordinates\n\t\t\t// align with SVG, but this hasn't been tested thoroughly\n\t\t\tif (isNumber(value[i])) {\n\t\t\t\tpath[i] = mathRound(value[i] * 10) - 5;\n\t\t\t} else if (value[i] === 'Z') { // close the path\n\t\t\t\tpath[i] = 'x';\n\t\t\t} else {\n\t\t\t\tpath[i] = value[i];\n\n\t\t\t\t// When the start X and end X coordinates of an arc are too close,\n\t\t\t\t// they are rounded to the same value above. In this case, substract 1 from the end X\n\t\t\t\t// position. #760, #1371.\n\t\t\t\tif (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {\n\t\t\t\t\tclockwise = value[i] === 'wa' ? 1 : -1; // #1642\n\t\t\t\t\tif (path[i + 5] === path[i + 7]) {\n\t\t\t\t\t\tpath[i + 7] -= clockwise;\n\t\t\t\t\t}\n\t\t\t\t\t// Start and end Y (#1410)\n\t\t\t\t\tif (path[i + 6] === path[i + 8]) {\n\t\t\t\t\t\tpath[i + 8] -= clockwise;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Loop up again to handle path shortcuts (#2132)\n\t\t/*while (i++ < path.length) {\n\t\t\tif (path[i] === 'H') { // horizontal line to\n\t\t\t\tpath[i] = 'L';\n\t\t\t\tpath.splice(i + 2, 0, path[i - 1]);\n\t\t\t} else if (path[i] === 'V') { // vertical line to\n\t\t\t\tpath[i] = 'L';\n\t\t\t\tpath.splice(i + 1, 0, path[i - 2]);\n\t\t\t}\n\t\t}*/\n\t\treturn path.join(' ') || 'x';\n\t},\n\n\t/**\n\t * Get or set attributes\n\t */\n\tattr: function (hash, val) {\n\t\tvar wrapper = this,\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\ti,\n\t\t\tresult,\n\t\t\telement = wrapper.element || {},\n\t\t\telemStyle = element.style,\n\t\t\tnodeName = element.nodeName,\n\t\t\trenderer = wrapper.renderer,\n\t\t\tsymbolName = wrapper.symbolName,\n\t\t\thasSetSymbolSize,\n\t\t\tshadows = wrapper.shadows,\n\t\t\tskipAttr,\n\t\t\tattrSetters = wrapper.attrSetters,\n\t\t\tret = wrapper;\n\n\t\t// single key-value pair\n\t\tif (isString(hash) && defined(val)) {\n\t\t\tkey = hash;\n\t\t\thash = {};\n\t\t\thash[key] = val;\n\t\t}\n\n\t\t// used as a getter, val is undefined\n\t\tif (isString(hash)) {\n\t\t\tkey = hash;\n\t\t\tif (key === 'strokeWidth' || key === 'stroke-width') {\n\t\t\t\tret = wrapper.strokeweight;\n\t\t\t} else {\n\t\t\t\tret = wrapper[key];\n\t\t\t}\n\n\t\t// setter\n\t\t} else {\n\t\t\tfor (key in hash) {\n\t\t\t\tvalue = hash[key];\n\t\t\t\tskipAttr = false;\n\n\t\t\t\t// check for a specific attribute setter\n\t\t\t\tresult = attrSetters[key] && attrSetters[key].call(wrapper, value, key);\n\n\t\t\t\tif (result !== false && value !== null) { // #620\n\n\t\t\t\t\tif (result !== UNDEFINED) {\n\t\t\t\t\t\tvalue = result; // the attribute setter has returned a new value to set\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// prepare paths\n\t\t\t\t\t// symbols\n\t\t\t\t\tif (symbolName && /^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(key)) {\n\t\t\t\t\t\t// if one of the symbol size affecting parameters are changed,\n\t\t\t\t\t\t// check all the others only once for each call to an element's\n\t\t\t\t\t\t// .attr() method\n\t\t\t\t\t\tif (!hasSetSymbolSize) {\n\t\t\t\t\t\t\twrapper.symbolAttr(hash);\n\n\t\t\t\t\t\t\thasSetSymbolSize = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t} else if (key === 'd') {\n\t\t\t\t\t\tvalue = value || [];\n\t\t\t\t\t\twrapper.d = value.join(' '); // used in getter for animation\n\n\t\t\t\t\t\telement.path = value = wrapper.pathToVML(value);\n\n\t\t\t\t\t\t// update shadows\n\t\t\t\t\t\tif (shadows) {\n\t\t\t\t\t\t\ti = shadows.length;\n\t\t\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\t\t\tshadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// handle visibility\n\t\t\t\t\t} else if (key === 'visibility') {\n\n\t\t\t\t\t\t// let the shadow follow the main element\n\t\t\t\t\t\tif (shadows) {\n\t\t\t\t\t\t\ti = shadows.length;\n\t\t\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\t\t\tshadows[i].style[key] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Instead of toggling the visibility CSS property, move the div out of the viewport.\n\t\t\t\t\t\t// This works around #61 and #586\n\t\t\t\t\t\tif (nodeName === 'DIV') {\n\t\t\t\t\t\t\tvalue = value === HIDDEN ? '-999em' : 0;\n\n\t\t\t\t\t\t\t// In order to redraw, IE7 needs the div to be visible when tucked away\n\t\t\t\t\t\t\t// outside the viewport. So the visibility is actually opposite of\n\t\t\t\t\t\t\t// the expected value. This applies to the tooltip only.\n\t\t\t\t\t\t\tif (!docMode8) {\n\t\t\t\t\t\t\t\telemStyle[key] = value ? VISIBLE : HIDDEN;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tkey = 'top';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telemStyle[key] = value;\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// directly mapped to css\n\t\t\t\t\t} else if (key === 'zIndex') {\n\n\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\telemStyle[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// x, y, width, height\n\t\t\t\t\t} else if (inArray(key, ['x', 'y', 'width', 'height']) !== -1) {\n\n\t\t\t\t\t\twrapper[key] = value; // used in getter\n\n\t\t\t\t\t\tif (key === 'x' || key === 'y') {\n\t\t\t\t\t\t\tkey = { x: 'left', y: 'top' }[key];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalue = mathMax(0, value); // don't set width or height below zero (#311)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// clipping rectangle special\n\t\t\t\t\t\tif (wrapper.updateClipping) {\n\t\t\t\t\t\t\twrapper[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'\n\t\t\t\t\t\t\twrapper.updateClipping();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// normal\n\t\t\t\t\t\t\telemStyle[key] = value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// class name\n\t\t\t\t\t} else if (key === 'class' && nodeName === 'DIV') {\n\t\t\t\t\t\t// IE8 Standards mode has problems retrieving the className\n\t\t\t\t\t\telement.className = value;\n\n\t\t\t\t\t// stroke\n\t\t\t\t\t} else if (key === 'stroke') {\n\n\t\t\t\t\t\tvalue = renderer.color(value, element, key);\n\n\t\t\t\t\t\tkey = 'strokecolor';\n\n\t\t\t\t\t// stroke width\n\t\t\t\t\t} else if (key === 'stroke-width' || key === 'strokeWidth') {\n\t\t\t\t\t\telement.stroked = value ? true : false;\n\t\t\t\t\t\tkey = 'strokeweight';\n\t\t\t\t\t\twrapper[key] = value; // used in getter, issue #113\n\t\t\t\t\t\tif (isNumber(value)) {\n\t\t\t\t\t\t\tvalue += PX;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// dashStyle\n\t\t\t\t\t} else if (key === 'dashstyle') {\n\t\t\t\t\t\tvar strokeElem = element.getElementsByTagName('stroke')[0] ||\n\t\t\t\t\t\t\tcreateElement(renderer.prepVML(['<stroke/>']), null, null, element);\n\t\t\t\t\t\tstrokeElem[key] = value || 'solid';\n\t\t\t\t\t\twrapper.dashstyle = value; /* because changing stroke-width will change the dash length\n\t\t\t\t\t\t\tand cause an epileptic effect */\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// fill\n\t\t\t\t\t} else if (key === 'fill') {\n\n\t\t\t\t\t\tif (nodeName === 'SPAN') { // text color\n\t\t\t\t\t\t\telemStyle.color = value;\n\t\t\t\t\t\t} else if (nodeName !== 'IMG') { // #1336\n\t\t\t\t\t\t\telement.filled = value !== NONE ? true : false;\n\n\t\t\t\t\t\t\tvalue = renderer.color(value, element, key, wrapper);\n\n\t\t\t\t\t\t\tkey = 'fillcolor';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// opacity: don't bother - animation is too slow and filters introduce artifacts\n\t\t\t\t\t} else if (key === 'opacity') {\n\t\t\t\t\t\t/*css(element, {\n\t\t\t\t\t\t\topacity: value\n\t\t\t\t\t\t});*/\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// rotation on VML elements\n\t\t\t\t\t} else if (nodeName === 'shape' && key === 'rotation') {\n\n\t\t\t\t\t\twrapper[key] = element.style[key] = value; // style is for #1873\n\n\t\t\t\t\t\t// Correction for the 1x1 size of the shape container. Used in gauge needles.\n\t\t\t\t\t\telement.style.left = -mathRound(mathSin(value * deg2rad) + 1) + PX;\n\t\t\t\t\t\telement.style.top = mathRound(mathCos(value * deg2rad)) + PX;\n\n\t\t\t\t\t// translation for animation\n\t\t\t\t\t} else if (key === 'translateX' || key === 'translateY' || key === 'rotation') {\n\t\t\t\t\t\twrapper[key] = value;\n\t\t\t\t\t\twrapper.updateTransform();\n\n\t\t\t\t\t\tskipAttr = true;\n\n\t\t\t\t\t// text for rotated and non-rotated elements\n\t\t\t\t\t} else if (key === 'text') {\n\t\t\t\t\t\tthis.bBox = null;\n\t\t\t\t\t\telement.innerHTML = value;\n\t\t\t\t\t\tskipAttr = true;\n\t\t\t\t\t}\n\n\n\t\t\t\t\tif (!skipAttr) {\n\t\t\t\t\t\tif (docMode8) { // IE8 setAttribute bug\n\t\t\t\t\t\t\telement[key] = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tattr(element, key, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t},\n\n\t/**\n\t * Set the element's clipping to a predefined rectangle\n\t *\n\t * @param {String} id The id of the clip rectangle\n\t */\n\tclip: function (clipRect) {\n\t\tvar wrapper = this,\n\t\t\tclipMembers,\n\t\t\tcssRet;\n\n\t\tif (clipRect) {\n\t\t\tclipMembers = clipRect.members;\n\t\t\terase(clipMembers, wrapper); // Ensure unique list of elements (#1258)\n\t\t\tclipMembers.push(wrapper);\n\t\t\twrapper.destroyClip = function () {\n\t\t\t\terase(clipMembers, wrapper);\n\t\t\t};\n\t\t\tcssRet = clipRect.getCSS(wrapper);\n\n\t\t} else {\n\t\t\tif (wrapper.destroyClip) {\n\t\t\t\twrapper.destroyClip();\n\t\t\t}\n\t\t\tcssRet = { clip: docMode8 ? 'inherit' : 'rect(auto)' }; // #1214\n\t\t}\n\n\t\treturn wrapper.css(cssRet);\n\n\t},\n\n\t/**\n\t * Set styles for the element\n\t * @param {Object} styles\n\t */\n\tcss: SVGElement.prototype.htmlCss,\n\n\t/**\n\t * Removes a child either by removeChild or move to garbageBin.\n\t * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.\n\t */\n\tsafeRemoveChild: function (element) {\n\t\t// discardElement will detach the node from its parent before attaching it\n\t\t// to the garbage bin. Therefore it is important that the node is attached and have parent.\n\t\tif (element.parentNode) {\n\t\t\tdiscardElement(element);\n\t\t}\n\t},\n\n\t/**\n\t * Extend element.destroy by removing it from the clip members array\n\t */\n\tdestroy: function () {\n\t\tif (this.destroyClip) {\n\t\t\tthis.destroyClip();\n\t\t}\n\n\t\treturn SVGElement.prototype.destroy.apply(this);\n\t},\n\n\t/**\n\t * Add an event listener. VML override for normalizing event parameters.\n\t * @param {String} eventType\n\t * @param {Function} handler\n\t */\n\ton: function (eventType, handler) {\n\t\t// simplest possible event model for internal use\n\t\tthis.element['on' + eventType] = function () {\n\t\t\tvar evt = win.event;\n\t\t\tevt.target = evt.srcElement;\n\t\t\thandler(evt);\n\t\t};\n\t\treturn this;\n\t},\n\n\t/**\n\t * In stacked columns, cut off the shadows so that they don't overlap\n\t */\n\tcutOffPath: function (path, length) {\n\n\t\tvar len;\n\n\t\tpath = path.split(/[ ,]/);\n\t\tlen = path.length;\n\n\t\tif (len === 9 || len === 11) {\n\t\t\tpath[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;\n\t\t}\n\t\treturn path.join(' ');\n\t},\n\n\t/**\n\t * Apply a drop shadow by copying elements and giving them different strokes\n\t * @param {Boolean|Object} shadowOptions\n\t */\n\tshadow: function (shadowOptions, group, cutOff) {\n\t\tvar shadows = [],\n\t\t\ti,\n\t\t\telement = this.element,\n\t\t\trenderer = this.renderer,\n\t\t\tshadow,\n\t\t\telemStyle = element.style,\n\t\t\tmarkup,\n\t\t\tpath = element.path,\n\t\t\tstrokeWidth,\n\t\t\tmodifiedPath,\n\t\t\tshadowWidth,\n\t\t\tshadowElementOpacity;\n\n\t\t// some times empty paths are not strings\n\t\tif (path && typeof path.value !== 'string') {\n\t\t\tpath = 'x';\n\t\t}\n\t\tmodifiedPath = path;\n\n\t\tif (shadowOptions) {\n\t\t\tshadowWidth = pick(shadowOptions.width, 3);\n\t\t\tshadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\n\t\t\tfor (i = 1; i <= 3; i++) {\n\n\t\t\t\tstrokeWidth = (shadowWidth * 2) + 1 - (2 * i);\n\n\t\t\t\t// Cut off shadows for stacked column items\n\t\t\t\tif (cutOff) {\n\t\t\t\t\tmodifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);\n\t\t\t\t}\n\n\t\t\t\tmarkup = ['<shape isShadow=\"true\" strokeweight=\"', strokeWidth,\n\t\t\t\t\t'\" filled=\"false\" path=\"', modifiedPath,\n\t\t\t\t\t'\" coordsize=\"10 10\" style=\"', element.style.cssText, '\" />'];\n\n\t\t\t\tshadow = createElement(renderer.prepVML(markup),\n\t\t\t\t\tnull, {\n\t\t\t\t\t\tleft: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),\n\t\t\t\t\t\ttop: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tif (cutOff) {\n\t\t\t\t\tshadow.cutOff = strokeWidth + 1;\n\t\t\t\t}\n\n\t\t\t\t// apply the opacity\n\t\t\t\tmarkup = ['<stroke color=\"', shadowOptions.color || 'black', '\" opacity=\"', shadowElementOpacity * i, '\"/>'];\n\t\t\t\tcreateElement(renderer.prepVML(markup), null, null, shadow);\n\n\n\t\t\t\t// insert it\n\t\t\t\tif (group) {\n\t\t\t\t\tgroup.element.appendChild(shadow);\n\t\t\t\t} else {\n\t\t\t\t\telement.parentNode.insertBefore(shadow, element);\n\t\t\t\t}\n\n\t\t\t\t// record it\n\t\t\t\tshadows.push(shadow);\n\n\t\t\t}\n\n\t\t\tthis.shadows = shadows;\n\t\t}\n\t\treturn this;\n\n\t}\n};\nVMLElement = extendClass(SVGElement, VMLElement);\n\n/**\n * The VML renderer\n */\nvar VMLRendererExtension = { // inherit SVGRenderer\n\n\tElement: VMLElement,\n\tisIE8: userAgent.indexOf('MSIE 8.0') > -1,\n\n\n\t/**\n\t * Initialize the VMLRenderer\n\t * @param {Object} container\n\t * @param {Number} width\n\t * @param {Number} height\n\t */\n\tinit: function (container, width, height) {\n\t\tvar renderer = this,\n\t\t\tboxWrapper,\n\t\t\tbox;\n\n\t\trenderer.alignedObjects = [];\n\n\t\tboxWrapper = renderer.createElement(DIV);\n\t\tbox = boxWrapper.element;\n\t\tbox.style.position = RELATIVE; // for freeform drawing using renderer directly\n\t\tcontainer.appendChild(boxWrapper.element);\n\n\n\t\t// generate the containing box\n\t\trenderer.isVML = true;\n\t\trenderer.box = box;\n\t\trenderer.boxWrapper = boxWrapper;\n\n\n\t\trenderer.setSize(width, height, false);\n\n\t\t// The only way to make IE6 and IE7 print is to use a global namespace. However,\n\t\t// with IE8 the only way to make the dynamic shapes visible in screen and print mode\n\t\t// seems to be to add the xmlns attribute and the behaviour style inline.\n\t\tif (!doc.namespaces.hcv) {\n\n\t\t\tdoc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');\n\n\t\t\t// Setup default CSS (#2153)\n\t\t\t(doc.styleSheets.length ? doc.styleSheets[0] : doc.createStyleSheet()).cssText +=\n\t\t\t\t'hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke' +\n\t\t\t\t'{ behavior:url(#default#VML); display: inline-block; } ';\n\n\t\t}\n\t},\n\n\n\t/**\n\t * Detect whether the renderer is hidden. This happens when one of the parent elements\n\t * has display: none\n\t */\n\tisHidden: function () {\n\t\treturn !this.box.offsetWidth;\n\t},\n\n\t/**\n\t * Define a clipping rectangle. In VML it is accomplished by storing the values\n\t * for setting the CSS style to all associated members.\n\t *\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} width\n\t * @param {Number} height\n\t */\n\tclipRect: function (x, y, width, height) {\n\n\t\t// create a dummy element\n\t\tvar clipRect = this.createElement(),\n\t\t\tisObj = isObject(x);\n\n\t\t// mimic a rectangle with its style object for automatic updating in attr\n\t\treturn extend(clipRect, {\n\t\t\tmembers: [],\n\t\t\tleft: (isObj ? x.x : x) + 1,\n\t\t\ttop: (isObj ? x.y : y) + 1,\n\t\t\twidth: (isObj ? x.width : width) - 1,\n\t\t\theight: (isObj ? x.height : height) - 1,\n\t\t\tgetCSS: function (wrapper) {\n\t\t\t\tvar element = wrapper.element,\n\t\t\t\t\tnodeName = element.nodeName,\n\t\t\t\t\tisShape = nodeName === 'shape',\n\t\t\t\t\tinverted = wrapper.inverted,\n\t\t\t\t\trect = this,\n\t\t\t\t\ttop = rect.top - (isShape ? element.offsetTop : 0),\n\t\t\t\t\tleft = rect.left,\n\t\t\t\t\tright = left + rect.width,\n\t\t\t\t\tbottom = top + rect.height,\n\t\t\t\t\tret = {\n\t\t\t\t\t\tclip: 'rect(' +\n\t\t\t\t\t\t\tmathRound(inverted ? left : top) + 'px,' +\n\t\t\t\t\t\t\tmathRound(inverted ? bottom : right) + 'px,' +\n\t\t\t\t\t\t\tmathRound(inverted ? right : bottom) + 'px,' +\n\t\t\t\t\t\t\tmathRound(inverted ? top : left) + 'px)'\n\t\t\t\t\t};\n\n\t\t\t\t// issue 74 workaround\n\t\t\t\tif (!inverted && docMode8 && nodeName === 'DIV') {\n\t\t\t\t\textend(ret, {\n\t\t\t\t\t\twidth: right + PX,\n\t\t\t\t\t\theight: bottom + PX\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t},\n\n\t\t\t// used in attr and animation to update the clipping of all members\n\t\t\tupdateClipping: function () {\n\t\t\t\teach(clipRect.members, function (member) {\n\t\t\t\t\tmember.css(clipRect.getCSS(member));\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t},\n\n\n\t/**\n\t * Take a color and return it if it's a string, make it a gradient if it's a\n\t * gradient configuration object, and apply opacity.\n\t *\n\t * @param {Object} color The color or config object\n\t */\n\tcolor: function (color, elem, prop, wrapper) {\n\t\tvar renderer = this,\n\t\t\tcolorObject,\n\t\t\tregexRgba = /^rgba/,\n\t\t\tmarkup,\n\t\t\tfillType,\n\t\t\tret = NONE;\n\n\t\t// Check for linear or radial gradient\n\t\tif (color && color.linearGradient) {\n\t\t\tfillType = 'gradient';\n\t\t} else if (color && color.radialGradient) {\n\t\t\tfillType = 'pattern';\n\t\t}\n\n\n\t\tif (fillType) {\n\n\t\t\tvar stopColor,\n\t\t\t\tstopOpacity,\n\t\t\t\tgradient = color.linearGradient || color.radialGradient,\n\t\t\t\tx1,\n\t\t\t\ty1,\n\t\t\t\tx2,\n\t\t\t\ty2,\n\t\t\t\topacity1,\n\t\t\t\topacity2,\n\t\t\t\tcolor1,\n\t\t\t\tcolor2,\n\t\t\t\tfillAttr = '',\n\t\t\t\tstops = color.stops,\n\t\t\t\tfirstStop,\n\t\t\t\tlastStop,\n\t\t\t\tcolors = [],\n\t\t\t\taddFillNode = function () {\n\t\t\t\t\t// Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2\n\t\t\t\t\t// are reversed.\n\t\t\t\t\tmarkup = ['<fill colors=\"' + colors.join(',') + '\" opacity=\"', opacity2, '\" o:opacity2=\"', opacity1,\n\t\t\t\t\t\t'\" type=\"', fillType, '\" ', fillAttr, 'focus=\"100%\" method=\"any\" />'];\n\t\t\t\t\tcreateElement(renderer.prepVML(markup), null, null, elem);\n\t\t\t\t};\n\n\t\t\t// Extend from 0 to 1\n\t\t\tfirstStop = stops[0];\n\t\t\tlastStop = stops[stops.length - 1];\n\t\t\tif (firstStop[0] > 0) {\n\t\t\t\tstops.unshift([\n\t\t\t\t\t0,\n\t\t\t\t\tfirstStop[1]\n\t\t\t\t]);\n\t\t\t}\n\t\t\tif (lastStop[0] < 1) {\n\t\t\t\tstops.push([\n\t\t\t\t\t1,\n\t\t\t\t\tlastStop[1]\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\t// Compute the stops\n\t\t\teach(stops, function (stop, i) {\n\t\t\t\tif (regexRgba.test(stop[1])) {\n\t\t\t\t\tcolorObject = Color(stop[1]);\n\t\t\t\t\tstopColor = colorObject.get('rgb');\n\t\t\t\t\tstopOpacity = colorObject.get('a');\n\t\t\t\t} else {\n\t\t\t\t\tstopColor = stop[1];\n\t\t\t\t\tstopOpacity = 1;\n\t\t\t\t}\n\n\t\t\t\t// Build the color attribute\n\t\t\t\tcolors.push((stop[0] * 100) + '% ' + stopColor);\n\n\t\t\t\t// Only start and end opacities are allowed, so we use the first and the last\n\t\t\t\tif (!i) {\n\t\t\t\t\topacity1 = stopOpacity;\n\t\t\t\t\tcolor2 = stopColor;\n\t\t\t\t} else {\n\t\t\t\t\topacity2 = stopOpacity;\n\t\t\t\t\tcolor1 = stopColor;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Apply the gradient to fills only.\n\t\t\tif (prop === 'fill') {\n\n\t\t\t\t// Handle linear gradient angle\n\t\t\t\tif (fillType === 'gradient') {\n\t\t\t\t\tx1 = gradient.x1 || gradient[0] || 0;\n\t\t\t\t\ty1 = gradient.y1 || gradient[1] || 0;\n\t\t\t\t\tx2 = gradient.x2 || gradient[2] || 0;\n\t\t\t\t\ty2 = gradient.y2 || gradient[3] || 0;\n\t\t\t\t\tfillAttr = 'angle=\"' + (90  - math.atan(\n\t\t\t\t\t\t(y2 - y1) / // y vector\n\t\t\t\t\t\t(x2 - x1) // x vector\n\t\t\t\t\t\t) * 180 / mathPI) + '\"';\n\n\t\t\t\t\taddFillNode();\n\n\t\t\t\t// Radial (circular) gradient\n\t\t\t\t} else {\n\n\t\t\t\t\tvar r = gradient.r,\n\t\t\t\t\t\tsizex = r * 2,\n\t\t\t\t\t\tsizey = r * 2,\n\t\t\t\t\t\tcx = gradient.cx,\n\t\t\t\t\t\tcy = gradient.cy,\n\t\t\t\t\t\tradialReference = elem.radialReference,\n\t\t\t\t\t\tbBox,\n\t\t\t\t\t\tapplyRadialGradient = function () {\n\t\t\t\t\t\t\tif (radialReference) {\n\t\t\t\t\t\t\t\tbBox = wrapper.getBBox();\n\t\t\t\t\t\t\t\tcx += (radialReference[0] - bBox.x) / bBox.width - 0.5;\n\t\t\t\t\t\t\t\tcy += (radialReference[1] - bBox.y) / bBox.height - 0.5;\n\t\t\t\t\t\t\t\tsizex *= radialReference[2] / bBox.width;\n\t\t\t\t\t\t\t\tsizey *= radialReference[2] / bBox.height;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfillAttr = 'src=\"' + defaultOptions.global.VMLRadialGradientURL + '\" ' +\n\t\t\t\t\t\t\t\t'size=\"' + sizex + ',' + sizey + '\" ' +\n\t\t\t\t\t\t\t\t'origin=\"0.5,0.5\" ' +\n\t\t\t\t\t\t\t\t'position=\"' + cx + ',' + cy + '\" ' +\n\t\t\t\t\t\t\t\t'color2=\"' + color2 + '\" ';\n\n\t\t\t\t\t\t\taddFillNode();\n\t\t\t\t\t\t};\n\n\t\t\t\t\t// Apply radial gradient\n\t\t\t\t\tif (wrapper.added) {\n\t\t\t\t\t\tapplyRadialGradient();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// We need to know the bounding box to get the size and position right\n\t\t\t\t\t\taddEvent(wrapper, 'add', applyRadialGradient);\n\t\t\t\t\t}\n\n\t\t\t\t\t// The fill element's color attribute is broken in IE8 standards mode, so we\n\t\t\t\t\t// need to set the parent shape's fillcolor attribute instead.\n\t\t\t\t\tret = color1;\n\t\t\t\t}\n\n\t\t\t// Gradients are not supported for VML stroke, return the first color. #722.\n\t\t\t} else {\n\t\t\t\tret = stopColor;\n\t\t\t}\n\n\t\t// if the color is an rgba color, split it and add a fill node\n\t\t// to hold the opacity component\n\t\t} else if (regexRgba.test(color) && elem.tagName !== 'IMG') {\n\n\t\t\tcolorObject = Color(color);\n\n\t\t\tmarkup = ['<', prop, ' opacity=\"', colorObject.get('a'), '\"/>'];\n\t\t\tcreateElement(this.prepVML(markup), null, null, elem);\n\n\t\t\tret = colorObject.get('rgb');\n\n\n\t\t} else {\n\t\t\tvar propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node\n\t\t\tif (propNodes.length) {\n\t\t\t\tpropNodes[0].opacity = 1;\n\t\t\t\tpropNodes[0].type = 'solid';\n\t\t\t}\n\t\t\tret = color;\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t/**\n\t * Take a VML string and prepare it for either IE8 or IE6/IE7.\n\t * @param {Array} markup A string array of the VML markup to prepare\n\t */\n\tprepVML: function (markup) {\n\t\tvar vmlStyle = 'display:inline-block;behavior:url(#default#VML);',\n\t\t\tisIE8 = this.isIE8;\n\n\t\tmarkup = markup.join('');\n\n\t\tif (isIE8) { // add xmlns and style inline\n\t\t\tmarkup = markup.replace('/>', ' xmlns=\"urn:schemas-microsoft-com:vml\" />');\n\t\t\tif (markup.indexOf('style=\"') === -1) {\n\t\t\t\tmarkup = markup.replace('/>', ' style=\"' + vmlStyle + '\" />');\n\t\t\t} else {\n\t\t\t\tmarkup = markup.replace('style=\"', 'style=\"' + vmlStyle);\n\t\t\t}\n\n\t\t} else { // add namespace\n\t\t\tmarkup = markup.replace('<', '<hcv:');\n\t\t}\n\n\t\treturn markup;\n\t},\n\n\t/**\n\t * Create rotated and aligned text\n\t * @param {String} str\n\t * @param {Number} x\n\t * @param {Number} y\n\t */\n\ttext: SVGRenderer.prototype.html,\n\n\t/**\n\t * Create and return a path element\n\t * @param {Array} path\n\t */\n\tpath: function (path) {\n\t\tvar attr = {\n\t\t\t// subpixel precision down to 0.1 (width and height = 1px)\n\t\t\tcoordsize: '10 10'\n\t\t};\n\t\tif (isArray(path)) {\n\t\t\tattr.d = path;\n\t\t} else if (isObject(path)) { // attributes\n\t\t\textend(attr, path);\n\t\t}\n\t\t// create the shape\n\t\treturn this.createElement('shape').attr(attr);\n\t},\n\n\t/**\n\t * Create and return a circle element. In VML circles are implemented as\n\t * shapes, which is faster than v:oval\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} r\n\t */\n\tcircle: function (x, y, r) {\n\t\tvar circle = this.symbol('circle');\n\t\tif (isObject(x)) {\n\t\t\tr = x.r;\n\t\t\ty = x.y;\n\t\t\tx = x.x;\n\t\t}\n\t\tcircle.isCircle = true; // Causes x and y to mean center (#1682)\n\t\tcircle.r = r;\n\t\treturn circle.attr({ x: x, y: y });\n\t},\n\n\t/**\n\t * Create a group using an outer div and an inner v:group to allow rotating\n\t * and flipping. A simple v:group would have problems with positioning\n\t * child HTML elements and CSS clip.\n\t *\n\t * @param {String} name The name of the group\n\t */\n\tg: function (name) {\n\t\tvar wrapper,\n\t\t\tattribs;\n\n\t\t// set the class name\n\t\tif (name) {\n\t\t\tattribs = { 'className': PREFIX + name, 'class': PREFIX + name };\n\t\t}\n\n\t\t// the div to hold HTML and clipping\n\t\twrapper = this.createElement(DIV).attr(attribs);\n\n\t\treturn wrapper;\n\t},\n\n\t/**\n\t * VML override to create a regular HTML image\n\t * @param {String} src\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} width\n\t * @param {Number} height\n\t */\n\timage: function (src, x, y, width, height) {\n\t\tvar obj = this.createElement('img')\n\t\t\t.attr({ src: src });\n\n\t\tif (arguments.length > 1) {\n\t\t\tobj.attr({\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t});\n\t\t}\n\t\treturn obj;\n\t},\n\n\t/**\n\t * VML uses a shape for rect to overcome bugs and rotation problems\n\t */\n\trect: function (x, y, width, height, r, strokeWidth) {\n\n\t\tvar wrapper = this.symbol('rect');\n\t\twrapper.r = isObject(x) ? x.r : r;\n\n\t\t//return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0)));\n\t\treturn wrapper.attr(\n\t\t\t\tisObject(x) ?\n\t\t\t\t\tx :\n\t\t\t\t\t// do not crispify when an object is passed in (as in column charts)\n\t\t\t\t\twrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))\n\t\t\t);\n\t},\n\n\t/**\n\t * In the VML renderer, each child of an inverted div (group) is inverted\n\t * @param {Object} element\n\t * @param {Object} parentNode\n\t */\n\tinvertChild: function (element, parentNode) {\n\t\tvar parentStyle = parentNode.style;\n\t\tcss(element, {\n\t\t\tflip: 'x',\n\t\t\tleft: pInt(parentStyle.width) - 1,\n\t\t\ttop: pInt(parentStyle.height) - 1,\n\t\t\trotation: -90\n\t\t});\n\t},\n\n\t/**\n\t * Symbol definitions that override the parent SVG renderer's symbols\n\t *\n\t */\n\tsymbols: {\n\t\t// VML specific arc function\n\t\tarc: function (x, y, w, h, options) {\n\t\t\tvar start = options.start,\n\t\t\t\tend = options.end,\n\t\t\t\tradius = options.r || w || h,\n\t\t\t\tinnerRadius = options.innerR,\n\t\t\t\tcosStart = mathCos(start),\n\t\t\t\tsinStart = mathSin(start),\n\t\t\t\tcosEnd = mathCos(end),\n\t\t\t\tsinEnd = mathSin(end),\n\t\t\t\tret;\n\n\t\t\tif (end - start === 0) { // no angle, don't show it.\n\t\t\t\treturn ['x'];\n\t\t\t}\n\n\t\t\tret = [\n\t\t\t\t'wa', // clockwise arc to\n\t\t\t\tx - radius, // left\n\t\t\t\ty - radius, // top\n\t\t\t\tx + radius, // right\n\t\t\t\ty + radius, // bottom\n\t\t\t\tx + radius * cosStart, // start x\n\t\t\t\ty + radius * sinStart, // start y\n\t\t\t\tx + radius * cosEnd, // end x\n\t\t\t\ty + radius * sinEnd  // end y\n\t\t\t];\n\n\t\t\tif (options.open && !innerRadius) {\n\t\t\t\tret.push(\n\t\t\t\t\t'e',\n\t\t\t\t\tM,\n\t\t\t\t\tx,// - innerRadius,\n\t\t\t\t\ty// - innerRadius\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.push(\n\t\t\t\t'at', // anti clockwise arc to\n\t\t\t\tx - innerRadius, // left\n\t\t\t\ty - innerRadius, // top\n\t\t\t\tx + innerRadius, // right\n\t\t\t\ty + innerRadius, // bottom\n\t\t\t\tx + innerRadius * cosEnd, // start x\n\t\t\t\ty + innerRadius * sinEnd, // start y\n\t\t\t\tx + innerRadius * cosStart, // end x\n\t\t\t\ty + innerRadius * sinStart, // end y\n\t\t\t\t'x', // finish path\n\t\t\t\t'e' // close\n\t\t\t);\n\n\t\t\tret.isArc = true;\n\t\t\treturn ret;\n\n\t\t},\n\t\t// Add circle symbol path. This performs significantly faster than v:oval.\n\t\tcircle: function (x, y, w, h, wrapper) {\n\n\t\t\tif (wrapper) {\n\t\t\t\tw = h = 2 * wrapper.r;\n\t\t\t}\n\n\t\t\t// Center correction, #1682\n\t\t\tif (wrapper && wrapper.isCircle) {\n\t\t\t\tx -= w / 2;\n\t\t\t\ty -= h / 2;\n\t\t\t}\n\n\t\t\t// Return the path\n\t\t\treturn [\n\t\t\t\t'wa', // clockwisearcto\n\t\t\t\tx, // left\n\t\t\t\ty, // top\n\t\t\t\tx + w, // right\n\t\t\t\ty + h, // bottom\n\t\t\t\tx + w, // start x\n\t\t\t\ty + h / 2,     // start y\n\t\t\t\tx + w, // end x\n\t\t\t\ty + h / 2,     // end y\n\t\t\t\t//'x', // finish path\n\t\t\t\t'e' // close\n\t\t\t];\n\t\t},\n\t\t/**\n\t\t * Add rectangle symbol path which eases rotation and omits arcsize problems\n\t\t * compared to the built-in VML roundrect shape\n\t\t *\n\t\t * @param {Number} left Left position\n\t\t * @param {Number} top Top position\n\t\t * @param {Number} r Border radius\n\t\t * @param {Object} options Width and height\n\t\t */\n\n\t\trect: function (left, top, width, height, options) {\n\n\t\t\tvar right = left + width,\n\t\t\t\tbottom = top + height,\n\t\t\t\tret,\n\t\t\t\tr;\n\n\t\t\t// No radius, return the more lightweight square\n\t\t\tif (!defined(options) || !options.r) {\n\t\t\t\tret = SVGRenderer.prototype.symbols.square.apply(0, arguments);\n\n\t\t\t// Has radius add arcs for the corners\n\t\t\t} else {\n\n\t\t\t\tr = mathMin(options.r, width, height);\n\t\t\t\tret = [\n\t\t\t\t\tM,\n\t\t\t\t\tleft + r, top,\n\n\t\t\t\t\tL,\n\t\t\t\t\tright - r, top,\n\t\t\t\t\t'wa',\n\t\t\t\t\tright - 2 * r, top,\n\t\t\t\t\tright, top + 2 * r,\n\t\t\t\t\tright - r, top,\n\t\t\t\t\tright, top + r,\n\n\t\t\t\t\tL,\n\t\t\t\t\tright, bottom - r,\n\t\t\t\t\t'wa',\n\t\t\t\t\tright - 2 * r, bottom - 2 * r,\n\t\t\t\t\tright, bottom,\n\t\t\t\t\tright, bottom - r,\n\t\t\t\t\tright - r, bottom,\n\n\t\t\t\t\tL,\n\t\t\t\t\tleft + r, bottom,\n\t\t\t\t\t'wa',\n\t\t\t\t\tleft, bottom - 2 * r,\n\t\t\t\t\tleft + 2 * r, bottom,\n\t\t\t\t\tleft + r, bottom,\n\t\t\t\t\tleft, bottom - r,\n\n\t\t\t\t\tL,\n\t\t\t\t\tleft, top + r,\n\t\t\t\t\t'wa',\n\t\t\t\t\tleft, top,\n\t\t\t\t\tleft + 2 * r, top + 2 * r,\n\t\t\t\t\tleft, top + r,\n\t\t\t\t\tleft + r, top,\n\n\n\t\t\t\t\t'x',\n\t\t\t\t\t'e'\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t}\n};\nHighcharts.VMLRenderer = VMLRenderer = function () {\n\tthis.init.apply(this, arguments);\n};\nVMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);\n\n\t// general renderer\n\tRenderer = VMLRenderer;\n}\n\n/* ****************************************************************************\n *                                                                            *\n * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE                                *\n *                                                                            *\n *****************************************************************************/\n/* ****************************************************************************\n *                                                                            *\n * START OF ANDROID < 3 SPECIFIC CODE. THIS CAN BE REMOVED IF YOU'RE NOT      *\n * TARGETING THAT SYSTEM.                                                     *\n *                                                                            *\n *****************************************************************************/\nvar CanVGRenderer,\n\tCanVGController;\n\nif (useCanVG) {\n\t/**\n\t * The CanVGRenderer is empty from start to keep the source footprint small.\n\t * When requested, the CanVGController downloads the rest of the source packaged\n\t * together with the canvg library.\n\t */\n\tHighcharts.CanVGRenderer = CanVGRenderer = function () {\n\t\t// Override the global SVG namespace to fake SVG/HTML that accepts CSS\n\t\tSVG_NS = 'http://www.w3.org/1999/xhtml';\n\t};\n\n\t/**\n\t * Start with an empty symbols object. This is needed when exporting is used (exporting.src.js will add a few symbols), but \n\t * the implementation from SvgRenderer will not be merged in until first render.\n\t */\n\tCanVGRenderer.prototype.symbols = {};\n\n\t/**\n\t * Handles on demand download of canvg rendering support.\n\t */\n\tCanVGController = (function () {\n\t\t// List of renderering calls\n\t\tvar deferredRenderCalls = [];\n\n\t\t/**\n\t\t * When downloaded, we are ready to draw deferred charts.\n\t\t */\n\t\tfunction drawDeferred() {\n\t\t\tvar callLength = deferredRenderCalls.length,\n\t\t\t\tcallIndex;\n\n\t\t\t// Draw all pending render calls\n\t\t\tfor (callIndex = 0; callIndex < callLength; callIndex++) {\n\t\t\t\tdeferredRenderCalls[callIndex]();\n\t\t\t}\n\t\t\t// Clear the list\n\t\t\tdeferredRenderCalls = [];\n\t\t}\n\n\t\treturn {\n\t\t\tpush: function (func, scriptLocation) {\n\t\t\t\t// Only get the script once\n\t\t\t\tif (deferredRenderCalls.length === 0) {\n\t\t\t\t\tgetScript(scriptLocation, drawDeferred);\n\t\t\t\t}\n\t\t\t\t// Register render call\n\t\t\t\tdeferredRenderCalls.push(func);\n\t\t\t}\n\t\t};\n\t}());\n\n\tRenderer = CanVGRenderer;\n} // end CanVGRenderer\n\n/* ****************************************************************************\n *                                                                            *\n * END OF ANDROID < 3 SPECIFIC CODE                                           *\n *                                                                            *\n *****************************************************************************/\n\n/**\n * The Tick class\n */\nfunction Tick(axis, pos, type, noLabel) {\n\tthis.axis = axis;\n\tthis.pos = pos;\n\tthis.type = type || '';\n\tthis.isNew = true;\n\n\tif (!type && !noLabel) {\n\t\tthis.addLabel();\n\t}\n}\n\nTick.prototype = {\n\t/**\n\t * Write the tick label\n\t */\n\taddLabel: function () {\n\t\tvar tick = this,\n\t\t\taxis = tick.axis,\n\t\t\toptions = axis.options,\n\t\t\tchart = axis.chart,\n\t\t\thoriz = axis.horiz,\n\t\t\tcategories = axis.categories,\n\t\t\tnames = axis.series[0] && axis.series[0].names,\n\t\t\tpos = tick.pos,\n\t\t\tlabelOptions = options.labels,\n\t\t\tstr,\n\t\t\ttickPositions = axis.tickPositions,\n\t\t\twidth = (horiz && categories &&\n\t\t\t\t!labelOptions.step && !labelOptions.staggerLines &&\n\t\t\t\t!labelOptions.rotation &&\n\t\t\t\tchart.plotWidth / tickPositions.length) ||\n\t\t\t\t(!horiz && (chart.margin[3] || chart.chartWidth * 0.33)), // #1580, #1931\n\t\t\tisFirst = pos === tickPositions[0],\n\t\t\tisLast = pos === tickPositions[tickPositions.length - 1],\n\t\t\tcss,\n\t\t\tattr,\n\t\t\tvalue = categories ?\n\t\t\t\tpick(categories[pos], names && names[pos], pos) : \n\t\t\t\tpos,\n\t\t\tlabel = tick.label,\n\t\t\ttickPositionInfo = tickPositions.info,\n\t\t\tdateTimeLabelFormat;\n\n\t\t// Set the datetime label format. If a higher rank is set for this position, use that. If not,\n\t\t// use the general format.\n\t\tif (axis.isDatetimeAxis && tickPositionInfo) {\n\t\t\tdateTimeLabelFormat = options.dateTimeLabelFormats[tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName];\n\t\t}\n\n\t\t// set properties for access in render method\n\t\ttick.isFirst = isFirst;\n\t\ttick.isLast = isLast;\n\n\t\t// get the string\n\t\tstr = axis.labelFormatter.call({\n\t\t\taxis: axis,\n\t\t\tchart: chart,\n\t\t\tisFirst: isFirst,\n\t\t\tisLast: isLast,\n\t\t\tdateTimeLabelFormat: dateTimeLabelFormat,\n\t\t\tvalue: axis.isLog ? correctFloat(lin2log(value)) : value\n\t\t});\n\n\t\t// prepare CSS\n\t\tcss = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX };\n\t\tcss = extend(css, labelOptions.style);\n\n\t\t// first call\n\t\tif (!defined(label)) {\n\t\t\tattr = {\n\t\t\t\talign: axis.labelAlign\n\t\t\t};\n\t\t\tif (isNumber(labelOptions.rotation)) {\n\t\t\t\tattr.rotation = labelOptions.rotation;\n\t\t\t}\n\t\t\tif (width && labelOptions.ellipsis) {\n\t\t\t\tattr._clipHeight = axis.len / tickPositions.length;\n\t\t\t}\n\n\t\t\ttick.label =\n\t\t\t\tdefined(str) && labelOptions.enabled ?\n\t\t\t\t\tchart.renderer.text(\n\t\t\t\t\t\t\tstr,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tlabelOptions.useHTML\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(attr)\n\t\t\t\t\t\t// without position absolute, IE export sometimes is wrong\n\t\t\t\t\t\t.css(css)\n\t\t\t\t\t\t.add(axis.labelGroup) :\n\t\t\t\t\tnull;\n\n\t\t// update\n\t\t} else if (label) {\n\t\t\tlabel.attr({\n\t\t\t\t\ttext: str\n\t\t\t\t})\n\t\t\t\t.css(css);\n\t\t}\n\t},\n\n\t/**\n\t * Get the offset height or width of the label\n\t */\n\tgetLabelSize: function () {\n\t\tvar label = this.label,\n\t\t\taxis = this.axis;\n\t\treturn label ?\n\t\t\t((this.labelBBox = label.getBBox()))[axis.horiz ? 'height' : 'width'] :\n\t\t\t0;\n\t},\n\n\t/**\n\t * Find how far the labels extend to the right and left of the tick's x position. Used for anti-collision\n\t * detection with overflow logic.\n\t */\n\tgetLabelSides: function () {\n\t\tvar bBox = this.labelBBox, // assume getLabelSize has run at this point\n\t\t\taxis = this.axis,\n\t\t\toptions = axis.options,\n\t\t\tlabelOptions = options.labels,\n\t\t\twidth = bBox.width,\n\t\t\tleftSide = width * { left: 0, center: 0.5, right: 1 }[axis.labelAlign] - labelOptions.x;\n\n\t\treturn [-leftSide, width - leftSide];\n\t},\n\n\t/**\n\t * Handle the label overflow by adjusting the labels to the left and right edge, or\n\t * hide them if they collide into the neighbour label.\n\t */\n\thandleOverflow: function (index, xy) {\n\t\tvar show = true,\n\t\t\taxis = this.axis,\n\t\t\tchart = axis.chart,\n\t\t\tisFirst = this.isFirst,\n\t\t\tisLast = this.isLast,\n\t\t\tx = xy.x,\n\t\t\treversed = axis.reversed,\n\t\t\ttickPositions = axis.tickPositions;\n\n\t\tif (isFirst || isLast) {\n\n\t\t\tvar sides = this.getLabelSides(),\n\t\t\t\tleftSide = sides[0],\n\t\t\t\trightSide = sides[1],\n\t\t\t\tplotLeft = chart.plotLeft,\n\t\t\t\tplotRight = plotLeft + axis.len,\n\t\t\t\tneighbour = axis.ticks[tickPositions[index + (isFirst ? 1 : -1)]],\n\t\t\t\tneighbourEdge = neighbour && neighbour.label.xy && neighbour.label.xy.x + neighbour.getLabelSides()[isFirst ? 0 : 1];\n\n\t\t\tif ((isFirst && !reversed) || (isLast && reversed)) {\n\t\t\t\t// Is the label spilling out to the left of the plot area?\n\t\t\t\tif (x + leftSide < plotLeft) {\n\n\t\t\t\t\t// Align it to plot left\n\t\t\t\t\tx = plotLeft - leftSide;\n\n\t\t\t\t\t// Hide it if it now overlaps the neighbour label\n\t\t\t\t\tif (neighbour && x + rightSide > neighbourEdge) {\n\t\t\t\t\t\tshow = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t// Is the label spilling out to the right of the plot area?\n\t\t\t\tif (x + rightSide > plotRight) {\n\n\t\t\t\t\t// Align it to plot right\n\t\t\t\t\tx = plotRight - rightSide;\n\n\t\t\t\t\t// Hide it if it now overlaps the neighbour label\n\t\t\t\t\tif (neighbour && x + leftSide < neighbourEdge) {\n\t\t\t\t\t\tshow = false;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the modified x position of the label\n\t\t\txy.x = x;\n\t\t}\n\t\treturn show;\n\t},\n\n\t/**\n\t * Get the x and y position for ticks and labels\n\t */\n\tgetPosition: function (horiz, pos, tickmarkOffset, old) {\n\t\tvar axis = this.axis,\n\t\t\tchart = axis.chart,\n\t\t\tcHeight = (old && chart.oldChartHeight) || chart.chartHeight;\n\t\t\n\t\treturn {\n\t\t\tx: horiz ?\n\t\t\t\taxis.translate(pos + tickmarkOffset, null, null, old) + axis.transB :\n\t\t\t\taxis.left + axis.offset + (axis.opposite ? ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left : 0),\n\n\t\t\ty: horiz ?\n\t\t\t\tcHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) :\n\t\t\t\tcHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB\n\t\t};\n\t\t\n\t},\n\t\n\t/**\n\t * Get the x, y position of the tick label\n\t */\n\tgetLabelPosition: function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n\t\tvar axis = this.axis,\n\t\t\ttransA = axis.transA,\n\t\t\treversed = axis.reversed,\n\t\t\tstaggerLines = axis.staggerLines,\n\t\t\tbaseline = axis.chart.renderer.fontMetrics(labelOptions.style.fontSize).b,\n\t\t\trotation = labelOptions.rotation;\n\t\t\t\n\t\tx = x + labelOptions.x - (tickmarkOffset && horiz ?\n\t\t\ttickmarkOffset * transA * (reversed ? -1 : 1) : 0);\n\t\ty = y + labelOptions.y - (tickmarkOffset && !horiz ?\n\t\t\ttickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n\n\t\t// Correct for rotation (#1764)\n\t\tif (rotation && axis.side === 2) {\n\t\t\ty -= baseline - baseline * mathCos(rotation * deg2rad);\n\t\t}\n\t\t\n\t\t// Vertically centered\n\t\tif (!defined(labelOptions.y) && !rotation) { // #1951\n\t\t\ty += baseline - label.getBBox().height / 2;\n\t\t}\n\t\t\n\t\t// Correct for staggered labels\n\t\tif (staggerLines) {\n\t\t\ty += (index / (step || 1) % staggerLines) * (axis.labelOffset / staggerLines);\n\t\t}\n\t\t\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t},\n\t\n\t/**\n\t * Extendible method to return the path of the marker\n\t */\n\tgetMarkPath: function (x, y, tickLength, tickWidth, horiz, renderer) {\n\t\treturn renderer.crispLine([\n\t\t\t\tM,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tL,\n\t\t\t\tx + (horiz ? 0 : -tickLength),\n\t\t\t\ty + (horiz ? tickLength : 0)\n\t\t\t], tickWidth);\n\t},\n\n\t/**\n\t * Put everything in place\n\t *\n\t * @param index {Number}\n\t * @param old {Boolean} Use old coordinates to prepare an animation into new position\n\t */\n\trender: function (index, old, opacity) {\n\t\tvar tick = this,\n\t\t\taxis = tick.axis,\n\t\t\toptions = axis.options,\n\t\t\tchart = axis.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\thoriz = axis.horiz,\n\t\t\ttype = tick.type,\n\t\t\tlabel = tick.label,\n\t\t\tpos = tick.pos,\n\t\t\tlabelOptions = options.labels,\n\t\t\tgridLine = tick.gridLine,\n\t\t\tgridPrefix = type ? type + 'Grid' : 'grid',\n\t\t\ttickPrefix = type ? type + 'Tick' : 'tick',\n\t\t\tgridLineWidth = options[gridPrefix + 'LineWidth'],\n\t\t\tgridLineColor = options[gridPrefix + 'LineColor'],\n\t\t\tdashStyle = options[gridPrefix + 'LineDashStyle'],\n\t\t\ttickLength = options[tickPrefix + 'Length'],\n\t\t\ttickWidth = options[tickPrefix + 'Width'] || 0,\n\t\t\ttickColor = options[tickPrefix + 'Color'],\n\t\t\ttickPosition = options[tickPrefix + 'Position'],\n\t\t\tgridLinePath,\n\t\t\tmark = tick.mark,\n\t\t\tmarkPath,\n\t\t\tstep = labelOptions.step,\n\t\t\tattribs,\n\t\t\tshow = true,\n\t\t\ttickmarkOffset = axis.tickmarkOffset,\n\t\t\txy = tick.getPosition(horiz, pos, tickmarkOffset, old),\n\t\t\tx = xy.x,\n\t\t\ty = xy.y,\n\t\t\treverseCrisp = ((horiz && x === axis.pos + axis.len) || (!horiz && y === axis.pos)) ? -1 : 1, // #1480, #1687\n\t\t\tstaggerLines = axis.staggerLines;\n\n\t\tthis.isActive = true;\n\t\t\n\t\t// create the grid line\n\t\tif (gridLineWidth) {\n\t\t\tgridLinePath = axis.getPlotLinePath(pos + tickmarkOffset, gridLineWidth * reverseCrisp, old, true);\n\n\t\t\tif (gridLine === UNDEFINED) {\n\t\t\t\tattribs = {\n\t\t\t\t\tstroke: gridLineColor,\n\t\t\t\t\t'stroke-width': gridLineWidth\n\t\t\t\t};\n\t\t\t\tif (dashStyle) {\n\t\t\t\t\tattribs.dashstyle = dashStyle;\n\t\t\t\t}\n\t\t\t\tif (!type) {\n\t\t\t\t\tattribs.zIndex = 1;\n\t\t\t\t}\n\t\t\t\tif (old) {\n\t\t\t\t\tattribs.opacity = 0;\n\t\t\t\t}\n\t\t\t\ttick.gridLine = gridLine =\n\t\t\t\t\tgridLineWidth ?\n\t\t\t\t\t\trenderer.path(gridLinePath)\n\t\t\t\t\t\t\t.attr(attribs).add(axis.gridGroup) :\n\t\t\t\t\t\tnull;\n\t\t\t}\n\n\t\t\t// If the parameter 'old' is set, the current call will be followed\n\t\t\t// by another call, therefore do not do any animations this time\n\t\t\tif (!old && gridLine && gridLinePath) {\n\t\t\t\tgridLine[tick.isNew ? 'attr' : 'animate']({\n\t\t\t\t\td: gridLinePath,\n\t\t\t\t\topacity: opacity\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// create the tick mark\n\t\tif (tickWidth && tickLength) {\n\n\t\t\t// negate the length\n\t\t\tif (tickPosition === 'inside') {\n\t\t\t\ttickLength = -tickLength;\n\t\t\t}\n\t\t\tif (axis.opposite) {\n\t\t\t\ttickLength = -tickLength;\n\t\t\t}\n\n\t\t\tmarkPath = tick.getMarkPath(x, y, tickLength, tickWidth * reverseCrisp, horiz, renderer);\n\n\t\t\tif (mark) { // updating\n\t\t\t\tmark.animate({\n\t\t\t\t\td: markPath,\n\t\t\t\t\topacity: opacity\n\t\t\t\t});\n\t\t\t} else { // first time\n\t\t\t\ttick.mark = renderer.path(\n\t\t\t\t\tmarkPath\n\t\t\t\t).attr({\n\t\t\t\t\tstroke: tickColor,\n\t\t\t\t\t'stroke-width': tickWidth,\n\t\t\t\t\topacity: opacity\n\t\t\t\t}).add(axis.axisGroup);\n\t\t\t}\n\t\t}\n\n\t\t// the label is created on init - now move it into place\n\t\tif (label && !isNaN(x)) {\n\t\t\tlabel.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\n\n\t\t\t// Apply show first and show last. If the tick is both first and last, it is \n\t\t\t// a single centered tick, in which case we show the label anyway (#2100).\n\t\t\tif ((tick.isFirst && !tick.isLast && !pick(options.showFirstLabel, 1)) ||\n\t\t\t\t\t(tick.isLast && !tick.isFirst && !pick(options.showLastLabel, 1))) {\n\t\t\t\tshow = false;\n\n\t\t\t// Handle label overflow and show or hide accordingly\n\t\t\t} else if (!staggerLines && horiz && labelOptions.overflow === 'justify' && !tick.handleOverflow(index, xy)) {\n\t\t\t\tshow = false;\n\t\t\t}\n\n\t\t\t// apply step\n\t\t\tif (step && index % step) {\n\t\t\t\t// show those indices dividable by step\n\t\t\t\tshow = false;\n\t\t\t}\n\n\t\t\t// Set the new position, and show or hide\n\t\t\tif (show && !isNaN(xy.y)) {\n\t\t\t\txy.opacity = opacity;\n\t\t\t\tlabel[tick.isNew ? 'attr' : 'animate'](xy);\n\t\t\t\ttick.isNew = false;\n\t\t\t} else {\n\t\t\t\tlabel.attr('y', -9999); // #1338\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Destructor for the tick prototype\n\t */\n\tdestroy: function () {\n\t\tdestroyObjectProperties(this, this.axis);\n\t}\n};\n\n/**\n * The object wrapper for plot lines and plot bands\n * @param {Object} options\n */\nfunction PlotLineOrBand(axis, options) {\n\tthis.axis = axis;\n\n\tif (options) {\n\t\tthis.options = options;\n\t\tthis.id = options.id;\n\t}\n}\n\nPlotLineOrBand.prototype = {\n\t\n\t/**\n\t * Render the plot line or plot band. If it is already existing,\n\t * move it.\n\t */\n\trender: function () {\n\t\tvar plotLine = this,\n\t\t\taxis = plotLine.axis,\n\t\t\thoriz = axis.horiz,\n\t\t\thalfPointRange = (axis.pointRange || 0) / 2,\n\t\t\toptions = plotLine.options,\n\t\t\toptionsLabel = options.label,\n\t\t\tlabel = plotLine.label,\n\t\t\twidth = options.width,\n\t\t\tto = options.to,\n\t\t\tfrom = options.from,\n\t\t\tisBand = defined(from) && defined(to),\n\t\t\tvalue = options.value,\n\t\t\tdashStyle = options.dashStyle,\n\t\t\tsvgElem = plotLine.svgElem,\n\t\t\tpath = [],\n\t\t\taddEvent,\n\t\t\teventType,\n\t\t\txs,\n\t\t\tys,\n\t\t\tx,\n\t\t\ty,\n\t\t\tcolor = options.color,\n\t\t\tzIndex = options.zIndex,\n\t\t\tevents = options.events,\n\t\t\tattribs,\n\t\t\trenderer = axis.chart.renderer;\n\n\t\t// logarithmic conversion\n\t\tif (axis.isLog) {\n\t\t\tfrom = log2lin(from);\n\t\t\tto = log2lin(to);\n\t\t\tvalue = log2lin(value);\n\t\t}\n\n\t\t// plot line\n\t\tif (width) {\n\t\t\tpath = axis.getPlotLinePath(value, width);\n\t\t\tattribs = {\n\t\t\t\tstroke: color,\n\t\t\t\t'stroke-width': width\n\t\t\t};\n\t\t\tif (dashStyle) {\n\t\t\t\tattribs.dashstyle = dashStyle;\n\t\t\t}\n\t\t} else if (isBand) { // plot band\n\t\t\t\n\t\t\t// keep within plot area\n\t\t\tfrom = mathMax(from, axis.min - halfPointRange);\n\t\t\tto = mathMin(to, axis.max + halfPointRange);\n\t\t\t\n\t\t\tpath = axis.getPlotBandPath(from, to, options);\n\t\t\tattribs = {\n\t\t\t\tfill: color\n\t\t\t};\n\t\t\tif (options.borderWidth) {\n\t\t\t\tattribs.stroke = options.borderColor;\n\t\t\t\tattribs['stroke-width'] = options.borderWidth;\n\t\t\t}\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t\t// zIndex\n\t\tif (defined(zIndex)) {\n\t\t\tattribs.zIndex = zIndex;\n\t\t}\n\n\t\t// common for lines and bands\n\t\tif (svgElem) {\n\t\t\tif (path) {\n\t\t\t\tsvgElem.animate({\n\t\t\t\t\td: path\n\t\t\t\t}, null, svgElem.onGetPath);\n\t\t\t} else {\n\t\t\t\tsvgElem.hide();\n\t\t\t\tsvgElem.onGetPath = function () {\n\t\t\t\t\tsvgElem.show();\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (path && path.length) {\n\t\t\tplotLine.svgElem = svgElem = renderer.path(path)\n\t\t\t\t.attr(attribs).add();\n\n\t\t\t// events\n\t\t\tif (events) {\n\t\t\t\taddEvent = function (eventType) {\n\t\t\t\t\tsvgElem.on(eventType, function (e) {\n\t\t\t\t\t\tevents[eventType].apply(plotLine, [e]);\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t\tfor (eventType in events) {\n\t\t\t\t\taddEvent(eventType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the plot band/line label\n\t\tif (optionsLabel && defined(optionsLabel.text) && path && path.length && axis.width > 0 && axis.height > 0) {\n\t\t\t// apply defaults\n\t\t\toptionsLabel = merge({\n\t\t\t\talign: horiz && isBand && 'center',\n\t\t\t\tx: horiz ? !isBand && 4 : 10,\n\t\t\t\tverticalAlign : !horiz && isBand && 'middle',\n\t\t\t\ty: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n\t\t\t\trotation: horiz && !isBand && 90\n\t\t\t}, optionsLabel);\n\n\t\t\t// add the SVG element\n\t\t\tif (!label) {\n\t\t\t\tplotLine.label = label = renderer.text(\n\t\t\t\t\t\toptionsLabel.text,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\toptionsLabel.useHTML\n\t\t\t\t\t)\n\t\t\t\t\t.attr({\n\t\t\t\t\t\talign: optionsLabel.textAlign || optionsLabel.align,\n\t\t\t\t\t\trotation: optionsLabel.rotation,\n\t\t\t\t\t\tzIndex: zIndex\n\t\t\t\t\t})\n\t\t\t\t\t.css(optionsLabel.style)\n\t\t\t\t\t.add();\n\t\t\t}\n\n\t\t\t// get the bounding box and align the label\n\t\t\txs = [path[1], path[4], pick(path[6], path[1])];\n\t\t\tys = [path[2], path[5], pick(path[7], path[2])];\n\t\t\tx = arrayMin(xs);\n\t\t\ty = arrayMin(ys);\n\n\t\t\tlabel.align(optionsLabel, false, {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\twidth: arrayMax(xs) - x,\n\t\t\t\theight: arrayMax(ys) - y\n\t\t\t});\n\t\t\tlabel.show();\n\n\t\t} else if (label) { // move out of sight\n\t\t\tlabel.hide();\n\t\t}\n\n\t\t// chainable\n\t\treturn plotLine;\n\t},\n\n\t/**\n\t * Remove the plot line or band\n\t */\n\tdestroy: function () {\n\t\t// remove it from the lookup\n\t\terase(this.axis.plotLinesAndBands, this);\n\t\t\n\t\tdelete this.axis;\n\t\tdestroyObjectProperties(this);\n\t}\n};\n/**\n * The class for stack items\n */\nfunction StackItem(axis, options, isNegative, x, stackOption, stacking) {\n\t\n\tvar inverted = axis.chart.inverted;\n\n\tthis.axis = axis;\n\n\t// Tells if the stack is negative\n\tthis.isNegative = isNegative;\n\n\t// Save the options to be able to style the label\n\tthis.options = options;\n\n\t// Save the x value to be able to position the label later\n\tthis.x = x;\n\n\t// Initialize total value\n\tthis.total = null;\n\n\t// This will keep each points' extremes stored by series.index\n\tthis.points = {};\n\n\t// Save the stack option on the series configuration object, and whether to treat it as percent\n\tthis.stack = stackOption;\n\tthis.percent = stacking === 'percent';\n\n\t// The align options and text align varies on whether the stack is negative and\n\t// if the chart is inverted or not.\n\t// First test the user supplied value, then use the dynamic.\n\tthis.alignOptions = {\n\t\talign: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n\t\tverticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),\n\t\ty: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),\n\t\tx: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)\n\t};\n\n\tthis.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center');\n}\n\nStackItem.prototype = {\n\tdestroy: function () {\n\t\tdestroyObjectProperties(this, this.axis);\n\t},\n\n\t/**\n\t * Renders the stack total label and adds it to the stack label group.\n\t */\n\trender: function (group) {\n\t\tvar options = this.options,\n\t\t\tformatOption = options.format,\n\t\t\tstr = formatOption ?\n\t\t\t\tformat(formatOption, this) : \n\t\t\t\toptions.formatter.call(this);  // format the text in the label\n\n\t\t// Change the text to reflect the new total and set visibility to hidden in case the serie is hidden\n\t\tif (this.label) {\n\t\t\tthis.label.attr({text: str, visibility: HIDDEN});\n\t\t// Create new label\n\t\t} else {\n\t\t\tthis.label =\n\t\t\t\tthis.axis.chart.renderer.text(str, 0, 0, options.useHTML)\t\t// dummy positions, actual position updated with setOffset method in columnseries\n\t\t\t\t\t.css(options.style)\t\t\t\t// apply style\n\t\t\t\t\t.attr({\n\t\t\t\t\t\talign: this.textAlign,\t\t\t\t// fix the text-anchor\n\t\t\t\t\t\trotation: options.rotation,\t// rotation\n\t\t\t\t\t\tvisibility: HIDDEN\t\t\t\t\t// hidden until setOffset is called\n\t\t\t\t\t})\t\t\t\t\n\t\t\t\t\t.add(group);\t\t\t\t\t\t\t// add to the labels-group\n\t\t}\n\t},\n\n\t/**\n\t * Sets the offset that the stack has from the x value and repositions the label.\n\t */\n\tsetOffset: function (xOffset, xWidth) {\n\t\tvar stackItem = this,\n\t\t\taxis = stackItem.axis,\n\t\t\tchart = axis.chart,\n\t\t\tinverted = chart.inverted,\n\t\t\tneg = this.isNegative,\t\t\t\t\t\t\t// special treatment is needed for negative stacks\n\t\t\ty = axis.translate(this.percent ? 100 : this.total, 0, 0, 0, 1), // stack value translated mapped to chart coordinates\n\t\t\tyZero = axis.translate(0),\t\t\t\t\t\t// stack origin\n\t\t\th = mathAbs(y - yZero),\t\t\t\t\t\t\t// stack height\n\t\t\tx = chart.xAxis[0].translate(this.x) + xOffset,\t// stack x position\n\t\t\tplotHeight = chart.plotHeight,\n\t\t\tstackBox = {\t// this is the box for the complete stack\n\t\t\t\tx: inverted ? (neg ? y : y - h) : x,\n\t\t\t\ty: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y),\n\t\t\t\twidth: inverted ? h : xWidth,\n\t\t\t\theight: inverted ? xWidth : h\n\t\t\t},\n\t\t\tlabel = this.label,\n\t\t\talignAttr;\n\t\t\n\t\tif (label) {\n\t\t\tlabel.align(this.alignOptions, null, stackBox);\t// align the label to the box\n\t\t\t\t\n\t\t\t// Set visibility (#678)\n\t\t\talignAttr = label.alignAttr;\n\t\t\tlabel.attr({ \n\t\t\t\tvisibility: this.options.crop === false || chart.isInsidePlot(alignAttr.x, alignAttr.y) ? \n\t\t\t\t\t(hasSVG ? 'inherit' : VISIBLE) : \n\t\t\t\t\tHIDDEN\n\t\t\t});\n\t\t}\n\t}\n};\n/**\n * Create a new axis object\n * @param {Object} chart\n * @param {Object} options\n */\nfunction Axis() {\n\tthis.init.apply(this, arguments);\n}\n\nAxis.prototype = {\n\t\n\t/**\n\t * Default options for the X axis - the Y axis has extended defaults \n\t */\n\tdefaultOptions: {\n\t\t// allowDecimals: null,\n\t\t// alternateGridColor: null,\n\t\t// categories: [],\n\t\tdateTimeLabelFormats: {\n\t\t\tmillisecond: '%H:%M:%S.%L',\n\t\t\tsecond: '%H:%M:%S',\n\t\t\tminute: '%H:%M',\n\t\t\thour: '%H:%M',\n\t\t\tday: '%e. %b',\n\t\t\tweek: '%e. %b',\n\t\t\tmonth: '%b \\'%y',\n\t\t\tyear: '%Y'\n\t\t},\n\t\tendOnTick: false,\n\t\tgridLineColor: '#C0C0C0',\n\t\t// gridLineDashStyle: 'solid',\n\t\t// gridLineWidth: 0,\n\t\t// reversed: false,\n\t\n\t\tlabels: defaultLabelOptions,\n\t\t\t// { step: null },\n\t\tlineColor: '#C0D0E0',\n\t\tlineWidth: 1,\n\t\t//linkedTo: null,\n\t\t//max: undefined,\n\t\t//min: undefined,\n\t\tminPadding: 0.01,\n\t\tmaxPadding: 0.01,\n\t\t//minRange: null,\n\t\tminorGridLineColor: '#E0E0E0',\n\t\t// minorGridLineDashStyle: null,\n\t\tminorGridLineWidth: 1,\n\t\tminorTickColor: '#A0A0A0',\n\t\t//minorTickInterval: null,\n\t\tminorTickLength: 2,\n\t\tminorTickPosition: 'outside', // inside or outside\n\t\t//minorTickWidth: 0,\n\t\t//opposite: false,\n\t\t//offset: 0,\n\t\t//plotBands: [{\n\t\t//\tevents: {},\n\t\t//\tzIndex: 1,\n\t\t//\tlabels: { align, x, verticalAlign, y, style, rotation, textAlign }\n\t\t//}],\n\t\t//plotLines: [{\n\t\t//\tevents: {}\n\t\t//  dashStyle: {}\n\t\t//\tzIndex:\n\t\t//\tlabels: { align, x, verticalAlign, y, style, rotation, textAlign }\n\t\t//}],\n\t\t//reversed: false,\n\t\t// showFirstLabel: true,\n\t\t// showLastLabel: true,\n\t\tstartOfWeek: 1,\n\t\tstartOnTick: false,\n\t\ttickColor: '#C0D0E0',\n\t\t//tickInterval: null,\n\t\ttickLength: 5,\n\t\ttickmarkPlacement: 'between', // on or between\n\t\ttickPixelInterval: 100,\n\t\ttickPosition: 'outside',\n\t\ttickWidth: 1,\n\t\ttitle: {\n\t\t\t//text: null,\n\t\t\talign: 'middle', // low, middle or high\n\t\t\t//margin: 0 for horizontal, 10 for vertical axes,\n\t\t\t//rotation: 0,\n\t\t\t//side: 'outside',\n\t\t\tstyle: {\n\t\t\t\tcolor: '#4d759e',\n\t\t\t\t//font: defaultFont.replace('normal', 'bold')\n\t\t\t\tfontWeight: 'bold'\n\t\t\t}\n\t\t\t//x: 0,\n\t\t\t//y: 0\n\t\t},\n\t\ttype: 'linear' // linear, logarithmic or datetime\n\t},\n\t\n\t/**\n\t * This options set extends the defaultOptions for Y axes\n\t */\n\tdefaultYAxisOptions: {\n\t\tendOnTick: true,\n\t\tgridLineWidth: 1,\n\t\ttickPixelInterval: 72,\n\t\tshowLastLabel: true,\n\t\tlabels: {\n\t\t\tx: -8,\n\t\t\ty: 3\n\t\t},\n\t\tlineWidth: 0,\n\t\tmaxPadding: 0.05,\n\t\tminPadding: 0.05,\n\t\tstartOnTick: true,\n\t\ttickWidth: 0,\n\t\ttitle: {\n\t\t\trotation: 270,\n\t\t\ttext: 'Values'\n\t\t},\n\t\tstackLabels: {\n\t\t\tenabled: false,\n\t\t\t//align: dynamic,\n\t\t\t//y: dynamic,\n\t\t\t//x: dynamic,\n\t\t\t//verticalAlign: dynamic,\n\t\t\t//textAlign: dynamic,\n\t\t\t//rotation: 0,\n\t\t\tformatter: function () {\n\t\t\t\treturn numberFormat(this.total, -1);\n\t\t\t},\n\t\t\tstyle: defaultLabelOptions.style\n\t\t}\n\t},\n\t\n\t/**\n\t * These options extend the defaultOptions for left axes\n\t */\n\tdefaultLeftAxisOptions: {\n\t\tlabels: {\n\t\t\tx: -8,\n\t\t\ty: null\n\t\t},\n\t\ttitle: {\n\t\t\trotation: 270\n\t\t}\n\t},\n\t\n\t/**\n\t * These options extend the defaultOptions for right axes\n\t */\n\tdefaultRightAxisOptions: {\n\t\tlabels: {\n\t\t\tx: 8,\n\t\t\ty: null\n\t\t},\n\t\ttitle: {\n\t\t\trotation: 90\n\t\t}\n\t},\n\t\n\t/**\n\t * These options extend the defaultOptions for bottom axes\n\t */\n\tdefaultBottomAxisOptions: {\n\t\tlabels: {\n\t\t\tx: 0,\n\t\t\ty: 14\n\t\t\t// overflow: undefined,\n\t\t\t// staggerLines: null\n\t\t},\n\t\ttitle: {\n\t\t\trotation: 0\n\t\t}\n\t},\n\t/**\n\t * These options extend the defaultOptions for left axes\n\t */\n\tdefaultTopAxisOptions: {\n\t\tlabels: {\n\t\t\tx: 0,\n\t\t\ty: -5\n\t\t\t// overflow: undefined\n\t\t\t// staggerLines: null\n\t\t},\n\t\ttitle: {\n\t\t\trotation: 0\n\t\t}\n\t},\n\t\n\t/**\n\t * Initialize the axis\n\t */\n\tinit: function (chart, userOptions) {\n\t\t\t\n\t\t\n\t\tvar isXAxis = userOptions.isX,\n\t\t\taxis = this;\n\t\n\t\t// Flag, is the axis horizontal\n\t\taxis.horiz = chart.inverted ? !isXAxis : isXAxis;\n\t\t\n\t\t// Flag, isXAxis\n\t\taxis.isXAxis = isXAxis;\n\t\taxis.xOrY = isXAxis ? 'x' : 'y';\n\t\n\t\n\t\taxis.opposite = userOptions.opposite; // needed in setOptions\n\t\taxis.side = axis.horiz ?\n\t\t\t\t(axis.opposite ? 0 : 2) : // top : bottom\n\t\t\t\t(axis.opposite ? 1 : 3);  // right : left\n\t\n\t\taxis.setOptions(userOptions);\n\t\t\n\t\n\t\tvar options = this.options,\n\t\t\ttype = options.type,\n\t\t\tisDatetimeAxis = type === 'datetime';\n\t\n\t\taxis.labelFormatter = options.labels.formatter || axis.defaultLabelFormatter; // can be overwritten by dynamic format\n\t\n\t\n\t\t// Flag, stagger lines or not\n\t\taxis.userOptions = userOptions;\n\t\n\t\t//axis.axisTitleMargin = UNDEFINED,// = options.title.margin,\n\t\taxis.minPixelPadding = 0;\n\t\t//axis.ignoreMinPadding = UNDEFINED; // can be set to true by a column or bar series\n\t\t//axis.ignoreMaxPadding = UNDEFINED;\n\t\n\t\taxis.chart = chart;\n\t\taxis.reversed = options.reversed;\n\t\taxis.zoomEnabled = options.zoomEnabled !== false;\n\t\n\t\t// Initial categories\n\t\taxis.categories = options.categories || type === 'category';\n\t\n\t\t// Elements\n\t\t//axis.axisGroup = UNDEFINED;\n\t\t//axis.gridGroup = UNDEFINED;\n\t\t//axis.axisTitle = UNDEFINED;\n\t\t//axis.axisLine = UNDEFINED;\n\t\n\t\t// Shorthand types\n\t\taxis.isLog = type === 'logarithmic';\n\t\taxis.isDatetimeAxis = isDatetimeAxis;\n\t\n\t\t// Flag, if axis is linked to another axis\n\t\taxis.isLinked = defined(options.linkedTo);\n\t\t// Linked axis.\n\t\t//axis.linkedParent = UNDEFINED;\t\n\t\t\n\t\t// Tick positions\n\t\t//axis.tickPositions = UNDEFINED; // array containing predefined positions\n\t\t// Tick intervals\n\t\t//axis.tickInterval = UNDEFINED;\n\t\t//axis.minorTickInterval = UNDEFINED;\n\t\t\n\t\taxis.tickmarkOffset = (axis.categories && options.tickmarkPlacement === 'between') ? 0.5 : 0;\n\t\n\t\t// Major ticks\n\t\taxis.ticks = {};\n\t\t// Minor ticks\n\t\taxis.minorTicks = {};\n\t\t//axis.tickAmount = UNDEFINED;\n\t\n\t\t// List of plotLines/Bands\n\t\taxis.plotLinesAndBands = [];\n\t\n\t\t// Alternate bands\n\t\taxis.alternateBands = {};\n\t\n\t\t// Axis metrics\n\t\t//axis.left = UNDEFINED;\n\t\t//axis.top = UNDEFINED;\n\t\t//axis.width = UNDEFINED;\n\t\t//axis.height = UNDEFINED;\n\t\t//axis.bottom = UNDEFINED;\n\t\t//axis.right = UNDEFINED;\n\t\t//axis.transA = UNDEFINED;\n\t\t//axis.transB = UNDEFINED;\n\t\t//axis.oldTransA = UNDEFINED;\n\t\taxis.len = 0;\n\t\t//axis.oldMin = UNDEFINED;\n\t\t//axis.oldMax = UNDEFINED;\n\t\t//axis.oldUserMin = UNDEFINED;\n\t\t//axis.oldUserMax = UNDEFINED;\n\t\t//axis.oldAxisLength = UNDEFINED;\n\t\taxis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n\t\taxis.range = options.range;\n\t\taxis.offset = options.offset || 0;\n\t\n\t\n\t\t// Dictionary for stacks\n\t\taxis.stacks = {};\n\t\taxis.oldStacks = {};\n\n\t\t// Dictionary for stacks max values\n\t\taxis.stackExtremes = {};\n\n\t\t// Min and max in the data\n\t\t//axis.dataMin = UNDEFINED,\n\t\t//axis.dataMax = UNDEFINED,\n\t\n\t\t// The axis range\n\t\taxis.max = null;\n\t\taxis.min = null;\n\t\n\t\t// User set min and max\n\t\t//axis.userMin = UNDEFINED,\n\t\t//axis.userMax = UNDEFINED,\n\n\t\t// Run Axis\n\t\t\n\t\tvar eventType,\n\t\t\tevents = axis.options.events;\n\n\t\t// Register\n\t\tif (inArray(axis, chart.axes) === -1) { // don't add it again on Axis.update()\n\t\t\tchart.axes.push(axis);\n\t\t\tchart[isXAxis ? 'xAxis' : 'yAxis'].push(axis);\n\t\t}\n\n\t\taxis.series = axis.series || []; // populated by Series\n\n\t\t// inverted charts have reversed xAxes as default\n\t\tif (chart.inverted && isXAxis && axis.reversed === UNDEFINED) {\n\t\t\taxis.reversed = true;\n\t\t}\n\n\t\taxis.removePlotBand = axis.removePlotBandOrLine;\n\t\taxis.removePlotLine = axis.removePlotBandOrLine;\n\n\n\t\t// register event listeners\n\t\tfor (eventType in events) {\n\t\t\taddEvent(axis, eventType, events[eventType]);\n\t\t}\n\n\t\t// extend logarithmic axis\n\t\tif (axis.isLog) {\n\t\t\taxis.val2lin = log2lin;\n\t\t\taxis.lin2val = lin2log;\n\t\t}\n\t},\n\t\n\t/**\n\t * Merge and set options\n\t */\n\tsetOptions: function (userOptions) {\n\t\tthis.options = merge(\n\t\t\tthis.defaultOptions,\n\t\t\tthis.isXAxis ? {} : this.defaultYAxisOptions,\n\t\t\t[this.defaultTopAxisOptions, this.defaultRightAxisOptions,\n\t\t\t\tthis.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side],\n\t\t\tmerge(\n\t\t\t\tdefaultOptions[this.isXAxis ? 'xAxis' : 'yAxis'], // if set in setOptions (#1053)\n\t\t\t\tuserOptions\n\t\t\t)\n\t\t);\n\t},\n\n\t/**\n\t * Update the axis with a new options structure\n\t */\n\tupdate: function (newOptions, redraw) {\n\t\tvar chart = this.chart;\n\n\t\tnewOptions = chart.options[this.xOrY + 'Axis'][this.options.index] = merge(this.userOptions, newOptions);\n\n\t\tthis.destroy(true);\n\t\tthis._addedPlotLB = this.userMin = this.userMax = UNDEFINED; // #1611, #2306\n\n\t\tthis.init(chart, extend(newOptions, { events: UNDEFINED }));\n\n\t\tchart.isDirtyBox = true;\n\t\tif (pick(redraw, true)) {\n\t\t\tchart.redraw();\n\t\t}\n\t},\t\n\t\n\t/**\n     * Remove the axis from the chart\n     */\n\tremove: function (redraw) {\n\t\tvar chart = this.chart,\n\t\t\tkey = this.xOrY + 'Axis'; // xAxis or yAxis\n\n\t\t// Remove associated series\n\t\teach(this.series, function (series) {\n\t\t\tseries.remove(false);\n\t\t});\n\n\t\t// Remove the axis\n\t\terase(chart.axes, this);\n\t\terase(chart[key], this);\n\t\tchart.options[key].splice(this.options.index, 1);\n\t\teach(chart[key], function (axis, i) { // Re-index, #1706\n\t\t\taxis.options.index = i;\n\t\t});\n\t\tthis.destroy();\n\t\tchart.isDirtyBox = true;\n\n\t\tif (pick(redraw, true)) {\n\t\t\tchart.redraw();\n\t\t}\n\t},\n\t\n\t/** \n\t * The default label formatter. The context is a special config object for the label.\n\t */\n\tdefaultLabelFormatter: function () {\n\t\tvar axis = this.axis,\n\t\t\tvalue = this.value,\n\t\t\tcategories = axis.categories, \n\t\t\tdateTimeLabelFormat = this.dateTimeLabelFormat,\n\t\t\tnumericSymbols = defaultOptions.lang.numericSymbols,\n\t\t\ti = numericSymbols && numericSymbols.length,\n\t\t\tmulti,\n\t\t\tret,\n\t\t\tformatOption = axis.options.labels.format,\n\t\t\t\n\t\t\t// make sure the same symbol is added for all labels on a linear axis\n\t\t\tnumericSymbolDetector = axis.isLog ? value : axis.tickInterval;\n\n\t\tif (formatOption) {\n\t\t\tret = format(formatOption, this);\n\t\t\n\t\t} else if (categories) {\n\t\t\tret = value;\n\t\t\n\t\t} else if (dateTimeLabelFormat) { // datetime axis\n\t\t\tret = dateFormat(dateTimeLabelFormat, value);\n\t\t\n\t\t} else if (i && numericSymbolDetector >= 1000) {\n\t\t\t// Decide whether we should add a numeric symbol like k (thousands) or M (millions).\n\t\t\t// If we are to enable this in tooltip or other places as well, we can move this\n\t\t\t// logic to the numberFormatter and enable it by a parameter.\n\t\t\twhile (i-- && ret === UNDEFINED) {\n\t\t\t\tmulti = Math.pow(1000, i + 1);\n\t\t\t\tif (numericSymbolDetector >= multi && numericSymbols[i] !== null) {\n\t\t\t\t\tret = numberFormat(value / multi, -1) + numericSymbols[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (ret === UNDEFINED) {\n\t\t\tif (value >= 1000) { // add thousands separators\n\t\t\t\tret = numberFormat(value, 0);\n\n\t\t\t} else { // small numbers\n\t\t\t\tret = numberFormat(value, -1);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn ret;\n\t},\n\n\t/**\n\t * Get the minimum and maximum for the series of each axis\n\t */\n\tgetSeriesExtremes: function () {\n\t\tvar axis = this,\n\t\t\tchart = axis.chart;\n\n\t\taxis.hasVisibleSeries = false;\n\n\t\t// reset dataMin and dataMax in case we're redrawing\n\t\taxis.dataMin = axis.dataMax = null;\n\n\t\t// reset cached stacking extremes\n\t\taxis.stackExtremes = {};\n\n\t\taxis.buildStacks();\n\n\t\t// loop through this axis' series\n\t\teach(axis.series, function (series) {\n\n\t\t\tif (series.visible || !chart.options.chart.ignoreHiddenSeries) {\n\n\t\t\t\tvar seriesOptions = series.options,\n\t\t\t\t\txData,\n\t\t\t\t\tthreshold = seriesOptions.threshold,\n\t\t\t\t\tseriesDataMin,\n\t\t\t\t\tseriesDataMax;\n\n\t\t\t\taxis.hasVisibleSeries = true;\n\n\t\t\t\t// Validate threshold in logarithmic axes\n\t\t\t\tif (axis.isLog && threshold <= 0) {\n\t\t\t\t\tthreshold = null;\n\t\t\t\t}\n\n\t\t\t\t// Get dataMin and dataMax for X axes\n\t\t\t\tif (axis.isXAxis) {\n\t\t\t\t\txData = series.xData;\n\t\t\t\t\tif (xData.length) {\n\t\t\t\t\t\taxis.dataMin = mathMin(pick(axis.dataMin, xData[0]), arrayMin(xData));\n\t\t\t\t\t\taxis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));\n\t\t\t\t\t}\n\n\t\t\t\t// Get dataMin and dataMax for Y axes, as well as handle stacking and processed data\n\t\t\t\t} else {\n\n\t\t\t\t\t// Get this particular series extremes\n\t\t\t\t\tseries.getExtremes();\n\t\t\t\t\tseriesDataMax = series.dataMax;\n\t\t\t\t\tseriesDataMin = series.dataMin;\n\n\t\t\t\t\t// Get the dataMin and dataMax so far. If percentage is used, the min and max are\n\t\t\t\t\t// always 0 and 100. If seriesDataMin and seriesDataMax is null, then series\n\t\t\t\t\t// doesn't have active y data, we continue with nulls\n\t\t\t\t\tif (defined(seriesDataMin) && defined(seriesDataMax)) {\n\t\t\t\t\t\taxis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin);\n\t\t\t\t\t\taxis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Adjust to threshold\n\t\t\t\t\tif (defined(threshold)) {\n\t\t\t\t\t\tif (axis.dataMin >= threshold) {\n\t\t\t\t\t\t\taxis.dataMin = threshold;\n\t\t\t\t\t\t\taxis.ignoreMinPadding = true;\n\t\t\t\t\t\t} else if (axis.dataMax < threshold) {\n\t\t\t\t\t\t\taxis.dataMax = threshold;\n\t\t\t\t\t\t\taxis.ignoreMaxPadding = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Translate from axis value to pixel position on the chart, or back\n\t *\n\t */\n\ttranslate: function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n\t\tvar axis = this,\n\t\t\taxisLength = axis.len,\n\t\t\tsign = 1,\n\t\t\tcvsOffset = 0,\n\t\t\tlocalA = old ? axis.oldTransA : axis.transA,\n\t\t\tlocalMin = old ? axis.oldMin : axis.min,\n\t\t\treturnValue,\n\t\t\tminPixelPadding = axis.minPixelPadding,\n\t\t\tpostTranslate = (axis.options.ordinal || (axis.isLog && handleLog)) && axis.lin2val;\n\n\t\tif (!localA) {\n\t\t\tlocalA = axis.transA;\n\t\t}\n\n\t\t// In vertical axes, the canvas coordinates start from 0 at the top like in \n\t\t// SVG. \n\t\tif (cvsCoord) {\n\t\t\tsign *= -1; // canvas coordinates inverts the value\n\t\t\tcvsOffset = axisLength;\n\t\t}\n\n\t\t// Handle reversed axis\n\t\tif (axis.reversed) { \n\t\t\tsign *= -1;\n\t\t\tcvsOffset -= sign * axisLength;\n\t\t}\n\n\t\t// From pixels to value\n\t\tif (backwards) { // reverse translation\n\t\t\t\n\t\t\tval = val * sign + cvsOffset;\n\t\t\tval -= minPixelPadding;\n\t\t\treturnValue = val / localA + localMin; // from chart pixel to value\n\t\t\tif (postTranslate) { // log and ordinal axes\n\t\t\t\treturnValue = axis.lin2val(returnValue);\n\t\t\t}\n\n\t\t// From value to pixels\n\t\t} else {\n\t\t\tif (postTranslate) { // log and ordinal axes\n\t\t\t\tval = axis.val2lin(val);\n\t\t\t}\n\t\t\tif (pointPlacement === 'between') {\n\t\t\t\tpointPlacement = 0.5;\n\t\t\t}\n\t\t\treturnValue = sign * (val - localMin) * localA + cvsOffset + (sign * minPixelPadding) +\n\t\t\t\t(isNumber(pointPlacement) ? localA * pointPlacement * axis.pointRange : 0);\n\t\t}\n\n\t\treturn returnValue;\n\t},\n\n\t/**\n\t * Utility method to translate an axis value to pixel position. \n\t * @param {Number} value A value in terms of axis units\n\t * @param {Boolean} paneCoordinates Whether to return the pixel coordinate relative to the chart\n\t *        or just the axis/pane itself.\n\t */\n\ttoPixels: function (value, paneCoordinates) {\n\t\treturn this.translate(value, false, !this.horiz, null, true) + (paneCoordinates ? 0 : this.pos);\n\t},\n\n\t/*\n\t * Utility method to translate a pixel position in to an axis value\n\t * @param {Number} pixel The pixel value coordinate\n\t * @param {Boolean} paneCoordiantes Whether the input pixel is relative to the chart or just the\n\t *        axis/pane itself.\n\t */\n\ttoValue: function (pixel, paneCoordinates) {\n\t\treturn this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);\n\t},\n\n\t/**\n\t * Create the path for a plot line that goes from the given value on\n\t * this axis, across the plot to the opposite side\n\t * @param {Number} value\n\t * @param {Number} lineWidth Used for calculation crisp line\n\t * @param {Number] old Use old coordinates (for resizing and rescaling)\n\t */\n\tgetPlotLinePath: function (value, lineWidth, old, force) {\n\t\tvar axis = this,\n\t\t\tchart = axis.chart,\n\t\t\taxisLeft = axis.left,\n\t\t\taxisTop = axis.top,\n\t\t\tx1,\n\t\t\ty1,\n\t\t\tx2,\n\t\t\ty2,\n\t\t\ttranslatedValue = axis.translate(value, null, null, old),\n\t\t\tcHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n\t\t\tcWidth = (old && chart.oldChartWidth) || chart.chartWidth,\n\t\t\tskip,\n\t\t\ttransB = axis.transB;\n\n\t\tx1 = x2 = mathRound(translatedValue + transB);\n\t\ty1 = y2 = mathRound(cHeight - translatedValue - transB);\n\n\t\tif (isNaN(translatedValue)) { // no min or max\n\t\t\tskip = true;\n\n\t\t} else if (axis.horiz) {\n\t\t\ty1 = axisTop;\n\t\t\ty2 = cHeight - axis.bottom;\n\t\t\tif (x1 < axisLeft || x1 > axisLeft + axis.width) {\n\t\t\t\tskip = true;\n\t\t\t}\n\t\t} else {\n\t\t\tx1 = axisLeft;\n\t\t\tx2 = cWidth - axis.right;\n\n\t\t\tif (y1 < axisTop || y1 > axisTop + axis.height) {\n\t\t\t\tskip = true;\n\t\t\t}\n\t\t}\n\t\treturn skip && !force ?\n\t\t\tnull :\n\t\t\tchart.renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 0);\n\t},\n\t\n\t/**\n\t * Create the path for a plot band\n\t */\n\tgetPlotBandPath: function (from, to) {\n\n\t\tvar toPath = this.getPlotLinePath(to),\n\t\t\tpath = this.getPlotLinePath(from);\n\t\t\t\n\t\tif (path && toPath) {\n\t\t\tpath.push(\n\t\t\t\ttoPath[4],\n\t\t\t\ttoPath[5],\n\t\t\t\ttoPath[1],\n\t\t\t\ttoPath[2]\n\t\t\t);\n\t\t} else { // outside the axis area\n\t\t\tpath = null;\n\t\t}\n\t\t\n\t\treturn path;\n\t},\n\t\n\t/**\n\t * Set the tick positions of a linear axis to round values like whole tens or every five.\n\t */\n\tgetLinearTickPositions: function (tickInterval, min, max) {\n\t\tvar pos,\n\t\t\tlastPos,\n\t\t\troundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval),\n\t\t\troundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval),\n\t\t\ttickPositions = [];\n\n\t\t// Populate the intermediate values\n\t\tpos = roundedMin;\n\t\twhile (pos <= roundedMax) {\n\n\t\t\t// Place the tick on the rounded value\n\t\t\ttickPositions.push(pos);\n\n\t\t\t// Always add the raw tickInterval, not the corrected one.\n\t\t\tpos = correctFloat(pos + tickInterval);\n\n\t\t\t// If the interval is not big enough in the current min - max range to actually increase\n\t\t\t// the loop variable, we need to break out to prevent endless loop. Issue #619\n\t\t\tif (pos === lastPos) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Record the last value\n\t\t\tlastPos = pos;\n\t\t}\n\t\treturn tickPositions;\n\t},\n\t\n\t/**\n\t * Set the tick positions of a logarithmic axis\n\t */\n\tgetLogTickPositions: function (interval, min, max, minor) {\n\t\tvar axis = this,\n\t\t\toptions = axis.options,\n\t\t\taxisLength = axis.len,\n\t\t\t// Since we use this method for both major and minor ticks,\n\t\t\t// use a local variable and return the result\n\t\t\tpositions = []; \n\t\t\n\t\t// Reset\n\t\tif (!minor) {\n\t\t\taxis._minorAutoInterval = null;\n\t\t}\n\t\t\n\t\t// First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n\t\tif (interval >= 0.5) {\n\t\t\tinterval = mathRound(interval);\n\t\t\tpositions = axis.getLinearTickPositions(interval, min, max);\n\t\t\t\n\t\t// Second case: We need intermediary ticks. For example \n\t\t// 1, 2, 4, 6, 8, 10, 20, 40 etc. \n\t\t} else if (interval >= 0.08) {\n\t\t\tvar roundedMin = mathFloor(min),\n\t\t\t\tintermediate,\n\t\t\t\ti,\n\t\t\t\tj,\n\t\t\t\tlen,\n\t\t\t\tpos,\n\t\t\t\tlastPos,\n\t\t\t\tbreak2;\n\t\t\t\t\n\t\t\tif (interval > 0.3) {\n\t\t\t\tintermediate = [1, 2, 4];\n\t\t\t} else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc\n\t\t\t\tintermediate = [1, 2, 4, 6, 8];\n\t\t\t} else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n\t\t\t\tintermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n\t\t\t}\n\t\t\t\n\t\t\tfor (i = roundedMin; i < max + 1 && !break2; i++) {\n\t\t\t\tlen = intermediate.length;\n\t\t\t\tfor (j = 0; j < len && !break2; j++) {\n\t\t\t\t\tpos = log2lin(lin2log(i) * intermediate[j]);\n\t\t\t\t\t\n\t\t\t\t\tif (pos > min && (!minor || lastPos <= max)) { // #1670\n\t\t\t\t\t\tpositions.push(lastPos);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (lastPos > max) {\n\t\t\t\t\t\tbreak2 = true;\n\t\t\t\t\t}\n\t\t\t\t\tlastPos = pos;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t// Third case: We are so deep in between whole logarithmic values that\n\t\t// we might as well handle the tick positions like a linear axis. For\n\t\t// example 1.01, 1.02, 1.03, 1.04.\n\t\t} else {\n\t\t\tvar realMin = lin2log(min),\n\t\t\t\trealMax = lin2log(max),\n\t\t\t\ttickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],\n\t\t\t\tfilteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,\n\t\t\t\ttickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),\n\t\t\t\ttotalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;\n\t\t\t\n\t\t\tinterval = pick(\n\t\t\t\tfilteredTickIntervalOption,\n\t\t\t\taxis._minorAutoInterval,\n\t\t\t\t(realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)\n\t\t\t);\n\t\t\t\n\t\t\tinterval = normalizeTickInterval(\n\t\t\t\tinterval, \n\t\t\t\tnull, \n\t\t\t\tgetMagnitude(interval)\n\t\t\t);\n\t\t\t\n\t\t\tpositions = map(axis.getLinearTickPositions(\n\t\t\t\tinterval, \n\t\t\t\trealMin,\n\t\t\t\trealMax\t\n\t\t\t), log2lin);\n\t\t\t\n\t\t\tif (!minor) {\n\t\t\t\taxis._minorAutoInterval = interval / 5;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Set the axis-level tickInterval variable \n\t\tif (!minor) {\n\t\t\taxis.tickInterval = interval;\n\t\t}\n\t\treturn positions;\n\t},\n\n\t/**\n\t * Return the minor tick positions. For logarithmic axes, reuse the same logic\n\t * as for major ticks.\n\t */\n\tgetMinorTickPositions: function () {\n\t\tvar axis = this,\n\t\t\toptions = axis.options,\n\t\t\ttickPositions = axis.tickPositions,\n\t\t\tminorTickInterval = axis.minorTickInterval,\n\t\t\tminorTickPositions = [],\n\t\t\tpos,\n\t\t\ti,\n\t\t\tlen;\n\t\t\n\t\tif (axis.isLog) {\n\t\t\tlen = tickPositions.length;\n\t\t\tfor (i = 1; i < len; i++) {\n\t\t\t\tminorTickPositions = minorTickPositions.concat(\n\t\t\t\t\taxis.getLogTickPositions(minorTickInterval, tickPositions[i - 1], tickPositions[i], true)\n\t\t\t\t);\t\n\t\t\t}\n\t\t} else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314\n\t\t\tminorTickPositions = minorTickPositions.concat(\n\t\t\t\tgetTimeTicks(\n\t\t\t\t\tnormalizeTimeTickInterval(minorTickInterval),\n\t\t\t\t\taxis.min,\n\t\t\t\t\taxis.max,\n\t\t\t\t\toptions.startOfWeek\n\t\t\t\t)\n\t\t\t);\n\t\t\tif (minorTickPositions[0] < axis.min) {\n\t\t\t\tminorTickPositions.shift();\n\t\t\t}\n\t\t} else {\t\t\t\n\t\t\tfor (pos = axis.min + (tickPositions[0] - axis.min) % minorTickInterval; pos <= axis.max; pos += minorTickInterval) {\n\t\t\t\tminorTickPositions.push(pos);\n\t\t\t}\n\t\t}\n\t\treturn minorTickPositions;\n\t},\n\n\t/**\n\t * Adjust the min and max for the minimum range. Keep in mind that the series data is \n\t * not yet processed, so we don't have information on data cropping and grouping, or \n\t * updated axis.pointRange or series.pointRange. The data can't be processed until\n\t * we have finally established min and max.\n\t */\n\tadjustForMinRange: function () {\n\t\tvar axis = this,\n\t\t\toptions = axis.options,\n\t\t\tmin = axis.min,\n\t\t\tmax = axis.max,\n\t\t\tzoomOffset,\n\t\t\tspaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange,\n\t\t\tclosestDataRange,\n\t\t\ti,\n\t\t\tdistance,\n\t\t\txData,\n\t\t\tloopLength,\n\t\t\tminArgs,\n\t\t\tmaxArgs;\n\n\t\t// Set the automatic minimum range based on the closest point distance\n\t\tif (axis.isXAxis && axis.minRange === UNDEFINED && !axis.isLog) {\n\n\t\t\tif (defined(options.min) || defined(options.max)) {\n\t\t\t\taxis.minRange = null; // don't do this again\n\n\t\t\t} else {\n\n\t\t\t\t// Find the closest distance between raw data points, as opposed to\n\t\t\t\t// closestPointRange that applies to processed points (cropped and grouped)\n\t\t\t\teach(axis.series, function (series) {\n\t\t\t\t\txData = series.xData;\n\t\t\t\t\tloopLength = series.xIncrement ? 1 : xData.length - 1;\n\t\t\t\t\tfor (i = loopLength; i > 0; i--) {\n\t\t\t\t\t\tdistance = xData[i] - xData[i - 1];\n\t\t\t\t\t\tif (closestDataRange === UNDEFINED || distance < closestDataRange) {\n\t\t\t\t\t\t\tclosestDataRange = distance;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\taxis.minRange = mathMin(closestDataRange * 5, axis.dataMax - axis.dataMin);\n\t\t\t}\n\t\t}\n\n\t\t// if minRange is exceeded, adjust\n\t\tif (max - min < axis.minRange) {\n\t\t\tvar minRange = axis.minRange;\n\t\t\tzoomOffset = (minRange - max + min) / 2;\n\n\t\t\t// if min and max options have been set, don't go beyond it\n\t\t\tminArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];\n\t\t\tif (spaceAvailable) { // if space is available, stay within the data range\n\t\t\t\tminArgs[2] = axis.dataMin;\n\t\t\t}\n\t\t\tmin = arrayMax(minArgs);\n\n\t\t\tmaxArgs = [min + minRange, pick(options.max, min + minRange)];\n\t\t\tif (spaceAvailable) { // if space is availabe, stay within the data range\n\t\t\t\tmaxArgs[2] = axis.dataMax;\n\t\t\t}\n\n\t\t\tmax = arrayMin(maxArgs);\n\n\t\t\t// now if the max is adjusted, adjust the min back\n\t\t\tif (max - min < minRange) {\n\t\t\t\tminArgs[0] = max - minRange;\n\t\t\t\tminArgs[1] = pick(options.min, max - minRange);\n\t\t\t\tmin = arrayMax(minArgs);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Record modified extremes\n\t\taxis.min = min;\n\t\taxis.max = max;\n\t},\n\n\t/**\n\t * Update translation information\n\t */\n\tsetAxisTranslation: function (saveOld) {\n\t\tvar axis = this,\n\t\t\trange = axis.max - axis.min,\n\t\t\tpointRange = 0,\n\t\t\tclosestPointRange,\n\t\t\tminPointOffset = 0,\n\t\t\tpointRangePadding = 0,\n\t\t\tlinkedParent = axis.linkedParent,\n\t\t\tordinalCorrection,\n\t\t\ttransA = axis.transA;\n\n\t\t// adjust translation for padding\n\t\tif (axis.isXAxis) {\n\t\t\tif (linkedParent) {\n\t\t\t\tminPointOffset = linkedParent.minPointOffset;\n\t\t\t\tpointRangePadding = linkedParent.pointRangePadding;\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\teach(axis.series, function (series) {\n\t\t\t\t\tvar seriesPointRange = series.pointRange,\n\t\t\t\t\t\tpointPlacement = series.options.pointPlacement,\n\t\t\t\t\t\tseriesClosestPointRange = series.closestPointRange;\n\n\t\t\t\t\tif (seriesPointRange > range) { // #1446\n\t\t\t\t\t\tseriesPointRange = 0;\n\t\t\t\t\t}\n\t\t\t\t\tpointRange = mathMax(pointRange, seriesPointRange);\n\t\t\t\t\t\n\t\t\t\t\t// minPointOffset is the value padding to the left of the axis in order to make\n\t\t\t\t\t// room for points with a pointRange, typically columns. When the pointPlacement option\n\t\t\t\t\t// is 'between' or 'on', this padding does not apply.\n\t\t\t\t\tminPointOffset = mathMax(\n\t\t\t\t\t\tminPointOffset, \n\t\t\t\t\t\tisString(pointPlacement) ? 0 : seriesPointRange / 2\n\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\t// Determine the total padding needed to the length of the axis to make room for the \n\t\t\t\t\t// pointRange. If the series' pointPlacement is 'on', no padding is added.\n\t\t\t\t\tpointRangePadding = mathMax(\n\t\t\t\t\t\tpointRangePadding,\n\t\t\t\t\t\tpointPlacement === 'on' ? 0 : seriesPointRange\n\t\t\t\t\t);\n\n\t\t\t\t\t// Set the closestPointRange\n\t\t\t\t\tif (!series.noSharedTooltip && defined(seriesClosestPointRange)) {\n\t\t\t\t\t\tclosestPointRange = defined(closestPointRange) ?\n\t\t\t\t\t\t\tmathMin(closestPointRange, seriesClosestPointRange) :\n\t\t\t\t\t\t\tseriesClosestPointRange;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\t// Record minPointOffset and pointRangePadding\n\t\t\tordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853\n\t\t\taxis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;\n\t\t\taxis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;\n\n\t\t\t// pointRange means the width reserved for each point, like in a column chart\n\t\t\taxis.pointRange = mathMin(pointRange, range);\n\n\t\t\t// closestPointRange means the closest distance between points. In columns\n\t\t\t// it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange\n\t\t\t// is some other value\n\t\t\taxis.closestPointRange = closestPointRange;\n\t\t}\n\n\t\t// Secondary values\n\t\tif (saveOld) {\n\t\t\taxis.oldTransA = transA;\n\t\t}\n\t\taxis.translationSlope = axis.transA = transA = axis.len / ((range + pointRangePadding) || 1);\n\t\taxis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend\n\t\taxis.minPixelPadding = transA * minPointOffset;\n\t},\n\n\t/**\n\t * Set the tick positions to round values and optionally extend the extremes\n\t * to the nearest tick\n\t */\n\tsetTickPositions: function (secondPass) {\n\t\tvar axis = this,\n\t\t\tchart = axis.chart,\n\t\t\toptions = axis.options,\n\t\t\tisLog = axis.isLog,\n\t\t\tisDatetimeAxis = axis.isDatetimeAxis,\n\t\t\tisXAxis = axis.isXAxis,\n\t\t\tisLinked = axis.isLinked,\n\t\t\ttickPositioner = axis.options.tickPositioner,\n\t\t\tmaxPadding = options.maxPadding,\n\t\t\tminPadding = options.minPadding,\n\t\t\tlength,\n\t\t\tlinkedParentExtremes,\n\t\t\ttickIntervalOption = options.tickInterval,\n\t\t\tminTickIntervalOption = options.minTickInterval,\n\t\t\ttickPixelIntervalOption = options.tickPixelInterval,\n\t\t\ttickPositions,\n\t\t\tkeepTwoTicksOnly,\n\t\t\tcategories = axis.categories;\n\n\t\t// linked axis gets the extremes from the parent axis\n\t\tif (isLinked) {\n\t\t\taxis.linkedParent = chart[isXAxis ? 'xAxis' : 'yAxis'][options.linkedTo];\n\t\t\tlinkedParentExtremes = axis.linkedParent.getExtremes();\n\t\t\taxis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n\t\t\taxis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n\t\t\tif (options.type !== axis.linkedParent.options.type) {\n\t\t\t\terror(11, 1); // Can't link axes of different type\n\t\t\t}\n\t\t} else { // initial min and max from the extreme data values\n\t\t\taxis.min = pick(axis.userMin, options.min, axis.dataMin);\n\t\t\taxis.max = pick(axis.userMax, options.max, axis.dataMax);\n\t\t}\n\n\t\tif (isLog) {\n\t\t\tif (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978\n\t\t\t\terror(10, 1); // Can't plot negative values on log axis\n\t\t\t}\n\t\t\taxis.min = correctFloat(log2lin(axis.min)); // correctFloat cures #934\n\t\t\taxis.max = correctFloat(log2lin(axis.max));\n\t\t}\n\n\t\t// handle zoomed range\n\t\tif (axis.range) {\n\t\t\taxis.userMin = axis.min = mathMax(axis.min, axis.max - axis.range); // #618\n\t\t\taxis.userMax = axis.max;\n\t\t\tif (secondPass) {\n\t\t\t\taxis.range = null;  // don't use it when running setExtremes\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Hook for adjusting this.min and this.max. Used by bubble series.\n\t\tif (axis.beforePadding) {\n\t\t\taxis.beforePadding();\n\t\t}\n\n\t\t// adjust min and max for the minimum range\n\t\taxis.adjustForMinRange();\n\t\t\n\t\t// Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding\n\t\t// into account, we do this after computing tick interval (#1337).\n\t\tif (!categories && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {\n\t\t\tlength = axis.max - axis.min;\n\t\t\tif (length) {\n\t\t\t\tif (!defined(options.min) && !defined(axis.userMin) && minPadding && (axis.dataMin < 0 || !axis.ignoreMinPadding)) {\n\t\t\t\t\taxis.min -= length * minPadding;\n\t\t\t\t}\n\t\t\t\tif (!defined(options.max) && !defined(axis.userMax)  && maxPadding && (axis.dataMax > 0 || !axis.ignoreMaxPadding)) {\n\t\t\t\t\taxis.max += length * maxPadding;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// get tickInterval\n\t\tif (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {\n\t\t\taxis.tickInterval = 1;\n\t\t} else if (isLinked && !tickIntervalOption &&\n\t\t\t\ttickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {\n\t\t\taxis.tickInterval = axis.linkedParent.tickInterval;\n\t\t} else {\n\t\t\taxis.tickInterval = pick(\n\t\t\t\ttickIntervalOption,\n\t\t\t\tcategories ? // for categoried axis, 1 is default, for linear axis use tickPix\n\t\t\t\t\t1 :\n\t\t\t\t\t// don't let it be more than the data range\n\t\t\t\t\t(axis.max - axis.min) * tickPixelIntervalOption / mathMax(axis.len, tickPixelIntervalOption)\n\t\t\t);\n\t\t\t// For squished axes, set only two ticks\n\t\t\tif (!defined(tickIntervalOption) && axis.len < tickPixelIntervalOption && !this.isRadial) {\n\t\t\t\tkeepTwoTicksOnly = true;\n\t\t\t\taxis.tickInterval /= 4; // tick extremes closer to the real values\n\t\t\t}\n\t\t}\n\n\t\t// Now we're finished detecting min and max, crop and group series data. This\n\t\t// is in turn needed in order to find tick positions in ordinal axes. \n\t\tif (isXAxis && !secondPass) {\n\t\t\teach(axis.series, function (series) {\n\t\t\t\tseries.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);\n\t\t\t});\n\t\t}\n\n\t\t// set the translation factor used in translate function\n\t\taxis.setAxisTranslation(true);\n\n\t\t// hook for ordinal axes and radial axes\n\t\tif (axis.beforeSetTickPositions) {\n\t\t\taxis.beforeSetTickPositions();\n\t\t}\n\t\t\n\t\t// hook for extensions, used in Highstock ordinal axes\n\t\tif (axis.postProcessTickInterval) {\n\t\t\taxis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);\n\t\t}\n\n\t\t// In column-like charts, don't cramp in more ticks than there are points (#1943)\n\t\tif (axis.pointRange) {\n\t\t\taxis.tickInterval = mathMax(axis.pointRange, axis.tickInterval);\n\t\t}\n\t\t\n\t\t// Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.\n\t\tif (!tickIntervalOption && axis.tickInterval < minTickIntervalOption) {\n\t\t\taxis.tickInterval = minTickIntervalOption;\n\t\t}\n\n\t\t// for linear axes, get magnitude and normalize the interval\n\t\tif (!isDatetimeAxis && !isLog) { // linear\n\t\t\tif (!tickIntervalOption) {\n\t\t\t\taxis.tickInterval = normalizeTickInterval(axis.tickInterval, null, getMagnitude(axis.tickInterval), options);\n\t\t\t}\n\t\t}\n\n\t\t// get minorTickInterval\n\t\taxis.minorTickInterval = options.minorTickInterval === 'auto' && axis.tickInterval ?\n\t\t\t\taxis.tickInterval / 5 : options.minorTickInterval;\n\n\t\t// find the tick positions\n\t\taxis.tickPositions = tickPositions = options.tickPositions ?\n\t\t\t[].concat(options.tickPositions) : // Work on a copy (#1565)\n\t\t\t(tickPositioner && tickPositioner.apply(axis, [axis.min, axis.max]));\n\t\tif (!tickPositions) {\n\t\t\t\n\t\t\t// Too many ticks\n\t\t\tif (!axis.ordinalPositions && (axis.max - axis.min) / axis.tickInterval > mathMax(2 * axis.len, 200)) {\n\t\t\t\terror(19, true);\n\t\t\t}\n\t\t\t\n\t\t\tif (isDatetimeAxis) {\n\t\t\t\ttickPositions = (axis.getNonLinearTimeTicks || getTimeTicks)(\n\t\t\t\t\tnormalizeTimeTickInterval(axis.tickInterval, options.units),\n\t\t\t\t\taxis.min,\n\t\t\t\t\taxis.max,\n\t\t\t\t\toptions.startOfWeek,\n\t\t\t\t\taxis.ordinalPositions,\n\t\t\t\t\taxis.closestPointRange,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t} else if (isLog) {\n\t\t\t\ttickPositions = axis.getLogTickPositions(axis.tickInterval, axis.min, axis.max);\n\t\t\t} else {\n\t\t\t\ttickPositions = axis.getLinearTickPositions(axis.tickInterval, axis.min, axis.max);\n\t\t\t}\n\t\t\tif (keepTwoTicksOnly) {\n\t\t\t\ttickPositions.splice(1, tickPositions.length - 2);\n\t\t\t}\n\n\t\t\taxis.tickPositions = tickPositions;\n\t\t}\n\n\t\tif (!isLinked) {\n\n\t\t\t// reset min/max or remove extremes based on start/end on tick\n\t\t\tvar roundedMin = tickPositions[0],\n\t\t\t\troundedMax = tickPositions[tickPositions.length - 1],\n\t\t\t\tminPointOffset = axis.minPointOffset || 0,\n\t\t\t\tsinglePad;\n\n\t\t\tif (options.startOnTick) {\n\t\t\t\taxis.min = roundedMin;\n\t\t\t} else if (axis.min - minPointOffset > roundedMin) {\n\t\t\t\ttickPositions.shift();\n\t\t\t}\n\n\t\t\tif (options.endOnTick) {\n\t\t\t\taxis.max = roundedMax;\n\t\t\t} else if (axis.max + minPointOffset < roundedMax) {\n\t\t\t\ttickPositions.pop();\n\t\t\t}\n\t\t\t\n\t\t\t// When there is only one point, or all points have the same value on this axis, then min\n\t\t\t// and max are equal and tickPositions.length is 1. In this case, add some padding\n\t\t\t// in order to center the point, but leave it with one tick. #1337.\n\t\t\tif (tickPositions.length === 1) {\n\t\t\t\tsinglePad = 0.001; // The lowest possible number to avoid extra padding on columns\n\t\t\t\taxis.min -= singlePad;\n\t\t\t\taxis.max += singlePad;\n\t\t\t}\n\t\t}\n\t},\n\t\n\t/**\n\t * Set the max ticks of either the x and y axis collection\n\t */\n\tsetMaxTicks: function () {\n\t\t\n\t\tvar chart = this.chart,\n\t\t\tmaxTicks = chart.maxTicks || {},\n\t\t\ttickPositions = this.tickPositions,\n\t\t\tkey = this._maxTicksKey = [this.xOrY, this.pos, this.len].join('-');\n\t\t\n\t\tif (!this.isLinked && !this.isDatetimeAxis && tickPositions && tickPositions.length > (maxTicks[key] || 0) && this.options.alignTicks !== false) {\n\t\t\tmaxTicks[key] = tickPositions.length;\n\t\t}\n\t\tchart.maxTicks = maxTicks;\n\t},\n\n\t/**\n\t * When using multiple axes, adjust the number of ticks to match the highest\n\t * number of ticks in that group\n\t */\n\tadjustTickAmount: function () {\n\t\tvar axis = this,\n\t\t\tchart = axis.chart,\n\t\t\tkey = axis._maxTicksKey,\n\t\t\ttickPositions = axis.tickPositions,\n\t\t\tmaxTicks = chart.maxTicks;\n\n\t\tif (maxTicks && maxTicks[key] && !axis.isDatetimeAxis && !axis.categories && !axis.isLinked && axis.options.alignTicks !== false) { // only apply to linear scale\n\t\t\tvar oldTickAmount = axis.tickAmount,\n\t\t\t\tcalculatedTickAmount = tickPositions.length,\n\t\t\t\ttickAmount;\n\n\t\t\t// set the axis-level tickAmount to use below\n\t\t\taxis.tickAmount = tickAmount = maxTicks[key];\n\n\t\t\tif (calculatedTickAmount < tickAmount) {\n\t\t\t\twhile (tickPositions.length < tickAmount) {\n\t\t\t\t\ttickPositions.push(correctFloat(\n\t\t\t\t\t\ttickPositions[tickPositions.length - 1] + axis.tickInterval\n\t\t\t\t\t));\n\t\t\t\t}\n\t\t\t\taxis.transA *= (calculatedTickAmount - 1) / (tickAmount - 1);\n\t\t\t\taxis.max = tickPositions[tickPositions.length - 1];\n\n\t\t\t}\n\t\t\tif (defined(oldTickAmount) && tickAmount !== oldTickAmount) {\n\t\t\t\taxis.isDirty = true;\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Set the scale based on data min and max, user set min and max or options\n\t *\n\t */\n\tsetScale: function () {\n\t\tvar axis = this,\n\t\t\tstacks = axis.stacks,\n\t\t\ttype,\n\t\t\ti,\n\t\t\tisDirtyData,\n\t\t\tisDirtyAxisLength;\n\n\t\taxis.oldMin = axis.min;\n\t\taxis.oldMax = axis.max;\n\t\taxis.oldAxisLength = axis.len;\n\n\t\t// set the new axisLength\n\t\taxis.setAxisSize();\n\t\t//axisLength = horiz ? axisWidth : axisHeight;\n\t\tisDirtyAxisLength = axis.len !== axis.oldAxisLength;\n\n\t\t// is there new data?\n\t\teach(axis.series, function (series) {\n\t\t\tif (series.isDirtyData || series.isDirty ||\n\t\t\t\t\tseries.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well\n\t\t\t\tisDirtyData = true;\n\t\t\t}\n\t\t});\n\n\t\t// do we really need to go through all this?\n\t\tif (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||\n\t\t\taxis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax) {\n\t\t\t\n\t\t\t// reset stacks\n\t\t\tif (!axis.isXAxis) {\n\t\t\t\tfor (type in stacks) {\n\t\t\t\t\tdelete stacks[type];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\taxis.forceRedraw = false;\n\n\t\t\t// get data extremes if needed\n\t\t\taxis.getSeriesExtremes();\n\n\t\t\t// get fixed positions based on tickInterval\n\t\t\taxis.setTickPositions();\n\n\t\t\t// record old values to decide whether a rescale is necessary later on (#540)\n\t\t\taxis.oldUserMin = axis.userMin;\n\t\t\taxis.oldUserMax = axis.userMax;\n\n\t\t\t// Mark as dirty if it is not already set to dirty and extremes have changed. #595.\n\t\t\tif (!axis.isDirty) {\n\t\t\t\taxis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;\n\t\t\t}\n\t\t} else if (!axis.isXAxis) {\n\t\t\tif (axis.oldStacks) {\n\t\t\t\tstacks = axis.stacks = axis.oldStacks;\n\t\t\t}\n\n\t\t\t// reset stacks\n\t\t\tfor (type in stacks) {\n\t\t\t\tfor (i in stacks[type]) {\n\t\t\t\t\tstacks[type][i].cum = stacks[type][i].total;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Set the maximum tick amount\n\t\taxis.setMaxTicks();\n\t},\n\n\t/**\n\t * Set the extremes and optionally redraw\n\t * @param {Number} newMin\n\t * @param {Number} newMax\n\t * @param {Boolean} redraw\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n\t *    configuration\n\t * @param {Object} eventArguments \n\t *\n\t */\n\tsetExtremes: function (newMin, newMax, redraw, animation, eventArguments) {\n\t\tvar axis = this,\n\t\t\tchart = axis.chart;\n\n\t\tredraw = pick(redraw, true); // defaults to true\n\n\t\t// Extend the arguments with min and max\n\t\teventArguments = extend(eventArguments, {\n\t\t\tmin: newMin,\n\t\t\tmax: newMax\n\t\t});\n\n\t\t// Fire the event\n\t\tfireEvent(axis, 'setExtremes', eventArguments, function () { // the default event handler\n\n\t\t\taxis.userMin = newMin;\n\t\t\taxis.userMax = newMax;\n\t\t\taxis.eventArgs = eventArguments;\n\n\t\t\t// Mark for running afterSetExtremes\n\t\t\taxis.isDirtyExtremes = true;\n\n\t\t\t// redraw\n\t\t\tif (redraw) {\n\t\t\t\tchart.redraw(animation);\n\t\t\t}\n\t\t});\n\t},\n\t\n\t/**\n\t * Overridable method for zooming chart. Pulled out in a separate method to allow overriding\n\t * in stock charts.\n\t */\n\tzoom: function (newMin, newMax) {\n\n\t\t// Prevent pinch zooming out of range. Check for defined is for #1946.\n\t\tif (!this.allowZoomOutside) {\n\t\t\tif (defined(this.dataMin) && newMin <= this.dataMin) {\n\t\t\t\tnewMin = UNDEFINED;\n\t\t\t}\n\t\t\tif (defined(this.dataMax) && newMax >= this.dataMax) {\n\t\t\t\tnewMax = UNDEFINED;\n\t\t\t}\n\t\t}\n\n\t\t// In full view, displaying the reset zoom button is not required\n\t\tthis.displayBtn = newMin !== UNDEFINED || newMax !== UNDEFINED;\n\t\t\n\t\t// Do it\n\t\tthis.setExtremes(\n\t\t\tnewMin,\n\t\t\tnewMax,\n\t\t\tfalse, \n\t\t\tUNDEFINED, \n\t\t\t{ trigger: 'zoom' }\n\t\t);\n\t\treturn true;\n\t},\n\t\n\t/**\n\t * Update the axis metrics\n\t */\n\tsetAxisSize: function () {\n\t\tvar chart = this.chart,\n\t\t\toptions = this.options,\n\t\t\toffsetLeft = options.offsetLeft || 0,\n\t\t\toffsetRight = options.offsetRight || 0,\n\t\t\thoriz = this.horiz,\n\t\t\twidth,\n\t\t\theight,\n\t\t\ttop,\n\t\t\tleft;\n\n\t\t// Expose basic values to use in Series object and navigator\n\t\tthis.left = left = pick(options.left, chart.plotLeft + offsetLeft);\n\t\tthis.top = top = pick(options.top, chart.plotTop);\n\t\tthis.width = width = pick(options.width, chart.plotWidth - offsetLeft + offsetRight);\n\t\tthis.height = height = pick(options.height, chart.plotHeight);\n\t\tthis.bottom = chart.chartHeight - height - top;\n\t\tthis.right = chart.chartWidth - width - left;\n\n\t\t// Direction agnostic properties\n\t\tthis.len = mathMax(horiz ? width : height, 0); // mathMax fixes #905\n\t\tthis.pos = horiz ? left : top; // distance from SVG origin\n\t},\n\n\t/**\n\t * Get the actual axis extremes\n\t */\n\tgetExtremes: function () {\n\t\tvar axis = this,\n\t\t\tisLog = axis.isLog;\n\n\t\treturn {\n\t\t\tmin: isLog ? correctFloat(lin2log(axis.min)) : axis.min,\n\t\t\tmax: isLog ? correctFloat(lin2log(axis.max)) : axis.max,\n\t\t\tdataMin: axis.dataMin,\n\t\t\tdataMax: axis.dataMax,\n\t\t\tuserMin: axis.userMin,\n\t\t\tuserMax: axis.userMax\n\t\t};\n\t},\n\n\t/**\n\t * Get the zero plane either based on zero or on the min or max value.\n\t * Used in bar and area plots\n\t */\n\tgetThreshold: function (threshold) {\n\t\tvar axis = this,\n\t\t\tisLog = axis.isLog;\n\n\t\tvar realMin = isLog ? lin2log(axis.min) : axis.min,\n\t\t\trealMax = isLog ? lin2log(axis.max) : axis.max;\n\t\t\n\t\tif (realMin > threshold || threshold === null) {\n\t\t\tthreshold = realMin;\n\t\t} else if (realMax < threshold) {\n\t\t\tthreshold = realMax;\n\t\t}\n\n\t\treturn axis.translate(threshold, 0, 1, 0, 1);\n\t},\n\n\taddPlotBand: function (options) {\n\t\tthis.addPlotBandOrLine(options, 'plotBands');\n\t},\n\t\n\taddPlotLine: function (options) {\n\t\tthis.addPlotBandOrLine(options, 'plotLines');\n\t},\n\n\t/**\n\t * Add a plot band or plot line after render time\n\t *\n\t * @param options {Object} The plotBand or plotLine configuration object\n\t */\n\taddPlotBandOrLine: function (options, coll) {\n\t\tvar obj = new PlotLineOrBand(this, options).render(),\n\t\t\tuserOptions = this.userOptions;\n\n\t\tif (obj) { // #2189\n\t\t\t// Add it to the user options for exporting and Axis.update\n\t\t\tif (coll) {\n\t\t\t\tuserOptions[coll] = userOptions[coll] || [];\n\t\t\t\tuserOptions[coll].push(options); \n\t\t\t}\n\t\t\tthis.plotLinesAndBands.push(obj); \n\t\t}\n\t\t\n\t\treturn obj;\n\t},\n\n\t/**\n\t * Compute auto alignment for the axis label based on which side the axis is on \n\t * and the given rotation for the label\n\t */\n\tautoLabelAlign: function (rotation) {\n\t\tvar ret, \n\t\t\tangle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;\n\n\t\tif (angle > 15 && angle < 165) {\n\t\t\tret = 'right';\n\t\t} else if (angle > 195 && angle < 345) {\n\t\t\tret = 'left';\n\t\t} else {\n\t\t\tret = 'center';\n\t\t}\n\t\treturn ret;\n\t},\n\n\t/**\n\t * Render the tick labels to a preliminary position to get their sizes\n\t */\n\tgetOffset: function () {\n\t\tvar axis = this,\n\t\t\tchart = axis.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\toptions = axis.options,\n\t\t\ttickPositions = axis.tickPositions,\n\t\t\tticks = axis.ticks,\n\t\t\thoriz = axis.horiz,\n\t\t\tside = axis.side,\n\t\t\tinvertedSide = chart.inverted ? [1, 0, 3, 2][side] : side,\n\t\t\thasData,\n\t\t\tshowAxis,\n\t\t\ttitleOffset = 0,\n\t\t\ttitleOffsetOption,\n\t\t\ttitleMargin = 0,\n\t\t\taxisTitleOptions = options.title,\n\t\t\tlabelOptions = options.labels,\n\t\t\tlabelOffset = 0, // reset\n\t\t\taxisOffset = chart.axisOffset,\n\t\t\tclipOffset = chart.clipOffset,\n\t\t\tdirectionFactor = [-1, 1, 1, -1][side],\n\t\t\tn,\n\t\t\ti,\n\t\t\tautoStaggerLines = 1,\n\t\t\tmaxStaggerLines = pick(labelOptions.maxStaggerLines, 5),\n\t\t\tsortedPositions,\n\t\t\tlastRight,\n\t\t\toverlap,\n\t\t\tpos,\n\t\t\tbBox,\n\t\t\tx,\n\t\t\tw,\n\t\t\tlineNo;\n\t\t\t\n\t\t// For reuse in Axis.render\n\t\taxis.hasData = hasData = (axis.hasVisibleSeries || (defined(axis.min) && defined(axis.max) && !!tickPositions));\n\t\taxis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n\t\t// Set/reset staggerLines\n\t\taxis.staggerLines = axis.horiz && labelOptions.staggerLines;\n\t\t\n\t\t// Create the axisGroup and gridGroup elements on first iteration\n\t\tif (!axis.axisGroup) {\n\t\t\taxis.gridGroup = renderer.g('grid')\n\t\t\t\t.attr({ zIndex: options.gridZIndex || 1 })\n\t\t\t\t.add();\n\t\t\taxis.axisGroup = renderer.g('axis')\n\t\t\t\t.attr({ zIndex: options.zIndex || 2 })\n\t\t\t\t.add();\n\t\t\taxis.labelGroup = renderer.g('axis-labels')\n\t\t\t\t.attr({ zIndex: labelOptions.zIndex || 7 })\n\t\t\t\t.add();\n\t\t}\n\n\t\tif (hasData || axis.isLinked) {\n\t\t\t\n\t\t\t// Set the explicit or automatic label alignment\n\t\t\taxis.labelAlign = pick(labelOptions.align || axis.autoLabelAlign(labelOptions.rotation));\n\n\t\t\teach(tickPositions, function (pos) {\n\t\t\t\tif (!ticks[pos]) {\n\t\t\t\t\tticks[pos] = new Tick(axis, pos);\n\t\t\t\t} else {\n\t\t\t\t\tticks[pos].addLabel(); // update labels depending on tick interval\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Handle automatic stagger lines\n\t\t\tif (axis.horiz && !axis.staggerLines && maxStaggerLines && !labelOptions.rotation) {\n\t\t\t\tsortedPositions = axis.reversed ? [].concat(tickPositions).reverse() : tickPositions;\n\t\t\t\twhile (autoStaggerLines < maxStaggerLines) {\n\t\t\t\t\tlastRight = [];\n\t\t\t\t\toverlap = false;\n\t\t\t\t\t\n\t\t\t\t\tfor (i = 0; i < sortedPositions.length; i++) {\n\t\t\t\t\t\tpos = sortedPositions[i];\n\t\t\t\t\t\tbBox = ticks[pos].label && ticks[pos].label.getBBox();\n\t\t\t\t\t\tw = bBox ? bBox.width : 0;\n\t\t\t\t\t\tlineNo = i % autoStaggerLines;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (w) {\n\t\t\t\t\t\t\tx = axis.translate(pos); // don't handle log\n\t\t\t\t\t\t\tif (lastRight[lineNo] !== UNDEFINED && x < lastRight[lineNo]) {\n\t\t\t\t\t\t\t\toverlap = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlastRight[lineNo] = x + w;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (overlap) {\n\t\t\t\t\t\tautoStaggerLines++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (autoStaggerLines > 1) {\n\t\t\t\t\taxis.staggerLines = autoStaggerLines;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\teach(tickPositions, function (pos) {\n\t\t\t\t// left side must be align: right and right side must have align: left for labels\n\t\t\t\tif (side === 0 || side === 2 || { 1: 'left', 3: 'right' }[side] === axis.labelAlign) {\n\n\t\t\t\t\t// get the highest offset\n\t\t\t\t\tlabelOffset = mathMax(\n\t\t\t\t\t\tticks[pos].getLabelSize(),\n\t\t\t\t\t\tlabelOffset\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t});\n\t\t\tif (axis.staggerLines) {\n\t\t\t\tlabelOffset *= axis.staggerLines;\n\t\t\t\taxis.labelOffset = labelOffset;\n\t\t\t}\n\t\t\t\n\n\t\t} else { // doesn't have data\n\t\t\tfor (n in ticks) {\n\t\t\t\tticks[n].destroy();\n\t\t\t\tdelete ticks[n];\n\t\t\t}\n\t\t}\n\n\t\tif (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) { \n\t\t\tif (!axis.axisTitle) {\n\t\t\t\taxis.axisTitle = renderer.text(\n\t\t\t\t\taxisTitleOptions.text,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\taxisTitleOptions.useHTML\n\t\t\t\t)\n\t\t\t\t.attr({\n\t\t\t\t\tzIndex: 7,\n\t\t\t\t\trotation: axisTitleOptions.rotation || 0,\n\t\t\t\t\talign:\n\t\t\t\t\t\taxisTitleOptions.textAlign ||\n\t\t\t\t\t\t{ low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align]\n\t\t\t\t})\n\t\t\t\t.css(axisTitleOptions.style)\n\t\t\t\t.add(axis.axisGroup);\n\t\t\t\taxis.axisTitle.isNew = true;\n\t\t\t}\n\n\t\t\tif (showAxis) {\n\t\t\t\ttitleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n\t\t\t\ttitleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10);\n\t\t\t\ttitleOffsetOption = axisTitleOptions.offset;\n\t\t\t}\n\n\t\t\t// hide or show the title depending on whether showEmpty is set\n\t\t\taxis.axisTitle[showAxis ? 'show' : 'hide']();\n\t\t}\n\t\t\n\t\t// handle automatic or user set offset\n\t\taxis.offset = directionFactor * pick(options.offset, axisOffset[side]);\n\t\t\n\t\taxis.axisTitleMargin =\n\t\t\tpick(titleOffsetOption,\n\t\t\t\tlabelOffset + titleMargin +\n\t\t\t\t(side !== 2 && labelOffset && directionFactor * options.labels[horiz ? 'y' : 'x'])\n\t\t\t);\n\n\t\taxisOffset[side] = mathMax(\n\t\t\taxisOffset[side],\n\t\t\taxis.axisTitleMargin + titleOffset + directionFactor * axis.offset\n\t\t);\n\t\tclipOffset[invertedSide] = mathMax(clipOffset[invertedSide], mathFloor(options.lineWidth / 2) * 2);\n\t},\n\t\n\t/**\n\t * Get the path for the axis line\n\t */\n\tgetLinePath: function (lineWidth) {\n\t\tvar chart = this.chart,\n\t\t\topposite = this.opposite,\n\t\t\toffset = this.offset,\n\t\t\thoriz = this.horiz,\n\t\t\tlineLeft = this.left + (opposite ? this.width : 0) + offset,\n\t\t\tlineTop = chart.chartHeight - this.bottom - (opposite ? this.height : 0) + offset;\n\t\t\t\n\t\tif (opposite) {\n\t\t\tlineWidth *= -1; // crispify the other way - #1480, #1687\n\t\t}\n\n\t\treturn chart.renderer.crispLine([\n\t\t\t\tM,\n\t\t\t\thoriz ?\n\t\t\t\t\tthis.left :\n\t\t\t\t\tlineLeft,\n\t\t\t\thoriz ?\n\t\t\t\t\tlineTop :\n\t\t\t\t\tthis.top,\n\t\t\t\tL,\n\t\t\t\thoriz ?\n\t\t\t\t\tchart.chartWidth - this.right :\n\t\t\t\t\tlineLeft,\n\t\t\t\thoriz ?\n\t\t\t\t\tlineTop :\n\t\t\t\t\tchart.chartHeight - this.bottom\n\t\t\t], lineWidth);\n\t},\n\t\n\t/**\n\t * Position the title\n\t */\n\tgetTitlePosition: function () {\n\t\t// compute anchor points for each of the title align options\n\t\tvar horiz = this.horiz,\n\t\t\taxisLeft = this.left,\n\t\t\taxisTop = this.top,\n\t\t\taxisLength = this.len,\n\t\t\taxisTitleOptions = this.options.title,\t\t\t\n\t\t\tmargin = horiz ? axisLeft : axisTop,\n\t\t\topposite = this.opposite,\n\t\t\toffset = this.offset,\n\t\t\tfontSize = pInt(axisTitleOptions.style.fontSize || 12),\n\t\t\t\n\t\t\t// the position in the length direction of the axis\n\t\t\talongAxis = {\n\t\t\t\tlow: margin + (horiz ? 0 : axisLength),\n\t\t\t\tmiddle: margin + axisLength / 2,\n\t\t\t\thigh: margin + (horiz ? axisLength : 0)\n\t\t\t}[axisTitleOptions.align],\n\t\n\t\t\t// the position in the perpendicular direction of the axis\n\t\t\toffAxis = (horiz ? axisTop + this.height : axisLeft) +\n\t\t\t\t(horiz ? 1 : -1) * // horizontal axis reverses the margin\n\t\t\t\t(opposite ? -1 : 1) * // so does opposite axes\n\t\t\t\tthis.axisTitleMargin +\n\t\t\t\t(this.side === 2 ? fontSize : 0);\n\n\t\treturn {\n\t\t\tx: horiz ?\n\t\t\t\talongAxis :\n\t\t\t\toffAxis + (opposite ? this.width : 0) + offset +\n\t\t\t\t\t(axisTitleOptions.x || 0), // x\n\t\t\ty: horiz ?\n\t\t\t\toffAxis - (opposite ? this.height : 0) + offset :\n\t\t\t\talongAxis + (axisTitleOptions.y || 0) // y\n\t\t};\n\t},\n\t\n\t/**\n\t * Render the axis\n\t */\n\trender: function () {\n\t\tvar axis = this,\n\t\t\tchart = axis.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\toptions = axis.options,\n\t\t\tisLog = axis.isLog,\n\t\t\tisLinked = axis.isLinked,\n\t\t\ttickPositions = axis.tickPositions,\n\t\t\taxisTitle = axis.axisTitle,\n\t\t\tstacks = axis.stacks,\n\t\t\tticks = axis.ticks,\n\t\t\tminorTicks = axis.minorTicks,\n\t\t\talternateBands = axis.alternateBands,\n\t\t\tstackLabelOptions = options.stackLabels,\n\t\t\talternateGridColor = options.alternateGridColor,\n\t\t\ttickmarkOffset = axis.tickmarkOffset,\n\t\t\tlineWidth = options.lineWidth,\n\t\t\tlinePath,\n\t\t\thasRendered = chart.hasRendered,\n\t\t\tslideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),\n\t\t\thasData = axis.hasData,\n\t\t\tshowAxis = axis.showAxis,\n\t\t\tfrom,\n\t\t\tto;\n\n\t\t// Mark all elements inActive before we go over and mark the active ones\n\t\teach([ticks, minorTicks, alternateBands], function (coll) {\n\t\t\tvar pos;\n\t\t\tfor (pos in coll) {\n\t\t\t\tcoll[pos].isActive = false;\n\t\t\t}\n\t\t});\n\n\t\t// If the series has data draw the ticks. Else only the line and title\n\t\tif (hasData || isLinked) {\n\n\t\t\t// minor ticks\n\t\t\tif (axis.minorTickInterval && !axis.categories) {\n\t\t\t\teach(axis.getMinorTickPositions(), function (pos) {\n\t\t\t\t\tif (!minorTicks[pos]) {\n\t\t\t\t\t\tminorTicks[pos] = new Tick(axis, pos, 'minor');\n\t\t\t\t\t}\n\n\t\t\t\t\t// render new ticks in old position\n\t\t\t\t\tif (slideInTicks && minorTicks[pos].isNew) {\n\t\t\t\t\t\tminorTicks[pos].render(null, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tminorTicks[pos].render(null, false, 1);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Major ticks. Pull out the first item and render it last so that\n\t\t\t// we can get the position of the neighbour label. #808.\n\t\t\tif (tickPositions.length) { // #1300\n\t\t\t\teach(tickPositions.slice(1).concat([tickPositions[0]]), function (pos, i) {\n\t\n\t\t\t\t\t// Reorganize the indices\n\t\t\t\t\ti = (i === tickPositions.length - 1) ? 0 : i + 1;\n\t\n\t\t\t\t\t// linked axes need an extra check to find out if\n\t\t\t\t\tif (!isLinked || (pos >= axis.min && pos <= axis.max)) {\n\t\n\t\t\t\t\t\tif (!ticks[pos]) {\n\t\t\t\t\t\t\tticks[pos] = new Tick(axis, pos);\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// render new ticks in old position\n\t\t\t\t\t\tif (slideInTicks && ticks[pos].isNew) {\n\t\t\t\t\t\t\tticks[pos].render(i, true);\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tticks[pos].render(i, false, 1);\n\t\t\t\t\t}\n\t\n\t\t\t\t});\n\t\t\t\t// In a categorized axis, the tick marks are displayed between labels. So\n\t\t\t\t// we need to add a tick mark and grid line at the left edge of the X axis.\n\t\t\t\tif (tickmarkOffset && axis.min === 0) {\n\t\t\t\t\tif (!ticks[-1]) {\n\t\t\t\t\t\tticks[-1] = new Tick(axis, -1, null, true);\n\t\t\t\t\t}\n\t\t\t\t\tticks[-1].render(-1);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n\t\t\t// alternate grid color\n\t\t\tif (alternateGridColor) {\n\t\t\t\teach(tickPositions, function (pos, i) {\n\t\t\t\t\tif (i % 2 === 0 && pos < axis.max) {\n\t\t\t\t\t\tif (!alternateBands[pos]) {\n\t\t\t\t\t\t\talternateBands[pos] = new PlotLineOrBand(axis);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfrom = pos + tickmarkOffset; // #949\n\t\t\t\t\t\tto = tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] + tickmarkOffset : axis.max;\n\t\t\t\t\t\talternateBands[pos].options = {\n\t\t\t\t\t\t\tfrom: isLog ? lin2log(from) : from,\n\t\t\t\t\t\t\tto: isLog ? lin2log(to) : to,\n\t\t\t\t\t\t\tcolor: alternateGridColor\n\t\t\t\t\t\t};\n\t\t\t\t\t\talternateBands[pos].render();\n\t\t\t\t\t\talternateBands[pos].isActive = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// custom plot lines and bands\n\t\t\tif (!axis._addedPlotLB) { // only first time\n\t\t\t\teach((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) {\n\t\t\t\t\taxis.addPlotBandOrLine(plotLineOptions);\n\t\t\t\t});\n\t\t\t\taxis._addedPlotLB = true;\n\t\t\t}\n\n\t\t} // end if hasData\n\n\t\t// Remove inactive ticks\n\t\teach([ticks, minorTicks, alternateBands], function (coll) {\n\t\t\tvar pos, \n\t\t\t\ti,\n\t\t\t\tforDestruction = [],\n\t\t\t\tdelay = globalAnimation ? globalAnimation.duration || 500 : 0,\n\t\t\t\tdestroyInactiveItems = function () {\n\t\t\t\t\ti = forDestruction.length;\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\t// When resizing rapidly, the same items may be destroyed in different timeouts,\n\t\t\t\t\t\t// or the may be reactivated\n\t\t\t\t\t\tif (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {\n\t\t\t\t\t\t\tcoll[forDestruction[i]].destroy();\n\t\t\t\t\t\t\tdelete coll[forDestruction[i]];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t};\n\n\t\t\tfor (pos in coll) {\n\n\t\t\t\tif (!coll[pos].isActive) {\n\t\t\t\t\t// Render to zero opacity\n\t\t\t\t\tcoll[pos].render(pos, false, 0);\n\t\t\t\t\tcoll[pos].isActive = false;\n\t\t\t\t\tforDestruction.push(pos);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// When the objects are finished fading out, destroy them\n\t\t\tif (coll === alternateBands || !chart.hasRendered || !delay) {\n\t\t\t\tdestroyInactiveItems();\n\t\t\t} else if (delay) {\n\t\t\t\tsetTimeout(destroyInactiveItems, delay);\n\t\t\t}\n\t\t});\n\n\t\t// Static items. As the axis group is cleared on subsequent calls\n\t\t// to render, these items are added outside the group.\n\t\t// axis line\n\t\tif (lineWidth) {\n\t\t\tlinePath = axis.getLinePath(lineWidth);\n\t\t\tif (!axis.axisLine) {\n\t\t\t\taxis.axisLine = renderer.path(linePath)\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tstroke: options.lineColor,\n\t\t\t\t\t\t'stroke-width': lineWidth,\n\t\t\t\t\t\tzIndex: 7\n\t\t\t\t\t})\n\t\t\t\t\t.add(axis.axisGroup);\n\t\t\t} else {\n\t\t\t\taxis.axisLine.animate({ d: linePath });\n\t\t\t}\n\n\t\t\t// show or hide the line depending on options.showEmpty\n\t\t\taxis.axisLine[showAxis ? 'show' : 'hide']();\n\t\t}\n\n\t\tif (axisTitle && showAxis) {\n\t\t\t\n\t\t\taxisTitle[axisTitle.isNew ? 'attr' : 'animate'](\n\t\t\t\taxis.getTitlePosition()\n\t\t\t);\n\t\t\taxisTitle.isNew = false;\n\t\t}\n\n\t\t// Stacked totals:\n\t\tif (stackLabelOptions && stackLabelOptions.enabled) {\n\t\t\tvar stackKey, oneStack, stackCategory,\n\t\t\t\tstackTotalGroup = axis.stackTotalGroup;\n\n\t\t\t// Create a separate group for the stack total labels\n\t\t\tif (!stackTotalGroup) {\n\t\t\t\taxis.stackTotalGroup = stackTotalGroup =\n\t\t\t\t\trenderer.g('stack-labels')\n\t\t\t\t\t\t.attr({\n\t\t\t\t\t\t\tvisibility: VISIBLE,\n\t\t\t\t\t\t\tzIndex: 6\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.add();\n\t\t\t}\n\n\t\t\t// plotLeft/Top will change when y axis gets wider so we need to translate the\n\t\t\t// stackTotalGroup at every render call. See bug #506 and #516\n\t\t\tstackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n\n\t\t\t// Render each stack total\n\t\t\tfor (stackKey in stacks) {\n\t\t\t\toneStack = stacks[stackKey];\n\t\t\t\tfor (stackCategory in oneStack) {\n\t\t\t\t\toneStack[stackCategory].render(stackTotalGroup);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// End stacked totals\n\n\t\taxis.isDirty = false;\n\t},\n\n\t/**\n\t * Remove a plot band or plot line from the chart by id\n\t * @param {Object} id\n\t */\n\tremovePlotBandOrLine: function (id) {\n\t\tvar plotLinesAndBands = this.plotLinesAndBands,\n\t\t\toptions = this.options,\n\t\t\tuserOptions = this.userOptions,\n\t\t\ti = plotLinesAndBands.length;\n\t\twhile (i--) {\n\t\t\tif (plotLinesAndBands[i].id === id) {\n\t\t\t\tplotLinesAndBands[i].destroy();\n\t\t\t}\n\t\t}\n\t\teach([options.plotLines || [], userOptions.plotLines || [], options.plotBands || [], userOptions.plotBands || []], function (arr) {\n\t\t\ti = arr.length;\n\t\t\twhile (i--) {\n\t\t\t\tif (arr[i].id === id) {\n\t\t\t\t\terase(arr, arr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t},\n\n\t/**\n\t * Update the axis title by options\n\t */\n\tsetTitle: function (newTitleOptions, redraw) {\n\t\tthis.update({ title: newTitleOptions }, redraw);\n\t},\n\n\t/**\n\t * Redraw the axis to reflect changes in the data or axis extremes\n\t */\n\tredraw: function () {\n\t\tvar axis = this,\n\t\t\tchart = axis.chart,\n\t\t\tpointer = chart.pointer;\n\n\t\t// hide tooltip and hover states\n\t\tif (pointer.reset) {\n\t\t\tpointer.reset(true);\n\t\t}\n\n\t\t// render the axis\n\t\taxis.render();\n\n\t\t// move plot lines and bands\n\t\teach(axis.plotLinesAndBands, function (plotLine) {\n\t\t\tplotLine.render();\n\t\t});\n\n\t\t// mark associated series as dirty and ready for redraw\n\t\teach(axis.series, function (series) {\n\t\t\tseries.isDirty = true;\n\t\t});\n\n\t},\n\n\t/**\n\t * Build the stacks from top down\n\t */\n\tbuildStacks: function () {\n\t\tvar series = this.series,\n\t\t\ti = series.length;\n\t\tif (!this.isXAxis) {\n\t\t\twhile (i--) {\n\t\t\t\tseries[i].setStackedPoints();\n\t\t\t}\n\t\t\t// Loop up again to compute percent stack\n\t\t\tif (this.usePercentage) {\n\t\t\t\tfor (i = 0; i < series.length; i++) {\n\t\t\t\t\tseries[i].setPercentStacks();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Set new axis categories and optionally redraw\n\t * @param {Array} categories\n\t * @param {Boolean} redraw\n\t */\n\tsetCategories: function (categories, redraw) {\n\t\tthis.update({ categories: categories }, redraw);\n\t},\n\n\t/**\n\t * Destroys an Axis instance.\n\t */\n\tdestroy: function (keepEvents) {\n\t\tvar axis = this,\n\t\t\tstacks = axis.stacks,\n\t\t\tstackKey,\n\t\t\tplotLinesAndBands = axis.plotLinesAndBands,\n\t\t\ti;\n\n\t\t// Remove the events\n\t\tif (!keepEvents) {\n\t\t\tremoveEvent(axis);\n\t\t}\n\n\t\t// Destroy each stack total\n\t\tfor (stackKey in stacks) {\n\t\t\tdestroyObjectProperties(stacks[stackKey]);\n\n\t\t\tstacks[stackKey] = null;\n\t\t}\n\n\t\t// Destroy collections\n\t\teach([axis.ticks, axis.minorTicks, axis.alternateBands], function (coll) {\n\t\t\tdestroyObjectProperties(coll);\n\t\t});\n\t\ti = plotLinesAndBands.length;\n\t\twhile (i--) { // #1975\n\t\t\tplotLinesAndBands[i].destroy();\n\t\t}\n\n\t\t// Destroy local variables\n\t\teach(['stackTotalGroup', 'axisLine', 'axisGroup', 'gridGroup', 'labelGroup', 'axisTitle'], function (prop) {\n\t\t\tif (axis[prop]) {\n\t\t\t\taxis[prop] = axis[prop].destroy();\n\t\t\t}\n\t\t});\n\t}\n\n\t\n}; // end Axis\n\n/**\n * The tooltip object\n * @param {Object} chart The chart instance\n * @param {Object} options Tooltip options\n */\nfunction Tooltip() {\n\tthis.init.apply(this, arguments);\n}\n\nTooltip.prototype = {\n\n\tinit: function (chart, options) {\n\n\t\tvar borderWidth = options.borderWidth,\n\t\t\tstyle = options.style,\n\t\t\tpadding = pInt(style.padding);\n\n\t\t// Save the chart and options\n\t\tthis.chart = chart;\n\t\tthis.options = options;\n\n\t\t// Keep track of the current series\n\t\t//this.currentSeries = UNDEFINED;\n\n\t\t// List of crosshairs\n\t\tthis.crosshairs = [];\n\n\t\t// Current values of x and y when animating\n\t\tthis.now = { x: 0, y: 0 };\n\n\t\t// The tooltip is initially hidden\n\t\tthis.isHidden = true;\n\n\n\t\t// create the label\n\t\tthis.label = chart.renderer.label('', 0, 0, options.shape, null, null, options.useHTML, null, 'tooltip')\n\t\t\t.attr({\n\t\t\t\tpadding: padding,\n\t\t\t\tfill: options.backgroundColor,\n\t\t\t\t'stroke-width': borderWidth,\n\t\t\t\tr: options.borderRadius,\n\t\t\t\tzIndex: 8\n\t\t\t})\n\t\t\t.css(style)\n\t\t\t.css({ padding: 0 }) // Remove it from VML, the padding is applied as an attribute instead (#1117)\n\t\t\t.add()\n\t\t\t.attr({ y: -999 }); // #2301\n\n\t\t// When using canVG the shadow shows up as a gray circle\n\t\t// even if the tooltip is hidden.\n\t\tif (!useCanVG) {\n\t\t\tthis.label.shadow(options.shadow);\n\t\t}\n\n\t\t// Public property for getting the shared state.\n\t\tthis.shared = options.shared;\n\t},\n\n\t/**\n\t * Destroy the tooltip and its elements.\n\t */\n\tdestroy: function () {\n\t\teach(this.crosshairs, function (crosshair) {\n\t\t\tif (crosshair) {\n\t\t\t\tcrosshair.destroy();\n\t\t\t}\n\t\t});\n\n\t\t// Destroy and clear local variables\n\t\tif (this.label) {\n\t\t\tthis.label = this.label.destroy();\n\t\t}\n\t\tclearTimeout(this.hideTimer);\n\t\tclearTimeout(this.tooltipTimeout);\n\t},\n\n\t/**\n\t * Provide a soft movement for the tooltip\n\t *\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @private\n\t */\n\tmove: function (x, y, anchorX, anchorY) {\n\t\tvar tooltip = this,\n\t\t\tnow = tooltip.now,\n\t\t\tanimate = tooltip.options.animation !== false && !tooltip.isHidden;\n\n\t\t// get intermediate values for animation\n\t\textend(now, {\n\t\t\tx: animate ? (2 * now.x + x) / 3 : x,\n\t\t\ty: animate ? (now.y + y) / 2 : y,\n\t\t\tanchorX: animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,\n\t\t\tanchorY: animate ? (now.anchorY + anchorY) / 2 : anchorY\n\t\t});\n\n\t\t// move to the intermediate value\n\t\ttooltip.label.attr(now);\n\n\t\t\n\t\t// run on next tick of the mouse tracker\n\t\tif (animate && (mathAbs(x - now.x) > 1 || mathAbs(y - now.y) > 1)) {\n\t\t\n\t\t\t// never allow two timeouts\n\t\t\tclearTimeout(this.tooltipTimeout);\n\t\t\t\n\t\t\t// set the fixed interval ticking for the smooth tooltip\n\t\t\tthis.tooltipTimeout = setTimeout(function () {\n\t\t\t\t// The interval function may still be running during destroy, so check that the chart is really there before calling.\n\t\t\t\tif (tooltip) {\n\t\t\t\t\ttooltip.move(x, y, anchorX, anchorY);\n\t\t\t\t}\n\t\t\t}, 32);\n\t\t\t\n\t\t}\n\t},\n\n\t/**\n\t * Hide the tooltip\n\t */\n\thide: function () {\n\t\tvar tooltip = this,\n\t\t\thoverPoints;\n\t\t\n\t\tclearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)\n\t\tif (!this.isHidden) {\n\t\t\thoverPoints = this.chart.hoverPoints;\n\n\t\t\tthis.hideTimer = setTimeout(function () {\n\t\t\t\ttooltip.label.fadeOut();\n\t\t\t\ttooltip.isHidden = true;\n\t\t\t}, pick(this.options.hideDelay, 500));\n\n\t\t\t// hide previous hoverPoints and set new\n\t\t\tif (hoverPoints) {\n\t\t\t\teach(hoverPoints, function (point) {\n\t\t\t\t\tpoint.setState();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.chart.hoverPoints = null;\n\t\t}\n\t},\n\n\t/**\n\t * Hide the crosshairs\n\t */\n\thideCrosshairs: function () {\n\t\teach(this.crosshairs, function (crosshair) {\n\t\t\tif (crosshair) {\n\t\t\t\tcrosshair.hide();\n\t\t\t}\n\t\t});\n\t},\n\t\n\t/** \n\t * Extendable method to get the anchor position of the tooltip\n\t * from a point or set of points\n\t */\n\tgetAnchor: function (points, mouseEvent) {\n\t\tvar ret,\n\t\t\tchart = this.chart,\n\t\t\tinverted = chart.inverted,\n\t\t\tplotTop = chart.plotTop,\n\t\t\tplotX = 0,\n\t\t\tplotY = 0,\n\t\t\tyAxis;\n\t\t\n\t\tpoints = splat(points);\n\t\t\n\t\t// Pie uses a special tooltipPos\n\t\tret = points[0].tooltipPos;\n\t\t\n\t\t// When tooltip follows mouse, relate the position to the mouse\n\t\tif (this.followPointer && mouseEvent) {\n\t\t\tif (mouseEvent.chartX === UNDEFINED) {\n\t\t\t\tmouseEvent = chart.pointer.normalize(mouseEvent);\n\t\t\t}\n\t\t\tret = [\n\t\t\t\tmouseEvent.chartX - chart.plotLeft,\n\t\t\t\tmouseEvent.chartY - plotTop\n\t\t\t];\n\t\t}\n\t\t// When shared, use the average position\n\t\tif (!ret) {\n\t\t\teach(points, function (point) {\n\t\t\t\tyAxis = point.series.yAxis;\n\t\t\t\tplotX += point.plotX;\n\t\t\t\tplotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +\n\t\t\t\t\t(!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151\n\t\t\t});\n\t\t\t\n\t\t\tplotX /= points.length;\n\t\t\tplotY /= points.length;\n\t\t\t\n\t\t\tret = [\n\t\t\t\tinverted ? chart.plotWidth - plotY : plotX,\n\t\t\t\tthis.shared && !inverted && points.length > 1 && mouseEvent ? \n\t\t\t\t\tmouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)\n\t\t\t\t\tinverted ? chart.plotHeight - plotX : plotY\n\t\t\t];\n\t\t}\n\n\t\treturn map(ret, mathRound);\n\t},\n\t\n\t/**\n\t * Place the tooltip in a chart without spilling over\n\t * and not covering the point it self.\n\t */\n\tgetPosition: function (boxWidth, boxHeight, point) {\n\t\t\n\t\t// Set up the variables\n\t\tvar chart = this.chart,\n\t\t\tplotLeft = chart.plotLeft,\n\t\t\tplotTop = chart.plotTop,\n\t\t\tplotWidth = chart.plotWidth,\n\t\t\tplotHeight = chart.plotHeight,\n\t\t\tdistance = pick(this.options.distance, 12),\n\t\t\tpointX = point.plotX,\n\t\t\tpointY = point.plotY,\n\t\t\tx = pointX + plotLeft + (chart.inverted ? distance : -boxWidth - distance),\n\t\t\ty = pointY - boxHeight + plotTop + 15, // 15 means the point is 15 pixels up from the bottom of the tooltip\n\t\t\talignedRight;\n\t\n\t\t// It is too far to the left, adjust it\n\t\tif (x < 7) {\n\t\t\tx = plotLeft + mathMax(pointX, 0) + distance;\n\t\t}\n\t\n\t\t// Test to see if the tooltip is too far to the right,\n\t\t// if it is, move it back to be inside and then up to not cover the point.\n\t\tif ((x + boxWidth) > (plotLeft + plotWidth)) {\n\t\t\tx -= (x + boxWidth) - (plotLeft + plotWidth);\n\t\t\ty = pointY - boxHeight + plotTop - distance;\n\t\t\talignedRight = true;\n\t\t}\n\t\n\t\t// If it is now above the plot area, align it to the top of the plot area\n\t\tif (y < plotTop + 5) {\n\t\t\ty = plotTop + 5;\n\t\n\t\t\t// If the tooltip is still covering the point, move it below instead\n\t\t\tif (alignedRight && pointY >= y && pointY <= (y + boxHeight)) {\n\t\t\t\ty = pointY + plotTop + distance; // below\n\t\t\t}\n\t\t} \n\t\n\t\t// Now if the tooltip is below the chart, move it up. It's better to cover the\n\t\t// point than to disappear outside the chart. #834.\n\t\tif (y + boxHeight > plotTop + plotHeight) {\n\t\t\ty = mathMax(plotTop, plotTop + plotHeight - boxHeight - distance); // below\n\t\t}\n\t\n\t\treturn {x: x, y: y};\n\t},\n\n\t/**\n\t * In case no user defined formatter is given, this will be used. Note that the context\n\t * here is an object holding point, series, x, y etc.\n\t */\n\tdefaultFormatter: function (tooltip) {\n\t\tvar items = this.points || splat(this),\n\t\t\tseries = items[0].series,\n\t\t\ts;\n\n\t\t// build the header\n\t\ts = [series.tooltipHeaderFormatter(items[0])];\n\n\t\t// build the values\n\t\teach(items, function (item) {\n\t\t\tseries = item.series;\n\t\t\ts.push((series.tooltipFormatter && series.tooltipFormatter(item)) ||\n\t\t\t\titem.point.tooltipFormatter(series.tooltipOptions.pointFormat));\n\t\t});\n\n\t\t// footer\n\t\ts.push(tooltip.options.footerFormat || '');\n\n\t\treturn s.join('');\n\t},\n\n\t/**\n\t * Refresh the tooltip's text and position.\n\t * @param {Object} point\n\t */\n\trefresh: function (point, mouseEvent) {\n\t\tvar tooltip = this,\n\t\t\tchart = tooltip.chart,\n\t\t\tlabel = tooltip.label,\n\t\t\toptions = tooltip.options,\n\t\t\tx,\n\t\t\ty,\n\t\t\tanchor,\n\t\t\ttextConfig = {},\n\t\t\ttext,\n\t\t\tpointConfig = [],\n\t\t\tformatter = options.formatter || tooltip.defaultFormatter,\n\t\t\thoverPoints = chart.hoverPoints,\n\t\t\tborderColor,\n\t\t\tcrosshairsOptions = options.crosshairs,\n\t\t\tshared = tooltip.shared,\n\t\t\tcurrentSeries;\n\t\t\t\n\t\tclearTimeout(this.hideTimer);\n\t\t\n\t\t// get the reference point coordinates (pie charts use tooltipPos)\n\t\ttooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;\n\t\tanchor = tooltip.getAnchor(point, mouseEvent);\n\t\tx = anchor[0];\n\t\ty = anchor[1];\n\n\t\t// shared tooltip, array is sent over\n\t\tif (shared && !(point.series && point.series.noSharedTooltip)) {\n\t\t\t\n\t\t\t// hide previous hoverPoints and set new\n\t\t\t\n\t\t\tchart.hoverPoints = point;\n\t\t\tif (hoverPoints) {\n\t\t\t\teach(hoverPoints, function (point) {\n\t\t\t\t\tpoint.setState();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\teach(point, function (item) {\n\t\t\t\titem.setState(HOVER_STATE);\n\n\t\t\t\tpointConfig.push(item.getLabelConfig());\n\t\t\t});\n\n\t\t\ttextConfig = {\n\t\t\t\tx: point[0].category,\n\t\t\t\ty: point[0].y\n\t\t\t};\n\t\t\ttextConfig.points = pointConfig;\n\t\t\tpoint = point[0];\n\n\t\t// single point tooltip\n\t\t} else {\n\t\t\ttextConfig = point.getLabelConfig();\n\t\t}\n\t\ttext = formatter.call(textConfig, tooltip);\n\n\t\t// register the current series\n\t\tcurrentSeries = point.series;\n\n\t\t// update the inner HTML\n\t\tif (text === false) {\n\t\t\tthis.hide();\n\t\t} else {\n\n\t\t\t// show it\n\t\t\tif (tooltip.isHidden) {\n\t\t\t\tstop(label);\n\t\t\t\tlabel.attr('opacity', 1).show();\n\t\t\t}\n\n\t\t\t// update text\n\t\t\tlabel.attr({\n\t\t\t\ttext: text\n\t\t\t});\n\n\t\t\t// set the stroke color of the box\n\t\t\tborderColor = options.borderColor || point.color || currentSeries.color || '#606060';\n\t\t\tlabel.attr({\n\t\t\t\tstroke: borderColor\n\t\t\t});\n\t\t\t\n\t\t\ttooltip.updatePosition({ plotX: x, plotY: y });\n\t\t\n\t\t\tthis.isHidden = false;\n\t\t}\n\n\t\t// crosshairs\n\t\tif (crosshairsOptions) {\n\t\t\tcrosshairsOptions = splat(crosshairsOptions); // [x, y]\n\n\t\t\tvar path,\n\t\t\t\ti = crosshairsOptions.length,\n\t\t\t\tattribs,\n\t\t\t\taxis,\n\t\t\t\tval,\n\t\t\t\tseries;\n\n\t\t\twhile (i--) {\n\t\t\t\tseries = point.series;\n\t\t\t\taxis = series[i ? 'yAxis' : 'xAxis'];\n\t\t\t\tif (crosshairsOptions[i] && axis) {\n\t\t\t\t\tval = i ? pick(point.stackY, point.y) : point.x; // #814\n\t\t\t\t\tif (axis.isLog) { // #1671\n\t\t\t\t\t\tval = log2lin(val);\n\t\t\t\t\t}\n\t\t\t\t\tif (i === 1 && series.modifyValue) { // #1205, #2316\n\t\t\t\t\t\tval = series.modifyValue(val);\n\t\t\t\t\t}\n\n\t\t\t\t\tpath = axis.getPlotLinePath(\n\t\t\t\t\t\tval,\n\t\t\t\t\t\t1\n\t\t\t\t\t);\n\n\t\t\t\t\tif (tooltip.crosshairs[i]) {\n\t\t\t\t\t\ttooltip.crosshairs[i].attr({ d: path, visibility: VISIBLE });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tattribs = {\n\t\t\t\t\t\t\t'stroke-width': crosshairsOptions[i].width || 1,\n\t\t\t\t\t\t\tstroke: crosshairsOptions[i].color || '#C0C0C0',\n\t\t\t\t\t\t\tzIndex: crosshairsOptions[i].zIndex || 2\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (crosshairsOptions[i].dashStyle) {\n\t\t\t\t\t\t\tattribs.dashstyle = crosshairsOptions[i].dashStyle;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttooltip.crosshairs[i] = chart.renderer.path(path)\n\t\t\t\t\t\t\t.attr(attribs)\n\t\t\t\t\t\t\t.add();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfireEvent(chart, 'tooltipRefresh', {\n\t\t\t\ttext: text,\n\t\t\t\tx: x + chart.plotLeft,\n\t\t\t\ty: y + chart.plotTop,\n\t\t\t\tborderColor: borderColor\n\t\t\t});\n\t},\n\t\n\t/**\n\t * Find the new position and perform the move\n\t */\n\tupdatePosition: function (point) {\n\t\tvar chart = this.chart,\n\t\t\tlabel = this.label, \n\t\t\tpos = (this.options.positioner || this.getPosition).call(\n\t\t\t\tthis,\n\t\t\t\tlabel.width,\n\t\t\t\tlabel.height,\n\t\t\t\tpoint\n\t\t\t);\n\n\t\t// do the move\n\t\tthis.move(\n\t\t\tmathRound(pos.x), \n\t\t\tmathRound(pos.y), \n\t\t\tpoint.plotX + chart.plotLeft, \n\t\t\tpoint.plotY + chart.plotTop\n\t\t);\n\t}\n};\n/**\n * The mouse tracker object. All methods starting with \"on\" are primary DOM event handlers. \n * Subsequent methods should be named differently from what they are doing.\n * @param {Object} chart The Chart instance\n * @param {Object} options The root options object\n */\nfunction Pointer(chart, options) {\n\tthis.init(chart, options);\n}\n\nPointer.prototype = {\n\t/**\n\t * Initialize Pointer\n\t */\n\tinit: function (chart, options) {\n\t\t\n\t\tvar chartOptions = options.chart,\n\t\t\tchartEvents = chartOptions.events,\n\t\t\tzoomType = useCanVG ? '' : chartOptions.zoomType,\n\t\t\tinverted = chart.inverted,\n\t\t\tzoomX,\n\t\t\tzoomY;\n\n\t\t// Store references\n\t\tthis.options = options;\n\t\tthis.chart = chart;\n\t\t\n\t\t// Zoom status\n\t\tthis.zoomX = zoomX = /x/.test(zoomType);\n\t\tthis.zoomY = zoomY = /y/.test(zoomType);\n\t\tthis.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n\t\tthis.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n\n\t\t// Do we need to handle click on a touch device?\n\t\tthis.runChartClick = chartEvents && !!chartEvents.click;\n\n\t\tthis.pinchDown = [];\n\t\tthis.lastValidTouch = {};\n\n\t\tif (options.tooltip.enabled) {\n\t\t\tchart.tooltip = new Tooltip(chart, options.tooltip);\n\t\t}\n\n\t\tthis.setDOMEvents();\n\t}, \n\n\t/**\n\t * Add crossbrowser support for chartX and chartY\n\t * @param {Object} e The event object in standard browsers\n\t */\n\tnormalize: function (e, chartPosition) {\n\t\tvar chartX,\n\t\t\tchartY,\n\t\t\tePos;\n\n\t\t// common IE normalizing\n\t\te = e || win.event;\n\t\tif (!e.target) {\n\t\t\te.target = e.srcElement;\n\t\t}\n\n\t\t// Framework specific normalizing (#1165)\n\t\te = washMouseEvent(e);\n\t\t\n\t\t// iOS\n\t\tePos = e.touches ? e.touches.item(0) : e;\n\n\t\t// Get mouse position\n\t\tif (!chartPosition) {\n\t\t\tthis.chartPosition = chartPosition = offset(this.chart.container);\n\t\t}\n\n\t\t// chartX and chartY\n\t\tif (ePos.pageX === UNDEFINED) { // IE < 9. #886.\n\t\t\tchartX = mathMax(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is \n\t\t\t\t// for IE10 quirks mode within framesets\n\t\t\tchartY = e.y;\n\t\t} else {\n\t\t\tchartX = ePos.pageX - chartPosition.left;\n\t\t\tchartY = ePos.pageY - chartPosition.top;\n\t\t}\n\n\t\treturn extend(e, {\n\t\t\tchartX: mathRound(chartX),\n\t\t\tchartY: mathRound(chartY)\n\t\t});\n\t},\n\n\t/**\n\t * Get the click position in terms of axis values.\n\t *\n\t * @param {Object} e A pointer event\n\t */\n\tgetCoordinates: function (e) {\n\t\tvar coordinates = {\n\t\t\t\txAxis: [],\n\t\t\t\tyAxis: []\n\t\t\t};\n\n\t\teach(this.chart.axes, function (axis) {\n\t\t\tcoordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n\t\t\t\taxis: axis,\n\t\t\t\tvalue: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n\t\t\t});\n\t\t});\n\t\treturn coordinates;\n\t},\n\t\n\t/**\n\t * Return the index in the tooltipPoints array, corresponding to pixel position in \n\t * the plot area.\n\t */\n\tgetIndex: function (e) {\n\t\tvar chart = this.chart;\n\t\treturn chart.inverted ? \n\t\t\tchart.plotHeight + chart.plotTop - e.chartY : \n\t\t\te.chartX - chart.plotLeft;\n\t},\n\n\t/**\n\t * With line type charts with a single tracker, get the point closest to the mouse.\n\t * Run Point.onMouseOver and display tooltip for the point or points.\n\t */\n\trunPointActions: function (e) {\n\t\tvar pointer = this,\n\t\t\tchart = pointer.chart,\n\t\t\tseries = chart.series,\n\t\t\ttooltip = chart.tooltip,\n\t\t\tpoint,\n\t\t\tpoints,\n\t\t\thoverPoint = chart.hoverPoint,\n\t\t\thoverSeries = chart.hoverSeries,\n\t\t\ti,\n\t\t\tj,\n\t\t\tdistance = chart.chartWidth,\n\t\t\tindex = pointer.getIndex(e),\n\t\t\tanchor;\n\n\t\t// shared tooltip\n\t\tif (tooltip && pointer.options.tooltip.shared && !(hoverSeries && hoverSeries.noSharedTooltip)) {\n\t\t\tpoints = [];\n\n\t\t\t// loop over all series and find the ones with points closest to the mouse\n\t\t\ti = series.length;\n\t\t\tfor (j = 0; j < i; j++) {\n\t\t\t\tif (series[j].visible &&\n\t\t\t\t\t\tseries[j].options.enableMouseTracking !== false &&\n\t\t\t\t\t\t!series[j].noSharedTooltip && series[j].tooltipPoints.length) {\n\t\t\t\t\tpoint = series[j].tooltipPoints[index];\n\t\t\t\t\tif (point && point.series) { // not a dummy point, #1544\n\t\t\t\t\t\tpoint._dist = mathAbs(index - point.clientX);\n\t\t\t\t\t\tdistance = mathMin(distance, point._dist);\n\t\t\t\t\t\tpoints.push(point);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// remove furthest points\n\t\t\ti = points.length;\n\t\t\twhile (i--) {\n\t\t\t\tif (points[i]._dist > distance) {\n\t\t\t\t\tpoints.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// refresh the tooltip if necessary\n\t\t\tif (points.length && (points[0].clientX !== pointer.hoverX)) {\n\t\t\t\ttooltip.refresh(points, e);\n\t\t\t\tpointer.hoverX = points[0].clientX;\n\t\t\t}\n\t\t}\n\n\t\t// separate tooltip and general mouse events\n\t\tif (hoverSeries && hoverSeries.tracker) { // only use for line-type series with common tracker\n\n\t\t\t// get the point\n\t\t\tpoint = hoverSeries.tooltipPoints[index];\n\n\t\t\t// a new point is hovered, refresh the tooltip\n\t\t\tif (point && point !== hoverPoint) {\n\n\t\t\t\t// trigger the events\n\t\t\t\tpoint.onMouseOver(e);\n\n\t\t\t}\n\t\t\t\n\t\t} else if (tooltip && tooltip.followPointer && !tooltip.isHidden) {\n\t\t\tanchor = tooltip.getAnchor([{}], e);\n\t\t\ttooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });\n\t\t}\n\t},\n\n\n\n\t/**\n\t * Reset the tracking by hiding the tooltip, the hover series state and the hover point\n\t * \n\t * @param allowMove {Boolean} Instead of destroying the tooltip altogether, allow moving it if possible\n\t */\n\treset: function (allowMove) {\n\t\tvar pointer = this,\n\t\t\tchart = pointer.chart,\n\t\t\thoverSeries = chart.hoverSeries,\n\t\t\thoverPoint = chart.hoverPoint,\n\t\t\ttooltip = chart.tooltip,\n\t\t\ttooltipPoints = tooltip && tooltip.shared ? chart.hoverPoints : hoverPoint;\n\t\t\t\n\t\t// Narrow in allowMove\n\t\tallowMove = allowMove && tooltip && tooltipPoints;\n\t\t\t\n\t\t// Check if the points have moved outside the plot area, #1003\n\t\tif (allowMove && splat(tooltipPoints)[0].plotX === UNDEFINED) {\n\t\t\tallowMove = false;\n\t\t}\t\n\n\t\t// Just move the tooltip, #349\n\t\tif (allowMove) {\n\t\t\ttooltip.refresh(tooltipPoints);\n\n\t\t// Full reset\n\t\t} else {\n\n\t\t\tif (hoverPoint) {\n\t\t\t\thoverPoint.onMouseOut();\n\t\t\t}\n\n\t\t\tif (hoverSeries) {\n\t\t\t\thoverSeries.onMouseOut();\n\t\t\t}\n\n\t\t\tif (tooltip) {\n\t\t\t\ttooltip.hide();\n\t\t\t\ttooltip.hideCrosshairs();\n\t\t\t}\n\n\t\t\tpointer.hoverX = null;\n\n\t\t}\n\t},\n\n\t/**\n\t * Scale series groups to a certain scale and translation\n\t */\n\tscaleGroups: function (attribs, clip) {\n\n\t\tvar chart = this.chart,\n\t\t\tseriesAttribs;\n\n\t\t// Scale each series\n\t\teach(chart.series, function (series) {\n\t\t\tseriesAttribs = attribs || series.getPlotBox(); // #1701\n\t\t\tif (series.xAxis && series.xAxis.zoomEnabled) {\n\t\t\t\tseries.group.attr(seriesAttribs);\n\t\t\t\tif (series.markerGroup) {\n\t\t\t\t\tseries.markerGroup.attr(seriesAttribs);\n\t\t\t\t\tseries.markerGroup.clip(clip ? chart.clipRect : null);\n\t\t\t\t}\n\t\t\t\tif (series.dataLabelsGroup) {\n\t\t\t\t\tseries.dataLabelsGroup.attr(seriesAttribs);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\t// Clip\n\t\tchart.clipRect.attr(clip || chart.clipBox);\n\t},\n\n\t/**\n\t * Run translation operations for each direction (horizontal and vertical) independently\n\t */\n\tpinchTranslateDirection: function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {\n\t\tvar chart = this.chart,\n\t\t\txy = horiz ? 'x' : 'y',\n\t\t\tXY = horiz ? 'X' : 'Y',\n\t\t\tsChartXY = 'chart' + XY,\n\t\t\twh = horiz ? 'width' : 'height',\n\t\t\tplotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],\n\t\t\tselectionWH,\n\t\t\tselectionXY,\n\t\t\tclipXY,\n\t\t\tscale = 1,\n\t\t\tinverted = chart.inverted,\n\t\t\tbounds = chart.bounds[horiz ? 'h' : 'v'],\n\t\t\tsingleTouch = pinchDown.length === 1,\n\t\t\ttouch0Start = pinchDown[0][sChartXY],\n\t\t\ttouch0Now = touches[0][sChartXY],\n\t\t\ttouch1Start = !singleTouch && pinchDown[1][sChartXY],\n\t\t\ttouch1Now = !singleTouch && touches[1][sChartXY],\n\t\t\toutOfBounds,\n\t\t\ttransformScale,\n\t\t\tscaleKey,\n\t\t\tsetScale = function () {\n\t\t\t\tif (!singleTouch && mathAbs(touch0Start - touch1Start) > 20) { // Don't zoom if fingers are too close on this axis\n\t\t\t\t\tscale = mathAbs(touch0Now - touch1Now) / mathAbs(touch0Start - touch1Start);\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tclipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n\t\t\t\tselectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;\n\t\t\t};\n\n\t\t// Set the scale, first pass\n\t\tsetScale();\n\n\t\tselectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not\n\n\t\t// Out of bounds\n\t\tif (selectionXY < bounds.min) {\n\t\t\tselectionXY = bounds.min;\n\t\t\toutOfBounds = true;\n\t\t} else if (selectionXY + selectionWH > bounds.max) {\n\t\t\tselectionXY = bounds.max - selectionWH;\n\t\t\toutOfBounds = true;\n\t\t}\n\t\t\n\t\t// Is the chart dragged off its bounds, determined by dataMin and dataMax?\n\t\tif (outOfBounds) {\n\n\t\t\t// Modify the touchNow position in order to create an elastic drag movement. This indicates\n\t\t\t// to the user that the chart is responsive but can't be dragged further.\n\t\t\ttouch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n\t\t\tif (!singleTouch) {\n\t\t\t\ttouch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n\t\t\t}\n\n\t\t\t// Set the scale, second pass to adapt to the modified touchNow positions\n\t\t\tsetScale();\n\n\t\t} else {\n\t\t\tlastValidTouch[xy] = [touch0Now, touch1Now];\n\t\t}\n\n\t\t\n\t\t// Set geometry for clipping, selection and transformation\n\t\tif (!inverted) { // TODO: implement clipping for inverted charts\n\t\t\tclip[xy] = clipXY - plotLeftTop;\n\t\t\tclip[wh] = selectionWH;\n\t\t}\n\t\tscaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n\t\ttransformScale = inverted ? 1 / scale : scale;\n\n\t\tselectionMarker[wh] = selectionWH;\n\t\tselectionMarker[xy] = selectionXY;\n\t\ttransform[scaleKey] = scale;\n\t\ttransform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));\n\t},\n\t\n\t/**\n\t * Handle touch events with two touches\n\t */\n\tpinch: function (e) {\n\n\t\tvar self = this,\n\t\t\tchart = self.chart,\n\t\t\tpinchDown = self.pinchDown,\n\t\t\tfollowTouchMove = chart.tooltip && chart.tooltip.options.followTouchMove,\n\t\t\ttouches = e.touches,\n\t\t\ttouchesLength = touches.length,\n\t\t\tlastValidTouch = self.lastValidTouch,\n\t\t\tzoomHor = self.zoomHor || self.pinchHor,\n\t\t\tzoomVert = self.zoomVert || self.pinchVert,\n\t\t\thasZoom = zoomHor || zoomVert,\n\t\t\tselectionMarker = self.selectionMarker,\n\t\t\ttransform = {},\n\t\t\tfireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') && \n\t\t\t\tchart.runTrackerClick) || chart.runChartClick),\n\t\t\tclip = {};\n\n\t\t// On touch devices, only proceed to trigger click if a handler is defined\n\t\tif ((hasZoom || followTouchMove) && !fireClickEvent) {\n\t\t\te.preventDefault();\n\t\t}\n\t\t\n\t\t// Normalize each touch\n\t\tmap(touches, function (e) {\n\t\t\treturn self.normalize(e);\n\t\t});\n\t\t\t\n\t\t// Register the touch start position\n\t\tif (e.type === 'touchstart') {\n\t\t\teach(touches, function (e, i) {\n\t\t\t\tpinchDown[i] = { chartX: e.chartX, chartY: e.chartY };\n\t\t\t});\n\t\t\tlastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];\n\t\t\tlastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];\n\n\t\t\t// Identify the data bounds in pixels\n\t\t\teach(chart.axes, function (axis) {\n\t\t\t\tif (axis.zoomEnabled) {\n\t\t\t\t\tvar bounds = chart.bounds[axis.horiz ? 'h' : 'v'],\n\t\t\t\t\t\tminPixelPadding = axis.minPixelPadding,\n\t\t\t\t\t\tmin = axis.toPixels(axis.dataMin),\n\t\t\t\t\t\tmax = axis.toPixels(axis.dataMax),\n\t\t\t\t\t\tabsMin = mathMin(min, max),\n\t\t\t\t\t\tabsMax = mathMax(min, max);\n\n\t\t\t\t\t// Store the bounds for use in the touchmove handler\n\t\t\t\t\tbounds.min = mathMin(axis.pos, absMin - minPixelPadding);\n\t\t\t\t\tbounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);\n\t\t\t\t}\n\t\t\t});\n\t\t\n\t\t// Event type is touchmove, handle panning and pinching\n\t\t} else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first\n\t\t\t\n\n\t\t\t// Set the marker\n\t\t\tif (!selectionMarker) {\n\t\t\t\tself.selectionMarker = selectionMarker = extend({\n\t\t\t\t\tdestroy: noop\n\t\t\t\t}, chart.plotBox);\n\t\t\t}\n\n\t\t\t\n\n\t\t\tif (zoomHor) {\n\t\t\t\tself.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n\t\t\t}\n\t\t\tif (zoomVert) {\n\t\t\t\tself.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n\t\t\t}\n\n\t\t\tself.hasPinched = hasZoom;\n\n\t\t\t// Scale and translate the groups to provide visual feedback during pinching\n\t\t\tself.scaleGroups(transform, clip);\n\t\t\t\n\t\t\t// Optionally move the tooltip on touchmove\n\t\t\tif (!hasZoom && followTouchMove && touchesLength === 1) {\n\t\t\t\tthis.runPointActions(self.normalize(e));\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Start a drag operation\n\t */\n\tdragStart: function (e) {\n\t\tvar chart = this.chart;\n\n\t\t// Record the start position\n\t\tchart.mouseIsDown = e.type;\n\t\tchart.cancelClick = false;\n\t\tchart.mouseDownX = this.mouseDownX = e.chartX;\n\t\tchart.mouseDownY = this.mouseDownY = e.chartY;\n\t},\n\n\t/**\n\t * Perform a drag operation in response to a mousemove event while the mouse is down\n\t */\n\tdrag: function (e) {\n\n\t\tvar chart = this.chart,\n\t\t\tchartOptions = chart.options.chart,\n\t\t\tchartX = e.chartX,\n\t\t\tchartY = e.chartY,\n\t\t\tzoomHor = this.zoomHor,\n\t\t\tzoomVert = this.zoomVert,\n\t\t\tplotLeft = chart.plotLeft,\n\t\t\tplotTop = chart.plotTop,\n\t\t\tplotWidth = chart.plotWidth,\n\t\t\tplotHeight = chart.plotHeight,\n\t\t\tclickedInside,\n\t\t\tsize,\n\t\t\tmouseDownX = this.mouseDownX,\n\t\t\tmouseDownY = this.mouseDownY;\n\n\t\t// If the mouse is outside the plot area, adjust to cooordinates\n\t\t// inside to prevent the selection marker from going outside\n\t\tif (chartX < plotLeft) {\n\t\t\tchartX = plotLeft;\n\t\t} else if (chartX > plotLeft + plotWidth) {\n\t\t\tchartX = plotLeft + plotWidth;\n\t\t}\n\n\t\tif (chartY < plotTop) {\n\t\t\tchartY = plotTop;\n\t\t} else if (chartY > plotTop + plotHeight) {\n\t\t\tchartY = plotTop + plotHeight;\n\t\t}\n\t\t\n\t\t// determine if the mouse has moved more than 10px\n\t\tthis.hasDragged = Math.sqrt(\n\t\t\tMath.pow(mouseDownX - chartX, 2) +\n\t\t\tMath.pow(mouseDownY - chartY, 2)\n\t\t);\n\t\tif (this.hasDragged > 10) {\n\t\t\tclickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);\n\n\t\t\t// make a selection\n\t\t\tif (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside) {\n\t\t\t\tif (!this.selectionMarker) {\n\t\t\t\t\tthis.selectionMarker = chart.renderer.rect(\n\t\t\t\t\t\tplotLeft,\n\t\t\t\t\t\tplotTop,\n\t\t\t\t\t\tzoomHor ? 1 : plotWidth,\n\t\t\t\t\t\tzoomVert ? 1 : plotHeight,\n\t\t\t\t\t\t0\n\t\t\t\t\t)\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tfill: chartOptions.selectionMarkerFill || 'rgba(69,114,167,0.25)',\n\t\t\t\t\t\tzIndex: 7\n\t\t\t\t\t})\n\t\t\t\t\t.add();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// adjust the width of the selection marker\n\t\t\tif (this.selectionMarker && zoomHor) {\n\t\t\t\tsize = chartX - mouseDownX;\n\t\t\t\tthis.selectionMarker.attr({\n\t\t\t\t\twidth: mathAbs(size),\n\t\t\t\t\tx: (size > 0 ? 0 : size) + mouseDownX\n\t\t\t\t});\n\t\t\t}\n\t\t\t// adjust the height of the selection marker\n\t\t\tif (this.selectionMarker && zoomVert) {\n\t\t\t\tsize = chartY - mouseDownY;\n\t\t\t\tthis.selectionMarker.attr({\n\t\t\t\t\theight: mathAbs(size),\n\t\t\t\t\ty: (size > 0 ? 0 : size) + mouseDownY\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// panning\n\t\t\tif (clickedInside && !this.selectionMarker && chartOptions.panning) {\n\t\t\t\tchart.pan(e, chartOptions.panning);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * On mouse up or touch end across the entire document, drop the selection.\n\t */\n\tdrop: function (e) {\n\t\tvar chart = this.chart,\n\t\t\thasPinched = this.hasPinched;\n\n\t\tif (this.selectionMarker) {\n\t\t\tvar selectionData = {\n\t\t\t\t\txAxis: [],\n\t\t\t\t\tyAxis: [],\n\t\t\t\t\toriginalEvent: e.originalEvent || e\n\t\t\t\t},\n\t\t\t\tselectionBox = this.selectionMarker,\n\t\t\t\tselectionLeft = selectionBox.x,\n\t\t\t\tselectionTop = selectionBox.y,\n\t\t\t\trunZoom;\n\t\t\t// a selection has been made\n\t\t\tif (this.hasDragged || hasPinched) {\n\n\t\t\t\t// record each axis' min and max\n\t\t\t\teach(chart.axes, function (axis) {\n\t\t\t\t\tif (axis.zoomEnabled) {\n\t\t\t\t\t\tvar horiz = axis.horiz,\n\t\t\t\t\t\t\tselectionMin = axis.toValue((horiz ? selectionLeft : selectionTop)),\n\t\t\t\t\t\t\tselectionMax = axis.toValue((horiz ? selectionLeft + selectionBox.width : selectionTop + selectionBox.height));\n\n\t\t\t\t\t\tif (!isNaN(selectionMin) && !isNaN(selectionMax)) { // #859\n\t\t\t\t\t\t\tselectionData[axis.xOrY + 'Axis'].push({\n\t\t\t\t\t\t\t\taxis: axis,\n\t\t\t\t\t\t\t\tmin: mathMin(selectionMin, selectionMax), // for reversed axes,\n\t\t\t\t\t\t\t\tmax: mathMax(selectionMin, selectionMax)\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\trunZoom = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (runZoom) {\n\t\t\t\t\tfireEvent(chart, 'selection', selectionData, function (args) { \n\t\t\t\t\t\tchart.zoom(extend(args, hasPinched ? { animation: false } : null)); \n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tthis.selectionMarker = this.selectionMarker.destroy();\n\n\t\t\t// Reset scaling preview\n\t\t\tif (hasPinched) {\n\t\t\t\tthis.scaleGroups();\n\t\t\t}\n\t\t}\n\n\t\t// Reset all\n\t\tif (chart) { // it may be destroyed on mouse up - #877\n\t\t\tcss(chart.container, { cursor: chart._cursor });\n\t\t\tchart.cancelClick = this.hasDragged > 10; // #370\n\t\t\tchart.mouseIsDown = this.hasDragged = this.hasPinched = false;\n\t\t\tthis.pinchDown = [];\n\t\t}\n\t},\n\n\tonContainerMouseDown: function (e) {\n\n\t\te = this.normalize(e);\n\n\t\t// issue #295, dragging not always working in Firefox\n\t\tif (e.preventDefault) {\n\t\t\te.preventDefault();\n\t\t}\n\t\t\n\t\tthis.dragStart(e);\n\t},\n\n\t\n\n\tonDocumentMouseUp: function (e) {\n\t\tthis.drop(e);\n\t},\n\n\t/**\n\t * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.\n\t * Issue #149 workaround. The mouseleave event does not always fire. \n\t */\n\tonDocumentMouseMove: function (e) {\n\t\tvar chart = this.chart,\n\t\t\tchartPosition = this.chartPosition,\n\t\t\thoverSeries = chart.hoverSeries;\n\n\t\te = this.normalize(e, chartPosition);\n\n\t\t// If we're outside, hide the tooltip\n\t\tif (chartPosition && hoverSeries && !this.inClass(e.target, 'highcharts-tracker') &&\n\t\t\t\t!chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\n\t\t\tthis.reset();\n\t\t}\n\t},\n\n\t/**\n\t * When mouse leaves the container, hide the tooltip.\n\t */\n\tonContainerMouseLeave: function () {\n\t\tthis.reset();\n\t\tthis.chartPosition = null; // also reset the chart position, used in #149 fix\n\t},\n\n\t// The mousemove, touchmove and touchstart event handler\n\tonContainerMouseMove: function (e) {\n\n\t\tvar chart = this.chart;\n\n\t\t// normalize\n\t\te = this.normalize(e);\n\n\t\t// #295\n\t\te.returnValue = false;\n\t\t\n\t\t\n\t\tif (chart.mouseIsDown === 'mousedown') {\n\t\t\tthis.drag(e);\n\t\t} \n\t\t\n\t\t// Show the tooltip and run mouse over events (#977)\n\t\tif ((this.inClass(e.target, 'highcharts-tracker') || \n\t\t\t\tchart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {\n\t\t\tthis.runPointActions(e);\n\t\t}\n\t},\n\n\t/**\n\t * Utility to detect whether an element has, or has a parent with, a specific\n\t * class name. Used on detection of tracker objects and on deciding whether\n\t * hovering the tooltip should cause the active series to mouse out.\n\t */\n\tinClass: function (element, className) {\n\t\tvar elemClassName;\n\t\twhile (element) {\n\t\t\telemClassName = attr(element, 'class');\n\t\t\tif (elemClassName) {\n\t\t\t\tif (elemClassName.indexOf(className) !== -1) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else if (elemClassName.indexOf(PREFIX + 'container') !== -1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\telement = element.parentNode;\n\t\t}\t\t\n\t},\n\n\tonTrackerMouseOut: function (e) {\n\t\tvar series = this.chart.hoverSeries;\n\t\tif (series && !series.options.stickyTracking && !this.inClass(e.toElement || e.relatedTarget, PREFIX + 'tooltip')) {\n\t\t\tseries.onMouseOut();\n\t\t}\n\t},\n\n\tonContainerClick: function (e) {\n\t\tvar chart = this.chart,\n\t\t\thoverPoint = chart.hoverPoint, \n\t\t\tplotLeft = chart.plotLeft,\n\t\t\tplotTop = chart.plotTop,\n\t\t\tinverted = chart.inverted,\n\t\t\tchartPosition,\n\t\t\tplotX,\n\t\t\tplotY;\n\t\t\n\t\te = this.normalize(e);\n\t\te.cancelBubble = true; // IE specific\n\n\t\tif (!chart.cancelClick) {\n\t\t\t\n\t\t\t// On tracker click, fire the series and point events. #783, #1583\n\t\t\tif (hoverPoint && this.inClass(e.target, PREFIX + 'tracker')) {\n\t\t\t\tchartPosition = this.chartPosition;\n\t\t\t\tplotX = hoverPoint.plotX;\n\t\t\t\tplotY = hoverPoint.plotY;\n\n\t\t\t\t// add page position info\n\t\t\t\textend(hoverPoint, {\n\t\t\t\t\tpageX: chartPosition.left + plotLeft +\n\t\t\t\t\t\t(inverted ? chart.plotWidth - plotY : plotX),\n\t\t\t\t\tpageY: chartPosition.top + plotTop +\n\t\t\t\t\t\t(inverted ? chart.plotHeight - plotX : plotY)\n\t\t\t\t});\n\t\t\t\n\t\t\t\t// the series click event\n\t\t\t\tfireEvent(hoverPoint.series, 'click', extend(e, {\n\t\t\t\t\tpoint: hoverPoint\n\t\t\t\t}));\n\n\t\t\t\t// the point click event\n\t\t\t\tif (chart.hoverPoint) { // it may be destroyed (#1844)\n\t\t\t\t\thoverPoint.firePointEvent('click', e);\n\t\t\t\t}\n\n\t\t\t// When clicking outside a tracker, fire a chart event\n\t\t\t} else {\n\t\t\t\textend(e, this.getCoordinates(e));\n\n\t\t\t\t// fire a click event in the chart\n\t\t\t\tif (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {\n\t\t\t\t\tfireEvent(chart, 'click', e);\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t}\n\t},\n\n\tonContainerTouchStart: function (e) {\n\t\tvar chart = this.chart;\n\n\t\tif (e.touches.length === 1) {\n\n\t\t\te = this.normalize(e);\n\n\t\t\tif (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\n\n\t\t\t\t// Prevent the click pseudo event from firing unless it is set in the options\n\t\t\t\t/*if (!chart.runChartClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}*/\n\t\t\t\n\t\t\t\t// Run mouse events and display tooltip etc\n\t\t\t\tthis.runPointActions(e);\n\n\t\t\t\tthis.pinch(e);\n\n\t\t\t} else {\n\t\t\t\t// Hide the tooltip on touching outside the plot area (#1203)\n\t\t\t\tthis.reset();\n\t\t\t}\n\n\t\t} else if (e.touches.length === 2) {\n\t\t\tthis.pinch(e);\n\t\t}\t\t\n\t},\n\n\tonContainerTouchMove: function (e) {\n\t\tif (e.touches.length === 1 || e.touches.length === 2) {\n\t\t\tthis.pinch(e);\n\t\t}\n\t},\n\n\tonDocumentTouchEnd: function (e) {\n\t\tthis.drop(e);\n\t},\n\n\t/**\n\t * Set the JS DOM events on the container and document. This method should contain\n\t * a one-to-one assignment between methods and their handlers. Any advanced logic should\n\t * be moved to the handler reflecting the event's name.\n\t */\n\tsetDOMEvents: function () {\n\n\t\tvar pointer = this,\n\t\t\tcontainer = pointer.chart.container,\n\t\t\tevents;\n\n\t\tthis._events = events = [\n\t\t\t[container, 'onmousedown', 'onContainerMouseDown'],\n\t\t\t[container, 'onmousemove', 'onContainerMouseMove'],\n\t\t\t[container, 'onclick', 'onContainerClick'],\n\t\t\t[container, 'mouseleave', 'onContainerMouseLeave'],\n\t\t\t[doc, 'mousemove', 'onDocumentMouseMove'],\n\t\t\t[doc, 'mouseup', 'onDocumentMouseUp']\n\t\t];\n\n\t\tif (hasTouch) {\n\t\t\tevents.push(\n\t\t\t\t[container, 'ontouchstart', 'onContainerTouchStart'],\n\t\t\t\t[container, 'ontouchmove', 'onContainerTouchMove'],\n\t\t\t\t[doc, 'touchend', 'onDocumentTouchEnd']\n\t\t\t);\n\t\t}\n\n\t\teach(events, function (eventConfig) {\n\n\t\t\t// First, create the callback function that in turn calls the method on Pointer\n\t\t\tpointer['_' + eventConfig[2]] = function (e) {\n\t\t\t\tpointer[eventConfig[2]](e);\n\t\t\t};\n\n\t\t\t// Now attach the function, either as a direct property or through addEvent\n\t\t\tif (eventConfig[1].indexOf('on') === 0) {\n\t\t\t\teventConfig[0][eventConfig[1]] = pointer['_' + eventConfig[2]];\n\t\t\t} else {\n\t\t\t\taddEvent(eventConfig[0], eventConfig[1], pointer['_' + eventConfig[2]]);\n\t\t\t}\n\t\t});\n\n\t\t\n\t},\n\n\t/**\n\t * Destroys the Pointer object and disconnects DOM events.\n\t */\n\tdestroy: function () {\n\t\tvar pointer = this;\n\n\t\t// Release all DOM events\n\t\teach(pointer._events, function (eventConfig) {\t\n\t\t\tif (eventConfig[1].indexOf('on') === 0) {\n\t\t\t\teventConfig[0][eventConfig[1]] = null; // delete breaks oldIE\n\t\t\t} else {\t\t\n\t\t\t\tremoveEvent(eventConfig[0], eventConfig[1], pointer['_' + eventConfig[2]]);\n\t\t\t}\n\t\t});\n\t\tdelete pointer._events;\n\n\t\t// memory and CPU leak\n\t\tclearInterval(pointer.tooltipTimeout);\n\t}\n};\n/**\n * The overview of the chart's series\n */\nfunction Legend(chart, options) {\n\tthis.init(chart, options);\n}\n\nLegend.prototype = {\n\t\n\t/**\n\t * Initialize the legend\n\t */\n\tinit: function (chart, options) {\n\t\t\n\t\tvar legend = this,\n\t\t\titemStyle = options.itemStyle,\n\t\t\tpadding = pick(options.padding, 8),\n\t\t\titemMarginTop = options.itemMarginTop || 0;\n\t\n\t\tthis.options = options;\n\n\t\tif (!options.enabled) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tlegend.baseline = pInt(itemStyle.fontSize) + 3 + itemMarginTop; // used in Series prototype\n\t\tlegend.itemStyle = itemStyle;\n\t\tlegend.itemHiddenStyle = merge(itemStyle, options.itemHiddenStyle);\n\t\tlegend.itemMarginTop = itemMarginTop;\n\t\tlegend.padding = padding;\n\t\tlegend.initialItemX = padding;\n\t\tlegend.initialItemY = padding - 5; // 5 is the number of pixels above the text\n\t\tlegend.maxItemWidth = 0;\n\t\tlegend.chart = chart;\n\t\tlegend.itemHeight = 0;\n\t\tlegend.lastLineHeight = 0;\n\n\t\t// Render it\n\t\tlegend.render();\n\n\t\t// move checkboxes\n\t\taddEvent(legend.chart, 'endResize', function () { \n\t\t\tlegend.positionCheckboxes();\n\t\t});\n\n\t},\n\n\t/**\n\t * Set the colors for the legend item\n\t * @param {Object} item A Series or Point instance\n\t * @param {Object} visible Dimmed or colored\n\t */\n\tcolorizeItem: function (item, visible) {\n\t\tvar legend = this,\n\t\t\toptions = legend.options,\n\t\t\tlegendItem = item.legendItem,\n\t\t\tlegendLine = item.legendLine,\n\t\t\tlegendSymbol = item.legendSymbol,\n\t\t\thiddenColor = legend.itemHiddenStyle.color,\n\t\t\ttextColor = visible ? options.itemStyle.color : hiddenColor,\n\t\t\tsymbolColor = visible ? item.color : hiddenColor,\n\t\t\tmarkerOptions = item.options && item.options.marker,\n\t\t\tsymbolAttr = {\n\t\t\t\tstroke: symbolColor,\n\t\t\t\tfill: symbolColor\n\t\t\t},\n\t\t\tkey,\n\t\t\tval;\n\t\t\n\t\tif (legendItem) {\n\t\t\tlegendItem.css({ fill: textColor, color: textColor }); // color for #1553, oldIE\n\t\t}\n\t\tif (legendLine) {\n\t\t\tlegendLine.attr({ stroke: symbolColor });\n\t\t}\n\t\t\n\t\tif (legendSymbol) {\n\t\t\t\n\t\t\t// Apply marker options\n\t\t\tif (markerOptions && legendSymbol.isMarker) { // #585\n\t\t\t\tmarkerOptions = item.convertAttribs(markerOptions);\n\t\t\t\tfor (key in markerOptions) {\n\t\t\t\t\tval = markerOptions[key];\n\t\t\t\t\tif (val !== UNDEFINED) {\n\t\t\t\t\t\tsymbolAttr[key] = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlegendSymbol.attr(symbolAttr);\n\t\t}\n\t},\n\n\t/**\n\t * Position the legend item\n\t * @param {Object} item A Series or Point instance\n\t */\n\tpositionItem: function (item) {\n\t\tvar legend = this,\n\t\t\toptions = legend.options,\n\t\t\tsymbolPadding = options.symbolPadding,\n\t\t\tltr = !options.rtl,\n\t\t\tlegendItemPos = item._legendItemPos,\n\t\t\titemX = legendItemPos[0],\n\t\t\titemY = legendItemPos[1],\n\t\t\tcheckbox = item.checkbox;\n\n\t\tif (item.legendGroup) {\n\t\t\titem.legendGroup.translate(\n\t\t\t\tltr ? itemX : legend.legendWidth - itemX - 2 * symbolPadding - 4,\n\t\t\t\titemY\n\t\t\t);\n\t\t}\n\n\t\tif (checkbox) {\n\t\t\tcheckbox.x = itemX;\n\t\t\tcheckbox.y = itemY;\n\t\t}\n\t},\n\n\t/**\n\t * Destroy a single legend item\n\t * @param {Object} item The series or point\n\t */\n\tdestroyItem: function (item) {\n\t\tvar checkbox = item.checkbox;\n\n\t\t// destroy SVG elements\n\t\teach(['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'], function (key) {\n\t\t\tif (item[key]) {\n\t\t\t\titem[key] = item[key].destroy();\n\t\t\t}\n\t\t});\n\n\t\tif (checkbox) {\n\t\t\tdiscardElement(item.checkbox);\n\t\t}\n\t},\n\n\t/**\n\t * Destroys the legend.\n\t */\n\tdestroy: function () {\n\t\tvar legend = this,\n\t\t\tlegendGroup = legend.group,\n\t\t\tbox = legend.box;\n\n\t\tif (box) {\n\t\t\tlegend.box = box.destroy();\n\t\t}\n\n\t\tif (legendGroup) {\n\t\t\tlegend.group = legendGroup.destroy();\n\t\t}\n\t},\n\n\t/**\n\t * Position the checkboxes after the width is determined\n\t */\n\tpositionCheckboxes: function (scrollOffset) {\n\t\tvar alignAttr = this.group.alignAttr,\n\t\t\ttranslateY,\n\t\t\tclipHeight = this.clipHeight || this.legendHeight;\n\n\t\tif (alignAttr) {\n\t\t\ttranslateY = alignAttr.translateY;\n\t\t\teach(this.allItems, function (item) {\n\t\t\t\tvar checkbox = item.checkbox,\n\t\t\t\t\ttop;\n\t\t\t\t\n\t\t\t\tif (checkbox) {\n\t\t\t\t\ttop = (translateY + checkbox.y + (scrollOffset || 0) + 3);\n\t\t\t\t\tcss(checkbox, {\n\t\t\t\t\t\tleft: (alignAttr.translateX + item.legendItemWidth + checkbox.x - 20) + PX,\n\t\t\t\t\t\ttop: top + PX,\n\t\t\t\t\t\tdisplay: top > translateY - 6 && top < translateY + clipHeight - 6 ? '' : NONE\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\t\n\t/**\n\t * Render the legend title on top of the legend\n\t */\n\trenderTitle: function () {\n\t\tvar options = this.options,\n\t\t\tpadding = this.padding,\n\t\t\ttitleOptions = options.title,\n\t\t\ttitleHeight = 0,\n\t\t\tbBox;\n\t\t\n\t\tif (titleOptions.text) {\n\t\t\tif (!this.title) {\n\t\t\t\tthis.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, null, null, 'legend-title')\n\t\t\t\t\t.attr({ zIndex: 1 })\n\t\t\t\t\t.css(titleOptions.style)\n\t\t\t\t\t.add(this.group);\n\t\t\t}\n\t\t\tbBox = this.title.getBBox();\n\t\t\ttitleHeight = bBox.height;\n\t\t\tthis.offsetWidth = bBox.width; // #1717\n\t\t\tthis.contentGroup.attr({ translateY: titleHeight });\n\t\t}\n\t\tthis.titleHeight = titleHeight;\n\t},\n\n\t/**\n\t * Render a single specific legend item\n\t * @param {Object} item A series or point\n\t */\n\trenderItem: function (item) {\n\t\tvar legend = this,\n\t\t\tchart = legend.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\toptions = legend.options,\n\t\t\thorizontal = options.layout === 'horizontal',\n\t\t\tsymbolWidth = options.symbolWidth,\n\t\t\tsymbolPadding = options.symbolPadding,\n\t\t\titemStyle = legend.itemStyle,\n\t\t\titemHiddenStyle = legend.itemHiddenStyle,\n\t\t\tpadding = legend.padding,\n\t\t\titemDistance = horizontal ? pick(options.itemDistance, 8) : 0,\n\t\t\tltr = !options.rtl,\n\t\t\titemHeight,\n\t\t\twidthOption = options.width,\n\t\t\titemMarginBottom = options.itemMarginBottom || 0,\n\t\t\titemMarginTop = legend.itemMarginTop,\n\t\t\tinitialItemX = legend.initialItemX,\n\t\t\tbBox,\n\t\t\titemWidth,\n\t\t\tli = item.legendItem,\n\t\t\tseries = item.series || item,\n\t\t\titemOptions = series.options,\n\t\t\tshowCheckbox = itemOptions.showCheckbox,\n\t\t\tuseHTML = options.useHTML;\n\n\t\tif (!li) { // generate it once, later move it\n\n\t\t\t// Generate the group box\n\t\t\t// A group to hold the symbol and text. Text is to be appended in Legend class.\n\t\t\titem.legendGroup = renderer.g('legend-item')\n\t\t\t\t.attr({ zIndex: 1 })\n\t\t\t\t.add(legend.scrollGroup);\n\n\t\t\t// Draw the legend symbol inside the group box\n\t\t\tseries.drawLegendSymbol(legend, item);\n\n\t\t\t// Generate the list item text and add it to the group\n\t\t\titem.legendItem = li = renderer.text(\n\t\t\t\t\toptions.labelFormat ? format(options.labelFormat, item) : options.labelFormatter.call(item),\n\t\t\t\t\tltr ? symbolWidth + symbolPadding : -symbolPadding,\n\t\t\t\t\tlegend.baseline,\n\t\t\t\t\tuseHTML\n\t\t\t\t)\n\t\t\t\t.css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)\n\t\t\t\t.attr({\n\t\t\t\t\talign: ltr ? 'left' : 'right',\n\t\t\t\t\tzIndex: 2\n\t\t\t\t})\n\t\t\t\t.add(item.legendGroup);\n\n\t\t\t// Set the events on the item group, or in case of useHTML, the item itself (#1249)\n\t\t\t(useHTML ? li : item.legendGroup).on('mouseover', function () {\n\t\t\t\t\titem.setState(HOVER_STATE);\n\t\t\t\t\tli.css(legend.options.itemHoverStyle);\n\t\t\t\t})\n\t\t\t\t.on('mouseout', function () {\n\t\t\t\t\tli.css(item.visible ? itemStyle : itemHiddenStyle);\n\t\t\t\t\titem.setState();\n\t\t\t\t})\n\t\t\t\t.on('click', function (event) {\n\t\t\t\t\tvar strLegendItemClick = 'legendItemClick',\n\t\t\t\t\t\tfnLegendItemClick = function () {\n\t\t\t\t\t\t\titem.setVisible();\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t// Pass over the click/touch event. #4.\n\t\t\t\t\tevent = {\n\t\t\t\t\t\tbrowserEvent: event\n\t\t\t\t\t};\n\n\t\t\t\t\t// click the name or symbol\n\t\t\t\t\tif (item.firePointEvent) { // point\n\t\t\t\t\t\titem.firePointEvent(strLegendItemClick, event, fnLegendItemClick);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfireEvent(item, strLegendItemClick, event, fnLegendItemClick);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t// Colorize the items\n\t\t\tlegend.colorizeItem(item, item.visible);\n\n\t\t\t// add the HTML checkbox on top\n\t\t\tif (itemOptions && showCheckbox) {\n\t\t\t\titem.checkbox = createElement('input', {\n\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\tchecked: item.selected,\n\t\t\t\t\tdefaultChecked: item.selected // required by IE7\n\t\t\t\t}, options.itemCheckboxStyle, chart.container);\n\n\t\t\t\taddEvent(item.checkbox, 'click', function (event) {\n\t\t\t\t\tvar target = event.target;\n\t\t\t\t\tfireEvent(item, 'checkboxClick', {\n\t\t\t\t\t\t\tchecked: target.checked\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\titem.select();\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// calculate the positions for the next line\n\t\tbBox = li.getBBox();\n\n\t\titemWidth = item.legendItemWidth =\n\t\t\toptions.itemWidth || symbolWidth + symbolPadding + bBox.width + itemDistance +\n\t\t\t(showCheckbox ? 20 : 0);\n\t\tlegend.itemHeight = itemHeight = bBox.height;\n\n\t\t// if the item exceeds the width, start a new line\n\t\tif (horizontal && legend.itemX - initialItemX + itemWidth >\n\t\t\t\t(widthOption || (chart.chartWidth - 2 * padding - initialItemX))) {\n\t\t\tlegend.itemX = initialItemX;\n\t\t\tlegend.itemY += itemMarginTop + legend.lastLineHeight + itemMarginBottom;\n\t\t\tlegend.lastLineHeight = 0; // reset for next line\n\t\t}\n\n\t\t// If the item exceeds the height, start a new column\n\t\t/*if (!horizontal && legend.itemY + options.y + itemHeight > chart.chartHeight - spacingTop - spacingBottom) {\n\t\t\tlegend.itemY = legend.initialItemY;\n\t\t\tlegend.itemX += legend.maxItemWidth;\n\t\t\tlegend.maxItemWidth = 0;\n\t\t}*/\n\n\t\t// Set the edge positions\n\t\tlegend.maxItemWidth = mathMax(legend.maxItemWidth, itemWidth);\n\t\tlegend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;\n\t\tlegend.lastLineHeight = mathMax(itemHeight, legend.lastLineHeight); // #915\n\n\t\t// cache the position of the newly generated or reordered items\n\t\titem._legendItemPos = [legend.itemX, legend.itemY];\n\n\t\t// advance\n\t\tif (horizontal) {\n\t\t\tlegend.itemX += itemWidth;\n\n\t\t} else {\n\t\t\tlegend.itemY += itemMarginTop + itemHeight + itemMarginBottom;\n\t\t\tlegend.lastLineHeight = itemHeight;\n\t\t}\n\n\t\t// the width of the widest item\n\t\tlegend.offsetWidth = widthOption || mathMax(\n\t\t\t(horizontal ? legend.itemX - initialItemX - itemDistance : itemWidth) + padding,\n\t\t\tlegend.offsetWidth\n\t\t);\n\t},\n\n\t/**\n\t * Render the legend. This method can be called both before and after\n\t * chart.render. If called after, it will only rearrange items instead\n\t * of creating new ones.\n\t */\n\trender: function () {\n\t\tvar legend = this,\n\t\t\tchart = legend.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\tlegendGroup = legend.group,\n\t\t\tallItems,\n\t\t\tdisplay,\n\t\t\tlegendWidth,\n\t\t\tlegendHeight,\n\t\t\tbox = legend.box,\n\t\t\toptions = legend.options,\n\t\t\tpadding = legend.padding,\n\t\t\tlegendBorderWidth = options.borderWidth,\n\t\t\tlegendBackgroundColor = options.backgroundColor;\n\n\t\tlegend.itemX = legend.initialItemX;\n\t\tlegend.itemY = legend.initialItemY;\n\t\tlegend.offsetWidth = 0;\n\t\tlegend.lastItemY = 0;\n\n\t\tif (!legendGroup) {\n\t\t\tlegend.group = legendGroup = renderer.g('legend')\n\t\t\t\t.attr({ zIndex: 7 }) \n\t\t\t\t.add();\n\t\t\tlegend.contentGroup = renderer.g()\n\t\t\t\t.attr({ zIndex: 1 }) // above background\n\t\t\t\t.add(legendGroup);\n\t\t\tlegend.scrollGroup = renderer.g()\n\t\t\t\t.add(legend.contentGroup);\n\t\t}\n\t\t\n\t\tlegend.renderTitle();\n\n\t\t// add each series or point\n\t\tallItems = [];\n\t\teach(chart.series, function (serie) {\n\t\t\tvar seriesOptions = serie.options;\n\n\t\t\tif (!seriesOptions.showInLegend || defined(seriesOptions.linkedTo)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// use points or series for the legend item depending on legendType\n\t\t\tallItems = allItems.concat(\n\t\t\t\t\tserie.legendItems ||\n\t\t\t\t\t(seriesOptions.legendType === 'point' ?\n\t\t\t\t\t\t\tserie.data :\n\t\t\t\t\t\t\tserie)\n\t\t\t);\n\t\t});\n\n\t\t// sort by legendIndex\n\t\tstableSort(allItems, function (a, b) {\n\t\t\treturn ((a.options && a.options.legendIndex) || 0) - ((b.options && b.options.legendIndex) || 0);\n\t\t});\n\n\t\t// reversed legend\n\t\tif (options.reversed) {\n\t\t\tallItems.reverse();\n\t\t}\n\n\t\tlegend.allItems = allItems;\n\t\tlegend.display = display = !!allItems.length;\n\n\t\t// render the items\n\t\teach(allItems, function (item) {\n\t\t\tlegend.renderItem(item); \n\t\t});\n\n\t\t// Draw the border\n\t\tlegendWidth = options.width || legend.offsetWidth;\n\t\tlegendHeight = legend.lastItemY + legend.lastLineHeight + legend.titleHeight;\n\t\t\n\t\t\n\t\tlegendHeight = legend.handleOverflow(legendHeight);\n\n\t\tif (legendBorderWidth || legendBackgroundColor) {\n\t\t\tlegendWidth += padding;\n\t\t\tlegendHeight += padding;\n\n\t\t\tif (!box) {\n\t\t\t\tlegend.box = box = renderer.rect(\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\tlegendWidth,\n\t\t\t\t\tlegendHeight,\n\t\t\t\t\toptions.borderRadius,\n\t\t\t\t\tlegendBorderWidth || 0\n\t\t\t\t).attr({\n\t\t\t\t\tstroke: options.borderColor,\n\t\t\t\t\t'stroke-width': legendBorderWidth || 0,\n\t\t\t\t\tfill: legendBackgroundColor || NONE\n\t\t\t\t})\n\t\t\t\t.add(legendGroup)\n\t\t\t\t.shadow(options.shadow);\n\t\t\t\tbox.isNew = true;\n\n\t\t\t} else if (legendWidth > 0 && legendHeight > 0) {\n\t\t\t\tbox[box.isNew ? 'attr' : 'animate'](\n\t\t\t\t\tbox.crisp(null, null, null, legendWidth, legendHeight)\n\t\t\t\t);\n\t\t\t\tbox.isNew = false;\n\t\t\t}\n\n\t\t\t// hide the border if no items\n\t\t\tbox[display ? 'show' : 'hide']();\n\t\t}\n\t\t\n\t\tlegend.legendWidth = legendWidth;\n\t\tlegend.legendHeight = legendHeight;\n\n\t\t// Now that the legend width and height are established, put the items in the \n\t\t// final position\n\t\teach(allItems, function (item) {\n\t\t\tlegend.positionItem(item);\n\t\t});\n\n\t\t// 1.x compatibility: positioning based on style\n\t\t/*var props = ['left', 'right', 'top', 'bottom'],\n\t\t\tprop,\n\t\t\ti = 4;\n\t\twhile (i--) {\n\t\t\tprop = props[i];\n\t\t\tif (options.style[prop] && options.style[prop] !== 'auto') {\n\t\t\t\toptions[i < 2 ? 'align' : 'verticalAlign'] = prop;\n\t\t\t\toptions[i < 2 ? 'x' : 'y'] = pInt(options.style[prop]) * (i % 2 ? -1 : 1);\n\t\t\t}\n\t\t}*/\n\n\t\tif (display) {\n\t\t\tlegendGroup.align(extend({\n\t\t\t\twidth: legendWidth,\n\t\t\t\theight: legendHeight\n\t\t\t}, options), true, 'spacingBox');\n\t\t}\n\n\t\tif (!chart.isResizing) {\n\t\t\tthis.positionCheckboxes();\n\t\t}\n\t},\n\t\n\t/**\n\t * Set up the overflow handling by adding navigation with up and down arrows below the\n\t * legend.\n\t */\n\thandleOverflow: function (legendHeight) {\n\t\tvar legend = this,\n\t\t\tchart = this.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\tpageCount,\n\t\t\toptions = this.options,\n\t\t\toptionsY = options.y,\n\t\t\talignTop = options.verticalAlign === 'top',\n\t\t\tspaceHeight = chart.spacingBox.height + (alignTop ? -optionsY : optionsY) - this.padding,\n\t\t\tmaxHeight = options.maxHeight,\n\t\t\tclipHeight,\n\t\t\tclipRect = this.clipRect,\n\t\t\tnavOptions = options.navigation,\n\t\t\tanimation = pick(navOptions.animation, true),\n\t\t\tarrowSize = navOptions.arrowSize || 12,\n\t\t\tnav = this.nav;\n\t\t\t\n\t\t// Adjust the height\n\t\tif (options.layout === 'horizontal') {\n\t\t\tspaceHeight /= 2;\n\t\t}\n\t\tif (maxHeight) {\n\t\t\tspaceHeight = mathMin(spaceHeight, maxHeight);\n\t\t}\n\t\t\n\t\t// Reset the legend height and adjust the clipping rectangle\n\t\tif (legendHeight > spaceHeight && !options.useHTML) {\n\n\t\t\tthis.clipHeight = clipHeight = spaceHeight - 20 - this.titleHeight;\n\t\t\tthis.pageCount = pageCount = mathCeil(legendHeight / clipHeight);\n\t\t\tthis.currentPage = pick(this.currentPage, 1);\n\t\t\tthis.fullHeight = legendHeight;\n\t\t\t\n\t\t\t// Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)\n\t\t\tif (!clipRect) {\n\t\t\t\tclipRect = legend.clipRect = renderer.clipRect(0, 0, 9999, 0);\n\t\t\t\tlegend.contentGroup.clip(clipRect);\n\t\t\t}\n\t\t\tclipRect.attr({\n\t\t\t\theight: clipHeight\n\t\t\t});\n\t\t\t\n\t\t\t// Add navigation elements\n\t\t\tif (!nav) {\n\t\t\t\tthis.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);\n\t\t\t\tthis.up = renderer.symbol('triangle', 0, 0, arrowSize, arrowSize)\n\t\t\t\t\t.on('click', function () {\n\t\t\t\t\t\tlegend.scroll(-1, animation);\n\t\t\t\t\t})\n\t\t\t\t\t.add(nav);\n\t\t\t\tthis.pager = renderer.text('', 15, 10)\n\t\t\t\t\t.css(navOptions.style)\n\t\t\t\t\t.add(nav);\n\t\t\t\tthis.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)\n\t\t\t\t\t.on('click', function () {\n\t\t\t\t\t\tlegend.scroll(1, animation);\n\t\t\t\t\t})\n\t\t\t\t\t.add(nav);\n\t\t\t}\n\t\t\t\n\t\t\t// Set initial position\n\t\t\tlegend.scroll(0);\n\t\t\t\n\t\t\tlegendHeight = spaceHeight;\n\t\t\t\n\t\t} else if (nav) {\n\t\t\tclipRect.attr({\n\t\t\t\theight: chart.chartHeight\n\t\t\t});\n\t\t\tnav.hide();\n\t\t\tthis.scrollGroup.attr({\n\t\t\t\ttranslateY: 1\n\t\t\t});\n\t\t\tthis.clipHeight = 0; // #1379\n\t\t}\n\t\t\n\t\treturn legendHeight;\n\t},\n\t\n\t/**\n\t * Scroll the legend by a number of pages\n\t * @param {Object} scrollBy\n\t * @param {Object} animation\n\t */\n\tscroll: function (scrollBy, animation) {\n\t\tvar pageCount = this.pageCount,\n\t\t\tcurrentPage = this.currentPage + scrollBy,\n\t\t\tclipHeight = this.clipHeight,\n\t\t\tnavOptions = this.options.navigation,\n\t\t\tactiveColor = navOptions.activeColor,\n\t\t\tinactiveColor = navOptions.inactiveColor,\n\t\t\tpager = this.pager,\n\t\t\tpadding = this.padding,\n\t\t\tscrollOffset;\n\t\t\n\t\t// When resizing while looking at the last page\n\t\tif (currentPage > pageCount) {\n\t\t\tcurrentPage = pageCount;\n\t\t}\n\t\t\n\t\tif (currentPage > 0) {\n\t\t\t\n\t\t\tif (animation !== UNDEFINED) {\n\t\t\t\tsetAnimation(animation, this.chart);\n\t\t\t}\n\t\t\t\n\t\t\tthis.nav.attr({\n\t\t\t\ttranslateX: padding,\n\t\t\t\ttranslateY: clipHeight + 7 + this.titleHeight,\n\t\t\t\tvisibility: VISIBLE\n\t\t\t});\n\t\t\tthis.up.attr({\n\t\t\t\t\tfill: currentPage === 1 ? inactiveColor : activeColor\n\t\t\t\t})\n\t\t\t\t.css({\n\t\t\t\t\tcursor: currentPage === 1 ? 'default' : 'pointer'\n\t\t\t\t});\n\t\t\tpager.attr({\n\t\t\t\ttext: currentPage + '/' + this.pageCount\n\t\t\t});\n\t\t\tthis.down.attr({\n\t\t\t\t\tx: 18 + this.pager.getBBox().width, // adjust to text width\n\t\t\t\t\tfill: currentPage === pageCount ? inactiveColor : activeColor\n\t\t\t\t})\n\t\t\t\t.css({\n\t\t\t\t\tcursor: currentPage === pageCount ? 'default' : 'pointer'\n\t\t\t\t});\n\t\t\t\n\t\t\tscrollOffset = -mathMin(clipHeight * (currentPage - 1), this.fullHeight - clipHeight + padding) + 1;\n\t\t\tthis.scrollGroup.animate({\n\t\t\t\ttranslateY: scrollOffset\n\t\t\t});\n\t\t\tpager.attr({\n\t\t\t\ttext: currentPage + '/' + pageCount\n\t\t\t});\n\t\t\t\n\t\t\t\n\t\t\tthis.currentPage = currentPage;\n\t\t\tthis.positionCheckboxes(scrollOffset);\n\t\t}\n\t\t\t\n\t}\n\t\n};\n\n// Workaround for #2030, horizontal legend items not displaying in IE11 Preview.\n// TODO: When IE11 is released, check again for this bug, and remove the fix\n// or make a better one.\nif (/Trident.*?11\\.0/.test(userAgent)) {\n\twrap(Legend.prototype, 'positionItem', function (proceed, item) {\n\t\tvar legend = this;\n\t\tsetTimeout(function () {\n\t\t\tproceed.call(legend, item);\n\t\t});\n\t});\n}\n\n/**\n * The chart class\n * @param {Object} options\n * @param {Function} callback Function to run when the chart has loaded\n */\nfunction Chart() {\n\tthis.init.apply(this, arguments);\n}\n\nChart.prototype = {\n\n\t/**\n\t * Initialize the chart\n\t */\n\tinit: function (userOptions, callback) {\n\n\t\t// Handle regular options\n\t\tvar options,\n\t\t\tseriesOptions = userOptions.series; // skip merging data points to increase performance\n\n\t\tuserOptions.series = null;\n\t\toptions = merge(defaultOptions, userOptions); // do the merge\n\t\toptions.series = userOptions.series = seriesOptions; // set back the series data\n\n\t\tvar optionsChart = options.chart;\n\t\t\n\t\t// Create margin & spacing array\n\t\tthis.margin = this.splashArray('margin', optionsChart);\n\t\tthis.spacing = this.splashArray('spacing', optionsChart);\n\n\t\tvar chartEvents = optionsChart.events;\n\n\t\t//this.runChartClick = chartEvents && !!chartEvents.click;\n\t\tthis.bounds = { h: {}, v: {} }; // Pixel data bounds for touch zoom\n\n\t\tthis.callback = callback;\n\t\tthis.isResizing = 0;\n\t\tthis.options = options;\n\t\t//chartTitleOptions = UNDEFINED;\n\t\t//chartSubtitleOptions = UNDEFINED;\n\n\t\tthis.axes = [];\n\t\tthis.series = [];\n\t\tthis.hasCartesianSeries = optionsChart.showAxes;\n\t\t//this.axisOffset = UNDEFINED;\n\t\t//this.maxTicks = UNDEFINED; // handle the greatest amount of ticks on grouped axes\n\t\t//this.inverted = UNDEFINED;\n\t\t//this.loadingShown = UNDEFINED;\n\t\t//this.container = UNDEFINED;\n\t\t//this.chartWidth = UNDEFINED;\n\t\t//this.chartHeight = UNDEFINED;\n\t\t//this.marginRight = UNDEFINED;\n\t\t//this.marginBottom = UNDEFINED;\n\t\t//this.containerWidth = UNDEFINED;\n\t\t//this.containerHeight = UNDEFINED;\n\t\t//this.oldChartWidth = UNDEFINED;\n\t\t//this.oldChartHeight = UNDEFINED;\n\n\t\t//this.renderTo = UNDEFINED;\n\t\t//this.renderToClone = UNDEFINED;\n\n\t\t//this.spacingBox = UNDEFINED\n\n\t\t//this.legend = UNDEFINED;\n\n\t\t// Elements\n\t\t//this.chartBackground = UNDEFINED;\n\t\t//this.plotBackground = UNDEFINED;\n\t\t//this.plotBGImage = UNDEFINED;\n\t\t//this.plotBorder = UNDEFINED;\n\t\t//this.loadingDiv = UNDEFINED;\n\t\t//this.loadingSpan = UNDEFINED;\n\n\t\tvar chart = this,\n\t\t\teventType;\n\n\t\t// Add the chart to the global lookup\n\t\tchart.index = charts.length;\n\t\tcharts.push(chart);\n\n\t\t// Set up auto resize\n\t\tif (optionsChart.reflow !== false) {\n\t\t\taddEvent(chart, 'load', function () {\n\t\t\t\tchart.initReflow();\n\t\t\t});\n\t\t}\n\n\t\t// Chart event handlers\n\t\tif (chartEvents) {\n\t\t\tfor (eventType in chartEvents) {\n\t\t\t\taddEvent(chart, eventType, chartEvents[eventType]);\n\t\t\t}\n\t\t}\n\n\t\tchart.xAxis = [];\n\t\tchart.yAxis = [];\n\n\t\t// Expose methods and variables\n\t\tchart.animation = useCanVG ? false : pick(optionsChart.animation, true);\n\t\tchart.pointCount = 0;\n\t\tchart.counters = new ChartCounters();\n\n\t\tchart.firstRender();\n\t},\n\n\t/**\n\t * Initialize an individual series, called internally before render time\n\t */\n\tinitSeries: function (options) {\n\t\tvar chart = this,\n\t\t\toptionsChart = chart.options.chart,\n\t\t\ttype = options.type || optionsChart.type || optionsChart.defaultSeriesType,\n\t\t\tseries,\n\t\t\tconstr = seriesTypes[type];\n\n\t\t// No such series type\n\t\tif (!constr) {\n\t\t\terror(17, true);\n\t\t}\n\n\t\tseries = new constr();\n\t\tseries.init(this, options);\n\t\treturn series;\n\t},\n\n\t/**\n\t * Add a series dynamically after  time\n\t *\n\t * @param {Object} options The config options\n\t * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true.\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n\t *    configuration\n\t *\n\t * @return {Object} series The newly created series object\n\t */\n\taddSeries: function (options, redraw, animation) {\n\t\tvar series,\n\t\t\tchart = this;\n\n\t\tif (options) {\n\t\t\tredraw = pick(redraw, true); // defaults to true\n\n\t\t\tfireEvent(chart, 'addSeries', { options: options }, function () {\n\t\t\t\tseries = chart.initSeries(options);\n\t\t\t\t\n\t\t\t\tchart.isDirtyLegend = true; // the series array is out of sync with the display\n\t\t\t\tchart.linkSeries();\n\t\t\t\tif (redraw) {\n\t\t\t\t\tchart.redraw(animation);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn series;\n\t},\n\n\t/**\n     * Add an axis to the chart\n     * @param {Object} options The axis option\n     * @param {Boolean} isX Whether it is an X axis or a value axis\n     */\n\taddAxis: function (options, isX, redraw, animation) {\n\t\tvar key = isX ? 'xAxis' : 'yAxis',\n\t\t\tchartOptions = this.options,\n\t\t\taxis;\n\n\t\t/*jslint unused: false*/\n\t\taxis = new Axis(this, merge(options, {\n\t\t\tindex: this[key].length,\n\t\t\tisX: isX\n\t\t}));\n\t\t/*jslint unused: true*/\n\n\t\t// Push the new axis options to the chart options\n\t\tchartOptions[key] = splat(chartOptions[key] || {});\n\t\tchartOptions[key].push(options);\n\n\t\tif (pick(redraw, true)) {\n\t\t\tthis.redraw(animation);\n\t\t}\n\t},\n\n\t/**\n\t * Check whether a given point is within the plot area\n\t *\n\t * @param {Number} plotX Pixel x relative to the plot area\n\t * @param {Number} plotY Pixel y relative to the plot area\n\t * @param {Boolean} inverted Whether the chart is inverted\n\t */\n\tisInsidePlot: function (plotX, plotY, inverted) {\n\t\tvar x = inverted ? plotY : plotX,\n\t\t\ty = inverted ? plotX : plotY;\n\t\t\t\n\t\treturn x >= 0 &&\n\t\t\tx <= this.plotWidth &&\n\t\t\ty >= 0 &&\n\t\t\ty <= this.plotHeight;\n\t},\n\n\t/**\n\t * Adjust all axes tick amounts\n\t */\n\tadjustTickAmounts: function () {\n\t\tif (this.options.chart.alignTicks !== false) {\n\t\t\teach(this.axes, function (axis) {\n\t\t\t\taxis.adjustTickAmount();\n\t\t\t});\n\t\t}\n\t\tthis.maxTicks = null;\n\t},\n\n\t/**\n\t * Redraw legend, axes or series based on updated data\n\t *\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n\t *    configuration\n\t */\n\tredraw: function (animation) {\n\t\tvar chart = this,\n\t\t\taxes = chart.axes,\n\t\t\tseries = chart.series,\n\t\t\tpointer = chart.pointer,\n\t\t\tlegend = chart.legend,\n\t\t\tredrawLegend = chart.isDirtyLegend,\n\t\t\thasStackedSeries,\n\t\t\thasDirtyStacks,\n\t\t\tisDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed?\n\t\t\tseriesLength = series.length,\n\t\t\ti = seriesLength,\n\t\t\tserie,\n\t\t\trenderer = chart.renderer,\n\t\t\tisHiddenChart = renderer.isHidden(),\n\t\t\tafterRedraw = [];\n\t\t\t\n\t\tsetAnimation(animation, chart);\n\t\t\n\t\tif (isHiddenChart) {\n\t\t\tchart.cloneRenderTo();\n\t\t}\n\n\t\t// Adjust title layout (reflow multiline text)\n\t\tchart.layOutTitles();\n\n\t\t// link stacked series\n\t\twhile (i--) {\n\t\t\tserie = series[i];\n\n\t\t\tif (serie.options.stacking) {\n\t\t\t\thasStackedSeries = true;\n\t\t\t\t\n\t\t\t\tif (serie.isDirty) {\n\t\t\t\t\thasDirtyStacks = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (hasDirtyStacks) { // mark others as dirty\n\t\t\ti = seriesLength;\n\t\t\twhile (i--) {\n\t\t\t\tserie = series[i];\n\t\t\t\tif (serie.options.stacking) {\n\t\t\t\t\tserie.isDirty = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// handle updated data in the series\n\t\teach(series, function (serie) {\n\t\t\tif (serie.isDirty) { // prepare the data so axis can read it\n\t\t\t\tif (serie.options.legendType === 'point') {\n\t\t\t\t\tredrawLegend = true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// handle added or removed series\n\t\tif (redrawLegend && legend.options.enabled) { // series or pie points are added or removed\n\t\t\t// draw legend graphics\n\t\t\tlegend.render();\n\n\t\t\tchart.isDirtyLegend = false;\n\t\t}\n\n\t\t// reset stacks\n\t\tif (hasStackedSeries) {\n\t\t\tchart.getStacks();\n\t\t}\n\n\n\t\tif (chart.hasCartesianSeries) {\n\t\t\tif (!chart.isResizing) {\n\n\t\t\t\t// reset maxTicks\n\t\t\t\tchart.maxTicks = null;\n\n\t\t\t\t// set axes scales\n\t\t\t\teach(axes, function (axis) {\n\t\t\t\t\taxis.setScale();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tchart.adjustTickAmounts();\n\t\t\tchart.getMargins();\n\n\t\t\t// If one axis is dirty, all axes must be redrawn (#792, #2169)\n\t\t\teach(axes, function (axis) {\n\t\t\t\tif (axis.isDirty) {\n\t\t\t\t\tisDirtyBox = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// redraw axes\n\t\t\teach(axes, function (axis) {\n\t\t\t\t\n\t\t\t\t// Fire 'afterSetExtremes' only if extremes are set\n\t\t\t\tif (axis.isDirtyExtremes) { // #821\n\t\t\t\t\taxis.isDirtyExtremes = false;\n\t\t\t\t\tafterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)\n\t\t\t\t\t\tfireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n\t\t\t\t\t\tdelete axis.eventArgs;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (isDirtyBox || hasStackedSeries) {\n\t\t\t\t\taxis.redraw();\n\t\t\t\t}\n\t\t\t});\n\n\n\t\t}\n\t\t// the plot areas size has changed\n\t\tif (isDirtyBox) {\n\t\t\tchart.drawChartBox();\n\t\t}\n\n\n\t\t// redraw affected series\n\t\teach(series, function (serie) {\n\t\t\tif (serie.isDirty && serie.visible &&\n\t\t\t\t\t(!serie.isCartesian || serie.xAxis)) { // issue #153\n\t\t\t\tserie.redraw();\n\t\t\t}\n\t\t});\n\n\t\t// move tooltip or reset\n\t\tif (pointer && pointer.reset) {\n\t\t\tpointer.reset(true);\n\t\t}\n\n\t\t// redraw if canvas\n\t\trenderer.draw();\n\n\t\t// fire the event\n\t\tfireEvent(chart, 'redraw'); // jQuery breaks this when calling it from addEvent. Overwrites chart.redraw\n\t\t\n\t\tif (isHiddenChart) {\n\t\t\tchart.cloneRenderTo(true);\n\t\t}\n\t\t\n\t\t// Fire callbacks that are put on hold until after the redraw\n\t\teach(afterRedraw, function (callback) {\n\t\t\tcallback.call();\n\t\t});\n\t},\n\n\n\n\t/**\n\t * Dim the chart and show a loading text or symbol\n\t * @param {String} str An optional text to show in the loading label instead of the default one\n\t */\n\tshowLoading: function (str) {\n\t\tvar chart = this,\n\t\t\toptions = chart.options,\n\t\t\tloadingDiv = chart.loadingDiv;\n\n\t\tvar loadingOptions = options.loading;\n\n\t\t// create the layer at the first call\n\t\tif (!loadingDiv) {\n\t\t\tchart.loadingDiv = loadingDiv = createElement(DIV, {\n\t\t\t\tclassName: PREFIX + 'loading'\n\t\t\t}, extend(loadingOptions.style, {\n\t\t\t\tzIndex: 10,\n\t\t\t\tdisplay: NONE\n\t\t\t}), chart.container);\n\n\t\t\tchart.loadingSpan = createElement(\n\t\t\t\t'span',\n\t\t\t\tnull,\n\t\t\t\tloadingOptions.labelStyle,\n\t\t\t\tloadingDiv\n\t\t\t);\n\n\t\t}\n\n\t\t// update text\n\t\tchart.loadingSpan.innerHTML = str || options.lang.loading;\n\n\t\t// show it\n\t\tif (!chart.loadingShown) {\n\t\t\tcss(loadingDiv, { \n\t\t\t\topacity: 0, \n\t\t\t\tdisplay: '',\n\t\t\t\tleft: chart.plotLeft + PX,\n\t\t\t\ttop: chart.plotTop + PX,\n\t\t\t\twidth: chart.plotWidth + PX,\n\t\t\t\theight: chart.plotHeight + PX\n\t\t\t});\n\t\t\tanimate(loadingDiv, {\n\t\t\t\topacity: loadingOptions.style.opacity\n\t\t\t}, {\n\t\t\t\tduration: loadingOptions.showDuration || 0\n\t\t\t});\n\t\t\tchart.loadingShown = true;\n\t\t}\n\t},\n\n\t/**\n\t * Hide the loading layer\n\t */\n\thideLoading: function () {\n\t\tvar options = this.options,\n\t\t\tloadingDiv = this.loadingDiv;\n\n\t\tif (loadingDiv) {\n\t\t\tanimate(loadingDiv, {\n\t\t\t\topacity: 0\n\t\t\t}, {\n\t\t\t\tduration: options.loading.hideDuration || 100,\n\t\t\t\tcomplete: function () {\n\t\t\t\t\tcss(loadingDiv, { display: NONE });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tthis.loadingShown = false;\n\t},\n\n\t/**\n\t * Get an axis, series or point object by id.\n\t * @param id {String} The id as given in the configuration options\n\t */\n\tget: function (id) {\n\t\tvar chart = this,\n\t\t\taxes = chart.axes,\n\t\t\tseries = chart.series;\n\n\t\tvar i,\n\t\t\tj,\n\t\t\tpoints;\n\n\t\t// search axes\n\t\tfor (i = 0; i < axes.length; i++) {\n\t\t\tif (axes[i].options.id === id) {\n\t\t\t\treturn axes[i];\n\t\t\t}\n\t\t}\n\n\t\t// search series\n\t\tfor (i = 0; i < series.length; i++) {\n\t\t\tif (series[i].options.id === id) {\n\t\t\t\treturn series[i];\n\t\t\t}\n\t\t}\n\n\t\t// search points\n\t\tfor (i = 0; i < series.length; i++) {\n\t\t\tpoints = series[i].points || [];\n\t\t\tfor (j = 0; j < points.length; j++) {\n\t\t\t\tif (points[j].id === id) {\n\t\t\t\t\treturn points[j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t},\n\n\t/**\n\t * Create the Axis instances based on the config options\n\t */\n\tgetAxes: function () {\n\t\tvar chart = this,\n\t\t\toptions = this.options,\n\t\t\txAxisOptions = options.xAxis = splat(options.xAxis || {}),\n\t\t\tyAxisOptions = options.yAxis = splat(options.yAxis || {}),\n\t\t\toptionsArray,\n\t\t\taxis;\n\n\t\t// make sure the options are arrays and add some members\n\t\teach(xAxisOptions, function (axis, i) {\n\t\t\taxis.index = i;\n\t\t\taxis.isX = true;\n\t\t});\n\n\t\teach(yAxisOptions, function (axis, i) {\n\t\t\taxis.index = i;\n\t\t});\n\n\t\t// concatenate all axis options into one array\n\t\toptionsArray = xAxisOptions.concat(yAxisOptions);\n\n\t\teach(optionsArray, function (axisOptions) {\n\t\t\taxis = new Axis(chart, axisOptions);\n\t\t});\n\n\t\tchart.adjustTickAmounts();\n\t},\n\n\n\t/**\n\t * Get the currently selected points from all series\n\t */\n\tgetSelectedPoints: function () {\n\t\tvar points = [];\n\t\teach(this.series, function (serie) {\n\t\t\tpoints = points.concat(grep(serie.points || [], function (point) {\n\t\t\t\treturn point.selected;\n\t\t\t}));\n\t\t});\n\t\treturn points;\n\t},\n\n\t/**\n\t * Get the currently selected series\n\t */\n\tgetSelectedSeries: function () {\n\t\treturn grep(this.series, function (serie) {\n\t\t\treturn serie.selected;\n\t\t});\n\t},\n\n\t/**\n\t * Generate stacks for each series and calculate stacks total values\n\t */\n\tgetStacks: function () {\n\t\tvar chart = this;\n\n\t\t// reset stacks for each yAxis\n\t\teach(chart.yAxis, function (axis) {\n\t\t\tif (axis.stacks && axis.hasVisibleSeries) {\n\t\t\t\taxis.oldStacks = axis.stacks;\n\t\t\t}\n\t\t});\n\n\t\teach(chart.series, function (series) {\n\t\t\tif (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {\n\t\t\t\tseries.stackKey = series.type + pick(series.options.stack, '');\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Display the zoom button\n\t */\n\tshowResetZoom: function () {\n\t\tvar chart = this,\n\t\t\tlang = defaultOptions.lang,\n\t\t\tbtnOptions = chart.options.chart.resetZoomButton,\n\t\t\ttheme = btnOptions.theme,\n\t\t\tstates = theme.states,\n\t\t\talignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';\n\t\t\t\n\t\tthis.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, function () { chart.zoomOut(); }, theme, states && states.hover)\n\t\t\t.attr({\n\t\t\t\talign: btnOptions.position.align,\n\t\t\t\ttitle: lang.resetZoomTitle\n\t\t\t})\n\t\t\t.add()\n\t\t\t.align(btnOptions.position, false, alignTo);\n\t\t\t\n\t},\n\n\t/**\n\t * Zoom out to 1:1\n\t */\n\tzoomOut: function () {\n\t\tvar chart = this;\n\t\tfireEvent(chart, 'selection', { resetSelection: true }, function () { \n\t\t\tchart.zoom();\n\t\t});\n\t},\n\n\t/**\n\t * Zoom into a given portion of the chart given by axis coordinates\n\t * @param {Object} event\n\t */\n\tzoom: function (event) {\n\t\tvar chart = this,\n\t\t\thasZoomed,\n\t\t\tpointer = chart.pointer,\n\t\t\tdisplayButton = false,\n\t\t\tresetZoomButton;\n\n\t\t// If zoom is called with no arguments, reset the axes\n\t\tif (!event || event.resetSelection) {\n\t\t\teach(chart.axes, function (axis) {\n\t\t\t\thasZoomed = axis.zoom();\n\t\t\t});\n\t\t} else { // else, zoom in on all axes\n\t\t\teach(event.xAxis.concat(event.yAxis), function (axisData) {\n\t\t\t\tvar axis = axisData.axis,\n\t\t\t\t\tisXAxis = axis.isXAxis;\n\n\t\t\t\t// don't zoom more than minRange\n\t\t\t\tif (pointer[isXAxis ? 'zoomX' : 'zoomY'] || pointer[isXAxis ? 'pinchX' : 'pinchY']) {\n\t\t\t\t\thasZoomed = axis.zoom(axisData.min, axisData.max);\n\t\t\t\t\tif (axis.displayBtn) {\n\t\t\t\t\t\tdisplayButton = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\t// Show or hide the Reset zoom button\n\t\tresetZoomButton = chart.resetZoomButton;\n\t\tif (displayButton && !resetZoomButton) {\n\t\t\tchart.showResetZoom();\n\t\t} else if (!displayButton && isObject(resetZoomButton)) {\n\t\t\tchart.resetZoomButton = resetZoomButton.destroy();\n\t\t}\n\t\t\n\n\t\t// Redraw\n\t\tif (hasZoomed) {\n\t\t\tchart.redraw(\n\t\t\t\tpick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation\n\t\t\t);\n\t\t}\n\t},\n\n\t/**\n\t * Pan the chart by dragging the mouse across the pane. This function is called\n\t * on mouse move, and the distance to pan is computed from chartX compared to\n\t * the first chartX position in the dragging operation.\n\t */\n\tpan: function (e, panning) {\n\n\t\tvar chart = this,\n\t\t\thoverPoints = chart.hoverPoints,\n\t\t\tdoRedraw;\n\n\t\t// remove active points for shared tooltip\n\t\tif (hoverPoints) {\n\t\t\teach(hoverPoints, function (point) {\n\t\t\t\tpoint.setState();\n\t\t\t});\n\t\t}\n\n\t\teach(panning === 'xy' ? [1, 0] : [1], function (isX) { // xy is used in maps\n\t\t\tvar mousePos = e[isX ? 'chartX' : 'chartY'],\n\t\t\t\taxis = chart[isX ? 'xAxis' : 'yAxis'][0],\n\t\t\t\tstartPos = chart[isX ? 'mouseDownX' : 'mouseDownY'],\n\t\t\t\thalfPointRange = (axis.pointRange || 0) / 2,\n\t\t\t\textremes = axis.getExtremes(),\n\t\t\t\tnewMin = axis.toValue(startPos - mousePos, true) + halfPointRange,\n\t\t\t\tnewMax = axis.toValue(startPos + chart[isX ? 'plotWidth' : 'plotHeight'] - mousePos, true) - halfPointRange;\n\n\t\t\tif (axis.series.length && newMin > mathMin(extremes.dataMin, extremes.min) && newMax < mathMax(extremes.dataMax, extremes.max)) {\n\t\t\t\taxis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });\n\t\t\t\tdoRedraw = true;\n\t\t\t}\n\n\t\t\tchart[isX ? 'mouseDownX' : 'mouseDownY'] = mousePos; // set new reference for next run\n\t\t});\n\n\t\tif (doRedraw) {\n\t\t\tchart.redraw(false);\n\t\t}\n\t\tcss(chart.container, { cursor: 'move' });\n\t},\n\n\t/**\n\t * Show the title and subtitle of the chart\n\t *\n\t * @param titleOptions {Object} New title options\n\t * @param subtitleOptions {Object} New subtitle options\n\t *\n\t */\n\tsetTitle: function (titleOptions, subtitleOptions) {\n\t\tvar chart = this,\n\t\t\toptions = chart.options,\n\t\t\tchartTitleOptions,\n\t\t\tchartSubtitleOptions;\n\n\t\tchartTitleOptions = options.title = merge(options.title, titleOptions);\n\t\tchartSubtitleOptions = options.subtitle = merge(options.subtitle, subtitleOptions);\n\n\t\t// add title and subtitle\n\t\teach([\n\t\t\t['title', titleOptions, chartTitleOptions],\n\t\t\t['subtitle', subtitleOptions, chartSubtitleOptions]\n\t\t], function (arr) {\n\t\t\tvar name = arr[0],\n\t\t\t\ttitle = chart[name],\n\t\t\t\ttitleOptions = arr[1],\n\t\t\t\tchartTitleOptions = arr[2];\n\n\t\t\tif (title && titleOptions) {\n\t\t\t\tchart[name] = title = title.destroy(); // remove old\n\t\t\t}\n\t\t\t\n\t\t\tif (chartTitleOptions && chartTitleOptions.text && !title) {\n\t\t\t\tchart[name] = chart.renderer.text(\n\t\t\t\t\tchartTitleOptions.text,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\tchartTitleOptions.useHTML\n\t\t\t\t)\n\t\t\t\t.attr({\n\t\t\t\t\talign: chartTitleOptions.align,\n\t\t\t\t\t'class': PREFIX + name,\n\t\t\t\t\tzIndex: chartTitleOptions.zIndex || 4\n\t\t\t\t})\n\t\t\t\t.css(chartTitleOptions.style)\n\t\t\t\t.add();\n\t\t\t}\t\n\t\t});\n\t\tchart.layOutTitles();\n\t},\n\n\t/**\n\t * Lay out the chart titles and cache the full offset height for use in getMargins\n\t */\n\tlayOutTitles: function () {\n\t\tvar titleOffset = 0,\n\t\t\ttitle = this.title,\n\t\t\tsubtitle = this.subtitle,\n\t\t\toptions = this.options,\n\t\t\ttitleOptions = options.title,\n\t\t\tsubtitleOptions = options.subtitle,\n\t\t\tautoWidth = this.spacingBox.width - 44; // 44 makes room for default context button\n\n\t\tif (title) {\n\t\t\ttitle\n\t\t\t\t.css({ width: (titleOptions.width || autoWidth) + PX })\n\t\t\t\t.align(extend({ y: 15 }, titleOptions), false, 'spacingBox');\n\t\t\t\n\t\t\tif (!titleOptions.floating && !titleOptions.verticalAlign) {\n\t\t\t\ttitleOffset = title.getBBox().height;\n\n\t\t\t\t// Adjust for browser consistency + backwards compat after #776 fix\n\t\t\t\tif (titleOffset >= 18 && titleOffset <= 25) {\n\t\t\t\t\ttitleOffset = 15; \n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (subtitle) {\n\t\t\tsubtitle\n\t\t\t\t.css({ width: (subtitleOptions.width || autoWidth) + PX })\n\t\t\t\t.align(extend({ y: titleOffset + titleOptions.margin }, subtitleOptions), false, 'spacingBox');\n\t\t\t\n\t\t\tif (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {\n\t\t\t\ttitleOffset = mathCeil(titleOffset + subtitle.getBBox().height);\n\t\t\t}\n\t\t}\n\n\t\tthis.titleOffset = titleOffset; // used in getMargins\n\t},\n\n\t/**\n\t * Get chart width and height according to options and container size\n\t */\n\tgetChartSize: function () {\n\t\tvar chart = this,\n\t\t\toptionsChart = chart.options.chart,\n\t\t\trenderTo = chart.renderToClone || chart.renderTo;\n\n\t\t// get inner width and height from jQuery (#824)\n\t\tchart.containerWidth = adapterRun(renderTo, 'width');\n\t\tchart.containerHeight = adapterRun(renderTo, 'height');\n\t\t\n\t\tchart.chartWidth = mathMax(0, optionsChart.width || chart.containerWidth || 600); // #1393, 1460\n\t\tchart.chartHeight = mathMax(0, pick(optionsChart.height,\n\t\t\t// the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7:\n\t\t\tchart.containerHeight > 19 ? chart.containerHeight : 400));\n\t},\n\n\t/**\n\t * Create a clone of the chart's renderTo div and place it outside the viewport to allow\n\t * size computation on chart.render and chart.redraw\n\t */\n\tcloneRenderTo: function (revert) {\n\t\tvar clone = this.renderToClone,\n\t\t\tcontainer = this.container;\n\t\t\n\t\t// Destroy the clone and bring the container back to the real renderTo div\n\t\tif (revert) {\n\t\t\tif (clone) {\n\t\t\t\tthis.renderTo.appendChild(container);\n\t\t\t\tdiscardElement(clone);\n\t\t\t\tdelete this.renderToClone;\n\t\t\t}\n\t\t\n\t\t// Set up the clone\n\t\t} else {\n\t\t\tif (container && container.parentNode === this.renderTo) {\n\t\t\t\tthis.renderTo.removeChild(container); // do not clone this\n\t\t\t}\n\t\t\tthis.renderToClone = clone = this.renderTo.cloneNode(0);\n\t\t\tcss(clone, {\n\t\t\t\tposition: ABSOLUTE,\n\t\t\t\ttop: '-9999px',\n\t\t\t\tdisplay: 'block' // #833\n\t\t\t});\n\t\t\tdoc.body.appendChild(clone);\n\t\t\tif (container) {\n\t\t\t\tclone.appendChild(container);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Get the containing element, determine the size and create the inner container\n\t * div to hold the chart\n\t */\n\tgetContainer: function () {\n\t\tvar chart = this,\n\t\t\tcontainer,\n\t\t\toptionsChart = chart.options.chart,\n\t\t\tchartWidth,\n\t\t\tchartHeight,\n\t\t\trenderTo,\n\t\t\tindexAttrName = 'data-highcharts-chart',\n\t\t\toldChartIndex,\n\t\t\tcontainerId;\n\n\t\tchart.renderTo = renderTo = optionsChart.renderTo;\n\t\tcontainerId = PREFIX + idCounter++;\n\n\t\tif (isString(renderTo)) {\n\t\t\tchart.renderTo = renderTo = doc.getElementById(renderTo);\n\t\t}\n\t\t\n\t\t// Display an error if the renderTo is wrong\n\t\tif (!renderTo) {\n\t\t\terror(13, true);\n\t\t}\n\t\t\n\t\t// If the container already holds a chart, destroy it\n\t\toldChartIndex = pInt(attr(renderTo, indexAttrName));\n\t\tif (!isNaN(oldChartIndex) && charts[oldChartIndex]) {\n\t\t\tcharts[oldChartIndex].destroy();\n\t\t}\t\t\n\t\t\n\t\t// Make a reference to the chart from the div\n\t\tattr(renderTo, indexAttrName, chart.index);\n\n\t\t// remove previous chart\n\t\trenderTo.innerHTML = '';\n\n\t\t// If the container doesn't have an offsetWidth, it has or is a child of a node\n\t\t// that has display:none. We need to temporarily move it out to a visible\n\t\t// state to determine the size, else the legend and tooltips won't render\n\t\t// properly\n\t\tif (!renderTo.offsetWidth) {\n\t\t\tchart.cloneRenderTo();\n\t\t}\n\n\t\t// get the width and height\n\t\tchart.getChartSize();\n\t\tchartWidth = chart.chartWidth;\n\t\tchartHeight = chart.chartHeight;\n\n\t\t// create the inner container\n\t\tchart.container = container = createElement(DIV, {\n\t\t\t\tclassName: PREFIX + 'container' +\n\t\t\t\t\t(optionsChart.className ? ' ' + optionsChart.className : ''),\n\t\t\t\tid: containerId\n\t\t\t}, extend({\n\t\t\t\tposition: RELATIVE,\n\t\t\t\toverflow: HIDDEN, // needed for context menu (avoid scrollbars) and\n\t\t\t\t\t// content overflow in IE\n\t\t\t\twidth: chartWidth + PX,\n\t\t\t\theight: chartHeight + PX,\n\t\t\t\ttextAlign: 'left',\n\t\t\t\tlineHeight: 'normal', // #427\n\t\t\t\tzIndex: 0, // #1072\n\t\t\t\t'-webkit-tap-highlight-color': 'rgba(0,0,0,0)'\n\t\t\t}, optionsChart.style),\n\t\t\tchart.renderToClone || renderTo\n\t\t);\n\n\t\t// cache the cursor (#1650)\n\t\tchart._cursor = container.style.cursor;\n\n\t\tchart.renderer =\n\t\t\toptionsChart.forExport ? // force SVG, used for SVG export\n\t\t\t\tnew SVGRenderer(container, chartWidth, chartHeight, true) :\n\t\t\t\tnew Renderer(container, chartWidth, chartHeight);\n\n\t\tif (useCanVG) {\n\t\t\t// If we need canvg library, extend and configure the renderer\n\t\t\t// to get the tracker for translating mouse events\n\t\t\tchart.renderer.create(chart, container, chartWidth, chartHeight);\n\t\t}\n\t},\n\n\t/**\n\t * Calculate margins by rendering axis labels in a preliminary position. Title,\n\t * subtitle and legend have already been rendered at this stage, but will be\n\t * moved into their final positions\n\t */\n\tgetMargins: function () {\n\t\tvar chart = this,\n\t\t\tspacing = chart.spacing,\n\t\t\taxisOffset,\n\t\t\tlegend = chart.legend,\n\t\t\tmargin = chart.margin,\n\t\t\tlegendOptions = chart.options.legend,\n\t\t\tlegendMargin = pick(legendOptions.margin, 10),\n\t\t\tlegendX = legendOptions.x,\n\t\t\tlegendY = legendOptions.y,\n\t\t\talign = legendOptions.align,\n\t\t\tverticalAlign = legendOptions.verticalAlign,\n\t\t\ttitleOffset = chart.titleOffset;\n\n\t\tchart.resetMargins();\n\t\taxisOffset = chart.axisOffset;\n\n\t\t// Adjust for title and subtitle\n\t\tif (titleOffset && !defined(margin[0])) {\n\t\t\tchart.plotTop = mathMax(chart.plotTop, titleOffset + chart.options.title.margin + spacing[0]);\n\t\t}\n\t\t\n\t\t// Adjust for legend\n\t\tif (legend.display && !legendOptions.floating) {\n\t\t\tif (align === 'right') { // horizontal alignment handled first\n\t\t\t\tif (!defined(margin[1])) {\n\t\t\t\t\tchart.marginRight = mathMax(\n\t\t\t\t\t\tchart.marginRight,\n\t\t\t\t\t\tlegend.legendWidth - legendX + legendMargin + spacing[1]\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (align === 'left') {\n\t\t\t\tif (!defined(margin[3])) {\n\t\t\t\t\tchart.plotLeft = mathMax(\n\t\t\t\t\t\tchart.plotLeft,\n\t\t\t\t\t\tlegend.legendWidth + legendX + legendMargin + spacing[3]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t} else if (verticalAlign === 'top') {\n\t\t\t\tif (!defined(margin[0])) {\n\t\t\t\t\tchart.plotTop = mathMax(\n\t\t\t\t\t\tchart.plotTop,\n\t\t\t\t\t\tlegend.legendHeight + legendY + legendMargin + spacing[0]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t} else if (verticalAlign === 'bottom') {\n\t\t\t\tif (!defined(margin[2])) {\n\t\t\t\t\tchart.marginBottom = mathMax(\n\t\t\t\t\t\tchart.marginBottom,\n\t\t\t\t\t\tlegend.legendHeight - legendY + legendMargin + spacing[2]\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// adjust for scroller\n\t\tif (chart.extraBottomMargin) {\n\t\t\tchart.marginBottom += chart.extraBottomMargin;\n\t\t}\n\t\tif (chart.extraTopMargin) {\n\t\t\tchart.plotTop += chart.extraTopMargin;\n\t\t}\n\n\t\t// pre-render axes to get labels offset width\n\t\tif (chart.hasCartesianSeries) {\n\t\t\teach(chart.axes, function (axis) {\n\t\t\t\taxis.getOffset();\n\t\t\t});\n\t\t}\n\t\t\n\t\tif (!defined(margin[3])) {\n\t\t\tchart.plotLeft += axisOffset[3];\n\t\t}\n\t\tif (!defined(margin[0])) {\n\t\t\tchart.plotTop += axisOffset[0];\n\t\t}\n\t\tif (!defined(margin[2])) {\n\t\t\tchart.marginBottom += axisOffset[2];\n\t\t}\n\t\tif (!defined(margin[1])) {\n\t\t\tchart.marginRight += axisOffset[1];\n\t\t}\n\n\t\tchart.setChartSize();\n\n\t},\n\n\t/**\n\t * Add the event handlers necessary for auto resizing\n\t *\n\t */\n\tinitReflow: function () {\n\t\tvar chart = this,\n\t\t\toptionsChart = chart.options.chart,\n\t\t\trenderTo = chart.renderTo,\n\t\t\treflowTimeout;\n\t\t\t\n\t\tfunction reflow(e) {\n\t\t\tvar width = optionsChart.width || adapterRun(renderTo, 'width'),\n\t\t\t\theight = optionsChart.height || adapterRun(renderTo, 'height'),\n\t\t\t\ttarget = e ? e.target : win; // #805 - MooTools doesn't supply e\n\t\t\t\t\n\t\t\t// Width and height checks for display:none. Target is doc in IE8 and Opera,\n\t\t\t// win in Firefox, Chrome and IE9.\n\t\t\tif (!chart.hasUserSize && width && height && (target === win || target === doc)) {\n\t\t\t\t\n\t\t\t\tif (width !== chart.containerWidth || height !== chart.containerHeight) {\n\t\t\t\t\tclearTimeout(reflowTimeout);\n\t\t\t\t\tchart.reflowTimeout = reflowTimeout = setTimeout(function () {\n\t\t\t\t\t\tif (chart.container) { // It may have been destroyed in the meantime (#1257)\n\t\t\t\t\t\t\tchart.setSize(width, height, false);\n\t\t\t\t\t\t\tchart.hasUserSize = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 100);\n\t\t\t\t}\n\t\t\t\tchart.containerWidth = width;\n\t\t\t\tchart.containerHeight = height;\n\t\t\t}\n\t\t}\n\t\tchart.reflow = reflow;\n\t\taddEvent(win, 'resize', reflow);\n\t\taddEvent(chart, 'destroy', function () {\n\t\t\tremoveEvent(win, 'resize', reflow);\n\t\t});\n\t},\n\n\t/**\n\t * Resize the chart to a given width and height\n\t * @param {Number} width\n\t * @param {Number} height\n\t * @param {Object|Boolean} animation\n\t */\n\tsetSize: function (width, height, animation) {\n\t\tvar chart = this,\n\t\t\tchartWidth,\n\t\t\tchartHeight,\n\t\t\tfireEndResize;\n\n\t\t// Handle the isResizing counter\n\t\tchart.isResizing += 1;\n\t\tfireEndResize = function () {\n\t\t\tif (chart) {\n\t\t\t\tfireEvent(chart, 'endResize', null, function () {\n\t\t\t\t\tchart.isResizing -= 1;\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t// set the animation for the current process\n\t\tsetAnimation(animation, chart);\n\n\t\tchart.oldChartHeight = chart.chartHeight;\n\t\tchart.oldChartWidth = chart.chartWidth;\n\t\tif (defined(width)) {\n\t\t\tchart.chartWidth = chartWidth = mathMax(0, mathRound(width));\n\t\t\tchart.hasUserSize = !!chartWidth;\n\t\t}\n\t\tif (defined(height)) {\n\t\t\tchart.chartHeight = chartHeight = mathMax(0, mathRound(height));\n\t\t}\n\n\t\tcss(chart.container, {\n\t\t\twidth: chartWidth + PX,\n\t\t\theight: chartHeight + PX\n\t\t});\n\t\tchart.setChartSize(true);\n\t\tchart.renderer.setSize(chartWidth, chartHeight, animation);\n\n\t\t// handle axes\n\t\tchart.maxTicks = null;\n\t\teach(chart.axes, function (axis) {\n\t\t\taxis.isDirty = true;\n\t\t\taxis.setScale();\n\t\t});\n\n\t\t// make sure non-cartesian series are also handled\n\t\teach(chart.series, function (serie) {\n\t\t\tserie.isDirty = true;\n\t\t});\n\n\t\tchart.isDirtyLegend = true; // force legend redraw\n\t\tchart.isDirtyBox = true; // force redraw of plot and chart border\n\n\t\tchart.getMargins();\n\n\t\tchart.redraw(animation);\n\n\n\t\tchart.oldChartHeight = null;\n\t\tfireEvent(chart, 'resize');\n\n\t\t// fire endResize and set isResizing back\n\t\t// If animation is disabled, fire without delay\n\t\tif (globalAnimation === false) {\n\t\t\tfireEndResize();\n\t\t} else { // else set a timeout with the animation duration\n\t\t\tsetTimeout(fireEndResize, (globalAnimation && globalAnimation.duration) || 500);\n\t\t}\n\t},\n\n\t/**\n\t * Set the public chart properties. This is done before and after the pre-render\n\t * to determine margin sizes\n\t */\n\tsetChartSize: function (skipAxes) {\n\t\tvar chart = this,\n\t\t\tinverted = chart.inverted,\n\t\t\trenderer = chart.renderer,\n\t\t\tchartWidth = chart.chartWidth,\n\t\t\tchartHeight = chart.chartHeight,\n\t\t\toptionsChart = chart.options.chart,\n\t\t\tspacing = chart.spacing,\n\t\t\tclipOffset = chart.clipOffset,\n\t\t\tclipX,\n\t\t\tclipY,\n\t\t\tplotLeft,\n\t\t\tplotTop,\n\t\t\tplotWidth,\n\t\t\tplotHeight,\n\t\t\tplotBorderWidth;\n\n\t\tchart.plotLeft = plotLeft = mathRound(chart.plotLeft);\n\t\tchart.plotTop = plotTop = mathRound(chart.plotTop);\n\t\tchart.plotWidth = plotWidth = mathMax(0, mathRound(chartWidth - plotLeft - chart.marginRight));\n\t\tchart.plotHeight = plotHeight = mathMax(0, mathRound(chartHeight - plotTop - chart.marginBottom));\n\n\t\tchart.plotSizeX = inverted ? plotHeight : plotWidth;\n\t\tchart.plotSizeY = inverted ? plotWidth : plotHeight;\n\t\t\n\t\tchart.plotBorderWidth = optionsChart.plotBorderWidth || 0;\n\n\t\t// Set boxes used for alignment\n\t\tchart.spacingBox = renderer.spacingBox = {\n\t\t\tx: spacing[3],\n\t\t\ty: spacing[0],\n\t\t\twidth: chartWidth - spacing[3] - spacing[1],\n\t\t\theight: chartHeight - spacing[0] - spacing[2]\n\t\t};\n\t\tchart.plotBox = renderer.plotBox = {\n\t\t\tx: plotLeft,\n\t\t\ty: plotTop,\n\t\t\twidth: plotWidth,\n\t\t\theight: plotHeight\n\t\t};\n\n\t\tplotBorderWidth = 2 * mathFloor(chart.plotBorderWidth / 2);\n\t\tclipX = mathCeil(mathMax(plotBorderWidth, clipOffset[3]) / 2);\n\t\tclipY = mathCeil(mathMax(plotBorderWidth, clipOffset[0]) / 2);\n\t\tchart.clipBox = {\n\t\t\tx: clipX, \n\t\t\ty: clipY, \n\t\t\twidth: mathFloor(chart.plotSizeX - mathMax(plotBorderWidth, clipOffset[1]) / 2 - clipX), \n\t\t\theight: mathFloor(chart.plotSizeY - mathMax(plotBorderWidth, clipOffset[2]) / 2 - clipY)\n\t\t};\n\n\t\tif (!skipAxes) {\n\t\t\teach(chart.axes, function (axis) {\n\t\t\t\taxis.setAxisSize();\n\t\t\t\taxis.setAxisTranslation();\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Initial margins before auto size margins are applied\n\t */\n\tresetMargins: function () {\n\t\tvar chart = this,\n\t\t\tspacing = chart.spacing,\n\t\t\tmargin = chart.margin;\n\n\t\tchart.plotTop = pick(margin[0], spacing[0]);\n\t\tchart.marginRight = pick(margin[1], spacing[1]);\n\t\tchart.marginBottom = pick(margin[2], spacing[2]);\n\t\tchart.plotLeft = pick(margin[3], spacing[3]);\n\t\tchart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left\n\t\tchart.clipOffset = [0, 0, 0, 0];\n\t},\n\n\t/**\n\t * Draw the borders and backgrounds for chart and plot area\n\t */\n\tdrawChartBox: function () {\n\t\tvar chart = this,\n\t\t\toptionsChart = chart.options.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\tchartWidth = chart.chartWidth,\n\t\t\tchartHeight = chart.chartHeight,\n\t\t\tchartBackground = chart.chartBackground,\n\t\t\tplotBackground = chart.plotBackground,\n\t\t\tplotBorder = chart.plotBorder,\n\t\t\tplotBGImage = chart.plotBGImage,\n\t\t\tchartBorderWidth = optionsChart.borderWidth || 0,\n\t\t\tchartBackgroundColor = optionsChart.backgroundColor,\n\t\t\tplotBackgroundColor = optionsChart.plotBackgroundColor,\n\t\t\tplotBackgroundImage = optionsChart.plotBackgroundImage,\n\t\t\tplotBorderWidth = optionsChart.plotBorderWidth || 0,\n\t\t\tmgn,\n\t\t\tbgAttr,\n\t\t\tplotLeft = chart.plotLeft,\n\t\t\tplotTop = chart.plotTop,\n\t\t\tplotWidth = chart.plotWidth,\n\t\t\tplotHeight = chart.plotHeight,\n\t\t\tplotBox = chart.plotBox,\n\t\t\tclipRect = chart.clipRect,\n\t\t\tclipBox = chart.clipBox;\n\n\t\t// Chart area\n\t\tmgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\n\n\t\tif (chartBorderWidth || chartBackgroundColor) {\n\t\t\tif (!chartBackground) {\n\t\t\t\t\n\t\t\t\tbgAttr = {\n\t\t\t\t\tfill: chartBackgroundColor || NONE\n\t\t\t\t};\n\t\t\t\tif (chartBorderWidth) { // #980\n\t\t\t\t\tbgAttr.stroke = optionsChart.borderColor;\n\t\t\t\t\tbgAttr['stroke-width'] = chartBorderWidth;\n\t\t\t\t}\n\t\t\t\tchart.chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn,\n\t\t\t\t\t\toptionsChart.borderRadius, chartBorderWidth)\n\t\t\t\t\t.attr(bgAttr)\n\t\t\t\t\t.add()\n\t\t\t\t\t.shadow(optionsChart.shadow);\n\n\t\t\t} else { // resize\n\t\t\t\tchartBackground.animate(\n\t\t\t\t\tchartBackground.crisp(null, null, null, chartWidth - mgn, chartHeight - mgn)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\n\t\t// Plot background\n\t\tif (plotBackgroundColor) {\n\t\t\tif (!plotBackground) {\n\t\t\t\tchart.plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0)\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tfill: plotBackgroundColor\n\t\t\t\t\t})\n\t\t\t\t\t.add()\n\t\t\t\t\t.shadow(optionsChart.plotShadow);\n\t\t\t} else {\n\t\t\t\tplotBackground.animate(plotBox);\n\t\t\t}\n\t\t}\n\t\tif (plotBackgroundImage) {\n\t\t\tif (!plotBGImage) {\n\t\t\t\tchart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight)\n\t\t\t\t\t.add();\n\t\t\t} else {\n\t\t\t\tplotBGImage.animate(plotBox);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Plot clip\n\t\tif (!clipRect) {\n\t\t\tchart.clipRect = renderer.clipRect(clipBox);\n\t\t} else {\n\t\t\tclipRect.animate({\n\t\t\t\twidth: clipBox.width,\n\t\t\t\theight: clipBox.height\n\t\t\t});\n\t\t}\n\n\t\t// Plot area border\n\t\tif (plotBorderWidth) {\n\t\t\tif (!plotBorder) {\n\t\t\t\tchart.plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, -plotBorderWidth)\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tstroke: optionsChart.plotBorderColor,\n\t\t\t\t\t\t'stroke-width': plotBorderWidth,\n\t\t\t\t\t\tzIndex: 1\n\t\t\t\t\t})\n\t\t\t\t\t.add();\n\t\t\t} else {\n\t\t\t\tplotBorder.animate(\n\t\t\t\t\tplotBorder.crisp(null, plotLeft, plotTop, plotWidth, plotHeight)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// reset\n\t\tchart.isDirtyBox = false;\n\t},\n\n\t/**\n\t * Detect whether a certain chart property is needed based on inspecting its options\n\t * and series. This mainly applies to the chart.invert property, and in extensions to \n\t * the chart.angular and chart.polar properties.\n\t */\n\tpropFromSeries: function () {\n\t\tvar chart = this,\n\t\t\toptionsChart = chart.options.chart,\n\t\t\tklass,\n\t\t\tseriesOptions = chart.options.series,\n\t\t\ti,\n\t\t\tvalue;\n\t\t\t\n\t\t\t\n\t\teach(['inverted', 'angular', 'polar'], function (key) {\n\t\t\t\n\t\t\t// The default series type's class\n\t\t\tklass = seriesTypes[optionsChart.type || optionsChart.defaultSeriesType];\n\t\t\t\n\t\t\t// Get the value from available chart-wide properties\n\t\t\tvalue = (\n\t\t\t\tchart[key] || // 1. it is set before\n\t\t\t\toptionsChart[key] || // 2. it is set in the options\n\t\t\t\t(klass && klass.prototype[key]) // 3. it's default series class requires it\n\t\t\t);\n\t\n\t\t\t// 4. Check if any the chart's series require it\n\t\t\ti = seriesOptions && seriesOptions.length;\n\t\t\twhile (!value && i--) {\n\t\t\t\tklass = seriesTypes[seriesOptions[i].type];\n\t\t\t\tif (klass && klass.prototype[key]) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Set the chart property\n\t\t\tchart[key] = value;\t\n\t\t});\n\t\t\n\t},\n\n\t/**\n\t * Link two or more series together. This is done initially from Chart.render,\n\t * and after Chart.addSeries and Series.remove.\n\t */\n\tlinkSeries: function () {\n\t\tvar chart = this,\n\t\t\tchartSeries = chart.series;\n\n\t\t// Reset links\n\t\teach(chartSeries, function (series) {\n\t\t\tseries.linkedSeries.length = 0;\n\t\t});\n\n\t\t// Apply new links\n\t\teach(chartSeries, function (series) {\n\t\t\tvar linkedTo = series.options.linkedTo;\n\t\t\tif (isString(linkedTo)) {\n\t\t\t\tif (linkedTo === ':previous') {\n\t\t\t\t\tlinkedTo = chart.series[series.index - 1];\n\t\t\t\t} else {\n\t\t\t\t\tlinkedTo = chart.get(linkedTo);\n\t\t\t\t}\n\t\t\t\tif (linkedTo) {\n\t\t\t\t\tlinkedTo.linkedSeries.push(series);\n\t\t\t\t\tseries.linkedParent = linkedTo;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Render all graphics for the chart\n\t */\n\trender: function () {\n\t\tvar chart = this,\n\t\t\taxes = chart.axes,\n\t\t\trenderer = chart.renderer,\n\t\t\toptions = chart.options;\n\n\t\tvar labels = options.labels,\n\t\t\tcredits = options.credits,\n\t\t\tcreditsHref;\n\n\t\t// Title\n\t\tchart.setTitle();\n\n\n\t\t// Legend\n\t\tchart.legend = new Legend(chart, options.legend);\n\n\t\tchart.getStacks(); // render stacks\n\n\t\t// Get margins by pre-rendering axes\n\t\t// set axes scales\n\t\teach(axes, function (axis) {\n\t\t\taxis.setScale();\n\t\t});\n\n\t\tchart.getMargins();\n\n\t\tchart.maxTicks = null; // reset for second pass\n\t\teach(axes, function (axis) {\n\t\t\taxis.setTickPositions(true); // update to reflect the new margins\n\t\t\taxis.setMaxTicks();\n\t\t});\n\t\tchart.adjustTickAmounts();\n\t\tchart.getMargins(); // second pass to check for new labels\n\n\n\t\t// Draw the borders and backgrounds\n\t\tchart.drawChartBox();\t\t\n\n\n\t\t// Axes\n\t\tif (chart.hasCartesianSeries) {\n\t\t\teach(axes, function (axis) {\n\t\t\t\taxis.render();\n\t\t\t});\n\t\t}\n\n\t\t// The series\n\t\tif (!chart.seriesGroup) {\n\t\t\tchart.seriesGroup = renderer.g('series-group')\n\t\t\t\t.attr({ zIndex: 3 })\n\t\t\t\t.add();\n\t\t}\n\t\teach(chart.series, function (serie) {\n\t\t\tserie.translate();\n\t\t\tserie.setTooltipPoints();\n\t\t\tserie.render();\n\t\t});\n\n\t\t// Labels\n\t\tif (labels.items) {\n\t\t\teach(labels.items, function (label) {\n\t\t\t\tvar style = extend(labels.style, label.style),\n\t\t\t\t\tx = pInt(style.left) + chart.plotLeft,\n\t\t\t\t\ty = pInt(style.top) + chart.plotTop + 12;\n\n\t\t\t\t// delete to prevent rewriting in IE\n\t\t\t\tdelete style.left;\n\t\t\t\tdelete style.top;\n\n\t\t\t\trenderer.text(\n\t\t\t\t\tlabel.html,\n\t\t\t\t\tx,\n\t\t\t\t\ty\n\t\t\t\t)\n\t\t\t\t.attr({ zIndex: 2 })\n\t\t\t\t.css(style)\n\t\t\t\t.add();\n\n\t\t\t});\n\t\t}\n\n\t\t// Credits\n\t\tif (credits.enabled && !chart.credits) {\n\t\t\tcreditsHref = credits.href;\n\t\t\tchart.credits = renderer.text(\n\t\t\t\tcredits.text,\n\t\t\t\t0,\n\t\t\t\t0\n\t\t\t)\n\t\t\t.on('click', function () {\n\t\t\t\tif (creditsHref) {\n\t\t\t\t\tlocation.href = creditsHref;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.attr({\n\t\t\t\talign: credits.position.align,\n\t\t\t\tzIndex: 8\n\t\t\t})\n\t\t\t.css(credits.style)\n\t\t\t.add()\n\t\t\t.align(credits.position);\n\t\t}\n\n\t\t// Set flag\n\t\tchart.hasRendered = true;\n\n\t},\n\n\t/**\n\t * Clean up memory usage\n\t */\n\tdestroy: function () {\n\t\tvar chart = this,\n\t\t\taxes = chart.axes,\n\t\t\tseries = chart.series,\n\t\t\tcontainer = chart.container,\n\t\t\ti,\n\t\t\tparentNode = container && container.parentNode;\n\t\t\t\n\t\t// fire the chart.destoy event\n\t\tfireEvent(chart, 'destroy');\n\t\t\n\t\t// Delete the chart from charts lookup array\n\t\tcharts[chart.index] = UNDEFINED;\n\t\tchart.renderTo.removeAttribute('data-highcharts-chart');\n\n\t\t// remove events\n\t\tremoveEvent(chart);\n\n\t\t// ==== Destroy collections:\n\t\t// Destroy axes\n\t\ti = axes.length;\n\t\twhile (i--) {\n\t\t\taxes[i] = axes[i].destroy();\n\t\t}\n\n\t\t// Destroy each series\n\t\ti = series.length;\n\t\twhile (i--) {\n\t\t\tseries[i] = series[i].destroy();\n\t\t}\n\n\t\t// ==== Destroy chart properties:\n\t\teach(['title', 'subtitle', 'chartBackground', 'plotBackground', 'plotBGImage', \n\t\t\t\t'plotBorder', 'seriesGroup', 'clipRect', 'credits', 'pointer', 'scroller', \n\t\t\t\t'rangeSelector', 'legend', 'resetZoomButton', 'tooltip', 'renderer'], function (name) {\n\t\t\tvar prop = chart[name];\n\n\t\t\tif (prop && prop.destroy) {\n\t\t\t\tchart[name] = prop.destroy();\n\t\t\t}\n\t\t});\n\n\t\t// remove container and all SVG\n\t\tif (container) { // can break in IE when destroyed before finished loading\n\t\t\tcontainer.innerHTML = '';\n\t\t\tremoveEvent(container);\n\t\t\tif (parentNode) {\n\t\t\t\tdiscardElement(container);\n\t\t\t}\n\n\t\t}\n\n\t\t// clean it all up\n\t\tfor (i in chart) {\n\t\t\tdelete chart[i];\n\t\t}\n\n\t},\n\n\n\t/**\n\t * VML namespaces can't be added until after complete. Listening\n\t * for Perini's doScroll hack is not enough.\n\t */\n\tisReadyToRender: function () {\n\t\tvar chart = this;\n\n\t\t// Note: in spite of JSLint's complaints, win == win.top is required\n\t\t/*jslint eqeq: true*/\n\t\tif ((!hasSVG && (win == win.top && doc.readyState !== 'complete')) || (useCanVG && !win.canvg)) {\n\t\t/*jslint eqeq: false*/\n\t\t\tif (useCanVG) {\n\t\t\t\t// Delay rendering until canvg library is downloaded and ready\n\t\t\t\tCanVGController.push(function () { chart.firstRender(); }, chart.options.global.canvasToolsURL);\n\t\t\t} else {\n\t\t\t\tdoc.attachEvent('onreadystatechange', function () {\n\t\t\t\t\tdoc.detachEvent('onreadystatechange', chart.firstRender);\n\t\t\t\t\tif (doc.readyState === 'complete') {\n\t\t\t\t\t\tchart.firstRender();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t/**\n\t * Prepare for first rendering after all data are loaded\n\t */\n\tfirstRender: function () {\n\t\tvar chart = this,\n\t\t\toptions = chart.options,\n\t\t\tcallback = chart.callback;\n\n\t\t// Check whether the chart is ready to render\n\t\tif (!chart.isReadyToRender()) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Create the container\n\t\tchart.getContainer();\n\n\t\t// Run an early event after the container and renderer are established\n\t\tfireEvent(chart, 'init');\n\n\t\t\n\t\tchart.resetMargins();\n\t\tchart.setChartSize();\n\n\t\t// Set the common chart properties (mainly invert) from the given series\n\t\tchart.propFromSeries();\n\n\t\t// get axes\n\t\tchart.getAxes();\n\n\t\t// Initialize the series\n\t\teach(options.series || [], function (serieOptions) {\n\t\t\tchart.initSeries(serieOptions);\n\t\t});\n\n\t\tchart.linkSeries();\n\n\t\t// Run an event after axes and series are initialized, but before render. At this stage,\n\t\t// the series data is indexed and cached in the xData and yData arrays, so we can access\n\t\t// those before rendering. Used in Highstock. \n\t\tfireEvent(chart, 'beforeRender'); \n\n\t\t// depends on inverted and on margins being set\n\t\tchart.pointer = new Pointer(chart, options);\n\n\t\tchart.render();\n\n\t\t// add canvas\n\t\tchart.renderer.draw();\n\t\t// run callbacks\n\t\tif (callback) {\n\t\t\tcallback.apply(chart, [chart]);\n\t\t}\n\t\teach(chart.callbacks, function (fn) {\n\t\t\tfn.apply(chart, [chart]);\n\t\t});\n\t\t\n\t\t\n\t\t// If the chart was rendered outside the top container, put it back in\n\t\tchart.cloneRenderTo(true);\n\n\t\tfireEvent(chart, 'load');\n\n\t},\n\n\t/**\n\t* Creates arrays for spacing and margin from given options.\n\t*/\n\tsplashArray: function (target, options) {\n\t\tvar oVar = options[target],\n\t\t\ttArray = isObject(oVar) ? oVar : [oVar, oVar, oVar, oVar];\n\n\t\treturn [pick(options[target + 'Top'], tArray[0]),\n\t\t\t\tpick(options[target + 'Right'], tArray[1]),\n\t\t\t\tpick(options[target + 'Bottom'], tArray[2]),\n\t\t\t\tpick(options[target + 'Left'], tArray[3])];\n\t}\n}; // end Chart\n\n// Hook for exporting module\nChart.prototype.callbacks = [];\n/**\n * The Point object and prototype. Inheritable and used as base for PiePoint\n */\nvar Point = function () {};\nPoint.prototype = {\n\n\t/**\n\t * Initialize the point\n\t * @param {Object} series The series object containing this point\n\t * @param {Object} options The data in either number, array or object format\n\t */\n\tinit: function (series, options, x) {\n\n\t\tvar point = this,\n\t\t\tcolors;\n\t\tpoint.series = series;\n\t\tpoint.applyOptions(options, x);\n\t\tpoint.pointAttr = {};\n\n\t\tif (series.options.colorByPoint) {\n\t\t\tcolors = series.options.colors || series.chart.options.colors;\n\t\t\tpoint.color = point.color || colors[series.colorCounter++];\n\t\t\t// loop back to zero\n\t\t\tif (series.colorCounter === colors.length) {\n\t\t\t\tseries.colorCounter = 0;\n\t\t\t}\n\t\t}\n\n\t\tseries.chart.pointCount++;\n\t\treturn point;\n\t},\n\t/**\n\t * Apply the options containing the x and y data and possible some extra properties.\n\t * This is called on point init or from point.update.\n\t *\n\t * @param {Object} options\n\t */\n\tapplyOptions: function (options, x) {\n\t\tvar point = this,\n\t\t\tseries = point.series,\n\t\t\tpointValKey = series.pointValKey;\n\n\t\toptions = Point.prototype.optionsToObject.call(this, options);\n\n\t\t// copy options directly to point\n\t\textend(point, options);\n\t\tpoint.options = point.options ? extend(point.options, options) : options;\n\t\t\t\n\t\t// For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.\n\t\tif (pointValKey) {\n\t\t\tpoint.y = point[pointValKey];\n\t\t}\n\t\t\n\t\t// If no x is set by now, get auto incremented value. All points must have an\n\t\t// x value, however the y value can be null to create a gap in the series\n\t\tif (point.x === UNDEFINED && series) {\n\t\t\tpoint.x = x === UNDEFINED ? series.autoIncrement() : x;\n\t\t}\n\t\t\n\t\treturn point;\n\t},\n\n\t/**\n\t * Transform number or array configs into objects\n\t */\n\toptionsToObject: function (options) {\n\t\tvar ret,\n\t\t\tseries = this.series,\n\t\t\tpointArrayMap = series.pointArrayMap || ['y'],\n\t\t\tvalueCount = pointArrayMap.length,\n\t\t\tfirstItemType,\n\t\t\ti = 0,\n\t\t\tj = 0;\n\n\t\tif (typeof options === 'number' || options === null) {\n\t\t\tret = { y: options };\n\n\t\t} else if (isArray(options)) {\n\t\t\tret = {};\n\t\t\t// with leading x value\n\t\t\tif (options.length > valueCount) {\n\t\t\t\tfirstItemType = typeof options[0];\n\t\t\t\tif (firstItemType === 'string') {\n\t\t\t\t\tret.name = options[0];\n\t\t\t\t} else if (firstItemType === 'number') {\n\t\t\t\t\tret.x = options[0];\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\twhile (j < valueCount) {\n\t\t\t\tret[pointArrayMap[j++]] = options[i++];\n\t\t\t}\t\t\t\n\t\t} else if (typeof options === 'object') {\n\t\t\tret = options;\n\n\t\t\t// This is the fastest way to detect if there are individual point dataLabels that need \n\t\t\t// to be considered in drawDataLabels. These can only occur in object configs.\n\t\t\tif (options.dataLabels) {\n\t\t\t\tseries._hasPointLabels = true;\n\t\t\t}\n\n\t\t\t// Same approach as above for markers\n\t\t\tif (options.marker) {\n\t\t\t\tseries._hasPointMarkers = true;\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t},\n\n\t/**\n\t * Destroy a point to clear memory. Its reference still stays in series.data.\n\t */\n\tdestroy: function () {\n\t\tvar point = this,\n\t\t\tseries = point.series,\n\t\t\tchart = series.chart,\n\t\t\thoverPoints = chart.hoverPoints,\n\t\t\tprop;\n\n\t\tchart.pointCount--;\n\n\t\tif (hoverPoints) {\n\t\t\tpoint.setState();\n\t\t\terase(hoverPoints, point);\n\t\t\tif (!hoverPoints.length) {\n\t\t\t\tchart.hoverPoints = null;\n\t\t\t}\n\n\t\t}\n\t\tif (point === chart.hoverPoint) {\n\t\t\tpoint.onMouseOut();\n\t\t}\n\t\t\n\t\t// remove all events\n\t\tif (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive\n\t\t\tremoveEvent(point);\n\t\t\tpoint.destroyElements();\n\t\t}\n\n\t\tif (point.legendItem) { // pies have legend items\n\t\t\tchart.legend.destroyItem(point);\n\t\t}\n\n\t\tfor (prop in point) {\n\t\t\tpoint[prop] = null;\n\t\t}\n\n\n\t},\n\n\t/**\n\t * Destroy SVG elements associated with the point\n\t */\n\tdestroyElements: function () {\n\t\tvar point = this,\n\t\t\tprops = ['graphic', 'dataLabel', 'dataLabelUpper', 'group', 'connector', 'shadowGroup'],\n\t\t\tprop,\n\t\t\ti = 6;\n\t\twhile (i--) {\n\t\t\tprop = props[i];\n\t\t\tif (point[prop]) {\n\t\t\t\tpoint[prop] = point[prop].destroy();\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Return the configuration hash needed for the data label and tooltip formatters\n\t */\n\tgetLabelConfig: function () {\n\t\tvar point = this;\n\t\treturn {\n\t\t\tx: point.category,\n\t\t\ty: point.y,\n\t\t\tkey: point.name || point.category,\n\t\t\tseries: point.series,\n\t\t\tpoint: point,\n\t\t\tpercentage: point.percentage,\n\t\t\ttotal: point.total || point.stackTotal\n\t\t};\n\t},\n\n\t/**\n\t * Toggle the selection status of a point\n\t * @param {Boolean} selected Whether to select or unselect the point.\n\t * @param {Boolean} accumulate Whether to add to the previous selection. By default,\n\t *     this happens if the control key (Cmd on Mac) was pressed during clicking.\n\t */\n\tselect: function (selected, accumulate) {\n\t\tvar point = this,\n\t\t\tseries = point.series,\n\t\t\tchart = series.chart;\n\n\t\tselected = pick(selected, !point.selected);\n\n\t\t// fire the event with the defalut handler\n\t\tpoint.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {\n\t\t\tpoint.selected = point.options.selected = selected;\n\t\t\tseries.options.data[inArray(point, series.data)] = point.options;\n\t\t\t\n\t\t\tpoint.setState(selected && SELECT_STATE);\n\n\t\t\t// unselect all other points unless Ctrl or Cmd + click\n\t\t\tif (!accumulate) {\n\t\t\t\teach(chart.getSelectedPoints(), function (loopPoint) {\n\t\t\t\t\tif (loopPoint.selected && loopPoint !== point) {\n\t\t\t\t\t\tloopPoint.selected = loopPoint.options.selected = false;\n\t\t\t\t\t\tseries.options.data[inArray(loopPoint, series.data)] = loopPoint.options;\n\t\t\t\t\t\tloopPoint.setState(NORMAL_STATE);\n\t\t\t\t\t\tloopPoint.firePointEvent('unselect');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Runs on mouse over the point\n\t */\n\tonMouseOver: function (e) {\n\t\tvar point = this,\n\t\t\tseries = point.series,\n\t\t\tchart = series.chart,\n\t\t\ttooltip = chart.tooltip,\n\t\t\thoverPoint = chart.hoverPoint;\n\n\t\t// set normal state to previous series\n\t\tif (hoverPoint && hoverPoint !== point) {\n\t\t\thoverPoint.onMouseOut();\n\t\t}\n\n\t\t// trigger the event\n\t\tpoint.firePointEvent('mouseOver');\n\n\t\t// update the tooltip\n\t\tif (tooltip && (!tooltip.shared || series.noSharedTooltip)) {\n\t\t\ttooltip.refresh(point, e);\n\t\t}\n\n\t\t// hover this\n\t\tpoint.setState(HOVER_STATE);\n\t\tchart.hoverPoint = point;\n\t},\n\t\n\t/**\n\t * Runs on mouse out from the point\n\t */\n\tonMouseOut: function () {\n\t\tvar chart = this.series.chart,\n\t\t\thoverPoints = chart.hoverPoints;\n\t\t\n\t\tif (!hoverPoints || inArray(this, hoverPoints) === -1) { // #887\n\t\t\tthis.firePointEvent('mouseOut');\n\t\n\t\t\tthis.setState();\n\t\t\tchart.hoverPoint = null;\n\t\t}\n\t},\n\n\t/**\n\t * Extendable method for formatting each point's tooltip line\n\t *\n\t * @return {String} A string to be concatenated in to the common tooltip text\n\t */\n\ttooltipFormatter: function (pointFormat) {\n\t\t\n\t\t// Insert options for valueDecimals, valuePrefix, and valueSuffix\n\t\tvar series = this.series,\n\t\t\tseriesTooltipOptions = series.tooltipOptions,\n\t\t\tvalueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),\n\t\t\tvaluePrefix = seriesTooltipOptions.valuePrefix || '',\n\t\t\tvalueSuffix = seriesTooltipOptions.valueSuffix || '';\n\t\t\t\n\t\t// Loop over the point array map and replace unformatted values with sprintf formatting markup\n\t\teach(series.pointArrayMap || ['y'], function (key) {\n\t\t\tkey = '{point.' + key; // without the closing bracket\n\t\t\tif (valuePrefix || valueSuffix) {\n\t\t\t\tpointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);\n\t\t\t}\n\t\t\tpointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');\n\t\t});\n\t\t\n\t\treturn format(pointFormat, {\n\t\t\tpoint: this,\n\t\t\tseries: this.series\n\t\t});\n\t},\n\n\t/**\n\t * Update the point with new options (typically x/y data) and optionally redraw the series.\n\t *\n\t * @param {Object} options Point options as defined in the series.data array\n\t * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n\t *    configuration\n\t *\n\t */\n\tupdate: function (options, redraw, animation) {\n\t\tvar point = this,\n\t\t\tseries = point.series,\n\t\t\tgraphic = point.graphic,\n\t\t\ti,\n\t\t\tdata = series.data,\n\t\t\tchart = series.chart,\n\t\t\tseriesOptions = series.options;\n\n\t\tredraw = pick(redraw, true);\n\n\t\t// fire the event with a default handler of doing the update\n\t\tpoint.firePointEvent('update', { options: options }, function () {\n\n\t\t\tpoint.applyOptions(options);\n\n\t\t\t// update visuals\n\t\t\tif (isObject(options)) {\n\t\t\t\tseries.getAttribs();\n\t\t\t\tif (graphic) {\n\t\t\t\t\tif (options.marker && options.marker.symbol) {\n\t\t\t\t\t\tpoint.graphic = graphic.destroy();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgraphic.attr(point.pointAttr[point.state || '']);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// record changes in the parallel arrays\n\t\t\ti = inArray(point, data);\n\t\t\tseries.xData[i] = point.x;\n\t\t\tseries.yData[i] = series.toYData ? series.toYData(point) : point.y;\n\t\t\tseries.zData[i] = point.z;\n\t\t\tseriesOptions.data[i] = point.options;\n\n\t\t\t// redraw\n\t\t\tseries.isDirty = series.isDirtyData = true;\n\t\t\tif (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n\t\t\t\tchart.isDirtyBox = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (seriesOptions.legendType === 'point') { // #1831, #1885\n\t\t\t\tchart.legend.destroyItem(point);\n\t\t\t}\n\t\t\tif (redraw) {\n\t\t\t\tchart.redraw(animation);\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Remove a point and optionally redraw the series and if necessary the axes\n\t * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n\t *    configuration\n\t */\n\tremove: function (redraw, animation) {\n\t\tvar point = this,\n\t\t\tseries = point.series,\n\t\t\tpoints = series.points,\n\t\t\tchart = series.chart,\n\t\t\ti,\n\t\t\tdata = series.data;\n\n\t\tsetAnimation(animation, chart);\n\t\tredraw = pick(redraw, true);\n\n\t\t// fire the event with a default handler of removing the point\n\t\tpoint.firePointEvent('remove', null, function () {\n\n\t\t\t// splice all the parallel arrays\n\t\t\ti = inArray(point, data);\n\t\t\tif (data.length === points.length) {\n\t\t\t\tpoints.splice(i, 1);\t\t\t\n\t\t\t}\n\t\t\tdata.splice(i, 1);\n\t\t\tseries.options.data.splice(i, 1);\n\t\t\tseries.xData.splice(i, 1);\n\t\t\tseries.yData.splice(i, 1);\n\t\t\tseries.zData.splice(i, 1);\n\n\t\t\tpoint.destroy();\n\n\n\t\t\t// redraw\n\t\t\tseries.isDirty = true;\n\t\t\tseries.isDirtyData = true;\n\t\t\tif (redraw) {\n\t\t\t\tchart.redraw();\n\t\t\t}\n\t\t});\n\n\n\t},\n\n\t/**\n\t * Fire an event on the Point object. Must not be renamed to fireEvent, as this\n\t * causes a name clash in MooTools\n\t * @param {String} eventType\n\t * @param {Object} eventArgs Additional event arguments\n\t * @param {Function} defaultFunction Default event handler\n\t */\n\tfirePointEvent: function (eventType, eventArgs, defaultFunction) {\n\t\tvar point = this,\n\t\t\tseries = this.series,\n\t\t\tseriesOptions = series.options;\n\n\t\t// load event handlers on demand to save time on mouseover/out\n\t\tif (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {\n\t\t\tthis.importEvents();\n\t\t}\n\n\t\t// add default handler if in selection mode\n\t\tif (eventType === 'click' && seriesOptions.allowPointSelect) {\n\t\t\tdefaultFunction = function (event) {\n\t\t\t\t// Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera\n\t\t\t\tpoint.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n\t\t\t};\n\t\t}\n\n\t\tfireEvent(this, eventType, eventArgs, defaultFunction);\n\t},\n\t/**\n\t * Import events from the series' and point's options. Only do it on\n\t * demand, to save processing time on hovering.\n\t */\n\timportEvents: function () {\n\t\tif (!this.hasImportedEvents) {\n\t\t\tvar point = this,\n\t\t\t\toptions = merge(point.series.options.point, point.options),\n\t\t\t\tevents = options.events,\n\t\t\t\teventType;\n\n\t\t\tpoint.events = events;\n\n\t\t\tfor (eventType in events) {\n\t\t\t\taddEvent(point, eventType, events[eventType]);\n\t\t\t}\n\t\t\tthis.hasImportedEvents = true;\n\n\t\t}\n\t},\n\n\t/**\n\t * Set the point's state\n\t * @param {String} state\n\t */\n\tsetState: function (state) {\n\t\tvar point = this,\n\t\t\tplotX = point.plotX,\n\t\t\tplotY = point.plotY,\n\t\t\tseries = point.series,\n\t\t\tstateOptions = series.options.states,\n\t\t\tmarkerOptions = defaultPlotOptions[series.type].marker && series.options.marker,\n\t\t\tnormalDisabled = markerOptions && !markerOptions.enabled,\n\t\t\tmarkerStateOptions = markerOptions && markerOptions.states[state],\n\t\t\tstateDisabled = markerStateOptions && markerStateOptions.enabled === false,\n\t\t\tstateMarkerGraphic = series.stateMarkerGraphic,\n\t\t\tpointMarker = point.marker || {},\n\t\t\tchart = series.chart,\n\t\t\tradius,\n\t\t\tnewSymbol,\n\t\t\tpointAttr = point.pointAttr;\n\n\t\tstate = state || NORMAL_STATE; // empty string\n\n\t\tif (\n\t\t\t\t// already has this state\n\t\t\t\tstate === point.state ||\n\t\t\t\t// selected points don't respond to hover\n\t\t\t\t(point.selected && state !== SELECT_STATE) ||\n\t\t\t\t// series' state options is disabled\n\t\t\t\t(stateOptions[state] && stateOptions[state].enabled === false) ||\n\t\t\t\t// point marker's state options is disabled\n\t\t\t\t(state && (stateDisabled || (normalDisabled && !markerStateOptions.enabled)))\n\n\t\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// apply hover styles to the existing point\n\t\tif (point.graphic) {\n\t\t\tradius = markerOptions && point.graphic.symbolName && pointAttr[state].r;\n\t\t\tpoint.graphic.attr(merge(\n\t\t\t\tpointAttr[state],\n\t\t\t\tradius ? { // new symbol attributes (#507, #612)\n\t\t\t\t\tx: plotX - radius,\n\t\t\t\t\ty: plotY - radius,\n\t\t\t\t\twidth: 2 * radius,\n\t\t\t\t\theight: 2 * radius\n\t\t\t\t} : {}\n\t\t\t));\n\t\t} else {\n\t\t\t// if a graphic is not applied to each point in the normal state, create a shared\n\t\t\t// graphic for the hover state\n\t\t\tif (state && markerStateOptions) {\n\t\t\t\tradius = markerStateOptions.radius;\n\t\t\t\tnewSymbol = pointMarker.symbol || series.symbol;\n\n\t\t\t\t// If the point has another symbol than the previous one, throw away the \n\t\t\t\t// state marker graphic and force a new one (#1459)\n\t\t\t\tif (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {\t\t\t\t\n\t\t\t\t\tstateMarkerGraphic = stateMarkerGraphic.destroy();\n\t\t\t\t}\n\n\t\t\t\t// Add a new state marker graphic\n\t\t\t\tif (!stateMarkerGraphic) {\n\t\t\t\t\tseries.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(\n\t\t\t\t\t\tnewSymbol,\n\t\t\t\t\t\tplotX - radius,\n\t\t\t\t\t\tplotY - radius,\n\t\t\t\t\t\t2 * radius,\n\t\t\t\t\t\t2 * radius\n\t\t\t\t\t)\n\t\t\t\t\t.attr(pointAttr[state])\n\t\t\t\t\t.add(series.markerGroup);\n\t\t\t\t\tstateMarkerGraphic.currentSymbol = newSymbol;\n\t\t\t\t\n\t\t\t\t// Move the existing graphic\n\t\t\t\t} else {\n\t\t\t\t\tstateMarkerGraphic.attr({ // #1054\n\t\t\t\t\t\tx: plotX - radius,\n\t\t\t\t\t\ty: plotY - radius\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (stateMarkerGraphic) {\n\t\t\t\tstateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY) ? 'show' : 'hide']();\n\t\t\t}\n\t\t}\n\n\t\tpoint.state = state;\n\t}\n};\n\n/**\n * @classDescription The base function which all other series types inherit from. The data in the series is stored\n * in various arrays.\n *\n * - First, series.options.data contains all the original config options for\n * each point whether added by options or methods like series.addPoint.\n * - Next, series.data contains those values converted to points, but in case the series data length\n * exceeds the cropThreshold, or if the data is grouped, series.data doesn't contain all the points. It\n * only contains the points that have been created on demand.\n * - Then there's series.points that contains all currently visible point objects. In case of cropping,\n * the cropped-away points are not part of this array. The series.points array starts at series.cropStart\n * compared to series.data and series.options.data. If however the series data is grouped, these can't\n * be correlated one to one.\n * - series.xData and series.processedXData contain clean x values, equivalent to series.data and series.points.\n * - series.yData and series.processedYData contain clean x values, equivalent to series.data and series.points.\n *\n * @param {Object} chart\n * @param {Object} options\n */\nvar Series = function () {};\n\nSeries.prototype = {\n\n\tisCartesian: true,\n\ttype: 'line',\n\tpointClass: Point,\n\tsorted: true, // requires the data to be sorted\n\trequireSorting: true,\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n\t\tstroke: 'lineColor',\n\t\t'stroke-width': 'lineWidth',\n\t\tfill: 'fillColor',\n\t\tr: 'radius'\n\t},\n\tcolorCounter: 0,\n\tinit: function (chart, options) {\n\t\tvar series = this,\n\t\t\teventType,\n\t\t\tevents,\n\t\t\tchartSeries = chart.series;\n\n\t\tseries.chart = chart;\n\t\tseries.options = options = series.setOptions(options); // merge with plotOptions\n\t\tseries.linkedSeries = [];\n\n\t\t// bind the axes\n\t\tseries.bindAxes();\n\n\t\t// set some variables\n\t\textend(series, {\n\t\t\tname: options.name,\n\t\t\tstate: NORMAL_STATE,\n\t\t\tpointAttr: {},\n\t\t\tvisible: options.visible !== false, // true by default\n\t\t\tselected: options.selected === true // false by default\n\t\t});\n\t\t\n\t\t// special\n\t\tif (useCanVG) {\n\t\t\toptions.animation = false;\n\t\t}\n\n\t\t// register event listeners\n\t\tevents = options.events;\n\t\tfor (eventType in events) {\n\t\t\taddEvent(series, eventType, events[eventType]);\n\t\t}\n\t\tif (\n\t\t\t(events && events.click) ||\n\t\t\t(options.point && options.point.events && options.point.events.click) ||\n\t\t\toptions.allowPointSelect\n\t\t) {\n\t\t\tchart.runTrackerClick = true;\n\t\t}\n\n\t\tseries.getColor();\n\t\tseries.getSymbol();\n\n\t\t// set the data\n\t\tseries.setData(options.data, false);\n\t\t\n\t\t// Mark cartesian\n\t\tif (series.isCartesian) {\n\t\t\tchart.hasCartesianSeries = true;\n\t\t}\n\n\t\t// Register it in the chart\n\t\tchartSeries.push(series);\n\t\tseries._i = chartSeries.length - 1;\n\t\t\n\t\t// Sort series according to index option (#248, #1123)\n\t\tstableSort(chartSeries, function (a, b) {\n\t\t\treturn pick(a.options.index, a._i) - pick(b.options.index, a._i);\n\t\t});\n\t\teach(chartSeries, function (series, i) {\n\t\t\tseries.index = i;\n\t\t\tseries.name = series.name || 'Series ' + (i + 1);\n\t\t});\n\n\t},\n\t\n\t/**\n\t * Set the xAxis and yAxis properties of cartesian series, and register the series\n\t * in the axis.series array\n\t */\n\tbindAxes: function () {\n\t\tvar series = this,\n\t\t\tseriesOptions = series.options,\n\t\t\tchart = series.chart,\n\t\t\taxisOptions;\n\t\t\t\n\t\tif (series.isCartesian) {\n\t\t\t\n\t\t\teach(['xAxis', 'yAxis'], function (AXIS) { // repeat for xAxis and yAxis\n\t\t\t\t\n\t\t\t\teach(chart[AXIS], function (axis) { // loop through the chart's axis objects\n\t\t\t\t\t\n\t\t\t\t\taxisOptions = axis.options;\n\t\t\t\t\t\n\t\t\t\t\t// apply if the series xAxis or yAxis option mathches the number of the \n\t\t\t\t\t// axis, or if undefined, use the first axis\n\t\t\t\t\tif ((seriesOptions[AXIS] === axisOptions.index) ||\n\t\t\t\t\t\t\t(seriesOptions[AXIS] !== UNDEFINED && seriesOptions[AXIS] === axisOptions.id) ||\n\t\t\t\t\t\t\t(seriesOptions[AXIS] === UNDEFINED && axisOptions.index === 0)) {\n\t\t\t\t\t\t\n\t\t\t\t\t\t// register this series in the axis.series lookup\n\t\t\t\t\t\taxis.series.push(series);\n\t\t\t\t\t\t\n\t\t\t\t\t\t// set this series.xAxis or series.yAxis reference\n\t\t\t\t\t\tseries[AXIS] = axis;\n\t\t\t\t\t\t\n\t\t\t\t\t\t// mark dirty for redraw\n\t\t\t\t\t\taxis.isDirty = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// The series needs an X and an Y axis\n\t\t\t\tif (!series[AXIS]) {\n\t\t\t\t\terror(18, true);\n\t\t\t\t}\n\n\t\t\t});\n\t\t}\n\t},\n\n\n\t/**\n\t * Return an auto incremented x value based on the pointStart and pointInterval options.\n\t * This is only used if an x value is not given for the point that calls autoIncrement.\n\t */\n\tautoIncrement: function () {\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\txIncrement = series.xIncrement;\n\n\t\txIncrement = pick(xIncrement, options.pointStart, 0);\n\n\t\tseries.pointInterval = pick(series.pointInterval, options.pointInterval, 1);\n\n\t\tseries.xIncrement = xIncrement + series.pointInterval;\n\t\treturn xIncrement;\n\t},\n\n\t/**\n\t * Divide the series data into segments divided by null values.\n\t */\n\tgetSegments: function () {\n\t\tvar series = this,\n\t\t\tlastNull = -1,\n\t\t\tsegments = [],\n\t\t\ti,\n\t\t\tpoints = series.points,\n\t\t\tpointsLength = points.length;\n\n\t\tif (pointsLength) { // no action required for []\n\t\t\t\n\t\t\t// if connect nulls, just remove null points\n\t\t\tif (series.options.connectNulls) {\n\t\t\t\ti = pointsLength;\n\t\t\t\twhile (i--) {\n\t\t\t\t\tif (points[i].y === null) {\n\t\t\t\t\t\tpoints.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (points.length) {\n\t\t\t\t\tsegments = [points];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t// else, split on null points\n\t\t\t} else {\n\t\t\t\teach(points, function (point, i) {\n\t\t\t\t\tif (point.y === null) {\n\t\t\t\t\t\tif (i > lastNull + 1) {\n\t\t\t\t\t\t\tsegments.push(points.slice(lastNull + 1, i));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastNull = i;\n\t\t\t\t\t} else if (i === pointsLength - 1) { // last value\n\t\t\t\t\t\tsegments.push(points.slice(lastNull + 1, i + 1));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t\n\t\t// register it\n\t\tseries.segments = segments;\n\t},\n\t\n\t/**\n\t * Set the series options by merging from the options tree\n\t * @param {Object} itemOptions\n\t */\n\tsetOptions: function (itemOptions) {\n\t\tvar chart = this.chart,\n\t\t\tchartOptions = chart.options,\n\t\t\tplotOptions = chartOptions.plotOptions,\n\t\t\ttypeOptions = plotOptions[this.type],\n\t\t\toptions;\n\n\t\tthis.userOptions = itemOptions;\n\n\t\toptions = merge(\n\t\t\ttypeOptions,\n\t\t\tplotOptions.series,\n\t\t\titemOptions\n\t\t);\n\t\t\n\t\t// the tooltip options are merged between global and series specific options\n\t\tthis.tooltipOptions = merge(chartOptions.tooltip, options.tooltip);\n\t\t\n\t\t// Delte marker object if not allowed (#1125)\n\t\tif (typeOptions.marker === null) {\n\t\t\tdelete options.marker;\n\t\t}\n\t\t\n\t\treturn options;\n\n\t},\n\t/**\n\t * Get the series' color\n\t */\n\tgetColor: function () {\n\t\tvar options = this.options,\n\t\t\tuserOptions = this.userOptions,\n\t\t\tdefaultColors = this.chart.options.colors,\n\t\t\tcounters = this.chart.counters,\n\t\t\tcolor,\n\t\t\tcolorIndex;\n\n\t\tcolor = options.color || defaultPlotOptions[this.type].color;\n\n\t\tif (!color && !options.colorByPoint) {\n\t\t\tif (defined(userOptions._colorIndex)) { // after Series.update()\n\t\t\t\tcolorIndex = userOptions._colorIndex;\n\t\t\t} else {\n\t\t\t\tuserOptions._colorIndex = counters.color;\n\t\t\t\tcolorIndex = counters.color++;\n\t\t\t}\n\t\t\tcolor = defaultColors[colorIndex];\n\t\t}\n\t\t\n\t\tthis.color = color;\n\t\tcounters.wrapColor(defaultColors.length);\n\t},\n\t/**\n\t * Get the series' symbol\n\t */\n\tgetSymbol: function () {\n\t\tvar series = this,\n\t\t\tuserOptions = series.userOptions,\n\t\t\tseriesMarkerOption = series.options.marker,\n\t\t\tchart = series.chart,\n\t\t\tdefaultSymbols = chart.options.symbols,\n\t\t\tcounters = chart.counters,\n\t\t\tsymbolIndex;\n\n\t\tseries.symbol = seriesMarkerOption.symbol;\n\t\tif (!series.symbol) {\n\t\t\tif (defined(userOptions._symbolIndex)) { // after Series.update()\n\t\t\t\tsymbolIndex = userOptions._symbolIndex;\n\t\t\t} else {\n\t\t\t\tuserOptions._symbolIndex = counters.symbol;\n\t\t\t\tsymbolIndex = counters.symbol++;\n\t\t\t}\n\t\t\tseries.symbol = defaultSymbols[symbolIndex];\n\t\t}\n\n\t\t// don't substract radius in image symbols (#604)\n\t\tif (/^url/.test(series.symbol)) {\n\t\t\tseriesMarkerOption.radius = 0;\n\t\t}\n\t\tcounters.wrapSymbol(defaultSymbols.length);\n\t},\n\n\t/**\n\t * Get the series' symbol in the legend. This method should be overridable to create custom \n\t * symbols through Highcharts.seriesTypes[type].prototype.drawLegendSymbols.\n\t * \n\t * @param {Object} legend The legend object\n\t */\n\tdrawLegendSymbol: function (legend) {\n\t\t\n\t\tvar options = this.options,\n\t\t\tmarkerOptions = options.marker,\n\t\t\tradius,\n\t\t\tlegendOptions = legend.options,\n\t\t\tlegendSymbol,\n\t\t\tsymbolWidth = legendOptions.symbolWidth,\n\t\t\trenderer = this.chart.renderer,\n\t\t\tlegendItemGroup = this.legendGroup,\n\t\t\tverticalCenter = legend.baseline - mathRound(renderer.fontMetrics(legendOptions.itemStyle.fontSize).b * 0.3),\n\t\t\tattr;\n\t\t\t\n\t\t// Draw the line\n\t\tif (options.lineWidth) {\n\t\t\tattr = {\n\t\t\t\t'stroke-width': options.lineWidth\n\t\t\t};\n\t\t\tif (options.dashStyle) {\n\t\t\t\tattr.dashstyle = options.dashStyle;\n\t\t\t}\n\t\t\tthis.legendLine = renderer.path([\n\t\t\t\tM,\n\t\t\t\t0,\n\t\t\t\tverticalCenter,\n\t\t\t\tL,\n\t\t\t\tsymbolWidth,\n\t\t\t\tverticalCenter\n\t\t\t])\n\t\t\t.attr(attr)\n\t\t\t.add(legendItemGroup);\n\t\t}\n\t\t\n\t\t// Draw the marker\n\t\tif (markerOptions && markerOptions.enabled) {\n\t\t\tradius = markerOptions.radius;\n\t\t\tthis.legendSymbol = legendSymbol = renderer.symbol(\n\t\t\t\tthis.symbol,\n\t\t\t\t(symbolWidth / 2) - radius,\n\t\t\t\tverticalCenter - radius,\n\t\t\t\t2 * radius,\n\t\t\t\t2 * radius\n\t\t\t)\n\t\t\t.add(legendItemGroup);\n\t\t\tlegendSymbol.isMarker = true;\n\t\t}\n\t},\n\n\t/**\n\t * Add a point dynamically after chart load time\n\t * @param {Object} options Point options as given in series.data\n\t * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\n\t * @param {Boolean} shift If shift is true, a point is shifted off the start\n\t *    of the series as one is appended to the end.\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n\t *    configuration\n\t */\n\taddPoint: function (options, redraw, shift, animation) {\n\t\tvar series = this,\n\t\t\tseriesOptions = series.options,\n\t\t\tdata = series.data,\n\t\t\tgraph = series.graph,\n\t\t\tarea = series.area,\n\t\t\tchart = series.chart,\n\t\t\txData = series.xData,\n\t\t\tyData = series.yData,\n\t\t\tzData = series.zData,\n\t\t\tnames = series.names,\n\t\t\tcurrentShift = (graph && graph.shift) || 0,\n\t\t\tdataOptions = seriesOptions.data,\n\t\t\tpoint,\n\t\t\tisInTheMiddle,\n\t\t\tx,\n\t\t\ti;\n\n\t\tsetAnimation(animation, chart);\n\n\t\t// Make graph animate sideways\n\t\tif (shift) {\n\t\t\teach([graph, area, series.graphNeg, series.areaNeg], function (shape) {\n\t\t\t\tif (shape) {\n\t\t\t\t\tshape.shift = currentShift + 1;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (area) {\n\t\t\tarea.isArea = true; // needed in animation, both with and without shift\n\t\t}\n\t\t\n\t\t// Optional redraw, defaults to true\n\t\tredraw = pick(redraw, true);\n\n\t\t// Get options and push the point to xData, yData and series.options. In series.generatePoints\n\t\t// the Point instance will be created on demand and pushed to the series.data array.\n\t\tpoint = { series: series };\n\t\tseries.pointClass.prototype.applyOptions.apply(point, [options]);\n\t\tx = point.x;\n\n\t\t// Get the insertion point\n\t\ti = xData.length;\n\t\tif (series.requireSorting && x < xData[i - 1]) {\n\t\t\tisInTheMiddle = true;\n\t\t\twhile (i && xData[i - 1] > x) {\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\t\t\n\t\txData.splice(i, 0, x);\n\t\tyData.splice(i, 0, series.toYData ? series.toYData(point) : point.y);\n\t\tzData.splice(i, 0, point.z);\n\t\tif (names) {\n\t\t\tnames[x] = point.name;\n\t\t}\n\t\tdataOptions.splice(i, 0, options);\n\n\t\tif (isInTheMiddle) {\n\t\t\tseries.data.splice(i, 0, null);\n\t\t\tseries.processData();\n\t\t}\n\t\t\n\t\t// Generate points to be added to the legend (#1329) \n\t\tif (seriesOptions.legendType === 'point') {\n\t\t\tseries.generatePoints();\n\t\t}\n\n\t\t// Shift the first point off the parallel arrays\n\t\t// todo: consider series.removePoint(i) method\n\t\tif (shift) {\n\t\t\tif (data[0] && data[0].remove) {\n\t\t\t\tdata[0].remove(false);\n\t\t\t} else {\n\t\t\t\tdata.shift();\n\t\t\t\txData.shift();\n\t\t\t\tyData.shift();\n\t\t\t\tzData.shift();\n\t\t\t\tdataOptions.shift();\n\t\t\t}\n\t\t}\n\n\t\t// redraw\n\t\tseries.isDirty = true;\n\t\tseries.isDirtyData = true;\n\t\tif (redraw) {\n\t\t\tseries.getAttribs(); // #1937\n\t\t\tchart.redraw();\n\t\t}\n\t},\n\n\t/**\n\t * Replace the series data with a new set of data\n\t * @param {Object} data\n\t * @param {Object} redraw\n\t */\n\tsetData: function (data, redraw) {\n\t\tvar series = this,\n\t\t\toldData = series.points,\n\t\t\toptions = series.options,\n\t\t\tchart = series.chart,\n\t\t\tfirstPoint = null,\n\t\t\txAxis = series.xAxis,\n\t\t\tnames = xAxis && xAxis.categories && !xAxis.categories.length ? [] : null,\n\t\t\ti;\n\n\t\t// reset properties\n\t\tseries.xIncrement = null;\n\t\tseries.pointRange = xAxis && xAxis.categories ? 1 : options.pointRange;\n\n\t\tseries.colorCounter = 0; // for series with colorByPoint (#1547)\n\t\t\n\t\t// parallel arrays\n\t\tvar xData = [],\n\t\t\tyData = [],\n\t\t\tzData = [],\n\t\t\tdataLength = data ? data.length : [],\n\t\t\tturboThreshold = pick(options.turboThreshold, 1000),\n\t\t\tpt,\n\t\t\tpointArrayMap = series.pointArrayMap,\n\t\t\tvalueCount = pointArrayMap && pointArrayMap.length,\n\t\t\thasToYData = !!series.toYData;\n\n\t\t// In turbo mode, only one- or twodimensional arrays of numbers are allowed. The\n\t\t// first value is tested, and we assume that all the rest are defined the same\n\t\t// way. Although the 'for' loops are similar, they are repeated inside each\n\t\t// if-else conditional for max performance.\n\t\tif (turboThreshold && dataLength > turboThreshold) { \n\t\t\t\n\t\t\t// find the first non-null point\n\t\t\ti = 0;\n\t\t\twhile (firstPoint === null && i < dataLength) {\n\t\t\t\tfirstPoint = data[i];\n\t\t\t\ti++;\n\t\t\t}\n\t\t\n\t\t\n\t\t\tif (isNumber(firstPoint)) { // assume all points are numbers\n\t\t\t\tvar x = pick(options.pointStart, 0),\n\t\t\t\t\tpointInterval = pick(options.pointInterval, 1);\n\n\t\t\t\tfor (i = 0; i < dataLength; i++) {\n\t\t\t\t\txData[i] = x;\n\t\t\t\t\tyData[i] = data[i];\n\t\t\t\t\tx += pointInterval;\n\t\t\t\t}\n\t\t\t\tseries.xIncrement = x;\n\t\t\t} else if (isArray(firstPoint)) { // assume all points are arrays\n\t\t\t\tif (valueCount) { // [x, low, high] or [x, o, h, l, c]\n\t\t\t\t\tfor (i = 0; i < dataLength; i++) {\n\t\t\t\t\t\tpt = data[i];\n\t\t\t\t\t\txData[i] = pt[0];\n\t\t\t\t\t\tyData[i] = pt.slice(1, valueCount + 1);\n\t\t\t\t\t}\n\t\t\t\t} else { // [x, y]\n\t\t\t\t\tfor (i = 0; i < dataLength; i++) {\n\t\t\t\t\t\tpt = data[i];\n\t\t\t\t\t\txData[i] = pt[0];\n\t\t\t\t\t\tyData[i] = pt[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terror(12); // Highcharts expects configs to be numbers or arrays in turbo mode\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0; i < dataLength; i++) {\n\t\t\t\tif (data[i] !== UNDEFINED) { // stray commas in oldIE\n\t\t\t\t\tpt = { series: series };\n\t\t\t\t\tseries.pointClass.prototype.applyOptions.apply(pt, [data[i]]);\n\t\t\t\t\txData[i] = pt.x;\n\t\t\t\t\tyData[i] = hasToYData ? series.toYData(pt) : pt.y;\n\t\t\t\t\tzData[i] = pt.z;\n\t\t\t\t\tif (names && pt.name) {\n\t\t\t\t\t\tnames[pt.x] = pt.name; // #2046\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Forgetting to cast strings to numbers is a common caveat when handling CSV or JSON\t\t\n\t\tif (isString(yData[0])) {\n\t\t\terror(14, true);\n\t\t} \n\n\t\tseries.data = [];\n\t\tseries.options.data = data;\n\t\tseries.xData = xData;\n\t\tseries.yData = yData;\n\t\tseries.zData = zData;\n\t\tseries.names = names;\n\n\t\t// destroy old points\n\t\ti = (oldData && oldData.length) || 0;\n\t\twhile (i--) {\n\t\t\tif (oldData[i] && oldData[i].destroy) {\n\t\t\t\toldData[i].destroy();\n\t\t\t}\n\t\t}\n\n\t\t// reset minRange (#878)\n\t\tif (xAxis) {\n\t\t\txAxis.minRange = xAxis.userMinRange;\n\t\t}\n\n\t\t// redraw\n\t\tseries.isDirty = series.isDirtyData = chart.isDirtyBox = true;\n\t\tif (pick(redraw, true)) {\n\t\t\tchart.redraw(false);\n\t\t}\n\t},\n\n\t/**\n\t * Remove a series and optionally redraw the chart\n\t *\n\t * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\n\t *    configuration\n\t */\n\n\tremove: function (redraw, animation) {\n\t\tvar series = this,\n\t\t\tchart = series.chart;\n\t\tredraw = pick(redraw, true);\n\n\t\tif (!series.isRemoving) {  /* prevent triggering native event in jQuery\n\t\t\t\t(calling the remove function from the remove event) */\n\t\t\tseries.isRemoving = true;\n\n\t\t\t// fire the event with a default handler of removing the point\n\t\t\tfireEvent(series, 'remove', null, function () {\n\n\n\t\t\t\t// destroy elements\n\t\t\t\tseries.destroy();\n\n\n\t\t\t\t// redraw\n\t\t\t\tchart.isDirtyLegend = chart.isDirtyBox = true;\n\t\t\t\tchart.linkSeries();\n\t\t\t\t\n\t\t\t\tif (redraw) {\n\t\t\t\t\tchart.redraw(animation);\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\t\tseries.isRemoving = false;\n\t},\n\n\t/**\n\t * Process the data by cropping away unused data points if the series is longer\n\t * than the crop threshold. This saves computing time for lage series.\n\t */\n\tprocessData: function (force) {\n\t\tvar series = this,\n\t\t\tprocessedXData = series.xData, // copied during slice operation below\n\t\t\tprocessedYData = series.yData,\n\t\t\tdataLength = processedXData.length,\n\t\t\tcroppedData,\n\t\t\tcropStart = 0,\n\t\t\tcropped,\n\t\t\tdistance,\n\t\t\tclosestPointRange,\n\t\t\txAxis = series.xAxis,\n\t\t\ti, // loop variable\n\t\t\toptions = series.options,\n\t\t\tcropThreshold = options.cropThreshold,\n\t\t\tisCartesian = series.isCartesian;\n\n\t\t// If the series data or axes haven't changed, don't go through this. Return false to pass\n\t\t// the message on to override methods like in data grouping. \n\t\tif (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\n\t\t// optionally filter out points outside the plot area\n\t\tif (isCartesian && series.sorted && (!cropThreshold || dataLength > cropThreshold || series.forceCrop)) {\n\t\t\tvar min = xAxis.min,\n\t\t\t\tmax = xAxis.max;\n\n\t\t\t// it's outside current extremes\n\t\t\tif (processedXData[dataLength - 1] < min || processedXData[0] > max) {\n\t\t\t\tprocessedXData = [];\n\t\t\t\tprocessedYData = [];\n\t\t\t\n\t\t\t// only crop if it's actually spilling out\n\t\t\t} else if (processedXData[0] < min || processedXData[dataLength - 1] > max) {\n\t\t\t\tcroppedData = this.cropData(series.xData, series.yData, min, max);\n\t\t\t\tprocessedXData = croppedData.xData;\n\t\t\t\tprocessedYData = croppedData.yData;\n\t\t\t\tcropStart = croppedData.start;\n\t\t\t\tcropped = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t// Find the closest distance between processed points\n\t\tfor (i = processedXData.length - 1; i >= 0; i--) {\n\t\t\tdistance = processedXData[i] - processedXData[i - 1];\n\t\t\tif (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {\n\t\t\t\tclosestPointRange = distance;\n\n\t\t\t// Unsorted data is not supported by the line tooltip, as well as data grouping and \n\t\t\t// navigation in Stock charts (#725) and width calculation of columns (#1900)\n\t\t\t} else if (distance < 0 && series.requireSorting) {\n\t\t\t\terror(15);\n\t\t\t}\n\t\t}\n\n\t\t// Record the properties\n\t\tseries.cropped = cropped; // undefined or true\n\t\tseries.cropStart = cropStart;\n\t\tseries.processedXData = processedXData;\n\t\tseries.processedYData = processedYData;\n\n\t\tif (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC\n\t\t\tseries.pointRange = closestPointRange || 1;\n\t\t}\n\t\tseries.closestPointRange = closestPointRange;\n\t\t\n\t},\n\n\t/**\n\t * Iterate over xData and crop values between min and max. Returns object containing crop start/end\n\t * cropped xData with corresponding part of yData, dataMin and dataMax within the cropped range\n\t */\n\tcropData: function (xData, yData, min, max) {\n\t\tvar dataLength = xData.length,\n\t\t\tcropStart = 0,\n\t\t\tcropEnd = dataLength,\n\t\t\tcropShoulder = pick(this.cropShoulder, 1), // line-type series need one point outside\n\t\t\ti;\n\n\t\t// iterate up to find slice start\n\t\tfor (i = 0; i < dataLength; i++) {\n\t\t\tif (xData[i] >= min) {\n\t\t\t\tcropStart = mathMax(0, i - cropShoulder);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// proceed to find slice end\n\t\tfor (; i < dataLength; i++) {\n\t\t\tif (xData[i] > max) {\n\t\t\t\tcropEnd = i + cropShoulder;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\txData: xData.slice(cropStart, cropEnd),\n\t\t\tyData: yData.slice(cropStart, cropEnd),\n\t\t\tstart: cropStart,\n\t\t\tend: cropEnd\n\t\t};\n\t},\n\n\n\t/**\n\t * Generate the data point after the data has been processed by cropping away\n\t * unused points and optionally grouped in Highcharts Stock.\n\t */\n\tgeneratePoints: function () {\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\tdataOptions = options.data,\n\t\t\tdata = series.data,\n\t\t\tdataLength,\n\t\t\tprocessedXData = series.processedXData,\n\t\t\tprocessedYData = series.processedYData,\n\t\t\tpointClass = series.pointClass,\n\t\t\tprocessedDataLength = processedXData.length,\n\t\t\tcropStart = series.cropStart || 0,\n\t\t\tcursor,\n\t\t\thasGroupedData = series.hasGroupedData,\n\t\t\tpoint,\n\t\t\tpoints = [],\n\t\t\ti;\n\n\t\tif (!data && !hasGroupedData) {\n\t\t\tvar arr = [];\n\t\t\tarr.length = dataOptions.length;\n\t\t\tdata = series.data = arr;\n\t\t}\n\n\t\tfor (i = 0; i < processedDataLength; i++) {\n\t\t\tcursor = cropStart + i;\n\t\t\tif (!hasGroupedData) {\n\t\t\t\tif (data[cursor]) {\n\t\t\t\t\tpoint = data[cursor];\n\t\t\t\t} else if (dataOptions[cursor] !== UNDEFINED) { // #970\n\t\t\t\t\tdata[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]);\n\t\t\t\t}\n\t\t\t\tpoints[i] = point;\n\t\t\t} else {\n\t\t\t\t// splat the y data in case of ohlc data array\n\t\t\t\tpoints[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));\n\t\t\t}\n\t\t}\n\n\t\t// Hide cropped-away points - this only runs when the number of points is above cropThreshold, or when\n\t\t// swithching view from non-grouped data to grouped data (#637)\t\n\t\tif (data && (processedDataLength !== (dataLength = data.length) || hasGroupedData)) {\n\t\t\tfor (i = 0; i < dataLength; i++) {\n\t\t\t\tif (i === cropStart && !hasGroupedData) { // when has grouped data, clear all points\n\t\t\t\t\ti += processedDataLength;\n\t\t\t\t}\n\t\t\t\tif (data[i]) {\n\t\t\t\t\tdata[i].destroyElements();\n\t\t\t\t\tdata[i].plotX = UNDEFINED; // #1003\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tseries.data = data;\n\t\tseries.points = points;\n\t},\n\n\t/**\n\t * Adds series' points value to corresponding stack\n\t */\n\tsetStackedPoints: function () {\n\t\tif (!this.options.stacking || (this.visible !== true && this.chart.options.chart.ignoreHiddenSeries !== false)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar series = this,\n\t\t\txData = series.processedXData,\n\t\t\tyData = series.processedYData,\n\t\t\tstackedYData = [],\n\t\t\tyDataLength = yData.length,\n\t\t\tseriesOptions = series.options,\n\t\t\tthreshold = seriesOptions.threshold,\n\t\t\tstackOption = seriesOptions.stack,\n\t\t\tstacking = seriesOptions.stacking,\n\t\t\tstackKey = series.stackKey,\n\t\t\tnegKey = '-' + stackKey,\n\t\t\tnegStacks = series.negStacks,\n\t\t\tyAxis = series.yAxis,\n\t\t\tstacks = yAxis.stacks,\n\t\t\toldStacks = yAxis.oldStacks,\n\t\t\tisNegative,\n\t\t\tstack,\n\t\t\tother,\n\t\t\tkey,\n\t\t\ti,\n\t\t\tx,\n\t\t\ty;\n\n\t\t// loop over the non-null y values and read them into a local array\n\t\tfor (i = 0; i < yDataLength; i++) {\n\t\t\tx = xData[i];\n\t\t\ty = yData[i];\n\n\t\t\t// Read stacked values into a stack based on the x value,\n\t\t\t// the sign of y and the stack key. Stacking is also handled for null values (#739)\n\t\t\tisNegative = negStacks && y < threshold;\n\t\t\tkey = isNegative ? negKey : stackKey;\n\n\t\t\t// Create empty object for this stack if it doesn't exist yet\n\t\t\tif (!stacks[key]) {\n\t\t\t\tstacks[key] = {};\n\t\t\t}\n\n\t\t\t// Initialize StackItem for this x\n\t\t\tif (!stacks[key][x]) {\n\t\t\t\tif (oldStacks[key] && oldStacks[key][x]) {\n\t\t\t\t\tstacks[key][x] = oldStacks[key][x];\n\t\t\t\t\tstacks[key][x].total = null;\n\t\t\t\t} else {\n\t\t\t\t\tstacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption, stacking);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If the StackItem doesn't exist, create it first\n\t\t\tstack = stacks[key][x];\n\t\t\tstack.points[series.index] = [stack.cum || 0];\n\n\t\t\t// Add value to the stack total\n\t\t\tif (stacking === 'percent') {\n\t\t\t\t\n\t\t\t\t// Percent stacked column, totals are the same for the positive and negative stacks\n\t\t\t\tother = isNegative ? stackKey : negKey;\n\t\t\t\tif (negStacks && stacks[other] && stacks[other][x]) {\n\t\t\t\t\tother = stacks[other][x];\n\t\t\t\t\tstack.total = other.total = mathMax(other.total, stack.total) + mathAbs(y) || 0;\n\n\t\t\t\t// Percent stacked areas\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\tstack.total += mathAbs(y) || 0;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tstack.total += y || 0;\n\t\t\t}\n\n\t\t\tstack.cum = (stack.cum || 0) + (y || 0);\n\n\t\t\tstack.points[series.index].push(stack.cum);\n\t\t\tstackedYData[i] = stack.cum;\n\n\t\t}\n\n\t\tif (stacking === 'percent') {\n\t\t\tyAxis.usePercentage = true;\n\t\t}\n\n\t\tthis.stackedYData = stackedYData; // To be used in getExtremes\n\t\t\n\t\t// Reset old stacks\n\t\tyAxis.oldStacks = {};\n\t},\n\n\t/**\n\t * Iterate over all stacks and compute the absolute values to percent\n\t */\n\tsetPercentStacks: function () {\n\t\tvar series = this,\n\t\t\tstackKey = series.stackKey,\n\t\t\tstacks = series.yAxis.stacks;\n\t\t\n\t\teach([stackKey, '-' + stackKey], function (key) {\n\t\t\tvar i = series.xData.length,\n\t\t\t\tx,\n\t\t\t\tstack,\n\t\t\t\tpointExtremes,\n\t\t\t\ttotalFactor;\n\n\t\t\twhile (i--) {\n\t\t\t\tx = series.xData[i];\n\t\t\t\tstack = stacks[key] && stacks[key][x];\n\t\t\t\tpointExtremes = stack && stack.points[series.index];\n\t\t\t\tif (pointExtremes) {\n\t\t\t\t\ttotalFactor = stack.total ? 100 / stack.total : 0;\n\t\t\t\t\tpointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor); // Y bottom value\n\t\t\t\t\tpointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor); // Y value\n\t\t\t\t\tseries.stackedYData[i] = pointExtremes[1];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Calculate Y extremes for visible data\n\t */\n\tgetExtremes: function () {\n\t\tvar xAxis = this.xAxis,\n\t\t\tyAxis = this.yAxis,\n\t\t\txData = this.processedXData,\n\t\t\tyData = this.stackedYData || this.processedYData,\n\t\t\tyDataLength = yData.length,\n\t\t\tactiveYData = [],\n\t\t\tactiveCounter = 0,\n\t\t\txExtremes = xAxis.getExtremes(), // #2117, need to compensate for log X axis\n\t\t\txMin = xExtremes.min,\n\t\t\txMax = xExtremes.max,\n\t\t\tvalidValue,\n\t\t\twithinRange,\n\t\t\tdataMin,\n\t\t\tdataMax,\n\t\t\tx,\n\t\t\ty,\n\t\t\ti,\n\t\t\tj;\n\n\t\tfor (i = 0; i < yDataLength; i++) {\n\t\t\t\n\t\t\tx = xData[i];\n\t\t\ty = yData[i];\n\n\t\t\t// For points within the visible range, including the first point outside the\n\t\t\t// visible range, consider y extremes\n\t\t\tvalidValue = y !== null && y !== UNDEFINED && (!yAxis.isLog || (y.length || y > 0));\n\t\t\twithinRange = this.getExtremesFromAll || this.cropped || ((xData[i + 1] || x) >= xMin && \n\t\t\t\t(xData[i - 1] || x) <= xMax);\n\n\t\t\tif (validValue && withinRange) {\n\n\t\t\t\tj = y.length;\n\t\t\t\tif (j) { // array, like ohlc or range data\n\t\t\t\t\twhile (j--) {\n\t\t\t\t\t\tif (y[j] !== null) {\n\t\t\t\t\t\t\tactiveYData[activeCounter++] = y[j];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tactiveYData[activeCounter++] = y;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.dataMin = pick(dataMin, arrayMin(activeYData));\n\t\tthis.dataMax = pick(dataMax, arrayMax(activeYData));\n\t},\n\n\t/**\n\t * Translate data points from raw data values to chart specific positioning data\n\t * needed later in drawPoints, drawGraph and drawTracker.\n\t */\n\ttranslate: function () {\n\t\tif (!this.processedXData) { // hidden series\n\t\t\tthis.processData();\n\t\t}\n\t\tthis.generatePoints();\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\tstacking = options.stacking,\n\t\t\txAxis = series.xAxis,\n\t\t\tcategories = xAxis.categories,\n\t\t\tyAxis = series.yAxis,\n\t\t\tpoints = series.points,\n\t\t\tdataLength = points.length,\n\t\t\thasModifyValue = !!series.modifyValue,\n\t\t\ti,\n\t\t\tpointPlacement = options.pointPlacement,\n\t\t\tdynamicallyPlaced = pointPlacement === 'between' || isNumber(pointPlacement),\n\t\t\tthreshold = options.threshold;\n\n\t\t\n\t\t// Translate each point\n\t\tfor (i = 0; i < dataLength; i++) {\n\t\t\tvar point = points[i],\n\t\t\t\txValue = point.x,\n\t\t\t\tyValue = point.y,\n\t\t\t\tyBottom = point.low,\n\t\t\t\tstack = yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey],\n\t\t\t\tpointStack,\n\t\t\t\tstackValues;\n\n\t\t\t// Discard disallowed y values for log axes\n\t\t\tif (yAxis.isLog && yValue <= 0) {\n\t\t\t\tpoint.y = yValue = null;\n\t\t\t}\n\t\t\t\n\t\t\t// Get the plotX translation\n\t\t\tpoint.plotX = xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags'); // Math.round fixes #591\n\t\t\t\n\n\t\t\t// Calculate the bottom y value for stacked series\n\t\t\tif (stacking && series.visible && stack && stack[xValue]) {\n\n\t\t\t\tpointStack = stack[xValue];\n\t\t\t\tstackValues = pointStack.points[series.index];\n\t\t\t\tyBottom = stackValues[0];\n\t\t\t\tyValue = stackValues[1];\n\n\t\t\t\tif (yBottom === 0) {\n\t\t\t\t\tyBottom = pick(threshold, yAxis.min);\n\t\t\t\t}\n\t\t\t\tif (yAxis.isLog && yBottom <= 0) { // #1200, #1232\n\t\t\t\t\tyBottom = null;\n\t\t\t\t}\n\n\t\t\t\tpoint.percentage = stacking === 'percent' && yValue;\n\t\t\t\tpoint.total = point.stackTotal = pointStack.total;\n\t\t\t\tpoint.stackY = yValue;\n\n\t\t\t\t// Place the stack label\n\t\t\t\tpointStack.setOffset(series.pointXOffset || 0, series.barW || 0);\n\t\t\t\t\n\t\t\t}\n\n\t\t\t// Set translated yBottom or remove it\n\t\t\tpoint.yBottom = defined(yBottom) ? \n\t\t\t\tyAxis.translate(yBottom, 0, 1, 0, 1) :\n\t\t\t\tnull;\n\t\t\t\t\n\t\t\t// general hook, used for Highstock compare mode\n\t\t\tif (hasModifyValue) {\n\t\t\t\tyValue = series.modifyValue(yValue, point);\n\t\t\t}\n\n\t\t\t// Set the the plotY value, reset it for redraws\n\t\t\tpoint.plotY = (typeof yValue === 'number' && yValue !== Infinity) ? \n\t\t\t\t//mathRound(yAxis.translate(yValue, 0, 1, 0, 1) * 10) / 10 : // Math.round fixes #591\n\t\t\t\tyAxis.translate(yValue, 0, 1, 0, 1) : \n\t\t\t\tUNDEFINED;\n\t\t\t\n\t\t\t// Set client related positions for mouse tracking\n\t\t\tpoint.clientX = dynamicallyPlaced ? xAxis.translate(xValue, 0, 0, 0, 1) : point.plotX; // #1514\n\t\t\t\t\n\t\t\tpoint.negative = point.y < (threshold || 0);\n\n\t\t\t// some API data\n\t\t\tpoint.category = categories && categories[point.x] !== UNDEFINED ?\n\t\t\t\tcategories[point.x] : point.x;\n\n\n\t\t}\n\n\t\t// now that we have the cropped data, build the segments\n\t\tseries.getSegments();\n\t},\n\t/**\n\t * Memoize tooltip texts and positions\n\t */\n\tsetTooltipPoints: function (renew) {\n\t\tvar series = this,\n\t\t\tpoints = [],\n\t\t\tpointsLength,\n\t\t\tlow,\n\t\t\thigh,\n\t\t\txAxis = series.xAxis,\n\t\t\txExtremes = xAxis && xAxis.getExtremes(),\n\t\t\taxisLength = xAxis ? (xAxis.tooltipLen || xAxis.len) : series.chart.plotSizeX, // tooltipLen and tooltipPosName used in polar\n\t\t\tpoint,\n\t\t\tpointX,\n\t\t\tnextPoint,\n\t\t\ti,\n\t\t\ttooltipPoints = []; // a lookup array for each pixel in the x dimension\n\n\t\t// don't waste resources if tracker is disabled\n\t\tif (series.options.enableMouseTracking === false) {\n\t\t\treturn;\n\t\t}\n\n\t\t// renew\n\t\tif (renew) {\n\t\t\tseries.tooltipPoints = null;\n\t\t}\n\n\t\t// concat segments to overcome null values\n\t\teach(series.segments || series.points, function (segment) {\n\t\t\tpoints = points.concat(segment);\n\t\t});\n\n\t\t// Reverse the points in case the X axis is reversed\n\t\tif (xAxis && xAxis.reversed) {\n\t\t\tpoints = points.reverse();\n\t\t}\n\n\t\t// Polar needs additional shaping\n\t\tif (series.orderTooltipPoints) {\n\t\t\tseries.orderTooltipPoints(points);\n\t\t}\n\n\t\t// Assign each pixel position to the nearest point\n\t\tpointsLength = points.length;\n\t\tfor (i = 0; i < pointsLength; i++) {\n\t\t\tpoint = points[i];\n\t\t\tpointX = point.x;\n\t\t\tif (pointX >= xExtremes.min && pointX <= xExtremes.max) { // #1149\n\t\t\t\tnextPoint = points[i + 1];\n\t\t\t\t\n\t\t\t\t// Set this range's low to the last range's high plus one\n\t\t\t\tlow = high === UNDEFINED ? 0 : high + 1;\n\t\t\t\t// Now find the new high\n\t\t\t\thigh = points[i + 1] ?\n\t\t\t\t\tmathMin(mathMax(0, mathFloor( // #2070\n\t\t\t\t\t\t(point.clientX + (nextPoint ? (nextPoint.wrappedClientX || nextPoint.clientX) : axisLength)) / 2\n\t\t\t\t\t)), axisLength) :\n\t\t\t\t\taxisLength;\n\n\t\t\t\twhile (low >= 0 && low <= high) {\n\t\t\t\t\ttooltipPoints[low++] = point;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tseries.tooltipPoints = tooltipPoints;\n\t},\n\n\t/**\n\t * Format the header of the tooltip\n\t */\n\ttooltipHeaderFormatter: function (point) {\n\t\tvar series = this,\n\t\t\ttooltipOptions = series.tooltipOptions,\n\t\t\txDateFormat = tooltipOptions.xDateFormat,\n\t\t\tdateTimeLabelFormats = tooltipOptions.dateTimeLabelFormats,\n\t\t\txAxis = series.xAxis,\n\t\t\tisDateTime = xAxis && xAxis.options.type === 'datetime',\n\t\t\theaderFormat = tooltipOptions.headerFormat,\n\t\t\tclosestPointRange = xAxis && xAxis.closestPointRange,\n\t\t\tn;\n\t\t\t\n\t\t// Guess the best date format based on the closest point distance (#568)\n\t\tif (isDateTime && !xDateFormat) {\n\t\t\tif (closestPointRange) {\n\t\t\t\tfor (n in timeUnits) {\n\t\t\t\t\tif (timeUnits[n] >= closestPointRange) {\n\t\t\t\t\t\txDateFormat = dateTimeLabelFormats[n];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\txDateFormat = dateTimeLabelFormats.day;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Insert the header date format if any\n\t\tif (isDateTime && xDateFormat && isNumber(point.key)) {\n\t\t\theaderFormat = headerFormat.replace('{point.key}', '{point.key:' + xDateFormat + '}');\n\t\t}\n\t\t\n\t\treturn format(headerFormat, {\n\t\t\tpoint: point,\n\t\t\tseries: series\n\t\t});\n\t},\n\n\t/**\n\t * Series mouse over handler\n\t */\n\tonMouseOver: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\thoverSeries = chart.hoverSeries;\n\n\t\t// set normal state to previous series\n\t\tif (hoverSeries && hoverSeries !== series) {\n\t\t\thoverSeries.onMouseOut();\n\t\t}\n\n\t\t// trigger the event, but to save processing time,\n\t\t// only if defined\n\t\tif (series.options.events.mouseOver) {\n\t\t\tfireEvent(series, 'mouseOver');\n\t\t}\n\n\t\t// hover this\n\t\tseries.setState(HOVER_STATE);\n\t\tchart.hoverSeries = series;\n\t},\n\n\t/**\n\t * Series mouse out handler\n\t */\n\tonMouseOut: function () {\n\t\t// trigger the event only if listeners exist\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\tchart = series.chart,\n\t\t\ttooltip = chart.tooltip,\n\t\t\thoverPoint = chart.hoverPoint;\n\n\t\t// trigger mouse out on the point, which must be in this series\n\t\tif (hoverPoint) {\n\t\t\thoverPoint.onMouseOut();\n\t\t}\n\n\t\t// fire the mouse out event\n\t\tif (series && options.events.mouseOut) {\n\t\t\tfireEvent(series, 'mouseOut');\n\t\t}\n\n\n\t\t// hide the tooltip\n\t\tif (tooltip && !options.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {\n\t\t\ttooltip.hide();\n\t\t}\n\n\t\t// set normal state\n\t\tseries.setState();\n\t\tchart.hoverSeries = null;\n\t},\n\n\t/**\n\t * Animate in the series\n\t */\n\tanimate: function (init) {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\tclipRect,\n\t\t\tmarkerClipRect,\n\t\t\tanimation = series.options.animation,\n\t\t\tclipBox = chart.clipBox,\n\t\t\tinverted = chart.inverted,\n\t\t\tsharedClipKey;\n\n\t\t// Animation option is set to true\n\t\tif (animation && !isObject(animation)) {\n\t\t\tanimation = defaultPlotOptions[series.type].animation;\n\t\t}\n\t\tsharedClipKey = '_sharedClip' + animation.duration + animation.easing;\n\n\t\t// Initialize the animation. Set up the clipping rectangle.\n\t\tif (init) { \n\t\t\t\n\t\t\t// If a clipping rectangle with the same properties is currently present in the chart, use that. \n\t\t\tclipRect = chart[sharedClipKey];\n\t\t\tmarkerClipRect = chart[sharedClipKey + 'm'];\n\t\t\tif (!clipRect) {\n\t\t\t\tchart[sharedClipKey] = clipRect = renderer.clipRect(\n\t\t\t\t\textend(clipBox, { width: 0 })\n\t\t\t\t);\n\t\t\t\t\n\t\t\t\tchart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(\n\t\t\t\t\t-99, // include the width of the first marker\n\t\t\t\t\tinverted ? -chart.plotLeft : -chart.plotTop, \n\t\t\t\t\t99,\n\t\t\t\t\tinverted ? chart.chartWidth : chart.chartHeight\n\t\t\t\t);\n\t\t\t}\n\t\t\tseries.group.clip(clipRect);\n\t\t\tseries.markerGroup.clip(markerClipRect);\n\t\t\tseries.sharedClipKey = sharedClipKey;\n\n\t\t// Run the animation\n\t\t} else { \n\t\t\tclipRect = chart[sharedClipKey];\n\t\t\tif (clipRect) {\n\t\t\t\tclipRect.animate({\n\t\t\t\t\twidth: chart.plotSizeX\n\t\t\t\t}, animation);\n\t\t\t\tchart[sharedClipKey + 'm'].animate({\n\t\t\t\t\twidth: chart.plotSizeX + 99\n\t\t\t\t}, animation);\n\t\t\t}\n\n\t\t\t// Delete this function to allow it only once\n\t\t\tseries.animate = null;\n\t\t\t\n\t\t\t// Call the afterAnimate function on animation complete (but don't overwrite the animation.complete option\n\t\t\t// which should be available to the user).\n\t\t\tseries.animationTimeout = setTimeout(function () {\n\t\t\t\tseries.afterAnimate();\n\t\t\t}, animation.duration);\n\t\t}\n\t},\n\t\n\t/**\n\t * This runs after animation to land on the final plot clipping\n\t */\n\tafterAnimate: function () {\n\t\tvar chart = this.chart,\n\t\t\tsharedClipKey = this.sharedClipKey,\n\t\t\tgroup = this.group;\n\t\t\t\n\t\tif (group && this.options.clip !== false) {\n\t\t\tgroup.clip(chart.clipRect);\n\t\t\tthis.markerGroup.clip(); // no clip\n\t\t}\n\t\t\n\t\t// Remove the shared clipping rectancgle when all series are shown\t\t\n\t\tsetTimeout(function () {\n\t\t\tif (sharedClipKey && chart[sharedClipKey]) {\n\t\t\t\tchart[sharedClipKey] = chart[sharedClipKey].destroy();\n\t\t\t\tchart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();\n\t\t\t}\n\t\t}, 100);\n\t},\n\n\t/**\n\t * Draw the markers\n\t */\n\tdrawPoints: function () {\n\t\tvar series = this,\n\t\t\tpointAttr,\n\t\t\tpoints = series.points,\n\t\t\tchart = series.chart,\n\t\t\tplotX,\n\t\t\tplotY,\n\t\t\ti,\n\t\t\tpoint,\n\t\t\tradius,\n\t\t\tsymbol,\n\t\t\tisImage,\n\t\t\tgraphic,\n\t\t\toptions = series.options,\n\t\t\tseriesMarkerOptions = options.marker,\n\t\t\tpointMarkerOptions,\n\t\t\tenabled,\n\t\t\tisInside,\n\t\t\tmarkerGroup = series.markerGroup;\n\n\t\tif (seriesMarkerOptions.enabled || series._hasPointMarkers) {\n\t\t\t\n\t\t\ti = points.length;\n\t\t\twhile (i--) {\n\t\t\t\tpoint = points[i];\n\t\t\t\tplotX = mathFloor(point.plotX); // #1843\n\t\t\t\tplotY = point.plotY;\n\t\t\t\tgraphic = point.graphic;\n\t\t\t\tpointMarkerOptions = point.marker || {};\n\t\t\t\tenabled = (seriesMarkerOptions.enabled && pointMarkerOptions.enabled === UNDEFINED) || pointMarkerOptions.enabled;\n\t\t\t\tisInside = chart.isInsidePlot(mathRound(plotX), plotY, chart.inverted); // #1858\n\t\t\t\t\n\t\t\t\t// only draw the point if y is defined\n\t\t\t\tif (enabled && plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {\n\n\t\t\t\t\t// shortcuts\n\t\t\t\t\tpointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE];\n\t\t\t\t\tradius = pointAttr.r;\n\t\t\t\t\tsymbol = pick(pointMarkerOptions.symbol, series.symbol);\n\t\t\t\t\tisImage = symbol.indexOf('url') === 0;\n\n\t\t\t\t\tif (graphic) { // update\n\t\t\t\t\t\tgraphic\n\t\t\t\t\t\t\t.attr({ // Since the marker group isn't clipped, each individual marker must be toggled\n\t\t\t\t\t\t\t\tvisibility: isInside ? (hasSVG ? 'inherit' : VISIBLE) : HIDDEN\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.animate(extend({\n\t\t\t\t\t\t\t\tx: plotX - radius,\n\t\t\t\t\t\t\t\ty: plotY - radius\n\t\t\t\t\t\t\t}, graphic.symbolName ? { // don't apply to image symbols #507\n\t\t\t\t\t\t\t\twidth: 2 * radius,\n\t\t\t\t\t\t\t\theight: 2 * radius\n\t\t\t\t\t\t\t} : {}));\n\t\t\t\t\t} else if (isInside && (radius > 0 || isImage)) {\n\t\t\t\t\t\tpoint.graphic = graphic = chart.renderer.symbol(\n\t\t\t\t\t\t\tsymbol,\n\t\t\t\t\t\t\tplotX - radius,\n\t\t\t\t\t\t\tplotY - radius,\n\t\t\t\t\t\t\t2 * radius,\n\t\t\t\t\t\t\t2 * radius\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(pointAttr)\n\t\t\t\t\t\t.add(markerGroup);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} else if (graphic) {\n\t\t\t\t\tpoint.graphic = graphic.destroy(); // #1269\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t},\n\n\t/**\n\t * Convert state properties from API naming conventions to SVG attributes\n\t *\n\t * @param {Object} options API options object\n\t * @param {Object} base1 SVG attribute object to inherit from\n\t * @param {Object} base2 Second level SVG attribute object to inherit from\n\t */\n\tconvertAttribs: function (options, base1, base2, base3) {\n\t\tvar conversion = this.pointAttrToOptions,\n\t\t\tattr,\n\t\t\toption,\n\t\t\tobj = {};\n\n\t\toptions = options || {};\n\t\tbase1 = base1 || {};\n\t\tbase2 = base2 || {};\n\t\tbase3 = base3 || {};\n\n\t\tfor (attr in conversion) {\n\t\t\toption = conversion[attr];\n\t\t\tobj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]);\n\t\t}\n\t\treturn obj;\n\t},\n\n\t/**\n\t * Get the state attributes. Each series type has its own set of attributes\n\t * that are allowed to change on a point's state change. Series wide attributes are stored for\n\t * all series, and additionally point specific attributes are stored for all\n\t * points with individual marker options. If such options are not defined for the point,\n\t * a reference to the series wide attributes is stored in point.pointAttr.\n\t */\n\tgetAttribs: function () {\n\t\tvar series = this,\n\t\t\tseriesOptions = series.options,\n\t\t\tnormalOptions = defaultPlotOptions[series.type].marker ? seriesOptions.marker : seriesOptions,\n\t\t\tstateOptions = normalOptions.states,\n\t\t\tstateOptionsHover = stateOptions[HOVER_STATE],\n\t\t\tpointStateOptionsHover,\n\t\t\tseriesColor = series.color,\n\t\t\tnormalDefaults = {\n\t\t\t\tstroke: seriesColor,\n\t\t\t\tfill: seriesColor\n\t\t\t},\n\t\t\tpoints = series.points || [], // #927\n\t\t\ti,\n\t\t\tpoint,\n\t\t\tseriesPointAttr = [],\n\t\t\tpointAttr,\n\t\t\tpointAttrToOptions = series.pointAttrToOptions,\n\t\t\thasPointSpecificOptions,\n\t\t\tnegativeColor = seriesOptions.negativeColor,\n\t\t\tdefaultLineColor = normalOptions.lineColor,\n\t\t\tkey;\n\n\t\t// series type specific modifications\n\t\tif (seriesOptions.marker) { // line, spline, area, areaspline, scatter\n\n\t\t\t// if no hover radius is given, default to normal radius + 2\n\t\t\tstateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + 2;\n\t\t\tstateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + 1;\n\t\t\t\n\t\t} else { // column, bar, pie\n\n\t\t\t// if no hover color is given, brighten the normal color\n\t\t\tstateOptionsHover.color = stateOptionsHover.color ||\n\t\t\t\tColor(stateOptionsHover.color || seriesColor)\n\t\t\t\t\t.brighten(stateOptionsHover.brightness).get();\n\t\t}\n\n\t\t// general point attributes for the series normal state\n\t\tseriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults);\n\n\t\t// HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius\n\t\teach([HOVER_STATE, SELECT_STATE], function (state) {\n\t\t\tseriesPointAttr[state] =\n\t\t\t\t\tseries.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]);\n\t\t});\n\n\t\t// set it\n\t\tseries.pointAttr = seriesPointAttr;\n\n\n\t\t// Generate the point-specific attribute collections if specific point\n\t\t// options are given. If not, create a referance to the series wide point\n\t\t// attributes\n\t\ti = points.length;\n\t\twhile (i--) {\n\t\t\tpoint = points[i];\n\t\t\tnormalOptions = (point.options && point.options.marker) || point.options;\n\t\t\tif (normalOptions && normalOptions.enabled === false) {\n\t\t\t\tnormalOptions.radius = 0;\n\t\t\t}\n\t\t\t\n\t\t\tif (point.negative && negativeColor) {\n\t\t\t\tpoint.color = point.fillColor = negativeColor;\n\t\t\t}\n\t\t\t\n\t\t\thasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868\n\n\t\t\t// check if the point has specific visual options\n\t\t\tif (point.options) {\n\t\t\t\tfor (key in pointAttrToOptions) {\n\t\t\t\t\tif (defined(normalOptions[pointAttrToOptions[key]])) {\n\t\t\t\t\t\thasPointSpecificOptions = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// a specific marker config object is defined for the individual point:\n\t\t\t// create it's own attribute collection\n\t\t\tif (hasPointSpecificOptions) {\n\t\t\t\tnormalOptions = normalOptions || {};\n\t\t\t\tpointAttr = [];\n\t\t\t\tstateOptions = normalOptions.states || {}; // reassign for individual point\n\t\t\t\tpointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {};\n\n\t\t\t\t// Handle colors for column and pies\n\t\t\t\tif (!seriesOptions.marker) { // column, bar, point\n\t\t\t\t\t// if no hover color is given, brighten the normal color\n\t\t\t\t\tpointStateOptionsHover.color =\n\t\t\t\t\t\tColor(pointStateOptionsHover.color || point.color)\n\t\t\t\t\t\t\t.brighten(pointStateOptionsHover.brightness ||\n\t\t\t\t\t\t\t\tstateOptionsHover.brightness).get();\n\n\t\t\t\t}\n\n\t\t\t\t// normal point state inherits series wide normal state\n\t\t\t\tpointAttr[NORMAL_STATE] = series.convertAttribs(extend({\n\t\t\t\t\tcolor: point.color, // #868\n\t\t\t\t\tfillColor: point.color, // Individual point color or negative color markers (#2219)\n\t\t\t\t\tlineColor: defaultLineColor === null ? point.color : UNDEFINED // Bubbles take point color, line markers use white\n\t\t\t\t}, normalOptions), seriesPointAttr[NORMAL_STATE]);\n\n\t\t\t\t// inherit from point normal and series hover\n\t\t\t\tpointAttr[HOVER_STATE] = series.convertAttribs(\n\t\t\t\t\tstateOptions[HOVER_STATE],\n\t\t\t\t\tseriesPointAttr[HOVER_STATE],\n\t\t\t\t\tpointAttr[NORMAL_STATE]\n\t\t\t\t);\n\t\t\t\t\n\t\t\t\t// inherit from point normal and series hover\n\t\t\t\tpointAttr[SELECT_STATE] = series.convertAttribs(\n\t\t\t\t\tstateOptions[SELECT_STATE],\n\t\t\t\t\tseriesPointAttr[SELECT_STATE],\n\t\t\t\t\tpointAttr[NORMAL_STATE]\n\t\t\t\t);\n\n\n\t\t\t// no marker config object is created: copy a reference to the series-wide\n\t\t\t// attribute collection\n\t\t\t} else {\n\t\t\t\tpointAttr = seriesPointAttr;\n\t\t\t}\n\n\t\t\tpoint.pointAttr = pointAttr;\n\n\t\t}\n\n\t},\n\t/**\n\t * Update the series with a new set of options\n\t */\n\tupdate: function (newOptions, redraw) {\n\t\tvar chart = this.chart,\n\t\t\t// must use user options when changing type because this.options is merged\n\t\t\t// in with type specific plotOptions\n\t\t\toldOptions = this.userOptions,\n\t\t\toldType = this.type,\n\t\t\tproto = seriesTypes[oldType].prototype,\n\t\t\tn;\n\n\t\t// Do the merge, with some forced options\n\t\tnewOptions = merge(oldOptions, {\n\t\t\tanimation: false,\n\t\t\tindex: this.index,\n\t\t\tpointStart: this.xData[0] // when updating after addPoint\n\t\t}, { data: this.options.data }, newOptions);\n\n\t\t// Destroy the series and reinsert methods from the type prototype\n\t\tthis.remove(false);\n\t\tfor (n in proto) { // Overwrite series-type specific methods (#2270)\n\t\t\tif (proto.hasOwnProperty(n)) {\n\t\t\t\tthis[n] = UNDEFINED;\n\t\t\t}\n\t\t}\n\t\textend(this, seriesTypes[newOptions.type || oldType].prototype);\n\t\t\n\n\t\tthis.init(chart, newOptions);\n\t\tif (pick(redraw, true)) {\n\t\t\tchart.redraw(false);\n\t\t}\n\t},\n\n\t/**\n\t * Clear DOM objects and free up memory\n\t */\n\tdestroy: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\tissue134 = /AppleWebKit\\/533/.test(userAgent),\n\t\t\tdestroy,\n\t\t\ti,\n\t\t\tdata = series.data || [],\n\t\t\tpoint,\n\t\t\tprop,\n\t\t\taxis;\n\n\t\t// add event hook\n\t\tfireEvent(series, 'destroy');\n\n\t\t// remove all events\n\t\tremoveEvent(series);\n\t\t\n\t\t// erase from axes\n\t\teach(['xAxis', 'yAxis'], function (AXIS) {\n\t\t\taxis = series[AXIS];\n\t\t\tif (axis) {\n\t\t\t\terase(axis.series, series);\n\t\t\t\taxis.isDirty = axis.forceRedraw = true;\n\t\t\t\taxis.stacks = {}; // Rebuild stacks when updating (#2229)\n\t\t\t}\n\t\t});\n\n\t\t// remove legend items\n\t\tif (series.legendItem) {\n\t\t\tseries.chart.legend.destroyItem(series);\n\t\t}\n\n\t\t// destroy all points with their elements\n\t\ti = data.length;\n\t\twhile (i--) {\n\t\t\tpoint = data[i];\n\t\t\tif (point && point.destroy) {\n\t\t\t\tpoint.destroy();\n\t\t\t}\n\t\t}\n\t\tseries.points = null;\n\n\t\t// Clear the animation timeout if we are destroying the series during initial animation\n\t\tclearTimeout(series.animationTimeout);\n\n\t\t// destroy all SVGElements associated to the series\n\t\teach(['area', 'graph', 'dataLabelsGroup', 'group', 'markerGroup', 'tracker',\n\t\t\t\t'graphNeg', 'areaNeg', 'posClip', 'negClip'], function (prop) {\n\t\t\tif (series[prop]) {\n\n\t\t\t\t// issue 134 workaround\n\t\t\t\tdestroy = issue134 && prop === 'group' ?\n\t\t\t\t\t'hide' :\n\t\t\t\t\t'destroy';\n\n\t\t\t\tseries[prop][destroy]();\n\t\t\t}\n\t\t});\n\n\t\t// remove from hoverSeries\n\t\tif (chart.hoverSeries === series) {\n\t\t\tchart.hoverSeries = null;\n\t\t}\n\t\terase(chart.series, series);\n\n\t\t// clear all members\n\t\tfor (prop in series) {\n\t\t\tdelete series[prop];\n\t\t}\n\t},\n\n\t/**\n\t * Draw the data labels\n\t */\n\tdrawDataLabels: function () {\n\t\t\n\t\tvar series = this,\n\t\t\tseriesOptions = series.options,\n\t\t\toptions = seriesOptions.dataLabels,\n\t\t\tpoints = series.points,\n\t\t\tpointOptions,\n\t\t\tgeneralOptions,\n\t\t\tstr,\n\t\t\tdataLabelsGroup;\n\t\t\n\t\tif (options.enabled || series._hasPointLabels) {\n\t\t\t\t\t\t\n\t\t\t// Process default alignment of data labels for columns\n\t\t\tif (series.dlProcessOptions) {\n\t\t\t\tseries.dlProcessOptions(options);\n\t\t\t}\n\n\t\t\t// Create a separate group for the data labels to avoid rotation\n\t\t\tdataLabelsGroup = series.plotGroup(\n\t\t\t\t'dataLabelsGroup', \n\t\t\t\t'data-labels', \n\t\t\t\tseries.visible ? VISIBLE : HIDDEN, \n\t\t\t\toptions.zIndex || 6\n\t\t\t);\n\t\t\t\n\t\t\t// Make the labels for each point\n\t\t\tgeneralOptions = options;\n\t\t\teach(points, function (point) {\n\t\t\t\t\n\t\t\t\tvar enabled,\n\t\t\t\t\tdataLabel = point.dataLabel,\n\t\t\t\t\tlabelConfig,\n\t\t\t\t\tattr,\n\t\t\t\t\tname,\n\t\t\t\t\trotation,\n\t\t\t\t\tconnector = point.connector,\n\t\t\t\t\tisNew = true;\n\t\t\t\t\n\t\t\t\t// Determine if each data label is enabled\n\t\t\t\tpointOptions = point.options && point.options.dataLabels;\n\t\t\t\tenabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled); // #2282\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t// If the point is outside the plot area, destroy it. #678, #820\n\t\t\t\tif (dataLabel && !enabled) {\n\t\t\t\t\tpoint.dataLabel = dataLabel.destroy();\n\t\t\t\t\n\t\t\t\t// Individual labels are disabled if the are explicitly disabled \n\t\t\t\t// in the point options, or if they fall outside the plot area.\n\t\t\t\t} else if (enabled) {\n\t\t\t\t\t\n\t\t\t\t\t// Create individual options structure that can be extended without \n\t\t\t\t\t// affecting others\n\t\t\t\t\toptions = merge(generalOptions, pointOptions);\n\n\t\t\t\t\trotation = options.rotation;\n\t\t\t\t\t\n\t\t\t\t\t// Get the string\n\t\t\t\t\tlabelConfig = point.getLabelConfig();\n\t\t\t\t\tstr = options.format ?\n\t\t\t\t\t\tformat(options.format, labelConfig) : \n\t\t\t\t\t\toptions.formatter.call(labelConfig, options);\n\t\t\t\t\t\n\t\t\t\t\t// Determine the color\n\t\t\t\t\toptions.style.color = pick(options.color, options.style.color, series.color, 'black');\n\t\n\t\t\t\t\t\n\t\t\t\t\t// update existing label\n\t\t\t\t\tif (dataLabel) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (defined(str)) {\n\t\t\t\t\t\t\tdataLabel\n\t\t\t\t\t\t\t\t.attr({\n\t\t\t\t\t\t\t\t\ttext: str\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tisNew = false;\n\t\t\t\t\t\t\n\t\t\t\t\t\t} else { // #1437 - the label is shown conditionally\n\t\t\t\t\t\t\tpoint.dataLabel = dataLabel = dataLabel.destroy();\n\t\t\t\t\t\t\tif (connector) {\n\t\t\t\t\t\t\t\tpoint.connector = connector.destroy();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t// create new label\n\t\t\t\t\t} else if (defined(str)) {\n\t\t\t\t\t\tattr = {\n\t\t\t\t\t\t\t//align: align,\n\t\t\t\t\t\t\tfill: options.backgroundColor,\n\t\t\t\t\t\t\tstroke: options.borderColor,\n\t\t\t\t\t\t\t'stroke-width': options.borderWidth,\n\t\t\t\t\t\t\tr: options.borderRadius || 0,\n\t\t\t\t\t\t\trotation: rotation,\n\t\t\t\t\t\t\tpadding: options.padding,\n\t\t\t\t\t\t\tzIndex: 1\n\t\t\t\t\t\t};\n\t\t\t\t\t\t// Remove unused attributes (#947)\n\t\t\t\t\t\tfor (name in attr) {\n\t\t\t\t\t\t\tif (attr[name] === UNDEFINED) {\n\t\t\t\t\t\t\t\tdelete attr[name];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tdataLabel = point.dataLabel = series.chart.renderer[rotation ? 'text' : 'label']( // labels don't support rotation\n\t\t\t\t\t\t\tstr,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t-999,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\toptions.useHTML\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(attr)\n\t\t\t\t\t\t.css(options.style)\n\t\t\t\t\t\t.add(dataLabelsGroup)\n\t\t\t\t\t\t.shadow(options.shadow);\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (dataLabel) {\n\t\t\t\t\t\t// Now the data label is created and placed at 0,0, so we need to align it\n\t\t\t\t\t\tseries.alignDataLabel(point, dataLabel, options, null, isNew);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\t\n\t/**\n\t * Align each individual data label\n\t */\n\talignDataLabel: function (point, dataLabel, options, alignTo, isNew) {\n\t\tvar chart = this.chart,\n\t\t\tinverted = chart.inverted,\n\t\t\tplotX = pick(point.plotX, -999),\n\t\t\tplotY = pick(point.plotY, -999),\n\t\t\tbBox = dataLabel.getBBox(),\n\t\t\tvisible = this.visible && chart.isInsidePlot(point.plotX, point.plotY, inverted),\n\t\t\talignAttr; // the final position;\n\t\t\t\t\n\t\tif (visible) {\n\n\t\t\t// The alignment box is a singular point\n\t\t\talignTo = extend({\n\t\t\t\tx: inverted ? chart.plotWidth - plotY : plotX,\n\t\t\t\ty: mathRound(inverted ? chart.plotHeight - plotX : plotY),\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t}, alignTo);\n\t\t\t\n\t\t\t// Add the text size for alignment calculation\n\t\t\textend(options, {\n\t\t\t\twidth: bBox.width,\n\t\t\t\theight: bBox.height\n\t\t\t});\n\n\t\t\t// Allow a hook for changing alignment in the last moment, then do the alignment\n\t\t\tif (options.rotation) { // Fancy box alignment isn't supported for rotated text\n\t\t\t\talignAttr = {\n\t\t\t\t\talign: options.align,\n\t\t\t\t\tx: alignTo.x + options.x + alignTo.width / 2,\n\t\t\t\t\ty: alignTo.y + options.y + alignTo.height / 2\n\t\t\t\t};\n\t\t\t\tdataLabel[isNew ? 'attr' : 'animate'](alignAttr);\n\t\t\t} else {\n\t\t\t\tdataLabel.align(options, null, alignTo);\n\t\t\t\talignAttr = dataLabel.alignAttr;\n\n\t\t\t\t// Handle justify or crop\n\t\t\t\tif (pick(options.overflow, 'justify') === 'justify') { // docs: overflow: justify, also crop only applies when not justify\n\t\t\t\t\tthis.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);\n\t\t\t\t\n\t\t\t\t} else if (pick(options.crop, true)) {\n\t\t\t\t\t// Now check that the data label is within the plot area\n\t\t\t\t\tvisible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);\n\t\t\t\t\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t}\n\n\t\t// Show or hide based on the final aligned position\n\t\tif (!visible) {\n\t\t\tdataLabel.attr({ y: -999 });\n\t\t}\n\t\t\t\t\n\t},\n\t\n\t/**\n\t * If data labels fall partly outside the plot area, align them back in, in a way that\n\t * doesn't hide the point.\n\t */\n\tjustifyDataLabel: function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n\t\tvar chart = this.chart,\n\t\t\talign = options.align,\n\t\t\tverticalAlign = options.verticalAlign,\n\t\t\toff,\n\t\t\tjustified;\n\n\t\t// Off left\n\t\toff = alignAttr.x;\n\t\tif (off < 0) {\n\t\t\tif (align === 'right') {\n\t\t\t\toptions.align = 'left';\n\t\t\t} else {\n\t\t\t\toptions.x = -off;\n\t\t\t}\n\t\t\tjustified = true;\n\t\t}\n\n\t\t// Off right\n\t\toff = alignAttr.x + bBox.width;\n\t\tif (off > chart.plotWidth) {\n\t\t\tif (align === 'left') {\n\t\t\t\toptions.align = 'right';\n\t\t\t} else {\n\t\t\t\toptions.x = chart.plotWidth - off;\n\t\t\t}\n\t\t\tjustified = true;\n\t\t}\n\n\t\t// Off top\n\t\toff = alignAttr.y;\n\t\tif (off < 0) {\n\t\t\tif (verticalAlign === 'bottom') {\n\t\t\t\toptions.verticalAlign = 'top';\n\t\t\t} else {\n\t\t\t\toptions.y = -off;\n\t\t\t}\n\t\t\tjustified = true;\n\t\t}\n\n\t\t// Off bottom\n\t\toff = alignAttr.y + bBox.height;\n\t\tif (off > chart.plotHeight) {\n\t\t\tif (verticalAlign === 'top') {\n\t\t\t\toptions.verticalAlign = 'bottom';\n\t\t\t} else {\n\t\t\t\toptions.y = chart.plotHeight - off;\n\t\t\t}\n\t\t\tjustified = true;\n\t\t}\n\t\t\n\t\tif (justified) {\n\t\t\tdataLabel.placed = !isNew;\n\t\t\tdataLabel.align(options, null, alignTo);\n\t\t}\n\t},\n\t\n\t/**\n\t * Return the graph path of a segment\n\t */\n\tgetSegmentPath: function (segment) {\t\t\n\t\tvar series = this,\n\t\t\tsegmentPath = [],\n\t\t\tstep = series.options.step;\n\t\t\t\n\t\t// build the segment line\n\t\teach(segment, function (point, i) {\n\t\t\t\n\t\t\tvar plotX = point.plotX,\n\t\t\t\tplotY = point.plotY,\n\t\t\t\tlastPoint;\n\n\t\t\tif (series.getPointSpline) { // generate the spline as defined in the SplineSeries object\n\t\t\t\tsegmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i));\n\n\t\t\t} else {\n\n\t\t\t\t// moveTo or lineTo\n\t\t\t\tsegmentPath.push(i ? L : M);\n\n\t\t\t\t// step line?\n\t\t\t\tif (step && i) {\n\t\t\t\t\tlastPoint = segment[i - 1];\n\t\t\t\t\tif (step === 'right') {\n\t\t\t\t\t\tsegmentPath.push(\n\t\t\t\t\t\t\tlastPoint.plotX,\n\t\t\t\t\t\t\tplotY\n\t\t\t\t\t\t);\n\t\t\t\t\t\t\n\t\t\t\t\t} else if (step === 'center') {\n\t\t\t\t\t\tsegmentPath.push(\n\t\t\t\t\t\t\t(lastPoint.plotX + plotX) / 2,\n\t\t\t\t\t\t\tlastPoint.plotY,\n\t\t\t\t\t\t\t(lastPoint.plotX + plotX) / 2,\n\t\t\t\t\t\t\tplotY\n\t\t\t\t\t\t);\n\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsegmentPath.push(\n\t\t\t\t\t\t\tplotX,\n\t\t\t\t\t\t\tlastPoint.plotY\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// normal line to next point\n\t\t\t\tsegmentPath.push(\n\t\t\t\t\tpoint.plotX,\n\t\t\t\t\tpoint.plotY\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn segmentPath;\n\t},\n\n\t/**\n\t * Get the graph path\n\t */\n\tgetGraphPath: function () {\n\t\tvar series = this,\n\t\t\tgraphPath = [],\n\t\t\tsegmentPath,\n\t\t\tsinglePoints = []; // used in drawTracker\n\n\t\t// Divide into segments and build graph and area paths\n\t\teach(series.segments, function (segment) {\n\t\t\t\n\t\t\tsegmentPath = series.getSegmentPath(segment);\n\t\t\t\n\t\t\t// add the segment to the graph, or a single point for tracking\n\t\t\tif (segment.length > 1) {\n\t\t\t\tgraphPath = graphPath.concat(segmentPath);\n\t\t\t} else {\n\t\t\t\tsinglePoints.push(segment[0]);\n\t\t\t}\n\t\t});\n\n\t\t// Record it for use in drawGraph and drawTracker, and return graphPath\n\t\tseries.singlePoints = singlePoints;\n\t\tseries.graphPath = graphPath;\n\t\t\n\t\treturn graphPath;\n\t\t\n\t},\n\t\n\t/**\n\t * Draw the actual graph\n\t */\n\tdrawGraph: function () {\n\t\tvar series = this,\n\t\t\toptions = this.options,\n\t\t\tprops = [['graph', options.lineColor || this.color]],\n\t\t\tlineWidth = options.lineWidth,\n\t\t\tdashStyle =  options.dashStyle,\n\t\t\tgraphPath = this.getGraphPath(),\n\t\t\tnegativeColor = options.negativeColor;\n\t\t\t\n\t\tif (negativeColor) {\n\t\t\tprops.push(['graphNeg', negativeColor]);\n\t\t}\n\t\t\n\t\t// draw the graph\n\t\teach(props, function (prop, i) {\n\t\t\tvar graphKey = prop[0],\n\t\t\t\tgraph = series[graphKey],\n\t\t\t\tattribs;\n\t\t\t\n\t\t\tif (graph) {\n\t\t\t\tstop(graph); // cancel running animations, #459\n\t\t\t\tgraph.animate({ d: graphPath });\n\t\n\t\t\t} else if (lineWidth && graphPath.length) { // #1487\n\t\t\t\tattribs = {\n\t\t\t\t\tstroke: prop[1],\n\t\t\t\t\t'stroke-width': lineWidth,\n\t\t\t\t\tzIndex: 1 // #1069\n\t\t\t\t};\n\t\t\t\tif (dashStyle) {\n\t\t\t\t\tattribs.dashstyle = dashStyle;\n\t\t\t\t} else {\n\t\t\t\t\tattribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';\n\t\t\t\t}\n\n\t\t\t\tseries[graphKey] = series.chart.renderer.path(graphPath)\n\t\t\t\t\t.attr(attribs)\n\t\t\t\t\t.add(series.group)\n\t\t\t\t\t.shadow(!i && options.shadow);\n\t\t\t}\n\t\t});\n\t},\n\t\n\t/**\n\t * Clip the graphs into the positive and negative coloured graphs\n\t */\n\tclipNeg: function () {\n\t\tvar options = this.options,\n\t\t\tchart = this.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\tnegativeColor = options.negativeColor || options.negativeFillColor,\n\t\t\ttranslatedThreshold,\n\t\t\tposAttr,\n\t\t\tnegAttr,\n\t\t\tgraph = this.graph,\n\t\t\tarea = this.area,\n\t\t\tposClip = this.posClip,\n\t\t\tnegClip = this.negClip,\n\t\t\tchartWidth = chart.chartWidth,\n\t\t\tchartHeight = chart.chartHeight,\n\t\t\tchartSizeMax = mathMax(chartWidth, chartHeight),\n\t\t\tyAxis = this.yAxis,\n\t\t\tabove,\n\t\t\tbelow;\n\t\t\n\t\tif (negativeColor && (graph || area)) {\n\t\t\ttranslatedThreshold = mathRound(yAxis.toPixels(options.threshold || 0, true));\n\t\t\tabove = {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: chartSizeMax,\n\t\t\t\theight: translatedThreshold\n\t\t\t};\n\t\t\tbelow = {\n\t\t\t\tx: 0,\n\t\t\t\ty: translatedThreshold,\n\t\t\t\twidth: chartSizeMax,\n\t\t\t\theight: chartSizeMax\n\t\t\t};\n\t\t\t\n\t\t\tif (chart.inverted) {\n\n\t\t\t\tabove.height = below.y = chart.plotWidth - translatedThreshold;\n\t\t\t\tif (renderer.isVML) {\n\t\t\t\t\tabove = {\n\t\t\t\t\t\tx: chart.plotWidth - translatedThreshold - chart.plotLeft,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: chartWidth,\n\t\t\t\t\t\theight: chartHeight\n\t\t\t\t\t};\n\t\t\t\t\tbelow = {\n\t\t\t\t\t\tx: translatedThreshold + chart.plotLeft - chartWidth,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: chart.plotLeft + translatedThreshold,\n\t\t\t\t\t\theight: chartWidth\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (yAxis.reversed) {\n\t\t\t\tposAttr = below;\n\t\t\t\tnegAttr = above;\n\t\t\t} else {\n\t\t\t\tposAttr = above;\n\t\t\t\tnegAttr = below;\n\t\t\t}\n\t\t\n\t\t\tif (posClip) { // update\n\t\t\t\tposClip.animate(posAttr);\n\t\t\t\tnegClip.animate(negAttr);\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tthis.posClip = posClip = renderer.clipRect(posAttr);\n\t\t\t\tthis.negClip = negClip = renderer.clipRect(negAttr);\n\t\t\t\t\n\t\t\t\tif (graph && this.graphNeg) {\n\t\t\t\t\tgraph.clip(posClip);\n\t\t\t\t\tthis.graphNeg.clip(negClip);\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (area) {\n\t\t\t\t\tarea.clip(posClip);\n\t\t\t\t\tthis.areaNeg.clip(negClip);\n\t\t\t\t} \n\t\t\t} \n\t\t}\t\n\t},\n\n\t/**\n\t * Initialize and perform group inversion on series.group and series.markerGroup\n\t */\n\tinvertGroups: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart;\n\n\t\t// Pie, go away (#1736)\n\t\tif (!series.xAxis) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// A fixed size is needed for inversion to work\n\t\tfunction setInvert() {\t\t\t\n\t\t\tvar size = {\n\t\t\t\twidth: series.yAxis.len,\n\t\t\t\theight: series.xAxis.len\n\t\t\t};\n\t\t\t\n\t\t\teach(['group', 'markerGroup'], function (groupName) {\n\t\t\t\tif (series[groupName]) {\n\t\t\t\t\tseries[groupName].attr(size).invert();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\taddEvent(chart, 'resize', setInvert); // do it on resize\n\t\taddEvent(series, 'destroy', function () {\n\t\t\tremoveEvent(chart, 'resize', setInvert);\n\t\t});\n\n\t\t// Do it now\n\t\tsetInvert(); // do it now\n\t\t\n\t\t// On subsequent render and redraw, just do setInvert without setting up events again\n\t\tseries.invertGroups = setInvert;\n\t},\n\t\n\t/**\n\t * General abstraction for creating plot groups like series.group, series.dataLabelsGroup and \n\t * series.markerGroup. On subsequent calls, the group will only be adjusted to the updated plot size.\n\t */\n\tplotGroup: function (prop, name, visibility, zIndex, parent) {\n\t\tvar group = this[prop],\n\t\t\tisNew = !group;\n\t\t\n\t\t// Generate it on first call\n\t\tif (isNew) {\t\n\t\t\tthis[prop] = group = this.chart.renderer.g(name)\n\t\t\t\t.attr({\n\t\t\t\t\tvisibility: visibility,\n\t\t\t\t\tzIndex: zIndex || 0.1 // IE8 needs this\n\t\t\t\t})\n\t\t\t\t.add(parent);\n\t\t}\n\t\t// Place it on first and subsequent (redraw) calls\n\t\tgroup[isNew ? 'attr' : 'animate'](this.getPlotBox());\n\t\treturn group;\t\t\n\t},\n\n\t/**\n\t * Get the translation and scale for the plot area of this series\n\t */\n\tgetPlotBox: function () {\n\t\treturn {\n\t\t\ttranslateX: this.xAxis ? this.xAxis.left : this.chart.plotLeft, \n\t\t\ttranslateY: this.yAxis ? this.yAxis.top : this.chart.plotTop,\n\t\t\tscaleX: 1, // #1623\n\t\t\tscaleY: 1\n\t\t};\n\t},\n\t\n\t/**\n\t * Render the graph and markers\n\t */\n\trender: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\tgroup,\n\t\t\toptions = series.options,\n\t\t\tanimation = options.animation,\n\t\t\tdoAnimation = animation && !!series.animate && \n\t\t\t\tchart.renderer.isSVG, // this animation doesn't work in IE8 quirks when the group div is hidden,\n\t\t\t\t// and looks bad in other oldIE\n\t\t\tvisibility = series.visible ? VISIBLE : HIDDEN,\n\t\t\tzIndex = options.zIndex,\n\t\t\thasRendered = series.hasRendered,\n\t\t\tchartSeriesGroup = chart.seriesGroup;\n\t\t\n\t\t// the group\n\t\tgroup = series.plotGroup(\n\t\t\t'group', \n\t\t\t'series', \n\t\t\tvisibility, \n\t\t\tzIndex, \n\t\t\tchartSeriesGroup\n\t\t);\n\t\t\n\t\tseries.markerGroup = series.plotGroup(\n\t\t\t'markerGroup', \n\t\t\t'markers', \n\t\t\tvisibility, \n\t\t\tzIndex, \n\t\t\tchartSeriesGroup\n\t\t);\n\t\t\n\t\t// initiate the animation\n\t\tif (doAnimation) {\n\t\t\tseries.animate(true);\n\t\t}\n\n\t\t// cache attributes for shapes\n\t\tseries.getAttribs();\n\n\t\t// SVGRenderer needs to know this before drawing elements (#1089, #1795)\n\t\tgroup.inverted = series.isCartesian ? chart.inverted : false;\n\t\t\n\t\t// draw the graph if any\n\t\tif (series.drawGraph) {\n\t\t\tseries.drawGraph();\n\t\t\tseries.clipNeg();\n\t\t}\n\n\t\t// draw the data labels (inn pies they go before the points)\n\t\tseries.drawDataLabels();\n\t\t\n\t\t// draw the points\n\t\tseries.drawPoints();\n\n\n\t\t// draw the mouse tracking area\n\t\tif (series.options.enableMouseTracking !== false) {\n\t\t\tseries.drawTracker();\n\t\t}\n\t\t\n\t\t// Handle inverted series and tracker groups\n\t\tif (chart.inverted) {\n\t\t\tseries.invertGroups();\n\t\t}\n\t\t\n\t\t// Initial clipping, must be defined after inverting groups for VML\n\t\tif (options.clip !== false && !series.sharedClipKey && !hasRendered) {\n\t\t\tgroup.clip(chart.clipRect);\n\t\t}\n\n\t\t// Run the animation\n\t\tif (doAnimation) {\n\t\t\tseries.animate();\n\t\t} else if (!hasRendered) {\n\t\t\tseries.afterAnimate();\n\t\t}\n\n\t\tseries.isDirty = series.isDirtyData = false; // means data is in accordance with what you see\n\t\t// (See #322) series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see\n\t\tseries.hasRendered = true;\n\t},\n\t\n\t/**\n\t * Redraw the series after an update in the axes.\n\t */\n\tredraw: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\twasDirtyData = series.isDirtyData, // cache it here as it is set to false in render, but used after\n\t\t\tgroup = series.group,\n\t\t\txAxis = series.xAxis,\n\t\t\tyAxis = series.yAxis;\n\n\t\t// reposition on resize\n\t\tif (group) {\n\t\t\tif (chart.inverted) {\n\t\t\t\tgroup.attr({\n\t\t\t\t\twidth: chart.plotWidth,\n\t\t\t\t\theight: chart.plotHeight\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tgroup.animate({\n\t\t\t\ttranslateX: pick(xAxis && xAxis.left, chart.plotLeft),\n\t\t\t\ttranslateY: pick(yAxis && yAxis.top, chart.plotTop)\n\t\t\t});\n\t\t}\n\n\t\tseries.translate();\n\t\tseries.setTooltipPoints(true);\n\n\t\tseries.render();\n\t\tif (wasDirtyData) {\n\t\t\tfireEvent(series, 'updatedData');\n\t\t}\n\t},\n\n\t/**\n\t * Set the state of the graph\n\t */\n\tsetState: function (state) {\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\tgraph = series.graph,\n\t\t\tgraphNeg = series.graphNeg,\n\t\t\tstateOptions = options.states,\n\t\t\tlineWidth = options.lineWidth,\n\t\t\tattribs;\n\n\t\tstate = state || NORMAL_STATE;\n\n\t\tif (series.state !== state) {\n\t\t\tseries.state = state;\n\n\t\t\tif (stateOptions[state] && stateOptions[state].enabled === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (state) {\n\t\t\t\tlineWidth = stateOptions[state].lineWidth || lineWidth + 1;\n\t\t\t}\n\n\t\t\tif (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML\n\t\t\t\tattribs = {\n\t\t\t\t\t'stroke-width': lineWidth\n\t\t\t\t};\n\t\t\t\t// use attr because animate will cause any other animation on the graph to stop\n\t\t\t\tgraph.attr(attribs);\n\t\t\t\tif (graphNeg) {\n\t\t\t\t\tgraphNeg.attr(attribs);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Set the visibility of the graph\n\t *\n\t * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED,\n\t *        the visibility is toggled.\n\t */\n\tsetVisible: function (vis, redraw) {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\tlegendItem = series.legendItem,\n\t\t\tshowOrHide,\n\t\t\tignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,\n\t\t\toldVisibility = series.visible;\n\n\t\t// if called without an argument, toggle visibility\n\t\tseries.visible = vis = series.userOptions.visible = vis === UNDEFINED ? !oldVisibility : vis;\n\t\tshowOrHide = vis ? 'show' : 'hide';\n\n\t\t// show or hide elements\n\t\teach(['group', 'dataLabelsGroup', 'markerGroup', 'tracker'], function (key) {\n\t\t\tif (series[key]) {\n\t\t\t\tseries[key][showOrHide]();\n\t\t\t}\n\t\t});\n\n\t\t\n\t\t// hide tooltip (#1361)\n\t\tif (chart.hoverSeries === series) {\n\t\t\tseries.onMouseOut();\n\t\t}\n\n\n\t\tif (legendItem) {\n\t\t\tchart.legend.colorizeItem(series, vis);\n\t\t}\n\n\n\t\t// rescale or adapt to resized chart\n\t\tseries.isDirty = true;\n\t\t// in a stack, all other series are affected\n\t\tif (series.options.stacking) {\n\t\t\teach(chart.series, function (otherSeries) {\n\t\t\t\tif (otherSeries.options.stacking && otherSeries.visible) {\n\t\t\t\t\totherSeries.isDirty = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// show or hide linked series\n\t\teach(series.linkedSeries, function (otherSeries) {\n\t\t\totherSeries.setVisible(vis, false);\n\t\t});\n\n\t\tif (ignoreHiddenSeries) {\n\t\t\tchart.isDirtyBox = true;\n\t\t}\n\t\tif (redraw !== false) {\n\t\t\tchart.redraw();\n\t\t}\n\n\t\tfireEvent(series, showOrHide);\n\t},\n\n\t/**\n\t * Show the graph\n\t */\n\tshow: function () {\n\t\tthis.setVisible(true);\n\t},\n\n\t/**\n\t * Hide the graph\n\t */\n\thide: function () {\n\t\tthis.setVisible(false);\n\t},\n\n\n\t/**\n\t * Set the selected state of the graph\n\t *\n\t * @param selected {Boolean} True to select the series, false to unselect. If\n\t *        UNDEFINED, the selection state is toggled.\n\t */\n\tselect: function (selected) {\n\t\tvar series = this;\n\t\t// if called without an argument, toggle\n\t\tseries.selected = selected = (selected === UNDEFINED) ? !series.selected : selected;\n\n\t\tif (series.checkbox) {\n\t\t\tseries.checkbox.checked = selected;\n\t\t}\n\n\t\tfireEvent(series, selected ? 'select' : 'unselect');\n\t},\n\n\t/**\n\t * Draw the tracker object that sits above all data labels and markers to\n\t * track mouse events on the graph or points. For the line type charts\n\t * the tracker uses the same graphPath, but with a greater stroke width\n\t * for better control.\n\t */\n\tdrawTracker: function () {\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\ttrackByArea = options.trackByArea,\n\t\t\ttrackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),\n\t\t\ttrackerPathLength = trackerPath.length,\n\t\t\tchart = series.chart,\n\t\t\tpointer = chart.pointer,\n\t\t\trenderer = chart.renderer,\n\t\t\tsnap = chart.options.tooltip.snap,\n\t\t\ttracker = series.tracker,\n\t\t\tcursor = options.cursor,\n\t\t\tcss = cursor && { cursor: cursor },\n\t\t\tsinglePoints = series.singlePoints,\n\t\t\tsinglePoint,\n\t\t\ti,\n\t\t\tonMouseOver = function () {\n\t\t\t\tif (chart.hoverSeries !== series) {\n\t\t\t\t\tseries.onMouseOver();\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Extend end points. A better way would be to use round linecaps,\n\t\t// but those are not clickable in VML.\n\t\tif (trackerPathLength && !trackByArea) {\n\t\t\ti = trackerPathLength + 1;\n\t\t\twhile (i--) {\n\t\t\t\tif (trackerPath[i] === M) { // extend left side\n\t\t\t\t\ttrackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);\n\t\t\t\t}\n\t\t\t\tif ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side\n\t\t\t\t\ttrackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// handle single points\n\t\tfor (i = 0; i < singlePoints.length; i++) {\n\t\t\tsinglePoint = singlePoints[i];\n\t\t\ttrackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,\n\t\t\t\tL, singlePoint.plotX + snap, singlePoint.plotY);\n\t\t}\n\t\t\n\t\t\n\n\t\t// draw the tracker\n\t\tif (tracker) {\n\t\t\ttracker.attr({ d: trackerPath });\n\n\t\t} else { // create\n\t\t\t\t\n\t\t\tseries.tracker = renderer.path(trackerPath)\n\t\t\t\t.attr({\n\t\t\t\t\t'stroke-linejoin': 'round', // #1225\n\t\t\t\t\tvisibility: series.visible ? VISIBLE : HIDDEN,\n\t\t\t\t\tstroke: TRACKER_FILL,\n\t\t\t\t\tfill: trackByArea ? TRACKER_FILL : NONE,\n\t\t\t\t\t'stroke-width' : options.lineWidth + (trackByArea ? 0 : 2 * snap),\n\t\t\t\t\tzIndex: 2\n\t\t\t\t})\n\t\t\t\t.add(series.group);\n\t\t\t\t\n\t\t\t// The tracker is added to the series group, which is clipped, but is covered \n\t\t\t// by the marker group. So the marker group also needs to capture events.\n\t\t\teach([series.tracker, series.markerGroup], function (tracker) {\n\t\t\t\ttracker.addClass(PREFIX + 'tracker')\n\t\t\t\t\t.on('mouseover', onMouseOver)\n\t\t\t\t\t.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })\n\t\t\t\t\t.css(css);\n\n\t\t\t\tif (hasTouch) {\n\t\t\t\t\ttracker.on('touchstart', onMouseOver);\n\t\t\t\t} \n\t\t\t});\n\t\t}\n\n\t}\n\n}; // end Series prototype\n\n\n/**\n * LineSeries object\n */\nvar LineSeries = extendClass(Series);\nseriesTypes.line = LineSeries;\n\n/**\n * Set the default options for area\n */\ndefaultPlotOptions.area = merge(defaultSeriesOptions, {\n\tthreshold: 0\n\t// trackByArea: false,\n\t// lineColor: null, // overrides color, but lets fillColor be unaltered\n\t// fillOpacity: 0.75,\n\t// fillColor: null\n});\n\n/**\n * AreaSeries object\n */\nvar AreaSeries = extendClass(Series, {\n\ttype: 'area',\n\t\n\t/**\n\t * For stacks, don't split segments on null values. Instead, draw null values with \n\t * no marker. Also insert dummy points for any X position that exists in other series\n\t * in the stack.\n\t */ \n\tgetSegments: function () {\n\t\tvar segments = [],\n\t\t\tsegment = [],\n\t\t\tkeys = [],\n\t\t\txAxis = this.xAxis,\n\t\t\tyAxis = this.yAxis,\n\t\t\tstack = yAxis.stacks[this.stackKey],\n\t\t\tpointMap = {},\n\t\t\tplotX,\n\t\t\tplotY,\n\t\t\tpoints = this.points,\n\t\t\tconnectNulls = this.options.connectNulls,\n\t\t\tval,\n\t\t\ti,\n\t\t\tx;\n\n\t\tif (this.options.stacking && !this.cropped) { // cropped causes artefacts in Stock, and perf issue\n\t\t\t// Create a map where we can quickly look up the points by their X value.\n\t\t\tfor (i = 0; i < points.length; i++) {\n\t\t\t\tpointMap[points[i].x] = points[i];\n\t\t\t}\n\n\t\t\t// Sort the keys (#1651)\n\t\t\tfor (x in stack) {\n\t\t\t\tkeys.push(+x);\n\t\t\t}\n\t\t\tkeys.sort(function (a, b) {\n\t\t\t\treturn a - b;\n\t\t\t});\n\n\t\t\teach(keys, function (x) {\n\t\t\t\tif (connectNulls && (!pointMap[x] || pointMap[x].y === null)) { // #1836\n\t\t\t\t\treturn;\n\n\t\t\t\t// The point exists, push it to the segment\n\t\t\t\t} else if (pointMap[x]) {\n\t\t\t\t\tsegment.push(pointMap[x]);\n\n\t\t\t\t// There is no point for this X value in this series, so we \n\t\t\t\t// insert a dummy point in order for the areas to be drawn\n\t\t\t\t// correctly.\n\t\t\t\t} else {\n\t\t\t\t\tplotX = xAxis.translate(x);\n\t\t\t\t\tval = stack[x].percent ? (stack[x].total ? stack[x].cum * 100 / stack[x].total : 0) : stack[x].cum; // #1991\n\t\t\t\t\tplotY = yAxis.toPixels(val, true);\n\t\t\t\t\tsegment.push({ \n\t\t\t\t\t\ty: null, \n\t\t\t\t\t\tplotX: plotX,\n\t\t\t\t\t\tclientX: plotX, \n\t\t\t\t\t\tplotY: plotY, \n\t\t\t\t\t\tyBottom: plotY,\n\t\t\t\t\t\tonMouseOver: noop\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (segment.length) {\n\t\t\t\tsegments.push(segment);\n\t\t\t}\n\n\t\t} else {\n\t\t\tSeries.prototype.getSegments.call(this);\n\t\t\tsegments = this.segments;\n\t\t}\n\n\t\tthis.segments = segments;\n\t},\n\t\n\t/**\n\t * Extend the base Series getSegmentPath method by adding the path for the area.\n\t * This path is pushed to the series.areaPath property.\n\t */\n\tgetSegmentPath: function (segment) {\n\t\t\n\t\tvar segmentPath = Series.prototype.getSegmentPath.call(this, segment), // call base method\n\t\t\tareaSegmentPath = [].concat(segmentPath), // work on a copy for the area path\n\t\t\ti,\n\t\t\toptions = this.options,\n\t\t\tsegLength = segmentPath.length,\n\t\t\ttranslatedThreshold = this.yAxis.getThreshold(options.threshold), // #2181\n\t\t\tyBottom;\n\t\t\n\t\tif (segLength === 3) { // for animation from 1 to two points\n\t\t\tareaSegmentPath.push(L, segmentPath[1], segmentPath[2]);\n\t\t}\n\t\tif (options.stacking && !this.closedStacks) {\n\t\t\t\n\t\t\t// Follow stack back. Todo: implement areaspline. A general solution could be to \n\t\t\t// reverse the entire graphPath of the previous series, though may be hard with\n\t\t\t// splines and with series with different extremes\n\t\t\tfor (i = segment.length - 1; i >= 0; i--) {\n\n\t\t\t\tyBottom = pick(segment[i].yBottom, translatedThreshold);\n\t\t\t\n\t\t\t\t// step line?\n\t\t\t\tif (i < segment.length - 1 && options.step) {\n\t\t\t\t\tareaSegmentPath.push(segment[i + 1].plotX, yBottom);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tareaSegmentPath.push(segment[i].plotX, yBottom);\n\t\t\t}\n\n\t\t} else { // follow zero line back\n\t\t\tthis.closeSegment(areaSegmentPath, segment, translatedThreshold);\n\t\t}\n\t\tthis.areaPath = this.areaPath.concat(areaSegmentPath);\n\t\treturn segmentPath;\n\t},\n\t\n\t/**\n\t * Extendable method to close the segment path of an area. This is overridden in polar \n\t * charts.\n\t */\n\tcloseSegment: function (path, segment, translatedThreshold) {\n\t\tpath.push(\n\t\t\tL,\n\t\t\tsegment[segment.length - 1].plotX,\n\t\t\ttranslatedThreshold,\n\t\t\tL,\n\t\t\tsegment[0].plotX,\n\t\t\ttranslatedThreshold\n\t\t);\n\t},\n\t\n\t/**\n\t * Draw the graph and the underlying area. This method calls the Series base\n\t * function and adds the area. The areaPath is calculated in the getSegmentPath\n\t * method called from Series.prototype.drawGraph.\n\t */\n\tdrawGraph: function () {\n\t\t\n\t\t// Define or reset areaPath\n\t\tthis.areaPath = [];\n\t\t\n\t\t// Call the base method\n\t\tSeries.prototype.drawGraph.apply(this);\n\t\t\n\t\t// Define local variables\n\t\tvar series = this,\n\t\t\tareaPath = this.areaPath,\n\t\t\toptions = this.options,\n\t\t\tnegativeColor = options.negativeColor,\n\t\t\tnegativeFillColor = options.negativeFillColor,\n\t\t\tprops = [['area', this.color, options.fillColor]]; // area name, main color, fill color\n\t\t\n\t\tif (negativeColor || negativeFillColor) {\n\t\t\tprops.push(['areaNeg', negativeColor, negativeFillColor]);\n\t\t}\n\t\t\n\t\teach(props, function (prop) {\n\t\t\tvar areaKey = prop[0],\n\t\t\t\tarea = series[areaKey];\n\t\t\t\t\n\t\t\t// Create or update the area\n\t\t\tif (area) { // update\n\t\t\t\tarea.animate({ d: areaPath });\n\t\n\t\t\t} else { // create\n\t\t\t\tseries[areaKey] = series.chart.renderer.path(areaPath)\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tfill: pick(\n\t\t\t\t\t\t\tprop[2],\n\t\t\t\t\t\t\tColor(prop[1]).setOpacity(pick(options.fillOpacity, 0.75)).get()\n\t\t\t\t\t\t),\n\t\t\t\t\t\tzIndex: 0 // #1069\n\t\t\t\t\t}).add(series.group);\n\t\t\t}\n\t\t});\n\t},\n\t\n\t/**\n\t * Get the series' symbol in the legend\n\t * \n\t * @param {Object} legend The legend object\n\t * @param {Object} item The series (this) or point\n\t */\n\tdrawLegendSymbol: function (legend, item) {\n\t\t\n\t\titem.legendSymbol = this.chart.renderer.rect(\n\t\t\t0,\n\t\t\tlegend.baseline - 11,\n\t\t\tlegend.options.symbolWidth,\n\t\t\t12,\n\t\t\t2\n\t\t).attr({\n\t\t\tzIndex: 3\n\t\t}).add(item.legendGroup);\t\t\n\t\t\n\t}\n});\n\nseriesTypes.area = AreaSeries;/**\n * Set the default options for spline\n */\ndefaultPlotOptions.spline = merge(defaultSeriesOptions);\n\n/**\n * SplineSeries object\n */\nvar SplineSeries = extendClass(Series, {\n\ttype: 'spline',\n\n\t/**\n\t * Get the spline segment from a given point's previous neighbour to the given point\n\t */\n\tgetPointSpline: function (segment, point, i) {\n\t\tvar smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc\n\t\t\tdenom = smoothing + 1,\n\t\t\tplotX = point.plotX,\n\t\t\tplotY = point.plotY,\n\t\t\tlastPoint = segment[i - 1],\n\t\t\tnextPoint = segment[i + 1],\n\t\t\tleftContX,\n\t\t\tleftContY,\n\t\t\trightContX,\n\t\t\trightContY,\n\t\t\tret;\n\n\t\t// find control points\n\t\tif (lastPoint && nextPoint) {\n\t\t\n\t\t\tvar lastX = lastPoint.plotX,\n\t\t\t\tlastY = lastPoint.plotY,\n\t\t\t\tnextX = nextPoint.plotX,\n\t\t\t\tnextY = nextPoint.plotY,\n\t\t\t\tcorrection;\n\n\t\t\tleftContX = (smoothing * plotX + lastX) / denom;\n\t\t\tleftContY = (smoothing * plotY + lastY) / denom;\n\t\t\trightContX = (smoothing * plotX + nextX) / denom;\n\t\t\trightContY = (smoothing * plotY + nextY) / denom;\n\n\t\t\t// have the two control points make a straight line through main point\n\t\t\tcorrection = ((rightContY - leftContY) * (rightContX - plotX)) /\n\t\t\t\t(rightContX - leftContX) + plotY - rightContY;\n\n\t\t\tleftContY += correction;\n\t\t\trightContY += correction;\n\n\t\t\t// to prevent false extremes, check that control points are between\n\t\t\t// neighbouring points' y values\n\t\t\tif (leftContY > lastY && leftContY > plotY) {\n\t\t\t\tleftContY = mathMax(lastY, plotY);\n\t\t\t\trightContY = 2 * plotY - leftContY; // mirror of left control point\n\t\t\t} else if (leftContY < lastY && leftContY < plotY) {\n\t\t\t\tleftContY = mathMin(lastY, plotY);\n\t\t\t\trightContY = 2 * plotY - leftContY;\n\t\t\t}\n\t\t\tif (rightContY > nextY && rightContY > plotY) {\n\t\t\t\trightContY = mathMax(nextY, plotY);\n\t\t\t\tleftContY = 2 * plotY - rightContY;\n\t\t\t} else if (rightContY < nextY && rightContY < plotY) {\n\t\t\t\trightContY = mathMin(nextY, plotY);\n\t\t\t\tleftContY = 2 * plotY - rightContY;\n\t\t\t}\n\n\t\t\t// record for drawing in next point\n\t\t\tpoint.rightContX = rightContX;\n\t\t\tpoint.rightContY = rightContY;\n\n\t\t}\n\t\t\n\t\t// Visualize control points for debugging\n\t\t/*\n\t\tif (leftContX) {\n\t\t\tthis.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)\n\t\t\t\t.attr({\n\t\t\t\t\tstroke: 'red',\n\t\t\t\t\t'stroke-width': 1,\n\t\t\t\t\tfill: 'none'\n\t\t\t\t})\n\t\t\t\t.add();\n\t\t\tthis.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,\n\t\t\t\t'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n\t\t\t\t.attr({\n\t\t\t\t\tstroke: 'red',\n\t\t\t\t\t'stroke-width': 1\n\t\t\t\t})\n\t\t\t\t.add();\n\t\t\tthis.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)\n\t\t\t\t.attr({\n\t\t\t\t\tstroke: 'green',\n\t\t\t\t\t'stroke-width': 1,\n\t\t\t\t\tfill: 'none'\n\t\t\t\t})\n\t\t\t\t.add();\n\t\t\tthis.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,\n\t\t\t\t'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n\t\t\t\t.attr({\n\t\t\t\t\tstroke: 'green',\n\t\t\t\t\t'stroke-width': 1\n\t\t\t\t})\n\t\t\t\t.add();\n\t\t}\n\t\t*/\n\n\t\t// moveTo or lineTo\n\t\tif (!i) {\n\t\t\tret = [M, plotX, plotY];\n\t\t} else { // curve from last point to this\n\t\t\tret = [\n\t\t\t\t'C',\n\t\t\t\tlastPoint.rightContX || lastPoint.plotX,\n\t\t\t\tlastPoint.rightContY || lastPoint.plotY,\n\t\t\t\tleftContX || plotX,\n\t\t\t\tleftContY || plotY,\n\t\t\t\tplotX,\n\t\t\t\tplotY\n\t\t\t];\n\t\t\tlastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later\n\t\t}\n\t\treturn ret;\n\t}\n});\nseriesTypes.spline = SplineSeries;\n\n/**\n * Set the default options for areaspline\n */\ndefaultPlotOptions.areaspline = merge(defaultPlotOptions.area);\n\n/**\n * AreaSplineSeries object\n */\nvar areaProto = AreaSeries.prototype,\n\tAreaSplineSeries = extendClass(SplineSeries, {\n\t\ttype: 'areaspline',\n\t\tclosedStacks: true, // instead of following the previous graph back, follow the threshold back\n\t\t\n\t\t// Mix in methods from the area series\n\t\tgetSegmentPath: areaProto.getSegmentPath,\n\t\tcloseSegment: areaProto.closeSegment,\n\t\tdrawGraph: areaProto.drawGraph,\n\t\tdrawLegendSymbol: areaProto.drawLegendSymbol\n\t});\nseriesTypes.areaspline = AreaSplineSeries;\n\n/**\n * Set the default options for column\n */\ndefaultPlotOptions.column = merge(defaultSeriesOptions, {\n\tborderColor: '#FFFFFF',\n\tborderWidth: 1,\n\tborderRadius: 0,\n\t//colorByPoint: undefined,\n\tgroupPadding: 0.2,\n\t//grouping: true,\n\tmarker: null, // point options are specified in the base options\n\tpointPadding: 0.1,\n\t//pointWidth: null,\n\tminPointLength: 0,\n\tcropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes\n\tpointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories\n\tstates: {\n\t\thover: {\n\t\t\tbrightness: 0.1,\n\t\t\tshadow: false\n\t\t},\n\t\tselect: {\n\t\t\tcolor: '#C0C0C0',\n\t\t\tborderColor: '#000000',\n\t\t\tshadow: false\n\t\t}\n\t},\n\tdataLabels: {\n\t\talign: null, // auto\n\t\tverticalAlign: null, // auto\n\t\ty: null\n\t},\n\tstickyTracking: false,\n\tthreshold: 0\n});\n\n/**\n * ColumnSeries object\n */\nvar ColumnSeries = extendClass(Series, {\n\ttype: 'column',\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n\t\tstroke: 'borderColor',\n\t\t'stroke-width': 'borderWidth',\n\t\tfill: 'color',\n\t\tr: 'borderRadius'\n\t},\n\tcropShoulder: 0,\n\ttrackerGroups: ['group', 'dataLabelsGroup'],\n\tnegStacks: true, // use separate negative stacks, unlike area stacks where a negative \n\t\t// point is substracted from previous (#1910)\n\t\n\t/**\n\t * Initialize the series\n\t */\n\tinit: function () {\n\t\tSeries.prototype.init.apply(this, arguments);\n\n\t\tvar series = this,\n\t\t\tchart = series.chart;\n\n\t\t// if the series is added dynamically, force redraw of other\n\t\t// series affected by a new column\n\t\tif (chart.hasRendered) {\n\t\t\teach(chart.series, function (otherSeries) {\n\t\t\t\tif (otherSeries.type === series.type) {\n\t\t\t\t\totherSeries.isDirty = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,\n\t * pointWidth etc. \n\t */\n\tgetColumnMetrics: function () {\n\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\txAxis = series.xAxis,\n\t\t\tyAxis = series.yAxis,\n\t\t\treversedXAxis = xAxis.reversed,\n\t\t\tstackKey,\n\t\t\tstackGroups = {},\n\t\t\tcolumnIndex,\n\t\t\tcolumnCount = 0;\n\n\t\t// Get the total number of column type series.\n\t\t// This is called on every series. Consider moving this logic to a\n\t\t// chart.orderStacks() function and call it on init, addSeries and removeSeries\n\t\tif (options.grouping === false) {\n\t\t\tcolumnCount = 1;\n\t\t} else {\n\t\t\teach(series.chart.series, function (otherSeries) {\n\t\t\t\tvar otherOptions = otherSeries.options,\n\t\t\t\t\totherYAxis = otherSeries.yAxis;\n\t\t\t\tif (otherSeries.type === series.type && otherSeries.visible &&\n\t\t\t\t\t\tyAxis.len === otherYAxis.len && yAxis.pos === otherYAxis.pos) {  // #642, #2086\n\t\t\t\t\tif (otherOptions.stacking) {\n\t\t\t\t\t\tstackKey = otherSeries.stackKey;\n\t\t\t\t\t\tif (stackGroups[stackKey] === UNDEFINED) {\n\t\t\t\t\t\t\tstackGroups[stackKey] = columnCount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcolumnIndex = stackGroups[stackKey];\n\t\t\t\t\t} else if (otherOptions.grouping !== false) { // #1162\n\t\t\t\t\t\tcolumnIndex = columnCount++;\n\t\t\t\t\t}\n\t\t\t\t\totherSeries.columnIndex = columnIndex;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tvar categoryWidth = mathMin(\n\t\t\t\tmathAbs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || 1), \n\t\t\t\txAxis.len // #1535\n\t\t\t),\n\t\t\tgroupPadding = categoryWidth * options.groupPadding,\n\t\t\tgroupWidth = categoryWidth - 2 * groupPadding,\n\t\t\tpointOffsetWidth = groupWidth / columnCount,\n\t\t\toptionPointWidth = options.pointWidth,\n\t\t\tpointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 :\n\t\t\t\tpointOffsetWidth * options.pointPadding,\n\t\t\tpointWidth = pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), // exact point width, used in polar charts\n\t\t\tcolIndex = (reversedXAxis ? \n\t\t\t\tcolumnCount - (series.columnIndex || 0) : // #1251\n\t\t\t\tseries.columnIndex) || 0,\n\t\t\tpointXOffset = pointPadding + (groupPadding + colIndex *\n\t\t\t\tpointOffsetWidth - (categoryWidth / 2)) *\n\t\t\t\t(reversedXAxis ? -1 : 1);\n\n\t\t// Save it for reading in linked series (Error bars particularly)\n\t\treturn (series.columnMetrics = { \n\t\t\twidth: pointWidth, \n\t\t\toffset: pointXOffset \n\t\t});\n\t\t\t\n\t},\n\n\t/**\n\t * Translate each point to the plot area coordinate system and find shape positions\n\t */\n\ttranslate: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\toptions = series.options,\n\t\t\tborderWidth = options.borderWidth,\n\t\t\tyAxis = series.yAxis,\n\t\t\tthreshold = options.threshold,\n\t\t\ttranslatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),\n\t\t\tminPointLength = pick(options.minPointLength, 5),\n\t\t\tmetrics = series.getColumnMetrics(),\n\t\t\tpointWidth = metrics.width,\n\t\t\tseriesBarW = series.barW = mathCeil(mathMax(pointWidth, 1 + 2 * borderWidth)), // rounded and postprocessed for border width\n\t\t\tpointXOffset = series.pointXOffset = metrics.offset,\n\t\t\txCrisp = -(borderWidth % 2 ? 0.5 : 0),\n\t\t\tyCrisp = borderWidth % 2 ? 0.5 : 1;\n\n\t\tif (chart.renderer.isVML && chart.inverted) {\n\t\t\tyCrisp += 1;\n\t\t}\n\n\t\tSeries.prototype.translate.apply(series);\n\n\t\t// record the new values\n\t\teach(series.points, function (point) {\n\t\t\tvar yBottom = pick(point.yBottom, translatedThreshold),\n\t\t\t\tplotY = mathMin(mathMax(-999 - yBottom, point.plotY), yAxis.len + 999 + yBottom), // Don't draw too far outside plot area (#1303, #2241)\n\t\t\t\tbarX = point.plotX + pointXOffset,\n\t\t\t\tbarW = seriesBarW,\n\t\t\t\tbarY = mathMin(plotY, yBottom),\n\t\t\t\tright,\n\t\t\t\tbottom,\n\t\t\t\tfromTop,\n\t\t\t\tfromLeft,\n\t\t\t\tbarH = mathMax(plotY, yBottom) - barY;\n\n\t\t\t// Handle options.minPointLength\n\t\t\tif (mathAbs(barH) < minPointLength) {\n\t\t\t\tif (minPointLength) {\n\t\t\t\t\tbarH = minPointLength;\n\t\t\t\t\tbarY =\n\t\t\t\t\t\tmathRound(mathAbs(barY - translatedThreshold) > minPointLength ? // stacked\n\t\t\t\t\t\t\tyBottom - minPointLength : // keep position\n\t\t\t\t\t\t\ttranslatedThreshold - (yAxis.translate(point.y, 0, 1, 0, 1) <= translatedThreshold ? minPointLength : 0)); // use exact yAxis.translation (#1485)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Cache for access in polar\n\t\t\tpoint.barX = barX;\n\t\t\tpoint.pointWidth = pointWidth;\n\n\n\t\t\t// Round off to obtain crisp edges\n\t\t\tfromLeft = mathAbs(barX) < 0.5;\n\t\t\tright = mathRound(barX + barW) + xCrisp;\n\t\t\tbarX = mathRound(barX) + xCrisp;\n\t\t\tbarW = right - barX;\n\n\t\t\tfromTop = mathAbs(barY) < 0.5;\n\t\t\tbottom = mathRound(barY + barH) + yCrisp;\n\t\t\tbarY = mathRound(barY) + yCrisp;\n\t\t\tbarH = bottom - barY;\n\n\t\t\t// Top and left edges are exceptions\n\t\t\tif (fromLeft) {\n\t\t\t\tbarX += 1;\n\t\t\t\tbarW -= 1;\n\t\t\t}\n\t\t\tif (fromTop) {\n\t\t\t\tbarY -= 1;\n\t\t\t\tbarH += 1;\n\t\t\t}\n\n\t\t\t// Register shape type and arguments to be used in drawPoints\n\t\t\tpoint.shapeType = 'rect';\n\t\t\tpoint.shapeArgs = {\n\t\t\t\tx: barX,\n\t\t\t\ty: barY,\n\t\t\t\twidth: barW,\n\t\t\t\theight: barH\n\t\t\t};\n\t\t});\n\n\t},\n\n\tgetSymbol: noop,\n\t\n\t/**\n\t * Use a solid rectangle like the area series types\n\t */\n\tdrawLegendSymbol: AreaSeries.prototype.drawLegendSymbol,\n\t\n\t\n\t/**\n\t * Columns have no graph\n\t */\n\tdrawGraph: noop,\n\n\t/**\n\t * Draw the columns. For bars, the series.group is rotated, so the same coordinates\n\t * apply for columns and bars. This method is inherited by scatter series.\n\t *\n\t */\n\tdrawPoints: function () {\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\trenderer = series.chart.renderer,\n\t\t\tshapeArgs;\n\n\n\t\t// draw the columns\n\t\teach(series.points, function (point) {\n\t\t\tvar plotY = point.plotY,\n\t\t\t\tgraphic = point.graphic;\n\n\t\t\tif (plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {\n\t\t\t\tshapeArgs = point.shapeArgs;\n\t\t\t\t\n\t\t\t\tif (graphic) { // update\n\t\t\t\t\tstop(graphic);\n\t\t\t\t\tgraphic.animate(merge(shapeArgs));\n\n\t\t\t\t} else {\n\t\t\t\t\tpoint.graphic = graphic = renderer[point.shapeType](shapeArgs)\n\t\t\t\t\t\t.attr(point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE])\n\t\t\t\t\t\t.add(series.group)\n\t\t\t\t\t\t.shadow(options.shadow, null, options.stacking && !options.borderRadius);\n\t\t\t\t}\n\n\t\t\t} else if (graphic) {\n\t\t\t\tpoint.graphic = graphic.destroy(); // #1269\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Add tracking event listener to the series group, so the point graphics\n\t * themselves act as trackers\n\t */\n\tdrawTracker: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\tpointer = chart.pointer,\n\t\t\tcursor = series.options.cursor,\n\t\t\tcss = cursor && { cursor: cursor },\n\t\t\tonMouseOver = function (e) {\n\t\t\t\tvar target = e.target,\n\t\t\t\t\tpoint;\n\n\t\t\t\tif (chart.hoverSeries !== series) {\n\t\t\t\t\tseries.onMouseOver();\n\t\t\t\t}\n\t\t\t\twhile (target && !point) {\n\t\t\t\t\tpoint = target.point;\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t}\n\t\t\t\tif (point !== UNDEFINED && point !== chart.hoverPoint) { // undefined on graph in scatterchart\n\t\t\t\t\tpoint.onMouseOver(e);\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Add reference to the point\n\t\teach(series.points, function (point) {\n\t\t\tif (point.graphic) {\n\t\t\t\tpoint.graphic.element.point = point;\n\t\t\t}\n\t\t\tif (point.dataLabel) {\n\t\t\t\tpoint.dataLabel.element.point = point;\n\t\t\t}\n\t\t});\n\n\t\t// Add the event listeners, we need to do this only once\n\t\tif (!series._hasTracking) {\n\t\t\teach(series.trackerGroups, function (key) {\n\t\t\t\tif (series[key]) { // we don't always have dataLabelsGroup\n\t\t\t\t\tseries[key]\n\t\t\t\t\t\t.addClass(PREFIX + 'tracker')\n\t\t\t\t\t\t.on('mouseover', onMouseOver)\n\t\t\t\t\t\t.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })\n\t\t\t\t\t\t.css(css);\n\t\t\t\t\tif (hasTouch) {\n\t\t\t\t\t\tseries[key].on('touchstart', onMouseOver);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tseries._hasTracking = true;\n\t\t}\n\t},\n\t\n\t/** \n\t * Override the basic data label alignment by adjusting for the position of the column\n\t */\n\talignDataLabel: function (point, dataLabel, options,  alignTo, isNew) {\n\t\tvar chart = this.chart,\n\t\t\tinverted = chart.inverted,\n\t\t\tdlBox = point.dlBox || point.shapeArgs, // data label box for alignment\n\t\t\tbelow = point.below || (point.plotY > pick(this.translatedThreshold, chart.plotSizeY)),\n\t\t\tinside = pick(options.inside, !!this.options.stacking); // draw it inside the box?\n\t\t\n\t\t// Align to the column itself, or the top of it\n\t\tif (dlBox) { // Area range uses this method but not alignTo\n\t\t\talignTo = merge(dlBox);\n\t\t\tif (inverted) {\n\t\t\t\talignTo = {\n\t\t\t\t\tx: chart.plotWidth - alignTo.y - alignTo.height,\n\t\t\t\t\ty: chart.plotHeight - alignTo.x - alignTo.width,\n\t\t\t\t\twidth: alignTo.height,\n\t\t\t\t\theight: alignTo.width\n\t\t\t\t};\n\t\t\t}\n\t\t\t\t\n\t\t\t// Compute the alignment box\n\t\t\tif (!inside) {\n\t\t\t\tif (inverted) {\n\t\t\t\t\talignTo.x += below ? 0 : alignTo.width;\n\t\t\t\t\talignTo.width = 0;\n\t\t\t\t} else {\n\t\t\t\t\talignTo.y += below ? alignTo.height : 0;\n\t\t\t\t\talignTo.height = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// When alignment is undefined (typically columns and bars), display the individual \n\t\t// point below or above the point depending on the threshold\n\t\toptions.align = pick(\n\t\t\toptions.align, \n\t\t\t!inverted || inside ? 'center' : below ? 'right' : 'left'\n\t\t);\n\t\toptions.verticalAlign = pick(\n\t\t\toptions.verticalAlign, \n\t\t\tinverted || inside ? 'middle' : below ? 'top' : 'bottom'\n\t\t);\n\t\t\n\t\t// Call the parent method\n\t\tSeries.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n\t},\n\n\n\t/**\n\t * Animate the column heights one by one from zero\n\t * @param {Boolean} init Whether to initialize the animation or run it\n\t */\n\tanimate: function (init) {\n\t\tvar series = this,\n\t\t\tyAxis = this.yAxis,\n\t\t\toptions = series.options,\n\t\t\tinverted = this.chart.inverted,\n\t\t\tattr = {},\n\t\t\ttranslatedThreshold;\n\n\t\tif (hasSVG) { // VML is too slow anyway\n\t\t\tif (init) {\n\t\t\t\tattr.scaleY = 0.001;\n\t\t\t\ttranslatedThreshold = mathMin(yAxis.pos + yAxis.len, mathMax(yAxis.pos, yAxis.toPixels(options.threshold)));\n\t\t\t\tif (inverted) {\n\t\t\t\t\tattr.translateX = translatedThreshold - yAxis.len;\n\t\t\t\t} else {\n\t\t\t\t\tattr.translateY = translatedThreshold;\n\t\t\t\t}\n\t\t\t\tseries.group.attr(attr);\n\n\t\t\t} else { // run the animation\n\t\t\t\t\n\t\t\t\tattr.scaleY = 1;\n\t\t\t\tattr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;\n\t\t\t\tseries.group.animate(attr, series.options.animation);\n\n\t\t\t\t// delete this function to allow it only once\n\t\t\t\tseries.animate = null;\n\t\t\t}\n\t\t}\n\t},\n\t\n\t/**\n\t * Remove this series from the chart\n\t */\n\tremove: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart;\n\n\t\t// column and bar series affects other series of the same type\n\t\t// as they are either stacked or grouped\n\t\tif (chart.hasRendered) {\n\t\t\teach(chart.series, function (otherSeries) {\n\t\t\t\tif (otherSeries.type === series.type) {\n\t\t\t\t\totherSeries.isDirty = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tSeries.prototype.remove.apply(series, arguments);\n\t}\n});\nseriesTypes.column = ColumnSeries;\n/**\n * Set the default options for bar\n */\ndefaultPlotOptions.bar = merge(defaultPlotOptions.column);\n/**\n * The Bar series class\n */\nvar BarSeries = extendClass(ColumnSeries, {\n\ttype: 'bar',\n\tinverted: true\n});\nseriesTypes.bar = BarSeries;\n\n/**\n * Set the default options for scatter\n */\ndefaultPlotOptions.scatter = merge(defaultSeriesOptions, {\n\tlineWidth: 0,\n\ttooltip: {\n\t\theaderFormat: '<span style=\"font-size: 10px; color:{series.color}\">{series.name}</span><br/>',\n\t\tpointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>',\n\t\tfollowPointer: true\n\t},\n\tstickyTracking: false\n});\n\n/**\n * The scatter series class\n */\nvar ScatterSeries = extendClass(Series, {\n\ttype: 'scatter',\n\tsorted: false,\n\trequireSorting: false,\n\tnoSharedTooltip: true,\n\ttrackerGroups: ['markerGroup'],\n\n\tdrawTracker: ColumnSeries.prototype.drawTracker,\n\t\n\tsetTooltipPoints: noop\n});\nseriesTypes.scatter = ScatterSeries;\n\n/**\n * Set the default options for pie\n */\ndefaultPlotOptions.pie = merge(defaultSeriesOptions, {\n\tborderColor: '#FFFFFF',\n\tborderWidth: 1,\n\tcenter: [null, null],\n\tclip: false,\n\tcolorByPoint: true, // always true for pies\n\tdataLabels: {\n\t\t// align: null,\n\t\t// connectorWidth: 1,\n\t\t// connectorColor: point.color,\n\t\t// connectorPadding: 5,\n\t\tdistance: 30,\n\t\tenabled: true,\n\t\tformatter: function () {\n\t\t\treturn this.point.name;\n\t\t}\n\t\t// softConnector: true,\n\t\t//y: 0\n\t},\n\tignoreHiddenPoint: true,\n\t//innerSize: 0,\n\tlegendType: 'point',\n\tmarker: null, // point options are specified in the base options\n\tsize: null,\n\tshowInLegend: false,\n\tslicedOffset: 10,\n\tstates: {\n\t\thover: {\n\t\t\tbrightness: 0.1,\n\t\t\tshadow: false\n\t\t}\n\t},\n\tstickyTracking: false,\n\ttooltip: {\n\t\tfollowPointer: true\n\t}\n});\n\n/**\n * Extended point object for pies\n */\nvar PiePoint = extendClass(Point, {\n\t/**\n\t * Initiate the pie slice\n\t */\n\tinit: function () {\n\n\t\tPoint.prototype.init.apply(this, arguments);\n\n\t\tvar point = this,\n\t\t\ttoggleSlice;\n\n\t\t// Disallow negative values (#1530)\n\t\tif (point.y < 0) {\n\t\t\tpoint.y = null;\n\t\t}\n\n\t\t//visible: options.visible !== false,\n\t\textend(point, {\n\t\t\tvisible: point.visible !== false,\n\t\t\tname: pick(point.name, 'Slice')\n\t\t});\n\n\t\t// add event listener for select\n\t\ttoggleSlice = function (e) {\n\t\t\tpoint.slice(e.type === 'select');\n\t\t};\n\t\taddEvent(point, 'select', toggleSlice);\n\t\taddEvent(point, 'unselect', toggleSlice);\n\n\t\treturn point;\n\t},\n\n\t/**\n\t * Toggle the visibility of the pie slice\n\t * @param {Boolean} vis Whether to show the slice or not. If undefined, the\n\t *    visibility is toggled\n\t */\n\tsetVisible: function (vis) {\n\t\tvar point = this,\n\t\t\tseries = point.series,\n\t\t\tchart = series.chart,\n\t\t\tmethod;\n\n\t\t// if called without an argument, toggle visibility\n\t\tpoint.visible = point.options.visible = vis = vis === UNDEFINED ? !point.visible : vis;\n\t\tseries.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\t\t\n\t\tmethod = vis ? 'show' : 'hide';\n\n\t\t// Show and hide associated elements\n\t\teach(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function (key) {\n\t\t\tif (point[key]) {\n\t\t\t\tpoint[key][method]();\n\t\t\t}\n\t\t});\n\n\t\tif (point.legendItem) {\n\t\t\tchart.legend.colorizeItem(point, vis);\n\t\t}\n\t\t\n\t\t// Handle ignore hidden slices\n\t\tif (!series.isDirty && series.options.ignoreHiddenPoint) {\n\t\t\tseries.isDirty = true;\n\t\t\tchart.redraw();\n\t\t}\n\t},\n\n\t/**\n\t * Set or toggle whether the slice is cut out from the pie\n\t * @param {Boolean} sliced When undefined, the slice state is toggled\n\t * @param {Boolean} redraw Whether to redraw the chart. True by default.\n\t */\n\tslice: function (sliced, redraw, animation) {\n\t\tvar point = this,\n\t\t\tseries = point.series,\n\t\t\tchart = series.chart,\n\t\t\ttranslation;\n\n\t\tsetAnimation(animation, chart);\n\n\t\t// redraw is true by default\n\t\tredraw = pick(redraw, true);\n\n\t\t// if called without an argument, toggle\n\t\tpoint.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;\n\t\tseries.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n\t\ttranslation = sliced ? point.slicedTranslation : {\n\t\t\ttranslateX: 0,\n\t\t\ttranslateY: 0\n\t\t};\n\n\t\tpoint.graphic.animate(translation);\n\t\t\n\t\tif (point.shadowGroup) {\n\t\t\tpoint.shadowGroup.animate(translation);\n\t\t}\n\n\t}\n});\n\n/**\n * The Pie series class\n */\nvar PieSeries = {\n\ttype: 'pie',\n\tisCartesian: false,\n\tpointClass: PiePoint,\n\trequireSorting: false,\n\tnoSharedTooltip: true,\n\ttrackerGroups: ['group', 'dataLabelsGroup'],\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n\t\tstroke: 'borderColor',\n\t\t'stroke-width': 'borderWidth',\n\t\tfill: 'color'\n\t},\n\n\t/**\n\t * Pies have one color each point\n\t */\n\tgetColor: noop,\n\n\t/**\n\t * Animate the pies in\n\t */\n\tanimate: function (init) {\n\t\tvar series = this,\n\t\t\tpoints = series.points,\n\t\t\tstartAngleRad = series.startAngleRad;\n\n\t\tif (!init) {\n\t\t\teach(points, function (point) {\n\t\t\t\tvar graphic = point.graphic,\n\t\t\t\t\targs = point.shapeArgs;\n\n\t\t\t\tif (graphic) {\n\t\t\t\t\t// start values\n\t\t\t\t\tgraphic.attr({\n\t\t\t\t\t\tr: series.center[3] / 2, // animate from inner radius (#779)\n\t\t\t\t\t\tstart: startAngleRad,\n\t\t\t\t\t\tend: startAngleRad\n\t\t\t\t\t});\n\n\t\t\t\t\t// animate\n\t\t\t\t\tgraphic.animate({\n\t\t\t\t\t\tr: args.r,\n\t\t\t\t\t\tstart: args.start,\n\t\t\t\t\t\tend: args.end\n\t\t\t\t\t}, series.options.animation);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// delete this function to allow it only once\n\t\t\tseries.animate = null;\n\t\t}\n\t},\n\n\t/**\n\t * Extend the basic setData method by running processData and generatePoints immediately,\n\t * in order to access the points from the legend.\n\t */\n\tsetData: function (data, redraw) {\n\t\tSeries.prototype.setData.call(this, data, false);\n\t\tthis.processData();\n\t\tthis.generatePoints();\n\t\tif (pick(redraw, true)) {\n\t\t\tthis.chart.redraw();\n\t\t} \n\t},\n\n\t/**\n\t * Extend the generatePoints method by adding total and percentage properties to each point\n\t */\n\tgeneratePoints: function () {\n\t\tvar i,\n\t\t\ttotal = 0,\n\t\t\tpoints,\n\t\t\tlen,\n\t\t\tpoint,\n\t\t\tignoreHiddenPoint = this.options.ignoreHiddenPoint;\n\n\t\tSeries.prototype.generatePoints.call(this);\n\n\t\t// Populate local vars\n\t\tpoints = this.points;\n\t\tlen = points.length;\n\t\t\n\t\t// Get the total sum\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tpoint = points[i];\n\t\t\ttotal += (ignoreHiddenPoint && !point.visible) ? 0 : point.y;\n\t\t}\n\t\tthis.total = total;\n\n\t\t// Set each point's properties\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tpoint = points[i];\n\t\t\tpoint.percentage = total > 0 ? (point.y / total) * 100 : 0;\n\t\t\tpoint.total = total;\n\t\t}\n\t\t\n\t},\n\t\n\t/**\n\t * Get the center of the pie based on the size and center options relative to the  \n\t * plot area. Borrowed by the polar and gauge series types.\n\t */\n\tgetCenter: function () {\n\t\t\n\t\tvar options = this.options,\n\t\t\tchart = this.chart,\n\t\t\tslicingRoom = 2 * (options.slicedOffset || 0),\n\t\t\thandleSlicingRoom,\n\t\t\tplotWidth = chart.plotWidth - 2 * slicingRoom,\n\t\t\tplotHeight = chart.plotHeight - 2 * slicingRoom,\n\t\t\tcenterOption = options.center,\n\t\t\tpositions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],\n\t\t\tsmallestSize = mathMin(plotWidth, plotHeight),\n\t\t\tisPercent;\n\t\t\n\t\treturn map(positions, function (length, i) {\n\t\t\tisPercent = /%$/.test(length);\n\t\t\thandleSlicingRoom = i < 2 || (i === 2 && isPercent);\n\t\t\treturn (isPercent ?\n\t\t\t\t// i == 0: centerX, relative to width\n\t\t\t\t// i == 1: centerY, relative to height\n\t\t\t\t// i == 2: size, relative to smallestSize\n\t\t\t\t// i == 4: innerSize, relative to smallestSize\n\t\t\t\t[plotWidth, plotHeight, smallestSize, smallestSize][i] *\n\t\t\t\t\tpInt(length) / 100 :\n\t\t\t\tlength) + (handleSlicingRoom ? slicingRoom : 0);\n\t\t});\n\t},\n\t\n\t/**\n\t * Do translation for pie slices\n\t */\n\ttranslate: function (positions) {\n\t\tthis.generatePoints();\n\t\t\n\t\tvar series = this,\n\t\t\tcumulative = 0,\n\t\t\tprecision = 1000, // issue #172\n\t\t\toptions = series.options,\n\t\t\tslicedOffset = options.slicedOffset,\n\t\t\tconnectorOffset = slicedOffset + options.borderWidth,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tangle,\n\t\t\tstartAngle = options.startAngle || 0,\n\t\t\tstartAngleRad = series.startAngleRad = mathPI / 180 * (startAngle - 90),\n\t\t\tendAngleRad = series.endAngleRad = mathPI / 180 * ((options.endAngle || (startAngle + 360)) - 90), // docs\n\t\t\tcirc = endAngleRad - startAngleRad, //2 * mathPI,\n\t\t\tpoints = series.points,\n\t\t\tradiusX, // the x component of the radius vector for a given point\n\t\t\tradiusY,\n\t\t\tlabelDistance = options.dataLabels.distance,\n\t\t\tignoreHiddenPoint = options.ignoreHiddenPoint,\n\t\t\ti,\n\t\t\tlen = points.length,\n\t\t\tpoint;\n\n\t\t// Get positions - either an integer or a percentage string must be given.\n\t\t// If positions are passed as a parameter, we're in a recursive loop for adjusting\n\t\t// space for data labels.\n\t\tif (!positions) {\n\t\t\tseries.center = positions = series.getCenter();\n\t\t}\n\n\t\t// utility for getting the x value from a given y, used for anticollision logic in data labels\n\t\tseries.getX = function (y, left) {\n\n\t\t\tangle = math.asin((y - positions[1]) / (positions[2] / 2 + labelDistance));\n\n\t\t\treturn positions[0] +\n\t\t\t\t(left ? -1 : 1) *\n\t\t\t\t(mathCos(angle) * (positions[2] / 2 + labelDistance));\n\t\t};\n\n\t\t// Calculate the geometry for each point\n\t\tfor (i = 0; i < len; i++) {\n\t\t\t\n\t\t\tpoint = points[i];\n\t\t\t\n\t\t\t// set start and end angle\n\t\t\tstart = startAngleRad + (cumulative * circ);\n\t\t\tif (!ignoreHiddenPoint || point.visible) {\n\t\t\t\tcumulative += point.percentage / 100;\n\t\t\t}\n\t\t\tend = startAngleRad + (cumulative * circ);\n\n\t\t\t// set the shape\n\t\t\tpoint.shapeType = 'arc';\n\t\t\tpoint.shapeArgs = {\n\t\t\t\tx: positions[0],\n\t\t\t\ty: positions[1],\n\t\t\t\tr: positions[2] / 2,\n\t\t\t\tinnerR: positions[3] / 2,\n\t\t\t\tstart: mathRound(start * precision) / precision,\n\t\t\t\tend: mathRound(end * precision) / precision\n\t\t\t};\n\n\t\t\t// center for the sliced out slice\n\t\t\tangle = (end + start) / 2;\n\t\t\tif (angle > 0.75 * circ) {\n\t\t\t\tangle -= 2 * mathPI;\n\t\t\t}\n\t\t\tpoint.slicedTranslation = {\n\t\t\t\ttranslateX: mathRound(mathCos(angle) * slicedOffset),\n\t\t\t\ttranslateY: mathRound(mathSin(angle) * slicedOffset)\n\t\t\t};\n\n\t\t\t// set the anchor point for tooltips\n\t\t\tradiusX = mathCos(angle) * positions[2] / 2;\n\t\t\tradiusY = mathSin(angle) * positions[2] / 2;\n\t\t\tpoint.tooltipPos = [\n\t\t\t\tpositions[0] + radiusX * 0.7,\n\t\t\t\tpositions[1] + radiusY * 0.7\n\t\t\t];\n\t\t\t\n\t\t\tpoint.half = angle < -mathPI / 2 || angle > mathPI / 2 ? 1 : 0;\n\t\t\tpoint.angle = angle;\n\n\t\t\t// set the anchor point for data labels\n\t\t\tconnectorOffset = mathMin(connectorOffset, labelDistance / 2); // #1678\n\t\t\tpoint.labelPos = [\n\t\t\t\tpositions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector\n\t\t\t\tpositions[1] + radiusY + mathSin(angle) * labelDistance, // a/a\n\t\t\t\tpositions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie\n\t\t\t\tpositions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a\n\t\t\t\tpositions[0] + radiusX, // landing point for connector\n\t\t\t\tpositions[1] + radiusY, // a/a\n\t\t\t\tlabelDistance < 0 ? // alignment\n\t\t\t\t\t'center' :\n\t\t\t\t\tpoint.half ? 'right' : 'left', // alignment\n\t\t\t\tangle // center angle\n\t\t\t];\n\n\t\t}\n\t},\n\n\tsetTooltipPoints: noop,\n\tdrawGraph: null,\n\n\t/**\n\t * Draw the data points\n\t */\n\tdrawPoints: function () {\n\t\tvar series = this,\n\t\t\tchart = series.chart,\n\t\t\trenderer = chart.renderer,\n\t\t\tgroupTranslation,\n\t\t\t//center,\n\t\t\tgraphic,\n\t\t\t//group,\n\t\t\tshadow = series.options.shadow,\n\t\t\tshadowGroup,\n\t\t\tshapeArgs;\n\n\t\tif (shadow && !series.shadowGroup) {\n\t\t\tseries.shadowGroup = renderer.g('shadow')\n\t\t\t\t.add(series.group);\n\t\t}\n\n\t\t// draw the slices\n\t\teach(series.points, function (point) {\n\t\t\tgraphic = point.graphic;\n\t\t\tshapeArgs = point.shapeArgs;\n\t\t\tshadowGroup = point.shadowGroup;\n\n\t\t\t// put the shadow behind all points\n\t\t\tif (shadow && !shadowGroup) {\n\t\t\t\tshadowGroup = point.shadowGroup = renderer.g('shadow')\n\t\t\t\t\t.add(series.shadowGroup);\n\t\t\t}\n\n\t\t\t// if the point is sliced, use special translation, else use plot area traslation\n\t\t\tgroupTranslation = point.sliced ? point.slicedTranslation : {\n\t\t\t\ttranslateX: 0,\n\t\t\t\ttranslateY: 0\n\t\t\t};\n\n\t\t\t//group.translate(groupTranslation[0], groupTranslation[1]);\n\t\t\tif (shadowGroup) {\n\t\t\t\tshadowGroup.attr(groupTranslation);\n\t\t\t}\n\n\t\t\t// draw the slice\n\t\t\tif (graphic) {\n\t\t\t\tgraphic.animate(extend(shapeArgs, groupTranslation));\n\t\t\t} else {\n\t\t\t\tpoint.graphic = graphic = renderer.arc(shapeArgs)\n\t\t\t\t\t.setRadialReference(series.center)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\tpoint.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]\n\t\t\t\t\t)\n\t\t\t\t\t.attr({ 'stroke-linejoin': 'round' })\n\t\t\t\t\t.attr(groupTranslation)\n\t\t\t\t\t.add(series.group)\n\t\t\t\t\t.shadow(shadow, shadowGroup);\t\n\t\t\t}\n\n\t\t\t// detect point specific visibility\n\t\t\tif (point.visible === false) {\n\t\t\t\tpoint.setVisible(false);\n\t\t\t}\n\n\t\t});\n\n\t},\n\n\t/**\n\t * Utility for sorting data labels\n\t */\n\tsortByAngle: function (points, sign) {\n\t\tpoints.sort(function (a, b) {\n\t\t\treturn a.angle !== undefined && (b.angle - a.angle) * sign;\n\t\t});\n\t},\n\n\t/**\n\t * Override the base drawDataLabels method by pie specific functionality\n\t */\n\tdrawDataLabels: function () {\n\t\tvar series = this,\n\t\t\tdata = series.data,\n\t\t\tpoint,\n\t\t\tchart = series.chart,\n\t\t\toptions = series.options.dataLabels,\n\t\t\tconnectorPadding = pick(options.connectorPadding, 10),\n\t\t\tconnectorWidth = pick(options.connectorWidth, 1),\n\t\t\tplotWidth = chart.plotWidth,\n\t\t\tplotHeight = chart.plotHeight,\n\t\t\tconnector,\n\t\t\tconnectorPath,\n\t\t\tsoftConnector = pick(options.softConnector, true),\n\t\t\tdistanceOption = options.distance,\n\t\t\tseriesCenter = series.center,\n\t\t\tradius = seriesCenter[2] / 2,\n\t\t\tcenterY = seriesCenter[1],\n\t\t\toutside = distanceOption > 0,\n\t\t\tdataLabel,\n\t\t\tdataLabelWidth,\n\t\t\tlabelPos,\n\t\t\tlabelHeight,\n\t\t\thalves = [// divide the points into right and left halves for anti collision\n\t\t\t\t[], // right\n\t\t\t\t[]  // left\n\t\t\t],\n\t\t\tx,\n\t\t\ty,\n\t\t\tvisibility,\n\t\t\trankArr,\n\t\t\ti,\n\t\t\tj,\n\t\t\toverflow = [0, 0, 0, 0], // top, right, bottom, left\n\t\t\tsort = function (a, b) {\n\t\t\t\treturn b.y - a.y;\n\t\t\t};\n\n\t\t// get out if not enabled\n\t\tif (!series.visible || (!options.enabled && !series._hasPointLabels)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// run parent method\n\t\tSeries.prototype.drawDataLabels.apply(series);\n\n\t\t// arrange points for detection collision\n\t\teach(data, function (point) {\n\t\t\tif (point.dataLabel) { // it may have been cancelled in the base method (#407)\n\t\t\t\thalves[point.half].push(point);\n\t\t\t}\n\t\t});\n\n\t\t// assume equal label heights\n\t\ti = 0;\n\t\twhile (!labelHeight && data[i]) { // #1569\n\t\t\tlabelHeight = data[i] && data[i].dataLabel && (data[i].dataLabel.getBBox().height || 21); // 21 is for #968\n\t\t\ti++;\n\t\t}\n\n\t\t/* Loop over the points in each half, starting from the top and bottom\n\t\t * of the pie to detect overlapping labels.\n\t\t */\n\t\ti = 2;\n\t\twhile (i--) {\n\n\t\t\tvar slots = [],\n\t\t\t\tslotsLength,\n\t\t\t\tusedSlots = [],\n\t\t\t\tpoints = halves[i],\n\t\t\t\tpos,\n\t\t\t\tlength = points.length,\n\t\t\t\tslotIndex;\n\t\t\t\t\n\t\t\t// Sort by angle\n\t\t\tseries.sortByAngle(points, i - 0.5);\n\n\t\t\t// Only do anti-collision when we are outside the pie and have connectors (#856)\n\t\t\tif (distanceOption > 0) {\n\t\t\t\t\n\t\t\t\t// build the slots\n\t\t\t\tfor (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {\n\t\t\t\t\tslots.push(pos);\n\t\t\t\t\t\n\t\t\t\t\t// visualize the slot\n\t\t\t\t\t/*\n\t\t\t\t\tvar slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),\n\t\t\t\t\t\tslotY = pos + chart.plotTop;\n\t\t\t\t\tif (!isNaN(slotX)) {\n\t\t\t\t\t\tchart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)\n\t\t\t\t\t\t\t.attr({\n\t\t\t\t\t\t\t\t'stroke-width': 1,\n\t\t\t\t\t\t\t\tstroke: 'silver'\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.add();\n\t\t\t\t\t\tchart.renderer.text('Slot '+ (slots.length - 1), slotX, slotY + 4)\n\t\t\t\t\t\t\t.attr({\n\t\t\t\t\t\t\t\tfill: 'silver'\n\t\t\t\t\t\t\t}).add();\n\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t}\n\t\t\t\tslotsLength = slots.length;\n\t\n\t\t\t\t// if there are more values than available slots, remove lowest values\n\t\t\t\tif (length > slotsLength) {\n\t\t\t\t\t// create an array for sorting and ranking the points within each quarter\n\t\t\t\t\trankArr = [].concat(points);\n\t\t\t\t\trankArr.sort(sort);\n\t\t\t\t\tj = length;\n\t\t\t\t\twhile (j--) {\n\t\t\t\t\t\trankArr[j].rank = j;\n\t\t\t\t\t}\n\t\t\t\t\tj = length;\n\t\t\t\t\twhile (j--) {\n\t\t\t\t\t\tif (points[j].rank >= slotsLength) {\n\t\t\t\t\t\t\tpoints.splice(j, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tlength = points.length;\n\t\t\t\t}\n\t\n\t\t\t\t// The label goes to the nearest open slot, but not closer to the edge than\n\t\t\t\t// the label's index.\n\t\t\t\tfor (j = 0; j < length; j++) {\n\t\n\t\t\t\t\tpoint = points[j];\n\t\t\t\t\tlabelPos = point.labelPos;\n\t\n\t\t\t\t\tvar closest = 9999,\n\t\t\t\t\t\tdistance,\n\t\t\t\t\t\tslotI;\n\t\n\t\t\t\t\t// find the closest slot index\n\t\t\t\t\tfor (slotI = 0; slotI < slotsLength; slotI++) {\n\t\t\t\t\t\tdistance = mathAbs(slots[slotI] - labelPos[1]);\n\t\t\t\t\t\tif (distance < closest) {\n\t\t\t\t\t\t\tclosest = distance;\n\t\t\t\t\t\t\tslotIndex = slotI;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// if that slot index is closer to the edges of the slots, move it\n\t\t\t\t\t// to the closest appropriate slot\n\t\t\t\t\tif (slotIndex < j && slots[j] !== null) { // cluster at the top\n\t\t\t\t\t\tslotIndex = j;\n\t\t\t\t\t} else if (slotsLength  < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom\n\t\t\t\t\t\tslotIndex = slotsLength - length + j;\n\t\t\t\t\t\twhile (slots[slotIndex] === null) { // make sure it is not taken\n\t\t\t\t\t\t\tslotIndex++;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Slot is taken, find next free slot below. In the next run, the next slice will find the\n\t\t\t\t\t\t// slot above these, because it is the closest one\n\t\t\t\t\t\twhile (slots[slotIndex] === null) { // make sure it is not taken\n\t\t\t\t\t\t\tslotIndex++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tusedSlots.push({ i: slotIndex, y: slots[slotIndex] });\n\t\t\t\t\tslots[slotIndex] = null; // mark as taken\n\t\t\t\t}\n\t\t\t\t// sort them in order to fill in from the top\n\t\t\t\tusedSlots.sort(sort);\n\t\t\t}\n\n\t\t\t// now the used slots are sorted, fill them up sequentially\n\t\t\tfor (j = 0; j < length; j++) {\n\t\t\t\t\n\t\t\t\tvar slot, naturalY;\n\n\t\t\t\tpoint = points[j];\n\t\t\t\tlabelPos = point.labelPos;\n\t\t\t\tdataLabel = point.dataLabel;\n\t\t\t\tvisibility = point.visible === false ? HIDDEN : VISIBLE;\n\t\t\t\tnaturalY = labelPos[1];\n\t\t\t\t\n\t\t\t\tif (distanceOption > 0) {\n\t\t\t\t\tslot = usedSlots.pop();\n\t\t\t\t\tslotIndex = slot.i;\n\n\t\t\t\t\t// if the slot next to currrent slot is free, the y value is allowed\n\t\t\t\t\t// to fall back to the natural position\n\t\t\t\t\ty = slot.y;\n\t\t\t\t\tif ((naturalY > y && slots[slotIndex + 1] !== null) ||\n\t\t\t\t\t\t\t(naturalY < y &&  slots[slotIndex - 1] !== null)) {\n\t\t\t\t\t\ty = naturalY;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\ty = naturalY;\n\t\t\t\t}\n\n\t\t\t\t// get the x - use the natural x position for first and last slot, to prevent the top\n\t\t\t\t// and botton slice connectors from touching each other on either side\n\t\t\t\tx = options.justify ? \n\t\t\t\t\tseriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :\n\t\t\t\t\tseries.getX(slotIndex === 0 || slotIndex === slots.length - 1 ? naturalY : y, i);\n\t\t\t\t\n\t\t\t\n\t\t\t\t// Record the placement and visibility\n\t\t\t\tdataLabel._attr = {\n\t\t\t\t\tvisibility: visibility,\n\t\t\t\t\talign: labelPos[6]\n\t\t\t\t};\n\t\t\t\tdataLabel._pos = {\n\t\t\t\t\tx: x + options.x +\n\t\t\t\t\t\t({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0),\n\t\t\t\t\ty: y + options.y - 10 // 10 is for the baseline (label vs text)\n\t\t\t\t};\n\t\t\t\tdataLabel.connX = x;\n\t\t\t\tdataLabel.connY = y;\n\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t// Detect overflowing data labels\n\t\t\t\tif (this.options.size === null) {\n\t\t\t\t\tdataLabelWidth = dataLabel.width;\n\t\t\t\t\t// Overflow left\n\t\t\t\t\tif (x - dataLabelWidth < connectorPadding) {\n\t\t\t\t\t\toverflow[3] = mathMax(mathRound(dataLabelWidth - x + connectorPadding), overflow[3]);\n\t\t\t\t\t\t\n\t\t\t\t\t// Overflow right\n\t\t\t\t\t} else if (x + dataLabelWidth > plotWidth - connectorPadding) {\n\t\t\t\t\t\toverflow[1] = mathMax(mathRound(x + dataLabelWidth - plotWidth + connectorPadding), overflow[1]);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Overflow top\n\t\t\t\t\tif (y - labelHeight / 2 < 0) {\n\t\t\t\t\t\toverflow[0] = mathMax(mathRound(-y + labelHeight / 2), overflow[0]);\n\t\t\t\t\t\t\n\t\t\t\t\t// Overflow left\n\t\t\t\t\t} else if (y + labelHeight / 2 > plotHeight) {\n\t\t\t\t\t\toverflow[2] = mathMax(mathRound(y + labelHeight / 2 - plotHeight), overflow[2]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} // for each point\n\t\t} // for each half\n\t\t\n\t\t// Do not apply the final placement and draw the connectors until we have verified\n\t\t// that labels are not spilling over. \n\t\tif (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {\n\t\t\t\n\t\t\t// Place the labels in the final position\n\t\t\tthis.placeDataLabels();\n\t\t\t\n\t\t\t// Draw the connectors\n\t\t\tif (outside && connectorWidth) {\n\t\t\t\teach(this.points, function (point) {\n\t\t\t\t\tconnector = point.connector;\n\t\t\t\t\tlabelPos = point.labelPos;\n\t\t\t\t\tdataLabel = point.dataLabel;\n\t\t\t\t\t\n\t\t\t\t\tif (dataLabel && dataLabel._pos) {\n\t\t\t\t\t\tvisibility = dataLabel._attr.visibility;\n\t\t\t\t\t\tx = dataLabel.connX;\n\t\t\t\t\t\ty = dataLabel.connY;\n\t\t\t\t\t\tconnectorPath = softConnector ? [\n\t\t\t\t\t\t\tM,\n\t\t\t\t\t\t\tx + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n\t\t\t\t\t\t\t'C',\n\t\t\t\t\t\t\tx, y, // first break, next to the label\n\t\t\t\t\t\t\t2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],\n\t\t\t\t\t\t\tlabelPos[2], labelPos[3], // second break\n\t\t\t\t\t\t\tL,\n\t\t\t\t\t\t\tlabelPos[4], labelPos[5] // base\n\t\t\t\t\t\t] : [\n\t\t\t\t\t\t\tM,\n\t\t\t\t\t\t\tx + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n\t\t\t\t\t\t\tL,\n\t\t\t\t\t\t\tlabelPos[2], labelPos[3], // second break\n\t\t\t\t\t\t\tL,\n\t\t\t\t\t\t\tlabelPos[4], labelPos[5] // base\n\t\t\t\t\t\t];\n\t\t\n\t\t\t\t\t\tif (connector) {\n\t\t\t\t\t\t\tconnector.animate({ d: connectorPath });\n\t\t\t\t\t\t\tconnector.attr('visibility', visibility);\n\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpoint.connector = connector = series.chart.renderer.path(connectorPath).attr({\n\t\t\t\t\t\t\t\t'stroke-width': connectorWidth,\n\t\t\t\t\t\t\t\tstroke: options.connectorColor || point.color || '#606060',\n\t\t\t\t\t\t\t\tvisibility: visibility\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.add(series.group);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (connector) {\n\t\t\t\t\t\tpoint.connector = connector.destroy();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t}\n\t},\n\t\n\t/**\n\t * Verify whether the data labels are allowed to draw, or we should run more translation and data\n\t * label positioning to keep them inside the plot area. Returns true when data labels are ready \n\t * to draw.\n\t */\n\tverifyDataLabelOverflow: function (overflow) {\n\t\t\n\t\tvar center = this.center,\n\t\t\toptions = this.options,\n\t\t\tcenterOption = options.center,\n\t\t\tminSize = options.minSize || 80,\n\t\t\tnewSize = minSize,\n\t\t\tret;\n\t\t\t\n\t\t// Handle horizontal size and center\n\t\tif (centerOption[0] !== null) { // Fixed center\n\t\t\tnewSize = mathMax(center[2] - mathMax(overflow[1], overflow[3]), minSize);\n\t\t\t\n\t\t} else { // Auto center\n\t\t\tnewSize = mathMax(\n\t\t\t\tcenter[2] - overflow[1] - overflow[3], // horizontal overflow\t\t\t\t\t\n\t\t\t\tminSize\n\t\t\t);\n\t\t\tcenter[0] += (overflow[3] - overflow[1]) / 2; // horizontal center\n\t\t}\n\t\t\n\t\t// Handle vertical size and center\n\t\tif (centerOption[1] !== null) { // Fixed center\n\t\t\tnewSize = mathMax(mathMin(newSize, center[2] - mathMax(overflow[0], overflow[2])), minSize);\n\t\t\t\n\t\t} else { // Auto center\n\t\t\tnewSize = mathMax(\n\t\t\t\tmathMin(\n\t\t\t\t\tnewSize,\t\t\n\t\t\t\t\tcenter[2] - overflow[0] - overflow[2] // vertical overflow\n\t\t\t\t),\n\t\t\t\tminSize\n\t\t\t);\n\t\t\tcenter[1] += (overflow[0] - overflow[2]) / 2; // vertical center\n\t\t}\n\t\t\n\t\t// If the size must be decreased, we need to run translate and drawDataLabels again\n\t\tif (newSize < center[2]) {\n\t\t\tcenter[2] = newSize;\n\t\t\tthis.translate(center);\n\t\t\teach(this.points, function (point) {\n\t\t\t\tif (point.dataLabel) {\n\t\t\t\t\tpoint.dataLabel._pos = null; // reset\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.drawDataLabels();\n\t\t\t\n\t\t// Else, return true to indicate that the pie and its labels is within the plot area\n\t\t} else {\n\t\t\tret = true;\n\t\t}\n\t\treturn ret;\n\t},\n\t\n\t/**\n\t * Perform the final placement of the data labels after we have verified that they\n\t * fall within the plot area.\n\t */\n\tplaceDataLabels: function () {\n\t\teach(this.points, function (point) {\n\t\t\tvar dataLabel = point.dataLabel,\n\t\t\t\t_pos;\n\t\t\t\n\t\t\tif (dataLabel) {\n\t\t\t\t_pos = dataLabel._pos;\n\t\t\t\tif (_pos) {\n\t\t\t\t\tdataLabel.attr(dataLabel._attr);\t\t\t\n\t\t\t\t\tdataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);\n\t\t\t\t\tdataLabel.moved = true;\n\t\t\t\t} else if (dataLabel) {\n\t\t\t\t\tdataLabel.attr({ y: -999 });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\t\n\talignDataLabel: noop,\n\n\t/**\n\t * Draw point specific tracker objects. Inherit directly from column series.\n\t */\n\tdrawTracker: ColumnSeries.prototype.drawTracker,\n\n\t/**\n\t * Use a simple symbol from column prototype\n\t */\n\tdrawLegendSymbol: AreaSeries.prototype.drawLegendSymbol,\n\n\t/**\n\t * Pies don't have point marker symbols\n\t */\n\tgetSymbol: noop\n\n};\nPieSeries = extendClass(Series, PieSeries);\nseriesTypes.pie = PieSeries;\n\n\n// global variables\nextend(Highcharts, {\n\t\n\t// Constructors\n\tAxis: Axis,\n\tChart: Chart,\n\tColor: Color,\n\tLegend: Legend,\n\tPointer: Pointer,\n\tPoint: Point,\n\tTick: Tick,\n\tTooltip: Tooltip,\n\tRenderer: Renderer,\n\tSeries: Series,\n\tSVGElement: SVGElement,\n\tSVGRenderer: SVGRenderer,\n\t\n\t// Various\n\tarrayMin: arrayMin,\n\tarrayMax: arrayMax,\n\tcharts: charts,\n\tdateFormat: dateFormat,\n\tformat: format,\n\tpathAnim: pathAnim,\n\tgetOptions: getOptions,\n\thasBidiBug: hasBidiBug,\n\tisTouchDevice: isTouchDevice,\n\tnumberFormat: numberFormat,\n\tseriesTypes: seriesTypes,\n\tsetOptions: setOptions,\n\taddEvent: addEvent,\n\tremoveEvent: removeEvent,\n\tcreateElement: createElement,\n\tdiscardElement: discardElement,\n\tcss: css,\n\teach: each,\n\textend: extend,\n\tmap: map,\n\tmerge: merge,\n\tpick: pick,\n\tsplat: splat,\n\textendClass: extendClass,\n\tpInt: pInt,\n\twrap: wrap,\n\tsvg: hasSVG,\n\tcanvas: useCanVG,\n\tvml: !hasSVG && !useCanVG,\n\tproduct: PRODUCT,\n\tversion: VERSION\n});\n}());\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/annotations.js",
    "content": "(function(i,C){function m(a){return typeof a===\"number\"}function n(a){return a!==D&&a!==null}var D,p,r,s=i.Chart,t=i.extend,z=i.each;r=[\"path\",\"rect\",\"circle\"];p={top:0,left:0,center:0.5,middle:0.5,bottom:1,right:1};var u=C.inArray,A=i.merge,B=function(){this.init.apply(this,arguments)};B.prototype={init:function(a,d){var c=d.shape&&d.shape.type;this.chart=a;var b,f;f={xAxis:0,yAxis:0,title:{style:{},text:\"\",x:0,y:0},shape:{params:{stroke:\"#000000\",fill:\"transparent\",strokeWidth:2}}};b={circle:{params:{x:0,\ny:0}}};if(b[c])f.shape=A(f.shape,b[c]);this.options=A({},f,d)},render:function(a){var d=this.chart,c=this.chart.renderer,b=this.group,f=this.title,e=this.shape,h=this.options,i=h.title,l=h.shape;if(!b)b=this.group=c.g();if(!e&&l&&u(l.type,r)!==-1)e=this.shape=c[h.shape.type](l.params),e.add(b);if(!f&&i)f=this.title=c.label(i),f.add(b);b.add(d.annotations.group);this.linkObjects();a!==!1&&this.redraw()},redraw:function(){var a=this.options,d=this.chart,c=this.group,b=this.title,f=this.shape,e=this.linkedObject,\nh=d.xAxis[a.xAxis],v=d.yAxis[a.yAxis],l=a.width,w=a.height,x=p[a.anchorY],y=p[a.anchorX],j,o,g,q;if(e)j=e instanceof i.Point?\"point\":e instanceof i.Series?\"series\":null,j===\"point\"?(a.xValue=e.x,a.yValue=e.y,o=e.series):j===\"series\"&&(o=e),c.visibility!==o.group.visibility&&c.attr({visibility:o.group.visibility});e=n(a.xValue)?h.toPixels(a.xValue+h.minPointOffset)-h.minPixelPadding:a.x;j=n(a.yValue)?v.toPixels(a.yValue):a.y;if(!isNaN(e)&&!isNaN(j)&&m(e)&&m(j)){b&&(b.attr(a.title),b.css(a.title.style));\nif(f){b=t({},a.shape.params);if(a.units===\"values\"){for(g in b)u(g,[\"width\",\"x\"])>-1?b[g]=h.translate(b[g]):u(g,[\"height\",\"y\"])>-1&&(b[g]=v.translate(b[g]));b.width&&(b.width-=h.toPixels(0)-h.left);b.x&&(b.x+=h.minPixelPadding);if(a.shape.type===\"path\"){g=b.d;o=e;for(var r=j,s=g.length,k=0;k<s;)typeof g[k]===\"number\"&&typeof g[k+1]===\"number\"?(g[k]=h.toPixels(g[k])-o,g[k+1]=v.toPixels(g[k+1])-r,k+=2):k+=1}}a.shape.type===\"circle\"&&(b.x+=b.r,b.y+=b.r);f.attr(b)}c.bBox=null;if(!m(l))q=c.getBBox(),l=\nq.width;if(!m(w))q||(q=c.getBBox()),w=q.height;if(!m(y))y=p.center;if(!m(x))x=p.center;e-=l*y;j-=w*x;d.animation&&n(c.translateX)&&n(c.translateY)?c.animate({translateX:e,translateY:j}):c.translate(e,j)}},destroy:function(){var a=this,d=this.chart.annotations.allItems,c=d.indexOf(a);c>-1&&d.splice(c,1);z([\"title\",\"shape\",\"group\"],function(b){a[b]&&(a[b].destroy(),a[b]=null)});a.group=a.title=a.shape=a.chart=a.options=null},update:function(a,d){t(this.options,a);this.linkObjects();this.render(d)},\nlinkObjects:function(){var a=this.chart,d=this.linkedObject,c=d&&(d.id||d.options.id),b=this.options.linkedTo;if(n(b)){if(!n(d)||b!==c)this.linkedObject=a.get(b)}else this.linkedObject=null}};t(s.prototype,{annotations:{add:function(a,d){var c=this.allItems,b=this.chart,f,e;Object.prototype.toString.call(a)===\"[object Array]\"||(a=[a]);for(e=a.length;e--;)f=new B(b,a[e]),c.push(f),f.render(d)},redraw:function(){z(this.allItems,function(a){a.redraw()})}}});s.prototype.callbacks.push(function(a){var d=\na.options.annotations,c;c=a.renderer.g(\"annotations\");c.attr({zIndex:7});c.add();a.annotations.allItems=[];a.annotations.chart=a;a.annotations.group=c;Object.prototype.toString.call(d)===\"[object Array]\"&&d.length>0&&a.annotations.add(a.options.annotations);i.addEvent(a,\"redraw\",function(){a.annotations.redraw()})})})(Highcharts,HighchartsAdapter);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/annotations.src.js",
    "content": "(function (Highcharts, HighchartsAdapter) {\n\nvar UNDEFINED,\n\tALIGN_FACTOR,\n\tALLOWED_SHAPES,\n\tChart = Highcharts.Chart,\n\textend = Highcharts.extend,\n\teach = Highcharts.each;\n\nALLOWED_SHAPES = [\"path\", \"rect\", \"circle\"];\n\nALIGN_FACTOR = {\n\ttop: 0,\n\tleft: 0,\n\tcenter: 0.5,\n\tmiddle: 0.5,\n\tbottom: 1,\n\tright: 1\n};\n\n\n// Highcharts helper methods\nvar inArray = HighchartsAdapter.inArray,\n\tmerge = Highcharts.merge;\n\nfunction defaultOptions(shapeType) {\n\tvar shapeOptions,\n\t\toptions;\n\n\toptions = {\n\t\txAxis: 0,\n\t\tyAxis: 0,\n\t\ttitle: {\n\t\t\tstyle: {},\n\t\t\ttext: \"\",\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t},\n\t\tshape: {\n\t\t\tparams: {\n\t\t\t\tstroke: \"#000000\",\n\t\t\t\tfill: \"transparent\",\n\t\t\t\tstrokeWidth: 2\n\t\t\t}\n\t\t}\n\t};\n\n\tshapeOptions = {\n\t\tcircle: {\n\t\t\tparams: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0\n\t\t\t}\n\t\t}\n\t};\n\n\tif (shapeOptions[shapeType]) {\n\t\toptions.shape = merge(options.shape, shapeOptions[shapeType]);\n\t}\n\n\treturn options;\n}\n\nfunction isArray(obj) {\n\treturn Object.prototype.toString.call(obj) === '[object Array]';\n}\n\nfunction isNumber(n) {\n\treturn typeof n === 'number';\n}\n\nfunction defined(obj) {\n\treturn obj !== UNDEFINED && obj !== null;\n}\n\nfunction translatePath(d, xAxis, yAxis, xOffset, yOffset) {\n\tvar len = d.length,\n\t\ti = 0;\n\n\twhile (i < len) {\n\t\tif (typeof d[i] === 'number' && typeof d[i + 1] === 'number') {\n\t\t\td[i] = xAxis.toPixels(d[i]) - xOffset;\n\t\t\td[i + 1] = yAxis.toPixels(d[i + 1]) - yOffset;\n\t\t\ti += 2;\n\t\t} else {\n\t\t\ti += 1;\n\t\t}\n\t}\n\n\treturn d;\n}\n\n\n// Define annotation prototype\nvar Annotation = function () {\n\tthis.init.apply(this, arguments);\n};\nAnnotation.prototype = {\n\t/* \n\t * Initialize the annotation\n\t */\n\tinit: function (chart, options) {\n\t\tvar shapeType = options.shape && options.shape.type;\n\n\t\tthis.chart = chart;\n\t\tthis.options = merge({}, defaultOptions(shapeType), options);\n\t},\n\n\t/*\n\t * Render the annotation\n\t */\n\trender: function (redraw) {\n\t\tvar annotation = this,\n\t\t\tchart = this.chart,\n\t\t\trenderer = annotation.chart.renderer,\n\t\t\tgroup = annotation.group,\n\t\t\ttitle = annotation.title,\n\t\t\tshape = annotation.shape,\n\t\t\toptions = annotation.options,\n\t\t\ttitleOptions = options.title,\n\t\t\tshapeOptions = options.shape;\n\n\t\tif (!group) {\n\t\t\tgroup = annotation.group = renderer.g();\n\t\t}\n\n\n\t\tif (!shape && shapeOptions && inArray(shapeOptions.type, ALLOWED_SHAPES) !== -1) {\n\t\t\tshape = annotation.shape = renderer[options.shape.type](shapeOptions.params);\n\t\t\tshape.add(group);\n\t\t}\n\n\t\tif (!title && titleOptions) {\n\t\t\ttitle = annotation.title = renderer.label(titleOptions);\n\t\t\ttitle.add(group);\n\t\t}\n\n\t\tgroup.add(chart.annotations.group);\n\n\t\t// link annotations to point or series\n\t\tannotation.linkObjects();\n\n\t\tif (redraw !== false) {\n\t\t\tannotation.redraw();\n\t\t}\n\t},\n\n\t/*\n\t * Redraw the annotation title or shape after options update\n\t */\n\tredraw: function () {\n\t\tvar options = this.options,\n\t\t\tchart = this.chart,\n\t\t\tgroup = this.group,\n\t\t\ttitle = this.title,\n\t\t\tshape = this.shape,\n\t\t\tlinkedTo = this.linkedObject,\n\t\t\txAxis = chart.xAxis[options.xAxis],\n\t\t\tyAxis = chart.yAxis[options.yAxis],\n\t\t\twidth = options.width,\n\t\t\theight = options.height,\n\t\t\tanchorY = ALIGN_FACTOR[options.anchorY],\n\t\t\tanchorX = ALIGN_FACTOR[options.anchorX],\n\t\t\tresetBBox = false,\n\t\t\tshapeParams,\n\t\t\tlinkType,\n\t\t\tseries,\n\t\t\tparam,\n\t\t\tbbox,\n\t\t\tx,\n\t\t\ty;\n\n\t\tif (linkedTo) {\n\t\t\tlinkType = (linkedTo instanceof Highcharts.Point) ? 'point' :\n\t\t\t\t\t\t(linkedTo instanceof Highcharts.Series) ? 'series' : null;\n\n\t\t\tif (linkType === 'point') {\n\t\t\t\toptions.xValue = linkedTo.x;\n\t\t\t\toptions.yValue = linkedTo.y;\n\t\t\t\tseries = linkedTo.series;\n\t\t\t} else if (linkType === 'series') {\n\t\t\t\tseries = linkedTo;\n\t\t\t}\n\n\t\t\tif (group.visibility !== series.group.visibility) {\n\t\t\t\tgroup.attr({\n\t\t\t\t\tvisibility: series.group.visibility\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\n\t\t// Based on given options find annotation pixel position\n\t\tx = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) - xAxis.minPixelPadding : options.x);\n\t\ty = defined(options.yValue) ? yAxis.toPixels(options.yValue) : options.y;\n\n\t\tif (isNaN(x) || isNaN(y) || !isNumber(x) || !isNumber(y)) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tif (title) {\n\t\t\ttitle.attr(options.title);\n\t\t\ttitle.css(options.title.style);\n\t\t\tresetBBox = true;\n\t\t}\n\n\t\tif (shape) {\n\t\t\tshapeParams = extend({}, options.shape.params);\n\n\t\t\tif (options.units === 'values') {\n\t\t\t\tfor (param in shapeParams) {\n\t\t\t\t\tif (inArray(param, ['width', 'x']) > -1) {\n\t\t\t\t\t\tshapeParams[param] = xAxis.translate(shapeParams[param]);\n\t\t\t\t\t} else if (inArray(param, ['height', 'y']) > -1) {\n\t\t\t\t\t\tshapeParams[param] = yAxis.translate(shapeParams[param]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (shapeParams.width) {\n\t\t\t\t\tshapeParams.width -= xAxis.toPixels(0) - xAxis.left;\n\t\t\t\t}\n\n\t\t\t\tif (shapeParams.x) {\n\t\t\t\t\tshapeParams.x += xAxis.minPixelPadding;\n\t\t\t\t}\n\n\t\t\t\tif (options.shape.type === 'path') {\n\t\t\t\t\ttranslatePath(shapeParams.d, xAxis, yAxis, x, y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// move the center of the circle to shape x/y\n\t\t\tif (options.shape.type === 'circle') {\n\t\t\t\tshapeParams.x += shapeParams.r;\n\t\t\t\tshapeParams.y += shapeParams.r;\n\t\t\t}\n\n\t\t\tresetBBox = true;\n\t\t\tshape.attr(shapeParams);\n\t\t}\n\n\t\tgroup.bBox = null;\n\n\t\t// If annotation width or height is not defined in options use bounding box size\n\t\tif (!isNumber(width)) {\n\t\t\tbbox = group.getBBox();\n\t\t\twidth = bbox.width;\n\t\t}\n\n\t\tif (!isNumber(height)) {\n\t\t\t// get bbox only if it wasn't set before\n\t\t\tif (!bbox) {\n\t\t\t\tbbox = group.getBBox();\n\t\t\t}\n\n\t\t\theight = bbox.height;\n\t\t}\n\n\t\t// Calculate anchor point\n\t\tif (!isNumber(anchorX)) {\n\t\t\tanchorX = ALIGN_FACTOR.center;\n\t\t}\n\n\t\tif (!isNumber(anchorY)) {\n\t\t\tanchorY = ALIGN_FACTOR.center;\n\t\t}\n\n\t\t// Translate group according to its dimension and anchor point\n\t\tx = x - width * anchorX;\n\t\ty = y - height * anchorY;\n\n\t\tif (chart.animation && defined(group.translateX) && defined(group.translateY)) {\n\t\t\tgroup.animate({\n\t\t\t\ttranslateX: x,\n\t\t\t\ttranslateY: y\n\t\t\t});\n\t\t} else {\n\t\t\tgroup.translate(x, y);\n\t\t}\n\t},\n\n\t/*\n\t * Destroy the annotation\n\t */\n\tdestroy: function () {\n\t\tvar annotation = this,\n\t\t\tchart = this.chart,\n\t\t\tallItems = chart.annotations.allItems,\n\t\t\tindex = allItems.indexOf(annotation);\n\n\t\tif (index > -1) {\n\t\t\tallItems.splice(index, 1);\n\t\t}\n\n\t\teach(['title', 'shape', 'group'], function (element) {\n\t\t\tif (annotation[element]) {\n\t\t\t\tannotation[element].destroy();\n\t\t\t\tannotation[element] = null;\n\t\t\t}\n\t\t});\n\n\t\tannotation.group = annotation.title = annotation.shape = annotation.chart = annotation.options = null;\n\t},\n\n\t/*\n\t * Update the annotation with a given options\n\t */\n\tupdate: function (options, redraw) {\n\t\textend(this.options, options);\n\n\t\t// update link to point or series\n\t\tthis.linkObjects();\n\n\t\tthis.render(redraw);\n\t},\n\n\tlinkObjects: function () {\n\t\tvar annotation = this,\n\t\t\tchart = annotation.chart,\n\t\t\tlinkedTo = annotation.linkedObject,\n\t\t\tlinkedId = linkedTo && (linkedTo.id || linkedTo.options.id),\n\t\t\toptions = annotation.options,\n\t\t\tid = options.linkedTo;\n\n\t\tif (!defined(id)) {\n\t\t\tannotation.linkedObject = null;\n\t\t} else if (!defined(linkedTo) || id !== linkedId) {\n\t\t\tannotation.linkedObject = chart.get(id);\n\t\t}\n\t}\n};\n\n\n// Add annotations methods to chart prototype\nextend(Chart.prototype, {\n\tannotations: {\n\t\t/*\n\t\t * Unified method for adding annotations to the chart\n\t\t */\n\t\tadd: function (options, redraw) {\n\t\t\tvar annotations = this.allItems,\n\t\t\t\tchart = this.chart,\n\t\t\t\titem,\n\t\t\t\tlen;\n\n\t\t\tif (!isArray(options)) {\n\t\t\t\toptions = [options];\n\t\t\t}\n\n\t\t\tlen = options.length;\n\n\t\t\twhile (len--) {\n\t\t\t\titem = new Annotation(chart, options[len]);\n\t\t\t\tannotations.push(item);\n\t\t\t\titem.render(redraw);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Redraw all annotations, method used in chart events\n\t\t */\n\t\tredraw: function () {\n\t\t\teach(this.allItems, function (annotation) {\n\t\t\t\tannotation.redraw();\n\t\t\t});\n\t\t}\n\t}\n});\n\n\n// Initialize on chart load\nChart.prototype.callbacks.push(function (chart) {\n\tvar options = chart.options.annotations,\n\t\tgroup;\n\n\tgroup = chart.renderer.g(\"annotations\");\n\tgroup.attr({\n\t\tzIndex: 7\n\t});\n\tgroup.add();\n\n\t// initialize empty array for annotations\n\tchart.annotations.allItems = [];\n\n\t// link chart object to annotations\n\tchart.annotations.chart = chart;\n\n\t// link annotations group element to the chart\n\tchart.annotations.group = group;\n\n\tif (isArray(options) && options.length > 0) {\n\t\tchart.annotations.add(chart.options.annotations);\n\t}\n\n\t// update annotations after chart redraw\n\tHighcharts.addEvent(chart, 'redraw', function () {\n\t\tchart.annotations.redraw();\n\t});\n});\n}(Highcharts, HighchartsAdapter));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/canvas-tools.js",
    "content": "/*\n A class to parse color values\n @author Stoyan Stefanov <sstoo@gmail.com>\n @link   http://www.phpied.com/rgb-color-parser-in-javascript/\n Use it if you like it\n\n canvg.js - Javascript SVG parser and renderer on Canvas\n MIT Licensed \n Gabe Lerner (gabelerner@gmail.com)\n http://code.google.com/p/canvg/\n\n Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/\n\n Highcharts JS v3.0.6 (2013-10-04)\n CanVGRenderer Extension module\n\n (c) 2011-2012 Torstein Hønsi, Erik Olsson\n\n License: www.highcharts.com/license\n*/\nfunction RGBColor(m){this.ok=!1;m.charAt(0)==\"#\"&&(m=m.substr(1,6));var m=m.replace(/ /g,\"\"),m=m.toLowerCase(),a={aliceblue:\"f0f8ff\",antiquewhite:\"faebd7\",aqua:\"00ffff\",aquamarine:\"7fffd4\",azure:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"000000\",blanchedalmond:\"ffebcd\",blue:\"0000ff\",blueviolet:\"8a2be2\",brown:\"a52a2a\",burlywood:\"deb887\",cadetblue:\"5f9ea0\",chartreuse:\"7fff00\",chocolate:\"d2691e\",coral:\"ff7f50\",cornflowerblue:\"6495ed\",cornsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"00ffff\",darkblue:\"00008b\",\ndarkcyan:\"008b8b\",darkgoldenrod:\"b8860b\",darkgray:\"a9a9a9\",darkgreen:\"006400\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dodgerblue:\"1e90ff\",feldspar:\"d19275\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"ff00ff\",\ngainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"808080\",green:\"008000\",greenyellow:\"adff2f\",honeydew:\"f0fff0\",hotpink:\"ff69b4\",indianred:\"cd5c5c\",indigo:\"4b0082\",ivory:\"fffff0\",khaki:\"f0e68c\",lavender:\"e6e6fa\",lavenderblush:\"fff0f5\",lawngreen:\"7cfc00\",lemonchiffon:\"fffacd\",lightblue:\"add8e6\",lightcoral:\"f08080\",lightcyan:\"e0ffff\",lightgoldenrodyellow:\"fafad2\",lightgrey:\"d3d3d3\",lightgreen:\"90ee90\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",\nlightslateblue:\"8470ff\",lightslategray:\"778899\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"00ff00\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"ff00ff\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370d8\",mediumseagreen:\"3cb371\",mediumslateblue:\"7b68ee\",mediumspringgreen:\"00fa9a\",mediumturquoise:\"48d1cc\",mediumvioletred:\"c71585\",midnightblue:\"191970\",mintcream:\"f5fffa\",mistyrose:\"ffe4e1\",moccasin:\"ffe4b5\",navajowhite:\"ffdead\",navy:\"000080\",\noldlace:\"fdf5e6\",olive:\"808000\",olivedrab:\"6b8e23\",orange:\"ffa500\",orangered:\"ff4500\",orchid:\"da70d6\",palegoldenrod:\"eee8aa\",palegreen:\"98fb98\",paleturquoise:\"afeeee\",palevioletred:\"d87093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",red:\"ff0000\",rosybrown:\"bc8f8f\",royalblue:\"4169e1\",saddlebrown:\"8b4513\",salmon:\"fa8072\",sandybrown:\"f4a460\",seagreen:\"2e8b57\",seashell:\"fff5ee\",sienna:\"a0522d\",silver:\"c0c0c0\",skyblue:\"87ceeb\",slateblue:\"6a5acd\",\nslategray:\"708090\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",violetred:\"d02090\",wheat:\"f5deb3\",white:\"ffffff\",whitesmoke:\"f5f5f5\",yellow:\"ffff00\",yellowgreen:\"9acd32\"},c;for(c in a)m==c&&(m=a[c]);var d=[{re:/^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,example:[\"rgb(123, 234, 45)\",\"rgb(255,234,245)\"],process:function(b){return[parseInt(b[1]),parseInt(b[2]),parseInt(b[3])]}},{re:/^(\\w{2})(\\w{2})(\\w{2})$/,\nexample:[\"#00ff00\",\"336699\"],process:function(b){return[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]}},{re:/^(\\w{1})(\\w{1})(\\w{1})$/,example:[\"#fb0\",\"f0f\"],process:function(b){return[parseInt(b[1]+b[1],16),parseInt(b[2]+b[2],16),parseInt(b[3]+b[3],16)]}}];for(c=0;c<d.length;c++){var b=d[c].process,k=d[c].re.exec(m);if(k)channels=b(k),this.r=channels[0],this.g=channels[1],this.b=channels[2],this.ok=!0}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:\nthis.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.toRGB=function(){return\"rgb(\"+this.r+\", \"+this.g+\", \"+this.b+\")\"};this.toHex=function(){var b=this.r.toString(16),a=this.g.toString(16),d=this.b.toString(16);b.length==1&&(b=\"0\"+b);a.length==1&&(a=\"0\"+a);d.length==1&&(d=\"0\"+d);return\"#\"+b+a+d};this.getHelpXML=function(){for(var b=[],k=0;k<d.length;k++)for(var c=d[k].example,j=0;j<c.length;j++)b[b.length]=c[j];for(var h in a)b[b.length]=h;c=document.createElement(\"ul\");\nc.setAttribute(\"id\",\"rgbcolor-examples\");for(k=0;k<b.length;k++)try{var l=document.createElement(\"li\"),o=new RGBColor(b[k]),n=document.createElement(\"div\");n.style.cssText=\"margin: 3px; border: 1px solid black; background:\"+o.toHex()+\"; color:\"+o.toHex();n.appendChild(document.createTextNode(\"test\"));var q=document.createTextNode(\" \"+b[k]+\" -> \"+o.toRGB()+\" -> \"+o.toHex());l.appendChild(n);l.appendChild(q);c.appendChild(l)}catch(p){}return c}}\nif(!window.console)window.console={},window.console.log=function(){},window.console.dir=function(){};if(!Array.prototype.indexOf)Array.prototype.indexOf=function(m){for(var a=0;a<this.length;a++)if(this[a]==m)return a;return-1};\n(function(){function m(){var a={FRAMERATE:30,MAX_VIRTUAL_PIXELS:3E4};a.init=function(c){a.Definitions={};a.Styles={};a.Animations=[];a.Images=[];a.ctx=c;a.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(a,b){this.viewPorts.push({width:a,height:b})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};\nthis.ComputeSize=function(a){return a!=null&&typeof a==\"number\"?a:a==\"x\"?this.width():a==\"y\"?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};a.init();a.ImagesLoaded=function(){for(var c=0;c<a.Images.length;c++)if(!a.Images[c].loaded)return!1;return!0};a.trim=function(a){return a.replace(/^\\s+|\\s+$/g,\"\")};a.compressSpaces=function(a){return a.replace(/[\\s\\r\\t\\n]+/gm,\" \")};a.ajax=function(a){var d;return(d=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject(\"Microsoft.XMLHTTP\"))?\n(d.open(\"GET\",a,!1),d.send(null),d.responseText):null};a.parseXml=function(a){if(window.DOMParser)return(new DOMParser).parseFromString(a,\"text/xml\");else{var a=a.replace(/<!DOCTYPE svg[^>]*>/,\"\"),d=new ActiveXObject(\"Microsoft.XMLDOM\");d.async=\"false\";d.loadXML(a);return d}};a.Property=function(c,d){this.name=c;this.value=d;this.hasValue=function(){return this.value!=null&&this.value!==\"\"};this.numValue=function(){if(!this.hasValue())return 0;var b=parseFloat(this.value);(this.value+\"\").match(/%$/)&&\n(b/=100);return b};this.valueOrDefault=function(b){return this.hasValue()?this.value:b};this.numValueOrDefault=function(b){return this.hasValue()?this.numValue():b};var b=this;this.Color={addOpacity:function(d){var c=b.value;if(d!=null&&d!=\"\"){var f=new RGBColor(b.value);f.ok&&(c=\"rgba(\"+f.r+\", \"+f.g+\", \"+f.b+\", \"+d+\")\")}return new a.Property(b.name,c)}};this.Definition={getDefinition:function(){var d=b.value.replace(/^(url\\()?#([^\\)]+)\\)?$/,\"$2\");return a.Definitions[d]},isUrl:function(){return b.value.indexOf(\"url(\")==\n0},getFillStyle:function(b){var d=this.getDefinition();return d!=null&&d.createGradient?d.createGradient(a.ctx,b):d!=null&&d.createPattern?d.createPattern(a.ctx,b):null}};this.Length={DPI:function(){return 96},EM:function(b){var d=12,c=new a.Property(\"fontSize\",a.Font.Parse(a.ctx.font).fontSize);c.hasValue()&&(d=c.Length.toPixels(b));return d},toPixels:function(d){if(!b.hasValue())return 0;var c=b.value+\"\";return c.match(/em$/)?b.numValue()*this.EM(d):c.match(/ex$/)?b.numValue()*this.EM(d)/2:c.match(/px$/)?\nb.numValue():c.match(/pt$/)?b.numValue()*1.25:c.match(/pc$/)?b.numValue()*15:c.match(/cm$/)?b.numValue()*this.DPI(d)/2.54:c.match(/mm$/)?b.numValue()*this.DPI(d)/25.4:c.match(/in$/)?b.numValue()*this.DPI(d):c.match(/%$/)?b.numValue()*a.ViewPort.ComputeSize(d):b.numValue()}};this.Time={toMilliseconds:function(){if(!b.hasValue())return 0;var a=b.value+\"\";if(a.match(/s$/))return b.numValue()*1E3;a.match(/ms$/);return b.numValue()}};this.Angle={toRadians:function(){if(!b.hasValue())return 0;var a=b.value+\n\"\";return a.match(/deg$/)?b.numValue()*(Math.PI/180):a.match(/grad$/)?b.numValue()*(Math.PI/200):a.match(/rad$/)?b.numValue():b.numValue()*(Math.PI/180)}}};a.Font=new function(){this.Styles=[\"normal\",\"italic\",\"oblique\",\"inherit\"];this.Variants=[\"normal\",\"small-caps\",\"inherit\"];this.Weights=\"normal,bold,bolder,lighter,100,200,300,400,500,600,700,800,900,inherit\".split(\",\");this.CreateFont=function(d,b,c,e,f,g){g=g!=null?this.Parse(g):this.CreateFont(\"\",\"\",\"\",\"\",\"\",a.ctx.font);return{fontFamily:f||\ng.fontFamily,fontSize:e||g.fontSize,fontStyle:d||g.fontStyle,fontWeight:c||g.fontWeight,fontVariant:b||g.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(\" \")}}};var c=this;this.Parse=function(d){for(var b={},d=a.trim(a.compressSpaces(d||\"\")).split(\" \"),k=!1,e=!1,f=!1,g=!1,j=\"\",h=0;h<d.length;h++)if(!e&&c.Styles.indexOf(d[h])!=-1){if(d[h]!=\"inherit\")b.fontStyle=d[h];e=!0}else if(!g&&c.Variants.indexOf(d[h])!=-1){if(d[h]!=\"inherit\")b.fontVariant=\nd[h];e=g=!0}else if(!f&&c.Weights.indexOf(d[h])!=-1){if(d[h]!=\"inherit\")b.fontWeight=d[h];e=g=f=!0}else if(k)d[h]!=\"inherit\"&&(j+=d[h]);else{if(d[h]!=\"inherit\")b.fontSize=d[h].split(\"/\")[0];e=g=f=k=!0}if(j!=\"\")b.fontFamily=j;return b}};a.ToNumberArray=function(c){for(var c=a.trim(a.compressSpaces((c||\"\").replace(/,/g,\" \"))).split(\" \"),d=0;d<c.length;d++)c[d]=parseFloat(c[d]);return c};a.Point=function(a,d){this.x=a;this.y=d;this.angleTo=function(b){return Math.atan2(b.y-this.y,b.x-this.x)};this.applyTransform=\nfunction(b){var a=this.x*b[1]+this.y*b[3]+b[5];this.x=this.x*b[0]+this.y*b[2]+b[4];this.y=a}};a.CreatePoint=function(c){c=a.ToNumberArray(c);return new a.Point(c[0],c[1])};a.CreatePath=function(c){for(var c=a.ToNumberArray(c),d=[],b=0;b<c.length;b+=2)d.push(new a.Point(c[b],c[b+1]));return d};a.BoundingBox=function(a,d,b,k){this.y2=this.x2=this.y1=this.x1=Number.NaN;this.x=function(){return this.x1};this.y=function(){return this.y1};this.width=function(){return this.x2-this.x1};this.height=function(){return this.y2-\nthis.y1};this.addPoint=function(b,a){if(b!=null){if(isNaN(this.x1)||isNaN(this.x2))this.x2=this.x1=b;if(b<this.x1)this.x1=b;if(b>this.x2)this.x2=b}if(a!=null){if(isNaN(this.y1)||isNaN(this.y2))this.y2=this.y1=a;if(a<this.y1)this.y1=a;if(a>this.y2)this.y2=a}};this.addX=function(b){this.addPoint(b,null)};this.addY=function(b){this.addPoint(null,b)};this.addBoundingBox=function(b){this.addPoint(b.x1,b.y1);this.addPoint(b.x2,b.y2)};this.addQuadraticCurve=function(b,a,d,c,k,l){d=b+2/3*(d-b);c=a+2/3*(c-\na);this.addBezierCurve(b,a,d,d+1/3*(k-b),c,c+1/3*(l-a),k,l)};this.addBezierCurve=function(b,a,d,c,k,l,o,n){var q=[b,a],p=[d,c],t=[k,l],m=[o,n];this.addPoint(q[0],q[1]);this.addPoint(m[0],m[1]);for(i=0;i<=1;i++)b=function(b){return Math.pow(1-b,3)*q[i]+3*Math.pow(1-b,2)*b*p[i]+3*(1-b)*Math.pow(b,2)*t[i]+Math.pow(b,3)*m[i]},a=6*q[i]-12*p[i]+6*t[i],d=-3*q[i]+9*p[i]-9*t[i]+3*m[i],c=3*p[i]-3*q[i],d==0?a!=0&&(a=-c/a,0<a&&a<1&&(i==0&&this.addX(b(a)),i==1&&this.addY(b(a)))):(c=Math.pow(a,2)-4*c*d,c<0||(k=\n(-a+Math.sqrt(c))/(2*d),0<k&&k<1&&(i==0&&this.addX(b(k)),i==1&&this.addY(b(k))),a=(-a-Math.sqrt(c))/(2*d),0<a&&a<1&&(i==0&&this.addX(b(a)),i==1&&this.addY(b(a)))))};this.isPointInBox=function(b,a){return this.x1<=b&&b<=this.x2&&this.y1<=a&&a<=this.y2};this.addPoint(a,d);this.addPoint(b,k)};a.Transform=function(c){var d=this;this.Type={};this.Type.translate=function(b){this.p=a.CreatePoint(b);this.apply=function(b){b.translate(this.p.x||0,this.p.y||0)};this.applyToPoint=function(b){b.applyTransform([1,\n0,0,1,this.p.x||0,this.p.y||0])}};this.Type.rotate=function(b){b=a.ToNumberArray(b);this.angle=new a.Property(\"angle\",b[0]);this.cx=b[1]||0;this.cy=b[2]||0;this.apply=function(b){b.translate(this.cx,this.cy);b.rotate(this.angle.Angle.toRadians());b.translate(-this.cx,-this.cy)};this.applyToPoint=function(b){var a=this.angle.Angle.toRadians();b.applyTransform([1,0,0,1,this.p.x||0,this.p.y||0]);b.applyTransform([Math.cos(a),Math.sin(a),-Math.sin(a),Math.cos(a),0,0]);b.applyTransform([1,0,0,1,-this.p.x||\n0,-this.p.y||0])}};this.Type.scale=function(b){this.p=a.CreatePoint(b);this.apply=function(b){b.scale(this.p.x||1,this.p.y||this.p.x||1)};this.applyToPoint=function(b){b.applyTransform([this.p.x||0,0,0,this.p.y||0,0,0])}};this.Type.matrix=function(b){this.m=a.ToNumberArray(b);this.apply=function(b){b.transform(this.m[0],this.m[1],this.m[2],this.m[3],this.m[4],this.m[5])};this.applyToPoint=function(b){b.applyTransform(this.m)}};this.Type.SkewBase=function(b){this.base=d.Type.matrix;this.base(b);this.angle=\nnew a.Property(\"angle\",b)};this.Type.SkewBase.prototype=new this.Type.matrix;this.Type.skewX=function(b){this.base=d.Type.SkewBase;this.base(b);this.m=[1,0,Math.tan(this.angle.Angle.toRadians()),1,0,0]};this.Type.skewX.prototype=new this.Type.SkewBase;this.Type.skewY=function(b){this.base=d.Type.SkewBase;this.base(b);this.m=[1,Math.tan(this.angle.Angle.toRadians()),0,1,0,0]};this.Type.skewY.prototype=new this.Type.SkewBase;this.transforms=[];this.apply=function(b){for(var a=0;a<this.transforms.length;a++)this.transforms[a].apply(b)};\nthis.applyToPoint=function(b){for(var a=0;a<this.transforms.length;a++)this.transforms[a].applyToPoint(b)};for(var c=a.trim(a.compressSpaces(c)).split(/\\s(?=[a-z])/),b=0;b<c.length;b++){var k=c[b].split(\"(\")[0],e=c[b].split(\"(\")[1].replace(\")\",\"\");this.transforms.push(new this.Type[k](e))}};a.AspectRatio=function(c,d,b,k,e,f,g,j,h,l){var d=a.compressSpaces(d),d=d.replace(/^defer\\s/,\"\"),o=d.split(\" \")[0]||\"xMidYMid\",d=d.split(\" \")[1]||\"meet\",n=b/k,q=e/f,p=Math.min(n,q),m=Math.max(n,q);d==\"meet\"&&(k*=\np,f*=p);d==\"slice\"&&(k*=m,f*=m);h=new a.Property(\"refX\",h);l=new a.Property(\"refY\",l);h.hasValue()&&l.hasValue()?c.translate(-p*h.Length.toPixels(\"x\"),-p*l.Length.toPixels(\"y\")):(o.match(/^xMid/)&&(d==\"meet\"&&p==q||d==\"slice\"&&m==q)&&c.translate(b/2-k/2,0),o.match(/YMid$/)&&(d==\"meet\"&&p==n||d==\"slice\"&&m==n)&&c.translate(0,e/2-f/2),o.match(/^xMax/)&&(d==\"meet\"&&p==q||d==\"slice\"&&m==q)&&c.translate(b-k,0),o.match(/YMax$/)&&(d==\"meet\"&&p==n||d==\"slice\"&&m==n)&&c.translate(0,e-f));o==\"none\"?c.scale(n,\nq):d==\"meet\"?c.scale(p,p):d==\"slice\"&&c.scale(m,m);c.translate(g==null?0:-g,j==null?0:-j)};a.Element={};a.Element.ElementBase=function(c){this.attributes={};this.styles={};this.children=[];this.attribute=function(b,d){var c=this.attributes[b];if(c!=null)return c;c=new a.Property(b,\"\");d==!0&&(this.attributes[b]=c);return c};this.style=function(b,d){var c=this.styles[b];if(c!=null)return c;c=this.attribute(b);if(c!=null&&c.hasValue())return c;c=this.parent;if(c!=null&&(c=c.style(b),c!=null&&c.hasValue()))return c;\nc=new a.Property(b,\"\");d==!0&&(this.styles[b]=c);return c};this.render=function(b){if(this.style(\"display\").value!=\"none\"&&this.attribute(\"visibility\").value!=\"hidden\"){b.save();this.setContext(b);if(this.attribute(\"mask\").hasValue()){var a=this.attribute(\"mask\").Definition.getDefinition();a!=null&&a.apply(b,this)}else this.style(\"filter\").hasValue()?(a=this.style(\"filter\").Definition.getDefinition(),a!=null&&a.apply(b,this)):this.renderChildren(b);this.clearContext(b);b.restore()}};this.setContext=\nfunction(){};this.clearContext=function(){};this.renderChildren=function(b){for(var a=0;a<this.children.length;a++)this.children[a].render(b)};this.addChild=function(b,d){var c=b;d&&(c=a.CreateElement(b));c.parent=this;this.children.push(c)};if(c!=null&&c.nodeType==1){for(var d=0;d<c.childNodes.length;d++){var b=c.childNodes[d];b.nodeType==1&&this.addChild(b,!0)}for(d=0;d<c.attributes.length;d++)b=c.attributes[d],this.attributes[b.nodeName]=new a.Property(b.nodeName,b.nodeValue);b=a.Styles[c.nodeName];\nif(b!=null)for(var k in b)this.styles[k]=b[k];if(this.attribute(\"class\").hasValue())for(var d=a.compressSpaces(this.attribute(\"class\").value).split(\" \"),e=0;e<d.length;e++){b=a.Styles[\".\"+d[e]];if(b!=null)for(k in b)this.styles[k]=b[k];b=a.Styles[c.nodeName+\".\"+d[e]];if(b!=null)for(k in b)this.styles[k]=b[k]}if(this.attribute(\"style\").hasValue()){b=this.attribute(\"style\").value.split(\";\");for(d=0;d<b.length;d++)a.trim(b[d])!=\"\"&&(c=b[d].split(\":\"),k=a.trim(c[0]),c=a.trim(c[1]),this.styles[k]=new a.Property(k,\nc))}this.attribute(\"id\").hasValue()&&a.Definitions[this.attribute(\"id\").value]==null&&(a.Definitions[this.attribute(\"id\").value]=this)}};a.Element.RenderedElementBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.setContext=function(d){if(this.style(\"fill\").Definition.isUrl()){var b=this.style(\"fill\").Definition.getFillStyle(this);if(b!=null)d.fillStyle=b}else if(this.style(\"fill\").hasValue())b=this.style(\"fill\"),this.style(\"fill-opacity\").hasValue()&&(b=b.Color.addOpacity(this.style(\"fill-opacity\").value)),\nd.fillStyle=b.value==\"none\"?\"rgba(0,0,0,0)\":b.value;if(this.style(\"stroke\").Definition.isUrl()){if(b=this.style(\"stroke\").Definition.getFillStyle(this),b!=null)d.strokeStyle=b}else if(this.style(\"stroke\").hasValue())b=this.style(\"stroke\"),this.style(\"stroke-opacity\").hasValue()&&(b=b.Color.addOpacity(this.style(\"stroke-opacity\").value)),d.strokeStyle=b.value==\"none\"?\"rgba(0,0,0,0)\":b.value;if(this.style(\"stroke-width\").hasValue())d.lineWidth=this.style(\"stroke-width\").Length.toPixels();if(this.style(\"stroke-linecap\").hasValue())d.lineCap=\nthis.style(\"stroke-linecap\").value;if(this.style(\"stroke-linejoin\").hasValue())d.lineJoin=this.style(\"stroke-linejoin\").value;if(this.style(\"stroke-miterlimit\").hasValue())d.miterLimit=this.style(\"stroke-miterlimit\").value;if(typeof d.font!=\"undefined\")d.font=a.Font.CreateFont(this.style(\"font-style\").value,this.style(\"font-variant\").value,this.style(\"font-weight\").value,this.style(\"font-size\").hasValue()?this.style(\"font-size\").Length.toPixels()+\"px\":\"\",this.style(\"font-family\").value).toString();\nthis.attribute(\"transform\").hasValue()&&(new a.Transform(this.attribute(\"transform\").value)).apply(d);this.attribute(\"clip-path\").hasValue()&&(b=this.attribute(\"clip-path\").Definition.getDefinition(),b!=null&&b.apply(d));if(this.style(\"opacity\").hasValue())d.globalAlpha=this.style(\"opacity\").numValue()}};a.Element.RenderedElementBase.prototype=new a.Element.ElementBase;a.Element.PathElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.path=function(d){d!=null&&d.beginPath();\nreturn new a.BoundingBox};this.renderChildren=function(d){this.path(d);a.Mouse.checkPath(this,d);d.fillStyle!=\"\"&&d.fill();d.strokeStyle!=\"\"&&d.stroke();var b=this.getMarkers();if(b!=null){if(this.style(\"marker-start\").Definition.isUrl()){var c=this.style(\"marker-start\").Definition.getDefinition();c.render(d,b[0][0],b[0][1])}if(this.style(\"marker-mid\").Definition.isUrl())for(var c=this.style(\"marker-mid\").Definition.getDefinition(),e=1;e<b.length-1;e++)c.render(d,b[e][0],b[e][1]);this.style(\"marker-end\").Definition.isUrl()&&\n(c=this.style(\"marker-end\").Definition.getDefinition(),c.render(d,b[b.length-1][0],b[b.length-1][1]))}};this.getBoundingBox=function(){return this.path()};this.getMarkers=function(){return null}};a.Element.PathElementBase.prototype=new a.Element.RenderedElementBase;a.Element.svg=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseClearContext=this.clearContext;this.clearContext=function(d){this.baseClearContext(d);a.ViewPort.RemoveCurrent()};this.baseSetContext=this.setContext;\nthis.setContext=function(d){d.strokeStyle=\"rgba(0,0,0,0)\";d.lineCap=\"butt\";d.lineJoin=\"miter\";d.miterLimit=4;this.baseSetContext(d);this.attribute(\"x\").hasValue()&&this.attribute(\"y\").hasValue()&&d.translate(this.attribute(\"x\").Length.toPixels(\"x\"),this.attribute(\"y\").Length.toPixels(\"y\"));var b=a.ViewPort.width(),c=a.ViewPort.height();if(typeof this.root==\"undefined\"&&this.attribute(\"width\").hasValue()&&this.attribute(\"height\").hasValue()){var b=this.attribute(\"width\").Length.toPixels(\"x\"),c=this.attribute(\"height\").Length.toPixels(\"y\"),\ne=0,f=0;this.attribute(\"refX\").hasValue()&&this.attribute(\"refY\").hasValue()&&(e=-this.attribute(\"refX\").Length.toPixels(\"x\"),f=-this.attribute(\"refY\").Length.toPixels(\"y\"));d.beginPath();d.moveTo(e,f);d.lineTo(b,f);d.lineTo(b,c);d.lineTo(e,c);d.closePath();d.clip()}a.ViewPort.SetCurrent(b,c);if(this.attribute(\"viewBox\").hasValue()){var e=a.ToNumberArray(this.attribute(\"viewBox\").value),f=e[0],g=e[1],b=e[2],c=e[3];a.AspectRatio(d,this.attribute(\"preserveAspectRatio\").value,a.ViewPort.width(),b,a.ViewPort.height(),\nc,f,g,this.attribute(\"refX\").value,this.attribute(\"refY\").value);a.ViewPort.RemoveCurrent();a.ViewPort.SetCurrent(e[2],e[3])}}};a.Element.svg.prototype=new a.Element.RenderedElementBase;a.Element.rect=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(d){var b=this.attribute(\"x\").Length.toPixels(\"x\"),c=this.attribute(\"y\").Length.toPixels(\"y\"),e=this.attribute(\"width\").Length.toPixels(\"x\"),f=this.attribute(\"height\").Length.toPixels(\"y\"),g=this.attribute(\"rx\").Length.toPixels(\"x\"),\nj=this.attribute(\"ry\").Length.toPixels(\"y\");this.attribute(\"rx\").hasValue()&&!this.attribute(\"ry\").hasValue()&&(j=g);this.attribute(\"ry\").hasValue()&&!this.attribute(\"rx\").hasValue()&&(g=j);d!=null&&(d.beginPath(),d.moveTo(b+g,c),d.lineTo(b+e-g,c),d.quadraticCurveTo(b+e,c,b+e,c+j),d.lineTo(b+e,c+f-j),d.quadraticCurveTo(b+e,c+f,b+e-g,c+f),d.lineTo(b+g,c+f),d.quadraticCurveTo(b,c+f,b,c+f-j),d.lineTo(b,c+j),d.quadraticCurveTo(b,c,b+g,c),d.closePath());return new a.BoundingBox(b,c,b+e,c+f)}};a.Element.rect.prototype=\nnew a.Element.PathElementBase;a.Element.circle=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(d){var b=this.attribute(\"cx\").Length.toPixels(\"x\"),c=this.attribute(\"cy\").Length.toPixels(\"y\"),e=this.attribute(\"r\").Length.toPixels();d!=null&&(d.beginPath(),d.arc(b,c,e,0,Math.PI*2,!0),d.closePath());return new a.BoundingBox(b-e,c-e,b+e,c+e)}};a.Element.circle.prototype=new a.Element.PathElementBase;a.Element.ellipse=function(c){this.base=a.Element.PathElementBase;this.base(c);\nthis.path=function(d){var b=4*((Math.sqrt(2)-1)/3),c=this.attribute(\"rx\").Length.toPixels(\"x\"),e=this.attribute(\"ry\").Length.toPixels(\"y\"),f=this.attribute(\"cx\").Length.toPixels(\"x\"),g=this.attribute(\"cy\").Length.toPixels(\"y\");d!=null&&(d.beginPath(),d.moveTo(f,g-e),d.bezierCurveTo(f+b*c,g-e,f+c,g-b*e,f+c,g),d.bezierCurveTo(f+c,g+b*e,f+b*c,g+e,f,g+e),d.bezierCurveTo(f-b*c,g+e,f-c,g+b*e,f-c,g),d.bezierCurveTo(f-c,g-b*e,f-b*c,g-e,f,g-e),d.closePath());return new a.BoundingBox(f-c,g-e,f+c,g+e)}};a.Element.ellipse.prototype=\nnew a.Element.PathElementBase;a.Element.line=function(c){this.base=a.Element.PathElementBase;this.base(c);this.getPoints=function(){return[new a.Point(this.attribute(\"x1\").Length.toPixels(\"x\"),this.attribute(\"y1\").Length.toPixels(\"y\")),new a.Point(this.attribute(\"x2\").Length.toPixels(\"x\"),this.attribute(\"y2\").Length.toPixels(\"y\"))]};this.path=function(d){var b=this.getPoints();d!=null&&(d.beginPath(),d.moveTo(b[0].x,b[0].y),d.lineTo(b[1].x,b[1].y));return new a.BoundingBox(b[0].x,b[0].y,b[1].x,b[1].y)};\nthis.getMarkers=function(){var a=this.getPoints(),b=a[0].angleTo(a[1]);return[[a[0],b],[a[1],b]]}};a.Element.line.prototype=new a.Element.PathElementBase;a.Element.polyline=function(c){this.base=a.Element.PathElementBase;this.base(c);this.points=a.CreatePath(this.attribute(\"points\").value);this.path=function(d){var b=new a.BoundingBox(this.points[0].x,this.points[0].y);d!=null&&(d.beginPath(),d.moveTo(this.points[0].x,this.points[0].y));for(var c=1;c<this.points.length;c++)b.addPoint(this.points[c].x,\nthis.points[c].y),d!=null&&d.lineTo(this.points[c].x,this.points[c].y);return b};this.getMarkers=function(){for(var a=[],b=0;b<this.points.length-1;b++)a.push([this.points[b],this.points[b].angleTo(this.points[b+1])]);a.push([this.points[this.points.length-1],a[a.length-1][1]]);return a}};a.Element.polyline.prototype=new a.Element.PathElementBase;a.Element.polygon=function(c){this.base=a.Element.polyline;this.base(c);this.basePath=this.path;this.path=function(a){var b=this.basePath(a);a!=null&&(a.lineTo(this.points[0].x,\nthis.points[0].y),a.closePath());return b}};a.Element.polygon.prototype=new a.Element.polyline;a.Element.path=function(c){this.base=a.Element.PathElementBase;this.base(c);c=this.attribute(\"d\").value;c=c.replace(/,/gm,\" \");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,\"$1 $2\");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,\"$1 $2\");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,\"$1 $2\");c=c.replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm,\"$1 $2\");c=c.replace(/([0-9])([+\\-])/gm,\n\"$1 $2\");c=c.replace(/(\\.[0-9]*)(\\.)/gm,\"$1 $2\");c=c.replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm,\"$1 $3 $4 \");c=a.compressSpaces(c);c=a.trim(c);this.PathParser=new function(d){this.tokens=d.split(\" \");this.reset=function(){this.i=-1;this.previousCommand=this.command=\"\";this.start=new a.Point(0,0);this.control=new a.Point(0,0);this.current=new a.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){return this.isEnd()?\n!0:this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){return this.command==this.command.toLowerCase()};this.getToken=function(){this.i+=1;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){return this.makeAbsolute(new a.Point(this.getScalar(),this.getScalar()))};this.getAsControlPoint=function(){var b=this.getPoint();\nreturn this.control=b};this.getAsCurrentPoint=function(){var b=this.getPoint();return this.current=b};this.getReflectedControlPoint=function(){return this.previousCommand.toLowerCase()!=\"c\"&&this.previousCommand.toLowerCase()!=\"s\"?this.current:new a.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y)};this.makeAbsolute=function(b){if(this.isRelativeCommand())b.x=this.current.x+b.x,b.y=this.current.y+b.y;return b};this.addMarker=function(b,a,d){d!=null&&this.angles.length>0&&this.angles[this.angles.length-\n1]==null&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(d));this.addMarkerAngle(b,a==null?null:a.angleTo(b))};this.addMarkerAngle=function(b,a){this.points.push(b);this.angles.push(a)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var b=0;b<this.angles.length;b++)if(this.angles[b]==null)for(var a=b+1;a<this.angles.length;a++)if(this.angles[a]!=null){this.angles[b]=this.angles[a];break}return this.angles}}(c);this.path=function(d){var b=\nthis.PathParser;b.reset();var c=new a.BoundingBox;for(d!=null&&d.beginPath();!b.isEnd();)switch(b.nextCommand(),b.command.toUpperCase()){case \"M\":var e=b.getAsCurrentPoint();b.addMarker(e);c.addPoint(e.x,e.y);d!=null&&d.moveTo(e.x,e.y);for(b.start=b.current;!b.isCommandOrEnd();)e=b.getAsCurrentPoint(),b.addMarker(e,b.start),c.addPoint(e.x,e.y),d!=null&&d.lineTo(e.x,e.y);break;case \"L\":for(;!b.isCommandOrEnd();){var f=b.current,e=b.getAsCurrentPoint();b.addMarker(e,f);c.addPoint(e.x,e.y);d!=null&&\nd.lineTo(e.x,e.y)}break;case \"H\":for(;!b.isCommandOrEnd();)e=new a.Point((b.isRelativeCommand()?b.current.x:0)+b.getScalar(),b.current.y),b.addMarker(e,b.current),b.current=e,c.addPoint(b.current.x,b.current.y),d!=null&&d.lineTo(b.current.x,b.current.y);break;case \"V\":for(;!b.isCommandOrEnd();)e=new a.Point(b.current.x,(b.isRelativeCommand()?b.current.y:0)+b.getScalar()),b.addMarker(e,b.current),b.current=e,c.addPoint(b.current.x,b.current.y),d!=null&&d.lineTo(b.current.x,b.current.y);break;case \"C\":for(;!b.isCommandOrEnd();){var g=\nb.current,f=b.getPoint(),j=b.getAsControlPoint(),e=b.getAsCurrentPoint();b.addMarker(e,j,f);c.addBezierCurve(g.x,g.y,f.x,f.y,j.x,j.y,e.x,e.y);d!=null&&d.bezierCurveTo(f.x,f.y,j.x,j.y,e.x,e.y)}break;case \"S\":for(;!b.isCommandOrEnd();)g=b.current,f=b.getReflectedControlPoint(),j=b.getAsControlPoint(),e=b.getAsCurrentPoint(),b.addMarker(e,j,f),c.addBezierCurve(g.x,g.y,f.x,f.y,j.x,j.y,e.x,e.y),d!=null&&d.bezierCurveTo(f.x,f.y,j.x,j.y,e.x,e.y);break;case \"Q\":for(;!b.isCommandOrEnd();)g=b.current,j=b.getAsControlPoint(),\ne=b.getAsCurrentPoint(),b.addMarker(e,j,j),c.addQuadraticCurve(g.x,g.y,j.x,j.y,e.x,e.y),d!=null&&d.quadraticCurveTo(j.x,j.y,e.x,e.y);break;case \"T\":for(;!b.isCommandOrEnd();)g=b.current,j=b.getReflectedControlPoint(),b.control=j,e=b.getAsCurrentPoint(),b.addMarker(e,j,j),c.addQuadraticCurve(g.x,g.y,j.x,j.y,e.x,e.y),d!=null&&d.quadraticCurveTo(j.x,j.y,e.x,e.y);break;case \"A\":for(;!b.isCommandOrEnd();){var g=b.current,h=b.getScalar(),l=b.getScalar(),f=b.getScalar()*(Math.PI/180),o=b.getScalar(),j=b.getScalar(),\ne=b.getAsCurrentPoint(),n=new a.Point(Math.cos(f)*(g.x-e.x)/2+Math.sin(f)*(g.y-e.y)/2,-Math.sin(f)*(g.x-e.x)/2+Math.cos(f)*(g.y-e.y)/2),q=Math.pow(n.x,2)/Math.pow(h,2)+Math.pow(n.y,2)/Math.pow(l,2);q>1&&(h*=Math.sqrt(q),l*=Math.sqrt(q));o=(o==j?-1:1)*Math.sqrt((Math.pow(h,2)*Math.pow(l,2)-Math.pow(h,2)*Math.pow(n.y,2)-Math.pow(l,2)*Math.pow(n.x,2))/(Math.pow(h,2)*Math.pow(n.y,2)+Math.pow(l,2)*Math.pow(n.x,2)));isNaN(o)&&(o=0);var p=new a.Point(o*h*n.y/l,o*-l*n.x/h),g=new a.Point((g.x+e.x)/2+Math.cos(f)*\np.x-Math.sin(f)*p.y,(g.y+e.y)/2+Math.sin(f)*p.x+Math.cos(f)*p.y),m=function(b,a){return(b[0]*a[0]+b[1]*a[1])/(Math.sqrt(Math.pow(b[0],2)+Math.pow(b[1],2))*Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)))},s=function(b,a){return(b[0]*a[1]<b[1]*a[0]?-1:1)*Math.acos(m(b,a))},o=s([1,0],[(n.x-p.x)/h,(n.y-p.y)/l]),q=[(n.x-p.x)/h,(n.y-p.y)/l],p=[(-n.x-p.x)/h,(-n.y-p.y)/l],n=s(q,p);if(m(q,p)<=-1)n=Math.PI;m(q,p)>=1&&(n=0);j==0&&n>0&&(n-=2*Math.PI);j==1&&n<0&&(n+=2*Math.PI);q=new a.Point(g.x-h*Math.cos((o+n)/\n2),g.y-l*Math.sin((o+n)/2));b.addMarkerAngle(q,(o+n)/2+(j==0?1:-1)*Math.PI/2);b.addMarkerAngle(e,n+(j==0?1:-1)*Math.PI/2);c.addPoint(e.x,e.y);d!=null&&(m=h>l?h:l,e=h>l?1:h/l,h=h>l?l/h:1,d.translate(g.x,g.y),d.rotate(f),d.scale(e,h),d.arc(0,0,m,o,o+n,1-j),d.scale(1/e,1/h),d.rotate(-f),d.translate(-g.x,-g.y))}break;case \"Z\":d!=null&&d.closePath(),b.current=b.start}return c};this.getMarkers=function(){for(var a=this.PathParser.getMarkerPoints(),b=this.PathParser.getMarkerAngles(),c=[],e=0;e<a.length;e++)c.push([a[e],\nb[e]]);return c}};a.Element.path.prototype=new a.Element.PathElementBase;a.Element.pattern=function(c){this.base=a.Element.ElementBase;this.base(c);this.createPattern=function(d){var b=new a.Element.svg;b.attributes.viewBox=new a.Property(\"viewBox\",this.attribute(\"viewBox\").value);b.attributes.x=new a.Property(\"x\",this.attribute(\"x\").value);b.attributes.y=new a.Property(\"y\",this.attribute(\"y\").value);b.attributes.width=new a.Property(\"width\",this.attribute(\"width\").value);b.attributes.height=new a.Property(\"height\",\nthis.attribute(\"height\").value);b.children=this.children;var c=document.createElement(\"canvas\");c.width=this.attribute(\"width\").Length.toPixels(\"x\");c.height=this.attribute(\"height\").Length.toPixels(\"y\");b.render(c.getContext(\"2d\"));return d.createPattern(c,\"repeat\")}};a.Element.pattern.prototype=new a.Element.ElementBase;a.Element.marker=function(c){this.base=a.Element.ElementBase;this.base(c);this.baseRender=this.render;this.render=function(d,b,c){d.translate(b.x,b.y);this.attribute(\"orient\").valueOrDefault(\"auto\")==\n\"auto\"&&d.rotate(c);this.attribute(\"markerUnits\").valueOrDefault(\"strokeWidth\")==\"strokeWidth\"&&d.scale(d.lineWidth,d.lineWidth);d.save();var e=new a.Element.svg;e.attributes.viewBox=new a.Property(\"viewBox\",this.attribute(\"viewBox\").value);e.attributes.refX=new a.Property(\"refX\",this.attribute(\"refX\").value);e.attributes.refY=new a.Property(\"refY\",this.attribute(\"refY\").value);e.attributes.width=new a.Property(\"width\",this.attribute(\"markerWidth\").value);e.attributes.height=new a.Property(\"height\",\nthis.attribute(\"markerHeight\").value);e.attributes.fill=new a.Property(\"fill\",this.attribute(\"fill\").valueOrDefault(\"black\"));e.attributes.stroke=new a.Property(\"stroke\",this.attribute(\"stroke\").valueOrDefault(\"none\"));e.children=this.children;e.render(d);d.restore();this.attribute(\"markerUnits\").valueOrDefault(\"strokeWidth\")==\"strokeWidth\"&&d.scale(1/d.lineWidth,1/d.lineWidth);this.attribute(\"orient\").valueOrDefault(\"auto\")==\"auto\"&&d.rotate(-c);d.translate(-b.x,-b.y)}};a.Element.marker.prototype=\nnew a.Element.ElementBase;a.Element.defs=function(c){this.base=a.Element.ElementBase;this.base(c);this.render=function(){}};a.Element.defs.prototype=new a.Element.ElementBase;a.Element.GradientBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.gradientUnits=this.attribute(\"gradientUnits\").valueOrDefault(\"objectBoundingBox\");this.stops=[];for(c=0;c<this.children.length;c++)this.stops.push(this.children[c]);this.getGradient=function(){};this.createGradient=function(d,b){var c=this;this.attribute(\"xlink:href\").hasValue()&&\n(c=this.attribute(\"xlink:href\").Definition.getDefinition());for(var e=this.getGradient(d,b),f=0;f<c.stops.length;f++)e.addColorStop(c.stops[f].offset,c.stops[f].color);if(this.attribute(\"gradientTransform\").hasValue()){c=a.ViewPort.viewPorts[0];f=new a.Element.rect;f.attributes.x=new a.Property(\"x\",-a.MAX_VIRTUAL_PIXELS/3);f.attributes.y=new a.Property(\"y\",-a.MAX_VIRTUAL_PIXELS/3);f.attributes.width=new a.Property(\"width\",a.MAX_VIRTUAL_PIXELS);f.attributes.height=new a.Property(\"height\",a.MAX_VIRTUAL_PIXELS);\nvar g=new a.Element.g;g.attributes.transform=new a.Property(\"transform\",this.attribute(\"gradientTransform\").value);g.children=[f];f=new a.Element.svg;f.attributes.x=new a.Property(\"x\",0);f.attributes.y=new a.Property(\"y\",0);f.attributes.width=new a.Property(\"width\",c.width);f.attributes.height=new a.Property(\"height\",c.height);f.children=[g];g=document.createElement(\"canvas\");g.width=c.width;g.height=c.height;c=g.getContext(\"2d\");c.fillStyle=e;f.render(c);return c.createPattern(g,\"no-repeat\")}return e}};\na.Element.GradientBase.prototype=new a.Element.ElementBase;a.Element.linearGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.getGradient=function(a,b){var c=b.getBoundingBox(),e=this.gradientUnits==\"objectBoundingBox\"?c.x()+c.width()*this.attribute(\"x1\").numValue():this.attribute(\"x1\").Length.toPixels(\"x\"),f=this.gradientUnits==\"objectBoundingBox\"?c.y()+c.height()*this.attribute(\"y1\").numValue():this.attribute(\"y1\").Length.toPixels(\"y\"),g=this.gradientUnits==\"objectBoundingBox\"?\nc.x()+c.width()*this.attribute(\"x2\").numValue():this.attribute(\"x2\").Length.toPixels(\"x\"),c=this.gradientUnits==\"objectBoundingBox\"?c.y()+c.height()*this.attribute(\"y2\").numValue():this.attribute(\"y2\").Length.toPixels(\"y\");return a.createLinearGradient(e,f,g,c)}};a.Element.linearGradient.prototype=new a.Element.GradientBase;a.Element.radialGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.getGradient=function(a,b){var c=b.getBoundingBox(),e=this.gradientUnits==\"objectBoundingBox\"?\nc.x()+c.width()*this.attribute(\"cx\").numValue():this.attribute(\"cx\").Length.toPixels(\"x\"),f=this.gradientUnits==\"objectBoundingBox\"?c.y()+c.height()*this.attribute(\"cy\").numValue():this.attribute(\"cy\").Length.toPixels(\"y\"),g=e,j=f;this.attribute(\"fx\").hasValue()&&(g=this.gradientUnits==\"objectBoundingBox\"?c.x()+c.width()*this.attribute(\"fx\").numValue():this.attribute(\"fx\").Length.toPixels(\"x\"));this.attribute(\"fy\").hasValue()&&(j=this.gradientUnits==\"objectBoundingBox\"?c.y()+c.height()*this.attribute(\"fy\").numValue():\nthis.attribute(\"fy\").Length.toPixels(\"y\"));c=this.gradientUnits==\"objectBoundingBox\"?(c.width()+c.height())/2*this.attribute(\"r\").numValue():this.attribute(\"r\").Length.toPixels();return a.createRadialGradient(g,j,0,e,f,c)}};a.Element.radialGradient.prototype=new a.Element.GradientBase;a.Element.stop=function(c){this.base=a.Element.ElementBase;this.base(c);this.offset=this.attribute(\"offset\").numValue();c=this.style(\"stop-color\");this.style(\"stop-opacity\").hasValue()&&(c=c.Color.addOpacity(this.style(\"stop-opacity\").value));\nthis.color=c.value};a.Element.stop.prototype=new a.Element.ElementBase;a.Element.AnimateBase=function(c){this.base=a.Element.ElementBase;this.base(c);a.Animations.push(this);this.duration=0;this.begin=this.attribute(\"begin\").Time.toMilliseconds();this.maxDuration=this.begin+this.attribute(\"dur\").Time.toMilliseconds();this.getProperty=function(){var a=this.attribute(\"attributeType\").value,b=this.attribute(\"attributeName\").value;return a==\"CSS\"?this.parent.style(b,!0):this.parent.attribute(b,!0)};this.initialValue=\nnull;this.removed=!1;this.calcValue=function(){return\"\"};this.update=function(a){if(this.initialValue==null)this.initialValue=this.getProperty().value;if(this.duration>this.maxDuration)if(this.attribute(\"repeatCount\").value==\"indefinite\")this.duration=0;else return this.attribute(\"fill\").valueOrDefault(\"remove\")==\"remove\"&&!this.removed?(this.removed=!0,this.getProperty().value=this.initialValue,!0):!1;this.duration+=a;a=!1;if(this.begin<this.duration)a=this.calcValue(),this.attribute(\"type\").hasValue()&&\n(a=this.attribute(\"type\").value+\"(\"+a+\")\"),this.getProperty().value=a,a=!0;return a};this.progress=function(){return(this.duration-this.begin)/(this.maxDuration-this.begin)}};a.Element.AnimateBase.prototype=new a.Element.ElementBase;a.Element.animate=function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=this.attribute(\"from\").numValue(),b=this.attribute(\"to\").numValue();return a+(b-a)*this.progress()}};a.Element.animate.prototype=new a.Element.AnimateBase;a.Element.animateColor=\nfunction(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=new RGBColor(this.attribute(\"from\").value),b=new RGBColor(this.attribute(\"to\").value);if(a.ok&&b.ok){var c=a.r+(b.r-a.r)*this.progress(),e=a.g+(b.g-a.g)*this.progress(),a=a.b+(b.b-a.b)*this.progress();return\"rgb(\"+parseInt(c,10)+\",\"+parseInt(e,10)+\",\"+parseInt(a,10)+\")\"}return this.attribute(\"from\").value}};a.Element.animateColor.prototype=new a.Element.AnimateBase;a.Element.animateTransform=function(c){this.base=\na.Element.animate;this.base(c)};a.Element.animateTransform.prototype=new a.Element.animate;a.Element.font=function(c){this.base=a.Element.ElementBase;this.base(c);this.horizAdvX=this.attribute(\"horiz-adv-x\").numValue();this.isArabic=this.isRTL=!1;this.missingGlyph=this.fontFace=null;this.glyphs=[];for(c=0;c<this.children.length;c++){var d=this.children[c];if(d.type==\"font-face\")this.fontFace=d,d.style(\"font-family\").hasValue()&&(a.Definitions[d.style(\"font-family\").value]=this);else if(d.type==\"missing-glyph\")this.missingGlyph=\nd;else if(d.type==\"glyph\")d.arabicForm!=\"\"?(this.isArabic=this.isRTL=!0,typeof this.glyphs[d.unicode]==\"undefined\"&&(this.glyphs[d.unicode]=[]),this.glyphs[d.unicode][d.arabicForm]=d):this.glyphs[d.unicode]=d}};a.Element.font.prototype=new a.Element.ElementBase;a.Element.fontface=function(c){this.base=a.Element.ElementBase;this.base(c);this.ascent=this.attribute(\"ascent\").value;this.descent=this.attribute(\"descent\").value;this.unitsPerEm=this.attribute(\"units-per-em\").numValue()};a.Element.fontface.prototype=\nnew a.Element.ElementBase;a.Element.missingglyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=0};a.Element.missingglyph.prototype=new a.Element.path;a.Element.glyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=this.attribute(\"horiz-adv-x\").numValue();this.unicode=this.attribute(\"unicode\").value;this.arabicForm=this.attribute(\"arabic-form\").value};a.Element.glyph.prototype=new a.Element.path;a.Element.text=function(c){this.base=a.Element.RenderedElementBase;\nthis.base(c);if(c!=null){this.children=[];for(var d=0;d<c.childNodes.length;d++){var b=c.childNodes[d];b.nodeType==1?this.addChild(b,!0):b.nodeType==3&&this.addChild(new a.Element.tspan(b),!1)}}this.baseSetContext=this.setContext;this.setContext=function(b){this.baseSetContext(b);if(this.style(\"dominant-baseline\").hasValue())b.textBaseline=this.style(\"dominant-baseline\").value;if(this.style(\"alignment-baseline\").hasValue())b.textBaseline=this.style(\"alignment-baseline\").value};this.renderChildren=\nfunction(b){for(var a=this.style(\"text-anchor\").valueOrDefault(\"start\"),c=this.attribute(\"x\").Length.toPixels(\"x\"),d=this.attribute(\"y\").Length.toPixels(\"y\"),j=0;j<this.children.length;j++){var h=this.children[j];h.attribute(\"x\").hasValue()?h.x=h.attribute(\"x\").Length.toPixels(\"x\"):(h.attribute(\"dx\").hasValue()&&(c+=h.attribute(\"dx\").Length.toPixels(\"x\")),h.x=c);c=h.measureText(b);if(a!=\"start\"&&(j==0||h.attribute(\"x\").hasValue())){for(var l=c,o=j+1;o<this.children.length;o++){var n=this.children[o];\nif(n.attribute(\"x\").hasValue())break;l+=n.measureText(b)}h.x-=a==\"end\"?l:l/2}c=h.x+c;h.attribute(\"y\").hasValue()?h.y=h.attribute(\"y\").Length.toPixels(\"y\"):(h.attribute(\"dy\").hasValue()&&(d+=h.attribute(\"dy\").Length.toPixels(\"y\")),h.y=d);d=h.y;h.render(b)}}};a.Element.text.prototype=new a.Element.RenderedElementBase;a.Element.TextElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getGlyph=function(a,b,c){var e=b[c],f=null;if(a.isArabic){var g=\"isolated\";if((c==0||b[c-\n1]==\" \")&&c<b.length-2&&b[c+1]!=\" \")g=\"terminal\";c>0&&b[c-1]!=\" \"&&c<b.length-2&&b[c+1]!=\" \"&&(g=\"medial\");if(c>0&&b[c-1]!=\" \"&&(c==b.length-1||b[c+1]==\" \"))g=\"initial\";typeof a.glyphs[e]!=\"undefined\"&&(f=a.glyphs[e][g],f==null&&a.glyphs[e].type==\"glyph\"&&(f=a.glyphs[e]))}else f=a.glyphs[e];if(f==null)f=a.missingGlyph;return f};this.renderChildren=function(c){var b=this.parent.style(\"font-family\").Definition.getDefinition();if(b!=null){var k=this.parent.style(\"font-size\").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),\ne=this.parent.style(\"font-style\").valueOrDefault(a.Font.Parse(a.ctx.font).fontStyle),f=this.getText();b.isRTL&&(f=f.split(\"\").reverse().join(\"\"));for(var g=a.ToNumberArray(this.parent.attribute(\"dx\").value),j=0;j<f.length;j++){var h=this.getGlyph(b,f,j),l=k/b.fontFace.unitsPerEm;c.translate(this.x,this.y);c.scale(l,-l);var o=c.lineWidth;c.lineWidth=c.lineWidth*b.fontFace.unitsPerEm/k;e==\"italic\"&&c.transform(1,0,0.4,1,0,0);h.render(c);e==\"italic\"&&c.transform(1,0,-0.4,1,0,0);c.lineWidth=o;c.scale(1/\nl,-1/l);c.translate(-this.x,-this.y);this.x+=k*(h.horizAdvX||b.horizAdvX)/b.fontFace.unitsPerEm;typeof g[j]!=\"undefined\"&&!isNaN(g[j])&&(this.x+=g[j])}}else c.strokeStyle!=\"\"&&c.strokeText(a.compressSpaces(this.getText()),this.x,this.y),c.fillStyle!=\"\"&&c.fillText(a.compressSpaces(this.getText()),this.x,this.y)};this.getText=function(){};this.measureText=function(c){var b=this.parent.style(\"font-family\").Definition.getDefinition();if(b!=null){var c=this.parent.style(\"font-size\").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),\nk=0,e=this.getText();b.isRTL&&(e=e.split(\"\").reverse().join(\"\"));for(var f=a.ToNumberArray(this.parent.attribute(\"dx\").value),g=0;g<e.length;g++){var j=this.getGlyph(b,e,g);k+=(j.horizAdvX||b.horizAdvX)*c/b.fontFace.unitsPerEm;typeof f[g]!=\"undefined\"&&!isNaN(f[g])&&(k+=f[g])}return k}b=a.compressSpaces(this.getText());if(!c.measureText)return b.length*10;c.save();this.setContext(c);b=c.measureText(b).width;c.restore();return b}};a.Element.TextElementBase.prototype=new a.Element.RenderedElementBase;\na.Element.tspan=function(c){this.base=a.Element.TextElementBase;this.base(c);this.text=c.nodeType==3?c.nodeValue:c.childNodes.length>0?c.childNodes[0].nodeValue:c.text;this.getText=function(){return this.text}};a.Element.tspan.prototype=new a.Element.TextElementBase;a.Element.tref=function(c){this.base=a.Element.TextElementBase;this.base(c);this.getText=function(){var a=this.attribute(\"xlink:href\").Definition.getDefinition();if(a!=null)return a.children[0].getText()}};a.Element.tref.prototype=new a.Element.TextElementBase;\na.Element.a=function(c){this.base=a.Element.TextElementBase;this.base(c);this.hasText=!0;for(var d=0;d<c.childNodes.length;d++)if(c.childNodes[d].nodeType!=3)this.hasText=!1;this.text=this.hasText?c.childNodes[0].nodeValue:\"\";this.getText=function(){return this.text};this.baseRenderChildren=this.renderChildren;this.renderChildren=function(b){if(this.hasText){this.baseRenderChildren(b);var c=new a.Property(\"fontSize\",a.Font.Parse(a.ctx.font).fontSize);a.Mouse.checkBoundingBox(this,new a.BoundingBox(this.x,\nthis.y-c.Length.toPixels(\"y\"),this.x+this.measureText(b),this.y))}else c=new a.Element.g,c.children=this.children,c.parent=this,c.render(b)};this.onclick=function(){window.open(this.attribute(\"xlink:href\").value)};this.onmousemove=function(){a.ctx.canvas.style.cursor=\"pointer\"}};a.Element.a.prototype=new a.Element.TextElementBase;a.Element.image=function(c){this.base=a.Element.RenderedElementBase;this.base(c);a.Images.push(this);this.img=document.createElement(\"img\");this.loaded=!1;var d=this;this.img.onload=\nfunction(){d.loaded=!0};this.img.src=this.attribute(\"xlink:href\").value;this.renderChildren=function(b){var c=this.attribute(\"x\").Length.toPixels(\"x\"),d=this.attribute(\"y\").Length.toPixels(\"y\"),f=this.attribute(\"width\").Length.toPixels(\"x\"),g=this.attribute(\"height\").Length.toPixels(\"y\");f==0||g==0||(b.save(),b.translate(c,d),a.AspectRatio(b,this.attribute(\"preserveAspectRatio\").value,f,this.img.width,g,this.img.height,0,0),b.drawImage(this.img,0,0),b.restore())}};a.Element.image.prototype=new a.Element.RenderedElementBase;\na.Element.g=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getBoundingBox=function(){for(var c=new a.BoundingBox,b=0;b<this.children.length;b++)c.addBoundingBox(this.children[b].getBoundingBox());return c}};a.Element.g.prototype=new a.Element.RenderedElementBase;a.Element.symbol=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(c){this.baseSetContext(c);if(this.attribute(\"viewBox\").hasValue()){var b=\na.ToNumberArray(this.attribute(\"viewBox\").value),k=b[0],e=b[1];width=b[2];height=b[3];a.AspectRatio(c,this.attribute(\"preserveAspectRatio\").value,this.attribute(\"width\").Length.toPixels(\"x\"),width,this.attribute(\"height\").Length.toPixels(\"y\"),height,k,e);a.ViewPort.SetCurrent(b[2],b[3])}}};a.Element.symbol.prototype=new a.Element.RenderedElementBase;a.Element.style=function(c){this.base=a.Element.ElementBase;this.base(c);for(var c=c.childNodes[0].nodeValue+(c.childNodes.length>1?c.childNodes[1].nodeValue:\n\"\"),c=c.replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm,\"\"),c=a.compressSpaces(c),c=c.split(\"}\"),d=0;d<c.length;d++)if(a.trim(c[d])!=\"\")for(var b=c[d].split(\"{\"),k=b[0].split(\",\"),b=b[1].split(\";\"),e=0;e<k.length;e++){var f=a.trim(k[e]);if(f!=\"\"){for(var g={},j=0;j<b.length;j++){var h=b[j].indexOf(\":\"),l=b[j].substr(0,h),h=b[j].substr(h+1,b[j].length-h);l!=null&&h!=null&&(g[a.trim(l)]=new a.Property(a.trim(l),a.trim(h)))}a.Styles[f]=g;if(f==\"@font-face\"){f=g[\"font-family\"].value.replace(/\"/g,\n\"\");g=g.src.value.split(\",\");for(j=0;j<g.length;j++)if(g[j].indexOf('format(\"svg\")')>0){l=g[j].indexOf(\"url\");h=g[j].indexOf(\")\",l);l=g[j].substr(l+5,h-l-6);l=a.parseXml(a.ajax(l)).getElementsByTagName(\"font\");for(h=0;h<l.length;h++){var o=a.CreateElement(l[h]);a.Definitions[f]=o}}}}}};a.Element.style.prototype=new a.Element.ElementBase;a.Element.use=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(a){this.baseSetContext(a);\nthis.attribute(\"x\").hasValue()&&a.translate(this.attribute(\"x\").Length.toPixels(\"x\"),0);this.attribute(\"y\").hasValue()&&a.translate(0,this.attribute(\"y\").Length.toPixels(\"y\"))};this.getDefinition=function(){var a=this.attribute(\"xlink:href\").Definition.getDefinition();if(this.attribute(\"width\").hasValue())a.attribute(\"width\",!0).value=this.attribute(\"width\").value;if(this.attribute(\"height\").hasValue())a.attribute(\"height\",!0).value=this.attribute(\"height\").value;return a};this.path=function(a){var b=\nthis.getDefinition();b!=null&&b.path(a)};this.renderChildren=function(a){var b=this.getDefinition();b!=null&&b.render(a)}};a.Element.use.prototype=new a.Element.RenderedElementBase;a.Element.mask=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,b){var c=this.attribute(\"x\").Length.toPixels(\"x\"),e=this.attribute(\"y\").Length.toPixels(\"y\"),f=this.attribute(\"width\").Length.toPixels(\"x\"),g=this.attribute(\"height\").Length.toPixels(\"y\"),j=b.attribute(\"mask\").value;b.attribute(\"mask\").value=\n\"\";var h=document.createElement(\"canvas\");h.width=c+f;h.height=e+g;var l=h.getContext(\"2d\");this.renderChildren(l);var o=document.createElement(\"canvas\");o.width=c+f;o.height=e+g;var n=o.getContext(\"2d\");b.render(n);n.globalCompositeOperation=\"destination-in\";n.fillStyle=l.createPattern(h,\"no-repeat\");n.fillRect(0,0,c+f,e+g);a.fillStyle=n.createPattern(o,\"no-repeat\");a.fillRect(0,0,c+f,e+g);b.attribute(\"mask\").value=j};this.render=function(){}};a.Element.mask.prototype=new a.Element.ElementBase;a.Element.clipPath=\nfunction(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a){for(var b=0;b<this.children.length;b++)this.children[b].path&&(this.children[b].path(a),a.clip())};this.render=function(){}};a.Element.clipPath.prototype=new a.Element.ElementBase;a.Element.filter=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,b){var c=b.getBoundingBox(),e=this.attribute(\"x\").Length.toPixels(\"x\"),f=this.attribute(\"y\").Length.toPixels(\"y\");if(e==0||f==0)e=c.x1,f=c.y1;var g=\nthis.attribute(\"width\").Length.toPixels(\"x\"),j=this.attribute(\"height\").Length.toPixels(\"y\");if(g==0||j==0)g=c.width(),j=c.height();c=b.style(\"filter\").value;b.style(\"filter\").value=\"\";var h=0.2*g,l=0.2*j,o=document.createElement(\"canvas\");o.width=g+2*h;o.height=j+2*l;var n=o.getContext(\"2d\");n.translate(-e+h,-f+l);b.render(n);for(var q=0;q<this.children.length;q++)this.children[q].apply(n,0,0,g+2*h,j+2*l);a.drawImage(o,0,0,g+2*h,j+2*l,e-h,f-l,g+2*h,j+2*l);b.style(\"filter\",!0).value=c};this.render=\nfunction(){}};a.Element.filter.prototype=new a.Element.ElementBase;a.Element.feGaussianBlur=function(c){function d(a,c,d,f,g){for(var j=0;j<g;j++)for(var h=0;h<f;h++)for(var l=a[j*f*4+h*4+3]/255,o=0;o<4;o++){for(var n=d[0]*(l==0?255:a[j*f*4+h*4+o])*(l==0||o==3?1:l),q=1;q<d.length;q++){var p=Math.max(h-q,0),m=a[j*f*4+p*4+3]/255,p=Math.min(h+q,f-1),p=a[j*f*4+p*4+3]/255,s=d[q],r;m==0?r=255:(r=Math.max(h-q,0),r=a[j*f*4+r*4+o]);m=r*(m==0||o==3?1:m);p==0?r=255:(r=Math.min(h+q,f-1),r=a[j*f*4+r*4+o]);n+=\ns*(m+r*(p==0||o==3?1:p))}c[h*g*4+j*4+o]=n}}this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,c,e,f,g){var e=this.attribute(\"stdDeviation\").numValue(),c=a.getImageData(0,0,f,g),e=Math.max(e,0.01),j=Math.ceil(e*4)+1;mask=[];for(var h=0;h<j;h++)mask[h]=Math.exp(-0.5*(h/e)*(h/e));e=mask;j=0;for(h=1;h<e.length;h++)j+=Math.abs(e[h]);j=2*j+Math.abs(e[0]);for(h=0;h<e.length;h++)e[h]/=j;tmp=[];d(c.data,tmp,e,f,g);d(tmp,c.data,e,g,f);a.clearRect(0,0,f,g);a.putImageData(c,0,0)}};a.Element.filter.prototype=\nnew a.Element.feGaussianBlur;a.Element.title=function(){};a.Element.title.prototype=new a.Element.ElementBase;a.Element.desc=function(){};a.Element.desc.prototype=new a.Element.ElementBase;a.Element.MISSING=function(a){console.log(\"ERROR: Element '\"+a.nodeName+\"' not yet implemented.\")};a.Element.MISSING.prototype=new a.Element.ElementBase;a.CreateElement=function(c){var d=c.nodeName.replace(/^[^:]+:/,\"\"),d=d.replace(/\\-/g,\"\"),b=null,b=typeof a.Element[d]!=\"undefined\"?new a.Element[d](c):new a.Element.MISSING(c);\nb.type=c.nodeName;return b};a.load=function(c,d){a.loadXml(c,a.ajax(d))};a.loadXml=function(c,d){a.loadXmlDoc(c,a.parseXml(d))};a.loadXmlDoc=function(c,d){a.init(c);var b=function(a){for(var b=c.canvas;b;)a.x-=b.offsetLeft,a.y-=b.offsetTop,b=b.offsetParent;window.scrollX&&(a.x+=window.scrollX);window.scrollY&&(a.y+=window.scrollY);return a};if(a.opts.ignoreMouse!=!0)c.canvas.onclick=function(c){c=b(new a.Point(c!=null?c.clientX:event.clientX,c!=null?c.clientY:event.clientY));a.Mouse.onclick(c.x,c.y)},\nc.canvas.onmousemove=function(c){c=b(new a.Point(c!=null?c.clientX:event.clientX,c!=null?c.clientY:event.clientY));a.Mouse.onmousemove(c.x,c.y)};var k=a.CreateElement(d.documentElement),e=k.root=!0,f=function(){a.ViewPort.Clear();c.canvas.parentNode&&a.ViewPort.SetCurrent(c.canvas.parentNode.clientWidth,c.canvas.parentNode.clientHeight);if(a.opts.ignoreDimensions!=!0){if(k.style(\"width\").hasValue())c.canvas.width=k.style(\"width\").Length.toPixels(\"x\"),c.canvas.style.width=c.canvas.width+\"px\";if(k.style(\"height\").hasValue())c.canvas.height=\nk.style(\"height\").Length.toPixels(\"y\"),c.canvas.style.height=c.canvas.height+\"px\"}var b=c.canvas.clientWidth||c.canvas.width,d=c.canvas.clientHeight||c.canvas.height;a.ViewPort.SetCurrent(b,d);if(a.opts!=null&&a.opts.offsetX!=null)k.attribute(\"x\",!0).value=a.opts.offsetX;if(a.opts!=null&&a.opts.offsetY!=null)k.attribute(\"y\",!0).value=a.opts.offsetY;if(a.opts!=null&&a.opts.scaleWidth!=null&&a.opts.scaleHeight!=null){var f=1,g=1;k.attribute(\"width\").hasValue()&&(f=k.attribute(\"width\").Length.toPixels(\"x\")/\na.opts.scaleWidth);k.attribute(\"height\").hasValue()&&(g=k.attribute(\"height\").Length.toPixels(\"y\")/a.opts.scaleHeight);k.attribute(\"width\",!0).value=a.opts.scaleWidth;k.attribute(\"height\",!0).value=a.opts.scaleHeight;k.attribute(\"viewBox\",!0).value=\"0 0 \"+b*f+\" \"+d*g;k.attribute(\"preserveAspectRatio\",!0).value=\"none\"}a.opts.ignoreClear!=!0&&c.clearRect(0,0,b,d);k.render(c);e&&(e=!1,a.opts!=null&&typeof a.opts.renderCallback==\"function\"&&a.opts.renderCallback())},g=!0;a.ImagesLoaded()&&(g=!1,f());\na.intervalID=setInterval(function(){var b=!1;g&&a.ImagesLoaded()&&(g=!1,b=!0);a.opts.ignoreMouse!=!0&&(b|=a.Mouse.hasEvents());if(a.opts.ignoreAnimation!=!0)for(var c=0;c<a.Animations.length;c++)b|=a.Animations[c].update(1E3/a.FRAMERATE);a.opts!=null&&typeof a.opts.forceRedraw==\"function\"&&a.opts.forceRedraw()==!0&&(b=!0);b&&(f(),a.Mouse.runEvents())},1E3/a.FRAMERATE)};a.stop=function(){a.intervalID&&clearInterval(a.intervalID)};a.Mouse=new function(){this.events=[];this.hasEvents=function(){return this.events.length!=\n0};this.onclick=function(a,d){this.events.push({type:\"onclick\",x:a,y:d,run:function(a){if(a.onclick)a.onclick()}})};this.onmousemove=function(a,d){this.events.push({type:\"onmousemove\",x:a,y:d,run:function(a){if(a.onmousemove)a.onmousemove()}})};this.eventElements=[];this.checkPath=function(a,d){for(var b=0;b<this.events.length;b++){var k=this.events[b];d.isPointInPath&&d.isPointInPath(k.x,k.y)&&(this.eventElements[b]=a)}};this.checkBoundingBox=function(a,d){for(var b=0;b<this.events.length;b++){var k=\nthis.events[b];d.isPointInBox(k.x,k.y)&&(this.eventElements[b]=a)}};this.runEvents=function(){a.ctx.canvas.style.cursor=\"\";for(var c=0;c<this.events.length;c++)for(var d=this.events[c],b=this.eventElements[c];b;)d.run(b),b=b.parent;this.events=[];this.eventElements=[]}};return a}this.canvg=function(a,c,d){if(a==null&&c==null&&d==null)for(var c=document.getElementsByTagName(\"svg\"),b=0;b<c.length;b++){a=c[b];d=document.createElement(\"canvas\");d.width=a.clientWidth;d.height=a.clientHeight;a.parentNode.insertBefore(d,\na);a.parentNode.removeChild(a);var k=document.createElement(\"div\");k.appendChild(a);canvg(d,k.innerHTML)}else d=d||{},typeof a==\"string\"&&(a=document.getElementById(a)),a.svg==null?(b=m(),a.svg=b):(b=a.svg,b.stop()),b.opts=d,a=a.getContext(\"2d\"),typeof c.documentElement!=\"undefined\"?b.loadXmlDoc(a,c):c.substr(0,1)==\"<\"?b.loadXml(a,c):b.load(a,c)}})();\nif(CanvasRenderingContext2D)CanvasRenderingContext2D.prototype.drawSvg=function(m,a,c,d,b){canvg(this.canvas,m,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:a,offsetY:c,scaleWidth:d,scaleHeight:b})};\n(function(m){var a=m.css,c=m.CanVGRenderer,d=m.SVGRenderer,b=m.extend,k=m.merge,e=m.addEvent,f=m.createElement,g=m.discardElement;b(c.prototype,d.prototype);b(c.prototype,{create:function(a,b,c,d){this.setContainer(b,c,d);this.configure(a)},setContainer:function(a,b,c){var d=a.style,e=a.parentNode,g=d.left,d=d.top,k=a.offsetWidth,m=a.offsetHeight,s={visibility:\"hidden\",position:\"absolute\"};this.init.apply(this,[a,b,c]);this.canvas=f(\"canvas\",{width:k,height:m},{position:\"relative\",left:g,top:d},a);\nthis.ttLine=f(\"div\",null,s,e);this.ttDiv=f(\"div\",null,s,e);this.ttTimer=void 0;this.hiddenSvg=a=f(\"div\",{width:k,height:m},{visibility:\"hidden\",left:g,top:d},e);a.appendChild(this.box)},configure:function(b){var c=this,d=b.options.tooltip,f=d.borderWidth,g=c.ttDiv,m=d.style,p=c.ttLine,t=parseInt(m.padding,10),m=k(m,{padding:t+\"px\",\"background-color\":d.backgroundColor,\"border-style\":\"solid\",\"border-width\":f+\"px\",\"border-radius\":d.borderRadius+\"px\"});d.shadow&&(m=k(m,{\"box-shadow\":\"1px 1px 3px gray\",\n\"-webkit-box-shadow\":\"1px 1px 3px gray\"}));a(g,m);a(p,{\"border-left\":\"1px solid darkgray\"});e(b,\"tooltipRefresh\",function(d){var e=b.container,f=e.offsetLeft,e=e.offsetTop,k;g.innerHTML=d.text;k=b.tooltip.getPosition(g.offsetWidth,g.offsetHeight,{plotX:d.x,plotY:d.y});a(g,{visibility:\"visible\",left:k.x+\"px\",top:k.y+\"px\",\"border-color\":d.borderColor});a(p,{visibility:\"visible\",left:f+d.x+\"px\",top:e+b.plotTop+\"px\",height:b.plotHeight+\"px\"});c.ttTimer!==void 0&&clearTimeout(c.ttTimer);c.ttTimer=setTimeout(function(){a(g,\n{visibility:\"hidden\"});a(p,{visibility:\"hidden\"})},3E3)})},destroy:function(){g(this.canvas);this.ttTimer!==void 0&&clearTimeout(this.ttTimer);g(this.ttLine);g(this.ttDiv);g(this.hiddenSvg);return d.prototype.destroy.apply(this)},color:function(a,b,c){a&&a.linearGradient&&(a=a.stops[a.stops.length-1][1]);return d.prototype.color.call(this,a,b,c)},draw:function(){window.canvg(this.canvas,this.hiddenSvg.innerHTML)}})})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/canvas-tools.src.js",
    "content": "/**\n * @license A class to parse color values\n * @author Stoyan Stefanov <sstoo@gmail.com>\n * @link   http://www.phpied.com/rgb-color-parser-in-javascript/\n * Use it if you like it\n *\n */\nfunction RGBColor(color_string)\n{\n    this.ok = false;\n\n    // strip any leading #\n    if (color_string.charAt(0) == '#') { // remove # if any\n        color_string = color_string.substr(1,6);\n    }\n\n    color_string = color_string.replace(/ /g,'');\n    color_string = color_string.toLowerCase();\n\n    // before getting into regexps, try simple matches\n    // and overwrite the input\n    var simple_colors = {\n        aliceblue: 'f0f8ff',\n        antiquewhite: 'faebd7',\n        aqua: '00ffff',\n        aquamarine: '7fffd4',\n        azure: 'f0ffff',\n        beige: 'f5f5dc',\n        bisque: 'ffe4c4',\n        black: '000000',\n        blanchedalmond: 'ffebcd',\n        blue: '0000ff',\n        blueviolet: '8a2be2',\n        brown: 'a52a2a',\n        burlywood: 'deb887',\n        cadetblue: '5f9ea0',\n        chartreuse: '7fff00',\n        chocolate: 'd2691e',\n        coral: 'ff7f50',\n        cornflowerblue: '6495ed',\n        cornsilk: 'fff8dc',\n        crimson: 'dc143c',\n        cyan: '00ffff',\n        darkblue: '00008b',\n        darkcyan: '008b8b',\n        darkgoldenrod: 'b8860b',\n        darkgray: 'a9a9a9',\n        darkgreen: '006400',\n        darkkhaki: 'bdb76b',\n        darkmagenta: '8b008b',\n        darkolivegreen: '556b2f',\n        darkorange: 'ff8c00',\n        darkorchid: '9932cc',\n        darkred: '8b0000',\n        darksalmon: 'e9967a',\n        darkseagreen: '8fbc8f',\n        darkslateblue: '483d8b',\n        darkslategray: '2f4f4f',\n        darkturquoise: '00ced1',\n        darkviolet: '9400d3',\n        deeppink: 'ff1493',\n        deepskyblue: '00bfff',\n        dimgray: '696969',\n        dodgerblue: '1e90ff',\n        feldspar: 'd19275',\n        firebrick: 'b22222',\n        floralwhite: 'fffaf0',\n        forestgreen: '228b22',\n        fuchsia: 'ff00ff',\n        gainsboro: 'dcdcdc',\n        ghostwhite: 'f8f8ff',\n        gold: 'ffd700',\n        goldenrod: 'daa520',\n        gray: '808080',\n        green: '008000',\n        greenyellow: 'adff2f',\n        honeydew: 'f0fff0',\n        hotpink: 'ff69b4',\n        indianred : 'cd5c5c',\n        indigo : '4b0082',\n        ivory: 'fffff0',\n        khaki: 'f0e68c',\n        lavender: 'e6e6fa',\n        lavenderblush: 'fff0f5',\n        lawngreen: '7cfc00',\n        lemonchiffon: 'fffacd',\n        lightblue: 'add8e6',\n        lightcoral: 'f08080',\n        lightcyan: 'e0ffff',\n        lightgoldenrodyellow: 'fafad2',\n        lightgrey: 'd3d3d3',\n        lightgreen: '90ee90',\n        lightpink: 'ffb6c1',\n        lightsalmon: 'ffa07a',\n        lightseagreen: '20b2aa',\n        lightskyblue: '87cefa',\n        lightslateblue: '8470ff',\n        lightslategray: '778899',\n        lightsteelblue: 'b0c4de',\n        lightyellow: 'ffffe0',\n        lime: '00ff00',\n        limegreen: '32cd32',\n        linen: 'faf0e6',\n        magenta: 'ff00ff',\n        maroon: '800000',\n        mediumaquamarine: '66cdaa',\n        mediumblue: '0000cd',\n        mediumorchid: 'ba55d3',\n        mediumpurple: '9370d8',\n        mediumseagreen: '3cb371',\n        mediumslateblue: '7b68ee',\n        mediumspringgreen: '00fa9a',\n        mediumturquoise: '48d1cc',\n        mediumvioletred: 'c71585',\n        midnightblue: '191970',\n        mintcream: 'f5fffa',\n        mistyrose: 'ffe4e1',\n        moccasin: 'ffe4b5',\n        navajowhite: 'ffdead',\n        navy: '000080',\n        oldlace: 'fdf5e6',\n        olive: '808000',\n        olivedrab: '6b8e23',\n        orange: 'ffa500',\n        orangered: 'ff4500',\n        orchid: 'da70d6',\n        palegoldenrod: 'eee8aa',\n        palegreen: '98fb98',\n        paleturquoise: 'afeeee',\n        palevioletred: 'd87093',\n        papayawhip: 'ffefd5',\n        peachpuff: 'ffdab9',\n        peru: 'cd853f',\n        pink: 'ffc0cb',\n        plum: 'dda0dd',\n        powderblue: 'b0e0e6',\n        purple: '800080',\n        red: 'ff0000',\n        rosybrown: 'bc8f8f',\n        royalblue: '4169e1',\n        saddlebrown: '8b4513',\n        salmon: 'fa8072',\n        sandybrown: 'f4a460',\n        seagreen: '2e8b57',\n        seashell: 'fff5ee',\n        sienna: 'a0522d',\n        silver: 'c0c0c0',\n        skyblue: '87ceeb',\n        slateblue: '6a5acd',\n        slategray: '708090',\n        snow: 'fffafa',\n        springgreen: '00ff7f',\n        steelblue: '4682b4',\n        tan: 'd2b48c',\n        teal: '008080',\n        thistle: 'd8bfd8',\n        tomato: 'ff6347',\n        turquoise: '40e0d0',\n        violet: 'ee82ee',\n        violetred: 'd02090',\n        wheat: 'f5deb3',\n        white: 'ffffff',\n        whitesmoke: 'f5f5f5',\n        yellow: 'ffff00',\n        yellowgreen: '9acd32'\n    };\n    for (var key in simple_colors) {\n        if (color_string == key) {\n            color_string = simple_colors[key];\n        }\n    }\n    // emd of simple type-in colors\n\n    // array of color definition objects\n    var color_defs = [\n        {\n            re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1]),\n                    parseInt(bits[2]),\n                    parseInt(bits[3])\n                ];\n            }\n        },\n        {\n            re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n            example: ['#00ff00', '336699'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1], 16),\n                    parseInt(bits[2], 16),\n                    parseInt(bits[3], 16)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n            example: ['#fb0', 'f0f'],\n            process: function (bits){\n                return [\n                    parseInt(bits[1] + bits[1], 16),\n                    parseInt(bits[2] + bits[2], 16),\n                    parseInt(bits[3] + bits[3], 16)\n                ];\n            }\n        }\n    ];\n\n    // search through the definitions to find a match\n    for (var i = 0; i < color_defs.length; i++) {\n        var re = color_defs[i].re;\n        var processor = color_defs[i].process;\n        var bits = re.exec(color_string);\n        if (bits) {\n            channels = processor(bits);\n            this.r = channels[0];\n            this.g = channels[1];\n            this.b = channels[2];\n            this.ok = true;\n        }\n\n    }\n\n    // validate/cleanup values\n    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);\n    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);\n    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);\n\n    // some getters\n    this.toRGB = function () {\n        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';\n    }\n    this.toHex = function () {\n        var r = this.r.toString(16);\n        var g = this.g.toString(16);\n        var b = this.b.toString(16);\n        if (r.length == 1) r = '0' + r;\n        if (g.length == 1) g = '0' + g;\n        if (b.length == 1) b = '0' + b;\n        return '#' + r + g + b;\n    }\n\n    // help\n    this.getHelpXML = function () {\n\n        var examples = new Array();\n        // add regexps\n        for (var i = 0; i < color_defs.length; i++) {\n            var example = color_defs[i].example;\n            for (var j = 0; j < example.length; j++) {\n                examples[examples.length] = example[j];\n            }\n        }\n        // add type-in colors\n        for (var sc in simple_colors) {\n            examples[examples.length] = sc;\n        }\n\n        var xml = document.createElement('ul');\n        xml.setAttribute('id', 'rgbcolor-examples');\n        for (var i = 0; i < examples.length; i++) {\n            try {\n                var list_item = document.createElement('li');\n                var list_color = new RGBColor(examples[i]);\n                var example_div = document.createElement('div');\n                example_div.style.cssText =\n                        'margin: 3px; '\n                        + 'border: 1px solid black; '\n                        + 'background:' + list_color.toHex() + '; '\n                        + 'color:' + list_color.toHex()\n                ;\n                example_div.appendChild(document.createTextNode('test'));\n                var list_item_value = document.createTextNode(\n                    ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()\n                );\n                list_item.appendChild(example_div);\n                list_item.appendChild(list_item_value);\n                xml.appendChild(list_item);\n\n            } catch(e){}\n        }\n        return xml;\n\n    }\n\n}\n\n/**\n * @license canvg.js - Javascript SVG parser and renderer on Canvas\n * MIT Licensed \n * Gabe Lerner (gabelerner@gmail.com)\n * http://code.google.com/p/canvg/\n *\n * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/\n *\n */\nif(!window.console) {\n\twindow.console = {};\n\twindow.console.log = function(str) {};\n\twindow.console.dir = function(str) {};\n}\n\nif(!Array.prototype.indexOf){\n\tArray.prototype.indexOf = function(obj){\n\t\tfor(var i=0; i<this.length; i++){\n\t\t\tif(this[i]==obj){\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n}\n\n(function(){\n\t// canvg(target, s)\n\t// empty parameters: replace all 'svg' elements on page with 'canvas' elements\n\t// target: canvas element or the id of a canvas element\n\t// s: svg string, url to svg file, or xml document\n\t// opts: optional hash of options\n\t//\t\t ignoreMouse: true => ignore mouse events\n\t//\t\t ignoreAnimation: true => ignore animations\n\t//\t\t ignoreDimensions: true => does not try to resize canvas\n\t//\t\t ignoreClear: true => does not clear canvas\n\t//\t\t offsetX: int => draws at a x offset\n\t//\t\t offsetY: int => draws at a y offset\n\t//\t\t scaleWidth: int => scales horizontally to width\n\t//\t\t scaleHeight: int => scales vertically to height\n\t//\t\t renderCallback: function => will call the function after the first render is completed\n\t//\t\t forceRedraw: function => will call the function on every frame, if it returns true, will redraw\n\tthis.canvg = function (target, s, opts) {\n\t\t// no parameters\n\t\tif (target == null && s == null && opts == null) {\n\t\t\tvar svgTags = document.getElementsByTagName('svg');\n\t\t\tfor (var i=0; i<svgTags.length; i++) {\n\t\t\t\tvar svgTag = svgTags[i];\n\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\tc.width = svgTag.clientWidth;\n\t\t\t\tc.height = svgTag.clientHeight;\n\t\t\t\tsvgTag.parentNode.insertBefore(c, svgTag);\n\t\t\t\tsvgTag.parentNode.removeChild(svgTag);\n\t\t\t\tvar div = document.createElement('div');\n\t\t\t\tdiv.appendChild(svgTag);\n\t\t\t\tcanvg(c, div.innerHTML);\n\t\t\t}\n\t\t\treturn;\n\t\t}\t\n\t\topts = opts || {};\n\t\n\t\tif (typeof target == 'string') {\n\t\t\ttarget = document.getElementById(target);\n\t\t}\n\t\t\n\t\t// reuse class per canvas\n\t\tvar svg;\n\t\tif (target.svg == null) {\n\t\t\tsvg = build();\n\t\t\ttarget.svg = svg;\n\t\t}\n\t\telse {\n\t\t\tsvg = target.svg;\n\t\t\tsvg.stop();\n\t\t}\n\t\tsvg.opts = opts;\n\t\t\n\t\tvar ctx = target.getContext('2d');\n\t\tif (typeof(s.documentElement) != 'undefined') {\n\t\t\t// load from xml doc\n\t\t\tsvg.loadXmlDoc(ctx, s);\n\t\t}\n\t\telse if (s.substr(0,1) == '<') {\n\t\t\t// load from xml string\n\t\t\tsvg.loadXml(ctx, s);\n\t\t}\n\t\telse {\n\t\t\t// load from url\n\t\t\tsvg.load(ctx, s);\n\t\t}\n\t}\n\n\tfunction build() {\n\t\tvar svg = { };\n\t\t\n\t\tsvg.FRAMERATE = 30;\n\t\tsvg.MAX_VIRTUAL_PIXELS = 30000;\n\t\t\n\t\t// globals\n\t\tsvg.init = function(ctx) {\n\t\t\tsvg.Definitions = {};\n\t\t\tsvg.Styles = {};\n\t\t\tsvg.Animations = [];\n\t\t\tsvg.Images = [];\n\t\t\tsvg.ctx = ctx;\n\t\t\tsvg.ViewPort = new (function () {\n\t\t\t\tthis.viewPorts = [];\n\t\t\t\tthis.Clear = function() { this.viewPorts = []; }\n\t\t\t\tthis.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }\n\t\t\t\tthis.RemoveCurrent = function() { this.viewPorts.pop(); }\n\t\t\t\tthis.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }\n\t\t\t\tthis.width = function() { return this.Current().width; }\n\t\t\t\tthis.height = function() { return this.Current().height; }\n\t\t\t\tthis.ComputeSize = function(d) {\n\t\t\t\t\tif (d != null && typeof(d) == 'number') return d;\n\t\t\t\t\tif (d == 'x') return this.width();\n\t\t\t\t\tif (d == 'y') return this.height();\n\t\t\t\t\treturn Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tsvg.init();\n\t\t\n\t\t// images loaded\n\t\tsvg.ImagesLoaded = function() { \n\t\t\tfor (var i=0; i<svg.Images.length; i++) {\n\t\t\t\tif (!svg.Images[i].loaded) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t// trim\n\t\tsvg.trim = function(s) { return s.replace(/^\\s+|\\s+$/g, ''); }\n\t\t\n\t\t// compress spaces\n\t\tsvg.compressSpaces = function(s) { return s.replace(/[\\s\\r\\t\\n]+/gm,' '); }\n\t\t\n\t\t// ajax\n\t\tsvg.ajax = function(url) {\n\t\t\tvar AJAX;\n\t\t\tif(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}\n\t\t\telse{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}\n\t\t\tif(AJAX){\n\t\t\t   AJAX.open('GET',url,false);\n\t\t\t   AJAX.send(null);\n\t\t\t   return AJAX.responseText;\n\t\t\t}\n\t\t\treturn null;\n\t\t} \n\t\t\n\t\t// parse xml\n\t\tsvg.parseXml = function(xml) {\n\t\t\tif (window.DOMParser)\n\t\t\t{\n\t\t\t\tvar parser = new DOMParser();\n\t\t\t\treturn parser.parseFromString(xml, 'text/xml');\n\t\t\t}\n\t\t\telse \n\t\t\t{\n\t\t\t\txml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');\n\t\t\t\tvar xmlDoc = new ActiveXObject('Microsoft.XMLDOM');\n\t\t\t\txmlDoc.async = 'false';\n\t\t\t\txmlDoc.loadXML(xml); \n\t\t\t\treturn xmlDoc;\n\t\t\t}\t\t\n\t\t}\n\t\t\n\t\tsvg.Property = function(name, value) {\n\t\t\tthis.name = name;\n\t\t\tthis.value = value;\n\t\t\t\n\t\t\tthis.hasValue = function() {\n\t\t\t\treturn (this.value != null && this.value !== '');\n\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t// return the numerical value of the property\n\t\t\tthis.numValue = function() {\n\t\t\t\tif (!this.hasValue()) return 0;\n\t\t\t\t\n\t\t\t\tvar n = parseFloat(this.value);\n\t\t\t\tif ((this.value + '').match(/%$/)) {\n\t\t\t\t\tn = n / 100.0;\n\t\t\t\t}\n\t\t\t\treturn n;\n\t\t\t}\n\t\t\t\n\t\t\tthis.valueOrDefault = function(def) {\n\t\t\t\tif (this.hasValue()) return this.value;\n\t\t\t\treturn def;\n\t\t\t}\n\t\t\t\n\t\t\tthis.numValueOrDefault = function(def) {\n\t\t\t\tif (this.hasValue()) return this.numValue();\n\t\t\t\treturn def;\n\t\t\t}\n\t\t\t\n\t\t\t/* EXTENSIONS */\n\t\t\tvar that = this;\n\t\t\t\n\t\t\t// color extensions\n\t\t\tthis.Color = {\n\t\t\t\t// augment the current color value with the opacity\n\t\t\t\taddOpacity: function(opacity) {\n\t\t\t\t\tvar newValue = that.value;\n\t\t\t\t\tif (opacity != null && opacity != '') {\n\t\t\t\t\t\tvar color = new RGBColor(that.value);\n\t\t\t\t\t\tif (color.ok) {\n\t\t\t\t\t\t\tnewValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacity + ')';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn new svg.Property(that.name, newValue);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// definition extensions\n\t\t\tthis.Definition = {\n\t\t\t\t// get the definition from the definitions table\n\t\t\t\tgetDefinition: function() {\n\t\t\t\t\tvar name = that.value.replace(/^(url\\()?#([^\\)]+)\\)?$/, '$2');\n\t\t\t\t\treturn svg.Definitions[name];\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\tisUrl: function() {\n\t\t\t\t\treturn that.value.indexOf('url(') == 0\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\tgetFillStyle: function(e) {\n\t\t\t\t\tvar def = this.getDefinition();\n\t\t\t\t\t\n\t\t\t\t\t// gradient\n\t\t\t\t\tif (def != null && def.createGradient) {\n\t\t\t\t\t\treturn def.createGradient(svg.ctx, e);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// pattern\n\t\t\t\t\tif (def != null && def.createPattern) {\n\t\t\t\t\t\treturn def.createPattern(svg.ctx, e);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// length extensions\n\t\t\tthis.Length = {\n\t\t\t\tDPI: function(viewPort) {\n\t\t\t\t\treturn 96.0; // TODO: compute?\n\t\t\t\t},\n\t\t\t\t\n\t\t\t\tEM: function(viewPort) {\n\t\t\t\t\tvar em = 12;\n\t\t\t\t\t\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\t\tif (fontSize.hasValue()) em = fontSize.Length.toPixels(viewPort);\n\t\t\t\t\t\n\t\t\t\t\treturn em;\n\t\t\t\t},\n\t\t\t\n\t\t\t\t// get the length as pixels\n\t\t\t\ttoPixels: function(viewPort) {\n\t\t\t\t\tif (!that.hasValue()) return 0;\n\t\t\t\t\tvar s = that.value+'';\n\t\t\t\t\tif (s.match(/em$/)) return that.numValue() * this.EM(viewPort);\n\t\t\t\t\tif (s.match(/ex$/)) return that.numValue() * this.EM(viewPort) / 2.0;\n\t\t\t\t\tif (s.match(/px$/)) return that.numValue();\n\t\t\t\t\tif (s.match(/pt$/)) return that.numValue() * 1.25;\n\t\t\t\t\tif (s.match(/pc$/)) return that.numValue() * 15;\n\t\t\t\t\tif (s.match(/cm$/)) return that.numValue() * this.DPI(viewPort) / 2.54;\n\t\t\t\t\tif (s.match(/mm$/)) return that.numValue() * this.DPI(viewPort) / 25.4;\n\t\t\t\t\tif (s.match(/in$/)) return that.numValue() * this.DPI(viewPort);\n\t\t\t\t\tif (s.match(/%$/)) return that.numValue() * svg.ViewPort.ComputeSize(viewPort);\n\t\t\t\t\treturn that.numValue();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// time extensions\n\t\t\tthis.Time = {\n\t\t\t\t// get the time as milliseconds\n\t\t\t\ttoMilliseconds: function() {\n\t\t\t\t\tif (!that.hasValue()) return 0;\n\t\t\t\t\tvar s = that.value+'';\n\t\t\t\t\tif (s.match(/s$/)) return that.numValue() * 1000;\n\t\t\t\t\tif (s.match(/ms$/)) return that.numValue();\n\t\t\t\t\treturn that.numValue();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// angle extensions\n\t\t\tthis.Angle = {\n\t\t\t\t// get the angle as radians\n\t\t\t\ttoRadians: function() {\n\t\t\t\t\tif (!that.hasValue()) return 0;\n\t\t\t\t\tvar s = that.value+'';\n\t\t\t\t\tif (s.match(/deg$/)) return that.numValue() * (Math.PI / 180.0);\n\t\t\t\t\tif (s.match(/grad$/)) return that.numValue() * (Math.PI / 200.0);\n\t\t\t\t\tif (s.match(/rad$/)) return that.numValue();\n\t\t\t\t\treturn that.numValue() * (Math.PI / 180.0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// fonts\n\t\tsvg.Font = new (function() {\n\t\t\tthis.Styles = ['normal','italic','oblique','inherit'];\n\t\t\tthis.Variants = ['normal','small-caps','inherit'];\n\t\t\tthis.Weights = ['normal','bold','bolder','lighter','100','200','300','400','500','600','700','800','900','inherit'];\n\t\t\t\n\t\t\tthis.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { \n\t\t\t\tvar f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);\n\t\t\t\treturn { \n\t\t\t\t\tfontFamily: fontFamily || f.fontFamily, \n\t\t\t\t\tfontSize: fontSize || f.fontSize, \n\t\t\t\t\tfontStyle: fontStyle || f.fontStyle, \n\t\t\t\t\tfontWeight: fontWeight || f.fontWeight, \n\t\t\t\t\tfontVariant: fontVariant || f.fontVariant,\n\t\t\t\t\ttoString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } \n\t\t\t\t} \n\t\t\t}\n\t\t\t\n\t\t\tvar that = this;\n\t\t\tthis.Parse = function(s) {\n\t\t\t\tvar f = {};\n\t\t\t\tvar d = svg.trim(svg.compressSpaces(s || '')).split(' ');\n\t\t\t\tvar set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }\n\t\t\t\tvar ff = '';\n\t\t\t\tfor (var i=0; i<d.length; i++) {\n\t\t\t\t\tif (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }\n\t\t\t\t\telse if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;\t}\n\t\t\t\t\telse if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {\tif (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }\n\t\t\t\t\telse if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }\n\t\t\t\t\telse { if (d[i] != 'inherit') ff += d[i]; }\n\t\t\t\t} if (ff != '') f.fontFamily = ff;\n\t\t\t\treturn f;\n\t\t\t}\n\t\t});\n\t\t\n\t\t// points and paths\n\t\tsvg.ToNumberArray = function(s) {\n\t\t\tvar a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');\n\t\t\tfor (var i=0; i<a.length; i++) {\n\t\t\t\ta[i] = parseFloat(a[i]);\n\t\t\t}\n\t\t\treturn a;\n\t\t}\t\t\n\t\tsvg.Point = function(x, y) {\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\t\n\t\t\tthis.angleTo = function(p) {\n\t\t\t\treturn Math.atan2(p.y - this.y, p.x - this.x);\n\t\t\t}\n\t\t\t\n\t\t\tthis.applyTransform = function(v) {\n\t\t\t\tvar xp = this.x * v[0] + this.y * v[2] + v[4];\n\t\t\t\tvar yp = this.x * v[1] + this.y * v[3] + v[5];\n\t\t\t\tthis.x = xp;\n\t\t\t\tthis.y = yp;\n\t\t\t}\n\t\t}\n\t\tsvg.CreatePoint = function(s) {\n\t\t\tvar a = svg.ToNumberArray(s);\n\t\t\treturn new svg.Point(a[0], a[1]);\n\t\t}\n\t\tsvg.CreatePath = function(s) {\n\t\t\tvar a = svg.ToNumberArray(s);\n\t\t\tvar path = [];\n\t\t\tfor (var i=0; i<a.length; i+=2) {\n\t\t\t\tpath.push(new svg.Point(a[i], a[i+1]));\n\t\t\t}\n\t\t\treturn path;\n\t\t}\n\t\t\n\t\t// bounding box\n\t\tsvg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want\n\t\t\tthis.x1 = Number.NaN;\n\t\t\tthis.y1 = Number.NaN;\n\t\t\tthis.x2 = Number.NaN;\n\t\t\tthis.y2 = Number.NaN;\n\t\t\t\n\t\t\tthis.x = function() { return this.x1; }\n\t\t\tthis.y = function() { return this.y1; }\n\t\t\tthis.width = function() { return this.x2 - this.x1; }\n\t\t\tthis.height = function() { return this.y2 - this.y1; }\n\t\t\t\n\t\t\tthis.addPoint = function(x, y) {\t\n\t\t\t\tif (x != null) {\n\t\t\t\t\tif (isNaN(this.x1) || isNaN(this.x2)) {\n\t\t\t\t\t\tthis.x1 = x;\n\t\t\t\t\t\tthis.x2 = x;\n\t\t\t\t\t}\n\t\t\t\t\tif (x < this.x1) this.x1 = x;\n\t\t\t\t\tif (x > this.x2) this.x2 = x;\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (y != null) {\n\t\t\t\t\tif (isNaN(this.y1) || isNaN(this.y2)) {\n\t\t\t\t\t\tthis.y1 = y;\n\t\t\t\t\t\tthis.y2 = y;\n\t\t\t\t\t}\n\t\t\t\t\tif (y < this.y1) this.y1 = y;\n\t\t\t\t\tif (y > this.y2) this.y2 = y;\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t\tthis.addX = function(x) { this.addPoint(x, null); }\n\t\t\tthis.addY = function(y) { this.addPoint(null, y); }\n\t\t\t\n\t\t\tthis.addBoundingBox = function(bb) {\n\t\t\t\tthis.addPoint(bb.x1, bb.y1);\n\t\t\t\tthis.addPoint(bb.x2, bb.y2);\n\t\t\t}\n\t\t\t\n\t\t\tthis.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {\n\t\t\t\tvar cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\t\t\t\tvar cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\t\t\t\tvar cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\t\t\t\tvar cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\t\t\t\tthis.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,\tcp2y, p2x, p2y);\n\t\t\t}\n\t\t\t\n\t\t\tthis.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n\t\t\t\t// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n\t\t\t\tvar p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];\n\t\t\t\tthis.addPoint(p0[0], p0[1]);\n\t\t\t\tthis.addPoint(p3[0], p3[1]);\n\t\t\t\t\n\t\t\t\tfor (i=0; i<=1; i++) {\n\t\t\t\t\tvar f = function(t) { \n\t\t\t\t\t\treturn Math.pow(1-t, 3) * p0[i]\n\t\t\t\t\t\t+ 3 * Math.pow(1-t, 2) * t * p1[i]\n\t\t\t\t\t\t+ 3 * (1-t) * Math.pow(t, 2) * p2[i]\n\t\t\t\t\t\t+ Math.pow(t, 3) * p3[i];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n\t\t\t\t\tvar a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n\t\t\t\t\tvar c = 3 * p1[i] - 3 * p0[i];\n\t\t\t\t\t\n\t\t\t\t\tif (a == 0) {\n\t\t\t\t\t\tif (b == 0) continue;\n\t\t\t\t\t\tvar t = -c / b;\n\t\t\t\t\t\tif (0 < t && t < 1) {\n\t\t\t\t\t\t\tif (i == 0) this.addX(f(t));\n\t\t\t\t\t\t\tif (i == 1) this.addY(f(t));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar b2ac = Math.pow(b, 2) - 4 * c * a;\n\t\t\t\t\tif (b2ac < 0) continue;\n\t\t\t\t\tvar t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n\t\t\t\t\tif (0 < t1 && t1 < 1) {\n\t\t\t\t\t\tif (i == 0) this.addX(f(t1));\n\t\t\t\t\t\tif (i == 1) this.addY(f(t1));\n\t\t\t\t\t}\n\t\t\t\t\tvar t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n\t\t\t\t\tif (0 < t2 && t2 < 1) {\n\t\t\t\t\t\tif (i == 0) this.addX(f(t2));\n\t\t\t\t\t\tif (i == 1) this.addY(f(t2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.isPointInBox = function(x, y) {\n\t\t\t\treturn (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);\n\t\t\t}\n\t\t\t\n\t\t\tthis.addPoint(x1, y1);\n\t\t\tthis.addPoint(x2, y2);\n\t\t}\n\t\t\n\t\t// transforms\n\t\tsvg.Transform = function(v) {\t\n\t\t\tvar that = this;\n\t\t\tthis.Type = {}\n\t\t\n\t\t\t// translate\n\t\t\tthis.Type.translate = function(s) {\n\t\t\t\tthis.p = svg.CreatePoint(s);\t\t\t\n\t\t\t\tthis.apply = function(ctx) {\n\t\t\t\t\tctx.translate(this.p.x || 0.0, this.p.y || 0.0);\n\t\t\t\t}\n\t\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// rotate\n\t\t\tthis.Type.rotate = function(s) {\n\t\t\t\tvar a = svg.ToNumberArray(s);\n\t\t\t\tthis.angle = new svg.Property('angle', a[0]);\n\t\t\t\tthis.cx = a[1] || 0;\n\t\t\t\tthis.cy = a[2] || 0;\n\t\t\t\tthis.apply = function(ctx) {\n\t\t\t\t\tctx.translate(this.cx, this.cy);\n\t\t\t\t\tctx.rotate(this.angle.Angle.toRadians());\n\t\t\t\t\tctx.translate(-this.cx, -this.cy);\n\t\t\t\t}\n\t\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\t\tvar a = this.angle.Angle.toRadians();\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);\n\t\t\t\t\tp.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);\n\t\t\t\t\tp.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);\n\t\t\t\t}\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.Type.scale = function(s) {\n\t\t\t\tthis.p = svg.CreatePoint(s);\n\t\t\t\tthis.apply = function(ctx) {\n\t\t\t\t\tctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);\n\t\t\t\t}\n\t\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\t\tp.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.Type.matrix = function(s) {\n\t\t\t\tthis.m = svg.ToNumberArray(s);\n\t\t\t\tthis.apply = function(ctx) {\n\t\t\t\t\tctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);\n\t\t\t\t}\n\t\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\t\tp.applyTransform(this.m);\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.Type.SkewBase = function(s) {\n\t\t\t\tthis.base = that.Type.matrix;\n\t\t\t\tthis.base(s);\n\t\t\t\tthis.angle = new svg.Property('angle', s);\n\t\t\t}\n\t\t\tthis.Type.SkewBase.prototype = new this.Type.matrix;\n\t\t\t\n\t\t\tthis.Type.skewX = function(s) {\n\t\t\t\tthis.base = that.Type.SkewBase;\n\t\t\t\tthis.base(s);\n\t\t\t\tthis.m = [1, 0, Math.tan(this.angle.Angle.toRadians()), 1, 0, 0];\n\t\t\t}\n\t\t\tthis.Type.skewX.prototype = new this.Type.SkewBase;\n\t\t\t\n\t\t\tthis.Type.skewY = function(s) {\n\t\t\t\tthis.base = that.Type.SkewBase;\n\t\t\t\tthis.base(s);\n\t\t\t\tthis.m = [1, Math.tan(this.angle.Angle.toRadians()), 0, 1, 0, 0];\n\t\t\t}\n\t\t\tthis.Type.skewY.prototype = new this.Type.SkewBase;\n\t\t\n\t\t\tthis.transforms = [];\n\t\t\t\n\t\t\tthis.apply = function(ctx) {\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\n\t\t\t\t\tthis.transforms[i].apply(ctx);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.applyToPoint = function(p) {\n\t\t\t\tfor (var i=0; i<this.transforms.length; i++) {\n\t\t\t\t\tthis.transforms[i].applyToPoint(p);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tvar data = svg.trim(svg.compressSpaces(v)).split(/\\s(?=[a-z])/);\n\t\t\tfor (var i=0; i<data.length; i++) {\n\t\t\t\tvar type = data[i].split('(')[0];\n\t\t\t\tvar s = data[i].split('(')[1].replace(')','');\n\t\t\t\tvar transform = new this.Type[type](s);\n\t\t\t\tthis.transforms.push(transform);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// aspect ratio\n\t\tsvg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {\n\t\t\t// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\n\t\t\taspectRatio = svg.compressSpaces(aspectRatio);\n\t\t\taspectRatio = aspectRatio.replace(/^defer\\s/,''); // ignore defer\n\t\t\tvar align = aspectRatio.split(' ')[0] || 'xMidYMid';\n\t\t\tvar meetOrSlice = aspectRatio.split(' ')[1] || 'meet';\t\t\t\t\t\n\t\n\t\t\t// calculate scale\n\t\t\tvar scaleX = width / desiredWidth;\n\t\t\tvar scaleY = height / desiredHeight;\n\t\t\tvar scaleMin = Math.min(scaleX, scaleY);\n\t\t\tvar scaleMax = Math.max(scaleX, scaleY);\n\t\t\tif (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }\n\t\t\tif (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }\t\n\t\t\t\n\t\t\trefX = new svg.Property('refX', refX);\n\t\t\trefY = new svg.Property('refY', refY);\n\t\t\tif (refX.hasValue() && refY.hasValue()) {\t\t\t\t\n\t\t\t\tctx.translate(-scaleMin * refX.Length.toPixels('x'), -scaleMin * refY.Length.toPixels('y'));\n\t\t\t} \n\t\t\telse {\t\t\t\t\t\n\t\t\t\t// align\n\t\t\t\tif (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0); \n\t\t\t\tif (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0); \n\t\t\t\tif (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0); \n\t\t\t\tif (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight); \n\t\t\t}\n\t\t\t\n\t\t\t// scale\n\t\t\tif (align == 'none') ctx.scale(scaleX, scaleY);\n\t\t\telse if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin); \n\t\t\telse if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax); \t\n\t\t\t\n\t\t\t// translate\n\t\t\tctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);\t\t\t\n\t\t}\n\t\t\n\t\t// elements\n\t\tsvg.Element = {}\n\t\t\n\t\tsvg.Element.ElementBase = function(node) {\t\n\t\t\tthis.attributes = {};\n\t\t\tthis.styles = {};\n\t\t\tthis.children = [];\n\t\t\t\n\t\t\t// get or create attribute\n\t\t\tthis.attribute = function(name, createIfNotExists) {\n\t\t\t\tvar a = this.attributes[name];\n\t\t\t\tif (a != null) return a;\n\t\t\t\t\t\t\t\n\t\t\t\ta = new svg.Property(name, '');\n\t\t\t\tif (createIfNotExists == true) this.attributes[name] = a;\n\t\t\t\treturn a;\n\t\t\t}\n\t\t\t\n\t\t\t// get or create style, crawls up node tree\n\t\t\tthis.style = function(name, createIfNotExists) {\n\t\t\t\tvar s = this.styles[name];\n\t\t\t\tif (s != null) return s;\n\t\t\t\t\n\t\t\t\tvar a = this.attribute(name);\n\t\t\t\tif (a != null && a.hasValue()) {\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar p = this.parent;\n\t\t\t\tif (p != null) {\n\t\t\t\t\tvar ps = p.style(name);\n\t\t\t\t\tif (ps != null && ps.hasValue()) {\n\t\t\t\t\t\treturn ps;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\ts = new svg.Property(name, '');\n\t\t\t\tif (createIfNotExists == true) this.styles[name] = s;\n\t\t\t\treturn s;\n\t\t\t}\n\t\t\t\n\t\t\t// base render\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// don't render display=none\n\t\t\t\tif (this.style('display').value == 'none') return;\n\t\t\t\t\n\t\t\t\t// don't render visibility=hidden\n\t\t\t\tif (this.attribute('visibility').value == 'hidden') return;\n\t\t\t\n\t\t\t\tctx.save();\n\t\t\t\t\tthis.setContext(ctx);\n\t\t\t\t\t\t// mask\n\t\t\t\t\t\tif (this.attribute('mask').hasValue()) {\n\t\t\t\t\t\t\tvar mask = this.attribute('mask').Definition.getDefinition();\n\t\t\t\t\t\t\tif (mask != null) mask.apply(ctx, this);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (this.style('filter').hasValue()) {\n\t\t\t\t\t\t\tvar filter = this.style('filter').Definition.getDefinition();\n\t\t\t\t\t\t\tif (filter != null) filter.apply(ctx, this);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse this.renderChildren(ctx);\t\t\t\t\n\t\t\t\t\tthis.clearContext(ctx);\n\t\t\t\tctx.restore();\n\t\t\t}\n\t\t\t\n\t\t\t// base set context\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\t// OVERRIDE ME!\n\t\t\t}\n\t\t\t\n\t\t\t// base clear context\n\t\t\tthis.clearContext = function(ctx) {\n\t\t\t\t// OVERRIDE ME!\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\t// base render children\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tthis.children[i].render(ctx);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.addChild = function(childNode, create) {\n\t\t\t\tvar child = childNode;\n\t\t\t\tif (create) child = svg.CreateElement(childNode);\n\t\t\t\tchild.parent = this;\n\t\t\t\tthis.children.push(child);\t\t\t\n\t\t\t}\n\t\t\t\t\n\t\t\tif (node != null && node.nodeType == 1) { //ELEMENT_NODE\n\t\t\t\t// add children\n\t\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\n\t\t\t\t\tvar childNode = node.childNodes[i];\n\t\t\t\t\tif (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// add attributes\n\t\t\t\tfor (var i=0; i<node.attributes.length; i++) {\n\t\t\t\t\tvar attribute = node.attributes[i];\n\t\t\t\t\tthis.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.nodeValue);\n\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t// add tag styles\n\t\t\t\tvar styles = svg.Styles[node.nodeName];\n\t\t\t\tif (styles != null) {\n\t\t\t\t\tfor (var name in styles) {\n\t\t\t\t\t\tthis.styles[name] = styles[name];\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t// add class styles\n\t\t\t\tif (this.attribute('class').hasValue()) {\n\t\t\t\t\tvar classes = svg.compressSpaces(this.attribute('class').value).split(' ');\n\t\t\t\t\tfor (var j=0; j<classes.length; j++) {\n\t\t\t\t\t\tstyles = svg.Styles['.'+classes[j]];\n\t\t\t\t\t\tif (styles != null) {\n\t\t\t\t\t\t\tfor (var name in styles) {\n\t\t\t\t\t\t\t\tthis.styles[name] = styles[name];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyles = svg.Styles[node.nodeName+'.'+classes[j]];\n\t\t\t\t\t\tif (styles != null) {\n\t\t\t\t\t\t\tfor (var name in styles) {\n\t\t\t\t\t\t\t\tthis.styles[name] = styles[name];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// add inline styles\n\t\t\t\tif (this.attribute('style').hasValue()) {\n\t\t\t\t\tvar styles = this.attribute('style').value.split(';');\n\t\t\t\t\tfor (var i=0; i<styles.length; i++) {\n\t\t\t\t\t\tif (svg.trim(styles[i]) != '') {\n\t\t\t\t\t\t\tvar style = styles[i].split(':');\n\t\t\t\t\t\t\tvar name = svg.trim(style[0]);\n\t\t\t\t\t\t\tvar value = svg.trim(style[1]);\n\t\t\t\t\t\t\tthis.styles[name] = new svg.Property(name, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\t\n\n\t\t\t\t// add id\n\t\t\t\tif (this.attribute('id').hasValue()) {\n\t\t\t\t\tif (svg.Definitions[this.attribute('id').value] == null) {\n\t\t\t\t\t\tsvg.Definitions[this.attribute('id').value] = this;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tsvg.Element.RenderedElementBase = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\t// fill\n\t\t\t\tif (this.style('fill').Definition.isUrl()) {\n\t\t\t\t\tvar fs = this.style('fill').Definition.getFillStyle(this);\n\t\t\t\t\tif (fs != null) ctx.fillStyle = fs;\n\t\t\t\t}\n\t\t\t\telse if (this.style('fill').hasValue()) {\n\t\t\t\t\tvar fillStyle = this.style('fill');\n\t\t\t\t\tif (this.style('fill-opacity').hasValue()) fillStyle = fillStyle.Color.addOpacity(this.style('fill-opacity').value);\n\t\t\t\t\tctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);\n\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t// stroke\n\t\t\t\tif (this.style('stroke').Definition.isUrl()) {\n\t\t\t\t\tvar fs = this.style('stroke').Definition.getFillStyle(this);\n\t\t\t\t\tif (fs != null) ctx.strokeStyle = fs;\n\t\t\t\t}\n\t\t\t\telse if (this.style('stroke').hasValue()) {\n\t\t\t\t\tvar strokeStyle = this.style('stroke');\n\t\t\t\t\tif (this.style('stroke-opacity').hasValue()) strokeStyle = strokeStyle.Color.addOpacity(this.style('stroke-opacity').value);\n\t\t\t\t\tctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);\n\t\t\t\t}\n\t\t\t\tif (this.style('stroke-width').hasValue()) ctx.lineWidth = this.style('stroke-width').Length.toPixels();\n\t\t\t\tif (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;\n\t\t\t\tif (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;\n\t\t\t\tif (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;\n\n\t\t\t\t// font\n\t\t\t\tif (typeof(ctx.font) != 'undefined') {\n\t\t\t\t\tctx.font = svg.Font.CreateFont( \n\t\t\t\t\t\tthis.style('font-style').value, \n\t\t\t\t\t\tthis.style('font-variant').value, \n\t\t\t\t\t\tthis.style('font-weight').value, \n\t\t\t\t\t\tthis.style('font-size').hasValue() ? this.style('font-size').Length.toPixels() + 'px' : '', \n\t\t\t\t\t\tthis.style('font-family').value).toString();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// transform\n\t\t\t\tif (this.attribute('transform').hasValue()) { \n\t\t\t\t\tvar transform = new svg.Transform(this.attribute('transform').value);\n\t\t\t\t\ttransform.apply(ctx);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// clip\n\t\t\t\tif (this.attribute('clip-path').hasValue()) {\n\t\t\t\t\tvar clip = this.attribute('clip-path').Definition.getDefinition();\n\t\t\t\t\tif (clip != null) clip.apply(ctx);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// opacity\n\t\t\t\tif (this.style('opacity').hasValue()) {\n\t\t\t\t\tctx.globalAlpha = this.style('opacity').numValue();\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t}\n\t\tsvg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;\n\t\t\n\t\tsvg.Element.PathElementBase = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tif (ctx != null) ctx.beginPath();\n\t\t\t\treturn new svg.BoundingBox();\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tthis.path(ctx);\n\t\t\t\tsvg.Mouse.checkPath(this, ctx);\n\t\t\t\tif (ctx.fillStyle != '') ctx.fill();\n\t\t\t\tif (ctx.strokeStyle != '') ctx.stroke();\n\t\t\t\t\n\t\t\t\tvar markers = this.getMarkers();\n\t\t\t\tif (markers != null) {\n\t\t\t\t\tif (this.style('marker-start').Definition.isUrl()) {\n\t\t\t\t\t\tvar marker = this.style('marker-start').Definition.getDefinition();\n\t\t\t\t\t\tmarker.render(ctx, markers[0][0], markers[0][1]);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.style('marker-mid').Definition.isUrl()) {\n\t\t\t\t\t\tvar marker = this.style('marker-mid').Definition.getDefinition();\n\t\t\t\t\t\tfor (var i=1;i<markers.length-1;i++) {\n\t\t\t\t\t\t\tmarker.render(ctx, markers[i][0], markers[i][1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.style('marker-end').Definition.isUrl()) {\n\t\t\t\t\t\tvar marker = this.style('marker-end').Definition.getDefinition();\n\t\t\t\t\t\tmarker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.getBoundingBox = function() {\n\t\t\t\treturn this.path();\n\t\t\t}\n\t\t\t\n\t\t\tthis.getMarkers = function() {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;\n\t\t\n\t\t// svg element\n\t\tsvg.Element.svg = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.baseClearContext = this.clearContext;\n\t\t\tthis.clearContext = function(ctx) {\n\t\t\t\tthis.baseClearContext(ctx);\n\t\t\t\tsvg.ViewPort.RemoveCurrent();\n\t\t\t}\n\t\t\t\n\t\t\tthis.baseSetContext = this.setContext;\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\t// initial values\n\t\t\t\tctx.strokeStyle = 'rgba(0,0,0,0)';\n\t\t\t\tctx.lineCap = 'butt';\n\t\t\t\tctx.lineJoin = 'miter';\n\t\t\t\tctx.miterLimit = 4;\t\t\t\n\t\t\t\n\t\t\t\tthis.baseSetContext(ctx);\n\t\t\t\t\n\t\t\t\t// create new view port\n\t\t\t\tif (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {\n\t\t\t\t\tctx.translate(this.attribute('x').Length.toPixels('x'), this.attribute('y').Length.toPixels('y'));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar width = svg.ViewPort.width();\n\t\t\t\tvar height = svg.ViewPort.height();\n\t\t\t\tif (typeof(this.root) == 'undefined' && this.attribute('width').hasValue() && this.attribute('height').hasValue()) {\n\t\t\t\t\twidth = this.attribute('width').Length.toPixels('x');\n\t\t\t\t\theight = this.attribute('height').Length.toPixels('y');\n\t\t\t\t\t\n\t\t\t\t\tvar x = 0;\n\t\t\t\t\tvar y = 0;\n\t\t\t\t\tif (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {\n\t\t\t\t\t\tx = -this.attribute('refX').Length.toPixels('x');\n\t\t\t\t\t\ty = -this.attribute('refY').Length.toPixels('y');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(x, y);\n\t\t\t\t\tctx.lineTo(width, y);\n\t\t\t\t\tctx.lineTo(width, height);\n\t\t\t\t\tctx.lineTo(x, height);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t\tctx.clip();\n\t\t\t\t}\n\t\t\t\tsvg.ViewPort.SetCurrent(width, height);\t\n\t\t\t\t\t\t\n\t\t\t\t// viewbox\n\t\t\t\tif (this.attribute('viewBox').hasValue()) {\t\t\t\t\n\t\t\t\t\tvar viewBox = svg.ToNumberArray(this.attribute('viewBox').value);\n\t\t\t\t\tvar minX = viewBox[0];\n\t\t\t\t\tvar minY = viewBox[1];\n\t\t\t\t\twidth = viewBox[2];\n\t\t\t\t\theight = viewBox[3];\n\t\t\t\t\t\n\t\t\t\t\tsvg.AspectRatio(ctx,\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value, \n\t\t\t\t\t\t\t\t\tsvg.ViewPort.width(), \n\t\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t\t\tsvg.ViewPort.height(),\n\t\t\t\t\t\t\t\t\theight,\n\t\t\t\t\t\t\t\t\tminX,\n\t\t\t\t\t\t\t\t\tminY,\n\t\t\t\t\t\t\t\t\tthis.attribute('refX').value,\n\t\t\t\t\t\t\t\t\tthis.attribute('refY').value);\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tsvg.ViewPort.RemoveCurrent();\t\n\t\t\t\t\tsvg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);\t\t\t\t\t\t\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\n\t\tsvg.Element.svg.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// rect element\n\t\tsvg.Element.rect = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar x = this.attribute('x').Length.toPixels('x');\n\t\t\t\tvar y = this.attribute('y').Length.toPixels('y');\n\t\t\t\tvar width = this.attribute('width').Length.toPixels('x');\n\t\t\t\tvar height = this.attribute('height').Length.toPixels('y');\n\t\t\t\tvar rx = this.attribute('rx').Length.toPixels('x');\n\t\t\t\tvar ry = this.attribute('ry').Length.toPixels('y');\n\t\t\t\tif (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;\n\t\t\t\tif (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;\n\t\t\t\t\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(x + rx, y);\n\t\t\t\t\tctx.lineTo(x + width - rx, y);\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + ry)\n\t\t\t\t\tctx.lineTo(x + width, y + height - ry);\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)\n\t\t\t\t\tctx.lineTo(x + rx, y + height);\n\t\t\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - ry)\n\t\t\t\t\tctx.lineTo(x, y + ry);\n\t\t\t\t\tctx.quadraticCurveTo(x, y, x + rx, y)\n\t\t\t\t\tctx.closePath();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn new svg.BoundingBox(x, y, x + width, y + height);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.rect.prototype = new svg.Element.PathElementBase;\n\t\t\n\t\t// circle element\n\t\tsvg.Element.circle = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar cx = this.attribute('cx').Length.toPixels('x');\n\t\t\t\tvar cy = this.attribute('cy').Length.toPixels('y');\n\t\t\t\tvar r = this.attribute('r').Length.toPixels();\n\t\t\t\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.arc(cx, cy, r, 0, Math.PI * 2, true); \n\t\t\t\t\tctx.closePath();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.circle.prototype = new svg.Element.PathElementBase;\t\n\n\t\t// ellipse element\n\t\tsvg.Element.ellipse = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n\t\t\t\tvar rx = this.attribute('rx').Length.toPixels('x');\n\t\t\t\tvar ry = this.attribute('ry').Length.toPixels('y');\n\t\t\t\tvar cx = this.attribute('cx').Length.toPixels('x');\n\t\t\t\tvar cy = this.attribute('cy').Length.toPixels('y');\n\t\t\t\t\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(cx, cy - ry);\n\t\t\t\t\tctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);\n\t\t\t\t\tctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);\n\t\t\t\t\tctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);\n\t\t\t\t\tctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.ellipse.prototype = new svg.Element.PathElementBase;\t\t\t\n\t\t\n\t\t// line element\n\t\tsvg.Element.line = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.getPoints = function() {\n\t\t\t\treturn [\n\t\t\t\t\tnew svg.Point(this.attribute('x1').Length.toPixels('x'), this.attribute('y1').Length.toPixels('y')),\n\t\t\t\t\tnew svg.Point(this.attribute('x2').Length.toPixels('x'), this.attribute('y2').Length.toPixels('y'))];\n\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar points = this.getPoints();\n\t\t\t\t\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(points[0].x, points[0].y);\n\t\t\t\t\tctx.lineTo(points[1].x, points[1].y);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);\n\t\t\t}\n\t\t\t\n\t\t\tthis.getMarkers = function() {\n\t\t\t\tvar points = this.getPoints();\t\n\t\t\t\tvar a = points[0].angleTo(points[1]);\n\t\t\t\treturn [[points[0], a], [points[1], a]];\n\t\t\t}\n\t\t}\n\t\tsvg.Element.line.prototype = new svg.Element.PathElementBase;\t\t\n\t\t\t\t\n\t\t// polyline element\n\t\tsvg.Element.polyline = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.points = svg.CreatePath(this.attribute('points').value);\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(this.points[0].x, this.points[0].y);\n\t\t\t\t}\n\t\t\t\tfor (var i=1; i<this.points.length; i++) {\n\t\t\t\t\tbb.addPoint(this.points[i].x, this.points[i].y);\n\t\t\t\t\tif (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);\n\t\t\t\t}\n\t\t\t\treturn bb;\n\t\t\t}\n\t\t\t\n\t\t\tthis.getMarkers = function() {\n\t\t\t\tvar markers = [];\n\t\t\t\tfor (var i=0; i<this.points.length - 1; i++) {\n\t\t\t\t\tmarkers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);\n\t\t\t\t}\n\t\t\t\tmarkers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);\n\t\t\t\treturn markers;\n\t\t\t}\t\t\t\n\t\t}\n\t\tsvg.Element.polyline.prototype = new svg.Element.PathElementBase;\t\t\t\t\n\t\t\t\t\n\t\t// polygon element\n\t\tsvg.Element.polygon = function(node) {\n\t\t\tthis.base = svg.Element.polyline;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.basePath = this.path;\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar bb = this.basePath(ctx);\n\t\t\t\tif (ctx != null) {\n\t\t\t\t\tctx.lineTo(this.points[0].x, this.points[0].y);\n\t\t\t\t\tctx.closePath();\n\t\t\t\t}\n\t\t\t\treturn bb;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.polygon.prototype = new svg.Element.polyline;\n\n\t\t// path element\n\t\tsvg.Element.path = function(node) {\n\t\t\tthis.base = svg.Element.PathElementBase;\n\t\t\tthis.base(node);\n\t\t\t\t\t\n\t\t\tvar d = this.attribute('d').value;\n\t\t\t// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF\n\t\t\td = d.replace(/,/gm,' '); // get rid of all commas\n\t\t\td = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands\n\t\t\td = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands\n\t\t\td = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\\s])/gm,'$1 $2'); // separate commands from points\n\t\t\td = d.replace(/([^\\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from points\n\t\t\td = d.replace(/([0-9])([+\\-])/gm,'$1 $2'); // separate digits when no comma\n\t\t\td = d.replace(/(\\.[0-9]*)(\\.)/gm,'$1 $2'); // separate digits when no comma\n\t\t\td = d.replace(/([Aa](\\s+[0-9]+){3})\\s+([01])\\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax\n\t\t\td = svg.compressSpaces(d); // compress multiple spaces\n\t\t\td = svg.trim(d);\n\t\t\tthis.PathParser = new (function(d) {\n\t\t\t\tthis.tokens = d.split(' ');\n\t\t\t\t\n\t\t\t\tthis.reset = function() {\n\t\t\t\t\tthis.i = -1;\n\t\t\t\t\tthis.command = '';\n\t\t\t\t\tthis.previousCommand = '';\n\t\t\t\t\tthis.start = new svg.Point(0, 0);\n\t\t\t\t\tthis.control = new svg.Point(0, 0);\n\t\t\t\t\tthis.current = new svg.Point(0, 0);\n\t\t\t\t\tthis.points = [];\n\t\t\t\t\tthis.angles = [];\n\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\tthis.isEnd = function() {\n\t\t\t\t\treturn this.i >= this.tokens.length - 1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.isCommandOrEnd = function() {\n\t\t\t\t\tif (this.isEnd()) return true;\n\t\t\t\t\treturn this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.isRelativeCommand = function() {\n\t\t\t\t\treturn this.command == this.command.toLowerCase();\n\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\tthis.getToken = function() {\n\t\t\t\t\tthis.i = this.i + 1;\n\t\t\t\t\treturn this.tokens[this.i];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.getScalar = function() {\n\t\t\t\t\treturn parseFloat(this.getToken());\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.nextCommand = function() {\n\t\t\t\t\tthis.previousCommand = this.command;\n\t\t\t\t\tthis.command = this.getToken();\n\t\t\t\t}\t\t\t\t\n\t\t\t\t\n\t\t\t\tthis.getPoint = function() {\n\t\t\t\t\tvar p = new svg.Point(this.getScalar(), this.getScalar());\n\t\t\t\t\treturn this.makeAbsolute(p);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.getAsControlPoint = function() {\n\t\t\t\t\tvar p = this.getPoint();\n\t\t\t\t\tthis.control = p;\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.getAsCurrentPoint = function() {\n\t\t\t\t\tvar p = this.getPoint();\n\t\t\t\t\tthis.current = p;\n\t\t\t\t\treturn p;\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.getReflectedControlPoint = function() {\n\t\t\t\t\tif (this.previousCommand.toLowerCase() != 'c' && this.previousCommand.toLowerCase() != 's') {\n\t\t\t\t\t\treturn this.current;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// reflect point\n\t\t\t\t\tvar p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);\t\t\t\t\t\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.makeAbsolute = function(p) {\n\t\t\t\t\tif (this.isRelativeCommand()) {\n\t\t\t\t\t\tp.x = this.current.x + p.x;\n\t\t\t\t\t\tp.y = this.current.y + p.y;\n\t\t\t\t\t}\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.addMarker = function(p, from, priorTo) {\n\t\t\t\t\t// if the last angle isn't filled in because we didn't have this point yet ...\n\t\t\t\t\tif (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {\n\t\t\t\t\t\tthis.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);\n\t\t\t\t\t}\n\t\t\t\t\tthis.addMarkerAngle(p, from == null ? null : from.angleTo(p));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.addMarkerAngle = function(p, a) {\n\t\t\t\t\tthis.points.push(p);\n\t\t\t\t\tthis.angles.push(a);\n\t\t\t\t}\t\t\t\t\n\t\t\t\t\n\t\t\t\tthis.getMarkerPoints = function() { return this.points; }\n\t\t\t\tthis.getMarkerAngles = function() {\n\t\t\t\t\tfor (var i=0; i<this.angles.length; i++) {\n\t\t\t\t\t\tif (this.angles[i] == null) {\n\t\t\t\t\t\t\tfor (var j=i+1; j<this.angles.length; j++) {\n\t\t\t\t\t\t\t\tif (this.angles[j] != null) {\n\t\t\t\t\t\t\t\t\tthis.angles[i] = this.angles[j];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this.angles;\n\t\t\t\t}\n\t\t\t})(d);\n\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar pp = this.PathParser;\n\t\t\t\tpp.reset();\n\n\t\t\t\tvar bb = new svg.BoundingBox();\n\t\t\t\tif (ctx != null) ctx.beginPath();\n\t\t\t\twhile (!pp.isEnd()) {\n\t\t\t\t\tpp.nextCommand();\n\t\t\t\t\tswitch (pp.command.toUpperCase()) {\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\n\t\t\t\t\t\tpp.addMarker(p);\n\t\t\t\t\t\tbb.addPoint(p.x, p.y);\n\t\t\t\t\t\tif (ctx != null) ctx.moveTo(p.x, p.y);\n\t\t\t\t\t\tpp.start = pp.current;\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(p, pp.start);\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar c = pp.current;\n\t\t\t\t\t\t\tvar p = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(p, c);\n\t\t\t\t\t\t\tbb.addPoint(p.x, p.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(p.x, p.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'H':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\n\t\t\t\t\t\t\tpp.current = newP;\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'V':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());\n\t\t\t\t\t\t\tpp.addMarker(newP, pp.current);\n\t\t\t\t\t\t\tpp.current = newP;\n\t\t\t\t\t\t\tbb.addPoint(pp.current.x, pp.current.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar curr = pp.current;\n\t\t\t\t\t\t\tvar p1 = pp.getPoint();\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'S':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar curr = pp.current;\n\t\t\t\t\t\t\tvar p1 = pp.getReflectedControlPoint();\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, p1);\n\t\t\t\t\t\t\tbb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar curr = pp.current;\n\t\t\t\t\t\t\tvar cntrl = pp.getAsControlPoint();\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'T':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t\tvar curr = pp.current;\n\t\t\t\t\t\t\tvar cntrl = pp.getReflectedControlPoint();\n\t\t\t\t\t\t\tpp.control = cntrl;\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\t\t\t\t\t\t\tpp.addMarker(cp, cntrl, cntrl);\n\t\t\t\t\t\t\tbb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t\tif (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\twhile (!pp.isCommandOrEnd()) {\n\t\t\t\t\t\t    var curr = pp.current;\n\t\t\t\t\t\t\tvar rx = pp.getScalar();\n\t\t\t\t\t\t\tvar ry = pp.getScalar();\n\t\t\t\t\t\t\tvar xAxisRotation = pp.getScalar() * (Math.PI / 180.0);\n\t\t\t\t\t\t\tvar largeArcFlag = pp.getScalar();\n\t\t\t\t\t\t\tvar sweepFlag = pp.getScalar();\n\t\t\t\t\t\t\tvar cp = pp.getAsCurrentPoint();\n\n\t\t\t\t\t\t\t// Conversion from endpoint to center parameterization\n\t\t\t\t\t\t\t// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n\t\t\t\t\t\t\t// x1', y1'\n\t\t\t\t\t\t\tvar currp = new svg.Point(\n\t\t\t\t\t\t\t\tMath.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,\n\t\t\t\t\t\t\t\t-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// adjust radii\n\t\t\t\t\t\t\tvar l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);\n\t\t\t\t\t\t\tif (l > 1) {\n\t\t\t\t\t\t\t\trx *= Math.sqrt(l);\n\t\t\t\t\t\t\t\try *= Math.sqrt(l);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// cx', cy'\n\t\t\t\t\t\t\tvar s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(\n\t\t\t\t\t\t\t\t((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /\n\t\t\t\t\t\t\t\t(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (isNaN(s)) s = 0;\n\t\t\t\t\t\t\tvar cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);\n\t\t\t\t\t\t\t// cx, cy\n\t\t\t\t\t\t\tvar centp = new svg.Point(\n\t\t\t\t\t\t\t\t(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,\n\t\t\t\t\t\t\t\t(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// vector magnitude\n\t\t\t\t\t\t\tvar m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }\n\t\t\t\t\t\t\t// ratio between two vectors\n\t\t\t\t\t\t\tvar r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }\n\t\t\t\t\t\t\t// angle between two vectors\n\t\t\t\t\t\t\tvar a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }\n\t\t\t\t\t\t\t// initial angle\n\t\t\t\t\t\t\tvar a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);\n\t\t\t\t\t\t\t// angle delta\n\t\t\t\t\t\t\tvar u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];\n\t\t\t\t\t\t\tvar v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];\n\t\t\t\t\t\t\tvar ad = a(u, v);\n\t\t\t\t\t\t\tif (r(u,v) <= -1) ad = Math.PI;\n\t\t\t\t\t\t\tif (r(u,v) >= 1) ad = 0;\n\n\t\t\t\t\t\t\tif (sweepFlag == 0 && ad > 0) ad = ad - 2 * Math.PI;\n\t\t\t\t\t\t\tif (sweepFlag == 1 && ad < 0) ad = ad + 2 * Math.PI;\n\n\t\t\t\t\t\t\t// for markers\n\t\t\t\t\t\t\tvar halfWay = new svg.Point(\n\t\t\t\t\t\t\t\tcentp.x - rx * Math.cos((a1 + ad) / 2),\n\t\t\t\t\t\t\t\tcentp.y - ry * Math.sin((a1 + ad) / 2)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tpp.addMarkerAngle(halfWay, (a1 + ad) / 2 + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2);\n\t\t\t\t\t\t\tpp.addMarkerAngle(cp, ad + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2);\n\n\t\t\t\t\t\t\tbb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better\n\t\t\t\t\t\t\tif (ctx != null) {\n\t\t\t\t\t\t\t\tvar r = rx > ry ? rx : ry;\n\t\t\t\t\t\t\t\tvar sx = rx > ry ? 1 : rx / ry;\n\t\t\t\t\t\t\t\tvar sy = rx > ry ? ry / rx : 1;\n\n\t\t\t\t\t\t\t\tctx.translate(centp.x, centp.y);\n\t\t\t\t\t\t\t\tctx.rotate(xAxisRotation);\n\t\t\t\t\t\t\t\tctx.scale(sx, sy);\n\t\t\t\t\t\t\t\tctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);\n\t\t\t\t\t\t\t\tctx.scale(1/sx, 1/sy);\n\t\t\t\t\t\t\t\tctx.rotate(-xAxisRotation);\n\t\t\t\t\t\t\t\tctx.translate(-centp.x, -centp.y);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\t\tif (ctx != null) ctx.closePath();\n\t\t\t\t\t\tpp.current = pp.start;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn bb;\n\t\t\t}\n\n\t\t\tthis.getMarkers = function() {\n\t\t\t\tvar points = this.PathParser.getMarkerPoints();\n\t\t\t\tvar angles = this.PathParser.getMarkerAngles();\n\t\t\t\t\n\t\t\t\tvar markers = [];\n\t\t\t\tfor (var i=0; i<points.length; i++) {\n\t\t\t\t\tmarkers.push([points[i], angles[i]]);\n\t\t\t\t}\n\t\t\t\treturn markers;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.path.prototype = new svg.Element.PathElementBase;\n\t\t\n\t\t// pattern element\n\t\tsvg.Element.pattern = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.createPattern = function(ctx, element) {\n\t\t\t\t// render me using a temporary svg element\n\t\t\t\tvar tempSvg = new svg.Element.svg();\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\n\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', this.attribute('x').value);\n\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', this.attribute('y').value);\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);\n\t\t\t\ttempSvg.children = this.children;\n\t\t\t\t\n\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\tc.width = this.attribute('width').Length.toPixels('x');\n\t\t\t\tc.height = this.attribute('height').Length.toPixels('y');\n\t\t\t\ttempSvg.render(c.getContext('2d'));\t\t\n\t\t\t\treturn ctx.createPattern(c, 'repeat');\n\t\t\t}\n\t\t}\n\t\tsvg.Element.pattern.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// marker element\n\t\tsvg.Element.marker = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.baseRender = this.render;\n\t\t\tthis.render = function(ctx, point, angle) {\n\t\t\t\tctx.translate(point.x, point.y);\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);\n\t\t\t\tctx.save();\n\t\t\t\t\t\t\t\n\t\t\t\t// render me using a temporary svg element\n\t\t\t\tvar tempSvg = new svg.Element.svg();\n\t\t\t\ttempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);\n\t\t\t\ttempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);\n\t\t\t\ttempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);\n\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);\n\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);\n\t\t\t\ttempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));\n\t\t\t\ttempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));\n\t\t\t\ttempSvg.children = this.children;\n\t\t\t\ttempSvg.render(ctx);\n\t\t\t\t\n\t\t\t\tctx.restore();\n\t\t\t\tif (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);\n\t\t\t\tif (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);\n\t\t\t\tctx.translate(-point.x, -point.y);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.marker.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// definitions element\n\t\tsvg.Element.defs = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\t\n\t\t\t\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NOOP\n\t\t\t}\n\t\t}\n\t\tsvg.Element.defs.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// base for gradients\n\t\tsvg.Element.GradientBase = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.gradientUnits = this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');\n\t\t\t\n\t\t\tthis.stops = [];\t\t\t\n\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\tvar child = this.children[i];\n\t\t\t\tthis.stops.push(child);\n\t\t\t}\t\n\t\t\t\n\t\t\tthis.getGradient = function() {\n\t\t\t\t// OVERRIDE ME!\n\t\t\t}\t\t\t\n\n\t\t\tthis.createGradient = function(ctx, element) {\n\t\t\t\tvar stopsContainer = this;\n\t\t\t\tif (this.attribute('xlink:href').hasValue()) {\n\t\t\t\t\tstopsContainer = this.attribute('xlink:href').Definition.getDefinition();\n\t\t\t\t}\n\t\t\t\n\t\t\t\tvar g = this.getGradient(ctx, element);\n\t\t\t\tfor (var i=0; i<stopsContainer.stops.length; i++) {\n\t\t\t\t\tg.addColorStop(stopsContainer.stops[i].offset, stopsContainer.stops[i].color);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (this.attribute('gradientTransform').hasValue()) {\n\t\t\t\t\t// render as transformed pattern on temporary canvas\n\t\t\t\t\tvar rootView = svg.ViewPort.viewPorts[0];\n\t\t\t\t\t\n\t\t\t\t\tvar rect = new svg.Element.rect();\n\t\t\t\t\trect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);\n\t\t\t\t\trect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);\n\t\t\t\t\trect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);\n\t\t\t\t\trect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);\n\t\t\t\t\t\n\t\t\t\t\tvar group = new svg.Element.g();\n\t\t\t\t\tgroup.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);\n\t\t\t\t\tgroup.children = [ rect ];\n\t\t\t\t\t\n\t\t\t\t\tvar tempSvg = new svg.Element.svg();\n\t\t\t\t\ttempSvg.attributes['x'] = new svg.Property('x', 0);\n\t\t\t\t\ttempSvg.attributes['y'] = new svg.Property('y', 0);\n\t\t\t\t\ttempSvg.attributes['width'] = new svg.Property('width', rootView.width);\n\t\t\t\t\ttempSvg.attributes['height'] = new svg.Property('height', rootView.height);\n\t\t\t\t\ttempSvg.children = [ group ];\n\t\t\t\t\t\n\t\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\t\tc.width = rootView.width;\n\t\t\t\t\tc.height = rootView.height;\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\n\t\t\t\t\ttempCtx.fillStyle = g;\n\t\t\t\t\ttempSvg.render(tempCtx);\t\t\n\t\t\t\t\treturn tempCtx.createPattern(c, 'no-repeat');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn g;\t\t\t\t\n\t\t\t}\n\t\t}\n\t\tsvg.Element.GradientBase.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// linear gradient element\n\t\tsvg.Element.linearGradient = function(node) {\n\t\t\tthis.base = svg.Element.GradientBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.getGradient = function(ctx, element) {\n\t\t\t\tvar bb = element.getBoundingBox();\n\t\t\t\t\n\t\t\t\tvar x1 = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x1').numValue() \n\t\t\t\t\t: this.attribute('x1').Length.toPixels('x'));\n\t\t\t\tvar y1 = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y1').numValue()\n\t\t\t\t\t: this.attribute('y1').Length.toPixels('y'));\n\t\t\t\tvar x2 = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('x2').numValue()\n\t\t\t\t\t: this.attribute('x2').Length.toPixels('x'));\n\t\t\t\tvar y2 = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('y2').numValue()\n\t\t\t\t\t: this.attribute('y2').Length.toPixels('y'));\n\n\t\t\t\treturn ctx.createLinearGradient(x1, y1, x2, y2);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.linearGradient.prototype = new svg.Element.GradientBase;\n\t\t\n\t\t// radial gradient element\n\t\tsvg.Element.radialGradient = function(node) {\n\t\t\tthis.base = svg.Element.GradientBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.getGradient = function(ctx, element) {\n\t\t\t\tvar bb = element.getBoundingBox();\n\t\t\t\t\n\t\t\t\tvar cx = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('cx').numValue() \n\t\t\t\t\t: this.attribute('cx').Length.toPixels('x'));\n\t\t\t\tvar cy = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('cy').numValue() \n\t\t\t\t\t: this.attribute('cy').Length.toPixels('y'));\n\t\t\t\t\n\t\t\t\tvar fx = cx;\n\t\t\t\tvar fy = cy;\n\t\t\t\tif (this.attribute('fx').hasValue()) {\n\t\t\t\t\tfx = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? bb.x() + bb.width() * this.attribute('fx').numValue() \n\t\t\t\t\t: this.attribute('fx').Length.toPixels('x'));\n\t\t\t\t}\n\t\t\t\tif (this.attribute('fy').hasValue()) {\n\t\t\t\t\tfy = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? bb.y() + bb.height() * this.attribute('fy').numValue() \n\t\t\t\t\t: this.attribute('fy').Length.toPixels('y'));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar r = (this.gradientUnits == 'objectBoundingBox' \n\t\t\t\t\t? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()\n\t\t\t\t\t: this.attribute('r').Length.toPixels());\n\t\t\t\t\n\t\t\t\treturn ctx.createRadialGradient(fx, fy, 0, cx, cy, r);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.radialGradient.prototype = new svg.Element.GradientBase;\n\t\t\n\t\t// gradient stop element\n\t\tsvg.Element.stop = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.offset = this.attribute('offset').numValue();\n\t\t\t\n\t\t\tvar stopColor = this.style('stop-color');\n\t\t\tif (this.style('stop-opacity').hasValue()) stopColor = stopColor.Color.addOpacity(this.style('stop-opacity').value);\n\t\t\tthis.color = stopColor.value;\n\t\t}\n\t\tsvg.Element.stop.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// animation base element\n\t\tsvg.Element.AnimateBase = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tsvg.Animations.push(this);\n\t\t\t\n\t\t\tthis.duration = 0.0;\n\t\t\tthis.begin = this.attribute('begin').Time.toMilliseconds();\n\t\t\tthis.maxDuration = this.begin + this.attribute('dur').Time.toMilliseconds();\n\t\t\t\n\t\t\tthis.getProperty = function() {\n\t\t\t\tvar attributeType = this.attribute('attributeType').value;\n\t\t\t\tvar attributeName = this.attribute('attributeName').value;\n\t\t\t\t\n\t\t\t\tif (attributeType == 'CSS') {\n\t\t\t\t\treturn this.parent.style(attributeName, true);\n\t\t\t\t}\n\t\t\t\treturn this.parent.attribute(attributeName, true);\t\t\t\n\t\t\t};\n\t\t\t\n\t\t\tthis.initialValue = null;\n\t\t\tthis.removed = false;\t\t\t\n\n\t\t\tthis.calcValue = function() {\n\t\t\t\t// OVERRIDE ME!\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t\n\t\t\tthis.update = function(delta) {\t\n\t\t\t\t// set initial value\n\t\t\t\tif (this.initialValue == null) {\n\t\t\t\t\tthis.initialValue = this.getProperty().value;\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// if we're past the end time\n\t\t\t\tif (this.duration > this.maxDuration) {\n\t\t\t\t\t// loop for indefinitely repeating animations\n\t\t\t\t\tif (this.attribute('repeatCount').value == 'indefinite') {\n\t\t\t\t\t\tthis.duration = 0.0\n\t\t\t\t\t}\n\t\t\t\t\telse if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {\n\t\t\t\t\t\tthis.removed = true;\n\t\t\t\t\t\tthis.getProperty().value = this.initialValue;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treturn false; // no updates made\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\n\t\t\t\tthis.duration = this.duration + delta;\n\t\t\t\n\t\t\t\t// if we're past the begin time\n\t\t\t\tvar updated = false;\n\t\t\t\tif (this.begin < this.duration) {\n\t\t\t\t\tvar newValue = this.calcValue(); // tween\n\t\t\t\t\t\n\t\t\t\t\tif (this.attribute('type').hasValue()) {\n\t\t\t\t\t\t// for transform, etc.\n\t\t\t\t\t\tvar type = this.attribute('type').value;\n\t\t\t\t\t\tnewValue = type + '(' + newValue + ')';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.getProperty().value = newValue;\n\t\t\t\t\tupdated = true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn updated;\n\t\t\t}\n\t\t\t\n\t\t\t// fraction of duration we've covered\n\t\t\tthis.progress = function() {\n\t\t\t\treturn ((this.duration - this.begin) / (this.maxDuration - this.begin));\n\t\t\t}\t\t\t\n\t\t}\n\t\tsvg.Element.AnimateBase.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// animate element\n\t\tsvg.Element.animate = function(node) {\n\t\t\tthis.base = svg.Element.AnimateBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.calcValue = function() {\n\t\t\t\tvar from = this.attribute('from').numValue();\n\t\t\t\tvar to = this.attribute('to').numValue();\n\t\t\t\t\n\t\t\t\t// tween value linearly\n\t\t\t\treturn from + (to - from) * this.progress(); \n\t\t\t};\n\t\t}\n\t\tsvg.Element.animate.prototype = new svg.Element.AnimateBase;\n\t\t\t\n\t\t// animate color element\n\t\tsvg.Element.animateColor = function(node) {\n\t\t\tthis.base = svg.Element.AnimateBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.calcValue = function() {\n\t\t\t\tvar from = new RGBColor(this.attribute('from').value);\n\t\t\t\tvar to = new RGBColor(this.attribute('to').value);\n\t\t\t\t\n\t\t\t\tif (from.ok && to.ok) {\n\t\t\t\t\t// tween color linearly\n\t\t\t\t\tvar r = from.r + (to.r - from.r) * this.progress();\n\t\t\t\t\tvar g = from.g + (to.g - from.g) * this.progress();\n\t\t\t\t\tvar b = from.b + (to.b - from.b) * this.progress();\n\t\t\t\t\treturn 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';\n\t\t\t\t}\n\t\t\t\treturn this.attribute('from').value;\n\t\t\t};\n\t\t}\n\t\tsvg.Element.animateColor.prototype = new svg.Element.AnimateBase;\n\t\t\n\t\t// animate transform element\n\t\tsvg.Element.animateTransform = function(node) {\n\t\t\tthis.base = svg.Element.animate;\n\t\t\tthis.base(node);\n\t\t}\n\t\tsvg.Element.animateTransform.prototype = new svg.Element.animate;\n\t\t\n\t\t// font element\n\t\tsvg.Element.font = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\t\t\t\n\t\t\t\n\t\t\tthis.isRTL = false;\n\t\t\tthis.isArabic = false;\n\t\t\tthis.fontFace = null;\n\t\t\tthis.missingGlyph = null;\n\t\t\tthis.glyphs = [];\t\t\t\n\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\tvar child = this.children[i];\n\t\t\t\tif (child.type == 'font-face') {\n\t\t\t\t\tthis.fontFace = child;\n\t\t\t\t\tif (child.style('font-family').hasValue()) {\n\t\t\t\t\t\tsvg.Definitions[child.style('font-family').value] = this;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (child.type == 'missing-glyph') this.missingGlyph = child;\n\t\t\t\telse if (child.type == 'glyph') {\n\t\t\t\t\tif (child.arabicForm != '') {\n\t\t\t\t\t\tthis.isRTL = true;\n\t\t\t\t\t\tthis.isArabic = true;\n\t\t\t\t\t\tif (typeof(this.glyphs[child.unicode]) == 'undefined') this.glyphs[child.unicode] = [];\n\t\t\t\t\t\tthis.glyphs[child.unicode][child.arabicForm] = child;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.glyphs[child.unicode] = child;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\n\t\t}\n\t\tsvg.Element.font.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// font-face element\n\t\tsvg.Element.fontface = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\t\n\t\t\t\n\t\t\tthis.ascent = this.attribute('ascent').value;\n\t\t\tthis.descent = this.attribute('descent').value;\n\t\t\tthis.unitsPerEm = this.attribute('units-per-em').numValue();\t\t\t\t\n\t\t}\n\t\tsvg.Element.fontface.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// missing-glyph element\n\t\tsvg.Element.missingglyph = function(node) {\n\t\t\tthis.base = svg.Element.path;\n\t\t\tthis.base(node);\t\n\t\t\t\n\t\t\tthis.horizAdvX = 0;\n\t\t}\n\t\tsvg.Element.missingglyph.prototype = new svg.Element.path;\n\t\t\n\t\t// glyph element\n\t\tsvg.Element.glyph = function(node) {\n\t\t\tthis.base = svg.Element.path;\n\t\t\tthis.base(node);\t\n\t\t\t\n\t\t\tthis.horizAdvX = this.attribute('horiz-adv-x').numValue();\n\t\t\tthis.unicode = this.attribute('unicode').value;\n\t\t\tthis.arabicForm = this.attribute('arabic-form').value;\n\t\t}\n\t\tsvg.Element.glyph.prototype = new svg.Element.path;\n\t\t\n\t\t// text element\n\t\tsvg.Element.text = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tif (node != null) {\n\t\t\t\t// add children\n\t\t\t\tthis.children = [];\n\t\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\n\t\t\t\t\tvar childNode = node.childNodes[i];\n\t\t\t\t\tif (childNode.nodeType == 1) { // capture tspan and tref nodes\n\t\t\t\t\t\tthis.addChild(childNode, true);\n\t\t\t\t\t}\n\t\t\t\t\telse if (childNode.nodeType == 3) { // capture text\n\t\t\t\t\t\tthis.addChild(new svg.Element.tspan(childNode), false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.baseSetContext = this.setContext;\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\tthis.baseSetContext(ctx);\n\t\t\t\tif (this.style('dominant-baseline').hasValue()) ctx.textBaseline = this.style('dominant-baseline').value;\n\t\t\t\tif (this.style('alignment-baseline').hasValue()) ctx.textBaseline = this.style('alignment-baseline').value;\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tvar textAnchor = this.style('text-anchor').valueOrDefault('start');\n\t\t\t\tvar x = this.attribute('x').Length.toPixels('x');\n\t\t\t\tvar y = this.attribute('y').Length.toPixels('y');\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tvar child = this.children[i];\n\t\t\t\t\n\t\t\t\t\tif (child.attribute('x').hasValue()) {\n\t\t\t\t\t\tchild.x = child.attribute('x').Length.toPixels('x');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (child.attribute('dx').hasValue()) x += child.attribute('dx').Length.toPixels('x');\n\t\t\t\t\t\tchild.x = x;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar childLength = child.measureText(ctx);\n\t\t\t\t\tif (textAnchor != 'start' && (i==0 || child.attribute('x').hasValue())) { // new group?\n\t\t\t\t\t\t// loop through rest of children\n\t\t\t\t\t\tvar groupLength = childLength;\n\t\t\t\t\t\tfor (var j=i+1; j<this.children.length; j++) {\n\t\t\t\t\t\t\tvar childInGroup = this.children[j];\n\t\t\t\t\t\t\tif (childInGroup.attribute('x').hasValue()) break; // new group\n\t\t\t\t\t\t\tgroupLength += childInGroup.measureText(ctx);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchild.x -= (textAnchor == 'end' ? groupLength : groupLength / 2.0);\n\t\t\t\t\t}\n\t\t\t\t\tx = child.x + childLength;\n\t\t\t\t\t\n\t\t\t\t\tif (child.attribute('y').hasValue()) {\n\t\t\t\t\t\tchild.y = child.attribute('y').Length.toPixels('y');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (child.attribute('dy').hasValue()) y += child.attribute('dy').Length.toPixels('y');\n\t\t\t\t\t\tchild.y = y;\n\t\t\t\t\t}\t\n\t\t\t\t\ty = child.y;\n\t\t\t\t\t\n\t\t\t\t\tchild.render(ctx);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsvg.Element.text.prototype = new svg.Element.RenderedElementBase;\n\t\t\n\t\t// text base\n\t\tsvg.Element.TextElementBase = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.getGlyph = function(font, text, i) {\n\t\t\t\tvar c = text[i];\n\t\t\t\tvar glyph = null;\n\t\t\t\tif (font.isArabic) {\n\t\t\t\t\tvar arabicForm = 'isolated';\n\t\t\t\t\tif ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal'; \n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';\n\t\t\t\t\tif (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';\n\t\t\t\t\tif (typeof(font.glyphs[c]) != 'undefined') {\n\t\t\t\t\t\tglyph = font.glyphs[c][arabicForm];\n\t\t\t\t\t\tif (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tglyph = font.glyphs[c];\n\t\t\t\t}\n\t\t\t\tif (glyph == null) glyph = font.missingGlyph;\n\t\t\t\treturn glyph;\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tvar customFont = this.parent.style('font-family').Definition.getDefinition();\n\t\t\t\tif (customFont != null) {\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\t\tvar fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);\n\t\t\t\t\tvar text = this.getText();\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\n\t\t\t\t\t\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\n\t\t\t\t\t\tvar scale = fontSize / customFont.fontFace.unitsPerEm;\n\t\t\t\t\t\tctx.translate(this.x, this.y);\n\t\t\t\t\t\tctx.scale(scale, -scale);\n\t\t\t\t\t\tvar lw = ctx.lineWidth;\n\t\t\t\t\t\tctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);\n\t\t\t\t\t\tglyph.render(ctx);\n\t\t\t\t\t\tif (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);\n\t\t\t\t\t\tctx.lineWidth = lw;\n\t\t\t\t\t\tctx.scale(1/scale, -1/scale);\n\t\t\t\t\t\tctx.translate(-this.x, -this.y);\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;\n\t\t\t\t\t\tif (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {\n\t\t\t\t\t\t\tthis.x += dx[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);\n\t\t\t\tif (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);\n\t\t\t}\n\t\t\t\n\t\t\tthis.getText = function() {\n\t\t\t\t// OVERRIDE ME\n\t\t\t}\n\t\t\t\n\t\t\tthis.measureText = function(ctx) {\n\t\t\t\tvar customFont = this.parent.style('font-family').Definition.getDefinition();\n\t\t\t\tif (customFont != null) {\n\t\t\t\t\tvar fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\t\tvar measure = 0;\n\t\t\t\t\tvar text = this.getText();\n\t\t\t\t\tif (customFont.isRTL) text = text.split(\"\").reverse().join(\"\");\n\t\t\t\t\tvar dx = svg.ToNumberArray(this.parent.attribute('dx').value);\n\t\t\t\t\tfor (var i=0; i<text.length; i++) {\n\t\t\t\t\t\tvar glyph = this.getGlyph(customFont, text, i);\n\t\t\t\t\t\tmeasure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\n\t\t\t\t\t\tif (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {\n\t\t\t\t\t\t\tmeasure += dx[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn measure;\n\t\t\t\t}\n\t\t\t\n\t\t\t\tvar textToMeasure = svg.compressSpaces(this.getText());\n\t\t\t\tif (!ctx.measureText) return textToMeasure.length * 10;\n\t\t\t\t\n\t\t\t\tctx.save();\n\t\t\t\tthis.setContext(ctx);\n\t\t\t\tvar width = ctx.measureText(textToMeasure).width;\n\t\t\t\tctx.restore();\n\t\t\t\treturn width;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;\n\t\t\n\t\t// tspan \n\t\tsvg.Element.tspan = function(node) {\n\t\t\tthis.base = svg.Element.TextElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.text = node.nodeType == 3 ? node.nodeValue : // text\n\t\t\t\t\t\tnode.childNodes.length > 0 ? node.childNodes[0].nodeValue : // element\n\t\t\t\t\t\tnode.text;\n\t\t\tthis.getText = function() {\n\t\t\t\treturn this.text;\n\t\t\t}\n\t\t}\n\t\tsvg.Element.tspan.prototype = new svg.Element.TextElementBase;\n\t\t\n\t\t// tref\n\t\tsvg.Element.tref = function(node) {\n\t\t\tthis.base = svg.Element.TextElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.getText = function() {\n\t\t\t\tvar element = this.attribute('xlink:href').Definition.getDefinition();\n\t\t\t\tif (element != null) return element.children[0].getText();\n\t\t\t}\n\t\t}\n\t\tsvg.Element.tref.prototype = new svg.Element.TextElementBase;\t\t\n\t\t\n\t\t// a element\n\t\tsvg.Element.a = function(node) {\n\t\t\tthis.base = svg.Element.TextElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.hasText = true;\n\t\t\tfor (var i=0; i<node.childNodes.length; i++) {\n\t\t\t\tif (node.childNodes[i].nodeType != 3) this.hasText = false;\n\t\t\t}\n\t\t\t\n\t\t\t// this might contain text\n\t\t\tthis.text = this.hasText ? node.childNodes[0].nodeValue : '';\n\t\t\tthis.getText = function() {\n\t\t\t\treturn this.text;\n\t\t\t}\t\t\n\n\t\t\tthis.baseRenderChildren = this.renderChildren;\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tif (this.hasText) {\n\t\t\t\t\t// render as text element\n\t\t\t\t\tthis.baseRenderChildren(ctx);\n\t\t\t\t\tvar fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);\n\t\t\t\t\tsvg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.Length.toPixels('y'), this.x + this.measureText(ctx), this.y));\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// render as temporary group\n\t\t\t\t\tvar g = new svg.Element.g();\n\t\t\t\t\tg.children = this.children;\n\t\t\t\t\tg.parent = this;\n\t\t\t\t\tg.render(ctx);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.onclick = function() {\n\t\t\t\twindow.open(this.attribute('xlink:href').value);\n\t\t\t}\n\t\t\t\n\t\t\tthis.onmousemove = function() {\n\t\t\t\tsvg.ctx.canvas.style.cursor = 'pointer';\n\t\t\t}\n\t\t}\n\t\tsvg.Element.a.prototype = new svg.Element.TextElementBase;\t\t\n\t\t\n\t\t// image element\n\t\tsvg.Element.image = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tsvg.Images.push(this);\n\t\t\tthis.img = document.createElement('img');\n\t\t\tthis.loaded = false;\n\t\t\tvar that = this;\n\t\t\tthis.img.onload = function() { that.loaded = true; }\n\t\t\tthis.img.src = this.attribute('xlink:href').value;\n\t\t\t\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tvar x = this.attribute('x').Length.toPixels('x');\n\t\t\t\tvar y = this.attribute('y').Length.toPixels('y');\n\t\t\t\t\n\t\t\t\tvar width = this.attribute('width').Length.toPixels('x');\n\t\t\t\tvar height = this.attribute('height').Length.toPixels('y');\t\t\t\n\t\t\t\tif (width == 0 || height == 0) return;\n\t\t\t\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(x, y);\n\t\t\t\tsvg.AspectRatio(ctx,\n\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value,\n\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t\tthis.img.width,\n\t\t\t\t\t\t\t\theight,\n\t\t\t\t\t\t\t\tthis.img.height,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0);\t\n\t\t\t\tctx.drawImage(this.img, 0, 0);\t\t\t\n\t\t\t\tctx.restore();\n\t\t\t}\n\t\t}\n\t\tsvg.Element.image.prototype = new svg.Element.RenderedElementBase;\n\t\t\n\t\t// group element\n\t\tsvg.Element.g = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.getBoundingBox = function() {\n\t\t\t\tvar bb = new svg.BoundingBox();\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tbb.addBoundingBox(this.children[i].getBoundingBox());\n\t\t\t\t}\n\t\t\t\treturn bb;\n\t\t\t};\n\t\t}\n\t\tsvg.Element.g.prototype = new svg.Element.RenderedElementBase;\n\n\t\t// symbol element\n\t\tsvg.Element.symbol = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.baseSetContext = this.setContext;\n\t\t\tthis.setContext = function(ctx) {\t\t\n\t\t\t\tthis.baseSetContext(ctx);\n\t\t\t\t\n\t\t\t\t// viewbox\n\t\t\t\tif (this.attribute('viewBox').hasValue()) {\t\t\t\t\n\t\t\t\t\tvar viewBox = svg.ToNumberArray(this.attribute('viewBox').value);\n\t\t\t\t\tvar minX = viewBox[0];\n\t\t\t\t\tvar minY = viewBox[1];\n\t\t\t\t\twidth = viewBox[2];\n\t\t\t\t\theight = viewBox[3];\n\t\t\t\t\t\n\t\t\t\t\tsvg.AspectRatio(ctx,\n\t\t\t\t\t\t\t\t\tthis.attribute('preserveAspectRatio').value, \n\t\t\t\t\t\t\t\t\tthis.attribute('width').Length.toPixels('x'),\n\t\t\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\t\t\tthis.attribute('height').Length.toPixels('y'),\n\t\t\t\t\t\t\t\t\theight,\n\t\t\t\t\t\t\t\t\tminX,\n\t\t\t\t\t\t\t\t\tminY);\n\n\t\t\t\t\tsvg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t}\n\t\tsvg.Element.symbol.prototype = new svg.Element.RenderedElementBase;\t\t\n\t\t\t\n\t\t// style element\n\t\tsvg.Element.style = function(node) { \n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\t// text, or spaces then CDATA\n\t\t\tvar css = node.childNodes[0].nodeValue + (node.childNodes.length > 1 ? node.childNodes[1].nodeValue : '');\n\t\t\tcss = css.replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*\\/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, ''); // remove comments\n\t\t\tcss = svg.compressSpaces(css); // replace whitespace\n\t\t\tvar cssDefs = css.split('}');\n\t\t\tfor (var i=0; i<cssDefs.length; i++) {\n\t\t\t\tif (svg.trim(cssDefs[i]) != '') {\n\t\t\t\t\tvar cssDef = cssDefs[i].split('{');\n\t\t\t\t\tvar cssClasses = cssDef[0].split(',');\n\t\t\t\t\tvar cssProps = cssDef[1].split(';');\n\t\t\t\t\tfor (var j=0; j<cssClasses.length; j++) {\n\t\t\t\t\t\tvar cssClass = svg.trim(cssClasses[j]);\n\t\t\t\t\t\tif (cssClass != '') {\n\t\t\t\t\t\t\tvar props = {};\n\t\t\t\t\t\t\tfor (var k=0; k<cssProps.length; k++) {\n\t\t\t\t\t\t\t\tvar prop = cssProps[k].indexOf(':');\n\t\t\t\t\t\t\t\tvar name = cssProps[k].substr(0, prop);\n\t\t\t\t\t\t\t\tvar value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);\n\t\t\t\t\t\t\t\tif (name != null && value != null) {\n\t\t\t\t\t\t\t\t\tprops[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsvg.Styles[cssClass] = props;\n\t\t\t\t\t\t\tif (cssClass == '@font-face') {\n\t\t\t\t\t\t\t\tvar fontFamily = props['font-family'].value.replace(/\"/g,'');\n\t\t\t\t\t\t\t\tvar srcs = props['src'].value.split(',');\n\t\t\t\t\t\t\t\tfor (var s=0; s<srcs.length; s++) {\n\t\t\t\t\t\t\t\t\tif (srcs[s].indexOf('format(\"svg\")') > 0) {\n\t\t\t\t\t\t\t\t\t\tvar urlStart = srcs[s].indexOf('url');\n\t\t\t\t\t\t\t\t\t\tvar urlEnd = srcs[s].indexOf(')', urlStart);\n\t\t\t\t\t\t\t\t\t\tvar url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);\n\t\t\t\t\t\t\t\t\t\tvar doc = svg.parseXml(svg.ajax(url));\n\t\t\t\t\t\t\t\t\t\tvar fonts = doc.getElementsByTagName('font');\n\t\t\t\t\t\t\t\t\t\tfor (var f=0; f<fonts.length; f++) {\n\t\t\t\t\t\t\t\t\t\t\tvar font = svg.CreateElement(fonts[f]);\n\t\t\t\t\t\t\t\t\t\t\tsvg.Definitions[fontFamily] = font;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsvg.Element.style.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// use element \n\t\tsvg.Element.use = function(node) {\n\t\t\tthis.base = svg.Element.RenderedElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.baseSetContext = this.setContext;\n\t\t\tthis.setContext = function(ctx) {\n\t\t\t\tthis.baseSetContext(ctx);\n\t\t\t\tif (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').Length.toPixels('x'), 0);\n\t\t\t\tif (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').Length.toPixels('y'));\n\t\t\t}\n\t\t\t\n\t\t\tthis.getDefinition = function() {\n\t\t\t\tvar element = this.attribute('xlink:href').Definition.getDefinition();\n\t\t\t\tif (this.attribute('width').hasValue()) element.attribute('width', true).value = this.attribute('width').value;\n\t\t\t\tif (this.attribute('height').hasValue()) element.attribute('height', true).value = this.attribute('height').value;\n\t\t\t\treturn element;\n\t\t\t}\n\t\t\t\n\t\t\tthis.path = function(ctx) {\n\t\t\t\tvar element = this.getDefinition();\n\t\t\t\tif (element != null) element.path(ctx);\n\t\t\t}\n\t\t\t\n\t\t\tthis.renderChildren = function(ctx) {\n\t\t\t\tvar element = this.getDefinition();\n\t\t\t\tif (element != null) element.render(ctx);\n\t\t\t}\n\t\t}\n\t\tsvg.Element.use.prototype = new svg.Element.RenderedElementBase;\n\t\t\n\t\t// mask element\n\t\tsvg.Element.mask = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\t\t\t\n\t\t\tthis.apply = function(ctx, element) {\n\t\t\t\t// render as temp svg\t\n\t\t\t\tvar x = this.attribute('x').Length.toPixels('x');\n\t\t\t\tvar y = this.attribute('y').Length.toPixels('y');\n\t\t\t\tvar width = this.attribute('width').Length.toPixels('x');\n\t\t\t\tvar height = this.attribute('height').Length.toPixels('y');\n\t\t\t\t\n\t\t\t\t// temporarily remove mask to avoid recursion\n\t\t\t\tvar mask = element.attribute('mask').value;\n\t\t\t\telement.attribute('mask').value = '';\n\t\t\t\t\n\t\t\t\t\tvar cMask = document.createElement('canvas');\n\t\t\t\t\tcMask.width = x + width;\n\t\t\t\t\tcMask.height = y + height;\n\t\t\t\t\tvar maskCtx = cMask.getContext('2d');\n\t\t\t\t\tthis.renderChildren(maskCtx);\n\t\t\t\t\n\t\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\t\tc.width = x + width;\n\t\t\t\t\tc.height = y + height;\n\t\t\t\t\tvar tempCtx = c.getContext('2d');\n\t\t\t\t\telement.render(tempCtx);\n\t\t\t\t\ttempCtx.globalCompositeOperation = 'destination-in';\n\t\t\t\t\ttempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');\n\t\t\t\t\ttempCtx.fillRect(0, 0, x + width, y + height);\n\t\t\t\t\t\n\t\t\t\t\tctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');\n\t\t\t\t\tctx.fillRect(0, 0, x + width, y + height);\n\t\t\t\t\t\n\t\t\t\t// reassign mask\n\t\t\t\telement.attribute('mask').value = mask;\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NO RENDER\n\t\t\t}\n\t\t}\n\t\tsvg.Element.mask.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// clip element\n\t\tsvg.Element.clipPath = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\n\t\t\tthis.apply = function(ctx) {\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tif (this.children[i].path) {\n\t\t\t\t\t\tthis.children[i].path(ctx);\n\t\t\t\t\t\tctx.clip();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NO RENDER\n\t\t\t}\n\t\t}\n\t\tsvg.Element.clipPath.prototype = new svg.Element.ElementBase;\n\n\t\t// filters\n\t\tsvg.Element.filter = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\n\t\t\t\t\t\t\n\t\t\tthis.apply = function(ctx, element) {\n\t\t\t\t// render as temp svg\t\n\t\t\t\tvar bb = element.getBoundingBox();\n\t\t\t\tvar x = this.attribute('x').Length.toPixels('x');\n\t\t\t\tvar y = this.attribute('y').Length.toPixels('y');\n\t\t\t\tif (x == 0 || y == 0) {\n\t\t\t\t\tx = bb.x1;\n\t\t\t\t\ty = bb.y1;\n\t\t\t\t}\n\t\t\t\tvar width = this.attribute('width').Length.toPixels('x');\n\t\t\t\tvar height = this.attribute('height').Length.toPixels('y');\n\t\t\t\tif (width == 0 || height == 0) {\n\t\t\t\t\twidth = bb.width();\n\t\t\t\t\theight = bb.height();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// temporarily remove filter to avoid recursion\n\t\t\t\tvar filter = element.style('filter').value;\n\t\t\t\telement.style('filter').value = '';\n\t\t\t\t\n\t\t\t\t// max filter distance\n\t\t\t\tvar extraPercent = .20;\n\t\t\t\tvar px = extraPercent * width;\n\t\t\t\tvar py = extraPercent * height;\n\t\t\t\t\n\t\t\t\tvar c = document.createElement('canvas');\n\t\t\t\tc.width = width + 2*px;\n\t\t\t\tc.height = height + 2*py;\n\t\t\t\tvar tempCtx = c.getContext('2d');\n\t\t\t\ttempCtx.translate(-x + px, -y + py);\n\t\t\t\telement.render(tempCtx);\n\t\t\t\n\t\t\t\t// apply filters\n\t\t\t\tfor (var i=0; i<this.children.length; i++) {\n\t\t\t\t\tthis.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// render on me\n\t\t\t\tctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);\n\t\t\t\t\n\t\t\t\t// reassign filter\n\t\t\t\telement.style('filter', true).value = filter;\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.render = function(ctx) {\n\t\t\t\t// NO RENDER\n\t\t\t}\t\t\n\t\t}\n\t\tsvg.Element.filter.prototype = new svg.Element.ElementBase;\n\t\t\n\t\tsvg.Element.feGaussianBlur = function(node) {\n\t\t\tthis.base = svg.Element.ElementBase;\n\t\t\tthis.base(node);\t\n\t\t\t\n\t\t\tfunction make_fgauss(sigma) {\n\t\t\t\tsigma = Math.max(sigma, 0.01);\t\t\t      \n\t\t\t\tvar len = Math.ceil(sigma * 4.0) + 1;                     \n\t\t\t\tmask = [];                               \n\t\t\t\tfor (var i = 0; i < len; i++) {                             \n\t\t\t\t\tmask[i] = Math.exp(-0.5 * (i / sigma) * (i / sigma));                                           \n\t\t\t\t}                                                           \n\t\t\t\treturn mask; \n\t\t\t}\n\t\t\t\n\t\t\tfunction normalize(mask) {\n\t\t\t\tvar sum = 0;\n\t\t\t\tfor (var i = 1; i < mask.length; i++) {\n\t\t\t\t\tsum += Math.abs(mask[i]);\n\t\t\t\t}\n\t\t\t\tsum = 2 * sum + Math.abs(mask[0]);\n\t\t\t\tfor (var i = 0; i < mask.length; i++) {\n\t\t\t\t\tmask[i] /= sum;\n\t\t\t\t}\n\t\t\t\treturn mask;\n\t\t\t}\n\t\t\t\n\t\t\tfunction convolve_even(src, dst, mask, width, height) {\n\t\t\t  for (var y = 0; y < height; y++) {\n\t\t\t\tfor (var x = 0; x < width; x++) {\n\t\t\t\t  var a = imGet(src, x, y, width, height, 3)/255;\n\t\t\t\t  for (var rgba = 0; rgba < 4; rgba++) {\t\t\t\t\t  \n\t\t\t\t\t  var sum = mask[0] * (a==0?255:imGet(src, x, y, width, height, rgba)) * (a==0||rgba==3?1:a);\n\t\t\t\t\t  for (var i = 1; i < mask.length; i++) {\n\t\t\t\t\t\tvar a1 = imGet(src, Math.max(x-i,0), y, width, height, 3)/255;\n\t\t\t\t\t    var a2 = imGet(src, Math.min(x+i, width-1), y, width, height, 3)/255;\n\t\t\t\t\t\tsum += mask[i] * \n\t\t\t\t\t\t  ((a1==0?255:imGet(src, Math.max(x-i,0), y, width, height, rgba)) * (a1==0||rgba==3?1:a1) + \n\t\t\t\t\t\t   (a2==0?255:imGet(src, Math.min(x+i, width-1), y, width, height, rgba)) * (a2==0||rgba==3?1:a2));\n\t\t\t\t\t  }\n\t\t\t\t\t  imSet(dst, y, x, height, width, rgba, sum);\n\t\t\t\t  }\t\t\t  \n\t\t\t\t}\n\t\t\t  }\n\t\t\t}\t\t\n\n\t\t\tfunction imGet(img, x, y, width, height, rgba) {\n\t\t\t\treturn img[y*width*4 + x*4 + rgba];\n\t\t\t}\n\t\t\t\n\t\t\tfunction imSet(img, x, y, width, height, rgba, val) {\n\t\t\t\timg[y*width*4 + x*4 + rgba] = val;\n\t\t\t}\n\t\t\t\t\t\t\n\t\t\tfunction blur(ctx, width, height, sigma)\n\t\t\t{\n\t\t\t\tvar srcData = ctx.getImageData(0, 0, width, height);\n\t\t\t\tvar mask = make_fgauss(sigma);\n\t\t\t\tmask = normalize(mask);\n\t\t\t\ttmp = [];\n\t\t\t\tconvolve_even(srcData.data, tmp, mask, width, height);\n\t\t\t\tconvolve_even(tmp, srcData.data, mask, height, width);\n\t\t\t\tctx.clearRect(0, 0, width, height);\n\t\t\t\tctx.putImageData(srcData, 0, 0);\n\t\t\t}\t\t\t\n\t\t\n\t\t\tthis.apply = function(ctx, x, y, width, height) {\n\t\t\t\t// assuming x==0 && y==0 for now\n\t\t\t\tblur(ctx, width, height, this.attribute('stdDeviation').numValue());\n\t\t\t}\n\t\t}\n\t\tsvg.Element.filter.prototype = new svg.Element.feGaussianBlur;\n\t\t\n\t\t// title element, do nothing\n\t\tsvg.Element.title = function(node) {\n\t\t}\n\t\tsvg.Element.title.prototype = new svg.Element.ElementBase;\n\n\t\t// desc element, do nothing\n\t\tsvg.Element.desc = function(node) {\n\t\t}\n\t\tsvg.Element.desc.prototype = new svg.Element.ElementBase;\t\t\n\t\t\n\t\tsvg.Element.MISSING = function(node) {\n\t\t\tconsole.log('ERROR: Element \\'' + node.nodeName + '\\' not yet implemented.');\n\t\t}\n\t\tsvg.Element.MISSING.prototype = new svg.Element.ElementBase;\n\t\t\n\t\t// element factory\n\t\tsvg.CreateElement = function(node) {\t\n\t\t\tvar className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace\n\t\t\tclassName = className.replace(/\\-/g,''); // remove dashes\n\t\t\tvar e = null;\n\t\t\tif (typeof(svg.Element[className]) != 'undefined') {\n\t\t\t\te = new svg.Element[className](node);\n\t\t\t}\n\t\t\telse {\n\t\t\t\te = new svg.Element.MISSING(node);\n\t\t\t}\n\n\t\t\te.type = node.nodeName;\n\t\t\treturn e;\n\t\t}\n\t\t\t\t\n\t\t// load from url\n\t\tsvg.load = function(ctx, url) {\n\t\t\tsvg.loadXml(ctx, svg.ajax(url));\n\t\t}\n\t\t\n\t\t// load from xml\n\t\tsvg.loadXml = function(ctx, xml) {\n\t\t\tsvg.loadXmlDoc(ctx, svg.parseXml(xml));\n\t\t}\n\t\t\n\t\tsvg.loadXmlDoc = function(ctx, dom) {\n\t\t\tsvg.init(ctx);\n\t\t\t\n\t\t\tvar mapXY = function(p) {\n\t\t\t\tvar e = ctx.canvas;\n\t\t\t\twhile (e) {\n\t\t\t\t\tp.x -= e.offsetLeft;\n\t\t\t\t\tp.y -= e.offsetTop;\n\t\t\t\t\te = e.offsetParent;\n\t\t\t\t}\n\t\t\t\tif (window.scrollX) p.x += window.scrollX;\n\t\t\t\tif (window.scrollY) p.y += window.scrollY;\n\t\t\t\treturn p;\n\t\t\t}\n\t\t\t\n\t\t\t// bind mouse\n\t\t\tif (svg.opts['ignoreMouse'] != true) {\n\t\t\t\tctx.canvas.onclick = function(e) {\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\n\t\t\t\t\tsvg.Mouse.onclick(p.x, p.y);\n\t\t\t\t};\n\t\t\t\tctx.canvas.onmousemove = function(e) {\n\t\t\t\t\tvar p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));\n\t\t\t\t\tsvg.Mouse.onmousemove(p.x, p.y);\n\t\t\t\t};\n\t\t\t}\n\t\t\n\t\t\tvar e = svg.CreateElement(dom.documentElement);\n\t\t\te.root = true;\n\t\t\t\t\t\n\t\t\t// render loop\n\t\t\tvar isFirstRender = true;\n\t\t\tvar draw = function() {\n\t\t\t\tsvg.ViewPort.Clear();\n\t\t\t\tif (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);\n\t\t\t\n\t\t\t\tif (svg.opts['ignoreDimensions'] != true) {\n\t\t\t\t\t// set canvas size\n\t\t\t\t\tif (e.style('width').hasValue()) {\n\t\t\t\t\t\tctx.canvas.width = e.style('width').Length.toPixels('x');\n\t\t\t\t\t\tctx.canvas.style.width = ctx.canvas.width + 'px';\n\t\t\t\t\t}\n\t\t\t\t\tif (e.style('height').hasValue()) {\n\t\t\t\t\t\tctx.canvas.height = e.style('height').Length.toPixels('y');\n\t\t\t\t\t\tctx.canvas.style.height = ctx.canvas.height + 'px';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar cWidth = ctx.canvas.clientWidth || ctx.canvas.width;\n\t\t\t\tvar cHeight = ctx.canvas.clientHeight || ctx.canvas.height;\n\t\t\t\tsvg.ViewPort.SetCurrent(cWidth, cHeight);\t\t\n\t\t\t\t\n\t\t\t\tif (svg.opts != null && svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];\n\t\t\t\tif (svg.opts != null && svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];\n\t\t\t\tif (svg.opts != null && svg.opts['scaleWidth'] != null && svg.opts['scaleHeight'] != null) {\n\t\t\t\t\tvar xRatio = 1, yRatio = 1;\n\t\t\t\t\tif (e.attribute('width').hasValue()) xRatio = e.attribute('width').Length.toPixels('x') / svg.opts['scaleWidth'];\n\t\t\t\t\tif (e.attribute('height').hasValue()) yRatio = e.attribute('height').Length.toPixels('y') / svg.opts['scaleHeight'];\n\t\t\t\t\n\t\t\t\t\te.attribute('width', true).value = svg.opts['scaleWidth'];\n\t\t\t\t\te.attribute('height', true).value = svg.opts['scaleHeight'];\t\t\t\n\t\t\t\t\te.attribute('viewBox', true).value = '0 0 ' + (cWidth * xRatio) + ' ' + (cHeight * yRatio);\n\t\t\t\t\te.attribute('preserveAspectRatio', true).value = 'none';\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// clear and render\n\t\t\t\tif (svg.opts['ignoreClear'] != true) {\n\t\t\t\t\tctx.clearRect(0, 0, cWidth, cHeight);\n\t\t\t\t}\n\t\t\t\te.render(ctx);\n\t\t\t\tif (isFirstRender) {\n\t\t\t\t\tisFirstRender = false;\n\t\t\t\t\tif (svg.opts != null && typeof(svg.opts['renderCallback']) == 'function') svg.opts['renderCallback']();\n\t\t\t\t}\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tvar waitingForImages = true;\n\t\t\tif (svg.ImagesLoaded()) {\n\t\t\t\twaitingForImages = false;\n\t\t\t\tdraw();\n\t\t\t}\n\t\t\tsvg.intervalID = setInterval(function() { \n\t\t\t\tvar needUpdate = false;\n\t\t\t\t\n\t\t\t\tif (waitingForImages && svg.ImagesLoaded()) {\n\t\t\t\t\twaitingForImages = false;\n\t\t\t\t\tneedUpdate = true;\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// need update from mouse events?\n\t\t\t\tif (svg.opts['ignoreMouse'] != true) {\n\t\t\t\t\tneedUpdate = needUpdate | svg.Mouse.hasEvents();\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// need update from animations?\n\t\t\t\tif (svg.opts['ignoreAnimation'] != true) {\n\t\t\t\t\tfor (var i=0; i<svg.Animations.length; i++) {\n\t\t\t\t\t\tneedUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// need update from redraw?\n\t\t\t\tif (svg.opts != null && typeof(svg.opts['forceRedraw']) == 'function') {\n\t\t\t\t\tif (svg.opts['forceRedraw']() == true) needUpdate = true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// render if needed\n\t\t\t\tif (needUpdate) {\n\t\t\t\t\tdraw();\t\t\t\t\n\t\t\t\t\tsvg.Mouse.runEvents(); // run and clear our events\n\t\t\t\t}\n\t\t\t}, 1000 / svg.FRAMERATE);\n\t\t}\n\t\t\n\t\tsvg.stop = function() {\n\t\t\tif (svg.intervalID) {\n\t\t\t\tclearInterval(svg.intervalID);\n\t\t\t}\n\t\t}\n\t\t\n\t\tsvg.Mouse = new (function() {\n\t\t\tthis.events = [];\n\t\t\tthis.hasEvents = function() { return this.events.length != 0; }\n\t\t\n\t\t\tthis.onclick = function(x, y) {\n\t\t\t\tthis.events.push({ type: 'onclick', x: x, y: y, \n\t\t\t\t\trun: function(e) { if (e.onclick) e.onclick(); }\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tthis.onmousemove = function(x, y) {\n\t\t\t\tthis.events.push({ type: 'onmousemove', x: x, y: y,\n\t\t\t\t\trun: function(e) { if (e.onmousemove) e.onmousemove(); }\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\tthis.eventElements = [];\n\t\t\t\n\t\t\tthis.checkPath = function(element, ctx) {\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\n\t\t\t\t\tvar e = this.events[i];\n\t\t\t\t\tif (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.checkBoundingBox = function(element, bb) {\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\n\t\t\t\t\tvar e = this.events[i];\n\t\t\t\t\tif (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;\n\t\t\t\t}\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tthis.runEvents = function() {\n\t\t\t\tsvg.ctx.canvas.style.cursor = '';\n\t\t\t\t\n\t\t\t\tfor (var i=0; i<this.events.length; i++) {\n\t\t\t\t\tvar e = this.events[i];\n\t\t\t\t\tvar element = this.eventElements[i];\n\t\t\t\t\twhile (element) {\n\t\t\t\t\t\te.run(element);\n\t\t\t\t\t\telement = element.parent;\n\t\t\t\t\t}\n\t\t\t\t}\t\t\n\t\t\t\n\t\t\t\t// done running, clear\n\t\t\t\tthis.events = []; \n\t\t\t\tthis.eventElements = [];\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn svg;\n\t}\n})();\n\nif (CanvasRenderingContext2D) {\n\tCanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) {\n\t\tcanvg(this.canvas, s, { \n\t\t\tignoreMouse: true, \n\t\t\tignoreAnimation: true, \n\t\t\tignoreDimensions: true, \n\t\t\tignoreClear: true, \n\t\t\toffsetX: dx, \n\t\t\toffsetY: dy, \n\t\t\tscaleWidth: dw, \n\t\t\tscaleHeight: dh\n\t\t});\n\t}\n}/**\n * @license Highcharts JS v3.0.6 (2013-10-04)\n * CanVGRenderer Extension module\n *\n * (c) 2011-2012 Torstein Hønsi, Erik Olsson\n *\n * License: www.highcharts.com/license\n */\n\n// JSLint options:\n/*global Highcharts */\n\n(function (Highcharts) { // encapsulate\n\tvar UNDEFINED,\n\t\tDIV = 'div',\n\t\tABSOLUTE = 'absolute',\n\t\tRELATIVE = 'relative',\n\t\tHIDDEN = 'hidden',\n\t\tVISIBLE = 'visible',\n\t\tPX = 'px',\n\t\tcss = Highcharts.css,\n\t\tCanVGRenderer = Highcharts.CanVGRenderer,\n\t\tSVGRenderer = Highcharts.SVGRenderer,\n\t\textend = Highcharts.extend,\n\t\tmerge = Highcharts.merge,\n\t\taddEvent = Highcharts.addEvent,\n\t\tcreateElement = Highcharts.createElement,\n\t\tdiscardElement = Highcharts.discardElement;\n\n\t// Extend CanVG renderer on demand, inherit from SVGRenderer\n\textend(CanVGRenderer.prototype, SVGRenderer.prototype);\n\n\t// Add additional functionality:\n\textend(CanVGRenderer.prototype, {\n\t\tcreate: function (chart, container, chartWidth, chartHeight) {\n\t\t\tthis.setContainer(container, chartWidth, chartHeight);\n\t\t\tthis.configure(chart);\n\t\t},\n\t\tsetContainer: function (container, chartWidth, chartHeight) {\n\t\t\tvar containerStyle = container.style,\n\t\t\t\tcontainerParent = container.parentNode,\n\t\t\t\tcontainerLeft = containerStyle.left,\n\t\t\t\tcontainerTop = containerStyle.top,\n\t\t\t\tcontainerOffsetWidth = container.offsetWidth,\n\t\t\t\tcontainerOffsetHeight = container.offsetHeight,\n\t\t\t\tcanvas,\n\t\t\t\tinitialHiddenStyle = { visibility: HIDDEN, position: ABSOLUTE };\n\n\t\t\tthis.init.apply(this, [container, chartWidth, chartHeight]);\n\n\t\t\t// add the canvas above it\n\t\t\tcanvas = createElement('canvas', {\n\t\t\t\twidth: containerOffsetWidth,\n\t\t\t\theight: containerOffsetHeight\n\t\t\t}, {\n\t\t\t\tposition: RELATIVE,\n\t\t\t\tleft: containerLeft,\n\t\t\t\ttop: containerTop\n\t\t\t}, container);\n\t\t\tthis.canvas = canvas;\n\n\t\t\t// Create the tooltip line and div, they are placed as siblings to\n\t\t\t// the container (and as direct childs to the div specified in the html page)\n\t\t\tthis.ttLine = createElement(DIV, null, initialHiddenStyle, containerParent);\n\t\t\tthis.ttDiv = createElement(DIV, null, initialHiddenStyle, containerParent);\n\t\t\tthis.ttTimer = UNDEFINED;\n\n\t\t\t// Move away the svg node to a new div inside the container's parent so we can hide it.\n\t\t\tvar hiddenSvg = createElement(DIV, {\n\t\t\t\twidth: containerOffsetWidth,\n\t\t\t\theight: containerOffsetHeight\n\t\t\t}, {\n\t\t\t\tvisibility: HIDDEN,\n\t\t\t\tleft: containerLeft,\n\t\t\t\ttop: containerTop\n\t\t\t}, containerParent);\n\t\t\tthis.hiddenSvg = hiddenSvg;\n\t\t\thiddenSvg.appendChild(this.box);\n\t\t},\n\n\t\t/**\n\t\t * Configures the renderer with the chart. Attach a listener to the event tooltipRefresh.\n\t\t **/\n\t\tconfigure: function (chart) {\n\t\t\tvar renderer = this,\n\t\t\t\toptions = chart.options.tooltip,\n\t\t\t\tborderWidth = options.borderWidth,\n\t\t\t\ttooltipDiv = renderer.ttDiv,\n\t\t\t\ttooltipDivStyle = options.style,\n\t\t\t\ttooltipLine = renderer.ttLine,\n\t\t\t\tpadding = parseInt(tooltipDivStyle.padding, 10);\n\n\t\t\t// Add border styling from options to the style\n\t\t\ttooltipDivStyle = merge(tooltipDivStyle, {\n\t\t\t\tpadding: padding + PX,\n\t\t\t\t'background-color': options.backgroundColor,\n\t\t\t\t'border-style': 'solid',\n\t\t\t\t'border-width': borderWidth + PX,\n\t\t\t\t'border-radius': options.borderRadius + PX\n\t\t\t});\n\n\t\t\t// Optionally add shadow\n\t\t\tif (options.shadow) {\n\t\t\t\ttooltipDivStyle = merge(tooltipDivStyle, {\n\t\t\t\t\t'box-shadow': '1px 1px 3px gray', // w3c\n\t\t\t\t\t'-webkit-box-shadow': '1px 1px 3px gray' // webkit\n\t\t\t\t});\n\t\t\t}\n\t\t\tcss(tooltipDiv, tooltipDivStyle);\n\n\t\t\t// Set simple style on the line\n\t\t\tcss(tooltipLine, {\n\t\t\t\t'border-left': '1px solid darkgray'\n\t\t\t});\n\n\t\t\t// This event is triggered when a new tooltip should be shown\n\t\t\taddEvent(chart, 'tooltipRefresh', function (args) {\n\t\t\t\tvar chartContainer = chart.container,\n\t\t\t\t\toffsetLeft = chartContainer.offsetLeft,\n\t\t\t\t\toffsetTop = chartContainer.offsetTop,\n\t\t\t\t\tposition;\n\n\t\t\t\t// Set the content of the tooltip\n\t\t\t\ttooltipDiv.innerHTML = args.text;\n\n\t\t\t\t// Compute the best position for the tooltip based on the divs size and container size.\n\t\t\t\tposition = chart.tooltip.getPosition(tooltipDiv.offsetWidth, tooltipDiv.offsetHeight, {plotX: args.x, plotY: args.y});\n\n\t\t\t\tcss(tooltipDiv, {\n\t\t\t\t\tvisibility: VISIBLE,\n\t\t\t\t\tleft: position.x + PX,\n\t\t\t\t\ttop: position.y + PX,\n\t\t\t\t\t'border-color': args.borderColor\n\t\t\t\t});\n\n\t\t\t\t// Position the tooltip line\n\t\t\t\tcss(tooltipLine, {\n\t\t\t\t\tvisibility: VISIBLE,\n\t\t\t\t\tleft: offsetLeft + args.x + PX,\n\t\t\t\t\ttop: offsetTop + chart.plotTop + PX,\n\t\t\t\t\theight: chart.plotHeight  + PX\n\t\t\t\t});\n\n\t\t\t\t// This timeout hides the tooltip after 3 seconds\n\t\t\t\t// First clear any existing timer\n\t\t\t\tif (renderer.ttTimer !== UNDEFINED) {\n\t\t\t\t\tclearTimeout(renderer.ttTimer);\n\t\t\t\t}\n\n\t\t\t\t// Start a new timer that hides tooltip and line\n\t\t\t\trenderer.ttTimer = setTimeout(function () {\n\t\t\t\t\tcss(tooltipDiv, { visibility: HIDDEN });\n\t\t\t\t\tcss(tooltipLine, { visibility: HIDDEN });\n\t\t\t\t}, 3000);\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Extend SVGRenderer.destroy to also destroy the elements added by CanVGRenderer.\n\t\t */\n\t\tdestroy: function () {\n\t\t\tvar renderer = this;\n\n\t\t\t// Remove the canvas\n\t\t\tdiscardElement(renderer.canvas);\n\n\t\t\t// Kill the timer\n\t\t\tif (renderer.ttTimer !== UNDEFINED) {\n\t\t\t\tclearTimeout(renderer.ttTimer);\n\t\t\t}\n\n\t\t\t// Remove the divs for tooltip and line\n\t\t\tdiscardElement(renderer.ttLine);\n\t\t\tdiscardElement(renderer.ttDiv);\n\t\t\tdiscardElement(renderer.hiddenSvg);\n\n\t\t\t// Continue with base class\n\t\t\treturn SVGRenderer.prototype.destroy.apply(renderer);\n\t\t},\n\n\t\t/**\n\t\t * Take a color and return it if it's a string, do not make it a gradient even if it is a\n\t\t * gradient. Currently canvg cannot render gradients (turns out black),\n\t\t * see: http://code.google.com/p/canvg/issues/detail?id=104\n\t\t *\n\t\t * @param {Object} color The color or config object\n\t\t */\n\t\tcolor: function (color, elem, prop) {\n\t\t\tif (color && color.linearGradient) {\n\t\t\t\t// Pick the end color and forward to base implementation\n\t\t\t\tcolor = color.stops[color.stops.length - 1][1];\n\t\t\t}\n\t\t\treturn SVGRenderer.prototype.color.call(this, color, elem, prop);\n\t\t},\n\n\t\t/**\n\t\t * Draws the SVG on the canvas or adds a draw invokation to the deferred list.\n\t\t */\n\t\tdraw: function () {\n\t\t\tvar renderer = this;\n\t\t\twindow.canvg(renderer.canvas, renderer.hiddenSvg.innerHTML);\n\t\t}\n\t});\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/data.js",
    "content": "/*\n Data plugin for Highcharts\n\n (c) 2012-2013 Torstein Hønsi\n Last revision 2013-06-07\n\n License: www.highcharts.com/license\n*/\n(function(h){var k=h.each,m=function(b,a){this.init(b,a)};h.extend(m.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b=this.chartOptions,a=b&&b.chart&&b.chart.type,c=[];k(b&&b.series||[],function(b){c.push((h.seriesTypes[b.type||a||\"line\"].prototype.pointArrayMap||[0]).length)});this.valueCount=\n{global:(h.seriesTypes[a||\"line\"].prototype.pointArrayMap||[0]).length,individual:c}},dataFound:function(){this.parseTypes();this.findHeaderRow();this.parsed();this.complete()},parseCSV:function(){var b=this,a=this.options,c=a.csv,d=this.columns,f=a.startRow||0,i=a.endRow||Number.MAX_VALUE,j=a.startColumn||0,e=a.endColumn||Number.MAX_VALUE,g=0;c&&(c=c.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\").split(a.lineDelimiter||\"\\n\"),k(c,function(c,h){var n=b.trim(c),p=n.indexOf(\"#\")===0;h>=f&&h<=i&&!p&&n!==\"\"&&\n(n=c.split(a.itemDelimiter||\",\"),k(n,function(b,a){a>=j&&a<=e&&(d[a-j]||(d[a-j]=[]),d[a-j][g]=b)}),g+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a=b.table,c=this.columns,d=b.startRow||0,f=b.endRow||Number.MAX_VALUE,i=b.startColumn||0,j=b.endColumn||Number.MAX_VALUE,e;a&&(typeof a===\"string\"&&(a=document.getElementById(a)),k(a.getElementsByTagName(\"tr\"),function(a,b){e=0;b>=d&&b<=f&&k(a.childNodes,function(a){if((a.tagName===\"TD\"||a.tagName===\"TH\")&&e>=i&&e<=j)c[e]||(c[e]=[]),\nc[e][b-d]=a.innerHTML,e+=1})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b=this,a=this.options,c=a.googleSpreadsheetKey,d=this.columns,f=a.startRow||0,i=a.endRow||Number.MAX_VALUE,j=a.startColumn||0,e=a.endColumn||Number.MAX_VALUE,g,h;c&&jQuery.getJSON(\"https://spreadsheets.google.com/feeds/cells/\"+c+\"/\"+(a.googleSpreadsheetWorksheet||\"od6\")+\"/public/values?alt=json-in-script&callback=?\",function(a){var a=a.feed.entry,c,k=a.length,m=0,o=0,l;for(l=0;l<k;l++)c=a[l],m=Math.max(m,c.gs$cell.col),\no=Math.max(o,c.gs$cell.row);for(l=0;l<m;l++)if(l>=j&&l<=e)d[l-j]=[],d[l-j].length=Math.min(o,i-f);for(l=0;l<k;l++)if(c=a[l],g=c.gs$cell.row-1,h=c.gs$cell.col-1,h>=j&&h<=e&&g>=f&&g<=i)d[h-j][g-f]=c.content.$t;b.dataFound()})},findHeaderRow:function(){k(this.columns,function(){});this.headerRow=0},trim:function(b){return typeof b===\"string\"?b.replace(/^\\s+|\\s+$/g,\"\"):b},parseTypes:function(){for(var b=this.columns,a=b.length,c,d,f,i;a--;)for(c=b[a].length;c--;)d=b[a][c],f=parseFloat(d),i=this.trim(d),\ni==f?(b[a][c]=f,f>31536E6?b[a].isDatetime=!0:b[a].isNumeric=!0):(d=this.parseDate(d),a===0&&typeof d===\"number\"&&!isNaN(d)?(b[a][c]=d,b[a].isDatetime=!0):b[a][c]=i===\"\"?null:i)},dateFormats:{\"YYYY-mm-dd\":{regex:\"^([0-9]{4})-([0-9]{2})-([0-9]{2})$\",parser:function(b){return Date.UTC(+b[1],b[2]-1,+b[3])}}},parseDate:function(b){var a=this.options.parseDate,c,d,f;a&&(c=a(b));if(typeof b===\"string\")for(d in this.dateFormats)a=this.dateFormats[d],(f=b.match(a.regex))&&(c=a.parser(f));return c},rowsToColumns:function(b){var a,\nc,d,f,i;if(b){i=[];c=b.length;for(a=0;a<c;a++){f=b[a].length;for(d=0;d<f;d++)i[d]||(i[d]=[]),i[d][a]=b[a][d]}}return i},parsed:function(){this.options.parsed&&this.options.parsed.call(this,this.columns)},complete:function(){var b=this.columns,a,c,d=this.options,f,i,j,e,g,k;if(d.complete){this.getColumnDistribution();b.length>1&&(a=b.shift(),this.headerRow===0&&a.shift(),a.isDatetime?c=\"datetime\":a.isNumeric||(c=\"category\"));for(e=0;e<b.length;e++)if(this.headerRow===0)b[e].name=b[e].shift();i=[];\nfor(e=0,k=0;e<b.length;k++){f=h.pick(this.valueCount.individual[k],this.valueCount.global);j=[];for(g=0;g<b[e].length;g++)j[g]=[a[g],b[e][g]!==void 0?b[e][g]:null],f>1&&j[g].push(b[e+1][g]!==void 0?b[e+1][g]:null),f>2&&j[g].push(b[e+2][g]!==void 0?b[e+2][g]:null),f>3&&j[g].push(b[e+3][g]!==void 0?b[e+3][g]:null),f>4&&j[g].push(b[e+4][g]!==void 0?b[e+4][g]:null);i[k]={name:b[e].name,data:j};e+=f}d.complete({xAxis:{type:c},series:i})}}});h.Data=m;h.data=function(b,a){return new m(b,a)};h.wrap(h.Chart.prototype,\n\"init\",function(b,a,c){var d=this;a&&a.data?h.data(h.extend(a.data,{complete:function(f){a.series&&k(a.series,function(b,c){a.series[c]=h.merge(b,f.series[c])});a=h.merge(f,a);b.call(d,a,c)}}),a):b.call(d,a,c)})})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/data.src.js",
    "content": "/**\n * @license Data plugin for Highcharts\n *\n * (c) 2012-2013 Torstein Hønsi\n * Last revision 2013-06-07\n *\n * License: www.highcharts.com/license\n */\n\n/*\n * The Highcharts Data plugin is a utility to ease parsing of input sources like\n * CSV, HTML tables or grid views into basic configuration options for use \n * directly in the Highcharts constructor.\n *\n * Demo: http://jsfiddle.net/highcharts/SnLFj/\n *\n * --- OPTIONS ---\n *\n * - columns : Array<Array<Mixed>>\n * A two-dimensional array representing the input data on tabular form. This input can\n * be used when the data is already parsed, for example from a grid view component.\n * Each cell can be a string or number. If not switchRowsAndColumns is set, the columns\n * are interpreted as series. See also the rows option.\n *\n * - complete : Function(chartOptions)\n * The callback that is evaluated when the data is finished loading, optionally from an \n * external source, and parsed. The first argument passed is a finished chart options\n * object, containing series and an xAxis with categories if applicable. Thise options\n * can be extended with additional options and passed directly to the chart constructor.\n *\n * - csv : String\n * A comma delimited string to be parsed. Related options are startRow, endRow, startColumn\n * and endColumn to delimit what part of the table is used. The lineDelimiter and \n * itemDelimiter options define the CSV delimiter formats.\n * \n * - endColumn : Integer\n * In tabular input data, the first row (indexed by 0) to use. Defaults to the last \n * column containing data.\n *\n * - endRow : Integer\n * In tabular input data, the last row (indexed by 0) to use. Defaults to the last row\n * containing data.\n *\n * - googleSpreadsheetKey : String \n * A Google Spreadsheet key. See https://developers.google.com/gdata/samples/spreadsheet_sample\n * for general information on GS.\n *\n * - googleSpreadsheetWorksheet : String \n * The Google Spreadsheet worksheet. The available id's can be read from \n * https://spreadsheets.google.com/feeds/worksheets/{key}/public/basic\n *\n * - itemDelimiter : String\n * Item or cell delimiter for parsing CSV. Defaults to \",\".\n *\n * - lineDelimiter : String\n * Line delimiter for parsing CSV. Defaults to \"\\n\".\n *\n * - parsed : Function\n * A callback function to access the parsed columns, the two-dimentional input data\n * array directly, before they are interpreted into series data and categories.\n *\n * - parseDate : Function\n * A callback function to parse string representations of dates into JavaScript timestamps.\n * Return an integer on success.\n *\n * - rows : Array<Array<Mixed>>\n * The same as the columns input option, but defining rows intead of columns.\n *\n * - startColumn : Integer\n * In tabular input data, the first column (indexed by 0) to use. \n *\n * - startRow : Integer\n * In tabular input data, the first row (indexed by 0) to use.\n *\n * - table : String|HTMLElement\n * A HTML table or the id of such to be parsed as input data. Related options ara startRow,\n * endRow, startColumn and endColumn to delimit what part of the table is used.\n */\n\n// JSLint options:\n/*global jQuery */\n\n(function (Highcharts) {\t\n\t\n\t// Utilities\n\tvar each = Highcharts.each;\n\t\n\t\n\t// The Data constructor\n\tvar Data = function (dataOptions, chartOptions) {\n\t\tthis.init(dataOptions, chartOptions);\n\t};\n\t\n\t// Set the prototype properties\n\tHighcharts.extend(Data.prototype, {\n\t\t\n\t/**\n\t * Initialize the Data object with the given options\n\t */\n\tinit: function (options, chartOptions) {\n\t\tthis.options = options;\n\t\tthis.chartOptions = chartOptions;\n\t\tthis.columns = options.columns || this.rowsToColumns(options.rows) || [];\n\n\t\t// No need to parse or interpret anything\n\t\tif (this.columns.length) {\n\t\t\tthis.dataFound();\n\n\t\t// Parse and interpret\n\t\t} else {\n\n\t\t\t// Parse a CSV string if options.csv is given\n\t\t\tthis.parseCSV();\n\t\t\t\n\t\t\t// Parse a HTML table if options.table is given\n\t\t\tthis.parseTable();\n\n\t\t\t// Parse a Google Spreadsheet \n\t\t\tthis.parseGoogleSpreadsheet();\t\n\t\t}\n\n\t},\n\n\t/**\n\t * Get the column distribution. For example, a line series takes a single column for \n\t * Y values. A range series takes two columns for low and high values respectively,\n\t * and an OHLC series takes four columns.\n\t */\n\tgetColumnDistribution: function () {\n\t\tvar chartOptions = this.chartOptions,\n\t\t\tgetValueCount = function (type) {\n\t\t\t\treturn (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length;\n\t\t\t},\n\t\t\tglobalType = chartOptions && chartOptions.chart && chartOptions.chart.type,\n\t\t\tindividualCounts = [];\n\n\t\teach((chartOptions && chartOptions.series) || [], function (series) {\n\t\t\tindividualCounts.push(getValueCount(series.type || globalType));\n\t\t});\n\n\t\tthis.valueCount = {\n\t\t\tglobal: getValueCount(globalType),\n\t\t\tindividual: individualCounts\n\t\t};\n\t},\n\n\n\tdataFound: function () {\n\t\t// Interpret the values into right types\n\t\tthis.parseTypes();\n\t\t\n\t\t// Use first row for series names?\n\t\tthis.findHeaderRow();\n\t\t\n\t\t// Handle columns if a handleColumns callback is given\n\t\tthis.parsed();\n\t\t\n\t\t// Complete if a complete callback is given\n\t\tthis.complete();\n\t\t\n\t},\n\t\n\t/**\n\t * Parse a CSV input string\n\t */\n\tparseCSV: function () {\n\t\tvar self = this,\n\t\t\toptions = this.options,\n\t\t\tcsv = options.csv,\n\t\t\tcolumns = this.columns,\n\t\t\tstartRow = options.startRow || 0,\n\t\t\tendRow = options.endRow || Number.MAX_VALUE,\n\t\t\tstartColumn = options.startColumn || 0,\n\t\t\tendColumn = options.endColumn || Number.MAX_VALUE,\n\t\t\tlines,\n\t\t\tactiveRowNo = 0;\n\t\t\t\n\t\tif (csv) {\n\t\t\t\n\t\t\tlines = csv\n\t\t\t\t.replace(/\\r\\n/g, \"\\n\") // Unix\n\t\t\t\t.replace(/\\r/g, \"\\n\") // Mac\n\t\t\t\t.split(options.lineDelimiter || \"\\n\");\n\t\t\t\n\t\t\teach(lines, function (line, rowNo) {\n\t\t\t\tvar trimmed = self.trim(line),\n\t\t\t\t\tisComment = trimmed.indexOf('#') === 0,\n\t\t\t\t\tisBlank = trimmed === '',\n\t\t\t\t\titems;\n\t\t\t\t\n\t\t\t\tif (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) {\n\t\t\t\t\titems = line.split(options.itemDelimiter || ',');\n\t\t\t\t\teach(items, function (item, colNo) {\n\t\t\t\t\t\tif (colNo >= startColumn && colNo <= endColumn) {\n\t\t\t\t\t\t\tif (!columns[colNo - startColumn]) {\n\t\t\t\t\t\t\t\tcolumns[colNo - startColumn] = [];\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tcolumns[colNo - startColumn][activeRowNo] = item;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tactiveRowNo += 1;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.dataFound();\n\t\t}\n\t},\n\t\n\t/**\n\t * Parse a HTML table\n\t */\n\tparseTable: function () {\n\t\tvar options = this.options,\n\t\t\ttable = options.table,\n\t\t\tcolumns = this.columns,\n\t\t\tstartRow = options.startRow || 0,\n\t\t\tendRow = options.endRow || Number.MAX_VALUE,\n\t\t\tstartColumn = options.startColumn || 0,\n\t\t\tendColumn = options.endColumn || Number.MAX_VALUE,\n\t\t\tcolNo;\n\t\t\t\n\t\tif (table) {\n\t\t\t\n\t\t\tif (typeof table === 'string') {\n\t\t\t\ttable = document.getElementById(table);\n\t\t\t}\n\t\t\t\n\t\t\teach(table.getElementsByTagName('tr'), function (tr, rowNo) {\n\t\t\t\tcolNo = 0; \n\t\t\t\tif (rowNo >= startRow && rowNo <= endRow) {\n\t\t\t\t\teach(tr.childNodes, function (item) {\n\t\t\t\t\t\tif ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) {\n\t\t\t\t\t\t\tif (!columns[colNo]) {\n\t\t\t\t\t\t\t\tcolumns[colNo] = [];\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcolumns[colNo][rowNo - startRow] = item.innerHTML;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tcolNo += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.dataFound(); // continue\n\t\t}\n\t},\n\n\t/**\n\t * TODO: \n\t * - switchRowsAndColumns\n\t */\n\tparseGoogleSpreadsheet: function () {\n\t\tvar self = this,\n\t\t\toptions = this.options,\n\t\t\tgoogleSpreadsheetKey = options.googleSpreadsheetKey,\n\t\t\tcolumns = this.columns,\n\t\t\tstartRow = options.startRow || 0,\n\t\t\tendRow = options.endRow || Number.MAX_VALUE,\n\t\t\tstartColumn = options.startColumn || 0,\n\t\t\tendColumn = options.endColumn || Number.MAX_VALUE,\n\t\t\tgr, // google row\n\t\t\tgc; // google column\n\n\t\tif (googleSpreadsheetKey) {\n\t\t\tjQuery.getJSON('https://spreadsheets.google.com/feeds/cells/' + \n\t\t\t\t  googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') +\n\t\t\t\t\t  '/public/values?alt=json-in-script&callback=?',\n\t\t\t\t\t  function (json) {\n\t\t\t\t\t\n\t\t\t\t// Prepare the data from the spreadsheat\n\t\t\t\tvar cells = json.feed.entry,\n\t\t\t\t\tcell,\n\t\t\t\t\tcellCount = cells.length,\n\t\t\t\t\tcolCount = 0,\n\t\t\t\t\trowCount = 0,\n\t\t\t\t\ti;\n\t\t\t\n\t\t\t\t// First, find the total number of columns and rows that \n\t\t\t\t// are actually filled with data\n\t\t\t\tfor (i = 0; i < cellCount; i++) {\n\t\t\t\t\tcell = cells[i];\n\t\t\t\t\tcolCount = Math.max(colCount, cell.gs$cell.col);\n\t\t\t\t\trowCount = Math.max(rowCount, cell.gs$cell.row);\t\t\t\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// Set up arrays containing the column data\n\t\t\t\tfor (i = 0; i < colCount; i++) {\n\t\t\t\t\tif (i >= startColumn && i <= endColumn) {\n\t\t\t\t\t\t// Create new columns with the length of either end-start or rowCount\n\t\t\t\t\t\tcolumns[i - startColumn] = [];\n\n\t\t\t\t\t\t// Setting the length to avoid jslint warning\n\t\t\t\t\t\tcolumns[i - startColumn].length = Math.min(rowCount, endRow - startRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Loop over the cells and assign the value to the right\n\t\t\t\t// place in the column arrays\n\t\t\t\tfor (i = 0; i < cellCount; i++) {\n\t\t\t\t\tcell = cells[i];\n\t\t\t\t\tgr = cell.gs$cell.row - 1; // rows start at 1\n\t\t\t\t\tgc = cell.gs$cell.col - 1; // columns start at 1\n\n\t\t\t\t\t// If both row and col falls inside start and end\n\t\t\t\t\t// set the transposed cell value in the newly created columns\n\t\t\t\t\tif (gc >= startColumn && gc <= endColumn &&\n\t\t\t\t\t\tgr >= startRow && gr <= endRow) {\n\t\t\t\t\t\tcolumns[gc - startColumn][gr - startRow] = cell.content.$t;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tself.dataFound();\n\t\t\t});\n\t\t}\n\t},\n\t\n\t/**\n\t * Find the header row. For now, we just check whether the first row contains\n\t * numbers or strings. Later we could loop down and find the first row with \n\t * numbers.\n\t */\n\tfindHeaderRow: function () {\n\t\tvar headerRow = 0;\n\t\teach(this.columns, function (column) {\n\t\t\tif (typeof column[0] !== 'string') {\n\t\t\t\theaderRow = null;\n\t\t\t}\n\t\t});\n\t\tthis.headerRow = 0;\t\t\t\n\t},\n\t\n\t/**\n\t * Trim a string from whitespace\n\t */\n\ttrim: function (str) {\n\t\treturn typeof str === 'string' ? str.replace(/^\\s+|\\s+$/g, '') : str;\n\t},\n\t\n\t/**\n\t * Parse numeric cells in to number types and date types in to true dates.\n\t * @param {Object} columns\n\t */\n\tparseTypes: function () {\n\t\tvar columns = this.columns,\n\t\t\tcol = columns.length, \n\t\t\trow,\n\t\t\tval,\n\t\t\tfloatVal,\n\t\t\ttrimVal,\n\t\t\tdateVal;\n\t\t\t\n\t\twhile (col--) {\n\t\t\trow = columns[col].length;\n\t\t\twhile (row--) {\n\t\t\t\tval = columns[col][row];\n\t\t\t\tfloatVal = parseFloat(val);\n\t\t\t\ttrimVal = this.trim(val);\n\n\t\t\t\t/*jslint eqeq: true*/\n\t\t\t\tif (trimVal == floatVal) { // is numeric\n\t\t\t\t/*jslint eqeq: false*/\n\t\t\t\t\tcolumns[col][row] = floatVal;\n\t\t\t\t\t\n\t\t\t\t\t// If the number is greater than milliseconds in a year, assume datetime\n\t\t\t\t\tif (floatVal > 365 * 24 * 3600 * 1000) {\n\t\t\t\t\t\tcolumns[col].isDatetime = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcolumns[col].isNumeric = true;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t} else { // string, continue to determine if it is a date string or really a string\n\t\t\t\t\tdateVal = this.parseDate(val);\n\t\t\t\t\t\n\t\t\t\t\tif (col === 0 && typeof dateVal === 'number' && !isNaN(dateVal)) { // is date\n\t\t\t\t\t\tcolumns[col][row] = dateVal;\n\t\t\t\t\t\tcolumns[col].isDatetime = true;\n\t\t\t\t\t\n\t\t\t\t\t} else { // string\n\t\t\t\t\t\tcolumns[col][row] = trimVal === '' ? null : trimVal;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t},\n\t//*\n\tdateFormats: {\n\t\t'YYYY-mm-dd': {\n\t\t\tregex: '^([0-9]{4})-([0-9]{2})-([0-9]{2})$',\n\t\t\tparser: function (match) {\n\t\t\t\treturn Date.UTC(+match[1], match[2] - 1, +match[3]);\n\t\t\t}\n\t\t}\n\t},\n\t// */\n\t/**\n\t * Parse a date and return it as a number. Overridable through options.parseDate.\n\t */\n\tparseDate: function (val) {\n\t\tvar parseDate = this.options.parseDate,\n\t\t\tret,\n\t\t\tkey,\n\t\t\tformat,\n\t\t\tmatch;\n\n\t\tif (parseDate) {\n\t\t\tret = parseDate(val);\n\t\t}\n\t\t\t\n\t\tif (typeof val === 'string') {\n\t\t\tfor (key in this.dateFormats) {\n\t\t\t\tformat = this.dateFormats[key];\n\t\t\t\tmatch = val.match(format.regex);\n\t\t\t\tif (match) {\n\t\t\t\t\tret = format.parser(match);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t},\n\t\n\t/**\n\t * Reorganize rows into columns\n\t */\n\trowsToColumns: function (rows) {\n\t\tvar row,\n\t\t\trowsLength,\n\t\t\tcol,\n\t\t\tcolsLength,\n\t\t\tcolumns;\n\n\t\tif (rows) {\n\t\t\tcolumns = [];\n\t\t\trowsLength = rows.length;\n\t\t\tfor (row = 0; row < rowsLength; row++) {\n\t\t\t\tcolsLength = rows[row].length;\n\t\t\t\tfor (col = 0; col < colsLength; col++) {\n\t\t\t\t\tif (!columns[col]) {\n\t\t\t\t\t\tcolumns[col] = [];\n\t\t\t\t\t}\n\t\t\t\t\tcolumns[col][row] = rows[row][col];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn columns;\n\t},\n\t\n\t/**\n\t * A hook for working directly on the parsed columns\n\t */\n\tparsed: function () {\n\t\tif (this.options.parsed) {\n\t\t\tthis.options.parsed.call(this, this.columns);\n\t\t}\n\t},\n\t\n\t/**\n\t * If a complete callback function is provided in the options, interpret the \n\t * columns into a Highcharts options object.\n\t */\n\tcomplete: function () {\n\t\t\n\t\tvar columns = this.columns,\n\t\t\tfirstCol,\n\t\t\ttype,\n\t\t\toptions = this.options,\n\t\t\tvalueCount,\n\t\t\tseries,\n\t\t\tdata,\n\t\t\ti,\n\t\t\tj,\n\t\t\tseriesIndex;\n\t\t\t\n\t\t\n\t\tif (options.complete) {\n\n\t\t\tthis.getColumnDistribution();\n\t\t\t\n\t\t\t// Use first column for X data or categories?\n\t\t\tif (columns.length > 1) {\n\t\t\t\tfirstCol = columns.shift();\n\t\t\t\tif (this.headerRow === 0) {\n\t\t\t\t\tfirstCol.shift(); // remove the first cell\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tif (firstCol.isDatetime) {\n\t\t\t\t\ttype = 'datetime';\n\t\t\t\t} else if (!firstCol.isNumeric) {\n\t\t\t\t\ttype = 'category';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get the names and shift the top row\n\t\t\tfor (i = 0; i < columns.length; i++) {\n\t\t\t\tif (this.headerRow === 0) {\n\t\t\t\t\tcolumns[i].name = columns[i].shift();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Use the next columns for series\n\t\t\tseries = [];\n\t\t\tfor (i = 0, seriesIndex = 0; i < columns.length; seriesIndex++) {\n\n\t\t\t\t// This series' value count\n\t\t\t\tvalueCount = Highcharts.pick(this.valueCount.individual[seriesIndex], this.valueCount.global);\n\t\t\t\t\n\t\t\t\t// Iterate down the cells of each column and add data to the series\n\t\t\t\tdata = [];\n\t\t\t\tfor (j = 0; j < columns[i].length; j++) {\n\t\t\t\t\tdata[j] = [\n\t\t\t\t\t\tfirstCol[j], \n\t\t\t\t\t\tcolumns[i][j] !== undefined ? columns[i][j] : null\n\t\t\t\t\t];\n\t\t\t\t\tif (valueCount > 1) {\n\t\t\t\t\t\tdata[j].push(columns[i + 1][j] !== undefined ? columns[i + 1][j] : null);\n\t\t\t\t\t}\n\t\t\t\t\tif (valueCount > 2) {\n\t\t\t\t\t\tdata[j].push(columns[i + 2][j] !== undefined ? columns[i + 2][j] : null);\n\t\t\t\t\t}\n\t\t\t\t\tif (valueCount > 3) {\n\t\t\t\t\t\tdata[j].push(columns[i + 3][j] !== undefined ? columns[i + 3][j] : null);\n\t\t\t\t\t}\n\t\t\t\t\tif (valueCount > 4) {\n\t\t\t\t\t\tdata[j].push(columns[i + 4][j] !== undefined ? columns[i + 4][j] : null);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add the series\n\t\t\t\tseries[seriesIndex] = {\n\t\t\t\t\tname: columns[i].name,\n\t\t\t\t\tdata: data\n\t\t\t\t};\n\n\t\t\t\ti += valueCount;\n\t\t\t}\n\t\t\t\n\t\t\t// Do the callback\n\t\t\toptions.complete({\n\t\t\t\txAxis: {\n\t\t\t\t\ttype: type\n\t\t\t\t},\n\t\t\t\tseries: series\n\t\t\t});\n\t\t}\n\t}\n\t});\n\t\n\t// Register the Data prototype and data function on Highcharts\n\tHighcharts.Data = Data;\n\tHighcharts.data = function (options, chartOptions) {\n\t\treturn new Data(options, chartOptions);\n\t};\n\n\t// Extend Chart.init so that the Chart constructor accepts a new configuration\n\t// option group, data.\n\tHighcharts.wrap(Highcharts.Chart.prototype, 'init', function (proceed, userOptions, callback) {\n\t\tvar chart = this;\n\n\t\tif (userOptions && userOptions.data) {\n\t\t\tHighcharts.data(Highcharts.extend(userOptions.data, {\n\t\t\t\tcomplete: function (dataOptions) {\n\t\t\t\t\t\n\t\t\t\t\t// Merge series configs\n\t\t\t\t\tif (userOptions.series) {\n\t\t\t\t\t\teach(userOptions.series, function (series, i) {\n\t\t\t\t\t\t\tuserOptions.series[i] = Highcharts.merge(series, dataOptions.series[i]);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// Do the merge\n\t\t\t\t\tuserOptions = Highcharts.merge(dataOptions, userOptions);\n\n\t\t\t\t\tproceed.call(chart, userOptions, callback);\n\t\t\t\t}\n\t\t\t}), userOptions);\n\t\t} else {\n\t\t\tproceed.call(chart, userOptions, callback);\n\t\t}\n\t});\n\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/drilldown.js",
    "content": "(function(e){function q(b,a,c){return\"rgba(\"+[Math.round(b[0]+(a[0]-b[0])*c),Math.round(b[1]+(a[1]-b[1])*c),Math.round(b[2]+(a[2]-b[2])*c),b[3]+(a[3]-b[3])*c].join(\",\")+\")\"}var m=function(){},j=e.getOptions(),g=e.each,n=e.extend,o=e.wrap,h=e.Chart,i=e.seriesTypes,k=i.pie,l=i.column,r=HighchartsAdapter.fireEvent;n(j.lang,{drillUpText:\"◁ Back to {series.name}\"});j.drilldown={activeAxisLabelStyle:{cursor:\"pointer\",color:\"#039\",fontWeight:\"bold\",textDecoration:\"underline\"},activeDataLabelStyle:{cursor:\"pointer\",\ncolor:\"#039\",fontWeight:\"bold\",textDecoration:\"underline\"},animation:{duration:500},drillUpButton:{position:{align:\"right\",x:-10,y:10}}};e.SVGRenderer.prototype.Element.prototype.fadeIn=function(){this.attr({opacity:0.1,visibility:\"visible\"}).animate({opacity:1},{duration:250})};h.prototype.drilldownLevels=[];h.prototype.addSeriesAsDrilldown=function(b,a){var c=b.series,d=c.xAxis,f=c.yAxis,e;e=b.color||c.color;var g,a=n({color:e},a);g=HighchartsAdapter.inArray(this,c.points);this.drilldownLevels.push({seriesOptions:c.userOptions,\nshapeArgs:b.shapeArgs,bBox:b.graphic.getBBox(),color:e,newSeries:a,pointOptions:c.options.data[g],pointIndex:g,oldExtremes:{xMin:d&&d.userMin,xMax:d&&d.userMax,yMin:f&&f.userMin,yMax:f&&f.userMax}});e=this.addSeries(a,!1);if(d)d.oldPos=d.pos,d.userMin=d.userMax=null,f.userMin=f.userMax=null;if(c.type===e.type)e.animate=e.animateDrilldown||m,e.options.animation=!0;c.remove(!1);this.redraw();this.showDrillUpButton()};h.prototype.getDrilldownBackText=function(){return this.options.lang.drillUpText.replace(\"{series.name}\",\nthis.drilldownLevels[this.drilldownLevels.length-1].seriesOptions.name)};h.prototype.showDrillUpButton=function(){var b=this,a=this.getDrilldownBackText(),c=b.options.drilldown.drillUpButton;this.drillUpButton?this.drillUpButton.attr({text:a}).align():this.drillUpButton=this.renderer.button(a,null,null,function(){b.drillUp()}).attr(n({align:c.position.align,zIndex:9},c.theme)).add().align(c.position,!1,c.relativeTo||\"plotBox\")};h.prototype.drillUp=function(){var b=this.drilldownLevels.pop(),a=this.series[0],\nc=b.oldExtremes,d=this.addSeries(b.seriesOptions,!1);r(this,\"drillup\",{seriesOptions:b.seriesOptions});if(d.type===a.type)d.drilldownLevel=b,d.animate=d.animateDrillupTo||m,d.options.animation=!0,a.animateDrillupFrom&&a.animateDrillupFrom(b);a.remove(!1);d.xAxis&&(d.xAxis.setExtremes(c.xMin,c.xMax,!1),d.yAxis.setExtremes(c.yMin,c.yMax,!1));this.redraw();this.drilldownLevels.length===0?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align()};\nk.prototype.animateDrilldown=function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],c=this.chart.options.drilldown.animation,d=a.shapeArgs,f=d.start,s=(d.end-f)/this.points.length,h=e.Color(a.color).rgba;b||g(this.points,function(a,b){var g=e.Color(a.color).rgba;a.graphic.attr(e.merge(d,{start:f+b*s,end:f+(b+1)*s})).animate(a.shapeArgs,e.merge(c,{step:function(a,d){d.prop===\"start\"&&this.attr({fill:q(h,g,d.pos)})}}))})};k.prototype.animateDrillupTo=l.prototype.animateDrillupTo=\nfunction(b){if(!b){var a=this,c=a.drilldownLevel;g(this.points,function(a){a.graphic.hide();a.dataLabel&&a.dataLabel.hide();a.connector&&a.connector.hide()});setTimeout(function(){g(a.points,function(a,b){var e=b===c.pointIndex?\"show\":\"fadeIn\";a.graphic[e]();if(a.dataLabel)a.dataLabel[e]();if(a.connector)a.connector[e]()})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=m}};l.prototype.animateDrilldown=function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-\n1].shapeArgs,c=this.chart.options.drilldown.animation;b||(a.x+=this.xAxis.oldPos-this.xAxis.pos,g(this.points,function(b){b.graphic.attr(a).animate(b.shapeArgs,c)}))};l.prototype.animateDrillupFrom=k.prototype.animateDrillupFrom=function(b){var a=this.chart.options.drilldown.animation,c=this.group;delete this.group;g(this.points,function(d){var f=d.graphic,g=e.Color(d.color).rgba;delete d.graphic;f.animate(b.shapeArgs,e.merge(a,{step:function(a,c){c.prop===\"start\"&&this.attr({fill:q(g,e.Color(b.color).rgba,\nc.pos)})},complete:function(){f.destroy();c&&(c=c.destroy())}}))})};e.Point.prototype.doDrilldown=function(){for(var b=this.series.chart,a=b.options.drilldown,c=a.series.length,d;c--&&!d;)a.series[c].id===this.drilldown&&(d=a.series[c]);r(b,\"drilldown\",{point:this,seriesOptions:d});d&&b.addSeriesAsDrilldown(this,d)};o(e.Point.prototype,\"init\",function(b,a,c,d){var f=b.call(this,a,c,d),b=a.chart,a=(a=a.xAxis&&a.xAxis.ticks[d])&&a.label;if(f.drilldown){if(e.addEvent(f,\"click\",function(){f.doDrilldown()}),\na){if(!a._basicStyle)a._basicStyle=a.element.getAttribute(\"style\");a.addClass(\"highcharts-drilldown-axis-label\").css(b.options.drilldown.activeAxisLabelStyle).on(\"click\",function(){f.doDrilldown&&f.doDrilldown()})}}else a&&a._basicStyle&&a.element.setAttribute(\"style\",a._basicStyle);return f});o(e.Series.prototype,\"drawDataLabels\",function(b){var a=this.chart.options.drilldown.activeDataLabelStyle;b.call(this);g(this.points,function(b){if(b.drilldown&&b.dataLabel)b.dataLabel.attr({\"class\":\"highcharts-drilldown-data-label\"}).css(a).on(\"click\",\nfunction(){b.doDrilldown()})})});l.prototype.supportsDrilldown=!0;k.prototype.supportsDrilldown=!0;var p,j=function(b){b.call(this);g(this.points,function(a){a.drilldown&&a.graphic&&a.graphic.attr({\"class\":\"highcharts-drilldown-point\"}).css({cursor:\"pointer\"})})};for(p in i)i[p].prototype.supportsDrilldown&&o(i[p].prototype,\"drawTracker\",j)})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/drilldown.src.js",
    "content": "/**\n * Highcharts Drilldown plugin\n * \n * Author: Torstein Honsi\n * Last revision: 2013-02-18\n * License: MIT License\n *\n * Demo: http://jsfiddle.net/highcharts/Vf3yT/\n */\n\n/*global HighchartsAdapter*/\n(function (H) {\n\n\t\"use strict\";\n\n\tvar noop = function () {},\n\t\tdefaultOptions = H.getOptions(),\n\t\teach = H.each,\n\t\textend = H.extend,\n\t\twrap = H.wrap,\n\t\tChart = H.Chart,\n\t\tseriesTypes = H.seriesTypes,\n\t\tPieSeries = seriesTypes.pie,\n\t\tColumnSeries = seriesTypes.column,\n\t\tfireEvent = HighchartsAdapter.fireEvent;\n\n\t// Utilities\n\tfunction tweenColors(startColor, endColor, pos) {\n\t\tvar rgba = [\n\t\t\t\tMath.round(startColor[0] + (endColor[0] - startColor[0]) * pos),\n\t\t\t\tMath.round(startColor[1] + (endColor[1] - startColor[1]) * pos),\n\t\t\t\tMath.round(startColor[2] + (endColor[2] - startColor[2]) * pos),\n\t\t\t\tstartColor[3] + (endColor[3] - startColor[3]) * pos\n\t\t\t];\n\t\treturn 'rgba(' + rgba.join(',') + ')';\n\t}\n\n\t// Add language\n\textend(defaultOptions.lang, {\n\t\tdrillUpText: '◁ Back to {series.name}'\n\t});\n\tdefaultOptions.drilldown = {\n\t\tactiveAxisLabelStyle: {\n\t\t\tcursor: 'pointer',\n\t\t\tcolor: '#039',\n\t\t\tfontWeight: 'bold',\n\t\t\ttextDecoration: 'underline'\t\t\t\n\t\t},\n\t\tactiveDataLabelStyle: {\n\t\t\tcursor: 'pointer',\n\t\t\tcolor: '#039',\n\t\t\tfontWeight: 'bold',\n\t\t\ttextDecoration: 'underline'\t\t\t\n\t\t},\n\t\tanimation: {\n\t\t\tduration: 500\n\t\t},\n\t\tdrillUpButton: {\n\t\t\tposition: { \n\t\t\t\talign: 'right',\n\t\t\t\tx: -10,\n\t\t\t\ty: 10\n\t\t\t}\n\t\t\t// relativeTo: 'plotBox'\n\t\t\t// theme\n\t\t}\n\t};\t\n\n\t/**\n\t * A general fadeIn method\n\t */\n\tH.SVGRenderer.prototype.Element.prototype.fadeIn = function () {\n\t\tthis\n\t\t.attr({\n\t\t\topacity: 0.1,\n\t\t\tvisibility: 'visible'\n\t\t})\n\t\t.animate({\n\t\t\topacity: 1\n\t\t}, {\n\t\t\tduration: 250\n\t\t});\n\t};\n\n\t// Extend the Chart prototype\n\tChart.prototype.drilldownLevels = [];\n\n\tChart.prototype.addSeriesAsDrilldown = function (point, ddOptions) {\n\t\tvar oldSeries = point.series,\n\t\t\txAxis = oldSeries.xAxis,\n\t\t\tyAxis = oldSeries.yAxis,\n\t\t\tnewSeries,\n\t\t\tcolor = point.color || oldSeries.color,\n\t\t\tpointIndex,\n\t\t\tlevel;\n\t\t\t\n\t\tddOptions = extend({\n\t\t\tcolor: color\n\t\t}, ddOptions);\n\t\tpointIndex = HighchartsAdapter.inArray(this, oldSeries.points);\n\t\tlevel = {\n\t\t\tseriesOptions: oldSeries.userOptions,\n\t\t\tshapeArgs: point.shapeArgs,\n\t\t\tbBox: point.graphic.getBBox(),\n\t\t\tcolor: color,\n\t\t\tnewSeries: ddOptions,\n\t\t\tpointOptions: oldSeries.options.data[pointIndex],\n\t\t\tpointIndex: pointIndex,\n\t\t\toldExtremes: {\n\t\t\t\txMin: xAxis && xAxis.userMin,\n\t\t\t\txMax: xAxis && xAxis.userMax,\n\t\t\t\tyMin: yAxis && yAxis.userMin,\n\t\t\t\tyMax: yAxis && yAxis.userMax\n\t\t\t}\n\t\t};\n\n\t\tthis.drilldownLevels.push(level);\n\n\t\tnewSeries = this.addSeries(ddOptions, false);\n\t\tif (xAxis) {\n\t\t\txAxis.oldPos = xAxis.pos;\n\t\t\txAxis.userMin = xAxis.userMax = null;\n\t\t\tyAxis.userMin = yAxis.userMax = null;\n\t\t}\n\n\t\t// Run fancy cross-animation on supported and equal types\n\t\tif (oldSeries.type === newSeries.type) {\n\t\t\tnewSeries.animate = newSeries.animateDrilldown || noop;\n\t\t\tnewSeries.options.animation = true;\n\t\t}\n\t\t\n\t\toldSeries.remove(false);\n\t\t\n\t\tthis.redraw();\n\t\tthis.showDrillUpButton();\n\t};\n\n\tChart.prototype.getDrilldownBackText = function () {\n\t\tvar lastLevel = this.drilldownLevels[this.drilldownLevels.length - 1];\n\n\t\treturn this.options.lang.drillUpText.replace('{series.name}', lastLevel.seriesOptions.name);\n\n\t};\n\n\tChart.prototype.showDrillUpButton = function () {\n\t\tvar chart = this,\n\t\t\tbackText = this.getDrilldownBackText(),\n\t\t\tbuttonOptions = chart.options.drilldown.drillUpButton;\n\t\t\t\n\n\t\tif (!this.drillUpButton) {\n\t\t\tthis.drillUpButton = this.renderer.button(\n\t\t\t\tbackText,\n\t\t\t\tnull,\n\t\t\t\tnull,\n\t\t\t\tfunction () {\n\t\t\t\t\tchart.drillUp(); \n\t\t\t\t}\n\t\t\t)\n\t\t\t.attr(extend({\n\t\t\t\talign: buttonOptions.position.align,\n\t\t\t\tzIndex: 9\n\t\t\t}, buttonOptions.theme))\n\t\t\t.add()\n\t\t\t.align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');\n\t\t} else {\n\t\t\tthis.drillUpButton.attr({\n\t\t\t\ttext: backText\n\t\t\t})\n\t\t\t.align();\n\t\t}\n\t};\n\n\tChart.prototype.drillUp = function () {\n\t\tvar chart = this,\n\t\t\tlevel = chart.drilldownLevels.pop(),\n\t\t\toldSeries = chart.series[0],\n\t\t\toldExtremes = level.oldExtremes,\n\t\t\tnewSeries = chart.addSeries(level.seriesOptions, false);\n\t\t\n\t\tfireEvent(chart, 'drillup', { seriesOptions: level.seriesOptions });\n\n\t\tif (newSeries.type === oldSeries.type) {\n\t\t\tnewSeries.drilldownLevel = level;\n\t\t\tnewSeries.animate = newSeries.animateDrillupTo || noop;\n\t\t\tnewSeries.options.animation = true;\n\n\t\t\tif (oldSeries.animateDrillupFrom) {\n\t\t\t\toldSeries.animateDrillupFrom(level);\n\t\t\t}\n\t\t}\n\n\t\toldSeries.remove(false);\n\n\t\t// Reset the zoom level of the upper series\n\t\tif (newSeries.xAxis) {\n\t\t\tnewSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false);\n\t\t\tnewSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false);\n\t\t}\n\n\n\t\tthis.redraw();\n\n\t\tif (this.drilldownLevels.length === 0) {\n\t\t\tthis.drillUpButton = this.drillUpButton.destroy();\n\t\t} else {\n\t\t\tthis.drillUpButton.attr({\n\t\t\t\ttext: this.getDrilldownBackText()\n\t\t\t})\n\t\t\t.align();\n\t\t}\n\t};\n\n\tPieSeries.prototype.animateDrilldown = function (init) {\n\t\tvar level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],\n\t\t\tanimationOptions = this.chart.options.drilldown.animation,\n\t\t\tanimateFrom = level.shapeArgs,\n\t\t\tstart = animateFrom.start,\n\t\t\tangle = animateFrom.end - start,\n\t\t\tstartAngle = angle / this.points.length,\n\t\t\tstartColor = H.Color(level.color).rgba;\n\n\t\tif (!init) {\n\t\t\teach(this.points, function (point, i) {\n\t\t\t\tvar endColor = H.Color(point.color).rgba;\n\n\t\t\t\t/*jslint unparam: true*/\n\t\t\t\tpoint.graphic\n\t\t\t\t\t.attr(H.merge(animateFrom, {\n\t\t\t\t\t\tstart: start + i * startAngle,\n\t\t\t\t\t\tend: start + (i + 1) * startAngle\n\t\t\t\t\t}))\n\t\t\t\t\t.animate(point.shapeArgs, H.merge(animationOptions, {\n\t\t\t\t\t\tstep: function (val, fx) {\n\t\t\t\t\t\t\tif (fx.prop === 'start') {\n\t\t\t\t\t\t\t\tthis.attr({\n\t\t\t\t\t\t\t\t\tfill: tweenColors(startColor, endColor, fx.pos)\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t/*jslint unparam: false*/\n\t\t\t});\n\t\t}\n\t};\n\n\n\t/**\n\t * When drilling up, keep the upper series invisible until the lower series has\n\t * moved into place\n\t */\n\tPieSeries.prototype.animateDrillupTo = \n\t\t\tColumnSeries.prototype.animateDrillupTo = function (init) {\n\t\tif (!init) {\n\t\t\tvar newSeries = this,\n\t\t\t\tlevel = newSeries.drilldownLevel;\n\n\t\t\teach(this.points, function (point) {\n\t\t\t\tpoint.graphic.hide();\n\t\t\t\tif (point.dataLabel) {\n\t\t\t\t\tpoint.dataLabel.hide();\n\t\t\t\t}\n\t\t\t\tif (point.connector) {\n\t\t\t\t\tpoint.connector.hide();\n\t\t\t\t}\n\t\t\t});\n\n\n\t\t\t// Do dummy animation on first point to get to complete\n\t\t\tsetTimeout(function () {\n\t\t\t\teach(newSeries.points, function (point, i) {  \n\t\t\t\t\t// Fade in other points\t\t\t  \n\t\t\t\t\tvar verb = i === level.pointIndex ? 'show' : 'fadeIn';\n\t\t\t\t\tpoint.graphic[verb]();\n\t\t\t\t\tif (point.dataLabel) {\n\t\t\t\t\t\tpoint.dataLabel[verb]();\n\t\t\t\t\t}\n\t\t\t\t\tif (point.connector) {\n\t\t\t\t\t\tpoint.connector[verb]();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, Math.max(this.chart.options.drilldown.animation.duration - 50, 0));\n\n\t\t\t// Reset\n\t\t\tthis.animate = noop;\n\t\t}\n\n\t};\n\t\n\tColumnSeries.prototype.animateDrilldown = function (init) {\n\t\tvar animateFrom = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1].shapeArgs,\n\t\t\tanimationOptions = this.chart.options.drilldown.animation;\n\t\t\t\n\t\tif (!init) {\n\n\t\t\tanimateFrom.x += (this.xAxis.oldPos - this.xAxis.pos);\n\t\n\t\t\teach(this.points, function (point) {\n\t\t\t\tpoint.graphic\n\t\t\t\t\t.attr(animateFrom)\n\t\t\t\t\t.animate(point.shapeArgs, animationOptions);\n\t\t\t});\n\t\t}\n\t\t\n\t};\n\n\t/**\n\t * When drilling up, pull out the individual point graphics from the lower series\n\t * and animate them into the origin point in the upper series.\n\t */\n\tColumnSeries.prototype.animateDrillupFrom = \n\t\tPieSeries.prototype.animateDrillupFrom =\n\tfunction (level) {\n\t\tvar animationOptions = this.chart.options.drilldown.animation,\n\t\t\tgroup = this.group;\n\n\t\tdelete this.group;\n\t\teach(this.points, function (point) {\n\t\t\tvar graphic = point.graphic,\n\t\t\t\tstartColor = H.Color(point.color).rgba;\n\n\t\t\tdelete point.graphic;\n\n\t\t\t/*jslint unparam: true*/\n\t\t\tgraphic.animate(level.shapeArgs, H.merge(animationOptions, {\n\n\t\t\t\tstep: function (val, fx) {\n\t\t\t\t\tif (fx.prop === 'start') {\n\t\t\t\t\t\tthis.attr({\n\t\t\t\t\t\t\tfill: tweenColors(startColor, H.Color(level.color).rgba, fx.pos)\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomplete: function () {\n\t\t\t\t\tgraphic.destroy();\n\t\t\t\t\tif (group) {\n\t\t\t\t\t\tgroup = group.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\t\t\t/*jslint unparam: false*/\n\t\t});\n\t};\n\t\n\tH.Point.prototype.doDrilldown = function () {\n\t\tvar series = this.series,\n\t\t\tchart = series.chart,\n\t\t\tdrilldown = chart.options.drilldown,\n\t\t\ti = drilldown.series.length,\n\t\t\tseriesOptions;\n\t\t\n\t\twhile (i-- && !seriesOptions) {\n\t\t\tif (drilldown.series[i].id === this.drilldown) {\n\t\t\t\tseriesOptions = drilldown.series[i];\n\t\t\t}\n\t\t}\n\n\t\t// Fire the event. If seriesOptions is undefined, the implementer can check for \n\t\t// seriesOptions, and call addSeriesAsDrilldown async if necessary.\n\t\tfireEvent(chart, 'drilldown', { \n\t\t\tpoint: this,\n\t\t\tseriesOptions: seriesOptions\n\t\t});\n\t\t\n\t\tif (seriesOptions) {\n\t\t\tchart.addSeriesAsDrilldown(this, seriesOptions);\n\t\t}\n\n\t};\n\t\n\twrap(H.Point.prototype, 'init', function (proceed, series, options, x) {\n\t\tvar point = proceed.call(this, series, options, x),\n\t\t\tchart = series.chart,\n\t\t\ttick = series.xAxis && series.xAxis.ticks[x],\n\t\t\ttickLabel = tick && tick.label;\n\t\t\n\t\tif (point.drilldown) {\n\t\t\t\n\t\t\t// Add the click event to the point label\n\t\t\tH.addEvent(point, 'click', function () {\n\t\t\t\tpoint.doDrilldown();\n\t\t\t});\n\t\t\t\n\t\t\t// Make axis labels clickable\n\t\t\tif (tickLabel) {\n\t\t\t\tif (!tickLabel._basicStyle) {\n\t\t\t\t\ttickLabel._basicStyle = tickLabel.element.getAttribute('style');\n\t\t\t\t}\n\t\t\t\ttickLabel\n\t\t\t\t\t.addClass('highcharts-drilldown-axis-label')\n\t\t\t\t\t.css(chart.options.drilldown.activeAxisLabelStyle)\n\t\t\t\t\t.on('click', function () {\n\t\t\t\t\t\tif (point.doDrilldown) {\n\t\t\t\t\t\t\tpoint.doDrilldown();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t}\n\t\t} else if (tickLabel && tickLabel._basicStyle) {\n\t\t\ttickLabel.element.setAttribute('style', tickLabel._basicStyle);\n\t\t}\n\t\t\n\t\treturn point;\n\t});\n\n\twrap(H.Series.prototype, 'drawDataLabels', function (proceed) {\n\t\tvar css = this.chart.options.drilldown.activeDataLabelStyle;\n\n\t\tproceed.call(this);\n\n\t\teach(this.points, function (point) {\n\t\t\tif (point.drilldown && point.dataLabel) {\n\t\t\t\tpoint.dataLabel\n\t\t\t\t\t.attr({\n\t\t\t\t\t\t'class': 'highcharts-drilldown-data-label'\n\t\t\t\t\t})\n\t\t\t\t\t.css(css)\n\t\t\t\t\t.on('click', function () {\n\t\t\t\t\t\tpoint.doDrilldown();\n\t\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\t// Mark the trackers with a pointer \n\tColumnSeries.prototype.supportsDrilldown = true;\n\tPieSeries.prototype.supportsDrilldown = true;\n\tvar type, \n\t\tdrawTrackerWrapper = function (proceed) {\n\t\t\tproceed.call(this);\n\t\t\teach(this.points, function (point) {\n\t\t\t\tif (point.drilldown && point.graphic) {\n\t\t\t\t\tpoint.graphic\n\t\t\t\t\t\t.attr({\n\t\t\t\t\t\t\t'class': 'highcharts-drilldown-point'\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.css({ cursor: 'pointer' });\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\tfor (type in seriesTypes) {\n\t\tif (seriesTypes[type].prototype.supportsDrilldown) {\n\t\t\twrap(seriesTypes[type].prototype, 'drawTracker', drawTrackerWrapper);\n\t\t}\n\t}\n\t\t\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/exporting.js",
    "content": "/*\n Highcharts JS v3.0.6 (2013-10-04)\n Exporting module\n\n (c) 2010-2013 Torstein Hønsi\n\n License: www.highcharts.com/license\n*/\n(function(f){var A=f.Chart,t=f.addEvent,C=f.removeEvent,k=f.createElement,n=f.discardElement,u=f.css,o=f.merge,r=f.each,p=f.extend,D=Math.max,j=document,B=window,E=f.isTouchDevice,F=f.Renderer.prototype.symbols,x=f.getOptions(),y;p(x.lang,{printChart:\"Print chart\",downloadPNG:\"Download PNG image\",downloadJPEG:\"Download JPEG image\",downloadPDF:\"Download PDF document\",downloadSVG:\"Download SVG vector image\",contextButtonTitle:\"Chart context menu\"});x.navigation={menuStyle:{border:\"1px solid #A0A0A0\",\nbackground:\"#FFFFFF\",padding:\"5px 0\"},menuItemStyle:{padding:\"0 10px\",background:\"none\",color:\"#303030\",fontSize:E?\"14px\":\"11px\"},menuItemHoverStyle:{background:\"#4572A5\",color:\"#FFFFFF\"},buttonOptions:{symbolFill:\"#E0E0E0\",symbolSize:14,symbolStroke:\"#666\",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:\"right\",buttonSpacing:3,height:22,theme:{fill:\"white\",stroke:\"none\"},verticalAlign:\"top\",width:24}};x.exporting={type:\"image/png\",url:\"http://export.highcharts.com/\",buttons:{contextButton:{menuClassName:\"highcharts-contextmenu\",\nsymbol:\"menu\",_titleKey:\"contextButtonTitle\",menuItems:[{textKey:\"printChart\",onclick:function(){this.print()}},{separator:!0},{textKey:\"downloadPNG\",onclick:function(){this.exportChart()}},{textKey:\"downloadJPEG\",onclick:function(){this.exportChart({type:\"image/jpeg\"})}},{textKey:\"downloadPDF\",onclick:function(){this.exportChart({type:\"application/pdf\"})}},{textKey:\"downloadSVG\",onclick:function(){this.exportChart({type:\"image/svg+xml\"})}}]}}};f.post=function(c,a){var d,b;b=k(\"form\",{method:\"post\",\naction:c,enctype:\"multipart/form-data\"},{display:\"none\"},j.body);for(d in a)k(\"input\",{type:\"hidden\",name:d,value:a[d]},null,b);b.submit();n(b)};p(A.prototype,{getSVG:function(c){var a=this,d,b,z,h,g=o(a.options,c);if(!j.createElementNS)j.createElementNS=function(a,b){return j.createElement(b)};c=k(\"div\",null,{position:\"absolute\",top:\"-9999em\",width:a.chartWidth+\"px\",height:a.chartHeight+\"px\"},j.body);b=a.renderTo.style.width;h=a.renderTo.style.height;b=g.exporting.sourceWidth||g.chart.width||/px$/.test(b)&&\nparseInt(b,10)||600;h=g.exporting.sourceHeight||g.chart.height||/px$/.test(h)&&parseInt(h,10)||400;p(g.chart,{animation:!1,renderTo:c,forExport:!0,width:b,height:h});g.exporting.enabled=!1;g.series=[];r(a.series,function(a){z=o(a.options,{animation:!1,showCheckbox:!1,visible:a.visible});z.isInternal||g.series.push(z)});d=new f.Chart(g,a.callback);r([\"xAxis\",\"yAxis\"],function(b){r(a[b],function(a,c){var g=d[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;g&&(h!==void 0||f!==void 0)&&g.setExtremes(h,\nf,!0,!1)})});b=d.container.innerHTML;g=null;d.destroy();n(c);b=b.replace(/zIndex=\"[^\"]+\"/g,\"\").replace(/isShadow=\"[^\"]+\"/g,\"\").replace(/symbolName=\"[^\"]+\"/g,\"\").replace(/jQuery[0-9]+=\"[^\"]+\"/g,\"\").replace(/url\\([^#]+#/g,\"url(#\").replace(/<svg /,'<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" ').replace(/ href=/g,\" xlink:href=\").replace(/\\n/,\" \").replace(/<\\/svg>.*?$/,\"</svg>\").replace(/&nbsp;/g,\" \").replace(/&shy;/g,\"­\").replace(/<IMG /g,\"<image \").replace(/height=([^\" ]+)/g,'height=\"$1\"').replace(/width=([^\" ]+)/g,\n'width=\"$1\"').replace(/hc-svg-href=\"([^\"]+)\">/g,'xlink:href=\"$1\"/>').replace(/id=([^\" >]+)/g,'id=\"$1\"').replace(/class=([^\" >]+)/g,'class=\"$1\"').replace(/ transform /g,\" \").replace(/:(path|rect)/g,\"$1\").replace(/style=\"([^\"]+)\"/g,function(a){return a.toLowerCase()});return b=b.replace(/(url\\(#highcharts-[0-9]+)&quot;/g,\"$1\").replace(/&quot;/g,\"'\")},exportChart:function(c,a){var c=c||{},d=this.options.exporting,d=this.getSVG(o({chart:{borderRadius:0}},d.chartOptions,a,{exporting:{sourceWidth:c.sourceWidth||\nd.sourceWidth,sourceHeight:c.sourceHeight||d.sourceHeight}})),c=o(this.options.exporting,c);f.post(c.url,{filename:c.filename||\"chart\",type:c.type,width:c.width||0,scale:c.scale||2,svg:d})},print:function(){var c=this,a=c.container,d=[],b=a.parentNode,f=j.body,h=f.childNodes;if(!c.isPrinting)c.isPrinting=!0,r(h,function(a,b){if(a.nodeType===1)d[b]=a.style.display,a.style.display=\"none\"}),f.appendChild(a),B.focus(),B.print(),setTimeout(function(){b.appendChild(a);r(h,function(a,b){if(a.nodeType===\n1)a.style.display=d[b]});c.isPrinting=!1},1E3)},contextMenu:function(c,a,d,b,f,h,g){var e=this,j=e.options.navigation,q=j.menuItemStyle,l=e.chartWidth,m=e.chartHeight,o=\"cache-\"+c,i=e[o],s=D(f,h),v,w,n;if(!i)e[o]=i=k(\"div\",{className:c},{position:\"absolute\",zIndex:1E3,padding:s+\"px\"},e.container),v=k(\"div\",null,p({MozBoxShadow:\"3px 3px 10px #888\",WebkitBoxShadow:\"3px 3px 10px #888\",boxShadow:\"3px 3px 10px #888\"},j.menuStyle),i),w=function(){u(i,{display:\"none\"});g&&g.setState(0);e.openMenu=!1},t(i,\n\"mouseleave\",function(){n=setTimeout(w,500)}),t(i,\"mouseenter\",function(){clearTimeout(n)}),t(document,\"mousedown\",function(a){e.pointer.inClass(a.target,c)||w()}),r(a,function(a){if(a){var b=a.separator?k(\"hr\",null,null,v):k(\"div\",{onmouseover:function(){u(this,j.menuItemHoverStyle)},onmouseout:function(){u(this,q)},onclick:function(){w();a.onclick.apply(e,arguments)},innerHTML:a.text||e.options.lang[a.textKey]},p({cursor:\"pointer\"},q),v);e.exportDivElements.push(b)}}),e.exportDivElements.push(v,\ni),e.exportMenuWidth=i.offsetWidth,e.exportMenuHeight=i.offsetHeight;a={display:\"block\"};d+e.exportMenuWidth>l?a.right=l-d-f-s+\"px\":a.left=d-s+\"px\";b+h+e.exportMenuHeight>m&&g.alignOptions.verticalAlign!==\"top\"?a.bottom=m-b-s+\"px\":a.top=b+h-s+\"px\";u(i,a);e.openMenu=!0},addButton:function(c){var a=this,d=a.renderer,b=o(a.options.navigation.buttonOptions,c),j=b.onclick,h=b.menuItems,g,e,k={stroke:b.symbolStroke,fill:b.symbolFill},q=b.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements=\n[],a.exportSVGElements=[];if(b.enabled!==!1){var l=b.theme,m=l.states,n=m&&m.hover,m=m&&m.select,i;delete l.states;j?i=function(){j.apply(a,arguments)}:h&&(i=function(){a.contextMenu(e.menuClassName,h,e.translateX,e.translateY,e.width,e.height,e);e.setState(2)});b.text&&b.symbol?l.paddingLeft=f.pick(l.paddingLeft,25):b.text||p(l,{width:b.width,height:b.height,padding:0});e=d.button(b.text,0,0,i,l,n,m).attr({title:a.options.lang[b._titleKey],\"stroke-linecap\":\"round\"});e.menuClassName=c.menuClassName||\n\"highcharts-menu-\"+a.btnCount++;b.symbol&&(g=d.symbol(b.symbol,b.symbolX-q/2,b.symbolY-q/2,q,q).attr(p(k,{\"stroke-width\":b.symbolStrokeWidth||1,zIndex:1})).add(e));e.add().align(p(b,{width:e.width,x:f.pick(b.x,y)}),!0,\"spacingBox\");y+=(e.width+b.buttonSpacing)*(b.align===\"right\"?-1:1);a.exportSVGElements.push(e,g)}},destroyExport:function(c){var c=c.target,a,d;for(a=0;a<c.exportSVGElements.length;a++)if(d=c.exportSVGElements[a])d.onclick=d.ontouchstart=null,c.exportSVGElements[a]=d.destroy();for(a=\n0;a<c.exportDivElements.length;a++)d=c.exportDivElements[a],C(d,\"mouseleave\"),c.exportDivElements[a]=d.onmouseout=d.onmouseover=d.ontouchstart=d.onclick=null,n(d)}});F.menu=function(c,a,d,b){return[\"M\",c,a+2.5,\"L\",c+d,a+2.5,\"M\",c,a+b/2+0.5,\"L\",c+d,a+b/2+0.5,\"M\",c,a+b-1.5,\"L\",c+d,a+b-1.5]};A.prototype.callbacks.push(function(c){var a,d=c.options.exporting,b=d.buttons;y=0;if(d.enabled!==!1){for(a in b)c.addButton(b[a]);t(c,\"destroy\",c.destroyExport)}})})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/exporting.src.js",
    "content": "/**\n * @license Highcharts JS v3.0.6 (2013-10-04)\n * Exporting module\n *\n * (c) 2010-2013 Torstein Hønsi\n *\n * License: www.highcharts.com/license\n */\n\n// JSLint options:\n/*global Highcharts, document, window, Math, setTimeout */\n\n(function (Highcharts) { // encapsulate\n\n// create shortcuts\nvar Chart = Highcharts.Chart,\n\taddEvent = Highcharts.addEvent,\n\tremoveEvent = Highcharts.removeEvent,\n\tcreateElement = Highcharts.createElement,\n\tdiscardElement = Highcharts.discardElement,\n\tcss = Highcharts.css,\n\tmerge = Highcharts.merge,\n\teach = Highcharts.each,\n\textend = Highcharts.extend,\n\tmath = Math,\n\tmathMax = math.max,\n\tdoc = document,\n\twin = window,\n\tisTouchDevice = Highcharts.isTouchDevice,\n\tM = 'M',\n\tL = 'L',\n\tDIV = 'div',\n\tHIDDEN = 'hidden',\n\tNONE = 'none',\n\tPREFIX = 'highcharts-',\n\tABSOLUTE = 'absolute',\n\tPX = 'px',\n\tUNDEFINED,\n\tsymbols = Highcharts.Renderer.prototype.symbols,\n\tdefaultOptions = Highcharts.getOptions(),\n\tbuttonOffset;\n\n\t// Add language\n\textend(defaultOptions.lang, {\n\t\tprintChart: 'Print chart',\n\t\tdownloadPNG: 'Download PNG image',\n\t\tdownloadJPEG: 'Download JPEG image',\n\t\tdownloadPDF: 'Download PDF document',\n\t\tdownloadSVG: 'Download SVG vector image',\n\t\tcontextButtonTitle: 'Chart context menu'\n\t});\n\n// Buttons and menus are collected in a separate config option set called 'navigation'.\n// This can be extended later to add control buttons like zoom and pan right click menus.\ndefaultOptions.navigation = {\n\tmenuStyle: {\n\t\tborder: '1px solid #A0A0A0',\n\t\tbackground: '#FFFFFF',\n\t\tpadding: '5px 0'\n\t},\n\tmenuItemStyle: {\n\t\tpadding: '0 10px',\n\t\tbackground: NONE,\n\t\tcolor: '#303030',\n\t\tfontSize: isTouchDevice ? '14px' : '11px'\n\t},\n\tmenuItemHoverStyle: {\n\t\tbackground: '#4572A5',\n\t\tcolor: '#FFFFFF'\n\t},\n\n\tbuttonOptions: {\n\t\tsymbolFill: '#E0E0E0',\n\t\tsymbolSize: 14,\n\t\tsymbolStroke: '#666',\n\t\tsymbolStrokeWidth: 3,\n\t\tsymbolX: 12.5,\n\t\tsymbolY: 10.5,\n\t\talign: 'right',\n\t\tbuttonSpacing: 3, \n\t\theight: 22,\n\t\t// text: null,\n\t\ttheme: {\n\t\t\tfill: 'white', // capture hover\n\t\t\tstroke: 'none'\n\t\t},\n\t\tverticalAlign: 'top',\n\t\twidth: 24\n\t}\n};\n\n\n\n// Add the export related options\ndefaultOptions.exporting = {\n\t//enabled: true,\n\t//filename: 'chart',\n\ttype: 'image/png',\n\turl: 'http://export.highcharts.com/',\n\t//width: undefined,\n\t//scale: 2\n\tbuttons: {\n\t\tcontextButton: {\n\t\t\tmenuClassName: PREFIX + 'contextmenu',\n\t\t\t//x: -10,\n\t\t\tsymbol: 'menu',\n\t\t\t_titleKey: 'contextButtonTitle',\n\t\t\tmenuItems: [{\n\t\t\t\ttextKey: 'printChart',\n\t\t\t\tonclick: function () {\n\t\t\t\t\tthis.print();\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\tseparator: true\n\t\t\t}, {\n\t\t\t\ttextKey: 'downloadPNG',\n\t\t\t\tonclick: function () {\n\t\t\t\t\tthis.exportChart();\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\ttextKey: 'downloadJPEG',\n\t\t\t\tonclick: function () {\n\t\t\t\t\tthis.exportChart({\n\t\t\t\t\t\ttype: 'image/jpeg'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\ttextKey: 'downloadPDF',\n\t\t\t\tonclick: function () {\n\t\t\t\t\tthis.exportChart({\n\t\t\t\t\t\ttype: 'application/pdf'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, {\n\t\t\t\ttextKey: 'downloadSVG',\n\t\t\t\tonclick: function () {\n\t\t\t\t\tthis.exportChart({\n\t\t\t\t\t\ttype: 'image/svg+xml'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Enable this block to add \"View SVG\" to the dropdown menu\n\t\t\t/*\n\t\t\t,{\n\n\t\t\t\ttext: 'View SVG',\n\t\t\t\tonclick: function () {\n\t\t\t\t\tvar svg = this.getSVG()\n\t\t\t\t\t\t.replace(/</g, '\\n&lt;')\n\t\t\t\t\t\t.replace(/>/g, '&gt;');\n\n\t\t\t\t\tdoc.body.innerHTML = '<pre>' + svg + '</pre>';\n\t\t\t\t}\n\t\t\t} // */\n\t\t\t]\n\t\t}\n\t}\n};\n\n// Add the Highcharts.post utility\nHighcharts.post = function (url, data) {\n\tvar name,\n\t\tform;\n\t\n\t// create the form\n\tform = createElement('form', {\n\t\tmethod: 'post',\n\t\taction: url,\n\t\tenctype: 'multipart/form-data'\n\t}, {\n\t\tdisplay: NONE\n\t}, doc.body);\n\n\t// add the data\n\tfor (name in data) {\n\t\tcreateElement('input', {\n\t\t\ttype: HIDDEN,\n\t\t\tname: name,\n\t\t\tvalue: data[name]\n\t\t}, null, form);\n\t}\n\n\t// submit\n\tform.submit();\n\n\t// clean up\n\tdiscardElement(form);\n};\n\nextend(Chart.prototype, {\n\n\t/**\n\t * Return an SVG representation of the chart\n\t *\n\t * @param additionalOptions {Object} Additional chart options for the generated SVG representation\n\t */\n\tgetSVG: function (additionalOptions) {\n\t\tvar chart = this,\n\t\t\tchartCopy,\n\t\t\tsandbox,\n\t\t\tsvg,\n\t\t\tseriesOptions,\n\t\t\tsourceWidth,\n\t\t\tsourceHeight,\n\t\t\tcssWidth,\n\t\t\tcssHeight,\n\t\t\toptions = merge(chart.options, additionalOptions); // copy the options and add extra options\n\n\t\t// IE compatibility hack for generating SVG content that it doesn't really understand\n\t\tif (!doc.createElementNS) {\n\t\t\t/*jslint unparam: true*//* allow unused parameter ns in function below */\n\t\t\tdoc.createElementNS = function (ns, tagName) {\n\t\t\t\treturn doc.createElement(tagName);\n\t\t\t};\n\t\t\t/*jslint unparam: false*/\n\t\t}\n\n\t\t// create a sandbox where a new chart will be generated\n\t\tsandbox = createElement(DIV, null, {\n\t\t\tposition: ABSOLUTE,\n\t\t\ttop: '-9999em',\n\t\t\twidth: chart.chartWidth + PX,\n\t\t\theight: chart.chartHeight + PX\n\t\t}, doc.body);\n\t\t\n\t\t// get the source size\n\t\tcssWidth = chart.renderTo.style.width;\n\t\tcssHeight = chart.renderTo.style.height;\n\t\tsourceWidth = options.exporting.sourceWidth ||\n\t\t\toptions.chart.width ||\n\t\t\t(/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||\n\t\t\t600;\n\t\tsourceHeight = options.exporting.sourceHeight ||\n\t\t\toptions.chart.height ||\n\t\t\t(/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||\n\t\t\t400;\n\n\t\t// override some options\n\t\textend(options.chart, {\n\t\t\tanimation: false,\n\t\t\trenderTo: sandbox,\n\t\t\tforExport: true,\n\t\t\twidth: sourceWidth,\n\t\t\theight: sourceHeight\n\t\t});\n\t\toptions.exporting.enabled = false; // hide buttons in print\n\t\t\n\t\t// prepare for replicating the chart\n\t\toptions.series = [];\n\t\teach(chart.series, function (serie) {\n\t\t\tseriesOptions = merge(serie.options, {\n\t\t\t\tanimation: false, // turn off animation\n\t\t\t\tshowCheckbox: false,\n\t\t\t\tvisible: serie.visible\n\t\t\t});\n\n\t\t\tif (!seriesOptions.isInternal) { // used for the navigator series that has its own option set\n\t\t\t\toptions.series.push(seriesOptions);\n\t\t\t}\n\t\t});\n\n\t\t// generate the chart copy\n\t\tchartCopy = new Highcharts.Chart(options, chart.callback);\n\n\t\t// reflect axis extremes in the export\n\t\teach(['xAxis', 'yAxis'], function (axisType) {\n\t\t\teach(chart[axisType], function (axis, i) {\n\t\t\t\tvar axisCopy = chartCopy[axisType][i],\n\t\t\t\t\textremes = axis.getExtremes(),\n\t\t\t\t\tuserMin = extremes.userMin,\n\t\t\t\t\tuserMax = extremes.userMax;\n\n\t\t\t\tif (axisCopy && (userMin !== UNDEFINED || userMax !== UNDEFINED)) {\n\t\t\t\t\taxisCopy.setExtremes(userMin, userMax, true, false);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// get the SVG from the container's innerHTML\n\t\tsvg = chartCopy.container.innerHTML;\n\n\t\t// free up memory\n\t\toptions = null;\n\t\tchartCopy.destroy();\n\t\tdiscardElement(sandbox);\n\n\t\t// sanitize\n\t\tsvg = svg\n\t\t\t.replace(/zIndex=\"[^\"]+\"/g, '')\n\t\t\t.replace(/isShadow=\"[^\"]+\"/g, '')\n\t\t\t.replace(/symbolName=\"[^\"]+\"/g, '')\n\t\t\t.replace(/jQuery[0-9]+=\"[^\"]+\"/g, '')\n\t\t\t.replace(/url\\([^#]+#/g, 'url(#')\n\t\t\t.replace(/<svg /, '<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" ')\n\t\t\t.replace(/ href=/g, ' xlink:href=')\n\t\t\t.replace(/\\n/, ' ')\n\t\t\t.replace(/<\\/svg>.*?$/, '</svg>') // any HTML added to the container after the SVG (#894)\n\t\t\t/* This fails in IE < 8\n\t\t\t.replace(/([0-9]+)\\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight\n\t\t\t\treturn s2 +'.'+ s3[0];\n\t\t\t})*/\n\n\t\t\t// Replace HTML entities, issue #347\n\t\t\t.replace(/&nbsp;/g, '\\u00A0') // no-break space\n\t\t\t.replace(/&shy;/g,  '\\u00AD') // soft hyphen\n\n\t\t\t// IE specific\n\t\t\t.replace(/<IMG /g, '<image ')\n\t\t\t.replace(/height=([^\" ]+)/g, 'height=\"$1\"')\n\t\t\t.replace(/width=([^\" ]+)/g, 'width=\"$1\"')\n\t\t\t.replace(/hc-svg-href=\"([^\"]+)\">/g, 'xlink:href=\"$1\"/>')\n\t\t\t.replace(/id=([^\" >]+)/g, 'id=\"$1\"')\n\t\t\t.replace(/class=([^\" >]+)/g, 'class=\"$1\"')\n\t\t\t.replace(/ transform /g, ' ')\n\t\t\t.replace(/:(path|rect)/g, '$1')\n\t\t\t.replace(/style=\"([^\"]+)\"/g, function (s) {\n\t\t\t\treturn s.toLowerCase();\n\t\t\t});\n\n\t\t// IE9 beta bugs with innerHTML. Test again with final IE9.\n\t\tsvg = svg.replace(/(url\\(#highcharts-[0-9]+)&quot;/g, '$1')\n\t\t\t.replace(/&quot;/g, \"'\");\n\n\t\treturn svg;\n\t},\n\n\t/**\n\t * Submit the SVG representation of the chart to the server\n\t * @param {Object} options Exporting options. Possible members are url, type and width.\n\t * @param {Object} chartOptions Additional chart options for the SVG representation of the chart\n\t */\n\texportChart: function (options, chartOptions) {\n\t\toptions = options || {};\n\t\t\n\t\tvar chart = this,\n\t\t\tchartExportingOptions = chart.options.exporting,\n\t\t\tsvg = chart.getSVG(merge(\n\t\t\t\t{ chart: { borderRadius: 0 } },\n\t\t\t\tchartExportingOptions.chartOptions,\n\t\t\t\tchartOptions, \n\t\t\t\t{\n\t\t\t\t\texporting: {\n\t\t\t\t\t\tsourceWidth: options.sourceWidth || chartExportingOptions.sourceWidth,\n\t\t\t\t\t\tsourceHeight: options.sourceHeight || chartExportingOptions.sourceHeight\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t));\n\n\t\t// merge the options\n\t\toptions = merge(chart.options.exporting, options);\n\t\t\n\t\t// do the post\n\t\tHighcharts.post(options.url, {\n\t\t\tfilename: options.filename || 'chart',\n\t\t\ttype: options.type,\n\t\t\twidth: options.width || 0, // IE8 fails to post undefined correctly, so use 0\n\t\t\tscale: options.scale || 2,\n\t\t\tsvg: svg\n\t\t});\n\n\t},\n\t\n\t/**\n\t * Print the chart\n\t */\n\tprint: function () {\n\n\t\tvar chart = this,\n\t\t\tcontainer = chart.container,\n\t\t\torigDisplay = [],\n\t\t\torigParent = container.parentNode,\n\t\t\tbody = doc.body,\n\t\t\tchildNodes = body.childNodes;\n\n\t\tif (chart.isPrinting) { // block the button while in printing mode\n\t\t\treturn;\n\t\t}\n\n\t\tchart.isPrinting = true;\n\n\t\t// hide all body content\n\t\teach(childNodes, function (node, i) {\n\t\t\tif (node.nodeType === 1) {\n\t\t\t\torigDisplay[i] = node.style.display;\n\t\t\t\tnode.style.display = NONE;\n\t\t\t}\n\t\t});\n\n\t\t// pull out the chart\n\t\tbody.appendChild(container);\n\n\t\t// print\n\t\twin.focus(); // #1510\n\t\twin.print();\n\n\t\t// allow the browser to prepare before reverting\n\t\tsetTimeout(function () {\n\n\t\t\t// put the chart back in\n\t\t\torigParent.appendChild(container);\n\n\t\t\t// restore all body content\n\t\t\teach(childNodes, function (node, i) {\n\t\t\t\tif (node.nodeType === 1) {\n\t\t\t\t\tnode.style.display = origDisplay[i];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tchart.isPrinting = false;\n\n\t\t}, 1000);\n\n\t},\n\n\t/**\n\t * Display a popup menu for choosing the export type\n\t *\n\t * @param {String} className An identifier for the menu\n\t * @param {Array} items A collection with text and onclicks for the items\n\t * @param {Number} x The x position of the opener button\n\t * @param {Number} y The y position of the opener button\n\t * @param {Number} width The width of the opener button\n\t * @param {Number} height The height of the opener button\n\t */\n\tcontextMenu: function (className, items, x, y, width, height, button) {\n\t\tvar chart = this,\n\t\t\tnavOptions = chart.options.navigation,\n\t\t\tmenuItemStyle = navOptions.menuItemStyle,\n\t\t\tchartWidth = chart.chartWidth,\n\t\t\tchartHeight = chart.chartHeight,\n\t\t\tcacheName = 'cache-' + className,\n\t\t\tmenu = chart[cacheName],\n\t\t\tmenuPadding = mathMax(width, height), // for mouse leave detection\n\t\t\tboxShadow = '3px 3px 10px #888',\n\t\t\tinnerMenu,\n\t\t\thide,\n\t\t\thideTimer,\n\t\t\tmenuStyle;\n\n\t\t// create the menu only the first time\n\t\tif (!menu) {\n\n\t\t\t// create a HTML element above the SVG\n\t\t\tchart[cacheName] = menu = createElement(DIV, {\n\t\t\t\tclassName: className\n\t\t\t}, {\n\t\t\t\tposition: ABSOLUTE,\n\t\t\t\tzIndex: 1000,\n\t\t\t\tpadding: menuPadding + PX\n\t\t\t}, chart.container);\n\n\t\t\tinnerMenu = createElement(DIV, null,\n\t\t\t\textend({\n\t\t\t\t\tMozBoxShadow: boxShadow,\n\t\t\t\t\tWebkitBoxShadow: boxShadow,\n\t\t\t\t\tboxShadow: boxShadow\n\t\t\t\t}, navOptions.menuStyle), menu);\n\n\t\t\t// hide on mouse out\n\t\t\thide = function () {\n\t\t\t\tcss(menu, { display: NONE });\n\t\t\t\tif (button) {\n\t\t\t\t\tbutton.setState(0);\n\t\t\t\t}\n\t\t\t\tchart.openMenu = false;\n\t\t\t};\n\n\t\t\t// Hide the menu some time after mouse leave (#1357)\n\t\t\taddEvent(menu, 'mouseleave', function () {\n\t\t\t\thideTimer = setTimeout(hide, 500);\n\t\t\t});\n\t\t\taddEvent(menu, 'mouseenter', function () {\n\t\t\t\tclearTimeout(hideTimer);\n\t\t\t});\n\t\t\t// Hide it on clicking or touching outside the menu (#2258)\n\t\t\taddEvent(document, 'mousedown', function (e) {\n\t\t\t\tif (!chart.pointer.inClass(e.target, className)) {\n\t\t\t\t\thide();\n\t\t\t\t}\n\t\t\t});\n\n\n\t\t\t// create the items\n\t\t\teach(items, function (item) {\n\t\t\t\tif (item) {\n\t\t\t\t\tvar element = item.separator ? \n\t\t\t\t\t\tcreateElement('hr', null, null, innerMenu) :\n\t\t\t\t\t\tcreateElement(DIV, {\n\t\t\t\t\t\t\tonmouseover: function () {\n\t\t\t\t\t\t\t\tcss(this, navOptions.menuItemHoverStyle);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tonmouseout: function () {\n\t\t\t\t\t\t\t\tcss(this, menuItemStyle);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tonclick: function () {\n\t\t\t\t\t\t\t\thide();\n\t\t\t\t\t\t\t\titem.onclick.apply(chart, arguments);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tinnerHTML: item.text || chart.options.lang[item.textKey]\n\t\t\t\t\t\t}, extend({\n\t\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t\t}, menuItemStyle), innerMenu);\n\n\n\t\t\t\t\t// Keep references to menu divs to be able to destroy them\n\t\t\t\t\tchart.exportDivElements.push(element);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Keep references to menu and innerMenu div to be able to destroy them\n\t\t\tchart.exportDivElements.push(innerMenu, menu);\n\n\t\t\tchart.exportMenuWidth = menu.offsetWidth;\n\t\t\tchart.exportMenuHeight = menu.offsetHeight;\n\t\t}\n\n\t\tmenuStyle = { display: 'block' };\n\n\t\t// if outside right, right align it\n\t\tif (x + chart.exportMenuWidth > chartWidth) {\n\t\t\tmenuStyle.right = (chartWidth - x - width - menuPadding) + PX;\n\t\t} else {\n\t\t\tmenuStyle.left = (x - menuPadding) + PX;\n\t\t}\n\t\t// if outside bottom, bottom align it\n\t\tif (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') {\n\t\t\tmenuStyle.bottom = (chartHeight - y - menuPadding)  + PX;\n\t\t} else {\n\t\t\tmenuStyle.top = (y + height - menuPadding) + PX;\n\t\t}\n\n\t\tcss(menu, menuStyle);\n\t\tchart.openMenu = true;\n\t},\n\n\t/**\n\t * Add the export button to the chart\n\t */\n\taddButton: function (options) {\n\t\tvar chart = this,\n\t\t\trenderer = chart.renderer,\n\t\t\tbtnOptions = merge(chart.options.navigation.buttonOptions, options),\n\t\t\tonclick = btnOptions.onclick,\n\t\t\tmenuItems = btnOptions.menuItems,\n\t\t\tsymbol,\n\t\t\tbutton,\n\t\t\tsymbolAttr = {\n\t\t\t\tstroke: btnOptions.symbolStroke,\n\t\t\t\tfill: btnOptions.symbolFill\n\t\t\t},\n\t\t\tsymbolSize = btnOptions.symbolSize || 12;\n\t\tif (!chart.btnCount) {\n\t\t\tchart.btnCount = 0;\n\t\t}\n\n\t\t// Keeps references to the button elements\n\t\tif (!chart.exportDivElements) {\n\t\t\tchart.exportDivElements = [];\n\t\t\tchart.exportSVGElements = [];\n\t\t}\n\n\t\tif (btnOptions.enabled === false) {\n\t\t\treturn;\n\t\t}\n\n\n\t\tvar attr = btnOptions.theme,\n\t\t\tstates = attr.states,\n\t\t\thover = states && states.hover,\n\t\t\tselect = states && states.select,\n\t\t\tcallback;\n\n\t\tdelete attr.states;\n\n\t\tif (onclick) {\n\t\t\tcallback = function () {\n\t\t\t\tonclick.apply(chart, arguments);\n\t\t\t};\n\n\t\t} else if (menuItems) {\n\t\t\tcallback = function () {\n\t\t\t\tchart.contextMenu(\n\t\t\t\t\tbutton.menuClassName, \n\t\t\t\t\tmenuItems, \n\t\t\t\t\tbutton.translateX, \n\t\t\t\t\tbutton.translateY, \n\t\t\t\t\tbutton.width, \n\t\t\t\t\tbutton.height,\n\t\t\t\t\tbutton\n\t\t\t\t);\n\t\t\t\tbutton.setState(2);\n\t\t\t};\n\t\t}\n\n\n\t\tif (btnOptions.text && btnOptions.symbol) {\n\t\t\tattr.paddingLeft = Highcharts.pick(attr.paddingLeft, 25);\n\t\t\n\t\t} else if (!btnOptions.text) {\n\t\t\textend(attr, {\n\t\t\t\twidth: btnOptions.width,\n\t\t\t\theight: btnOptions.height,\n\t\t\t\tpadding: 0\n\t\t\t});\n\t\t}\n\n\t\tbutton = renderer.button(btnOptions.text, 0, 0, callback, attr, hover, select)\n\t\t\t.attr({\n\t\t\t\ttitle: chart.options.lang[btnOptions._titleKey],\n\t\t\t\t'stroke-linecap': 'round'\n\t\t\t});\n\t\tbutton.menuClassName = options.menuClassName || PREFIX + 'menu-' + chart.btnCount++;\n\n\t\tif (btnOptions.symbol) {\n\t\t\tsymbol = renderer.symbol(\n\t\t\t\t\tbtnOptions.symbol,\n\t\t\t\t\tbtnOptions.symbolX - (symbolSize / 2),\n\t\t\t\t\tbtnOptions.symbolY - (symbolSize / 2),\n\t\t\t\t\tsymbolSize,\t\t\t\t\n\t\t\t\t\tsymbolSize\n\t\t\t\t)\n\t\t\t\t.attr(extend(symbolAttr, {\n\t\t\t\t\t'stroke-width': btnOptions.symbolStrokeWidth || 1,\n\t\t\t\t\tzIndex: 1\n\t\t\t\t})).add(button);\n\t\t}\n\n\t\tbutton.add()\n\t\t\t.align(extend(btnOptions, {\n\t\t\t\twidth: button.width,\n\t\t\t\tx: Highcharts.pick(btnOptions.x, buttonOffset) // #1654\n\t\t\t}), true, 'spacingBox');\n\n\t\tbuttonOffset += (button.width + btnOptions.buttonSpacing) * (btnOptions.align === 'right' ? -1 : 1);\n\n\t\tchart.exportSVGElements.push(button, symbol);\n\n\t},\n\n\t/**\n\t * Destroy the buttons.\n\t */\n\tdestroyExport: function (e) {\n\t\tvar chart = e.target,\n\t\t\ti,\n\t\t\telem;\n\n\t\t// Destroy the extra buttons added\n\t\tfor (i = 0; i < chart.exportSVGElements.length; i++) {\n\t\t\telem = chart.exportSVGElements[i];\n\t\t\t\n\t\t\t// Destroy and null the svg/vml elements\n\t\t\tif (elem) { // #1822\n\t\t\t\telem.onclick = elem.ontouchstart = null;\n\t\t\t\tchart.exportSVGElements[i] = elem.destroy();\n\t\t\t}\n\t\t}\n\n\t\t// Destroy the divs for the menu\n\t\tfor (i = 0; i < chart.exportDivElements.length; i++) {\n\t\t\telem = chart.exportDivElements[i];\n\n\t\t\t// Remove the event handler\n\t\t\tremoveEvent(elem, 'mouseleave');\n\n\t\t\t// Remove inline events\n\t\t\tchart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null;\n\n\t\t\t// Destroy the div by moving to garbage bin\n\t\t\tdiscardElement(elem);\n\t\t}\n\t}\n});\n\n\nsymbols.menu = function (x, y, width, height) {\n\tvar arr = [\n\t\tM, x, y + 2.5,\n\t\tL, x + width, y + 2.5,\n\t\tM, x, y + height / 2 + 0.5,\n\t\tL, x + width, y + height / 2 + 0.5,\n\t\tM, x, y + height - 1.5,\n\t\tL, x + width, y + height - 1.5\n\t];\n\treturn arr;\n};\n\n// Add the buttons on chart load\nChart.prototype.callbacks.push(function (chart) {\n\tvar n,\n\t\texportingOptions = chart.options.exporting,\n\t\tbuttons = exportingOptions.buttons;\n\n\tbuttonOffset = 0;\n\n\tif (exportingOptions.enabled !== false) {\n\n\t\tfor (n in buttons) {\n\t\t\tchart.addButton(buttons[n]);\n\t\t}\n\n\t\t// Destroy the export elements at chart destroy\n\t\taddEvent(chart, 'destroy', chart.destroyExport);\n\t}\n\n});\n\n\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/funnel.js",
    "content": "/*\n \n Highcharts funnel module, Beta\n\n (c) 2010-2012 Torstein Hønsi\n\n License: www.highcharts.com/license\n*/\n(function(d){var u=d.getOptions().plotOptions,p=d.seriesTypes,D=d.merge,z=function(){},A=d.each;u.funnel=D(u.pie,{center:[\"50%\",\"50%\"],width:\"90%\",neckWidth:\"30%\",height:\"100%\",neckHeight:\"25%\",dataLabels:{connectorWidth:1,connectorColor:\"#606060\"},size:!0,states:{select:{color:\"#C0C0C0\",borderColor:\"#000000\",shadow:!1}}});p.funnel=d.extendClass(p.pie,{type:\"funnel\",animate:z,translate:function(){var a=function(k,a){return/%$/.test(k)?a*parseInt(k,10)/100:parseInt(k,10)},g=0,e=this.chart,f=e.plotWidth,\ne=e.plotHeight,h=0,c=this.options,C=c.center,b=a(C[0],f),d=a(C[0],e),p=a(c.width,f),i,q,j=a(c.height,e),r=a(c.neckWidth,f),s=a(c.neckHeight,e),v=j-s,a=this.data,w,x,u=c.dataLabels.position===\"left\"?1:0,y,m,B,n,l,t,o;this.getWidthAt=q=function(k){return k>j-s||j===s?r:r+(p-r)*((j-s-k)/(j-s))};this.getX=function(k,a){return b+(a?-1:1)*(q(k)/2+c.dataLabels.distance)};this.center=[b,d,j];this.centerX=b;A(a,function(a){g+=a.y});A(a,function(a){o=null;x=g?a.y/g:0;m=d-j/2+h*j;l=m+x*j;i=q(m);y=b-i/2;B=y+\ni;i=q(l);n=b-i/2;t=n+i;m>v?(y=n=b-r/2,B=t=b+r/2):l>v&&(o=l,i=q(v),n=b-i/2,t=n+i,l=v);w=[\"M\",y,m,\"L\",B,m,t,l];o&&w.push(t,o,n,o);w.push(n,l,\"Z\");a.shapeType=\"path\";a.shapeArgs={d:w};a.percentage=x*100;a.plotX=b;a.plotY=(m+(o||l))/2;a.tooltipPos=[b,a.plotY];a.slice=z;a.half=u;h+=x});this.setTooltipPoints()},drawPoints:function(){var a=this,g=a.options,e=a.chart.renderer;A(a.data,function(f){var h=f.graphic,c=f.shapeArgs;h?h.animate(c):f.graphic=e.path(c).attr({fill:f.color,stroke:g.borderColor,\"stroke-width\":g.borderWidth}).add(a.group)})},\nsortByAngle:z,drawDataLabels:function(){var a=this.data,g=this.options.dataLabels.distance,e,f,h,c=a.length,d,b;for(this.center[2]-=2*g;c--;)h=a[c],f=(e=h.half)?1:-1,b=h.plotY,d=this.getX(b,e),h.labelPos=[0,b,d+(g-5)*f,b,d+g*f,b,e?\"right\":\"left\",0];p.pie.prototype.drawDataLabels.call(this)}})})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/funnel.src.js",
    "content": "/**\n * @license \n * Highcharts funnel module, Beta\n *\n * (c) 2010-2012 Torstein Hønsi\n *\n * License: www.highcharts.com/license\n */\n\n/*global Highcharts */\n(function (Highcharts) {\n\t\n'use strict';\n\n// create shortcuts\nvar defaultOptions = Highcharts.getOptions(),\n\tdefaultPlotOptions = defaultOptions.plotOptions,\n\tseriesTypes = Highcharts.seriesTypes,\n\tmerge = Highcharts.merge,\n\tnoop = function () {},\n\teach = Highcharts.each;\n\n// set default options\ndefaultPlotOptions.funnel = merge(defaultPlotOptions.pie, {\n\tcenter: ['50%', '50%'],\n\twidth: '90%',\n\tneckWidth: '30%',\n\theight: '100%',\n\tneckHeight: '25%',\n\n\tdataLabels: {\n\t\t//position: 'right',\n\t\tconnectorWidth: 1,\n\t\tconnectorColor: '#606060'\n\t},\n\tsize: true, // to avoid adapting to data label size in Pie.drawDataLabels\n\tstates: {\n\t\tselect: {\n\t\t\tcolor: '#C0C0C0',\n\t\t\tborderColor: '#000000',\n\t\t\tshadow: false\n\t\t}\n\t}\t\n});\n\n\nseriesTypes.funnel = Highcharts.extendClass(seriesTypes.pie, {\n\t\n\ttype: 'funnel',\n\tanimate: noop,\n\n\t/**\n\t * Overrides the pie translate method\n\t */\n\ttranslate: function () {\n\t\t\n\t\tvar \n\t\t\t// Get positions - either an integer or a percentage string must be given\n\t\t\tgetLength = function (length, relativeTo) {\n\t\t\t\treturn (/%$/).test(length) ?\n\t\t\t\t\trelativeTo * parseInt(length, 10) / 100 :\n\t\t\t\t\tparseInt(length, 10);\n\t\t\t},\n\t\t\t\n\t\t\tsum = 0,\n\t\t\tseries = this,\n\t\t\tchart = series.chart,\n\t\t\tplotWidth = chart.plotWidth,\n\t\t\tplotHeight = chart.plotHeight,\n\t\t\tcumulative = 0, // start at top\n\t\t\toptions = series.options,\n\t\t\tcenter = options.center,\n\t\t\tcenterX = getLength(center[0], plotWidth),\n\t\t\tcenterY = getLength(center[0], plotHeight),\n\t\t\twidth = getLength(options.width, plotWidth),\n\t\t\ttempWidth,\n\t\t\tgetWidthAt,\n\t\t\theight = getLength(options.height, plotHeight),\n\t\t\tneckWidth = getLength(options.neckWidth, plotWidth),\n\t\t\tneckHeight = getLength(options.neckHeight, plotHeight),\n\t\t\tneckY = height - neckHeight,\n\t\t\tdata = series.data,\n\t\t\tpath,\n\t\t\tfraction,\n\t\t\thalf = options.dataLabels.position === 'left' ? 1 : 0,\n\n\t\t\tx1, \n\t\t\ty1, \n\t\t\tx2, \n\t\t\tx3, \n\t\t\ty3, \n\t\t\tx4, \n\t\t\ty5;\n\n\t\t// Return the width at a specific y coordinate\n\t\tseries.getWidthAt = getWidthAt = function (y) {\n\t\t\treturn y > height - neckHeight || height === neckHeight ?\n\t\t\t\tneckWidth :\n\t\t\t\tneckWidth + (width - neckWidth) * ((height - neckHeight - y) / (height - neckHeight));\n\t\t};\n\t\tseries.getX = function (y, half) {\n\t\t\treturn centerX + (half ? -1 : 1) * ((getWidthAt(y) / 2) + options.dataLabels.distance);\n\t\t};\n\n\t\t// Expose\n\t\tseries.center = [centerX, centerY, height];\n\t\tseries.centerX = centerX;\n\n\t\t/*\n\t\t * Individual point coordinate naming:\n\t\t *\n\t\t * x1,y1 _________________ x2,y1\n\t\t *  \\                         /\n\t\t *   \\                       /\n\t\t *    \\                     /\n\t\t *     \\                   /\n\t\t *      \\                 /\n\t\t *     x3,y3 _________ x4,y3\n\t\t *\n\t\t * Additional for the base of the neck:\n\t\t *\n\t\t *       |               |\n\t\t *       |               |\n\t\t *       |               |\n\t\t *     x3,y5 _________ x4,y5\n\t\t */\n\n\n\n\n\t\t// get the total sum\n\t\teach(data, function (point) {\n\t\t\tsum += point.y;\n\t\t});\n\n\t\teach(data, function (point) {\n\t\t\t// set start and end positions\n\t\t\ty5 = null;\n\t\t\tfraction = sum ? point.y / sum : 0;\n\t\t\ty1 = centerY - height / 2 + cumulative * height;\n\t\t\ty3 = y1 + fraction * height;\n\t\t\t//tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));\n\t\t\ttempWidth = getWidthAt(y1);\n\t\t\tx1 = centerX - tempWidth / 2;\n\t\t\tx2 = x1 + tempWidth;\n\t\t\ttempWidth = getWidthAt(y3);\n\t\t\tx3 = centerX - tempWidth / 2;\n\t\t\tx4 = x3 + tempWidth;\n\n\t\t\t// the entire point is within the neck\n\t\t\tif (y1 > neckY) {\n\t\t\t\tx1 = x3 = centerX - neckWidth / 2;\n\t\t\t\tx2 = x4 = centerX + neckWidth / 2;\n\t\t\t\n\t\t\t// the base of the neck\n\t\t\t} else if (y3 > neckY) {\n\t\t\t\ty5 = y3;\n\n\t\t\t\ttempWidth = getWidthAt(neckY);\n\t\t\t\tx3 = centerX - tempWidth / 2;\n\t\t\t\tx4 = x3 + tempWidth;\n\n\t\t\t\ty3 = neckY;\n\t\t\t}\n\n\t\t\t// save the path\n\t\t\tpath = [\n\t\t\t\t'M',\n\t\t\t\tx1, y1,\n\t\t\t\t'L',\n\t\t\t\tx2, y1,\n\t\t\t\tx4, y3\n\t\t\t];\n\t\t\tif (y5) {\n\t\t\t\tpath.push(x4, y5, x3, y5);\n\t\t\t}\n\t\t\tpath.push(x3, y3, 'Z');\n\n\t\t\t// prepare for using shared dr\n\t\t\tpoint.shapeType = 'path';\n\t\t\tpoint.shapeArgs = { d: path };\n\n\n\t\t\t// for tooltips and data labels\n\t\t\tpoint.percentage = fraction * 100;\n\t\t\tpoint.plotX = centerX;\n\t\t\tpoint.plotY = (y1 + (y5 || y3)) / 2;\n\n\t\t\t// Placement of tooltips and data labels\n\t\t\tpoint.tooltipPos = [\n\t\t\t\tcenterX,\n\t\t\t\tpoint.plotY\n\t\t\t];\n\n\t\t\t// Slice is a noop on funnel points\n\t\t\tpoint.slice = noop;\n\t\t\t\n\t\t\t// Mimicking pie data label placement logic\n\t\t\tpoint.half = half;\n\n\t\t\tcumulative += fraction;\n\t\t});\n\n\n\t\tseries.setTooltipPoints();\n\t},\n\t/**\n\t * Draw a single point (wedge)\n\t * @param {Object} point The point object\n\t * @param {Object} color The color of the point\n\t * @param {Number} brightness The brightness relative to the color\n\t */\n\tdrawPoints: function () {\n\t\tvar series = this,\n\t\t\toptions = series.options,\n\t\t\tchart = series.chart,\n\t\t\trenderer = chart.renderer;\n\n\t\teach(series.data, function (point) {\n\t\t\t\n\t\t\tvar graphic = point.graphic,\n\t\t\t\tshapeArgs = point.shapeArgs;\n\n\t\t\tif (!graphic) { // Create the shapes\n\t\t\t\tpoint.graphic = renderer.path(shapeArgs).\n\t\t\t\t\tattr({\n\t\t\t\t\t\tfill: point.color,\n\t\t\t\t\t\tstroke: options.borderColor,\n\t\t\t\t\t\t'stroke-width': options.borderWidth\n\t\t\t\t\t}).\n\t\t\t\t\tadd(series.group);\n\t\t\t\t\t\n\t\t\t} else { // Update the shapes\n\t\t\t\tgraphic.animate(shapeArgs);\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Funnel items don't have angles (#2289)\n\t */\n\tsortByAngle: noop,\n\t\n\t/**\n\t * Extend the pie data label method\n\t */\n\tdrawDataLabels: function () {\n\t\tvar data = this.data,\n\t\t\tlabelDistance = this.options.dataLabels.distance,\n\t\t\tleftSide,\n\t\t\tsign,\n\t\t\tpoint,\n\t\t\ti = data.length,\n\t\t\tx,\n\t\t\ty;\n\t\t\n\t\t// In the original pie label anticollision logic, the slots are distributed\n\t\t// from one labelDistance above to one labelDistance below the pie. In funnels\n\t\t// we don't want this.\n\t\tthis.center[2] -= 2 * labelDistance;\n\t\t\n\t\t// Set the label position array for each point.\n\t\twhile (i--) {\n\t\t\tpoint = data[i];\n\t\t\tleftSide = point.half;\n\t\t\tsign = leftSide ? 1 : -1;\n\t\t\ty = point.plotY;\n\t\t\tx = this.getX(y, leftSide);\n\t\t\t\t\n\t\t\t// set the anchor point for data labels\n\t\t\tpoint.labelPos = [\n\t\t\t\t0, // first break of connector\n\t\t\t\ty, // a/a\n\t\t\t\tx + (labelDistance - 5) * sign, // second break, right outside point shape\n\t\t\t\ty, // a/a\n\t\t\t\tx + labelDistance * sign, // landing point for connector\n\t\t\t\ty, // a/a\n\t\t\t\tleftSide ? 'right' : 'left', // alignment\n\t\t\t\t0 // center angle\n\t\t\t];\n\t\t}\n\t\t\n\t\tseriesTypes.pie.prototype.drawDataLabels.call(this);\n\t}\n\n});\n\n\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/heatmap.js",
    "content": "(function(b){var k=b.seriesTypes,l=b.each;k.heatmap=b.extendClass(k.map,{colorKey:\"z\",useMapGeometry:!1,pointArrayMap:[\"y\",\"z\"],translate:function(){var c=this,b=c.options,i=Number.MAX_VALUE,j=Number.MIN_VALUE;c.generatePoints();l(c.data,function(a){var e=a.x,f=a.y,d=a.z,g=(b.colsize||1)/2,h=(b.rowsize||1)/2;a.path=[\"M\",e-g,f-h,\"L\",e+g,f-h,\"L\",e+g,f+h,\"L\",e-g,f+h,\"Z\"];a.shapeType=\"path\";a.shapeArgs={d:c.translatePath(a.path)};typeof d===\"number\"&&(d>j?j=d:d<i&&(i=d))});c.translateColors(i,j)},getBox:function(){}})})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/heatmap.src.js",
    "content": "(function (Highcharts) {\n\tvar seriesTypes = Highcharts.seriesTypes,\n\t\teach = Highcharts.each;\n\t\n\tseriesTypes.heatmap = Highcharts.extendClass(seriesTypes.map, {\n\t\tcolorKey: 'z',\n\t\tuseMapGeometry: false,\n\t\tpointArrayMap: ['y', 'z'],\n\t\ttranslate: function () {\n\t\t\tvar series = this,\n\t\t\t\toptions = series.options,\n\t\t\t\tdataMin = Number.MAX_VALUE,\n\t\t\t\tdataMax = Number.MIN_VALUE;\n\n\t\t\tseries.generatePoints();\n\t\n\t\t\teach(series.data, function (point) {\n\t\t\t\tvar x = point.x,\n\t\t\t\t\ty = point.y,\n\t\t\t\t\tvalue = point.z,\n\t\t\t\t\txPad = (options.colsize || 1) / 2,\n\t\t\t\t\tyPad = (options.rowsize || 1) / 2;\n\n\t\t\t\tpoint.path = [\n\t\t\t\t\t'M', x - xPad, y - yPad,\n\t\t\t\t\t'L', x + xPad, y - yPad,\n\t\t\t\t\t'L', x + xPad, y + yPad,\n\t\t\t\t\t'L', x - xPad, y + yPad,\n\t\t\t\t\t'Z'\n\t\t\t\t];\n\t\t\t\t\n\t\t\t\tpoint.shapeType = 'path';\n\t\t\t\tpoint.shapeArgs = {\n\t\t\t\t\td: series.translatePath(point.path)\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tif (typeof value === 'number') {\n\t\t\t\t\tif (value > dataMax) {\n\t\t\t\t\t\tdataMax = value;\n\t\t\t\t\t} else if (value < dataMin) {\n\t\t\t\t\t\tdataMin = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tseries.translateColors(dataMin, dataMax);\n\t\t},\n\t\t\n\t\tgetBox: function () {}\n\t\t\t\n\t});\n\t\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/map.js",
    "content": "/*\n Map plugin v0.1 for Highcharts\n\n (c) 2011-2013 Torstein Hønsi\n\n License: www.highcharts.com/license\n*/\n(function(g){function x(a,b,c){for(var d=4,e=[];d--;)e[d]=Math.round(b.rgba[d]+(a.rgba[d]-b.rgba[d])*(1-c));return\"rgba(\"+e.join(\",\")+\")\"}var r=g.Axis,y=g.Chart,s=g.Point,z=g.Pointer,l=g.each,v=g.extend,p=g.merge,n=g.pick,A=g.numberFormat,B=g.getOptions(),k=g.seriesTypes,q=B.plotOptions,t=g.wrap,u=g.Color,w=function(){};B.mapNavigation={buttonOptions:{align:\"right\",verticalAlign:\"bottom\",x:0,width:18,height:18,style:{fontSize:\"15px\",fontWeight:\"bold\",textAlign:\"center\"}},buttons:{zoomIn:{onclick:function(){this.mapZoom(0.5)},\ntext:\"+\",y:-32},zoomOut:{onclick:function(){this.mapZoom(2)},text:\"-\",y:0}}};g.splitPath=function(a){var b,a=a.replace(/([A-Za-z])/g,\" $1 \"),a=a.replace(/^\\s*/,\"\").replace(/\\s*$/,\"\"),a=a.split(/[ ,]+/);for(b=0;b<a.length;b++)/[a-zA-Z]/.test(a[b])||(a[b]=parseFloat(a[b]));return a};g.maps={};t(r.prototype,\"getSeriesExtremes\",function(a){var b=this.isXAxis,c,d,e=[];l(this.series,function(a,b){if(a.useMapGeometry)e[b]=a.xData,a.xData=[]});a.call(this);c=n(this.dataMin,Number.MAX_VALUE);d=n(this.dataMax,\nNumber.MIN_VALUE);l(this.series,function(a,i){if(a.useMapGeometry)c=Math.min(c,a[b?\"minX\":\"minY\"]),d=Math.max(d,a[b?\"maxX\":\"maxY\"]),a.xData=e[i]});this.dataMin=c;this.dataMax=d});t(r.prototype,\"setAxisTranslation\",function(a){var b=this.chart,c=b.plotWidth/b.plotHeight,d=this.isXAxis,e=b.xAxis[0];a.call(this);if(b.options.chart.type===\"map\"&&!d&&e.transA!==void 0)this.transA=e.transA=Math.min(this.transA,e.transA),a=(e.max-e.min)/(this.max-this.min),e=a>c?this:e,c=(e.max-e.min)*e.transA,e.minPixelPadding=\n(e.len-c)/2});t(y.prototype,\"render\",function(a){var b=this,c=b.options.mapNavigation;a.call(b);b.renderMapNavigation();c.zoomOnDoubleClick&&g.addEvent(b.container,\"dblclick\",function(a){b.pointer.onContainerDblClick(a)});c.zoomOnMouseWheel&&g.addEvent(b.container,document.onmousewheel===void 0?\"DOMMouseScroll\":\"mousewheel\",function(a){b.pointer.onContainerMouseWheel(a)})});v(z.prototype,{onContainerDblClick:function(a){var b=this.chart,a=this.normalize(a);b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-\nb.plotTop)&&b.mapZoom(0.5,b.xAxis[0].toValue(a.chartX),b.yAxis[0].toValue(a.chartY))},onContainerMouseWheel:function(a){var b=this.chart,c,a=this.normalize(a);c=a.detail||-(a.wheelDelta/120);b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&b.mapZoom(c>0?2:0.5,b.xAxis[0].toValue(a.chartX),b.yAxis[0].toValue(a.chartY))}});t(z.prototype,\"init\",function(a,b,c){a.call(this,b,c);if(c.mapNavigation.enableTouchZoom)this.pinchX=this.pinchHor=this.pinchY=this.pinchVert=!0});v(y.prototype,{renderMapNavigation:function(){var a=\nthis,b=this.options.mapNavigation,c=b.buttons,d,e,f,i=function(){this.handler.call(a)};if(b.enableButtons)for(d in c)if(c.hasOwnProperty(d))f=p(b.buttonOptions,c[d]),e=a.renderer.button(f.text,0,0,i).attr({width:f.width,height:f.height}).css(f.style).add(),e.handler=f.onclick,e.align(v(f,{width:e.width,height:e.height}),null,\"spacingBox\")},fitToBox:function(a,b){l([[\"x\",\"width\"],[\"y\",\"height\"]],function(c){var d=c[0],c=c[1];a[d]+a[c]>b[d]+b[c]&&(a[c]>b[c]?(a[c]=b[c],a[d]=b[d]):a[d]=b[d]+b[c]-a[c]);\na[c]>b[c]&&(a[c]=b[c]);a[d]<b[d]&&(a[d]=b[d])});return a},mapZoom:function(a,b,c){if(!this.isMapZooming){var d=this,e=d.xAxis[0],f=e.max-e.min,i=n(b,e.min+f/2),b=f*a,f=d.yAxis[0],h=f.max-f.min,c=n(c,f.min+h/2);a*=h;i-=b/2;h=c-a/2;c=n(d.options.chart.animation,!0);b=d.fitToBox({x:i,y:h,width:b,height:a},{x:e.dataMin,y:f.dataMin,width:e.dataMax-e.dataMin,height:f.dataMax-f.dataMin});e.setExtremes(b.x,b.x+b.width,!1);f.setExtremes(b.y,b.y+b.height,!1);if(e=c?c.duration||500:0)d.isMapZooming=!0,setTimeout(function(){d.isMapZooming=\n!1},e);d.redraw()}}});q.map=p(q.scatter,{animation:!1,nullColor:\"#F8F8F8\",borderColor:\"silver\",borderWidth:1,marker:null,stickyTracking:!1,dataLabels:{verticalAlign:\"middle\"},turboThreshold:0,tooltip:{followPointer:!0,pointFormat:\"{point.name}: {point.y}<br/>\"},states:{normal:{animation:!0}}});r=g.extendClass(s,{applyOptions:function(a,b){var c=s.prototype.applyOptions.call(this,a,b);if(c.path&&typeof c.path===\"string\")c.path=c.options.path=g.splitPath(c.path);return c},onMouseOver:function(){clearTimeout(this.colorInterval);\ns.prototype.onMouseOver.call(this)},onMouseOut:function(){var a=this,b=+new Date,c=u(a.options.color),d=u(a.pointAttr.hover.fill),e=a.series.options.states.normal.animation,f=e&&(e.duration||500);if(f&&c.rgba.length===4&&d.rgba.length===4)delete a.pointAttr[\"\"].fill,clearTimeout(a.colorInterval),a.colorInterval=setInterval(function(){var e=(new Date-b)/f,h=a.graphic;e>1&&(e=1);h&&h.attr(\"fill\",x(d,c,e));e>=1&&clearTimeout(a.colorInterval)},13);s.prototype.onMouseOut.call(a)}});k.map=g.extendClass(k.scatter,\n{type:\"map\",pointAttrToOptions:{stroke:\"borderColor\",\"stroke-width\":\"borderWidth\",fill:\"color\"},colorKey:\"y\",pointClass:r,trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],getSymbol:w,supportsDrilldown:!0,getExtremesFromAll:!0,useMapGeometry:!0,init:function(a){var b=this,c=a.options.legend.valueDecimals,d=[],e,f,i,h,j,o,m;o=a.options.legend.layout===\"horizontal\";g.Series.prototype.init.apply(this,arguments);j=b.options.colorRange;if(h=b.options.valueRanges)l(h,function(a){f=a.from;i=a.to;e=\n\"\";f===void 0?e=\"< \":i===void 0&&(e=\"> \");f!==void 0&&(e+=A(f,c));f!==void 0&&i!==void 0&&(e+=\" - \");i!==void 0&&(e+=A(i,c));d.push(g.extend({chart:b.chart,name:e,options:{},drawLegendSymbol:k.area.prototype.drawLegendSymbol,visible:!0,setState:function(){},setVisible:function(){}},a))}),b.legendItems=d;else if(j)f=j.from,i=j.to,h=j.fromLabel,j=j.toLabel,m=o?[0,0,1,0]:[0,1,0,0],o||(o=h,h=j,j=o),o={linearGradient:{x1:m[0],y1:m[1],x2:m[2],y2:m[3]},stops:[[0,f],[1,i]]},d=[{chart:b.chart,options:{},fromLabel:h,\ntoLabel:j,color:o,drawLegendSymbol:this.drawLegendSymbolGradient,visible:!0,setState:function(){},setVisible:function(){}}],b.legendItems=d},drawLegendSymbol:k.area.prototype.drawLegendSymbol,drawLegendSymbolGradient:function(a,b){var c=a.options.symbolPadding,d=n(a.options.padding,8),e,f,i=this.chart.renderer.fontMetrics(a.options.itemStyle.fontSize).h,h=a.options.layout===\"horizontal\",j;j=n(a.options.rectangleLength,200);h?(e=-(c/2),f=0):(e=-j+a.baseline-c/2,f=d+i);b.fromText=this.chart.renderer.text(b.fromLabel,\nf,e).attr({zIndex:2}).add(b.legendGroup);f=b.fromText.getBBox();b.legendSymbol=this.chart.renderer.rect(h?f.x+f.width+c:f.x-i-c,f.y,h?j:i,h?i:j,2).attr({zIndex:1}).add(b.legendGroup);j=b.legendSymbol.getBBox();b.toText=this.chart.renderer.text(b.toLabel,j.x+j.width+c,h?e:j.y+j.height-c).attr({zIndex:2}).add(b.legendGroup);e=b.toText.getBBox();h?(a.offsetWidth=f.width+j.width+e.width+c*2+d,a.itemY=i+d):(a.offsetWidth=Math.max(f.width,e.width)+c+j.width+d,a.itemY=j.height+d,a.itemX=c)},getBox:function(a){var b=\nNumber.MIN_VALUE,c=Number.MAX_VALUE,d=Number.MIN_VALUE,e=Number.MAX_VALUE;l(a||this.options.data,function(a){for(var i=a.path,h=i.length,j=!1,g=Number.MIN_VALUE,m=Number.MAX_VALUE,k=Number.MIN_VALUE,l=Number.MAX_VALUE;h--;)typeof i[h]===\"number\"&&!isNaN(i[h])&&(j?(g=Math.max(g,i[h]),m=Math.min(m,i[h])):(k=Math.max(k,i[h]),l=Math.min(l,i[h])),j=!j);a._maxX=g;a._minX=m;a._maxY=k;a._minY=l;b=Math.max(b,g);c=Math.min(c,m);d=Math.max(d,k);e=Math.min(e,l)});this.minY=e;this.maxY=d;this.minX=c;this.maxX=\nb},translatePath:function(a){var b=!1,c=this.xAxis,d=this.yAxis,e,a=[].concat(a);for(e=a.length;e--;)typeof a[e]===\"number\"&&(a[e]=b?Math.round(c.translate(a[e])):Math.round(d.len-d.translate(a[e])),b=!b);return a},setData:function(){g.Series.prototype.setData.apply(this,arguments);this.getBox()},translate:function(){var a=this,b=Number.MAX_VALUE,c=Number.MIN_VALUE;a.generatePoints();l(a.data,function(d){d.shapeType=\"path\";d.shapeArgs={d:a.translatePath(d.path)};if(typeof d.y===\"number\")if(d.y>c)c=\nd.y;else if(d.y<b)b=d.y});a.translateColors(b,c)},translateColors:function(a,b){var c=this.options,d=c.valueRanges,e=c.colorRange,f=this.colorKey,i,h;e&&(i=u(e.from),h=u(e.to));l(this.data,function(g){var k=g[f],m,l,n;if(d)for(n=d.length;n--;){if(m=d[n],i=m.from,h=m.to,(i===void 0||k>=i)&&(h===void 0||k<=h)){l=m.color;break}}else e&&k!==void 0&&(m=1-(b-k)/(b-a),l=k===null?c.nullColor:x(i,h,m));if(l)g.color=null,g.options.color=l})},drawGraph:w,drawDataLabels:w,drawPoints:function(){var a=this.xAxis,\nb=this.yAxis,c=this.colorKey;l(this.data,function(a){a.plotY=1;if(a[c]===null)a[c]=0,a.isNull=!0});k.column.prototype.drawPoints.apply(this);l(this.data,function(d){var e=d.dataLabels,f=a.toPixels(d._minX,!0),g=a.toPixels(d._maxX,!0),h=b.toPixels(d._minY,!0),j=b.toPixels(d._maxY,!0);d.plotX=Math.round(f+(g-f)*n(e&&e.anchorX,0.5));d.plotY=Math.round(h+(j-h)*n(e&&e.anchorY,0.5));d.isNull&&(d[c]=null)});g.Series.prototype.drawDataLabels.call(this)},animateDrilldown:function(a){var b=this.chart.plotBox,\nc=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],d=c.bBox,e=this.chart.options.drilldown.animation;if(!a)a=Math.min(d.width/b.width,d.height/b.height),c.shapeArgs={scaleX:a,scaleY:a,translateX:d.x,translateY:d.y},l(this.points,function(a){a.graphic.attr(c.shapeArgs).animate({scaleX:1,scaleY:1,translateX:0,translateY:0},e)}),delete this.animate},animateDrillupFrom:function(a){k.column.prototype.animateDrillupFrom.call(this,a)},animateDrillupTo:function(a){k.column.prototype.animateDrillupTo.call(this,\na)}});q.mapline=p(q.map,{lineWidth:1,backgroundColor:\"none\"});k.mapline=g.extendClass(k.map,{type:\"mapline\",pointAttrToOptions:{stroke:\"color\",\"stroke-width\":\"lineWidth\",fill:\"backgroundColor\"},drawLegendSymbol:k.line.prototype.drawLegendSymbol});q.mappoint=p(q.scatter,{dataLabels:{enabled:!0,format:\"{point.name}\",color:\"black\",style:{textShadow:\"0 0 5px white\"}}});k.mappoint=g.extendClass(k.scatter,{type:\"mappoint\"});g.Map=function(a,b){var c={endOnTick:!1,gridLineWidth:0,labels:{enabled:!1},lineWidth:0,\nminPadding:0,maxPadding:0,startOnTick:!1,tickWidth:0,title:null},d;d=a.series;a.series=null;a=p({chart:{type:\"map\",panning:\"xy\"},xAxis:c,yAxis:p(c,{reversed:!0})},a,{chart:{inverted:!1}});a.series=d;return new g.Chart(a,b)}})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/map.src.js",
    "content": "/**\n * @license Map plugin v0.1 for Highcharts\n *\n * (c) 2011-2013 Torstein Hønsi\n *\n * License: www.highcharts.com/license\n */\n\n/* \n * See www.highcharts.com/studies/world-map.htm for use case.\n *\n * To do:\n * - Optimize long variable names and alias adapter methods and Highcharts namespace variables\n * - Zoom and pan GUI\n */\n(function (Highcharts) {\n\tvar UNDEFINED,\n\t\tAxis = Highcharts.Axis,\n\t\tChart = Highcharts.Chart,\n\t\tPoint = Highcharts.Point,\n\t\tPointer = Highcharts.Pointer,\n\t\teach = Highcharts.each,\n\t\textend = Highcharts.extend,\n\t\tmerge = Highcharts.merge,\n\t\tpick = Highcharts.pick,\n\t\tnumberFormat = Highcharts.numberFormat,\n\t\tdefaultOptions = Highcharts.getOptions(),\n\t\tseriesTypes = Highcharts.seriesTypes,\n\t\tplotOptions = defaultOptions.plotOptions,\n\t\twrap = Highcharts.wrap,\n\t\tColor = Highcharts.Color,\n\t\tnoop = function () {};\n\n\t\n\n\t/*\n\t * Return an intermediate color between two colors, according to pos where 0\n\t * is the from color and 1 is the to color\n\t */\n\tfunction tweenColors(from, to, pos) {\n\t\tvar i = 4,\n\t\t\trgba = [];\n\n\t\twhile (i--) {\n\t\t\trgba[i] = Math.round(\n\t\t\t\tto.rgba[i] + (from.rgba[i] - to.rgba[i]) * (1 - pos)\n\t\t\t);\n\t\t}\n\t\treturn 'rgba(' + rgba.join(',') + ')';\n\t}\n\n\t// Set the default map navigation options\n\tdefaultOptions.mapNavigation = {\n\t\tbuttonOptions: {\n\t\t\talign: 'right',\n\t\t\tverticalAlign: 'bottom',\n\t\t\tx: 0,\n\t\t\twidth: 18,\n\t\t\theight: 18,\n\t\t\tstyle: {\n\t\t\t\tfontSize: '15px',\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\ttextAlign: 'center'\n\t\t\t}\n\t\t},\n\t\tbuttons: {\n\t\t\tzoomIn: {\n\t\t\t\tonclick: function () {\n\t\t\t\t\tthis.mapZoom(0.5);\n\t\t\t\t},\n\t\t\t\ttext: '+',\n\t\t\t\ty: -32\n\t\t\t},\n\t\t\tzoomOut: {\n\t\t\t\tonclick: function () {\n\t\t\t\t\tthis.mapZoom(2);\n\t\t\t\t},\n\t\t\t\ttext: '-',\n\t\t\t\ty: 0\n\t\t\t}\n\t\t}\n\t\t// enableButtons: false,\n\t\t// enableTouchZoom: false,\n\t\t// zoomOnDoubleClick: false,\n\t\t// zoomOnMouseWheel: false\n\n\t};\n\t\n\t/**\n\t * Utility for reading SVG paths directly.\n\t */\n\tHighcharts.splitPath = function (path) {\n\t\tvar i;\n\n\t\t// Move letters apart\n\t\tpath = path.replace(/([A-Za-z])/g, ' $1 ');\n\t\t// Trim\n\t\tpath = path.replace(/^\\s*/, \"\").replace(/\\s*$/, \"\");\n\t\t\n\t\t// Split on spaces and commas\n\t\tpath = path.split(/[ ,]+/);\n\t\t\n\t\t// Parse numbers\n\t\tfor (i = 0; i < path.length; i++) {\n\t\t\tif (!/[a-zA-Z]/.test(path[i])) {\n\t\t\t\tpath[i] = parseFloat(path[i]);\n\t\t\t}\n\t\t}\n\t\treturn path;\n\t};\n\n\t// A placeholder for map definitions\n\tHighcharts.maps = {};\n\t\n\t/**\n\t * Override to use the extreme coordinates from the SVG shape, not the\n\t * data values\n\t */\n\twrap(Axis.prototype, 'getSeriesExtremes', function (proceed) {\n\t\tvar isXAxis = this.isXAxis,\n\t\t\tdataMin,\n\t\t\tdataMax,\n\t\t\txData = [];\n\n\t\t// Remove the xData array and cache it locally so that the proceed method doesn't use it\n\t\teach(this.series, function (series, i) {\n\t\t\tif (series.useMapGeometry) {\n\t\t\t\txData[i] = series.xData;\n\t\t\t\tseries.xData = [];\n\t\t\t}\n\t\t});\n\n\t\t// Call base to reach normal cartesian series (like mappoint)\n\t\tproceed.call(this);\n\n\t\t// Run extremes logic for map and mapline\n\t\tdataMin = pick(this.dataMin, Number.MAX_VALUE);\n\t\tdataMax = pick(this.dataMax, Number.MIN_VALUE);\n\t\teach(this.series, function (series, i) {\n\t\t\tif (series.useMapGeometry) {\n\t\t\t\tdataMin = Math.min(dataMin, series[isXAxis ? 'minX' : 'minY']);\n\t\t\t\tdataMax = Math.max(dataMax, series[isXAxis ? 'maxX' : 'maxY']);\n\t\t\t\tseries.xData = xData[i]; // Reset xData array\n\t\t\t}\n\t\t});\n\t\t\n\t\tthis.dataMin = dataMin;\n\t\tthis.dataMax = dataMax;\n\t});\n\t\n\t/**\n\t * Override axis translation to make sure the aspect ratio is always kept\n\t */\n\twrap(Axis.prototype, 'setAxisTranslation', function (proceed) {\n\t\tvar chart = this.chart,\n\t\t\tmapRatio,\n\t\t\tplotRatio = chart.plotWidth / chart.plotHeight,\n\t\t\tisXAxis = this.isXAxis,\n\t\t\tadjustedAxisLength,\n\t\t\txAxis = chart.xAxis[0],\n\t\t\tpadAxis;\n\t\t\n\t\t// Run the parent method\n\t\tproceed.call(this);\n\t\t\n\t\t// On Y axis, handle both\n\t\tif (chart.options.chart.type === 'map' && !isXAxis && xAxis.transA !== UNDEFINED) {\n\t\t\t\n\t\t\t// Use the same translation for both axes\n\t\t\tthis.transA = xAxis.transA = Math.min(this.transA, xAxis.transA);\n\t\t\t\n\t\t\tmapRatio = (xAxis.max - xAxis.min) / (this.max - this.min);\n\t\t\t\n\t\t\t// What axis to pad to put the map in the middle\n\t\t\tpadAxis = mapRatio > plotRatio ? this : xAxis;\n\t\t\t\n\t\t\t// Pad it\n\t\t\tadjustedAxisLength = (padAxis.max - padAxis.min) * padAxis.transA;\n\t\t\tpadAxis.minPixelPadding = (padAxis.len - adjustedAxisLength) / 2;\n\t\t}\n\t});\n\n\n\t//--- Start zooming and panning features\n\n\twrap(Chart.prototype, 'render', function (proceed) {\n\t\tvar chart = this,\n\t\t\tmapNavigation = chart.options.mapNavigation;\n\n\t\tproceed.call(chart);\n\n\t\t// Render the plus and minus buttons\n\t\tchart.renderMapNavigation();\n\n\t\t// Add the double click event\n\t\tif (mapNavigation.zoomOnDoubleClick) {\n\t\t\tHighcharts.addEvent(chart.container, 'dblclick', function (e) {\n\t\t\t\tchart.pointer.onContainerDblClick(e);\n\t\t\t});\n\t\t}\n\n\t\t// Add the mousewheel event\n\t\tif (mapNavigation.zoomOnMouseWheel) {\n\t\t\tHighcharts.addEvent(chart.container, document.onmousewheel === undefined ? 'DOMMouseScroll' : 'mousewheel', function (e) {\n\t\t\t\tchart.pointer.onContainerMouseWheel(e);\n\t\t\t});\n\t\t}\n\t});\n\n\t// Extend the Pointer\n\textend(Pointer.prototype, {\n\n\t\t/**\n\t\t * The event handler for the doubleclick event\n\t\t */\n\t\tonContainerDblClick: function (e) {\n\t\t\tvar chart = this.chart;\n\n\t\t\te = this.normalize(e);\n\n\t\t\tif (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\n\t\t\t\tchart.mapZoom(\n\t\t\t\t\t0.5,\n\t\t\t\t\tchart.xAxis[0].toValue(e.chartX),\n\t\t\t\t\tchart.yAxis[0].toValue(e.chartY)\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The event handler for the mouse scroll event\n\t\t */\n\t\tonContainerMouseWheel: function (e) {\n\t\t\tvar chart = this.chart,\n\t\t\t\tdelta;\n\n\t\t\te = this.normalize(e);\n\n\t\t\t// Firefox uses e.detail, WebKit and IE uses wheelDelta\n\t\t\tdelta = e.detail || -(e.wheelDelta / 120);\n\t\t\tif (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\n\t\t\t\tchart.mapZoom(\n\t\t\t\t\tdelta > 0 ? 2 : 0.5,\n\t\t\t\t\tchart.xAxis[0].toValue(e.chartX),\n\t\t\t\t\tchart.yAxis[0].toValue(e.chartY)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\t// Implement the pinchType option\n\twrap(Pointer.prototype, 'init', function (proceed, chart, options) {\n\n\t\tproceed.call(this, chart, options);\n\n\t\t// Pinch status\n\t\tif (options.mapNavigation.enableTouchZoom) {\n\t\t\tthis.pinchX = this.pinchHor = \n\t\t\t\tthis.pinchY = this.pinchVert = true;\n\t\t}\n\t});\n\n\t// Add events to the Chart object itself\n\textend(Chart.prototype, {\n\t\trenderMapNavigation: function () {\n\t\t\tvar chart = this,\n\t\t\t\toptions = this.options.mapNavigation,\n\t\t\t\tbuttons = options.buttons,\n\t\t\t\tn,\n\t\t\t\tbutton,\n\t\t\t\tbuttonOptions,\n\t\t\t\touterHandler = function () { \n\t\t\t\t\tthis.handler.call(chart); \n\t\t\t\t};\n\n\t\t\tif (options.enableButtons) {\n\t\t\t\tfor (n in buttons) {\n\t\t\t\t\tif (buttons.hasOwnProperty(n)) {\n\t\t\t\t\t\tbuttonOptions = merge(options.buttonOptions, buttons[n]);\n\n\t\t\t\t\t\tbutton = chart.renderer.button(buttonOptions.text, 0, 0, outerHandler)\n\t\t\t\t\t\t\t.attr({\n\t\t\t\t\t\t\t\twidth: buttonOptions.width,\n\t\t\t\t\t\t\t\theight: buttonOptions.height\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.css(buttonOptions.style)\n\t\t\t\t\t\t\t.add();\n\t\t\t\t\t\tbutton.handler = buttonOptions.onclick;\n\t\t\t\t\t\tbutton.align(extend(buttonOptions, { width: button.width, height: button.height }), null, 'spacingBox');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fit an inner box to an outer. If the inner box overflows left or right, align it to the sides of the\n\t\t * outer. If it overflows both sides, fit it within the outer. This is a pattern that occurs more places\n\t\t * in Highcharts, perhaps it should be elevated to a common utility function.\n\t\t */\n\t\tfitToBox: function (inner, outer) {\n\t\t\teach([['x', 'width'], ['y', 'height']], function (dim) {\n\t\t\t\tvar pos = dim[0],\n\t\t\t\t\tsize = dim[1];\n\t\t\t\tif (inner[pos] + inner[size] > outer[pos] + outer[size]) { // right overflow\n\t\t\t\t\tif (inner[size] > outer[size]) { // the general size is greater, fit fully to outer\n\t\t\t\t\t\tinner[size] = outer[size];\n\t\t\t\t\t\tinner[pos] = outer[pos];\n\t\t\t\t\t} else { // align right\n\t\t\t\t\t\tinner[pos] = outer[pos] + outer[size] - inner[size];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (inner[size] > outer[size]) {\n\t\t\t\t\tinner[size] = outer[size];\n\t\t\t\t}\n\t\t\t\tif (inner[pos] < outer[pos]) {\n\t\t\t\t\tinner[pos] = outer[pos];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\n\t\t\treturn inner;\n\t\t},\n\n\t\t/**\n\t\t * Zoom the map in or out by a certain amount. Less than 1 zooms in, greater than 1 zooms out.\n\t\t */\n\t\tmapZoom: function (howMuch, centerXArg, centerYArg) {\n\n\t\t\tif (this.isMapZooming) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar chart = this,\n\t\t\t\txAxis = chart.xAxis[0],\n\t\t\t\txRange = xAxis.max - xAxis.min,\n\t\t\t\tcenterX = pick(centerXArg, xAxis.min + xRange / 2),\n\t\t\t\tnewXRange = xRange * howMuch,\n\t\t\t\tyAxis = chart.yAxis[0],\n\t\t\t\tyRange = yAxis.max - yAxis.min,\n\t\t\t\tcenterY = pick(centerYArg, yAxis.min + yRange / 2),\n\t\t\t\tnewYRange = yRange * howMuch,\n\t\t\t\tnewXMin = centerX - newXRange / 2,\n\t\t\t\tnewYMin = centerY - newYRange / 2,\n\t\t\t\tanimation = pick(chart.options.chart.animation, true),\n\t\t\t\tdelay,\n\t\t\t\tnewExt = chart.fitToBox({\n\t\t\t\t\tx: newXMin,\n\t\t\t\t\ty: newYMin,\n\t\t\t\t\twidth: newXRange,\n\t\t\t\t\theight: newYRange\n\t\t\t\t}, {\n\t\t\t\t\tx: xAxis.dataMin,\n\t\t\t\t\ty: yAxis.dataMin,\n\t\t\t\t\twidth: xAxis.dataMax - xAxis.dataMin,\n\t\t\t\t\theight: yAxis.dataMax - yAxis.dataMin\n\t\t\t\t});\n\n\t\t\txAxis.setExtremes(newExt.x, newExt.x + newExt.width, false);\n\t\t\tyAxis.setExtremes(newExt.y, newExt.y + newExt.height, false);\n\n\t\t\t// Prevent zooming until this one is finished animating\n\t\t\tdelay = animation ? animation.duration || 500 : 0;\n\t\t\tif (delay) {\n\t\t\t\tchart.isMapZooming = true;\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tchart.isMapZooming = false;\n\t\t\t\t}, delay);\n\t\t\t}\n\n\t\t\tchart.redraw();\n\t\t}\n\t});\n\t\n\t/**\n\t * Extend the default options with map options\n\t */\n\tplotOptions.map = merge(plotOptions.scatter, {\n\t\tanimation: false, // makes the complex shapes slow\n\t\tnullColor: '#F8F8F8',\n\t\tborderColor: 'silver',\n\t\tborderWidth: 1,\n\t\tmarker: null,\n\t\tstickyTracking: false,\n\t\tdataLabels: {\n\t\t\tverticalAlign: 'middle'\n\t\t},\n\t\tturboThreshold: 0,\n\t\ttooltip: {\n\t\t\tfollowPointer: true,\n\t\t\tpointFormat: '{point.name}: {point.y}<br/>'\n\t\t},\n\t\tstates: {\n\t\t\tnormal: {\n\t\t\t\tanimation: true\n\t\t\t}\n\t\t}\n\t});\n\n\tvar MapAreaPoint = Highcharts.extendClass(Point, {\n\t\t/**\n\t\t * Extend the Point object to split paths\n\t\t */\n\t\tapplyOptions: function (options, x) {\n\n\t\t\tvar point = Point.prototype.applyOptions.call(this, options, x);\n\n\t\t\tif (point.path && typeof point.path === 'string') {\n\t\t\t\tpoint.path = point.options.path = Highcharts.splitPath(point.path);\n\t\t\t}\n\n\t\t\treturn point;\n\t\t},\n\t\t/**\n\t\t * Stop the fade-out \n\t\t */\n\t\tonMouseOver: function () {\n\t\t\tclearTimeout(this.colorInterval);\n\t\t\tPoint.prototype.onMouseOver.call(this);\n\t\t},\n\t\t/**\n\t\t * Custom animation for tweening out the colors. Animation reduces blinking when hovering\n\t\t * over islands and coast lines. We run a custom implementation of animation becuase we\n\t\t * need to be able to run this independently from other animations like zoom redraw. Also,\n\t\t * adding color animation to the adapters would introduce almost the same amount of code.\n\t\t */\n\t\tonMouseOut: function () {\n\t\t\tvar point = this,\n\t\t\t\tstart = +new Date(),\n\t\t\t\tnormalColor = Color(point.options.color),\n\t\t\t\thoverColor = Color(point.pointAttr.hover.fill),\n\t\t\t\tanimation = point.series.options.states.normal.animation,\n\t\t\t\tduration = animation && (animation.duration || 500);\n\n\t\t\tif (duration && normalColor.rgba.length === 4 && hoverColor.rgba.length === 4) {\n\t\t\t\tdelete point.pointAttr[''].fill; // avoid resetting it in Point.setState\n\n\t\t\t\tclearTimeout(point.colorInterval);\n\t\t\t\tpoint.colorInterval = setInterval(function () {\n\t\t\t\t\tvar pos = (new Date() - start) / duration,\n\t\t\t\t\t\tgraphic = point.graphic;\n\t\t\t\t\tif (pos > 1) {\n\t\t\t\t\t\tpos = 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (graphic) {\n\t\t\t\t\t\tgraphic.attr('fill', tweenColors(hoverColor, normalColor, pos));\n\t\t\t\t\t}\n\t\t\t\t\tif (pos >= 1) {\n\t\t\t\t\t\tclearTimeout(point.colorInterval);\n\t\t\t\t\t}\n\t\t\t\t}, 13);\n\t\t\t}\n\t\t\tPoint.prototype.onMouseOut.call(point);\n\t\t}\n\t});\n\n\t/**\n\t * Add the series type\n\t */\n\tseriesTypes.map = Highcharts.extendClass(seriesTypes.scatter, {\n\t\ttype: 'map',\n\t\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n\t\t\tstroke: 'borderColor',\n\t\t\t'stroke-width': 'borderWidth',\n\t\t\tfill: 'color'\n\t\t},\n\t\tcolorKey: 'y',\n\t\tpointClass: MapAreaPoint,\n\t\ttrackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n\t\tgetSymbol: noop,\n\t\tsupportsDrilldown: true,\n\t\tgetExtremesFromAll: true,\n\t\tuseMapGeometry: true, // get axis extremes from paths, not values\n\t\tinit: function (chart) {\n\t\t\tvar series = this,\n\t\t\t\tvalueDecimals = chart.options.legend.valueDecimals,\n\t\t\t\tlegendItems = [],\n\t\t\t\tname,\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\tfromLabel,\n\t\t\t\ttoLabel,\n\t\t\t\tcolorRange,\n\t\t\t\tvalueRanges,\n\t\t\t\tgradientColor,\n\t\t\t\tgrad,\n\t\t\t\ttmpLabel,\n\t\t\t\thorizontal = chart.options.legend.layout === 'horizontal';\n\n\t\t\t\n\t\t\tHighcharts.Series.prototype.init.apply(this, arguments);\n\t\t\tcolorRange = series.options.colorRange;\n\t\t\tvalueRanges = series.options.valueRanges;\n\n\t\t\tif (valueRanges) {\n\t\t\t\teach(valueRanges, function (range) {\n\t\t\t\t\tfrom = range.from;\n\t\t\t\t\tto = range.to;\n\t\t\t\t\t\n\t\t\t\t\t// Assemble the default name. This can be overridden by legend.options.labelFormatter\n\t\t\t\t\tname = '';\n\t\t\t\t\tif (from === UNDEFINED) {\n\t\t\t\t\t\tname = '< ';\n\t\t\t\t\t} else if (to === UNDEFINED) {\n\t\t\t\t\t\tname = '> ';\n\t\t\t\t\t}\n\t\t\t\t\tif (from !== UNDEFINED) {\n\t\t\t\t\t\tname += numberFormat(from, valueDecimals);\n\t\t\t\t\t}\n\t\t\t\t\tif (from !== UNDEFINED && to !== UNDEFINED) {\n\t\t\t\t\t\tname += ' - ';\n\t\t\t\t\t}\n\t\t\t\t\tif (to !== UNDEFINED) {\n\t\t\t\t\t\tname += numberFormat(to, valueDecimals);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Add a mock object to the legend items\n\t\t\t\t\tlegendItems.push(Highcharts.extend({\n\t\t\t\t\t\tchart: series.chart,\n\t\t\t\t\t\tname: name,\n\t\t\t\t\t\toptions: {},\n\t\t\t\t\t\tdrawLegendSymbol: seriesTypes.area.prototype.drawLegendSymbol,\n\t\t\t\t\t\tvisible: true,\n\t\t\t\t\t\tsetState: function () {},\n\t\t\t\t\t\tsetVisible: function () {}\n\t\t\t\t\t}, range));\n\t\t\t\t});\n\t\t\t\tseries.legendItems = legendItems;\n\n\t\t\t} else if (colorRange) {\n\n\t\t\t\tfrom = colorRange.from;\n\t\t\t\tto = colorRange.to;\n\t\t\t\tfromLabel = colorRange.fromLabel;\n\t\t\t\ttoLabel = colorRange.toLabel;\n\n\t\t\t\t// Flips linearGradient variables and label text.\n\t\t\t\tgrad = horizontal ? [0, 0, 1, 0] : [0, 1, 0, 0]; \n\t\t\t\tif (!horizontal) {\n\t\t\t\t\ttmpLabel = fromLabel;\n\t\t\t\t\tfromLabel = toLabel;\n\t\t\t\t\ttoLabel = tmpLabel;\n\t\t\t\t} \n\n\t\t\t\t// Creates color gradient.\n\t\t\t\tgradientColor = {\n\t\t\t\t\tlinearGradient: { x1: grad[0], y1: grad[1], x2: grad[2], y2: grad[3] },\n\t\t\t\t\tstops: \n\t\t\t\t\t[\n\t\t\t\t\t\t[0, from],\n\t\t\t\t\t\t[1, to]\n\t\t\t\t\t]\n\t\t\t\t};\n\n\t\t\t\t// Add a mock object to the legend items.\n\t\t\t\tlegendItems = [{\n\t\t\t\t\tchart: series.chart,\n\t\t\t\t\toptions: {},\n\t\t\t\t\tfromLabel: fromLabel,\n\t\t\t\t\ttoLabel: toLabel,\n\t\t\t\t\tcolor: gradientColor,\n\t\t\t\t\tdrawLegendSymbol: this.drawLegendSymbolGradient,\n\t\t\t\t\tvisible: true,\n\t\t\t\t\tsetState: function () {},\n\t\t\t\t\tsetVisible: function () {}\n\t\t\t\t}];\n\n\t\t\t\tseries.legendItems = legendItems;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * If neither valueRanges nor colorRanges are defined, use basic area symbol.\n\t\t */\n\t\tdrawLegendSymbol: seriesTypes.area.prototype.drawLegendSymbol,\n\n\t\t/**\n\t\t * Gets the series' symbol in the legend and extended legend with more information.\n\t\t * \n\t\t * @param {Object} legend The legend object\n\t\t * @param {Object} item The series (this) or point\n\t\t */\n\t\tdrawLegendSymbolGradient: function (legend, item) {\n\t\t\tvar spacing = legend.options.symbolPadding,\n\t\t\t\tpadding = pick(legend.options.padding, 8),\n\t\t\t\tpositionY,\n\t\t\t\tpositionX,\n\t\t\t\tgradientSize = this.chart.renderer.fontMetrics(legend.options.itemStyle.fontSize).h,\n\t\t\t\thorizontal = legend.options.layout === 'horizontal',\n\t\t\t\tbox1,\n\t\t\t\tbox2,\n\t\t\t\tbox3,\n\t\t\t\trectangleLength = pick(legend.options.rectangleLength, 200);\n\n\t\t\t// Set local variables based on option.\n\t\t\tif (horizontal) {\n\t\t\t\tpositionY = -(spacing / 2);\n\t\t\t\tpositionX = 0;\n\t\t\t} else {\n\t\t\t\tpositionY = -rectangleLength + legend.baseline - (spacing / 2);\n\t\t\t\tpositionX = padding + gradientSize;\n\t\t\t}\n\n\t\t\t// Creates the from text.\n\t\t\titem.fromText = this.chart.renderer.text(\n\t\t\t\t\titem.fromLabel,\t// Text.\n\t\t\t\t\tpositionX,\t\t// Lower left x.\n\t\t\t\t\tpositionY\t\t// Lower left y.\n\t\t\t\t).attr({\n\t\t\t\t\tzIndex: 2\n\t\t\t\t}).add(item.legendGroup);\n\t\t\tbox1 = item.fromText.getBBox();\n\n\t\t\t// Creates legend symbol.\n\t\t\t// Ternary changes variables based on option.\n\t\t\titem.legendSymbol = this.chart.renderer.rect(\n\t\t\t\thorizontal ? box1.x + box1.width + spacing : box1.x - gradientSize - spacing,\t\t// Upper left x.\n\t\t\t\tbox1.y,\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Upper left y.\n\t\t\t\thorizontal ? rectangleLength : gradientSize,\t\t\t\t\t\t\t\t\t\t\t// Width.\n\t\t\t\thorizontal ? gradientSize : rectangleLength,\t\t\t\t\t\t\t\t\t\t// Height.\n\t\t\t\t2\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Corner radius.\n\t\t\t).attr({\n\t\t\t\tzIndex: 1\n\t\t\t}).add(item.legendGroup);\n\t\t\tbox2 = item.legendSymbol.getBBox();\n\n\t\t\t// Creates the to text.\n\t\t\t// Vertical coordinate changed based on option.\n\t\t\titem.toText = this.chart.renderer.text(\n\t\t\t\t\titem.toLabel,\n\t\t\t\t\tbox2.x + box2.width + spacing,\n\t\t\t\t\thorizontal ? positionY : box2.y + box2.height - spacing\n\t\t\t\t).attr({\n\t\t\t\t\tzIndex: 2\n\t\t\t\t}).add(item.legendGroup);\n\t\t\tbox3 = item.toText.getBBox();\n\n\t\t\t// Changes legend box settings based on option.\n\t\t\tif (horizontal) {\n\t\t\t\tlegend.offsetWidth = box1.width + box2.width + box3.width + (spacing * 2) + padding;\n\t\t\t\tlegend.itemY = gradientSize + padding;\n\t\t\t} else {\n\t\t\t\tlegend.offsetWidth = Math.max(box1.width, box3.width) + (spacing) + box2.width + padding;\n\t\t\t\tlegend.itemY = box2.height + padding;\n\t\t\t\tlegend.itemX = spacing;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get the bounding box of all paths in the map combined.\n\t\t */\n\t\tgetBox: function (paths) {\n\t\t\tvar maxX = Number.MIN_VALUE, \n\t\t\t\tminX =  Number.MAX_VALUE, \n\t\t\t\tmaxY = Number.MIN_VALUE, \n\t\t\t\tminY =  Number.MAX_VALUE;\n\t\t\t\n\t\t\t\n\t\t\t// Find the bounding box\n\t\t\teach(paths || this.options.data, function (point) {\n\t\t\t\tvar path = point.path,\n\t\t\t\t\ti = path.length,\n\t\t\t\t\teven = false, // while loop reads from the end\n\t\t\t\t\tpointMaxX = Number.MIN_VALUE, \n\t\t\t\t\tpointMinX =  Number.MAX_VALUE, \n\t\t\t\t\tpointMaxY = Number.MIN_VALUE, \n\t\t\t\t\tpointMinY =  Number.MAX_VALUE;\n\t\t\t\t\t\n\t\t\t\twhile (i--) {\n\t\t\t\t\tif (typeof path[i] === 'number' && !isNaN(path[i])) {\n\t\t\t\t\t\tif (even) { // even = x\n\t\t\t\t\t\t\tpointMaxX = Math.max(pointMaxX, path[i]);\n\t\t\t\t\t\t\tpointMinX = Math.min(pointMinX, path[i]);\n\t\t\t\t\t\t} else { // odd = Y\n\t\t\t\t\t\t\tpointMaxY = Math.max(pointMaxY, path[i]);\n\t\t\t\t\t\t\tpointMinY = Math.min(pointMinY, path[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\teven = !even;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Cache point bounding box for use to position data labels\n\t\t\t\tpoint._maxX = pointMaxX;\n\t\t\t\tpoint._minX = pointMinX;\n\t\t\t\tpoint._maxY = pointMaxY;\n\t\t\t\tpoint._minY = pointMinY;\n\n\t\t\t\tmaxX = Math.max(maxX, pointMaxX);\n\t\t\t\tminX = Math.min(minX, pointMinX);\n\t\t\t\tmaxY = Math.max(maxY, pointMaxY);\n\t\t\t\tminY = Math.min(minY, pointMinY);\n\t\t\t});\n\t\t\tthis.minY = minY;\n\t\t\tthis.maxY = maxY;\n\t\t\tthis.minX = minX;\n\t\t\tthis.maxX = maxX;\n\t\t\t\n\t\t},\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Translate the path so that it automatically fits into the plot area box\n\t\t * @param {Object} path\n\t\t */\n\t\ttranslatePath: function (path) {\n\t\t\t\n\t\t\tvar series = this,\n\t\t\t\teven = false, // while loop reads from the end\n\t\t\t\txAxis = series.xAxis,\n\t\t\t\tyAxis = series.yAxis,\n\t\t\t\ti;\n\t\t\t\t\n\t\t\t// Preserve the original\n\t\t\tpath = [].concat(path);\n\t\t\t\t\n\t\t\t// Do the translation\n\t\t\ti = path.length;\n\t\t\twhile (i--) {\n\t\t\t\tif (typeof path[i] === 'number') {\n\t\t\t\t\tif (even) { // even = x\n\t\t\t\t\t\tpath[i] = Math.round(xAxis.translate(path[i]));\n\t\t\t\t\t} else { // odd = Y\n\t\t\t\t\t\tpath[i] = Math.round(yAxis.len - yAxis.translate(path[i]));\n\t\t\t\t\t}\n\t\t\t\t\teven = !even;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn path;\n\t\t},\n\t\t\n\t\tsetData: function () {\n\t\t\tHighcharts.Series.prototype.setData.apply(this, arguments);\n\t\t\tthis.getBox();\n\t\t},\n\t\t\n\t\t/**\n\t\t * Add the path option for data points. Find the max value for color calculation.\n\t\t */\n\t\ttranslate: function () {\n\t\t\tvar series = this,\n\t\t\t\tdataMin = Number.MAX_VALUE,\n\t\t\t\tdataMax = Number.MIN_VALUE;\n\t\n\t\t\tseries.generatePoints();\n\t\n\t\t\teach(series.data, function (point) {\n\t\t\t\t\n\t\t\t\tpoint.shapeType = 'path';\n\t\t\t\tpoint.shapeArgs = {\n\t\t\t\t\td: series.translatePath(point.path)\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\t// TODO: do point colors in drawPoints instead of point.init\n\t\t\t\tif (typeof point.y === 'number') {\n\t\t\t\t\tif (point.y > dataMax) {\n\t\t\t\t\t\tdataMax = point.y;\n\t\t\t\t\t} else if (point.y < dataMin) {\n\t\t\t\t\t\tdataMin = point.y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tseries.translateColors(dataMin, dataMax);\n\t\t},\n\t\t\n\t\t/**\n\t\t * In choropleth maps, the color is a result of the value, so this needs translation too\n\t\t */\n\t\ttranslateColors: function (dataMin, dataMax) {\n\t\t\t\n\t\t\tvar seriesOptions = this.options,\n\t\t\t\tvalueRanges = seriesOptions.valueRanges,\n\t\t\t\tcolorRange = seriesOptions.colorRange,\n\t\t\t\tcolorKey = this.colorKey,\n\t\t\t\tfrom,\n\t\t\t\tto;\n\n\t\t\tif (colorRange) {\n\t\t\t\tfrom = Color(colorRange.from);\n\t\t\t\tto = Color(colorRange.to);\n\t\t\t}\n\t\t\t\n\t\t\teach(this.data, function (point) {\n\t\t\t\tvar value = point[colorKey],\n\t\t\t\t\trange,\n\t\t\t\t\tcolor,\n\t\t\t\t\ti,\n\t\t\t\t\tpos;\n\n\t\t\t\tif (valueRanges) {\n\t\t\t\t\ti = valueRanges.length;\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\trange = valueRanges[i];\n\t\t\t\t\t\tfrom = range.from;\n\t\t\t\t\t\tto = range.to;\n\t\t\t\t\t\tif ((from === UNDEFINED || value >= from) && (to === UNDEFINED || value <= to)) {\n\t\t\t\t\t\t\tcolor = range.color;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t} else if (colorRange && value !== undefined) {\n\n\t\t\t\t\tpos = 1 - ((dataMax - value) / (dataMax - dataMin));\n\t\t\t\t\tcolor = value === null ? seriesOptions.nullColor : tweenColors(from, to, pos);\n\t\t\t\t}\n\n\t\t\t\tif (color) {\n\t\t\t\t\tpoint.color = null; // reset from previous drilldowns, use of the same data options\n\t\t\t\t\tpoint.options.color = color;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t\n\t\tdrawGraph: noop,\n\t\t\n\t\t/**\n\t\t * We need the points' bounding boxes in order to draw the data labels, so \n\t\t * we skip it now and call if from drawPoints instead.\n\t\t */\n\t\tdrawDataLabels: noop,\n\t\t\n\t\t/** \n\t\t * Use the drawPoints method of column, that is able to handle simple shapeArgs.\n\t\t * Extend it by assigning the tooltip position.\n\t\t */\n\t\tdrawPoints: function () {\n\t\t\tvar series = this,\n\t\t\t\txAxis = series.xAxis,\n\t\t\t\tyAxis = series.yAxis,\n\t\t\t\tcolorKey = series.colorKey;\n\t\t\t\n\t\t\t// Make points pass test in drawing\n\t\t\teach(series.data, function (point) {\n\t\t\t\tpoint.plotY = 1; // pass null test in column.drawPoints\n\t\t\t\tif (point[colorKey] === null) {\n\t\t\t\t\tpoint[colorKey] = 0;\n\t\t\t\t\tpoint.isNull = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\t// Draw them\n\t\t\tseriesTypes.column.prototype.drawPoints.apply(series);\n\t\t\t\n\t\t\teach(series.data, function (point) {\n\n\t\t\t\tvar dataLabels = point.dataLabels,\n\t\t\t\t\tminX = xAxis.toPixels(point._minX, true),\n\t\t\t\t\tmaxX = xAxis.toPixels(point._maxX, true),\n\t\t\t\t\tminY = yAxis.toPixels(point._minY, true),\n\t\t\t\t\tmaxY = yAxis.toPixels(point._maxY, true);\n\n\t\t\t\tpoint.plotX = Math.round(minX + (maxX - minX) * pick(dataLabels && dataLabels.anchorX, 0.5));\n\t\t\t\tpoint.plotY = Math.round(minY + (maxY - minY) * pick(dataLabels && dataLabels.anchorY, 0.5)); \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t// Reset escaped null points\n\t\t\t\tif (point.isNull) {\n\t\t\t\t\tpoint[colorKey] = null;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Now draw the data labels\n\t\t\tHighcharts.Series.prototype.drawDataLabels.call(series);\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * Animate in the new series from the clicked point in the old series.\n\t\t * Depends on the drilldown.js module\n\t\t */\n\t\tanimateDrilldown: function (init) {\n\t\t\tvar toBox = this.chart.plotBox,\n\t\t\t\tlevel = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],\n\t\t\t\tfromBox = level.bBox,\n\t\t\t\tanimationOptions = this.chart.options.drilldown.animation,\n\t\t\t\tscale;\n\t\t\t\t\n\t\t\tif (!init) {\n\n\t\t\t\tscale = Math.min(fromBox.width / toBox.width, fromBox.height / toBox.height);\n\t\t\t\tlevel.shapeArgs = {\n\t\t\t\t\tscaleX: scale,\n\t\t\t\t\tscaleY: scale,\n\t\t\t\t\ttranslateX: fromBox.x,\n\t\t\t\t\ttranslateY: fromBox.y\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\t// TODO: Animate this.group instead\n\t\t\t\teach(this.points, function (point) {\n\n\t\t\t\t\tpoint.graphic\n\t\t\t\t\t\t.attr(level.shapeArgs)\n\t\t\t\t\t\t.animate({\n\t\t\t\t\t\t\tscaleX: 1,\n\t\t\t\t\t\t\tscaleY: 1,\n\t\t\t\t\t\t\ttranslateX: 0,\n\t\t\t\t\t\t\ttranslateY: 0\n\t\t\t\t\t\t}, animationOptions);\n\n\t\t\t\t});\n\n\t\t\t\tdelete this.animate;\n\t\t\t}\n\t\t\t\n\t\t},\n\n\t\t/**\n\t\t * When drilling up, pull out the individual point graphics from the lower series\n\t\t * and animate them into the origin point in the upper series.\n\t\t */\n\t\tanimateDrillupFrom: function (level) {\n\t\t\tseriesTypes.column.prototype.animateDrillupFrom.call(this, level);\n\t\t},\n\n\n\t\t/**\n\t\t * When drilling up, keep the upper series invisible until the lower series has\n\t\t * moved into place\n\t\t */\n\t\tanimateDrillupTo: function (init) {\n\t\t\tseriesTypes.column.prototype.animateDrillupTo.call(this, init);\n\t\t}\n\t});\n\n\n\t// The mapline series type\n\tplotOptions.mapline = merge(plotOptions.map, {\n\t\tlineWidth: 1,\n\t\tbackgroundColor: 'none'\n\t});\n\tseriesTypes.mapline = Highcharts.extendClass(seriesTypes.map, {\n\t\ttype: 'mapline',\n\t\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\n\t\t\tstroke: 'color',\n\t\t\t'stroke-width': 'lineWidth',\n\t\t\tfill: 'backgroundColor'\n\t\t},\n\t\tdrawLegendSymbol: seriesTypes.line.prototype.drawLegendSymbol\n\t});\n\n\t// The mappoint series type\n\tplotOptions.mappoint = merge(plotOptions.scatter, {\n\t\tdataLabels: {\n\t\t\tenabled: true,\n\t\t\tformat: '{point.name}',\n\t\t\tcolor: 'black',\n\t\t\tstyle: {\n\t\t\t\ttextShadow: '0 0 5px white'\n\t\t\t}\n\t\t}\n\t});\n\tseriesTypes.mappoint = Highcharts.extendClass(seriesTypes.scatter, {\n\t\ttype: 'mappoint'\n\t});\n\t\n\n\t\n\t/**\n\t * A wrapper for Chart with all the default values for a Map\n\t */\n\tHighcharts.Map = function (options, callback) {\n\t\t\n\t\tvar hiddenAxis = {\n\t\t\t\tendOnTick: false,\n\t\t\t\tgridLineWidth: 0,\n\t\t\t\tlabels: {\n\t\t\t\t\tenabled: false\n\t\t\t\t},\n\t\t\t\tlineWidth: 0,\n\t\t\t\tminPadding: 0,\n\t\t\t\tmaxPadding: 0,\n\t\t\t\tstartOnTick: false,\n\t\t\t\ttickWidth: 0,\n\t\t\t\ttitle: null\n\t\t\t},\n\t\t\tseriesOptions;\n\t\t\n\t\t// Don't merge the data\n\t\tseriesOptions = options.series;\n\t\toptions.series = null;\n\t\t\n\t\toptions = merge({\n\t\t\tchart: {\n\t\t\t\ttype: 'map',\n\t\t\t\tpanning: 'xy'\n\t\t\t},\n\t\t\txAxis: hiddenAxis,\n\t\t\tyAxis: merge(hiddenAxis, { reversed: true })\t\n\t\t},\n\t\toptions, // user's options\n\t\n\t\t{ // forced options\n\t\t\tchart: {\n\t\t\t\tinverted: false\n\t\t\t}\n\t\t});\n\t\n\t\toptions.series = seriesOptions;\n\t\n\t\n\t\treturn new Highcharts.Chart(options, callback);\n\t};\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/no-data-to-display.js",
    "content": "/*\n Highcharts JS v3.0.6 (2013-10-04)\n Plugin for displaying a message when there is no data visible in chart.\n\n (c) 2010-2013 Highsoft AS\n Author: Øystein Moseng\n\n License: www.highcharts.com/license\n*/\n(function(c){function f(){return!!this.points.length}function g(){this.hasData()?this.hideNoData():this.showNoData()}var d=c.seriesTypes,e=c.Chart.prototype,h=c.getOptions(),i=c.extend;i(h.lang,{noData:\"No data to display\"});h.noData={position:{x:0,y:0,align:\"center\",verticalAlign:\"middle\"},attr:{},style:{fontWeight:\"bold\",fontSize:\"12px\",color:\"#60606a\"}};d.pie.prototype.hasData=f;if(d.gauge)d.gauge.prototype.hasData=f;if(d.waterfall)d.waterfall.prototype.hasData=f;c.Series.prototype.hasData=function(){return this.dataMax!==\nvoid 0&&this.dataMin!==void 0};e.showNoData=function(a){var b=this.options,a=a||b.lang.noData,b=b.noData;if(!this.noDataLabel)this.noDataLabel=this.renderer.label(a,0,0,null,null,null,null,null,\"no-data\").attr(b.attr).css(b.style).add(),this.noDataLabel.align(i(this.noDataLabel.getBBox(),b.position),!1,\"plotBox\")};e.hideNoData=function(){if(this.noDataLabel)this.noDataLabel=this.noDataLabel.destroy()};e.hasData=function(){for(var a=this.series,b=a.length;b--;)if(a[b].hasData()&&!a[b].options.isInternal)return!0;\nreturn!1};e.callbacks.push(function(a){c.addEvent(a,\"load\",g);c.addEvent(a,\"redraw\",g)})})(Highcharts);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/modules/no-data-to-display.src.js",
    "content": "/**\n * @license Highcharts JS v3.0.6 (2013-10-04)\n * Plugin for displaying a message when there is no data visible in chart.\n *\n * (c) 2010-2013 Highsoft AS\n * Author: Øystein Moseng\n *\n * License: www.highcharts.com/license\n */\n\n(function (H) { // docs\n\t\n\tvar seriesTypes = H.seriesTypes,\n\t\tchartPrototype = H.Chart.prototype,\n\t\tdefaultOptions = H.getOptions(),\n\t\textend = H.extend;\n\n\t// Add language option\n\textend(defaultOptions.lang, {\n\t\tnoData: 'No data to display'\n\t});\n\t\n\t// Add default display options for message\n\tdefaultOptions.noData = {\n\t\tposition: {\n\t\t\tx: 0,\n\t\t\ty: 0,\t\t\t\n\t\t\talign: 'center',\n\t\t\tverticalAlign: 'middle'\n\t\t},\n\t\tattr: {\t\t\t\t\t\t\n\t\t},\n\t\tstyle: {\t\n\t\t\tfontWeight: 'bold',\t\t\n\t\t\tfontSize: '12px',\n\t\t\tcolor: '#60606a'\t\t\n\t\t}\n\t};\n\n\t/**\n\t * Define hasData functions for series. These return true if there are data points on this series within the plot area\n\t */\t\n\tfunction hasDataPie() {\n\t\treturn !!this.points.length; /* != 0 */\n\t}\n\n\tseriesTypes.pie.prototype.hasData = hasDataPie;\n\n\tif (seriesTypes.gauge) {\n\t\tseriesTypes.gauge.prototype.hasData = hasDataPie;\n\t}\n\n\tif (seriesTypes.waterfall) {\n\t\tseriesTypes.waterfall.prototype.hasData = hasDataPie;\n\t}\n\n\tH.Series.prototype.hasData = function () {\n\t\treturn this.dataMax !== undefined && this.dataMin !== undefined;\n\t};\n\t\n\t/**\n\t * Display a no-data message.\n\t *\n\t * @param {String} str An optional message to show in place of the default one \n\t */\n\tchartPrototype.showNoData = function (str) {\n\t\tvar chart = this,\n\t\t\toptions = chart.options,\n\t\t\ttext = str || options.lang.noData,\n\t\t\tnoDataOptions = options.noData;\n\n\t\tif (!chart.noDataLabel) {\n\t\t\tchart.noDataLabel = chart.renderer.label(text, 0, 0, null, null, null, null, null, 'no-data')\n\t\t\t\t.attr(noDataOptions.attr)\n\t\t\t\t.css(noDataOptions.style)\n\t\t\t\t.add();\n\t\t\tchart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position), false, 'plotBox');\n\t\t}\n\t};\n\n\t/**\n\t * Hide no-data message\t\n\t */\t\n\tchartPrototype.hideNoData = function () {\n\t\tvar chart = this;\n\t\tif (chart.noDataLabel) {\n\t\t\tchart.noDataLabel = chart.noDataLabel.destroy();\n\t\t}\n\t};\n\n\t/**\n\t * Returns true if there are data points within the plot area now\n\t */\t\n\tchartPrototype.hasData = function () {\n\t\tvar chart = this,\n\t\t\tseries = chart.series,\n\t\t\ti = series.length;\n\n\t\twhile (i--) {\n\t\t\tif (series[i].hasData() && !series[i].options.isInternal) { \n\t\t\t\treturn true;\n\t\t\t}\t\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Show no-data message if there is no data in sight. Otherwise, hide it.\n\t */\n\tfunction handleNoData() {\n\t\tvar chart = this;\n\t\tif (chart.hasData()) {\n\t\t\tchart.hideNoData();\n\t\t} else {\n\t\t\tchart.showNoData();\n\t\t}\n\t}\n\n\t/**\n\t * Add event listener to handle automatic display of no-data message\n\t */\n\tchartPrototype.callbacks.push(function (chart) {\n\t\tH.addEvent(chart, 'load', handleNoData);\n\t\tH.addEvent(chart, 'redraw', handleNoData);\n\t});\n\n}(Highcharts));\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/themes/dark-blue.js",
    "content": "/**\n * Dark blue theme for Highcharts JS\n * @author Torstein Hønsi\n */\n\nHighcharts.theme = {\n\tcolors: [\"#DDDF0D\", \"#55BF3B\", \"#DF5353\", \"#7798BF\", \"#aaeeee\", \"#ff0066\", \"#eeaaee\",\n\t\t\"#55BF3B\", \"#DF5353\", \"#7798BF\", \"#aaeeee\"],\n\tchart: {\n\t\tbackgroundColor: {\n\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },\n\t\t\tstops: [\n\t\t\t\t[0, 'rgb(48, 48, 96)'],\n\t\t\t\t[1, 'rgb(0, 0, 0)']\n\t\t\t]\n\t\t},\n\t\tborderColor: '#000000',\n\t\tborderWidth: 2,\n\t\tclassName: 'dark-container',\n\t\tplotBackgroundColor: 'rgba(255, 255, 255, .1)',\n\t\tplotBorderColor: '#CCCCCC',\n\t\tplotBorderWidth: 1\n\t},\n\ttitle: {\n\t\tstyle: {\n\t\t\tcolor: '#C0C0C0',\n\t\t\tfont: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n\t\t}\n\t},\n\tsubtitle: {\n\t\tstyle: {\n\t\t\tcolor: '#666666',\n\t\t\tfont: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n\t\t}\n\t},\n\txAxis: {\n\t\tgridLineColor: '#333333',\n\t\tgridLineWidth: 1,\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#A0A0A0'\n\t\t\t}\n\t\t},\n\t\tlineColor: '#A0A0A0',\n\t\ttickColor: '#A0A0A0',\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#CCC',\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tfontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n\t\t\t}\n\t\t}\n\t},\n\tyAxis: {\n\t\tgridLineColor: '#333333',\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#A0A0A0'\n\t\t\t}\n\t\t},\n\t\tlineColor: '#A0A0A0',\n\t\tminorTickInterval: null,\n\t\ttickColor: '#A0A0A0',\n\t\ttickWidth: 1,\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#CCC',\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tfontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\t\t\t}\n\t\t}\n\t},\n\ttooltip: {\n\t\tbackgroundColor: 'rgba(0, 0, 0, 0.75)',\n\t\tstyle: {\n\t\t\tcolor: '#F0F0F0'\n\t\t}\n\t},\n\ttoolbar: {\n\t\titemStyle: {\n\t\t\tcolor: 'silver'\n\t\t}\n\t},\n\tplotOptions: {\n\t\tline: {\n\t\t\tdataLabels: {\n\t\t\t\tcolor: '#CCC'\n\t\t\t},\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tspline: {\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tscatter: {\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tcandlestick: {\n\t\t\tlineColor: 'white'\n\t\t}\n\t},\n\tlegend: {\n\t\titemStyle: {\n\t\t\tfont: '9pt Trebuchet MS, Verdana, sans-serif',\n\t\t\tcolor: '#A0A0A0'\n\t\t},\n\t\titemHoverStyle: {\n\t\t\tcolor: '#FFF'\n\t\t},\n\t\titemHiddenStyle: {\n\t\t\tcolor: '#444'\n\t\t}\n\t},\n\tcredits: {\n\t\tstyle: {\n\t\t\tcolor: '#666'\n\t\t}\n\t},\n\tlabels: {\n\t\tstyle: {\n\t\t\tcolor: '#CCC'\n\t\t}\n\t},\n\n\tnavigation: {\n\t\tbuttonOptions: {\n\t\t\tsymbolStroke: '#DDDDDD',\n\t\t\thoverSymbolStroke: '#FFFFFF',\n\t\t\ttheme: {\n\t\t\t\tfill: {\n\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\tstops: [\n\t\t\t\t\t\t[0.4, '#606060'],\n\t\t\t\t\t\t[0.6, '#333333']\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\tstroke: '#000000'\n\t\t\t}\n\t\t}\n\t},\n\n\t// scroll charts\n\trangeSelector: {\n\t\tbuttonTheme: {\n\t\t\tfill: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\t\tstroke: '#000000',\n\t\t\tstyle: {\n\t\t\t\tcolor: '#CCC',\n\t\t\t\tfontWeight: 'bold'\n\t\t\t},\n\t\t\tstates: {\n\t\t\t\thover: {\n\t\t\t\t\tfill: {\n\t\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t[0.4, '#BBB'],\n\t\t\t\t\t\t\t[0.6, '#888']\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\tstroke: '#000000',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: 'white'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tselect: {\n\t\t\t\t\tfill: {\n\t\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t[0.1, '#000'],\n\t\t\t\t\t\t\t[0.3, '#333']\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\tstroke: '#000000',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: 'yellow'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tinputStyle: {\n\t\t\tbackgroundColor: '#333',\n\t\t\tcolor: 'silver'\n\t\t},\n\t\tlabelStyle: {\n\t\t\tcolor: 'silver'\n\t\t}\n\t},\n\n\tnavigator: {\n\t\thandles: {\n\t\t\tbackgroundColor: '#666',\n\t\t\tborderColor: '#AAA'\n\t\t},\n\t\toutlineColor: '#CCC',\n\t\tmaskFill: 'rgba(16, 16, 16, 0.5)',\n\t\tseries: {\n\t\t\tcolor: '#7798BF',\n\t\t\tlineColor: '#A6C7ED'\n\t\t}\n\t},\n\n\tscrollbar: {\n\t\tbarBackgroundColor: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\tbarBorderColor: '#CCC',\n\t\tbuttonArrowColor: '#CCC',\n\t\tbuttonBackgroundColor: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\tbuttonBorderColor: '#CCC',\n\t\trifleColor: '#FFF',\n\t\ttrackBackgroundColor: {\n\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\tstops: [\n\t\t\t\t[0, '#000'],\n\t\t\t\t[1, '#333']\n\t\t\t]\n\t\t},\n\t\ttrackBorderColor: '#666'\n\t},\n\n\t// special colors for some of the\n\tlegendBackgroundColor: 'rgba(0, 0, 0, 0.5)',\n\tlegendBackgroundColorSolid: 'rgb(35, 35, 70)',\n\tdataLabelsColor: '#444',\n\ttextColor: '#C0C0C0',\n\tmaskColor: 'rgba(255,255,255,0.3)'\n};\n\n// Apply the theme\nvar highchartsOptions = Highcharts.setOptions(Highcharts.theme);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/themes/dark-green.js",
    "content": "/**\n * Dark blue theme for Highcharts JS\n * @author Torstein Hønsi\n */\n\nHighcharts.theme = {\n\tcolors: [\"#DDDF0D\", \"#55BF3B\", \"#DF5353\", \"#7798BF\", \"#aaeeee\", \"#ff0066\", \"#eeaaee\",\n\t\t\"#55BF3B\", \"#DF5353\", \"#7798BF\", \"#aaeeee\"],\n\tchart: {\n\t\tbackgroundColor: {\n\t\t\tlinearGradient: [0, 0, 250, 500],\n\t\t\tstops: [\n\t\t\t\t[0, 'rgb(48, 96, 48)'],\n\t\t\t\t[1, 'rgb(0, 0, 0)']\n\t\t\t]\n\t\t},\n\t\tborderColor: '#000000',\n\t\tborderWidth: 2,\n\t\tclassName: 'dark-container',\n\t\tplotBackgroundColor: 'rgba(255, 255, 255, .1)',\n\t\tplotBorderColor: '#CCCCCC',\n\t\tplotBorderWidth: 1\n\t},\n\ttitle: {\n\t\tstyle: {\n\t\t\tcolor: '#C0C0C0',\n\t\t\tfont: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n\t\t}\n\t},\n\tsubtitle: {\n\t\tstyle: {\n\t\t\tcolor: '#666666',\n\t\t\tfont: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n\t\t}\n\t},\n\txAxis: {\n\t\tgridLineColor: '#333333',\n\t\tgridLineWidth: 1,\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#A0A0A0'\n\t\t\t}\n\t\t},\n\t\tlineColor: '#A0A0A0',\n\t\ttickColor: '#A0A0A0',\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#CCC',\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tfontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n\t\t\t}\n\t\t}\n\t},\n\tyAxis: {\n\t\tgridLineColor: '#333333',\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#A0A0A0'\n\t\t\t}\n\t\t},\n\t\tlineColor: '#A0A0A0',\n\t\tminorTickInterval: null,\n\t\ttickColor: '#A0A0A0',\n\t\ttickWidth: 1,\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#CCC',\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tfontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\t\t\t}\n\t\t}\n\t},\n\ttooltip: {\n\t\tbackgroundColor: 'rgba(0, 0, 0, 0.75)',\n\t\tstyle: {\n\t\t\tcolor: '#F0F0F0'\n\t\t}\n\t},\n\ttoolbar: {\n\t\titemStyle: {\n\t\t\tcolor: 'silver'\n\t\t}\n\t},\n\tplotOptions: {\n\t\tline: {\n\t\t\tdataLabels: {\n\t\t\t\tcolor: '#CCC'\n\t\t\t},\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tspline: {\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tscatter: {\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tcandlestick: {\n\t\t\tlineColor: 'white'\n\t\t}\n\t},\n\tlegend: {\n\t\titemStyle: {\n\t\t\tfont: '9pt Trebuchet MS, Verdana, sans-serif',\n\t\t\tcolor: '#A0A0A0'\n\t\t},\n\t\titemHoverStyle: {\n\t\t\tcolor: '#FFF'\n\t\t},\n\t\titemHiddenStyle: {\n\t\t\tcolor: '#444'\n\t\t}\n\t},\n\tcredits: {\n\t\tstyle: {\n\t\t\tcolor: '#666'\n\t\t}\n\t},\n\tlabels: {\n\t\tstyle: {\n\t\t\tcolor: '#CCC'\n\t\t}\n\t},\n\n\n\tnavigation: {\n\t\tbuttonOptions: {\n\t\t\tsymbolStroke: '#DDDDDD',\n\t\t\thoverSymbolStroke: '#FFFFFF',\n\t\t\ttheme: {\n\t\t\t\tfill: {\n\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\tstops: [\n\t\t\t\t\t\t[0.4, '#606060'],\n\t\t\t\t\t\t[0.6, '#333333']\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\tstroke: '#000000'\n\t\t\t}\n\t\t}\n\t},\n\n\t// scroll charts\n\trangeSelector: {\n\t\tbuttonTheme: {\n\t\t\tfill: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\t\tstroke: '#000000',\n\t\t\tstyle: {\n\t\t\t\tcolor: '#CCC',\n\t\t\t\tfontWeight: 'bold'\n\t\t\t},\n\t\t\tstates: {\n\t\t\t\thover: {\n\t\t\t\t\tfill: {\n\t\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t[0.4, '#BBB'],\n\t\t\t\t\t\t\t[0.6, '#888']\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\tstroke: '#000000',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: 'white'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tselect: {\n\t\t\t\t\tfill: {\n\t\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t[0.1, '#000'],\n\t\t\t\t\t\t\t[0.3, '#333']\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\tstroke: '#000000',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: 'yellow'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tinputStyle: {\n\t\t\tbackgroundColor: '#333',\n\t\t\tcolor: 'silver'\n\t\t},\n\t\tlabelStyle: {\n\t\t\tcolor: 'silver'\n\t\t}\n\t},\n\n\tnavigator: {\n\t\thandles: {\n\t\t\tbackgroundColor: '#666',\n\t\t\tborderColor: '#AAA'\n\t\t},\n\t\toutlineColor: '#CCC',\n\t\tmaskFill: 'rgba(16, 16, 16, 0.5)',\n\t\tseries: {\n\t\t\tcolor: '#7798BF',\n\t\t\tlineColor: '#A6C7ED'\n\t\t}\n\t},\n\n\tscrollbar: {\n\t\tbarBackgroundColor: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\tbarBorderColor: '#CCC',\n\t\tbuttonArrowColor: '#CCC',\n\t\tbuttonBackgroundColor: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\tbuttonBorderColor: '#CCC',\n\t\trifleColor: '#FFF',\n\t\ttrackBackgroundColor: {\n\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\tstops: [\n\t\t\t\t[0, '#000'],\n\t\t\t\t[1, '#333']\n\t\t\t]\n\t\t},\n\t\ttrackBorderColor: '#666'\n\t},\n\n\t// special colors for some of the\n\tlegendBackgroundColor: 'rgba(0, 0, 0, 0.5)',\n\tlegendBackgroundColorSolid: 'rgb(35, 35, 70)',\n\tdataLabelsColor: '#444',\n\ttextColor: '#C0C0C0',\n\tmaskColor: 'rgba(255,255,255,0.3)'\n};\n\n// Apply the theme\nvar highchartsOptions = Highcharts.setOptions(Highcharts.theme);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/themes/gray.js",
    "content": "/**\n * Gray theme for Highcharts JS\n * @author Torstein Hønsi\n */\n\nHighcharts.theme = {\n\tcolors: [\"#DDDF0D\", \"#7798BF\", \"#55BF3B\", \"#DF5353\", \"#aaeeee\", \"#ff0066\", \"#eeaaee\",\n\t\t\"#55BF3B\", \"#DF5353\", \"#7798BF\", \"#aaeeee\"],\n\tchart: {\n\t\tbackgroundColor: {\n\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\tstops: [\n\t\t\t\t[0, 'rgb(96, 96, 96)'],\n\t\t\t\t[1, 'rgb(16, 16, 16)']\n\t\t\t]\n\t\t},\n\t\tborderWidth: 0,\n\t\tborderRadius: 15,\n\t\tplotBackgroundColor: null,\n\t\tplotShadow: false,\n\t\tplotBorderWidth: 0\n\t},\n\ttitle: {\n\t\tstyle: {\n\t\t\tcolor: '#FFF',\n\t\t\tfont: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n\t\t}\n\t},\n\tsubtitle: {\n\t\tstyle: {\n\t\t\tcolor: '#DDD',\n\t\t\tfont: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n\t\t}\n\t},\n\txAxis: {\n\t\tgridLineWidth: 0,\n\t\tlineColor: '#999',\n\t\ttickColor: '#999',\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#999',\n\t\t\t\tfontWeight: 'bold'\n\t\t\t}\n\t\t},\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#AAA',\n\t\t\t\tfont: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n\t\t\t}\n\t\t}\n\t},\n\tyAxis: {\n\t\talternateGridColor: null,\n\t\tminorTickInterval: null,\n\t\tgridLineColor: 'rgba(255, 255, 255, .1)',\n\t\tminorGridLineColor: 'rgba(255,255,255,0.07)',\n\t\tlineWidth: 0,\n\t\ttickWidth: 0,\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#999',\n\t\t\t\tfontWeight: 'bold'\n\t\t\t}\n\t\t},\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#AAA',\n\t\t\t\tfont: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n\t\t\t}\n\t\t}\n\t},\n\tlegend: {\n\t\titemStyle: {\n\t\t\tcolor: '#CCC'\n\t\t},\n\t\titemHoverStyle: {\n\t\t\tcolor: '#FFF'\n\t\t},\n\t\titemHiddenStyle: {\n\t\t\tcolor: '#333'\n\t\t}\n\t},\n\tlabels: {\n\t\tstyle: {\n\t\t\tcolor: '#CCC'\n\t\t}\n\t},\n\ttooltip: {\n\t\tbackgroundColor: {\n\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\tstops: [\n\t\t\t\t[0, 'rgba(96, 96, 96, .8)'],\n\t\t\t\t[1, 'rgba(16, 16, 16, .8)']\n\t\t\t]\n\t\t},\n\t\tborderWidth: 0,\n\t\tstyle: {\n\t\t\tcolor: '#FFF'\n\t\t}\n\t},\n\n\n\tplotOptions: {\n\t\tseries: {\n\t\t\tshadow: true\n\t\t},\n\t\tline: {\n\t\t\tdataLabels: {\n\t\t\t\tcolor: '#CCC'\n\t\t\t},\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tspline: {\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tscatter: {\n\t\t\tmarker: {\n\t\t\t\tlineColor: '#333'\n\t\t\t}\n\t\t},\n\t\tcandlestick: {\n\t\t\tlineColor: 'white'\n\t\t}\n\t},\n\n\ttoolbar: {\n\t\titemStyle: {\n\t\t\tcolor: '#CCC'\n\t\t}\n\t},\n\n\tnavigation: {\n\t\tbuttonOptions: {\n\t\t\tsymbolStroke: '#DDDDDD',\n\t\t\thoverSymbolStroke: '#FFFFFF',\n\t\t\ttheme: {\n\t\t\t\tfill: {\n\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\tstops: [\n\t\t\t\t\t\t[0.4, '#606060'],\n\t\t\t\t\t\t[0.6, '#333333']\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\tstroke: '#000000'\n\t\t\t}\n\t\t}\n\t},\n\n\t// scroll charts\n\trangeSelector: {\n\t\tbuttonTheme: {\n\t\t\tfill: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\t\tstroke: '#000000',\n\t\t\tstyle: {\n\t\t\t\tcolor: '#CCC',\n\t\t\t\tfontWeight: 'bold'\n\t\t\t},\n\t\t\tstates: {\n\t\t\t\thover: {\n\t\t\t\t\tfill: {\n\t\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t[0.4, '#BBB'],\n\t\t\t\t\t\t\t[0.6, '#888']\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\tstroke: '#000000',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: 'white'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tselect: {\n\t\t\t\t\tfill: {\n\t\t\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\t\t\tstops: [\n\t\t\t\t\t\t\t[0.1, '#000'],\n\t\t\t\t\t\t\t[0.3, '#333']\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\tstroke: '#000000',\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tcolor: 'yellow'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tinputStyle: {\n\t\t\tbackgroundColor: '#333',\n\t\t\tcolor: 'silver'\n\t\t},\n\t\tlabelStyle: {\n\t\t\tcolor: 'silver'\n\t\t}\n\t},\n\n\tnavigator: {\n\t\thandles: {\n\t\t\tbackgroundColor: '#666',\n\t\t\tborderColor: '#AAA'\n\t\t},\n\t\toutlineColor: '#CCC',\n\t\tmaskFill: 'rgba(16, 16, 16, 0.5)',\n\t\tseries: {\n\t\t\tcolor: '#7798BF',\n\t\t\tlineColor: '#A6C7ED'\n\t\t}\n\t},\n\n\tscrollbar: {\n\t\tbarBackgroundColor: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\tbarBorderColor: '#CCC',\n\t\tbuttonArrowColor: '#CCC',\n\t\tbuttonBackgroundColor: {\n\t\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\t\tstops: [\n\t\t\t\t\t[0.4, '#888'],\n\t\t\t\t\t[0.6, '#555']\n\t\t\t\t]\n\t\t\t},\n\t\tbuttonBorderColor: '#CCC',\n\t\trifleColor: '#FFF',\n\t\ttrackBackgroundColor: {\n\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n\t\t\tstops: [\n\t\t\t\t[0, '#000'],\n\t\t\t\t[1, '#333']\n\t\t\t]\n\t\t},\n\t\ttrackBorderColor: '#666'\n\t},\n\n\t// special colors for some of the demo examples\n\tlegendBackgroundColor: 'rgba(48, 48, 48, 0.8)',\n\tlegendBackgroundColorSolid: 'rgb(70, 70, 70)',\n\tdataLabelsColor: '#444',\n\ttextColor: '#E0E0E0',\n\tmaskColor: 'rgba(255,255,255,0.3)'\n};\n\n// Apply the theme\nvar highchartsOptions = Highcharts.setOptions(Highcharts.theme);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/themes/grid.js",
    "content": "/**\n * Grid theme for Highcharts JS\n * @author Torstein Hønsi\n */\n\nHighcharts.theme = {\n\tcolors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],\n\tchart: {\n\t\tbackgroundColor: {\n\t\t\tlinearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },\n\t\t\tstops: [\n\t\t\t\t[0, 'rgb(255, 255, 255)'],\n\t\t\t\t[1, 'rgb(240, 240, 255)']\n\t\t\t]\n\t\t},\n\t\tborderWidth: 2,\n\t\tplotBackgroundColor: 'rgba(255, 255, 255, .9)',\n\t\tplotShadow: true,\n\t\tplotBorderWidth: 1\n\t},\n\ttitle: {\n\t\tstyle: {\n\t\t\tcolor: '#000',\n\t\t\tfont: 'bold 16px \"Trebuchet MS\", Verdana, sans-serif'\n\t\t}\n\t},\n\tsubtitle: {\n\t\tstyle: {\n\t\t\tcolor: '#666666',\n\t\t\tfont: 'bold 12px \"Trebuchet MS\", Verdana, sans-serif'\n\t\t}\n\t},\n\txAxis: {\n\t\tgridLineWidth: 1,\n\t\tlineColor: '#000',\n\t\ttickColor: '#000',\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#000',\n\t\t\t\tfont: '11px Trebuchet MS, Verdana, sans-serif'\n\t\t\t}\n\t\t},\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#333',\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tfontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\n\t\t\t}\n\t\t}\n\t},\n\tyAxis: {\n\t\tminorTickInterval: 'auto',\n\t\tlineColor: '#000',\n\t\tlineWidth: 1,\n\t\ttickWidth: 1,\n\t\ttickColor: '#000',\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#000',\n\t\t\t\tfont: '11px Trebuchet MS, Verdana, sans-serif'\n\t\t\t}\n\t\t},\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#333',\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tfontFamily: 'Trebuchet MS, Verdana, sans-serif'\n\t\t\t}\n\t\t}\n\t},\n\tlegend: {\n\t\titemStyle: {\n\t\t\tfont: '9pt Trebuchet MS, Verdana, sans-serif',\n\t\t\tcolor: 'black'\n\n\t\t},\n\t\titemHoverStyle: {\n\t\t\tcolor: '#039'\n\t\t},\n\t\titemHiddenStyle: {\n\t\t\tcolor: 'gray'\n\t\t}\n\t},\n\tlabels: {\n\t\tstyle: {\n\t\t\tcolor: '#99b'\n\t\t}\n\t},\n\n\tnavigation: {\n\t\tbuttonOptions: {\n\t\t\ttheme: {\n\t\t\t\tstroke: '#CCCCCC'\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Apply the theme\nvar highchartsOptions = Highcharts.setOptions(Highcharts.theme);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/highcharts/themes/skies.js",
    "content": "/**\n * Skies theme for Highcharts JS\n * @author Torstein Hønsi\n */\n\nHighcharts.theme = {\n\tcolors: [\"#514F78\", \"#42A07B\", \"#9B5E4A\", \"#72727F\", \"#1F949A\", \"#82914E\", \"#86777F\", \"#42A07B\"],\n\tchart: {\n\t\tclassName: 'skies',\n\t\tborderWidth: 0,\n\t\tplotShadow: true,\n\t\tplotBackgroundImage: 'http://www.highcharts.com/demo/gfx/skies.jpg',\n\t\tplotBackgroundColor: {\n\t\t\tlinearGradient: [0, 0, 250, 500],\n\t\t\tstops: [\n\t\t\t\t[0, 'rgba(255, 255, 255, 1)'],\n\t\t\t\t[1, 'rgba(255, 255, 255, 0)']\n\t\t\t]\n\t\t},\n\t\tplotBorderWidth: 1\n\t},\n\ttitle: {\n\t\tstyle: {\n\t\t\tcolor: '#3E576F',\n\t\t\tfont: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n\t\t}\n\t},\n\tsubtitle: {\n\t\tstyle: {\n\t\t\tcolor: '#6D869F',\n\t\t\tfont: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n\t\t}\n\t},\n\txAxis: {\n\t\tgridLineWidth: 0,\n\t\tlineColor: '#C0D0E0',\n\t\ttickColor: '#C0D0E0',\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#666',\n\t\t\t\tfontWeight: 'bold'\n\t\t\t}\n\t\t},\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#666',\n\t\t\t\tfont: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n\t\t\t}\n\t\t}\n\t},\n\tyAxis: {\n\t\talternateGridColor: 'rgba(255, 255, 255, .5)',\n\t\tlineColor: '#C0D0E0',\n\t\ttickColor: '#C0D0E0',\n\t\ttickWidth: 1,\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#666',\n\t\t\t\tfontWeight: 'bold'\n\t\t\t}\n\t\t},\n\t\ttitle: {\n\t\t\tstyle: {\n\t\t\t\tcolor: '#666',\n\t\t\t\tfont: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'\n\t\t\t}\n\t\t}\n\t},\n\tlegend: {\n\t\titemStyle: {\n\t\t\tfont: '9pt Trebuchet MS, Verdana, sans-serif',\n\t\t\tcolor: '#3E576F'\n\t\t},\n\t\titemHoverStyle: {\n\t\t\tcolor: 'black'\n\t\t},\n\t\titemHiddenStyle: {\n\t\t\tcolor: 'silver'\n\t\t}\n\t},\n\tlabels: {\n\t\tstyle: {\n\t\t\tcolor: '#3E576F'\n\t\t}\n\t}\n};\n\n// Apply the theme\nvar highchartsOptions = Highcharts.setOptions(Highcharts.theme);\n"
  },
  {
    "path": "static/common/user/uedit/third-party/jquery-1.10.2.js",
    "content": "/*!\n * jQuery JavaScript Library v1.10.2\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:48Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// Support: IE<10\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.10.2\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler\n\tcompleted = function( event ) {\n\n\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\t\tdetach();\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\t// Clean-up method for dom ready events\n\tdetach = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t\t} else {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\t\twindow.detachEvent( \"onload\", completed );\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( jQuery.support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn core_hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.10.2\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\n\t\t});\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val === undefined ?\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull :\n\t\tval;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function( support ) {\n\n\tvar all, a, input, select, fragment, opt, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Finish early in limited (non-browser) environments\n\tall = div.getElementsByTagName(\"*\") || [];\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !a || !a.style || !all.length ) {\n\t\treturn support;\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName(\"tbody\").length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName(\"link\").length;\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Make sure that element opacity exists\n\t// (IE uses filter instead)\n\t// Use a regex to work around a WebKit issue. See #5145\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!a.style.cssFloat;\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone = document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Will be defined later\n\tsupport.inlineBlockNeedsLayout = false;\n\tsupport.shrinkWrapBlocks = false;\n\tsupport.pixelPosition = false;\n\tsupport.deleteExpando = true;\n\tsupport.noCloneEvent = true;\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: IE<9\n\t// Iteration over object's inherited properties before its own.\n\tfor ( i in jQuery( support ) ) {\n\t\tbreak;\n\t}\n\tsupport.ownLast = i !== \"0\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior.\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t\t// Support: IE<8\n\t\t\t\tbody.style.zoom = 1;\n\t\t\t}\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})({});\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"applet\": true,\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\tdata = null,\n\t\t\ti = 0,\n\t\t\telem = this[0];\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf(\"data-\") === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar ret, hooks, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Use proper attribute retrieval(#6932, #12072)\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\telem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\t\tret = isXML ?\n\t\t\t\t\tundefined :\n\t\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\t\tnull;\n\t\t\tjQuery.expr.attrHandle[ name ] = fn;\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\tjQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =\n\t\t// Some attributes are constructed with empty-string values when not defined\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\t(ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t};\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ret.specified ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tcur = ret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\nvar iframe, getStyles, curCSS,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar len, styles,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Otherwise expose jQuery to the global object as usual\n\twindow.jQuery = window.$ = jQuery;\n\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n})( window );\n"
  },
  {
    "path": "static/common/user/uedit/third-party/video-js/video-js.css",
    "content": "/*!\nVideo.js Default Styles (http://videojs.com)\nVersion 4.3.0\nCreate your own skin at http://designer.videojs.com\n*/\n/* SKIN\n================================================================================\nThe main class name for all skin-specific styles. To make your own skin,\nreplace all occurances of 'vjs-default-skin' with a new name. Then add your new\nskin name to your video tag instead of the default skin.\ne.g. <video class=\"video-js my-skin-name\">\n*/\n.vjs-default-skin {\n  color: #cccccc;\n}\n/* Custom Icon Font\n--------------------------------------------------------------------------------\nThe control icons are from a custom font. Each icon corresponds to a character\n(e.g. \"\\e001\"). Font icons allow for easy scaling and coloring of icons.\n*/\n@font-face {\n  font-family: 'VideoJS';\n  src: url('font/vjs.eot');\n  src: url('font/vjs.eot?#iefix') format('embedded-opentype'), url('font/vjs.woff') format('woff'), url('font/vjs.ttf') format('truetype');\n  font-weight: normal;\n  font-style: normal;\n}\n/* Base UI Component Classes\n--------------------------------------------------------------------------------\n*/\n/* Slider - used for Volume bar and Seek bar */\n.vjs-default-skin .vjs-slider {\n  /* Replace browser focus hightlight with handle highlight */\n  outline: 0;\n  position: relative;\n  cursor: pointer;\n  padding: 0;\n  /* background-color-with-alpha */\n  background-color: #333333;\n  background-color: rgba(51, 51, 51, 0.9);\n}\n.vjs-default-skin .vjs-slider:focus {\n  /* box-shadow */\n  -webkit-box-shadow: 0 0 2em #ffffff;\n  -moz-box-shadow: 0 0 2em #ffffff;\n  box-shadow: 0 0 2em #ffffff;\n}\n.vjs-default-skin .vjs-slider-handle {\n  position: absolute;\n  /* Needed for IE6 */\n  left: 0;\n  top: 0;\n}\n.vjs-default-skin .vjs-slider-handle:before {\n  content: \"\\e009\";\n  font-family: VideoJS;\n  font-size: 1em;\n  line-height: 1;\n  text-align: center;\n  text-shadow: 0em 0em 1em #fff;\n  position: absolute;\n  top: 0;\n  left: 0;\n  /* Rotate the square icon to make a diamond */\n  /* transform */\n  -webkit-transform: rotate(-45deg);\n  -moz-transform: rotate(-45deg);\n  -ms-transform: rotate(-45deg);\n  -o-transform: rotate(-45deg);\n  transform: rotate(-45deg);\n}\n/* Control Bar\n--------------------------------------------------------------------------------\nThe default control bar that is a container for most of the controls.\n*/\n.vjs-default-skin .vjs-control-bar {\n  /* Start hidden */\n  display: none;\n  position: absolute;\n  /* Place control bar at the bottom of the player box/video.\n     If you want more margin below the control bar, add more height. */\n  bottom: 0;\n  /* Use left/right to stretch to 100% width of player div */\n  left: 0;\n  right: 0;\n  /* Height includes any margin you want above or below control items */\n  height: 3.0em;\n  /* background-color-with-alpha */\n  background-color: #07141e;\n  background-color: rgba(7, 20, 30, 0.7);\n}\n/* Show the control bar only once the video has started playing */\n.vjs-default-skin.vjs-has-started .vjs-control-bar {\n  display: block;\n  /* Visibility needed to make sure things hide in older browsers too. */\n\n  visibility: visible;\n  opacity: 1;\n  /* transition */\n  -webkit-transition: visibility 0.1s, opacity 0.1s;\n  -moz-transition: visibility 0.1s, opacity 0.1s;\n  -o-transition: visibility 0.1s, opacity 0.1s;\n  transition: visibility 0.1s, opacity 0.1s;\n}\n/* Hide the control bar when the video is playing and the user is inactive  */\n.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\n  display: block;\n  visibility: hidden;\n  opacity: 0;\n  /* transition */\n  -webkit-transition: visibility 1s, opacity 1s;\n  -moz-transition: visibility 1s, opacity 1s;\n  -o-transition: visibility 1s, opacity 1s;\n  transition: visibility 1s, opacity 1s;\n}\n.vjs-default-skin.vjs-controls-disabled .vjs-control-bar {\n  display: none;\n}\n.vjs-default-skin.vjs-using-native-controls .vjs-control-bar {\n  display: none;\n}\n/* IE8 is flakey with fonts, and you have to change the actual content to force\nfonts to show/hide properly.\n  - \"\\9\" IE8 hack didn't work for this\n  - Found in XP IE8 from http://modern.ie. Does not show up in \"IE8 mode\" in IE9\n*/\n@media \\0screen {\n  .vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before {\n    content: \"\";\n  }\n}\n/* General styles for individual controls. */\n.vjs-default-skin .vjs-control {\n  outline: none;\n  position: relative;\n  float: left;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n  height: 3.0em;\n  width: 4em;\n}\n/* FontAwsome button icons */\n.vjs-default-skin .vjs-control:before {\n  font-family: VideoJS;\n  font-size: 1.5em;\n  line-height: 2;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  text-align: center;\n  text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);\n}\n/* Replacement for focus outline */\n.vjs-default-skin .vjs-control:focus:before,\n.vjs-default-skin .vjs-control:hover:before {\n  text-shadow: 0em 0em 1em #ffffff;\n}\n.vjs-default-skin .vjs-control:focus {\n  /*  outline: 0; */\n  /* keyboard-only users cannot see the focus on several of the UI elements when\n  this is set to 0 */\n\n}\n/* Hide control text visually, but have it available for screenreaders */\n.vjs-default-skin .vjs-control-text {\n  /* hide-visually */\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n/* Play/Pause\n--------------------------------------------------------------------------------\n*/\n.vjs-default-skin .vjs-play-control {\n  width: 5em;\n  cursor: pointer;\n}\n.vjs-default-skin .vjs-play-control:before {\n  content: \"\\e001\";\n}\n.vjs-default-skin.vjs-playing .vjs-play-control:before {\n  content: \"\\e002\";\n}\n/* Volume/Mute\n-------------------------------------------------------------------------------- */\n.vjs-default-skin .vjs-mute-control,\n.vjs-default-skin .vjs-volume-menu-button {\n  cursor: pointer;\n  float: right;\n}\n.vjs-default-skin .vjs-mute-control:before,\n.vjs-default-skin .vjs-volume-menu-button:before {\n  content: \"\\e006\";\n}\n.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,\n.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before {\n  content: \"\\e003\";\n}\n.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,\n.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before {\n  content: \"\\e004\";\n}\n.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,\n.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before {\n  content: \"\\e005\";\n}\n.vjs-default-skin .vjs-volume-control {\n  width: 5em;\n  float: right;\n}\n.vjs-default-skin .vjs-volume-bar {\n  width: 5em;\n  height: 0.6em;\n  margin: 1.1em auto 0;\n}\n.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content {\n  height: 2.9em;\n}\n.vjs-default-skin .vjs-volume-level {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 0.5em;\n  background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;\n}\n.vjs-default-skin .vjs-volume-bar .vjs-volume-handle {\n  width: 0.5em;\n  height: 0.5em;\n}\n.vjs-default-skin .vjs-volume-handle:before {\n  font-size: 0.9em;\n  top: -0.2em;\n  left: -0.2em;\n  width: 1em;\n  height: 1em;\n}\n.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content {\n  width: 6em;\n  left: -4em;\n}\n/* Progress\n--------------------------------------------------------------------------------\n*/\n.vjs-default-skin .vjs-progress-control {\n  position: absolute;\n  left: 0;\n  right: 0;\n  width: auto;\n  font-size: 0.3em;\n  height: 1em;\n  /* Set above the rest of the controls. */\n  top: -1em;\n  /* Shrink the bar slower than it grows. */\n  /* transition */\n  -webkit-transition: all 0.4s;\n  -moz-transition: all 0.4s;\n  -o-transition: all 0.4s;\n  transition: all 0.4s;\n}\n/* On hover, make the progress bar grow to something that's more clickable.\n    This simply changes the overall font for the progress bar, and this\n    updates both the em-based widths and heights, as wells as the icon font */\n.vjs-default-skin:hover .vjs-progress-control {\n  font-size: .9em;\n  /* Even though we're not changing the top/height, we need to include them in\n      the transition so they're handled correctly. */\n\n  /* transition */\n  -webkit-transition: all 0.2s;\n  -moz-transition: all 0.2s;\n  -o-transition: all 0.2s;\n  transition: all 0.2s;\n}\n/* Box containing play and load progresses. Also acts as seek scrubber. */\n.vjs-default-skin .vjs-progress-holder {\n  height: 100%;\n}\n/* Progress Bars */\n.vjs-default-skin .vjs-progress-holder .vjs-play-progress,\n.vjs-default-skin .vjs-progress-holder .vjs-load-progress {\n  position: absolute;\n  display: block;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  /* Needed for IE6 */\n  left: 0;\n  top: 0;\n}\n.vjs-default-skin .vjs-play-progress {\n  /*\n    Using a data URI to create the white diagonal lines with a transparent\n      background. Surprisingly works in IE8.\n      Created using http://www.patternify.com\n    Changing the first color value will change the bar color.\n    Also using a paralax effect to make the lines move backwards.\n      The -50% left position makes that happen.\n  */\n\n  background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;\n}\n.vjs-default-skin .vjs-load-progress {\n  background: #646464 /* IE8- Fallback */;\n  background: rgba(255, 255, 255, 0.4);\n}\n.vjs-default-skin .vjs-seek-handle {\n  width: 1.5em;\n  height: 100%;\n}\n.vjs-default-skin .vjs-seek-handle:before {\n  padding-top: 0.1em /* Minor adjustment */;\n}\n/* Time Display\n--------------------------------------------------------------------------------\n*/\n.vjs-default-skin .vjs-time-controls {\n  font-size: 1em;\n  /* Align vertically by making the line height the same as the control bar */\n  line-height: 3em;\n}\n.vjs-default-skin .vjs-current-time {\n  float: left;\n}\n.vjs-default-skin .vjs-duration {\n  float: left;\n}\n/* Remaining time is in the HTML, but not included in default design */\n.vjs-default-skin .vjs-remaining-time {\n  display: none;\n  float: left;\n}\n.vjs-time-divider {\n  float: left;\n  line-height: 3em;\n}\n/* Fullscreen\n--------------------------------------------------------------------------------\n*/\n.vjs-default-skin .vjs-fullscreen-control {\n  width: 3.8em;\n  cursor: pointer;\n  float: right;\n}\n.vjs-default-skin .vjs-fullscreen-control:before {\n  content: \"\\e000\";\n}\n/* Switch to the exit icon when the player is in fullscreen */\n.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before {\n  content: \"\\e00b\";\n}\n/* Big Play Button (play button at start)\n--------------------------------------------------------------------------------\nPositioning of the play button in the center or other corners can be done more\neasily in the skin designer. http://designer.videojs.com/\n*/\n.vjs-default-skin .vjs-big-play-button {\n  left: 0.5em;\n  top: 0.5em;\n  font-size: 3em;\n  display: block;\n  z-index: 2;\n  position: absolute;\n  width: 4em;\n  height: 2.6em;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  opacity: 1;\n  /* Need a slightly gray bg so it can be seen on black backgrounds */\n  /* background-color-with-alpha */\n  background-color: #07141e;\n  background-color: rgba(7, 20, 30, 0.7);\n  border: 0.1em solid #3b4249;\n  /* border-radius */\n  -webkit-border-radius: 0.8em;\n  -moz-border-radius: 0.8em;\n  border-radius: 0.8em;\n  /* box-shadow */\n  -webkit-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);\n  -moz-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);\n  box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);\n  /* transition */\n  -webkit-transition: all 0.4s;\n  -moz-transition: all 0.4s;\n  -o-transition: all 0.4s;\n  transition: all 0.4s;\n}\n/* Optionally center */\n.vjs-default-skin.vjs-big-play-centered .vjs-big-play-button {\n  /* Center it horizontally */\n  left: 50%;\n  margin-left: -2.1em;\n  /* Center it vertically */\n  top: 50%;\n  margin-top: -1.4000000000000001em;\n}\n/* Hide if controls are disabled */\n.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button {\n  display: none;\n}\n/* Hide when video starts playing */\n.vjs-default-skin.vjs-has-started .vjs-big-play-button {\n  display: none;\n}\n/* Hide on mobile devices. Remove when we stop using native controls\n    by default on mobile  */\n.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button {\n  display: none;\n}\n.vjs-default-skin:hover .vjs-big-play-button,\n.vjs-default-skin .vjs-big-play-button:focus {\n  outline: 0;\n  border-color: #fff;\n  /* IE8 needs a non-glow hover state */\n  background-color: #505050;\n  background-color: rgba(50, 50, 50, 0.75);\n  /* box-shadow */\n  -webkit-box-shadow: 0 0 3em #ffffff;\n  -moz-box-shadow: 0 0 3em #ffffff;\n  box-shadow: 0 0 3em #ffffff;\n  /* transition */\n  -webkit-transition: all 0s;\n  -moz-transition: all 0s;\n  -o-transition: all 0s;\n  transition: all 0s;\n}\n.vjs-default-skin .vjs-big-play-button:before {\n  content: \"\\e001\";\n  font-family: VideoJS;\n  /* In order to center the play icon vertically we need to set the line height\n     to the same as the button height */\n\n  line-height: 2.6em;\n  text-shadow: 0.05em 0.05em 0.1em #000;\n  text-align: center /* Needed for IE8 */;\n  position: absolute;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n/* Loading Spinner\n--------------------------------------------------------------------------------\n*/\n.vjs-loading-spinner {\n  display: none;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  font-size: 4em;\n  line-height: 1;\n  width: 1em;\n  height: 1em;\n  margin-left: -0.5em;\n  margin-top: -0.5em;\n  opacity: 0.75;\n  /* animation */\n  -webkit-animation: spin 1.5s infinite linear;\n  -moz-animation: spin 1.5s infinite linear;\n  -o-animation: spin 1.5s infinite linear;\n  animation: spin 1.5s infinite linear;\n}\n.vjs-default-skin .vjs-loading-spinner:before {\n  content: \"\\e01e\";\n  font-family: VideoJS;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 1em;\n  height: 1em;\n  text-align: center;\n  text-shadow: 0em 0em 0.1em #000;\n}\n@-moz-keyframes spin {\n  0% {\n    -moz-transform: rotate(0deg);\n  }\n  100% {\n    -moz-transform: rotate(359deg);\n  }\n}\n@-webkit-keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n  }\n}\n@-o-keyframes spin {\n  0% {\n    -o-transform: rotate(0deg);\n  }\n  100% {\n    -o-transform: rotate(359deg);\n  }\n}\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(359deg);\n  }\n}\n/* Menu Buttons (Captions/Subtitles/etc.)\n--------------------------------------------------------------------------------\n*/\n.vjs-default-skin .vjs-menu-button {\n  float: right;\n  cursor: pointer;\n}\n.vjs-default-skin .vjs-menu {\n  display: none;\n  position: absolute;\n  bottom: 0;\n  left: 0em;\n  /* (Width of vjs-menu - width of button) / 2 */\n\n  width: 0em;\n  height: 0em;\n  margin-bottom: 3em;\n  border-left: 2em solid transparent;\n  border-right: 2em solid transparent;\n  border-top: 1.55em solid #000000;\n  /* Same width top as ul bottom */\n\n  border-top-color: rgba(7, 40, 50, 0.5);\n  /* Same as ul background */\n\n}\n/* Button Pop-up Menu */\n.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content {\n  display: block;\n  padding: 0;\n  margin: 0;\n  position: absolute;\n  width: 10em;\n  bottom: 1.5em;\n  /* Same bottom as vjs-menu border-top */\n\n  max-height: 15em;\n  overflow: auto;\n  left: -5em;\n  /* Width of menu - width of button / 2 */\n\n  /* background-color-with-alpha */\n  background-color: #07141e;\n  background-color: rgba(7, 20, 30, 0.7);\n  /* box-shadow */\n  -webkit-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);\n  -moz-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);\n  box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);\n}\n.vjs-default-skin .vjs-menu-button:hover .vjs-menu {\n  display: block;\n}\n.vjs-default-skin .vjs-menu-button ul li {\n  list-style: none;\n  margin: 0;\n  padding: 0.3em 0 0.3em 0;\n  line-height: 1.4em;\n  font-size: 1.2em;\n  text-align: center;\n  text-transform: lowercase;\n}\n.vjs-default-skin .vjs-menu-button ul li.vjs-selected {\n  background-color: #000;\n}\n.vjs-default-skin .vjs-menu-button ul li:focus,\n.vjs-default-skin .vjs-menu-button ul li:hover,\n.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,\n.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover {\n  outline: 0;\n  color: #111;\n  /* background-color-with-alpha */\n  background-color: #ffffff;\n  background-color: rgba(255, 255, 255, 0.75);\n  /* box-shadow */\n  -webkit-box-shadow: 0 0 1em #ffffff;\n  -moz-box-shadow: 0 0 1em #ffffff;\n  box-shadow: 0 0 1em #ffffff;\n}\n.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title {\n  text-align: center;\n  text-transform: uppercase;\n  font-size: 1em;\n  line-height: 2em;\n  padding: 0;\n  margin: 0 0 0.3em 0;\n  font-weight: bold;\n  cursor: default;\n}\n/* Subtitles Button */\n.vjs-default-skin .vjs-subtitles-button:before {\n  content: \"\\e00c\";\n}\n/* Captions Button */\n.vjs-default-skin .vjs-captions-button:before {\n  content: \"\\e008\";\n}\n/* Replacement for focus outline */\n.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,\n.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before {\n  /* box-shadow */\n  -webkit-box-shadow: 0 0 1em #ffffff;\n  -moz-box-shadow: 0 0 1em #ffffff;\n  box-shadow: 0 0 1em #ffffff;\n}\n/*\nREQUIRED STYLES (be careful overriding)\n================================================================================\nWhen loading the player, the video tag is replaced with a DIV,\nthat will hold the video tag or object tag for other playback methods.\nThe div contains the video playback element (Flash or HTML5) and controls,\nand sets the width and height of the video.\n\n** If you want to add some kind of border/padding (e.g. a frame), or special\npositioning, use another containing element. Otherwise you risk messing up\ncontrol positioning and full window mode. **\n*/\n.video-js {\n  background-color: #000;\n  position: relative;\n  padding: 0;\n  /* Start with 10px for base font size so other dimensions can be em based and\n     easily calculable. */\n\n  font-size: 10px;\n  /* Allow poster to be vertially aligned. */\n\n  vertical-align: middle;\n  /*  display: table-cell; */\n  /*This works in Safari but not Firefox.*/\n\n  /* Provide some basic defaults for fonts */\n\n  font-weight: normal;\n  font-style: normal;\n  /* Avoiding helvetica: issue #376 */\n\n  font-family: Arial, sans-serif;\n  /* Turn off user selection (text highlighting) by default.\n     The majority of player components will not be text blocks.\n     Text areas will need to turn user selection back on. */\n\n  /* user-select */\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n/* Playback technology elements expand to the width/height of the containing div\n    <video> or <object> */\n.video-js .vjs-tech {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n/* Fix for Firefox 9 fullscreen (only if it is enabled). Not needed when\n   checking fullScreenEnabled. */\n.video-js:-moz-full-screen {\n  position: absolute;\n}\n/* Fullscreen Styles */\nbody.vjs-full-window {\n  padding: 0;\n  margin: 0;\n  height: 100%;\n  /* Fix for IE6 full-window. http://www.cssplay.co.uk/layouts/fixed.html */\n  overflow-y: auto;\n}\n.video-js.vjs-fullscreen {\n  position: fixed;\n  overflow: hidden;\n  z-index: 1000;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  width: 100% !important;\n  height: 100% !important;\n  /* IE6 full-window (underscore hack) */\n  _position: absolute;\n}\n.video-js:-webkit-full-screen {\n  width: 100% !important;\n  height: 100% !important;\n}\n.video-js.vjs-fullscreen.vjs-user-inactive {\n  cursor: none;\n}\n/* Poster Styles */\n.vjs-poster {\n  background-repeat: no-repeat;\n  background-position: 50% 50%;\n  background-size: contain;\n  cursor: pointer;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  position: relative;\n  width: 100%;\n}\n.vjs-poster img {\n  display: block;\n  margin: 0 auto;\n  max-height: 100%;\n  padding: 0;\n  width: 100%;\n}\n/* Hide the poster when native controls are used otherwise it covers them */\n.video-js.vjs-using-native-controls .vjs-poster {\n  display: none;\n}\n/* Text Track Styles */\n/* Overall track holder for both captions and subtitles */\n.video-js .vjs-text-track-display {\n  text-align: center;\n  position: absolute;\n  bottom: 4em;\n  /* Leave padding on left and right */\n  left: 1em;\n  right: 1em;\n}\n/* Individual tracks */\n.video-js .vjs-text-track {\n  display: none;\n  font-size: 1.4em;\n  text-align: center;\n  margin-bottom: 0.1em;\n  /* Transparent black background, or fallback to all black (oldIE) */\n  /* background-color-with-alpha */\n  background-color: #000000;\n  background-color: rgba(0, 0, 0, 0.5);\n}\n.video-js .vjs-subtitles {\n  color: #ffffff /* Subtitles are white */;\n}\n.video-js .vjs-captions {\n  color: #ffcc66 /* Captions are yellow */;\n}\n.vjs-tt-cue {\n  display: block;\n}\n/* Hide disabled or unsupported controls */\n.vjs-default-skin .vjs-hidden {\n  display: none;\n}\n.vjs-lock-showing {\n  display: block !important;\n  opacity: 1;\n  visibility: visible;\n}\n/* -----------------------------------------------------------------------------\nThe original source of this file lives at\nhttps://github.com/videojs/video.js/blob/master/src/css/video-js.less */\n"
  },
  {
    "path": "static/common/user/uedit/third-party/video-js/video.dev.js",
    "content": "/**\n * @fileoverview Main function src.\n */\n\n// HTML5 Shiv. Must be in <head> to support older browsers.\ndocument.createElement('video');\ndocument.createElement('audio');\ndocument.createElement('track');\n\n/**\n * Doubles as the main function for users to create a player instance and also\n * the main library object.\n *\n * **ALIASES** videojs, _V_ (deprecated)\n *\n * The `vjs` function can be used to initialize or retrieve a player.\n *\n *     var myPlayer = vjs('my_video_id');\n *\n * @param  {String|Element} id      Video element or video element ID\n * @param  {Object=} options        Optional options object for config/settings\n * @param  {Function=} ready        Optional ready callback\n * @return {vjs.Player}             A player instance\n * @namespace\n */\nvar vjs = function(id, options, ready){\n  var tag; // Element of ID\n\n  // Allow for element or ID to be passed in\n  // String ID\n  if (typeof id === 'string') {\n\n    // Adjust for jQuery ID syntax\n    if (id.indexOf('#') === 0) {\n      id = id.slice(1);\n    }\n\n    // If a player instance has already been created for this ID return it.\n    if (vjs.players[id]) {\n      return vjs.players[id];\n\n    // Otherwise get element for ID\n    } else {\n      tag = vjs.el(id);\n    }\n\n  // ID is a media element\n  } else {\n    tag = id;\n  }\n\n  // Check for a useable element\n  if (!tag || !tag.nodeName) { // re: nodeName, could be a box div also\n    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns\n  }\n\n  // Element may have a player attr referring to an already created player instance.\n  // If not, set up a new player and return the instance.\n  return tag['player'] || new vjs.Player(tag, options, ready);\n};\n\n// Extended name, also available externally, window.videojs\nvar videojs = vjs;\nwindow.videojs = window.vjs = vjs;\n\n// CDN Version. Used to target right flash swf.\nvjs.CDN_VERSION = '4.3';\nvjs.ACCESS_PROTOCOL = ('https:' == document.location.protocol ? 'https://' : 'http://');\n\n/**\n * Global Player instance options, surfaced from vjs.Player.prototype.options_\n * vjs.options = vjs.Player.prototype.options_\n * All options should use string keys so they avoid\n * renaming by closure compiler\n * @type {Object}\n */\nvjs.options = {\n  // Default order of fallback technology\n  'techOrder': ['html5','flash'],\n  // techOrder: ['flash','html5'],\n\n  'html5': {},\n  'flash': {},\n\n  // Default of web browser is 300x150. Should rely on source width/height.\n  'width': 300,\n  'height': 150,\n  // defaultVolume: 0.85,\n  'defaultVolume': 0.00, // The freakin seaguls are driving me crazy!\n\n  // Included control sets\n  'children': {\n    'mediaLoader': {},\n    'posterImage': {},\n    'textTrackDisplay': {},\n    'loadingSpinner': {},\n    'bigPlayButton': {},\n    'controlBar': {}\n  },\n\n  // Default message to show when a video cannot be played.\n  'notSupportedMessage': 'Sorry, no compatible source and playback ' +\n      'technology were found for this video. Try using another browser ' +\n      'like <a href=\"http://bit.ly/ccMUEC\">Chrome</a> or download the ' +\n      'latest <a href=\"http://adobe.ly/mwfN1\">Adobe Flash Player</a>.'\n};\n\n// Set CDN Version of swf\n// The added (+) blocks the replace from changing this 4.3 string\nif (vjs.CDN_VERSION !== 'GENERATED'+'_CDN_VSN') {\n  videojs.options['flash']['swf'] = vjs.ACCESS_PROTOCOL + 'vjs.zencdn.net/'+vjs.CDN_VERSION+'/video-js.swf';\n}\n\n/**\n * Global player list\n * @type {Object}\n */\nvjs.players = {};\n/**\n * Core Object/Class for objects that use inheritance + contstructors\n *\n * To create a class that can be subclassed itself, extend the CoreObject class.\n *\n *     var Animal = CoreObject.extend();\n *     var Horse = Animal.extend();\n *\n * The constructor can be defined through the init property of an object argument.\n *\n *     var Animal = CoreObject.extend({\n *       init: function(name, sound){\n *         this.name = name;\n *       }\n *     });\n *\n * Other methods and properties can be added the same way, or directly to the\n * prototype.\n *\n *    var Animal = CoreObject.extend({\n *       init: function(name){\n *         this.name = name;\n *       },\n *       getName: function(){\n *         return this.name;\n *       },\n *       sound: '...'\n *    });\n *\n *    Animal.prototype.makeSound = function(){\n *      alert(this.sound);\n *    };\n *\n * To create an instance of a class, use the create method.\n *\n *    var fluffy = Animal.create('Fluffy');\n *    fluffy.getName(); // -> Fluffy\n *\n * Methods and properties can be overridden in subclasses.\n *\n *     var Horse = Animal.extend({\n *       sound: 'Neighhhhh!'\n *     });\n *\n *     var horsey = Horse.create('Horsey');\n *     horsey.getName(); // -> Horsey\n *     horsey.makeSound(); // -> Alert: Neighhhhh!\n *\n * @class\n * @constructor\n */\nvjs.CoreObject = vjs['CoreObject'] = function(){};\n// Manually exporting vjs['CoreObject'] here for Closure Compiler\n// because of the use of the extend/create class methods\n// If we didn't do this, those functions would get flattend to something like\n// `a = ...` and `this.prototype` would refer to the global object instead of\n// CoreObject\n\n/**\n * Create a new object that inherits from this Object\n *\n *     var Animal = CoreObject.extend();\n *     var Horse = Animal.extend();\n *\n * @param {Object} props Functions and properties to be applied to the\n *                       new object's prototype\n * @return {vjs.CoreObject} An object that inherits from CoreObject\n * @this {*}\n */\nvjs.CoreObject.extend = function(props){\n  var init, subObj;\n\n  props = props || {};\n  // Set up the constructor using the supplied init method\n  // or using the init of the parent object\n  // Make sure to check the unobfuscated version for external libs\n  init = props['init'] || props.init || this.prototype['init'] || this.prototype.init || function(){};\n  // In Resig's simple class inheritance (previously used) the constructor\n  //  is a function that calls `this.init.apply(arguments)`\n  // However that would prevent us from using `ParentObject.call(this);`\n  //  in a Child constuctor because the `this` in `this.init`\n  //  would still refer to the Child and cause an inifinite loop.\n  // We would instead have to do\n  //    `ParentObject.prototype.init.apply(this, argumnents);`\n  //  Bleh. We're not creating a _super() function, so it's good to keep\n  //  the parent constructor reference simple.\n  subObj = function(){\n    init.apply(this, arguments);\n  };\n\n  // Inherit from this object's prototype\n  subObj.prototype = vjs.obj.create(this.prototype);\n  // Reset the constructor property for subObj otherwise\n  // instances of subObj would have the constructor of the parent Object\n  subObj.prototype.constructor = subObj;\n\n  // Make the class extendable\n  subObj.extend = vjs.CoreObject.extend;\n  // Make a function for creating instances\n  subObj.create = vjs.CoreObject.create;\n\n  // Extend subObj's prototype with functions and other properties from props\n  for (var name in props) {\n    if (props.hasOwnProperty(name)) {\n      subObj.prototype[name] = props[name];\n    }\n  }\n\n  return subObj;\n};\n\n/**\n * Create a new instace of this Object class\n *\n *     var myAnimal = Animal.create();\n *\n * @return {vjs.CoreObject} An instance of a CoreObject subclass\n * @this {*}\n */\nvjs.CoreObject.create = function(){\n  // Create a new object that inherits from this object's prototype\n  var inst = vjs.obj.create(this.prototype);\n\n  // Apply this constructor function to the new object\n  this.apply(inst, arguments);\n\n  // Return the new object\n  return inst;\n};\n/**\n * @fileoverview Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)\n * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)\n * This should work very similarly to jQuery's events, however it's based off the book version which isn't as\n * robust as jquery's, so there's probably some differences.\n */\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n * @param  {Element|Object}   elem Element or object to bind listeners to\n * @param  {String}   type Type of event to bind to.\n * @param  {Function} fn   Event listener.\n * @private\n */\nvjs.on = function(elem, type, fn){\n  var data = vjs.getData(elem);\n\n  // We need a place to store all our handler data\n  if (!data.handlers) data.handlers = {};\n\n  if (!data.handlers[type]) data.handlers[type] = [];\n\n  if (!fn.guid) fn.guid = vjs.guid++;\n\n  data.handlers[type].push(fn);\n\n  if (!data.dispatcher) {\n    data.disabled = false;\n\n    data.dispatcher = function (event){\n\n      if (data.disabled) return;\n      event = vjs.fixEvent(event);\n\n      var handlers = data.handlers[event.type];\n\n      if (handlers) {\n        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.\n        var handlersCopy = handlers.slice(0);\n\n        for (var m = 0, n = handlersCopy.length; m < n; m++) {\n          if (event.isImmediatePropagationStopped()) {\n            break;\n          } else {\n            handlersCopy[m].call(elem, event);\n          }\n        }\n      }\n    };\n  }\n\n  if (data.handlers[type].length == 1) {\n    if (document.addEventListener) {\n      elem.addEventListener(type, data.dispatcher, false);\n    } else if (document.attachEvent) {\n      elem.attachEvent('on' + type, data.dispatcher);\n    }\n  }\n};\n\n/**\n * Removes event listeners from an element\n * @param  {Element|Object}   elem Object to remove listeners from\n * @param  {String=}   type Type of listener to remove. Don't include to remove all events from element.\n * @param  {Function} fn   Specific listener to remove. Don't incldue to remove listeners for an event type.\n * @private\n */\nvjs.off = function(elem, type, fn) {\n  // Don't want to add a cache object through getData if not needed\n  if (!vjs.hasData(elem)) return;\n\n  var data = vjs.getData(elem);\n\n  // If no events exist, nothing to unbind\n  if (!data.handlers) { return; }\n\n  // Utility function\n  var removeType = function(t){\n     data.handlers[t] = [];\n     vjs.cleanUpEvents(elem,t);\n  };\n\n  // Are we removing all bound events?\n  if (!type) {\n    for (var t in data.handlers) removeType(t);\n    return;\n  }\n\n  var handlers = data.handlers[type];\n\n  // If no handlers exist, nothing to unbind\n  if (!handlers) return;\n\n  // If no listener was provided, remove all listeners for type\n  if (!fn) {\n    removeType(type);\n    return;\n  }\n\n  // We're only removing a single handler\n  if (fn.guid) {\n    for (var n = 0; n < handlers.length; n++) {\n      if (handlers[n].guid === fn.guid) {\n        handlers.splice(n--, 1);\n      }\n    }\n  }\n\n  vjs.cleanUpEvents(elem, type);\n};\n\n/**\n * Clean up the listener cache and dispatchers\n * @param  {Element|Object} elem Element to clean up\n * @param  {String} type Type of event to clean up\n * @private\n */\nvjs.cleanUpEvents = function(elem, type) {\n  var data = vjs.getData(elem);\n\n  // Remove the events of a particular type if there are none left\n  if (data.handlers[type].length === 0) {\n    delete data.handlers[type];\n    // data.handlers[type] = null;\n    // Setting to null was causing an error with data.handlers\n\n    // Remove the meta-handler from the element\n    if (document.removeEventListener) {\n      elem.removeEventListener(type, data.dispatcher, false);\n    } else if (document.detachEvent) {\n      elem.detachEvent('on' + type, data.dispatcher);\n    }\n  }\n\n  // Remove the events object if there are no types left\n  if (vjs.isEmpty(data.handlers)) {\n    delete data.handlers;\n    delete data.dispatcher;\n    delete data.disabled;\n\n    // data.handlers = null;\n    // data.dispatcher = null;\n    // data.disabled = null;\n  }\n\n  // Finally remove the expando if there is no data left\n  if (vjs.isEmpty(data)) {\n    vjs.removeData(elem);\n  }\n};\n\n/**\n * Fix a native event to have standard property values\n * @param  {Object} event Event object to fix\n * @return {Object}\n * @private\n */\nvjs.fixEvent = function(event) {\n\n  function returnTrue() { return true; }\n  function returnFalse() { return false; }\n\n  // Test if fixing up is needed\n  // Used to check if !event.stopPropagation instead of isPropagationStopped\n  // But native events return true for stopPropagation, but don't have\n  // other expected methods like isPropagationStopped. Seems to be a problem\n  // with the Javascript Ninja code. So we're just overriding all events now.\n  if (!event || !event.isPropagationStopped) {\n    var old = event || window.event;\n\n    event = {};\n    // Clone the old object so that we can modify the values event = {};\n    // IE8 Doesn't like when you mess with native event properties\n    // Firefox returns false for event.hasOwnProperty('type') and other props\n    //  which makes copying more difficult.\n    // TODO: Probably best to create a whitelist of event props\n    for (var key in old) {\n      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y\n      if (key !== 'layerX' && key !== 'layerY') {\n        event[key] = old[key];\n      }\n    }\n\n    // The event occurred on this element\n    if (!event.target) {\n      event.target = event.srcElement || document;\n    }\n\n    // Handle which other element the event is related to\n    event.relatedTarget = event.fromElement === event.target ?\n      event.toElement :\n      event.fromElement;\n\n    // Stop the default browser action\n    event.preventDefault = function () {\n      if (old.preventDefault) {\n        old.preventDefault();\n      }\n      event.returnValue = false;\n      event.isDefaultPrevented = returnTrue;\n    };\n\n    event.isDefaultPrevented = returnFalse;\n\n    // Stop the event from bubbling\n    event.stopPropagation = function () {\n      if (old.stopPropagation) {\n        old.stopPropagation();\n      }\n      event.cancelBubble = true;\n      event.isPropagationStopped = returnTrue;\n    };\n\n    event.isPropagationStopped = returnFalse;\n\n    // Stop the event from bubbling and executing other handlers\n    event.stopImmediatePropagation = function () {\n      if (old.stopImmediatePropagation) {\n        old.stopImmediatePropagation();\n      }\n      event.isImmediatePropagationStopped = returnTrue;\n      event.stopPropagation();\n    };\n\n    event.isImmediatePropagationStopped = returnFalse;\n\n    // Handle mouse position\n    if (event.clientX != null) {\n      var doc = document.documentElement, body = document.body;\n\n      event.pageX = event.clientX +\n        (doc && doc.scrollLeft || body && body.scrollLeft || 0) -\n        (doc && doc.clientLeft || body && body.clientLeft || 0);\n      event.pageY = event.clientY +\n        (doc && doc.scrollTop || body && body.scrollTop || 0) -\n        (doc && doc.clientTop || body && body.clientTop || 0);\n    }\n\n    // Handle key presses\n    event.which = event.charCode || event.keyCode;\n\n    // Fix button for mouse clicks:\n    // 0 == left; 1 == middle; 2 == right\n    if (event.button != null) {\n      event.button = (event.button & 1 ? 0 :\n        (event.button & 4 ? 1 :\n          (event.button & 2 ? 2 : 0)));\n    }\n  }\n\n  // Returns fixed-up instance\n  return event;\n};\n\n/**\n * Trigger an event for an element\n * @param  {Element|Object} elem  Element to trigger an event on\n * @param  {String} event Type of event to trigger\n * @private\n */\nvjs.trigger = function(elem, event) {\n  // Fetches element data and a reference to the parent (for bubbling).\n  // Don't want to add a data object to cache for every parent,\n  // so checking hasData first.\n  var elemData = (vjs.hasData(elem)) ? vjs.getData(elem) : {};\n  var parent = elem.parentNode || elem.ownerDocument;\n      // type = event.type || event,\n      // handler;\n\n  // If an event name was passed as a string, creates an event out of it\n  if (typeof event === 'string') {\n    event = { type:event, target:elem };\n  }\n  // Normalizes the event properties.\n  event = vjs.fixEvent(event);\n\n  // If the passed element has a dispatcher, executes the established handlers.\n  if (elemData.dispatcher) {\n    elemData.dispatcher.call(elem, event);\n  }\n\n  // Unless explicitly stopped or the event does not bubble (e.g. media events)\n    // recursively calls this function to bubble the event up the DOM.\n    if (parent && !event.isPropagationStopped() && event.bubbles !== false) {\n    vjs.trigger(parent, event);\n\n  // If at the top of the DOM, triggers the default action unless disabled.\n  } else if (!parent && !event.isDefaultPrevented()) {\n    var targetData = vjs.getData(event.target);\n\n    // Checks if the target has a default action for this event.\n    if (event.target[event.type]) {\n      // Temporarily disables event dispatching on the target as we have already executed the handler.\n      targetData.disabled = true;\n      // Executes the default action.\n      if (typeof event.target[event.type] === 'function') {\n        event.target[event.type]();\n      }\n      // Re-enables event dispatching.\n      targetData.disabled = false;\n    }\n  }\n\n  // Inform the triggerer if the default was prevented by returning false\n  return !event.isDefaultPrevented();\n  /* Original version of js ninja events wasn't complete.\n   * We've since updated to the latest version, but keeping this around\n   * for now just in case.\n   */\n  // // Added in attion to book. Book code was broke.\n  // event = typeof event === 'object' ?\n  //   event[vjs.expando] ?\n  //     event :\n  //     new vjs.Event(type, event) :\n  //   new vjs.Event(type);\n\n  // event.type = type;\n  // if (handler) {\n  //   handler.call(elem, event);\n  // }\n\n  // // Clean up the event in case it is being reused\n  // event.result = undefined;\n  // event.target = elem;\n};\n\n/**\n * Trigger a listener only once for an event\n * @param  {Element|Object}   elem Element or object to\n * @param  {String}   type\n * @param  {Function} fn\n * @private\n */\nvjs.one = function(elem, type, fn) {\n  var func = function(){\n    vjs.off(elem, type, func);\n    fn.apply(this, arguments);\n  };\n  func.guid = fn.guid = fn.guid || vjs.guid++;\n  vjs.on(elem, type, func);\n};\nvar hasOwnProp = Object.prototype.hasOwnProperty;\n\n/**\n * Creates an element and applies properties.\n * @param  {String=} tagName    Name of tag to be created.\n * @param  {Object=} properties Element properties to be applied.\n * @return {Element}\n * @private\n */\nvjs.createEl = function(tagName, properties){\n  var el, propName;\n\n  el = document.createElement(tagName || 'div');\n\n  for (propName in properties){\n    if (hasOwnProp.call(properties, propName)) {\n      //el[propName] = properties[propName];\n      // Not remembering why we were checking for dash\n      // but using setAttribute means you have to use getAttribute\n\n      // The check for dash checks for the aria-* attributes, like aria-label, aria-valuemin.\n      // The additional check for \"role\" is because the default method for adding attributes does not\n      // add the attribute \"role\". My guess is because it's not a valid attribute in some namespaces, although\n      // browsers handle the attribute just fine. The W3C allows for aria-* attributes to be used in pre-HTML5 docs.\n      // http://www.w3.org/TR/wai-aria-primer/#ariahtml. Using setAttribute gets around this problem.\n\n       if (propName.indexOf('aria-') !== -1 || propName=='role') {\n         el.setAttribute(propName, properties[propName]);\n       } else {\n         el[propName] = properties[propName];\n       }\n    }\n  }\n  return el;\n};\n\n/**\n * Uppercase the first letter of a string\n * @param  {String} string String to be uppercased\n * @return {String}\n * @private\n */\nvjs.capitalize = function(string){\n  return string.charAt(0).toUpperCase() + string.slice(1);\n};\n\n/**\n * Object functions container\n * @type {Object}\n * @private\n */\nvjs.obj = {};\n\n/**\n * Object.create shim for prototypal inheritance\n *\n * https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create\n *\n * @function\n * @param  {Object}   obj Object to use as prototype\n * @private\n */\n vjs.obj.create = Object.create || function(obj){\n  //Create a new function called 'F' which is just an empty object.\n  function F() {}\n\n  //the prototype of the 'F' function should point to the\n  //parameter of the anonymous function.\n  F.prototype = obj;\n\n  //create a new constructor function based off of the 'F' function.\n  return new F();\n};\n\n/**\n * Loop through each property in an object and call a function\n * whose arguments are (key,value)\n * @param  {Object}   obj Object of properties\n * @param  {Function} fn  Function to be called on each property.\n * @this {*}\n * @private\n */\nvjs.obj.each = function(obj, fn, context){\n  for (var key in obj) {\n    if (hasOwnProp.call(obj, key)) {\n      fn.call(context || this, key, obj[key]);\n    }\n  }\n};\n\n/**\n * Merge two objects together and return the original.\n * @param  {Object} obj1\n * @param  {Object} obj2\n * @return {Object}\n * @private\n */\nvjs.obj.merge = function(obj1, obj2){\n  if (!obj2) { return obj1; }\n  for (var key in obj2){\n    if (hasOwnProp.call(obj2, key)) {\n      obj1[key] = obj2[key];\n    }\n  }\n  return obj1;\n};\n\n/**\n * Merge two objects, and merge any properties that are objects\n * instead of just overwriting one. Uses to merge options hashes\n * where deeper default settings are important.\n * @param  {Object} obj1 Object to override\n * @param  {Object} obj2 Overriding object\n * @return {Object}      New object. Obj1 and Obj2 will be untouched.\n * @private\n */\nvjs.obj.deepMerge = function(obj1, obj2){\n  var key, val1, val2;\n\n  // make a copy of obj1 so we're not ovewriting original values.\n  // like prototype.options_ and all sub options objects\n  obj1 = vjs.obj.copy(obj1);\n\n  for (key in obj2){\n    if (hasOwnProp.call(obj2, key)) {\n      val1 = obj1[key];\n      val2 = obj2[key];\n\n      // Check if both properties are pure objects and do a deep merge if so\n      if (vjs.obj.isPlain(val1) && vjs.obj.isPlain(val2)) {\n        obj1[key] = vjs.obj.deepMerge(val1, val2);\n      } else {\n        obj1[key] = obj2[key];\n      }\n    }\n  }\n  return obj1;\n};\n\n/**\n * Make a copy of the supplied object\n * @param  {Object} obj Object to copy\n * @return {Object}     Copy of object\n * @private\n */\nvjs.obj.copy = function(obj){\n  return vjs.obj.merge({}, obj);\n};\n\n/**\n * Check if an object is plain, and not a dom node or any object sub-instance\n * @param  {Object} obj Object to check\n * @return {Boolean}     True if plain, false otherwise\n * @private\n */\nvjs.obj.isPlain = function(obj){\n  return !!obj\n    && typeof obj === 'object'\n    && obj.toString() === '[object Object]'\n    && obj.constructor === Object;\n};\n\n/**\n * Bind (a.k.a proxy or Context). A simple method for changing the context of a function\n   It also stores a unique id on the function so it can be easily removed from events\n * @param  {*}   context The object to bind as scope\n * @param  {Function} fn      The function to be bound to a scope\n * @param  {Number=}   uid     An optional unique ID for the function to be set\n * @return {Function}\n * @private\n */\nvjs.bind = function(context, fn, uid) {\n  // Make sure the function has a unique ID\n  if (!fn.guid) { fn.guid = vjs.guid++; }\n\n  // Create the new function that changes the context\n  var ret = function() {\n    return fn.apply(context, arguments);\n  };\n\n  // Allow for the ability to individualize this function\n  // Needed in the case where multiple objects might share the same prototype\n  // IF both items add an event listener with the same function, then you try to remove just one\n  // it will remove both because they both have the same guid.\n  // when using this, you need to use the bind method when you remove the listener as well.\n  // currently used in text tracks\n  ret.guid = (uid) ? uid + '_' + fn.guid : fn.guid;\n\n  return ret;\n};\n\n/**\n * Element Data Store. Allows for binding data to an element without putting it directly on the element.\n * Ex. Event listneres are stored here.\n * (also from jsninja.com, slightly modified and updated for closure compiler)\n * @type {Object}\n * @private\n */\nvjs.cache = {};\n\n/**\n * Unique ID for an element or function\n * @type {Number}\n * @private\n */\nvjs.guid = 1;\n\n/**\n * Unique attribute name to store an element's guid in\n * @type {String}\n * @constant\n * @private\n */\nvjs.expando = 'vdata' + (new Date()).getTime();\n\n/**\n * Returns the cache object where data for an element is stored\n * @param  {Element} el Element to store data for.\n * @return {Object}\n * @private\n */\nvjs.getData = function(el){\n  var id = el[vjs.expando];\n  if (!id) {\n    id = el[vjs.expando] = vjs.guid++;\n    vjs.cache[id] = {};\n  }\n  return vjs.cache[id];\n};\n\n/**\n * Returns the cache object where data for an element is stored\n * @param  {Element} el Element to store data for.\n * @return {Object}\n * @private\n */\nvjs.hasData = function(el){\n  var id = el[vjs.expando];\n  return !(!id || vjs.isEmpty(vjs.cache[id]));\n};\n\n/**\n * Delete data for the element from the cache and the guid attr from getElementById\n * @param  {Element} el Remove data for an element\n * @private\n */\nvjs.removeData = function(el){\n  var id = el[vjs.expando];\n  if (!id) { return; }\n  // Remove all stored data\n  // Changed to = null\n  // http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/\n  // vjs.cache[id] = null;\n  delete vjs.cache[id];\n\n  // Remove the expando property from the DOM node\n  try {\n    delete el[vjs.expando];\n  } catch(e) {\n    if (el.removeAttribute) {\n      el.removeAttribute(vjs.expando);\n    } else {\n      // IE doesn't appear to support removeAttribute on the document element\n      el[vjs.expando] = null;\n    }\n  }\n};\n\n/**\n * Check if an object is empty\n * @param  {Object}  obj The object to check for emptiness\n * @return {Boolean}\n * @private\n */\nvjs.isEmpty = function(obj) {\n  for (var prop in obj) {\n    // Inlude null properties as empty.\n    if (obj[prop] !== null) {\n      return false;\n    }\n  }\n  return true;\n};\n\n/**\n * Add a CSS class name to an element\n * @param {Element} element    Element to add class name to\n * @param {String} classToAdd Classname to add\n * @private\n */\nvjs.addClass = function(element, classToAdd){\n  if ((' '+element.className+' ').indexOf(' '+classToAdd+' ') == -1) {\n    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;\n  }\n};\n\n/**\n * Remove a CSS class name from an element\n * @param {Element} element    Element to remove from class name\n * @param {String} classToAdd Classname to remove\n * @private\n */\nvjs.removeClass = function(element, classToRemove){\n  var classNames, i;\n\n  if (element.className.indexOf(classToRemove) == -1) { return; }\n\n  classNames = element.className.split(' ');\n\n  // no arr.indexOf in ie8, and we don't want to add a big shim\n  for (i = classNames.length - 1; i >= 0; i--) {\n    if (classNames[i] === classToRemove) {\n      classNames.splice(i,1);\n    }\n  }\n\n  element.className = classNames.join(' ');\n};\n\n/**\n * Element for testing browser HTML5 video capabilities\n * @type {Element}\n * @constant\n * @private\n */\nvjs.TEST_VID = vjs.createEl('video');\n\n/**\n * Useragent for browser testing.\n * @type {String}\n * @constant\n * @private\n */\nvjs.USER_AGENT = navigator.userAgent;\n\n/**\n * Device is an iPhone\n * @type {Boolean}\n * @constant\n * @private\n */\nvjs.IS_IPHONE = (/iPhone/i).test(vjs.USER_AGENT);\nvjs.IS_IPAD = (/iPad/i).test(vjs.USER_AGENT);\nvjs.IS_IPOD = (/iPod/i).test(vjs.USER_AGENT);\nvjs.IS_IOS = vjs.IS_IPHONE || vjs.IS_IPAD || vjs.IS_IPOD;\n\nvjs.IOS_VERSION = (function(){\n  var match = vjs.USER_AGENT.match(/OS (\\d+)_/i);\n  if (match && match[1]) { return match[1]; }\n})();\n\nvjs.IS_ANDROID = (/Android/i).test(vjs.USER_AGENT);\nvjs.ANDROID_VERSION = (function() {\n  // This matches Android Major.Minor.Patch versions\n  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned\n  var match = vjs.USER_AGENT.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i),\n    major,\n    minor;\n\n  if (!match) {\n    return null;\n  }\n\n  major = match[1] && parseFloat(match[1]);\n  minor = match[2] && parseFloat(match[2]);\n\n  if (major && minor) {\n    return parseFloat(match[1] + '.' + match[2]);\n  } else if (major) {\n    return major;\n  } else {\n    return null;\n  }\n})();\n// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser\nvjs.IS_OLD_ANDROID = vjs.IS_ANDROID && (/webkit/i).test(vjs.USER_AGENT) && vjs.ANDROID_VERSION < 2.3;\n\nvjs.IS_FIREFOX = (/Firefox/i).test(vjs.USER_AGENT);\nvjs.IS_CHROME = (/Chrome/i).test(vjs.USER_AGENT);\n\nvjs.TOUCH_ENABLED = !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch);\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributs are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n * @param  {Element} tag Element from which to get tag attributes\n * @return {Object}\n * @private\n */\nvjs.getAttributeValues = function(tag){\n  var obj, knownBooleans, attrs, attrName, attrVal;\n\n  obj = {};\n\n  // known boolean attributes\n  // we can check for matching boolean properties, but older browsers\n  // won't know about HTML5 boolean attributes that we still read from\n  knownBooleans = ','+'autoplay,controls,loop,muted,default'+',';\n\n  if (tag && tag.attributes && tag.attributes.length > 0) {\n    attrs = tag.attributes;\n\n    for (var i = attrs.length - 1; i >= 0; i--) {\n      attrName = attrs[i].name;\n      attrVal = attrs[i].value;\n\n      // check for known booleans\n      // the matching element property will return a value for typeof\n      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(','+attrName+',') !== -1) {\n        // the value of an included boolean attribute is typically an empty\n        // string ('') which would equal false if we just check for a false value.\n        // we also don't want support bad code like autoplay='false'\n        attrVal = (attrVal !== null) ? true : false;\n      }\n\n      obj[attrName] = attrVal;\n    }\n  }\n\n  return obj;\n};\n\n/**\n * Get the computed style value for an element\n * From http://robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/\n * @param  {Element} el        Element to get style value for\n * @param  {String} strCssRule Style name\n * @return {String}            Style value\n * @private\n */\nvjs.getComputedDimension = function(el, strCssRule){\n  var strValue = '';\n  if(document.defaultView && document.defaultView.getComputedStyle){\n    strValue = document.defaultView.getComputedStyle(el, '').getPropertyValue(strCssRule);\n\n  } else if(el.currentStyle){\n    // IE8 Width/Height support\n    strValue = el['client'+strCssRule.substr(0,1).toUpperCase() + strCssRule.substr(1)] + 'px';\n  }\n  return strValue;\n};\n\n/**\n * Insert an element as the first child node of another\n * @param  {Element} child   Element to insert\n * @param  {[type]} parent Element to insert child into\n * @private\n */\nvjs.insertFirst = function(child, parent){\n  if (parent.firstChild) {\n    parent.insertBefore(child, parent.firstChild);\n  } else {\n    parent.appendChild(child);\n  }\n};\n\n/**\n * Object to hold browser support information\n * @type {Object}\n * @private\n */\nvjs.support = {};\n\n/**\n * Shorthand for document.getElementById()\n * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.\n * @param  {String} id  Element ID\n * @return {Element}    Element with supplied ID\n * @private\n */\nvjs.el = function(id){\n  if (id.indexOf('#') === 0) {\n    id = id.slice(1);\n  }\n\n  return document.getElementById(id);\n};\n\n/**\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n * @param  {Number} seconds Number of seconds to be turned into a string\n * @param  {Number} guide   Number (in seconds) to model the string after\n * @return {String}         Time formatted as H:MM:SS or M:SS\n * @private\n */\nvjs.formatTime = function(seconds, guide) {\n  // Default to using seconds as guide\n  guide = guide || seconds;\n  var s = Math.floor(seconds % 60),\n      m = Math.floor(seconds / 60 % 60),\n      h = Math.floor(seconds / 3600),\n      gm = Math.floor(guide / 60 % 60),\n      gh = Math.floor(guide / 3600);\n\n  // handle invalid times\n  if (isNaN(seconds) || seconds === Infinity) {\n    // '-' is false for all relational operators (e.g. <, >=) so this setting\n    // will add the minimum number of fields specified by the guide\n    h = m = s = '-';\n  }\n\n  // Check if we need to show hours\n  h = (h > 0 || gh > 0) ? h + ':' : '';\n\n  // If hours are showing, we may need to add a leading zero.\n  // Always show at least one digit of minutes.\n  m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';\n\n  // Check if leading zero is need for seconds\n  s = (s < 10) ? '0' + s : s;\n\n  return h + m + s;\n};\n\n// Attempt to block the ability to select text while dragging controls\nvjs.blockTextSelection = function(){\n  document.body.focus();\n  document.onselectstart = function () { return false; };\n};\n// Turn off text selection blocking\nvjs.unblockTextSelection = function(){ document.onselectstart = function () { return true; }; };\n\n/**\n * Trim whitespace from the ends of a string.\n * @param  {String} string String to trim\n * @return {String}        Trimmed string\n * @private\n */\nvjs.trim = function(str){\n  return (str+'').replace(/^\\s+|\\s+$/g, '');\n};\n\n/**\n * Should round off a number to a decimal place\n * @param  {Number} num Number to round\n * @param  {Number} dec Number of decimal places to round to\n * @return {Number}     Rounded number\n * @private\n */\nvjs.round = function(num, dec) {\n  if (!dec) { dec = 0; }\n  return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);\n};\n\n/**\n * Should create a fake TimeRange object\n * Mimics an HTML5 time range instance, which has functions that\n * return the start and end times for a range\n * TimeRanges are returned by the buffered() method\n * @param  {Number} start Start time in seconds\n * @param  {Number} end   End time in seconds\n * @return {Object}       Fake TimeRange object\n * @private\n */\nvjs.createTimeRange = function(start, end){\n  return {\n    length: 1,\n    start: function() { return start; },\n    end: function() { return end; }\n  };\n};\n\n/**\n * Simple http request for retrieving external files (e.g. text tracks)\n * @param  {String} url           URL of resource\n * @param  {Function=} onSuccess  Success callback\n * @param  {Function=} onError    Error callback\n * @private\n */\nvjs.get = function(url, onSuccess, onError){\n  var local, request;\n\n  if (typeof XMLHttpRequest === 'undefined') {\n    window.XMLHttpRequest = function () {\n      try { return new window.ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch (e) {}\n      try { return new window.ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch (f) {}\n      try { return new window.ActiveXObject('Msxml2.XMLHTTP'); } catch (g) {}\n      throw new Error('This browser does not support XMLHttpRequest.');\n    };\n  }\n\n  request = new XMLHttpRequest();\n  try {\n    request.open('GET', url);\n  } catch(e) {\n    onError(e);\n  }\n\n  local = (url.indexOf('file:') === 0 || (window.location.href.indexOf('file:') === 0 && url.indexOf('http') === -1));\n\n  request.onreadystatechange = function() {\n    if (request.readyState === 4) {\n      if (request.status === 200 || local && request.status === 0) {\n        onSuccess(request.responseText);\n      } else {\n        if (onError) {\n          onError();\n        }\n      }\n    }\n  };\n\n  try {\n    request.send();\n  } catch(e) {\n    if (onError) {\n      onError(e);\n    }\n  }\n};\n\n/**\n * Add to local storage (may removeable)\n * @private\n */\nvjs.setLocalStorage = function(key, value){\n  try {\n    // IE was throwing errors referencing the var anywhere without this\n    var localStorage = window.localStorage || false;\n    if (!localStorage) { return; }\n    localStorage[key] = value;\n  } catch(e) {\n    if (e.code == 22 || e.code == 1014) { // Webkit == 22 / Firefox == 1014\n      vjs.log('LocalStorage Full (VideoJS)', e);\n    } else {\n      if (e.code == 18) {\n        vjs.log('LocalStorage not allowed (VideoJS)', e);\n      } else {\n        vjs.log('LocalStorage Error (VideoJS)', e);\n      }\n    }\n  }\n};\n\n/**\n * Get abosolute version of relative URL. Used to tell flash correct URL.\n * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue\n * @param  {String} url URL to make absolute\n * @return {String}     Absolute URL\n * @private\n */\nvjs.getAbsoluteURL = function(url){\n\n  // Check if absolute URL\n  if (!url.match(/^https?:\\/\\//)) {\n    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.\n    url = vjs.createEl('div', {\n      innerHTML: '<a href=\"'+url+'\">x</a>'\n    }).firstChild.href;\n  }\n\n  return url;\n};\n\n// usage: log('inside coolFunc',this,arguments);\n// http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/\nvjs.log = function(){\n  vjs.log.history = vjs.log.history || [];   // store logs to an array for reference\n  vjs.log.history.push(arguments);\n  if(window.console){\n    window.console.log(Array.prototype.slice.call(arguments));\n  }\n};\n\n// Offset Left\n// getBoundingClientRect technique from John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/\nvjs.findPosition = function(el) {\n    var box, docEl, body, clientLeft, scrollLeft, left, clientTop, scrollTop, top;\n\n    if (el.getBoundingClientRect && el.parentNode) {\n      box = el.getBoundingClientRect();\n    }\n\n    if (!box) {\n      return {\n        left: 0,\n        top: 0\n      };\n    }\n\n    docEl = document.documentElement;\n    body = document.body;\n\n    clientLeft = docEl.clientLeft || body.clientLeft || 0;\n    scrollLeft = window.pageXOffset || body.scrollLeft;\n    left = box.left + scrollLeft - clientLeft;\n\n    clientTop = docEl.clientTop || body.clientTop || 0;\n    scrollTop = window.pageYOffset || body.scrollTop;\n    top = box.top + scrollTop - clientTop;\n\n    return {\n      left: left,\n      top: top\n    };\n};\n/**\n * @fileoverview Player Component - Base class for all UI objects\n *\n */\n\n/**\n * Base UI Component class\n *\n * Components are embeddable UI objects that are represented by both a\n * javascript object and an element in the DOM. They can be children of other\n * components, and can have many children themselves.\n *\n *     // adding a button to the player\n *     var button = player.addChild('button');\n *     button.el(); // -> button element\n *\n *     <div class=\"video-js\">\n *       <div class=\"vjs-button\">Button</div>\n *     </div>\n *\n * Components are also event emitters.\n *\n *     button.on('click', function(){\n *       console.log('Button Clicked!');\n *     });\n *\n *     button.trigger('customevent');\n *\n * @param {Object} player  Main Player\n * @param {Object=} options\n * @class\n * @constructor\n * @extends vjs.CoreObject\n */\nvjs.Component = vjs.CoreObject.extend({\n  /**\n   * the constructor funciton for the class\n   *\n   * @constructor\n   */\n  init: function(player, options, ready){\n    this.player_ = player;\n\n    // Make a copy of prototype.options_ to protect against overriding global defaults\n    this.options_ = vjs.obj.copy(this.options_);\n\n    // Updated options with supplied options\n    options = this.options(options);\n\n    // Get ID from options, element, or create using player ID and unique ID\n    this.id_ = options['id'] || ((options['el'] && options['el']['id']) ? options['el']['id'] : player.id() + '_component_' + vjs.guid++ );\n\n    this.name_ = options['name'] || null;\n\n    // Create element if one wasn't provided in options\n    this.el_ = options['el'] || this.createEl();\n\n    this.children_ = [];\n    this.childIndex_ = {};\n    this.childNameIndex_ = {};\n\n    // Add any child components in options\n    this.initChildren();\n\n    this.ready(ready);\n    // Don't want to trigger ready here or it will before init is actually\n    // finished for all children that run this constructor\n  }\n});\n\n/**\n * Dispose of the component and all child components\n */\nvjs.Component.prototype.dispose = function(){\n  this.trigger('dispose');\n\n  // Dispose all children.\n  if (this.children_) {\n    for (var i = this.children_.length - 1; i >= 0; i--) {\n      if (this.children_[i].dispose) {\n        this.children_[i].dispose();\n      }\n    }\n  }\n\n  // Delete child references\n  this.children_ = null;\n  this.childIndex_ = null;\n  this.childNameIndex_ = null;\n\n  // Remove all event listeners.\n  this.off();\n\n  // Remove element from DOM\n  if (this.el_.parentNode) {\n    this.el_.parentNode.removeChild(this.el_);\n  }\n\n  vjs.removeData(this.el_);\n  this.el_ = null;\n};\n\n/**\n * Reference to main player instance\n *\n * @type {vjs.Player}\n * @private\n */\nvjs.Component.prototype.player_ = true;\n\n/**\n * Return the component's player\n *\n * @return {vjs.Player}\n */\nvjs.Component.prototype.player = function(){\n  return this.player_;\n};\n\n/**\n * The component's options object\n *\n * @type {Object}\n * @private\n */\nvjs.Component.prototype.options_;\n\n/**\n * Deep merge of options objects\n *\n * Whenever a property is an object on both options objects\n * the two properties will be merged using vjs.obj.deepMerge.\n *\n * This is used for merging options for child components. We\n * want it to be easy to override individual options on a child\n * component without having to rewrite all the other default options.\n *\n *     Parent.prototype.options_ = {\n *       children: {\n *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },\n *         'childTwo': {},\n *         'childThree': {}\n *       }\n *     }\n *     newOptions = {\n *       children: {\n *         'childOne': { 'foo': 'baz', 'abc': '123' }\n *         'childTwo': null,\n *         'childFour': {}\n *       }\n *     }\n *\n *     this.options(newOptions);\n *\n * RESULT\n *\n *     {\n *       children: {\n *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },\n *         'childTwo': null, // Disabled. Won't be initialized.\n *         'childThree': {},\n *         'childFour': {}\n *       }\n *     }\n *\n * @param  {Object} obj Object whose values will be overwritten\n * @return {Object}     NEW merged object. Does not return obj1.\n */\nvjs.Component.prototype.options = function(obj){\n  if (obj === undefined) return this.options_;\n\n  return this.options_ = vjs.obj.deepMerge(this.options_, obj);\n};\n\n/**\n * The DOM element for the component\n *\n * @type {Element}\n * @private\n */\nvjs.Component.prototype.el_;\n\n/**\n * Create the component's DOM element\n *\n * @param  {String=} tagName  Element's node type. e.g. 'div'\n * @param  {Object=} attributes An object of element attributes that should be set on the element\n * @return {Element}\n */\nvjs.Component.prototype.createEl = function(tagName, attributes){\n  return vjs.createEl(tagName, attributes);\n};\n\n/**\n * Get the component's DOM element\n *\n *     var domEl = myComponent.el();\n *\n * @return {Element}\n */\nvjs.Component.prototype.el = function(){\n  return this.el_;\n};\n\n/**\n * An optional element where, if defined, children will be inserted instead of\n * directly in `el_`\n *\n * @type {Element}\n * @private\n */\nvjs.Component.prototype.contentEl_;\n\n/**\n * Return the component's DOM element for embedding content.\n * Will either be el_ or a new element defined in createEl.\n *\n * @return {Element}\n */\nvjs.Component.prototype.contentEl = function(){\n  return this.contentEl_ || this.el_;\n};\n\n/**\n * The ID for the component\n *\n * @type {String}\n * @private\n */\nvjs.Component.prototype.id_;\n\n/**\n * Get the component's ID\n *\n *     var id = myComponent.id();\n *\n * @return {String}\n */\nvjs.Component.prototype.id = function(){\n  return this.id_;\n};\n\n/**\n * The name for the component. Often used to reference the component.\n *\n * @type {String}\n * @private\n */\nvjs.Component.prototype.name_;\n\n/**\n * Get the component's name. The name is often used to reference the component.\n *\n *     var name = myComponent.name();\n *\n * @return {String}\n */\nvjs.Component.prototype.name = function(){\n  return this.name_;\n};\n\n/**\n * Array of child components\n *\n * @type {Array}\n * @private\n */\nvjs.Component.prototype.children_;\n\n/**\n * Get an array of all child components\n *\n *     var kids = myComponent.children();\n *\n * @return {Array} The children\n */\nvjs.Component.prototype.children = function(){\n  return this.children_;\n};\n\n/**\n * Object of child components by ID\n *\n * @type {Object}\n * @private\n */\nvjs.Component.prototype.childIndex_;\n\n/**\n * Returns a child component with the provided ID\n *\n * @return {vjs.Component}\n */\nvjs.Component.prototype.getChildById = function(id){\n  return this.childIndex_[id];\n};\n\n/**\n * Object of child components by name\n *\n * @type {Object}\n * @private\n */\nvjs.Component.prototype.childNameIndex_;\n\n/**\n * Returns a child component with the provided ID\n *\n * @return {vjs.Component}\n */\nvjs.Component.prototype.getChild = function(name){\n  return this.childNameIndex_[name];\n};\n\n/**\n * Adds a child component inside this component\n *\n *     myComponent.el();\n *     // -> <div class='my-component'></div>\n *     myComonent.children();\n *     // [empty array]\n *\n *     var myButton = myComponent.addChild('MyButton');\n *     // -> <div class='my-component'><div class=\"my-button\">myButton<div></div>\n *     // -> myButton === myComonent.children()[0];\n *\n * Pass in options for child constructors and options for children of the child\n *\n *    var myButton = myComponent.addChild('MyButton', {\n *      text: 'Press Me',\n *      children: {\n *        buttonChildExample: {\n *          buttonChildOption: true\n *        }\n *      }\n *    });\n *\n * @param {String|vjs.Component} child The class name or instance of a child to add\n * @param {Object=} options Options, including options to be passed to children of the child.\n * @return {vjs.Component} The child component (created by this process if a string was used)\n * @suppress {accessControls|checkRegExp|checkTypes|checkVars|const|constantProperty|deprecated|duplicate|es5Strict|fileoverviewTags|globalThis|invalidCasts|missingProperties|nonStandardJsDocs|strictModuleDepCheck|undefinedNames|undefinedVars|unknownDefines|uselessCode|visibility}\n */\nvjs.Component.prototype.addChild = function(child, options){\n  var component, componentClass, componentName, componentId;\n\n  // If string, create new component with options\n  if (typeof child === 'string') {\n\n    componentName = child;\n\n    // Make sure options is at least an empty object to protect against errors\n    options = options || {};\n\n    // Assume name of set is a lowercased name of the UI Class (PlayButton, etc.)\n    componentClass = options['componentClass'] || vjs.capitalize(componentName);\n\n    // Set name through options\n    options['name'] = componentName;\n\n    // Create a new object & element for this controls set\n    // If there's no .player_, this is a player\n    // Closure Compiler throws an 'incomplete alias' warning if we use the vjs variable directly.\n    // Every class should be exported, so this should never be a problem here.\n    component = new window['videojs'][componentClass](this.player_ || this, options);\n\n  // child is a component instance\n  } else {\n    component = child;\n  }\n\n  this.children_.push(component);\n\n  if (typeof component.id === 'function') {\n    this.childIndex_[component.id()] = component;\n  }\n\n  // If a name wasn't used to create the component, check if we can use the\n  // name function of the component\n  componentName = componentName || (component.name && component.name());\n\n  if (componentName) {\n    this.childNameIndex_[componentName] = component;\n  }\n\n  // Add the UI object's element to the container div (box)\n  // Having an element is not required\n  if (typeof component['el'] === 'function' && component['el']()) {\n    this.contentEl().appendChild(component['el']());\n  }\n\n  // Return so it can stored on parent object if desired.\n  return component;\n};\n\n/**\n * Remove a child component from this component's list of children, and the\n * child component's element from this component's element\n *\n * @param  {vjs.Component} component Component to remove\n */\nvjs.Component.prototype.removeChild = function(component){\n  if (typeof component === 'string') {\n    component = this.getChild(component);\n  }\n\n  if (!component || !this.children_) return;\n\n  var childFound = false;\n  for (var i = this.children_.length - 1; i >= 0; i--) {\n    if (this.children_[i] === component) {\n      childFound = true;\n      this.children_.splice(i,1);\n      break;\n    }\n  }\n\n  if (!childFound) return;\n\n  this.childIndex_[component.id] = null;\n  this.childNameIndex_[component.name] = null;\n\n  var compEl = component.el();\n  if (compEl && compEl.parentNode === this.contentEl()) {\n    this.contentEl().removeChild(component.el());\n  }\n};\n\n/**\n * Add and initialize default child components from options\n *\n *     // when an instance of MyComponent is created, all children in options\n *     // will be added to the instance by their name strings and options\n *     MyComponent.prototype.options_.children = {\n *       myChildComponent: {\n *         myChildOption: true\n *       }\n *     }\n */\nvjs.Component.prototype.initChildren = function(){\n  var options = this.options_;\n\n  if (options && options['children']) {\n    var self = this;\n\n    // Loop through components and add them to the player\n    vjs.obj.each(options['children'], function(name, opts){\n      // Allow for disabling default components\n      // e.g. vjs.options['children']['posterImage'] = false\n      if (opts === false) return;\n\n      // Allow waiting to add components until a specific event is called\n      var tempAdd = function(){\n        // Set property name on player. Could cause conflicts with other prop names, but it's worth making refs easy.\n        self[name] = self.addChild(name, opts);\n      };\n\n      if (opts['loadEvent']) {\n        // this.one(opts.loadEvent, tempAdd)\n      } else {\n        tempAdd();\n      }\n    });\n  }\n};\n\n/**\n * Allows sub components to stack CSS class names\n *\n * @return {String} The constructed class name\n */\nvjs.Component.prototype.buildCSSClass = function(){\n    // Child classes can include a function that does:\n    // return 'CLASS NAME' + this._super();\n    return '';\n};\n\n/* Events\n============================================================================= */\n\n/**\n * Add an event listener to this component's element\n *\n *     var myFunc = function(){\n *       var myPlayer = this;\n *       // Do something when the event is fired\n *     };\n *\n *     myPlayer.on(\"eventName\", myFunc);\n *\n * The context will be the component.\n *\n * @param  {String}   type The event type e.g. 'click'\n * @param  {Function} fn   The event listener\n * @return {vjs.Component} self\n */\nvjs.Component.prototype.on = function(type, fn){\n  vjs.on(this.el_, type, vjs.bind(this, fn));\n  return this;\n};\n\n/**\n * Remove an event listener from the component's element\n *\n *     myComponent.off(\"eventName\", myFunc);\n *\n * @param  {String=}   type Event type. Without type it will remove all listeners.\n * @param  {Function=} fn   Event listener. Without fn it will remove all listeners for a type.\n * @return {vjs.Component}\n */\nvjs.Component.prototype.off = function(type, fn){\n  vjs.off(this.el_, type, fn);\n  return this;\n};\n\n/**\n * Add an event listener to be triggered only once and then removed\n *\n * @param  {String}   type Event type\n * @param  {Function} fn   Event listener\n * @return {vjs.Component}\n */\nvjs.Component.prototype.one = function(type, fn) {\n  vjs.one(this.el_, type, vjs.bind(this, fn));\n  return this;\n};\n\n/**\n * Trigger an event on an element\n *\n *     myComponent.trigger('eventName');\n *\n * @param  {String}       type  The event type to trigger, e.g. 'click'\n * @param  {Event|Object} event The event object to be passed to the listener\n * @return {vjs.Component}      self\n */\nvjs.Component.prototype.trigger = function(type, event){\n  vjs.trigger(this.el_, type, event);\n  return this;\n};\n\n/* Ready\n================================================================================ */\n/**\n * Is the component loaded\n * This can mean different things depending on the component.\n *\n * @private\n * @type {Boolean}\n */\nvjs.Component.prototype.isReady_;\n\n/**\n * Trigger ready as soon as initialization is finished\n *\n * Allows for delaying ready. Override on a sub class prototype.\n * If you set this.isReadyOnInitFinish_ it will affect all components.\n * Specially used when waiting for the Flash player to asynchrnously load.\n *\n * @type {Boolean}\n * @private\n */\nvjs.Component.prototype.isReadyOnInitFinish_ = true;\n\n/**\n * List of ready listeners\n *\n * @type {Array}\n * @private\n */\nvjs.Component.prototype.readyQueue_;\n\n/**\n * Bind a listener to the component's ready state\n *\n * Different from event listeners in that if the ready event has already happend\n * it will trigger the function immediately.\n *\n * @param  {Function} fn Ready listener\n * @return {vjs.Component}\n */\nvjs.Component.prototype.ready = function(fn){\n  if (fn) {\n    if (this.isReady_) {\n      fn.call(this);\n    } else {\n      if (this.readyQueue_ === undefined) {\n        this.readyQueue_ = [];\n      }\n      this.readyQueue_.push(fn);\n    }\n  }\n  return this;\n};\n\n/**\n * Trigger the ready listeners\n *\n * @return {vjs.Component}\n */\nvjs.Component.prototype.triggerReady = function(){\n  this.isReady_ = true;\n\n  var readyQueue = this.readyQueue_;\n\n  if (readyQueue && readyQueue.length > 0) {\n\n    for (var i = 0, j = readyQueue.length; i < j; i++) {\n      readyQueue[i].call(this);\n    }\n\n    // Reset Ready Queue\n    this.readyQueue_ = [];\n\n    // Allow for using event listeners also, in case you want to do something everytime a source is ready.\n    this.trigger('ready');\n  }\n};\n\n/* Display\n============================================================================= */\n\n/**\n * Add a CSS class name to the component's element\n *\n * @param {String} classToAdd Classname to add\n * @return {vjs.Component}\n */\nvjs.Component.prototype.addClass = function(classToAdd){\n  vjs.addClass(this.el_, classToAdd);\n  return this;\n};\n\n/**\n * Remove a CSS class name from the component's element\n *\n * @param {String} classToRemove Classname to remove\n * @return {vjs.Component}\n */\nvjs.Component.prototype.removeClass = function(classToRemove){\n  vjs.removeClass(this.el_, classToRemove);\n  return this;\n};\n\n/**\n * Show the component element if hidden\n *\n * @return {vjs.Component}\n */\nvjs.Component.prototype.show = function(){\n  this.el_.style.display = 'block';\n  return this;\n};\n\n/**\n * Hide the component element if hidden\n *\n * @return {vjs.Component}\n */\nvjs.Component.prototype.hide = function(){\n  this.el_.style.display = 'none';\n  return this;\n};\n\n/**\n * Lock an item in its visible state\n * To be used with fadeIn/fadeOut.\n *\n * @return {vjs.Component}\n * @private\n */\nvjs.Component.prototype.lockShowing = function(){\n  this.addClass('vjs-lock-showing');\n  return this;\n};\n\n/**\n * Unlock an item to be hidden\n * To be used with fadeIn/fadeOut.\n *\n * @return {vjs.Component}\n * @private\n */\nvjs.Component.prototype.unlockShowing = function(){\n  this.removeClass('vjs-lock-showing');\n  return this;\n};\n\n/**\n * Disable component by making it unshowable\n */\nvjs.Component.prototype.disable = function(){\n  this.hide();\n  this.show = function(){};\n};\n\n/**\n * Set or get the width of the component (CSS values)\n *\n * Video tag width/height only work in pixels. No percents.\n * But allowing limited percents use. e.g. width() will return number+%, not computed width\n *\n * @param  {Number|String=} num   Optional width number\n * @param  {Boolean} skipListeners Skip the 'resize' event trigger\n * @return {vjs.Component} Returns 'this' if width was set\n * @return {Number|String} Returns the width if nothing was set\n */\nvjs.Component.prototype.width = function(num, skipListeners){\n  return this.dimension('width', num, skipListeners);\n};\n\n/**\n * Get or set the height of the component (CSS values)\n *\n * @param  {Number|String=} num     New component height\n * @param  {Boolean=} skipListeners Skip the resize event trigger\n * @return {vjs.Component} The component if the height was set\n * @return {Number|String} The height if it wasn't set\n */\nvjs.Component.prototype.height = function(num, skipListeners){\n  return this.dimension('height', num, skipListeners);\n};\n\n/**\n * Set both width and height at the same time\n *\n * @param  {Number|String} width\n * @param  {Number|String} height\n * @return {vjs.Component} The component\n */\nvjs.Component.prototype.dimensions = function(width, height){\n  // Skip resize listeners on width for optimization\n  return this.width(width, true).height(height);\n};\n\n/**\n * Get or set width or height\n *\n * This is the shared code for the width() and height() methods.\n * All for an integer, integer + 'px' or integer + '%';\n *\n * Known issue: Hidden elements officially have a width of 0. We're defaulting\n * to the style.width value and falling back to computedStyle which has the\n * hidden element issue. Info, but probably not an efficient fix:\n * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/\n *\n * @param  {String} widthOrHeight  'width' or 'height'\n * @param  {Number|String=} num     New dimension\n * @param  {Boolean=} skipListeners Skip resize event trigger\n * @return {vjs.Component} The component if a dimension was set\n * @return {Number|String} The dimension if nothing was set\n * @private\n */\nvjs.Component.prototype.dimension = function(widthOrHeight, num, skipListeners){\n  if (num !== undefined) {\n\n    // Check if using css width/height (% or px) and adjust\n    if ((''+num).indexOf('%') !== -1 || (''+num).indexOf('px') !== -1) {\n      this.el_.style[widthOrHeight] = num;\n    } else if (num === 'auto') {\n      this.el_.style[widthOrHeight] = '';\n    } else {\n      this.el_.style[widthOrHeight] = num+'px';\n    }\n\n    // skipListeners allows us to avoid triggering the resize event when setting both width and height\n    if (!skipListeners) { this.trigger('resize'); }\n\n    // Return component\n    return this;\n  }\n\n  // Not setting a value, so getting it\n  // Make sure element exists\n  if (!this.el_) return 0;\n\n  // Get dimension value from style\n  var val = this.el_.style[widthOrHeight];\n  var pxIndex = val.indexOf('px');\n  if (pxIndex !== -1) {\n    // Return the pixel value with no 'px'\n    return parseInt(val.slice(0,pxIndex), 10);\n\n  // No px so using % or no style was set, so falling back to offsetWidth/height\n  // If component has display:none, offset will return 0\n  // TODO: handle display:none and no dimension style using px\n  } else {\n\n    return parseInt(this.el_['offset'+vjs.capitalize(widthOrHeight)], 10);\n\n    // ComputedStyle version.\n    // Only difference is if the element is hidden it will return\n    // the percent value (e.g. '100%'')\n    // instead of zero like offsetWidth returns.\n    // var val = vjs.getComputedStyleValue(this.el_, widthOrHeight);\n    // var pxIndex = val.indexOf('px');\n\n    // if (pxIndex !== -1) {\n    //   return val.slice(0, pxIndex);\n    // } else {\n    //   return val;\n    // }\n  }\n};\n\n/**\n * Fired when the width and/or height of the component changes\n * @event resize\n */\nvjs.Component.prototype.onResize;\n\n/**\n * Emit 'tap' events when touch events are supported\n *\n * This is used to support toggling the controls through a tap on the video.\n *\n * We're requireing them to be enabled because otherwise every component would\n * have this extra overhead unnecessarily, on mobile devices where extra\n * overhead is especially bad.\n * @private\n */\nvjs.Component.prototype.emitTapEvents = function(){\n  var touchStart, touchTime, couldBeTap, noTap;\n\n  // Track the start time so we can determine how long the touch lasted\n  touchStart = 0;\n\n  this.on('touchstart', function(event) {\n    // Record start time so we can detect a tap vs. \"touch and hold\"\n    touchStart = new Date().getTime();\n    // Reset couldBeTap tracking\n    couldBeTap = true;\n  });\n\n  noTap = function(){\n    couldBeTap = false;\n  };\n  // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s\n  this.on('touchmove', noTap);\n  this.on('touchleave', noTap);\n  this.on('touchcancel', noTap);\n\n  // When the touch ends, measure how long it took and trigger the appropriate\n  // event\n  this.on('touchend', function() {\n    // Proceed only if the touchmove/leave/cancel event didn't happen\n    if (couldBeTap === true) {\n      // Measure how long the touch lasted\n      touchTime = new Date().getTime() - touchStart;\n      // The touch needs to be quick in order to consider it a tap\n      if (touchTime < 250) {\n        this.trigger('tap');\n        // It may be good to copy the touchend event object and change the\n        // type to tap, if the other event properties aren't exact after\n        // vjs.fixEvent runs (e.g. event.target)\n      }\n    }\n  });\n};\n/* Button - Base class for all buttons\n================================================================================ */\n/**\n * Base class for all buttons\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @class\n * @constructor\n */\nvjs.Button = vjs.Component.extend({\n  /**\n   * @constructor\n   * @inheritDoc\n   */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n\n    var touchstart = false;\n    this.on('touchstart', function(event) {\n      // Stop click and other mouse events from triggering also\n      event.preventDefault();\n      touchstart = true;\n    });\n    this.on('touchmove', function() {\n      touchstart = false;\n    });\n    var self = this;\n    this.on('touchend', function(event) {\n      if (touchstart) {\n        self.onClick(event);\n      }\n      event.preventDefault();\n    });\n\n    this.on('click', this.onClick);\n    this.on('focus', this.onFocus);\n    this.on('blur', this.onBlur);\n  }\n});\n\nvjs.Button.prototype.createEl = function(type, props){\n  // Add standard Aria and Tabindex info\n  props = vjs.obj.merge({\n    className: this.buildCSSClass(),\n    innerHTML: '<div class=\"vjs-control-content\"><span class=\"vjs-control-text\">' + (this.buttonText || 'Need Text') + '</span></div>',\n    role: 'button',\n    'aria-live': 'polite', // let the screen reader user know that the text of the button may change\n    tabIndex: 0\n  }, props);\n\n  return vjs.Component.prototype.createEl.call(this, type, props);\n};\n\nvjs.Button.prototype.buildCSSClass = function(){\n  // TODO: Change vjs-control to vjs-button?\n  return 'vjs-control ' + vjs.Component.prototype.buildCSSClass.call(this);\n};\n\n  // Click - Override with specific functionality for button\nvjs.Button.prototype.onClick = function(){};\n\n  // Focus - Add keyboard functionality to element\nvjs.Button.prototype.onFocus = function(){\n  vjs.on(document, 'keyup', vjs.bind(this, this.onKeyPress));\n};\n\n  // KeyPress (document level) - Trigger click when keys are pressed\nvjs.Button.prototype.onKeyPress = function(event){\n  // Check for space bar (32) or enter (13) keys\n  if (event.which == 32 || event.which == 13) {\n    event.preventDefault();\n    this.onClick();\n  }\n};\n\n// Blur - Remove keyboard triggers\nvjs.Button.prototype.onBlur = function(){\n  vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));\n};\n/* Slider\n================================================================================ */\n/**\n * The base functionality for sliders like the volume bar and seek bar\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.Slider = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n\n    // Set property names to bar and handle to match with the child Slider class is looking for\n    this.bar = this.getChild(this.options_['barName']);\n    this.handle = this.getChild(this.options_['handleName']);\n\n    player.on(this.playerEvent, vjs.bind(this, this.update));\n\n    this.on('mousedown', this.onMouseDown);\n    this.on('touchstart', this.onMouseDown);\n    this.on('focus', this.onFocus);\n    this.on('blur', this.onBlur);\n    this.on('click', this.onClick);\n\n    this.player_.on('controlsvisible', vjs.bind(this, this.update));\n\n    // This is actually to fix the volume handle position. http://twitter.com/#!/gerritvanaaken/status/159046254519787520\n    // this.player_.one('timeupdate', vjs.bind(this, this.update));\n\n    player.ready(vjs.bind(this, this.update));\n\n    this.boundEvents = {};\n  }\n});\n\nvjs.Slider.prototype.createEl = function(type, props) {\n  props = props || {};\n  // Add the slider element class to all sub classes\n  props.className = props.className + ' vjs-slider';\n  props = vjs.obj.merge({\n    role: 'slider',\n    'aria-valuenow': 0,\n    'aria-valuemin': 0,\n    'aria-valuemax': 100,\n    tabIndex: 0\n  }, props);\n\n  return vjs.Component.prototype.createEl.call(this, type, props);\n};\n\nvjs.Slider.prototype.onMouseDown = function(event){\n  event.preventDefault();\n  vjs.blockTextSelection();\n\n  this.boundEvents.move = vjs.bind(this, this.onMouseMove);\n  this.boundEvents.end = vjs.bind(this, this.onMouseUp);\n\n  vjs.on(document, 'mousemove', this.boundEvents.move);\n  vjs.on(document, 'mouseup', this.boundEvents.end);\n  vjs.on(document, 'touchmove', this.boundEvents.move);\n  vjs.on(document, 'touchend', this.boundEvents.end);\n\n  this.onMouseMove(event);\n};\n\nvjs.Slider.prototype.onMouseUp = function() {\n  vjs.unblockTextSelection();\n  vjs.off(document, 'mousemove', this.boundEvents.move, false);\n  vjs.off(document, 'mouseup', this.boundEvents.end, false);\n  vjs.off(document, 'touchmove', this.boundEvents.move, false);\n  vjs.off(document, 'touchend', this.boundEvents.end, false);\n\n  this.update();\n};\n\nvjs.Slider.prototype.update = function(){\n  // In VolumeBar init we have a setTimeout for update that pops and update to the end of the\n  // execution stack. The player is destroyed before then update will cause an error\n  if (!this.el_) return;\n\n  // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.\n  // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.\n  // var progress =  (this.player_.scrubbing) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();\n\n  var barProgress,\n      progress = this.getPercent(),\n      handle = this.handle,\n      bar = this.bar;\n\n  // Protect against no duration and other division issues\n  if (isNaN(progress)) { progress = 0; }\n\n  barProgress = progress;\n\n  // If there is a handle, we need to account for the handle in our calculation for progress bar\n  // so that it doesn't fall short of or extend past the handle.\n  if (handle) {\n\n    var box = this.el_,\n        boxWidth = box.offsetWidth,\n\n        handleWidth = handle.el().offsetWidth,\n\n        // The width of the handle in percent of the containing box\n        // In IE, widths may not be ready yet causing NaN\n        handlePercent = (handleWidth) ? handleWidth / boxWidth : 0,\n\n        // Get the adjusted size of the box, considering that the handle's center never touches the left or right side.\n        // There is a margin of half the handle's width on both sides.\n        boxAdjustedPercent = 1 - handlePercent,\n\n        // Adjust the progress that we'll use to set widths to the new adjusted box width\n        adjustedProgress = progress * boxAdjustedPercent;\n\n    // The bar does reach the left side, so we need to account for this in the bar's width\n    barProgress = adjustedProgress + (handlePercent / 2);\n\n    // Move the handle from the left based on the adjected progress\n    handle.el().style.left = vjs.round(adjustedProgress * 100, 2) + '%';\n  }\n\n  // Set the new bar width\n  bar.el().style.width = vjs.round(barProgress * 100, 2) + '%';\n};\n\nvjs.Slider.prototype.calculateDistance = function(event){\n  var el, box, boxX, boxY, boxW, boxH, handle, pageX, pageY;\n\n  el = this.el_;\n  box = vjs.findPosition(el);\n  boxW = boxH = el.offsetWidth;\n  handle = this.handle;\n\n  if (this.options_.vertical) {\n    boxY = box.top;\n\n    if (event.changedTouches) {\n      pageY = event.changedTouches[0].pageY;\n    } else {\n      pageY = event.pageY;\n    }\n\n    if (handle) {\n      var handleH = handle.el().offsetHeight;\n      // Adjusted X and Width, so handle doesn't go outside the bar\n      boxY = boxY + (handleH / 2);\n      boxH = boxH - handleH;\n    }\n\n    // Percent that the click is through the adjusted area\n    return Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));\n\n  } else {\n    boxX = box.left;\n\n    if (event.changedTouches) {\n      pageX = event.changedTouches[0].pageX;\n    } else {\n      pageX = event.pageX;\n    }\n\n    if (handle) {\n      var handleW = handle.el().offsetWidth;\n\n      // Adjusted X and Width, so handle doesn't go outside the bar\n      boxX = boxX + (handleW / 2);\n      boxW = boxW - handleW;\n    }\n\n    // Percent that the click is through the adjusted area\n    return Math.max(0, Math.min(1, (pageX - boxX) / boxW));\n  }\n};\n\nvjs.Slider.prototype.onFocus = function(){\n  vjs.on(document, 'keyup', vjs.bind(this, this.onKeyPress));\n};\n\nvjs.Slider.prototype.onKeyPress = function(event){\n  if (event.which == 37) { // Left Arrow\n    event.preventDefault();\n    this.stepBack();\n  } else if (event.which == 39) { // Right Arrow\n    event.preventDefault();\n    this.stepForward();\n  }\n};\n\nvjs.Slider.prototype.onBlur = function(){\n  vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));\n};\n\n/**\n * Listener for click events on slider, used to prevent clicks\n *   from bubbling up to parent elements like button menus.\n * @param  {Object} event Event object\n */\nvjs.Slider.prototype.onClick = function(event){\n  event.stopImmediatePropagation();\n  event.preventDefault();\n};\n\n/**\n * SeekBar Behavior includes play progress bar, and seek handle\n * Needed so it can determine seek position based on handle position/size\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.SliderHandle = vjs.Component.extend();\n\n/**\n * Default value of the slider\n *\n * @type {Number}\n * @private\n */\nvjs.SliderHandle.prototype.defaultValue = 0;\n\n/** @inheritDoc */\nvjs.SliderHandle.prototype.createEl = function(type, props) {\n  props = props || {};\n  // Add the slider element class to all sub classes\n  props.className = props.className + ' vjs-slider-handle';\n  props = vjs.obj.merge({\n    innerHTML: '<span class=\"vjs-control-text\">'+this.defaultValue+'</span>'\n  }, props);\n\n  return vjs.Component.prototype.createEl.call(this, 'div', props);\n};\n/* Menu\n================================================================================ */\n/**\n * The Menu component is used to build pop up menus, including subtitle and\n * captions selection menus.\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @class\n * @constructor\n */\nvjs.Menu = vjs.Component.extend();\n\n/**\n * Add a menu item to the menu\n * @param {Object|String} component Component or component type to add\n */\nvjs.Menu.prototype.addItem = function(component){\n  this.addChild(component);\n  component.on('click', vjs.bind(this, function(){\n    this.unlockShowing();\n  }));\n};\n\n/** @inheritDoc */\nvjs.Menu.prototype.createEl = function(){\n  var contentElType = this.options().contentElType || 'ul';\n  this.contentEl_ = vjs.createEl(contentElType, {\n    className: 'vjs-menu-content'\n  });\n  var el = vjs.Component.prototype.createEl.call(this, 'div', {\n    append: this.contentEl_,\n    className: 'vjs-menu'\n  });\n  el.appendChild(this.contentEl_);\n\n  // Prevent clicks from bubbling up. Needed for Menu Buttons,\n  // where a click on the parent is significant\n  vjs.on(el, 'click', function(event){\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  });\n\n  return el;\n};\n\n/**\n * The component for a menu item. `<li>`\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @class\n * @constructor\n */\nvjs.MenuItem = vjs.Button.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Button.call(this, player, options);\n    this.selected(options['selected']);\n  }\n});\n\n/** @inheritDoc */\nvjs.MenuItem.prototype.createEl = function(type, props){\n  return vjs.Button.prototype.createEl.call(this, 'li', vjs.obj.merge({\n    className: 'vjs-menu-item',\n    innerHTML: this.options_['label']\n  }, props));\n};\n\n/**\n * Handle a click on the menu item, and set it to selected\n */\nvjs.MenuItem.prototype.onClick = function(){\n  this.selected(true);\n};\n\n/**\n * Set this menu item as selected or not\n * @param  {Boolean} selected\n */\nvjs.MenuItem.prototype.selected = function(selected){\n  if (selected) {\n    this.addClass('vjs-selected');\n    this.el_.setAttribute('aria-selected',true);\n  } else {\n    this.removeClass('vjs-selected');\n    this.el_.setAttribute('aria-selected',false);\n  }\n};\n\n\n/**\n * A button class with a popup menu\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.MenuButton = vjs.Button.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Button.call(this, player, options);\n\n    this.menu = this.createMenu();\n\n    // Add list to element\n    this.addChild(this.menu);\n\n    // Automatically hide empty menu buttons\n    if (this.items && this.items.length === 0) {\n      this.hide();\n    }\n\n    this.on('keyup', this.onKeyPress);\n    this.el_.setAttribute('aria-haspopup', true);\n    this.el_.setAttribute('role', 'button');\n  }\n});\n\n/**\n * Track the state of the menu button\n * @type {Boolean}\n * @private\n */\nvjs.MenuButton.prototype.buttonPressed_ = false;\n\nvjs.MenuButton.prototype.createMenu = function(){\n  var menu = new vjs.Menu(this.player_);\n\n  // Add a title list item to the top\n  if (this.options().title) {\n    menu.el().appendChild(vjs.createEl('li', {\n      className: 'vjs-menu-title',\n      innerHTML: vjs.capitalize(this.kind_),\n      tabindex: -1\n    }));\n  }\n\n  this.items = this['createItems']();\n\n  if (this.items) {\n    // Add menu items to the menu\n    for (var i = 0; i < this.items.length; i++) {\n      menu.addItem(this.items[i]);\n    }\n  }\n\n  return menu;\n};\n\n/**\n * Create the list of menu items. Specific to each subclass.\n */\nvjs.MenuButton.prototype.createItems = function(){};\n\n/** @inheritDoc */\nvjs.MenuButton.prototype.buildCSSClass = function(){\n  return this.className + ' vjs-menu-button ' + vjs.Button.prototype.buildCSSClass.call(this);\n};\n\n// Focus - Add keyboard functionality to element\n// This function is not needed anymore. Instead, the keyboard functionality is handled by\n// treating the button as triggering a submenu. When the button is pressed, the submenu\n// appears. Pressing the button again makes the submenu disappear.\nvjs.MenuButton.prototype.onFocus = function(){};\n// Can't turn off list display that we turned on with focus, because list would go away.\nvjs.MenuButton.prototype.onBlur = function(){};\n\nvjs.MenuButton.prototype.onClick = function(){\n  // When you click the button it adds focus, which will show the menu indefinitely.\n  // So we'll remove focus when the mouse leaves the button.\n  // Focus is needed for tab navigation.\n  this.one('mouseout', vjs.bind(this, function(){\n    this.menu.unlockShowing();\n    this.el_.blur();\n  }));\n  if (this.buttonPressed_){\n    this.unpressButton();\n  } else {\n    this.pressButton();\n  }\n};\n\nvjs.MenuButton.prototype.onKeyPress = function(event){\n  event.preventDefault();\n\n  // Check for space bar (32) or enter (13) keys\n  if (event.which == 32 || event.which == 13) {\n    if (this.buttonPressed_){\n      this.unpressButton();\n    } else {\n      this.pressButton();\n    }\n  // Check for escape (27) key\n  } else if (event.which == 27){\n    if (this.buttonPressed_){\n      this.unpressButton();\n    }\n  }\n};\n\nvjs.MenuButton.prototype.pressButton = function(){\n  this.buttonPressed_ = true;\n  this.menu.lockShowing();\n  this.el_.setAttribute('aria-pressed', true);\n  if (this.items && this.items.length > 0) {\n    this.items[0].el().focus(); // set the focus to the title of the submenu\n  }\n};\n\nvjs.MenuButton.prototype.unpressButton = function(){\n  this.buttonPressed_ = false;\n  this.menu.unlockShowing();\n  this.el_.setAttribute('aria-pressed', false);\n};\n\n/**\n * An instance of the `vjs.Player` class is created when any of the Video.js setup methods are used to initialize a video.\n *\n * ```js\n * var myPlayer = videojs('example_video_1');\n * ```\n *\n * In the follwing example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.\n *\n * ```html\n * <video id=\"example_video_1\" data-setup='{}' controls>\n *   <source src=\"my-source.mp4\" type=\"video/mp4\">\n * </video>\n * ```\n *\n * After an instance has been created it can be accessed globally using `Video('example_video_1')`.\n *\n * @class\n * @extends vjs.Component\n */\nvjs.Player = vjs.Component.extend({\n\n  /**\n   * player's constructor function\n   *\n   * @constructs\n   * @method init\n   * @param {Element} tag        The original video tag used for configuring options\n   * @param {Object=} options    Player options\n   * @param {Function=} ready    Ready callback function\n   */\n  init: function(tag, options, ready){\n    this.tag = tag; // Store the original tag used to set options\n\n    // Set Options\n    // The options argument overrides options set in the video tag\n    // which overrides globally set options.\n    // This latter part coincides with the load order\n    // (tag must exist before Player)\n    options = vjs.obj.merge(this.getTagSettings(tag), options);\n\n    // Cache for video property values.\n    this.cache_ = {};\n\n    // Set poster\n    this.poster_ = options['poster'];\n    // Set controls\n    this.controls_ = options['controls'];\n    // Original tag settings stored in options\n    // now remove immediately so native controls don't flash.\n    // May be turned back on by HTML5 tech if nativeControlsForTouch is true\n    tag.controls = false;\n\n    // Run base component initializing with new options.\n    // Builds the element through createEl()\n    // Inits and embeds any child components in opts\n    vjs.Component.call(this, this, options, ready);\n\n    // Update controls className. Can't do this when the controls are initially\n    // set because the element doesn't exist yet.\n    if (this.controls()) {\n      this.addClass('vjs-controls-enabled');\n    } else {\n      this.addClass('vjs-controls-disabled');\n    }\n\n    // TODO: Make this smarter. Toggle user state between touching/mousing\n    // using events, since devices can have both touch and mouse events.\n    // if (vjs.TOUCH_ENABLED) {\n    //   this.addClass('vjs-touch-enabled');\n    // }\n\n    // Firstplay event implimentation. Not sold on the event yet.\n    // Could probably just check currentTime==0?\n    this.one('play', function(e){\n      var fpEvent = { type: 'firstplay', target: this.el_ };\n      // Using vjs.trigger so we can check if default was prevented\n      var keepGoing = vjs.trigger(this.el_, fpEvent);\n\n      if (!keepGoing) {\n        e.preventDefault();\n        e.stopPropagation();\n        e.stopImmediatePropagation();\n      }\n    });\n\n    this.on('ended', this.onEnded);\n    this.on('play', this.onPlay);\n    this.on('firstplay', this.onFirstPlay);\n    this.on('pause', this.onPause);\n    this.on('progress', this.onProgress);\n    this.on('durationchange', this.onDurationChange);\n    this.on('error', this.onError);\n    this.on('fullscreenchange', this.onFullscreenChange);\n\n    // Make player easily findable by ID\n    vjs.players[this.id_] = this;\n\n    if (options['plugins']) {\n      vjs.obj.each(options['plugins'], function(key, val){\n        this[key](val);\n      }, this);\n    }\n\n    this.listenForUserActivity();\n  }\n});\n\n/**\n * Player instance options, surfaced using vjs.options\n * vjs.options = vjs.Player.prototype.options_\n * Make changes in vjs.options, not here.\n * All options should use string keys so they avoid\n * renaming by closure compiler\n * @type {Object}\n * @private\n */\nvjs.Player.prototype.options_ = vjs.options;\n\n/**\n * Destroys the video player and does any necessary cleanup\n *\n *     myPlayer.dispose();\n *\n * This is especially helpful if you are dynamically adding and removing videos\n * to/from the DOM.\n */\nvjs.Player.prototype.dispose = function(){\n  this.trigger('dispose');\n  // prevent dispose from being called twice\n  this.off('dispose');\n\n  // Kill reference to this player\n  vjs.players[this.id_] = null;\n  if (this.tag && this.tag['player']) { this.tag['player'] = null; }\n  if (this.el_ && this.el_['player']) { this.el_['player'] = null; }\n\n  // Ensure that tracking progress and time progress will stop and plater deleted\n  this.stopTrackingProgress();\n  this.stopTrackingCurrentTime();\n\n  if (this.tech) { this.tech.dispose(); }\n\n  // Component dispose\n  vjs.Component.prototype.dispose.call(this);\n};\n\nvjs.Player.prototype.getTagSettings = function(tag){\n  var options = {\n    'sources': [],\n    'tracks': []\n  };\n\n  vjs.obj.merge(options, vjs.getAttributeValues(tag));\n\n  // Get tag children settings\n  if (tag.hasChildNodes()) {\n    var children, child, childName, i, j;\n\n    children = tag.childNodes;\n\n    for (i=0,j=children.length; i<j; i++) {\n      child = children[i];\n      // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/\n      childName = child.nodeName.toLowerCase();\n      if (childName === 'source') {\n        options['sources'].push(vjs.getAttributeValues(child));\n      } else if (childName === 'track') {\n        options['tracks'].push(vjs.getAttributeValues(child));\n      }\n    }\n  }\n\n  return options;\n};\n\nvjs.Player.prototype.createEl = function(){\n  var el = this.el_ = vjs.Component.prototype.createEl.call(this, 'div');\n  var tag = this.tag;\n\n  // Remove width/height attrs from tag so CSS can make it 100% width/height\n  tag.removeAttribute('width');\n  tag.removeAttribute('height');\n  // Empty video tag tracks so the built-in player doesn't use them also.\n  // This may not be fast enough to stop HTML5 browsers from reading the tags\n  // so we'll need to turn off any default tracks if we're manually doing\n  // captions and subtitles. videoElement.textTracks\n  if (tag.hasChildNodes()) {\n    var nodes, nodesLength, i, node, nodeName, removeNodes;\n\n    nodes = tag.childNodes;\n    nodesLength = nodes.length;\n    removeNodes = [];\n\n    while (nodesLength--) {\n      node = nodes[nodesLength];\n      nodeName = node.nodeName.toLowerCase();\n      if (nodeName === 'track') {\n        removeNodes.push(node);\n      }\n    }\n\n    for (i=0; i<removeNodes.length; i++) {\n      tag.removeChild(removeNodes[i]);\n    }\n  }\n\n  // Make sure tag ID exists\n  tag.id = tag.id || 'vjs_video_' + vjs.guid++;\n\n  // Give video tag ID and class to player div\n  // ID will now reference player box, not the video tag\n  el.id = tag.id;\n  el.className = tag.className;\n\n  // Update tag id/class for use as HTML5 playback tech\n  // Might think we should do this after embedding in container so .vjs-tech class\n  // doesn't flash 100% width/height, but class only applies with .video-js parent\n  tag.id += '_html5_api';\n  tag.className = 'vjs-tech';\n\n  // Make player findable on elements\n  tag['player'] = el['player'] = this;\n  // Default state of video is paused\n  this.addClass('vjs-paused');\n\n  // Make box use width/height of tag, or rely on default implementation\n  // Enforce with CSS since width/height attrs don't work on divs\n  this.width(this.options_['width'], true); // (true) Skip resize listener on load\n  this.height(this.options_['height'], true);\n\n  // Wrap video tag in div (el/box) container\n  if (tag.parentNode) {\n    tag.parentNode.insertBefore(el, tag);\n  }\n  vjs.insertFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.\n\n  return el;\n};\n\n// /* Media Technology (tech)\n// ================================================================================ */\n// Load/Create an instance of playback technlogy including element and API methods\n// And append playback element in player div.\nvjs.Player.prototype.loadTech = function(techName, source){\n\n  // Pause and remove current playback technology\n  if (this.tech) {\n    this.unloadTech();\n\n  // if this is the first time loading, HTML5 tag will exist but won't be initialized\n  // so we need to remove it if we're not loading HTML5\n  } else if (techName !== 'Html5' && this.tag) {\n    vjs.Html5.disposeMediaElement(this.tag);\n    this.tag = null;\n  }\n\n  this.techName = techName;\n\n  // Turn off API access because we're loading a new tech that might load asynchronously\n  this.isReady_ = false;\n\n  var techReady = function(){\n    this.player_.triggerReady();\n\n    // Manually track progress in cases where the browser/flash player doesn't report it.\n    if (!this.features['progressEvents']) {\n      this.player_.manualProgressOn();\n    }\n\n    // Manually track timeudpates in cases where the browser/flash player doesn't report it.\n    if (!this.features['timeupdateEvents']) {\n      this.player_.manualTimeUpdatesOn();\n    }\n  };\n\n  // Grab tech-specific options from player options and add source and parent element to use.\n  var techOptions = vjs.obj.merge({ 'source': source, 'parentEl': this.el_ }, this.options_[techName.toLowerCase()]);\n\n  if (source) {\n    if (source.src == this.cache_.src && this.cache_.currentTime > 0) {\n      techOptions['startTime'] = this.cache_.currentTime;\n    }\n\n    this.cache_.src = source.src;\n  }\n\n  // Initialize tech instance\n  this.tech = new window['videojs'][techName](this, techOptions);\n\n  this.tech.ready(techReady);\n};\n\nvjs.Player.prototype.unloadTech = function(){\n  this.isReady_ = false;\n  this.tech.dispose();\n\n  // Turn off any manual progress or timeupdate tracking\n  if (this.manualProgress) { this.manualProgressOff(); }\n\n  if (this.manualTimeUpdates) { this.manualTimeUpdatesOff(); }\n\n  this.tech = false;\n};\n\n// There's many issues around changing the size of a Flash (or other plugin) object.\n// First is a plugin reload issue in Firefox that has been around for 11 years: https://bugzilla.mozilla.org/show_bug.cgi?id=90268\n// Then with the new fullscreen API, Mozilla and webkit browsers will reload the flash object after going to fullscreen.\n// To get around this, we're unloading the tech, caching source and currentTime values, and reloading the tech once the plugin is resized.\n// reloadTech: function(betweenFn){\n//   vjs.log('unloadingTech')\n//   this.unloadTech();\n//   vjs.log('unloadedTech')\n//   if (betweenFn) { betweenFn.call(); }\n//   vjs.log('LoadingTech')\n//   this.loadTech(this.techName, { src: this.cache_.src })\n//   vjs.log('loadedTech')\n// },\n\n/* Fallbacks for unsupported event types\n================================================================================ */\n// Manually trigger progress events based on changes to the buffered amount\n// Many flash players and older HTML5 browsers don't send progress or progress-like events\nvjs.Player.prototype.manualProgressOn = function(){\n  this.manualProgress = true;\n\n  // Trigger progress watching when a source begins loading\n  this.trackProgress();\n\n  // Watch for a native progress event call on the tech element\n  // In HTML5, some older versions don't support the progress event\n  // So we're assuming they don't, and turning off manual progress if they do.\n  // As opposed to doing user agent detection\n  this.tech.one('progress', function(){\n\n    // Update known progress support for this playback technology\n    this.features['progressEvents'] = true;\n\n    // Turn off manual progress tracking\n    this.player_.manualProgressOff();\n  });\n};\n\nvjs.Player.prototype.manualProgressOff = function(){\n  this.manualProgress = false;\n  this.stopTrackingProgress();\n};\n\nvjs.Player.prototype.trackProgress = function(){\n\n  this.progressInterval = setInterval(vjs.bind(this, function(){\n    // Don't trigger unless buffered amount is greater than last time\n    // log(this.cache_.bufferEnd, this.buffered().end(0), this.duration())\n    /* TODO: update for multiple buffered regions */\n    if (this.cache_.bufferEnd < this.buffered().end(0)) {\n      this.trigger('progress');\n    } else if (this.bufferedPercent() == 1) {\n      this.stopTrackingProgress();\n      this.trigger('progress'); // Last update\n    }\n  }), 500);\n};\nvjs.Player.prototype.stopTrackingProgress = function(){ clearInterval(this.progressInterval); };\n\n/*! Time Tracking -------------------------------------------------------------- */\nvjs.Player.prototype.manualTimeUpdatesOn = function(){\n  this.manualTimeUpdates = true;\n\n  this.on('play', this.trackCurrentTime);\n  this.on('pause', this.stopTrackingCurrentTime);\n  // timeupdate is also called by .currentTime whenever current time is set\n\n  // Watch for native timeupdate event\n  this.tech.one('timeupdate', function(){\n    // Update known progress support for this playback technology\n    this.features['timeupdateEvents'] = true;\n    // Turn off manual progress tracking\n    this.player_.manualTimeUpdatesOff();\n  });\n};\n\nvjs.Player.prototype.manualTimeUpdatesOff = function(){\n  this.manualTimeUpdates = false;\n  this.stopTrackingCurrentTime();\n  this.off('play', this.trackCurrentTime);\n  this.off('pause', this.stopTrackingCurrentTime);\n};\n\nvjs.Player.prototype.trackCurrentTime = function(){\n  if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); }\n  this.currentTimeInterval = setInterval(vjs.bind(this, function(){\n    this.trigger('timeupdate');\n  }), 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n};\n\n// Turn off play progress tracking (when paused or dragging)\nvjs.Player.prototype.stopTrackingCurrentTime = function(){ clearInterval(this.currentTimeInterval); };\n\n// /* Player event handlers (how the player reacts to certain events)\n// ================================================================================ */\n\n/**\n * Fired when the user agent begins looking for media data\n * @event loadstart\n */\nvjs.Player.prototype.onLoadStart;\n\n/**\n * Fired when the player has initial duration and dimension information\n * @event loadedmetadata\n */\nvjs.Player.prototype.onLoadedMetaData;\n\n/**\n * Fired when the player has downloaded data at the current playback position\n * @event loadeddata\n */\nvjs.Player.prototype.onLoadedData;\n\n/**\n * Fired when the player has finished downloading the source data\n * @event loadedalldata\n */\nvjs.Player.prototype.onLoadedAllData;\n\n/**\n * Fired whenever the media begins or resumes playback\n * @event play\n */\nvjs.Player.prototype.onPlay = function(){\n  vjs.removeClass(this.el_, 'vjs-paused');\n  vjs.addClass(this.el_, 'vjs-playing');\n};\n\n/**\n * Fired the first time a video is played\n *\n * Not part of the HLS spec, and we're not sure if this is the best\n * implementation yet, so use sparingly. If you don't have a reason to\n * prevent playback, use `myPlayer.one('play');` instead.\n *\n * @event firstplay\n */\nvjs.Player.prototype.onFirstPlay = function(){\n    //If the first starttime attribute is specified\n    //then we will start at the given offset in seconds\n    if(this.options_['starttime']){\n      this.currentTime(this.options_['starttime']);\n    }\n\n    this.addClass('vjs-has-started');\n};\n\n/**\n * Fired whenever the media has been paused\n * @event pause\n */\nvjs.Player.prototype.onPause = function(){\n  vjs.removeClass(this.el_, 'vjs-playing');\n  vjs.addClass(this.el_, 'vjs-paused');\n};\n\n/**\n * Fired when the current playback position has changed\n *\n * During playback this is fired every 15-250 milliseconds, depnding on the\n * playback technology in use.\n * @event timeupdate\n */\nvjs.Player.prototype.onTimeUpdate;\n\n/**\n * Fired while the user agent is downloading media data\n * @event progress\n */\nvjs.Player.prototype.onProgress = function(){\n  // Add custom event for when source is finished downloading.\n  if (this.bufferedPercent() == 1) {\n    this.trigger('loadedalldata');\n  }\n};\n\n/**\n * Fired when the end of the media resource is reached (currentTime == duration)\n * @event ended\n */\nvjs.Player.prototype.onEnded = function(){\n  if (this.options_['loop']) {\n    this.currentTime(0);\n    this.play();\n  }\n};\n\n/**\n * Fired when the duration of the media resource is first known or changed\n * @event durationchange\n */\nvjs.Player.prototype.onDurationChange = function(){\n  // Allows for cacheing value instead of asking player each time.\n  this.duration(this.techGet('duration'));\n};\n\n/**\n * Fired when the volume changes\n * @event volumechange\n */\nvjs.Player.prototype.onVolumeChange;\n\n/**\n * Fired when the player switches in or out of fullscreen mode\n * @event fullscreenchange\n */\nvjs.Player.prototype.onFullscreenChange = function() {\n  if (this.isFullScreen) {\n    this.addClass('vjs-fullscreen');\n  } else {\n    this.removeClass('vjs-fullscreen');\n  }\n};\n\n/**\n * Fired when there is an error in playback\n * @event error\n */\nvjs.Player.prototype.onError = function(e) {\n  vjs.log('Video Error', e);\n};\n\n// /* Player API\n// ================================================================================ */\n\n/**\n * Object for cached values.\n * @private\n */\nvjs.Player.prototype.cache_;\n\nvjs.Player.prototype.getCache = function(){\n  return this.cache_;\n};\n\n// Pass values to the playback tech\nvjs.Player.prototype.techCall = function(method, arg){\n  // If it's not ready yet, call method when it is\n  if (this.tech && !this.tech.isReady_) {\n    this.tech.ready(function(){\n      this[method](arg);\n    });\n\n  // Otherwise call method now\n  } else {\n    try {\n      this.tech[method](arg);\n    } catch(e) {\n      vjs.log(e);\n      throw e;\n    }\n  }\n};\n\n// Get calls can't wait for the tech, and sometimes don't need to.\nvjs.Player.prototype.techGet = function(method){\n\n  if (this.tech && this.tech.isReady_) {\n\n    // Flash likes to die and reload when you hide or reposition it.\n    // In these cases the object methods go away and we get errors.\n    // When that happens we'll catch the errors and inform tech that it's not ready any more.\n    try {\n      return this.tech[method]();\n    } catch(e) {\n      // When building additional tech libs, an expected method may not be defined yet\n      if (this.tech[method] === undefined) {\n        vjs.log('Video.js: ' + method + ' method not defined for '+this.techName+' playback technology.', e);\n      } else {\n        // When a method isn't available on the object it throws a TypeError\n        if (e.name == 'TypeError') {\n          vjs.log('Video.js: ' + method + ' unavailable on '+this.techName+' playback technology element.', e);\n          this.tech.isReady_ = false;\n        } else {\n          vjs.log(e);\n        }\n      }\n      throw e;\n    }\n  }\n\n  return;\n};\n\n/**\n * start media playback\n *\n *     myPlayer.play();\n *\n * @return {vjs.Player} self\n */\nvjs.Player.prototype.play = function(){\n  this.techCall('play');\n  return this;\n};\n\n/**\n * Pause the video playback\n *\n *     myPlayer.pause();\n *\n * @return {vjs.Player} self\n */\nvjs.Player.prototype.pause = function(){\n  this.techCall('pause');\n  return this;\n};\n\n/**\n * Check if the player is paused\n *\n *     var isPaused = myPlayer.paused();\n *     var isPlaying = !myPlayer.paused();\n *\n * @return {Boolean} false if the media is currently playing, or true otherwise\n */\nvjs.Player.prototype.paused = function(){\n  // The initial state of paused should be true (in Safari it's actually false)\n  return (this.techGet('paused') === false) ? false : true;\n};\n\n/**\n * Get or set the current time (in seconds)\n *\n *     // get\n *     var whereYouAt = myPlayer.currentTime();\n *\n *     // set\n *     myPlayer.currentTime(120); // 2 minutes into the video\n *\n * @param  {Number|String=} seconds The time to seek to\n * @return {Number}        The time in seconds, when not setting\n * @return {vjs.Player}    self, when the current time is set\n */\nvjs.Player.prototype.currentTime = function(seconds){\n  if (seconds !== undefined) {\n\n    // cache the last set value for smoother scrubbing\n    this.cache_.lastSetCurrentTime = seconds;\n\n    this.techCall('setCurrentTime', seconds);\n\n    // improve the accuracy of manual timeupdates\n    if (this.manualTimeUpdates) { this.trigger('timeupdate'); }\n\n    return this;\n  }\n\n  // cache last currentTime and return\n  // default to 0 seconds\n  return this.cache_.currentTime = (this.techGet('currentTime') || 0);\n};\n\n/**\n * Get the length in time of the video in seconds\n *\n *     var lengthOfVideo = myPlayer.duration();\n *\n * **NOTE**: The video must have started loading before the duration can be\n * known, and in the case of Flash, may not be known until the video starts\n * playing.\n *\n * @return {Number} The duration of the video in seconds\n */\nvjs.Player.prototype.duration = function(seconds){\n  if (seconds !== undefined) {\n\n    // cache the last set value for optimiized scrubbing (esp. Flash)\n    this.cache_.duration = parseFloat(seconds);\n\n    return this;\n  }\n\n  if (this.cache_.duration === undefined) {\n    this.onDurationChange();\n  }\n\n  return this.cache_.duration;\n};\n\n// Calculates how much time is left. Not in spec, but useful.\nvjs.Player.prototype.remainingTime = function(){\n  return this.duration() - this.currentTime();\n};\n\n// http://dev.w3.org/html5/spec/video.html#dom-media-buffered\n// Buffered returns a timerange object.\n// Kind of like an array of portions of the video that have been downloaded.\n// So far no browsers return more than one range (portion)\n\n/**\n * Get a TimeRange object with the times of the video that have been downloaded\n *\n * If you just want the percent of the video that's been downloaded,\n * use bufferedPercent.\n *\n *     // Number of different ranges of time have been buffered. Usually 1.\n *     numberOfRanges = bufferedTimeRange.length,\n *\n *     // Time in seconds when the first range starts. Usually 0.\n *     firstRangeStart = bufferedTimeRange.start(0),\n *\n *     // Time in seconds when the first range ends\n *     firstRangeEnd = bufferedTimeRange.end(0),\n *\n *     // Length in seconds of the first time range\n *     firstRangeLength = firstRangeEnd - firstRangeStart;\n *\n * @return {Object} A mock TimeRange object (following HTML spec)\n */\nvjs.Player.prototype.buffered = function(){\n  var buffered = this.techGet('buffered'),\n      start = 0,\n      buflast = buffered.length - 1,\n      // Default end to 0 and store in values\n      end = this.cache_.bufferEnd = this.cache_.bufferEnd || 0;\n\n  if (buffered && buflast >= 0 && buffered.end(buflast) !== end) {\n    end = buffered.end(buflast);\n    // Storing values allows them be overridden by setBufferedFromProgress\n    this.cache_.bufferEnd = end;\n  }\n\n  return vjs.createTimeRange(start, end);\n};\n\n/**\n * Get the percent (as a decimal) of the video that's been downloaded\n *\n *     var howMuchIsDownloaded = myPlayer.bufferedPercent();\n *\n * 0 means none, 1 means all.\n * (This method isn't in the HTML5 spec, but it's very convenient)\n *\n * @return {Number} A decimal between 0 and 1 representing the percent\n */\nvjs.Player.prototype.bufferedPercent = function(){\n  return (this.duration()) ? this.buffered().end(0) / this.duration() : 0;\n};\n\n/**\n * Get or set the current volume of the media\n *\n *     // get\n *     var howLoudIsIt = myPlayer.volume();\n *\n *     // set\n *     myPlayer.volume(0.5); // Set volume to half\n *\n * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.\n *\n * @param  {Number} percentAsDecimal The new volume as a decimal percent\n * @return {Number}                  The current volume, when getting\n * @return {vjs.Player}              self, when setting\n */\nvjs.Player.prototype.volume = function(percentAsDecimal){\n  var vol;\n\n  if (percentAsDecimal !== undefined) {\n    vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1\n    this.cache_.volume = vol;\n    this.techCall('setVolume', vol);\n    vjs.setLocalStorage('volume', vol);\n    return this;\n  }\n\n  // Default to 1 when returning current volume.\n  vol = parseFloat(this.techGet('volume'));\n  return (isNaN(vol)) ? 1 : vol;\n};\n\n\n/**\n * Get the current muted state, or turn mute on or off\n *\n *     // get\n *     var isVolumeMuted = myPlayer.muted();\n *\n *     // set\n *     myPlayer.muted(true); // mute the volume\n *\n * @param  {Boolean=} muted True to mute, false to unmute\n * @return {Boolean} True if mute is on, false if not, when getting\n * @return {vjs.Player} self, when setting mute\n */\nvjs.Player.prototype.muted = function(muted){\n  if (muted !== undefined) {\n    this.techCall('setMuted', muted);\n    return this;\n  }\n  return this.techGet('muted') || false; // Default to false\n};\n\n// Check if current tech can support native fullscreen (e.g. with built in controls lik iOS, so not our flash swf)\nvjs.Player.prototype.supportsFullScreen = function(){ return this.techGet('supportsFullScreen') || false; };\n\n/**\n * Increase the size of the video to full screen\n *\n *     myPlayer.requestFullScreen();\n *\n * In some browsers, full screen is not supported natively, so it enters\n * \"full window mode\", where the video fills the browser window.\n * In browsers and devices that support native full screen, sometimes the\n * browser's default controls will be shown, and not the Video.js custom skin.\n * This includes most mobile devices (iOS, Android) and older versions of\n * Safari.\n *\n * @return {vjs.Player} self\n */\nvjs.Player.prototype.requestFullScreen = function(){\n  var requestFullScreen = vjs.support.requestFullScreen;\n  this.isFullScreen = true;\n\n  if (requestFullScreen) {\n    // the browser supports going fullscreen at the element level so we can\n    // take the controls fullscreen as well as the video\n\n    // Trigger fullscreenchange event after change\n    // We have to specifically add this each time, and remove\n    // when cancelling fullscreen. Otherwise if there's multiple\n    // players on a page, they would all be reacting to the same fullscreen\n    // events\n    vjs.on(document, requestFullScreen.eventName, vjs.bind(this, function(e){\n      this.isFullScreen = document[requestFullScreen.isFullScreen];\n\n      // If cancelling fullscreen, remove event listener.\n      if (this.isFullScreen === false) {\n        vjs.off(document, requestFullScreen.eventName, arguments.callee);\n      }\n\n      this.trigger('fullscreenchange');\n    }));\n\n    this.el_[requestFullScreen.requestFn]();\n\n  } else if (this.tech.supportsFullScreen()) {\n    // we can't take the video.js controls fullscreen but we can go fullscreen\n    // with native controls\n    this.techCall('enterFullScreen');\n  } else {\n    // fullscreen isn't supported so we'll just stretch the video element to\n    // fill the viewport\n    this.enterFullWindow();\n    this.trigger('fullscreenchange');\n  }\n\n  return this;\n};\n\n/**\n * Return the video to its normal size after having been in full screen mode\n *\n *     myPlayer.cancelFullScreen();\n *\n * @return {vjs.Player} self\n */\nvjs.Player.prototype.cancelFullScreen = function(){\n  var requestFullScreen = vjs.support.requestFullScreen;\n  this.isFullScreen = false;\n\n  // Check for browser element fullscreen support\n  if (requestFullScreen) {\n    document[requestFullScreen.cancelFn]();\n  } else if (this.tech.supportsFullScreen()) {\n   this.techCall('exitFullScreen');\n  } else {\n   this.exitFullWindow();\n   this.trigger('fullscreenchange');\n  }\n\n  return this;\n};\n\n// When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.\nvjs.Player.prototype.enterFullWindow = function(){\n  this.isFullWindow = true;\n\n  // Storing original doc overflow value to return to when fullscreen is off\n  this.docOrigOverflow = document.documentElement.style.overflow;\n\n  // Add listener for esc key to exit fullscreen\n  vjs.on(document, 'keydown', vjs.bind(this, this.fullWindowOnEscKey));\n\n  // Hide any scroll bars\n  document.documentElement.style.overflow = 'hidden';\n\n  // Apply fullscreen styles\n  vjs.addClass(document.body, 'vjs-full-window');\n\n  this.trigger('enterFullWindow');\n};\nvjs.Player.prototype.fullWindowOnEscKey = function(event){\n  if (event.keyCode === 27) {\n    if (this.isFullScreen === true) {\n      this.cancelFullScreen();\n    } else {\n      this.exitFullWindow();\n    }\n  }\n};\n\nvjs.Player.prototype.exitFullWindow = function(){\n  this.isFullWindow = false;\n  vjs.off(document, 'keydown', this.fullWindowOnEscKey);\n\n  // Unhide scroll bars.\n  document.documentElement.style.overflow = this.docOrigOverflow;\n\n  // Remove fullscreen styles\n  vjs.removeClass(document.body, 'vjs-full-window');\n\n  // Resize the box, controller, and poster to original sizes\n  // this.positionAll();\n  this.trigger('exitFullWindow');\n};\n\nvjs.Player.prototype.selectSource = function(sources){\n\n  // Loop through each playback technology in the options order\n  for (var i=0,j=this.options_['techOrder'];i<j.length;i++) {\n    var techName = vjs.capitalize(j[i]),\n        tech = window['videojs'][techName];\n\n    // Check if the browser supports this technology\n    if (tech.isSupported()) {\n      // Loop through each source object\n      for (var a=0,b=sources;a<b.length;a++) {\n        var source = b[a];\n\n        // Check if source can be played with this technology\n        if (tech['canPlaySource'](source)) {\n          return { source: source, tech: techName };\n        }\n      }\n    }\n  }\n\n  return false;\n};\n\n/**\n * The source function updates the video source\n *\n * There are three types of variables you can pass as the argument.\n *\n * **URL String**: A URL to the the video file. Use this method if you are sure\n * the current playback technology (HTML5/Flash) can support the source you\n * provide. Currently only MP4 files can be used in both HTML5 and Flash.\n *\n *     myPlayer.src(\"http://www.example.com/path/to/video.mp4\");\n *\n * **Source Object (or element):** A javascript object containing information\n * about the source file. Use this method if you want the player to determine if\n * it can support the file using the type information.\n *\n *     myPlayer.src({ type: \"video/mp4\", src: \"http://www.example.com/path/to/video.mp4\" });\n *\n * **Array of Source Objects:** To provide multiple versions of the source so\n * that it can be played using HTML5 across browsers you can use an array of\n * source objects. Video.js will detect which version is supported and load that\n * file.\n *\n *     myPlayer.src([\n *       { type: \"video/mp4\", src: \"http://www.example.com/path/to/video.mp4\" },\n *       { type: \"video/webm\", src: \"http://www.example.com/path/to/video.webm\" },\n *       { type: \"video/ogg\", src: \"http://www.example.com/path/to/video.ogv\" }\n *     ]);\n *\n * @param  {String|Object|Array=} source The source URL, object, or array of sources\n * @return {vjs.Player} self\n */\nvjs.Player.prototype.src = function(source){\n  // Case: Array of source objects to choose from and pick the best to play\n  if (source instanceof Array) {\n\n    var sourceTech = this.selectSource(source),\n        techName;\n\n    if (sourceTech) {\n        source = sourceTech.source;\n        techName = sourceTech.tech;\n\n      // If this technology is already loaded, set source\n      if (techName == this.techName) {\n        this.src(source); // Passing the source object\n      // Otherwise load this technology with chosen source\n      } else {\n        this.loadTech(techName, source);\n      }\n    } else {\n      this.el_.appendChild(vjs.createEl('p', {\n        innerHTML: this.options()['notSupportedMessage']\n      }));\n    }\n\n  // Case: Source object { src: '', type: '' ... }\n  } else if (source instanceof Object) {\n\n    if (window['videojs'][this.techName]['canPlaySource'](source)) {\n      this.src(source.src);\n    } else {\n      // Send through tech loop to check for a compatible technology.\n      this.src([source]);\n    }\n\n  // Case: URL String (http://myvideo...)\n  } else {\n    // Cache for getting last set source\n    this.cache_.src = source;\n\n    if (!this.isReady_) {\n      this.ready(function(){\n        this.src(source);\n      });\n    } else {\n      this.techCall('src', source);\n      if (this.options_['preload'] == 'auto') {\n        this.load();\n      }\n      if (this.options_['autoplay']) {\n        this.play();\n      }\n    }\n  }\n  return this;\n};\n\n// Begin loading the src data\n// http://dev.w3.org/html5/spec/video.html#dom-media-load\nvjs.Player.prototype.load = function(){\n  this.techCall('load');\n  return this;\n};\n\n// http://dev.w3.org/html5/spec/video.html#dom-media-currentsrc\nvjs.Player.prototype.currentSrc = function(){\n  return this.techGet('currentSrc') || this.cache_.src || '';\n};\n\n// Attributes/Options\nvjs.Player.prototype.preload = function(value){\n  if (value !== undefined) {\n    this.techCall('setPreload', value);\n    this.options_['preload'] = value;\n    return this;\n  }\n  return this.techGet('preload');\n};\nvjs.Player.prototype.autoplay = function(value){\n  if (value !== undefined) {\n    this.techCall('setAutoplay', value);\n    this.options_['autoplay'] = value;\n    return this;\n  }\n  return this.techGet('autoplay', value);\n};\nvjs.Player.prototype.loop = function(value){\n  if (value !== undefined) {\n    this.techCall('setLoop', value);\n    this.options_['loop'] = value;\n    return this;\n  }\n  return this.techGet('loop');\n};\n\n/**\n * the url of the poster image source\n * @type {String}\n * @private\n */\nvjs.Player.prototype.poster_;\n\n/**\n * get or set the poster image source url\n *\n * ##### EXAMPLE:\n *\n *     // getting\n *     var currentPoster = myPlayer.poster();\n *\n *     // setting\n *     myPlayer.poster('http://example.com/myImage.jpg');\n *\n * @param  {String=} [src] Poster image source URL\n * @return {String} poster URL when getting\n * @return {vjs.Player} self when setting\n */\nvjs.Player.prototype.poster = function(src){\n  if (src !== undefined) {\n    this.poster_ = src;\n    return this;\n  }\n  return this.poster_;\n};\n\n/**\n * Whether or not the controls are showing\n * @type {Boolean}\n * @private\n */\nvjs.Player.prototype.controls_;\n\n/**\n * Get or set whether or not the controls are showing.\n * @param  {Boolean} controls Set controls to showing or not\n * @return {Boolean}    Controls are showing\n */\nvjs.Player.prototype.controls = function(bool){\n  if (bool !== undefined) {\n    bool = !!bool; // force boolean\n    // Don't trigger a change event unless it actually changed\n    if (this.controls_ !== bool) {\n      this.controls_ = bool;\n      if (bool) {\n        this.removeClass('vjs-controls-disabled');\n        this.addClass('vjs-controls-enabled');\n        this.trigger('controlsenabled');\n      } else {\n        this.removeClass('vjs-controls-enabled');\n        this.addClass('vjs-controls-disabled');\n        this.trigger('controlsdisabled');\n      }\n    }\n    return this;\n  }\n  return this.controls_;\n};\n\nvjs.Player.prototype.usingNativeControls_;\n\n/**\n * Toggle native controls on/off. Native controls are the controls built into\n * devices (e.g. default iPhone controls), Flash, or other techs\n * (e.g. Vimeo Controls)\n *\n * **This should only be set by the current tech, because only the tech knows\n * if it can support native controls**\n *\n * @param  {Boolean} bool    True signals that native controls are on\n * @return {vjs.Player}      Returns the player\n * @private\n */\nvjs.Player.prototype.usingNativeControls = function(bool){\n  if (bool !== undefined) {\n    bool = !!bool; // force boolean\n    // Don't trigger a change event unless it actually changed\n    if (this.usingNativeControls_ !== bool) {\n      this.usingNativeControls_ = bool;\n      if (bool) {\n        this.addClass('vjs-using-native-controls');\n\n        /**\n         * player is using the native device controls\n         *\n         * @event usingnativecontrols\n         * @memberof vjs.Player\n         * @instance\n         * @private\n         */\n        this.trigger('usingnativecontrols');\n      } else {\n        this.removeClass('vjs-using-native-controls');\n\n        /**\n         * player is using the custom HTML controls\n         *\n         * @event usingcustomcontrols\n         * @memberof vjs.Player\n         * @instance\n         * @private\n         */\n        this.trigger('usingcustomcontrols');\n      }\n    }\n    return this;\n  }\n  return this.usingNativeControls_;\n};\n\nvjs.Player.prototype.error = function(){ return this.techGet('error'); };\nvjs.Player.prototype.ended = function(){ return this.techGet('ended'); };\nvjs.Player.prototype.seeking = function(){ return this.techGet('seeking'); };\n\n// When the player is first initialized, trigger activity so components\n// like the control bar show themselves if needed\nvjs.Player.prototype.userActivity_ = true;\nvjs.Player.prototype.reportUserActivity = function(event){\n  this.userActivity_ = true;\n};\n\nvjs.Player.prototype.userActive_ = true;\nvjs.Player.prototype.userActive = function(bool){\n  if (bool !== undefined) {\n    bool = !!bool;\n    if (bool !== this.userActive_) {\n      this.userActive_ = bool;\n      if (bool) {\n        // If the user was inactive and is now active we want to reset the\n        // inactivity timer\n        this.userActivity_ = true;\n        this.removeClass('vjs-user-inactive');\n        this.addClass('vjs-user-active');\n        this.trigger('useractive');\n      } else {\n        // We're switching the state to inactive manually, so erase any other\n        // activity\n        this.userActivity_ = false;\n\n        // Chrome/Safari/IE have bugs where when you change the cursor it can\n        // trigger a mousemove event. This causes an issue when you're hiding\n        // the cursor when the user is inactive, and a mousemove signals user\n        // activity. Making it impossible to go into inactive mode. Specifically\n        // this happens in fullscreen when we really need to hide the cursor.\n        //\n        // When this gets resolved in ALL browsers it can be removed\n        // https://code.google.com/p/chromium/issues/detail?id=103041\n        this.tech.one('mousemove', function(e){\n          e.stopPropagation();\n          e.preventDefault();\n        });\n        this.removeClass('vjs-user-active');\n        this.addClass('vjs-user-inactive');\n        this.trigger('userinactive');\n      }\n    }\n    return this;\n  }\n  return this.userActive_;\n};\n\nvjs.Player.prototype.listenForUserActivity = function(){\n  var onMouseActivity, onMouseDown, mouseInProgress, onMouseUp,\n      activityCheck, inactivityTimeout;\n\n  onMouseActivity = this.reportUserActivity;\n\n  onMouseDown = function() {\n    onMouseActivity();\n    // For as long as the they are touching the device or have their mouse down,\n    // we consider them active even if they're not moving their finger or mouse.\n    // So we want to continue to update that they are active\n    clearInterval(mouseInProgress);\n    // Setting userActivity=true now and setting the interval to the same time\n    // as the activityCheck interval (250) should ensure we never miss the\n    // next activityCheck\n    mouseInProgress = setInterval(vjs.bind(this, onMouseActivity), 250);\n  };\n\n  onMouseUp = function(event) {\n    onMouseActivity();\n    // Stop the interval that maintains activity if the mouse/touch is down\n    clearInterval(mouseInProgress);\n  };\n\n  // Any mouse movement will be considered user activity\n  this.on('mousedown', onMouseDown);\n  this.on('mousemove', onMouseActivity);\n  this.on('mouseup', onMouseUp);\n\n  // Listen for keyboard navigation\n  // Shouldn't need to use inProgress interval because of key repeat\n  this.on('keydown', onMouseActivity);\n  this.on('keyup', onMouseActivity);\n\n  // Consider any touch events that bubble up to be activity\n  // Certain touches on the tech will be blocked from bubbling because they\n  // toggle controls\n  this.on('touchstart', onMouseDown);\n  this.on('touchmove', onMouseActivity);\n  this.on('touchend', onMouseUp);\n  this.on('touchcancel', onMouseUp);\n\n  // Run an interval every 250 milliseconds instead of stuffing everything into\n  // the mousemove/touchmove function itself, to prevent performance degradation.\n  // `this.reportUserActivity` simply sets this.userActivity_ to true, which\n  // then gets picked up by this loop\n  // http://ejohn.org/blog/learning-from-twitter/\n  activityCheck = setInterval(vjs.bind(this, function() {\n    // Check to see if mouse/touch activity has happened\n    if (this.userActivity_) {\n      // Reset the activity tracker\n      this.userActivity_ = false;\n\n      // If the user state was inactive, set the state to active\n      this.userActive(true);\n\n      // Clear any existing inactivity timeout to start the timer over\n      clearTimeout(inactivityTimeout);\n\n      // In X seconds, if no more activity has occurred the user will be\n      // considered inactive\n      inactivityTimeout = setTimeout(vjs.bind(this, function() {\n        // Protect against the case where the inactivityTimeout can trigger just\n        // before the next user activity is picked up by the activityCheck loop\n        // causing a flicker\n        if (!this.userActivity_) {\n          this.userActive(false);\n        }\n      }), 2000);\n    }\n  }), 250);\n\n  // Clean up the intervals when we kill the player\n  this.on('dispose', function(){\n    clearInterval(activityCheck);\n    clearTimeout(inactivityTimeout);\n  });\n};\n\n// Methods to add support for\n// networkState: function(){ return this.techCall('networkState'); },\n// readyState: function(){ return this.techCall('readyState'); },\n// seeking: function(){ return this.techCall('seeking'); },\n// initialTime: function(){ return this.techCall('initialTime'); },\n// startOffsetTime: function(){ return this.techCall('startOffsetTime'); },\n// played: function(){ return this.techCall('played'); },\n// seekable: function(){ return this.techCall('seekable'); },\n// videoTracks: function(){ return this.techCall('videoTracks'); },\n// audioTracks: function(){ return this.techCall('audioTracks'); },\n// videoWidth: function(){ return this.techCall('videoWidth'); },\n// videoHeight: function(){ return this.techCall('videoHeight'); },\n// defaultPlaybackRate: function(){ return this.techCall('defaultPlaybackRate'); },\n// playbackRate: function(){ return this.techCall('playbackRate'); },\n// mediaGroup: function(){ return this.techCall('mediaGroup'); },\n// controller: function(){ return this.techCall('controller'); },\n// defaultMuted: function(){ return this.techCall('defaultMuted'); }\n\n// TODO\n// currentSrcList: the array of sources including other formats and bitrates\n// playList: array of source lists in order of playback\n\n// RequestFullscreen API\n(function(){\n  var prefix, requestFS, div;\n\n  div = document.createElement('div');\n\n  requestFS = {};\n\n  // Current W3C Spec\n  // http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#api\n  // Mozilla Draft: https://wiki.mozilla.org/Gecko:FullScreenAPI#fullscreenchange_event\n  // New: https://dvcs.w3.org/hg/fullscreen/raw-file/529a67b8d9f3/Overview.html\n  if (div.cancelFullscreen !== undefined) {\n    requestFS.requestFn = 'requestFullscreen';\n    requestFS.cancelFn = 'exitFullscreen';\n    requestFS.eventName = 'fullscreenchange';\n    requestFS.isFullScreen = 'fullScreen';\n\n  // Webkit (Chrome/Safari) and Mozilla (Firefox) have working implementations\n  // that use prefixes and vary slightly from the new W3C spec. Specifically,\n  // using 'exit' instead of 'cancel', and lowercasing the 'S' in Fullscreen.\n  // Other browsers don't have any hints of which version they might follow yet,\n  // so not going to try to predict by looping through all prefixes.\n  } else {\n\n    if (document.mozCancelFullScreen) {\n      prefix = 'moz';\n      requestFS.isFullScreen = prefix + 'FullScreen';\n    } else {\n      prefix = 'webkit';\n      requestFS.isFullScreen = prefix + 'IsFullScreen';\n    }\n\n    if (div[prefix + 'RequestFullScreen']) {\n      requestFS.requestFn = prefix + 'RequestFullScreen';\n      requestFS.cancelFn = prefix + 'CancelFullScreen';\n    }\n    requestFS.eventName = prefix + 'fullscreenchange';\n  }\n\n  if (document[requestFS.cancelFn]) {\n    vjs.support.requestFullScreen = requestFS;\n  }\n\n})();\n\n\n/**\n * Container of main controls\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @class\n * @constructor\n * @extends vjs.Component\n */\nvjs.ControlBar = vjs.Component.extend();\n\nvjs.ControlBar.prototype.options_ = {\n  loadEvent: 'play',\n  children: {\n    'playToggle': {},\n    'currentTimeDisplay': {},\n    'timeDivider': {},\n    'durationDisplay': {},\n    'remainingTimeDisplay': {},\n    'progressControl': {},\n    'fullscreenToggle': {},\n    'volumeControl': {},\n    'muteToggle': {}\n    // 'volumeMenuButton': {}\n  }\n};\n\nvjs.ControlBar.prototype.createEl = function(){\n  return vjs.createEl('div', {\n    className: 'vjs-control-bar'\n  });\n};\n/**\n * Button to toggle between play and pause\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @class\n * @constructor\n */\nvjs.PlayToggle = vjs.Button.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Button.call(this, player, options);\n\n    player.on('play', vjs.bind(this, this.onPlay));\n    player.on('pause', vjs.bind(this, this.onPause));\n  }\n});\n\nvjs.PlayToggle.prototype.buttonText = 'Play';\n\nvjs.PlayToggle.prototype.buildCSSClass = function(){\n  return 'vjs-play-control ' + vjs.Button.prototype.buildCSSClass.call(this);\n};\n\n// OnClick - Toggle between play and pause\nvjs.PlayToggle.prototype.onClick = function(){\n  if (this.player_.paused()) {\n    this.player_.play();\n  } else {\n    this.player_.pause();\n  }\n};\n\n  // OnPlay - Add the vjs-playing class to the element so it can change appearance\nvjs.PlayToggle.prototype.onPlay = function(){\n  vjs.removeClass(this.el_, 'vjs-paused');\n  vjs.addClass(this.el_, 'vjs-playing');\n  this.el_.children[0].children[0].innerHTML = 'Pause'; // change the button text to \"Pause\"\n};\n\n  // OnPause - Add the vjs-paused class to the element so it can change appearance\nvjs.PlayToggle.prototype.onPause = function(){\n  vjs.removeClass(this.el_, 'vjs-playing');\n  vjs.addClass(this.el_, 'vjs-paused');\n  this.el_.children[0].children[0].innerHTML = 'Play'; // change the button text to \"Play\"\n};\n/**\n * Displays the current time\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.CurrentTimeDisplay = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n\n    player.on('timeupdate', vjs.bind(this, this.updateContent));\n  }\n});\n\nvjs.CurrentTimeDisplay.prototype.createEl = function(){\n  var el = vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-current-time vjs-time-controls vjs-control'\n  });\n\n  this.content = vjs.createEl('div', {\n    className: 'vjs-current-time-display',\n    innerHTML: '<span class=\"vjs-control-text\">Current Time </span>' + '0:00', // label the current time for screen reader users\n    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes\n  });\n\n  el.appendChild(vjs.createEl('div').appendChild(this.content));\n  return el;\n};\n\nvjs.CurrentTimeDisplay.prototype.updateContent = function(){\n  // Allows for smooth scrubbing, when player can't keep up.\n  var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();\n  this.content.innerHTML = '<span class=\"vjs-control-text\">Current Time </span>' + vjs.formatTime(time, this.player_.duration());\n};\n\n/**\n * Displays the duration\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.DurationDisplay = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n\n    player.on('timeupdate', vjs.bind(this, this.updateContent)); // this might need to be changes to 'durationchange' instead of 'timeupdate' eventually, however the durationchange event fires before this.player_.duration() is set, so the value cannot be written out using this method. Once the order of durationchange and this.player_.duration() being set is figured out, this can be updated.\n  }\n});\n\nvjs.DurationDisplay.prototype.createEl = function(){\n  var el = vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-duration vjs-time-controls vjs-control'\n  });\n\n  this.content = vjs.createEl('div', {\n    className: 'vjs-duration-display',\n    innerHTML: '<span class=\"vjs-control-text\">Duration Time </span>' + '0:00', // label the duration time for screen reader users\n    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes\n  });\n\n  el.appendChild(vjs.createEl('div').appendChild(this.content));\n  return el;\n};\n\nvjs.DurationDisplay.prototype.updateContent = function(){\n  var duration = this.player_.duration();\n  if (duration) {\n      this.content.innerHTML = '<span class=\"vjs-control-text\">Duration Time </span>' + vjs.formatTime(duration); // label the duration time for screen reader users\n  }\n};\n\n/**\n * The separator between the current time and duration\n *\n * Can be hidden if it's not needed in the design.\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.TimeDivider = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n  }\n});\n\nvjs.TimeDivider.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-time-divider',\n    innerHTML: '<div><span>/</span></div>'\n  });\n};\n\n/**\n * Displays the time left in the video\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.RemainingTimeDisplay = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n\n    player.on('timeupdate', vjs.bind(this, this.updateContent));\n  }\n});\n\nvjs.RemainingTimeDisplay.prototype.createEl = function(){\n  var el = vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-remaining-time vjs-time-controls vjs-control'\n  });\n\n  this.content = vjs.createEl('div', {\n    className: 'vjs-remaining-time-display',\n    innerHTML: '<span class=\"vjs-control-text\">Remaining Time </span>' + '-0:00', // label the remaining time for screen reader users\n    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes\n  });\n\n  el.appendChild(vjs.createEl('div').appendChild(this.content));\n  return el;\n};\n\nvjs.RemainingTimeDisplay.prototype.updateContent = function(){\n  if (this.player_.duration()) {\n    this.content.innerHTML = '<span class=\"vjs-control-text\">Remaining Time </span>' + '-'+ vjs.formatTime(this.player_.remainingTime());\n  }\n\n  // Allows for smooth scrubbing, when player can't keep up.\n  // var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();\n  // this.content.innerHTML = vjs.formatTime(time, this.player_.duration());\n};\n/**\n * Toggle fullscreen video\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @class\n * @extends vjs.Button\n */\nvjs.FullscreenToggle = vjs.Button.extend({\n  /**\n   * @constructor\n   * @memberof vjs.FullscreenToggle\n   * @instance\n   */\n  init: function(player, options){\n    vjs.Button.call(this, player, options);\n  }\n});\n\nvjs.FullscreenToggle.prototype.buttonText = 'Fullscreen';\n\nvjs.FullscreenToggle.prototype.buildCSSClass = function(){\n  return 'vjs-fullscreen-control ' + vjs.Button.prototype.buildCSSClass.call(this);\n};\n\nvjs.FullscreenToggle.prototype.onClick = function(){\n  if (!this.player_.isFullScreen) {\n    this.player_.requestFullScreen();\n    this.el_.children[0].children[0].innerHTML = 'Non-Fullscreen'; // change the button text to \"Non-Fullscreen\"\n  } else {\n    this.player_.cancelFullScreen();\n    this.el_.children[0].children[0].innerHTML = 'Fullscreen'; // change the button to \"Fullscreen\"\n  }\n};\n/**\n * The Progress Control component contains the seek bar, load progress,\n * and play progress\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.ProgressControl = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n  }\n});\n\nvjs.ProgressControl.prototype.options_ = {\n  children: {\n    'seekBar': {}\n  }\n};\n\nvjs.ProgressControl.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-progress-control vjs-control'\n  });\n};\n\n/**\n * Seek Bar and holder for the progress bars\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.SeekBar = vjs.Slider.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Slider.call(this, player, options);\n    player.on('timeupdate', vjs.bind(this, this.updateARIAAttributes));\n    player.ready(vjs.bind(this, this.updateARIAAttributes));\n  }\n});\n\nvjs.SeekBar.prototype.options_ = {\n  children: {\n    'loadProgressBar': {},\n    'playProgressBar': {},\n    'seekHandle': {}\n  },\n  'barName': 'playProgressBar',\n  'handleName': 'seekHandle'\n};\n\nvjs.SeekBar.prototype.playerEvent = 'timeupdate';\n\nvjs.SeekBar.prototype.createEl = function(){\n  return vjs.Slider.prototype.createEl.call(this, 'div', {\n    className: 'vjs-progress-holder',\n    'aria-label': 'video progress bar'\n  });\n};\n\nvjs.SeekBar.prototype.updateARIAAttributes = function(){\n    // Allows for smooth scrubbing, when player can't keep up.\n    var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();\n    this.el_.setAttribute('aria-valuenow',vjs.round(this.getPercent()*100, 2)); // machine readable value of progress bar (percentage complete)\n    this.el_.setAttribute('aria-valuetext',vjs.formatTime(time, this.player_.duration())); // human readable value of progress bar (time complete)\n};\n\nvjs.SeekBar.prototype.getPercent = function(){\n  var currentTime;\n  // Flash RTMP provider will not report the correct time\n  // immediately after a seek. This isn't noticeable if you're\n  // seeking while the video is playing, but it is if you seek\n  // while the video is paused.\n  if (this.player_.techName === 'Flash' && this.player_.seeking()) {\n    var cache = this.player_.getCache();\n    if (cache.lastSetCurrentTime) {\n      currentTime = cache.lastSetCurrentTime;\n    }\n    else {\n      currentTime = this.player_.currentTime();\n    }\n  }\n  else {\n    currentTime = this.player_.currentTime();\n  }\n\n  return currentTime / this.player_.duration();\n};\n\nvjs.SeekBar.prototype.onMouseDown = function(event){\n  vjs.Slider.prototype.onMouseDown.call(this, event);\n\n  this.player_.scrubbing = true;\n\n  this.videoWasPlaying = !this.player_.paused();\n  this.player_.pause();\n};\n\nvjs.SeekBar.prototype.onMouseMove = function(event){\n  var newTime = this.calculateDistance(event) * this.player_.duration();\n\n  // Don't let video end while scrubbing.\n  if (newTime == this.player_.duration()) { newTime = newTime - 0.1; }\n\n  // Set new time (tell player to seek to new time)\n  this.player_.currentTime(newTime);\n};\n\nvjs.SeekBar.prototype.onMouseUp = function(event){\n    debugger\n  vjs.Slider.prototype.onMouseUp.call(this, event);\n\n  this.player_.scrubbing = false;\n  if (this.videoWasPlaying) {\n      debugger\n    this.player_.play();\n  }\n};\n\nvjs.SeekBar.prototype.stepForward = function(){\n  this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users\n};\n\nvjs.SeekBar.prototype.stepBack = function(){\n  this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users\n};\n\n\n/**\n * Shows load progress\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.LoadProgressBar = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n    player.on('progress', vjs.bind(this, this.update));\n  }\n});\n\nvjs.LoadProgressBar.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-load-progress',\n    innerHTML: '<span class=\"vjs-control-text\">Loaded: 0%</span>'\n  });\n};\n\nvjs.LoadProgressBar.prototype.update = function(){\n  if (this.el_.style) { this.el_.style.width = vjs.round(this.player_.bufferedPercent() * 100, 2) + '%'; }\n};\n\n\n/**\n * Shows play progress\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.PlayProgressBar = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n  }\n});\n\nvjs.PlayProgressBar.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-play-progress',\n    innerHTML: '<span class=\"vjs-control-text\">Progress: 0%</span>'\n  });\n};\n\n/**\n * The Seek Handle shows the current position of the playhead during playback,\n * and can be dragged to adjust the playhead.\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.SeekHandle = vjs.SliderHandle.extend();\n\n/**\n * The default value for the handle content, which may be read by screen readers\n *\n * @type {String}\n * @private\n */\nvjs.SeekHandle.prototype.defaultValue = '00:00';\n\n/** @inheritDoc */\nvjs.SeekHandle.prototype.createEl = function(){\n  return vjs.SliderHandle.prototype.createEl.call(this, 'div', {\n    className: 'vjs-seek-handle'\n  });\n};\n/**\n * The component for controlling the volume level\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.VolumeControl = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n\n    // hide volume controls when they're not supported by the current tech\n    if (player.tech && player.tech.features && player.tech.features['volumeControl'] === false) {\n      this.addClass('vjs-hidden');\n    }\n    player.on('loadstart', vjs.bind(this, function(){\n      if (player.tech.features && player.tech.features['volumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    }));\n  }\n});\n\nvjs.VolumeControl.prototype.options_ = {\n  children: {\n    'volumeBar': {}\n  }\n};\n\nvjs.VolumeControl.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-volume-control vjs-control'\n  });\n};\n\n/**\n * The bar that contains the volume level and can be clicked on to adjust the level\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.VolumeBar = vjs.Slider.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Slider.call(this, player, options);\n    player.on('volumechange', vjs.bind(this, this.updateARIAAttributes));\n    player.ready(vjs.bind(this, this.updateARIAAttributes));\n    setTimeout(vjs.bind(this, this.update), 0); // update when elements is in DOM\n  }\n});\n\nvjs.VolumeBar.prototype.updateARIAAttributes = function(){\n  // Current value of volume bar as a percentage\n  this.el_.setAttribute('aria-valuenow',vjs.round(this.player_.volume()*100, 2));\n  this.el_.setAttribute('aria-valuetext',vjs.round(this.player_.volume()*100, 2)+'%');\n};\n\nvjs.VolumeBar.prototype.options_ = {\n  children: {\n    'volumeLevel': {},\n    'volumeHandle': {}\n  },\n  'barName': 'volumeLevel',\n  'handleName': 'volumeHandle'\n};\n\nvjs.VolumeBar.prototype.playerEvent = 'volumechange';\n\nvjs.VolumeBar.prototype.createEl = function(){\n  return vjs.Slider.prototype.createEl.call(this, 'div', {\n    className: 'vjs-volume-bar',\n    'aria-label': 'volume level'\n  });\n};\n\nvjs.VolumeBar.prototype.onMouseMove = function(event) {\n  if (this.player_.muted()) {\n    this.player_.muted(false);\n  }\n\n  this.player_.volume(this.calculateDistance(event));\n};\n\nvjs.VolumeBar.prototype.getPercent = function(){\n  if (this.player_.muted()) {\n    return 0;\n  } else {\n    return this.player_.volume();\n  }\n};\n\nvjs.VolumeBar.prototype.stepForward = function(){\n  this.player_.volume(this.player_.volume() + 0.1);\n};\n\nvjs.VolumeBar.prototype.stepBack = function(){\n  this.player_.volume(this.player_.volume() - 0.1);\n};\n\n/**\n * Shows volume level\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.VolumeLevel = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n  }\n});\n\nvjs.VolumeLevel.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-volume-level',\n    innerHTML: '<span class=\"vjs-control-text\"></span>'\n  });\n};\n\n/**\n * The volume handle can be dragged to adjust the volume level\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\n vjs.VolumeHandle = vjs.SliderHandle.extend();\n\n vjs.VolumeHandle.prototype.defaultValue = '00:00';\n\n /** @inheritDoc */\n vjs.VolumeHandle.prototype.createEl = function(){\n   return vjs.SliderHandle.prototype.createEl.call(this, 'div', {\n     className: 'vjs-volume-handle'\n   });\n };\n/**\n * A button component for muting the audio\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.MuteToggle = vjs.Button.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Button.call(this, player, options);\n\n    player.on('volumechange', vjs.bind(this, this.update));\n\n    // hide mute toggle if the current tech doesn't support volume control\n    if (player.tech && player.tech.features && player.tech.features['volumeControl'] === false) {\n      this.addClass('vjs-hidden');\n    }\n    player.on('loadstart', vjs.bind(this, function(){\n      if (player.tech.features && player.tech.features['volumeControl'] === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    }));\n  }\n});\n\nvjs.MuteToggle.prototype.createEl = function(){\n  return vjs.Button.prototype.createEl.call(this, 'div', {\n    className: 'vjs-mute-control vjs-control',\n    innerHTML: '<div><span class=\"vjs-control-text\">Mute</span></div>'\n  });\n};\n\nvjs.MuteToggle.prototype.onClick = function(){\n  this.player_.muted( this.player_.muted() ? false : true );\n};\n\nvjs.MuteToggle.prototype.update = function(){\n  var vol = this.player_.volume(),\n      level = 3;\n\n  if (vol === 0 || this.player_.muted()) {\n    level = 0;\n  } else if (vol < 0.33) {\n    level = 1;\n  } else if (vol < 0.67) {\n    level = 2;\n  }\n\n  // Don't rewrite the button text if the actual text doesn't change.\n  // This causes unnecessary and confusing information for screen reader users.\n  // This check is needed because this function gets called every time the volume level is changed.\n  if(this.player_.muted()){\n      if(this.el_.children[0].children[0].innerHTML!='Unmute'){\n          this.el_.children[0].children[0].innerHTML = 'Unmute'; // change the button text to \"Unmute\"\n      }\n  } else {\n      if(this.el_.children[0].children[0].innerHTML!='Mute'){\n          this.el_.children[0].children[0].innerHTML = 'Mute'; // change the button text to \"Mute\"\n      }\n  }\n\n  /* TODO improve muted icon classes */\n  for (var i = 0; i < 4; i++) {\n    vjs.removeClass(this.el_, 'vjs-vol-'+i);\n  }\n  vjs.addClass(this.el_, 'vjs-vol-'+level);\n};\n/**\n * Menu button with a popup for showing the volume slider.\n * @constructor\n */\nvjs.VolumeMenuButton = vjs.MenuButton.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.MenuButton.call(this, player, options);\n\n    // Same listeners as MuteToggle\n    player.on('volumechange', vjs.bind(this, this.update));\n\n    // hide mute toggle if the current tech doesn't support volume control\n    if (player.tech && player.tech.features && player.tech.features.volumeControl === false) {\n      this.addClass('vjs-hidden');\n    }\n    player.on('loadstart', vjs.bind(this, function(){\n      if (player.tech.features && player.tech.features.volumeControl === false) {\n        this.addClass('vjs-hidden');\n      } else {\n        this.removeClass('vjs-hidden');\n      }\n    }));\n    this.addClass('vjs-menu-button');\n  }\n});\n\nvjs.VolumeMenuButton.prototype.createMenu = function(){\n  var menu = new vjs.Menu(this.player_, {\n    contentElType: 'div'\n  });\n  var vc = new vjs.VolumeBar(this.player_, vjs.obj.merge({vertical: true}, this.options_.volumeBar));\n  menu.addChild(vc);\n  return menu;\n};\n\nvjs.VolumeMenuButton.prototype.onClick = function(){\n  vjs.MuteToggle.prototype.onClick.call(this);\n  vjs.MenuButton.prototype.onClick.call(this);\n};\n\nvjs.VolumeMenuButton.prototype.createEl = function(){\n  return vjs.Button.prototype.createEl.call(this, 'div', {\n    className: 'vjs-volume-menu-button vjs-menu-button vjs-control',\n    innerHTML: '<div><span class=\"vjs-control-text\">Mute</span></div>'\n  });\n};\nvjs.VolumeMenuButton.prototype.update = vjs.MuteToggle.prototype.update;\n/* Poster Image\n================================================================================ */\n/**\n * The component that handles showing the poster image.\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.PosterImage = vjs.Button.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Button.call(this, player, options);\n\n    if (!player.poster() || !player.controls()) {\n      this.hide();\n    }\n\n    player.on('play', vjs.bind(this, this.hide));\n  }\n});\n\nvjs.PosterImage.prototype.createEl = function(){\n  var el = vjs.createEl('div', {\n        className: 'vjs-poster',\n\n        // Don't want poster to be tabbable.\n        tabIndex: -1\n      }),\n      poster = this.player_.poster();\n\n  if (poster) {\n    if ('backgroundSize' in el.style) {\n      el.style.backgroundImage = 'url(\"' + poster + '\")';\n    } else {\n      el.appendChild(vjs.createEl('img', { src: poster }));\n    }\n  }\n\n  return el;\n};\n\nvjs.PosterImage.prototype.onClick = function(){\n  // Only accept clicks when controls are enabled\n  if (this.player().controls()) {\n    this.player_.play();\n  }\n};\n/* Loading Spinner\n================================================================================ */\n/**\n * Loading spinner for waiting events\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @class\n * @constructor\n */\nvjs.LoadingSpinner = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n\n    player.on('canplay', vjs.bind(this, this.hide));\n    player.on('canplaythrough', vjs.bind(this, this.hide));\n    player.on('playing', vjs.bind(this, this.hide));\n    player.on('seeked', vjs.bind(this, this.hide));\n\n    player.on('seeking', vjs.bind(this, this.show));\n\n    // in some browsers seeking does not trigger the 'playing' event,\n    // so we also need to trap 'seeked' if we are going to set a\n    // 'seeking' event\n    player.on('seeked', vjs.bind(this, this.hide));\n\n    player.on('error', vjs.bind(this, this.show));\n\n    // Not showing spinner on stalled any more. Browsers may stall and then not trigger any events that would remove the spinner.\n    // Checked in Chrome 16 and Safari 5.1.2. http://help.videojs.com/discussions/problems/883-why-is-the-download-progress-showing\n    // player.on('stalled', vjs.bind(this, this.show));\n\n    player.on('waiting', vjs.bind(this, this.show));\n  }\n});\n\nvjs.LoadingSpinner.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-loading-spinner'\n  });\n};\n/* Big Play Button\n================================================================================ */\n/**\n * Initial play button. Shows before the video has played. The hiding of the\n * big play button is done via CSS and player states.\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @class\n * @constructor\n */\nvjs.BigPlayButton = vjs.Button.extend();\n\nvjs.BigPlayButton.prototype.createEl = function(){\n  return vjs.Button.prototype.createEl.call(this, 'div', {\n    className: 'vjs-big-play-button',\n    innerHTML: '<span aria-hidden=\"true\"></span>',\n    'aria-label': 'play video'\n  });\n};\n\nvjs.BigPlayButton.prototype.onClick = function(){\n  this.player_.play();\n};\n/**\n * @fileoverview Media Technology Controller - Base class for media playback\n * technology controllers like Flash and HTML5\n */\n\n/**\n * Base class for media (HTML5 Video, Flash) controllers\n * @param {vjs.Player|Object} player  Central player instance\n * @param {Object=} options Options object\n * @constructor\n */\nvjs.MediaTechController = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options, ready){\n    vjs.Component.call(this, player, options, ready);\n\n    this.initControlsListeners();\n  }\n});\n\n/**\n * Set up click and touch listeners for the playback element\n * On desktops, a click on the video itself will toggle playback,\n * on a mobile device a click on the video toggles controls.\n * (toggling controls is done by toggling the user state between active and\n * inactive)\n *\n * A tap can signal that a user has become active, or has become inactive\n * e.g. a quick tap on an iPhone movie should reveal the controls. Another\n * quick tap should hide them again (signaling the user is in an inactive\n * viewing state)\n *\n * In addition to this, we still want the user to be considered inactive after\n * a few seconds of inactivity.\n *\n * Note: the only part of iOS interaction we can't mimic with this setup\n * is a touch and hold on the video element counting as activity in order to\n * keep the controls showing, but that shouldn't be an issue. A touch and hold on\n * any controls will still keep the user active\n */\nvjs.MediaTechController.prototype.initControlsListeners = function(){\n  var player, tech, activateControls, deactivateControls;\n\n  tech = this;\n  player = this.player();\n\n  var activateControls = function(){\n    if (player.controls() && !player.usingNativeControls()) {\n      tech.addControlsListeners();\n    }\n  };\n\n  deactivateControls = vjs.bind(tech, tech.removeControlsListeners);\n\n  // Set up event listeners once the tech is ready and has an element to apply\n  // listeners to\n  this.ready(activateControls);\n  player.on('controlsenabled', activateControls);\n  player.on('controlsdisabled', deactivateControls);\n};\n\nvjs.MediaTechController.prototype.addControlsListeners = function(){\n  var preventBubble, userWasActive;\n\n  // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do\n  // trigger mousedown/up.\n  // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object\n  // Any touch events are set to block the mousedown event from happening\n  this.on('mousedown', this.onClick);\n\n  // We need to block touch events on the video element from bubbling up,\n  // otherwise they'll signal activity prematurely. The specific use case is\n  // when the video is playing and the controls have faded out. In this case\n  // only a tap (fast touch) should toggle the user active state and turn the\n  // controls back on. A touch and move or touch and hold should not trigger\n  // the controls (per iOS as an example at least)\n  //\n  // We always want to stop propagation on touchstart because touchstart\n  // at the player level starts the touchInProgress interval. We can still\n  // report activity on the other events, but won't let them bubble for\n  // consistency. We don't want to bubble a touchend without a touchstart.\n  this.on('touchstart', function(event) {\n    // Stop the mouse events from also happening\n    event.preventDefault();\n    event.stopPropagation();\n    // Record if the user was active now so we don't have to keep polling it\n    userWasActive = this.player_.userActive();\n  });\n\n  preventBubble = function(event){\n    event.stopPropagation();\n    if (userWasActive) {\n      this.player_.reportUserActivity();\n    }\n  };\n\n  // Treat all touch events the same for consistency\n  this.on('touchmove', preventBubble);\n  this.on('touchleave', preventBubble);\n  this.on('touchcancel', preventBubble);\n  this.on('touchend', preventBubble);\n\n  // Turn on component tap events\n  this.emitTapEvents();\n\n  // The tap listener needs to come after the touchend listener because the tap\n  // listener cancels out any reportedUserActivity when setting userActive(false)\n  this.on('tap', this.onTap);\n};\n\n/**\n * Remove the listeners used for click and tap controls. This is needed for\n * toggling to controls disabled, where a tap/touch should do nothing.\n */\nvjs.MediaTechController.prototype.removeControlsListeners = function(){\n  // We don't want to just use `this.off()` because there might be other needed\n  // listeners added by techs that extend this.\n  this.off('tap');\n  this.off('touchstart');\n  this.off('touchmove');\n  this.off('touchleave');\n  this.off('touchcancel');\n  this.off('touchend');\n  this.off('click');\n  this.off('mousedown');\n};\n\n/**\n * Handle a click on the media element. By default will play/pause the media.\n */\nvjs.MediaTechController.prototype.onClick = function(event){\n  // We're using mousedown to detect clicks thanks to Flash, but mousedown\n  // will also be triggered with right-clicks, so we need to prevent that\n  if (event.button !== 0) return;\n\n  // When controls are disabled a click should not toggle playback because\n  // the click is considered a control\n  if (this.player().controls()) {\n    if (this.player().paused()) {\n      this.player().play();\n    } else {\n      this.player().pause();\n    }\n  }\n};\n\n/**\n * Handle a tap on the media element. By default it will toggle the user\n * activity state, which hides and shows the controls.\n */\n\nvjs.MediaTechController.prototype.onTap = function(){\n  this.player().userActive(!this.player().userActive());\n};\n\nvjs.MediaTechController.prototype.features = {\n  'volumeControl': true,\n\n  // Resizing plugins using request fullscreen reloads the plugin\n  'fullscreenResize': false,\n\n  // Optional events that we can manually mimic with timers\n  // currently not triggered by video-js-swf\n  'progressEvents': false,\n  'timeupdateEvents': false\n};\n\nvjs.media = {};\n\n/**\n * List of default API methods for any MediaTechController\n * @type {String}\n */\nvjs.media.ApiMethods = 'play,pause,paused,currentTime,setCurrentTime,duration,buffered,volume,setVolume,muted,setMuted,width,height,supportsFullScreen,enterFullScreen,src,load,currentSrc,preload,setPreload,autoplay,setAutoplay,loop,setLoop,error,networkState,readyState,seeking,initialTime,startOffsetTime,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks,defaultPlaybackRate,playbackRate,mediaGroup,controller,controls,defaultMuted'.split(',');\n// Create placeholder methods for each that warn when a method isn't supported by the current playback technology\n\nfunction createMethod(methodName){\n  return function(){\n    throw new Error('The \"'+methodName+'\" method is not available on the playback technology\\'s API');\n  };\n}\n\nfor (var i = vjs.media.ApiMethods.length - 1; i >= 0; i--) {\n  var methodName = vjs.media.ApiMethods[i];\n  vjs.MediaTechController.prototype[vjs.media.ApiMethods[i]] = createMethod(methodName);\n}\n/**\n * @fileoverview HTML5 Media Controller - Wrapper for HTML5 Media API\n */\n\n/**\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @param {Function=} ready\n * @constructor\n */\nvjs.Html5 = vjs.MediaTechController.extend({\n  /** @constructor */\n  init: function(player, options, ready){\n    // volume cannot be changed from 1 on iOS\n    this.features['volumeControl'] = vjs.Html5.canControlVolume();\n\n    // In iOS, if you move a video element in the DOM, it breaks video playback.\n    this.features['movingMediaElementInDOM'] = !vjs.IS_IOS;\n\n    // HTML video is able to automatically resize when going to fullscreen\n    this.features['fullscreenResize'] = true;\n\n    vjs.MediaTechController.call(this, player, options, ready);\n\n    var source = options['source'];\n\n    // If the element source is already set, we may have missed the loadstart event, and want to trigger it.\n    // We don't want to set the source again and interrupt playback.\n    if (source && this.el_.currentSrc === source.src && this.el_.networkState > 0) {\n      player.trigger('loadstart');\n\n    // Otherwise set the source if one was provided.\n    } else if (source) {\n      this.el_.src = source.src;\n    }\n\n    // Determine if native controls should be used\n    // Our goal should be to get the custom controls on mobile solid everywhere\n    // so we can remove this all together. Right now this will block custom\n    // controls on touch enabled laptops like the Chrome Pixel\n    if (vjs.TOUCH_ENABLED && player.options()['nativeControlsForTouch'] !== false) {\n      this.useNativeControls();\n    }\n\n    // Chrome and Safari both have issues with autoplay.\n    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.\n    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)\n    // This fixes both issues. Need to wait for API, so it updates displays correctly\n    player.ready(function(){\n      if (this.tag && this.options_['autoplay'] && this.paused()) {\n        delete this.tag['poster']; // Chrome Fix. Fixed in Chrome v16.\n        this.play();\n      }\n    });\n\n    this.setupTriggers();\n    this.triggerReady();\n  }\n});\n\nvjs.Html5.prototype.dispose = function(){\n  vjs.MediaTechController.prototype.dispose.call(this);\n};\n\nvjs.Html5.prototype.createEl = function(){\n  var player = this.player_,\n      // If possible, reuse original tag for HTML5 playback technology element\n      el = player.tag,\n      newEl,\n      clone;\n\n  // Check if this browser supports moving the element into the box.\n  // On the iPhone video will break if you move the element,\n  // So we have to create a brand new element.\n  if (!el || this.features['movingMediaElementInDOM'] === false) {\n\n    // If the original tag is still there, clone and remove it.\n    if (el) {\n      clone = el.cloneNode(false);\n      vjs.Html5.disposeMediaElement(el);\n      el = clone;\n      player.tag = null;\n    } else {\n      el = vjs.createEl('video', {\n        id:player.id() + '_html5_api',\n        className:'vjs-tech'\n      });\n    }\n    // associate the player with the new tag\n    el['player'] = player;\n\n    vjs.insertFirst(el, player.el());\n  }\n\n  // Update specific tag settings, in case they were overridden\n  var attrs = ['autoplay','preload','loop','muted'];\n  for (var i = attrs.length - 1; i >= 0; i--) {\n    var attr = attrs[i];\n    if (player.options_[attr] !== null) {\n      el[attr] = player.options_[attr];\n    }\n  }\n\n  return el;\n  // jenniisawesome = true;\n};\n\n// Make video events trigger player events\n// May seem verbose here, but makes other APIs possible.\nvjs.Html5.prototype.setupTriggers = function(){\n  for (var i = vjs.Html5.Events.length - 1; i >= 0; i--) {\n    vjs.on(this.el_, vjs.Html5.Events[i], vjs.bind(this.player_, this.eventHandler));\n  }\n};\n// Triggers removed using this.off when disposed\n\nvjs.Html5.prototype.eventHandler = function(e){\n  this.trigger(e);\n\n  // No need for media events to bubble up.\n  e.stopPropagation();\n};\n\nvjs.Html5.prototype.useNativeControls = function(){\n  var tech, player, controlsOn, controlsOff, cleanUp;\n\n  tech = this;\n  player = this.player();\n\n  // If the player controls are enabled turn on the native controls\n  tech.setControls(player.controls());\n\n  // Update the native controls when player controls state is updated\n  controlsOn = function(){\n    tech.setControls(true);\n  };\n  controlsOff = function(){\n    tech.setControls(false);\n  };\n  player.on('controlsenabled', controlsOn);\n  player.on('controlsdisabled', controlsOff);\n\n  // Clean up when not using native controls anymore\n  cleanUp = function(){\n    player.off('controlsenabled', controlsOn);\n    player.off('controlsdisabled', controlsOff);\n  };\n  tech.on('dispose', cleanUp);\n  player.on('usingcustomcontrols', cleanUp);\n\n  // Update the state of the player to using native controls\n  player.usingNativeControls(true);\n};\n\n\nvjs.Html5.prototype.play = function(){ this.el_.play(); };\nvjs.Html5.prototype.pause = function(){ this.el_.pause(); };\nvjs.Html5.prototype.paused = function(){ return this.el_.paused; };\n\nvjs.Html5.prototype.currentTime = function(){ return this.el_.currentTime; };\nvjs.Html5.prototype.setCurrentTime = function(seconds){\n  try {\n    this.el_.currentTime = seconds;\n  } catch(e) {\n    vjs.log(e, 'Video is not ready. (Video.js)');\n    // this.warning(VideoJS.warnings.videoNotReady);\n  }\n};\n\nvjs.Html5.prototype.duration = function(){ return this.el_.duration || 0; };\nvjs.Html5.prototype.buffered = function(){ return this.el_.buffered; };\n\nvjs.Html5.prototype.volume = function(){ return this.el_.volume; };\nvjs.Html5.prototype.setVolume = function(percentAsDecimal){ this.el_.volume = percentAsDecimal; };\nvjs.Html5.prototype.muted = function(){ return this.el_.muted; };\nvjs.Html5.prototype.setMuted = function(muted){ this.el_.muted = muted; };\n\nvjs.Html5.prototype.width = function(){ return this.el_.offsetWidth; };\nvjs.Html5.prototype.height = function(){ return this.el_.offsetHeight; };\n\nvjs.Html5.prototype.supportsFullScreen = function(){\n  if (typeof this.el_.webkitEnterFullScreen == 'function') {\n\n    // Seems to be broken in Chromium/Chrome && Safari in Leopard\n    if (/Android/.test(vjs.USER_AGENT) || !/Chrome|Mac OS X 10.5/.test(vjs.USER_AGENT)) {\n      return true;\n    }\n  }\n  return false;\n};\n\nvjs.Html5.prototype.enterFullScreen = function(){\n  var video = this.el_;\n  if (video.paused && video.networkState <= video.HAVE_METADATA) {\n    // attempt to prime the video element for programmatic access\n    // this isn't necessary on the desktop but shouldn't hurt\n    this.el_.play();\n\n    // playing and pausing synchronously during the transition to fullscreen\n    // can get iOS ~6.1 devices into a play/pause loop\n    setTimeout(function(){\n      video.pause();\n      video.webkitEnterFullScreen();\n    }, 0);\n  } else {\n    video.webkitEnterFullScreen();\n  }\n};\nvjs.Html5.prototype.exitFullScreen = function(){\n  this.el_.webkitExitFullScreen();\n};\nvjs.Html5.prototype.src = function(src){ this.el_.src = src; };\nvjs.Html5.prototype.load = function(){ this.el_.load(); };\nvjs.Html5.prototype.currentSrc = function(){ return this.el_.currentSrc; };\n\nvjs.Html5.prototype.preload = function(){ return this.el_.preload; };\nvjs.Html5.prototype.setPreload = function(val){ this.el_.preload = val; };\n\nvjs.Html5.prototype.autoplay = function(){ return this.el_.autoplay; };\nvjs.Html5.prototype.setAutoplay = function(val){ this.el_.autoplay = val; };\n\nvjs.Html5.prototype.controls = function(){ return this.el_.controls; }\nvjs.Html5.prototype.setControls = function(val){ this.el_.controls = !!val; }\n\nvjs.Html5.prototype.loop = function(){ return this.el_.loop; };\nvjs.Html5.prototype.setLoop = function(val){ this.el_.loop = val; };\n\nvjs.Html5.prototype.error = function(){ return this.el_.error; };\nvjs.Html5.prototype.seeking = function(){ return this.el_.seeking; };\nvjs.Html5.prototype.ended = function(){ return this.el_.ended; };\nvjs.Html5.prototype.defaultMuted = function(){ return this.el_.defaultMuted; };\n\n/* HTML5 Support Testing ---------------------------------------------------- */\n\nvjs.Html5.isSupported = function(){\n  return !!vjs.TEST_VID.canPlayType;\n};\n\nvjs.Html5.canPlaySource = function(srcObj){\n  // IE9 on Windows 7 without MediaPlayer throws an error here\n  // https://github.com/videojs/video.js/issues/519\n  try {\n    return !!vjs.TEST_VID.canPlayType(srcObj.type);\n  } catch(e) {\n    return '';\n  }\n  // TODO: Check Type\n  // If no Type, check ext\n  // Check Media Type\n};\n\nvjs.Html5.canControlVolume = function(){\n  var volume =  vjs.TEST_VID.volume;\n  vjs.TEST_VID.volume = (volume / 2) + 0.1;\n  return volume !== vjs.TEST_VID.volume;\n};\n\n// List of all HTML5 events (various uses).\nvjs.Html5.Events = 'loadstart,suspend,abort,error,emptied,stalled,loadedmetadata,loadeddata,canplay,canplaythrough,playing,waiting,seeking,seeked,ended,durationchange,timeupdate,progress,play,pause,ratechange,volumechange'.split(',');\n\nvjs.Html5.disposeMediaElement = function(el){\n  if (!el) { return; }\n\n  el['player'] = null;\n\n  if (el.parentNode) {\n    el.parentNode.removeChild(el);\n  }\n\n  // remove any child track or source nodes to prevent their loading\n  while(el.hasChildNodes()) {\n    el.removeChild(el.firstChild);\n  }\n\n  // remove any src reference. not setting `src=''` because that causes a warning\n  // in firefox\n  el.removeAttribute('src');\n\n  // force the media element to update its loading state by calling load()\n  if (typeof el.load === 'function') {\n    el.load();\n  }\n};\n\n// HTML5 Feature detection and Device Fixes --------------------------------- //\n\n  // Override Android 2.2 and less canPlayType method which is broken\nif (vjs.IS_OLD_ANDROID) {\n  document.createElement('video').constructor.prototype.canPlayType = function(type){\n    return (type && type.toLowerCase().indexOf('video/mp4') != -1) ? 'maybe' : '';\n  };\n}\n/**\n * @fileoverview VideoJS-SWF - Custom Flash Player with HTML5-ish API\n * https://github.com/zencoder/video-js-swf\n * Not using setupTriggers. Using global onEvent func to distribute events\n */\n\n/**\n * Flash Media Controller - Wrapper for fallback SWF API\n *\n * @param {vjs.Player} player\n * @param {Object=} options\n * @param {Function=} ready\n * @constructor\n */\nvjs.Flash = vjs.MediaTechController.extend({\n  /** @constructor */\n  init: function(player, options, ready){\n    vjs.MediaTechController.call(this, player, options, ready);\n\n    var source = options['source'],\n\n        // Which element to embed in\n        parentEl = options['parentEl'],\n\n        // Create a temporary element to be replaced by swf object\n        placeHolder = this.el_ = vjs.createEl('div', { id: player.id() + '_temp_flash' }),\n\n        // Generate ID for swf object\n        objId = player.id()+'_flash_api',\n\n        // Store player options in local var for optimization\n        // TODO: switch to using player methods instead of options\n        // e.g. player.autoplay();\n        playerOptions = player.options_,\n\n        // Merge default flashvars with ones passed in to init\n        flashVars = vjs.obj.merge({\n\n          // SWF Callback Functions\n          'readyFunction': 'videojs.Flash.onReady',\n          'eventProxyFunction': 'videojs.Flash.onEvent',\n          'errorEventProxyFunction': 'videojs.Flash.onError',\n\n          // Player Settings\n          'autoplay': playerOptions.autoplay,\n          'preload': playerOptions.preload,\n          'loop': playerOptions.loop,\n          'muted': playerOptions.muted\n\n        }, options['flashVars']),\n\n        // Merge default parames with ones passed in\n        params = vjs.obj.merge({\n          'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance\n          'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading\n        }, options['params']),\n\n        // Merge default attributes with ones passed in\n        attributes = vjs.obj.merge({\n          'id': objId,\n          'name': objId, // Both ID and Name needed or swf to identifty itself\n          'class': 'vjs-tech'\n        }, options['attributes'])\n    ;\n\n    // If source was supplied pass as a flash var.\n    if (source) {\n      if (source.type && vjs.Flash.isStreamingType(source.type)) {\n        var parts = vjs.Flash.streamToParts(source.src);\n        flashVars['rtmpConnection'] = encodeURIComponent(parts.connection);\n        flashVars['rtmpStream'] = encodeURIComponent(parts.stream);\n      }\n      else {\n        flashVars['src'] = encodeURIComponent(vjs.getAbsoluteURL(source.src));\n      }\n    }\n\n    // Add placeholder to player div\n    vjs.insertFirst(placeHolder, parentEl);\n\n    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers\n    // This allows resetting the playhead when we catch the reload\n    if (options['startTime']) {\n      this.ready(function(){\n        this.load();\n        this.play();\n        this.currentTime(options['startTime']);\n      });\n    }\n\n    // Flash iFrame Mode\n    // In web browsers there are multiple instances where changing the parent element or visibility of a plugin causes the plugin to reload.\n    // - Firefox just about always. https://bugzilla.mozilla.org/show_bug.cgi?id=90268 (might be fixed by version 13)\n    // - Webkit when hiding the plugin\n    // - Webkit and Firefox when using requestFullScreen on a parent element\n    // Loading the flash plugin into a dynamically generated iFrame gets around most of these issues.\n    // Issues that remain include hiding the element and requestFullScreen in Firefox specifically\n\n    // There's on particularly annoying issue with this method which is that Firefox throws a security error on an offsite Flash object loaded into a dynamically created iFrame.\n    // Even though the iframe was inserted into a page on the web, Firefox + Flash considers it a local app trying to access an internet file.\n    // I tried mulitple ways of setting the iframe src attribute but couldn't find a src that worked well. Tried a real/fake source, in/out of domain.\n    // Also tried a method from stackoverflow that caused a security error in all browsers. http://stackoverflow.com/questions/2486901/how-to-set-document-domain-for-a-dynamically-generated-iframe\n    // In the end the solution I found to work was setting the iframe window.location.href right before doing a document.write of the Flash object.\n    // The only downside of this it seems to trigger another http request to the original page (no matter what's put in the href). Not sure why that is.\n\n    // NOTE (2012-01-29): Cannot get Firefox to load the remote hosted SWF into a dynamically created iFrame\n    // Firefox 9 throws a security error, unleess you call location.href right before doc.write.\n    //    Not sure why that even works, but it causes the browser to look like it's continuously trying to load the page.\n    // Firefox 3.6 keeps calling the iframe onload function anytime I write to it, causing an endless loop.\n\n    if (options['iFrameMode'] === true && !vjs.IS_FIREFOX) {\n\n      // Create iFrame with vjs-tech class so it's 100% width/height\n      var iFrm = vjs.createEl('iframe', {\n        'id': objId + '_iframe',\n        'name': objId + '_iframe',\n        'className': 'vjs-tech',\n        'scrolling': 'no',\n        'marginWidth': 0,\n        'marginHeight': 0,\n        'frameBorder': 0\n      });\n\n      // Update ready function names in flash vars for iframe window\n      flashVars['readyFunction'] = 'ready';\n      flashVars['eventProxyFunction'] = 'events';\n      flashVars['errorEventProxyFunction'] = 'errors';\n\n      // Tried multiple methods to get this to work in all browsers\n\n      // Tried embedding the flash object in the page first, and then adding a place holder to the iframe, then replacing the placeholder with the page object.\n      // The goal here was to try to load the swf URL in the parent page first and hope that got around the firefox security error\n      // var newObj = vjs.Flash.embed(options['swf'], placeHolder, flashVars, params, attributes);\n      // (in onload)\n      //  var temp = vjs.createEl('a', { id:'asdf', innerHTML: 'asdf' } );\n      //  iDoc.body.appendChild(temp);\n\n      // Tried embedding the flash object through javascript in the iframe source.\n      // This works in webkit but still triggers the firefox security error\n      // iFrm.src = 'javascript: document.write('\"+vjs.Flash.getEmbedCode(options['swf'], flashVars, params, attributes)+\"');\";\n\n      // Tried an actual local iframe just to make sure that works, but it kills the easiness of the CDN version if you require the user to host an iframe\n      // We should add an option to host the iframe locally though, because it could help a lot of issues.\n      // iFrm.src = \"iframe.html\";\n\n      // Wait until iFrame has loaded to write into it.\n      vjs.on(iFrm, 'load', vjs.bind(this, function(){\n\n        var iDoc,\n            iWin = iFrm.contentWindow;\n\n        // The one working method I found was to use the iframe's document.write() to create the swf object\n        // This got around the security issue in all browsers except firefox.\n        // I did find a hack where if I call the iframe's window.location.href='', it would get around the security error\n        // However, the main page would look like it was loading indefinitely (URL bar loading spinner would never stop)\n        // Plus Firefox 3.6 didn't work no matter what I tried.\n        // if (vjs.USER_AGENT.match('Firefox')) {\n        //   iWin.location.href = '';\n        // }\n\n        // Get the iFrame's document depending on what the browser supports\n        iDoc = iFrm.contentDocument ? iFrm.contentDocument : iFrm.contentWindow.document;\n\n        // Tried ensuring both document domains were the same, but they already were, so that wasn't the issue.\n        // Even tried adding /. that was mentioned in a browser security writeup\n        // document.domain = document.domain+'/.';\n        // iDoc.domain = document.domain+'/.';\n\n        // Tried adding the object to the iframe doc's innerHTML. Security error in all browsers.\n        // iDoc.body.innerHTML = swfObjectHTML;\n\n        // Tried appending the object to the iframe doc's body. Security error in all browsers.\n        // iDoc.body.appendChild(swfObject);\n\n        // Using document.write actually got around the security error that browsers were throwing.\n        // Again, it's a dynamically generated (same domain) iframe, loading an external Flash swf.\n        // Not sure why that's a security issue, but apparently it is.\n        iDoc.write(vjs.Flash.getEmbedCode(options['swf'], flashVars, params, attributes));\n\n        // Setting variables on the window needs to come after the doc write because otherwise they can get reset in some browsers\n        // So far no issues with swf ready event being called before it's set on the window.\n        iWin['player'] = this.player_;\n\n        // Create swf ready function for iFrame window\n        iWin['ready'] = vjs.bind(this.player_, function(currSwf){\n          var el = iDoc.getElementById(currSwf),\n              player = this,\n              tech = player.tech;\n\n          // Update reference to playback technology element\n          tech.el_ = el;\n\n          // Make sure swf is actually ready. Sometimes the API isn't actually yet.\n          vjs.Flash.checkReady(tech);\n        });\n\n        // Create event listener for all swf events\n        iWin['events'] = vjs.bind(this.player_, function(swfID, eventName){\n          var player = this;\n          if (player && player.techName === 'flash') {\n            player.trigger(eventName);\n          }\n        });\n\n        // Create error listener for all swf errors\n        iWin['errors'] = vjs.bind(this.player_, function(swfID, eventName){\n          vjs.log('Flash Error', eventName);\n        });\n\n      }));\n\n      // Replace placeholder with iFrame (it will load now)\n      placeHolder.parentNode.replaceChild(iFrm, placeHolder);\n\n    // If not using iFrame mode, embed as normal object\n    } else {\n      vjs.Flash.embed(options['swf'], placeHolder, flashVars, params, attributes);\n    }\n  }\n});\n\nvjs.Flash.prototype.dispose = function(){\n  vjs.MediaTechController.prototype.dispose.call(this);\n};\n\nvjs.Flash.prototype.play = function(){\n  this.el_.vjs_play();\n};\n\nvjs.Flash.prototype.pause = function(){\n  this.el_.vjs_pause();\n};\n\nvjs.Flash.prototype.src = function(src){\n  if (vjs.Flash.isStreamingSrc(src)) {\n    src = vjs.Flash.streamToParts(src);\n    this.setRtmpConnection(src.connection);\n    this.setRtmpStream(src.stream);\n  }\n  else {\n    // Make sure source URL is abosolute.\n    src = vjs.getAbsoluteURL(src);\n    this.el_.vjs_src(src);\n  }\n\n  // Currently the SWF doesn't autoplay if you load a source later.\n  // e.g. Load player w/ no source, wait 2s, set src.\n  if (this.player_.autoplay()) {\n    var tech = this;\n    setTimeout(function(){ tech.play(); }, 0);\n  }\n};\n\nvjs.Flash.prototype.currentSrc = function(){\n  var src = this.el_.vjs_getProperty('currentSrc');\n  // no src, check and see if RTMP\n  if (src == null) {\n    var connection = this.rtmpConnection(),\n        stream = this.rtmpStream();\n\n    if (connection && stream) {\n      src = vjs.Flash.streamFromParts(connection, stream);\n    }\n  }\n  return src;\n};\n\nvjs.Flash.prototype.load = function(){\n  this.el_.vjs_load();\n};\n\nvjs.Flash.prototype.poster = function(){\n  this.el_.vjs_getProperty('poster');\n};\n\nvjs.Flash.prototype.buffered = function(){\n  return vjs.createTimeRange(0, this.el_.vjs_getProperty('buffered'));\n};\n\nvjs.Flash.prototype.supportsFullScreen = function(){\n  return false; // Flash does not allow fullscreen through javascript\n};\n\nvjs.Flash.prototype.enterFullScreen = function(){\n  return false;\n};\n\n\n// Create setters and getters for attributes\nvar api = vjs.Flash.prototype,\n    readWrite = 'rtmpConnection,rtmpStream,preload,currentTime,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(','),\n    readOnly = 'error,currentSrc,networkState,readyState,seeking,initialTime,duration,startOffsetTime,paused,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks'.split(',');\n    // Overridden: buffered\n\n/**\n * @this {*}\n * @private\n */\nvar createSetter = function(attr){\n  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);\n  api['set'+attrUpper] = function(val){ return this.el_.vjs_setProperty(attr, val); };\n};\n\n/**\n * @this {*}\n * @private\n */\nvar createGetter = function(attr){\n  api[attr] = function(){ return this.el_.vjs_getProperty(attr); };\n};\n\n(function(){\n  var i;\n  // Create getter and setters for all read/write attributes\n  for (i = 0; i < readWrite.length; i++) {\n    createGetter(readWrite[i]);\n    createSetter(readWrite[i]);\n  }\n\n  // Create getters for read-only attributes\n  for (i = 0; i < readOnly.length; i++) {\n    createGetter(readOnly[i]);\n  }\n})();\n\n/* Flash Support Testing -------------------------------------------------------- */\n\nvjs.Flash.isSupported = function(){\n  return vjs.Flash.version()[0] >= 10;\n  // return swfobject.hasFlashPlayerVersion('10');\n};\n\nvjs.Flash.canPlaySource = function(srcObj){\n  var type;\n\n  if (!srcObj.type) {\n    return '';\n  }\n\n  type = srcObj.type.replace(/;.*/,'').toLowerCase();\n  if (type in vjs.Flash.formats || type in vjs.Flash.streamingFormats) {\n    return 'maybe';\n  }\n};\n\nvjs.Flash.formats = {\n  'video/flv': 'FLV',\n  'video/x-flv': 'FLV',\n  'video/mp4': 'MP4',\n  'video/m4v': 'MP4'\n};\n\nvjs.Flash.streamingFormats = {\n  'rtmp/mp4': 'MP4',\n  'rtmp/flv': 'FLV'\n};\n\nvjs.Flash['onReady'] = function(currSwf){\n  var el = vjs.el(currSwf);\n\n  // Get player from box\n  // On firefox reloads, el might already have a player\n  var player = el['player'] || el.parentNode['player'],\n      tech = player.tech;\n\n  // Reference player on tech element\n  el['player'] = player;\n\n  // Update reference to playback technology element\n  tech.el_ = el;\n\n  vjs.Flash.checkReady(tech);\n};\n\n// The SWF isn't alwasy ready when it says it is. Sometimes the API functions still need to be added to the object.\n// If it's not ready, we set a timeout to check again shortly.\nvjs.Flash.checkReady = function(tech){\n\n  // Check if API property exists\n  if (tech.el().vjs_getProperty) {\n\n    // If so, tell tech it's ready\n    tech.triggerReady();\n\n  // Otherwise wait longer.\n  } else {\n\n    setTimeout(function(){\n      vjs.Flash.checkReady(tech);\n    }, 50);\n\n  }\n};\n\n// Trigger events from the swf on the player\nvjs.Flash['onEvent'] = function(swfID, eventName){\n  var player = vjs.el(swfID)['player'];\n  player.trigger(eventName);\n};\n\n// Log errors from the swf\nvjs.Flash['onError'] = function(swfID, err){\n  var player = vjs.el(swfID)['player'];\n  player.trigger('error');\n  vjs.log('Flash Error', err, swfID);\n};\n\n// Flash Version Check\nvjs.Flash.version = function(){\n  var version = '0,0,0';\n\n  // IE\n  try {\n    version = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\\D+/g, ',').match(/^,?(.+),?$/)[1];\n\n  // other browsers\n  } catch(e) {\n    try {\n      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin){\n        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\\D+/g, ',').match(/^,?(.+),?$/)[1];\n      }\n    } catch(err) {}\n  }\n  return version.split(',');\n};\n\n// Flash embedding method. Only used in non-iframe mode\nvjs.Flash.embed = function(swf, placeHolder, flashVars, params, attributes){\n  var code = vjs.Flash.getEmbedCode(swf, flashVars, params, attributes),\n\n      // Get element by embedding code and retrieving created element\n      obj = vjs.createEl('div', { innerHTML: code }).childNodes[0],\n\n      par = placeHolder.parentNode\n  ;\n\n  placeHolder.parentNode.replaceChild(obj, placeHolder);\n\n  // IE6 seems to have an issue where it won't initialize the swf object after injecting it.\n  // This is a dumb fix\n  var newObj = par.childNodes[0];\n  setTimeout(function(){\n    newObj.style.display = 'block';\n  }, 1000);\n\n  return obj;\n\n};\n\nvjs.Flash.getEmbedCode = function(swf, flashVars, params, attributes){\n\n  var objTag = '<object type=\"application/x-shockwave-flash\"',\n      flashVarsString = '',\n      paramsString = '',\n      attrsString = '';\n\n  // Convert flash vars to string\n  if (flashVars) {\n    vjs.obj.each(flashVars, function(key, val){\n      flashVarsString += (key + '=' + val + '&amp;');\n    });\n  }\n\n  // Add swf, flashVars, and other default params\n  params = vjs.obj.merge({\n    'movie': swf,\n    'flashvars': flashVarsString,\n    'allowScriptAccess': 'always', // Required to talk to swf\n    'allowNetworking': 'all' // All should be default, but having security issues.\n  }, params);\n\n  // Create param tags string\n  vjs.obj.each(params, function(key, val){\n    paramsString += '<param name=\"'+key+'\" value=\"'+val+'\" />';\n  });\n\n  attributes = vjs.obj.merge({\n    // Add swf to attributes (need both for IE and Others to work)\n    'data': swf,\n\n    // Default to 100% width/height\n    'width': '100%',\n    'height': '100%'\n\n  }, attributes);\n\n  // Create Attributes string\n  vjs.obj.each(attributes, function(key, val){\n    attrsString += (key + '=\"' + val + '\" ');\n  });\n\n  return objTag + attrsString + '>' + paramsString + '</object>';\n};\n\nvjs.Flash.streamFromParts = function(connection, stream) {\n  return connection + '&' + stream;\n};\n\nvjs.Flash.streamToParts = function(src) {\n  var parts = {\n    connection: '',\n    stream: ''\n  };\n\n  if (! src) {\n    return parts;\n  }\n\n  // Look for the normal URL separator we expect, '&'.\n  // If found, we split the URL into two pieces around the\n  // first '&'.\n  var connEnd = src.indexOf('&');\n  var streamBegin;\n  if (connEnd !== -1) {\n    streamBegin = connEnd + 1;\n  }\n  else {\n    // If there's not a '&', we use the last '/' as the delimiter.\n    connEnd = streamBegin = src.lastIndexOf('/') + 1;\n    if (connEnd === 0) {\n      // really, there's not a '/'?\n      connEnd = streamBegin = src.length;\n    }\n  }\n  parts.connection = src.substring(0, connEnd);\n  parts.stream = src.substring(streamBegin, src.length);\n\n  return parts;\n};\n\nvjs.Flash.isStreamingType = function(srcType) {\n  return srcType in vjs.Flash.streamingFormats;\n};\n\n// RTMP has four variations, any string starting\n// with one of these protocols should be valid\nvjs.Flash.RTMP_RE = /^rtmp[set]?:\\/\\//i;\n\nvjs.Flash.isStreamingSrc = function(src) {\n  return vjs.Flash.RTMP_RE.test(src);\n};\n/**\n * The Media Loader is the component that decides which playback technology to load\n * when the player is initialized.\n *\n * @constructor\n */\nvjs.MediaLoader = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options, ready){\n    vjs.Component.call(this, player, options, ready);\n\n    // If there are no sources when the player is initialized,\n    // load the first supported playback technology.\n    if (!player.options_['sources'] || player.options_['sources'].length === 0) {\n      for (var i=0,j=player.options_['techOrder']; i<j.length; i++) {\n        var techName = vjs.capitalize(j[i]),\n            tech = window['videojs'][techName];\n\n        // Check if the browser supports this technology\n        if (tech && tech.isSupported()) {\n          player.loadTech(techName);\n          break;\n        }\n      }\n    } else {\n      // // Loop through playback technologies (HTML5, Flash) and check for support.\n      // // Then load the best source.\n      // // A few assumptions here:\n      // //   All playback technologies respect preload false.\n      player.src(player.options_['sources']);\n    }\n  }\n});\n/**\n * @fileoverview Text Tracks\n * Text tracks are tracks of timed text events.\n * Captions - text displayed over the video for the hearing impared\n * Subtitles - text displayed over the video for those who don't understand langauge in the video\n * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video\n * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device\n */\n\n// Player Additions - Functions add to the player object for easier access to tracks\n\n/**\n * List of associated text tracks\n * @type {Array}\n * @private\n */\nvjs.Player.prototype.textTracks_;\n\n/**\n * Get an array of associated text tracks. captions, subtitles, chapters, descriptions\n * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks\n * @return {Array}           Array of track objects\n * @private\n */\nvjs.Player.prototype.textTracks = function(){\n  this.textTracks_ = this.textTracks_ || [];\n  return this.textTracks_;\n};\n\n/**\n * Add a text track\n * In addition to the W3C settings we allow adding additional info through options.\n * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack\n * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata\n * @param {String=} label       Optional label\n * @param {String=} language    Optional language\n * @param {Object=} options     Additional track options, like src\n * @private\n */\nvjs.Player.prototype.addTextTrack = function(kind, label, language, options){\n  var tracks = this.textTracks_ = this.textTracks_ || [];\n  options = options || {};\n\n  options['kind'] = kind;\n  options['label'] = label;\n  options['language'] = language;\n\n  // HTML5 Spec says default to subtitles.\n  // Uppercase first letter to match class names\n  var Kind = vjs.capitalize(kind || 'subtitles');\n\n  // Create correct texttrack class. CaptionsTrack, etc.\n  var track = new window['videojs'][Kind + 'Track'](this, options);\n\n  tracks.push(track);\n\n  // If track.dflt() is set, start showing immediately\n  // TODO: Add a process to deterime the best track to show for the specific kind\n  // Incase there are mulitple defaulted tracks of the same kind\n  // Or the user has a set preference of a specific language that should override the default\n  // if (track.dflt()) {\n  //   this.ready(vjs.bind(track, track.show));\n  // }\n\n  return track;\n};\n\n/**\n * Add an array of text tracks. captions, subtitles, chapters, descriptions\n * Track objects will be stored in the player.textTracks() array\n * @param {Array} trackList Array of track elements or objects (fake track elements)\n * @private\n */\nvjs.Player.prototype.addTextTracks = function(trackList){\n  var trackObj;\n\n  for (var i = 0; i < trackList.length; i++) {\n    trackObj = trackList[i];\n    this.addTextTrack(trackObj['kind'], trackObj['label'], trackObj['language'], trackObj);\n  }\n\n  return this;\n};\n\n// Show a text track\n// disableSameKind: disable all other tracks of the same kind. Value should be a track kind (captions, etc.)\nvjs.Player.prototype.showTextTrack = function(id, disableSameKind){\n  var tracks = this.textTracks_,\n      i = 0,\n      j = tracks.length,\n      track, showTrack, kind;\n\n  // Find Track with same ID\n  for (;i<j;i++) {\n    track = tracks[i];\n    if (track.id() === id) {\n      track.show();\n      showTrack = track;\n\n    // Disable tracks of the same kind\n    } else if (disableSameKind && track.kind() == disableSameKind && track.mode() > 0) {\n      track.disable();\n    }\n  }\n\n  // Get track kind from shown track or disableSameKind\n  kind = (showTrack) ? showTrack.kind() : ((disableSameKind) ? disableSameKind : false);\n\n  // Trigger trackchange event, captionstrackchange, subtitlestrackchange, etc.\n  if (kind) {\n    this.trigger(kind+'trackchange');\n  }\n\n  return this;\n};\n\n/**\n * The base class for all text tracks\n *\n * Handles the parsing, hiding, and showing of text track cues\n *\n * @param {vjs.Player|Object} player\n * @param {Object=} options\n * @constructor\n */\nvjs.TextTrack = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.Component.call(this, player, options);\n\n    // Apply track info to track object\n    // Options will often be a track element\n\n    // Build ID if one doesn't exist\n    this.id_ = options['id'] || ('vjs_' + options['kind'] + '_' + options['language'] + '_' + vjs.guid++);\n    this.src_ = options['src'];\n    // 'default' is a reserved keyword in js so we use an abbreviated version\n    this.dflt_ = options['default'] || options['dflt'];\n    this.title_ = options['title'];\n    this.language_ = options['srclang'];\n    this.label_ = options['label'];\n    this.cues_ = [];\n    this.activeCues_ = [];\n    this.readyState_ = 0;\n    this.mode_ = 0;\n\n    this.player_.on('fullscreenchange', vjs.bind(this, this.adjustFontSize));\n  }\n});\n\n/**\n * Track kind value. Captions, subtitles, etc.\n * @private\n */\nvjs.TextTrack.prototype.kind_;\n\n/**\n * Get the track kind value\n * @return {String}\n */\nvjs.TextTrack.prototype.kind = function(){\n  return this.kind_;\n};\n\n/**\n * Track src value\n * @private\n */\nvjs.TextTrack.prototype.src_;\n\n/**\n * Get the track src value\n * @return {String}\n */\nvjs.TextTrack.prototype.src = function(){\n  return this.src_;\n};\n\n/**\n * Track default value\n * If default is used, subtitles/captions to start showing\n * @private\n */\nvjs.TextTrack.prototype.dflt_;\n\n/**\n * Get the track default value. ('default' is a reserved keyword)\n * @return {Boolean}\n */\nvjs.TextTrack.prototype.dflt = function(){\n  return this.dflt_;\n};\n\n/**\n * Track title value\n * @private\n */\nvjs.TextTrack.prototype.title_;\n\n/**\n * Get the track title value\n * @return {String}\n */\nvjs.TextTrack.prototype.title = function(){\n  return this.title_;\n};\n\n/**\n * Language - two letter string to represent track language, e.g. 'en' for English\n * Spec def: readonly attribute DOMString language;\n * @private\n */\nvjs.TextTrack.prototype.language_;\n\n/**\n * Get the track language value\n * @return {String}\n */\nvjs.TextTrack.prototype.language = function(){\n  return this.language_;\n};\n\n/**\n * Track label e.g. 'English'\n * Spec def: readonly attribute DOMString label;\n * @private\n */\nvjs.TextTrack.prototype.label_;\n\n/**\n * Get the track label value\n * @return {String}\n */\nvjs.TextTrack.prototype.label = function(){\n  return this.label_;\n};\n\n/**\n * All cues of the track. Cues have a startTime, endTime, text, and other properties.\n * Spec def: readonly attribute TextTrackCueList cues;\n * @private\n */\nvjs.TextTrack.prototype.cues_;\n\n/**\n * Get the track cues\n * @return {Array}\n */\nvjs.TextTrack.prototype.cues = function(){\n  return this.cues_;\n};\n\n/**\n * ActiveCues is all cues that are currently showing\n * Spec def: readonly attribute TextTrackCueList activeCues;\n * @private\n */\nvjs.TextTrack.prototype.activeCues_;\n\n/**\n * Get the track active cues\n * @return {Array}\n */\nvjs.TextTrack.prototype.activeCues = function(){\n  return this.activeCues_;\n};\n\n/**\n * ReadyState describes if the text file has been loaded\n * const unsigned short NONE = 0;\n * const unsigned short LOADING = 1;\n * const unsigned short LOADED = 2;\n * const unsigned short ERROR = 3;\n * readonly attribute unsigned short readyState;\n * @private\n */\nvjs.TextTrack.prototype.readyState_;\n\n/**\n * Get the track readyState\n * @return {Number}\n */\nvjs.TextTrack.prototype.readyState = function(){\n  return this.readyState_;\n};\n\n/**\n * Mode describes if the track is showing, hidden, or disabled\n * const unsigned short OFF = 0;\n * const unsigned short HIDDEN = 1; (still triggering cuechange events, but not visible)\n * const unsigned short SHOWING = 2;\n * attribute unsigned short mode;\n * @private\n */\nvjs.TextTrack.prototype.mode_;\n\n/**\n * Get the track mode\n * @return {Number}\n */\nvjs.TextTrack.prototype.mode = function(){\n  return this.mode_;\n};\n\n/**\n * Change the font size of the text track to make it larger when playing in fullscreen mode\n * and restore it to its normal size when not in fullscreen mode.\n */\nvjs.TextTrack.prototype.adjustFontSize = function(){\n    if (this.player_.isFullScreen) {\n        // Scale the font by the same factor as increasing the video width to the full screen window width.\n        // Additionally, multiply that factor by 1.4, which is the default font size for\n        // the caption track (from the CSS)\n        this.el_.style.fontSize = screen.width / this.player_.width() * 1.4 * 100 + '%';\n    } else {\n        // Change the font size of the text track back to its original non-fullscreen size\n        this.el_.style.fontSize = '';\n    }\n};\n\n/**\n * Create basic div to hold cue text\n * @return {Element}\n */\nvjs.TextTrack.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-' + this.kind_ + ' vjs-text-track'\n  });\n};\n\n/**\n * Show: Mode Showing (2)\n * Indicates that the text track is active. If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily.\n * The user agent is maintaining a list of which cues are active, and events are being fired accordingly.\n * In addition, for text tracks whose kind is subtitles or captions, the cues are being displayed over the video as appropriate;\n * for text tracks whose kind is descriptions, the user agent is making the cues available to the user in a non-visual fashion;\n * and for text tracks whose kind is chapters, the user agent is making available to the user a mechanism by which the user can navigate to any point in the media resource by selecting a cue.\n * The showing by default state is used in conjunction with the default attribute on track elements to indicate that the text track was enabled due to that attribute.\n * This allows the user agent to override the state if a later track is discovered that is more appropriate per the user's preferences.\n */\nvjs.TextTrack.prototype.show = function(){\n  this.activate();\n\n  this.mode_ = 2;\n\n  // Show element.\n  vjs.Component.prototype.show.call(this);\n};\n\n/**\n * Hide: Mode Hidden (1)\n * Indicates that the text track is active, but that the user agent is not actively displaying the cues.\n * If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily.\n * The user agent is maintaining a list of which cues are active, and events are being fired accordingly.\n */\nvjs.TextTrack.prototype.hide = function(){\n  // When hidden, cues are still triggered. Disable to stop triggering.\n  this.activate();\n\n  this.mode_ = 1;\n\n  // Hide element.\n  vjs.Component.prototype.hide.call(this);\n};\n\n/**\n * Disable: Mode Off/Disable (0)\n * Indicates that the text track is not active. Other than for the purposes of exposing the track in the DOM, the user agent is ignoring the text track.\n * No cues are active, no events are fired, and the user agent will not attempt to obtain the track's cues.\n */\nvjs.TextTrack.prototype.disable = function(){\n  // If showing, hide.\n  if (this.mode_ == 2) { this.hide(); }\n\n  // Stop triggering cues\n  this.deactivate();\n\n  // Switch Mode to Off\n  this.mode_ = 0;\n};\n\n/**\n * Turn on cue tracking. Tracks that are showing OR hidden are active.\n */\nvjs.TextTrack.prototype.activate = function(){\n  // Load text file if it hasn't been yet.\n  if (this.readyState_ === 0) { this.load(); }\n\n  // Only activate if not already active.\n  if (this.mode_ === 0) {\n    // Update current cue on timeupdate\n    // Using unique ID for bind function so other tracks don't remove listener\n    this.player_.on('timeupdate', vjs.bind(this, this.update, this.id_));\n\n    // Reset cue time on media end\n    this.player_.on('ended', vjs.bind(this, this.reset, this.id_));\n\n    // Add to display\n    if (this.kind_ === 'captions' || this.kind_ === 'subtitles') {\n      this.player_.getChild('textTrackDisplay').addChild(this);\n    }\n  }\n};\n\n/**\n * Turn off cue tracking.\n */\nvjs.TextTrack.prototype.deactivate = function(){\n  // Using unique ID for bind function so other tracks don't remove listener\n  this.player_.off('timeupdate', vjs.bind(this, this.update, this.id_));\n  this.player_.off('ended', vjs.bind(this, this.reset, this.id_));\n  this.reset(); // Reset\n\n  // Remove from display\n  this.player_.getChild('textTrackDisplay').removeChild(this);\n};\n\n// A readiness state\n// One of the following:\n//\n// Not loaded\n// Indicates that the text track is known to exist (e.g. it has been declared with a track element), but its cues have not been obtained.\n//\n// Loading\n// Indicates that the text track is loading and there have been no fatal errors encountered so far. Further cues might still be added to the track.\n//\n// Loaded\n// Indicates that the text track has been loaded with no fatal errors. No new cues will be added to the track except if the text track corresponds to a MutableTextTrack object.\n//\n// Failed to load\n// Indicates that the text track was enabled, but when the user agent attempted to obtain it, this failed in some way (e.g. URL could not be resolved, network error, unknown text track format). Some or all of the cues are likely missing and will not be obtained.\nvjs.TextTrack.prototype.load = function(){\n\n  // Only load if not loaded yet.\n  if (this.readyState_ === 0) {\n    this.readyState_ = 1;\n    vjs.get(this.src_, vjs.bind(this, this.parseCues), vjs.bind(this, this.onError));\n  }\n\n};\n\nvjs.TextTrack.prototype.onError = function(err){\n  this.error = err;\n  this.readyState_ = 3;\n  this.trigger('error');\n};\n\n// Parse the WebVTT text format for cue times.\n// TODO: Separate parser into own class so alternative timed text formats can be used. (TTML, DFXP)\nvjs.TextTrack.prototype.parseCues = function(srcContent) {\n  var cue, time, text,\n      lines = srcContent.split('\\n'),\n      line = '', id;\n\n  for (var i=1, j=lines.length; i<j; i++) {\n    // Line 0 should be 'WEBVTT', so skipping i=0\n\n    line = vjs.trim(lines[i]); // Trim whitespace and linebreaks\n\n    if (line) { // Loop until a line with content\n\n      // First line could be an optional cue ID\n      // Check if line has the time separator\n      if (line.indexOf('-->') == -1) {\n        id = line;\n        // Advance to next line for timing.\n        line = vjs.trim(lines[++i]);\n      } else {\n        id = this.cues_.length;\n      }\n\n      // First line - Number\n      cue = {\n        id: id, // Cue Number\n        index: this.cues_.length // Position in Array\n      };\n\n      // Timing line\n      time = line.split(' --> ');\n      cue.startTime = this.parseCueTime(time[0]);\n      cue.endTime = this.parseCueTime(time[1]);\n\n      // Additional lines - Cue Text\n      text = [];\n\n      // Loop until a blank line or end of lines\n      // Assumeing trim('') returns false for blank lines\n      while (lines[++i] && (line = vjs.trim(lines[i]))) {\n        text.push(line);\n      }\n\n      cue.text = text.join('<br/>');\n\n      // Add this cue\n      this.cues_.push(cue);\n    }\n  }\n\n  this.readyState_ = 2;\n  this.trigger('loaded');\n};\n\n\nvjs.TextTrack.prototype.parseCueTime = function(timeText) {\n  var parts = timeText.split(':'),\n      time = 0,\n      hours, minutes, other, seconds, ms;\n\n  // Check if optional hours place is included\n  // 00:00:00.000 vs. 00:00.000\n  if (parts.length == 3) {\n    hours = parts[0];\n    minutes = parts[1];\n    other = parts[2];\n  } else {\n    hours = 0;\n    minutes = parts[0];\n    other = parts[1];\n  }\n\n  // Break other (seconds, milliseconds, and flags) by spaces\n  // TODO: Make additional cue layout settings work with flags\n  other = other.split(/\\s+/);\n  // Remove seconds. Seconds is the first part before any spaces.\n  seconds = other.splice(0,1)[0];\n  // Could use either . or , for decimal\n  seconds = seconds.split(/\\.|,/);\n  // Get milliseconds\n  ms = parseFloat(seconds[1]);\n  seconds = seconds[0];\n\n  // hours => seconds\n  time += parseFloat(hours) * 3600;\n  // minutes => seconds\n  time += parseFloat(minutes) * 60;\n  // Add seconds\n  time += parseFloat(seconds);\n  // Add milliseconds\n  if (ms) { time += ms/1000; }\n\n  return time;\n};\n\n// Update active cues whenever timeupdate events are triggered on the player.\nvjs.TextTrack.prototype.update = function(){\n  if (this.cues_.length > 0) {\n\n    // Get curent player time\n    var time = this.player_.currentTime();\n\n    // Check if the new time is outside the time box created by the the last update.\n    if (this.prevChange === undefined || time < this.prevChange || this.nextChange <= time) {\n      var cues = this.cues_,\n\n          // Create a new time box for this state.\n          newNextChange = this.player_.duration(), // Start at beginning of the timeline\n          newPrevChange = 0, // Start at end\n\n          reverse = false, // Set the direction of the loop through the cues. Optimized the cue check.\n          newCues = [], // Store new active cues.\n\n          // Store where in the loop the current active cues are, to provide a smart starting point for the next loop.\n          firstActiveIndex, lastActiveIndex,\n          cue, i; // Loop vars\n\n      // Check if time is going forwards or backwards (scrubbing/rewinding)\n      // If we know the direction we can optimize the starting position and direction of the loop through the cues array.\n      if (time >= this.nextChange || this.nextChange === undefined) { // NextChange should happen\n        // Forwards, so start at the index of the first active cue and loop forward\n        i = (this.firstActiveIndex !== undefined) ? this.firstActiveIndex : 0;\n      } else {\n        // Backwards, so start at the index of the last active cue and loop backward\n        reverse = true;\n        i = (this.lastActiveIndex !== undefined) ? this.lastActiveIndex : cues.length - 1;\n      }\n\n      while (true) { // Loop until broken\n        cue = cues[i];\n\n        // Cue ended at this point\n        if (cue.endTime <= time) {\n          newPrevChange = Math.max(newPrevChange, cue.endTime);\n\n          if (cue.active) {\n            cue.active = false;\n          }\n\n          // No earlier cues should have an active start time.\n          // Nevermind. Assume first cue could have a duration the same as the video.\n          // In that case we need to loop all the way back to the beginning.\n          // if (reverse && cue.startTime) { break; }\n\n        // Cue hasn't started\n        } else if (time < cue.startTime) {\n          newNextChange = Math.min(newNextChange, cue.startTime);\n\n          if (cue.active) {\n            cue.active = false;\n          }\n\n          // No later cues should have an active start time.\n          if (!reverse) { break; }\n\n        // Cue is current\n        } else {\n\n          if (reverse) {\n            // Add cue to front of array to keep in time order\n            newCues.splice(0,0,cue);\n\n            // If in reverse, the first current cue is our lastActiveCue\n            if (lastActiveIndex === undefined) { lastActiveIndex = i; }\n            firstActiveIndex = i;\n          } else {\n            // Add cue to end of array\n            newCues.push(cue);\n\n            // If forward, the first current cue is our firstActiveIndex\n            if (firstActiveIndex === undefined) { firstActiveIndex = i; }\n            lastActiveIndex = i;\n          }\n\n          newNextChange = Math.min(newNextChange, cue.endTime);\n          newPrevChange = Math.max(newPrevChange, cue.startTime);\n\n          cue.active = true;\n        }\n\n        if (reverse) {\n          // Reverse down the array of cues, break if at first\n          if (i === 0) { break; } else { i--; }\n        } else {\n          // Walk up the array fo cues, break if at last\n          if (i === cues.length - 1) { break; } else { i++; }\n        }\n\n      }\n\n      this.activeCues_ = newCues;\n      this.nextChange = newNextChange;\n      this.prevChange = newPrevChange;\n      this.firstActiveIndex = firstActiveIndex;\n      this.lastActiveIndex = lastActiveIndex;\n\n      this.updateDisplay();\n\n      this.trigger('cuechange');\n    }\n  }\n};\n\n// Add cue HTML to display\nvjs.TextTrack.prototype.updateDisplay = function(){\n  var cues = this.activeCues_,\n      html = '',\n      i=0,j=cues.length;\n\n  for (;i<j;i++) {\n    html += '<span class=\"vjs-tt-cue\">'+cues[i].text+'</span>';\n  }\n\n  this.el_.innerHTML = html;\n};\n\n// Set all loop helper values back\nvjs.TextTrack.prototype.reset = function(){\n  this.nextChange = 0;\n  this.prevChange = this.player_.duration();\n  this.firstActiveIndex = 0;\n  this.lastActiveIndex = 0;\n};\n\n// Create specific track types\n/**\n * The track component for managing the hiding and showing of captions\n *\n * @constructor\n */\nvjs.CaptionsTrack = vjs.TextTrack.extend();\nvjs.CaptionsTrack.prototype.kind_ = 'captions';\n// Exporting here because Track creation requires the track kind\n// to be available on global object. e.g. new window['videojs'][Kind + 'Track']\n\n/**\n * The track component for managing the hiding and showing of subtitles\n *\n * @constructor\n */\nvjs.SubtitlesTrack = vjs.TextTrack.extend();\nvjs.SubtitlesTrack.prototype.kind_ = 'subtitles';\n\n/**\n * The track component for managing the hiding and showing of chapters\n *\n * @constructor\n */\nvjs.ChaptersTrack = vjs.TextTrack.extend();\nvjs.ChaptersTrack.prototype.kind_ = 'chapters';\n\n\n/* Text Track Display\n============================================================================= */\n// Global container for both subtitle and captions text. Simple div container.\n\n/**\n * The component for displaying text track cues\n *\n * @constructor\n */\nvjs.TextTrackDisplay = vjs.Component.extend({\n  /** @constructor */\n  init: function(player, options, ready){\n    vjs.Component.call(this, player, options, ready);\n\n    // This used to be called during player init, but was causing an error\n    // if a track should show by default and the display hadn't loaded yet.\n    // Should probably be moved to an external track loader when we support\n    // tracks that don't need a display.\n    if (player.options_['tracks'] && player.options_['tracks'].length > 0) {\n      this.player_.addTextTracks(player.options_['tracks']);\n    }\n  }\n});\n\nvjs.TextTrackDisplay.prototype.createEl = function(){\n  return vjs.Component.prototype.createEl.call(this, 'div', {\n    className: 'vjs-text-track-display'\n  });\n};\n\n\n/**\n * The specific menu item type for selecting a language within a text track kind\n *\n * @constructor\n */\nvjs.TextTrackMenuItem = vjs.MenuItem.extend({\n  /** @constructor */\n  init: function(player, options){\n    var track = this.track = options['track'];\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = track.label();\n    options['selected'] = track.dflt();\n    vjs.MenuItem.call(this, player, options);\n\n    this.player_.on(track.kind() + 'trackchange', vjs.bind(this, this.update));\n  }\n});\n\nvjs.TextTrackMenuItem.prototype.onClick = function(){\n  vjs.MenuItem.prototype.onClick.call(this);\n  this.player_.showTextTrack(this.track.id_, this.track.kind());\n};\n\nvjs.TextTrackMenuItem.prototype.update = function(){\n  this.selected(this.track.mode() == 2);\n};\n\n/**\n * A special menu item for turning of a specific type of text track\n *\n * @constructor\n */\nvjs.OffTextTrackMenuItem = vjs.TextTrackMenuItem.extend({\n  /** @constructor */\n  init: function(player, options){\n    // Create pseudo track info\n    // Requires options['kind']\n    options['track'] = {\n      kind: function() { return options['kind']; },\n      player: player,\n      label: function(){ return options['kind'] + ' off'; },\n      dflt: function(){ return false; },\n      mode: function(){ return false; }\n    };\n    vjs.TextTrackMenuItem.call(this, player, options);\n    this.selected(true);\n  }\n});\n\nvjs.OffTextTrackMenuItem.prototype.onClick = function(){\n  vjs.TextTrackMenuItem.prototype.onClick.call(this);\n  this.player_.showTextTrack(this.track.id_, this.track.kind());\n};\n\nvjs.OffTextTrackMenuItem.prototype.update = function(){\n  var tracks = this.player_.textTracks(),\n      i=0, j=tracks.length, track,\n      off = true;\n\n  for (;i<j;i++) {\n    track = tracks[i];\n    if (track.kind() == this.track.kind() && track.mode() == 2) {\n      off = false;\n    }\n  }\n\n  this.selected(off);\n};\n\n/**\n * The base class for buttons that toggle specific text track types (e.g. subtitles)\n *\n * @constructor\n */\nvjs.TextTrackButton = vjs.MenuButton.extend({\n  /** @constructor */\n  init: function(player, options){\n    vjs.MenuButton.call(this, player, options);\n\n    if (this.items.length <= 1) {\n      this.hide();\n    }\n  }\n});\n\n// vjs.TextTrackButton.prototype.buttonPressed = false;\n\n// vjs.TextTrackButton.prototype.createMenu = function(){\n//   var menu = new vjs.Menu(this.player_);\n\n//   // Add a title list item to the top\n//   // menu.el().appendChild(vjs.createEl('li', {\n//   //   className: 'vjs-menu-title',\n//   //   innerHTML: vjs.capitalize(this.kind_),\n//   //   tabindex: -1\n//   // }));\n\n//   this.items = this.createItems();\n\n//   // Add menu items to the menu\n//   for (var i = 0; i < this.items.length; i++) {\n//     menu.addItem(this.items[i]);\n//   }\n\n//   // Add list to element\n//   this.addChild(menu);\n\n//   return menu;\n// };\n\n// Create a menu item for each text track\nvjs.TextTrackButton.prototype.createItems = function(){\n  var items = [], track;\n\n  // Add an OFF menu item to turn all tracks off\n  items.push(new vjs.OffTextTrackMenuItem(this.player_, { 'kind': this.kind_ }));\n\n  for (var i = 0; i < this.player_.textTracks().length; i++) {\n    track = this.player_.textTracks()[i];\n    if (track.kind() === this.kind_) {\n      items.push(new vjs.TextTrackMenuItem(this.player_, {\n        'track': track\n      }));\n    }\n  }\n\n  return items;\n};\n\n/**\n * The button component for toggling and selecting captions\n *\n * @constructor\n */\nvjs.CaptionsButton = vjs.TextTrackButton.extend({\n  /** @constructor */\n  init: function(player, options, ready){\n    vjs.TextTrackButton.call(this, player, options, ready);\n    this.el_.setAttribute('aria-label','Captions Menu');\n  }\n});\nvjs.CaptionsButton.prototype.kind_ = 'captions';\nvjs.CaptionsButton.prototype.buttonText = 'Captions';\nvjs.CaptionsButton.prototype.className = 'vjs-captions-button';\n\n/**\n * The button component for toggling and selecting subtitles\n *\n * @constructor\n */\nvjs.SubtitlesButton = vjs.TextTrackButton.extend({\n  /** @constructor */\n  init: function(player, options, ready){\n    vjs.TextTrackButton.call(this, player, options, ready);\n    this.el_.setAttribute('aria-label','Subtitles Menu');\n  }\n});\nvjs.SubtitlesButton.prototype.kind_ = 'subtitles';\nvjs.SubtitlesButton.prototype.buttonText = 'Subtitles';\nvjs.SubtitlesButton.prototype.className = 'vjs-subtitles-button';\n\n// Chapters act much differently than other text tracks\n// Cues are navigation vs. other tracks of alternative languages\n/**\n * The button component for toggling and selecting chapters\n *\n * @constructor\n */\nvjs.ChaptersButton = vjs.TextTrackButton.extend({\n  /** @constructor */\n  init: function(player, options, ready){\n    vjs.TextTrackButton.call(this, player, options, ready);\n    this.el_.setAttribute('aria-label','Chapters Menu');\n  }\n});\nvjs.ChaptersButton.prototype.kind_ = 'chapters';\nvjs.ChaptersButton.prototype.buttonText = 'Chapters';\nvjs.ChaptersButton.prototype.className = 'vjs-chapters-button';\n\n// Create a menu item for each text track\nvjs.ChaptersButton.prototype.createItems = function(){\n  var items = [], track;\n\n  for (var i = 0; i < this.player_.textTracks().length; i++) {\n    track = this.player_.textTracks()[i];\n    if (track.kind() === this.kind_) {\n      items.push(new vjs.TextTrackMenuItem(this.player_, {\n        'track': track\n      }));\n    }\n  }\n\n  return items;\n};\n\nvjs.ChaptersButton.prototype.createMenu = function(){\n  var tracks = this.player_.textTracks(),\n      i = 0,\n      j = tracks.length,\n      track, chaptersTrack,\n      items = this.items = [];\n\n  for (;i<j;i++) {\n    track = tracks[i];\n    if (track.kind() == this.kind_ && track.dflt()) {\n      if (track.readyState() < 2) {\n        this.chaptersTrack = track;\n        track.on('loaded', vjs.bind(this, this.createMenu));\n        return;\n      } else {\n        chaptersTrack = track;\n        break;\n      }\n    }\n  }\n\n  var menu = this.menu = new vjs.Menu(this.player_);\n\n  menu.el_.appendChild(vjs.createEl('li', {\n    className: 'vjs-menu-title',\n    innerHTML: vjs.capitalize(this.kind_),\n    tabindex: -1\n  }));\n\n  if (chaptersTrack) {\n    var cues = chaptersTrack.cues_, cue, mi;\n    i = 0;\n    j = cues.length;\n\n    for (;i<j;i++) {\n      cue = cues[i];\n\n      mi = new vjs.ChaptersTrackMenuItem(this.player_, {\n        'track': chaptersTrack,\n        'cue': cue\n      });\n\n      items.push(mi);\n\n      menu.addChild(mi);\n    }\n  }\n\n  if (this.items.length > 0) {\n    this.show();\n  }\n\n  return menu;\n};\n\n\n/**\n * @constructor\n */\nvjs.ChaptersTrackMenuItem = vjs.MenuItem.extend({\n  /** @constructor */\n  init: function(player, options){\n    var track = this.track = options['track'],\n        cue = this.cue = options['cue'],\n        currentTime = player.currentTime();\n\n    // Modify options for parent MenuItem class's init.\n    options['label'] = cue.text;\n    options['selected'] = (cue.startTime <= currentTime && currentTime < cue.endTime);\n    vjs.MenuItem.call(this, player, options);\n\n    track.on('cuechange', vjs.bind(this, this.update));\n  }\n});\n\nvjs.ChaptersTrackMenuItem.prototype.onClick = function(){\n  vjs.MenuItem.prototype.onClick.call(this);\n  this.player_.currentTime(this.cue.startTime);\n  this.update(this.cue.startTime);\n};\n\nvjs.ChaptersTrackMenuItem.prototype.update = function(){\n  var cue = this.cue,\n      currentTime = this.player_.currentTime();\n\n  // vjs.log(currentTime, cue.startTime);\n  this.selected(cue.startTime <= currentTime && currentTime < cue.endTime);\n};\n\n// Add Buttons to controlBar\nvjs.obj.merge(vjs.ControlBar.prototype.options_['children'], {\n  'subtitlesButton': {},\n  'captionsButton': {},\n  'chaptersButton': {}\n});\n\n// vjs.Cue = vjs.Component.extend({\n//   /** @constructor */\n//   init: function(player, options){\n//     vjs.Component.call(this, player, options);\n//   }\n// });\n/**\n * @fileoverview Add JSON support\n * @suppress {undefinedVars}\n * (Compiler doesn't like JSON not being declared)\n */\n\n/**\n * Javascript JSON implementation\n * (Parse Method Only)\n * https://github.com/douglascrockford/JSON-js/blob/master/json2.js\n * Only using for parse method when parsing data-setup attribute JSON.\n * @suppress {undefinedVars}\n * @namespace\n * @private\n */\nvjs.JSON;\n\nif (typeof window.JSON !== 'undefined' && window.JSON.parse === 'function') {\n  vjs.JSON = window.JSON;\n\n} else {\n  vjs.JSON = {};\n\n  var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n  /**\n   * parse the json\n   *\n   * @memberof vjs.JSON\n   * @return {Object|Array} The parsed JSON\n   */\n  vjs.JSON.parse = function (text, reviver) {\n      var j;\n\n      function walk(holder, key) {\n          var k, v, value = holder[key];\n          if (value && typeof value === 'object') {\n              for (k in value) {\n                  if (Object.prototype.hasOwnProperty.call(value, k)) {\n                      v = walk(value, k);\n                      if (v !== undefined) {\n                          value[k] = v;\n                      } else {\n                          delete value[k];\n                      }\n                  }\n              }\n          }\n          return reviver.call(holder, key, value);\n      }\n      text = String(text);\n      cx.lastIndex = 0;\n      if (cx.test(text)) {\n          text = text.replace(cx, function (a) {\n              return '\\\\u' +\n                  ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n          });\n      }\n\n      if (/^[\\],:{}\\s]*$/\n              .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n                  .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n                  .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n          j = eval('(' + text + ')');\n\n          return typeof reviver === 'function' ?\n              walk({'': j}, '') : j;\n      }\n\n      throw new SyntaxError('JSON.parse(): invalid or malformed JSON data');\n  };\n}\n/**\n * @fileoverview Functions for automatically setting up a player\n * based on the data-setup attribute of the video tag\n */\n\n// Automatically set up any tags that have a data-setup attribute\nvjs.autoSetup = function(){\n  var options, vid, player,\n      vids = document.getElementsByTagName('video');\n\n  // Check if any media elements exist\n  if (vids && vids.length > 0) {\n\n    for (var i=0,j=vids.length; i<j; i++) {\n      vid = vids[i];\n\n      // Check if element exists, has getAttribute func.\n      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.\n      if (vid && vid.getAttribute) {\n\n        // Make sure this player hasn't already been set up.\n        if (vid['player'] === undefined) {\n          options = vid.getAttribute('data-setup');\n\n          // Check if data-setup attr exists.\n          // We only auto-setup if they've added the data-setup attr.\n          if (options !== null) {\n\n            // Parse options JSON\n            // If empty string, make it a parsable json object.\n            options = vjs.JSON.parse(options || '{}');\n\n            // Create new video.js instance.\n            player = videojs(vid, options);\n          }\n        }\n\n      // If getAttribute isn't defined, we need to wait for the DOM.\n      } else {\n        vjs.autoSetupTimeout(1);\n        break;\n      }\n    }\n\n  // No videos were found, so keep looping unless page is finisehd loading.\n  } else if (!vjs.windowLoaded) {\n    vjs.autoSetupTimeout(1);\n  }\n};\n\n// Pause to let the DOM keep processing\nvjs.autoSetupTimeout = function(wait){\n  setTimeout(vjs.autoSetup, wait);\n};\n\nif (document.readyState === 'complete') {\n  vjs.windowLoaded = true;\n} else {\n  vjs.one(window, 'load', function(){\n    vjs.windowLoaded = true;\n  });\n}\n\n// Run Auto-load players\n// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)\nvjs.autoSetupTimeout(1);\n/**\n * the method for registering a video.js plugin\n *\n * @param  {String} name The name of the plugin\n * @param  {Function} init The function that is run when the player inits\n */\nvjs.plugin = function(name, init){\n  vjs.Player.prototype[name] = init;\n};\n"
  },
  {
    "path": "static/common/user/uedit/third-party/video-js/video.js",
    "content": "/*! Video.js v4.3.0 Copyright 2013 Brightcove, Inc. https://github.com/videojs/video.js/blob/master/LICENSE */ (function() {var b=void 0,f=!0,h=null,l=!1;function m(){return function(){}}function p(a){return function(){return this[a]}}function s(a){return function(){return a}}var t;document.createElement(\"video\");document.createElement(\"audio\");document.createElement(\"track\");function u(a,c,d){if(\"string\"===typeof a){0===a.indexOf(\"#\")&&(a=a.slice(1));if(u.xa[a])return u.xa[a];a=u.w(a)}if(!a||!a.nodeName)throw new TypeError(\"The element or ID supplied is not valid. (videojs)\");return a.player||new u.s(a,c,d)}var v=u;\nwindow.Td=window.Ud=u;u.Tb=\"4.3\";u.Fc=\"https:\"==document.location.protocol?\"https://\":\"http://\";u.options={techOrder:[\"html5\",\"flash\"],html5:{},flash:{},width:300,height:150,defaultVolume:0,children:{mediaLoader:{},posterImage:{},textTrackDisplay:{},loadingSpinner:{},bigPlayButton:{},controlBar:{}},notSupportedMessage:'Sorry, no compatible source and playback technology were found for this video. Try using another browser like <a href=\"http://bit.ly/ccMUEC\">Chrome</a> or download the latest <a href=\"http://adobe.ly/mwfN1\">Adobe Flash Player</a>.'};\n\"GENERATED_CDN_VSN\"!==u.Tb&&(v.options.flash.swf=u.Fc+\"vjs.zencdn.net/\"+u.Tb+\"/video-js.swf\");u.xa={};u.la=u.CoreObject=m();u.la.extend=function(a){var c,d;a=a||{};c=a.init||a.i||this.prototype.init||this.prototype.i||m();d=function(){c.apply(this,arguments)};d.prototype=u.k.create(this.prototype);d.prototype.constructor=d;d.extend=u.la.extend;d.create=u.la.create;for(var e in a)a.hasOwnProperty(e)&&(d.prototype[e]=a[e]);return d};\nu.la.create=function(){var a=u.k.create(this.prototype);this.apply(a,arguments);return a};u.d=function(a,c,d){var e=u.getData(a);e.z||(e.z={});e.z[c]||(e.z[c]=[]);d.t||(d.t=u.t++);e.z[c].push(d);e.W||(e.disabled=l,e.W=function(c){if(!e.disabled){c=u.kc(c);var d=e.z[c.type];if(d)for(var d=d.slice(0),k=0,q=d.length;k<q&&!c.pc();k++)d[k].call(a,c)}});1==e.z[c].length&&(document.addEventListener?a.addEventListener(c,e.W,l):document.attachEvent&&a.attachEvent(\"on\"+c,e.W))};\nu.o=function(a,c,d){if(u.oc(a)){var e=u.getData(a);if(e.z)if(c){var g=e.z[c];if(g){if(d){if(d.t)for(e=0;e<g.length;e++)g[e].t===d.t&&g.splice(e--,1)}else e.z[c]=[];u.gc(a,c)}}else for(g in e.z)c=g,e.z[c]=[],u.gc(a,c)}};u.gc=function(a,c){var d=u.getData(a);0===d.z[c].length&&(delete d.z[c],document.removeEventListener?a.removeEventListener(c,d.W,l):document.detachEvent&&a.detachEvent(\"on\"+c,d.W));u.Bb(d.z)&&(delete d.z,delete d.W,delete d.disabled);u.Bb(d)&&u.vc(a)};\nu.kc=function(a){function c(){return f}function d(){return l}if(!a||!a.Cb){var e=a||window.event;a={};for(var g in e)\"layerX\"!==g&&\"layerY\"!==g&&(a[g]=e[g]);a.target||(a.target=a.srcElement||document);a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;a.preventDefault=function(){e.preventDefault&&e.preventDefault();a.returnValue=l;a.Ab=c};a.Ab=d;a.stopPropagation=function(){e.stopPropagation&&e.stopPropagation();a.cancelBubble=f;a.Cb=c};a.Cb=d;a.stopImmediatePropagation=function(){e.stopImmediatePropagation&&\ne.stopImmediatePropagation();a.pc=c;a.stopPropagation()};a.pc=d;if(a.clientX!=h){g=document.documentElement;var j=document.body;a.pageX=a.clientX+(g&&g.scrollLeft||j&&j.scrollLeft||0)-(g&&g.clientLeft||j&&j.clientLeft||0);a.pageY=a.clientY+(g&&g.scrollTop||j&&j.scrollTop||0)-(g&&g.clientTop||j&&j.clientTop||0)}a.which=a.charCode||a.keyCode;a.button!=h&&(a.button=a.button&1?0:a.button&4?1:a.button&2?2:0)}return a};\nu.j=function(a,c){var d=u.oc(a)?u.getData(a):{},e=a.parentNode||a.ownerDocument;\"string\"===typeof c&&(c={type:c,target:a});c=u.kc(c);d.W&&d.W.call(a,c);if(e&&!c.Cb()&&c.bubbles!==l)u.j(e,c);else if(!e&&!c.Ab()&&(d=u.getData(c.target),c.target[c.type])){d.disabled=f;if(\"function\"===typeof c.target[c.type])c.target[c.type]();d.disabled=l}return!c.Ab()};u.U=function(a,c,d){function e(){u.o(a,c,e);d.apply(this,arguments)}e.t=d.t=d.t||u.t++;u.d(a,c,e)};var w=Object.prototype.hasOwnProperty;\nu.e=function(a,c){var d,e;d=document.createElement(a||\"div\");for(e in c)w.call(c,e)&&(-1!==e.indexOf(\"aria-\")||\"role\"==e?d.setAttribute(e,c[e]):d[e]=c[e]);return d};u.$=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};u.k={};u.k.create=Object.create||function(a){function c(){}c.prototype=a;return new c};u.k.ua=function(a,c,d){for(var e in a)w.call(a,e)&&c.call(d||this,e,a[e])};u.k.B=function(a,c){if(!c)return a;for(var d in c)w.call(c,d)&&(a[d]=c[d]);return a};\nu.k.ic=function(a,c){var d,e,g;a=u.k.copy(a);for(d in c)w.call(c,d)&&(e=a[d],g=c[d],a[d]=u.k.qc(e)&&u.k.qc(g)?u.k.ic(e,g):c[d]);return a};u.k.copy=function(a){return u.k.B({},a)};u.k.qc=function(a){return!!a&&\"object\"===typeof a&&\"[object Object]\"===a.toString()&&a.constructor===Object};u.bind=function(a,c,d){function e(){return c.apply(a,arguments)}c.t||(c.t=u.t++);e.t=d?d+\"_\"+c.t:c.t;return e};u.ra={};u.t=1;u.expando=\"vdata\"+(new Date).getTime();\nu.getData=function(a){var c=a[u.expando];c||(c=a[u.expando]=u.t++,u.ra[c]={});return u.ra[c]};u.oc=function(a){a=a[u.expando];return!(!a||u.Bb(u.ra[a]))};u.vc=function(a){var c=a[u.expando];if(c){delete u.ra[c];try{delete a[u.expando]}catch(d){a.removeAttribute?a.removeAttribute(u.expando):a[u.expando]=h}}};u.Bb=function(a){for(var c in a)if(a[c]!==h)return l;return f};u.n=function(a,c){-1==(\" \"+a.className+\" \").indexOf(\" \"+c+\" \")&&(a.className=\"\"===a.className?c:a.className+\" \"+c)};\nu.u=function(a,c){var d,e;if(-1!=a.className.indexOf(c)){d=a.className.split(\" \");for(e=d.length-1;0<=e;e--)d[e]===c&&d.splice(e,1);a.className=d.join(\" \")}};u.na=u.e(\"video\");u.F=navigator.userAgent;u.Mc=/iPhone/i.test(u.F);u.Lc=/iPad/i.test(u.F);u.Nc=/iPod/i.test(u.F);u.Kc=u.Mc||u.Lc||u.Nc;var aa=u,x;var y=u.F.match(/OS (\\d+)_/i);x=y&&y[1]?y[1]:b;aa.Fd=x;u.Ic=/Android/i.test(u.F);var ba=u,z;var A=u.F.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i),B,C;\nA?(B=A[1]&&parseFloat(A[1]),C=A[2]&&parseFloat(A[2]),z=B&&C?parseFloat(A[1]+\".\"+A[2]):B?B:h):z=h;ba.Gc=z;u.Oc=u.Ic&&/webkit/i.test(u.F)&&2.3>u.Gc;u.Jc=/Firefox/i.test(u.F);u.Gd=/Chrome/i.test(u.F);u.ac=!!(\"ontouchstart\"in window||window.Hc&&document instanceof window.Hc);\nu.xb=function(a){var c,d,e,g;c={};if(a&&a.attributes&&0<a.attributes.length){d=a.attributes;for(var j=d.length-1;0<=j;j--){e=d[j].name;g=d[j].value;if(\"boolean\"===typeof a[e]||-1!==\",autoplay,controls,loop,muted,default,\".indexOf(\",\"+e+\",\"))g=g!==h?f:l;c[e]=g}}return c};\nu.Kd=function(a,c){var d=\"\";document.defaultView&&document.defaultView.getComputedStyle?d=document.defaultView.getComputedStyle(a,\"\").getPropertyValue(c):a.currentStyle&&(d=a[\"client\"+c.substr(0,1).toUpperCase()+c.substr(1)]+\"px\");return d};u.zb=function(a,c){c.firstChild?c.insertBefore(a,c.firstChild):c.appendChild(a)};u.Pb={};u.w=function(a){0===a.indexOf(\"#\")&&(a=a.slice(1));return document.getElementById(a)};\nu.La=function(a,c){c=c||a;var d=Math.floor(a%60),e=Math.floor(a/60%60),g=Math.floor(a/3600),j=Math.floor(c/60%60),k=Math.floor(c/3600);if(isNaN(a)||Infinity===a)g=e=d=\"-\";g=0<g||0<k?g+\":\":\"\";return g+(((g||10<=j)&&10>e?\"0\"+e:e)+\":\")+(10>d?\"0\"+d:d)};u.Tc=function(){document.body.focus();document.onselectstart=s(l)};u.Bd=function(){document.onselectstart=s(f)};u.trim=function(a){return(a+\"\").replace(/^\\s+|\\s+$/g,\"\")};u.round=function(a,c){c||(c=0);return Math.round(a*Math.pow(10,c))/Math.pow(10,c)};\nu.tb=function(a,c){return{length:1,start:function(){return a},end:function(){return c}}};\nu.get=function(a,c,d){var e,g;\"undefined\"===typeof XMLHttpRequest&&(window.XMLHttpRequest=function(){try{return new window.ActiveXObject(\"Msxml2.XMLHTTP.6.0\")}catch(a){}try{return new window.ActiveXObject(\"Msxml2.XMLHTTP.3.0\")}catch(c){}try{return new window.ActiveXObject(\"Msxml2.XMLHTTP\")}catch(d){}throw Error(\"This browser does not support XMLHttpRequest.\");});g=new XMLHttpRequest;try{g.open(\"GET\",a)}catch(j){d(j)}e=0===a.indexOf(\"file:\")||0===window.location.href.indexOf(\"file:\")&&-1===a.indexOf(\"http\");\ng.onreadystatechange=function(){4===g.readyState&&(200===g.status||e&&0===g.status?c(g.responseText):d&&d())};try{g.send()}catch(k){d&&d(k)}};u.td=function(a){try{var c=window.localStorage||l;c&&(c.volume=a)}catch(d){22==d.code||1014==d.code?u.log(\"LocalStorage Full (VideoJS)\",d):18==d.code?u.log(\"LocalStorage not allowed (VideoJS)\",d):u.log(\"LocalStorage Error (VideoJS)\",d)}};u.mc=function(a){a.match(/^https?:\\/\\//)||(a=u.e(\"div\",{innerHTML:'<a href=\"'+a+'\">x</a>'}).firstChild.href);return a};\nu.log=function(){u.log.history=u.log.history||[];u.log.history.push(arguments);window.console&&window.console.log(Array.prototype.slice.call(arguments))};u.ad=function(a){var c,d;a.getBoundingClientRect&&a.parentNode&&(c=a.getBoundingClientRect());if(!c)return{left:0,top:0};a=document.documentElement;d=document.body;return{left:c.left+(window.pageXOffset||d.scrollLeft)-(a.clientLeft||d.clientLeft||0),top:c.top+(window.pageYOffset||d.scrollTop)-(a.clientTop||d.clientTop||0)}};\nu.c=u.la.extend({i:function(a,c,d){this.b=a;this.g=u.k.copy(this.g);c=this.options(c);this.Q=c.id||(c.el&&c.el.id?c.el.id:a.id()+\"_component_\"+u.t++);this.gd=c.name||h;this.a=c.el||this.e();this.G=[];this.qb={};this.V={};if((a=this.g)&&a.children){var e=this;u.k.ua(a.children,function(a,c){c!==l&&!c.loadEvent&&(e[a]=e.Z(a,c))})}this.L(d)}});t=u.c.prototype;\nt.D=function(){this.j(\"dispose\");if(this.G)for(var a=this.G.length-1;0<=a;a--)this.G[a].D&&this.G[a].D();this.V=this.qb=this.G=h;this.o();this.a.parentNode&&this.a.parentNode.removeChild(this.a);u.vc(this.a);this.a=h};t.b=f;t.K=p(\"b\");t.options=function(a){return a===b?this.g:this.g=u.k.ic(this.g,a)};t.e=function(a,c){return u.e(a,c)};t.w=p(\"a\");t.id=p(\"Q\");t.name=p(\"gd\");t.children=p(\"G\");\nt.Z=function(a,c){var d,e;\"string\"===typeof a?(e=a,c=c||{},d=c.componentClass||u.$(e),c.name=e,d=new window.videojs[d](this.b||this,c)):d=a;this.G.push(d);\"function\"===typeof d.id&&(this.qb[d.id()]=d);(e=e||d.name&&d.name())&&(this.V[e]=d);\"function\"===typeof d.el&&d.el()&&(this.sa||this.a).appendChild(d.el());return d};\nt.removeChild=function(a){\"string\"===typeof a&&(a=this.V[a]);if(a&&this.G){for(var c=l,d=this.G.length-1;0<=d;d--)if(this.G[d]===a){c=f;this.G.splice(d,1);break}c&&(this.qb[a.id]=h,this.V[a.name]=h,(c=a.w())&&c.parentNode===(this.sa||this.a)&&(this.sa||this.a).removeChild(a.w()))}};t.T=s(\"\");t.d=function(a,c){u.d(this.a,a,u.bind(this,c));return this};t.o=function(a,c){u.o(this.a,a,c);return this};t.U=function(a,c){u.U(this.a,a,u.bind(this,c));return this};t.j=function(a,c){u.j(this.a,a,c);return this};\nt.L=function(a){a&&(this.aa?a.call(this):(this.Sa===b&&(this.Sa=[]),this.Sa.push(a)));return this};t.Ua=function(){this.aa=f;var a=this.Sa;if(a&&0<a.length){for(var c=0,d=a.length;c<d;c++)a[c].call(this);this.Sa=[];this.j(\"ready\")}};t.n=function(a){u.n(this.a,a);return this};t.u=function(a){u.u(this.a,a);return this};t.show=function(){this.a.style.display=\"block\";return this};t.C=function(){this.a.style.display=\"none\";return this};function D(a){a.u(\"vjs-lock-showing\")}\nt.disable=function(){this.C();this.show=m()};t.width=function(a,c){return E(this,\"width\",a,c)};t.height=function(a,c){return E(this,\"height\",a,c)};t.Xc=function(a,c){return this.width(a,f).height(c)};function E(a,c,d,e){if(d!==b)return a.a.style[c]=-1!==(\"\"+d).indexOf(\"%\")||-1!==(\"\"+d).indexOf(\"px\")?d:\"auto\"===d?\"\":d+\"px\",e||a.j(\"resize\"),a;if(!a.a)return 0;d=a.a.style[c];e=d.indexOf(\"px\");return-1!==e?parseInt(d.slice(0,e),10):parseInt(a.a[\"offset\"+u.$(c)],10)}\nu.q=u.c.extend({i:function(a,c){u.c.call(this,a,c);var d=l;this.d(\"touchstart\",function(a){a.preventDefault();d=f});this.d(\"touchmove\",function(){d=l});var e=this;this.d(\"touchend\",function(a){d&&e.p(a);a.preventDefault()});this.d(\"click\",this.p);this.d(\"focus\",this.Oa);this.d(\"blur\",this.Na)}});t=u.q.prototype;\nt.e=function(a,c){c=u.k.B({className:this.T(),innerHTML:'<div class=\"vjs-control-content\"><span class=\"vjs-control-text\">'+(this.qa||\"Need Text\")+\"</span></div>\",qd:\"button\",\"aria-live\":\"polite\",tabIndex:0},c);return u.c.prototype.e.call(this,a,c)};t.T=function(){return\"vjs-control \"+u.c.prototype.T.call(this)};t.p=m();t.Oa=function(){u.d(document,\"keyup\",u.bind(this,this.ba))};t.ba=function(a){if(32==a.which||13==a.which)a.preventDefault(),this.p()};\nt.Na=function(){u.o(document,\"keyup\",u.bind(this,this.ba))};u.O=u.c.extend({i:function(a,c){u.c.call(this,a,c);this.Sc=this.V[this.g.barName];this.handle=this.V[this.g.handleName];a.d(this.tc,u.bind(this,this.update));this.d(\"mousedown\",this.Pa);this.d(\"touchstart\",this.Pa);this.d(\"focus\",this.Oa);this.d(\"blur\",this.Na);this.d(\"click\",this.p);this.b.d(\"controlsvisible\",u.bind(this,this.update));a.L(u.bind(this,this.update));this.P={}}});t=u.O.prototype;\nt.e=function(a,c){c=c||{};c.className+=\" vjs-slider\";c=u.k.B({qd:\"slider\",\"aria-valuenow\":0,\"aria-valuemin\":0,\"aria-valuemax\":100,tabIndex:0},c);return u.c.prototype.e.call(this,a,c)};t.Pa=function(a){a.preventDefault();u.Tc();this.P.move=u.bind(this,this.Hb);this.P.end=u.bind(this,this.Ib);u.d(document,\"mousemove\",this.P.move);u.d(document,\"mouseup\",this.P.end);u.d(document,\"touchmove\",this.P.move);u.d(document,\"touchend\",this.P.end);this.Hb(a)};\nt.Ib=function(){u.Bd();u.o(document,\"mousemove\",this.P.move,l);u.o(document,\"mouseup\",this.P.end,l);u.o(document,\"touchmove\",this.P.move,l);u.o(document,\"touchend\",this.P.end,l);this.update()};t.update=function(){if(this.a){var a,c=this.yb(),d=this.handle,e=this.Sc;isNaN(c)&&(c=0);a=c;if(d){a=this.a.offsetWidth;var g=d.w().offsetWidth;a=g?g/a:0;c*=1-a;a=c+a/2;d.w().style.left=u.round(100*c,2)+\"%\"}e.w().style.width=u.round(100*a,2)+\"%\"}};\nfunction F(a,c){var d,e,g,j;d=a.a;e=u.ad(d);j=g=d.offsetWidth;d=a.handle;if(a.g.Cd)return j=e.top,e=c.changedTouches?c.changedTouches[0].pageY:c.pageY,d&&(d=d.w().offsetHeight,j+=d/2,g-=d),Math.max(0,Math.min(1,(j-e+g)/g));g=e.left;e=c.changedTouches?c.changedTouches[0].pageX:c.pageX;d&&(d=d.w().offsetWidth,g+=d/2,j-=d);return Math.max(0,Math.min(1,(e-g)/j))}t.Oa=function(){u.d(document,\"keyup\",u.bind(this,this.ba))};\nt.ba=function(a){37==a.which?(a.preventDefault(),this.yc()):39==a.which&&(a.preventDefault(),this.zc())};t.Na=function(){u.o(document,\"keyup\",u.bind(this,this.ba))};t.p=function(a){a.stopImmediatePropagation();a.preventDefault()};u.ea=u.c.extend();u.ea.prototype.defaultValue=0;u.ea.prototype.e=function(a,c){c=c||{};c.className+=\" vjs-slider-handle\";c=u.k.B({innerHTML:'<span class=\"vjs-control-text\">'+this.defaultValue+\"</span>\"},c);return u.c.prototype.e.call(this,\"div\",c)};u.ma=u.c.extend();\nfunction ca(a,c){a.Z(c);c.d(\"click\",u.bind(a,function(){D(this)}))}u.ma.prototype.e=function(){var a=this.options().Vc||\"ul\";this.sa=u.e(a,{className:\"vjs-menu-content\"});a=u.c.prototype.e.call(this,\"div\",{append:this.sa,className:\"vjs-menu\"});a.appendChild(this.sa);u.d(a,\"click\",function(a){a.preventDefault();a.stopImmediatePropagation()});return a};u.N=u.q.extend({i:function(a,c){u.q.call(this,a,c);this.selected(c.selected)}});\nu.N.prototype.e=function(a,c){return u.q.prototype.e.call(this,\"li\",u.k.B({className:\"vjs-menu-item\",innerHTML:this.g.label},c))};u.N.prototype.p=function(){this.selected(f)};u.N.prototype.selected=function(a){a?(this.n(\"vjs-selected\"),this.a.setAttribute(\"aria-selected\",f)):(this.u(\"vjs-selected\"),this.a.setAttribute(\"aria-selected\",l))};\nu.R=u.q.extend({i:function(a,c){u.q.call(this,a,c);this.wa=this.Ka();this.Z(this.wa);this.I&&0===this.I.length&&this.C();this.d(\"keyup\",this.ba);this.a.setAttribute(\"aria-haspopup\",f);this.a.setAttribute(\"role\",\"button\")}});t=u.R.prototype;t.pa=l;t.Ka=function(){var a=new u.ma(this.b);this.options().title&&a.w().appendChild(u.e(\"li\",{className:\"vjs-menu-title\",innerHTML:u.$(this.A),zd:-1}));if(this.I=this.createItems())for(var c=0;c<this.I.length;c++)ca(a,this.I[c]);return a};t.ta=m();\nt.T=function(){return this.className+\" vjs-menu-button \"+u.q.prototype.T.call(this)};t.Oa=m();t.Na=m();t.p=function(){this.U(\"mouseout\",u.bind(this,function(){D(this.wa);this.a.blur()}));this.pa?G(this):H(this)};t.ba=function(a){a.preventDefault();32==a.which||13==a.which?this.pa?G(this):H(this):27==a.which&&this.pa&&G(this)};function H(a){a.pa=f;a.wa.n(\"vjs-lock-showing\");a.a.setAttribute(\"aria-pressed\",f);a.I&&0<a.I.length&&a.I[0].w().focus()}\nfunction G(a){a.pa=l;D(a.wa);a.a.setAttribute(\"aria-pressed\",l)}\nu.s=u.c.extend({i:function(a,c,d){this.M=a;c=u.k.B(da(a),c);this.v={};this.uc=c.poster;this.sb=c.controls;a.controls=l;u.c.call(this,this,c,d);this.controls()?this.n(\"vjs-controls-enabled\"):this.n(\"vjs-controls-disabled\");this.U(\"play\",function(a){u.j(this.a,{type:\"firstplay\",target:this.a})||(a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation())});this.d(\"ended\",this.hd);this.d(\"play\",this.Kb);this.d(\"firstplay\",this.jd);this.d(\"pause\",this.Jb);this.d(\"progress\",this.ld);this.d(\"durationchange\",\nthis.sc);this.d(\"error\",this.Gb);this.d(\"fullscreenchange\",this.kd);u.xa[this.Q]=this;c.plugins&&u.k.ua(c.plugins,function(a,c){this[a](c)},this);var e,g,j,k;e=this.Mb;a=function(){e();clearInterval(g);g=setInterval(u.bind(this,e),250)};c=function(){e();clearInterval(g)};this.d(\"mousedown\",a);this.d(\"mousemove\",e);this.d(\"mouseup\",c);this.d(\"keydown\",e);this.d(\"keyup\",e);this.d(\"touchstart\",a);this.d(\"touchmove\",e);this.d(\"touchend\",c);this.d(\"touchcancel\",c);j=setInterval(u.bind(this,function(){this.ka&&\n(this.ka=l,this.ja(f),clearTimeout(k),k=setTimeout(u.bind(this,function(){this.ka||this.ja(l)}),2E3))}),250);this.d(\"dispose\",function(){clearInterval(j);clearTimeout(k)})}});t=u.s.prototype;t.g=u.options;t.D=function(){this.j(\"dispose\");this.o(\"dispose\");u.xa[this.Q]=h;this.M&&this.M.player&&(this.M.player=h);this.a&&this.a.player&&(this.a.player=h);clearInterval(this.Ra);this.za();this.h&&this.h.D();u.c.prototype.D.call(this)};\nfunction da(a){var c={sources:[],tracks:[]};u.k.B(c,u.xb(a));if(a.hasChildNodes()){var d,e,g,j;a=a.childNodes;g=0;for(j=a.length;g<j;g++)d=a[g],e=d.nodeName.toLowerCase(),\"source\"===e?c.sources.push(u.xb(d)):\"track\"===e&&c.tracks.push(u.xb(d))}return c}\nt.e=function(){var a=this.a=u.c.prototype.e.call(this,\"div\"),c=this.M;c.removeAttribute(\"width\");c.removeAttribute(\"height\");if(c.hasChildNodes()){var d,e,g,j,k;d=c.childNodes;e=d.length;for(k=[];e--;)g=d[e],j=g.nodeName.toLowerCase(),\"track\"===j&&k.push(g);for(d=0;d<k.length;d++)c.removeChild(k[d])}c.id=c.id||\"vjs_video_\"+u.t++;a.id=c.id;a.className=c.className;c.id+=\"_html5_api\";c.className=\"vjs-tech\";c.player=a.player=this;this.n(\"vjs-paused\");this.width(this.g.width,f);this.height(this.g.height,\nf);c.parentNode&&c.parentNode.insertBefore(a,c);u.zb(c,a);return a};\nfunction I(a,c,d){a.h?(a.aa=l,a.h.D(),a.Eb&&(a.Eb=l,clearInterval(a.Ra)),a.Fb&&J(a),a.h=l):\"Html5\"!==c&&a.M&&(u.l.jc(a.M),a.M=h);a.ia=c;a.aa=l;var e=u.k.B({source:d,parentEl:a.a},a.g[c.toLowerCase()]);d&&(d.src==a.v.src&&0<a.v.currentTime&&(e.startTime=a.v.currentTime),a.v.src=d.src);a.h=new window.videojs[c](a,e);a.h.L(function(){this.b.Ua();if(!this.m.progressEvents){var a=this.b;a.Eb=f;a.Ra=setInterval(u.bind(a,function(){this.v.lb<this.buffered().end(0)?this.j(\"progress\"):1==this.Ja()&&(clearInterval(this.Ra),\nthis.j(\"progress\"))}),500);a.h.U(\"progress\",function(){this.m.progressEvents=f;var a=this.b;a.Eb=l;clearInterval(a.Ra)})}this.m.timeupdateEvents||(a=this.b,a.Fb=f,a.d(\"play\",a.Cc),a.d(\"pause\",a.za),a.h.U(\"timeupdate\",function(){this.m.timeupdateEvents=f;J(this.b)}))})}function J(a){a.Fb=l;a.za();a.o(\"play\",a.Cc);a.o(\"pause\",a.za)}t.Cc=function(){this.hc&&this.za();this.hc=setInterval(u.bind(this,function(){this.j(\"timeupdate\")}),250)};t.za=function(){clearInterval(this.hc)};\nt.Kb=function(){u.u(this.a,\"vjs-paused\");u.n(this.a,\"vjs-playing\")};t.jd=function(){this.g.starttime&&this.currentTime(this.g.starttime);this.n(\"vjs-has-started\")};t.Jb=function(){u.u(this.a,\"vjs-playing\");u.n(this.a,\"vjs-paused\")};t.ld=function(){1==this.Ja()&&this.j(\"loadedalldata\")};t.hd=function(){this.g.loop&&(this.currentTime(0),this.play())};t.sc=function(){this.duration(K(this,\"duration\"))};t.kd=function(){this.H?this.n(\"vjs-fullscreen\"):this.u(\"vjs-fullscreen\")};\nt.Gb=function(a){u.log(\"Video Error\",a)};function L(a,c,d){if(a.h&&!a.h.aa)a.h.L(function(){this[c](d)});else try{a.h[c](d)}catch(e){throw u.log(e),e;}}function K(a,c){if(a.h&&a.h.aa)try{return a.h[c]()}catch(d){throw a.h[c]===b?u.log(\"Video.js: \"+c+\" method not defined for \"+a.ia+\" playback technology.\",d):\"TypeError\"==d.name?(u.log(\"Video.js: \"+c+\" unavailable on \"+a.ia+\" playback technology element.\",d),a.h.aa=l):u.log(d),d;}}t.play=function(){L(this,\"play\");return this};\nt.pause=function(){L(this,\"pause\");return this};t.paused=function(){return K(this,\"paused\")===l?l:f};t.currentTime=function(a){return a!==b?(this.v.rc=a,L(this,\"setCurrentTime\",a),this.Fb&&this.j(\"timeupdate\"),this):this.v.currentTime=K(this,\"currentTime\")||0};t.duration=function(a){if(a!==b)return this.v.duration=parseFloat(a),this;this.v.duration===b&&this.sc();return this.v.duration};\nt.buffered=function(){var a=K(this,\"buffered\"),c=a.length-1,d=this.v.lb=this.v.lb||0;a&&(0<=c&&a.end(c)!==d)&&(d=a.end(c),this.v.lb=d);return u.tb(0,d)};t.Ja=function(){return this.duration()?this.buffered().end(0)/this.duration():0};t.volume=function(a){if(a!==b)return a=Math.max(0,Math.min(1,parseFloat(a))),this.v.volume=a,L(this,\"setVolume\",a),u.td(a),this;a=parseFloat(K(this,\"volume\"));return isNaN(a)?1:a};t.muted=function(a){return a!==b?(L(this,\"setMuted\",a),this):K(this,\"muted\")||l};\nt.Ta=function(){return K(this,\"supportsFullScreen\")||l};\nt.ya=function(){var a=u.Pb.ya;this.H=f;a?(u.d(document,a.vb,u.bind(this,function(c){this.H=document[a.H];this.H===l&&u.o(document,a.vb,arguments.callee);this.j(\"fullscreenchange\")})),this.a[a.wc]()):this.h.Ta()?L(this,\"enterFullScreen\"):(this.cd=f,this.Yc=document.documentElement.style.overflow,u.d(document,\"keydown\",u.bind(this,this.lc)),document.documentElement.style.overflow=\"hidden\",u.n(document.body,\"vjs-full-window\"),this.j(\"enterFullWindow\"),this.j(\"fullscreenchange\"));return this};\nt.ob=function(){var a=u.Pb.ya;this.H=l;if(a)document[a.nb]();else this.h.Ta()?L(this,\"exitFullScreen\"):(M(this),this.j(\"fullscreenchange\"));return this};t.lc=function(a){27===a.keyCode&&(this.H===f?this.ob():M(this))};function M(a){a.cd=l;u.o(document,\"keydown\",a.lc);document.documentElement.style.overflow=a.Yc;u.u(document.body,\"vjs-full-window\");a.j(\"exitFullWindow\")}\nt.src=function(a){if(a instanceof Array){var c;a:{c=a;for(var d=0,e=this.g.techOrder;d<e.length;d++){var g=u.$(e[d]),j=window.videojs[g];if(j.isSupported())for(var k=0,q=c;k<q.length;k++){var n=q[k];if(j.canPlaySource(n)){c={source:n,h:g};break a}}}c=l}c?(a=c.source,c=c.h,c==this.ia?this.src(a):I(this,c,a)):this.a.appendChild(u.e(\"p\",{innerHTML:this.options().notSupportedMessage}))}else a instanceof Object?window.videojs[this.ia].canPlaySource(a)?this.src(a.src):this.src([a]):(this.v.src=a,this.aa?\n(L(this,\"src\",a),\"auto\"==this.g.preload&&this.load(),this.g.autoplay&&this.play()):this.L(function(){this.src(a)}));return this};t.load=function(){L(this,\"load\");return this};t.currentSrc=function(){return K(this,\"currentSrc\")||this.v.src||\"\"};t.Qa=function(a){return a!==b?(L(this,\"setPreload\",a),this.g.preload=a,this):K(this,\"preload\")};t.autoplay=function(a){return a!==b?(L(this,\"setAutoplay\",a),this.g.autoplay=a,this):K(this,\"autoplay\")};\nt.loop=function(a){return a!==b?(L(this,\"setLoop\",a),this.g.loop=a,this):K(this,\"loop\")};t.poster=function(a){return a!==b?(this.uc=a,this):this.uc};t.controls=function(a){return a!==b?(a=!!a,this.sb!==a&&((this.sb=a)?(this.u(\"vjs-controls-disabled\"),this.n(\"vjs-controls-enabled\"),this.j(\"controlsenabled\")):(this.u(\"vjs-controls-enabled\"),this.n(\"vjs-controls-disabled\"),this.j(\"controlsdisabled\"))),this):this.sb};u.s.prototype.Sb;t=u.s.prototype;\nt.Rb=function(a){return a!==b?(a=!!a,this.Sb!==a&&((this.Sb=a)?(this.n(\"vjs-using-native-controls\"),this.j(\"usingnativecontrols\")):(this.u(\"vjs-using-native-controls\"),this.j(\"usingcustomcontrols\"))),this):this.Sb};t.error=function(){return K(this,\"error\")};t.seeking=function(){return K(this,\"seeking\")};t.ka=f;t.Mb=function(){this.ka=f};t.Qb=f;\nt.ja=function(a){return a!==b?(a=!!a,a!==this.Qb&&((this.Qb=a)?(this.ka=f,this.u(\"vjs-user-inactive\"),this.n(\"vjs-user-active\"),this.j(\"useractive\")):(this.ka=l,this.h.U(\"mousemove\",function(a){a.stopPropagation();a.preventDefault()}),this.u(\"vjs-user-active\"),this.n(\"vjs-user-inactive\"),this.j(\"userinactive\"))),this):this.Qb};var N,O,P;P=document.createElement(\"div\");O={};\nP.Hd!==b?(O.wc=\"requestFullscreen\",O.nb=\"exitFullscreen\",O.vb=\"fullscreenchange\",O.H=\"fullScreen\"):(document.mozCancelFullScreen?(N=\"moz\",O.H=N+\"FullScreen\"):(N=\"webkit\",O.H=N+\"IsFullScreen\"),P[N+\"RequestFullScreen\"]&&(O.wc=N+\"RequestFullScreen\",O.nb=N+\"CancelFullScreen\"),O.vb=N+\"fullscreenchange\");document[O.nb]&&(u.Pb.ya=O);u.Fa=u.c.extend();\nu.Fa.prototype.g={Md:\"play\",children:{playToggle:{},currentTimeDisplay:{},timeDivider:{},durationDisplay:{},remainingTimeDisplay:{},progressControl:{},fullscreenToggle:{},volumeControl:{},muteToggle:{}}};u.Fa.prototype.e=function(){return u.e(\"div\",{className:\"vjs-control-bar\"})};u.Yb=u.q.extend({i:function(a,c){u.q.call(this,a,c);a.d(\"play\",u.bind(this,this.Kb));a.d(\"pause\",u.bind(this,this.Jb))}});t=u.Yb.prototype;t.qa=\"Play\";t.T=function(){return\"vjs-play-control \"+u.q.prototype.T.call(this)};\nt.p=function(){this.b.paused()?this.b.play():this.b.pause()};t.Kb=function(){u.u(this.a,\"vjs-paused\");u.n(this.a,\"vjs-playing\");this.a.children[0].children[0].innerHTML=\"Pause\"};t.Jb=function(){u.u(this.a,\"vjs-playing\");u.n(this.a,\"vjs-paused\");this.a.children[0].children[0].innerHTML=\"Play\"};u.Ya=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d(\"timeupdate\",u.bind(this,this.Ca))}});\nu.Ya.prototype.e=function(){var a=u.c.prototype.e.call(this,\"div\",{className:\"vjs-current-time vjs-time-controls vjs-control\"});this.content=u.e(\"div\",{className:\"vjs-current-time-display\",innerHTML:'<span class=\"vjs-control-text\">Current Time </span>0:00',\"aria-live\":\"off\"});a.appendChild(u.e(\"div\").appendChild(this.content));return a};\nu.Ya.prototype.Ca=function(){var a=this.b.Nb?this.b.v.currentTime:this.b.currentTime();this.content.innerHTML='<span class=\"vjs-control-text\">Current Time </span>'+u.La(a,this.b.duration())};u.Za=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d(\"timeupdate\",u.bind(this,this.Ca))}});\nu.Za.prototype.e=function(){var a=u.c.prototype.e.call(this,\"div\",{className:\"vjs-duration vjs-time-controls vjs-control\"});this.content=u.e(\"div\",{className:\"vjs-duration-display\",innerHTML:'<span class=\"vjs-control-text\">Duration Time </span>0:00',\"aria-live\":\"off\"});a.appendChild(u.e(\"div\").appendChild(this.content));return a};u.Za.prototype.Ca=function(){var a=this.b.duration();a&&(this.content.innerHTML='<span class=\"vjs-control-text\">Duration Time </span>'+u.La(a))};\nu.cc=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.cc.prototype.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-time-divider\",innerHTML:\"<div><span>/</span></div>\"})};u.fb=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d(\"timeupdate\",u.bind(this,this.Ca))}});\nu.fb.prototype.e=function(){var a=u.c.prototype.e.call(this,\"div\",{className:\"vjs-remaining-time vjs-time-controls vjs-control\"});this.content=u.e(\"div\",{className:\"vjs-remaining-time-display\",innerHTML:'<span class=\"vjs-control-text\">Remaining Time </span>-0:00',\"aria-live\":\"off\"});a.appendChild(u.e(\"div\").appendChild(this.content));return a};u.fb.prototype.Ca=function(){this.b.duration()&&(this.content.innerHTML='<span class=\"vjs-control-text\">Remaining Time </span>-'+u.La(this.b.duration()-this.b.currentTime()))};\nu.Ga=u.q.extend({i:function(a,c){u.q.call(this,a,c)}});u.Ga.prototype.qa=\"Fullscreen\";u.Ga.prototype.T=function(){return\"vjs-fullscreen-control \"+u.q.prototype.T.call(this)};u.Ga.prototype.p=function(){this.b.H?(this.b.ob(),this.a.children[0].children[0].innerHTML=\"Fullscreen\"):(this.b.ya(),this.a.children[0].children[0].innerHTML=\"Non-Fullscreen\")};u.eb=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.eb.prototype.g={children:{seekBar:{}}};\nu.eb.prototype.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-progress-control vjs-control\"})};u.Zb=u.O.extend({i:function(a,c){u.O.call(this,a,c);a.d(\"timeupdate\",u.bind(this,this.Ba));a.L(u.bind(this,this.Ba))}});t=u.Zb.prototype;t.g={children:{loadProgressBar:{},playProgressBar:{},seekHandle:{}},barName:\"playProgressBar\",handleName:\"seekHandle\"};t.tc=\"timeupdate\";t.e=function(){return u.O.prototype.e.call(this,\"div\",{className:\"vjs-progress-holder\",\"aria-label\":\"video progress bar\"})};\nt.Ba=function(){var a=this.b.Nb?this.b.v.currentTime:this.b.currentTime();this.a.setAttribute(\"aria-valuenow\",u.round(100*this.yb(),2));this.a.setAttribute(\"aria-valuetext\",u.La(a,this.b.duration()))};t.yb=function(){var a;\"Flash\"===this.b.ia&&this.b.seeking()?(a=this.b.v,a=a.rc?a.rc:this.b.currentTime()):a=this.b.currentTime();return a/this.b.duration()};t.Pa=function(a){u.O.prototype.Pa.call(this,a);this.b.Nb=f;this.Dd=!this.b.paused();this.b.pause()};\nt.Hb=function(a){a=F(this,a)*this.b.duration();a==this.b.duration()&&(a-=0.1);this.b.currentTime(a)};t.Ib=function(a){u.O.prototype.Ib.call(this,a);this.b.Nb=l;this.Dd&&this.b.play()};t.zc=function(){this.b.currentTime(this.b.currentTime()+5)};t.yc=function(){this.b.currentTime(this.b.currentTime()-5)};u.ab=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d(\"progress\",u.bind(this,this.update))}});u.ab.prototype.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-load-progress\",innerHTML:'<span class=\"vjs-control-text\">Loaded: 0%</span>'})};\nu.ab.prototype.update=function(){this.a.style&&(this.a.style.width=u.round(100*this.b.Ja(),2)+\"%\")};u.Xb=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.Xb.prototype.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-play-progress\",innerHTML:'<span class=\"vjs-control-text\">Progress: 0%</span>'})};u.gb=u.ea.extend();u.gb.prototype.defaultValue=\"00:00\";u.gb.prototype.e=function(){return u.ea.prototype.e.call(this,\"div\",{className:\"vjs-seek-handle\"})};\nu.ib=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.h&&(a.h.m&&a.h.m.volumeControl===l)&&this.n(\"vjs-hidden\");a.d(\"loadstart\",u.bind(this,function(){a.h.m&&a.h.m.volumeControl===l?this.n(\"vjs-hidden\"):this.u(\"vjs-hidden\")}))}});u.ib.prototype.g={children:{volumeBar:{}}};u.ib.prototype.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-volume-control vjs-control\"})};\nu.hb=u.O.extend({i:function(a,c){u.O.call(this,a,c);a.d(\"volumechange\",u.bind(this,this.Ba));a.L(u.bind(this,this.Ba));setTimeout(u.bind(this,this.update),0)}});t=u.hb.prototype;t.Ba=function(){this.a.setAttribute(\"aria-valuenow\",u.round(100*this.b.volume(),2));this.a.setAttribute(\"aria-valuetext\",u.round(100*this.b.volume(),2)+\"%\")};t.g={children:{volumeLevel:{},volumeHandle:{}},barName:\"volumeLevel\",handleName:\"volumeHandle\"};t.tc=\"volumechange\";\nt.e=function(){return u.O.prototype.e.call(this,\"div\",{className:\"vjs-volume-bar\",\"aria-label\":\"volume level\"})};t.Hb=function(a){this.b.muted()&&this.b.muted(l);this.b.volume(F(this,a))};t.yb=function(){return this.b.muted()?0:this.b.volume()};t.zc=function(){this.b.volume(this.b.volume()+0.1)};t.yc=function(){this.b.volume(this.b.volume()-0.1)};u.dc=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});\nu.dc.prototype.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-volume-level\",innerHTML:'<span class=\"vjs-control-text\"></span>'})};u.jb=u.ea.extend();u.jb.prototype.defaultValue=\"00:00\";u.jb.prototype.e=function(){return u.ea.prototype.e.call(this,\"div\",{className:\"vjs-volume-handle\"})};\nu.da=u.q.extend({i:function(a,c){u.q.call(this,a,c);a.d(\"volumechange\",u.bind(this,this.update));a.h&&(a.h.m&&a.h.m.volumeControl===l)&&this.n(\"vjs-hidden\");a.d(\"loadstart\",u.bind(this,function(){a.h.m&&a.h.m.volumeControl===l?this.n(\"vjs-hidden\"):this.u(\"vjs-hidden\")}))}});u.da.prototype.e=function(){return u.q.prototype.e.call(this,\"div\",{className:\"vjs-mute-control vjs-control\",innerHTML:'<div><span class=\"vjs-control-text\">Mute</span></div>'})};\nu.da.prototype.p=function(){this.b.muted(this.b.muted()?l:f)};u.da.prototype.update=function(){var a=this.b.volume(),c=3;0===a||this.b.muted()?c=0:0.33>a?c=1:0.67>a&&(c=2);this.b.muted()?\"Unmute\"!=this.a.children[0].children[0].innerHTML&&(this.a.children[0].children[0].innerHTML=\"Unmute\"):\"Mute\"!=this.a.children[0].children[0].innerHTML&&(this.a.children[0].children[0].innerHTML=\"Mute\");for(a=0;4>a;a++)u.u(this.a,\"vjs-vol-\"+a);u.n(this.a,\"vjs-vol-\"+c)};\nu.oa=u.R.extend({i:function(a,c){u.R.call(this,a,c);a.d(\"volumechange\",u.bind(this,this.update));a.h&&(a.h.m&&a.h.m.Dc===l)&&this.n(\"vjs-hidden\");a.d(\"loadstart\",u.bind(this,function(){a.h.m&&a.h.m.Dc===l?this.n(\"vjs-hidden\"):this.u(\"vjs-hidden\")}));this.n(\"vjs-menu-button\")}});u.oa.prototype.Ka=function(){var a=new u.ma(this.b,{Vc:\"div\"}),c=new u.hb(this.b,u.k.B({Cd:f},this.g.Vd));a.Z(c);return a};u.oa.prototype.p=function(){u.da.prototype.p.call(this);u.R.prototype.p.call(this)};\nu.oa.prototype.e=function(){return u.q.prototype.e.call(this,\"div\",{className:\"vjs-volume-menu-button vjs-menu-button vjs-control\",innerHTML:'<div><span class=\"vjs-control-text\">Mute</span></div>'})};u.oa.prototype.update=u.da.prototype.update;u.cb=u.q.extend({i:function(a,c){u.q.call(this,a,c);(!a.poster()||!a.controls())&&this.C();a.d(\"play\",u.bind(this,this.C))}});\nu.cb.prototype.e=function(){var a=u.e(\"div\",{className:\"vjs-poster\",tabIndex:-1}),c=this.b.poster();c&&(\"backgroundSize\"in a.style?a.style.backgroundImage='url(\"'+c+'\")':a.appendChild(u.e(\"img\",{src:c})));return a};u.cb.prototype.p=function(){this.K().controls()&&this.b.play()};\nu.Wb=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d(\"canplay\",u.bind(this,this.C));a.d(\"canplaythrough\",u.bind(this,this.C));a.d(\"playing\",u.bind(this,this.C));a.d(\"seeked\",u.bind(this,this.C));a.d(\"seeking\",u.bind(this,this.show));a.d(\"seeked\",u.bind(this,this.C));a.d(\"error\",u.bind(this,this.show));a.d(\"waiting\",u.bind(this,this.show))}});u.Wb.prototype.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-loading-spinner\"})};u.Wa=u.q.extend();\nu.Wa.prototype.e=function(){return u.q.prototype.e.call(this,\"div\",{className:\"vjs-big-play-button\",innerHTML:'<span aria-hidden=\"true\"></span>',\"aria-label\":\"play video\"})};u.Wa.prototype.p=function(){this.b.play()};\nu.r=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);var e,g;g=this;e=this.K();a=function(){if(e.controls()&&!e.Rb()){var a,c;g.d(\"mousedown\",g.p);g.d(\"touchstart\",function(a){a.preventDefault();a.stopPropagation();c=this.b.ja()});a=function(a){a.stopPropagation();c&&this.b.Mb()};g.d(\"touchmove\",a);g.d(\"touchleave\",a);g.d(\"touchcancel\",a);g.d(\"touchend\",a);var d,n,r;d=0;g.d(\"touchstart\",function(){d=(new Date).getTime();r=f});a=function(){r=l};g.d(\"touchmove\",a);g.d(\"touchleave\",a);g.d(\"touchcancel\",\na);g.d(\"touchend\",function(){r===f&&(n=(new Date).getTime()-d,250>n&&this.j(\"tap\"))});g.d(\"tap\",g.md)}};c=u.bind(g,g.pd);this.L(a);e.d(\"controlsenabled\",a);e.d(\"controlsdisabled\",c)}});u.r.prototype.pd=function(){this.o(\"tap\");this.o(\"touchstart\");this.o(\"touchmove\");this.o(\"touchleave\");this.o(\"touchcancel\");this.o(\"touchend\");this.o(\"click\");this.o(\"mousedown\")};u.r.prototype.p=function(a){0===a.button&&this.K().controls()&&(this.K().paused()?this.K().play():this.K().pause())};\nu.r.prototype.md=function(){this.K().ja(!this.K().ja())};u.r.prototype.m={volumeControl:f,fullscreenResize:l,progressEvents:l,timeupdateEvents:l};u.media={};u.media.Va=\"play pause paused currentTime setCurrentTime duration buffered volume setVolume muted setMuted width height supportsFullScreen enterFullScreen src load currentSrc preload setPreload autoplay setAutoplay loop setLoop error networkState readyState seeking initialTime startOffsetTime played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks defaultPlaybackRate playbackRate mediaGroup controller controls defaultMuted\".split(\" \");\nfunction ea(){var a=u.media.Va[i];return function(){throw Error('The \"'+a+\"\\\" method is not available on the playback technology's API\");}}for(var i=u.media.Va.length-1;0<=i;i--)u.r.prototype[u.media.Va[i]]=ea();\nu.l=u.r.extend({i:function(a,c,d){this.m.volumeControl=u.l.Uc();this.m.movingMediaElementInDOM=!u.Kc;this.m.fullscreenResize=f;u.r.call(this,a,c,d);(c=c.source)&&this.a.currentSrc===c.src&&0<this.a.networkState?a.j(\"loadstart\"):c&&(this.a.src=c.src);if(u.ac&&a.options().nativeControlsForTouch!==l){var e,g,j,k;e=this;g=this.K();c=g.controls();e.a.controls=!!c;j=function(){e.a.controls=f};k=function(){e.a.controls=l};g.d(\"controlsenabled\",j);g.d(\"controlsdisabled\",k);c=function(){g.o(\"controlsenabled\",\nj);g.o(\"controlsdisabled\",k)};e.d(\"dispose\",c);g.d(\"usingcustomcontrols\",c);g.Rb(f)}a.L(function(){this.M&&(this.g.autoplay&&this.paused())&&(delete this.M.poster,this.play())});for(a=u.l.$a.length-1;0<=a;a--)u.d(this.a,u.l.$a[a],u.bind(this.b,this.$c));this.Ua()}});t=u.l.prototype;t.D=function(){u.r.prototype.D.call(this)};\nt.e=function(){var a=this.b,c=a.M,d;if(!c||this.m.movingMediaElementInDOM===l)c?(d=c.cloneNode(l),u.l.jc(c),c=d,a.M=h):c=u.e(\"video\",{id:a.id()+\"_html5_api\",className:\"vjs-tech\"}),c.player=a,u.zb(c,a.w());d=[\"autoplay\",\"preload\",\"loop\",\"muted\"];for(var e=d.length-1;0<=e;e--){var g=d[e];a.g[g]!==h&&(c[g]=a.g[g])}return c};t.$c=function(a){this.j(a);a.stopPropagation()};t.play=function(){this.a.play()};t.pause=function(){this.a.pause()};t.paused=function(){return this.a.paused};t.currentTime=function(){return this.a.currentTime};\nt.sd=function(a){try{this.a.currentTime=a}catch(c){u.log(c,\"Video is not ready. (Video.js)\")}};t.duration=function(){return this.a.duration||0};t.buffered=function(){return this.a.buffered};t.volume=function(){return this.a.volume};t.xd=function(a){this.a.volume=a};t.muted=function(){return this.a.muted};t.vd=function(a){this.a.muted=a};t.width=function(){return this.a.offsetWidth};t.height=function(){return this.a.offsetHeight};\nt.Ta=function(){return\"function\"==typeof this.a.webkitEnterFullScreen&&(/Android/.test(u.F)||!/Chrome|Mac OS X 10.5/.test(u.F))?f:l};t.src=function(a){this.a.src=a};t.load=function(){this.a.load()};t.currentSrc=function(){return this.a.currentSrc};t.Qa=function(){return this.a.Qa};t.wd=function(a){this.a.Qa=a};t.autoplay=function(){return this.a.autoplay};t.rd=function(a){this.a.autoplay=a};t.controls=function(){return this.a.controls};t.loop=function(){return this.a.loop};\nt.ud=function(a){this.a.loop=a};t.error=function(){return this.a.error};t.seeking=function(){return this.a.seeking};u.l.isSupported=function(){return!!u.na.canPlayType};u.l.mb=function(a){try{return!!u.na.canPlayType(a.type)}catch(c){return\"\"}};u.l.Uc=function(){var a=u.na.volume;u.na.volume=a/2+0.1;return a!==u.na.volume};u.l.$a=\"loadstart suspend abort error emptied stalled loadedmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate progress play pause ratechange volumechange\".split(\" \");\nu.l.jc=function(a){if(a){a.player=h;for(a.parentNode&&a.parentNode.removeChild(a);a.hasChildNodes();)a.removeChild(a.firstChild);a.removeAttribute(\"src\");\"function\"===typeof a.load&&a.load()}};u.Oc&&(document.createElement(\"video\").constructor.prototype.canPlayType=function(a){return a&&-1!=a.toLowerCase().indexOf(\"video/mp4\")?\"maybe\":\"\"});\nu.f=u.r.extend({i:function(a,c,d){u.r.call(this,a,c,d);var e=c.source;d=c.parentEl;var g=this.a=u.e(\"div\",{id:a.id()+\"_temp_flash\"}),j=a.id()+\"_flash_api\";a=a.g;var k=u.k.B({readyFunction:\"videojs.Flash.onReady\",eventProxyFunction:\"videojs.Flash.onEvent\",errorEventProxyFunction:\"videojs.Flash.onError\",autoplay:a.autoplay,preload:a.Qa,loop:a.loop,muted:a.muted},c.flashVars),q=u.k.B({wmode:\"opaque\",bgcolor:\"#000000\"},c.params),n=u.k.B({id:j,name:j,\"class\":\"vjs-tech\"},c.attributes);e&&(e.type&&u.f.ed(e.type)?\n(a=u.f.Ac(e.src),k.rtmpConnection=encodeURIComponent(a.rb),k.rtmpStream=encodeURIComponent(a.Ob)):k.src=encodeURIComponent(u.mc(e.src)));u.zb(g,d);c.startTime&&this.L(function(){this.load();this.play();this.currentTime(c.startTime)});if(c.iFrameMode===f&&!u.Jc){var r=u.e(\"iframe\",{id:j+\"_iframe\",name:j+\"_iframe\",className:\"vjs-tech\",scrolling:\"no\",marginWidth:0,marginHeight:0,frameBorder:0});k.readyFunction=\"ready\";k.eventProxyFunction=\"events\";k.errorEventProxyFunction=\"errors\";u.d(r,\"load\",u.bind(this,\nfunction(){var a,d=r.contentWindow;a=r.contentDocument?r.contentDocument:r.contentWindow.document;a.write(u.f.nc(c.swf,k,q,n));d.player=this.b;d.ready=u.bind(this.b,function(c){var d=this.h;d.a=a.getElementById(c);u.f.pb(d)});d.events=u.bind(this.b,function(a,c){this&&\"flash\"===this.ia&&this.j(c)});d.errors=u.bind(this.b,function(a,c){u.log(\"Flash Error\",c)})}));g.parentNode.replaceChild(r,g)}else u.f.Zc(c.swf,g,k,q,n)}});t=u.f.prototype;t.D=function(){u.r.prototype.D.call(this)};t.play=function(){this.a.vjs_play()};\nt.pause=function(){this.a.vjs_pause()};t.src=function(a){u.f.dd(a)?(a=u.f.Ac(a),this.Qd(a.rb),this.Rd(a.Ob)):(a=u.mc(a),this.a.vjs_src(a));if(this.b.autoplay()){var c=this;setTimeout(function(){c.play()},0)}};t.currentSrc=function(){var a=this.a.vjs_getProperty(\"currentSrc\");if(a==h){var c=this.Od(),d=this.Pd();c&&d&&(a=u.f.yd(c,d))}return a};t.load=function(){this.a.vjs_load()};t.poster=function(){this.a.vjs_getProperty(\"poster\")};t.buffered=function(){return u.tb(0,this.a.vjs_getProperty(\"buffered\"))};\nt.Ta=s(l);var Q=u.f.prototype,R=\"rtmpConnection rtmpStream preload currentTime defaultPlaybackRate playbackRate autoplay loop mediaGroup controller controls volume muted defaultMuted\".split(\" \"),S=\"error currentSrc networkState readyState seeking initialTime duration startOffsetTime paused played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks\".split(\" \");\nfunction fa(){var a=R[T],c=a.charAt(0).toUpperCase()+a.slice(1);Q[\"set\"+c]=function(c){return this.a.vjs_setProperty(a,c)}}function U(a){Q[a]=function(){return this.a.vjs_getProperty(a)}}var T;for(T=0;T<R.length;T++)U(R[T]),fa();for(T=0;T<S.length;T++)U(S[T]);u.f.isSupported=function(){return 10<=u.f.version()[0]};u.f.mb=function(a){if(!a.type)return\"\";a=a.type.replace(/;.*/,\"\").toLowerCase();if(a in u.f.bd||a in u.f.Bc)return\"maybe\"};\nu.f.bd={\"video/flv\":\"FLV\",\"video/x-flv\":\"FLV\",\"video/mp4\":\"MP4\",\"video/m4v\":\"MP4\"};u.f.Bc={\"rtmp/mp4\":\"MP4\",\"rtmp/flv\":\"FLV\"};u.f.onReady=function(a){a=u.w(a);var c=a.player||a.parentNode.player,d=c.h;a.player=c;d.a=a;u.f.pb(d)};u.f.pb=function(a){a.w().vjs_getProperty?a.Ua():setTimeout(function(){u.f.pb(a)},50)};u.f.onEvent=function(a,c){u.w(a).player.j(c)};u.f.onError=function(a,c){u.w(a).player.j(\"error\");u.log(\"Flash Error\",c,a)};\nu.f.version=function(){var a=\"0,0,0\";try{a=(new window.ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\")).GetVariable(\"$version\").replace(/\\D+/g,\",\").match(/^,?(.+),?$/)[1]}catch(c){try{navigator.mimeTypes[\"application/x-shockwave-flash\"].enabledPlugin&&(a=(navigator.plugins[\"Shockwave Flash 2.0\"]||navigator.plugins[\"Shockwave Flash\"]).description.replace(/\\D+/g,\",\").match(/^,?(.+),?$/)[1])}catch(d){}}return a.split(\",\")};\nu.f.Zc=function(a,c,d,e,g){a=u.f.nc(a,d,e,g);a=u.e(\"div\",{innerHTML:a}).childNodes[0];d=c.parentNode;c.parentNode.replaceChild(a,c);var j=d.childNodes[0];setTimeout(function(){j.style.display=\"block\"},1E3)};\nu.f.nc=function(a,c,d,e){var g=\"\",j=\"\",k=\"\";c&&u.k.ua(c,function(a,c){g+=a+\"=\"+c+\"&amp;\"});d=u.k.B({movie:a,flashvars:g,allowScriptAccess:\"always\",allowNetworking:\"all\"},d);u.k.ua(d,function(a,c){j+='<param name=\"'+a+'\" value=\"'+c+'\" />'});e=u.k.B({data:a,width:\"100%\",height:\"100%\"},e);u.k.ua(e,function(a,c){k+=a+'=\"'+c+'\" '});return'<object type=\"application/x-shockwave-flash\"'+k+\">\"+j+\"</object>\"};u.f.yd=function(a,c){return a+\"&\"+c};\nu.f.Ac=function(a){var c={rb:\"\",Ob:\"\"};if(!a)return c;var d=a.indexOf(\"&\"),e;-1!==d?e=d+1:(d=e=a.lastIndexOf(\"/\")+1,0===d&&(d=e=a.length));c.rb=a.substring(0,d);c.Ob=a.substring(e,a.length);return c};u.f.ed=function(a){return a in u.f.Bc};u.f.Qc=/^rtmp[set]?:\\/\\//i;u.f.dd=function(a){return u.f.Qc.test(a)};\nu.Pc=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);if(!a.g.sources||0===a.g.sources.length){c=0;for(d=a.g.techOrder;c<d.length;c++){var e=u.$(d[c]),g=window.videojs[e];if(g&&g.isSupported()){I(a,e);break}}}else a.src(a.g.sources)}});function V(a){a.Aa=a.Aa||[];return a.Aa}function W(a,c,d){for(var e=a.Aa,g=0,j=e.length,k,q;g<j;g++)k=e[g],k.id()===c?(k.show(),q=k):d&&(k.J()==d&&0<k.mode())&&k.disable();(c=q?q.J():d?d:l)&&a.j(c+\"trackchange\")}\nu.X=u.c.extend({i:function(a,c){u.c.call(this,a,c);this.Q=c.id||\"vjs_\"+c.kind+\"_\"+c.language+\"_\"+u.t++;this.xc=c.src;this.Wc=c[\"default\"]||c.dflt;this.Ad=c.title;this.Ld=c.srclang;this.fd=c.label;this.fa=[];this.ec=[];this.ga=this.ha=0;this.b.d(\"fullscreenchange\",u.bind(this,this.Rc))}});t=u.X.prototype;t.J=p(\"A\");t.src=p(\"xc\");t.ub=p(\"Wc\");t.title=p(\"Ad\");t.label=p(\"fd\");t.readyState=p(\"ha\");t.mode=p(\"ga\");t.Rc=function(){this.a.style.fontSize=this.b.H?140*(screen.width/this.b.width())+\"%\":\"\"};\nt.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-\"+this.A+\" vjs-text-track\"})};t.show=function(){X(this);this.ga=2;u.c.prototype.show.call(this)};t.C=function(){X(this);this.ga=1;u.c.prototype.C.call(this)};t.disable=function(){2==this.ga&&this.C();this.b.o(\"timeupdate\",u.bind(this,this.update,this.Q));this.b.o(\"ended\",u.bind(this,this.reset,this.Q));this.reset();this.b.V.textTrackDisplay.removeChild(this);this.ga=0};\nfunction X(a){0===a.ha&&a.load();0===a.ga&&(a.b.d(\"timeupdate\",u.bind(a,a.update,a.Q)),a.b.d(\"ended\",u.bind(a,a.reset,a.Q)),(\"captions\"===a.A||\"subtitles\"===a.A)&&a.b.V.textTrackDisplay.Z(a))}t.load=function(){0===this.ha&&(this.ha=1,u.get(this.xc,u.bind(this,this.nd),u.bind(this,this.Gb)))};t.Gb=function(a){this.error=a;this.ha=3;this.j(\"error\")};\nt.nd=function(a){var c,d;a=a.split(\"\\n\");for(var e=\"\",g=1,j=a.length;g<j;g++)if(e=u.trim(a[g])){-1==e.indexOf(\"--\\x3e\")?(c=e,e=u.trim(a[++g])):c=this.fa.length;c={id:c,index:this.fa.length};d=e.split(\" --\\x3e \");c.startTime=Y(d[0]);c.va=Y(d[1]);for(d=[];a[++g]&&(e=u.trim(a[g]));)d.push(e);c.text=d.join(\"<br/>\");this.fa.push(c)}this.ha=2;this.j(\"loaded\")};\nfunction Y(a){var c=a.split(\":\");a=0;var d,e,g;3==c.length?(d=c[0],e=c[1],c=c[2]):(d=0,e=c[0],c=c[1]);c=c.split(/\\s+/);c=c.splice(0,1)[0];c=c.split(/\\.|,/);g=parseFloat(c[1]);c=c[0];a+=3600*parseFloat(d);a+=60*parseFloat(e);a+=parseFloat(c);g&&(a+=g/1E3);return a}\nt.update=function(){if(0<this.fa.length){var a=this.b.currentTime();if(this.Lb===b||a<this.Lb||this.Ma<=a){var c=this.fa,d=this.b.duration(),e=0,g=l,j=[],k,q,n,r;a>=this.Ma||this.Ma===b?r=this.wb!==b?this.wb:0:(g=f,r=this.Db!==b?this.Db:c.length-1);for(;;){n=c[r];if(n.va<=a)e=Math.max(e,n.va),n.Ia&&(n.Ia=l);else if(a<n.startTime){if(d=Math.min(d,n.startTime),n.Ia&&(n.Ia=l),!g)break}else g?(j.splice(0,0,n),q===b&&(q=r),k=r):(j.push(n),k===b&&(k=r),q=r),d=Math.min(d,n.va),e=Math.max(e,n.startTime),\nn.Ia=f;if(g)if(0===r)break;else r--;else if(r===c.length-1)break;else r++}this.ec=j;this.Ma=d;this.Lb=e;this.wb=k;this.Db=q;a=this.ec;c=\"\";d=0;for(e=a.length;d<e;d++)c+='<span class=\"vjs-tt-cue\">'+a[d].text+\"</span>\";this.a.innerHTML=c;this.j(\"cuechange\")}}};t.reset=function(){this.Ma=0;this.Lb=this.b.duration();this.Db=this.wb=0};u.Ub=u.X.extend();u.Ub.prototype.A=\"captions\";u.$b=u.X.extend();u.$b.prototype.A=\"subtitles\";u.Vb=u.X.extend();u.Vb.prototype.A=\"chapters\";\nu.bc=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);if(a.g.tracks&&0<a.g.tracks.length){c=this.b;a=a.g.tracks;var e;for(d=0;d<a.length;d++){e=a[d];var g=c,j=e.kind,k=e.label,q=e.language,n=e;e=g.Aa=g.Aa||[];n=n||{};n.kind=j;n.label=k;n.language=q;j=u.$(j||\"subtitles\");g=new window.videojs[j+\"Track\"](g,n);e.push(g)}}}});u.bc.prototype.e=function(){return u.c.prototype.e.call(this,\"div\",{className:\"vjs-text-track-display\"})};\nu.Y=u.N.extend({i:function(a,c){var d=this.ca=c.track;c.label=d.label();c.selected=d.ub();u.N.call(this,a,c);this.b.d(d.J()+\"trackchange\",u.bind(this,this.update))}});u.Y.prototype.p=function(){u.N.prototype.p.call(this);W(this.b,this.ca.Q,this.ca.J())};u.Y.prototype.update=function(){this.selected(2==this.ca.mode())};u.bb=u.Y.extend({i:function(a,c){c.track={J:function(){return c.kind},K:a,label:function(){return c.kind+\" off\"},ub:s(l),mode:s(l)};u.Y.call(this,a,c);this.selected(f)}});\nu.bb.prototype.p=function(){u.Y.prototype.p.call(this);W(this.b,this.ca.Q,this.ca.J())};u.bb.prototype.update=function(){for(var a=V(this.b),c=0,d=a.length,e,g=f;c<d;c++)e=a[c],e.J()==this.ca.J()&&2==e.mode()&&(g=l);this.selected(g)};u.S=u.R.extend({i:function(a,c){u.R.call(this,a,c);1>=this.I.length&&this.C()}});u.S.prototype.ta=function(){var a=[],c;a.push(new u.bb(this.b,{kind:this.A}));for(var d=0;d<V(this.b).length;d++)c=V(this.b)[d],c.J()===this.A&&a.push(new u.Y(this.b,{track:c}));return a};\nu.Da=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute(\"aria-label\",\"Captions Menu\")}});u.Da.prototype.A=\"captions\";u.Da.prototype.qa=\"Captions\";u.Da.prototype.className=\"vjs-captions-button\";u.Ha=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute(\"aria-label\",\"Subtitles Menu\")}});u.Ha.prototype.A=\"subtitles\";u.Ha.prototype.qa=\"Subtitles\";u.Ha.prototype.className=\"vjs-subtitles-button\";\nu.Ea=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute(\"aria-label\",\"Chapters Menu\")}});t=u.Ea.prototype;t.A=\"chapters\";t.qa=\"Chapters\";t.className=\"vjs-chapters-button\";t.ta=function(){for(var a=[],c,d=0;d<V(this.b).length;d++)c=V(this.b)[d],c.J()===this.A&&a.push(new u.Y(this.b,{track:c}));return a};\nt.Ka=function(){for(var a=V(this.b),c=0,d=a.length,e,g,j=this.I=[];c<d;c++)if(e=a[c],e.J()==this.A&&e.ub()){if(2>e.readyState()){this.Id=e;e.d(\"loaded\",u.bind(this,this.Ka));return}g=e;break}a=this.wa=new u.ma(this.b);a.a.appendChild(u.e(\"li\",{className:\"vjs-menu-title\",innerHTML:u.$(this.A),zd:-1}));if(g){e=g.fa;for(var k,c=0,d=e.length;c<d;c++)k=e[c],k=new u.Xa(this.b,{track:g,cue:k}),j.push(k),a.Z(k)}0<this.I.length&&this.show();return a};\nu.Xa=u.N.extend({i:function(a,c){var d=this.ca=c.track,e=this.cue=c.cue,g=a.currentTime();c.label=e.text;c.selected=e.startTime<=g&&g<e.va;u.N.call(this,a,c);d.d(\"cuechange\",u.bind(this,this.update))}});u.Xa.prototype.p=function(){u.N.prototype.p.call(this);this.b.currentTime(this.cue.startTime);this.update(this.cue.startTime)};u.Xa.prototype.update=function(){var a=this.cue,c=this.b.currentTime();this.selected(a.startTime<=c&&c<a.va)};\nu.k.B(u.Fa.prototype.g.children,{subtitlesButton:{},captionsButton:{},chaptersButton:{}});\nif(\"undefined\"!==typeof window.JSON&&\"function\"===window.JSON.parse)u.JSON=window.JSON;else{u.JSON={};var Z=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;u.JSON.parse=function(a,c){function d(a,e){var k,q,n=a[e];if(n&&\"object\"===typeof n)for(k in n)Object.prototype.hasOwnProperty.call(n,k)&&(q=d(n,k),q!==b?n[k]=q:delete n[k]);return c.call(a,e,n)}var e;a=String(a);Z.lastIndex=0;Z.test(a)&&(a=a.replace(Z,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)}));\nif(/^[\\],:{}\\s]*$/.test(a.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\")))return e=eval(\"(\"+a+\")\"),\"function\"===typeof c?d({\"\":e},\"\"):e;throw new SyntaxError(\"JSON.parse(): invalid or malformed JSON data\");}}\nu.fc=function(){var a,c,d=document.getElementsByTagName(\"video\");if(d&&0<d.length)for(var e=0,g=d.length;e<g;e++)if((c=d[e])&&c.getAttribute)c.player===b&&(a=c.getAttribute(\"data-setup\"),a!==h&&(a=u.JSON.parse(a||\"{}\"),v(c,a)));else{u.kb();break}else u.Ec||u.kb()};u.kb=function(){setTimeout(u.fc,1)};\"complete\"===document.readyState?u.Ec=f:u.U(window,\"load\",function(){u.Ec=f});u.kb();u.od=function(a,c){u.s.prototype[a]=c};var ga=this;ga.Ed=f;function $(a,c){var d=a.split(\".\"),e=ga;!(d[0]in e)&&e.execScript&&e.execScript(\"var \"+d[0]);for(var g;d.length&&(g=d.shift());)!d.length&&c!==b?e[g]=c:e=e[g]?e[g]:e[g]={}};$(\"videojs\",u);$(\"_V_\",u);$(\"videojs.options\",u.options);$(\"videojs.players\",u.xa);$(\"videojs.TOUCH_ENABLED\",u.ac);$(\"videojs.cache\",u.ra);$(\"videojs.Component\",u.c);u.c.prototype.player=u.c.prototype.K;u.c.prototype.dispose=u.c.prototype.D;u.c.prototype.createEl=u.c.prototype.e;u.c.prototype.el=u.c.prototype.w;u.c.prototype.addChild=u.c.prototype.Z;u.c.prototype.children=u.c.prototype.children;u.c.prototype.on=u.c.prototype.d;u.c.prototype.off=u.c.prototype.o;u.c.prototype.one=u.c.prototype.U;\nu.c.prototype.trigger=u.c.prototype.j;u.c.prototype.triggerReady=u.c.prototype.Ua;u.c.prototype.show=u.c.prototype.show;u.c.prototype.hide=u.c.prototype.C;u.c.prototype.width=u.c.prototype.width;u.c.prototype.height=u.c.prototype.height;u.c.prototype.dimensions=u.c.prototype.Xc;u.c.prototype.ready=u.c.prototype.L;u.c.prototype.addClass=u.c.prototype.n;u.c.prototype.removeClass=u.c.prototype.u;$(\"videojs.Player\",u.s);u.s.prototype.dispose=u.s.prototype.D;u.s.prototype.requestFullScreen=u.s.prototype.ya;\nu.s.prototype.cancelFullScreen=u.s.prototype.ob;u.s.prototype.bufferedPercent=u.s.prototype.Ja;u.s.prototype.usingNativeControls=u.s.prototype.Rb;u.s.prototype.reportUserActivity=u.s.prototype.Mb;u.s.prototype.userActive=u.s.prototype.ja;$(\"videojs.MediaLoader\",u.Pc);$(\"videojs.TextTrackDisplay\",u.bc);$(\"videojs.ControlBar\",u.Fa);$(\"videojs.Button\",u.q);$(\"videojs.PlayToggle\",u.Yb);$(\"videojs.FullscreenToggle\",u.Ga);$(\"videojs.BigPlayButton\",u.Wa);$(\"videojs.LoadingSpinner\",u.Wb);\n$(\"videojs.CurrentTimeDisplay\",u.Ya);$(\"videojs.DurationDisplay\",u.Za);$(\"videojs.TimeDivider\",u.cc);$(\"videojs.RemainingTimeDisplay\",u.fb);$(\"videojs.Slider\",u.O);$(\"videojs.ProgressControl\",u.eb);$(\"videojs.SeekBar\",u.Zb);$(\"videojs.LoadProgressBar\",u.ab);$(\"videojs.PlayProgressBar\",u.Xb);$(\"videojs.SeekHandle\",u.gb);$(\"videojs.VolumeControl\",u.ib);$(\"videojs.VolumeBar\",u.hb);$(\"videojs.VolumeLevel\",u.dc);$(\"videojs.VolumeMenuButton\",u.oa);$(\"videojs.VolumeHandle\",u.jb);$(\"videojs.MuteToggle\",u.da);\n$(\"videojs.PosterImage\",u.cb);$(\"videojs.Menu\",u.ma);$(\"videojs.MenuItem\",u.N);$(\"videojs.MenuButton\",u.R);u.R.prototype.createItems=u.R.prototype.ta;u.S.prototype.createItems=u.S.prototype.ta;u.Ea.prototype.createItems=u.Ea.prototype.ta;$(\"videojs.SubtitlesButton\",u.Ha);$(\"videojs.CaptionsButton\",u.Da);$(\"videojs.ChaptersButton\",u.Ea);$(\"videojs.MediaTechController\",u.r);u.r.prototype.features=u.r.prototype.m;u.r.prototype.m.volumeControl=u.r.prototype.m.Dc;u.r.prototype.m.fullscreenResize=u.r.prototype.m.Jd;\nu.r.prototype.m.progressEvents=u.r.prototype.m.Nd;u.r.prototype.m.timeupdateEvents=u.r.prototype.m.Sd;$(\"videojs.Html5\",u.l);u.l.Events=u.l.$a;u.l.isSupported=u.l.isSupported;u.l.canPlaySource=u.l.mb;u.l.prototype.setCurrentTime=u.l.prototype.sd;u.l.prototype.setVolume=u.l.prototype.xd;u.l.prototype.setMuted=u.l.prototype.vd;u.l.prototype.setPreload=u.l.prototype.wd;u.l.prototype.setAutoplay=u.l.prototype.rd;u.l.prototype.setLoop=u.l.prototype.ud;$(\"videojs.Flash\",u.f);u.f.isSupported=u.f.isSupported;\nu.f.canPlaySource=u.f.mb;u.f.onReady=u.f.onReady;$(\"videojs.TextTrack\",u.X);u.X.prototype.label=u.X.prototype.label;$(\"videojs.CaptionsTrack\",u.Ub);$(\"videojs.SubtitlesTrack\",u.$b);$(\"videojs.ChaptersTrack\",u.Vb);$(\"videojs.autoSetup\",u.fc);$(\"videojs.plugin\",u.od);$(\"videojs.createTimeRange\",u.tb);})();\n"
  },
  {
    "path": "static/common/user/uedit/third-party/webuploader/webuploader.css",
    "content": ".webuploader-container {\n\tposition: relative;\n}\n.webuploader-element-invisible {\n\tposition: absolute !important;\n\tclip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n    clip: rect(1px,1px,1px,1px);\n}\n.webuploader-pick {\n\tposition: relative;\n\tdisplay: inline-block;\n\tcursor: pointer;\n\tbackground: #00b7ee;\n\tpadding: 10px 15px;\n\tcolor: #fff;\n\ttext-align: center;\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.webuploader-pick-hover {\n\tbackground: #00a2d4;\n}\n\n.webuploader-pick-disable {\n\topacity: 0.6;\n\tpointer-events:none;\n}\n\n"
  },
  {
    "path": "static/common/user/uedit/third-party/webuploader/webuploader.custom.js",
    "content": "/*! WebUploader 0.1.2 */\n\n\n/**\n * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。\n *\n * AMD API 内部的简单不完全实现，请忽略。只有当WebUploader被合并成一个文件的时候才会引入。\n */\n(function( root, factory ) {\n    var modules = {},\n\n        // 内部require, 简单不完全实现。\n        // https://github.com/amdjs/amdjs-api/wiki/require\n        _require = function( deps, callback ) {\n            var args, len, i;\n\n            // 如果deps不是数组，则直接返回指定module\n            if ( typeof deps === 'string' ) {\n                return getModule( deps );\n            } else {\n                args = [];\n                for( len = deps.length, i = 0; i < len; i++ ) {\n                    args.push( getModule( deps[ i ] ) );\n                }\n\n                return callback.apply( null, args );\n            }\n        },\n\n        // 内部define，暂时不支持不指定id.\n        _define = function( id, deps, factory ) {\n            if ( arguments.length === 2 ) {\n                factory = deps;\n                deps = null;\n            }\n\n            _require( deps || [], function() {\n                setModule( id, factory, arguments );\n            });\n        },\n\n        // 设置module, 兼容CommonJs写法。\n        setModule = function( id, factory, args ) {\n            var module = {\n                    exports: factory\n                },\n                returned;\n\n            if ( typeof factory === 'function' ) {\n                args.length || (args = [ _require, module.exports, module ]);\n                returned = factory.apply( null, args );\n                returned !== undefined && (module.exports = returned);\n            }\n\n            modules[ id ] = module.exports;\n        },\n\n        // 根据id获取module\n        getModule = function( id ) {\n            var module = modules[ id ] || root[ id ];\n\n            if ( !module ) {\n                throw new Error( '`' + id + '` is undefined' );\n            }\n\n            return module;\n        },\n\n        // 将所有modules，将路径ids装换成对象。\n        exportsTo = function( obj ) {\n            var key, host, parts, part, last, ucFirst;\n\n            // make the first character upper case.\n            ucFirst = function( str ) {\n                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));\n            };\n\n            for ( key in modules ) {\n                host = obj;\n\n                if ( !modules.hasOwnProperty( key ) ) {\n                    continue;\n                }\n\n                parts = key.split('/');\n                last = ucFirst( parts.pop() );\n\n                while( (part = ucFirst( parts.shift() )) ) {\n                    host[ part ] = host[ part ] || {};\n                    host = host[ part ];\n                }\n\n                host[ last ] = modules[ key ];\n            }\n        },\n\n        exports = factory( root, _define, _require ),\n        origin;\n\n    // exports every module.\n    exportsTo( exports );\n\n    if ( typeof module === 'object' && typeof module.exports === 'object' ) {\n\n        // For CommonJS and CommonJS-like environments where a proper window is present,\n        module.exports = exports;\n    } else if ( typeof define === 'function' && define.amd ) {\n\n        // Allow using this built library as an AMD module\n        // in another project. That other project will only\n        // see this AMD call, not the internal modules in\n        // the closure below.\n        define([], exports );\n    } else {\n\n        // Browser globals case. Just assign the\n        // result to a property on the global.\n        origin = root.WebUploader;\n        root.WebUploader = exports;\n        root.WebUploader.noConflict = function() {\n            root.WebUploader = origin;\n        };\n    }\n})( this, function( window, define, require ) {\n\n\n    /**\n     * @fileOverview jQuery or Zepto\n     */\n    define('dollar-third',[],function() {\n        return window.jQuery || window.Zepto;\n    });\n    /**\n     * @fileOverview Dom 操作相关\n     */\n    define('dollar',[\n        'dollar-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 使用jQuery的Promise\n     */\n    define('promise-third',[\n        'dollar'\n    ], function( $ ) {\n        return {\n            Deferred: $.Deferred,\n            when: $.when,\n    \n            isPromise: function( anything ) {\n                return anything && typeof anything.then === 'function';\n            }\n        };\n    });\n    /**\n     * @fileOverview Promise/A+\n     */\n    define('promise',[\n        'promise-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 基础类方法。\n     */\n    \n    /**\n     * Web Uploader内部类的详细说明，以下提及的功能类，都可以在`WebUploader`这个变量中访问到。\n     *\n     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.\n     * 默认module id该文件的路径，而此路径将会转化成名字空间存放在WebUploader中。如：\n     *\n     * * module `base`：WebUploader.Base\n     * * module `file`: WebUploader.File\n     * * module `lib/dnd`: WebUploader.Lib.Dnd\n     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd\n     *\n     *\n     * 以下文档将可能省略`WebUploader`前缀。\n     * @module WebUploader\n     * @title WebUploader API文档\n     */\n    define('base',[\n        'dollar',\n        'promise'\n    ], function( $, promise ) {\n    \n        var noop = function() {},\n            call = Function.call;\n    \n        // http://jsperf.com/uncurrythis\n        // 反科里化\n        function uncurryThis( fn ) {\n            return function() {\n                return call.apply( fn, arguments );\n            };\n        }\n    \n        function bindFn( fn, context ) {\n            return function() {\n                return fn.apply( context, arguments );\n            };\n        }\n    \n        function createObject( proto ) {\n            var f;\n    \n            if ( Object.create ) {\n                return Object.create( proto );\n            } else {\n                f = function() {};\n                f.prototype = proto;\n                return new f();\n            }\n        }\n    \n    \n        /**\n         * 基础类，提供一些简单常用的方法。\n         * @class Base\n         */\n        return {\n    \n            /**\n             * @property {String} version 当前版本号。\n             */\n            version: '0.1.2',\n    \n            /**\n             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。\n             */\n            $: $,\n    \n            Deferred: promise.Deferred,\n    \n            isPromise: promise.isPromise,\n    \n            when: promise.when,\n    \n            /**\n             * @description  简单的浏览器检查结果。\n             *\n             * * `webkit`  webkit版本号，如果浏览器为非webkit内核，此属性为`undefined`。\n             * * `chrome`  chrome浏览器版本号，如果浏览器为chrome，此属性为`undefined`。\n             * * `ie`  ie浏览器版本号，如果浏览器为非ie，此属性为`undefined`。**暂不支持ie10+**\n             * * `firefox`  firefox浏览器版本号，如果浏览器为非firefox，此属性为`undefined`。\n             * * `safari`  safari浏览器版本号，如果浏览器为非safari，此属性为`undefined`。\n             * * `opera`  opera浏览器版本号，如果浏览器为非opera，此属性为`undefined`。\n             *\n             * @property {Object} [browser]\n             */\n            browser: (function( ua ) {\n                var ret = {},\n                    webkit = ua.match( /WebKit\\/([\\d.]+)/ ),\n                    chrome = ua.match( /Chrome\\/([\\d.]+)/ ) ||\n                        ua.match( /CriOS\\/([\\d.]+)/ ),\n    \n                    ie = ua.match( /MSIE\\s([\\d\\.]+)/ ) ||\n                        ua.match(/(?:trident)(?:.*rv:([\\w.]+))?/i),\n                    firefox = ua.match( /Firefox\\/([\\d.]+)/ ),\n                    safari = ua.match( /Safari\\/([\\d.]+)/ ),\n                    opera = ua.match( /OPR\\/([\\d.]+)/ );\n    \n                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));\n                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));\n                ie && (ret.ie = parseFloat( ie[ 1 ] ));\n                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));\n                safari && (ret.safari = parseFloat( safari[ 1 ] ));\n                opera && (ret.opera = parseFloat( opera[ 1 ] ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * @description  操作系统检查结果。\n             *\n             * * `android`  如果在android浏览器环境下，此值为对应的android版本号，否则为`undefined`。\n             * * `ios` 如果在ios浏览器环境下，此值为对应的ios版本号，否则为`undefined`。\n             * @property {Object} [os]\n             */\n            os: (function( ua ) {\n                var ret = {},\n    \n                    // osx = !!ua.match( /\\(Macintosh\\; Intel / ),\n                    android = ua.match( /(?:Android);?[\\s\\/]+([\\d.]+)?/ ),\n                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\\s([\\d_]+)/ );\n    \n                // osx && (ret.osx = true);\n                android && (ret.android = parseFloat( android[ 1 ] ));\n                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * 实现类与类之间的继承。\n             * @method inherits\n             * @grammar Base.inherits( super ) => child\n             * @grammar Base.inherits( super, protos ) => child\n             * @grammar Base.inherits( super, protos, statics ) => child\n             * @param  {Class} super 父类\n             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor，子类将是用此属性值。\n             * @param  {Function} [protos.constructor] 子类构造器，不指定的话将创建个临时的直接执行父类构造器的方法。\n             * @param  {Object} [statics] 静态属性或方法。\n             * @return {Class} 返回子类。\n             * @example\n             * function Person() {\n             *     console.log( 'Super' );\n             * }\n             * Person.prototype.hello = function() {\n             *     console.log( 'hello' );\n             * };\n             *\n             * var Manager = Base.inherits( Person, {\n             *     world: function() {\n             *         console.log( 'World' );\n             *     }\n             * });\n             *\n             * // 因为没有指定构造器，父类的构造器将会执行。\n             * var instance = new Manager();    // => Super\n             *\n             * // 继承子父类的方法\n             * instance.hello();    // => hello\n             * instance.world();    // => World\n             *\n             * // 子类的__super__属性指向父类\n             * console.log( Manager.__super__ === Person );    // => true\n             */\n            inherits: function( Super, protos, staticProtos ) {\n                var child;\n    \n                if ( typeof protos === 'function' ) {\n                    child = protos;\n                    protos = null;\n                } else if ( protos && protos.hasOwnProperty('constructor') ) {\n                    child = protos.constructor;\n                } else {\n                    child = function() {\n                        return Super.apply( this, arguments );\n                    };\n                }\n    \n                // 复制静态方法\n                $.extend( true, child, Super, staticProtos || {} );\n    \n                /* jshint camelcase: false */\n    \n                // 让子类的__super__属性指向父类。\n                child.__super__ = Super.prototype;\n    \n                // 构建原型，添加原型方法或属性。\n                // 暂时用Object.create实现。\n                child.prototype = createObject( Super.prototype );\n                protos && $.extend( true, child.prototype, protos );\n    \n                return child;\n            },\n    \n            /**\n             * 一个不做任何事情的方法。可以用来赋值给默认的callback.\n             * @method noop\n             */\n            noop: noop,\n    \n            /**\n             * 返回一个新的方法，此方法将已指定的`context`来执行。\n             * @grammar Base.bindFn( fn, context ) => Function\n             * @method bindFn\n             * @example\n             * var doSomething = function() {\n             *         console.log( this.name );\n             *     },\n             *     obj = {\n             *         name: 'Object Name'\n             *     },\n             *     aliasFn = Base.bind( doSomething, obj );\n             *\n             *  aliasFn();    // => Object Name\n             *\n             */\n            bindFn: bindFn,\n    \n            /**\n             * 引用Console.log如果存在的话，否则引用一个[空函数loop](#WebUploader:Base.log)。\n             * @grammar Base.log( args... ) => undefined\n             * @method log\n             */\n            log: (function() {\n                if ( window.console ) {\n                    return bindFn( console.log, console );\n                }\n                return noop;\n            })(),\n    \n            nextTick: (function() {\n    \n                return function( cb ) {\n                    setTimeout( cb, 1 );\n                };\n    \n                // @bug 当浏览器不在当前窗口时就停了。\n                // var next = window.requestAnimationFrame ||\n                //     window.webkitRequestAnimationFrame ||\n                //     window.mozRequestAnimationFrame ||\n                //     function( cb ) {\n                //         window.setTimeout( cb, 1000 / 60 );\n                //     };\n    \n                // // fix: Uncaught TypeError: Illegal invocation\n                // return bindFn( next, window );\n            })(),\n    \n            /**\n             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。\n             * 将用来将非数组对象转化成数组对象。\n             * @grammar Base.slice( target, start[, end] ) => Array\n             * @method slice\n             * @example\n             * function doSomthing() {\n             *     var args = Base.slice( arguments, 1 );\n             *     console.log( args );\n             * }\n             *\n             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array [\"arg2\", \"arg3\"]\n             */\n            slice: uncurryThis( [].slice ),\n    \n            /**\n             * 生成唯一的ID\n             * @method guid\n             * @grammar Base.guid() => String\n             * @grammar Base.guid( prefx ) => String\n             */\n            guid: (function() {\n                var counter = 0;\n    \n                return function( prefix ) {\n                    var guid = (+new Date()).toString( 32 ),\n                        i = 0;\n    \n                    for ( ; i < 5; i++ ) {\n                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );\n                    }\n    \n                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );\n                };\n            })(),\n    \n            /**\n             * 格式化文件大小, 输出成带单位的字符串\n             * @method formatSize\n             * @grammar Base.formatSize( size ) => String\n             * @grammar Base.formatSize( size, pointLength ) => String\n             * @grammar Base.formatSize( size, pointLength, units ) => String\n             * @param {Number} size 文件大小\n             * @param {Number} [pointLength=2] 精确到的小数点数。\n             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节，到千字节，一直往上指定。如果单位数组里面只指定了到了K(千字节)，同时文件大小大于M, 此方法的输出将还是显示成多少K.\n             * @example\n             * console.log( Base.formatSize( 100 ) );    // => 100B\n             * console.log( Base.formatSize( 1024 ) );    // => 1.00K\n             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K\n             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M\n             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G\n             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB\n             */\n            formatSize: function( size, pointLength, units ) {\n                var unit;\n    \n                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];\n    \n                while ( (unit = units.shift()) && size > 1024 ) {\n                    size = size / 1024;\n                }\n    \n                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +\n                        unit;\n            }\n        };\n    });\n    /**\n     * 事件处理类，可以独立使用，也可以扩展给对象使用。\n     * @fileOverview Mediator\n     */\n    define('mediator',[\n        'base'\n    ], function( Base ) {\n        var $ = Base.$,\n            slice = [].slice,\n            separator = /\\s+/,\n            protos;\n    \n        // 根据条件过滤出事件handlers.\n        function findHandlers( arr, name, callback, context ) {\n            return $.grep( arr, function( handler ) {\n                return handler &&\n                        (!name || handler.e === name) &&\n                        (!callback || handler.cb === callback ||\n                        handler.cb._cb === callback) &&\n                        (!context || handler.ctx === context);\n            });\n        }\n    \n        function eachEvent( events, callback, iterator ) {\n            // 不支持对象，只支持多个event用空格隔开\n            $.each( (events || '').split( separator ), function( _, key ) {\n                iterator( key, callback );\n            });\n        }\n    \n        function triggerHanders( events, args ) {\n            var stoped = false,\n                i = -1,\n                len = events.length,\n                handler;\n    \n            while ( ++i < len ) {\n                handler = events[ i ];\n    \n                if ( handler.cb.apply( handler.ctx2, args ) === false ) {\n                    stoped = true;\n                    break;\n                }\n            }\n    \n            return !stoped;\n        }\n    \n        protos = {\n    \n            /**\n             * 绑定事件。\n             *\n             * `callback`方法在执行时，arguments将会来源于trigger的时候携带的参数。如\n             * ```javascript\n             * var obj = {};\n             *\n             * // 使得obj有事件行为\n             * Mediator.installTo( obj );\n             *\n             * obj.on( 'testa', function( arg1, arg2 ) {\n             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'\n             * });\n             *\n             * obj.trigger( 'testa', 'arg1', 'arg2' );\n             * ```\n             *\n             * 如果`callback`中，某一个方法`return false`了，则后续的其他`callback`都不会被执行到。\n             * 切会影响到`trigger`方法的返回值，为`false`。\n             *\n             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处，\n             * 就是第一个参数为`type`，记录当前是什么事件在触发。此类`callback`的优先级比脚低，会再正常`callback`执行完后触发。\n             * ```javascript\n             * obj.on( 'all', function( type, arg1, arg2 ) {\n             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'\n             * });\n             * ```\n             *\n             * @method on\n             * @grammar on( name, callback[, context] ) => self\n             * @param  {String}   name     事件名，支持多个事件用空格隔开\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             * @class Mediator\n             */\n            on: function( name, callback, context ) {\n                var me = this,\n                    set;\n    \n                if ( !callback ) {\n                    return this;\n                }\n    \n                set = this._events || (this._events = []);\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var handler = { e: name };\n    \n                    handler.cb = callback;\n                    handler.ctx = context;\n                    handler.ctx2 = context || me;\n                    handler.id = set.length;\n    \n                    set.push( handler );\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 绑定事件，且当handler执行完后，自动解除绑定。\n             * @method once\n             * @grammar once( name, callback[, context] ) => self\n             * @param  {String}   name     事件名\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            once: function( name, callback, context ) {\n                var me = this;\n    \n                if ( !callback ) {\n                    return me;\n                }\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var once = function() {\n                            me.off( name, once );\n                            return callback.apply( context || me, arguments );\n                        };\n    \n                    once._cb = callback;\n                    me.on( name, once, context );\n                });\n    \n                return me;\n            },\n    \n            /**\n             * 解除事件绑定\n             * @method off\n             * @grammar off( [name[, callback[, context] ] ] ) => self\n             * @param  {String}   [name]     事件名\n             * @param  {Function} [callback] 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            off: function( name, cb, ctx ) {\n                var events = this._events;\n    \n                if ( !events ) {\n                    return this;\n                }\n    \n                if ( !name && !cb && !ctx ) {\n                    this._events = [];\n                    return this;\n                }\n    \n                eachEvent( name, cb, function( name, cb ) {\n                    $.each( findHandlers( events, name, cb, ctx ), function() {\n                        delete events[ this.id ];\n                    });\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 触发事件\n             * @method trigger\n             * @grammar trigger( name[, args...] ) => self\n             * @param  {String}   type     事件名\n             * @param  {*} [...] 任意参数\n             * @return {Boolean} 如果handler中return false了，则返回false, 否则返回true\n             */\n            trigger: function( type ) {\n                var args, events, allEvents;\n    \n                if ( !this._events || !type ) {\n                    return this;\n                }\n    \n                args = slice.call( arguments, 1 );\n                events = findHandlers( this._events, type );\n                allEvents = findHandlers( this._events, 'all' );\n    \n                return triggerHanders( events, args ) &&\n                        triggerHanders( allEvents, arguments );\n            }\n        };\n    \n        /**\n         * 中介者，它本身是个单例，但可以通过[installTo](#WebUploader:Mediator:installTo)方法，使任何对象具备事件行为。\n         * 主要目的是负责模块与模块之间的合作，降低耦合度。\n         *\n         * @class Mediator\n         */\n        return $.extend({\n    \n            /**\n             * 可以通过这个接口，使任何对象具备事件功能。\n             * @method installTo\n             * @param  {Object} obj 需要具备事件行为的对象。\n             * @return {Object} 返回obj.\n             */\n            installTo: function( obj ) {\n                return $.extend( obj, protos );\n            }\n    \n        }, protos );\n    });\n    /**\n     * @fileOverview Uploader上传类\n     */\n    define('uploader',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$;\n    \n        /**\n         * 上传入口类。\n         * @class Uploader\n         * @constructor\n         * @grammar new Uploader( opts ) => Uploader\n         * @example\n         * var uploader = WebUploader.Uploader({\n         *     swf: 'path_of_swf/Uploader.swf',\n         *\n         *     // 开起分片上传。\n         *     chunked: true\n         * });\n         */\n        function Uploader( opts ) {\n            this.options = $.extend( true, {}, Uploader.options, opts );\n            this._init( this.options );\n        }\n    \n        // default Options\n        // widgets中有相应扩展\n        Uploader.options = {};\n        Mediator.installTo( Uploader.prototype );\n    \n        // 批量添加纯命令式方法。\n        $.each({\n            upload: 'start-upload',\n            stop: 'stop-upload',\n            getFile: 'get-file',\n            getFiles: 'get-files',\n            addFile: 'add-file',\n            addFiles: 'add-file',\n            sort: 'sort-files',\n            removeFile: 'remove-file',\n            skipFile: 'skip-file',\n            retry: 'retry',\n            isInProgress: 'is-in-progress',\n            makeThumb: 'make-thumb',\n            getDimension: 'get-dimension',\n            addButton: 'add-btn',\n            getRuntimeType: 'get-runtime-type',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable',\n            reset: 'reset'\n        }, function( fn, command ) {\n            Uploader.prototype[ fn ] = function() {\n                return this.request( command, arguments );\n            };\n        });\n    \n        $.extend( Uploader.prototype, {\n            state: 'pending',\n    \n            _init: function( opts ) {\n                var me = this;\n    \n                me.request( 'init', opts, function() {\n                    me.state = 'ready';\n                    me.trigger('ready');\n                });\n            },\n    \n            /**\n             * 获取或者设置Uploader配置项。\n             * @method option\n             * @grammar option( key ) => *\n             * @grammar option( key, val ) => self\n             * @example\n             *\n             * // 初始状态图片上传前不会压缩\n             * var uploader = new WebUploader.Uploader({\n             *     resize: null;\n             * });\n             *\n             * // 修改后图片上传前，尝试将图片压缩到1600 * 1600\n             * uploader.options( 'resize', {\n             *     width: 1600,\n             *     height: 1600\n             * });\n             */\n            option: function( key, val ) {\n                var opts = this.options;\n    \n                // setter\n                if ( arguments.length > 1 ) {\n    \n                    if ( $.isPlainObject( val ) &&\n                            $.isPlainObject( opts[ key ] ) ) {\n                        $.extend( opts[ key ], val );\n                    } else {\n                        opts[ key ] = val;\n                    }\n    \n                } else {    // getter\n                    return key ? opts[ key ] : opts;\n                }\n            },\n    \n            /**\n             * 获取文件统计信息。返回一个包含一下信息的对象。\n             * * `successNum` 上传成功的文件数\n             * * `uploadFailNum` 上传失败的文件数\n             * * `cancelNum` 被删除的文件数\n             * * `invalidNum` 无效的文件数\n             * * `queueNum` 还在队列中的文件数\n             * @method getStats\n             * @grammar getStats() => Object\n             */\n            getStats: function() {\n                // return this._mgr.getStats.apply( this._mgr, arguments );\n                var stats = this.request('get-stats');\n    \n                return {\n                    successNum: stats.numOfSuccess,\n    \n                    // who care?\n                    // queueFailNum: 0,\n                    cancelNum: stats.numOfCancel,\n                    invalidNum: stats.numOfInvalid,\n                    uploadFailNum: stats.numOfUploadFailed,\n                    queueNum: stats.numOfQueue\n                };\n            },\n    \n            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器\n            trigger: function( type/*, args...*/ ) {\n                var args = [].slice.call( arguments, 1 ),\n                    opts = this.options,\n                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +\n                        type.substring( 1 );\n    \n                if (\n                        // 调用通过on方法注册的handler.\n                        Mediator.trigger.apply( this, arguments ) === false ||\n    \n                        // 调用opts.onEvent\n                        $.isFunction( opts[ name ] ) &&\n                        opts[ name ].apply( this, args ) === false ||\n    \n                        // 调用this.onEvent\n                        $.isFunction( this[ name ] ) &&\n                        this[ name ].apply( this, args ) === false ||\n    \n                        // 广播所有uploader的事件。\n                        Mediator.trigger.apply( Mediator,\n                        [ this, type ].concat( args ) ) === false ) {\n    \n                    return false;\n                }\n    \n                return true;\n            },\n    \n            // widgets/widget.js将补充此方法的详细文档。\n            request: Base.noop\n        });\n    \n        /**\n         * 创建Uploader实例，等同于new Uploader( opts );\n         * @method create\n         * @class Base\n         * @static\n         * @grammar Base.create( opts ) => Uploader\n         */\n        Base.create = Uploader.create = function( opts ) {\n            return new Uploader( opts );\n        };\n    \n        // 暴露Uploader，可以通过它来扩展业务逻辑。\n        Base.Uploader = Uploader;\n    \n        return Uploader;\n    });\n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/runtime',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            factories = {},\n    \n            // 获取对象的第一个key\n            getFirstKey = function( obj ) {\n                for ( var key in obj ) {\n                    if ( obj.hasOwnProperty( key ) ) {\n                        return key;\n                    }\n                }\n                return null;\n            };\n    \n        // 接口类。\n        function Runtime( options ) {\n            this.options = $.extend({\n                container: document.body\n            }, options );\n            this.uid = Base.guid('rt_');\n        }\n    \n        $.extend( Runtime.prototype, {\n    \n            getContainer: function() {\n                var opts = this.options,\n                    parent, container;\n    \n                if ( this._container ) {\n                    return this._container;\n                }\n    \n                parent = $( opts.container || document.body );\n                container = $( document.createElement('div') );\n    \n                container.attr( 'id', 'rt_' + this.uid );\n                container.css({\n                    position: 'absolute',\n                    top: '0px',\n                    left: '0px',\n                    width: '1px',\n                    height: '1px',\n                    overflow: 'hidden'\n                });\n    \n                parent.append( container );\n                parent.addClass('webuploader-container');\n                this._container = container;\n                return container;\n            },\n    \n            init: Base.noop,\n            exec: Base.noop,\n    \n            destroy: function() {\n                if ( this._container ) {\n                    this._container.parentNode.removeChild( this.__container );\n                }\n    \n                this.off();\n            }\n        });\n    \n        Runtime.orders = 'html5,flash';\n    \n    \n        /**\n         * 添加Runtime实现。\n         * @param {String} type    类型\n         * @param {Runtime} factory 具体Runtime实现。\n         */\n        Runtime.addRuntime = function( type, factory ) {\n            factories[ type ] = factory;\n        };\n    \n        Runtime.hasRuntime = function( type ) {\n            return !!(type ? factories[ type ] : getFirstKey( factories ));\n        };\n    \n        Runtime.create = function( opts, orders ) {\n            var type, runtime;\n    \n            orders = orders || Runtime.orders;\n            $.each( orders.split( /\\s*,\\s*/g ), function() {\n                if ( factories[ this ] ) {\n                    type = this;\n                    return false;\n                }\n            });\n    \n            type = type || getFirstKey( factories );\n    \n            if ( !type ) {\n                throw new Error('Runtime Error');\n            }\n    \n            runtime = new factories[ type ]( opts );\n            return runtime;\n        };\n    \n        Mediator.installTo( Runtime.prototype );\n        return Runtime;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/client',[\n        'base',\n        'mediator',\n        'runtime/runtime'\n    ], function( Base, Mediator, Runtime ) {\n    \n        var cache;\n    \n        cache = (function() {\n            var obj = {};\n    \n            return {\n                add: function( runtime ) {\n                    obj[ runtime.uid ] = runtime;\n                },\n    \n                get: function( ruid, standalone ) {\n                    var i;\n    \n                    if ( ruid ) {\n                        return obj[ ruid ];\n                    }\n    \n                    for ( i in obj ) {\n                        // 有些类型不能重用，比如filepicker.\n                        if ( standalone && obj[ i ].__standalone ) {\n                            continue;\n                        }\n    \n                        return obj[ i ];\n                    }\n    \n                    return null;\n                },\n    \n                remove: function( runtime ) {\n                    delete obj[ runtime.uid ];\n                }\n            };\n        })();\n    \n        function RuntimeClient( component, standalone ) {\n            var deferred = Base.Deferred(),\n                runtime;\n    \n            this.uid = Base.guid('client_');\n    \n            // 允许runtime没有初始化之前，注册一些方法在初始化后执行。\n            this.runtimeReady = function( cb ) {\n                return deferred.done( cb );\n            };\n    \n            this.connectRuntime = function( opts, cb ) {\n    \n                // already connected.\n                if ( runtime ) {\n                    throw new Error('already connected!');\n                }\n    \n                deferred.done( cb );\n    \n                if ( typeof opts === 'string' && cache.get( opts ) ) {\n                    runtime = cache.get( opts );\n                }\n    \n                // 像filePicker只能独立存在，不能公用。\n                runtime = runtime || cache.get( null, standalone );\n    \n                // 需要创建\n                if ( !runtime ) {\n                    runtime = Runtime.create( opts, opts.runtimeOrder );\n                    runtime.__promise = deferred.promise();\n                    runtime.once( 'ready', deferred.resolve );\n                    runtime.init();\n                    cache.add( runtime );\n                    runtime.__client = 1;\n                } else {\n                    // 来自cache\n                    Base.$.extend( runtime.options, opts );\n                    runtime.__promise.then( deferred.resolve );\n                    runtime.__client++;\n                }\n    \n                standalone && (runtime.__standalone = standalone);\n                return runtime;\n            };\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.disconnectRuntime = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                runtime.__client--;\n    \n                if ( runtime.__client <= 0 ) {\n                    cache.remove( runtime );\n                    delete runtime.__promise;\n                    runtime.destroy();\n                }\n    \n                runtime = null;\n            };\n    \n            this.exec = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                var args = Base.slice( arguments );\n                component && args.unshift( component );\n    \n                return runtime.exec.apply( this, args );\n            };\n    \n            this.getRuid = function() {\n                return runtime && runtime.uid;\n            };\n    \n            this.destroy = (function( destroy ) {\n                return function() {\n                    destroy && destroy.apply( this, arguments );\n                    this.trigger('destroy');\n                    this.off();\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                };\n            })( this.destroy );\n        }\n    \n        Mediator.installTo( RuntimeClient.prototype );\n        return RuntimeClient;\n    });\n    /**\n     * @fileOverview Blob\n     */\n    define('lib/blob',[\n        'base',\n        'runtime/client'\n    ], function( Base, RuntimeClient ) {\n    \n        function Blob( ruid, source ) {\n            var me = this;\n    \n            me.source = source;\n            me.ruid = ruid;\n    \n            RuntimeClient.call( me, 'Blob' );\n    \n            this.uid = source.uid || this.uid;\n            this.type = source.type || '';\n            this.size = source.size || 0;\n    \n            if ( ruid ) {\n                me.connectRuntime( ruid );\n            }\n        }\n    \n        Base.inherits( RuntimeClient, {\n            constructor: Blob,\n    \n            slice: function( start, end ) {\n                return this.exec( 'slice', start, end );\n            },\n    \n            getSource: function() {\n                return this.source;\n            }\n        });\n    \n        return Blob;\n    });\n    /**\n     * 为了统一化Flash的File和HTML5的File而存在。\n     * 以至于要调用Flash里面的File，也可以像调用HTML5版本的File一下。\n     * @fileOverview File\n     */\n    define('lib/file',[\n        'base',\n        'lib/blob'\n    ], function( Base, Blob ) {\n    \n        var uid = 1,\n            rExt = /\\.([^.]+)$/;\n    \n        function File( ruid, file ) {\n            var ext;\n    \n            Blob.apply( this, arguments );\n            this.name = file.name || ('untitled' + uid++);\n            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';\n    \n            // todo 支持其他类型文件的转换。\n    \n            // 如果有mimetype, 但是文件名里面没有找出后缀规律\n            if ( !ext && this.type ) {\n                ext = /\\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?\n                        RegExp.$1.toLowerCase() : '';\n                this.name += '.' + ext;\n            }\n    \n            // 如果没有指定mimetype, 但是知道文件后缀。\n            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {\n                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);\n            }\n    \n            this.ext = ext;\n            this.lastModifiedDate = file.lastModifiedDate ||\n                    (new Date()).toLocaleString();\n        }\n    \n        return Base.inherits( Blob, File );\n    });\n    \n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/filepicker',[\n        'base',\n        'runtime/client',\n        'lib/file'\n    ], function( Base, RuntimeClent, File ) {\n    \n        var $ = Base.$;\n    \n        function FilePicker( opts ) {\n            opts = this.options = $.extend({}, FilePicker.options, opts );\n    \n            opts.container = $( opts.id );\n    \n            if ( !opts.container.length ) {\n                throw new Error('按钮指定错误');\n            }\n    \n            opts.innerHTML = opts.innerHTML || opts.label ||\n                    opts.container.html() || '';\n    \n            opts.button = $( opts.button || document.createElement('div') );\n            opts.button.html( opts.innerHTML );\n            opts.container.html( opts.button );\n    \n            RuntimeClent.call( this, 'FilePicker', true );\n        }\n    \n        FilePicker.options = {\n            button: null,\n            container: null,\n            label: null,\n            innerHTML: null,\n            multiple: true,\n            accept: null,\n            name: 'file'\n        };\n    \n        Base.inherits( RuntimeClent, {\n            constructor: FilePicker,\n    \n            init: function() {\n                var me = this,\n                    opts = me.options,\n                    button = opts.button;\n    \n                button.addClass('webuploader-pick');\n    \n                me.on( 'all', function( type ) {\n                    var files;\n    \n                    switch ( type ) {\n                        case 'mouseenter':\n                            button.addClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'mouseleave':\n                            button.removeClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'change':\n                            files = me.exec('getFiles');\n                            me.trigger( 'select', $.map( files, function( file ) {\n                                file = new File( me.getRuid(), file );\n    \n                                // 记录来源。\n                                file._refer = opts.container;\n                                return file;\n                            }), opts.container );\n                            break;\n                    }\n                });\n    \n                me.connectRuntime( opts, function() {\n                    me.refresh();\n                    me.exec( 'init', opts );\n                    me.trigger('ready');\n                });\n    \n                $( window ).on( 'resize', function() {\n                    me.refresh();\n                });\n            },\n    \n            refresh: function() {\n                var shimContainer = this.getRuntime().getContainer(),\n                    button = this.options.button,\n                    width = button.outerWidth ?\n                            button.outerWidth() : button.width(),\n    \n                    height = button.outerHeight ?\n                            button.outerHeight() : button.height(),\n    \n                    pos = button.offset();\n    \n                width && height && shimContainer.css({\n                    bottom: 'auto',\n                    right: 'auto',\n                    width: width + 'px',\n                    height: height + 'px'\n                }).offset( pos );\n            },\n    \n            enable: function() {\n                var btn = this.options.button;\n    \n                btn.removeClass('webuploader-pick-disable');\n                this.refresh();\n            },\n    \n            disable: function() {\n                var btn = this.options.button;\n    \n                this.getRuntime().getContainer().css({\n                    top: '-99999px'\n                });\n    \n                btn.addClass('webuploader-pick-disable');\n            },\n    \n            destroy: function() {\n                if ( this.runtime ) {\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                }\n            }\n        });\n    \n        return FilePicker;\n    });\n    \n    /**\n     * @fileOverview 组件基类。\n     */\n    define('widgets/widget',[\n        'base',\n        'uploader'\n    ], function( Base, Uploader ) {\n    \n        var $ = Base.$,\n            _init = Uploader.prototype._init,\n            IGNORE = {},\n            widgetClass = [];\n    \n        function isArrayLike( obj ) {\n            if ( !obj ) {\n                return false;\n            }\n    \n            var length = obj.length,\n                type = $.type( obj );\n    \n            if ( obj.nodeType === 1 && length ) {\n                return true;\n            }\n    \n            return type === 'array' || type !== 'function' && type !== 'string' &&\n                    (length === 0 || typeof length === 'number' && length > 0 &&\n                    (length - 1) in obj);\n        }\n    \n        function Widget( uploader ) {\n            this.owner = uploader;\n            this.options = uploader.options;\n        }\n    \n        $.extend( Widget.prototype, {\n    \n            init: Base.noop,\n    \n            // 类Backbone的事件监听声明，监听uploader实例上的事件\n            // widget直接无法监听事件，事件只能通过uploader来传递\n            invoke: function( apiName, args ) {\n    \n                /*\n                    {\n                        'make-thumb': 'makeThumb'\n                    }\n                 */\n                var map = this.responseMap;\n    \n                // 如果无API响应声明则忽略\n                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||\n                        !$.isFunction( this[ map[ apiName ] ] ) ) {\n    \n                    return IGNORE;\n                }\n    \n                return this[ map[ apiName ] ].apply( this, args );\n    \n            },\n    \n            /**\n             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。\n             * @method request\n             * @grammar request( command, args ) => * | Promise\n             * @grammar request( command, args, callback ) => Promise\n             * @for  Uploader\n             */\n            request: function() {\n                return this.owner.request.apply( this.owner, arguments );\n            }\n        });\n    \n        // 扩展Uploader.\n        $.extend( Uploader.prototype, {\n    \n            // 覆写_init用来初始化widgets\n            _init: function() {\n                var me = this,\n                    widgets = me._widgets = [];\n    \n                $.each( widgetClass, function( _, klass ) {\n                    widgets.push( new klass( me ) );\n                });\n    \n                return _init.apply( me, arguments );\n            },\n    \n            request: function( apiName, args, callback ) {\n                var i = 0,\n                    widgets = this._widgets,\n                    len = widgets.length,\n                    rlts = [],\n                    dfds = [],\n                    widget, rlt, promise, key;\n    \n                args = isArrayLike( args ) ? args : [ args ];\n    \n                for ( ; i < len; i++ ) {\n                    widget = widgets[ i ];\n                    rlt = widget.invoke( apiName, args );\n    \n                    if ( rlt !== IGNORE ) {\n    \n                        // Deferred对象\n                        if ( Base.isPromise( rlt ) ) {\n                            dfds.push( rlt );\n                        } else {\n                            rlts.push( rlt );\n                        }\n                    }\n                }\n    \n                // 如果有callback，则用异步方式。\n                if ( callback || dfds.length ) {\n                    promise = Base.when.apply( Base, dfds );\n                    key = promise.pipe ? 'pipe' : 'then';\n    \n                    // 很重要不能删除。删除了会死循环。\n                    // 保证执行顺序。让callback总是在下一个tick中执行。\n                    return promise[ key ](function() {\n                                var deferred = Base.Deferred(),\n                                    args = arguments;\n    \n                                setTimeout(function() {\n                                    deferred.resolve.apply( deferred, args );\n                                }, 1 );\n    \n                                return deferred.promise();\n                            })[ key ]( callback || Base.noop );\n                } else {\n                    return rlts[ 0 ];\n                }\n            }\n        });\n    \n        /**\n         * 添加组件\n         * @param  {object} widgetProto 组件原型，构造函数通过constructor属性定义\n         * @param  {object} responseMap API名称与函数实现的映射\n         * @example\n         *     Uploader.register( {\n         *         init: function( options ) {},\n         *         makeThumb: function() {}\n         *     }, {\n         *         'make-thumb': 'makeThumb'\n         *     } );\n         */\n        Uploader.register = Widget.register = function( responseMap, widgetProto ) {\n            var map = { init: 'init' },\n                klass;\n    \n            if ( arguments.length === 1 ) {\n                widgetProto = responseMap;\n                widgetProto.responseMap = map;\n            } else {\n                widgetProto.responseMap = $.extend( map, responseMap );\n            }\n    \n            klass = Base.inherits( Widget, widgetProto );\n            widgetClass.push( klass );\n    \n            return klass;\n        };\n    \n        return Widget;\n    });\n    /**\n     * @fileOverview 文件选择相关\n     */\n    define('widgets/filepicker',[\n        'base',\n        'uploader',\n        'lib/filepicker',\n        'widgets/widget'\n    ], function( Base, Uploader, FilePicker ) {\n        var $ = Base.$;\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Selector | Object} [pick=undefined]\n             * @namespace options\n             * @for Uploader\n             * @description 指定选择文件的按钮容器，不指定则不创建按钮。\n             *\n             * * `id` {Seletor} 指定选择文件的按钮容器，不指定则不创建按钮。\n             * * `label` {String} 请采用 `innerHTML` 代替\n             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。\n             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。\n             */\n            pick: null,\n    \n            /**\n             * @property {Arroy} [accept=null]\n             * @namespace options\n             * @for Uploader\n             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表，所以这里需要分开指定。\n             *\n             * * `title` {String} 文字描述\n             * * `extensions` {String} 允许的文件后缀，不带点，多个用逗号分割。\n             * * `mimeTypes` {String} 多个用逗号分割。\n             *\n             * 如：\n             *\n             * ```\n             * {\n             *     title: 'Images',\n             *     extensions: 'gif,jpg,jpeg,bmp,png',\n             *     mimeTypes: 'image/*'\n             * }\n             * ```\n             */\n            accept: null/*{\n                title: 'Images',\n                extensions: 'gif,jpg,jpeg,bmp,png',\n                mimeTypes: 'image/*'\n            }*/\n        });\n    \n        return Uploader.register({\n            'add-btn': 'addButton',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable'\n        }, {\n    \n            init: function( opts ) {\n                this.pickers = [];\n                return opts.pick && this.addButton( opts.pick );\n            },\n    \n            refresh: function() {\n                $.each( this.pickers, function() {\n                    this.refresh();\n                });\n            },\n    \n            /**\n             * @method addButton\n             * @for Uploader\n             * @grammar addButton( pick ) => Promise\n             * @description\n             * 添加文件选择按钮，如果一个按钮不够，需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。\n             * @example\n             * uploader.addButton({\n             *     id: '#btnContainer',\n             *     innerHTML: '选择文件'\n             * });\n             */\n            addButton: function( pick ) {\n                var me = this,\n                    opts = me.options,\n                    accept = opts.accept,\n                    options, picker, deferred;\n    \n                if ( !pick ) {\n                    return;\n                }\n    \n                deferred = Base.Deferred();\n                $.isPlainObject( pick ) || (pick = {\n                    id: pick\n                });\n    \n                options = $.extend({}, pick, {\n                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,\n                    swf: opts.swf,\n                    runtimeOrder: opts.runtimeOrder\n                });\n    \n                picker = new FilePicker( options );\n    \n                picker.once( 'ready', deferred.resolve );\n                picker.on( 'select', function( files ) {\n                    me.owner.request( 'add-file', [ files ]);\n                });\n                picker.init();\n    \n                this.pickers.push( picker );\n    \n                return deferred.promise();\n            },\n    \n            disable: function() {\n                $.each( this.pickers, function() {\n                    this.disable();\n                });\n            },\n    \n            enable: function() {\n                $.each( this.pickers, function() {\n                    this.enable();\n                });\n            }\n        });\n    });\n    /**\n     * @fileOverview Image\n     */\n    define('lib/image',[\n        'base',\n        'runtime/client',\n        'lib/blob'\n    ], function( Base, RuntimeClient, Blob ) {\n        var $ = Base.$;\n    \n        // 构造器。\n        function Image( opts ) {\n            this.options = $.extend({}, Image.options, opts );\n            RuntimeClient.call( this, 'Image' );\n    \n            this.on( 'load', function() {\n                this._info = this.exec('info');\n                this._meta = this.exec('meta');\n            });\n        }\n    \n        // 默认选项。\n        Image.options = {\n    \n            // 默认的图片处理质量\n            quality: 90,\n    \n            // 是否裁剪\n            crop: false,\n    \n            // 是否保留头部信息\n            preserveHeaders: true,\n    \n            // 是否允许放大。\n            allowMagnify: true\n        };\n    \n        // 继承RuntimeClient.\n        Base.inherits( RuntimeClient, {\n            constructor: Image,\n    \n            info: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._info = val;\n                    return this;\n                }\n    \n                // getter\n                return this._info;\n            },\n    \n            meta: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._meta = val;\n                    return this;\n                }\n    \n                // getter\n                return this._meta;\n            },\n    \n            loadFromBlob: function( blob ) {\n                var me = this,\n                    ruid = blob.getRuid();\n    \n                this.connectRuntime( ruid, function() {\n                    me.exec( 'init', me.options );\n                    me.exec( 'loadFromBlob', blob );\n                });\n            },\n    \n            resize: function() {\n                var args = Base.slice( arguments );\n                return this.exec.apply( this, [ 'resize' ].concat( args ) );\n            },\n    \n            getAsDataUrl: function( type ) {\n                return this.exec( 'getAsDataUrl', type );\n            },\n    \n            getAsBlob: function( type ) {\n                var blob = this.exec( 'getAsBlob', type );\n    \n                return new Blob( this.getRuid(), blob );\n            }\n        });\n    \n        return Image;\n    });\n    /**\n     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片\n     */\n    define('widgets/image',[\n        'base',\n        'uploader',\n        'lib/image',\n        'widgets/widget'\n    ], function( Base, Uploader, Image ) {\n    \n        var $ = Base.$,\n            throttle;\n    \n        // 根据要处理的文件大小来节流，一次不能处理太多，会卡。\n        throttle = (function( max ) {\n            var occupied = 0,\n                waiting = [],\n                tick = function() {\n                    var item;\n    \n                    while ( waiting.length && occupied < max ) {\n                        item = waiting.shift();\n                        occupied += item[ 0 ];\n                        item[ 1 ]();\n                    }\n                };\n    \n            return function( emiter, size, cb ) {\n                waiting.push([ size, cb ]);\n                emiter.once( 'destroy', function() {\n                    occupied -= size;\n                    setTimeout( tick, 1 );\n                });\n                setTimeout( tick, 1 );\n            };\n        })( 5 * 1024 * 1024 );\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Object} [thumb]\n             * @namespace options\n             * @for Uploader\n             * @description 配置生成缩略图的选项。\n             *\n             * 默认为：\n             *\n             * ```javascript\n             * {\n             *     width: 110,\n             *     height: 110,\n             *\n             *     // 图片质量，只有type为`image/jpeg`的时候才有效。\n             *     quality: 70,\n             *\n             *     // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n             *     allowMagnify: true,\n             *\n             *     // 是否允许裁剪。\n             *     crop: true,\n             *\n             *     // 是否保留头部meta信息。\n             *     preserveHeaders: false,\n             *\n             *     // 为空的话则保留原有图片格式。\n             *     // 否则强制转换成指定的类型。\n             *     type: 'image/jpeg'\n             * }\n             * ```\n             */\n            thumb: {\n                width: 110,\n                height: 110,\n                quality: 70,\n                allowMagnify: true,\n                crop: true,\n                preserveHeaders: false,\n    \n                // 为空的话则保留原有图片格式。\n                // 否则强制转换成指定的类型。\n                // IE 8下面 base64 大小不能超过 32K 否则预览失败，而非 jpeg 编码的图片很可\n                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg\n                type: 'image/jpeg'\n            },\n    \n            /**\n             * @property {Object} [compress]\n             * @namespace options\n             * @for Uploader\n             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。\n             *\n             * 默认为：\n             *\n             * ```javascript\n             * {\n             *     width: 1600,\n             *     height: 1600,\n             *\n             *     // 图片质量，只有type为`image/jpeg`的时候才有效。\n             *     quality: 90,\n             *\n             *     // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n             *     allowMagnify: false,\n             *\n             *     // 是否允许裁剪。\n             *     crop: false,\n             *\n             *     // 是否保留头部meta信息。\n             *     preserveHeaders: true\n             * }\n             * ```\n             */\n            compress: {\n                width: 1600,\n                height: 1600,\n                quality: 90,\n                allowMagnify: false,\n                crop: false,\n                preserveHeaders: true\n            }\n        });\n    \n        return Uploader.register({\n            'make-thumb': 'makeThumb',\n            'before-send-file': 'compressImage'\n        }, {\n    \n    \n            /**\n             * 生成缩略图，此过程为异步，所以需要传入`callback`。\n             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。\n             *\n             * `callback`中可以接收到两个参数。\n             * * 第一个为error，如果生成缩略图有错误，此error将为真。\n             * * 第二个为ret, 缩略图的Data URL值。\n             *\n             * **注意**\n             * Date URL在IE6/7中不支持，所以不用调用此方法了，直接显示一张暂不支持预览图片好了。\n             *\n             *\n             * @method makeThumb\n             * @grammar makeThumb( file, callback ) => undefined\n             * @grammar makeThumb( file, callback, width, height ) => undefined\n             * @for Uploader\n             * @example\n             *\n             * uploader.on( 'fileQueued', function( file ) {\n             *     var $li = ...;\n             *\n             *     uploader.makeThumb( file, function( error, ret ) {\n             *         if ( error ) {\n             *             $li.text('预览错误');\n             *         } else {\n             *             $li.append('<img alt=\"\" src=\"' + ret + '\" />');\n             *         }\n             *     });\n             *\n             * });\n             */\n            makeThumb: function( file, cb, width, height ) {\n                var opts, image;\n    \n                file = this.request( 'get-file', file );\n    \n                // 只预览图片格式。\n                if ( !file.type.match( /^image/ ) ) {\n                    cb( true );\n                    return;\n                }\n    \n                opts = $.extend({}, this.options.thumb );\n    \n                // 如果传入的是object.\n                if ( $.isPlainObject( width ) ) {\n                    opts = $.extend( opts, width );\n                    width = null;\n                }\n    \n                width = width || opts.width;\n                height = height || opts.height;\n    \n                image = new Image( opts );\n    \n                image.once( 'load', function() {\n                    file._info = file._info || image.info();\n                    file._meta = file._meta || image.meta();\n                    image.resize( width, height );\n                });\n    \n                image.once( 'complete', function() {\n                    cb( false, image.getAsDataUrl( opts.type ) );\n                    image.destroy();\n                });\n    \n                image.once( 'error', function() {\n                    cb( true );\n                    image.destroy();\n                });\n    \n                throttle( image, file.source.size, function() {\n                    file._info && image.info( file._info );\n                    file._meta && image.meta( file._meta );\n                    image.loadFromBlob( file.source );\n                });\n            },\n    \n            compressImage: function( file ) {\n                var opts = this.options.compress || this.options.resize,\n                    compressSize = opts && opts.compressSize || 300 * 1024,\n                    image, deferred;\n    \n                file = this.request( 'get-file', file );\n    \n                // 只预览图片格式。\n                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||\n                        file.size < compressSize ||\n                        file._compressed ) {\n                    return;\n                }\n    \n                opts = $.extend({}, opts );\n                deferred = Base.Deferred();\n    \n                image = new Image( opts );\n    \n                deferred.always(function() {\n                    image.destroy();\n                    image = null;\n                });\n                image.once( 'error', deferred.reject );\n                image.once( 'load', function() {\n                    file._info = file._info || image.info();\n                    file._meta = file._meta || image.meta();\n                    image.resize( opts.width, opts.height );\n                });\n    \n                image.once( 'complete', function() {\n                    var blob, size;\n    \n                    // 移动端 UC / qq 浏览器的无图模式下\n                    // ctx.getImageData 处理大图的时候会报 Exception\n                    // INDEX_SIZE_ERR: DOM Exception 1\n                    try {\n                        blob = image.getAsBlob( opts.type );\n    \n                        size = file.size;\n    \n                        // 如果压缩后，比原来还大则不用压缩后的。\n                        if ( blob.size < size ) {\n                            // file.source.destroy && file.source.destroy();\n                            file.source = blob;\n                            file.size = blob.size;\n    \n                            file.trigger( 'resize', blob.size, size );\n                        }\n    \n                        // 标记，避免重复压缩。\n                        file._compressed = true;\n                        deferred.resolve();\n                    } catch ( e ) {\n                        // 出错了直接继续，让其上传原始图片\n                        deferred.resolve();\n                    }\n                });\n    \n                file._info && image.info( file._info );\n                file._meta && image.meta( file._meta );\n    \n                image.loadFromBlob( file.source );\n                return deferred.promise();\n            }\n        });\n    });\n    /**\n     * @fileOverview 文件属性封装\n     */\n    define('file',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            idPrefix = 'WU_FILE_',\n            idSuffix = 0,\n            rExt = /\\.([^.]+)$/,\n            statusMap = {};\n    \n        function gid() {\n            return idPrefix + idSuffix++;\n        }\n    \n        /**\n         * 文件类\n         * @class File\n         * @constructor 构造函数\n         * @grammar new File( source ) => File\n         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。\n         */\n        function WUFile( source ) {\n    \n            /**\n             * 文件名，包括扩展名（后缀）\n             * @property name\n             * @type {string}\n             */\n            this.name = source.name || 'Untitled';\n    \n            /**\n             * 文件体积（字节）\n             * @property size\n             * @type {uint}\n             * @default 0\n             */\n            this.size = source.size || 0;\n    \n            /**\n             * 文件MIMETYPE类型，与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)\n             * @property type\n             * @type {string}\n             * @default 'application'\n             */\n            this.type = source.type || 'application';\n    \n            /**\n             * 文件最后修改日期\n             * @property lastModifiedDate\n             * @type {int}\n             * @default 当前时间戳\n             */\n            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);\n    \n            /**\n             * 文件ID，每个对象具有唯一ID，与文件名无关\n             * @property id\n             * @type {string}\n             */\n            this.id = gid();\n    \n            /**\n             * 文件扩展名，通过文件名获取，例如test.png的扩展名为png\n             * @property ext\n             * @type {string}\n             */\n            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';\n    \n    \n            /**\n             * 状态文字说明。在不同的status语境下有不同的用途。\n             * @property statusText\n             * @type {string}\n             */\n            this.statusText = '';\n    \n            // 存储文件状态，防止通过属性直接修改\n            statusMap[ this.id ] = WUFile.Status.INITED;\n    \n            this.source = source;\n            this.loaded = 0;\n    \n            this.on( 'error', function( msg ) {\n                this.setStatus( WUFile.Status.ERROR, msg );\n            });\n        }\n    \n        $.extend( WUFile.prototype, {\n    \n            /**\n             * 设置状态，状态变化时会触发`change`事件。\n             * @method setStatus\n             * @grammar setStatus( status[, statusText] );\n             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)\n             * @param {String} [statusText=''] 状态说明，常在error时使用，用http, abort,server等来标记是由于什么原因导致文件错误。\n             */\n            setStatus: function( status, text ) {\n    \n                var prevStatus = statusMap[ this.id ];\n    \n                typeof text !== 'undefined' && (this.statusText = text);\n    \n                if ( status !== prevStatus ) {\n                    statusMap[ this.id ] = status;\n                    /**\n                     * 文件状态变化\n                     * @event statuschange\n                     */\n                    this.trigger( 'statuschange', status, prevStatus );\n                }\n    \n            },\n    \n            /**\n             * 获取文件状态\n             * @return {File.Status}\n             * @example\n                     文件状态具体包括以下几种类型：\n                     {\n                         // 初始化\n                        INITED:     0,\n                        // 已入队列\n                        QUEUED:     1,\n                        // 正在上传\n                        PROGRESS:     2,\n                        // 上传出错\n                        ERROR:         3,\n                        // 上传成功\n                        COMPLETE:     4,\n                        // 上传取消\n                        CANCELLED:     5\n                    }\n             */\n            getStatus: function() {\n                return statusMap[ this.id ];\n            },\n    \n            /**\n             * 获取文件原始信息。\n             * @return {*}\n             */\n            getSource: function() {\n                return this.source;\n            },\n    \n            destory: function() {\n                delete statusMap[ this.id ];\n            }\n        });\n    \n        Mediator.installTo( WUFile.prototype );\n    \n        /**\n         * 文件状态值，具体包括以下几种类型：\n         * * `inited` 初始状态\n         * * `queued` 已经进入队列, 等待上传\n         * * `progress` 上传中\n         * * `complete` 上传完成。\n         * * `error` 上传出错，可重试\n         * * `interrupt` 上传中断，可续传。\n         * * `invalid` 文件不合格，不能重试上传。会自动从队列中移除。\n         * * `cancelled` 文件被移除。\n         * @property {Object} Status\n         * @namespace File\n         * @class File\n         * @static\n         */\n        WUFile.Status = {\n            INITED:     'inited',    // 初始状态\n            QUEUED:     'queued',    // 已经进入队列, 等待上传\n            PROGRESS:   'progress',    // 上传中\n            ERROR:      'error',    // 上传出错，可重试\n            COMPLETE:   'complete',    // 上传完成。\n            CANCELLED:  'cancelled',    // 上传取消。\n            INTERRUPT:  'interrupt',    // 上传中断，可续传。\n            INVALID:    'invalid'    // 文件不合格，不能重试上传。\n        };\n    \n        return WUFile;\n    });\n    \n    /**\n     * @fileOverview 文件队列\n     */\n    define('queue',[\n        'base',\n        'mediator',\n        'file'\n    ], function( Base, Mediator, WUFile ) {\n    \n        var $ = Base.$,\n            STATUS = WUFile.Status;\n    \n        /**\n         * 文件队列, 用来存储各个状态中的文件。\n         * @class Queue\n         * @extends Mediator\n         */\n        function Queue() {\n    \n            /**\n             * 统计文件数。\n             * * `numOfQueue` 队列中的文件数。\n             * * `numOfSuccess` 上传成功的文件数\n             * * `numOfCancel` 被移除的文件数\n             * * `numOfProgress` 正在上传中的文件数\n             * * `numOfUploadFailed` 上传错误的文件数。\n             * * `numOfInvalid` 无效的文件数。\n             * @property {Object} stats\n             */\n            this.stats = {\n                numOfQueue: 0,\n                numOfSuccess: 0,\n                numOfCancel: 0,\n                numOfProgress: 0,\n                numOfUploadFailed: 0,\n                numOfInvalid: 0\n            };\n    \n            // 上传队列，仅包括等待上传的文件\n            this._queue = [];\n    \n            // 存储所有文件\n            this._map = {};\n        }\n    \n        $.extend( Queue.prototype, {\n    \n            /**\n             * 将新文件加入对队列尾部\n             *\n             * @method append\n             * @param  {File} file   文件对象\n             */\n            append: function( file ) {\n                this._queue.push( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 将新文件加入对队列头部\n             *\n             * @method prepend\n             * @param  {File} file   文件对象\n             */\n            prepend: function( file ) {\n                this._queue.unshift( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 获取文件对象\n             *\n             * @method getFile\n             * @param  {String} fileId   文件ID\n             * @return {File}\n             */\n            getFile: function( fileId ) {\n                if ( typeof fileId !== 'string' ) {\n                    return fileId;\n                }\n                return this._map[ fileId ];\n            },\n    \n            /**\n             * 从队列中取出一个指定状态的文件。\n             * @grammar fetch( status ) => File\n             * @method fetch\n             * @param {String} status [文件状态值](#WebUploader:File:File.Status)\n             * @return {File} [File](#WebUploader:File)\n             */\n            fetch: function( status ) {\n                var len = this._queue.length,\n                    i, file;\n    \n                status = status || STATUS.QUEUED;\n    \n                for ( i = 0; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( status === file.getStatus() ) {\n                        return file;\n                    }\n                }\n    \n                return null;\n            },\n    \n            /**\n             * 对队列进行排序，能够控制文件上传顺序。\n             * @grammar sort( fn ) => undefined\n             * @method sort\n             * @param {Function} fn 排序方法\n             */\n            sort: function( fn ) {\n                if ( typeof fn === 'function' ) {\n                    this._queue.sort( fn );\n                }\n            },\n    \n            /**\n             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。\n             * @grammar getFiles( [status1[, status2 ...]] ) => Array\n             * @method getFiles\n             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)\n             */\n            getFiles: function() {\n                var sts = [].slice.call( arguments, 0 ),\n                    ret = [],\n                    i = 0,\n                    len = this._queue.length,\n                    file;\n    \n                for ( ; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {\n                        continue;\n                    }\n    \n                    ret.push( file );\n                }\n    \n                return ret;\n            },\n    \n            _fileAdded: function( file ) {\n                var me = this,\n                    existing = this._map[ file.id ];\n    \n                if ( !existing ) {\n                    this._map[ file.id ] = file;\n    \n                    file.on( 'statuschange', function( cur, pre ) {\n                        me._onFileStatusChange( cur, pre );\n                    });\n                }\n    \n                file.setStatus( STATUS.QUEUED );\n            },\n    \n            _onFileStatusChange: function( curStatus, preStatus ) {\n                var stats = this.stats;\n    \n                switch ( preStatus ) {\n                    case STATUS.PROGRESS:\n                        stats.numOfProgress--;\n                        break;\n    \n                    case STATUS.QUEUED:\n                        stats.numOfQueue --;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed--;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid--;\n                        break;\n                }\n    \n                switch ( curStatus ) {\n                    case STATUS.QUEUED:\n                        stats.numOfQueue++;\n                        break;\n    \n                    case STATUS.PROGRESS:\n                        stats.numOfProgress++;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed++;\n                        break;\n    \n                    case STATUS.COMPLETE:\n                        stats.numOfSuccess++;\n                        break;\n    \n                    case STATUS.CANCELLED:\n                        stats.numOfCancel++;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid++;\n                        break;\n                }\n            }\n    \n        });\n    \n        Mediator.installTo( Queue.prototype );\n    \n        return Queue;\n    });\n    /**\n     * @fileOverview 队列\n     */\n    define('widgets/queue',[\n        'base',\n        'uploader',\n        'queue',\n        'file',\n        'lib/file',\n        'runtime/client',\n        'widgets/widget'\n    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {\n    \n        var $ = Base.$,\n            rExt = /\\.\\w+$/,\n            Status = WUFile.Status;\n    \n        return Uploader.register({\n            'sort-files': 'sortFiles',\n            'add-file': 'addFiles',\n            'get-file': 'getFile',\n            'fetch-file': 'fetchFile',\n            'get-stats': 'getStats',\n            'get-files': 'getFiles',\n            'remove-file': 'removeFile',\n            'retry': 'retry',\n            'reset': 'reset',\n            'accept-file': 'acceptFile'\n        }, {\n    \n            init: function( opts ) {\n                var me = this,\n                    deferred, len, i, item, arr, accept, runtime;\n    \n                if ( $.isPlainObject( opts.accept ) ) {\n                    opts.accept = [ opts.accept ];\n                }\n    \n                // accept中的中生成匹配正则。\n                if ( opts.accept ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        item = opts.accept[ i ].extensions;\n                        item && arr.push( item );\n                    }\n    \n                    if ( arr.length ) {\n                        accept = '\\\\.' + arr.join(',')\n                                .replace( /,/g, '$|\\\\.' )\n                                .replace( /\\*/g, '.*' ) + '$';\n                    }\n    \n                    me.accept = new RegExp( accept, 'i' );\n                }\n    \n                me.queue = new Queue();\n                me.stats = me.queue.stats;\n    \n                // 如果当前不是html5运行时，那就算了。\n                // 不执行后续操作\n                if ( this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                // 创建一个 html5 运行时的 placeholder\n                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。\n                deferred = Base.Deferred();\n                runtime = new RuntimeClient('Placeholder');\n                runtime.connectRuntime({\n                    runtimeOrder: 'html5'\n                }, function() {\n                    me._ruid = runtime.getRuid();\n                    deferred.resolve();\n                });\n                return deferred.promise();\n            },\n    \n    \n            // 为了支持外部直接添加一个原生File对象。\n            _wrapFile: function( file ) {\n                if ( !(file instanceof WUFile) ) {\n    \n                    if ( !(file instanceof File) ) {\n                        if ( !this._ruid ) {\n                            throw new Error('Can\\'t add external files.');\n                        }\n                        file = new File( this._ruid, file );\n                    }\n    \n                    file = new WUFile( file );\n                }\n    \n                return file;\n            },\n    \n            // 判断文件是否可以被加入队列\n            acceptFile: function( file ) {\n                var invalid = !file || file.size < 6 || this.accept &&\n    \n                        // 如果名字中有后缀，才做后缀白名单处理。\n                        rExt.exec( file.name ) && !this.accept.test( file.name );\n    \n                return !invalid;\n            },\n    \n    \n            /**\n             * @event beforeFileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列之前触发，此事件的handler返回值为`false`，则此文件不会被添加进入队列。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event fileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列以后触发。\n             * @for  Uploader\n             */\n    \n            _addFile: function( file ) {\n                var me = this;\n    \n                file = me._wrapFile( file );\n    \n                // 不过类型判断允许不允许，先派送 `beforeFileQueued`\n                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {\n                    return;\n                }\n    \n                // 类型不匹配，则派送错误事件，并返回。\n                if ( !me.acceptFile( file ) ) {\n                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );\n                    return;\n                }\n    \n                me.queue.append( file );\n                me.owner.trigger( 'fileQueued', file );\n                return file;\n            },\n    \n            getFile: function( fileId ) {\n                return this.queue.getFile( fileId );\n            },\n    \n            /**\n             * @event filesQueued\n             * @param {File} files 数组，内容为原始File(lib/File）对象。\n             * @description 当一批文件添加进队列以后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method addFiles\n             * @grammar addFiles( file ) => undefined\n             * @grammar addFiles( [file1, file2 ...] ) => undefined\n             * @param {Array of File or File} [files] Files 对象 数组\n             * @description 添加文件到队列\n             * @for  Uploader\n             */\n            addFiles: function( files ) {\n                var me = this;\n    \n                if ( !files.length ) {\n                    files = [ files ];\n                }\n    \n                files = $.map( files, function( file ) {\n                    return me._addFile( file );\n                });\n    \n                me.owner.trigger( 'filesQueued', files );\n    \n                if ( me.options.auto ) {\n                    me.request('start-upload');\n                }\n            },\n    \n            getStats: function() {\n                return this.stats;\n            },\n    \n            /**\n             * @event fileDequeued\n             * @param {File} file File对象\n             * @description 当文件被移除队列后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method removeFile\n             * @grammar removeFile( file ) => undefined\n             * @grammar removeFile( id ) => undefined\n             * @param {File|id} file File对象或这File对象的id\n             * @description 移除某一文件。\n             * @for  Uploader\n             * @example\n             *\n             * $li.on('click', '.remove-this', function() {\n             *     uploader.removeFile( file );\n             * })\n             */\n            removeFile: function( file ) {\n                var me = this;\n    \n                file = file.id ? file : me.queue.getFile( file );\n    \n                file.setStatus( Status.CANCELLED );\n                me.owner.trigger( 'fileDequeued', file );\n            },\n    \n            /**\n             * @method getFiles\n             * @grammar getFiles() => Array\n             * @grammar getFiles( status1, status2, status... ) => Array\n             * @description 返回指定状态的文件集合，不传参数将返回所有状态的文件。\n             * @for  Uploader\n             * @example\n             * console.log( uploader.getFiles() );    // => all files\n             * console.log( uploader.getFiles('error') )    // => all error files.\n             */\n            getFiles: function() {\n                return this.queue.getFiles.apply( this.queue, arguments );\n            },\n    \n            fetchFile: function() {\n                return this.queue.fetch.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method retry\n             * @grammar retry() => undefined\n             * @grammar retry( file ) => undefined\n             * @description 重试上传，重试指定文件，或者从出错的文件开始重新上传。\n             * @for  Uploader\n             * @example\n             * function retry() {\n             *     uploader.retry();\n             * }\n             */\n            retry: function( file, noForceStart ) {\n                var me = this,\n                    files, i, len;\n    \n                if ( file ) {\n                    file = file.id ? file : me.queue.getFile( file );\n                    file.setStatus( Status.QUEUED );\n                    noForceStart || me.request('start-upload');\n                    return;\n                }\n    \n                files = me.queue.getFiles( Status.ERROR );\n                i = 0;\n                len = files.length;\n    \n                for ( ; i < len; i++ ) {\n                    file = files[ i ];\n                    file.setStatus( Status.QUEUED );\n                }\n    \n                me.request('start-upload');\n            },\n    \n            /**\n             * @method sort\n             * @grammar sort( fn ) => undefined\n             * @description 排序队列中的文件，在上传之前调整可以控制上传顺序。\n             * @for  Uploader\n             */\n            sortFiles: function() {\n                return this.queue.sort.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method reset\n             * @grammar reset() => undefined\n             * @description 重置uploader。目前只重置了队列。\n             * @for  Uploader\n             * @example\n             * uploader.reset();\n             */\n            reset: function() {\n                this.queue = new Queue();\n                this.stats = this.queue.stats;\n            }\n        });\n    \n    });\n    /**\n     * @fileOverview 添加获取Runtime相关信息的方法。\n     */\n    define('widgets/runtime',[\n        'uploader',\n        'runtime/runtime',\n        'widgets/widget'\n    ], function( Uploader, Runtime ) {\n    \n        Uploader.support = function() {\n            return Runtime.hasRuntime.apply( Runtime, arguments );\n        };\n    \n        return Uploader.register({\n            'predict-runtime-type': 'predictRuntmeType'\n        }, {\n    \n            init: function() {\n                if ( !this.predictRuntmeType() ) {\n                    throw Error('Runtime Error');\n                }\n            },\n    \n            /**\n             * 预测Uploader将采用哪个`Runtime`\n             * @grammar predictRuntmeType() => String\n             * @method predictRuntmeType\n             * @for  Uploader\n             */\n            predictRuntmeType: function() {\n                var orders = this.options.runtimeOrder || Runtime.orders,\n                    type = this.type,\n                    i, len;\n    \n                if ( !type ) {\n                    orders = orders.split( /\\s*,\\s*/g );\n    \n                    for ( i = 0, len = orders.length; i < len; i++ ) {\n                        if ( Runtime.hasRuntime( orders[ i ] ) ) {\n                            this.type = type = orders[ i ];\n                            break;\n                        }\n                    }\n                }\n    \n                return type;\n            }\n        });\n    });\n    /**\n     * @fileOverview Transport\n     */\n    define('lib/transport',[\n        'base',\n        'runtime/client',\n        'mediator'\n    ], function( Base, RuntimeClient, Mediator ) {\n    \n        var $ = Base.$;\n    \n        function Transport( opts ) {\n            var me = this;\n    \n            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );\n            RuntimeClient.call( this, 'Transport' );\n    \n            this._blob = null;\n            this._formData = opts.formData || {};\n            this._headers = opts.headers || {};\n    \n            this.on( 'progress', this._timeout );\n            this.on( 'load error', function() {\n                me.trigger( 'progress', 1 );\n                clearTimeout( me._timer );\n            });\n        }\n    \n        Transport.options = {\n            server: '',\n            method: 'POST',\n    \n            // 跨域时，是否允许携带cookie, 只有html5 runtime才有效\n            withCredentials: false,\n            fileVal: 'file',\n            timeout: 2 * 60 * 1000,    // 2分钟\n            formData: {},\n            headers: {},\n            sendAsBinary: false\n        };\n    \n        $.extend( Transport.prototype, {\n    \n            // 添加Blob, 只能添加一次，最后一次有效。\n            appendBlob: function( key, blob, filename ) {\n                var me = this,\n                    opts = me.options;\n    \n                if ( me.getRuid() ) {\n                    me.disconnectRuntime();\n                }\n    \n                // 连接到blob归属的同一个runtime.\n                me.connectRuntime( blob.ruid, function() {\n                    me.exec('init');\n                });\n    \n                me._blob = blob;\n                opts.fileVal = key || opts.fileVal;\n                opts.filename = filename || opts.filename;\n            },\n    \n            // 添加其他字段\n            append: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._formData, key );\n                } else {\n                    this._formData[ key ] = value;\n                }\n            },\n    \n            setRequestHeader: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._headers, key );\n                } else {\n                    this._headers[ key ] = value;\n                }\n            },\n    \n            send: function( method ) {\n                this.exec( 'send', method );\n                this._timeout();\n            },\n    \n            abort: function() {\n                clearTimeout( this._timer );\n                return this.exec('abort');\n            },\n    \n            destroy: function() {\n                this.trigger('destroy');\n                this.off();\n                this.exec('destroy');\n                this.disconnectRuntime();\n            },\n    \n            getResponse: function() {\n                return this.exec('getResponse');\n            },\n    \n            getResponseAsJson: function() {\n                return this.exec('getResponseAsJson');\n            },\n    \n            getStatus: function() {\n                return this.exec('getStatus');\n            },\n    \n            _timeout: function() {\n                var me = this,\n                    duration = me.options.timeout;\n    \n                if ( !duration ) {\n                    return;\n                }\n    \n                clearTimeout( me._timer );\n                me._timer = setTimeout(function() {\n                    me.abort();\n                    me.trigger( 'error', 'timeout' );\n                }, duration );\n            }\n    \n        });\n    \n        // 让Transport具备事件功能。\n        Mediator.installTo( Transport.prototype );\n    \n        return Transport;\n    });\n    /**\n     * @fileOverview 负责文件上传相关。\n     */\n    define('widgets/upload',[\n        'base',\n        'uploader',\n        'file',\n        'lib/transport',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile, Transport ) {\n    \n        var $ = Base.$,\n            isPromise = Base.isPromise,\n            Status = WUFile.Status;\n    \n        // 添加默认配置项\n        $.extend( Uploader.options, {\n    \n    \n            /**\n             * @property {Boolean} [prepareNextFile=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否允许在文件传输时提前把下一个文件准备好。\n             * 对于一个文件的准备工作比较耗时，比如图片压缩，md5序列化。\n             * 如果能提前在当前文件传输期处理，可以节省总体耗时。\n             */\n            prepareNextFile: false,\n    \n            /**\n             * @property {Boolean} [chunked=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否要分片处理大文件上传。\n             */\n            chunked: false,\n    \n            /**\n             * @property {Boolean} [chunkSize=5242880]\n             * @namespace options\n             * @for Uploader\n             * @description 如果要分片，分多大一片？ 默认大小为5M.\n             */\n            chunkSize: 5 * 1024 * 1024,\n    \n            /**\n             * @property {Boolean} [chunkRetry=2]\n             * @namespace options\n             * @for Uploader\n             * @description 如果某个分片由于网络问题出错，允许自动重传多少次？\n             */\n            chunkRetry: 2,\n    \n            /**\n             * @property {Boolean} [threads=3]\n             * @namespace options\n             * @for Uploader\n             * @description 上传并发数。允许同时最大上传进程数。\n             */\n            threads: 3,\n    \n    \n            /**\n             * @property {Object} [formData]\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传请求的参数表，每次发送都会发送此对象中的参数。\n             */\n            formData: null\n    \n            /**\n             * @property {Object} [fileVal='file']\n             * @namespace options\n             * @for Uploader\n             * @description 设置文件上传域的name。\n             */\n    \n            /**\n             * @property {Object} [method='POST']\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传方式，`POST`或者`GET`。\n             */\n    \n            /**\n             * @property {Object} [sendAsBinary=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否已二进制的流的方式发送文件，这样整个上传内容`php://input`都为文件内容，\n             * 其他参数在$_GET数组中。\n             */\n        });\n    \n        // 负责将文件切片。\n        function CuteFile( file, chunkSize ) {\n            var pending = [],\n                blob = file.source,\n                total = blob.size,\n                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,\n                start = 0,\n                index = 0,\n                len;\n    \n            while ( index < chunks ) {\n                len = Math.min( chunkSize, total - start );\n    \n                pending.push({\n                    file: file,\n                    start: start,\n                    end: chunkSize ? (start + len) : total,\n                    total: total,\n                    chunks: chunks,\n                    chunk: index++\n                });\n                start += len;\n            }\n    \n            file.blocks = pending.concat();\n            file.remaning = pending.length;\n    \n            return {\n                file: file,\n    \n                has: function() {\n                    return !!pending.length;\n                },\n    \n                fetch: function() {\n                    return pending.shift();\n                }\n            };\n        }\n    \n        Uploader.register({\n            'start-upload': 'start',\n            'stop-upload': 'stop',\n            'skip-file': 'skipFile',\n            'is-in-progress': 'isInProgress'\n        }, {\n    \n            init: function() {\n                var owner = this.owner;\n    \n                this.runing = false;\n    \n                // 记录当前正在传的数据，跟threads相关\n                this.pool = [];\n    \n                // 缓存即将上传的文件。\n                this.pending = [];\n    \n                // 跟踪还有多少分片没有完成上传。\n                this.remaning = 0;\n                this.__tick = Base.bindFn( this._tick, this );\n    \n                owner.on( 'uploadComplete', function( file ) {\n                    // 把其他块取消了。\n                    file.blocks && $.each( file.blocks, function( _, v ) {\n                        v.transport && (v.transport.abort(), v.transport.destroy());\n                        delete v.transport;\n                    });\n    \n                    delete file.blocks;\n                    delete file.remaning;\n                });\n            },\n    \n            /**\n             * @event startUpload\n             * @description 当开始上传流程时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 开始上传。此方法可以从初始状态调用开始上传流程，也可以从暂停状态调用，继续上传流程。\n             * @grammar upload() => undefined\n             * @method upload\n             * @for  Uploader\n             */\n            start: function() {\n                var me = this;\n    \n                // 移出invalid的文件\n                $.each( me.request( 'get-files', Status.INVALID ), function() {\n                    me.request( 'remove-file', this );\n                });\n    \n                if ( me.runing ) {\n                    return;\n                }\n    \n                me.runing = true;\n    \n                // 如果有暂停的，则续传\n                $.each( me.pool, function( _, v ) {\n                    var file = v.file;\n    \n                    if ( file.getStatus() === Status.INTERRUPT ) {\n                        file.setStatus( Status.PROGRESS );\n                        me._trigged = false;\n                        v.transport && v.transport.send();\n                    }\n                });\n    \n                me._trigged = false;\n                me.owner.trigger('startUpload');\n                Base.nextTick( me.__tick );\n            },\n    \n            /**\n             * @event stopUpload\n             * @description 当开始上传流程暂停时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。\n             * @grammar stop() => undefined\n             * @grammar stop( true ) => undefined\n             * @method stop\n             * @for  Uploader\n             */\n            stop: function( interrupt ) {\n                var me = this;\n    \n                if ( me.runing === false ) {\n                    return;\n                }\n    \n                me.runing = false;\n    \n                interrupt && $.each( me.pool, function( _, v ) {\n                    v.transport && v.transport.abort();\n                    v.file.setStatus( Status.INTERRUPT );\n                });\n    \n                me.owner.trigger('stopUpload');\n            },\n    \n            /**\n             * 判断`Uplaode`r是否正在上传中。\n             * @grammar isInProgress() => Boolean\n             * @method isInProgress\n             * @for  Uploader\n             */\n            isInProgress: function() {\n                return !!this.runing;\n            },\n    \n            getStats: function() {\n                return this.request('get-stats');\n            },\n    \n            /**\n             * 掉过一个文件上传，直接标记指定文件为已上传状态。\n             * @grammar skipFile( file ) => undefined\n             * @method skipFile\n             * @for  Uploader\n             */\n            skipFile: function( file, status ) {\n                file = this.request( 'get-file', file );\n    \n                file.setStatus( status || Status.COMPLETE );\n                file.skipped = true;\n    \n                // 如果正在上传。\n                file.blocks && $.each( file.blocks, function( _, v ) {\n                    var _tr = v.transport;\n    \n                    if ( _tr ) {\n                        _tr.abort();\n                        _tr.destroy();\n                        delete v.transport;\n                    }\n                });\n    \n                this.owner.trigger( 'uploadSkip', file );\n            },\n    \n            /**\n             * @event uploadFinished\n             * @description 当所有文件上传结束时触发。\n             * @for  Uploader\n             */\n            _tick: function() {\n                var me = this,\n                    opts = me.options,\n                    fn, val;\n    \n                // 上一个promise还没有结束，则等待完成后再执行。\n                if ( me._promise ) {\n                    return me._promise.always( me.__tick );\n                }\n    \n                // 还有位置，且还有文件要处理的话。\n                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {\n                    me._trigged = false;\n    \n                    fn = function( val ) {\n                        me._promise = null;\n    \n                        // 有可能是reject过来的，所以要检测val的类型。\n                        val && val.file && me._startSend( val );\n                        Base.nextTick( me.__tick );\n                    };\n    \n                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );\n    \n                // 没有要上传的了，且没有正在传输的了。\n                } else if ( !me.remaning && !me.getStats().numOfQueue ) {\n                    me.runing = false;\n    \n                    me._trigged || Base.nextTick(function() {\n                        me.owner.trigger('uploadFinished');\n                    });\n                    me._trigged = true;\n                }\n            },\n    \n            _nextBlock: function() {\n                var me = this,\n                    act = me._act,\n                    opts = me.options,\n                    next, done;\n    \n                // 如果当前文件还有没有需要传输的，则直接返回剩下的。\n                if ( act && act.has() &&\n                        act.file.getStatus() === Status.PROGRESS ) {\n    \n                    // 是否提前准备下一个文件\n                    if ( opts.prepareNextFile && !me.pending.length ) {\n                        me._prepareNextFile();\n                    }\n    \n                    return act.fetch();\n    \n                // 否则，如果正在运行，则准备下一个文件，并等待完成后返回下个分片。\n                } else if ( me.runing ) {\n    \n                    // 如果缓存中有，则直接在缓存中取，没有则去queue中取。\n                    if ( !me.pending.length && me.getStats().numOfQueue ) {\n                        me._prepareNextFile();\n                    }\n    \n                    next = me.pending.shift();\n                    done = function( file ) {\n                        if ( !file ) {\n                            return null;\n                        }\n    \n                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );\n                        me._act = act;\n                        return act.fetch();\n                    };\n    \n                    // 文件可能还在prepare中，也有可能已经完全准备好了。\n                    return isPromise( next ) ?\n                            next[ next.pipe ? 'pipe' : 'then']( done ) :\n                            done( next );\n                }\n            },\n    \n    \n            /**\n             * @event uploadStart\n             * @param {File} file File对象\n             * @description 某个文件开始上传前触发，一个文件只会触发一次。\n             * @for  Uploader\n             */\n            _prepareNextFile: function() {\n                var me = this,\n                    file = me.request('fetch-file'),\n                    pending = me.pending,\n                    promise;\n    \n                if ( file ) {\n                    promise = me.request( 'before-send-file', file, function() {\n    \n                        // 有可能文件被skip掉了。文件被skip掉后，状态坑定不是Queued.\n                        if ( file.getStatus() === Status.QUEUED ) {\n                            me.owner.trigger( 'uploadStart', file );\n                            file.setStatus( Status.PROGRESS );\n                            return file;\n                        }\n    \n                        return me._finishFile( file );\n                    });\n    \n                    // 如果还在pending中，则替换成文件本身。\n                    promise.done(function() {\n                        var idx = $.inArray( promise, pending );\n    \n                        ~idx && pending.splice( idx, 1, file );\n                    });\n    \n                    // befeore-send-file的钩子就有错误发生。\n                    promise.fail(function( reason ) {\n                        file.setStatus( Status.ERROR, reason );\n                        me.owner.trigger( 'uploadError', file, reason );\n                        me.owner.trigger( 'uploadComplete', file );\n                    });\n    \n                    pending.push( promise );\n                }\n            },\n    \n            // 让出位置了，可以让其他分片开始上传\n            _popBlock: function( block ) {\n                var idx = $.inArray( block, this.pool );\n    \n                this.pool.splice( idx, 1 );\n                block.file.remaning--;\n                this.remaning--;\n            },\n    \n            // 开始上传，可以被掉过。如果promise被reject了，则表示跳过此分片。\n            _startSend: function( block ) {\n                var me = this,\n                    file = block.file,\n                    promise;\n    \n                me.pool.push( block );\n                me.remaning++;\n    \n                // 如果没有分片，则直接使用原始的。\n                // 不会丢失content-type信息。\n                block.blob = block.chunks === 1 ? file.source :\n                        file.source.slice( block.start, block.end );\n    \n                // hook, 每个分片发送之前可能要做些异步的事情。\n                promise = me.request( 'before-send', block, function() {\n    \n                    // 有可能文件已经上传出错了，所以不需要再传输了。\n                    if ( file.getStatus() === Status.PROGRESS ) {\n                        me._doSend( block );\n                    } else {\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n    \n                // 如果为fail了，则跳过此分片。\n                promise.fail(function() {\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file ).always(function() {\n                            block.percentage = 1;\n                            me._popBlock( block );\n                            me.owner.trigger( 'uploadComplete', file );\n                            Base.nextTick( me.__tick );\n                        });\n                    } else {\n                        block.percentage = 1;\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n            },\n    \n    \n            /**\n             * @event uploadBeforeSend\n             * @param {Object} object\n             * @param {Object} data 默认的上传参数，可以扩展此对象来控制上传参数。\n             * @description 当某个文件的分块在发送前触发，主要用来询问是否要添加附带参数，大文件在开起分片上传的前提下此事件可能会触发多次。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadAccept\n             * @param {Object} object\n             * @param {Object} ret 服务端的返回数据，json格式，如果服务端不是json格式，从ret._raw中取数据，自行解析。\n             * @description 当某个文件上传到服务端响应后，会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadProgress\n             * @param {File} file File对象\n             * @param {Number} percentage 上传进度\n             * @description 上传过程中触发，携带上传进度。\n             * @for  Uploader\n             */\n    \n    \n            /**\n             * @event uploadError\n             * @param {File} file File对象\n             * @param {String} reason 出错的code\n             * @description 当文件上传出错时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadSuccess\n             * @param {File} file File对象\n             * @param {Object} response 服务端返回的数据\n             * @description 当文件上传成功时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadComplete\n             * @param {File} [file] File对象\n             * @description 不管成功或者失败，文件上传完成时触发。\n             * @for  Uploader\n             */\n    \n            // 做上传操作。\n            _doSend: function( block ) {\n                var me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    file = block.file,\n                    tr = new Transport( opts ),\n                    data = $.extend({}, opts.formData ),\n                    headers = $.extend({}, opts.headers ),\n                    requestAccept, ret;\n    \n                block.transport = tr;\n    \n                tr.on( 'destroy', function() {\n                    delete block.transport;\n                    me._popBlock( block );\n                    Base.nextTick( me.__tick );\n                });\n    \n                // 广播上传进度。以文件为单位。\n                tr.on( 'progress', function( percentage ) {\n                    var totalPercent = 0,\n                        uploaded = 0;\n    \n                    // 可能没有abort掉，progress还是执行进来了。\n                    // if ( !file.blocks ) {\n                    //     return;\n                    // }\n    \n                    totalPercent = block.percentage = percentage;\n    \n                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。\n                        $.each( file.blocks, function( _, v ) {\n                            uploaded += (v.percentage || 0) * (v.end - v.start);\n                        });\n    \n                        totalPercent = uploaded / file.size;\n                    }\n    \n                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );\n                });\n    \n                // 用来询问，是否返回的结果是有错误的。\n                requestAccept = function( reject ) {\n                    var fn;\n    \n                    ret = tr.getResponseAsJson() || {};\n                    ret._raw = tr.getResponse();\n                    fn = function( value ) {\n                        reject = value;\n                    };\n    \n                    // 服务端响应了，不代表成功了，询问是否响应正确。\n                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {\n                        reject = reject || 'server';\n                    }\n    \n                    return reject;\n                };\n    \n                // 尝试重试，然后广播文件上传出错。\n                tr.on( 'error', function( type, flag ) {\n                    block.retried = block.retried || 0;\n    \n                    // 自动重试\n                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&\n                            block.retried < opts.chunkRetry ) {\n    \n                        block.retried++;\n                        tr.send();\n    \n                    } else {\n    \n                        // http status 500 ~ 600\n                        if ( !flag && type === 'server' ) {\n                            type = requestAccept( type );\n                        }\n    \n                        file.setStatus( Status.ERROR, type );\n                        owner.trigger( 'uploadError', file, type );\n                        owner.trigger( 'uploadComplete', file );\n                    }\n                });\n    \n                // 上传成功\n                tr.on( 'load', function() {\n                    var reason;\n    \n                    // 如果非预期，转向上传出错。\n                    if ( (reason = requestAccept()) ) {\n                        tr.trigger( 'error', reason, true );\n                        return;\n                    }\n    \n                    // 全部上传完成。\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file, ret );\n                    } else {\n                        tr.destroy();\n                    }\n                });\n    \n                // 配置默认的上传字段。\n                data = $.extend( data, {\n                    id: file.id,\n                    name: file.name,\n                    type: file.type,\n                    lastModifiedDate: file.lastModifiedDate,\n                    size: file.size\n                });\n    \n                block.chunks > 1 && $.extend( data, {\n                    chunks: block.chunks,\n                    chunk: block.chunk\n                });\n    \n                // 在发送之间可以添加字段什么的。。。\n                // 如果默认的字段不够使用，可以通过监听此事件来扩展\n                owner.trigger( 'uploadBeforeSend', block, data, headers );\n    \n                // 开始发送。\n                tr.appendBlob( opts.fileVal, block.blob, file.name );\n                tr.append( data );\n                tr.setRequestHeader( headers );\n                tr.send();\n            },\n    \n            // 完成上传。\n            _finishFile: function( file, ret, hds ) {\n                var owner = this.owner;\n    \n                return owner\n                        .request( 'after-send-file', arguments, function() {\n                            file.setStatus( Status.COMPLETE );\n                            owner.trigger( 'uploadSuccess', file, ret, hds );\n                        })\n                        .fail(function( reason ) {\n    \n                            // 如果外部已经标记为invalid什么的，不再改状态。\n                            if ( file.getStatus() === Status.PROGRESS ) {\n                                file.setStatus( Status.ERROR, reason );\n                            }\n    \n                            owner.trigger( 'uploadError', file, reason );\n                        })\n                        .always(function() {\n                            owner.trigger( 'uploadComplete', file );\n                        });\n            }\n    \n        });\n    });\n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/compbase',[],function() {\n    \n        function CompBase( owner, runtime ) {\n    \n            this.owner = owner;\n            this.options = owner.options;\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.getRuid = function() {\n                return runtime.uid;\n            };\n    \n            this.trigger = function() {\n                return owner.trigger.apply( owner, arguments );\n            };\n        }\n    \n        return CompBase;\n    });\n    /**\n     * @fileOverview Html5Runtime\n     */\n    define('runtime/html5/runtime',[\n        'base',\n        'runtime/runtime',\n        'runtime/compbase'\n    ], function( Base, Runtime, CompBase ) {\n    \n        var type = 'html5',\n            components = {};\n    \n        function Html5Runtime() {\n            var pool = {},\n                me = this,\n                destory = this.destory;\n    \n            Runtime.apply( me, arguments );\n            me.type = type;\n    \n    \n            // 这个方法的调用者，实际上是RuntimeClient\n            me.exec = function( comp, fn/*, args...*/) {\n                var client = this,\n                    uid = client.uid,\n                    args = Base.slice( arguments, 2 ),\n                    instance;\n    \n                if ( components[ comp ] ) {\n                    instance = pool[ uid ] = pool[ uid ] ||\n                            new components[ comp ]( client, me );\n    \n                    if ( instance[ fn ] ) {\n                        return instance[ fn ].apply( instance, args );\n                    }\n                }\n            };\n    \n            me.destory = function() {\n                // @todo 删除池子中的所有实例\n                return destory && destory.apply( this, arguments );\n            };\n        }\n    \n        Base.inherits( Runtime, {\n            constructor: Html5Runtime,\n    \n            // 不需要连接其他程序，直接执行callback\n            init: function() {\n                var me = this;\n                setTimeout(function() {\n                    me.trigger('ready');\n                }, 1 );\n            }\n    \n        });\n    \n        // 注册Components\n        Html5Runtime.register = function( name, component ) {\n            var klass = components[ name ] = Base.inherits( CompBase, component );\n            return klass;\n        };\n    \n        // 注册html5运行时。\n        // 只有在支持的前提下注册。\n        if ( window.Blob && window.FileReader && window.DataView ) {\n            Runtime.addRuntime( type, Html5Runtime );\n        }\n    \n        return Html5Runtime;\n    });\n    /**\n     * @fileOverview Blob Html实现\n     */\n    define('runtime/html5/blob',[\n        'runtime/html5/runtime',\n        'lib/blob'\n    ], function( Html5Runtime, Blob ) {\n    \n        return Html5Runtime.register( 'Blob', {\n            slice: function( start, end ) {\n                var blob = this.owner.source,\n                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;\n    \n                blob = slice.call( blob, start, end );\n    \n                return new Blob( this.getRuid(), blob );\n            }\n        });\n    });\n    /**\n     * @fileOverview FilePicker\n     */\n    define('runtime/html5/filepicker',[\n        'base',\n        'runtime/html5/runtime'\n    ], function( Base, Html5Runtime ) {\n    \n        var $ = Base.$;\n    \n        return Html5Runtime.register( 'FilePicker', {\n            init: function() {\n                var container = this.getRuntime().getContainer(),\n                    me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    lable = $( document.createElement('label') ),\n                    input = $( document.createElement('input') ),\n                    arr, i, len, mouseHandler;\n    \n                input.attr( 'type', 'file' );\n                input.attr( 'name', opts.name );\n                input.addClass('webuploader-element-invisible');\n    \n                lable.on( 'click', function() {\n                    input.trigger('click');\n                });\n    \n                lable.css({\n                    opacity: 0,\n                    width: '100%',\n                    height: '100%',\n                    display: 'block',\n                    cursor: 'pointer',\n                    background: '#ffffff'\n                });\n    \n                if ( opts.multiple ) {\n                    input.attr( 'multiple', 'multiple' );\n                }\n    \n                // @todo Firefox不支持单独指定后缀\n                if ( opts.accept && opts.accept.length > 0 ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        arr.push( opts.accept[ i ].mimeTypes );\n                    }\n    \n                    input.attr( 'accept', arr.join(',') );\n                }\n    \n                container.append( input );\n                container.append( lable );\n    \n                mouseHandler = function( e ) {\n                    owner.trigger( e.type );\n                };\n    \n                input.on( 'change', function( e ) {\n                    var fn = arguments.callee,\n                        clone;\n    \n                    me.files = e.target.files;\n    \n                    // reset input\n                    clone = this.cloneNode( true );\n                    this.parentNode.replaceChild( clone, this );\n    \n                    input.off();\n                    input = $( clone ).on( 'change', fn )\n                            .on( 'mouseenter mouseleave', mouseHandler );\n    \n                    owner.trigger('change');\n                });\n    \n                lable.on( 'mouseenter mouseleave', mouseHandler );\n    \n            },\n    \n    \n            getFiles: function() {\n                return this.files;\n            },\n    \n            destroy: function() {\n                // todo\n            }\n        });\n    });\n    /**\n     * Terms:\n     *\n     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer\n     * @fileOverview Image控件\n     */\n    define('runtime/html5/util',[\n        'base'\n    ], function( Base ) {\n    \n        var urlAPI = window.createObjectURL && window ||\n                window.URL && URL.revokeObjectURL && URL ||\n                window.webkitURL,\n            createObjectURL = Base.noop,\n            revokeObjectURL = createObjectURL;\n    \n        if ( urlAPI ) {\n    \n            // 更安全的方式调用，比如android里面就能把context改成其他的对象。\n            createObjectURL = function() {\n                return urlAPI.createObjectURL.apply( urlAPI, arguments );\n            };\n    \n            revokeObjectURL = function() {\n                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );\n            };\n        }\n    \n        return {\n            createObjectURL: createObjectURL,\n            revokeObjectURL: revokeObjectURL,\n    \n            dataURL2Blob: function( dataURI ) {\n                var byteStr, intArray, ab, i, mimetype, parts;\n    \n                parts = dataURI.split(',');\n    \n                if ( ~parts[ 0 ].indexOf('base64') ) {\n                    byteStr = atob( parts[ 1 ] );\n                } else {\n                    byteStr = decodeURIComponent( parts[ 1 ] );\n                }\n    \n                ab = new ArrayBuffer( byteStr.length );\n                intArray = new Uint8Array( ab );\n    \n                for ( i = 0; i < byteStr.length; i++ ) {\n                    intArray[ i ] = byteStr.charCodeAt( i );\n                }\n    \n                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];\n    \n                return this.arrayBufferToBlob( ab, mimetype );\n            },\n    \n            dataURL2ArrayBuffer: function( dataURI ) {\n                var byteStr, intArray, i, parts;\n    \n                parts = dataURI.split(',');\n    \n                if ( ~parts[ 0 ].indexOf('base64') ) {\n                    byteStr = atob( parts[ 1 ] );\n                } else {\n                    byteStr = decodeURIComponent( parts[ 1 ] );\n                }\n    \n                intArray = new Uint8Array( byteStr.length );\n    \n                for ( i = 0; i < byteStr.length; i++ ) {\n                    intArray[ i ] = byteStr.charCodeAt( i );\n                }\n    \n                return intArray.buffer;\n            },\n    \n            arrayBufferToBlob: function( buffer, type ) {\n                var builder = window.BlobBuilder || window.WebKitBlobBuilder,\n                    bb;\n    \n                // android不支持直接new Blob, 只能借助blobbuilder.\n                if ( builder ) {\n                    bb = new builder();\n                    bb.append( buffer );\n                    return bb.getBlob( type );\n                }\n    \n                return new Blob([ buffer ], type ? { type: type } : {} );\n            },\n    \n            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.\n            // 你得到的结果是png.\n            canvasToDataUrl: function( canvas, type, quality ) {\n                return canvas.toDataURL( type, quality / 100 );\n            },\n    \n            // imagemeat会复写这个方法，如果用户选择加载那个文件了的话。\n            parseMeta: function( blob, callback ) {\n                callback( false, {});\n            },\n    \n            // imagemeat会复写这个方法，如果用户选择加载那个文件了的话。\n            updateImageHead: function( data ) {\n                return data;\n            }\n        };\n    });\n    /**\n     * Terms:\n     *\n     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer\n     * @fileOverview Image控件\n     */\n    define('runtime/html5/imagemeta',[\n        'runtime/html5/util'\n    ], function( Util ) {\n    \n        var api;\n    \n        api = {\n            parsers: {\n                0xffe1: []\n            },\n    \n            maxMetaDataSize: 262144,\n    \n            parse: function( blob, cb ) {\n                var me = this,\n                    fr = new FileReader();\n    \n                fr.onload = function() {\n                    cb( false, me._parse( this.result ) );\n                    fr = fr.onload = fr.onerror = null;\n                };\n    \n                fr.onerror = function( e ) {\n                    cb( e.message );\n                    fr = fr.onload = fr.onerror = null;\n                };\n    \n                blob = blob.slice( 0, me.maxMetaDataSize );\n                fr.readAsArrayBuffer( blob.getSource() );\n            },\n    \n            _parse: function( buffer, noParse ) {\n                if ( buffer.byteLength < 6 ) {\n                    return;\n                }\n    \n                var dataview = new DataView( buffer ),\n                    offset = 2,\n                    maxOffset = dataview.byteLength - 4,\n                    headLength = offset,\n                    ret = {},\n                    markerBytes, markerLength, parsers, i;\n    \n                if ( dataview.getUint16( 0 ) === 0xffd8 ) {\n    \n                    while ( offset < maxOffset ) {\n                        markerBytes = dataview.getUint16( offset );\n    \n                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||\n                                markerBytes === 0xfffe ) {\n    \n                            markerLength = dataview.getUint16( offset + 2 ) + 2;\n    \n                            if ( offset + markerLength > dataview.byteLength ) {\n                                break;\n                            }\n    \n                            parsers = api.parsers[ markerBytes ];\n    \n                            if ( !noParse && parsers ) {\n                                for ( i = 0; i < parsers.length; i += 1 ) {\n                                    parsers[ i ].call( api, dataview, offset,\n                                            markerLength, ret );\n                                }\n                            }\n    \n                            offset += markerLength;\n                            headLength = offset;\n                        } else {\n                            break;\n                        }\n                    }\n    \n                    if ( headLength > 6 ) {\n                        if ( buffer.slice ) {\n                            ret.imageHead = buffer.slice( 2, headLength );\n                        } else {\n                            // Workaround for IE10, which does not yet\n                            // support ArrayBuffer.slice:\n                            ret.imageHead = new Uint8Array( buffer )\n                                    .subarray( 2, headLength );\n                        }\n                    }\n                }\n    \n                return ret;\n            },\n    \n            updateImageHead: function( buffer, head ) {\n                var data = this._parse( buffer, true ),\n                    buf1, buf2, bodyoffset;\n    \n    \n                bodyoffset = 2;\n                if ( data.imageHead ) {\n                    bodyoffset = 2 + data.imageHead.byteLength;\n                }\n    \n                if ( buffer.slice ) {\n                    buf2 = buffer.slice( bodyoffset );\n                } else {\n                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );\n                }\n    \n                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );\n    \n                buf1[ 0 ] = 0xFF;\n                buf1[ 1 ] = 0xD8;\n                buf1.set( new Uint8Array( head ), 2 );\n                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );\n    \n                return buf1.buffer;\n            }\n        };\n    \n        Util.parseMeta = function() {\n            return api.parse.apply( api, arguments );\n        };\n    \n        Util.updateImageHead = function() {\n            return api.updateImageHead.apply( api, arguments );\n        };\n    \n        return api;\n    });\n    /**\n     * 代码来自于：https://github.com/blueimp/JavaScript-Load-Image\n     * 暂时项目中只用了orientation.\n     *\n     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.\n     * @fileOverview EXIF解析\n     */\n    \n    // Sample\n    // ====================================\n    // Make : Apple\n    // Model : iPhone 4S\n    // Orientation : 1\n    // XResolution : 72 [72/1]\n    // YResolution : 72 [72/1]\n    // ResolutionUnit : 2\n    // Software : QuickTime 7.7.1\n    // DateTime : 2013:09:01 22:53:55\n    // ExifIFDPointer : 190\n    // ExposureTime : 0.058823529411764705 [1/17]\n    // FNumber : 2.4 [12/5]\n    // ExposureProgram : Normal program\n    // ISOSpeedRatings : 800\n    // ExifVersion : 0220\n    // DateTimeOriginal : 2013:09:01 22:52:51\n    // DateTimeDigitized : 2013:09:01 22:52:51\n    // ComponentsConfiguration : YCbCr\n    // ShutterSpeedValue : 4.058893515764426\n    // ApertureValue : 2.5260688216892597 [4845/1918]\n    // BrightnessValue : -0.3126686601998395\n    // MeteringMode : Pattern\n    // Flash : Flash did not fire, compulsory flash mode\n    // FocalLength : 4.28 [107/25]\n    // SubjectArea : [4 values]\n    // FlashpixVersion : 0100\n    // ColorSpace : 1\n    // PixelXDimension : 2448\n    // PixelYDimension : 3264\n    // SensingMethod : One-chip color area sensor\n    // ExposureMode : 0\n    // WhiteBalance : Auto white balance\n    // FocalLengthIn35mmFilm : 35\n    // SceneCaptureType : Standard\n    define('runtime/html5/imagemeta/exif',[\n        'base',\n        'runtime/html5/imagemeta'\n    ], function( Base, ImageMeta ) {\n    \n        var EXIF = {};\n    \n        EXIF.ExifMap = function() {\n            return this;\n        };\n    \n        EXIF.ExifMap.prototype.map = {\n            'Orientation': 0x0112\n        };\n    \n        EXIF.ExifMap.prototype.get = function( id ) {\n            return this[ id ] || this[ this.map[ id ] ];\n        };\n    \n        EXIF.exifTagTypes = {\n            // byte, 8-bit unsigned int:\n            1: {\n                getValue: function( dataView, dataOffset ) {\n                    return dataView.getUint8( dataOffset );\n                },\n                size: 1\n            },\n    \n            // ascii, 8-bit byte:\n            2: {\n                getValue: function( dataView, dataOffset ) {\n                    return String.fromCharCode( dataView.getUint8( dataOffset ) );\n                },\n                size: 1,\n                ascii: true\n            },\n    \n            // short, 16 bit int:\n            3: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint16( dataOffset, littleEndian );\n                },\n                size: 2\n            },\n    \n            // long, 32 bit int:\n            4: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint32( dataOffset, littleEndian );\n                },\n                size: 4\n            },\n    \n            // rational = two long values,\n            // first is numerator, second is denominator:\n            5: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint32( dataOffset, littleEndian ) /\n                        dataView.getUint32( dataOffset + 4, littleEndian );\n                },\n                size: 8\n            },\n    \n            // slong, 32 bit signed int:\n            9: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getInt32( dataOffset, littleEndian );\n                },\n                size: 4\n            },\n    \n            // srational, two slongs, first is numerator, second is denominator:\n            10: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getInt32( dataOffset, littleEndian ) /\n                        dataView.getInt32( dataOffset + 4, littleEndian );\n                },\n                size: 8\n            }\n        };\n    \n        // undefined, 8-bit byte, value depending on field:\n        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];\n    \n        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,\n                littleEndian ) {\n    \n            var tagType = EXIF.exifTagTypes[ type ],\n                tagSize, dataOffset, values, i, str, c;\n    \n            if ( !tagType ) {\n                Base.log('Invalid Exif data: Invalid tag type.');\n                return;\n            }\n    \n            tagSize = tagType.size * length;\n    \n            // Determine if the value is contained in the dataOffset bytes,\n            // or if the value at the dataOffset is a pointer to the actual data:\n            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,\n                    littleEndian ) : (offset + 8);\n    \n            if ( dataOffset + tagSize > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid data offset.');\n                return;\n            }\n    \n            if ( length === 1 ) {\n                return tagType.getValue( dataView, dataOffset, littleEndian );\n            }\n    \n            values = [];\n    \n            for ( i = 0; i < length; i += 1 ) {\n                values[ i ] = tagType.getValue( dataView,\n                        dataOffset + i * tagType.size, littleEndian );\n            }\n    \n            if ( tagType.ascii ) {\n                str = '';\n    \n                // Concatenate the chars:\n                for ( i = 0; i < values.length; i += 1 ) {\n                    c = values[ i ];\n    \n                    // Ignore the terminating NULL byte(s):\n                    if ( c === '\\u0000' ) {\n                        break;\n                    }\n                    str += c;\n                }\n    \n                return str;\n            }\n            return values;\n        };\n    \n        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,\n                data ) {\n    \n            var tag = dataView.getUint16( offset, littleEndian );\n            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,\n                    dataView.getUint16( offset + 2, littleEndian ),    // tag type\n                    dataView.getUint32( offset + 4, littleEndian ),    // tag length\n                    littleEndian );\n        };\n    \n        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,\n                littleEndian, data ) {\n    \n            var tagsNumber, dirEndOffset, i;\n    \n            if ( dirOffset + 6 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid directory offset.');\n                return;\n            }\n    \n            tagsNumber = dataView.getUint16( dirOffset, littleEndian );\n            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;\n    \n            if ( dirEndOffset + 4 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid directory size.');\n                return;\n            }\n    \n            for ( i = 0; i < tagsNumber; i += 1 ) {\n                this.parseExifTag( dataView, tiffOffset,\n                        dirOffset + 2 + 12 * i,    // tag offset\n                        littleEndian, data );\n            }\n    \n            // Return the offset to the next directory:\n            return dataView.getUint32( dirEndOffset, littleEndian );\n        };\n    \n        // EXIF.getExifThumbnail = function(dataView, offset, length) {\n        //     var hexData,\n        //         i,\n        //         b;\n        //     if (!length || offset + length > dataView.byteLength) {\n        //         Base.log('Invalid Exif data: Invalid thumbnail data.');\n        //         return;\n        //     }\n        //     hexData = [];\n        //     for (i = 0; i < length; i += 1) {\n        //         b = dataView.getUint8(offset + i);\n        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));\n        //     }\n        //     return 'data:image/jpeg,%' + hexData.join('%');\n        // };\n    \n        EXIF.parseExifData = function( dataView, offset, length, data ) {\n    \n            var tiffOffset = offset + 10,\n                littleEndian, dirOffset;\n    \n            // Check for the ASCII code for \"Exif\" (0x45786966):\n            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {\n                // No Exif data, might be XMP data instead\n                return;\n            }\n            if ( tiffOffset + 8 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid segment size.');\n                return;\n            }\n    \n            // Check for the two null bytes:\n            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {\n                Base.log('Invalid Exif data: Missing byte alignment offset.');\n                return;\n            }\n    \n            // Check the byte alignment:\n            switch ( dataView.getUint16( tiffOffset ) ) {\n                case 0x4949:\n                    littleEndian = true;\n                    break;\n    \n                case 0x4D4D:\n                    littleEndian = false;\n                    break;\n    \n                default:\n                    Base.log('Invalid Exif data: Invalid byte alignment marker.');\n                    return;\n            }\n    \n            // Check for the TIFF tag marker (0x002A):\n            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {\n                Base.log('Invalid Exif data: Missing TIFF marker.');\n                return;\n            }\n    \n            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:\n            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );\n            // Create the exif object to store the tags:\n            data.exif = new EXIF.ExifMap();\n            // Parse the tags of the main image directory and retrieve the\n            // offset to the next directory, usually the thumbnail directory:\n            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,\n                    tiffOffset + dirOffset, littleEndian, data );\n    \n            // 尝试读取缩略图\n            // if ( dirOffset ) {\n            //     thumbnailData = {exif: {}};\n            //     dirOffset = EXIF.parseExifTags(\n            //         dataView,\n            //         tiffOffset,\n            //         tiffOffset + dirOffset,\n            //         littleEndian,\n            //         thumbnailData\n            //     );\n    \n            //     // Check for JPEG Thumbnail offset:\n            //     if (thumbnailData.exif[0x0201]) {\n            //         data.exif.Thumbnail = EXIF.getExifThumbnail(\n            //             dataView,\n            //             tiffOffset + thumbnailData.exif[0x0201],\n            //             thumbnailData.exif[0x0202] // Thumbnail data length\n            //         );\n            //     }\n            // }\n        };\n    \n        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );\n        return EXIF;\n    });\n    /**\n     * @fileOverview Image\n     */\n    define('runtime/html5/image',[\n        'base',\n        'runtime/html5/runtime',\n        'runtime/html5/util'\n    ], function( Base, Html5Runtime, Util ) {\n    \n        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';\n    \n        return Html5Runtime.register( 'Image', {\n    \n            // flag: 标记是否被修改过。\n            modified: false,\n    \n            init: function() {\n                var me = this,\n                    img = new Image();\n    \n                img.onload = function() {\n    \n                    me._info = {\n                        type: me.type,\n                        width: this.width,\n                        height: this.height\n                    };\n    \n                    // 读取meta信息。\n                    if ( !me._metas && 'image/jpeg' === me.type ) {\n                        Util.parseMeta( me._blob, function( error, ret ) {\n                            me._metas = ret;\n                            me.owner.trigger('load');\n                        });\n                    } else {\n                        me.owner.trigger('load');\n                    }\n                };\n    \n                img.onerror = function() {\n                    me.owner.trigger('error');\n                };\n    \n                me._img = img;\n            },\n    \n            loadFromBlob: function( blob ) {\n                var me = this,\n                    img = me._img;\n    \n                me._blob = blob;\n                me.type = blob.type;\n                img.src = Util.createObjectURL( blob.getSource() );\n                me.owner.once( 'load', function() {\n                    Util.revokeObjectURL( img.src );\n                });\n            },\n    \n            resize: function( width, height ) {\n                var canvas = this._canvas ||\n                        (this._canvas = document.createElement('canvas'));\n    \n                this._resize( this._img, canvas, width, height );\n                this._blob = null;    // 没用了，可以删掉了。\n                this.modified = true;\n                this.owner.trigger('complete');\n            },\n    \n            getAsBlob: function( type ) {\n                var blob = this._blob,\n                    opts = this.options,\n                    canvas;\n    \n                type = type || this.type;\n    \n                // blob需要重新生成。\n                if ( this.modified || this.type !== type ) {\n                    canvas = this._canvas;\n    \n                    if ( type === 'image/jpeg' ) {\n    \n                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',\n                                opts.quality );\n    \n                        if ( opts.preserveHeaders && this._metas &&\n                                this._metas.imageHead ) {\n    \n                            blob = Util.dataURL2ArrayBuffer( blob );\n                            blob = Util.updateImageHead( blob,\n                                    this._metas.imageHead );\n                            blob = Util.arrayBufferToBlob( blob, type );\n                            return blob;\n                        }\n                    } else {\n                        blob = Util.canvasToDataUrl( canvas, type );\n                    }\n    \n                    blob = Util.dataURL2Blob( blob );\n                }\n    \n                return blob;\n            },\n    \n            getAsDataUrl: function( type ) {\n                var opts = this.options;\n    \n                type = type || this.type;\n    \n                if ( type === 'image/jpeg' ) {\n                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );\n                } else {\n                    return this._canvas.toDataURL( type );\n                }\n            },\n    \n            getOrientation: function() {\n                return this._metas && this._metas.exif &&\n                        this._metas.exif.get('Orientation') || 1;\n            },\n    \n            info: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._info = val;\n                    return this;\n                }\n    \n                // getter\n                return this._info;\n            },\n    \n            meta: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._meta = val;\n                    return this;\n                }\n    \n                // getter\n                return this._meta;\n            },\n    \n            destroy: function() {\n                var canvas = this._canvas;\n                this._img.onload = null;\n    \n                if ( canvas ) {\n                    canvas.getContext('2d')\n                            .clearRect( 0, 0, canvas.width, canvas.height );\n                    canvas.width = canvas.height = 0;\n                    this._canvas = null;\n                }\n    \n                // 释放内存。非常重要，否则释放不了image的内存。\n                this._img.src = BLANK;\n                this._img = this._blob = null;\n            },\n    \n            _resize: function( img, cvs, width, height ) {\n                var opts = this.options,\n                    naturalWidth = img.width,\n                    naturalHeight = img.height,\n                    orientation = this.getOrientation(),\n                    scale, w, h, x, y;\n    \n                // values that require 90 degree rotation\n                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {\n    \n                    // 交换width, height的值。\n                    width ^= height;\n                    height ^= width;\n                    width ^= height;\n                }\n    \n                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,\n                        height / naturalHeight );\n    \n                // 不允许放大。\n                opts.allowMagnify || (scale = Math.min( 1, scale ));\n    \n                w = naturalWidth * scale;\n                h = naturalHeight * scale;\n    \n                if ( opts.crop ) {\n                    cvs.width = width;\n                    cvs.height = height;\n                } else {\n                    cvs.width = w;\n                    cvs.height = h;\n                }\n    \n                x = (cvs.width - w) / 2;\n                y = (cvs.height - h) / 2;\n    \n                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );\n    \n                this._renderImageToCanvas( cvs, img, x, y, w, h );\n            },\n    \n            _rotate2Orientaion: function( canvas, orientation ) {\n                var width = canvas.width,\n                    height = canvas.height,\n                    ctx = canvas.getContext('2d');\n    \n                switch ( orientation ) {\n                    case 5:\n                    case 6:\n                    case 7:\n                    case 8:\n                        canvas.width = height;\n                        canvas.height = width;\n                        break;\n                }\n    \n                switch ( orientation ) {\n                    case 2:    // horizontal flip\n                        ctx.translate( width, 0 );\n                        ctx.scale( -1, 1 );\n                        break;\n    \n                    case 3:    // 180 rotate left\n                        ctx.translate( width, height );\n                        ctx.rotate( Math.PI );\n                        break;\n    \n                    case 4:    // vertical flip\n                        ctx.translate( 0, height );\n                        ctx.scale( 1, -1 );\n                        break;\n    \n                    case 5:    // vertical flip + 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.scale( 1, -1 );\n                        break;\n    \n                    case 6:    // 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.translate( 0, -height );\n                        break;\n    \n                    case 7:    // horizontal flip + 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.translate( width, -height );\n                        ctx.scale( -1, 1 );\n                        break;\n    \n                    case 8:    // 90 rotate left\n                        ctx.rotate( -0.5 * Math.PI );\n                        ctx.translate( -width, 0 );\n                        break;\n                }\n            },\n    \n            // https://github.com/stomita/ios-imagefile-megapixel/\n            // blob/master/src/megapix-image.js\n            _renderImageToCanvas: (function() {\n    \n                // 如果不是ios, 不需要这么复杂！\n                if ( !Base.os.ios ) {\n                    return function( canvas, img, x, y, w, h ) {\n                        canvas.getContext('2d').drawImage( img, x, y, w, h );\n                    };\n                }\n    \n                /**\n                 * Detecting vertical squash in loaded image.\n                 * Fixes a bug which squash image vertically while drawing into\n                 * canvas for some images.\n                 */\n                function detectVerticalSquash( img, iw, ih ) {\n                    var canvas = document.createElement('canvas'),\n                        ctx = canvas.getContext('2d'),\n                        sy = 0,\n                        ey = ih,\n                        py = ih,\n                        data, alpha, ratio;\n    \n    \n                    canvas.width = 1;\n                    canvas.height = ih;\n                    ctx.drawImage( img, 0, 0 );\n                    data = ctx.getImageData( 0, 0, 1, ih ).data;\n    \n                    // search image edge pixel position in case\n                    // it is squashed vertically.\n                    while ( py > sy ) {\n                        alpha = data[ (py - 1) * 4 + 3 ];\n    \n                        if ( alpha === 0 ) {\n                            ey = py;\n                        } else {\n                            sy = py;\n                        }\n    \n                        py = (ey + sy) >> 1;\n                    }\n    \n                    ratio = (py / ih);\n                    return (ratio === 0) ? 1 : ratio;\n                }\n    \n                // fix ie7 bug\n                // http://stackoverflow.com/questions/11929099/\n                // html5-canvas-drawimage-ratio-bug-ios\n                if ( Base.os.ios >= 7 ) {\n                    return function( canvas, img, x, y, w, h ) {\n                        var iw = img.naturalWidth,\n                            ih = img.naturalHeight,\n                            vertSquashRatio = detectVerticalSquash( img, iw, ih );\n    \n                        return canvas.getContext('2d').drawImage( img, 0, 0,\n                            iw * vertSquashRatio, ih * vertSquashRatio,\n                            x, y, w, h );\n                    };\n                }\n    \n                /**\n                 * Detect subsampling in loaded image.\n                 * In iOS, larger images than 2M pixels may be\n                 * subsampled in rendering.\n                 */\n                function detectSubsampling( img ) {\n                    var iw = img.naturalWidth,\n                        ih = img.naturalHeight,\n                        canvas, ctx;\n    \n                    // subsampling may happen overmegapixel image\n                    if ( iw * ih > 1024 * 1024 ) {\n                        canvas = document.createElement('canvas');\n                        canvas.width = canvas.height = 1;\n                        ctx = canvas.getContext('2d');\n                        ctx.drawImage( img, -iw + 1, 0 );\n    \n                        // subsampled image becomes half smaller in rendering size.\n                        // check alpha channel value to confirm image is covering\n                        // edge pixel or not. if alpha value is 0\n                        // image is not covering, hence subsampled.\n                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;\n                    } else {\n                        return false;\n                    }\n                }\n    \n    \n                return function( canvas, img, x, y, width, height ) {\n                    var iw = img.naturalWidth,\n                        ih = img.naturalHeight,\n                        ctx = canvas.getContext('2d'),\n                        subsampled = detectSubsampling( img ),\n                        doSquash = this.type === 'image/jpeg',\n                        d = 1024,\n                        sy = 0,\n                        dy = 0,\n                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;\n    \n                    if ( subsampled ) {\n                        iw /= 2;\n                        ih /= 2;\n                    }\n    \n                    ctx.save();\n                    tmpCanvas = document.createElement('canvas');\n                    tmpCanvas.width = tmpCanvas.height = d;\n    \n                    tmpCtx = tmpCanvas.getContext('2d');\n                    vertSquashRatio = doSquash ?\n                            detectVerticalSquash( img, iw, ih ) : 1;\n    \n                    dw = Math.ceil( d * width / iw );\n                    dh = Math.ceil( d * height / ih / vertSquashRatio );\n    \n                    while ( sy < ih ) {\n                        sx = 0;\n                        dx = 0;\n                        while ( sx < iw ) {\n                            tmpCtx.clearRect( 0, 0, d, d );\n                            tmpCtx.drawImage( img, -sx, -sy );\n                            ctx.drawImage( tmpCanvas, 0, 0, d, d,\n                                    x + dx, y + dy, dw, dh );\n                            sx += d;\n                            dx += dw;\n                        }\n                        sy += d;\n                        dy += dh;\n                    }\n                    ctx.restore();\n                    tmpCanvas = tmpCtx = null;\n                };\n            })()\n        });\n    });\n    /**\n     * 这个方式性能不行，但是可以解决android里面的toDataUrl的bug\n     * android里面toDataUrl('image/jpege')得到的结果却是png.\n     *\n     * 所以这里没辙，只能借助这个工具\n     * @fileOverview jpeg encoder\n     */\n    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {\n    \n        /*\n          Copyright (c) 2008, Adobe Systems Incorporated\n          All rights reserved.\n    \n          Redistribution and use in source and binary forms, with or without\n          modification, are permitted provided that the following conditions are\n          met:\n    \n          * Redistributions of source code must retain the above copyright notice,\n            this list of conditions and the following disclaimer.\n    \n          * Redistributions in binary form must reproduce the above copyright\n            notice, this list of conditions and the following disclaimer in the\n            documentation and/or other materials provided with the distribution.\n    \n          * Neither the name of Adobe Systems Incorporated nor the names of its\n            contributors may be used to endorse or promote products derived from\n            this software without specific prior written permission.\n    \n          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n          IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n        */\n        /*\n        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009\n    \n        Basic GUI blocking jpeg encoder\n        */\n    \n        function JPEGEncoder(quality) {\n          var self = this;\n            var fround = Math.round;\n            var ffloor = Math.floor;\n            var YTable = new Array(64);\n            var UVTable = new Array(64);\n            var fdtbl_Y = new Array(64);\n            var fdtbl_UV = new Array(64);\n            var YDC_HT;\n            var UVDC_HT;\n            var YAC_HT;\n            var UVAC_HT;\n    \n            var bitcode = new Array(65535);\n            var category = new Array(65535);\n            var outputfDCTQuant = new Array(64);\n            var DU = new Array(64);\n            var byteout = [];\n            var bytenew = 0;\n            var bytepos = 7;\n    \n            var YDU = new Array(64);\n            var UDU = new Array(64);\n            var VDU = new Array(64);\n            var clt = new Array(256);\n            var RGB_YUV_TABLE = new Array(2048);\n            var currentQuality;\n    \n            var ZigZag = [\n                     0, 1, 5, 6,14,15,27,28,\n                     2, 4, 7,13,16,26,29,42,\n                     3, 8,12,17,25,30,41,43,\n                     9,11,18,24,31,40,44,53,\n                    10,19,23,32,39,45,52,54,\n                    20,22,33,38,46,51,55,60,\n                    21,34,37,47,50,56,59,61,\n                    35,36,48,49,57,58,62,63\n                ];\n    \n            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];\n            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];\n            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];\n            var std_ac_luminance_values = [\n                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,\n                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,\n                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,\n                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,\n                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,\n                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,\n                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,\n                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,\n                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,\n                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,\n                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,\n                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,\n                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,\n                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,\n                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,\n                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,\n                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,\n                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,\n                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,\n                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,\n                    0xf9,0xfa\n                ];\n    \n            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];\n            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];\n            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];\n            var std_ac_chrominance_values = [\n                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,\n                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,\n                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,\n                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,\n                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,\n                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,\n                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,\n                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,\n                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,\n                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,\n                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,\n                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,\n                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,\n                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,\n                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,\n                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,\n                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,\n                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,\n                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,\n                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,\n                    0xf9,0xfa\n                ];\n    \n            function initQuantTables(sf){\n                    var YQT = [\n                        16, 11, 10, 16, 24, 40, 51, 61,\n                        12, 12, 14, 19, 26, 58, 60, 55,\n                        14, 13, 16, 24, 40, 57, 69, 56,\n                        14, 17, 22, 29, 51, 87, 80, 62,\n                        18, 22, 37, 56, 68,109,103, 77,\n                        24, 35, 55, 64, 81,104,113, 92,\n                        49, 64, 78, 87,103,121,120,101,\n                        72, 92, 95, 98,112,100,103, 99\n                    ];\n    \n                    for (var i = 0; i < 64; i++) {\n                        var t = ffloor((YQT[i]*sf+50)/100);\n                        if (t < 1) {\n                            t = 1;\n                        } else if (t > 255) {\n                            t = 255;\n                        }\n                        YTable[ZigZag[i]] = t;\n                    }\n                    var UVQT = [\n                        17, 18, 24, 47, 99, 99, 99, 99,\n                        18, 21, 26, 66, 99, 99, 99, 99,\n                        24, 26, 56, 99, 99, 99, 99, 99,\n                        47, 66, 99, 99, 99, 99, 99, 99,\n                        99, 99, 99, 99, 99, 99, 99, 99,\n                        99, 99, 99, 99, 99, 99, 99, 99,\n                        99, 99, 99, 99, 99, 99, 99, 99,\n                        99, 99, 99, 99, 99, 99, 99, 99\n                    ];\n                    for (var j = 0; j < 64; j++) {\n                        var u = ffloor((UVQT[j]*sf+50)/100);\n                        if (u < 1) {\n                            u = 1;\n                        } else if (u > 255) {\n                            u = 255;\n                        }\n                        UVTable[ZigZag[j]] = u;\n                    }\n                    var aasf = [\n                        1.0, 1.387039845, 1.306562965, 1.175875602,\n                        1.0, 0.785694958, 0.541196100, 0.275899379\n                    ];\n                    var k = 0;\n                    for (var row = 0; row < 8; row++)\n                    {\n                        for (var col = 0; col < 8; col++)\n                        {\n                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));\n                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));\n                            k++;\n                        }\n                    }\n                }\n    \n                function computeHuffmanTbl(nrcodes, std_table){\n                    var codevalue = 0;\n                    var pos_in_table = 0;\n                    var HT = new Array();\n                    for (var k = 1; k <= 16; k++) {\n                        for (var j = 1; j <= nrcodes[k]; j++) {\n                            HT[std_table[pos_in_table]] = [];\n                            HT[std_table[pos_in_table]][0] = codevalue;\n                            HT[std_table[pos_in_table]][1] = k;\n                            pos_in_table++;\n                            codevalue++;\n                        }\n                        codevalue*=2;\n                    }\n                    return HT;\n                }\n    \n                function initHuffmanTbl()\n                {\n                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);\n                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);\n                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);\n                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);\n                }\n    \n                function initCategoryNumber()\n                {\n                    var nrlower = 1;\n                    var nrupper = 2;\n                    for (var cat = 1; cat <= 15; cat++) {\n                        //Positive numbers\n                        for (var nr = nrlower; nr<nrupper; nr++) {\n                            category[32767+nr] = cat;\n                            bitcode[32767+nr] = [];\n                            bitcode[32767+nr][1] = cat;\n                            bitcode[32767+nr][0] = nr;\n                        }\n                        //Negative numbers\n                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {\n                            category[32767+nrneg] = cat;\n                            bitcode[32767+nrneg] = [];\n                            bitcode[32767+nrneg][1] = cat;\n                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;\n                        }\n                        nrlower <<= 1;\n                        nrupper <<= 1;\n                    }\n                }\n    \n                function initRGBYUVTable() {\n                    for(var i = 0; i < 256;i++) {\n                        RGB_YUV_TABLE[i]            =  19595 * i;\n                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;\n                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;\n                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;\n                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;\n                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;\n                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;\n                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;\n                    }\n                }\n    \n                // IO functions\n                function writeBits(bs)\n                {\n                    var value = bs[0];\n                    var posval = bs[1]-1;\n                    while ( posval >= 0 ) {\n                        if (value & (1 << posval) ) {\n                            bytenew |= (1 << bytepos);\n                        }\n                        posval--;\n                        bytepos--;\n                        if (bytepos < 0) {\n                            if (bytenew == 0xFF) {\n                                writeByte(0xFF);\n                                writeByte(0);\n                            }\n                            else {\n                                writeByte(bytenew);\n                            }\n                            bytepos=7;\n                            bytenew=0;\n                        }\n                    }\n                }\n    \n                function writeByte(value)\n                {\n                    byteout.push(clt[value]); // write char directly instead of converting later\n                }\n    \n                function writeWord(value)\n                {\n                    writeByte((value>>8)&0xFF);\n                    writeByte((value   )&0xFF);\n                }\n    \n                // DCT & quantization core\n                function fDCTQuant(data, fdtbl)\n                {\n                    var d0, d1, d2, d3, d4, d5, d6, d7;\n                    /* Pass 1: process rows. */\n                    var dataOff=0;\n                    var i;\n                    var I8 = 8;\n                    var I64 = 64;\n                    for (i=0; i<I8; ++i)\n                    {\n                        d0 = data[dataOff];\n                        d1 = data[dataOff+1];\n                        d2 = data[dataOff+2];\n                        d3 = data[dataOff+3];\n                        d4 = data[dataOff+4];\n                        d5 = data[dataOff+5];\n                        d6 = data[dataOff+6];\n                        d7 = data[dataOff+7];\n    \n                        var tmp0 = d0 + d7;\n                        var tmp7 = d0 - d7;\n                        var tmp1 = d1 + d6;\n                        var tmp6 = d1 - d6;\n                        var tmp2 = d2 + d5;\n                        var tmp5 = d2 - d5;\n                        var tmp3 = d3 + d4;\n                        var tmp4 = d3 - d4;\n    \n                        /* Even part */\n                        var tmp10 = tmp0 + tmp3;    /* phase 2 */\n                        var tmp13 = tmp0 - tmp3;\n                        var tmp11 = tmp1 + tmp2;\n                        var tmp12 = tmp1 - tmp2;\n    \n                        data[dataOff] = tmp10 + tmp11; /* phase 3 */\n                        data[dataOff+4] = tmp10 - tmp11;\n    \n                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */\n                        data[dataOff+2] = tmp13 + z1; /* phase 5 */\n                        data[dataOff+6] = tmp13 - z1;\n    \n                        /* Odd part */\n                        tmp10 = tmp4 + tmp5; /* phase 2 */\n                        tmp11 = tmp5 + tmp6;\n                        tmp12 = tmp6 + tmp7;\n    \n                        /* The rotator is modified from fig 4-8 to avoid extra negations. */\n                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */\n                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */\n                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */\n                        var z3 = tmp11 * 0.707106781; /* c4 */\n    \n                        var z11 = tmp7 + z3;    /* phase 5 */\n                        var z13 = tmp7 - z3;\n    \n                        data[dataOff+5] = z13 + z2; /* phase 6 */\n                        data[dataOff+3] = z13 - z2;\n                        data[dataOff+1] = z11 + z4;\n                        data[dataOff+7] = z11 - z4;\n    \n                        dataOff += 8; /* advance pointer to next row */\n                    }\n    \n                    /* Pass 2: process columns. */\n                    dataOff = 0;\n                    for (i=0; i<I8; ++i)\n                    {\n                        d0 = data[dataOff];\n                        d1 = data[dataOff + 8];\n                        d2 = data[dataOff + 16];\n                        d3 = data[dataOff + 24];\n                        d4 = data[dataOff + 32];\n                        d5 = data[dataOff + 40];\n                        d6 = data[dataOff + 48];\n                        d7 = data[dataOff + 56];\n    \n                        var tmp0p2 = d0 + d7;\n                        var tmp7p2 = d0 - d7;\n                        var tmp1p2 = d1 + d6;\n                        var tmp6p2 = d1 - d6;\n                        var tmp2p2 = d2 + d5;\n                        var tmp5p2 = d2 - d5;\n                        var tmp3p2 = d3 + d4;\n                        var tmp4p2 = d3 - d4;\n    \n                        /* Even part */\n                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */\n                        var tmp13p2 = tmp0p2 - tmp3p2;\n                        var tmp11p2 = tmp1p2 + tmp2p2;\n                        var tmp12p2 = tmp1p2 - tmp2p2;\n    \n                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */\n                        data[dataOff+32] = tmp10p2 - tmp11p2;\n    \n                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */\n                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */\n                        data[dataOff+48] = tmp13p2 - z1p2;\n    \n                        /* Odd part */\n                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */\n                        tmp11p2 = tmp5p2 + tmp6p2;\n                        tmp12p2 = tmp6p2 + tmp7p2;\n    \n                        /* The rotator is modified from fig 4-8 to avoid extra negations. */\n                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */\n                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */\n                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */\n                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */\n    \n                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */\n                        var z13p2 = tmp7p2 - z3p2;\n    \n                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */\n                        data[dataOff+24] = z13p2 - z2p2;\n                        data[dataOff+ 8] = z11p2 + z4p2;\n                        data[dataOff+56] = z11p2 - z4p2;\n    \n                        dataOff++; /* advance pointer to next column */\n                    }\n    \n                    // Quantize/descale the coefficients\n                    var fDCTQuant;\n                    for (i=0; i<I64; ++i)\n                    {\n                        // Apply the quantization and scaling factor & Round to nearest integer\n                        fDCTQuant = data[i]*fdtbl[i];\n                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);\n                        //outputfDCTQuant[i] = fround(fDCTQuant);\n    \n                    }\n                    return outputfDCTQuant;\n                }\n    \n                function writeAPP0()\n                {\n                    writeWord(0xFFE0); // marker\n                    writeWord(16); // length\n                    writeByte(0x4A); // J\n                    writeByte(0x46); // F\n                    writeByte(0x49); // I\n                    writeByte(0x46); // F\n                    writeByte(0); // = \"JFIF\",'\\0'\n                    writeByte(1); // versionhi\n                    writeByte(1); // versionlo\n                    writeByte(0); // xyunits\n                    writeWord(1); // xdensity\n                    writeWord(1); // ydensity\n                    writeByte(0); // thumbnwidth\n                    writeByte(0); // thumbnheight\n                }\n    \n                function writeSOF0(width, height)\n                {\n                    writeWord(0xFFC0); // marker\n                    writeWord(17);   // length, truecolor YUV JPG\n                    writeByte(8);    // precision\n                    writeWord(height);\n                    writeWord(width);\n                    writeByte(3);    // nrofcomponents\n                    writeByte(1);    // IdY\n                    writeByte(0x11); // HVY\n                    writeByte(0);    // QTY\n                    writeByte(2);    // IdU\n                    writeByte(0x11); // HVU\n                    writeByte(1);    // QTU\n                    writeByte(3);    // IdV\n                    writeByte(0x11); // HVV\n                    writeByte(1);    // QTV\n                }\n    \n                function writeDQT()\n                {\n                    writeWord(0xFFDB); // marker\n                    writeWord(132);    // length\n                    writeByte(0);\n                    for (var i=0; i<64; i++) {\n                        writeByte(YTable[i]);\n                    }\n                    writeByte(1);\n                    for (var j=0; j<64; j++) {\n                        writeByte(UVTable[j]);\n                    }\n                }\n    \n                function writeDHT()\n                {\n                    writeWord(0xFFC4); // marker\n                    writeWord(0x01A2); // length\n    \n                    writeByte(0); // HTYDCinfo\n                    for (var i=0; i<16; i++) {\n                        writeByte(std_dc_luminance_nrcodes[i+1]);\n                    }\n                    for (var j=0; j<=11; j++) {\n                        writeByte(std_dc_luminance_values[j]);\n                    }\n    \n                    writeByte(0x10); // HTYACinfo\n                    for (var k=0; k<16; k++) {\n                        writeByte(std_ac_luminance_nrcodes[k+1]);\n                    }\n                    for (var l=0; l<=161; l++) {\n                        writeByte(std_ac_luminance_values[l]);\n                    }\n    \n                    writeByte(1); // HTUDCinfo\n                    for (var m=0; m<16; m++) {\n                        writeByte(std_dc_chrominance_nrcodes[m+1]);\n                    }\n                    for (var n=0; n<=11; n++) {\n                        writeByte(std_dc_chrominance_values[n]);\n                    }\n    \n                    writeByte(0x11); // HTUACinfo\n                    for (var o=0; o<16; o++) {\n                        writeByte(std_ac_chrominance_nrcodes[o+1]);\n                    }\n                    for (var p=0; p<=161; p++) {\n                        writeByte(std_ac_chrominance_values[p]);\n                    }\n                }\n    \n                function writeSOS()\n                {\n                    writeWord(0xFFDA); // marker\n                    writeWord(12); // length\n                    writeByte(3); // nrofcomponents\n                    writeByte(1); // IdY\n                    writeByte(0); // HTY\n                    writeByte(2); // IdU\n                    writeByte(0x11); // HTU\n                    writeByte(3); // IdV\n                    writeByte(0x11); // HTV\n                    writeByte(0); // Ss\n                    writeByte(0x3f); // Se\n                    writeByte(0); // Bf\n                }\n    \n                function processDU(CDU, fdtbl, DC, HTDC, HTAC){\n                    var EOB = HTAC[0x00];\n                    var M16zeroes = HTAC[0xF0];\n                    var pos;\n                    var I16 = 16;\n                    var I63 = 63;\n                    var I64 = 64;\n                    var DU_DCT = fDCTQuant(CDU, fdtbl);\n                    //ZigZag reorder\n                    for (var j=0;j<I64;++j) {\n                        DU[ZigZag[j]]=DU_DCT[j];\n                    }\n                    var Diff = DU[0] - DC; DC = DU[0];\n                    //Encode DC\n                    if (Diff==0) {\n                        writeBits(HTDC[0]); // Diff might be 0\n                    } else {\n                        pos = 32767+Diff;\n                        writeBits(HTDC[category[pos]]);\n                        writeBits(bitcode[pos]);\n                    }\n                    //Encode ACs\n                    var end0pos = 63; // was const... which is crazy\n                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};\n                    //end0pos = first element in reverse order !=0\n                    if ( end0pos == 0) {\n                        writeBits(EOB);\n                        return DC;\n                    }\n                    var i = 1;\n                    var lng;\n                    while ( i <= end0pos ) {\n                        var startpos = i;\n                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}\n                        var nrzeroes = i-startpos;\n                        if ( nrzeroes >= I16 ) {\n                            lng = nrzeroes>>4;\n                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)\n                                writeBits(M16zeroes);\n                            nrzeroes = nrzeroes&0xF;\n                        }\n                        pos = 32767+DU[i];\n                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);\n                        writeBits(bitcode[pos]);\n                        i++;\n                    }\n                    if ( end0pos != I63 ) {\n                        writeBits(EOB);\n                    }\n                    return DC;\n                }\n    \n                function initCharLookupTable(){\n                    var sfcc = String.fromCharCode;\n                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255\n                        clt[i] = sfcc(i);\n                    }\n                }\n    \n                this.encode = function(image,quality) // image data object\n                {\n                    // var time_start = new Date().getTime();\n    \n                    if(quality) setQuality(quality);\n    \n                    // Initialize bit writer\n                    byteout = new Array();\n                    bytenew=0;\n                    bytepos=7;\n    \n                    // Add JPEG headers\n                    writeWord(0xFFD8); // SOI\n                    writeAPP0();\n                    writeDQT();\n                    writeSOF0(image.width,image.height);\n                    writeDHT();\n                    writeSOS();\n    \n    \n                    // Encode 8x8 macroblocks\n                    var DCY=0;\n                    var DCU=0;\n                    var DCV=0;\n    \n                    bytenew=0;\n                    bytepos=7;\n    \n    \n                    this.encode.displayName = \"_encode_\";\n    \n                    var imageData = image.data;\n                    var width = image.width;\n                    var height = image.height;\n    \n                    var quadWidth = width*4;\n                    var tripleWidth = width*3;\n    \n                    var x, y = 0;\n                    var r, g, b;\n                    var start,p, col,row,pos;\n                    while(y < height){\n                        x = 0;\n                        while(x < quadWidth){\n                        start = quadWidth * y + x;\n                        p = start;\n                        col = -1;\n                        row = 0;\n    \n                        for(pos=0; pos < 64; pos++){\n                            row = pos >> 3;// /8\n                            col = ( pos & 7 ) * 4; // %8\n                            p = start + ( row * quadWidth ) + col;\n    \n                            if(y+row >= height){ // padding bottom\n                                p-= (quadWidth*(y+1+row-height));\n                            }\n    \n                            if(x+col >= quadWidth){ // padding right\n                                p-= ((x+col) - quadWidth +4)\n                            }\n    \n                            r = imageData[ p++ ];\n                            g = imageData[ p++ ];\n                            b = imageData[ p++ ];\n    \n    \n                            /* // calculate YUV values dynamically\n                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80\n                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));\n                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));\n                            */\n    \n                            // use lookup table (slightly faster)\n                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;\n                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;\n                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;\n    \n                        }\n    \n                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);\n                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);\n                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);\n                        x+=32;\n                        }\n                        y+=8;\n                    }\n    \n    \n                    ////////////////////////////////////////////////////////////////\n    \n                    // Do the bit alignment of the EOI marker\n                    if ( bytepos >= 0 ) {\n                        var fillbits = [];\n                        fillbits[1] = bytepos+1;\n                        fillbits[0] = (1<<(bytepos+1))-1;\n                        writeBits(fillbits);\n                    }\n    \n                    writeWord(0xFFD9); //EOI\n    \n                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));\n    \n                    byteout = [];\n    \n                    // benchmarking\n                    // var duration = new Date().getTime() - time_start;\n                    // console.log('Encoding time: '+ currentQuality + 'ms');\n                    //\n    \n                    return jpegDataUri\n            }\n    \n            function setQuality(quality){\n                if (quality <= 0) {\n                    quality = 1;\n                }\n                if (quality > 100) {\n                    quality = 100;\n                }\n    \n                if(currentQuality == quality) return // don't recalc if unchanged\n    \n                var sf = 0;\n                if (quality < 50) {\n                    sf = Math.floor(5000 / quality);\n                } else {\n                    sf = Math.floor(200 - quality*2);\n                }\n    \n                initQuantTables(sf);\n                currentQuality = quality;\n                // console.log('Quality set to: '+quality +'%');\n            }\n    \n            function init(){\n                // var time_start = new Date().getTime();\n                if(!quality) quality = 50;\n                // Create tables\n                initCharLookupTable()\n                initHuffmanTbl();\n                initCategoryNumber();\n                initRGBYUVTable();\n    \n                setQuality(quality);\n                // var duration = new Date().getTime() - time_start;\n                // console.log('Initialization '+ duration + 'ms');\n            }\n    \n            init();\n    \n        };\n    \n        JPEGEncoder.encode = function( data, quality ) {\n            var encoder = new JPEGEncoder( quality );\n    \n            return encoder.encode( data );\n        }\n    \n        return JPEGEncoder;\n    });\n    /**\n     * @fileOverview Fix android canvas.toDataUrl bug.\n     */\n    define('runtime/html5/androidpatch',[\n        'runtime/html5/util',\n        'runtime/html5/jpegencoder',\n        'base'\n    ], function( Util, encoder, Base ) {\n        var origin = Util.canvasToDataUrl,\n            supportJpeg;\n    \n        Util.canvasToDataUrl = function( canvas, type, quality ) {\n            var ctx, w, h, fragement, parts;\n    \n            // 非android手机直接跳过。\n            if ( !Base.os.android ) {\n                return origin.apply( null, arguments );\n            }\n    \n            // 检测是否canvas支持jpeg导出，根据数据格式来判断。\n            // JPEG 前两位分别是：255, 216\n            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {\n                fragement = origin.apply( null, arguments );\n    \n                parts = fragement.split(',');\n    \n                if ( ~parts[ 0 ].indexOf('base64') ) {\n                    fragement = atob( parts[ 1 ] );\n                } else {\n                    fragement = decodeURIComponent( parts[ 1 ] );\n                }\n    \n                fragement = fragement.substring( 0, 2 );\n    \n                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&\n                        fragement.charCodeAt( 1 ) === 216;\n            }\n    \n            // 只有在android环境下才修复\n            if ( type === 'image/jpeg' && !supportJpeg ) {\n                w = canvas.width;\n                h = canvas.height;\n                ctx = canvas.getContext('2d');\n    \n                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );\n            }\n    \n            return origin.apply( null, arguments );\n        };\n    });\n    /**\n     * @fileOverview Transport\n     * @todo 支持chunked传输，优势：\n     * 可以将大文件分成小块，挨个传输，可以提高大文件成功率，当失败的时候，也只需要重传那小部分，\n     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。\n     */\n    define('runtime/html5/transport',[\n        'base',\n        'runtime/html5/runtime'\n    ], function( Base, Html5Runtime ) {\n    \n        var noop = Base.noop,\n            $ = Base.$;\n    \n        return Html5Runtime.register( 'Transport', {\n            init: function() {\n                this._status = 0;\n                this._response = null;\n            },\n    \n            send: function() {\n                var owner = this.owner,\n                    opts = this.options,\n                    xhr = this._initAjax(),\n                    blob = owner._blob,\n                    server = opts.server,\n                    formData, binary, fr;\n    \n                if ( opts.sendAsBinary ) {\n                    server += (/\\?/.test( server ) ? '&' : '?') +\n                            $.param( owner._formData );\n    \n                    binary = blob.getSource();\n                } else {\n                    formData = new FormData();\n                    $.each( owner._formData, function( k, v ) {\n                        formData.append( k, v );\n                    });\n    \n                    formData.append( opts.fileVal, blob.getSource(),\n                            opts.filename || owner._formData.name || '' );\n                }\n    \n                if ( opts.withCredentials && 'withCredentials' in xhr ) {\n                    xhr.open( opts.method, server, true );\n                    xhr.withCredentials = true;\n                } else {\n                    xhr.open( opts.method, server );\n                }\n    \n                this._setRequestHeader( xhr, opts.headers );\n    \n                if ( binary ) {\n                    xhr.overrideMimeType('application/octet-stream');\n    \n                    // android直接发送blob会导致服务端接收到的是空文件。\n                    // bug详情。\n                    // https://code.google.com/p/android/issues/detail?id=39882\n                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。\n                    if ( Base.os.android ) {\n                        fr = new FileReader();\n    \n                        fr.onload = function() {\n                            xhr.send( this.result );\n                            fr = fr.onload = null;\n                        };\n    \n                        fr.readAsArrayBuffer( binary );\n                    } else {\n                        xhr.send( binary );\n                    }\n                } else {\n                    xhr.send( formData );\n                }\n            },\n    \n            getResponse: function() {\n                return this._response;\n            },\n    \n            getResponseAsJson: function() {\n                return this._parseJson( this._response );\n            },\n    \n            getStatus: function() {\n                return this._status;\n            },\n    \n            abort: function() {\n                var xhr = this._xhr;\n    \n                if ( xhr ) {\n                    xhr.upload.onprogress = noop;\n                    xhr.onreadystatechange = noop;\n                    xhr.abort();\n    \n                    this._xhr = xhr = null;\n                }\n            },\n    \n            destroy: function() {\n                this.abort();\n            },\n    \n            _initAjax: function() {\n                var me = this,\n                    xhr = new XMLHttpRequest(),\n                    opts = this.options;\n    \n                if ( opts.withCredentials && !('withCredentials' in xhr) &&\n                        typeof XDomainRequest !== 'undefined' ) {\n                    xhr = new XDomainRequest();\n                }\n    \n                xhr.upload.onprogress = function( e ) {\n                    var percentage = 0;\n    \n                    if ( e.lengthComputable ) {\n                        percentage = e.loaded / e.total;\n                    }\n    \n                    return me.trigger( 'progress', percentage );\n                };\n    \n                xhr.onreadystatechange = function() {\n    \n                    if ( xhr.readyState !== 4 ) {\n                        return;\n                    }\n    \n                    xhr.upload.onprogress = noop;\n                    xhr.onreadystatechange = noop;\n                    me._xhr = null;\n                    me._status = xhr.status;\n    \n                    if ( xhr.status >= 200 && xhr.status < 300 ) {\n                        me._response = xhr.responseText;\n                        return me.trigger('load');\n                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {\n                        me._response = xhr.responseText;\n                        return me.trigger( 'error', 'server' );\n                    }\n    \n    \n                    return me.trigger( 'error', me._status ? 'http' : 'abort' );\n                };\n    \n                me._xhr = xhr;\n                return xhr;\n            },\n    \n            _setRequestHeader: function( xhr, headers ) {\n                $.each( headers, function( key, val ) {\n                    xhr.setRequestHeader( key, val );\n                });\n            },\n    \n            _parseJson: function( str ) {\n                var json;\n    \n                try {\n                    json = JSON.parse( str );\n                } catch ( ex ) {\n                    json = {};\n                }\n    \n                return json;\n            }\n        });\n    });\n    define('webuploader',[\n        'base',\n        'widgets/filepicker',\n        'widgets/image',\n        'widgets/queue',\n        'widgets/runtime',\n        'widgets/upload',\n        'runtime/html5/blob',\n        'runtime/html5/filepicker',\n        'runtime/html5/imagemeta/exif',\n        'runtime/html5/image',\n        'runtime/html5/androidpatch',\n        'runtime/html5/transport'\n    ], function( Base ) {\n        return Base;\n    });\n    return require('webuploader');\n});\n"
  },
  {
    "path": "static/common/user/uedit/third-party/webuploader/webuploader.flashonly.js",
    "content": "/*! WebUploader 0.1.2 */\n\n\n/**\n * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。\n *\n * AMD API 内部的简单不完全实现，请忽略。只有当WebUploader被合并成一个文件的时候才会引入。\n */\n(function( root, factory ) {\n    var modules = {},\n\n        // 内部require, 简单不完全实现。\n        // https://github.com/amdjs/amdjs-api/wiki/require\n        _require = function( deps, callback ) {\n            var args, len, i;\n\n            // 如果deps不是数组，则直接返回指定module\n            if ( typeof deps === 'string' ) {\n                return getModule( deps );\n            } else {\n                args = [];\n                for( len = deps.length, i = 0; i < len; i++ ) {\n                    args.push( getModule( deps[ i ] ) );\n                }\n\n                return callback.apply( null, args );\n            }\n        },\n\n        // 内部define，暂时不支持不指定id.\n        _define = function( id, deps, factory ) {\n            if ( arguments.length === 2 ) {\n                factory = deps;\n                deps = null;\n            }\n\n            _require( deps || [], function() {\n                setModule( id, factory, arguments );\n            });\n        },\n\n        // 设置module, 兼容CommonJs写法。\n        setModule = function( id, factory, args ) {\n            var module = {\n                    exports: factory\n                },\n                returned;\n\n            if ( typeof factory === 'function' ) {\n                args.length || (args = [ _require, module.exports, module ]);\n                returned = factory.apply( null, args );\n                returned !== undefined && (module.exports = returned);\n            }\n\n            modules[ id ] = module.exports;\n        },\n\n        // 根据id获取module\n        getModule = function( id ) {\n            var module = modules[ id ] || root[ id ];\n\n            if ( !module ) {\n                throw new Error( '`' + id + '` is undefined' );\n            }\n\n            return module;\n        },\n\n        // 将所有modules，将路径ids装换成对象。\n        exportsTo = function( obj ) {\n            var key, host, parts, part, last, ucFirst;\n\n            // make the first character upper case.\n            ucFirst = function( str ) {\n                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));\n            };\n\n            for ( key in modules ) {\n                host = obj;\n\n                if ( !modules.hasOwnProperty( key ) ) {\n                    continue;\n                }\n\n                parts = key.split('/');\n                last = ucFirst( parts.pop() );\n\n                while( (part = ucFirst( parts.shift() )) ) {\n                    host[ part ] = host[ part ] || {};\n                    host = host[ part ];\n                }\n\n                host[ last ] = modules[ key ];\n            }\n        },\n\n        exports = factory( root, _define, _require ),\n        origin;\n\n    // exports every module.\n    exportsTo( exports );\n\n    if ( typeof module === 'object' && typeof module.exports === 'object' ) {\n\n        // For CommonJS and CommonJS-like environments where a proper window is present,\n        module.exports = exports;\n    } else if ( typeof define === 'function' && define.amd ) {\n\n        // Allow using this built library as an AMD module\n        // in another project. That other project will only\n        // see this AMD call, not the internal modules in\n        // the closure below.\n        define([], exports );\n    } else {\n\n        // Browser globals case. Just assign the\n        // result to a property on the global.\n        origin = root.WebUploader;\n        root.WebUploader = exports;\n        root.WebUploader.noConflict = function() {\n            root.WebUploader = origin;\n        };\n    }\n})( this, function( window, define, require ) {\n\n\n    /**\n     * @fileOverview jQuery or Zepto\n     */\n    define('dollar-third',[],function() {\n        return window.jQuery || window.Zepto;\n    });\n    /**\n     * @fileOverview Dom 操作相关\n     */\n    define('dollar',[\n        'dollar-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 使用jQuery的Promise\n     */\n    define('promise-third',[\n        'dollar'\n    ], function( $ ) {\n        return {\n            Deferred: $.Deferred,\n            when: $.when,\n    \n            isPromise: function( anything ) {\n                return anything && typeof anything.then === 'function';\n            }\n        };\n    });\n    /**\n     * @fileOverview Promise/A+\n     */\n    define('promise',[\n        'promise-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 基础类方法。\n     */\n    \n    /**\n     * Web Uploader内部类的详细说明，以下提及的功能类，都可以在`WebUploader`这个变量中访问到。\n     *\n     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.\n     * 默认module id该文件的路径，而此路径将会转化成名字空间存放在WebUploader中。如：\n     *\n     * * module `base`：WebUploader.Base\n     * * module `file`: WebUploader.File\n     * * module `lib/dnd`: WebUploader.Lib.Dnd\n     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd\n     *\n     *\n     * 以下文档将可能省略`WebUploader`前缀。\n     * @module WebUploader\n     * @title WebUploader API文档\n     */\n    define('base',[\n        'dollar',\n        'promise'\n    ], function( $, promise ) {\n    \n        var noop = function() {},\n            call = Function.call;\n    \n        // http://jsperf.com/uncurrythis\n        // 反科里化\n        function uncurryThis( fn ) {\n            return function() {\n                return call.apply( fn, arguments );\n            };\n        }\n    \n        function bindFn( fn, context ) {\n            return function() {\n                return fn.apply( context, arguments );\n            };\n        }\n    \n        function createObject( proto ) {\n            var f;\n    \n            if ( Object.create ) {\n                return Object.create( proto );\n            } else {\n                f = function() {};\n                f.prototype = proto;\n                return new f();\n            }\n        }\n    \n    \n        /**\n         * 基础类，提供一些简单常用的方法。\n         * @class Base\n         */\n        return {\n    \n            /**\n             * @property {String} version 当前版本号。\n             */\n            version: '0.1.2',\n    \n            /**\n             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。\n             */\n            $: $,\n    \n            Deferred: promise.Deferred,\n    \n            isPromise: promise.isPromise,\n    \n            when: promise.when,\n    \n            /**\n             * @description  简单的浏览器检查结果。\n             *\n             * * `webkit`  webkit版本号，如果浏览器为非webkit内核，此属性为`undefined`。\n             * * `chrome`  chrome浏览器版本号，如果浏览器为chrome，此属性为`undefined`。\n             * * `ie`  ie浏览器版本号，如果浏览器为非ie，此属性为`undefined`。**暂不支持ie10+**\n             * * `firefox`  firefox浏览器版本号，如果浏览器为非firefox，此属性为`undefined`。\n             * * `safari`  safari浏览器版本号，如果浏览器为非safari，此属性为`undefined`。\n             * * `opera`  opera浏览器版本号，如果浏览器为非opera，此属性为`undefined`。\n             *\n             * @property {Object} [browser]\n             */\n            browser: (function( ua ) {\n                var ret = {},\n                    webkit = ua.match( /WebKit\\/([\\d.]+)/ ),\n                    chrome = ua.match( /Chrome\\/([\\d.]+)/ ) ||\n                        ua.match( /CriOS\\/([\\d.]+)/ ),\n    \n                    ie = ua.match( /MSIE\\s([\\d\\.]+)/ ) ||\n                        ua.match(/(?:trident)(?:.*rv:([\\w.]+))?/i),\n                    firefox = ua.match( /Firefox\\/([\\d.]+)/ ),\n                    safari = ua.match( /Safari\\/([\\d.]+)/ ),\n                    opera = ua.match( /OPR\\/([\\d.]+)/ );\n    \n                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));\n                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));\n                ie && (ret.ie = parseFloat( ie[ 1 ] ));\n                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));\n                safari && (ret.safari = parseFloat( safari[ 1 ] ));\n                opera && (ret.opera = parseFloat( opera[ 1 ] ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * @description  操作系统检查结果。\n             *\n             * * `android`  如果在android浏览器环境下，此值为对应的android版本号，否则为`undefined`。\n             * * `ios` 如果在ios浏览器环境下，此值为对应的ios版本号，否则为`undefined`。\n             * @property {Object} [os]\n             */\n            os: (function( ua ) {\n                var ret = {},\n    \n                    // osx = !!ua.match( /\\(Macintosh\\; Intel / ),\n                    android = ua.match( /(?:Android);?[\\s\\/]+([\\d.]+)?/ ),\n                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\\s([\\d_]+)/ );\n    \n                // osx && (ret.osx = true);\n                android && (ret.android = parseFloat( android[ 1 ] ));\n                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * 实现类与类之间的继承。\n             * @method inherits\n             * @grammar Base.inherits( super ) => child\n             * @grammar Base.inherits( super, protos ) => child\n             * @grammar Base.inherits( super, protos, statics ) => child\n             * @param  {Class} super 父类\n             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor，子类将是用此属性值。\n             * @param  {Function} [protos.constructor] 子类构造器，不指定的话将创建个临时的直接执行父类构造器的方法。\n             * @param  {Object} [statics] 静态属性或方法。\n             * @return {Class} 返回子类。\n             * @example\n             * function Person() {\n             *     console.log( 'Super' );\n             * }\n             * Person.prototype.hello = function() {\n             *     console.log( 'hello' );\n             * };\n             *\n             * var Manager = Base.inherits( Person, {\n             *     world: function() {\n             *         console.log( 'World' );\n             *     }\n             * });\n             *\n             * // 因为没有指定构造器，父类的构造器将会执行。\n             * var instance = new Manager();    // => Super\n             *\n             * // 继承子父类的方法\n             * instance.hello();    // => hello\n             * instance.world();    // => World\n             *\n             * // 子类的__super__属性指向父类\n             * console.log( Manager.__super__ === Person );    // => true\n             */\n            inherits: function( Super, protos, staticProtos ) {\n                var child;\n    \n                if ( typeof protos === 'function' ) {\n                    child = protos;\n                    protos = null;\n                } else if ( protos && protos.hasOwnProperty('constructor') ) {\n                    child = protos.constructor;\n                } else {\n                    child = function() {\n                        return Super.apply( this, arguments );\n                    };\n                }\n    \n                // 复制静态方法\n                $.extend( true, child, Super, staticProtos || {} );\n    \n                /* jshint camelcase: false */\n    \n                // 让子类的__super__属性指向父类。\n                child.__super__ = Super.prototype;\n    \n                // 构建原型，添加原型方法或属性。\n                // 暂时用Object.create实现。\n                child.prototype = createObject( Super.prototype );\n                protos && $.extend( true, child.prototype, protos );\n    \n                return child;\n            },\n    \n            /**\n             * 一个不做任何事情的方法。可以用来赋值给默认的callback.\n             * @method noop\n             */\n            noop: noop,\n    \n            /**\n             * 返回一个新的方法，此方法将已指定的`context`来执行。\n             * @grammar Base.bindFn( fn, context ) => Function\n             * @method bindFn\n             * @example\n             * var doSomething = function() {\n             *         console.log( this.name );\n             *     },\n             *     obj = {\n             *         name: 'Object Name'\n             *     },\n             *     aliasFn = Base.bind( doSomething, obj );\n             *\n             *  aliasFn();    // => Object Name\n             *\n             */\n            bindFn: bindFn,\n    \n            /**\n             * 引用Console.log如果存在的话，否则引用一个[空函数loop](#WebUploader:Base.log)。\n             * @grammar Base.log( args... ) => undefined\n             * @method log\n             */\n            log: (function() {\n                if ( window.console ) {\n                    return bindFn( console.log, console );\n                }\n                return noop;\n            })(),\n    \n            nextTick: (function() {\n    \n                return function( cb ) {\n                    setTimeout( cb, 1 );\n                };\n    \n                // @bug 当浏览器不在当前窗口时就停了。\n                // var next = window.requestAnimationFrame ||\n                //     window.webkitRequestAnimationFrame ||\n                //     window.mozRequestAnimationFrame ||\n                //     function( cb ) {\n                //         window.setTimeout( cb, 1000 / 60 );\n                //     };\n    \n                // // fix: Uncaught TypeError: Illegal invocation\n                // return bindFn( next, window );\n            })(),\n    \n            /**\n             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。\n             * 将用来将非数组对象转化成数组对象。\n             * @grammar Base.slice( target, start[, end] ) => Array\n             * @method slice\n             * @example\n             * function doSomthing() {\n             *     var args = Base.slice( arguments, 1 );\n             *     console.log( args );\n             * }\n             *\n             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array [\"arg2\", \"arg3\"]\n             */\n            slice: uncurryThis( [].slice ),\n    \n            /**\n             * 生成唯一的ID\n             * @method guid\n             * @grammar Base.guid() => String\n             * @grammar Base.guid( prefx ) => String\n             */\n            guid: (function() {\n                var counter = 0;\n    \n                return function( prefix ) {\n                    var guid = (+new Date()).toString( 32 ),\n                        i = 0;\n    \n                    for ( ; i < 5; i++ ) {\n                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );\n                    }\n    \n                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );\n                };\n            })(),\n    \n            /**\n             * 格式化文件大小, 输出成带单位的字符串\n             * @method formatSize\n             * @grammar Base.formatSize( size ) => String\n             * @grammar Base.formatSize( size, pointLength ) => String\n             * @grammar Base.formatSize( size, pointLength, units ) => String\n             * @param {Number} size 文件大小\n             * @param {Number} [pointLength=2] 精确到的小数点数。\n             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节，到千字节，一直往上指定。如果单位数组里面只指定了到了K(千字节)，同时文件大小大于M, 此方法的输出将还是显示成多少K.\n             * @example\n             * console.log( Base.formatSize( 100 ) );    // => 100B\n             * console.log( Base.formatSize( 1024 ) );    // => 1.00K\n             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K\n             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M\n             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G\n             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB\n             */\n            formatSize: function( size, pointLength, units ) {\n                var unit;\n    \n                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];\n    \n                while ( (unit = units.shift()) && size > 1024 ) {\n                    size = size / 1024;\n                }\n    \n                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +\n                        unit;\n            }\n        };\n    });\n    /**\n     * 事件处理类，可以独立使用，也可以扩展给对象使用。\n     * @fileOverview Mediator\n     */\n    define('mediator',[\n        'base'\n    ], function( Base ) {\n        var $ = Base.$,\n            slice = [].slice,\n            separator = /\\s+/,\n            protos;\n    \n        // 根据条件过滤出事件handlers.\n        function findHandlers( arr, name, callback, context ) {\n            return $.grep( arr, function( handler ) {\n                return handler &&\n                        (!name || handler.e === name) &&\n                        (!callback || handler.cb === callback ||\n                        handler.cb._cb === callback) &&\n                        (!context || handler.ctx === context);\n            });\n        }\n    \n        function eachEvent( events, callback, iterator ) {\n            // 不支持对象，只支持多个event用空格隔开\n            $.each( (events || '').split( separator ), function( _, key ) {\n                iterator( key, callback );\n            });\n        }\n    \n        function triggerHanders( events, args ) {\n            var stoped = false,\n                i = -1,\n                len = events.length,\n                handler;\n    \n            while ( ++i < len ) {\n                handler = events[ i ];\n    \n                if ( handler.cb.apply( handler.ctx2, args ) === false ) {\n                    stoped = true;\n                    break;\n                }\n            }\n    \n            return !stoped;\n        }\n    \n        protos = {\n    \n            /**\n             * 绑定事件。\n             *\n             * `callback`方法在执行时，arguments将会来源于trigger的时候携带的参数。如\n             * ```javascript\n             * var obj = {};\n             *\n             * // 使得obj有事件行为\n             * Mediator.installTo( obj );\n             *\n             * obj.on( 'testa', function( arg1, arg2 ) {\n             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'\n             * });\n             *\n             * obj.trigger( 'testa', 'arg1', 'arg2' );\n             * ```\n             *\n             * 如果`callback`中，某一个方法`return false`了，则后续的其他`callback`都不会被执行到。\n             * 切会影响到`trigger`方法的返回值，为`false`。\n             *\n             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处，\n             * 就是第一个参数为`type`，记录当前是什么事件在触发。此类`callback`的优先级比脚低，会再正常`callback`执行完后触发。\n             * ```javascript\n             * obj.on( 'all', function( type, arg1, arg2 ) {\n             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'\n             * });\n             * ```\n             *\n             * @method on\n             * @grammar on( name, callback[, context] ) => self\n             * @param  {String}   name     事件名，支持多个事件用空格隔开\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             * @class Mediator\n             */\n            on: function( name, callback, context ) {\n                var me = this,\n                    set;\n    \n                if ( !callback ) {\n                    return this;\n                }\n    \n                set = this._events || (this._events = []);\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var handler = { e: name };\n    \n                    handler.cb = callback;\n                    handler.ctx = context;\n                    handler.ctx2 = context || me;\n                    handler.id = set.length;\n    \n                    set.push( handler );\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 绑定事件，且当handler执行完后，自动解除绑定。\n             * @method once\n             * @grammar once( name, callback[, context] ) => self\n             * @param  {String}   name     事件名\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            once: function( name, callback, context ) {\n                var me = this;\n    \n                if ( !callback ) {\n                    return me;\n                }\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var once = function() {\n                            me.off( name, once );\n                            return callback.apply( context || me, arguments );\n                        };\n    \n                    once._cb = callback;\n                    me.on( name, once, context );\n                });\n    \n                return me;\n            },\n    \n            /**\n             * 解除事件绑定\n             * @method off\n             * @grammar off( [name[, callback[, context] ] ] ) => self\n             * @param  {String}   [name]     事件名\n             * @param  {Function} [callback] 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            off: function( name, cb, ctx ) {\n                var events = this._events;\n    \n                if ( !events ) {\n                    return this;\n                }\n    \n                if ( !name && !cb && !ctx ) {\n                    this._events = [];\n                    return this;\n                }\n    \n                eachEvent( name, cb, function( name, cb ) {\n                    $.each( findHandlers( events, name, cb, ctx ), function() {\n                        delete events[ this.id ];\n                    });\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 触发事件\n             * @method trigger\n             * @grammar trigger( name[, args...] ) => self\n             * @param  {String}   type     事件名\n             * @param  {*} [...] 任意参数\n             * @return {Boolean} 如果handler中return false了，则返回false, 否则返回true\n             */\n            trigger: function( type ) {\n                var args, events, allEvents;\n    \n                if ( !this._events || !type ) {\n                    return this;\n                }\n    \n                args = slice.call( arguments, 1 );\n                events = findHandlers( this._events, type );\n                allEvents = findHandlers( this._events, 'all' );\n    \n                return triggerHanders( events, args ) &&\n                        triggerHanders( allEvents, arguments );\n            }\n        };\n    \n        /**\n         * 中介者，它本身是个单例，但可以通过[installTo](#WebUploader:Mediator:installTo)方法，使任何对象具备事件行为。\n         * 主要目的是负责模块与模块之间的合作，降低耦合度。\n         *\n         * @class Mediator\n         */\n        return $.extend({\n    \n            /**\n             * 可以通过这个接口，使任何对象具备事件功能。\n             * @method installTo\n             * @param  {Object} obj 需要具备事件行为的对象。\n             * @return {Object} 返回obj.\n             */\n            installTo: function( obj ) {\n                return $.extend( obj, protos );\n            }\n    \n        }, protos );\n    });\n    /**\n     * @fileOverview Uploader上传类\n     */\n    define('uploader',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$;\n    \n        /**\n         * 上传入口类。\n         * @class Uploader\n         * @constructor\n         * @grammar new Uploader( opts ) => Uploader\n         * @example\n         * var uploader = WebUploader.Uploader({\n         *     swf: 'path_of_swf/Uploader.swf',\n         *\n         *     // 开起分片上传。\n         *     chunked: true\n         * });\n         */\n        function Uploader( opts ) {\n            this.options = $.extend( true, {}, Uploader.options, opts );\n            this._init( this.options );\n        }\n    \n        // default Options\n        // widgets中有相应扩展\n        Uploader.options = {};\n        Mediator.installTo( Uploader.prototype );\n    \n        // 批量添加纯命令式方法。\n        $.each({\n            upload: 'start-upload',\n            stop: 'stop-upload',\n            getFile: 'get-file',\n            getFiles: 'get-files',\n            addFile: 'add-file',\n            addFiles: 'add-file',\n            sort: 'sort-files',\n            removeFile: 'remove-file',\n            skipFile: 'skip-file',\n            retry: 'retry',\n            isInProgress: 'is-in-progress',\n            makeThumb: 'make-thumb',\n            getDimension: 'get-dimension',\n            addButton: 'add-btn',\n            getRuntimeType: 'get-runtime-type',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable',\n            reset: 'reset'\n        }, function( fn, command ) {\n            Uploader.prototype[ fn ] = function() {\n                return this.request( command, arguments );\n            };\n        });\n    \n        $.extend( Uploader.prototype, {\n            state: 'pending',\n    \n            _init: function( opts ) {\n                var me = this;\n    \n                me.request( 'init', opts, function() {\n                    me.state = 'ready';\n                    me.trigger('ready');\n                });\n            },\n    \n            /**\n             * 获取或者设置Uploader配置项。\n             * @method option\n             * @grammar option( key ) => *\n             * @grammar option( key, val ) => self\n             * @example\n             *\n             * // 初始状态图片上传前不会压缩\n             * var uploader = new WebUploader.Uploader({\n             *     resize: null;\n             * });\n             *\n             * // 修改后图片上传前，尝试将图片压缩到1600 * 1600\n             * uploader.options( 'resize', {\n             *     width: 1600,\n             *     height: 1600\n             * });\n             */\n            option: function( key, val ) {\n                var opts = this.options;\n    \n                // setter\n                if ( arguments.length > 1 ) {\n    \n                    if ( $.isPlainObject( val ) &&\n                            $.isPlainObject( opts[ key ] ) ) {\n                        $.extend( opts[ key ], val );\n                    } else {\n                        opts[ key ] = val;\n                    }\n    \n                } else {    // getter\n                    return key ? opts[ key ] : opts;\n                }\n            },\n    \n            /**\n             * 获取文件统计信息。返回一个包含一下信息的对象。\n             * * `successNum` 上传成功的文件数\n             * * `uploadFailNum` 上传失败的文件数\n             * * `cancelNum` 被删除的文件数\n             * * `invalidNum` 无效的文件数\n             * * `queueNum` 还在队列中的文件数\n             * @method getStats\n             * @grammar getStats() => Object\n             */\n            getStats: function() {\n                // return this._mgr.getStats.apply( this._mgr, arguments );\n                var stats = this.request('get-stats');\n    \n                return {\n                    successNum: stats.numOfSuccess,\n    \n                    // who care?\n                    // queueFailNum: 0,\n                    cancelNum: stats.numOfCancel,\n                    invalidNum: stats.numOfInvalid,\n                    uploadFailNum: stats.numOfUploadFailed,\n                    queueNum: stats.numOfQueue\n                };\n            },\n    \n            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器\n            trigger: function( type/*, args...*/ ) {\n                var args = [].slice.call( arguments, 1 ),\n                    opts = this.options,\n                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +\n                        type.substring( 1 );\n    \n                if (\n                        // 调用通过on方法注册的handler.\n                        Mediator.trigger.apply( this, arguments ) === false ||\n    \n                        // 调用opts.onEvent\n                        $.isFunction( opts[ name ] ) &&\n                        opts[ name ].apply( this, args ) === false ||\n    \n                        // 调用this.onEvent\n                        $.isFunction( this[ name ] ) &&\n                        this[ name ].apply( this, args ) === false ||\n    \n                        // 广播所有uploader的事件。\n                        Mediator.trigger.apply( Mediator,\n                        [ this, type ].concat( args ) ) === false ) {\n    \n                    return false;\n                }\n    \n                return true;\n            },\n    \n            // widgets/widget.js将补充此方法的详细文档。\n            request: Base.noop\n        });\n    \n        /**\n         * 创建Uploader实例，等同于new Uploader( opts );\n         * @method create\n         * @class Base\n         * @static\n         * @grammar Base.create( opts ) => Uploader\n         */\n        Base.create = Uploader.create = function( opts ) {\n            return new Uploader( opts );\n        };\n    \n        // 暴露Uploader，可以通过它来扩展业务逻辑。\n        Base.Uploader = Uploader;\n    \n        return Uploader;\n    });\n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/runtime',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            factories = {},\n    \n            // 获取对象的第一个key\n            getFirstKey = function( obj ) {\n                for ( var key in obj ) {\n                    if ( obj.hasOwnProperty( key ) ) {\n                        return key;\n                    }\n                }\n                return null;\n            };\n    \n        // 接口类。\n        function Runtime( options ) {\n            this.options = $.extend({\n                container: document.body\n            }, options );\n            this.uid = Base.guid('rt_');\n        }\n    \n        $.extend( Runtime.prototype, {\n    \n            getContainer: function() {\n                var opts = this.options,\n                    parent, container;\n    \n                if ( this._container ) {\n                    return this._container;\n                }\n    \n                parent = $( opts.container || document.body );\n                container = $( document.createElement('div') );\n    \n                container.attr( 'id', 'rt_' + this.uid );\n                container.css({\n                    position: 'absolute',\n                    top: '0px',\n                    left: '0px',\n                    width: '1px',\n                    height: '1px',\n                    overflow: 'hidden'\n                });\n    \n                parent.append( container );\n                parent.addClass('webuploader-container');\n                this._container = container;\n                return container;\n            },\n    \n            init: Base.noop,\n            exec: Base.noop,\n    \n            destroy: function() {\n                if ( this._container ) {\n                    this._container.parentNode.removeChild( this.__container );\n                }\n    \n                this.off();\n            }\n        });\n    \n        Runtime.orders = 'html5,flash';\n    \n    \n        /**\n         * 添加Runtime实现。\n         * @param {String} type    类型\n         * @param {Runtime} factory 具体Runtime实现。\n         */\n        Runtime.addRuntime = function( type, factory ) {\n            factories[ type ] = factory;\n        };\n    \n        Runtime.hasRuntime = function( type ) {\n            return !!(type ? factories[ type ] : getFirstKey( factories ));\n        };\n    \n        Runtime.create = function( opts, orders ) {\n            var type, runtime;\n    \n            orders = orders || Runtime.orders;\n            $.each( orders.split( /\\s*,\\s*/g ), function() {\n                if ( factories[ this ] ) {\n                    type = this;\n                    return false;\n                }\n            });\n    \n            type = type || getFirstKey( factories );\n    \n            if ( !type ) {\n                throw new Error('Runtime Error');\n            }\n    \n            runtime = new factories[ type ]( opts );\n            return runtime;\n        };\n    \n        Mediator.installTo( Runtime.prototype );\n        return Runtime;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/client',[\n        'base',\n        'mediator',\n        'runtime/runtime'\n    ], function( Base, Mediator, Runtime ) {\n    \n        var cache;\n    \n        cache = (function() {\n            var obj = {};\n    \n            return {\n                add: function( runtime ) {\n                    obj[ runtime.uid ] = runtime;\n                },\n    \n                get: function( ruid, standalone ) {\n                    var i;\n    \n                    if ( ruid ) {\n                        return obj[ ruid ];\n                    }\n    \n                    for ( i in obj ) {\n                        // 有些类型不能重用，比如filepicker.\n                        if ( standalone && obj[ i ].__standalone ) {\n                            continue;\n                        }\n    \n                        return obj[ i ];\n                    }\n    \n                    return null;\n                },\n    \n                remove: function( runtime ) {\n                    delete obj[ runtime.uid ];\n                }\n            };\n        })();\n    \n        function RuntimeClient( component, standalone ) {\n            var deferred = Base.Deferred(),\n                runtime;\n    \n            this.uid = Base.guid('client_');\n    \n            // 允许runtime没有初始化之前，注册一些方法在初始化后执行。\n            this.runtimeReady = function( cb ) {\n                return deferred.done( cb );\n            };\n    \n            this.connectRuntime = function( opts, cb ) {\n    \n                // already connected.\n                if ( runtime ) {\n                    throw new Error('already connected!');\n                }\n    \n                deferred.done( cb );\n    \n                if ( typeof opts === 'string' && cache.get( opts ) ) {\n                    runtime = cache.get( opts );\n                }\n    \n                // 像filePicker只能独立存在，不能公用。\n                runtime = runtime || cache.get( null, standalone );\n    \n                // 需要创建\n                if ( !runtime ) {\n                    runtime = Runtime.create( opts, opts.runtimeOrder );\n                    runtime.__promise = deferred.promise();\n                    runtime.once( 'ready', deferred.resolve );\n                    runtime.init();\n                    cache.add( runtime );\n                    runtime.__client = 1;\n                } else {\n                    // 来自cache\n                    Base.$.extend( runtime.options, opts );\n                    runtime.__promise.then( deferred.resolve );\n                    runtime.__client++;\n                }\n    \n                standalone && (runtime.__standalone = standalone);\n                return runtime;\n            };\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.disconnectRuntime = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                runtime.__client--;\n    \n                if ( runtime.__client <= 0 ) {\n                    cache.remove( runtime );\n                    delete runtime.__promise;\n                    runtime.destroy();\n                }\n    \n                runtime = null;\n            };\n    \n            this.exec = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                var args = Base.slice( arguments );\n                component && args.unshift( component );\n    \n                return runtime.exec.apply( this, args );\n            };\n    \n            this.getRuid = function() {\n                return runtime && runtime.uid;\n            };\n    \n            this.destroy = (function( destroy ) {\n                return function() {\n                    destroy && destroy.apply( this, arguments );\n                    this.trigger('destroy');\n                    this.off();\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                };\n            })( this.destroy );\n        }\n    \n        Mediator.installTo( RuntimeClient.prototype );\n        return RuntimeClient;\n    });\n    /**\n     * @fileOverview Blob\n     */\n    define('lib/blob',[\n        'base',\n        'runtime/client'\n    ], function( Base, RuntimeClient ) {\n    \n        function Blob( ruid, source ) {\n            var me = this;\n    \n            me.source = source;\n            me.ruid = ruid;\n    \n            RuntimeClient.call( me, 'Blob' );\n    \n            this.uid = source.uid || this.uid;\n            this.type = source.type || '';\n            this.size = source.size || 0;\n    \n            if ( ruid ) {\n                me.connectRuntime( ruid );\n            }\n        }\n    \n        Base.inherits( RuntimeClient, {\n            constructor: Blob,\n    \n            slice: function( start, end ) {\n                return this.exec( 'slice', start, end );\n            },\n    \n            getSource: function() {\n                return this.source;\n            }\n        });\n    \n        return Blob;\n    });\n    /**\n     * 为了统一化Flash的File和HTML5的File而存在。\n     * 以至于要调用Flash里面的File，也可以像调用HTML5版本的File一下。\n     * @fileOverview File\n     */\n    define('lib/file',[\n        'base',\n        'lib/blob'\n    ], function( Base, Blob ) {\n    \n        var uid = 1,\n            rExt = /\\.([^.]+)$/;\n    \n        function File( ruid, file ) {\n            var ext;\n    \n            Blob.apply( this, arguments );\n            this.name = file.name || ('untitled' + uid++);\n            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';\n    \n            // todo 支持其他类型文件的转换。\n    \n            // 如果有mimetype, 但是文件名里面没有找出后缀规律\n            if ( !ext && this.type ) {\n                ext = /\\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?\n                        RegExp.$1.toLowerCase() : '';\n                this.name += '.' + ext;\n            }\n    \n            // 如果没有指定mimetype, 但是知道文件后缀。\n            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {\n                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);\n            }\n    \n            this.ext = ext;\n            this.lastModifiedDate = file.lastModifiedDate ||\n                    (new Date()).toLocaleString();\n        }\n    \n        return Base.inherits( Blob, File );\n    });\n    \n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/filepicker',[\n        'base',\n        'runtime/client',\n        'lib/file'\n    ], function( Base, RuntimeClent, File ) {\n    \n        var $ = Base.$;\n    \n        function FilePicker( opts ) {\n            opts = this.options = $.extend({}, FilePicker.options, opts );\n    \n            opts.container = $( opts.id );\n    \n            if ( !opts.container.length ) {\n                throw new Error('按钮指定错误');\n            }\n    \n            opts.innerHTML = opts.innerHTML || opts.label ||\n                    opts.container.html() || '';\n    \n            opts.button = $( opts.button || document.createElement('div') );\n            opts.button.html( opts.innerHTML );\n            opts.container.html( opts.button );\n    \n            RuntimeClent.call( this, 'FilePicker', true );\n        }\n    \n        FilePicker.options = {\n            button: null,\n            container: null,\n            label: null,\n            innerHTML: null,\n            multiple: true,\n            accept: null,\n            name: 'file'\n        };\n    \n        Base.inherits( RuntimeClent, {\n            constructor: FilePicker,\n    \n            init: function() {\n                var me = this,\n                    opts = me.options,\n                    button = opts.button;\n    \n                button.addClass('webuploader-pick');\n    \n                me.on( 'all', function( type ) {\n                    var files;\n    \n                    switch ( type ) {\n                        case 'mouseenter':\n                            button.addClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'mouseleave':\n                            button.removeClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'change':\n                            files = me.exec('getFiles');\n                            me.trigger( 'select', $.map( files, function( file ) {\n                                file = new File( me.getRuid(), file );\n    \n                                // 记录来源。\n                                file._refer = opts.container;\n                                return file;\n                            }), opts.container );\n                            break;\n                    }\n                });\n    \n                me.connectRuntime( opts, function() {\n                    me.refresh();\n                    me.exec( 'init', opts );\n                    me.trigger('ready');\n                });\n    \n                $( window ).on( 'resize', function() {\n                    me.refresh();\n                });\n            },\n    \n            refresh: function() {\n                var shimContainer = this.getRuntime().getContainer(),\n                    button = this.options.button,\n                    width = button.outerWidth ?\n                            button.outerWidth() : button.width(),\n    \n                    height = button.outerHeight ?\n                            button.outerHeight() : button.height(),\n    \n                    pos = button.offset();\n    \n                width && height && shimContainer.css({\n                    bottom: 'auto',\n                    right: 'auto',\n                    width: width + 'px',\n                    height: height + 'px'\n                }).offset( pos );\n            },\n    \n            enable: function() {\n                var btn = this.options.button;\n    \n                btn.removeClass('webuploader-pick-disable');\n                this.refresh();\n            },\n    \n            disable: function() {\n                var btn = this.options.button;\n    \n                this.getRuntime().getContainer().css({\n                    top: '-99999px'\n                });\n    \n                btn.addClass('webuploader-pick-disable');\n            },\n    \n            destroy: function() {\n                if ( this.runtime ) {\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                }\n            }\n        });\n    \n        return FilePicker;\n    });\n    \n    /**\n     * @fileOverview 组件基类。\n     */\n    define('widgets/widget',[\n        'base',\n        'uploader'\n    ], function( Base, Uploader ) {\n    \n        var $ = Base.$,\n            _init = Uploader.prototype._init,\n            IGNORE = {},\n            widgetClass = [];\n    \n        function isArrayLike( obj ) {\n            if ( !obj ) {\n                return false;\n            }\n    \n            var length = obj.length,\n                type = $.type( obj );\n    \n            if ( obj.nodeType === 1 && length ) {\n                return true;\n            }\n    \n            return type === 'array' || type !== 'function' && type !== 'string' &&\n                    (length === 0 || typeof length === 'number' && length > 0 &&\n                    (length - 1) in obj);\n        }\n    \n        function Widget( uploader ) {\n            this.owner = uploader;\n            this.options = uploader.options;\n        }\n    \n        $.extend( Widget.prototype, {\n    \n            init: Base.noop,\n    \n            // 类Backbone的事件监听声明，监听uploader实例上的事件\n            // widget直接无法监听事件，事件只能通过uploader来传递\n            invoke: function( apiName, args ) {\n    \n                /*\n                    {\n                        'make-thumb': 'makeThumb'\n                    }\n                 */\n                var map = this.responseMap;\n    \n                // 如果无API响应声明则忽略\n                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||\n                        !$.isFunction( this[ map[ apiName ] ] ) ) {\n    \n                    return IGNORE;\n                }\n    \n                return this[ map[ apiName ] ].apply( this, args );\n    \n            },\n    \n            /**\n             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。\n             * @method request\n             * @grammar request( command, args ) => * | Promise\n             * @grammar request( command, args, callback ) => Promise\n             * @for  Uploader\n             */\n            request: function() {\n                return this.owner.request.apply( this.owner, arguments );\n            }\n        });\n    \n        // 扩展Uploader.\n        $.extend( Uploader.prototype, {\n    \n            // 覆写_init用来初始化widgets\n            _init: function() {\n                var me = this,\n                    widgets = me._widgets = [];\n    \n                $.each( widgetClass, function( _, klass ) {\n                    widgets.push( new klass( me ) );\n                });\n    \n                return _init.apply( me, arguments );\n            },\n    \n            request: function( apiName, args, callback ) {\n                var i = 0,\n                    widgets = this._widgets,\n                    len = widgets.length,\n                    rlts = [],\n                    dfds = [],\n                    widget, rlt, promise, key;\n    \n                args = isArrayLike( args ) ? args : [ args ];\n    \n                for ( ; i < len; i++ ) {\n                    widget = widgets[ i ];\n                    rlt = widget.invoke( apiName, args );\n    \n                    if ( rlt !== IGNORE ) {\n    \n                        // Deferred对象\n                        if ( Base.isPromise( rlt ) ) {\n                            dfds.push( rlt );\n                        } else {\n                            rlts.push( rlt );\n                        }\n                    }\n                }\n    \n                // 如果有callback，则用异步方式。\n                if ( callback || dfds.length ) {\n                    promise = Base.when.apply( Base, dfds );\n                    key = promise.pipe ? 'pipe' : 'then';\n    \n                    // 很重要不能删除。删除了会死循环。\n                    // 保证执行顺序。让callback总是在下一个tick中执行。\n                    return promise[ key ](function() {\n                                var deferred = Base.Deferred(),\n                                    args = arguments;\n    \n                                setTimeout(function() {\n                                    deferred.resolve.apply( deferred, args );\n                                }, 1 );\n    \n                                return deferred.promise();\n                            })[ key ]( callback || Base.noop );\n                } else {\n                    return rlts[ 0 ];\n                }\n            }\n        });\n    \n        /**\n         * 添加组件\n         * @param  {object} widgetProto 组件原型，构造函数通过constructor属性定义\n         * @param  {object} responseMap API名称与函数实现的映射\n         * @example\n         *     Uploader.register( {\n         *         init: function( options ) {},\n         *         makeThumb: function() {}\n         *     }, {\n         *         'make-thumb': 'makeThumb'\n         *     } );\n         */\n        Uploader.register = Widget.register = function( responseMap, widgetProto ) {\n            var map = { init: 'init' },\n                klass;\n    \n            if ( arguments.length === 1 ) {\n                widgetProto = responseMap;\n                widgetProto.responseMap = map;\n            } else {\n                widgetProto.responseMap = $.extend( map, responseMap );\n            }\n    \n            klass = Base.inherits( Widget, widgetProto );\n            widgetClass.push( klass );\n    \n            return klass;\n        };\n    \n        return Widget;\n    });\n    /**\n     * @fileOverview 文件选择相关\n     */\n    define('widgets/filepicker',[\n        'base',\n        'uploader',\n        'lib/filepicker',\n        'widgets/widget'\n    ], function( Base, Uploader, FilePicker ) {\n        var $ = Base.$;\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Selector | Object} [pick=undefined]\n             * @namespace options\n             * @for Uploader\n             * @description 指定选择文件的按钮容器，不指定则不创建按钮。\n             *\n             * * `id` {Seletor} 指定选择文件的按钮容器，不指定则不创建按钮。\n             * * `label` {String} 请采用 `innerHTML` 代替\n             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。\n             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。\n             */\n            pick: null,\n    \n            /**\n             * @property {Arroy} [accept=null]\n             * @namespace options\n             * @for Uploader\n             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表，所以这里需要分开指定。\n             *\n             * * `title` {String} 文字描述\n             * * `extensions` {String} 允许的文件后缀，不带点，多个用逗号分割。\n             * * `mimeTypes` {String} 多个用逗号分割。\n             *\n             * 如：\n             *\n             * ```\n             * {\n             *     title: 'Images',\n             *     extensions: 'gif,jpg,jpeg,bmp,png',\n             *     mimeTypes: 'image/*'\n             * }\n             * ```\n             */\n            accept: null/*{\n                title: 'Images',\n                extensions: 'gif,jpg,jpeg,bmp,png',\n                mimeTypes: 'image/*'\n            }*/\n        });\n    \n        return Uploader.register({\n            'add-btn': 'addButton',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable'\n        }, {\n    \n            init: function( opts ) {\n                this.pickers = [];\n                return opts.pick && this.addButton( opts.pick );\n            },\n    \n            refresh: function() {\n                $.each( this.pickers, function() {\n                    this.refresh();\n                });\n            },\n    \n            /**\n             * @method addButton\n             * @for Uploader\n             * @grammar addButton( pick ) => Promise\n             * @description\n             * 添加文件选择按钮，如果一个按钮不够，需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。\n             * @example\n             * uploader.addButton({\n             *     id: '#btnContainer',\n             *     innerHTML: '选择文件'\n             * });\n             */\n            addButton: function( pick ) {\n                var me = this,\n                    opts = me.options,\n                    accept = opts.accept,\n                    options, picker, deferred;\n    \n                if ( !pick ) {\n                    return;\n                }\n    \n                deferred = Base.Deferred();\n                $.isPlainObject( pick ) || (pick = {\n                    id: pick\n                });\n    \n                options = $.extend({}, pick, {\n                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,\n                    swf: opts.swf,\n                    runtimeOrder: opts.runtimeOrder\n                });\n    \n                picker = new FilePicker( options );\n    \n                picker.once( 'ready', deferred.resolve );\n                picker.on( 'select', function( files ) {\n                    me.owner.request( 'add-file', [ files ]);\n                });\n                picker.init();\n    \n                this.pickers.push( picker );\n    \n                return deferred.promise();\n            },\n    \n            disable: function() {\n                $.each( this.pickers, function() {\n                    this.disable();\n                });\n            },\n    \n            enable: function() {\n                $.each( this.pickers, function() {\n                    this.enable();\n                });\n            }\n        });\n    });\n    /**\n     * @fileOverview Image\n     */\n    define('lib/image',[\n        'base',\n        'runtime/client',\n        'lib/blob'\n    ], function( Base, RuntimeClient, Blob ) {\n        var $ = Base.$;\n    \n        // 构造器。\n        function Image( opts ) {\n            this.options = $.extend({}, Image.options, opts );\n            RuntimeClient.call( this, 'Image' );\n    \n            this.on( 'load', function() {\n                this._info = this.exec('info');\n                this._meta = this.exec('meta');\n            });\n        }\n    \n        // 默认选项。\n        Image.options = {\n    \n            // 默认的图片处理质量\n            quality: 90,\n    \n            // 是否裁剪\n            crop: false,\n    \n            // 是否保留头部信息\n            preserveHeaders: true,\n    \n            // 是否允许放大。\n            allowMagnify: true\n        };\n    \n        // 继承RuntimeClient.\n        Base.inherits( RuntimeClient, {\n            constructor: Image,\n    \n            info: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._info = val;\n                    return this;\n                }\n    \n                // getter\n                return this._info;\n            },\n    \n            meta: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._meta = val;\n                    return this;\n                }\n    \n                // getter\n                return this._meta;\n            },\n    \n            loadFromBlob: function( blob ) {\n                var me = this,\n                    ruid = blob.getRuid();\n    \n                this.connectRuntime( ruid, function() {\n                    me.exec( 'init', me.options );\n                    me.exec( 'loadFromBlob', blob );\n                });\n            },\n    \n            resize: function() {\n                var args = Base.slice( arguments );\n                return this.exec.apply( this, [ 'resize' ].concat( args ) );\n            },\n    \n            getAsDataUrl: function( type ) {\n                return this.exec( 'getAsDataUrl', type );\n            },\n    \n            getAsBlob: function( type ) {\n                var blob = this.exec( 'getAsBlob', type );\n    \n                return new Blob( this.getRuid(), blob );\n            }\n        });\n    \n        return Image;\n    });\n    /**\n     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片\n     */\n    define('widgets/image',[\n        'base',\n        'uploader',\n        'lib/image',\n        'widgets/widget'\n    ], function( Base, Uploader, Image ) {\n    \n        var $ = Base.$,\n            throttle;\n    \n        // 根据要处理的文件大小来节流，一次不能处理太多，会卡。\n        throttle = (function( max ) {\n            var occupied = 0,\n                waiting = [],\n                tick = function() {\n                    var item;\n    \n                    while ( waiting.length && occupied < max ) {\n                        item = waiting.shift();\n                        occupied += item[ 0 ];\n                        item[ 1 ]();\n                    }\n                };\n    \n            return function( emiter, size, cb ) {\n                waiting.push([ size, cb ]);\n                emiter.once( 'destroy', function() {\n                    occupied -= size;\n                    setTimeout( tick, 1 );\n                });\n                setTimeout( tick, 1 );\n            };\n        })( 5 * 1024 * 1024 );\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Object} [thumb]\n             * @namespace options\n             * @for Uploader\n             * @description 配置生成缩略图的选项。\n             *\n             * 默认为：\n             *\n             * ```javascript\n             * {\n             *     width: 110,\n             *     height: 110,\n             *\n             *     // 图片质量，只有type为`image/jpeg`的时候才有效。\n             *     quality: 70,\n             *\n             *     // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n             *     allowMagnify: true,\n             *\n             *     // 是否允许裁剪。\n             *     crop: true,\n             *\n             *     // 是否保留头部meta信息。\n             *     preserveHeaders: false,\n             *\n             *     // 为空的话则保留原有图片格式。\n             *     // 否则强制转换成指定的类型。\n             *     type: 'image/jpeg'\n             * }\n             * ```\n             */\n            thumb: {\n                width: 110,\n                height: 110,\n                quality: 70,\n                allowMagnify: true,\n                crop: true,\n                preserveHeaders: false,\n    \n                // 为空的话则保留原有图片格式。\n                // 否则强制转换成指定的类型。\n                // IE 8下面 base64 大小不能超过 32K 否则预览失败，而非 jpeg 编码的图片很可\n                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg\n                type: 'image/jpeg'\n            },\n    \n            /**\n             * @property {Object} [compress]\n             * @namespace options\n             * @for Uploader\n             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。\n             *\n             * 默认为：\n             *\n             * ```javascript\n             * {\n             *     width: 1600,\n             *     height: 1600,\n             *\n             *     // 图片质量，只有type为`image/jpeg`的时候才有效。\n             *     quality: 90,\n             *\n             *     // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n             *     allowMagnify: false,\n             *\n             *     // 是否允许裁剪。\n             *     crop: false,\n             *\n             *     // 是否保留头部meta信息。\n             *     preserveHeaders: true\n             * }\n             * ```\n             */\n            compress: {\n                width: 1600,\n                height: 1600,\n                quality: 90,\n                allowMagnify: false,\n                crop: false,\n                preserveHeaders: true\n            }\n        });\n    \n        return Uploader.register({\n            'make-thumb': 'makeThumb',\n            'before-send-file': 'compressImage'\n        }, {\n    \n    \n            /**\n             * 生成缩略图，此过程为异步，所以需要传入`callback`。\n             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。\n             *\n             * `callback`中可以接收到两个参数。\n             * * 第一个为error，如果生成缩略图有错误，此error将为真。\n             * * 第二个为ret, 缩略图的Data URL值。\n             *\n             * **注意**\n             * Date URL在IE6/7中不支持，所以不用调用此方法了，直接显示一张暂不支持预览图片好了。\n             *\n             *\n             * @method makeThumb\n             * @grammar makeThumb( file, callback ) => undefined\n             * @grammar makeThumb( file, callback, width, height ) => undefined\n             * @for Uploader\n             * @example\n             *\n             * uploader.on( 'fileQueued', function( file ) {\n             *     var $li = ...;\n             *\n             *     uploader.makeThumb( file, function( error, ret ) {\n             *         if ( error ) {\n             *             $li.text('预览错误');\n             *         } else {\n             *             $li.append('<img alt=\"\" src=\"' + ret + '\" />');\n             *         }\n             *     });\n             *\n             * });\n             */\n            makeThumb: function( file, cb, width, height ) {\n                var opts, image;\n    \n                file = this.request( 'get-file', file );\n    \n                // 只预览图片格式。\n                if ( !file.type.match( /^image/ ) ) {\n                    cb( true );\n                    return;\n                }\n    \n                opts = $.extend({}, this.options.thumb );\n    \n                // 如果传入的是object.\n                if ( $.isPlainObject( width ) ) {\n                    opts = $.extend( opts, width );\n                    width = null;\n                }\n    \n                width = width || opts.width;\n                height = height || opts.height;\n    \n                image = new Image( opts );\n    \n                image.once( 'load', function() {\n                    file._info = file._info || image.info();\n                    file._meta = file._meta || image.meta();\n                    image.resize( width, height );\n                });\n    \n                image.once( 'complete', function() {\n                    cb( false, image.getAsDataUrl( opts.type ) );\n                    image.destroy();\n                });\n    \n                image.once( 'error', function() {\n                    cb( true );\n                    image.destroy();\n                });\n    \n                throttle( image, file.source.size, function() {\n                    file._info && image.info( file._info );\n                    file._meta && image.meta( file._meta );\n                    image.loadFromBlob( file.source );\n                });\n            },\n    \n            compressImage: function( file ) {\n                var opts = this.options.compress || this.options.resize,\n                    compressSize = opts && opts.compressSize || 300 * 1024,\n                    image, deferred;\n    \n                file = this.request( 'get-file', file );\n    \n                // 只预览图片格式。\n                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||\n                        file.size < compressSize ||\n                        file._compressed ) {\n                    return;\n                }\n    \n                opts = $.extend({}, opts );\n                deferred = Base.Deferred();\n    \n                image = new Image( opts );\n    \n                deferred.always(function() {\n                    image.destroy();\n                    image = null;\n                });\n                image.once( 'error', deferred.reject );\n                image.once( 'load', function() {\n                    file._info = file._info || image.info();\n                    file._meta = file._meta || image.meta();\n                    image.resize( opts.width, opts.height );\n                });\n    \n                image.once( 'complete', function() {\n                    var blob, size;\n    \n                    // 移动端 UC / qq 浏览器的无图模式下\n                    // ctx.getImageData 处理大图的时候会报 Exception\n                    // INDEX_SIZE_ERR: DOM Exception 1\n                    try {\n                        blob = image.getAsBlob( opts.type );\n    \n                        size = file.size;\n    \n                        // 如果压缩后，比原来还大则不用压缩后的。\n                        if ( blob.size < size ) {\n                            // file.source.destroy && file.source.destroy();\n                            file.source = blob;\n                            file.size = blob.size;\n    \n                            file.trigger( 'resize', blob.size, size );\n                        }\n    \n                        // 标记，避免重复压缩。\n                        file._compressed = true;\n                        deferred.resolve();\n                    } catch ( e ) {\n                        // 出错了直接继续，让其上传原始图片\n                        deferred.resolve();\n                    }\n                });\n    \n                file._info && image.info( file._info );\n                file._meta && image.meta( file._meta );\n    \n                image.loadFromBlob( file.source );\n                return deferred.promise();\n            }\n        });\n    });\n    /**\n     * @fileOverview 文件属性封装\n     */\n    define('file',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            idPrefix = 'WU_FILE_',\n            idSuffix = 0,\n            rExt = /\\.([^.]+)$/,\n            statusMap = {};\n    \n        function gid() {\n            return idPrefix + idSuffix++;\n        }\n    \n        /**\n         * 文件类\n         * @class File\n         * @constructor 构造函数\n         * @grammar new File( source ) => File\n         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。\n         */\n        function WUFile( source ) {\n    \n            /**\n             * 文件名，包括扩展名（后缀）\n             * @property name\n             * @type {string}\n             */\n            this.name = source.name || 'Untitled';\n    \n            /**\n             * 文件体积（字节）\n             * @property size\n             * @type {uint}\n             * @default 0\n             */\n            this.size = source.size || 0;\n    \n            /**\n             * 文件MIMETYPE类型，与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)\n             * @property type\n             * @type {string}\n             * @default 'application'\n             */\n            this.type = source.type || 'application';\n    \n            /**\n             * 文件最后修改日期\n             * @property lastModifiedDate\n             * @type {int}\n             * @default 当前时间戳\n             */\n            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);\n    \n            /**\n             * 文件ID，每个对象具有唯一ID，与文件名无关\n             * @property id\n             * @type {string}\n             */\n            this.id = gid();\n    \n            /**\n             * 文件扩展名，通过文件名获取，例如test.png的扩展名为png\n             * @property ext\n             * @type {string}\n             */\n            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';\n    \n    \n            /**\n             * 状态文字说明。在不同的status语境下有不同的用途。\n             * @property statusText\n             * @type {string}\n             */\n            this.statusText = '';\n    \n            // 存储文件状态，防止通过属性直接修改\n            statusMap[ this.id ] = WUFile.Status.INITED;\n    \n            this.source = source;\n            this.loaded = 0;\n    \n            this.on( 'error', function( msg ) {\n                this.setStatus( WUFile.Status.ERROR, msg );\n            });\n        }\n    \n        $.extend( WUFile.prototype, {\n    \n            /**\n             * 设置状态，状态变化时会触发`change`事件。\n             * @method setStatus\n             * @grammar setStatus( status[, statusText] );\n             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)\n             * @param {String} [statusText=''] 状态说明，常在error时使用，用http, abort,server等来标记是由于什么原因导致文件错误。\n             */\n            setStatus: function( status, text ) {\n    \n                var prevStatus = statusMap[ this.id ];\n    \n                typeof text !== 'undefined' && (this.statusText = text);\n    \n                if ( status !== prevStatus ) {\n                    statusMap[ this.id ] = status;\n                    /**\n                     * 文件状态变化\n                     * @event statuschange\n                     */\n                    this.trigger( 'statuschange', status, prevStatus );\n                }\n    \n            },\n    \n            /**\n             * 获取文件状态\n             * @return {File.Status}\n             * @example\n                     文件状态具体包括以下几种类型：\n                     {\n                         // 初始化\n                        INITED:     0,\n                        // 已入队列\n                        QUEUED:     1,\n                        // 正在上传\n                        PROGRESS:     2,\n                        // 上传出错\n                        ERROR:         3,\n                        // 上传成功\n                        COMPLETE:     4,\n                        // 上传取消\n                        CANCELLED:     5\n                    }\n             */\n            getStatus: function() {\n                return statusMap[ this.id ];\n            },\n    \n            /**\n             * 获取文件原始信息。\n             * @return {*}\n             */\n            getSource: function() {\n                return this.source;\n            },\n    \n            destory: function() {\n                delete statusMap[ this.id ];\n            }\n        });\n    \n        Mediator.installTo( WUFile.prototype );\n    \n        /**\n         * 文件状态值，具体包括以下几种类型：\n         * * `inited` 初始状态\n         * * `queued` 已经进入队列, 等待上传\n         * * `progress` 上传中\n         * * `complete` 上传完成。\n         * * `error` 上传出错，可重试\n         * * `interrupt` 上传中断，可续传。\n         * * `invalid` 文件不合格，不能重试上传。会自动从队列中移除。\n         * * `cancelled` 文件被移除。\n         * @property {Object} Status\n         * @namespace File\n         * @class File\n         * @static\n         */\n        WUFile.Status = {\n            INITED:     'inited',    // 初始状态\n            QUEUED:     'queued',    // 已经进入队列, 等待上传\n            PROGRESS:   'progress',    // 上传中\n            ERROR:      'error',    // 上传出错，可重试\n            COMPLETE:   'complete',    // 上传完成。\n            CANCELLED:  'cancelled',    // 上传取消。\n            INTERRUPT:  'interrupt',    // 上传中断，可续传。\n            INVALID:    'invalid'    // 文件不合格，不能重试上传。\n        };\n    \n        return WUFile;\n    });\n    \n    /**\n     * @fileOverview 文件队列\n     */\n    define('queue',[\n        'base',\n        'mediator',\n        'file'\n    ], function( Base, Mediator, WUFile ) {\n    \n        var $ = Base.$,\n            STATUS = WUFile.Status;\n    \n        /**\n         * 文件队列, 用来存储各个状态中的文件。\n         * @class Queue\n         * @extends Mediator\n         */\n        function Queue() {\n    \n            /**\n             * 统计文件数。\n             * * `numOfQueue` 队列中的文件数。\n             * * `numOfSuccess` 上传成功的文件数\n             * * `numOfCancel` 被移除的文件数\n             * * `numOfProgress` 正在上传中的文件数\n             * * `numOfUploadFailed` 上传错误的文件数。\n             * * `numOfInvalid` 无效的文件数。\n             * @property {Object} stats\n             */\n            this.stats = {\n                numOfQueue: 0,\n                numOfSuccess: 0,\n                numOfCancel: 0,\n                numOfProgress: 0,\n                numOfUploadFailed: 0,\n                numOfInvalid: 0\n            };\n    \n            // 上传队列，仅包括等待上传的文件\n            this._queue = [];\n    \n            // 存储所有文件\n            this._map = {};\n        }\n    \n        $.extend( Queue.prototype, {\n    \n            /**\n             * 将新文件加入对队列尾部\n             *\n             * @method append\n             * @param  {File} file   文件对象\n             */\n            append: function( file ) {\n                this._queue.push( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 将新文件加入对队列头部\n             *\n             * @method prepend\n             * @param  {File} file   文件对象\n             */\n            prepend: function( file ) {\n                this._queue.unshift( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 获取文件对象\n             *\n             * @method getFile\n             * @param  {String} fileId   文件ID\n             * @return {File}\n             */\n            getFile: function( fileId ) {\n                if ( typeof fileId !== 'string' ) {\n                    return fileId;\n                }\n                return this._map[ fileId ];\n            },\n    \n            /**\n             * 从队列中取出一个指定状态的文件。\n             * @grammar fetch( status ) => File\n             * @method fetch\n             * @param {String} status [文件状态值](#WebUploader:File:File.Status)\n             * @return {File} [File](#WebUploader:File)\n             */\n            fetch: function( status ) {\n                var len = this._queue.length,\n                    i, file;\n    \n                status = status || STATUS.QUEUED;\n    \n                for ( i = 0; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( status === file.getStatus() ) {\n                        return file;\n                    }\n                }\n    \n                return null;\n            },\n    \n            /**\n             * 对队列进行排序，能够控制文件上传顺序。\n             * @grammar sort( fn ) => undefined\n             * @method sort\n             * @param {Function} fn 排序方法\n             */\n            sort: function( fn ) {\n                if ( typeof fn === 'function' ) {\n                    this._queue.sort( fn );\n                }\n            },\n    \n            /**\n             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。\n             * @grammar getFiles( [status1[, status2 ...]] ) => Array\n             * @method getFiles\n             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)\n             */\n            getFiles: function() {\n                var sts = [].slice.call( arguments, 0 ),\n                    ret = [],\n                    i = 0,\n                    len = this._queue.length,\n                    file;\n    \n                for ( ; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {\n                        continue;\n                    }\n    \n                    ret.push( file );\n                }\n    \n                return ret;\n            },\n    \n            _fileAdded: function( file ) {\n                var me = this,\n                    existing = this._map[ file.id ];\n    \n                if ( !existing ) {\n                    this._map[ file.id ] = file;\n    \n                    file.on( 'statuschange', function( cur, pre ) {\n                        me._onFileStatusChange( cur, pre );\n                    });\n                }\n    \n                file.setStatus( STATUS.QUEUED );\n            },\n    \n            _onFileStatusChange: function( curStatus, preStatus ) {\n                var stats = this.stats;\n    \n                switch ( preStatus ) {\n                    case STATUS.PROGRESS:\n                        stats.numOfProgress--;\n                        break;\n    \n                    case STATUS.QUEUED:\n                        stats.numOfQueue --;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed--;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid--;\n                        break;\n                }\n    \n                switch ( curStatus ) {\n                    case STATUS.QUEUED:\n                        stats.numOfQueue++;\n                        break;\n    \n                    case STATUS.PROGRESS:\n                        stats.numOfProgress++;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed++;\n                        break;\n    \n                    case STATUS.COMPLETE:\n                        stats.numOfSuccess++;\n                        break;\n    \n                    case STATUS.CANCELLED:\n                        stats.numOfCancel++;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid++;\n                        break;\n                }\n            }\n    \n        });\n    \n        Mediator.installTo( Queue.prototype );\n    \n        return Queue;\n    });\n    /**\n     * @fileOverview 队列\n     */\n    define('widgets/queue',[\n        'base',\n        'uploader',\n        'queue',\n        'file',\n        'lib/file',\n        'runtime/client',\n        'widgets/widget'\n    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {\n    \n        var $ = Base.$,\n            rExt = /\\.\\w+$/,\n            Status = WUFile.Status;\n    \n        return Uploader.register({\n            'sort-files': 'sortFiles',\n            'add-file': 'addFiles',\n            'get-file': 'getFile',\n            'fetch-file': 'fetchFile',\n            'get-stats': 'getStats',\n            'get-files': 'getFiles',\n            'remove-file': 'removeFile',\n            'retry': 'retry',\n            'reset': 'reset',\n            'accept-file': 'acceptFile'\n        }, {\n    \n            init: function( opts ) {\n                var me = this,\n                    deferred, len, i, item, arr, accept, runtime;\n    \n                if ( $.isPlainObject( opts.accept ) ) {\n                    opts.accept = [ opts.accept ];\n                }\n    \n                // accept中的中生成匹配正则。\n                if ( opts.accept ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        item = opts.accept[ i ].extensions;\n                        item && arr.push( item );\n                    }\n    \n                    if ( arr.length ) {\n                        accept = '\\\\.' + arr.join(',')\n                                .replace( /,/g, '$|\\\\.' )\n                                .replace( /\\*/g, '.*' ) + '$';\n                    }\n    \n                    me.accept = new RegExp( accept, 'i' );\n                }\n    \n                me.queue = new Queue();\n                me.stats = me.queue.stats;\n    \n                // 如果当前不是html5运行时，那就算了。\n                // 不执行后续操作\n                if ( this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                // 创建一个 html5 运行时的 placeholder\n                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。\n                deferred = Base.Deferred();\n                runtime = new RuntimeClient('Placeholder');\n                runtime.connectRuntime({\n                    runtimeOrder: 'html5'\n                }, function() {\n                    me._ruid = runtime.getRuid();\n                    deferred.resolve();\n                });\n                return deferred.promise();\n            },\n    \n    \n            // 为了支持外部直接添加一个原生File对象。\n            _wrapFile: function( file ) {\n                if ( !(file instanceof WUFile) ) {\n    \n                    if ( !(file instanceof File) ) {\n                        if ( !this._ruid ) {\n                            throw new Error('Can\\'t add external files.');\n                        }\n                        file = new File( this._ruid, file );\n                    }\n    \n                    file = new WUFile( file );\n                }\n    \n                return file;\n            },\n    \n            // 判断文件是否可以被加入队列\n            acceptFile: function( file ) {\n                var invalid = !file || file.size < 6 || this.accept &&\n    \n                        // 如果名字中有后缀，才做后缀白名单处理。\n                        rExt.exec( file.name ) && !this.accept.test( file.name );\n    \n                return !invalid;\n            },\n    \n    \n            /**\n             * @event beforeFileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列之前触发，此事件的handler返回值为`false`，则此文件不会被添加进入队列。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event fileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列以后触发。\n             * @for  Uploader\n             */\n    \n            _addFile: function( file ) {\n                var me = this;\n    \n                file = me._wrapFile( file );\n    \n                // 不过类型判断允许不允许，先派送 `beforeFileQueued`\n                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {\n                    return;\n                }\n    \n                // 类型不匹配，则派送错误事件，并返回。\n                if ( !me.acceptFile( file ) ) {\n                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );\n                    return;\n                }\n    \n                me.queue.append( file );\n                me.owner.trigger( 'fileQueued', file );\n                return file;\n            },\n    \n            getFile: function( fileId ) {\n                return this.queue.getFile( fileId );\n            },\n    \n            /**\n             * @event filesQueued\n             * @param {File} files 数组，内容为原始File(lib/File）对象。\n             * @description 当一批文件添加进队列以后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method addFiles\n             * @grammar addFiles( file ) => undefined\n             * @grammar addFiles( [file1, file2 ...] ) => undefined\n             * @param {Array of File or File} [files] Files 对象 数组\n             * @description 添加文件到队列\n             * @for  Uploader\n             */\n            addFiles: function( files ) {\n                var me = this;\n    \n                if ( !files.length ) {\n                    files = [ files ];\n                }\n    \n                files = $.map( files, function( file ) {\n                    return me._addFile( file );\n                });\n    \n                me.owner.trigger( 'filesQueued', files );\n    \n                if ( me.options.auto ) {\n                    me.request('start-upload');\n                }\n            },\n    \n            getStats: function() {\n                return this.stats;\n            },\n    \n            /**\n             * @event fileDequeued\n             * @param {File} file File对象\n             * @description 当文件被移除队列后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method removeFile\n             * @grammar removeFile( file ) => undefined\n             * @grammar removeFile( id ) => undefined\n             * @param {File|id} file File对象或这File对象的id\n             * @description 移除某一文件。\n             * @for  Uploader\n             * @example\n             *\n             * $li.on('click', '.remove-this', function() {\n             *     uploader.removeFile( file );\n             * })\n             */\n            removeFile: function( file ) {\n                var me = this;\n    \n                file = file.id ? file : me.queue.getFile( file );\n    \n                file.setStatus( Status.CANCELLED );\n                me.owner.trigger( 'fileDequeued', file );\n            },\n    \n            /**\n             * @method getFiles\n             * @grammar getFiles() => Array\n             * @grammar getFiles( status1, status2, status... ) => Array\n             * @description 返回指定状态的文件集合，不传参数将返回所有状态的文件。\n             * @for  Uploader\n             * @example\n             * console.log( uploader.getFiles() );    // => all files\n             * console.log( uploader.getFiles('error') )    // => all error files.\n             */\n            getFiles: function() {\n                return this.queue.getFiles.apply( this.queue, arguments );\n            },\n    \n            fetchFile: function() {\n                return this.queue.fetch.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method retry\n             * @grammar retry() => undefined\n             * @grammar retry( file ) => undefined\n             * @description 重试上传，重试指定文件，或者从出错的文件开始重新上传。\n             * @for  Uploader\n             * @example\n             * function retry() {\n             *     uploader.retry();\n             * }\n             */\n            retry: function( file, noForceStart ) {\n                var me = this,\n                    files, i, len;\n    \n                if ( file ) {\n                    file = file.id ? file : me.queue.getFile( file );\n                    file.setStatus( Status.QUEUED );\n                    noForceStart || me.request('start-upload');\n                    return;\n                }\n    \n                files = me.queue.getFiles( Status.ERROR );\n                i = 0;\n                len = files.length;\n    \n                for ( ; i < len; i++ ) {\n                    file = files[ i ];\n                    file.setStatus( Status.QUEUED );\n                }\n    \n                me.request('start-upload');\n            },\n    \n            /**\n             * @method sort\n             * @grammar sort( fn ) => undefined\n             * @description 排序队列中的文件，在上传之前调整可以控制上传顺序。\n             * @for  Uploader\n             */\n            sortFiles: function() {\n                return this.queue.sort.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method reset\n             * @grammar reset() => undefined\n             * @description 重置uploader。目前只重置了队列。\n             * @for  Uploader\n             * @example\n             * uploader.reset();\n             */\n            reset: function() {\n                this.queue = new Queue();\n                this.stats = this.queue.stats;\n            }\n        });\n    \n    });\n    /**\n     * @fileOverview 添加获取Runtime相关信息的方法。\n     */\n    define('widgets/runtime',[\n        'uploader',\n        'runtime/runtime',\n        'widgets/widget'\n    ], function( Uploader, Runtime ) {\n    \n        Uploader.support = function() {\n            return Runtime.hasRuntime.apply( Runtime, arguments );\n        };\n    \n        return Uploader.register({\n            'predict-runtime-type': 'predictRuntmeType'\n        }, {\n    \n            init: function() {\n                if ( !this.predictRuntmeType() ) {\n                    throw Error('Runtime Error');\n                }\n            },\n    \n            /**\n             * 预测Uploader将采用哪个`Runtime`\n             * @grammar predictRuntmeType() => String\n             * @method predictRuntmeType\n             * @for  Uploader\n             */\n            predictRuntmeType: function() {\n                var orders = this.options.runtimeOrder || Runtime.orders,\n                    type = this.type,\n                    i, len;\n    \n                if ( !type ) {\n                    orders = orders.split( /\\s*,\\s*/g );\n    \n                    for ( i = 0, len = orders.length; i < len; i++ ) {\n                        if ( Runtime.hasRuntime( orders[ i ] ) ) {\n                            this.type = type = orders[ i ];\n                            break;\n                        }\n                    }\n                }\n    \n                return type;\n            }\n        });\n    });\n    /**\n     * @fileOverview Transport\n     */\n    define('lib/transport',[\n        'base',\n        'runtime/client',\n        'mediator'\n    ], function( Base, RuntimeClient, Mediator ) {\n    \n        var $ = Base.$;\n    \n        function Transport( opts ) {\n            var me = this;\n    \n            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );\n            RuntimeClient.call( this, 'Transport' );\n    \n            this._blob = null;\n            this._formData = opts.formData || {};\n            this._headers = opts.headers || {};\n    \n            this.on( 'progress', this._timeout );\n            this.on( 'load error', function() {\n                me.trigger( 'progress', 1 );\n                clearTimeout( me._timer );\n            });\n        }\n    \n        Transport.options = {\n            server: '',\n            method: 'POST',\n    \n            // 跨域时，是否允许携带cookie, 只有html5 runtime才有效\n            withCredentials: false,\n            fileVal: 'file',\n            timeout: 2 * 60 * 1000,    // 2分钟\n            formData: {},\n            headers: {},\n            sendAsBinary: false\n        };\n    \n        $.extend( Transport.prototype, {\n    \n            // 添加Blob, 只能添加一次，最后一次有效。\n            appendBlob: function( key, blob, filename ) {\n                var me = this,\n                    opts = me.options;\n    \n                if ( me.getRuid() ) {\n                    me.disconnectRuntime();\n                }\n    \n                // 连接到blob归属的同一个runtime.\n                me.connectRuntime( blob.ruid, function() {\n                    me.exec('init');\n                });\n    \n                me._blob = blob;\n                opts.fileVal = key || opts.fileVal;\n                opts.filename = filename || opts.filename;\n            },\n    \n            // 添加其他字段\n            append: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._formData, key );\n                } else {\n                    this._formData[ key ] = value;\n                }\n            },\n    \n            setRequestHeader: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._headers, key );\n                } else {\n                    this._headers[ key ] = value;\n                }\n            },\n    \n            send: function( method ) {\n                this.exec( 'send', method );\n                this._timeout();\n            },\n    \n            abort: function() {\n                clearTimeout( this._timer );\n                return this.exec('abort');\n            },\n    \n            destroy: function() {\n                this.trigger('destroy');\n                this.off();\n                this.exec('destroy');\n                this.disconnectRuntime();\n            },\n    \n            getResponse: function() {\n                return this.exec('getResponse');\n            },\n    \n            getResponseAsJson: function() {\n                return this.exec('getResponseAsJson');\n            },\n    \n            getStatus: function() {\n                return this.exec('getStatus');\n            },\n    \n            _timeout: function() {\n                var me = this,\n                    duration = me.options.timeout;\n    \n                if ( !duration ) {\n                    return;\n                }\n    \n                clearTimeout( me._timer );\n                me._timer = setTimeout(function() {\n                    me.abort();\n                    me.trigger( 'error', 'timeout' );\n                }, duration );\n            }\n    \n        });\n    \n        // 让Transport具备事件功能。\n        Mediator.installTo( Transport.prototype );\n    \n        return Transport;\n    });\n    /**\n     * @fileOverview 负责文件上传相关。\n     */\n    define('widgets/upload',[\n        'base',\n        'uploader',\n        'file',\n        'lib/transport',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile, Transport ) {\n    \n        var $ = Base.$,\n            isPromise = Base.isPromise,\n            Status = WUFile.Status;\n    \n        // 添加默认配置项\n        $.extend( Uploader.options, {\n    \n    \n            /**\n             * @property {Boolean} [prepareNextFile=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否允许在文件传输时提前把下一个文件准备好。\n             * 对于一个文件的准备工作比较耗时，比如图片压缩，md5序列化。\n             * 如果能提前在当前文件传输期处理，可以节省总体耗时。\n             */\n            prepareNextFile: false,\n    \n            /**\n             * @property {Boolean} [chunked=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否要分片处理大文件上传。\n             */\n            chunked: false,\n    \n            /**\n             * @property {Boolean} [chunkSize=5242880]\n             * @namespace options\n             * @for Uploader\n             * @description 如果要分片，分多大一片？ 默认大小为5M.\n             */\n            chunkSize: 5 * 1024 * 1024,\n    \n            /**\n             * @property {Boolean} [chunkRetry=2]\n             * @namespace options\n             * @for Uploader\n             * @description 如果某个分片由于网络问题出错，允许自动重传多少次？\n             */\n            chunkRetry: 2,\n    \n            /**\n             * @property {Boolean} [threads=3]\n             * @namespace options\n             * @for Uploader\n             * @description 上传并发数。允许同时最大上传进程数。\n             */\n            threads: 3,\n    \n    \n            /**\n             * @property {Object} [formData]\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传请求的参数表，每次发送都会发送此对象中的参数。\n             */\n            formData: null\n    \n            /**\n             * @property {Object} [fileVal='file']\n             * @namespace options\n             * @for Uploader\n             * @description 设置文件上传域的name。\n             */\n    \n            /**\n             * @property {Object} [method='POST']\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传方式，`POST`或者`GET`。\n             */\n    \n            /**\n             * @property {Object} [sendAsBinary=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否已二进制的流的方式发送文件，这样整个上传内容`php://input`都为文件内容，\n             * 其他参数在$_GET数组中。\n             */\n        });\n    \n        // 负责将文件切片。\n        function CuteFile( file, chunkSize ) {\n            var pending = [],\n                blob = file.source,\n                total = blob.size,\n                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,\n                start = 0,\n                index = 0,\n                len;\n    \n            while ( index < chunks ) {\n                len = Math.min( chunkSize, total - start );\n    \n                pending.push({\n                    file: file,\n                    start: start,\n                    end: chunkSize ? (start + len) : total,\n                    total: total,\n                    chunks: chunks,\n                    chunk: index++\n                });\n                start += len;\n            }\n    \n            file.blocks = pending.concat();\n            file.remaning = pending.length;\n    \n            return {\n                file: file,\n    \n                has: function() {\n                    return !!pending.length;\n                },\n    \n                fetch: function() {\n                    return pending.shift();\n                }\n            };\n        }\n    \n        Uploader.register({\n            'start-upload': 'start',\n            'stop-upload': 'stop',\n            'skip-file': 'skipFile',\n            'is-in-progress': 'isInProgress'\n        }, {\n    \n            init: function() {\n                var owner = this.owner;\n    \n                this.runing = false;\n    \n                // 记录当前正在传的数据，跟threads相关\n                this.pool = [];\n    \n                // 缓存即将上传的文件。\n                this.pending = [];\n    \n                // 跟踪还有多少分片没有完成上传。\n                this.remaning = 0;\n                this.__tick = Base.bindFn( this._tick, this );\n    \n                owner.on( 'uploadComplete', function( file ) {\n                    // 把其他块取消了。\n                    file.blocks && $.each( file.blocks, function( _, v ) {\n                        v.transport && (v.transport.abort(), v.transport.destroy());\n                        delete v.transport;\n                    });\n    \n                    delete file.blocks;\n                    delete file.remaning;\n                });\n            },\n    \n            /**\n             * @event startUpload\n             * @description 当开始上传流程时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 开始上传。此方法可以从初始状态调用开始上传流程，也可以从暂停状态调用，继续上传流程。\n             * @grammar upload() => undefined\n             * @method upload\n             * @for  Uploader\n             */\n            start: function() {\n                var me = this;\n    \n                // 移出invalid的文件\n                $.each( me.request( 'get-files', Status.INVALID ), function() {\n                    me.request( 'remove-file', this );\n                });\n    \n                if ( me.runing ) {\n                    return;\n                }\n    \n                me.runing = true;\n    \n                // 如果有暂停的，则续传\n                $.each( me.pool, function( _, v ) {\n                    var file = v.file;\n    \n                    if ( file.getStatus() === Status.INTERRUPT ) {\n                        file.setStatus( Status.PROGRESS );\n                        me._trigged = false;\n                        v.transport && v.transport.send();\n                    }\n                });\n    \n                me._trigged = false;\n                me.owner.trigger('startUpload');\n                Base.nextTick( me.__tick );\n            },\n    \n            /**\n             * @event stopUpload\n             * @description 当开始上传流程暂停时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。\n             * @grammar stop() => undefined\n             * @grammar stop( true ) => undefined\n             * @method stop\n             * @for  Uploader\n             */\n            stop: function( interrupt ) {\n                var me = this;\n    \n                if ( me.runing === false ) {\n                    return;\n                }\n    \n                me.runing = false;\n    \n                interrupt && $.each( me.pool, function( _, v ) {\n                    v.transport && v.transport.abort();\n                    v.file.setStatus( Status.INTERRUPT );\n                });\n    \n                me.owner.trigger('stopUpload');\n            },\n    \n            /**\n             * 判断`Uplaode`r是否正在上传中。\n             * @grammar isInProgress() => Boolean\n             * @method isInProgress\n             * @for  Uploader\n             */\n            isInProgress: function() {\n                return !!this.runing;\n            },\n    \n            getStats: function() {\n                return this.request('get-stats');\n            },\n    \n            /**\n             * 掉过一个文件上传，直接标记指定文件为已上传状态。\n             * @grammar skipFile( file ) => undefined\n             * @method skipFile\n             * @for  Uploader\n             */\n            skipFile: function( file, status ) {\n                file = this.request( 'get-file', file );\n    \n                file.setStatus( status || Status.COMPLETE );\n                file.skipped = true;\n    \n                // 如果正在上传。\n                file.blocks && $.each( file.blocks, function( _, v ) {\n                    var _tr = v.transport;\n    \n                    if ( _tr ) {\n                        _tr.abort();\n                        _tr.destroy();\n                        delete v.transport;\n                    }\n                });\n    \n                this.owner.trigger( 'uploadSkip', file );\n            },\n    \n            /**\n             * @event uploadFinished\n             * @description 当所有文件上传结束时触发。\n             * @for  Uploader\n             */\n            _tick: function() {\n                var me = this,\n                    opts = me.options,\n                    fn, val;\n    \n                // 上一个promise还没有结束，则等待完成后再执行。\n                if ( me._promise ) {\n                    return me._promise.always( me.__tick );\n                }\n    \n                // 还有位置，且还有文件要处理的话。\n                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {\n                    me._trigged = false;\n    \n                    fn = function( val ) {\n                        me._promise = null;\n    \n                        // 有可能是reject过来的，所以要检测val的类型。\n                        val && val.file && me._startSend( val );\n                        Base.nextTick( me.__tick );\n                    };\n    \n                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );\n    \n                // 没有要上传的了，且没有正在传输的了。\n                } else if ( !me.remaning && !me.getStats().numOfQueue ) {\n                    me.runing = false;\n    \n                    me._trigged || Base.nextTick(function() {\n                        me.owner.trigger('uploadFinished');\n                    });\n                    me._trigged = true;\n                }\n            },\n    \n            _nextBlock: function() {\n                var me = this,\n                    act = me._act,\n                    opts = me.options,\n                    next, done;\n    \n                // 如果当前文件还有没有需要传输的，则直接返回剩下的。\n                if ( act && act.has() &&\n                        act.file.getStatus() === Status.PROGRESS ) {\n    \n                    // 是否提前准备下一个文件\n                    if ( opts.prepareNextFile && !me.pending.length ) {\n                        me._prepareNextFile();\n                    }\n    \n                    return act.fetch();\n    \n                // 否则，如果正在运行，则准备下一个文件，并等待完成后返回下个分片。\n                } else if ( me.runing ) {\n    \n                    // 如果缓存中有，则直接在缓存中取，没有则去queue中取。\n                    if ( !me.pending.length && me.getStats().numOfQueue ) {\n                        me._prepareNextFile();\n                    }\n    \n                    next = me.pending.shift();\n                    done = function( file ) {\n                        if ( !file ) {\n                            return null;\n                        }\n    \n                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );\n                        me._act = act;\n                        return act.fetch();\n                    };\n    \n                    // 文件可能还在prepare中，也有可能已经完全准备好了。\n                    return isPromise( next ) ?\n                            next[ next.pipe ? 'pipe' : 'then']( done ) :\n                            done( next );\n                }\n            },\n    \n    \n            /**\n             * @event uploadStart\n             * @param {File} file File对象\n             * @description 某个文件开始上传前触发，一个文件只会触发一次。\n             * @for  Uploader\n             */\n            _prepareNextFile: function() {\n                var me = this,\n                    file = me.request('fetch-file'),\n                    pending = me.pending,\n                    promise;\n    \n                if ( file ) {\n                    promise = me.request( 'before-send-file', file, function() {\n    \n                        // 有可能文件被skip掉了。文件被skip掉后，状态坑定不是Queued.\n                        if ( file.getStatus() === Status.QUEUED ) {\n                            me.owner.trigger( 'uploadStart', file );\n                            file.setStatus( Status.PROGRESS );\n                            return file;\n                        }\n    \n                        return me._finishFile( file );\n                    });\n    \n                    // 如果还在pending中，则替换成文件本身。\n                    promise.done(function() {\n                        var idx = $.inArray( promise, pending );\n    \n                        ~idx && pending.splice( idx, 1, file );\n                    });\n    \n                    // befeore-send-file的钩子就有错误发生。\n                    promise.fail(function( reason ) {\n                        file.setStatus( Status.ERROR, reason );\n                        me.owner.trigger( 'uploadError', file, reason );\n                        me.owner.trigger( 'uploadComplete', file );\n                    });\n    \n                    pending.push( promise );\n                }\n            },\n    \n            // 让出位置了，可以让其他分片开始上传\n            _popBlock: function( block ) {\n                var idx = $.inArray( block, this.pool );\n    \n                this.pool.splice( idx, 1 );\n                block.file.remaning--;\n                this.remaning--;\n            },\n    \n            // 开始上传，可以被掉过。如果promise被reject了，则表示跳过此分片。\n            _startSend: function( block ) {\n                var me = this,\n                    file = block.file,\n                    promise;\n    \n                me.pool.push( block );\n                me.remaning++;\n    \n                // 如果没有分片，则直接使用原始的。\n                // 不会丢失content-type信息。\n                block.blob = block.chunks === 1 ? file.source :\n                        file.source.slice( block.start, block.end );\n    \n                // hook, 每个分片发送之前可能要做些异步的事情。\n                promise = me.request( 'before-send', block, function() {\n    \n                    // 有可能文件已经上传出错了，所以不需要再传输了。\n                    if ( file.getStatus() === Status.PROGRESS ) {\n                        me._doSend( block );\n                    } else {\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n    \n                // 如果为fail了，则跳过此分片。\n                promise.fail(function() {\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file ).always(function() {\n                            block.percentage = 1;\n                            me._popBlock( block );\n                            me.owner.trigger( 'uploadComplete', file );\n                            Base.nextTick( me.__tick );\n                        });\n                    } else {\n                        block.percentage = 1;\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n            },\n    \n    \n            /**\n             * @event uploadBeforeSend\n             * @param {Object} object\n             * @param {Object} data 默认的上传参数，可以扩展此对象来控制上传参数。\n             * @description 当某个文件的分块在发送前触发，主要用来询问是否要添加附带参数，大文件在开起分片上传的前提下此事件可能会触发多次。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadAccept\n             * @param {Object} object\n             * @param {Object} ret 服务端的返回数据，json格式，如果服务端不是json格式，从ret._raw中取数据，自行解析。\n             * @description 当某个文件上传到服务端响应后，会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadProgress\n             * @param {File} file File对象\n             * @param {Number} percentage 上传进度\n             * @description 上传过程中触发，携带上传进度。\n             * @for  Uploader\n             */\n    \n    \n            /**\n             * @event uploadError\n             * @param {File} file File对象\n             * @param {String} reason 出错的code\n             * @description 当文件上传出错时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadSuccess\n             * @param {File} file File对象\n             * @param {Object} response 服务端返回的数据\n             * @description 当文件上传成功时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadComplete\n             * @param {File} [file] File对象\n             * @description 不管成功或者失败，文件上传完成时触发。\n             * @for  Uploader\n             */\n    \n            // 做上传操作。\n            _doSend: function( block ) {\n                var me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    file = block.file,\n                    tr = new Transport( opts ),\n                    data = $.extend({}, opts.formData ),\n                    headers = $.extend({}, opts.headers ),\n                    requestAccept, ret;\n    \n                block.transport = tr;\n    \n                tr.on( 'destroy', function() {\n                    delete block.transport;\n                    me._popBlock( block );\n                    Base.nextTick( me.__tick );\n                });\n    \n                // 广播上传进度。以文件为单位。\n                tr.on( 'progress', function( percentage ) {\n                    var totalPercent = 0,\n                        uploaded = 0;\n    \n                    // 可能没有abort掉，progress还是执行进来了。\n                    // if ( !file.blocks ) {\n                    //     return;\n                    // }\n    \n                    totalPercent = block.percentage = percentage;\n    \n                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。\n                        $.each( file.blocks, function( _, v ) {\n                            uploaded += (v.percentage || 0) * (v.end - v.start);\n                        });\n    \n                        totalPercent = uploaded / file.size;\n                    }\n    \n                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );\n                });\n    \n                // 用来询问，是否返回的结果是有错误的。\n                requestAccept = function( reject ) {\n                    var fn;\n    \n                    ret = tr.getResponseAsJson() || {};\n                    ret._raw = tr.getResponse();\n                    fn = function( value ) {\n                        reject = value;\n                    };\n    \n                    // 服务端响应了，不代表成功了，询问是否响应正确。\n                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {\n                        reject = reject || 'server';\n                    }\n    \n                    return reject;\n                };\n    \n                // 尝试重试，然后广播文件上传出错。\n                tr.on( 'error', function( type, flag ) {\n                    block.retried = block.retried || 0;\n    \n                    // 自动重试\n                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&\n                            block.retried < opts.chunkRetry ) {\n    \n                        block.retried++;\n                        tr.send();\n    \n                    } else {\n    \n                        // http status 500 ~ 600\n                        if ( !flag && type === 'server' ) {\n                            type = requestAccept( type );\n                        }\n    \n                        file.setStatus( Status.ERROR, type );\n                        owner.trigger( 'uploadError', file, type );\n                        owner.trigger( 'uploadComplete', file );\n                    }\n                });\n    \n                // 上传成功\n                tr.on( 'load', function() {\n                    var reason;\n    \n                    // 如果非预期，转向上传出错。\n                    if ( (reason = requestAccept()) ) {\n                        tr.trigger( 'error', reason, true );\n                        return;\n                    }\n    \n                    // 全部上传完成。\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file, ret );\n                    } else {\n                        tr.destroy();\n                    }\n                });\n    \n                // 配置默认的上传字段。\n                data = $.extend( data, {\n                    id: file.id,\n                    name: file.name,\n                    type: file.type,\n                    lastModifiedDate: file.lastModifiedDate,\n                    size: file.size\n                });\n    \n                block.chunks > 1 && $.extend( data, {\n                    chunks: block.chunks,\n                    chunk: block.chunk\n                });\n    \n                // 在发送之间可以添加字段什么的。。。\n                // 如果默认的字段不够使用，可以通过监听此事件来扩展\n                owner.trigger( 'uploadBeforeSend', block, data, headers );\n    \n                // 开始发送。\n                tr.appendBlob( opts.fileVal, block.blob, file.name );\n                tr.append( data );\n                tr.setRequestHeader( headers );\n                tr.send();\n            },\n    \n            // 完成上传。\n            _finishFile: function( file, ret, hds ) {\n                var owner = this.owner;\n    \n                return owner\n                        .request( 'after-send-file', arguments, function() {\n                            file.setStatus( Status.COMPLETE );\n                            owner.trigger( 'uploadSuccess', file, ret, hds );\n                        })\n                        .fail(function( reason ) {\n    \n                            // 如果外部已经标记为invalid什么的，不再改状态。\n                            if ( file.getStatus() === Status.PROGRESS ) {\n                                file.setStatus( Status.ERROR, reason );\n                            }\n    \n                            owner.trigger( 'uploadError', file, reason );\n                        })\n                        .always(function() {\n                            owner.trigger( 'uploadComplete', file );\n                        });\n            }\n    \n        });\n    });\n    /**\n     * @fileOverview 各种验证，包括文件总大小是否超出、单文件是否超出和文件是否重复。\n     */\n    \n    define('widgets/validator',[\n        'base',\n        'uploader',\n        'file',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile ) {\n    \n        var $ = Base.$,\n            validators = {},\n            api;\n    \n        /**\n         * @event error\n         * @param {String} type 错误类型。\n         * @description 当validate不通过时，会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误，目前有以下错误会在特定的情况下派送错来。\n         *\n         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。\n         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。\n         * @for  Uploader\n         */\n    \n        // 暴露给外面的api\n        api = {\n    \n            // 添加验证器\n            addValidator: function( type, cb ) {\n                validators[ type ] = cb;\n            },\n    \n            // 移除验证器\n            removeValidator: function( type ) {\n                delete validators[ type ];\n            }\n        };\n    \n        // 在Uploader初始化的时候启动Validators的初始化\n        Uploader.register({\n            init: function() {\n                var me = this;\n                $.each( validators, function() {\n                    this.call( me.owner );\n                });\n            }\n        });\n    \n        /**\n         * @property {int} [fileNumLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证文件总数量, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileNumLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                count = 0,\n                max = opts.fileNumLimit >> 0,\n                flag = true;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n    \n                if ( count >= max && flag ) {\n                    flag = false;\n                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );\n                    setTimeout(function() {\n                        flag = true;\n                    }, 1 );\n                }\n    \n                return count >= max ? false : true;\n            });\n    \n            uploader.on( 'fileQueued', function() {\n                count++;\n            });\n    \n            uploader.on( 'fileDequeued', function() {\n                count--;\n            });\n    \n            uploader.on( 'uploadFinished', function() {\n                count = 0;\n            });\n        });\n    \n    \n        /**\n         * @property {int} [fileSizeLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileSizeLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                count = 0,\n                max = opts.fileSizeLimit >> 0,\n                flag = true;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n                var invalid = count + file.size > max;\n    \n                if ( invalid && flag ) {\n                    flag = false;\n                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );\n                    setTimeout(function() {\n                        flag = true;\n                    }, 1 );\n                }\n    \n                return invalid ? false : true;\n            });\n    \n            uploader.on( 'fileQueued', function( file ) {\n                count += file.size;\n            });\n    \n            uploader.on( 'fileDequeued', function( file ) {\n                count -= file.size;\n            });\n    \n            uploader.on( 'uploadFinished', function() {\n                count = 0;\n            });\n        });\n    \n        /**\n         * @property {int} [fileSingleSizeLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileSingleSizeLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                max = opts.fileSingleSizeLimit;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n    \n                if ( file.size > max ) {\n                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );\n                    this.trigger( 'error', 'F_EXCEED_SIZE', file );\n                    return false;\n                }\n    \n            });\n    \n        });\n    \n        /**\n         * @property {int} [duplicate=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 去重， 根据文件名字、文件大小和最后修改时间来生成hash Key.\n         */\n        api.addValidator( 'duplicate', function() {\n            var uploader = this,\n                opts = uploader.options,\n                mapping = {};\n    \n            if ( opts.duplicate ) {\n                return;\n            }\n    \n            function hashString( str ) {\n                var hash = 0,\n                    i = 0,\n                    len = str.length,\n                    _char;\n    \n                for ( ; i < len; i++ ) {\n                    _char = str.charCodeAt( i );\n                    hash = _char + (hash << 6) + (hash << 16) - hash;\n                }\n    \n                return hash;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n                var hash = file.__hash || (file.__hash = hashString( file.name +\n                        file.size + file.lastModifiedDate ));\n    \n                // 已经重复了\n                if ( mapping[ hash ] ) {\n                    this.trigger( 'error', 'F_DUPLICATE', file );\n                    return false;\n                }\n            });\n    \n            uploader.on( 'fileQueued', function( file ) {\n                var hash = file.__hash;\n    \n                hash && (mapping[ hash ] = true);\n            });\n    \n            uploader.on( 'fileDequeued', function( file ) {\n                var hash = file.__hash;\n    \n                hash && (delete mapping[ hash ]);\n            });\n        });\n    \n        return api;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/compbase',[],function() {\n    \n        function CompBase( owner, runtime ) {\n    \n            this.owner = owner;\n            this.options = owner.options;\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.getRuid = function() {\n                return runtime.uid;\n            };\n    \n            this.trigger = function() {\n                return owner.trigger.apply( owner, arguments );\n            };\n        }\n    \n        return CompBase;\n    });\n    /**\n     * @fileOverview FlashRuntime\n     */\n    define('runtime/flash/runtime',[\n        'base',\n        'runtime/runtime',\n        'runtime/compbase'\n    ], function( Base, Runtime, CompBase ) {\n    \n        var $ = Base.$,\n            type = 'flash',\n            components = {};\n    \n    \n        function getFlashVersion() {\n            var version;\n    \n            try {\n                version = navigator.plugins[ 'Shockwave Flash' ];\n                version = version.description;\n            } catch ( ex ) {\n                try {\n                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')\n                            .GetVariable('$version');\n                } catch ( ex2 ) {\n                    version = '0.0';\n                }\n            }\n            version = version.match( /\\d+/g );\n            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );\n        }\n    \n        function FlashRuntime() {\n            var pool = {},\n                clients = {},\n                destory = this.destory,\n                me = this,\n                jsreciver = Base.guid('webuploader_');\n    \n            Runtime.apply( me, arguments );\n            me.type = type;\n    \n    \n            // 这个方法的调用者，实际上是RuntimeClient\n            me.exec = function( comp, fn/*, args...*/ ) {\n                var client = this,\n                    uid = client.uid,\n                    args = Base.slice( arguments, 2 ),\n                    instance;\n    \n                clients[ uid ] = client;\n    \n                if ( components[ comp ] ) {\n                    if ( !pool[ uid ] ) {\n                        pool[ uid ] = new components[ comp ]( client, me );\n                    }\n    \n                    instance = pool[ uid ];\n    \n                    if ( instance[ fn ] ) {\n                        return instance[ fn ].apply( instance, args );\n                    }\n                }\n    \n                return me.flashExec.apply( client, arguments );\n            };\n    \n            function handler( evt, obj ) {\n                var type = evt.type || evt,\n                    parts, uid;\n    \n                parts = type.split('::');\n                uid = parts[ 0 ];\n                type = parts[ 1 ];\n    \n                // console.log.apply( console, arguments );\n    \n                if ( type === 'Ready' && uid === me.uid ) {\n                    me.trigger('ready');\n                } else if ( clients[ uid ] ) {\n                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );\n                }\n    \n                // Base.log( evt, obj );\n            }\n    \n            // flash的接受器。\n            window[ jsreciver ] = function() {\n                var args = arguments;\n    \n                // 为了能捕获得到。\n                setTimeout(function() {\n                    handler.apply( null, args );\n                }, 1 );\n            };\n    \n            this.jsreciver = jsreciver;\n    \n            this.destory = function() {\n                // @todo 删除池子中的所有实例\n                return destory && destory.apply( this, arguments );\n            };\n    \n            this.flashExec = function( comp, fn ) {\n                var flash = me.getFlash(),\n                    args = Base.slice( arguments, 2 );\n    \n                return flash.exec( this.uid, comp, fn, args );\n            };\n    \n            // @todo\n        }\n    \n        Base.inherits( Runtime, {\n            constructor: FlashRuntime,\n    \n            init: function() {\n                var container = this.getContainer(),\n                    opts = this.options,\n                    html;\n    \n                // if not the minimal height, shims are not initialized\n                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)\n                container.css({\n                    position: 'absolute',\n                    top: '-8px',\n                    left: '-8px',\n                    width: '9px',\n                    height: '9px',\n                    overflow: 'hidden'\n                });\n    \n                // insert flash object\n                html = '<object id=\"' + this.uid + '\" type=\"application/' +\n                        'x-shockwave-flash\" data=\"' +  opts.swf + '\" ';\n    \n                if ( Base.browser.ie ) {\n                    html += 'classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" ';\n                }\n    \n                html += 'width=\"100%\" height=\"100%\" style=\"outline:0\">'  +\n                    '<param name=\"movie\" value=\"' + opts.swf + '\" />' +\n                    '<param name=\"flashvars\" value=\"uid=' + this.uid +\n                    '&jsreciver=' + this.jsreciver + '\" />' +\n                    '<param name=\"wmode\" value=\"transparent\" />' +\n                    '<param name=\"allowscriptaccess\" value=\"always\" />' +\n                '</object>';\n    \n                container.html( html );\n            },\n    \n            getFlash: function() {\n                if ( this._flash ) {\n                    return this._flash;\n                }\n    \n                this._flash = $( '#' + this.uid ).get( 0 );\n                return this._flash;\n            }\n    \n        });\n    \n        FlashRuntime.register = function( name, component ) {\n            component = components[ name ] = Base.inherits( CompBase, $.extend({\n    \n                // @todo fix this later\n                flashExec: function() {\n                    var owner = this.owner,\n                        runtime = this.getRuntime();\n    \n                    return runtime.flashExec.apply( owner, arguments );\n                }\n            }, component ) );\n    \n            return component;\n        };\n    \n        if ( getFlashVersion() >= 11.4 ) {\n            Runtime.addRuntime( type, FlashRuntime );\n        }\n    \n        return FlashRuntime;\n    });\n    /**\n     * @fileOverview FilePicker\n     */\n    define('runtime/flash/filepicker',[\n        'base',\n        'runtime/flash/runtime'\n    ], function( Base, FlashRuntime ) {\n        var $ = Base.$;\n    \n        return FlashRuntime.register( 'FilePicker', {\n            init: function( opts ) {\n                var copy = $.extend({}, opts ),\n                    len, i;\n    \n                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.\n                len = copy.accept && copy.accept.length;\n                for (  i = 0; i < len; i++ ) {\n                    if ( !copy.accept[ i ].title ) {\n                        copy.accept[ i ].title = 'Files';\n                    }\n                }\n    \n                delete copy.button;\n                delete copy.container;\n    \n                this.flashExec( 'FilePicker', 'init', copy );\n            },\n    \n            destroy: function() {\n                // todo\n            }\n        });\n    });\n    /**\n     * @fileOverview 图片压缩\n     */\n    define('runtime/flash/image',[\n        'runtime/flash/runtime'\n    ], function( FlashRuntime ) {\n    \n        return FlashRuntime.register( 'Image', {\n            // init: function( options ) {\n            //     var owner = this.owner;\n    \n            //     this.flashExec( 'Image', 'init', options );\n            //     owner.on( 'load', function() {\n            //         debugger;\n            //     });\n            // },\n    \n            loadFromBlob: function( blob ) {\n                var owner = this.owner;\n    \n                owner.info() && this.flashExec( 'Image', 'info', owner.info() );\n                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );\n    \n                this.flashExec( 'Image', 'loadFromBlob', blob.uid );\n            }\n        });\n    });\n    /**\n     * @fileOverview  Transport flash实现\n     */\n    define('runtime/flash/transport',[\n        'base',\n        'runtime/flash/runtime',\n        'runtime/client'\n    ], function( Base, FlashRuntime, RuntimeClient ) {\n        var $ = Base.$;\n    \n        return FlashRuntime.register( 'Transport', {\n            init: function() {\n                this._status = 0;\n                this._response = null;\n                this._responseJson = null;\n            },\n    \n            send: function() {\n                var owner = this.owner,\n                    opts = this.options,\n                    xhr = this._initAjax(),\n                    blob = owner._blob,\n                    server = opts.server,\n                    binary;\n    \n                xhr.connectRuntime( blob.ruid );\n    \n                if ( opts.sendAsBinary ) {\n                    server += (/\\?/.test( server ) ? '&' : '?') +\n                            $.param( owner._formData );\n    \n                    binary = blob.uid;\n                } else {\n                    $.each( owner._formData, function( k, v ) {\n                        xhr.exec( 'append', k, v );\n                    });\n    \n                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,\n                            opts.filename || owner._formData.name || '' );\n                }\n    \n                this._setRequestHeader( xhr, opts.headers );\n                xhr.exec( 'send', {\n                    method: opts.method,\n                    url: server\n                }, binary );\n            },\n    \n            getStatus: function() {\n                return this._status;\n            },\n    \n            getResponse: function() {\n                return this._response;\n            },\n    \n            getResponseAsJson: function() {\n                return this._responseJson;\n            },\n    \n            abort: function() {\n                var xhr = this._xhr;\n    \n                if ( xhr ) {\n                    xhr.exec('abort');\n                    xhr.destroy();\n                    this._xhr = xhr = null;\n                }\n            },\n    \n            destroy: function() {\n                this.abort();\n            },\n    \n            _initAjax: function() {\n                var me = this,\n                    xhr = new RuntimeClient('XMLHttpRequest');\n    \n                xhr.on( 'uploadprogress progress', function( e ) {\n                    return me.trigger( 'progress', e.loaded / e.total );\n                });\n    \n                xhr.on( 'load', function() {\n                    var status = xhr.exec('getStatus'),\n                        err = '';\n    \n                    xhr.off();\n                    me._xhr = null;\n    \n                    if ( status >= 200 && status < 300 ) {\n                        me._response = xhr.exec('getResponse');\n                        me._responseJson = xhr.exec('getResponseAsJson');\n                    } else if ( status >= 500 && status < 600 ) {\n                        me._response = xhr.exec('getResponse');\n                        me._responseJson = xhr.exec('getResponseAsJson');\n                        err = 'server';\n                    } else {\n                        err = 'http';\n                    }\n    \n                    xhr.destroy();\n                    xhr = null;\n    \n                    return err ? me.trigger( 'error', err ) : me.trigger('load');\n                });\n    \n                xhr.on( 'error', function() {\n                    xhr.off();\n                    me._xhr = null;\n                    me.trigger( 'error', 'http' );\n                });\n    \n                me._xhr = xhr;\n                return xhr;\n            },\n    \n            _setRequestHeader: function( xhr, headers ) {\n                $.each( headers, function( key, val ) {\n                    xhr.exec( 'setRequestHeader', key, val );\n                });\n            }\n        });\n    });\n    /**\n     * @fileOverview 只有flash实现的文件版本。\n     */\n    define('preset/flashonly',[\n        'base',\n    \n        // widgets\n        'widgets/filepicker',\n        'widgets/image',\n        'widgets/queue',\n        'widgets/runtime',\n        'widgets/upload',\n        'widgets/validator',\n    \n        // runtimes\n    \n        // flash\n        'runtime/flash/filepicker',\n        'runtime/flash/image',\n        'runtime/flash/transport'\n    ], function( Base ) {\n        return Base;\n    });\n    define('webuploader',[\n        'preset/flashonly'\n    ], function( preset ) {\n        return preset;\n    });\n    return require('webuploader');\n});\n"
  },
  {
    "path": "static/common/user/uedit/third-party/webuploader/webuploader.html5only.js",
    "content": "/*! WebUploader 0.1.2 */\n\n\n/**\n * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。\n *\n * AMD API 内部的简单不完全实现，请忽略。只有当WebUploader被合并成一个文件的时候才会引入。\n */\n(function( root, factory ) {\n    var modules = {},\n\n        // 内部require, 简单不完全实现。\n        // https://github.com/amdjs/amdjs-api/wiki/require\n        _require = function( deps, callback ) {\n            var args, len, i;\n\n            // 如果deps不是数组，则直接返回指定module\n            if ( typeof deps === 'string' ) {\n                return getModule( deps );\n            } else {\n                args = [];\n                for( len = deps.length, i = 0; i < len; i++ ) {\n                    args.push( getModule( deps[ i ] ) );\n                }\n\n                return callback.apply( null, args );\n            }\n        },\n\n        // 内部define，暂时不支持不指定id.\n        _define = function( id, deps, factory ) {\n            if ( arguments.length === 2 ) {\n                factory = deps;\n                deps = null;\n            }\n\n            _require( deps || [], function() {\n                setModule( id, factory, arguments );\n            });\n        },\n\n        // 设置module, 兼容CommonJs写法。\n        setModule = function( id, factory, args ) {\n            var module = {\n                    exports: factory\n                },\n                returned;\n\n            if ( typeof factory === 'function' ) {\n                args.length || (args = [ _require, module.exports, module ]);\n                returned = factory.apply( null, args );\n                returned !== undefined && (module.exports = returned);\n            }\n\n            modules[ id ] = module.exports;\n        },\n\n        // 根据id获取module\n        getModule = function( id ) {\n            var module = modules[ id ] || root[ id ];\n\n            if ( !module ) {\n                throw new Error( '`' + id + '` is undefined' );\n            }\n\n            return module;\n        },\n\n        // 将所有modules，将路径ids装换成对象。\n        exportsTo = function( obj ) {\n            var key, host, parts, part, last, ucFirst;\n\n            // make the first character upper case.\n            ucFirst = function( str ) {\n                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));\n            };\n\n            for ( key in modules ) {\n                host = obj;\n\n                if ( !modules.hasOwnProperty( key ) ) {\n                    continue;\n                }\n\n                parts = key.split('/');\n                last = ucFirst( parts.pop() );\n\n                while( (part = ucFirst( parts.shift() )) ) {\n                    host[ part ] = host[ part ] || {};\n                    host = host[ part ];\n                }\n\n                host[ last ] = modules[ key ];\n            }\n        },\n\n        exports = factory( root, _define, _require ),\n        origin;\n\n    // exports every module.\n    exportsTo( exports );\n\n    if ( typeof module === 'object' && typeof module.exports === 'object' ) {\n\n        // For CommonJS and CommonJS-like environments where a proper window is present,\n        module.exports = exports;\n    } else if ( typeof define === 'function' && define.amd ) {\n\n        // Allow using this built library as an AMD module\n        // in another project. That other project will only\n        // see this AMD call, not the internal modules in\n        // the closure below.\n        define([], exports );\n    } else {\n\n        // Browser globals case. Just assign the\n        // result to a property on the global.\n        origin = root.WebUploader;\n        root.WebUploader = exports;\n        root.WebUploader.noConflict = function() {\n            root.WebUploader = origin;\n        };\n    }\n})( this, function( window, define, require ) {\n\n\n    /**\n     * @fileOverview jQuery or Zepto\n     */\n    define('dollar-third',[],function() {\n        return window.jQuery || window.Zepto;\n    });\n    /**\n     * @fileOverview Dom 操作相关\n     */\n    define('dollar',[\n        'dollar-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 使用jQuery的Promise\n     */\n    define('promise-third',[\n        'dollar'\n    ], function( $ ) {\n        return {\n            Deferred: $.Deferred,\n            when: $.when,\n    \n            isPromise: function( anything ) {\n                return anything && typeof anything.then === 'function';\n            }\n        };\n    });\n    /**\n     * @fileOverview Promise/A+\n     */\n    define('promise',[\n        'promise-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 基础类方法。\n     */\n    \n    /**\n     * Web Uploader内部类的详细说明，以下提及的功能类，都可以在`WebUploader`这个变量中访问到。\n     *\n     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.\n     * 默认module id该文件的路径，而此路径将会转化成名字空间存放在WebUploader中。如：\n     *\n     * * module `base`：WebUploader.Base\n     * * module `file`: WebUploader.File\n     * * module `lib/dnd`: WebUploader.Lib.Dnd\n     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd\n     *\n     *\n     * 以下文档将可能省略`WebUploader`前缀。\n     * @module WebUploader\n     * @title WebUploader API文档\n     */\n    define('base',[\n        'dollar',\n        'promise'\n    ], function( $, promise ) {\n    \n        var noop = function() {},\n            call = Function.call;\n    \n        // http://jsperf.com/uncurrythis\n        // 反科里化\n        function uncurryThis( fn ) {\n            return function() {\n                return call.apply( fn, arguments );\n            };\n        }\n    \n        function bindFn( fn, context ) {\n            return function() {\n                return fn.apply( context, arguments );\n            };\n        }\n    \n        function createObject( proto ) {\n            var f;\n    \n            if ( Object.create ) {\n                return Object.create( proto );\n            } else {\n                f = function() {};\n                f.prototype = proto;\n                return new f();\n            }\n        }\n    \n    \n        /**\n         * 基础类，提供一些简单常用的方法。\n         * @class Base\n         */\n        return {\n    \n            /**\n             * @property {String} version 当前版本号。\n             */\n            version: '0.1.2',\n    \n            /**\n             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。\n             */\n            $: $,\n    \n            Deferred: promise.Deferred,\n    \n            isPromise: promise.isPromise,\n    \n            when: promise.when,\n    \n            /**\n             * @description  简单的浏览器检查结果。\n             *\n             * * `webkit`  webkit版本号，如果浏览器为非webkit内核，此属性为`undefined`。\n             * * `chrome`  chrome浏览器版本号，如果浏览器为chrome，此属性为`undefined`。\n             * * `ie`  ie浏览器版本号，如果浏览器为非ie，此属性为`undefined`。**暂不支持ie10+**\n             * * `firefox`  firefox浏览器版本号，如果浏览器为非firefox，此属性为`undefined`。\n             * * `safari`  safari浏览器版本号，如果浏览器为非safari，此属性为`undefined`。\n             * * `opera`  opera浏览器版本号，如果浏览器为非opera，此属性为`undefined`。\n             *\n             * @property {Object} [browser]\n             */\n            browser: (function( ua ) {\n                var ret = {},\n                    webkit = ua.match( /WebKit\\/([\\d.]+)/ ),\n                    chrome = ua.match( /Chrome\\/([\\d.]+)/ ) ||\n                        ua.match( /CriOS\\/([\\d.]+)/ ),\n    \n                    ie = ua.match( /MSIE\\s([\\d\\.]+)/ ) ||\n                        ua.match(/(?:trident)(?:.*rv:([\\w.]+))?/i),\n                    firefox = ua.match( /Firefox\\/([\\d.]+)/ ),\n                    safari = ua.match( /Safari\\/([\\d.]+)/ ),\n                    opera = ua.match( /OPR\\/([\\d.]+)/ );\n    \n                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));\n                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));\n                ie && (ret.ie = parseFloat( ie[ 1 ] ));\n                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));\n                safari && (ret.safari = parseFloat( safari[ 1 ] ));\n                opera && (ret.opera = parseFloat( opera[ 1 ] ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * @description  操作系统检查结果。\n             *\n             * * `android`  如果在android浏览器环境下，此值为对应的android版本号，否则为`undefined`。\n             * * `ios` 如果在ios浏览器环境下，此值为对应的ios版本号，否则为`undefined`。\n             * @property {Object} [os]\n             */\n            os: (function( ua ) {\n                var ret = {},\n    \n                    // osx = !!ua.match( /\\(Macintosh\\; Intel / ),\n                    android = ua.match( /(?:Android);?[\\s\\/]+([\\d.]+)?/ ),\n                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\\s([\\d_]+)/ );\n    \n                // osx && (ret.osx = true);\n                android && (ret.android = parseFloat( android[ 1 ] ));\n                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * 实现类与类之间的继承。\n             * @method inherits\n             * @grammar Base.inherits( super ) => child\n             * @grammar Base.inherits( super, protos ) => child\n             * @grammar Base.inherits( super, protos, statics ) => child\n             * @param  {Class} super 父类\n             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor，子类将是用此属性值。\n             * @param  {Function} [protos.constructor] 子类构造器，不指定的话将创建个临时的直接执行父类构造器的方法。\n             * @param  {Object} [statics] 静态属性或方法。\n             * @return {Class} 返回子类。\n             * @example\n             * function Person() {\n             *     console.log( 'Super' );\n             * }\n             * Person.prototype.hello = function() {\n             *     console.log( 'hello' );\n             * };\n             *\n             * var Manager = Base.inherits( Person, {\n             *     world: function() {\n             *         console.log( 'World' );\n             *     }\n             * });\n             *\n             * // 因为没有指定构造器，父类的构造器将会执行。\n             * var instance = new Manager();    // => Super\n             *\n             * // 继承子父类的方法\n             * instance.hello();    // => hello\n             * instance.world();    // => World\n             *\n             * // 子类的__super__属性指向父类\n             * console.log( Manager.__super__ === Person );    // => true\n             */\n            inherits: function( Super, protos, staticProtos ) {\n                var child;\n    \n                if ( typeof protos === 'function' ) {\n                    child = protos;\n                    protos = null;\n                } else if ( protos && protos.hasOwnProperty('constructor') ) {\n                    child = protos.constructor;\n                } else {\n                    child = function() {\n                        return Super.apply( this, arguments );\n                    };\n                }\n    \n                // 复制静态方法\n                $.extend( true, child, Super, staticProtos || {} );\n    \n                /* jshint camelcase: false */\n    \n                // 让子类的__super__属性指向父类。\n                child.__super__ = Super.prototype;\n    \n                // 构建原型，添加原型方法或属性。\n                // 暂时用Object.create实现。\n                child.prototype = createObject( Super.prototype );\n                protos && $.extend( true, child.prototype, protos );\n    \n                return child;\n            },\n    \n            /**\n             * 一个不做任何事情的方法。可以用来赋值给默认的callback.\n             * @method noop\n             */\n            noop: noop,\n    \n            /**\n             * 返回一个新的方法，此方法将已指定的`context`来执行。\n             * @grammar Base.bindFn( fn, context ) => Function\n             * @method bindFn\n             * @example\n             * var doSomething = function() {\n             *         console.log( this.name );\n             *     },\n             *     obj = {\n             *         name: 'Object Name'\n             *     },\n             *     aliasFn = Base.bind( doSomething, obj );\n             *\n             *  aliasFn();    // => Object Name\n             *\n             */\n            bindFn: bindFn,\n    \n            /**\n             * 引用Console.log如果存在的话，否则引用一个[空函数loop](#WebUploader:Base.log)。\n             * @grammar Base.log( args... ) => undefined\n             * @method log\n             */\n            log: (function() {\n                if ( window.console ) {\n                    return bindFn( console.log, console );\n                }\n                return noop;\n            })(),\n    \n            nextTick: (function() {\n    \n                return function( cb ) {\n                    setTimeout( cb, 1 );\n                };\n    \n                // @bug 当浏览器不在当前窗口时就停了。\n                // var next = window.requestAnimationFrame ||\n                //     window.webkitRequestAnimationFrame ||\n                //     window.mozRequestAnimationFrame ||\n                //     function( cb ) {\n                //         window.setTimeout( cb, 1000 / 60 );\n                //     };\n    \n                // // fix: Uncaught TypeError: Illegal invocation\n                // return bindFn( next, window );\n            })(),\n    \n            /**\n             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。\n             * 将用来将非数组对象转化成数组对象。\n             * @grammar Base.slice( target, start[, end] ) => Array\n             * @method slice\n             * @example\n             * function doSomthing() {\n             *     var args = Base.slice( arguments, 1 );\n             *     console.log( args );\n             * }\n             *\n             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array [\"arg2\", \"arg3\"]\n             */\n            slice: uncurryThis( [].slice ),\n    \n            /**\n             * 生成唯一的ID\n             * @method guid\n             * @grammar Base.guid() => String\n             * @grammar Base.guid( prefx ) => String\n             */\n            guid: (function() {\n                var counter = 0;\n    \n                return function( prefix ) {\n                    var guid = (+new Date()).toString( 32 ),\n                        i = 0;\n    \n                    for ( ; i < 5; i++ ) {\n                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );\n                    }\n    \n                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );\n                };\n            })(),\n    \n            /**\n             * 格式化文件大小, 输出成带单位的字符串\n             * @method formatSize\n             * @grammar Base.formatSize( size ) => String\n             * @grammar Base.formatSize( size, pointLength ) => String\n             * @grammar Base.formatSize( size, pointLength, units ) => String\n             * @param {Number} size 文件大小\n             * @param {Number} [pointLength=2] 精确到的小数点数。\n             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节，到千字节，一直往上指定。如果单位数组里面只指定了到了K(千字节)，同时文件大小大于M, 此方法的输出将还是显示成多少K.\n             * @example\n             * console.log( Base.formatSize( 100 ) );    // => 100B\n             * console.log( Base.formatSize( 1024 ) );    // => 1.00K\n             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K\n             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M\n             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G\n             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB\n             */\n            formatSize: function( size, pointLength, units ) {\n                var unit;\n    \n                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];\n    \n                while ( (unit = units.shift()) && size > 1024 ) {\n                    size = size / 1024;\n                }\n    \n                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +\n                        unit;\n            }\n        };\n    });\n    /**\n     * 事件处理类，可以独立使用，也可以扩展给对象使用。\n     * @fileOverview Mediator\n     */\n    define('mediator',[\n        'base'\n    ], function( Base ) {\n        var $ = Base.$,\n            slice = [].slice,\n            separator = /\\s+/,\n            protos;\n    \n        // 根据条件过滤出事件handlers.\n        function findHandlers( arr, name, callback, context ) {\n            return $.grep( arr, function( handler ) {\n                return handler &&\n                        (!name || handler.e === name) &&\n                        (!callback || handler.cb === callback ||\n                        handler.cb._cb === callback) &&\n                        (!context || handler.ctx === context);\n            });\n        }\n    \n        function eachEvent( events, callback, iterator ) {\n            // 不支持对象，只支持多个event用空格隔开\n            $.each( (events || '').split( separator ), function( _, key ) {\n                iterator( key, callback );\n            });\n        }\n    \n        function triggerHanders( events, args ) {\n            var stoped = false,\n                i = -1,\n                len = events.length,\n                handler;\n    \n            while ( ++i < len ) {\n                handler = events[ i ];\n    \n                if ( handler.cb.apply( handler.ctx2, args ) === false ) {\n                    stoped = true;\n                    break;\n                }\n            }\n    \n            return !stoped;\n        }\n    \n        protos = {\n    \n            /**\n             * 绑定事件。\n             *\n             * `callback`方法在执行时，arguments将会来源于trigger的时候携带的参数。如\n             * ```javascript\n             * var obj = {};\n             *\n             * // 使得obj有事件行为\n             * Mediator.installTo( obj );\n             *\n             * obj.on( 'testa', function( arg1, arg2 ) {\n             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'\n             * });\n             *\n             * obj.trigger( 'testa', 'arg1', 'arg2' );\n             * ```\n             *\n             * 如果`callback`中，某一个方法`return false`了，则后续的其他`callback`都不会被执行到。\n             * 切会影响到`trigger`方法的返回值，为`false`。\n             *\n             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处，\n             * 就是第一个参数为`type`，记录当前是什么事件在触发。此类`callback`的优先级比脚低，会再正常`callback`执行完后触发。\n             * ```javascript\n             * obj.on( 'all', function( type, arg1, arg2 ) {\n             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'\n             * });\n             * ```\n             *\n             * @method on\n             * @grammar on( name, callback[, context] ) => self\n             * @param  {String}   name     事件名，支持多个事件用空格隔开\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             * @class Mediator\n             */\n            on: function( name, callback, context ) {\n                var me = this,\n                    set;\n    \n                if ( !callback ) {\n                    return this;\n                }\n    \n                set = this._events || (this._events = []);\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var handler = { e: name };\n    \n                    handler.cb = callback;\n                    handler.ctx = context;\n                    handler.ctx2 = context || me;\n                    handler.id = set.length;\n    \n                    set.push( handler );\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 绑定事件，且当handler执行完后，自动解除绑定。\n             * @method once\n             * @grammar once( name, callback[, context] ) => self\n             * @param  {String}   name     事件名\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            once: function( name, callback, context ) {\n                var me = this;\n    \n                if ( !callback ) {\n                    return me;\n                }\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var once = function() {\n                            me.off( name, once );\n                            return callback.apply( context || me, arguments );\n                        };\n    \n                    once._cb = callback;\n                    me.on( name, once, context );\n                });\n    \n                return me;\n            },\n    \n            /**\n             * 解除事件绑定\n             * @method off\n             * @grammar off( [name[, callback[, context] ] ] ) => self\n             * @param  {String}   [name]     事件名\n             * @param  {Function} [callback] 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            off: function( name, cb, ctx ) {\n                var events = this._events;\n    \n                if ( !events ) {\n                    return this;\n                }\n    \n                if ( !name && !cb && !ctx ) {\n                    this._events = [];\n                    return this;\n                }\n    \n                eachEvent( name, cb, function( name, cb ) {\n                    $.each( findHandlers( events, name, cb, ctx ), function() {\n                        delete events[ this.id ];\n                    });\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 触发事件\n             * @method trigger\n             * @grammar trigger( name[, args...] ) => self\n             * @param  {String}   type     事件名\n             * @param  {*} [...] 任意参数\n             * @return {Boolean} 如果handler中return false了，则返回false, 否则返回true\n             */\n            trigger: function( type ) {\n                var args, events, allEvents;\n    \n                if ( !this._events || !type ) {\n                    return this;\n                }\n    \n                args = slice.call( arguments, 1 );\n                events = findHandlers( this._events, type );\n                allEvents = findHandlers( this._events, 'all' );\n    \n                return triggerHanders( events, args ) &&\n                        triggerHanders( allEvents, arguments );\n            }\n        };\n    \n        /**\n         * 中介者，它本身是个单例，但可以通过[installTo](#WebUploader:Mediator:installTo)方法，使任何对象具备事件行为。\n         * 主要目的是负责模块与模块之间的合作，降低耦合度。\n         *\n         * @class Mediator\n         */\n        return $.extend({\n    \n            /**\n             * 可以通过这个接口，使任何对象具备事件功能。\n             * @method installTo\n             * @param  {Object} obj 需要具备事件行为的对象。\n             * @return {Object} 返回obj.\n             */\n            installTo: function( obj ) {\n                return $.extend( obj, protos );\n            }\n    \n        }, protos );\n    });\n    /**\n     * @fileOverview Uploader上传类\n     */\n    define('uploader',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$;\n    \n        /**\n         * 上传入口类。\n         * @class Uploader\n         * @constructor\n         * @grammar new Uploader( opts ) => Uploader\n         * @example\n         * var uploader = WebUploader.Uploader({\n         *     swf: 'path_of_swf/Uploader.swf',\n         *\n         *     // 开起分片上传。\n         *     chunked: true\n         * });\n         */\n        function Uploader( opts ) {\n            this.options = $.extend( true, {}, Uploader.options, opts );\n            this._init( this.options );\n        }\n    \n        // default Options\n        // widgets中有相应扩展\n        Uploader.options = {};\n        Mediator.installTo( Uploader.prototype );\n    \n        // 批量添加纯命令式方法。\n        $.each({\n            upload: 'start-upload',\n            stop: 'stop-upload',\n            getFile: 'get-file',\n            getFiles: 'get-files',\n            addFile: 'add-file',\n            addFiles: 'add-file',\n            sort: 'sort-files',\n            removeFile: 'remove-file',\n            skipFile: 'skip-file',\n            retry: 'retry',\n            isInProgress: 'is-in-progress',\n            makeThumb: 'make-thumb',\n            getDimension: 'get-dimension',\n            addButton: 'add-btn',\n            getRuntimeType: 'get-runtime-type',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable',\n            reset: 'reset'\n        }, function( fn, command ) {\n            Uploader.prototype[ fn ] = function() {\n                return this.request( command, arguments );\n            };\n        });\n    \n        $.extend( Uploader.prototype, {\n            state: 'pending',\n    \n            _init: function( opts ) {\n                var me = this;\n    \n                me.request( 'init', opts, function() {\n                    me.state = 'ready';\n                    me.trigger('ready');\n                });\n            },\n    \n            /**\n             * 获取或者设置Uploader配置项。\n             * @method option\n             * @grammar option( key ) => *\n             * @grammar option( key, val ) => self\n             * @example\n             *\n             * // 初始状态图片上传前不会压缩\n             * var uploader = new WebUploader.Uploader({\n             *     resize: null;\n             * });\n             *\n             * // 修改后图片上传前，尝试将图片压缩到1600 * 1600\n             * uploader.options( 'resize', {\n             *     width: 1600,\n             *     height: 1600\n             * });\n             */\n            option: function( key, val ) {\n                var opts = this.options;\n    \n                // setter\n                if ( arguments.length > 1 ) {\n    \n                    if ( $.isPlainObject( val ) &&\n                            $.isPlainObject( opts[ key ] ) ) {\n                        $.extend( opts[ key ], val );\n                    } else {\n                        opts[ key ] = val;\n                    }\n    \n                } else {    // getter\n                    return key ? opts[ key ] : opts;\n                }\n            },\n    \n            /**\n             * 获取文件统计信息。返回一个包含一下信息的对象。\n             * * `successNum` 上传成功的文件数\n             * * `uploadFailNum` 上传失败的文件数\n             * * `cancelNum` 被删除的文件数\n             * * `invalidNum` 无效的文件数\n             * * `queueNum` 还在队列中的文件数\n             * @method getStats\n             * @grammar getStats() => Object\n             */\n            getStats: function() {\n                // return this._mgr.getStats.apply( this._mgr, arguments );\n                var stats = this.request('get-stats');\n    \n                return {\n                    successNum: stats.numOfSuccess,\n    \n                    // who care?\n                    // queueFailNum: 0,\n                    cancelNum: stats.numOfCancel,\n                    invalidNum: stats.numOfInvalid,\n                    uploadFailNum: stats.numOfUploadFailed,\n                    queueNum: stats.numOfQueue\n                };\n            },\n    \n            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器\n            trigger: function( type/*, args...*/ ) {\n                var args = [].slice.call( arguments, 1 ),\n                    opts = this.options,\n                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +\n                        type.substring( 1 );\n    \n                if (\n                        // 调用通过on方法注册的handler.\n                        Mediator.trigger.apply( this, arguments ) === false ||\n    \n                        // 调用opts.onEvent\n                        $.isFunction( opts[ name ] ) &&\n                        opts[ name ].apply( this, args ) === false ||\n    \n                        // 调用this.onEvent\n                        $.isFunction( this[ name ] ) &&\n                        this[ name ].apply( this, args ) === false ||\n    \n                        // 广播所有uploader的事件。\n                        Mediator.trigger.apply( Mediator,\n                        [ this, type ].concat( args ) ) === false ) {\n    \n                    return false;\n                }\n    \n                return true;\n            },\n    \n            // widgets/widget.js将补充此方法的详细文档。\n            request: Base.noop\n        });\n    \n        /**\n         * 创建Uploader实例，等同于new Uploader( opts );\n         * @method create\n         * @class Base\n         * @static\n         * @grammar Base.create( opts ) => Uploader\n         */\n        Base.create = Uploader.create = function( opts ) {\n            return new Uploader( opts );\n        };\n    \n        // 暴露Uploader，可以通过它来扩展业务逻辑。\n        Base.Uploader = Uploader;\n    \n        return Uploader;\n    });\n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/runtime',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            factories = {},\n    \n            // 获取对象的第一个key\n            getFirstKey = function( obj ) {\n                for ( var key in obj ) {\n                    if ( obj.hasOwnProperty( key ) ) {\n                        return key;\n                    }\n                }\n                return null;\n            };\n    \n        // 接口类。\n        function Runtime( options ) {\n            this.options = $.extend({\n                container: document.body\n            }, options );\n            this.uid = Base.guid('rt_');\n        }\n    \n        $.extend( Runtime.prototype, {\n    \n            getContainer: function() {\n                var opts = this.options,\n                    parent, container;\n    \n                if ( this._container ) {\n                    return this._container;\n                }\n    \n                parent = $( opts.container || document.body );\n                container = $( document.createElement('div') );\n    \n                container.attr( 'id', 'rt_' + this.uid );\n                container.css({\n                    position: 'absolute',\n                    top: '0px',\n                    left: '0px',\n                    width: '1px',\n                    height: '1px',\n                    overflow: 'hidden'\n                });\n    \n                parent.append( container );\n                parent.addClass('webuploader-container');\n                this._container = container;\n                return container;\n            },\n    \n            init: Base.noop,\n            exec: Base.noop,\n    \n            destroy: function() {\n                if ( this._container ) {\n                    this._container.parentNode.removeChild( this.__container );\n                }\n    \n                this.off();\n            }\n        });\n    \n        Runtime.orders = 'html5,flash';\n    \n    \n        /**\n         * 添加Runtime实现。\n         * @param {String} type    类型\n         * @param {Runtime} factory 具体Runtime实现。\n         */\n        Runtime.addRuntime = function( type, factory ) {\n            factories[ type ] = factory;\n        };\n    \n        Runtime.hasRuntime = function( type ) {\n            return !!(type ? factories[ type ] : getFirstKey( factories ));\n        };\n    \n        Runtime.create = function( opts, orders ) {\n            var type, runtime;\n    \n            orders = orders || Runtime.orders;\n            $.each( orders.split( /\\s*,\\s*/g ), function() {\n                if ( factories[ this ] ) {\n                    type = this;\n                    return false;\n                }\n            });\n    \n            type = type || getFirstKey( factories );\n    \n            if ( !type ) {\n                throw new Error('Runtime Error');\n            }\n    \n            runtime = new factories[ type ]( opts );\n            return runtime;\n        };\n    \n        Mediator.installTo( Runtime.prototype );\n        return Runtime;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/client',[\n        'base',\n        'mediator',\n        'runtime/runtime'\n    ], function( Base, Mediator, Runtime ) {\n    \n        var cache;\n    \n        cache = (function() {\n            var obj = {};\n    \n            return {\n                add: function( runtime ) {\n                    obj[ runtime.uid ] = runtime;\n                },\n    \n                get: function( ruid, standalone ) {\n                    var i;\n    \n                    if ( ruid ) {\n                        return obj[ ruid ];\n                    }\n    \n                    for ( i in obj ) {\n                        // 有些类型不能重用，比如filepicker.\n                        if ( standalone && obj[ i ].__standalone ) {\n                            continue;\n                        }\n    \n                        return obj[ i ];\n                    }\n    \n                    return null;\n                },\n    \n                remove: function( runtime ) {\n                    delete obj[ runtime.uid ];\n                }\n            };\n        })();\n    \n        function RuntimeClient( component, standalone ) {\n            var deferred = Base.Deferred(),\n                runtime;\n    \n            this.uid = Base.guid('client_');\n    \n            // 允许runtime没有初始化之前，注册一些方法在初始化后执行。\n            this.runtimeReady = function( cb ) {\n                return deferred.done( cb );\n            };\n    \n            this.connectRuntime = function( opts, cb ) {\n    \n                // already connected.\n                if ( runtime ) {\n                    throw new Error('already connected!');\n                }\n    \n                deferred.done( cb );\n    \n                if ( typeof opts === 'string' && cache.get( opts ) ) {\n                    runtime = cache.get( opts );\n                }\n    \n                // 像filePicker只能独立存在，不能公用。\n                runtime = runtime || cache.get( null, standalone );\n    \n                // 需要创建\n                if ( !runtime ) {\n                    runtime = Runtime.create( opts, opts.runtimeOrder );\n                    runtime.__promise = deferred.promise();\n                    runtime.once( 'ready', deferred.resolve );\n                    runtime.init();\n                    cache.add( runtime );\n                    runtime.__client = 1;\n                } else {\n                    // 来自cache\n                    Base.$.extend( runtime.options, opts );\n                    runtime.__promise.then( deferred.resolve );\n                    runtime.__client++;\n                }\n    \n                standalone && (runtime.__standalone = standalone);\n                return runtime;\n            };\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.disconnectRuntime = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                runtime.__client--;\n    \n                if ( runtime.__client <= 0 ) {\n                    cache.remove( runtime );\n                    delete runtime.__promise;\n                    runtime.destroy();\n                }\n    \n                runtime = null;\n            };\n    \n            this.exec = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                var args = Base.slice( arguments );\n                component && args.unshift( component );\n    \n                return runtime.exec.apply( this, args );\n            };\n    \n            this.getRuid = function() {\n                return runtime && runtime.uid;\n            };\n    \n            this.destroy = (function( destroy ) {\n                return function() {\n                    destroy && destroy.apply( this, arguments );\n                    this.trigger('destroy');\n                    this.off();\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                };\n            })( this.destroy );\n        }\n    \n        Mediator.installTo( RuntimeClient.prototype );\n        return RuntimeClient;\n    });\n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/dnd',[\n        'base',\n        'mediator',\n        'runtime/client'\n    ], function( Base, Mediator, RuntimeClent ) {\n    \n        var $ = Base.$;\n    \n        function DragAndDrop( opts ) {\n            opts = this.options = $.extend({}, DragAndDrop.options, opts );\n    \n            opts.container = $( opts.container );\n    \n            if ( !opts.container.length ) {\n                return;\n            }\n    \n            RuntimeClent.call( this, 'DragAndDrop' );\n        }\n    \n        DragAndDrop.options = {\n            accept: null,\n            disableGlobalDnd: false\n        };\n    \n        Base.inherits( RuntimeClent, {\n            constructor: DragAndDrop,\n    \n            init: function() {\n                var me = this;\n    \n                me.connectRuntime( me.options, function() {\n                    me.exec('init');\n                    me.trigger('ready');\n                });\n            },\n    \n            destroy: function() {\n                this.disconnectRuntime();\n            }\n        });\n    \n        Mediator.installTo( DragAndDrop.prototype );\n    \n        return DragAndDrop;\n    });\n    /**\n     * @fileOverview 组件基类。\n     */\n    define('widgets/widget',[\n        'base',\n        'uploader'\n    ], function( Base, Uploader ) {\n    \n        var $ = Base.$,\n            _init = Uploader.prototype._init,\n            IGNORE = {},\n            widgetClass = [];\n    \n        function isArrayLike( obj ) {\n            if ( !obj ) {\n                return false;\n            }\n    \n            var length = obj.length,\n                type = $.type( obj );\n    \n            if ( obj.nodeType === 1 && length ) {\n                return true;\n            }\n    \n            return type === 'array' || type !== 'function' && type !== 'string' &&\n                    (length === 0 || typeof length === 'number' && length > 0 &&\n                    (length - 1) in obj);\n        }\n    \n        function Widget( uploader ) {\n            this.owner = uploader;\n            this.options = uploader.options;\n        }\n    \n        $.extend( Widget.prototype, {\n    \n            init: Base.noop,\n    \n            // 类Backbone的事件监听声明，监听uploader实例上的事件\n            // widget直接无法监听事件，事件只能通过uploader来传递\n            invoke: function( apiName, args ) {\n    \n                /*\n                    {\n                        'make-thumb': 'makeThumb'\n                    }\n                 */\n                var map = this.responseMap;\n    \n                // 如果无API响应声明则忽略\n                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||\n                        !$.isFunction( this[ map[ apiName ] ] ) ) {\n    \n                    return IGNORE;\n                }\n    \n                return this[ map[ apiName ] ].apply( this, args );\n    \n            },\n    \n            /**\n             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。\n             * @method request\n             * @grammar request( command, args ) => * | Promise\n             * @grammar request( command, args, callback ) => Promise\n             * @for  Uploader\n             */\n            request: function() {\n                return this.owner.request.apply( this.owner, arguments );\n            }\n        });\n    \n        // 扩展Uploader.\n        $.extend( Uploader.prototype, {\n    \n            // 覆写_init用来初始化widgets\n            _init: function() {\n                var me = this,\n                    widgets = me._widgets = [];\n    \n                $.each( widgetClass, function( _, klass ) {\n                    widgets.push( new klass( me ) );\n                });\n    \n                return _init.apply( me, arguments );\n            },\n    \n            request: function( apiName, args, callback ) {\n                var i = 0,\n                    widgets = this._widgets,\n                    len = widgets.length,\n                    rlts = [],\n                    dfds = [],\n                    widget, rlt, promise, key;\n    \n                args = isArrayLike( args ) ? args : [ args ];\n    \n                for ( ; i < len; i++ ) {\n                    widget = widgets[ i ];\n                    rlt = widget.invoke( apiName, args );\n    \n                    if ( rlt !== IGNORE ) {\n    \n                        // Deferred对象\n                        if ( Base.isPromise( rlt ) ) {\n                            dfds.push( rlt );\n                        } else {\n                            rlts.push( rlt );\n                        }\n                    }\n                }\n    \n                // 如果有callback，则用异步方式。\n                if ( callback || dfds.length ) {\n                    promise = Base.when.apply( Base, dfds );\n                    key = promise.pipe ? 'pipe' : 'then';\n    \n                    // 很重要不能删除。删除了会死循环。\n                    // 保证执行顺序。让callback总是在下一个tick中执行。\n                    return promise[ key ](function() {\n                                var deferred = Base.Deferred(),\n                                    args = arguments;\n    \n                                setTimeout(function() {\n                                    deferred.resolve.apply( deferred, args );\n                                }, 1 );\n    \n                                return deferred.promise();\n                            })[ key ]( callback || Base.noop );\n                } else {\n                    return rlts[ 0 ];\n                }\n            }\n        });\n    \n        /**\n         * 添加组件\n         * @param  {object} widgetProto 组件原型，构造函数通过constructor属性定义\n         * @param  {object} responseMap API名称与函数实现的映射\n         * @example\n         *     Uploader.register( {\n         *         init: function( options ) {},\n         *         makeThumb: function() {}\n         *     }, {\n         *         'make-thumb': 'makeThumb'\n         *     } );\n         */\n        Uploader.register = Widget.register = function( responseMap, widgetProto ) {\n            var map = { init: 'init' },\n                klass;\n    \n            if ( arguments.length === 1 ) {\n                widgetProto = responseMap;\n                widgetProto.responseMap = map;\n            } else {\n                widgetProto.responseMap = $.extend( map, responseMap );\n            }\n    \n            klass = Base.inherits( Widget, widgetProto );\n            widgetClass.push( klass );\n    \n            return klass;\n        };\n    \n        return Widget;\n    });\n    /**\n     * @fileOverview DragAndDrop Widget。\n     */\n    define('widgets/filednd',[\n        'base',\n        'uploader',\n        'lib/dnd',\n        'widgets/widget'\n    ], function( Base, Uploader, Dnd ) {\n        var $ = Base.$;\n    \n        Uploader.options.dnd = '';\n    \n        /**\n         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器，如果不指定，则不启动。\n         * @namespace options\n         * @for Uploader\n         */\n    \n        /**\n         * @event dndAccept\n         * @param {DataTransferItemList} items DataTransferItem\n         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API，且只能通过 mime-type 验证。\n         * @for  Uploader\n         */\n        return Uploader.register({\n            init: function( opts ) {\n    \n                if ( !opts.dnd ||\n                        this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                var me = this,\n                    deferred = Base.Deferred(),\n                    options = $.extend({}, {\n                        disableGlobalDnd: opts.disableGlobalDnd,\n                        container: opts.dnd,\n                        accept: opts.accept\n                    }),\n                    dnd;\n    \n                dnd = new Dnd( options );\n    \n                dnd.once( 'ready', deferred.resolve );\n                dnd.on( 'drop', function( files ) {\n                    me.request( 'add-file', [ files ]);\n                });\n    \n                // 检测文件是否全部允许添加。\n                dnd.on( 'accept', function( items ) {\n                    return me.owner.trigger( 'dndAccept', items );\n                });\n    \n                dnd.init();\n    \n                return deferred.promise();\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/filepaste',[\n        'base',\n        'mediator',\n        'runtime/client'\n    ], function( Base, Mediator, RuntimeClent ) {\n    \n        var $ = Base.$;\n    \n        function FilePaste( opts ) {\n            opts = this.options = $.extend({}, opts );\n            opts.container = $( opts.container || document.body );\n            RuntimeClent.call( this, 'FilePaste' );\n        }\n    \n        Base.inherits( RuntimeClent, {\n            constructor: FilePaste,\n    \n            init: function() {\n                var me = this;\n    \n                me.connectRuntime( me.options, function() {\n                    me.exec('init');\n                    me.trigger('ready');\n                });\n            },\n    \n            destroy: function() {\n                this.exec('destroy');\n                this.disconnectRuntime();\n                this.off();\n            }\n        });\n    \n        Mediator.installTo( FilePaste.prototype );\n    \n        return FilePaste;\n    });\n    /**\n     * @fileOverview 组件基类。\n     */\n    define('widgets/filepaste',[\n        'base',\n        'uploader',\n        'lib/filepaste',\n        'widgets/widget'\n    ], function( Base, Uploader, FilePaste ) {\n        var $ = Base.$;\n    \n        /**\n         * @property {Selector} [paste=undefined]  指定监听paste事件的容器，如果不指定，不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.\n         * @namespace options\n         * @for Uploader\n         */\n        return Uploader.register({\n            init: function( opts ) {\n    \n                if ( !opts.paste ||\n                        this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                var me = this,\n                    deferred = Base.Deferred(),\n                    options = $.extend({}, {\n                        container: opts.paste,\n                        accept: opts.accept\n                    }),\n                    paste;\n    \n                paste = new FilePaste( options );\n    \n                paste.once( 'ready', deferred.resolve );\n                paste.on( 'paste', function( files ) {\n                    me.owner.request( 'add-file', [ files ]);\n                });\n                paste.init();\n    \n                return deferred.promise();\n            }\n        });\n    });\n    /**\n     * @fileOverview Blob\n     */\n    define('lib/blob',[\n        'base',\n        'runtime/client'\n    ], function( Base, RuntimeClient ) {\n    \n        function Blob( ruid, source ) {\n            var me = this;\n    \n            me.source = source;\n            me.ruid = ruid;\n    \n            RuntimeClient.call( me, 'Blob' );\n    \n            this.uid = source.uid || this.uid;\n            this.type = source.type || '';\n            this.size = source.size || 0;\n    \n            if ( ruid ) {\n                me.connectRuntime( ruid );\n            }\n        }\n    \n        Base.inherits( RuntimeClient, {\n            constructor: Blob,\n    \n            slice: function( start, end ) {\n                return this.exec( 'slice', start, end );\n            },\n    \n            getSource: function() {\n                return this.source;\n            }\n        });\n    \n        return Blob;\n    });\n    /**\n     * 为了统一化Flash的File和HTML5的File而存在。\n     * 以至于要调用Flash里面的File，也可以像调用HTML5版本的File一下。\n     * @fileOverview File\n     */\n    define('lib/file',[\n        'base',\n        'lib/blob'\n    ], function( Base, Blob ) {\n    \n        var uid = 1,\n            rExt = /\\.([^.]+)$/;\n    \n        function File( ruid, file ) {\n            var ext;\n    \n            Blob.apply( this, arguments );\n            this.name = file.name || ('untitled' + uid++);\n            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';\n    \n            // todo 支持其他类型文件的转换。\n    \n            // 如果有mimetype, 但是文件名里面没有找出后缀规律\n            if ( !ext && this.type ) {\n                ext = /\\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?\n                        RegExp.$1.toLowerCase() : '';\n                this.name += '.' + ext;\n            }\n    \n            // 如果没有指定mimetype, 但是知道文件后缀。\n            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {\n                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);\n            }\n    \n            this.ext = ext;\n            this.lastModifiedDate = file.lastModifiedDate ||\n                    (new Date()).toLocaleString();\n        }\n    \n        return Base.inherits( Blob, File );\n    });\n    \n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/filepicker',[\n        'base',\n        'runtime/client',\n        'lib/file'\n    ], function( Base, RuntimeClent, File ) {\n    \n        var $ = Base.$;\n    \n        function FilePicker( opts ) {\n            opts = this.options = $.extend({}, FilePicker.options, opts );\n    \n            opts.container = $( opts.id );\n    \n            if ( !opts.container.length ) {\n                throw new Error('按钮指定错误');\n            }\n    \n            opts.innerHTML = opts.innerHTML || opts.label ||\n                    opts.container.html() || '';\n    \n            opts.button = $( opts.button || document.createElement('div') );\n            opts.button.html( opts.innerHTML );\n            opts.container.html( opts.button );\n    \n            RuntimeClent.call( this, 'FilePicker', true );\n        }\n    \n        FilePicker.options = {\n            button: null,\n            container: null,\n            label: null,\n            innerHTML: null,\n            multiple: true,\n            accept: null,\n            name: 'file'\n        };\n    \n        Base.inherits( RuntimeClent, {\n            constructor: FilePicker,\n    \n            init: function() {\n                var me = this,\n                    opts = me.options,\n                    button = opts.button;\n    \n                button.addClass('webuploader-pick');\n    \n                me.on( 'all', function( type ) {\n                    var files;\n    \n                    switch ( type ) {\n                        case 'mouseenter':\n                            button.addClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'mouseleave':\n                            button.removeClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'change':\n                            files = me.exec('getFiles');\n                            me.trigger( 'select', $.map( files, function( file ) {\n                                file = new File( me.getRuid(), file );\n    \n                                // 记录来源。\n                                file._refer = opts.container;\n                                return file;\n                            }), opts.container );\n                            break;\n                    }\n                });\n    \n                me.connectRuntime( opts, function() {\n                    me.refresh();\n                    me.exec( 'init', opts );\n                    me.trigger('ready');\n                });\n    \n                $( window ).on( 'resize', function() {\n                    me.refresh();\n                });\n            },\n    \n            refresh: function() {\n                var shimContainer = this.getRuntime().getContainer(),\n                    button = this.options.button,\n                    width = button.outerWidth ?\n                            button.outerWidth() : button.width(),\n    \n                    height = button.outerHeight ?\n                            button.outerHeight() : button.height(),\n    \n                    pos = button.offset();\n    \n                width && height && shimContainer.css({\n                    bottom: 'auto',\n                    right: 'auto',\n                    width: width + 'px',\n                    height: height + 'px'\n                }).offset( pos );\n            },\n    \n            enable: function() {\n                var btn = this.options.button;\n    \n                btn.removeClass('webuploader-pick-disable');\n                this.refresh();\n            },\n    \n            disable: function() {\n                var btn = this.options.button;\n    \n                this.getRuntime().getContainer().css({\n                    top: '-99999px'\n                });\n    \n                btn.addClass('webuploader-pick-disable');\n            },\n    \n            destroy: function() {\n                if ( this.runtime ) {\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                }\n            }\n        });\n    \n        return FilePicker;\n    });\n    \n    /**\n     * @fileOverview 文件选择相关\n     */\n    define('widgets/filepicker',[\n        'base',\n        'uploader',\n        'lib/filepicker',\n        'widgets/widget'\n    ], function( Base, Uploader, FilePicker ) {\n        var $ = Base.$;\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Selector | Object} [pick=undefined]\n             * @namespace options\n             * @for Uploader\n             * @description 指定选择文件的按钮容器，不指定则不创建按钮。\n             *\n             * * `id` {Seletor} 指定选择文件的按钮容器，不指定则不创建按钮。\n             * * `label` {String} 请采用 `innerHTML` 代替\n             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。\n             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。\n             */\n            pick: null,\n    \n            /**\n             * @property {Arroy} [accept=null]\n             * @namespace options\n             * @for Uploader\n             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表，所以这里需要分开指定。\n             *\n             * * `title` {String} 文字描述\n             * * `extensions` {String} 允许的文件后缀，不带点，多个用逗号分割。\n             * * `mimeTypes` {String} 多个用逗号分割。\n             *\n             * 如：\n             *\n             * ```\n             * {\n             *     title: 'Images',\n             *     extensions: 'gif,jpg,jpeg,bmp,png',\n             *     mimeTypes: 'image/*'\n             * }\n             * ```\n             */\n            accept: null/*{\n                title: 'Images',\n                extensions: 'gif,jpg,jpeg,bmp,png',\n                mimeTypes: 'image/*'\n            }*/\n        });\n    \n        return Uploader.register({\n            'add-btn': 'addButton',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable'\n        }, {\n    \n            init: function( opts ) {\n                this.pickers = [];\n                return opts.pick && this.addButton( opts.pick );\n            },\n    \n            refresh: function() {\n                $.each( this.pickers, function() {\n                    this.refresh();\n                });\n            },\n    \n            /**\n             * @method addButton\n             * @for Uploader\n             * @grammar addButton( pick ) => Promise\n             * @description\n             * 添加文件选择按钮，如果一个按钮不够，需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。\n             * @example\n             * uploader.addButton({\n             *     id: '#btnContainer',\n             *     innerHTML: '选择文件'\n             * });\n             */\n            addButton: function( pick ) {\n                var me = this,\n                    opts = me.options,\n                    accept = opts.accept,\n                    options, picker, deferred;\n    \n                if ( !pick ) {\n                    return;\n                }\n    \n                deferred = Base.Deferred();\n                $.isPlainObject( pick ) || (pick = {\n                    id: pick\n                });\n    \n                options = $.extend({}, pick, {\n                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,\n                    swf: opts.swf,\n                    runtimeOrder: opts.runtimeOrder\n                });\n    \n                picker = new FilePicker( options );\n    \n                picker.once( 'ready', deferred.resolve );\n                picker.on( 'select', function( files ) {\n                    me.owner.request( 'add-file', [ files ]);\n                });\n                picker.init();\n    \n                this.pickers.push( picker );\n    \n                return deferred.promise();\n            },\n    \n            disable: function() {\n                $.each( this.pickers, function() {\n                    this.disable();\n                });\n            },\n    \n            enable: function() {\n                $.each( this.pickers, function() {\n                    this.enable();\n                });\n            }\n        });\n    });\n    /**\n     * @fileOverview Image\n     */\n    define('lib/image',[\n        'base',\n        'runtime/client',\n        'lib/blob'\n    ], function( Base, RuntimeClient, Blob ) {\n        var $ = Base.$;\n    \n        // 构造器。\n        function Image( opts ) {\n            this.options = $.extend({}, Image.options, opts );\n            RuntimeClient.call( this, 'Image' );\n    \n            this.on( 'load', function() {\n                this._info = this.exec('info');\n                this._meta = this.exec('meta');\n            });\n        }\n    \n        // 默认选项。\n        Image.options = {\n    \n            // 默认的图片处理质量\n            quality: 90,\n    \n            // 是否裁剪\n            crop: false,\n    \n            // 是否保留头部信息\n            preserveHeaders: true,\n    \n            // 是否允许放大。\n            allowMagnify: true\n        };\n    \n        // 继承RuntimeClient.\n        Base.inherits( RuntimeClient, {\n            constructor: Image,\n    \n            info: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._info = val;\n                    return this;\n                }\n    \n                // getter\n                return this._info;\n            },\n    \n            meta: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._meta = val;\n                    return this;\n                }\n    \n                // getter\n                return this._meta;\n            },\n    \n            loadFromBlob: function( blob ) {\n                var me = this,\n                    ruid = blob.getRuid();\n    \n                this.connectRuntime( ruid, function() {\n                    me.exec( 'init', me.options );\n                    me.exec( 'loadFromBlob', blob );\n                });\n            },\n    \n            resize: function() {\n                var args = Base.slice( arguments );\n                return this.exec.apply( this, [ 'resize' ].concat( args ) );\n            },\n    \n            getAsDataUrl: function( type ) {\n                return this.exec( 'getAsDataUrl', type );\n            },\n    \n            getAsBlob: function( type ) {\n                var blob = this.exec( 'getAsBlob', type );\n    \n                return new Blob( this.getRuid(), blob );\n            }\n        });\n    \n        return Image;\n    });\n    /**\n     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片\n     */\n    define('widgets/image',[\n        'base',\n        'uploader',\n        'lib/image',\n        'widgets/widget'\n    ], function( Base, Uploader, Image ) {\n    \n        var $ = Base.$,\n            throttle;\n    \n        // 根据要处理的文件大小来节流，一次不能处理太多，会卡。\n        throttle = (function( max ) {\n            var occupied = 0,\n                waiting = [],\n                tick = function() {\n                    var item;\n    \n                    while ( waiting.length && occupied < max ) {\n                        item = waiting.shift();\n                        occupied += item[ 0 ];\n                        item[ 1 ]();\n                    }\n                };\n    \n            return function( emiter, size, cb ) {\n                waiting.push([ size, cb ]);\n                emiter.once( 'destroy', function() {\n                    occupied -= size;\n                    setTimeout( tick, 1 );\n                });\n                setTimeout( tick, 1 );\n            };\n        })( 5 * 1024 * 1024 );\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Object} [thumb]\n             * @namespace options\n             * @for Uploader\n             * @description 配置生成缩略图的选项。\n             *\n             * 默认为：\n             *\n             * ```javascript\n             * {\n             *     width: 110,\n             *     height: 110,\n             *\n             *     // 图片质量，只有type为`image/jpeg`的时候才有效。\n             *     quality: 70,\n             *\n             *     // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n             *     allowMagnify: true,\n             *\n             *     // 是否允许裁剪。\n             *     crop: true,\n             *\n             *     // 是否保留头部meta信息。\n             *     preserveHeaders: false,\n             *\n             *     // 为空的话则保留原有图片格式。\n             *     // 否则强制转换成指定的类型。\n             *     type: 'image/jpeg'\n             * }\n             * ```\n             */\n            thumb: {\n                width: 110,\n                height: 110,\n                quality: 70,\n                allowMagnify: true,\n                crop: true,\n                preserveHeaders: false,\n    \n                // 为空的话则保留原有图片格式。\n                // 否则强制转换成指定的类型。\n                // IE 8下面 base64 大小不能超过 32K 否则预览失败，而非 jpeg 编码的图片很可\n                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg\n                type: 'image/jpeg'\n            },\n    \n            /**\n             * @property {Object} [compress]\n             * @namespace options\n             * @for Uploader\n             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。\n             *\n             * 默认为：\n             *\n             * ```javascript\n             * {\n             *     width: 1600,\n             *     height: 1600,\n             *\n             *     // 图片质量，只有type为`image/jpeg`的时候才有效。\n             *     quality: 90,\n             *\n             *     // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n             *     allowMagnify: false,\n             *\n             *     // 是否允许裁剪。\n             *     crop: false,\n             *\n             *     // 是否保留头部meta信息。\n             *     preserveHeaders: true\n             * }\n             * ```\n             */\n            compress: {\n                width: 1600,\n                height: 1600,\n                quality: 90,\n                allowMagnify: false,\n                crop: false,\n                preserveHeaders: true\n            }\n        });\n    \n        return Uploader.register({\n            'make-thumb': 'makeThumb',\n            'before-send-file': 'compressImage'\n        }, {\n    \n    \n            /**\n             * 生成缩略图，此过程为异步，所以需要传入`callback`。\n             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。\n             *\n             * `callback`中可以接收到两个参数。\n             * * 第一个为error，如果生成缩略图有错误，此error将为真。\n             * * 第二个为ret, 缩略图的Data URL值。\n             *\n             * **注意**\n             * Date URL在IE6/7中不支持，所以不用调用此方法了，直接显示一张暂不支持预览图片好了。\n             *\n             *\n             * @method makeThumb\n             * @grammar makeThumb( file, callback ) => undefined\n             * @grammar makeThumb( file, callback, width, height ) => undefined\n             * @for Uploader\n             * @example\n             *\n             * uploader.on( 'fileQueued', function( file ) {\n             *     var $li = ...;\n             *\n             *     uploader.makeThumb( file, function( error, ret ) {\n             *         if ( error ) {\n             *             $li.text('预览错误');\n             *         } else {\n             *             $li.append('<img alt=\"\" src=\"' + ret + '\" />');\n             *         }\n             *     });\n             *\n             * });\n             */\n            makeThumb: function( file, cb, width, height ) {\n                var opts, image;\n    \n                file = this.request( 'get-file', file );\n    \n                // 只预览图片格式。\n                if ( !file.type.match( /^image/ ) ) {\n                    cb( true );\n                    return;\n                }\n    \n                opts = $.extend({}, this.options.thumb );\n    \n                // 如果传入的是object.\n                if ( $.isPlainObject( width ) ) {\n                    opts = $.extend( opts, width );\n                    width = null;\n                }\n    \n                width = width || opts.width;\n                height = height || opts.height;\n    \n                image = new Image( opts );\n    \n                image.once( 'load', function() {\n                    file._info = file._info || image.info();\n                    file._meta = file._meta || image.meta();\n                    image.resize( width, height );\n                });\n    \n                image.once( 'complete', function() {\n                    cb( false, image.getAsDataUrl( opts.type ) );\n                    image.destroy();\n                });\n    \n                image.once( 'error', function() {\n                    cb( true );\n                    image.destroy();\n                });\n    \n                throttle( image, file.source.size, function() {\n                    file._info && image.info( file._info );\n                    file._meta && image.meta( file._meta );\n                    image.loadFromBlob( file.source );\n                });\n            },\n    \n            compressImage: function( file ) {\n                var opts = this.options.compress || this.options.resize,\n                    compressSize = opts && opts.compressSize || 300 * 1024,\n                    image, deferred;\n    \n                file = this.request( 'get-file', file );\n    \n                // 只预览图片格式。\n                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||\n                        file.size < compressSize ||\n                        file._compressed ) {\n                    return;\n                }\n    \n                opts = $.extend({}, opts );\n                deferred = Base.Deferred();\n    \n                image = new Image( opts );\n    \n                deferred.always(function() {\n                    image.destroy();\n                    image = null;\n                });\n                image.once( 'error', deferred.reject );\n                image.once( 'load', function() {\n                    file._info = file._info || image.info();\n                    file._meta = file._meta || image.meta();\n                    image.resize( opts.width, opts.height );\n                });\n    \n                image.once( 'complete', function() {\n                    var blob, size;\n    \n                    // 移动端 UC / qq 浏览器的无图模式下\n                    // ctx.getImageData 处理大图的时候会报 Exception\n                    // INDEX_SIZE_ERR: DOM Exception 1\n                    try {\n                        blob = image.getAsBlob( opts.type );\n    \n                        size = file.size;\n    \n                        // 如果压缩后，比原来还大则不用压缩后的。\n                        if ( blob.size < size ) {\n                            // file.source.destroy && file.source.destroy();\n                            file.source = blob;\n                            file.size = blob.size;\n    \n                            file.trigger( 'resize', blob.size, size );\n                        }\n    \n                        // 标记，避免重复压缩。\n                        file._compressed = true;\n                        deferred.resolve();\n                    } catch ( e ) {\n                        // 出错了直接继续，让其上传原始图片\n                        deferred.resolve();\n                    }\n                });\n    \n                file._info && image.info( file._info );\n                file._meta && image.meta( file._meta );\n    \n                image.loadFromBlob( file.source );\n                return deferred.promise();\n            }\n        });\n    });\n    /**\n     * @fileOverview 文件属性封装\n     */\n    define('file',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            idPrefix = 'WU_FILE_',\n            idSuffix = 0,\n            rExt = /\\.([^.]+)$/,\n            statusMap = {};\n    \n        function gid() {\n            return idPrefix + idSuffix++;\n        }\n    \n        /**\n         * 文件类\n         * @class File\n         * @constructor 构造函数\n         * @grammar new File( source ) => File\n         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。\n         */\n        function WUFile( source ) {\n    \n            /**\n             * 文件名，包括扩展名（后缀）\n             * @property name\n             * @type {string}\n             */\n            this.name = source.name || 'Untitled';\n    \n            /**\n             * 文件体积（字节）\n             * @property size\n             * @type {uint}\n             * @default 0\n             */\n            this.size = source.size || 0;\n    \n            /**\n             * 文件MIMETYPE类型，与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)\n             * @property type\n             * @type {string}\n             * @default 'application'\n             */\n            this.type = source.type || 'application';\n    \n            /**\n             * 文件最后修改日期\n             * @property lastModifiedDate\n             * @type {int}\n             * @default 当前时间戳\n             */\n            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);\n    \n            /**\n             * 文件ID，每个对象具有唯一ID，与文件名无关\n             * @property id\n             * @type {string}\n             */\n            this.id = gid();\n    \n            /**\n             * 文件扩展名，通过文件名获取，例如test.png的扩展名为png\n             * @property ext\n             * @type {string}\n             */\n            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';\n    \n    \n            /**\n             * 状态文字说明。在不同的status语境下有不同的用途。\n             * @property statusText\n             * @type {string}\n             */\n            this.statusText = '';\n    \n            // 存储文件状态，防止通过属性直接修改\n            statusMap[ this.id ] = WUFile.Status.INITED;\n    \n            this.source = source;\n            this.loaded = 0;\n    \n            this.on( 'error', function( msg ) {\n                this.setStatus( WUFile.Status.ERROR, msg );\n            });\n        }\n    \n        $.extend( WUFile.prototype, {\n    \n            /**\n             * 设置状态，状态变化时会触发`change`事件。\n             * @method setStatus\n             * @grammar setStatus( status[, statusText] );\n             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)\n             * @param {String} [statusText=''] 状态说明，常在error时使用，用http, abort,server等来标记是由于什么原因导致文件错误。\n             */\n            setStatus: function( status, text ) {\n    \n                var prevStatus = statusMap[ this.id ];\n    \n                typeof text !== 'undefined' && (this.statusText = text);\n    \n                if ( status !== prevStatus ) {\n                    statusMap[ this.id ] = status;\n                    /**\n                     * 文件状态变化\n                     * @event statuschange\n                     */\n                    this.trigger( 'statuschange', status, prevStatus );\n                }\n    \n            },\n    \n            /**\n             * 获取文件状态\n             * @return {File.Status}\n             * @example\n                     文件状态具体包括以下几种类型：\n                     {\n                         // 初始化\n                        INITED:     0,\n                        // 已入队列\n                        QUEUED:     1,\n                        // 正在上传\n                        PROGRESS:     2,\n                        // 上传出错\n                        ERROR:         3,\n                        // 上传成功\n                        COMPLETE:     4,\n                        // 上传取消\n                        CANCELLED:     5\n                    }\n             */\n            getStatus: function() {\n                return statusMap[ this.id ];\n            },\n    \n            /**\n             * 获取文件原始信息。\n             * @return {*}\n             */\n            getSource: function() {\n                return this.source;\n            },\n    \n            destory: function() {\n                delete statusMap[ this.id ];\n            }\n        });\n    \n        Mediator.installTo( WUFile.prototype );\n    \n        /**\n         * 文件状态值，具体包括以下几种类型：\n         * * `inited` 初始状态\n         * * `queued` 已经进入队列, 等待上传\n         * * `progress` 上传中\n         * * `complete` 上传完成。\n         * * `error` 上传出错，可重试\n         * * `interrupt` 上传中断，可续传。\n         * * `invalid` 文件不合格，不能重试上传。会自动从队列中移除。\n         * * `cancelled` 文件被移除。\n         * @property {Object} Status\n         * @namespace File\n         * @class File\n         * @static\n         */\n        WUFile.Status = {\n            INITED:     'inited',    // 初始状态\n            QUEUED:     'queued',    // 已经进入队列, 等待上传\n            PROGRESS:   'progress',    // 上传中\n            ERROR:      'error',    // 上传出错，可重试\n            COMPLETE:   'complete',    // 上传完成。\n            CANCELLED:  'cancelled',    // 上传取消。\n            INTERRUPT:  'interrupt',    // 上传中断，可续传。\n            INVALID:    'invalid'    // 文件不合格，不能重试上传。\n        };\n    \n        return WUFile;\n    });\n    \n    /**\n     * @fileOverview 文件队列\n     */\n    define('queue',[\n        'base',\n        'mediator',\n        'file'\n    ], function( Base, Mediator, WUFile ) {\n    \n        var $ = Base.$,\n            STATUS = WUFile.Status;\n    \n        /**\n         * 文件队列, 用来存储各个状态中的文件。\n         * @class Queue\n         * @extends Mediator\n         */\n        function Queue() {\n    \n            /**\n             * 统计文件数。\n             * * `numOfQueue` 队列中的文件数。\n             * * `numOfSuccess` 上传成功的文件数\n             * * `numOfCancel` 被移除的文件数\n             * * `numOfProgress` 正在上传中的文件数\n             * * `numOfUploadFailed` 上传错误的文件数。\n             * * `numOfInvalid` 无效的文件数。\n             * @property {Object} stats\n             */\n            this.stats = {\n                numOfQueue: 0,\n                numOfSuccess: 0,\n                numOfCancel: 0,\n                numOfProgress: 0,\n                numOfUploadFailed: 0,\n                numOfInvalid: 0\n            };\n    \n            // 上传队列，仅包括等待上传的文件\n            this._queue = [];\n    \n            // 存储所有文件\n            this._map = {};\n        }\n    \n        $.extend( Queue.prototype, {\n    \n            /**\n             * 将新文件加入对队列尾部\n             *\n             * @method append\n             * @param  {File} file   文件对象\n             */\n            append: function( file ) {\n                this._queue.push( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 将新文件加入对队列头部\n             *\n             * @method prepend\n             * @param  {File} file   文件对象\n             */\n            prepend: function( file ) {\n                this._queue.unshift( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 获取文件对象\n             *\n             * @method getFile\n             * @param  {String} fileId   文件ID\n             * @return {File}\n             */\n            getFile: function( fileId ) {\n                if ( typeof fileId !== 'string' ) {\n                    return fileId;\n                }\n                return this._map[ fileId ];\n            },\n    \n            /**\n             * 从队列中取出一个指定状态的文件。\n             * @grammar fetch( status ) => File\n             * @method fetch\n             * @param {String} status [文件状态值](#WebUploader:File:File.Status)\n             * @return {File} [File](#WebUploader:File)\n             */\n            fetch: function( status ) {\n                var len = this._queue.length,\n                    i, file;\n    \n                status = status || STATUS.QUEUED;\n    \n                for ( i = 0; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( status === file.getStatus() ) {\n                        return file;\n                    }\n                }\n    \n                return null;\n            },\n    \n            /**\n             * 对队列进行排序，能够控制文件上传顺序。\n             * @grammar sort( fn ) => undefined\n             * @method sort\n             * @param {Function} fn 排序方法\n             */\n            sort: function( fn ) {\n                if ( typeof fn === 'function' ) {\n                    this._queue.sort( fn );\n                }\n            },\n    \n            /**\n             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。\n             * @grammar getFiles( [status1[, status2 ...]] ) => Array\n             * @method getFiles\n             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)\n             */\n            getFiles: function() {\n                var sts = [].slice.call( arguments, 0 ),\n                    ret = [],\n                    i = 0,\n                    len = this._queue.length,\n                    file;\n    \n                for ( ; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {\n                        continue;\n                    }\n    \n                    ret.push( file );\n                }\n    \n                return ret;\n            },\n    \n            _fileAdded: function( file ) {\n                var me = this,\n                    existing = this._map[ file.id ];\n    \n                if ( !existing ) {\n                    this._map[ file.id ] = file;\n    \n                    file.on( 'statuschange', function( cur, pre ) {\n                        me._onFileStatusChange( cur, pre );\n                    });\n                }\n    \n                file.setStatus( STATUS.QUEUED );\n            },\n    \n            _onFileStatusChange: function( curStatus, preStatus ) {\n                var stats = this.stats;\n    \n                switch ( preStatus ) {\n                    case STATUS.PROGRESS:\n                        stats.numOfProgress--;\n                        break;\n    \n                    case STATUS.QUEUED:\n                        stats.numOfQueue --;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed--;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid--;\n                        break;\n                }\n    \n                switch ( curStatus ) {\n                    case STATUS.QUEUED:\n                        stats.numOfQueue++;\n                        break;\n    \n                    case STATUS.PROGRESS:\n                        stats.numOfProgress++;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed++;\n                        break;\n    \n                    case STATUS.COMPLETE:\n                        stats.numOfSuccess++;\n                        break;\n    \n                    case STATUS.CANCELLED:\n                        stats.numOfCancel++;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid++;\n                        break;\n                }\n            }\n    \n        });\n    \n        Mediator.installTo( Queue.prototype );\n    \n        return Queue;\n    });\n    /**\n     * @fileOverview 队列\n     */\n    define('widgets/queue',[\n        'base',\n        'uploader',\n        'queue',\n        'file',\n        'lib/file',\n        'runtime/client',\n        'widgets/widget'\n    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {\n    \n        var $ = Base.$,\n            rExt = /\\.\\w+$/,\n            Status = WUFile.Status;\n    \n        return Uploader.register({\n            'sort-files': 'sortFiles',\n            'add-file': 'addFiles',\n            'get-file': 'getFile',\n            'fetch-file': 'fetchFile',\n            'get-stats': 'getStats',\n            'get-files': 'getFiles',\n            'remove-file': 'removeFile',\n            'retry': 'retry',\n            'reset': 'reset',\n            'accept-file': 'acceptFile'\n        }, {\n    \n            init: function( opts ) {\n                var me = this,\n                    deferred, len, i, item, arr, accept, runtime;\n    \n                if ( $.isPlainObject( opts.accept ) ) {\n                    opts.accept = [ opts.accept ];\n                }\n    \n                // accept中的中生成匹配正则。\n                if ( opts.accept ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        item = opts.accept[ i ].extensions;\n                        item && arr.push( item );\n                    }\n    \n                    if ( arr.length ) {\n                        accept = '\\\\.' + arr.join(',')\n                                .replace( /,/g, '$|\\\\.' )\n                                .replace( /\\*/g, '.*' ) + '$';\n                    }\n    \n                    me.accept = new RegExp( accept, 'i' );\n                }\n    \n                me.queue = new Queue();\n                me.stats = me.queue.stats;\n    \n                // 如果当前不是html5运行时，那就算了。\n                // 不执行后续操作\n                if ( this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                // 创建一个 html5 运行时的 placeholder\n                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。\n                deferred = Base.Deferred();\n                runtime = new RuntimeClient('Placeholder');\n                runtime.connectRuntime({\n                    runtimeOrder: 'html5'\n                }, function() {\n                    me._ruid = runtime.getRuid();\n                    deferred.resolve();\n                });\n                return deferred.promise();\n            },\n    \n    \n            // 为了支持外部直接添加一个原生File对象。\n            _wrapFile: function( file ) {\n                if ( !(file instanceof WUFile) ) {\n    \n                    if ( !(file instanceof File) ) {\n                        if ( !this._ruid ) {\n                            throw new Error('Can\\'t add external files.');\n                        }\n                        file = new File( this._ruid, file );\n                    }\n    \n                    file = new WUFile( file );\n                }\n    \n                return file;\n            },\n    \n            // 判断文件是否可以被加入队列\n            acceptFile: function( file ) {\n                var invalid = !file || file.size < 6 || this.accept &&\n    \n                        // 如果名字中有后缀，才做后缀白名单处理。\n                        rExt.exec( file.name ) && !this.accept.test( file.name );\n    \n                return !invalid;\n            },\n    \n    \n            /**\n             * @event beforeFileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列之前触发，此事件的handler返回值为`false`，则此文件不会被添加进入队列。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event fileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列以后触发。\n             * @for  Uploader\n             */\n    \n            _addFile: function( file ) {\n                var me = this;\n    \n                file = me._wrapFile( file );\n    \n                // 不过类型判断允许不允许，先派送 `beforeFileQueued`\n                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {\n                    return;\n                }\n    \n                // 类型不匹配，则派送错误事件，并返回。\n                if ( !me.acceptFile( file ) ) {\n                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );\n                    return;\n                }\n    \n                me.queue.append( file );\n                me.owner.trigger( 'fileQueued', file );\n                return file;\n            },\n    \n            getFile: function( fileId ) {\n                return this.queue.getFile( fileId );\n            },\n    \n            /**\n             * @event filesQueued\n             * @param {File} files 数组，内容为原始File(lib/File）对象。\n             * @description 当一批文件添加进队列以后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method addFiles\n             * @grammar addFiles( file ) => undefined\n             * @grammar addFiles( [file1, file2 ...] ) => undefined\n             * @param {Array of File or File} [files] Files 对象 数组\n             * @description 添加文件到队列\n             * @for  Uploader\n             */\n            addFiles: function( files ) {\n                var me = this;\n    \n                if ( !files.length ) {\n                    files = [ files ];\n                }\n    \n                files = $.map( files, function( file ) {\n                    return me._addFile( file );\n                });\n    \n                me.owner.trigger( 'filesQueued', files );\n    \n                if ( me.options.auto ) {\n                    me.request('start-upload');\n                }\n            },\n    \n            getStats: function() {\n                return this.stats;\n            },\n    \n            /**\n             * @event fileDequeued\n             * @param {File} file File对象\n             * @description 当文件被移除队列后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method removeFile\n             * @grammar removeFile( file ) => undefined\n             * @grammar removeFile( id ) => undefined\n             * @param {File|id} file File对象或这File对象的id\n             * @description 移除某一文件。\n             * @for  Uploader\n             * @example\n             *\n             * $li.on('click', '.remove-this', function() {\n             *     uploader.removeFile( file );\n             * })\n             */\n            removeFile: function( file ) {\n                var me = this;\n    \n                file = file.id ? file : me.queue.getFile( file );\n    \n                file.setStatus( Status.CANCELLED );\n                me.owner.trigger( 'fileDequeued', file );\n            },\n    \n            /**\n             * @method getFiles\n             * @grammar getFiles() => Array\n             * @grammar getFiles( status1, status2, status... ) => Array\n             * @description 返回指定状态的文件集合，不传参数将返回所有状态的文件。\n             * @for  Uploader\n             * @example\n             * console.log( uploader.getFiles() );    // => all files\n             * console.log( uploader.getFiles('error') )    // => all error files.\n             */\n            getFiles: function() {\n                return this.queue.getFiles.apply( this.queue, arguments );\n            },\n    \n            fetchFile: function() {\n                return this.queue.fetch.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method retry\n             * @grammar retry() => undefined\n             * @grammar retry( file ) => undefined\n             * @description 重试上传，重试指定文件，或者从出错的文件开始重新上传。\n             * @for  Uploader\n             * @example\n             * function retry() {\n             *     uploader.retry();\n             * }\n             */\n            retry: function( file, noForceStart ) {\n                var me = this,\n                    files, i, len;\n    \n                if ( file ) {\n                    file = file.id ? file : me.queue.getFile( file );\n                    file.setStatus( Status.QUEUED );\n                    noForceStart || me.request('start-upload');\n                    return;\n                }\n    \n                files = me.queue.getFiles( Status.ERROR );\n                i = 0;\n                len = files.length;\n    \n                for ( ; i < len; i++ ) {\n                    file = files[ i ];\n                    file.setStatus( Status.QUEUED );\n                }\n    \n                me.request('start-upload');\n            },\n    \n            /**\n             * @method sort\n             * @grammar sort( fn ) => undefined\n             * @description 排序队列中的文件，在上传之前调整可以控制上传顺序。\n             * @for  Uploader\n             */\n            sortFiles: function() {\n                return this.queue.sort.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method reset\n             * @grammar reset() => undefined\n             * @description 重置uploader。目前只重置了队列。\n             * @for  Uploader\n             * @example\n             * uploader.reset();\n             */\n            reset: function() {\n                this.queue = new Queue();\n                this.stats = this.queue.stats;\n            }\n        });\n    \n    });\n    /**\n     * @fileOverview 添加获取Runtime相关信息的方法。\n     */\n    define('widgets/runtime',[\n        'uploader',\n        'runtime/runtime',\n        'widgets/widget'\n    ], function( Uploader, Runtime ) {\n    \n        Uploader.support = function() {\n            return Runtime.hasRuntime.apply( Runtime, arguments );\n        };\n    \n        return Uploader.register({\n            'predict-runtime-type': 'predictRuntmeType'\n        }, {\n    \n            init: function() {\n                if ( !this.predictRuntmeType() ) {\n                    throw Error('Runtime Error');\n                }\n            },\n    \n            /**\n             * 预测Uploader将采用哪个`Runtime`\n             * @grammar predictRuntmeType() => String\n             * @method predictRuntmeType\n             * @for  Uploader\n             */\n            predictRuntmeType: function() {\n                var orders = this.options.runtimeOrder || Runtime.orders,\n                    type = this.type,\n                    i, len;\n    \n                if ( !type ) {\n                    orders = orders.split( /\\s*,\\s*/g );\n    \n                    for ( i = 0, len = orders.length; i < len; i++ ) {\n                        if ( Runtime.hasRuntime( orders[ i ] ) ) {\n                            this.type = type = orders[ i ];\n                            break;\n                        }\n                    }\n                }\n    \n                return type;\n            }\n        });\n    });\n    /**\n     * @fileOverview Transport\n     */\n    define('lib/transport',[\n        'base',\n        'runtime/client',\n        'mediator'\n    ], function( Base, RuntimeClient, Mediator ) {\n    \n        var $ = Base.$;\n    \n        function Transport( opts ) {\n            var me = this;\n    \n            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );\n            RuntimeClient.call( this, 'Transport' );\n    \n            this._blob = null;\n            this._formData = opts.formData || {};\n            this._headers = opts.headers || {};\n    \n            this.on( 'progress', this._timeout );\n            this.on( 'load error', function() {\n                me.trigger( 'progress', 1 );\n                clearTimeout( me._timer );\n            });\n        }\n    \n        Transport.options = {\n            server: '',\n            method: 'POST',\n    \n            // 跨域时，是否允许携带cookie, 只有html5 runtime才有效\n            withCredentials: false,\n            fileVal: 'file',\n            timeout: 2 * 60 * 1000,    // 2分钟\n            formData: {},\n            headers: {},\n            sendAsBinary: false\n        };\n    \n        $.extend( Transport.prototype, {\n    \n            // 添加Blob, 只能添加一次，最后一次有效。\n            appendBlob: function( key, blob, filename ) {\n                var me = this,\n                    opts = me.options;\n    \n                if ( me.getRuid() ) {\n                    me.disconnectRuntime();\n                }\n    \n                // 连接到blob归属的同一个runtime.\n                me.connectRuntime( blob.ruid, function() {\n                    me.exec('init');\n                });\n    \n                me._blob = blob;\n                opts.fileVal = key || opts.fileVal;\n                opts.filename = filename || opts.filename;\n            },\n    \n            // 添加其他字段\n            append: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._formData, key );\n                } else {\n                    this._formData[ key ] = value;\n                }\n            },\n    \n            setRequestHeader: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._headers, key );\n                } else {\n                    this._headers[ key ] = value;\n                }\n            },\n    \n            send: function( method ) {\n                this.exec( 'send', method );\n                this._timeout();\n            },\n    \n            abort: function() {\n                clearTimeout( this._timer );\n                return this.exec('abort');\n            },\n    \n            destroy: function() {\n                this.trigger('destroy');\n                this.off();\n                this.exec('destroy');\n                this.disconnectRuntime();\n            },\n    \n            getResponse: function() {\n                return this.exec('getResponse');\n            },\n    \n            getResponseAsJson: function() {\n                return this.exec('getResponseAsJson');\n            },\n    \n            getStatus: function() {\n                return this.exec('getStatus');\n            },\n    \n            _timeout: function() {\n                var me = this,\n                    duration = me.options.timeout;\n    \n                if ( !duration ) {\n                    return;\n                }\n    \n                clearTimeout( me._timer );\n                me._timer = setTimeout(function() {\n                    me.abort();\n                    me.trigger( 'error', 'timeout' );\n                }, duration );\n            }\n    \n        });\n    \n        // 让Transport具备事件功能。\n        Mediator.installTo( Transport.prototype );\n    \n        return Transport;\n    });\n    /**\n     * @fileOverview 负责文件上传相关。\n     */\n    define('widgets/upload',[\n        'base',\n        'uploader',\n        'file',\n        'lib/transport',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile, Transport ) {\n    \n        var $ = Base.$,\n            isPromise = Base.isPromise,\n            Status = WUFile.Status;\n    \n        // 添加默认配置项\n        $.extend( Uploader.options, {\n    \n    \n            /**\n             * @property {Boolean} [prepareNextFile=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否允许在文件传输时提前把下一个文件准备好。\n             * 对于一个文件的准备工作比较耗时，比如图片压缩，md5序列化。\n             * 如果能提前在当前文件传输期处理，可以节省总体耗时。\n             */\n            prepareNextFile: false,\n    \n            /**\n             * @property {Boolean} [chunked=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否要分片处理大文件上传。\n             */\n            chunked: false,\n    \n            /**\n             * @property {Boolean} [chunkSize=5242880]\n             * @namespace options\n             * @for Uploader\n             * @description 如果要分片，分多大一片？ 默认大小为5M.\n             */\n            chunkSize: 5 * 1024 * 1024,\n    \n            /**\n             * @property {Boolean} [chunkRetry=2]\n             * @namespace options\n             * @for Uploader\n             * @description 如果某个分片由于网络问题出错，允许自动重传多少次？\n             */\n            chunkRetry: 2,\n    \n            /**\n             * @property {Boolean} [threads=3]\n             * @namespace options\n             * @for Uploader\n             * @description 上传并发数。允许同时最大上传进程数。\n             */\n            threads: 3,\n    \n    \n            /**\n             * @property {Object} [formData]\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传请求的参数表，每次发送都会发送此对象中的参数。\n             */\n            formData: null\n    \n            /**\n             * @property {Object} [fileVal='file']\n             * @namespace options\n             * @for Uploader\n             * @description 设置文件上传域的name。\n             */\n    \n            /**\n             * @property {Object} [method='POST']\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传方式，`POST`或者`GET`。\n             */\n    \n            /**\n             * @property {Object} [sendAsBinary=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否已二进制的流的方式发送文件，这样整个上传内容`php://input`都为文件内容，\n             * 其他参数在$_GET数组中。\n             */\n        });\n    \n        // 负责将文件切片。\n        function CuteFile( file, chunkSize ) {\n            var pending = [],\n                blob = file.source,\n                total = blob.size,\n                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,\n                start = 0,\n                index = 0,\n                len;\n    \n            while ( index < chunks ) {\n                len = Math.min( chunkSize, total - start );\n    \n                pending.push({\n                    file: file,\n                    start: start,\n                    end: chunkSize ? (start + len) : total,\n                    total: total,\n                    chunks: chunks,\n                    chunk: index++\n                });\n                start += len;\n            }\n    \n            file.blocks = pending.concat();\n            file.remaning = pending.length;\n    \n            return {\n                file: file,\n    \n                has: function() {\n                    return !!pending.length;\n                },\n    \n                fetch: function() {\n                    return pending.shift();\n                }\n            };\n        }\n    \n        Uploader.register({\n            'start-upload': 'start',\n            'stop-upload': 'stop',\n            'skip-file': 'skipFile',\n            'is-in-progress': 'isInProgress'\n        }, {\n    \n            init: function() {\n                var owner = this.owner;\n    \n                this.runing = false;\n    \n                // 记录当前正在传的数据，跟threads相关\n                this.pool = [];\n    \n                // 缓存即将上传的文件。\n                this.pending = [];\n    \n                // 跟踪还有多少分片没有完成上传。\n                this.remaning = 0;\n                this.__tick = Base.bindFn( this._tick, this );\n    \n                owner.on( 'uploadComplete', function( file ) {\n                    // 把其他块取消了。\n                    file.blocks && $.each( file.blocks, function( _, v ) {\n                        v.transport && (v.transport.abort(), v.transport.destroy());\n                        delete v.transport;\n                    });\n    \n                    delete file.blocks;\n                    delete file.remaning;\n                });\n            },\n    \n            /**\n             * @event startUpload\n             * @description 当开始上传流程时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 开始上传。此方法可以从初始状态调用开始上传流程，也可以从暂停状态调用，继续上传流程。\n             * @grammar upload() => undefined\n             * @method upload\n             * @for  Uploader\n             */\n            start: function() {\n                var me = this;\n    \n                // 移出invalid的文件\n                $.each( me.request( 'get-files', Status.INVALID ), function() {\n                    me.request( 'remove-file', this );\n                });\n    \n                if ( me.runing ) {\n                    return;\n                }\n    \n                me.runing = true;\n    \n                // 如果有暂停的，则续传\n                $.each( me.pool, function( _, v ) {\n                    var file = v.file;\n    \n                    if ( file.getStatus() === Status.INTERRUPT ) {\n                        file.setStatus( Status.PROGRESS );\n                        me._trigged = false;\n                        v.transport && v.transport.send();\n                    }\n                });\n    \n                me._trigged = false;\n                me.owner.trigger('startUpload');\n                Base.nextTick( me.__tick );\n            },\n    \n            /**\n             * @event stopUpload\n             * @description 当开始上传流程暂停时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。\n             * @grammar stop() => undefined\n             * @grammar stop( true ) => undefined\n             * @method stop\n             * @for  Uploader\n             */\n            stop: function( interrupt ) {\n                var me = this;\n    \n                if ( me.runing === false ) {\n                    return;\n                }\n    \n                me.runing = false;\n    \n                interrupt && $.each( me.pool, function( _, v ) {\n                    v.transport && v.transport.abort();\n                    v.file.setStatus( Status.INTERRUPT );\n                });\n    \n                me.owner.trigger('stopUpload');\n            },\n    \n            /**\n             * 判断`Uplaode`r是否正在上传中。\n             * @grammar isInProgress() => Boolean\n             * @method isInProgress\n             * @for  Uploader\n             */\n            isInProgress: function() {\n                return !!this.runing;\n            },\n    \n            getStats: function() {\n                return this.request('get-stats');\n            },\n    \n            /**\n             * 掉过一个文件上传，直接标记指定文件为已上传状态。\n             * @grammar skipFile( file ) => undefined\n             * @method skipFile\n             * @for  Uploader\n             */\n            skipFile: function( file, status ) {\n                file = this.request( 'get-file', file );\n    \n                file.setStatus( status || Status.COMPLETE );\n                file.skipped = true;\n    \n                // 如果正在上传。\n                file.blocks && $.each( file.blocks, function( _, v ) {\n                    var _tr = v.transport;\n    \n                    if ( _tr ) {\n                        _tr.abort();\n                        _tr.destroy();\n                        delete v.transport;\n                    }\n                });\n    \n                this.owner.trigger( 'uploadSkip', file );\n            },\n    \n            /**\n             * @event uploadFinished\n             * @description 当所有文件上传结束时触发。\n             * @for  Uploader\n             */\n            _tick: function() {\n                var me = this,\n                    opts = me.options,\n                    fn, val;\n    \n                // 上一个promise还没有结束，则等待完成后再执行。\n                if ( me._promise ) {\n                    return me._promise.always( me.__tick );\n                }\n    \n                // 还有位置，且还有文件要处理的话。\n                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {\n                    me._trigged = false;\n    \n                    fn = function( val ) {\n                        me._promise = null;\n    \n                        // 有可能是reject过来的，所以要检测val的类型。\n                        val && val.file && me._startSend( val );\n                        Base.nextTick( me.__tick );\n                    };\n    \n                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );\n    \n                // 没有要上传的了，且没有正在传输的了。\n                } else if ( !me.remaning && !me.getStats().numOfQueue ) {\n                    me.runing = false;\n    \n                    me._trigged || Base.nextTick(function() {\n                        me.owner.trigger('uploadFinished');\n                    });\n                    me._trigged = true;\n                }\n            },\n    \n            _nextBlock: function() {\n                var me = this,\n                    act = me._act,\n                    opts = me.options,\n                    next, done;\n    \n                // 如果当前文件还有没有需要传输的，则直接返回剩下的。\n                if ( act && act.has() &&\n                        act.file.getStatus() === Status.PROGRESS ) {\n    \n                    // 是否提前准备下一个文件\n                    if ( opts.prepareNextFile && !me.pending.length ) {\n                        me._prepareNextFile();\n                    }\n    \n                    return act.fetch();\n    \n                // 否则，如果正在运行，则准备下一个文件，并等待完成后返回下个分片。\n                } else if ( me.runing ) {\n    \n                    // 如果缓存中有，则直接在缓存中取，没有则去queue中取。\n                    if ( !me.pending.length && me.getStats().numOfQueue ) {\n                        me._prepareNextFile();\n                    }\n    \n                    next = me.pending.shift();\n                    done = function( file ) {\n                        if ( !file ) {\n                            return null;\n                        }\n    \n                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );\n                        me._act = act;\n                        return act.fetch();\n                    };\n    \n                    // 文件可能还在prepare中，也有可能已经完全准备好了。\n                    return isPromise( next ) ?\n                            next[ next.pipe ? 'pipe' : 'then']( done ) :\n                            done( next );\n                }\n            },\n    \n    \n            /**\n             * @event uploadStart\n             * @param {File} file File对象\n             * @description 某个文件开始上传前触发，一个文件只会触发一次。\n             * @for  Uploader\n             */\n            _prepareNextFile: function() {\n                var me = this,\n                    file = me.request('fetch-file'),\n                    pending = me.pending,\n                    promise;\n    \n                if ( file ) {\n                    promise = me.request( 'before-send-file', file, function() {\n    \n                        // 有可能文件被skip掉了。文件被skip掉后，状态坑定不是Queued.\n                        if ( file.getStatus() === Status.QUEUED ) {\n                            me.owner.trigger( 'uploadStart', file );\n                            file.setStatus( Status.PROGRESS );\n                            return file;\n                        }\n    \n                        return me._finishFile( file );\n                    });\n    \n                    // 如果还在pending中，则替换成文件本身。\n                    promise.done(function() {\n                        var idx = $.inArray( promise, pending );\n    \n                        ~idx && pending.splice( idx, 1, file );\n                    });\n    \n                    // befeore-send-file的钩子就有错误发生。\n                    promise.fail(function( reason ) {\n                        file.setStatus( Status.ERROR, reason );\n                        me.owner.trigger( 'uploadError', file, reason );\n                        me.owner.trigger( 'uploadComplete', file );\n                    });\n    \n                    pending.push( promise );\n                }\n            },\n    \n            // 让出位置了，可以让其他分片开始上传\n            _popBlock: function( block ) {\n                var idx = $.inArray( block, this.pool );\n    \n                this.pool.splice( idx, 1 );\n                block.file.remaning--;\n                this.remaning--;\n            },\n    \n            // 开始上传，可以被掉过。如果promise被reject了，则表示跳过此分片。\n            _startSend: function( block ) {\n                var me = this,\n                    file = block.file,\n                    promise;\n    \n                me.pool.push( block );\n                me.remaning++;\n    \n                // 如果没有分片，则直接使用原始的。\n                // 不会丢失content-type信息。\n                block.blob = block.chunks === 1 ? file.source :\n                        file.source.slice( block.start, block.end );\n    \n                // hook, 每个分片发送之前可能要做些异步的事情。\n                promise = me.request( 'before-send', block, function() {\n    \n                    // 有可能文件已经上传出错了，所以不需要再传输了。\n                    if ( file.getStatus() === Status.PROGRESS ) {\n                        me._doSend( block );\n                    } else {\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n    \n                // 如果为fail了，则跳过此分片。\n                promise.fail(function() {\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file ).always(function() {\n                            block.percentage = 1;\n                            me._popBlock( block );\n                            me.owner.trigger( 'uploadComplete', file );\n                            Base.nextTick( me.__tick );\n                        });\n                    } else {\n                        block.percentage = 1;\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n            },\n    \n    \n            /**\n             * @event uploadBeforeSend\n             * @param {Object} object\n             * @param {Object} data 默认的上传参数，可以扩展此对象来控制上传参数。\n             * @description 当某个文件的分块在发送前触发，主要用来询问是否要添加附带参数，大文件在开起分片上传的前提下此事件可能会触发多次。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadAccept\n             * @param {Object} object\n             * @param {Object} ret 服务端的返回数据，json格式，如果服务端不是json格式，从ret._raw中取数据，自行解析。\n             * @description 当某个文件上传到服务端响应后，会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadProgress\n             * @param {File} file File对象\n             * @param {Number} percentage 上传进度\n             * @description 上传过程中触发，携带上传进度。\n             * @for  Uploader\n             */\n    \n    \n            /**\n             * @event uploadError\n             * @param {File} file File对象\n             * @param {String} reason 出错的code\n             * @description 当文件上传出错时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadSuccess\n             * @param {File} file File对象\n             * @param {Object} response 服务端返回的数据\n             * @description 当文件上传成功时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadComplete\n             * @param {File} [file] File对象\n             * @description 不管成功或者失败，文件上传完成时触发。\n             * @for  Uploader\n             */\n    \n            // 做上传操作。\n            _doSend: function( block ) {\n                var me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    file = block.file,\n                    tr = new Transport( opts ),\n                    data = $.extend({}, opts.formData ),\n                    headers = $.extend({}, opts.headers ),\n                    requestAccept, ret;\n    \n                block.transport = tr;\n    \n                tr.on( 'destroy', function() {\n                    delete block.transport;\n                    me._popBlock( block );\n                    Base.nextTick( me.__tick );\n                });\n    \n                // 广播上传进度。以文件为单位。\n                tr.on( 'progress', function( percentage ) {\n                    var totalPercent = 0,\n                        uploaded = 0;\n    \n                    // 可能没有abort掉，progress还是执行进来了。\n                    // if ( !file.blocks ) {\n                    //     return;\n                    // }\n    \n                    totalPercent = block.percentage = percentage;\n    \n                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。\n                        $.each( file.blocks, function( _, v ) {\n                            uploaded += (v.percentage || 0) * (v.end - v.start);\n                        });\n    \n                        totalPercent = uploaded / file.size;\n                    }\n    \n                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );\n                });\n    \n                // 用来询问，是否返回的结果是有错误的。\n                requestAccept = function( reject ) {\n                    var fn;\n    \n                    ret = tr.getResponseAsJson() || {};\n                    ret._raw = tr.getResponse();\n                    fn = function( value ) {\n                        reject = value;\n                    };\n    \n                    // 服务端响应了，不代表成功了，询问是否响应正确。\n                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {\n                        reject = reject || 'server';\n                    }\n    \n                    return reject;\n                };\n    \n                // 尝试重试，然后广播文件上传出错。\n                tr.on( 'error', function( type, flag ) {\n                    block.retried = block.retried || 0;\n    \n                    // 自动重试\n                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&\n                            block.retried < opts.chunkRetry ) {\n    \n                        block.retried++;\n                        tr.send();\n    \n                    } else {\n    \n                        // http status 500 ~ 600\n                        if ( !flag && type === 'server' ) {\n                            type = requestAccept( type );\n                        }\n    \n                        file.setStatus( Status.ERROR, type );\n                        owner.trigger( 'uploadError', file, type );\n                        owner.trigger( 'uploadComplete', file );\n                    }\n                });\n    \n                // 上传成功\n                tr.on( 'load', function() {\n                    var reason;\n    \n                    // 如果非预期，转向上传出错。\n                    if ( (reason = requestAccept()) ) {\n                        tr.trigger( 'error', reason, true );\n                        return;\n                    }\n    \n                    // 全部上传完成。\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file, ret );\n                    } else {\n                        tr.destroy();\n                    }\n                });\n    \n                // 配置默认的上传字段。\n                data = $.extend( data, {\n                    id: file.id,\n                    name: file.name,\n                    type: file.type,\n                    lastModifiedDate: file.lastModifiedDate,\n                    size: file.size\n                });\n    \n                block.chunks > 1 && $.extend( data, {\n                    chunks: block.chunks,\n                    chunk: block.chunk\n                });\n    \n                // 在发送之间可以添加字段什么的。。。\n                // 如果默认的字段不够使用，可以通过监听此事件来扩展\n                owner.trigger( 'uploadBeforeSend', block, data, headers );\n    \n                // 开始发送。\n                tr.appendBlob( opts.fileVal, block.blob, file.name );\n                tr.append( data );\n                tr.setRequestHeader( headers );\n                tr.send();\n            },\n    \n            // 完成上传。\n            _finishFile: function( file, ret, hds ) {\n                var owner = this.owner;\n    \n                return owner\n                        .request( 'after-send-file', arguments, function() {\n                            file.setStatus( Status.COMPLETE );\n                            owner.trigger( 'uploadSuccess', file, ret, hds );\n                        })\n                        .fail(function( reason ) {\n    \n                            // 如果外部已经标记为invalid什么的，不再改状态。\n                            if ( file.getStatus() === Status.PROGRESS ) {\n                                file.setStatus( Status.ERROR, reason );\n                            }\n    \n                            owner.trigger( 'uploadError', file, reason );\n                        })\n                        .always(function() {\n                            owner.trigger( 'uploadComplete', file );\n                        });\n            }\n    \n        });\n    });\n    /**\n     * @fileOverview 各种验证，包括文件总大小是否超出、单文件是否超出和文件是否重复。\n     */\n    \n    define('widgets/validator',[\n        'base',\n        'uploader',\n        'file',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile ) {\n    \n        var $ = Base.$,\n            validators = {},\n            api;\n    \n        /**\n         * @event error\n         * @param {String} type 错误类型。\n         * @description 当validate不通过时，会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误，目前有以下错误会在特定的情况下派送错来。\n         *\n         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。\n         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。\n         * @for  Uploader\n         */\n    \n        // 暴露给外面的api\n        api = {\n    \n            // 添加验证器\n            addValidator: function( type, cb ) {\n                validators[ type ] = cb;\n            },\n    \n            // 移除验证器\n            removeValidator: function( type ) {\n                delete validators[ type ];\n            }\n        };\n    \n        // 在Uploader初始化的时候启动Validators的初始化\n        Uploader.register({\n            init: function() {\n                var me = this;\n                $.each( validators, function() {\n                    this.call( me.owner );\n                });\n            }\n        });\n    \n        /**\n         * @property {int} [fileNumLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证文件总数量, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileNumLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                count = 0,\n                max = opts.fileNumLimit >> 0,\n                flag = true;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n    \n                if ( count >= max && flag ) {\n                    flag = false;\n                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );\n                    setTimeout(function() {\n                        flag = true;\n                    }, 1 );\n                }\n    \n                return count >= max ? false : true;\n            });\n    \n            uploader.on( 'fileQueued', function() {\n                count++;\n            });\n    \n            uploader.on( 'fileDequeued', function() {\n                count--;\n            });\n    \n            uploader.on( 'uploadFinished', function() {\n                count = 0;\n            });\n        });\n    \n    \n        /**\n         * @property {int} [fileSizeLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileSizeLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                count = 0,\n                max = opts.fileSizeLimit >> 0,\n                flag = true;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n                var invalid = count + file.size > max;\n    \n                if ( invalid && flag ) {\n                    flag = false;\n                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );\n                    setTimeout(function() {\n                        flag = true;\n                    }, 1 );\n                }\n    \n                return invalid ? false : true;\n            });\n    \n            uploader.on( 'fileQueued', function( file ) {\n                count += file.size;\n            });\n    \n            uploader.on( 'fileDequeued', function( file ) {\n                count -= file.size;\n            });\n    \n            uploader.on( 'uploadFinished', function() {\n                count = 0;\n            });\n        });\n    \n        /**\n         * @property {int} [fileSingleSizeLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileSingleSizeLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                max = opts.fileSingleSizeLimit;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n    \n                if ( file.size > max ) {\n                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );\n                    this.trigger( 'error', 'F_EXCEED_SIZE', file );\n                    return false;\n                }\n    \n            });\n    \n        });\n    \n        /**\n         * @property {int} [duplicate=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 去重， 根据文件名字、文件大小和最后修改时间来生成hash Key.\n         */\n        api.addValidator( 'duplicate', function() {\n            var uploader = this,\n                opts = uploader.options,\n                mapping = {};\n    \n            if ( opts.duplicate ) {\n                return;\n            }\n    \n            function hashString( str ) {\n                var hash = 0,\n                    i = 0,\n                    len = str.length,\n                    _char;\n    \n                for ( ; i < len; i++ ) {\n                    _char = str.charCodeAt( i );\n                    hash = _char + (hash << 6) + (hash << 16) - hash;\n                }\n    \n                return hash;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n                var hash = file.__hash || (file.__hash = hashString( file.name +\n                        file.size + file.lastModifiedDate ));\n    \n                // 已经重复了\n                if ( mapping[ hash ] ) {\n                    this.trigger( 'error', 'F_DUPLICATE', file );\n                    return false;\n                }\n            });\n    \n            uploader.on( 'fileQueued', function( file ) {\n                var hash = file.__hash;\n    \n                hash && (mapping[ hash ] = true);\n            });\n    \n            uploader.on( 'fileDequeued', function( file ) {\n                var hash = file.__hash;\n    \n                hash && (delete mapping[ hash ]);\n            });\n        });\n    \n        return api;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/compbase',[],function() {\n    \n        function CompBase( owner, runtime ) {\n    \n            this.owner = owner;\n            this.options = owner.options;\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.getRuid = function() {\n                return runtime.uid;\n            };\n    \n            this.trigger = function() {\n                return owner.trigger.apply( owner, arguments );\n            };\n        }\n    \n        return CompBase;\n    });\n    /**\n     * @fileOverview Html5Runtime\n     */\n    define('runtime/html5/runtime',[\n        'base',\n        'runtime/runtime',\n        'runtime/compbase'\n    ], function( Base, Runtime, CompBase ) {\n    \n        var type = 'html5',\n            components = {};\n    \n        function Html5Runtime() {\n            var pool = {},\n                me = this,\n                destory = this.destory;\n    \n            Runtime.apply( me, arguments );\n            me.type = type;\n    \n    \n            // 这个方法的调用者，实际上是RuntimeClient\n            me.exec = function( comp, fn/*, args...*/) {\n                var client = this,\n                    uid = client.uid,\n                    args = Base.slice( arguments, 2 ),\n                    instance;\n    \n                if ( components[ comp ] ) {\n                    instance = pool[ uid ] = pool[ uid ] ||\n                            new components[ comp ]( client, me );\n    \n                    if ( instance[ fn ] ) {\n                        return instance[ fn ].apply( instance, args );\n                    }\n                }\n            };\n    \n            me.destory = function() {\n                // @todo 删除池子中的所有实例\n                return destory && destory.apply( this, arguments );\n            };\n        }\n    \n        Base.inherits( Runtime, {\n            constructor: Html5Runtime,\n    \n            // 不需要连接其他程序，直接执行callback\n            init: function() {\n                var me = this;\n                setTimeout(function() {\n                    me.trigger('ready');\n                }, 1 );\n            }\n    \n        });\n    \n        // 注册Components\n        Html5Runtime.register = function( name, component ) {\n            var klass = components[ name ] = Base.inherits( CompBase, component );\n            return klass;\n        };\n    \n        // 注册html5运行时。\n        // 只有在支持的前提下注册。\n        if ( window.Blob && window.FileReader && window.DataView ) {\n            Runtime.addRuntime( type, Html5Runtime );\n        }\n    \n        return Html5Runtime;\n    });\n    /**\n     * @fileOverview Blob Html实现\n     */\n    define('runtime/html5/blob',[\n        'runtime/html5/runtime',\n        'lib/blob'\n    ], function( Html5Runtime, Blob ) {\n    \n        return Html5Runtime.register( 'Blob', {\n            slice: function( start, end ) {\n                var blob = this.owner.source,\n                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;\n    \n                blob = slice.call( blob, start, end );\n    \n                return new Blob( this.getRuid(), blob );\n            }\n        });\n    });\n    /**\n     * @fileOverview FilePaste\n     */\n    define('runtime/html5/dnd',[\n        'base',\n        'runtime/html5/runtime',\n        'lib/file'\n    ], function( Base, Html5Runtime, File ) {\n    \n        var $ = Base.$,\n            prefix = 'webuploader-dnd-';\n    \n        return Html5Runtime.register( 'DragAndDrop', {\n            init: function() {\n                var elem = this.elem = this.options.container;\n    \n                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );\n                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );\n                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );\n                this.dropHandler = Base.bindFn( this._dropHandler, this );\n                this.dndOver = false;\n    \n                elem.on( 'dragenter', this.dragEnterHandler );\n                elem.on( 'dragover', this.dragOverHandler );\n                elem.on( 'dragleave', this.dragLeaveHandler );\n                elem.on( 'drop', this.dropHandler );\n    \n                if ( this.options.disableGlobalDnd ) {\n                    $( document ).on( 'dragover', this.dragOverHandler );\n                    $( document ).on( 'drop', this.dropHandler );\n                }\n            },\n    \n            _dragEnterHandler: function( e ) {\n                var me = this,\n                    denied = me._denied || false,\n                    items;\n    \n                e = e.originalEvent || e;\n    \n                if ( !me.dndOver ) {\n                    me.dndOver = true;\n    \n                    // 注意只有 chrome 支持。\n                    items = e.dataTransfer.items;\n    \n                    if ( items && items.length ) {\n                        me._denied = denied = !me.trigger( 'accept', items );\n                    }\n    \n                    me.elem.addClass( prefix + 'over' );\n                    me.elem[ denied ? 'addClass' :\n                            'removeClass' ]( prefix + 'denied' );\n                }\n    \n    \n                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';\n    \n                return false;\n            },\n    \n            _dragOverHandler: function( e ) {\n                // 只处理框内的。\n                var parentElem = this.elem.parent().get( 0 );\n                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {\n                    return false;\n                }\n    \n                clearTimeout( this._leaveTimer );\n                this._dragEnterHandler.call( this, e );\n    \n                return false;\n            },\n    \n            _dragLeaveHandler: function() {\n                var me = this,\n                    handler;\n    \n                handler = function() {\n                    me.dndOver = false;\n                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );\n                };\n    \n                clearTimeout( me._leaveTimer );\n                me._leaveTimer = setTimeout( handler, 100 );\n                return false;\n            },\n    \n            _dropHandler: function( e ) {\n                var me = this,\n                    ruid = me.getRuid(),\n                    parentElem = me.elem.parent().get( 0 );\n    \n                // 只处理框内的。\n                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {\n                    return false;\n                }\n    \n                me._getTansferFiles( e, function( results ) {\n                    me.trigger( 'drop', $.map( results, function( file ) {\n                        return new File( ruid, file );\n                    }) );\n                });\n    \n                me.dndOver = false;\n                me.elem.removeClass( prefix + 'over' );\n                return false;\n            },\n    \n            // 如果传入 callback 则去查看文件夹，否则只管当前文件夹。\n            _getTansferFiles: function( e, callback ) {\n                var results  = [],\n                    promises = [],\n                    items, files, dataTransfer, file, item, i, len, canAccessFolder;\n    \n                e = e.originalEvent || e;\n    \n                dataTransfer = e.dataTransfer;\n                items = dataTransfer.items;\n                files = dataTransfer.files;\n    \n                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);\n    \n                for ( i = 0, len = files.length; i < len; i++ ) {\n                    file = files[ i ];\n                    item = items && items[ i ];\n    \n                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {\n    \n                        promises.push( this._traverseDirectoryTree(\n                                item.webkitGetAsEntry(), results ) );\n                    } else {\n                        results.push( file );\n                    }\n                }\n    \n                Base.when.apply( Base, promises ).done(function() {\n    \n                    if ( !results.length ) {\n                        return;\n                    }\n    \n                    callback( results );\n                });\n            },\n    \n            _traverseDirectoryTree: function( entry, results ) {\n                var deferred = Base.Deferred(),\n                    me = this;\n    \n                if ( entry.isFile ) {\n                    entry.file(function( file ) {\n                        results.push( file );\n                        deferred.resolve();\n                    });\n                } else if ( entry.isDirectory ) {\n                    entry.createReader().readEntries(function( entries ) {\n                        var len = entries.length,\n                            promises = [],\n                            arr = [],    // 为了保证顺序。\n                            i;\n    \n                        for ( i = 0; i < len; i++ ) {\n                            promises.push( me._traverseDirectoryTree(\n                                    entries[ i ], arr ) );\n                        }\n    \n                        Base.when.apply( Base, promises ).then(function() {\n                            results.push.apply( results, arr );\n                            deferred.resolve();\n                        }, deferred.reject );\n                    });\n                }\n    \n                return deferred.promise();\n            },\n    \n            destroy: function() {\n                var elem = this.elem;\n    \n                elem.off( 'dragenter', this.dragEnterHandler );\n                elem.off( 'dragover', this.dragEnterHandler );\n                elem.off( 'dragleave', this.dragLeaveHandler );\n                elem.off( 'drop', this.dropHandler );\n    \n                if ( this.options.disableGlobalDnd ) {\n                    $( document ).off( 'dragover', this.dragOverHandler );\n                    $( document ).off( 'drop', this.dropHandler );\n                }\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview FilePaste\n     */\n    define('runtime/html5/filepaste',[\n        'base',\n        'runtime/html5/runtime',\n        'lib/file'\n    ], function( Base, Html5Runtime, File ) {\n    \n        return Html5Runtime.register( 'FilePaste', {\n            init: function() {\n                var opts = this.options,\n                    elem = this.elem = opts.container,\n                    accept = '.*',\n                    arr, i, len, item;\n    \n                // accetp的mimeTypes中生成匹配正则。\n                if ( opts.accept ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        item = opts.accept[ i ].mimeTypes;\n                        item && arr.push( item );\n                    }\n    \n                    if ( arr.length ) {\n                        accept = arr.join(',');\n                        accept = accept.replace( /,/g, '|' ).replace( /\\*/g, '.*' );\n                    }\n                }\n                this.accept = accept = new RegExp( accept, 'i' );\n                this.hander = Base.bindFn( this._pasteHander, this );\n                elem.on( 'paste', this.hander );\n            },\n    \n            _pasteHander: function( e ) {\n                var allowed = [],\n                    ruid = this.getRuid(),\n                    items, item, blob, i, len;\n    \n                e = e.originalEvent || e;\n                items = e.clipboardData.items;\n    \n                for ( i = 0, len = items.length; i < len; i++ ) {\n                    item = items[ i ];\n    \n                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {\n                        continue;\n                    }\n    \n                    allowed.push( new File( ruid, blob ) );\n                }\n    \n                if ( allowed.length ) {\n                    // 不阻止非文件粘贴（文字粘贴）的事件冒泡\n                    e.preventDefault();\n                    e.stopPropagation();\n                    this.trigger( 'paste', allowed );\n                }\n            },\n    \n            destroy: function() {\n                this.elem.off( 'paste', this.hander );\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview FilePicker\n     */\n    define('runtime/html5/filepicker',[\n        'base',\n        'runtime/html5/runtime'\n    ], function( Base, Html5Runtime ) {\n    \n        var $ = Base.$;\n    \n        return Html5Runtime.register( 'FilePicker', {\n            init: function() {\n                var container = this.getRuntime().getContainer(),\n                    me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    lable = $( document.createElement('label') ),\n                    input = $( document.createElement('input') ),\n                    arr, i, len, mouseHandler;\n    \n                input.attr( 'type', 'file' );\n                input.attr( 'name', opts.name );\n                input.addClass('webuploader-element-invisible');\n    \n                lable.on( 'click', function() {\n                    input.trigger('click');\n                });\n    \n                lable.css({\n                    opacity: 0,\n                    width: '100%',\n                    height: '100%',\n                    display: 'block',\n                    cursor: 'pointer',\n                    background: '#ffffff'\n                });\n    \n                if ( opts.multiple ) {\n                    input.attr( 'multiple', 'multiple' );\n                }\n    \n                // @todo Firefox不支持单独指定后缀\n                if ( opts.accept && opts.accept.length > 0 ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        arr.push( opts.accept[ i ].mimeTypes );\n                    }\n    \n                    input.attr( 'accept', arr.join(',') );\n                }\n    \n                container.append( input );\n                container.append( lable );\n    \n                mouseHandler = function( e ) {\n                    owner.trigger( e.type );\n                };\n    \n                input.on( 'change', function( e ) {\n                    var fn = arguments.callee,\n                        clone;\n    \n                    me.files = e.target.files;\n    \n                    // reset input\n                    clone = this.cloneNode( true );\n                    this.parentNode.replaceChild( clone, this );\n    \n                    input.off();\n                    input = $( clone ).on( 'change', fn )\n                            .on( 'mouseenter mouseleave', mouseHandler );\n    \n                    owner.trigger('change');\n                });\n    \n                lable.on( 'mouseenter mouseleave', mouseHandler );\n    \n            },\n    \n    \n            getFiles: function() {\n                return this.files;\n            },\n    \n            destroy: function() {\n                // todo\n            }\n        });\n    });\n    /**\n     * Terms:\n     *\n     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer\n     * @fileOverview Image控件\n     */\n    define('runtime/html5/util',[\n        'base'\n    ], function( Base ) {\n    \n        var urlAPI = window.createObjectURL && window ||\n                window.URL && URL.revokeObjectURL && URL ||\n                window.webkitURL,\n            createObjectURL = Base.noop,\n            revokeObjectURL = createObjectURL;\n    \n        if ( urlAPI ) {\n    \n            // 更安全的方式调用，比如android里面就能把context改成其他的对象。\n            createObjectURL = function() {\n                return urlAPI.createObjectURL.apply( urlAPI, arguments );\n            };\n    \n            revokeObjectURL = function() {\n                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );\n            };\n        }\n    \n        return {\n            createObjectURL: createObjectURL,\n            revokeObjectURL: revokeObjectURL,\n    \n            dataURL2Blob: function( dataURI ) {\n                var byteStr, intArray, ab, i, mimetype, parts;\n    \n                parts = dataURI.split(',');\n    \n                if ( ~parts[ 0 ].indexOf('base64') ) {\n                    byteStr = atob( parts[ 1 ] );\n                } else {\n                    byteStr = decodeURIComponent( parts[ 1 ] );\n                }\n    \n                ab = new ArrayBuffer( byteStr.length );\n                intArray = new Uint8Array( ab );\n    \n                for ( i = 0; i < byteStr.length; i++ ) {\n                    intArray[ i ] = byteStr.charCodeAt( i );\n                }\n    \n                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];\n    \n                return this.arrayBufferToBlob( ab, mimetype );\n            },\n    \n            dataURL2ArrayBuffer: function( dataURI ) {\n                var byteStr, intArray, i, parts;\n    \n                parts = dataURI.split(',');\n    \n                if ( ~parts[ 0 ].indexOf('base64') ) {\n                    byteStr = atob( parts[ 1 ] );\n                } else {\n                    byteStr = decodeURIComponent( parts[ 1 ] );\n                }\n    \n                intArray = new Uint8Array( byteStr.length );\n    \n                for ( i = 0; i < byteStr.length; i++ ) {\n                    intArray[ i ] = byteStr.charCodeAt( i );\n                }\n    \n                return intArray.buffer;\n            },\n    \n            arrayBufferToBlob: function( buffer, type ) {\n                var builder = window.BlobBuilder || window.WebKitBlobBuilder,\n                    bb;\n    \n                // android不支持直接new Blob, 只能借助blobbuilder.\n                if ( builder ) {\n                    bb = new builder();\n                    bb.append( buffer );\n                    return bb.getBlob( type );\n                }\n    \n                return new Blob([ buffer ], type ? { type: type } : {} );\n            },\n    \n            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.\n            // 你得到的结果是png.\n            canvasToDataUrl: function( canvas, type, quality ) {\n                return canvas.toDataURL( type, quality / 100 );\n            },\n    \n            // imagemeat会复写这个方法，如果用户选择加载那个文件了的话。\n            parseMeta: function( blob, callback ) {\n                callback( false, {});\n            },\n    \n            // imagemeat会复写这个方法，如果用户选择加载那个文件了的话。\n            updateImageHead: function( data ) {\n                return data;\n            }\n        };\n    });\n    /**\n     * Terms:\n     *\n     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer\n     * @fileOverview Image控件\n     */\n    define('runtime/html5/imagemeta',[\n        'runtime/html5/util'\n    ], function( Util ) {\n    \n        var api;\n    \n        api = {\n            parsers: {\n                0xffe1: []\n            },\n    \n            maxMetaDataSize: 262144,\n    \n            parse: function( blob, cb ) {\n                var me = this,\n                    fr = new FileReader();\n    \n                fr.onload = function() {\n                    cb( false, me._parse( this.result ) );\n                    fr = fr.onload = fr.onerror = null;\n                };\n    \n                fr.onerror = function( e ) {\n                    cb( e.message );\n                    fr = fr.onload = fr.onerror = null;\n                };\n    \n                blob = blob.slice( 0, me.maxMetaDataSize );\n                fr.readAsArrayBuffer( blob.getSource() );\n            },\n    \n            _parse: function( buffer, noParse ) {\n                if ( buffer.byteLength < 6 ) {\n                    return;\n                }\n    \n                var dataview = new DataView( buffer ),\n                    offset = 2,\n                    maxOffset = dataview.byteLength - 4,\n                    headLength = offset,\n                    ret = {},\n                    markerBytes, markerLength, parsers, i;\n    \n                if ( dataview.getUint16( 0 ) === 0xffd8 ) {\n    \n                    while ( offset < maxOffset ) {\n                        markerBytes = dataview.getUint16( offset );\n    \n                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||\n                                markerBytes === 0xfffe ) {\n    \n                            markerLength = dataview.getUint16( offset + 2 ) + 2;\n    \n                            if ( offset + markerLength > dataview.byteLength ) {\n                                break;\n                            }\n    \n                            parsers = api.parsers[ markerBytes ];\n    \n                            if ( !noParse && parsers ) {\n                                for ( i = 0; i < parsers.length; i += 1 ) {\n                                    parsers[ i ].call( api, dataview, offset,\n                                            markerLength, ret );\n                                }\n                            }\n    \n                            offset += markerLength;\n                            headLength = offset;\n                        } else {\n                            break;\n                        }\n                    }\n    \n                    if ( headLength > 6 ) {\n                        if ( buffer.slice ) {\n                            ret.imageHead = buffer.slice( 2, headLength );\n                        } else {\n                            // Workaround for IE10, which does not yet\n                            // support ArrayBuffer.slice:\n                            ret.imageHead = new Uint8Array( buffer )\n                                    .subarray( 2, headLength );\n                        }\n                    }\n                }\n    \n                return ret;\n            },\n    \n            updateImageHead: function( buffer, head ) {\n                var data = this._parse( buffer, true ),\n                    buf1, buf2, bodyoffset;\n    \n    \n                bodyoffset = 2;\n                if ( data.imageHead ) {\n                    bodyoffset = 2 + data.imageHead.byteLength;\n                }\n    \n                if ( buffer.slice ) {\n                    buf2 = buffer.slice( bodyoffset );\n                } else {\n                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );\n                }\n    \n                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );\n    \n                buf1[ 0 ] = 0xFF;\n                buf1[ 1 ] = 0xD8;\n                buf1.set( new Uint8Array( head ), 2 );\n                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );\n    \n                return buf1.buffer;\n            }\n        };\n    \n        Util.parseMeta = function() {\n            return api.parse.apply( api, arguments );\n        };\n    \n        Util.updateImageHead = function() {\n            return api.updateImageHead.apply( api, arguments );\n        };\n    \n        return api;\n    });\n    /**\n     * 代码来自于：https://github.com/blueimp/JavaScript-Load-Image\n     * 暂时项目中只用了orientation.\n     *\n     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.\n     * @fileOverview EXIF解析\n     */\n    \n    // Sample\n    // ====================================\n    // Make : Apple\n    // Model : iPhone 4S\n    // Orientation : 1\n    // XResolution : 72 [72/1]\n    // YResolution : 72 [72/1]\n    // ResolutionUnit : 2\n    // Software : QuickTime 7.7.1\n    // DateTime : 2013:09:01 22:53:55\n    // ExifIFDPointer : 190\n    // ExposureTime : 0.058823529411764705 [1/17]\n    // FNumber : 2.4 [12/5]\n    // ExposureProgram : Normal program\n    // ISOSpeedRatings : 800\n    // ExifVersion : 0220\n    // DateTimeOriginal : 2013:09:01 22:52:51\n    // DateTimeDigitized : 2013:09:01 22:52:51\n    // ComponentsConfiguration : YCbCr\n    // ShutterSpeedValue : 4.058893515764426\n    // ApertureValue : 2.5260688216892597 [4845/1918]\n    // BrightnessValue : -0.3126686601998395\n    // MeteringMode : Pattern\n    // Flash : Flash did not fire, compulsory flash mode\n    // FocalLength : 4.28 [107/25]\n    // SubjectArea : [4 values]\n    // FlashpixVersion : 0100\n    // ColorSpace : 1\n    // PixelXDimension : 2448\n    // PixelYDimension : 3264\n    // SensingMethod : One-chip color area sensor\n    // ExposureMode : 0\n    // WhiteBalance : Auto white balance\n    // FocalLengthIn35mmFilm : 35\n    // SceneCaptureType : Standard\n    define('runtime/html5/imagemeta/exif',[\n        'base',\n        'runtime/html5/imagemeta'\n    ], function( Base, ImageMeta ) {\n    \n        var EXIF = {};\n    \n        EXIF.ExifMap = function() {\n            return this;\n        };\n    \n        EXIF.ExifMap.prototype.map = {\n            'Orientation': 0x0112\n        };\n    \n        EXIF.ExifMap.prototype.get = function( id ) {\n            return this[ id ] || this[ this.map[ id ] ];\n        };\n    \n        EXIF.exifTagTypes = {\n            // byte, 8-bit unsigned int:\n            1: {\n                getValue: function( dataView, dataOffset ) {\n                    return dataView.getUint8( dataOffset );\n                },\n                size: 1\n            },\n    \n            // ascii, 8-bit byte:\n            2: {\n                getValue: function( dataView, dataOffset ) {\n                    return String.fromCharCode( dataView.getUint8( dataOffset ) );\n                },\n                size: 1,\n                ascii: true\n            },\n    \n            // short, 16 bit int:\n            3: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint16( dataOffset, littleEndian );\n                },\n                size: 2\n            },\n    \n            // long, 32 bit int:\n            4: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint32( dataOffset, littleEndian );\n                },\n                size: 4\n            },\n    \n            // rational = two long values,\n            // first is numerator, second is denominator:\n            5: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint32( dataOffset, littleEndian ) /\n                        dataView.getUint32( dataOffset + 4, littleEndian );\n                },\n                size: 8\n            },\n    \n            // slong, 32 bit signed int:\n            9: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getInt32( dataOffset, littleEndian );\n                },\n                size: 4\n            },\n    \n            // srational, two slongs, first is numerator, second is denominator:\n            10: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getInt32( dataOffset, littleEndian ) /\n                        dataView.getInt32( dataOffset + 4, littleEndian );\n                },\n                size: 8\n            }\n        };\n    \n        // undefined, 8-bit byte, value depending on field:\n        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];\n    \n        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,\n                littleEndian ) {\n    \n            var tagType = EXIF.exifTagTypes[ type ],\n                tagSize, dataOffset, values, i, str, c;\n    \n            if ( !tagType ) {\n                Base.log('Invalid Exif data: Invalid tag type.');\n                return;\n            }\n    \n            tagSize = tagType.size * length;\n    \n            // Determine if the value is contained in the dataOffset bytes,\n            // or if the value at the dataOffset is a pointer to the actual data:\n            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,\n                    littleEndian ) : (offset + 8);\n    \n            if ( dataOffset + tagSize > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid data offset.');\n                return;\n            }\n    \n            if ( length === 1 ) {\n                return tagType.getValue( dataView, dataOffset, littleEndian );\n            }\n    \n            values = [];\n    \n            for ( i = 0; i < length; i += 1 ) {\n                values[ i ] = tagType.getValue( dataView,\n                        dataOffset + i * tagType.size, littleEndian );\n            }\n    \n            if ( tagType.ascii ) {\n                str = '';\n    \n                // Concatenate the chars:\n                for ( i = 0; i < values.length; i += 1 ) {\n                    c = values[ i ];\n    \n                    // Ignore the terminating NULL byte(s):\n                    if ( c === '\\u0000' ) {\n                        break;\n                    }\n                    str += c;\n                }\n    \n                return str;\n            }\n            return values;\n        };\n    \n        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,\n                data ) {\n    \n            var tag = dataView.getUint16( offset, littleEndian );\n            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,\n                    dataView.getUint16( offset + 2, littleEndian ),    // tag type\n                    dataView.getUint32( offset + 4, littleEndian ),    // tag length\n                    littleEndian );\n        };\n    \n        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,\n                littleEndian, data ) {\n    \n            var tagsNumber, dirEndOffset, i;\n    \n            if ( dirOffset + 6 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid directory offset.');\n                return;\n            }\n    \n            tagsNumber = dataView.getUint16( dirOffset, littleEndian );\n            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;\n    \n            if ( dirEndOffset + 4 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid directory size.');\n                return;\n            }\n    \n            for ( i = 0; i < tagsNumber; i += 1 ) {\n                this.parseExifTag( dataView, tiffOffset,\n                        dirOffset + 2 + 12 * i,    // tag offset\n                        littleEndian, data );\n            }\n    \n            // Return the offset to the next directory:\n            return dataView.getUint32( dirEndOffset, littleEndian );\n        };\n    \n        // EXIF.getExifThumbnail = function(dataView, offset, length) {\n        //     var hexData,\n        //         i,\n        //         b;\n        //     if (!length || offset + length > dataView.byteLength) {\n        //         Base.log('Invalid Exif data: Invalid thumbnail data.');\n        //         return;\n        //     }\n        //     hexData = [];\n        //     for (i = 0; i < length; i += 1) {\n        //         b = dataView.getUint8(offset + i);\n        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));\n        //     }\n        //     return 'data:image/jpeg,%' + hexData.join('%');\n        // };\n    \n        EXIF.parseExifData = function( dataView, offset, length, data ) {\n    \n            var tiffOffset = offset + 10,\n                littleEndian, dirOffset;\n    \n            // Check for the ASCII code for \"Exif\" (0x45786966):\n            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {\n                // No Exif data, might be XMP data instead\n                return;\n            }\n            if ( tiffOffset + 8 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid segment size.');\n                return;\n            }\n    \n            // Check for the two null bytes:\n            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {\n                Base.log('Invalid Exif data: Missing byte alignment offset.');\n                return;\n            }\n    \n            // Check the byte alignment:\n            switch ( dataView.getUint16( tiffOffset ) ) {\n                case 0x4949:\n                    littleEndian = true;\n                    break;\n    \n                case 0x4D4D:\n                    littleEndian = false;\n                    break;\n    \n                default:\n                    Base.log('Invalid Exif data: Invalid byte alignment marker.');\n                    return;\n            }\n    \n            // Check for the TIFF tag marker (0x002A):\n            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {\n                Base.log('Invalid Exif data: Missing TIFF marker.');\n                return;\n            }\n    \n            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:\n            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );\n            // Create the exif object to store the tags:\n            data.exif = new EXIF.ExifMap();\n            // Parse the tags of the main image directory and retrieve the\n            // offset to the next directory, usually the thumbnail directory:\n            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,\n                    tiffOffset + dirOffset, littleEndian, data );\n    \n            // 尝试读取缩略图\n            // if ( dirOffset ) {\n            //     thumbnailData = {exif: {}};\n            //     dirOffset = EXIF.parseExifTags(\n            //         dataView,\n            //         tiffOffset,\n            //         tiffOffset + dirOffset,\n            //         littleEndian,\n            //         thumbnailData\n            //     );\n    \n            //     // Check for JPEG Thumbnail offset:\n            //     if (thumbnailData.exif[0x0201]) {\n            //         data.exif.Thumbnail = EXIF.getExifThumbnail(\n            //             dataView,\n            //             tiffOffset + thumbnailData.exif[0x0201],\n            //             thumbnailData.exif[0x0202] // Thumbnail data length\n            //         );\n            //     }\n            // }\n        };\n    \n        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );\n        return EXIF;\n    });\n    /**\n     * @fileOverview Image\n     */\n    define('runtime/html5/image',[\n        'base',\n        'runtime/html5/runtime',\n        'runtime/html5/util'\n    ], function( Base, Html5Runtime, Util ) {\n    \n        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';\n    \n        return Html5Runtime.register( 'Image', {\n    \n            // flag: 标记是否被修改过。\n            modified: false,\n    \n            init: function() {\n                var me = this,\n                    img = new Image();\n    \n                img.onload = function() {\n    \n                    me._info = {\n                        type: me.type,\n                        width: this.width,\n                        height: this.height\n                    };\n    \n                    // 读取meta信息。\n                    if ( !me._metas && 'image/jpeg' === me.type ) {\n                        Util.parseMeta( me._blob, function( error, ret ) {\n                            me._metas = ret;\n                            me.owner.trigger('load');\n                        });\n                    } else {\n                        me.owner.trigger('load');\n                    }\n                };\n    \n                img.onerror = function() {\n                    me.owner.trigger('error');\n                };\n    \n                me._img = img;\n            },\n    \n            loadFromBlob: function( blob ) {\n                var me = this,\n                    img = me._img;\n    \n                me._blob = blob;\n                me.type = blob.type;\n                img.src = Util.createObjectURL( blob.getSource() );\n                me.owner.once( 'load', function() {\n                    Util.revokeObjectURL( img.src );\n                });\n            },\n    \n            resize: function( width, height ) {\n                var canvas = this._canvas ||\n                        (this._canvas = document.createElement('canvas'));\n    \n                this._resize( this._img, canvas, width, height );\n                this._blob = null;    // 没用了，可以删掉了。\n                this.modified = true;\n                this.owner.trigger('complete');\n            },\n    \n            getAsBlob: function( type ) {\n                var blob = this._blob,\n                    opts = this.options,\n                    canvas;\n    \n                type = type || this.type;\n    \n                // blob需要重新生成。\n                if ( this.modified || this.type !== type ) {\n                    canvas = this._canvas;\n    \n                    if ( type === 'image/jpeg' ) {\n    \n                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',\n                                opts.quality );\n    \n                        if ( opts.preserveHeaders && this._metas &&\n                                this._metas.imageHead ) {\n    \n                            blob = Util.dataURL2ArrayBuffer( blob );\n                            blob = Util.updateImageHead( blob,\n                                    this._metas.imageHead );\n                            blob = Util.arrayBufferToBlob( blob, type );\n                            return blob;\n                        }\n                    } else {\n                        blob = Util.canvasToDataUrl( canvas, type );\n                    }\n    \n                    blob = Util.dataURL2Blob( blob );\n                }\n    \n                return blob;\n            },\n    \n            getAsDataUrl: function( type ) {\n                var opts = this.options;\n    \n                type = type || this.type;\n    \n                if ( type === 'image/jpeg' ) {\n                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );\n                } else {\n                    return this._canvas.toDataURL( type );\n                }\n            },\n    \n            getOrientation: function() {\n                return this._metas && this._metas.exif &&\n                        this._metas.exif.get('Orientation') || 1;\n            },\n    \n            info: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._info = val;\n                    return this;\n                }\n    \n                // getter\n                return this._info;\n            },\n    \n            meta: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._meta = val;\n                    return this;\n                }\n    \n                // getter\n                return this._meta;\n            },\n    \n            destroy: function() {\n                var canvas = this._canvas;\n                this._img.onload = null;\n    \n                if ( canvas ) {\n                    canvas.getContext('2d')\n                            .clearRect( 0, 0, canvas.width, canvas.height );\n                    canvas.width = canvas.height = 0;\n                    this._canvas = null;\n                }\n    \n                // 释放内存。非常重要，否则释放不了image的内存。\n                this._img.src = BLANK;\n                this._img = this._blob = null;\n            },\n    \n            _resize: function( img, cvs, width, height ) {\n                var opts = this.options,\n                    naturalWidth = img.width,\n                    naturalHeight = img.height,\n                    orientation = this.getOrientation(),\n                    scale, w, h, x, y;\n    \n                // values that require 90 degree rotation\n                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {\n    \n                    // 交换width, height的值。\n                    width ^= height;\n                    height ^= width;\n                    width ^= height;\n                }\n    \n                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,\n                        height / naturalHeight );\n    \n                // 不允许放大。\n                opts.allowMagnify || (scale = Math.min( 1, scale ));\n    \n                w = naturalWidth * scale;\n                h = naturalHeight * scale;\n    \n                if ( opts.crop ) {\n                    cvs.width = width;\n                    cvs.height = height;\n                } else {\n                    cvs.width = w;\n                    cvs.height = h;\n                }\n    \n                x = (cvs.width - w) / 2;\n                y = (cvs.height - h) / 2;\n    \n                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );\n    \n                this._renderImageToCanvas( cvs, img, x, y, w, h );\n            },\n    \n            _rotate2Orientaion: function( canvas, orientation ) {\n                var width = canvas.width,\n                    height = canvas.height,\n                    ctx = canvas.getContext('2d');\n    \n                switch ( orientation ) {\n                    case 5:\n                    case 6:\n                    case 7:\n                    case 8:\n                        canvas.width = height;\n                        canvas.height = width;\n                        break;\n                }\n    \n                switch ( orientation ) {\n                    case 2:    // horizontal flip\n                        ctx.translate( width, 0 );\n                        ctx.scale( -1, 1 );\n                        break;\n    \n                    case 3:    // 180 rotate left\n                        ctx.translate( width, height );\n                        ctx.rotate( Math.PI );\n                        break;\n    \n                    case 4:    // vertical flip\n                        ctx.translate( 0, height );\n                        ctx.scale( 1, -1 );\n                        break;\n    \n                    case 5:    // vertical flip + 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.scale( 1, -1 );\n                        break;\n    \n                    case 6:    // 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.translate( 0, -height );\n                        break;\n    \n                    case 7:    // horizontal flip + 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.translate( width, -height );\n                        ctx.scale( -1, 1 );\n                        break;\n    \n                    case 8:    // 90 rotate left\n                        ctx.rotate( -0.5 * Math.PI );\n                        ctx.translate( -width, 0 );\n                        break;\n                }\n            },\n    \n            // https://github.com/stomita/ios-imagefile-megapixel/\n            // blob/master/src/megapix-image.js\n            _renderImageToCanvas: (function() {\n    \n                // 如果不是ios, 不需要这么复杂！\n                if ( !Base.os.ios ) {\n                    return function( canvas, img, x, y, w, h ) {\n                        canvas.getContext('2d').drawImage( img, x, y, w, h );\n                    };\n                }\n    \n                /**\n                 * Detecting vertical squash in loaded image.\n                 * Fixes a bug which squash image vertically while drawing into\n                 * canvas for some images.\n                 */\n                function detectVerticalSquash( img, iw, ih ) {\n                    var canvas = document.createElement('canvas'),\n                        ctx = canvas.getContext('2d'),\n                        sy = 0,\n                        ey = ih,\n                        py = ih,\n                        data, alpha, ratio;\n    \n    \n                    canvas.width = 1;\n                    canvas.height = ih;\n                    ctx.drawImage( img, 0, 0 );\n                    data = ctx.getImageData( 0, 0, 1, ih ).data;\n    \n                    // search image edge pixel position in case\n                    // it is squashed vertically.\n                    while ( py > sy ) {\n                        alpha = data[ (py - 1) * 4 + 3 ];\n    \n                        if ( alpha === 0 ) {\n                            ey = py;\n                        } else {\n                            sy = py;\n                        }\n    \n                        py = (ey + sy) >> 1;\n                    }\n    \n                    ratio = (py / ih);\n                    return (ratio === 0) ? 1 : ratio;\n                }\n    \n                // fix ie7 bug\n                // http://stackoverflow.com/questions/11929099/\n                // html5-canvas-drawimage-ratio-bug-ios\n                if ( Base.os.ios >= 7 ) {\n                    return function( canvas, img, x, y, w, h ) {\n                        var iw = img.naturalWidth,\n                            ih = img.naturalHeight,\n                            vertSquashRatio = detectVerticalSquash( img, iw, ih );\n    \n                        return canvas.getContext('2d').drawImage( img, 0, 0,\n                            iw * vertSquashRatio, ih * vertSquashRatio,\n                            x, y, w, h );\n                    };\n                }\n    \n                /**\n                 * Detect subsampling in loaded image.\n                 * In iOS, larger images than 2M pixels may be\n                 * subsampled in rendering.\n                 */\n                function detectSubsampling( img ) {\n                    var iw = img.naturalWidth,\n                        ih = img.naturalHeight,\n                        canvas, ctx;\n    \n                    // subsampling may happen overmegapixel image\n                    if ( iw * ih > 1024 * 1024 ) {\n                        canvas = document.createElement('canvas');\n                        canvas.width = canvas.height = 1;\n                        ctx = canvas.getContext('2d');\n                        ctx.drawImage( img, -iw + 1, 0 );\n    \n                        // subsampled image becomes half smaller in rendering size.\n                        // check alpha channel value to confirm image is covering\n                        // edge pixel or not. if alpha value is 0\n                        // image is not covering, hence subsampled.\n                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;\n                    } else {\n                        return false;\n                    }\n                }\n    \n    \n                return function( canvas, img, x, y, width, height ) {\n                    var iw = img.naturalWidth,\n                        ih = img.naturalHeight,\n                        ctx = canvas.getContext('2d'),\n                        subsampled = detectSubsampling( img ),\n                        doSquash = this.type === 'image/jpeg',\n                        d = 1024,\n                        sy = 0,\n                        dy = 0,\n                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;\n    \n                    if ( subsampled ) {\n                        iw /= 2;\n                        ih /= 2;\n                    }\n    \n                    ctx.save();\n                    tmpCanvas = document.createElement('canvas');\n                    tmpCanvas.width = tmpCanvas.height = d;\n    \n                    tmpCtx = tmpCanvas.getContext('2d');\n                    vertSquashRatio = doSquash ?\n                            detectVerticalSquash( img, iw, ih ) : 1;\n    \n                    dw = Math.ceil( d * width / iw );\n                    dh = Math.ceil( d * height / ih / vertSquashRatio );\n    \n                    while ( sy < ih ) {\n                        sx = 0;\n                        dx = 0;\n                        while ( sx < iw ) {\n                            tmpCtx.clearRect( 0, 0, d, d );\n                            tmpCtx.drawImage( img, -sx, -sy );\n                            ctx.drawImage( tmpCanvas, 0, 0, d, d,\n                                    x + dx, y + dy, dw, dh );\n                            sx += d;\n                            dx += dw;\n                        }\n                        sy += d;\n                        dy += dh;\n                    }\n                    ctx.restore();\n                    tmpCanvas = tmpCtx = null;\n                };\n            })()\n        });\n    });\n    /**\n     * @fileOverview Transport\n     * @todo 支持chunked传输，优势：\n     * 可以将大文件分成小块，挨个传输，可以提高大文件成功率，当失败的时候，也只需要重传那小部分，\n     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。\n     */\n    define('runtime/html5/transport',[\n        'base',\n        'runtime/html5/runtime'\n    ], function( Base, Html5Runtime ) {\n    \n        var noop = Base.noop,\n            $ = Base.$;\n    \n        return Html5Runtime.register( 'Transport', {\n            init: function() {\n                this._status = 0;\n                this._response = null;\n            },\n    \n            send: function() {\n                var owner = this.owner,\n                    opts = this.options,\n                    xhr = this._initAjax(),\n                    blob = owner._blob,\n                    server = opts.server,\n                    formData, binary, fr;\n    \n                if ( opts.sendAsBinary ) {\n                    server += (/\\?/.test( server ) ? '&' : '?') +\n                            $.param( owner._formData );\n    \n                    binary = blob.getSource();\n                } else {\n                    formData = new FormData();\n                    $.each( owner._formData, function( k, v ) {\n                        formData.append( k, v );\n                    });\n    \n                    formData.append( opts.fileVal, blob.getSource(),\n                            opts.filename || owner._formData.name || '' );\n                }\n    \n                if ( opts.withCredentials && 'withCredentials' in xhr ) {\n                    xhr.open( opts.method, server, true );\n                    xhr.withCredentials = true;\n                } else {\n                    xhr.open( opts.method, server );\n                }\n    \n                this._setRequestHeader( xhr, opts.headers );\n    \n                if ( binary ) {\n                    xhr.overrideMimeType('application/octet-stream');\n    \n                    // android直接发送blob会导致服务端接收到的是空文件。\n                    // bug详情。\n                    // https://code.google.com/p/android/issues/detail?id=39882\n                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。\n                    if ( Base.os.android ) {\n                        fr = new FileReader();\n    \n                        fr.onload = function() {\n                            xhr.send( this.result );\n                            fr = fr.onload = null;\n                        };\n    \n                        fr.readAsArrayBuffer( binary );\n                    } else {\n                        xhr.send( binary );\n                    }\n                } else {\n                    xhr.send( formData );\n                }\n            },\n    \n            getResponse: function() {\n                return this._response;\n            },\n    \n            getResponseAsJson: function() {\n                return this._parseJson( this._response );\n            },\n    \n            getStatus: function() {\n                return this._status;\n            },\n    \n            abort: function() {\n                var xhr = this._xhr;\n    \n                if ( xhr ) {\n                    xhr.upload.onprogress = noop;\n                    xhr.onreadystatechange = noop;\n                    xhr.abort();\n    \n                    this._xhr = xhr = null;\n                }\n            },\n    \n            destroy: function() {\n                this.abort();\n            },\n    \n            _initAjax: function() {\n                var me = this,\n                    xhr = new XMLHttpRequest(),\n                    opts = this.options;\n    \n                if ( opts.withCredentials && !('withCredentials' in xhr) &&\n                        typeof XDomainRequest !== 'undefined' ) {\n                    xhr = new XDomainRequest();\n                }\n    \n                xhr.upload.onprogress = function( e ) {\n                    var percentage = 0;\n    \n                    if ( e.lengthComputable ) {\n                        percentage = e.loaded / e.total;\n                    }\n    \n                    return me.trigger( 'progress', percentage );\n                };\n    \n                xhr.onreadystatechange = function() {\n    \n                    if ( xhr.readyState !== 4 ) {\n                        return;\n                    }\n    \n                    xhr.upload.onprogress = noop;\n                    xhr.onreadystatechange = noop;\n                    me._xhr = null;\n                    me._status = xhr.status;\n    \n                    if ( xhr.status >= 200 && xhr.status < 300 ) {\n                        me._response = xhr.responseText;\n                        return me.trigger('load');\n                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {\n                        me._response = xhr.responseText;\n                        return me.trigger( 'error', 'server' );\n                    }\n    \n    \n                    return me.trigger( 'error', me._status ? 'http' : 'abort' );\n                };\n    \n                me._xhr = xhr;\n                return xhr;\n            },\n    \n            _setRequestHeader: function( xhr, headers ) {\n                $.each( headers, function( key, val ) {\n                    xhr.setRequestHeader( key, val );\n                });\n            },\n    \n            _parseJson: function( str ) {\n                var json;\n    \n                try {\n                    json = JSON.parse( str );\n                } catch ( ex ) {\n                    json = {};\n                }\n    \n                return json;\n            }\n        });\n    });\n    /**\n     * @fileOverview 只有html5实现的文件版本。\n     */\n    define('preset/html5only',[\n        'base',\n    \n        // widgets\n        'widgets/filednd',\n        'widgets/filepaste',\n        'widgets/filepicker',\n        'widgets/image',\n        'widgets/queue',\n        'widgets/runtime',\n        'widgets/upload',\n        'widgets/validator',\n    \n        // runtimes\n        // html5\n        'runtime/html5/blob',\n        'runtime/html5/dnd',\n        'runtime/html5/filepaste',\n        'runtime/html5/filepicker',\n        'runtime/html5/imagemeta/exif',\n        'runtime/html5/image',\n        'runtime/html5/transport'\n    ], function( Base ) {\n        return Base;\n    });\n    define('webuploader',[\n        'preset/html5only'\n    ], function( preset ) {\n        return preset;\n    });\n    return require('webuploader');\n});\n"
  },
  {
    "path": "static/common/user/uedit/third-party/webuploader/webuploader.js",
    "content": "/*! WebUploader 0.1.2 */\n\n\n/**\n * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。\n *\n * AMD API 内部的简单不完全实现，请忽略。只有当WebUploader被合并成一个文件的时候才会引入。\n */\n(function( root, factory ) {\n    var modules = {},\n\n        // 内部require, 简单不完全实现。\n        // https://github.com/amdjs/amdjs-api/wiki/require\n        _require = function( deps, callback ) {\n            var args, len, i;\n\n            // 如果deps不是数组，则直接返回指定module\n            if ( typeof deps === 'string' ) {\n                return getModule( deps );\n            } else {\n                args = [];\n                for( len = deps.length, i = 0; i < len; i++ ) {\n                    args.push( getModule( deps[ i ] ) );\n                }\n\n                return callback.apply( null, args );\n            }\n        },\n\n        // 内部define，暂时不支持不指定id.\n        _define = function( id, deps, factory ) {\n            if ( arguments.length === 2 ) {\n                factory = deps;\n                deps = null;\n            }\n\n            _require( deps || [], function() {\n                setModule( id, factory, arguments );\n            });\n        },\n\n        // 设置module, 兼容CommonJs写法。\n        setModule = function( id, factory, args ) {\n            var module = {\n                    exports: factory\n                },\n                returned;\n\n            if ( typeof factory === 'function' ) {\n                args.length || (args = [ _require, module.exports, module ]);\n                returned = factory.apply( null, args );\n                returned !== undefined && (module.exports = returned);\n            }\n\n            modules[ id ] = module.exports;\n        },\n\n        // 根据id获取module\n        getModule = function( id ) {\n            var module = modules[ id ] || root[ id ];\n\n            if ( !module ) {\n                throw new Error( '`' + id + '` is undefined' );\n            }\n\n            return module;\n        },\n\n        // 将所有modules，将路径ids装换成对象。\n        exportsTo = function( obj ) {\n            var key, host, parts, part, last, ucFirst;\n\n            // make the first character upper case.\n            ucFirst = function( str ) {\n                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));\n            };\n\n            for ( key in modules ) {\n                host = obj;\n\n                if ( !modules.hasOwnProperty( key ) ) {\n                    continue;\n                }\n\n                parts = key.split('/');\n                last = ucFirst( parts.pop() );\n\n                while( (part = ucFirst( parts.shift() )) ) {\n                    host[ part ] = host[ part ] || {};\n                    host = host[ part ];\n                }\n\n                host[ last ] = modules[ key ];\n            }\n        },\n\n        exports = factory( root, _define, _require ),\n        origin;\n\n    // exports every module.\n    exportsTo( exports );\n\n    if ( typeof module === 'object' && typeof module.exports === 'object' ) {\n\n        // For CommonJS and CommonJS-like environments where a proper window is present,\n        module.exports = exports;\n    } else if ( typeof define === 'function' && define.amd ) {\n\n        // Allow using this built library as an AMD module\n        // in another project. That other project will only\n        // see this AMD call, not the internal modules in\n        // the closure below.\n        define([], exports );\n    } else {\n\n        // Browser globals case. Just assign the\n        // result to a property on the global.\n        origin = root.WebUploader;\n        root.WebUploader = exports;\n        root.WebUploader.noConflict = function() {\n            root.WebUploader = origin;\n        };\n    }\n})( this, function( window, define, require ) {\n\n\n    /**\n     * @fileOverview jQuery or Zepto\n     */\n    define('dollar-third',[],function() {\n        return window.jQuery || window.Zepto;\n    });\n    /**\n     * @fileOverview Dom 操作相关\n     */\n    define('dollar',[\n        'dollar-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 使用jQuery的Promise\n     */\n    define('promise-third',[\n        'dollar'\n    ], function( $ ) {\n        return {\n            Deferred: $.Deferred,\n            when: $.when,\n    \n            isPromise: function( anything ) {\n                return anything && typeof anything.then === 'function';\n            }\n        };\n    });\n    /**\n     * @fileOverview Promise/A+\n     */\n    define('promise',[\n        'promise-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 基础类方法。\n     */\n    \n    /**\n     * Web Uploader内部类的详细说明，以下提及的功能类，都可以在`WebUploader`这个变量中访问到。\n     *\n     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.\n     * 默认module id该文件的路径，而此路径将会转化成名字空间存放在WebUploader中。如：\n     *\n     * * module `base`：WebUploader.Base\n     * * module `file`: WebUploader.File\n     * * module `lib/dnd`: WebUploader.Lib.Dnd\n     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd\n     *\n     *\n     * 以下文档将可能省略`WebUploader`前缀。\n     * @module WebUploader\n     * @title WebUploader API文档\n     */\n    define('base',[\n        'dollar',\n        'promise'\n    ], function( $, promise ) {\n    \n        var noop = function() {},\n            call = Function.call;\n    \n        // http://jsperf.com/uncurrythis\n        // 反科里化\n        function uncurryThis( fn ) {\n            return function() {\n                return call.apply( fn, arguments );\n            };\n        }\n    \n        function bindFn( fn, context ) {\n            return function() {\n                return fn.apply( context, arguments );\n            };\n        }\n    \n        function createObject( proto ) {\n            var f;\n    \n            if ( Object.create ) {\n                return Object.create( proto );\n            } else {\n                f = function() {};\n                f.prototype = proto;\n                return new f();\n            }\n        }\n    \n    \n        /**\n         * 基础类，提供一些简单常用的方法。\n         * @class Base\n         */\n        return {\n    \n            /**\n             * @property {String} version 当前版本号。\n             */\n            version: '0.1.2',\n    \n            /**\n             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。\n             */\n            $: $,\n    \n            Deferred: promise.Deferred,\n    \n            isPromise: promise.isPromise,\n    \n            when: promise.when,\n    \n            /**\n             * @description  简单的浏览器检查结果。\n             *\n             * * `webkit`  webkit版本号，如果浏览器为非webkit内核，此属性为`undefined`。\n             * * `chrome`  chrome浏览器版本号，如果浏览器为chrome，此属性为`undefined`。\n             * * `ie`  ie浏览器版本号，如果浏览器为非ie，此属性为`undefined`。**暂不支持ie10+**\n             * * `firefox`  firefox浏览器版本号，如果浏览器为非firefox，此属性为`undefined`。\n             * * `safari`  safari浏览器版本号，如果浏览器为非safari，此属性为`undefined`。\n             * * `opera`  opera浏览器版本号，如果浏览器为非opera，此属性为`undefined`。\n             *\n             * @property {Object} [browser]\n             */\n            browser: (function( ua ) {\n                var ret = {},\n                    webkit = ua.match( /WebKit\\/([\\d.]+)/ ),\n                    chrome = ua.match( /Chrome\\/([\\d.]+)/ ) ||\n                        ua.match( /CriOS\\/([\\d.]+)/ ),\n    \n                    ie = ua.match( /MSIE\\s([\\d\\.]+)/ ) ||\n                        ua.match(/(?:trident)(?:.*rv:([\\w.]+))?/i),\n                    firefox = ua.match( /Firefox\\/([\\d.]+)/ ),\n                    safari = ua.match( /Safari\\/([\\d.]+)/ ),\n                    opera = ua.match( /OPR\\/([\\d.]+)/ );\n    \n                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));\n                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));\n                ie && (ret.ie = parseFloat( ie[ 1 ] ));\n                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));\n                safari && (ret.safari = parseFloat( safari[ 1 ] ));\n                opera && (ret.opera = parseFloat( opera[ 1 ] ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * @description  操作系统检查结果。\n             *\n             * * `android`  如果在android浏览器环境下，此值为对应的android版本号，否则为`undefined`。\n             * * `ios` 如果在ios浏览器环境下，此值为对应的ios版本号，否则为`undefined`。\n             * @property {Object} [os]\n             */\n            os: (function( ua ) {\n                var ret = {},\n    \n                    // osx = !!ua.match( /\\(Macintosh\\; Intel / ),\n                    android = ua.match( /(?:Android);?[\\s\\/]+([\\d.]+)?/ ),\n                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\\s([\\d_]+)/ );\n    \n                // osx && (ret.osx = true);\n                android && (ret.android = parseFloat( android[ 1 ] ));\n                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * 实现类与类之间的继承。\n             * @method inherits\n             * @grammar Base.inherits( super ) => child\n             * @grammar Base.inherits( super, protos ) => child\n             * @grammar Base.inherits( super, protos, statics ) => child\n             * @param  {Class} super 父类\n             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor，子类将是用此属性值。\n             * @param  {Function} [protos.constructor] 子类构造器，不指定的话将创建个临时的直接执行父类构造器的方法。\n             * @param  {Object} [statics] 静态属性或方法。\n             * @return {Class} 返回子类。\n             * @example\n             * function Person() {\n             *     console.log( 'Super' );\n             * }\n             * Person.prototype.hello = function() {\n             *     console.log( 'hello' );\n             * };\n             *\n             * var Manager = Base.inherits( Person, {\n             *     world: function() {\n             *         console.log( 'World' );\n             *     }\n             * });\n             *\n             * // 因为没有指定构造器，父类的构造器将会执行。\n             * var instance = new Manager();    // => Super\n             *\n             * // 继承子父类的方法\n             * instance.hello();    // => hello\n             * instance.world();    // => World\n             *\n             * // 子类的__super__属性指向父类\n             * console.log( Manager.__super__ === Person );    // => true\n             */\n            inherits: function( Super, protos, staticProtos ) {\n                var child;\n    \n                if ( typeof protos === 'function' ) {\n                    child = protos;\n                    protos = null;\n                } else if ( protos && protos.hasOwnProperty('constructor') ) {\n                    child = protos.constructor;\n                } else {\n                    child = function() {\n                        return Super.apply( this, arguments );\n                    };\n                }\n    \n                // 复制静态方法\n                $.extend( true, child, Super, staticProtos || {} );\n    \n                /* jshint camelcase: false */\n    \n                // 让子类的__super__属性指向父类。\n                child.__super__ = Super.prototype;\n    \n                // 构建原型，添加原型方法或属性。\n                // 暂时用Object.create实现。\n                child.prototype = createObject( Super.prototype );\n                protos && $.extend( true, child.prototype, protos );\n    \n                return child;\n            },\n    \n            /**\n             * 一个不做任何事情的方法。可以用来赋值给默认的callback.\n             * @method noop\n             */\n            noop: noop,\n    \n            /**\n             * 返回一个新的方法，此方法将已指定的`context`来执行。\n             * @grammar Base.bindFn( fn, context ) => Function\n             * @method bindFn\n             * @example\n             * var doSomething = function() {\n             *         console.log( this.name );\n             *     },\n             *     obj = {\n             *         name: 'Object Name'\n             *     },\n             *     aliasFn = Base.bind( doSomething, obj );\n             *\n             *  aliasFn();    // => Object Name\n             *\n             */\n            bindFn: bindFn,\n    \n            /**\n             * 引用Console.log如果存在的话，否则引用一个[空函数loop](#WebUploader:Base.log)。\n             * @grammar Base.log( args... ) => undefined\n             * @method log\n             */\n            log: (function() {\n                if ( window.console ) {\n                    return bindFn( console.log, console );\n                }\n                return noop;\n            })(),\n    \n            nextTick: (function() {\n    \n                return function( cb ) {\n                    setTimeout( cb, 1 );\n                };\n    \n                // @bug 当浏览器不在当前窗口时就停了。\n                // var next = window.requestAnimationFrame ||\n                //     window.webkitRequestAnimationFrame ||\n                //     window.mozRequestAnimationFrame ||\n                //     function( cb ) {\n                //         window.setTimeout( cb, 1000 / 60 );\n                //     };\n    \n                // // fix: Uncaught TypeError: Illegal invocation\n                // return bindFn( next, window );\n            })(),\n    \n            /**\n             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。\n             * 将用来将非数组对象转化成数组对象。\n             * @grammar Base.slice( target, start[, end] ) => Array\n             * @method slice\n             * @example\n             * function doSomthing() {\n             *     var args = Base.slice( arguments, 1 );\n             *     console.log( args );\n             * }\n             *\n             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array [\"arg2\", \"arg3\"]\n             */\n            slice: uncurryThis( [].slice ),\n    \n            /**\n             * 生成唯一的ID\n             * @method guid\n             * @grammar Base.guid() => String\n             * @grammar Base.guid( prefx ) => String\n             */\n            guid: (function() {\n                var counter = 0;\n    \n                return function( prefix ) {\n                    var guid = (+new Date()).toString( 32 ),\n                        i = 0;\n    \n                    for ( ; i < 5; i++ ) {\n                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );\n                    }\n    \n                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );\n                };\n            })(),\n    \n            /**\n             * 格式化文件大小, 输出成带单位的字符串\n             * @method formatSize\n             * @grammar Base.formatSize( size ) => String\n             * @grammar Base.formatSize( size, pointLength ) => String\n             * @grammar Base.formatSize( size, pointLength, units ) => String\n             * @param {Number} size 文件大小\n             * @param {Number} [pointLength=2] 精确到的小数点数。\n             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节，到千字节，一直往上指定。如果单位数组里面只指定了到了K(千字节)，同时文件大小大于M, 此方法的输出将还是显示成多少K.\n             * @example\n             * console.log( Base.formatSize( 100 ) );    // => 100B\n             * console.log( Base.formatSize( 1024 ) );    // => 1.00K\n             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K\n             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M\n             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G\n             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB\n             */\n            formatSize: function( size, pointLength, units ) {\n                var unit;\n    \n                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];\n    \n                while ( (unit = units.shift()) && size > 1024 ) {\n                    size = size / 1024;\n                }\n    \n                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +\n                        unit;\n            }\n        };\n    });\n    /**\n     * 事件处理类，可以独立使用，也可以扩展给对象使用。\n     * @fileOverview Mediator\n     */\n    define('mediator',[\n        'base'\n    ], function( Base ) {\n        var $ = Base.$,\n            slice = [].slice,\n            separator = /\\s+/,\n            protos;\n    \n        // 根据条件过滤出事件handlers.\n        function findHandlers( arr, name, callback, context ) {\n            return $.grep( arr, function( handler ) {\n                return handler &&\n                        (!name || handler.e === name) &&\n                        (!callback || handler.cb === callback ||\n                        handler.cb._cb === callback) &&\n                        (!context || handler.ctx === context);\n            });\n        }\n    \n        function eachEvent( events, callback, iterator ) {\n            // 不支持对象，只支持多个event用空格隔开\n            $.each( (events || '').split( separator ), function( _, key ) {\n                iterator( key, callback );\n            });\n        }\n    \n        function triggerHanders( events, args ) {\n            var stoped = false,\n                i = -1,\n                len = events.length,\n                handler;\n    \n            while ( ++i < len ) {\n                handler = events[ i ];\n    \n                if ( handler.cb.apply( handler.ctx2, args ) === false ) {\n                    stoped = true;\n                    break;\n                }\n            }\n    \n            return !stoped;\n        }\n    \n        protos = {\n    \n            /**\n             * 绑定事件。\n             *\n             * `callback`方法在执行时，arguments将会来源于trigger的时候携带的参数。如\n             * ```javascript\n             * var obj = {};\n             *\n             * // 使得obj有事件行为\n             * Mediator.installTo( obj );\n             *\n             * obj.on( 'testa', function( arg1, arg2 ) {\n             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'\n             * });\n             *\n             * obj.trigger( 'testa', 'arg1', 'arg2' );\n             * ```\n             *\n             * 如果`callback`中，某一个方法`return false`了，则后续的其他`callback`都不会被执行到。\n             * 切会影响到`trigger`方法的返回值，为`false`。\n             *\n             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处，\n             * 就是第一个参数为`type`，记录当前是什么事件在触发。此类`callback`的优先级比脚低，会再正常`callback`执行完后触发。\n             * ```javascript\n             * obj.on( 'all', function( type, arg1, arg2 ) {\n             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'\n             * });\n             * ```\n             *\n             * @method on\n             * @grammar on( name, callback[, context] ) => self\n             * @param  {String}   name     事件名，支持多个事件用空格隔开\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             * @class Mediator\n             */\n            on: function( name, callback, context ) {\n                var me = this,\n                    set;\n    \n                if ( !callback ) {\n                    return this;\n                }\n    \n                set = this._events || (this._events = []);\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var handler = { e: name };\n    \n                    handler.cb = callback;\n                    handler.ctx = context;\n                    handler.ctx2 = context || me;\n                    handler.id = set.length;\n    \n                    set.push( handler );\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 绑定事件，且当handler执行完后，自动解除绑定。\n             * @method once\n             * @grammar once( name, callback[, context] ) => self\n             * @param  {String}   name     事件名\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            once: function( name, callback, context ) {\n                var me = this;\n    \n                if ( !callback ) {\n                    return me;\n                }\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var once = function() {\n                            me.off( name, once );\n                            return callback.apply( context || me, arguments );\n                        };\n    \n                    once._cb = callback;\n                    me.on( name, once, context );\n                });\n    \n                return me;\n            },\n    \n            /**\n             * 解除事件绑定\n             * @method off\n             * @grammar off( [name[, callback[, context] ] ] ) => self\n             * @param  {String}   [name]     事件名\n             * @param  {Function} [callback] 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            off: function( name, cb, ctx ) {\n                var events = this._events;\n    \n                if ( !events ) {\n                    return this;\n                }\n    \n                if ( !name && !cb && !ctx ) {\n                    this._events = [];\n                    return this;\n                }\n    \n                eachEvent( name, cb, function( name, cb ) {\n                    $.each( findHandlers( events, name, cb, ctx ), function() {\n                        delete events[ this.id ];\n                    });\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 触发事件\n             * @method trigger\n             * @grammar trigger( name[, args...] ) => self\n             * @param  {String}   type     事件名\n             * @param  {*} [...] 任意参数\n             * @return {Boolean} 如果handler中return false了，则返回false, 否则返回true\n             */\n            trigger: function( type ) {\n                var args, events, allEvents;\n    \n                if ( !this._events || !type ) {\n                    return this;\n                }\n    \n                args = slice.call( arguments, 1 );\n                events = findHandlers( this._events, type );\n                allEvents = findHandlers( this._events, 'all' );\n    \n                return triggerHanders( events, args ) &&\n                        triggerHanders( allEvents, arguments );\n            }\n        };\n    \n        /**\n         * 中介者，它本身是个单例，但可以通过[installTo](#WebUploader:Mediator:installTo)方法，使任何对象具备事件行为。\n         * 主要目的是负责模块与模块之间的合作，降低耦合度。\n         *\n         * @class Mediator\n         */\n        return $.extend({\n    \n            /**\n             * 可以通过这个接口，使任何对象具备事件功能。\n             * @method installTo\n             * @param  {Object} obj 需要具备事件行为的对象。\n             * @return {Object} 返回obj.\n             */\n            installTo: function( obj ) {\n                return $.extend( obj, protos );\n            }\n    \n        }, protos );\n    });\n    /**\n     * @fileOverview Uploader上传类\n     */\n    define('uploader',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$;\n    \n        /**\n         * 上传入口类。\n         * @class Uploader\n         * @constructor\n         * @grammar new Uploader( opts ) => Uploader\n         * @example\n         * var uploader = WebUploader.Uploader({\n         *     swf: 'path_of_swf/Uploader.swf',\n         *\n         *     // 开起分片上传。\n         *     chunked: true\n         * });\n         */\n        function Uploader( opts ) {\n            this.options = $.extend( true, {}, Uploader.options, opts );\n            this._init( this.options );\n        }\n    \n        // default Options\n        // widgets中有相应扩展\n        Uploader.options = {};\n        Mediator.installTo( Uploader.prototype );\n    \n        // 批量添加纯命令式方法。\n        $.each({\n            upload: 'start-upload',\n            stop: 'stop-upload',\n            getFile: 'get-file',\n            getFiles: 'get-files',\n            addFile: 'add-file',\n            addFiles: 'add-file',\n            sort: 'sort-files',\n            removeFile: 'remove-file',\n            skipFile: 'skip-file',\n            retry: 'retry',\n            isInProgress: 'is-in-progress',\n            makeThumb: 'make-thumb',\n            getDimension: 'get-dimension',\n            addButton: 'add-btn',\n            getRuntimeType: 'get-runtime-type',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable',\n            reset: 'reset'\n        }, function( fn, command ) {\n            Uploader.prototype[ fn ] = function() {\n                return this.request( command, arguments );\n            };\n        });\n    \n        $.extend( Uploader.prototype, {\n            state: 'pending',\n    \n            _init: function( opts ) {\n                var me = this;\n    \n                me.request( 'init', opts, function() {\n                    me.state = 'ready';\n                    me.trigger('ready');\n                });\n            },\n    \n            /**\n             * 获取或者设置Uploader配置项。\n             * @method option\n             * @grammar option( key ) => *\n             * @grammar option( key, val ) => self\n             * @example\n             *\n             * // 初始状态图片上传前不会压缩\n             * var uploader = new WebUploader.Uploader({\n             *     resize: null;\n             * });\n             *\n             * // 修改后图片上传前，尝试将图片压缩到1600 * 1600\n             * uploader.options( 'resize', {\n             *     width: 1600,\n             *     height: 1600\n             * });\n             */\n            option: function( key, val ) {\n                var opts = this.options;\n    \n                // setter\n                if ( arguments.length > 1 ) {\n    \n                    if ( $.isPlainObject( val ) &&\n                            $.isPlainObject( opts[ key ] ) ) {\n                        $.extend( opts[ key ], val );\n                    } else {\n                        opts[ key ] = val;\n                    }\n    \n                } else {    // getter\n                    return key ? opts[ key ] : opts;\n                }\n            },\n    \n            /**\n             * 获取文件统计信息。返回一个包含一下信息的对象。\n             * * `successNum` 上传成功的文件数\n             * * `uploadFailNum` 上传失败的文件数\n             * * `cancelNum` 被删除的文件数\n             * * `invalidNum` 无效的文件数\n             * * `queueNum` 还在队列中的文件数\n             * @method getStats\n             * @grammar getStats() => Object\n             */\n            getStats: function() {\n                // return this._mgr.getStats.apply( this._mgr, arguments );\n                var stats = this.request('get-stats');\n    \n                return {\n                    successNum: stats.numOfSuccess,\n    \n                    // who care?\n                    // queueFailNum: 0,\n                    cancelNum: stats.numOfCancel,\n                    invalidNum: stats.numOfInvalid,\n                    uploadFailNum: stats.numOfUploadFailed,\n                    queueNum: stats.numOfQueue\n                };\n            },\n    \n            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器\n            trigger: function( type/*, args...*/ ) {\n                var args = [].slice.call( arguments, 1 ),\n                    opts = this.options,\n                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +\n                        type.substring( 1 );\n    \n                if (\n                        // 调用通过on方法注册的handler.\n                        Mediator.trigger.apply( this, arguments ) === false ||\n    \n                        // 调用opts.onEvent\n                        $.isFunction( opts[ name ] ) &&\n                        opts[ name ].apply( this, args ) === false ||\n    \n                        // 调用this.onEvent\n                        $.isFunction( this[ name ] ) &&\n                        this[ name ].apply( this, args ) === false ||\n    \n                        // 广播所有uploader的事件。\n                        Mediator.trigger.apply( Mediator,\n                        [ this, type ].concat( args ) ) === false ) {\n    \n                    return false;\n                }\n    \n                return true;\n            },\n    \n            // widgets/widget.js将补充此方法的详细文档。\n            request: Base.noop\n        });\n    \n        /**\n         * 创建Uploader实例，等同于new Uploader( opts );\n         * @method create\n         * @class Base\n         * @static\n         * @grammar Base.create( opts ) => Uploader\n         */\n        Base.create = Uploader.create = function( opts ) {\n            return new Uploader( opts );\n        };\n    \n        // 暴露Uploader，可以通过它来扩展业务逻辑。\n        Base.Uploader = Uploader;\n    \n        return Uploader;\n    });\n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/runtime',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            factories = {},\n    \n            // 获取对象的第一个key\n            getFirstKey = function( obj ) {\n                for ( var key in obj ) {\n                    if ( obj.hasOwnProperty( key ) ) {\n                        return key;\n                    }\n                }\n                return null;\n            };\n    \n        // 接口类。\n        function Runtime( options ) {\n            this.options = $.extend({\n                container: document.body\n            }, options );\n            this.uid = Base.guid('rt_');\n        }\n    \n        $.extend( Runtime.prototype, {\n    \n            getContainer: function() {\n                var opts = this.options,\n                    parent, container;\n    \n                if ( this._container ) {\n                    return this._container;\n                }\n    \n                parent = $( opts.container || document.body );\n                container = $( document.createElement('div') );\n    \n                container.attr( 'id', 'rt_' + this.uid );\n                container.css({\n                    position: 'absolute',\n                    top: '0px',\n                    left: '0px',\n                    width: '1px',\n                    height: '1px',\n                    overflow: 'hidden'\n                });\n    \n                parent.append( container );\n                parent.addClass('webuploader-container');\n                this._container = container;\n                return container;\n            },\n    \n            init: Base.noop,\n            exec: Base.noop,\n    \n            destroy: function() {\n                if ( this._container ) {\n                    this._container.parentNode.removeChild( this.__container );\n                }\n    \n                this.off();\n            }\n        });\n    \n        Runtime.orders = 'html5,flash';\n    \n    \n        /**\n         * 添加Runtime实现。\n         * @param {String} type    类型\n         * @param {Runtime} factory 具体Runtime实现。\n         */\n        Runtime.addRuntime = function( type, factory ) {\n            factories[ type ] = factory;\n        };\n    \n        Runtime.hasRuntime = function( type ) {\n            return !!(type ? factories[ type ] : getFirstKey( factories ));\n        };\n    \n        Runtime.create = function( opts, orders ) {\n            var type, runtime;\n    \n            orders = orders || Runtime.orders;\n            $.each( orders.split( /\\s*,\\s*/g ), function() {\n                if ( factories[ this ] ) {\n                    type = this;\n                    return false;\n                }\n            });\n    \n            type = type || getFirstKey( factories );\n    \n            if ( !type ) {\n                throw new Error('Runtime Error');\n            }\n    \n            runtime = new factories[ type ]( opts );\n            return runtime;\n        };\n    \n        Mediator.installTo( Runtime.prototype );\n        return Runtime;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/client',[\n        'base',\n        'mediator',\n        'runtime/runtime'\n    ], function( Base, Mediator, Runtime ) {\n    \n        var cache;\n    \n        cache = (function() {\n            var obj = {};\n    \n            return {\n                add: function( runtime ) {\n                    obj[ runtime.uid ] = runtime;\n                },\n    \n                get: function( ruid, standalone ) {\n                    var i;\n    \n                    if ( ruid ) {\n                        return obj[ ruid ];\n                    }\n    \n                    for ( i in obj ) {\n                        // 有些类型不能重用，比如filepicker.\n                        if ( standalone && obj[ i ].__standalone ) {\n                            continue;\n                        }\n    \n                        return obj[ i ];\n                    }\n    \n                    return null;\n                },\n    \n                remove: function( runtime ) {\n                    delete obj[ runtime.uid ];\n                }\n            };\n        })();\n    \n        function RuntimeClient( component, standalone ) {\n            var deferred = Base.Deferred(),\n                runtime;\n    \n            this.uid = Base.guid('client_');\n    \n            // 允许runtime没有初始化之前，注册一些方法在初始化后执行。\n            this.runtimeReady = function( cb ) {\n                return deferred.done( cb );\n            };\n    \n            this.connectRuntime = function( opts, cb ) {\n    \n                // already connected.\n                if ( runtime ) {\n                    throw new Error('already connected!');\n                }\n    \n                deferred.done( cb );\n    \n                if ( typeof opts === 'string' && cache.get( opts ) ) {\n                    runtime = cache.get( opts );\n                }\n    \n                // 像filePicker只能独立存在，不能公用。\n                runtime = runtime || cache.get( null, standalone );\n    \n                // 需要创建\n                if ( !runtime ) {\n                    runtime = Runtime.create( opts, opts.runtimeOrder );\n                    runtime.__promise = deferred.promise();\n                    runtime.once( 'ready', deferred.resolve );\n                    runtime.init();\n                    cache.add( runtime );\n                    runtime.__client = 1;\n                } else {\n                    // 来自cache\n                    Base.$.extend( runtime.options, opts );\n                    runtime.__promise.then( deferred.resolve );\n                    runtime.__client++;\n                }\n    \n                standalone && (runtime.__standalone = standalone);\n                return runtime;\n            };\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.disconnectRuntime = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                runtime.__client--;\n    \n                if ( runtime.__client <= 0 ) {\n                    cache.remove( runtime );\n                    delete runtime.__promise;\n                    runtime.destroy();\n                }\n    \n                runtime = null;\n            };\n    \n            this.exec = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                var args = Base.slice( arguments );\n                component && args.unshift( component );\n    \n                return runtime.exec.apply( this, args );\n            };\n    \n            this.getRuid = function() {\n                return runtime && runtime.uid;\n            };\n    \n            this.destroy = (function( destroy ) {\n                return function() {\n                    destroy && destroy.apply( this, arguments );\n                    this.trigger('destroy');\n                    this.off();\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                };\n            })( this.destroy );\n        }\n    \n        Mediator.installTo( RuntimeClient.prototype );\n        return RuntimeClient;\n    });\n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/dnd',[\n        'base',\n        'mediator',\n        'runtime/client'\n    ], function( Base, Mediator, RuntimeClent ) {\n    \n        var $ = Base.$;\n    \n        function DragAndDrop( opts ) {\n            opts = this.options = $.extend({}, DragAndDrop.options, opts );\n    \n            opts.container = $( opts.container );\n    \n            if ( !opts.container.length ) {\n                return;\n            }\n    \n            RuntimeClent.call( this, 'DragAndDrop' );\n        }\n    \n        DragAndDrop.options = {\n            accept: null,\n            disableGlobalDnd: false\n        };\n    \n        Base.inherits( RuntimeClent, {\n            constructor: DragAndDrop,\n    \n            init: function() {\n                var me = this;\n    \n                me.connectRuntime( me.options, function() {\n                    me.exec('init');\n                    me.trigger('ready');\n                });\n            },\n    \n            destroy: function() {\n                this.disconnectRuntime();\n            }\n        });\n    \n        Mediator.installTo( DragAndDrop.prototype );\n    \n        return DragAndDrop;\n    });\n    /**\n     * @fileOverview 组件基类。\n     */\n    define('widgets/widget',[\n        'base',\n        'uploader'\n    ], function( Base, Uploader ) {\n    \n        var $ = Base.$,\n            _init = Uploader.prototype._init,\n            IGNORE = {},\n            widgetClass = [];\n    \n        function isArrayLike( obj ) {\n            if ( !obj ) {\n                return false;\n            }\n    \n            var length = obj.length,\n                type = $.type( obj );\n    \n            if ( obj.nodeType === 1 && length ) {\n                return true;\n            }\n    \n            return type === 'array' || type !== 'function' && type !== 'string' &&\n                    (length === 0 || typeof length === 'number' && length > 0 &&\n                    (length - 1) in obj);\n        }\n    \n        function Widget( uploader ) {\n            this.owner = uploader;\n            this.options = uploader.options;\n        }\n    \n        $.extend( Widget.prototype, {\n    \n            init: Base.noop,\n    \n            // 类Backbone的事件监听声明，监听uploader实例上的事件\n            // widget直接无法监听事件，事件只能通过uploader来传递\n            invoke: function( apiName, args ) {\n    \n                /*\n                    {\n                        'make-thumb': 'makeThumb'\n                    }\n                 */\n                var map = this.responseMap;\n    \n                // 如果无API响应声明则忽略\n                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||\n                        !$.isFunction( this[ map[ apiName ] ] ) ) {\n    \n                    return IGNORE;\n                }\n    \n                return this[ map[ apiName ] ].apply( this, args );\n    \n            },\n    \n            /**\n             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。\n             * @method request\n             * @grammar request( command, args ) => * | Promise\n             * @grammar request( command, args, callback ) => Promise\n             * @for  Uploader\n             */\n            request: function() {\n                return this.owner.request.apply( this.owner, arguments );\n            }\n        });\n    \n        // 扩展Uploader.\n        $.extend( Uploader.prototype, {\n    \n            // 覆写_init用来初始化widgets\n            _init: function() {\n                var me = this,\n                    widgets = me._widgets = [];\n    \n                $.each( widgetClass, function( _, klass ) {\n                    widgets.push( new klass( me ) );\n                });\n    \n                return _init.apply( me, arguments );\n            },\n    \n            request: function( apiName, args, callback ) {\n                var i = 0,\n                    widgets = this._widgets,\n                    len = widgets.length,\n                    rlts = [],\n                    dfds = [],\n                    widget, rlt, promise, key;\n    \n                args = isArrayLike( args ) ? args : [ args ];\n    \n                for ( ; i < len; i++ ) {\n                    widget = widgets[ i ];\n                    rlt = widget.invoke( apiName, args );\n    \n                    if ( rlt !== IGNORE ) {\n    \n                        // Deferred对象\n                        if ( Base.isPromise( rlt ) ) {\n                            dfds.push( rlt );\n                        } else {\n                            rlts.push( rlt );\n                        }\n                    }\n                }\n    \n                // 如果有callback，则用异步方式。\n                if ( callback || dfds.length ) {\n                    promise = Base.when.apply( Base, dfds );\n                    key = promise.pipe ? 'pipe' : 'then';\n    \n                    // 很重要不能删除。删除了会死循环。\n                    // 保证执行顺序。让callback总是在下一个tick中执行。\n                    return promise[ key ](function() {\n                                var deferred = Base.Deferred(),\n                                    args = arguments;\n    \n                                setTimeout(function() {\n                                    deferred.resolve.apply( deferred, args );\n                                }, 1 );\n    \n                                return deferred.promise();\n                            })[ key ]( callback || Base.noop );\n                } else {\n                    return rlts[ 0 ];\n                }\n            }\n        });\n    \n        /**\n         * 添加组件\n         * @param  {object} widgetProto 组件原型，构造函数通过constructor属性定义\n         * @param  {object} responseMap API名称与函数实现的映射\n         * @example\n         *     Uploader.register( {\n         *         init: function( options ) {},\n         *         makeThumb: function() {}\n         *     }, {\n         *         'make-thumb': 'makeThumb'\n         *     } );\n         */\n        Uploader.register = Widget.register = function( responseMap, widgetProto ) {\n            var map = { init: 'init' },\n                klass;\n    \n            if ( arguments.length === 1 ) {\n                widgetProto = responseMap;\n                widgetProto.responseMap = map;\n            } else {\n                widgetProto.responseMap = $.extend( map, responseMap );\n            }\n    \n            klass = Base.inherits( Widget, widgetProto );\n            widgetClass.push( klass );\n    \n            return klass;\n        };\n    \n        return Widget;\n    });\n    /**\n     * @fileOverview DragAndDrop Widget。\n     */\n    define('widgets/filednd',[\n        'base',\n        'uploader',\n        'lib/dnd',\n        'widgets/widget'\n    ], function( Base, Uploader, Dnd ) {\n        var $ = Base.$;\n    \n        Uploader.options.dnd = '';\n    \n        /**\n         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器，如果不指定，则不启动。\n         * @namespace options\n         * @for Uploader\n         */\n    \n        /**\n         * @event dndAccept\n         * @param {DataTransferItemList} items DataTransferItem\n         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API，且只能通过 mime-type 验证。\n         * @for  Uploader\n         */\n        return Uploader.register({\n            init: function( opts ) {\n    \n                if ( !opts.dnd ||\n                        this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                var me = this,\n                    deferred = Base.Deferred(),\n                    options = $.extend({}, {\n                        disableGlobalDnd: opts.disableGlobalDnd,\n                        container: opts.dnd,\n                        accept: opts.accept\n                    }),\n                    dnd;\n    \n                dnd = new Dnd( options );\n    \n                dnd.once( 'ready', deferred.resolve );\n                dnd.on( 'drop', function( files ) {\n                    me.request( 'add-file', [ files ]);\n                });\n    \n                // 检测文件是否全部允许添加。\n                dnd.on( 'accept', function( items ) {\n                    return me.owner.trigger( 'dndAccept', items );\n                });\n    \n                dnd.init();\n    \n                return deferred.promise();\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/filepaste',[\n        'base',\n        'mediator',\n        'runtime/client'\n    ], function( Base, Mediator, RuntimeClent ) {\n    \n        var $ = Base.$;\n    \n        function FilePaste( opts ) {\n            opts = this.options = $.extend({}, opts );\n            opts.container = $( opts.container || document.body );\n            RuntimeClent.call( this, 'FilePaste' );\n        }\n    \n        Base.inherits( RuntimeClent, {\n            constructor: FilePaste,\n    \n            init: function() {\n                var me = this;\n    \n                me.connectRuntime( me.options, function() {\n                    me.exec('init');\n                    me.trigger('ready');\n                });\n            },\n    \n            destroy: function() {\n                this.exec('destroy');\n                this.disconnectRuntime();\n                this.off();\n            }\n        });\n    \n        Mediator.installTo( FilePaste.prototype );\n    \n        return FilePaste;\n    });\n    /**\n     * @fileOverview 组件基类。\n     */\n    define('widgets/filepaste',[\n        'base',\n        'uploader',\n        'lib/filepaste',\n        'widgets/widget'\n    ], function( Base, Uploader, FilePaste ) {\n        var $ = Base.$;\n    \n        /**\n         * @property {Selector} [paste=undefined]  指定监听paste事件的容器，如果不指定，不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.\n         * @namespace options\n         * @for Uploader\n         */\n        return Uploader.register({\n            init: function( opts ) {\n    \n                if ( !opts.paste ||\n                        this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                var me = this,\n                    deferred = Base.Deferred(),\n                    options = $.extend({}, {\n                        container: opts.paste,\n                        accept: opts.accept\n                    }),\n                    paste;\n    \n                paste = new FilePaste( options );\n    \n                paste.once( 'ready', deferred.resolve );\n                paste.on( 'paste', function( files ) {\n                    me.owner.request( 'add-file', [ files ]);\n                });\n                paste.init();\n    \n                return deferred.promise();\n            }\n        });\n    });\n    /**\n     * @fileOverview Blob\n     */\n    define('lib/blob',[\n        'base',\n        'runtime/client'\n    ], function( Base, RuntimeClient ) {\n    \n        function Blob( ruid, source ) {\n            var me = this;\n    \n            me.source = source;\n            me.ruid = ruid;\n    \n            RuntimeClient.call( me, 'Blob' );\n    \n            this.uid = source.uid || this.uid;\n            this.type = source.type || '';\n            this.size = source.size || 0;\n    \n            if ( ruid ) {\n                me.connectRuntime( ruid );\n            }\n        }\n    \n        Base.inherits( RuntimeClient, {\n            constructor: Blob,\n    \n            slice: function( start, end ) {\n                return this.exec( 'slice', start, end );\n            },\n    \n            getSource: function() {\n                return this.source;\n            }\n        });\n    \n        return Blob;\n    });\n    /**\n     * 为了统一化Flash的File和HTML5的File而存在。\n     * 以至于要调用Flash里面的File，也可以像调用HTML5版本的File一下。\n     * @fileOverview File\n     */\n    define('lib/file',[\n        'base',\n        'lib/blob'\n    ], function( Base, Blob ) {\n    \n        var uid = 1,\n            rExt = /\\.([^.]+)$/;\n    \n        function File( ruid, file ) {\n            var ext;\n    \n            Blob.apply( this, arguments );\n            this.name = file.name || ('untitled' + uid++);\n            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';\n    \n            // todo 支持其他类型文件的转换。\n    \n            // 如果有mimetype, 但是文件名里面没有找出后缀规律\n            if ( !ext && this.type ) {\n                ext = /\\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?\n                        RegExp.$1.toLowerCase() : '';\n                this.name += '.' + ext;\n            }\n    \n            // 如果没有指定mimetype, 但是知道文件后缀。\n            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {\n                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);\n            }\n    \n            this.ext = ext;\n            this.lastModifiedDate = file.lastModifiedDate ||\n                    (new Date()).toLocaleString();\n        }\n    \n        return Base.inherits( Blob, File );\n    });\n    \n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/filepicker',[\n        'base',\n        'runtime/client',\n        'lib/file'\n    ], function( Base, RuntimeClent, File ) {\n    \n        var $ = Base.$;\n    \n        function FilePicker( opts ) {\n            opts = this.options = $.extend({}, FilePicker.options, opts );\n    \n            opts.container = $( opts.id );\n    \n            if ( !opts.container.length ) {\n                throw new Error('按钮指定错误');\n            }\n    \n            opts.innerHTML = opts.innerHTML || opts.label ||\n                    opts.container.html() || '';\n    \n            opts.button = $( opts.button || document.createElement('div') );\n            opts.button.html( opts.innerHTML );\n            opts.container.html( opts.button );\n    \n            RuntimeClent.call( this, 'FilePicker', true );\n        }\n    \n        FilePicker.options = {\n            button: null,\n            container: null,\n            label: null,\n            innerHTML: null,\n            multiple: true,\n            accept: null,\n            name: 'file'\n        };\n    \n        Base.inherits( RuntimeClent, {\n            constructor: FilePicker,\n    \n            init: function() {\n                var me = this,\n                    opts = me.options,\n                    button = opts.button;\n    \n                button.addClass('webuploader-pick');\n    \n                me.on( 'all', function( type ) {\n                    var files;\n    \n                    switch ( type ) {\n                        case 'mouseenter':\n                            button.addClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'mouseleave':\n                            button.removeClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'change':\n                            files = me.exec('getFiles');\n                            me.trigger( 'select', $.map( files, function( file ) {\n                                file = new File( me.getRuid(), file );\n    \n                                // 记录来源。\n                                file._refer = opts.container;\n                                return file;\n                            }), opts.container );\n                            break;\n                    }\n                });\n    \n                me.connectRuntime( opts, function() {\n                    me.refresh();\n                    me.exec( 'init', opts );\n                    me.trigger('ready');\n                });\n    \n                $( window ).on( 'resize', function() {\n                    me.refresh();\n                });\n            },\n    \n            refresh: function() {\n                var shimContainer = this.getRuntime().getContainer(),\n                    button = this.options.button,\n                    width = button.outerWidth ?\n                            button.outerWidth() : button.width(),\n    \n                    height = button.outerHeight ?\n                            button.outerHeight() : button.height(),\n    \n                    pos = button.offset();\n    \n                width && height && shimContainer.css({\n                    bottom: 'auto',\n                    right: 'auto',\n                    width: width + 'px',\n                    height: height + 'px'\n                }).offset( pos );\n            },\n    \n            enable: function() {\n                var btn = this.options.button;\n    \n                btn.removeClass('webuploader-pick-disable');\n                this.refresh();\n            },\n    \n            disable: function() {\n                var btn = this.options.button;\n    \n                this.getRuntime().getContainer().css({\n                    top: '-99999px'\n                });\n    \n                btn.addClass('webuploader-pick-disable');\n            },\n    \n            destroy: function() {\n                if ( this.runtime ) {\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                }\n            }\n        });\n    \n        return FilePicker;\n    });\n    \n    /**\n     * @fileOverview 文件选择相关\n     */\n    define('widgets/filepicker',[\n        'base',\n        'uploader',\n        'lib/filepicker',\n        'widgets/widget'\n    ], function( Base, Uploader, FilePicker ) {\n        var $ = Base.$;\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Selector | Object} [pick=undefined]\n             * @namespace options\n             * @for Uploader\n             * @description 指定选择文件的按钮容器，不指定则不创建按钮。\n             *\n             * * `id` {Seletor} 指定选择文件的按钮容器，不指定则不创建按钮。\n             * * `label` {String} 请采用 `innerHTML` 代替\n             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。\n             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。\n             */\n            pick: null,\n    \n            /**\n             * @property {Arroy} [accept=null]\n             * @namespace options\n             * @for Uploader\n             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表，所以这里需要分开指定。\n             *\n             * * `title` {String} 文字描述\n             * * `extensions` {String} 允许的文件后缀，不带点，多个用逗号分割。\n             * * `mimeTypes` {String} 多个用逗号分割。\n             *\n             * 如：\n             *\n             * ```\n             * {\n             *     title: 'Images',\n             *     extensions: 'gif,jpg,jpeg,bmp,png',\n             *     mimeTypes: 'image/*'\n             * }\n             * ```\n             */\n            accept: null/*{\n                title: 'Images',\n                extensions: 'gif,jpg,jpeg,bmp,png',\n                mimeTypes: 'image/*'\n            }*/\n        });\n    \n        return Uploader.register({\n            'add-btn': 'addButton',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable'\n        }, {\n    \n            init: function( opts ) {\n                this.pickers = [];\n                return opts.pick && this.addButton( opts.pick );\n            },\n    \n            refresh: function() {\n                $.each( this.pickers, function() {\n                    this.refresh();\n                });\n            },\n    \n            /**\n             * @method addButton\n             * @for Uploader\n             * @grammar addButton( pick ) => Promise\n             * @description\n             * 添加文件选择按钮，如果一个按钮不够，需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。\n             * @example\n             * uploader.addButton({\n             *     id: '#btnContainer',\n             *     innerHTML: '选择文件'\n             * });\n             */\n            addButton: function( pick ) {\n                var me = this,\n                    opts = me.options,\n                    accept = opts.accept,\n                    options, picker, deferred;\n    \n                if ( !pick ) {\n                    return;\n                }\n    \n                deferred = Base.Deferred();\n                $.isPlainObject( pick ) || (pick = {\n                    id: pick\n                });\n    \n                options = $.extend({}, pick, {\n                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,\n                    swf: opts.swf,\n                    runtimeOrder: opts.runtimeOrder\n                });\n    \n                picker = new FilePicker( options );\n    \n                picker.once( 'ready', deferred.resolve );\n                picker.on( 'select', function( files ) {\n                    me.owner.request( 'add-file', [ files ]);\n                });\n                picker.init();\n    \n                this.pickers.push( picker );\n    \n                return deferred.promise();\n            },\n    \n            disable: function() {\n                $.each( this.pickers, function() {\n                    this.disable();\n                });\n            },\n    \n            enable: function() {\n                $.each( this.pickers, function() {\n                    this.enable();\n                });\n            }\n        });\n    });\n    /**\n     * @fileOverview Image\n     */\n    define('lib/image',[\n        'base',\n        'runtime/client',\n        'lib/blob'\n    ], function( Base, RuntimeClient, Blob ) {\n        var $ = Base.$;\n    \n        // 构造器。\n        function Image( opts ) {\n            this.options = $.extend({}, Image.options, opts );\n            RuntimeClient.call( this, 'Image' );\n    \n            this.on( 'load', function() {\n                this._info = this.exec('info');\n                this._meta = this.exec('meta');\n            });\n        }\n    \n        // 默认选项。\n        Image.options = {\n    \n            // 默认的图片处理质量\n            quality: 90,\n    \n            // 是否裁剪\n            crop: false,\n    \n            // 是否保留头部信息\n            preserveHeaders: true,\n    \n            // 是否允许放大。\n            allowMagnify: true\n        };\n    \n        // 继承RuntimeClient.\n        Base.inherits( RuntimeClient, {\n            constructor: Image,\n    \n            info: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._info = val;\n                    return this;\n                }\n    \n                // getter\n                return this._info;\n            },\n    \n            meta: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._meta = val;\n                    return this;\n                }\n    \n                // getter\n                return this._meta;\n            },\n    \n            loadFromBlob: function( blob ) {\n                var me = this,\n                    ruid = blob.getRuid();\n    \n                this.connectRuntime( ruid, function() {\n                    me.exec( 'init', me.options );\n                    me.exec( 'loadFromBlob', blob );\n                });\n            },\n    \n            resize: function() {\n                var args = Base.slice( arguments );\n                return this.exec.apply( this, [ 'resize' ].concat( args ) );\n            },\n    \n            getAsDataUrl: function( type ) {\n                return this.exec( 'getAsDataUrl', type );\n            },\n    \n            getAsBlob: function( type ) {\n                var blob = this.exec( 'getAsBlob', type );\n    \n                return new Blob( this.getRuid(), blob );\n            }\n        });\n    \n        return Image;\n    });\n    /**\n     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片\n     */\n    define('widgets/image',[\n        'base',\n        'uploader',\n        'lib/image',\n        'widgets/widget'\n    ], function( Base, Uploader, Image ) {\n    \n        var $ = Base.$,\n            throttle;\n    \n        // 根据要处理的文件大小来节流，一次不能处理太多，会卡。\n        throttle = (function( max ) {\n            var occupied = 0,\n                waiting = [],\n                tick = function() {\n                    var item;\n    \n                    while ( waiting.length && occupied < max ) {\n                        item = waiting.shift();\n                        occupied += item[ 0 ];\n                        item[ 1 ]();\n                    }\n                };\n    \n            return function( emiter, size, cb ) {\n                waiting.push([ size, cb ]);\n                emiter.once( 'destroy', function() {\n                    occupied -= size;\n                    setTimeout( tick, 1 );\n                });\n                setTimeout( tick, 1 );\n            };\n        })( 5 * 1024 * 1024 );\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Object} [thumb]\n             * @namespace options\n             * @for Uploader\n             * @description 配置生成缩略图的选项。\n             *\n             * 默认为：\n             *\n             * ```javascript\n             * {\n             *     width: 110,\n             *     height: 110,\n             *\n             *     // 图片质量，只有type为`image/jpeg`的时候才有效。\n             *     quality: 70,\n             *\n             *     // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n             *     allowMagnify: true,\n             *\n             *     // 是否允许裁剪。\n             *     crop: true,\n             *\n             *     // 是否保留头部meta信息。\n             *     preserveHeaders: false,\n             *\n             *     // 为空的话则保留原有图片格式。\n             *     // 否则强制转换成指定的类型。\n             *     type: 'image/jpeg'\n             * }\n             * ```\n             */\n            thumb: {\n                width: 110,\n                height: 110,\n                quality: 70,\n                allowMagnify: true,\n                crop: true,\n                preserveHeaders: false,\n    \n                // 为空的话则保留原有图片格式。\n                // 否则强制转换成指定的类型。\n                // IE 8下面 base64 大小不能超过 32K 否则预览失败，而非 jpeg 编码的图片很可\n                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg\n                type: 'image/jpeg'\n            },\n    \n            /**\n             * @property {Object} [compress]\n             * @namespace options\n             * @for Uploader\n             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。\n             *\n             * 默认为：\n             *\n             * ```javascript\n             * {\n             *     width: 1600,\n             *     height: 1600,\n             *\n             *     // 图片质量，只有type为`image/jpeg`的时候才有效。\n             *     quality: 90,\n             *\n             *     // 是否允许放大，如果想要生成小图的时候不失真，此选项应该设置为false.\n             *     allowMagnify: false,\n             *\n             *     // 是否允许裁剪。\n             *     crop: false,\n             *\n             *     // 是否保留头部meta信息。\n             *     preserveHeaders: true\n             * }\n             * ```\n             */\n            compress: {\n                width: 1600,\n                height: 1600,\n                quality: 90,\n                allowMagnify: false,\n                crop: false,\n                preserveHeaders: true\n            }\n        });\n    \n        return Uploader.register({\n            'make-thumb': 'makeThumb',\n            'before-send-file': 'compressImage'\n        }, {\n    \n    \n            /**\n             * 生成缩略图，此过程为异步，所以需要传入`callback`。\n             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。\n             *\n             * `callback`中可以接收到两个参数。\n             * * 第一个为error，如果生成缩略图有错误，此error将为真。\n             * * 第二个为ret, 缩略图的Data URL值。\n             *\n             * **注意**\n             * Date URL在IE6/7中不支持，所以不用调用此方法了，直接显示一张暂不支持预览图片好了。\n             *\n             *\n             * @method makeThumb\n             * @grammar makeThumb( file, callback ) => undefined\n             * @grammar makeThumb( file, callback, width, height ) => undefined\n             * @for Uploader\n             * @example\n             *\n             * uploader.on( 'fileQueued', function( file ) {\n             *     var $li = ...;\n             *\n             *     uploader.makeThumb( file, function( error, ret ) {\n             *         if ( error ) {\n             *             $li.text('预览错误');\n             *         } else {\n             *             $li.append('<img alt=\"\" src=\"' + ret + '\" />');\n             *         }\n             *     });\n             *\n             * });\n             */\n            makeThumb: function( file, cb, width, height ) {\n                var opts, image;\n    \n                file = this.request( 'get-file', file );\n    \n                // 只预览图片格式。\n                if ( !file.type.match( /^image/ ) ) {\n                    cb( true );\n                    return;\n                }\n    \n                opts = $.extend({}, this.options.thumb );\n    \n                // 如果传入的是object.\n                if ( $.isPlainObject( width ) ) {\n                    opts = $.extend( opts, width );\n                    width = null;\n                }\n    \n                width = width || opts.width;\n                height = height || opts.height;\n    \n                image = new Image( opts );\n    \n                image.once( 'load', function() {\n                    file._info = file._info || image.info();\n                    file._meta = file._meta || image.meta();\n                    image.resize( width, height );\n                });\n    \n                image.once( 'complete', function() {\n                    cb( false, image.getAsDataUrl( opts.type ) );\n                    image.destroy();\n                });\n    \n                image.once( 'error', function() {\n                    cb( true );\n                    image.destroy();\n                });\n    \n                throttle( image, file.source.size, function() {\n                    file._info && image.info( file._info );\n                    file._meta && image.meta( file._meta );\n                    image.loadFromBlob( file.source );\n                });\n            },\n    \n            compressImage: function( file ) {\n                var opts = this.options.compress || this.options.resize,\n                    compressSize = opts && opts.compressSize || 300 * 1024,\n                    image, deferred;\n    \n                file = this.request( 'get-file', file );\n    \n                // 只预览图片格式。\n                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||\n                        file.size < compressSize ||\n                        file._compressed ) {\n                    return;\n                }\n    \n                opts = $.extend({}, opts );\n                deferred = Base.Deferred();\n    \n                image = new Image( opts );\n    \n                deferred.always(function() {\n                    image.destroy();\n                    image = null;\n                });\n                image.once( 'error', deferred.reject );\n                image.once( 'load', function() {\n                    file._info = file._info || image.info();\n                    file._meta = file._meta || image.meta();\n                    image.resize( opts.width, opts.height );\n                });\n    \n                image.once( 'complete', function() {\n                    var blob, size;\n    \n                    // 移动端 UC / qq 浏览器的无图模式下\n                    // ctx.getImageData 处理大图的时候会报 Exception\n                    // INDEX_SIZE_ERR: DOM Exception 1\n                    try {\n                        blob = image.getAsBlob( opts.type );\n    \n                        size = file.size;\n    \n                        // 如果压缩后，比原来还大则不用压缩后的。\n                        if ( blob.size < size ) {\n                            // file.source.destroy && file.source.destroy();\n                            file.source = blob;\n                            file.size = blob.size;\n    \n                            file.trigger( 'resize', blob.size, size );\n                        }\n    \n                        // 标记，避免重复压缩。\n                        file._compressed = true;\n                        deferred.resolve();\n                    } catch ( e ) {\n                        // 出错了直接继续，让其上传原始图片\n                        deferred.resolve();\n                    }\n                });\n    \n                file._info && image.info( file._info );\n                file._meta && image.meta( file._meta );\n    \n                image.loadFromBlob( file.source );\n                return deferred.promise();\n            }\n        });\n    });\n    /**\n     * @fileOverview 文件属性封装\n     */\n    define('file',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            idPrefix = 'WU_FILE_',\n            idSuffix = 0,\n            rExt = /\\.([^.]+)$/,\n            statusMap = {};\n    \n        function gid() {\n            return idPrefix + idSuffix++;\n        }\n    \n        /**\n         * 文件类\n         * @class File\n         * @constructor 构造函数\n         * @grammar new File( source ) => File\n         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。\n         */\n        function WUFile( source ) {\n    \n            /**\n             * 文件名，包括扩展名（后缀）\n             * @property name\n             * @type {string}\n             */\n            this.name = source.name || 'Untitled';\n    \n            /**\n             * 文件体积（字节）\n             * @property size\n             * @type {uint}\n             * @default 0\n             */\n            this.size = source.size || 0;\n    \n            /**\n             * 文件MIMETYPE类型，与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)\n             * @property type\n             * @type {string}\n             * @default 'application'\n             */\n            this.type = source.type || 'application';\n    \n            /**\n             * 文件最后修改日期\n             * @property lastModifiedDate\n             * @type {int}\n             * @default 当前时间戳\n             */\n            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);\n    \n            /**\n             * 文件ID，每个对象具有唯一ID，与文件名无关\n             * @property id\n             * @type {string}\n             */\n            this.id = gid();\n    \n            /**\n             * 文件扩展名，通过文件名获取，例如test.png的扩展名为png\n             * @property ext\n             * @type {string}\n             */\n            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';\n    \n    \n            /**\n             * 状态文字说明。在不同的status语境下有不同的用途。\n             * @property statusText\n             * @type {string}\n             */\n            this.statusText = '';\n    \n            // 存储文件状态，防止通过属性直接修改\n            statusMap[ this.id ] = WUFile.Status.INITED;\n    \n            this.source = source;\n            this.loaded = 0;\n    \n            this.on( 'error', function( msg ) {\n                this.setStatus( WUFile.Status.ERROR, msg );\n            });\n        }\n    \n        $.extend( WUFile.prototype, {\n    \n            /**\n             * 设置状态，状态变化时会触发`change`事件。\n             * @method setStatus\n             * @grammar setStatus( status[, statusText] );\n             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)\n             * @param {String} [statusText=''] 状态说明，常在error时使用，用http, abort,server等来标记是由于什么原因导致文件错误。\n             */\n            setStatus: function( status, text ) {\n    \n                var prevStatus = statusMap[ this.id ];\n    \n                typeof text !== 'undefined' && (this.statusText = text);\n    \n                if ( status !== prevStatus ) {\n                    statusMap[ this.id ] = status;\n                    /**\n                     * 文件状态变化\n                     * @event statuschange\n                     */\n                    this.trigger( 'statuschange', status, prevStatus );\n                }\n    \n            },\n    \n            /**\n             * 获取文件状态\n             * @return {File.Status}\n             * @example\n                     文件状态具体包括以下几种类型：\n                     {\n                         // 初始化\n                        INITED:     0,\n                        // 已入队列\n                        QUEUED:     1,\n                        // 正在上传\n                        PROGRESS:     2,\n                        // 上传出错\n                        ERROR:         3,\n                        // 上传成功\n                        COMPLETE:     4,\n                        // 上传取消\n                        CANCELLED:     5\n                    }\n             */\n            getStatus: function() {\n                return statusMap[ this.id ];\n            },\n    \n            /**\n             * 获取文件原始信息。\n             * @return {*}\n             */\n            getSource: function() {\n                return this.source;\n            },\n    \n            destory: function() {\n                delete statusMap[ this.id ];\n            }\n        });\n    \n        Mediator.installTo( WUFile.prototype );\n    \n        /**\n         * 文件状态值，具体包括以下几种类型：\n         * * `inited` 初始状态\n         * * `queued` 已经进入队列, 等待上传\n         * * `progress` 上传中\n         * * `complete` 上传完成。\n         * * `error` 上传出错，可重试\n         * * `interrupt` 上传中断，可续传。\n         * * `invalid` 文件不合格，不能重试上传。会自动从队列中移除。\n         * * `cancelled` 文件被移除。\n         * @property {Object} Status\n         * @namespace File\n         * @class File\n         * @static\n         */\n        WUFile.Status = {\n            INITED:     'inited',    // 初始状态\n            QUEUED:     'queued',    // 已经进入队列, 等待上传\n            PROGRESS:   'progress',    // 上传中\n            ERROR:      'error',    // 上传出错，可重试\n            COMPLETE:   'complete',    // 上传完成。\n            CANCELLED:  'cancelled',    // 上传取消。\n            INTERRUPT:  'interrupt',    // 上传中断，可续传。\n            INVALID:    'invalid'    // 文件不合格，不能重试上传。\n        };\n    \n        return WUFile;\n    });\n    \n    /**\n     * @fileOverview 文件队列\n     */\n    define('queue',[\n        'base',\n        'mediator',\n        'file'\n    ], function( Base, Mediator, WUFile ) {\n    \n        var $ = Base.$,\n            STATUS = WUFile.Status;\n    \n        /**\n         * 文件队列, 用来存储各个状态中的文件。\n         * @class Queue\n         * @extends Mediator\n         */\n        function Queue() {\n    \n            /**\n             * 统计文件数。\n             * * `numOfQueue` 队列中的文件数。\n             * * `numOfSuccess` 上传成功的文件数\n             * * `numOfCancel` 被移除的文件数\n             * * `numOfProgress` 正在上传中的文件数\n             * * `numOfUploadFailed` 上传错误的文件数。\n             * * `numOfInvalid` 无效的文件数。\n             * @property {Object} stats\n             */\n            this.stats = {\n                numOfQueue: 0,\n                numOfSuccess: 0,\n                numOfCancel: 0,\n                numOfProgress: 0,\n                numOfUploadFailed: 0,\n                numOfInvalid: 0\n            };\n    \n            // 上传队列，仅包括等待上传的文件\n            this._queue = [];\n    \n            // 存储所有文件\n            this._map = {};\n        }\n    \n        $.extend( Queue.prototype, {\n    \n            /**\n             * 将新文件加入对队列尾部\n             *\n             * @method append\n             * @param  {File} file   文件对象\n             */\n            append: function( file ) {\n                this._queue.push( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 将新文件加入对队列头部\n             *\n             * @method prepend\n             * @param  {File} file   文件对象\n             */\n            prepend: function( file ) {\n                this._queue.unshift( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 获取文件对象\n             *\n             * @method getFile\n             * @param  {String} fileId   文件ID\n             * @return {File}\n             */\n            getFile: function( fileId ) {\n                if ( typeof fileId !== 'string' ) {\n                    return fileId;\n                }\n                return this._map[ fileId ];\n            },\n    \n            /**\n             * 从队列中取出一个指定状态的文件。\n             * @grammar fetch( status ) => File\n             * @method fetch\n             * @param {String} status [文件状态值](#WebUploader:File:File.Status)\n             * @return {File} [File](#WebUploader:File)\n             */\n            fetch: function( status ) {\n                var len = this._queue.length,\n                    i, file;\n    \n                status = status || STATUS.QUEUED;\n    \n                for ( i = 0; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( status === file.getStatus() ) {\n                        return file;\n                    }\n                }\n    \n                return null;\n            },\n    \n            /**\n             * 对队列进行排序，能够控制文件上传顺序。\n             * @grammar sort( fn ) => undefined\n             * @method sort\n             * @param {Function} fn 排序方法\n             */\n            sort: function( fn ) {\n                if ( typeof fn === 'function' ) {\n                    this._queue.sort( fn );\n                }\n            },\n    \n            /**\n             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。\n             * @grammar getFiles( [status1[, status2 ...]] ) => Array\n             * @method getFiles\n             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)\n             */\n            getFiles: function() {\n                var sts = [].slice.call( arguments, 0 ),\n                    ret = [],\n                    i = 0,\n                    len = this._queue.length,\n                    file;\n    \n                for ( ; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {\n                        continue;\n                    }\n    \n                    ret.push( file );\n                }\n    \n                return ret;\n            },\n    \n            _fileAdded: function( file ) {\n                var me = this,\n                    existing = this._map[ file.id ];\n    \n                if ( !existing ) {\n                    this._map[ file.id ] = file;\n    \n                    file.on( 'statuschange', function( cur, pre ) {\n                        me._onFileStatusChange( cur, pre );\n                    });\n                }\n    \n                file.setStatus( STATUS.QUEUED );\n            },\n    \n            _onFileStatusChange: function( curStatus, preStatus ) {\n                var stats = this.stats;\n    \n                switch ( preStatus ) {\n                    case STATUS.PROGRESS:\n                        stats.numOfProgress--;\n                        break;\n    \n                    case STATUS.QUEUED:\n                        stats.numOfQueue --;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed--;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid--;\n                        break;\n                }\n    \n                switch ( curStatus ) {\n                    case STATUS.QUEUED:\n                        stats.numOfQueue++;\n                        break;\n    \n                    case STATUS.PROGRESS:\n                        stats.numOfProgress++;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed++;\n                        break;\n    \n                    case STATUS.COMPLETE:\n                        stats.numOfSuccess++;\n                        break;\n    \n                    case STATUS.CANCELLED:\n                        stats.numOfCancel++;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid++;\n                        break;\n                }\n            }\n    \n        });\n    \n        Mediator.installTo( Queue.prototype );\n    \n        return Queue;\n    });\n    /**\n     * @fileOverview 队列\n     */\n    define('widgets/queue',[\n        'base',\n        'uploader',\n        'queue',\n        'file',\n        'lib/file',\n        'runtime/client',\n        'widgets/widget'\n    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {\n    \n        var $ = Base.$,\n            rExt = /\\.\\w+$/,\n            Status = WUFile.Status;\n    \n        return Uploader.register({\n            'sort-files': 'sortFiles',\n            'add-file': 'addFiles',\n            'get-file': 'getFile',\n            'fetch-file': 'fetchFile',\n            'get-stats': 'getStats',\n            'get-files': 'getFiles',\n            'remove-file': 'removeFile',\n            'retry': 'retry',\n            'reset': 'reset',\n            'accept-file': 'acceptFile'\n        }, {\n    \n            init: function( opts ) {\n                var me = this,\n                    deferred, len, i, item, arr, accept, runtime;\n    \n                if ( $.isPlainObject( opts.accept ) ) {\n                    opts.accept = [ opts.accept ];\n                }\n    \n                // accept中的中生成匹配正则。\n                if ( opts.accept ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        item = opts.accept[ i ].extensions;\n                        item && arr.push( item );\n                    }\n    \n                    if ( arr.length ) {\n                        accept = '\\\\.' + arr.join(',')\n                                .replace( /,/g, '$|\\\\.' )\n                                .replace( /\\*/g, '.*' ) + '$';\n                    }\n    \n                    me.accept = new RegExp( accept, 'i' );\n                }\n    \n                me.queue = new Queue();\n                me.stats = me.queue.stats;\n    \n                // 如果当前不是html5运行时，那就算了。\n                // 不执行后续操作\n                if ( this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                // 创建一个 html5 运行时的 placeholder\n                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。\n                deferred = Base.Deferred();\n                runtime = new RuntimeClient('Placeholder');\n                runtime.connectRuntime({\n                    runtimeOrder: 'html5'\n                }, function() {\n                    me._ruid = runtime.getRuid();\n                    deferred.resolve();\n                });\n                return deferred.promise();\n            },\n    \n    \n            // 为了支持外部直接添加一个原生File对象。\n            _wrapFile: function( file ) {\n                if ( !(file instanceof WUFile) ) {\n    \n                    if ( !(file instanceof File) ) {\n                        if ( !this._ruid ) {\n                            throw new Error('Can\\'t add external files.');\n                        }\n                        file = new File( this._ruid, file );\n                    }\n    \n                    file = new WUFile( file );\n                }\n    \n                return file;\n            },\n    \n            // 判断文件是否可以被加入队列\n            acceptFile: function( file ) {\n                var invalid = !file || file.size < 6 || this.accept &&\n    \n                        // 如果名字中有后缀，才做后缀白名单处理。\n                        rExt.exec( file.name ) && !this.accept.test( file.name );\n    \n                return !invalid;\n            },\n    \n    \n            /**\n             * @event beforeFileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列之前触发，此事件的handler返回值为`false`，则此文件不会被添加进入队列。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event fileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列以后触发。\n             * @for  Uploader\n             */\n    \n            _addFile: function( file ) {\n                var me = this;\n    \n                file = me._wrapFile( file );\n    \n                // 不过类型判断允许不允许，先派送 `beforeFileQueued`\n                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {\n                    return;\n                }\n    \n                // 类型不匹配，则派送错误事件，并返回。\n                if ( !me.acceptFile( file ) ) {\n                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );\n                    return;\n                }\n    \n                me.queue.append( file );\n                me.owner.trigger( 'fileQueued', file );\n                return file;\n            },\n    \n            getFile: function( fileId ) {\n                return this.queue.getFile( fileId );\n            },\n    \n            /**\n             * @event filesQueued\n             * @param {File} files 数组，内容为原始File(lib/File）对象。\n             * @description 当一批文件添加进队列以后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method addFiles\n             * @grammar addFiles( file ) => undefined\n             * @grammar addFiles( [file1, file2 ...] ) => undefined\n             * @param {Array of File or File} [files] Files 对象 数组\n             * @description 添加文件到队列\n             * @for  Uploader\n             */\n            addFiles: function( files ) {\n                var me = this;\n    \n                if ( !files.length ) {\n                    files = [ files ];\n                }\n    \n                files = $.map( files, function( file ) {\n                    return me._addFile( file );\n                });\n    \n                me.owner.trigger( 'filesQueued', files );\n    \n                if ( me.options.auto ) {\n                    me.request('start-upload');\n                }\n            },\n    \n            getStats: function() {\n                return this.stats;\n            },\n    \n            /**\n             * @event fileDequeued\n             * @param {File} file File对象\n             * @description 当文件被移除队列后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method removeFile\n             * @grammar removeFile( file ) => undefined\n             * @grammar removeFile( id ) => undefined\n             * @param {File|id} file File对象或这File对象的id\n             * @description 移除某一文件。\n             * @for  Uploader\n             * @example\n             *\n             * $li.on('click', '.remove-this', function() {\n             *     uploader.removeFile( file );\n             * })\n             */\n            removeFile: function( file ) {\n                var me = this;\n    \n                file = file.id ? file : me.queue.getFile( file );\n    \n                file.setStatus( Status.CANCELLED );\n                me.owner.trigger( 'fileDequeued', file );\n            },\n    \n            /**\n             * @method getFiles\n             * @grammar getFiles() => Array\n             * @grammar getFiles( status1, status2, status... ) => Array\n             * @description 返回指定状态的文件集合，不传参数将返回所有状态的文件。\n             * @for  Uploader\n             * @example\n             * console.log( uploader.getFiles() );    // => all files\n             * console.log( uploader.getFiles('error') )    // => all error files.\n             */\n            getFiles: function() {\n                return this.queue.getFiles.apply( this.queue, arguments );\n            },\n    \n            fetchFile: function() {\n                return this.queue.fetch.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method retry\n             * @grammar retry() => undefined\n             * @grammar retry( file ) => undefined\n             * @description 重试上传，重试指定文件，或者从出错的文件开始重新上传。\n             * @for  Uploader\n             * @example\n             * function retry() {\n             *     uploader.retry();\n             * }\n             */\n            retry: function( file, noForceStart ) {\n                var me = this,\n                    files, i, len;\n    \n                if ( file ) {\n                    file = file.id ? file : me.queue.getFile( file );\n                    file.setStatus( Status.QUEUED );\n                    noForceStart || me.request('start-upload');\n                    return;\n                }\n    \n                files = me.queue.getFiles( Status.ERROR );\n                i = 0;\n                len = files.length;\n    \n                for ( ; i < len; i++ ) {\n                    file = files[ i ];\n                    file.setStatus( Status.QUEUED );\n                }\n    \n                me.request('start-upload');\n            },\n    \n            /**\n             * @method sort\n             * @grammar sort( fn ) => undefined\n             * @description 排序队列中的文件，在上传之前调整可以控制上传顺序。\n             * @for  Uploader\n             */\n            sortFiles: function() {\n                return this.queue.sort.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method reset\n             * @grammar reset() => undefined\n             * @description 重置uploader。目前只重置了队列。\n             * @for  Uploader\n             * @example\n             * uploader.reset();\n             */\n            reset: function() {\n                this.queue = new Queue();\n                this.stats = this.queue.stats;\n            }\n        });\n    \n    });\n    /**\n     * @fileOverview 添加获取Runtime相关信息的方法。\n     */\n    define('widgets/runtime',[\n        'uploader',\n        'runtime/runtime',\n        'widgets/widget'\n    ], function( Uploader, Runtime ) {\n    \n        Uploader.support = function() {\n            return Runtime.hasRuntime.apply( Runtime, arguments );\n        };\n    \n        return Uploader.register({\n            'predict-runtime-type': 'predictRuntmeType'\n        }, {\n    \n            init: function() {\n                if ( !this.predictRuntmeType() ) {\n                    throw Error('Runtime Error');\n                }\n            },\n    \n            /**\n             * 预测Uploader将采用哪个`Runtime`\n             * @grammar predictRuntmeType() => String\n             * @method predictRuntmeType\n             * @for  Uploader\n             */\n            predictRuntmeType: function() {\n                var orders = this.options.runtimeOrder || Runtime.orders,\n                    type = this.type,\n                    i, len;\n    \n                if ( !type ) {\n                    orders = orders.split( /\\s*,\\s*/g );\n    \n                    for ( i = 0, len = orders.length; i < len; i++ ) {\n                        if ( Runtime.hasRuntime( orders[ i ] ) ) {\n                            this.type = type = orders[ i ];\n                            break;\n                        }\n                    }\n                }\n    \n                return type;\n            }\n        });\n    });\n    /**\n     * @fileOverview Transport\n     */\n    define('lib/transport',[\n        'base',\n        'runtime/client',\n        'mediator'\n    ], function( Base, RuntimeClient, Mediator ) {\n    \n        var $ = Base.$;\n    \n        function Transport( opts ) {\n            var me = this;\n    \n            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );\n            RuntimeClient.call( this, 'Transport' );\n    \n            this._blob = null;\n            this._formData = opts.formData || {};\n            this._headers = opts.headers || {};\n    \n            this.on( 'progress', this._timeout );\n            this.on( 'load error', function() {\n                me.trigger( 'progress', 1 );\n                clearTimeout( me._timer );\n            });\n        }\n    \n        Transport.options = {\n            server: '',\n            method: 'POST',\n    \n            // 跨域时，是否允许携带cookie, 只有html5 runtime才有效\n            withCredentials: false,\n            fileVal: 'file',\n            timeout: 2 * 60 * 1000,    // 2分钟\n            formData: {},\n            headers: {},\n            sendAsBinary: false\n        };\n    \n        $.extend( Transport.prototype, {\n    \n            // 添加Blob, 只能添加一次，最后一次有效。\n            appendBlob: function( key, blob, filename ) {\n                var me = this,\n                    opts = me.options;\n    \n                if ( me.getRuid() ) {\n                    me.disconnectRuntime();\n                }\n    \n                // 连接到blob归属的同一个runtime.\n                me.connectRuntime( blob.ruid, function() {\n                    me.exec('init');\n                });\n    \n                me._blob = blob;\n                opts.fileVal = key || opts.fileVal;\n                opts.filename = filename || opts.filename;\n            },\n    \n            // 添加其他字段\n            append: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._formData, key );\n                } else {\n                    this._formData[ key ] = value;\n                }\n            },\n    \n            setRequestHeader: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._headers, key );\n                } else {\n                    this._headers[ key ] = value;\n                }\n            },\n    \n            send: function( method ) {\n                this.exec( 'send', method );\n                this._timeout();\n            },\n    \n            abort: function() {\n                clearTimeout( this._timer );\n                return this.exec('abort');\n            },\n    \n            destroy: function() {\n                this.trigger('destroy');\n                this.off();\n                this.exec('destroy');\n                this.disconnectRuntime();\n            },\n    \n            getResponse: function() {\n                return this.exec('getResponse');\n            },\n    \n            getResponseAsJson: function() {\n                return this.exec('getResponseAsJson');\n            },\n    \n            getStatus: function() {\n                return this.exec('getStatus');\n            },\n    \n            _timeout: function() {\n                var me = this,\n                    duration = me.options.timeout;\n    \n                if ( !duration ) {\n                    return;\n                }\n    \n                clearTimeout( me._timer );\n                me._timer = setTimeout(function() {\n                    me.abort();\n                    me.trigger( 'error', 'timeout' );\n                }, duration );\n            }\n    \n        });\n    \n        // 让Transport具备事件功能。\n        Mediator.installTo( Transport.prototype );\n    \n        return Transport;\n    });\n    /**\n     * @fileOverview 负责文件上传相关。\n     */\n    define('widgets/upload',[\n        'base',\n        'uploader',\n        'file',\n        'lib/transport',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile, Transport ) {\n    \n        var $ = Base.$,\n            isPromise = Base.isPromise,\n            Status = WUFile.Status;\n    \n        // 添加默认配置项\n        $.extend( Uploader.options, {\n    \n    \n            /**\n             * @property {Boolean} [prepareNextFile=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否允许在文件传输时提前把下一个文件准备好。\n             * 对于一个文件的准备工作比较耗时，比如图片压缩，md5序列化。\n             * 如果能提前在当前文件传输期处理，可以节省总体耗时。\n             */\n            prepareNextFile: false,\n    \n            /**\n             * @property {Boolean} [chunked=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否要分片处理大文件上传。\n             */\n            chunked: false,\n    \n            /**\n             * @property {Boolean} [chunkSize=5242880]\n             * @namespace options\n             * @for Uploader\n             * @description 如果要分片，分多大一片？ 默认大小为5M.\n             */\n            chunkSize: 5 * 1024 * 1024,\n    \n            /**\n             * @property {Boolean} [chunkRetry=2]\n             * @namespace options\n             * @for Uploader\n             * @description 如果某个分片由于网络问题出错，允许自动重传多少次？\n             */\n            chunkRetry: 2,\n    \n            /**\n             * @property {Boolean} [threads=3]\n             * @namespace options\n             * @for Uploader\n             * @description 上传并发数。允许同时最大上传进程数。\n             */\n            threads: 3,\n    \n    \n            /**\n             * @property {Object} [formData]\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传请求的参数表，每次发送都会发送此对象中的参数。\n             */\n            formData: null\n    \n            /**\n             * @property {Object} [fileVal='file']\n             * @namespace options\n             * @for Uploader\n             * @description 设置文件上传域的name。\n             */\n    \n            /**\n             * @property {Object} [method='POST']\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传方式，`POST`或者`GET`。\n             */\n    \n            /**\n             * @property {Object} [sendAsBinary=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否已二进制的流的方式发送文件，这样整个上传内容`php://input`都为文件内容，\n             * 其他参数在$_GET数组中。\n             */\n        });\n    \n        // 负责将文件切片。\n        function CuteFile( file, chunkSize ) {\n            var pending = [],\n                blob = file.source,\n                total = blob.size,\n                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,\n                start = 0,\n                index = 0,\n                len;\n    \n            while ( index < chunks ) {\n                len = Math.min( chunkSize, total - start );\n    \n                pending.push({\n                    file: file,\n                    start: start,\n                    end: chunkSize ? (start + len) : total,\n                    total: total,\n                    chunks: chunks,\n                    chunk: index++\n                });\n                start += len;\n            }\n    \n            file.blocks = pending.concat();\n            file.remaning = pending.length;\n    \n            return {\n                file: file,\n    \n                has: function() {\n                    return !!pending.length;\n                },\n    \n                fetch: function() {\n                    return pending.shift();\n                }\n            };\n        }\n    \n        Uploader.register({\n            'start-upload': 'start',\n            'stop-upload': 'stop',\n            'skip-file': 'skipFile',\n            'is-in-progress': 'isInProgress'\n        }, {\n    \n            init: function() {\n                var owner = this.owner;\n    \n                this.runing = false;\n    \n                // 记录当前正在传的数据，跟threads相关\n                this.pool = [];\n    \n                // 缓存即将上传的文件。\n                this.pending = [];\n    \n                // 跟踪还有多少分片没有完成上传。\n                this.remaning = 0;\n                this.__tick = Base.bindFn( this._tick, this );\n    \n                owner.on( 'uploadComplete', function( file ) {\n                    // 把其他块取消了。\n                    file.blocks && $.each( file.blocks, function( _, v ) {\n                        v.transport && (v.transport.abort(), v.transport.destroy());\n                        delete v.transport;\n                    });\n    \n                    delete file.blocks;\n                    delete file.remaning;\n                });\n            },\n    \n            /**\n             * @event startUpload\n             * @description 当开始上传流程时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 开始上传。此方法可以从初始状态调用开始上传流程，也可以从暂停状态调用，继续上传流程。\n             * @grammar upload() => undefined\n             * @method upload\n             * @for  Uploader\n             */\n            start: function() {\n                var me = this;\n    \n                // 移出invalid的文件\n                $.each( me.request( 'get-files', Status.INVALID ), function() {\n                    me.request( 'remove-file', this );\n                });\n    \n                if ( me.runing ) {\n                    return;\n                }\n    \n                me.runing = true;\n    \n                // 如果有暂停的，则续传\n                $.each( me.pool, function( _, v ) {\n                    var file = v.file;\n    \n                    if ( file.getStatus() === Status.INTERRUPT ) {\n                        file.setStatus( Status.PROGRESS );\n                        me._trigged = false;\n                        v.transport && v.transport.send();\n                    }\n                });\n    \n                me._trigged = false;\n                me.owner.trigger('startUpload');\n                Base.nextTick( me.__tick );\n            },\n    \n            /**\n             * @event stopUpload\n             * @description 当开始上传流程暂停时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。\n             * @grammar stop() => undefined\n             * @grammar stop( true ) => undefined\n             * @method stop\n             * @for  Uploader\n             */\n            stop: function( interrupt ) {\n                var me = this;\n    \n                if ( me.runing === false ) {\n                    return;\n                }\n    \n                me.runing = false;\n    \n                interrupt && $.each( me.pool, function( _, v ) {\n                    v.transport && v.transport.abort();\n                    v.file.setStatus( Status.INTERRUPT );\n                });\n    \n                me.owner.trigger('stopUpload');\n            },\n    \n            /**\n             * 判断`Uplaode`r是否正在上传中。\n             * @grammar isInProgress() => Boolean\n             * @method isInProgress\n             * @for  Uploader\n             */\n            isInProgress: function() {\n                return !!this.runing;\n            },\n    \n            getStats: function() {\n                return this.request('get-stats');\n            },\n    \n            /**\n             * 掉过一个文件上传，直接标记指定文件为已上传状态。\n             * @grammar skipFile( file ) => undefined\n             * @method skipFile\n             * @for  Uploader\n             */\n            skipFile: function( file, status ) {\n                file = this.request( 'get-file', file );\n    \n                file.setStatus( status || Status.COMPLETE );\n                file.skipped = true;\n    \n                // 如果正在上传。\n                file.blocks && $.each( file.blocks, function( _, v ) {\n                    var _tr = v.transport;\n    \n                    if ( _tr ) {\n                        _tr.abort();\n                        _tr.destroy();\n                        delete v.transport;\n                    }\n                });\n    \n                this.owner.trigger( 'uploadSkip', file );\n            },\n    \n            /**\n             * @event uploadFinished\n             * @description 当所有文件上传结束时触发。\n             * @for  Uploader\n             */\n            _tick: function() {\n                var me = this,\n                    opts = me.options,\n                    fn, val;\n    \n                // 上一个promise还没有结束，则等待完成后再执行。\n                if ( me._promise ) {\n                    return me._promise.always( me.__tick );\n                }\n    \n                // 还有位置，且还有文件要处理的话。\n                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {\n                    me._trigged = false;\n    \n                    fn = function( val ) {\n                        me._promise = null;\n    \n                        // 有可能是reject过来的，所以要检测val的类型。\n                        val && val.file && me._startSend( val );\n                        Base.nextTick( me.__tick );\n                    };\n    \n                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );\n    \n                // 没有要上传的了，且没有正在传输的了。\n                } else if ( !me.remaning && !me.getStats().numOfQueue ) {\n                    me.runing = false;\n    \n                    me._trigged || Base.nextTick(function() {\n                        me.owner.trigger('uploadFinished');\n                    });\n                    me._trigged = true;\n                }\n            },\n    \n            _nextBlock: function() {\n                var me = this,\n                    act = me._act,\n                    opts = me.options,\n                    next, done;\n    \n                // 如果当前文件还有没有需要传输的，则直接返回剩下的。\n                if ( act && act.has() &&\n                        act.file.getStatus() === Status.PROGRESS ) {\n    \n                    // 是否提前准备下一个文件\n                    if ( opts.prepareNextFile && !me.pending.length ) {\n                        me._prepareNextFile();\n                    }\n    \n                    return act.fetch();\n    \n                // 否则，如果正在运行，则准备下一个文件，并等待完成后返回下个分片。\n                } else if ( me.runing ) {\n    \n                    // 如果缓存中有，则直接在缓存中取，没有则去queue中取。\n                    if ( !me.pending.length && me.getStats().numOfQueue ) {\n                        me._prepareNextFile();\n                    }\n    \n                    next = me.pending.shift();\n                    done = function( file ) {\n                        if ( !file ) {\n                            return null;\n                        }\n    \n                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );\n                        me._act = act;\n                        return act.fetch();\n                    };\n    \n                    // 文件可能还在prepare中，也有可能已经完全准备好了。\n                    return isPromise( next ) ?\n                            next[ next.pipe ? 'pipe' : 'then']( done ) :\n                            done( next );\n                }\n            },\n    \n    \n            /**\n             * @event uploadStart\n             * @param {File} file File对象\n             * @description 某个文件开始上传前触发，一个文件只会触发一次。\n             * @for  Uploader\n             */\n            _prepareNextFile: function() {\n                var me = this,\n                    file = me.request('fetch-file'),\n                    pending = me.pending,\n                    promise;\n    \n                if ( file ) {\n                    promise = me.request( 'before-send-file', file, function() {\n    \n                        // 有可能文件被skip掉了。文件被skip掉后，状态坑定不是Queued.\n                        if ( file.getStatus() === Status.QUEUED ) {\n                            me.owner.trigger( 'uploadStart', file );\n                            file.setStatus( Status.PROGRESS );\n                            return file;\n                        }\n    \n                        return me._finishFile( file );\n                    });\n    \n                    // 如果还在pending中，则替换成文件本身。\n                    promise.done(function() {\n                        var idx = $.inArray( promise, pending );\n    \n                        ~idx && pending.splice( idx, 1, file );\n                    });\n    \n                    // befeore-send-file的钩子就有错误发生。\n                    promise.fail(function( reason ) {\n                        file.setStatus( Status.ERROR, reason );\n                        me.owner.trigger( 'uploadError', file, reason );\n                        me.owner.trigger( 'uploadComplete', file );\n                    });\n    \n                    pending.push( promise );\n                }\n            },\n    \n            // 让出位置了，可以让其他分片开始上传\n            _popBlock: function( block ) {\n                var idx = $.inArray( block, this.pool );\n    \n                this.pool.splice( idx, 1 );\n                block.file.remaning--;\n                this.remaning--;\n            },\n    \n            // 开始上传，可以被掉过。如果promise被reject了，则表示跳过此分片。\n            _startSend: function( block ) {\n                var me = this,\n                    file = block.file,\n                    promise;\n    \n                me.pool.push( block );\n                me.remaning++;\n    \n                // 如果没有分片，则直接使用原始的。\n                // 不会丢失content-type信息。\n                block.blob = block.chunks === 1 ? file.source :\n                        file.source.slice( block.start, block.end );\n    \n                // hook, 每个分片发送之前可能要做些异步的事情。\n                promise = me.request( 'before-send', block, function() {\n    \n                    // 有可能文件已经上传出错了，所以不需要再传输了。\n                    if ( file.getStatus() === Status.PROGRESS ) {\n                        me._doSend( block );\n                    } else {\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n    \n                // 如果为fail了，则跳过此分片。\n                promise.fail(function() {\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file ).always(function() {\n                            block.percentage = 1;\n                            me._popBlock( block );\n                            me.owner.trigger( 'uploadComplete', file );\n                            Base.nextTick( me.__tick );\n                        });\n                    } else {\n                        block.percentage = 1;\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n            },\n    \n    \n            /**\n             * @event uploadBeforeSend\n             * @param {Object} object\n             * @param {Object} data 默认的上传参数，可以扩展此对象来控制上传参数。\n             * @description 当某个文件的分块在发送前触发，主要用来询问是否要添加附带参数，大文件在开起分片上传的前提下此事件可能会触发多次。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadAccept\n             * @param {Object} object\n             * @param {Object} ret 服务端的返回数据，json格式，如果服务端不是json格式，从ret._raw中取数据，自行解析。\n             * @description 当某个文件上传到服务端响应后，会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadProgress\n             * @param {File} file File对象\n             * @param {Number} percentage 上传进度\n             * @description 上传过程中触发，携带上传进度。\n             * @for  Uploader\n             */\n    \n    \n            /**\n             * @event uploadError\n             * @param {File} file File对象\n             * @param {String} reason 出错的code\n             * @description 当文件上传出错时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadSuccess\n             * @param {File} file File对象\n             * @param {Object} response 服务端返回的数据\n             * @description 当文件上传成功时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadComplete\n             * @param {File} [file] File对象\n             * @description 不管成功或者失败，文件上传完成时触发。\n             * @for  Uploader\n             */\n    \n            // 做上传操作。\n            _doSend: function( block ) {\n                var me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    file = block.file,\n                    tr = new Transport( opts ),\n                    data = $.extend({}, opts.formData ),\n                    headers = $.extend({}, opts.headers ),\n                    requestAccept, ret;\n    \n                block.transport = tr;\n    \n                tr.on( 'destroy', function() {\n                    delete block.transport;\n                    me._popBlock( block );\n                    Base.nextTick( me.__tick );\n                });\n    \n                // 广播上传进度。以文件为单位。\n                tr.on( 'progress', function( percentage ) {\n                    var totalPercent = 0,\n                        uploaded = 0;\n    \n                    // 可能没有abort掉，progress还是执行进来了。\n                    // if ( !file.blocks ) {\n                    //     return;\n                    // }\n    \n                    totalPercent = block.percentage = percentage;\n    \n                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。\n                        $.each( file.blocks, function( _, v ) {\n                            uploaded += (v.percentage || 0) * (v.end - v.start);\n                        });\n    \n                        totalPercent = uploaded / file.size;\n                    }\n    \n                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );\n                });\n    \n                // 用来询问，是否返回的结果是有错误的。\n                requestAccept = function( reject ) {\n                    var fn;\n    \n                    ret = tr.getResponseAsJson() || {};\n                    ret._raw = tr.getResponse();\n                    fn = function( value ) {\n                        reject = value;\n                    };\n    \n                    // 服务端响应了，不代表成功了，询问是否响应正确。\n                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {\n                        reject = reject || 'server';\n                    }\n    \n                    return reject;\n                };\n    \n                // 尝试重试，然后广播文件上传出错。\n                tr.on( 'error', function( type, flag ) {\n                    block.retried = block.retried || 0;\n    \n                    // 自动重试\n                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&\n                            block.retried < opts.chunkRetry ) {\n    \n                        block.retried++;\n                        tr.send();\n    \n                    } else {\n    \n                        // http status 500 ~ 600\n                        if ( !flag && type === 'server' ) {\n                            type = requestAccept( type );\n                        }\n    \n                        file.setStatus( Status.ERROR, type );\n                        owner.trigger( 'uploadError', file, type );\n                        owner.trigger( 'uploadComplete', file );\n                    }\n                });\n    \n                // 上传成功\n                tr.on( 'load', function() {\n                    var reason;\n    \n                    // 如果非预期，转向上传出错。\n                    if ( (reason = requestAccept()) ) {\n                        tr.trigger( 'error', reason, true );\n                        return;\n                    }\n    \n                    // 全部上传完成。\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file, ret );\n                    } else {\n                        tr.destroy();\n                    }\n                });\n    \n                // 配置默认的上传字段。\n                data = $.extend( data, {\n                    id: file.id,\n                    name: file.name,\n                    type: file.type,\n                    lastModifiedDate: file.lastModifiedDate,\n                    size: file.size\n                });\n    \n                block.chunks > 1 && $.extend( data, {\n                    chunks: block.chunks,\n                    chunk: block.chunk\n                });\n    \n                // 在发送之间可以添加字段什么的。。。\n                // 如果默认的字段不够使用，可以通过监听此事件来扩展\n                owner.trigger( 'uploadBeforeSend', block, data, headers );\n    \n                // 开始发送。\n                tr.appendBlob( opts.fileVal, block.blob, file.name );\n                tr.append( data );\n                tr.setRequestHeader( headers );\n                tr.send();\n            },\n    \n            // 完成上传。\n            _finishFile: function( file, ret, hds ) {\n                var owner = this.owner;\n    \n                return owner\n                        .request( 'after-send-file', arguments, function() {\n                            file.setStatus( Status.COMPLETE );\n                            owner.trigger( 'uploadSuccess', file, ret, hds );\n                        })\n                        .fail(function( reason ) {\n    \n                            // 如果外部已经标记为invalid什么的，不再改状态。\n                            if ( file.getStatus() === Status.PROGRESS ) {\n                                file.setStatus( Status.ERROR, reason );\n                            }\n    \n                            owner.trigger( 'uploadError', file, reason );\n                        })\n                        .always(function() {\n                            owner.trigger( 'uploadComplete', file );\n                        });\n            }\n    \n        });\n    });\n    /**\n     * @fileOverview 各种验证，包括文件总大小是否超出、单文件是否超出和文件是否重复。\n     */\n    \n    define('widgets/validator',[\n        'base',\n        'uploader',\n        'file',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile ) {\n    \n        var $ = Base.$,\n            validators = {},\n            api;\n    \n        /**\n         * @event error\n         * @param {String} type 错误类型。\n         * @description 当validate不通过时，会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误，目前有以下错误会在特定的情况下派送错来。\n         *\n         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。\n         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。\n         * @for  Uploader\n         */\n    \n        // 暴露给外面的api\n        api = {\n    \n            // 添加验证器\n            addValidator: function( type, cb ) {\n                validators[ type ] = cb;\n            },\n    \n            // 移除验证器\n            removeValidator: function( type ) {\n                delete validators[ type ];\n            }\n        };\n    \n        // 在Uploader初始化的时候启动Validators的初始化\n        Uploader.register({\n            init: function() {\n                var me = this;\n                $.each( validators, function() {\n                    this.call( me.owner );\n                });\n            }\n        });\n    \n        /**\n         * @property {int} [fileNumLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证文件总数量, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileNumLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                count = 0,\n                max = opts.fileNumLimit >> 0,\n                flag = true;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n    \n                if ( count >= max && flag ) {\n                    flag = false;\n                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );\n                    setTimeout(function() {\n                        flag = true;\n                    }, 1 );\n                }\n    \n                return count >= max ? false : true;\n            });\n    \n            uploader.on( 'fileQueued', function() {\n                count++;\n            });\n    \n            uploader.on( 'fileDequeued', function() {\n                count--;\n            });\n    \n            uploader.on( 'uploadFinished', function() {\n                count = 0;\n            });\n        });\n    \n    \n        /**\n         * @property {int} [fileSizeLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileSizeLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                count = 0,\n                max = opts.fileSizeLimit >> 0,\n                flag = true;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n                var invalid = count + file.size > max;\n    \n                if ( invalid && flag ) {\n                    flag = false;\n                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );\n                    setTimeout(function() {\n                        flag = true;\n                    }, 1 );\n                }\n    \n                return invalid ? false : true;\n            });\n    \n            uploader.on( 'fileQueued', function( file ) {\n                count += file.size;\n            });\n    \n            uploader.on( 'fileDequeued', function( file ) {\n                count -= file.size;\n            });\n    \n            uploader.on( 'uploadFinished', function() {\n                count = 0;\n            });\n        });\n    \n        /**\n         * @property {int} [fileSingleSizeLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileSingleSizeLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                max = opts.fileSingleSizeLimit;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n    \n                if ( file.size > max ) {\n                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );\n                    this.trigger( 'error', 'F_EXCEED_SIZE', file );\n                    return false;\n                }\n    \n            });\n    \n        });\n    \n        /**\n         * @property {int} [duplicate=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 去重， 根据文件名字、文件大小和最后修改时间来生成hash Key.\n         */\n        api.addValidator( 'duplicate', function() {\n            var uploader = this,\n                opts = uploader.options,\n                mapping = {};\n    \n            if ( opts.duplicate ) {\n                return;\n            }\n    \n            function hashString( str ) {\n                var hash = 0,\n                    i = 0,\n                    len = str.length,\n                    _char;\n    \n                for ( ; i < len; i++ ) {\n                    _char = str.charCodeAt( i );\n                    hash = _char + (hash << 6) + (hash << 16) - hash;\n                }\n    \n                return hash;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n                var hash = file.__hash || (file.__hash = hashString( file.name +\n                        file.size + file.lastModifiedDate ));\n    \n                // 已经重复了\n                if ( mapping[ hash ] ) {\n                    this.trigger( 'error', 'F_DUPLICATE', file );\n                    return false;\n                }\n            });\n    \n            uploader.on( 'fileQueued', function( file ) {\n                var hash = file.__hash;\n    \n                hash && (mapping[ hash ] = true);\n            });\n    \n            uploader.on( 'fileDequeued', function( file ) {\n                var hash = file.__hash;\n    \n                hash && (delete mapping[ hash ]);\n            });\n        });\n    \n        return api;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/compbase',[],function() {\n    \n        function CompBase( owner, runtime ) {\n    \n            this.owner = owner;\n            this.options = owner.options;\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.getRuid = function() {\n                return runtime.uid;\n            };\n    \n            this.trigger = function() {\n                return owner.trigger.apply( owner, arguments );\n            };\n        }\n    \n        return CompBase;\n    });\n    /**\n     * @fileOverview Html5Runtime\n     */\n    define('runtime/html5/runtime',[\n        'base',\n        'runtime/runtime',\n        'runtime/compbase'\n    ], function( Base, Runtime, CompBase ) {\n    \n        var type = 'html5',\n            components = {};\n    \n        function Html5Runtime() {\n            var pool = {},\n                me = this,\n                destory = this.destory;\n    \n            Runtime.apply( me, arguments );\n            me.type = type;\n    \n    \n            // 这个方法的调用者，实际上是RuntimeClient\n            me.exec = function( comp, fn/*, args...*/) {\n                var client = this,\n                    uid = client.uid,\n                    args = Base.slice( arguments, 2 ),\n                    instance;\n    \n                if ( components[ comp ] ) {\n                    instance = pool[ uid ] = pool[ uid ] ||\n                            new components[ comp ]( client, me );\n    \n                    if ( instance[ fn ] ) {\n                        return instance[ fn ].apply( instance, args );\n                    }\n                }\n            };\n    \n            me.destory = function() {\n                // @todo 删除池子中的所有实例\n                return destory && destory.apply( this, arguments );\n            };\n        }\n    \n        Base.inherits( Runtime, {\n            constructor: Html5Runtime,\n    \n            // 不需要连接其他程序，直接执行callback\n            init: function() {\n                var me = this;\n                setTimeout(function() {\n                    me.trigger('ready');\n                }, 1 );\n            }\n    \n        });\n    \n        // 注册Components\n        Html5Runtime.register = function( name, component ) {\n            var klass = components[ name ] = Base.inherits( CompBase, component );\n            return klass;\n        };\n    \n        // 注册html5运行时。\n        // 只有在支持的前提下注册。\n        if ( window.Blob && window.FileReader && window.DataView ) {\n            Runtime.addRuntime( type, Html5Runtime );\n        }\n    \n        return Html5Runtime;\n    });\n    /**\n     * @fileOverview Blob Html实现\n     */\n    define('runtime/html5/blob',[\n        'runtime/html5/runtime',\n        'lib/blob'\n    ], function( Html5Runtime, Blob ) {\n    \n        return Html5Runtime.register( 'Blob', {\n            slice: function( start, end ) {\n                var blob = this.owner.source,\n                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;\n    \n                blob = slice.call( blob, start, end );\n    \n                return new Blob( this.getRuid(), blob );\n            }\n        });\n    });\n    /**\n     * @fileOverview FilePaste\n     */\n    define('runtime/html5/dnd',[\n        'base',\n        'runtime/html5/runtime',\n        'lib/file'\n    ], function( Base, Html5Runtime, File ) {\n    \n        var $ = Base.$,\n            prefix = 'webuploader-dnd-';\n    \n        return Html5Runtime.register( 'DragAndDrop', {\n            init: function() {\n                var elem = this.elem = this.options.container;\n    \n                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );\n                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );\n                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );\n                this.dropHandler = Base.bindFn( this._dropHandler, this );\n                this.dndOver = false;\n    \n                elem.on( 'dragenter', this.dragEnterHandler );\n                elem.on( 'dragover', this.dragOverHandler );\n                elem.on( 'dragleave', this.dragLeaveHandler );\n                elem.on( 'drop', this.dropHandler );\n    \n                if ( this.options.disableGlobalDnd ) {\n                    $( document ).on( 'dragover', this.dragOverHandler );\n                    $( document ).on( 'drop', this.dropHandler );\n                }\n            },\n    \n            _dragEnterHandler: function( e ) {\n                var me = this,\n                    denied = me._denied || false,\n                    items;\n    \n                e = e.originalEvent || e;\n    \n                if ( !me.dndOver ) {\n                    me.dndOver = true;\n    \n                    // 注意只有 chrome 支持。\n                    items = e.dataTransfer.items;\n    \n                    if ( items && items.length ) {\n                        me._denied = denied = !me.trigger( 'accept', items );\n                    }\n    \n                    me.elem.addClass( prefix + 'over' );\n                    me.elem[ denied ? 'addClass' :\n                            'removeClass' ]( prefix + 'denied' );\n                }\n    \n    \n                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';\n    \n                return false;\n            },\n    \n            _dragOverHandler: function( e ) {\n                // 只处理框内的。\n                var parentElem = this.elem.parent().get( 0 );\n                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {\n                    return false;\n                }\n    \n                clearTimeout( this._leaveTimer );\n                this._dragEnterHandler.call( this, e );\n    \n                return false;\n            },\n    \n            _dragLeaveHandler: function() {\n                var me = this,\n                    handler;\n    \n                handler = function() {\n                    me.dndOver = false;\n                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );\n                };\n    \n                clearTimeout( me._leaveTimer );\n                me._leaveTimer = setTimeout( handler, 100 );\n                return false;\n            },\n    \n            _dropHandler: function( e ) {\n                var me = this,\n                    ruid = me.getRuid(),\n                    parentElem = me.elem.parent().get( 0 );\n    \n                // 只处理框内的。\n                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {\n                    return false;\n                }\n    \n                me._getTansferFiles( e, function( results ) {\n                    me.trigger( 'drop', $.map( results, function( file ) {\n                        return new File( ruid, file );\n                    }) );\n                });\n    \n                me.dndOver = false;\n                me.elem.removeClass( prefix + 'over' );\n                return false;\n            },\n    \n            // 如果传入 callback 则去查看文件夹，否则只管当前文件夹。\n            _getTansferFiles: function( e, callback ) {\n                var results  = [],\n                    promises = [],\n                    items, files, dataTransfer, file, item, i, len, canAccessFolder;\n    \n                e = e.originalEvent || e;\n    \n                dataTransfer = e.dataTransfer;\n                items = dataTransfer.items;\n                files = dataTransfer.files;\n    \n                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);\n    \n                for ( i = 0, len = files.length; i < len; i++ ) {\n                    file = files[ i ];\n                    item = items && items[ i ];\n    \n                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {\n    \n                        promises.push( this._traverseDirectoryTree(\n                                item.webkitGetAsEntry(), results ) );\n                    } else {\n                        results.push( file );\n                    }\n                }\n    \n                Base.when.apply( Base, promises ).done(function() {\n    \n                    if ( !results.length ) {\n                        return;\n                    }\n    \n                    callback( results );\n                });\n            },\n    \n            _traverseDirectoryTree: function( entry, results ) {\n                var deferred = Base.Deferred(),\n                    me = this;\n    \n                if ( entry.isFile ) {\n                    entry.file(function( file ) {\n                        results.push( file );\n                        deferred.resolve();\n                    });\n                } else if ( entry.isDirectory ) {\n                    entry.createReader().readEntries(function( entries ) {\n                        var len = entries.length,\n                            promises = [],\n                            arr = [],    // 为了保证顺序。\n                            i;\n    \n                        for ( i = 0; i < len; i++ ) {\n                            promises.push( me._traverseDirectoryTree(\n                                    entries[ i ], arr ) );\n                        }\n    \n                        Base.when.apply( Base, promises ).then(function() {\n                            results.push.apply( results, arr );\n                            deferred.resolve();\n                        }, deferred.reject );\n                    });\n                }\n    \n                return deferred.promise();\n            },\n    \n            destroy: function() {\n                var elem = this.elem;\n    \n                elem.off( 'dragenter', this.dragEnterHandler );\n                elem.off( 'dragover', this.dragEnterHandler );\n                elem.off( 'dragleave', this.dragLeaveHandler );\n                elem.off( 'drop', this.dropHandler );\n    \n                if ( this.options.disableGlobalDnd ) {\n                    $( document ).off( 'dragover', this.dragOverHandler );\n                    $( document ).off( 'drop', this.dropHandler );\n                }\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview FilePaste\n     */\n    define('runtime/html5/filepaste',[\n        'base',\n        'runtime/html5/runtime',\n        'lib/file'\n    ], function( Base, Html5Runtime, File ) {\n    \n        return Html5Runtime.register( 'FilePaste', {\n            init: function() {\n                var opts = this.options,\n                    elem = this.elem = opts.container,\n                    accept = '.*',\n                    arr, i, len, item;\n    \n                // accetp的mimeTypes中生成匹配正则。\n                if ( opts.accept ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        item = opts.accept[ i ].mimeTypes;\n                        item && arr.push( item );\n                    }\n    \n                    if ( arr.length ) {\n                        accept = arr.join(',');\n                        accept = accept.replace( /,/g, '|' ).replace( /\\*/g, '.*' );\n                    }\n                }\n                this.accept = accept = new RegExp( accept, 'i' );\n                this.hander = Base.bindFn( this._pasteHander, this );\n                elem.on( 'paste', this.hander );\n            },\n    \n            _pasteHander: function( e ) {\n                var allowed = [],\n                    ruid = this.getRuid(),\n                    items, item, blob, i, len;\n    \n                e = e.originalEvent || e;\n                items = e.clipboardData.items;\n    \n                for ( i = 0, len = items.length; i < len; i++ ) {\n                    item = items[ i ];\n    \n                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {\n                        continue;\n                    }\n    \n                    allowed.push( new File( ruid, blob ) );\n                }\n    \n                if ( allowed.length ) {\n                    // 不阻止非文件粘贴（文字粘贴）的事件冒泡\n                    e.preventDefault();\n                    e.stopPropagation();\n                    this.trigger( 'paste', allowed );\n                }\n            },\n    \n            destroy: function() {\n                this.elem.off( 'paste', this.hander );\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview FilePicker\n     */\n    define('runtime/html5/filepicker',[\n        'base',\n        'runtime/html5/runtime'\n    ], function( Base, Html5Runtime ) {\n    \n        var $ = Base.$;\n    \n        return Html5Runtime.register( 'FilePicker', {\n            init: function() {\n                var container = this.getRuntime().getContainer(),\n                    me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    lable = $( document.createElement('label') ),\n                    input = $( document.createElement('input') ),\n                    arr, i, len, mouseHandler;\n    \n                input.attr( 'type', 'file' );\n                input.attr( 'name', opts.name );\n                input.addClass('webuploader-element-invisible');\n    \n                lable.on( 'click', function() {\n                    input.trigger('click');\n                });\n    \n                lable.css({\n                    opacity: 0,\n                    width: '100%',\n                    height: '100%',\n                    display: 'block',\n                    cursor: 'pointer',\n                    background: '#ffffff'\n                });\n    \n                if ( opts.multiple ) {\n                    input.attr( 'multiple', 'multiple' );\n                }\n    \n                // @todo Firefox不支持单独指定后缀\n                if ( opts.accept && opts.accept.length > 0 ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        arr.push( opts.accept[ i ].mimeTypes );\n                    }\n    \n                    input.attr( 'accept', arr.join(',') );\n                }\n    \n                container.append( input );\n                container.append( lable );\n    \n                mouseHandler = function( e ) {\n                    owner.trigger( e.type );\n                };\n    \n                input.on( 'change', function( e ) {\n                    var fn = arguments.callee,\n                        clone;\n    \n                    me.files = e.target.files;\n    \n                    // reset input\n                    clone = this.cloneNode( true );\n                    this.parentNode.replaceChild( clone, this );\n    \n                    input.off();\n                    input = $( clone ).on( 'change', fn )\n                            .on( 'mouseenter mouseleave', mouseHandler );\n    \n                    owner.trigger('change');\n                });\n    \n                lable.on( 'mouseenter mouseleave', mouseHandler );\n    \n            },\n    \n    \n            getFiles: function() {\n                return this.files;\n            },\n    \n            destroy: function() {\n                // todo\n            }\n        });\n    });\n    /**\n     * Terms:\n     *\n     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer\n     * @fileOverview Image控件\n     */\n    define('runtime/html5/util',[\n        'base'\n    ], function( Base ) {\n    \n        var urlAPI = window.createObjectURL && window ||\n                window.URL && URL.revokeObjectURL && URL ||\n                window.webkitURL,\n            createObjectURL = Base.noop,\n            revokeObjectURL = createObjectURL;\n    \n        if ( urlAPI ) {\n    \n            // 更安全的方式调用，比如android里面就能把context改成其他的对象。\n            createObjectURL = function() {\n                return urlAPI.createObjectURL.apply( urlAPI, arguments );\n            };\n    \n            revokeObjectURL = function() {\n                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );\n            };\n        }\n    \n        return {\n            createObjectURL: createObjectURL,\n            revokeObjectURL: revokeObjectURL,\n    \n            dataURL2Blob: function( dataURI ) {\n                var byteStr, intArray, ab, i, mimetype, parts;\n    \n                parts = dataURI.split(',');\n    \n                if ( ~parts[ 0 ].indexOf('base64') ) {\n                    byteStr = atob( parts[ 1 ] );\n                } else {\n                    byteStr = decodeURIComponent( parts[ 1 ] );\n                }\n    \n                ab = new ArrayBuffer( byteStr.length );\n                intArray = new Uint8Array( ab );\n    \n                for ( i = 0; i < byteStr.length; i++ ) {\n                    intArray[ i ] = byteStr.charCodeAt( i );\n                }\n    \n                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];\n    \n                return this.arrayBufferToBlob( ab, mimetype );\n            },\n    \n            dataURL2ArrayBuffer: function( dataURI ) {\n                var byteStr, intArray, i, parts;\n    \n                parts = dataURI.split(',');\n    \n                if ( ~parts[ 0 ].indexOf('base64') ) {\n                    byteStr = atob( parts[ 1 ] );\n                } else {\n                    byteStr = decodeURIComponent( parts[ 1 ] );\n                }\n    \n                intArray = new Uint8Array( byteStr.length );\n    \n                for ( i = 0; i < byteStr.length; i++ ) {\n                    intArray[ i ] = byteStr.charCodeAt( i );\n                }\n    \n                return intArray.buffer;\n            },\n    \n            arrayBufferToBlob: function( buffer, type ) {\n                var builder = window.BlobBuilder || window.WebKitBlobBuilder,\n                    bb;\n    \n                // android不支持直接new Blob, 只能借助blobbuilder.\n                if ( builder ) {\n                    bb = new builder();\n                    bb.append( buffer );\n                    return bb.getBlob( type );\n                }\n    \n                return new Blob([ buffer ], type ? { type: type } : {} );\n            },\n    \n            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.\n            // 你得到的结果是png.\n            canvasToDataUrl: function( canvas, type, quality ) {\n                return canvas.toDataURL( type, quality / 100 );\n            },\n    \n            // imagemeat会复写这个方法，如果用户选择加载那个文件了的话。\n            parseMeta: function( blob, callback ) {\n                callback( false, {});\n            },\n    \n            // imagemeat会复写这个方法，如果用户选择加载那个文件了的话。\n            updateImageHead: function( data ) {\n                return data;\n            }\n        };\n    });\n    /**\n     * Terms:\n     *\n     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer\n     * @fileOverview Image控件\n     */\n    define('runtime/html5/imagemeta',[\n        'runtime/html5/util'\n    ], function( Util ) {\n    \n        var api;\n    \n        api = {\n            parsers: {\n                0xffe1: []\n            },\n    \n            maxMetaDataSize: 262144,\n    \n            parse: function( blob, cb ) {\n                var me = this,\n                    fr = new FileReader();\n    \n                fr.onload = function() {\n                    cb( false, me._parse( this.result ) );\n                    fr = fr.onload = fr.onerror = null;\n                };\n    \n                fr.onerror = function( e ) {\n                    cb( e.message );\n                    fr = fr.onload = fr.onerror = null;\n                };\n    \n                blob = blob.slice( 0, me.maxMetaDataSize );\n                fr.readAsArrayBuffer( blob.getSource() );\n            },\n    \n            _parse: function( buffer, noParse ) {\n                if ( buffer.byteLength < 6 ) {\n                    return;\n                }\n    \n                var dataview = new DataView( buffer ),\n                    offset = 2,\n                    maxOffset = dataview.byteLength - 4,\n                    headLength = offset,\n                    ret = {},\n                    markerBytes, markerLength, parsers, i;\n    \n                if ( dataview.getUint16( 0 ) === 0xffd8 ) {\n    \n                    while ( offset < maxOffset ) {\n                        markerBytes = dataview.getUint16( offset );\n    \n                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||\n                                markerBytes === 0xfffe ) {\n    \n                            markerLength = dataview.getUint16( offset + 2 ) + 2;\n    \n                            if ( offset + markerLength > dataview.byteLength ) {\n                                break;\n                            }\n    \n                            parsers = api.parsers[ markerBytes ];\n    \n                            if ( !noParse && parsers ) {\n                                for ( i = 0; i < parsers.length; i += 1 ) {\n                                    parsers[ i ].call( api, dataview, offset,\n                                            markerLength, ret );\n                                }\n                            }\n    \n                            offset += markerLength;\n                            headLength = offset;\n                        } else {\n                            break;\n                        }\n                    }\n    \n                    if ( headLength > 6 ) {\n                        if ( buffer.slice ) {\n                            ret.imageHead = buffer.slice( 2, headLength );\n                        } else {\n                            // Workaround for IE10, which does not yet\n                            // support ArrayBuffer.slice:\n                            ret.imageHead = new Uint8Array( buffer )\n                                    .subarray( 2, headLength );\n                        }\n                    }\n                }\n    \n                return ret;\n            },\n    \n            updateImageHead: function( buffer, head ) {\n                var data = this._parse( buffer, true ),\n                    buf1, buf2, bodyoffset;\n    \n    \n                bodyoffset = 2;\n                if ( data.imageHead ) {\n                    bodyoffset = 2 + data.imageHead.byteLength;\n                }\n    \n                if ( buffer.slice ) {\n                    buf2 = buffer.slice( bodyoffset );\n                } else {\n                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );\n                }\n    \n                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );\n    \n                buf1[ 0 ] = 0xFF;\n                buf1[ 1 ] = 0xD8;\n                buf1.set( new Uint8Array( head ), 2 );\n                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );\n    \n                return buf1.buffer;\n            }\n        };\n    \n        Util.parseMeta = function() {\n            return api.parse.apply( api, arguments );\n        };\n    \n        Util.updateImageHead = function() {\n            return api.updateImageHead.apply( api, arguments );\n        };\n    \n        return api;\n    });\n    /**\n     * 代码来自于：https://github.com/blueimp/JavaScript-Load-Image\n     * 暂时项目中只用了orientation.\n     *\n     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.\n     * @fileOverview EXIF解析\n     */\n    \n    // Sample\n    // ====================================\n    // Make : Apple\n    // Model : iPhone 4S\n    // Orientation : 1\n    // XResolution : 72 [72/1]\n    // YResolution : 72 [72/1]\n    // ResolutionUnit : 2\n    // Software : QuickTime 7.7.1\n    // DateTime : 2013:09:01 22:53:55\n    // ExifIFDPointer : 190\n    // ExposureTime : 0.058823529411764705 [1/17]\n    // FNumber : 2.4 [12/5]\n    // ExposureProgram : Normal program\n    // ISOSpeedRatings : 800\n    // ExifVersion : 0220\n    // DateTimeOriginal : 2013:09:01 22:52:51\n    // DateTimeDigitized : 2013:09:01 22:52:51\n    // ComponentsConfiguration : YCbCr\n    // ShutterSpeedValue : 4.058893515764426\n    // ApertureValue : 2.5260688216892597 [4845/1918]\n    // BrightnessValue : -0.3126686601998395\n    // MeteringMode : Pattern\n    // Flash : Flash did not fire, compulsory flash mode\n    // FocalLength : 4.28 [107/25]\n    // SubjectArea : [4 values]\n    // FlashpixVersion : 0100\n    // ColorSpace : 1\n    // PixelXDimension : 2448\n    // PixelYDimension : 3264\n    // SensingMethod : One-chip color area sensor\n    // ExposureMode : 0\n    // WhiteBalance : Auto white balance\n    // FocalLengthIn35mmFilm : 35\n    // SceneCaptureType : Standard\n    define('runtime/html5/imagemeta/exif',[\n        'base',\n        'runtime/html5/imagemeta'\n    ], function( Base, ImageMeta ) {\n    \n        var EXIF = {};\n    \n        EXIF.ExifMap = function() {\n            return this;\n        };\n    \n        EXIF.ExifMap.prototype.map = {\n            'Orientation': 0x0112\n        };\n    \n        EXIF.ExifMap.prototype.get = function( id ) {\n            return this[ id ] || this[ this.map[ id ] ];\n        };\n    \n        EXIF.exifTagTypes = {\n            // byte, 8-bit unsigned int:\n            1: {\n                getValue: function( dataView, dataOffset ) {\n                    return dataView.getUint8( dataOffset );\n                },\n                size: 1\n            },\n    \n            // ascii, 8-bit byte:\n            2: {\n                getValue: function( dataView, dataOffset ) {\n                    return String.fromCharCode( dataView.getUint8( dataOffset ) );\n                },\n                size: 1,\n                ascii: true\n            },\n    \n            // short, 16 bit int:\n            3: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint16( dataOffset, littleEndian );\n                },\n                size: 2\n            },\n    \n            // long, 32 bit int:\n            4: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint32( dataOffset, littleEndian );\n                },\n                size: 4\n            },\n    \n            // rational = two long values,\n            // first is numerator, second is denominator:\n            5: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getUint32( dataOffset, littleEndian ) /\n                        dataView.getUint32( dataOffset + 4, littleEndian );\n                },\n                size: 8\n            },\n    \n            // slong, 32 bit signed int:\n            9: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getInt32( dataOffset, littleEndian );\n                },\n                size: 4\n            },\n    \n            // srational, two slongs, first is numerator, second is denominator:\n            10: {\n                getValue: function( dataView, dataOffset, littleEndian ) {\n                    return dataView.getInt32( dataOffset, littleEndian ) /\n                        dataView.getInt32( dataOffset + 4, littleEndian );\n                },\n                size: 8\n            }\n        };\n    \n        // undefined, 8-bit byte, value depending on field:\n        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];\n    \n        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,\n                littleEndian ) {\n    \n            var tagType = EXIF.exifTagTypes[ type ],\n                tagSize, dataOffset, values, i, str, c;\n    \n            if ( !tagType ) {\n                Base.log('Invalid Exif data: Invalid tag type.');\n                return;\n            }\n    \n            tagSize = tagType.size * length;\n    \n            // Determine if the value is contained in the dataOffset bytes,\n            // or if the value at the dataOffset is a pointer to the actual data:\n            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,\n                    littleEndian ) : (offset + 8);\n    \n            if ( dataOffset + tagSize > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid data offset.');\n                return;\n            }\n    \n            if ( length === 1 ) {\n                return tagType.getValue( dataView, dataOffset, littleEndian );\n            }\n    \n            values = [];\n    \n            for ( i = 0; i < length; i += 1 ) {\n                values[ i ] = tagType.getValue( dataView,\n                        dataOffset + i * tagType.size, littleEndian );\n            }\n    \n            if ( tagType.ascii ) {\n                str = '';\n    \n                // Concatenate the chars:\n                for ( i = 0; i < values.length; i += 1 ) {\n                    c = values[ i ];\n    \n                    // Ignore the terminating NULL byte(s):\n                    if ( c === '\\u0000' ) {\n                        break;\n                    }\n                    str += c;\n                }\n    \n                return str;\n            }\n            return values;\n        };\n    \n        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,\n                data ) {\n    \n            var tag = dataView.getUint16( offset, littleEndian );\n            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,\n                    dataView.getUint16( offset + 2, littleEndian ),    // tag type\n                    dataView.getUint32( offset + 4, littleEndian ),    // tag length\n                    littleEndian );\n        };\n    \n        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,\n                littleEndian, data ) {\n    \n            var tagsNumber, dirEndOffset, i;\n    \n            if ( dirOffset + 6 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid directory offset.');\n                return;\n            }\n    \n            tagsNumber = dataView.getUint16( dirOffset, littleEndian );\n            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;\n    \n            if ( dirEndOffset + 4 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid directory size.');\n                return;\n            }\n    \n            for ( i = 0; i < tagsNumber; i += 1 ) {\n                this.parseExifTag( dataView, tiffOffset,\n                        dirOffset + 2 + 12 * i,    // tag offset\n                        littleEndian, data );\n            }\n    \n            // Return the offset to the next directory:\n            return dataView.getUint32( dirEndOffset, littleEndian );\n        };\n    \n        // EXIF.getExifThumbnail = function(dataView, offset, length) {\n        //     var hexData,\n        //         i,\n        //         b;\n        //     if (!length || offset + length > dataView.byteLength) {\n        //         Base.log('Invalid Exif data: Invalid thumbnail data.');\n        //         return;\n        //     }\n        //     hexData = [];\n        //     for (i = 0; i < length; i += 1) {\n        //         b = dataView.getUint8(offset + i);\n        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));\n        //     }\n        //     return 'data:image/jpeg,%' + hexData.join('%');\n        // };\n    \n        EXIF.parseExifData = function( dataView, offset, length, data ) {\n    \n            var tiffOffset = offset + 10,\n                littleEndian, dirOffset;\n    \n            // Check for the ASCII code for \"Exif\" (0x45786966):\n            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {\n                // No Exif data, might be XMP data instead\n                return;\n            }\n            if ( tiffOffset + 8 > dataView.byteLength ) {\n                Base.log('Invalid Exif data: Invalid segment size.');\n                return;\n            }\n    \n            // Check for the two null bytes:\n            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {\n                Base.log('Invalid Exif data: Missing byte alignment offset.');\n                return;\n            }\n    \n            // Check the byte alignment:\n            switch ( dataView.getUint16( tiffOffset ) ) {\n                case 0x4949:\n                    littleEndian = true;\n                    break;\n    \n                case 0x4D4D:\n                    littleEndian = false;\n                    break;\n    \n                default:\n                    Base.log('Invalid Exif data: Invalid byte alignment marker.');\n                    return;\n            }\n    \n            // Check for the TIFF tag marker (0x002A):\n            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {\n                Base.log('Invalid Exif data: Missing TIFF marker.');\n                return;\n            }\n    \n            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:\n            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );\n            // Create the exif object to store the tags:\n            data.exif = new EXIF.ExifMap();\n            // Parse the tags of the main image directory and retrieve the\n            // offset to the next directory, usually the thumbnail directory:\n            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,\n                    tiffOffset + dirOffset, littleEndian, data );\n    \n            // 尝试读取缩略图\n            // if ( dirOffset ) {\n            //     thumbnailData = {exif: {}};\n            //     dirOffset = EXIF.parseExifTags(\n            //         dataView,\n            //         tiffOffset,\n            //         tiffOffset + dirOffset,\n            //         littleEndian,\n            //         thumbnailData\n            //     );\n    \n            //     // Check for JPEG Thumbnail offset:\n            //     if (thumbnailData.exif[0x0201]) {\n            //         data.exif.Thumbnail = EXIF.getExifThumbnail(\n            //             dataView,\n            //             tiffOffset + thumbnailData.exif[0x0201],\n            //             thumbnailData.exif[0x0202] // Thumbnail data length\n            //         );\n            //     }\n            // }\n        };\n    \n        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );\n        return EXIF;\n    });\n    /**\n     * 这个方式性能不行，但是可以解决android里面的toDataUrl的bug\n     * android里面toDataUrl('image/jpege')得到的结果却是png.\n     *\n     * 所以这里没辙，只能借助这个工具\n     * @fileOverview jpeg encoder\n     */\n    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {\n    \n        /*\n          Copyright (c) 2008, Adobe Systems Incorporated\n          All rights reserved.\n    \n          Redistribution and use in source and binary forms, with or without\n          modification, are permitted provided that the following conditions are\n          met:\n    \n          * Redistributions of source code must retain the above copyright notice,\n            this list of conditions and the following disclaimer.\n    \n          * Redistributions in binary form must reproduce the above copyright\n            notice, this list of conditions and the following disclaimer in the\n            documentation and/or other materials provided with the distribution.\n    \n          * Neither the name of Adobe Systems Incorporated nor the names of its\n            contributors may be used to endorse or promote products derived from\n            this software without specific prior written permission.\n    \n          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n          IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n        */\n        /*\n        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009\n    \n        Basic GUI blocking jpeg encoder\n        */\n    \n        function JPEGEncoder(quality) {\n          var self = this;\n            var fround = Math.round;\n            var ffloor = Math.floor;\n            var YTable = new Array(64);\n            var UVTable = new Array(64);\n            var fdtbl_Y = new Array(64);\n            var fdtbl_UV = new Array(64);\n            var YDC_HT;\n            var UVDC_HT;\n            var YAC_HT;\n            var UVAC_HT;\n    \n            var bitcode = new Array(65535);\n            var category = new Array(65535);\n            var outputfDCTQuant = new Array(64);\n            var DU = new Array(64);\n            var byteout = [];\n            var bytenew = 0;\n            var bytepos = 7;\n    \n            var YDU = new Array(64);\n            var UDU = new Array(64);\n            var VDU = new Array(64);\n            var clt = new Array(256);\n            var RGB_YUV_TABLE = new Array(2048);\n            var currentQuality;\n    \n            var ZigZag = [\n                     0, 1, 5, 6,14,15,27,28,\n                     2, 4, 7,13,16,26,29,42,\n                     3, 8,12,17,25,30,41,43,\n                     9,11,18,24,31,40,44,53,\n                    10,19,23,32,39,45,52,54,\n                    20,22,33,38,46,51,55,60,\n                    21,34,37,47,50,56,59,61,\n                    35,36,48,49,57,58,62,63\n                ];\n    \n            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];\n            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];\n            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];\n            var std_ac_luminance_values = [\n                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,\n                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,\n                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,\n                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,\n                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,\n                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,\n                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,\n                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,\n                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,\n                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,\n                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,\n                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,\n                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,\n                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,\n                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,\n                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,\n                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,\n                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,\n                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,\n                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,\n                    0xf9,0xfa\n                ];\n    \n            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];\n            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];\n            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];\n            var std_ac_chrominance_values = [\n                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,\n                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,\n                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,\n                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,\n                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,\n                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,\n                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,\n                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,\n                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,\n                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,\n                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,\n                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,\n                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,\n                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,\n                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,\n                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,\n                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,\n                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,\n                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,\n                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,\n                    0xf9,0xfa\n                ];\n    \n            function initQuantTables(sf){\n                    var YQT = [\n                        16, 11, 10, 16, 24, 40, 51, 61,\n                        12, 12, 14, 19, 26, 58, 60, 55,\n                        14, 13, 16, 24, 40, 57, 69, 56,\n                        14, 17, 22, 29, 51, 87, 80, 62,\n                        18, 22, 37, 56, 68,109,103, 77,\n                        24, 35, 55, 64, 81,104,113, 92,\n                        49, 64, 78, 87,103,121,120,101,\n                        72, 92, 95, 98,112,100,103, 99\n                    ];\n    \n                    for (var i = 0; i < 64; i++) {\n                        var t = ffloor((YQT[i]*sf+50)/100);\n                        if (t < 1) {\n                            t = 1;\n                        } else if (t > 255) {\n                            t = 255;\n                        }\n                        YTable[ZigZag[i]] = t;\n                    }\n                    var UVQT = [\n                        17, 18, 24, 47, 99, 99, 99, 99,\n                        18, 21, 26, 66, 99, 99, 99, 99,\n                        24, 26, 56, 99, 99, 99, 99, 99,\n                        47, 66, 99, 99, 99, 99, 99, 99,\n                        99, 99, 99, 99, 99, 99, 99, 99,\n                        99, 99, 99, 99, 99, 99, 99, 99,\n                        99, 99, 99, 99, 99, 99, 99, 99,\n                        99, 99, 99, 99, 99, 99, 99, 99\n                    ];\n                    for (var j = 0; j < 64; j++) {\n                        var u = ffloor((UVQT[j]*sf+50)/100);\n                        if (u < 1) {\n                            u = 1;\n                        } else if (u > 255) {\n                            u = 255;\n                        }\n                        UVTable[ZigZag[j]] = u;\n                    }\n                    var aasf = [\n                        1.0, 1.387039845, 1.306562965, 1.175875602,\n                        1.0, 0.785694958, 0.541196100, 0.275899379\n                    ];\n                    var k = 0;\n                    for (var row = 0; row < 8; row++)\n                    {\n                        for (var col = 0; col < 8; col++)\n                        {\n                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));\n                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));\n                            k++;\n                        }\n                    }\n                }\n    \n                function computeHuffmanTbl(nrcodes, std_table){\n                    var codevalue = 0;\n                    var pos_in_table = 0;\n                    var HT = new Array();\n                    for (var k = 1; k <= 16; k++) {\n                        for (var j = 1; j <= nrcodes[k]; j++) {\n                            HT[std_table[pos_in_table]] = [];\n                            HT[std_table[pos_in_table]][0] = codevalue;\n                            HT[std_table[pos_in_table]][1] = k;\n                            pos_in_table++;\n                            codevalue++;\n                        }\n                        codevalue*=2;\n                    }\n                    return HT;\n                }\n    \n                function initHuffmanTbl()\n                {\n                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);\n                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);\n                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);\n                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);\n                }\n    \n                function initCategoryNumber()\n                {\n                    var nrlower = 1;\n                    var nrupper = 2;\n                    for (var cat = 1; cat <= 15; cat++) {\n                        //Positive numbers\n                        for (var nr = nrlower; nr<nrupper; nr++) {\n                            category[32767+nr] = cat;\n                            bitcode[32767+nr] = [];\n                            bitcode[32767+nr][1] = cat;\n                            bitcode[32767+nr][0] = nr;\n                        }\n                        //Negative numbers\n                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {\n                            category[32767+nrneg] = cat;\n                            bitcode[32767+nrneg] = [];\n                            bitcode[32767+nrneg][1] = cat;\n                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;\n                        }\n                        nrlower <<= 1;\n                        nrupper <<= 1;\n                    }\n                }\n    \n                function initRGBYUVTable() {\n                    for(var i = 0; i < 256;i++) {\n                        RGB_YUV_TABLE[i]            =  19595 * i;\n                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;\n                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;\n                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;\n                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;\n                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;\n                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;\n                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;\n                    }\n                }\n    \n                // IO functions\n                function writeBits(bs)\n                {\n                    var value = bs[0];\n                    var posval = bs[1]-1;\n                    while ( posval >= 0 ) {\n                        if (value & (1 << posval) ) {\n                            bytenew |= (1 << bytepos);\n                        }\n                        posval--;\n                        bytepos--;\n                        if (bytepos < 0) {\n                            if (bytenew == 0xFF) {\n                                writeByte(0xFF);\n                                writeByte(0);\n                            }\n                            else {\n                                writeByte(bytenew);\n                            }\n                            bytepos=7;\n                            bytenew=0;\n                        }\n                    }\n                }\n    \n                function writeByte(value)\n                {\n                    byteout.push(clt[value]); // write char directly instead of converting later\n                }\n    \n                function writeWord(value)\n                {\n                    writeByte((value>>8)&0xFF);\n                    writeByte((value   )&0xFF);\n                }\n    \n                // DCT & quantization core\n                function fDCTQuant(data, fdtbl)\n                {\n                    var d0, d1, d2, d3, d4, d5, d6, d7;\n                    /* Pass 1: process rows. */\n                    var dataOff=0;\n                    var i;\n                    var I8 = 8;\n                    var I64 = 64;\n                    for (i=0; i<I8; ++i)\n                    {\n                        d0 = data[dataOff];\n                        d1 = data[dataOff+1];\n                        d2 = data[dataOff+2];\n                        d3 = data[dataOff+3];\n                        d4 = data[dataOff+4];\n                        d5 = data[dataOff+5];\n                        d6 = data[dataOff+6];\n                        d7 = data[dataOff+7];\n    \n                        var tmp0 = d0 + d7;\n                        var tmp7 = d0 - d7;\n                        var tmp1 = d1 + d6;\n                        var tmp6 = d1 - d6;\n                        var tmp2 = d2 + d5;\n                        var tmp5 = d2 - d5;\n                        var tmp3 = d3 + d4;\n                        var tmp4 = d3 - d4;\n    \n                        /* Even part */\n                        var tmp10 = tmp0 + tmp3;    /* phase 2 */\n                        var tmp13 = tmp0 - tmp3;\n                        var tmp11 = tmp1 + tmp2;\n                        var tmp12 = tmp1 - tmp2;\n    \n                        data[dataOff] = tmp10 + tmp11; /* phase 3 */\n                        data[dataOff+4] = tmp10 - tmp11;\n    \n                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */\n                        data[dataOff+2] = tmp13 + z1; /* phase 5 */\n                        data[dataOff+6] = tmp13 - z1;\n    \n                        /* Odd part */\n                        tmp10 = tmp4 + tmp5; /* phase 2 */\n                        tmp11 = tmp5 + tmp6;\n                        tmp12 = tmp6 + tmp7;\n    \n                        /* The rotator is modified from fig 4-8 to avoid extra negations. */\n                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */\n                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */\n                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */\n                        var z3 = tmp11 * 0.707106781; /* c4 */\n    \n                        var z11 = tmp7 + z3;    /* phase 5 */\n                        var z13 = tmp7 - z3;\n    \n                        data[dataOff+5] = z13 + z2; /* phase 6 */\n                        data[dataOff+3] = z13 - z2;\n                        data[dataOff+1] = z11 + z4;\n                        data[dataOff+7] = z11 - z4;\n    \n                        dataOff += 8; /* advance pointer to next row */\n                    }\n    \n                    /* Pass 2: process columns. */\n                    dataOff = 0;\n                    for (i=0; i<I8; ++i)\n                    {\n                        d0 = data[dataOff];\n                        d1 = data[dataOff + 8];\n                        d2 = data[dataOff + 16];\n                        d3 = data[dataOff + 24];\n                        d4 = data[dataOff + 32];\n                        d5 = data[dataOff + 40];\n                        d6 = data[dataOff + 48];\n                        d7 = data[dataOff + 56];\n    \n                        var tmp0p2 = d0 + d7;\n                        var tmp7p2 = d0 - d7;\n                        var tmp1p2 = d1 + d6;\n                        var tmp6p2 = d1 - d6;\n                        var tmp2p2 = d2 + d5;\n                        var tmp5p2 = d2 - d5;\n                        var tmp3p2 = d3 + d4;\n                        var tmp4p2 = d3 - d4;\n    \n                        /* Even part */\n                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */\n                        var tmp13p2 = tmp0p2 - tmp3p2;\n                        var tmp11p2 = tmp1p2 + tmp2p2;\n                        var tmp12p2 = tmp1p2 - tmp2p2;\n    \n                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */\n                        data[dataOff+32] = tmp10p2 - tmp11p2;\n    \n                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */\n                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */\n                        data[dataOff+48] = tmp13p2 - z1p2;\n    \n                        /* Odd part */\n                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */\n                        tmp11p2 = tmp5p2 + tmp6p2;\n                        tmp12p2 = tmp6p2 + tmp7p2;\n    \n                        /* The rotator is modified from fig 4-8 to avoid extra negations. */\n                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */\n                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */\n                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */\n                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */\n    \n                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */\n                        var z13p2 = tmp7p2 - z3p2;\n    \n                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */\n                        data[dataOff+24] = z13p2 - z2p2;\n                        data[dataOff+ 8] = z11p2 + z4p2;\n                        data[dataOff+56] = z11p2 - z4p2;\n    \n                        dataOff++; /* advance pointer to next column */\n                    }\n    \n                    // Quantize/descale the coefficients\n                    var fDCTQuant;\n                    for (i=0; i<I64; ++i)\n                    {\n                        // Apply the quantization and scaling factor & Round to nearest integer\n                        fDCTQuant = data[i]*fdtbl[i];\n                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);\n                        //outputfDCTQuant[i] = fround(fDCTQuant);\n    \n                    }\n                    return outputfDCTQuant;\n                }\n    \n                function writeAPP0()\n                {\n                    writeWord(0xFFE0); // marker\n                    writeWord(16); // length\n                    writeByte(0x4A); // J\n                    writeByte(0x46); // F\n                    writeByte(0x49); // I\n                    writeByte(0x46); // F\n                    writeByte(0); // = \"JFIF\",'\\0'\n                    writeByte(1); // versionhi\n                    writeByte(1); // versionlo\n                    writeByte(0); // xyunits\n                    writeWord(1); // xdensity\n                    writeWord(1); // ydensity\n                    writeByte(0); // thumbnwidth\n                    writeByte(0); // thumbnheight\n                }\n    \n                function writeSOF0(width, height)\n                {\n                    writeWord(0xFFC0); // marker\n                    writeWord(17);   // length, truecolor YUV JPG\n                    writeByte(8);    // precision\n                    writeWord(height);\n                    writeWord(width);\n                    writeByte(3);    // nrofcomponents\n                    writeByte(1);    // IdY\n                    writeByte(0x11); // HVY\n                    writeByte(0);    // QTY\n                    writeByte(2);    // IdU\n                    writeByte(0x11); // HVU\n                    writeByte(1);    // QTU\n                    writeByte(3);    // IdV\n                    writeByte(0x11); // HVV\n                    writeByte(1);    // QTV\n                }\n    \n                function writeDQT()\n                {\n                    writeWord(0xFFDB); // marker\n                    writeWord(132);    // length\n                    writeByte(0);\n                    for (var i=0; i<64; i++) {\n                        writeByte(YTable[i]);\n                    }\n                    writeByte(1);\n                    for (var j=0; j<64; j++) {\n                        writeByte(UVTable[j]);\n                    }\n                }\n    \n                function writeDHT()\n                {\n                    writeWord(0xFFC4); // marker\n                    writeWord(0x01A2); // length\n    \n                    writeByte(0); // HTYDCinfo\n                    for (var i=0; i<16; i++) {\n                        writeByte(std_dc_luminance_nrcodes[i+1]);\n                    }\n                    for (var j=0; j<=11; j++) {\n                        writeByte(std_dc_luminance_values[j]);\n                    }\n    \n                    writeByte(0x10); // HTYACinfo\n                    for (var k=0; k<16; k++) {\n                        writeByte(std_ac_luminance_nrcodes[k+1]);\n                    }\n                    for (var l=0; l<=161; l++) {\n                        writeByte(std_ac_luminance_values[l]);\n                    }\n    \n                    writeByte(1); // HTUDCinfo\n                    for (var m=0; m<16; m++) {\n                        writeByte(std_dc_chrominance_nrcodes[m+1]);\n                    }\n                    for (var n=0; n<=11; n++) {\n                        writeByte(std_dc_chrominance_values[n]);\n                    }\n    \n                    writeByte(0x11); // HTUACinfo\n                    for (var o=0; o<16; o++) {\n                        writeByte(std_ac_chrominance_nrcodes[o+1]);\n                    }\n                    for (var p=0; p<=161; p++) {\n                        writeByte(std_ac_chrominance_values[p]);\n                    }\n                }\n    \n                function writeSOS()\n                {\n                    writeWord(0xFFDA); // marker\n                    writeWord(12); // length\n                    writeByte(3); // nrofcomponents\n                    writeByte(1); // IdY\n                    writeByte(0); // HTY\n                    writeByte(2); // IdU\n                    writeByte(0x11); // HTU\n                    writeByte(3); // IdV\n                    writeByte(0x11); // HTV\n                    writeByte(0); // Ss\n                    writeByte(0x3f); // Se\n                    writeByte(0); // Bf\n                }\n    \n                function processDU(CDU, fdtbl, DC, HTDC, HTAC){\n                    var EOB = HTAC[0x00];\n                    var M16zeroes = HTAC[0xF0];\n                    var pos;\n                    var I16 = 16;\n                    var I63 = 63;\n                    var I64 = 64;\n                    var DU_DCT = fDCTQuant(CDU, fdtbl);\n                    //ZigZag reorder\n                    for (var j=0;j<I64;++j) {\n                        DU[ZigZag[j]]=DU_DCT[j];\n                    }\n                    var Diff = DU[0] - DC; DC = DU[0];\n                    //Encode DC\n                    if (Diff==0) {\n                        writeBits(HTDC[0]); // Diff might be 0\n                    } else {\n                        pos = 32767+Diff;\n                        writeBits(HTDC[category[pos]]);\n                        writeBits(bitcode[pos]);\n                    }\n                    //Encode ACs\n                    var end0pos = 63; // was const... which is crazy\n                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};\n                    //end0pos = first element in reverse order !=0\n                    if ( end0pos == 0) {\n                        writeBits(EOB);\n                        return DC;\n                    }\n                    var i = 1;\n                    var lng;\n                    while ( i <= end0pos ) {\n                        var startpos = i;\n                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}\n                        var nrzeroes = i-startpos;\n                        if ( nrzeroes >= I16 ) {\n                            lng = nrzeroes>>4;\n                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)\n                                writeBits(M16zeroes);\n                            nrzeroes = nrzeroes&0xF;\n                        }\n                        pos = 32767+DU[i];\n                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);\n                        writeBits(bitcode[pos]);\n                        i++;\n                    }\n                    if ( end0pos != I63 ) {\n                        writeBits(EOB);\n                    }\n                    return DC;\n                }\n    \n                function initCharLookupTable(){\n                    var sfcc = String.fromCharCode;\n                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255\n                        clt[i] = sfcc(i);\n                    }\n                }\n    \n                this.encode = function(image,quality) // image data object\n                {\n                    // var time_start = new Date().getTime();\n    \n                    if(quality) setQuality(quality);\n    \n                    // Initialize bit writer\n                    byteout = new Array();\n                    bytenew=0;\n                    bytepos=7;\n    \n                    // Add JPEG headers\n                    writeWord(0xFFD8); // SOI\n                    writeAPP0();\n                    writeDQT();\n                    writeSOF0(image.width,image.height);\n                    writeDHT();\n                    writeSOS();\n    \n    \n                    // Encode 8x8 macroblocks\n                    var DCY=0;\n                    var DCU=0;\n                    var DCV=0;\n    \n                    bytenew=0;\n                    bytepos=7;\n    \n    \n                    this.encode.displayName = \"_encode_\";\n    \n                    var imageData = image.data;\n                    var width = image.width;\n                    var height = image.height;\n    \n                    var quadWidth = width*4;\n                    var tripleWidth = width*3;\n    \n                    var x, y = 0;\n                    var r, g, b;\n                    var start,p, col,row,pos;\n                    while(y < height){\n                        x = 0;\n                        while(x < quadWidth){\n                        start = quadWidth * y + x;\n                        p = start;\n                        col = -1;\n                        row = 0;\n    \n                        for(pos=0; pos < 64; pos++){\n                            row = pos >> 3;// /8\n                            col = ( pos & 7 ) * 4; // %8\n                            p = start + ( row * quadWidth ) + col;\n    \n                            if(y+row >= height){ // padding bottom\n                                p-= (quadWidth*(y+1+row-height));\n                            }\n    \n                            if(x+col >= quadWidth){ // padding right\n                                p-= ((x+col) - quadWidth +4)\n                            }\n    \n                            r = imageData[ p++ ];\n                            g = imageData[ p++ ];\n                            b = imageData[ p++ ];\n    \n    \n                            /* // calculate YUV values dynamically\n                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80\n                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));\n                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));\n                            */\n    \n                            // use lookup table (slightly faster)\n                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;\n                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;\n                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;\n    \n                        }\n    \n                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);\n                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);\n                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);\n                        x+=32;\n                        }\n                        y+=8;\n                    }\n    \n    \n                    ////////////////////////////////////////////////////////////////\n    \n                    // Do the bit alignment of the EOI marker\n                    if ( bytepos >= 0 ) {\n                        var fillbits = [];\n                        fillbits[1] = bytepos+1;\n                        fillbits[0] = (1<<(bytepos+1))-1;\n                        writeBits(fillbits);\n                    }\n    \n                    writeWord(0xFFD9); //EOI\n    \n                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));\n    \n                    byteout = [];\n    \n                    // benchmarking\n                    // var duration = new Date().getTime() - time_start;\n                    // console.log('Encoding time: '+ currentQuality + 'ms');\n                    //\n    \n                    return jpegDataUri\n            }\n    \n            function setQuality(quality){\n                if (quality <= 0) {\n                    quality = 1;\n                }\n                if (quality > 100) {\n                    quality = 100;\n                }\n    \n                if(currentQuality == quality) return // don't recalc if unchanged\n    \n                var sf = 0;\n                if (quality < 50) {\n                    sf = Math.floor(5000 / quality);\n                } else {\n                    sf = Math.floor(200 - quality*2);\n                }\n    \n                initQuantTables(sf);\n                currentQuality = quality;\n                // console.log('Quality set to: '+quality +'%');\n            }\n    \n            function init(){\n                // var time_start = new Date().getTime();\n                if(!quality) quality = 50;\n                // Create tables\n                initCharLookupTable()\n                initHuffmanTbl();\n                initCategoryNumber();\n                initRGBYUVTable();\n    \n                setQuality(quality);\n                // var duration = new Date().getTime() - time_start;\n                // console.log('Initialization '+ duration + 'ms');\n            }\n    \n            init();\n    \n        };\n    \n        JPEGEncoder.encode = function( data, quality ) {\n            var encoder = new JPEGEncoder( quality );\n    \n            return encoder.encode( data );\n        }\n    \n        return JPEGEncoder;\n    });\n    /**\n     * @fileOverview Fix android canvas.toDataUrl bug.\n     */\n    define('runtime/html5/androidpatch',[\n        'runtime/html5/util',\n        'runtime/html5/jpegencoder',\n        'base'\n    ], function( Util, encoder, Base ) {\n        var origin = Util.canvasToDataUrl,\n            supportJpeg;\n    \n        Util.canvasToDataUrl = function( canvas, type, quality ) {\n            var ctx, w, h, fragement, parts;\n    \n            // 非android手机直接跳过。\n            if ( !Base.os.android ) {\n                return origin.apply( null, arguments );\n            }\n    \n            // 检测是否canvas支持jpeg导出，根据数据格式来判断。\n            // JPEG 前两位分别是：255, 216\n            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {\n                fragement = origin.apply( null, arguments );\n    \n                parts = fragement.split(',');\n    \n                if ( ~parts[ 0 ].indexOf('base64') ) {\n                    fragement = atob( parts[ 1 ] );\n                } else {\n                    fragement = decodeURIComponent( parts[ 1 ] );\n                }\n    \n                fragement = fragement.substring( 0, 2 );\n    \n                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&\n                        fragement.charCodeAt( 1 ) === 216;\n            }\n    \n            // 只有在android环境下才修复\n            if ( type === 'image/jpeg' && !supportJpeg ) {\n                w = canvas.width;\n                h = canvas.height;\n                ctx = canvas.getContext('2d');\n    \n                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );\n            }\n    \n            return origin.apply( null, arguments );\n        };\n    });\n    /**\n     * @fileOverview Image\n     */\n    define('runtime/html5/image',[\n        'base',\n        'runtime/html5/runtime',\n        'runtime/html5/util'\n    ], function( Base, Html5Runtime, Util ) {\n    \n        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';\n    \n        return Html5Runtime.register( 'Image', {\n    \n            // flag: 标记是否被修改过。\n            modified: false,\n    \n            init: function() {\n                var me = this,\n                    img = new Image();\n    \n                img.onload = function() {\n    \n                    me._info = {\n                        type: me.type,\n                        width: this.width,\n                        height: this.height\n                    };\n    \n                    // 读取meta信息。\n                    if ( !me._metas && 'image/jpeg' === me.type ) {\n                        Util.parseMeta( me._blob, function( error, ret ) {\n                            me._metas = ret;\n                            me.owner.trigger('load');\n                        });\n                    } else {\n                        me.owner.trigger('load');\n                    }\n                };\n    \n                img.onerror = function() {\n                    me.owner.trigger('error');\n                };\n    \n                me._img = img;\n            },\n    \n            loadFromBlob: function( blob ) {\n                var me = this,\n                    img = me._img;\n    \n                me._blob = blob;\n                me.type = blob.type;\n                img.src = Util.createObjectURL( blob.getSource() );\n                me.owner.once( 'load', function() {\n                    Util.revokeObjectURL( img.src );\n                });\n            },\n    \n            resize: function( width, height ) {\n                var canvas = this._canvas ||\n                        (this._canvas = document.createElement('canvas'));\n    \n                this._resize( this._img, canvas, width, height );\n                this._blob = null;    // 没用了，可以删掉了。\n                this.modified = true;\n                this.owner.trigger('complete');\n            },\n    \n            getAsBlob: function( type ) {\n                var blob = this._blob,\n                    opts = this.options,\n                    canvas;\n    \n                type = type || this.type;\n    \n                // blob需要重新生成。\n                if ( this.modified || this.type !== type ) {\n                    canvas = this._canvas;\n    \n                    if ( type === 'image/jpeg' ) {\n    \n                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',\n                                opts.quality );\n    \n                        if ( opts.preserveHeaders && this._metas &&\n                                this._metas.imageHead ) {\n    \n                            blob = Util.dataURL2ArrayBuffer( blob );\n                            blob = Util.updateImageHead( blob,\n                                    this._metas.imageHead );\n                            blob = Util.arrayBufferToBlob( blob, type );\n                            return blob;\n                        }\n                    } else {\n                        blob = Util.canvasToDataUrl( canvas, type );\n                    }\n    \n                    blob = Util.dataURL2Blob( blob );\n                }\n    \n                return blob;\n            },\n    \n            getAsDataUrl: function( type ) {\n                var opts = this.options;\n    \n                type = type || this.type;\n    \n                if ( type === 'image/jpeg' ) {\n                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );\n                } else {\n                    return this._canvas.toDataURL( type );\n                }\n            },\n    \n            getOrientation: function() {\n                return this._metas && this._metas.exif &&\n                        this._metas.exif.get('Orientation') || 1;\n            },\n    \n            info: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._info = val;\n                    return this;\n                }\n    \n                // getter\n                return this._info;\n            },\n    \n            meta: function( val ) {\n    \n                // setter\n                if ( val ) {\n                    this._meta = val;\n                    return this;\n                }\n    \n                // getter\n                return this._meta;\n            },\n    \n            destroy: function() {\n                var canvas = this._canvas;\n                this._img.onload = null;\n    \n                if ( canvas ) {\n                    canvas.getContext('2d')\n                            .clearRect( 0, 0, canvas.width, canvas.height );\n                    canvas.width = canvas.height = 0;\n                    this._canvas = null;\n                }\n    \n                // 释放内存。非常重要，否则释放不了image的内存。\n                this._img.src = BLANK;\n                this._img = this._blob = null;\n            },\n    \n            _resize: function( img, cvs, width, height ) {\n                var opts = this.options,\n                    naturalWidth = img.width,\n                    naturalHeight = img.height,\n                    orientation = this.getOrientation(),\n                    scale, w, h, x, y;\n    \n                // values that require 90 degree rotation\n                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {\n    \n                    // 交换width, height的值。\n                    width ^= height;\n                    height ^= width;\n                    width ^= height;\n                }\n    \n                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,\n                        height / naturalHeight );\n    \n                // 不允许放大。\n                opts.allowMagnify || (scale = Math.min( 1, scale ));\n    \n                w = naturalWidth * scale;\n                h = naturalHeight * scale;\n    \n                if ( opts.crop ) {\n                    cvs.width = width;\n                    cvs.height = height;\n                } else {\n                    cvs.width = w;\n                    cvs.height = h;\n                }\n    \n                x = (cvs.width - w) / 2;\n                y = (cvs.height - h) / 2;\n    \n                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );\n    \n                this._renderImageToCanvas( cvs, img, x, y, w, h );\n            },\n    \n            _rotate2Orientaion: function( canvas, orientation ) {\n                var width = canvas.width,\n                    height = canvas.height,\n                    ctx = canvas.getContext('2d');\n    \n                switch ( orientation ) {\n                    case 5:\n                    case 6:\n                    case 7:\n                    case 8:\n                        canvas.width = height;\n                        canvas.height = width;\n                        break;\n                }\n    \n                switch ( orientation ) {\n                    case 2:    // horizontal flip\n                        ctx.translate( width, 0 );\n                        ctx.scale( -1, 1 );\n                        break;\n    \n                    case 3:    // 180 rotate left\n                        ctx.translate( width, height );\n                        ctx.rotate( Math.PI );\n                        break;\n    \n                    case 4:    // vertical flip\n                        ctx.translate( 0, height );\n                        ctx.scale( 1, -1 );\n                        break;\n    \n                    case 5:    // vertical flip + 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.scale( 1, -1 );\n                        break;\n    \n                    case 6:    // 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.translate( 0, -height );\n                        break;\n    \n                    case 7:    // horizontal flip + 90 rotate right\n                        ctx.rotate( 0.5 * Math.PI );\n                        ctx.translate( width, -height );\n                        ctx.scale( -1, 1 );\n                        break;\n    \n                    case 8:    // 90 rotate left\n                        ctx.rotate( -0.5 * Math.PI );\n                        ctx.translate( -width, 0 );\n                        break;\n                }\n            },\n    \n            // https://github.com/stomita/ios-imagefile-megapixel/\n            // blob/master/src/megapix-image.js\n            _renderImageToCanvas: (function() {\n    \n                // 如果不是ios, 不需要这么复杂！\n                if ( !Base.os.ios ) {\n                    return function( canvas, img, x, y, w, h ) {\n                        canvas.getContext('2d').drawImage( img, x, y, w, h );\n                    };\n                }\n    \n                /**\n                 * Detecting vertical squash in loaded image.\n                 * Fixes a bug which squash image vertically while drawing into\n                 * canvas for some images.\n                 */\n                function detectVerticalSquash( img, iw, ih ) {\n                    var canvas = document.createElement('canvas'),\n                        ctx = canvas.getContext('2d'),\n                        sy = 0,\n                        ey = ih,\n                        py = ih,\n                        data, alpha, ratio;\n    \n    \n                    canvas.width = 1;\n                    canvas.height = ih;\n                    ctx.drawImage( img, 0, 0 );\n                    data = ctx.getImageData( 0, 0, 1, ih ).data;\n    \n                    // search image edge pixel position in case\n                    // it is squashed vertically.\n                    while ( py > sy ) {\n                        alpha = data[ (py - 1) * 4 + 3 ];\n    \n                        if ( alpha === 0 ) {\n                            ey = py;\n                        } else {\n                            sy = py;\n                        }\n    \n                        py = (ey + sy) >> 1;\n                    }\n    \n                    ratio = (py / ih);\n                    return (ratio === 0) ? 1 : ratio;\n                }\n    \n                // fix ie7 bug\n                // http://stackoverflow.com/questions/11929099/\n                // html5-canvas-drawimage-ratio-bug-ios\n                if ( Base.os.ios >= 7 ) {\n                    return function( canvas, img, x, y, w, h ) {\n                        var iw = img.naturalWidth,\n                            ih = img.naturalHeight,\n                            vertSquashRatio = detectVerticalSquash( img, iw, ih );\n    \n                        return canvas.getContext('2d').drawImage( img, 0, 0,\n                            iw * vertSquashRatio, ih * vertSquashRatio,\n                            x, y, w, h );\n                    };\n                }\n    \n                /**\n                 * Detect subsampling in loaded image.\n                 * In iOS, larger images than 2M pixels may be\n                 * subsampled in rendering.\n                 */\n                function detectSubsampling( img ) {\n                    var iw = img.naturalWidth,\n                        ih = img.naturalHeight,\n                        canvas, ctx;\n    \n                    // subsampling may happen overmegapixel image\n                    if ( iw * ih > 1024 * 1024 ) {\n                        canvas = document.createElement('canvas');\n                        canvas.width = canvas.height = 1;\n                        ctx = canvas.getContext('2d');\n                        ctx.drawImage( img, -iw + 1, 0 );\n    \n                        // subsampled image becomes half smaller in rendering size.\n                        // check alpha channel value to confirm image is covering\n                        // edge pixel or not. if alpha value is 0\n                        // image is not covering, hence subsampled.\n                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;\n                    } else {\n                        return false;\n                    }\n                }\n    \n    \n                return function( canvas, img, x, y, width, height ) {\n                    var iw = img.naturalWidth,\n                        ih = img.naturalHeight,\n                        ctx = canvas.getContext('2d'),\n                        subsampled = detectSubsampling( img ),\n                        doSquash = this.type === 'image/jpeg',\n                        d = 1024,\n                        sy = 0,\n                        dy = 0,\n                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;\n    \n                    if ( subsampled ) {\n                        iw /= 2;\n                        ih /= 2;\n                    }\n    \n                    ctx.save();\n                    tmpCanvas = document.createElement('canvas');\n                    tmpCanvas.width = tmpCanvas.height = d;\n    \n                    tmpCtx = tmpCanvas.getContext('2d');\n                    vertSquashRatio = doSquash ?\n                            detectVerticalSquash( img, iw, ih ) : 1;\n    \n                    dw = Math.ceil( d * width / iw );\n                    dh = Math.ceil( d * height / ih / vertSquashRatio );\n    \n                    while ( sy < ih ) {\n                        sx = 0;\n                        dx = 0;\n                        while ( sx < iw ) {\n                            tmpCtx.clearRect( 0, 0, d, d );\n                            tmpCtx.drawImage( img, -sx, -sy );\n                            ctx.drawImage( tmpCanvas, 0, 0, d, d,\n                                    x + dx, y + dy, dw, dh );\n                            sx += d;\n                            dx += dw;\n                        }\n                        sy += d;\n                        dy += dh;\n                    }\n                    ctx.restore();\n                    tmpCanvas = tmpCtx = null;\n                };\n            })()\n        });\n    });\n    /**\n     * @fileOverview Transport\n     * @todo 支持chunked传输，优势：\n     * 可以将大文件分成小块，挨个传输，可以提高大文件成功率，当失败的时候，也只需要重传那小部分，\n     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。\n     */\n    define('runtime/html5/transport',[\n        'base',\n        'runtime/html5/runtime'\n    ], function( Base, Html5Runtime ) {\n    \n        var noop = Base.noop,\n            $ = Base.$;\n    \n        return Html5Runtime.register( 'Transport', {\n            init: function() {\n                this._status = 0;\n                this._response = null;\n            },\n    \n            send: function() {\n                var owner = this.owner,\n                    opts = this.options,\n                    xhr = this._initAjax(),\n                    blob = owner._blob,\n                    server = opts.server,\n                    formData, binary, fr;\n    \n                if ( opts.sendAsBinary ) {\n                    server += (/\\?/.test( server ) ? '&' : '?') +\n                            $.param( owner._formData );\n    \n                    binary = blob.getSource();\n                } else {\n                    formData = new FormData();\n                    $.each( owner._formData, function( k, v ) {\n                        formData.append( k, v );\n                    });\n    \n                    formData.append( opts.fileVal, blob.getSource(),\n                            opts.filename || owner._formData.name || '' );\n                }\n    \n                if ( opts.withCredentials && 'withCredentials' in xhr ) {\n                    xhr.open( opts.method, server, true );\n                    xhr.withCredentials = true;\n                } else {\n                    xhr.open( opts.method, server );\n                }\n    \n                this._setRequestHeader( xhr, opts.headers );\n    \n                if ( binary ) {\n                    xhr.overrideMimeType('application/octet-stream');\n    \n                    // android直接发送blob会导致服务端接收到的是空文件。\n                    // bug详情。\n                    // https://code.google.com/p/android/issues/detail?id=39882\n                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。\n                    if ( Base.os.android ) {\n                        fr = new FileReader();\n    \n                        fr.onload = function() {\n                            xhr.send( this.result );\n                            fr = fr.onload = null;\n                        };\n    \n                        fr.readAsArrayBuffer( binary );\n                    } else {\n                        xhr.send( binary );\n                    }\n                } else {\n                    xhr.send( formData );\n                }\n            },\n    \n            getResponse: function() {\n                return this._response;\n            },\n    \n            getResponseAsJson: function() {\n                return this._parseJson( this._response );\n            },\n    \n            getStatus: function() {\n                return this._status;\n            },\n    \n            abort: function() {\n                var xhr = this._xhr;\n    \n                if ( xhr ) {\n                    xhr.upload.onprogress = noop;\n                    xhr.onreadystatechange = noop;\n                    xhr.abort();\n    \n                    this._xhr = xhr = null;\n                }\n            },\n    \n            destroy: function() {\n                this.abort();\n            },\n    \n            _initAjax: function() {\n                var me = this,\n                    xhr = new XMLHttpRequest(),\n                    opts = this.options;\n    \n                if ( opts.withCredentials && !('withCredentials' in xhr) &&\n                        typeof XDomainRequest !== 'undefined' ) {\n                    xhr = new XDomainRequest();\n                }\n    \n                xhr.upload.onprogress = function( e ) {\n                    var percentage = 0;\n    \n                    if ( e.lengthComputable ) {\n                        percentage = e.loaded / e.total;\n                    }\n    \n                    return me.trigger( 'progress', percentage );\n                };\n    \n                xhr.onreadystatechange = function() {\n    \n                    if ( xhr.readyState !== 4 ) {\n                        return;\n                    }\n    \n                    xhr.upload.onprogress = noop;\n                    xhr.onreadystatechange = noop;\n                    me._xhr = null;\n                    me._status = xhr.status;\n    \n                    if ( xhr.status >= 200 && xhr.status < 300 ) {\n                        me._response = xhr.responseText;\n                        return me.trigger('load');\n                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {\n                        me._response = xhr.responseText;\n                        return me.trigger( 'error', 'server' );\n                    }\n    \n    \n                    return me.trigger( 'error', me._status ? 'http' : 'abort' );\n                };\n    \n                me._xhr = xhr;\n                return xhr;\n            },\n    \n            _setRequestHeader: function( xhr, headers ) {\n                $.each( headers, function( key, val ) {\n                    xhr.setRequestHeader( key, val );\n                });\n            },\n    \n            _parseJson: function( str ) {\n                var json;\n    \n                try {\n                    json = JSON.parse( str );\n                } catch ( ex ) {\n                    json = {};\n                }\n    \n                return json;\n            }\n        });\n    });\n    /**\n     * @fileOverview FlashRuntime\n     */\n    define('runtime/flash/runtime',[\n        'base',\n        'runtime/runtime',\n        'runtime/compbase'\n    ], function( Base, Runtime, CompBase ) {\n    \n        var $ = Base.$,\n            type = 'flash',\n            components = {};\n    \n    \n        function getFlashVersion() {\n            var version;\n    \n            try {\n                version = navigator.plugins[ 'Shockwave Flash' ];\n                version = version.description;\n            } catch ( ex ) {\n                try {\n                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')\n                            .GetVariable('$version');\n                } catch ( ex2 ) {\n                    version = '0.0';\n                }\n            }\n            version = version.match( /\\d+/g );\n            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );\n        }\n    \n        function FlashRuntime() {\n            var pool = {},\n                clients = {},\n                destory = this.destory,\n                me = this,\n                jsreciver = Base.guid('webuploader_');\n    \n            Runtime.apply( me, arguments );\n            me.type = type;\n    \n    \n            // 这个方法的调用者，实际上是RuntimeClient\n            me.exec = function( comp, fn/*, args...*/ ) {\n                var client = this,\n                    uid = client.uid,\n                    args = Base.slice( arguments, 2 ),\n                    instance;\n    \n                clients[ uid ] = client;\n    \n                if ( components[ comp ] ) {\n                    if ( !pool[ uid ] ) {\n                        pool[ uid ] = new components[ comp ]( client, me );\n                    }\n    \n                    instance = pool[ uid ];\n    \n                    if ( instance[ fn ] ) {\n                        return instance[ fn ].apply( instance, args );\n                    }\n                }\n    \n                return me.flashExec.apply( client, arguments );\n            };\n    \n            function handler( evt, obj ) {\n                var type = evt.type || evt,\n                    parts, uid;\n    \n                parts = type.split('::');\n                uid = parts[ 0 ];\n                type = parts[ 1 ];\n    \n                // console.log.apply( console, arguments );\n    \n                if ( type === 'Ready' && uid === me.uid ) {\n                    me.trigger('ready');\n                } else if ( clients[ uid ] ) {\n                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );\n                }\n    \n                // Base.log( evt, obj );\n            }\n    \n            // flash的接受器。\n            window[ jsreciver ] = function() {\n                var args = arguments;\n    \n                // 为了能捕获得到。\n                setTimeout(function() {\n                    handler.apply( null, args );\n                }, 1 );\n            };\n    \n            this.jsreciver = jsreciver;\n    \n            this.destory = function() {\n                // @todo 删除池子中的所有实例\n                return destory && destory.apply( this, arguments );\n            };\n    \n            this.flashExec = function( comp, fn ) {\n                var flash = me.getFlash(),\n                    args = Base.slice( arguments, 2 );\n    \n                return flash.exec( this.uid, comp, fn, args );\n            };\n    \n            // @todo\n        }\n    \n        Base.inherits( Runtime, {\n            constructor: FlashRuntime,\n    \n            init: function() {\n                var container = this.getContainer(),\n                    opts = this.options,\n                    html;\n    \n                // if not the minimal height, shims are not initialized\n                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)\n                container.css({\n                    position: 'absolute',\n                    top: '-8px',\n                    left: '-8px',\n                    width: '9px',\n                    height: '9px',\n                    overflow: 'hidden'\n                });\n    \n                // insert flash object\n                html = '<object id=\"' + this.uid + '\" type=\"application/' +\n                        'x-shockwave-flash\" data=\"' +  opts.swf + '\" ';\n    \n                if ( Base.browser.ie ) {\n                    html += 'classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" ';\n                }\n    \n                html += 'width=\"100%\" height=\"100%\" style=\"outline:0\">'  +\n                    '<param name=\"movie\" value=\"' + opts.swf + '\" />' +\n                    '<param name=\"flashvars\" value=\"uid=' + this.uid +\n                    '&jsreciver=' + this.jsreciver + '\" />' +\n                    '<param name=\"wmode\" value=\"transparent\" />' +\n                    '<param name=\"allowscriptaccess\" value=\"always\" />' +\n                '</object>';\n    \n                container.html( html );\n            },\n    \n            getFlash: function() {\n                if ( this._flash ) {\n                    return this._flash;\n                }\n    \n                this._flash = $( '#' + this.uid ).get( 0 );\n                return this._flash;\n            }\n    \n        });\n    \n        FlashRuntime.register = function( name, component ) {\n            component = components[ name ] = Base.inherits( CompBase, $.extend({\n    \n                // @todo fix this later\n                flashExec: function() {\n                    var owner = this.owner,\n                        runtime = this.getRuntime();\n    \n                    return runtime.flashExec.apply( owner, arguments );\n                }\n            }, component ) );\n    \n            return component;\n        };\n    \n        if ( getFlashVersion() >= 11.4 ) {\n            Runtime.addRuntime( type, FlashRuntime );\n        }\n    \n        return FlashRuntime;\n    });\n    /**\n     * @fileOverview FilePicker\n     */\n    define('runtime/flash/filepicker',[\n        'base',\n        'runtime/flash/runtime'\n    ], function( Base, FlashRuntime ) {\n        var $ = Base.$;\n    \n        return FlashRuntime.register( 'FilePicker', {\n            init: function( opts ) {\n                var copy = $.extend({}, opts ),\n                    len, i;\n    \n                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.\n                len = copy.accept && copy.accept.length;\n                for (  i = 0; i < len; i++ ) {\n                    if ( !copy.accept[ i ].title ) {\n                        copy.accept[ i ].title = 'Files';\n                    }\n                }\n    \n                delete copy.button;\n                delete copy.container;\n    \n                this.flashExec( 'FilePicker', 'init', copy );\n            },\n    \n            destroy: function() {\n                // todo\n            }\n        });\n    });\n    /**\n     * @fileOverview 图片压缩\n     */\n    define('runtime/flash/image',[\n        'runtime/flash/runtime'\n    ], function( FlashRuntime ) {\n    \n        return FlashRuntime.register( 'Image', {\n            // init: function( options ) {\n            //     var owner = this.owner;\n    \n            //     this.flashExec( 'Image', 'init', options );\n            //     owner.on( 'load', function() {\n            //         debugger;\n            //     });\n            // },\n    \n            loadFromBlob: function( blob ) {\n                var owner = this.owner;\n    \n                owner.info() && this.flashExec( 'Image', 'info', owner.info() );\n                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );\n    \n                this.flashExec( 'Image', 'loadFromBlob', blob.uid );\n            }\n        });\n    });\n    /**\n     * @fileOverview  Transport flash实现\n     */\n    define('runtime/flash/transport',[\n        'base',\n        'runtime/flash/runtime',\n        'runtime/client'\n    ], function( Base, FlashRuntime, RuntimeClient ) {\n        var $ = Base.$;\n    \n        return FlashRuntime.register( 'Transport', {\n            init: function() {\n                this._status = 0;\n                this._response = null;\n                this._responseJson = null;\n            },\n    \n            send: function() {\n                var owner = this.owner,\n                    opts = this.options,\n                    xhr = this._initAjax(),\n                    blob = owner._blob,\n                    server = opts.server,\n                    binary;\n    \n                xhr.connectRuntime( blob.ruid );\n    \n                if ( opts.sendAsBinary ) {\n                    server += (/\\?/.test( server ) ? '&' : '?') +\n                            $.param( owner._formData );\n    \n                    binary = blob.uid;\n                } else {\n                    $.each( owner._formData, function( k, v ) {\n                        xhr.exec( 'append', k, v );\n                    });\n    \n                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,\n                            opts.filename || owner._formData.name || '' );\n                }\n    \n                this._setRequestHeader( xhr, opts.headers );\n                xhr.exec( 'send', {\n                    method: opts.method,\n                    url: server\n                }, binary );\n            },\n    \n            getStatus: function() {\n                return this._status;\n            },\n    \n            getResponse: function() {\n                return this._response;\n            },\n    \n            getResponseAsJson: function() {\n                return this._responseJson;\n            },\n    \n            abort: function() {\n                var xhr = this._xhr;\n    \n                if ( xhr ) {\n                    xhr.exec('abort');\n                    xhr.destroy();\n                    this._xhr = xhr = null;\n                }\n            },\n    \n            destroy: function() {\n                this.abort();\n            },\n    \n            _initAjax: function() {\n                var me = this,\n                    xhr = new RuntimeClient('XMLHttpRequest');\n    \n                xhr.on( 'uploadprogress progress', function( e ) {\n                    return me.trigger( 'progress', e.loaded / e.total );\n                });\n    \n                xhr.on( 'load', function() {\n                    var status = xhr.exec('getStatus'),\n                        err = '';\n    \n                    xhr.off();\n                    me._xhr = null;\n    \n                    if ( status >= 200 && status < 300 ) {\n                        me._response = xhr.exec('getResponse');\n                        me._responseJson = xhr.exec('getResponseAsJson');\n                    } else if ( status >= 500 && status < 600 ) {\n                        me._response = xhr.exec('getResponse');\n                        me._responseJson = xhr.exec('getResponseAsJson');\n                        err = 'server';\n                    } else {\n                        err = 'http';\n                    }\n    \n                    xhr.destroy();\n                    xhr = null;\n    \n                    return err ? me.trigger( 'error', err ) : me.trigger('load');\n                });\n    \n                xhr.on( 'error', function() {\n                    xhr.off();\n                    me._xhr = null;\n                    me.trigger( 'error', 'http' );\n                });\n    \n                me._xhr = xhr;\n                return xhr;\n            },\n    \n            _setRequestHeader: function( xhr, headers ) {\n                $.each( headers, function( key, val ) {\n                    xhr.exec( 'setRequestHeader', key, val );\n                });\n            }\n        });\n    });\n    /**\n     * @fileOverview 完全版本。\n     */\n    define('preset/all',[\n        'base',\n    \n        // widgets\n        'widgets/filednd',\n        'widgets/filepaste',\n        'widgets/filepicker',\n        'widgets/image',\n        'widgets/queue',\n        'widgets/runtime',\n        'widgets/upload',\n        'widgets/validator',\n    \n        // runtimes\n        // html5\n        'runtime/html5/blob',\n        'runtime/html5/dnd',\n        'runtime/html5/filepaste',\n        'runtime/html5/filepicker',\n        'runtime/html5/imagemeta/exif',\n        'runtime/html5/androidpatch',\n        'runtime/html5/image',\n        'runtime/html5/transport',\n    \n        // flash\n        'runtime/flash/filepicker',\n        'runtime/flash/image',\n        'runtime/flash/transport'\n    ], function( Base ) {\n        return Base;\n    });\n    define('webuploader',[\n        'preset/all'\n    ], function( preset ) {\n        return preset;\n    });\n    return require('webuploader');\n});\n"
  },
  {
    "path": "static/common/user/uedit/third-party/webuploader/webuploader.withoutimage.js",
    "content": "/*! WebUploader 0.1.2 */\n\n\n/**\n * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。\n *\n * AMD API 内部的简单不完全实现，请忽略。只有当WebUploader被合并成一个文件的时候才会引入。\n */\n(function( root, factory ) {\n    var modules = {},\n\n        // 内部require, 简单不完全实现。\n        // https://github.com/amdjs/amdjs-api/wiki/require\n        _require = function( deps, callback ) {\n            var args, len, i;\n\n            // 如果deps不是数组，则直接返回指定module\n            if ( typeof deps === 'string' ) {\n                return getModule( deps );\n            } else {\n                args = [];\n                for( len = deps.length, i = 0; i < len; i++ ) {\n                    args.push( getModule( deps[ i ] ) );\n                }\n\n                return callback.apply( null, args );\n            }\n        },\n\n        // 内部define，暂时不支持不指定id.\n        _define = function( id, deps, factory ) {\n            if ( arguments.length === 2 ) {\n                factory = deps;\n                deps = null;\n            }\n\n            _require( deps || [], function() {\n                setModule( id, factory, arguments );\n            });\n        },\n\n        // 设置module, 兼容CommonJs写法。\n        setModule = function( id, factory, args ) {\n            var module = {\n                    exports: factory\n                },\n                returned;\n\n            if ( typeof factory === 'function' ) {\n                args.length || (args = [ _require, module.exports, module ]);\n                returned = factory.apply( null, args );\n                returned !== undefined && (module.exports = returned);\n            }\n\n            modules[ id ] = module.exports;\n        },\n\n        // 根据id获取module\n        getModule = function( id ) {\n            var module = modules[ id ] || root[ id ];\n\n            if ( !module ) {\n                throw new Error( '`' + id + '` is undefined' );\n            }\n\n            return module;\n        },\n\n        // 将所有modules，将路径ids装换成对象。\n        exportsTo = function( obj ) {\n            var key, host, parts, part, last, ucFirst;\n\n            // make the first character upper case.\n            ucFirst = function( str ) {\n                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));\n            };\n\n            for ( key in modules ) {\n                host = obj;\n\n                if ( !modules.hasOwnProperty( key ) ) {\n                    continue;\n                }\n\n                parts = key.split('/');\n                last = ucFirst( parts.pop() );\n\n                while( (part = ucFirst( parts.shift() )) ) {\n                    host[ part ] = host[ part ] || {};\n                    host = host[ part ];\n                }\n\n                host[ last ] = modules[ key ];\n            }\n        },\n\n        exports = factory( root, _define, _require ),\n        origin;\n\n    // exports every module.\n    exportsTo( exports );\n\n    if ( typeof module === 'object' && typeof module.exports === 'object' ) {\n\n        // For CommonJS and CommonJS-like environments where a proper window is present,\n        module.exports = exports;\n    } else if ( typeof define === 'function' && define.amd ) {\n\n        // Allow using this built library as an AMD module\n        // in another project. That other project will only\n        // see this AMD call, not the internal modules in\n        // the closure below.\n        define([], exports );\n    } else {\n\n        // Browser globals case. Just assign the\n        // result to a property on the global.\n        origin = root.WebUploader;\n        root.WebUploader = exports;\n        root.WebUploader.noConflict = function() {\n            root.WebUploader = origin;\n        };\n    }\n})( this, function( window, define, require ) {\n\n\n    /**\n     * @fileOverview jQuery or Zepto\n     */\n    define('dollar-third',[],function() {\n        return window.jQuery || window.Zepto;\n    });\n    /**\n     * @fileOverview Dom 操作相关\n     */\n    define('dollar',[\n        'dollar-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 使用jQuery的Promise\n     */\n    define('promise-third',[\n        'dollar'\n    ], function( $ ) {\n        return {\n            Deferred: $.Deferred,\n            when: $.when,\n    \n            isPromise: function( anything ) {\n                return anything && typeof anything.then === 'function';\n            }\n        };\n    });\n    /**\n     * @fileOverview Promise/A+\n     */\n    define('promise',[\n        'promise-third'\n    ], function( _ ) {\n        return _;\n    });\n    /**\n     * @fileOverview 基础类方法。\n     */\n    \n    /**\n     * Web Uploader内部类的详细说明，以下提及的功能类，都可以在`WebUploader`这个变量中访问到。\n     *\n     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.\n     * 默认module id该文件的路径，而此路径将会转化成名字空间存放在WebUploader中。如：\n     *\n     * * module `base`：WebUploader.Base\n     * * module `file`: WebUploader.File\n     * * module `lib/dnd`: WebUploader.Lib.Dnd\n     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd\n     *\n     *\n     * 以下文档将可能省略`WebUploader`前缀。\n     * @module WebUploader\n     * @title WebUploader API文档\n     */\n    define('base',[\n        'dollar',\n        'promise'\n    ], function( $, promise ) {\n    \n        var noop = function() {},\n            call = Function.call;\n    \n        // http://jsperf.com/uncurrythis\n        // 反科里化\n        function uncurryThis( fn ) {\n            return function() {\n                return call.apply( fn, arguments );\n            };\n        }\n    \n        function bindFn( fn, context ) {\n            return function() {\n                return fn.apply( context, arguments );\n            };\n        }\n    \n        function createObject( proto ) {\n            var f;\n    \n            if ( Object.create ) {\n                return Object.create( proto );\n            } else {\n                f = function() {};\n                f.prototype = proto;\n                return new f();\n            }\n        }\n    \n    \n        /**\n         * 基础类，提供一些简单常用的方法。\n         * @class Base\n         */\n        return {\n    \n            /**\n             * @property {String} version 当前版本号。\n             */\n            version: '0.1.2',\n    \n            /**\n             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。\n             */\n            $: $,\n    \n            Deferred: promise.Deferred,\n    \n            isPromise: promise.isPromise,\n    \n            when: promise.when,\n    \n            /**\n             * @description  简单的浏览器检查结果。\n             *\n             * * `webkit`  webkit版本号，如果浏览器为非webkit内核，此属性为`undefined`。\n             * * `chrome`  chrome浏览器版本号，如果浏览器为chrome，此属性为`undefined`。\n             * * `ie`  ie浏览器版本号，如果浏览器为非ie，此属性为`undefined`。**暂不支持ie10+**\n             * * `firefox`  firefox浏览器版本号，如果浏览器为非firefox，此属性为`undefined`。\n             * * `safari`  safari浏览器版本号，如果浏览器为非safari，此属性为`undefined`。\n             * * `opera`  opera浏览器版本号，如果浏览器为非opera，此属性为`undefined`。\n             *\n             * @property {Object} [browser]\n             */\n            browser: (function( ua ) {\n                var ret = {},\n                    webkit = ua.match( /WebKit\\/([\\d.]+)/ ),\n                    chrome = ua.match( /Chrome\\/([\\d.]+)/ ) ||\n                        ua.match( /CriOS\\/([\\d.]+)/ ),\n    \n                    ie = ua.match( /MSIE\\s([\\d\\.]+)/ ) ||\n                        ua.match(/(?:trident)(?:.*rv:([\\w.]+))?/i),\n                    firefox = ua.match( /Firefox\\/([\\d.]+)/ ),\n                    safari = ua.match( /Safari\\/([\\d.]+)/ ),\n                    opera = ua.match( /OPR\\/([\\d.]+)/ );\n    \n                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));\n                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));\n                ie && (ret.ie = parseFloat( ie[ 1 ] ));\n                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));\n                safari && (ret.safari = parseFloat( safari[ 1 ] ));\n                opera && (ret.opera = parseFloat( opera[ 1 ] ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * @description  操作系统检查结果。\n             *\n             * * `android`  如果在android浏览器环境下，此值为对应的android版本号，否则为`undefined`。\n             * * `ios` 如果在ios浏览器环境下，此值为对应的ios版本号，否则为`undefined`。\n             * @property {Object} [os]\n             */\n            os: (function( ua ) {\n                var ret = {},\n    \n                    // osx = !!ua.match( /\\(Macintosh\\; Intel / ),\n                    android = ua.match( /(?:Android);?[\\s\\/]+([\\d.]+)?/ ),\n                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\\s([\\d_]+)/ );\n    \n                // osx && (ret.osx = true);\n                android && (ret.android = parseFloat( android[ 1 ] ));\n                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));\n    \n                return ret;\n            })( navigator.userAgent ),\n    \n            /**\n             * 实现类与类之间的继承。\n             * @method inherits\n             * @grammar Base.inherits( super ) => child\n             * @grammar Base.inherits( super, protos ) => child\n             * @grammar Base.inherits( super, protos, statics ) => child\n             * @param  {Class} super 父类\n             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor，子类将是用此属性值。\n             * @param  {Function} [protos.constructor] 子类构造器，不指定的话将创建个临时的直接执行父类构造器的方法。\n             * @param  {Object} [statics] 静态属性或方法。\n             * @return {Class} 返回子类。\n             * @example\n             * function Person() {\n             *     console.log( 'Super' );\n             * }\n             * Person.prototype.hello = function() {\n             *     console.log( 'hello' );\n             * };\n             *\n             * var Manager = Base.inherits( Person, {\n             *     world: function() {\n             *         console.log( 'World' );\n             *     }\n             * });\n             *\n             * // 因为没有指定构造器，父类的构造器将会执行。\n             * var instance = new Manager();    // => Super\n             *\n             * // 继承子父类的方法\n             * instance.hello();    // => hello\n             * instance.world();    // => World\n             *\n             * // 子类的__super__属性指向父类\n             * console.log( Manager.__super__ === Person );    // => true\n             */\n            inherits: function( Super, protos, staticProtos ) {\n                var child;\n    \n                if ( typeof protos === 'function' ) {\n                    child = protos;\n                    protos = null;\n                } else if ( protos && protos.hasOwnProperty('constructor') ) {\n                    child = protos.constructor;\n                } else {\n                    child = function() {\n                        return Super.apply( this, arguments );\n                    };\n                }\n    \n                // 复制静态方法\n                $.extend( true, child, Super, staticProtos || {} );\n    \n                /* jshint camelcase: false */\n    \n                // 让子类的__super__属性指向父类。\n                child.__super__ = Super.prototype;\n    \n                // 构建原型，添加原型方法或属性。\n                // 暂时用Object.create实现。\n                child.prototype = createObject( Super.prototype );\n                protos && $.extend( true, child.prototype, protos );\n    \n                return child;\n            },\n    \n            /**\n             * 一个不做任何事情的方法。可以用来赋值给默认的callback.\n             * @method noop\n             */\n            noop: noop,\n    \n            /**\n             * 返回一个新的方法，此方法将已指定的`context`来执行。\n             * @grammar Base.bindFn( fn, context ) => Function\n             * @method bindFn\n             * @example\n             * var doSomething = function() {\n             *         console.log( this.name );\n             *     },\n             *     obj = {\n             *         name: 'Object Name'\n             *     },\n             *     aliasFn = Base.bind( doSomething, obj );\n             *\n             *  aliasFn();    // => Object Name\n             *\n             */\n            bindFn: bindFn,\n    \n            /**\n             * 引用Console.log如果存在的话，否则引用一个[空函数loop](#WebUploader:Base.log)。\n             * @grammar Base.log( args... ) => undefined\n             * @method log\n             */\n            log: (function() {\n                if ( window.console ) {\n                    return bindFn( console.log, console );\n                }\n                return noop;\n            })(),\n    \n            nextTick: (function() {\n    \n                return function( cb ) {\n                    setTimeout( cb, 1 );\n                };\n    \n                // @bug 当浏览器不在当前窗口时就停了。\n                // var next = window.requestAnimationFrame ||\n                //     window.webkitRequestAnimationFrame ||\n                //     window.mozRequestAnimationFrame ||\n                //     function( cb ) {\n                //         window.setTimeout( cb, 1000 / 60 );\n                //     };\n    \n                // // fix: Uncaught TypeError: Illegal invocation\n                // return bindFn( next, window );\n            })(),\n    \n            /**\n             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。\n             * 将用来将非数组对象转化成数组对象。\n             * @grammar Base.slice( target, start[, end] ) => Array\n             * @method slice\n             * @example\n             * function doSomthing() {\n             *     var args = Base.slice( arguments, 1 );\n             *     console.log( args );\n             * }\n             *\n             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array [\"arg2\", \"arg3\"]\n             */\n            slice: uncurryThis( [].slice ),\n    \n            /**\n             * 生成唯一的ID\n             * @method guid\n             * @grammar Base.guid() => String\n             * @grammar Base.guid( prefx ) => String\n             */\n            guid: (function() {\n                var counter = 0;\n    \n                return function( prefix ) {\n                    var guid = (+new Date()).toString( 32 ),\n                        i = 0;\n    \n                    for ( ; i < 5; i++ ) {\n                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );\n                    }\n    \n                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );\n                };\n            })(),\n    \n            /**\n             * 格式化文件大小, 输出成带单位的字符串\n             * @method formatSize\n             * @grammar Base.formatSize( size ) => String\n             * @grammar Base.formatSize( size, pointLength ) => String\n             * @grammar Base.formatSize( size, pointLength, units ) => String\n             * @param {Number} size 文件大小\n             * @param {Number} [pointLength=2] 精确到的小数点数。\n             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节，到千字节，一直往上指定。如果单位数组里面只指定了到了K(千字节)，同时文件大小大于M, 此方法的输出将还是显示成多少K.\n             * @example\n             * console.log( Base.formatSize( 100 ) );    // => 100B\n             * console.log( Base.formatSize( 1024 ) );    // => 1.00K\n             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K\n             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M\n             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G\n             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB\n             */\n            formatSize: function( size, pointLength, units ) {\n                var unit;\n    \n                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];\n    \n                while ( (unit = units.shift()) && size > 1024 ) {\n                    size = size / 1024;\n                }\n    \n                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +\n                        unit;\n            }\n        };\n    });\n    /**\n     * 事件处理类，可以独立使用，也可以扩展给对象使用。\n     * @fileOverview Mediator\n     */\n    define('mediator',[\n        'base'\n    ], function( Base ) {\n        var $ = Base.$,\n            slice = [].slice,\n            separator = /\\s+/,\n            protos;\n    \n        // 根据条件过滤出事件handlers.\n        function findHandlers( arr, name, callback, context ) {\n            return $.grep( arr, function( handler ) {\n                return handler &&\n                        (!name || handler.e === name) &&\n                        (!callback || handler.cb === callback ||\n                        handler.cb._cb === callback) &&\n                        (!context || handler.ctx === context);\n            });\n        }\n    \n        function eachEvent( events, callback, iterator ) {\n            // 不支持对象，只支持多个event用空格隔开\n            $.each( (events || '').split( separator ), function( _, key ) {\n                iterator( key, callback );\n            });\n        }\n    \n        function triggerHanders( events, args ) {\n            var stoped = false,\n                i = -1,\n                len = events.length,\n                handler;\n    \n            while ( ++i < len ) {\n                handler = events[ i ];\n    \n                if ( handler.cb.apply( handler.ctx2, args ) === false ) {\n                    stoped = true;\n                    break;\n                }\n            }\n    \n            return !stoped;\n        }\n    \n        protos = {\n    \n            /**\n             * 绑定事件。\n             *\n             * `callback`方法在执行时，arguments将会来源于trigger的时候携带的参数。如\n             * ```javascript\n             * var obj = {};\n             *\n             * // 使得obj有事件行为\n             * Mediator.installTo( obj );\n             *\n             * obj.on( 'testa', function( arg1, arg2 ) {\n             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'\n             * });\n             *\n             * obj.trigger( 'testa', 'arg1', 'arg2' );\n             * ```\n             *\n             * 如果`callback`中，某一个方法`return false`了，则后续的其他`callback`都不会被执行到。\n             * 切会影响到`trigger`方法的返回值，为`false`。\n             *\n             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处，\n             * 就是第一个参数为`type`，记录当前是什么事件在触发。此类`callback`的优先级比脚低，会再正常`callback`执行完后触发。\n             * ```javascript\n             * obj.on( 'all', function( type, arg1, arg2 ) {\n             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'\n             * });\n             * ```\n             *\n             * @method on\n             * @grammar on( name, callback[, context] ) => self\n             * @param  {String}   name     事件名，支持多个事件用空格隔开\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             * @class Mediator\n             */\n            on: function( name, callback, context ) {\n                var me = this,\n                    set;\n    \n                if ( !callback ) {\n                    return this;\n                }\n    \n                set = this._events || (this._events = []);\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var handler = { e: name };\n    \n                    handler.cb = callback;\n                    handler.ctx = context;\n                    handler.ctx2 = context || me;\n                    handler.id = set.length;\n    \n                    set.push( handler );\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 绑定事件，且当handler执行完后，自动解除绑定。\n             * @method once\n             * @grammar once( name, callback[, context] ) => self\n             * @param  {String}   name     事件名\n             * @param  {Function} callback 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            once: function( name, callback, context ) {\n                var me = this;\n    \n                if ( !callback ) {\n                    return me;\n                }\n    \n                eachEvent( name, callback, function( name, callback ) {\n                    var once = function() {\n                            me.off( name, once );\n                            return callback.apply( context || me, arguments );\n                        };\n    \n                    once._cb = callback;\n                    me.on( name, once, context );\n                });\n    \n                return me;\n            },\n    \n            /**\n             * 解除事件绑定\n             * @method off\n             * @grammar off( [name[, callback[, context] ] ] ) => self\n             * @param  {String}   [name]     事件名\n             * @param  {Function} [callback] 事件处理器\n             * @param  {Object}   [context]  事件处理器的上下文。\n             * @return {self} 返回自身，方便链式\n             * @chainable\n             */\n            off: function( name, cb, ctx ) {\n                var events = this._events;\n    \n                if ( !events ) {\n                    return this;\n                }\n    \n                if ( !name && !cb && !ctx ) {\n                    this._events = [];\n                    return this;\n                }\n    \n                eachEvent( name, cb, function( name, cb ) {\n                    $.each( findHandlers( events, name, cb, ctx ), function() {\n                        delete events[ this.id ];\n                    });\n                });\n    \n                return this;\n            },\n    \n            /**\n             * 触发事件\n             * @method trigger\n             * @grammar trigger( name[, args...] ) => self\n             * @param  {String}   type     事件名\n             * @param  {*} [...] 任意参数\n             * @return {Boolean} 如果handler中return false了，则返回false, 否则返回true\n             */\n            trigger: function( type ) {\n                var args, events, allEvents;\n    \n                if ( !this._events || !type ) {\n                    return this;\n                }\n    \n                args = slice.call( arguments, 1 );\n                events = findHandlers( this._events, type );\n                allEvents = findHandlers( this._events, 'all' );\n    \n                return triggerHanders( events, args ) &&\n                        triggerHanders( allEvents, arguments );\n            }\n        };\n    \n        /**\n         * 中介者，它本身是个单例，但可以通过[installTo](#WebUploader:Mediator:installTo)方法，使任何对象具备事件行为。\n         * 主要目的是负责模块与模块之间的合作，降低耦合度。\n         *\n         * @class Mediator\n         */\n        return $.extend({\n    \n            /**\n             * 可以通过这个接口，使任何对象具备事件功能。\n             * @method installTo\n             * @param  {Object} obj 需要具备事件行为的对象。\n             * @return {Object} 返回obj.\n             */\n            installTo: function( obj ) {\n                return $.extend( obj, protos );\n            }\n    \n        }, protos );\n    });\n    /**\n     * @fileOverview Uploader上传类\n     */\n    define('uploader',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$;\n    \n        /**\n         * 上传入口类。\n         * @class Uploader\n         * @constructor\n         * @grammar new Uploader( opts ) => Uploader\n         * @example\n         * var uploader = WebUploader.Uploader({\n         *     swf: 'path_of_swf/Uploader.swf',\n         *\n         *     // 开起分片上传。\n         *     chunked: true\n         * });\n         */\n        function Uploader( opts ) {\n            this.options = $.extend( true, {}, Uploader.options, opts );\n            this._init( this.options );\n        }\n    \n        // default Options\n        // widgets中有相应扩展\n        Uploader.options = {};\n        Mediator.installTo( Uploader.prototype );\n    \n        // 批量添加纯命令式方法。\n        $.each({\n            upload: 'start-upload',\n            stop: 'stop-upload',\n            getFile: 'get-file',\n            getFiles: 'get-files',\n            addFile: 'add-file',\n            addFiles: 'add-file',\n            sort: 'sort-files',\n            removeFile: 'remove-file',\n            skipFile: 'skip-file',\n            retry: 'retry',\n            isInProgress: 'is-in-progress',\n            makeThumb: 'make-thumb',\n            getDimension: 'get-dimension',\n            addButton: 'add-btn',\n            getRuntimeType: 'get-runtime-type',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable',\n            reset: 'reset'\n        }, function( fn, command ) {\n            Uploader.prototype[ fn ] = function() {\n                return this.request( command, arguments );\n            };\n        });\n    \n        $.extend( Uploader.prototype, {\n            state: 'pending',\n    \n            _init: function( opts ) {\n                var me = this;\n    \n                me.request( 'init', opts, function() {\n                    me.state = 'ready';\n                    me.trigger('ready');\n                });\n            },\n    \n            /**\n             * 获取或者设置Uploader配置项。\n             * @method option\n             * @grammar option( key ) => *\n             * @grammar option( key, val ) => self\n             * @example\n             *\n             * // 初始状态图片上传前不会压缩\n             * var uploader = new WebUploader.Uploader({\n             *     resize: null;\n             * });\n             *\n             * // 修改后图片上传前，尝试将图片压缩到1600 * 1600\n             * uploader.options( 'resize', {\n             *     width: 1600,\n             *     height: 1600\n             * });\n             */\n            option: function( key, val ) {\n                var opts = this.options;\n    \n                // setter\n                if ( arguments.length > 1 ) {\n    \n                    if ( $.isPlainObject( val ) &&\n                            $.isPlainObject( opts[ key ] ) ) {\n                        $.extend( opts[ key ], val );\n                    } else {\n                        opts[ key ] = val;\n                    }\n    \n                } else {    // getter\n                    return key ? opts[ key ] : opts;\n                }\n            },\n    \n            /**\n             * 获取文件统计信息。返回一个包含一下信息的对象。\n             * * `successNum` 上传成功的文件数\n             * * `uploadFailNum` 上传失败的文件数\n             * * `cancelNum` 被删除的文件数\n             * * `invalidNum` 无效的文件数\n             * * `queueNum` 还在队列中的文件数\n             * @method getStats\n             * @grammar getStats() => Object\n             */\n            getStats: function() {\n                // return this._mgr.getStats.apply( this._mgr, arguments );\n                var stats = this.request('get-stats');\n    \n                return {\n                    successNum: stats.numOfSuccess,\n    \n                    // who care?\n                    // queueFailNum: 0,\n                    cancelNum: stats.numOfCancel,\n                    invalidNum: stats.numOfInvalid,\n                    uploadFailNum: stats.numOfUploadFailed,\n                    queueNum: stats.numOfQueue\n                };\n            },\n    \n            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器\n            trigger: function( type/*, args...*/ ) {\n                var args = [].slice.call( arguments, 1 ),\n                    opts = this.options,\n                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +\n                        type.substring( 1 );\n    \n                if (\n                        // 调用通过on方法注册的handler.\n                        Mediator.trigger.apply( this, arguments ) === false ||\n    \n                        // 调用opts.onEvent\n                        $.isFunction( opts[ name ] ) &&\n                        opts[ name ].apply( this, args ) === false ||\n    \n                        // 调用this.onEvent\n                        $.isFunction( this[ name ] ) &&\n                        this[ name ].apply( this, args ) === false ||\n    \n                        // 广播所有uploader的事件。\n                        Mediator.trigger.apply( Mediator,\n                        [ this, type ].concat( args ) ) === false ) {\n    \n                    return false;\n                }\n    \n                return true;\n            },\n    \n            // widgets/widget.js将补充此方法的详细文档。\n            request: Base.noop\n        });\n    \n        /**\n         * 创建Uploader实例，等同于new Uploader( opts );\n         * @method create\n         * @class Base\n         * @static\n         * @grammar Base.create( opts ) => Uploader\n         */\n        Base.create = Uploader.create = function( opts ) {\n            return new Uploader( opts );\n        };\n    \n        // 暴露Uploader，可以通过它来扩展业务逻辑。\n        Base.Uploader = Uploader;\n    \n        return Uploader;\n    });\n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/runtime',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            factories = {},\n    \n            // 获取对象的第一个key\n            getFirstKey = function( obj ) {\n                for ( var key in obj ) {\n                    if ( obj.hasOwnProperty( key ) ) {\n                        return key;\n                    }\n                }\n                return null;\n            };\n    \n        // 接口类。\n        function Runtime( options ) {\n            this.options = $.extend({\n                container: document.body\n            }, options );\n            this.uid = Base.guid('rt_');\n        }\n    \n        $.extend( Runtime.prototype, {\n    \n            getContainer: function() {\n                var opts = this.options,\n                    parent, container;\n    \n                if ( this._container ) {\n                    return this._container;\n                }\n    \n                parent = $( opts.container || document.body );\n                container = $( document.createElement('div') );\n    \n                container.attr( 'id', 'rt_' + this.uid );\n                container.css({\n                    position: 'absolute',\n                    top: '0px',\n                    left: '0px',\n                    width: '1px',\n                    height: '1px',\n                    overflow: 'hidden'\n                });\n    \n                parent.append( container );\n                parent.addClass('webuploader-container');\n                this._container = container;\n                return container;\n            },\n    \n            init: Base.noop,\n            exec: Base.noop,\n    \n            destroy: function() {\n                if ( this._container ) {\n                    this._container.parentNode.removeChild( this.__container );\n                }\n    \n                this.off();\n            }\n        });\n    \n        Runtime.orders = 'html5,flash';\n    \n    \n        /**\n         * 添加Runtime实现。\n         * @param {String} type    类型\n         * @param {Runtime} factory 具体Runtime实现。\n         */\n        Runtime.addRuntime = function( type, factory ) {\n            factories[ type ] = factory;\n        };\n    \n        Runtime.hasRuntime = function( type ) {\n            return !!(type ? factories[ type ] : getFirstKey( factories ));\n        };\n    \n        Runtime.create = function( opts, orders ) {\n            var type, runtime;\n    \n            orders = orders || Runtime.orders;\n            $.each( orders.split( /\\s*,\\s*/g ), function() {\n                if ( factories[ this ] ) {\n                    type = this;\n                    return false;\n                }\n            });\n    \n            type = type || getFirstKey( factories );\n    \n            if ( !type ) {\n                throw new Error('Runtime Error');\n            }\n    \n            runtime = new factories[ type ]( opts );\n            return runtime;\n        };\n    \n        Mediator.installTo( Runtime.prototype );\n        return Runtime;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/client',[\n        'base',\n        'mediator',\n        'runtime/runtime'\n    ], function( Base, Mediator, Runtime ) {\n    \n        var cache;\n    \n        cache = (function() {\n            var obj = {};\n    \n            return {\n                add: function( runtime ) {\n                    obj[ runtime.uid ] = runtime;\n                },\n    \n                get: function( ruid, standalone ) {\n                    var i;\n    \n                    if ( ruid ) {\n                        return obj[ ruid ];\n                    }\n    \n                    for ( i in obj ) {\n                        // 有些类型不能重用，比如filepicker.\n                        if ( standalone && obj[ i ].__standalone ) {\n                            continue;\n                        }\n    \n                        return obj[ i ];\n                    }\n    \n                    return null;\n                },\n    \n                remove: function( runtime ) {\n                    delete obj[ runtime.uid ];\n                }\n            };\n        })();\n    \n        function RuntimeClient( component, standalone ) {\n            var deferred = Base.Deferred(),\n                runtime;\n    \n            this.uid = Base.guid('client_');\n    \n            // 允许runtime没有初始化之前，注册一些方法在初始化后执行。\n            this.runtimeReady = function( cb ) {\n                return deferred.done( cb );\n            };\n    \n            this.connectRuntime = function( opts, cb ) {\n    \n                // already connected.\n                if ( runtime ) {\n                    throw new Error('already connected!');\n                }\n    \n                deferred.done( cb );\n    \n                if ( typeof opts === 'string' && cache.get( opts ) ) {\n                    runtime = cache.get( opts );\n                }\n    \n                // 像filePicker只能独立存在，不能公用。\n                runtime = runtime || cache.get( null, standalone );\n    \n                // 需要创建\n                if ( !runtime ) {\n                    runtime = Runtime.create( opts, opts.runtimeOrder );\n                    runtime.__promise = deferred.promise();\n                    runtime.once( 'ready', deferred.resolve );\n                    runtime.init();\n                    cache.add( runtime );\n                    runtime.__client = 1;\n                } else {\n                    // 来自cache\n                    Base.$.extend( runtime.options, opts );\n                    runtime.__promise.then( deferred.resolve );\n                    runtime.__client++;\n                }\n    \n                standalone && (runtime.__standalone = standalone);\n                return runtime;\n            };\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.disconnectRuntime = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                runtime.__client--;\n    \n                if ( runtime.__client <= 0 ) {\n                    cache.remove( runtime );\n                    delete runtime.__promise;\n                    runtime.destroy();\n                }\n    \n                runtime = null;\n            };\n    \n            this.exec = function() {\n                if ( !runtime ) {\n                    return;\n                }\n    \n                var args = Base.slice( arguments );\n                component && args.unshift( component );\n    \n                return runtime.exec.apply( this, args );\n            };\n    \n            this.getRuid = function() {\n                return runtime && runtime.uid;\n            };\n    \n            this.destroy = (function( destroy ) {\n                return function() {\n                    destroy && destroy.apply( this, arguments );\n                    this.trigger('destroy');\n                    this.off();\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                };\n            })( this.destroy );\n        }\n    \n        Mediator.installTo( RuntimeClient.prototype );\n        return RuntimeClient;\n    });\n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/dnd',[\n        'base',\n        'mediator',\n        'runtime/client'\n    ], function( Base, Mediator, RuntimeClent ) {\n    \n        var $ = Base.$;\n    \n        function DragAndDrop( opts ) {\n            opts = this.options = $.extend({}, DragAndDrop.options, opts );\n    \n            opts.container = $( opts.container );\n    \n            if ( !opts.container.length ) {\n                return;\n            }\n    \n            RuntimeClent.call( this, 'DragAndDrop' );\n        }\n    \n        DragAndDrop.options = {\n            accept: null,\n            disableGlobalDnd: false\n        };\n    \n        Base.inherits( RuntimeClent, {\n            constructor: DragAndDrop,\n    \n            init: function() {\n                var me = this;\n    \n                me.connectRuntime( me.options, function() {\n                    me.exec('init');\n                    me.trigger('ready');\n                });\n            },\n    \n            destroy: function() {\n                this.disconnectRuntime();\n            }\n        });\n    \n        Mediator.installTo( DragAndDrop.prototype );\n    \n        return DragAndDrop;\n    });\n    /**\n     * @fileOverview 组件基类。\n     */\n    define('widgets/widget',[\n        'base',\n        'uploader'\n    ], function( Base, Uploader ) {\n    \n        var $ = Base.$,\n            _init = Uploader.prototype._init,\n            IGNORE = {},\n            widgetClass = [];\n    \n        function isArrayLike( obj ) {\n            if ( !obj ) {\n                return false;\n            }\n    \n            var length = obj.length,\n                type = $.type( obj );\n    \n            if ( obj.nodeType === 1 && length ) {\n                return true;\n            }\n    \n            return type === 'array' || type !== 'function' && type !== 'string' &&\n                    (length === 0 || typeof length === 'number' && length > 0 &&\n                    (length - 1) in obj);\n        }\n    \n        function Widget( uploader ) {\n            this.owner = uploader;\n            this.options = uploader.options;\n        }\n    \n        $.extend( Widget.prototype, {\n    \n            init: Base.noop,\n    \n            // 类Backbone的事件监听声明，监听uploader实例上的事件\n            // widget直接无法监听事件，事件只能通过uploader来传递\n            invoke: function( apiName, args ) {\n    \n                /*\n                    {\n                        'make-thumb': 'makeThumb'\n                    }\n                 */\n                var map = this.responseMap;\n    \n                // 如果无API响应声明则忽略\n                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||\n                        !$.isFunction( this[ map[ apiName ] ] ) ) {\n    \n                    return IGNORE;\n                }\n    \n                return this[ map[ apiName ] ].apply( this, args );\n    \n            },\n    \n            /**\n             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。\n             * @method request\n             * @grammar request( command, args ) => * | Promise\n             * @grammar request( command, args, callback ) => Promise\n             * @for  Uploader\n             */\n            request: function() {\n                return this.owner.request.apply( this.owner, arguments );\n            }\n        });\n    \n        // 扩展Uploader.\n        $.extend( Uploader.prototype, {\n    \n            // 覆写_init用来初始化widgets\n            _init: function() {\n                var me = this,\n                    widgets = me._widgets = [];\n    \n                $.each( widgetClass, function( _, klass ) {\n                    widgets.push( new klass( me ) );\n                });\n    \n                return _init.apply( me, arguments );\n            },\n    \n            request: function( apiName, args, callback ) {\n                var i = 0,\n                    widgets = this._widgets,\n                    len = widgets.length,\n                    rlts = [],\n                    dfds = [],\n                    widget, rlt, promise, key;\n    \n                args = isArrayLike( args ) ? args : [ args ];\n    \n                for ( ; i < len; i++ ) {\n                    widget = widgets[ i ];\n                    rlt = widget.invoke( apiName, args );\n    \n                    if ( rlt !== IGNORE ) {\n    \n                        // Deferred对象\n                        if ( Base.isPromise( rlt ) ) {\n                            dfds.push( rlt );\n                        } else {\n                            rlts.push( rlt );\n                        }\n                    }\n                }\n    \n                // 如果有callback，则用异步方式。\n                if ( callback || dfds.length ) {\n                    promise = Base.when.apply( Base, dfds );\n                    key = promise.pipe ? 'pipe' : 'then';\n    \n                    // 很重要不能删除。删除了会死循环。\n                    // 保证执行顺序。让callback总是在下一个tick中执行。\n                    return promise[ key ](function() {\n                                var deferred = Base.Deferred(),\n                                    args = arguments;\n    \n                                setTimeout(function() {\n                                    deferred.resolve.apply( deferred, args );\n                                }, 1 );\n    \n                                return deferred.promise();\n                            })[ key ]( callback || Base.noop );\n                } else {\n                    return rlts[ 0 ];\n                }\n            }\n        });\n    \n        /**\n         * 添加组件\n         * @param  {object} widgetProto 组件原型，构造函数通过constructor属性定义\n         * @param  {object} responseMap API名称与函数实现的映射\n         * @example\n         *     Uploader.register( {\n         *         init: function( options ) {},\n         *         makeThumb: function() {}\n         *     }, {\n         *         'make-thumb': 'makeThumb'\n         *     } );\n         */\n        Uploader.register = Widget.register = function( responseMap, widgetProto ) {\n            var map = { init: 'init' },\n                klass;\n    \n            if ( arguments.length === 1 ) {\n                widgetProto = responseMap;\n                widgetProto.responseMap = map;\n            } else {\n                widgetProto.responseMap = $.extend( map, responseMap );\n            }\n    \n            klass = Base.inherits( Widget, widgetProto );\n            widgetClass.push( klass );\n    \n            return klass;\n        };\n    \n        return Widget;\n    });\n    /**\n     * @fileOverview DragAndDrop Widget。\n     */\n    define('widgets/filednd',[\n        'base',\n        'uploader',\n        'lib/dnd',\n        'widgets/widget'\n    ], function( Base, Uploader, Dnd ) {\n        var $ = Base.$;\n    \n        Uploader.options.dnd = '';\n    \n        /**\n         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器，如果不指定，则不启动。\n         * @namespace options\n         * @for Uploader\n         */\n    \n        /**\n         * @event dndAccept\n         * @param {DataTransferItemList} items DataTransferItem\n         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API，且只能通过 mime-type 验证。\n         * @for  Uploader\n         */\n        return Uploader.register({\n            init: function( opts ) {\n    \n                if ( !opts.dnd ||\n                        this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                var me = this,\n                    deferred = Base.Deferred(),\n                    options = $.extend({}, {\n                        disableGlobalDnd: opts.disableGlobalDnd,\n                        container: opts.dnd,\n                        accept: opts.accept\n                    }),\n                    dnd;\n    \n                dnd = new Dnd( options );\n    \n                dnd.once( 'ready', deferred.resolve );\n                dnd.on( 'drop', function( files ) {\n                    me.request( 'add-file', [ files ]);\n                });\n    \n                // 检测文件是否全部允许添加。\n                dnd.on( 'accept', function( items ) {\n                    return me.owner.trigger( 'dndAccept', items );\n                });\n    \n                dnd.init();\n    \n                return deferred.promise();\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/filepaste',[\n        'base',\n        'mediator',\n        'runtime/client'\n    ], function( Base, Mediator, RuntimeClent ) {\n    \n        var $ = Base.$;\n    \n        function FilePaste( opts ) {\n            opts = this.options = $.extend({}, opts );\n            opts.container = $( opts.container || document.body );\n            RuntimeClent.call( this, 'FilePaste' );\n        }\n    \n        Base.inherits( RuntimeClent, {\n            constructor: FilePaste,\n    \n            init: function() {\n                var me = this;\n    \n                me.connectRuntime( me.options, function() {\n                    me.exec('init');\n                    me.trigger('ready');\n                });\n            },\n    \n            destroy: function() {\n                this.exec('destroy');\n                this.disconnectRuntime();\n                this.off();\n            }\n        });\n    \n        Mediator.installTo( FilePaste.prototype );\n    \n        return FilePaste;\n    });\n    /**\n     * @fileOverview 组件基类。\n     */\n    define('widgets/filepaste',[\n        'base',\n        'uploader',\n        'lib/filepaste',\n        'widgets/widget'\n    ], function( Base, Uploader, FilePaste ) {\n        var $ = Base.$;\n    \n        /**\n         * @property {Selector} [paste=undefined]  指定监听paste事件的容器，如果不指定，不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.\n         * @namespace options\n         * @for Uploader\n         */\n        return Uploader.register({\n            init: function( opts ) {\n    \n                if ( !opts.paste ||\n                        this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                var me = this,\n                    deferred = Base.Deferred(),\n                    options = $.extend({}, {\n                        container: opts.paste,\n                        accept: opts.accept\n                    }),\n                    paste;\n    \n                paste = new FilePaste( options );\n    \n                paste.once( 'ready', deferred.resolve );\n                paste.on( 'paste', function( files ) {\n                    me.owner.request( 'add-file', [ files ]);\n                });\n                paste.init();\n    \n                return deferred.promise();\n            }\n        });\n    });\n    /**\n     * @fileOverview Blob\n     */\n    define('lib/blob',[\n        'base',\n        'runtime/client'\n    ], function( Base, RuntimeClient ) {\n    \n        function Blob( ruid, source ) {\n            var me = this;\n    \n            me.source = source;\n            me.ruid = ruid;\n    \n            RuntimeClient.call( me, 'Blob' );\n    \n            this.uid = source.uid || this.uid;\n            this.type = source.type || '';\n            this.size = source.size || 0;\n    \n            if ( ruid ) {\n                me.connectRuntime( ruid );\n            }\n        }\n    \n        Base.inherits( RuntimeClient, {\n            constructor: Blob,\n    \n            slice: function( start, end ) {\n                return this.exec( 'slice', start, end );\n            },\n    \n            getSource: function() {\n                return this.source;\n            }\n        });\n    \n        return Blob;\n    });\n    /**\n     * 为了统一化Flash的File和HTML5的File而存在。\n     * 以至于要调用Flash里面的File，也可以像调用HTML5版本的File一下。\n     * @fileOverview File\n     */\n    define('lib/file',[\n        'base',\n        'lib/blob'\n    ], function( Base, Blob ) {\n    \n        var uid = 1,\n            rExt = /\\.([^.]+)$/;\n    \n        function File( ruid, file ) {\n            var ext;\n    \n            Blob.apply( this, arguments );\n            this.name = file.name || ('untitled' + uid++);\n            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';\n    \n            // todo 支持其他类型文件的转换。\n    \n            // 如果有mimetype, 但是文件名里面没有找出后缀规律\n            if ( !ext && this.type ) {\n                ext = /\\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?\n                        RegExp.$1.toLowerCase() : '';\n                this.name += '.' + ext;\n            }\n    \n            // 如果没有指定mimetype, 但是知道文件后缀。\n            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {\n                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);\n            }\n    \n            this.ext = ext;\n            this.lastModifiedDate = file.lastModifiedDate ||\n                    (new Date()).toLocaleString();\n        }\n    \n        return Base.inherits( Blob, File );\n    });\n    \n    /**\n     * @fileOverview 错误信息\n     */\n    define('lib/filepicker',[\n        'base',\n        'runtime/client',\n        'lib/file'\n    ], function( Base, RuntimeClent, File ) {\n    \n        var $ = Base.$;\n    \n        function FilePicker( opts ) {\n            opts = this.options = $.extend({}, FilePicker.options, opts );\n    \n            opts.container = $( opts.id );\n    \n            if ( !opts.container.length ) {\n                throw new Error('按钮指定错误');\n            }\n    \n            opts.innerHTML = opts.innerHTML || opts.label ||\n                    opts.container.html() || '';\n    \n            opts.button = $( opts.button || document.createElement('div') );\n            opts.button.html( opts.innerHTML );\n            opts.container.html( opts.button );\n    \n            RuntimeClent.call( this, 'FilePicker', true );\n        }\n    \n        FilePicker.options = {\n            button: null,\n            container: null,\n            label: null,\n            innerHTML: null,\n            multiple: true,\n            accept: null,\n            name: 'file'\n        };\n    \n        Base.inherits( RuntimeClent, {\n            constructor: FilePicker,\n    \n            init: function() {\n                var me = this,\n                    opts = me.options,\n                    button = opts.button;\n    \n                button.addClass('webuploader-pick');\n    \n                me.on( 'all', function( type ) {\n                    var files;\n    \n                    switch ( type ) {\n                        case 'mouseenter':\n                            button.addClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'mouseleave':\n                            button.removeClass('webuploader-pick-hover');\n                            break;\n    \n                        case 'change':\n                            files = me.exec('getFiles');\n                            me.trigger( 'select', $.map( files, function( file ) {\n                                file = new File( me.getRuid(), file );\n    \n                                // 记录来源。\n                                file._refer = opts.container;\n                                return file;\n                            }), opts.container );\n                            break;\n                    }\n                });\n    \n                me.connectRuntime( opts, function() {\n                    me.refresh();\n                    me.exec( 'init', opts );\n                    me.trigger('ready');\n                });\n    \n                $( window ).on( 'resize', function() {\n                    me.refresh();\n                });\n            },\n    \n            refresh: function() {\n                var shimContainer = this.getRuntime().getContainer(),\n                    button = this.options.button,\n                    width = button.outerWidth ?\n                            button.outerWidth() : button.width(),\n    \n                    height = button.outerHeight ?\n                            button.outerHeight() : button.height(),\n    \n                    pos = button.offset();\n    \n                width && height && shimContainer.css({\n                    bottom: 'auto',\n                    right: 'auto',\n                    width: width + 'px',\n                    height: height + 'px'\n                }).offset( pos );\n            },\n    \n            enable: function() {\n                var btn = this.options.button;\n    \n                btn.removeClass('webuploader-pick-disable');\n                this.refresh();\n            },\n    \n            disable: function() {\n                var btn = this.options.button;\n    \n                this.getRuntime().getContainer().css({\n                    top: '-99999px'\n                });\n    \n                btn.addClass('webuploader-pick-disable');\n            },\n    \n            destroy: function() {\n                if ( this.runtime ) {\n                    this.exec('destroy');\n                    this.disconnectRuntime();\n                }\n            }\n        });\n    \n        return FilePicker;\n    });\n    \n    /**\n     * @fileOverview 文件选择相关\n     */\n    define('widgets/filepicker',[\n        'base',\n        'uploader',\n        'lib/filepicker',\n        'widgets/widget'\n    ], function( Base, Uploader, FilePicker ) {\n        var $ = Base.$;\n    \n        $.extend( Uploader.options, {\n    \n            /**\n             * @property {Selector | Object} [pick=undefined]\n             * @namespace options\n             * @for Uploader\n             * @description 指定选择文件的按钮容器，不指定则不创建按钮。\n             *\n             * * `id` {Seletor} 指定选择文件的按钮容器，不指定则不创建按钮。\n             * * `label` {String} 请采用 `innerHTML` 代替\n             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。\n             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。\n             */\n            pick: null,\n    \n            /**\n             * @property {Arroy} [accept=null]\n             * @namespace options\n             * @for Uploader\n             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表，所以这里需要分开指定。\n             *\n             * * `title` {String} 文字描述\n             * * `extensions` {String} 允许的文件后缀，不带点，多个用逗号分割。\n             * * `mimeTypes` {String} 多个用逗号分割。\n             *\n             * 如：\n             *\n             * ```\n             * {\n             *     title: 'Images',\n             *     extensions: 'gif,jpg,jpeg,bmp,png',\n             *     mimeTypes: 'image/*'\n             * }\n             * ```\n             */\n            accept: null/*{\n                title: 'Images',\n                extensions: 'gif,jpg,jpeg,bmp,png',\n                mimeTypes: 'image/*'\n            }*/\n        });\n    \n        return Uploader.register({\n            'add-btn': 'addButton',\n            refresh: 'refresh',\n            disable: 'disable',\n            enable: 'enable'\n        }, {\n    \n            init: function( opts ) {\n                this.pickers = [];\n                return opts.pick && this.addButton( opts.pick );\n            },\n    \n            refresh: function() {\n                $.each( this.pickers, function() {\n                    this.refresh();\n                });\n            },\n    \n            /**\n             * @method addButton\n             * @for Uploader\n             * @grammar addButton( pick ) => Promise\n             * @description\n             * 添加文件选择按钮，如果一个按钮不够，需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。\n             * @example\n             * uploader.addButton({\n             *     id: '#btnContainer',\n             *     innerHTML: '选择文件'\n             * });\n             */\n            addButton: function( pick ) {\n                var me = this,\n                    opts = me.options,\n                    accept = opts.accept,\n                    options, picker, deferred;\n    \n                if ( !pick ) {\n                    return;\n                }\n    \n                deferred = Base.Deferred();\n                $.isPlainObject( pick ) || (pick = {\n                    id: pick\n                });\n    \n                options = $.extend({}, pick, {\n                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,\n                    swf: opts.swf,\n                    runtimeOrder: opts.runtimeOrder\n                });\n    \n                picker = new FilePicker( options );\n    \n                picker.once( 'ready', deferred.resolve );\n                picker.on( 'select', function( files ) {\n                    me.owner.request( 'add-file', [ files ]);\n                });\n                picker.init();\n    \n                this.pickers.push( picker );\n    \n                return deferred.promise();\n            },\n    \n            disable: function() {\n                $.each( this.pickers, function() {\n                    this.disable();\n                });\n            },\n    \n            enable: function() {\n                $.each( this.pickers, function() {\n                    this.enable();\n                });\n            }\n        });\n    });\n    /**\n     * @fileOverview 文件属性封装\n     */\n    define('file',[\n        'base',\n        'mediator'\n    ], function( Base, Mediator ) {\n    \n        var $ = Base.$,\n            idPrefix = 'WU_FILE_',\n            idSuffix = 0,\n            rExt = /\\.([^.]+)$/,\n            statusMap = {};\n    \n        function gid() {\n            return idPrefix + idSuffix++;\n        }\n    \n        /**\n         * 文件类\n         * @class File\n         * @constructor 构造函数\n         * @grammar new File( source ) => File\n         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。\n         */\n        function WUFile( source ) {\n    \n            /**\n             * 文件名，包括扩展名（后缀）\n             * @property name\n             * @type {string}\n             */\n            this.name = source.name || 'Untitled';\n    \n            /**\n             * 文件体积（字节）\n             * @property size\n             * @type {uint}\n             * @default 0\n             */\n            this.size = source.size || 0;\n    \n            /**\n             * 文件MIMETYPE类型，与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)\n             * @property type\n             * @type {string}\n             * @default 'application'\n             */\n            this.type = source.type || 'application';\n    \n            /**\n             * 文件最后修改日期\n             * @property lastModifiedDate\n             * @type {int}\n             * @default 当前时间戳\n             */\n            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);\n    \n            /**\n             * 文件ID，每个对象具有唯一ID，与文件名无关\n             * @property id\n             * @type {string}\n             */\n            this.id = gid();\n    \n            /**\n             * 文件扩展名，通过文件名获取，例如test.png的扩展名为png\n             * @property ext\n             * @type {string}\n             */\n            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';\n    \n    \n            /**\n             * 状态文字说明。在不同的status语境下有不同的用途。\n             * @property statusText\n             * @type {string}\n             */\n            this.statusText = '';\n    \n            // 存储文件状态，防止通过属性直接修改\n            statusMap[ this.id ] = WUFile.Status.INITED;\n    \n            this.source = source;\n            this.loaded = 0;\n    \n            this.on( 'error', function( msg ) {\n                this.setStatus( WUFile.Status.ERROR, msg );\n            });\n        }\n    \n        $.extend( WUFile.prototype, {\n    \n            /**\n             * 设置状态，状态变化时会触发`change`事件。\n             * @method setStatus\n             * @grammar setStatus( status[, statusText] );\n             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)\n             * @param {String} [statusText=''] 状态说明，常在error时使用，用http, abort,server等来标记是由于什么原因导致文件错误。\n             */\n            setStatus: function( status, text ) {\n    \n                var prevStatus = statusMap[ this.id ];\n    \n                typeof text !== 'undefined' && (this.statusText = text);\n    \n                if ( status !== prevStatus ) {\n                    statusMap[ this.id ] = status;\n                    /**\n                     * 文件状态变化\n                     * @event statuschange\n                     */\n                    this.trigger( 'statuschange', status, prevStatus );\n                }\n    \n            },\n    \n            /**\n             * 获取文件状态\n             * @return {File.Status}\n             * @example\n                     文件状态具体包括以下几种类型：\n                     {\n                         // 初始化\n                        INITED:     0,\n                        // 已入队列\n                        QUEUED:     1,\n                        // 正在上传\n                        PROGRESS:     2,\n                        // 上传出错\n                        ERROR:         3,\n                        // 上传成功\n                        COMPLETE:     4,\n                        // 上传取消\n                        CANCELLED:     5\n                    }\n             */\n            getStatus: function() {\n                return statusMap[ this.id ];\n            },\n    \n            /**\n             * 获取文件原始信息。\n             * @return {*}\n             */\n            getSource: function() {\n                return this.source;\n            },\n    \n            destory: function() {\n                delete statusMap[ this.id ];\n            }\n        });\n    \n        Mediator.installTo( WUFile.prototype );\n    \n        /**\n         * 文件状态值，具体包括以下几种类型：\n         * * `inited` 初始状态\n         * * `queued` 已经进入队列, 等待上传\n         * * `progress` 上传中\n         * * `complete` 上传完成。\n         * * `error` 上传出错，可重试\n         * * `interrupt` 上传中断，可续传。\n         * * `invalid` 文件不合格，不能重试上传。会自动从队列中移除。\n         * * `cancelled` 文件被移除。\n         * @property {Object} Status\n         * @namespace File\n         * @class File\n         * @static\n         */\n        WUFile.Status = {\n            INITED:     'inited',    // 初始状态\n            QUEUED:     'queued',    // 已经进入队列, 等待上传\n            PROGRESS:   'progress',    // 上传中\n            ERROR:      'error',    // 上传出错，可重试\n            COMPLETE:   'complete',    // 上传完成。\n            CANCELLED:  'cancelled',    // 上传取消。\n            INTERRUPT:  'interrupt',    // 上传中断，可续传。\n            INVALID:    'invalid'    // 文件不合格，不能重试上传。\n        };\n    \n        return WUFile;\n    });\n    \n    /**\n     * @fileOverview 文件队列\n     */\n    define('queue',[\n        'base',\n        'mediator',\n        'file'\n    ], function( Base, Mediator, WUFile ) {\n    \n        var $ = Base.$,\n            STATUS = WUFile.Status;\n    \n        /**\n         * 文件队列, 用来存储各个状态中的文件。\n         * @class Queue\n         * @extends Mediator\n         */\n        function Queue() {\n    \n            /**\n             * 统计文件数。\n             * * `numOfQueue` 队列中的文件数。\n             * * `numOfSuccess` 上传成功的文件数\n             * * `numOfCancel` 被移除的文件数\n             * * `numOfProgress` 正在上传中的文件数\n             * * `numOfUploadFailed` 上传错误的文件数。\n             * * `numOfInvalid` 无效的文件数。\n             * @property {Object} stats\n             */\n            this.stats = {\n                numOfQueue: 0,\n                numOfSuccess: 0,\n                numOfCancel: 0,\n                numOfProgress: 0,\n                numOfUploadFailed: 0,\n                numOfInvalid: 0\n            };\n    \n            // 上传队列，仅包括等待上传的文件\n            this._queue = [];\n    \n            // 存储所有文件\n            this._map = {};\n        }\n    \n        $.extend( Queue.prototype, {\n    \n            /**\n             * 将新文件加入对队列尾部\n             *\n             * @method append\n             * @param  {File} file   文件对象\n             */\n            append: function( file ) {\n                this._queue.push( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 将新文件加入对队列头部\n             *\n             * @method prepend\n             * @param  {File} file   文件对象\n             */\n            prepend: function( file ) {\n                this._queue.unshift( file );\n                this._fileAdded( file );\n                return this;\n            },\n    \n            /**\n             * 获取文件对象\n             *\n             * @method getFile\n             * @param  {String} fileId   文件ID\n             * @return {File}\n             */\n            getFile: function( fileId ) {\n                if ( typeof fileId !== 'string' ) {\n                    return fileId;\n                }\n                return this._map[ fileId ];\n            },\n    \n            /**\n             * 从队列中取出一个指定状态的文件。\n             * @grammar fetch( status ) => File\n             * @method fetch\n             * @param {String} status [文件状态值](#WebUploader:File:File.Status)\n             * @return {File} [File](#WebUploader:File)\n             */\n            fetch: function( status ) {\n                var len = this._queue.length,\n                    i, file;\n    \n                status = status || STATUS.QUEUED;\n    \n                for ( i = 0; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( status === file.getStatus() ) {\n                        return file;\n                    }\n                }\n    \n                return null;\n            },\n    \n            /**\n             * 对队列进行排序，能够控制文件上传顺序。\n             * @grammar sort( fn ) => undefined\n             * @method sort\n             * @param {Function} fn 排序方法\n             */\n            sort: function( fn ) {\n                if ( typeof fn === 'function' ) {\n                    this._queue.sort( fn );\n                }\n            },\n    \n            /**\n             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。\n             * @grammar getFiles( [status1[, status2 ...]] ) => Array\n             * @method getFiles\n             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)\n             */\n            getFiles: function() {\n                var sts = [].slice.call( arguments, 0 ),\n                    ret = [],\n                    i = 0,\n                    len = this._queue.length,\n                    file;\n    \n                for ( ; i < len; i++ ) {\n                    file = this._queue[ i ];\n    \n                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {\n                        continue;\n                    }\n    \n                    ret.push( file );\n                }\n    \n                return ret;\n            },\n    \n            _fileAdded: function( file ) {\n                var me = this,\n                    existing = this._map[ file.id ];\n    \n                if ( !existing ) {\n                    this._map[ file.id ] = file;\n    \n                    file.on( 'statuschange', function( cur, pre ) {\n                        me._onFileStatusChange( cur, pre );\n                    });\n                }\n    \n                file.setStatus( STATUS.QUEUED );\n            },\n    \n            _onFileStatusChange: function( curStatus, preStatus ) {\n                var stats = this.stats;\n    \n                switch ( preStatus ) {\n                    case STATUS.PROGRESS:\n                        stats.numOfProgress--;\n                        break;\n    \n                    case STATUS.QUEUED:\n                        stats.numOfQueue --;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed--;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid--;\n                        break;\n                }\n    \n                switch ( curStatus ) {\n                    case STATUS.QUEUED:\n                        stats.numOfQueue++;\n                        break;\n    \n                    case STATUS.PROGRESS:\n                        stats.numOfProgress++;\n                        break;\n    \n                    case STATUS.ERROR:\n                        stats.numOfUploadFailed++;\n                        break;\n    \n                    case STATUS.COMPLETE:\n                        stats.numOfSuccess++;\n                        break;\n    \n                    case STATUS.CANCELLED:\n                        stats.numOfCancel++;\n                        break;\n    \n                    case STATUS.INVALID:\n                        stats.numOfInvalid++;\n                        break;\n                }\n            }\n    \n        });\n    \n        Mediator.installTo( Queue.prototype );\n    \n        return Queue;\n    });\n    /**\n     * @fileOverview 队列\n     */\n    define('widgets/queue',[\n        'base',\n        'uploader',\n        'queue',\n        'file',\n        'lib/file',\n        'runtime/client',\n        'widgets/widget'\n    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {\n    \n        var $ = Base.$,\n            rExt = /\\.\\w+$/,\n            Status = WUFile.Status;\n    \n        return Uploader.register({\n            'sort-files': 'sortFiles',\n            'add-file': 'addFiles',\n            'get-file': 'getFile',\n            'fetch-file': 'fetchFile',\n            'get-stats': 'getStats',\n            'get-files': 'getFiles',\n            'remove-file': 'removeFile',\n            'retry': 'retry',\n            'reset': 'reset',\n            'accept-file': 'acceptFile'\n        }, {\n    \n            init: function( opts ) {\n                var me = this,\n                    deferred, len, i, item, arr, accept, runtime;\n    \n                if ( $.isPlainObject( opts.accept ) ) {\n                    opts.accept = [ opts.accept ];\n                }\n    \n                // accept中的中生成匹配正则。\n                if ( opts.accept ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        item = opts.accept[ i ].extensions;\n                        item && arr.push( item );\n                    }\n    \n                    if ( arr.length ) {\n                        accept = '\\\\.' + arr.join(',')\n                                .replace( /,/g, '$|\\\\.' )\n                                .replace( /\\*/g, '.*' ) + '$';\n                    }\n    \n                    me.accept = new RegExp( accept, 'i' );\n                }\n    \n                me.queue = new Queue();\n                me.stats = me.queue.stats;\n    \n                // 如果当前不是html5运行时，那就算了。\n                // 不执行后续操作\n                if ( this.request('predict-runtime-type') !== 'html5' ) {\n                    return;\n                }\n    \n                // 创建一个 html5 运行时的 placeholder\n                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。\n                deferred = Base.Deferred();\n                runtime = new RuntimeClient('Placeholder');\n                runtime.connectRuntime({\n                    runtimeOrder: 'html5'\n                }, function() {\n                    me._ruid = runtime.getRuid();\n                    deferred.resolve();\n                });\n                return deferred.promise();\n            },\n    \n    \n            // 为了支持外部直接添加一个原生File对象。\n            _wrapFile: function( file ) {\n                if ( !(file instanceof WUFile) ) {\n    \n                    if ( !(file instanceof File) ) {\n                        if ( !this._ruid ) {\n                            throw new Error('Can\\'t add external files.');\n                        }\n                        file = new File( this._ruid, file );\n                    }\n    \n                    file = new WUFile( file );\n                }\n    \n                return file;\n            },\n    \n            // 判断文件是否可以被加入队列\n            acceptFile: function( file ) {\n                var invalid = !file || file.size < 6 || this.accept &&\n    \n                        // 如果名字中有后缀，才做后缀白名单处理。\n                        rExt.exec( file.name ) && !this.accept.test( file.name );\n    \n                return !invalid;\n            },\n    \n    \n            /**\n             * @event beforeFileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列之前触发，此事件的handler返回值为`false`，则此文件不会被添加进入队列。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event fileQueued\n             * @param {File} file File对象\n             * @description 当文件被加入队列以后触发。\n             * @for  Uploader\n             */\n    \n            _addFile: function( file ) {\n                var me = this;\n    \n                file = me._wrapFile( file );\n    \n                // 不过类型判断允许不允许，先派送 `beforeFileQueued`\n                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {\n                    return;\n                }\n    \n                // 类型不匹配，则派送错误事件，并返回。\n                if ( !me.acceptFile( file ) ) {\n                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );\n                    return;\n                }\n    \n                me.queue.append( file );\n                me.owner.trigger( 'fileQueued', file );\n                return file;\n            },\n    \n            getFile: function( fileId ) {\n                return this.queue.getFile( fileId );\n            },\n    \n            /**\n             * @event filesQueued\n             * @param {File} files 数组，内容为原始File(lib/File）对象。\n             * @description 当一批文件添加进队列以后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method addFiles\n             * @grammar addFiles( file ) => undefined\n             * @grammar addFiles( [file1, file2 ...] ) => undefined\n             * @param {Array of File or File} [files] Files 对象 数组\n             * @description 添加文件到队列\n             * @for  Uploader\n             */\n            addFiles: function( files ) {\n                var me = this;\n    \n                if ( !files.length ) {\n                    files = [ files ];\n                }\n    \n                files = $.map( files, function( file ) {\n                    return me._addFile( file );\n                });\n    \n                me.owner.trigger( 'filesQueued', files );\n    \n                if ( me.options.auto ) {\n                    me.request('start-upload');\n                }\n            },\n    \n            getStats: function() {\n                return this.stats;\n            },\n    \n            /**\n             * @event fileDequeued\n             * @param {File} file File对象\n             * @description 当文件被移除队列后触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @method removeFile\n             * @grammar removeFile( file ) => undefined\n             * @grammar removeFile( id ) => undefined\n             * @param {File|id} file File对象或这File对象的id\n             * @description 移除某一文件。\n             * @for  Uploader\n             * @example\n             *\n             * $li.on('click', '.remove-this', function() {\n             *     uploader.removeFile( file );\n             * })\n             */\n            removeFile: function( file ) {\n                var me = this;\n    \n                file = file.id ? file : me.queue.getFile( file );\n    \n                file.setStatus( Status.CANCELLED );\n                me.owner.trigger( 'fileDequeued', file );\n            },\n    \n            /**\n             * @method getFiles\n             * @grammar getFiles() => Array\n             * @grammar getFiles( status1, status2, status... ) => Array\n             * @description 返回指定状态的文件集合，不传参数将返回所有状态的文件。\n             * @for  Uploader\n             * @example\n             * console.log( uploader.getFiles() );    // => all files\n             * console.log( uploader.getFiles('error') )    // => all error files.\n             */\n            getFiles: function() {\n                return this.queue.getFiles.apply( this.queue, arguments );\n            },\n    \n            fetchFile: function() {\n                return this.queue.fetch.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method retry\n             * @grammar retry() => undefined\n             * @grammar retry( file ) => undefined\n             * @description 重试上传，重试指定文件，或者从出错的文件开始重新上传。\n             * @for  Uploader\n             * @example\n             * function retry() {\n             *     uploader.retry();\n             * }\n             */\n            retry: function( file, noForceStart ) {\n                var me = this,\n                    files, i, len;\n    \n                if ( file ) {\n                    file = file.id ? file : me.queue.getFile( file );\n                    file.setStatus( Status.QUEUED );\n                    noForceStart || me.request('start-upload');\n                    return;\n                }\n    \n                files = me.queue.getFiles( Status.ERROR );\n                i = 0;\n                len = files.length;\n    \n                for ( ; i < len; i++ ) {\n                    file = files[ i ];\n                    file.setStatus( Status.QUEUED );\n                }\n    \n                me.request('start-upload');\n            },\n    \n            /**\n             * @method sort\n             * @grammar sort( fn ) => undefined\n             * @description 排序队列中的文件，在上传之前调整可以控制上传顺序。\n             * @for  Uploader\n             */\n            sortFiles: function() {\n                return this.queue.sort.apply( this.queue, arguments );\n            },\n    \n            /**\n             * @method reset\n             * @grammar reset() => undefined\n             * @description 重置uploader。目前只重置了队列。\n             * @for  Uploader\n             * @example\n             * uploader.reset();\n             */\n            reset: function() {\n                this.queue = new Queue();\n                this.stats = this.queue.stats;\n            }\n        });\n    \n    });\n    /**\n     * @fileOverview 添加获取Runtime相关信息的方法。\n     */\n    define('widgets/runtime',[\n        'uploader',\n        'runtime/runtime',\n        'widgets/widget'\n    ], function( Uploader, Runtime ) {\n    \n        Uploader.support = function() {\n            return Runtime.hasRuntime.apply( Runtime, arguments );\n        };\n    \n        return Uploader.register({\n            'predict-runtime-type': 'predictRuntmeType'\n        }, {\n    \n            init: function() {\n                if ( !this.predictRuntmeType() ) {\n                    throw Error('Runtime Error');\n                }\n            },\n    \n            /**\n             * 预测Uploader将采用哪个`Runtime`\n             * @grammar predictRuntmeType() => String\n             * @method predictRuntmeType\n             * @for  Uploader\n             */\n            predictRuntmeType: function() {\n                var orders = this.options.runtimeOrder || Runtime.orders,\n                    type = this.type,\n                    i, len;\n    \n                if ( !type ) {\n                    orders = orders.split( /\\s*,\\s*/g );\n    \n                    for ( i = 0, len = orders.length; i < len; i++ ) {\n                        if ( Runtime.hasRuntime( orders[ i ] ) ) {\n                            this.type = type = orders[ i ];\n                            break;\n                        }\n                    }\n                }\n    \n                return type;\n            }\n        });\n    });\n    /**\n     * @fileOverview Transport\n     */\n    define('lib/transport',[\n        'base',\n        'runtime/client',\n        'mediator'\n    ], function( Base, RuntimeClient, Mediator ) {\n    \n        var $ = Base.$;\n    \n        function Transport( opts ) {\n            var me = this;\n    \n            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );\n            RuntimeClient.call( this, 'Transport' );\n    \n            this._blob = null;\n            this._formData = opts.formData || {};\n            this._headers = opts.headers || {};\n    \n            this.on( 'progress', this._timeout );\n            this.on( 'load error', function() {\n                me.trigger( 'progress', 1 );\n                clearTimeout( me._timer );\n            });\n        }\n    \n        Transport.options = {\n            server: '',\n            method: 'POST',\n    \n            // 跨域时，是否允许携带cookie, 只有html5 runtime才有效\n            withCredentials: false,\n            fileVal: 'file',\n            timeout: 2 * 60 * 1000,    // 2分钟\n            formData: {},\n            headers: {},\n            sendAsBinary: false\n        };\n    \n        $.extend( Transport.prototype, {\n    \n            // 添加Blob, 只能添加一次，最后一次有效。\n            appendBlob: function( key, blob, filename ) {\n                var me = this,\n                    opts = me.options;\n    \n                if ( me.getRuid() ) {\n                    me.disconnectRuntime();\n                }\n    \n                // 连接到blob归属的同一个runtime.\n                me.connectRuntime( blob.ruid, function() {\n                    me.exec('init');\n                });\n    \n                me._blob = blob;\n                opts.fileVal = key || opts.fileVal;\n                opts.filename = filename || opts.filename;\n            },\n    \n            // 添加其他字段\n            append: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._formData, key );\n                } else {\n                    this._formData[ key ] = value;\n                }\n            },\n    \n            setRequestHeader: function( key, value ) {\n                if ( typeof key === 'object' ) {\n                    $.extend( this._headers, key );\n                } else {\n                    this._headers[ key ] = value;\n                }\n            },\n    \n            send: function( method ) {\n                this.exec( 'send', method );\n                this._timeout();\n            },\n    \n            abort: function() {\n                clearTimeout( this._timer );\n                return this.exec('abort');\n            },\n    \n            destroy: function() {\n                this.trigger('destroy');\n                this.off();\n                this.exec('destroy');\n                this.disconnectRuntime();\n            },\n    \n            getResponse: function() {\n                return this.exec('getResponse');\n            },\n    \n            getResponseAsJson: function() {\n                return this.exec('getResponseAsJson');\n            },\n    \n            getStatus: function() {\n                return this.exec('getStatus');\n            },\n    \n            _timeout: function() {\n                var me = this,\n                    duration = me.options.timeout;\n    \n                if ( !duration ) {\n                    return;\n                }\n    \n                clearTimeout( me._timer );\n                me._timer = setTimeout(function() {\n                    me.abort();\n                    me.trigger( 'error', 'timeout' );\n                }, duration );\n            }\n    \n        });\n    \n        // 让Transport具备事件功能。\n        Mediator.installTo( Transport.prototype );\n    \n        return Transport;\n    });\n    /**\n     * @fileOverview 负责文件上传相关。\n     */\n    define('widgets/upload',[\n        'base',\n        'uploader',\n        'file',\n        'lib/transport',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile, Transport ) {\n    \n        var $ = Base.$,\n            isPromise = Base.isPromise,\n            Status = WUFile.Status;\n    \n        // 添加默认配置项\n        $.extend( Uploader.options, {\n    \n    \n            /**\n             * @property {Boolean} [prepareNextFile=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否允许在文件传输时提前把下一个文件准备好。\n             * 对于一个文件的准备工作比较耗时，比如图片压缩，md5序列化。\n             * 如果能提前在当前文件传输期处理，可以节省总体耗时。\n             */\n            prepareNextFile: false,\n    \n            /**\n             * @property {Boolean} [chunked=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否要分片处理大文件上传。\n             */\n            chunked: false,\n    \n            /**\n             * @property {Boolean} [chunkSize=5242880]\n             * @namespace options\n             * @for Uploader\n             * @description 如果要分片，分多大一片？ 默认大小为5M.\n             */\n            chunkSize: 5 * 1024 * 1024,\n    \n            /**\n             * @property {Boolean} [chunkRetry=2]\n             * @namespace options\n             * @for Uploader\n             * @description 如果某个分片由于网络问题出错，允许自动重传多少次？\n             */\n            chunkRetry: 2,\n    \n            /**\n             * @property {Boolean} [threads=3]\n             * @namespace options\n             * @for Uploader\n             * @description 上传并发数。允许同时最大上传进程数。\n             */\n            threads: 3,\n    \n    \n            /**\n             * @property {Object} [formData]\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传请求的参数表，每次发送都会发送此对象中的参数。\n             */\n            formData: null\n    \n            /**\n             * @property {Object} [fileVal='file']\n             * @namespace options\n             * @for Uploader\n             * @description 设置文件上传域的name。\n             */\n    \n            /**\n             * @property {Object} [method='POST']\n             * @namespace options\n             * @for Uploader\n             * @description 文件上传方式，`POST`或者`GET`。\n             */\n    \n            /**\n             * @property {Object} [sendAsBinary=false]\n             * @namespace options\n             * @for Uploader\n             * @description 是否已二进制的流的方式发送文件，这样整个上传内容`php://input`都为文件内容，\n             * 其他参数在$_GET数组中。\n             */\n        });\n    \n        // 负责将文件切片。\n        function CuteFile( file, chunkSize ) {\n            var pending = [],\n                blob = file.source,\n                total = blob.size,\n                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,\n                start = 0,\n                index = 0,\n                len;\n    \n            while ( index < chunks ) {\n                len = Math.min( chunkSize, total - start );\n    \n                pending.push({\n                    file: file,\n                    start: start,\n                    end: chunkSize ? (start + len) : total,\n                    total: total,\n                    chunks: chunks,\n                    chunk: index++\n                });\n                start += len;\n            }\n    \n            file.blocks = pending.concat();\n            file.remaning = pending.length;\n    \n            return {\n                file: file,\n    \n                has: function() {\n                    return !!pending.length;\n                },\n    \n                fetch: function() {\n                    return pending.shift();\n                }\n            };\n        }\n    \n        Uploader.register({\n            'start-upload': 'start',\n            'stop-upload': 'stop',\n            'skip-file': 'skipFile',\n            'is-in-progress': 'isInProgress'\n        }, {\n    \n            init: function() {\n                var owner = this.owner;\n    \n                this.runing = false;\n    \n                // 记录当前正在传的数据，跟threads相关\n                this.pool = [];\n    \n                // 缓存即将上传的文件。\n                this.pending = [];\n    \n                // 跟踪还有多少分片没有完成上传。\n                this.remaning = 0;\n                this.__tick = Base.bindFn( this._tick, this );\n    \n                owner.on( 'uploadComplete', function( file ) {\n                    // 把其他块取消了。\n                    file.blocks && $.each( file.blocks, function( _, v ) {\n                        v.transport && (v.transport.abort(), v.transport.destroy());\n                        delete v.transport;\n                    });\n    \n                    delete file.blocks;\n                    delete file.remaning;\n                });\n            },\n    \n            /**\n             * @event startUpload\n             * @description 当开始上传流程时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 开始上传。此方法可以从初始状态调用开始上传流程，也可以从暂停状态调用，继续上传流程。\n             * @grammar upload() => undefined\n             * @method upload\n             * @for  Uploader\n             */\n            start: function() {\n                var me = this;\n    \n                // 移出invalid的文件\n                $.each( me.request( 'get-files', Status.INVALID ), function() {\n                    me.request( 'remove-file', this );\n                });\n    \n                if ( me.runing ) {\n                    return;\n                }\n    \n                me.runing = true;\n    \n                // 如果有暂停的，则续传\n                $.each( me.pool, function( _, v ) {\n                    var file = v.file;\n    \n                    if ( file.getStatus() === Status.INTERRUPT ) {\n                        file.setStatus( Status.PROGRESS );\n                        me._trigged = false;\n                        v.transport && v.transport.send();\n                    }\n                });\n    \n                me._trigged = false;\n                me.owner.trigger('startUpload');\n                Base.nextTick( me.__tick );\n            },\n    \n            /**\n             * @event stopUpload\n             * @description 当开始上传流程暂停时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。\n             * @grammar stop() => undefined\n             * @grammar stop( true ) => undefined\n             * @method stop\n             * @for  Uploader\n             */\n            stop: function( interrupt ) {\n                var me = this;\n    \n                if ( me.runing === false ) {\n                    return;\n                }\n    \n                me.runing = false;\n    \n                interrupt && $.each( me.pool, function( _, v ) {\n                    v.transport && v.transport.abort();\n                    v.file.setStatus( Status.INTERRUPT );\n                });\n    \n                me.owner.trigger('stopUpload');\n            },\n    \n            /**\n             * 判断`Uplaode`r是否正在上传中。\n             * @grammar isInProgress() => Boolean\n             * @method isInProgress\n             * @for  Uploader\n             */\n            isInProgress: function() {\n                return !!this.runing;\n            },\n    \n            getStats: function() {\n                return this.request('get-stats');\n            },\n    \n            /**\n             * 掉过一个文件上传，直接标记指定文件为已上传状态。\n             * @grammar skipFile( file ) => undefined\n             * @method skipFile\n             * @for  Uploader\n             */\n            skipFile: function( file, status ) {\n                file = this.request( 'get-file', file );\n    \n                file.setStatus( status || Status.COMPLETE );\n                file.skipped = true;\n    \n                // 如果正在上传。\n                file.blocks && $.each( file.blocks, function( _, v ) {\n                    var _tr = v.transport;\n    \n                    if ( _tr ) {\n                        _tr.abort();\n                        _tr.destroy();\n                        delete v.transport;\n                    }\n                });\n    \n                this.owner.trigger( 'uploadSkip', file );\n            },\n    \n            /**\n             * @event uploadFinished\n             * @description 当所有文件上传结束时触发。\n             * @for  Uploader\n             */\n            _tick: function() {\n                var me = this,\n                    opts = me.options,\n                    fn, val;\n    \n                // 上一个promise还没有结束，则等待完成后再执行。\n                if ( me._promise ) {\n                    return me._promise.always( me.__tick );\n                }\n    \n                // 还有位置，且还有文件要处理的话。\n                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {\n                    me._trigged = false;\n    \n                    fn = function( val ) {\n                        me._promise = null;\n    \n                        // 有可能是reject过来的，所以要检测val的类型。\n                        val && val.file && me._startSend( val );\n                        Base.nextTick( me.__tick );\n                    };\n    \n                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );\n    \n                // 没有要上传的了，且没有正在传输的了。\n                } else if ( !me.remaning && !me.getStats().numOfQueue ) {\n                    me.runing = false;\n    \n                    me._trigged || Base.nextTick(function() {\n                        me.owner.trigger('uploadFinished');\n                    });\n                    me._trigged = true;\n                }\n            },\n    \n            _nextBlock: function() {\n                var me = this,\n                    act = me._act,\n                    opts = me.options,\n                    next, done;\n    \n                // 如果当前文件还有没有需要传输的，则直接返回剩下的。\n                if ( act && act.has() &&\n                        act.file.getStatus() === Status.PROGRESS ) {\n    \n                    // 是否提前准备下一个文件\n                    if ( opts.prepareNextFile && !me.pending.length ) {\n                        me._prepareNextFile();\n                    }\n    \n                    return act.fetch();\n    \n                // 否则，如果正在运行，则准备下一个文件，并等待完成后返回下个分片。\n                } else if ( me.runing ) {\n    \n                    // 如果缓存中有，则直接在缓存中取，没有则去queue中取。\n                    if ( !me.pending.length && me.getStats().numOfQueue ) {\n                        me._prepareNextFile();\n                    }\n    \n                    next = me.pending.shift();\n                    done = function( file ) {\n                        if ( !file ) {\n                            return null;\n                        }\n    \n                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );\n                        me._act = act;\n                        return act.fetch();\n                    };\n    \n                    // 文件可能还在prepare中，也有可能已经完全准备好了。\n                    return isPromise( next ) ?\n                            next[ next.pipe ? 'pipe' : 'then']( done ) :\n                            done( next );\n                }\n            },\n    \n    \n            /**\n             * @event uploadStart\n             * @param {File} file File对象\n             * @description 某个文件开始上传前触发，一个文件只会触发一次。\n             * @for  Uploader\n             */\n            _prepareNextFile: function() {\n                var me = this,\n                    file = me.request('fetch-file'),\n                    pending = me.pending,\n                    promise;\n    \n                if ( file ) {\n                    promise = me.request( 'before-send-file', file, function() {\n    \n                        // 有可能文件被skip掉了。文件被skip掉后，状态坑定不是Queued.\n                        if ( file.getStatus() === Status.QUEUED ) {\n                            me.owner.trigger( 'uploadStart', file );\n                            file.setStatus( Status.PROGRESS );\n                            return file;\n                        }\n    \n                        return me._finishFile( file );\n                    });\n    \n                    // 如果还在pending中，则替换成文件本身。\n                    promise.done(function() {\n                        var idx = $.inArray( promise, pending );\n    \n                        ~idx && pending.splice( idx, 1, file );\n                    });\n    \n                    // befeore-send-file的钩子就有错误发生。\n                    promise.fail(function( reason ) {\n                        file.setStatus( Status.ERROR, reason );\n                        me.owner.trigger( 'uploadError', file, reason );\n                        me.owner.trigger( 'uploadComplete', file );\n                    });\n    \n                    pending.push( promise );\n                }\n            },\n    \n            // 让出位置了，可以让其他分片开始上传\n            _popBlock: function( block ) {\n                var idx = $.inArray( block, this.pool );\n    \n                this.pool.splice( idx, 1 );\n                block.file.remaning--;\n                this.remaning--;\n            },\n    \n            // 开始上传，可以被掉过。如果promise被reject了，则表示跳过此分片。\n            _startSend: function( block ) {\n                var me = this,\n                    file = block.file,\n                    promise;\n    \n                me.pool.push( block );\n                me.remaning++;\n    \n                // 如果没有分片，则直接使用原始的。\n                // 不会丢失content-type信息。\n                block.blob = block.chunks === 1 ? file.source :\n                        file.source.slice( block.start, block.end );\n    \n                // hook, 每个分片发送之前可能要做些异步的事情。\n                promise = me.request( 'before-send', block, function() {\n    \n                    // 有可能文件已经上传出错了，所以不需要再传输了。\n                    if ( file.getStatus() === Status.PROGRESS ) {\n                        me._doSend( block );\n                    } else {\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n    \n                // 如果为fail了，则跳过此分片。\n                promise.fail(function() {\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file ).always(function() {\n                            block.percentage = 1;\n                            me._popBlock( block );\n                            me.owner.trigger( 'uploadComplete', file );\n                            Base.nextTick( me.__tick );\n                        });\n                    } else {\n                        block.percentage = 1;\n                        me._popBlock( block );\n                        Base.nextTick( me.__tick );\n                    }\n                });\n            },\n    \n    \n            /**\n             * @event uploadBeforeSend\n             * @param {Object} object\n             * @param {Object} data 默认的上传参数，可以扩展此对象来控制上传参数。\n             * @description 当某个文件的分块在发送前触发，主要用来询问是否要添加附带参数，大文件在开起分片上传的前提下此事件可能会触发多次。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadAccept\n             * @param {Object} object\n             * @param {Object} ret 服务端的返回数据，json格式，如果服务端不是json格式，从ret._raw中取数据，自行解析。\n             * @description 当某个文件上传到服务端响应后，会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadProgress\n             * @param {File} file File对象\n             * @param {Number} percentage 上传进度\n             * @description 上传过程中触发，携带上传进度。\n             * @for  Uploader\n             */\n    \n    \n            /**\n             * @event uploadError\n             * @param {File} file File对象\n             * @param {String} reason 出错的code\n             * @description 当文件上传出错时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadSuccess\n             * @param {File} file File对象\n             * @param {Object} response 服务端返回的数据\n             * @description 当文件上传成功时触发。\n             * @for  Uploader\n             */\n    \n            /**\n             * @event uploadComplete\n             * @param {File} [file] File对象\n             * @description 不管成功或者失败，文件上传完成时触发。\n             * @for  Uploader\n             */\n    \n            // 做上传操作。\n            _doSend: function( block ) {\n                var me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    file = block.file,\n                    tr = new Transport( opts ),\n                    data = $.extend({}, opts.formData ),\n                    headers = $.extend({}, opts.headers ),\n                    requestAccept, ret;\n    \n                block.transport = tr;\n    \n                tr.on( 'destroy', function() {\n                    delete block.transport;\n                    me._popBlock( block );\n                    Base.nextTick( me.__tick );\n                });\n    \n                // 广播上传进度。以文件为单位。\n                tr.on( 'progress', function( percentage ) {\n                    var totalPercent = 0,\n                        uploaded = 0;\n    \n                    // 可能没有abort掉，progress还是执行进来了。\n                    // if ( !file.blocks ) {\n                    //     return;\n                    // }\n    \n                    totalPercent = block.percentage = percentage;\n    \n                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。\n                        $.each( file.blocks, function( _, v ) {\n                            uploaded += (v.percentage || 0) * (v.end - v.start);\n                        });\n    \n                        totalPercent = uploaded / file.size;\n                    }\n    \n                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );\n                });\n    \n                // 用来询问，是否返回的结果是有错误的。\n                requestAccept = function( reject ) {\n                    var fn;\n    \n                    ret = tr.getResponseAsJson() || {};\n                    ret._raw = tr.getResponse();\n                    fn = function( value ) {\n                        reject = value;\n                    };\n    \n                    // 服务端响应了，不代表成功了，询问是否响应正确。\n                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {\n                        reject = reject || 'server';\n                    }\n    \n                    return reject;\n                };\n    \n                // 尝试重试，然后广播文件上传出错。\n                tr.on( 'error', function( type, flag ) {\n                    block.retried = block.retried || 0;\n    \n                    // 自动重试\n                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&\n                            block.retried < opts.chunkRetry ) {\n    \n                        block.retried++;\n                        tr.send();\n    \n                    } else {\n    \n                        // http status 500 ~ 600\n                        if ( !flag && type === 'server' ) {\n                            type = requestAccept( type );\n                        }\n    \n                        file.setStatus( Status.ERROR, type );\n                        owner.trigger( 'uploadError', file, type );\n                        owner.trigger( 'uploadComplete', file );\n                    }\n                });\n    \n                // 上传成功\n                tr.on( 'load', function() {\n                    var reason;\n    \n                    // 如果非预期，转向上传出错。\n                    if ( (reason = requestAccept()) ) {\n                        tr.trigger( 'error', reason, true );\n                        return;\n                    }\n    \n                    // 全部上传完成。\n                    if ( file.remaning === 1 ) {\n                        me._finishFile( file, ret );\n                    } else {\n                        tr.destroy();\n                    }\n                });\n    \n                // 配置默认的上传字段。\n                data = $.extend( data, {\n                    id: file.id,\n                    name: file.name,\n                    type: file.type,\n                    lastModifiedDate: file.lastModifiedDate,\n                    size: file.size\n                });\n    \n                block.chunks > 1 && $.extend( data, {\n                    chunks: block.chunks,\n                    chunk: block.chunk\n                });\n    \n                // 在发送之间可以添加字段什么的。。。\n                // 如果默认的字段不够使用，可以通过监听此事件来扩展\n                owner.trigger( 'uploadBeforeSend', block, data, headers );\n    \n                // 开始发送。\n                tr.appendBlob( opts.fileVal, block.blob, file.name );\n                tr.append( data );\n                tr.setRequestHeader( headers );\n                tr.send();\n            },\n    \n            // 完成上传。\n            _finishFile: function( file, ret, hds ) {\n                var owner = this.owner;\n    \n                return owner\n                        .request( 'after-send-file', arguments, function() {\n                            file.setStatus( Status.COMPLETE );\n                            owner.trigger( 'uploadSuccess', file, ret, hds );\n                        })\n                        .fail(function( reason ) {\n    \n                            // 如果外部已经标记为invalid什么的，不再改状态。\n                            if ( file.getStatus() === Status.PROGRESS ) {\n                                file.setStatus( Status.ERROR, reason );\n                            }\n    \n                            owner.trigger( 'uploadError', file, reason );\n                        })\n                        .always(function() {\n                            owner.trigger( 'uploadComplete', file );\n                        });\n            }\n    \n        });\n    });\n    /**\n     * @fileOverview 各种验证，包括文件总大小是否超出、单文件是否超出和文件是否重复。\n     */\n    \n    define('widgets/validator',[\n        'base',\n        'uploader',\n        'file',\n        'widgets/widget'\n    ], function( Base, Uploader, WUFile ) {\n    \n        var $ = Base.$,\n            validators = {},\n            api;\n    \n        /**\n         * @event error\n         * @param {String} type 错误类型。\n         * @description 当validate不通过时，会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误，目前有以下错误会在特定的情况下派送错来。\n         *\n         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。\n         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。\n         * @for  Uploader\n         */\n    \n        // 暴露给外面的api\n        api = {\n    \n            // 添加验证器\n            addValidator: function( type, cb ) {\n                validators[ type ] = cb;\n            },\n    \n            // 移除验证器\n            removeValidator: function( type ) {\n                delete validators[ type ];\n            }\n        };\n    \n        // 在Uploader初始化的时候启动Validators的初始化\n        Uploader.register({\n            init: function() {\n                var me = this;\n                $.each( validators, function() {\n                    this.call( me.owner );\n                });\n            }\n        });\n    \n        /**\n         * @property {int} [fileNumLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证文件总数量, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileNumLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                count = 0,\n                max = opts.fileNumLimit >> 0,\n                flag = true;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n    \n                if ( count >= max && flag ) {\n                    flag = false;\n                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );\n                    setTimeout(function() {\n                        flag = true;\n                    }, 1 );\n                }\n    \n                return count >= max ? false : true;\n            });\n    \n            uploader.on( 'fileQueued', function() {\n                count++;\n            });\n    \n            uploader.on( 'fileDequeued', function() {\n                count--;\n            });\n    \n            uploader.on( 'uploadFinished', function() {\n                count = 0;\n            });\n        });\n    \n    \n        /**\n         * @property {int} [fileSizeLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileSizeLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                count = 0,\n                max = opts.fileSizeLimit >> 0,\n                flag = true;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n                var invalid = count + file.size > max;\n    \n                if ( invalid && flag ) {\n                    flag = false;\n                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );\n                    setTimeout(function() {\n                        flag = true;\n                    }, 1 );\n                }\n    \n                return invalid ? false : true;\n            });\n    \n            uploader.on( 'fileQueued', function( file ) {\n                count += file.size;\n            });\n    \n            uploader.on( 'fileDequeued', function( file ) {\n                count -= file.size;\n            });\n    \n            uploader.on( 'uploadFinished', function() {\n                count = 0;\n            });\n        });\n    \n        /**\n         * @property {int} [fileSingleSizeLimit=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。\n         */\n        api.addValidator( 'fileSingleSizeLimit', function() {\n            var uploader = this,\n                opts = uploader.options,\n                max = opts.fileSingleSizeLimit;\n    \n            if ( !max ) {\n                return;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n    \n                if ( file.size > max ) {\n                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );\n                    this.trigger( 'error', 'F_EXCEED_SIZE', file );\n                    return false;\n                }\n    \n            });\n    \n        });\n    \n        /**\n         * @property {int} [duplicate=undefined]\n         * @namespace options\n         * @for Uploader\n         * @description 去重， 根据文件名字、文件大小和最后修改时间来生成hash Key.\n         */\n        api.addValidator( 'duplicate', function() {\n            var uploader = this,\n                opts = uploader.options,\n                mapping = {};\n    \n            if ( opts.duplicate ) {\n                return;\n            }\n    \n            function hashString( str ) {\n                var hash = 0,\n                    i = 0,\n                    len = str.length,\n                    _char;\n    \n                for ( ; i < len; i++ ) {\n                    _char = str.charCodeAt( i );\n                    hash = _char + (hash << 6) + (hash << 16) - hash;\n                }\n    \n                return hash;\n            }\n    \n            uploader.on( 'beforeFileQueued', function( file ) {\n                var hash = file.__hash || (file.__hash = hashString( file.name +\n                        file.size + file.lastModifiedDate ));\n    \n                // 已经重复了\n                if ( mapping[ hash ] ) {\n                    this.trigger( 'error', 'F_DUPLICATE', file );\n                    return false;\n                }\n            });\n    \n            uploader.on( 'fileQueued', function( file ) {\n                var hash = file.__hash;\n    \n                hash && (mapping[ hash ] = true);\n            });\n    \n            uploader.on( 'fileDequeued', function( file ) {\n                var hash = file.__hash;\n    \n                hash && (delete mapping[ hash ]);\n            });\n        });\n    \n        return api;\n    });\n    \n    /**\n     * @fileOverview Runtime管理器，负责Runtime的选择, 连接\n     */\n    define('runtime/compbase',[],function() {\n    \n        function CompBase( owner, runtime ) {\n    \n            this.owner = owner;\n            this.options = owner.options;\n    \n            this.getRuntime = function() {\n                return runtime;\n            };\n    \n            this.getRuid = function() {\n                return runtime.uid;\n            };\n    \n            this.trigger = function() {\n                return owner.trigger.apply( owner, arguments );\n            };\n        }\n    \n        return CompBase;\n    });\n    /**\n     * @fileOverview Html5Runtime\n     */\n    define('runtime/html5/runtime',[\n        'base',\n        'runtime/runtime',\n        'runtime/compbase'\n    ], function( Base, Runtime, CompBase ) {\n    \n        var type = 'html5',\n            components = {};\n    \n        function Html5Runtime() {\n            var pool = {},\n                me = this,\n                destory = this.destory;\n    \n            Runtime.apply( me, arguments );\n            me.type = type;\n    \n    \n            // 这个方法的调用者，实际上是RuntimeClient\n            me.exec = function( comp, fn/*, args...*/) {\n                var client = this,\n                    uid = client.uid,\n                    args = Base.slice( arguments, 2 ),\n                    instance;\n    \n                if ( components[ comp ] ) {\n                    instance = pool[ uid ] = pool[ uid ] ||\n                            new components[ comp ]( client, me );\n    \n                    if ( instance[ fn ] ) {\n                        return instance[ fn ].apply( instance, args );\n                    }\n                }\n            };\n    \n            me.destory = function() {\n                // @todo 删除池子中的所有实例\n                return destory && destory.apply( this, arguments );\n            };\n        }\n    \n        Base.inherits( Runtime, {\n            constructor: Html5Runtime,\n    \n            // 不需要连接其他程序，直接执行callback\n            init: function() {\n                var me = this;\n                setTimeout(function() {\n                    me.trigger('ready');\n                }, 1 );\n            }\n    \n        });\n    \n        // 注册Components\n        Html5Runtime.register = function( name, component ) {\n            var klass = components[ name ] = Base.inherits( CompBase, component );\n            return klass;\n        };\n    \n        // 注册html5运行时。\n        // 只有在支持的前提下注册。\n        if ( window.Blob && window.FileReader && window.DataView ) {\n            Runtime.addRuntime( type, Html5Runtime );\n        }\n    \n        return Html5Runtime;\n    });\n    /**\n     * @fileOverview Blob Html实现\n     */\n    define('runtime/html5/blob',[\n        'runtime/html5/runtime',\n        'lib/blob'\n    ], function( Html5Runtime, Blob ) {\n    \n        return Html5Runtime.register( 'Blob', {\n            slice: function( start, end ) {\n                var blob = this.owner.source,\n                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;\n    \n                blob = slice.call( blob, start, end );\n    \n                return new Blob( this.getRuid(), blob );\n            }\n        });\n    });\n    /**\n     * @fileOverview FilePaste\n     */\n    define('runtime/html5/dnd',[\n        'base',\n        'runtime/html5/runtime',\n        'lib/file'\n    ], function( Base, Html5Runtime, File ) {\n    \n        var $ = Base.$,\n            prefix = 'webuploader-dnd-';\n    \n        return Html5Runtime.register( 'DragAndDrop', {\n            init: function() {\n                var elem = this.elem = this.options.container;\n    \n                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );\n                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );\n                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );\n                this.dropHandler = Base.bindFn( this._dropHandler, this );\n                this.dndOver = false;\n    \n                elem.on( 'dragenter', this.dragEnterHandler );\n                elem.on( 'dragover', this.dragOverHandler );\n                elem.on( 'dragleave', this.dragLeaveHandler );\n                elem.on( 'drop', this.dropHandler );\n    \n                if ( this.options.disableGlobalDnd ) {\n                    $( document ).on( 'dragover', this.dragOverHandler );\n                    $( document ).on( 'drop', this.dropHandler );\n                }\n            },\n    \n            _dragEnterHandler: function( e ) {\n                var me = this,\n                    denied = me._denied || false,\n                    items;\n    \n                e = e.originalEvent || e;\n    \n                if ( !me.dndOver ) {\n                    me.dndOver = true;\n    \n                    // 注意只有 chrome 支持。\n                    items = e.dataTransfer.items;\n    \n                    if ( items && items.length ) {\n                        me._denied = denied = !me.trigger( 'accept', items );\n                    }\n    \n                    me.elem.addClass( prefix + 'over' );\n                    me.elem[ denied ? 'addClass' :\n                            'removeClass' ]( prefix + 'denied' );\n                }\n    \n    \n                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';\n    \n                return false;\n            },\n    \n            _dragOverHandler: function( e ) {\n                // 只处理框内的。\n                var parentElem = this.elem.parent().get( 0 );\n                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {\n                    return false;\n                }\n    \n                clearTimeout( this._leaveTimer );\n                this._dragEnterHandler.call( this, e );\n    \n                return false;\n            },\n    \n            _dragLeaveHandler: function() {\n                var me = this,\n                    handler;\n    \n                handler = function() {\n                    me.dndOver = false;\n                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );\n                };\n    \n                clearTimeout( me._leaveTimer );\n                me._leaveTimer = setTimeout( handler, 100 );\n                return false;\n            },\n    \n            _dropHandler: function( e ) {\n                var me = this,\n                    ruid = me.getRuid(),\n                    parentElem = me.elem.parent().get( 0 );\n    \n                // 只处理框内的。\n                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {\n                    return false;\n                }\n    \n                me._getTansferFiles( e, function( results ) {\n                    me.trigger( 'drop', $.map( results, function( file ) {\n                        return new File( ruid, file );\n                    }) );\n                });\n    \n                me.dndOver = false;\n                me.elem.removeClass( prefix + 'over' );\n                return false;\n            },\n    \n            // 如果传入 callback 则去查看文件夹，否则只管当前文件夹。\n            _getTansferFiles: function( e, callback ) {\n                var results  = [],\n                    promises = [],\n                    items, files, dataTransfer, file, item, i, len, canAccessFolder;\n    \n                e = e.originalEvent || e;\n    \n                dataTransfer = e.dataTransfer;\n                items = dataTransfer.items;\n                files = dataTransfer.files;\n    \n                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);\n    \n                for ( i = 0, len = files.length; i < len; i++ ) {\n                    file = files[ i ];\n                    item = items && items[ i ];\n    \n                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {\n    \n                        promises.push( this._traverseDirectoryTree(\n                                item.webkitGetAsEntry(), results ) );\n                    } else {\n                        results.push( file );\n                    }\n                }\n    \n                Base.when.apply( Base, promises ).done(function() {\n    \n                    if ( !results.length ) {\n                        return;\n                    }\n    \n                    callback( results );\n                });\n            },\n    \n            _traverseDirectoryTree: function( entry, results ) {\n                var deferred = Base.Deferred(),\n                    me = this;\n    \n                if ( entry.isFile ) {\n                    entry.file(function( file ) {\n                        results.push( file );\n                        deferred.resolve();\n                    });\n                } else if ( entry.isDirectory ) {\n                    entry.createReader().readEntries(function( entries ) {\n                        var len = entries.length,\n                            promises = [],\n                            arr = [],    // 为了保证顺序。\n                            i;\n    \n                        for ( i = 0; i < len; i++ ) {\n                            promises.push( me._traverseDirectoryTree(\n                                    entries[ i ], arr ) );\n                        }\n    \n                        Base.when.apply( Base, promises ).then(function() {\n                            results.push.apply( results, arr );\n                            deferred.resolve();\n                        }, deferred.reject );\n                    });\n                }\n    \n                return deferred.promise();\n            },\n    \n            destroy: function() {\n                var elem = this.elem;\n    \n                elem.off( 'dragenter', this.dragEnterHandler );\n                elem.off( 'dragover', this.dragEnterHandler );\n                elem.off( 'dragleave', this.dragLeaveHandler );\n                elem.off( 'drop', this.dropHandler );\n    \n                if ( this.options.disableGlobalDnd ) {\n                    $( document ).off( 'dragover', this.dragOverHandler );\n                    $( document ).off( 'drop', this.dropHandler );\n                }\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview FilePaste\n     */\n    define('runtime/html5/filepaste',[\n        'base',\n        'runtime/html5/runtime',\n        'lib/file'\n    ], function( Base, Html5Runtime, File ) {\n    \n        return Html5Runtime.register( 'FilePaste', {\n            init: function() {\n                var opts = this.options,\n                    elem = this.elem = opts.container,\n                    accept = '.*',\n                    arr, i, len, item;\n    \n                // accetp的mimeTypes中生成匹配正则。\n                if ( opts.accept ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        item = opts.accept[ i ].mimeTypes;\n                        item && arr.push( item );\n                    }\n    \n                    if ( arr.length ) {\n                        accept = arr.join(',');\n                        accept = accept.replace( /,/g, '|' ).replace( /\\*/g, '.*' );\n                    }\n                }\n                this.accept = accept = new RegExp( accept, 'i' );\n                this.hander = Base.bindFn( this._pasteHander, this );\n                elem.on( 'paste', this.hander );\n            },\n    \n            _pasteHander: function( e ) {\n                var allowed = [],\n                    ruid = this.getRuid(),\n                    items, item, blob, i, len;\n    \n                e = e.originalEvent || e;\n                items = e.clipboardData.items;\n    \n                for ( i = 0, len = items.length; i < len; i++ ) {\n                    item = items[ i ];\n    \n                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {\n                        continue;\n                    }\n    \n                    allowed.push( new File( ruid, blob ) );\n                }\n    \n                if ( allowed.length ) {\n                    // 不阻止非文件粘贴（文字粘贴）的事件冒泡\n                    e.preventDefault();\n                    e.stopPropagation();\n                    this.trigger( 'paste', allowed );\n                }\n            },\n    \n            destroy: function() {\n                this.elem.off( 'paste', this.hander );\n            }\n        });\n    });\n    \n    /**\n     * @fileOverview FilePicker\n     */\n    define('runtime/html5/filepicker',[\n        'base',\n        'runtime/html5/runtime'\n    ], function( Base, Html5Runtime ) {\n    \n        var $ = Base.$;\n    \n        return Html5Runtime.register( 'FilePicker', {\n            init: function() {\n                var container = this.getRuntime().getContainer(),\n                    me = this,\n                    owner = me.owner,\n                    opts = me.options,\n                    lable = $( document.createElement('label') ),\n                    input = $( document.createElement('input') ),\n                    arr, i, len, mouseHandler;\n    \n                input.attr( 'type', 'file' );\n                input.attr( 'name', opts.name );\n                input.addClass('webuploader-element-invisible');\n    \n                lable.on( 'click', function() {\n                    input.trigger('click');\n                });\n    \n                lable.css({\n                    opacity: 0,\n                    width: '100%',\n                    height: '100%',\n                    display: 'block',\n                    cursor: 'pointer',\n                    background: '#ffffff'\n                });\n    \n                if ( opts.multiple ) {\n                    input.attr( 'multiple', 'multiple' );\n                }\n    \n                // @todo Firefox不支持单独指定后缀\n                if ( opts.accept && opts.accept.length > 0 ) {\n                    arr = [];\n    \n                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {\n                        arr.push( opts.accept[ i ].mimeTypes );\n                    }\n    \n                    input.attr( 'accept', arr.join(',') );\n                }\n    \n                container.append( input );\n                container.append( lable );\n    \n                mouseHandler = function( e ) {\n                    owner.trigger( e.type );\n                };\n    \n                input.on( 'change', function( e ) {\n                    var fn = arguments.callee,\n                        clone;\n    \n                    me.files = e.target.files;\n    \n                    // reset input\n                    clone = this.cloneNode( true );\n                    this.parentNode.replaceChild( clone, this );\n    \n                    input.off();\n                    input = $( clone ).on( 'change', fn )\n                            .on( 'mouseenter mouseleave', mouseHandler );\n    \n                    owner.trigger('change');\n                });\n    \n                lable.on( 'mouseenter mouseleave', mouseHandler );\n    \n            },\n    \n    \n            getFiles: function() {\n                return this.files;\n            },\n    \n            destroy: function() {\n                // todo\n            }\n        });\n    });\n    /**\n     * @fileOverview Transport\n     * @todo 支持chunked传输，优势：\n     * 可以将大文件分成小块，挨个传输，可以提高大文件成功率，当失败的时候，也只需要重传那小部分，\n     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。\n     */\n    define('runtime/html5/transport',[\n        'base',\n        'runtime/html5/runtime'\n    ], function( Base, Html5Runtime ) {\n    \n        var noop = Base.noop,\n            $ = Base.$;\n    \n        return Html5Runtime.register( 'Transport', {\n            init: function() {\n                this._status = 0;\n                this._response = null;\n            },\n    \n            send: function() {\n                var owner = this.owner,\n                    opts = this.options,\n                    xhr = this._initAjax(),\n                    blob = owner._blob,\n                    server = opts.server,\n                    formData, binary, fr;\n    \n                if ( opts.sendAsBinary ) {\n                    server += (/\\?/.test( server ) ? '&' : '?') +\n                            $.param( owner._formData );\n    \n                    binary = blob.getSource();\n                } else {\n                    formData = new FormData();\n                    $.each( owner._formData, function( k, v ) {\n                        formData.append( k, v );\n                    });\n    \n                    formData.append( opts.fileVal, blob.getSource(),\n                            opts.filename || owner._formData.name || '' );\n                }\n    \n                if ( opts.withCredentials && 'withCredentials' in xhr ) {\n                    xhr.open( opts.method, server, true );\n                    xhr.withCredentials = true;\n                } else {\n                    xhr.open( opts.method, server );\n                }\n    \n                this._setRequestHeader( xhr, opts.headers );\n    \n                if ( binary ) {\n                    xhr.overrideMimeType('application/octet-stream');\n    \n                    // android直接发送blob会导致服务端接收到的是空文件。\n                    // bug详情。\n                    // https://code.google.com/p/android/issues/detail?id=39882\n                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。\n                    if ( Base.os.android ) {\n                        fr = new FileReader();\n    \n                        fr.onload = function() {\n                            xhr.send( this.result );\n                            fr = fr.onload = null;\n                        };\n    \n                        fr.readAsArrayBuffer( binary );\n                    } else {\n                        xhr.send( binary );\n                    }\n                } else {\n                    xhr.send( formData );\n                }\n            },\n    \n            getResponse: function() {\n                return this._response;\n            },\n    \n            getResponseAsJson: function() {\n                return this._parseJson( this._response );\n            },\n    \n            getStatus: function() {\n                return this._status;\n            },\n    \n            abort: function() {\n                var xhr = this._xhr;\n    \n                if ( xhr ) {\n                    xhr.upload.onprogress = noop;\n                    xhr.onreadystatechange = noop;\n                    xhr.abort();\n    \n                    this._xhr = xhr = null;\n                }\n            },\n    \n            destroy: function() {\n                this.abort();\n            },\n    \n            _initAjax: function() {\n                var me = this,\n                    xhr = new XMLHttpRequest(),\n                    opts = this.options;\n    \n                if ( opts.withCredentials && !('withCredentials' in xhr) &&\n                        typeof XDomainRequest !== 'undefined' ) {\n                    xhr = new XDomainRequest();\n                }\n    \n                xhr.upload.onprogress = function( e ) {\n                    var percentage = 0;\n    \n                    if ( e.lengthComputable ) {\n                        percentage = e.loaded / e.total;\n                    }\n    \n                    return me.trigger( 'progress', percentage );\n                };\n    \n                xhr.onreadystatechange = function() {\n    \n                    if ( xhr.readyState !== 4 ) {\n                        return;\n                    }\n    \n                    xhr.upload.onprogress = noop;\n                    xhr.onreadystatechange = noop;\n                    me._xhr = null;\n                    me._status = xhr.status;\n    \n                    if ( xhr.status >= 200 && xhr.status < 300 ) {\n                        me._response = xhr.responseText;\n                        return me.trigger('load');\n                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {\n                        me._response = xhr.responseText;\n                        return me.trigger( 'error', 'server' );\n                    }\n    \n    \n                    return me.trigger( 'error', me._status ? 'http' : 'abort' );\n                };\n    \n                me._xhr = xhr;\n                return xhr;\n            },\n    \n            _setRequestHeader: function( xhr, headers ) {\n                $.each( headers, function( key, val ) {\n                    xhr.setRequestHeader( key, val );\n                });\n            },\n    \n            _parseJson: function( str ) {\n                var json;\n    \n                try {\n                    json = JSON.parse( str );\n                } catch ( ex ) {\n                    json = {};\n                }\n    \n                return json;\n            }\n        });\n    });\n    /**\n     * @fileOverview FlashRuntime\n     */\n    define('runtime/flash/runtime',[\n        'base',\n        'runtime/runtime',\n        'runtime/compbase'\n    ], function( Base, Runtime, CompBase ) {\n    \n        var $ = Base.$,\n            type = 'flash',\n            components = {};\n    \n    \n        function getFlashVersion() {\n            var version;\n    \n            try {\n                version = navigator.plugins[ 'Shockwave Flash' ];\n                version = version.description;\n            } catch ( ex ) {\n                try {\n                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')\n                            .GetVariable('$version');\n                } catch ( ex2 ) {\n                    version = '0.0';\n                }\n            }\n            version = version.match( /\\d+/g );\n            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );\n        }\n    \n        function FlashRuntime() {\n            var pool = {},\n                clients = {},\n                destory = this.destory,\n                me = this,\n                jsreciver = Base.guid('webuploader_');\n    \n            Runtime.apply( me, arguments );\n            me.type = type;\n    \n    \n            // 这个方法的调用者，实际上是RuntimeClient\n            me.exec = function( comp, fn/*, args...*/ ) {\n                var client = this,\n                    uid = client.uid,\n                    args = Base.slice( arguments, 2 ),\n                    instance;\n    \n                clients[ uid ] = client;\n    \n                if ( components[ comp ] ) {\n                    if ( !pool[ uid ] ) {\n                        pool[ uid ] = new components[ comp ]( client, me );\n                    }\n    \n                    instance = pool[ uid ];\n    \n                    if ( instance[ fn ] ) {\n                        return instance[ fn ].apply( instance, args );\n                    }\n                }\n    \n                return me.flashExec.apply( client, arguments );\n            };\n    \n            function handler( evt, obj ) {\n                var type = evt.type || evt,\n                    parts, uid;\n    \n                parts = type.split('::');\n                uid = parts[ 0 ];\n                type = parts[ 1 ];\n    \n                // console.log.apply( console, arguments );\n    \n                if ( type === 'Ready' && uid === me.uid ) {\n                    me.trigger('ready');\n                } else if ( clients[ uid ] ) {\n                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );\n                }\n    \n                // Base.log( evt, obj );\n            }\n    \n            // flash的接受器。\n            window[ jsreciver ] = function() {\n                var args = arguments;\n    \n                // 为了能捕获得到。\n                setTimeout(function() {\n                    handler.apply( null, args );\n                }, 1 );\n            };\n    \n            this.jsreciver = jsreciver;\n    \n            this.destory = function() {\n                // @todo 删除池子中的所有实例\n                return destory && destory.apply( this, arguments );\n            };\n    \n            this.flashExec = function( comp, fn ) {\n                var flash = me.getFlash(),\n                    args = Base.slice( arguments, 2 );\n    \n                return flash.exec( this.uid, comp, fn, args );\n            };\n    \n            // @todo\n        }\n    \n        Base.inherits( Runtime, {\n            constructor: FlashRuntime,\n    \n            init: function() {\n                var container = this.getContainer(),\n                    opts = this.options,\n                    html;\n    \n                // if not the minimal height, shims are not initialized\n                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)\n                container.css({\n                    position: 'absolute',\n                    top: '-8px',\n                    left: '-8px',\n                    width: '9px',\n                    height: '9px',\n                    overflow: 'hidden'\n                });\n    \n                // insert flash object\n                html = '<object id=\"' + this.uid + '\" type=\"application/' +\n                        'x-shockwave-flash\" data=\"' +  opts.swf + '\" ';\n    \n                if ( Base.browser.ie ) {\n                    html += 'classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" ';\n                }\n    \n                html += 'width=\"100%\" height=\"100%\" style=\"outline:0\">'  +\n                    '<param name=\"movie\" value=\"' + opts.swf + '\" />' +\n                    '<param name=\"flashvars\" value=\"uid=' + this.uid +\n                    '&jsreciver=' + this.jsreciver + '\" />' +\n                    '<param name=\"wmode\" value=\"transparent\" />' +\n                    '<param name=\"allowscriptaccess\" value=\"always\" />' +\n                '</object>';\n    \n                container.html( html );\n            },\n    \n            getFlash: function() {\n                if ( this._flash ) {\n                    return this._flash;\n                }\n    \n                this._flash = $( '#' + this.uid ).get( 0 );\n                return this._flash;\n            }\n    \n        });\n    \n        FlashRuntime.register = function( name, component ) {\n            component = components[ name ] = Base.inherits( CompBase, $.extend({\n    \n                // @todo fix this later\n                flashExec: function() {\n                    var owner = this.owner,\n                        runtime = this.getRuntime();\n    \n                    return runtime.flashExec.apply( owner, arguments );\n                }\n            }, component ) );\n    \n            return component;\n        };\n    \n        if ( getFlashVersion() >= 11.4 ) {\n            Runtime.addRuntime( type, FlashRuntime );\n        }\n    \n        return FlashRuntime;\n    });\n    /**\n     * @fileOverview FilePicker\n     */\n    define('runtime/flash/filepicker',[\n        'base',\n        'runtime/flash/runtime'\n    ], function( Base, FlashRuntime ) {\n        var $ = Base.$;\n    \n        return FlashRuntime.register( 'FilePicker', {\n            init: function( opts ) {\n                var copy = $.extend({}, opts ),\n                    len, i;\n    \n                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.\n                len = copy.accept && copy.accept.length;\n                for (  i = 0; i < len; i++ ) {\n                    if ( !copy.accept[ i ].title ) {\n                        copy.accept[ i ].title = 'Files';\n                    }\n                }\n    \n                delete copy.button;\n                delete copy.container;\n    \n                this.flashExec( 'FilePicker', 'init', copy );\n            },\n    \n            destroy: function() {\n                // todo\n            }\n        });\n    });\n    /**\n     * @fileOverview  Transport flash实现\n     */\n    define('runtime/flash/transport',[\n        'base',\n        'runtime/flash/runtime',\n        'runtime/client'\n    ], function( Base, FlashRuntime, RuntimeClient ) {\n        var $ = Base.$;\n    \n        return FlashRuntime.register( 'Transport', {\n            init: function() {\n                this._status = 0;\n                this._response = null;\n                this._responseJson = null;\n            },\n    \n            send: function() {\n                var owner = this.owner,\n                    opts = this.options,\n                    xhr = this._initAjax(),\n                    blob = owner._blob,\n                    server = opts.server,\n                    binary;\n    \n                xhr.connectRuntime( blob.ruid );\n    \n                if ( opts.sendAsBinary ) {\n                    server += (/\\?/.test( server ) ? '&' : '?') +\n                            $.param( owner._formData );\n    \n                    binary = blob.uid;\n                } else {\n                    $.each( owner._formData, function( k, v ) {\n                        xhr.exec( 'append', k, v );\n                    });\n    \n                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,\n                            opts.filename || owner._formData.name || '' );\n                }\n    \n                this._setRequestHeader( xhr, opts.headers );\n                xhr.exec( 'send', {\n                    method: opts.method,\n                    url: server\n                }, binary );\n            },\n    \n            getStatus: function() {\n                return this._status;\n            },\n    \n            getResponse: function() {\n                return this._response;\n            },\n    \n            getResponseAsJson: function() {\n                return this._responseJson;\n            },\n    \n            abort: function() {\n                var xhr = this._xhr;\n    \n                if ( xhr ) {\n                    xhr.exec('abort');\n                    xhr.destroy();\n                    this._xhr = xhr = null;\n                }\n            },\n    \n            destroy: function() {\n                this.abort();\n            },\n    \n            _initAjax: function() {\n                var me = this,\n                    xhr = new RuntimeClient('XMLHttpRequest');\n    \n                xhr.on( 'uploadprogress progress', function( e ) {\n                    return me.trigger( 'progress', e.loaded / e.total );\n                });\n    \n                xhr.on( 'load', function() {\n                    var status = xhr.exec('getStatus'),\n                        err = '';\n    \n                    xhr.off();\n                    me._xhr = null;\n    \n                    if ( status >= 200 && status < 300 ) {\n                        me._response = xhr.exec('getResponse');\n                        me._responseJson = xhr.exec('getResponseAsJson');\n                    } else if ( status >= 500 && status < 600 ) {\n                        me._response = xhr.exec('getResponse');\n                        me._responseJson = xhr.exec('getResponseAsJson');\n                        err = 'server';\n                    } else {\n                        err = 'http';\n                    }\n    \n                    xhr.destroy();\n                    xhr = null;\n    \n                    return err ? me.trigger( 'error', err ) : me.trigger('load');\n                });\n    \n                xhr.on( 'error', function() {\n                    xhr.off();\n                    me._xhr = null;\n                    me.trigger( 'error', 'http' );\n                });\n    \n                me._xhr = xhr;\n                return xhr;\n            },\n    \n            _setRequestHeader: function( xhr, headers ) {\n                $.each( headers, function( key, val ) {\n                    xhr.exec( 'setRequestHeader', key, val );\n                });\n            }\n        });\n    });\n    /**\n     * @fileOverview 没有图像处理的版本。\n     */\n    define('preset/withoutimage',[\n        'base',\n    \n        // widgets\n        'widgets/filednd',\n        'widgets/filepaste',\n        'widgets/filepicker',\n        'widgets/queue',\n        'widgets/runtime',\n        'widgets/upload',\n        'widgets/validator',\n    \n        // runtimes\n        // html5\n        'runtime/html5/blob',\n        'runtime/html5/dnd',\n        'runtime/html5/filepaste',\n        'runtime/html5/filepicker',\n        'runtime/html5/transport',\n    \n        // flash\n        'runtime/flash/filepicker',\n        'runtime/flash/transport'\n    ], function( Base ) {\n        return Base;\n    });\n    define('webuploader',[\n        'preset/withoutimage'\n    ], function( preset ) {\n        return preset;\n    });\n    return require('webuploader');\n});\n"
  },
  {
    "path": "static/common/user/uedit/third-party/zeroclipboard/ZeroClipboard.js",
    "content": "/*!\n* ZeroClipboard\n* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.\n* Copyright (c) 2014 Jon Rohan, James M. Greene\n* Licensed MIT\n* http://zeroclipboard.org/\n* v2.0.0-beta.5\n*/\n(function(window) {\n  \"use strict\";\n  var _currentElement;\n  var _flashState = {\n    bridge: null,\n    version: \"0.0.0\",\n    pluginType: \"unknown\",\n    disabled: null,\n    outdated: null,\n    unavailable: null,\n    deactivated: null,\n    overdue: null,\n    ready: null\n  };\n  var _clipData = {};\n  var _clipDataFormatMap = null;\n  var _clientIdCounter = 0;\n  var _clientMeta = {};\n  var _elementIdCounter = 0;\n  var _elementMeta = {};\n  var _swfPath = function() {\n    var i, jsDir, tmpJsPath, jsPath, swfPath = \"ZeroClipboard.swf\";\n    if (!(document.currentScript && (jsPath = document.currentScript.src))) {\n      var scripts = document.getElementsByTagName(\"script\");\n      if (\"readyState\" in scripts[0]) {\n        for (i = scripts.length; i--; ) {\n          if (scripts[i].readyState === \"interactive\" && (jsPath = scripts[i].src)) {\n            break;\n          }\n        }\n      } else if (document.readyState === \"loading\") {\n        jsPath = scripts[scripts.length - 1].src;\n      } else {\n        for (i = scripts.length; i--; ) {\n          tmpJsPath = scripts[i].src;\n          if (!tmpJsPath) {\n            jsDir = null;\n            break;\n          }\n          tmpJsPath = tmpJsPath.split(\"#\")[0].split(\"?\")[0];\n          tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf(\"/\") + 1);\n          if (jsDir == null) {\n            jsDir = tmpJsPath;\n          } else if (jsDir !== tmpJsPath) {\n            jsDir = null;\n            break;\n          }\n        }\n        if (jsDir !== null) {\n          jsPath = jsDir;\n        }\n      }\n    }\n    if (jsPath) {\n      jsPath = jsPath.split(\"#\")[0].split(\"?\")[0];\n      swfPath = jsPath.slice(0, jsPath.lastIndexOf(\"/\") + 1) + swfPath;\n    }\n    return swfPath;\n  }();\n  var _camelizeCssPropName = function() {\n    var matcherRegex = /\\-([a-z])/g, replacerFn = function(match, group) {\n      return group.toUpperCase();\n    };\n    return function(prop) {\n      return prop.replace(matcherRegex, replacerFn);\n    };\n  }();\n  var _getStyle = function(el, prop) {\n    var value, camelProp, tagName;\n    if (window.getComputedStyle) {\n      value = window.getComputedStyle(el, null).getPropertyValue(prop);\n    } else {\n      camelProp = _camelizeCssPropName(prop);\n      if (el.currentStyle) {\n        value = el.currentStyle[camelProp];\n      } else {\n        value = el.style[camelProp];\n      }\n    }\n    if (prop === \"cursor\") {\n      if (!value || value === \"auto\") {\n        tagName = el.tagName.toLowerCase();\n        if (tagName === \"a\") {\n          return \"pointer\";\n        }\n      }\n    }\n    return value;\n  };\n  var _elementMouseOver = function(event) {\n    if (!event) {\n      event = window.event;\n    }\n    var target;\n    if (this !== window) {\n      target = this;\n    } else if (event.target) {\n      target = event.target;\n    } else if (event.srcElement) {\n      target = event.srcElement;\n    }\n    ZeroClipboard.activate(target);\n  };\n  var _addEventHandler = function(element, method, func) {\n    if (!element || element.nodeType !== 1) {\n      return;\n    }\n    if (element.addEventListener) {\n      element.addEventListener(method, func, false);\n    } else if (element.attachEvent) {\n      element.attachEvent(\"on\" + method, func);\n    }\n  };\n  var _removeEventHandler = function(element, method, func) {\n    if (!element || element.nodeType !== 1) {\n      return;\n    }\n    if (element.removeEventListener) {\n      element.removeEventListener(method, func, false);\n    } else if (element.detachEvent) {\n      element.detachEvent(\"on\" + method, func);\n    }\n  };\n  var _addClass = function(element, value) {\n    if (!element || element.nodeType !== 1) {\n      return element;\n    }\n    if (element.classList) {\n      if (!element.classList.contains(value)) {\n        element.classList.add(value);\n      }\n      return element;\n    }\n    if (value && typeof value === \"string\") {\n      var classNames = (value || \"\").split(/\\s+/);\n      if (element.nodeType === 1) {\n        if (!element.className) {\n          element.className = value;\n        } else {\n          var className = \" \" + element.className + \" \", setClass = element.className;\n          for (var c = 0, cl = classNames.length; c < cl; c++) {\n            if (className.indexOf(\" \" + classNames[c] + \" \") < 0) {\n              setClass += \" \" + classNames[c];\n            }\n          }\n          element.className = setClass.replace(/^\\s+|\\s+$/g, \"\");\n        }\n      }\n    }\n    return element;\n  };\n  var _removeClass = function(element, value) {\n    if (!element || element.nodeType !== 1) {\n      return element;\n    }\n    if (element.classList) {\n      if (element.classList.contains(value)) {\n        element.classList.remove(value);\n      }\n      return element;\n    }\n    if (value && typeof value === \"string\" || value === undefined) {\n      var classNames = (value || \"\").split(/\\s+/);\n      if (element.nodeType === 1 && element.className) {\n        if (value) {\n          var className = (\" \" + element.className + \" \").replace(/[\\n\\t]/g, \" \");\n          for (var c = 0, cl = classNames.length; c < cl; c++) {\n            className = className.replace(\" \" + classNames[c] + \" \", \" \");\n          }\n          element.className = className.replace(/^\\s+|\\s+$/g, \"\");\n        } else {\n          element.className = \"\";\n        }\n      }\n    }\n    return element;\n  };\n  var _getZoomFactor = function() {\n    var rect, physicalWidth, logicalWidth, zoomFactor = 1;\n    if (typeof document.body.getBoundingClientRect === \"function\") {\n      rect = document.body.getBoundingClientRect();\n      physicalWidth = rect.right - rect.left;\n      logicalWidth = document.body.offsetWidth;\n      zoomFactor = Math.round(physicalWidth / logicalWidth * 100) / 100;\n    }\n    return zoomFactor;\n  };\n  var _getDOMObjectPosition = function(obj, defaultZIndex) {\n    var info = {\n      left: 0,\n      top: 0,\n      width: 0,\n      height: 0,\n      zIndex: _getSafeZIndex(defaultZIndex) - 1\n    };\n    if (obj.getBoundingClientRect) {\n      var rect = obj.getBoundingClientRect();\n      var pageXOffset, pageYOffset, zoomFactor;\n      if (\"pageXOffset\" in window && \"pageYOffset\" in window) {\n        pageXOffset = window.pageXOffset;\n        pageYOffset = window.pageYOffset;\n      } else {\n        zoomFactor = _getZoomFactor();\n        pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor);\n        pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor);\n      }\n      var leftBorderWidth = document.documentElement.clientLeft || 0;\n      var topBorderWidth = document.documentElement.clientTop || 0;\n      info.left = rect.left + pageXOffset - leftBorderWidth;\n      info.top = rect.top + pageYOffset - topBorderWidth;\n      info.width = \"width\" in rect ? rect.width : rect.right - rect.left;\n      info.height = \"height\" in rect ? rect.height : rect.bottom - rect.top;\n    }\n    return info;\n  };\n  var _cacheBust = function(path, options) {\n    var cacheBust = options == null || options && options.cacheBust === true;\n    if (cacheBust) {\n      return (path.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"noCache=\" + new Date().getTime();\n    } else {\n      return \"\";\n    }\n  };\n  var _vars = function(options) {\n    var i, len, domain, domains, str = \"\", trustedOriginsExpanded = [];\n    if (options.trustedDomains) {\n      if (typeof options.trustedDomains === \"string\") {\n        domains = [ options.trustedDomains ];\n      } else if (typeof options.trustedDomains === \"object\" && \"length\" in options.trustedDomains) {\n        domains = options.trustedDomains;\n      }\n    }\n    if (domains && domains.length) {\n      for (i = 0, len = domains.length; i < len; i++) {\n        if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === \"string\") {\n          domain = _extractDomain(domains[i]);\n          if (!domain) {\n            continue;\n          }\n          if (domain === \"*\") {\n            trustedOriginsExpanded = [ domain ];\n            break;\n          }\n          trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, \"//\" + domain, window.location.protocol + \"//\" + domain ]);\n        }\n      }\n    }\n    if (trustedOriginsExpanded.length) {\n      str += \"trustedOrigins=\" + encodeURIComponent(trustedOriginsExpanded.join(\",\"));\n    }\n    if (options.forceEnhancedClipboard === true) {\n      str += (str ? \"&\" : \"\") + \"forceEnhancedClipboard=true\";\n    }\n    return str;\n  };\n  var _inArray = function(elem, array, fromIndex) {\n    if (typeof array.indexOf === \"function\") {\n      return array.indexOf(elem, fromIndex);\n    }\n    var i, len = array.length;\n    if (typeof fromIndex === \"undefined\") {\n      fromIndex = 0;\n    } else if (fromIndex < 0) {\n      fromIndex = len + fromIndex;\n    }\n    for (i = fromIndex; i < len; i++) {\n      if (array.hasOwnProperty(i) && array[i] === elem) {\n        return i;\n      }\n    }\n    return -1;\n  };\n  var _prepClip = function(elements) {\n    if (typeof elements === \"string\") {\n      throw new TypeError(\"ZeroClipboard doesn't accept query strings.\");\n    }\n    return typeof elements.length !== \"number\" ? [ elements ] : elements;\n  };\n  var _dispatchCallback = function(func, context, args, async) {\n    if (async) {\n      window.setTimeout(function() {\n        func.apply(context, args);\n      }, 0);\n    } else {\n      func.apply(context, args);\n    }\n  };\n  var _getSafeZIndex = function(val) {\n    var zIndex, tmp;\n    if (val) {\n      if (typeof val === \"number\" && val > 0) {\n        zIndex = val;\n      } else if (typeof val === \"string\" && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) {\n        zIndex = tmp;\n      }\n    }\n    if (!zIndex) {\n      if (typeof _globalConfig.zIndex === \"number\" && _globalConfig.zIndex > 0) {\n        zIndex = _globalConfig.zIndex;\n      } else if (typeof _globalConfig.zIndex === \"string\" && (tmp = parseInt(_globalConfig.zIndex, 10)) && !isNaN(tmp) && tmp > 0) {\n        zIndex = tmp;\n      }\n    }\n    return zIndex || 0;\n  };\n  var _extend = function() {\n    var i, len, arg, prop, src, copy, target = arguments[0] || {};\n    for (i = 1, len = arguments.length; i < len; i++) {\n      if ((arg = arguments[i]) != null) {\n        for (prop in arg) {\n          if (arg.hasOwnProperty(prop)) {\n            src = target[prop];\n            copy = arg[prop];\n            if (target === copy) {\n              continue;\n            }\n            if (copy !== undefined) {\n              target[prop] = copy;\n            }\n          }\n        }\n      }\n    }\n    return target;\n  };\n  var _extractDomain = function(originOrUrl) {\n    if (originOrUrl == null || originOrUrl === \"\") {\n      return null;\n    }\n    originOrUrl = originOrUrl.replace(/^\\s+|\\s+$/g, \"\");\n    if (originOrUrl === \"\") {\n      return null;\n    }\n    var protocolIndex = originOrUrl.indexOf(\"//\");\n    originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2);\n    var pathIndex = originOrUrl.indexOf(\"/\");\n    originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex);\n    if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === \".swf\") {\n      return null;\n    }\n    return originOrUrl || null;\n  };\n  var _determineScriptAccess = function() {\n    var _extractAllDomains = function(origins, resultsArray) {\n      var i, len, tmp;\n      if (origins == null || resultsArray[0] === \"*\") {\n        return;\n      }\n      if (typeof origins === \"string\") {\n        origins = [ origins ];\n      }\n      if (!(typeof origins === \"object\" && typeof origins.length === \"number\")) {\n        return;\n      }\n      for (i = 0, len = origins.length; i < len; i++) {\n        if (origins.hasOwnProperty(i) && (tmp = _extractDomain(origins[i]))) {\n          if (tmp === \"*\") {\n            resultsArray.length = 0;\n            resultsArray.push(\"*\");\n            break;\n          }\n          if (_inArray(tmp, resultsArray) === -1) {\n            resultsArray.push(tmp);\n          }\n        }\n      }\n    };\n    return function(currentDomain, configOptions) {\n      var swfDomain = _extractDomain(configOptions.swfPath);\n      if (swfDomain === null) {\n        swfDomain = currentDomain;\n      }\n      var trustedDomains = [];\n      _extractAllDomains(configOptions.trustedOrigins, trustedDomains);\n      _extractAllDomains(configOptions.trustedDomains, trustedDomains);\n      var len = trustedDomains.length;\n      if (len > 0) {\n        if (len === 1 && trustedDomains[0] === \"*\") {\n          return \"always\";\n        }\n        if (_inArray(currentDomain, trustedDomains) !== -1) {\n          if (len === 1 && currentDomain === swfDomain) {\n            return \"sameDomain\";\n          }\n          return \"always\";\n        }\n      }\n      return \"never\";\n    };\n  }();\n  var _objectKeys = function(obj) {\n    if (obj == null) {\n      return [];\n    }\n    if (Object.keys) {\n      return Object.keys(obj);\n    }\n    var keys = [];\n    for (var prop in obj) {\n      if (obj.hasOwnProperty(prop)) {\n        keys.push(prop);\n      }\n    }\n    return keys;\n  };\n  var _deleteOwnProperties = function(obj) {\n    if (obj) {\n      for (var prop in obj) {\n        if (obj.hasOwnProperty(prop)) {\n          delete obj[prop];\n        }\n      }\n    }\n    return obj;\n  };\n  var _safeActiveElement = function() {\n    try {\n      return document.activeElement;\n    } catch (err) {}\n    return null;\n  };\n  var _pick = function(obj, keys) {\n    var newObj = {};\n    for (var i = 0, len = keys.length; i < len; i++) {\n      if (keys[i] in obj) {\n        newObj[keys[i]] = obj[keys[i]];\n      }\n    }\n    return newObj;\n  };\n  var _omit = function(obj, keys) {\n    var newObj = {};\n    for (var prop in obj) {\n      if (_inArray(prop, keys) === -1) {\n        newObj[prop] = obj[prop];\n      }\n    }\n    return newObj;\n  };\n  var _mapClipDataToFlash = function(clipData) {\n    var newClipData = {}, formatMap = {};\n    if (!(typeof clipData === \"object\" && clipData)) {\n      return;\n    }\n    for (var dataFormat in clipData) {\n      if (dataFormat && clipData.hasOwnProperty(dataFormat) && typeof clipData[dataFormat] === \"string\" && clipData[dataFormat]) {\n        switch (dataFormat.toLowerCase()) {\n         case \"text/plain\":\n         case \"text\":\n         case \"air:text\":\n         case \"flash:text\":\n          newClipData.text = clipData[dataFormat];\n          formatMap.text = dataFormat;\n          break;\n\n         case \"text/html\":\n         case \"html\":\n         case \"air:html\":\n         case \"flash:html\":\n          newClipData.html = clipData[dataFormat];\n          formatMap.html = dataFormat;\n          break;\n\n         case \"application/rtf\":\n         case \"text/rtf\":\n         case \"rtf\":\n         case \"richtext\":\n         case \"air:rtf\":\n         case \"flash:rtf\":\n          newClipData.rtf = clipData[dataFormat];\n          formatMap.rtf = dataFormat;\n          break;\n\n         default:\n          break;\n        }\n      }\n    }\n    return {\n      data: newClipData,\n      formatMap: formatMap\n    };\n  };\n  var _mapClipResultsFromFlash = function(clipResults, formatMap) {\n    if (!(typeof clipResults === \"object\" && clipResults && typeof formatMap === \"object\" && formatMap)) {\n      return clipResults;\n    }\n    var newResults = {};\n    for (var prop in clipResults) {\n      if (clipResults.hasOwnProperty(prop)) {\n        if (prop !== \"success\" && prop !== \"data\") {\n          newResults[prop] = clipResults[prop];\n          continue;\n        }\n        newResults[prop] = {};\n        var tmpHash = clipResults[prop];\n        for (var dataFormat in tmpHash) {\n          if (dataFormat && tmpHash.hasOwnProperty(dataFormat) && formatMap.hasOwnProperty(dataFormat)) {\n            newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat];\n          }\n        }\n      }\n    }\n    return newResults;\n  };\n  var _args = function(arraySlice) {\n    return function(args) {\n      return arraySlice.call(args, 0);\n    };\n  }(window.Array.prototype.slice);\n  var _detectFlashSupport = function() {\n    var plugin, ax, mimeType, hasFlash = false, isActiveX = false, isPPAPI = false, flashVersion = \"\";\n    function parseFlashVersion(desc) {\n      var matches = desc.match(/[\\d]+/g);\n      matches.length = 3;\n      return matches.join(\".\");\n    }\n    function isPepperFlash(flashPlayerFileName) {\n      return !!flashPlayerFileName && (flashPlayerFileName = flashPlayerFileName.toLowerCase()) && (/^(pepflashplayer\\.dll|libpepflashplayer\\.so|pepperflashplayer\\.plugin)$/.test(flashPlayerFileName) || flashPlayerFileName.slice(-13) === \"chrome.plugin\");\n    }\n    function inspectPlugin(plugin) {\n      if (plugin) {\n        hasFlash = true;\n        if (plugin.version) {\n          flashVersion = parseFlashVersion(plugin.version);\n        }\n        if (!flashVersion && plugin.description) {\n          flashVersion = parseFlashVersion(plugin.description);\n        }\n        if (plugin.filename) {\n          isPPAPI = isPepperFlash(plugin.filename);\n        }\n      }\n    }\n    if (navigator.plugins && navigator.plugins.length) {\n      plugin = navigator.plugins[\"Shockwave Flash\"];\n      inspectPlugin(plugin);\n      if (navigator.plugins[\"Shockwave Flash 2.0\"]) {\n        hasFlash = true;\n        flashVersion = \"2.0.0.11\";\n      }\n    } else if (navigator.mimeTypes && navigator.mimeTypes.length) {\n      mimeType = navigator.mimeTypes[\"application/x-shockwave-flash\"];\n      plugin = mimeType && mimeType.enabledPlugin;\n      inspectPlugin(plugin);\n    } else if (typeof ActiveXObject !== \"undefined\") {\n      isActiveX = true;\n      try {\n        ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\n        hasFlash = true;\n        flashVersion = parseFlashVersion(ax.GetVariable(\"$version\"));\n      } catch (e1) {\n        try {\n          ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\n          hasFlash = true;\n          flashVersion = \"6.0.21\";\n        } catch (e2) {\n          try {\n            ax = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\n            hasFlash = true;\n            flashVersion = parseFlashVersion(ax.GetVariable(\"$version\"));\n          } catch (e3) {\n            isActiveX = false;\n          }\n        }\n      }\n    }\n    _flashState.disabled = hasFlash !== true;\n    _flashState.outdated = flashVersion && parseFloat(flashVersion) < 11;\n    _flashState.version = flashVersion || \"0.0.0\";\n    _flashState.pluginType = isPPAPI ? \"pepper\" : isActiveX ? \"activex\" : hasFlash ? \"netscape\" : \"unknown\";\n  };\n  _detectFlashSupport();\n  var ZeroClipboard = function(elements) {\n    if (!(this instanceof ZeroClipboard)) {\n      return new ZeroClipboard(elements);\n    }\n    this.id = \"\" + _clientIdCounter++;\n    _clientMeta[this.id] = {\n      instance: this,\n      elements: [],\n      handlers: {}\n    };\n    if (elements) {\n      this.clip(elements);\n    }\n    if (typeof _flashState.ready !== \"boolean\") {\n      _flashState.ready = false;\n    }\n    if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {\n      var _client = this;\n      var maxWait = _globalConfig.flashLoadTimeout;\n      if (typeof maxWait === \"number\" && maxWait >= 0) {\n        setTimeout(function() {\n          if (typeof _flashState.deactivated !== \"boolean\") {\n            _flashState.deactivated = true;\n          }\n          if (_flashState.deactivated === true) {\n            ZeroClipboard.emit({\n              type: \"error\",\n              name: \"flash-deactivated\",\n              client: _client\n            });\n          }\n        }, maxWait);\n      }\n      _flashState.overdue = false;\n      _bridge();\n    }\n  };\n  ZeroClipboard.prototype.setText = function(text) {\n    ZeroClipboard.setData(\"text/plain\", text);\n    return this;\n  };\n  ZeroClipboard.prototype.setHtml = function(html) {\n    ZeroClipboard.setData(\"text/html\", html);\n    return this;\n  };\n  ZeroClipboard.prototype.setRichText = function(richText) {\n    ZeroClipboard.setData(\"application/rtf\", richText);\n    return this;\n  };\n  ZeroClipboard.prototype.setData = function() {\n    ZeroClipboard.setData.apply(ZeroClipboard, _args(arguments));\n    return this;\n  };\n  ZeroClipboard.prototype.clearData = function() {\n    ZeroClipboard.clearData.apply(ZeroClipboard, _args(arguments));\n    return this;\n  };\n  ZeroClipboard.prototype.setSize = function(width, height) {\n    _setSize(width, height);\n    return this;\n  };\n  var _setHandCursor = function(enabled) {\n    if (_flashState.ready === true && _flashState.bridge && typeof _flashState.bridge.setHandCursor === \"function\") {\n      _flashState.bridge.setHandCursor(enabled);\n    } else {\n      _flashState.ready = false;\n    }\n  };\n  ZeroClipboard.prototype.destroy = function() {\n    this.unclip();\n    this.off();\n    delete _clientMeta[this.id];\n  };\n  var _getAllClients = function() {\n    var i, len, client, clients = [], clientIds = _objectKeys(_clientMeta);\n    for (i = 0, len = clientIds.length; i < len; i++) {\n      client = _clientMeta[clientIds[i]].instance;\n      if (client && client instanceof ZeroClipboard) {\n        clients.push(client);\n      }\n    }\n    return clients;\n  };\n  ZeroClipboard.version = \"2.0.0-beta.5\";\n  var _globalConfig = {\n    swfPath: _swfPath,\n    trustedDomains: window.location.host ? [ window.location.host ] : [],\n    cacheBust: true,\n    forceHandCursor: false,\n    forceEnhancedClipboard: false,\n    zIndex: 999999999,\n    debug: false,\n    title: null,\n    autoActivate: true,\n    flashLoadTimeout: 3e4\n  };\n  ZeroClipboard.isFlashUnusable = function() {\n    return !!(_flashState.disabled || _flashState.outdated || _flashState.unavailable || _flashState.deactivated);\n  };\n  ZeroClipboard.config = function(options) {\n    if (typeof options === \"object\" && options !== null) {\n      _extend(_globalConfig, options);\n    }\n    if (typeof options === \"string\" && options) {\n      if (_globalConfig.hasOwnProperty(options)) {\n        return _globalConfig[options];\n      }\n      return;\n    }\n    var copy = {};\n    for (var prop in _globalConfig) {\n      if (_globalConfig.hasOwnProperty(prop)) {\n        if (typeof _globalConfig[prop] === \"object\" && _globalConfig[prop] !== null) {\n          if (\"length\" in _globalConfig[prop]) {\n            copy[prop] = _globalConfig[prop].slice(0);\n          } else {\n            copy[prop] = _extend({}, _globalConfig[prop]);\n          }\n        } else {\n          copy[prop] = _globalConfig[prop];\n        }\n      }\n    }\n    return copy;\n  };\n  ZeroClipboard.destroy = function() {\n    ZeroClipboard.deactivate();\n    for (var clientId in _clientMeta) {\n      if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) {\n        var client = _clientMeta[clientId].instance;\n        if (client && typeof client.destroy === \"function\") {\n          client.destroy();\n        }\n      }\n    }\n    var flashBridge = _flashState.bridge;\n    if (flashBridge) {\n      var htmlBridge = _getHtmlBridge(flashBridge);\n      if (htmlBridge) {\n        if (_flashState.pluginType === \"activex\" && \"readyState\" in flashBridge) {\n          flashBridge.style.display = \"none\";\n          (function removeSwfFromIE() {\n            if (flashBridge.readyState === 4) {\n              for (var prop in flashBridge) {\n                if (typeof flashBridge[prop] === \"function\") {\n                  flashBridge[prop] = null;\n                }\n              }\n              flashBridge.parentNode.removeChild(flashBridge);\n              if (htmlBridge.parentNode) {\n                htmlBridge.parentNode.removeChild(htmlBridge);\n              }\n            } else {\n              setTimeout(removeSwfFromIE, 10);\n            }\n          })();\n        } else {\n          flashBridge.parentNode.removeChild(flashBridge);\n          if (htmlBridge.parentNode) {\n            htmlBridge.parentNode.removeChild(htmlBridge);\n          }\n        }\n      }\n      _flashState.ready = null;\n      _flashState.bridge = null;\n      _flashState.deactivated = null;\n    }\n    ZeroClipboard.clearData();\n  };\n  ZeroClipboard.activate = function(element) {\n    if (_currentElement) {\n      _removeClass(_currentElement, _globalConfig.hoverClass);\n      _removeClass(_currentElement, _globalConfig.activeClass);\n    }\n    _currentElement = element;\n    _addClass(element, _globalConfig.hoverClass);\n    _reposition();\n    var newTitle = _globalConfig.title || element.getAttribute(\"title\");\n    if (newTitle) {\n      var htmlBridge = _getHtmlBridge(_flashState.bridge);\n      if (htmlBridge) {\n        htmlBridge.setAttribute(\"title\", newTitle);\n      }\n    }\n    var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, \"cursor\") === \"pointer\";\n    _setHandCursor(useHandCursor);\n  };\n  ZeroClipboard.deactivate = function() {\n    var htmlBridge = _getHtmlBridge(_flashState.bridge);\n    if (htmlBridge) {\n      htmlBridge.removeAttribute(\"title\");\n      htmlBridge.style.left = \"0px\";\n      htmlBridge.style.top = \"-9999px\";\n      _setSize(1, 1);\n    }\n    if (_currentElement) {\n      _removeClass(_currentElement, _globalConfig.hoverClass);\n      _removeClass(_currentElement, _globalConfig.activeClass);\n      _currentElement = null;\n    }\n  };\n  ZeroClipboard.state = function() {\n    return {\n      browser: _pick(window.navigator, [ \"userAgent\", \"platform\", \"appName\" ]),\n      flash: _omit(_flashState, [ \"bridge\" ]),\n      zeroclipboard: {\n        version: ZeroClipboard.version,\n        config: ZeroClipboard.config()\n      }\n    };\n  };\n  ZeroClipboard.setData = function(format, data) {\n    var dataObj;\n    if (typeof format === \"object\" && format && typeof data === \"undefined\") {\n      dataObj = format;\n      ZeroClipboard.clearData();\n    } else if (typeof format === \"string\" && format) {\n      dataObj = {};\n      dataObj[format] = data;\n    } else {\n      return;\n    }\n    for (var dataFormat in dataObj) {\n      if (dataFormat && dataObj.hasOwnProperty(dataFormat) && typeof dataObj[dataFormat] === \"string\" && dataObj[dataFormat]) {\n        _clipData[dataFormat] = dataObj[dataFormat];\n      }\n    }\n  };\n  ZeroClipboard.clearData = function(format) {\n    if (typeof format === \"undefined\") {\n      _deleteOwnProperties(_clipData);\n      _clipDataFormatMap = null;\n    } else if (typeof format === \"string\" && _clipData.hasOwnProperty(format)) {\n      delete _clipData[format];\n    }\n  };\n  var _bridge = function() {\n    var flashBridge, len;\n    var container = document.getElementById(\"global-zeroclipboard-html-bridge\");\n    if (!container) {\n      var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig);\n      var allowNetworking = allowScriptAccess === \"never\" ? \"none\" : \"all\";\n      var flashvars = _vars(_globalConfig);\n      var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig);\n      container = _createHtmlBridge();\n      var divToBeReplaced = document.createElement(\"div\");\n      container.appendChild(divToBeReplaced);\n      document.body.appendChild(container);\n      var tmpDiv = document.createElement(\"div\");\n      var oldIE = _flashState.pluginType === \"activex\";\n      tmpDiv.innerHTML = '<object id=\"global-zeroclipboard-flash-bridge\" name=\"global-zeroclipboard-flash-bridge\" ' + 'width=\"100%\" height=\"100%\" ' + (oldIE ? 'classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\"' : 'type=\"application/x-shockwave-flash\" data=\"' + swfUrl + '\"') + \">\" + (oldIE ? '<param name=\"movie\" value=\"' + swfUrl + '\"/>' : \"\") + '<param name=\"allowScriptAccess\" value=\"' + allowScriptAccess + '\"/>' + '<param name=\"allowNetworking\" value=\"' + allowNetworking + '\"/>' + '<param name=\"menu\" value=\"false\"/>' + '<param name=\"wmode\" value=\"transparent\"/>' + '<param name=\"flashvars\" value=\"' + flashvars + '\"/>' + \"</object>\";\n      flashBridge = tmpDiv.firstChild;\n      tmpDiv = null;\n      flashBridge.ZeroClipboard = ZeroClipboard;\n      container.replaceChild(flashBridge, divToBeReplaced);\n    }\n    if (!flashBridge) {\n      flashBridge = document[\"global-zeroclipboard-flash-bridge\"];\n      if (flashBridge && (len = flashBridge.length)) {\n        flashBridge = flashBridge[len - 1];\n      }\n      if (!flashBridge) {\n        flashBridge = container.firstChild;\n      }\n    }\n    _flashState.bridge = flashBridge || null;\n  };\n  var _createHtmlBridge = function() {\n    var container = document.createElement(\"div\");\n    container.id = \"global-zeroclipboard-html-bridge\";\n    container.className = \"global-zeroclipboard-container\";\n    container.style.position = \"absolute\";\n    container.style.left = \"0px\";\n    container.style.top = \"-9999px\";\n    container.style.width = \"1px\";\n    container.style.height = \"1px\";\n    container.style.zIndex = \"\" + _getSafeZIndex(_globalConfig.zIndex);\n    return container;\n  };\n  var _getHtmlBridge = function(flashBridge) {\n    var htmlBridge = flashBridge && flashBridge.parentNode;\n    while (htmlBridge && htmlBridge.nodeName === \"OBJECT\" && htmlBridge.parentNode) {\n      htmlBridge = htmlBridge.parentNode;\n    }\n    return htmlBridge || null;\n  };\n  var _reposition = function() {\n    if (_currentElement) {\n      var pos = _getDOMObjectPosition(_currentElement, _globalConfig.zIndex);\n      var htmlBridge = _getHtmlBridge(_flashState.bridge);\n      if (htmlBridge) {\n        htmlBridge.style.top = pos.top + \"px\";\n        htmlBridge.style.left = pos.left + \"px\";\n        htmlBridge.style.width = pos.width + \"px\";\n        htmlBridge.style.height = pos.height + \"px\";\n        htmlBridge.style.zIndex = pos.zIndex + 1;\n      }\n      _setSize(pos.width, pos.height);\n    }\n  };\n  var _setSize = function(width, height) {\n    var htmlBridge = _getHtmlBridge(_flashState.bridge);\n    if (htmlBridge) {\n      htmlBridge.style.width = width + \"px\";\n      htmlBridge.style.height = height + \"px\";\n    }\n  };\n  ZeroClipboard.emit = function(event) {\n    var eventType, eventObj, performCallbackAsync, clients, i, len, eventCopy, returnVal, tmp;\n    if (typeof event === \"string\" && event) {\n      eventType = event;\n    }\n    if (typeof event === \"object\" && event && typeof event.type === \"string\" && event.type) {\n      eventType = event.type;\n      eventObj = event;\n    }\n    if (!eventType) {\n      return;\n    }\n    event = _createEvent(eventType, eventObj);\n    _preprocessEvent(event);\n    if (event.type === \"ready\" && _flashState.overdue === true) {\n      return ZeroClipboard.emit({\n        type: \"error\",\n        name: \"flash-overdue\"\n      });\n    }\n    performCallbackAsync = !/^(before)?copy$/.test(event.type);\n    if (event.client) {\n      _dispatchClientCallbacks.call(event.client, event, performCallbackAsync);\n    } else {\n      clients = event.target && event.target !== window && _globalConfig.autoActivate === true ? _getAllClientsClippedToElement(event.target) : _getAllClients();\n      for (i = 0, len = clients.length; i < len; i++) {\n        eventCopy = _extend({}, event, {\n          client: clients[i]\n        });\n        _dispatchClientCallbacks.call(clients[i], eventCopy, performCallbackAsync);\n      }\n    }\n    if (event.type === \"copy\") {\n      tmp = _mapClipDataToFlash(_clipData);\n      returnVal = tmp.data;\n      _clipDataFormatMap = tmp.formatMap;\n    }\n    return returnVal;\n  };\n  var _dispatchClientCallbacks = function(event, async) {\n    var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[event.type];\n    if (handlers && handlers.length) {\n      var i, len, func, context, originalContext = this;\n      for (i = 0, len = handlers.length; i < len; i++) {\n        func = handlers[i];\n        context = originalContext;\n        if (typeof func === \"string\" && typeof window[func] === \"function\") {\n          func = window[func];\n        }\n        if (typeof func === \"object\" && func && typeof func.handleEvent === \"function\") {\n          context = func;\n          func = func.handleEvent;\n        }\n        if (typeof func === \"function\") {\n          _dispatchCallback(func, context, [ event ], async);\n        }\n      }\n    }\n    return this;\n  };\n  var _eventMessages = {\n    ready: \"Flash communication is established\",\n    error: {\n      \"flash-disabled\": \"Flash is disabled or not installed\",\n      \"flash-outdated\": \"Flash is too outdated to support ZeroClipboard\",\n      \"flash-unavailable\": \"Flash is unable to communicate bidirectionally with JavaScript\",\n      \"flash-deactivated\": \"Flash is too outdated for your browser and/or is configured as click-to-activate\",\n      \"flash-overdue\": \"Flash communication was established but NOT within the acceptable time limit\"\n    }\n  };\n  var _createEvent = function(eventType, event) {\n    if (!(eventType || event && event.type)) {\n      return;\n    }\n    event = event || {};\n    eventType = (eventType || event.type).toLowerCase();\n    _extend(event, {\n      type: eventType,\n      target: event.target || _currentElement || null,\n      relatedTarget: event.relatedTarget || null,\n      currentTarget: _flashState && _flashState.bridge || null\n    });\n    var msg = _eventMessages[event.type];\n    if (event.type === \"error\" && event.name && msg) {\n      msg = msg[event.name];\n    }\n    if (msg) {\n      event.message = msg;\n    }\n    if (event.type === \"ready\") {\n      _extend(event, {\n        target: null,\n        version: _flashState.version\n      });\n    }\n    if (event.type === \"error\") {\n      event.target = null;\n      if (/^flash-(outdated|unavailable|deactivated|overdue)$/.test(event.name)) {\n        _extend(event, {\n          version: _flashState.version,\n          minimumVersion: \"11.0.0\"\n        });\n      }\n    }\n    if (event.type === \"copy\") {\n      event.clipboardData = {\n        setData: ZeroClipboard.setData,\n        clearData: ZeroClipboard.clearData\n      };\n    }\n    if (event.type === \"aftercopy\") {\n      event = _mapClipResultsFromFlash(event, _clipDataFormatMap);\n    }\n    if (event.target && !event.relatedTarget) {\n      event.relatedTarget = _getRelatedTarget(event.target);\n    }\n    return event;\n  };\n  var _getRelatedTarget = function(targetEl) {\n    var relatedTargetId = targetEl && targetEl.getAttribute && targetEl.getAttribute(\"data-clipboard-target\");\n    return relatedTargetId ? document.getElementById(relatedTargetId) : null;\n  };\n  var _preprocessEvent = function(event) {\n    var element = event.target || _currentElement;\n    switch (event.type) {\n     case \"error\":\n      if (_inArray(event.name, [ \"flash-disabled\", \"flash-outdated\", \"flash-deactivated\", \"flash-overdue\" ])) {\n        _extend(_flashState, {\n          disabled: event.name === \"flash-disabled\",\n          outdated: event.name === \"flash-outdated\",\n          unavailable: event.name === \"flash-unavailable\",\n          deactivated: event.name === \"flash-deactivated\",\n          overdue: event.name === \"flash-overdue\",\n          ready: false\n        });\n      }\n      break;\n\n     case \"ready\":\n      var wasDeactivated = _flashState.deactivated === true;\n      _extend(_flashState, {\n        disabled: false,\n        outdated: false,\n        unavailable: false,\n        deactivated: false,\n        overdue: wasDeactivated,\n        ready: !wasDeactivated\n      });\n      break;\n\n     case \"copy\":\n      var textContent, htmlContent, targetEl = event.relatedTarget;\n      if (!(_clipData[\"text/html\"] || _clipData[\"text/plain\"]) && targetEl && (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) && (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)) {\n        event.clipboardData.clearData();\n        event.clipboardData.setData(\"text/plain\", textContent);\n        if (htmlContent !== textContent) {\n          event.clipboardData.setData(\"text/html\", htmlContent);\n        }\n      } else if (!_clipData[\"text/plain\"] && event.target && (textContent = event.target.getAttribute(\"data-clipboard-text\"))) {\n        event.clipboardData.clearData();\n        event.clipboardData.setData(\"text/plain\", textContent);\n      }\n      break;\n\n     case \"aftercopy\":\n      ZeroClipboard.clearData();\n      if (element && element !== _safeActiveElement() && element.focus) {\n        element.focus();\n      }\n      break;\n\n     case \"mouseover\":\n      _addClass(element, _globalConfig.hoverClass);\n      break;\n\n     case \"mouseout\":\n      if (_globalConfig.autoActivate === true) {\n        ZeroClipboard.deactivate();\n      }\n      break;\n\n     case \"mousedown\":\n      _addClass(element, _globalConfig.activeClass);\n      break;\n\n     case \"mouseup\":\n      _removeClass(element, _globalConfig.activeClass);\n      break;\n    }\n  };\n  ZeroClipboard.prototype.on = function(eventName, func) {\n    var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;\n    if (typeof eventName === \"string\" && eventName) {\n      events = eventName.toLowerCase().split(/\\s+/);\n    } else if (typeof eventName === \"object\" && eventName && typeof func === \"undefined\") {\n      for (i in eventName) {\n        if (eventName.hasOwnProperty(i) && typeof i === \"string\" && i && typeof eventName[i] === \"function\") {\n          this.on(i, eventName[i]);\n        }\n      }\n    }\n    if (events && events.length) {\n      for (i = 0, len = events.length; i < len; i++) {\n        eventName = events[i].replace(/^on/, \"\");\n        added[eventName] = true;\n        if (!handlers[eventName]) {\n          handlers[eventName] = [];\n        }\n        handlers[eventName].push(func);\n      }\n      if (added.ready && _flashState.ready) {\n        ZeroClipboard.emit({\n          type: \"ready\",\n          client: this\n        });\n      }\n      if (added.error) {\n        var errorTypes = [ \"disabled\", \"outdated\", \"unavailable\", \"deactivated\", \"overdue\" ];\n        for (i = 0, len = errorTypes.length; i < len; i++) {\n          if (_flashState[errorTypes[i]]) {\n            ZeroClipboard.emit({\n              type: \"error\",\n              name: \"flash-\" + errorTypes[i],\n              client: this\n            });\n            break;\n          }\n        }\n      }\n    }\n    return this;\n  };\n  ZeroClipboard.prototype.off = function(eventName, func) {\n    var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;\n    if (arguments.length === 0) {\n      events = _objectKeys(handlers);\n    } else if (typeof eventName === \"string\" && eventName) {\n      events = eventName.split(/\\s+/);\n    } else if (typeof eventName === \"object\" && eventName && typeof func === \"undefined\") {\n      for (i in eventName) {\n        if (eventName.hasOwnProperty(i) && typeof i === \"string\" && i && typeof eventName[i] === \"function\") {\n          this.off(i, eventName[i]);\n        }\n      }\n    }\n    if (events && events.length) {\n      for (i = 0, len = events.length; i < len; i++) {\n        eventName = events[i].toLowerCase().replace(/^on/, \"\");\n        perEventHandlers = handlers[eventName];\n        if (perEventHandlers && perEventHandlers.length) {\n          if (func) {\n            foundIndex = _inArray(func, perEventHandlers);\n            while (foundIndex !== -1) {\n              perEventHandlers.splice(foundIndex, 1);\n              foundIndex = _inArray(func, perEventHandlers, foundIndex);\n            }\n          } else {\n            handlers[eventName].length = 0;\n          }\n        }\n      }\n    }\n    return this;\n  };\n  ZeroClipboard.prototype.handlers = function(eventName) {\n    var prop, copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;\n    if (handlers) {\n      if (typeof eventName === \"string\" && eventName) {\n        return handlers[eventName] ? handlers[eventName].slice(0) : null;\n      }\n      copy = {};\n      for (prop in handlers) {\n        if (handlers.hasOwnProperty(prop) && handlers[prop]) {\n          copy[prop] = handlers[prop].slice(0);\n        }\n      }\n    }\n    return copy;\n  };\n  ZeroClipboard.prototype.clip = function(elements) {\n    elements = _prepClip(elements);\n    for (var i = 0; i < elements.length; i++) {\n      if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {\n        if (!elements[i].zcClippingId) {\n          elements[i].zcClippingId = \"zcClippingId_\" + _elementIdCounter++;\n          _elementMeta[elements[i].zcClippingId] = [ this.id ];\n          if (_globalConfig.autoActivate === true) {\n            _addEventHandler(elements[i], \"mouseover\", _elementMouseOver);\n          }\n        } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) {\n          _elementMeta[elements[i].zcClippingId].push(this.id);\n        }\n        var clippedElements = _clientMeta[this.id].elements;\n        if (_inArray(elements[i], clippedElements) === -1) {\n          clippedElements.push(elements[i]);\n        }\n      }\n    }\n    return this;\n  };\n  ZeroClipboard.prototype.unclip = function(elements) {\n    var meta = _clientMeta[this.id];\n    if (!meta) {\n      return this;\n    }\n    var clippedElements = meta.elements;\n    var arrayIndex;\n    if (typeof elements === \"undefined\") {\n      elements = clippedElements.slice(0);\n    } else {\n      elements = _prepClip(elements);\n    }\n    for (var i = elements.length; i--; ) {\n      if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {\n        arrayIndex = 0;\n        while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) {\n          clippedElements.splice(arrayIndex, 1);\n        }\n        var clientIds = _elementMeta[elements[i].zcClippingId];\n        if (clientIds) {\n          arrayIndex = 0;\n          while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) {\n            clientIds.splice(arrayIndex, 1);\n          }\n          if (clientIds.length === 0) {\n            if (_globalConfig.autoActivate === true) {\n              _removeEventHandler(elements[i], \"mouseover\", _elementMouseOver);\n            }\n            delete elements[i].zcClippingId;\n          }\n        }\n      }\n    }\n    return this;\n  };\n  ZeroClipboard.prototype.elements = function() {\n    var meta = _clientMeta[this.id];\n    return meta && meta.elements ? meta.elements.slice(0) : [];\n  };\n  var _getAllClientsClippedToElement = function(element) {\n    var elementMetaId, clientIds, i, len, client, clients = [];\n    if (element && element.nodeType === 1 && (elementMetaId = element.zcClippingId) && _elementMeta.hasOwnProperty(elementMetaId)) {\n      clientIds = _elementMeta[elementMetaId];\n      if (clientIds && clientIds.length) {\n        for (i = 0, len = clientIds.length; i < len; i++) {\n          client = _clientMeta[clientIds[i]].instance;\n          if (client && client instanceof ZeroClipboard) {\n            clients.push(client);\n          }\n        }\n      }\n    }\n    return clients;\n  };\n  _globalConfig.hoverClass = \"zeroclipboard-is-hover\";\n  _globalConfig.activeClass = \"zeroclipboard-is-active\";\n  if (typeof define === \"function\" && define.amd) {\n    define(function() {\n      return ZeroClipboard;\n    });\n  } else if (typeof module === \"object\" && module && typeof module.exports === \"object\" && module.exports) {\n    module.exports = ZeroClipboard;\n  } else {\n    window.ZeroClipboard = ZeroClipboard;\n  }\n})(function() {\n  return this;\n}());"
  },
  {
    "path": "static/common/user/uedit/ueditor.all.js",
    "content": "/*!\n * UEditor\n * version: ueditor\n * build: Wed Aug 10 2016 11:06:02 GMT+0800 (CST)\n */\n\n(function(){\n\n// editor.js\nUEDITOR_CONFIG = window.UEDITOR_CONFIG || {};\n\nvar baidu = window.baidu || {};\n\nwindow.baidu = baidu;\n\nwindow.UE = baidu.editor =  window.UE || {};\n\nUE.plugins = {};\n\nUE.commands = {};\n\nUE.instants = {};\n\nUE.I18N = {};\n\nUE._customizeUI = {};\n\nUE.version = \"1.4.3\";\n\nvar dom = UE.dom = {};\n\n// core/browser.js\n/**\n * 浏览器判断模块\n * @file\n * @module UE.browser\n * @since 1.2.6.1\n */\n\n/**\n * 提供浏览器检测的模块\n * @unfile\n * @module UE.browser\n */\nvar browser = UE.browser = function(){\n    var agent = navigator.userAgent.toLowerCase(),\n        opera = window.opera,\n        browser = {\n        /**\n         * @property {boolean} ie 检测当前浏览器是否为IE\n         * @example\n         * ```javascript\n         * if ( UE.browser.ie ) {\n         *     console.log( '当前浏览器是IE' );\n         * }\n         * ```\n         */\n        ie\t\t:  /(msie\\s|trident.*rv:)([\\w.]+)/.test(agent),\n\n        /**\n         * @property {boolean} opera 检测当前浏览器是否为Opera\n         * @example\n         * ```javascript\n         * if ( UE.browser.opera ) {\n         *     console.log( '当前浏览器是Opera' );\n         * }\n         * ```\n         */\n        opera\t: ( !!opera && opera.version ),\n\n        /**\n         * @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器\n         * @example\n         * ```javascript\n         * if ( UE.browser.webkit ) {\n         *     console.log( '当前浏览器是webkit内核浏览器' );\n         * }\n         * ```\n         */\n        webkit\t: ( agent.indexOf( ' applewebkit/' ) > -1 ),\n\n        /**\n         * @property {boolean} mac 检测当前浏览器是否是运行在mac平台下\n         * @example\n         * ```javascript\n         * if ( UE.browser.mac ) {\n         *     console.log( '当前浏览器运行在mac平台下' );\n         * }\n         * ```\n         */\n        mac\t: ( agent.indexOf( 'macintosh' ) > -1 ),\n\n        /**\n         * @property {boolean} quirks 检测当前浏览器是否处于“怪异模式”下\n         * @example\n         * ```javascript\n         * if ( UE.browser.quirks ) {\n         *     console.log( '当前浏览器运行处于“怪异模式”' );\n         * }\n         * ```\n         */\n        quirks : ( document.compatMode == 'BackCompat' )\n    };\n\n    /**\n    * @property {boolean} gecko 检测当前浏览器内核是否是gecko内核\n    * @example\n    * ```javascript\n    * if ( UE.browser.gecko ) {\n    *     console.log( '当前浏览器内核是gecko内核' );\n    * }\n    * ```\n    */\n    browser.gecko =( navigator.product == 'Gecko' && !browser.webkit && !browser.opera && !browser.ie);\n\n    var version = 0;\n\n    // Internet Explorer 6.0+\n    if ( browser.ie ){\n\n        var v1 =  agent.match(/(?:msie\\s([\\w.]+))/);\n        var v2 = agent.match(/(?:trident.*rv:([\\w.]+))/);\n        if(v1 && v2 && v1[1] && v2[1]){\n            version = Math.max(v1[1]*1,v2[1]*1);\n        }else if(v1 && v1[1]){\n            version = v1[1]*1;\n        }else if(v2 && v2[1]){\n            version = v2[1]*1;\n        }else{\n            version = 0;\n        }\n\n        browser.ie11Compat = document.documentMode == 11;\n        /**\n         * @property { boolean } ie9Compat 检测浏览器模式是否为 IE9 兼容模式\n         * @warning 如果浏览器不是IE， 则该值为undefined\n         * @example\n         * ```javascript\n         * if ( UE.browser.ie9Compat ) {\n         *     console.log( '当前浏览器运行在IE9兼容模式下' );\n         * }\n         * ```\n         */\n        browser.ie9Compat = document.documentMode == 9;\n\n        /**\n         * @property { boolean } ie8 检测浏览器是否是IE8浏览器\n         * @warning 如果浏览器不是IE， 则该值为undefined\n         * @example\n         * ```javascript\n         * if ( UE.browser.ie8 ) {\n         *     console.log( '当前浏览器是IE8浏览器' );\n         * }\n         * ```\n         */\n        browser.ie8 = !!document.documentMode;\n\n        /**\n         * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式\n         * @warning 如果浏览器不是IE， 则该值为undefined\n         * @example\n         * ```javascript\n         * if ( UE.browser.ie8Compat ) {\n         *     console.log( '当前浏览器运行在IE8兼容模式下' );\n         * }\n         * ```\n         */\n        browser.ie8Compat = document.documentMode == 8;\n\n        /**\n         * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式\n         * @warning 如果浏览器不是IE， 则该值为undefined\n         * @example\n         * ```javascript\n         * if ( UE.browser.ie7Compat ) {\n         *     console.log( '当前浏览器运行在IE7兼容模式下' );\n         * }\n         * ```\n         */\n        browser.ie7Compat = ( ( version == 7 && !document.documentMode )\n                || document.documentMode == 7 );\n\n        /**\n         * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式\n         * @warning 如果浏览器不是IE， 则该值为undefined\n         * @example\n         * ```javascript\n         * if ( UE.browser.ie6Compat ) {\n         *     console.log( '当前浏览器运行在IE6模式或者怪异模式下' );\n         * }\n         * ```\n         */\n        browser.ie6Compat = ( version < 7 || browser.quirks );\n\n        browser.ie9above = version > 8;\n\n        browser.ie9below = version < 9;\n\n        browser.ie11above = version > 10;\n\n        browser.ie11below = version < 11;\n\n    }\n\n    // Gecko.\n    if ( browser.gecko ){\n        var geckoRelease = agent.match( /rv:([\\d\\.]+)/ );\n        if ( geckoRelease )\n        {\n            geckoRelease = geckoRelease[1].split( '.' );\n            version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;\n        }\n    }\n\n    /**\n     * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是，则返回Chrome的大版本号\n     * @warning 如果浏览器不是chrome， 则该值为undefined\n     * @example\n     * ```javascript\n     * if ( UE.browser.chrome ) {\n     *     console.log( '当前浏览器是Chrome' );\n     * }\n     * ```\n     */\n    if (/chrome\\/(\\d+\\.\\d)/i.test(agent)) {\n        browser.chrome = + RegExp['\\x241'];\n    }\n\n    /**\n     * @property { Number } safari 检测当前浏览器是否为Safari, 如果是，则返回Safari的大版本号\n     * @warning 如果浏览器不是safari， 则该值为undefined\n     * @example\n     * ```javascript\n     * if ( UE.browser.safari ) {\n     *     console.log( '当前浏览器是Safari' );\n     * }\n     * ```\n     */\n    if(/(\\d+\\.\\d)?(?:\\.\\d)?\\s+safari\\/?(\\d+\\.\\d+)?/i.test(agent) && !/chrome/i.test(agent)){\n    \tbrowser.safari = + (RegExp['\\x241'] || RegExp['\\x242']);\n    }\n\n\n    // Opera 9.50+\n    if ( browser.opera )\n        version = parseFloat( opera.version() );\n\n    // WebKit 522+ (Safari 3+)\n    if ( browser.webkit )\n        version = parseFloat( agent.match( / applewebkit\\/(\\d+)/ )[1] );\n\n    /**\n     * @property { Number } version 检测当前浏览器版本号\n     * @remind\n     * <ul>\n     *     <li>IE系列返回值为5,6,7,8,9,10等</li>\n     *     <li>gecko系列会返回10900，158900等</li>\n     *     <li>webkit系列会返回其build号 (如 522等)</li>\n     * </ul>\n     * @example\n     * ```javascript\n     * console.log( '当前浏览器版本号是： ' + UE.browser.version );\n     * ```\n     */\n    browser.version = version;\n\n    /**\n     * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容\n     * @example\n     * ```javascript\n     * if ( UE.browser.isCompatible ) {\n     *     console.log( '浏览器与UEditor能够良好兼容' );\n     * }\n     * ```\n     */\n    browser.isCompatible =\n        !browser.mobile && (\n        ( browser.ie && version >= 6 ) ||\n        ( browser.gecko && version >= 10801 ) ||\n        ( browser.opera && version >= 9.5 ) ||\n        ( browser.air && version >= 1 ) ||\n        ( browser.webkit && version >= 522 ) ||\n        false );\n    return browser;\n}();\n//快捷方式\nvar ie = browser.ie,\n    webkit = browser.webkit,\n    gecko = browser.gecko,\n    opera = browser.opera;\n\n// core/utils.js\n/**\n * 工具函数包\n * @file\n * @module UE.utils\n * @since 1.2.6.1\n */\n\n/**\n * UEditor封装使用的静态工具函数\n * @module UE.utils\n * @unfile\n */\n\nvar utils = UE.utils = {\n\n    /**\n     * 用给定的迭代器遍历对象\n     * @method each\n     * @param { Object } obj 需要遍历的对象\n     * @param { Function } iterator 迭代器， 该方法接受两个参数， 第一个参数是当前所处理的value， 第二个参数是当前遍历对象的key\n     * @example\n     * ```javascript\n     * var demoObj = {\n     *     key1: 1,\n     *     key2: 2\n     * };\n     *\n     * //output: key1: 1, key2: 2\n     * UE.utils.each( demoObj, funciton ( value, key ) {\n     *\n     *     console.log( key + \":\" + value );\n     *\n     * } );\n     * ```\n     */\n\n    /**\n     * 用给定的迭代器遍历数组或类数组对象\n     * @method each\n     * @param { Array } array 需要遍历的数组或者类数组\n     * @param { Function } iterator 迭代器， 该方法接受两个参数， 第一个参数是当前所处理的value， 第二个参数是当前遍历对象的key\n     * @example\n     * ```javascript\n     * var divs = document.getElmentByTagNames( \"div\" );\n     *\n     * //output: 0: DIV, 1: DIV ...\n     * UE.utils.each( divs, funciton ( value, key ) {\n     *\n     *     console.log( key + \":\" + value.tagName );\n     *\n     * } );\n     * ```\n     */\n    each : function(obj, iterator, context) {\n        if (obj == null) return;\n        if (obj.length === +obj.length) {\n            for (var i = 0, l = obj.length; i < l; i++) {\n                if(iterator.call(context, obj[i], i, obj) === false)\n                    return false;\n            }\n        } else {\n            for (var key in obj) {\n                if (obj.hasOwnProperty(key)) {\n                    if(iterator.call(context, obj[key], key, obj) === false)\n                        return false;\n                }\n            }\n        }\n    },\n\n    /**\n     * 以给定对象作为原型创建一个新对象\n     * @method makeInstance\n     * @param { Object } protoObject 该对象将作为新创建对象的原型\n     * @return { Object } 新的对象， 该对象的原型是给定的protoObject对象\n     * @example\n     * ```javascript\n     *\n     * var protoObject = { sayHello: function () { console.log('Hello UEditor!'); } };\n     *\n     * var newObject = UE.utils.makeInstance( protoObject );\n     * //output: Hello UEditor!\n     * newObject.sayHello();\n     * ```\n     */\n    makeInstance:function (obj) {\n        var noop = new Function();\n        noop.prototype = obj;\n        obj = new noop;\n        noop.prototype = null;\n        return obj;\n    },\n\n    /**\n     * 将source对象中的属性扩展到target对象上\n     * @method extend\n     * @remind 该方法将强制把source对象上的属性复制到target对象上\n     * @see UE.utils.extend(Object,Object,Boolean)\n     * @param { Object } target 目标对象， 新的属性将附加到该对象上\n     * @param { Object } source 源对象， 该对象的属性会被附加到target对象上\n     * @return { Object } 返回target对象\n     * @example\n     * ```javascript\n     *\n     * var target = { name: 'target', sex: 1 },\n     *      source = { name: 'source', age: 17 };\n     *\n     * UE.utils.extend( target, source );\n     *\n     * //output: { name: 'source', sex: 1, age: 17 }\n     * console.log( target );\n     *\n     * ```\n     */\n\n    /**\n     * 将source对象中的属性扩展到target对象上， 根据指定的isKeepTarget值决定是否保留目标对象中与\n     * 源对象属性名相同的属性值。\n     * @method extend\n     * @param { Object } target 目标对象， 新的属性将附加到该对象上\n     * @param { Object } source 源对象， 该对象的属性会被附加到target对象上\n     * @param { Boolean } isKeepTarget 是否保留目标对象中与源对象中属性名相同的属性\n     * @return { Object } 返回target对象\n     * @example\n     * ```javascript\n     *\n     * var target = { name: 'target', sex: 1 },\n     *      source = { name: 'source', age: 17 };\n     *\n     * UE.utils.extend( target, source, true );\n     *\n     * //output: { name: 'target', sex: 1, age: 17 }\n     * console.log( target );\n     *\n     * ```\n     */\n    extend:function (t, s, b) {\n        if (s) {\n            for (var k in s) {\n                if (!b || !t.hasOwnProperty(k)) {\n                    t[k] = s[k];\n                }\n            }\n        }\n        return t;\n    },\n\n    /**\n     * 将给定的多个对象的属性复制到目标对象target上\n     * @method extend2\n     * @remind 该方法将强制把源对象上的属性复制到target对象上\n     * @remind 该方法支持两个及以上的参数， 从第二个参数开始， 其属性都会被复制到第一个参数上。 如果遇到同名的属性，\n     *          将会覆盖掉之前的值。\n     * @param { Object } target 目标对象， 新的属性将附加到该对象上\n     * @param { Object... } source 源对象， 支持多个对象， 该对象的属性会被附加到target对象上\n     * @return { Object } 返回target对象\n     * @example\n     * ```javascript\n     *\n     * var target = {},\n     *     source1 = { name: 'source', age: 17 },\n     *     source2 = { title: 'dev' };\n     *\n     * UE.utils.extend2( target, source1, source2 );\n     *\n     * //output: { name: 'source', age: 17, title: 'dev' }\n     * console.log( target );\n     *\n     * ```\n     */\n    extend2:function (t) {\n        var a = arguments;\n        for (var i = 1; i < a.length; i++) {\n            var x = a[i];\n            for (var k in x) {\n                if (!t.hasOwnProperty(k)) {\n                    t[k] = x[k];\n                }\n            }\n        }\n        return t;\n    },\n\n    /**\n     * 模拟继承机制， 使得subClass继承自superClass\n     * @method inherits\n     * @param { Object } subClass 子类对象\n     * @param { Object } superClass 超类对象\n     * @warning 该方法只能让subClass继承超类的原型， subClass对象自身的属性和方法不会被继承\n     * @return { Object } 继承superClass后的子类对象\n     * @example\n     * ```javascript\n     * function SuperClass(){\n     *     this.name = \"小李\";\n     * }\n     *\n     * SuperClass.prototype = {\n     *     hello:function(str){\n     *         console.log(this.name + str);\n     *     }\n     * }\n     *\n     * function SubClass(){\n     *     this.name = \"小张\";\n     * }\n     *\n     * UE.utils.inherits(SubClass,SuperClass);\n     *\n     * var sub = new SubClass();\n     * //output: '小张早上好!\n     * sub.hello(\"早上好!\");\n     * ```\n     */\n    inherits:function (subClass, superClass) {\n        var oldP = subClass.prototype,\n            newP = utils.makeInstance(superClass.prototype);\n        utils.extend(newP, oldP, true);\n        subClass.prototype = newP;\n        return (newP.constructor = subClass);\n    },\n\n    /**\n     * 用指定的context对象作为函数fn的上下文\n     * @method bind\n     * @param { Function } fn 需要绑定上下文的函数对象\n     * @param { Object } content 函数fn新的上下文对象\n     * @return { Function } 一个新的函数， 该函数作为原始函数fn的代理， 将完成fn的上下文调换工作。\n     * @example\n     * ```javascript\n     *\n     * var name = 'window',\n     *     newTest = null;\n     *\n     * function test () {\n     *     console.log( this.name );\n     * }\n     *\n     * newTest = UE.utils.bind( test, { name: 'object' } );\n     *\n     * //output: object\n     * newTest();\n     *\n     * //output: window\n     * test();\n     *\n     * ```\n     */\n    bind:function (fn, context) {\n        return function () {\n            return fn.apply(context, arguments);\n        };\n    },\n\n    /**\n     * 创建延迟指定时间后执行的函数fn\n     * @method defer\n     * @param { Function } fn 需要延迟执行的函数对象\n     * @param { int } delay 延迟的时间， 单位是毫秒\n     * @warning 该方法的时间控制是不精确的，仅仅只能保证函数的执行是在给定的时间之后，\n     *           而不能保证刚好到达延迟时间时执行。\n     * @return { Function } 目标函数fn的代理函数， 只有执行该函数才能起到延时效果\n     * @example\n     * ```javascript\n     * var start = 0;\n     *\n     * function test(){\n     *     console.log( new Date() - start );\n     * }\n     *\n     * var testDefer = UE.utils.defer( test, 1000 );\n     * //\n     * start = new Date();\n     * //output: (大约在1000毫秒之后输出) 1000\n     * testDefer();\n     * ```\n     */\n\n    /**\n     * 创建延迟指定时间后执行的函数fn, 如果在延迟时间内再次执行该方法， 将会根据指定的exclusion的值，\n     * 决定是否取消前一次函数的执行， 如果exclusion的值为true， 则取消执行，反之，将继续执行前一个方法。\n     * @method defer\n     * @param { Function } fn 需要延迟执行的函数对象\n     * @param { int } delay 延迟的时间， 单位是毫秒\n     * @param { Boolean } exclusion 如果在延迟时间内再次执行该函数，该值将决定是否取消执行前一次函数的执行，\n     *                     值为true表示取消执行， 反之则将在执行前一次函数之后才执行本次函数调用。\n     * @warning 该方法的时间控制是不精确的，仅仅只能保证函数的执行是在给定的时间之后，\n     *           而不能保证刚好到达延迟时间时执行。\n     * @return { Function } 目标函数fn的代理函数， 只有执行该函数才能起到延时效果\n     * @example\n     * ```javascript\n     *\n     * function test(){\n     *     console.log(1);\n     * }\n     *\n     * var testDefer = UE.utils.defer( test, 1000, true );\n     *\n     * //output: (两次调用仅有一次输出) 1\n     * testDefer();\n     * testDefer();\n     * ```\n     */\n    defer:function (fn, delay, exclusion) {\n        var timerID;\n        return function () {\n            if (exclusion) {\n                clearTimeout(timerID);\n            }\n            timerID = setTimeout(fn, delay);\n        };\n    },\n\n    /**\n     * 获取元素item在数组array中首次出现的位置, 如果未找到item， 则返回-1\n     * @method indexOf\n     * @remind 该方法的匹配过程使用的是恒等“===”\n     * @param { Array } array 需要查找的数组对象\n     * @param { * } item 需要在目标数组中查找的值\n     * @return { int } 返回item在目标数组array中首次出现的位置， 如果在数组中未找到item， 则返回-1\n     * @example\n     * ```javascript\n     * var item = 1,\n     *     arr = [ 3, 4, 6, 8, 1, 1, 2 ];\n     *\n     * //output: 4\n     * console.log( UE.utils.indexOf( arr, item ) );\n     * ```\n     */\n\n    /**\n     * 获取元素item数组array中首次出现的位置, 如果未找到item， 则返回-1。通过start的值可以指定搜索的起始位置。\n     * @method indexOf\n     * @remind 该方法的匹配过程使用的是恒等“===”\n     * @param { Array } array 需要查找的数组对象\n     * @param { * } item 需要在目标数组中查找的值\n     * @param { int } start 搜索的起始位置\n     * @return { int } 返回item在目标数组array中的start位置之后首次出现的位置， 如果在数组中未找到item， 则返回-1\n     * @example\n     * ```javascript\n     * var item = 1,\n     *     arr = [ 3, 4, 6, 8, 1, 2, 8, 3, 2, 1, 1, 4 ];\n     *\n     * //output: 9\n     * console.log( UE.utils.indexOf( arr, item, 5 ) );\n     * ```\n     */\n    indexOf:function (array, item, start) {\n        var index = -1;\n        start = this.isNumber(start) ? start : 0;\n        this.each(array, function (v, i) {\n            if (i >= start && v === item) {\n                index = i;\n                return false;\n            }\n        });\n        return index;\n    },\n\n    /**\n     * 移除数组array中所有的元素item\n     * @method removeItem\n     * @param { Array } array 要移除元素的目标数组\n     * @param { * } item 将要被移除的元素\n     * @remind 该方法的匹配过程使用的是恒等“===”\n     * @example\n     * ```javascript\n     * var arr = [ 4, 5, 7, 1, 3, 4, 6 ];\n     *\n     * UE.utils.removeItem( arr, 4 );\n     * //output: [ 5, 7, 1, 3, 6 ]\n     * console.log( arr );\n     *\n     * ```\n     */\n    removeItem:function (array, item) {\n        for (var i = 0, l = array.length; i < l; i++) {\n            if (array[i] === item) {\n                array.splice(i, 1);\n                i--;\n            }\n        }\n    },\n\n    /**\n     * 删除字符串str的首尾空格\n     * @method trim\n     * @param { String } str 需要删除首尾空格的字符串\n     * @return { String } 删除了首尾的空格后的字符串\n     * @example\n     * ```javascript\n     *\n     * var str = \" UEdtior \";\n     *\n     * //output: 9\n     * console.log( str.length );\n     *\n     * //output: 7\n     * console.log( UE.utils.trim( \" UEdtior \" ).length );\n     *\n     * //output: 9\n     * console.log( str.length );\n     *\n     *  ```\n     */\n    trim:function (str) {\n        return str.replace(/(^[ \\t\\n\\r]+)|([ \\t\\n\\r]+$)/g, '');\n    },\n\n    /**\n     * 将字符串str以','分隔成数组后，将该数组转换成哈希对象， 其生成的hash对象的key为数组中的元素， value为1\n     * @method listToMap\n     * @warning 该方法在生成的hash对象中，会为每一个key同时生成一个另一个全大写的key。\n     * @param { String } str 该字符串将被以','分割为数组， 然后进行转化\n     * @return { Object } 转化之后的hash对象\n     * @example\n     * ```javascript\n     *\n     * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1}\n     * console.log( UE.utils.listToMap( 'UEdtior,Hello' ) );\n     *\n     * ```\n     */\n\n    /**\n     * 将字符串数组转换成哈希对象， 其生成的hash对象的key为数组中的元素， value为1\n     * @method listToMap\n     * @warning 该方法在生成的hash对象中，会为每一个key同时生成一个另一个全大写的key。\n     * @param { Array } arr 字符串数组\n     * @return { Object } 转化之后的hash对象\n     * @example\n     * ```javascript\n     *\n     * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1}\n     * console.log( UE.utils.listToMap( [ 'UEdtior', 'Hello' ] ) );\n     *\n     * ```\n     */\n    listToMap:function (list) {\n        if (!list)return {};\n        list = utils.isArray(list) ? list : list.split(',');\n        for (var i = 0, ci, obj = {}; ci = list[i++];) {\n            obj[ci.toUpperCase()] = obj[ci] = 1;\n        }\n        return obj;\n    },\n\n    /**\n     * 将str中的html符号转义,将转义“'，&，<，\"，>”五个字符\n     * @method unhtml\n     * @param { String } str 需要转义的字符串\n     * @return { String } 转义后的字符串\n     * @example\n     * ```javascript\n     * var html = '<body>&</body>';\n     *\n     * //output: &lt;body&gt;&amp;&lt;/body&gt;\n     * console.log( UE.utils.unhtml( html ) );\n     *\n     * ```\n     */\n    unhtml:function (str, reg) {\n        return str ? str.replace(reg || /[&<\">'](?:(amp|lt|quot|gt|#39|nbsp|#\\d+);)?/g, function (a, b) {\n            if (b) {\n                return a;\n            } else {\n                return {\n                    '<':'&lt;',\n                    '&':'&amp;',\n                    '\"':'&quot;',\n                    '>':'&gt;',\n                    \"'\":'&#39;'\n                }[a]\n            }\n\n        }) : '';\n    },\n    /**\n     * 将url中的html字符转义， 仅转义  ', \", <, > 四个字符\n     * @param  { String } str 需要转义的字符串\n     * @param  { RegExp } reg 自定义的正则\n     * @return { String }     转义后的字符串\n     */\n    unhtmlForUrl:function (str, reg) {\n        return str ? str.replace(reg || /[<\">']/g, function (a) {\n            return {\n                '<':'&lt;',\n                '&':'&amp;',\n                '\"':'&quot;',\n                '>':'&gt;',\n                \"'\":'&#39;'\n            }[a]\n\n        }) : '';\n    },\n\n    /**\n     * 将str中的转义字符还原成html字符\n     * @see UE.utils.unhtml(String);\n     * @method html\n     * @param { String } str 需要逆转义的字符串\n     * @return { String } 逆转义后的字符串\n     * @example\n     * ```javascript\n     *\n     * var str = '&lt;body&gt;&amp;&lt;/body&gt;';\n     *\n     * //output: <body>&</body>\n     * console.log( UE.utils.html( str ) );\n     *\n     * ```\n     */\n    html:function (str) {\n        return str ? str.replace(/&((g|l|quo)t|amp|#39|nbsp);/g, function (m) {\n            return {\n                '&lt;':'<',\n                '&amp;':'&',\n                '&quot;':'\"',\n                '&gt;':'>',\n                '&#39;':\"'\",\n                '&nbsp;':' '\n            }[m]\n        }) : '';\n    },\n\n    /**\n     * 将css样式转换为驼峰的形式\n     * @method cssStyleToDomStyle\n     * @param { String } cssName 需要转换的css样式名\n     * @return { String } 转换成驼峰形式后的css样式名\n     * @example\n     * ```javascript\n     *\n     * var str = 'border-top';\n     *\n     * //output: borderTop\n     * console.log( UE.utils.cssStyleToDomStyle( str ) );\n     *\n     * ```\n     */\n    cssStyleToDomStyle:function () {\n        var test = document.createElement('div').style,\n            cache = {\n                'float':test.cssFloat != undefined ? 'cssFloat' : test.styleFloat != undefined ? 'styleFloat' : 'float'\n            };\n\n        return function (cssName) {\n            return cache[cssName] || (cache[cssName] = cssName.toLowerCase().replace(/-./g, function (match) {\n                return match.charAt(1).toUpperCase();\n            }));\n        };\n    }(),\n\n    /**\n     * 动态加载文件到doc中\n     * @method loadFile\n     * @param { DomDocument } document 需要加载资源文件的文档对象\n     * @param { Object } options 加载资源文件的属性集合， 取值请参考代码示例\n     * @example\n     * ```javascript\n     *\n     * UE.utils.loadFile( document, {\n     *     src:\"test.js\",\n     *     tag:\"script\",\n     *     type:\"text/javascript\",\n     *     defer:\"defer\"\n     * } );\n     *\n     * ```\n     */\n\n    /**\n     * 动态加载文件到doc中，加载成功后执行的回调函数fn\n     * @method loadFile\n     * @param { DomDocument } document 需要加载资源文件的文档对象\n     * @param { Object } options 加载资源文件的属性集合， 该集合支持的值是script标签和style标签支持的所有属性。\n     * @param { Function } fn 资源文件加载成功之后执行的回调\n     * @warning 对于在同一个文档中多次加载同一URL的文件， 该方法会在第一次加载之后缓存该请求，\n     *           在此之后的所有同一URL的请求， 将会直接触发回调。\n     * @example\n     * ```javascript\n     *\n     * UE.utils.loadFile( document, {\n     *     src:\"test.js\",\n     *     tag:\"script\",\n     *     type:\"text/javascript\",\n     *     defer:\"defer\"\n     * }, function () {\n     *     console.log('加载成功');\n     * } );\n     *\n     * ```\n     */\n    loadFile:function () {\n        var tmpList = [];\n\n        function getItem(doc, obj) {\n            try {\n                for (var i = 0, ci; ci = tmpList[i++];) {\n                    if (ci.doc === doc && ci.url == (obj.src || obj.href)) {\n                        return ci;\n                    }\n                }\n            } catch (e) {\n                return null;\n            }\n\n        }\n\n        return function (doc, obj, fn) {\n            var item = getItem(doc, obj);\n            if (item) {\n                if (item.ready) {\n                    fn && fn();\n                } else {\n                    item.funs.push(fn)\n                }\n                return;\n            }\n            tmpList.push({\n                doc:doc,\n                url:obj.src || obj.href,\n                funs:[fn]\n            });\n            if (!doc.body) {\n                var html = [];\n                for (var p in obj) {\n                    if (p == 'tag')continue;\n                    html.push(p + '=\"' + obj[p] + '\"')\n                }\n                doc.write('<' + obj.tag + ' ' + html.join(' ') + ' ></' + obj.tag + '>');\n                return;\n            }\n            if (obj.id && doc.getElementById(obj.id)) {\n                return;\n            }\n            var element = doc.createElement(obj.tag);\n            delete obj.tag;\n            for (var p in obj) {\n                element.setAttribute(p, obj[p]);\n            }\n            element.onload = element.onreadystatechange = function () {\n                if (!this.readyState || /loaded|complete/.test(this.readyState)) {\n                    item = getItem(doc, obj);\n                    if (item.funs.length > 0) {\n                        item.ready = 1;\n                        for (var fi; fi = item.funs.pop();) {\n                            fi();\n                        }\n                    }\n                    element.onload = element.onreadystatechange = null;\n                }\n            };\n            element.onerror = function () {\n                throw Error('The load ' + (obj.href || obj.src) + ' fails,check the url settings of file ueditor.config.js ')\n            };\n            doc.getElementsByTagName(\"head\")[0].appendChild(element);\n        }\n    }(),\n\n    /**\n     * 判断obj对象是否为空\n     * @method isEmptyObject\n     * @param { * } obj 需要判断的对象\n     * @remind 如果判断的对象是NULL， 将直接返回true， 如果是数组且为空， 返回true， 如果是字符串， 且字符串为空，\n     *          返回true， 如果是普通对象， 且该对象没有任何实例属性， 返回true\n     * @return { Boolean } 对象是否为空\n     * @example\n     * ```javascript\n     *\n     * //output: true\n     * console.log( UE.utils.isEmptyObject( {} ) );\n     *\n     * //output: true\n     * console.log( UE.utils.isEmptyObject( [] ) );\n     *\n     * //output: true\n     * console.log( UE.utils.isEmptyObject( \"\" ) );\n     *\n     * //output: false\n     * console.log( UE.utils.isEmptyObject( { key: 1 } ) );\n     *\n     * //output: false\n     * console.log( UE.utils.isEmptyObject( [1] ) );\n     *\n     * //output: false\n     * console.log( UE.utils.isEmptyObject( \"1\" ) );\n     *\n     * ```\n     */\n    isEmptyObject:function (obj) {\n        if (obj == null) return true;\n        if (this.isArray(obj) || this.isString(obj)) return obj.length === 0;\n        for (var key in obj) if (obj.hasOwnProperty(key)) return false;\n        return true;\n    },\n\n    /**\n     * 把rgb格式的颜色值转换成16进制格式\n     * @method fixColor\n     * @param { String } rgb格式的颜色值\n     * @param { String }\n     * @example\n     * rgb(255,255,255)  => \"#ffffff\"\n     */\n    fixColor:function (name, value) {\n        if (/color/i.test(name) && /rgba?/.test(value)) {\n            var array = value.split(\",\");\n            if (array.length > 3)\n                return \"\";\n            value = \"#\";\n            for (var i = 0, color; color = array[i++];) {\n                color = parseInt(color.replace(/[^\\d]/gi, ''), 10).toString(16);\n                value += color.length == 1 ? \"0\" + color : color;\n            }\n            value = value.toUpperCase();\n        }\n        return  value;\n    },\n    /**\n     * 只针对border,padding,margin做了处理，因为性能问题\n     * @public\n     * @function\n     * @param {String}    val style字符串\n     */\n    optCss:function (val) {\n        var padding, margin, border;\n        val = val.replace(/(padding|margin|border)\\-([^:]+):([^;]+);?/gi, function (str, key, name, val) {\n            if (val.split(' ').length == 1) {\n                switch (key) {\n                    case 'padding':\n                        !padding && (padding = {});\n                        padding[name] = val;\n                        return '';\n                    case 'margin':\n                        !margin && (margin = {});\n                        margin[name] = val;\n                        return '';\n                    case 'border':\n                        return val == 'initial' ? '' : str;\n                }\n            }\n            return str;\n        });\n\n        function opt(obj, name) {\n            if (!obj) {\n                return '';\n            }\n            var t = obj.top , b = obj.bottom, l = obj.left, r = obj.right, val = '';\n            if (!t || !l || !b || !r) {\n                for (var p in obj) {\n                    val += ';' + name + '-' + p + ':' + obj[p] + ';';\n                }\n            } else {\n                val += ';' + name + ':' +\n                    (t == b && b == l && l == r ? t :\n                        t == b && l == r ? (t + ' ' + l) :\n                            l == r ? (t + ' ' + l + ' ' + b) : (t + ' ' + r + ' ' + b + ' ' + l)) + ';'\n            }\n            return val;\n        }\n\n        val += opt(padding, 'padding') + opt(margin, 'margin');\n        return val.replace(/^[ \\n\\r\\t;]*|[ \\n\\r\\t]*$/, '').replace(/;([ \\n\\r\\t]+)|\\1;/g, ';')\n            .replace(/(&((l|g)t|quot|#39))?;{2,}/g, function (a, b) {\n                return b ? b + \";;\" : ';'\n            });\n    },\n\n    /**\n     * 克隆对象\n     * @method clone\n     * @param { Object } source 源对象\n     * @return { Object } source的一个副本\n     */\n\n    /**\n     * 深度克隆对象，将source的属性克隆到target对象， 会覆盖target重名的属性。\n     * @method clone\n     * @param { Object } source 源对象\n     * @param { Object } target 目标对象\n     * @return { Object } 附加了source对象所有属性的target对象\n     */\n    clone:function (source, target) {\n        var tmp;\n        target = target || {};\n        for (var i in source) {\n            if (source.hasOwnProperty(i)) {\n                tmp = source[i];\n                if (typeof tmp == 'object') {\n                    target[i] = utils.isArray(tmp) ? [] : {};\n                    utils.clone(source[i], target[i])\n                } else {\n                    target[i] = tmp;\n                }\n            }\n        }\n        return target;\n    },\n\n    /**\n     * 把cm／pt为单位的值转换为px为单位的值\n     * @method transUnitToPx\n     * @param { String } 待转换的带单位的字符串\n     * @return { String } 转换为px为计量单位的值的字符串\n     * @example\n     * ```javascript\n     *\n     * //output: 500px\n     * console.log( UE.utils.transUnitToPx( '20cm' ) );\n     *\n     * //output: 27px\n     * console.log( UE.utils.transUnitToPx( '20pt' ) );\n     *\n     * ```\n     */\n    transUnitToPx:function (val) {\n        if (!/(pt|cm)/.test(val)) {\n            return val\n        }\n        var unit;\n        val.replace(/([\\d.]+)(\\w+)/, function (str, v, u) {\n            val = v;\n            unit = u;\n        });\n        switch (unit) {\n            case 'cm':\n                val = parseFloat(val) * 25;\n                break;\n            case 'pt':\n                val = Math.round(parseFloat(val) * 96 / 72);\n        }\n        return val + (val ? 'px' : '');\n    },\n\n    /**\n     * 在dom树ready之后执行给定的回调函数\n     * @method domReady\n     * @remind 如果在执行该方法的时候， dom树已经ready， 那么回调函数将立刻执行\n     * @param { Function } fn dom树ready之后的回调函数\n     * @example\n     * ```javascript\n     *\n     * UE.utils.domReady( function () {\n     *\n     *     console.log('123');\n     *\n     * } );\n     *\n     * ```\n     */\n    domReady:function () {\n\n        var fnArr = [];\n\n        function doReady(doc) {\n            //确保onready只执行一次\n            doc.isReady = true;\n            for (var ci; ci = fnArr.pop(); ci()) {\n            }\n        }\n\n        return function (onready, win) {\n            win = win || window;\n            var doc = win.document;\n            onready && fnArr.push(onready);\n            if (doc.readyState === \"complete\") {\n                doReady(doc);\n            } else {\n                doc.isReady && doReady(doc);\n                if (browser.ie && browser.version != 11) {\n                    (function () {\n                        if (doc.isReady) return;\n                        try {\n                            doc.documentElement.doScroll(\"left\");\n                        } catch (error) {\n                            setTimeout(arguments.callee, 0);\n                            return;\n                        }\n                        doReady(doc);\n                    })();\n                    win.attachEvent('onload', function () {\n                        doReady(doc)\n                    });\n                } else {\n                    doc.addEventListener(\"DOMContentLoaded\", function () {\n                        doc.removeEventListener(\"DOMContentLoaded\", arguments.callee, false);\n                        doReady(doc);\n                    }, false);\n                    win.addEventListener('load', function () {\n                        doReady(doc)\n                    }, false);\n                }\n            }\n\n        }\n    }(),\n\n    /**\n     * 动态添加css样式\n     * @method cssRule\n     * @param { String } 节点名称\n     * @grammar UE.utils.cssRule('添加的样式的节点名称',['样式'，'放到哪个document上'])\n     * @grammar UE.utils.cssRule('body','body{background:#ccc}') => null  //给body添加背景颜色\n     * @grammar UE.utils.cssRule('body') =>样式的字符串  //取得key值为body的样式的内容,如果没有找到key值先关的样式将返回空，例如刚才那个背景颜色，将返回 body{background:#ccc}\n     * @grammar UE.utils.cssRule('body',document) => 返回指定key的样式，并且指定是哪个document\n     * @grammar UE.utils.cssRule('body','') =>null //清空给定的key值的背景颜色\n     */\n    cssRule:browser.ie && browser.version != 11 ? function (key, style, doc) {\n        var indexList, index;\n        if(style === undefined || style && style.nodeType && style.nodeType == 9){\n            //获取样式\n            doc = style && style.nodeType && style.nodeType == 9 ? style : (doc || document);\n            indexList = doc.indexList || (doc.indexList = {});\n            index = indexList[key];\n            if(index !==  undefined){\n                return doc.styleSheets[index].cssText\n            }\n            return undefined;\n        }\n        doc = doc || document;\n        indexList = doc.indexList || (doc.indexList = {});\n        index = indexList[key];\n        //清除样式\n        if(style === ''){\n            if(index!== undefined){\n                doc.styleSheets[index].cssText = '';\n                delete indexList[key];\n                return true\n            }\n            return false;\n        }\n\n        //添加样式\n        if(index!== undefined){\n            sheetStyle =  doc.styleSheets[index];\n        }else{\n            sheetStyle = doc.createStyleSheet('', index = doc.styleSheets.length);\n            indexList[key] = index;\n        }\n        sheetStyle.cssText = style;\n    }: function (key, style, doc) {\n        var head, node;\n        if(style === undefined || style && style.nodeType && style.nodeType == 9){\n            //获取样式\n            doc = style && style.nodeType && style.nodeType == 9 ? style : (doc || document);\n            node = doc.getElementById(key);\n            return node ? node.innerHTML : undefined;\n        }\n        doc = doc || document;\n        node = doc.getElementById(key);\n\n        //清除样式\n        if(style === ''){\n            if(node){\n                node.parentNode.removeChild(node);\n                return true\n            }\n            return false;\n        }\n\n        //添加样式\n        if(node){\n            node.innerHTML = style;\n        }else{\n            node = doc.createElement('style');\n            node.id = key;\n            node.innerHTML = style;\n            doc.getElementsByTagName('head')[0].appendChild(node);\n        }\n    },\n    sort:function(array,compareFn){\n        compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);};\n        for(var i= 0,len = array.length; i<len; i++){\n            for(var j = i,length = array.length; j<length; j++){\n                if(compareFn(array[i], array[j]) > 0){\n                    var t = array[i];\n                    array[i] = array[j];\n                    array[j] = t;\n                }\n            }\n        }\n        return array;\n    },\n    serializeParam:function (json) {\n        var strArr = [];\n        for (var i in json) {\n            //忽略默认的几个参数\n            if(i==\"method\" || i==\"timeout\" || i==\"async\") continue;\n            //传递过来的对象和函数不在提交之列\n            if (!((typeof json[i]).toLowerCase() == \"function\" || (typeof json[i]).toLowerCase() == \"object\")) {\n                strArr.push( encodeURIComponent(i) + \"=\"+encodeURIComponent(json[i]) );\n            } else if (utils.isArray(json[i])) {\n                //支持传数组内容\n                for(var j = 0; j < json[i].length; j++) {\n                    strArr.push( encodeURIComponent(i) + \"[]=\"+encodeURIComponent(json[i][j]) );\n                }\n            }\n        }\n        return strArr.join(\"&\");\n    },\n    formatUrl:function (url) {\n        var u = url.replace(/&&/g, '&');\n        u = u.replace(/\\?&/g, '?');\n        u = u.replace(/&$/g, '');\n        u = u.replace(/&#/g, '#');\n        u = u.replace(/&+/g, '&');\n        return u;\n    },\n    isCrossDomainUrl:function (url) {\n        var a = document.createElement('a');\n        a.href = url;\n        if (browser.ie) {\n            a.href = a.href;\n        }\n        return !(a.protocol == location.protocol && a.hostname == location.hostname &&\n        (a.port == location.port || (a.port == '80' && location.port == '') || (a.port == '' && location.port == '80')));\n    },\n    clearEmptyAttrs : function(obj){\n        for(var p in obj){\n            if(obj[p] === ''){\n                delete obj[p]\n            }\n        }\n        return obj;\n    },\n    str2json : function(s){\n\n        if (!utils.isString(s)) return null;\n        if (window.JSON) {\n            return JSON.parse(s);\n        } else {\n            return (new Function(\"return \" + utils.trim(s || '')))();\n        }\n\n    },\n    json2str : (function(){\n\n        if (window.JSON) {\n\n            return JSON.stringify;\n\n        } else {\n\n            var escapeMap = {\n                \"\\b\": '\\\\b',\n                \"\\t\": '\\\\t',\n                \"\\n\": '\\\\n',\n                \"\\f\": '\\\\f',\n                \"\\r\": '\\\\r',\n                '\"' : '\\\\\"',\n                \"\\\\\": '\\\\\\\\'\n            };\n\n            function encodeString(source) {\n                if (/[\"\\\\\\x00-\\x1f]/.test(source)) {\n                    source = source.replace(\n                        /[\"\\\\\\x00-\\x1f]/g,\n                        function (match) {\n                            var c = escapeMap[match];\n                            if (c) {\n                                return c;\n                            }\n                            c = match.charCodeAt();\n                            return \"\\\\u00\"\n                            + Math.floor(c / 16).toString(16)\n                            + (c % 16).toString(16);\n                        });\n                }\n                return '\"' + source + '\"';\n            }\n\n            function encodeArray(source) {\n                var result = [\"[\"],\n                    l = source.length,\n                    preComma, i, item;\n\n                for (i = 0; i < l; i++) {\n                    item = source[i];\n\n                    switch (typeof item) {\n                        case \"undefined\":\n                        case \"function\":\n                        case \"unknown\":\n                            break;\n                        default:\n                            if(preComma) {\n                                result.push(',');\n                            }\n                            result.push(utils.json2str(item));\n                            preComma = 1;\n                    }\n                }\n                result.push(\"]\");\n                return result.join(\"\");\n            }\n\n            function pad(source) {\n                return source < 10 ? '0' + source : source;\n            }\n\n            function encodeDate(source){\n                return '\"' + source.getFullYear() + \"-\"\n                + pad(source.getMonth() + 1) + \"-\"\n                + pad(source.getDate()) + \"T\"\n                + pad(source.getHours()) + \":\"\n                + pad(source.getMinutes()) + \":\"\n                + pad(source.getSeconds()) + '\"';\n            }\n\n            return function (value) {\n                switch (typeof value) {\n                    case 'undefined':\n                        return 'undefined';\n\n                    case 'number':\n                        return isFinite(value) ? String(value) : \"null\";\n\n                    case 'string':\n                        return encodeString(value);\n\n                    case 'boolean':\n                        return String(value);\n\n                    default:\n                        if (value === null) {\n                            return 'null';\n                        } else if (utils.isArray(value)) {\n                            return encodeArray(value);\n                        } else if (utils.isDate(value)) {\n                            return encodeDate(value);\n                        } else {\n                            var result = ['{'],\n                                encode = utils.json2str,\n                                preComma,\n                                item;\n\n                            for (var key in value) {\n                                if (Object.prototype.hasOwnProperty.call(value, key)) {\n                                    item = value[key];\n                                    switch (typeof item) {\n                                        case 'undefined':\n                                        case 'unknown':\n                                        case 'function':\n                                            break;\n                                        default:\n                                            if (preComma) {\n                                                result.push(',');\n                                            }\n                                            preComma = 1;\n                                            result.push(encode(key) + ':' + encode(item));\n                                    }\n                                }\n                            }\n                            result.push('}');\n                            return result.join('');\n                        }\n                }\n            };\n        }\n\n    })()\n\n};\n/**\n * 判断给定的对象是否是字符串\n * @method isString\n * @param { * } object 需要判断的对象\n * @return { Boolean } 给定的对象是否是字符串\n */\n\n/**\n * 判断给定的对象是否是数组\n * @method isArray\n * @param { * } object 需要判断的对象\n * @return { Boolean } 给定的对象是否是数组\n */\n\n/**\n * 判断给定的对象是否是一个Function\n * @method isFunction\n * @param { * } object 需要判断的对象\n * @return { Boolean } 给定的对象是否是Function\n */\n\n/**\n * 判断给定的对象是否是Number\n * @method isNumber\n * @param { * } object 需要判断的对象\n * @return { Boolean } 给定的对象是否是Number\n */\n\n/**\n * 判断给定的对象是否是一个正则表达式\n * @method isRegExp\n * @param { * } object 需要判断的对象\n * @return { Boolean } 给定的对象是否是正则表达式\n */\n\n/**\n * 判断给定的对象是否是一个普通对象\n * @method isObject\n * @param { * } object 需要判断的对象\n * @return { Boolean } 给定的对象是否是普通对象\n */\nutils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object', 'Date'], function (v) {\n    UE.utils['is' + v] = function (obj) {\n        return Object.prototype.toString.apply(obj) == '[object ' + v + ']';\n    }\n});\n\n\n// core/EventBase.js\n/**\n * UE采用的事件基类\n * @file\n * @module UE\n * @class EventBase\n * @since 1.2.6.1\n */\n\n/**\n * UEditor公用空间，UEditor所有的功能都挂载在该空间下\n * @unfile\n * @module UE\n */\n\n/**\n * UE采用的事件基类，继承此类的对应类将获取addListener,removeListener,fireEvent方法。\n * 在UE中，Editor以及所有ui实例都继承了该类，故可以在对应的ui对象以及editor对象上使用上述方法。\n * @unfile\n * @module UE\n * @class EventBase\n */\n\n/**\n * 通过此构造器，子类可以继承EventBase获取事件监听的方法\n * @constructor\n * @example\n * ```javascript\n * UE.EventBase.call(editor);\n * ```\n */\nvar EventBase = UE.EventBase = function () {};\n\nEventBase.prototype = {\n\n    /**\n     * 注册事件监听器\n     * @method addListener\n     * @param { String } types 监听的事件名称，同时监听多个事件使用空格分隔\n     * @param { Function } fn 监听的事件被触发时，会执行该回调函数\n     * @waining 事件被触发时，监听的函数假如返回的值恒等于true，回调函数的队列中后面的函数将不执行\n     * @example\n     * ```javascript\n     * editor.addListener('selectionchange',function(){\n     *      console.log(\"选区已经变化！\");\n     * })\n     * editor.addListener('beforegetcontent aftergetcontent',function(type){\n     *         if(type == 'beforegetcontent'){\n     *             //do something\n     *         }else{\n     *             //do something\n     *         }\n     *         console.log(this.getContent) // this是注册的事件的编辑器实例\n     * })\n     * ```\n     * @see UE.EventBase:fireEvent(String)\n     */\n    addListener:function (types, listener) {\n        types = utils.trim(types).split(/\\s+/);\n        for (var i = 0, ti; ti = types[i++];) {\n            getListener(this, ti, true).push(listener);\n        }\n    },\n\n    on : function(types, listener){\n      return this.addListener(types,listener);\n    },\n    off : function(types, listener){\n        return this.removeListener(types, listener)\n    },\n    trigger:function(){\n        return this.fireEvent.apply(this,arguments);\n    },\n    /**\n     * 移除事件监听器\n     * @method removeListener\n     * @param { String } types 移除的事件名称，同时移除多个事件使用空格分隔\n     * @param { Function } fn 移除监听事件的函数引用\n     * @example\n     * ```javascript\n     * //changeCallback为方法体\n     * editor.removeListener(\"selectionchange\",changeCallback);\n     * ```\n     */\n    removeListener:function (types, listener) {\n        types = utils.trim(types).split(/\\s+/);\n        for (var i = 0, ti; ti = types[i++];) {\n            utils.removeItem(getListener(this, ti) || [], listener);\n        }\n    },\n\n    /**\n     * 触发事件\n     * @method fireEvent\n     * @param { String } types 触发的事件名称，同时触发多个事件使用空格分隔\n     * @remind 该方法会触发addListener\n     * @return { * } 返回触发事件的队列中，最后执行的回调函数的返回值\n     * @example\n     * ```javascript\n     * editor.fireEvent(\"selectionchange\");\n     * ```\n     */\n\n    /**\n     * 触发事件\n     * @method fireEvent\n     * @param { String } types 触发的事件名称，同时触发多个事件使用空格分隔\n     * @param { *... } options 可选参数，可以传入一个或多个参数，会传给事件触发的回调函数\n     * @return { * } 返回触发事件的队列中，最后执行的回调函数的返回值\n     * @example\n     * ```javascript\n     *\n     * editor.addListener( \"selectionchange\", function ( type, arg1, arg2 ) {\n     *\n     *     console.log( arg1 + \" \" + arg2 );\n     *\n     * } );\n     *\n     * //触发selectionchange事件， 会执行上面的事件监听器\n     * //output: Hello World\n     * editor.fireEvent(\"selectionchange\", \"Hello\", \"World\");\n     * ```\n     */\n    fireEvent:function () {\n        var types = arguments[0];\n        types = utils.trim(types).split(' ');\n        for (var i = 0, ti; ti = types[i++];) {\n            var listeners = getListener(this, ti),\n                r, t, k;\n            if (listeners) {\n                k = listeners.length;\n                while (k--) {\n                    if(!listeners[k])continue;\n                    t = listeners[k].apply(this, arguments);\n                    if(t === true){\n                        return t;\n                    }\n                    if (t !== undefined) {\n                        r = t;\n                    }\n                }\n            }\n            if (t = this['on' + ti.toLowerCase()]) {\n                r = t.apply(this, arguments);\n            }\n        }\n        return r;\n    }\n};\n/**\n * 获得对象所拥有监听类型的所有监听器\n * @unfile\n * @module UE\n * @since 1.2.6.1\n * @method getListener\n * @public\n * @param { Object } obj  查询监听器的对象\n * @param { String } type 事件类型\n * @param { Boolean } force  为true且当前所有type类型的侦听器不存在时，创建一个空监听器数组\n * @return { Array } 监听器数组\n */\nfunction getListener(obj, type, force) {\n    var allListeners;\n    type = type.toLowerCase();\n    return ( ( allListeners = ( obj.__allListeners || force && ( obj.__allListeners = {} ) ) )\n        && ( allListeners[type] || force && ( allListeners[type] = [] ) ) );\n}\n\n\n\n// core/dtd.js\n///import editor.js\n///import core/dom/dom.js\n///import core/utils.js\n/**\n * dtd html语义化的体现类\n * @constructor\n * @namespace dtd\n */\nvar dtd = dom.dtd = (function() {\n    function _( s ) {\n        for (var k in s) {\n            s[k.toUpperCase()] = s[k];\n        }\n        return s;\n    }\n    var X = utils.extend2;\n    var A = _({isindex:1,fieldset:1}),\n        B = _({input:1,button:1,select:1,textarea:1,label:1}),\n        C = X( _({a:1}), B ),\n        D = X( {iframe:1}, C ),\n        E = _({hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1}),\n        F = _({ins:1,del:1,script:1,style:1}),\n        G = X( _({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1}), F ),\n        H = X( _({sub:1,img:1,embed:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1}), G ),\n        I = X( _({p:1}), H ),\n        J = X( _({iframe:1}), H, B ),\n        K = _({img:1,embed:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1}),\n\n        L = X( _({a:0}), J ),//a不能被切开，所以把他\n        M = _({tr:1}),\n        N = _({'#':1}),\n        O = X( _({param:1}), K ),\n        P = X( _({form:1}), A, D, E, I ),\n        Q = _({li:1,ol:1,ul:1}),\n        R = _({style:1,script:1}),\n        S = _({base:1,link:1,meta:1,title:1}),\n        T = X( S, R ),\n        U = _({head:1,body:1}),\n        V = _({html:1});\n\n    var block = _({address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1}),\n\n        empty =  _({area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1});\n\n    return  _({\n\n        // $ 表示自定的属性\n\n        // body外的元素列表.\n        $nonBodyContent: X( V, U, S ),\n\n        //块结构元素列表\n        $block : block,\n\n        //内联元素列表\n        $inline : L,\n\n        $inlineWithA : X(_({a:1}),L),\n\n        $body : X( _({script:1,style:1}), block ),\n\n        $cdata : _({script:1,style:1}),\n\n        //自闭和元素\n        $empty : empty,\n\n        //不是自闭合，但不能让range选中里边\n        $nonChild : _({iframe:1,textarea:1}),\n        //列表元素列表\n        $listItem : _({dd:1,dt:1,li:1}),\n\n        //列表根元素列表\n        $list: _({ul:1,ol:1,dl:1}),\n\n        //不能认为是空的元素\n        $isNotEmpty : _({table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1}),\n\n        //如果没有子节点就可以删除的元素列表，像span,a\n        $removeEmpty : _({a:1,abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1}),\n\n        $removeEmptyBlock : _({'p':1,'div':1}),\n\n        //在table元素里的元素列表\n        $tableContent : _({caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,table:1}),\n        //不转换的标签\n        $notTransContent : _({pre:1,script:1,style:1,textarea:1}),\n        html: U,\n        head: T,\n        style: N,\n        script: N,\n        body: P,\n        base: {},\n        link: {},\n        meta: {},\n        title: N,\n        col : {},\n        tr : _({td:1,th:1}),\n        img : {},\n        embed: {},\n        colgroup : _({thead:1,col:1,tbody:1,tr:1,tfoot:1}),\n        noscript : P,\n        td : P,\n        br : {},\n        th : P,\n        center : P,\n        kbd : L,\n        button : X( I, E ),\n        basefont : {},\n        h5 : L,\n        h4 : L,\n        samp : L,\n        h6 : L,\n        ol : Q,\n        h1 : L,\n        h3 : L,\n        option : N,\n        h2 : L,\n        form : X( A, D, E, I ),\n        select : _({optgroup:1,option:1}),\n        font : L,\n        ins : L,\n        menu : Q,\n        abbr : L,\n        label : L,\n        table : _({thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1}),\n        code : L,\n        tfoot : M,\n        cite : L,\n        li : P,\n        input : {},\n        iframe : P,\n        strong : L,\n        textarea : N,\n        noframes : P,\n        big : L,\n        small : L,\n        //trace:\n        span :_({'#':1,br:1,b:1,strong:1,u:1,i:1,em:1,sub:1,sup:1,strike:1,span:1}),\n        hr : L,\n        dt : L,\n        sub : L,\n        optgroup : _({option:1}),\n        param : {},\n        bdo : L,\n        'var' : L,\n        div : P,\n        object : O,\n        sup : L,\n        dd : P,\n        strike : L,\n        area : {},\n        dir : Q,\n        map : X( _({area:1,form:1,p:1}), A, F, E ),\n        applet : O,\n        dl : _({dt:1,dd:1}),\n        del : L,\n        isindex : {},\n        fieldset : X( _({legend:1}), K ),\n        thead : M,\n        ul : Q,\n        acronym : L,\n        b : L,\n        a : X( _({a:1}), J ),\n        blockquote :X(_({td:1,tr:1,tbody:1,li:1}),P),\n        caption : L,\n        i : L,\n        u : L,\n        tbody : M,\n        s : L,\n        address : X( D, I ),\n        tt : L,\n        legend : L,\n        q : L,\n        pre : X( G, C ),\n        p : X(_({'a':1}),L),\n        em :L,\n        dfn : L\n    });\n})();\n\n\n// core/domUtils.js\n/**\n * Dom操作工具包\n * @file\n * @module UE.dom.domUtils\n * @since 1.2.6.1\n */\n\n/**\n * Dom操作工具包\n * @unfile\n * @module UE.dom.domUtils\n */\nfunction getDomNode(node, start, ltr, startFromChild, fn, guard) {\n    var tmpNode = startFromChild && node[start],\n        parent;\n    !tmpNode && (tmpNode = node[ltr]);\n    while (!tmpNode && (parent = (parent || node).parentNode)) {\n        if (parent.tagName == 'BODY' || guard && !guard(parent)) {\n            return null;\n        }\n        tmpNode = parent[ltr];\n    }\n    if (tmpNode && fn && !fn(tmpNode)) {\n        return  getDomNode(tmpNode, start, ltr, false, fn);\n    }\n    return tmpNode;\n}\nvar attrFix = ie && browser.version < 9 ? {\n        tabindex:\"tabIndex\",\n        readonly:\"readOnly\",\n        \"for\":\"htmlFor\",\n        \"class\":\"className\",\n        maxlength:\"maxLength\",\n        cellspacing:\"cellSpacing\",\n        cellpadding:\"cellPadding\",\n        rowspan:\"rowSpan\",\n        colspan:\"colSpan\",\n        usemap:\"useMap\",\n        frameborder:\"frameBorder\"\n    } : {\n        tabindex:\"tabIndex\",\n        readonly:\"readOnly\"\n    },\n    styleBlock = utils.listToMap([\n        '-webkit-box', '-moz-box', 'block' ,\n        'list-item' , 'table' , 'table-row-group' ,\n        'table-header-group', 'table-footer-group' ,\n        'table-row' , 'table-column-group' , 'table-column' ,\n        'table-cell' , 'table-caption'\n    ]);\nvar domUtils = dom.domUtils = {\n    //节点常量\n    NODE_ELEMENT:1,\n    NODE_DOCUMENT:9,\n    NODE_TEXT:3,\n    NODE_COMMENT:8,\n    NODE_DOCUMENT_FRAGMENT:11,\n\n    //位置关系\n    POSITION_IDENTICAL:0,\n    POSITION_DISCONNECTED:1,\n    POSITION_FOLLOWING:2,\n    POSITION_PRECEDING:4,\n    POSITION_IS_CONTAINED:8,\n    POSITION_CONTAINS:16,\n    //ie6使用其他的会有一段空白出现\n    fillChar:ie && browser.version == '6' ? '\\ufeff' : '\\u200B',\n    //-------------------------Node部分--------------------------------\n    keys:{\n        /*Backspace*/ 8:1, /*Delete*/ 46:1,\n        /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1,\n        37:1, 38:1, 39:1, 40:1,\n        13:1 /*enter*/\n    },\n    /**\n     * 获取节点A相对于节点B的位置关系\n     * @method getPosition\n     * @param { Node } nodeA 需要查询位置关系的节点A\n     * @param { Node } nodeB 需要查询位置关系的节点B\n     * @return { Number } 节点A与节点B的关系\n     * @example\n     * ```javascript\n     * //output: 20\n     * var position = UE.dom.domUtils.getPosition( document.documentElement, document.body );\n     *\n     * switch ( position ) {\n     *\n     *      //0\n     *      case UE.dom.domUtils.POSITION_IDENTICAL:\n     *          console.log('元素相同');\n     *          break;\n     *      //1\n     *      case UE.dom.domUtils.POSITION_DISCONNECTED:\n     *          console.log('两个节点在不同的文档中');\n     *          break;\n     *      //2\n     *      case UE.dom.domUtils.POSITION_FOLLOWING:\n     *          console.log('节点A在节点B之后');\n     *          break;\n     *      //4\n     *      case UE.dom.domUtils.POSITION_PRECEDING;\n     *          console.log('节点A在节点B之前');\n     *          break;\n     *      //8\n     *      case UE.dom.domUtils.POSITION_IS_CONTAINED:\n     *          console.log('节点A被节点B包含');\n     *          break;\n     *      case 10:\n     *          console.log('节点A被节点B包含且节点A在节点B之后');\n     *          break;\n     *      //16\n     *      case UE.dom.domUtils.POSITION_CONTAINS:\n     *          console.log('节点A包含节点B');\n     *          break;\n     *      case 20:\n     *          console.log('节点A包含节点B且节点A在节点B之前');\n     *          break;\n     *\n     * }\n     * ```\n     */\n    getPosition:function (nodeA, nodeB) {\n        // 如果两个节点是同一个节点\n        if (nodeA === nodeB) {\n            // domUtils.POSITION_IDENTICAL\n            return 0;\n        }\n        var node,\n            parentsA = [nodeA],\n            parentsB = [nodeB];\n        node = nodeA;\n        while (node = node.parentNode) {\n            // 如果nodeB是nodeA的祖先节点\n            if (node === nodeB) {\n                // domUtils.POSITION_IS_CONTAINED + domUtils.POSITION_FOLLOWING\n                return 10;\n            }\n            parentsA.push(node);\n        }\n        node = nodeB;\n        while (node = node.parentNode) {\n            // 如果nodeA是nodeB的祖先节点\n            if (node === nodeA) {\n                // domUtils.POSITION_CONTAINS + domUtils.POSITION_PRECEDING\n                return 20;\n            }\n            parentsB.push(node);\n        }\n        parentsA.reverse();\n        parentsB.reverse();\n        if (parentsA[0] !== parentsB[0]) {\n            // domUtils.POSITION_DISCONNECTED\n            return 1;\n        }\n        var i = -1;\n        while (i++, parentsA[i] === parentsB[i]) {\n        }\n        nodeA = parentsA[i];\n        nodeB = parentsB[i];\n        while (nodeA = nodeA.nextSibling) {\n            if (nodeA === nodeB) {\n                // domUtils.POSITION_PRECEDING\n                return 4\n            }\n        }\n        // domUtils.POSITION_FOLLOWING\n        return  2;\n    },\n\n    /**\n     * 检测节点node在父节点中的索引位置\n     * @method getNodeIndex\n     * @param { Node } node 需要检测的节点对象\n     * @return { Number } 该节点在父节点中的位置\n     * @see UE.dom.domUtils.getNodeIndex(Node,Boolean)\n     */\n\n    /**\n     * 检测节点node在父节点中的索引位置， 根据给定的mergeTextNode参数决定是否要合并多个连续的文本节点为一个节点\n     * @method getNodeIndex\n     * @param { Node } node 需要检测的节点对象\n     * @param { Boolean } mergeTextNode 是否合并多个连续的文本节点为一个节点\n     * @return { Number } 该节点在父节点中的位置\n     * @example\n     * ```javascript\n     *\n     *      var node = document.createElement(\"div\");\n     *\n     *      node.appendChild( document.createTextNode( \"hello\" ) );\n     *      node.appendChild( document.createTextNode( \"world\" ) );\n     *      node.appendChild( node = document.createElement( \"div\" ) );\n     *\n     *      //output: 2\n     *      console.log( UE.dom.domUtils.getNodeIndex( node ) );\n     *\n     *      //output: 1\n     *      console.log( UE.dom.domUtils.getNodeIndex( node, true ) );\n     *\n     * ```\n     */\n    getNodeIndex:function (node, ignoreTextNode) {\n        var preNode = node,\n            i = 0;\n        while (preNode = preNode.previousSibling) {\n            if (ignoreTextNode && preNode.nodeType == 3) {\n                if(preNode.nodeType != preNode.nextSibling.nodeType ){\n                    i++;\n                }\n                continue;\n            }\n            i++;\n        }\n        return i;\n    },\n\n    /**\n     * 检测节点node是否在给定的document对象上\n     * @method inDoc\n     * @param { Node } node 需要检测的节点对象\n     * @param { DomDocument } doc 需要检测的document对象\n     * @return { Boolean } 该节点node是否在给定的document的dom树上\n     * @example\n     * ```javascript\n     *\n     * var node = document.createElement(\"div\");\n     *\n     * //output: false\n     * console.log( UE.do.domUtils.inDoc( node, document ) );\n     *\n     * document.body.appendChild( node );\n     *\n     * //output: true\n     * console.log( UE.do.domUtils.inDoc( node, document ) );\n     *\n     * ```\n     */\n    inDoc:function (node, doc) {\n        return domUtils.getPosition(node, doc) == 10;\n    },\n    /**\n     * 根据给定的过滤规则filterFn， 查找符合该过滤规则的node节点的第一个祖先节点，\n     * 查找的起点是给定node节点的父节点。\n     * @method findParent\n     * @param { Node } node 需要查找的节点\n     * @param { Function } filterFn 自定义的过滤方法。\n     * @warning 查找的终点是到body节点为止\n     * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数， 该对象代表当前执行检测的祖先节点。 如果该\n     *          节点满足过滤条件， 则要求返回true， 这时将直接返回该节点作为findParent()的结果， 否则， 请返回false。\n     * @return { Node | Null } 如果找到符合过滤条件的节点， 就返回该节点， 否则返回NULL\n     * @example\n     * ```javascript\n     * var filterNode = UE.dom.domUtils.findParent( document.body.firstChild, function ( node ) {\n     *\n     *     //由于查找的终点是body节点， 所以永远也不会匹配当前过滤器的条件， 即这里永远会返回false\n     *     return node.tagName === \"HTML\";\n     *\n     * } );\n     *\n     * //output: true\n     * console.log( filterNode === null );\n     * ```\n     */\n\n    /**\n     * 根据给定的过滤规则filterFn， 查找符合该过滤规则的node节点的第一个祖先节点，\n     * 如果includeSelf的值为true，则查找的起点是给定的节点node， 否则， 起点是node的父节点\n     * @method findParent\n     * @param { Node } node 需要查找的节点\n     * @param { Function } filterFn 自定义的过滤方法。\n     * @param { Boolean } includeSelf 查找过程是否包含自身\n     * @warning 查找的终点是到body节点为止\n     * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数， 该对象代表当前执行检测的祖先节点。 如果该\n     *          节点满足过滤条件， 则要求返回true， 这时将直接返回该节点作为findParent()的结果， 否则， 请返回false。\n     * @remind 如果includeSelf为true， 则过滤器第一次执行时的参数会是节点本身。\n     *          反之， 过滤器第一次执行时的参数将是该节点的父节点。\n     * @return { Node | Null } 如果找到符合过滤条件的节点， 就返回该节点， 否则返回NULL\n     * @example\n     * ```html\n     * <body>\n     *\n     *      <div id=\"test\">\n     *      </div>\n     *\n     *      <script type=\"text/javascript\">\n     *\n     *          //output: DIV, BODY\n     *          var filterNode = UE.dom.domUtils.findParent( document.getElementById( \"test\" ), function ( node ) {\n     *\n     *              console.log( node.tagName );\n     *              return false;\n     *\n     *          }, true );\n     *\n     *      </script>\n     * </body>\n     * ```\n     */\n    findParent:function (node, filterFn, includeSelf) {\n        if (node && !domUtils.isBody(node)) {\n            node = includeSelf ? node : node.parentNode;\n            while (node) {\n                if (!filterFn || filterFn(node) || domUtils.isBody(node)) {\n                    return filterFn && !filterFn(node) && domUtils.isBody(node) ? null : node;\n                }\n                node = node.parentNode;\n            }\n        }\n        return null;\n    },\n    /**\n     * 查找node的节点名为tagName的第一个祖先节点， 查找的起点是node节点的父节点。\n     * @method findParentByTagName\n     * @param { Node } node 需要查找的节点对象\n     * @param { Array } tagNames 需要查找的父节点的名称数组\n     * @warning 查找的终点是到body节点为止\n     * @return { Node | NULL } 如果找到符合条件的节点， 则返回该节点， 否则返回NULL\n     * @example\n     * ```javascript\n     * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName(\"div\")[0], [ \"BODY\" ] );\n     * //output: BODY\n     * console.log( node.tagName );\n     * ```\n     */\n\n    /**\n     * 查找node的节点名为tagName的祖先节点， 如果includeSelf的值为true，则查找的起点是给定的节点node，\n     * 否则， 起点是node的父节点。\n     * @method findParentByTagName\n     * @param { Node } node 需要查找的节点对象\n     * @param { Array } tagNames 需要查找的父节点的名称数组\n     * @param { Boolean } includeSelf 查找过程是否包含node节点自身\n     * @warning 查找的终点是到body节点为止\n     * @return { Node | NULL } 如果找到符合条件的节点， 则返回该节点， 否则返回NULL\n     * @example\n     * ```javascript\n     * var queryTarget = document.getElementsByTagName(\"div\")[0];\n     * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ \"DIV\" ], true );\n     * //output: true\n     * console.log( queryTarget === node );\n     * ```\n     */\n    findParentByTagName:function (node, tagNames, includeSelf, excludeFn) {\n        tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]);\n        return domUtils.findParent(node, function (node) {\n            return tagNames[node.tagName] && !(excludeFn && excludeFn(node));\n        }, includeSelf);\n    },\n    /**\n     * 查找节点node的祖先节点集合， 查找的起点是给定节点的父节点，结果集中不包含给定的节点。\n     * @method findParents\n     * @param { Node } node 需要查找的节点对象\n     * @return { Array } 给定节点的祖先节点数组\n     * @grammar UE.dom.domUtils.findParents(node)  => Array  //返回一个祖先节点数组集合，不包含自身\n     * @grammar UE.dom.domUtils.findParents(node,includeSelf)  => Array  //返回一个祖先节点数组集合，includeSelf指定是否包含自身\n     * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn)  => Array  //返回一个祖先节点数组集合，filterFn指定过滤条件，返回true的node将被选取\n     * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst)  => Array  //返回一个祖先节点数组集合，closerFirst为true的话，node的直接父亲节点是数组的第0个\n     */\n\n    /**\n     * 查找节点node的祖先节点集合， 如果includeSelf的值为true，\n     * 则返回的结果集中允许出现当前给定的节点， 否则， 该节点不会出现在其结果集中。\n     * @method findParents\n     * @param { Node } node 需要查找的节点对象\n     * @param { Boolean } includeSelf 查找的结果中是否允许包含当前查找的节点对象\n     * @return { Array } 给定节点的祖先节点数组\n     */\n    findParents:function (node, includeSelf, filterFn, closerFirst) {\n        var parents = includeSelf && ( filterFn && filterFn(node) || !filterFn ) ? [node] : [];\n        while (node = domUtils.findParent(node, filterFn)) {\n            parents.push(node);\n        }\n        return closerFirst ? parents : parents.reverse();\n    },\n\n    /**\n     * 在节点node后面插入新节点newNode\n     * @method insertAfter\n     * @param { Node } node 目标节点\n     * @param { Node } newNode 新插入的节点， 该节点将置于目标节点之后\n     * @return { Node } 新插入的节点\n     */\n    insertAfter:function (node, newNode) {\n        return node.nextSibling ? node.parentNode.insertBefore(newNode, node.nextSibling):\n            node.parentNode.appendChild(newNode);\n    },\n\n    /**\n     * 删除节点node及其下属的所有节点\n     * @method remove\n     * @param { Node } node 需要删除的节点对象\n     * @return { Node } 返回刚删除的节点对象\n     * @example\n     * ```html\n     * <div id=\"test\">\n     *     <div id=\"child\">你好</div>\n     * </div>\n     * <script>\n     *     UE.dom.domUtils.remove( document.body, false );\n     *     //output: false\n     *     console.log( document.getElementById( \"child\" ) !== null );\n     * </script>\n     * ```\n     */\n\n    /**\n     * 删除节点node，并根据keepChildren的值决定是否保留子节点\n     * @method remove\n     * @param { Node } node 需要删除的节点对象\n     * @param { Boolean } keepChildren 是否需要保留子节点\n     * @return { Node } 返回刚删除的节点对象\n     * @example\n     * ```html\n     * <div id=\"test\">\n     *     <div id=\"child\">你好</div>\n     * </div>\n     * <script>\n     *     UE.dom.domUtils.remove( document.body, true );\n     *     //output: true\n     *     console.log( document.getElementById( \"child\" ) !== null );\n     * </script>\n     * ```\n     */\n    remove:function (node, keepChildren) {\n        var parent = node.parentNode,\n            child;\n        if (parent) {\n            if (keepChildren && node.hasChildNodes()) {\n                while (child = node.firstChild) {\n                    parent.insertBefore(child, node);\n                }\n            }\n            parent.removeChild(node);\n        }\n        return node;\n    },\n\n    /**\n     * 取得node节点的下一个兄弟节点， 如果该节点其后没有兄弟节点， 则递归查找其父节点之后的第一个兄弟节点，\n     * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。\n     * @method getNextDomNode\n     * @param { Node } node 需要获取其后的兄弟节点的节点对象\n     * @return { Node | NULL } 如果找满足条件的节点， 则返回该节点， 否则返回NULL\n     * @example\n     * ```html\n     *     <body>\n     *      <div id=\"test\">\n     *          <span></span>\n     *      </div>\n     *      <i>xxx</i>\n     * </body>\n     * <script>\n     *\n     *     //output: i节点\n     *     console.log( UE.dom.domUtils.getNextDomNode( document.getElementById( \"test\" ) ) );\n     *\n     * </script>\n     * ```\n     * @example\n     * ```html\n     * <body>\n     *      <div>\n     *          <span></span>\n     *          <i id=\"test\">xxx</i>\n     *      </div>\n     *      <b>xxx</b>\n     * </body>\n     * <script>\n     *\n     *     //由于id为test的i节点之后没有兄弟节点， 则查找其父节点（div）后面的兄弟节点\n     *     //output: b节点\n     *     console.log( UE.dom.domUtils.getNextDomNode( document.getElementById( \"test\" ) ) );\n     *\n     * </script>\n     * ```\n     */\n\n    /**\n     * 取得node节点的下一个兄弟节点， 如果startFromChild的值为ture，则先获取其子节点，\n     * 如果有子节点则直接返回第一个子节点；如果没有子节点或者startFromChild的值为false，\n     * 则执行<a href=\"#UE.dom.domUtils.getNextDomNode(Node)\">getNextDomNode(Node node)</a>的查找过程。\n     * @method getNextDomNode\n     * @param { Node } node 需要获取其后的兄弟节点的节点对象\n     * @param { Boolean } startFromChild 查找过程是否从其子节点开始\n     * @return { Node | NULL } 如果找满足条件的节点， 则返回该节点， 否则返回NULL\n     * @see UE.dom.domUtils.getNextDomNode(Node)\n     */\n    getNextDomNode:function (node, startFromChild, filterFn, guard) {\n        return getDomNode(node, 'firstChild', 'nextSibling', startFromChild, filterFn, guard);\n    },\n    getPreDomNode:function (node, startFromChild, filterFn, guard) {\n        return getDomNode(node, 'lastChild', 'previousSibling', startFromChild, filterFn, guard);\n    },\n    /**\n     * 检测节点node是否属是UEditor定义的bookmark节点\n     * @method isBookmarkNode\n     * @private\n     * @param { Node } node 需要检测的节点对象\n     * @return { Boolean } 是否是bookmark节点\n     * @example\n     * ```html\n     * <span id=\"_baidu_bookmark_1\"></span>\n     * <script>\n     *      var bookmarkNode = document.getElementById(\"_baidu_bookmark_1\");\n     *      //output: true\n     *      console.log( UE.dom.domUtils.isBookmarkNode( bookmarkNode ) );\n     * </script>\n     * ```\n     */\n    isBookmarkNode:function (node) {\n        return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id);\n    },\n    /**\n     * 获取节点node所属的window对象\n     * @method  getWindow\n     * @param { Node } node 节点对象\n     * @return { Window } 当前节点所属的window对象\n     * @example\n     * ```javascript\n     * //output: true\n     * console.log( UE.dom.domUtils.getWindow( document.body ) === window );\n     * ```\n     */\n    getWindow:function (node) {\n        var doc = node.ownerDocument || node;\n        return doc.defaultView || doc.parentWindow;\n    },\n    /**\n     * 获取离nodeA与nodeB最近的公共的祖先节点\n     * @method  getCommonAncestor\n     * @param { Node } nodeA 第一个节点\n     * @param { Node } nodeB 第二个节点\n     * @remind 如果给定的两个节点是同一个节点， 将直接返回该节点。\n     * @return { Node | NULL } 如果未找到公共节点， 返回NULL， 否则返回最近的公共祖先节点。\n     * @example\n     * ```javascript\n     * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild );\n     * //output: true\n     * console.log( commonAncestor.tagName.toLowerCase() === 'body' );\n     * ```\n     */\n    getCommonAncestor:function (nodeA, nodeB) {\n        if (nodeA === nodeB)\n            return nodeA;\n        var parentsA = [nodeA] , parentsB = [nodeB], parent = nodeA, i = -1;\n        while (parent = parent.parentNode) {\n            if (parent === nodeB) {\n                return parent;\n            }\n            parentsA.push(parent);\n        }\n        parent = nodeB;\n        while (parent = parent.parentNode) {\n            if (parent === nodeA)\n                return parent;\n            parentsB.push(parent);\n        }\n        parentsA.reverse();\n        parentsB.reverse();\n        while (i++, parentsA[i] === parentsB[i]) {\n        }\n        return i == 0 ? null : parentsA[i - 1];\n\n    },\n    /**\n     * 清除node节点左右连续为空的兄弟inline节点\n     * @method clearEmptySibling\n     * @param { Node } node 执行的节点对象， 如果该节点的左右连续的兄弟节点是空的inline节点，\n     * 则这些兄弟节点将被删除\n     * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext)  //ignoreNext指定是否忽略右边空节点\n     * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre)  //ignorePre指定是否忽略左边空节点\n     * @example\n     * ```html\n     * <body>\n     *     <div></div>\n     *     <span id=\"test\"></span>\n     *     <i></i>\n     *     <b></b>\n     *     <em>xxx</em>\n     *     <span></span>\n     * </body>\n     * <script>\n     *\n     *      UE.dom.domUtils.clearEmptySibling( document.getElementById( \"test\" ) );\n     *\n     *      //output: <div></div><span id=\"test\"></span><em>xxx</em><span></span>\n     *      console.log( document.body.innerHTML );\n     *\n     * </script>\n     * ```\n     */\n\n    /**\n     * 清除node节点左右连续为空的兄弟inline节点， 如果ignoreNext的值为true，\n     * 则忽略对右边兄弟节点的操作。\n     * @method clearEmptySibling\n     * @param { Node } node 执行的节点对象， 如果该节点的左右连续的兄弟节点是空的inline节点，\n     * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作\n     * 则这些兄弟节点将被删除\n     * @see UE.dom.domUtils.clearEmptySibling(Node)\n     */\n\n    /**\n     * 清除node节点左右连续为空的兄弟inline节点， 如果ignoreNext的值为true，\n     * 则忽略对右边兄弟节点的操作， 如果ignorePre的值为true，则忽略对左边兄弟节点的操作。\n     * @method clearEmptySibling\n     * @param { Node } node 执行的节点对象， 如果该节点的左右连续的兄弟节点是空的inline节点，\n     * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作\n     * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作\n     * 则这些兄弟节点将被删除\n     * @see UE.dom.domUtils.clearEmptySibling(Node)\n     */\n    clearEmptySibling:function (node, ignoreNext, ignorePre) {\n        function clear(next, dir) {\n            var tmpNode;\n            while (next && !domUtils.isBookmarkNode(next) && (domUtils.isEmptyInlineElement(next)\n                //这里不能把空格算进来会吧空格干掉，出现文字间的空格丢掉了\n                || !new RegExp('[^\\t\\n\\r' + domUtils.fillChar + ']').test(next.nodeValue) )) {\n                tmpNode = next[dir];\n                domUtils.remove(next);\n                next = tmpNode;\n            }\n        }\n        !ignoreNext && clear(node.nextSibling, 'nextSibling');\n        !ignorePre && clear(node.previousSibling, 'previousSibling');\n    },\n    /**\n     * 将一个文本节点textNode拆分成两个文本节点，offset指定拆分位置\n     * @method split\n     * @param { Node } textNode 需要拆分的文本节点对象\n     * @param { int } offset 需要拆分的位置， 位置计算从0开始\n     * @return { Node } 拆分后形成的新节点\n     * @example\n     * ```html\n     * <div id=\"test\">abcdef</div>\n     * <script>\n     *      var newNode = UE.dom.domUtils.split( document.getElementById( \"test\" ).firstChild, 3 );\n     *      //output: def\n     *      console.log( newNode.nodeValue );\n     * </script>\n     * ```\n     */\n    split:function (node, offset) {\n        var doc = node.ownerDocument;\n        if (browser.ie && offset == node.nodeValue.length) {\n            var next = doc.createTextNode('');\n            return domUtils.insertAfter(node, next);\n        }\n        var retval = node.splitText(offset);\n        //ie8下splitText不会跟新childNodes,我们手动触发他的更新\n        if (browser.ie8) {\n            var tmpNode = doc.createTextNode('');\n            domUtils.insertAfter(retval, tmpNode);\n            domUtils.remove(tmpNode);\n        }\n        return retval;\n    },\n\n    /**\n     * 检测文本节点textNode是否为空节点（包括空格、换行、占位符等字符）\n     * @method  isWhitespace\n     * @param { Node } node 需要检测的节点对象\n     * @return { Boolean } 检测的节点是否为空\n     * @example\n     * ```html\n     * <div id=\"test\">\n     *\n     * </div>\n     * <script>\n     *      //output: true\n     *      console.log( UE.dom.domUtils.isWhitespace( document.getElementById(\"test\").firstChild ) );\n     * </script>\n     * ```\n     */\n    isWhitespace:function (node) {\n        return !new RegExp('[^ \\t\\n\\r' + domUtils.fillChar + ']').test(node.nodeValue);\n    },\n    /**\n     * 获取元素element相对于viewport的位置坐标\n     * @method getXY\n     * @param { Node } element 需要计算位置的节点对象\n     * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象， 其中键x代表水平偏移距离，\n     *                          y代表垂直偏移距离。\n     *\n     * @example\n     * ```javascript\n     * var location = UE.dom.domUtils.getXY( document.getElementById(\"test\") );\n     * //output: test的坐标为: 12, 24\n     * console.log( 'test的坐标为： ', location.x, ',', location.y );\n     * ```\n     */\n    getXY:function (element) {\n        var x = 0, y = 0;\n        while (element.offsetParent) {\n            y += element.offsetTop;\n            x += element.offsetLeft;\n            element = element.offsetParent;\n        }\n        return { 'x':x, 'y':y};\n    },\n    /**\n     * 为元素element绑定原生DOM事件，type为事件类型，handler为处理函数\n     * @method on\n     * @param { Node } element 需要绑定事件的节点对象\n     * @param { String } type 绑定的事件类型\n     * @param { Function } handler 事件处理器\n     * @example\n     * ```javascript\n     * UE.dom.domUtils.on(document.body,\"click\",function(e){\n     *     //e为事件对象，this为被点击元素对戏那个\n     * });\n     * ```\n     */\n\n    /**\n     * 为元素element绑定原生DOM事件，type为事件类型，handler为处理函数\n     * @method on\n     * @param { Node } element 需要绑定事件的节点对象\n     * @param { Array } type 绑定的事件类型数组\n     * @param { Function } handler 事件处理器\n     * @example\n     * ```javascript\n     * UE.dom.domUtils.on(document.body,[\"click\",\"mousedown\"],function(evt){\n     *     //evt为事件对象，this为被点击元素对象\n     * });\n     * ```\n     */\n    on:function (element, type, handler) {\n\n        var types = utils.isArray(type) ? type : utils.trim(type).split(/\\s+/),\n            k = types.length;\n        if (k) while (k--) {\n            type = types[k];\n            if (element.addEventListener) {\n                element.addEventListener(type, handler, false);\n            } else {\n                if (!handler._d) {\n                    handler._d = {\n                        els : []\n                    };\n                }\n                var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element);\n                if (!handler._d[key] || index == -1) {\n                    if(index == -1){\n                        handler._d.els.push(element);\n                    }\n                    if(!handler._d[key]){\n                        handler._d[key] = function (evt) {\n                            return handler.call(evt.srcElement, evt || window.event);\n                        };\n                    }\n\n\n                    element.attachEvent('on' + type, handler._d[key]);\n                }\n            }\n        }\n        element = null;\n    },\n    /**\n     * 解除DOM事件绑定\n     * @method un\n     * @param { Node } element 需要解除事件绑定的节点对象\n     * @param { String } type 需要接触绑定的事件类型\n     * @param { Function } handler 对应的事件处理器\n     * @example\n     * ```javascript\n     * UE.dom.domUtils.un(document.body,\"click\",function(evt){\n     *     //evt为事件对象，this为被点击元素对象\n     * });\n     * ```\n     */\n\n    /**\n     * 解除DOM事件绑定\n     * @method un\n     * @param { Node } element 需要解除事件绑定的节点对象\n     * @param { Array } type 需要接触绑定的事件类型数组\n     * @param { Function } handler 对应的事件处理器\n     * @example\n     * ```javascript\n     * UE.dom.domUtils.un(document.body, [\"click\",\"mousedown\"],function(evt){\n     *     //evt为事件对象，this为被点击元素对象\n     * });\n     * ```\n     */\n    un:function (element, type, handler) {\n        var types = utils.isArray(type) ? type : utils.trim(type).split(/\\s+/),\n            k = types.length;\n        if (k) while (k--) {\n            type = types[k];\n            if (element.removeEventListener) {\n                element.removeEventListener(type, handler, false);\n            } else {\n                var key = type + handler.toString();\n                try{\n                    element.detachEvent('on' + type, handler._d ? handler._d[key] : handler);\n                }catch(e){}\n                if (handler._d && handler._d[key]) {\n                    var index = utils.indexOf(handler._d.els,element);\n                    if(index!=-1){\n                        handler._d.els.splice(index,1);\n                    }\n                    handler._d.els.length == 0 && delete handler._d[key];\n                }\n            }\n        }\n    },\n\n    /**\n     * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值\n     * @method  isSameElement\n     * @param { Node } nodeA 需要比较的节点\n     * @param { Node } nodeB 需要比较的节点\n     * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值\n     * @example\n     * ```html\n     * <span style=\"font-size:12px\">ssss</span>\n     * <span style=\"font-size:12px\">bbbbb</span>\n     * <span style=\"font-size:13px\">ssss</span>\n     * <span style=\"font-size:14px\">bbbbb</span>\n     *\n     * <script>\n     *\n     *     var nodes = document.getElementsByTagName( \"span\" );\n     *\n     *     //output: true\n     *     console.log( UE.dom.domUtils.isSameElement( nodes[0], nodes[1] ) );\n     *\n     *     //output: false\n     *     console.log( UE.dom.domUtils.isSameElement( nodes[2], nodes[3] ) );\n     *\n     * </script>\n     * ```\n     */\n    isSameElement:function (nodeA, nodeB) {\n        if (nodeA.tagName != nodeB.tagName) {\n            return false;\n        }\n        var thisAttrs = nodeA.attributes,\n            otherAttrs = nodeB.attributes;\n        if (!ie && thisAttrs.length != otherAttrs.length) {\n            return false;\n        }\n        var attrA, attrB, al = 0, bl = 0;\n        for (var i = 0; attrA = thisAttrs[i++];) {\n            if (attrA.nodeName == 'style') {\n                if (attrA.specified) {\n                    al++;\n                }\n                if (domUtils.isSameStyle(nodeA, nodeB)) {\n                    continue;\n                } else {\n                    return false;\n                }\n            }\n            if (ie) {\n                if (attrA.specified) {\n                    al++;\n                    attrB = otherAttrs.getNamedItem(attrA.nodeName);\n                } else {\n                    continue;\n                }\n            } else {\n                attrB = nodeB.attributes[attrA.nodeName];\n            }\n            if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) {\n                return false;\n            }\n        }\n        // 有可能attrB的属性包含了attrA的属性之外还有自己的属性\n        if (ie) {\n            for (i = 0; attrB = otherAttrs[i++];) {\n                if (attrB.specified) {\n                    bl++;\n                }\n            }\n            if (al != bl) {\n                return false;\n            }\n        }\n        return true;\n    },\n\n    /**\n     * 判断节点nodeA与节点nodeB的元素的style属性是否一致\n     * @method isSameStyle\n     * @param { Node } nodeA 需要比较的节点\n     * @param { Node } nodeB 需要比较的节点\n     * @return { Boolean } 两个节点是否具有相同的style属性值\n     * @example\n     * ```html\n     * <span style=\"font-size:12px\">ssss</span>\n     * <span style=\"font-size:12px\">bbbbb</span>\n     * <span style=\"font-size:13px\">ssss</span>\n     * <span style=\"font-size:14px\">bbbbb</span>\n     *\n     * <script>\n     *\n     *     var nodes = document.getElementsByTagName( \"span\" );\n     *\n     *     //output: true\n     *     console.log( UE.dom.domUtils.isSameStyle( nodes[0], nodes[1] ) );\n     *\n     *     //output: false\n     *     console.log( UE.dom.domUtils.isSameStyle( nodes[2], nodes[3] ) );\n     *\n     * </script>\n     * ```\n     */\n    isSameStyle:function (nodeA, nodeB) {\n        var styleA = nodeA.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'),\n            styleB = nodeB.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':');\n        if (browser.opera) {\n            styleA = nodeA.style;\n            styleB = nodeB.style;\n            if (styleA.length != styleB.length)\n                return false;\n            for (var p in styleA) {\n                if (/^(\\d+|csstext)$/i.test(p)) {\n                    continue;\n                }\n                if (styleA[p] != styleB[p]) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        if (!styleA || !styleB) {\n            return styleA == styleB;\n        }\n        styleA = styleA.split(';');\n        styleB = styleB.split(';');\n        if (styleA.length != styleB.length) {\n            return false;\n        }\n        for (var i = 0, ci; ci = styleA[i++];) {\n            if (utils.indexOf(styleB, ci) == -1) {\n                return false;\n            }\n        }\n        return true;\n    },\n    /**\n     * 检查节点node是否为block元素\n     * @method isBlockElm\n     * @param { Node } node 需要检测的节点对象\n     * @return { Boolean } 是否是block元素节点\n     * @warning 该方法的判断规则如下： 如果该元素原本是block元素， 则不论该元素当前的css样式是什么都会返回true；\n     *          否则，检测该元素的css样式， 如果该元素当前是block元素， 则返回true。 其余情况下都返回false。\n     * @example\n     * ```html\n     * <span id=\"test1\" style=\"display: block\"></span>\n     * <span id=\"test2\"></span>\n     * <div id=\"test3\" style=\"display: inline\"></div>\n     *\n     * <script>\n     *\n     *     //output: true\n     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById(\"test1\") ) );\n     *\n     *     //output: false\n     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById(\"test2\") ) );\n     *\n     *     //output: true\n     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById(\"test3\") ) );\n     *\n     * </script>\n     * ```\n     */\n    isBlockElm:function (node) {\n        return node.nodeType == 1 && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, 'display')]) && !dtd.$nonChild[node.tagName];\n    },\n    /**\n     * 检测node节点是否为body节点\n     * @method isBody\n     * @param { Element } node 需要检测的dom元素\n     * @return { Boolean } 给定的元素是否是body元素\n     * @example\n     * ```javascript\n     * //output: true\n     * console.log( UE.dom.domUtils.isBody( document.body ) );\n     * ```\n     */\n    isBody:function (node) {\n        return  node && node.nodeType == 1 && node.tagName.toLowerCase() == 'body';\n    },\n    /**\n     * 以node节点为分界，将该节点的指定祖先节点parent拆分成两个独立的节点，\n     * 拆分形成的两个节点之间是node节点\n     * @method breakParent\n     * @param { Node } node 作为分界的节点对象\n     * @param { Node } parent 该节点必须是node节点的祖先节点， 且是block节点。\n     * @return { Node } 给定的node分界节点\n     * @example\n     * ```javascript\n     *\n     *      var node = document.createElement(\"span\"),\n     *          wrapNode = document.createElement( \"div\" ),\n     *          parent = document.createElement(\"p\");\n     *\n     *      parent.appendChild( node );\n     *      wrapNode.appendChild( parent );\n     *\n     *      //拆分前\n     *      //output: <p><span></span></p>\n     *      console.log( wrapNode.innerHTML );\n     *\n     *\n     *      UE.dom.domUtils.breakParent( node, parent );\n     *      //拆分后\n     *      //output: <p></p><span></span><p></p>\n     *      console.log( wrapNode.innerHTML );\n     *\n     * ```\n     */\n    breakParent:function (node, parent) {\n        var tmpNode,\n            parentClone = node,\n            clone = node,\n            leftNodes,\n            rightNodes;\n        do {\n            parentClone = parentClone.parentNode;\n            if (leftNodes) {\n                tmpNode = parentClone.cloneNode(false);\n                tmpNode.appendChild(leftNodes);\n                leftNodes = tmpNode;\n                tmpNode = parentClone.cloneNode(false);\n                tmpNode.appendChild(rightNodes);\n                rightNodes = tmpNode;\n            } else {\n                leftNodes = parentClone.cloneNode(false);\n                rightNodes = leftNodes.cloneNode(false);\n            }\n            while (tmpNode = clone.previousSibling) {\n                leftNodes.insertBefore(tmpNode, leftNodes.firstChild);\n            }\n            while (tmpNode = clone.nextSibling) {\n                rightNodes.appendChild(tmpNode);\n            }\n            clone = parentClone;\n        } while (parent !== parentClone);\n        tmpNode = parent.parentNode;\n        tmpNode.insertBefore(leftNodes, parent);\n        tmpNode.insertBefore(rightNodes, parent);\n        tmpNode.insertBefore(node, rightNodes);\n        domUtils.remove(parent);\n        return node;\n    },\n    /**\n     * 检查节点node是否是空inline节点\n     * @method  isEmptyInlineElement\n     * @param { Node } node 需要检测的节点对象\n     * @return { Number }  如果给定的节点是空的inline节点， 则返回1, 否则返回0。\n     * @example\n     * ```html\n     * <b><i></i></b> => 1\n     * <b><i></i><u></u></b> => 1\n     * <b></b> => 1\n     * <b>xx<i></i></b> => 0\n     * ```\n     */\n    isEmptyInlineElement:function (node) {\n        if (node.nodeType != 1 || !dtd.$removeEmpty[ node.tagName ]) {\n            return 0;\n        }\n        node = node.firstChild;\n        while (node) {\n            //如果是创建的bookmark就跳过\n            if (domUtils.isBookmarkNode(node)) {\n                return 0;\n            }\n            if (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node) ||\n                node.nodeType == 3 && !domUtils.isWhitespace(node)\n                ) {\n                return 0;\n            }\n            node = node.nextSibling;\n        }\n        return 1;\n\n    },\n\n    /**\n     * 删除node节点下首尾两端的空白文本子节点\n     * @method trimWhiteTextNode\n     * @param { Element } node 需要执行删除操作的元素对象\n     * @example\n     * ```javascript\n     *      var node = document.createElement(\"div\");\n     *\n     *      node.appendChild( document.createTextNode( \"\" ) );\n     *\n     *      node.appendChild( document.createElement(\"div\") );\n     *\n     *      node.appendChild( document.createTextNode( \"\" ) );\n     *\n     *      //3\n     *      console.log( node.childNodes.length );\n     *\n     *      UE.dom.domUtils.trimWhiteTextNode( node );\n     *\n     *      //1\n     *      console.log( node.childNodes.length );\n     * ```\n     */\n    trimWhiteTextNode:function (node) {\n        function remove(dir) {\n            var child;\n            while ((child = node[dir]) && child.nodeType == 3 && domUtils.isWhitespace(child)) {\n                node.removeChild(child);\n            }\n        }\n        remove('firstChild');\n        remove('lastChild');\n    },\n\n    /**\n     * 合并node节点下相同的子节点\n     * @name mergeChild\n     * @desc\n     * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签\n     * @example\n     * <p><span style=\"font-size:12px;\">xx<span style=\"font-size:12px;\">aa</span>xx</span></p>\n     * ==> UE.dom.domUtils.mergeChild(node,'span')\n     * <p><span style=\"font-size:12px;\">xxaaxx</span></p>\n     */\n    mergeChild:function (node, tagName, attrs) {\n        var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase());\n        for (var i = 0, ci; ci = list[i++];) {\n            if (!ci.parentNode || domUtils.isBookmarkNode(ci)) {\n                continue;\n            }\n            //span单独处理\n            if (ci.tagName.toLowerCase() == 'span') {\n                if (node === ci.parentNode) {\n                    domUtils.trimWhiteTextNode(node);\n                    if (node.childNodes.length == 1) {\n                        node.style.cssText = ci.style.cssText + \";\" + node.style.cssText;\n                        domUtils.remove(ci, true);\n                        continue;\n                    }\n                }\n                ci.style.cssText = node.style.cssText + ';' + ci.style.cssText;\n                if (attrs) {\n                    var style = attrs.style;\n                    if (style) {\n                        style = style.split(';');\n                        for (var j = 0, s; s = style[j++];) {\n                            ci.style[utils.cssStyleToDomStyle(s.split(':')[0])] = s.split(':')[1];\n                        }\n                    }\n                }\n                if (domUtils.isSameStyle(ci, node)) {\n                    domUtils.remove(ci, true);\n                }\n                continue;\n            }\n            if (domUtils.isSameElement(node, ci)) {\n                domUtils.remove(ci, true);\n            }\n        }\n    },\n\n    /**\n     * 原生方法getElementsByTagName的封装\n     * @method getElementsByTagName\n     * @param { Node } node 目标节点对象\n     * @param { String } tagName 需要查找的节点的tagName， 多个tagName以空格分割\n     * @return { Array } 符合条件的节点集合\n     */\n    getElementsByTagName:function (node, name,filter) {\n        if(filter && utils.isString(filter)){\n           var className = filter;\n           filter =  function(node){return domUtils.hasClass(node,className)}\n        }\n        name = utils.trim(name).replace(/[ ]{2,}/g,' ').split(' ');\n        var arr = [];\n        for(var n = 0,ni;ni=name[n++];){\n            var list = node.getElementsByTagName(ni);\n            for (var i = 0, ci; ci = list[i++];) {\n                if(!filter || filter(ci))\n                    arr.push(ci);\n            }\n        }\n\n        return arr;\n    },\n    /**\n     * 将节点node提取到父节点上\n     * @method mergeToParent\n     * @param { Element } node 需要提取的元素对象\n     * @example\n     * ```html\n     * <div id=\"parent\">\n     *     <div id=\"sub\">\n     *         <span id=\"child\"></span>\n     *     </div>\n     * </div>\n     *\n     * <script>\n     *\n     *     var child = document.getElementById( \"child\" );\n     *\n     *     //output: sub\n     *     console.log( child.parentNode.id );\n     *\n     *     UE.dom.domUtils.mergeToParent( child );\n     *\n     *     //output: parent\n     *     console.log( child.parentNode.id );\n     *\n     * </script>\n     * ```\n     */\n    mergeToParent:function (node) {\n        var parent = node.parentNode;\n        while (parent && dtd.$removeEmpty[parent.tagName]) {\n            if (parent.tagName == node.tagName || parent.tagName == 'A') {//针对a标签单独处理\n                domUtils.trimWhiteTextNode(parent);\n                //span需要特殊处理  不处理这样的情况 <span stlye=\"color:#fff\">xxx<span style=\"color:#ccc\">xxx</span>xxx</span>\n                if (parent.tagName == 'SPAN' && !domUtils.isSameStyle(parent, node)\n                    || (parent.tagName == 'A' && node.tagName == 'SPAN')) {\n                    if (parent.childNodes.length > 1 || parent !== node.parentNode) {\n                        node.style.cssText = parent.style.cssText + \";\" + node.style.cssText;\n                        parent = parent.parentNode;\n                        continue;\n                    } else {\n                        parent.style.cssText += \";\" + node.style.cssText;\n                        //trace:952 a标签要保持下划线\n                        if (parent.tagName == 'A') {\n                            parent.style.textDecoration = 'underline';\n                        }\n                    }\n                }\n                if (parent.tagName != 'A') {\n                    parent === node.parentNode && domUtils.remove(node, true);\n                    break;\n                }\n            }\n            parent = parent.parentNode;\n        }\n    },\n    /**\n     * 合并节点node的左右兄弟节点\n     * @method mergeSibling\n     * @param { Element } node 需要合并的目标节点\n     * @example\n     * ```html\n     * <b>xxxx</b><b id=\"test\">ooo</b><b>xxxx</b>\n     *\n     * <script>\n     *     var demoNode = document.getElementById(\"test\");\n     *     UE.dom.domUtils.mergeSibling( demoNode );\n     *     //output: xxxxoooxxxx\n     *     console.log( demoNode.innerHTML );\n     * </script>\n     * ```\n     */\n\n    /**\n     * 合并节点node的左右兄弟节点， 可以根据给定的条件选择是否忽略合并左节点。\n     * @method mergeSibling\n     * @param { Element } node 需要合并的目标节点\n     * @param { Boolean } ignorePre 是否忽略合并左节点\n     * @example\n     * ```html\n     * <b>xxxx</b><b id=\"test\">ooo</b><b>xxxx</b>\n     *\n     * <script>\n     *     var demoNode = document.getElementById(\"test\");\n     *     UE.dom.domUtils.mergeSibling( demoNode, true );\n     *     //output: oooxxxx\n     *     console.log( demoNode.innerHTML );\n     * </script>\n     * ```\n     */\n\n    /**\n     * 合并节点node的左右兄弟节点，可以根据给定的条件选择是否忽略合并左右节点。\n     * @method mergeSibling\n     * @param { Element } node 需要合并的目标节点\n     * @param { Boolean } ignorePre 是否忽略合并左节点\n     * @param { Boolean } ignoreNext 是否忽略合并右节点\n     * @remind 如果同时忽略左右节点， 则该操作什么也不会做\n     * @example\n     * ```html\n     * <b>xxxx</b><b id=\"test\">ooo</b><b>xxxx</b>\n     *\n     * <script>\n     *     var demoNode = document.getElementById(\"test\");\n     *     UE.dom.domUtils.mergeSibling( demoNode, false, true );\n     *     //output: xxxxooo\n     *     console.log( demoNode.innerHTML );\n     * </script>\n     * ```\n     */\n    mergeSibling:function (node, ignorePre, ignoreNext) {\n        function merge(rtl, start, node) {\n            var next;\n            if ((next = node[rtl]) && !domUtils.isBookmarkNode(next) && next.nodeType == 1 && domUtils.isSameElement(node, next)) {\n                while (next.firstChild) {\n                    if (start == 'firstChild') {\n                        node.insertBefore(next.lastChild, node.firstChild);\n                    } else {\n                        node.appendChild(next.firstChild);\n                    }\n                }\n                domUtils.remove(next);\n            }\n        }\n        !ignorePre && merge('previousSibling', 'firstChild', node);\n        !ignoreNext && merge('nextSibling', 'lastChild', node);\n    },\n\n    /**\n     * 设置节点node及其子节点不会被选中\n     * @method unSelectable\n     * @param { Element } node 需要执行操作的dom元素\n     * @remind 执行该操作后的节点， 将不能被鼠标选中\n     * @example\n     * ```javascript\n     * UE.dom.domUtils.unSelectable( document.body );\n     * ```\n     */\n    unSelectable:ie && browser.ie9below || browser.opera ? function (node) {\n        //for ie9\n        node.onselectstart = function () {\n            return false;\n        };\n        node.onclick = node.onkeyup = node.onkeydown = function () {\n            return false;\n        };\n        node.unselectable = 'on';\n        node.setAttribute(\"unselectable\", \"on\");\n        for (var i = 0, ci; ci = node.all[i++];) {\n            switch (ci.tagName.toLowerCase()) {\n                case 'iframe' :\n                case 'textarea' :\n                case 'input' :\n                case 'select' :\n                    break;\n                default :\n                    ci.unselectable = 'on';\n                    node.setAttribute(\"unselectable\", \"on\");\n            }\n        }\n    } : function (node) {\n        node.style.MozUserSelect =\n            node.style.webkitUserSelect =\n                node.style.msUserSelect =\n                    node.style.KhtmlUserSelect = 'none';\n    },\n    /**\n     * 删除节点node上的指定属性名称的属性\n     * @method  removeAttributes\n     * @param { Node } node 需要删除属性的节点对象\n     * @param { String } attrNames 可以是空格隔开的多个属性名称，该操作将会依次删除相应的属性\n     * @example\n     * ```html\n     * <div id=\"wrap\">\n     *      <span style=\"font-size:14px;\" id=\"test\" name=\"followMe\">xxxxx</span>\n     * </div>\n     *\n     * <script>\n     *\n     *     UE.dom.domUtils.removeAttributes( document.getElementById( \"test\" ), \"id name\" );\n     *\n     *     //output: <span style=\"font-size:14px;\">xxxxx</span>\n     *     console.log( document.getElementById(\"wrap\").innerHTML );\n     *\n     * </script>\n     * ```\n     */\n\n    /**\n     * 删除节点node上的指定属性名称的属性\n     * @method  removeAttributes\n     * @param { Node } node 需要删除属性的节点对象\n     * @param { Array } attrNames 需要删除的属性名数组\n     * @example\n     * ```html\n     * <div id=\"wrap\">\n     *      <span style=\"font-size:14px;\" id=\"test\" name=\"followMe\">xxxxx</span>\n     * </div>\n     *\n     * <script>\n     *\n     *     UE.dom.domUtils.removeAttributes( document.getElementById( \"test\" ), [\"id\", \"name\"] );\n     *\n     *     //output: <span style=\"font-size:14px;\">xxxxx</span>\n     *     console.log( document.getElementById(\"wrap\").innerHTML );\n     *\n     * </script>\n     * ```\n     */\n    removeAttributes:function (node, attrNames) {\n        attrNames = utils.isArray(attrNames) ? attrNames : utils.trim(attrNames).replace(/[ ]{2,}/g,' ').split(' ');\n        for (var i = 0, ci; ci = attrNames[i++];) {\n            ci = attrFix[ci] || ci;\n            switch (ci) {\n                case 'className':\n                    node[ci] = '';\n                    break;\n                case 'style':\n                    node.style.cssText = '';\n                    var val = node.getAttributeNode('style');\n                    !browser.ie && val && node.removeAttributeNode(val);\n            }\n            node.removeAttribute(ci);\n        }\n    },\n    /**\n     * 在doc下创建一个标签名为tag，属性为attrs的元素\n     * @method createElement\n     * @param { DomDocument } doc 新创建的元素属于该document节点创建\n     * @param { String } tagName 需要创建的元素的标签名\n     * @param { Object } attrs 新创建的元素的属性key-value集合\n     * @return { Element } 新创建的元素对象\n     * @example\n     * ```javascript\n     * var ele = UE.dom.domUtils.createElement( document, 'div', {\n     *     id: 'test'\n     * } );\n     *\n     * //output: DIV\n     * console.log( ele.tagName );\n     *\n     * //output: test\n     * console.log( ele.id );\n     *\n     * ```\n     */\n    createElement:function (doc, tag, attrs) {\n        return domUtils.setAttributes(doc.createElement(tag), attrs)\n    },\n    /**\n     * 为节点node添加属性attrs，attrs为属性键值对\n     * @method setAttributes\n     * @param { Element } node 需要设置属性的元素对象\n     * @param { Object } attrs 需要设置的属性名-值对\n     * @return { Element } 设置属性的元素对象\n     * @example\n     * ```html\n     * <span id=\"test\"></span>\n     *\n     * <script>\n     *\n     *     var testNode = UE.dom.domUtils.setAttributes( document.getElementById( \"test\" ), {\n     *         id: 'demo'\n     *     } );\n     *\n     *     //output: demo\n     *     console.log( testNode.id );\n     *\n     * </script>\n     *\n     */\n    setAttributes:function (node, attrs) {\n        for (var attr in attrs) {\n            if(attrs.hasOwnProperty(attr)){\n                var value = attrs[attr];\n                switch (attr) {\n                    case 'class':\n                        //ie下要这样赋值，setAttribute不起作用\n                        node.className = value;\n                        break;\n                    case 'style' :\n                        node.style.cssText = node.style.cssText + \";\" + value;\n                        break;\n                    case 'innerHTML':\n                        node[attr] = value;\n                        break;\n                    case 'value':\n                        node.value = value;\n                        break;\n                    default:\n                        node.setAttribute(attrFix[attr] || attr, value);\n                }\n            }\n        }\n        return node;\n    },\n\n    /**\n     * 获取元素element经过计算后的样式值\n     * @method getComputedStyle\n     * @param { Element } element 需要获取样式的元素对象\n     * @param { String } styleName 需要获取的样式名\n     * @return { String } 获取到的样式值\n     * @example\n     * ```html\n     * <style type=\"text/css\">\n     *      #test {\n     *          font-size: 15px;\n     *      }\n     * </style>\n     *\n     * <span id=\"test\"></span>\n     *\n     * <script>\n     *     //output: 15px\n     *     console.log( UE.dom.domUtils.getComputedStyle( document.getElementById( \"test\" ), 'font-size' ) );\n     * </script>\n     * ```\n     */\n    getComputedStyle:function (element, styleName) {\n        //一下的属性单独处理\n        var pros = 'width height top left';\n\n        if(pros.indexOf(styleName) > -1){\n            return element['offset' + styleName.replace(/^\\w/,function(s){return s.toUpperCase()})] + 'px';\n        }\n        //忽略文本节点\n        if (element.nodeType == 3) {\n            element = element.parentNode;\n        }\n        //ie下font-size若body下定义了font-size，则从currentStyle里会取到这个font-size. 取不到实际值，故此修改.\n        if (browser.ie && browser.version < 9 && styleName == 'font-size' && !element.style.fontSize &&\n            !dtd.$empty[element.tagName] && !dtd.$nonChild[element.tagName]) {\n            var span = element.ownerDocument.createElement('span');\n            span.style.cssText = 'padding:0;border:0;font-family:simsun;';\n            span.innerHTML = '.';\n            element.appendChild(span);\n            var result = span.offsetHeight;\n            element.removeChild(span);\n            span = null;\n            return result + 'px';\n        }\n        try {\n            var value = domUtils.getStyle(element, styleName) ||\n                (window.getComputedStyle ? domUtils.getWindow(element).getComputedStyle(element, '').getPropertyValue(styleName) :\n                    ( element.currentStyle || element.style )[utils.cssStyleToDomStyle(styleName)]);\n\n        } catch (e) {\n            return \"\";\n        }\n        return utils.transUnitToPx(utils.fixColor(styleName, value));\n    },\n    /**\n     * 删除元素element指定的className\n     * @method removeClasses\n     * @param { Element } ele 需要删除class的元素节点\n     * @param { String } classNames 需要删除的className， 多个className之间以空格分开\n     * @example\n     * ```html\n     * <span id=\"test\" class=\"test1 test2 test3\">xxx</span>\n     *\n     * <script>\n     *\n     *     var testNode = document.getElementById( \"test\" );\n     *     UE.dom.domUtils.removeClasses( testNode, \"test1 test2\" );\n     *\n     *     //output: test3\n     *     console.log( testNode.className );\n     *\n     * </script>\n     * ```\n     */\n\n    /**\n     * 删除元素element指定的className\n     * @method removeClasses\n     * @param { Element } ele 需要删除class的元素节点\n     * @param { Array } classNames 需要删除的className数组\n     * @example\n     * ```html\n     * <span id=\"test\" class=\"test1 test2 test3\">xxx</span>\n     *\n     * <script>\n     *\n     *     var testNode = document.getElementById( \"test\" );\n     *     UE.dom.domUtils.removeClasses( testNode, [\"test1\", \"test2\"] );\n     *\n     *     //output: test3\n     *     console.log( testNode.className );\n     *\n     * </script>\n     * ```\n     */\n    removeClasses:function (elm, classNames) {\n        classNames = utils.isArray(classNames) ? classNames :\n            utils.trim(classNames).replace(/[ ]{2,}/g,' ').split(' ');\n        for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){\n            cls = cls.replace(new RegExp('\\\\b' + ci + '\\\\b'),'')\n        }\n        cls = utils.trim(cls).replace(/[ ]{2,}/g,' ');\n        if(cls){\n            elm.className = cls;\n        }else{\n            domUtils.removeAttributes(elm,['class']);\n        }\n    },\n    /**\n     * 给元素element添加className\n     * @method addClass\n     * @param { Node } ele 需要增加className的元素\n     * @param { String } classNames 需要添加的className， 多个className之间以空格分割\n     * @remind 相同的类名不会被重复添加\n     * @example\n     * ```html\n     * <span id=\"test\" class=\"cls1 cls2\"></span>\n     *\n     * <script>\n     *     var testNode = document.getElementById(\"test\");\n     *\n     *     UE.dom.domUtils.addClass( testNode, \"cls2 cls3 cls4\" );\n     *\n     *     //output: cl1 cls2 cls3 cls4\n     *     console.log( testNode.className );\n     *\n     * <script>\n     * ```\n     */\n\n    /**\n     * 给元素element添加className\n     * @method addClass\n     * @param { Node } ele 需要增加className的元素\n     * @param { Array } classNames 需要添加的className的数组\n     * @remind 相同的类名不会被重复添加\n     * @example\n     * ```html\n     * <span id=\"test\" class=\"cls1 cls2\"></span>\n     *\n     * <script>\n     *     var testNode = document.getElementById(\"test\");\n     *\n     *     UE.dom.domUtils.addClass( testNode, [\"cls2\", \"cls3\", \"cls4\"] );\n     *\n     *     //output: cl1 cls2 cls3 cls4\n     *     console.log( testNode.className );\n     *\n     * <script>\n     * ```\n     */\n    addClass:function (elm, classNames) {\n        if(!elm)return;\n        classNames = utils.trim(classNames).replace(/[ ]{2,}/g,' ').split(' ');\n        for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){\n            if(!new RegExp('\\\\b' + ci + '\\\\b').test(cls)){\n                cls += ' ' + ci;\n            }\n        }\n        elm.className = utils.trim(cls);\n    },\n    /**\n     * 判断元素element是否包含给定的样式类名className\n     * @method hasClass\n     * @param { Node } ele 需要检测的元素\n     * @param { String } classNames 需要检测的className， 多个className之间用空格分割\n     * @return { Boolean } 元素是否包含所有给定的className\n     * @example\n     * ```html\n     * <span id=\"test1\" class=\"cls1 cls2\"></span>\n     *\n     * <script>\n     *     var test1 = document.getElementById(\"test1\");\n     *\n     *     //output: false\n     *     console.log( UE.dom.domUtils.hasClass( test1, \"cls2 cls1 cls3\" ) );\n     *\n     *     //output: true\n     *     console.log( UE.dom.domUtils.hasClass( test1, \"cls2 cls1\" ) );\n     * </script>\n     * ```\n     */\n\n    /**\n     * 判断元素element是否包含给定的样式类名className\n     * @method hasClass\n     * @param { Node } ele 需要检测的元素\n     * @param { Array } classNames 需要检测的className数组\n     * @return { Boolean } 元素是否包含所有给定的className\n     * @example\n     * ```html\n     * <span id=\"test1\" class=\"cls1 cls2\"></span>\n     *\n     * <script>\n     *     var test1 = document.getElementById(\"test1\");\n     *\n     *     //output: false\n     *     console.log( UE.dom.domUtils.hasClass( test1, [ \"cls2\", \"cls1\", \"cls3\" ] ) );\n     *\n     *     //output: true\n     *     console.log( UE.dom.domUtils.hasClass( test1, [ \"cls2\", \"cls1\" ]) );\n     * </script>\n     * ```\n     */\n    hasClass:function (element, className) {\n        if(utils.isRegExp(className)){\n            return className.test(element.className)\n        }\n        className = utils.trim(className).replace(/[ ]{2,}/g,' ').split(' ');\n        for(var i = 0,ci,cls = element.className;ci=className[i++];){\n            if(!new RegExp('\\\\b' + ci + '\\\\b','i').test(cls)){\n                return false;\n            }\n        }\n        return i - 1 == className.length;\n    },\n\n    /**\n     * 阻止事件默认行为\n     * @method preventDefault\n     * @param { Event } evt 需要阻止默认行为的事件对象\n     * @example\n     * ```javascript\n     * UE.dom.domUtils.preventDefault( evt );\n     * ```\n     */\n    preventDefault:function (evt) {\n        evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n    },\n    /**\n     * 删除元素element指定的样式\n     * @method removeStyle\n     * @param { Element } element 需要删除样式的元素\n     * @param { String } styleName 需要删除的样式名\n     * @example\n     * ```html\n     * <span id=\"test\" style=\"color: red; background: blue;\"></span>\n     *\n     * <script>\n     *\n     *     var testNode = document.getElementById(\"test\");\n     *\n     *     UE.dom.domUtils.removeStyle( testNode, 'color' );\n     *\n     *     //output: background: blue;\n     *     console.log( testNode.style.cssText );\n     *\n     * </script>\n     * ```\n     */\n    removeStyle:function (element, name) {\n        if(browser.ie ){\n            //针对color先单独处理一下\n            if(name == 'color'){\n                name = '(^|;)' + name;\n            }\n            element.style.cssText = element.style.cssText.replace(new RegExp(name + '[^:]*:[^;]+;?','ig'),'')\n        }else{\n            if (element.style.removeProperty) {\n                element.style.removeProperty (name);\n            }else {\n                element.style.removeAttribute (utils.cssStyleToDomStyle(name));\n            }\n        }\n\n\n        if (!element.style.cssText) {\n            domUtils.removeAttributes(element, ['style']);\n        }\n    },\n    /**\n     * 获取元素element的style属性的指定值\n     * @method getStyle\n     * @param { Element } element 需要获取属性值的元素\n     * @param { String } styleName 需要获取的style的名称\n     * @warning 该方法仅获取元素style属性中所标明的值\n     * @return { String } 该元素包含指定的style属性值\n     * @example\n     * ```html\n     * <div id=\"test\" style=\"color: red;\"></div>\n     *\n     * <script>\n     *\n     *      var testNode = document.getElementById( \"test\" );\n     *\n     *      //output: red\n     *      console.log( UE.dom.domUtils.getStyle( testNode, \"color\" ) );\n     *\n     *      //output: \"\"\n     *      console.log( UE.dom.domUtils.getStyle( testNode, \"background\" ) );\n     *\n     * </script>\n     * ```\n     */\n    getStyle:function (element, name) {\n        var value = element.style[ utils.cssStyleToDomStyle(name) ];\n        return utils.fixColor(name, value);\n    },\n    /**\n     * 为元素element设置样式属性值\n     * @method setStyle\n     * @param { Element } element 需要设置样式的元素\n     * @param { String } styleName 样式名\n     * @param { String } styleValue 样式值\n     * @example\n     * ```html\n     * <div id=\"test\"></div>\n     *\n     * <script>\n     *\n     *      var testNode = document.getElementById( \"test\" );\n     *\n     *      //output: \"\"\n     *      console.log( testNode.style.color );\n     *\n     *      UE.dom.domUtils.setStyle( testNode, 'color', 'red' );\n     *      //output: \"red\"\n     *      console.log( testNode.style.color );\n     *\n     * </script>\n     * ```\n     */\n    setStyle:function (element, name, value) {\n        element.style[utils.cssStyleToDomStyle(name)] = value;\n        if(!utils.trim(element.style.cssText)){\n            this.removeAttributes(element,'style')\n        }\n    },\n    /**\n     * 为元素element设置多个样式属性值\n     * @method setStyles\n     * @param { Element } element 需要设置样式的元素\n     * @param { Object } styles 样式名值对\n     * @example\n     * ```html\n     * <div id=\"test\"></div>\n     *\n     * <script>\n     *\n     *      var testNode = document.getElementById( \"test\" );\n     *\n     *      //output: \"\"\n     *      console.log( testNode.style.color );\n     *\n     *      UE.dom.domUtils.setStyles( testNode, {\n     *          'color': 'red'\n     *      } );\n     *      //output: \"red\"\n     *      console.log( testNode.style.color );\n     *\n     * </script>\n     * ```\n     */\n    setStyles:function (element, styles) {\n        for (var name in styles) {\n            if (styles.hasOwnProperty(name)) {\n                domUtils.setStyle(element, name, styles[name]);\n            }\n        }\n    },\n    /**\n     * 删除_moz_dirty属性\n     * @private\n     * @method removeDirtyAttr\n     */\n    removeDirtyAttr:function (node) {\n        for (var i = 0, ci, nodes = node.getElementsByTagName('*'); ci = nodes[i++];) {\n            ci.removeAttribute('_moz_dirty');\n        }\n        node.removeAttribute('_moz_dirty');\n    },\n    /**\n     * 获取子节点的数量\n     * @method getChildCount\n     * @param { Element } node 需要检测的元素\n     * @return { Number } 给定的node元素的子节点数量\n     * @example\n     * ```html\n     * <div id=\"test\">\n     *      <span></span>\n     * </div>\n     *\n     * <script>\n     *\n     *     //output: 3\n     *     console.log( UE.dom.domUtils.getChildCount( document.getElementById(\"test\") ) );\n     *\n     * </script>\n     * ```\n     */\n\n    /**\n     * 根据给定的过滤规则， 获取符合条件的子节点的数量\n     * @method getChildCount\n     * @param { Element } node 需要检测的元素\n     * @param { Function } fn 过滤器， 要求对符合条件的子节点返回true， 反之则要求返回false\n     * @return { Number } 符合过滤条件的node元素的子节点数量\n     * @example\n     * ```html\n     * <div id=\"test\">\n     *      <span></span>\n     * </div>\n     *\n     * <script>\n     *\n     *     //output: 1\n     *     console.log( UE.dom.domUtils.getChildCount( document.getElementById(\"test\"), function ( node ) {\n     *\n     *         return node.nodeType === 1;\n     *\n     *     } ) );\n     *\n     * </script>\n     * ```\n     */\n    getChildCount:function (node, fn) {\n        var count = 0, first = node.firstChild;\n        fn = fn || function () {\n            return 1;\n        };\n        while (first) {\n            if (fn(first)) {\n                count++;\n            }\n            first = first.nextSibling;\n        }\n        return count;\n    },\n\n    /**\n     * 判断给定节点是否为空节点\n     * @method isEmptyNode\n     * @param { Node } node 需要检测的节点对象\n     * @return { Boolean } 节点是否为空\n     * @example\n     * ```javascript\n     * UE.dom.domUtils.isEmptyNode( document.body );\n     * ```\n     */\n    isEmptyNode:function (node) {\n        return !node.firstChild || domUtils.getChildCount(node, function (node) {\n            return  !domUtils.isBr(node) && !domUtils.isBookmarkNode(node) && !domUtils.isWhitespace(node)\n        }) == 0\n    },\n    clearSelectedArr:function (nodes) {\n        var node;\n        while (node = nodes.pop()) {\n            domUtils.removeAttributes(node, ['class']);\n        }\n    },\n    /**\n     * 将显示区域滚动到指定节点的位置\n     * @method scrollToView\n     * @param    {Node}   node    节点\n     * @param    {window}   win      window对象\n     * @param    {Number}    offsetTop    距离上方的偏移量\n     */\n    scrollToView:function (node, win, offsetTop) {\n        var getViewPaneSize = function () {\n                var doc = win.document,\n                    mode = doc.compatMode == 'CSS1Compat';\n                return {\n                    width:( mode ? doc.documentElement.clientWidth : doc.body.clientWidth ) || 0,\n                    height:( mode ? doc.documentElement.clientHeight : doc.body.clientHeight ) || 0\n                };\n            },\n            getScrollPosition = function (win) {\n                if ('pageXOffset' in win) {\n                    return {\n                        x:win.pageXOffset || 0,\n                        y:win.pageYOffset || 0\n                    };\n                }\n                else {\n                    var doc = win.document;\n                    return {\n                        x:doc.documentElement.scrollLeft || doc.body.scrollLeft || 0,\n                        y:doc.documentElement.scrollTop || doc.body.scrollTop || 0\n                    };\n                }\n            };\n        var winHeight = getViewPaneSize().height, offset = winHeight * -1 + offsetTop;\n        offset += (node.offsetHeight || 0);\n        var elementPosition = domUtils.getXY(node);\n        offset += elementPosition.y;\n        var currentScroll = getScrollPosition(win).y;\n        // offset += 50;\n        if (offset > currentScroll || offset < currentScroll - winHeight) {\n            win.scrollTo(0, offset + (offset < 0 ? -20 : 20));\n        }\n    },\n    /**\n     * 判断给定节点是否为br\n     * @method isBr\n     * @param { Node } node 需要判断的节点对象\n     * @return { Boolean } 给定的节点是否是br节点\n     */\n    isBr:function (node) {\n        return node.nodeType == 1 && node.tagName == 'BR';\n    },\n    /**\n     * 判断给定的节点是否是一个“填充”节点\n     * @private\n     * @method isFillChar\n     * @param { Node } node 需要判断的节点\n     * @param { Boolean } isInStart 是否从节点内容的开始位置匹配\n     * @returns { Boolean } 节点是否是填充节点\n     */\n    isFillChar:function (node,isInStart) {\n        if(node.nodeType != 3)\n            return false;\n        var text = node.nodeValue;\n        if(isInStart){\n            return new RegExp('^' + domUtils.fillChar).test(text)\n        }\n        return !text.replace(new RegExp(domUtils.fillChar,'g'), '').length\n    },\n    isStartInblock:function (range) {\n        var tmpRange = range.cloneRange(),\n            flag = 0,\n            start = tmpRange.startContainer,\n            tmp;\n        if(start.nodeType == 1 && start.childNodes[tmpRange.startOffset]){\n            start = start.childNodes[tmpRange.startOffset];\n            var pre = start.previousSibling;\n            while(pre && domUtils.isFillChar(pre)){\n                start = pre;\n                pre = pre.previousSibling;\n            }\n        }\n        if(this.isFillChar(start,true) && tmpRange.startOffset == 1){\n            tmpRange.setStartBefore(start);\n            start = tmpRange.startContainer;\n        }\n\n        while (start && domUtils.isFillChar(start)) {\n            tmp = start;\n            start = start.previousSibling\n        }\n        if (tmp) {\n            tmpRange.setStartBefore(tmp);\n            start = tmpRange.startContainer;\n        }\n        if (start.nodeType == 1 && domUtils.isEmptyNode(start) && tmpRange.startOffset == 1) {\n            tmpRange.setStart(start, 0).collapse(true);\n        }\n        while (!tmpRange.startOffset) {\n            start = tmpRange.startContainer;\n            if (domUtils.isBlockElm(start) || domUtils.isBody(start)) {\n                flag = 1;\n                break;\n            }\n            var pre = tmpRange.startContainer.previousSibling,\n                tmpNode;\n            if (!pre) {\n                tmpRange.setStartBefore(tmpRange.startContainer);\n            } else {\n                while (pre && domUtils.isFillChar(pre)) {\n                    tmpNode = pre;\n                    pre = pre.previousSibling;\n                }\n                if (tmpNode) {\n                    tmpRange.setStartBefore(tmpNode);\n                } else {\n                    tmpRange.setStartBefore(tmpRange.startContainer);\n                }\n            }\n        }\n        return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0;\n    },\n\n    /**\n     * 判断给定的元素是否是一个空元素\n     * @method isEmptyBlock\n     * @param { Element } node 需要判断的元素\n     * @return { Boolean } 是否是空元素\n     * @example\n     * ```html\n     * <div id=\"test\"></div>\n     *\n     * <script>\n     *     //output: true\n     *     console.log( UE.dom.domUtils.isEmptyBlock( document.getElementById(\"test\") ) );\n     * </script>\n     * ```\n     */\n\n    /**\n     * 根据指定的判断规则判断给定的元素是否是一个空元素\n     * @method isEmptyBlock\n     * @param { Element } node 需要判断的元素\n     * @param { RegExp } reg 对内容执行判断的正则表达式对象\n     * @return { Boolean } 是否是空元素\n     */\n    isEmptyBlock:function (node,reg) {\n        if(node.nodeType != 1)\n            return 0;\n        reg = reg || new RegExp('[ \\xa0\\t\\r\\n' + domUtils.fillChar + ']', 'g');\n\n        if (node[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').length > 0) {\n            return 0;\n        }\n        for (var n in dtd.$isNotEmpty) {\n            if (node.getElementsByTagName(n).length) {\n                return 0;\n            }\n        }\n        return 1;\n    },\n\n    /**\n     * 移动元素使得该元素的位置移动指定的偏移量的距离\n     * @method setViewportOffset\n     * @param { Element } element 需要设置偏移量的元素\n     * @param { Object } offset 偏移量， 形如{ left: 100, top: 50 }的一个键值对， 表示该元素将在\n     *                                  现有的位置上向水平方向偏移offset.left的距离， 在竖直方向上偏移\n     *                                  offset.top的距离\n     * @example\n     * ```html\n     * <div id=\"test\" style=\"top: 100px; left: 50px; position: absolute;\"></div>\n     *\n     * <script>\n     *\n     *     var testNode = document.getElementById(\"test\");\n     *\n     *     UE.dom.domUtils.setViewportOffset( testNode, {\n     *         left: 200,\n     *         top: 50\n     *     } );\n     *\n     *     //output: top: 300px; left: 100px; position: absolute;\n     *     console.log( testNode.style.cssText );\n     *\n     * </script>\n     * ```\n     */\n    setViewportOffset:function (element, offset) {\n        var left = parseInt(element.style.left) | 0;\n        var top = parseInt(element.style.top) | 0;\n        var rect = element.getBoundingClientRect();\n        var offsetLeft = offset.left - rect.left;\n        var offsetTop = offset.top - rect.top;\n        if (offsetLeft) {\n            element.style.left = left + offsetLeft + 'px';\n        }\n        if (offsetTop) {\n            element.style.top = top + offsetTop + 'px';\n        }\n    },\n\n    /**\n     * 用“填充字符”填充节点\n     * @method fillNode\n     * @private\n     * @param { DomDocument } doc 填充的节点所在的docment对象\n     * @param { Node } node 需要填充的节点对象\n     * @example\n     * ```html\n     * <div id=\"test\"></div>\n     *\n     * <script>\n     *     var testNode = document.getElementById(\"test\");\n     *\n     *     //output: 0\n     *     console.log( testNode.childNodes.length );\n     *\n     *     UE.dom.domUtils.fillNode( document, testNode );\n     *\n     *     //output: 1\n     *     console.log( testNode.childNodes.length );\n     *\n     * </script>\n     * ```\n     */\n    fillNode:function (doc, node) {\n        var tmpNode = browser.ie ? doc.createTextNode(domUtils.fillChar) : doc.createElement('br');\n        node.innerHTML = '';\n        node.appendChild(tmpNode);\n    },\n\n    /**\n     * 把节点src的所有子节点追加到另一个节点tag上去\n     * @method moveChild\n     * @param { Node } src 源节点， 该节点下的所有子节点将被移除\n     * @param { Node } tag 目标节点， 从源节点移除的子节点将被追加到该节点下\n     * @example\n     * ```html\n     * <div id=\"test1\">\n     *      <span></span>\n     * </div>\n     * <div id=\"test2\">\n     *     <div></div>\n     * </div>\n     *\n     * <script>\n     *\n     *     var test1 = document.getElementById(\"test1\"),\n     *         test2 = document.getElementById(\"test2\");\n     *\n     *     UE.dom.domUtils.moveChild( test1, test2 );\n     *\n     *     //output: \"\"（空字符串）\n     *     console.log( test1.innerHTML );\n     *\n     *     //output: \"<div></div><span></span>\"\n     *     console.log( test2.innerHTML );\n     *\n     * </script>\n     * ```\n     */\n\n    /**\n     * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部”\n     * @method moveChild\n     * @param { Node } src 源节点， 该节点下的所有子节点将被移除\n     * @param { Node } tag 目标节点， 从源节点移除的子节点将被附加到该节点下\n     * @param { Boolean } dir 附加方式， 如果为true， 则附加进去的节点将被放到目标节点的顶部， 反之，则放到末尾\n     * @example\n     * ```html\n     * <div id=\"test1\">\n     *      <span></span>\n     * </div>\n     * <div id=\"test2\">\n     *     <div></div>\n     * </div>\n     *\n     * <script>\n     *\n     *     var test1 = document.getElementById(\"test1\"),\n     *         test2 = document.getElementById(\"test2\");\n     *\n     *     UE.dom.domUtils.moveChild( test1, test2, true );\n     *\n     *     //output: \"\"（空字符串）\n     *     console.log( test1.innerHTML );\n     *\n     *     //output: \"<span></span><div></div>\"\n     *     console.log( test2.innerHTML );\n     *\n     * </script>\n     * ```\n     */\n    moveChild:function (src, tag, dir) {\n        while (src.firstChild) {\n            if (dir && tag.firstChild) {\n                tag.insertBefore(src.lastChild, tag.firstChild);\n            } else {\n                tag.appendChild(src.firstChild);\n            }\n        }\n    },\n\n    /**\n     * 判断节点的标签上是否不存在任何属性\n     * @method hasNoAttributes\n     * @private\n     * @param { Node } node 需要检测的节点对象\n     * @return { Boolean } 节点是否不包含任何属性\n     * @example\n     * ```html\n     * <div id=\"test\"><span>xxxx</span></div>\n     *\n     * <script>\n     *\n     *     //output: false\n     *     console.log( UE.dom.domUtils.hasNoAttributes( document.getElementById(\"test\") ) );\n     *\n     *     //output: true\n     *     console.log( UE.dom.domUtils.hasNoAttributes( document.getElementById(\"test\").firstChild ) );\n     *\n     * </script>\n     * ```\n     */\n    hasNoAttributes:function (node) {\n        return browser.ie ? /^<\\w+\\s*?>/.test(node.outerHTML) : node.attributes.length == 0;\n    },\n\n    /**\n     * 检测节点是否是UEditor所使用的辅助节点\n     * @method isCustomeNode\n     * @private\n     * @param { Node } node 需要检测的节点\n     * @remind 辅助节点是指编辑器要完成工作临时添加的节点， 在输出的时候将会从编辑器内移除， 不会影响最终的结果。\n     * @return { Boolean } 给定的节点是否是一个辅助节点\n     */\n    isCustomeNode:function (node) {\n        return node.nodeType == 1 && node.getAttribute('_ue_custom_node_');\n    },\n\n    /**\n     * 检测节点的标签是否是给定的标签\n     * @method isTagNode\n     * @param { Node } node 需要检测的节点对象\n     * @param { String } tagName 标签\n     * @return { Boolean } 节点的标签是否是给定的标签\n     * @example\n     * ```html\n     * <div id=\"test\"></div>\n     *\n     * <script>\n     *\n     *     //output: true\n     *     console.log( UE.dom.domUtils.isTagNode( document.getElementById(\"test\"), \"div\" ) );\n     *\n     * </script>\n     * ```\n     */\n    isTagNode:function (node, tagNames) {\n        return node.nodeType == 1 && new RegExp('\\\\b' + node.tagName + '\\\\b','i').test(tagNames)\n    },\n\n    /**\n     * 给定一个节点数组，在通过指定的过滤器过滤后， 获取其中满足过滤条件的第一个节点\n     * @method filterNodeList\n     * @param { Array } nodeList 需要过滤的节点数组\n     * @param { Function } fn 过滤器， 对符合条件的节点， 执行结果返回true， 反之则返回false\n     * @return { Node | NULL } 如果找到符合过滤条件的节点， 则返回该节点， 否则返回NULL\n     * @example\n     * ```javascript\n     * var divNodes = document.getElementsByTagName(\"div\");\n     * divNodes = [].slice.call( divNodes, 0 );\n     *\n     * //output: null\n     * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) {\n     *     return node.tagName.toLowerCase() !== 'div';\n     * } ) );\n     * ```\n     */\n\n    /**\n     * 给定一个节点数组nodeList和一组标签名tagNames， 获取其中能够匹配标签名的节点集合中的第一个节点\n     * @method filterNodeList\n     * @param { Array } nodeList 需要过滤的节点数组\n     * @param { String } tagNames 需要匹配的标签名， 多个标签名之间用空格分割\n     * @return { Node | NULL } 如果找到标签名匹配的节点， 则返回该节点， 否则返回NULL\n     * @example\n     * ```javascript\n     * var divNodes = document.getElementsByTagName(\"div\");\n     * divNodes = [].slice.call( divNodes, 0 );\n     *\n     * //output: null\n     * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) );\n     * ```\n     */\n\n    /**\n     * 给定一个节点数组，在通过指定的过滤器过滤后， 如果参数forAll为true， 则会返回所有满足过滤\n     * 条件的节点集合， 否则， 返回满足条件的节点集合中的第一个节点\n     * @method filterNodeList\n     * @param { Array } nodeList 需要过滤的节点数组\n     * @param { Function } fn 过滤器， 对符合条件的节点， 执行结果返回true， 反之则返回false\n     * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false， 则返回节点集合中的第一个节点\n     * @return { Array | Node | NULL } 如果找到符合过滤条件的节点， 则根据参数forAll的值决定返回满足\n     *                                      过滤条件的节点数组或第一个节点， 否则返回NULL\n     * @example\n     * ```javascript\n     * var divNodes = document.getElementsByTagName(\"div\");\n     * divNodes = [].slice.call( divNodes, 0 );\n     *\n     * //output: 3（假定有3个div）\n     * console.log( divNodes.length );\n     *\n     * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) {\n     *     return node.tagName.toLowerCase() === 'div';\n     * }, true );\n     *\n     * //output: 3\n     * console.log( nodes.length );\n     *\n     * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) {\n     *     return node.tagName.toLowerCase() === 'div';\n     * }, false );\n     *\n     * //output: div\n     * console.log( node.nodeName );\n     * ```\n     */\n    filterNodeList : function(nodelist,filter,forAll){\n        var results = [];\n        if(!utils .isFunction(filter)){\n            var str = filter;\n            filter = function(n){\n                return utils.indexOf(utils.isArray(str) ? str:str.split(' '), n.tagName.toLowerCase()) != -1\n            };\n        }\n        utils.each(nodelist,function(n){\n            filter(n) && results.push(n)\n        });\n        return results.length  == 0 ? null : results.length == 1 || !forAll ? results[0] : results\n    },\n\n    /**\n     * 查询给定的range选区是否在给定的node节点内，且在该节点的最末尾\n     * @method isInNodeEndBoundary\n     * @param { UE.dom.Range } rng 需要判断的range对象， 该对象的startContainer不能为NULL\n     * @param node 需要检测的节点对象\n     * @return { Number } 如果给定的选取range对象是在node内部的最末端， 则返回1, 否则返回0\n     */\n    isInNodeEndBoundary : function (rng,node){\n        var start = rng.startContainer;\n        if(start.nodeType == 3 && rng.startOffset != start.nodeValue.length){\n            return 0;\n        }\n        if(start.nodeType == 1 && rng.startOffset != start.childNodes.length){\n            return 0;\n        }\n        while(start !== node){\n            if(start.nextSibling){\n                return 0\n            };\n            start = start.parentNode;\n        }\n        return 1;\n    },\n    isBoundaryNode : function (node,dir){\n        var tmp;\n        while(!domUtils.isBody(node)){\n            tmp = node;\n            node = node.parentNode;\n            if(tmp !== node[dir]){\n                return false;\n            }\n        }\n        return true;\n    },\n    fillHtml :  browser.ie11below ? '&nbsp;' : '<br/>'\n};\nvar fillCharReg = new RegExp(domUtils.fillChar, 'g');\n\n// core/Range.js\n/**\n * Range封装\n * @file\n * @module UE.dom\n * @class Range\n * @since 1.2.6.1\n */\n\n/**\n * dom操作封装\n * @unfile\n * @module UE.dom\n */\n\n/**\n * Range实现类，本类是UEditor底层核心类，封装不同浏览器之间的Range操作。\n * @unfile\n * @module UE.dom\n * @class Range\n */\n\n\n(function () {\n    var guid = 0,\n        fillChar = domUtils.fillChar,\n        fillData;\n\n    /**\n     * 更新range的collapse状态\n     * @param  {Range}   range    range对象\n     */\n    function updateCollapse(range) {\n        range.collapsed =\n            range.startContainer && range.endContainer &&\n                range.startContainer === range.endContainer &&\n                range.startOffset == range.endOffset;\n    }\n\n    function selectOneNode(rng){\n        return !rng.collapsed && rng.startContainer.nodeType == 1 && rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset == 1\n    }\n    function setEndPoint(toStart, node, offset, range) {\n        //如果node是自闭合标签要处理\n        if (node.nodeType == 1 && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])) {\n            offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1);\n            node = node.parentNode;\n        }\n        if (toStart) {\n            range.startContainer = node;\n            range.startOffset = offset;\n            if (!range.endContainer) {\n                range.collapse(true);\n            }\n        } else {\n            range.endContainer = node;\n            range.endOffset = offset;\n            if (!range.startContainer) {\n                range.collapse(false);\n            }\n        }\n        updateCollapse(range);\n        return range;\n    }\n\n    function execContentsAction(range, action) {\n        //调整边界\n        //range.includeBookmark();\n        var start = range.startContainer,\n            end = range.endContainer,\n            startOffset = range.startOffset,\n            endOffset = range.endOffset,\n            doc = range.document,\n            frag = doc.createDocumentFragment(),\n            tmpStart, tmpEnd;\n        if (start.nodeType == 1) {\n            start = start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode('')));\n        }\n        if (end.nodeType == 1) {\n            end = end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode('')));\n        }\n        if (start === end && start.nodeType == 3) {\n            frag.appendChild(doc.createTextNode(start.substringData(startOffset, endOffset - startOffset)));\n            //is not clone\n            if (action) {\n                start.deleteData(startOffset, endOffset - startOffset);\n                range.collapse(true);\n            }\n            return frag;\n        }\n        var current, currentLevel, clone = frag,\n            startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true);\n        for (var i = 0; startParents[i] == endParents[i];) {\n            i++;\n        }\n        for (var j = i, si; si = startParents[j]; j++) {\n            current = si.nextSibling;\n            if (si == start) {\n                if (!tmpStart) {\n                    if (range.startContainer.nodeType == 3) {\n                        clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset)));\n                        //is not clone\n                        if (action) {\n                            start.deleteData(startOffset, start.nodeValue.length - startOffset);\n                        }\n                    } else {\n                        clone.appendChild(!action ? start.cloneNode(true) : start);\n                    }\n                }\n            } else {\n                currentLevel = si.cloneNode(false);\n                clone.appendChild(currentLevel);\n            }\n            while (current) {\n                if (current === end || current === endParents[j]) {\n                    break;\n                }\n                si = current.nextSibling;\n                clone.appendChild(!action ? current.cloneNode(true) : current);\n                current = si;\n            }\n            clone = currentLevel;\n        }\n        clone = frag;\n        if (!startParents[i]) {\n            clone.appendChild(startParents[i - 1].cloneNode(false));\n            clone = clone.firstChild;\n        }\n        for (var j = i, ei; ei = endParents[j]; j++) {\n            current = ei.previousSibling;\n            if (ei == end) {\n                if (!tmpEnd && range.endContainer.nodeType == 3) {\n                    clone.appendChild(doc.createTextNode(end.substringData(0, endOffset)));\n                    //is not clone\n                    if (action) {\n                        end.deleteData(0, endOffset);\n                    }\n                }\n            } else {\n                currentLevel = ei.cloneNode(false);\n                clone.appendChild(currentLevel);\n            }\n            //如果两端同级，右边第一次已经被开始做了\n            if (j != i || !startParents[i]) {\n                while (current) {\n                    if (current === start) {\n                        break;\n                    }\n                    ei = current.previousSibling;\n                    clone.insertBefore(!action ? current.cloneNode(true) : current, clone.firstChild);\n                    current = ei;\n                }\n            }\n            clone = currentLevel;\n        }\n        if (action) {\n            range.setStartBefore(!endParents[i] ? endParents[i - 1] : !startParents[i] ? startParents[i - 1] : endParents[i]).collapse(true);\n        }\n        tmpStart && domUtils.remove(tmpStart);\n        tmpEnd && domUtils.remove(tmpEnd);\n        return frag;\n    }\n\n    /**\n     * 创建一个跟document绑定的空的Range实例\n     * @constructor\n     * @param { Document } document 新建的选区所属的文档对象\n     */\n\n    /**\n     * @property { Node } startContainer 当前Range的开始边界的容器节点, 可以是一个元素节点或者是文本节点\n     */\n\n    /**\n     * @property { Node } startOffset 当前Range的开始边界容器节点的偏移量, 如果是元素节点，\n     *                              该值就是childNodes中的第几个节点， 如果是文本节点就是文本内容的第几个字符\n     */\n\n    /**\n     * @property { Node } endContainer 当前Range的结束边界的容器节点, 可以是一个元素节点或者是文本节点\n     */\n\n    /**\n     * @property { Node } endOffset 当前Range的结束边界容器节点的偏移量, 如果是元素节点，\n     *                              该值就是childNodes中的第几个节点， 如果是文本节点就是文本内容的第几个字符\n     */\n\n    /**\n     * @property { Boolean } collapsed 当前Range是否闭合\n     * @default true\n     * @remind Range是闭合的时候， startContainer === endContainer && startOffset === endOffset\n     */\n\n    /**\n     * @property { Document } document 当前Range所属的Document对象\n     * @remind 不同range的的document属性可以是不同的\n     */\n    var Range = dom.Range = function (document) {\n        var me = this;\n        me.startContainer =\n            me.startOffset =\n                me.endContainer =\n                    me.endOffset = null;\n        me.document = document;\n        me.collapsed = true;\n    };\n\n    /**\n     * 删除fillData\n     * @param doc\n     * @param excludeNode\n     */\n    function removeFillData(doc, excludeNode) {\n        try {\n            if (fillData && domUtils.inDoc(fillData, doc)) {\n                if (!fillData.nodeValue.replace(fillCharReg, '').length) {\n                    var tmpNode = fillData.parentNode;\n                    domUtils.remove(fillData);\n                    while (tmpNode && domUtils.isEmptyInlineElement(tmpNode) &&\n                        //safari的contains有bug\n                        (browser.safari ? !(domUtils.getPosition(tmpNode,excludeNode) & domUtils.POSITION_CONTAINS) : !tmpNode.contains(excludeNode))\n                        ) {\n                        fillData = tmpNode.parentNode;\n                        domUtils.remove(tmpNode);\n                        tmpNode = fillData;\n                    }\n                } else {\n                    fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, '');\n                }\n            }\n        } catch (e) {\n        }\n    }\n\n    /**\n     * @param node\n     * @param dir\n     */\n    function mergeSibling(node, dir) {\n        var tmpNode;\n        node = node[dir];\n        while (node && domUtils.isFillChar(node)) {\n            tmpNode = node[dir];\n            domUtils.remove(node);\n            node = tmpNode;\n        }\n    }\n\n    Range.prototype = {\n\n        /**\n         * 克隆选区的内容到一个DocumentFragment里\n         * @method cloneContents\n         * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null， 否则， 返回包含所clone内容的DocumentFragment元素\n         * @example\n         * ```html\n         * <body>\n         *      <!-- 中括号表示选区 -->\n         *      <b>x<i>x[x</i>xx]x</b>\n         *\n         *      <script>\n         *          //range是已选中的选区\n         *          var fragment = range.cloneContents(),\n         *              node = document.createElement(\"div\");\n         *\n         *          node.appendChild( fragment );\n         *\n         *          //output: <i>x</i>xx\n         *          console.log( node.innerHTML );\n         *\n         *      </script>\n         * </body>\n         * ```\n         */\n        cloneContents:function () {\n            return this.collapsed ? null : execContentsAction(this, 0);\n        },\n\n        /**\n         * 删除当前选区范围中的所有内容\n         * @method deleteContents\n         * @remind 执行完该操作后， 当前Range对象变成了闭合状态\n         * @return { UE.dom.Range } 当前操作的Range对象\n         * @example\n         * ```html\n         * <body>\n         *      <!-- 中括号表示选区 -->\n         *      <b>x<i>x[x</i>xx]x</b>\n         *\n         *      <script>\n         *          //range是已选中的选区\n         *          range.deleteContents();\n         *\n         *          //竖线表示闭合后的选区位置\n         *          //output: <b>x<i>x</i>|x</b>\n         *          console.log( document.body.innerHTML );\n         *\n         *          //此时， range的各项属性为\n         *          //output: B\n         *          console.log( range.startContainer.tagName );\n         *          //output: 2\n         *          console.log( range.startOffset );\n         *          //output: B\n         *          console.log( range.endContainer.tagName );\n         *          //output: 2\n         *          console.log( range.endOffset );\n         *          //output: true\n         *          console.log( range.collapsed );\n         *\n         *      </script>\n         * </body>\n         * ```\n         */\n        deleteContents:function () {\n            var txt;\n            if (!this.collapsed) {\n                execContentsAction(this, 1);\n            }\n            if (browser.webkit) {\n                txt = this.startContainer;\n                if (txt.nodeType == 3 && !txt.nodeValue.length) {\n                    this.setStartBefore(txt).collapse(true);\n                    domUtils.remove(txt);\n                }\n            }\n            return this;\n        },\n\n        /**\n         * 将当前选区的内容提取到一个DocumentFragment里\n         * @method extractContents\n         * @remind 执行该操作后， 选区将变成闭合状态\n         * @warning 执行该操作后， 原来选区所选中的内容将从dom树上剥离出来\n         * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象\n         * @example\n         * ```html\n         * <body>\n         *      <!-- 中括号表示选区 -->\n         *      <b>x<i>x[x</i>xx]x</b>\n         *\n         *      <script>\n         *          //range是已选中的选区\n         *          var fragment = range.extractContents(),\n         *              node = document.createElement( \"div\" );\n         *\n         *          node.appendChild( fragment );\n         *\n         *          //竖线表示闭合后的选区位置\n         *\n         *          //output: <b>x<i>x</i>|x</b>\n         *          console.log( document.body.innerHTML );\n         *          //output: <i>x</i>xx\n         *          console.log( node.innerHTML );\n         *\n         *          //此时， range的各项属性为\n         *          //output: B\n         *          console.log( range.startContainer.tagName );\n         *          //output: 2\n         *          console.log( range.startOffset );\n         *          //output: B\n         *          console.log( range.endContainer.tagName );\n         *          //output: 2\n         *          console.log( range.endOffset );\n         *          //output: true\n         *          console.log( range.collapsed );\n         *\n         *      </script>\n         * </body>\n         */\n        extractContents:function () {\n            return this.collapsed ? null : execContentsAction(this, 2);\n        },\n\n        /**\n         * 设置Range的开始容器节点和偏移量\n         * @method  setStart\n         * @remind 如果给定的节点是元素节点，那么offset指的是其子元素中索引为offset的元素，\n         *          如果是文本节点，那么offset指的是其文本内容的第offset个字符\n         * @remind 如果提供的容器节点是一个不能包含子元素的节点， 则该选区的开始容器将被设置\n         *          为该节点的父节点， 此时， 其距离开始容器的偏移量也变成了该节点在其父节点\n         *          中的索引\n         * @param { Node } node 将被设为当前选区开始边界容器的节点对象\n         * @param { int } offset 选区的开始位置偏移量\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         * <!-- 选区 -->\n         * <b>xxx<i>x<span>xx</span>xx<em>xx</em>xxx</i>[xxx]</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.setStart( document.getElementsByTagName(\"i\")[0], 1 );\n         *\n         *     //此时， 选区变成了\n         *     //<b>xxx<i>x[<span>xx</span>xx<em>xx</em>xxx</i>xxx]</b>\n         *\n         * </script>\n         * ```\n         * @example\n         * ```html\n         * <!-- 选区 -->\n         * <b>xxx<img>[xx]x</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.setStart( document.getElementsByTagName(\"img\")[0], 3 );\n         *\n         *     //此时， 选区变成了\n         *     //<b>xxx[<img>xx]x</b>\n         *\n         * </script>\n         * ```\n         */\n        setStart:function (node, offset) {\n            return setEndPoint(true, node, offset, this);\n        },\n\n        /**\n         * 设置Range的结束容器和偏移量\n         * @method  setEnd\n         * @param { Node } node 作为当前选区结束边界容器的节点对象\n         * @param { int } offset 结束边界的偏移量\n         * @see UE.dom.Range:setStart(Node,int)\n         * @return { UE.dom.Range } 当前range对象\n         */\n        setEnd:function (node, offset) {\n            return setEndPoint(false, node, offset, this);\n        },\n\n        /**\n         * 将Range开始位置设置到node节点之后\n         * @method  setStartAfter\n         * @remind 该操作将会把给定节点的父节点作为range的开始容器， 且偏移量是该节点在其父节点中的位置索引+1\n         * @param { Node } node 选区的开始边界将紧接着该节点之后\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         * <!-- 选区示例 -->\n         * <b>xx<i>xxx</i><span>xx[x</span>xxx]</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.setStartAfter( document.getElementsByTagName(\"i\")[0] );\n         *\n         *     //结果选区\n         *     //<b>xx<i>xxx</i>[<span>xxx</span>xxx]</b>\n         *\n         * </script>\n         * ```\n         */\n        setStartAfter:function (node) {\n            return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1);\n        },\n\n        /**\n         * 将Range开始位置设置到node节点之前\n         * @method  setStartBefore\n         * @remind 该操作将会把给定节点的父节点作为range的开始容器， 且偏移量是该节点在其父节点中的位置索引\n         * @param { Node } node 新的选区开始位置在该节点之前\n         * @see UE.dom.Range:setStartAfter(Node)\n         * @return { UE.dom.Range } 当前range对象\n         */\n        setStartBefore:function (node) {\n            return this.setStart(node.parentNode, domUtils.getNodeIndex(node));\n        },\n\n        /**\n         * 将Range结束位置设置到node节点之后\n         * @method  setEndAfter\n         * @remind 该操作将会把给定节点的父节点作为range的结束容器， 且偏移量是该节点在其父节点中的位置索引+1\n         * @param { Node } node 目标节点\n         * @see UE.dom.Range:setStartAfter(Node)\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         * <!-- 选区示例 -->\n         * <b>[xx<i>xxx</i><span>xx]x</span>xxx</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.setStartAfter( document.getElementsByTagName(\"span\")[0] );\n         *\n         *     //结果选区\n         *     //<b>[xx<i>xxx</i><span>xxx</span>]xxx</b>\n         *\n         * </script>\n         * ```\n         */\n        setEndAfter:function (node) {\n            return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1);\n        },\n\n        /**\n         * 将Range结束位置设置到node节点之前\n         * @method  setEndBefore\n         * @remind 该操作将会把给定节点的父节点作为range的结束容器， 且偏移量是该节点在其父节点中的位置索引\n         * @param { Node } node 目标节点\n         * @see UE.dom.Range:setEndAfter(Node)\n         * @return { UE.dom.Range } 当前range对象\n         */\n        setEndBefore:function (node) {\n            return this.setEnd(node.parentNode, domUtils.getNodeIndex(node));\n        },\n\n        /**\n         * 设置Range的开始位置到node节点内的第一个子节点之前\n         * @method  setStartAtFirst\n         * @remind 选区的开始容器将变成给定的节点， 且偏移量为0\n         * @remind 如果给定的节点是元素节点， 则该节点必须是允许包含子节点的元素。\n         * @param { Node } node 目标节点\n         * @see UE.dom.Range:setStartBefore(Node)\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         * <!-- 选区示例 -->\n         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.setStartAtFirst( document.getElementsByTagName(\"i\")[0] );\n         *\n         *     //结果选区\n         *     //<b>xx<i>[xxx</i><span>xx]x</span>xxx</b>\n         *\n         * </script>\n         * ```\n         */\n        setStartAtFirst:function (node) {\n            return this.setStart(node, 0);\n        },\n\n        /**\n         * 设置Range的开始位置到node节点内的最后一个节点之后\n         * @method setStartAtLast\n         * @remind 选区的开始容器将变成给定的节点， 且偏移量为该节点的子节点数\n         * @remind 如果给定的节点是元素节点， 则该节点必须是允许包含子节点的元素。\n         * @param { Node } node 目标节点\n         * @see UE.dom.Range:setStartAtFirst(Node)\n         * @return { UE.dom.Range } 当前range对象\n         */\n        setStartAtLast:function (node) {\n            return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length);\n        },\n\n        /**\n         * 设置Range的结束位置到node节点内的第一个节点之前\n         * @method  setEndAtFirst\n         * @param { Node } node 目标节点\n         * @remind 选区的结束容器将变成给定的节点， 且偏移量为0\n         * @remind node必须是一个元素节点， 且必须是允许包含子节点的元素。\n         * @see UE.dom.Range:setStartAtFirst(Node)\n         * @return { UE.dom.Range } 当前range对象\n         */\n        setEndAtFirst:function (node) {\n            return this.setEnd(node, 0);\n        },\n\n        /**\n         * 设置Range的结束位置到node节点内的最后一个节点之后\n         * @method  setEndAtLast\n         * @param { Node } node 目标节点\n         * @remind 选区的结束容器将变成给定的节点， 且偏移量为该节点的子节点数量\n         * @remind node必须是一个元素节点， 且必须是允许包含子节点的元素。\n         * @see UE.dom.Range:setStartAtFirst(Node)\n         * @return { UE.dom.Range } 当前range对象\n         */\n        setEndAtLast:function (node) {\n            return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length);\n        },\n\n        /**\n         * 选中给定节点\n         * @method  selectNode\n         * @remind 此时， 选区的开始容器和结束容器都是该节点的父节点， 其startOffset是该节点在父节点中的位置索引，\n         *          而endOffset为startOffset+1\n         * @param { Node } node 需要选中的节点\n         * @return { UE.dom.Range } 当前range对象，此时的range仅包含当前给定的节点对象\n         * @example\n         * ```html\n         * <!-- 选区示例 -->\n         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.selectNode( document.getElementsByTagName(\"i\")[0] );\n         *\n         *     //结果选区\n         *     //<b>xx[<i>xxx</i>]<span>xxx</span>xxx</b>\n         *\n         * </script>\n         * ```\n         */\n        selectNode:function (node) {\n            return this.setStartBefore(node).setEndAfter(node);\n        },\n\n        /**\n         * 选中给定节点内部的所有节点\n         * @method  selectNodeContents\n         * @remind 此时， 选区的开始容器和结束容器都是该节点， 其startOffset为0，\n         *          而endOffset是该节点的子节点数。\n         * @param { Node } node 目标节点， 当前range将包含该节点内的所有节点\n         * @return { UE.dom.Range } 当前range对象， 此时range仅包含给定节点的所有子节点\n         * @example\n         * ```html\n         * <!-- 选区示例 -->\n         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.selectNode( document.getElementsByTagName(\"b\")[0] );\n         *\n         *     //结果选区\n         *     //<b>[xx<i>xxx</i><span>xxx</span>xxx]</b>\n         *\n         * </script>\n         * ```\n         */\n        selectNodeContents:function (node) {\n            return this.setStart(node, 0).setEndAtLast(node);\n        },\n\n        /**\n         * clone当前Range对象\n         * @method  cloneRange\n         * @remind 返回的range是一个全新的range对象， 其内部所有属性与当前被clone的range相同。\n         * @return { UE.dom.Range } 当前range对象的一个副本\n         */\n        cloneRange:function () {\n            var me = this;\n            return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset);\n\n        },\n\n        /**\n         * 向当前选区的结束处闭合选区\n         * @method  collapse\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         * <!-- 选区示例 -->\n         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.collapse();\n         *\n         *     //结果选区\n         *     //“|”表示选区已闭合\n         *     //<b>xx<i>xxx</i><span>xx|x</span>xxx</b>\n         *\n         * </script>\n         * ```\n         */\n\n        /**\n         * 闭合当前选区，根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合，\n         * 如果toStart的值为true，则向开始位置闭合， 反之，向结束位置闭合。\n         * @method  collapse\n         * @param { Boolean } toStart 是否向选区开始处闭合\n         * @return { UE.dom.Range } 当前range对象，此时range对象处于闭合状态\n         * @see UE.dom.Range:collapse()\n         * @example\n         * ```html\n         * <!-- 选区示例 -->\n         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>\n         *\n         * <script>\n         *\n         *     //执行操作\n         *     range.collapse( true );\n         *\n         *     //结果选区\n         *     //“|”表示选区已闭合\n         *     //<b>xx<i>xxx</i><span>|xxx</span>xxx</b>\n         *\n         * </script>\n         * ```\n         */\n        collapse:function (toStart) {\n            var me = this;\n            if (toStart) {\n                me.endContainer = me.startContainer;\n                me.endOffset = me.startOffset;\n            } else {\n                me.startContainer = me.endContainer;\n                me.startOffset = me.endOffset;\n            }\n            me.collapsed = true;\n            return me;\n        },\n\n        /**\n         * 调整range的开始位置和结束位置，使其\"收缩\"到最小的位置\n         * @method  shrinkBoundary\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         * <span>xx<b>xx[</b>xxxxx]</span> => <span>xx<b>xx</b>[xxxxx]</span>\n         * ```\n         *\n         * @example\n         * ```html\n         * <!-- 选区示例 -->\n         * <b>x[xx</b><i>]xxx</i>\n         *\n         * <script>\n         *\n         *     //执行收缩\n         *     range.shrinkBoundary();\n         *\n         *     //结果选区\n         *     //<b>x[xx]</b><i>xxx</i>\n         * </script>\n         * ```\n         *\n         * @example\n         * ```html\n         * [<b><i>xxxx</i>xxxxxxx</b>] => <b><i>[xxxx</i>xxxxxxx]</b>\n         * ```\n         */\n\n        /**\n         * 调整range的开始位置和结束位置，使其\"收缩\"到最小的位置，\n         * 如果ignoreEnd的值为true，则忽略对结束位置的调整\n         * @method  shrinkBoundary\n         * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整\n         * @return { UE.dom.Range } 当前range对象\n         * @see UE.dom.domUtils.Range:shrinkBoundary()\n         */\n        shrinkBoundary:function (ignoreEnd) {\n            var me = this, child,\n                collapsed = me.collapsed;\n            function check(node){\n                return node.nodeType == 1 && !domUtils.isBookmarkNode(node) && !dtd.$empty[node.tagName] && !dtd.$nonChild[node.tagName]\n            }\n            while (me.startContainer.nodeType == 1 //是element\n                && (child = me.startContainer.childNodes[me.startOffset]) //子节点也是element\n                && check(child)) {\n                me.setStart(child, 0);\n            }\n            if (collapsed) {\n                return me.collapse(true);\n            }\n            if (!ignoreEnd) {\n                while (me.endContainer.nodeType == 1//是element\n                    && me.endOffset > 0 //如果是空元素就退出 endOffset=0那么endOffst-1为负值，childNodes[endOffset]报错\n                    && (child = me.endContainer.childNodes[me.endOffset - 1]) //子节点也是element\n                    && check(child)) {\n                    me.setEnd(child, child.childNodes.length);\n                }\n            }\n            return me;\n        },\n\n        /**\n         * 获取离当前选区内包含的所有节点最近的公共祖先节点，\n         * @method  getCommonAncestor\n         * @remind 返回的公共祖先节点一定不是range自身的容器节点， 但有可能是一个文本节点\n         * @return { Node } 当前range对象内所有节点的公共祖先节点\n         * @example\n         * ```html\n         * //选区示例\n         * <span>xxx<b>x[x<em>xx]x</em>xxx</b>xx</span>\n         * <script>\n         *\n         *     var node = range.getCommonAncestor();\n         *\n         *     //公共祖先节点是： b节点\n         *     //输出： B\n         *     console.log(node.tagName);\n         *\n         * </script>\n         * ```\n         */\n\n        /**\n         * 获取当前选区所包含的所有节点的公共祖先节点， 可以根据给定的参数 includeSelf 决定获取到\n         * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点， 如果 includeSelf\n         * 的取值为true， 则返回的节点可以是自身的容器节点， 否则， 则不能是容器节点\n         * @method  getCommonAncestor\n         * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点\n         * @return { Node } 当前range对象内所有节点的公共祖先节点\n         * @see UE.dom.Range:getCommonAncestor()\n         * @example\n         * ```html\n         * <body>\n         *\n         *     <!-- 选区示例 -->\n         *     <b>xxx<i>xxxx<span>xx[x</span>xx]x</i>xxxxxxx</b>\n         *\n         *     <script>\n         *\n         *         var node = range.getCommonAncestor( false );\n         *\n         *         //这里的公共祖先节点是B而不是I， 是因为参数限制了获取到的节点不能是容器节点\n         *         //output: B\n         *         console.log( node.tagName );\n         *\n         *     </script>\n         *\n         * </body>\n         * ```\n         */\n\n        /**\n         * 获取当前选区所包含的所有节点的公共祖先节点， 可以根据给定的参数 includeSelf 决定获取到\n         * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点， 如果 includeSelf\n         * 的取值为true， 则返回的节点可以是自身的容器节点， 否则， 则不能是容器节点； 同时可以根据\n         * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。\n         * @method  getCommonAncestor\n         * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点\n         * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点\n         * @return { Node } 当前range对象内所有节点的公共祖先节点\n         * @see UE.dom.Range:getCommonAncestor()\n         * @see UE.dom.Range:getCommonAncestor(Boolean)\n         * @example\n         * ```html\n         * <body>\n         *\n         *     <!-- 选区示例 -->\n         *     <b>xxx<i>xxxx<span>x[x]x</span>xxx</i>xxxxxxx</b>\n         *\n         *     <script>\n         *\n         *         var node = range.getCommonAncestor( true, false );\n         *\n         *         //output: SPAN\n         *         console.log( node.tagName );\n         *\n         *     </script>\n         *\n         * </body>\n         * ```\n         */\n        getCommonAncestor:function (includeSelf, ignoreTextNode) {\n            var me = this,\n                start = me.startContainer,\n                end = me.endContainer;\n            if (start === end) {\n                if (includeSelf && selectOneNode(this)) {\n                    start = start.childNodes[me.startOffset];\n                    if(start.nodeType == 1)\n                        return start;\n                }\n                //只有在上来就相等的情况下才会出现是文本的情况\n                return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start;\n            }\n            return domUtils.getCommonAncestor(start, end);\n        },\n\n        /**\n         * 调整当前Range的开始和结束边界容器，如果是容器节点是文本节点,就调整到包含该文本节点的父节点上\n         * @method trimBoundary\n         * @remind 该操作有可能会引起文本节点被切开\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         *\n         * //选区示例\n         * <b>xxx<i>[xxxxx]</i>xxx</b>\n         *\n         * <script>\n         *     //未调整前， 选区的开始容器和结束都是文本节点\n         *     //执行调整\n         *     range.trimBoundary();\n         *\n         *     //调整之后， 容器节点变成了i节点\n         *     //<b>xxx[<i>xxxxx</i>]xxx</b>\n         * </script>\n         * ```\n         */\n\n        /**\n         * 调整当前Range的开始和结束边界容器，如果是容器节点是文本节点,就调整到包含该文本节点的父节点上，\n         * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整\n         * @method trimBoundary\n         * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         *\n         * //选区示例\n         * <b>xxx<i>[xxxxx]</i>xxx</b>\n         *\n         * <script>\n         *     //未调整前， 选区的开始容器和结束都是文本节点\n         *     //执行调整\n         *     range.trimBoundary( true );\n         *\n         *     //调整之后， 开始容器节点变成了i节点\n         *     //但是， 结束容器没有发生变化\n         *     //<b>xxx[<i>xxxxx]</i>xxx</b>\n         * </script>\n         * ```\n         */\n        trimBoundary:function (ignoreEnd) {\n            this.txtToElmBoundary();\n            var start = this.startContainer,\n                offset = this.startOffset,\n                collapsed = this.collapsed,\n                end = this.endContainer;\n            if (start.nodeType == 3) {\n                if (offset == 0) {\n                    this.setStartBefore(start);\n                } else {\n                    if (offset >= start.nodeValue.length) {\n                        this.setStartAfter(start);\n                    } else {\n                        var textNode = domUtils.split(start, offset);\n                        //跟新结束边界\n                        if (start === end) {\n                            this.setEnd(textNode, this.endOffset - offset);\n                        } else if (start.parentNode === end) {\n                            this.endOffset += 1;\n                        }\n                        this.setStartBefore(textNode);\n                    }\n                }\n                if (collapsed) {\n                    return this.collapse(true);\n                }\n            }\n            if (!ignoreEnd) {\n                offset = this.endOffset;\n                end = this.endContainer;\n                if (end.nodeType == 3) {\n                    if (offset == 0) {\n                        this.setEndBefore(end);\n                    } else {\n                        offset < end.nodeValue.length && domUtils.split(end, offset);\n                        this.setEndAfter(end);\n                    }\n                }\n            }\n            return this;\n        },\n\n        /**\n         * 如果选区在文本的边界上，就扩展选区到文本的父节点上, 如果当前选区是闭合的， 则什么也不做\n         * @method txtToElmBoundary\n         * @remind 该操作不会修改dom节点\n         * @return { UE.dom.Range } 当前range对象\n         */\n\n        /**\n         * 如果选区在文本的边界上，就扩展选区到文本的父节点上, 如果当前选区是闭合的， 则根据参数项\n         * ignoreCollapsed 的值决定是否执行该调整\n         * @method txtToElmBoundary\n         * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态， 如果该参数取值为true， 则\n         *                      不论选区是否闭合， 都会执行该操作， 反之， 则不会对闭合的选区执行该操作\n         * @return { UE.dom.Range } 当前range对象\n         */\n        txtToElmBoundary:function (ignoreCollapsed) {\n            function adjust(r, c) {\n                var container = r[c + 'Container'],\n                    offset = r[c + 'Offset'];\n                if (container.nodeType == 3) {\n                    if (!offset) {\n                        r['set' + c.replace(/(\\w)/, function (a) {\n                            return a.toUpperCase();\n                        }) + 'Before'](container);\n                    } else if (offset >= container.nodeValue.length) {\n                        r['set' + c.replace(/(\\w)/, function (a) {\n                            return a.toUpperCase();\n                        }) + 'After' ](container);\n                    }\n                }\n            }\n\n            if (ignoreCollapsed || !this.collapsed) {\n                adjust(this, 'start');\n                adjust(this, 'end');\n            }\n            return this;\n        },\n\n        /**\n         * 在当前选区的开始位置前插入节点，新插入的节点会被该range包含\n         * @method  insertNode\n         * @param { Node } node 需要插入的节点\n         * @remind 插入的节点可以是一个DocumentFragment依次插入多个节点\n         * @return { UE.dom.Range } 当前range对象\n         */\n        insertNode:function (node) {\n            var first = node, length = 1;\n            if (node.nodeType == 11) {\n                first = node.firstChild;\n                length = node.childNodes.length;\n            }\n            this.trimBoundary(true);\n            var start = this.startContainer,\n                offset = this.startOffset;\n            var nextNode = start.childNodes[ offset ];\n            if (nextNode) {\n                start.insertBefore(node, nextNode);\n            } else {\n                start.appendChild(node);\n            }\n            if (first.parentNode === this.endContainer) {\n                this.endOffset = this.endOffset + length;\n            }\n            return this.setStartBefore(first);\n        },\n\n        /**\n         * 闭合选区到当前选区的开始位置， 并且定位光标到闭合后的位置\n         * @method  setCursor\n         * @return { UE.dom.Range } 当前range对象\n         * @see UE.dom.Range:collapse()\n         */\n\n        /**\n         * 闭合选区，可以根据参数toEnd的值控制选区是向前闭合还是向后闭合， 并且定位光标到闭合后的位置。\n         * @method  setCursor\n         * @param { Boolean } toEnd 是否向后闭合， 如果为true， 则闭合选区时， 将向结束容器方向闭合，\n         *                      反之，则向开始容器方向闭合\n         * @return { UE.dom.Range } 当前range对象\n         * @see UE.dom.Range:collapse(Boolean)\n         */\n        setCursor:function (toEnd, noFillData) {\n            return this.collapse(!toEnd).select(noFillData);\n        },\n\n        /**\n         * 创建当前range的一个书签，记录下当前range的位置，方便当dom树改变时，还能找回原来的选区位置\n         * @method createBookmark\n         * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID，如果该值为true，则\n         *                              返回标记位置的ID， 反之则返回标记位置节点的引用\n         * @return { Object } 返回一个书签记录键值对， 其包含的key有： start => 开始标记的ID或者引用，\n         *                          end => 结束标记的ID或引用， id => 当前标记的类型， 如果为true，则表示\n         *                          返回的记录的类型为ID， 反之则为引用\n         */\n        createBookmark:function (serialize, same) {\n            var endNode,\n                startNode = this.document.createElement('span');\n            startNode.style.cssText = 'display:none;line-height:0px;';\n            startNode.appendChild(this.document.createTextNode('\\u200D'));\n            startNode.id = '_baidu_bookmark_start_' + (same ? '' : guid++);\n\n            if (!this.collapsed) {\n                endNode = startNode.cloneNode(true);\n                endNode.id = '_baidu_bookmark_end_' + (same ? '' : guid++);\n            }\n            this.insertNode(startNode);\n            if (endNode) {\n                this.collapse().insertNode(endNode).setEndBefore(endNode);\n            }\n            this.setStartAfter(startNode);\n            return {\n                start:serialize ? startNode.id : startNode,\n                end:endNode ? serialize ? endNode.id : endNode : null,\n                id:serialize\n            }\n        },\n\n        /**\n         *  调整当前range的边界到书签位置，并删除该书签对象所标记的位置内的节点\n         *  @method  moveToBookmark\n         *  @param { BookMark } bookmark createBookmark所创建的标签对象\n         *  @return { UE.dom.Range } 当前range对象\n         *  @see UE.dom.Range:createBookmark(Boolean)\n         */\n        moveToBookmark:function (bookmark) {\n            var start = bookmark.id ? this.document.getElementById(bookmark.start) : bookmark.start,\n                end = bookmark.end && bookmark.id ? this.document.getElementById(bookmark.end) : bookmark.end;\n            this.setStartBefore(start);\n            domUtils.remove(start);\n            if (end) {\n                this.setEndBefore(end);\n                domUtils.remove(end);\n            } else {\n                this.collapse(true);\n            }\n            return this;\n        },\n\n        /**\n         * 调整range的边界，使其\"放大\"到最近的父节点\n         * @method  enlarge\n         * @remind 会引起选区的变化\n         * @return { UE.dom.Range } 当前range对象\n         */\n\n        /**\n         * 调整range的边界，使其\"放大\"到最近的父节点，根据参数 toBlock 的取值， 可以\n         * 要求扩大之后的父节点是block节点\n         * @method  enlarge\n         * @param { Boolean } toBlock 是否要求扩大之后的父节点必须是block节点\n         * @return { UE.dom.Range } 当前range对象\n         */\n        enlarge:function (toBlock, stopFn) {\n            var isBody = domUtils.isBody,\n                pre, node, tmp = this.document.createTextNode('');\n            if (toBlock) {\n                node = this.startContainer;\n                if (node.nodeType == 1) {\n                    if (node.childNodes[this.startOffset]) {\n                        pre = node = node.childNodes[this.startOffset]\n                    } else {\n                        node.appendChild(tmp);\n                        pre = node = tmp;\n                    }\n                } else {\n                    pre = node;\n                }\n                while (1) {\n                    if (domUtils.isBlockElm(node)) {\n                        node = pre;\n                        while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) {\n                            node = pre;\n                        }\n                        this.setStartBefore(node);\n                        break;\n                    }\n                    pre = node;\n                    node = node.parentNode;\n                }\n                node = this.endContainer;\n                if (node.nodeType == 1) {\n                    if (pre = node.childNodes[this.endOffset]) {\n                        node.insertBefore(tmp, pre);\n                    } else {\n                        node.appendChild(tmp);\n                    }\n                    pre = node = tmp;\n                } else {\n                    pre = node;\n                }\n                while (1) {\n                    if (domUtils.isBlockElm(node)) {\n                        node = pre;\n                        while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) {\n                            node = pre;\n                        }\n                        this.setEndAfter(node);\n                        break;\n                    }\n                    pre = node;\n                    node = node.parentNode;\n                }\n                if (tmp.parentNode === this.endContainer) {\n                    this.endOffset--;\n                }\n                domUtils.remove(tmp);\n            }\n\n            // 扩展边界到最大\n            if (!this.collapsed) {\n                while (this.startOffset == 0) {\n                    if (stopFn && stopFn(this.startContainer)) {\n                        break;\n                    }\n                    if (isBody(this.startContainer)) {\n                        break;\n                    }\n                    this.setStartBefore(this.startContainer);\n                }\n                while (this.endOffset == (this.endContainer.nodeType == 1 ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length)) {\n                    if (stopFn && stopFn(this.endContainer)) {\n                        break;\n                    }\n                    if (isBody(this.endContainer)) {\n                        break;\n                    }\n                    this.setEndAfter(this.endContainer);\n                }\n            }\n            return this;\n        },\n        enlargeToBlockElm:function(ignoreEnd){\n            while(!domUtils.isBlockElm(this.startContainer)){\n                this.setStartBefore(this.startContainer);\n            }\n            if(!ignoreEnd){\n                while(!domUtils.isBlockElm(this.endContainer)){\n                    this.setEndAfter(this.endContainer);\n                }\n            }\n            return this;\n        },\n        /**\n         * 调整Range的边界，使其\"缩小\"到最合适的位置\n         * @method adjustmentBoundary\n         * @return { UE.dom.Range } 当前range对象\n         * @see UE.dom.Range:shrinkBoundary()\n         */\n        adjustmentBoundary:function () {\n            if (!this.collapsed) {\n                while (!domUtils.isBody(this.startContainer) &&\n                    this.startOffset == this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length &&\n                    this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length\n                    ) {\n\n                    this.setStartAfter(this.startContainer);\n                }\n                while (!domUtils.isBody(this.endContainer) && !this.endOffset &&\n                    this.endContainer[this.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length\n                    ) {\n                    this.setEndBefore(this.endContainer);\n                }\n            }\n            return this;\n        },\n\n        /**\n         * 给range选区中的内容添加给定的inline标签\n         * @method applyInlineStyle\n         * @param { String } tagName 需要添加的标签名\n         * @example\n         * ```html\n         * <p>xxxx[xxxx]x</p>  ==>  range.applyInlineStyle(\"strong\")  ==>  <p>xxxx[<strong>xxxx</strong>]x</p>\n         * ```\n         */\n\n        /**\n         * 给range选区中的内容添加给定的inline标签， 并且为标签附加上一些初始化属性。\n         * @method applyInlineStyle\n         * @param { String } tagName 需要添加的标签名\n         * @param { Object } attrs 跟随新添加的标签的属性\n         * @return { UE.dom.Range } 当前选区\n         * @example\n         * ```html\n         * <p>xxxx[xxxx]x</p>\n         *\n         * ==>\n         *\n         * <!-- 执行操作 -->\n         * range.applyInlineStyle(\"strong\",{\"style\":\"font-size:12px\"})\n         *\n         * ==>\n         *\n         * <p>xxxx[<strong style=\"font-size:12px\">xxxx</strong>]x</p>\n         * ```\n         */\n        applyInlineStyle:function (tagName, attrs, list) {\n            if (this.collapsed)return this;\n            this.trimBoundary().enlarge(false,\n                function (node) {\n                    return node.nodeType == 1 && domUtils.isBlockElm(node)\n                }).adjustmentBoundary();\n            var bookmark = this.createBookmark(),\n                end = bookmark.end,\n                filterFn = function (node) {\n                    return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node);\n                },\n                current = domUtils.getNextDomNode(bookmark.start, false, filterFn),\n                node,\n                pre,\n                range = this.cloneRange();\n            while (current && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) {\n                if (current.nodeType == 3 || dtd[tagName][current.tagName]) {\n                    range.setStartBefore(current);\n                    node = current;\n                    while (node && (node.nodeType == 3 || dtd[tagName][node.tagName]) && node !== end) {\n                        pre = node;\n                        node = domUtils.getNextDomNode(node, node.nodeType == 1, null, function (parent) {\n                            return dtd[tagName][parent.tagName];\n                        });\n                    }\n                    var frag = range.setEndAfter(pre).extractContents(), elm;\n                    if (list && list.length > 0) {\n                        var level, top;\n                        top = level = list[0].cloneNode(false);\n                        for (var i = 1, ci; ci = list[i++];) {\n                            level.appendChild(ci.cloneNode(false));\n                            level = level.firstChild;\n                        }\n                        elm = level;\n                    } else {\n                        elm = range.document.createElement(tagName);\n                    }\n                    if (attrs) {\n                        domUtils.setAttributes(elm, attrs);\n                    }\n                    elm.appendChild(frag);\n                    range.insertNode(list ? top : elm);\n                    //处理下滑线在a上的情况\n                    var aNode;\n                    if (tagName == 'span' && attrs.style && /text\\-decoration/.test(attrs.style) && (aNode = domUtils.findParentByTagName(elm, 'a', true))) {\n                        domUtils.setAttributes(aNode, attrs);\n                        domUtils.remove(elm, true);\n                        elm = aNode;\n                    } else {\n                        domUtils.mergeSibling(elm);\n                        domUtils.clearEmptySibling(elm);\n                    }\n                    //去除子节点相同的\n                    domUtils.mergeChild(elm, attrs);\n                    current = domUtils.getNextDomNode(elm, false, filterFn);\n                    domUtils.mergeToParent(elm);\n                    if (node === end) {\n                        break;\n                    }\n                } else {\n                    current = domUtils.getNextDomNode(current, true, filterFn);\n                }\n            }\n            return this.moveToBookmark(bookmark);\n        },\n\n        /**\n         * 移除当前选区内指定的inline标签，但保留其中的内容\n         * @method removeInlineStyle\n         * @param { String } tagName 需要移除的标签名\n         * @return { UE.dom.Range } 当前的range对象\n         * @example\n         * ```html\n         * xx[x<span>xxx<em>yyy</em>zz]z</span>  => range.removeInlineStyle([\"em\"])  => xx[x<span>xxxyyyzz]z</span>\n         * ```\n         */\n\n        /**\n         * 移除当前选区内指定的一组inline标签，但保留其中的内容\n         * @method removeInlineStyle\n         * @param { Array } tagNameArr 需要移除的标签名的数组\n         * @return { UE.dom.Range } 当前的range对象\n         * @see UE.dom.Range:removeInlineStyle(String)\n         */\n        removeInlineStyle:function (tagNames) {\n            if (this.collapsed)return this;\n            tagNames = utils.isArray(tagNames) ? tagNames : [tagNames];\n            this.shrinkBoundary().adjustmentBoundary();\n            var start = this.startContainer, end = this.endContainer;\n            while (1) {\n                if (start.nodeType == 1) {\n                    if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) {\n                        break;\n                    }\n                    if (start.tagName.toLowerCase() == 'body') {\n                        start = null;\n                        break;\n                    }\n                }\n                start = start.parentNode;\n            }\n            while (1) {\n                if (end.nodeType == 1) {\n                    if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) {\n                        break;\n                    }\n                    if (end.tagName.toLowerCase() == 'body') {\n                        end = null;\n                        break;\n                    }\n                }\n                end = end.parentNode;\n            }\n            var bookmark = this.createBookmark(),\n                frag,\n                tmpRange;\n            if (start) {\n                tmpRange = this.cloneRange().setEndBefore(bookmark.start).setStartBefore(start);\n                frag = tmpRange.extractContents();\n                tmpRange.insertNode(frag);\n                domUtils.clearEmptySibling(start, true);\n                start.parentNode.insertBefore(bookmark.start, start);\n            }\n            if (end) {\n                tmpRange = this.cloneRange().setStartAfter(bookmark.end).setEndAfter(end);\n                frag = tmpRange.extractContents();\n                tmpRange.insertNode(frag);\n                domUtils.clearEmptySibling(end, false, true);\n                end.parentNode.insertBefore(bookmark.end, end.nextSibling);\n            }\n            var current = domUtils.getNextDomNode(bookmark.start, false, function (node) {\n                return node.nodeType == 1;\n            }), next;\n            while (current && current !== bookmark.end) {\n                next = domUtils.getNextDomNode(current, true, function (node) {\n                    return node.nodeType == 1;\n                });\n                if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) {\n                    domUtils.remove(current, true);\n                }\n                current = next;\n            }\n            return this.moveToBookmark(bookmark);\n        },\n\n        /**\n         * 获取当前选中的自闭合的节点\n         * @method  getClosedNode\n         * @return { Node | NULL } 如果当前选中的是自闭合节点， 则返回该节点， 否则返回NULL\n         */\n        getClosedNode:function () {\n            var node;\n            if (!this.collapsed) {\n                var range = this.cloneRange().adjustmentBoundary().shrinkBoundary();\n                if (selectOneNode(range)) {\n                    var child = range.startContainer.childNodes[range.startOffset];\n                    if (child && child.nodeType == 1 && (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName])) {\n                        node = child;\n                    }\n                }\n            }\n            return node;\n        },\n\n        /**\n         * 在页面上高亮range所表示的选区\n         * @method select\n         * @return { UE.dom.Range } 返回当前Range对象\n         */\n            //这里不区分ie9以上，trace:3824\n        select:browser.ie ? function (noFillData, textRange) {\n            var nativeRange;\n            if (!this.collapsed)\n                this.shrinkBoundary();\n            var node = this.getClosedNode();\n            if (node && !textRange) {\n                try {\n                    nativeRange = this.document.body.createControlRange();\n                    nativeRange.addElement(node);\n                    nativeRange.select();\n                } catch (e) {}\n                return this;\n            }\n            var bookmark = this.createBookmark(),\n                start = bookmark.start,\n                end;\n            nativeRange = this.document.body.createTextRange();\n            nativeRange.moveToElementText(start);\n            nativeRange.moveStart('character', 1);\n            if (!this.collapsed) {\n                var nativeRangeEnd = this.document.body.createTextRange();\n                end = bookmark.end;\n                nativeRangeEnd.moveToElementText(end);\n                nativeRange.setEndPoint('EndToEnd', nativeRangeEnd);\n            } else {\n                if (!noFillData && this.startContainer.nodeType != 3) {\n                    //使用<span>|x<span>固定住光标\n                    var tmpText = this.document.createTextNode(fillChar),\n                        tmp = this.document.createElement('span');\n                    tmp.appendChild(this.document.createTextNode(fillChar));\n                    start.parentNode.insertBefore(tmp, start);\n                    start.parentNode.insertBefore(tmpText, start);\n                    //当点b,i,u时，不能清除i上边的b\n                    removeFillData(this.document, tmpText);\n                    fillData = tmpText;\n                    mergeSibling(tmp, 'previousSibling');\n                    mergeSibling(start, 'nextSibling');\n                    nativeRange.moveStart('character', -1);\n                    nativeRange.collapse(true);\n                }\n            }\n            this.moveToBookmark(bookmark);\n            tmp && domUtils.remove(tmp);\n            //IE在隐藏状态下不支持range操作，catch一下\n            try {\n                nativeRange.select();\n            } catch (e) {\n            }\n            return this;\n        } : function (notInsertFillData) {\n            function checkOffset(rng){\n\n                function check(node,offset,dir){\n                    if(node.nodeType == 3 && node.nodeValue.length < offset){\n                        rng[dir + 'Offset'] = node.nodeValue.length\n                    }\n                }\n                check(rng.startContainer,rng.startOffset,'start');\n                check(rng.endContainer,rng.endOffset,'end');\n            }\n            var win = domUtils.getWindow(this.document),\n                sel = win.getSelection(),\n                txtNode;\n            //FF下关闭自动长高时滚动条在关闭dialog时会跳\n            //ff下如果不body.focus将不能定位闭合光标到编辑器内\n            browser.gecko ? this.document.body.focus() : win.focus();\n            if (sel) {\n                sel.removeAllRanges();\n                // trace:870 chrome/safari后边是br对于闭合得range不能定位 所以去掉了判断\n                // this.startContainer.nodeType != 3 &&! ((child = this.startContainer.childNodes[this.startOffset]) && child.nodeType == 1 && child.tagName == 'BR'\n                if (this.collapsed && !notInsertFillData) {\n//                    //opear如果没有节点接着，原生的不能够定位,不能在body的第一级插入空白节点\n//                    if (notInsertFillData && browser.opera && !domUtils.isBody(this.startContainer) && this.startContainer.nodeType == 1) {\n//                        var tmp = this.document.createTextNode('');\n//                        this.insertNode(tmp).setStart(tmp, 0).collapse(true);\n//                    }\n//\n                    //处理光标落在文本节点的情况\n                    //处理以下的情况\n                    //<b>|xxxx</b>\n                    //<b>xxxx</b>|xxxx\n                    //xxxx<b>|</b>\n                    var start = this.startContainer,child = start;\n                    if(start.nodeType == 1){\n                        child = start.childNodes[this.startOffset];\n\n                    }\n                    if( !(start.nodeType == 3 && this.startOffset)  &&\n                        (child ?\n                            (!child.previousSibling || child.previousSibling.nodeType != 3)\n                            :\n                            (!start.lastChild || start.lastChild.nodeType != 3)\n                        )\n                    ){\n                        txtNode = this.document.createTextNode(fillChar);\n                        //跟着前边走\n                        this.insertNode(txtNode);\n                        removeFillData(this.document, txtNode);\n                        mergeSibling(txtNode, 'previousSibling');\n                        mergeSibling(txtNode, 'nextSibling');\n                        fillData = txtNode;\n                        this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true);\n                    }\n                }\n                var nativeRange = this.document.createRange();\n                if(this.collapsed && browser.opera && this.startContainer.nodeType == 1){\n                    var child = this.startContainer.childNodes[this.startOffset];\n                    if(!child){\n                        //往前靠拢\n                        child = this.startContainer.lastChild;\n                        if( child && domUtils.isBr(child)){\n                            this.setStartBefore(child).collapse(true);\n                        }\n                    }else{\n                        //向后靠拢\n                        while(child && domUtils.isBlockElm(child)){\n                            if(child.nodeType == 1 && child.childNodes[0]){\n                                child = child.childNodes[0]\n                            }else{\n                                break;\n                            }\n                        }\n                        child && this.setStartBefore(child).collapse(true)\n                    }\n\n                }\n                //是createAddress最后一位算的不准，现在这里进行微调\n                checkOffset(this);\n                nativeRange.setStart(this.startContainer, this.startOffset);\n                nativeRange.setEnd(this.endContainer, this.endOffset);\n                sel.addRange(nativeRange);\n            }\n            return this;\n        },\n\n        /**\n         * 滚动到当前range开始的位置\n         * @method scrollToView\n         * @param { Window } win 当前range对象所属的window对象\n         * @return { UE.dom.Range } 当前Range对象\n         */\n\n        /**\n         * 滚动到距离当前range开始位置 offset 的位置处\n         * @method scrollToView\n         * @param { Window } win 当前range对象所属的window对象\n         * @param { Number } offset 距离range开始位置处的偏移量， 如果为正数， 则向下偏移， 反之， 则向上偏移\n         * @return { UE.dom.Range } 当前Range对象\n         */\n        scrollToView:function (win, offset) {\n            win = win ? window : domUtils.getWindow(this.document);\n            var me = this,\n                span = me.document.createElement('span');\n            //trace:717\n            span.innerHTML = '&nbsp;';\n            me.cloneRange().insertNode(span);\n            domUtils.scrollToView(span, win, offset);\n            domUtils.remove(span);\n            return me;\n        },\n\n        /**\n         * 判断当前选区内容是否占位符\n         * @private\n         * @method inFillChar\n         * @return { Boolean } 如果是占位符返回true，否则返回false\n         */\n        inFillChar : function(){\n            var start = this.startContainer;\n            if(this.collapsed && start.nodeType == 3\n                && start.nodeValue.replace(new RegExp('^' + domUtils.fillChar),'').length + 1 == start.nodeValue.length\n                ){\n                return true;\n            }\n            return false;\n        },\n\n        /**\n         * 保存\n         * @method createAddress\n         * @private\n         * @return { Boolean } 返回开始和结束的位置\n         * @example\n         * ```html\n         * <body>\n         *     <p>\n         *         aaaa\n         *         <em>\n         *             <!-- 选区开始 -->\n         *             bbbb\n         *             <!-- 选区结束 -->\n         *         </em>\n         *     </p>\n         *\n         *     <script>\n         *         //output: {startAddress:[0,1,0,0],endAddress:[0,1,0,4]}\n         *         console.log( range.createAddress() );\n         *     </script>\n         * </body>\n         * ```\n         */\n        createAddress : function(ignoreEnd,ignoreTxt){\n            var addr = {},me = this;\n\n            function getAddress(isStart){\n                var node = isStart ? me.startContainer : me.endContainer;\n                var parents = domUtils.findParents(node,true,function(node){return !domUtils.isBody(node)}),\n                    addrs = [];\n                for(var i = 0,ci;ci = parents[i++];){\n                    addrs.push(domUtils.getNodeIndex(ci,ignoreTxt));\n                }\n                var firstIndex = 0;\n\n                if(ignoreTxt){\n                    if(node.nodeType == 3){\n                        var tmpNode = node.previousSibling;\n                        while(tmpNode && tmpNode.nodeType == 3){\n                            firstIndex += tmpNode.nodeValue.replace(fillCharReg,'').length;\n                            tmpNode = tmpNode.previousSibling;\n                        }\n                        firstIndex +=  (isStart ? me.startOffset : me.endOffset)// - (fillCharReg.test(node.nodeValue) ? 1 : 0 )\n                    }else{\n                        node =  node.childNodes[ isStart ? me.startOffset : me.endOffset];\n                        if(node){\n                            firstIndex = domUtils.getNodeIndex(node,ignoreTxt);\n                        }else{\n                            node = isStart ? me.startContainer : me.endContainer;\n                            var first = node.firstChild;\n                            while(first){\n                                if(domUtils.isFillChar(first)){\n                                    first = first.nextSibling;\n                                    continue;\n                                }\n                                firstIndex++;\n                                if(first.nodeType == 3){\n                                    while( first && first.nodeType == 3){\n                                        first = first.nextSibling;\n                                    }\n                                }else{\n                                    first = first.nextSibling;\n                                }\n                            }\n                        }\n                    }\n\n                }else{\n                    firstIndex = isStart ? domUtils.isFillChar(node) ? 0 : me.startOffset  : me.endOffset\n                }\n                if(firstIndex < 0){\n                    firstIndex = 0;\n                }\n                addrs.push(firstIndex);\n                return addrs;\n            }\n            addr.startAddress = getAddress(true);\n            if(!ignoreEnd){\n                addr.endAddress = me.collapsed ? [].concat(addr.startAddress) : getAddress();\n            }\n            return addr;\n        },\n\n        /**\n         * 保存\n         * @method createAddress\n         * @private\n         * @return { Boolean } 返回开始和结束的位置\n         * @example\n         * ```html\n         * <body>\n         *     <p>\n         *         aaaa\n         *         <em>\n         *             <!-- 选区开始 -->\n         *             bbbb\n         *             <!-- 选区结束 -->\n         *         </em>\n         *     </p>\n         *\n         *     <script>\n         *         var range = editor.selection.getRange();\n         *         range.moveToAddress({startAddress:[0,1,0,0],endAddress:[0,1,0,4]});\n         *         range.select();\n         *         //output: 'bbbb'\n         *         console.log(editor.selection.getText());\n         *     </script>\n         * </body>\n         * ```\n         */\n        moveToAddress : function(addr,ignoreEnd){\n            var me = this;\n            function getNode(address,isStart){\n                var tmpNode = me.document.body,\n                    parentNode,offset;\n                for(var i= 0,ci,l=address.length;i<l;i++){\n                    ci = address[i];\n                    parentNode = tmpNode;\n                    tmpNode = tmpNode.childNodes[ci];\n                    if(!tmpNode){\n                        offset = ci;\n                        break;\n                    }\n                }\n                if(isStart){\n                    if(tmpNode){\n                        me.setStartBefore(tmpNode)\n                    }else{\n                        me.setStart(parentNode,offset)\n                    }\n                }else{\n                    if(tmpNode){\n                        me.setEndBefore(tmpNode)\n                    }else{\n                        me.setEnd(parentNode,offset)\n                    }\n                }\n            }\n            getNode(addr.startAddress,true);\n            !ignoreEnd && addr.endAddress &&  getNode(addr.endAddress);\n            return me;\n        },\n\n        /**\n         * 判断给定的Range对象是否和当前Range对象表示的是同一个选区\n         * @method equals\n         * @param { UE.dom.Range } 需要判断的Range对象\n         * @return { Boolean } 如果给定的Range对象与当前Range对象表示的是同一个选区， 则返回true， 否则返回false\n         */\n        equals : function(rng){\n            for(var p in this){\n                if(this.hasOwnProperty(p)){\n                    if(this[p] !== rng[p])\n                        return false\n                }\n            }\n            return true;\n\n        },\n\n        /**\n         * 遍历range内的节点。每当遍历一个节点时， 都会执行参数项 doFn 指定的函数， 该函数的接受当前遍历的节点\n         * 作为其参数。\n         * @method traversal\n         * @param { Function }  doFn 对每个遍历的节点要执行的方法， 该方法接受当前遍历的节点作为其参数\n         * @return { UE.dom.Range } 当前range对象\n         * @example\n         * ```html\n         *\n         * <body>\n         *\n         *     <!-- 选区开始 -->\n         *     <span></span>\n         *     <a></a>\n         *     <!-- 选区结束 -->\n         * </body>\n         *\n         * <script>\n         *\n         *     //output: <span></span><a></a>\n         *     console.log( range.cloneContents() );\n         *\n         *     range.traversal( function ( node ) {\n         *\n         *         if ( node.nodeType === 1 ) {\n         *             node.className = \"test\";\n         *         }\n         *\n         *     } );\n         *\n         *     //output: <span class=\"test\"></span><a class=\"test\"></a>\n         *     console.log( range.cloneContents() );\n         *\n         * </script>\n         * ```\n         */\n\n        /**\n         * 遍历range内的节点。\n         * 每当遍历一个节点时， 都会执行参数项 doFn 指定的函数， 该函数的接受当前遍历的节点\n         * 作为其参数。\n         * 可以通过参数项 filterFn 来指定一个过滤器， 只有符合该过滤器过滤规则的节点才会触\n         * 发doFn函数的执行\n         * @method traversal\n         * @param { Function } doFn 对每个遍历的节点要执行的方法， 该方法接受当前遍历的节点作为其参数\n         * @param { Function } filterFn 过滤器， 该函数接受当前遍历的节点作为参数， 如果该节点满足过滤\n         *                      规则， 请返回true， 该节点会触发doFn， 否则， 请返回false， 则该节点不\n         *                      会触发doFn。\n         * @return { UE.dom.Range } 当前range对象\n         * @see UE.dom.Range:traversal(Function)\n         * @example\n         * ```html\n         *\n         * <body>\n         *\n         *     <!-- 选区开始 -->\n         *     <span></span>\n         *     <a></a>\n         *     <!-- 选区结束 -->\n         * </body>\n         *\n         * <script>\n         *\n         *     //output: <span></span><a></a>\n         *     console.log( range.cloneContents() );\n         *\n         *     range.traversal( function ( node ) {\n         *\n         *         node.className = \"test\";\n         *\n         *     }, function ( node ) {\n         *          return node.nodeType === 1;\n         *     } );\n         *\n         *     //output: <span class=\"test\"></span><a class=\"test\"></a>\n         *     console.log( range.cloneContents() );\n         *\n         * </script>\n         * ```\n         */\n        traversal:function(doFn,filterFn){\n            if (this.collapsed)\n                return this;\n            var bookmark = this.createBookmark(),\n                end = bookmark.end,\n                current = domUtils.getNextDomNode(bookmark.start, false, filterFn);\n            while (current && current !== end && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) {\n                var tmpNode = domUtils.getNextDomNode(current,false,filterFn);\n                doFn(current);\n                current = tmpNode;\n            }\n            return this.moveToBookmark(bookmark);\n        }\n    };\n})();\n\n// core/Selection.js\n/**\n * 选集\n * @file\n * @module UE.dom\n * @class Selection\n * @since 1.2.6.1\n */\n\n/**\n * 选区集合\n * @unfile\n * @module UE.dom\n * @class Selection\n */\n(function () {\n\n    function getBoundaryInformation( range, start ) {\n        var getIndex = domUtils.getNodeIndex;\n        range = range.duplicate();\n        range.collapse( start );\n        var parent = range.parentElement();\n        //如果节点里没有子节点，直接退出\n        if ( !parent.hasChildNodes() ) {\n            return  {container:parent, offset:0};\n        }\n        var siblings = parent.children,\n            child,\n            testRange = range.duplicate(),\n            startIndex = 0, endIndex = siblings.length - 1, index = -1,\n            distance;\n        while ( startIndex <= endIndex ) {\n            index = Math.floor( (startIndex + endIndex) / 2 );\n            child = siblings[index];\n            testRange.moveToElementText( child );\n            var position = testRange.compareEndPoints( 'StartToStart', range );\n            if ( position > 0 ) {\n                endIndex = index - 1;\n            } else if ( position < 0 ) {\n                startIndex = index + 1;\n            } else {\n                //trace:1043\n                return  {container:parent, offset:getIndex( child )};\n            }\n        }\n        if ( index == -1 ) {\n            testRange.moveToElementText( parent );\n            testRange.setEndPoint( 'StartToStart', range );\n            distance = testRange.text.replace( /(\\r\\n|\\r)/g, '\\n' ).length;\n            siblings = parent.childNodes;\n            if ( !distance ) {\n                child = siblings[siblings.length - 1];\n                return  {container:child, offset:child.nodeValue.length};\n            }\n\n            var i = siblings.length;\n            while ( distance > 0 ){\n                distance -= siblings[ --i ].nodeValue.length;\n            }\n            return {container:siblings[i], offset:-distance};\n        }\n        testRange.collapse( position > 0 );\n        testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range );\n        distance = testRange.text.replace( /(\\r\\n|\\r)/g, '\\n' ).length;\n        if ( !distance ) {\n            return  dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ?\n            {container:parent, offset:getIndex( child ) + (position > 0 ? 0 : 1)} :\n            {container:child, offset:position > 0 ? 0 : child.childNodes.length}\n        }\n        while ( distance > 0 ) {\n            try {\n                var pre = child;\n                child = child[position > 0 ? 'previousSibling' : 'nextSibling'];\n                distance -= child.nodeValue.length;\n            } catch ( e ) {\n                return {container:parent, offset:getIndex( pre )};\n            }\n        }\n        return  {container:child, offset:position > 0 ? -distance : child.nodeValue.length + distance}\n    }\n\n    /**\n     * 将ieRange转换为Range对象\n     * @param {Range}   ieRange    ieRange对象\n     * @param {Range}   range      Range对象\n     * @return  {Range}  range       返回转换后的Range对象\n     */\n    function transformIERangeToRange( ieRange, range ) {\n        if ( ieRange.item ) {\n            range.selectNode( ieRange.item( 0 ) );\n        } else {\n            var bi = getBoundaryInformation( ieRange, true );\n            range.setStart( bi.container, bi.offset );\n            if ( ieRange.compareEndPoints( 'StartToEnd', ieRange ) != 0 ) {\n                bi = getBoundaryInformation( ieRange, false );\n                range.setEnd( bi.container, bi.offset );\n            }\n        }\n        return range;\n    }\n\n    /**\n     * 获得ieRange\n     * @param {Selection} sel    Selection对象\n     * @return {ieRange}    得到ieRange\n     */\n    function _getIERange( sel ) {\n        var ieRange;\n        //ie下有可能报错\n        try {\n            ieRange = sel.getNative().createRange();\n        } catch ( e ) {\n            return null;\n        }\n        var el = ieRange.item ? ieRange.item( 0 ) : ieRange.parentElement();\n        if ( ( el.ownerDocument || el ) === sel.document ) {\n            return ieRange;\n        }\n        return null;\n    }\n\n    var Selection = dom.Selection = function ( doc ) {\n        var me = this, iframe;\n        me.document = doc;\n        if ( browser.ie9below ) {\n            iframe = domUtils.getWindow( doc ).frameElement;\n            domUtils.on( iframe, 'beforedeactivate', function () {\n                me._bakIERange = me.getIERange();\n            } );\n            domUtils.on( iframe, 'activate', function () {\n                try {\n                    if ( !_getIERange( me ) && me._bakIERange ) {\n                        me._bakIERange.select();\n                    }\n                } catch ( ex ) {\n                }\n                me._bakIERange = null;\n            } );\n        }\n        iframe = doc = null;\n    };\n\n    Selection.prototype = {\n\n        rangeInBody : function(rng,txtRange){\n            var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer;\n\n            return node === this.document.body || domUtils.inDoc(node,this.document);\n        },\n\n        /**\n         * 获取原生seleciton对象\n         * @method getNative\n         * @return { Object } 获得selection对象\n         * @example\n         * ```javascript\n         * editor.selection.getNative();\n         * ```\n         */\n        getNative:function () {\n            var doc = this.document;\n            try {\n                return !doc ? null : browser.ie9below ? doc.selection : domUtils.getWindow( doc ).getSelection();\n            } catch ( e ) {\n                return null;\n            }\n        },\n\n        /**\n         * 获得ieRange\n         * @method getIERange\n         * @return { Object } 返回ie原生的Range\n         * @example\n         * ```javascript\n         * editor.selection.getIERange();\n         * ```\n         */\n        getIERange:function () {\n            var ieRange = _getIERange( this );\n            if ( !ieRange ) {\n                if ( this._bakIERange ) {\n                    return this._bakIERange;\n                }\n            }\n            return ieRange;\n        },\n\n        /**\n         * 缓存当前选区的range和选区的开始节点\n         * @method cache\n         */\n        cache:function () {\n            this.clear();\n            this._cachedRange = this.getRange();\n            this._cachedStartElement = this.getStart();\n            this._cachedStartElementPath = this.getStartElementPath();\n        },\n\n        /**\n         * 获取选区开始位置的父节点到body\n         * @method getStartElementPath\n         * @return { Array } 返回父节点集合\n         * @example\n         * ```javascript\n         * editor.selection.getStartElementPath();\n         * ```\n         */\n        getStartElementPath:function () {\n            if ( this._cachedStartElementPath ) {\n                return this._cachedStartElementPath;\n            }\n            var start = this.getStart();\n            if ( start ) {\n                return domUtils.findParents( start, true, null, true )\n            }\n            return [];\n        },\n\n        /**\n         * 清空缓存\n         * @method clear\n         */\n        clear:function () {\n            this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null;\n        },\n\n        /**\n         * 编辑器是否得到了选区\n         * @method isFocus\n         */\n        isFocus:function () {\n            try {\n                if(browser.ie9below){\n\n                    var nativeRange = _getIERange(this);\n                    return !!(nativeRange && this.rangeInBody(nativeRange));\n                }else{\n                    return !!this.getNative().rangeCount;\n                }\n            } catch ( e ) {\n                return false;\n            }\n\n        },\n\n        /**\n         * 获取选区对应的Range\n         * @method getRange\n         * @return { Object } 得到Range对象\n         * @example\n         * ```javascript\n         * editor.selection.getRange();\n         * ```\n         */\n        getRange:function () {\n            var me = this;\n            function optimze( range ) {\n                var child = me.document.body.firstChild,\n                    collapsed = range.collapsed;\n                while ( child && child.firstChild ) {\n                    range.setStart( child, 0 );\n                    child = child.firstChild;\n                }\n                if ( !range.startContainer ) {\n                    range.setStart( me.document.body, 0 )\n                }\n                if ( collapsed ) {\n                    range.collapse( true );\n                }\n            }\n\n            if ( me._cachedRange != null ) {\n                return this._cachedRange;\n            }\n            var range = new baidu.editor.dom.Range( me.document );\n\n            if ( browser.ie9below ) {\n                var nativeRange = me.getIERange();\n                if ( nativeRange ) {\n                    //备份的_bakIERange可能已经实效了，dom树发生了变化比如从源码模式切回来，所以try一下，实效就放到body开始位置\n                    try{\n                        transformIERangeToRange( nativeRange, range );\n                    }catch(e){\n                        optimze( range );\n                    }\n\n                } else {\n                    optimze( range );\n                }\n            } else {\n                var sel = me.getNative();\n                if ( sel && sel.rangeCount ) {\n                    var firstRange = sel.getRangeAt( 0 );\n                    var lastRange = sel.getRangeAt( sel.rangeCount - 1 );\n                    range.setStart( firstRange.startContainer, firstRange.startOffset ).setEnd( lastRange.endContainer, lastRange.endOffset );\n                    if ( range.collapsed && domUtils.isBody( range.startContainer ) && !range.startOffset ) {\n                        optimze( range );\n                    }\n                } else {\n                    //trace:1734 有可能已经不在dom树上了，标识的节点\n                    if ( this._bakRange && domUtils.inDoc( this._bakRange.startContainer, this.document ) ){\n                        return this._bakRange;\n                    }\n                    optimze( range );\n                }\n            }\n            return this._bakRange = range;\n        },\n\n        /**\n         * 获取开始元素，用于状态反射\n         * @method getStart\n         * @return { Element } 获得开始元素\n         * @example\n         * ```javascript\n         * editor.selection.getStart();\n         * ```\n         */\n        getStart:function () {\n            if ( this._cachedStartElement ) {\n                return this._cachedStartElement;\n            }\n            var range = browser.ie9below ? this.getIERange() : this.getRange(),\n                tmpRange,\n                start, tmp, parent;\n            if ( browser.ie9below ) {\n                if ( !range ) {\n                    //todo 给第一个值可能会有问题\n                    return this.document.body.firstChild;\n                }\n                //control元素\n                if ( range.item ){\n                    return range.item( 0 );\n                }\n                tmpRange = range.duplicate();\n                //修正ie下<b>x</b>[xx] 闭合后 <b>x|</b>xx\n                tmpRange.text.length > 0 && tmpRange.moveStart( 'character', 1 );\n                tmpRange.collapse( 1 );\n                start = tmpRange.parentElement();\n                parent = tmp = range.parentElement();\n                while ( tmp = tmp.parentNode ) {\n                    if ( tmp == start ) {\n                        start = parent;\n                        break;\n                    }\n                }\n            } else {\n                range.shrinkBoundary();\n                start = range.startContainer;\n                if ( start.nodeType == 1 && start.hasChildNodes() ){\n                    start = start.childNodes[Math.min( start.childNodes.length - 1, range.startOffset )];\n                }\n                if ( start.nodeType == 3 ){\n                    return start.parentNode;\n                }\n            }\n            return start;\n        },\n\n        /**\n         * 得到选区中的文本\n         * @method getText\n         * @return { String } 选区中包含的文本\n         * @example\n         * ```javascript\n         * editor.selection.getText();\n         * ```\n         */\n        getText:function () {\n            var nativeSel, nativeRange;\n            if ( this.isFocus() && (nativeSel = this.getNative()) ) {\n                nativeRange = browser.ie9below ? nativeSel.createRange() : nativeSel.getRangeAt( 0 );\n                return browser.ie9below ? nativeRange.text : nativeRange.toString();\n            }\n            return '';\n        },\n\n        /**\n         * 清除选区\n         * @method clearRange\n         * @example\n         * ```javascript\n         * editor.selection.clearRange();\n         * ```\n         */\n        clearRange : function(){\n            this.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges']();\n        }\n    };\n})();\n\n// core/Editor.js\n/**\n * 编辑器主类，包含编辑器提供的大部分公用接口\n * @file\n * @module UE\n * @class Editor\n * @since 1.2.6.1\n */\n\n/**\n * UEditor公用空间，UEditor所有的功能都挂载在该空间下\n * @unfile\n * @module UE\n */\n\n/**\n * UEditor的核心类，为用户提供与编辑器交互的接口。\n * @unfile\n * @module UE\n * @class Editor\n */\n\n(function () {\n    var uid = 0, _selectionChangeTimer;\n\n    /**\n     * 获取编辑器的html内容，赋值到编辑器所在表单的textarea文本域里面\n     * @private\n     * @method setValue\n     * @param { UE.Editor } editor 编辑器事例\n     */\n    function setValue(form, editor) {\n        var textarea;\n        if (editor.textarea) {\n            if (utils.isString(editor.textarea)) {\n                for (var i = 0, ti, tis = domUtils.getElementsByTagName(form, 'textarea'); ti = tis[i++];) {\n                    if (ti.id == 'ueditor_textarea_' + editor.options.textarea) {\n                        textarea = ti;\n                        break;\n                    }\n                }\n            } else {\n                textarea = editor.textarea;\n            }\n        }\n        if (!textarea) {\n            form.appendChild(textarea = domUtils.createElement(document, 'textarea', {\n                'name': editor.options.textarea,\n                'id': 'ueditor_textarea_' + editor.options.textarea,\n                'style': \"display:none\"\n            }));\n            //不要产生多个textarea\n            editor.textarea = textarea;\n        }\n        !textarea.getAttribute('name') && textarea.setAttribute('name', editor.options.textarea );\n        textarea.value = editor.hasContents() ?\n            (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) :\n            ''\n    }\n    function loadPlugins(me){\n        //初始化插件\n        for (var pi in UE.plugins) {\n            UE.plugins[pi].call(me);\n        }\n\n    }\n    function checkCurLang(I18N){\n        for(var lang in I18N){\n            return lang\n        }\n    }\n\n    function langReadied(me){\n        me.langIsReady = true;\n\n        me.fireEvent(\"langReady\");\n    }\n\n    /**\n     * 编辑器准备就绪后会触发该事件\n     * @module UE\n     * @class Editor\n     * @event ready\n     * @remind render方法执行完成之后,会触发该事件\n     * @remind\n     * @example\n     * ```javascript\n     * editor.addListener( 'ready', function( editor ) {\n     *     editor.execCommand( 'focus' ); //编辑器家在完成后，让编辑器拿到焦点\n     * } );\n     * ```\n     */\n    /**\n     * 执行destroy方法,会触发该事件\n     * @module UE\n     * @class Editor\n     * @event destroy\n     * @see UE.Editor:destroy()\n     */\n    /**\n     * 执行reset方法,会触发该事件\n     * @module UE\n     * @class Editor\n     * @event reset\n     * @see UE.Editor:reset()\n     */\n    /**\n     * 执行focus方法,会触发该事件\n     * @module UE\n     * @class Editor\n     * @event focus\n     * @see UE.Editor:focus(Boolean)\n     */\n    /**\n     * 语言加载完成会触发该事件\n     * @module UE\n     * @class Editor\n     * @event langReady\n     */\n    /**\n     * 运行命令之后会触发该命令\n     * @module UE\n     * @class Editor\n     * @event beforeExecCommand\n     */\n    /**\n     * 运行命令之后会触发该命令\n     * @module UE\n     * @class Editor\n     * @event afterExecCommand\n     */\n    /**\n     * 运行命令之前会触发该命令\n     * @module UE\n     * @class Editor\n     * @event firstBeforeExecCommand\n     */\n    /**\n     * 在getContent方法执行之前会触发该事件\n     * @module UE\n     * @class Editor\n     * @event beforeGetContent\n     * @see UE.Editor:getContent()\n     */\n    /**\n     * 在getContent方法执行之后会触发该事件\n     * @module UE\n     * @class Editor\n     * @event afterGetContent\n     * @see UE.Editor:getContent()\n     */\n    /**\n     * 在getAllHtml方法执行时会触发该事件\n     * @module UE\n     * @class Editor\n     * @event getAllHtml\n     * @see UE.Editor:getAllHtml()\n     */\n    /**\n     * 在setContent方法执行之前会触发该事件\n     * @module UE\n     * @class Editor\n     * @event beforeSetContent\n     * @see UE.Editor:setContent(String)\n     */\n    /**\n     * 在setContent方法执行之后会触发该事件\n     * @module UE\n     * @class Editor\n     * @event afterSetContent\n     * @see UE.Editor:setContent(String)\n     */\n    /**\n     * 每当编辑器内部选区发生改变时，将触发该事件\n     * @event selectionchange\n     * @warning 该事件的触发非常频繁，不建议在该事件的处理过程中做重量级的处理\n     * @example\n     * ```javascript\n     * editor.addListener( 'selectionchange', function( editor ) {\n     *     console.log('选区发生改变');\n     * }\n     */\n    /**\n     * 在所有selectionchange的监听函数执行之前，会触发该事件\n     * @module UE\n     * @class Editor\n     * @event beforeSelectionChange\n     * @see UE.Editor:selectionchange\n     */\n    /**\n     * 在所有selectionchange的监听函数执行完之后，会触发该事件\n     * @module UE\n     * @class Editor\n     * @event afterSelectionChange\n     * @see UE.Editor:selectionchange\n     */\n    /**\n     * 编辑器内容发生改变时会触发该事件\n     * @module UE\n     * @class Editor\n     * @event contentChange\n     */\n\n\n    /**\n     * 以默认参数构建一个编辑器实例\n     * @constructor\n     * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面\n     * @example\n     * ```javascript\n     * var editor = new UE.Editor();\n     * editor.execCommand('blod');\n     * ```\n     * @see UE.Config\n     */\n\n    /**\n     * 以给定的参数集合创建一个编辑器实例，对于未指定的参数，将应用默认参数。\n     * @constructor\n     * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面\n     * @param { Object } setting 创建编辑器的参数\n     * @example\n     * ```javascript\n     * var editor = new UE.Editor();\n     * editor.execCommand('blod');\n     * ```\n     * @see UE.Config\n     */\n    var Editor = UE.Editor = function (options) {\n        var me = this;\n        me.uid = uid++;\n        EventBase.call(me);\n        me.commands = {};\n        me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true);\n        me.shortcutkeys = {};\n        me.inputRules = [];\n        me.outputRules = [];\n        //设置默认的常用属性\n        me.setOpt(Editor.defaultOptions(me));\n\n        /* 尝试异步加载后台配置 */\n        me.loadServerConfig();\n\n        if(!utils.isEmptyObject(UE.I18N)){\n            //修改默认的语言类型\n            me.options.lang = checkCurLang(UE.I18N);\n            UE.plugin.load(me);\n            langReadied(me);\n\n        }else{\n            utils.loadFile(document, {\n                src: me.options.langPath + me.options.lang + \"/\" + me.options.lang + \".js\",\n                tag: \"script\",\n                type: \"text/javascript\",\n                defer: \"defer\"\n            }, function () {\n                UE.plugin.load(me);\n                langReadied(me);\n            });\n        }\n\n        UE.instants['ueditorInstant' + me.uid] = me;\n    };\n    Editor.prototype = {\n         registerCommand : function(name,obj){\n            this.commands[name] = obj;\n         },\n        /**\n         * 编辑器对外提供的监听ready事件的接口， 通过调用该方法，达到的效果与监听ready事件是一致的\n         * @method ready\n         * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready，将会\n         * 立即触发该回调。\n         * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入\n         * @example\n         * ```javascript\n         * editor.ready( function( editor ) {\n         *     editor.setContent('初始化完毕');\n         * } );\n         * ```\n         * @see UE.Editor.event:ready\n         */\n        ready: function (fn) {\n            var me = this;\n            if (fn) {\n                me.isReady ? fn.apply(me) : me.addListener('ready', fn);\n            }\n        },\n\n        /**\n         * 该方法是提供给插件里面使用，设置配置项默认值\n         * @method setOpt\n         * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置\n         * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用，其他地方不能调用。\n         * @param { String } key 编辑器的可接受的选项名称\n         * @param { * } val  该选项可接受的值\n         * @example\n         * ```javascript\n         * editor.setOpt( 'initContent', '欢迎使用编辑器' );\n         * ```\n         */\n\n        /**\n         * 该方法是提供给插件里面使用，以{key:value}集合的方式设置插件内用到的配置项默认值\n         * @method setOpt\n         * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置\n         * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用，其他地方不能调用。\n         * @param { Object } options 将要设置的选项的键值对对象\n         * @example\n         * ```javascript\n         * editor.setOpt( {\n         *     'initContent': '欢迎使用编辑器'\n         * } );\n         * ```\n         */\n        setOpt: function (key, val) {\n            var obj = {};\n            if (utils.isString(key)) {\n                obj[key] = val\n            } else {\n                obj = key;\n            }\n            utils.extend(this.options, obj, true);\n        },\n        getOpt:function(key){\n            return this.options[key]\n        },\n        /**\n         * 销毁编辑器实例，使用textarea代替\n         * @method destroy\n         * @example\n         * ```javascript\n         * editor.destroy();\n         * ```\n         */\n        destroy: function () {\n\n            var me = this;\n            me.fireEvent('destroy');\n            var container = me.container.parentNode;\n            var textarea = me.textarea;\n            if (!textarea) {\n                textarea = document.createElement('textarea');\n                container.parentNode.insertBefore(textarea, container);\n            } else {\n                textarea.style.display = ''\n            }\n\n            textarea.style.width = me.iframe.offsetWidth + 'px';\n            textarea.style.height = me.iframe.offsetHeight + 'px';\n            textarea.value = me.getContent();\n            textarea.id = me.key;\n            container.innerHTML = '';\n            domUtils.remove(container);\n            var key = me.key;\n            //trace:2004\n            for (var p in me) {\n                if (me.hasOwnProperty(p)) {\n                    delete this[p];\n                }\n            }\n            UE.delEditor(key);\n        },\n\n        /**\n         * 渲染编辑器的DOM到指定容器\n         * @method render\n         * @param { String } containerId 指定一个容器ID\n         * @remind 执行该方法,会触发ready事件\n         * @warning 必须且只能调用一次\n         */\n\n        /**\n         * 渲染编辑器的DOM到指定容器\n         * @method render\n         * @param { Element } containerDom 直接指定容器对象\n         * @remind 执行该方法,会触发ready事件\n         * @warning 必须且只能调用一次\n         */\n        render: function (container) {\n            var me = this,\n                options = me.options,\n                getStyleValue=function(attr){\n                    return parseInt(domUtils.getComputedStyle(container,attr));\n                };\n            if (utils.isString(container)) {\n                container = document.getElementById(container);\n            }\n            if (container) {\n                if(options.initialFrameWidth){\n                    options.minFrameWidth = options.initialFrameWidth\n                }else{\n                    options.minFrameWidth = options.initialFrameWidth = container.offsetWidth;\n                }\n                if(options.initialFrameHeight){\n                    options.minFrameHeight = options.initialFrameHeight\n                }else{\n                    options.initialFrameHeight = options.minFrameHeight = container.offsetHeight;\n                }\n\n                container.style.width = /%$/.test(options.initialFrameWidth) ?  '100%' : options.initialFrameWidth-\n                    getStyleValue(\"padding-left\")- getStyleValue(\"padding-right\") +'px';\n                container.style.height = /%$/.test(options.initialFrameHeight) ?  '100%' : options.initialFrameHeight -\n                    getStyleValue(\"padding-top\")- getStyleValue(\"padding-bottom\") +'px';\n\n                container.style.zIndex = options.zIndex;\n\n                var html = ( ie && browser.version < 9  ? '' : '<!DOCTYPE html>') +\n                    '<html xmlns=\\'http://www.w3.org/1999/xhtml\\' class=\\'view\\' ><head>' +\n                    '<style type=\\'text/css\\'>' +\n                    //设置四周的留边\n                    '.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\\n' +\n                    //设置默认字体和字号\n                    //font-family不能呢随便改，在safari下fillchar会有解析问题\n                    'body{margin:8px;font-family:sans-serif;font-size:16px;}' +\n                    //设置段落间距\n                    'p{margin:5px 0;}</style>' +\n                    ( options.iframeCssUrl ? '<link rel=\\'stylesheet\\' type=\\'text/css\\' href=\\'' + utils.unhtml(options.iframeCssUrl) + '\\'/>' : '' ) +\n                    (options.initialStyle ? '<style>' + options.initialStyle + '</style>' : '') +\n                    '</head><body class=\\'view\\' ></body>' +\n                    '<script type=\\'text/javascript\\' ' + (ie ? 'defer=\\'defer\\'' : '' ) +' id=\\'_initialScript\\'>' +\n                    'setTimeout(function(){editor = window.parent.UE.instants[\\'ueditorInstant' + me.uid + '\\'];editor._setup(document);},0);' +\n                    'var _tmpScript = document.getElementById(\\'_initialScript\\');_tmpScript.parentNode.removeChild(_tmpScript);</script></html>';\n                container.appendChild(domUtils.createElement(document, 'iframe', {\n                    id: 'ueditor_' + me.uid,\n                    width: \"100%\",\n                    height: \"100%\",\n                    frameborder: \"0\",\n                    //先注释掉了，加的原因忘记了，但开启会直接导致全屏模式下内容多时不会出现滚动条\n//                    scrolling :'no',\n                    src: 'javascript:void(function(){document.open();' + (options.customDomain && document.domain != location.hostname ?  'document.domain=\"' + document.domain + '\";' : '') +\n                        'document.write(\"' + html + '\");document.close();}())'\n                }));\n                container.style.overflow = 'hidden';\n                //解决如果是给定的百分比，会导致高度算不对的问题\n                setTimeout(function(){\n                    if( /%$/.test(options.initialFrameWidth)){\n                        options.minFrameWidth = options.initialFrameWidth = container.offsetWidth;\n                        //如果这里给定宽度，会导致ie在拖动窗口大小时，编辑区域不随着变化\n//                        container.style.width = options.initialFrameWidth + 'px';\n                    }\n                    if(/%$/.test(options.initialFrameHeight)){\n                        options.minFrameHeight = options.initialFrameHeight = container.offsetHeight;\n                        container.style.height = options.initialFrameHeight + 'px';\n                    }\n                })\n            }\n        },\n\n        /**\n         * 编辑器初始化\n         * @method _setup\n         * @private\n         * @param { Element } doc 编辑器Iframe中的文档对象\n         */\n        _setup: function (doc) {\n\n            var me = this,\n                options = me.options;\n            if (ie) {\n                doc.body.disabled = true;\n                doc.body.contentEditable = true;\n                doc.body.disabled = false;\n            } else {\n                doc.body.contentEditable = true;\n            }\n            doc.body.spellcheck = false;\n            me.document = doc;\n            me.window = doc.defaultView || doc.parentWindow;\n            me.iframe = me.window.frameElement;\n            me.body = doc.body;\n            me.selection = new dom.Selection(doc);\n            //gecko初始化就能得到range,无法判断isFocus了\n            var geckoSel;\n            if (browser.gecko && (geckoSel = this.selection.getNative())) {\n                geckoSel.removeAllRanges();\n            }\n            this._initEvents();\n            //为form提交提供一个隐藏的textarea\n            for (var form = this.iframe.parentNode; !domUtils.isBody(form); form = form.parentNode) {\n                if (form.tagName == 'FORM') {\n                    me.form = form;\n                    if(me.options.autoSyncData){\n                        domUtils.on(me.window,'blur',function(){\n                            setValue(form,me);\n                        });\n                    }else{\n                        domUtils.on(form, 'submit', function () {\n                            setValue(this, me);\n                        });\n                    }\n                    break;\n                }\n            }\n            if (options.initialContent) {\n                if (options.autoClearinitialContent) {\n                    var oldExecCommand = me.execCommand;\n                    me.execCommand = function () {\n                        me.fireEvent('firstBeforeExecCommand');\n                        return oldExecCommand.apply(me, arguments);\n                    };\n                    this._setDefaultContent(options.initialContent);\n                } else\n                    this.setContent(options.initialContent, false, true);\n            }\n\n            //编辑器不能为空内容\n\n            if (domUtils.isEmptyNode(me.body)) {\n                me.body.innerHTML = '<p>' + (browser.ie ? '' : '<br/>') + '</p>';\n            }\n            //如果要求focus, 就把光标定位到内容开始\n            if (options.focus) {\n                setTimeout(function () {\n                    me.focus(me.options.focusInEnd);\n                    //如果自动清除开着，就不需要做selectionchange;\n                    !me.options.autoClearinitialContent && me._selectionChange();\n                }, 0);\n            }\n            if (!me.container) {\n                me.container = this.iframe.parentNode;\n            }\n            if (options.fullscreen && me.ui) {\n                me.ui.setFullScreen(true);\n            }\n\n            try {\n                me.document.execCommand('2D-position', false, false);\n            } catch (e) {\n            }\n            try {\n                me.document.execCommand('enableInlineTableEditing', false, false);\n            } catch (e) {\n            }\n            try {\n                me.document.execCommand('enableObjectResizing', false, false);\n            } catch (e) {\n            }\n\n            //挂接快捷键\n            me._bindshortcutKeys();\n            me.isReady = 1;\n            me.fireEvent('ready');\n            options.onready && options.onready.call(me);\n            if (!browser.ie9below) {\n                domUtils.on(me.window, ['blur', 'focus'], function (e) {\n                    //chrome下会出现alt+tab切换时，导致选区位置不对\n                    if (e.type == 'blur') {\n                        me._bakRange = me.selection.getRange();\n                        try {\n                            me._bakNativeRange = me.selection.getNative().getRangeAt(0);\n                            me.selection.getNative().removeAllRanges();\n                        } catch (e) {\n                            me._bakNativeRange = null;\n                        }\n\n                    } else {\n                        try {\n                            me._bakRange && me._bakRange.select();\n                        } catch (e) {\n                        }\n                    }\n                });\n            }\n            //trace:1518 ff3.6body不够寛，会导致点击空白处无法获得焦点\n            if (browser.gecko && browser.version <= 10902) {\n                //修复ff3.6初始化进来，不能点击获得焦点\n                me.body.contentEditable = false;\n                setTimeout(function () {\n                    me.body.contentEditable = true;\n                }, 100);\n                setInterval(function () {\n                    me.body.style.height = me.iframe.offsetHeight - 20 + 'px'\n                }, 100)\n            }\n\n            !options.isShow && me.setHide();\n            options.readonly && me.setDisabled();\n        },\n\n        /**\n         * 同步数据到编辑器所在的form\n         * 从编辑器的容器节点向上查找form元素，若找到，就同步编辑内容到找到的form里，为提交数据做准备，主要用于是手动提交的情况\n         * 后台取得数据的键值，使用你容器上的name属性，如果没有就使用参数里的textarea项\n         * @method sync\n         * @example\n         * ```javascript\n         * editor.sync();\n         * form.sumbit(); //form变量已经指向了form元素\n         * ```\n         */\n\n        /**\n         * 根据传入的formId，在页面上查找要同步数据的表单，若找到，就同步编辑内容到找到的form里，为提交数据做准备\n         * 后台取得数据的键值，该键值默认使用给定的编辑器容器的name属性，如果没有name属性则使用参数项里给定的“textarea”项\n         * @method sync\n         * @param { String } formID 指定一个要同步数据的form的id,编辑器的数据会同步到你指定form下\n         */\n        sync: function (formId) {\n            var me = this,\n                form = formId ? document.getElementById(formId) :\n                    domUtils.findParent(me.iframe.parentNode, function (node) {\n                        return node.tagName == 'FORM'\n                    }, true);\n            form && setValue(form, me);\n        },\n\n        /**\n         * 设置编辑器高度\n         * @method setHeight\n         * @remind 当配置项autoHeightEnabled为真时,该方法无效\n         * @param { Number } number 设置的高度值，纯数值，不带单位\n         * @example\n         * ```javascript\n         * editor.setHeight(number);\n         * ```\n         */\n        setHeight: function (height,notSetHeight) {\n            if (height !== parseInt(this.iframe.parentNode.style.height)) {\n                this.iframe.parentNode.style.height = height + 'px';\n            }\n            !notSetHeight && (this.options.minFrameHeight = this.options.initialFrameHeight = height);\n            this.body.style.height = height + 'px';\n            !notSetHeight && this.trigger('setHeight')\n        },\n\n        /**\n         * 为编辑器的编辑命令提供快捷键\n         * 这个接口是为插件扩展提供的接口,主要是为新添加的插件，如果需要添加快捷键，所提供的接口\n         * @method addshortcutkey\n         * @param { Object } keyset 命令名和快捷键键值对对象，多个按钮的快捷键用“＋”分隔\n         * @example\n         * ```javascript\n         * editor.addshortcutkey({\n         *     \"Bold\" : \"ctrl+66\",//^B\n         *     \"Italic\" : \"ctrl+73\", //^I\n         * });\n         * ```\n         */\n        /**\n         * 这个接口是为插件扩展提供的接口,主要是为新添加的插件，如果需要添加快捷键，所提供的接口\n         * @method addshortcutkey\n         * @param { String } cmd 触发快捷键时，响应的命令\n         * @param { String } keys 快捷键的字符串，多个按钮用“＋”分隔\n         * @example\n         * ```javascript\n         * editor.addshortcutkey(\"Underline\", \"ctrl+85\"); //^U\n         * ```\n         */\n        addshortcutkey: function (cmd, keys) {\n            var obj = {};\n            if (keys) {\n                obj[cmd] = keys\n            } else {\n                obj = cmd;\n            }\n            utils.extend(this.shortcutkeys, obj)\n        },\n\n        /**\n         * 对编辑器设置keydown事件监听，绑定快捷键和命令，当快捷键组合触发成功，会响应对应的命令\n         * @method _bindshortcutKeys\n         * @private\n         */\n        _bindshortcutKeys: function () {\n            var me = this, shortcutkeys = this.shortcutkeys;\n            me.addListener('keydown', function (type, e) {\n                var keyCode = e.keyCode || e.which;\n                for (var i in shortcutkeys) {\n                    var tmp = shortcutkeys[i].split(',');\n                    for (var t = 0, ti; ti = tmp[t++];) {\n                        ti = ti.split(':');\n                        var key = ti[0], param = ti[1];\n                        if (/^(ctrl)(\\+shift)?\\+(\\d+)$/.test(key.toLowerCase()) || /^(\\d+)$/.test(key)) {\n                            if (( (RegExp.$1 == 'ctrl' ? (e.ctrlKey || e.metaKey) : 0)\n                                && (RegExp.$2 != \"\" ? e[RegExp.$2.slice(1) + \"Key\"] : 1)\n                                && keyCode == RegExp.$3\n                                ) ||\n                                keyCode == RegExp.$1\n                                ) {\n                                if (me.queryCommandState(i,param) != -1)\n                                    me.execCommand(i, param);\n                                domUtils.preventDefault(e);\n                            }\n                        }\n                    }\n\n                }\n            });\n        },\n\n        /**\n         * 获取编辑器的内容\n         * @method getContent\n         * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容\n         * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空，或者是空的标签内容（如:”&lt;p&gt;&lt;br/&gt;&lt;/p&gt;“）， 则返回空字符串\n         * @example\n         * ```javascript\n         * //编辑器html内容:<p>1<strong>2<em>34</em>5</strong>6</p>\n         * var content = editor.getContent(); //返回值:<p>1<strong>2<em>34</em>5</strong>6</p>\n         * ```\n         */\n\n        /**\n         * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则\n         * @method getContent\n         * @param { Function } fn 自定的判空规则， 要求该方法返回一个boolean类型的值，\n         *                      代表当前编辑器的内容是否空，\n         *                      如果返回true， 则该方法将直接返回空字符串；如果返回false，则编辑器将返回\n         *                      经过内置过滤规则处理后的内容。\n         * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。\n         * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容\n         * @return { String } 编辑器的内容字符串\n         * @example\n         * ```javascript\n         * // editor 是一个编辑器的实例\n         * var content = editor.getContent( function ( editor ) {\n         *      return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串\n         * } );\n         * ```\n         */\n        getContent: function (cmd, fn,notSetCursor,ignoreBlank,formatter) {\n            var me = this;\n            if (cmd && utils.isFunction(cmd)) {\n                fn = cmd;\n                cmd = '';\n            }\n            if (fn ? !fn() : !this.hasContents()) {\n                return '';\n            }\n            me.fireEvent('beforegetcontent');\n            var root = UE.htmlparser(me.body.innerHTML,ignoreBlank);\n            me.filterOutputRule(root);\n            me.fireEvent('aftergetcontent', cmd,root);\n            return  root.toHtml(formatter);\n        },\n\n        /**\n         * 取得完整的html代码，可以直接显示成完整的html文档\n         * @method getAllHtml\n         * @return { String } 编辑器的内容html文档字符串\n         * @eaxmple\n         * ```javascript\n         * editor.getAllHtml(); //返回格式大致是: <html><head>...</head><body>...</body></html>\n         * ```\n         */\n        getAllHtml: function () {\n            var me = this,\n                headHtml = [],\n                html = '';\n            me.fireEvent('getAllHtml', headHtml);\n            if (browser.ie && browser.version > 8) {\n                var headHtmlForIE9 = '';\n                utils.each(me.document.styleSheets, function (si) {\n                    headHtmlForIE9 += ( si.href ? '<link rel=\"stylesheet\" type=\"text/css\" href=\"' + si.href + '\" />' : '<style>' + si.cssText + '</style>');\n                });\n                utils.each(me.document.getElementsByTagName('script'), function (si) {\n                    headHtmlForIE9 += si.outerHTML;\n                });\n\n            }\n            return '<html><head>' + (me.options.charset ? '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=' + me.options.charset + '\"/>' : '')\n                + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\\n') + '</head>'\n                + '<body ' + (ie && browser.version < 9 ? 'class=\"view\"' : '') + '>' + me.getContent(null, null, true) + '</body></html>';\n        },\n\n        /**\n         * 得到编辑器的纯文本内容，但会保留段落格式\n         * @method getPlainTxt\n         * @return { String } 编辑器带段落格式的纯文本内容字符串\n         * @example\n         * ```javascript\n         * //编辑器html内容:<p><strong>1</strong></p><p><strong>2</strong></p>\n         * console.log(editor.getPlainTxt()); //输出:\"1\\n2\\n\n         * ```\n         */\n        getPlainTxt: function () {\n            var reg = new RegExp(domUtils.fillChar, 'g'),\n                html = this.body.innerHTML.replace(/[\\n\\r]/g, '');//ie要先去了\\n在处理\n            html = html.replace(/<(p|div)[^>]*>(<br\\/?>|&nbsp;)<\\/\\1>/gi, '\\n')\n                .replace(/<br\\/?>/gi, '\\n')\n                .replace(/<[^>/]+>/g, '')\n                .replace(/(\\n)?<\\/([^>]+)>/g, function (a, b, c) {\n                    return dtd.$block[c] ? '\\n' : b ? b : '';\n                });\n            //取出来的空格会有c2a0会变成乱码，处理这种情况\\u00a0\n            return html.replace(reg, '').replace(/\\u00a0/g, ' ').replace(/&nbsp;/g, ' ');\n        },\n\n        /**\n         * 获取编辑器中的纯文本内容,没有段落格式\n         * @method getContentTxt\n         * @return { String } 编辑器不带段落格式的纯文本内容字符串\n         * @example\n         * ```javascript\n         * //编辑器html内容:<p><strong>1</strong></p><p><strong>2</strong></p>\n         * console.log(editor.getPlainTxt()); //输出:\"12\n         * ```\n         */\n        getContentTxt: function () {\n            var reg = new RegExp(domUtils.fillChar, 'g');\n            //取出来的空格会有c2a0会变成乱码，处理这种情况\\u00a0\n            return this.body[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').replace(/\\u00a0/g, ' ');\n        },\n\n        /**\n         * 设置编辑器的内容，可修改编辑器当前的html内容\n         * @method setContent\n         * @warning 通过该方法插入的内容，是经过编辑器内置的过滤规则进行过滤后得到的内容\n         * @warning 该方法会触发selectionchange事件\n         * @param { String } html 要插入的html内容\n         * @example\n         * ```javascript\n         * editor.getContent('<p>test</p>');\n         * ```\n         */\n\n        /**\n         * 设置编辑器的内容，可修改编辑器当前的html内容\n         * @method setContent\n         * @warning 通过该方法插入的内容，是经过编辑器内置的过滤规则进行过滤后得到的内容\n         * @warning 该方法会触发selectionchange事件\n         * @param { String } html 要插入的html内容\n         * @param { Boolean } isAppendTo 若传入true，不清空原来的内容，在最后插入内容，否则，清空内容再插入\n         * @example\n         * ```javascript\n         * //假设设置前的编辑器内容是 <p>old text</p>\n         * editor.setContent('<p>new text</p>', true); //插入的结果是<p>old text</p><p>new text</p>\n         * ```\n         */\n        setContent: function (html, isAppendTo, notFireSelectionchange) {\n            var me = this;\n\n            me.fireEvent('beforesetcontent', html);\n            var root = UE.htmlparser(html);\n            me.filterInputRule(root);\n            html = root.toHtml();\n\n            me.body.innerHTML = (isAppendTo ? me.body.innerHTML : '') + html;\n\n\n            function isCdataDiv(node){\n                return  node.tagName == 'DIV' && node.getAttribute('cdata_tag');\n            }\n            //给文本或者inline节点套p标签\n            if (me.options.enterTag == 'p') {\n\n                var child = this.body.firstChild, tmpNode;\n                if (!child || child.nodeType == 1 &&\n                    (dtd.$cdata[child.tagName] || isCdataDiv(child) ||\n                        domUtils.isCustomeNode(child)\n                        )\n                    && child === this.body.lastChild) {\n                    this.body.innerHTML = '<p>' + (browser.ie ? '&nbsp;' : '<br/>') + '</p>' + this.body.innerHTML;\n\n                } else {\n                    var p = me.document.createElement('p');\n                    while (child) {\n                        while (child && (child.nodeType == 3 || child.nodeType == 1 && dtd.p[child.tagName] && !dtd.$cdata[child.tagName])) {\n                            tmpNode = child.nextSibling;\n                            p.appendChild(child);\n                            child = tmpNode;\n                        }\n                        if (p.firstChild) {\n                            if (!child) {\n                                me.body.appendChild(p);\n                                break;\n                            } else {\n                                child.parentNode.insertBefore(p, child);\n                                p = me.document.createElement('p');\n                            }\n                        }\n                        child = child.nextSibling;\n                    }\n                }\n            }\n            me.fireEvent('aftersetcontent');\n            me.fireEvent('contentchange');\n\n            !notFireSelectionchange && me._selectionChange();\n            //清除保存的选区\n            me._bakRange = me._bakIERange = me._bakNativeRange = null;\n            //trace:1742 setContent后gecko能得到焦点问题\n            var geckoSel;\n            if (browser.gecko && (geckoSel = this.selection.getNative())) {\n                geckoSel.removeAllRanges();\n            }\n            if(me.options.autoSyncData){\n                me.form && setValue(me.form,me);\n            }\n        },\n\n        /**\n         * 让编辑器获得焦点，默认focus到编辑器头部\n         * @method focus\n         * @example\n         * ```javascript\n         * editor.focus()\n         * ```\n         */\n\n        /**\n         * 让编辑器获得焦点，toEnd确定focus位置\n         * @method focus\n         * @param { Boolean } toEnd 默认focus到编辑器头部，toEnd为true时focus到内容尾部\n         * @example\n         * ```javascript\n         * editor.focus(true)\n         * ```\n         */\n        focus: function (toEnd) {\n            try {\n                var me = this,\n                    rng = me.selection.getRange();\n                if (toEnd) {\n                    var node = me.body.lastChild;\n                    if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){\n                        if(domUtils.isEmptyBlock(node)){\n                            rng.setStartAtFirst(node)\n                        }else{\n                            rng.setStartAtLast(node)\n                        }\n                        rng.collapse(true);\n                    }\n                    rng.setCursor(true);\n                } else {\n                    if(!rng.collapsed && domUtils.isBody(rng.startContainer) && rng.startOffset == 0){\n\n                        var node = me.body.firstChild;\n                        if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){\n                            rng.setStartAtFirst(node).collapse(true);\n                        }\n                    }\n\n                    rng.select(true);\n\n                }\n                this.fireEvent('focus selectionchange');\n            } catch (e) {\n            }\n\n        },\n        isFocus:function(){\n            return this.selection.isFocus();\n        },\n        blur:function(){\n            var sel = this.selection.getNative();\n            if(sel.empty && browser.ie){\n                var nativeRng = document.body.createTextRange();\n                nativeRng.moveToElementText(document.body);\n                nativeRng.collapse(true);\n                nativeRng.select();\n                sel.empty()\n            }else{\n                sel.removeAllRanges()\n            }\n\n            //this.fireEvent('blur selectionchange');\n        },\n        /**\n         * 初始化UE事件及部分事件代理\n         * @method _initEvents\n         * @private\n         */\n        _initEvents: function () {\n            var me = this,\n                doc = me.document,\n                win = me.window;\n            me._proxyDomEvent = utils.bind(me._proxyDomEvent, me);\n            domUtils.on(doc, ['click', 'contextmenu', 'mousedown', 'keydown', 'keyup', 'keypress', 'mouseup', 'mouseover', 'mouseout', 'selectstart'], me._proxyDomEvent);\n            domUtils.on(win, ['focus', 'blur'], me._proxyDomEvent);\n            domUtils.on(me.body,'drop',function(e){\n                //阻止ff下默认的弹出新页面打开图片\n                if(browser.gecko && e.stopPropagation) { e.stopPropagation(); }\n                me.fireEvent('contentchange')\n            });\n            domUtils.on(doc, ['mouseup', 'keydown'], function (evt) {\n                //特殊键不触发selectionchange\n                if (evt.type == 'keydown' && (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey)) {\n                    return;\n                }\n                if (evt.button == 2)return;\n                me._selectionChange(250, evt);\n            });\n        },\n        /**\n         * 触发事件代理\n         * @method _proxyDomEvent\n         * @private\n         * @return { * } fireEvent的返回值\n         * @see UE.EventBase:fireEvent(String)\n         */\n        _proxyDomEvent: function (evt) {\n            if(this.fireEvent('before' + evt.type.replace(/^on/, '').toLowerCase()) === false){\n                return false;\n            }\n            if(this.fireEvent(evt.type.replace(/^on/, ''), evt) === false){\n                return false;\n            }\n            return this.fireEvent('after' + evt.type.replace(/^on/, '').toLowerCase())\n        },\n        /**\n         * 变化选区\n         * @method _selectionChange\n         * @private\n         */\n        _selectionChange: function (delay, evt) {\n            var me = this;\n            //有光标才做selectionchange 为了解决未focus时点击source不能触发更改工具栏状态的问题（source命令notNeedUndo=1）\n//            if ( !me.selection.isFocus() ){\n//                return;\n//            }\n\n\n            var hackForMouseUp = false;\n            var mouseX, mouseY;\n            if (browser.ie && browser.version < 9 && evt && evt.type == 'mouseup') {\n                var range = this.selection.getRange();\n                if (!range.collapsed) {\n                    hackForMouseUp = true;\n                    mouseX = evt.clientX;\n                    mouseY = evt.clientY;\n                }\n            }\n            clearTimeout(_selectionChangeTimer);\n            _selectionChangeTimer = setTimeout(function () {\n                if (!me.selection || !me.selection.getNative()) {\n                    return;\n                }\n                //修复一个IE下的bug: 鼠标点击一段已选择的文本中间时，可能在mouseup后的一段时间内取到的range是在selection的type为None下的错误值.\n                //IE下如果用户是拖拽一段已选择文本，则不会触发mouseup事件，所以这里的特殊处理不会对其有影响\n                var ieRange;\n                if (hackForMouseUp && me.selection.getNative().type == 'None') {\n                    ieRange = me.document.body.createTextRange();\n                    try {\n                        ieRange.moveToPoint(mouseX, mouseY);\n                    } catch (ex) {\n                        ieRange = null;\n                    }\n                }\n                var bakGetIERange;\n                if (ieRange) {\n                    bakGetIERange = me.selection.getIERange;\n                    me.selection.getIERange = function () {\n                        return ieRange;\n                    };\n                }\n                me.selection.cache();\n                if (bakGetIERange) {\n                    me.selection.getIERange = bakGetIERange;\n                }\n                if (me.selection._cachedRange && me.selection._cachedStartElement) {\n                    me.fireEvent('beforeselectionchange');\n                    // 第二个参数causeByUi为true代表由用户交互造成的selectionchange.\n                    me.fireEvent('selectionchange', !!evt);\n                    me.fireEvent('afterselectionchange');\n                    me.selection.clear();\n                }\n            }, delay || 50);\n        },\n\n        /**\n         * 执行编辑命令\n         * @method _callCmdFn\n         * @private\n         * @param { String } fnName 函数名称\n         * @param { * } args 传给命令函数的参数\n         * @return { * } 返回命令函数运行的返回值\n         */\n        _callCmdFn: function (fnName, args) {\n            var cmdName = args[0].toLowerCase(),\n                cmd, cmdFn;\n            cmd = this.commands[cmdName] || UE.commands[cmdName];\n            cmdFn = cmd && cmd[fnName];\n            //没有querycommandstate或者没有command的都默认返回0\n            if ((!cmd || !cmdFn) && fnName == 'queryCommandState') {\n                return 0;\n            } else if (cmdFn) {\n                return cmdFn.apply(this, args);\n            }\n        },\n\n        /**\n         * 执行编辑命令cmdName，完成富文本编辑效果\n         * @method execCommand\n         * @param { String } cmdName 需要执行的命令\n         * @remind 具体命令的使用请参考<a href=\"#COMMAND.LIST\">命令列表</a>\n         * @return { * } 返回命令函数运行的返回值\n         * @example\n         * ```javascript\n         * editor.execCommand(cmdName);\n         * ```\n         */\n        execCommand: function (cmdName) {\n            cmdName = cmdName.toLowerCase();\n            var me = this,\n                result,\n                cmd = me.commands[cmdName] || UE.commands[cmdName];\n            if (!cmd || !cmd.execCommand) {\n                return null;\n            }\n            if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) {\n                me.__hasEnterExecCommand = true;\n                if (me.queryCommandState.apply(me,arguments) != -1) {\n                    me.fireEvent('saveScene');\n                    me.fireEvent.apply(me, ['beforeexeccommand', cmdName].concat(arguments));\n                    result = this._callCmdFn('execCommand', arguments);\n                    //保存场景时，做了内容对比，再看是否进行contentchange触发，这里多触发了一次，去掉\n//                    (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange');\n                    me.fireEvent.apply(me, ['afterexeccommand', cmdName].concat(arguments));\n                    me.fireEvent('saveScene');\n                }\n                me.__hasEnterExecCommand = false;\n            } else {\n                result = this._callCmdFn('execCommand', arguments);\n                (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange')\n            }\n            (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me._selectionChange();\n            return result;\n        },\n\n        /**\n         * 根据传入的command命令，查选编辑器当前的选区，返回命令的状态\n         * @method  queryCommandState\n         * @param { String } cmdName 需要查询的命令名称\n         * @remind 具体命令的使用请参考<a href=\"#COMMAND.LIST\">命令列表</a>\n         * @return { Number } number 返回放前命令的状态，返回值三种情况：(-1|0|1)\n         * @example\n         * ```javascript\n         * editor.queryCommandState(cmdName)  => (-1|0|1)\n         * ```\n         * @see COMMAND.LIST\n         */\n        queryCommandState: function (cmdName) {\n            return this._callCmdFn('queryCommandState', arguments);\n        },\n\n        /**\n         * 根据传入的command命令，查选编辑器当前的选区，根据命令返回相关的值\n         * @method queryCommandValue\n         * @param { String } cmdName 需要查询的命令名称\n         * @remind 具体命令的使用请参考<a href=\"#COMMAND.LIST\">命令列表</a>\n         * @remind 只有部分插件有此方法\n         * @return { * } 返回每个命令特定的当前状态值\n         * @grammar editor.queryCommandValue(cmdName)  =>  {*}\n         * @see COMMAND.LIST\n         */\n        queryCommandValue: function (cmdName) {\n            return this._callCmdFn('queryCommandValue', arguments);\n        },\n\n        /**\n         * 检查编辑区域中是否有内容\n         * @method  hasContents\n         * @remind 默认有文本内容，或者有以下节点都不认为是空\n         * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param\n         * @return { Boolean } 检查有内容返回true，否则返回false\n         * @example\n         * ```javascript\n         * editor.hasContents()\n         * ```\n         */\n\n        /**\n         * 检查编辑区域中是否有内容，若包含参数tags中的节点类型，直接返回true\n         * @method  hasContents\n         * @param { Array } tags 传入数组判断时用到的节点类型\n         * @return { Boolean } 若文档中包含tags数组里对应的tag，返回true，否则返回false\n         * @example\n         * ```javascript\n         * editor.hasContents(['span']);\n         * ```\n         */\n        hasContents: function (tags) {\n            if (tags) {\n                for (var i = 0, ci; ci = tags[i++];) {\n                    if (this.document.getElementsByTagName(ci).length > 0) {\n                        return true;\n                    }\n                }\n            }\n            if (!domUtils.isEmptyBlock(this.body)) {\n                return true\n            }\n            //随时添加,定义的特殊标签如果存在，不能认为是空\n            tags = ['div'];\n            for (i = 0; ci = tags[i++];) {\n                var nodes = domUtils.getElementsByTagName(this.document, ci);\n                for (var n = 0, cn; cn = nodes[n++];) {\n                    if (domUtils.isCustomeNode(cn)) {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        },\n\n        /**\n         * 重置编辑器，可用来做多个tab使用同一个编辑器实例\n         * @method  reset\n         * @remind 此方法会清空编辑器内容，清空回退列表，会触发reset事件\n         * @example\n         * ```javascript\n         * editor.reset()\n         * ```\n         */\n        reset: function () {\n            this.fireEvent('reset');\n        },\n\n        /**\n         * 设置当前编辑区域可以编辑\n         * @method setEnabled\n         * @example\n         * ```javascript\n         * editor.setEnabled()\n         * ```\n         */\n        setEnabled: function () {\n            var me = this, range;\n            if (me.body.contentEditable == 'false') {\n                me.body.contentEditable = true;\n                range = me.selection.getRange();\n                //有可能内容丢失了\n                try {\n                    range.moveToBookmark(me.lastBk);\n                    delete me.lastBk\n                } catch (e) {\n                    range.setStartAtFirst(me.body).collapse(true)\n                }\n                range.select(true);\n                if (me.bkqueryCommandState) {\n                    me.queryCommandState = me.bkqueryCommandState;\n                    delete me.bkqueryCommandState;\n                }\n                if (me.bkqueryCommandValue) {\n                    me.queryCommandValue = me.bkqueryCommandValue;\n                    delete me.bkqueryCommandValue;\n                }\n                me.fireEvent('selectionchange');\n            }\n        },\n        enable: function () {\n            return this.setEnabled();\n        },\n\n        /** 设置当前编辑区域不可编辑\n         * @method setDisabled\n         */\n\n        /** 设置当前编辑区域不可编辑,except中的命令除外\n         * @method setDisabled\n         * @param { String } except 例外命令的字符串\n         * @remind 即使设置了disable，此处配置的例外命令仍然可以执行\n         * @example\n         * ```javascript\n         * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能\n         * ```\n         */\n\n        /** 设置当前编辑区域不可编辑,except中的命令除外\n         * @method setDisabled\n         * @param { Array } except 例外命令的字符串数组，数组中的命令仍然可以执行\n         * @remind 即使设置了disable，此处配置的例外命令仍然可以执行\n         * @example\n         * ```javascript\n         * editor.setDisabled(['bold','insertimage']); //禁用工具栏中除加粗和插入图片之外的所有功能\n         * ```\n         */\n        setDisabled: function (except) {\n            var me = this;\n            except = except ? utils.isArray(except) ? except : [except] : [];\n            if (me.body.contentEditable == 'true') {\n                if (!me.lastBk) {\n                    me.lastBk = me.selection.getRange().createBookmark(true);\n                }\n                me.body.contentEditable = false;\n                me.bkqueryCommandState = me.queryCommandState;\n                me.bkqueryCommandValue = me.queryCommandValue;\n                me.queryCommandState = function (type) {\n                    if (utils.indexOf(except, type) != -1) {\n                        return me.bkqueryCommandState.apply(me, arguments);\n                    }\n                    return -1;\n                };\n                me.queryCommandValue = function (type) {\n                    if (utils.indexOf(except, type) != -1) {\n                        return me.bkqueryCommandValue.apply(me, arguments);\n                    }\n                    return null;\n                };\n                me.fireEvent('selectionchange');\n            }\n        },\n        disable: function (except) {\n            return this.setDisabled(except);\n        },\n\n        /**\n         * 设置默认内容\n         * @method _setDefaultContent\n         * @private\n         * @param  { String } cont 要存入的内容\n         */\n        _setDefaultContent: function () {\n            function clear() {\n                var me = this;\n                if (me.document.getElementById('initContent')) {\n                    me.body.innerHTML = '<p>' + (ie ? '' : '<br/>') + '</p>';\n                    me.removeListener('firstBeforeExecCommand focus', clear);\n                    setTimeout(function () {\n                        me.focus();\n                        me._selectionChange();\n                    }, 0)\n                }\n            }\n\n            return function (cont) {\n                var me = this;\n                me.body.innerHTML = '<p id=\"initContent\">' + cont + '</p>';\n\n                me.addListener('firstBeforeExecCommand focus', clear);\n            }\n        }(),\n\n        /**\n         * 显示编辑器\n         * @method setShow\n         * @example\n         * ```javascript\n         * editor.setShow()\n         * ```\n         */\n        setShow: function () {\n            var me = this, range = me.selection.getRange();\n            if (me.container.style.display == 'none') {\n                //有可能内容丢失了\n                try {\n                    range.moveToBookmark(me.lastBk);\n                    delete me.lastBk\n                } catch (e) {\n                    range.setStartAtFirst(me.body).collapse(true)\n                }\n                //ie下focus实效，所以做了个延迟\n                setTimeout(function () {\n                    range.select(true);\n                }, 100);\n                me.container.style.display = '';\n            }\n\n        },\n        show: function () {\n            return this.setShow();\n        },\n        /**\n         * 隐藏编辑器\n         * @method setHide\n         * @example\n         * ```javascript\n         * editor.setHide()\n         * ```\n         */\n        setHide: function () {\n            var me = this;\n            if (!me.lastBk) {\n                me.lastBk = me.selection.getRange().createBookmark(true);\n            }\n            me.container.style.display = 'none'\n        },\n        hide: function () {\n            return this.setHide();\n        },\n\n        /**\n         * 根据指定的路径，获取对应的语言资源\n         * @method getLang\n         * @param { String } path 路径根据的是lang目录下的语言文件的路径结构\n         * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串\n         * @example\n         * ```javascript\n         * editor.getLang('contextMenu.delete'); //如果当前是中文，那返回是的是'删除'\n         * ```\n         */\n        getLang: function (path) {\n            var lang = UE.I18N[this.options.lang];\n            if (!lang) {\n                throw Error(\"not import language file\");\n            }\n            path = (path || \"\").split(\".\");\n            for (var i = 0, ci; ci = path[i++];) {\n                lang = lang[ci];\n                if (!lang)break;\n            }\n            return lang;\n        },\n\n        /**\n         * 计算编辑器html内容字符串的长度\n         * @method  getContentLength\n         * @return { Number } 返回计算的长度\n         * @example\n         * ```javascript\n         * //编辑器html内容<p><strong>132</strong></p>\n         * editor.getContentLength() //返回27\n         * ```\n         */\n        /**\n         * 计算编辑器当前纯文本内容的长度\n         * @method  getContentLength\n         * @param { Boolean } ingoneHtml 传入true时，只按照纯文本来计算\n         * @return { Number } 返回计算的长度，内容中有hr/img/iframe标签，长度加1\n         * @example\n         * ```javascript\n         * //编辑器html内容<p><strong>132</strong></p>\n         * editor.getContentLength() //返回3\n         * ```\n         */\n        getContentLength: function (ingoneHtml, tagNames) {\n            var count = this.getContent(false,false,true).length;\n            if (ingoneHtml) {\n                tagNames = (tagNames || []).concat([ 'hr', 'img', 'iframe']);\n                count = this.getContentTxt().replace(/[\\t\\r\\n]+/g, '').length;\n                for (var i = 0, ci; ci = tagNames[i++];) {\n                    count += this.document.getElementsByTagName(ci).length;\n                }\n            }\n            return count;\n        },\n\n        /**\n         * 注册输入过滤规则\n         * @method  addInputRule\n         * @param { Function } rule 要添加的过滤规则\n         * @example\n         * ```javascript\n         * editor.addInputRule(function(root){\n         *   $.each(root.getNodesByTagName('div'),function(i,node){\n         *       node.tagName=\"p\";\n         *   });\n         * });\n         * ```\n         */\n        addInputRule: function (rule) {\n            this.inputRules.push(rule);\n        },\n\n        /**\n         * 执行注册的过滤规则\n         * @method  filterInputRule\n         * @param { UE.uNode } root 要过滤的uNode节点\n         * @remind 执行editor.setContent方法和执行'inserthtml'命令后，会运行该过滤函数\n         * @example\n         * ```javascript\n         * editor.filterInputRule(editor.body);\n         * ```\n         * @see UE.Editor:addInputRule\n         */\n        filterInputRule: function (root) {\n            for (var i = 0, ci; ci = this.inputRules[i++];) {\n                ci.call(this, root)\n            }\n        },\n\n        /**\n         * 注册输出过滤规则\n         * @method  addOutputRule\n         * @param { Function } rule 要添加的过滤规则\n         * @example\n         * ```javascript\n         * editor.addOutputRule(function(root){\n         *   $.each(root.getNodesByTagName('p'),function(i,node){\n         *       node.tagName=\"div\";\n         *   });\n         * });\n         * ```\n         */\n        addOutputRule: function (rule) {\n            this.outputRules.push(rule)\n        },\n\n        /**\n         * 根据输出过滤规则，过滤编辑器内容\n         * @method  filterOutputRule\n         * @remind 执行editor.getContent方法的时候，会先运行该过滤函数\n         * @param { UE.uNode } root 要过滤的uNode节点\n         * @example\n         * ```javascript\n         * editor.filterOutputRule(editor.body);\n         * ```\n         * @see UE.Editor:addOutputRule\n         */\n        filterOutputRule: function (root) {\n            for (var i = 0, ci; ci = this.outputRules[i++];) {\n                ci.call(this, root)\n            }\n        },\n\n        /**\n         * 根据action名称获取请求的路径\n         * @method  getActionUrl\n         * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径\n         * @param { String } action action名称\n         * @example\n         * ```javascript\n         * editor.getActionUrl('config'); //返回 \"/ueditor/php/controller.php?action=config\"\n         * editor.getActionUrl('image'); //返回 \"/ueditor/php/controller.php?action=uplaodimage\"\n         * editor.getActionUrl('scrawl'); //返回 \"/ueditor/php/controller.php?action=uplaodscrawl\"\n         * editor.getActionUrl('imageManager'); //返回 \"/ueditor/php/controller.php?action=listimage\"\n         * ```\n         */\n        getActionUrl: function(action){\n            var actionName = this.getOpt(action) || action,\n                imageUrl = this.getOpt('imageUrl'),\n                serverUrl = this.getOpt('serverUrl');\n\n            if(!serverUrl && imageUrl) {\n                serverUrl = imageUrl.replace(/^(.*[\\/]).+([\\.].+)$/, '$1controller$2');\n            }\n\n            if(serverUrl) {\n                serverUrl = serverUrl + (serverUrl.indexOf('?') == -1 ? '?':'&') + 'action=' + (actionName || '');\n                return utils.formatUrl(serverUrl);\n            } else {\n                return '';\n            }\n        }\n    };\n    utils.inherits(Editor, EventBase);\n})();\n\n\n// core/Editor.defaultoptions.js\n//维护编辑器一下默认的不在插件中的配置项\nUE.Editor.defaultOptions = function(editor){\n\n    var _url = editor.options.UEDITOR_HOME_URL;\n    return {\n        isShow: true,\n        initialContent: '',\n        initialStyle:'',\n        autoClearinitialContent: false,\n        iframeCssUrl: _url + 'themes/iframe.css',\n        textarea: 'editorValue',\n        focus: false,\n        focusInEnd: true,\n        autoClearEmptyNode: true,\n        fullscreen: false,\n        readonly: false,\n        zIndex: 999,\n        imagePopup: true,\n        enterTag: 'p',\n        customDomain: false,\n        lang: 'zh-cn',\n        langPath: _url + 'lang/',\n        theme: 'default',\n        themePath: _url + 'themes/',\n        allHtmlEnabled: false,\n        scaleEnabled: false,\n        tableNativeEditInFF: false,\n        autoSyncData : true,\n        fileNameFormat: '{time}{rand:6}'\n    }\n};\n\n// core/loadconfig.js\n(function(){\n\n    UE.Editor.prototype.loadServerConfig = function(){\n        var me = this;\n        setTimeout(function(){\n            try{\n                me.options.imageUrl && me.setOpt('serverUrl', me.options.imageUrl.replace(/^(.*[\\/]).+([\\.].+)$/, '$1controller$2'));\n\n                var configUrl = me.getActionUrl('config'),\n                    isJsonp = utils.isCrossDomainUrl(configUrl);\n\n                /* 发出ajax请求 */\n                me._serverConfigLoaded = false;\n\n                configUrl && UE.ajax.request(configUrl,{\n                    'method': 'GET',\n                    'dataType': isJsonp ? 'jsonp':'',\n                    'onsuccess':function(r){\n                        try {\n                            var config = isJsonp ? r:eval(\"(\"+r.responseText+\")\");\n                            utils.extend(me.options, config);\n                            me.fireEvent('serverConfigLoaded');\n                            me._serverConfigLoaded = true;\n                        } catch (e) {\n                            showErrorMsg(me.getLang('loadconfigFormatError'));\n                        }\n                    },\n                    'onerror':function(){\n                        showErrorMsg(me.getLang('loadconfigHttpError'));\n                    }\n                });\n            } catch(e){\n                showErrorMsg(me.getLang('loadconfigError'));\n            }\n        });\n\n        function showErrorMsg(msg) {\n            console && console.error(msg);\n            //me.fireEvent('showMessage', {\n            //    'title': msg,\n            //    'type': 'error'\n            //});\n        }\n    };\n\n    UE.Editor.prototype.isServerConfigLoaded = function(){\n        var me = this;\n        return me._serverConfigLoaded || false;\n    };\n\n    UE.Editor.prototype.afterConfigReady = function(handler){\n        if (!handler || !utils.isFunction(handler)) return;\n        var me = this;\n        var readyHandler = function(){\n            handler.apply(me, arguments);\n            me.removeListener('serverConfigLoaded', readyHandler);\n        };\n\n        if (me.isServerConfigLoaded()) {\n            handler.call(me, 'serverConfigLoaded');\n        } else {\n            me.addListener('serverConfigLoaded', readyHandler);\n        }\n    };\n\n})();\n\n\n// core/ajax.js\n/**\n * @file\n * @module UE.ajax\n * @since 1.2.6.1\n */\n\n/**\n * 提供对ajax请求的支持\n * @module UE.ajax\n */\nUE.ajax = function() {\n\n    //创建一个ajaxRequest对象\n    var fnStr = 'XMLHttpRequest()';\n    try {\n        new ActiveXObject(\"Msxml2.XMLHTTP\");\n        fnStr = 'ActiveXObject(\\'Msxml2.XMLHTTP\\')';\n    } catch (e) {\n        try {\n            new ActiveXObject(\"Microsoft.XMLHTTP\");\n            fnStr = 'ActiveXObject(\\'Microsoft.XMLHTTP\\')'\n        } catch (e) {\n        }\n    }\n    var creatAjaxRequest = new Function('return new ' + fnStr);\n\n\n    /**\n     * 将json参数转化成适合ajax提交的参数列表\n     * @param json\n     */\n    function json2str(json) {\n        var strArr = [];\n        for (var i in json) {\n            //忽略默认的几个参数\n            if(i==\"method\" || i==\"timeout\" || i==\"async\" || i==\"dataType\" || i==\"callback\") continue;\n            //忽略控制\n            if(json[i] == undefined || json[i] == null) continue;\n            //传递过来的对象和函数不在提交之列\n            if (!((typeof json[i]).toLowerCase() == \"function\" || (typeof json[i]).toLowerCase() == \"object\")) {\n                strArr.push( encodeURIComponent(i) + \"=\"+encodeURIComponent(json[i]) );\n            } else if (utils.isArray(json[i])) {\n            //支持传数组内容\n                for(var j = 0; j < json[i].length; j++) {\n                    strArr.push( encodeURIComponent(i) + \"[]=\"+encodeURIComponent(json[i][j]) );\n                }\n            }\n        }\n        return strArr.join(\"&\");\n    }\n\n    function doAjax(url, ajaxOptions) {\n        var xhr = creatAjaxRequest(),\n        //是否超时\n            timeIsOut = false,\n        //默认参数\n            defaultAjaxOptions = {\n                method:\"POST\",\n                timeout:5000,\n                async:true,\n                data:{},//需要传递对象的话只能覆盖\n                onsuccess:function() {\n                },\n                onerror:function() {\n                }\n            };\n\n        if (typeof url === \"object\") {\n            ajaxOptions = url;\n            url = ajaxOptions.url;\n        }\n        if (!xhr || !url) return;\n        var ajaxOpts = ajaxOptions ? utils.extend(defaultAjaxOptions,ajaxOptions) : defaultAjaxOptions;\n\n        var submitStr = json2str(ajaxOpts);  // { name:\"Jim\",city:\"Beijing\" } --> \"name=Jim&city=Beijing\"\n        //如果用户直接通过data参数传递json对象过来，则也要将此json对象转化为字符串\n        if (!utils.isEmptyObject(ajaxOpts.data)){\n            submitStr += (submitStr? \"&\":\"\") + json2str(ajaxOpts.data);\n        }\n        //超时检测\n        var timerID = setTimeout(function() {\n            if (xhr.readyState != 4) {\n                timeIsOut = true;\n                xhr.abort();\n                clearTimeout(timerID);\n            }\n        }, ajaxOpts.timeout);\n\n        var method = ajaxOpts.method.toUpperCase();\n        var str = url + (url.indexOf(\"?\")==-1?\"?\":\"&\") + (method==\"POST\"?\"\":submitStr+ \"&noCache=\" + +new Date);\n        xhr.open(method, str, ajaxOpts.async);\n        xhr.onreadystatechange = function() {\n            if (xhr.readyState == 4) {\n                if (!timeIsOut && xhr.status == 200) {\n                    ajaxOpts.onsuccess(xhr);\n                } else {\n                    ajaxOpts.onerror(xhr);\n                }\n            }\n        };\n        if (method == \"POST\") {\n            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n            xhr.send(submitStr);\n        } else {\n            xhr.send(null);\n        }\n    }\n\n    function doJsonp(url, opts) {\n\n        var successhandler = opts.onsuccess || function(){},\n            scr = document.createElement('SCRIPT'),\n            options = opts || {},\n            charset = options['charset'],\n            callbackField = options['jsonp'] || 'callback',\n            callbackFnName,\n            timeOut = options['timeOut'] || 0,\n            timer,\n            reg = new RegExp('(\\\\?|&)' + callbackField + '=([^&]*)'),\n            matches;\n\n        if (utils.isFunction(successhandler)) {\n            callbackFnName = 'bd__editor__' + Math.floor(Math.random() * 2147483648).toString(36);\n            window[callbackFnName] = getCallBack(0);\n        } else if(utils.isString(successhandler)){\n            callbackFnName = successhandler;\n        } else {\n            if (matches = reg.exec(url)) {\n                callbackFnName = matches[2];\n            }\n        }\n\n        url = url.replace(reg, '\\x241' + callbackField + '=' + callbackFnName);\n\n        if (url.search(reg) < 0) {\n            url += (url.indexOf('?') < 0 ? '?' : '&') + callbackField + '=' + callbackFnName;\n        }\n\n        var queryStr = json2str(opts);  // { name:\"Jim\",city:\"Beijing\" } --> \"name=Jim&city=Beijing\"\n        //如果用户直接通过data参数传递json对象过来，则也要将此json对象转化为字符串\n        if (!utils.isEmptyObject(opts.data)){\n            queryStr += (queryStr? \"&\":\"\") + json2str(opts.data);\n        }\n        if (queryStr) {\n            url = url.replace(/\\?/, '?' + queryStr + '&');\n        }\n\n        scr.onerror = getCallBack(1);\n        if( timeOut ){\n            timer = setTimeout(getCallBack(1), timeOut);\n        }\n        createScriptTag(scr, url, charset);\n\n        function createScriptTag(scr, url, charset) {\n            scr.setAttribute('type', 'text/javascript');\n            scr.setAttribute('defer', 'defer');\n            charset && scr.setAttribute('charset', charset);\n            scr.setAttribute('src', url);\n            document.getElementsByTagName('head')[0].appendChild(scr);\n        }\n\n        function getCallBack(onTimeOut){\n            return function(){\n                try {\n                    if(onTimeOut){\n                        options.onerror && options.onerror();\n                    }else{\n                        try{\n                            clearTimeout(timer);\n                            successhandler.apply(window, arguments);\n                        } catch (e){}\n                    }\n                } catch (exception) {\n                    options.onerror && options.onerror.call(window, exception);\n                } finally {\n                    options.oncomplete && options.oncomplete.apply(window, arguments);\n                    scr.parentNode && scr.parentNode.removeChild(scr);\n                    window[callbackFnName] = null;\n                    try {\n                        delete window[callbackFnName];\n                    }catch(e){}\n                }\n            }\n        }\n    }\n\n    return {\n        /**\n         * 根据给定的参数项，向指定的url发起一个ajax请求。 ajax请求完成后，会根据请求结果调用相应回调： 如果请求\n         * 成功， 则调用onsuccess回调， 失败则调用 onerror 回调\n         * @method request\n         * @param { URLString } url ajax请求的url地址\n         * @param { Object } ajaxOptions ajax请求选项的键值对，支持的选项如下：\n         * @example\n         * ```javascript\n         * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s， 请求完成后执行相应的回调。\n         * UE.ajax.requeset( 'sayhello.php', {\n         *\n         *     //请求方法。可选值： 'GET', 'POST'，默认值是'POST'\n         *     method: 'GET',\n         *\n         *     //超时时间。 默认为5000， 单位是ms\n         *     timeout: 10000,\n         *\n         *     //是否是异步请求。 true为异步请求， false为同步请求\n         *     async: true,\n         *\n         *     //请求携带的数据。如果请求为GET请求， data会经过stringify后附加到请求url之后。\n         *     data: {\n         *         name: 'ueditor'\n         *     },\n         *\n         *     //请求成功后的回调， 该回调接受当前的XMLHttpRequest对象作为参数。\n         *     onsuccess: function ( xhr ) {\n         *         console.log( xhr.responseText );\n         *     },\n         *\n         *     //请求失败或者超时后的回调。\n         *     onerror: function ( xhr ) {\n         *          alert( 'Ajax请求失败' );\n         *     }\n         *\n         * } );\n         * ```\n         */\n\n        /**\n         * 根据给定的参数项发起一个ajax请求， 参数项里必须包含一个url地址。 ajax请求完成后，会根据请求结果调用相应回调： 如果请求\n         * 成功， 则调用onsuccess回调， 失败则调用 onerror 回调。\n         * @method request\n         * @warning 如果在参数项里未提供一个key为“url”的地址值，则该请求将直接退出。\n         * @param { Object } ajaxOptions ajax请求选项的键值对，支持的选项如下：\n         * @example\n         * ```javascript\n         *\n         * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s， 请求完成后不执行任何回调。\n         * UE.ajax.requeset( 'sayhello.php', {\n         *\n         *     //请求的地址， 该项是必须的。\n         *     url: 'sayhello.php'\n         *\n         * } );\n         * ```\n         */\n\t\trequest:function(url, opts) {\n            if (opts && opts.dataType == 'jsonp') {\n                doJsonp(url, opts);\n            } else {\n                doAjax(url, opts);\n            }\n\t\t},\n        getJSONP:function(url, data, fn) {\n            var opts = {\n                'data': data,\n                'oncomplete': fn\n            };\n            doJsonp(url, opts);\n\t\t}\n\t};\n\n\n}();\n\n\n// core/filterword.js\n/**\n * UE过滤word的静态方法\n * @file\n */\n\n/**\n * UEditor公用空间，UEditor所有的功能都挂载在该空间下\n * @module UE\n */\n\n\n/**\n * 根据传入html字符串过滤word\n * @module UE\n * @since 1.2.6.1\n * @method filterWord\n * @param { String } html html字符串\n * @return { String } 已过滤后的结果字符串\n * @example\n * ```javascript\n * UE.filterWord(html);\n * ```\n */\nvar filterWord = UE.filterWord = function () {\n\n    //是否是word过来的内容\n    function isWordDocument( str ) {\n        return /(class=\"?Mso|style=\"[^\"]*\\bmso\\-|w:WordDocument|<(v|o):|lang=)/ig.test( str );\n    }\n    //去掉小数\n    function transUnit( v ) {\n        v = v.replace( /[\\d.]+\\w+/g, function ( m ) {\n            return utils.transUnitToPx(m);\n        } );\n        return v;\n    }\n\n    function filterPasteWord( str ) {\n        return str.replace(/[\\t\\r\\n]+/g,' ')\n                .replace( /<!--[\\s\\S]*?-->/ig, \"\" )\n                //转换图片\n                .replace(/<v:shape [^>]*>[\\s\\S]*?.<\\/v:shape>/gi,function(str){\n                    //opera能自己解析出image所这里直接返回空\n                    if(browser.opera){\n                        return '';\n                    }\n                    try{\n                        //有可能是bitmap占为图，无用，直接过滤掉，主要体现在粘贴excel表格中\n                        if(/Bitmap/i.test(str)){\n                            return '';\n                        }\n                        var width = str.match(/width:([ \\d.]*p[tx])/i)[1],\n                            height = str.match(/height:([ \\d.]*p[tx])/i)[1],\n                            src =  str.match(/src=\\s*\"([^\"]*)\"/i)[1];\n                        return '<img width=\"'+ transUnit(width) +'\" height=\"'+transUnit(height) +'\" src=\"' + src + '\" />';\n                    } catch(e){\n                        return '';\n                    }\n                })\n                //针对wps添加的多余标签处理\n                .replace(/<\\/?div[^>]*>/g,'')\n                //去掉多余的属性\n                .replace( /v:\\w+=([\"']?)[^'\"]+\\1/g, '' )\n                .replace( /<(!|script[^>]*>.*?<\\/script(?=[>\\s])|\\/?(\\?xml(:\\w+)?|xml|meta|link|style|\\w+:\\w+)(?=[\\s\\/>]))[^>]*>/gi, \"\" )\n                .replace( /<p [^>]*class=\"?MsoHeading\"?[^>]*>(.*?)<\\/p>/gi, \"<p><strong>$1</strong></p>\" )\n                //去掉多余的属性\n                .replace( /\\s+(class|lang|align)\\s*=\\s*(['\"]?)([\\w-]+)\\2/ig, function(str,name,marks,val){\n                    //保留list的标示\n                    return name == 'class' && val == 'MsoListParagraph' ? str : ''\n                })\n                //清除多余的font/span不能匹配&nbsp;有可能是空格\n                .replace( /<(font|span)[^>]*>(\\s*)<\\/\\1>/gi, function(a,b,c){\n                    return c.replace(/[\\t\\r\\n ]+/g,' ')\n                })\n                //处理style的问题\n                .replace( /(<[a-z][^>]*)\\sstyle=([\"'])([^\\2]*?)\\2/gi, function( str, tag, tmp, style ) {\n                    var n = [],\n                        s = style.replace( /^\\s+|\\s+$/, '' )\n                            .replace(/&#39;/g,'\\'')\n                            .replace( /&quot;/gi, \"'\" )\n                            .replace(/[\\d.]+(cm|pt)/g,function(str){\n                                return utils.transUnitToPx(str)\n                            })\n                            .split( /;\\s*/g );\n\n                    for ( var i = 0,v; v = s[i];i++ ) {\n\n                        var name, value,\n                            parts = v.split( \":\" );\n\n                        if ( parts.length == 2 ) {\n                            name = parts[0].toLowerCase();\n                            value = parts[1].toLowerCase();\n                            if(/^(background)\\w*/.test(name) && value.replace(/(initial|\\s)/g,'').length == 0\n                                ||\n                                /^(margin)\\w*/.test(name) && /^0\\w+$/.test(value)\n                            ){\n                                continue;\n                            }\n\n                            switch ( name ) {\n                                case \"mso-padding-alt\":\n                                case \"mso-padding-top-alt\":\n                                case \"mso-padding-right-alt\":\n                                case \"mso-padding-bottom-alt\":\n                                case \"mso-padding-left-alt\":\n                                case \"mso-margin-alt\":\n                                case \"mso-margin-top-alt\":\n                                case \"mso-margin-right-alt\":\n                                case \"mso-margin-bottom-alt\":\n                                case \"mso-margin-left-alt\":\n                                //ie下会出现挤到一起的情况\n                               //case \"mso-table-layout-alt\":\n                                case \"mso-height\":\n                                case \"mso-width\":\n                                case \"mso-vertical-align-alt\":\n                                    //trace:1819 ff下会解析出padding在table上\n                                    if(!/<table/.test(tag))\n                                        n[i] = name.replace( /^mso-|-alt$/g, \"\" ) + \":\" + transUnit( value );\n                                    continue;\n                                case \"horiz-align\":\n                                    n[i] = \"text-align:\" + value;\n                                    continue;\n\n                                case \"vert-align\":\n                                    n[i] = \"vertical-align:\" + value;\n                                    continue;\n\n                                case \"font-color\":\n                                case \"mso-foreground\":\n                                    n[i] = \"color:\" + value;\n                                    continue;\n\n                                case \"mso-background\":\n                                case \"mso-highlight\":\n                                    n[i] = \"background:\" + value;\n                                    continue;\n\n                                case \"mso-default-height\":\n                                    n[i] = \"min-height:\" + transUnit( value );\n                                    continue;\n\n                                case \"mso-default-width\":\n                                    n[i] = \"min-width:\" + transUnit( value );\n                                    continue;\n\n                                case \"mso-padding-between-alt\":\n                                    n[i] = \"border-collapse:separate;border-spacing:\" + transUnit( value );\n                                    continue;\n\n                                case \"text-line-through\":\n                                    if ( (value == \"single\") || (value == \"double\") ) {\n                                        n[i] = \"text-decoration:line-through\";\n                                    }\n                                    continue;\n                                case \"mso-zero-height\":\n                                    if ( value == \"yes\" ) {\n                                        n[i] = \"display:none\";\n                                    }\n                                    continue;\n//                                case 'background':\n//                                    break;\n                                case 'margin':\n                                    if ( !/[1-9]/.test( value ) ) {\n                                        continue;\n                                    }\n\n                            }\n\n                            if ( /^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test( name )\n                                ||\n                                /text\\-indent|padding|margin/.test(name) && /\\-[\\d.]+/.test(value)\n                            ) {\n                                continue;\n                            }\n\n                            n[i] = name + \":\" + parts[1];\n                        }\n                    }\n                    return tag + (n.length ? ' style=\"' + n.join( ';').replace(/;{2,}/g,';') + '\"' : '');\n                })\n\n\n    }\n\n    return function ( html ) {\n        return (isWordDocument( html ) ? filterPasteWord( html ) : html);\n    };\n}();\n\n// core/node.js\n/**\n * 编辑器模拟的节点类\n * @file\n * @module UE\n * @class uNode\n * @since 1.2.6.1\n */\n\n/**\n * UEditor公用空间，UEditor所有的功能都挂载在该空间下\n * @unfile\n * @module UE\n */\n\n(function () {\n\n    /**\n     * 编辑器模拟的节点类\n     * @unfile\n     * @module UE\n     * @class uNode\n     */\n\n    /**\n     * 通过一个键值对，创建一个uNode对象\n     * @constructor\n     * @param { Object } attr 传入要创建的uNode的初始属性\n     * @example\n     * ```javascript\n     * var node = new uNode({\n     *     type:'element',\n     *     tagName:'span',\n     *     attrs:{style:'font-size:14px;'}\n     * }\n     * ```\n     */\n    var uNode = UE.uNode = function (obj) {\n        this.type = obj.type;\n        this.data = obj.data;\n        this.tagName = obj.tagName;\n        this.parentNode = obj.parentNode;\n        this.attrs = obj.attrs || {};\n        this.children = obj.children;\n    };\n\n    var notTransAttrs = {\n        'href':1,\n        'src':1,\n        '_src':1,\n        '_href':1,\n        'cdata_data':1\n    };\n\n    var notTransTagName = {\n        style:1,\n        script:1\n    };\n\n    var indentChar = '    ',\n        breakChar = '\\n';\n\n    function insertLine(arr, current, begin) {\n        arr.push(breakChar);\n        return current + (begin ? 1 : -1);\n    }\n\n    function insertIndent(arr, current) {\n        //插入缩进\n        for (var i = 0; i < current; i++) {\n            arr.push(indentChar);\n        }\n    }\n\n    //创建uNode的静态方法\n    //支持标签和html\n    uNode.createElement = function (html) {\n        if (/[<>]/.test(html)) {\n            return UE.htmlparser(html).children[0]\n        } else {\n            return new uNode({\n                type:'element',\n                children:[],\n                tagName:html\n            })\n        }\n    };\n    uNode.createText = function (data,noTrans) {\n        return new UE.uNode({\n            type:'text',\n            'data':noTrans ? data : utils.unhtml(data || '')\n        })\n    };\n    function nodeToHtml(node, arr, formatter, current) {\n        switch (node.type) {\n            case 'root':\n                for (var i = 0, ci; ci = node.children[i++];) {\n                    //插入新行\n                    if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) {\n                        insertLine(arr, current, true);\n                        insertIndent(arr, current)\n                    }\n                    nodeToHtml(ci, arr, formatter, current)\n                }\n                break;\n            case 'text':\n                isText(node, arr);\n                break;\n            case 'element':\n                isElement(node, arr, formatter, current);\n                break;\n            case 'comment':\n                isComment(node, arr, formatter);\n        }\n        return arr;\n    }\n\n    function isText(node, arr) {\n        if(node.parentNode.tagName == 'pre'){\n            //源码模式下输入html标签，不能做转换处理，直接输出\n            arr.push(node.data)\n        }else{\n            arr.push(notTransTagName[node.parentNode.tagName] ? utils.html(node.data) : node.data.replace(/[ ]{2}/g,' &nbsp;'))\n        }\n\n    }\n\n    function isElement(node, arr, formatter, current) {\n        var attrhtml = '';\n        if (node.attrs) {\n            attrhtml = [];\n            var attrs = node.attrs;\n            for (var a in attrs) {\n                //这里就针对\n                //<p>'<img src='http://nsclick.baidu.com/u.gif?&asdf=\\\"sdf&asdfasdfs;asdf'></p>\n                //这里边的\\\"做转换，要不用innerHTML直接被截断了，属性src\n                //有可能做的不够\n                attrhtml.push(a + (attrs[a] !== undefined ? '=\"' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/[\"]/g, function (a) {\n                   return '&quot;'\n                }) : utils.unhtml(attrs[a])) + '\"' : ''))\n            }\n            attrhtml = attrhtml.join(' ');\n        }\n        arr.push('<' + node.tagName +\n            (attrhtml ? ' ' + attrhtml  : '') +\n            (dtd.$empty[node.tagName] ? '\\/' : '' ) + '>'\n        );\n        //插入新行\n        if (formatter  &&  !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') {\n            if(node.children && node.children.length){\n                current = insertLine(arr, current, true);\n                insertIndent(arr, current)\n            }\n\n        }\n        if (node.children && node.children.length) {\n            for (var i = 0, ci; ci = node.children[i++];) {\n                if (formatter && ci.type == 'element' &&  !dtd.$inlineWithA[ci.tagName] && i > 1) {\n                    insertLine(arr, current);\n                    insertIndent(arr, current)\n                }\n                nodeToHtml(ci, arr, formatter, current)\n            }\n        }\n        if (!dtd.$empty[node.tagName]) {\n            if (formatter && !dtd.$inlineWithA[node.tagName]  && node.tagName != 'pre') {\n\n                if(node.children && node.children.length){\n                    current = insertLine(arr, current);\n                    insertIndent(arr, current)\n                }\n            }\n            arr.push('<\\/' + node.tagName + '>');\n        }\n\n    }\n\n    function isComment(node, arr) {\n        arr.push('<!--' + node.data + '-->');\n    }\n\n    function getNodeById(root, id) {\n        var node;\n        if (root.type == 'element' && root.getAttr('id') == id) {\n            return root;\n        }\n        if (root.children && root.children.length) {\n            for (var i = 0, ci; ci = root.children[i++];) {\n                if (node = getNodeById(ci, id)) {\n                    return node;\n                }\n            }\n        }\n    }\n\n    function getNodesByTagName(node, tagName, arr) {\n        if (node.type == 'element' && node.tagName == tagName) {\n            arr.push(node);\n        }\n        if (node.children && node.children.length) {\n            for (var i = 0, ci; ci = node.children[i++];) {\n                getNodesByTagName(ci, tagName, arr)\n            }\n        }\n    }\n    function nodeTraversal(root,fn){\n        if(root.children && root.children.length){\n            for(var i= 0,ci;ci=root.children[i];){\n                nodeTraversal(ci,fn);\n                //ci被替换的情况，这里就不再走 fn了\n                if(ci.parentNode ){\n                    if(ci.children && ci.children.length){\n                        fn(ci)\n                    }\n                    if(ci.parentNode) i++\n                }\n            }\n        }else{\n            fn(root)\n        }\n\n    }\n    uNode.prototype = {\n\n        /**\n         * 当前节点对象，转换成html文本\n         * @method toHtml\n         * @return { String } 返回转换后的html字符串\n         * @example\n         * ```javascript\n         * node.toHtml();\n         * ```\n         */\n\n        /**\n         * 当前节点对象，转换成html文本\n         * @method toHtml\n         * @param { Boolean } formatter 是否格式化返回值\n         * @return { String } 返回转换后的html字符串\n         * @example\n         * ```javascript\n         * node.toHtml( true );\n         * ```\n         */\n        toHtml:function (formatter) {\n            var arr = [];\n            nodeToHtml(this, arr, formatter, 0);\n            return arr.join('')\n        },\n\n        /**\n         * 获取节点的html内容\n         * @method innerHTML\n         * @warning 假如节点的type不是'element'，或节点的标签名称不在dtd列表里，直接返回当前节点\n         * @return { String } 返回节点的html内容\n         * @example\n         * ```javascript\n         * var htmlstr = node.innerHTML();\n         * ```\n         */\n\n        /**\n         * 设置节点的html内容\n         * @method innerHTML\n         * @warning 假如节点的type不是'element'，或节点的标签名称不在dtd列表里，直接返回当前节点\n         * @param { String } htmlstr 传入要设置的html内容\n         * @return { UE.uNode } 返回节点本身\n         * @example\n         * ```javascript\n         * node.innerHTML('<span>text</span>');\n         * ```\n         */\n        innerHTML:function (htmlstr) {\n            if (this.type != 'element' || dtd.$empty[this.tagName]) {\n                return this;\n            }\n            if (utils.isString(htmlstr)) {\n                if(this.children){\n                    for (var i = 0, ci; ci = this.children[i++];) {\n                        ci.parentNode = null;\n                    }\n                }\n                this.children = [];\n                var tmpRoot = UE.htmlparser(htmlstr);\n                for (var i = 0, ci; ci = tmpRoot.children[i++];) {\n                    this.children.push(ci);\n                    ci.parentNode = this;\n                }\n                return this;\n            } else {\n                var tmpRoot = new UE.uNode({\n                    type:'root',\n                    children:this.children\n                });\n                return tmpRoot.toHtml();\n            }\n        },\n\n        /**\n         * 获取节点的纯文本内容\n         * @method innerText\n         * @warning 假如节点的type不是'element'，或节点的标签名称不在dtd列表里，直接返回当前节点\n         * @return { String } 返回节点的存文本内容\n         * @example\n         * ```javascript\n         * var textStr = node.innerText();\n         * ```\n         */\n\n        /**\n         * 设置节点的纯文本内容\n         * @method innerText\n         * @warning 假如节点的type不是'element'，或节点的标签名称不在dtd列表里，直接返回当前节点\n         * @param { String } textStr 传入要设置的文本内容\n         * @return { UE.uNode } 返回节点本身\n         * @example\n         * ```javascript\n         * node.innerText('<span>text</span>');\n         * ```\n         */\n        innerText:function (textStr,noTrans) {\n            if (this.type != 'element' || dtd.$empty[this.tagName]) {\n                return this;\n            }\n            if (textStr) {\n                if(this.children){\n                    for (var i = 0, ci; ci = this.children[i++];) {\n                        ci.parentNode = null;\n                    }\n                }\n                this.children = [];\n                this.appendChild(uNode.createText(textStr,noTrans));\n                return this;\n            } else {\n                return this.toHtml().replace(/<[^>]+>/g, '');\n            }\n        },\n\n        /**\n         * 获取当前对象的data属性\n         * @method getData\n         * @return { Object } 若节点的type值是elemenet，返回空字符串，否则返回节点的data属性\n         * @example\n         * ```javascript\n         * node.getData();\n         * ```\n         */\n        getData:function () {\n            if (this.type == 'element')\n                return '';\n            return this.data\n        },\n\n        /**\n         * 获取当前节点下的第一个子节点\n         * @method firstChild\n         * @return { UE.uNode } 返回第一个子节点\n         * @example\n         * ```javascript\n         * node.firstChild(); //返回第一个子节点\n         * ```\n         */\n        firstChild:function () {\n//            if (this.type != 'element' || dtd.$empty[this.tagName]) {\n//                return this;\n//            }\n            return this.children ? this.children[0] : null;\n        },\n\n        /**\n         * 获取当前节点下的最后一个子节点\n         * @method lastChild\n         * @return { UE.uNode } 返回最后一个子节点\n         * @example\n         * ```javascript\n         * node.lastChild(); //返回最后一个子节点\n         * ```\n         */\n        lastChild:function () {\n//            if (this.type != 'element' || dtd.$empty[this.tagName] ) {\n//                return this;\n//            }\n            return this.children ? this.children[this.children.length - 1] : null;\n        },\n\n        /**\n         * 获取和当前节点有相同父亲节点的前一个节点\n         * @method previousSibling\n         * @return { UE.uNode } 返回前一个节点\n         * @example\n         * ```javascript\n         * node.children[2].previousSibling(); //返回子节点node.children[1]\n         * ```\n         */\n        previousSibling : function(){\n            var parent = this.parentNode;\n            for (var i = 0, ci; ci = parent.children[i]; i++) {\n                if (ci === this) {\n                   return i == 0 ? null : parent.children[i-1];\n                }\n            }\n\n        },\n\n        /**\n         * 获取和当前节点有相同父亲节点的后一个节点\n         * @method nextSibling\n         * @return { UE.uNode } 返回后一个节点,找不到返回null\n         * @example\n         * ```javascript\n         * node.children[2].nextSibling(); //如果有，返回子节点node.children[3]\n         * ```\n         */\n        nextSibling : function(){\n            var parent = this.parentNode;\n            for (var i = 0, ci; ci = parent.children[i++];) {\n                if (ci === this) {\n                    return parent.children[i];\n                }\n            }\n        },\n\n        /**\n         * 用新的节点替换当前节点\n         * @method replaceChild\n         * @param { UE.uNode } target 要替换成该节点参数\n         * @param { UE.uNode } source 要被替换掉的节点\n         * @return { UE.uNode } 返回替换之后的节点对象\n         * @example\n         * ```javascript\n         * node.replaceChild(newNode, childNode); //用newNode替换childNode,childNode是node的子节点\n         * ```\n         */\n        replaceChild:function (target, source) {\n            if (this.children) {\n                if(target.parentNode){\n                    target.parentNode.removeChild(target);\n                }\n                for (var i = 0, ci; ci = this.children[i]; i++) {\n                    if (ci === source) {\n                        this.children.splice(i, 1, target);\n                        source.parentNode = null;\n                        target.parentNode = this;\n                        return target;\n                    }\n                }\n            }\n        },\n\n        /**\n         * 在节点的子节点列表最后位置插入一个节点\n         * @method appendChild\n         * @param { UE.uNode } node 要插入的节点\n         * @return { UE.uNode } 返回刚插入的子节点\n         * @example\n         * ```javascript\n         * node.appendChild( newNode ); //在node内插入子节点newNode\n         * ```\n         */\n        appendChild:function (node) {\n            if (this.type == 'root' || (this.type == 'element' && !dtd.$empty[this.tagName])) {\n                if (!this.children) {\n                    this.children = []\n                }\n                if(node.parentNode){\n                    node.parentNode.removeChild(node);\n                }\n                for (var i = 0, ci; ci = this.children[i]; i++) {\n                    if (ci === node) {\n                        this.children.splice(i, 1);\n                        break;\n                    }\n                }\n                this.children.push(node);\n                node.parentNode = this;\n                return node;\n            }\n\n\n        },\n\n        /**\n         * 在传入节点的前面插入一个节点\n         * @method insertBefore\n         * @param { UE.uNode } target 要插入的节点\n         * @param { UE.uNode } source 在该参数节点前面插入\n         * @return { UE.uNode } 返回刚插入的子节点\n         * @example\n         * ```javascript\n         * node.parentNode.insertBefore(newNode, node); //在node节点后面插入newNode\n         * ```\n         */\n        insertBefore:function (target, source) {\n            if (this.children) {\n                if(target.parentNode){\n                    target.parentNode.removeChild(target);\n                }\n                for (var i = 0, ci; ci = this.children[i]; i++) {\n                    if (ci === source) {\n                        this.children.splice(i, 0, target);\n                        target.parentNode = this;\n                        return target;\n                    }\n                }\n\n            }\n        },\n\n        /**\n         * 在传入节点的后面插入一个节点\n         * @method insertAfter\n         * @param { UE.uNode } target 要插入的节点\n         * @param { UE.uNode } source 在该参数节点后面插入\n         * @return { UE.uNode } 返回刚插入的子节点\n         * @example\n         * ```javascript\n         * node.parentNode.insertAfter(newNode, node); //在node节点后面插入newNode\n         * ```\n         */\n        insertAfter:function (target, source) {\n            if (this.children) {\n                if(target.parentNode){\n                    target.parentNode.removeChild(target);\n                }\n                for (var i = 0, ci; ci = this.children[i]; i++) {\n                    if (ci === source) {\n                        this.children.splice(i + 1, 0, target);\n                        target.parentNode = this;\n                        return target;\n                    }\n\n                }\n            }\n        },\n\n        /**\n         * 从当前节点的子节点列表中，移除节点\n         * @method removeChild\n         * @param { UE.uNode } node 要移除的节点引用\n         * @param { Boolean } keepChildren 是否保留移除节点的子节点，若传入true，自动把移除节点的子节点插入到移除的位置\n         * @return { * } 返回刚移除的子节点\n         * @example\n         * ```javascript\n         * node.removeChild(childNode,true); //在node的子节点列表中移除child节点，并且吧child的子节点插入到移除的位置\n         * ```\n         */\n        removeChild:function (node,keepChildren) {\n            if (this.children) {\n                for (var i = 0, ci; ci = this.children[i]; i++) {\n                    if (ci === node) {\n                        this.children.splice(i, 1);\n                        ci.parentNode = null;\n                        if(keepChildren && ci.children && ci.children.length){\n                            for(var j= 0,cj;cj=ci.children[j];j++){\n                                this.children.splice(i+j,0,cj);\n                                cj.parentNode = this;\n\n                            }\n                        }\n                        return ci;\n                    }\n                }\n            }\n        },\n\n        /**\n         * 获取当前节点所代表的元素属性，即获取attrs对象下的属性值\n         * @method getAttr\n         * @param { String } attrName 要获取的属性名称\n         * @return { * } 返回attrs对象下的属性值\n         * @example\n         * ```javascript\n         * node.getAttr('title');\n         * ```\n         */\n        getAttr:function (attrName) {\n            return this.attrs && this.attrs[attrName.toLowerCase()]\n        },\n\n        /**\n         * 设置当前节点所代表的元素属性，即设置attrs对象下的属性值\n         * @method setAttr\n         * @param { String } attrName 要设置的属性名称\n         * @param { * } attrVal 要设置的属性值，类型视设置的属性而定\n         * @return { * } 返回attrs对象下的属性值\n         * @example\n         * ```javascript\n         * node.setAttr('title','标题');\n         * ```\n         */\n        setAttr:function (attrName, attrVal) {\n            if (!attrName) {\n                delete this.attrs;\n                return;\n            }\n            if(!this.attrs){\n                this.attrs = {};\n            }\n            if (utils.isObject(attrName)) {\n                for (var a in attrName) {\n                    if (!attrName[a]) {\n                        delete this.attrs[a]\n                    } else {\n                        this.attrs[a.toLowerCase()] = attrName[a];\n                    }\n                }\n            } else {\n                if (!attrVal) {\n                    delete this.attrs[attrName]\n                } else {\n                    this.attrs[attrName.toLowerCase()] = attrVal;\n                }\n\n            }\n        },\n\n        /**\n         * 获取当前节点在父节点下的位置索引\n         * @method getIndex\n         * @return { Number } 返回索引数值，如果没有父节点，返回-1\n         * @example\n         * ```javascript\n         * node.getIndex();\n         * ```\n         */\n        getIndex:function(){\n            var parent = this.parentNode;\n            for(var i= 0,ci;ci=parent.children[i];i++){\n                if(ci === this){\n                    return i;\n                }\n            }\n            return -1;\n        },\n\n        /**\n         * 在当前节点下，根据id查找节点\n         * @method getNodeById\n         * @param { String } id 要查找的id\n         * @return { UE.uNode } 返回找到的节点\n         * @example\n         * ```javascript\n         * node.getNodeById('textId');\n         * ```\n         */\n        getNodeById:function (id) {\n            var node;\n            if (this.children && this.children.length) {\n                for (var i = 0, ci; ci = this.children[i++];) {\n                    if (node = getNodeById(ci, id)) {\n                        return node;\n                    }\n                }\n            }\n        },\n\n        /**\n         * 在当前节点下，根据元素名称查找节点列表\n         * @method getNodesByTagName\n         * @param { String } tagNames 要查找的元素名称\n         * @return { Array } 返回找到的节点列表\n         * @example\n         * ```javascript\n         * node.getNodesByTagName('span');\n         * ```\n         */\n        getNodesByTagName:function (tagNames) {\n            tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, ' ').split(' ');\n            var arr = [], me = this;\n            utils.each(tagNames, function (tagName) {\n                if (me.children && me.children.length) {\n                    for (var i = 0, ci; ci = me.children[i++];) {\n                        getNodesByTagName(ci, tagName, arr)\n                    }\n                }\n            });\n            return arr;\n        },\n\n        /**\n         * 根据样式名称，获取节点的样式值\n         * @method getStyle\n         * @param { String } name 要获取的样式名称\n         * @return { String } 返回样式值\n         * @example\n         * ```javascript\n         * node.getStyle('font-size');\n         * ```\n         */\n        getStyle:function (name) {\n            var cssStyle = this.getAttr('style');\n            if (!cssStyle) {\n                return ''\n            }\n            var reg = new RegExp('(^|;)\\\\s*' + name + ':([^;]+)','i');\n            var match = cssStyle.match(reg);\n            if (match && match[0]) {\n                return match[2]\n            }\n            return '';\n        },\n\n        /**\n         * 给节点设置样式\n         * @method setStyle\n         * @param { String } name 要设置的的样式名称\n         * @param { String } val 要设置的的样值\n         * @example\n         * ```javascript\n         * node.setStyle('font-size', '12px');\n         * ```\n         */\n        setStyle:function (name, val) {\n            function exec(name, val) {\n                var reg = new RegExp('(^|;)\\\\s*' + name + ':([^;]+;?)', 'gi');\n                cssStyle = cssStyle.replace(reg, '$1');\n                if (val) {\n                    cssStyle = name + ':' + utils.unhtml(val) + ';' + cssStyle\n                }\n\n            }\n\n            var cssStyle = this.getAttr('style');\n            if (!cssStyle) {\n                cssStyle = '';\n            }\n            if (utils.isObject(name)) {\n                for (var a in name) {\n                    exec(a, name[a])\n                }\n            } else {\n                exec(name, val)\n            }\n            this.setAttr('style', utils.trim(cssStyle))\n        },\n\n        /**\n         * 传入一个函数，递归遍历当前节点下的所有节点\n         * @method traversal\n         * @param { Function } fn 遍历到节点的时，传入节点作为参数，运行此函数\n         * @example\n         * ```javascript\n         * traversal(node, function(){\n         *     console.log(node.type);\n         * });\n         * ```\n         */\n        traversal:function(fn){\n            if(this.children && this.children.length){\n                nodeTraversal(this,fn);\n            }\n            return this;\n        }\n    }\n})();\n\n\n// core/htmlparser.js\n/**\n * html字符串转换成uNode节点\n * @file\n * @module UE\n * @since 1.2.6.1\n */\n\n/**\n * UEditor公用空间，UEditor所有的功能都挂载在该空间下\n * @unfile\n * @module UE\n */\n\n/**\n * html字符串转换成uNode节点的静态方法\n * @method htmlparser\n * @param { String } htmlstr 要转换的html代码\n * @param { Boolean } ignoreBlank 若设置为true，转换的时候忽略\\n\\r\\t等空白字符\n * @return { uNode } 给定的html片段转换形成的uNode对象\n * @example\n * ```javascript\n * var root = UE.htmlparser('<p><b>htmlparser</b></p>', true);\n * ```\n */\n\nvar htmlparser = UE.htmlparser = function (htmlstr,ignoreBlank) {\n    //todo 原来的方式  [^\"'<>\\/] 有\\/就不能配对上 <TD vAlign=top background=../AAA.JPG> 这样的标签了\n    //先去掉了，加上的原因忘了，这里先记录\n    var re_tag = /<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)-->)|(?:([^\\s\\/<>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'<>])*)\\/?>))/g,\n        re_attr = /([\\w\\-:.]+)(?:(?:\\s*=\\s*(?:(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s>]+)))|(?=\\s|$))/g;\n\n    //ie下取得的html可能会有\\n存在，要去掉，在处理replace(/[\\t\\r\\n]*/g,'');代码高量的\\n不能去除\n    var allowEmptyTags = {\n        b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1,\n        sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1\n    };\n\thtmlstr = htmlstr ? htmlstr.replace(new RegExp(domUtils.fillChar, 'g'), '') : '';\n    if(!ignoreBlank){\n        htmlstr = htmlstr.replace(new RegExp('[\\\\r\\\\t\\\\n'+(ignoreBlank?'':' ')+']*<\\/?(\\\\w+)\\\\s*(?:[^>]*)>[\\\\r\\\\t\\\\n'+(ignoreBlank?'':' ')+']*','g'), function(a,b){\n            //br暂时单独处理\n            if(b && allowEmptyTags[b.toLowerCase()]){\n                return a.replace(/(^[\\n\\r]+)|([\\n\\r]+$)/g,'');\n            }\n            return a.replace(new RegExp('^[\\\\r\\\\n'+(ignoreBlank?'':' ')+']+'),'').replace(new RegExp('[\\\\r\\\\n'+(ignoreBlank?'':' ')+']+$'),'');\n        });\n    }\n\n    var notTransAttrs = {\n        'href':1,\n        'src':1\n    };\n\n    var uNode = UE.uNode,\n        needParentNode = {\n            'td':'tr',\n            'tr':['tbody','thead','tfoot'],\n            'tbody':'table',\n            'th':'tr',\n            'thead':'table',\n            'tfoot':'table',\n            'caption':'table',\n            'li':['ul', 'ol'],\n            'dt':'dl',\n            'dd':'dl',\n            'option':'select'\n        },\n        needChild = {\n            'ol':'li',\n            'ul':'li'\n        };\n\n    function text(parent, data) {\n\n        if(needChild[parent.tagName]){\n            var tmpNode = uNode.createElement(needChild[parent.tagName]);\n            parent.appendChild(tmpNode);\n            tmpNode.appendChild(uNode.createText(data));\n            parent = tmpNode;\n        }else{\n\n            parent.appendChild(uNode.createText(data));\n        }\n    }\n\n    function element(parent, tagName, htmlattr) {\n        var needParentTag;\n        if (needParentTag = needParentNode[tagName]) {\n            var tmpParent = parent,hasParent;\n            while(tmpParent.type != 'root'){\n                if(utils.isArray(needParentTag) ? utils.indexOf(needParentTag, tmpParent.tagName) != -1 : needParentTag == tmpParent.tagName){\n                    parent = tmpParent;\n                    hasParent = true;\n                    break;\n                }\n                tmpParent = tmpParent.parentNode;\n            }\n            if(!hasParent){\n                parent = element(parent, utils.isArray(needParentTag) ? needParentTag[0] : needParentTag)\n            }\n        }\n        //按dtd处理嵌套\n//        if(parent.type != 'root' && !dtd[parent.tagName][tagName])\n//            parent = parent.parentNode;\n        var elm = new uNode({\n            parentNode:parent,\n            type:'element',\n            tagName:tagName.toLowerCase(),\n            //是自闭合的处理一下\n            children:dtd.$empty[tagName] ? null : []\n        });\n        //如果属性存在，处理属性\n        if (htmlattr) {\n            var attrs = {}, match;\n            while (match = re_attr.exec(htmlattr)) {\n                attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()] ? (match[2] || match[3] || match[4]) : utils.unhtml(match[2] || match[3] || match[4])\n            }\n            elm.attrs = attrs;\n        }\n        //trace:3970\n//        //如果parent下不能放elm\n//        if(dtd.$inline[parent.tagName] && dtd.$block[elm.tagName] && !dtd[parent.tagName][elm.tagName]){\n//            parent = parent.parentNode;\n//            elm.parentNode = parent;\n//        }\n        parent.children.push(elm);\n        //如果是自闭合节点返回父亲节点\n        return  dtd.$empty[tagName] ? parent : elm\n    }\n\n    function comment(parent, data) {\n        parent.children.push(new uNode({\n            type:'comment',\n            data:data,\n            parentNode:parent\n        }));\n    }\n\n    var match, currentIndex = 0, nextIndex = 0;\n    //设置根节点\n    var root = new uNode({\n        type:'root',\n        children:[]\n    });\n    var currentParent = root;\n\n    while (match = re_tag.exec(htmlstr)) {\n        currentIndex = match.index;\n        try{\n            if (currentIndex > nextIndex) {\n                //text node\n                text(currentParent, htmlstr.slice(nextIndex, currentIndex));\n            }\n            if (match[3]) {\n\n                if(dtd.$cdata[currentParent.tagName]){\n                    text(currentParent, match[0]);\n                }else{\n                    //start tag\n                    currentParent = element(currentParent, match[3].toLowerCase(), match[4]);\n                }\n\n\n            } else if (match[1]) {\n                if(currentParent.type != 'root'){\n                    if(dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]){\n                        text(currentParent, match[0]);\n                    }else{\n                        var tmpParent = currentParent;\n                        while(currentParent.type == 'element' && currentParent.tagName != match[1].toLowerCase()){\n                            currentParent = currentParent.parentNode;\n                            if(currentParent.type == 'root'){\n                                currentParent = tmpParent;\n                                throw 'break'\n                            }\n                        }\n                        //end tag\n                        currentParent = currentParent.parentNode;\n                    }\n\n                }\n\n            } else if (match[2]) {\n                //comment\n                comment(currentParent, match[2])\n            }\n        }catch(e){}\n\n        nextIndex = re_tag.lastIndex;\n\n    }\n    //如果结束是文本，就有可能丢掉，所以这里手动判断一下\n    //例如 <li>sdfsdfsdf<li>sdfsdfsdfsdf\n    if (nextIndex < htmlstr.length) {\n        text(currentParent, htmlstr.slice(nextIndex));\n    }\n    return root;\n};\n\n\n// core/filternode.js\n/**\n * UE过滤节点的静态方法\n * @file\n */\n\n/**\n * UEditor公用空间，UEditor所有的功能都挂载在该空间下\n * @module UE\n */\n\n\n/**\n * 根据传入节点和过滤规则过滤相应节点\n * @module UE\n * @since 1.2.6.1\n * @method filterNode\n * @param { Object } root 指定root节点\n * @param { Object } rules 过滤规则json对象\n * @example\n * ```javascript\n * UE.filterNode(root,editor.options.filterRules);\n * ```\n */\nvar filterNode = UE.filterNode = function () {\n    function filterNode(node,rules){\n        switch (node.type) {\n            case 'text':\n                break;\n            case 'element':\n                var val;\n                if(val = rules[node.tagName]){\n                   if(val === '-'){\n                       node.parentNode.removeChild(node)\n                   }else if(utils.isFunction(val)){\n                       var parentNode = node.parentNode,\n                           index = node.getIndex();\n                       val(node);\n                       if(node.parentNode){\n                           if(node.children){\n                               for(var i = 0,ci;ci=node.children[i];){\n                                   filterNode(ci,rules);\n                                   if(ci.parentNode){\n                                       i++;\n                                   }\n                               }\n                           }\n                       }else{\n                           for(var i = index,ci;ci=parentNode.children[i];){\n                               filterNode(ci,rules);\n                               if(ci.parentNode){\n                                   i++;\n                               }\n                           }\n                       }\n\n\n                   }else{\n                       var attrs = val['$'];\n                       if(attrs && node.attrs){\n                           var tmpAttrs = {},tmpVal;\n                           for(var a in attrs){\n                               tmpVal = node.getAttr(a);\n                               //todo 只先对style单独处理\n                               if(a == 'style' && utils.isArray(attrs[a])){\n                                   var tmpCssStyle = [];\n                                   utils.each(attrs[a],function(v){\n                                       var tmp;\n                                       if(tmp = node.getStyle(v)){\n                                           tmpCssStyle.push(v + ':' + tmp);\n                                       }\n                                   });\n                                   tmpVal = tmpCssStyle.join(';')\n                               }\n                               if(tmpVal){\n                                   tmpAttrs[a] = tmpVal;\n                               }\n\n                           }\n                           node.attrs = tmpAttrs;\n                       }\n                       if(node.children){\n                           for(var i = 0,ci;ci=node.children[i];){\n                               filterNode(ci,rules);\n                               if(ci.parentNode){\n                                   i++;\n                               }\n                           }\n                       }\n                   }\n                }else{\n                    //如果不在名单里扣出子节点并删除该节点,cdata除外\n                    if(dtd.$cdata[node.tagName]){\n                        node.parentNode.removeChild(node)\n                    }else{\n                        var parentNode = node.parentNode,\n                            index = node.getIndex();\n                        node.parentNode.removeChild(node,true);\n                        for(var i = index,ci;ci=parentNode.children[i];){\n                            filterNode(ci,rules);\n                            if(ci.parentNode){\n                                i++;\n                            }\n                        }\n                    }\n                }\n                break;\n            case 'comment':\n                node.parentNode.removeChild(node)\n        }\n\n    }\n    return function(root,rules){\n        if(utils.isEmptyObject(rules)){\n            return root;\n        }\n        var val;\n        if(val = rules['-']){\n            utils.each(val.split(' '),function(k){\n                rules[k] = '-'\n            })\n        }\n        for(var i= 0,ci;ci=root.children[i];){\n            filterNode(ci,rules);\n            if(ci.parentNode){\n               i++;\n            }\n        }\n        return root;\n    }\n}();\n\n// core/plugin.js\n/**\n * Created with JetBrains PhpStorm.\n * User: campaign\n * Date: 10/8/13\n * Time: 6:15 PM\n * To change this template use File | Settings | File Templates.\n */\nUE.plugin = function(){\n    var _plugins = {};\n    return {\n        register : function(pluginName,fn,oldOptionName,afterDisabled){\n            if(oldOptionName && utils.isFunction(oldOptionName)){\n                afterDisabled = oldOptionName;\n                oldOptionName = null\n            }\n            _plugins[pluginName] = {\n                optionName : oldOptionName || pluginName,\n                execFn : fn,\n                //当插件被禁用时执行\n                afterDisabled : afterDisabled\n            }\n        },\n        load : function(editor){\n            utils.each(_plugins,function(plugin){\n                var _export = plugin.execFn.call(editor);\n                if(editor.options[plugin.optionName] !== false){\n                    if(_export){\n                        //后边需要再做扩展\n                        utils.each(_export,function(v,k){\n                            switch(k.toLowerCase()){\n                                case 'shortcutkey':\n                                    editor.addshortcutkey(v);\n                                    break;\n                                case 'bindevents':\n                                    utils.each(v,function(fn,eventName){\n                                        editor.addListener(eventName,fn);\n                                    });\n                                    break;\n                                case 'bindmultievents':\n                                    utils.each(utils.isArray(v) ? v:[v],function(event){\n                                        var types = utils.trim(event.type).split(/\\s+/);\n                                        utils.each(types,function(eventName){\n                                            editor.addListener(eventName, event.handler);\n                                        });\n                                    });\n                                    break;\n                                case 'commands':\n                                    utils.each(v,function(execFn,execName){\n                                        editor.commands[execName] = execFn\n                                    });\n                                    break;\n                                case 'outputrule':\n                                    editor.addOutputRule(v);\n                                    break;\n                                case 'inputrule':\n                                    editor.addInputRule(v);\n                                    break;\n                                case 'defaultoptions':\n                                    editor.setOpt(v)\n                            }\n                        })\n                    }\n\n                }else if(plugin.afterDisabled){\n                    plugin.afterDisabled.call(editor)\n                }\n\n            });\n            //向下兼容\n            utils.each(UE.plugins,function(plugin){\n                plugin.call(editor);\n            });\n        },\n        run : function(pluginName,editor){\n            var plugin = _plugins[pluginName];\n            if(plugin){\n                plugin.exeFn.call(editor)\n            }\n        }\n    }\n}();\n\n// core/keymap.js\nvar keymap = UE.keymap  = {\n    'Backspace' : 8,\n    'Tab' : 9,\n    'Enter' : 13,\n\n    'Shift':16,\n    'Control':17,\n    'Alt':18,\n    'CapsLock':20,\n\n    'Esc':27,\n\n    'Spacebar':32,\n\n    'PageUp':33,\n    'PageDown':34,\n    'End':35,\n    'Home':36,\n\n    'Left':37,\n    'Up':38,\n    'Right':39,\n    'Down':40,\n\n    'Insert':45,\n\n    'Del':46,\n\n    'NumLock':144,\n\n    'Cmd':91,\n\n    '=':187,\n    '-':189,\n\n    \"b\":66,\n    'i':73,\n    //回退\n    'z':90,\n    'y':89,\n    //粘贴\n    'v' : 86,\n    'x' : 88,\n\n    's' : 83,\n\n    'n' : 78\n};\n\n// core/localstorage.js\n//存储媒介封装\nvar LocalStorage = UE.LocalStorage = (function () {\n\n    var storage = window.localStorage || getUserData() || null,\n        LOCAL_FILE = 'localStorage';\n\n    return {\n\n        saveLocalData: function (key, data) {\n\n            if (storage && data) {\n                storage.setItem(key, data);\n                return true;\n            }\n\n            return false;\n\n        },\n\n        getLocalData: function (key) {\n\n            if (storage) {\n                return storage.getItem(key);\n            }\n\n            return null;\n\n        },\n\n        removeItem: function (key) {\n\n            storage && storage.removeItem(key);\n\n        }\n\n    };\n\n    function getUserData() {\n\n        var container = document.createElement(\"div\");\n        container.style.display = \"none\";\n\n        if (!container.addBehavior) {\n            return null;\n        }\n\n        container.addBehavior(\"#default#userdata\");\n\n        return {\n\n            getItem: function (key) {\n\n                var result = null;\n\n                try {\n                    document.body.appendChild(container);\n                    container.load(LOCAL_FILE);\n                    result = container.getAttribute(key);\n                    document.body.removeChild(container);\n                } catch (e) {\n                }\n\n                return result;\n\n            },\n\n            setItem: function (key, value) {\n\n                document.body.appendChild(container);\n                container.setAttribute(key, value);\n                container.save(LOCAL_FILE);\n                document.body.removeChild(container);\n\n            },\n\n            //// 暂时没有用到\n            //clear: function () {\n            //\n            //    var expiresTime = new Date();\n            //    expiresTime.setFullYear(expiresTime.getFullYear() - 1);\n            //    document.body.appendChild(container);\n            //    container.expires = expiresTime.toUTCString();\n            //    container.save(LOCAL_FILE);\n            //    document.body.removeChild(container);\n            //\n            //},\n\n            removeItem: function (key) {\n\n                document.body.appendChild(container);\n                container.removeAttribute(key);\n                container.save(LOCAL_FILE);\n                document.body.removeChild(container);\n\n            }\n\n        };\n\n    }\n\n})();\n\n(function () {\n\n    var ROOTKEY = 'ueditor_preference';\n\n    UE.Editor.prototype.setPreferences = function(key,value){\n        var obj = {};\n        if (utils.isString(key)) {\n            obj[ key ] = value;\n        } else {\n            obj = key;\n        }\n        var data = LocalStorage.getLocalData(ROOTKEY);\n        if (data && (data = utils.str2json(data))) {\n            utils.extend(data, obj);\n        } else {\n            data = obj;\n        }\n        data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data));\n    };\n\n    UE.Editor.prototype.getPreferences = function(key){\n        var data = LocalStorage.getLocalData(ROOTKEY);\n        if (data && (data = utils.str2json(data))) {\n            return key ? data[key] : data\n        }\n        return null;\n    };\n\n    UE.Editor.prototype.removePreferences = function (key) {\n        var data = LocalStorage.getLocalData(ROOTKEY);\n        if (data && (data = utils.str2json(data))) {\n            data[key] = undefined;\n            delete data[key]\n        }\n        data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data));\n    };\n\n})();\n\n\n// plugins/defaultfilter.js\n///import core\n///plugin 编辑器默认的过滤转换机制\n\nUE.plugins['defaultfilter'] = function () {\n    var me = this;\n    me.setOpt({\n        'allowDivTransToP':true,\n        'disabledTableInTable':true\n    });\n    //默认的过滤处理\n    //进入编辑器的内容处理\n    me.addInputRule(function (root) {\n        var allowDivTransToP = this.options.allowDivTransToP;\n        var val;\n        function tdParent(node){\n            while(node && node.type == 'element'){\n                if(node.tagName == 'td'){\n                    return true;\n                }\n                node = node.parentNode;\n            }\n            return false;\n        }\n        //进行默认的处理\n        root.traversal(function (node) {\n            if (node.type == 'element') {\n                if (!dtd.$cdata[node.tagName] && me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) {\n                    if (!node.firstChild()) node.parentNode.removeChild(node);\n                    else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) {\n                        node.parentNode.removeChild(node, true)\n                    }\n                    return;\n                }\n                switch (node.tagName) {\n                    case 'style':\n                    case 'script':\n                        node.setAttr({\n                            cdata_tag: node.tagName,\n                            cdata_data: (node.innerHTML() || ''),\n                            '_ue_custom_node_':'true'\n                        });\n                        node.tagName = 'div';\n                        node.innerHTML('');\n                        break;\n                    case 'a':\n                        if (val = node.getAttr('href')) {\n                            node.setAttr('_href', val)\n                        }\n                        break;\n                    case 'img':\n                        //todo base64暂时去掉，后边做远程图片上传后，干掉这个\n                        if (val = node.getAttr('src')) {\n                            if (/^data:/.test(val)) {\n                                node.parentNode.removeChild(node);\n                                break;\n                            }\n                        }\n                        node.setAttr('_src', node.getAttr('src'));\n                        break;\n                    case 'span':\n                        if (browser.webkit && (val = node.getStyle('white-space'))) {\n                            if (/nowrap|normal/.test(val)) {\n                                node.setStyle('white-space', '');\n                                if (me.options.autoClearEmptyNode && utils.isEmptyObject(node.attrs)) {\n                                    node.parentNode.removeChild(node, true)\n                                }\n                            }\n                        }\n                        val = node.getAttr('id');\n                        if(val && /^_baidu_bookmark_/i.test(val)){\n                            node.parentNode.removeChild(node)\n                        }\n                        break;\n                    case 'p':\n                        if (val = node.getAttr('align')) {\n                            node.setAttr('align');\n                            node.setStyle('text-align', val)\n                        }\n                        //trace:3431\n//                        var cssStyle = node.getAttr('style');\n//                        if (cssStyle) {\n//                            cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, '');\n//                            node.setAttr('style', cssStyle)\n//\n//                        }\n                        //p标签不允许嵌套\n                        utils.each(node.children,function(n){\n                            if(n.type == 'element' && n.tagName == 'p'){\n                                var next = n.nextSibling();\n                                node.parentNode.insertAfter(n,node);\n                                var last = n;\n                                while(next){\n                                    var tmp = next.nextSibling();\n                                    node.parentNode.insertAfter(next,last);\n                                    last = next;\n                                    next = tmp;\n                                }\n                                return false;\n                            }\n                        });\n                        if (!node.firstChild()) {\n                            node.innerHTML(browser.ie ? '&nbsp;' : '<br/>')\n                        }\n                        break;\n                    case 'div':\n                        if(node.getAttr('cdata_tag')){\n                            break;\n                        }\n                        //针对代码这里不处理插入代码的div\n                        val = node.getAttr('class');\n                        if(val && /^line number\\d+/.test(val)){\n                            break;\n                        }\n                        if(!allowDivTransToP){\n                            break;\n                        }\n                        var tmpNode, p = UE.uNode.createElement('p');\n                        while (tmpNode = node.firstChild()) {\n                            if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) {\n                                p.appendChild(tmpNode);\n                            } else {\n                                if (p.firstChild()) {\n                                    node.parentNode.insertBefore(p, node);\n                                    p = UE.uNode.createElement('p');\n                                } else {\n                                    node.parentNode.insertBefore(tmpNode, node);\n                                }\n                            }\n                        }\n                        if (p.firstChild()) {\n                            node.parentNode.insertBefore(p, node);\n                        }\n                        node.parentNode.removeChild(node);\n                        break;\n                    case 'dl':\n                        node.tagName = 'ul';\n                        break;\n                    case 'dt':\n                    case 'dd':\n                        node.tagName = 'li';\n                        break;\n                    case 'li':\n                        var className = node.getAttr('class');\n                        if (!className || !/list\\-/.test(className)) {\n                            node.setAttr()\n                        }\n                        var tmpNodes = node.getNodesByTagName('ol ul');\n                        UE.utils.each(tmpNodes, function (n) {\n                            node.parentNode.insertAfter(n, node);\n                        });\n                        break;\n                    case 'td':\n                    case 'th':\n                    case 'caption':\n                        if(!node.children || !node.children.length){\n                            node.appendChild(browser.ie11below ? UE.uNode.createText(' ') : UE.uNode.createElement('br'))\n                        }\n                        break;\n                    case 'table':\n                        if(me.options.disabledTableInTable && tdParent(node)){\n                            node.parentNode.insertBefore(UE.uNode.createText(node.innerText()),node);\n                            node.parentNode.removeChild(node)\n                        }\n                }\n\n            }\n//            if(node.type == 'comment'){\n//                node.parentNode.removeChild(node);\n//            }\n        })\n\n    });\n\n    //从编辑器出去的内容处理\n    me.addOutputRule(function (root) {\n\n        var val;\n        root.traversal(function (node) {\n            if (node.type == 'element') {\n\n                if (me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) {\n\n                    if (!node.firstChild()) node.parentNode.removeChild(node);\n                    else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) {\n                        node.parentNode.removeChild(node, true)\n                    }\n                    return;\n                }\n                switch (node.tagName) {\n                    case 'div':\n                        if (val = node.getAttr('cdata_tag')) {\n                            node.tagName = val;\n                            node.appendChild(UE.uNode.createText(node.getAttr('cdata_data')));\n                            node.setAttr({cdata_tag: '', cdata_data: '','_ue_custom_node_':''});\n                        }\n                        break;\n                    case 'a':\n                        if (val = node.getAttr('_href')) {\n                            node.setAttr({\n                                'href': utils.html(val),\n                                '_href': ''\n                            })\n                        }\n                        break;\n                        break;\n                    case 'span':\n                        val = node.getAttr('id');\n                        if(val && /^_baidu_bookmark_/i.test(val)){\n                            node.parentNode.removeChild(node)\n                        }\n                        break;\n                    case 'img':\n                        if (val = node.getAttr('_src')) {\n                            node.setAttr({\n                                'src': node.getAttr('_src'),\n                                '_src': ''\n                            })\n                        }\n\n\n                }\n            }\n\n        })\n\n\n    });\n};\n\n\n// plugins/inserthtml.js\n/**\n * 插入html字符串插件\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 插入html代码\n * @command inserthtml\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { String } html 插入的html字符串\n * @remaind 插入的标签内容是在当前的选区位置上插入，如果当前是闭合状态，那直接插入内容， 如果当前是选中状态，将先清除当前选中内容后，再做插入\n * @warning 注意:该命令会对当前选区的位置，对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。\n * @example\n * ```javascript\n * //xxx[BB]xxx 当前选区为非闭合选区，选中BB这两个文本\n * //执行命令，插入<b>CC</b>\n * //插入后的效果 xxx<b>CC</b>xxx\n * //<p>xx|xxx</p> 当前选区为闭合状态\n * //插入<p>CC</p>\n * //结果 <p>xx</p><p>CC</p><p>xxx</p>\n * //<p>xxxx</p>|</p>xxx</p> 当前选区在两个p标签之间\n * //插入 xxxx\n * //结果 <p>xxxx</p><p>xxxx</p></p>xxx</p>\n * ```\n */\n\nUE.commands['inserthtml'] = {\n    execCommand: function (command,html,notNeedFilter){\n        var me = this,\n            range,\n            div;\n        if(!html){\n            return;\n        }\n        if(me.fireEvent('beforeinserthtml',html) === true){\n            return;\n        }\n        range = me.selection.getRange();\n        div = range.document.createElement( 'div' );\n        div.style.display = 'inline';\n\n        if (!notNeedFilter) {\n            var root = UE.htmlparser(html);\n            //如果给了过滤规则就先进行过滤\n            if(me.options.filterRules){\n                UE.filterNode(root,me.options.filterRules);\n            }\n            //执行默认的处理\n            me.filterInputRule(root);\n            html = root.toHtml()\n        }\n        div.innerHTML = utils.trim( html );\n\n        if ( !range.collapsed ) {\n            var tmpNode = range.startContainer;\n            if(domUtils.isFillChar(tmpNode)){\n                range.setStartBefore(tmpNode)\n            }\n            tmpNode = range.endContainer;\n            if(domUtils.isFillChar(tmpNode)){\n                range.setEndAfter(tmpNode)\n            }\n            range.txtToElmBoundary();\n            //结束边界可能放到了br的前边，要把br包含进来\n            // x[xxx]<br/>\n            if(range.endContainer && range.endContainer.nodeType == 1){\n                tmpNode = range.endContainer.childNodes[range.endOffset];\n                if(tmpNode && domUtils.isBr(tmpNode)){\n                    range.setEndAfter(tmpNode);\n                }\n            }\n            if(range.startOffset == 0){\n                tmpNode = range.startContainer;\n                if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){\n                    tmpNode = range.endContainer;\n                    if(range.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){\n                        me.body.innerHTML = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';\n                        range.setStart(me.body.firstChild,0).collapse(true)\n\n                    }\n                }\n            }\n            !range.collapsed && range.deleteContents();\n            if(range.startContainer.nodeType == 1){\n                var child = range.startContainer.childNodes[range.startOffset],pre;\n                if(child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre)){\n                    range.setEnd(pre,pre.childNodes.length).collapse();\n                    while(child.firstChild){\n                        pre.appendChild(child.firstChild);\n                    }\n                    domUtils.remove(child);\n                }\n            }\n\n        }\n\n\n        var child,parent,pre,tmp,hadBreak = 0, nextNode;\n        //如果当前位置选中了fillchar要干掉，要不会产生空行\n        if(range.inFillChar()){\n            child = range.startContainer;\n            if(domUtils.isFillChar(child)){\n                range.setStartBefore(child).collapse(true);\n                domUtils.remove(child);\n            }else if(domUtils.isFillChar(child,true)){\n                child.nodeValue = child.nodeValue.replace(fillCharReg,'');\n                range.startOffset--;\n                range.collapsed && range.collapse(true)\n            }\n        }\n        //列表单独处理\n        var li = domUtils.findParentByTagName(range.startContainer,'li',true);\n        if(li){\n            var next,last;\n            while(child = div.firstChild){\n                //针对hr单独处理一下先\n                while(child && (child.nodeType == 3 || !domUtils.isBlockElm(child) || child.tagName=='HR' )){\n                    next = child.nextSibling;\n                    range.insertNode( child).collapse();\n                    last = child;\n                    child = next;\n\n                }\n                if(child){\n                    if(/^(ol|ul)$/i.test(child.tagName)){\n                        while(child.firstChild){\n                            last = child.firstChild;\n                            domUtils.insertAfter(li,child.firstChild);\n                            li = li.nextSibling;\n                        }\n                        domUtils.remove(child)\n                    }else{\n                        var tmpLi;\n                        next = child.nextSibling;\n                        tmpLi = me.document.createElement('li');\n                        domUtils.insertAfter(li,tmpLi);\n                        tmpLi.appendChild(child);\n                        last = child;\n                        child = next;\n                        li = tmpLi;\n                    }\n                }\n            }\n            li = domUtils.findParentByTagName(range.startContainer,'li',true);\n            if(domUtils.isEmptyBlock(li)){\n                domUtils.remove(li)\n            }\n            if(last){\n\n                range.setStartAfter(last).collapse(true).select(true)\n            }\n        }else{\n            while ( child = div.firstChild ) {\n                if(hadBreak){\n                    var p = me.document.createElement('p');\n                    while(child && (child.nodeType == 3 || !dtd.$block[child.tagName])){\n                        nextNode = child.nextSibling;\n                        p.appendChild(child);\n                        child = nextNode;\n                    }\n                    if(p.firstChild){\n\n                        child = p\n                    }\n                }\n                range.insertNode( child );\n                nextNode = child.nextSibling;\n                if ( !hadBreak && child.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm( child ) ){\n\n                    parent = domUtils.findParent( child,function ( node ){ return domUtils.isBlockElm( node ); } );\n                    if ( parent && parent.tagName.toLowerCase() != 'body' && !(dtd[parent.tagName][child.nodeName] && child.parentNode === parent)){\n                        if(!dtd[parent.tagName][child.nodeName]){\n                            pre = parent;\n                        }else{\n                            tmp = child.parentNode;\n                            while (tmp !== parent){\n                                pre = tmp;\n                                tmp = tmp.parentNode;\n\n                            }\n                        }\n\n\n                        domUtils.breakParent( child, pre || tmp );\n                        //去掉break后前一个多余的节点  <p>|<[p> ==> <p></p><div></div><p>|</p>\n                        var pre = child.previousSibling;\n                        domUtils.trimWhiteTextNode(pre);\n                        if(!pre.childNodes.length){\n                            domUtils.remove(pre);\n                        }\n                        //trace:2012,在非ie的情况，切开后剩下的节点有可能不能点入光标添加br占位\n\n                        if(!browser.ie &&\n                            (next = child.nextSibling) &&\n                            domUtils.isBlockElm(next) &&\n                            next.lastChild &&\n                            !domUtils.isBr(next.lastChild)){\n                            next.appendChild(me.document.createElement('br'));\n                        }\n                        hadBreak = 1;\n                    }\n                }\n                var next = child.nextSibling;\n                if(!div.firstChild && next && domUtils.isBlockElm(next)){\n\n                    range.setStart(next,0).collapse(true);\n                    break;\n                }\n                range.setEndAfter( child ).collapse();\n\n            }\n\n            child = range.startContainer;\n\n            if(nextNode && domUtils.isBr(nextNode)){\n                domUtils.remove(nextNode)\n            }\n            //用chrome可能有空白展位符\n            if(domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)){\n                if(nextNode = child.nextSibling){\n                    domUtils.remove(child);\n                    if(nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]){\n\n                        range.setStart(nextNode,0).collapse(true).shrinkBoundary()\n                    }\n                }else{\n\n                    try{\n                        child.innerHTML = browser.ie ? domUtils.fillChar : '<br/>';\n                    }catch(e){\n                        range.setStartBefore(child);\n                        domUtils.remove(child)\n                    }\n\n                }\n\n            }\n            //加上true因为在删除表情等时会删两次，第一次是删的fillData\n            try{\n                range.select(true);\n            }catch(e){}\n\n        }\n\n\n\n        setTimeout(function(){\n            range = me.selection.getRange();\n            range.scrollToView(me.autoHeightEnabled,me.autoHeightEnabled ? domUtils.getXY(me.iframe).y:0);\n            me.fireEvent('afterinserthtml', html);\n        },200);\n    }\n};\n\n\n// plugins/autotypeset.js\n/**\n * 自动排版\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 对当前编辑器的内容执行自动排版， 排版的行为根据config配置文件里的“autotypeset”选项进行控制。\n * @command autotypeset\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'autotypeset' );\n * ```\n */\n\nUE.plugins['autotypeset'] = function(){\n\n    this.setOpt({'autotypeset': {\n        mergeEmptyline: true,           //合并空行\n        removeClass: true,              //去掉冗余的class\n        removeEmptyline: false,         //去掉空行\n        textAlign:\"left\",               //段落的排版方式，可以是 left,right,center,justify 去掉这个属性表示不执行排版\n        imageBlockLine: 'center',       //图片的浮动方式，独占一行剧中,左右浮动，默认: center,left,right,none 去掉这个属性表示不执行排版\n        pasteFilter: false,             //根据规则过滤没事粘贴进来的内容\n        clearFontSize: false,           //去掉所有的内嵌字号，使用编辑器默认的字号\n        clearFontFamily: false,         //去掉所有的内嵌字体，使用编辑器默认的字体\n        removeEmptyNode: false,         // 去掉空节点\n        //可以去掉的标签\n        removeTagNames: utils.extend({div:1},dtd.$removeEmpty),\n        indent: false,                  // 行首缩进\n        indentValue : '2em',            //行首缩进的大小\n        bdc2sb: false,\n        tobdc: false\n    }});\n\n    var me = this,\n        opt = me.options.autotypeset,\n        remainClass = {\n            'selectTdClass':1,\n            'pagebreak':1,\n            'anchorclass':1\n        },\n        remainTag = {\n            'li':1\n        },\n        tags = {\n            div:1,\n            p:1,\n            //trace:2183 这些也认为是行\n            blockquote:1,center:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,\n            span:1\n        },\n        highlightCont;\n    //升级了版本，但配置项目里没有autotypeset\n    if(!opt){\n        return;\n    }\n\n    readLocalOpts();\n\n    function isLine(node,notEmpty){\n        if(!node || node.nodeType == 3)\n            return 0;\n        if(domUtils.isBr(node))\n            return 1;\n        if(node && node.parentNode && tags[node.tagName.toLowerCase()]){\n            if(highlightCont && highlightCont.contains(node)\n                ||\n                node.getAttribute('pagebreak')\n            ){\n                return 0;\n            }\n\n            return notEmpty ? !domUtils.isEmptyBlock(node) : domUtils.isEmptyBlock(node,new RegExp('[\\\\s'+domUtils.fillChar\n                +']','g'));\n        }\n    }\n\n    function removeNotAttributeSpan(node){\n        if(!node.style.cssText){\n            domUtils.removeAttributes(node,['style']);\n            if(node.tagName.toLowerCase() == 'span' && domUtils.hasNoAttributes(node)){\n                domUtils.remove(node,true);\n            }\n        }\n    }\n    function autotype(type,html){\n\n        var me = this,cont;\n        if(html){\n            if(!opt.pasteFilter){\n                return;\n            }\n            cont = me.document.createElement('div');\n            cont.innerHTML = html.html;\n        }else{\n            cont = me.document.body;\n        }\n        var nodes = domUtils.getElementsByTagName(cont,'*');\n\n        // 行首缩进，段落方向，段间距，段内间距\n        for(var i=0,ci;ci=nodes[i++];){\n\n            if(me.fireEvent('excludeNodeinautotype',ci) === true){\n                continue;\n            }\n             //font-size\n            if(opt.clearFontSize && ci.style.fontSize){\n                domUtils.removeStyle(ci,'font-size');\n\n                removeNotAttributeSpan(ci);\n\n            }\n            //font-family\n            if(opt.clearFontFamily && ci.style.fontFamily){\n                domUtils.removeStyle(ci,'font-family');\n                removeNotAttributeSpan(ci);\n            }\n\n            if(isLine(ci)){\n                //合并空行\n                if(opt.mergeEmptyline ){\n                    var next = ci.nextSibling,tmpNode,isBr = domUtils.isBr(ci);\n                    while(isLine(next)){\n                        tmpNode = next;\n                        next = tmpNode.nextSibling;\n                        if(isBr && (!next || next && !domUtils.isBr(next))){\n                            break;\n                        }\n                        domUtils.remove(tmpNode);\n                    }\n\n                }\n                 //去掉空行，保留占位的空行\n                if(opt.removeEmptyline && domUtils.inDoc(ci,cont) && !remainTag[ci.parentNode.tagName.toLowerCase()] ){\n                    if(domUtils.isBr(ci)){\n                        next = ci.nextSibling;\n                        if(next && !domUtils.isBr(next)){\n                            continue;\n                        }\n                    }\n                    domUtils.remove(ci);\n                    continue;\n\n                }\n\n            }\n            if(isLine(ci,true) && ci.tagName != 'SPAN'){\n                if(opt.indent){\n                    ci.style.textIndent = opt.indentValue;\n                }\n                if(opt.textAlign){\n                    ci.style.textAlign = opt.textAlign;\n                }\n                // if(opt.lineHeight)\n                //     ci.style.lineHeight = opt.lineHeight + 'cm';\n\n            }\n\n            //去掉class,保留的class不去掉\n            if(opt.removeClass && ci.className && !remainClass[ci.className.toLowerCase()]){\n\n                if(highlightCont && highlightCont.contains(ci)){\n                     continue;\n                }\n                domUtils.removeAttributes(ci,['class']);\n            }\n\n            //表情不处理\n            if(opt.imageBlockLine && ci.tagName.toLowerCase() == 'img' && !ci.getAttribute('emotion')){\n                if(html){\n                    var img = ci;\n                    switch (opt.imageBlockLine){\n                        case 'left':\n                        case 'right':\n                        case 'none':\n                            var pN = img.parentNode,tmpNode,pre,next;\n                            while(dtd.$inline[pN.tagName] || pN.tagName == 'A'){\n                                pN = pN.parentNode;\n                            }\n                            tmpNode = pN;\n                            if(tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode,'text-align') == 'center'){\n                                if(!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1){\n                                    pre = tmpNode.previousSibling;\n                                    next = tmpNode.nextSibling;\n                                    if(pre && next && pre.nodeType == 1 &&  next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)){\n                                        pre.appendChild(tmpNode.firstChild);\n                                        while(next.firstChild){\n                                            pre.appendChild(next.firstChild);\n                                        }\n                                        domUtils.remove(tmpNode);\n                                        domUtils.remove(next);\n                                    }else{\n                                        domUtils.setStyle(tmpNode,'text-align','');\n                                    }\n\n\n                                }\n\n\n                            }\n                            domUtils.setStyle(img,'float', opt.imageBlockLine);\n                            break;\n                        case 'center':\n                            if(me.queryCommandValue('imagefloat') != 'center'){\n                                pN = img.parentNode;\n                                domUtils.setStyle(img,'float','none');\n                                tmpNode = img;\n                                while(pN && domUtils.getChildCount(pN,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1\n                                    && (dtd.$inline[pN.tagName] || pN.tagName == 'A')){\n                                    tmpNode = pN;\n                                    pN = pN.parentNode;\n                                }\n                                var pNode = me.document.createElement('p');\n                                domUtils.setAttributes(pNode,{\n\n                                    style:'text-align:center'\n                                });\n                                tmpNode.parentNode.insertBefore(pNode,tmpNode);\n                                pNode.appendChild(tmpNode);\n                                domUtils.setStyle(tmpNode,'float','');\n\n                            }\n\n\n                    }\n                } else {\n                    var range = me.selection.getRange();\n                    range.selectNode(ci).select();\n                    me.execCommand('imagefloat', opt.imageBlockLine);\n                }\n\n            }\n\n            //去掉冗余的标签\n            if(opt.removeEmptyNode){\n                if(opt.removeTagNames[ci.tagName.toLowerCase()] && domUtils.hasNoAttributes(ci) && domUtils.isEmptyBlock(ci)){\n                    domUtils.remove(ci);\n                }\n            }\n        }\n        if(opt.tobdc){\n            var root = UE.htmlparser(cont.innerHTML);\n            root.traversal(function(node){\n                if(node.type == 'text'){\n                    node.data = ToDBC(node.data)\n                }\n            });\n            cont.innerHTML = root.toHtml()\n        }\n        if(opt.bdc2sb){\n            var root = UE.htmlparser(cont.innerHTML);\n            root.traversal(function(node){\n                if(node.type == 'text'){\n                    node.data = DBC2SB(node.data)\n                }\n            });\n            cont.innerHTML = root.toHtml()\n        }\n        if(html){\n            html.html = cont.innerHTML;\n        }\n    }\n    if(opt.pasteFilter){\n        me.addListener('beforepaste',autotype);\n    }\n\n    function DBC2SB(str) {\n        var result = '';\n        for (var i = 0; i < str.length; i++) {\n            var code = str.charCodeAt(i); //获取当前字符的unicode编码\n            if (code >= 65281 && code <= 65373)//在这个unicode编码范围中的是所有的英文字母已经各种字符\n            {\n                result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码\n            } else if (code == 12288)//空格\n            {\n                result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32);\n            } else {\n                result += str.charAt(i);\n            }\n        }\n        return result;\n    }\n    function ToDBC(txtstring) {\n        txtstring = utils.html(txtstring);\n        var tmp = \"\";\n        var mark = \"\";/*用于判断,如果是html尖括里的标记,则不进行全角的转换*/\n        for (var i = 0; i < txtstring.length; i++) {\n            if (txtstring.charCodeAt(i) == 32) {\n                tmp = tmp + String.fromCharCode(12288);\n            }\n            else if (txtstring.charCodeAt(i) < 127) {\n                tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248);\n            }\n            else {\n                tmp += txtstring.charAt(i);\n            }\n        }\n        return tmp;\n    }\n\n    function readLocalOpts() {\n        var cookieOpt = me.getPreferences('autotypeset');\n        utils.extend(me.options.autotypeset, cookieOpt);\n    }\n\n    me.commands['autotypeset'] = {\n        execCommand:function () {\n            me.removeListener('beforepaste',autotype);\n            if(opt.pasteFilter){\n                me.addListener('beforepaste',autotype);\n            }\n            autotype.call(me)\n        }\n\n    };\n\n};\n\n\n\n// plugins/autosubmit.js\n/**\n * 快捷键提交\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 提交表单\n * @command autosubmit\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'autosubmit' );\n * ```\n */\n\nUE.plugin.register('autosubmit',function(){\n    return {\n        shortcutkey:{\n            \"autosubmit\":\"ctrl+13\" //手动提交\n        },\n        commands:{\n            'autosubmit':{\n                execCommand:function () {\n                    var me=this,\n                        form = domUtils.findParentByTagName(me.iframe,\"form\", false);\n                    if (form){\n                        if(me.fireEvent(\"beforesubmit\")===false){\n                            return;\n                        }\n                        me.sync();\n                        form.submit();\n                    }\n                }\n            }\n        }\n    }\n});\n\n// plugins/background.js\n/**\n * 背景插件，为UEditor提供设置背景功能\n * @file\n * @since 1.2.6.1\n */\nUE.plugin.register('background', function () {\n    var me = this,\n        cssRuleId = 'editor_background',\n        isSetColored,\n        reg = new RegExp('body[\\\\s]*\\\\{(.+)\\\\}', 'i');\n\n    function stringToObj(str) {\n        var obj = {}, styles = str.split(';');\n        utils.each(styles, function (v) {\n            var index = v.indexOf(':'),\n                key = utils.trim(v.substr(0, index)).toLowerCase();\n            key && (obj[key] = utils.trim(v.substr(index + 1) || ''));\n        });\n        return obj;\n    }\n\n    function setBackground(obj) {\n        if (obj) {\n            var styles = [];\n            for (var name in obj) {\n                if (obj.hasOwnProperty(name)) {\n                    styles.push(name + \":\" + obj[name] + '; ');\n                }\n            }\n            utils.cssRule(cssRuleId, styles.length ? ('body{' + styles.join(\"\") + '}') : '', me.document);\n        } else {\n            utils.cssRule(cssRuleId, '', me.document)\n        }\n    }\n    //重写editor.hasContent方法\n\n    var orgFn = me.hasContents;\n    me.hasContents = function(){\n        if(me.queryCommandValue('background')){\n            return true\n        }\n        return orgFn.apply(me,arguments);\n    };\n    return {\n        bindEvents: {\n            'getAllHtml': function (type, headHtml) {\n                var body = this.body,\n                    su = domUtils.getComputedStyle(body, \"background-image\"),\n                    url = \"\";\n                if (su.indexOf(me.options.imagePath) > 0) {\n                    url = su.substring(su.indexOf(me.options.imagePath), su.length - 1).replace(/\"|\\(|\\)/ig, \"\");\n                } else {\n                    url = su != \"none\" ? su.replace(/url\\(\"?|\"?\\)/ig, \"\") : \"\";\n                }\n                var html = '<style type=\"text/css\">body{';\n                var bgObj = {\n                    \"background-color\": domUtils.getComputedStyle(body, \"background-color\") || \"#ffffff\",\n                    'background-image': url ? 'url(' + url + ')' : '',\n                    'background-repeat': domUtils.getComputedStyle(body, \"background-repeat\") || \"\",\n                    'background-position': browser.ie ? (domUtils.getComputedStyle(body, \"background-position-x\") + \" \" + domUtils.getComputedStyle(body, \"background-position-y\")) : domUtils.getComputedStyle(body, \"background-position\"),\n                    'height': domUtils.getComputedStyle(body, \"height\")\n                };\n                for (var name in bgObj) {\n                    if (bgObj.hasOwnProperty(name)) {\n                        html += name + \":\" + bgObj[name] + \"; \";\n                    }\n                }\n                html += '}</style> ';\n                headHtml.push(html);\n            },\n            'aftersetcontent': function () {\n                if(isSetColored == false) setBackground();\n            }\n        },\n        inputRule: function (root) {\n            isSetColored = false;\n            utils.each(root.getNodesByTagName('p'), function (p) {\n                var styles = p.getAttr('data-background');\n                if (styles) {\n                    isSetColored = true;\n                    setBackground(stringToObj(styles));\n                    p.parentNode.removeChild(p);\n                }\n            })\n        },\n        outputRule: function (root) {\n            var me = this,\n                styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\\n\\r]+/g, '').match(reg);\n            if (styles) {\n                root.appendChild(UE.uNode.createElement('<p style=\"display:none;\" data-background=\"' + utils.trim(styles[1].replace(/\"/g, '').replace(/[\\s]+/g, ' ')) + '\"><br/></p>'));\n            }\n        },\n        commands: {\n            'background': {\n                execCommand: function (cmd, obj) {\n                    setBackground(obj);\n                },\n                queryCommandValue: function () {\n                    var me = this,\n                        styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\\n\\r]+/g, '').match(reg);\n                    return styles ? stringToObj(styles[1]) : null;\n                },\n                notNeedUndo: true\n            }\n        }\n    }\n});\n\n// plugins/image.js\n/**\n * 图片插入、排版插件\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 图片对齐方式\n * @command imagefloat\n * @method execCommand\n * @remind 值center为独占一行居中\n * @param { String } cmd 命令字符串\n * @param { String } align 对齐方式，可传left、right、none、center\n * @remaind center表示图片独占一行\n * @example\n * ```javascript\n * editor.execCommand( 'imagefloat', 'center' );\n * ```\n */\n\n/**\n * 如果选区所在位置是图片区域\n * @command imagefloat\n * @method queryCommandValue\n * @param { String } cmd 命令字符串\n * @return { String } 返回图片对齐方式\n * @example\n * ```javascript\n * editor.queryCommandValue( 'imagefloat' );\n * ```\n */\n\nUE.commands['imagefloat'] = {\n    execCommand:function (cmd, align) {\n        var me = this,\n            range = me.selection.getRange();\n        if (!range.collapsed) {\n            var img = range.getClosedNode();\n            if (img && img.tagName == 'IMG') {\n                switch (align) {\n                    case 'left':\n                    case 'right':\n                    case 'none':\n                        var pN = img.parentNode, tmpNode, pre, next;\n                        while (dtd.$inline[pN.tagName] || pN.tagName == 'A') {\n                            pN = pN.parentNode;\n                        }\n                        tmpNode = pN;\n                        if (tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode, 'text-align') == 'center') {\n                            if (!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode, function (node) {\n                                return !domUtils.isBr(node) && !domUtils.isWhitespace(node);\n                            }) == 1) {\n                                pre = tmpNode.previousSibling;\n                                next = tmpNode.nextSibling;\n                                if (pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)) {\n                                    pre.appendChild(tmpNode.firstChild);\n                                    while (next.firstChild) {\n                                        pre.appendChild(next.firstChild);\n                                    }\n                                    domUtils.remove(tmpNode);\n                                    domUtils.remove(next);\n                                } else {\n                                    domUtils.setStyle(tmpNode, 'text-align', '');\n                                }\n\n\n                            }\n\n                            range.selectNode(img).select();\n                        }\n                        domUtils.setStyle(img, 'float', align == 'none' ? '' : align);\n                        if(align == 'none'){\n                            domUtils.removeAttributes(img,'align');\n                        }\n\n                        break;\n                    case 'center':\n                        if (me.queryCommandValue('imagefloat') != 'center') {\n                            pN = img.parentNode;\n                            domUtils.setStyle(img, 'float', '');\n                            domUtils.removeAttributes(img,'align');\n                            tmpNode = img;\n                            while (pN && domUtils.getChildCount(pN, function (node) {\n                                return !domUtils.isBr(node) && !domUtils.isWhitespace(node);\n                            }) == 1\n                                && (dtd.$inline[pN.tagName] || pN.tagName == 'A')) {\n                                tmpNode = pN;\n                                pN = pN.parentNode;\n                            }\n                            range.setStartBefore(tmpNode).setCursor(false);\n                            pN = me.document.createElement('div');\n                            pN.appendChild(tmpNode);\n                            domUtils.setStyle(tmpNode, 'float', '');\n\n                            me.execCommand('insertHtml', '<p id=\"_img_parent_tmp\" style=\"text-align:center\">' + pN.innerHTML + '</p>');\n\n                            tmpNode = me.document.getElementById('_img_parent_tmp');\n                            tmpNode.removeAttribute('id');\n                            tmpNode = tmpNode.firstChild;\n                            range.selectNode(tmpNode).select();\n                            //去掉后边多余的元素\n                            next = tmpNode.parentNode.nextSibling;\n                            if (next && domUtils.isEmptyNode(next)) {\n                                domUtils.remove(next);\n                            }\n\n                        }\n\n                        break;\n                }\n\n            }\n        }\n    },\n    queryCommandValue:function () {\n        var range = this.selection.getRange(),\n            startNode, floatStyle;\n        if (range.collapsed) {\n            return 'none';\n        }\n        startNode = range.getClosedNode();\n        if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') {\n            floatStyle = domUtils.getComputedStyle(startNode, 'float') || startNode.getAttribute('align');\n\n            if (floatStyle == 'none') {\n                floatStyle = domUtils.getComputedStyle(startNode.parentNode, 'text-align') == 'center' ? 'center' : floatStyle;\n            }\n            return {\n                left:1,\n                right:1,\n                center:1\n            }[floatStyle] ? floatStyle : 'none';\n        }\n        return 'none';\n\n\n    },\n    queryCommandState:function () {\n        var range = this.selection.getRange(),\n            startNode;\n\n        if (range.collapsed)  return -1;\n\n        startNode = range.getClosedNode();\n        if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') {\n            return 0;\n        }\n        return -1;\n    }\n};\n\n\n/**\n * 插入图片\n * @command insertimage\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { Object } opt 属性键值对，这些属性都将被复制到当前插入图片\n * @remind 该命令第二个参数可接受一个图片配置项对象的数组，可以插入多张图片，\n * 此时数组的每一个元素都是一个Object类型的图片属性集合。\n * @example\n * ```javascript\n * editor.execCommand( 'insertimage', {\n *     src:'a/b/c.jpg',\n *     width:'100',\n *     height:'100'\n * } );\n * ```\n * @example\n * ```javascript\n * editor.execCommand( 'insertimage', [{\n *     src:'a/b/c.jpg',\n *     width:'100',\n *     height:'100'\n * },{\n *     src:'a/b/d.jpg',\n *     width:'100',\n *     height:'100'\n * }] );\n * ```\n */\n\nUE.commands['insertimage'] = {\n    execCommand:function (cmd, opt) {\n\n        opt = utils.isArray(opt) ? opt : [opt];\n        if (!opt.length) {\n            return;\n        }\n        var me = this,\n            range = me.selection.getRange(),\n            img = range.getClosedNode();\n\n        if(me.fireEvent('beforeinsertimage', opt) === true){\n            return;\n        }\n\n        function unhtmlData(imgCi) {\n\n            utils.each('width,height,border,hspace,vspace'.split(','), function (item) {\n\n                if (imgCi[item]) {\n                    imgCi[item] = parseInt(imgCi[item], 10) || 0;\n                }\n            });\n\n            utils.each('src,_src'.split(','), function (item) {\n\n                if (imgCi[item]) {\n                    imgCi[item] = utils.unhtmlForUrl(imgCi[item]);\n                }\n            });\n            utils.each('title,alt'.split(','), function (item) {\n\n                if (imgCi[item]) {\n                    imgCi[item] = utils.unhtml(imgCi[item]);\n                }\n            });\n        }\n\n        if (img && /img/i.test(img.tagName) && (img.className != \"edui-faked-video\" || img.className.indexOf(\"edui-upload-video\")!=-1) && !img.getAttribute(\"word_img\")) {\n            var first = opt.shift();\n            var floatStyle = first['floatStyle'];\n            delete first['floatStyle'];\n////                img.style.border = (first.border||0) +\"px solid #000\";\n////                img.style.margin = (first.margin||0) +\"px\";\n//                img.style.cssText += ';margin:' + (first.margin||0) +\"px;\" + 'border:' + (first.border||0) +\"px solid #000\";\n            domUtils.setAttributes(img, first);\n            me.execCommand('imagefloat', floatStyle);\n            if (opt.length > 0) {\n                range.setStartAfter(img).setCursor(false, true);\n                me.execCommand('insertimage', opt);\n            }\n\n        } else {\n            var html = [], str = '', ci;\n            ci = opt[0];\n            if (opt.length == 1) {\n                unhtmlData(ci);\n\n                str = '<img src=\"' + ci.src + '\" ' + (ci._src ? ' _src=\"' + ci._src + '\" ' : '') +\n                    (ci.width ? 'width=\"' + ci.width + '\" ' : '') +\n                    (ci.height ? ' height=\"' + ci.height + '\" ' : '') +\n                    (ci['floatStyle'] == 'left' || ci['floatStyle'] == 'right' ? ' style=\"float:' + ci['floatStyle'] + ';\"' : '') +\n                    (ci.title && ci.title != \"\" ? ' title=\"' + ci.title + '\"' : '') +\n                    (ci.border && ci.border != \"0\" ? ' border=\"' + ci.border + '\"' : '') +\n                    (ci.alt && ci.alt != \"\" ? ' alt=\"' + ci.alt + '\"' : '') +\n                    (ci.hspace && ci.hspace != \"0\" ? ' hspace = \"' + ci.hspace + '\"' : '') +\n                    (ci.vspace && ci.vspace != \"0\" ? ' vspace = \"' + ci.vspace + '\"' : '') + '/>';\n                if (ci['floatStyle'] == 'center') {\n                    str = '<p style=\"text-align: center\">' + str + '</p>';\n                }\n                html.push(str);\n\n            } else {\n                for (var i = 0; ci = opt[i++];) {\n                    unhtmlData(ci);\n                    str = '<p ' + (ci['floatStyle'] == 'center' ? 'style=\"text-align: center\" ' : '') + '><img src=\"' + ci.src + '\" ' +\n                        (ci.width ? 'width=\"' + ci.width + '\" ' : '') + (ci._src ? ' _src=\"' + ci._src + '\" ' : '') +\n                        (ci.height ? ' height=\"' + ci.height + '\" ' : '') +\n                        ' style=\"' + (ci['floatStyle'] && ci['floatStyle'] != 'center' ? 'float:' + ci['floatStyle'] + ';' : '') +\n                        (ci.border || '') + '\" ' +\n                        (ci.title ? ' title=\"' + ci.title + '\"' : '') + ' /></p>';\n                    html.push(str);\n                }\n            }\n\n            me.execCommand('insertHtml', html.join(''));\n        }\n\n        me.fireEvent('afterinsertimage', opt)\n    }\n};\n\n\n// plugins/justify.js\n/**\n * 段落格式\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 段落对齐方式\n * @command justify\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { String } align 对齐方式：left => 居左，right => 居右，center => 居中，justify => 两端对齐\n * @example\n * ```javascript\n * editor.execCommand( 'justify', 'center' );\n * ```\n */\n/**\n * 如果选区所在位置是段落区域，返回当前段落对齐方式\n * @command justify\n * @method queryCommandValue\n * @param { String } cmd 命令字符串\n * @return { String } 返回段落对齐方式\n * @example\n * ```javascript\n * editor.queryCommandValue( 'justify' );\n * ```\n */\n\nUE.plugins['justify']=function(){\n    var me=this,\n        block = domUtils.isBlockElm,\n        defaultValue = {\n            left:1,\n            right:1,\n            center:1,\n            justify:1\n        },\n        doJustify = function (range, style) {\n            var bookmark = range.createBookmark(),\n                filterFn = function (node) {\n                    return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node);\n                };\n\n            range.enlarge(true);\n            var bookmark2 = range.createBookmark(),\n                current = domUtils.getNextDomNode(bookmark2.start, false, filterFn),\n                tmpRange = range.cloneRange(),\n                tmpNode;\n            while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) {\n                if (current.nodeType == 3 || !block(current)) {\n                    tmpRange.setStartBefore(current);\n                    while (current && current !== bookmark2.end && !block(current)) {\n                        tmpNode = current;\n                        current = domUtils.getNextDomNode(current, false, null, function (node) {\n                            return !block(node);\n                        });\n                    }\n                    tmpRange.setEndAfter(tmpNode);\n                    var common = tmpRange.getCommonAncestor();\n                    if (!domUtils.isBody(common) && block(common)) {\n                        domUtils.setStyles(common, utils.isString(style) ? {'text-align':style} : style);\n                        current = common;\n                    } else {\n                        var p = range.document.createElement('p');\n                        domUtils.setStyles(p, utils.isString(style) ? {'text-align':style} : style);\n                        var frag = tmpRange.extractContents();\n                        p.appendChild(frag);\n                        tmpRange.insertNode(p);\n                        current = p;\n                    }\n                    current = domUtils.getNextDomNode(current, false, filterFn);\n                } else {\n                    current = domUtils.getNextDomNode(current, true, filterFn);\n                }\n            }\n            return range.moveToBookmark(bookmark2).moveToBookmark(bookmark);\n        };\n\n    UE.commands['justify'] = {\n        execCommand:function (cmdName, align) {\n            var range = this.selection.getRange(),\n                txt;\n\n            //闭合时单独处理\n            if (range.collapsed) {\n                txt = this.document.createTextNode('p');\n                range.insertNode(txt);\n            }\n            doJustify(range, align);\n            if (txt) {\n                range.setStartBefore(txt).collapse(true);\n                domUtils.remove(txt);\n            }\n\n            range.select();\n\n\n            return true;\n        },\n        queryCommandValue:function () {\n            var startNode = this.selection.getStart(),\n                value = domUtils.getComputedStyle(startNode, 'text-align');\n            return defaultValue[value] ? value : 'left';\n        },\n        queryCommandState:function () {\n            var start = this.selection.getStart(),\n                cell = start && domUtils.findParentByTagName(start, [\"td\", \"th\",\"caption\"], true);\n\n            return cell? -1:0;\n        }\n\n    };\n};\n\n\n// plugins/font.js\n/**\n * 字体颜色,背景色,字号,字体,下划线,删除线\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 字体颜色\n * @command forecolor\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { String } value 色值(必须十六进制)\n * @example\n * ```javascript\n * editor.execCommand( 'forecolor', '#000' );\n * ```\n */\n/**\n * 返回选区字体颜色\n * @command forecolor\n * @method queryCommandValue\n * @param { String } cmd 命令字符串\n * @return { String } 返回字体颜色\n * @example\n * ```javascript\n * editor.queryCommandValue( 'forecolor' );\n * ```\n */\n\n/**\n * 字体背景颜色\n * @command backcolor\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { String } value 色值(必须十六进制)\n * @example\n * ```javascript\n * editor.execCommand( 'backcolor', '#000' );\n * ```\n */\n/**\n * 返回选区字体颜色\n * @command backcolor\n * @method queryCommandValue\n * @param { String } cmd 命令字符串\n * @return { String } 返回字体背景颜色\n * @example\n * ```javascript\n * editor.queryCommandValue( 'backcolor' );\n * ```\n */\n\n/**\n * 字体大小\n * @command fontsize\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { String } value 字体大小\n * @example\n * ```javascript\n * editor.execCommand( 'fontsize', '14px' );\n * ```\n */\n/**\n * 返回选区字体大小\n * @command fontsize\n * @method queryCommandValue\n * @param { String } cmd 命令字符串\n * @return { String } 返回字体大小\n * @example\n * ```javascript\n * editor.queryCommandValue( 'fontsize' );\n * ```\n */\n\n/**\n * 字体样式\n * @command fontfamily\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { String } value 字体样式\n * @example\n * ```javascript\n * editor.execCommand( 'fontfamily', '微软雅黑' );\n * ```\n */\n/**\n * 返回选区字体样式\n * @command fontfamily\n * @method queryCommandValue\n * @param { String } cmd 命令字符串\n * @return { String } 返回字体样式\n * @example\n * ```javascript\n * editor.queryCommandValue( 'fontfamily' );\n * ```\n */\n\n/**\n * 字体下划线,与删除线互斥\n * @command underline\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'underline' );\n * ```\n */\n\n/**\n * 字体删除线,与下划线互斥\n * @command strikethrough\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'strikethrough' );\n * ```\n */\n\n/**\n * 字体边框\n * @command fontborder\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'fontborder' );\n * ```\n */\n\nUE.plugins['font'] = function () {\n    var me = this,\n        fonts = {\n            'forecolor': 'color',\n            'backcolor': 'background-color',\n            'fontsize': 'font-size',\n            'fontfamily': 'font-family',\n            'underline': 'text-decoration',\n            'strikethrough': 'text-decoration',\n            'fontborder': 'border'\n        },\n        needCmd = {'underline': 1, 'strikethrough': 1, 'fontborder': 1},\n        needSetChild = {\n            'forecolor': 'color',\n            'backcolor': 'background-color',\n            'fontsize': 'font-size',\n            'fontfamily': 'font-family'\n\n        };\n    me.setOpt({\n        'fontfamily': [\n            { name: 'songti', val: '宋体,SimSun'},\n            { name: 'yahei', val: '微软雅黑,Microsoft YaHei'},\n            { name: 'kaiti', val: '楷体,楷体_GB2312, SimKai'},\n            { name: 'heiti', val: '黑体, SimHei'},\n            { name: 'lishu', val: '隶书, SimLi'},\n            { name: 'andaleMono', val: 'andale mono'},\n            { name: 'arial', val: 'arial, helvetica,sans-serif'},\n            { name: 'arialBlack', val: 'arial black,avant garde'},\n            { name: 'comicSansMs', val: 'comic sans ms'},\n            { name: 'impact', val: 'impact,chicago'},\n            { name: 'timesNewRoman', val: 'times new roman'}\n        ],\n        'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36]\n    });\n\n    function mergeWithParent(node){\n        var parent;\n        while(parent = node.parentNode){\n            if(parent.tagName == 'SPAN' && domUtils.getChildCount(parent,function(child){\n                return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child)\n            }) == 1) {\n                parent.style.cssText += node.style.cssText;\n                domUtils.remove(node,true);\n                node = parent;\n\n            }else{\n                break;\n            }\n        }\n\n    }\n    function mergeChild(rng,cmdName,value){\n        if(needSetChild[cmdName]){\n            rng.adjustmentBoundary();\n            if(!rng.collapsed && rng.startContainer.nodeType == 1){\n                var start = rng.startContainer.childNodes[rng.startOffset];\n                if(start && domUtils.isTagNode(start,'span')){\n                    var bk = rng.createBookmark();\n                    utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) {\n                        if (!span.parentNode || domUtils.isBookmarkNode(span))return;\n                        if(cmdName == 'backcolor' && domUtils.getComputedStyle(span,'background-color').toLowerCase() === value){\n                            return;\n                        }\n                        domUtils.removeStyle(span,needSetChild[cmdName]);\n                        if(span.style.cssText.replace(/^\\s+$/,'').length == 0){\n                            domUtils.remove(span,true)\n                        }\n                    });\n                    rng.moveToBookmark(bk)\n                }\n            }\n        }\n\n    }\n    function mergesibling(rng,cmdName,value) {\n        var collapsed = rng.collapsed,\n            bk = rng.createBookmark(), common;\n        if (collapsed) {\n            common = bk.start.parentNode;\n            while (dtd.$inline[common.tagName]) {\n                common = common.parentNode;\n            }\n        } else {\n            common = domUtils.getCommonAncestor(bk.start, bk.end);\n        }\n        utils.each(domUtils.getElementsByTagName(common, 'span'), function (span) {\n            if (!span.parentNode || domUtils.isBookmarkNode(span))return;\n            if (/\\s*border\\s*:\\s*none;?\\s*/i.test(span.style.cssText)) {\n                if(/^\\s*border\\s*:\\s*none;?\\s*$/.test(span.style.cssText)){\n                    domUtils.remove(span, true);\n                }else{\n                    domUtils.removeStyle(span,'border');\n                }\n                return\n            }\n            if (/border/i.test(span.style.cssText) && span.parentNode.tagName == 'SPAN' && /border/i.test(span.parentNode.style.cssText)) {\n                span.style.cssText = span.style.cssText.replace(/border[^:]*:[^;]+;?/gi, '');\n            }\n            if(!(cmdName=='fontborder' && value=='none')){\n                var next = span.nextSibling;\n                while (next && next.nodeType == 1 && next.tagName == 'SPAN' ) {\n                    if(domUtils.isBookmarkNode(next) && cmdName == 'fontborder') {\n                        span.appendChild(next);\n                        next = span.nextSibling;\n                        continue;\n                    }\n                    if (next.style.cssText == span.style.cssText) {\n                        domUtils.moveChild(next, span);\n                        domUtils.remove(next);\n                    }\n                    if (span.nextSibling === next)\n                        break;\n                    next = span.nextSibling;\n                }\n            }\n\n\n            mergeWithParent(span);\n            if(browser.ie && browser.version > 8 ){\n                //拷贝父亲们的特别的属性,这里只做背景颜色的处理\n                var parent = domUtils.findParent(span,function(n){return n.tagName == 'SPAN' && /background-color/.test(n.style.cssText)});\n                if(parent && !/background-color/.test(span.style.cssText)){\n                    span.style.backgroundColor = parent.style.backgroundColor;\n                }\n            }\n\n        });\n        rng.moveToBookmark(bk);\n        mergeChild(rng,cmdName,value)\n    }\n\n    me.addInputRule(function (root) {\n        utils.each(root.getNodesByTagName('u s del font strike'), function (node) {\n            if (node.tagName == 'font') {\n                var cssStyle = [];\n                for (var p in node.attrs) {\n                    switch (p) {\n                        case 'size':\n                            cssStyle.push('font-size:' +\n                                ({\n                                '1':'10',\n                                '2':'12',\n                                '3':'16',\n                                '4':'18',\n                                '5':'24',\n                                '6':'32',\n                                '7':'48'\n                            }[node.attrs[p]] || node.attrs[p]) + 'px');\n                            break;\n                        case 'color':\n                            cssStyle.push('color:' + node.attrs[p]);\n                            break;\n                        case 'face':\n                            cssStyle.push('font-family:' + node.attrs[p]);\n                            break;\n                        case 'style':\n                            cssStyle.push(node.attrs[p]);\n                    }\n                }\n                node.attrs = {\n                    'style': cssStyle.join(';')\n                };\n            } else {\n                var val = node.tagName == 'u' ? 'underline' : 'line-through';\n                node.attrs = {\n                    'style': (node.getAttr('style') || '') + 'text-decoration:' + val + ';'\n                }\n            }\n            node.tagName = 'span';\n        });\n//        utils.each(root.getNodesByTagName('span'), function (node) {\n//            var val;\n//            if(val = node.getAttr('class')){\n//                if(/fontstrikethrough/.test(val)){\n//                    node.setStyle('text-decoration','line-through');\n//                    if(node.attrs['class']){\n//                        node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,'');\n//                    }else{\n//                        node.setAttr('class')\n//                    }\n//                }\n//                if(/fontborder/.test(val)){\n//                    node.setStyle('border','1px solid #000');\n//                    if(node.attrs['class']){\n//                        node.attrs['class'] = node.attrs['class'].replace(/fontborder/,'');\n//                    }else{\n//                        node.setAttr('class')\n//                    }\n//                }\n//            }\n//        });\n    });\n//    me.addOutputRule(function(root){\n//        utils.each(root.getNodesByTagName('span'), function (node) {\n//            var val;\n//            if(val = node.getStyle('text-decoration')){\n//                if(/line-through/.test(val)){\n//                    if(node.attrs['class']){\n//                        node.attrs['class'] += ' fontstrikethrough';\n//                    }else{\n//                        node.setAttr('class','fontstrikethrough')\n//                    }\n//                }\n//\n//                node.setStyle('text-decoration')\n//            }\n//            if(val = node.getStyle('border')){\n//                if(/1px/.test(val) && /solid/.test(val)){\n//                    if(node.attrs['class']){\n//                        node.attrs['class'] += ' fontborder';\n//\n//                    }else{\n//                        node.setAttr('class','fontborder')\n//                    }\n//                }\n//                node.setStyle('border')\n//\n//            }\n//        });\n//    });\n    for (var p in fonts) {\n        (function (cmd, style) {\n            UE.commands[cmd] = {\n                execCommand: function (cmdName, value) {\n                    value = value || (this.queryCommandState(cmdName) ? 'none' : cmdName == 'underline' ? 'underline' :\n                        cmdName == 'fontborder' ? '1px solid #000' :\n                            'line-through');\n                    var me = this,\n                        range = this.selection.getRange(),\n                        text;\n\n                    if (value == 'default') {\n\n                        if (range.collapsed) {\n                            text = me.document.createTextNode('font');\n                            range.insertNode(text).select();\n\n                        }\n                        me.execCommand('removeFormat', 'span,a', style);\n                        if (text) {\n                            range.setStartBefore(text).collapse(true);\n                            domUtils.remove(text);\n                        }\n                        mergesibling(range,cmdName,value);\n                        range.select()\n                    } else {\n                        if (!range.collapsed) {\n                            if (needCmd[cmd] && me.queryCommandValue(cmd)) {\n                                me.execCommand('removeFormat', 'span,a', style);\n                            }\n                            range = me.selection.getRange();\n\n                            range.applyInlineStyle('span', {'style': style + ':' + value});\n                            mergesibling(range, cmdName,value);\n                            range.select();\n                        } else {\n\n                            var span = domUtils.findParentByTagName(range.startContainer, 'span', true);\n                            text = me.document.createTextNode('font');\n                            if (span && !span.children.length && !span[browser.ie ? 'innerText' : 'textContent'].replace(fillCharReg, '').length) {\n                                //for ie hack when enter\n                                range.insertNode(text);\n                                if (needCmd[cmd]) {\n                                    range.selectNode(text).select();\n                                    me.execCommand('removeFormat', 'span,a', style, null);\n\n                                    span = domUtils.findParentByTagName(text, 'span', true);\n                                    range.setStartBefore(text);\n\n                                }\n                                span && (span.style.cssText += ';' + style + ':' + value);\n                                range.collapse(true).select();\n\n\n                            } else {\n                                range.insertNode(text);\n                                range.selectNode(text).select();\n                                span = range.document.createElement('span');\n\n                                if (needCmd[cmd]) {\n                                    //a标签内的不处理跳过\n                                    if (domUtils.findParentByTagName(text, 'a', true)) {\n                                        range.setStartBefore(text).setCursor();\n                                        domUtils.remove(text);\n                                        return;\n                                    }\n                                    me.execCommand('removeFormat', 'span,a', style);\n                                }\n\n                                span.style.cssText = style + ':' + value;\n\n\n                                text.parentNode.insertBefore(span, text);\n                                //修复，span套span 但样式不继承的问题\n                                if (!browser.ie || browser.ie && browser.version == 9) {\n                                    var spanParent = span.parentNode;\n                                    while (!domUtils.isBlockElm(spanParent)) {\n                                        if (spanParent.tagName == 'SPAN') {\n                                            //opera合并style不会加入\";\"\n                                            span.style.cssText = spanParent.style.cssText + \";\" + span.style.cssText;\n                                        }\n                                        spanParent = spanParent.parentNode;\n                                    }\n                                }\n\n\n                                if (opera) {\n                                    setTimeout(function () {\n                                        range.setStart(span, 0).collapse(true);\n                                        mergesibling(range, cmdName,value);\n                                        range.select();\n                                    });\n                                } else {\n                                    range.setStart(span, 0).collapse(true);\n                                    mergesibling(range,cmdName,value);\n                                    range.select();\n                                }\n\n                                //trace:981\n                                //domUtils.mergeToParent(span)\n                            }\n                            domUtils.remove(text);\n                        }\n\n\n                    }\n                    return true;\n                },\n                queryCommandValue: function (cmdName) {\n                    var startNode = this.selection.getStart();\n\n                    //trace:946\n                    if (cmdName == 'underline' || cmdName == 'strikethrough') {\n                        var tmpNode = startNode, value;\n                        while (tmpNode && !domUtils.isBlockElm(tmpNode) && !domUtils.isBody(tmpNode)) {\n                            if (tmpNode.nodeType == 1) {\n                                value = domUtils.getComputedStyle(tmpNode, style);\n                                if (value != 'none') {\n                                    return value;\n                                }\n                            }\n\n                            tmpNode = tmpNode.parentNode;\n                        }\n                        return 'none';\n                    }\n                    if (cmdName == 'fontborder') {\n                        var tmp = startNode, val;\n                        while (tmp && dtd.$inline[tmp.tagName]) {\n                            if (val = domUtils.getComputedStyle(tmp, 'border')) {\n\n                                if (/1px/.test(val) && /solid/.test(val)) {\n                                    return val;\n                                }\n                            }\n                            tmp = tmp.parentNode;\n                        }\n                        return ''\n                    }\n\n                    if( cmdName == 'FontSize' ) {\n                        var styleVal = domUtils.getComputedStyle(startNode, style),\n                            tmp = /^([\\d\\.]+)(\\w+)$/.exec( styleVal );\n\n                        if( tmp ) {\n\n                            return Math.floor( tmp[1] ) + tmp[2];\n\n                        }\n\n                        return styleVal;\n\n                    }\n\n                    return  domUtils.getComputedStyle(startNode, style);\n                },\n                queryCommandState: function (cmdName) {\n                    if (!needCmd[cmdName])\n                        return 0;\n                    var val = this.queryCommandValue(cmdName);\n                    if (cmdName == 'fontborder') {\n                        return /1px/.test(val) && /solid/.test(val)\n                    } else {\n                        return  cmdName == 'underline' ? /underline/.test(val) : /line\\-through/.test(val);\n\n                    }\n\n                }\n            };\n        })(p, fonts[p]);\n    }\n};\n\n// plugins/link.js\n/**\n * 超链接\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 插入超链接\n * @command link\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { Object } options   设置自定义属性，例如：url、title、target\n * @example\n * ```javascript\n * editor.execCommand( 'link', '{\n *     url:'ueditor.baidu.com',\n *     title:'ueditor',\n *     target:'_blank'\n * }' );\n * ```\n */\n/**\n * 返回当前选中的第一个超链接节点\n * @command link\n * @method queryCommandValue\n * @param { String } cmd 命令字符串\n * @return { Element } 超链接节点\n * @example\n * ```javascript\n * editor.queryCommandValue( 'link' );\n * ```\n */\n\n/**\n * 取消超链接\n * @command unlink\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'unlink');\n * ```\n */\n\nUE.plugins['link'] = function(){\n    function optimize( range ) {\n        var start = range.startContainer,end = range.endContainer;\n\n        if ( start = domUtils.findParentByTagName( start, 'a', true ) ) {\n            range.setStartBefore( start );\n        }\n        if ( end = domUtils.findParentByTagName( end, 'a', true ) ) {\n            range.setEndAfter( end );\n        }\n    }\n\n\n    UE.commands['unlink'] = {\n        execCommand : function() {\n            var range = this.selection.getRange(),\n                bookmark;\n            if(range.collapsed && !domUtils.findParentByTagName( range.startContainer, 'a', true )){\n                return;\n            }\n            bookmark = range.createBookmark();\n            optimize( range );\n            range.removeInlineStyle( 'a' ).moveToBookmark( bookmark ).select();\n        },\n        queryCommandState : function(){\n            return !this.highlight && this.queryCommandValue('link') ?  0 : -1;\n        }\n\n    };\n    function doLink(range,opt,me){\n        var rngClone = range.cloneRange(),\n            link = me.queryCommandValue('link');\n        optimize( range = range.adjustmentBoundary() );\n        var start = range.startContainer;\n        if(start.nodeType == 1 && link){\n            start = start.childNodes[range.startOffset];\n            if(start && start.nodeType == 1 && start.tagName == 'A' && /^(?:https?|ftp|file)\\s*:\\s*\\/\\//.test(start[browser.ie?'innerText':'textContent'])){\n                start[browser.ie ? 'innerText' : 'textContent'] =  utils.html(opt.textValue||opt.href);\n\n            }\n        }\n        if( !rngClone.collapsed || link){\n            range.removeInlineStyle( 'a' );\n            rngClone = range.cloneRange();\n        }\n\n        if ( rngClone.collapsed ) {\n            var a = range.document.createElement( 'a'),\n                text = '';\n            if(opt.textValue){\n\n                text =   utils.html(opt.textValue);\n                delete opt.textValue;\n            }else{\n                text =   utils.html(opt.href);\n\n            }\n            domUtils.setAttributes( a, opt );\n            start =  domUtils.findParentByTagName( rngClone.startContainer, 'a', true );\n            if(start && domUtils.isInNodeEndBoundary(rngClone,start)){\n                range.setStartAfter(start).collapse(true);\n\n            }\n            a[browser.ie ? 'innerText' : 'textContent'] = text;\n            range.insertNode(a).selectNode( a );\n        } else {\n            range.applyInlineStyle( 'a', opt );\n\n        }\n    }\n    UE.commands['link'] = {\n        execCommand : function( cmdName, opt ) {\n            var range;\n            opt._href && (opt._href = utils.unhtml(opt._href,/[<\">]/g));\n            opt.href && (opt.href = utils.unhtml(opt.href,/[<\">]/g));\n            opt.textValue && (opt.textValue = utils.unhtml(opt.textValue,/[<\">]/g));\n            doLink(range=this.selection.getRange(),opt,this);\n            //闭合都不加占位符，如果加了会在a后边多个占位符节点，导致a是图片背景组成的列表，出现空白问题\n            range.collapse().select(true);\n\n        },\n        queryCommandValue : function() {\n            var range = this.selection.getRange(),\n                node;\n            if ( range.collapsed ) {\n//                    node = this.selection.getStart();\n                //在ie下getstart()取值偏上了\n                node = range.startContainer;\n                node = node.nodeType == 1 ? node : node.parentNode;\n\n                if ( node && (node = domUtils.findParentByTagName( node, 'a', true )) && ! domUtils.isInNodeEndBoundary(range,node)) {\n\n                    return node;\n                }\n            } else {\n                //trace:1111  如果是<p><a>xx</a></p> startContainer是p就会找不到a\n                range.shrinkBoundary();\n                var start = range.startContainer.nodeType  == 3 || !range.startContainer.childNodes[range.startOffset] ? range.startContainer : range.startContainer.childNodes[range.startOffset],\n                    end =  range.endContainer.nodeType == 3 || range.endOffset == 0 ? range.endContainer : range.endContainer.childNodes[range.endOffset-1],\n                    common = range.getCommonAncestor();\n                node = domUtils.findParentByTagName( common, 'a', true );\n                if ( !node && common.nodeType == 1){\n\n                    var as = common.getElementsByTagName( 'a' ),\n                        ps,pe;\n\n                    for ( var i = 0,ci; ci = as[i++]; ) {\n                        ps = domUtils.getPosition( ci, start ),pe = domUtils.getPosition( ci,end);\n                        if ( (ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS)\n                            &&\n                            (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS)\n                            ) {\n                            node = ci;\n                            break;\n                        }\n                    }\n                }\n                return node;\n            }\n\n        },\n        queryCommandState : function() {\n            //判断如果是视频的话连接不可用\n            //fix 853\n            var img = this.selection.getRange().getClosedNode(),\n                flag = img && (img.className == \"edui-faked-video\" || img.className.indexOf(\"edui-upload-video\")!=-1);\n            return flag ? -1 : 0;\n        }\n    };\n};\n\n// plugins/iframe.js\n///import core\n///import plugins\\inserthtml.js\n///commands 插入框架\n///commandsName  InsertFrame\n///commandsTitle  插入Iframe\n///commandsDialog  dialogs\\insertframe\n\nUE.plugins['insertframe'] = function() {\n   var me =this;\n    function deleteIframe(){\n        me._iframe && delete me._iframe;\n    }\n\n    me.addListener(\"selectionchange\",function(){\n        deleteIframe();\n    });\n\n};\n\n\n\n// plugins/scrawl.js\n///import core\n///commands 涂鸦\n///commandsName  Scrawl\n///commandsTitle  涂鸦\n///commandsDialog  dialogs\\scrawl\nUE.commands['scrawl'] = {\n    queryCommandState : function(){\n        return ( browser.ie && browser.version  <= 8 ) ? -1 :0;\n    }\n};\n\n\n// plugins/removeformat.js\n/**\n * 清除格式\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 清除文字样式\n * @command removeformat\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param   {String}   tags     以逗号隔开的标签。如：strong\n * @param   {String}   style    样式如：color\n * @param   {String}   attrs    属性如:width\n * @example\n * ```javascript\n * editor.execCommand( 'removeformat', 'strong','color','width' );\n * ```\n */\n\nUE.plugins['removeformat'] = function(){\n    var me = this;\n    me.setOpt({\n       'removeFormatTags': 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var',\n       'removeFormatAttributes':'class,style,lang,width,height,align,hspace,valign'\n    });\n    me.commands['removeformat'] = {\n        execCommand : function( cmdName, tags, style, attrs,notIncludeA ) {\n\n            var tagReg = new RegExp( '^(?:' + (tags || this.options.removeFormatTags).replace( /,/g, '|' ) + ')$', 'i' ) ,\n                removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split( ',' ),\n                range = new dom.Range( this.document ),\n                bookmark,node,parent,\n                filter = function( node ) {\n                    return node.nodeType == 1;\n                };\n\n            function isRedundantSpan (node) {\n                if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span'){\n                    return 0;\n                }\n                if (browser.ie) {\n                    //ie 下判断实效，所以只能简单用style来判断\n                    //return node.style.cssText == '' ? 1 : 0;\n                    var attrs = node.attributes;\n                    if ( attrs.length ) {\n                        for ( var i = 0,l = attrs.length; i<l; i++ ) {\n                            if ( attrs[i].specified ) {\n                                return 0;\n                            }\n                        }\n                        return 1;\n                    }\n                }\n                return !node.attributes.length;\n            }\n            function doRemove( range ) {\n\n                var bookmark1 = range.createBookmark();\n                if ( range.collapsed ) {\n                    range.enlarge( true );\n                }\n\n                //不能把a标签切了\n                if(!notIncludeA){\n                    var aNode = domUtils.findParentByTagName(range.startContainer,'a',true);\n                    if(aNode){\n                        range.setStartBefore(aNode);\n                    }\n\n                    aNode = domUtils.findParentByTagName(range.endContainer,'a',true);\n                    if(aNode){\n                        range.setEndAfter(aNode);\n                    }\n\n                }\n\n\n                bookmark = range.createBookmark();\n\n                node = bookmark.start;\n\n                //切开始\n                while ( (parent = node.parentNode) && !domUtils.isBlockElm( parent ) ) {\n                    domUtils.breakParent( node, parent );\n\n                    domUtils.clearEmptySibling( node );\n                }\n                if ( bookmark.end ) {\n                    //切结束\n                    node = bookmark.end;\n                    while ( (parent = node.parentNode) && !domUtils.isBlockElm( parent ) ) {\n                        domUtils.breakParent( node, parent );\n                        domUtils.clearEmptySibling( node );\n                    }\n\n                    //开始去除样式\n                    var current = domUtils.getNextDomNode( bookmark.start, false, filter ),\n                        next;\n                    while ( current ) {\n                        if ( current == bookmark.end ) {\n                            break;\n                        }\n\n                        next = domUtils.getNextDomNode( current, true, filter );\n\n                        if ( !dtd.$empty[current.tagName.toLowerCase()] && !domUtils.isBookmarkNode( current ) ) {\n                            if ( tagReg.test( current.tagName ) ) {\n                                if ( style ) {\n                                    domUtils.removeStyle( current, style );\n                                    if ( isRedundantSpan( current ) && style != 'text-decoration'){\n                                        domUtils.remove( current, true );\n                                    }\n                                } else {\n                                    domUtils.remove( current, true );\n                                }\n                            } else {\n                                //trace:939  不能把list上的样式去掉\n                                if(!dtd.$tableContent[current.tagName] && !dtd.$list[current.tagName]){\n                                    domUtils.removeAttributes( current, removeFormatAttributes );\n                                    if ( isRedundantSpan( current ) ){\n                                        domUtils.remove( current, true );\n                                    }\n                                }\n\n                            }\n                        }\n                        current = next;\n                    }\n                }\n                //trace:1035\n                //trace:1096 不能把td上的样式去掉，比如边框\n                var pN = bookmark.start.parentNode;\n                if(domUtils.isBlockElm(pN) && !dtd.$tableContent[pN.tagName] && !dtd.$list[pN.tagName]){\n                    domUtils.removeAttributes(  pN,removeFormatAttributes );\n                }\n                pN = bookmark.end.parentNode;\n                if(bookmark.end && domUtils.isBlockElm(pN) && !dtd.$tableContent[pN.tagName]&& !dtd.$list[pN.tagName]){\n                    domUtils.removeAttributes(  pN,removeFormatAttributes );\n                }\n                range.moveToBookmark( bookmark ).moveToBookmark(bookmark1);\n                //清除冗余的代码 <b><bookmark></b>\n                var node = range.startContainer,\n                    tmp,\n                    collapsed = range.collapsed;\n                while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){\n                    tmp = node.parentNode;\n                    range.setStartBefore(node);\n                    //trace:937\n                    //更新结束边界\n                    if(range.startContainer === range.endContainer){\n                        range.endOffset--;\n                    }\n                    domUtils.remove(node);\n                    node = tmp;\n                }\n\n                if(!collapsed){\n                    node = range.endContainer;\n                    while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){\n                        tmp = node.parentNode;\n                        range.setEndBefore(node);\n                        domUtils.remove(node);\n\n                        node = tmp;\n                    }\n\n\n                }\n            }\n\n\n\n            range = this.selection.getRange();\n            doRemove( range );\n            range.select();\n\n        }\n\n    };\n\n};\n\n\n// plugins/blockquote.js\n/**\n * 添加引用\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 添加引用\n * @command blockquote\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'blockquote' );\n * ```\n */\n\n/**\n * 添加引用\n * @command blockquote\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { Object } attrs 节点属性\n * @example\n * ```javascript\n * editor.execCommand( 'blockquote',{\n *     style: \"color: red;\"\n * } );\n * ```\n */\n\n\nUE.plugins['blockquote'] = function(){\n    var me = this;\n    function getObj(editor){\n        return domUtils.filterNodeList(editor.selection.getStartElementPath(),'blockquote');\n    }\n    me.commands['blockquote'] = {\n        execCommand : function( cmdName, attrs ) {\n            var range = this.selection.getRange(),\n                obj = getObj(this),\n                blockquote = dtd.blockquote,\n                bookmark = range.createBookmark();\n\n            if ( obj ) {\n\n                    var start = range.startContainer,\n                        startBlock = domUtils.isBlockElm(start) ? start : domUtils.findParent(start,function(node){return domUtils.isBlockElm(node)}),\n\n                        end = range.endContainer,\n                        endBlock = domUtils.isBlockElm(end) ? end :  domUtils.findParent(end,function(node){return domUtils.isBlockElm(node)});\n\n                    //处理一下li\n                    startBlock = domUtils.findParentByTagName(startBlock,'li',true) || startBlock;\n                    endBlock = domUtils.findParentByTagName(endBlock,'li',true) || endBlock;\n\n\n                    if(startBlock.tagName == 'LI' || startBlock.tagName == 'TD' || startBlock === obj || domUtils.isBody(startBlock)){\n                        domUtils.remove(obj,true);\n                    }else{\n                        domUtils.breakParent(startBlock,obj);\n                    }\n\n                    if(startBlock !== endBlock){\n                        obj = domUtils.findParentByTagName(endBlock,'blockquote');\n                        if(obj){\n                            if(endBlock.tagName == 'LI' || endBlock.tagName == 'TD'|| domUtils.isBody(endBlock)){\n                                obj.parentNode && domUtils.remove(obj,true);\n                            }else{\n                                domUtils.breakParent(endBlock,obj);\n                            }\n\n                        }\n                    }\n\n                    var blockquotes = domUtils.getElementsByTagName(this.document,'blockquote');\n                    for(var i=0,bi;bi=blockquotes[i++];){\n                        if(!bi.childNodes.length){\n                            domUtils.remove(bi);\n                        }else if(domUtils.getPosition(bi,startBlock)&domUtils.POSITION_FOLLOWING && domUtils.getPosition(bi,endBlock)&domUtils.POSITION_PRECEDING){\n                            domUtils.remove(bi,true);\n                        }\n                    }\n\n\n\n\n            } else {\n\n                var tmpRange = range.cloneRange(),\n                    node = tmpRange.startContainer.nodeType == 1 ? tmpRange.startContainer : tmpRange.startContainer.parentNode,\n                    preNode = node,\n                    doEnd = 1;\n\n                //调整开始\n                while ( 1 ) {\n                    if ( domUtils.isBody(node) ) {\n                        if ( preNode !== node ) {\n                            if ( range.collapsed ) {\n                                tmpRange.selectNode( preNode );\n                                doEnd = 0;\n                            } else {\n                                tmpRange.setStartBefore( preNode );\n                            }\n                        }else{\n                            tmpRange.setStart(node,0);\n                        }\n\n                        break;\n                    }\n                    if ( !blockquote[node.tagName] ) {\n                        if ( range.collapsed ) {\n                            tmpRange.selectNode( preNode );\n                        } else{\n                            tmpRange.setStartBefore( preNode);\n                        }\n                        break;\n                    }\n\n                    preNode = node;\n                    node = node.parentNode;\n                }\n\n                //调整结束\n                if ( doEnd ) {\n                    preNode = node =  node = tmpRange.endContainer.nodeType == 1 ? tmpRange.endContainer : tmpRange.endContainer.parentNode;\n                    while ( 1 ) {\n\n                        if ( domUtils.isBody( node ) ) {\n                            if ( preNode !== node ) {\n\n                                tmpRange.setEndAfter( preNode );\n\n                            } else {\n                                tmpRange.setEnd( node, node.childNodes.length );\n                            }\n\n                            break;\n                        }\n                        if ( !blockquote[node.tagName] ) {\n                            tmpRange.setEndAfter( preNode );\n                            break;\n                        }\n\n                        preNode = node;\n                        node = node.parentNode;\n                    }\n\n                }\n\n\n                node = range.document.createElement( 'blockquote' );\n                domUtils.setAttributes( node, attrs );\n                node.appendChild( tmpRange.extractContents() );\n                tmpRange.insertNode( node );\n                //去除重复的\n                var childs = domUtils.getElementsByTagName(node,'blockquote');\n                for(var i=0,ci;ci=childs[i++];){\n                    if(ci.parentNode){\n                        domUtils.remove(ci,true);\n                    }\n                }\n\n            }\n            range.moveToBookmark( bookmark ).select();\n        },\n        queryCommandState : function() {\n            return getObj(this) ? 1 : 0;\n        }\n    };\n};\n\n\n\n// plugins/convertcase.js\n/**\n * 大小写转换\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 把选区内文本变大写，与“tolowercase”命令互斥\n * @command touppercase\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'touppercase' );\n * ```\n */\n\n/**\n * 把选区内文本变小写，与“touppercase”命令互斥\n * @command tolowercase\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'tolowercase' );\n * ```\n */\nUE.commands['touppercase'] =\nUE.commands['tolowercase'] = {\n    execCommand:function (cmd) {\n        var me = this;\n        var rng = me.selection.getRange();\n        if(rng.collapsed){\n            return rng;\n        }\n        var bk = rng.createBookmark(),\n            bkEnd = bk.end,\n            filterFn = function( node ) {\n                return !domUtils.isBr(node) && !domUtils.isWhitespace( node );\n            },\n            curNode = domUtils.getNextDomNode( bk.start, false, filterFn );\n        while ( curNode && (domUtils.getPosition( curNode, bkEnd ) & domUtils.POSITION_PRECEDING) ) {\n\n            if ( curNode.nodeType == 3 ) {\n                curNode.nodeValue = curNode.nodeValue[cmd == 'touppercase' ? 'toUpperCase' : 'toLowerCase']();\n            }\n            curNode = domUtils.getNextDomNode( curNode, true, filterFn );\n            if(curNode === bkEnd){\n                break;\n            }\n\n        }\n        rng.moveToBookmark(bk).select();\n    }\n};\n\n\n\n// plugins/indent.js\n/**\n * 首行缩进\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 缩进\n * @command indent\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'indent' );\n * ```\n */\nUE.commands['indent'] = {\n    execCommand : function() {\n         var me = this,value = me.queryCommandState(\"indent\") ? \"0em\" : (me.options.indentValue || '2em');\n         me.execCommand('Paragraph','p',{style:'text-indent:'+ value});\n    },\n    queryCommandState : function() {\n        var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6');\n        return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ?  1 : 0;\n    }\n\n};\n\n\n// plugins/print.js\n/**\n * 打印\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 打印\n * @command print\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'print' );\n * ```\n */\nUE.commands['print'] = {\n    execCommand : function(){\n        this.window.print();\n    },\n    notNeedUndo : 1\n};\n\n\n\n// plugins/preview.js\n/**\n * 预览\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 预览\n * @command preview\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'preview' );\n * ```\n */\nUE.commands['preview'] = {\n    execCommand : function(){\n        var w = window.open('', '_blank', ''),\n            d = w.document;\n        d.open();\n        d.write('<!DOCTYPE html><html><head><meta charset=\"utf-8\"/><script src=\"'+this.options.UEDITOR_HOME_URL+'ueditor.parse.js\"></script><script>' +\n            \"setTimeout(function(){uParse('div',{rootPath: '\"+ this.options.UEDITOR_HOME_URL +\"'})},300)\" +\n            '</script></head><body><div>'+this.getContent(null,null,true)+'</div></body></html>');\n        d.close();\n    },\n    notNeedUndo : 1\n};\n\n\n// plugins/selectall.js\n/**\n * 全选\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 选中所有内容\n * @command selectall\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'selectall' );\n * ```\n */\nUE.plugins['selectall'] = function(){\n    var me = this;\n    me.commands['selectall'] = {\n        execCommand : function(){\n            //去掉了原生的selectAll,因为会出现报错和当内容为空时，不能出现闭合状态的光标\n            var me = this,body = me.body,\n                range = me.selection.getRange();\n            range.selectNodeContents(body);\n            if(domUtils.isEmptyBlock(body)){\n                //opera不能自动合并到元素的里边，要手动处理一下\n                if(browser.opera && body.firstChild && body.firstChild.nodeType == 1){\n                    range.setStartAtFirst(body.firstChild);\n                }\n                range.collapse(true);\n            }\n            range.select(true);\n        },\n        notNeedUndo : 1\n    };\n\n\n    //快捷键\n    me.addshortcutkey({\n         \"selectAll\" : \"ctrl+65\"\n    });\n};\n\n\n// plugins/paragraph.js\n/**\n * 段落样式\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 段落格式\n * @command paragraph\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param {String}   style               标签值为：'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'\n * @param {Object}   attrs               标签的属性\n * @example\n * ```javascript\n * editor.execCommand( 'Paragraph','h1','{\n *     class:'test'\n * }' );\n * ```\n */\n\n/**\n * 返回选区内节点标签名\n * @command paragraph\n * @method queryCommandValue\n * @param { String } cmd 命令字符串\n * @return { String } 节点标签名\n * @example\n * ```javascript\n * editor.queryCommandValue( 'Paragraph' );\n * ```\n */\n\nUE.plugins['paragraph'] = function() {\n    var me = this,\n        block = domUtils.isBlockElm,\n        notExchange = ['TD','LI','PRE'],\n\n        doParagraph = function(range,style,attrs,sourceCmdName){\n            var bookmark = range.createBookmark(),\n                filterFn = function( node ) {\n                    return   node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' &&  !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace( node );\n                },\n                para;\n\n            range.enlarge( true );\n            var bookmark2 = range.createBookmark(),\n                current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ),\n                tmpRange = range.cloneRange(),\n                tmpNode;\n            while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) {\n                if ( current.nodeType == 3 || !block( current ) ) {\n                    tmpRange.setStartBefore( current );\n                    while ( current && current !== bookmark2.end && !block( current ) ) {\n                        tmpNode = current;\n                        current = domUtils.getNextDomNode( current, false, null, function( node ) {\n                            return !block( node );\n                        } );\n                    }\n                    tmpRange.setEndAfter( tmpNode );\n                    \n                    para = range.document.createElement( style );\n                    if(attrs){\n                        domUtils.setAttributes(para,attrs);\n                        if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){\n                            para.style.cssText = attrs.style;\n                        }\n                    }\n                    para.appendChild( tmpRange.extractContents() );\n                    //需要内容占位\n                    if(domUtils.isEmptyNode(para)){\n                        domUtils.fillChar(range.document,para);\n                        \n                    }\n\n                    tmpRange.insertNode( para );\n\n                    var parent = para.parentNode;\n                    //如果para上一级是一个block元素且不是body,td就删除它\n                    if ( block( parent ) && !domUtils.isBody( para.parentNode ) && utils.indexOf(notExchange,parent.tagName)==-1) {\n                        //存储dir,style\n                        if(!(sourceCmdName && sourceCmdName == 'customstyle')){\n                            parent.getAttribute('dir') && para.setAttribute('dir',parent.getAttribute('dir'));\n                            //trace:1070\n                            parent.style.cssText && (para.style.cssText = parent.style.cssText + ';' + para.style.cssText);\n                            //trace:1030\n                            parent.style.textAlign && !para.style.textAlign && (para.style.textAlign = parent.style.textAlign);\n                            parent.style.textIndent && !para.style.textIndent && (para.style.textIndent = parent.style.textIndent);\n                            parent.style.padding && !para.style.padding && (para.style.padding = parent.style.padding);\n                        }\n\n                        //trace:1706 选择的就是h1-6要删除\n                        if(attrs && /h\\d/i.test(parent.tagName) && !/h\\d/i.test(para.tagName) ){\n                            domUtils.setAttributes(parent,attrs);\n                            if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){\n                                parent.style.cssText = attrs.style;\n                            }\n                            domUtils.remove(para,true);\n                            para = parent;\n                        }else{\n                            domUtils.remove( para.parentNode, true );\n                        }\n\n                    }\n                    if(  utils.indexOf(notExchange,parent.tagName)!=-1){\n                        current = parent;\n                    }else{\n                       current = para;\n                    }\n\n\n                    current = domUtils.getNextDomNode( current, false, filterFn );\n                } else {\n                    current = domUtils.getNextDomNode( current, true, filterFn );\n                }\n            }\n            return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark );\n        };\n    me.setOpt('paragraph',{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''});\n    me.commands['paragraph'] = {\n        execCommand : function( cmdName, style,attrs,sourceCmdName ) {\n            var range = this.selection.getRange();\n             //闭合时单独处理\n            if(range.collapsed){\n                var txt = this.document.createTextNode('p');\n                range.insertNode(txt);\n                //去掉冗余的fillchar\n                if(browser.ie){\n                    var node = txt.previousSibling;\n                    if(node && domUtils.isWhitespace(node)){\n                        domUtils.remove(node);\n                    }\n                    node = txt.nextSibling;\n                    if(node && domUtils.isWhitespace(node)){\n                        domUtils.remove(node);\n                    }\n                }\n\n            }\n            range = doParagraph(range,style,attrs,sourceCmdName);\n            if(txt){\n                range.setStartBefore(txt).collapse(true);\n                pN = txt.parentNode;\n\n                domUtils.remove(txt);\n\n                if(domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)){\n                    domUtils.fillNode(this.document,pN);\n                }\n\n            }\n\n            if(browser.gecko && range.collapsed && range.startContainer.nodeType == 1){\n                var child = range.startContainer.childNodes[range.startOffset];\n                if(child && child.nodeType == 1 && child.tagName.toLowerCase() == style){\n                    range.setStart(child,0).collapse(true);\n                }\n            }\n            //trace:1097 原来有true，原因忘了，但去了就不能清除多余的占位符了\n            range.select();\n\n\n            return true;\n        },\n        queryCommandValue : function() {\n            var node = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6');\n            return node ? node.tagName.toLowerCase() : '';\n        }\n    };\n};\n\n\n// plugins/directionality.js\n/**\n * 设置文字输入的方向的插件\n * @file\n * @since 1.2.6.1\n */\n(function() {\n    var block = domUtils.isBlockElm ,\n        getObj = function(editor){\n//            var startNode = editor.selection.getStart(),\n//                parents;\n//            if ( startNode ) {\n//                //查找所有的是block的父亲节点\n//                parents = domUtils.findParents( startNode, true, block, true );\n//                for ( var i = 0,ci; ci = parents[i++]; ) {\n//                    if ( ci.getAttribute( 'dir' ) ) {\n//                        return ci;\n//                    }\n//                }\n//            }\n            return domUtils.filterNodeList(editor.selection.getStartElementPath(),function(n){return n && n.nodeType == 1 && n.getAttribute('dir')});\n\n        },\n        doDirectionality = function(range,editor,forward){\n            \n            var bookmark,\n                filterFn = function( node ) {\n                    return   node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node);\n                },\n\n                obj = getObj( editor );\n\n            if ( obj && range.collapsed ) {\n                obj.setAttribute( 'dir', forward );\n                return range;\n            }\n            bookmark = range.createBookmark();\n            range.enlarge( true );\n            var bookmark2 = range.createBookmark(),\n                current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ),\n                tmpRange = range.cloneRange(),\n                tmpNode;\n            while ( current &&  !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) {\n                if ( current.nodeType == 3 || !block( current ) ) {\n                    tmpRange.setStartBefore( current );\n                    while ( current && current !== bookmark2.end && !block( current ) ) {\n                        tmpNode = current;\n                        current = domUtils.getNextDomNode( current, false, null, function( node ) {\n                            return !block( node );\n                        } );\n                    }\n                    tmpRange.setEndAfter( tmpNode );\n                    var common = tmpRange.getCommonAncestor();\n                    if ( !domUtils.isBody( common ) && block( common ) ) {\n                        //遍历到了block节点\n                        common.setAttribute( 'dir', forward );\n                        current = common;\n                    } else {\n                        //没有遍历到，添加一个block节点\n                        var p = range.document.createElement( 'p' );\n                        p.setAttribute( 'dir', forward );\n                        var frag = tmpRange.extractContents();\n                        p.appendChild( frag );\n                        tmpRange.insertNode( p );\n                        current = p;\n                    }\n\n                    current = domUtils.getNextDomNode( current, false, filterFn );\n                } else {\n                    current = domUtils.getNextDomNode( current, true, filterFn );\n                }\n            }\n            return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark );\n        };\n\n    /**\n     * 文字输入方向\n     * @command directionality\n     * @method execCommand\n     * @param { String } cmdName 命令字符串\n     * @param { String } forward 传入'ltr'表示从左向右输入，传入'rtl'表示从右向左输入\n     * @example\n     * ```javascript\n     * editor.execCommand( 'directionality', 'ltr');\n     * ```\n     */\n\n    /**\n     * 查询当前选区的文字输入方向\n     * @command directionality\n     * @method queryCommandValue\n     * @param { String } cmdName 命令字符串\n     * @return { String } 返回'ltr'表示从左向右输入，返回'rtl'表示从右向左输入\n     * @example\n     * ```javascript\n     * editor.queryCommandValue( 'directionality');\n     * ```\n     */\n    UE.commands['directionality'] = {\n        execCommand : function( cmdName,forward ) {\n            var range = this.selection.getRange();\n            //闭合时单独处理\n            if(range.collapsed){\n                var txt = this.document.createTextNode('d');\n                range.insertNode(txt);\n            }\n            doDirectionality(range,this,forward);\n            if(txt){\n                range.setStartBefore(txt).collapse(true);\n                domUtils.remove(txt);\n            }\n\n            range.select();\n            return true;\n        },\n        queryCommandValue : function() {\n            var node = getObj(this);\n            return node ? node.getAttribute('dir') : 'ltr';\n        }\n    };\n})();\n\n\n\n// plugins/horizontal.js\n/**\n * 插入分割线插件\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 插入分割线\n * @command horizontal\n * @method execCommand\n * @param { String } cmdName 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'horizontal' );\n * ```\n */\nUE.plugins['horizontal'] = function(){\n    var me = this;\n    me.commands['horizontal'] = {\n        execCommand : function( cmdName ) {\n            var me = this;\n            if(me.queryCommandState(cmdName)!==-1){\n                me.execCommand('insertHtml','<hr>');\n                var range = me.selection.getRange(),\n                    start = range.startContainer;\n                if(start.nodeType == 1 && !start.childNodes[range.startOffset] ){\n\n                    var tmp;\n                    if(tmp = start.childNodes[range.startOffset - 1]){\n                        if(tmp.nodeType == 1 && tmp.tagName == 'HR'){\n                            if(me.options.enterTag == 'p'){\n                                tmp = me.document.createElement('p');\n                                range.insertNode(tmp);\n                                range.setStart(tmp,0).setCursor();\n\n                            }else{\n                                tmp = me.document.createElement('br');\n                                range.insertNode(tmp);\n                                range.setStartBefore(tmp).setCursor();\n                            }\n                        }\n                    }\n\n                }\n                return true;\n            }\n\n        },\n        //边界在table里不能加分隔线\n        queryCommandState : function() {\n            return domUtils.filterNodeList(this.selection.getStartElementPath(),'table') ? -1 : 0;\n        }\n    };\n//    me.addListener('delkeyup',function(){\n//        var rng = this.selection.getRange();\n//        if(browser.ie && browser.version > 8){\n//            rng.txtToElmBoundary(true);\n//            if(domUtils.isStartInblock(rng)){\n//                var tmpNode = rng.startContainer;\n//                var pre = tmpNode.previousSibling;\n//                if(pre && domUtils.isTagNode(pre,'hr')){\n//                    domUtils.remove(pre);\n//                    rng.select();\n//                    return;\n//                }\n//            }\n//        }\n//        if(domUtils.isBody(rng.startContainer)){\n//            var hr = rng.startContainer.childNodes[rng.startOffset -1];\n//            if(hr && hr.nodeName == 'HR'){\n//                var next = hr.nextSibling;\n//                if(next){\n//                    rng.setStart(next,0)\n//                }else if(hr.previousSibling){\n//                    rng.setStartAtLast(hr.previousSibling)\n//                }else{\n//                    var p = this.document.createElement('p');\n//                    hr.parentNode.insertBefore(p,hr);\n//                    domUtils.fillNode(this.document,p);\n//                    rng.setStart(p,0);\n//                }\n//                domUtils.remove(hr);\n//                rng.setCursor(false,true);\n//            }\n//        }\n//    })\n    me.addListener('delkeydown',function(name,evt){\n        var rng = this.selection.getRange();\n        rng.txtToElmBoundary(true);\n        if(domUtils.isStartInblock(rng)){\n            var tmpNode = rng.startContainer;\n            var pre = tmpNode.previousSibling;\n            if(pre && domUtils.isTagNode(pre,'hr')){\n                domUtils.remove(pre);\n                rng.select();\n                domUtils.preventDefault(evt);\n                return true;\n\n            }\n        }\n\n    })\n};\n\n\n\n// plugins/time.js\n/**\n * 插入时间和日期\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 插入时间，默认格式：12:59:59\n * @command time\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'time');\n * ```\n */\n\n/**\n * 插入日期，默认格式：2013-08-30\n * @command date\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'date');\n * ```\n */\nUE.commands['time'] = UE.commands[\"date\"] = {\n    execCommand : function(cmd, format){\n        var date = new Date;\n\n        function formatTime(date, format) {\n            var hh = ('0' + date.getHours()).slice(-2),\n                ii = ('0' + date.getMinutes()).slice(-2),\n                ss = ('0' + date.getSeconds()).slice(-2);\n            format = format || 'hh:ii:ss';\n            return format.replace(/hh/ig, hh).replace(/ii/ig, ii).replace(/ss/ig, ss);\n        }\n        function formatDate(date, format) {\n            var yyyy = ('000' + date.getFullYear()).slice(-4),\n                yy = yyyy.slice(-2),\n                mm = ('0' + (date.getMonth()+1)).slice(-2),\n                dd = ('0' + date.getDate()).slice(-2);\n            format = format || 'yyyy-mm-dd';\n            return format.replace(/yyyy/ig, yyyy).replace(/yy/ig, yy).replace(/mm/ig, mm).replace(/dd/ig, dd);\n        }\n\n        this.execCommand('insertHtml',cmd == \"time\" ? formatTime(date, format):formatDate(date, format) );\n    }\n};\n\n\n// plugins/rowspacing.js\n/**\n * 段前段后间距插件\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 设置段间距\n * @command rowspacing\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @param { String } value 段间距的值，以px为单位\n * @param { String } dir 间距位置，top或bottom，分别表示段前和段后\n * @example\n * ```javascript\n * editor.execCommand( 'rowspacing', '10', 'top' );\n * ```\n */\n\nUE.plugins['rowspacing'] = function(){\n    var me = this;\n    me.setOpt({\n        'rowspacingtop':['5', '10', '15', '20', '25'],\n        'rowspacingbottom':['5', '10', '15', '20', '25']\n\n    });\n    me.commands['rowspacing'] =  {\n        execCommand : function( cmdName,value,dir ) {\n            this.execCommand('paragraph','p',{style:'margin-'+dir+':'+value + 'px'});\n            return true;\n        },\n        queryCommandValue : function(cmdName,dir) {\n            var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node) }),\n                value;\n            //trace:1026\n            if(pN){\n                value = domUtils.getComputedStyle(pN,'margin-'+dir).replace(/[^\\d]/g,'');\n                return !value ? 0 : value;\n            }\n            return 0;\n\n        }\n    };\n};\n\n\n\n\n// plugins/lineheight.js\n/**\n * 设置行内间距\n * @file\n * @since 1.2.6.1\n */\nUE.plugins['lineheight'] = function(){\n    var me = this;\n    me.setOpt({'lineheight':['1', '1.5','1.75','2', '3', '4', '5']});\n\n    /**\n     * 行距\n     * @command lineheight\n     * @method execCommand\n     * @param { String } cmdName 命令字符串\n     * @param { String } value 传入的行高值， 该值是当前字体的倍数， 例如： 1.5, 1.75\n     * @example\n     * ```javascript\n     * editor.execCommand( 'lineheight', 1.5);\n     * ```\n     */\n    /**\n     * 查询当前选区内容的行高大小\n     * @command lineheight\n     * @method queryCommandValue\n     * @param { String } cmd 命令字符串\n     * @return { String } 返回当前行高大小\n     * @example\n     * ```javascript\n     * editor.queryCommandValue( 'lineheight' );\n     * ```\n     */\n\n    me.commands['lineheight'] =  {\n        execCommand : function( cmdName,value ) {\n            this.execCommand('paragraph','p',{style:'line-height:'+ (value == \"1\" ? \"normal\" : value + 'em') });\n            return true;\n        },\n        queryCommandValue : function() {\n            var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node)});\n            if(pN){\n                var value = domUtils.getComputedStyle(pN,'line-height');\n                return value == 'normal' ? 1 : value.replace(/[^\\d.]*/ig,\"\");\n            }\n        }\n    };\n};\n\n\n\n\n// plugins/insertcode.js\n/**\n * 插入代码插件\n * @file\n * @since 1.2.6.1\n */\n\nUE.plugins['insertcode'] = function() {\n    var me = this;\n    me.ready(function(){\n        utils.cssRule('pre','pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}',\n            me.document)\n    });\n    me.setOpt('insertcode',{\n            'as3':'ActionScript3',\n            'bash':'Bash/Shell',\n            'cpp':'C/C++',\n            'css':'Css',\n            'cf':'CodeFunction',\n            'c#':'C#',\n            'delphi':'Delphi',\n            'diff':'Diff',\n            'erlang':'Erlang',\n            'groovy':'Groovy',\n            'html':'Html',\n            'java':'Java',\n            'jfx':'JavaFx',\n            'js':'Javascript',\n            'pl':'Perl',\n            'php':'Php',\n            'plain':'Plain Text',\n            'ps':'PowerShell',\n            'python':'Python',\n            'ruby':'Ruby',\n            'scala':'Scala',\n            'sql':'Sql',\n            'vb':'Vb',\n            'xml':'Xml'\n    });\n\n    /**\n     * 插入代码\n     * @command insertcode\n     * @method execCommand\n     * @param { String } cmd 命令字符串\n     * @param { String } lang 插入代码的语言\n     * @example\n     * ```javascript\n     * editor.execCommand( 'insertcode', 'javascript' );\n     * ```\n     */\n\n    /**\n     * 如果选区所在位置是插入插入代码区域，返回代码的语言\n     * @command insertcode\n     * @method queryCommandValue\n     * @param { String } cmd 命令字符串\n     * @return { String } 返回代码的语言\n     * @example\n     * ```javascript\n     * editor.queryCommandValue( 'insertcode' );\n     * ```\n     */\n\n    me.commands['insertcode'] = {\n        execCommand : function(cmd,lang){\n            var me = this,\n                rng = me.selection.getRange(),\n                pre = domUtils.findParentByTagName(rng.startContainer,'pre',true);\n            if(pre){\n                pre.className = 'brush:'+lang+';toolbar:false;';\n            }else{\n                var code = '';\n                if(rng.collapsed){\n                    code = browser.ie && browser.ie11below ? (browser.version <= 8 ? '&nbsp;':''):'<br/>';\n                }else{\n                    var frag = rng.extractContents();\n                    var div = me.document.createElement('div');\n                    div.appendChild(frag);\n\n                    utils.each(UE.filterNode(UE.htmlparser(div.innerHTML.replace(/[\\r\\t]/g,'')),me.options.filterTxtRules).children,function(node){\n                        if(browser.ie && browser.ie11below && browser.version > 8){\n\n                            if(node.type =='element'){\n                                if(node.tagName == 'br'){\n                                    code += '\\n'\n                                }else if(!dtd.$empty[node.tagName]){\n                                    utils.each(node.children,function(cn){\n                                        if(cn.type =='element'){\n                                            if(cn.tagName == 'br'){\n                                                code += '\\n'\n                                            }else if(!dtd.$empty[node.tagName]){\n                                                code += cn.innerText();\n                                            }\n                                        }else{\n                                            code += cn.data\n                                        }\n                                    })\n                                    if(!/\\n$/.test(code)){\n                                        code += '\\n';\n                                    }\n                                }\n                            }else{\n                                code += node.data + '\\n'\n                            }\n                            if(!node.nextSibling() && /\\n$/.test(code)){\n                                code = code.replace(/\\n$/,'');\n                            }\n                        }else{\n                            if(browser.ie && browser.ie11below){\n\n                                if(node.type =='element'){\n                                    if(node.tagName == 'br'){\n                                        code += '<br>'\n                                    }else if(!dtd.$empty[node.tagName]){\n                                        utils.each(node.children,function(cn){\n                                            if(cn.type =='element'){\n                                                if(cn.tagName == 'br'){\n                                                    code += '<br>'\n                                                }else if(!dtd.$empty[node.tagName]){\n                                                    code += cn.innerText();\n                                                }\n                                            }else{\n                                                code += cn.data\n                                            }\n                                        });\n                                        if(!/br>$/.test(code)){\n                                            code += '<br>';\n                                        }\n                                    }\n                                }else{\n                                    code += node.data + '<br>'\n                                }\n                                if(!node.nextSibling() && /<br>$/.test(code)){\n                                    code = code.replace(/<br>$/,'');\n                                }\n\n                            }else{\n                                code += (node.type == 'element' ? (dtd.$empty[node.tagName] ?  '' : node.innerText()) : node.data);\n                                if(!/br\\/?\\s*>$/.test(code)){\n                                    if(!node.nextSibling())\n                                        return;\n                                    code += '<br>'\n                                }\n                            }\n\n                        }\n\n                    });\n                }\n                me.execCommand('inserthtml','<pre id=\"coder\"class=\"brush:'+lang+';toolbar:false\">'+code+'</pre>',true);\n\n                pre = me.document.getElementById('coder');\n                domUtils.removeAttributes(pre,'id');\n                var tmpNode = pre.previousSibling;\n\n                if(tmpNode && (tmpNode.nodeType == 3 && tmpNode.nodeValue.length == 1 && browser.ie && browser.version == 6 ||  domUtils.isEmptyBlock(tmpNode))){\n\n                    domUtils.remove(tmpNode)\n                }\n                var rng = me.selection.getRange();\n                if(domUtils.isEmptyBlock(pre)){\n                    rng.setStart(pre,0).setCursor(false,true)\n                }else{\n                    rng.selectNodeContents(pre).select()\n                }\n            }\n\n\n\n        },\n        queryCommandValue : function(){\n            var path = this.selection.getStartElementPath();\n            var lang = '';\n            utils.each(path,function(node){\n                if(node.nodeName =='PRE'){\n                    var match = node.className.match(/brush:([^;]+)/);\n                    lang = match && match[1] ? match[1] : '';\n                    return false;\n                }\n            });\n            return lang;\n        }\n    };\n\n    me.addInputRule(function(root){\n       utils.each(root.getNodesByTagName('pre'),function(pre){\n           var brs = pre.getNodesByTagName('br');\n           if(brs.length){\n               browser.ie && browser.ie11below && browser.version > 8 && utils.each(brs,function(br){\n                   var txt = UE.uNode.createText('\\n');\n                   br.parentNode.insertBefore(txt,br);\n                   br.parentNode.removeChild(br);\n               });\n               return;\n            }\n           if(browser.ie && browser.ie11below && browser.version > 8)\n                return;\n            var code = pre.innerText().split(/\\n/);\n            pre.innerHTML('');\n            utils.each(code,function(c){\n                if(c.length){\n                    pre.appendChild(UE.uNode.createText(c));\n                }\n                pre.appendChild(UE.uNode.createElement('br'))\n            })\n       })\n    });\n    me.addOutputRule(function(root){\n        utils.each(root.getNodesByTagName('pre'),function(pre){\n            var code = '';\n            utils.each(pre.children,function(n){\n               if(n.type == 'text'){\n                   //在ie下文本内容有可能末尾带有\\n要去掉\n                   //trace:3396\n                   code += n.data.replace(/[ ]/g,'&nbsp;').replace(/\\n$/,'');\n               }else{\n                   if(n.tagName == 'br'){\n                       code  += '\\n'\n                   }else{\n                       code += (!dtd.$empty[n.tagName] ? '' : n.innerText());\n                   }\n\n               }\n\n            });\n\n            pre.innerText(code.replace(/(&nbsp;|\\n)+$/,''))\n        })\n    });\n    //不需要判断highlight的command列表\n    me.notNeedCodeQuery ={\n        help:1,\n        undo:1,\n        redo:1,\n        source:1,\n        print:1,\n        searchreplace:1,\n        fullscreen:1,\n        preview:1,\n        insertparagraph:1,\n        elementpath:1,\n        insertcode:1,\n        inserthtml:1,\n        selectall:1\n    };\n    //将queyCommamndState重置\n    var orgQuery = me.queryCommandState;\n    me.queryCommandState = function(cmd){\n        var me = this;\n\n        if(!me.notNeedCodeQuery[cmd.toLowerCase()] && me.selection && me.queryCommandValue('insertcode')){\n            return -1;\n        }\n        return UE.Editor.prototype.queryCommandState.apply(this,arguments)\n    };\n    me.addListener('beforeenterkeydown',function(){\n        var rng = me.selection.getRange();\n        var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true);\n        if(pre){\n            me.fireEvent('saveScene');\n            if(!rng.collapsed){\n               rng.deleteContents();\n            }\n            if(!browser.ie || browser.ie9above){\n                var tmpNode = me.document.createElement('br'),pre;\n                rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true);\n                var next = tmpNode.nextSibling;\n                if(!next && (!browser.ie || browser.version > 10)){\n                    rng.insertNode(tmpNode.cloneNode(false));\n                }else{\n                    rng.setStartAfter(tmpNode);\n                }\n                pre = tmpNode.previousSibling;\n                var tmp;\n                while(pre ){\n                    tmp = pre;\n                    pre = pre.previousSibling;\n                    if(!pre || pre.nodeName == 'BR'){\n                        pre = tmp;\n                        break;\n                    }\n                }\n                if(pre){\n                    var str = '';\n                    while(pre && pre.nodeName != 'BR' &&  new RegExp('^[\\\\s'+domUtils.fillChar+']*$').test(pre.nodeValue)){\n                        str += pre.nodeValue;\n                        pre = pre.nextSibling;\n                    }\n                    if(pre.nodeName != 'BR'){\n                        var match = pre.nodeValue.match(new RegExp('^([\\\\s'+domUtils.fillChar+']+)'));\n                        if(match && match[1]){\n                            str += match[1]\n                        }\n\n                    }\n                    if(str){\n                        str = me.document.createTextNode(str);\n                        rng.insertNode(str).setStartAfter(str);\n                    }\n                }\n                rng.collapse(true).select(true);\n            }else{\n                if(browser.version > 8){\n\n                    var txt = me.document.createTextNode('\\n');\n                    var start = rng.startContainer;\n                    if(rng.startOffset == 0){\n                        var preNode = start.previousSibling;\n                        if(preNode){\n                            rng.insertNode(txt);\n                            var fillchar = me.document.createTextNode(' ');\n                            rng.setStartAfter(txt).insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true)\n                        }\n                    }else{\n                        rng.insertNode(txt).setStartAfter(txt);\n                        var fillchar = me.document.createTextNode(' ');\n                        start = rng.startContainer.childNodes[rng.startOffset];\n                        if(start && !/^\\n/.test(start.nodeValue)){\n                            rng.setStartBefore(txt)\n                        }\n                        rng.insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true)\n                    }\n\n                }else{\n                    var tmpNode = me.document.createElement('br');\n                    rng.insertNode(tmpNode);\n                    rng.insertNode(me.document.createTextNode(domUtils.fillChar));\n                    rng.setStartAfter(tmpNode);\n                    pre = tmpNode.previousSibling;\n                    var tmp;\n                    while(pre ){\n                        tmp = pre;\n                        pre = pre.previousSibling;\n                        if(!pre || pre.nodeName == 'BR'){\n                            pre = tmp;\n                            break;\n                        }\n                    }\n                    if(pre){\n                        var str = '';\n                        while(pre && pre.nodeName != 'BR' &&  new RegExp('^[ '+domUtils.fillChar+']*$').test(pre.nodeValue)){\n                            str += pre.nodeValue;\n                            pre = pre.nextSibling;\n                        }\n                        if(pre.nodeName != 'BR'){\n                            var match = pre.nodeValue.match(new RegExp('^([ '+domUtils.fillChar+']+)'));\n                            if(match && match[1]){\n                                str += match[1]\n                            }\n\n                        }\n\n                        str = me.document.createTextNode(str);\n                        rng.insertNode(str).setStartAfter(str);\n                    }\n                    rng.collapse(true).select();\n                }\n\n\n            }\n            me.fireEvent('saveScene');\n            return true;\n        }\n\n\n    });\n\n    me.addListener('tabkeydown',function(cmd,evt){\n        var rng = me.selection.getRange();\n        var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true);\n        if(pre){\n            me.fireEvent('saveScene');\n            if(evt.shiftKey){\n\n            }else{\n                if(!rng.collapsed){\n                    var bk = rng.createBookmark();\n                    var start = bk.start.previousSibling;\n\n                    while(start){\n                        if(pre.firstChild === start && !domUtils.isBr(start)){\n                            pre.insertBefore(me.document.createTextNode('    '),start);\n\n                            break;\n                        }\n                        if(domUtils.isBr(start)){\n                            pre.insertBefore(me.document.createTextNode('    '),start.nextSibling);\n\n                            break;\n                        }\n                        start = start.previousSibling;\n                    }\n                    var end = bk.end;\n                    start = bk.start.nextSibling;\n                    if(pre.firstChild === bk.start){\n                        pre.insertBefore(me.document.createTextNode('    '),start.nextSibling)\n\n                    }\n                    while(start && start !== end){\n                        if(domUtils.isBr(start) && start.nextSibling){\n                            if(start.nextSibling === end){\n                                break;\n                            }\n                            pre.insertBefore(me.document.createTextNode('    '),start.nextSibling)\n                        }\n\n                        start = start.nextSibling;\n                    }\n                    rng.moveToBookmark(bk).select();\n                }else{\n                    var tmpNode = me.document.createTextNode('    ');\n                    rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true).select(true);\n                }\n            }\n\n\n            me.fireEvent('saveScene');\n            return true;\n        }\n\n\n    });\n\n\n    me.addListener('beforeinserthtml',function(evtName,html){\n        var me = this,\n            rng = me.selection.getRange(),\n            pre = domUtils.findParentByTagName(rng.startContainer,'pre',true);\n        if(pre){\n            if(!rng.collapsed){\n                rng.deleteContents()\n            }\n            var htmlstr = '';\n            if(browser.ie && browser.version > 8){\n\n                utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){\n                    if(node.type =='element'){\n                        if(node.tagName == 'br'){\n                            htmlstr += '\\n'\n                        }else if(!dtd.$empty[node.tagName]){\n                            utils.each(node.children,function(cn){\n                                if(cn.type =='element'){\n                                    if(cn.tagName == 'br'){\n                                        htmlstr += '\\n'\n                                    }else if(!dtd.$empty[node.tagName]){\n                                        htmlstr += cn.innerText();\n                                    }\n                                }else{\n                                    htmlstr += cn.data\n                                }\n                            })\n                            if(!/\\n$/.test(htmlstr)){\n                                htmlstr += '\\n';\n                            }\n                        }\n                    }else{\n                        htmlstr += node.data + '\\n'\n                    }\n                    if(!node.nextSibling() && /\\n$/.test(htmlstr)){\n                        htmlstr = htmlstr.replace(/\\n$/,'');\n                    }\n                });\n                var tmpNode = me.document.createTextNode(utils.html(htmlstr.replace(/&nbsp;/g,' ')));\n                rng.insertNode(tmpNode).selectNode(tmpNode).select();\n            }else{\n                var frag = me.document.createDocumentFragment();\n\n                utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){\n                    if(node.type =='element'){\n                        if(node.tagName == 'br'){\n                            frag.appendChild(me.document.createElement('br'))\n                        }else if(!dtd.$empty[node.tagName]){\n                            utils.each(node.children,function(cn){\n                                if(cn.type =='element'){\n                                    if(cn.tagName == 'br'){\n\n                                        frag.appendChild(me.document.createElement('br'))\n                                    }else if(!dtd.$empty[node.tagName]){\n                                        frag.appendChild(me.document.createTextNode(utils.html(cn.innerText().replace(/&nbsp;/g,' '))));\n\n                                    }\n                                }else{\n                                    frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/&nbsp;/g,' '))));\n\n                                }\n                            })\n                            if(frag.lastChild.nodeName != 'BR'){\n                                frag.appendChild(me.document.createElement('br'))\n                            }\n                        }\n                    }else{\n                        frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/&nbsp;/g,' '))));\n                    }\n                    if(!node.nextSibling() && frag.lastChild.nodeName == 'BR'){\n                       frag.removeChild(frag.lastChild)\n                    }\n\n\n                });\n                rng.insertNode(frag).select();\n\n            }\n\n            return true;\n        }\n    });\n    //方向键的处理\n    me.addListener('keydown',function(cmd,evt){\n        var me = this,keyCode = evt.keyCode || evt.which;\n        if(keyCode == 40){\n            var rng = me.selection.getRange(),pre,start = rng.startContainer;\n            if(rng.collapsed && (pre = domUtils.findParentByTagName(rng.startContainer,'pre',true)) && !pre.nextSibling){\n                var last = pre.lastChild\n                while(last && last.nodeName == 'BR'){\n                    last = last.previousSibling;\n                }\n                if(last === start || rng.startContainer === pre && rng.startOffset == pre.childNodes.length){\n                    me.execCommand('insertparagraph');\n                    domUtils.preventDefault(evt)\n                }\n\n            }\n        }\n    });\n    //trace:3395\n    me.addListener('delkeydown',function(type,evt){\n        var rng = this.selection.getRange();\n        rng.txtToElmBoundary(true);\n        var start = rng.startContainer;\n        if(domUtils.isTagNode(start,'pre') && rng.collapsed && domUtils.isStartInblock(rng)){\n            var p = me.document.createElement('p');\n            domUtils.fillNode(me.document,p);\n            start.parentNode.insertBefore(p,start);\n            domUtils.remove(start);\n            rng.setStart(p,0).setCursor(false,true);\n            domUtils.preventDefault(evt);\n            return true;\n        }\n    })\n};\n\n\n// plugins/cleardoc.js\n/**\n * 清空文档插件\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 清空文档\n * @command cleardoc\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * //editor 是编辑器实例\n * editor.execCommand('cleardoc');\n * ```\n */\n\nUE.commands['cleardoc'] = {\n    execCommand : function( cmdName) {\n        var me = this,\n            enterTag = me.options.enterTag,\n            range = me.selection.getRange();\n        if(enterTag == \"br\"){\n            me.body.innerHTML = \"<br/>\";\n            range.setStart(me.body,0).setCursor();\n        }else{\n            me.body.innerHTML = \"<p>\"+(ie ? \"\" : \"<br/>\")+\"</p>\";\n            range.setStart(me.body.firstChild,0).setCursor(false,true);\n        }\n        setTimeout(function(){\n            me.fireEvent(\"clearDoc\");\n        },0);\n\n    }\n};\n\n\n\n// plugins/anchor.js\n/**\n * 锚点插件，为UEditor提供插入锚点支持\n * @file\n * @since 1.2.6.1\n */\nUE.plugin.register('anchor', function (){\n\n    return {\n        bindEvents:{\n            'ready':function(){\n                utils.cssRule('anchor',\n                    '.anchorclass{background: url(\\''\n                        + this.options.themePath\n                        + this.options.theme +'/images/anchor.gif\\') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}',\n                    this.document);\n            }\n        },\n       outputRule: function(root){\n           utils.each(root.getNodesByTagName('img'),function(a){\n               var val;\n               if(val = a.getAttr('anchorname')){\n                   a.tagName = 'a';\n                   a.setAttr({\n                       anchorname : '',\n                       name : val,\n                       'class' : ''\n                   })\n               }\n           })\n       },\n       inputRule:function(root){\n           utils.each(root.getNodesByTagName('a'),function(a){\n               var val;\n               if((val = a.getAttr('name')) && !a.getAttr('href')){\n                   a.tagName = 'img';\n                   a.setAttr({\n                       anchorname :a.getAttr('name'),\n                       'class' : 'anchorclass'\n                   });\n                   a.setAttr('name')\n\n               }\n           })\n\n       },\n       commands:{\n           /**\n            * 插入锚点\n            * @command anchor\n            * @method execCommand\n            * @param { String } cmd 命令字符串\n            * @param { String } name 锚点名称字符串\n            * @example\n            * ```javascript\n            * //editor 是编辑器实例\n            * editor.execCommand('anchor', 'anchor1');\n            * ```\n            */\n           'anchor':{\n               execCommand:function (cmd, name) {\n                   var range = this.selection.getRange(),img = range.getClosedNode();\n                   if (img && img.getAttribute('anchorname')) {\n                       if (name) {\n                           img.setAttribute('anchorname', name);\n                       } else {\n                           range.setStartBefore(img).setCursor();\n                           domUtils.remove(img);\n                       }\n                   } else {\n                       if (name) {\n                           //只在选区的开始插入\n                           var anchor = this.document.createElement('img');\n                           range.collapse(true);\n                           domUtils.setAttributes(anchor,{\n                               'anchorname':name,\n                               'class':'anchorclass'\n                           });\n                           range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true);\n                       }\n                   }\n               }\n           }\n       }\n    }\n});\n\n\n// plugins/wordcount.js\n///import core\n///commands 字数统计\n///commandsName  WordCount,wordCount\n///commandsTitle  字数统计\n/*\n * Created by JetBrains WebStorm.\n * User: taoqili\n * Date: 11-9-7\n * Time: 下午8:18\n * To change this template use File | Settings | File Templates.\n */\n\nUE.plugins['wordcount'] = function(){\n    var me = this;\n    me.setOpt('wordCount',true);\n    me.addListener('contentchange',function(){\n        me.fireEvent('wordcount');\n    });\n    var timer;\n    me.addListener('ready',function(){\n        var me = this;\n        domUtils.on(me.body,\"keyup\",function(evt){\n            var code = evt.keyCode||evt.which,\n                //忽略的按键,ctr,alt,shift,方向键\n                ignores = {\"16\":1,\"18\":1,\"20\":1,\"37\":1,\"38\":1,\"39\":1,\"40\":1};\n            if(code in ignores) return;\n            clearTimeout(timer);\n            timer = setTimeout(function(){\n                me.fireEvent('wordcount');\n            },200)\n        })\n    });\n};\n\n\n// plugins/pagebreak.js\n/**\n * 分页功能插件\n * @file\n * @since 1.2.6.1\n */\nUE.plugins['pagebreak'] = function () {\n    var me = this,\n        notBreakTags = ['td'];\n    me.setOpt('pageBreakTag','_ueditor_page_break_tag_');\n\n    function fillNode(node){\n        if(domUtils.isEmptyBlock(node)){\n            var firstChild = node.firstChild,tmpNode;\n\n            while(firstChild && firstChild.nodeType == 1 && domUtils.isEmptyBlock(firstChild)){\n                tmpNode = firstChild;\n                firstChild = firstChild.firstChild;\n            }\n            !tmpNode && (tmpNode = node);\n            domUtils.fillNode(me.document,tmpNode);\n        }\n    }\n    //分页符样式添加\n\n    me.ready(function(){\n        utils.cssRule('pagebreak','.pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}',me.document);\n    });\n    function isHr(node){\n        return node && node.nodeType == 1 && node.tagName == 'HR' && node.className == 'pagebreak';\n    }\n    me.addInputRule(function(root){\n        root.traversal(function(node){\n            if(node.type == 'text' && node.data == me.options.pageBreakTag){\n                var hr = UE.uNode.createElement('<hr class=\"pagebreak\" noshade=\"noshade\" size=\"5\" style=\"-webkit-user-select: none;\">');\n                node.parentNode.insertBefore(hr,node);\n                node.parentNode.removeChild(node)\n            }\n        })\n    });\n    me.addOutputRule(function(node){\n        utils.each(node.getNodesByTagName('hr'),function(n){\n            if(n.getAttr('class') == 'pagebreak'){\n                var txt = UE.uNode.createText(me.options.pageBreakTag);\n                n.parentNode.insertBefore(txt,n);\n                n.parentNode.removeChild(n);\n            }\n        })\n\n    });\n\n    /**\n     * 插入分页符\n     * @command pagebreak\n     * @method execCommand\n     * @param { String } cmd 命令字符串\n     * @remind 在表格中插入分页符会把表格切分成两部分\n     * @remind 获取编辑器内的数据时， 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串，\n     *          以便于提交数据到服务器端后处理分页。\n     * @example\n     * ```javascript\n     * editor.execCommand( 'pagebreak'); //插入一个hr标签，带有样式类名pagebreak\n     * ```\n     */\n\n    me.commands['pagebreak'] = {\n        execCommand:function () {\n            var range = me.selection.getRange(),hr = me.document.createElement('hr');\n            domUtils.setAttributes(hr,{\n                'class' : 'pagebreak',\n                noshade:\"noshade\",\n                size:\"5\"\n            });\n            domUtils.unSelectable(hr);\n            //table单独处理\n            var node = domUtils.findParentByTagName(range.startContainer, notBreakTags, true),\n\n                parents = [], pN;\n            if (node) {\n                switch (node.tagName) {\n                    case 'TD':\n                        pN = node.parentNode;\n                        if (!pN.previousSibling) {\n                            var table = domUtils.findParentByTagName(pN, 'table');\n//                            var tableWrapDiv = table.parentNode;\n//                            if(tableWrapDiv && tableWrapDiv.nodeType == 1\n//                                && tableWrapDiv.tagName == 'DIV'\n//                                && tableWrapDiv.getAttribute('dropdrag')\n//                                ){\n//                                domUtils.remove(tableWrapDiv,true);\n//                            }\n                            table.parentNode.insertBefore(hr, table);\n                            parents = domUtils.findParents(hr, true);\n\n                        } else {\n                            pN.parentNode.insertBefore(hr, pN);\n                            parents = domUtils.findParents(hr);\n\n                        }\n                        pN = parents[1];\n                        if (hr !== pN) {\n                            domUtils.breakParent(hr, pN);\n\n                        }\n                        //table要重写绑定一下拖拽\n                        me.fireEvent('afteradjusttable',me.document);\n                }\n\n            } else {\n\n                if (!range.collapsed) {\n                    range.deleteContents();\n                    var start = range.startContainer;\n                    while ( !domUtils.isBody(start) && domUtils.isBlockElm(start) && domUtils.isEmptyNode(start)) {\n                        range.setStartBefore(start).collapse(true);\n                        domUtils.remove(start);\n                        start = range.startContainer;\n                    }\n\n                }\n                range.insertNode(hr);\n\n                var pN = hr.parentNode, nextNode;\n                while (!domUtils.isBody(pN)) {\n                    domUtils.breakParent(hr, pN);\n                    nextNode = hr.nextSibling;\n                    if (nextNode && domUtils.isEmptyBlock(nextNode)) {\n                        domUtils.remove(nextNode);\n                    }\n                    pN = hr.parentNode;\n                }\n                nextNode = hr.nextSibling;\n                var pre = hr.previousSibling;\n                if(isHr(pre)){\n                    domUtils.remove(pre);\n                }else{\n                    pre && fillNode(pre);\n                }\n\n                if(!nextNode){\n                    var p = me.document.createElement('p');\n\n                    hr.parentNode.appendChild(p);\n                    domUtils.fillNode(me.document,p);\n                    range.setStart(p,0).collapse(true);\n                }else{\n                    if(isHr(nextNode)){\n                        domUtils.remove(nextNode);\n                    }else{\n                        fillNode(nextNode);\n                    }\n                    range.setEndAfter(hr).collapse(false);\n                }\n\n                range.select(true);\n\n            }\n\n        }\n    };\n};\n\n// plugins/wordimage.js\n///import core\n///commands 本地图片引导上传\n///commandsName  WordImage\n///commandsTitle  本地图片引导上传\n///commandsDialog  dialogs\\wordimage\n\nUE.plugin.register('wordimage',function(){\n    var me = this,\n        images = [];\n    return {\n        commands : {\n            'wordimage':{\n                execCommand:function () {\n                    var images = domUtils.getElementsByTagName(me.body, \"img\");\n                    var urlList = [];\n                    for (var i = 0, ci; ci = images[i++];) {\n                        var url = ci.getAttribute(\"word_img\");\n                        url && urlList.push(url);\n                    }\n                    return urlList;\n                },\n                queryCommandState:function () {\n                    images = domUtils.getElementsByTagName(me.body, \"img\");\n                    for (var i = 0, ci; ci = images[i++];) {\n                        if (ci.getAttribute(\"word_img\")) {\n                            return 1;\n                        }\n                    }\n                    return -1;\n                },\n                notNeedUndo:true\n            }\n        },\n        inputRule : function (root) {\n            utils.each(root.getNodesByTagName('img'), function (img) {\n                var attrs = img.attrs,\n                    flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43,\n                    opt = me.options,\n                    src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif';\n                if (attrs['src'] && /^(?:(file:\\/+))/.test(attrs['src'])) {\n                    img.setAttr({\n                        width:attrs.width,\n                        height:attrs.height,\n                        alt:attrs.alt,\n                        word_img: attrs.src,\n                        src:src,\n                        'style':'background:url(' + ( flag ? opt.themePath + opt.theme + '/images/word.gif' : opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd'\n                    })\n                }\n            })\n        }\n    }\n});\n\n// plugins/dragdrop.js\nUE.plugins['dragdrop'] = function (){\n\n    var me = this;\n    me.ready(function(){\n        domUtils.on(this.body,'dragend',function(){\n            var rng = me.selection.getRange();\n            var node = rng.getClosedNode()||me.selection.getStart();\n\n            if(node && node.tagName == 'IMG'){\n\n                var pre = node.previousSibling,next;\n                while(next = node.nextSibling){\n                    if(next.nodeType == 1 && next.tagName == 'SPAN' && !next.firstChild){\n                        domUtils.remove(next)\n                    }else{\n                        break;\n                    }\n                }\n\n\n                if((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre) || !pre) && (!next || next && !domUtils.isEmptyBlock(next))){\n                    if(pre && pre.tagName == 'P' && !domUtils.isEmptyBlock(pre)){\n                        pre.appendChild(node);\n                        domUtils.moveChild(next,pre);\n                        domUtils.remove(next);\n                    }else  if(next && next.tagName == 'P' && !domUtils.isEmptyBlock(next)){\n                        next.insertBefore(node,next.firstChild);\n                    }\n\n                    if(pre && pre.tagName == 'P' && domUtils.isEmptyBlock(pre)){\n                        domUtils.remove(pre)\n                    }\n                    if(next && next.tagName == 'P' && domUtils.isEmptyBlock(next)){\n                        domUtils.remove(next)\n                    }\n                    rng.selectNode(node).select();\n                    me.fireEvent('saveScene');\n\n                }\n\n            }\n\n        })\n    });\n    me.addListener('keyup', function(type, evt) {\n        var keyCode = evt.keyCode || evt.which;\n        if (keyCode == 13) {\n            var rng = me.selection.getRange(),node;\n            if(node = domUtils.findParentByTagName(rng.startContainer,'p',true)){\n                if(domUtils.getComputedStyle(node,'text-align') == 'center'){\n                    domUtils.removeStyle(node,'text-align')\n                }\n            }\n        }\n    })\n};\n\n\n// plugins/undo.js\n/**\n * undo redo\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 撤销上一次执行的命令\n * @command undo\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'undo' );\n * ```\n */\n\n/**\n * 重做上一次执行的命令\n * @command redo\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'redo' );\n * ```\n */\n\nUE.plugins['undo'] = function () {\n    var saveSceneTimer;\n    var me = this,\n        maxUndoCount = me.options.maxUndoCount || 20,\n        maxInputCount = me.options.maxInputCount || 20,\n        fillchar = new RegExp(domUtils.fillChar + '|<\\/hr>', 'gi');// ie会产生多余的</hr>\n    var noNeedFillCharTags = {\n        ol:1,ul:1,table:1,tbody:1,tr:1,body:1\n    };\n    var orgState = me.options.autoClearEmptyNode;\n    function compareAddr(indexA, indexB) {\n        if (indexA.length != indexB.length)\n            return 0;\n        for (var i = 0, l = indexA.length; i < l; i++) {\n            if (indexA[i] != indexB[i])\n                return 0\n        }\n        return 1;\n    }\n\n    function compareRangeAddress(rngAddrA, rngAddrB) {\n        if (rngAddrA.collapsed != rngAddrB.collapsed) {\n            return 0;\n        }\n        if (!compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)) {\n            return 0;\n        }\n        return 1;\n    }\n\n    function UndoManager() {\n        this.list = [];\n        this.index = 0;\n        this.hasUndo = false;\n        this.hasRedo = false;\n        this.undo = function () {\n            if (this.hasUndo) {\n                if (!this.list[this.index - 1] && this.list.length == 1) {\n                    this.reset();\n                    return;\n                }\n                while (this.list[this.index].content == this.list[this.index - 1].content) {\n                    this.index--;\n                    if (this.index == 0) {\n                        return this.restore(0);\n                    }\n                }\n                this.restore(--this.index);\n            }\n        };\n        this.redo = function () {\n            if (this.hasRedo) {\n                while (this.list[this.index].content == this.list[this.index + 1].content) {\n                    this.index++;\n                    if (this.index == this.list.length - 1) {\n                        return this.restore(this.index);\n                    }\n                }\n                this.restore(++this.index);\n            }\n        };\n\n        this.restore = function () {\n            var me = this.editor;\n            var scene = this.list[this.index];\n            var root = UE.htmlparser(scene.content.replace(fillchar, ''));\n            me.options.autoClearEmptyNode = false;\n            me.filterInputRule(root);\n            me.options.autoClearEmptyNode = orgState;\n            //trace:873\n            //去掉展位符\n            me.document.body.innerHTML = root.toHtml();\n            me.fireEvent('afterscencerestore');\n            //处理undo后空格不展位的问题\n            if (browser.ie) {\n                utils.each(domUtils.getElementsByTagName(me.document,'td th caption p'),function(node){\n                    if(domUtils.isEmptyNode(node)){\n                        domUtils.fillNode(me.document, node);\n                    }\n                })\n            }\n\n            try{\n                var rng = new dom.Range(me.document).moveToAddress(scene.address);\n                rng.select(noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]);\n            }catch(e){}\n\n            this.update();\n            this.clearKey();\n            //不能把自己reset了\n            me.fireEvent('reset', true);\n        };\n\n        this.getScene = function () {\n            var me = this.editor;\n            var rng = me.selection.getRange(),\n                rngAddress = rng.createAddress(false,true);\n            me.fireEvent('beforegetscene');\n            var root = UE.htmlparser(me.body.innerHTML);\n            me.options.autoClearEmptyNode = false;\n            me.filterOutputRule(root);\n            me.options.autoClearEmptyNode = orgState;\n            var cont = root.toHtml();\n            //trace:3461\n            //这个会引起回退时导致空格丢失的情况\n//            browser.ie && (cont = cont.replace(/>&nbsp;</g, '><').replace(/\\s*</g, '<').replace(/>\\s*/g, '>'));\n            me.fireEvent('aftergetscene');\n\n            return {\n                address:rngAddress,\n                content:cont\n            }\n        };\n        this.save = function (notCompareRange,notSetCursor) {\n            clearTimeout(saveSceneTimer);\n            var currentScene = this.getScene(notSetCursor),\n                lastScene = this.list[this.index];\n\n            if(lastScene && lastScene.content != currentScene.content){\n                me.trigger('contentchange')\n            }\n            //内容相同位置相同不存\n            if (lastScene && lastScene.content == currentScene.content &&\n                ( notCompareRange ? 1 : compareRangeAddress(lastScene.address, currentScene.address) )\n                ) {\n                return;\n            }\n            this.list = this.list.slice(0, this.index + 1);\n            this.list.push(currentScene);\n            //如果大于最大数量了，就把最前的剔除\n            if (this.list.length > maxUndoCount) {\n                this.list.shift();\n            }\n            this.index = this.list.length - 1;\n            this.clearKey();\n            //跟新undo/redo状态\n            this.update();\n\n        };\n        this.update = function () {\n            this.hasRedo = !!this.list[this.index + 1];\n            this.hasUndo = !!this.list[this.index - 1];\n        };\n        this.reset = function () {\n            this.list = [];\n            this.index = 0;\n            this.hasUndo = false;\n            this.hasRedo = false;\n            this.clearKey();\n        };\n        this.clearKey = function () {\n            keycont = 0;\n            lastKeyCode = null;\n        };\n    }\n\n    me.undoManger = new UndoManager();\n    me.undoManger.editor = me;\n    function saveScene() {\n        this.undoManger.save();\n    }\n\n    me.addListener('saveScene', function () {\n        var args = Array.prototype.splice.call(arguments,1);\n        this.undoManger.save.apply(this.undoManger,args);\n    });\n\n//    me.addListener('beforeexeccommand', saveScene);\n//    me.addListener('afterexeccommand', saveScene);\n\n    me.addListener('reset', function (type, exclude) {\n        if (!exclude) {\n            this.undoManger.reset();\n        }\n    });\n    me.commands['redo'] = me.commands['undo'] = {\n        execCommand:function (cmdName) {\n            this.undoManger[cmdName]();\n        },\n        queryCommandState:function (cmdName) {\n            return this.undoManger['has' + (cmdName.toLowerCase() == 'undo' ? 'Undo' : 'Redo')] ? 0 : -1;\n        },\n        notNeedUndo:1\n    };\n\n    var keys = {\n            //  /*Backspace*/ 8:1, /*Delete*/ 46:1,\n            /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1,\n            37:1, 38:1, 39:1, 40:1\n\n        },\n        keycont = 0,\n        lastKeyCode;\n    //输入法状态下不计算字符数\n    var inputType = false;\n    me.addListener('ready', function () {\n        domUtils.on(this.body, 'compositionstart', function () {\n            inputType = true;\n        });\n        domUtils.on(this.body, 'compositionend', function () {\n            inputType = false;\n        })\n    });\n    //快捷键\n    me.addshortcutkey({\n        \"Undo\":\"ctrl+90\", //undo\n        \"Redo\":\"ctrl+89\" //redo\n\n    });\n    var isCollapsed = true;\n    me.addListener('keydown', function (type, evt) {\n\n        var me = this;\n        var keyCode = evt.keyCode || evt.which;\n        if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) {\n            if (inputType)\n                return;\n\n            if(!me.selection.getRange().collapsed){\n                me.undoManger.save(false,true);\n                isCollapsed = false;\n                return;\n            }\n            if (me.undoManger.list.length == 0) {\n                me.undoManger.save(true);\n            }\n            clearTimeout(saveSceneTimer);\n            function save(cont){\n                cont.undoManger.save(false,true);\n                cont.fireEvent('selectionchange');\n            }\n            saveSceneTimer = setTimeout(function(){\n                if(inputType){\n                    var interalTimer = setInterval(function(){\n                        if(!inputType){\n                            save(me);\n                            clearInterval(interalTimer)\n                        }\n                    },300)\n                    return;\n                }\n                save(me);\n            },200);\n\n            lastKeyCode = keyCode;\n            keycont++;\n            if (keycont >= maxInputCount ) {\n                save(me)\n            }\n        }\n    });\n    me.addListener('keyup', function (type, evt) {\n        var keyCode = evt.keyCode || evt.which;\n        if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) {\n            if (inputType)\n                return;\n            if(!isCollapsed){\n                this.undoManger.save(false,true);\n                isCollapsed = true;\n            }\n        }\n    });\n    //扩展实例，添加关闭和开启命令undo\n    me.stopCmdUndo = function(){\n        me.__hasEnterExecCommand = true;\n    };\n    me.startCmdUndo = function(){\n        me.__hasEnterExecCommand = false;\n    }\n};\n\n\n// plugins/copy.js\nUE.plugin.register('copy', function () {\n\n    var me = this;\n\n    function initZeroClipboard() {\n\n        ZeroClipboard.config({\n            debug: false,\n            swfPath: me.options.UEDITOR_HOME_URL + 'third-party/zeroclipboard/ZeroClipboard.swf'\n        });\n\n        var client = me.zeroclipboard = new ZeroClipboard();\n\n        // 复制内容\n        client.on('copy', function (e) {\n            var client = e.client,\n                rng = me.selection.getRange(),\n                div = document.createElement('div');\n\n            div.appendChild(rng.cloneContents());\n            client.setText(div.innerText || div.textContent);\n            client.setHtml(div.innerHTML);\n            rng.select();\n        });\n        // hover事件传递到target\n        client.on('mouseover mouseout', function (e) {\n            var target = e.target;\n            if (e.type == 'mouseover') {\n                domUtils.addClass(target, 'edui-state-hover');\n            } else if (e.type == 'mouseout') {\n                domUtils.removeClasses(target, 'edui-state-hover');\n            }\n        });\n        // flash加载不成功\n        client.on('wrongflash noflash', function () {\n            ZeroClipboard.destroy();\n        });\n    }\n\n    return {\n        bindEvents: {\n            'ready': function () {\n                if (!browser.ie) {\n                    if (window.ZeroClipboard) {\n                        initZeroClipboard();\n                    } else {\n                        utils.loadFile(document, {\n                            src: me.options.UEDITOR_HOME_URL + \"third-party/zeroclipboard/ZeroClipboard.js\",\n                            tag: \"script\",\n                            type: \"text/javascript\",\n                            defer: \"defer\"\n                        }, function () {\n                            initZeroClipboard();\n                        });\n                    }\n                }\n            }\n        },\n        commands: {\n            'copy': {\n                execCommand: function (cmd) {\n                    if (!me.document.execCommand('copy')) {\n                        alert(me.getLang('copymsg'));\n                    }\n                }\n            }\n        }\n    }\n});\n\n\n// plugins/paste.js\n///import core\n///import plugins/inserthtml.js\n///import plugins/undo.js\n///import plugins/serialize.js\n///commands 粘贴\n///commandsName  PastePlain\n///commandsTitle  纯文本粘贴模式\n/**\n * @description 粘贴\n * @author zhanyi\n */\nUE.plugins['paste'] = function () {\n    function getClipboardData(callback) {\n        var doc = this.document;\n        if (doc.getElementById('baidu_pastebin')) {\n            return;\n        }\n        var range = this.selection.getRange(),\n            bk = range.createBookmark(),\n        //创建剪贴的容器div\n            pastebin = doc.createElement('div');\n        pastebin.id = 'baidu_pastebin';\n        // Safari 要求div必须有内容，才能粘贴内容进来\n        browser.webkit && pastebin.appendChild(doc.createTextNode(domUtils.fillChar + domUtils.fillChar));\n        doc.body.appendChild(pastebin);\n        //trace:717 隐藏的span不能得到top\n        //bk.start.innerHTML = '&nbsp;';\n        bk.start.style.display = '';\n        pastebin.style.cssText = \"position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:\" +\n            //要在现在光标平行的位置加入，否则会出现跳动的问题\n            domUtils.getXY(bk.start).y + 'px';\n\n        range.selectNodeContents(pastebin).select(true);\n\n        setTimeout(function () {\n            if (browser.webkit) {\n                for (var i = 0, pastebins = doc.querySelectorAll('#baidu_pastebin'), pi; pi = pastebins[i++];) {\n                    if (domUtils.isEmptyNode(pi)) {\n                        domUtils.remove(pi);\n                    } else {\n                        pastebin = pi;\n                        break;\n                    }\n                }\n            }\n            try {\n                pastebin.parentNode.removeChild(pastebin);\n            } catch (e) {\n            }\n            range.moveToBookmark(bk).select(true);\n            callback(pastebin);\n        }, 0);\n    }\n\n    var me = this;\n\n    me.setOpt({\n        retainOnlyLabelPasted : false\n    });\n\n    var txtContent, htmlContent, address;\n\n    function getPureHtml(html){\n        return html.replace(/<(\\/?)([\\w\\-]+)([^>]*)>/gi, function (a, b, tagName, attrs) {\n            tagName = tagName.toLowerCase();\n            if ({img: 1}[tagName]) {\n                return a;\n            }\n            attrs = attrs.replace(/([\\w\\-]*?)\\s*=\\s*((\"([^\"]*)\")|('([^']*)')|([^\\s>]+))/gi, function (str, atr, val) {\n                if ({\n                    'src': 1,\n                    'href': 1,\n                    'name': 1\n                }[atr.toLowerCase()]) {\n                    return atr + '=' + val + ' '\n                }\n                return ''\n            });\n            if ({\n                'span': 1,\n                'div': 1\n            }[tagName]) {\n                return ''\n            } else {\n\n                return '<' + b + tagName + ' ' + utils.trim(attrs) + '>'\n            }\n\n        });\n    }\n    function filter(div) {\n        var html;\n        if (div.firstChild) {\n            //去掉cut中添加的边界值\n            var nodes = domUtils.getElementsByTagName(div, 'span');\n            for (var i = 0, ni; ni = nodes[i++];) {\n                if (ni.id == '_baidu_cut_start' || ni.id == '_baidu_cut_end') {\n                    domUtils.remove(ni);\n                }\n            }\n\n            if (browser.webkit) {\n\n                var brs = div.querySelectorAll('div br');\n                for (var i = 0, bi; bi = brs[i++];) {\n                    var pN = bi.parentNode;\n                    if (pN.tagName == 'DIV' && pN.childNodes.length == 1) {\n                        pN.innerHTML = '<p><br/></p>';\n                        domUtils.remove(pN);\n                    }\n                }\n                var divs = div.querySelectorAll('#baidu_pastebin');\n                for (var i = 0, di; di = divs[i++];) {\n                    var tmpP = me.document.createElement('p');\n                    di.parentNode.insertBefore(tmpP, di);\n                    while (di.firstChild) {\n                        tmpP.appendChild(di.firstChild);\n                    }\n                    domUtils.remove(di);\n                }\n\n                var metas = div.querySelectorAll('meta');\n                for (var i = 0, ci; ci = metas[i++];) {\n                    domUtils.remove(ci);\n                }\n\n                var brs = div.querySelectorAll('br');\n                for (i = 0; ci = brs[i++];) {\n                    if (/^apple-/i.test(ci.className)) {\n                        domUtils.remove(ci);\n                    }\n                }\n            }\n            if (browser.gecko) {\n                var dirtyNodes = div.querySelectorAll('[_moz_dirty]');\n                for (i = 0; ci = dirtyNodes[i++];) {\n                    ci.removeAttribute('_moz_dirty');\n                }\n            }\n            if (!browser.ie) {\n                var spans = div.querySelectorAll('span.Apple-style-span');\n                for (var i = 0, ci; ci = spans[i++];) {\n                    domUtils.remove(ci, true);\n                }\n            }\n\n            //ie下使用innerHTML会产生多余的\\r\\n字符，也会产生&nbsp;这里过滤掉\n            html = div.innerHTML;//.replace(/>(?:(\\s|&nbsp;)*?)</g,'><');\n\n            //过滤word粘贴过来的冗余属性\n            html = UE.filterWord(html);\n            //取消了忽略空白的第二个参数，粘贴过来的有些是有空白的，会被套上相关的标签\n            var root = UE.htmlparser(html);\n            //如果给了过滤规则就先进行过滤\n            if (me.options.filterRules) {\n                UE.filterNode(root, me.options.filterRules);\n            }\n            //执行默认的处理\n            me.filterInputRule(root);\n            //针对chrome的处理\n            if (browser.webkit) {\n                var br = root.lastChild();\n                if (br && br.type == 'element' && br.tagName == 'br') {\n                    root.removeChild(br)\n                }\n                utils.each(me.body.querySelectorAll('div'), function (node) {\n                    if (domUtils.isEmptyBlock(node)) {\n                        domUtils.remove(node,true)\n                    }\n                })\n            }\n            html = {'html': root.toHtml()};\n            me.fireEvent('beforepaste', html, root);\n            //抢了默认的粘贴，那后边的内容就不执行了，比如表格粘贴\n            if(!html.html){\n                return;\n            }\n            root = UE.htmlparser(html.html,true);\n            //如果开启了纯文本模式\n            if (me.queryCommandState('pasteplain') === 1) {\n                me.execCommand('insertHtml', UE.filterNode(root, me.options.filterTxtRules).toHtml(), true);\n            } else {\n                //文本模式\n                UE.filterNode(root, me.options.filterTxtRules);\n                txtContent = root.toHtml();\n                //完全模式\n                htmlContent = html.html;\n\n                address = me.selection.getRange().createAddress(true);\n                me.execCommand('insertHtml', me.getOpt('retainOnlyLabelPasted') === true ?  getPureHtml(htmlContent) : htmlContent, true);\n            }\n            me.fireEvent(\"afterpaste\", html);\n        }\n    }\n\n    me.addListener('pasteTransfer', function (cmd, plainType) {\n\n        if (address && txtContent && htmlContent && txtContent != htmlContent) {\n            var range = me.selection.getRange();\n            range.moveToAddress(address, true);\n\n            if (!range.collapsed) {\n\n                while (!domUtils.isBody(range.startContainer)\n                    ) {\n                    var start = range.startContainer;\n                    if(start.nodeType == 1){\n                        start = start.childNodes[range.startOffset];\n                        if(!start){\n                            range.setStartBefore(range.startContainer);\n                            continue;\n                        }\n                        var pre = start.previousSibling;\n\n                        if(pre && pre.nodeType == 3 && new RegExp('^[\\n\\r\\t '+domUtils.fillChar+']*$').test(pre.nodeValue)){\n                            range.setStartBefore(pre)\n                        }\n                    }\n                    if(range.startOffset == 0){\n                        range.setStartBefore(range.startContainer);\n                    }else{\n                        break;\n                    }\n\n                }\n                while (!domUtils.isBody(range.endContainer)\n                    ) {\n                    var end = range.endContainer;\n                    if(end.nodeType == 1){\n                        end = end.childNodes[range.endOffset];\n                        if(!end){\n                            range.setEndAfter(range.endContainer);\n                            continue;\n                        }\n                        var next = end.nextSibling;\n                        if(next && next.nodeType == 3 && new RegExp('^[\\n\\r\\t'+domUtils.fillChar+']*$').test(next.nodeValue)){\n                            range.setEndAfter(next)\n                        }\n                    }\n                    if(range.endOffset == range.endContainer[range.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length){\n                        range.setEndAfter(range.endContainer);\n                    }else{\n                        break;\n                    }\n\n                }\n\n            }\n\n            range.deleteContents();\n            range.select(true);\n            me.__hasEnterExecCommand = true;\n            var html = htmlContent;\n            if (plainType === 2 ) {\n                html = getPureHtml(html);\n            } else if (plainType) {\n                html = txtContent;\n            }\n            me.execCommand('inserthtml', html, true);\n            me.__hasEnterExecCommand = false;\n            var rng = me.selection.getRange();\n            while (!domUtils.isBody(rng.startContainer) && !rng.startOffset &&\n                rng.startContainer[rng.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length\n                ) {\n                rng.setStartBefore(rng.startContainer);\n            }\n            var tmpAddress = rng.createAddress(true);\n            address.endAddress = tmpAddress.startAddress;\n        }\n    });\n\n    me.addListener('ready', function () {\n        domUtils.on(me.body, 'cut', function () {\n            var range = me.selection.getRange();\n            if (!range.collapsed && me.undoManger) {\n                me.undoManger.save();\n            }\n        });\n\n        //ie下beforepaste在点击右键时也会触发，所以用监控键盘才处理\n        domUtils.on(me.body, browser.ie || browser.opera ? 'keydown' : 'paste', function (e) {\n            if ((browser.ie || browser.opera) && ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')) {\n                return;\n            }\n            getClipboardData.call(me, function (div) {\n                filter(div);\n            });\n        });\n\n    });\n\n    me.commands['paste'] = {\n        execCommand: function (cmd) {\n            if (browser.ie) {\n                getClipboardData.call(me, function (div) {\n                    filter(div);\n                });\n                me.document.execCommand('paste');\n            } else {\n                alert(me.getLang('pastemsg'));\n            }\n        }\n    }\n};\n\n\n\n// plugins/puretxtpaste.js\n/**\n * 纯文本粘贴插件\n * @file\n * @since 1.2.6.1\n */\n\nUE.plugins['pasteplain'] = function(){\n    var me = this;\n    me.setOpt({\n        'pasteplain':false,\n        'filterTxtRules' : function(){\n            function transP(node){\n                node.tagName = 'p';\n                node.setStyle();\n            }\n            function removeNode(node){\n                node.parentNode.removeChild(node,true)\n            }\n            return {\n                //直接删除及其字节点内容\n                '-' : 'script style object iframe embed input select',\n                'p': {$:{}},\n                'br':{$:{}},\n                div: function (node) {\n                    var tmpNode, p = UE.uNode.createElement('p');\n                    while (tmpNode = node.firstChild()) {\n                        if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) {\n                            p.appendChild(tmpNode);\n                        } else {\n                            if (p.firstChild()) {\n                                node.parentNode.insertBefore(p, node);\n                                p = UE.uNode.createElement('p');\n                            } else {\n                                node.parentNode.insertBefore(tmpNode, node);\n                            }\n                        }\n                    }\n                    if (p.firstChild()) {\n                        node.parentNode.insertBefore(p, node);\n                    }\n                    node.parentNode.removeChild(node);\n                },\n                ol: removeNode,\n                ul: removeNode,\n                dl:removeNode,\n                dt:removeNode,\n                dd:removeNode,\n                'li':removeNode,\n                'caption':transP,\n                'th':transP,\n                'tr':transP,\n                'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP,\n                'td':function(node){\n                        //没有内容的td直接删掉\n                        var txt = !!node.innerText();\n                        if(txt){\n                         node.parentNode.insertAfter(UE.uNode.createText(' &nbsp; &nbsp;'),node);\n                    }\n                    node.parentNode.removeChild(node,node.innerText())\n                }\n            }\n        }()\n    });\n    //暂时这里支持一下老版本的属性\n    var pasteplain = me.options.pasteplain;\n\n    /**\n     * 启用或取消纯文本粘贴模式\n     * @command pasteplain\n     * @method execCommand\n     * @param { String } cmd 命令字符串\n     * @example\n     * ```javascript\n     * editor.queryCommandState( 'pasteplain' );\n     * ```\n     */\n\n    /**\n     * 查询当前是否处于纯文本粘贴模式\n     * @command pasteplain\n     * @method queryCommandState\n     * @param { String } cmd 命令字符串\n     * @return { int } 如果处于纯文本模式，返回1，否则，返回0\n     * @example\n     * ```javascript\n     * editor.queryCommandState( 'pasteplain' );\n     * ```\n     */\n    me.commands['pasteplain'] = {\n        queryCommandState: function (){\n            return pasteplain ? 1 : 0;\n        },\n        execCommand: function (){\n            pasteplain = !pasteplain|0;\n        },\n        notNeedUndo : 1\n    };\n};\n\n// plugins/list.js\n/**\n * 有序列表,无序列表插件\n * @file\n * @since 1.2.6.1\n */\n\nUE.plugins['list'] = function () {\n    var me = this,\n        notExchange = {\n            'TD':1,\n            'PRE':1,\n            'BLOCKQUOTE':1\n        };\n    var customStyle = {\n        'cn' : 'cn-1-',\n        'cn1' : 'cn-2-',\n        'cn2' : 'cn-3-',\n        'num':  'num-1-',\n        'num1' : 'num-2-',\n        'num2' : 'num-3-',\n        'dash'  : 'dash',\n        'dot':'dot'\n    };\n\n    me.setOpt( {\n        'autoTransWordToList':false,\n        'insertorderedlist':{\n            'num':'',\n            'num1':'',\n            'num2':'',\n            'cn':'',\n            'cn1':'',\n            'cn2':'',\n            'decimal':'',\n            'lower-alpha':'',\n            'lower-roman':'',\n            'upper-alpha':'',\n            'upper-roman':''\n        },\n        'insertunorderedlist':{\n            'circle':'',\n            'disc':'',\n            'square':'',\n            'dash' : '',\n            'dot':''\n        },\n        listDefaultPaddingLeft : '30',\n        listiconpath : 'http://bs.baidu.com/listicon/',\n        maxListLevel : -1,//-1不限制\n        disablePInList:false\n    } );\n    function listToArray(list){\n        var arr = [];\n        for(var p in list){\n            arr.push(p)\n        }\n        return arr;\n    }\n    var listStyle = {\n        'OL':listToArray(me.options.insertorderedlist),\n        'UL':listToArray(me.options.insertunorderedlist)\n    };\n    var liiconpath = me.options.listiconpath;\n\n    //根据用户配置，调整customStyle\n    for(var s in customStyle){\n        if(!me.options.insertorderedlist.hasOwnProperty(s) && !me.options.insertunorderedlist.hasOwnProperty(s)){\n            delete customStyle[s];\n        }\n    }\n\n    me.ready(function () {\n        var customCss = [];\n        for(var p in customStyle){\n            if(p == 'dash' || p == 'dot'){\n                customCss.push('li.list-' + customStyle[p] + '{background-image:url(' + liiconpath +customStyle[p]+'.gif)}');\n                customCss.push('ul.custom_'+p+'{list-style:none;}ul.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}');\n            }else{\n                for(var i= 0;i<99;i++){\n                    customCss.push('li.list-' + customStyle[p] + i + '{background-image:url(' + liiconpath + 'list-'+customStyle[p] + i + '.gif)}')\n                }\n                customCss.push('ol.custom_'+p+'{list-style:none;}ol.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}');\n            }\n            switch(p){\n                case 'cn':\n                    customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}');\n                    customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}');\n                    customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}');\n                    break;\n                case 'cn1':\n                    customCss.push('li.list-'+p+'-paddingleft-1{padding-left:30px}');\n                    customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}');\n                    customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}');\n                    break;\n                case 'cn2':\n                    customCss.push('li.list-'+p+'-paddingleft-1{padding-left:40px}');\n                    customCss.push('li.list-'+p+'-paddingleft-2{padding-left:55px}');\n                    customCss.push('li.list-'+p+'-paddingleft-3{padding-left:68px}');\n                    break;\n                case 'num':\n                case 'num1':\n                    customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}');\n                    break;\n                case 'num2':\n                    customCss.push('li.list-'+p+'-paddingleft-1{padding-left:35px}');\n                    customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}');\n                    break;\n                case 'dash':\n                    customCss.push('li.list-'+p+'-paddingleft{padding-left:35px}');\n                    break;\n                case 'dot':\n                    customCss.push('li.list-'+p+'-paddingleft{padding-left:20px}');\n            }\n        }\n        customCss.push('.list-paddingleft-1{padding-left:0}');\n        customCss.push('.list-paddingleft-2{padding-left:'+me.options.listDefaultPaddingLeft+'px}');\n        customCss.push('.list-paddingleft-3{padding-left:'+me.options.listDefaultPaddingLeft*2+'px}');\n        //如果不给宽度会在自定应样式里出现滚动条\n        utils.cssRule('list', 'ol,ul{margin:0;pading:0;'+(browser.ie ? '' : 'width:95%')+'}li{clear:both;}'+customCss.join('\\n'), me.document);\n    });\n    //单独处理剪切的问题\n    me.ready(function(){\n        domUtils.on(me.body,'cut',function(){\n            setTimeout(function(){\n                var rng = me.selection.getRange(),li;\n                //trace:3416\n                if(!rng.collapsed){\n                    if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){\n                        if(!li.nextSibling && domUtils.isEmptyBlock(li)){\n                            var pn = li.parentNode,node;\n                            if(node = pn.previousSibling){\n                                domUtils.remove(pn);\n                                rng.setStartAtLast(node).collapse(true);\n                                rng.select(true);\n                            }else if(node = pn.nextSibling){\n                                domUtils.remove(pn);\n                                rng.setStartAtFirst(node).collapse(true);\n                                rng.select(true);\n                            }else{\n                                var tmpNode = me.document.createElement('p');\n                                domUtils.fillNode(me.document,tmpNode);\n                                pn.parentNode.insertBefore(tmpNode,pn);\n                                domUtils.remove(pn);\n                                rng.setStart(tmpNode,0).collapse(true);\n                                rng.select(true);\n                            }\n                        }\n                    }\n                }\n\n            })\n        })\n    });\n\n    function getStyle(node){\n        var cls = node.className;\n        if(domUtils.hasClass(node,/custom_/)){\n            return cls.match(/custom_(\\w+)/)[1]\n        }\n        return domUtils.getStyle(node, 'list-style-type')\n\n    }\n\n    me.addListener('beforepaste',function(type,html){\n        var me = this,\n            rng = me.selection.getRange(),li;\n        var root = UE.htmlparser(html.html,true);\n        if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){\n            var list = li.parentNode,tagName = list.tagName == 'OL' ? 'ul':'ol';\n            utils.each(root.getNodesByTagName(tagName),function(n){\n                n.tagName = list.tagName;\n                n.setAttr();\n                if(n.parentNode === root){\n                    type = getStyle(list) || (list.tagName == 'OL' ? 'decimal' : 'disc')\n                }else{\n                    var className = n.parentNode.getAttr('class');\n                    if(className && /custom_/.test(className)){\n                        type = className.match(/custom_(\\w+)/)[1]\n                    }else{\n                        type = n.parentNode.getStyle('list-style-type');\n                    }\n                    if(!type){\n                        type = list.tagName == 'OL' ? 'decimal' : 'disc';\n                    }\n                }\n                var index = utils.indexOf(listStyle[list.tagName], type);\n                if(n.parentNode !== root)\n                    index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1;\n                var currentStyle = listStyle[list.tagName][index];\n                if(customStyle[currentStyle]){\n                    n.setAttr('class', 'custom_' + currentStyle)\n\n                }else{\n                    n.setStyle('list-style-type',currentStyle)\n                }\n            })\n\n        }\n\n        html.html = root.toHtml();\n    });\n    //导出时，去掉p标签\n    me.getOpt('disablePInList') === true && me.addOutputRule(function(root){\n        utils.each(root.getNodesByTagName('li'),function(li){\n            var newChildrens = [],index=0;\n            utils.each(li.children,function(n){\n                if(n.tagName == 'p'){\n                    var tmpNode;\n                    while(tmpNode = n.children.pop()) {\n                        newChildrens.splice(index,0,tmpNode);\n                        tmpNode.parentNode = li;\n                        lastNode = tmpNode;\n                    }\n                    tmpNode = newChildrens[newChildrens.length-1];\n                    if(!tmpNode || tmpNode.type != 'element' || tmpNode.tagName != 'br'){\n                        var br = UE.uNode.createElement('br');\n                        br.parentNode = li;\n                        newChildrens.push(br);\n                    }\n\n                    index = newChildrens.length;\n                }\n            });\n            if(newChildrens.length){\n                li.children = newChildrens;\n            }\n        });\n    });\n    //进入编辑器的li要套p标签\n    me.addInputRule(function(root){\n        utils.each(root.getNodesByTagName('li'),function(li){\n            var tmpP = UE.uNode.createElement('p');\n            for(var i= 0,ci;ci=li.children[i];){\n                if(ci.type == 'text' || dtd.p[ci.tagName]){\n                    tmpP.appendChild(ci);\n                }else{\n                    if(tmpP.firstChild()){\n                        li.insertBefore(tmpP,ci);\n                        tmpP = UE.uNode.createElement('p');\n                        i = i + 2;\n                    }else{\n                        i++;\n                    }\n\n                }\n            }\n            if(tmpP.firstChild() && !tmpP.parentNode || !li.firstChild()){\n                li.appendChild(tmpP);\n            }\n            //trace:3357\n            //p不能为空\n            if (!tmpP.firstChild()) {\n                tmpP.innerHTML(browser.ie ? '&nbsp;' : '<br/>')\n            }\n            //去掉末尾的空白\n            var p = li.firstChild();\n            var lastChild = p.lastChild();\n            if(lastChild && lastChild.type == 'text' && /^\\s*$/.test(lastChild.data)){\n                p.removeChild(lastChild)\n            }\n        });\n        if(me.options.autoTransWordToList){\n            var orderlisttype = {\n                    'num1':/^\\d+\\)/,\n                    'decimal':/^\\d+\\./,\n                    'lower-alpha':/^[a-z]+\\)/,\n                    'upper-alpha':/^[A-Z]+\\./,\n                    'cn':/^[\\u4E00\\u4E8C\\u4E09\\u56DB\\u516d\\u4e94\\u4e03\\u516b\\u4e5d]+[\\u3001]/,\n                    'cn2':/^\\([\\u4E00\\u4E8C\\u4E09\\u56DB\\u516d\\u4e94\\u4e03\\u516b\\u4e5d]+\\)/\n                },\n                unorderlisttype = {\n                    'square':'n'\n                };\n            function checkListType(content,container){\n                var span = container.firstChild();\n                if(span &&  span.type == 'element' && span.tagName == 'span' && /Wingdings|Symbol/.test(span.getStyle('font-family'))){\n                    for(var p in unorderlisttype){\n                        if(unorderlisttype[p] == span.data){\n                            return p\n                        }\n                    }\n                    return 'disc'\n                }\n                for(var p in orderlisttype){\n                    if(orderlisttype[p].test(content)){\n                        return p;\n                    }\n                }\n\n            }\n            utils.each(root.getNodesByTagName('p'),function(node){\n                if(node.getAttr('class') != 'MsoListParagraph'){\n                    return\n                }\n\n                //word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视\n                node.setStyle('margin','');\n                node.setStyle('margin-left','');\n                node.setAttr('class','');\n\n                function appendLi(list,p,type){\n                    if(list.tagName == 'ol'){\n                        if(browser.ie){\n                            var first = p.firstChild();\n                            if(first.type =='element' && first.tagName == 'span' && orderlisttype[type].test(first.innerText())){\n                                p.removeChild(first);\n                            }\n                        }else{\n                            p.innerHTML(p.innerHTML().replace(orderlisttype[type],''));\n                        }\n                    }else{\n                        p.removeChild(p.firstChild())\n                    }\n\n                    var li = UE.uNode.createElement('li');\n                    li.appendChild(p);\n                    list.appendChild(li);\n                }\n                var tmp = node,type,cacheNode = node;\n\n                if(node.parentNode.tagName != 'li' && (type = checkListType(node.innerText(),node))){\n\n                    var list = UE.uNode.createElement(me.options.insertorderedlist.hasOwnProperty(type) ? 'ol' : 'ul');\n                    if(customStyle[type]){\n                        list.setAttr('class','custom_'+type)\n                    }else{\n                        list.setStyle('list-style-type',type)\n                    }\n                    while(node && node.parentNode.tagName != 'li' && checkListType(node.innerText(),node)){\n                        tmp = node.nextSibling();\n                        if(!tmp){\n                            node.parentNode.insertBefore(list,node)\n                        }\n                        appendLi(list,node,type);\n                        node = tmp;\n                    }\n                    if(!list.parentNode && node && node.parentNode){\n                        node.parentNode.insertBefore(list,node)\n                    }\n                }\n                var span = cacheNode.firstChild();\n                if(span && span.type == 'element' && span.tagName == 'span' && /^\\s*(&nbsp;)+\\s*$/.test(span.innerText())){\n                    span.parentNode.removeChild(span)\n                }\n            })\n        }\n\n    });\n\n    //调整索引标签\n    me.addListener('contentchange',function(){\n        adjustListStyle(me.document)\n    });\n\n    function adjustListStyle(doc,ignore){\n        utils.each(domUtils.getElementsByTagName(doc,'ol ul'),function(node){\n\n            if(!domUtils.inDoc(node,doc))\n                return;\n\n            var parent = node.parentNode;\n            if(parent.tagName == node.tagName){\n                var nodeStyleType = getStyle(node) || (node.tagName == 'OL' ? 'decimal' : 'disc'),\n                    parentStyleType = getStyle(parent) || (parent.tagName == 'OL' ? 'decimal' : 'disc');\n                if(nodeStyleType == parentStyleType){\n                    var styleIndex = utils.indexOf(listStyle[node.tagName], nodeStyleType);\n                    styleIndex = styleIndex + 1 == listStyle[node.tagName].length ? 0 : styleIndex + 1;\n                    setListStyle(node,listStyle[node.tagName][styleIndex])\n                }\n\n            }\n            var index = 0,type = 2;\n            if( domUtils.hasClass(node,/custom_/)){\n                if(!(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/))){\n                    type = 1;\n                }\n            }else{\n                if(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/)){\n                    type = 3;\n                }\n            }\n\n            var style = domUtils.getStyle(node, 'list-style-type');\n            style && (node.style.cssText = 'list-style-type:' + style);\n            node.className = utils.trim(node.className.replace(/list-paddingleft-\\w+/,'')) + ' list-paddingleft-' + type;\n            utils.each(domUtils.getElementsByTagName(node,'li'),function(li){\n                li.style.cssText && (li.style.cssText = '');\n                if(!li.firstChild){\n                    domUtils.remove(li);\n                    return;\n                }\n                if(li.parentNode !== node){\n                    return;\n                }\n                index++;\n                if(domUtils.hasClass(node,/custom_/) ){\n                    var paddingLeft = 1,currentStyle = getStyle(node);\n                    if(node.tagName == 'OL'){\n                        if(currentStyle){\n                            switch(currentStyle){\n                                case 'cn' :\n                                case 'cn1':\n                                case 'cn2':\n                                    if(index > 10 && (index % 10 == 0 || index > 10 && index < 20)){\n                                        paddingLeft = 2\n                                    }else if(index > 20){\n                                        paddingLeft = 3\n                                    }\n                                    break;\n                                case 'num2' :\n                                    if(index > 9){\n                                        paddingLeft = 2\n                                    }\n                            }\n                        }\n                        li.className = 'list-'+customStyle[currentStyle]+ index + ' ' + 'list-'+currentStyle+'-paddingleft-' + paddingLeft;\n                    }else{\n                        li.className = 'list-'+customStyle[currentStyle]  + ' ' + 'list-'+currentStyle+'-paddingleft';\n                    }\n                }else{\n                    li.className = li.className.replace(/list-[\\w\\-]+/gi,'');\n                }\n                var className = li.getAttribute('class');\n                if(className !== null && !className.replace(/\\s/g,'')){\n                    domUtils.removeAttributes(li,'class')\n                }\n            });\n            !ignore && adjustList(node,node.tagName.toLowerCase(),getStyle(node)||domUtils.getStyle(node, 'list-style-type'),true);\n        })\n    }\n    function adjustList(list, tag, style,ignoreEmpty) {\n        var nextList = list.nextSibling;\n        if (nextList && nextList.nodeType == 1 && nextList.tagName.toLowerCase() == tag && (getStyle(nextList) || domUtils.getStyle(nextList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) {\n            domUtils.moveChild(nextList, list);\n            if (nextList.childNodes.length == 0) {\n                domUtils.remove(nextList);\n            }\n        }\n        if(nextList && domUtils.isFillChar(nextList)){\n            domUtils.remove(nextList);\n        }\n        var preList = list.previousSibling;\n        if (preList && preList.nodeType == 1 && preList.tagName.toLowerCase() == tag && (getStyle(preList) || domUtils.getStyle(preList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) {\n            domUtils.moveChild(list, preList);\n        }\n        if(preList && domUtils.isFillChar(preList)){\n            domUtils.remove(preList);\n        }\n        !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list);\n        if(getStyle(list)){\n            adjustListStyle(list.ownerDocument,true)\n        }\n    }\n\n    function setListStyle(list,style){\n        if(customStyle[style]){\n            list.className = 'custom_' + style;\n        }\n        try{\n            domUtils.setStyle(list, 'list-style-type', style);\n        }catch(e){}\n    }\n    function clearEmptySibling(node) {\n        var tmpNode = node.previousSibling;\n        if (tmpNode && domUtils.isEmptyBlock(tmpNode)) {\n            domUtils.remove(tmpNode);\n        }\n        tmpNode = node.nextSibling;\n        if (tmpNode && domUtils.isEmptyBlock(tmpNode)) {\n            domUtils.remove(tmpNode);\n        }\n    }\n\n    me.addListener('keydown', function (type, evt) {\n        function preventAndSave() {\n            evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n            me.fireEvent('contentchange');\n            me.undoManger && me.undoManger.save();\n        }\n        function findList(node,filterFn){\n            while(node && !domUtils.isBody(node)){\n                if(filterFn(node)){\n                    return null\n                }\n                if(node.nodeType == 1 && /[ou]l/i.test(node.tagName)){\n                    return node;\n                }\n                node = node.parentNode;\n            }\n            return null;\n        }\n        var keyCode = evt.keyCode || evt.which;\n        if (keyCode == 13 && !evt.shiftKey) {//回车\n            var rng = me.selection.getRange(),\n                parent = domUtils.findParent(rng.startContainer,function(node){return domUtils.isBlockElm(node)},true),\n                li = domUtils.findParentByTagName(rng.startContainer,'li',true);\n            if(parent && parent.tagName != 'PRE' && !li){\n                var html = parent.innerHTML.replace(new RegExp(domUtils.fillChar, 'g'),'');\n                if(/^\\s*1\\s*\\.[^\\d]/.test(html)){\n                    parent.innerHTML = html.replace(/^\\s*1\\s*\\./,'');\n                    rng.setStartAtLast(parent).collapse(true).select();\n                    me.__hasEnterExecCommand = true;\n                    me.execCommand('insertorderedlist');\n                    me.__hasEnterExecCommand = false;\n                }\n            }\n            var range = me.selection.getRange(),\n                start = findList(range.startContainer,function (node) {\n                    return node.tagName == 'TABLE';\n                }),\n                end = range.collapsed ? start : findList(range.endContainer,function (node) {\n                    return node.tagName == 'TABLE';\n                });\n\n            if (start && end && start === end) {\n\n                if (!range.collapsed) {\n                    start = domUtils.findParentByTagName(range.startContainer, 'li', true);\n                    end = domUtils.findParentByTagName(range.endContainer, 'li', true);\n                    if (start && end && start === end) {\n                        range.deleteContents();\n                        li = domUtils.findParentByTagName(range.startContainer, 'li', true);\n                        if (li && domUtils.isEmptyBlock(li)) {\n\n                            pre = li.previousSibling;\n                            next = li.nextSibling;\n                            p = me.document.createElement('p');\n\n                            domUtils.fillNode(me.document, p);\n                            parentList = li.parentNode;\n                            if (pre && next) {\n                                range.setStart(next, 0).collapse(true).select(true);\n                                domUtils.remove(li);\n\n                            } else {\n                                if (!pre && !next || !pre) {\n\n                                    parentList.parentNode.insertBefore(p, parentList);\n\n\n                                } else {\n                                    li.parentNode.parentNode.insertBefore(p, parentList.nextSibling);\n                                }\n                                domUtils.remove(li);\n                                if (!parentList.firstChild) {\n                                    domUtils.remove(parentList);\n                                }\n                                range.setStart(p, 0).setCursor();\n\n\n                            }\n                            preventAndSave();\n                            return;\n\n                        }\n                    } else {\n                        var tmpRange = range.cloneRange(),\n                            bk = tmpRange.collapse(false).createBookmark();\n\n                        range.deleteContents();\n                        tmpRange.moveToBookmark(bk);\n                        var li = domUtils.findParentByTagName(tmpRange.startContainer, 'li', true);\n\n                        clearEmptySibling(li);\n                        tmpRange.select();\n                        preventAndSave();\n                        return;\n                    }\n                }\n\n\n                li = domUtils.findParentByTagName(range.startContainer, 'li', true);\n\n                if (li) {\n                    if (domUtils.isEmptyBlock(li)) {\n                        bk = range.createBookmark();\n                        var parentList = li.parentNode;\n                        if (li !== parentList.lastChild) {\n                            domUtils.breakParent(li, parentList);\n                            clearEmptySibling(li);\n                        } else {\n\n                            parentList.parentNode.insertBefore(li, parentList.nextSibling);\n                            if (domUtils.isEmptyNode(parentList)) {\n                                domUtils.remove(parentList);\n                            }\n                        }\n                        //嵌套不处理\n                        if (!dtd.$list[li.parentNode.tagName]) {\n\n                            if (!domUtils.isBlockElm(li.firstChild)) {\n                                p = me.document.createElement('p');\n                                li.parentNode.insertBefore(p, li);\n                                while (li.firstChild) {\n                                    p.appendChild(li.firstChild);\n                                }\n                                domUtils.remove(li);\n                            } else {\n                                domUtils.remove(li, true);\n                            }\n                        }\n                        range.moveToBookmark(bk).select();\n\n\n                    } else {\n                        var first = li.firstChild;\n                        if (!first || !domUtils.isBlockElm(first)) {\n                            var p = me.document.createElement('p');\n\n                            !li.firstChild && domUtils.fillNode(me.document, p);\n                            while (li.firstChild) {\n\n                                p.appendChild(li.firstChild);\n                            }\n                            li.appendChild(p);\n                            first = p;\n                        }\n\n                        var span = me.document.createElement('span');\n\n                        range.insertNode(span);\n                        domUtils.breakParent(span, li);\n\n                        var nextLi = span.nextSibling;\n                        first = nextLi.firstChild;\n\n                        if (!first) {\n                            p = me.document.createElement('p');\n\n                            domUtils.fillNode(me.document, p);\n                            nextLi.appendChild(p);\n                            first = p;\n                        }\n                        if (domUtils.isEmptyNode(first)) {\n                            first.innerHTML = '';\n                            domUtils.fillNode(me.document, first);\n                        }\n\n                        range.setStart(first, 0).collapse(true).shrinkBoundary().select();\n                        domUtils.remove(span);\n                        var pre = nextLi.previousSibling;\n                        if (pre && domUtils.isEmptyBlock(pre)) {\n                            pre.innerHTML = '<p></p>';\n                            domUtils.fillNode(me.document, pre.firstChild);\n                        }\n\n                    }\n//                        }\n                    preventAndSave();\n                }\n\n\n            }\n\n\n        }\n        if (keyCode == 8) {\n            //修中ie中li下的问题\n            range = me.selection.getRange();\n            if (range.collapsed && domUtils.isStartInblock(range)) {\n                tmpRange = range.cloneRange().trimBoundary();\n                li = domUtils.findParentByTagName(range.startContainer, 'li', true);\n                //要在li的最左边，才能处理\n                if (li && domUtils.isStartInblock(tmpRange)) {\n                    start = domUtils.findParentByTagName(range.startContainer, 'p', true);\n                    if (start && start !== li.firstChild) {\n                        var parentList = domUtils.findParentByTagName(start,['ol','ul']);\n                        domUtils.breakParent(start,parentList);\n                        clearEmptySibling(start);\n                        me.fireEvent('contentchange');\n                        range.setStart(start,0).setCursor(false,true);\n                        me.fireEvent('saveScene');\n                        domUtils.preventDefault(evt);\n                        return;\n                    }\n\n                    if (li && (pre = li.previousSibling)) {\n                        if (keyCode == 46 && li.childNodes.length) {\n                            return;\n                        }\n                        //有可能上边的兄弟节点是个2级菜单，要追加到2级菜单的最后的li\n                        if (dtd.$list[pre.tagName]) {\n                            pre = pre.lastChild;\n                        }\n                        me.undoManger && me.undoManger.save();\n                        first = li.firstChild;\n                        if (domUtils.isBlockElm(first)) {\n                            if (domUtils.isEmptyNode(first)) {\n//                                    range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true);\n                                pre.appendChild(first);\n                                range.setStart(first, 0).setCursor(false, true);\n                                //first不是唯一的节点\n                                while (li.firstChild) {\n                                    pre.appendChild(li.firstChild);\n                                }\n                            } else {\n\n                                span = me.document.createElement('span');\n                                range.insertNode(span);\n                                //判断pre是否是空的节点,如果是<p><br/></p>类型的空节点，干掉p标签防止它占位\n                                if (domUtils.isEmptyBlock(pre)) {\n                                    pre.innerHTML = '';\n                                }\n                                domUtils.moveChild(li, pre);\n                                range.setStartBefore(span).collapse(true).select(true);\n\n                                domUtils.remove(span);\n\n                            }\n                        } else {\n                            if (domUtils.isEmptyNode(li)) {\n                                var p = me.document.createElement('p');\n                                pre.appendChild(p);\n                                range.setStart(p, 0).setCursor();\n//                                    range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true);\n                            } else {\n                                range.setEnd(pre, pre.childNodes.length).collapse().select(true);\n                                while (li.firstChild) {\n                                    pre.appendChild(li.firstChild);\n                                }\n                            }\n                        }\n                        domUtils.remove(li);\n                        me.fireEvent('contentchange');\n                        me.fireEvent('saveScene');\n                        domUtils.preventDefault(evt);\n                        return;\n\n                    }\n                    //trace:980\n\n                    if (li && !li.previousSibling) {\n                        var parentList = li.parentNode;\n                        var bk = range.createBookmark();\n                        if(domUtils.isTagNode(parentList.parentNode,'ol ul')){\n                            parentList.parentNode.insertBefore(li,parentList);\n                            if(domUtils.isEmptyNode(parentList)){\n                                domUtils.remove(parentList)\n                            }\n                        }else{\n\n                            while(li.firstChild){\n                                parentList.parentNode.insertBefore(li.firstChild,parentList);\n                            }\n\n                            domUtils.remove(li);\n                            if(domUtils.isEmptyNode(parentList)){\n                                domUtils.remove(parentList)\n                            }\n\n                        }\n                        range.moveToBookmark(bk).setCursor(false,true);\n                        me.fireEvent('contentchange');\n                        me.fireEvent('saveScene');\n                        domUtils.preventDefault(evt);\n                        return;\n\n                    }\n\n\n                }\n\n\n            }\n\n        }\n    });\n\n    me.addListener('keyup',function(type, evt){\n        var keyCode = evt.keyCode || evt.which;\n        if (keyCode == 8) {\n            var rng = me.selection.getRange(),list;\n            if(list = domUtils.findParentByTagName(rng.startContainer,['ol', 'ul'],true)){\n                adjustList(list,list.tagName.toLowerCase(),getStyle(list)||domUtils.getComputedStyle(list,'list-style-type'),true)\n            }\n        }\n    });\n    //处理tab键\n    me.addListener('tabkeydown',function(){\n\n        var range = me.selection.getRange();\n\n        //控制级数\n        function checkLevel(li){\n            if(me.options.maxListLevel != -1){\n                var level = li.parentNode,levelNum = 0;\n                while(/[ou]l/i.test(level.tagName)){\n                    levelNum++;\n                    level = level.parentNode;\n                }\n                if(levelNum >= me.options.maxListLevel){\n                    return true;\n                }\n            }\n        }\n        //只以开始为准\n        //todo 后续改进\n        var li = domUtils.findParentByTagName(range.startContainer, 'li', true);\n        if(li){\n\n            var bk;\n            if(range.collapsed){\n                if(checkLevel(li))\n                    return true;\n                var parentLi = li.parentNode,\n                    list = me.document.createElement(parentLi.tagName),\n                    index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type'));\n                index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1;\n                var currentStyle = listStyle[list.tagName][index];\n                setListStyle(list,currentStyle);\n                if(domUtils.isStartInblock(range)){\n                    me.fireEvent('saveScene');\n                    bk = range.createBookmark();\n                    parentLi.insertBefore(list, li);\n                    list.appendChild(li);\n                    adjustList(list,list.tagName.toLowerCase(),currentStyle);\n                    me.fireEvent('contentchange');\n                    range.moveToBookmark(bk).select(true);\n                    return true;\n                }\n            }else{\n                me.fireEvent('saveScene');\n                bk = range.createBookmark();\n                for(var i= 0,closeList,parents = domUtils.findParents(li),ci;ci=parents[i++];){\n                    if(domUtils.isTagNode(ci,'ol ul')){\n                        closeList = ci;\n                        break;\n                    }\n                }\n                var current = li;\n                if(bk.end){\n                    while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){\n                        if(checkLevel(current)){\n                            current = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList});\n                            continue;\n                        }\n                        var parentLi = current.parentNode,\n                            list = me.document.createElement(parentLi.tagName),\n                            index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type'));\n                        var currentIndex = index + 1 == listStyle[list.tagName].length ? 0 : index + 1;\n                        var currentStyle = listStyle[list.tagName][currentIndex];\n                        setListStyle(list,currentStyle);\n                        parentLi.insertBefore(list, current);\n                        while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){\n                            li = current.nextSibling;\n                            list.appendChild(current);\n                            if(!li || domUtils.isTagNode(li,'ol ul')){\n                                if(li){\n                                    while(li = li.firstChild){\n                                        if(li.tagName == 'LI'){\n                                            break;\n                                        }\n                                    }\n                                }else{\n                                    li = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList});\n                                }\n                                break;\n                            }\n                            current = li;\n                        }\n                        adjustList(list,list.tagName.toLowerCase(),currentStyle);\n                        current = li;\n                    }\n                }\n                me.fireEvent('contentchange');\n                range.moveToBookmark(bk).select();\n                return true;\n            }\n        }\n\n    });\n    function getLi(start){\n        while(start && !domUtils.isBody(start)){\n            if(start.nodeName == 'TABLE'){\n                return null;\n            }\n            if(start.nodeName == 'LI'){\n                return start\n            }\n            start = start.parentNode;\n        }\n    }\n\n    /**\n     * 有序列表，与“insertunorderedlist”命令互斥\n     * @command insertorderedlist\n     * @method execCommand\n     * @param { String } command 命令字符串\n     * @param { String } style 插入的有序列表类型，值为：decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2\n     * @example\n     * ```javascript\n     * editor.execCommand( 'insertorderedlist','decimal');\n     * ```\n     */\n    /**\n     * 查询当前选区内容是否有序列表\n     * @command insertorderedlist\n     * @method queryCommandState\n     * @param { String } cmd 命令字符串\n     * @return { int } 如果当前选区是有序列表返回1，否则返回0\n     * @example\n     * ```javascript\n     * editor.queryCommandState( 'insertorderedlist' );\n     * ```\n     */\n    /**\n     * 查询当前选区内容是否有序列表\n     * @command insertorderedlist\n     * @method queryCommandValue\n     * @param { String } cmd 命令字符串\n     * @return { String } 返回当前有序列表的类型，值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2\n     * @example\n     * ```javascript\n     * editor.queryCommandValue( 'insertorderedlist' );\n     * ```\n     */\n\n    /**\n     * 无序列表，与“insertorderedlist”命令互斥\n     * @command insertunorderedlist\n     * @method execCommand\n     * @param { String } command 命令字符串\n     * @param { String } style 插入的无序列表类型，值为：circle,disc,square,dash,dot\n     * @example\n     * ```javascript\n     * editor.execCommand( 'insertunorderedlist','circle');\n     * ```\n     */\n    /**\n     * 查询当前是否有word文档粘贴进来的图片\n     * @command insertunorderedlist\n     * @method insertunorderedlist\n     * @param { String } command 命令字符串\n     * @return { int } 如果当前选区是无序列表返回1，否则返回0\n     * @example\n     * ```javascript\n     * editor.queryCommandState( 'insertunorderedlist' );\n     * ```\n     */\n    /**\n     * 查询当前选区内容是否有序列表\n     * @command insertunorderedlist\n     * @method queryCommandValue\n     * @param { String } command 命令字符串\n     * @return { String } 返回当前无序列表的类型，值为null或circle,disc,square,dash,dot\n     * @example\n     * ```javascript\n     * editor.queryCommandValue( 'insertunorderedlist' );\n     * ```\n     */\n\n    me.commands['insertorderedlist'] =\n    me.commands['insertunorderedlist'] = {\n            execCommand:function (command, style) {\n\n                if (!style) {\n                    style = command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc';\n                }\n                var me = this,\n                    range = this.selection.getRange(),\n                    filterFn = function (node) {\n                        return   node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node);\n                    },\n                    tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul',\n                    frag = me.document.createDocumentFragment();\n                //去掉是因为会出现选到末尾，导致adjustmentBoundary缩到ol/ul的位置\n                //range.shrinkBoundary();//.adjustmentBoundary();\n                range.adjustmentBoundary().shrinkBoundary();\n                var bko = range.createBookmark(true),\n                    start = getLi(me.document.getElementById(bko.start)),\n                    modifyStart = 0,\n                    end =  getLi(me.document.getElementById(bko.end)),\n                    modifyEnd = 0,\n                    startParent, endParent,\n                    list, tmp;\n\n                if (start || end) {\n                    start && (startParent = start.parentNode);\n                    if (!bko.end) {\n                        end = start;\n                    }\n                    end && (endParent = end.parentNode);\n\n                    if (startParent === endParent) {\n                        while (start !== end) {\n                            tmp = start;\n                            start = start.nextSibling;\n                            if (!domUtils.isBlockElm(tmp.firstChild)) {\n                                var p = me.document.createElement('p');\n                                while (tmp.firstChild) {\n                                    p.appendChild(tmp.firstChild);\n                                }\n                                tmp.appendChild(p);\n                            }\n                            frag.appendChild(tmp);\n                        }\n                        tmp = me.document.createElement('span');\n                        startParent.insertBefore(tmp, end);\n                        if (!domUtils.isBlockElm(end.firstChild)) {\n                            p = me.document.createElement('p');\n                            while (end.firstChild) {\n                                p.appendChild(end.firstChild);\n                            }\n                            end.appendChild(p);\n                        }\n                        frag.appendChild(end);\n                        domUtils.breakParent(tmp, startParent);\n                        if (domUtils.isEmptyNode(tmp.previousSibling)) {\n                            domUtils.remove(tmp.previousSibling);\n                        }\n                        if (domUtils.isEmptyNode(tmp.nextSibling)) {\n                            domUtils.remove(tmp.nextSibling)\n                        }\n                        var nodeStyle = getStyle(startParent) || domUtils.getComputedStyle(startParent, 'list-style-type') || (command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc');\n                        if (startParent.tagName.toLowerCase() == tag && nodeStyle == style) {\n                            for (var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); ci = frag.firstChild;) {\n                                if(domUtils.isTagNode(ci,'ol ul')){\n//                                  删除时，子列表不处理\n//                                  utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){\n//                                        while(li.firstChild){\n//                                            tmpFrag.appendChild(li.firstChild);\n//                                        }\n//\n//                                    });\n                                    tmpFrag.appendChild(ci);\n                                }else{\n                                    while (ci.firstChild) {\n\n                                        tmpFrag.appendChild(ci.firstChild);\n                                        domUtils.remove(ci);\n                                    }\n                                }\n\n                            }\n                            tmp.parentNode.insertBefore(tmpFrag, tmp);\n                        } else {\n                            list = me.document.createElement(tag);\n                            setListStyle(list,style);\n                            list.appendChild(frag);\n                            tmp.parentNode.insertBefore(list, tmp);\n                        }\n\n                        domUtils.remove(tmp);\n                        list && adjustList(list, tag, style);\n                        range.moveToBookmark(bko).select();\n                        return;\n                    }\n                    //开始\n                    if (start) {\n                        while (start) {\n                            tmp = start.nextSibling;\n                            if (domUtils.isTagNode(start, 'ol ul')) {\n                                frag.appendChild(start);\n                            } else {\n                                var tmpfrag = me.document.createDocumentFragment(),\n                                    hasBlock = 0;\n                                while (start.firstChild) {\n                                    if (domUtils.isBlockElm(start.firstChild)) {\n                                        hasBlock = 1;\n                                    }\n                                    tmpfrag.appendChild(start.firstChild);\n                                }\n                                if (!hasBlock) {\n                                    var tmpP = me.document.createElement('p');\n                                    tmpP.appendChild(tmpfrag);\n                                    frag.appendChild(tmpP);\n                                } else {\n                                    frag.appendChild(tmpfrag);\n                                }\n                                domUtils.remove(start);\n                            }\n\n                            start = tmp;\n                        }\n                        startParent.parentNode.insertBefore(frag, startParent.nextSibling);\n                        if (domUtils.isEmptyNode(startParent)) {\n                            range.setStartBefore(startParent);\n                            domUtils.remove(startParent);\n                        } else {\n                            range.setStartAfter(startParent);\n                        }\n                        modifyStart = 1;\n                    }\n\n                    if (end && domUtils.inDoc(endParent, me.document)) {\n                        //结束\n                        start = endParent.firstChild;\n                        while (start && start !== end) {\n                            tmp = start.nextSibling;\n                            if (domUtils.isTagNode(start, 'ol ul')) {\n                                frag.appendChild(start);\n                            } else {\n                                tmpfrag = me.document.createDocumentFragment();\n                                hasBlock = 0;\n                                while (start.firstChild) {\n                                    if (domUtils.isBlockElm(start.firstChild)) {\n                                        hasBlock = 1;\n                                    }\n                                    tmpfrag.appendChild(start.firstChild);\n                                }\n                                if (!hasBlock) {\n                                    tmpP = me.document.createElement('p');\n                                    tmpP.appendChild(tmpfrag);\n                                    frag.appendChild(tmpP);\n                                } else {\n                                    frag.appendChild(tmpfrag);\n                                }\n                                domUtils.remove(start);\n                            }\n                            start = tmp;\n                        }\n                        var tmpDiv = domUtils.createElement(me.document, 'div', {\n                            'tmpDiv':1\n                        });\n                        domUtils.moveChild(end, tmpDiv);\n\n                        frag.appendChild(tmpDiv);\n                        domUtils.remove(end);\n                        endParent.parentNode.insertBefore(frag, endParent);\n                        range.setEndBefore(endParent);\n                        if (domUtils.isEmptyNode(endParent)) {\n                            domUtils.remove(endParent);\n                        }\n\n                        modifyEnd = 1;\n                    }\n\n\n                }\n\n                if (!modifyStart) {\n                    range.setStartBefore(me.document.getElementById(bko.start));\n                }\n                if (bko.end && !modifyEnd) {\n                    range.setEndAfter(me.document.getElementById(bko.end));\n                }\n                range.enlarge(true, function (node) {\n                    return notExchange[node.tagName];\n                });\n\n                frag = me.document.createDocumentFragment();\n\n                var bk = range.createBookmark(),\n                    current = domUtils.getNextDomNode(bk.start, false, filterFn),\n                    tmpRange = range.cloneRange(),\n                    tmpNode,\n                    block = domUtils.isBlockElm;\n\n                while (current && current !== bk.end && (domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING)) {\n\n                    if (current.nodeType == 3 || dtd.li[current.tagName]) {\n                        if (current.nodeType == 1 && dtd.$list[current.tagName]) {\n                            while (current.firstChild) {\n                                frag.appendChild(current.firstChild);\n                            }\n                            tmpNode = domUtils.getNextDomNode(current, false, filterFn);\n                            domUtils.remove(current);\n                            current = tmpNode;\n                            continue;\n\n                        }\n                        tmpNode = current;\n                        tmpRange.setStartBefore(current);\n\n                        while (current && current !== bk.end && (!block(current) || domUtils.isBookmarkNode(current) )) {\n                            tmpNode = current;\n                            current = domUtils.getNextDomNode(current, false, null, function (node) {\n                                return !notExchange[node.tagName];\n                            });\n                        }\n\n                        if (current && block(current)) {\n                            tmp = domUtils.getNextDomNode(tmpNode, false, filterFn);\n                            if (tmp && domUtils.isBookmarkNode(tmp)) {\n                                current = domUtils.getNextDomNode(tmp, false, filterFn);\n                                tmpNode = tmp;\n                            }\n                        }\n                        tmpRange.setEndAfter(tmpNode);\n\n                        current = domUtils.getNextDomNode(tmpNode, false, filterFn);\n\n                        var li = range.document.createElement('li');\n\n                        li.appendChild(tmpRange.extractContents());\n                        if(domUtils.isEmptyNode(li)){\n                            var tmpNode = range.document.createElement('p');\n                            while(li.firstChild){\n                                tmpNode.appendChild(li.firstChild)\n                            }\n                            li.appendChild(tmpNode);\n                        }\n                        frag.appendChild(li);\n                    } else {\n                        current = domUtils.getNextDomNode(current, true, filterFn);\n                    }\n                }\n                range.moveToBookmark(bk).collapse(true);\n                list = me.document.createElement(tag);\n                setListStyle(list,style);\n                list.appendChild(frag);\n                range.insertNode(list);\n                //当前list上下看能否合并\n                adjustList(list, tag, style);\n                //去掉冗余的tmpDiv\n                for (var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, 'div'); ci = tmpDivs[i++];) {\n                    if (ci.getAttribute('tmpDiv')) {\n                        domUtils.remove(ci, true)\n                    }\n                }\n                range.moveToBookmark(bko).select();\n\n            },\n            queryCommandState:function (command) {\n                var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul';\n                var path = this.selection.getStartElementPath();\n                for(var i= 0,ci;ci = path[i++];){\n                    if(ci.nodeName == 'TABLE'){\n                        return 0\n                    }\n                    if(tag == ci.nodeName.toLowerCase()){\n                        return 1\n                    };\n                }\n                return 0;\n\n            },\n            queryCommandValue:function (command) {\n                var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul';\n                var path = this.selection.getStartElementPath(),\n                    node;\n                for(var i= 0,ci;ci = path[i++];){\n                    if(ci.nodeName == 'TABLE'){\n                        node = null;\n                        break;\n                    }\n                    if(tag == ci.nodeName.toLowerCase()){\n                        node = ci;\n                        break;\n                    };\n                }\n                return node ? getStyle(node) || domUtils.getComputedStyle(node, 'list-style-type') : null;\n            }\n        };\n};\n\n\n\n// plugins/source.js\n/**\n * 源码编辑插件\n * @file\n * @since 1.2.6.1\n */\n\n(function (){\n    var sourceEditors = {\n        textarea: function (editor, holder){\n            var textarea = holder.ownerDocument.createElement('textarea');\n            textarea.style.cssText = 'position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;';\n            // todo: IE下只有onresize属性可用... 很纠结\n            if (browser.ie && browser.version < 8) {\n                textarea.style.width = holder.offsetWidth + 'px';\n                textarea.style.height = holder.offsetHeight + 'px';\n                holder.onresize = function (){\n                    textarea.style.width = holder.offsetWidth + 'px';\n                    textarea.style.height = holder.offsetHeight + 'px';\n                };\n            }\n            holder.appendChild(textarea);\n            return {\n                setContent: function (content){\n                    textarea.value = content;\n                },\n                getContent: function (){\n                    return textarea.value;\n                },\n                select: function (){\n                    var range;\n                    if (browser.ie) {\n                        range = textarea.createTextRange();\n                        range.collapse(true);\n                        range.select();\n                    } else {\n                        //todo: chrome下无法设置焦点\n                        textarea.setSelectionRange(0, 0);\n                        textarea.focus();\n                    }\n                },\n                dispose: function (){\n                    holder.removeChild(textarea);\n                    // todo\n                    holder.onresize = null;\n                    textarea = null;\n                    holder = null;\n                }\n            };\n        },\n        codemirror: function (editor, holder){\n\n            var codeEditor = window.CodeMirror(holder, {\n                mode: \"text/html\",\n                tabMode: \"indent\",\n                lineNumbers: true,\n                lineWrapping:true\n            });\n            var dom = codeEditor.getWrapperElement();\n            dom.style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,\"Courier new\",monospace;font-size:13px;';\n            codeEditor.getScrollerElement().style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;';\n            codeEditor.refresh();\n            return {\n                getCodeMirror:function(){\n                    return codeEditor;\n                },\n                setContent: function (content){\n                    codeEditor.setValue(content);\n                },\n                getContent: function (){\n                    return codeEditor.getValue();\n                },\n                select: function (){\n                    codeEditor.focus();\n                },\n                dispose: function (){\n                    holder.removeChild(dom);\n                    dom = null;\n                    codeEditor = null;\n                }\n            };\n        }\n    };\n\n    UE.plugins['source'] = function (){\n        var me = this;\n        var opt = this.options;\n        var sourceMode = false;\n        var sourceEditor;\n        var orgSetContent;\n        opt.sourceEditor = browser.ie  ? 'textarea' : (opt.sourceEditor || 'codemirror');\n\n        me.setOpt({\n            sourceEditorFirst:false\n        });\n        function createSourceEditor(holder){\n            return sourceEditors[opt.sourceEditor == 'codemirror' && window.CodeMirror ? 'codemirror' : 'textarea'](me, holder);\n        }\n\n        var bakCssText;\n        //解决在源码模式下getContent不能得到最新的内容问题\n        var oldGetContent,\n            bakAddress;\n\n        /**\n         * 切换源码模式和编辑模式\n         * @command source\n         * @method execCommand\n         * @param { String } cmd 命令字符串\n         * @example\n         * ```javascript\n         * editor.execCommand( 'source');\n         * ```\n         */\n\n        /**\n         * 查询当前编辑区域的状态是源码模式还是可视化模式\n         * @command source\n         * @method queryCommandState\n         * @param { String } cmd 命令字符串\n         * @return { int } 如果当前是源码编辑模式，返回1，否则返回0\n         * @example\n         * ```javascript\n         * editor.queryCommandState( 'source' );\n         * ```\n         */\n\n        me.commands['source'] = {\n            execCommand: function (){\n\n                sourceMode = !sourceMode;\n                if (sourceMode) {\n                    bakAddress = me.selection.getRange().createAddress(false,true);\n                    me.undoManger && me.undoManger.save(true);\n                    if(browser.gecko){\n                        me.body.contentEditable = false;\n                    }\n\n                    bakCssText = me.iframe.style.cssText;\n                    me.iframe.style.cssText += 'position:absolute;left:-32768px;top:-32768px;';\n\n\n                    me.fireEvent('beforegetcontent');\n                    var root = UE.htmlparser(me.body.innerHTML);\n                    me.filterOutputRule(root);\n                    root.traversal(function (node) {\n                        if (node.type == 'element') {\n                            switch (node.tagName) {\n                                case 'td':\n                                case 'th':\n                                case 'caption':\n                                if(node.children && node.children.length == 1){\n                                    if(node.firstChild().tagName == 'br' ){\n                                        node.removeChild(node.firstChild())\n                                    }\n                                };\n                                break;\n                                case 'pre':\n                                    node.innerText(node.innerText().replace(/&nbsp;/g,' '))\n\n                            }\n                        }\n                    });\n\n                    me.fireEvent('aftergetcontent');\n\n                    var content = root.toHtml(true);\n\n                    sourceEditor = createSourceEditor(me.iframe.parentNode);\n\n                    sourceEditor.setContent(content);\n\n                    orgSetContent = me.setContent;\n\n                    me.setContent = function(html){\n                        //这里暂时不触发事件，防止报错\n                        var root = UE.htmlparser(html);\n                        me.filterInputRule(root);\n                        html = root.toHtml();\n                        sourceEditor.setContent(html);\n                    };\n\n                    setTimeout(function (){\n                        sourceEditor.select();\n                        me.addListener('fullscreenchanged', function(){\n                            try{\n                                sourceEditor.getCodeMirror().refresh()\n                            }catch(e){}\n                        });\n                    });\n\n                    //重置getContent，源码模式下取值也能是最新的数据\n                    oldGetContent = me.getContent;\n                    me.getContent = function (){\n                        return sourceEditor.getContent() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';\n                    };\n                } else {\n                    me.iframe.style.cssText = bakCssText;\n                    var cont = sourceEditor.getContent() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';\n                    //处理掉block节点前后的空格,有可能会误命中，暂时不考虑\n                    cont = cont.replace(new RegExp('[\\\\r\\\\t\\\\n ]*<\\/?(\\\\w+)\\\\s*(?:[^>]*)>','g'), function(a,b){\n                        if(b && !dtd.$inlineWithA[b.toLowerCase()]){\n                            return a.replace(/(^[\\n\\r\\t ]*)|([\\n\\r\\t ]*$)/g,'');\n                        }\n                        return a.replace(/(^[\\n\\r\\t]*)|([\\n\\r\\t]*$)/g,'')\n                    });\n\n                    me.setContent = orgSetContent;\n\n                    me.setContent(cont);\n                    sourceEditor.dispose();\n                    sourceEditor = null;\n                    //还原getContent方法\n                    me.getContent = oldGetContent;\n                    var first = me.body.firstChild;\n                    //trace:1106 都删除空了，下边会报错，所以补充一个p占位\n                    if(!first){\n                        me.body.innerHTML = '<p>'+(browser.ie?'':'<br/>')+'</p>';\n                        first = me.body.firstChild;\n                    }\n\n\n                    //要在ifm为显示时ff才能取到selection,否则报错\n                    //这里不能比较位置了\n                    me.undoManger && me.undoManger.save(true);\n\n                    if(browser.gecko){\n\n                        var input = document.createElement('input');\n                        input.style.cssText = 'position:absolute;left:0;top:-32768px';\n\n                        document.body.appendChild(input);\n\n                        me.body.contentEditable = false;\n                        setTimeout(function(){\n                            domUtils.setViewportOffset(input, { left: -32768, top: 0 });\n                            input.focus();\n                            setTimeout(function(){\n                                me.body.contentEditable = true;\n                                me.selection.getRange().moveToAddress(bakAddress).select(true);\n                                domUtils.remove(input);\n                            });\n\n                        });\n                    }else{\n                        //ie下有可能报错，比如在代码顶头的情况\n                        try{\n                            me.selection.getRange().moveToAddress(bakAddress).select(true);\n                        }catch(e){}\n\n                    }\n                }\n                this.fireEvent('sourcemodechanged', sourceMode);\n            },\n            queryCommandState: function (){\n                return sourceMode|0;\n            },\n            notNeedUndo : 1\n        };\n        var oldQueryCommandState = me.queryCommandState;\n\n        me.queryCommandState = function (cmdName){\n            cmdName = cmdName.toLowerCase();\n            if (sourceMode) {\n                //源码模式下可以开启的命令\n                return cmdName in {\n                    'source' : 1,\n                    'fullscreen' : 1\n                } ? 1 : -1\n            }\n            return oldQueryCommandState.apply(this, arguments);\n        };\n\n        if(opt.sourceEditor == \"codemirror\"){\n\n            me.addListener(\"ready\",function(){\n                utils.loadFile(document,{\n                    src : opt.codeMirrorJsUrl || opt.UEDITOR_HOME_URL + \"third-party/codemirror/codemirror.js\",\n                    tag : \"script\",\n                    type : \"text/javascript\",\n                    defer : \"defer\"\n                },function(){\n                    if(opt.sourceEditorFirst){\n                        setTimeout(function(){\n                            me.execCommand(\"source\");\n                        },0);\n                    }\n                });\n                utils.loadFile(document,{\n                    tag : \"link\",\n                    rel : \"stylesheet\",\n                    type : \"text/css\",\n                    href : opt.codeMirrorCssUrl || opt.UEDITOR_HOME_URL + \"third-party/codemirror/codemirror.css\"\n                });\n\n            });\n        }\n\n    };\n\n})();\n\n// plugins/enterkey.js\n///import core\n///import plugins/undo.js\n///commands 设置回车标签p或br\n///commandsName  EnterKey\n///commandsTitle  设置回车标签p或br\n/**\n * @description 处理回车\n * @author zhanyi\n */\nUE.plugins['enterkey'] = function() {\n    var hTag,\n        me = this,\n        tag = me.options.enterTag;\n    me.addListener('keyup', function(type, evt) {\n\n        var keyCode = evt.keyCode || evt.which;\n        if (keyCode == 13) {\n            var range = me.selection.getRange(),\n                start = range.startContainer,\n                doSave;\n\n            //修正在h1-h6里边回车后不能嵌套p的问题\n            if (!browser.ie) {\n\n                if (/h\\d/i.test(hTag)) {\n                    if (browser.gecko) {\n                        var h = domUtils.findParentByTagName(start, [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption','table'], true);\n                        if (!h) {\n                            me.document.execCommand('formatBlock', false, '<p>');\n                            doSave = 1;\n                        }\n                    } else {\n                        //chrome remove div\n                        if (start.nodeType == 1) {\n                            var tmp = me.document.createTextNode(''),div;\n                            range.insertNode(tmp);\n                            div = domUtils.findParentByTagName(tmp, 'div', true);\n                            if (div) {\n                                var p = me.document.createElement('p');\n                                while (div.firstChild) {\n                                    p.appendChild(div.firstChild);\n                                }\n                                div.parentNode.insertBefore(p, div);\n                                domUtils.remove(div);\n                                range.setStartBefore(tmp).setCursor();\n                                doSave = 1;\n                            }\n                            domUtils.remove(tmp);\n\n                        }\n                    }\n\n                    if (me.undoManger && doSave) {\n                        me.undoManger.save();\n                    }\n                }\n                //没有站位符，会出现多行的问题\n                browser.opera &&  range.select();\n            }else{\n                me.fireEvent('saveScene',true,true)\n            }\n        }\n    });\n\n    me.addListener('keydown', function(type, evt) {\n        var keyCode = evt.keyCode || evt.which;\n        if (keyCode == 13) {//回车\n            if(me.fireEvent('beforeenterkeydown')){\n                domUtils.preventDefault(evt);\n                return;\n            }\n            me.fireEvent('saveScene',true,true);\n            hTag = '';\n\n\n            var range = me.selection.getRange();\n\n            if (!range.collapsed) {\n                //跨td不能删\n                var start = range.startContainer,\n                    end = range.endContainer,\n                    startTd = domUtils.findParentByTagName(start, 'td', true),\n                    endTd = domUtils.findParentByTagName(end, 'td', true);\n                if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) {\n                    evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false);\n                    return;\n                }\n            }\n            if (tag == 'p') {\n\n\n                if (!browser.ie) {\n\n                    start = domUtils.findParentByTagName(range.startContainer, ['ol','ul','p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption'], true);\n\n                    //opera下执行formatblock会在table的场景下有问题，回车在opera原生支持很好，所以暂时在opera去掉调用这个原生的command\n                    //trace:2431\n                    if (!start && !browser.opera) {\n\n                        me.document.execCommand('formatBlock', false, '<p>');\n\n                        if (browser.gecko) {\n                            range = me.selection.getRange();\n                            start = domUtils.findParentByTagName(range.startContainer, 'p', true);\n                            start && domUtils.removeDirtyAttr(start);\n                        }\n\n\n                    } else {\n                        hTag = start.tagName;\n                        start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start);\n                    }\n\n                }\n\n            } else {\n                evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false);\n\n                if (!range.collapsed) {\n                    range.deleteContents();\n                    start = range.startContainer;\n                    if (start.nodeType == 1 && (start = start.childNodes[range.startOffset])) {\n                        while (start.nodeType == 1) {\n                            if (dtd.$empty[start.tagName]) {\n                                range.setStartBefore(start).setCursor();\n                                if (me.undoManger) {\n                                    me.undoManger.save();\n                                }\n                                return false;\n                            }\n                            if (!start.firstChild) {\n                                var br = range.document.createElement('br');\n                                start.appendChild(br);\n                                range.setStart(start, 0).setCursor();\n                                if (me.undoManger) {\n                                    me.undoManger.save();\n                                }\n                                return false;\n                            }\n                            start = start.firstChild;\n                        }\n                        if (start === range.startContainer.childNodes[range.startOffset]) {\n                            br = range.document.createElement('br');\n                            range.insertNode(br).setCursor();\n\n                        } else {\n                            range.setStart(start, 0).setCursor();\n                        }\n\n\n                    } else {\n                        br = range.document.createElement('br');\n                        range.insertNode(br).setStartAfter(br).setCursor();\n                    }\n\n\n                } else {\n                    br = range.document.createElement('br');\n                    range.insertNode(br);\n                    var parent = br.parentNode;\n                    if (parent.lastChild === br) {\n                        br.parentNode.insertBefore(br.cloneNode(true), br);\n                        range.setStartBefore(br);\n                    } else {\n                        range.setStartAfter(br);\n                    }\n                    range.setCursor();\n\n                }\n\n            }\n\n        }\n    });\n};\n\n\n// plugins/keystrokes.js\n/* 处理特殊键的兼容性问题 */\nUE.plugins['keystrokes'] = function() {\n    var me = this;\n    var collapsed = true;\n    me.addListener('keydown', function(type, evt) {\n        var keyCode = evt.keyCode || evt.which,\n            rng = me.selection.getRange();\n\n        //处理全选的情况\n        if(!rng.collapsed && !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && (keyCode >= 65 && keyCode <=90\n            || keyCode >= 48 && keyCode <= 57 ||\n            keyCode >= 96 && keyCode <= 111 || {\n                    13:1,\n                    8:1,\n                    46:1\n                }[keyCode])\n            ){\n\n            var tmpNode = rng.startContainer;\n            if(domUtils.isFillChar(tmpNode)){\n                rng.setStartBefore(tmpNode)\n            }\n            tmpNode = rng.endContainer;\n            if(domUtils.isFillChar(tmpNode)){\n                rng.setEndAfter(tmpNode)\n            }\n            rng.txtToElmBoundary();\n            //结束边界可能放到了br的前边，要把br包含进来\n            // x[xxx]<br/>\n            if(rng.endContainer && rng.endContainer.nodeType == 1){\n                tmpNode = rng.endContainer.childNodes[rng.endOffset];\n                if(tmpNode && domUtils.isBr(tmpNode)){\n                    rng.setEndAfter(tmpNode);\n                }\n            }\n            if(rng.startOffset == 0){\n                tmpNode = rng.startContainer;\n                if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){\n                    tmpNode = rng.endContainer;\n                    if(rng.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){\n                        me.fireEvent('saveScene');\n                        me.body.innerHTML = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';\n                        rng.setStart(me.body.firstChild,0).setCursor(false,true);\n                        me._selectionChange();\n                        return;\n                    }\n                }\n            }\n        }\n\n        //处理backspace\n        if (keyCode == keymap.Backspace) {\n            rng = me.selection.getRange();\n            collapsed = rng.collapsed;\n            if(me.fireEvent('delkeydown',evt)){\n                return;\n            }\n            var start,end;\n            //避免按两次删除才能生效的问题\n            if(rng.collapsed && rng.inFillChar()){\n                start = rng.startContainer;\n\n                if(domUtils.isFillChar(start)){\n                    rng.setStartBefore(start).shrinkBoundary(true).collapse(true);\n                    domUtils.remove(start)\n                }else{\n                    start.nodeValue = start.nodeValue.replace(new RegExp('^' + domUtils.fillChar ),'');\n                    rng.startOffset--;\n                    rng.collapse(true).select(true)\n                }\n            }\n\n            //解决选中control元素不能删除的问题\n            if (start = rng.getClosedNode()) {\n                me.fireEvent('saveScene');\n                rng.setStartBefore(start);\n                domUtils.remove(start);\n                rng.setCursor();\n                me.fireEvent('saveScene');\n                domUtils.preventDefault(evt);\n                return;\n            }\n            //阻止在table上的删除\n            if (!browser.ie) {\n                start = domUtils.findParentByTagName(rng.startContainer, 'table', true);\n                end = domUtils.findParentByTagName(rng.endContainer, 'table', true);\n                if (start && !end || !start && end || start !== end) {\n                    evt.preventDefault();\n                    return;\n                }\n            }\n\n        }\n        //处理tab键的逻辑\n        if (keyCode == keymap.Tab) {\n            //不处理以下标签\n            var excludeTagNameForTabKey = {\n                'ol' : 1,\n                'ul' : 1,\n                'table':1\n            };\n            //处理组件里的tab按下事件\n            if(me.fireEvent('tabkeydown',evt)){\n                domUtils.preventDefault(evt);\n                return;\n            }\n            var range = me.selection.getRange();\n            me.fireEvent('saveScene');\n            for (var i = 0,txt = '',tabSize = me.options.tabSize|| 4,tabNode =  me.options.tabNode || '&nbsp;'; i < tabSize; i++) {\n                txt += tabNode;\n            }\n            var span = me.document.createElement('span');\n            span.innerHTML = txt + domUtils.fillChar;\n            if (range.collapsed) {\n                range.insertNode(span.cloneNode(true).firstChild).setCursor(true);\n            } else {\n                var filterFn = function(node) {\n                    return domUtils.isBlockElm(node) && !excludeTagNameForTabKey[node.tagName.toLowerCase()]\n\n                };\n                //普通的情况\n                start = domUtils.findParent(range.startContainer, filterFn,true);\n                end = domUtils.findParent(range.endContainer, filterFn,true);\n                if (start && end && start === end) {\n                    range.deleteContents();\n                    range.insertNode(span.cloneNode(true).firstChild).setCursor(true);\n                } else {\n                    var bookmark = range.createBookmark();\n                    range.enlarge(true);\n                    var bookmark2 = range.createBookmark(),\n                        current = domUtils.getNextDomNode(bookmark2.start, false, filterFn);\n                    while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) {\n                        current.insertBefore(span.cloneNode(true).firstChild, current.firstChild);\n                        current = domUtils.getNextDomNode(current, false, filterFn);\n                    }\n                    range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select();\n                }\n            }\n            domUtils.preventDefault(evt)\n        }\n        //trace:1634\n        //ff的del键在容器空的时候，也会删除\n        if(browser.gecko && keyCode == 46){\n            range = me.selection.getRange();\n            if(range.collapsed){\n                start = range.startContainer;\n                if(domUtils.isEmptyBlock(start)){\n                    var parent = start.parentNode;\n                    while(domUtils.getChildCount(parent) == 1 && !domUtils.isBody(parent)){\n                        start = parent;\n                        parent = parent.parentNode;\n                    }\n                    if(start === parent.lastChild)\n                        evt.preventDefault();\n                    return;\n                }\n            }\n        }\n    });\n    me.addListener('keyup', function(type, evt) {\n        var keyCode = evt.keyCode || evt.which,\n            rng,me = this;\n        if(keyCode == keymap.Backspace){\n            if(me.fireEvent('delkeyup')){\n                return;\n            }\n            rng = me.selection.getRange();\n            if(rng.collapsed){\n                var tmpNode,\n                    autoClearTagName = ['h1','h2','h3','h4','h5','h6'];\n                if(tmpNode = domUtils.findParentByTagName(rng.startContainer,autoClearTagName,true)){\n                    if(domUtils.isEmptyBlock(tmpNode)){\n                        var pre = tmpNode.previousSibling;\n                        if(pre && pre.nodeName != 'TABLE'){\n                            domUtils.remove(tmpNode);\n                            rng.setStartAtLast(pre).setCursor(false,true);\n                            return;\n                        }else{\n                            var next = tmpNode.nextSibling;\n                            if(next && next.nodeName != 'TABLE'){\n                                domUtils.remove(tmpNode);\n                                rng.setStartAtFirst(next).setCursor(false,true);\n                                return;\n                            }\n                        }\n                    }\n                }\n                //处理当删除到body时，要重新给p标签展位\n                if(domUtils.isBody(rng.startContainer)){\n                    var tmpNode = domUtils.createElement(me.document,'p',{\n                        'innerHTML' : browser.ie ? domUtils.fillChar : '<br/>'\n                    });\n                    rng.insertNode(tmpNode).setStart(tmpNode,0).setCursor(false,true);\n                }\n            }\n\n\n            //chrome下如果删除了inline标签，浏览器会有记忆，在输入文字还是会套上刚才删除的标签，所以这里再选一次就不会了\n            if( !collapsed && (rng.startContainer.nodeType == 3 || rng.startContainer.nodeType == 1 && domUtils.isEmptyBlock(rng.startContainer))){\n                if(browser.ie){\n                    var span = rng.document.createElement('span');\n                    rng.insertNode(span).setStartBefore(span).collapse(true);\n                    rng.select();\n                    domUtils.remove(span)\n                }else{\n                    rng.select()\n                }\n\n            }\n        }\n\n\n    })\n};\n\n// plugins/fiximgclick.js\n///import core\n///commands 修复chrome下图片不能点击的问题，出现八个角可改变大小\n///commandsName  FixImgClick\n///commandsTitle  修复chrome下图片不能点击的问题，出现八个角可改变大小\n//修复chrome下图片不能点击的问题，出现八个角可改变大小\n\nUE.plugins['fiximgclick'] = (function () {\n\n    var elementUpdated = false;\n    function Scale() {\n        this.editor = null;\n        this.resizer = null;\n        this.cover = null;\n        this.doc = document;\n        this.prePos = {x: 0, y: 0};\n        this.startPos = {x: 0, y: 0};\n    }\n\n    (function () {\n        var rect = [\n            //[left, top, width, height]\n            [0, 0, -1, -1],\n            [0, 0, 0, -1],\n            [0, 0, 1, -1],\n            [0, 0, -1, 0],\n            [0, 0, 1, 0],\n            [0, 0, -1, 1],\n            [0, 0, 0, 1],\n            [0, 0, 1, 1]\n        ];\n\n        Scale.prototype = {\n            init: function (editor) {\n                var me = this;\n                me.editor = editor;\n                me.startPos = this.prePos = {x: 0, y: 0};\n                me.dragId = -1;\n\n                var hands = [],\n                    cover = me.cover = document.createElement('div'),\n                    resizer = me.resizer = document.createElement('div');\n\n                cover.id = me.editor.ui.id + '_imagescale_cover';\n                cover.style.cssText = 'position:absolute;display:none;z-index:' + (me.editor.options.zIndex) + ';filter:alpha(opacity=0); opacity:0;background:#CCC;';\n                domUtils.on(cover, 'mousedown click', function () {\n                    me.hide();\n                });\n\n                for (i = 0; i < 8; i++) {\n                    hands.push('<span class=\"edui-editor-imagescale-hand' + i + '\"></span>');\n                }\n                resizer.id = me.editor.ui.id + '_imagescale';\n                resizer.className = 'edui-editor-imagescale';\n                resizer.innerHTML = hands.join('');\n                resizer.style.cssText += ';display:none;border:1px solid #3b77ff;z-index:' + (me.editor.options.zIndex) + ';';\n\n                me.editor.ui.getDom().appendChild(cover);\n                me.editor.ui.getDom().appendChild(resizer);\n\n                me.initStyle();\n                me.initEvents();\n            },\n            initStyle: function () {\n                utils.cssRule('imagescale', '.edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}' +\n                    '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}'\n                    + '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}'\n                    + '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}'\n                    + '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}'\n                    + '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}'\n                    + '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}'\n                    + '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}'\n                    + '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}'\n                    + '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}');\n            },\n            initEvents: function () {\n                var me = this;\n\n                me.startPos.x = me.startPos.y = 0;\n                me.isDraging = false;\n            },\n            _eventHandler: function (e) {\n                var me = this;\n                switch (e.type) {\n                    case 'mousedown':\n                        var hand = e.target || e.srcElement, hand;\n                        if (hand.className.indexOf('edui-editor-imagescale-hand') != -1 && me.dragId == -1) {\n                            me.dragId = hand.className.slice(-1);\n                            me.startPos.x = me.prePos.x = e.clientX;\n                            me.startPos.y = me.prePos.y = e.clientY;\n                            domUtils.on(me.doc,'mousemove', me.proxy(me._eventHandler, me));\n                        }\n                        break;\n                    case 'mousemove':\n                        if (me.dragId != -1) {\n                            me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y});\n                            me.prePos.x = e.clientX;\n                            me.prePos.y = e.clientY;\n                            elementUpdated = true;\n                            me.updateTargetElement();\n\n                        }\n                        break;\n                    case 'mouseup':\n                        if (me.dragId != -1) {\n                            me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y});\n                            me.updateTargetElement();\n                            if (me.target.parentNode) me.attachTo(me.target);\n                            me.dragId = -1;\n                        }\n                        domUtils.un(me.doc,'mousemove', me.proxy(me._eventHandler, me));\n                        //修复只是点击挪动点，但没有改变大小，不应该触发contentchange\n                        if(elementUpdated){\n                            elementUpdated = false;\n                            me.editor.fireEvent('contentchange');\n                        }\n\n                        break;\n                    default:\n                        break;\n                }\n            },\n            updateTargetElement: function () {\n                var me = this;\n                domUtils.setStyles(me.target, {\n                    'width': me.resizer.style.width,\n                    'height': me.resizer.style.height\n                });\n                me.target.width = parseInt(me.resizer.style.width);\n                me.target.height = parseInt(me.resizer.style.height);\n                me.attachTo(me.target);\n            },\n            updateContainerStyle: function (dir, offset) {\n                var me = this,\n                    dom = me.resizer, tmp;\n\n                if (rect[dir][0] != 0) {\n                    tmp = parseInt(dom.style.left) + offset.x;\n                    dom.style.left = me._validScaledProp('left', tmp) + 'px';\n                }\n                if (rect[dir][1] != 0) {\n                    tmp = parseInt(dom.style.top) + offset.y;\n                    dom.style.top = me._validScaledProp('top', tmp) + 'px';\n                }\n                if (rect[dir][2] != 0) {\n                    tmp = dom.clientWidth + rect[dir][2] * offset.x;\n                    dom.style.width = me._validScaledProp('width', tmp) + 'px';\n                }\n                if (rect[dir][3] != 0) {\n                    tmp = dom.clientHeight + rect[dir][3] * offset.y;\n                    dom.style.height = me._validScaledProp('height', tmp) + 'px';\n                }\n            },\n            _validScaledProp: function (prop, value) {\n                var ele = this.resizer,\n                    wrap = document;\n\n                value = isNaN(value) ? 0 : value;\n                switch (prop) {\n                    case 'left':\n                        return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value;\n                    case 'top':\n                        return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value;\n                    case 'width':\n                        return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value;\n                    case 'height':\n                        return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value;\n                }\n            },\n            hideCover: function () {\n                this.cover.style.display = 'none';\n            },\n            showCover: function () {\n                var me = this,\n                    editorPos = domUtils.getXY(me.editor.ui.getDom()),\n                    iframePos = domUtils.getXY(me.editor.iframe);\n\n                domUtils.setStyles(me.cover, {\n                    'width': me.editor.iframe.offsetWidth + 'px',\n                    'height': me.editor.iframe.offsetHeight + 'px',\n                    'top': iframePos.y - editorPos.y + 'px',\n                    'left': iframePos.x - editorPos.x + 'px',\n                    'position': 'absolute',\n                    'display': ''\n                })\n            },\n            show: function (targetObj) {\n                var me = this;\n                me.resizer.style.display = 'block';\n                if(targetObj) me.attachTo(targetObj);\n\n                domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me));\n                domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me));\n\n                me.showCover();\n                me.editor.fireEvent('afterscaleshow', me);\n                me.editor.fireEvent('saveScene');\n            },\n            hide: function () {\n                var me = this;\n                me.hideCover();\n                me.resizer.style.display = 'none';\n\n                domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me));\n                domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me));\n                me.editor.fireEvent('afterscalehide', me);\n            },\n            proxy: function( fn, context ) {\n                return function(e) {\n                    return fn.apply( context || this, arguments);\n                };\n            },\n            attachTo: function (targetObj) {\n                var me = this,\n                    target = me.target = targetObj,\n                    resizer = this.resizer,\n                    imgPos = domUtils.getXY(target),\n                    iframePos = domUtils.getXY(me.editor.iframe),\n                    editorPos = domUtils.getXY(resizer.parentNode);\n\n                domUtils.setStyles(resizer, {\n                    'width': target.width + 'px',\n                    'height': target.height + 'px',\n                    'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px',\n                    'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px'\n                });\n            }\n        }\n    })();\n\n    return function () {\n        var me = this,\n            imageScale;\n\n        me.setOpt('imageScaleEnabled', true);\n\n        if ( !browser.ie && me.options.imageScaleEnabled) {\n            me.addListener('click', function (type, e) {\n\n                var range = me.selection.getRange(),\n                    img = range.getClosedNode();\n\n                if (img && img.tagName == 'IMG' && me.body.contentEditable!=\"false\") {\n\n                    if (img.className.indexOf(\"edui-faked-music\") != -1 ||\n                        img.getAttribute(\"anchorname\") ||\n                        domUtils.hasClass(img, 'loadingclass') ||\n                        domUtils.hasClass(img, 'loaderrorclass')) { return }\n\n                    if (!imageScale) {\n                        imageScale = new Scale();\n                        imageScale.init(me);\n                        me.ui.getDom().appendChild(imageScale.resizer);\n\n                        var _keyDownHandler = function (e) {\n                            imageScale.hide();\n                            if(imageScale.target) me.selection.getRange().selectNode(imageScale.target).select();\n                        }, _mouseDownHandler = function (e) {\n                            var ele = e.target || e.srcElement;\n                            if (ele && (ele.className===undefined || ele.className.indexOf('edui-editor-imagescale') == -1)) {\n                                _keyDownHandler(e);\n                            }\n                        }, timer;\n\n                        me.addListener('afterscaleshow', function (e) {\n                            me.addListener('beforekeydown', _keyDownHandler);\n                            me.addListener('beforemousedown', _mouseDownHandler);\n                            domUtils.on(document, 'keydown', _keyDownHandler);\n                            domUtils.on(document,'mousedown', _mouseDownHandler);\n                            me.selection.getNative().removeAllRanges();\n                        });\n                        me.addListener('afterscalehide', function (e) {\n                            me.removeListener('beforekeydown', _keyDownHandler);\n                            me.removeListener('beforemousedown', _mouseDownHandler);\n                            domUtils.un(document, 'keydown', _keyDownHandler);\n                            domUtils.un(document,'mousedown', _mouseDownHandler);\n                            var target = imageScale.target;\n                            if (target.parentNode) {\n                                me.selection.getRange().selectNode(target).select();\n                            }\n                        });\n                        //TODO 有iframe的情况，mousedown不能往下传。。\n                        domUtils.on(imageScale.resizer, 'mousedown', function (e) {\n                            me.selection.getNative().removeAllRanges();\n                            var ele = e.target || e.srcElement;\n                            if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) {\n                                timer = setTimeout(function () {\n                                    imageScale.hide();\n                                    if(imageScale.target) me.selection.getRange().selectNode(ele).select();\n                                }, 200);\n                            }\n                        });\n                        domUtils.on(imageScale.resizer, 'mouseup', function (e) {\n                            var ele = e.target || e.srcElement;\n                            if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) {\n                                clearTimeout(timer);\n                            }\n                        });\n                    }\n                    imageScale.show(img);\n                } else {\n                    if (imageScale && imageScale.resizer.style.display != 'none') imageScale.hide();\n                }\n            });\n        }\n\n        if (browser.webkit) {\n            me.addListener('click', function (type, e) {\n                if (e.target.tagName == 'IMG' && me.body.contentEditable!=\"false\") {\n                    var range = new dom.Range(me.document);\n                    range.selectNode(e.target).select();\n                }\n            });\n        }\n    }\n})();\n\n// plugins/autolink.js\n///import core\n///commands 为非ie浏览器自动添加a标签\n///commandsName  AutoLink\n///commandsTitle  自动增加链接\n/**\n * @description 为非ie浏览器自动添加a标签\n * @author zhanyi\n */\n\nUE.plugin.register('autolink',function(){\n    var cont = 0;\n\n    return !browser.ie ? {\n\n            bindEvents:{\n                'reset' : function(){\n                    cont = 0;\n                },\n                'keydown':function(type, evt) {\n                    var me = this;\n                    var keyCode = evt.keyCode || evt.which;\n\n                    if (keyCode == 32 || keyCode == 13) {\n\n                        var sel = me.selection.getNative(),\n                            range = sel.getRangeAt(0).cloneRange(),\n                            offset,\n                            charCode;\n\n                        var start = range.startContainer;\n                        while (start.nodeType == 1 && range.startOffset > 0) {\n                            start = range.startContainer.childNodes[range.startOffset - 1];\n                            if (!start){\n                                break;\n                            }\n                            range.setStart(start, start.nodeType == 1 ? start.childNodes.length : start.nodeValue.length);\n                            range.collapse(true);\n                            start = range.startContainer;\n                        }\n\n                        do{\n                            if (range.startOffset == 0) {\n                                start = range.startContainer.previousSibling;\n\n                                while (start && start.nodeType == 1) {\n                                    start = start.lastChild;\n                                }\n                                if (!start || domUtils.isFillChar(start)){\n                                    break;\n                                }\n                                offset = start.nodeValue.length;\n                            } else {\n                                start = range.startContainer;\n                                offset = range.startOffset;\n                            }\n                            range.setStart(start, offset - 1);\n                            charCode = range.toString().charCodeAt(0);\n                        } while (charCode != 160 && charCode != 32);\n\n                        if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\\/\\/|ssh:\\/\\/|ftp:\\/\\/|file:\\/|www\\.)/i)) {\n                            while(range.toString().length){\n                                if(/^(?:https?:\\/\\/|ssh:\\/\\/|ftp:\\/\\/|file:\\/|www\\.)/i.test(range.toString())){\n                                    break;\n                                }\n                                try{\n                                    range.setStart(range.startContainer,range.startOffset+1);\n                                }catch(e){\n                                    //trace:2121\n                                    var start = range.startContainer;\n                                    while(!(next = start.nextSibling)){\n                                        if(domUtils.isBody(start)){\n                                            return;\n                                        }\n                                        start = start.parentNode;\n\n                                    }\n                                    range.setStart(next,0);\n\n                                }\n\n                            }\n                            //range的开始边界已经在a标签里的不再处理\n                            if(domUtils.findParentByTagName(range.startContainer,'a',true)){\n                                return;\n                            }\n                            var a = me.document.createElement('a'),text = me.document.createTextNode(' '),href;\n\n                            me.undoManger && me.undoManger.save();\n                            a.appendChild(range.extractContents());\n                            a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g,'');\n                            href = a.getAttribute(\"href\").replace(new RegExp(domUtils.fillChar,'g'),'');\n                            href = /^(?:https?:\\/\\/)/ig.test(href) ? href : \"http://\"+ href;\n                            a.setAttribute('_src',utils.html(href));\n                            a.href = utils.html(href);\n\n                            range.insertNode(a);\n                            a.parentNode.insertBefore(text, a.nextSibling);\n                            range.setStart(text, 0);\n                            range.collapse(true);\n                            sel.removeAllRanges();\n                            sel.addRange(range);\n                            me.undoManger && me.undoManger.save();\n                        }\n                    }\n                }\n            }\n        }:{}\n    },function(){\n        var keyCodes = {\n            37:1, 38:1, 39:1, 40:1,\n            13:1,32:1\n        };\n        function checkIsCludeLink(node){\n            if(node.nodeType == 3){\n                return null\n            }\n            if(node.nodeName == 'A'){\n                return node;\n            }\n            var lastChild = node.lastChild;\n\n            while(lastChild){\n                if(lastChild.nodeName == 'A'){\n                    return lastChild;\n                }\n                if(lastChild.nodeType == 3){\n                    if(domUtils.isWhitespace(lastChild)){\n                        lastChild = lastChild.previousSibling;\n                        continue;\n                    }\n                    return null\n                }\n                lastChild = lastChild.lastChild;\n            }\n        }\n        browser.ie && this.addListener('keyup',function(cmd,evt){\n            var me = this,keyCode = evt.keyCode;\n            if(keyCodes[keyCode]){\n                var rng = me.selection.getRange();\n                var start = rng.startContainer;\n\n                if(keyCode == 13){\n                    while(start && !domUtils.isBody(start) && !domUtils.isBlockElm(start)){\n                        start = start.parentNode;\n                    }\n                    if(start && !domUtils.isBody(start) && start.nodeName == 'P'){\n                        var pre = start.previousSibling;\n                        if(pre && pre.nodeType == 1){\n                            var pre = checkIsCludeLink(pre);\n                            if(pre && !pre.getAttribute('_href')){\n                                domUtils.remove(pre,true);\n                            }\n                        }\n                    }\n                }else if(keyCode == 32 ){\n                    if(start.nodeType == 3 && /^\\s$/.test(start.nodeValue)){\n                        start = start.previousSibling;\n                        if(start && start.nodeName == 'A' && !start.getAttribute('_href')){\n                            domUtils.remove(start,true);\n                        }\n                    }\n                }else {\n                    start = domUtils.findParentByTagName(start,'a',true);\n                    if(start && !start.getAttribute('_href')){\n                        var bk = rng.createBookmark();\n\n                        domUtils.remove(start,true);\n                        rng.moveToBookmark(bk).select(true)\n                    }\n                }\n\n            }\n\n\n        });\n    }\n);\n\n// plugins/autoheight.js\n///import core\n///commands 当输入内容超过编辑器高度时，编辑器自动增高\n///commandsName  AutoHeight,autoHeightEnabled\n///commandsTitle  自动增高\n/**\n * @description 自动伸展\n * @author zhanyi\n */\nUE.plugins['autoheight'] = function () {\n    var me = this;\n    //提供开关，就算加载也可以关闭\n    me.autoHeightEnabled = me.options.autoHeightEnabled !== false;\n    if (!me.autoHeightEnabled) {\n        return;\n    }\n\n    var bakOverflow,\n        lastHeight = 0,\n        options = me.options,\n        currentHeight,\n        timer;\n\n    function adjustHeight() {\n        var me = this;\n        clearTimeout(timer);\n        if(isFullscreen)return;\n        if (!me.queryCommandState || me.queryCommandState && me.queryCommandState('source') != 1) {\n            timer = setTimeout(function(){\n\n                var node = me.body.lastChild;\n                while(node && node.nodeType != 1){\n                    node = node.previousSibling;\n                }\n                if(node && node.nodeType == 1){\n                    node.style.clear = 'both';\n                    currentHeight = Math.max(domUtils.getXY(node).y + node.offsetHeight + 25 ,Math.max(options.minFrameHeight, options.initialFrameHeight)) ;\n                    if (currentHeight != lastHeight) {\n                        if (currentHeight !== parseInt(me.iframe.parentNode.style.height)) {\n                            me.iframe.parentNode.style.height = currentHeight + 'px';\n                        }\n                        me.body.style.height = currentHeight + 'px';\n                        lastHeight = currentHeight;\n                    }\n                    domUtils.removeStyle(node,'clear');\n                }\n\n\n            },50)\n        }\n    }\n    var isFullscreen;\n    me.addListener('fullscreenchanged',function(cmd,f){\n        isFullscreen = f\n    });\n    me.addListener('destroy', function () {\n        me.removeListener('contentchange afterinserthtml keyup mouseup',adjustHeight)\n    });\n    me.enableAutoHeight = function () {\n        var me = this;\n        if (!me.autoHeightEnabled) {\n            return;\n        }\n        var doc = me.document;\n        me.autoHeightEnabled = true;\n        bakOverflow = doc.body.style.overflowY;\n        doc.body.style.overflowY = 'hidden';\n        me.addListener('contentchange afterinserthtml keyup mouseup',adjustHeight);\n        //ff不给事件算得不对\n\n        setTimeout(function () {\n            adjustHeight.call(me);\n        }, browser.gecko ? 100 : 0);\n        me.fireEvent('autoheightchanged', me.autoHeightEnabled);\n    };\n    me.disableAutoHeight = function () {\n\n        me.body.style.overflowY = bakOverflow || '';\n\n        me.removeListener('contentchange', adjustHeight);\n        me.removeListener('keyup', adjustHeight);\n        me.removeListener('mouseup', adjustHeight);\n        me.autoHeightEnabled = false;\n        me.fireEvent('autoheightchanged', me.autoHeightEnabled);\n    };\n\n    me.on('setHeight',function(){\n        me.disableAutoHeight()\n    });\n    me.addListener('ready', function () {\n        me.enableAutoHeight();\n        //trace:1764\n        var timer;\n        domUtils.on(browser.ie ? me.body : me.document, browser.webkit ? 'dragover' : 'drop', function () {\n            clearTimeout(timer);\n            timer = setTimeout(function () {\n                //trace:3681\n                adjustHeight.call(me);\n            }, 100);\n\n        });\n        //修复内容过多时，回到顶部，顶部内容被工具栏遮挡问题\n        var lastScrollY;\n        window.onscroll = function(){\n            if(lastScrollY === null){\n                lastScrollY = this.scrollY\n            }else if(this.scrollY == 0 && lastScrollY != 0){\n                me.window.scrollTo(0,0);\n                lastScrollY = null;\n            }\n        }\n    });\n\n\n};\n\n\n\n// plugins/autofloat.js\n///import core\n///commands 悬浮工具栏\n///commandsName  AutoFloat,autoFloatEnabled\n///commandsTitle  悬浮工具栏\n/**\n *  modified by chengchao01\n *  注意： 引入此功能后，在IE6下会将body的背景图片覆盖掉！\n */\nUE.plugins['autofloat'] = function() {\n    var me = this,\n        lang = me.getLang();\n    me.setOpt({\n        topOffset:0\n    });\n    var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false,\n        topOffset = me.options.topOffset;\n\n\n    //如果不固定toolbar的位置，则直接退出\n    if(!optsAutoFloatEnabled){\n        return;\n    }\n    var uiUtils = UE.ui.uiUtils,\n        LteIE6 = browser.ie && browser.version <= 6,\n        quirks = browser.quirks;\n\n    function checkHasUI(){\n        if(!UE.ui){\n            alert(lang.autofloatMsg);\n            return 0;\n        }\n        return 1;\n    }\n    function fixIE6FixedPos(){\n        var docStyle = document.body.style;\n        docStyle.backgroundImage = 'url(\"about:blank\")';\n        docStyle.backgroundAttachment = 'fixed';\n    }\n    var\tbakCssText,\n        placeHolder = document.createElement('div'),\n        toolbarBox,orgTop,\n        getPosition,\n        flag =true;   //ie7模式下需要偏移\n    function setFloating(){\n        var toobarBoxPos = domUtils.getXY(toolbarBox),\n            origalFloat = domUtils.getComputedStyle(toolbarBox,'position'),\n            origalLeft = domUtils.getComputedStyle(toolbarBox,'left');\n        toolbarBox.style.width = toolbarBox.offsetWidth + 'px';\n        toolbarBox.style.zIndex = me.options.zIndex * 1 + 1;\n        toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox);\n        if (LteIE6 || (quirks && browser.ie)) {\n            if(toolbarBox.style.position != 'absolute'){\n                toolbarBox.style.position = 'absolute';\n            }\n            toolbarBox.style.top = (document.body.scrollTop||document.documentElement.scrollTop) - orgTop + topOffset  + 'px';\n        } else {\n            if (browser.ie7Compat && flag) {\n                flag = false;\n                toolbarBox.style.left =  domUtils.getXY(toolbarBox).x - document.documentElement.getBoundingClientRect().left+2  + 'px';\n            }\n            if(toolbarBox.style.position != 'fixed'){\n                toolbarBox.style.position = 'fixed';\n                toolbarBox.style.top = topOffset +\"px\";\n                ((origalFloat == 'absolute' || origalFloat == 'relative') && parseFloat(origalLeft)) && (toolbarBox.style.left = toobarBoxPos.x + 'px');\n            }\n        }\n    }\n    function unsetFloating(){\n        flag = true;\n        if(placeHolder.parentNode){\n            placeHolder.parentNode.removeChild(placeHolder);\n        }\n\n        toolbarBox.style.cssText = bakCssText;\n    }\n\n    function updateFloating(){\n        var rect3 = getPosition(me.container);\n        var offset=me.options.toolbarTopOffset||0;\n        if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) {\n            setFloating();\n        }else{\n            unsetFloating();\n        }\n    }\n    var defer_updateFloating = utils.defer(function(){\n        updateFloating();\n    },browser.ie ? 200 : 100,true);\n\n    me.addListener('destroy',function(){\n        domUtils.un(window, ['scroll','resize'], updateFloating);\n        me.removeListener('keydown', defer_updateFloating);\n    });\n\n    me.addListener('ready', function(){\n        if(checkHasUI(me)){\n            //加载了ui组件，但在new时，没有加载ui，导致编辑器实例上没有ui类，所以这里做判断\n            if(!me.ui){\n                return;\n            }\n            getPosition = uiUtils.getClientRect;\n            toolbarBox = me.ui.getDom('toolbarbox');\n            orgTop = getPosition(toolbarBox).top;\n            bakCssText = toolbarBox.style.cssText;\n            placeHolder.style.height = toolbarBox.offsetHeight + 'px';\n            if(LteIE6){\n                fixIE6FixedPos();\n            }\n            domUtils.on(window, ['scroll','resize'], updateFloating);\n            me.addListener('keydown', defer_updateFloating);\n\n            me.addListener('beforefullscreenchange', function (t, enabled){\n                if (enabled) {\n                    unsetFloating();\n                }\n            });\n            me.addListener('fullscreenchanged', function (t, enabled){\n                if (!enabled) {\n                    updateFloating();\n                }\n            });\n            me.addListener('sourcemodechanged', function (t, enabled){\n                setTimeout(function (){\n                    updateFloating();\n                },0);\n            });\n            me.addListener(\"clearDoc\",function(){\n                setTimeout(function(){\n                    updateFloating();\n                },0);\n\n            })\n        }\n    });\n};\n\n\n// plugins/video.js\n/**\n * video插件， 为UEditor提供视频插入支持\n * @file\n * @since 1.2.6.1\n */\n\nUE.plugins['video'] = function (){\n    var me =this;\n\n    /**\n     * 创建插入视频字符窜\n     * @param url 视频地址\n     * @param width 视频宽度\n     * @param height 视频高度\n     * @param align 视频对齐\n     * @param toEmbed 是否以flash代替显示\n     * @param addParagraph  是否需要添加P 标签\n     */\n    function creatInsertStr(url,width,height,id,align,classname,type){\n\n        url = utils.unhtmlForUrl(url);\n        align = utils.unhtml(align);\n        classname = utils.unhtml(classname);\n\n        width = parseInt(width, 10) || 0;\n        height = parseInt(height, 10) || 0;\n\n        var str;\n        switch (type){\n            case 'image':\n                str = '<img ' + (id ? 'id=\"' + id+'\"' : '') + ' width=\"'+ width +'\" height=\"' + height + '\" _url=\"'+url+'\" class=\"' + classname.replace(/\\bvideo-js\\b/, '') + '\"'  +\n                    ' src=\"' + me.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif\" style=\"background:url('+me.options.UEDITOR_HOME_URL+'themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;'+(align ? 'float:' + align + ';': '')+'\" />'\n                break;\n            case 'embed':\n                str = '<embed type=\"application/x-shockwave-flash\" class=\"' + classname + '\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"' +\n                    ' src=\"' +  utils.html(url) + '\" width=\"' + width  + '\" height=\"' + height  + '\"'  + (align ? ' style=\"float:' + align + '\"': '') +\n                    ' wmode=\"transparent\" play=\"true\" loop=\"false\" menu=\"false\" allowscriptaccess=\"never\" allowfullscreen=\"true\" >';\n                break;\n            case 'video':\n                var ext = url.substr(url.lastIndexOf('.') + 1);\n                if(ext == 'ogv') ext = 'ogg';\n                str = '<video' + (id ? ' id=\"' + id + '\"' : '') + ' class=\"' + classname + ' video-js\" ' + (align ? ' style=\"float:' + align + '\"': '') +\n                    ' controls preload=\"none\" width=\"' + width + '\" height=\"' + height + '\" src=\"' + url + '\" data-setup=\"{}\">' +\n                    '<source src=\"' + url + '\" type=\"video/' + ext + '\" /></video>';\n                break;\n        }\n        return str;\n    }\n\n    function switchImgAndVideo(root,img2video){\n        utils.each(root.getNodesByTagName(img2video ? 'img' : 'embed video'),function(node){\n            var className = node.getAttr('class');\n            if(className && className.indexOf('edui-faked-video') != -1){\n                var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'embed':'image');\n                node.parentNode.replaceChild(UE.uNode.createElement(html),node);\n            }\n            if(className && className.indexOf('edui-upload-video') != -1){\n                var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'video':'image');\n                node.parentNode.replaceChild(UE.uNode.createElement(html),node);\n            }\n        })\n    }\n\n    me.addOutputRule(function(root){\n        switchImgAndVideo(root,true)\n    });\n    me.addInputRule(function(root){\n        switchImgAndVideo(root)\n    });\n\n    /**\n     * 插入视频\n     * @command insertvideo\n     * @method execCommand\n     * @param { String } cmd 命令字符串\n     * @param { Object } videoAttr 键值对对象， 描述一个视频的所有属性\n     * @example\n     * ```javascript\n     *\n     * var videoAttr = {\n     *      //视频地址\n     *      url: 'http://www.youku.com/xxx',\n     *      //视频宽高值， 单位px\n     *      width: 200,\n     *      height: 100\n     * };\n     *\n     * //editor 是编辑器实例\n     * //向编辑器插入单个视频\n     * editor.execCommand( 'insertvideo', videoAttr );\n     * ```\n     */\n\n    /**\n     * 插入视频\n     * @command insertvideo\n     * @method execCommand\n     * @param { String } cmd 命令字符串\n     * @param { Array } videoArr 需要插入的视频的数组， 其中的每一个元素都是一个键值对对象， 描述了一个视频的所有属性\n     * @example\n     * ```javascript\n     *\n     * var videoAttr1 = {\n     *      //视频地址\n     *      url: 'http://www.youku.com/xxx',\n     *      //视频宽高值， 单位px\n     *      width: 200,\n     *      height: 100\n     * },\n     * videoAttr2 = {\n     *      //视频地址\n     *      url: 'http://www.youku.com/xxx',\n     *      //视频宽高值， 单位px\n     *      width: 200,\n     *      height: 100\n     * }\n     *\n     * //editor 是编辑器实例\n     * //该方法将会向编辑器内插入两个视频\n     * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] );\n     * ```\n     */\n\n    /**\n     * 查询当前光标所在处是否是一个视频\n     * @command insertvideo\n     * @method queryCommandState\n     * @param { String } cmd 需要查询的命令字符串\n     * @return { int } 如果当前光标所在处的元素是一个视频对象， 则返回1，否则返回0\n     * @example\n     * ```javascript\n     *\n     * //editor 是编辑器实例\n     * editor.queryCommandState( 'insertvideo' );\n     * ```\n     */\n    me.commands[\"insertvideo\"] = {\n        execCommand: function (cmd, videoObjs, type){\n            videoObjs = utils.isArray(videoObjs)?videoObjs:[videoObjs];\n            var html = [],id = 'tmpVedio', cl;\n            for(var i=0,vi,len = videoObjs.length;i<len;i++){\n                vi = videoObjs[i];\n                cl = (type == 'upload' ? 'edui-upload-video video-js vjs-default-skin':'edui-faked-video');\n                html.push(creatInsertStr( vi.url, vi.width || 420,  vi.height || 280, id + i, null, cl, 'image'));\n            }\n            me.execCommand(\"inserthtml\",html.join(\"\"),true);\n            var rng = this.selection.getRange();\n            for(var i= 0,len=videoObjs.length;i<len;i++){\n                var img = this.document.getElementById('tmpVedio'+i);\n                domUtils.removeAttributes(img,'id');\n                rng.selectNode(img).select();\n                me.execCommand('imagefloat',videoObjs[i].align)\n            }\n        },\n        queryCommandState : function(){\n            var img = me.selection.getRange().getClosedNode(),\n                flag = img && (img.className == \"edui-faked-video\" || img.className.indexOf(\"edui-upload-video\")!=-1);\n            return flag ? 1 : 0;\n        }\n    };\n};\n\n\n// plugins/table.core.js\n/**\n * Created with JetBrains WebStorm.\n * User: taoqili\n * Date: 13-1-18\n * Time: 上午11:09\n * To change this template use File | Settings | File Templates.\n */\n/**\n * UE表格操作类\n * @param table\n * @constructor\n */\n(function () {\n    var UETable = UE.UETable = function (table) {\n        this.table = table;\n        this.indexTable = [];\n        this.selectedTds = [];\n        this.cellsRange = {};\n        this.update(table);\n    };\n\n    //===以下为静态工具方法===\n    UETable.removeSelectedClass = function (cells) {\n        utils.each(cells, function (cell) {\n            domUtils.removeClasses(cell, \"selectTdClass\");\n        })\n    };\n    UETable.addSelectedClass = function (cells) {\n        utils.each(cells, function (cell) {\n            domUtils.addClass(cell, \"selectTdClass\");\n        })\n    };\n    UETable.isEmptyBlock = function (node) {\n        var reg = new RegExp(domUtils.fillChar, 'g');\n        if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\\s*$/, '').replace(reg, '').length > 0) {\n            return 0;\n        }\n        for (var i in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(i)) {\n            if (node.getElementsByTagName(i).length) {\n                return 0;\n            }\n        }\n        return 1;\n    };\n    UETable.getWidth = function (cell) {\n        if (!cell)return 0;\n        return parseInt(domUtils.getComputedStyle(cell, \"width\"), 10);\n    };\n\n    /**\n     * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组， 只有在满足所有单元格的 水平和竖直 对齐属性都相同的\n     * 条件时才会返回其状态值，否则将返回null； 如果当前只检测了一个单元格， 则直接返回当前单元格的对齐状态；\n     * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组\n     * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null\n     */\n    UETable.getTableCellAlignState = function ( cells ) {\n\n        !utils.isArray( cells ) && ( cells = [cells] );\n\n        var result = {},\n            status = ['align', 'valign'],\n            tempStatus = null,\n            isSame = true;//状态是否相同\n\n        utils.each( cells, function( cellNode ){\n\n            utils.each( status, function( currentState ){\n\n                tempStatus = cellNode.getAttribute( currentState );\n\n                if( !result[ currentState ] && tempStatus ) {\n                    result[ currentState ] = tempStatus;\n                } else if( !result[ currentState ] || ( tempStatus !== result[ currentState ] ) ) {\n                    isSame = false;\n                    return false;\n                }\n\n            } );\n\n            return isSame;\n\n        });\n\n        return isSame ? result : null;\n\n    };\n\n    /**\n     * 根据当前选区获取相关的table信息\n     * @return {Object}\n     */\n    UETable.getTableItemsByRange = function (editor) {\n        var start = editor.selection.getStart();\n\n        //ff下会选中bookmark\n        if( start && start.id && start.id.indexOf('_baidu_bookmark_start_') === 0 && start.nextSibling) {\n            start = start.nextSibling;\n        }\n\n        //在table或者td边缘有可能存在选中tr的情况\n        var cell = start && domUtils.findParentByTagName(start, [\"td\", \"th\"], true),\n            tr = cell && cell.parentNode,\n            caption = start && domUtils.findParentByTagName(start, 'caption', true),\n            table = caption ? caption.parentNode : tr && tr.parentNode.parentNode;\n\n        return {\n            cell:cell,\n            tr:tr,\n            table:table,\n            caption:caption\n        }\n    };\n    UETable.getUETableBySelected = function (editor) {\n        var table = UETable.getTableItemsByRange(editor).table;\n        if (table && table.ueTable && table.ueTable.selectedTds.length) {\n            return table.ueTable;\n        }\n        return null;\n    };\n\n    UETable.getDefaultValue = function (editor, table) {\n        var borderMap = {\n                thin:'0px',\n                medium:'1px',\n                thick:'2px'\n            },\n            tableBorder, tdPadding, tdBorder, tmpValue;\n        if (!table) {\n            table = editor.document.createElement('table');\n            table.insertRow(0).insertCell(0).innerHTML = 'xxx';\n            editor.body.appendChild(table);\n            var td = table.getElementsByTagName('td')[0];\n            tmpValue = domUtils.getComputedStyle(table, 'border-left-width');\n            tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10);\n            tmpValue = domUtils.getComputedStyle(td, 'padding-left');\n            tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10);\n            tmpValue = domUtils.getComputedStyle(td, 'border-left-width');\n            tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10);\n            domUtils.remove(table);\n            return {\n                tableBorder:tableBorder,\n                tdPadding:tdPadding,\n                tdBorder:tdBorder\n            };\n        } else {\n            td = table.getElementsByTagName('td')[0];\n            tmpValue = domUtils.getComputedStyle(table, 'border-left-width');\n            tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10);\n            tmpValue = domUtils.getComputedStyle(td, 'padding-left');\n            tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10);\n            tmpValue = domUtils.getComputedStyle(td, 'border-left-width');\n            tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10);\n            return {\n                tableBorder:tableBorder,\n                tdPadding:tdPadding,\n                tdBorder:tdBorder\n            };\n        }\n    };\n    /**\n     * 根据当前点击的td或者table获取索引对象\n     * @param tdOrTable\n     */\n    UETable.getUETable = function (tdOrTable) {\n        var tag = tdOrTable.tagName.toLowerCase();\n        tdOrTable = (tag == \"td\" || tag == \"th\" || tag == 'caption') ? domUtils.findParentByTagName(tdOrTable, \"table\", true) : tdOrTable;\n        if (!tdOrTable.ueTable) {\n            tdOrTable.ueTable = new UETable(tdOrTable);\n        }\n        return tdOrTable.ueTable;\n    };\n\n    UETable.cloneCell = function(cell,ignoreMerge,keepPro){\n        if (!cell || utils.isString(cell)) {\n            return this.table.ownerDocument.createElement(cell || 'td');\n        }\n        var flag = domUtils.hasClass(cell, \"selectTdClass\");\n        flag && domUtils.removeClasses(cell, \"selectTdClass\");\n        var tmpCell = cell.cloneNode(true);\n        if (ignoreMerge) {\n            tmpCell.rowSpan = tmpCell.colSpan = 1;\n        }\n        //去掉宽高\n        !keepPro && domUtils.removeAttributes(tmpCell,'width height');\n        !keepPro && domUtils.removeAttributes(tmpCell,'style');\n\n        tmpCell.style.borderLeftStyle = \"\";\n        tmpCell.style.borderTopStyle = \"\";\n        tmpCell.style.borderLeftColor = cell.style.borderRightColor;\n        tmpCell.style.borderLeftWidth = cell.style.borderRightWidth;\n        tmpCell.style.borderTopColor = cell.style.borderBottomColor;\n        tmpCell.style.borderTopWidth = cell.style.borderBottomWidth;\n        flag && domUtils.addClass(cell, \"selectTdClass\");\n        return tmpCell;\n    }\n\n    UETable.prototype = {\n        getMaxRows:function () {\n            var rows = this.table.rows, maxLen = 1;\n            for (var i = 0, row; row = rows[i]; i++) {\n                var currentMax = 1;\n                for (var j = 0, cj; cj = row.cells[j++];) {\n                    currentMax = Math.max(cj.rowSpan || 1, currentMax);\n                }\n                maxLen = Math.max(currentMax + i, maxLen);\n            }\n            return maxLen;\n        },\n        /**\n         * 获取当前表格的最大列数\n         */\n        getMaxCols:function () {\n            var rows = this.table.rows, maxLen = 0, cellRows = {};\n            for (var i = 0, row; row = rows[i]; i++) {\n                var cellsNum = 0;\n                for (var j = 0, cj; cj = row.cells[j++];) {\n                    cellsNum += (cj.colSpan || 1);\n                    if (cj.rowSpan && cj.rowSpan > 1) {\n                        for (var k = 1; k < cj.rowSpan; k++) {\n                            if (!cellRows['row_' + (i + k)]) {\n                                cellRows['row_' + (i + k)] = (cj.colSpan || 1);\n                            } else {\n                                cellRows['row_' + (i + k)]++\n                            }\n                        }\n\n                    }\n                }\n                cellsNum += cellRows['row_' + i] || 0;\n                maxLen = Math.max(cellsNum, maxLen);\n            }\n            return maxLen;\n        },\n        getCellColIndex:function (cell) {\n\n        },\n        /**\n         * 获取当前cell旁边的单元格，\n         * @param cell\n         * @param right\n         */\n        getHSideCell:function (cell, right) {\n            try {\n                var cellInfo = this.getCellInfo(cell),\n                    previewRowIndex, previewColIndex;\n                var len = this.selectedTds.length,\n                    range = this.cellsRange;\n                //首行或者首列没有前置单元格\n                if ((!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (right && (!len ? (cellInfo.colIndex == (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null;\n\n                previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex;\n                previewColIndex = !right ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1)\n                    : ( !len ? cellInfo.colIndex + 1 : range.endColIndex + 1);\n                return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex);\n            } catch (e) {\n                showError(e);\n            }\n        },\n        getTabNextCell:function (cell, preRowIndex) {\n            var cellInfo = this.getCellInfo(cell),\n                rowIndex = preRowIndex || cellInfo.rowIndex,\n                colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1),\n                nextCell;\n            try {\n                nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex);\n            } catch (e) {\n                try {\n                    rowIndex = rowIndex * 1 + 1;\n                    colIndex = 0;\n                    nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex);\n                } catch (e) {\n                }\n            }\n            return nextCell;\n\n        },\n        /**\n         * 获取视觉上的后置单元格\n         * @param cell\n         * @param bottom\n         */\n        getVSideCell:function (cell, bottom, ignoreRange) {\n            try {\n                var cellInfo = this.getCellInfo(cell),\n                    nextRowIndex, nextColIndex;\n                var len = this.selectedTds.length && !ignoreRange,\n                    range = this.cellsRange;\n                //末行或者末列没有后置单元格\n                if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null;\n\n                nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1)\n                    : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1);\n                nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex;\n                return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex);\n            } catch (e) {\n                showError(e);\n            }\n        },\n        /**\n         * 获取相同结束位置的单元格，xOrY指代了是获取x轴相同还是y轴相同\n         */\n        getSameEndPosCells:function (cell, xOrY) {\n            try {\n                var flag = (xOrY.toLowerCase() === \"x\"),\n                    end = domUtils.getXY(cell)[flag ? 'x' : 'y'] + cell[\"offset\" + (flag ? 'Width' : 'Height')],\n                    rows = this.table.rows,\n                    cells = null, returns = [];\n                for (var i = 0; i < this.rowsNum; i++) {\n                    cells = rows[i].cells;\n                    for (var j = 0, tmpCell; tmpCell = cells[j++];) {\n                        var tmpEnd = domUtils.getXY(tmpCell)[flag ? 'x' : 'y'] + tmpCell[\"offset\" + (flag ? 'Width' : 'Height')];\n                        //对应行的td已经被上面行rowSpan了\n                        if (tmpEnd > end && flag) break;\n                        if (cell == tmpCell || end == tmpEnd) {\n                            //只获取单一的单元格\n                            //todo 仅获取单一单元格在特定情况下会造成returns为空，从而影响后续的拖拽实现，修正这个。需考虑性能\n                            if (tmpCell[flag ? \"colSpan\" : \"rowSpan\"] == 1) {\n                                returns.push(tmpCell);\n                            }\n                            if (flag) break;\n                        }\n                    }\n                }\n                return returns;\n            } catch (e) {\n                showError(e);\n            }\n        },\n        setCellContent:function (cell, content) {\n            cell.innerHTML = content || (browser.ie ? domUtils.fillChar : \"<br />\");\n        },\n        cloneCell:UETable.cloneCell,\n        /**\n         * 获取跟当前单元格的右边竖线为左边的所有未合并单元格\n         */\n        getSameStartPosXCells:function (cell) {\n            try {\n                var start = domUtils.getXY(cell).x + cell.offsetWidth,\n                    rows = this.table.rows, cells , returns = [];\n                for (var i = 0; i < this.rowsNum; i++) {\n                    cells = rows[i].cells;\n                    for (var j = 0, tmpCell; tmpCell = cells[j++];) {\n                        var tmpStart = domUtils.getXY(tmpCell).x;\n                        if (tmpStart > start) break;\n                        if (tmpStart == start && tmpCell.colSpan == 1) {\n                            returns.push(tmpCell);\n                            break;\n                        }\n                    }\n                }\n                return returns;\n            } catch (e) {\n                showError(e);\n            }\n        },\n        /**\n         * 更新table对应的索引表\n         */\n        update:function (table) {\n            this.table = table || this.table;\n            this.selectedTds = [];\n            this.cellsRange = {};\n            this.indexTable = [];\n            var rows = this.table.rows,\n                rowsNum = this.getMaxRows(),\n                dNum = rowsNum - rows.length,\n                colsNum = this.getMaxCols();\n            while (dNum--) {\n                this.table.insertRow(rows.length);\n            }\n            this.rowsNum = rowsNum;\n            this.colsNum = colsNum;\n            for (var i = 0, len = rows.length; i < len; i++) {\n                this.indexTable[i] = new Array(colsNum);\n            }\n            //填充索引表\n            for (var rowIndex = 0, row; row = rows[rowIndex]; rowIndex++) {\n                for (var cellIndex = 0, cell, cells = row.cells; cell = cells[cellIndex]; cellIndex++) {\n                    //修正整行被rowSpan时导致的行数计算错误\n                    if (cell.rowSpan > rowsNum) {\n                        cell.rowSpan = rowsNum;\n                    }\n                    var colIndex = cellIndex,\n                        rowSpan = cell.rowSpan || 1,\n                        colSpan = cell.colSpan || 1;\n                    //当已经被上一行rowSpan或者被前一列colSpan了，则跳到下一个单元格进行\n                    while (this.indexTable[rowIndex][colIndex]) colIndex++;\n                    for (var j = 0; j < rowSpan; j++) {\n                        for (var k = 0; k < colSpan; k++) {\n                            this.indexTable[rowIndex + j][colIndex + k] = {\n                                rowIndex:rowIndex,\n                                cellIndex:cellIndex,\n                                colIndex:colIndex,\n                                rowSpan:rowSpan,\n                                colSpan:colSpan\n                            }\n                        }\n                    }\n                }\n            }\n            //修复残缺td\n            for (j = 0; j < rowsNum; j++) {\n                for (k = 0; k < colsNum; k++) {\n                    if (this.indexTable[j][k] === undefined) {\n                        row = rows[j];\n                        cell = row.cells[row.cells.length - 1];\n                        cell = cell ? cell.cloneNode(true) : this.table.ownerDocument.createElement(\"td\");\n                        this.setCellContent(cell);\n                        if (cell.colSpan !== 1)cell.colSpan = 1;\n                        if (cell.rowSpan !== 1)cell.rowSpan = 1;\n                        row.appendChild(cell);\n                        this.indexTable[j][k] = {\n                            rowIndex:j,\n                            cellIndex:cell.cellIndex,\n                            colIndex:k,\n                            rowSpan:1,\n                            colSpan:1\n                        }\n                    }\n                }\n            }\n            //当框选后删除行或者列后撤销，需要重建选区。\n            var tds = domUtils.getElementsByTagName(this.table, \"td\"),\n                selectTds = [];\n            utils.each(tds, function (td) {\n                if (domUtils.hasClass(td, \"selectTdClass\")) {\n                    selectTds.push(td);\n                }\n            });\n            if (selectTds.length) {\n                var start = selectTds[0],\n                    end = selectTds[selectTds.length - 1],\n                    startInfo = this.getCellInfo(start),\n                    endInfo = this.getCellInfo(end);\n                this.selectedTds = selectTds;\n                this.cellsRange = {\n                    beginRowIndex:startInfo.rowIndex,\n                    beginColIndex:startInfo.colIndex,\n                    endRowIndex:endInfo.rowIndex + endInfo.rowSpan - 1,\n                    endColIndex:endInfo.colIndex + endInfo.colSpan - 1\n                };\n            }\n            //给第一行设置firstRow的样式名称,在排序图标的样式上使用到\n            if(!domUtils.hasClass(this.table.rows[0], \"firstRow\")) {\n                domUtils.addClass(this.table.rows[0], \"firstRow\");\n                for(var i = 1; i< this.table.rows.length; i++) {\n                    domUtils.removeClasses(this.table.rows[i], \"firstRow\");\n                }\n            }\n        },\n        /**\n         * 获取单元格的索引信息\n         */\n        getCellInfo:function (cell) {\n            if (!cell) return;\n            var cellIndex = cell.cellIndex,\n                rowIndex = cell.parentNode.rowIndex,\n                rowInfo = this.indexTable[rowIndex],\n                numCols = this.colsNum;\n            for (var colIndex = cellIndex; colIndex < numCols; colIndex++) {\n                var cellInfo = rowInfo[colIndex];\n                if (cellInfo.rowIndex === rowIndex && cellInfo.cellIndex === cellIndex) {\n                    return cellInfo;\n                }\n            }\n        },\n        /**\n         * 根据行列号获取单元格\n         */\n        getCell:function (rowIndex, cellIndex) {\n            return rowIndex < this.rowsNum && this.table.rows[rowIndex].cells[cellIndex] || null;\n        },\n        /**\n         * 删除单元格\n         */\n        deleteCell:function (cell, rowIndex) {\n            rowIndex = typeof rowIndex == 'number' ? rowIndex : cell.parentNode.rowIndex;\n            var row = this.table.rows[rowIndex];\n            row.deleteCell(cell.cellIndex);\n        },\n        /**\n         * 根据始末两个单元格获取被框选的所有单元格范围\n         */\n        getCellsRange:function (cellA, cellB) {\n            function checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex) {\n                var tmpBeginRowIndex = beginRowIndex,\n                    tmpBeginColIndex = beginColIndex,\n                    tmpEndRowIndex = endRowIndex,\n                    tmpEndColIndex = endColIndex,\n                    cellInfo, colIndex, rowIndex;\n                // 通过indexTable检查是否存在超出TableRange上边界的情况\n                if (beginRowIndex > 0) {\n                    for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) {\n                        cellInfo = me.indexTable[beginRowIndex][colIndex];\n                        rowIndex = cellInfo.rowIndex;\n                        if (rowIndex < beginRowIndex) {\n                            tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex);\n                        }\n                    }\n                }\n                // 通过indexTable检查是否存在超出TableRange右边界的情况\n                if (endColIndex < me.colsNum) {\n                    for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) {\n                        cellInfo = me.indexTable[rowIndex][endColIndex];\n                        colIndex = cellInfo.colIndex + cellInfo.colSpan - 1;\n                        if (colIndex > endColIndex) {\n                            tmpEndColIndex = Math.max(colIndex, tmpEndColIndex);\n                        }\n                    }\n                }\n                // 检查是否有超出TableRange下边界的情况\n                if (endRowIndex < me.rowsNum) {\n                    for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) {\n                        cellInfo = me.indexTable[endRowIndex][colIndex];\n                        rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1;\n                        if (rowIndex > endRowIndex) {\n                            tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex);\n                        }\n                    }\n                }\n                // 检查是否有超出TableRange左边界的情况\n                if (beginColIndex > 0) {\n                    for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) {\n                        cellInfo = me.indexTable[rowIndex][beginColIndex];\n                        colIndex = cellInfo.colIndex;\n                        if (colIndex < beginColIndex) {\n                            tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex);\n                        }\n                    }\n                }\n                //递归调用直至所有完成所有框选单元格的扩展\n                if (tmpBeginRowIndex != beginRowIndex || tmpBeginColIndex != beginColIndex || tmpEndRowIndex != endRowIndex || tmpEndColIndex != endColIndex) {\n                    return checkRange(tmpBeginRowIndex, tmpBeginColIndex, tmpEndRowIndex, tmpEndColIndex);\n                } else {\n                    // 不需要扩展TableRange的情况\n                    return {\n                        beginRowIndex:beginRowIndex,\n                        beginColIndex:beginColIndex,\n                        endRowIndex:endRowIndex,\n                        endColIndex:endColIndex\n                    };\n                }\n            }\n\n            try {\n                var me = this,\n                    cellAInfo = me.getCellInfo(cellA);\n                if (cellA === cellB) {\n                    return {\n                        beginRowIndex:cellAInfo.rowIndex,\n                        beginColIndex:cellAInfo.colIndex,\n                        endRowIndex:cellAInfo.rowIndex + cellAInfo.rowSpan - 1,\n                        endColIndex:cellAInfo.colIndex + cellAInfo.colSpan - 1\n                    };\n                }\n                var cellBInfo = me.getCellInfo(cellB);\n                // 计算TableRange的四个边\n                var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex),\n                    beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex),\n                    endRowIndex = Math.max(cellAInfo.rowIndex + cellAInfo.rowSpan - 1, cellBInfo.rowIndex + cellBInfo.rowSpan - 1),\n                    endColIndex = Math.max(cellAInfo.colIndex + cellAInfo.colSpan - 1, cellBInfo.colIndex + cellBInfo.colSpan - 1);\n\n                return checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex);\n            } catch (e) {\n                //throw e;\n            }\n        },\n        /**\n         * 依据cellsRange获取对应的单元格集合\n         */\n        getCells:function (range) {\n            //每次获取cells之前必须先清除上次的选择，否则会对后续获取操作造成影响\n            this.clearSelected();\n            var beginRowIndex = range.beginRowIndex,\n                beginColIndex = range.beginColIndex,\n                endRowIndex = range.endRowIndex,\n                endColIndex = range.endColIndex,\n                cellInfo, rowIndex, colIndex, tdHash = {}, returnTds = [];\n            for (var i = beginRowIndex; i <= endRowIndex; i++) {\n                for (var j = beginColIndex; j <= endColIndex; j++) {\n                    cellInfo = this.indexTable[i][j];\n                    rowIndex = cellInfo.rowIndex;\n                    colIndex = cellInfo.colIndex;\n                    // 如果Cells里已经包含了此Cell则跳过\n                    var key = rowIndex + '|' + colIndex;\n                    if (tdHash[key]) continue;\n                    tdHash[key] = 1;\n                    if (rowIndex < i || colIndex < j || rowIndex + cellInfo.rowSpan - 1 > endRowIndex || colIndex + cellInfo.colSpan - 1 > endColIndex) {\n                        return null;\n                    }\n                    returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex));\n                }\n            }\n            return returnTds;\n        },\n        /**\n         * 清理已经选中的单元格\n         */\n        clearSelected:function () {\n            UETable.removeSelectedClass(this.selectedTds);\n            this.selectedTds = [];\n            this.cellsRange = {};\n        },\n        /**\n         * 根据range设置已经选中的单元格\n         */\n        setSelected:function (range) {\n            var cells = this.getCells(range);\n            UETable.addSelectedClass(cells);\n            this.selectedTds = cells;\n            this.cellsRange = range;\n        },\n        isFullRow:function () {\n            var range = this.cellsRange;\n            return (range.endColIndex - range.beginColIndex + 1) == this.colsNum;\n        },\n        isFullCol:function () {\n            var range = this.cellsRange,\n                table = this.table,\n                ths = table.getElementsByTagName(\"th\"),\n                rows = range.endRowIndex - range.beginRowIndex + 1;\n            return  !ths.length ? rows == this.rowsNum : rows == this.rowsNum || (rows == this.rowsNum - 1);\n\n        },\n        /**\n         * 获取视觉上的前置单元格，默认是左边，top传入时\n         * @param cell\n         * @param top\n         */\n        getNextCell:function (cell, bottom, ignoreRange) {\n            try {\n                var cellInfo = this.getCellInfo(cell),\n                    nextRowIndex, nextColIndex;\n                var len = this.selectedTds.length && !ignoreRange,\n                    range = this.cellsRange;\n                //末行或者末列没有后置单元格\n                if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null;\n\n                nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1)\n                    : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1);\n                nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex;\n                return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex);\n            } catch (e) {\n                showError(e);\n            }\n        },\n        getPreviewCell:function (cell, top) {\n            try {\n                var cellInfo = this.getCellInfo(cell),\n                    previewRowIndex, previewColIndex;\n                var len = this.selectedTds.length,\n                    range = this.cellsRange;\n                //首行或者首列没有前置单元格\n                if ((!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (top && (!len ? (cellInfo.rowIndex > (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null;\n\n                previewRowIndex = !top ? ( !len ? cellInfo.rowIndex : range.beginRowIndex )\n                    : ( !len ? (cellInfo.rowIndex < 1 ? 0 : (cellInfo.rowIndex - 1)) : range.beginRowIndex);\n                previewColIndex = !top ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1)\n                    : ( !len ? cellInfo.colIndex : range.endColIndex + 1);\n                return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex);\n            } catch (e) {\n                showError(e);\n            }\n        },\n        /**\n         * 移动单元格中的内容\n         */\n        moveContent:function (cellTo, cellFrom) {\n            if (UETable.isEmptyBlock(cellFrom)) return;\n            if (UETable.isEmptyBlock(cellTo)) {\n                cellTo.innerHTML = cellFrom.innerHTML;\n                return;\n            }\n            var child = cellTo.lastChild;\n            if (child.nodeType == 3 || !dtd.$block[child.tagName]) {\n                cellTo.appendChild(cellTo.ownerDocument.createElement('br'))\n            }\n            while (child = cellFrom.firstChild) {\n                cellTo.appendChild(child);\n            }\n        },\n        /**\n         * 向右合并单元格\n         */\n        mergeRight:function (cell) {\n            var cellInfo = this.getCellInfo(cell),\n                rightColIndex = cellInfo.colIndex + cellInfo.colSpan,\n                rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex],\n                rightCell = this.getCell(rightCellInfo.rowIndex, rightCellInfo.cellIndex);\n            //合并\n            cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan;\n            //被合并的单元格不应存在宽度属性\n            cell.removeAttribute(\"width\");\n            //移动内容\n            this.moveContent(cell, rightCell);\n            //删掉被合并的Cell\n            this.deleteCell(rightCell, rightCellInfo.rowIndex);\n            this.update();\n        },\n        /**\n         * 向下合并单元格\n         */\n        mergeDown:function (cell) {\n            var cellInfo = this.getCellInfo(cell),\n                downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan,\n                downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex],\n                downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex);\n            cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan;\n            cell.removeAttribute(\"height\");\n            this.moveContent(cell, downCell);\n            this.deleteCell(downCell, downCellInfo.rowIndex);\n            this.update();\n        },\n        /**\n         * 合并整个range中的内容\n         */\n        mergeRange:function () {\n            //由于合并操作可以在任意时刻进行，所以无法通过鼠标位置等信息实时生成range，只能通过缓存实例中的cellsRange对象来访问\n            var range = this.cellsRange,\n                leftTopCell = this.getCell(range.beginRowIndex, this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex);\n\n            if (leftTopCell.tagName == \"TH\" && range.endRowIndex !== range.beginRowIndex) {\n                var index = this.indexTable,\n                    info = this.getCellInfo(leftTopCell);\n                leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex);\n                range = this.getCellsRange(leftTopCell, this.getCell(index[this.rowsNum - 1][info.colIndex].rowIndex, index[this.rowsNum - 1][info.colIndex].cellIndex));\n            }\n\n            // 删除剩余的Cells\n            var cells = this.getCells(range);\n            for(var i= 0,ci;ci=cells[i++];){\n                if (ci !== leftTopCell) {\n                    this.moveContent(leftTopCell, ci);\n                    this.deleteCell(ci);\n                }\n            }\n            // 修改左上角Cell的rowSpan和colSpan，并调整宽度属性设置\n            leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1;\n            leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute(\"height\");\n            leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1;\n            leftTopCell.colSpan > 1 && leftTopCell.removeAttribute(\"width\");\n            if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) {\n                leftTopCell.colSpan = 1;\n            }\n\n            if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) {\n                var rowIndex = leftTopCell.parentNode.rowIndex;\n                //解决IE下的表格操作问题\n                if( this.table.deleteRow ) {\n                    for (var i = rowIndex+ 1, curIndex=rowIndex+ 1, len=leftTopCell.rowSpan; i < len; i++) {\n                        this.table.deleteRow(curIndex);\n                    }\n                } else {\n                    for (var i = 0, len=leftTopCell.rowSpan - 1; i < len; i++) {\n                        var row = this.table.rows[rowIndex + 1];\n                        row.parentNode.removeChild(row);\n                    }\n                }\n                leftTopCell.rowSpan = 1;\n            }\n            this.update();\n        },\n        /**\n         * 插入一行单元格\n         */\n        insertRow:function (rowIndex, sourceCell) {\n            var numCols = this.colsNum,\n                table = this.table,\n                row = table.insertRow(rowIndex), cell,\n                isInsertTitle = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH';\n\n            function replaceTdToTh(colIndex, cell, tableRow) {\n                if (colIndex == 0) {\n                    var tr = tableRow.nextSibling || tableRow.previousSibling,\n                        th = tr.cells[colIndex];\n                    if (th.tagName == 'TH') {\n                        th = cell.ownerDocument.createElement(\"th\");\n                        th.appendChild(cell.firstChild);\n                        tableRow.insertBefore(th, cell);\n                        domUtils.remove(cell)\n                    }\n                }else{\n                    if (cell.tagName == 'TH') {\n                        var td = cell.ownerDocument.createElement(\"td\");\n                        td.appendChild(cell.firstChild);\n                        tableRow.insertBefore(td, cell);\n                        domUtils.remove(cell)\n                    }\n                }\n            }\n\n            //首行直接插入,无需考虑部分单元格被rowspan的情况\n            if (rowIndex == 0 || rowIndex == this.rowsNum) {\n                for (var colIndex = 0; colIndex < numCols; colIndex++) {\n                    cell = this.cloneCell(sourceCell, true);\n                    this.setCellContent(cell);\n                    cell.getAttribute('vAlign') && cell.setAttribute('vAlign', cell.getAttribute('vAlign'));\n                    row.appendChild(cell);\n                    if(!isInsertTitle) replaceTdToTh(colIndex, cell, row);\n                }\n            } else {\n                var infoRow = this.indexTable[rowIndex],\n                    cellIndex = 0;\n                for (colIndex = 0; colIndex < numCols; colIndex++) {\n                    var cellInfo = infoRow[colIndex];\n                    //如果存在某个单元格的rowspan穿过待插入行的位置，则修改该单元格的rowspan即可，无需插入单元格\n                    if (cellInfo.rowIndex < rowIndex) {\n                        cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex);\n                        cell.rowSpan = cellInfo.rowSpan + 1;\n                    } else {\n                        cell = this.cloneCell(sourceCell, true);\n                        this.setCellContent(cell);\n                        row.appendChild(cell);\n                    }\n                    if(!isInsertTitle) replaceTdToTh(colIndex, cell, row);\n                }\n            }\n            //框选时插入不触发contentchange，需要手动更新索引。\n            this.update();\n            return row;\n        },\n        /**\n         * 删除一行单元格\n         * @param rowIndex\n         */\n        deleteRow:function (rowIndex) {\n            var row = this.table.rows[rowIndex],\n                infoRow = this.indexTable[rowIndex],\n                colsNum = this.colsNum,\n                count = 0;     //处理计数\n            for (var colIndex = 0; colIndex < colsNum;) {\n                var cellInfo = infoRow[colIndex],\n                    cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex);\n                if (cell.rowSpan > 1) {\n                    if (cellInfo.rowIndex == rowIndex) {\n                        var clone = cell.cloneNode(true);\n                        clone.rowSpan = cell.rowSpan - 1;\n                        clone.innerHTML = \"\";\n                        cell.rowSpan = 1;\n                        var nextRowIndex = rowIndex + 1,\n                            nextRow = this.table.rows[nextRowIndex],\n                            insertCellIndex,\n                            preMerged = this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count;\n                        if (preMerged < colIndex) {\n                            insertCellIndex = colIndex - preMerged - 1;\n                            //nextRow.insertCell(insertCellIndex);\n                            domUtils.insertAfter(nextRow.cells[insertCellIndex], clone);\n                        } else {\n                            if (nextRow.cells.length) nextRow.insertBefore(clone, nextRow.cells[0])\n                        }\n                        count += 1;\n                        //cell.parentNode.removeChild(cell);\n                    }\n                }\n                colIndex += cell.colSpan || 1;\n            }\n            var deleteTds = [], cacheMap = {};\n            for (colIndex = 0; colIndex < colsNum; colIndex++) {\n                var tmpRowIndex = infoRow[colIndex].rowIndex,\n                    tmpCellIndex = infoRow[colIndex].cellIndex,\n                    key = tmpRowIndex + \"_\" + tmpCellIndex;\n                if (cacheMap[key])continue;\n                cacheMap[key] = 1;\n                cell = this.getCell(tmpRowIndex, tmpCellIndex);\n                deleteTds.push(cell);\n            }\n            var mergeTds = [];\n            utils.each(deleteTds, function (td) {\n                if (td.rowSpan == 1) {\n                    td.parentNode.removeChild(td);\n                } else {\n                    mergeTds.push(td);\n                }\n            });\n            utils.each(mergeTds, function (td) {\n                td.rowSpan--;\n            });\n            row.parentNode.removeChild(row);\n            //浏览器方法本身存在bug,采用自定义方法删除\n            //this.table.deleteRow(rowIndex);\n            this.update();\n        },\n        insertCol:function (colIndex, sourceCell, defaultValue) {\n            var rowsNum = this.rowsNum,\n                rowIndex = 0,\n                tableRow, cell,\n                backWidth = parseInt((this.table.offsetWidth - (this.colsNum + 1) * 20 - (this.colsNum + 1)) / (this.colsNum + 1), 10),\n                isInsertTitleCol = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH';\n\n            function replaceTdToTh(rowIndex, cell, tableRow) {\n                if (rowIndex == 0) {\n                    var th = cell.nextSibling || cell.previousSibling;\n                    if (th.tagName == 'TH') {\n                        th = cell.ownerDocument.createElement(\"th\");\n                        th.appendChild(cell.firstChild);\n                        tableRow.insertBefore(th, cell);\n                        domUtils.remove(cell)\n                    }\n                }else{\n                    if (cell.tagName == 'TH') {\n                        var td = cell.ownerDocument.createElement(\"td\");\n                        td.appendChild(cell.firstChild);\n                        tableRow.insertBefore(td, cell);\n                        domUtils.remove(cell)\n                    }\n                }\n            }\n\n            var preCell;\n            if (colIndex == 0 || colIndex == this.colsNum) {\n                for (; rowIndex < rowsNum; rowIndex++) {\n                    tableRow = this.table.rows[rowIndex];\n                    preCell = tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length];\n                    cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length);\n                    this.setCellContent(cell);\n                    cell.setAttribute('vAlign', cell.getAttribute('vAlign'));\n                    preCell && cell.setAttribute('width', preCell.getAttribute('width'));\n                    if (!colIndex) {\n                        tableRow.insertBefore(cell, tableRow.cells[0]);\n                    } else {\n                        domUtils.insertAfter(tableRow.cells[tableRow.cells.length - 1], cell);\n                    }\n                    if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow)\n                }\n            } else {\n                for (; rowIndex < rowsNum; rowIndex++) {\n                    var cellInfo = this.indexTable[rowIndex][colIndex];\n                    if (cellInfo.colIndex < colIndex) {\n                        cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex);\n                        cell.colSpan = cellInfo.colSpan + 1;\n                    } else {\n                        tableRow = this.table.rows[rowIndex];\n                        preCell = tableRow.cells[cellInfo.cellIndex];\n\n                        cell = this.cloneCell(sourceCell, true);//tableRow.insertCell(cellInfo.cellIndex);\n                        this.setCellContent(cell);\n                        cell.setAttribute('vAlign', cell.getAttribute('vAlign'));\n                        preCell && cell.setAttribute('width', preCell.getAttribute('width'));\n                        //防止IE下报错\n                        preCell ? tableRow.insertBefore(cell, preCell) : tableRow.appendChild(cell);\n                    }\n                    if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow);\n                }\n            }\n            //框选时插入不触发contentchange，需要手动更新索引\n            this.update();\n            this.updateWidth(backWidth, defaultValue || {tdPadding:10, tdBorder:1});\n        },\n        updateWidth:function (width, defaultValue) {\n            var table = this.table,\n                tmpWidth = UETable.getWidth(table) - defaultValue.tdPadding * 2 - defaultValue.tdBorder + width;\n            if (tmpWidth < table.ownerDocument.body.offsetWidth) {\n                table.setAttribute(\"width\", tmpWidth);\n                return;\n            }\n            var tds = domUtils.getElementsByTagName(this.table, \"td th\");\n            utils.each(tds, function (td) {\n                td.setAttribute(\"width\", width);\n            })\n        },\n        deleteCol:function (colIndex) {\n            var indexTable = this.indexTable,\n                tableRows = this.table.rows,\n                backTableWidth = this.table.getAttribute(\"width\"),\n                backTdWidth = 0,\n                rowsNum = this.rowsNum,\n                cacheMap = {};\n            for (var rowIndex = 0; rowIndex < rowsNum;) {\n                var infoRow = indexTable[rowIndex],\n                    cellInfo = infoRow[colIndex],\n                    key = cellInfo.rowIndex + '_' + cellInfo.colIndex;\n                // 跳过已经处理过的Cell\n                if (cacheMap[key])continue;\n                cacheMap[key] = 1;\n                var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex);\n                if (!backTdWidth) backTdWidth = cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0);\n                // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell\n                if (cell.colSpan > 1) {\n                    cell.colSpan--;\n                } else {\n                    tableRows[rowIndex].deleteCell(cellInfo.cellIndex);\n                }\n                rowIndex += cellInfo.rowSpan || 1;\n            }\n            this.table.setAttribute(\"width\", backTableWidth - backTdWidth);\n            this.update();\n        },\n        splitToCells:function (cell) {\n            var me = this,\n                cells = this.splitToRows(cell);\n            utils.each(cells, function (cell) {\n                me.splitToCols(cell);\n            })\n        },\n        splitToRows:function (cell) {\n            var cellInfo = this.getCellInfo(cell),\n                rowIndex = cellInfo.rowIndex,\n                colIndex = cellInfo.colIndex,\n                results = [];\n            // 修改Cell的rowSpan\n            cell.rowSpan = 1;\n            results.push(cell);\n            // 补齐单元格\n            for (var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; i < endRow; i++) {\n                if (i == rowIndex)continue;\n                var tableRow = this.table.rows[i],\n                    tmpCell = tableRow.insertCell(colIndex - this.getPreviewMergedCellsNum(i, colIndex));\n                tmpCell.colSpan = cellInfo.colSpan;\n                this.setCellContent(tmpCell);\n                tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign'));\n                tmpCell.setAttribute('align', cell.getAttribute('align'));\n                if (cell.style.cssText) {\n                    tmpCell.style.cssText = cell.style.cssText;\n                }\n                results.push(tmpCell);\n            }\n            this.update();\n            return results;\n        },\n        getPreviewMergedCellsNum:function (rowIndex, colIndex) {\n            var indexRow = this.indexTable[rowIndex],\n                num = 0;\n            for (var i = 0; i < colIndex;) {\n                var colSpan = indexRow[i].colSpan,\n                    tmpRowIndex = indexRow[i].rowIndex;\n                num += (colSpan - (tmpRowIndex == rowIndex ? 1 : 0));\n                i += colSpan;\n            }\n            return num;\n        },\n        splitToCols:function (cell) {\n            var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0),\n\n                cellInfo = this.getCellInfo(cell),\n                rowIndex = cellInfo.rowIndex,\n                colIndex = cellInfo.colIndex,\n                results = [];\n            // 修改Cell的rowSpan\n            cell.colSpan = 1;\n            cell.setAttribute(\"width\", backWidth);\n            results.push(cell);\n            // 补齐单元格\n            for (var j = colIndex, endCol = colIndex + cellInfo.colSpan; j < endCol; j++) {\n                if (j == colIndex)continue;\n                var tableRow = this.table.rows[rowIndex],\n                    tmpCell = tableRow.insertCell(this.indexTable[rowIndex][j].cellIndex + 1);\n                tmpCell.rowSpan = cellInfo.rowSpan;\n                this.setCellContent(tmpCell);\n                tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign'));\n                tmpCell.setAttribute('align', cell.getAttribute('align'));\n                tmpCell.setAttribute('width', backWidth);\n                if (cell.style.cssText) {\n                    tmpCell.style.cssText = cell.style.cssText;\n                }\n                //处理th的情况\n                if (cell.tagName == 'TH') {\n                    var th = cell.ownerDocument.createElement('th');\n                    th.appendChild(tmpCell.firstChild);\n                    th.setAttribute('vAlign', cell.getAttribute('vAlign'));\n                    th.rowSpan = tmpCell.rowSpan;\n                    tableRow.insertBefore(th, tmpCell);\n                    domUtils.remove(tmpCell);\n                }\n                results.push(tmpCell);\n            }\n            this.update();\n            return results;\n        },\n        isLastCell:function (cell, rowsNum, colsNum) {\n            rowsNum = rowsNum || this.rowsNum;\n            colsNum = colsNum || this.colsNum;\n            var cellInfo = this.getCellInfo(cell);\n            return ((cellInfo.rowIndex + cellInfo.rowSpan) == rowsNum) &&\n                ((cellInfo.colIndex + cellInfo.colSpan) == colsNum);\n        },\n        getLastCell:function (cells) {\n            cells = cells || this.table.getElementsByTagName(\"td\");\n            var firstInfo = this.getCellInfo(cells[0]);\n            var me = this, last = cells[0],\n                tr = last.parentNode,\n                cellsNum = 0, cols = 0, rows;\n            utils.each(cells, function (cell) {\n                if (cell.parentNode == tr)cols += cell.colSpan || 1;\n                cellsNum += cell.rowSpan * cell.colSpan || 1;\n            });\n            rows = cellsNum / cols;\n            utils.each(cells, function (cell) {\n                if (me.isLastCell(cell, rows, cols)) {\n                    last = cell;\n                    return false;\n                }\n            });\n            return last;\n\n        },\n        selectRow:function (rowIndex) {\n            var indexRow = this.indexTable[rowIndex],\n                start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex),\n                end = this.getCell(indexRow[this.colsNum - 1].rowIndex, indexRow[this.colsNum - 1].cellIndex),\n                range = this.getCellsRange(start, end);\n            this.setSelected(range);\n        },\n        selectTable:function () {\n            var tds = this.table.getElementsByTagName(\"td\"),\n                range = this.getCellsRange(tds[0], tds[tds.length - 1]);\n            this.setSelected(range);\n        },\n        setBackground:function (cells, value) {\n            if (typeof value === \"string\") {\n                utils.each(cells, function (cell) {\n                    cell.style.backgroundColor = value;\n                })\n            } else if (typeof value === \"object\") {\n                value = utils.extend({\n                    repeat:true,\n                    colorList:[\"#ddd\", \"#fff\"]\n                }, value);\n                var rowIndex = this.getCellInfo(cells[0]).rowIndex,\n                    count = 0,\n                    colors = value.colorList,\n                    getColor = function (list, index, repeat) {\n                        return list[index] ? list[index] : repeat ? list[index % list.length] : \"\";\n                    };\n                for (var i = 0, cell; cell = cells[i++];) {\n                    var cellInfo = this.getCellInfo(cell);\n                    cell.style.backgroundColor = getColor(colors, ((rowIndex + count) == cellInfo.rowIndex) ? count : ++count, value.repeat);\n                }\n            }\n        },\n        removeBackground:function (cells) {\n            utils.each(cells, function (cell) {\n                cell.style.backgroundColor = \"\";\n            })\n        }\n\n\n    };\n    function showError(e) {\n    }\n})();\n\n// plugins/table.cmds.js\n/**\n * Created with JetBrains PhpStorm.\n * User: taoqili\n * Date: 13-2-20\n * Time: 下午6:25\n * To change this template use File | Settings | File Templates.\n */\n;\n(function () {\n    var UT = UE.UETable,\n        getTableItemsByRange = function (editor) {\n            return UT.getTableItemsByRange(editor);\n        },\n        getUETableBySelected = function (editor) {\n            return UT.getUETableBySelected(editor)\n        },\n        getDefaultValue = function (editor, table) {\n            return UT.getDefaultValue(editor, table);\n        },\n        getUETable = function (tdOrTable) {\n            return UT.getUETable(tdOrTable);\n        };\n\n\n    UE.commands['inserttable'] = {\n        queryCommandState: function () {\n            return getTableItemsByRange(this).table ? -1 : 0;\n        },\n        execCommand: function (cmd, opt) {\n            function createTable(opt, tdWidth) {\n                var html = [],\n                    rowsNum = opt.numRows,\n                    colsNum = opt.numCols;\n                for (var r = 0; r < rowsNum; r++) {\n                    html.push('<tr' + (r == 0 ? ' class=\"firstRow\"':'') + '>');\n                    for (var c = 0; c < colsNum; c++) {\n                        html.push('<td width=\"' + tdWidth + '\"  vAlign=\"' + opt.tdvalign + '\" >' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '<br/>') + '</td>')\n                    }\n                    html.push('</tr>')\n                }\n                //禁止指定table-width\n                //return '<table><tbody>' + html.join('') + '</tbody></table>'\n\t\t\t\treturn '<table style=\"border-collapse:collapse;\"><tbody>' + html.join('') + '</tbody></table>'\n            }\n\n            if (!opt) {\n                opt = utils.extend({}, {\n                    numCols: this.options.defaultCols,\n                    numRows: this.options.defaultRows,\n                    tdvalign: this.options.tdvalign\n                })\n            }\n            var me = this;\n            var range = this.selection.getRange(),\n                start = range.startContainer,\n                firstParentBlock = domUtils.findParent(start, function (node) {\n                    return domUtils.isBlockElm(node);\n                }, true) || me.body;\n\n            var defaultValue = getDefaultValue(me),\n                tableWidth = firstParentBlock.offsetWidth,\n                tdWidth = Math.floor(tableWidth / opt.numCols - defaultValue.tdPadding * 2 - defaultValue.tdBorder);\n\n            //todo其他属性\n            !opt.tdvalign && (opt.tdvalign = me.options.tdvalign);\n            me.execCommand(\"inserthtml\", createTable(opt, tdWidth));\n        }\n    };\n\n    UE.commands['insertparagraphbeforetable'] = {\n        queryCommandState: function () {\n            return getTableItemsByRange(this).cell ? 0 : -1;\n        },\n        execCommand: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                var p = this.document.createElement(\"p\");\n                p.innerHTML = browser.ie ? '&nbsp;' : '<br />';\n                table.parentNode.insertBefore(p, table);\n                this.selection.getRange().setStart(p, 0).setCursor();\n            }\n        }\n    };\n\n    UE.commands['deletetable'] = {\n        queryCommandState: function () {\n            var rng = this.selection.getRange();\n            return domUtils.findParentByTagName(rng.startContainer, 'table', true) ? 0 : -1;\n        },\n        execCommand: function (cmd, table) {\n            var rng = this.selection.getRange();\n            table = table || domUtils.findParentByTagName(rng.startContainer, 'table', true);\n            if (table) {\n                var next = table.nextSibling;\n                if (!next) {\n                    next = domUtils.createElement(this.document, 'p', {\n                        'innerHTML': browser.ie ? domUtils.fillChar : '<br/>'\n                    });\n                    table.parentNode.insertBefore(next, table);\n                }\n                domUtils.remove(table);\n                rng = this.selection.getRange();\n                if (next.nodeType == 3) {\n                    rng.setStartBefore(next)\n                } else {\n                    rng.setStart(next, 0)\n                }\n                rng.setCursor(false, true)\n                this.fireEvent(\"tablehasdeleted\")\n\n            }\n\n        }\n    };\n    UE.commands['cellalign'] = {\n        queryCommandState: function () {\n            return getSelectedArr(this).length ? 0 : -1\n        },\n        execCommand: function (cmd, align) {\n            var selectedTds = getSelectedArr(this);\n            if (selectedTds.length) {\n                for (var i = 0, ci; ci = selectedTds[i++];) {\n                    ci.setAttribute('align', align);\n                }\n            }\n        }\n    };\n    UE.commands['cellvalign'] = {\n        queryCommandState: function () {\n            return getSelectedArr(this).length ? 0 : -1;\n        },\n        execCommand: function (cmd, valign) {\n            var selectedTds = getSelectedArr(this);\n            if (selectedTds.length) {\n                for (var i = 0, ci; ci = selectedTds[i++];) {\n                    ci.setAttribute('vAlign', valign);\n                }\n            }\n        }\n    };\n    UE.commands['insertcaption'] = {\n        queryCommandState: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                return table.getElementsByTagName('caption').length == 0 ? 1 : -1;\n            }\n            return -1;\n        },\n        execCommand: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                var caption = this.document.createElement('caption');\n                caption.innerHTML = browser.ie ? domUtils.fillChar : '<br/>';\n                table.insertBefore(caption, table.firstChild);\n                var range = this.selection.getRange();\n                range.setStart(caption, 0).setCursor();\n            }\n\n        }\n    };\n    UE.commands['deletecaption'] = {\n        queryCommandState: function () {\n            var rng = this.selection.getRange(),\n                table = domUtils.findParentByTagName(rng.startContainer, 'table');\n            if (table) {\n                return table.getElementsByTagName('caption').length == 0 ? -1 : 1;\n            }\n            return -1;\n        },\n        execCommand: function () {\n            var rng = this.selection.getRange(),\n                table = domUtils.findParentByTagName(rng.startContainer, 'table');\n            if (table) {\n                domUtils.remove(table.getElementsByTagName('caption')[0]);\n                var range = this.selection.getRange();\n                range.setStart(table.rows[0].cells[0], 0).setCursor();\n            }\n\n        }\n    };\n    UE.commands['inserttitle'] = {\n        queryCommandState: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                var firstRow = table.rows[0];\n                return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() != 'th' ? 0 : -1\n            }\n            return -1;\n        },\n        execCommand: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                getUETable(table).insertRow(0, 'th');\n            }\n            var th = table.getElementsByTagName('th')[0];\n            this.selection.getRange().setStart(th, 0).setCursor(false, true);\n        }\n    };\n    UE.commands['deletetitle'] = {\n        queryCommandState: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                var firstRow = table.rows[0];\n                return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() == 'th' ? 0 : -1\n            }\n            return -1;\n        },\n        execCommand: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                domUtils.remove(table.rows[0])\n            }\n            var td = table.getElementsByTagName('td')[0];\n            this.selection.getRange().setStart(td, 0).setCursor(false, true);\n        }\n    };\n    UE.commands['inserttitlecol'] = {\n        queryCommandState: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                var lastRow = table.rows[table.rows.length-1];\n                return lastRow.getElementsByTagName('th').length ? -1 : 0;\n            }\n            return -1;\n        },\n        execCommand: function (cmd) {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                getUETable(table).insertCol(0, 'th');\n            }\n            resetTdWidth(table, this);\n            var th = table.getElementsByTagName('th')[0];\n            this.selection.getRange().setStart(th, 0).setCursor(false, true);\n        }\n    };\n    UE.commands['deletetitlecol'] = {\n        queryCommandState: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                var lastRow = table.rows[table.rows.length-1];\n                return lastRow.getElementsByTagName('th').length ? 0 : -1;\n            }\n            return -1;\n        },\n        execCommand: function () {\n            var table = getTableItemsByRange(this).table;\n            if (table) {\n                for(var i = 0; i< table.rows.length; i++ ){\n                    domUtils.remove(table.rows[i].children[0])\n                }\n            }\n            resetTdWidth(table, this);\n            var td = table.getElementsByTagName('td')[0];\n            this.selection.getRange().setStart(td, 0).setCursor(false, true);\n        }\n    };\n\n    UE.commands[\"mergeright\"] = {\n        queryCommandState: function (cmd) {\n            var tableItems = getTableItemsByRange(this),\n                table = tableItems.table,\n                cell = tableItems.cell;\n\n            if (!table || !cell) return -1;\n            var ut = getUETable(table);\n            if (ut.selectedTds.length) return -1;\n\n            var cellInfo = ut.getCellInfo(cell),\n                rightColIndex = cellInfo.colIndex + cellInfo.colSpan;\n            if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并\n\n            var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex],\n                rightCell = table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex];\n            if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并\n\n            // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并\n            return (rightCellInfo.rowIndex == cellInfo.rowIndex && rightCellInfo.rowSpan == cellInfo.rowSpan) ? 0 : -1;\n        },\n        execCommand: function (cmd) {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell);\n            ut.mergeRight(cell);\n            rng.moveToBookmark(bk).select();\n        }\n    };\n    UE.commands[\"mergedown\"] = {\n        queryCommandState: function (cmd) {\n            var tableItems = getTableItemsByRange(this),\n                table = tableItems.table,\n                cell = tableItems.cell;\n\n            if (!table || !cell) return -1;\n            var ut = getUETable(table);\n            if (ut.selectedTds.length)return -1;\n\n            var cellInfo = ut.getCellInfo(cell),\n                downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan;\n            if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并\n\n            var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex],\n                downCell = table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex];\n            if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并\n\n            // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并\n            return (downCellInfo.colIndex == cellInfo.colIndex && downCellInfo.colSpan == cellInfo.colSpan) ? 0 : -1;\n        },\n        execCommand: function () {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell);\n            ut.mergeDown(cell);\n            rng.moveToBookmark(bk).select();\n        }\n    };\n    UE.commands[\"mergecells\"] = {\n        queryCommandState: function () {\n            return getUETableBySelected(this) ? 0 : -1;\n        },\n        execCommand: function () {\n            var ut = getUETableBySelected(this);\n            if (ut && ut.selectedTds.length) {\n                var cell = ut.selectedTds[0];\n                ut.mergeRange();\n                var rng = this.selection.getRange();\n                if (domUtils.isEmptyBlock(cell)) {\n                    rng.setStart(cell, 0).collapse(true)\n                } else {\n                    rng.selectNodeContents(cell)\n                }\n                rng.select();\n            }\n\n\n        }\n    };\n    UE.commands[\"insertrow\"] = {\n        queryCommandState: function () {\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell;\n            return cell && (cell.tagName == \"TD\" || (cell.tagName == 'TH' && tableItems.tr !== tableItems.table.rows[0])) &&\n                getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1;\n        },\n        execCommand: function () {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell,\n                table = tableItems.table,\n                ut = getUETable(table),\n                cellInfo = ut.getCellInfo(cell);\n            //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,'');\n            if (!ut.selectedTds.length) {\n                ut.insertRow(cellInfo.rowIndex, cell);\n            } else {\n                var range = ut.cellsRange;\n                for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) {\n                    ut.insertRow(range.beginRowIndex, cell);\n                }\n            }\n            rng.moveToBookmark(bk).select();\n            if (table.getAttribute(\"interlaced\") === \"enabled\")this.fireEvent(\"interlacetable\", table);\n        }\n    };\n    //后插入行\n    UE.commands[\"insertrownext\"] = {\n        queryCommandState: function () {\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell;\n            return cell && (cell.tagName == \"TD\") && getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1;\n        },\n        execCommand: function () {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell,\n                table = tableItems.table,\n                ut = getUETable(table),\n                cellInfo = ut.getCellInfo(cell);\n            //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,'');\n            if (!ut.selectedTds.length) {\n                ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell);\n            } else {\n                var range = ut.cellsRange;\n                for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) {\n                    ut.insertRow(range.endRowIndex + 1, cell);\n                }\n            }\n            rng.moveToBookmark(bk).select();\n            if (table.getAttribute(\"interlaced\") === \"enabled\")this.fireEvent(\"interlacetable\", table);\n        }\n    };\n    UE.commands[\"deleterow\"] = {\n        queryCommandState: function () {\n            var tableItems = getTableItemsByRange(this);\n            return tableItems.cell ? 0 : -1;\n        },\n        execCommand: function () {\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell),\n                cellsRange = ut.cellsRange,\n                cellInfo = ut.getCellInfo(cell),\n                preCell = ut.getVSideCell(cell),\n                nextCell = ut.getVSideCell(cell, true),\n                rng = this.selection.getRange();\n            if (utils.isEmptyObject(cellsRange)) {\n                ut.deleteRow(cellInfo.rowIndex);\n            } else {\n                for (var i = cellsRange.beginRowIndex; i < cellsRange.endRowIndex + 1; i++) {\n                    ut.deleteRow(cellsRange.beginRowIndex);\n                }\n            }\n            var table = ut.table;\n            if (!table.getElementsByTagName('td').length) {\n                var nextSibling = table.nextSibling;\n                domUtils.remove(table);\n                if (nextSibling) {\n                    rng.setStart(nextSibling, 0).setCursor(false, true);\n                }\n            } else {\n                if (cellInfo.rowSpan == 1 || cellInfo.rowSpan == cellsRange.endRowIndex - cellsRange.beginRowIndex + 1) {\n                    if (nextCell || preCell) rng.selectNodeContents(nextCell || preCell).setCursor(false, true);\n                } else {\n                    var newCell = ut.getCell(cellInfo.rowIndex, ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex);\n                    if (newCell) rng.selectNodeContents(newCell).setCursor(false, true);\n                }\n            }\n            if (table.getAttribute(\"interlaced\") === \"enabled\")this.fireEvent(\"interlacetable\", table);\n        }\n    };\n    UE.commands[\"insertcol\"] = {\n        queryCommandState: function (cmd) {\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell;\n            return cell && (cell.tagName == \"TD\" || (cell.tagName == 'TH' && cell !== tableItems.tr.cells[0])) &&\n                getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1;\n        },\n        execCommand: function (cmd) {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            if (this.queryCommandState(cmd) == -1)return;\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell),\n                cellInfo = ut.getCellInfo(cell);\n\n            //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex);\n            if (!ut.selectedTds.length) {\n                ut.insertCol(cellInfo.colIndex, cell);\n            } else {\n                var range = ut.cellsRange;\n                for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) {\n                    ut.insertCol(range.beginColIndex, cell);\n                }\n            }\n            rng.moveToBookmark(bk).select(true);\n        }\n    };\n    UE.commands[\"insertcolnext\"] = {\n        queryCommandState: function () {\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell;\n            return cell && getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1;\n        },\n        execCommand: function () {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell),\n                cellInfo = ut.getCellInfo(cell);\n            //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1);\n            if (!ut.selectedTds.length) {\n                ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell);\n            } else {\n                var range = ut.cellsRange;\n                for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) {\n                    ut.insertCol(range.endColIndex + 1, cell);\n                }\n            }\n            rng.moveToBookmark(bk).select();\n        }\n    };\n\n    UE.commands[\"deletecol\"] = {\n        queryCommandState: function () {\n            var tableItems = getTableItemsByRange(this);\n            return tableItems.cell ? 0 : -1;\n        },\n        execCommand: function () {\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell),\n                range = ut.cellsRange,\n                cellInfo = ut.getCellInfo(cell),\n                preCell = ut.getHSideCell(cell),\n                nextCell = ut.getHSideCell(cell, true);\n            if (utils.isEmptyObject(range)) {\n                ut.deleteCol(cellInfo.colIndex);\n            } else {\n                for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) {\n                    ut.deleteCol(range.beginColIndex);\n                }\n            }\n            var table = ut.table,\n                rng = this.selection.getRange();\n\n            if (!table.getElementsByTagName('td').length) {\n                var nextSibling = table.nextSibling;\n                domUtils.remove(table);\n                if (nextSibling) {\n                    rng.setStart(nextSibling, 0).setCursor(false, true);\n                }\n            } else {\n                if (domUtils.inDoc(cell, this.document)) {\n                    rng.setStart(cell, 0).setCursor(false, true);\n                } else {\n                    if (nextCell && domUtils.inDoc(nextCell, this.document)) {\n                        rng.selectNodeContents(nextCell).setCursor(false, true);\n                    } else {\n                        if (preCell && domUtils.inDoc(preCell, this.document)) {\n                            rng.selectNodeContents(preCell).setCursor(true, true);\n                        }\n                    }\n                }\n            }\n        }\n    };\n    UE.commands[\"splittocells\"] = {\n        queryCommandState: function () {\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell;\n            if (!cell) return -1;\n            var ut = getUETable(tableItems.table);\n            if (ut.selectedTds.length > 0) return -1;\n            return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1;\n        },\n        execCommand: function () {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell);\n            ut.splitToCells(cell);\n            rng.moveToBookmark(bk).select();\n        }\n    };\n    UE.commands[\"splittorows\"] = {\n        queryCommandState: function () {\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell;\n            if (!cell) return -1;\n            var ut = getUETable(tableItems.table);\n            if (ut.selectedTds.length > 0) return -1;\n            return cell && cell.rowSpan > 1 ? 0 : -1;\n        },\n        execCommand: function () {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell);\n            ut.splitToRows(cell);\n            rng.moveToBookmark(bk).select();\n        }\n    };\n    UE.commands[\"splittocols\"] = {\n        queryCommandState: function () {\n            var tableItems = getTableItemsByRange(this),\n                cell = tableItems.cell;\n            if (!cell) return -1;\n            var ut = getUETable(tableItems.table);\n            if (ut.selectedTds.length > 0) return -1;\n            return cell && cell.colSpan > 1 ? 0 : -1;\n        },\n        execCommand: function () {\n            var rng = this.selection.getRange(),\n                bk = rng.createBookmark(true);\n            var cell = getTableItemsByRange(this).cell,\n                ut = getUETable(cell);\n            ut.splitToCols(cell);\n            rng.moveToBookmark(bk).select();\n\n        }\n    };\n\n    UE.commands[\"adaptbytext\"] =\n        UE.commands[\"adaptbywindow\"] = {\n            queryCommandState: function () {\n                return getTableItemsByRange(this).table ? 0 : -1\n            },\n            execCommand: function (cmd) {\n                var tableItems = getTableItemsByRange(this),\n                    table = tableItems.table;\n                if (table) {\n                    if (cmd == 'adaptbywindow') {\n                        resetTdWidth(table, this);\n                    } else {\n                        var cells = domUtils.getElementsByTagName(table, \"td th\");\n                        utils.each(cells, function (cell) {\n                            cell.removeAttribute(\"width\");\n                        });\n                        table.removeAttribute(\"width\");\n                    }\n                }\n            }\n        };\n\n    //平均分配各列\n    UE.commands['averagedistributecol'] = {\n        queryCommandState: function () {\n            var ut = getUETableBySelected(this);\n            if (!ut) return -1;\n            return ut.isFullRow() || ut.isFullCol() ? 0 : -1;\n        },\n        execCommand: function (cmd) {\n            var me = this,\n                ut = getUETableBySelected(me);\n\n            function getAverageWidth() {\n                var tb = ut.table,\n                    averageWidth, sumWidth = 0, colsNum = 0,\n                    tbAttr = getDefaultValue(me, tb);\n\n                if (ut.isFullRow()) {\n                    sumWidth = tb.offsetWidth;\n                    colsNum = ut.colsNum;\n                } else {\n                    var begin = ut.cellsRange.beginColIndex,\n                        end = ut.cellsRange.endColIndex,\n                        node;\n                    for (var i = begin; i <= end;) {\n                        node = ut.selectedTds[i];\n                        sumWidth += node.offsetWidth;\n                        i += node.colSpan;\n                        colsNum += 1;\n                    }\n                }\n                averageWidth = Math.ceil(sumWidth / colsNum) - tbAttr.tdBorder * 2 - tbAttr.tdPadding * 2;\n                return averageWidth;\n            }\n\n            function setAverageWidth(averageWidth) {\n                utils.each(domUtils.getElementsByTagName(ut.table, \"th\"), function (node) {\n                    node.setAttribute(\"width\", \"\");\n                });\n                var cells = ut.isFullRow() ? domUtils.getElementsByTagName(ut.table, \"td\") : ut.selectedTds;\n\n                utils.each(cells, function (node) {\n                    if (node.colSpan == 1) {\n                        node.setAttribute(\"width\", averageWidth);\n                    }\n                });\n            }\n\n            if (ut && ut.selectedTds.length) {\n                setAverageWidth(getAverageWidth());\n            }\n        }\n    };\n    //平均分配各行\n    UE.commands['averagedistributerow'] = {\n        queryCommandState: function () {\n            var ut = getUETableBySelected(this);\n            if (!ut) return -1;\n            if (ut.selectedTds && /th/ig.test(ut.selectedTds[0].tagName)) return -1;\n            return ut.isFullRow() || ut.isFullCol() ? 0 : -1;\n        },\n        execCommand: function (cmd) {\n            var me = this,\n                ut = getUETableBySelected(me);\n\n            function getAverageHeight() {\n                var averageHeight, rowNum, sumHeight = 0,\n                    tb = ut.table,\n                    tbAttr = getDefaultValue(me, tb),\n                    tdpadding = parseInt(domUtils.getComputedStyle(tb.getElementsByTagName('td')[0], \"padding-top\"));\n\n                if (ut.isFullCol()) {\n                    var captionArr = domUtils.getElementsByTagName(tb, \"caption\"),\n                        thArr = domUtils.getElementsByTagName(tb, \"th\"),\n                        captionHeight, thHeight;\n\n                    if (captionArr.length > 0) {\n                        captionHeight = captionArr[0].offsetHeight;\n                    }\n                    if (thArr.length > 0) {\n                        thHeight = thArr[0].offsetHeight;\n                    }\n\n                    sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0);\n                    rowNum = thArr.length == 0 ? ut.rowsNum : (ut.rowsNum - 1);\n                } else {\n                    var begin = ut.cellsRange.beginRowIndex,\n                        end = ut.cellsRange.endRowIndex,\n                        count = 0,\n                        trs = domUtils.getElementsByTagName(tb, \"tr\");\n                    for (var i = begin; i <= end; i++) {\n                        sumHeight += trs[i].offsetHeight;\n                        count += 1;\n                    }\n                    rowNum = count;\n                }\n                //ie8下是混杂模式\n                if (browser.ie && browser.version < 9) {\n                    averageHeight = Math.ceil(sumHeight / rowNum);\n                } else {\n                    averageHeight = Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2;\n                }\n                return averageHeight;\n            }\n\n            function setAverageHeight(averageHeight) {\n                var cells = ut.isFullCol() ? domUtils.getElementsByTagName(ut.table, \"td\") : ut.selectedTds;\n                utils.each(cells, function (node) {\n                    if (node.rowSpan == 1) {\n                        node.setAttribute(\"height\", averageHeight);\n                    }\n                });\n            }\n\n            if (ut && ut.selectedTds.length) {\n                setAverageHeight(getAverageHeight());\n            }\n        }\n    };\n\n    //单元格对齐方式\n    UE.commands['cellalignment'] = {\n        queryCommandState: function () {\n            return getTableItemsByRange(this).table ? 0 : -1\n        },\n        execCommand: function (cmd, data) {\n            var me = this,\n                ut = getUETableBySelected(me);\n\n            if (!ut) {\n                var start = me.selection.getStart(),\n                    cell = start && domUtils.findParentByTagName(start, [\"td\", \"th\", \"caption\"], true);\n                if (!/caption/ig.test(cell.tagName)) {\n                    domUtils.setAttributes(cell, data);\n                } else {\n                    cell.style.textAlign = data.align;\n                    cell.style.verticalAlign = data.vAlign;\n                }\n                me.selection.getRange().setCursor(true);\n            } else {\n                utils.each(ut.selectedTds, function (cell) {\n                    domUtils.setAttributes(cell, data);\n                });\n            }\n        },\n        /**\n         * 查询当前点击的单元格的对齐状态， 如果当前已经选择了多个单元格， 则会返回所有单元格经过统一协调过后的状态\n         * @see UE.UETable.getTableCellAlignState\n         */\n        queryCommandValue: function (cmd) {\n\n            var activeMenuCell = getTableItemsByRange( this).cell;\n\n            if( !activeMenuCell ) {\n                activeMenuCell = getSelectedArr(this)[0];\n            }\n\n            if (!activeMenuCell) {\n\n                return null;\n\n            } else {\n\n                //获取同时选中的其他单元格\n                var cells = UE.UETable.getUETable(activeMenuCell).selectedTds;\n\n                !cells.length && ( cells = activeMenuCell );\n\n                return UE.UETable.getTableCellAlignState(cells);\n\n            }\n\n        }\n    };\n    //表格对齐方式\n    UE.commands['tablealignment'] = {\n        queryCommandState: function () {\n            if (browser.ie && browser.version < 8) {\n                return -1;\n            }\n            return getTableItemsByRange(this).table ? 0 : -1\n        },\n        execCommand: function (cmd, value) {\n            var me = this,\n                start = me.selection.getStart(),\n                table = start && domUtils.findParentByTagName(start, [\"table\"], true);\n\n            if (table) {\n                table.setAttribute(\"align\",value);\n            }\n        }\n    };\n\n    //表格属性\n    UE.commands['edittable'] = {\n        queryCommandState: function () {\n            return getTableItemsByRange(this).table ? 0 : -1\n        },\n        execCommand: function (cmd, color) {\n            var rng = this.selection.getRange(),\n                table = domUtils.findParentByTagName(rng.startContainer, 'table');\n            if (table) {\n                var arr = domUtils.getElementsByTagName(table, \"td\").concat(\n                    domUtils.getElementsByTagName(table, \"th\"),\n                    domUtils.getElementsByTagName(table, \"caption\")\n                );\n                utils.each(arr, function (node) {\n                    node.style.borderColor = color;\n                });\n            }\n        }\n    };\n    //单元格属性\n    UE.commands['edittd'] = {\n        queryCommandState: function () {\n            return getTableItemsByRange(this).table ? 0 : -1\n        },\n        execCommand: function (cmd, bkColor) {\n            var me = this,\n                ut = getUETableBySelected(me);\n\n            if (!ut) {\n                var start = me.selection.getStart(),\n                    cell = start && domUtils.findParentByTagName(start, [\"td\", \"th\", \"caption\"], true);\n                if (cell) {\n                    cell.style.backgroundColor = bkColor;\n                }\n            } else {\n                utils.each(ut.selectedTds, function (cell) {\n                    cell.style.backgroundColor = bkColor;\n                });\n            }\n        }\n    };\n\n    UE.commands[\"settablebackground\"] = {\n        queryCommandState: function () {\n            return getSelectedArr(this).length > 1 ? 0 : -1;\n        },\n        execCommand: function (cmd, value) {\n            var cells, ut;\n            cells = getSelectedArr(this);\n            ut = getUETable(cells[0]);\n            ut.setBackground(cells, value);\n        }\n    };\n\n    UE.commands[\"cleartablebackground\"] = {\n        queryCommandState: function () {\n            var cells = getSelectedArr(this);\n            if (!cells.length)return -1;\n            for (var i = 0, cell; cell = cells[i++];) {\n                if (cell.style.backgroundColor !== \"\") return 0;\n            }\n            return -1;\n        },\n        execCommand: function () {\n            var cells = getSelectedArr(this),\n                ut = getUETable(cells[0]);\n            ut.removeBackground(cells);\n        }\n    };\n\n    UE.commands[\"interlacetable\"] = UE.commands[\"uninterlacetable\"] = {\n        queryCommandState: function (cmd) {\n            var table = getTableItemsByRange(this).table;\n            if (!table) return -1;\n            var interlaced = table.getAttribute(\"interlaced\");\n            if (cmd == \"interlacetable\") {\n                //TODO 待定\n                //是否需要待定，如果设置，则命令只能单次执行成功，但反射具备toggle效果；否则可以覆盖前次命令，但反射将不存在toggle效果\n                return (interlaced === \"enabled\") ? -1 : 0;\n            } else {\n                return (!interlaced || interlaced === \"disabled\") ? -1 : 0;\n            }\n        },\n        execCommand: function (cmd, classList) {\n            var table = getTableItemsByRange(this).table;\n            if (cmd == \"interlacetable\") {\n                table.setAttribute(\"interlaced\", \"enabled\");\n                this.fireEvent(\"interlacetable\", table, classList);\n            } else {\n                table.setAttribute(\"interlaced\", \"disabled\");\n                this.fireEvent(\"uninterlacetable\", table);\n            }\n        }\n    };\n    UE.commands[\"setbordervisible\"] = {\n        queryCommandState: function (cmd) {\n            var table = getTableItemsByRange(this).table;\n            if (!table) return -1;\n            return 0;\n        },\n        execCommand: function () {\n            var table = getTableItemsByRange(this).table;\n            utils.each(domUtils.getElementsByTagName(table,'td'),function(td){\n                td.style.borderWidth = '1px';\n                td.style.borderStyle = 'solid';\n            })\n        }\n    };\n    function resetTdWidth(table, editor) {\n        var tds = domUtils.getElementsByTagName(table,'td th');\n        utils.each(tds, function (td) {\n            td.removeAttribute(\"width\");\n        });\n        table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table)));\n        var tdsWidths = [];\n        setTimeout(function () {\n            utils.each(tds, function (td) {\n                (td.colSpan == 1) && tdsWidths.push(td.offsetWidth)\n            })\n            utils.each(tds, function (td,i) {\n                (td.colSpan == 1) && td.setAttribute(\"width\", tdsWidths[i] + \"\");\n            })\n        }, 0);\n    }\n\n    function getTableWidth(editor, needIEHack, defaultValue) {\n        var body = editor.body;\n        return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0);\n    }\n\n    function getSelectedArr(editor) {\n        var cell = getTableItemsByRange(editor).cell;\n        if (cell) {\n            var ut = getUETable(cell);\n            return ut.selectedTds.length ? ut.selectedTds : [cell];\n        } else {\n            return [];\n        }\n    }\n})();\n\n\n// plugins/table.action.js\n/**\n * Created with JetBrains PhpStorm.\n * User: taoqili\n * Date: 12-10-12\n * Time: 上午10:05\n * To change this template use File | Settings | File Templates.\n */\nUE.plugins['table'] = function () {\n    var me = this,\n        tabTimer = null,\n        //拖动计时器\n        tableDragTimer = null,\n        //双击计时器\n        tableResizeTimer = null,\n        //单元格最小宽度\n        cellMinWidth = 5,\n        isInResizeBuffer = false,\n        //单元格边框大小\n        cellBorderWidth = 5,\n        //鼠标偏移距离\n        offsetOfTableCell = 10,\n        //记录在有限时间内的点击状态， 共有3个取值， 0, 1, 2。 0代表未初始化， 1代表单击了1次，2代表2次\n        singleClickState = 0,\n        userActionStatus = null,\n        //双击允许的时间范围\n        dblclickTime = 360,\n        UT = UE.UETable,\n        getUETable = function (tdOrTable) {\n            return UT.getUETable(tdOrTable);\n        },\n        getUETableBySelected = function (editor) {\n            return UT.getUETableBySelected(editor);\n        },\n        getDefaultValue = function (editor, table) {\n            return UT.getDefaultValue(editor, table);\n        },\n        removeSelectedClass = function (cells) {\n            return UT.removeSelectedClass(cells);\n        };\n\n    function showError(e) {\n//        throw e;\n    }\n    me.ready(function(){\n        var me = this;\n        var orgGetText = me.selection.getText;\n        me.selection.getText = function(){\n            var table = getUETableBySelected(me);\n            if(table){\n                var str = '';\n                utils.each(table.selectedTds,function(td){\n                    str += td[browser.ie?'innerText':'textContent'];\n                })\n                return str;\n            }else{\n                return orgGetText.call(me.selection)\n            }\n\n        }\n    })\n\n    //处理拖动及框选相关方法\n    var startTd = null, //鼠标按下时的锚点td\n        currentTd = null, //当前鼠标经过时的td\n        onDrag = \"\", //指示当前拖动状态，其值可为\"\",\"h\",\"v\" ,分别表示未拖动状态，横向拖动状态，纵向拖动状态，用于鼠标移动过程中的判断\n        onBorder = false, //检测鼠标按下时是否处在单元格边缘位置\n        dragButton = null,\n        dragOver = false,\n        dragLine = null, //模拟的拖动线\n        dragTd = null;    //发生拖动的目标td\n\n    var mousedown = false,\n    //todo 判断混乱模式\n        needIEHack = true;\n\n    me.setOpt({\n        'maxColNum':20,\n        'maxRowNum':100,\n        'defaultCols':5,\n        'defaultRows':5,\n        'tdvalign':'top',\n        'cursorpath':me.options.UEDITOR_HOME_URL + \"themes/default/images/cursor_\",\n        'tableDragable':false,\n        'classList':[\"ue-table-interlace-color-single\",\"ue-table-interlace-color-double\"]\n    });\n    me.getUETable = getUETable;\n    var commands = {\n        'deletetable':1,\n        'inserttable':1,\n        'cellvalign':1,\n        'insertcaption':1,\n        'deletecaption':1,\n        'inserttitle':1,\n        'deletetitle':1,\n        \"mergeright\":1,\n        \"mergedown\":1,\n        \"mergecells\":1,\n        \"insertrow\":1,\n        \"insertrownext\":1,\n        \"deleterow\":1,\n        \"insertcol\":1,\n        \"insertcolnext\":1,\n        \"deletecol\":1,\n        \"splittocells\":1,\n        \"splittorows\":1,\n        \"splittocols\":1,\n        \"adaptbytext\":1,\n        \"adaptbywindow\":1,\n        \"adaptbycustomer\":1,\n        \"insertparagraph\":1,\n        \"insertparagraphbeforetable\":1,\n        \"averagedistributecol\":1,\n        \"averagedistributerow\":1\n    };\n    me.ready(function () {\n        utils.cssRule('table',\n            //选中的td上的样式\n            '.selectTdClass{background-color:#edf5fa !important}' +\n                'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' +\n                //插入的表格的默认样式\n                'table{margin-bottom:10px;border-collapse:collapse;display:table;}' +\n                'td,th{padding: 5px 10px;border: 1px solid #DDD;}' +\n                'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' +\n                'th{border-top:1px solid #BBB;background-color:#F7F7F7;}' +\n                'table tr.firstRow th{border-top-width:2px;}' +\n                '.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }' +\n                'td p{margin:0;padding:0;}', me.document);\n\n        var tableCopyList, isFullCol, isFullRow;\n        //注册del/backspace事件\n        me.addListener('keydown', function (cmd, evt) {\n            var me = this;\n            var keyCode = evt.keyCode || evt.which;\n\n            if (keyCode == 8) {\n\n                var ut = getUETableBySelected(me);\n                if (ut && ut.selectedTds.length) {\n\n                    if (ut.isFullCol()) {\n                        me.execCommand('deletecol')\n                    } else if (ut.isFullRow()) {\n                        me.execCommand('deleterow')\n                    } else {\n                        me.fireEvent('delcells');\n                    }\n                    domUtils.preventDefault(evt);\n                }\n\n                var caption = domUtils.findParentByTagName(me.selection.getStart(), 'caption', true),\n                    range = me.selection.getRange();\n                if (range.collapsed && caption && isEmptyBlock(caption)) {\n                    me.fireEvent('saveScene');\n                    var table = caption.parentNode;\n                    domUtils.remove(caption);\n                    if (table) {\n                        range.setStart(table.rows[0].cells[0], 0).setCursor(false, true);\n                    }\n                    me.fireEvent('saveScene');\n                }\n\n            }\n\n            if (keyCode == 46) {\n\n                ut = getUETableBySelected(me);\n                if (ut) {\n                    me.fireEvent('saveScene');\n                    for (var i = 0, ci; ci = ut.selectedTds[i++];) {\n                        domUtils.fillNode(me.document, ci)\n                    }\n                    me.fireEvent('saveScene');\n                    domUtils.preventDefault(evt);\n\n                }\n\n            }\n            if (keyCode == 13) {\n\n                var rng = me.selection.getRange(),\n                    caption = domUtils.findParentByTagName(rng.startContainer, 'caption', true);\n                if (caption) {\n                    var table = domUtils.findParentByTagName(caption, 'table');\n                    if (!rng.collapsed) {\n\n                        rng.deleteContents();\n                        me.fireEvent('saveScene');\n                    } else {\n                        if (caption) {\n                            rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true);\n                        }\n                    }\n                    domUtils.preventDefault(evt);\n                    return;\n                }\n                if (rng.collapsed) {\n                    var table = domUtils.findParentByTagName(rng.startContainer, 'table');\n                    if (table) {\n                        var cell = table.rows[0].cells[0],\n                            start = domUtils.findParentByTagName(me.selection.getStart(), ['td', 'th'], true),\n                            preNode = table.previousSibling;\n                        if (cell === start && (!preNode || preNode.nodeType == 1 && preNode.tagName == 'TABLE' ) && domUtils.isStartInblock(rng)) {\n                            var first = domUtils.findParent(me.selection.getStart(), function(n){return domUtils.isBlockElm(n)}, true);\n                            if(first && ( /t(h|d)/i.test(first.tagName) || first ===  start.firstChild )){\n                                me.execCommand('insertparagraphbeforetable');\n                                domUtils.preventDefault(evt);\n                            }\n\n                        }\n                    }\n                }\n            }\n\n            if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == '67') {\n                tableCopyList = null;\n                var ut = getUETableBySelected(me);\n                if (ut) {\n                    var tds = ut.selectedTds;\n                    isFullCol = ut.isFullCol();\n                    isFullRow = ut.isFullRow();\n                    tableCopyList = [\n                        [ut.cloneCell(tds[0],null,true)]\n                    ];\n                    for (var i = 1, ci; ci = tds[i]; i++) {\n                        if (ci.parentNode !== tds[i - 1].parentNode) {\n                            tableCopyList.push([ut.cloneCell(ci,null,true)]);\n                        } else {\n                            tableCopyList[tableCopyList.length - 1].push(ut.cloneCell(ci,null,true));\n                        }\n\n                    }\n                }\n            }\n        });\n        me.addListener(\"tablehasdeleted\",function(){\n            toggleDraggableState(this, false, \"\", null);\n            if (dragButton)domUtils.remove(dragButton);\n        });\n\n        me.addListener('beforepaste', function (cmd, html) {\n            var me = this;\n            var rng = me.selection.getRange();\n            if (domUtils.findParentByTagName(rng.startContainer, 'caption', true)) {\n                var div = me.document.createElement(\"div\");\n                div.innerHTML = html.html;\n                //trace:3729\n                html.html = div[browser.ie9below ? 'innerText' : 'textContent'];\n                return;\n            }\n            var table = getUETableBySelected(me);\n            if (tableCopyList) {\n                me.fireEvent('saveScene');\n                var rng = me.selection.getRange();\n                var td = domUtils.findParentByTagName(rng.startContainer, ['td', 'th'], true), tmpNode, preNode;\n                if (td) {\n                    var ut = getUETable(td);\n                    if (isFullRow) {\n                        var rowIndex = ut.getCellInfo(td).rowIndex;\n                        if (td.tagName == 'TH') {\n                            rowIndex++;\n                        }\n                        for (var i = 0, ci; ci = tableCopyList[i++];) {\n                            var tr = ut.insertRow(rowIndex++, \"td\");\n                            for (var j = 0, cj; cj = ci[j]; j++) {\n                                var cell = tr.cells[j];\n                                if (!cell) {\n                                    cell = tr.insertCell(j)\n                                }\n                                cell.innerHTML = cj.innerHTML;\n                                cj.getAttribute('width') && cell.setAttribute('width', cj.getAttribute('width'));\n                                cj.getAttribute('vAlign') && cell.setAttribute('vAlign', cj.getAttribute('vAlign'));\n                                cj.getAttribute('align') && cell.setAttribute('align', cj.getAttribute('align'));\n                                cj.style.cssText && (cell.style.cssText = cj.style.cssText)\n                            }\n                            for (var j = 0, cj; cj = tr.cells[j]; j++) {\n                                if (!ci[j])\n                                    break;\n                                cj.innerHTML = ci[j].innerHTML;\n                                ci[j].getAttribute('width') && cj.setAttribute('width', ci[j].getAttribute('width'));\n                                ci[j].getAttribute('vAlign') && cj.setAttribute('vAlign', ci[j].getAttribute('vAlign'));\n                                ci[j].getAttribute('align') && cj.setAttribute('align', ci[j].getAttribute('align'));\n                                ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText)\n                            }\n                        }\n                    } else {\n                        if (isFullCol) {\n                            cellInfo = ut.getCellInfo(td);\n                            var maxColNum = 0;\n                            for (var j = 0, ci = tableCopyList[0], cj; cj = ci[j++];) {\n                                maxColNum += cj.colSpan || 1;\n                            }\n                            me.__hasEnterExecCommand = true;\n                            for (i = 0; i < maxColNum; i++) {\n                                me.execCommand('insertcol');\n                            }\n                            me.__hasEnterExecCommand = false;\n                            td = ut.table.rows[0].cells[cellInfo.cellIndex];\n                            if (td.tagName == 'TH') {\n                                td = ut.table.rows[1].cells[cellInfo.cellIndex];\n                            }\n                        }\n                        for (var i = 0, ci; ci = tableCopyList[i++];) {\n                            tmpNode = td;\n                            for (var j = 0, cj; cj = ci[j++];) {\n                                if (td) {\n                                    td.innerHTML = cj.innerHTML;\n                                    //todo 定制处理\n                                    cj.getAttribute('width') && td.setAttribute('width', cj.getAttribute('width'));\n                                    cj.getAttribute('vAlign') && td.setAttribute('vAlign', cj.getAttribute('vAlign'));\n                                    cj.getAttribute('align') && td.setAttribute('align', cj.getAttribute('align'));\n                                    cj.style.cssText && (td.style.cssText = cj.style.cssText);\n                                    preNode = td;\n                                    td = td.nextSibling;\n                                } else {\n                                    var cloneTd = cj.cloneNode(true);\n                                    domUtils.removeAttributes(cloneTd, ['class', 'rowSpan', 'colSpan']);\n\n                                    preNode.parentNode.appendChild(cloneTd)\n                                }\n                            }\n                            td = ut.getNextCell(tmpNode, true, true);\n                            if (!tableCopyList[i])\n                                break;\n                            if (!td) {\n                                var cellInfo = ut.getCellInfo(tmpNode);\n                                ut.table.insertRow(ut.table.rows.length);\n                                ut.update();\n                                td = ut.getVSideCell(tmpNode, true);\n                            }\n                        }\n                    }\n                    ut.update();\n                } else {\n                    table = me.document.createElement('table');\n                    for (var i = 0, ci; ci = tableCopyList[i++];) {\n                        var tr = table.insertRow(table.rows.length);\n                        for (var j = 0, cj; cj = ci[j++];) {\n                            cloneTd = UT.cloneCell(cj,null,true);\n                            domUtils.removeAttributes(cloneTd, ['class']);\n                            tr.appendChild(cloneTd)\n                        }\n                        if (j == 2 && cloneTd.rowSpan > 1) {\n                            cloneTd.rowSpan = 1;\n                        }\n                    }\n\n                    var defaultValue = getDefaultValue(me),\n                        width = me.body.offsetWidth -\n                            (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0);\n                    me.execCommand('insertHTML', '<table  ' +\n                        ( isFullCol && isFullRow ? 'width=\"' + width + '\"' : '') +\n                        '>' + table.innerHTML.replace(/>\\s*</g, '><').replace(/\\bth\\b/gi, \"td\") + '</table>')\n                }\n                me.fireEvent('contentchange');\n                me.fireEvent('saveScene');\n                html.html = '';\n                return true;\n            } else {\n                var div = me.document.createElement(\"div\"), tables;\n                div.innerHTML = html.html;\n                tables = div.getElementsByTagName(\"table\");\n                if (domUtils.findParentByTagName(me.selection.getStart(), 'table')) {\n                    utils.each(tables, function (t) {\n                        domUtils.remove(t)\n                    });\n                    if (domUtils.findParentByTagName(me.selection.getStart(), 'caption', true)) {\n                        div.innerHTML = div[browser.ie ? 'innerText' : 'textContent'];\n                    }\n                } else {\n                    utils.each(tables, function (table) {\n                        removeStyleSize(table, true);\n                        domUtils.removeAttributes(table, ['style', 'border']);\n                        utils.each(domUtils.getElementsByTagName(table, \"td\"), function (td) {\n                            if (isEmptyBlock(td)) {\n                                domUtils.fillNode(me.document, td);\n                            }\n                            removeStyleSize(td, true);\n//                            domUtils.removeAttributes(td, ['style'])\n                        });\n                    });\n                }\n                html.html = div.innerHTML;\n            }\n        });\n\n        me.addListener('afterpaste', function () {\n            utils.each(domUtils.getElementsByTagName(me.body, \"table\"), function (table) {\n                if (table.offsetWidth > me.body.offsetWidth) {\n                    var defaultValue = getDefaultValue(me, table);\n                    table.style.width = me.body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0) + 'px'\n                }\n            })\n        });\n        me.addListener('blur', function () {\n            tableCopyList = null;\n        });\n        var timer;\n        me.addListener('keydown', function () {\n            clearTimeout(timer);\n            timer = setTimeout(function () {\n                var rng = me.selection.getRange(),\n                    cell = domUtils.findParentByTagName(rng.startContainer, ['th', 'td'], true);\n                if (cell) {\n                    var table = cell.parentNode.parentNode.parentNode;\n                    if (table.offsetWidth > table.getAttribute(\"width\")) {\n                        cell.style.wordBreak = \"break-all\";\n                    }\n                }\n\n            }, 100);\n        });\n        me.addListener(\"selectionchange\", function () {\n            toggleDraggableState(me, false, \"\", null);\n        });\n\n\n        //内容变化时触发索引更新\n        //todo 可否考虑标记检测，如果不涉及表格的变化就不进行索引重建和更新\n        me.addListener(\"contentchange\", function () {\n            var me = this;\n            //尽可能排除一些不需要更新的状况\n            hideDragLine(me);\n            if (getUETableBySelected(me))return;\n            var rng = me.selection.getRange();\n            var start = rng.startContainer;\n            start = domUtils.findParentByTagName(start, ['td', 'th'], true);\n            utils.each(domUtils.getElementsByTagName(me.document, 'table'), function (table) {\n                if (me.fireEvent(\"excludetable\", table) === true) return;\n                table.ueTable = new UT(table);\n                //trace:3742\n//                utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) {\n//\n//                    if (domUtils.isEmptyBlock(td) && td !== start) {\n//                        domUtils.fillNode(me.document, td);\n//                        if (browser.ie && browser.version == 6) {\n//                            td.innerHTML = '&nbsp;'\n//                        }\n//                    }\n//                });\n//                utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) {\n//                    if (domUtils.isEmptyBlock(th) && th !== start) {\n//                        domUtils.fillNode(me.document, th);\n//                        if (browser.ie && browser.version == 6) {\n//                            th.innerHTML = '&nbsp;'\n//                        }\n//                    }\n//                });\n                table.onmouseover = function () {\n                    me.fireEvent('tablemouseover', table);\n                };\n                table.onmousemove = function () {\n                    me.fireEvent('tablemousemove', table);\n                    me.options.tableDragable && toggleDragButton(true, this, me);\n                    utils.defer(function(){\n                        me.fireEvent('contentchange',50)\n                    },true)\n                };\n                table.onmouseout = function () {\n                    me.fireEvent('tablemouseout', table);\n                    toggleDraggableState(me, false, \"\", null);\n                    hideDragLine(me);\n                };\n                table.onclick = function (evt) {\n                    evt = me.window.event || evt;\n                    var target = getParentTdOrTh(evt.target || evt.srcElement);\n                    if (!target)return;\n                    var ut = getUETable(target),\n                        table = ut.table,\n                        cellInfo = ut.getCellInfo(target),\n                        cellsRange,\n                        rng = me.selection.getRange();\n//                    if (\"topLeft\" == inPosition(table, mouseCoords(evt))) {\n//                        cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell());\n//                        ut.setSelected(cellsRange);\n//                        return;\n//                    }\n//                    if (\"bottomRight\" == inPosition(table, mouseCoords(evt))) {\n//\n//                        return;\n//                    }\n                    if (inTableSide(table, target, evt, true)) {\n                        var endTdCol = ut.getCell(ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex);\n                        if (evt.shiftKey && ut.selectedTds.length) {\n                            if (ut.selectedTds[0] !== endTdCol) {\n                                cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol);\n                                ut.setSelected(cellsRange);\n                            } else {\n                                rng && rng.selectNodeContents(endTdCol).select();\n                            }\n                        } else {\n                            if (target !== endTdCol) {\n                                cellsRange = ut.getCellsRange(target, endTdCol);\n                                ut.setSelected(cellsRange);\n                            } else {\n                                rng && rng.selectNodeContents(endTdCol).select();\n                            }\n                        }\n                        return;\n                    }\n                    if (inTableSide(table, target, evt)) {\n                        var endTdRow = ut.getCell(ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex);\n                        if (evt.shiftKey && ut.selectedTds.length) {\n                            if (ut.selectedTds[0] !== endTdRow) {\n                                cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow);\n                                ut.setSelected(cellsRange);\n                            } else {\n                                rng && rng.selectNodeContents(endTdRow).select();\n                            }\n                        } else {\n                            if (target !== endTdRow) {\n                                cellsRange = ut.getCellsRange(target, endTdRow);\n                                ut.setSelected(cellsRange);\n                            } else {\n                                rng && rng.selectNodeContents(endTdRow).select();\n                            }\n                        }\n                    }\n                };\n            });\n\n            switchBorderColor(me, true);\n        });\n\n        domUtils.on(me.document, \"mousemove\", mouseMoveEvent);\n\n        domUtils.on(me.document, \"mouseout\", function (evt) {\n            var target = evt.target || evt.srcElement;\n            if (target.tagName == \"TABLE\") {\n                toggleDraggableState(me, false, \"\", null);\n            }\n        });\n        /**\n         * 表格隔行变色\n         */\n        me.addListener(\"interlacetable\",function(type,table,classList){\n            if(!table) return;\n            var me = this,\n                rows = table.rows,\n                len = rows.length,\n                getClass = function(list,index,repeat){\n                    return list[index] ? list[index] : repeat ? list[index % list.length]: \"\";\n                };\n            for(var i = 0;i<len;i++){\n                rows[i].className = getClass( classList|| me.options.classList,i,true);\n            }\n        });\n        me.addListener(\"uninterlacetable\",function(type,table){\n            if(!table) return;\n            var me = this,\n                rows = table.rows,\n                classList = me.options.classList,\n                len = rows.length;\n            for(var i = 0;i<len;i++){\n                domUtils.removeClasses( rows[i], classList );\n            }\n        });\n\n        me.addListener(\"mousedown\", mouseDownEvent);\n        me.addListener(\"mouseup\", mouseUpEvent);\n        //拖动的时候触发mouseup\n        domUtils.on( me.body, 'dragstart', function( evt ){\n            mouseUpEvent.call( me, 'dragstart', evt );\n        });\n        me.addOutputRule(function(root){\n            utils.each(root.getNodesByTagName('div'),function(n){\n                if (n.getAttr('id') == 'ue_tableDragLine') {\n                    n.parentNode.removeChild(n);\n                }\n            });\n        });\n\n        var currentRowIndex = 0;\n        me.addListener(\"mousedown\", function () {\n            currentRowIndex = 0;\n        });\n        me.addListener('tabkeydown', function () {\n            var range = this.selection.getRange(),\n                common = range.getCommonAncestor(true, true),\n                table = domUtils.findParentByTagName(common, 'table');\n            if (table) {\n                if (domUtils.findParentByTagName(common, 'caption', true)) {\n                    var cell = domUtils.getElementsByTagName(table, 'th td');\n                    if (cell && cell.length) {\n                        range.setStart(cell[0], 0).setCursor(false, true)\n                    }\n                } else {\n                    var cell = domUtils.findParentByTagName(common, ['td', 'th'], true),\n                        ua = getUETable(cell);\n                    currentRowIndex = cell.rowSpan > 1 ? currentRowIndex : ua.getCellInfo(cell).rowIndex;\n                    var nextCell = ua.getTabNextCell(cell, currentRowIndex);\n                    if (nextCell) {\n                        if (isEmptyBlock(nextCell)) {\n                            range.setStart(nextCell, 0).setCursor(false, true)\n                        } else {\n                            range.selectNodeContents(nextCell).select()\n                        }\n                    } else {\n                        me.fireEvent('saveScene');\n                        me.__hasEnterExecCommand = true;\n                        this.execCommand('insertrownext');\n                        me.__hasEnterExecCommand = false;\n                        range = this.selection.getRange();\n                        range.setStart(table.rows[table.rows.length - 1].cells[0], 0).setCursor();\n                        me.fireEvent('saveScene');\n                    }\n                }\n                return true;\n            }\n\n        });\n        browser.ie && me.addListener('selectionchange', function () {\n            toggleDraggableState(this, false, \"\", null);\n        });\n        me.addListener(\"keydown\", function (type, evt) {\n            var me = this;\n            //处理在表格的最后一个输入tab产生新的表格\n            var keyCode = evt.keyCode || evt.which;\n            if (keyCode == 8 || keyCode == 46) {\n                return;\n            }\n            var notCtrlKey = !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey;\n            notCtrlKey && removeSelectedClass(domUtils.getElementsByTagName(me.body, \"td\"));\n            var ut = getUETableBySelected(me);\n            if (!ut) return;\n            notCtrlKey && ut.clearSelected();\n        });\n\n        me.addListener(\"beforegetcontent\", function () {\n            switchBorderColor(this, false);\n            browser.ie && utils.each(this.document.getElementsByTagName('caption'), function (ci) {\n                if (domUtils.isEmptyNode(ci)) {\n                    ci.innerHTML = '&nbsp;'\n                }\n            });\n        });\n        me.addListener(\"aftergetcontent\", function () {\n            switchBorderColor(this, true);\n        });\n        me.addListener(\"getAllHtml\", function () {\n            removeSelectedClass(me.document.getElementsByTagName(\"td\"));\n        });\n        //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况\n        me.addListener(\"fullscreenchanged\", function (type, fullscreen) {\n            if (!fullscreen) {\n                var ratio = this.body.offsetWidth / document.body.offsetWidth,\n                    tables = domUtils.getElementsByTagName(this.body, \"table\");\n                utils.each(tables, function (table) {\n                    if (table.offsetWidth < me.body.offsetWidth) return false;\n                    var tds = domUtils.getElementsByTagName(table, \"td\"),\n                        backWidths = [];\n                    utils.each(tds, function (td) {\n                        backWidths.push(td.offsetWidth);\n                    });\n                    for (var i = 0, td; td = tds[i]; i++) {\n                        td.setAttribute(\"width\", Math.floor(backWidths[i] * ratio));\n                    }\n                    table.setAttribute(\"width\", Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me))))\n                });\n            }\n        });\n\n        //重写execCommand命令，用于处理框选时的处理\n        var oldExecCommand = me.execCommand;\n        me.execCommand = function (cmd, datatat) {\n\n            var me = this,\n                args = arguments;\n\n            cmd = cmd.toLowerCase();\n            var ut = getUETableBySelected(me), tds,\n                range = new dom.Range(me.document),\n                cmdFun = me.commands[cmd] || UE.commands[cmd],\n                result;\n            if (!cmdFun) return;\n            if (ut && !commands[cmd] && !cmdFun.notNeedUndo && !me.__hasEnterExecCommand) {\n                me.__hasEnterExecCommand = true;\n                me.fireEvent(\"beforeexeccommand\", cmd);\n                tds = ut.selectedTds;\n                var lastState = -2, lastValue = -2, value, state;\n                for (var i = 0, td; td = tds[i]; i++) {\n                    if (isEmptyBlock(td)) {\n                        range.setStart(td, 0).setCursor(false, true)\n                    } else {\n                        range.selectNode(td).select(true);\n                    }\n                    state = me.queryCommandState(cmd);\n                    value = me.queryCommandValue(cmd);\n                    if (state != -1) {\n                        if (lastState !== state || lastValue !== value) {\n                            me._ignoreContentChange = true;\n                            result = oldExecCommand.apply(me, arguments);\n                            me._ignoreContentChange = false;\n\n                        }\n                        lastState = me.queryCommandState(cmd);\n                        lastValue = me.queryCommandValue(cmd);\n                        if (domUtils.isEmptyBlock(td)) {\n                            domUtils.fillNode(me.document, td)\n                        }\n                    }\n                }\n                range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true);\n                me.fireEvent('contentchange');\n                me.fireEvent(\"afterexeccommand\", cmd);\n                me.__hasEnterExecCommand = false;\n                me._selectionChange();\n            } else {\n                result = oldExecCommand.apply(me, arguments);\n            }\n            return result;\n        };\n\n\n    });\n    /**\n     * 删除obj的宽高style，改成属性宽高\n     * @param obj\n     * @param replaceToProperty\n     */\n    function removeStyleSize(obj, replaceToProperty) {\n        removeStyle(obj, \"width\", true);\n        removeStyle(obj, \"height\", true);\n    }\n\n    function removeStyle(obj, styleName, replaceToProperty) {\n        if (obj.style[styleName]) {\n            replaceToProperty && obj.setAttribute(styleName, parseInt(obj.style[styleName], 10));\n            obj.style[styleName] = \"\";\n        }\n    }\n\n    function getParentTdOrTh(ele) {\n        if (ele.tagName == \"TD\" || ele.tagName == \"TH\") return ele;\n        var td;\n        if (td = domUtils.findParentByTagName(ele, \"td\", true) || domUtils.findParentByTagName(ele, \"th\", true)) return td;\n        return null;\n    }\n\n    function isEmptyBlock(node) {\n        var reg = new RegExp(domUtils.fillChar, 'g');\n        if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\\s*$/, '').replace(reg, '').length > 0) {\n            return 0;\n        }\n        for (var n in dtd.$isNotEmpty) {\n            if (node.getElementsByTagName(n).length) {\n                return 0;\n            }\n        }\n        return 1;\n    }\n\n\n    function mouseCoords(evt) {\n        if (evt.pageX || evt.pageY) {\n            return { x:evt.pageX, y:evt.pageY };\n        }\n        return {\n            x:evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft,\n            y:evt.clientY + me.document.body.scrollTop - me.document.body.clientTop\n        };\n    }\n\n    function mouseMoveEvent(evt) {\n\n        if( isEditorDisabled() ) {\n            return;\n        }\n\n        try {\n\n            //普通状态下鼠标移动\n            var target = getParentTdOrTh(evt.target || evt.srcElement),\n                pos;\n\n            //区分用户的行为是拖动还是双击\n            if( isInResizeBuffer  ) {\n\n                me.body.style.webkitUserSelect = 'none';\n\n                if( Math.abs( userActionStatus.x - evt.clientX ) > offsetOfTableCell || Math.abs( userActionStatus.y - evt.clientY ) > offsetOfTableCell ) {\n                    clearTableDragTimer();\n                    isInResizeBuffer = false;\n                    singleClickState = 0;\n                    //drag action\n                    tableBorderDrag(evt);\n                }\n            }\n\n            //修改单元格大小时的鼠标移动\n            if (onDrag && dragTd) {\n                singleClickState = 0;\n                me.body.style.webkitUserSelect = 'none';\n                me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges']();\n                pos = mouseCoords(evt);\n                toggleDraggableState(me, true, onDrag, pos, target);\n                if (onDrag == \"h\") {\n                    dragLine.style.left = getPermissionX(dragTd, evt) + \"px\";\n                } else if (onDrag == \"v\") {\n                    dragLine.style.top = getPermissionY(dragTd, evt) + \"px\";\n                }\n                return;\n            }\n            //当鼠标处于table上时，修改移动过程中的光标状态\n            if (target) {\n                //针对使用table作为容器的组件不触发拖拽效果\n                if (me.fireEvent('excludetable', target) === true)\n                    return;\n                pos = mouseCoords(evt);\n                var state = getRelation(target, pos),\n                    table = domUtils.findParentByTagName(target, \"table\", true);\n\n                if (inTableSide(table, target, evt, true)) {\n                    if (me.fireEvent(\"excludetable\", table) === true) return;\n                    me.body.style.cursor = \"url(\" + me.options.cursorpath + \"h.png),pointer\";\n                } else if (inTableSide(table, target, evt)) {\n                    if (me.fireEvent(\"excludetable\", table) === true) return;\n                    me.body.style.cursor = \"url(\" + me.options.cursorpath + \"v.png),pointer\";\n                } else {\n                    me.body.style.cursor = \"text\";\n                    var curCell = target;\n                    if (/\\d/.test(state)) {\n                        state = state.replace(/\\d/, '');\n                        target = getUETable(target).getPreviewCell(target, state == \"v\");\n                    }\n                    //位于第一行的顶部或者第一列的左边时不可拖动\n                    toggleDraggableState(me, target ? !!state : false, target ? state : '', pos, target);\n\n                }\n            } else {\n                toggleDragButton(false, table, me);\n            }\n\n        } catch (e) {\n            showError(e);\n        }\n    }\n\n    var dragButtonTimer;\n\n    function toggleDragButton(show, table, editor) {\n        if (!show) {\n            if (dragOver)return;\n            dragButtonTimer = setTimeout(function () {\n                !dragOver && dragButton && dragButton.parentNode && dragButton.parentNode.removeChild(dragButton);\n            }, 2000);\n        } else {\n            createDragButton(table, editor);\n        }\n    }\n\n    function createDragButton(table, editor) {\n        var pos = domUtils.getXY(table),\n            doc = table.ownerDocument;\n        if (dragButton && dragButton.parentNode)return dragButton;\n        dragButton = doc.createElement(\"div\");\n        dragButton.contentEditable = false;\n        dragButton.innerHTML = \"\";\n        dragButton.style.cssText = \"width:15px;height:15px;background-image:url(\" + editor.options.UEDITOR_HOME_URL + \"dialogs/table/dragicon.png);position: absolute;cursor:move;top:\" + (pos.y - 15) + \"px;left:\" + (pos.x) + \"px;\";\n        domUtils.unSelectable(dragButton);\n        dragButton.onmouseover = function (evt) {\n            dragOver = true;\n        };\n        dragButton.onmouseout = function (evt) {\n            dragOver = false;\n        };\n        domUtils.on(dragButton, 'click', function (type, evt) {\n            doClick(evt, this);\n        });\n        domUtils.on(dragButton, 'dblclick', function (type, evt) {\n            doDblClick(evt);\n        });\n        domUtils.on(dragButton, 'dragstart', function (type, evt) {\n            domUtils.preventDefault(evt);\n        });\n        var timer;\n\n        function doClick(evt, button) {\n            // 部分浏览器下需要清理\n            clearTimeout(timer);\n            timer = setTimeout(function () {\n                editor.fireEvent(\"tableClicked\", table, button);\n            }, 300);\n        }\n\n        function doDblClick(evt) {\n            clearTimeout(timer);\n            var ut = getUETable(table),\n                start = table.rows[0].cells[0],\n                end = ut.getLastCell(),\n                range = ut.getCellsRange(start, end);\n            editor.selection.getRange().setStart(start, 0).setCursor(false, true);\n            ut.setSelected(range);\n        }\n\n        doc.body.appendChild(dragButton);\n    }\n\n\n//    function inPosition(table, pos) {\n//        var tablePos = domUtils.getXY(table),\n//            width = table.offsetWidth,\n//            height = table.offsetHeight;\n//        if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) {\n//            return \"topLeft\";\n//        } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) {\n//            return \"bottomRight\";\n//        }\n//    }\n\n    function inTableSide(table, cell, evt, top) {\n        var pos = mouseCoords(evt),\n            state = getRelation(cell, pos);\n\n        if (top) {\n            var caption = table.getElementsByTagName(\"caption\")[0],\n                capHeight = caption ? caption.offsetHeight : 0;\n            return (state == \"v1\") && ((pos.y - domUtils.getXY(table).y - capHeight) < 8);\n        } else {\n            return (state == \"h1\") && ((pos.x - domUtils.getXY(table).x) < 8);\n        }\n    }\n\n    /**\n     * 获取拖动时允许的X轴坐标\n     * @param dragTd\n     * @param evt\n     */\n    function getPermissionX(dragTd, evt) {\n        var ut = getUETable(dragTd);\n        if (ut) {\n            var preTd = ut.getSameEndPosCells(dragTd, \"x\")[0],\n                nextTd = ut.getSameStartPosXCells(dragTd)[0],\n                mouseX = mouseCoords(evt).x,\n                left = (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20 ,\n                right = nextTd ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 : (me.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(me.body, \"width\"), 10));\n\n            left += cellMinWidth;\n            right -= cellMinWidth;\n\n            return mouseX < left ? left : mouseX > right ? right : mouseX;\n        }\n    }\n\n    /**\n     * 获取拖动时允许的Y轴坐标\n     */\n    function getPermissionY(dragTd, evt) {\n        try {\n            var top = domUtils.getXY(dragTd).y,\n                mousePosY = mouseCoords(evt).y;\n            return mousePosY < top ? top : mousePosY;\n        } catch (e) {\n            showError(e);\n        }\n    }\n\n    /**\n     * 移动状态切换\n     */\n    function toggleDraggableState(editor, draggable, dir, mousePos, cell) {\n        try {\n            editor.body.style.cursor = dir == \"h\" ? \"col-resize\" : dir == \"v\" ? \"row-resize\" : \"text\";\n            if (browser.ie) {\n                if (dir && !mousedown && !getUETableBySelected(editor)) {\n                    getDragLine(editor, editor.document);\n                    showDragLineAt(dir, cell);\n                } else {\n                    hideDragLine(editor)\n                }\n            }\n            onBorder = draggable;\n        } catch (e) {\n            showError(e);\n        }\n    }\n\n    /**\n     * 获取与UETable相关的resize line\n     * @param uetable UETable对象\n     */\n    function getResizeLineByUETable() {\n\n        var lineId = '_UETableResizeLine',\n            line = this.document.getElementById( lineId );\n\n        if( !line ) {\n            line = this.document.createElement(\"div\");\n            line.id = lineId;\n            line.contnetEditable = false;\n            line.setAttribute(\"unselectable\", \"on\");\n\n            var styles = {\n                width: 2*cellBorderWidth + 1 + 'px',\n                position: 'absolute',\n                'z-index': 100000,\n                cursor: 'col-resize',\n                background: 'red',\n                display: 'none'\n            };\n\n            //切换状态\n            line.onmouseout = function(){\n                this.style.display = 'none';\n            };\n\n            utils.extend( line.style, styles );\n\n            this.document.body.appendChild( line );\n\n        }\n\n        return line;\n\n    }\n\n    /**\n     * 更新resize-line\n     */\n    function updateResizeLine( cell, uetable ) {\n\n        var line = getResizeLineByUETable.call( this ),\n            table = uetable.table,\n            styles = {\n                top: domUtils.getXY( table ).y + 'px',\n                left: domUtils.getXY( cell).x + cell.offsetWidth - cellBorderWidth + 'px',\n                display: 'block',\n                height: table.offsetHeight + 'px'\n            };\n\n        utils.extend( line.style, styles );\n\n    }\n\n    /**\n     * 显示resize-line\n     */\n    function showResizeLine( cell ) {\n\n        var uetable = getUETable( cell );\n\n        updateResizeLine.call( this, cell, uetable );\n\n    }\n\n    /**\n     * 获取鼠标与当前单元格的相对位置\n     * @param ele\n     * @param mousePos\n     */\n    function getRelation(ele, mousePos) {\n        var elePos = domUtils.getXY(ele);\n\n        if( !elePos ) {\n            return '';\n        }\n\n        if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) {\n            return \"h\";\n        }\n        if (mousePos.x - elePos.x < cellBorderWidth) {\n            return 'h1'\n        }\n        if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) {\n            return \"v\";\n        }\n        if (mousePos.y - elePos.y < cellBorderWidth) {\n            return 'v1'\n        }\n        return '';\n    }\n\n    function mouseDownEvent(type, evt) {\n\n        if( isEditorDisabled() ) {\n            return ;\n        }\n\n        userActionStatus = {\n            x: evt.clientX,\n            y: evt.clientY\n        };\n\n        //右键菜单单独处理\n        if (evt.button == 2) {\n            var ut = getUETableBySelected(me),\n                flag = false;\n\n            if (ut) {\n                var td = getTargetTd(me, evt);\n                utils.each(ut.selectedTds, function (ti) {\n                    if (ti === td) {\n                        flag = true;\n                    }\n                });\n                if (!flag) {\n                    removeSelectedClass(domUtils.getElementsByTagName(me.body, \"th td\"));\n                    ut.clearSelected()\n                } else {\n                    td = ut.selectedTds[0];\n                    setTimeout(function () {\n                        me.selection.getRange().setStart(td, 0).setCursor(false, true);\n                    }, 0);\n\n                }\n            }\n        } else {\n            tableClickHander( evt );\n        }\n\n    }\n\n    //清除表格的计时器\n    function clearTableTimer() {\n        tabTimer && clearTimeout( tabTimer );\n        tabTimer = null;\n    }\n\n    //双击收缩\n    function tableDbclickHandler(evt) {\n        singleClickState = 0;\n        evt = evt || me.window.event;\n        var target = getParentTdOrTh(evt.target || evt.srcElement);\n        if (target) {\n            var h;\n            if (h = getRelation(target, mouseCoords(evt))) {\n\n                hideDragLine( me );\n\n                if (h == 'h1') {\n                    h = 'h';\n                    if (inTableSide(domUtils.findParentByTagName(target, \"table\"), target, evt)) {\n                        me.execCommand('adaptbywindow');\n                    } else {\n                        target = getUETable(target).getPreviewCell(target);\n                        if (target) {\n                            var rng = me.selection.getRange();\n                            rng.selectNodeContents(target).setCursor(true, true)\n                        }\n                    }\n                }\n                if (h == 'h') {\n                    var ut = getUETable(target),\n                        table = ut.table,\n                        cells = getCellsByMoveBorder( target, table, true );\n\n                    cells = extractArray( cells, 'left' );\n\n                    ut.width = ut.offsetWidth;\n\n                    var oldWidth = [],\n                        newWidth = [];\n\n                    utils.each( cells, function( cell ){\n\n                        oldWidth.push( cell.offsetWidth );\n\n                    } );\n\n                    utils.each( cells, function( cell ){\n\n                        cell.removeAttribute(\"width\");\n\n                    } );\n\n                    window.setTimeout( function(){\n\n                        //是否允许改变\n                        var changeable = true;\n\n                        utils.each( cells, function( cell, index ){\n\n                            var width = cell.offsetWidth;\n\n                            if( width > oldWidth[index] ) {\n                                changeable = false;\n                                return false;\n                            }\n\n                            newWidth.push( width );\n\n                        } );\n\n                        var change = changeable ? newWidth : oldWidth;\n\n                        utils.each( cells, function( cell, index ){\n\n                            cell.width = change[index] - getTabcellSpace();\n\n                        } );\n\n\n                    }, 0 );\n\n//                    minWidth -= cellMinWidth;\n//\n//                    table.removeAttribute(\"width\");\n//                    utils.each(cells, function (cell) {\n//                        cell.style.width = \"\";\n//                        cell.width -= minWidth;\n//                    });\n\n                }\n            }\n        }\n    }\n\n    function tableClickHander( evt ) {\n\n        removeSelectedClass(domUtils.getElementsByTagName(me.body, \"td th\"));\n        //trace:3113\n        //选中单元格，点击table外部，不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值\n        utils.each(me.document.getElementsByTagName('table'), function (t) {\n            t.ueTable = null;\n        });\n        startTd = getTargetTd(me, evt);\n        if( !startTd ) return;\n        var table = domUtils.findParentByTagName(startTd, \"table\", true);\n        ut = getUETable(table);\n        ut && ut.clearSelected();\n\n        //判断当前鼠标状态\n        if (!onBorder) {\n            me.document.body.style.webkitUserSelect = '';\n            mousedown = true;\n            me.addListener('mouseover', mouseOverEvent);\n        } else {\n            //边框上的动作处理\n            borderActionHandler( evt );\n        }\n\n\n    }\n\n    //处理表格边框上的动作, 这里做延时处理，避免两种动作互相影响\n    function borderActionHandler( evt ) {\n\n        if ( browser.ie ) {\n            evt = reconstruct(evt );\n        }\n\n        clearTableDragTimer();\n\n        //是否正在等待resize的缓冲中\n        isInResizeBuffer = true;\n\n        tableDragTimer = setTimeout(function(){\n            tableBorderDrag( evt );\n        }, dblclickTime);\n\n    }\n\n    function extractArray( originArr, key ) {\n\n        var result = [],\n            tmp = null;\n\n        for( var i = 0, len = originArr.length; i<len; i++ ) {\n\n            tmp = originArr[ i ][ key ];\n\n            if( tmp ) {\n                result.push( tmp );\n            }\n\n        }\n\n        return result;\n\n    }\n\n    function clearTableDragTimer() {\n        tableDragTimer && clearTimeout(tableDragTimer);\n        tableDragTimer = null;\n    }\n\n    function reconstruct( obj ) {\n\n        var attrs = ['pageX', 'pageY', 'clientX', 'clientY', 'srcElement', 'target'],\n            newObj = {};\n\n        if( obj ) {\n\n            for( var i = 0, key, val; key = attrs[i]; i++ ) {\n                val=obj[ key ];\n                val && (newObj[ key ] = val);\n            }\n\n        }\n\n        return newObj;\n\n    }\n\n    //边框拖动\n    function tableBorderDrag( evt ) {\n\n        isInResizeBuffer = false;\n\n        startTd = evt.target || evt.srcElement;\n        if( !startTd ) return;\n        var state = getRelation(startTd, mouseCoords(evt));\n        if (/\\d/.test(state)) {\n            state = state.replace(/\\d/, '');\n            startTd = getUETable(startTd).getPreviewCell(startTd, state == 'v');\n        }\n        hideDragLine(me);\n        getDragLine(me, me.document);\n        me.fireEvent('saveScene');\n        showDragLineAt(state, startTd);\n        mousedown = true;\n        //拖动开始\n        onDrag = state;\n        dragTd = startTd;\n    }\n\n    function mouseUpEvent(type, evt) {\n\n        if( isEditorDisabled() ) {\n            return ;\n        }\n\n        clearTableDragTimer();\n\n        isInResizeBuffer = false;\n\n        if( onBorder ) {\n            singleClickState = ++singleClickState % 3;\n\n            userActionStatus = {\n                x: evt.clientX,\n                y: evt.clientY\n            };\n\n            tableResizeTimer = setTimeout(function(){\n                singleClickState > 0 && singleClickState--;\n            }, dblclickTime );\n\n            if( singleClickState === 2 ) {\n\n                singleClickState = 0;\n                tableDbclickHandler(evt);\n                return;\n\n            }\n\n        }\n\n        if (evt.button == 2)return;\n        var me = this;\n        //清除表格上原生跨选问题\n        var range = me.selection.getRange(),\n            start = domUtils.findParentByTagName(range.startContainer, 'table', true),\n            end = domUtils.findParentByTagName(range.endContainer, 'table', true);\n\n        if (start || end) {\n            if (start === end) {\n                start = domUtils.findParentByTagName(range.startContainer, ['td', 'th', 'caption'], true);\n                end = domUtils.findParentByTagName(range.endContainer, ['td', 'th', 'caption'], true);\n                if (start !== end) {\n                    me.selection.clearRange()\n                }\n            } else {\n                me.selection.clearRange()\n            }\n        }\n        mousedown = false;\n        me.document.body.style.webkitUserSelect = '';\n        //拖拽状态下的mouseUP\n        if ( onDrag && dragTd ) {\n\n            me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges']();\n\n            singleClickState = 0;\n            dragLine = me.document.getElementById('ue_tableDragLine');\n\n            // trace 3973\n            if (dragLine) {\n                var dragTdPos = domUtils.getXY(dragTd),\n                    dragLinePos = domUtils.getXY(dragLine);\n\n                switch (onDrag) {\n                    case \"h\":\n                        changeColWidth(dragTd, dragLinePos.x - dragTdPos.x);\n                        break;\n                    case \"v\":\n                        changeRowHeight(dragTd, dragLinePos.y - dragTdPos.y - dragTd.offsetHeight);\n                        break;\n                    default:\n                }\n                onDrag = \"\";\n                dragTd = null;\n\n                hideDragLine(me);\n                me.fireEvent('saveScene');\n                return;\n            }\n        }\n        //正常状态下的mouseup\n        if (!startTd) {\n            var target = domUtils.findParentByTagName(evt.target || evt.srcElement, \"td\", true);\n            if (!target) target = domUtils.findParentByTagName(evt.target || evt.srcElement, \"th\", true);\n            if (target && (target.tagName == \"TD\" || target.tagName == \"TH\")) {\n                if (me.fireEvent(\"excludetable\", target) === true) return;\n                range = new dom.Range(me.document);\n                range.setStart(target, 0).setCursor(false, true);\n            }\n        } else {\n            var ut = getUETable(startTd),\n                cell = ut ? ut.selectedTds[0] : null;\n            if (cell) {\n                range = new dom.Range(me.document);\n                if (domUtils.isEmptyBlock(cell)) {\n                    range.setStart(cell, 0).setCursor(false, true);\n                } else {\n                    range.selectNodeContents(cell).shrinkBoundary().setCursor(false, true);\n                }\n            } else {\n                range = me.selection.getRange().shrinkBoundary();\n                if (!range.collapsed) {\n                    var start = domUtils.findParentByTagName(range.startContainer, ['td', 'th'], true),\n                        end = domUtils.findParentByTagName(range.endContainer, ['td', 'th'], true);\n                    //在table里边的不能清除\n                    if (start && !end || !start && end || start && end && start !== end) {\n                        range.setCursor(false, true);\n                    }\n                }\n            }\n            startTd = null;\n            me.removeListener('mouseover', mouseOverEvent);\n        }\n        me._selectionChange(250, evt);\n    }\n\n    function mouseOverEvent(type, evt) {\n\n        if( isEditorDisabled() ) {\n            return;\n        }\n\n        var me = this,\n            tar = evt.target || evt.srcElement;\n        currentTd = domUtils.findParentByTagName(tar, \"td\", true) || domUtils.findParentByTagName(tar, \"th\", true);\n        //需要判断两个TD是否位于同一个表格内\n        if (startTd && currentTd &&\n            ((startTd.tagName == \"TD\" && currentTd.tagName == \"TD\") || (startTd.tagName == \"TH\" && currentTd.tagName == \"TH\")) &&\n            domUtils.findParentByTagName(startTd, 'table') == domUtils.findParentByTagName(currentTd, 'table')) {\n            var ut = getUETable(currentTd);\n            if (startTd != currentTd) {\n                me.document.body.style.webkitUserSelect = 'none';\n                me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges']();\n                var range = ut.getCellsRange(startTd, currentTd);\n                ut.setSelected(range);\n            } else {\n                me.document.body.style.webkitUserSelect = '';\n                ut.clearSelected();\n            }\n\n        }\n        evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);\n    }\n\n    function setCellHeight(cell, height, backHeight) {\n        var lineHight = parseInt(domUtils.getComputedStyle(cell, \"line-height\"), 10),\n            tmpHeight = backHeight + height;\n        height = tmpHeight < lineHight ? lineHight : tmpHeight;\n        if (cell.style.height) cell.style.height = \"\";\n        cell.rowSpan == 1 ? cell.setAttribute(\"height\", height) : (cell.removeAttribute && cell.removeAttribute(\"height\"));\n    }\n\n    function getWidth(cell) {\n        if (!cell)return 0;\n        return parseInt(domUtils.getComputedStyle(cell, \"width\"), 10);\n    }\n\n    function changeColWidth(cell, changeValue) {\n\n        var ut = getUETable(cell);\n        if (ut) {\n\n            //根据当前移动的边框获取相关的单元格\n            var table = ut.table,\n                cells = getCellsByMoveBorder( cell, table );\n\n            table.style.width = \"\";\n            table.removeAttribute(\"width\");\n\n            //修正改变量\n            changeValue = correctChangeValue( changeValue, cell, cells );\n\n            if (cell.nextSibling) {\n\n                var i=0;\n\n                utils.each( cells, function( cellGroup ){\n\n                    cellGroup.left.width = (+cellGroup.left.width)+changeValue;\n                    cellGroup.right && ( cellGroup.right.width = (+cellGroup.right.width)-changeValue );\n\n                } );\n\n            } else {\n\n                utils.each( cells, function( cellGroup ){\n                    cellGroup.left.width -= -changeValue;\n                } );\n\n            }\n        }\n\n    }\n\n    function isEditorDisabled() {\n        return me.body.contentEditable === \"false\";\n    }\n\n    function changeRowHeight(td, changeValue) {\n        if (Math.abs(changeValue) < 10) return;\n        var ut = getUETable(td);\n        if (ut) {\n            var cells = ut.getSameEndPosCells(td, \"y\"),\n            //备份需要连带变化的td的原始高度，否则后期无法获取正确的值\n                backHeight = cells[0] ? cells[0].offsetHeight : 0;\n            for (var i = 0, cell; cell = cells[i++];) {\n                setCellHeight(cell, changeValue, backHeight);\n            }\n        }\n\n    }\n\n    /**\n     * 获取调整单元格大小的相关单元格\n     * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格\n     */\n    function getCellsByMoveBorder( cell, table, isContainMergeCell ) {\n\n        if( !table ) {\n            table = domUtils.findParentByTagName( cell, 'table' );\n        }\n\n        if( !table ) {\n            return null;\n        }\n\n        //获取到该单元格所在行的序列号\n        var index = domUtils.getNodeIndex( cell ),\n            temp = cell,\n            rows = table.rows,\n            colIndex = 0;\n\n        while( temp ) {\n            //获取到当前单元格在未发生单元格合并时的序列\n            if( temp.nodeType === 1 ) {\n                colIndex += (temp.colSpan || 1);\n            }\n            temp = temp.previousSibling;\n        }\n\n        temp = null;\n\n        //记录想关的单元格\n        var borderCells = [];\n\n        utils.each(rows, function( tabRow ){\n\n            var cells = tabRow.cells,\n                currIndex = 0;\n\n            utils.each( cells, function( tabCell ){\n\n                currIndex += (tabCell.colSpan || 1);\n\n                if( currIndex === colIndex ) {\n\n                    borderCells.push({\n                        left: tabCell,\n                        right: tabCell.nextSibling || null\n                    });\n\n                    return false;\n\n                } else if( currIndex > colIndex ) {\n\n                    if( isContainMergeCell ) {\n                        borderCells.push({\n                            left: tabCell\n                        });\n                    }\n\n                    return false;\n                }\n\n\n            } );\n\n        });\n\n        return borderCells;\n\n    }\n\n\n    /**\n     * 通过给定的单元格集合获取最小的单元格width\n     */\n    function getMinWidthByTableCells( cells ) {\n\n        var minWidth = Number.MAX_VALUE;\n\n        for( var i = 0, curCell; curCell = cells[ i ] ; i++ ) {\n\n            minWidth = Math.min( minWidth, curCell.width || getTableCellWidth( curCell ) );\n\n        }\n\n        return minWidth;\n\n    }\n\n    function correctChangeValue( changeValue, relatedCell, cells ) {\n\n        //为单元格的paading预留空间\n        changeValue -= getTabcellSpace();\n\n        if( changeValue < 0 ) {\n            return 0;\n        }\n\n        changeValue -= getTableCellWidth( relatedCell );\n\n        //确定方向\n        var direction = changeValue < 0 ? 'left':'right';\n\n        changeValue = Math.abs(changeValue);\n\n        //只关心非最后一个单元格就可以\n        utils.each( cells, function( cellGroup ){\n\n            var curCell = cellGroup[direction];\n\n            //为单元格保留最小空间\n            if( curCell ) {\n                changeValue = Math.min( changeValue, getTableCellWidth( curCell )-cellMinWidth );\n            }\n\n\n        } );\n\n\n        //修正越界\n        changeValue = changeValue < 0 ? 0 : changeValue;\n\n        return direction === 'left' ? -changeValue : changeValue;\n\n    }\n\n    function getTableCellWidth( cell ) {\n\n        var width = 0,\n            //偏移纠正量\n            offset = 0,\n            width = cell.offsetWidth - getTabcellSpace();\n\n        //最后一个节点纠正一下\n        if( !cell.nextSibling ) {\n\n            width -= getTableCellOffset( cell );\n\n        }\n\n        width = width < 0 ? 0 : width;\n\n        try {\n            cell.width = width;\n        } catch(e) {\n        }\n\n        return width;\n\n    }\n\n    /**\n     * 获取单元格所在表格的最末单元格的偏移量\n     */\n    function getTableCellOffset( cell ) {\n\n        tab = domUtils.findParentByTagName( cell, \"table\", false);\n\n        if( tab.offsetVal === undefined ) {\n\n            var prev = cell.previousSibling;\n\n            if( prev ) {\n\n                //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width， 则条件成立\n                tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth ? UT.borderWidth : 0;\n\n            } else {\n                tab.offsetVal = 0;\n            }\n\n        }\n\n        return tab.offsetVal;\n\n    }\n\n    function getTabcellSpace() {\n\n        if( UT.tabcellSpace === undefined ) {\n\n            var cell = null,\n                tab = me.document.createElement(\"table\"),\n                tbody = me.document.createElement(\"tbody\"),\n                trow = me.document.createElement(\"tr\"),\n                tabcell = me.document.createElement(\"td\"),\n                mirror = null;\n\n            tabcell.style.cssText = 'border: 0;';\n            tabcell.width = 1;\n\n            trow.appendChild( tabcell );\n            trow.appendChild( mirror = tabcell.cloneNode( false ) );\n\n            tbody.appendChild( trow );\n\n            tab.appendChild( tbody );\n\n            tab.style.cssText = \"visibility: hidden;\";\n\n            me.body.appendChild( tab );\n\n            UT.paddingSpace = tabcell.offsetWidth - 1;\n\n            var tmpTabWidth = tab.offsetWidth;\n\n            tabcell.style.cssText = '';\n            mirror.style.cssText = '';\n\n            UT.borderWidth = ( tab.offsetWidth - tmpTabWidth ) / 3;\n\n            UT.tabcellSpace = UT.paddingSpace + UT.borderWidth;\n\n            me.body.removeChild( tab );\n\n        }\n\n        getTabcellSpace = function(){ return UT.tabcellSpace; };\n\n        return UT.tabcellSpace;\n\n    }\n\n    function getDragLine(editor, doc) {\n        if (mousedown)return;\n        dragLine = editor.document.createElement(\"div\");\n        domUtils.setAttributes(dragLine, {\n            id:\"ue_tableDragLine\",\n            unselectable:'on',\n            contenteditable:false,\n            'onresizestart':'return false',\n            'ondragstart':'return false',\n            'onselectstart':'return false',\n            style:\"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)\"\n        });\n        editor.body.appendChild(dragLine);\n    }\n\n    function hideDragLine(editor) {\n        if (mousedown)return;\n        var line;\n        while (line = editor.document.getElementById('ue_tableDragLine')) {\n            domUtils.remove(line)\n        }\n    }\n\n    /**\n     * 依据state（v|h）在cell位置显示横线\n     * @param state\n     * @param cell\n     */\n    function showDragLineAt(state, cell) {\n        if (!cell) return;\n        var table = domUtils.findParentByTagName(cell, \"table\"),\n            caption = table.getElementsByTagName('caption'),\n            width = table.offsetWidth,\n            height = table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0),\n            tablePos = domUtils.getXY(table),\n            cellPos = domUtils.getXY(cell), css;\n        switch (state) {\n            case \"h\":\n                css = 'height:' + height + 'px;top:' + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + 'px;left:' + (cellPos.x + cell.offsetWidth);\n                dragLine.style.cssText = css + 'px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)';\n                break;\n            case \"v\":\n                css = 'width:' + width + 'px;left:' + tablePos.x + 'px;top:' + (cellPos.y + cell.offsetHeight );\n                //必须加上border:0和color:blue，否则低版ie不支持背景色显示\n                dragLine.style.cssText = css + 'px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)';\n                break;\n            default:\n        }\n    }\n\n    /**\n     * 当表格边框颜色为白色时设置为虚线,true为添加虚线\n     * @param editor\n     * @param flag\n     */\n    function switchBorderColor(editor, flag) {\n        var tableArr = domUtils.getElementsByTagName(editor.body, \"table\"), color;\n        for (var i = 0, node; node = tableArr[i++];) {\n            var td = domUtils.getElementsByTagName(node, \"td\");\n            if (td[0]) {\n                if (flag) {\n                    color = (td[0].style.borderColor).replace(/\\s/g, \"\");\n                    if (/(#ffffff)|(rgb\\(255,255,255\\))/ig.test(color))\n                        domUtils.addClass(node, \"noBorderTable\")\n                } else {\n                    domUtils.removeClasses(node, \"noBorderTable\")\n                }\n            }\n\n        }\n    }\n\n    function getTableWidth(editor, needIEHack, defaultValue) {\n        var body = editor.body;\n        return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0);\n    }\n\n    /**\n     * 获取当前拖动的单元格\n     */\n    function getTargetTd(editor, evt) {\n\n        var target = domUtils.findParentByTagName(evt.target || evt.srcElement, [\"td\", \"th\"], true),\n            dir = null;\n\n        if( !target ) {\n            return null;\n        }\n\n        dir = getRelation( target, mouseCoords( evt ) );\n\n        //如果有前一个节点， 需要做一个修正， 否则可能会得到一个错误的td\n\n        if( !target ) {\n            return null;\n        }\n\n        if( dir === 'h1' && target.previousSibling ) {\n\n            var position = domUtils.getXY( target),\n                cellWidth = target.offsetWidth;\n\n            if( Math.abs( position.x + cellWidth - evt.clientX ) > cellWidth / 3 ) {\n                target = target.previousSibling;\n            }\n\n        } else if( dir === 'v1' && target.parentNode.previousSibling ) {\n\n            var position = domUtils.getXY( target),\n                cellHeight = target.offsetHeight;\n\n            if( Math.abs( position.y + cellHeight - evt.clientY ) > cellHeight / 3 ) {\n                target = target.parentNode.previousSibling.firstChild;\n            }\n\n        }\n\n\n        //排除了非td内部以及用于代码高亮部分的td\n        return target && !(editor.fireEvent(\"excludetable\", target) === true) ? target : null;\n    }\n\n};\n\n\n// plugins/table.sort.js\n/**\n * Created with JetBrains PhpStorm.\n * User: Jinqn\n * Date: 13-10-12\n * Time: 上午10:20\n * To change this template use File | Settings | File Templates.\n */\n\nUE.UETable.prototype.sortTable = function (sortByCellIndex, compareFn) {\n    var table = this.table,\n        rows = table.rows,\n        trArray = [],\n        flag = rows[0].cells[0].tagName === \"TH\",\n        lastRowIndex = 0;\n    if(this.selectedTds.length){\n        var range = this.cellsRange,\n            len = range.endRowIndex + 1;\n        for (var i = range.beginRowIndex; i < len; i++) {\n            trArray[i] = rows[i];\n        }\n        trArray.splice(0,range.beginRowIndex);\n        lastRowIndex = (range.endRowIndex +1) === this.rowsNum ? 0 : range.endRowIndex +1;\n    }else{\n        for (var i = 0,len = rows.length; i < len; i++) {\n            trArray[i] = rows[i];\n        }\n    }\n\n    var Fn = {\n        'reversecurrent': function(td1,td2){\n            return 1;\n        },\n        'orderbyasc': function(td1,td2){\n            var value1 = td1.innerText||td1.textContent,\n                value2 = td2.innerText||td2.textContent;\n            return value1.localeCompare(value2);\n        },\n        'reversebyasc': function(td1,td2){\n            var value1 = td1.innerHTML,\n                value2 = td2.innerHTML;\n            return value2.localeCompare(value1);\n        },\n        'orderbynum': function(td1,td2){\n            var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\\d+/),\n                value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\\d+/);\n            if(value1) value1 = +value1[0];\n            if(value2) value2 = +value2[0];\n            return (value1||0) - (value2||0);\n        },\n        'reversebynum': function(td1,td2){\n            var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\\d+/),\n                value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\\d+/);\n            if(value1) value1 = +value1[0];\n            if(value2) value2 = +value2[0];\n            return (value2||0) - (value1||0);\n        }\n    };\n\n    //对表格设置排序的标记data-sort-type\n    table.setAttribute('data-sort-type', compareFn && typeof compareFn === \"string\" && Fn[compareFn] ? compareFn:'');\n\n    //th不参与排序\n    flag && trArray.splice(0, 1);\n    trArray = utils.sort(trArray,function (tr1, tr2) {\n        var result;\n        if (compareFn && typeof compareFn === \"function\") {\n            result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);\n        } else if (compareFn && typeof compareFn === \"number\") {\n            result = 1;\n        } else if (compareFn && typeof compareFn === \"string\" && Fn[compareFn]) {\n            result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);\n        } else {\n            result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);\n        }\n        return result;\n    });\n    var fragment = table.ownerDocument.createDocumentFragment();\n    for (var j = 0, len = trArray.length; j < len; j++) {\n        fragment.appendChild(trArray[j]);\n    }\n    var tbody = table.getElementsByTagName(\"tbody\")[0];\n    if(!lastRowIndex){\n        tbody.appendChild(fragment);\n    }else{\n        tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1])\n    }\n};\n\nUE.plugins['tablesort'] = function () {\n    var me = this,\n        UT = UE.UETable,\n        getUETable = function (tdOrTable) {\n            return UT.getUETable(tdOrTable);\n        },\n        getTableItemsByRange = function (editor) {\n            return UT.getTableItemsByRange(editor);\n        };\n\n\n    me.ready(function () {\n        //添加表格可排序的样式\n        utils.cssRule('tablesort',\n            'table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;' +\n                '   background-image:url(' + me.options.themePath + me.options.theme + '/images/sortable.png);}',\n            me.document);\n\n        //做单元格合并操作时,清除可排序标识\n        me.addListener(\"afterexeccommand\", function (type, cmd) {\n            if( cmd == 'mergeright' || cmd == 'mergedown' || cmd == 'mergecells') {\n                this.execCommand('disablesort');\n            }\n        });\n    });\n\n\n\n    //表格排序\n    UE.commands['sorttable'] = {\n        queryCommandState: function () {\n            var me = this,\n                tableItems = getTableItemsByRange(me);\n            if (!tableItems.cell) return -1;\n            var table = tableItems.table,\n                cells = table.getElementsByTagName(\"td\");\n            for (var i = 0, cell; cell = cells[i++];) {\n                if (cell.rowSpan != 1 || cell.colSpan != 1) return -1;\n            }\n            return 0;\n        },\n        execCommand: function (cmd, fn) {\n            var me = this,\n                range = me.selection.getRange(),\n                bk = range.createBookmark(true),\n                tableItems = getTableItemsByRange(me),\n                cell = tableItems.cell,\n                ut = getUETable(tableItems.table),\n                cellInfo = ut.getCellInfo(cell);\n            ut.sortTable(cellInfo.cellIndex, fn);\n            range.moveToBookmark(bk);\n            try{\n                range.select();\n            }catch(e){}\n        }\n    };\n\n    //设置表格可排序,清除表格可排序\n    UE.commands[\"enablesort\"] = UE.commands[\"disablesort\"] = {\n        queryCommandState: function (cmd) {\n            var table = getTableItemsByRange(this).table;\n            if(table && cmd=='enablesort') {\n                var cells = domUtils.getElementsByTagName(table, 'th td');\n                for(var i = 0; i<cells.length; i++) {\n                    if(cells[i].getAttribute('colspan')>1 || cells[i].getAttribute('rowspan')>1) return -1;\n                }\n            }\n\n            return !table ? -1: cmd=='enablesort' ^ table.getAttribute('data-sort')!='sortEnabled' ? -1:0;\n\t\t\t\n        },\n        execCommand: function (cmd) {\n            var table = getTableItemsByRange(this).table;\n            table.setAttribute(\"data-sort\", cmd == \"enablesort\" ? \"sortEnabled\" : \"sortDisabled\");\n\t\t\ttable.setAttribute(\"style\", \"border-collapse:collapse;\");\n            cmd == \"enablesort\" ? domUtils.addClass(table,\"sortEnabled\"):domUtils.removeClasses(table,\"sortEnabled\");\n        }\n    };\n};\n\n\n// plugins/contextmenu.js\n///import core\n///commands 右键菜单\n///commandsName  ContextMenu\n///commandsTitle  右键菜单\n/**\n * 右键菜单\n * @function\n * @name baidu.editor.plugins.contextmenu\n * @author zhanyi\n */\n\nUE.plugins['contextmenu'] = function () {\n    var me = this;\n    me.setOpt('enableContextMenu',true);\n    if(me.getOpt('enableContextMenu') === false){\n        return;\n    }\n    var lang = me.getLang( \"contextMenu\" ),\n            menu,\n            items = me.options.contextMenu || [\n                {label:lang['selectall'], cmdName:'selectall'},\n                {\n                    label:lang.cleardoc,\n                    cmdName:'cleardoc',\n                    exec:function () {\n                        if ( confirm( lang.confirmclear ) ) {\n                            this.execCommand( 'cleardoc' );\n                        }\n                    }\n                },\n                '-',\n                {\n                    label:lang.unlink,\n                    cmdName:'unlink'\n                },\n                '-',\n                {\n                    group:lang.paragraph,\n                    icon:'justifyjustify',\n                    subMenu:[\n                        {\n                            label:lang.justifyleft,\n                            cmdName:'justify',\n                            value:'left'\n                        },\n                        {\n                            label:lang.justifyright,\n                            cmdName:'justify',\n                            value:'right'\n                        },\n                        {\n                            label:lang.justifycenter,\n                            cmdName:'justify',\n                            value:'center'\n                        },\n                        {\n                            label:lang.justifyjustify,\n                            cmdName:'justify',\n                            value:'justify'\n                        }\n                    ]\n                },\n                '-',\n                {\n                    group:lang.table,\n                    icon:'table',\n                    subMenu:[\n                        {\n                            label:lang.inserttable,\n                            cmdName:'inserttable'\n                        },\n                        {\n                            label:lang.deletetable,\n                            cmdName:'deletetable'\n                        },\n                        '-',\n                        {\n                            label:lang.deleterow,\n                            cmdName:'deleterow'\n                        },\n                        {\n                            label:lang.deletecol,\n                            cmdName:'deletecol'\n                        },\n                        {\n                            label:lang.insertcol,\n                            cmdName:'insertcol'\n                        },\n                        {\n                            label:lang.insertcolnext,\n                            cmdName:'insertcolnext'\n                        },\n                        {\n                            label:lang.insertrow,\n                            cmdName:'insertrow'\n                        },\n                        {\n                            label:lang.insertrownext,\n                            cmdName:'insertrownext'\n                        },\n                        '-',\n                        {\n                            label:lang.insertcaption,\n                            cmdName:'insertcaption'\n                        },\n                        {\n                            label:lang.deletecaption,\n                            cmdName:'deletecaption'\n                        },\n                        {\n                            label:lang.inserttitle,\n                            cmdName:'inserttitle'\n                        },\n                        {\n                            label:lang.deletetitle,\n                            cmdName:'deletetitle'\n                        },\n                        {\n                            label:lang.inserttitlecol,\n                            cmdName:'inserttitlecol'\n                        },\n                        {\n                            label:lang.deletetitlecol,\n                            cmdName:'deletetitlecol'\n                        },\n                        '-',\n                        {\n                            label:lang.mergecells,\n                            cmdName:'mergecells'\n                        },\n                        {\n                            label:lang.mergeright,\n                            cmdName:'mergeright'\n                        },\n                        {\n                            label:lang.mergedown,\n                            cmdName:'mergedown'\n                        },\n                        '-',\n                        {\n                            label:lang.splittorows,\n                            cmdName:'splittorows'\n                        },\n                        {\n                            label:lang.splittocols,\n                            cmdName:'splittocols'\n                        },\n                        {\n                            label:lang.splittocells,\n                            cmdName:'splittocells'\n                        },\n                        '-',\n                        {\n                            label:lang.averageDiseRow,\n                            cmdName:'averagedistributerow'\n                        },\n                        {\n                            label:lang.averageDisCol,\n                            cmdName:'averagedistributecol'\n                        },\n                        '-',\n                        {\n                            label:lang.edittd,\n                            cmdName:'edittd',\n                            exec:function () {\n                                if ( UE.ui['edittd'] ) {\n                                    new UE.ui['edittd']( this );\n                                }\n                                this.getDialog('edittd').open();\n                            }\n                        },\n                        {\n                            label:lang.edittable,\n                            cmdName:'edittable',\n                            exec:function () {\n                                if ( UE.ui['edittable'] ) {\n                                    new UE.ui['edittable']( this );\n                                }\n                                this.getDialog('edittable').open();\n                            }\n                        },\n                        {\n                            label:lang.setbordervisible,\n                            cmdName:'setbordervisible'\n                        }\n                    ]\n                },\n                {\n                    group:lang.tablesort,\n                    icon:'tablesort',\n                    subMenu:[\n                        {\n                            label:lang.enablesort,\n                            cmdName:'enablesort'\n                        },\n                        {\n                            label:lang.disablesort,\n                            cmdName:'disablesort'\n                        },\n                        '-',\n                        {\n                            label:lang.reversecurrent,\n                            cmdName:'sorttable',\n                            value:'reversecurrent'\n                        },\n                        {\n                            label:lang.orderbyasc,\n                            cmdName:'sorttable',\n                            value:'orderbyasc'\n                        },\n                        {\n                            label:lang.reversebyasc,\n                            cmdName:'sorttable',\n                            value:'reversebyasc'\n                        },\n                        {\n                            label:lang.orderbynum,\n                            cmdName:'sorttable',\n                            value:'orderbynum'\n                        },\n                        {\n                            label:lang.reversebynum,\n                            cmdName:'sorttable',\n                            value:'reversebynum'\n                        }\n                    ]\n                },\n                {\n                    group:lang.borderbk,\n                    icon:'borderBack',\n                    subMenu:[\n                        {\n                            label:lang.setcolor,\n                            cmdName:\"interlacetable\",\n                            exec:function(){\n                                this.execCommand(\"interlacetable\");\n                            }\n                        },\n                        {\n                            label:lang.unsetcolor,\n                            cmdName:\"uninterlacetable\",\n                            exec:function(){\n                                this.execCommand(\"uninterlacetable\");\n                            }\n                        },\n                        {\n                            label:lang.setbackground,\n                            cmdName:\"settablebackground\",\n                            exec:function(){\n                                this.execCommand(\"settablebackground\",{repeat:true,colorList:[\"#bbb\",\"#ccc\"]});\n                            }\n                        },\n                        {\n                            label:lang.unsetbackground,\n                            cmdName:\"cleartablebackground\",\n                            exec:function(){\n                                this.execCommand(\"cleartablebackground\");\n                            }\n                        },\n                        {\n                            label:lang.redandblue,\n                            cmdName:\"settablebackground\",\n                            exec:function(){\n                                this.execCommand(\"settablebackground\",{repeat:true,colorList:[\"red\",\"blue\"]});\n                            }\n                        },\n                        {\n                            label:lang.threecolorgradient,\n                            cmdName:\"settablebackground\",\n                            exec:function(){\n                                this.execCommand(\"settablebackground\",{repeat:true,colorList:[\"#aaa\",\"#bbb\",\"#ccc\"]});\n                            }\n                        }\n                    ]\n                },\n                {\n                    group:lang.aligntd,\n                    icon:'aligntd',\n                    subMenu:[\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'left',vAlign:'top'}\n                        },\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'center',vAlign:'top'}\n                        },\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'right',vAlign:'top'}\n                        },\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'left',vAlign:'middle'}\n                        },\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'center',vAlign:'middle'}\n                        },\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'right',vAlign:'middle'}\n                        },\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'left',vAlign:'bottom'}\n                        },\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'center',vAlign:'bottom'}\n                        },\n                        {\n                            cmdName:'cellalignment',\n                            value:{align:'right',vAlign:'bottom'}\n                        }\n                    ]\n                },\n                {\n                    group:lang.aligntable,\n                    icon:'aligntable',\n                    subMenu:[\n                        {\n                            cmdName:'tablealignment',\n                            className: 'left',\n                            label:lang.tableleft,\n                            value:\"left\"\n                        },\n                        {\n                            cmdName:'tablealignment',\n                            className: 'center',\n                            label:lang.tablecenter,\n                            value:\"center\"\n                        },\n                        {\n                            cmdName:'tablealignment',\n                            className: 'right',\n                            label:lang.tableright,\n                            value:\"right\"\n                        }\n                    ]\n                },\n                '-',\n                {\n                    label:lang.insertparagraphbefore,\n                    cmdName:'insertparagraph',\n                    value:true\n                },\n                {\n                    label:lang.insertparagraphafter,\n                    cmdName:'insertparagraph'\n                },\n                {\n                    label:lang['copy'],\n                    cmdName:'copy'\n                },\n                {\n                    label:lang['paste'],\n                    cmdName:'paste'\n                }\n            ];\n    if ( !items.length ) {\n        return;\n    }\n    var uiUtils = UE.ui.uiUtils;\n\n    me.addListener( 'contextmenu', function ( type, evt ) {\n\n        var offset = uiUtils.getViewportOffsetByEvent( evt );\n        me.fireEvent( 'beforeselectionchange' );\n        if ( menu ) {\n            menu.destroy();\n        }\n        for ( var i = 0, ti, contextItems = []; ti = items[i]; i++ ) {\n            var last;\n            (function ( item ) {\n                if ( item == '-' ) {\n                    if ( (last = contextItems[contextItems.length - 1 ] ) && last !== '-' ) {\n                        contextItems.push( '-' );\n                    }\n                } else if ( item.hasOwnProperty( \"group\" ) ) {\n                    for ( var j = 0, cj, subMenu = []; cj = item.subMenu[j]; j++ ) {\n                        (function ( subItem ) {\n                            if ( subItem == '-' ) {\n                                if ( (last = subMenu[subMenu.length - 1 ] ) && last !== '-' ) {\n                                    subMenu.push( '-' );\n                                }else{\n                                    subMenu.splice(subMenu.length-1);\n                                }\n                            } else {\n                                if ( (me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) &&\n                                        (subItem.query ? subItem.query() : me.queryCommandState( subItem.cmdName )) > -1 ) {\n                                    subMenu.push( {\n                                        'label':subItem.label || me.getLang( \"contextMenu.\" + subItem.cmdName + (subItem.value || '') )||\"\",\n                                        'className':'edui-for-' +subItem.cmdName + ( subItem.className ? ( ' edui-for-' + subItem.cmdName + '-' + subItem.className ) : '' ),\n                                        onclick:subItem.exec ? function () {\n                                                subItem.exec.call( me );\n                                        } : function () {\n                                            me.execCommand( subItem.cmdName, subItem.value );\n                                        }\n                                    } );\n                                }\n                            }\n                        })( cj );\n                    }\n                    if ( subMenu.length ) {\n                        function getLabel(){\n                            switch (item.icon){\n                                case \"table\":\n                                    return me.getLang( \"contextMenu.table\" );\n                                case \"justifyjustify\":\n                                    return me.getLang( \"contextMenu.paragraph\" );\n                                case \"aligntd\":\n                                    return me.getLang(\"contextMenu.aligntd\");\n                                case \"aligntable\":\n                                    return me.getLang(\"contextMenu.aligntable\");\n                                case \"tablesort\":\n                                    return lang.tablesort;\n                                case \"borderBack\":\n                                    return lang.borderbk;\n                                default :\n                                    return '';\n                            }\n                        }\n                        contextItems.push( {\n                            //todo 修正成自动获取方式\n                            'label':getLabel(),\n                            className:'edui-for-' + item.icon,\n                            'subMenu':{\n                                items:subMenu,\n                                editor:me\n                            }\n                        } );\n                    }\n\n                } else {\n                    //有可能commmand没有加载右键不能出来，或者没有command也想能展示出来添加query方法\n                    if ( (me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) &&\n                            (item.query ? item.query.call(me) : me.queryCommandState( item.cmdName )) > -1 ) {\n\n                        contextItems.push( {\n                            'label':item.label || me.getLang( \"contextMenu.\" + item.cmdName ),\n                            className:'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')),\n                            onclick:item.exec ? function () {\n                                item.exec.call( me );\n                            } : function () {\n                                me.execCommand( item.cmdName, item.value );\n                            }\n                        } );\n                    }\n\n                }\n\n            })( ti );\n        }\n        if ( contextItems[contextItems.length - 1] == '-' ) {\n            contextItems.pop();\n        }\n\n        menu = new UE.ui.Menu( {\n            items:contextItems,\n            className:\"edui-contextmenu\",\n            editor:me\n        } );\n        menu.render();\n        menu.showAt( offset );\n\n        me.fireEvent(\"aftershowcontextmenu\",menu);\n\n        domUtils.preventDefault( evt );\n        if ( browser.ie ) {\n            var ieRange;\n            try {\n                ieRange = me.selection.getNative().createRange();\n            } catch ( e ) {\n                return;\n            }\n            if ( ieRange.item ) {\n                var range = new dom.Range( me.document );\n                range.selectNode( ieRange.item( 0 ) ).select( true, true );\n            }\n        }\n    });\n\n    // 添加复制的flash按钮\n    me.addListener('aftershowcontextmenu', function(type, menu) {\n        if (me.zeroclipboard) {\n            var items = menu.items;\n            for (var key in items) {\n                if (items[key].className == 'edui-for-copy') {\n                    me.zeroclipboard.clip(items[key].getDom());\n                }\n            }\n        }\n    });\n\n};\n\n\n// plugins/shortcutmenu.js\n///import core\n///commands       弹出菜单\n// commandsName  popupmenu\n///commandsTitle  弹出菜单\n/**\n * 弹出菜单\n * @function\n * @name baidu.editor.plugins.popupmenu\n * @author xuheng\n */\n\nUE.plugins['shortcutmenu'] = function () {\n    var me = this,\n        menu,\n        items = me.options.shortcutMenu || [];\n\n    if (!items.length) {\n        return;\n    }\n\n    me.addListener ('contextmenu mouseup' , function (type , e) {\n        var me = this,\n            customEvt = {\n                type : type ,\n                target : e.target || e.srcElement ,\n                screenX : e.screenX ,\n                screenY : e.screenY ,\n                clientX : e.clientX ,\n                clientY : e.clientY\n            };\n\n        setTimeout (function () {\n            var rng = me.selection.getRange ();\n            if (rng.collapsed === false || type == \"contextmenu\") {\n\n                if (!menu) {\n                    menu = new baidu.editor.ui.ShortCutMenu ({\n                        editor : me ,\n                        items : items ,\n                        theme : me.options.theme ,\n                        className : 'edui-shortcutmenu'\n                    });\n\n                    menu.render ();\n                    me.fireEvent (\"afterrendershortcutmenu\" , menu);\n                }\n\n                menu.show (customEvt , !!UE.plugins['contextmenu']);\n            }\n        });\n\n        if (type == 'contextmenu') {\n            domUtils.preventDefault (e);\n            if (browser.ie9below) {\n                var ieRange;\n                try {\n                    ieRange = me.selection.getNative().createRange();\n                } catch (e) {\n                    return;\n                }\n                if (ieRange.item) {\n                    var range = new dom.Range (me.document);\n                    range.selectNode (ieRange.item (0)).select (true , true);\n\n                }\n            }\n        }\n    });\n\n    me.addListener ('keydown' , function (type) {\n        if (type == \"keydown\") {\n            menu && !menu.isHidden && menu.hide ();\n        }\n\n    });\n\n};\n\n\n\n\n// plugins/basestyle.js\n/**\n * B、I、sub、super命令支持\n * @file\n * @since 1.2.6.1\n */\n\nUE.plugins['basestyle'] = function(){\n\n    /**\n     * 字体加粗\n     * @command bold\n     * @param { String } cmd 命令字符串\n     * @remind 对已加粗的文本内容执行该命令， 将取消加粗\n     * @method execCommand\n     * @example\n     * ```javascript\n     * //editor是编辑器实例\n     * //对当前选中的文本内容执行加粗操作\n     * //第一次执行， 文本内容加粗\n     * editor.execCommand( 'bold' );\n     *\n     * //第二次执行， 文本内容取消加粗\n     * editor.execCommand( 'bold' );\n     * ```\n     */\n\n\n    /**\n     * 字体倾斜\n     * @command italic\n     * @method execCommand\n     * @param { String } cmd 命令字符串\n     * @remind 对已倾斜的文本内容执行该命令， 将取消倾斜\n     * @example\n     * ```javascript\n     * //editor是编辑器实例\n     * //对当前选中的文本内容执行斜体操作\n     * //第一次操作， 文本内容将变成斜体\n     * editor.execCommand( 'italic' );\n     *\n     * //再次对同一文本内容执行， 则文本内容将恢复正常\n     * editor.execCommand( 'italic' );\n     * ```\n     */\n\n    /**\n     * 下标文本，与“superscript”命令互斥\n     * @command subscript\n     * @method execCommand\n     * @remind  把选中的文本内容切换成下标文本， 如果当前选中的文本已经是下标， 则该操作会把文本内容还原成正常文本\n     * @param { String } cmd 命令字符串\n     * @example\n     * ```javascript\n     * //editor是编辑器实例\n     * //对当前选中的文本内容执行下标操作\n     * //第一次操作， 文本内容将变成下标文本\n     * editor.execCommand( 'subscript' );\n     *\n     * //再次对同一文本内容执行， 则文本内容将恢复正常\n     * editor.execCommand( 'subscript' );\n     * ```\n     */\n\n    /**\n     * 上标文本，与“subscript”命令互斥\n     * @command superscript\n     * @method execCommand\n     * @remind 把选中的文本内容切换成上标文本， 如果当前选中的文本已经是上标， 则该操作会把文本内容还原成正常文本\n     * @param { String } cmd 命令字符串\n     * @example\n     * ```javascript\n     * //editor是编辑器实例\n     * //对当前选中的文本内容执行上标操作\n     * //第一次操作， 文本内容将变成上标文本\n     * editor.execCommand( 'superscript' );\n     *\n     * //再次对同一文本内容执行， 则文本内容将恢复正常\n     * editor.execCommand( 'superscript' );\n     * ```\n     */\n    var basestyles = {\n            'bold':['strong','b'],\n            'italic':['em','i'],\n            'subscript':['sub'],\n            'superscript':['sup']\n        },\n        getObj = function(editor,tagNames){\n            return domUtils.filterNodeList(editor.selection.getStartElementPath(),tagNames);\n        },\n        me = this;\n    //添加快捷键\n    me.addshortcutkey({\n        \"Bold\" : \"ctrl+66\",//^B\n        \"Italic\" : \"ctrl+73\", //^I\n        \"Underline\" : \"ctrl+85\"//^U\n    });\n    me.addInputRule(function(root){\n        utils.each(root.getNodesByTagName('b i'),function(node){\n            switch (node.tagName){\n                case 'b':\n                    node.tagName = 'strong';\n                    break;\n                case 'i':\n                    node.tagName = 'em';\n            }\n        });\n    });\n    for ( var style in basestyles ) {\n        (function( cmd, tagNames ) {\n            me.commands[cmd] = {\n                execCommand : function( cmdName ) {\n                    var range = me.selection.getRange(),obj = getObj(this,tagNames);\n                    if ( range.collapsed ) {\n                        if ( obj ) {\n                            var tmpText =  me.document.createTextNode('');\n                            range.insertNode( tmpText ).removeInlineStyle( tagNames );\n                            range.setStartBefore(tmpText);\n                            domUtils.remove(tmpText);\n                        } else {\n                            var tmpNode = range.document.createElement( tagNames[0] );\n                            if(cmdName == 'superscript' || cmdName == 'subscript'){\n                                tmpText = me.document.createTextNode('');\n                                range.insertNode(tmpText)\n                                    .removeInlineStyle(['sub','sup'])\n                                    .setStartBefore(tmpText)\n                                    .collapse(true);\n                            }\n                            range.insertNode( tmpNode ).setStart( tmpNode, 0 );\n                        }\n                        range.collapse( true );\n                    } else {\n                        if(cmdName == 'superscript' || cmdName == 'subscript'){\n                            if(!obj || obj.tagName.toLowerCase() != cmdName){\n                                range.removeInlineStyle(['sub','sup']);\n                            }\n                        }\n                        obj ? range.removeInlineStyle( tagNames ) : range.applyInlineStyle( tagNames[0] );\n                    }\n                    range.select();\n                },\n                queryCommandState : function() {\n                   return getObj(this,tagNames) ? 1 : 0;\n                }\n            };\n        })( style, basestyles[style] );\n    }\n};\n\n\n\n// plugins/elementpath.js\n/**\n * 选取路径命令\n * @file\n */\nUE.plugins['elementpath'] = function(){\n    var currentLevel,\n        tagNames,\n        me = this;\n    me.setOpt('elementPathEnabled',true);\n    if(!me.options.elementPathEnabled){\n        return;\n    }\n    me.commands['elementpath'] = {\n        execCommand : function( cmdName, level ) {\n            var start = tagNames[level],\n                range = me.selection.getRange();\n            currentLevel = level*1;\n            range.selectNode(start).select();\n        },\n        queryCommandValue : function() {\n            //产生一个副本，不能修改原来的startElementPath;\n            var parents = [].concat(this.selection.getStartElementPath()).reverse(),\n                names = [];\n            tagNames = parents;\n            for(var i=0,ci;ci=parents[i];i++){\n                if(ci.nodeType == 3) {\n                    continue;\n                }\n                var name = ci.tagName.toLowerCase();\n                if(name == 'img' && ci.getAttribute('anchorname')){\n                    name = 'anchor';\n                }\n                names[i] = name;\n                if(currentLevel == i){\n                   currentLevel = -1;\n                    break;\n                }\n            }\n            return names;\n        }\n    };\n};\n\n\n\n// plugins/formatmatch.js\n/**\n * 格式刷，只格式inline的\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 格式刷\n * @command formatmatch\n * @method execCommand\n * @remind 该操作不能复制段落格式\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * //editor是编辑器实例\n * //获取格式刷\n * editor.execCommand( 'formatmatch' );\n * ```\n */\nUE.plugins['formatmatch'] = function(){\n\n    var me = this,\n        list = [],img,\n        flag = 0;\n\n     me.addListener('reset',function(){\n         list = [];\n         flag = 0;\n     });\n\n    function addList(type,evt){\n        \n        if(browser.webkit){\n            var target = evt.target.tagName == 'IMG' ? evt.target : null;\n        }\n\n        function addFormat(range){\n\n            if(text){\n                range.selectNode(text);\n            }\n            return range.applyInlineStyle(list[list.length-1].tagName,null,list);\n\n        }\n\n        me.undoManger && me.undoManger.save();\n\n        var range = me.selection.getRange(),\n            imgT = target || range.getClosedNode();\n        if(img && imgT && imgT.tagName == 'IMG'){\n            //trace:964\n\n            imgT.style.cssText += ';float:' + (img.style.cssFloat || img.style.styleFloat ||'none') + ';display:' + (img.style.display||'inline');\n\n            img = null;\n        }else{\n            if(!img){\n                var collapsed = range.collapsed;\n                if(collapsed){\n                    var text = me.document.createTextNode('match');\n                    range.insertNode(text).select();\n\n\n                }\n                me.__hasEnterExecCommand = true;\n                //不能把block上的属性干掉\n                //trace:1553\n                var removeFormatAttributes = me.options.removeFormatAttributes;\n                me.options.removeFormatAttributes = '';\n                me.execCommand('removeformat');\n                me.options.removeFormatAttributes = removeFormatAttributes;\n                me.__hasEnterExecCommand = false;\n                //trace:969\n                range = me.selection.getRange();\n                if(list.length){\n                    addFormat(range);\n                }\n                if(text){\n                    range.setStartBefore(text).collapse(true);\n\n                }\n                range.select();\n                text && domUtils.remove(text);\n            }\n\n        }\n\n\n\n\n        me.undoManger && me.undoManger.save();\n        me.removeListener('mouseup',addList);\n        flag = 0;\n    }\n\n    me.commands['formatmatch'] = {\n        execCommand : function( cmdName ) {\n          \n            if(flag){\n                flag = 0;\n                list = [];\n                 me.removeListener('mouseup',addList);\n                return;\n            }\n\n\n              \n            var range = me.selection.getRange();\n            img = range.getClosedNode();\n            if(!img || img.tagName != 'IMG'){\n               range.collapse(true).shrinkBoundary();\n               var start = range.startContainer;\n               list = domUtils.findParents(start,true,function(node){\n                   return !domUtils.isBlockElm(node) && node.nodeType == 1;\n               });\n               //a不能加入格式刷, 并且克隆节点\n               for(var i=0,ci;ci=list[i];i++){\n                   if(ci.tagName == 'A'){\n                       list.splice(i,1);\n                       break;\n                   }\n               }\n\n            }\n\n            me.addListener('mouseup',addList);\n            flag = 1;\n\n\n        },\n        queryCommandState : function() {\n            return flag;\n        },\n        notNeedUndo : 1\n    };\n};\n\n\n\n// plugins/searchreplace.js\n///import core\n///commands 查找替换\n///commandsName  SearchReplace\n///commandsTitle  查询替换\n///commandsDialog  dialogs\\searchreplace\n/**\n * @description 查找替换\n * @author zhanyi\n */\n\nUE.plugin.register('searchreplace',function(){\n    var me = this;\n\n    var _blockElm = {'table':1,'tbody':1,'tr':1,'ol':1,'ul':1};\n\n    function findTextInString(textContent,opt,currentIndex){\n        var str = opt.searchStr;\n        if(opt.dir == -1){\n            textContent = textContent.split('').reverse().join('');\n            str = str.split('').reverse().join('');\n            currentIndex = textContent.length - currentIndex;\n\n        }\n        var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),match;\n\n        while(match = reg.exec(textContent)){\n            if(match.index >= currentIndex){\n                return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index;\n            }\n        }\n        return  -1\n    }\n    function findTextBlockElm(node,currentIndex,opt){\n        var textContent,index,methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode';\n        if(domUtils.isBody(node)){\n            node = node.firstChild;\n        }\n        var first = 1;\n        while(node){\n            textContent = node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent'];\n            index = findTextInString(textContent,opt,currentIndex );\n            first = 0;\n            if(index!=-1){\n                return {\n                    'node':node,\n                    'index':index\n                }\n            }\n            node = domUtils[methodName](node);\n            while(node && _blockElm[node.nodeName.toLowerCase()]){\n                node = domUtils[methodName](node,true);\n            }\n            if(node){\n                currentIndex = opt.dir == -1 ? (node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']).length : 0;\n            }\n\n        }\n    }\n    function findNTextInBlockElm(node,index,str){\n        var currentIndex = 0,\n            currentNode = node.firstChild,\n            currentNodeLength = 0,\n            result;\n        while(currentNode){\n            if(currentNode.nodeType == 3){\n                currentNodeLength = currentNode.nodeValue.replace(/(^[\\t\\r\\n]+)|([\\t\\r\\n]+$)/,'').length;\n                currentIndex += currentNodeLength;\n                if(currentIndex >= index){\n                    return {\n                        'node':currentNode,\n                        'index': currentNodeLength - (currentIndex - index)\n                    }\n                }\n            }else if(!dtd.$empty[currentNode.tagName]){\n                currentNodeLength = currentNode[browser.ie ? 'innerText' : 'textContent'].replace(/(^[\\t\\r\\n]+)|([\\t\\r\\n]+$)/,'').length\n                currentIndex += currentNodeLength;\n                if(currentIndex >= index){\n                    result = findNTextInBlockElm(currentNode,currentNodeLength - (currentIndex - index),str);\n                    if(result){\n                        return result;\n                    }\n                }\n            }\n            currentNode = domUtils.getNextDomNode(currentNode);\n\n        }\n    }\n\n    function searchReplace(me,opt){\n\n        var rng = me.selection.getRange(),\n            startBlockNode,\n            searchStr = opt.searchStr,\n            span = me.document.createElement('span');\n        span.innerHTML = '$$ueditor_searchreplace_key$$';\n\n        rng.shrinkBoundary(true);\n\n        //判断是不是第一次选中\n        if(!rng.collapsed){\n            rng.select();\n            var rngText = me.selection.getText();\n            if(new RegExp('^' + opt.searchStr + '$',(opt.casesensitive ? '' : 'i')).test(rngText)){\n                if(opt.replaceStr != undefined){\n                    replaceText(rng,opt.replaceStr);\n                    rng.select();\n                    return true;\n                }else{\n                    rng.collapse(opt.dir == -1)\n                }\n\n            }\n        }\n\n\n        rng.insertNode(span);\n        rng.enlargeToBlockElm(true);\n        startBlockNode = rng.startContainer;\n        var currentIndex = startBlockNode[browser.ie ? 'innerText' : 'textContent'].indexOf('$$ueditor_searchreplace_key$$');\n        rng.setStartBefore(span);\n        domUtils.remove(span);\n        var result = findTextBlockElm(startBlockNode,currentIndex,opt);\n        if(result){\n            var rngStart = findNTextInBlockElm(result.node,result.index,searchStr);\n            var rngEnd = findNTextInBlockElm(result.node,result.index + searchStr.length,searchStr);\n            rng.setStart(rngStart.node,rngStart.index).setEnd(rngEnd.node,rngEnd.index);\n\n            if(opt.replaceStr !== undefined){\n                replaceText(rng,opt.replaceStr)\n            }\n            rng.select();\n            return true;\n        }else{\n            rng.setCursor()\n        }\n\n    }\n    function replaceText(rng,str){\n\n        str = me.document.createTextNode(str);\n        rng.deleteContents().insertNode(str);\n\n    }\n    return {\n        commands:{\n            'searchreplace':{\n                execCommand:function(cmdName,opt){\n                    utils.extend(opt,{\n                        all : false,\n                        casesensitive : false,\n                        dir : 1\n                    },true);\n                    var num = 0;\n                    if(opt.all){\n\n                        var rng = me.selection.getRange(),\n                            first = me.body.firstChild;\n                        if(first && first.nodeType == 1){\n                            rng.setStart(first,0);\n                            rng.shrinkBoundary(true);\n                        }else if(first.nodeType == 3){\n                            rng.setStartBefore(first)\n                        }\n                        rng.collapse(true).select(true);\n                        if(opt.replaceStr !== undefined){\n                            me.fireEvent('saveScene');\n                        }\n                        while(searchReplace(this,opt)){\n                            num++;\n                        }\n                        if(num){\n                            me.fireEvent('saveScene');\n                        }\n                    }else{\n                        if(opt.replaceStr !== undefined){\n                            me.fireEvent('saveScene');\n                        }\n                        if(searchReplace(this,opt)){\n                            num++\n                        }\n                        if(num){\n                            me.fireEvent('saveScene');\n                        }\n\n                    }\n\n                    return num;\n                },\n                notNeedUndo:1\n            }\n        }\n    }\n});\n\n// plugins/customstyle.js\n/**\n * 自定义样式\n * @file\n * @since 1.2.6.1\n */\n\n/**\n * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。\n * @command customstyle\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * editor.execCommand( 'customstyle' );\n * ```\n */\nUE.plugins['customstyle'] = function() {\n    var me = this;\n    me.setOpt({ 'customstyle':[\n        {tag:'h1',name:'tc', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'},\n        {tag:'h1',name:'tl', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;'},\n        {tag:'span',name:'im', style:'font-size:16px;font-style:italic;font-weight:bold;line-height:18px;'},\n        {tag:'span',name:'hi', style:'font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;'}\n    ]});\n    me.commands['customstyle'] = {\n        execCommand : function(cmdName, obj) {\n            var me = this,\n                    tagName = obj.tag,\n                    node = domUtils.findParent(me.selection.getStart(), function(node) {\n                        return node.getAttribute('label');\n                    }, true),\n                    range,bk,tmpObj = {};\n            for (var p in obj) {\n               if(obj[p]!==undefined)\n                    tmpObj[p] = obj[p];\n            }\n            delete tmpObj.tag;\n            if (node && node.getAttribute('label') == obj.label) {\n                range = this.selection.getRange();\n                bk = range.createBookmark();\n                if (range.collapsed) {\n                    //trace:1732 删掉自定义标签，要有p来回填站位\n                    if(dtd.$block[node.tagName]){\n                        var fillNode = me.document.createElement('p');\n                        domUtils.moveChild(node, fillNode);\n                        node.parentNode.insertBefore(fillNode, node);\n                        domUtils.remove(node);\n                    }else{\n                        domUtils.remove(node,true);\n                    }\n\n                } else {\n\n                    var common = domUtils.getCommonAncestor(bk.start, bk.end),\n                            nodes = domUtils.getElementsByTagName(common, tagName);\n                    if(new RegExp(tagName,'i').test(common.tagName)){\n                        nodes.push(common);\n                    }\n                    for (var i = 0,ni; ni = nodes[i++];) {\n                        if (ni.getAttribute('label') == obj.label) {\n                            var ps = domUtils.getPosition(ni, bk.start),pe = domUtils.getPosition(ni, bk.end);\n                            if ((ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS)\n                                    &&\n                                    (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS)\n                                    )\n                                if (dtd.$block[tagName]) {\n                                    var fillNode = me.document.createElement('p');\n                                    domUtils.moveChild(ni, fillNode);\n                                    ni.parentNode.insertBefore(fillNode, ni);\n                                }\n                            domUtils.remove(ni, true);\n                        }\n                    }\n                    node = domUtils.findParent(common, function(node) {\n                        return node.getAttribute('label') == obj.label;\n                    }, true);\n                    if (node) {\n\n                        domUtils.remove(node, true);\n\n                    }\n\n                }\n                range.moveToBookmark(bk).select();\n            } else {\n                if (dtd.$block[tagName]) {\n                    this.execCommand('paragraph', tagName, tmpObj,'customstyle');\n                    range = me.selection.getRange();\n                    if (!range.collapsed) {\n                        range.collapse();\n                        node = domUtils.findParent(me.selection.getStart(), function(node) {\n                            return node.getAttribute('label') == obj.label;\n                        }, true);\n                        var pNode = me.document.createElement('p');\n                        domUtils.insertAfter(node, pNode);\n                        domUtils.fillNode(me.document, pNode);\n                        range.setStart(pNode, 0).setCursor();\n                    }\n                } else {\n\n                    range = me.selection.getRange();\n                    if (range.collapsed) {\n                        node = me.document.createElement(tagName);\n                        domUtils.setAttributes(node, tmpObj);\n                        range.insertNode(node).setStart(node, 0).setCursor();\n\n                        return;\n                    }\n\n                    bk = range.createBookmark();\n                    range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select();\n                }\n            }\n\n        },\n        queryCommandValue : function() {\n            var parent = domUtils.filterNodeList(\n                this.selection.getStartElementPath(),\n                function(node){return node.getAttribute('label')}\n            );\n            return  parent ? parent.getAttribute('label') : '';\n        }\n    };\n    //当去掉customstyle是，如果是块元素，用p代替\n    me.addListener('keyup', function(type, evt) {\n        var keyCode = evt.keyCode || evt.which;\n\n        if (keyCode == 32 || keyCode == 13) {\n            var range = me.selection.getRange();\n            if (range.collapsed) {\n                var node = domUtils.findParent(me.selection.getStart(), function(node) {\n                    return node.getAttribute('label');\n                }, true);\n                if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) {\n                        var p = me.document.createElement('p');\n                        domUtils.insertAfter(node, p);\n                        domUtils.fillNode(me.document, p);\n                        domUtils.remove(node);\n                        range.setStart(p, 0).setCursor();\n\n\n                }\n            }\n        }\n    });\n};\n\n// plugins/catchremoteimage.js\n///import core\n///commands 远程图片抓取\n///commandsName  catchRemoteImage,catchremoteimageenable\n///commandsTitle  远程图片抓取\n/**\n * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片\n */\nUE.plugins['catchremoteimage'] = function () {\n    var me = this,\n        ajax = UE.ajax;\n\n    /* 设置默认值 */\n    if (me.options.catchRemoteImageEnable === false) return;\n    me.setOpt({\n        catchRemoteImageEnable: false\n    });\n\n    me.addListener(\"afterpaste\", function () {\n        me.fireEvent(\"catchRemoteImage\");\n    });\n\n    me.addListener(\"catchRemoteImage\", function () {\n\n        var catcherLocalDomain = me.getOpt('catcherLocalDomain'),\n            catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')),\n            catcherUrlPrefix = me.getOpt('catcherUrlPrefix'),\n            catcherFieldName = me.getOpt('catcherFieldName');\n\n        var remoteImages = [],\n            imgs = domUtils.getElementsByTagName(me.document, \"img\"),\n            test = function (src, urls) {\n                if (src.indexOf(location.host) != -1 || /(^\\.)|(^\\/)/.test(src)) {\n                    return true;\n                }\n                if (urls) {\n                    for (var j = 0, url; url = urls[j++];) {\n                        if (src.indexOf(url) !== -1) {\n                            return true;\n                        }\n                    }\n                }\n                return false;\n            };\n\n        for (var i = 0, ci; ci = imgs[i++];) {\n            if (ci.getAttribute(\"word_img\")) {\n                continue;\n            }\n            var src = ci.getAttribute(\"_src\") || ci.src || \"\";\n            if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) {\n                remoteImages.push(src);\n            }\n        }\n\n        if (remoteImages.length) {\n            catchremoteimage(remoteImages, {\n                //成功抓取\n                success: function (r) {\n                    try {\n                        var info = r.state !== undefined ? r:eval(\"(\" + r.responseText + \")\");\n                    } catch (e) {\n                        return;\n                    }\n\n                    /* 获取源路径和新路径 */\n                    var i, j, ci, cj, oldSrc, newSrc, list = info.list;\n\n                    for (i = 0; ci = imgs[i++];) {\n                        oldSrc = ci.getAttribute(\"_src\") || ci.src || \"\";\n                        for (j = 0; cj = list[j++];) {\n                            if (oldSrc == htmlspecialchars_decode(cj.source) && cj.state == \"SUCCESS\") {  //抓取失败时不做替换处理\n                                newSrc = catcherUrlPrefix + cj.url;\n                                domUtils.setAttributes(ci, {\n                                    \"src\": newSrc,\n                                    \"_src\": newSrc\n                                });\n                                break;\n                            }\n                        }\n                    }\n                    me.fireEvent('catchremotesuccess')\n                },\n                //回调失败，本次请求超时\n                error: function () {\n                    me.fireEvent(\"catchremoteerror\");\n                }\n            });\n        }\n        function htmlspecialchars_decode(str){\n            str = str.replace(/&amp;/g, '&');\n            str = str.replace(/&lt;/g, '<');\n            str = str.replace(/&gt;/g, '>');\n            str = str.replace(/&quot;/g, \"''\");\n            str = str.replace(/&#039;/g, \"'\");\n            return str;\n        }\n        function catchremoteimage(imgs, callbacks) {\n            var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '',\n                url = utils.formatUrl(catcherActionUrl + (catcherActionUrl.indexOf('?') == -1 ? '?':'&') + params),\n                isJsonp = utils.isCrossDomainUrl(url),\n                opt = {\n                    'method': 'POST',\n                    'dataType': isJsonp ? 'jsonp':'',\n                    'timeout': 60000, //单位：毫秒，回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值\n                    'onsuccess': callbacks[\"success\"],\n                    'onerror': callbacks[\"error\"]\n                };\n            opt[catcherFieldName] = imgs;\n            ajax.request(url, opt);\n        }\n\n    });\n};\n\n// plugins/snapscreen.js\n/**\n * 截屏插件，为UEditor提供插入支持\n * @file\n * @since 1.4.2\n */\nUE.plugin.register('snapscreen', function (){\n\n    var me = this;\n    var snapplugin;\n\n    function getLocation(url){\n        var search,\n            a = document.createElement('a'),\n            params = utils.serializeParam(me.queryCommandValue('serverparam')) || '';\n\n        a.href = url;\n        if (browser.ie) {\n            a.href = a.href;\n        }\n\n\n        search = a.search;\n        if (params) {\n            search = search + (search.indexOf('?') == -1 ? '?':'&')+ params;\n            search = search.replace(/[&]+/ig, '&');\n        }\n        return {\n            'port': a.port,\n            'hostname': a.hostname,\n            'path': a.pathname + search ||  + a.hash\n        }\n    }\n\n    return {\n        commands:{\n            /**\n             * 字体背景颜色\n             * @command snapscreen\n             * @method execCommand\n             * @param { String } cmd 命令字符串\n             * @example\n             * ```javascript\n             * editor.execCommand('snapscreen');\n             * ```\n             */\n            'snapscreen':{\n                execCommand:function (cmd) {\n                    var url, local, res;\n                    var lang = me.getLang(\"snapScreen_plugin\");\n\n                    if(!snapplugin){\n                        var container = me.container;\n                        var doc = me.container.ownerDocument || me.container.document;\n                        snapplugin = doc.createElement(\"object\");\n                        try{snapplugin.type = \"application/x-pluginbaidusnap\";}catch(e){\n                            return;\n                        }\n                        snapplugin.style.cssText = \"position:absolute;left:-9999px;width:0;height:0;\";\n                        snapplugin.setAttribute(\"width\",\"0\");\n                        snapplugin.setAttribute(\"height\",\"0\");\n                        container.appendChild(snapplugin);\n                    }\n\n                    function onSuccess(rs){\n                        try{\n                            rs = eval(\"(\"+ rs +\")\");\n                            if(rs.state == 'SUCCESS'){\n                                var opt = me.options;\n                                me.execCommand('insertimage', {\n                                    src: opt.snapscreenUrlPrefix + rs.url,\n                                    _src: opt.snapscreenUrlPrefix + rs.url,\n                                    alt: rs.title || '',\n                                    floatStyle: opt.snapscreenImgAlign\n                                });\n                            } else {\n                                alert(rs.state);\n                            }\n                        }catch(e){\n                            alert(lang.callBackErrorMsg);\n                        }\n                    }\n                    url = me.getActionUrl(me.getOpt('snapscreenActionName'));\n                    local = getLocation(url);\n                    setTimeout(function () {\n                        try{\n                            res =snapplugin.saveSnapshot(local.hostname, local.path, local.port);\n                        }catch(e){\n                            me.ui._dialogs['snapscreenDialog'].open();\n                            return;\n                        }\n\n                        onSuccess(res);\n                    }, 50);\n                },\n                queryCommandState: function(){\n                    return (navigator.userAgent.indexOf(\"Windows\",0) != -1) ? 0:-1;\n                }\n            }\n        }\n    }\n});\n\n\n// plugins/insertparagraph.js\n/**\n * 插入段落\n * @file\n * @since 1.2.6.1\n */\n\n\n/**\n * 插入段落\n * @command insertparagraph\n * @method execCommand\n * @param { String } cmd 命令字符串\n * @example\n * ```javascript\n * //editor是编辑器实例\n * editor.execCommand( 'insertparagraph' );\n * ```\n */\n\nUE.commands['insertparagraph'] = {\n    execCommand : function( cmdName,front) {\n        var me = this,\n            range = me.selection.getRange(),\n            start = range.startContainer,tmpNode;\n        while(start ){\n            if(domUtils.isBody(start)){\n                break;\n            }\n            tmpNode = start;\n            start = start.parentNode;\n        }\n        if(tmpNode){\n            var p = me.document.createElement('p');\n            if(front){\n                tmpNode.parentNode.insertBefore(p,tmpNode)\n            }else{\n                tmpNode.parentNode.insertBefore(p,tmpNode.nextSibling)\n            }\n            domUtils.fillNode(me.document,p);\n            range.setStart(p,0).setCursor(false,true);\n        }\n    }\n};\n\n\n\n// plugins/webapp.js\n/**\n * 百度应用\n * @file\n * @since 1.2.6.1\n */\n\n\n/**\n * 插入百度应用\n * @command webapp\n * @method execCommand\n * @remind 需要百度APPKey\n * @remind 百度应用主页： <a href=\"http://app.baidu.com/\" target=\"_blank\">http://app.baidu.com/</a>\n * @param { Object } appOptions 应用所需的参数项， 支持的key有： title=>应用标题， width=>应用容器宽度，\n * height=>应用容器高度，logo=>应用logo，url=>应用地址\n * @example\n * ```javascript\n * //editor是编辑器实例\n * //在编辑器里插入一个“植物大战僵尸”的APP\n * editor.execCommand( 'webapp' , {\n *     title: '植物大战僵尸',\n *     width: 560,\n *     height: 465,\n *     logo: '应用展示的图片',\n *     url: '百度应用的地址'\n * } );\n * ```\n */\n\n//UE.plugins['webapp'] = function () {\n//    var me = this;\n//    function createInsertStr( obj, toIframe, addParagraph ) {\n//        return !toIframe ?\n//                (addParagraph ? '<p>' : '') + '<img title=\"'+obj.title+'\" width=\"' + obj.width + '\" height=\"' + obj.height + '\"' +\n//                        ' src=\"' + me.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif\" style=\"background:url(' + obj.logo+') no-repeat center center; border:1px solid gray;\" class=\"edui-faked-webapp\" _url=\"' + obj.url + '\" />' +\n//                        (addParagraph ? '</p>' : '')\n//                :\n//                '<iframe class=\"edui-faked-webapp\" title=\"'+obj.title+'\" width=\"' + obj.width + '\" height=\"' + obj.height + '\"  scrolling=\"no\" frameborder=\"0\" src=\"' + obj.url + '\" logo_url = '+obj.logo+'></iframe>';\n//    }\n//\n//    function switchImgAndIframe( img2frame ) {\n//        var tmpdiv,\n//                nodes = domUtils.getElementsByTagName( me.document, !img2frame ? \"iframe\" : \"img\" );\n//        for ( var i = 0, node; node = nodes[i++]; ) {\n//            if ( node.className != \"edui-faked-webapp\" ){\n//                continue;\n//            }\n//            tmpdiv = me.document.createElement( \"div\" );\n//            tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( \"_url\" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace(\"url(\",\"\").replace(\")\",\"\")} : {url:node.getAttribute( \"src\", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute(\"logo_url\")}, img2frame ? true : false,false );\n//            node.parentNode.replaceChild( tmpdiv.firstChild, node );\n//        }\n//    }\n//\n//    me.addListener( \"beforegetcontent\", function () {\n//        switchImgAndIframe( true );\n//    } );\n//    me.addListener( 'aftersetcontent', function () {\n//        switchImgAndIframe( false );\n//    } );\n//    me.addListener( 'aftergetcontent', function ( cmdName ) {\n//        if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){\n//            return;\n//        }\n//        switchImgAndIframe( false );\n//    } );\n//\n//    me.commands['webapp'] = {\n//        execCommand:function ( cmd, obj ) {\n//            me.execCommand( \"inserthtml\", createInsertStr( obj, false,true ) );\n//        }\n//    };\n//};\n\nUE.plugin.register('webapp', function (){\n    var me = this;\n    function createInsertStr(obj,toEmbed){\n        return  !toEmbed ?\n            '<img title=\"'+obj.title+'\" width=\"' + obj.width + '\" height=\"' + obj.height + '\"' +\n                ' src=\"' + me.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif\" _logo_url=\"'+obj.logo+'\" style=\"background:url(' + obj.logo\n                +') no-repeat center center; border:1px solid gray;\" class=\"edui-faked-webapp\" _url=\"' + obj.url + '\" ' +\n                (obj.align && !obj.cssfloat? 'align=\"' + obj.align + '\"' : '') +\n                (obj.cssfloat ? 'style=\"float:' + obj.cssfloat + '\"' : '') +\n                '/>'\n            :\n            '<iframe class=\"edui-faked-webapp\" title=\"'+obj.title+'\" ' +\n                (obj.align && !obj.cssfloat? 'align=\"' + obj.align + '\"' : '') +\n                (obj.cssfloat ? 'style=\"float:' + obj.cssfloat + '\"' : '') +\n                'width=\"' + obj.width + '\" height=\"' + obj.height + '\"  scrolling=\"no\" frameborder=\"0\" src=\"' + obj.url + '\" logo_url = \"'+obj.logo+'\"></iframe>'\n\n    }\n    return {\n        outputRule: function(root){\n            utils.each(root.getNodesByTagName('img'),function(node){\n                var html;\n                if(node.getAttr('class') == 'edui-faked-webapp'){\n                    html =  createInsertStr({\n                        title:node.getAttr('title'),\n                        'width':node.getAttr('width'),\n                        'height':node.getAttr('height'),\n                        'align':node.getAttr('align'),\n                        'cssfloat':node.getStyle('float'),\n                        'url':node.getAttr(\"_url\"),\n                        'logo':node.getAttr('_logo_url')\n                    },true);\n                    var embed = UE.uNode.createElement(html);\n                    node.parentNode.replaceChild(embed,node);\n                }\n            })\n        },\n        inputRule:function(root){\n            utils.each(root.getNodesByTagName('iframe'),function(node){\n                if(node.getAttr('class') == 'edui-faked-webapp'){\n                    var img = UE.uNode.createElement(createInsertStr({\n                        title:node.getAttr('title'),\n                        'width':node.getAttr('width'),\n                        'height':node.getAttr('height'),\n                        'align':node.getAttr('align'),\n                        'cssfloat':node.getStyle('float'),\n                        'url':node.getAttr(\"src\"),\n                        'logo':node.getAttr('logo_url')\n                    }));\n                    node.parentNode.replaceChild(img,node);\n                }\n            })\n\n        },\n        commands:{\n            /**\n             * 插入百度应用\n             * @command webapp\n             * @method execCommand\n             * @remind 需要百度APPKey\n             * @remind 百度应用主页： <a href=\"http://app.baidu.com/\" target=\"_blank\">http://app.baidu.com/</a>\n             * @param { Object } appOptions 应用所需的参数项， 支持的key有： title=>应用标题， width=>应用容器宽度，\n             * height=>应用容器高度，logo=>应用logo，url=>应用地址\n             * @example\n             * ```javascript\n             * //editor是编辑器实例\n             * //在编辑器里插入一个“植物大战僵尸”的APP\n             * editor.execCommand( 'webapp' , {\n             *     title: '植物大战僵尸',\n             *     width: 560,\n             *     height: 465,\n             *     logo: '应用展示的图片',\n             *     url: '百度应用的地址'\n             * } );\n             * ```\n             */\n            'webapp':{\n                execCommand:function (cmd, obj) {\n\n                    var me = this,\n                        str = createInsertStr(utils.extend(obj,{\n                            align:'none'\n                        }), false);\n                    me.execCommand(\"inserthtml\",str);\n                },\n                queryCommandState:function () {\n                    var me = this,\n                        img = me.selection.getRange().getClosedNode(),\n                        flag = img && (img.className == \"edui-faked-webapp\");\n                    return flag ? 1 : 0;\n                }\n            }\n        }\n    }\n});\n\n// plugins/template.js\n///import core\n///import plugins\\inserthtml.js\n///import plugins\\cleardoc.js\n///commands 模板\n///commandsName  template\n///commandsTitle  模板\n///commandsDialog  dialogs\\template\nUE.plugins['template'] = function () {\n    UE.commands['template'] = {\n        execCommand:function (cmd, obj) {\n            obj.html && this.execCommand(\"inserthtml\", obj.html);\n        }\n    };\n    this.addListener(\"click\", function (type, evt) {\n        var el = evt.target || evt.srcElement,\n            range = this.selection.getRange();\n        var tnode = domUtils.findParent(el, function (node) {\n            if (node.className && domUtils.hasClass(node, \"ue_t\")) {\n                return node;\n            }\n        }, true);\n        tnode && range.selectNode(tnode).shrinkBoundary().select();\n    });\n    this.addListener(\"keydown\", function (type, evt) {\n        var range = this.selection.getRange();\n        if (!range.collapsed) {\n            if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) {\n                var tnode = domUtils.findParent(range.startContainer, function (node) {\n                    if (node.className && domUtils.hasClass(node, \"ue_t\")) {\n                        return node;\n                    }\n                }, true);\n                if (tnode) {\n                    domUtils.removeClasses(tnode, [\"ue_t\"]);\n                }\n            }\n        }\n    });\n};\n\n\n// plugins/music.js\n/**\n * 插入音乐命令\n * @file\n */\nUE.plugin.register('music', function (){\n    var me = this;\n    function creatInsertStr(url,width,height,align,cssfloat,toEmbed){\n        return  !toEmbed ?\n                '<img ' +\n                    (align && !cssfloat? 'align=\"' + align + '\"' : '') +\n                    (cssfloat ? 'style=\"float:' + cssfloat + '\"' : '') +\n                    ' width=\"'+ width +'\" height=\"' + height + '\" _url=\"'+url+'\" class=\"edui-faked-music\"' +\n                    ' src=\"'+me.options.langPath+me.options.lang+'/images/music.png\" />'\n            :\n            '<embed type=\"application/x-shockwave-flash\" class=\"edui-faked-music\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"' +\n                ' src=\"' + url + '\" width=\"' + width  + '\" height=\"' + height  + '\" '+ (align && !cssfloat? 'align=\"' + align + '\"' : '') +\n                (cssfloat ? 'style=\"float:' + cssfloat + '\"' : '') +\n                ' wmode=\"transparent\" play=\"true\" loop=\"false\" menu=\"false\" allowscriptaccess=\"never\" allowfullscreen=\"true\" >';\n    }\n    return {\n        outputRule: function(root){\n            utils.each(root.getNodesByTagName('img'),function(node){\n                var html;\n                if(node.getAttr('class') == 'edui-faked-music'){\n                    var cssfloat = node.getStyle('float');\n                    var align = node.getAttr('align');\n                    html =  creatInsertStr(node.getAttr(\"_url\"), node.getAttr('width'), node.getAttr('height'), align, cssfloat, true);\n                    var embed = UE.uNode.createElement(html);\n                    node.parentNode.replaceChild(embed,node);\n                }\n            })\n        },\n        inputRule:function(root){\n            utils.each(root.getNodesByTagName('embed'),function(node){\n                if(node.getAttr('class') == 'edui-faked-music'){\n                    var cssfloat = node.getStyle('float');\n                    var align = node.getAttr('align');\n                    html =  creatInsertStr(node.getAttr(\"src\"), node.getAttr('width'), node.getAttr('height'), align, cssfloat,false);\n                    var img = UE.uNode.createElement(html);\n                    node.parentNode.replaceChild(img,node);\n                }\n            })\n\n        },\n        commands:{\n            /**\n             * 插入音乐\n             * @command music\n             * @method execCommand\n             * @param { Object } musicOptions 插入音乐的参数项， 支持的key有： url=>音乐地址；\n             * width=>音乐容器宽度；height=>音乐容器高度；align=>音乐文件的对齐方式， 可选值有: left, center, right, none\n             * @example\n             * ```javascript\n             * //editor是编辑器实例\n             * //在编辑器里插入一个“植物大战僵尸”的APP\n             * editor.execCommand( 'music' , {\n             *     width: 400,\n             *     height: 95,\n             *     align: \"center\",\n             *     url: \"音乐地址\"\n             * } );\n             * ```\n             */\n            'music':{\n                execCommand:function (cmd, musicObj) {\n                    var me = this,\n                        str = creatInsertStr(musicObj.url, musicObj.width || 400, musicObj.height || 95, \"none\", false);\n                    me.execCommand(\"inserthtml\",str);\n                },\n                queryCommandState:function () {\n                    var me = this,\n                        img = me.selection.getRange().getClosedNode(),\n                        flag = img && (img.className == \"edui-faked-music\");\n                    return flag ? 1 : 0;\n                }\n            }\n        }\n    }\n});\n\n// plugins/autoupload.js\n/**\n * @description\n * 1.拖放文件到编辑区域，自动上传并插入到选区\n * 2.插入粘贴板的图片，自动上传并插入到选区\n * @author Jinqn\n * @date 2013-10-14\n */\nUE.plugin.register('autoupload', function (){\n\n    function sendAndInsertFile(file, editor) {\n        var me  = editor;\n        //模拟数据\n        var fieldName, urlPrefix, maxSize, allowFiles, actionUrl,\n            loadingHtml, errorHandler, successHandler,\n            filetype = /image\\/\\w+/i.test(file.type) ? 'image':'file',\n            loadingId = 'loading_' + (+new Date()).toString(36);\n\n        fieldName = me.getOpt(filetype + 'FieldName');\n        urlPrefix = me.getOpt(filetype + 'UrlPrefix');\n        maxSize = me.getOpt(filetype + 'MaxSize');\n        allowFiles = me.getOpt(filetype + 'AllowFiles');\n        actionUrl = me.getActionUrl(me.getOpt(filetype + 'ActionName'));\n        errorHandler = function(title) {\n            var loader = me.document.getElementById(loadingId);\n            loader && domUtils.remove(loader);\n            me.fireEvent('showmessage', {\n                'id': loadingId,\n                'content': title,\n                'type': 'error',\n                'timeout': 4000\n            });\n        };\n\n        if (filetype == 'image') {\n            loadingHtml = '<img class=\"loadingclass\" id=\"' + loadingId + '\" src=\"' +\n                me.options.themePath + me.options.theme +\n                '/images/spacer.gif\" title=\"' + (me.getLang('autoupload.loading') || '') + '\" >';\n            successHandler = function(data) {\n                var link = urlPrefix + data.url,\n                    loader = me.document.getElementById(loadingId);\n                if (loader) {\n                    loader.setAttribute('src', link);\n                    loader.setAttribute('_src', link);\n                    loader.setAttribute('title', data.title || '');\n                    loader.setAttribute('alt', data.original || '');\n                    loader.removeAttribute('id');\n                    domUtils.removeClasses(loader, 'loadingclass');\n                }\n            };\n        } else {\n            loadingHtml = '<p>' +\n                '<img class=\"loadingclass\" id=\"' + loadingId + '\" src=\"' +\n                me.options.themePath + me.options.theme +\n                '/images/spacer.gif\" title=\"' + (me.getLang('autoupload.loading') || '') + '\" >' +\n                '</p>';\n            successHandler = function(data) {\n                var link = urlPrefix + data.url,\n                    loader = me.document.getElementById(loadingId);\n\n                var rng = me.selection.getRange(),\n                    bk = rng.createBookmark();\n                rng.selectNode(loader).select();\n                me.execCommand('insertfile', {'url': link});\n                rng.moveToBookmark(bk).select();\n            };\n        }\n\n        /* 插入loading的占位符 */\n        me.execCommand('inserthtml', loadingHtml);\n\n        /* 判断后端配置是否没有加载成功 */\n        if (!me.getOpt(filetype + 'ActionName')) {\n            errorHandler(me.getLang('autoupload.errorLoadConfig'));\n            return;\n        }\n        /* 判断文件大小是否超出限制 */\n        if(file.size > maxSize) {\n            errorHandler(me.getLang('autoupload.exceedSizeError'));\n            return;\n        }\n        /* 判断文件格式是否超出允许 */\n        var fileext = file.name ? file.name.substr(file.name.lastIndexOf('.')):'';\n        if ((fileext && filetype != 'image') || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) {\n            errorHandler(me.getLang('autoupload.exceedTypeError'));\n            return;\n        }\n\n        /* 创建Ajax并提交 */\n        var xhr = new XMLHttpRequest(),\n            fd = new FormData(),\n            params = utils.serializeParam(me.queryCommandValue('serverparam')) || '',\n            url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params);\n\n        fd.append(fieldName, file, file.name || ('blob.' + file.type.substr('image/'.length)));\n        fd.append('type', 'ajax');\n        xhr.open(\"post\", url, true);\n        xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n        xhr.addEventListener('load', function (e) {\n            try{\n                var json = (new Function(\"return \" + utils.trim(e.target.response)))();\n                if (json.state == 'SUCCESS' && json.url) {\n                    successHandler(json);\n                } else {\n                    errorHandler(json.state);\n                }\n            }catch(er){\n                errorHandler(me.getLang('autoupload.loadError'));\n            }\n        });\n        xhr.send(fd);\n    }\n\n    function getPasteImage(e){\n        return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items:null;\n    }\n    function getDropImage(e){\n        return  e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files:null;\n    }\n\n    return {\n        outputRule: function(root){\n            utils.each(root.getNodesByTagName('img'),function(n){\n                if (/\\b(loaderrorclass)|(bloaderrorclass)\\b/.test(n.getAttr('class'))) {\n                    n.parentNode.removeChild(n);\n                }\n            });\n            utils.each(root.getNodesByTagName('p'),function(n){\n                if (/\\bloadpara\\b/.test(n.getAttr('class'))) {\n                    n.parentNode.removeChild(n);\n                }\n            });\n        },\n        bindEvents:{\n            //插入粘贴板的图片，拖放插入图片\n            'ready':function(e){\n                var me = this;\n                if(window.FormData && window.FileReader) {\n                    domUtils.on(me.body, 'paste drop', function(e){\n                        var hasImg = false,\n                            items;\n                        //获取粘贴板文件列表或者拖放文件列表\n                        items = e.type == 'paste' ? getPasteImage(e):getDropImage(e);\n                        if(items){\n                            var len = items.length,\n                                file;\n                            while (len--){\n                                file = items[len];\n                                if(file.getAsFile) file = file.getAsFile();\n                                if(file && file.size > 0) {\n                                    sendAndInsertFile(file, me);\n                                    hasImg = true;\n                                }\n                            }\n                            hasImg && e.preventDefault();\n                        }\n\n                    });\n                    //取消拖放图片时出现的文字光标位置提示\n                    domUtils.on(me.body, 'dragover', function (e) {\n                        if(e.dataTransfer.types[0] == 'Files') {\n                            e.preventDefault();\n                        }\n                    });\n\n                    //设置loading的样式\n                    utils.cssRule('loading',\n                        '.loadingclass{display:inline-block;cursor:default;background: url(\\''\n                            + this.options.themePath\n                            + this.options.theme +'/images/loading.gif\\') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\\n' +\n                            '.loaderrorclass{display:inline-block;cursor:default;background: url(\\''\n                            + this.options.themePath\n                            + this.options.theme +'/images/loaderror.png\\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' +\n                            '}',\n                        this.document);\n                }\n            }\n        }\n    }\n});\n\n// plugins/autosave.js\nUE.plugin.register('autosave', function (){\n\n    var me = this,\n        //无限循环保护\n        lastSaveTime = new Date(),\n        //最小保存间隔时间\n        MIN_TIME = 20,\n        //auto save key\n        saveKey = null;\n\n    function save ( editor ) {\n\n        var saveData;\n\n        if ( new Date() - lastSaveTime < MIN_TIME ) {\n            return;\n        }\n\n        if ( !editor.hasContents() ) {\n            //这里不能调用命令来删除， 会造成事件死循环\n            saveKey && me.removePreferences( saveKey );\n            return;\n        }\n\n        lastSaveTime = new Date();\n\n        editor._saveFlag = null;\n\n        saveData = me.body.innerHTML;\n\n        if ( editor.fireEvent( \"beforeautosave\", {\n            content: saveData\n        } ) === false ) {\n            return;\n        }\n\n        me.setPreferences( saveKey, saveData );\n\n        editor.fireEvent( \"afterautosave\", {\n            content: saveData\n        } );\n\n    }\n\n    return {\n        defaultOptions: {\n            //默认间隔时间\n            saveInterval: 500\n        },\n        bindEvents:{\n            'ready':function(){\n\n                var _suffix = \"-drafts-data\",\n                    key = null;\n\n                if ( me.key ) {\n                    key = me.key + _suffix;\n                } else {\n                    key = ( me.container.parentNode.id || 'ue-common' ) + _suffix;\n                }\n\n                //页面地址+编辑器ID 保持唯一\n                saveKey = ( location.protocol + location.host + location.pathname ).replace( /[.:\\/]/g, '_' ) + key;\n\n            },\n\n            'contentchange': function () {\n\n                if ( !saveKey ) {\n                    return;\n                }\n\n                if ( me._saveFlag ) {\n                    window.clearTimeout( me._saveFlag );\n                }\n\n                if ( me.options.saveInterval > 0 ) {\n\n                    me._saveFlag = window.setTimeout( function () {\n\n                        save( me );\n\n                    }, me.options.saveInterval );\n\n                } else {\n\n                    save(me);\n\n                }\n\n\n            }\n        },\n        commands:{\n            'clearlocaldata':{\n                execCommand:function (cmd, name) {\n                    if ( saveKey && me.getPreferences( saveKey ) ) {\n                        me.removePreferences( saveKey )\n                    }\n                },\n                notNeedUndo: true,\n                ignoreContentChange:true\n            },\n\n            'getlocaldata':{\n                execCommand:function (cmd, name) {\n                    return saveKey ? me.getPreferences( saveKey ) || '' : '';\n                },\n                notNeedUndo: true,\n                ignoreContentChange:true\n            },\n\n            'drafts':{\n                execCommand:function (cmd, name) {\n                    if ( saveKey ) {\n                        me.body.innerHTML = me.getPreferences( saveKey ) || '<p>'+domUtils.fillHtml+'</p>';\n                        me.focus(true);\n                    }\n                },\n                queryCommandState: function () {\n                    return saveKey ? ( me.getPreferences( saveKey ) === null ? -1 : 0 ) : -1;\n                },\n                notNeedUndo: true,\n                ignoreContentChange:true\n            }\n        }\n    }\n\n});\n\n// plugins/charts.js\nUE.plugin.register('charts', function (){\n\n    var me = this;\n\n    return {\n        bindEvents: {\n            'chartserror': function () {\n            }\n        },\n        commands:{\n            'charts': {\n                execCommand: function ( cmd, data ) {\n\n                    var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true),\n                        flagText = [],\n                        config = {};\n\n                    if ( !tableNode ) {\n                        return false;\n                    }\n\n                    if ( !validData( tableNode ) ) {\n                        me.fireEvent( \"chartserror\" );\n                        return false;\n                    }\n\n                    config.title = data.title || '';\n                    config.subTitle = data.subTitle || '';\n                    config.xTitle = data.xTitle || '';\n                    config.yTitle = data.yTitle || '';\n                    config.suffix = data.suffix || '';\n                    config.tip = data.tip || '';\n                    //数据对齐方式\n                    config.dataFormat = data.tableDataFormat || '';\n                    //图表类型\n                    config.chartType = data.chartType || 0;\n\n                    for ( var key in config ) {\n\n                        if ( !config.hasOwnProperty( key ) ) {\n                            continue;\n                        }\n\n                        flagText.push( key+\":\"+config[ key ] );\n\n                    }\n\n                    tableNode.setAttribute( \"data-chart\", flagText.join( \";\" ) );\n                    domUtils.addClass( tableNode, \"edui-charts-table\" );\n\n\n\n                },\n                queryCommandState: function ( cmd, name ) {\n\n                    var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true);\n                    return tableNode && validData( tableNode ) ? 0 : -1;\n\n                }\n            }\n        },\n        inputRule:function(root){\n            utils.each(root.getNodesByTagName('table'),function( tableNode ){\n\n                if ( tableNode.getAttr(\"data-chart\") !== undefined ) {\n                    tableNode.setAttr(\"style\");\n                }\n\n            })\n\n        },\n        outputRule:function(root){\n            utils.each(root.getNodesByTagName('table'),function( tableNode ){\n\n                if ( tableNode.getAttr(\"data-chart\") !== undefined ) {\n                    tableNode.setAttr(\"style\", \"display: none;\");\n                }\n\n            })\n\n        }\n    }\n\n    function validData ( table ) {\n\n        var firstRows = null,\n            cellCount = 0;\n\n        //行数不够\n        if ( table.rows.length < 2 ) {\n            return false;\n        }\n\n        //列数不够\n        if ( table.rows[0].cells.length < 2 ) {\n            return false;\n        }\n\n        //第一行所有cell必须是th\n        firstRows = table.rows[ 0 ].cells;\n        cellCount = firstRows.length;\n\n        for ( var i = 0, cell; cell = firstRows[ i ]; i++ ) {\n\n            if ( cell.tagName.toLowerCase() !== 'th' ) {\n                return false;\n            }\n\n        }\n\n        for ( var i = 1, row; row = table.rows[ i ]; i++ ) {\n\n            //每行单元格数不匹配， 返回false\n            if ( row.cells.length != cellCount ) {\n                return false;\n            }\n\n            //第一列不是th也返回false\n            if ( row.cells[0].tagName.toLowerCase() !== 'th' ) {\n                return false;\n            }\n\n            for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {\n\n                var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );\n\n                value = value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\\s+|\\s+$/g, '' );\n\n                //必须是数字\n                if ( !/^\\d*\\.?\\d+$/.test( value ) ) {\n                    return false;\n                }\n\n            }\n\n        }\n\n        return true;\n\n    }\n\n});\n\n// plugins/section.js\n/**\n * 目录大纲支持插件\n * @file\n * @since 1.3.0\n */\nUE.plugin.register('section', function (){\n    /* 目录节点对象 */\n    function Section(option){\n        this.tag = '';\n        this.level = -1,\n            this.dom = null;\n        this.nextSection = null;\n        this.previousSection = null;\n        this.parentSection = null;\n        this.startAddress = [];\n        this.endAddress = [];\n        this.children = [];\n    }\n    function getSection(option) {\n        var section = new Section();\n        return utils.extend(section, option);\n    }\n    function getNodeFromAddress(startAddress, root) {\n        var current = root;\n        for(var i = 0;i < startAddress.length; i++) {\n            if(!current.childNodes) return null;\n            current = current.childNodes[startAddress[i]];\n        }\n        return current;\n    }\n\n    var me = this;\n\n    return {\n        bindMultiEvents:{\n            type: 'aftersetcontent afterscencerestore',\n            handler: function(){\n                me.fireEvent('updateSections');\n            }\n        },\n        bindEvents:{\n            /* 初始化、拖拽、粘贴、执行setcontent之后 */\n            'ready': function (){\n                me.fireEvent('updateSections');\n                domUtils.on(me.body, 'drop paste', function(){\n                    me.fireEvent('updateSections');\n                });\n            },\n            /* 执行paragraph命令之后 */\n            'afterexeccommand': function (type, cmd) {\n                if(cmd == 'paragraph') {\n                    me.fireEvent('updateSections');\n                }\n            },\n            /* 部分键盘操作，触发updateSections事件 */\n            'keyup': function (type, e) {\n                var me = this,\n                    range = me.selection.getRange();\n                if(range.collapsed != true) {\n                    me.fireEvent('updateSections');\n                } else {\n                    var keyCode = e.keyCode || e.which;\n                    if(keyCode == 13 || keyCode == 8 || keyCode == 46) {\n                        me.fireEvent('updateSections');\n                    }\n                }\n            }\n        },\n        commands:{\n            'getsections': {\n                execCommand: function (cmd, levels) {\n                    var levelFn = levels || ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n                    for (var i = 0; i < levelFn.length; i++) {\n                        if (typeof levelFn[i] == 'string') {\n                            levelFn[i] = function(fn){\n                                return function(node){\n                                    return node.tagName == fn.toUpperCase()\n                                };\n                            }(levelFn[i]);\n                        } else if (typeof levelFn[i] != 'function') {\n                            levelFn[i] = function (node) {\n                                return null;\n                            }\n                        }\n                    }\n                    function getSectionLevel(node) {\n                        for (var i = 0; i < levelFn.length; i++) {\n                            if (levelFn[i](node)) return i;\n                        }\n                        return -1;\n                    }\n\n                    var me = this,\n                        Directory = getSection({'level':-1, 'title':'root'}),\n                        previous = Directory;\n\n                    function traversal(node, Directory) {\n                        var level,\n                            tmpSection = null,\n                            parent,\n                            child,\n                            children = node.childNodes;\n                        for (var i = 0, len = children.length; i < len; i++) {\n                            child = children[i];\n                            level = getSectionLevel(child);\n                            if (level >= 0) {\n                                var address = me.selection.getRange().selectNode(child).createAddress(true).startAddress,\n                                    current = getSection({\n                                        'tag': child.tagName,\n                                        'title': child.innerText || child.textContent || '',\n                                        'level': level,\n                                        'dom': child,\n                                        'startAddress': utils.clone(address, []),\n                                        'endAddress': utils.clone(address, []),\n                                        'children': []\n                                    });\n                                previous.nextSection = current;\n                                current.previousSection = previous;\n                                parent = previous;\n                                while(level <= parent.level){\n                                    parent = parent.parentSection;\n                                }\n                                current.parentSection = parent;\n                                parent.children.push(current);\n                                tmpSection = previous = current;\n                            } else {\n                                child.nodeType === 1 && traversal(child, Directory);\n                                tmpSection && tmpSection.endAddress[tmpSection.endAddress.length - 1] ++;\n                            }\n                        }\n                    }\n                    traversal(me.body, Directory);\n                    return Directory;\n                },\n                notNeedUndo: true\n            },\n            'movesection': {\n                execCommand: function (cmd, sourceSection, targetSection, isAfter) {\n\n                    var me = this,\n                        targetAddress,\n                        target;\n\n                    if(!sourceSection || !targetSection || targetSection.level == -1) return;\n\n                    targetAddress = isAfter ? targetSection.endAddress:targetSection.startAddress;\n                    target = getNodeFromAddress(targetAddress, me.body);\n\n                    /* 判断目标地址是否被源章节包含 */\n                    if(!targetAddress || !target || isContainsAddress(sourceSection.startAddress, sourceSection.endAddress, targetAddress)) return;\n\n                    var startNode = getNodeFromAddress(sourceSection.startAddress, me.body),\n                        endNode = getNodeFromAddress(sourceSection.endAddress, me.body),\n                        current,\n                        nextNode;\n\n                    if(isAfter) {\n                        current = endNode;\n                        while ( current && !(domUtils.getPosition( startNode, current ) & domUtils.POSITION_FOLLOWING) ) {\n                            nextNode = current.previousSibling;\n                            domUtils.insertAfter(target, current);\n                            if(current == startNode) break;\n                            current = nextNode;\n                        }\n                    } else {\n                        current = startNode;\n                        while ( current && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) {\n                            nextNode = current.nextSibling;\n                            target.parentNode.insertBefore(current, target);\n                            if(current == endNode) break;\n                            current = nextNode;\n                        }\n                    }\n\n                    me.fireEvent('updateSections');\n\n                    /* 获取地址的包含关系 */\n                    function isContainsAddress(startAddress, endAddress, addressTarget){\n                        var isAfterStartAddress = false,\n                            isBeforeEndAddress = false;\n                        for(var i = 0; i< startAddress.length; i++){\n                            if(i >= addressTarget.length) break;\n                            if(addressTarget[i] > startAddress[i]) {\n                                isAfterStartAddress = true;\n                                break;\n                            } else if(addressTarget[i] < startAddress[i]) {\n                                break;\n                            }\n                        }\n                        for(var i = 0; i< endAddress.length; i++){\n                            if(i >= addressTarget.length) break;\n                            if(addressTarget[i] < startAddress[i]) {\n                                isBeforeEndAddress = true;\n                                break;\n                            } else if(addressTarget[i] > startAddress[i]) {\n                                break;\n                            }\n                        }\n                        return isAfterStartAddress && isBeforeEndAddress;\n                    }\n                }\n            },\n            'deletesection': {\n                execCommand: function (cmd, section, keepChildren) {\n                    var me = this;\n\n                    if(!section) return;\n\n                    function getNodeFromAddress(startAddress) {\n                        var current = me.body;\n                        for(var i = 0;i < startAddress.length; i++) {\n                            if(!current.childNodes) return null;\n                            current = current.childNodes[startAddress[i]];\n                        }\n                        return current;\n                    }\n\n                    var startNode = getNodeFromAddress(section.startAddress),\n                        endNode = getNodeFromAddress(section.endAddress),\n                        current = startNode,\n                        nextNode;\n\n                    if(!keepChildren) {\n                        while ( current && domUtils.inDoc(endNode, me.document) && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) {\n                            nextNode = current.nextSibling;\n                            domUtils.remove(current);\n                            current = nextNode;\n                        }\n                    } else {\n                        domUtils.remove(current);\n                    }\n\n                    me.fireEvent('updateSections');\n                }\n            },\n            'selectsection': {\n                execCommand: function (cmd, section) {\n                    if(!section && !section.dom) return false;\n                    var me = this,\n                        range = me.selection.getRange(),\n                        address = {\n                            'startAddress':utils.clone(section.startAddress, []),\n                            'endAddress':utils.clone(section.endAddress, [])\n                        };\n                    address.endAddress[address.endAddress.length - 1]++;\n                    range.moveToAddress(address).select().scrollToView();\n                    return true;\n                },\n                notNeedUndo: true\n            },\n            'scrolltosection': {\n                execCommand: function (cmd, section) {\n                    if(!section && !section.dom) return false;\n                    var me = this,\n                        range = me.selection.getRange(),\n                        address = {\n                            'startAddress':section.startAddress,\n                            'endAddress':section.endAddress\n                        };\n                    address.endAddress[address.endAddress.length - 1]++;\n                    range.moveToAddress(address).scrollToView();\n                    return true;\n                },\n                notNeedUndo: true\n            }\n        }\n    }\n});\n\n// plugins/simpleupload.js\n/**\n * @description\n * 简单上传:点击按钮,直接选择文件上传\n * @author Jinqn\n * @date 2014-03-31\n */\nUE.plugin.register('simpleupload', function (){\n    var me = this,\n        isLoaded = false,\n        containerBtn;\n\n    function initUploadBtn(){\n        var w = containerBtn.offsetWidth || 20,\n            h = containerBtn.offsetHeight || 20,\n            btnIframe = document.createElement('iframe'),\n            btnStyle = 'display:block;width:' + w + 'px;height:' + h + 'px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;';\n\n        domUtils.on(btnIframe, 'load', function(){\n\n            var timestrap = (+new Date()).toString(36),\n                wrapper,\n                btnIframeDoc,\n                btnIframeBody;\n\n            btnIframeDoc = (btnIframe.contentDocument || btnIframe.contentWindow.document);\n            btnIframeBody = btnIframeDoc.body;\n            wrapper = btnIframeDoc.createElement('div');\n\n            wrapper.innerHTML = '<form id=\"edui_form_' + timestrap + '\" target=\"edui_iframe_' + timestrap + '\" method=\"POST\" enctype=\"multipart/form-data\" action=\"' + me.getOpt('serverUrl') + '\" ' +\n            'style=\"' + btnStyle + '\">' +\n            '<input id=\"edui_input_' + timestrap + '\" type=\"file\" accept=\"image/*\" name=\"' + me.options.imageFieldName + '\" ' +\n            'style=\"' + btnStyle + '\">' +\n            '</form>' +\n            '<iframe id=\"edui_iframe_' + timestrap + '\" name=\"edui_iframe_' + timestrap + '\" style=\"display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;\"></iframe>';\n\n            wrapper.className = 'edui-' + me.options.theme;\n            wrapper.id = me.ui.id + '_iframeupload';\n            btnIframeBody.style.cssText = btnStyle;\n            btnIframeBody.style.width = w + 'px';\n            btnIframeBody.style.height = h + 'px';\n            btnIframeBody.appendChild(wrapper);\n\n            if (btnIframeBody.parentNode) {\n                btnIframeBody.parentNode.style.width = w + 'px';\n                btnIframeBody.parentNode.style.height = w + 'px';\n            }\n\n            var form = btnIframeDoc.getElementById('edui_form_' + timestrap);\n            var input = btnIframeDoc.getElementById('edui_input_' + timestrap);\n            var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap);\n\n            domUtils.on(input, 'change', function(){\n                if(!input.value) return;\n                var loadingId = 'loading_' + (+new Date()).toString(36);\n                var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '';\n\n                var imageActionUrl = me.getActionUrl(me.getOpt('imageActionName'));\n                var allowFiles = me.getOpt('imageAllowFiles');\n\n                me.focus();\n                me.execCommand('inserthtml', '<img class=\"loadingclass\" id=\"' + loadingId + '\" src=\"' + me.options.themePath + me.options.theme +'/images/spacer.gif\" title=\"' + (me.getLang('simpleupload.loading') || '') + '\" >');\n\n                function callback(){\n                    try{\n                        var link, json, loader,\n                            body = (iframe.contentDocument || iframe.contentWindow.document).body,\n                            result = body.innerText || body.textContent || '';\n                        json = (new Function(\"return \" + result))();\n                        link = me.options.imageUrlPrefix + json.url;\n                        if(json.state == 'SUCCESS' && json.url) {\n                            loader = me.document.getElementById(loadingId);\n                            loader.setAttribute('src', link);\n                            loader.setAttribute('_src', link);\n                            loader.setAttribute('title', json.title || '');\n                            loader.setAttribute('alt', json.original || '');\n                            loader.removeAttribute('id');\n                            domUtils.removeClasses(loader, 'loadingclass');\n                        } else {\n                            showErrorLoader && showErrorLoader(json.state);\n                        }\n                    }catch(er){\n                        showErrorLoader && showErrorLoader(me.getLang('simpleupload.loadError'));\n                    }\n                    form.reset();\n                    domUtils.un(iframe, 'load', callback);\n                }\n                function showErrorLoader(title){\n                    if(loadingId) {\n                        var loader = me.document.getElementById(loadingId);\n                        loader && domUtils.remove(loader);\n                        me.fireEvent('showmessage', {\n                            'id': loadingId,\n                            'content': title,\n                            'type': 'error',\n                            'timeout': 4000\n                        });\n                    }\n                }\n\n                /* 判断后端配置是否没有加载成功 */\n                if (!me.getOpt('imageActionName')) {\n                    errorHandler(me.getLang('autoupload.errorLoadConfig'));\n                    return;\n                }\n                // 判断文件格式是否错误\n                var filename = input.value,\n                    fileext = filename ? filename.substr(filename.lastIndexOf('.')):'';\n                if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) {\n                    showErrorLoader(me.getLang('simpleupload.exceedTypeError'));\n                    return;\n                }\n\n                domUtils.on(iframe, 'load', callback);\n                form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?':'&') + params);\n                form.submit();\n            });\n\n            var stateTimer;\n            me.addListener('selectionchange', function () {\n                clearTimeout(stateTimer);\n                stateTimer = setTimeout(function() {\n                    var state = me.queryCommandState('simpleupload');\n                    if (state == -1) {\n                        input.disabled = 'disabled';\n                    } else {\n                        input.disabled = false;\n                    }\n                }, 400);\n            });\n            isLoaded = true;\n        });\n\n        btnIframe.style.cssText = btnStyle;\n        containerBtn.appendChild(btnIframe);\n    }\n\n    return {\n        bindEvents:{\n            'ready': function() {\n                //设置loading的样式\n                utils.cssRule('loading',\n                    '.loadingclass{display:inline-block;cursor:default;background: url(\\''\n                    + this.options.themePath\n                    + this.options.theme +'/images/loading.gif\\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\\n' +\n                    '.loaderrorclass{display:inline-block;cursor:default;background: url(\\''\n                    + this.options.themePath\n                    + this.options.theme +'/images/loaderror.png\\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' +\n                    '}',\n                    this.document);\n            },\n            /* 初始化简单上传按钮 */\n            'simpleuploadbtnready': function(type, container) {\n                containerBtn = container;\n                me.afterConfigReady(initUploadBtn);\n            }\n        },\n        outputRule: function(root){\n            utils.each(root.getNodesByTagName('img'),function(n){\n                if (/\\b(loaderrorclass)|(bloaderrorclass)\\b/.test(n.getAttr('class'))) {\n                    n.parentNode.removeChild(n);\n                }\n            });\n        },\n        commands: {\n            'simpleupload': {\n                queryCommandState: function () {\n                    return isLoaded ? 0:-1;\n                }\n            }\n        }\n    }\n});\n\n// plugins/serverparam.js\n/**\n * 服务器提交的额外参数列表设置插件\n * @file\n * @since 1.2.6.1\n */\nUE.plugin.register('serverparam', function (){\n\n    var me = this,\n        serverParam = {};\n\n    return {\n        commands:{\n            /**\n             * 修改服务器提交的额外参数列表,清除所有项\n             * @command serverparam\n             * @method execCommand\n             * @param { String } cmd 命令字符串\n             * @example\n             * ```javascript\n             * editor.execCommand('serverparam');\n             * editor.queryCommandValue('serverparam'); //返回空\n             * ```\n             */\n            /**\n             * 修改服务器提交的额外参数列表,删除指定项\n             * @command serverparam\n             * @method execCommand\n             * @param { String } cmd 命令字符串\n             * @param { String } key 要清除的属性\n             * @example\n             * ```javascript\n             * editor.execCommand('serverparam', 'name'); //删除属性name\n             * ```\n             */\n            /**\n             * 修改服务器提交的额外参数列表,使用键值添加项\n             * @command serverparam\n             * @method execCommand\n             * @param { String } cmd 命令字符串\n             * @param { String } key 要添加的属性\n             * @param { String } value 要添加属性的值\n             * @example\n             * ```javascript\n             * editor.execCommand('serverparam', 'name', 'hello');\n             * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'}\n             * ```\n             */\n            /**\n             * 修改服务器提交的额外参数列表,传入键值对对象添加多项\n             * @command serverparam\n             * @method execCommand\n             * @param { String } cmd 命令字符串\n             * @param { Object } key 传入的键值对对象\n             * @example\n             * ```javascript\n             * editor.execCommand('serverparam', {'name': 'hello'});\n             * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'}\n             * ```\n             */\n            /**\n             * 修改服务器提交的额外参数列表,使用自定义函数添加多项\n             * @command serverparam\n             * @method execCommand\n             * @param { String } cmd 命令字符串\n             * @param { Function } key 自定义获取参数的函数\n             * @example\n             * ```javascript\n             * editor.execCommand('serverparam', function(editor){\n             *     return {'key': 'value'};\n             * });\n             * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'}\n             * ```\n             */\n\n            /**\n             * 获取服务器提交的额外参数列表\n             * @command serverparam\n             * @method queryCommandValue\n             * @param { String } cmd 命令字符串\n             * @example\n             * ```javascript\n             * editor.queryCommandValue( 'serverparam' ); //返回对象 {'key': 'value'}\n             * ```\n             */\n            'serverparam':{\n                execCommand:function (cmd, key, value) {\n                    if (key === undefined || key === null) { //不传参数,清空列表\n                        serverParam = {};\n                    } else if (utils.isString(key)) { //传入键值\n                        if(value === undefined || value === null) {\n                            delete serverParam[key];\n                        } else {\n                            serverParam[key] = value;\n                        }\n                    } else if (utils.isObject(key)) { //传入对象,覆盖列表项\n                        utils.extend(serverParam, key, true);\n                    } else if (utils.isFunction(key)){ //传入函数,添加列表项\n                        utils.extend(serverParam, key(), true);\n                    }\n                },\n                queryCommandValue: function(){\n                    return serverParam || {};\n                }\n            }\n        }\n    }\n});\n\n\n// plugins/insertfile.js\n/**\n * 插入附件\n */\nUE.plugin.register('insertfile', function (){\n\n    var me = this;\n\n    function getFileIcon(url){\n        var ext = url.substr(url.lastIndexOf('.') + 1).toLowerCase(),\n            maps = {\n                \"rar\":\"icon_rar.gif\",\n                \"zip\":\"icon_rar.gif\",\n                \"tar\":\"icon_rar.gif\",\n                \"gz\":\"icon_rar.gif\",\n                \"bz2\":\"icon_rar.gif\",\n                \"doc\":\"icon_doc.gif\",\n                \"docx\":\"icon_doc.gif\",\n                \"pdf\":\"icon_pdf.gif\",\n                \"mp3\":\"icon_mp3.gif\",\n                \"xls\":\"icon_xls.gif\",\n                \"chm\":\"icon_chm.gif\",\n                \"ppt\":\"icon_ppt.gif\",\n                \"pptx\":\"icon_ppt.gif\",\n                \"avi\":\"icon_mv.gif\",\n                \"rmvb\":\"icon_mv.gif\",\n                \"wmv\":\"icon_mv.gif\",\n                \"flv\":\"icon_mv.gif\",\n                \"swf\":\"icon_mv.gif\",\n                \"rm\":\"icon_mv.gif\",\n                \"exe\":\"icon_exe.gif\",\n                \"psd\":\"icon_psd.gif\",\n                \"txt\":\"icon_txt.gif\",\n                \"jpg\":\"icon_jpg.gif\",\n                \"png\":\"icon_jpg.gif\",\n                \"jpeg\":\"icon_jpg.gif\",\n                \"gif\":\"icon_jpg.gif\",\n                \"ico\":\"icon_jpg.gif\",\n                \"bmp\":\"icon_jpg.gif\"\n            };\n        return maps[ext] ? maps[ext]:maps['txt'];\n    }\n\n    return {\n        commands:{\n            'insertfile': {\n                execCommand: function (command, filelist){\n                    filelist = utils.isArray(filelist) ? filelist : [filelist];\n\n                    var i, item, icon, title,\n                        html = '',\n                        URL = me.getOpt('UEDITOR_HOME_URL'),\n                        iconDir = URL + (URL.substr(URL.length - 1) == '/' ? '':'/') + 'dialogs/attachment/fileTypeImages/';\n                    for (i = 0; i < filelist.length; i++) {\n                        item = filelist[i];\n                        icon = iconDir + getFileIcon(item.url);\n                        title = item.title || item.url.substr(item.url.lastIndexOf('/') + 1);\n                        html += '<p style=\"line-height: 16px;\">' +\n                            '<img style=\"vertical-align: middle; margin-right: 2px;\" src=\"'+ icon + '\" _src=\"' + icon + '\" />' +\n                            '<a style=\"font-size:12px; color:#0066cc;\" href=\"' + item.url +'\" title=\"' + title + '\">' + title + '</a>' +\n                            '</p>';\n                    }\n                    me.execCommand('insertHtml', html);\n                }\n            }\n        }\n    }\n});\n\n\n\n\n// plugins/xssFilter.js\n/**\n * @file xssFilter.js\n * @desc xss过滤器\n * @author robbenmu\n */\n\nUE.plugins.xssFilter = function() {\n\n\tvar config = UEDITOR_CONFIG;\n\tvar whitList = config.whitList;\n\n\tfunction filter(node) {\n\n\t\tvar tagName = node.tagName;\n\t\tvar attrs = node.attrs;\n\n\t\tif (!whitList.hasOwnProperty(tagName)) {\n\t\t\tnode.parentNode.removeChild(node);\n\t\t\treturn false;\n\t\t}\n\n\t\tUE.utils.each(attrs, function (val, key) {\n\n\t\t\tif (whitList[tagName].indexOf(key) === -1) {\n\t\t\t\tnode.setAttr(key);\n\t\t\t}\n\t\t});\n\t}\n\n\t// 添加inserthtml\\paste等操作用的过滤规则\n\tif (whitList && config.xssFilterRules) {\n\t\tthis.options.filterRules = function () {\n\n\t\t\tvar result = {};\n\n\t\t\tUE.utils.each(whitList, function(val, key) {\n\t\t\t\tresult[key] = function (node) {\n\t\t\t\t\treturn filter(node);\n\t\t\t\t};\n\t\t\t});\n\n\t\t\treturn result;\n\t\t}();\n\t}\n\n\tvar tagList = [];\n\n\tUE.utils.each(whitList, function (val, key) {\n\t\ttagList.push(key);\n\t});\n\n\t// 添加input过滤规则\n\t//\n\tif (whitList && config.inputXssFilter) {\n\t\tthis.addInputRule(function (root) {\n\n\t\t\troot.traversal(function(node) {\n\t\t\t\tif (node.type !== 'element') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfilter(node);\n\t\t\t});\n\t\t});\n\t}\n\t// 添加output过滤规则\n\t//\n\tif (whitList && config.outputXssFilter) {\n\t\tthis.addOutputRule(function (root) {\n\n\t\t\troot.traversal(function(node) {\n\t\t\t\tif (node.type !== 'element') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfilter(node);\n\t\t\t});\n\t\t});\n\t}\n\n};\n\n\n// ui/ui.js\nvar baidu = baidu || {};\nbaidu.editor = baidu.editor || {};\nUE.ui = baidu.editor.ui = {};\n\n// ui/uiutils.js\n(function (){\n    var browser = baidu.editor.browser,\n        domUtils = baidu.editor.dom.domUtils;\n\n    var magic = '$EDITORUI';\n    var root = window[magic] = {};\n    var uidMagic = 'ID' + magic;\n    var uidCount = 0;\n\n    var uiUtils = baidu.editor.ui.uiUtils = {\n        uid: function (obj){\n            return (obj ? obj[uidMagic] || (obj[uidMagic] = ++ uidCount) : ++ uidCount);\n        },\n        hook: function ( fn, callback ) {\n            var dg;\n            if (fn && fn._callbacks) {\n                dg = fn;\n            } else {\n                dg = function (){\n                    var q;\n                    if (fn) {\n                        q = fn.apply(this, arguments);\n                    }\n                    var callbacks = dg._callbacks;\n                    var k = callbacks.length;\n                    while (k --) {\n                        var r = callbacks[k].apply(this, arguments);\n                        if (q === undefined) {\n                            q = r;\n                        }\n                    }\n                    return q;\n                };\n                dg._callbacks = [];\n            }\n            dg._callbacks.push(callback);\n            return dg;\n        },\n        createElementByHtml: function (html){\n            var el = document.createElement('div');\n            el.innerHTML = html;\n            el = el.firstChild;\n            el.parentNode.removeChild(el);\n            return el;\n        },\n        getViewportElement: function (){\n            return (browser.ie && browser.quirks) ?\n                document.body : document.documentElement;\n        },\n        getClientRect: function (element){\n            var bcr;\n            //trace  IE6下在控制编辑器显隐时可能会报错，catch一下\n            try{\n                bcr = element.getBoundingClientRect();\n            }catch(e){\n                bcr={left:0,top:0,height:0,width:0}\n            }\n            var rect = {\n                left: Math.round(bcr.left),\n                top: Math.round(bcr.top),\n                height: Math.round(bcr.bottom - bcr.top),\n                width: Math.round(bcr.right - bcr.left)\n            };\n            var doc;\n            while ((doc = element.ownerDocument) !== document &&\n                (element = domUtils.getWindow(doc).frameElement)) {\n                bcr = element.getBoundingClientRect();\n                rect.left += bcr.left;\n                rect.top += bcr.top;\n            }\n            rect.bottom = rect.top + rect.height;\n            rect.right = rect.left + rect.width;\n            return rect;\n        },\n        getViewportRect: function (){\n            var viewportEl = uiUtils.getViewportElement();\n            var width = (window.innerWidth || viewportEl.clientWidth) | 0;\n            var height = (window.innerHeight ||viewportEl.clientHeight) | 0;\n            return {\n                left: 0,\n                top: 0,\n                height: height,\n                width: width,\n                bottom: height,\n                right: width\n            };\n        },\n        setViewportOffset: function (element, offset){\n            var rect;\n            var fixedLayer = uiUtils.getFixedLayer();\n            if (element.parentNode === fixedLayer) {\n                element.style.left = offset.left + 'px';\n                element.style.top = offset.top + 'px';\n            } else {\n                domUtils.setViewportOffset(element, offset);\n            }\n        },\n        getEventOffset: function (evt){\n            var el = evt.target || evt.srcElement;\n            var rect = uiUtils.getClientRect(el);\n            var offset = uiUtils.getViewportOffsetByEvent(evt);\n            return {\n                left: offset.left - rect.left,\n                top: offset.top - rect.top\n            };\n        },\n        getViewportOffsetByEvent: function (evt){\n            var el = evt.target || evt.srcElement;\n            var frameEl = domUtils.getWindow(el).frameElement;\n            var offset = {\n                left: evt.clientX,\n                top: evt.clientY\n            };\n            if (frameEl && el.ownerDocument !== document) {\n                var rect = uiUtils.getClientRect(frameEl);\n                offset.left += rect.left;\n                offset.top += rect.top;\n            }\n            return offset;\n        },\n        setGlobal: function (id, obj){\n            root[id] = obj;\n            return magic + '[\"' + id  + '\"]';\n        },\n        unsetGlobal: function (id){\n            delete root[id];\n        },\n        copyAttributes: function (tgt, src){\n            var attributes = src.attributes;\n            var k = attributes.length;\n            while (k --) {\n                var attrNode = attributes[k];\n                if ( attrNode.nodeName != 'style' && attrNode.nodeName != 'class' && (!browser.ie || attrNode.specified) ) {\n                    tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue);\n                }\n            }\n            if (src.className) {\n                domUtils.addClass(tgt,src.className);\n            }\n            if (src.style.cssText) {\n                tgt.style.cssText += ';' + src.style.cssText;\n            }\n        },\n        removeStyle: function (el, styleName){\n            if (el.style.removeProperty) {\n                el.style.removeProperty(styleName);\n            } else if (el.style.removeAttribute) {\n                el.style.removeAttribute(styleName);\n            } else throw '';\n        },\n        contains: function (elA, elB){\n            return elA && elB && (elA === elB ? false : (\n                elA.contains ? elA.contains(elB) :\n                    elA.compareDocumentPosition(elB) & 16\n                ));\n        },\n        startDrag: function (evt, callbacks,doc){\n            var doc = doc || document;\n            var startX = evt.clientX;\n            var startY = evt.clientY;\n            function handleMouseMove(evt){\n                var x = evt.clientX - startX;\n                var y = evt.clientY - startY;\n                callbacks.ondragmove(x, y,evt);\n                if (evt.stopPropagation) {\n                    evt.stopPropagation();\n                } else {\n                    evt.cancelBubble = true;\n                }\n            }\n            if (doc.addEventListener) {\n                function handleMouseUp(evt){\n                    doc.removeEventListener('mousemove', handleMouseMove, true);\n                    doc.removeEventListener('mouseup', handleMouseUp, true);\n                    window.removeEventListener('mouseup', handleMouseUp, true);\n                    callbacks.ondragstop();\n                }\n                doc.addEventListener('mousemove', handleMouseMove, true);\n                doc.addEventListener('mouseup', handleMouseUp, true);\n                window.addEventListener('mouseup', handleMouseUp, true);\n\n                evt.preventDefault();\n            } else {\n                var elm = evt.srcElement;\n                elm.setCapture();\n                function releaseCaptrue(){\n                    elm.releaseCapture();\n                    elm.detachEvent('onmousemove', handleMouseMove);\n                    elm.detachEvent('onmouseup', releaseCaptrue);\n                    elm.detachEvent('onlosecaptrue', releaseCaptrue);\n                    callbacks.ondragstop();\n                }\n                elm.attachEvent('onmousemove', handleMouseMove);\n                elm.attachEvent('onmouseup', releaseCaptrue);\n                elm.attachEvent('onlosecaptrue', releaseCaptrue);\n                evt.returnValue = false;\n            }\n            callbacks.ondragstart();\n        },\n        getFixedLayer: function (){\n            var layer = document.getElementById('edui_fixedlayer');\n            if (layer == null) {\n                layer = document.createElement('div');\n                layer.id = 'edui_fixedlayer';\n                document.body.appendChild(layer);\n                if (browser.ie && browser.version <= 8) {\n                    layer.style.position = 'absolute';\n                    bindFixedLayer();\n                    setTimeout(updateFixedOffset);\n                } else {\n                    layer.style.position = 'fixed';\n                }\n                layer.style.left = '0';\n                layer.style.top = '0';\n                layer.style.width = '0';\n                layer.style.height = '0';\n            }\n            return layer;\n        },\n        makeUnselectable: function (element){\n            if (browser.opera || (browser.ie && browser.version < 9)) {\n                element.unselectable = 'on';\n                if (element.hasChildNodes()) {\n                    for (var i=0; i<element.childNodes.length; i++) {\n                        if (element.childNodes[i].nodeType == 1) {\n                            uiUtils.makeUnselectable(element.childNodes[i]);\n                        }\n                    }\n                }\n            } else {\n                if (element.style.MozUserSelect !== undefined) {\n                    element.style.MozUserSelect = 'none';\n                } else if (element.style.WebkitUserSelect !== undefined) {\n                    element.style.WebkitUserSelect = 'none';\n                } else if (element.style.KhtmlUserSelect !== undefined) {\n                    element.style.KhtmlUserSelect = 'none';\n                }\n            }\n        }\n    };\n    function updateFixedOffset(){\n        var layer = document.getElementById('edui_fixedlayer');\n        uiUtils.setViewportOffset(layer, {\n            left: 0,\n            top: 0\n        });\n//        layer.style.display = 'none';\n//        layer.style.display = 'block';\n\n        //#trace: 1354\n//        setTimeout(updateFixedOffset);\n    }\n    function bindFixedLayer(adjOffset){\n        domUtils.on(window, 'scroll', updateFixedOffset);\n        domUtils.on(window, 'resize', baidu.editor.utils.defer(updateFixedOffset, 0, true));\n    }\n})();\n\n\n// ui/uibase.js\n(function () {\n    var utils = baidu.editor.utils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        EventBase = baidu.editor.EventBase,\n        UIBase = baidu.editor.ui.UIBase = function () {\n        };\n\n    UIBase.prototype = {\n        className:'',\n        uiName:'',\n        initOptions:function (options) {\n            var me = this;\n            for (var k in options) {\n                me[k] = options[k];\n            }\n            this.id = this.id || 'edui' + uiUtils.uid();\n        },\n        initUIBase:function () {\n            this._globalKey = utils.unhtml(uiUtils.setGlobal(this.id, this));\n        },\n        render:function (holder) {\n            var html = this.renderHtml();\n            var el = uiUtils.createElementByHtml(html);\n\n            //by xuheng 给每个node添加class\n            var list = domUtils.getElementsByTagName(el, \"*\");\n            var theme = \"edui-\" + (this.theme || this.editor.options.theme);\n            var layer = document.getElementById('edui_fixedlayer');\n            for (var i = 0, node; node = list[i++];) {\n                domUtils.addClass(node, theme);\n            }\n            domUtils.addClass(el, theme);\n            if(layer){\n                layer.className=\"\";\n                domUtils.addClass(layer,theme);\n            }\n\n            var seatEl = this.getDom();\n            if (seatEl != null) {\n                seatEl.parentNode.replaceChild(el, seatEl);\n                uiUtils.copyAttributes(el, seatEl);\n            } else {\n                if (typeof holder == 'string') {\n                    holder = document.getElementById(holder);\n                }\n                holder = holder || uiUtils.getFixedLayer();\n                domUtils.addClass(holder, theme);\n                holder.appendChild(el);\n            }\n            this.postRender();\n        },\n        getDom:function (name) {\n            if (!name) {\n                return document.getElementById(this.id);\n            } else {\n                return document.getElementById(this.id + '_' + name);\n            }\n        },\n        postRender:function () {\n            this.fireEvent('postrender');\n        },\n        getHtmlTpl:function () {\n            return '';\n        },\n        formatHtml:function (tpl) {\n            var prefix = 'edui-' + this.uiName;\n            return (tpl\n                .replace(/##/g, this.id)\n                .replace(/%%-/g, this.uiName ? prefix + '-' : '')\n                .replace(/%%/g, (this.uiName ? prefix : '') + ' ' + this.className)\n                .replace(/\\$\\$/g, this._globalKey));\n        },\n        renderHtml:function () {\n            return this.formatHtml(this.getHtmlTpl());\n        },\n        dispose:function () {\n            var box = this.getDom();\n            if (box) baidu.editor.dom.domUtils.remove(box);\n            uiUtils.unsetGlobal(this.id);\n        }\n    };\n    utils.inherits(UIBase, EventBase);\n})();\n\n\n// ui/separator.js\n(function (){\n    var utils = baidu.editor.utils,\n        UIBase = baidu.editor.ui.UIBase,\n        Separator = baidu.editor.ui.Separator = function (options){\n            this.initOptions(options);\n            this.initSeparator();\n        };\n    Separator.prototype = {\n        uiName: 'separator',\n        initSeparator: function (){\n            this.initUIBase();\n        },\n        getHtmlTpl: function (){\n            return '<div id=\"##\" class=\"edui-box %%\"></div>';\n        }\n    };\n    utils.inherits(Separator, UIBase);\n\n})();\n\n\n// ui/mask.js\n///import core\n///import uicore\n(function (){\n    var utils = baidu.editor.utils,\n        domUtils = baidu.editor.dom.domUtils,\n        UIBase = baidu.editor.ui.UIBase,\n        uiUtils = baidu.editor.ui.uiUtils;\n    \n    var Mask = baidu.editor.ui.Mask = function (options){\n        this.initOptions(options);\n        this.initUIBase();\n    };\n    Mask.prototype = {\n        getHtmlTpl: function (){\n            return '<div id=\"##\" class=\"edui-mask %%\" onclick=\"return $$._onClick(event, this);\" onmousedown=\"return $$._onMouseDown(event, this);\"></div>';\n        },\n        postRender: function (){\n            var me = this;\n            domUtils.on(window, 'resize', function (){\n                setTimeout(function (){\n                    if (!me.isHidden()) {\n                        me._fill();\n                    }\n                });\n            });\n        },\n        show: function (zIndex){\n            this._fill();\n            this.getDom().style.display = '';\n            this.getDom().style.zIndex = zIndex;\n        },\n        hide: function (){\n            this.getDom().style.display = 'none';\n            this.getDom().style.zIndex = '';\n        },\n        isHidden: function (){\n            return this.getDom().style.display == 'none';\n        },\n        _onMouseDown: function (){\n            return false;\n        },\n        _onClick: function (e, target){\n            this.fireEvent('click', e, target);\n        },\n        _fill: function (){\n            var el = this.getDom();\n            var vpRect = uiUtils.getViewportRect();\n            el.style.width = vpRect.width + 'px';\n            el.style.height = vpRect.height + 'px';\n        }\n    };\n    utils.inherits(Mask, UIBase);\n})();\n\n\n// ui/popup.js\n///import core\n///import uicore\n(function () {\n    var utils = baidu.editor.utils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        domUtils = baidu.editor.dom.domUtils,\n        UIBase = baidu.editor.ui.UIBase,\n        Popup = baidu.editor.ui.Popup = function (options){\n            this.initOptions(options);\n            this.initPopup();\n        };\n\n    var allPopups = [];\n    function closeAllPopup( evt,el ){\n        for ( var i = 0; i < allPopups.length; i++ ) {\n            var pop = allPopups[i];\n            if (!pop.isHidden()) {\n                if (pop.queryAutoHide(el) !== false) {\n                    if(evt&&/scroll/ig.test(evt.type)&&pop.className==\"edui-wordpastepop\")   return;\n                    pop.hide();\n                }\n            }\n        }\n\n        if(allPopups.length)\n            pop.editor.fireEvent(\"afterhidepop\");\n    }\n\n    Popup.postHide = closeAllPopup;\n\n    var ANCHOR_CLASSES = ['edui-anchor-topleft','edui-anchor-topright',\n        'edui-anchor-bottomleft','edui-anchor-bottomright'];\n    Popup.prototype = {\n        SHADOW_RADIUS: 5,\n        content: null,\n        _hidden: false,\n        autoRender: true,\n        canSideLeft: true,\n        canSideUp: true,\n        initPopup: function (){\n            this.initUIBase();\n            allPopups.push( this );\n        },\n        getHtmlTpl: function (){\n            return '<div id=\"##\" class=\"edui-popup %%\" onmousedown=\"return false;\">' +\n                ' <div id=\"##_body\" class=\"edui-popup-body\">' +\n                ' <iframe style=\"position:absolute;z-index:-1;left:0;top:0;background-color: transparent;\" frameborder=\"0\" width=\"100%\" height=\"100%\" src=\"about:blank\"></iframe>' +\n                ' <div class=\"edui-shadow\"></div>' +\n                ' <div id=\"##_content\" class=\"edui-popup-content\">' +\n                this.getContentHtmlTpl() +\n                '  </div>' +\n                ' </div>' +\n                '</div>';\n        },\n        getContentHtmlTpl: function (){\n            if(this.content){\n                if (typeof this.content == 'string') {\n                    return this.content;\n                }\n                return this.content.renderHtml();\n            }else{\n                return ''\n            }\n\n        },\n        _UIBase_postRender: UIBase.prototype.postRender,\n        postRender: function (){\n\n\n            if (this.content instanceof UIBase) {\n                this.content.postRender();\n            }\n\n            //捕获鼠标滚轮\n            if( this.captureWheel && !this.captured ) {\n\n                this.captured = true;\n\n                var winHeight = ( document.documentElement.clientHeight || document.body.clientHeight )  - 80,\n                    _height = this.getDom().offsetHeight,\n                    _top = uiUtils.getClientRect( this.combox.getDom() ).top,\n                    content = this.getDom('content'),\n                    ifr = this.getDom('body').getElementsByTagName('iframe'),\n                    me = this;\n\n                ifr.length && ( ifr = ifr[0] );\n\n                while( _top + _height > winHeight ) {\n                    _height -= 30;\n                }\n                content.style.height = _height + 'px';\n                //同步更改iframe高度\n                ifr && ( ifr.style.height = _height + 'px' );\n\n                //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解\n                if( window.XMLHttpRequest ) {\n\n                    domUtils.on( content, ( 'onmousewheel' in document.body ) ? 'mousewheel' :'DOMMouseScroll' , function(e){\n\n                        if(e.preventDefault) {\n                            e.preventDefault();\n                        } else {\n                            e.returnValue = false;\n                        }\n\n                        if( e.wheelDelta ) {\n\n                            content.scrollTop -= ( e.wheelDelta / 120 )*60;\n\n                        } else {\n\n                            content.scrollTop -= ( e.detail / -3 )*60;\n\n                        }\n\n                    });\n\n                } else {\n\n                    //ie6\n                    domUtils.on( this.getDom(), 'mousewheel' , function(e){\n\n                        e.returnValue = false;\n\n                        me.getDom('content').scrollTop -= ( e.wheelDelta / 120 )*60;\n\n                    });\n\n                }\n\n            }\n            this.fireEvent('postRenderAfter');\n            this.hide(true);\n            this._UIBase_postRender();\n        },\n        _doAutoRender: function (){\n            if (!this.getDom() && this.autoRender) {\n                this.render();\n            }\n        },\n        mesureSize: function (){\n            var box = this.getDom('content');\n            return uiUtils.getClientRect(box);\n        },\n        fitSize: function (){\n            if( this.captureWheel && this.sized ) {\n                return this.__size;\n            }\n            this.sized = true;\n            var popBodyEl = this.getDom('body');\n            popBodyEl.style.width = '';\n            popBodyEl.style.height = '';\n            var size = this.mesureSize();\n            if( this.captureWheel ) {\n                popBodyEl.style.width =  -(-20 -size.width) + 'px';\n                var height = parseInt( this.getDom('content').style.height, 10 );\n                !window.isNaN( height ) && ( size.height = height );\n            } else {\n                popBodyEl.style.width =  size.width + 'px';\n            }\n            popBodyEl.style.height = size.height + 'px';\n            this.__size = size;\n            this.captureWheel && (this.getDom('content').style.overflow = 'auto');\n            return size;\n        },\n        showAnchor: function ( element, hoz ){\n            this.showAnchorRect( uiUtils.getClientRect( element ), hoz );\n        },\n        showAnchorRect: function ( rect, hoz, adj ){\n            this._doAutoRender();\n            var vpRect = uiUtils.getViewportRect();\n            this.getDom().style.visibility = 'hidden';\n            this._show();\n            var popSize = this.fitSize();\n\n            var sideLeft, sideUp, left, top;\n            if (hoz) {\n                sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width);\n                sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height);\n                left = (sideLeft ? rect.left - popSize.width : rect.right);\n                top = (sideUp ? rect.bottom - popSize.height : rect.top);\n            } else {\n                sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width);\n                sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height);\n                left = (sideLeft ? rect.right - popSize.width : rect.left);\n                top = (sideUp ? rect.top - popSize.height : rect.bottom);\n            }\n\n            var popEl = this.getDom();\n            uiUtils.setViewportOffset(popEl, {\n                left: left,\n                top: top\n            });\n            domUtils.removeClasses(popEl, ANCHOR_CLASSES);\n            popEl.className += ' ' + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)];\n            if(this.editor){\n                popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10;\n                baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = popEl.style.zIndex - 1;\n            }\n            this.getDom().style.visibility = 'visible';\n\n        },\n        showAt: function (offset) {\n            var left = offset.left;\n            var top = offset.top;\n            var rect = {\n                left: left,\n                top: top,\n                right: left,\n                bottom: top,\n                height: 0,\n                width: 0\n            };\n            this.showAnchorRect(rect, false, true);\n        },\n        _show: function (){\n            if (this._hidden) {\n                var box = this.getDom();\n                box.style.display = '';\n                this._hidden = false;\n//                if (box.setActive) {\n//                    box.setActive();\n//                }\n                this.fireEvent('show');\n            }\n        },\n        isHidden: function (){\n            return this._hidden;\n        },\n        show: function (){\n            this._doAutoRender();\n            this._show();\n        },\n        hide: function (notNofity){\n            if (!this._hidden && this.getDom()) {\n                this.getDom().style.display = 'none';\n                this._hidden = true;\n                if (!notNofity) {\n                    this.fireEvent('hide');\n                }\n            }\n        },\n        queryAutoHide: function (el){\n            return !el || !uiUtils.contains(this.getDom(), el);\n        }\n    };\n    utils.inherits(Popup, UIBase);\n    \n    domUtils.on( document, 'mousedown', function ( evt ) {\n        var el = evt.target || evt.srcElement;\n        closeAllPopup( evt,el );\n    } );\n    domUtils.on( window, 'scroll', function (evt,el) {\n        closeAllPopup( evt,el );\n    } );\n\n})();\n\n\n// ui/colorpicker.js\n///import core\n///import uicore\n(function (){\n    var utils = baidu.editor.utils,\n        UIBase = baidu.editor.ui.UIBase,\n        ColorPicker = baidu.editor.ui.ColorPicker = function (options){\n            this.initOptions(options);\n            this.noColorText = this.noColorText || this.editor.getLang(\"clearColor\");\n            this.initUIBase();\n        };\n\n    ColorPicker.prototype = {\n        getHtmlTpl: function (){\n            return genColorPicker(this.noColorText,this.editor);\n        },\n        _onTableClick: function (evt){\n            var tgt = evt.target || evt.srcElement;\n            var color = tgt.getAttribute('data-color');\n            if (color) {\n                this.fireEvent('pickcolor', color);\n            }\n        },\n        _onTableOver: function (evt){\n            var tgt = evt.target || evt.srcElement;\n            var color = tgt.getAttribute('data-color');\n            if (color) {\n                this.getDom('preview').style.backgroundColor = color;\n            }\n        },\n        _onTableOut: function (){\n            this.getDom('preview').style.backgroundColor = '';\n        },\n        _onPickNoColor: function (){\n            this.fireEvent('picknocolor');\n        }\n    };\n    utils.inherits(ColorPicker, UIBase);\n\n    var COLORS = (\n        'ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,' +\n            'f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,' +\n            'd8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,' +\n            'bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,' +\n            'a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,' +\n            '7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,' +\n            'c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,').split(',');\n\n    function genColorPicker(noColorText,editor){\n        var html = '<div id=\"##\" class=\"edui-colorpicker %%\">' +\n            '<div class=\"edui-colorpicker-topbar edui-clearfix\">' +\n            '<div unselectable=\"on\" id=\"##_preview\" class=\"edui-colorpicker-preview\"></div>' +\n            '<div unselectable=\"on\" class=\"edui-colorpicker-nocolor\" onclick=\"$$._onPickNoColor(event, this);\">'+ noColorText +'</div>' +\n            '</div>' +\n            '<table  class=\"edui-box\" style=\"border-collapse: collapse;\" onmouseover=\"$$._onTableOver(event, this);\" onmouseout=\"$$._onTableOut(event, this);\" onclick=\"return $$._onTableClick(event, this);\" cellspacing=\"0\" cellpadding=\"0\">' +\n            '<tr style=\"border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px\"><td colspan=\"10\">'+editor.getLang(\"themeColor\")+'</td> </tr>'+\n            '<tr class=\"edui-colorpicker-tablefirstrow\" >';\n        for (var i=0; i<COLORS.length; i++) {\n            if (i && i%10 === 0) {\n                html += '</tr>'+(i==60?'<tr style=\"border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;\"><td colspan=\"10\">'+editor.getLang(\"standardColor\")+'</td></tr>':'')+'<tr'+(i==60?' class=\"edui-colorpicker-tablefirstrow\"':'')+'>';\n            }\n            html += i<70 ? '<td style=\"padding: 0 2px;\"><a hidefocus title=\"'+COLORS[i]+'\" onclick=\"return false;\" href=\"javascript:\" unselectable=\"on\" class=\"edui-box edui-colorpicker-colorcell\"' +\n                ' data-color=\"#'+ COLORS[i] +'\"'+\n                ' style=\"background-color:#'+ COLORS[i] +';border:solid #ccc;'+\n                (i<10 || i>=60?'border-width:1px;':\n                    i>=10&&i<20?'border-width:1px 1px 0 1px;':\n\n                        'border-width:0 1px 0 1px;')+\n                '\"' +\n                '></a></td>':'';\n        }\n        html += '</tr></table></div>';\n        return html;\n    }\n})();\n\n\n// ui/tablepicker.js\n///import core\n///import uicore\n(function (){\n    var utils = baidu.editor.utils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        UIBase = baidu.editor.ui.UIBase;\n    \n    var TablePicker = baidu.editor.ui.TablePicker = function (options){\n        this.initOptions(options);\n        this.initTablePicker();\n    };\n    TablePicker.prototype = {\n        defaultNumRows: 10,\n        defaultNumCols: 10,\n        maxNumRows: 20,\n        maxNumCols: 20,\n        numRows: 10,\n        numCols: 10,\n        lengthOfCellSide: 22,\n        initTablePicker: function (){\n            this.initUIBase();\n        },\n        getHtmlTpl: function (){\n            var me = this;\n            return '<div id=\"##\" class=\"edui-tablepicker %%\">' +\n                 '<div class=\"edui-tablepicker-body\">' +\n                  '<div class=\"edui-infoarea\">' +\n                   '<span id=\"##_label\" class=\"edui-label\"></span>' +\n                  '</div>' +\n                  '<div class=\"edui-pickarea\"' +\n                   ' onmousemove=\"$$._onMouseMove(event, this);\"' +\n                   ' onmouseover=\"$$._onMouseOver(event, this);\"' +\n                   ' onmouseout=\"$$._onMouseOut(event, this);\"' +\n                   ' onclick=\"$$._onClick(event, this);\"' +\n                  '>' +\n                    '<div id=\"##_overlay\" class=\"edui-overlay\"></div>' +\n                  '</div>' +\n                 '</div>' +\n                '</div>';\n        },\n        _UIBase_render: UIBase.prototype.render,\n        render: function (holder){\n            this._UIBase_render(holder);\n            this.getDom('label').innerHTML = '0'+this.editor.getLang(\"t_row\")+' x 0'+this.editor.getLang(\"t_col\");\n        },\n        _track: function (numCols, numRows){\n            var style = this.getDom('overlay').style;\n            var sideLen = this.lengthOfCellSide;\n            style.width = numCols * sideLen + 'px';\n            style.height = numRows * sideLen + 'px';\n            var label = this.getDom('label');\n            label.innerHTML = numCols +this.editor.getLang(\"t_col\")+' x ' + numRows + this.editor.getLang(\"t_row\");\n            this.numCols = numCols;\n            this.numRows = numRows;\n        },\n        _onMouseOver: function (evt, el){\n            var rel = evt.relatedTarget || evt.fromElement;\n            if (!uiUtils.contains(el, rel) && el !== rel) {\n                this.getDom('label').innerHTML = '0'+this.editor.getLang(\"t_col\")+' x 0'+this.editor.getLang(\"t_row\");\n                this.getDom('overlay').style.visibility = '';\n            }\n        },\n        _onMouseOut: function (evt, el){\n            var rel = evt.relatedTarget || evt.toElement;\n            if (!uiUtils.contains(el, rel) && el !== rel) {\n                this.getDom('label').innerHTML = '0'+this.editor.getLang(\"t_col\")+' x 0'+this.editor.getLang(\"t_row\");\n                this.getDom('overlay').style.visibility = 'hidden';\n            }\n        },\n        _onMouseMove: function (evt, el){\n            var style = this.getDom('overlay').style;\n            var offset = uiUtils.getEventOffset(evt);\n            var sideLen = this.lengthOfCellSide;\n            var numCols = Math.ceil(offset.left / sideLen);\n            var numRows = Math.ceil(offset.top / sideLen);\n            this._track(numCols, numRows);\n        },\n        _onClick: function (){\n            this.fireEvent('picktable', this.numCols, this.numRows);\n        }\n    };\n    utils.inherits(TablePicker, UIBase);\n})();\n\n\n// ui/stateful.js\n(function (){\n    var browser = baidu.editor.browser,\n        domUtils = baidu.editor.dom.domUtils,\n        uiUtils = baidu.editor.ui.uiUtils;\n    \n    var TPL_STATEFUL = 'onmousedown=\"$$.Stateful_onMouseDown(event, this);\"' +\n        ' onmouseup=\"$$.Stateful_onMouseUp(event, this);\"' +\n        ( browser.ie ? (\n        ' onmouseenter=\"$$.Stateful_onMouseEnter(event, this);\"' +\n        ' onmouseleave=\"$$.Stateful_onMouseLeave(event, this);\"' )\n        : (\n        ' onmouseover=\"$$.Stateful_onMouseOver(event, this);\"' +\n        ' onmouseout=\"$$.Stateful_onMouseOut(event, this);\"' ));\n    \n    baidu.editor.ui.Stateful = {\n        alwalysHoverable: false,\n        target:null,//目标元素和this指向dom不一样\n        Stateful_init: function (){\n            this._Stateful_dGetHtmlTpl = this.getHtmlTpl;\n            this.getHtmlTpl = this.Stateful_getHtmlTpl;\n        },\n        Stateful_getHtmlTpl: function (){\n            var tpl = this._Stateful_dGetHtmlTpl();\n            // 使用function避免$转义\n            return tpl.replace(/stateful/g, function (){ return TPL_STATEFUL; });\n        },\n        Stateful_onMouseEnter: function (evt, el){\n            this.target=el;\n            if (!this.isDisabled() || this.alwalysHoverable) {\n                this.addState('hover');\n                this.fireEvent('over');\n            }\n        },\n        Stateful_onMouseLeave: function (evt, el){\n            if (!this.isDisabled() || this.alwalysHoverable) {\n                this.removeState('hover');\n                this.removeState('active');\n                this.fireEvent('out');\n            }\n        },\n        Stateful_onMouseOver: function (evt, el){\n            var rel = evt.relatedTarget;\n            if (!uiUtils.contains(el, rel) && el !== rel) {\n                this.Stateful_onMouseEnter(evt, el);\n            }\n        },\n        Stateful_onMouseOut: function (evt, el){\n            var rel = evt.relatedTarget;\n            if (!uiUtils.contains(el, rel) && el !== rel) {\n                this.Stateful_onMouseLeave(evt, el);\n            }\n        },\n        Stateful_onMouseDown: function (evt, el){\n            if (!this.isDisabled()) {\n                this.addState('active');\n            }\n        },\n        Stateful_onMouseUp: function (evt, el){\n            if (!this.isDisabled()) {\n                this.removeState('active');\n            }\n        },\n        Stateful_postRender: function (){\n            if (this.disabled && !this.hasState('disabled')) {\n                this.addState('disabled');\n            }\n        },\n        hasState: function (state){\n            return domUtils.hasClass(this.getStateDom(), 'edui-state-' + state);\n        },\n        addState: function (state){\n            if (!this.hasState(state)) {\n                this.getStateDom().className += ' edui-state-' + state;\n            }\n        },\n        removeState: function (state){\n            if (this.hasState(state)) {\n                domUtils.removeClasses(this.getStateDom(), ['edui-state-' + state]);\n            }\n        },\n        getStateDom: function (){\n            return this.getDom('state');\n        },\n        isChecked: function (){\n            return this.hasState('checked');\n        },\n        setChecked: function (checked){\n            if (!this.isDisabled() && checked) {\n                this.addState('checked');\n            } else {\n                this.removeState('checked');\n            }\n        },\n        isDisabled: function (){\n            return this.hasState('disabled');\n        },\n        setDisabled: function (disabled){\n            if (disabled) {\n                this.removeState('hover');\n                this.removeState('checked');\n                this.removeState('active');\n                this.addState('disabled');\n            } else {\n                this.removeState('disabled');\n            }\n        }\n    };\n})();\n\n\n// ui/button.js\n///import core\n///import uicore\n///import ui/stateful.js\n(function (){\n    var utils = baidu.editor.utils,\n        UIBase = baidu.editor.ui.UIBase,\n        Stateful = baidu.editor.ui.Stateful,\n        Button = baidu.editor.ui.Button = function (options){\n            if(options.name){\n                var btnName = options.name;\n                var cssRules = options.cssRules;\n                if(!options.className){\n                    options.className =  'edui-for-' + btnName;\n                }\n                options.cssRules = '.edui-default  .edui-for-'+ btnName +' .edui-icon {'+ cssRules +'}'\n            }\n            this.initOptions(options);\n            this.initButton();\n        };\n    Button.prototype = {\n        uiName: 'button',\n        label: '',\n        title: '',\n        showIcon: true,\n        showText: true,\n        cssRules:'',\n        initButton: function (){\n            this.initUIBase();\n            this.Stateful_init();\n            if(this.cssRules){\n                utils.cssRule('edui-customize-'+this.name+'-style',this.cssRules);\n            }\n        },\n        getHtmlTpl: function (){\n            return '<div id=\"##\" class=\"edui-box %%\">' +\n                '<div id=\"##_state\" stateful>' +\n                 '<div class=\"%%-wrap\"><div id=\"##_body\" unselectable=\"on\" ' + (this.title ? 'title=\"' + this.title + '\"' : '') +\n                 ' class=\"%%-body\" onmousedown=\"return $$._onMouseDown(event, this);\" onclick=\"return $$._onClick(event, this);\">' +\n                  (this.showIcon ? '<div class=\"edui-box edui-icon\"></div>' : '') +\n                  (this.showText ? '<div class=\"edui-box edui-label\">' + this.label + '</div>' : '') +\n                 '</div>' +\n                '</div>' +\n                '</div></div>';\n        },\n        postRender: function (){\n            this.Stateful_postRender();\n            this.setDisabled(this.disabled)\n        },\n        _onMouseDown: function (e){\n            var target = e.target || e.srcElement,\n                tagName = target && target.tagName && target.tagName.toLowerCase();\n            if (tagName == 'input' || tagName == 'object' || tagName == 'object') {\n                return false;\n            }\n        },\n        _onClick: function (){\n            if (!this.isDisabled()) {\n                this.fireEvent('click');\n            }\n        },\n        setTitle: function(text){\n            var label = this.getDom('label');\n            label.innerHTML = text;\n        }\n    };\n    utils.inherits(Button, UIBase);\n    utils.extend(Button.prototype, Stateful);\n\n})();\n\n\n// ui/splitbutton.js\n///import core\n///import uicore\n///import ui/stateful.js\n(function (){\n    var utils = baidu.editor.utils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        domUtils = baidu.editor.dom.domUtils,\n        UIBase = baidu.editor.ui.UIBase,\n        Stateful = baidu.editor.ui.Stateful,\n        SplitButton = baidu.editor.ui.SplitButton = function (options){\n            this.initOptions(options);\n            this.initSplitButton();\n        };\n    SplitButton.prototype = {\n        popup: null,\n        uiName: 'splitbutton',\n        title: '',\n        initSplitButton: function (){\n            this.initUIBase();\n            this.Stateful_init();\n            var me = this;\n            if (this.popup != null) {\n                var popup = this.popup;\n                this.popup = null;\n                this.setPopup(popup);\n            }\n        },\n        _UIBase_postRender: UIBase.prototype.postRender,\n        postRender: function (){\n            this.Stateful_postRender();\n            this._UIBase_postRender();\n        },\n        setPopup: function (popup){\n            if (this.popup === popup) return;\n            if (this.popup != null) {\n                this.popup.dispose();\n            }\n            popup.addListener('show', utils.bind(this._onPopupShow, this));\n            popup.addListener('hide', utils.bind(this._onPopupHide, this));\n            popup.addListener('postrender', utils.bind(function (){\n                popup.getDom('body').appendChild(\n                    uiUtils.createElementByHtml('<div id=\"' +\n                        this.popup.id + '_bordereraser\" class=\"edui-bordereraser edui-background\" style=\"width:' +\n                        (uiUtils.getClientRect(this.getDom()).width + 20) + 'px\"></div>')\n                    );\n                popup.getDom().className += ' ' + this.className;\n            }, this));\n            this.popup = popup;\n        },\n        _onPopupShow: function (){\n            this.addState('opened');\n        },\n        _onPopupHide: function (){\n            this.removeState('opened');\n        },\n        getHtmlTpl: function (){\n            return '<div id=\"##\" class=\"edui-box %%\">' +\n                '<div '+ (this.title ? 'title=\"' + this.title + '\"' : '') +' id=\"##_state\" stateful><div class=\"%%-body\">' +\n                '<div id=\"##_button_body\" class=\"edui-box edui-button-body\" onclick=\"$$._onButtonClick(event, this);\">' +\n                '<div class=\"edui-box edui-icon\"></div>' +\n                '</div>' +\n                '<div class=\"edui-box edui-splitborder\"></div>' +\n                '<div class=\"edui-box edui-arrow\" onclick=\"$$._onArrowClick();\"></div>' +\n                '</div></div></div>';\n        },\n        showPopup: function (){\n            // 当popup往上弹出的时候，做特殊处理\n            var rect = uiUtils.getClientRect(this.getDom());\n            rect.top -= this.popup.SHADOW_RADIUS;\n            rect.height += this.popup.SHADOW_RADIUS;\n            this.popup.showAnchorRect(rect);\n        },\n        _onArrowClick: function (event, el){\n            if (!this.isDisabled()) {\n                this.showPopup();\n            }\n        },\n        _onButtonClick: function (){\n            if (!this.isDisabled()) {\n                this.fireEvent('buttonclick');\n            }\n        }\n    };\n    utils.inherits(SplitButton, UIBase);\n    utils.extend(SplitButton.prototype, Stateful, true);\n\n})();\n\n\n// ui/colorbutton.js\n///import core\n///import uicore\n///import ui/colorpicker.js\n///import ui/popup.js\n///import ui/splitbutton.js\n(function (){\n    var utils = baidu.editor.utils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        ColorPicker = baidu.editor.ui.ColorPicker,\n        Popup = baidu.editor.ui.Popup,\n        SplitButton = baidu.editor.ui.SplitButton,\n        ColorButton = baidu.editor.ui.ColorButton = function (options){\n            this.initOptions(options);\n            this.initColorButton();\n        };\n    ColorButton.prototype = {\n        initColorButton: function (){\n            var me = this;\n            this.popup = new Popup({\n                content: new ColorPicker({\n                    noColorText: me.editor.getLang(\"clearColor\"),\n                    editor:me.editor,\n                    onpickcolor: function (t, color){\n                        me._onPickColor(color);\n                    },\n                    onpicknocolor: function (t, color){\n                        me._onPickNoColor(color);\n                    }\n                }),\n                editor:me.editor\n            });\n            this.initSplitButton();\n        },\n        _SplitButton_postRender: SplitButton.prototype.postRender,\n        postRender: function (){\n            this._SplitButton_postRender();\n            this.getDom('button_body').appendChild(\n                uiUtils.createElementByHtml('<div id=\"' + this.id + '_colorlump\" class=\"edui-colorlump\"></div>')\n            );\n            this.getDom().className += ' edui-colorbutton';\n        },\n        setColor: function (color){\n            this.getDom('colorlump').style.backgroundColor = color;\n            this.color = color;\n        },\n        _onPickColor: function (color){\n            if (this.fireEvent('pickcolor', color) !== false) {\n                this.setColor(color);\n                this.popup.hide();\n            }\n        },\n        _onPickNoColor: function (color){\n            if (this.fireEvent('picknocolor') !== false) {\n                this.popup.hide();\n            }\n        }\n    };\n    utils.inherits(ColorButton, SplitButton);\n\n})();\n\n\n// ui/tablebutton.js\n///import core\n///import uicore\n///import ui/popup.js\n///import ui/tablepicker.js\n///import ui/splitbutton.js\n(function (){\n    var utils = baidu.editor.utils,\n        Popup = baidu.editor.ui.Popup,\n        TablePicker = baidu.editor.ui.TablePicker,\n        SplitButton = baidu.editor.ui.SplitButton,\n        TableButton = baidu.editor.ui.TableButton = function (options){\n            this.initOptions(options);\n            this.initTableButton();\n        };\n    TableButton.prototype = {\n        initTableButton: function (){\n            var me = this;\n            this.popup = new Popup({\n                content: new TablePicker({\n                    editor:me.editor,\n                    onpicktable: function (t, numCols, numRows){\n                        me._onPickTable(numCols, numRows);\n                    }\n                }),\n                'editor':me.editor\n            });\n            this.initSplitButton();\n        },\n        _onPickTable: function (numCols, numRows){\n            if (this.fireEvent('picktable', numCols, numRows) !== false) {\n                this.popup.hide();\n            }\n        }\n    };\n    utils.inherits(TableButton, SplitButton);\n\n})();\n\n\n// ui/autotypesetpicker.js\n///import core\n///import uicore\n(function () {\n    var utils = baidu.editor.utils,\n        UIBase = baidu.editor.ui.UIBase;\n\n    var AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker = function (options) {\n        this.initOptions(options);\n        this.initAutoTypeSetPicker();\n    };\n    AutoTypeSetPicker.prototype = {\n        initAutoTypeSetPicker:function () {\n            this.initUIBase();\n        },\n        getHtmlTpl:function () {\n            var me = this.editor,\n                opt = me.options.autotypeset,\n                lang = me.getLang(\"autoTypeSet\");\n\n            var textAlignInputName = 'textAlignValue' + me.uid,\n                imageBlockInputName = 'imageBlockLineValue' + me.uid,\n                symbolConverInputName = 'symbolConverValue' + me.uid;\n\n            return '<div id=\"##\" class=\"edui-autotypesetpicker %%\">' +\n                '<div class=\"edui-autotypesetpicker-body\">' +\n                '<table >' +\n                '<tr><td nowrap><input type=\"checkbox\" name=\"mergeEmptyline\" ' + (opt[\"mergeEmptyline\"] ? \"checked\" : \"\" ) + '>' + lang.mergeLine + '</td><td colspan=\"2\"><input type=\"checkbox\" name=\"removeEmptyline\" ' + (opt[\"removeEmptyline\"] ? \"checked\" : \"\" ) + '>' + lang.delLine + '</td></tr>' +\n                '<tr><td nowrap><input type=\"checkbox\" name=\"removeClass\" ' + (opt[\"removeClass\"] ? \"checked\" : \"\" ) + '>' + lang.removeFormat + '</td><td colspan=\"2\"><input type=\"checkbox\" name=\"indent\" ' + (opt[\"indent\"] ? \"checked\" : \"\" ) + '>' + lang.indent + '</td></tr>' +\n                '<tr>' +\n                '<td nowrap><input type=\"checkbox\" name=\"textAlign\" ' + (opt[\"textAlign\"] ? \"checked\" : \"\" ) + '>' + lang.alignment + '</td>' +\n                '<td colspan=\"2\" id=\"' + textAlignInputName + '\">' +\n                '<input type=\"radio\" name=\"'+ textAlignInputName +'\" value=\"left\" ' + ((opt[\"textAlign\"] && opt[\"textAlign\"] == \"left\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifyleft\") +\n                '<input type=\"radio\" name=\"'+ textAlignInputName +'\" value=\"center\" ' + ((opt[\"textAlign\"] && opt[\"textAlign\"] == \"center\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifycenter\") +\n                '<input type=\"radio\" name=\"'+ textAlignInputName +'\" value=\"right\" ' + ((opt[\"textAlign\"] && opt[\"textAlign\"] == \"right\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifyright\") +\n                '</td>' +\n                '</tr>' +\n                '<tr>' +\n                '<td nowrap><input type=\"checkbox\" name=\"imageBlockLine\" ' + (opt[\"imageBlockLine\"] ? \"checked\" : \"\" ) + '>' + lang.imageFloat + '</td>' +\n                '<td nowrap id=\"'+ imageBlockInputName +'\">' +\n                '<input type=\"radio\" name=\"'+ imageBlockInputName +'\" value=\"none\" ' + ((opt[\"imageBlockLine\"] && opt[\"imageBlockLine\"] == \"none\") ? \"checked\" : \"\") + '>' + me.getLang(\"default\") +\n                '<input type=\"radio\" name=\"'+ imageBlockInputName +'\" value=\"left\" ' + ((opt[\"imageBlockLine\"] && opt[\"imageBlockLine\"] == \"left\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifyleft\") +\n                '<input type=\"radio\" name=\"'+ imageBlockInputName +'\" value=\"center\" ' + ((opt[\"imageBlockLine\"] && opt[\"imageBlockLine\"] == \"center\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifycenter\") +\n                '<input type=\"radio\" name=\"'+ imageBlockInputName +'\" value=\"right\" ' + ((opt[\"imageBlockLine\"] && opt[\"imageBlockLine\"] == \"right\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifyright\") +\n                '</td>' +\n                '</tr>' +\n                '<tr><td nowrap><input type=\"checkbox\" name=\"clearFontSize\" ' + (opt[\"clearFontSize\"] ? \"checked\" : \"\" ) + '>' + lang.removeFontsize + '</td><td colspan=\"2\"><input type=\"checkbox\" name=\"clearFontFamily\" ' + (opt[\"clearFontFamily\"] ? \"checked\" : \"\" ) + '>' + lang.removeFontFamily + '</td></tr>' +\n                '<tr><td nowrap colspan=\"3\"><input type=\"checkbox\" name=\"removeEmptyNode\" ' + (opt[\"removeEmptyNode\"] ? \"checked\" : \"\" ) + '>' + lang.removeHtml + '</td></tr>' +\n                '<tr><td nowrap colspan=\"3\"><input type=\"checkbox\" name=\"pasteFilter\" ' + (opt[\"pasteFilter\"] ? \"checked\" : \"\" ) + '>' + lang.pasteFilter + '</td></tr>' +\n                '<tr>' +\n                '<td nowrap><input type=\"checkbox\" name=\"symbolConver\" ' + (opt[\"bdc2sb\"] || opt[\"tobdc\"] ? \"checked\" : \"\" ) + '>' + lang.symbol + '</td>' +\n                '<td id=\"' + symbolConverInputName + '\">' +\n                '<input type=\"radio\" name=\"bdc\" value=\"bdc2sb\" ' + (opt[\"bdc2sb\"] ? \"checked\" : \"\" ) + '>' + lang.bdc2sb +\n                '<input type=\"radio\" name=\"bdc\" value=\"tobdc\" ' + (opt[\"tobdc\"] ? \"checked\" : \"\" ) + '>' + lang.tobdc + '' +\n                '</td>' +\n                '<td nowrap align=\"right\"><button >' + lang.run + '</button></td>' +\n                '</tr>' +\n                '</table>' +\n                '</div>' +\n                '</div>';\n\n\n        },\n        _UIBase_render:UIBase.prototype.render\n    };\n    utils.inherits(AutoTypeSetPicker, UIBase);\n})();\n\n\n// ui/autotypesetbutton.js\n///import core\n///import uicore\n///import ui/popup.js\n///import ui/autotypesetpicker.js\n///import ui/splitbutton.js\n(function (){\n    var utils = baidu.editor.utils,\n        Popup = baidu.editor.ui.Popup,\n        AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker,\n        SplitButton = baidu.editor.ui.SplitButton,\n        AutoTypeSetButton = baidu.editor.ui.AutoTypeSetButton = function (options){\n            this.initOptions(options);\n            this.initAutoTypeSetButton();\n        };\n    function getPara(me){\n\n        var opt = {},\n            cont = me.getDom(),\n            editorId = me.editor.uid,\n            inputType = null,\n            attrName = null,\n            ipts = domUtils.getElementsByTagName(cont,\"input\");\n        for(var i=ipts.length-1,ipt;ipt=ipts[i--];){\n            inputType = ipt.getAttribute(\"type\");\n            if(inputType==\"checkbox\"){\n                attrName = ipt.getAttribute(\"name\");\n                opt[attrName] && delete opt[attrName];\n                if(ipt.checked){\n                    var attrValue = document.getElementById( attrName + \"Value\" + editorId );\n                    if(attrValue){\n                        if(/input/ig.test(attrValue.tagName)){\n                            opt[attrName] = attrValue.value;\n                        } else {\n                            var iptChilds = attrValue.getElementsByTagName(\"input\");\n                            for(var j=iptChilds.length-1,iptchild;iptchild=iptChilds[j--];){\n                                if(iptchild.checked){\n                                    opt[attrName] = iptchild.value;\n                                    break;\n                                }\n                            }\n                        }\n                    } else {\n                        opt[attrName] = true;\n                    }\n                } else {\n                    opt[attrName] = false;\n                }\n            } else {\n                opt[ipt.getAttribute(\"value\")] = ipt.checked;\n            }\n\n        }\n\n        var selects = domUtils.getElementsByTagName(cont,\"select\");\n        for(var i=0,si;si=selects[i++];){\n            var attr = si.getAttribute('name');\n            opt[attr] = opt[attr] ? si.value : '';\n        }\n\n        utils.extend(me.editor.options.autotypeset,opt);\n\n        me.editor.setPreferences('autotypeset', opt);\n    }\n\n    AutoTypeSetButton.prototype = {\n        initAutoTypeSetButton: function (){\n\n            var me = this;\n            this.popup = new Popup({\n                //传入配置参数\n                content: new AutoTypeSetPicker({editor:me.editor}),\n                'editor':me.editor,\n                hide : function(){\n                    if (!this._hidden && this.getDom()) {\n                        getPara(this);\n                        this.getDom().style.display = 'none';\n                        this._hidden = true;\n                        this.fireEvent('hide');\n                    }\n                }\n            });\n            var flag = 0;\n            this.popup.addListener('postRenderAfter',function(){\n                var popupUI = this;\n                if(flag)return;\n                var cont = this.getDom(),\n                    btn = cont.getElementsByTagName('button')[0];\n\n                btn.onclick = function(){\n                    getPara(popupUI);\n                    me.editor.execCommand('autotypeset');\n                    popupUI.hide()\n                };\n\n                domUtils.on(cont, 'click', function(e) {\n                    var target = e.target || e.srcElement,\n                        editorId = me.editor.uid;\n                    if (target && target.tagName == 'INPUT') {\n\n                        // 点击图片浮动的checkbox,去除对应的radio\n                        if (target.name == 'imageBlockLine' || target.name == 'textAlign' || target.name == 'symbolConver') {\n                            var checked = target.checked,\n                                radioTd = document.getElementById( target.name + 'Value' + editorId),\n                                radios = radioTd.getElementsByTagName('input'),\n                                defalutSelect = {\n                                    'imageBlockLine': 'none',\n                                    'textAlign': 'left',\n                                    'symbolConver': 'tobdc'\n                                };\n\n                            for (var i = 0; i < radios.length; i++) {\n                                if (checked) {\n                                    if (radios[i].value == defalutSelect[target.name]) {\n                                        radios[i].checked = 'checked';\n                                    }\n                                } else {\n                                    radios[i].checked = false;\n                                }\n                            }\n                        }\n                        // 点击radio,选中对应的checkbox\n                        if (target.name == ('imageBlockLineValue' + editorId) || target.name == ('textAlignValue' + editorId) || target.name == 'bdc') {\n                            var checkboxs = target.parentNode.previousSibling.getElementsByTagName('input');\n                            checkboxs && (checkboxs[0].checked = true);\n                        }\n\n                        getPara(popupUI);\n                    }\n                });\n\n                flag = 1;\n            });\n            this.initSplitButton();\n        }\n    };\n    utils.inherits(AutoTypeSetButton, SplitButton);\n\n})();\n\n\n// ui/cellalignpicker.js\n///import core\n///import uicore\n(function () {\n    var utils = baidu.editor.utils,\n        Popup = baidu.editor.ui.Popup,\n        Stateful = baidu.editor.ui.Stateful,\n        UIBase = baidu.editor.ui.UIBase;\n\n    /**\n     * 该参数将新增一个参数： selected， 参数类型为一个Object， 形如{ 'align': 'center', 'valign': 'top' }， 表示单元格的初始\n     * 对齐状态为： 竖直居上，水平居中; 其中 align的取值为：'center', 'left', 'right'; valign的取值为: 'top', 'middle', 'bottom'\n     * @update 2013/4/2 hancong03@baidu.com\n     */\n    var CellAlignPicker = baidu.editor.ui.CellAlignPicker = function (options) {\n        this.initOptions(options);\n        this.initSelected();\n        this.initCellAlignPicker();\n    };\n    CellAlignPicker.prototype = {\n        //初始化选中状态， 该方法将根据传递进来的参数获取到应该选中的对齐方式图标的索引\n        initSelected: function(){\n\n            var status = {\n\n                valign: {\n                    top: 0,\n                    middle: 1,\n                    bottom: 2\n                },\n                align: {\n                    left: 0,\n                    center: 1,\n                    right: 2\n                },\n                count: 3\n\n                },\n                result = -1;\n\n            if( this.selected ) {\n                this.selectedIndex = status.valign[ this.selected.valign ] * status.count + status.align[ this.selected.align ];\n            }\n\n        },\n        initCellAlignPicker:function () {\n            this.initUIBase();\n            this.Stateful_init();\n        },\n        getHtmlTpl:function () {\n\n            var alignType = [ 'left', 'center', 'right' ],\n                COUNT = 9,\n                tempClassName = null,\n                tempIndex = -1,\n                tmpl = [];\n\n\n            for( var i= 0; i<COUNT; i++ ) {\n\n                tempClassName = this.selectedIndex === i ? ' class=\"edui-cellalign-selected\" ' : '';\n                tempIndex = i % 3;\n\n                tempIndex === 0 && tmpl.push('<tr>');\n\n                tmpl.push( '<td index=\"'+ i +'\" ' + tempClassName + ' stateful><div class=\"edui-icon edui-'+ alignType[ tempIndex ] +'\"></div></td>' );\n\n                tempIndex === 2 && tmpl.push('</tr>');\n\n            }\n\n            return '<div id=\"##\" class=\"edui-cellalignpicker %%\">' +\n                '<div class=\"edui-cellalignpicker-body\">' +\n                '<table onclick=\"$$._onClick(event);\">' +\n                tmpl.join('') +\n                '</table>' +\n                '</div>' +\n                '</div>';\n        },\n        getStateDom: function (){\n            return this.target;\n        },\n        _onClick: function (evt){\n            var target= evt.target || evt.srcElement;\n            if(/icon/.test(target.className)){\n                this.items[target.parentNode.getAttribute(\"index\")].onclick();\n                Popup.postHide(evt);\n            }\n        },\n        _UIBase_render:UIBase.prototype.render\n    };\n    utils.inherits(CellAlignPicker, UIBase);\n    utils.extend(CellAlignPicker.prototype, Stateful,true);\n})();\n\n\n\n\n\n// ui/pastepicker.js\n///import core\n///import uicore\n(function () {\n    var utils = baidu.editor.utils,\n        Stateful = baidu.editor.ui.Stateful,\n        uiUtils = baidu.editor.ui.uiUtils,\n        UIBase = baidu.editor.ui.UIBase;\n\n    var PastePicker = baidu.editor.ui.PastePicker = function (options) {\n        this.initOptions(options);\n        this.initPastePicker();\n    };\n    PastePicker.prototype = {\n        initPastePicker:function () {\n            this.initUIBase();\n            this.Stateful_init();\n        },\n        getHtmlTpl:function () {\n            return '<div class=\"edui-pasteicon\" onclick=\"$$._onClick(this)\"></div>' +\n                '<div class=\"edui-pastecontainer\">' +\n                '<div class=\"edui-title\">' + this.editor.getLang(\"pasteOpt\") + '</div>' +\n                '<div class=\"edui-button\">' +\n                '<div title=\"' + this.editor.getLang(\"pasteSourceFormat\") + '\" onclick=\"$$.format(false)\" stateful>' +\n                '<div class=\"edui-richtxticon\"></div></div>' +\n                '<div title=\"' + this.editor.getLang(\"tagFormat\") + '\" onclick=\"$$.format(2)\" stateful>' +\n                '<div class=\"edui-tagicon\"></div></div>' +\n                '<div title=\"' + this.editor.getLang(\"pasteTextFormat\") + '\" onclick=\"$$.format(true)\" stateful>' +\n                '<div class=\"edui-plaintxticon\"></div></div>' +\n                '</div>' +\n                '</div>' +\n                '</div>'\n        },\n        getStateDom:function () {\n            return this.target;\n        },\n        format:function (param) {\n            this.editor.ui._isTransfer = true;\n            this.editor.fireEvent('pasteTransfer', param);\n        },\n        _onClick:function (cur) {\n            var node = domUtils.getNextDomNode(cur),\n                screenHt = uiUtils.getViewportRect().height,\n                subPop = uiUtils.getClientRect(node);\n\n            if ((subPop.top + subPop.height) > screenHt)\n                node.style.top = (-subPop.height - cur.offsetHeight) + \"px\";\n            else\n                node.style.top = \"\";\n\n            if (/hidden/ig.test(domUtils.getComputedStyle(node, \"visibility\"))) {\n                node.style.visibility = \"visible\";\n                domUtils.addClass(cur, \"edui-state-opened\");\n            } else {\n                node.style.visibility = \"hidden\";\n                domUtils.removeClasses(cur, \"edui-state-opened\")\n            }\n        },\n        _UIBase_render:UIBase.prototype.render\n    };\n    utils.inherits(PastePicker, UIBase);\n    utils.extend(PastePicker.prototype, Stateful, true);\n})();\n\n\n\n\n\n\n// ui/toolbar.js\n(function (){\n    var utils = baidu.editor.utils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        UIBase = baidu.editor.ui.UIBase,\n        Toolbar = baidu.editor.ui.Toolbar = function (options){\n            this.initOptions(options);\n            this.initToolbar();\n        };\n    Toolbar.prototype = {\n        items: null,\n        initToolbar: function (){\n            this.items = this.items || [];\n            this.initUIBase();\n        },\n        add: function (item,index){\n            if(index === undefined){\n                this.items.push(item);\n            }else{\n                this.items.splice(index,0,item)\n            }\n\n        },\n        getHtmlTpl: function (){\n            var buff = [];\n            for (var i=0; i<this.items.length; i++) {\n                buff[i] = this.items[i].renderHtml();\n            }\n            return '<div id=\"##\" class=\"edui-toolbar %%\" onselectstart=\"return false;\" onmousedown=\"return $$._onMouseDown(event, this);\">' +\n                buff.join('') +\n                '</div>'\n        },\n        postRender: function (){\n            var box = this.getDom();\n            for (var i=0; i<this.items.length; i++) {\n                this.items[i].postRender();\n            }\n            uiUtils.makeUnselectable(box);\n        },\n        _onMouseDown: function (e){\n            var target = e.target || e.srcElement,\n                tagName = target && target.tagName && target.tagName.toLowerCase();\n            if (tagName == 'input' || tagName == 'object' || tagName == 'object') {\n                return false;\n            }\n        }\n    };\n    utils.inherits(Toolbar, UIBase);\n\n})();\n\n\n// ui/menu.js\n///import core\n///import uicore\n///import ui\\popup.js\n///import ui\\stateful.js\n(function () {\n    var utils = baidu.editor.utils,\n        domUtils = baidu.editor.dom.domUtils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        UIBase = baidu.editor.ui.UIBase,\n        Popup = baidu.editor.ui.Popup,\n        Stateful = baidu.editor.ui.Stateful,\n        CellAlignPicker = baidu.editor.ui.CellAlignPicker,\n\n        Menu = baidu.editor.ui.Menu = function (options) {\n            this.initOptions(options);\n            this.initMenu();\n        };\n\n    var menuSeparator = {\n        renderHtml:function () {\n            return '<div class=\"edui-menuitem edui-menuseparator\"><div class=\"edui-menuseparator-inner\"></div></div>';\n        },\n        postRender:function () {\n        },\n        queryAutoHide:function () {\n            return true;\n        }\n    };\n    Menu.prototype = {\n        items:null,\n        uiName:'menu',\n        initMenu:function () {\n            this.items = this.items || [];\n            this.initPopup();\n            this.initItems();\n        },\n        initItems:function () {\n            for (var i = 0; i < this.items.length; i++) {\n                var item = this.items[i];\n                if (item == '-') {\n                    this.items[i] = this.getSeparator();\n                } else if (!(item instanceof MenuItem)) {\n                    item.editor = this.editor;\n                    item.theme = this.editor.options.theme;\n                    this.items[i] = this.createItem(item);\n                }\n            }\n        },\n        getSeparator:function () {\n            return menuSeparator;\n        },\n        createItem:function (item) {\n            //新增一个参数menu, 该参数存储了menuItem所对应的menu引用\n            item.menu = this;\n            return new MenuItem(item);\n        },\n        _Popup_getContentHtmlTpl:Popup.prototype.getContentHtmlTpl,\n        getContentHtmlTpl:function () {\n            if (this.items.length == 0) {\n                return this._Popup_getContentHtmlTpl();\n            }\n            var buff = [];\n            for (var i = 0; i < this.items.length; i++) {\n                var item = this.items[i];\n                buff[i] = item.renderHtml();\n            }\n            return ('<div class=\"%%-body\">' + buff.join('') + '</div>');\n        },\n        _Popup_postRender:Popup.prototype.postRender,\n        postRender:function () {\n            var me = this;\n            for (var i = 0; i < this.items.length; i++) {\n                var item = this.items[i];\n                item.ownerMenu = this;\n                item.postRender();\n            }\n            domUtils.on(this.getDom(), 'mouseover', function (evt) {\n                evt = evt || event;\n                var rel = evt.relatedTarget || evt.fromElement;\n                var el = me.getDom();\n                if (!uiUtils.contains(el, rel) && el !== rel) {\n                    me.fireEvent('over');\n                }\n            });\n            this._Popup_postRender();\n        },\n        queryAutoHide:function (el) {\n            if (el) {\n                if (uiUtils.contains(this.getDom(), el)) {\n                    return false;\n                }\n                for (var i = 0; i < this.items.length; i++) {\n                    var item = this.items[i];\n                    if (item.queryAutoHide(el) === false) {\n                        return false;\n                    }\n                }\n            }\n        },\n        clearItems:function () {\n            for (var i = 0; i < this.items.length; i++) {\n                var item = this.items[i];\n                clearTimeout(item._showingTimer);\n                clearTimeout(item._closingTimer);\n                if (item.subMenu) {\n                    item.subMenu.destroy();\n                }\n            }\n            this.items = [];\n        },\n        destroy:function () {\n            if (this.getDom()) {\n                domUtils.remove(this.getDom());\n            }\n            this.clearItems();\n        },\n        dispose:function () {\n            this.destroy();\n        }\n    };\n    utils.inherits(Menu, Popup);\n\n    /**\n     * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用\n     * @type {Function}\n     */\n    var MenuItem = baidu.editor.ui.MenuItem = function (options) {\n        this.initOptions(options);\n        this.initUIBase();\n        this.Stateful_init();\n        if (this.subMenu && !(this.subMenu instanceof Menu)) {\n            if (options.className && options.className.indexOf(\"aligntd\") != -1) {\n                var me = this;\n\n                //获取单元格对齐初始状态\n                this.subMenu.selected = this.editor.queryCommandValue( 'cellalignment' );\n\n                this.subMenu = new Popup({\n                    content:new CellAlignPicker(this.subMenu),\n                    parentMenu:me,\n                    editor:me.editor,\n                    destroy:function () {\n                        if (this.getDom()) {\n                            domUtils.remove(this.getDom());\n                        }\n                    }\n                });\n                this.subMenu.addListener(\"postRenderAfter\", function () {\n                    domUtils.on(this.getDom(), \"mouseover\", function () {\n                        me.addState('opened');\n                    });\n                });\n            } else {\n                this.subMenu = new Menu(this.subMenu);\n            }\n        }\n    };\n    MenuItem.prototype = {\n        label:'',\n        subMenu:null,\n        ownerMenu:null,\n        uiName:'menuitem',\n        alwalysHoverable:true,\n        getHtmlTpl:function () {\n            return '<div id=\"##\" class=\"%%\" stateful onclick=\"$$._onClick(event, this);\">' +\n                '<div class=\"%%-body\">' +\n                this.renderLabelHtml() +\n                '</div>' +\n                '</div>';\n        },\n        postRender:function () {\n            var me = this;\n            this.addListener('over', function () {\n                me.ownerMenu.fireEvent('submenuover', me);\n                if (me.subMenu) {\n                    me.delayShowSubMenu();\n                }\n            });\n            if (this.subMenu) {\n                this.getDom().className += ' edui-hassubmenu';\n                this.subMenu.render();\n                this.addListener('out', function () {\n                    me.delayHideSubMenu();\n                });\n                this.subMenu.addListener('over', function () {\n                    clearTimeout(me._closingTimer);\n                    me._closingTimer = null;\n                    me.addState('opened');\n                });\n                this.ownerMenu.addListener('hide', function () {\n                    me.hideSubMenu();\n                });\n                this.ownerMenu.addListener('submenuover', function (t, subMenu) {\n                    if (subMenu !== me) {\n                        me.delayHideSubMenu();\n                    }\n                });\n                this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide;\n                this.subMenu.queryAutoHide = function (el) {\n                    if (el && uiUtils.contains(me.getDom(), el)) {\n                        return false;\n                    }\n                    return this._bakQueryAutoHide(el);\n                };\n            }\n            this.getDom().style.tabIndex = '-1';\n            uiUtils.makeUnselectable(this.getDom());\n            this.Stateful_postRender();\n        },\n        delayShowSubMenu:function () {\n            var me = this;\n            if (!me.isDisabled()) {\n                me.addState('opened');\n                clearTimeout(me._showingTimer);\n                clearTimeout(me._closingTimer);\n                me._closingTimer = null;\n                me._showingTimer = setTimeout(function () {\n                    me.showSubMenu();\n                }, 250);\n            }\n        },\n        delayHideSubMenu:function () {\n            var me = this;\n            if (!me.isDisabled()) {\n                me.removeState('opened');\n                clearTimeout(me._showingTimer);\n                if (!me._closingTimer) {\n                    me._closingTimer = setTimeout(function () {\n                        if (!me.hasState('opened')) {\n                            me.hideSubMenu();\n                        }\n                        me._closingTimer = null;\n                    }, 400);\n                }\n            }\n        },\n        renderLabelHtml:function () {\n            return '<div class=\"edui-arrow\"></div>' +\n                '<div class=\"edui-box edui-icon\"></div>' +\n                '<div class=\"edui-box edui-label %%-label\">' + (this.label || '') + '</div>';\n        },\n        getStateDom:function () {\n            return this.getDom();\n        },\n        queryAutoHide:function (el) {\n            if (this.subMenu && this.hasState('opened')) {\n                return this.subMenu.queryAutoHide(el);\n            }\n        },\n        _onClick:function (event, this_) {\n            if (this.hasState('disabled')) return;\n            if (this.fireEvent('click', event, this_) !== false) {\n                if (this.subMenu) {\n                    this.showSubMenu();\n                } else {\n                    Popup.postHide(event);\n                }\n            }\n        },\n        showSubMenu:function () {\n            var rect = uiUtils.getClientRect(this.getDom());\n            rect.right -= 5;\n            rect.left += 2;\n            rect.width -= 7;\n            rect.top -= 4;\n            rect.bottom += 4;\n            rect.height += 8;\n            this.subMenu.showAnchorRect(rect, true, true);\n        },\n        hideSubMenu:function () {\n            this.subMenu.hide();\n        }\n    };\n    utils.inherits(MenuItem, UIBase);\n    utils.extend(MenuItem.prototype, Stateful, true);\n})();\n\n\n// ui/combox.js\n///import core\n///import uicore\n///import ui/menu.js\n///import ui/splitbutton.js\n(function (){\n    // todo: menu和item提成通用list\n    var utils = baidu.editor.utils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        Menu = baidu.editor.ui.Menu,\n        SplitButton = baidu.editor.ui.SplitButton,\n        Combox = baidu.editor.ui.Combox = function (options){\n            this.initOptions(options);\n            this.initCombox();\n        };\n    Combox.prototype = {\n        uiName: 'combox',\n        onbuttonclick:function () {\n            this.showPopup();\n        },\n        initCombox: function (){\n            var me = this;\n            this.items = this.items || [];\n            for (var i=0; i<this.items.length; i++) {\n                var item = this.items[i];\n                item.uiName = 'listitem';\n                item.index = i;\n                item.onclick = function (){\n                    me.selectByIndex(this.index);\n                };\n            }\n            this.popup = new Menu({\n                items: this.items,\n                uiName: 'list',\n                editor:this.editor,\n                captureWheel: true,\n                combox: this\n            });\n\n            this.initSplitButton();\n        },\n        _SplitButton_postRender: SplitButton.prototype.postRender,\n        postRender: function (){\n            this._SplitButton_postRender();\n            this.setLabel(this.label || '');\n            this.setValue(this.initValue || '');\n        },\n        showPopup: function (){\n            var rect = uiUtils.getClientRect(this.getDom());\n            rect.top += 1;\n            rect.bottom -= 1;\n            rect.height -= 2;\n            this.popup.showAnchorRect(rect);\n        },\n        getValue: function (){\n            return this.value;\n        },\n        setValue: function (value){\n            var index = this.indexByValue(value);\n            if (index != -1) {\n                this.selectedIndex = index;\n                this.setLabel(this.items[index].label);\n                this.value = this.items[index].value;\n            } else {\n                this.selectedIndex = -1;\n                this.setLabel(this.getLabelForUnknowValue(value));\n                this.value = value;\n            }\n        },\n        setLabel: function (label){\n            this.getDom('button_body').innerHTML = label;\n            this.label = label;\n        },\n        getLabelForUnknowValue: function (value){\n            return value;\n        },\n        indexByValue: function (value){\n            for (var i=0; i<this.items.length; i++) {\n                if (value == this.items[i].value) {\n                    return i;\n                }\n            }\n            return -1;\n        },\n        getItem: function (index){\n            return this.items[index];\n        },\n        selectByIndex: function (index){\n            if (index < this.items.length && this.fireEvent('select', index) !== false) {\n                this.selectedIndex = index;\n                this.value = this.items[index].value;\n                this.setLabel(this.items[index].label);\n            }\n        }\n    };\n    utils.inherits(Combox, SplitButton);\n})();\n\n\n// ui/dialog.js\n///import core\n///import uicore\n///import ui/mask.js\n///import ui/button.js\n(function (){\n    var utils = baidu.editor.utils,\n        domUtils = baidu.editor.dom.domUtils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        Mask = baidu.editor.ui.Mask,\n        UIBase = baidu.editor.ui.UIBase,\n        Button = baidu.editor.ui.Button,\n        Dialog = baidu.editor.ui.Dialog = function (options){\n            if(options.name){\n                var name = options.name;\n                var cssRules = options.cssRules;\n                if(!options.className){\n                    options.className =  'edui-for-' + name;\n                }\n                if(cssRules){\n                    options.cssRules = '.edui-default .edui-for-'+ name +' .edui-dialog-content  {'+ cssRules +'}'\n                }\n            }\n            this.initOptions(utils.extend({\n                autoReset: true,\n                draggable: true,\n                onok: function (){},\n                oncancel: function (){},\n                onclose: function (t, ok){\n                    return ok ? this.onok() : this.oncancel();\n                },\n                //是否控制dialog中的scroll事件， 默认为不阻止\n                holdScroll: false\n            },options));\n            this.initDialog();\n        };\n    var modalMask;\n    var dragMask;\n    var activeDialog;\n    Dialog.prototype = {\n        draggable: false,\n        uiName: 'dialog',\n        initDialog: function (){\n            var me = this,\n                theme=this.editor.options.theme;\n            if(this.cssRules){\n                utils.cssRule('edui-customize-'+this.name+'-style',this.cssRules);\n            }\n            this.initUIBase();\n            this.modalMask = (modalMask || (modalMask = new Mask({\n                className: 'edui-dialog-modalmask',\n                theme:theme,\n                onclick: function (){\n                    activeDialog && activeDialog.close(false);\n                }\n            })));\n            this.dragMask = (dragMask || (dragMask = new Mask({\n                className: 'edui-dialog-dragmask',\n                theme:theme\n            })));\n            this.closeButton = new Button({\n                className: 'edui-dialog-closebutton',\n                title: me.closeDialog,\n                theme:theme,\n                onclick: function (){\n                    me.close(false);\n                }\n            });\n\n            this.fullscreen && this.initResizeEvent();\n\n            if (this.buttons) {\n                for (var i=0; i<this.buttons.length; i++) {\n                    if (!(this.buttons[i] instanceof Button)) {\n                        this.buttons[i] = new Button(utils.extend(this.buttons[i],{\n                            editor : this.editor\n                        },true));\n                    }\n                }\n            }\n        },\n        initResizeEvent: function () {\n\n            var me = this;\n\n            domUtils.on( window, \"resize\", function () {\n\n                if ( me._hidden || me._hidden === undefined ) {\n                    return;\n                }\n\n                if ( me.__resizeTimer ) {\n                    window.clearTimeout( me.__resizeTimer );\n                }\n\n                me.__resizeTimer = window.setTimeout( function () {\n\n                    me.__resizeTimer = null;\n\n                    var dialogWrapNode = me.getDom(),\n                        contentNode = me.getDom('content'),\n                        wrapRect = UE.ui.uiUtils.getClientRect( dialogWrapNode ),\n                        contentRect = UE.ui.uiUtils.getClientRect( contentNode ),\n                        vpRect = uiUtils.getViewportRect();\n\n                    contentNode.style.width = ( vpRect.width - wrapRect.width + contentRect.width ) + \"px\";\n                    contentNode.style.height = ( vpRect.height - wrapRect.height + contentRect.height ) + \"px\";\n\n                    dialogWrapNode.style.width = vpRect.width + \"px\";\n                    dialogWrapNode.style.height = vpRect.height + \"px\";\n\n                    me.fireEvent( \"resize\" );\n\n                }, 100 );\n\n            } );\n\n        },\n        fitSize: function (){\n            var popBodyEl = this.getDom('body');\n//            if (!(baidu.editor.browser.ie && baidu.editor.browser.version == 7)) {\n//                uiUtils.removeStyle(popBodyEl, 'width');\n//                uiUtils.removeStyle(popBodyEl, 'height');\n//            }\n            var size = this.mesureSize();\n            popBodyEl.style.width = size.width + 'px';\n            popBodyEl.style.height = size.height + 'px';\n            return size;\n        },\n        safeSetOffset: function (offset){\n            var me = this;\n            var el = me.getDom();\n            var vpRect = uiUtils.getViewportRect();\n            var rect = uiUtils.getClientRect(el);\n            var left = offset.left;\n            if (left + rect.width > vpRect.right) {\n                left = vpRect.right - rect.width;\n            }\n            var top = offset.top;\n            if (top + rect.height > vpRect.bottom) {\n                top = vpRect.bottom - rect.height;\n            }\n            el.style.left = Math.max(left, 0) + 'px';\n            el.style.top = Math.max(top, 0) + 'px';\n        },\n        showAtCenter: function (){\n\n            var vpRect = uiUtils.getViewportRect();\n\n            if ( !this.fullscreen ) {\n                this.getDom().style.display = '';\n                var popSize = this.fitSize();\n                var titleHeight = this.getDom('titlebar').offsetHeight | 0;\n                var left = vpRect.width / 2 - popSize.width / 2;\n                var top = vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight;\n                var popEl = this.getDom();\n                this.safeSetOffset({\n                    left: Math.max(left | 0, 0),\n                    top: Math.max(top | 0, 0)\n                });\n                if (!domUtils.hasClass(popEl, 'edui-state-centered')) {\n                    popEl.className += ' edui-state-centered';\n                }\n            } else {\n                var dialogWrapNode = this.getDom(),\n                    contentNode = this.getDom('content');\n\n                dialogWrapNode.style.display = \"block\";\n\n                var wrapRect = UE.ui.uiUtils.getClientRect( dialogWrapNode ),\n                    contentRect = UE.ui.uiUtils.getClientRect( contentNode );\n                dialogWrapNode.style.left = \"-100000px\";\n\n                contentNode.style.width = ( vpRect.width - wrapRect.width + contentRect.width ) + \"px\";\n                contentNode.style.height = ( vpRect.height - wrapRect.height + contentRect.height ) + \"px\";\n\n                dialogWrapNode.style.width = vpRect.width + \"px\";\n                dialogWrapNode.style.height = vpRect.height + \"px\";\n                dialogWrapNode.style.left = 0;\n\n                //保存环境的overflow值\n                this._originalContext = {\n                    html: {\n                        overflowX: document.documentElement.style.overflowX,\n                        overflowY: document.documentElement.style.overflowY\n                    },\n                    body: {\n                        overflowX: document.body.style.overflowX,\n                        overflowY: document.body.style.overflowY\n                    }\n                };\n\n                document.documentElement.style.overflowX = 'hidden';\n                document.documentElement.style.overflowY = 'hidden';\n                document.body.style.overflowX = 'hidden';\n                document.body.style.overflowY = 'hidden';\n\n            }\n\n            this._show();\n        },\n        getContentHtml: function (){\n            var contentHtml = '';\n            if (typeof this.content == 'string') {\n                contentHtml = this.content;\n            } else if (this.iframeUrl) {\n                contentHtml = '<span id=\"'+ this.id +'_contmask\" class=\"dialogcontmask\"></span><iframe id=\"'+ this.id +\n                    '_iframe\" class=\"%%-iframe\" height=\"100%\" width=\"100%\" frameborder=\"0\" src=\"'+ this.iframeUrl +'\"></iframe>';\n            }\n            return contentHtml;\n        },\n        getHtmlTpl: function (){\n            var footHtml = '';\n\n            if (this.buttons) {\n                var buff = [];\n                for (var i=0; i<this.buttons.length; i++) {\n                    buff[i] = this.buttons[i].renderHtml();\n                }\n                footHtml = '<div class=\"%%-foot\">' +\n                     '<div id=\"##_buttons\" class=\"%%-buttons\">' + buff.join('') + '</div>' +\n                    '</div>';\n            }\n\n            return '<div id=\"##\" class=\"%%\"><div '+ ( !this.fullscreen ? 'class=\"%%\"' : 'class=\"%%-wrap edui-dialog-fullscreen-flag\"' ) +'><div id=\"##_body\" class=\"%%-body\">' +\n                '<div class=\"%%-shadow\"></div>' +\n                '<div id=\"##_titlebar\" class=\"%%-titlebar\">' +\n                '<div class=\"%%-draghandle\" onmousedown=\"$$._onTitlebarMouseDown(event, this);\">' +\n                 '<span class=\"%%-caption\">' + (this.title || '') + '</span>' +\n                '</div>' +\n                this.closeButton.renderHtml() +\n                '</div>' +\n                '<div id=\"##_content\" class=\"%%-content\">'+ ( this.autoReset ? '' : this.getContentHtml()) +'</div>' +\n                footHtml +\n                '</div></div></div>';\n        },\n        postRender: function (){\n            // todo: 保持居中/记住上次关闭位置选项\n            if (!this.modalMask.getDom()) {\n                this.modalMask.render();\n                this.modalMask.hide();\n            }\n            if (!this.dragMask.getDom()) {\n                this.dragMask.render();\n                this.dragMask.hide();\n            }\n            var me = this;\n            this.addListener('show', function (){\n                me.modalMask.show(this.getDom().style.zIndex - 2);\n            });\n            this.addListener('hide', function (){\n                me.modalMask.hide();\n            });\n            if (this.buttons) {\n                for (var i=0; i<this.buttons.length; i++) {\n                    this.buttons[i].postRender();\n                }\n            }\n            domUtils.on(window, 'resize', function (){\n                setTimeout(function (){\n                    if (!me.isHidden()) {\n                        me.safeSetOffset(uiUtils.getClientRect(me.getDom()));\n                    }\n                });\n            });\n\n            //hold住scroll事件，防止dialog的滚动影响页面\n//            if( this.holdScroll ) {\n//\n//                if( !me.iframeUrl ) {\n//                    domUtils.on( document.getElementById( me.id + \"_iframe\"), !browser.gecko ? \"mousewheel\" : \"DOMMouseScroll\", function(e){\n//                        domUtils.preventDefault(e);\n//                    } );\n//                } else {\n//                    me.addListener('dialogafterreset', function(){\n//                        window.setTimeout(function(){\n//                            var iframeWindow = document.getElementById( me.id + \"_iframe\").contentWindow;\n//\n//                            if( browser.ie ) {\n//\n//                                var timer = window.setInterval(function(){\n//\n//                                    if( iframeWindow.document && iframeWindow.document.body ) {\n//                                        window.clearInterval( timer );\n//                                        timer = null;\n//                                        domUtils.on( iframeWindow.document.body, !browser.gecko ? \"mousewheel\" : \"DOMMouseScroll\", function(e){\n//                                            domUtils.preventDefault(e);\n//                                        } );\n//                                    }\n//\n//                                }, 100);\n//\n//                            } else {\n//                                domUtils.on( iframeWindow, !browser.gecko ? \"mousewheel\" : \"DOMMouseScroll\", function(e){\n//                                    domUtils.preventDefault(e);\n//                                } );\n//                            }\n//\n//                        }, 1);\n//                    });\n//                }\n//\n//            }\n            this._hide();\n        },\n        mesureSize: function (){\n            var body = this.getDom('body');\n            var width = uiUtils.getClientRect(this.getDom('content')).width;\n            var dialogBodyStyle = body.style;\n            dialogBodyStyle.width = width;\n            return uiUtils.getClientRect(body);\n        },\n        _onTitlebarMouseDown: function (evt, el){\n            if (this.draggable) {\n                var rect;\n                var vpRect = uiUtils.getViewportRect();\n                var me = this;\n                uiUtils.startDrag(evt, {\n                    ondragstart: function (){\n                        rect = uiUtils.getClientRect(me.getDom());\n                        me.getDom('contmask').style.visibility = 'visible';\n                        me.dragMask.show(me.getDom().style.zIndex - 1);\n                    },\n                    ondragmove: function (x, y){\n                        var left = rect.left + x;\n                        var top = rect.top + y;\n                        me.safeSetOffset({\n                            left: left,\n                            top: top\n                        });\n                    },\n                    ondragstop: function (){\n                        me.getDom('contmask').style.visibility = 'hidden';\n                        domUtils.removeClasses(me.getDom(), ['edui-state-centered']);\n                        me.dragMask.hide();\n                    }\n                });\n            }\n        },\n        reset: function (){\n            this.getDom('content').innerHTML = this.getContentHtml();\n            this.fireEvent('dialogafterreset');\n        },\n        _show: function (){\n            if (this._hidden) {\n                this.getDom().style.display = '';\n\n                //要高过编辑器的zindxe\n                this.editor.container.style.zIndex && (this.getDom().style.zIndex = this.editor.container.style.zIndex * 1 + 10);\n                this._hidden = false;\n                this.fireEvent('show');\n                baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = this.getDom().style.zIndex - 4;\n            }\n        },\n        isHidden: function (){\n            return this._hidden;\n        },\n        _hide: function (){\n            if (!this._hidden) {\n                var wrapNode = this.getDom();\n                wrapNode.style.display = 'none';\n                wrapNode.style.zIndex = '';\n                wrapNode.style.width = '';\n                wrapNode.style.height = '';\n                this._hidden = true;\n                this.fireEvent('hide');\n            }\n        },\n        open: function (){\n            if (this.autoReset) {\n                //有可能还没有渲染\n                try{\n                    this.reset();\n                }catch(e){\n                    this.render();\n                    this.open()\n                }\n            }\n            this.showAtCenter();\n            if (this.iframeUrl) {\n                try {\n                    this.getDom('iframe').focus();\n                } catch(ex){}\n            }\n            activeDialog = this;\n        },\n        _onCloseButtonClick: function (evt, el){\n            this.close(false);\n        },\n        close: function (ok){\n            if (this.fireEvent('close', ok) !== false) {\n                //还原环境\n                if ( this.fullscreen ) {\n\n                    document.documentElement.style.overflowX = this._originalContext.html.overflowX;\n                    document.documentElement.style.overflowY = this._originalContext.html.overflowY;\n                    document.body.style.overflowX = this._originalContext.body.overflowX;\n                    document.body.style.overflowY = this._originalContext.body.overflowY;\n                    delete this._originalContext;\n\n                }\n                this._hide();\n\n                //销毁content\n                var content = this.getDom('content');\n                var iframe = this.getDom('iframe');\n                if (content && iframe) {\n                    var doc = iframe.contentDocument || iframe.contentWindow.document;\n                    doc && (doc.body.innerHTML = '');\n                    domUtils.remove(content);\n                }\n            }\n        }\n    };\n    utils.inherits(Dialog, UIBase);\n})();\n\n\n// ui/menubutton.js\n///import core\n///import uicore\n///import ui/menu.js\n///import ui/splitbutton.js\n(function (){\n    var utils = baidu.editor.utils,\n        Menu = baidu.editor.ui.Menu,\n        SplitButton = baidu.editor.ui.SplitButton,\n        MenuButton = baidu.editor.ui.MenuButton = function (options){\n            this.initOptions(options);\n            this.initMenuButton();\n        };\n    MenuButton.prototype = {\n        initMenuButton: function (){\n            var me = this;\n            this.uiName = \"menubutton\";\n            this.popup = new Menu({\n                items: me.items,\n                className: me.className,\n                editor:me.editor\n            });\n            this.popup.addListener('show', function (){\n                var list = this;\n                for (var i=0; i<list.items.length; i++) {\n                    list.items[i].removeState('checked');\n                    if (list.items[i].value == me._value) {\n                        list.items[i].addState('checked');\n                        this.value = me._value;\n                    }\n                }\n            });\n            this.initSplitButton();\n        },\n        setValue : function(value){\n            this._value = value;\n        }\n        \n    };\n    utils.inherits(MenuButton, SplitButton);\n})();\n\n// ui/multiMenu.js\n///import core\n///import uicore\n ///commands 表情\n(function(){\n    var utils = baidu.editor.utils,\n        Popup = baidu.editor.ui.Popup,\n        SplitButton = baidu.editor.ui.SplitButton,\n        MultiMenuPop = baidu.editor.ui.MultiMenuPop = function(options){\n            this.initOptions(options);\n            this.initMultiMenu();\n        };\n\n    MultiMenuPop.prototype = {\n        initMultiMenu: function (){\n            var me = this;\n            this.popup = new Popup({\n                content: '',\n                editor : me.editor,\n                iframe_rendered: false,\n                onshow: function (){\n                    if (!this.iframe_rendered) {\n                        this.iframe_rendered = true;\n                        this.getDom('content').innerHTML = '<iframe id=\"'+me.id+'_iframe\" src=\"'+ me.iframeUrl +'\" frameborder=\"0\"></iframe>';\n                        me.editor.container.style.zIndex && (this.getDom().style.zIndex = me.editor.container.style.zIndex * 1 + 1);\n                    }\n                }\n               // canSideUp:false,\n               // canSideLeft:false\n            });\n            this.onbuttonclick = function(){\n                this.showPopup();\n            };\n            this.initSplitButton();\n        }\n\n    };\n\n    utils.inherits(MultiMenuPop, SplitButton);\n})();\n\n\n// ui/shortcutmenu.js\n(function () {\n    var UI = baidu.editor.ui,\n        UIBase = UI.UIBase,\n        uiUtils = UI.uiUtils,\n        utils = baidu.editor.utils,\n        domUtils = baidu.editor.dom.domUtils;\n\n    var allMenus = [],//存储所有快捷菜单\n        timeID,\n        isSubMenuShow = false;//是否有子pop显示\n\n    var ShortCutMenu = UI.ShortCutMenu = function (options) {\n        this.initOptions (options);\n        this.initShortCutMenu ();\n    };\n\n    ShortCutMenu.postHide = hideAllMenu;\n\n    ShortCutMenu.prototype = {\n        isHidden : true ,\n        SPACE : 5 ,\n        initShortCutMenu : function () {\n            this.items = this.items || [];\n            this.initUIBase ();\n            this.initItems ();\n            this.initEvent ();\n            allMenus.push (this);\n        } ,\n        initEvent : function () {\n            var me = this,\n                doc = me.editor.document;\n\n            domUtils.on (doc , \"mousemove\" , function (e) {\n                if (me.isHidden === false) {\n                    //有pop显示就不隐藏快捷菜单\n                    if (me.getSubMenuMark () || me.eventType == \"contextmenu\")   return;\n\n\n                    var flag = true,\n                        el = me.getDom (),\n                        wt = el.offsetWidth,\n                        ht = el.offsetHeight,\n                        distanceX = wt / 2 + me.SPACE,//距离中心X标准\n                        distanceY = ht / 2,//距离中心Y标准\n                        x = Math.abs (e.screenX - me.left),//离中心距离横坐标\n                        y = Math.abs (e.screenY - me.top);//离中心距离纵坐标\n\n                    clearTimeout (timeID);\n                    timeID = setTimeout (function () {\n                        if (y > 0 && y < distanceY) {\n                            me.setOpacity (el , \"1\");\n                        } else if (y > distanceY && y < distanceY + 70) {\n                            me.setOpacity (el , \"0.5\");\n                            flag = false;\n                        } else if (y > distanceY + 70 && y < distanceY + 140) {\n                            me.hide ();\n                        }\n\n                        if (flag && x > 0 && x < distanceX) {\n                            me.setOpacity (el , \"1\")\n                        } else if (x > distanceX && x < distanceX + 70) {\n                            me.setOpacity (el , \"0.5\")\n                        } else if (x > distanceX + 70 && x < distanceX + 140) {\n                            me.hide ();\n                        }\n                    });\n                }\n            });\n\n            //ie\\ff下 mouseout不准\n            if (browser.chrome) {\n                domUtils.on (doc , \"mouseout\" , function (e) {\n                    var relatedTgt = e.relatedTarget || e.toElement;\n\n                    if (relatedTgt == null || relatedTgt.tagName == \"HTML\") {\n                        me.hide ();\n                    }\n                });\n            }\n\n            me.editor.addListener (\"afterhidepop\" , function () {\n                if (!me.isHidden) {\n                    isSubMenuShow = true;\n                }\n            });\n\n        } ,\n        initItems : function () {\n            if (utils.isArray (this.items)) {\n                for (var i = 0, len = this.items.length ; i < len ; i++) {\n                    var item = this.items[i].toLowerCase ();\n\n                    if (UI[item]) {\n                        this.items[i] = new UI[item] (this.editor);\n                        this.items[i].className += \" edui-shortcutsubmenu \";\n                    }\n                }\n            }\n        } ,\n        setOpacity : function (el , value) {\n            if (browser.ie && browser.version < 9) {\n                el.style.filter = \"alpha(opacity = \" + parseFloat (value) * 100 + \");\"\n            } else {\n                el.style.opacity = value;\n            }\n        } ,\n        getSubMenuMark : function () {\n            isSubMenuShow = false;\n            var layerEle = uiUtils.getFixedLayer ();\n            var list = domUtils.getElementsByTagName (layerEle , \"div\" , function (node) {\n                return domUtils.hasClass (node , \"edui-shortcutsubmenu edui-popup\")\n            });\n\n            for (var i = 0, node ; node = list[i++] ;) {\n                if (node.style.display != \"none\") {\n                    isSubMenuShow = true;\n                }\n            }\n            return isSubMenuShow;\n        } ,\n        show : function (e , hasContextmenu) {\n            var me = this,\n                offset = {},\n                el = this.getDom (),\n                fixedlayer = uiUtils.getFixedLayer ();\n\n            function setPos (offset) {\n                if (offset.left < 0) {\n                    offset.left = 0;\n                }\n                if (offset.top < 0) {\n                    offset.top = 0;\n                }\n                el.style.cssText = \"position:absolute;left:\" + offset.left + \"px;top:\" + offset.top + \"px;\";\n            }\n\n            function setPosByCxtMenu (menu) {\n                if (!menu.tagName) {\n                    menu = menu.getDom ();\n                }\n                offset.left = parseInt (menu.style.left);\n                offset.top = parseInt (menu.style.top);\n                offset.top -= el.offsetHeight + 15;\n                setPos (offset);\n            }\n\n\n            me.eventType = e.type;\n            el.style.cssText = \"display:block;left:-9999px\";\n\n            if (e.type == \"contextmenu\" && hasContextmenu) {\n                var menu = domUtils.getElementsByTagName (fixedlayer , \"div\" , \"edui-contextmenu\")[0];\n                if (menu) {\n                    setPosByCxtMenu (menu)\n                } else {\n                    me.editor.addListener (\"aftershowcontextmenu\" , function (type , menu) {\n                        setPosByCxtMenu (menu);\n                    });\n                }\n            } else {\n                offset = uiUtils.getViewportOffsetByEvent (e);\n                offset.top -= el.offsetHeight + me.SPACE;\n                offset.left += me.SPACE + 20;\n                setPos (offset);\n                me.setOpacity (el , 0.2);\n            }\n\n\n            me.isHidden = false;\n            me.left = e.screenX + el.offsetWidth / 2 - me.SPACE;\n            me.top = e.screenY - (el.offsetHeight / 2) - me.SPACE;\n\n            if (me.editor) {\n                el.style.zIndex = me.editor.container.style.zIndex * 1 + 10;\n                fixedlayer.style.zIndex = el.style.zIndex - 1;\n            }\n        } ,\n        hide : function () {\n            if (this.getDom ()) {\n                this.getDom ().style.display = \"none\";\n            }\n            this.isHidden = true;\n        } ,\n        postRender : function () {\n            if (utils.isArray (this.items)) {\n                for (var i = 0, item ; item = this.items[i++] ;) {\n                    item.postRender ();\n                }\n            }\n        } ,\n        getHtmlTpl : function () {\n            var buff;\n            if (utils.isArray (this.items)) {\n                buff = [];\n                for (var i = 0 ; i < this.items.length ; i++) {\n                    buff[i] = this.items[i].renderHtml ();\n                }\n                buff = buff.join (\"\");\n            } else {\n                buff = this.items;\n            }\n\n            return '<div id=\"##\" class=\"%% edui-toolbar\" data-src=\"shortcutmenu\" onmousedown=\"return false;\" onselectstart=\"return false;\" >' +\n                buff +\n                '</div>';\n        }\n    };\n\n    utils.inherits (ShortCutMenu , UIBase);\n\n    function hideAllMenu (e) {\n        var tgt = e.target || e.srcElement,\n            cur = domUtils.findParent (tgt , function (node) {\n                return domUtils.hasClass (node , \"edui-shortcutmenu\") || domUtils.hasClass (node , \"edui-popup\");\n            } , true);\n\n        if (!cur) {\n            for (var i = 0, menu ; menu = allMenus[i++] ;) {\n                menu.hide ()\n            }\n        }\n    }\n\n    domUtils.on (document , 'mousedown' , function (e) {\n        hideAllMenu (e);\n    });\n\n    domUtils.on (window , 'scroll' , function (e) {\n        hideAllMenu (e);\n    });\n\n}) ();\n\n\n// ui/breakline.js\n(function (){\n    var utils = baidu.editor.utils,\n        UIBase = baidu.editor.ui.UIBase,\n        Breakline = baidu.editor.ui.Breakline = function (options){\n            this.initOptions(options);\n            this.initSeparator();\n        };\n    Breakline.prototype = {\n        uiName: 'Breakline',\n        initSeparator: function (){\n            this.initUIBase();\n        },\n        getHtmlTpl: function (){\n            return '<br/>';\n        }\n    };\n    utils.inherits(Breakline, UIBase);\n\n})();\n\n\n// ui/message.js\n///import core\n///import uicore\n(function () {\n    var utils = baidu.editor.utils,\n        domUtils = baidu.editor.dom.domUtils,\n        UIBase = baidu.editor.ui.UIBase,\n        Message = baidu.editor.ui.Message = function (options){\n            this.initOptions(options);\n            this.initMessage();\n        };\n\n    Message.prototype = {\n        initMessage: function (){\n            this.initUIBase();\n        },\n        getHtmlTpl: function (){\n            return '<div id=\"##\" class=\"edui-message %%\">' +\n            ' <div id=\"##_closer\" class=\"edui-message-closer\">×</div>' +\n            ' <div id=\"##_body\" class=\"edui-message-body edui-message-type-info\">' +\n            ' <iframe style=\"position:absolute;z-index:-1;left:0;top:0;background-color: transparent;\" frameborder=\"0\" width=\"100%\" height=\"100%\" src=\"about:blank\"></iframe>' +\n            ' <div class=\"edui-shadow\"></div>' +\n            ' <div id=\"##_content\" class=\"edui-message-content\">' +\n            '  </div>' +\n            ' </div>' +\n            '</div>';\n        },\n        reset: function(opt){\n            var me = this;\n            if (!opt.keepshow) {\n                clearTimeout(this.timer);\n                me.timer = setTimeout(function(){\n                    me.hide();\n                }, opt.timeout || 4000);\n            }\n\n            opt.content !== undefined && me.setContent(opt.content);\n            opt.type !== undefined && me.setType(opt.type);\n\n            me.show();\n        },\n        postRender: function(){\n            var me = this,\n                closer = this.getDom('closer');\n            closer && domUtils.on(closer, 'click', function(){\n                me.hide();\n            });\n        },\n        setContent: function(content){\n            this.getDom('content').innerHTML = content;\n        },\n        setType: function(type){\n            type = type || 'info';\n            var body = this.getDom('body');\n            body.className = body.className.replace(/edui-message-type-[\\w-]+/, 'edui-message-type-' + type);\n        },\n        getContent: function(){\n            return this.getDom('content').innerHTML;\n        },\n        getType: function(){\n            var arr = this.getDom('body').match(/edui-message-type-([\\w-]+)/);\n            return arr ? arr[1]:'';\n        },\n        show: function (){\n            this.getDom().style.display = 'block';\n        },\n        hide: function (){\n            var dom = this.getDom();\n            if (dom) {\n                dom.style.display = 'none';\n                dom.parentNode && dom.parentNode.removeChild(dom);\n            }\n        }\n    };\n\n    utils.inherits(Message, UIBase);\n\n})();\n\n\n// adapter/editorui.js\n//ui跟编辑器的适配層\n//那个按钮弹出是dialog，是下拉筐等都是在这个js中配置\n//自己写的ui也要在这里配置，放到baidu.editor.ui下边，当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化\n(function () {\n    var utils = baidu.editor.utils;\n    var editorui = baidu.editor.ui;\n    var _Dialog = editorui.Dialog;\n    editorui.buttons = {};\n\n    editorui.Dialog = function (options) {\n        var dialog = new _Dialog(options);\n        dialog.addListener('hide', function () {\n\n            if (dialog.editor) {\n                var editor = dialog.editor;\n                try {\n                    if (browser.gecko) {\n                        var y = editor.window.scrollY,\n                            x = editor.window.scrollX;\n                        editor.body.focus();\n                        editor.window.scrollTo(x, y);\n                    } else {\n                        editor.focus();\n                    }\n\n\n                } catch (ex) {\n                }\n            }\n        });\n        return dialog;\n    };\n\n    var iframeUrlMap = {\n        'anchor':'~/dialogs/anchor/anchor.html',\n        'insertimage':'~/dialogs/image/image.html',\n        'link':'~/dialogs/link/link.html',\n        'spechars':'~/dialogs/spechars/spechars.html',\n        'searchreplace':'~/dialogs/searchreplace/searchreplace.html',\n        'map':'~/dialogs/map/map.html',\n        'gmap':'~/dialogs/gmap/gmap.html',\n        'insertvideo':'~/dialogs/video/video.html',\n        'help':'~/dialogs/help/help.html',\n        'preview':'~/dialogs/preview/preview.html',\n        'emotion':'~/dialogs/emotion/emotion.html',\n        'wordimage':'~/dialogs/wordimage/wordimage.html',\n        'attachment':'~/dialogs/attachment/attachment.html',\n        'insertframe':'~/dialogs/insertframe/insertframe.html',\n        'edittip':'~/dialogs/table/edittip.html',\n        'edittable':'~/dialogs/table/edittable.html',\n        'edittd':'~/dialogs/table/edittd.html',\n        'webapp':'~/dialogs/webapp/webapp.html',\n        'snapscreen':'~/dialogs/snapscreen/snapscreen.html',\n        'scrawl':'~/dialogs/scrawl/scrawl.html',\n        'music':'~/dialogs/music/music.html',\n        'template':'~/dialogs/template/template.html',\n        'background':'~/dialogs/background/background.html',\n        'charts': '~/dialogs/charts/charts.html'\n    };\n    //为工具栏添加按钮，以下都是统一的按钮触发命令，所以写在一起\n    var btnCmds = ['undo', 'redo', 'formatmatch',\n        'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase',\n        'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent',\n        'blockquote', 'pasteplain', 'pagebreak',\n        'selectall', 'print','horizontal', 'removeformat', 'time', 'date', 'unlink',\n        'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow',\n        'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable', 'drafts'];\n\n    for (var i = 0, ci; ci = btnCmds[i++];) {\n        ci = ci.toLowerCase();\n        editorui[ci] = function (cmd) {\n            return function (editor) {\n                var ui = new editorui.Button({\n                    className:'edui-for-' + cmd,\n                    title:editor.options.labelMap[cmd] || editor.getLang(\"labelMap.\" + cmd) || '',\n                    onclick:function () {\n                        editor.execCommand(cmd);\n                    },\n                    theme:editor.options.theme,\n                    showText:false\n                });\n                editorui.buttons[cmd] = ui;\n                editor.addListener('selectionchange', function (type, causeByUi, uiReady) {\n                    var state = editor.queryCommandState(cmd);\n                    if (state == -1) {\n                        ui.setDisabled(true);\n                        ui.setChecked(false);\n                    } else {\n                        if (!uiReady) {\n                            ui.setDisabled(false);\n                            ui.setChecked(state);\n                        }\n                    }\n                });\n                return ui;\n            };\n        }(ci);\n    }\n\n    //清除文档\n    editorui.cleardoc = function (editor) {\n        var ui = new editorui.Button({\n            className:'edui-for-cleardoc',\n            title:editor.options.labelMap.cleardoc || editor.getLang(\"labelMap.cleardoc\") || '',\n            theme:editor.options.theme,\n            onclick:function () {\n                if (confirm(editor.getLang(\"confirmClear\"))) {\n                    editor.execCommand('cleardoc');\n                }\n            }\n        });\n        editorui.buttons[\"cleardoc\"] = ui;\n        editor.addListener('selectionchange', function () {\n            ui.setDisabled(editor.queryCommandState('cleardoc') == -1);\n        });\n        return ui;\n    };\n\n    //排版，图片排版，文字方向\n    var typeset = {\n        'justify':['left', 'right', 'center', 'justify'],\n        'imagefloat':['none', 'left', 'center', 'right'],\n        'directionality':['ltr', 'rtl']\n    };\n\n    for (var p in typeset) {\n\n        (function (cmd, val) {\n            for (var i = 0, ci; ci = val[i++];) {\n                (function (cmd2) {\n                    editorui[cmd.replace('float', '') + cmd2] = function (editor) {\n                        var ui = new editorui.Button({\n                            className:'edui-for-' + cmd.replace('float', '') + cmd2,\n                            title:editor.options.labelMap[cmd.replace('float', '') + cmd2] || editor.getLang(\"labelMap.\" + cmd.replace('float', '') + cmd2) || '',\n                            theme:editor.options.theme,\n                            onclick:function () {\n                                editor.execCommand(cmd, cmd2);\n                            }\n                        });\n                        editorui.buttons[cmd] = ui;\n                        editor.addListener('selectionchange', function (type, causeByUi, uiReady) {\n                            ui.setDisabled(editor.queryCommandState(cmd) == -1);\n                            ui.setChecked(editor.queryCommandValue(cmd) == cmd2 && !uiReady);\n                        });\n                        return ui;\n                    };\n                })(ci)\n            }\n        })(p, typeset[p])\n    }\n\n    //字体颜色和背景颜色\n    for (var i = 0, ci; ci = ['backcolor', 'forecolor'][i++];) {\n        editorui[ci] = function (cmd) {\n            return function (editor) {\n                var ui = new editorui.ColorButton({\n                    className:'edui-for-' + cmd,\n                    color:'default',\n                    title:editor.options.labelMap[cmd] || editor.getLang(\"labelMap.\" + cmd) || '',\n                    editor:editor,\n                    onpickcolor:function (t, color) {\n                        editor.execCommand(cmd, color);\n                    },\n                    onpicknocolor:function () {\n                        editor.execCommand(cmd, 'default');\n                        this.setColor('transparent');\n                        this.color = 'default';\n                    },\n                    onbuttonclick:function () {\n                        editor.execCommand(cmd, this.color);\n                    }\n                });\n                editorui.buttons[cmd] = ui;\n                editor.addListener('selectionchange', function () {\n                    ui.setDisabled(editor.queryCommandState(cmd) == -1);\n                });\n                return ui;\n            };\n        }(ci);\n    }\n\n\n    var dialogBtns = {\n        noOk:['searchreplace', 'help', 'spechars', 'webapp','preview'],\n        ok:['attachment', 'anchor', 'link', 'insertimage', 'map', 'gmap', 'insertframe', 'wordimage',\n            'insertvideo', 'insertframe', 'edittip', 'edittable', 'edittd', 'scrawl', 'template', 'music', 'background', 'charts']\n    };\n\n    for (var p in dialogBtns) {\n        (function (type, vals) {\n            for (var i = 0, ci; ci = vals[i++];) {\n                //todo opera下存在问题\n                if (browser.opera && ci === \"searchreplace\") {\n                    continue;\n                }\n                (function (cmd) {\n                    editorui[cmd] = function (editor, iframeUrl, title) {\n                        iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd];\n                        title = editor.options.labelMap[cmd] || editor.getLang(\"labelMap.\" + cmd) || '';\n\n                        var dialog;\n                        //没有iframeUrl不创建dialog\n                        if (iframeUrl) {\n                            dialog = new editorui.Dialog(utils.extend({\n                                iframeUrl:editor.ui.mapUrl(iframeUrl),\n                                editor:editor,\n                                className:'edui-for-' + cmd,\n                                title:title,\n                                holdScroll: cmd === 'insertimage',\n                                fullscreen: /charts|preview/.test(cmd),\n                                closeDialog:editor.getLang(\"closeDialog\")\n                            }, type == 'ok' ? {\n                                buttons:[\n                                    {\n                                        className:'edui-okbutton',\n                                        label:editor.getLang(\"ok\"),\n                                        editor:editor,\n                                        onclick:function () {\n                                            dialog.close(true);\n                                        }\n                                    },\n                                    {\n                                        className:'edui-cancelbutton',\n                                        label:editor.getLang(\"cancel\"),\n                                        editor:editor,\n                                        onclick:function () {\n                                            dialog.close(false);\n                                        }\n                                    }\n                                ]\n                            } : {}));\n\n                            editor.ui._dialogs[cmd + \"Dialog\"] = dialog;\n                        }\n\n                        var ui = new editorui.Button({\n                            className:'edui-for-' + cmd,\n                            title:title,\n                            onclick:function () {\n                                if (dialog) {\n                                    switch (cmd) {\n                                        case \"wordimage\":\n                                            var images = editor.execCommand(\"wordimage\");\n                                            if (images && images.length) {\n                                                dialog.render();\n                                                dialog.open();\n                                            }\n                                            break;\n                                        case \"scrawl\":\n                                            if (editor.queryCommandState(\"scrawl\") != -1) {\n                                                dialog.render();\n                                                dialog.open();\n                                            }\n\n                                            break;\n                                        default:\n                                            dialog.render();\n                                            dialog.open();\n                                    }\n                                }\n                            },\n                            theme:editor.options.theme,\n                            disabled:(cmd == 'scrawl' && editor.queryCommandState(\"scrawl\") == -1) || ( cmd == 'charts' )\n                        });\n                        editorui.buttons[cmd] = ui;\n                        editor.addListener('selectionchange', function () {\n                            //只存在于右键菜单而无工具栏按钮的ui不需要检测状态\n                            var unNeedCheckState = {'edittable':1};\n                            if (cmd in unNeedCheckState)return;\n\n                            var state = editor.queryCommandState(cmd);\n                            if (ui.getDom()) {\n                                ui.setDisabled(state == -1);\n                                ui.setChecked(state);\n                            }\n\n                        });\n\n                        return ui;\n                    };\n                })(ci.toLowerCase())\n            }\n        })(p, dialogBtns[p]);\n    }\n\n    editorui.snapscreen = function (editor, iframeUrl, title) {\n        title = editor.options.labelMap['snapscreen'] || editor.getLang(\"labelMap.snapscreen\") || '';\n        var ui = new editorui.Button({\n            className:'edui-for-snapscreen',\n            title:title,\n            onclick:function () {\n                editor.execCommand(\"snapscreen\");\n            },\n            theme:editor.options.theme\n\n        });\n        editorui.buttons['snapscreen'] = ui;\n        iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})[\"snapscreen\"] || iframeUrlMap[\"snapscreen\"];\n        if (iframeUrl) {\n            var dialog = new editorui.Dialog({\n                iframeUrl:editor.ui.mapUrl(iframeUrl),\n                editor:editor,\n                className:'edui-for-snapscreen',\n                title:title,\n                buttons:[\n                    {\n                        className:'edui-okbutton',\n                        label:editor.getLang(\"ok\"),\n                        editor:editor,\n                        onclick:function () {\n                            dialog.close(true);\n                        }\n                    },\n                    {\n                        className:'edui-cancelbutton',\n                        label:editor.getLang(\"cancel\"),\n                        editor:editor,\n                        onclick:function () {\n                            dialog.close(false);\n                        }\n                    }\n                ]\n\n            });\n            dialog.render();\n            editor.ui._dialogs[\"snapscreenDialog\"] = dialog;\n        }\n        editor.addListener('selectionchange', function () {\n            ui.setDisabled(editor.queryCommandState('snapscreen') == -1);\n        });\n        return ui;\n    };\n\n    editorui.insertcode = function (editor, list, title) {\n        list = editor.options['insertcode'] || [];\n        title = editor.options.labelMap['insertcode'] || editor.getLang(\"labelMap.insertcode\") || '';\n       // if (!list.length) return;\n        var items = [];\n        utils.each(list,function(key,val){\n            items.push({\n                label:key,\n                value:val,\n                theme:editor.options.theme,\n                renderLabelHtml:function () {\n                    return '<div class=\"edui-label %%-label\" >' + (this.label || '') + '</div>';\n                }\n            });\n        });\n\n        var ui = new editorui.Combox({\n            editor:editor,\n            items:items,\n            onselect:function (t, index) {\n                editor.execCommand('insertcode', this.items[index].value);\n            },\n            onbuttonclick:function () {\n                this.showPopup();\n            },\n            title:title,\n            initValue:title,\n            className:'edui-for-insertcode',\n            indexByValue:function (value) {\n                if (value) {\n                    for (var i = 0, ci; ci = this.items[i]; i++) {\n                        if (ci.value.indexOf(value) != -1)\n                            return i;\n                    }\n                }\n\n                return -1;\n            }\n        });\n        editorui.buttons['insertcode'] = ui;\n        editor.addListener('selectionchange', function (type, causeByUi, uiReady) {\n            if (!uiReady) {\n                var state = editor.queryCommandState('insertcode');\n                if (state == -1) {\n                    ui.setDisabled(true);\n                } else {\n                    ui.setDisabled(false);\n                    var value = editor.queryCommandValue('insertcode');\n                    if(!value){\n                        ui.setValue(title);\n                        return;\n                    }\n                    //trace:1871 ie下从源码模式切换回来时，字体会带单引号，而且会有逗号\n                    value && (value = value.replace(/['\"]/g, '').split(',')[0]);\n                    ui.setValue(value);\n\n                }\n            }\n\n        });\n        return ui;\n    };\n    editorui.fontfamily = function (editor, list, title) {\n\n        list = editor.options['fontfamily'] || [];\n        title = editor.options.labelMap['fontfamily'] || editor.getLang(\"labelMap.fontfamily\") || '';\n        if (!list.length) return;\n        for (var i = 0, ci, items = []; ci = list[i]; i++) {\n            var langLabel = editor.getLang('fontfamily')[ci.name] || \"\";\n            (function (key, val) {\n                items.push({\n                    label:key,\n                    value:val,\n                    theme:editor.options.theme,\n                    renderLabelHtml:function () {\n                        return '<div class=\"edui-label %%-label\" style=\"font-family:' +\n                            utils.unhtml(this.value) + '\">' + (this.label || '') + '</div>';\n                    }\n                });\n            })(ci.label || langLabel, ci.val)\n        }\n        var ui = new editorui.Combox({\n            editor:editor,\n            items:items,\n            onselect:function (t, index) {\n                editor.execCommand('FontFamily', this.items[index].value);\n            },\n            onbuttonclick:function () {\n                this.showPopup();\n            },\n            title:title,\n            initValue:title,\n            className:'edui-for-fontfamily',\n            indexByValue:function (value) {\n                if (value) {\n                    for (var i = 0, ci; ci = this.items[i]; i++) {\n                        if (ci.value.indexOf(value) != -1)\n                            return i;\n                    }\n                }\n\n                return -1;\n            }\n        });\n        editorui.buttons['fontfamily'] = ui;\n        editor.addListener('selectionchange', function (type, causeByUi, uiReady) {\n            if (!uiReady) {\n                var state = editor.queryCommandState('FontFamily');\n                if (state == -1) {\n                    ui.setDisabled(true);\n                } else {\n                    ui.setDisabled(false);\n                    var value = editor.queryCommandValue('FontFamily');\n                    //trace:1871 ie下从源码模式切换回来时，字体会带单引号，而且会有逗号\n                    value && (value = value.replace(/['\"]/g, '').split(',')[0]);\n                    ui.setValue(value);\n\n                }\n            }\n\n        });\n        return ui;\n    };\n\n    editorui.fontsize = function (editor, list, title) {\n        title = editor.options.labelMap['fontsize'] || editor.getLang(\"labelMap.fontsize\") || '';\n        list = list || editor.options['fontsize'] || [];\n        if (!list.length) return;\n        var items = [];\n        for (var i = 0; i < list.length; i++) {\n            var size = list[i] + 'px';\n            items.push({\n                label:size,\n                value:size,\n                theme:editor.options.theme,\n                renderLabelHtml:function () {\n                    return '<div class=\"edui-label %%-label\" style=\"line-height:1;font-size:' +\n                        this.value + '\">' + (this.label || '') + '</div>';\n                }\n            });\n        }\n        var ui = new editorui.Combox({\n            editor:editor,\n            items:items,\n            title:title,\n            initValue:title,\n            onselect:function (t, index) {\n                editor.execCommand('FontSize', this.items[index].value);\n            },\n            onbuttonclick:function () {\n                this.showPopup();\n            },\n            className:'edui-for-fontsize'\n        });\n        editorui.buttons['fontsize'] = ui;\n        editor.addListener('selectionchange', function (type, causeByUi, uiReady) {\n            if (!uiReady) {\n                var state = editor.queryCommandState('FontSize');\n                if (state == -1) {\n                    ui.setDisabled(true);\n                } else {\n                    ui.setDisabled(false);\n                    ui.setValue(editor.queryCommandValue('FontSize'));\n                }\n            }\n\n        });\n        return ui;\n    };\n\n    editorui.paragraph = function (editor, list, title) {\n        title = editor.options.labelMap['paragraph'] || editor.getLang(\"labelMap.paragraph\") || '';\n        list = editor.options['paragraph'] || [];\n        if (utils.isEmptyObject(list)) return;\n        var items = [];\n        for (var i in list) {\n            items.push({\n                value:i,\n                label:list[i] || editor.getLang(\"paragraph\")[i],\n                theme:editor.options.theme,\n                renderLabelHtml:function () {\n                    return '<div class=\"edui-label %%-label\"><span class=\"edui-for-' + this.value + '\">' + (this.label || '') + '</span></div>';\n                }\n            })\n        }\n        var ui = new editorui.Combox({\n            editor:editor,\n            items:items,\n            title:title,\n            initValue:title,\n            className:'edui-for-paragraph',\n            onselect:function (t, index) {\n                editor.execCommand('Paragraph', this.items[index].value);\n            },\n            onbuttonclick:function () {\n                this.showPopup();\n            }\n        });\n        editorui.buttons['paragraph'] = ui;\n        editor.addListener('selectionchange', function (type, causeByUi, uiReady) {\n            if (!uiReady) {\n                var state = editor.queryCommandState('Paragraph');\n                if (state == -1) {\n                    ui.setDisabled(true);\n                } else {\n                    ui.setDisabled(false);\n                    var value = editor.queryCommandValue('Paragraph');\n                    var index = ui.indexByValue(value);\n                    if (index != -1) {\n                        ui.setValue(value);\n                    } else {\n                        ui.setValue(ui.initValue);\n                    }\n                }\n            }\n\n        });\n        return ui;\n    };\n\n\n    //自定义标题\n    editorui.customstyle = function (editor) {\n        var list = editor.options['customstyle'] || [],\n            title = editor.options.labelMap['customstyle'] || editor.getLang(\"labelMap.customstyle\") || '';\n        if (!list.length)return;\n        var langCs = editor.getLang('customstyle');\n        for (var i = 0, items = [], t; t = list[i++];) {\n            (function (t) {\n                var ck = {};\n                ck.label = t.label ? t.label : langCs[t.name];\n                ck.style = t.style;\n                ck.className = t.className;\n                ck.tag = t.tag;\n                items.push({\n                    label:ck.label,\n                    value:ck,\n                    theme:editor.options.theme,\n                    renderLabelHtml:function () {\n                        return '<div class=\"edui-label %%-label\">' + '<' + ck.tag + ' ' + (ck.className ? ' class=\"' + ck.className + '\"' : \"\")\n                            + (ck.style ? ' style=\"' + ck.style + '\"' : \"\") + '>' + ck.label + \"<\\/\" + ck.tag + \">\"\n                            + '</div>';\n                    }\n                });\n            })(t);\n        }\n\n        var ui = new editorui.Combox({\n            editor:editor,\n            items:items,\n            title:title,\n            initValue:title,\n            className:'edui-for-customstyle',\n            onselect:function (t, index) {\n                editor.execCommand('customstyle', this.items[index].value);\n            },\n            onbuttonclick:function () {\n                this.showPopup();\n            },\n            indexByValue:function (value) {\n                for (var i = 0, ti; ti = this.items[i++];) {\n                    if (ti.label == value) {\n                        return i - 1\n                    }\n                }\n                return -1;\n            }\n        });\n        editorui.buttons['customstyle'] = ui;\n        editor.addListener('selectionchange', function (type, causeByUi, uiReady) {\n            if (!uiReady) {\n                var state = editor.queryCommandState('customstyle');\n                if (state == -1) {\n                    ui.setDisabled(true);\n                } else {\n                    ui.setDisabled(false);\n                    var value = editor.queryCommandValue('customstyle');\n                    var index = ui.indexByValue(value);\n                    if (index != -1) {\n                        ui.setValue(value);\n                    } else {\n                        ui.setValue(ui.initValue);\n                    }\n                }\n            }\n\n        });\n        return ui;\n    };\n    editorui.inserttable = function (editor, iframeUrl, title) {\n        title = editor.options.labelMap['inserttable'] || editor.getLang(\"labelMap.inserttable\") || '';\n        var ui = new editorui.TableButton({\n            editor:editor,\n            title:title,\n            className:'edui-for-inserttable',\n            onpicktable:function (t, numCols, numRows) {\n                editor.execCommand('InsertTable', {numRows:numRows, numCols:numCols, border:1});\n            },\n            onbuttonclick:function () {\n                this.showPopup();\n            }\n        });\n        editorui.buttons['inserttable'] = ui;\n        editor.addListener('selectionchange', function () {\n            ui.setDisabled(editor.queryCommandState('inserttable') == -1);\n        });\n        return ui;\n    };\n\n    editorui.lineheight = function (editor) {\n        var val = editor.options.lineheight || [];\n        if (!val.length)return;\n        for (var i = 0, ci, items = []; ci = val[i++];) {\n            items.push({\n                //todo:写死了\n                label:ci,\n                value:ci,\n                theme:editor.options.theme,\n                onclick:function () {\n                    editor.execCommand(\"lineheight\", this.value);\n                }\n            })\n        }\n        var ui = new editorui.MenuButton({\n            editor:editor,\n            className:'edui-for-lineheight',\n            title:editor.options.labelMap['lineheight'] || editor.getLang(\"labelMap.lineheight\") || '',\n            items:items,\n            onbuttonclick:function () {\n                var value = editor.queryCommandValue('LineHeight') || this.value;\n                editor.execCommand(\"LineHeight\", value);\n            }\n        });\n        editorui.buttons['lineheight'] = ui;\n        editor.addListener('selectionchange', function () {\n            var state = editor.queryCommandState('LineHeight');\n            if (state == -1) {\n                ui.setDisabled(true);\n            } else {\n                ui.setDisabled(false);\n                var value = editor.queryCommandValue('LineHeight');\n                value && ui.setValue((value + '').replace(/cm/, ''));\n                ui.setChecked(state)\n            }\n        });\n        return ui;\n    };\n\n    var rowspacings = ['top', 'bottom'];\n    for (var r = 0, ri; ri = rowspacings[r++];) {\n        (function (cmd) {\n            editorui['rowspacing' + cmd] = function (editor) {\n                var val = editor.options['rowspacing' + cmd] || [];\n                if (!val.length) return null;\n                for (var i = 0, ci, items = []; ci = val[i++];) {\n                    items.push({\n                        label:ci,\n                        value:ci,\n                        theme:editor.options.theme,\n                        onclick:function () {\n                            editor.execCommand(\"rowspacing\", this.value, cmd);\n                        }\n                    })\n                }\n                var ui = new editorui.MenuButton({\n                    editor:editor,\n                    className:'edui-for-rowspacing' + cmd,\n                    title:editor.options.labelMap['rowspacing' + cmd] || editor.getLang(\"labelMap.rowspacing\" + cmd) || '',\n                    items:items,\n                    onbuttonclick:function () {\n                        var value = editor.queryCommandValue('rowspacing', cmd) || this.value;\n                        editor.execCommand(\"rowspacing\", value, cmd);\n                    }\n                });\n                editorui.buttons[cmd] = ui;\n                editor.addListener('selectionchange', function () {\n                    var state = editor.queryCommandState('rowspacing', cmd);\n                    if (state == -1) {\n                        ui.setDisabled(true);\n                    } else {\n                        ui.setDisabled(false);\n                        var value = editor.queryCommandValue('rowspacing', cmd);\n                        value && ui.setValue((value + '').replace(/%/, ''));\n                        ui.setChecked(state)\n                    }\n                });\n                return ui;\n            }\n        })(ri)\n    }\n    //有序，无序列表\n    var lists = ['insertorderedlist', 'insertunorderedlist'];\n    for (var l = 0, cl; cl = lists[l++];) {\n        (function (cmd) {\n            editorui[cmd] = function (editor) {\n                var vals = editor.options[cmd],\n                    _onMenuClick = function () {\n                        editor.execCommand(cmd, this.value);\n                    }, items = [];\n                for (var i in vals) {\n                    items.push({\n                        label:vals[i] || editor.getLang()[cmd][i] || \"\",\n                        value:i,\n                        theme:editor.options.theme,\n                        onclick:_onMenuClick\n                    })\n                }\n                var ui = new editorui.MenuButton({\n                    editor:editor,\n                    className:'edui-for-' + cmd,\n                    title:editor.getLang(\"labelMap.\" + cmd) || '',\n                    'items':items,\n                    onbuttonclick:function () {\n                        var value = editor.queryCommandValue(cmd) || this.value;\n                        editor.execCommand(cmd, value);\n                    }\n                });\n                editorui.buttons[cmd] = ui;\n                editor.addListener('selectionchange', function () {\n                    var state = editor.queryCommandState(cmd);\n                    if (state == -1) {\n                        ui.setDisabled(true);\n                    } else {\n                        ui.setDisabled(false);\n                        var value = editor.queryCommandValue(cmd);\n                        ui.setValue(value);\n                        ui.setChecked(state)\n                    }\n                });\n                return ui;\n            };\n        })(cl)\n    }\n\n    editorui.fullscreen = function (editor, title) {\n        title = editor.options.labelMap['fullscreen'] || editor.getLang(\"labelMap.fullscreen\") || '';\n        var ui = new editorui.Button({\n            className:'edui-for-fullscreen',\n            title:title,\n            theme:editor.options.theme,\n            onclick:function () {\n                if (editor.ui) {\n                    editor.ui.setFullScreen(!editor.ui.isFullScreen());\n                }\n                this.setChecked(editor.ui.isFullScreen());\n            }\n        });\n        editorui.buttons['fullscreen'] = ui;\n        editor.addListener('selectionchange', function () {\n            var state = editor.queryCommandState('fullscreen');\n            ui.setDisabled(state == -1);\n            ui.setChecked(editor.ui.isFullScreen());\n        });\n        return ui;\n    };\n\n    // 表情\n    editorui[\"emotion\"] = function (editor, iframeUrl) {\n        var cmd = \"emotion\";\n        var ui = new editorui.MultiMenuPop({\n            title:editor.options.labelMap[cmd] || editor.getLang(\"labelMap.\" + cmd + \"\") || '',\n            editor:editor,\n            className:'edui-for-' + cmd,\n            iframeUrl:editor.ui.mapUrl(iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd])\n        });\n        editorui.buttons[cmd] = ui;\n\n        editor.addListener('selectionchange', function () {\n            ui.setDisabled(editor.queryCommandState(cmd) == -1)\n        });\n        return ui;\n    };\n\n    editorui.autotypeset = function (editor) {\n        var ui = new editorui.AutoTypeSetButton({\n            editor:editor,\n            title:editor.options.labelMap['autotypeset'] || editor.getLang(\"labelMap.autotypeset\") || '',\n            className:'edui-for-autotypeset',\n            onbuttonclick:function () {\n                editor.execCommand('autotypeset')\n            }\n        });\n        editorui.buttons['autotypeset'] = ui;\n        editor.addListener('selectionchange', function () {\n            ui.setDisabled(editor.queryCommandState('autotypeset') == -1);\n        });\n        return ui;\n    };\n\n    /* 简单上传插件 */\n    editorui[\"simpleupload\"] = function (editor) {\n        var name = 'simpleupload',\n            ui = new editorui.Button({\n                className:'edui-for-' + name,\n                title:editor.options.labelMap[name] || editor.getLang(\"labelMap.\" + name) || '',\n                onclick:function () {},\n                theme:editor.options.theme,\n                showText:false\n            });\n        editorui.buttons[name] = ui;\n        editor.addListener('ready', function() {\n            var b = ui.getDom('body'),\n                iconSpan = b.children[0];\n            editor.fireEvent('simpleuploadbtnready', iconSpan);\n        });\n        editor.addListener('selectionchange', function (type, causeByUi, uiReady) {\n            var state = editor.queryCommandState(name);\n            if (state == -1) {\n                ui.setDisabled(true);\n                ui.setChecked(false);\n            } else {\n                if (!uiReady) {\n                    ui.setDisabled(false);\n                    ui.setChecked(state);\n                }\n            }\n        });\n        return ui;\n    };\n\n})();\n\n\n// adapter/editor.js\n///import core\n///commands 全屏\n///commandsName FullScreen\n///commandsTitle  全屏\n(function () {\n    var utils = baidu.editor.utils,\n        uiUtils = baidu.editor.ui.uiUtils,\n        UIBase = baidu.editor.ui.UIBase,\n        domUtils = baidu.editor.dom.domUtils;\n    var nodeStack = [];\n\n    function EditorUI(options) {\n        this.initOptions(options);\n        this.initEditorUI();\n    }\n\n    EditorUI.prototype = {\n        uiName:'editor',\n        initEditorUI:function () {\n            this.editor.ui = this;\n            this._dialogs = {};\n            this.initUIBase();\n            this._initToolbars();\n            var editor = this.editor,\n                me = this;\n\n            editor.addListener('ready', function () {\n                //提供getDialog方法\n                editor.getDialog = function (name) {\n                    return editor.ui._dialogs[name + \"Dialog\"];\n                };\n                domUtils.on(editor.window, 'scroll', function (evt) {\n                    baidu.editor.ui.Popup.postHide(evt);\n                });\n                //提供编辑器实时宽高(全屏时宽高不变化)\n                editor.ui._actualFrameWidth = editor.options.initialFrameWidth;\n\n                UE.browser.ie && UE.browser.version === 6 && editor.container.ownerDocument.execCommand(\"BackgroundImageCache\", false, true);\n\n                //display bottom-bar label based on config\n                if (editor.options.elementPathEnabled) {\n                    editor.ui.getDom('elementpath').innerHTML = '<div class=\"edui-editor-breadcrumb\">' + editor.getLang(\"elementPathTip\") + ':</div>';\n                }\n                if (editor.options.wordCount) {\n                    function countFn() {\n                        setCount(editor,me);\n                        domUtils.un(editor.document, \"click\", arguments.callee);\n                    }\n                    domUtils.on(editor.document, \"click\", countFn);\n                    editor.ui.getDom('wordcount').innerHTML = editor.getLang(\"wordCountTip\");\n                }\n                editor.ui._scale();\n                if (editor.options.scaleEnabled) {\n                    if (editor.autoHeightEnabled) {\n                        editor.disableAutoHeight();\n                    }\n                    me.enableScale();\n                } else {\n                    me.disableScale();\n                }\n                if (!editor.options.elementPathEnabled && !editor.options.wordCount && !editor.options.scaleEnabled) {\n                    editor.ui.getDom('elementpath').style.display = \"none\";\n                    editor.ui.getDom('wordcount').style.display = \"none\";\n                    editor.ui.getDom('scale').style.display = \"none\";\n                }\n\n                if (!editor.selection.isFocus())return;\n                editor.fireEvent('selectionchange', false, true);\n\n\n            });\n\n            editor.addListener('mousedown', function (t, evt) {\n                var el = evt.target || evt.srcElement;\n                baidu.editor.ui.Popup.postHide(evt, el);\n                baidu.editor.ui.ShortCutMenu.postHide(evt);\n\n            });\n            editor.addListener(\"delcells\", function () {\n                if (UE.ui['edittip']) {\n                    new UE.ui['edittip'](editor);\n                }\n                editor.getDialog('edittip').open();\n            });\n\n            var pastePop, isPaste = false, timer;\n            editor.addListener(\"afterpaste\", function () {\n                if(editor.queryCommandState('pasteplain'))\n                    return;\n                if(baidu.editor.ui.PastePicker){\n                    pastePop = new baidu.editor.ui.Popup({\n                        content:new baidu.editor.ui.PastePicker({editor:editor}),\n                        editor:editor,\n                        className:'edui-wordpastepop'\n                    });\n                    pastePop.render();\n                }\n                isPaste = true;\n            });\n\n            editor.addListener(\"afterinserthtml\", function () {\n                clearTimeout(timer);\n                timer = setTimeout(function () {\n                    if (pastePop && (isPaste || editor.ui._isTransfer)) {\n                        if(pastePop.isHidden()){\n                            var span = domUtils.createElement(editor.document, 'span', {\n                                    'style':\"line-height:0px;\",\n                                    'innerHTML':'\\ufeff'\n                                }),\n                                range = editor.selection.getRange();\n                            range.insertNode(span);\n                            var tmp= getDomNode(span, 'firstChild', 'previousSibling');\n                            tmp && pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp);\n                            domUtils.remove(span);\n                        }else{\n                            pastePop.show();\n                        }\n                        delete editor.ui._isTransfer;\n                        isPaste = false;\n                    }\n                }, 200)\n            });\n            editor.addListener('contextmenu', function (t, evt) {\n                baidu.editor.ui.Popup.postHide(evt);\n            });\n            editor.addListener('keydown', function (t, evt) {\n                if (pastePop)    pastePop.dispose(evt);\n                var keyCode = evt.keyCode || evt.which;\n                if(evt.altKey&&keyCode==90){\n                    UE.ui.buttons['fullscreen'].onclick();\n                }\n            });\n            editor.addListener('wordcount', function (type) {\n                setCount(this,me);\n            });\n            function setCount(editor,ui) {\n                editor.setOpt({\n                    wordCount:true,\n                    maximumWords:10000,\n                    wordCountMsg:editor.options.wordCountMsg || editor.getLang(\"wordCountMsg\"),\n                    wordOverFlowMsg:editor.options.wordOverFlowMsg || editor.getLang(\"wordOverFlowMsg\")\n                });\n                var opt = editor.options,\n                    max = opt.maximumWords,\n                    msg = opt.wordCountMsg ,\n                    errMsg = opt.wordOverFlowMsg,\n                    countDom = ui.getDom('wordcount');\n                if (!opt.wordCount) {\n                    return;\n                }\n                var count = editor.getContentLength(true);\n                if (count > max) {\n                    countDom.innerHTML = errMsg;\n                    editor.fireEvent(\"wordcountoverflow\");\n                } else {\n                    countDom.innerHTML = msg.replace(\"{#leave}\", max - count).replace(\"{#count}\", count);\n                }\n            }\n\n            editor.addListener('selectionchange', function () {\n                if (editor.options.elementPathEnabled) {\n                    me[(editor.queryCommandState('elementpath') == -1 ? 'dis' : 'en') + 'ableElementPath']()\n                }\n                if (editor.options.scaleEnabled) {\n                    me[(editor.queryCommandState('scale') == -1 ? 'dis' : 'en') + 'ableScale']();\n\n                }\n            });\n            var popup = new baidu.editor.ui.Popup({\n                editor:editor,\n                content:'',\n                className:'edui-bubble',\n                _onEditButtonClick:function () {\n                    this.hide();\n                    editor.ui._dialogs.linkDialog.open();\n                },\n                _onImgEditButtonClick:function (name) {\n                    this.hide();\n                    editor.ui._dialogs[name] && editor.ui._dialogs[name].open();\n\n                },\n                _onImgSetFloat:function (value) {\n                    this.hide();\n                    editor.execCommand(\"imagefloat\", value);\n\n                },\n                _setIframeAlign:function (value) {\n                    var frame = popup.anchorEl;\n                    var newFrame = frame.cloneNode(true);\n                    switch (value) {\n                        case -2:\n                            newFrame.setAttribute(\"align\", \"\");\n                            break;\n                        case -1:\n                            newFrame.setAttribute(\"align\", \"left\");\n                            break;\n                        case 1:\n                            newFrame.setAttribute(\"align\", \"right\");\n                            break;\n                    }\n                    frame.parentNode.insertBefore(newFrame, frame);\n                    domUtils.remove(frame);\n                    popup.anchorEl = newFrame;\n                    popup.showAnchor(popup.anchorEl);\n                },\n                _updateIframe:function () {\n                    var frame = editor._iframe = popup.anchorEl;\n                    if(domUtils.hasClass(frame, 'ueditor_baidumap')) {\n                        editor.selection.getRange().selectNode(frame).select();\n                        editor.ui._dialogs.mapDialog.open();\n                        popup.hide();\n                    } else {\n                        editor.ui._dialogs.insertframeDialog.open();\n                        popup.hide();\n                    }\n                },\n                _onRemoveButtonClick:function (cmdName) {\n                    editor.execCommand(cmdName);\n                    this.hide();\n                },\n                queryAutoHide:function (el) {\n                    if (el && el.ownerDocument == editor.document) {\n                        if (el.tagName.toLowerCase() == 'img' || domUtils.findParentByTagName(el, 'a', true)) {\n                            return el !== popup.anchorEl;\n                        }\n                    }\n                    return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el);\n                }\n            });\n            popup.render();\n            if (editor.options.imagePopup) {\n                editor.addListener('mouseover', function (t, evt) {\n                    evt = evt || window.event;\n                    var el = evt.target || evt.srcElement;\n                    if (editor.ui._dialogs.insertframeDialog && /iframe/ig.test(el.tagName)) {\n                        var html = popup.formatHtml(\n                            '<nobr>' + editor.getLang(\"property\") + ': <span onclick=$$._setIframeAlign(-2) class=\"edui-clickable\">' + editor.getLang(\"default\") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(-1) class=\"edui-clickable\">' + editor.getLang(\"justifyleft\") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(1) class=\"edui-clickable\">' + editor.getLang(\"justifyright\") + '</span>&nbsp;&nbsp;' +\n                                ' <span onclick=\"$$._updateIframe( this);\" class=\"edui-clickable\">' + editor.getLang(\"modify\") + '</span></nobr>');\n                        if (html) {\n                            popup.getDom('content').innerHTML = html;\n                            popup.anchorEl = el;\n                            popup.showAnchor(popup.anchorEl);\n                        } else {\n                            popup.hide();\n                        }\n                    }\n                });\n                editor.addListener('selectionchange', function (t, causeByUi) {\n                    if (!causeByUi) return;\n                    var html = '', str = \"\",\n                        img = editor.selection.getRange().getClosedNode(),\n                        dialogs = editor.ui._dialogs;\n                    if (img && img.tagName == 'IMG') {\n                        var dialogName = 'insertimageDialog';\n                        if (img.className.indexOf(\"edui-faked-video\") != -1 || img.className.indexOf(\"edui-upload-video\") != -1) {\n                            dialogName = \"insertvideoDialog\"\n                        }\n                        if (img.className.indexOf(\"edui-faked-webapp\") != -1) {\n                            dialogName = \"webappDialog\"\n                        }\n                        if (img.src.indexOf(\"http://api.map.baidu.com\") != -1) {\n                            dialogName = \"mapDialog\"\n                        }\n                        if (img.className.indexOf(\"edui-faked-music\") != -1) {\n                            dialogName = \"musicDialog\"\n                        }\n                        if (img.src.indexOf(\"http://maps.google.com/maps/api/staticmap\") != -1) {\n                            dialogName = \"gmapDialog\"\n                        }\n                        if (img.getAttribute(\"anchorname\")) {\n                            dialogName = \"anchorDialog\";\n                            html = popup.formatHtml(\n                                '<nobr>' + editor.getLang(\"property\") + ': <span onclick=$$._onImgEditButtonClick(\"anchorDialog\") class=\"edui-clickable\">' + editor.getLang(\"modify\") + '</span>&nbsp;&nbsp;' +\n                                    '<span onclick=$$._onRemoveButtonClick(\\'anchor\\') class=\"edui-clickable\">' + editor.getLang(\"delete\") + '</span></nobr>');\n                        }\n                        if (img.getAttribute(\"word_img\")) {\n                            //todo 放到dialog去做查询\n                            editor.word_img = [img.getAttribute(\"word_img\")];\n                            dialogName = \"wordimageDialog\"\n                        }\n                        if(domUtils.hasClass(img, 'loadingclass') || domUtils.hasClass(img, 'loaderrorclass')) {\n                            dialogName = \"\";\n                        }\n                        if (!dialogs[dialogName]) {\n                            return;\n                        }\n                        str = '<nobr>' + editor.getLang(\"property\") + ': '+\n                            '<span onclick=$$._onImgSetFloat(\"none\") class=\"edui-clickable\">' + editor.getLang(\"default\") + '</span>&nbsp;&nbsp;' +\n                            '<span onclick=$$._onImgSetFloat(\"left\") class=\"edui-clickable\">' + editor.getLang(\"justifyleft\") + '</span>&nbsp;&nbsp;' +\n                            '<span onclick=$$._onImgSetFloat(\"right\") class=\"edui-clickable\">' + editor.getLang(\"justifyright\") + '</span>&nbsp;&nbsp;' +\n                            '<span onclick=$$._onImgSetFloat(\"center\") class=\"edui-clickable\">' + editor.getLang(\"justifycenter\") + '</span>&nbsp;&nbsp;'+\n                            '<span onclick=\"$$._onImgEditButtonClick(\\'' + dialogName + '\\');\" class=\"edui-clickable\">' + editor.getLang(\"modify\") + '</span></nobr>';\n\n                        !html && (html = popup.formatHtml(str))\n\n                    }\n                    if (editor.ui._dialogs.linkDialog) {\n                        var link = editor.queryCommandValue('link');\n                        var url;\n                        if (link && (url = (link.getAttribute('_href') || link.getAttribute('href', 2)))) {\n                            var txt = url;\n                            if (url.length > 30) {\n                                txt = url.substring(0, 20) + \"...\";\n                            }\n                            if (html) {\n                                html += '<div style=\"height:5px;\"></div>'\n                            }\n                            html += popup.formatHtml(\n                                '<nobr>' + editor.getLang(\"anthorMsg\") + ': <a target=\"_blank\" href=\"' + url + '\" title=\"' + url + '\" >' + txt + '</a>' +\n                                    ' <span class=\"edui-clickable\" onclick=\"$$._onEditButtonClick();\">' + editor.getLang(\"modify\") + '</span>' +\n                                    ' <span class=\"edui-clickable\" onclick=\"$$._onRemoveButtonClick(\\'unlink\\');\"> ' + editor.getLang(\"clear\") + '</span></nobr>');\n                            popup.showAnchor(link);\n                        }\n                    }\n\n                    if (html) {\n                        popup.getDom('content').innerHTML = html;\n                        popup.anchorEl = img || link;\n                        popup.showAnchor(popup.anchorEl);\n                    } else {\n                        popup.hide();\n                    }\n                });\n            }\n\n        },\n        _initToolbars:function () {\n            var editor = this.editor;\n            var toolbars = this.toolbars || [];\n            var toolbarUis = [];\n            for (var i = 0; i < toolbars.length; i++) {\n                var toolbar = toolbars[i];\n                var toolbarUi = new baidu.editor.ui.Toolbar({theme:editor.options.theme});\n                for (var j = 0; j < toolbar.length; j++) {\n                    var toolbarItem = toolbar[j];\n                    var toolbarItemUi = null;\n                    if (typeof toolbarItem == 'string') {\n                        toolbarItem = toolbarItem.toLowerCase();\n                        if (toolbarItem == '|') {\n                            toolbarItem = 'Separator';\n                        }\n                        if(toolbarItem == '||'){\n                            toolbarItem = 'Breakline';\n                        }\n                        if (baidu.editor.ui[toolbarItem]) {\n                            toolbarItemUi = new baidu.editor.ui[toolbarItem](editor);\n                        }\n\n                        //fullscreen这里单独处理一下，放到首行去\n                        if (toolbarItem == 'fullscreen') {\n                            if (toolbarUis && toolbarUis[0]) {\n                                toolbarUis[0].items.splice(0, 0, toolbarItemUi);\n                            } else {\n                                toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi);\n                            }\n\n                            continue;\n\n\n                        }\n                    } else {\n                        toolbarItemUi = toolbarItem;\n                    }\n                    if (toolbarItemUi && toolbarItemUi.id) {\n\n                        toolbarUi.add(toolbarItemUi);\n                    }\n                }\n                toolbarUis[i] = toolbarUi;\n            }\n\n            //接受外部定制的UI\n\n            utils.each(UE._customizeUI,function(obj,key){\n                var itemUI,index;\n                if(obj.id && obj.id != editor.key){\n                   return false;\n                }\n                itemUI = obj.execFn.call(editor,editor,key);\n                if(itemUI){\n                    index = obj.index;\n                    if(index === undefined){\n                        index = toolbarUi.items.length;\n                    }\n                    toolbarUi.add(itemUI,index)\n                }\n            });\n\n            this.toolbars = toolbarUis;\n        },\n        getHtmlTpl:function () {\n            return '<div id=\"##\" class=\"%%\">' +\n                '<div id=\"##_toolbarbox\" class=\"%%-toolbarbox\">' +\n                (this.toolbars.length ?\n                    '<div id=\"##_toolbarboxouter\" class=\"%%-toolbarboxouter\"><div class=\"%%-toolbarboxinner\">' +\n                        this.renderToolbarBoxHtml() +\n                        '</div></div>' : '') +\n                '<div id=\"##_toolbarmsg\" class=\"%%-toolbarmsg\" style=\"display:none;\">' +\n                '<div id = \"##_upload_dialog\" class=\"%%-toolbarmsg-upload\" onclick=\"$$.showWordImageDialog();\">' + this.editor.getLang(\"clickToUpload\") + '</div>' +\n                '<div class=\"%%-toolbarmsg-close\" onclick=\"$$.hideToolbarMsg();\">x</div>' +\n                '<div id=\"##_toolbarmsg_label\" class=\"%%-toolbarmsg-label\"></div>' +\n                '<div style=\"height:0;overflow:hidden;clear:both;\"></div>' +\n                '</div>' +\n                '<div id=\"##_message_holder\" class=\"%%-messageholder\"></div>' +\n                '</div>' +\n                '<div id=\"##_iframeholder\" class=\"%%-iframeholder\">' +\n                '</div>' +\n                //modify wdcount by matao\n                '<div id=\"##_bottombar\" class=\"%%-bottomContainer\"><table><tr>' +\n                '<td id=\"##_elementpath\" class=\"%%-bottombar\"></td>' +\n                '<td id=\"##_wordcount\" class=\"%%-wordcount\"></td>' +\n                '<td id=\"##_scale\" class=\"%%-scale\"><div class=\"%%-icon\"></div></td>' +\n                '</tr></table></div>' +\n                '<div id=\"##_scalelayer\"></div>' +\n                '</div>';\n        },\n        showWordImageDialog:function () {\n            this._dialogs['wordimageDialog'].open();\n        },\n        renderToolbarBoxHtml:function () {\n            var buff = [];\n            for (var i = 0; i < this.toolbars.length; i++) {\n                buff.push(this.toolbars[i].renderHtml());\n            }\n            return buff.join('');\n        },\n        setFullScreen:function (fullscreen) {\n\n            var editor = this.editor,\n                container = editor.container.parentNode.parentNode;\n            if (this._fullscreen != fullscreen) {\n                this._fullscreen = fullscreen;\n                this.editor.fireEvent('beforefullscreenchange', fullscreen);\n                if (baidu.editor.browser.gecko) {\n                    var bk = editor.selection.getRange().createBookmark();\n                }\n                if (fullscreen) {\n                    while (container.tagName != \"BODY\") {\n                        var position = baidu.editor.dom.domUtils.getComputedStyle(container, \"position\");\n                        nodeStack.push(position);\n                        container.style.position = \"static\";\n                        container = container.parentNode;\n                    }\n                    this._bakHtmlOverflow = document.documentElement.style.overflow;\n                    this._bakBodyOverflow = document.body.style.overflow;\n                    this._bakAutoHeight = this.editor.autoHeightEnabled;\n                    this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);\n\n                    this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth;\n                    if (this._bakAutoHeight) {\n                        //当全屏时不能执行自动长高\n                        editor.autoHeightEnabled = false;\n                        this.editor.disableAutoHeight();\n                    }\n\n                    document.documentElement.style.overflow = 'hidden';\n                    //修复，滚动条不收起的问题\n\n                    window.scrollTo(0,window.scrollY);\n                    this._bakCssText = this.getDom().style.cssText;\n                    this._bakCssText1 = this.getDom('iframeholder').style.cssText;\n                    editor.iframe.parentNode.style.width = '';\n                    this._updateFullScreen();\n                } else {\n                    while (container.tagName != \"BODY\") {\n                        container.style.position = nodeStack.shift();\n                        container = container.parentNode;\n                    }\n                    this.getDom().style.cssText = this._bakCssText;\n                    this.getDom('iframeholder').style.cssText = this._bakCssText1;\n                    if (this._bakAutoHeight) {\n                        editor.autoHeightEnabled = true;\n                        this.editor.enableAutoHeight();\n                    }\n\n                    document.documentElement.style.overflow = this._bakHtmlOverflow;\n                    document.body.style.overflow = this._bakBodyOverflow;\n                    editor.iframe.parentNode.style.width = this._bakEditorContaninerWidth + 'px';\n                    window.scrollTo(0, this._bakScrollTop);\n                }\n                if (browser.gecko && editor.body.contentEditable === 'true') {\n                    var input = document.createElement('input');\n                    document.body.appendChild(input);\n                    editor.body.contentEditable = false;\n                    setTimeout(function () {\n                        input.focus();\n                        setTimeout(function () {\n                            editor.body.contentEditable = true;\n                            editor.fireEvent('fullscreenchanged', fullscreen);\n                            editor.selection.getRange().moveToBookmark(bk).select(true);\n                            baidu.editor.dom.domUtils.remove(input);\n                            fullscreen && window.scroll(0, 0);\n                        }, 0)\n                    }, 0)\n                }\n\n                if(editor.body.contentEditable === 'true'){\n                    this.editor.fireEvent('fullscreenchanged', fullscreen);\n                    this.triggerLayout();\n                }\n\n            }\n        },\n        _updateFullScreen:function () {\n            if (this._fullscreen) {\n                var vpRect = uiUtils.getViewportRect();\n                this.getDom().style.cssText = 'border:0;position:absolute;left:0;top:' + (this.editor.options.topOffset || 0) + 'px;width:' + vpRect.width + 'px;height:' + vpRect.height + 'px;z-index:' + (this.getDom().style.zIndex * 1 + 100);\n                uiUtils.setViewportOffset(this.getDom(), { left:0, top:this.editor.options.topOffset || 0 });\n                this.editor.setHeight(vpRect.height - this.getDom('toolbarbox').offsetHeight - this.getDom('bottombar').offsetHeight - (this.editor.options.topOffset || 0),true);\n                //不手动调一下，会导致全屏失效\n                if(browser.gecko){\n                    try{\n                        window.onresize();\n                    }catch(e){\n\n                    }\n\n                }\n            }\n        },\n        _updateElementPath:function () {\n            var bottom = this.getDom('elementpath'), list;\n            if (this.elementPathEnabled && (list = this.editor.queryCommandValue('elementpath'))) {\n\n                var buff = [];\n                for (var i = 0, ci; ci = list[i]; i++) {\n                    buff[i] = this.formatHtml('<span unselectable=\"on\" onclick=\"$$.editor.execCommand(&quot;elementpath&quot;, &quot;' + i + '&quot;);\">' + ci + '</span>');\n                }\n                bottom.innerHTML = '<div class=\"edui-editor-breadcrumb\" onmousedown=\"return false;\">' + this.editor.getLang(\"elementPathTip\") + ': ' + buff.join(' &gt; ') + '</div>';\n\n            } else {\n                bottom.style.display = 'none'\n            }\n        },\n        disableElementPath:function () {\n            var bottom = this.getDom('elementpath');\n            bottom.innerHTML = '';\n            bottom.style.display = 'none';\n            this.elementPathEnabled = false;\n\n        },\n        enableElementPath:function () {\n            var bottom = this.getDom('elementpath');\n            bottom.style.display = '';\n            this.elementPathEnabled = true;\n            this._updateElementPath();\n        },\n        _scale:function () {\n            var doc = document,\n                editor = this.editor,\n                editorHolder = editor.container,\n                editorDocument = editor.document,\n                toolbarBox = this.getDom(\"toolbarbox\"),\n                bottombar = this.getDom(\"bottombar\"),\n                scale = this.getDom(\"scale\"),\n                scalelayer = this.getDom(\"scalelayer\");\n\n            var isMouseMove = false,\n                position = null,\n                minEditorHeight = 0,\n                minEditorWidth = editor.options.minFrameWidth,\n                pageX = 0,\n                pageY = 0,\n                scaleWidth = 0,\n                scaleHeight = 0;\n\n            function down() {\n                position = domUtils.getXY(editorHolder);\n\n                if (!minEditorHeight) {\n                    minEditorHeight = editor.options.minFrameHeight + toolbarBox.offsetHeight + bottombar.offsetHeight;\n                }\n\n                scalelayer.style.cssText = \"position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:\" + editorHolder.offsetWidth + \"px;height:\"\n                    + editorHolder.offsetHeight + \"px;z-index:\" + (editor.options.zIndex + 1);\n\n                domUtils.on(doc, \"mousemove\", move);\n                domUtils.on(editorDocument, \"mouseup\", up);\n                domUtils.on(doc, \"mouseup\", up);\n            }\n\n            var me = this;\n            //by xuheng 全屏时关掉缩放\n            this.editor.addListener('fullscreenchanged', function (e, fullScreen) {\n                if (fullScreen) {\n                    me.disableScale();\n\n                } else {\n                    if (me.editor.options.scaleEnabled) {\n                        me.enableScale();\n                        var tmpNode = me.editor.document.createElement('span');\n                        me.editor.body.appendChild(tmpNode);\n                        me.editor.body.style.height = Math.max(domUtils.getXY(tmpNode).y, me.editor.iframe.offsetHeight - 20) + 'px';\n                        domUtils.remove(tmpNode)\n                    }\n                }\n            });\n            function move(event) {\n                clearSelection();\n                var e = event || window.event;\n                pageX = e.pageX || (doc.documentElement.scrollLeft + e.clientX);\n                pageY = e.pageY || (doc.documentElement.scrollTop + e.clientY);\n                scaleWidth = pageX - position.x;\n                scaleHeight = pageY - position.y;\n\n                if (scaleWidth >= minEditorWidth) {\n                    isMouseMove = true;\n                    scalelayer.style.width = scaleWidth + 'px';\n                }\n                if (scaleHeight >= minEditorHeight) {\n                    isMouseMove = true;\n                    scalelayer.style.height = scaleHeight + \"px\";\n                }\n            }\n\n            function up() {\n                if (isMouseMove) {\n                    isMouseMove = false;\n                    editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2;\n                    editorHolder.style.width = editor.ui._actualFrameWidth + 'px';\n\n                    editor.setHeight(scalelayer.offsetHeight - bottombar.offsetHeight - toolbarBox.offsetHeight - 2,true);\n                }\n                if (scalelayer) {\n                    scalelayer.style.display = \"none\";\n                }\n                clearSelection();\n                domUtils.un(doc, \"mousemove\", move);\n                domUtils.un(editorDocument, \"mouseup\", up);\n                domUtils.un(doc, \"mouseup\", up);\n            }\n\n            function clearSelection() {\n                if (browser.ie)\n                    doc.selection.clear();\n                else\n                    window.getSelection().removeAllRanges();\n            }\n\n            this.enableScale = function () {\n                //trace:2868\n                if (editor.queryCommandState(\"source\") == 1)    return;\n                scale.style.display = \"\";\n                this.scaleEnabled = true;\n                domUtils.on(scale, \"mousedown\", down);\n            };\n            this.disableScale = function () {\n                scale.style.display = \"none\";\n                this.scaleEnabled = false;\n                domUtils.un(scale, \"mousedown\", down);\n            };\n        },\n        isFullScreen:function () {\n            return this._fullscreen;\n        },\n        postRender:function () {\n            UIBase.prototype.postRender.call(this);\n            for (var i = 0; i < this.toolbars.length; i++) {\n                this.toolbars[i].postRender();\n            }\n            var me = this;\n            var timerId,\n                domUtils = baidu.editor.dom.domUtils,\n                updateFullScreenTime = function () {\n                    clearTimeout(timerId);\n                    timerId = setTimeout(function () {\n                        me._updateFullScreen();\n                    });\n                };\n            domUtils.on(window, 'resize', updateFullScreenTime);\n\n            me.addListener('destroy', function () {\n                domUtils.un(window, 'resize', updateFullScreenTime);\n                clearTimeout(timerId);\n            })\n        },\n        showToolbarMsg:function (msg, flag) {\n            this.getDom('toolbarmsg_label').innerHTML = msg;\n            this.getDom('toolbarmsg').style.display = '';\n            //\n            if (!flag) {\n                var w = this.getDom('upload_dialog');\n                w.style.display = 'none';\n            }\n        },\n        hideToolbarMsg:function () {\n            this.getDom('toolbarmsg').style.display = 'none';\n        },\n        mapUrl:function (url) {\n            return url ? url.replace('~/', this.editor.options.UEDITOR_HOME_URL || '') : ''\n        },\n        triggerLayout:function () {\n            var dom = this.getDom();\n            if (dom.style.zoom == '1') {\n                dom.style.zoom = '100%';\n            } else {\n                dom.style.zoom = '1';\n            }\n        }\n    };\n    utils.inherits(EditorUI, baidu.editor.ui.UIBase);\n\n\n    var instances = {};\n\n\n    UE.ui.Editor = function (options) {\n        var editor = new UE.Editor(options);\n        editor.options.editor = editor;\n        utils.loadFile(document, {\n            href:editor.options.themePath + editor.options.theme + \"/css/ueditor.css\",\n            tag:\"link\",\n            type:\"text/css\",\n            rel:\"stylesheet\"\n        });\n\n        var oldRender = editor.render;\n        editor.render = function (holder) {\n            if (holder.constructor === String) {\n                editor.key = holder;\n                instances[holder] = editor;\n            }\n            utils.domReady(function () {\n                editor.langIsReady ? renderUI() : editor.addListener(\"langReady\", renderUI);\n                function renderUI() {\n                    editor.setOpt({\n                        labelMap:editor.options.labelMap || editor.getLang('labelMap')\n                    });\n                    new EditorUI(editor.options);\n                    if (holder) {\n                        if (holder.constructor === String) {\n                            holder = document.getElementById(holder);\n                        }\n                        holder && holder.getAttribute('name') && ( editor.options.textarea = holder.getAttribute('name'));\n                        if (holder && /script|textarea/ig.test(holder.tagName)) {\n                            var newDiv = document.createElement('div');\n                            holder.parentNode.insertBefore(newDiv, holder);\n                            var cont = holder.value || holder.innerHTML;\n                            editor.options.initialContent = /^[\\t\\r\\n ]*$/.test(cont) ? editor.options.initialContent :\n                                cont.replace(/>[\\n\\r\\t]+([ ]{4})+/g, '>')\n                                    .replace(/[\\n\\r\\t]+([ ]{4})+</g, '<')\n                                    .replace(/>[\\n\\r\\t]+</g, '><');\n                            holder.className && (newDiv.className = holder.className);\n                            holder.style.cssText && (newDiv.style.cssText = holder.style.cssText);\n                            if (/textarea/i.test(holder.tagName)) {\n                                editor.textarea = holder;\n                                editor.textarea.style.display = 'none';\n\n\n                            } else {\n                                holder.parentNode.removeChild(holder);\n\n\n                            }\n                            if(holder.id){\n                                newDiv.id = holder.id;\n                                domUtils.removeAttributes(holder,'id');\n                            }\n                            holder = newDiv;\n                            holder.innerHTML = '';\n                        }\n\n                    }\n                    domUtils.addClass(holder, \"edui-\" + editor.options.theme);\n                    editor.ui.render(holder);\n                    var opt = editor.options;\n                    //给实例添加一个编辑器的容器引用\n                    editor.container = editor.ui.getDom();\n                    var parents = domUtils.findParents(holder,true);\n                    var displays = [];\n                    for(var i = 0 ,ci;ci=parents[i];i++){\n                        displays[i] = ci.style.display;\n                        ci.style.display = 'block'\n                    }\n                    if (opt.initialFrameWidth) {\n                        opt.minFrameWidth = opt.initialFrameWidth;\n                    } else {\n                        opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth;\n                        var styleWidth = holder.style.width;\n                        if(/%$/.test(styleWidth)) {\n                            opt.initialFrameWidth = styleWidth;\n                        }\n                    }\n                    if (opt.initialFrameHeight) {\n                        opt.minFrameHeight = opt.initialFrameHeight;\n                    } else {\n                        opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight;\n                    }\n                    for(var i = 0 ,ci;ci=parents[i];i++){\n                        ci.style.display =  displays[i]\n                    }\n                    //编辑器最外容器设置了高度，会导致，编辑器不占位\n                    //todo 先去掉，没有找到原因\n                    if(holder.style.height){\n                        holder.style.height = ''\n                    }\n                    editor.container.style.width = opt.initialFrameWidth + (/%$/.test(opt.initialFrameWidth) ? '' : 'px');\n                    editor.container.style.zIndex = opt.zIndex;\n                    oldRender.call(editor, editor.ui.getDom('iframeholder'));\n                    editor.fireEvent(\"afteruiready\");\n                }\n            })\n        };\n        return editor;\n    };\n\n\n    /**\n     * @file\n     * @name UE\n     * @short UE\n     * @desc UEditor的顶部命名空间\n     */\n    /**\n     * @name getEditor\n     * @since 1.2.4+\n     * @grammar UE.getEditor(id,[opt])  =>  Editor实例\n     * @desc 提供一个全局的方法得到编辑器实例\n     *\n     * * ''id''  放置编辑器的容器id, 如果容器下的编辑器已经存在，就直接返回\n     * * ''opt'' 编辑器的可选参数\n     * @example\n     *  UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例\n     *      this.setContent('hello')\n     *  }});\n     *  UE.getEditor('containerId'); //返回刚创建的实例\n     *\n     */\n    UE.getEditor = function (id, opt) {\n        var editor = instances[id];\n        if (!editor) {\n            editor = instances[id] = new UE.ui.Editor(opt);\n            editor.render(id);\n        }\n        return editor;\n    };\n\n\n    UE.delEditor = function (id) {\n        var editor;\n        if (editor = instances[id]) {\n            editor.key && editor.destroy();\n            delete instances[id]\n        }\n    };\n\n    UE.registerUI = function(uiName,fn,index,editorId){\n        utils.each(uiName.split(/\\s+/), function (name) {\n            UE._customizeUI[name] = {\n                id : editorId,\n                execFn:fn,\n                index:index\n            };\n        })\n\n    }\n\n})();\n\n// adapter/message.js\nUE.registerUI('message', function(editor) {\n\n    var editorui = baidu.editor.ui;\n    var Message = editorui.Message;\n    var holder;\n    var _messageItems = [];\n    var me = editor;\n\n    me.addListener('ready', function(){\n        holder = document.getElementById(me.ui.id + '_message_holder');\n        updateHolderPos();\n        setTimeout(function(){\n            updateHolderPos();\n        }, 500);\n    });\n\n    me.addListener('showmessage', function(type, opt){\n        opt = utils.isString(opt) ? {\n            'content': opt\n        } : opt;\n        var message = new Message({\n                'timeout': opt.timeout,\n                'type': opt.type,\n                'content': opt.content,\n                'keepshow': opt.keepshow,\n                'editor': me\n            }),\n            mid = opt.id || ('msg_' + (+new Date()).toString(36));\n        message.render(holder);\n        _messageItems[mid] = message;\n        message.reset(opt);\n        updateHolderPos();\n        return mid;\n    });\n\n    me.addListener('updatemessage',function(type, id, opt){\n        opt = utils.isString(opt) ? {\n            'content': opt\n        } : opt;\n        var message = _messageItems[id];\n        message.render(holder);\n        message && message.reset(opt);\n    });\n\n    me.addListener('hidemessage',function(type, id){\n        var message = _messageItems[id];\n        message && message.hide();\n    });\n\n    function updateHolderPos(){\n        var toolbarbox = me.ui.getDom('toolbarbox');\n        if (toolbarbox) {\n            holder.style.top = toolbarbox.offsetHeight + 3 + 'px';\n        }\n        holder.style.zIndex = Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1;\n    }\n\n});\n\n\n// adapter/autosave.js\nUE.registerUI('autosave', function(editor) {\n    var timer = null,uid = null;\n    editor.on('afterautosave',function(){\n        clearTimeout(timer);\n\n        timer = setTimeout(function(){\n            if(uid){\n                editor.trigger('hidemessage',uid);\n            }\n            uid = editor.trigger('showmessage',{\n                content : editor.getLang('autosave.success'),\n                timeout : 2000\n            });\n\n        },2000)\n    })\n\n});\n\n\n\n})();\n"
  },
  {
    "path": "static/common/user/uedit/ueditor.config.js",
    "content": "/**\n * ueditor完整配置项\n * 可以在这里配置整个编辑器的特性\n */\n/**************************提示********************************\n * 所有被注释的配置项均为UEditor默认值。\n * 修改默认配置请首先确保已经完全明确该参数的真实用途。\n * 主要有两种修改方案，一种是取消此处注释，然后修改成对应参数；另一种是在实例化编辑器时传入对应参数。\n * 当升级编辑器时，可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。\n **************************提示********************************/\n\n(function () {\n\n    /**\n     * 编辑器资源文件根路径。它所表示的含义是：以编辑器实例化页面为当前路径，指向编辑器资源文件（即dialog等文件夹）的路径。\n     * 鉴于很多同学在使用编辑器的时候出现的种种路径问题，此处强烈建议大家使用\"相对于网站根目录的相对路径\"进行配置。\n     * \"相对于网站根目录的相对路径\"也就是以斜杠开头的形如\"/myProject/ueditor/\"这样的路径。\n     * 如果站点中有多个不在同一层级的页面需要实例化编辑器，且引用了同一UEditor的时候，此处的URL可能不适用于每个页面的编辑器。\n     * 因此，UEditor提供了针对不同页面的编辑器可单独配置的根路径，具体来说，在需要实例化编辑器的页面最顶部写上如下代码即可。当然，需要令此处的URL等于对应的配置。\n     * window.UEDITOR_HOME_URL = \"/xxxx/xxxx/\";\n     */\n    var URL = window.UEDITOR_HOME_URL || getUEBasePath();\n\n    /**\n     * 配置项主体。注意，此处所有涉及到路径的配置别遗漏URL变量。\n     */\n    window.UEDITOR_CONFIG = {\n\n        //为编辑器实例添加一个路径，这个不能被注释\n        UEDITOR_HOME_URL: URL\n\n        // 服务器统一请求接口路径\n        , serverUrl: \"/uploads/index\"\n\n        //工具栏上的所有的功能按钮和下拉框，可以在new编辑器的实例时选择自己需要的重新定义\n        , toolbars: [[\n            'fullscreen', 'source', '|', 'undo', 'redo', '|',\n            'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',\n            'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',\n            'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',\n            'directionalityltr', 'directionalityrtl', 'indent', '|',\n            'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',\n            'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',\n            'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|',\n            'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|',\n            'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',\n            'print', 'preview', 'searchreplace', 'drafts', 'help'\n        ]]\n        //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置，否则以配置值为准\n        //,labelMap:{\n        //    'anchor':'', 'undo':''\n        //}\n\n        //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换，当然，前提条件是lang文件夹下存在对应的语言文件：\n        //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase()\n        //,lang:\"zh-cn\"\n        //,langPath:URL +\"lang/\"\n\n        //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换，当然，前提条件是themes文件夹下存在对应的主题文件：\n        //现有如下皮肤:default\n        //,theme:'default'\n        //,themePath:URL +\"themes/\"\n\n        //,zIndex : 900     //编辑器层级的基数,默认是900\n\n        //针对getAllHtml方法，会在对应的head标签中增加该编码设置。\n        //,charset:\"utf-8\"\n\n        //若实例化编辑器的页面手动修改的domain，此处需要设置为true\n        //,customDomain:false\n\n        //常用配置项目\n        //,isShow : true    //默认显示编辑器\n\n        //,textarea:'editorValue' // 提交表单时，服务器获取编辑器提交内容的所用的参数，多实例时可以给容器name属性，会将name给定的值最为每个实例的键值，不用每次实例化的时候都设置这个值\n\n        //,initialContent:'欢迎使用ueditor!'    //初始化编辑器的内容,也可以通过textarea/script给值，看官网例子\n\n        //,autoClearinitialContent:true //是否自动清除编辑器初始内容，注意：如果focus属性设置为true,这个也为真，那么编辑器一上来就会触发导致初始化的内容看不到了\n\n        //,focus:false //初始化时，是否让编辑器获得焦点true或false\n\n        //如果自定义，最好给p标签如下的行高，要不输入中文时，会有跳动感\n        //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等\n\n        //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件\n\n        //indentValue\n        //首行缩进距离,默认是2em\n        //,indentValue:'2em'\n\n        //,initialFrameWidth:1000  //初始化编辑器宽度,默认1000\n        //,initialFrameHeight:320  //初始化编辑器高度,默认320\n\n        //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的，默认是false\n\n        //,autoClearEmptyNode : true //getContent时，是否删除空的inlineElement节点（包括嵌套的情况）\n\n        //启用自动保存\n        //,enableAutoSave: true\n        //自动保存间隔时间， 单位ms\n        //,saveInterval: 500\n\n        //,fullscreen : false //是否开启初始化时即全屏，默认关闭\n\n        //,imagePopup:true      //图片操作的浮层开关，默认打开\n\n        //,autoSyncData:true //自动同步编辑器要提交的数据\n        //,emotionLocalization:false //是否开启表情本地化，默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹\n\n        //粘贴只保留标签，去除标签所有属性\n        //,retainOnlyLabelPasted: false\n\n        //,pasteplain:false  //是否默认为纯文本粘贴。false为不使用纯文本粘贴，true为使用纯文本粘贴\n        //纯文本粘贴模式下的过滤规则\n        //'filterTxtRules' : function(){\n        //    function transP(node){\n        //        node.tagName = 'p';\n        //        node.setStyle();\n        //    }\n        //    return {\n        //        //直接删除及其字节点内容\n        //        '-' : 'script style object iframe embed input select',\n        //        'p': {$:{}},\n        //        'br':{$:{}},\n        //        'div':{'$':{}},\n        //        'li':{'$':{}},\n        //        'caption':transP,\n        //        'th':transP,\n        //        'tr':transP,\n        //        'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP,\n        //        'td':function(node){\n        //            //没有内容的td直接删掉\n        //            var txt = !!node.innerText();\n        //            if(txt){\n        //                node.parentNode.insertAfter(UE.uNode.createText(' &nbsp; &nbsp;'),node);\n        //            }\n        //            node.parentNode.removeChild(node,node.innerText())\n        //        }\n        //    }\n        //}()\n\n        //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串\n\n        //insertorderedlist\n        //有序列表的下拉配置,值留空时支持多语言自动识别，若配置值，则以此值为准\n        //,'insertorderedlist':{\n        //      //自定的样式\n        //        'num':'1,2,3...',\n        //        'num1':'1),2),3)...',\n        //        'num2':'(1),(2),(3)...',\n        //        'cn':'一,二,三....',\n        //        'cn1':'一),二),三)....',\n        //        'cn2':'(一),(二),(三)....',\n        //     //系统自带\n        //     'decimal' : '' ,         //'1,2,3...'\n        //     'lower-alpha' : '' ,    // 'a,b,c...'\n        //     'lower-roman' : '' ,    //'i,ii,iii...'\n        //     'upper-alpha' : '' , lang   //'A,B,C'\n        //     'upper-roman' : ''      //'I,II,III...'\n        //}\n\n        //insertunorderedlist\n        //无序列表的下拉配置，值留空时支持多语言自动识别，若配置值，则以此值为准\n        //,insertunorderedlist : { //自定的样式\n        //    'dash' :'— 破折号', //-破折号\n        //    'dot':' 。 小圆圈', //系统自带\n        //    'circle' : '',  // '○ 小圆圈'\n        //    'disc' : '',    // '● 小圆点'\n        //    'square' : ''   //'■ 小方块'\n        //}\n        //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍\n        //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径\n        //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制\n\n        //,autoTransWordToList:false  //禁止word中粘贴进来的列表自动变成列表标签\n\n        //fontfamily\n        //字体设置 label留空支持多语言自动切换，若配置，则以配置值为准\n        //,'fontfamily':[\n        //    { label:'',name:'songti',val:'宋体,SimSun'},\n        //    { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'},\n        //    { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'},\n        //    { label:'',name:'heiti',val:'黑体, SimHei'},\n        //    { label:'',name:'lishu',val:'隶书, SimLi'},\n        //    { label:'',name:'andaleMono',val:'andale mono'},\n        //    { label:'',name:'arial',val:'arial, helvetica,sans-serif'},\n        //    { label:'',name:'arialBlack',val:'arial black,avant garde'},\n        //    { label:'',name:'comicSansMs',val:'comic sans ms'},\n        //    { label:'',name:'impact',val:'impact,chicago'},\n        //    { label:'',name:'timesNewRoman',val:'times new roman'}\n        //]\n\n        //fontsize\n        //字号\n        //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36]\n\n        //paragraph\n        //段落格式 值留空时支持多语言自动识别，若配置，则以配置值为准\n        //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}\n\n        //rowspacingtop\n        //段间距 值和显示的名字相同\n        //,'rowspacingtop':['5', '10', '15', '20', '25']\n\n        //rowspacingBottom\n        //段间距 值和显示的名字相同\n        //,'rowspacingbottom':['5', '10', '15', '20', '25']\n\n        //lineheight\n        //行内间距 值和显示的名字相同\n        //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5']\n\n        //customstyle\n        //自定义样式，不支持国际化，此处配置值即可最后显示值\n        //block的元素是依据设置段落的逻辑设置的，inline的元素依据BIU的逻辑设置\n        //尽量使用一些常用的标签\n        //参数说明\n        //tag 使用的标签名字\n        //label 显示的名字也是用来标识不同类型的标识符，注意这个值每个要不同，\n        //style 添加的样式\n        //每一个对象就是一个自定义的样式\n        //,'customstyle':[\n        //    {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'},\n        //    {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'},\n        //    {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'},\n        //    {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'}\n        //]\n\n        //打开右键菜单功能\n        //,enableContextMenu: true\n        //右键菜单的内容，可以参考plugins/contextmenu.js里边的默认菜单的例子，label留空支持国际化，否则以此配置为准\n        //,contextMenu:[\n        //    {\n        //        label:'',       //显示的名称\n        //        cmdName:'selectall',//执行的command命令，当点击这个右键菜单时\n        //        //exec可选，有了exec就会在点击时执行这个function，优先级高于cmdName\n        //        exec:function () {\n        //            //this是当前编辑器的实例\n        //            //this.ui._dialogs['inserttableDialog'].open();\n        //        }\n        //    }\n        //]\n\n        //快捷菜单\n        //,shortcutMenu:[\"fontfamily\", \"fontsize\", \"bold\", \"italic\", \"underline\", \"forecolor\", \"backcolor\", \"insertorderedlist\", \"insertunorderedlist\"]\n\n        //elementPathEnabled\n        //是否启用元素路径，默认是显示\n        //,elementPathEnabled : true\n\n        //wordCount\n        //,wordCount:true          //是否开启字数统计\n        //,maximumWords:10000       //允许的最大字符数\n        //字数统计提示，{#count}代表当前字数，{#leave}代表还可以输入多少字符数,留空支持多语言自动切换，否则按此配置显示\n        //,wordCountMsg:''   //当前已输入 {#count} 个字符，您还可以输入{#leave} 个字符\n        //超出字数限制提示  留空支持多语言自动切换，否则按此配置显示\n        //,wordOverFlowMsg:''    //<span style=\"color:red;\">你输入的字符个数已经超出最大允许值，服务器可能会拒绝保存！</span>\n\n        //tab\n        //点击tab键时移动的距离,tabSize倍数，tabNode什么字符做为单位\n        //,tabSize:4\n        //,tabNode:'&nbsp;'\n\n        //removeFormat\n        //清除格式时可以删除的标签和属性\n        //removeForamtTags标签\n        //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var'\n        //removeFormatAttributes属性\n        //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign'\n\n        //undo\n        //可以最多回退的次数,默认20\n        //,maxUndoCount:20\n        //当输入的字符数超过该值时，保存一次现场\n        //,maxInputCount:1\n\n        //autoHeightEnabled\n        // 是否自动长高,默认true\n        //,autoHeightEnabled:true\n\n        //scaleEnabled\n        //是否可以拉伸长高,默认true(当开启时，自动长高失效)\n        //,scaleEnabled:false\n        //,minFrameWidth:800    //编辑器拖动时最小宽度,默认800\n        //,minFrameHeight:220  //编辑器拖动时最小高度,默认220\n\n        //autoFloatEnabled\n        //是否保持toolbar的位置不动,默认true\n        //,autoFloatEnabled:true\n        //浮动时工具栏距离浏览器顶部的高度，用于某些具有固定头部的页面\n        //,topOffset:30\n        //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度，则设置无效)\n        //,toolbarTopOffset:400\n\n        //设置远程图片是否抓取到本地保存\n        //,catchRemoteImageEnable: true //设置是否抓取远程图片\n\n        //pageBreakTag\n        //分页标识符,默认是_ueditor_page_break_tag_\n        //,pageBreakTag:'_ueditor_page_break_tag_'\n\n        //autotypeset\n        //自动排版参数\n        //,autotypeset: {\n        //    mergeEmptyline: true,           //合并空行\n        //    removeClass: true,              //去掉冗余的class\n        //    removeEmptyline: false,         //去掉空行\n        //    textAlign:\"left\",               //段落的排版方式，可以是 left,right,center,justify 去掉这个属性表示不执行排版\n        //    imageBlockLine: 'center',       //图片的浮动方式，独占一行剧中,左右浮动，默认: center,left,right,none 去掉这个属性表示不执行排版\n        //    pasteFilter: false,             //根据规则过滤没事粘贴进来的内容\n        //    clearFontSize: false,           //去掉所有的内嵌字号，使用编辑器默认的字号\n        //    clearFontFamily: false,         //去掉所有的内嵌字体，使用编辑器默认的字体\n        //    removeEmptyNode: false,         // 去掉空节点\n        //    //可以去掉的标签\n        //    removeTagNames: {标签名字:1},\n        //    indent: false,                  // 行首缩进\n        //    indentValue : '2em',            //行首缩进的大小\n        //    bdc2sb: false,\n        //    tobdc: false\n        //}\n\n        //tableDragable\n        //表格是否可以拖拽\n        //,tableDragable: true\n\n\n\n        //sourceEditor\n        //源码的查看方式,codemirror 是代码高亮，textarea是文本框,默认是codemirror\n        //注意默认codemirror只能在ie8+和非ie中使用\n        //,sourceEditor:\"codemirror\"\n        //如果sourceEditor是codemirror，还用配置一下两个参数\n        //codeMirrorJsUrl js加载的路径，默认是 URL + \"third-party/codemirror/codemirror.js\"\n        //,codeMirrorJsUrl:URL + \"third-party/codemirror/codemirror.js\"\n        //codeMirrorCssUrl css加载的路径，默认是 URL + \"third-party/codemirror/codemirror.css\"\n        //,codeMirrorCssUrl:URL + \"third-party/codemirror/codemirror.css\"\n        //编辑器初始化完成后是否进入源码模式，默认为否。\n        //,sourceEditorFirst:false\n\n        //iframeUrlMap\n        //dialog内容的路径 ～会被替换成URL,垓属性一旦打开，将覆盖所有的dialog的默认路径\n        //,iframeUrlMap:{\n        //    'anchor':'~/dialogs/anchor/anchor.html',\n        //}\n\n        //allowLinkProtocol 允许的链接地址，有这些前缀的链接地址不会自动添加http\n        //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:']\n\n        //webAppKey 百度应用的APIkey，每个站长必须首先去百度官网注册一个key后方能正常使用app功能，注册介绍，http://app.baidu.com/static/cms/getapikey.html\n        //, webAppKey: \"\"\n\n        //默认过滤规则相关配置项目\n        //,disabledTableInTable:true  //禁止表格嵌套\n        ,allowDivTransToP:false      //允许进入编辑器的div标签自动变成p标签\n        //,rgb2Hex:true               //默认产出的数据中的color自动从rgb格式变成16进制格式\n\n\t\t// xss 过滤是否开启,inserthtml等操作\n\t\t,xssFilterRules: true\n\t\t//input xss过滤\n\t\t,inputXssFilter: true\n\t\t//output xss过滤\n\t\t,outputXssFilter: true\n\t\t// xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js\n\t\t,whitList: {\n\t\t\ta:      ['target', 'href', 'title', 'class', 'style'],\n\t\t\tabbr:   ['title', 'class', 'style'],\n\t\t\taddress: ['class', 'style'],\n\t\t\tarea:   ['shape', 'coords', 'href', 'alt'],\n\t\t\tarticle: [],\n\t\t\taside:  [],\n\t\t\taudio:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'],\n\t\t\tb:      ['class', 'style'],\n\t\t\tbdi:    ['dir'],\n\t\t\tbdo:    ['dir'],\n\t\t\tbig:    [],\n\t\t\tblockquote: ['cite', 'class', 'style'],\n\t\t\tbr:     [],\n\t\t\tcaption: ['class', 'style'],\n\t\t\tcenter: [],\n\t\t\tcite:   [],\n\t\t\tcode:   ['class', 'style'],\n\t\t\tcol:    ['align', 'valign', 'span', 'width', 'class', 'style'],\n\t\t\tcolgroup: ['align', 'valign', 'span', 'width', 'class', 'style'],\n\t\t\tdd:     ['class', 'style'],\n\t\t\tdel:    ['datetime'],\n\t\t\tdetails: ['open'],\n\t\t\tdiv:    ['class', 'style'],\n\t\t\tdl:     ['class', 'style'],\n\t\t\tdt:     ['class', 'style'],\n\t\t\tem:     ['class', 'style'],\n\t\t\tfont:   ['color', 'size', 'face'],\n\t\t\tfooter: [],\n\t\t\th1:     ['class', 'style'],\n\t\t\th2:     ['class', 'style'],\n\t\t\th3:     ['class', 'style'],\n\t\t\th4:     ['class', 'style'],\n\t\t\th5:     ['class', 'style'],\n\t\t\th6:     ['class', 'style'],\n\t\t\theader: [],\n\t\t\thr:     [],\n\t\t\ti:      ['class', 'style'],\n\t\t\timg:    ['src', 'alt', 'title', 'width', 'height', 'id', '_url', '_src', 'loadingclass', 'class', 'data-latex'],\n\t\t\tins:    ['datetime'],\n\t\t\tli:     ['class', 'style'],\n\t\t\tmark:   [],\n\t\t\tnav:    [],\n\t\t\tol:     ['class', 'style'],\n\t\t\tp:      ['class', 'style'],\n\t\t\tpre:    ['class', 'style'],\n\t\t\ts:      [],\n\t\t\tsection:[],\n\t\t\tsmall:  [],\n\t\t\tspan:   ['class', 'style'],\n\t\t\tsub:    ['class', 'style'],\n\t\t\tsup:    ['class', 'style'],\n\t\t\tstrong: ['class', 'style'],\n\t\t\ttable:  ['width', 'border', 'align', 'valign', 'class', 'style'],\n\t\t\ttbody:  ['align', 'valign', 'class', 'style'],\n\t\t\ttd:     ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'],\n\t\t\ttfoot:  ['align', 'valign', 'class', 'style'],\n\t\t\tth:     ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'],\n\t\t\tthead:  ['align', 'valign', 'class', 'style'],\n\t\t\ttr:     ['rowspan', 'align', 'valign', 'class', 'style'],\n\t\t\ttt:     [],\n\t\t\tu:      [],\n\t\t\tul:     ['class', 'style'],\n\t\t\tvideo:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style'],\n\t\t\tsource: ['src', 'type'],\n\t\t\tembed: ['type', 'class', 'pluginspage', 'src', 'width', 'height', 'align', 'style', 'wmode', 'play',  'autoplay','loop', 'menu', 'allowscriptaccess', 'allowfullscreen', 'controls', 'preload'],\n\t\t\tiframe: ['src', 'class', 'height', 'width', 'max-width', 'max-height', 'align', 'frameborder', 'allowfullscreen']\n\t\t}\n    };\n\n    function getUEBasePath(docUrl, confUrl) {\n\n        return getBasePath(docUrl || self.document.URL || self.location.href, confUrl || getConfigFilePath());\n\n    }\n\n    function getConfigFilePath() {\n\n        var configPath = document.getElementsByTagName('script');\n\n        return configPath[ configPath.length - 1 ].src;\n\n    }\n\n    function getBasePath(docUrl, confUrl) {\n\n        var basePath = confUrl;\n\n\n        if (/^(\\/|\\\\\\\\)/.test(confUrl)) {\n\n            basePath = /^.+?\\w(\\/|\\\\\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\\/|\\\\\\\\)/, '');\n\n        } else if (!/^[a-z]+:/i.test(confUrl)) {\n\n            docUrl = docUrl.split(\"#\")[0].split(\"?\")[0].replace(/[^\\\\\\/]+$/, '');\n\n            basePath = docUrl + \"\" + confUrl;\n\n        }\n\n        return optimizationPath(basePath);\n\n    }\n\n    function optimizationPath(path) {\n\n        var protocol = /^[a-z]+:\\/\\//.exec(path)[ 0 ],\n            tmp = null,\n            res = [];\n\n        path = path.replace(protocol, \"\").split(\"?\")[0].split(\"#\")[0];\n\n        path = path.replace(/\\\\/g, '/').split(/\\//);\n\n        path[ path.length - 1 ] = \"\";\n\n        while (path.length) {\n\n            if (( tmp = path.shift() ) === \"..\") {\n                res.pop();\n            } else if (tmp !== \".\") {\n                res.push(tmp);\n            }\n\n        }\n\n        return protocol + res.join(\"/\");\n\n    }\n\n    window.UE = {\n        getUEBasePath: getUEBasePath\n    };\n\n})();\n"
  },
  {
    "path": "static/common/user/uedit/ueditor.parse.js",
    "content": "/*!\n * UEditor\n * version: ueditor\n * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST)\n */\n\n(function(){\n\n(function(){\n    UE = window.UE || {};\n    var isIE = !!window.ActiveXObject;\n    //定义utils工具\n    var utils = {\n            removeLastbs : function(url){\n                return url.replace(/\\/$/,'')\n            },\n            extend : function(t,s){\n                var a = arguments,\n                    notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false,\n                    len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length;\n                for (var i = 1; i < len; i++) {\n                    var x = a[i];\n                    for (var k in x) {\n                        if (!notCover || !t.hasOwnProperty(k)) {\n                            t[k] = x[k];\n                        }\n                    }\n                }\n                return t;\n            },\n            isIE : isIE,\n            cssRule : isIE ? function(key,style,doc){\n                var indexList,index;\n                doc = doc || document;\n                if(doc.indexList){\n                    indexList = doc.indexList;\n                }else{\n                    indexList = doc.indexList =  {};\n                }\n                var sheetStyle;\n                if(!indexList[key]){\n                    if(style === undefined){\n                        return ''\n                    }\n                    sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length);\n                    indexList[key] = index;\n                }else{\n                    sheetStyle = doc.styleSheets[indexList[key]];\n                }\n                if(style === undefined){\n                    return sheetStyle.cssText\n                }\n                sheetStyle.cssText = sheetStyle.cssText + '\\n' + (style || '')\n            } : function(key,style,doc){\n                doc = doc || document;\n                var head = doc.getElementsByTagName('head')[0],node;\n                if(!(node = doc.getElementById(key))){\n                    if(style === undefined){\n                        return ''\n                    }\n                    node = doc.createElement('style');\n                    node.id = key;\n                    head.appendChild(node)\n                }\n                if(style === undefined){\n                    return node.innerHTML\n                }\n                if(style !== ''){\n                    node.innerHTML = node.innerHTML + '\\n' + style;\n                }else{\n                    head.removeChild(node)\n                }\n            },\n            domReady : function (onready) {\n                var doc = window.document;\n                if (doc.readyState === \"complete\") {\n                    onready();\n                }else{\n                    if (isIE) {\n                        (function () {\n                            if (doc.isReady) return;\n                            try {\n                                doc.documentElement.doScroll(\"left\");\n                            } catch (error) {\n                                setTimeout(arguments.callee, 0);\n                                return;\n                            }\n                            onready();\n                        })();\n                        window.attachEvent('onload', function(){\n                            onready()\n                        });\n                    } else {\n                        doc.addEventListener(\"DOMContentLoaded\", function () {\n                            doc.removeEventListener(\"DOMContentLoaded\", arguments.callee, false);\n                            onready();\n                        }, false);\n                        window.addEventListener('load', function(){onready()}, false);\n                    }\n                }\n\n            },\n            each : function(obj, iterator, context) {\n                if (obj == null) return;\n                if (obj.length === +obj.length) {\n                    for (var i = 0, l = obj.length; i < l; i++) {\n                        if(iterator.call(context, obj[i], i, obj) === false)\n                            return false;\n                    }\n                } else {\n                    for (var key in obj) {\n                        if (obj.hasOwnProperty(key)) {\n                            if(iterator.call(context, obj[key], key, obj) === false)\n                                return false;\n                        }\n                    }\n                }\n            },\n            inArray : function(arr,item){\n                var index = -1;\n                this.each(arr,function(v,i){\n                    if(v === item){\n                        index = i;\n                        return false;\n                    }\n                });\n                return index;\n            },\n            pushItem : function(arr,item){\n                if(this.inArray(arr,item)==-1){\n                    arr.push(item)\n                }\n            },\n            trim: function (str) {\n                return str.replace(/(^[ \\t\\n\\r]+)|([ \\t\\n\\r]+$)/g, '');\n            },\n            indexOf: function (array, item, start) {\n                var index = -1;\n                start = this.isNumber(start) ? start : 0;\n                this.each(array, function (v, i) {\n                    if (i >= start && v === item) {\n                        index = i;\n                        return false;\n                    }\n                });\n                return index;\n            },\n            hasClass: function (element, className) {\n                className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' ');\n                for (var i = 0, ci, cls = element.className; ci = className[i++];) {\n                    if (!new RegExp('\\\\b' + ci + '\\\\b', 'i').test(cls)) {\n                        return false;\n                    }\n                }\n                return i - 1 == className.length;\n            },\n            addClass:function (elm, classNames) {\n                if(!elm)return;\n                classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' ');\n                for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){\n                    if(!new RegExp('\\\\b' + ci + '\\\\b').test(cls)){\n                        cls += ' ' + ci;\n                    }\n                }\n                elm.className = utils.trim(cls);\n            },\n            removeClass:function (elm, classNames) {\n                classNames = this.isArray(classNames) ? classNames :\n                    this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' ');\n                for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){\n                    cls = cls.replace(new RegExp('\\\\b' + ci + '\\\\b'),'')\n                }\n                cls = this.trim(cls).replace(/[ ]{2,}/g,' ');\n                elm.className = cls;\n                !cls && elm.removeAttribute('className');\n            },\n            on: function (element, type, handler) {\n                var types = this.isArray(type) ? type : type.split(/\\s+/),\n                    k = types.length;\n                if (k) while (k--) {\n                    type = types[k];\n                    if (element.addEventListener) {\n                        element.addEventListener(type, handler, false);\n                    } else {\n                        if (!handler._d) {\n                            handler._d = {\n                                els : []\n                            };\n                        }\n                        var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element);\n                        if (!handler._d[key] || index == -1) {\n                            if(index == -1){\n                                handler._d.els.push(element);\n                            }\n                            if(!handler._d[key]){\n                                handler._d[key] = function (evt) {\n                                    return handler.call(evt.srcElement, evt || window.event);\n                                };\n                            }\n\n\n                            element.attachEvent('on' + type, handler._d[key]);\n                        }\n                    }\n                }\n                element = null;\n            },\n            off: function (element, type, handler) {\n                var types = this.isArray(type) ? type : type.split(/\\s+/),\n                    k = types.length;\n                if (k) while (k--) {\n                    type = types[k];\n                    if (element.removeEventListener) {\n                        element.removeEventListener(type, handler, false);\n                    } else {\n                        var key = type + handler.toString();\n                        try{\n                            element.detachEvent('on' + type, handler._d ? handler._d[key] : handler);\n                        }catch(e){}\n                        if (handler._d && handler._d[key]) {\n                            var index = utils.indexOf(handler._d.els,element);\n                            if(index!=-1){\n                                handler._d.els.splice(index,1);\n                            }\n                            handler._d.els.length == 0 && delete handler._d[key];\n                        }\n                    }\n                }\n            },\n            loadFile : function () {\n                var tmpList = [];\n                function getItem(doc,obj){\n                    try{\n                        for(var i= 0,ci;ci=tmpList[i++];){\n                            if(ci.doc === doc && ci.url == (obj.src || obj.href)){\n                                return ci;\n                            }\n                        }\n                    }catch(e){\n                        return null;\n                    }\n\n                }\n                return function (doc, obj, fn) {\n                    var item = getItem(doc,obj);\n                    if (item) {\n                        if(item.ready){\n                            fn && fn();\n                        }else{\n                            item.funs.push(fn)\n                        }\n                        return;\n                    }\n                    tmpList.push({\n                        doc:doc,\n                        url:obj.src||obj.href,\n                        funs:[fn]\n                    });\n                    if (!doc.body) {\n                        var html = [];\n                        for(var p in obj){\n                            if(p == 'tag')continue;\n                            html.push(p + '=\"' + obj[p] + '\"')\n                        }\n                        doc.write('<' + obj.tag + ' ' + html.join(' ') + ' ></'+obj.tag+'>');\n                        return;\n                    }\n                    if (obj.id && doc.getElementById(obj.id)) {\n                        return;\n                    }\n                    var element = doc.createElement(obj.tag);\n                    delete obj.tag;\n                    for (var p in obj) {\n                        element.setAttribute(p, obj[p]);\n                    }\n                    element.onload = element.onreadystatechange = function () {\n                        if (!this.readyState || /loaded|complete/.test(this.readyState)) {\n                            item = getItem(doc,obj);\n                            if (item.funs.length > 0) {\n                                item.ready = 1;\n                                for (var fi; fi = item.funs.pop();) {\n                                    fi();\n                                }\n                            }\n                            element.onload = element.onreadystatechange = null;\n                        }\n                    };\n                    element.onerror = function(){\n                        throw Error('The load '+(obj.href||obj.src)+' fails,check the url')\n                    };\n                    doc.getElementsByTagName(\"head\")[0].appendChild(element);\n                }\n            }()\n    };\n    utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object','Boolean'], function (v) {\n        utils['is' + v] = function (obj) {\n            return Object.prototype.toString.apply(obj) == '[object ' + v + ']';\n        }\n    });\n    var parselist = {};\n    UE.parse = {\n        register : function(parseName,fn){\n            parselist[parseName] = fn;\n        },\n        load : function(opt){\n            utils.each(parselist,function(v){\n                v.call(opt,utils);\n            })\n        }\n    };\n    uParse = function(selector,opt){\n        utils.domReady(function(){\n            var contents;\n            if(document.querySelectorAll){\n                contents = document.querySelectorAll(selector)\n            }else{\n                if(/^#/.test(selector)){\n                    contents = [document.getElementById(selector.replace(/^#/,''))]\n                }else if(/^\\./.test(selector)){\n                    var contents = [];\n                    utils.each(document.getElementsByTagName('*'),function(node){\n                        if(node.className && new RegExp('\\\\b' + selector.replace(/^\\./,'') + '\\\\b','i').test(node.className)){\n                            contents.push(node)\n                        }\n                    })\n                }else{\n                    contents = document.getElementsByTagName(selector)\n                }\n            }\n            utils.each(contents,function(v){\n                UE.parse.load(utils.extend({root:v,selector:selector},opt))\n            })\n        })\n    }\n})();\n\nUE.parse.register('insertcode',function(utils){\n    var pres = this.root.getElementsByTagName('pre');\n    if(pres.length){\n        if(typeof XRegExp == \"undefined\"){\n            var jsurl,cssurl;\n            if(this.rootPath !== undefined){\n                jsurl = utils.removeLastbs(this.rootPath)  + '/third-party/SyntaxHighlighter/shCore.js';\n                cssurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCoreDefault.css';\n            }else{\n                jsurl = this.highlightJsUrl;\n                cssurl = this.highlightCssUrl;\n            }\n            utils.loadFile(document,{\n                id : \"syntaxhighlighter_css\",\n                tag : \"link\",\n                rel : \"stylesheet\",\n                type : \"text/css\",\n                href : cssurl\n            });\n            utils.loadFile(document,{\n                id : \"syntaxhighlighter_js\",\n                src : jsurl,\n                tag : \"script\",\n                type : \"text/javascript\",\n                defer : \"defer\"\n            },function(){\n                utils.each(pres,function(pi){\n                    if(pi && /brush/i.test(pi.className)){\n                        SyntaxHighlighter.highlight(pi);\n                    }\n                });\n            });\n        }else{\n            utils.each(pres,function(pi){\n                if(pi && /brush/i.test(pi.className)){\n                    SyntaxHighlighter.highlight(pi);\n                }\n            });\n        }\n    }\n\n});\nUE.parse.register('table', function (utils) {\n    var me = this,\n        root = this.root,\n        tables = root.getElementsByTagName('table');\n    if (tables.length) {\n        var selector = this.selector;\n        //追加默认的表格样式\n        utils.cssRule('table',\n            selector + ' table.noBorderTable td,' +\n                selector + ' table.noBorderTable th,' +\n                selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' +\n                selector + ' table.sortEnabled tr.firstRow th,' + selector + ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;' +\n                    'background-position: center right; background-image:url(' + this.rootPath + 'themes/default/images/sortable.png);}' +\n                selector + ' table.sortEnabled tr.firstRow th:hover,' + selector + ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}' +\n                selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' +\n                selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' +\n                selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' +\n                selector + ' th{border-top:1px solid #BBB;background:#F7F7F7;}' +\n                selector + ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}' +\n                selector + ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }' +\n                selector + ' tr.ue-table-interlace-color-double td{ background: #f7faff; }' +\n                selector + ' td p{margin:0;padding:0;}',\n            document);\n        //填充空的单元格\n\n        utils.each('td th caption'.split(' '), function (tag) {\n            var cells = root.getElementsByTagName(tag);\n            cells.length && utils.each(cells, function (node) {\n                if (!node.firstChild) {\n                    node.innerHTML = '&nbsp;';\n\n                }\n            })\n        });\n\n        //表格可排序\n        var tables = root.getElementsByTagName('table');\n        utils.each(tables, function (table) {\n            if (/\\bsortEnabled\\b/.test(table.className)) {\n                utils.on(table, 'click', function(e){\n                    var target = e.target || e.srcElement,\n                        cell = findParentByTagName(target, ['td', 'th']);\n                    var table = findParentByTagName(target, 'table'),\n                        colIndex = utils.indexOf(table.rows[0].cells, cell),\n                        sortType = table.getAttribute('data-sort-type');\n                    if(colIndex != -1) {\n                        sortTable(table, colIndex, me.tableSortCompareFn || sortType);\n                        updateTable(table);\n                    }\n                });\n            }\n        });\n\n        //按照标签名查找父节点\n        function findParentByTagName(target, tagNames) {\n            var i, current = target;\n            tagNames = utils.isArray(tagNames) ? tagNames:[tagNames];\n            while(current){\n                for(i = 0;i < tagNames.length; i++) {\n                    if(current.tagName == tagNames[i].toUpperCase()) return current;\n                }\n                current = current.parentNode;\n            }\n            return null;\n        }\n        //表格排序\n        function sortTable(table, sortByCellIndex, compareFn) {\n            var rows = table.rows,\n                trArray = [],\n                flag = rows[0].cells[0].tagName === \"TH\",\n                lastRowIndex = 0;\n\n            for (var i = 0,len = rows.length; i < len; i++) {\n                trArray[i] = rows[i];\n            }\n\n            var Fn = {\n                'reversecurrent': function(td1,td2){\n                    return 1;\n                },\n                'orderbyasc': function(td1,td2){\n                    var value1 = td1.innerText||td1.textContent,\n                        value2 = td2.innerText||td2.textContent;\n                    return value1.localeCompare(value2);\n                },\n                'reversebyasc': function(td1,td2){\n                    var value1 = td1.innerHTML,\n                        value2 = td2.innerHTML;\n                    return value2.localeCompare(value1);\n                },\n                'orderbynum': function(td1,td2){\n                    var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\\d+/),\n                        value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\\d+/);\n                    if(value1) value1 = +value1[0];\n                    if(value2) value2 = +value2[0];\n                    return (value1||0) - (value2||0);\n                },\n                'reversebynum': function(td1,td2){\n                    var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\\d+/),\n                        value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\\d+/);\n                    if(value1) value1 = +value1[0];\n                    if(value2) value2 = +value2[0];\n                    return (value2||0) - (value1||0);\n                }\n            };\n\n            //对表格设置排序的标记data-sort-type\n            table.setAttribute('data-sort-type', compareFn && typeof compareFn === \"string\" && Fn[compareFn] ? compareFn:'');\n\n            //th不参与排序\n            flag && trArray.splice(0, 1);\n            trArray = sort(trArray,function (tr1, tr2) {\n                var result;\n                if (compareFn && typeof compareFn === \"function\") {\n                    result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);\n                } else if (compareFn && typeof compareFn === \"number\") {\n                    result = 1;\n                } else if (compareFn && typeof compareFn === \"string\" && Fn[compareFn]) {\n                    result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);\n                } else {\n                    result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]);\n                }\n                return result;\n            });\n            var fragment = table.ownerDocument.createDocumentFragment();\n            for (var j = 0, len = trArray.length; j < len; j++) {\n                fragment.appendChild(trArray[j]);\n            }\n            var tbody = table.getElementsByTagName(\"tbody\")[0];\n            if(!lastRowIndex){\n                tbody.appendChild(fragment);\n            }else{\n                tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1])\n            }\n        }\n        //冒泡排序\n        function sort(array, compareFn){\n            compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);};\n            for(var i= 0,len = array.length; i<len; i++){\n                for(var j = i,length = array.length; j<length; j++){\n                    if(compareFn(array[i], array[j]) > 0){\n                        var t = array[i];\n                        array[i] = array[j];\n                        array[j] = t;\n                    }\n                }\n            }\n            return array;\n        }\n        //更新表格\n        function updateTable(table) {\n            //给第一行设置firstRow的样式名称,在排序图标的样式上使用到\n            if(!utils.hasClass(table.rows[0], \"firstRow\")) {\n                for(var i = 1; i< table.rows.length; i++) {\n                    utils.removeClass(table.rows[i], \"firstRow\");\n                }\n                utils.addClass(table.rows[0], \"firstRow\");\n            }\n        }\n    }\n});\nUE.parse.register('charts',function( utils ){\n\n    utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}');\n    var resourceRoot = this.rootPath,\n        containers = this.root,\n        sources = null;\n\n    //不存在指定的根路径， 则直接退出\n    if ( !resourceRoot ) {\n        return;\n    }\n\n    if ( sources = parseSources() ) {\n\n        loadResources();\n\n    }\n\n\n    function parseSources () {\n\n        if ( !containers ) {\n            return null;\n        }\n\n        return extractChartData( containers );\n\n    }\n\n    /**\n     * 提取数据\n     */\n    function extractChartData ( rootNode ) {\n\n        var data = [],\n            tables = rootNode.getElementsByTagName( \"table\" );\n\n        for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) {\n\n            if ( tableNode.getAttribute( \"data-chart\" ) !== null ) {\n\n                data.push( formatData( tableNode ) );\n\n            }\n\n        }\n\n        return data.length ? data : null;\n\n    }\n\n    function formatData ( tableNode ) {\n\n        var meta = tableNode.getAttribute( \"data-chart\" ),\n            metaConfig = {},\n            data = [];\n\n        //提取table数据\n        for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) {\n\n            var rowData = [];\n\n            for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {\n\n                var value = ( cell.innerText || cell.textContent || '' );\n                rowData.push( cell.tagName == 'TH' ? value:(value | 0) );\n\n            }\n\n            data.push( rowData );\n\n        }\n\n        //解析元信息\n        meta = meta.split( \";\" );\n        for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) {\n\n            metaData = metaData.split( \":\" );\n            metaConfig[ metaData[ 0 ] ] = metaData[ 1 ];\n\n        }\n\n\n        return {\n            table: tableNode,\n            meta: metaConfig,\n            data: data\n        };\n\n    }\n\n    //加载资源\n    function loadResources () {\n\n        loadJQuery();\n\n    }\n\n    function loadJQuery () {\n\n        //不存在jquery， 则加载jquery\n        if ( !window.jQuery ) {\n\n            utils.loadFile(document,{\n                src : resourceRoot + \"/third-party/jquery-1.10.2.min.js\",\n                tag : \"script\",\n                type : \"text/javascript\",\n                defer : \"defer\"\n            },function(){\n\n                loadHighcharts();\n\n            });\n\n        } else {\n\n            loadHighcharts();\n\n        }\n\n    }\n\n    function loadHighcharts () {\n\n        //不存在Highcharts， 则加载Highcharts\n        if ( !window.Highcharts ) {\n\n            utils.loadFile(document,{\n                src : resourceRoot + \"/third-party/highcharts/highcharts.js\",\n                tag : \"script\",\n                type : \"text/javascript\",\n                defer : \"defer\"\n            },function(){\n\n                loadTypeConfig();\n\n            });\n\n        } else {\n\n            loadTypeConfig();\n\n        }\n\n    }\n\n    //加载图表差异化配置文件\n    function loadTypeConfig () {\n\n        utils.loadFile(document,{\n            src : resourceRoot + \"/dialogs/charts/chart.config.js\",\n            tag : \"script\",\n            type : \"text/javascript\",\n            defer : \"defer\"\n        },function(){\n\n            render();\n\n        });\n\n    }\n\n    //渲染图表\n    function render () {\n\n        var config = null,\n            chartConfig = null,\n            container = null;\n\n        for ( var i = 0, len = sources.length; i < len; i++ ) {\n\n            config = sources[ i ];\n\n            chartConfig = analysisConfig( config );\n\n            container = createContainer( config.table );\n\n            renderChart( container, typeConfig[ config.meta.chartType ], chartConfig );\n\n        }\n\n\n    }\n\n    /**\n     * 渲染图表\n     * @param container 图表容器节点对象\n     * @param typeConfig 图表类型配置\n     * @param config 图表通用配置\n     * */\n    function renderChart ( container, typeConfig, config ) {\n\n\n        $( container ).highcharts( $.extend( {}, typeConfig, {\n\n            credits: {\n                enabled: false\n            },\n            exporting: {\n                enabled: false\n            },\n            title: {\n                text: config.title,\n                x: -20 //center\n            },\n            subtitle: {\n                text: config.subTitle,\n                x: -20\n            },\n            xAxis: {\n                title: {\n                    text: config.xTitle\n                },\n                categories: config.categories\n            },\n            yAxis: {\n                title: {\n                    text: config.yTitle\n                },\n                plotLines: [{\n                    value: 0,\n                    width: 1,\n                    color: '#808080'\n                }]\n            },\n            tooltip: {\n                enabled: true,\n                valueSuffix: config.suffix\n            },\n            legend: {\n                layout: 'vertical',\n                align: 'right',\n                verticalAlign: 'middle',\n                borderWidth: 1\n            },\n            series: config.series\n\n        } ));\n\n    }\n\n    /**\n     * 创建图表的容器\n     * 新创建的容器会替换掉对应的table对象\n     * */\n    function createContainer ( tableNode ) {\n\n        var container = document.createElement( \"div\" );\n        container.className = \"edui-chart-container\";\n\n        tableNode.parentNode.replaceChild( container, tableNode );\n\n        return container;\n\n    }\n\n    //根据config解析出正确的类别和图表数据信息\n    function analysisConfig ( config ) {\n\n        var series = [],\n        //数据类别\n            categories = [],\n            result = [],\n            data = config.data,\n            meta = config.meta;\n\n        //数据对齐方式为相反的方式， 需要反转数据\n        if ( meta.dataFormat != \"1\" ) {\n\n            for ( var i = 0, len = data.length; i < len ; i++ ) {\n\n                for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) {\n\n                    if ( !result[ j ] ) {\n                        result[ j ] = [];\n                    }\n\n                    result[ j ][ i ] = data[ i ][ j ];\n\n                }\n\n            }\n\n            data = result;\n\n        }\n\n        result = {};\n\n        //普通图表\n        if ( meta.chartType != typeConfig.length - 1 ) {\n\n            categories = data[ 0 ].slice( 1 );\n\n            for ( var i = 1, curData; curData = data[ i ]; i++ ) {\n                series.push( {\n                    name: curData[ 0 ],\n                    data: curData.slice( 1 )\n                } );\n            }\n\n            result.series = series;\n            result.categories = categories;\n            result.title = meta.title;\n            result.subTitle = meta.subTitle;\n            result.xTitle = meta.xTitle;\n            result.yTitle = meta.yTitle;\n            result.suffix = meta.suffix;\n\n        } else {\n\n            var curData = [];\n\n            for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) {\n\n                curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] );\n\n            }\n\n            //饼图\n            series[ 0 ] = {\n                type: 'pie',\n                name: meta.tip,\n                data: curData\n            };\n\n            result.series = series;\n            result.title = meta.title;\n            result.suffix = meta.suffix;\n\n        }\n\n        return result;\n\n    }\n\n});\nUE.parse.register('background', function (utils) {\n    var me = this,\n        root = me.root,\n        p = root.getElementsByTagName('p'),\n        styles;\n\n    for (var i = 0,ci; ci = p[i++];) {\n        styles = ci.getAttribute('data-background');\n        if (styles){\n            ci.parentNode.removeChild(ci);\n        }\n    }\n\n    //追加默认的表格样式\n    styles && utils.cssRule('ueditor_background', me.selector + '{' + styles + '}', document);\n});\nUE.parse.register('list',function(utils){\n    var customCss = [],\n        customStyle = {\n            'cn'    :   'cn-1-',\n            'cn1'   :   'cn-2-',\n            'cn2'   :   'cn-3-',\n            'num'   :   'num-1-',\n            'num1'  :   'num-2-',\n            'num2'  :   'num-3-',\n            'dash'  :   'dash',\n            'dot'   :   'dot'\n        };\n\n\n    utils.extend(this,{\n        liiconpath : 'http://bs.baidu.com/listicon/',\n        listDefaultPaddingLeft : '20'\n    });\n\n    var root = this.root,\n        ols = root.getElementsByTagName('ol'),\n        uls = root.getElementsByTagName('ul'),\n        selector = this.selector;\n\n    if(ols.length){\n        applyStyle.call(this,ols);\n    }\n\n    if(uls.length){\n        applyStyle.call(this,uls);\n    }\n\n    if(ols.length || uls.length){\n        customCss.push(selector +' .list-paddingleft-1{padding-left:0}');\n        customCss.push(selector +' .list-paddingleft-2{padding-left:'+ this.listDefaultPaddingLeft+'px}');\n        customCss.push(selector +' .list-paddingleft-3{padding-left:'+ this.listDefaultPaddingLeft*2+'px}');\n\n        utils.cssRule('list', selector +' ol,'+selector +' ul{margin:0;padding:0;}li{clear:both;}'+customCss.join('\\n'), document);\n    }\n    function applyStyle(nodes){\n        var T = this;\n        utils.each(nodes,function(list){\n            if(list.className && /custom_/i.test(list.className)){\n                var listStyle = list.className.match(/custom_(\\w+)/)[1];\n                if(listStyle == 'dash' || listStyle == 'dot'){\n                    utils.pushItem(customCss,selector +' li.list-' + customStyle[listStyle] + '{background-image:url(' + T.liiconpath +customStyle[listStyle]+'.gif)}');\n                    utils.pushItem(customCss,selector +' ul.custom_'+listStyle+'{list-style:none;} '+ selector +' ul.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}');\n\n                }else{\n                    var index = 1;\n                    utils.each(list.childNodes,function(li){\n                        if(li.tagName == 'LI'){\n                            utils.pushItem(customCss,selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + T.liiconpath  + 'list-'+customStyle[listStyle] +index + '.gif)}');\n                            index++;\n                        }\n                    });\n                    utils.pushItem(customCss,selector + ' ol.custom_'+listStyle+'{list-style:none;}'+selector+' ol.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}');\n                }\n                switch(listStyle){\n                    case 'cn':\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}');\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}');\n                        break;\n                    case 'cn1':\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:30px}');\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}');\n                        break;\n                    case 'cn2':\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:40px}');\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:55px}');\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:68px}');\n                        break;\n                    case 'num':\n                    case 'num1':\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}');\n                        break;\n                    case 'num2':\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:35px}');\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}');\n                        break;\n                    case 'dash':\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:35px}');\n                        break;\n                    case 'dot':\n                        utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:20px}');\n                }\n            }\n        });\n    }\n\n\n});\nUE.parse.register('vedio',function(utils){\n    var video = this.root.getElementsByTagName('video'),\n        audio = this.root.getElementsByTagName('audio');\n\n    document.createElement('video');document.createElement('audio');\n    if(video.length || audio.length){\n        var sourcePath = utils.removeLastbs(this.rootPath),\n            jsurl = sourcePath + '/third-party/video-js/video.js',\n            cssurl = sourcePath + '/third-party/video-js/video-js.min.css',\n            swfUrl = sourcePath + '/third-party/video-js/video-js.swf';\n\n        if(window.videojs) {\n            videojs.autoSetup();\n        } else {\n            utils.loadFile(document,{\n                id : \"video_css\",\n                tag : \"link\",\n                rel : \"stylesheet\",\n                type : \"text/css\",\n                href : cssurl\n            });\n            utils.loadFile(document,{\n                id : \"video_js\",\n                src : jsurl,\n                tag : \"script\",\n                type : \"text/javascript\"\n            },function(){\n                videojs.options.flash.swf = swfUrl;\n                videojs.autoSetup();\n            });\n        }\n\n    }\n});\n\n})();\n"
  },
  {
    "path": "static/common/wangeditor/wangeditor.css",
    "content": ":root,\n:host {\n  --w-e-textarea-bg-color: #fff;\n  --w-e-textarea-color: #333;\n  --w-e-textarea-border-color: #ccc;\n  --w-e-textarea-slight-border-color: #e8e8e8;\n  --w-e-textarea-slight-color: #d4d4d4;\n  --w-e-textarea-slight-bg-color: #f5f2f0;\n  --w-e-textarea-selected-border-color: #B4D5FF;\n  --w-e-textarea-handler-bg-color: #4290f7;\n  --w-e-toolbar-color: #595959;\n  --w-e-toolbar-bg-color: #fff;\n  --w-e-toolbar-active-color: #333;\n  --w-e-toolbar-active-bg-color: #f1f1f1;\n  --w-e-toolbar-disabled-color: #999;\n  --w-e-toolbar-border-color: #e8e8e8;\n  --w-e-modal-button-bg-color: #fafafa;\n  --w-e-modal-button-border-color: #d9d9d9;\n}\n\n.w-e-text-container *,.w-e-toolbar *{box-sizing:border-box;margin:0;outline:none;padding:0}.w-e-text-container blockquote,.w-e-text-container li,.w-e-text-container p,.w-e-text-container td,.w-e-text-container th,.w-e-toolbar *{line-height:1.5}.w-e-text-container{background-color:var(--w-e-textarea-bg-color);color:var(--w-e-textarea-color);height:100%;position:relative}.w-e-text-container .w-e-scroll{-webkit-overflow-scrolling:touch;height:100%}.w-e-text-container [data-slate-editor]{word-wrap:break-word;border-top:1px solid transparent;min-height:100%;outline:0;padding:0 10px;white-space:pre-wrap}.w-e-text-container [data-slate-editor] p{margin:15px 0}.w-e-text-container [data-slate-editor] h1,.w-e-text-container [data-slate-editor] h2,.w-e-text-container [data-slate-editor] h3,.w-e-text-container [data-slate-editor] h4,.w-e-text-container [data-slate-editor] h5{margin:20px 0}.w-e-text-container [data-slate-editor] img{cursor:default;display:inline!important;max-width:100%;min-height:20px;min-width:20px}.w-e-text-container [data-slate-editor] span{text-indent:0}.w-e-text-container [data-slate-editor] [data-selected=true]{box-shadow:0 0 0 2px var(--w-e-textarea-selected-border-color)}.w-e-text-placeholder{font-style:italic;left:10px;top:17px;width:90%}.w-e-max-length-info,.w-e-text-placeholder{color:var(--w-e-textarea-slight-color);pointer-events:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.w-e-max-length-info{bottom:.5em;right:1em}.w-e-bar{background-color:var(--w-e-toolbar-bg-color);color:var(--w-e-toolbar-color);font-size:14px;padding:0 5px}.w-e-bar svg{fill:var(--w-e-toolbar-color);height:14px;width:14px}.w-e-bar-show{display:flex}.w-e-bar-hidden{display:none}.w-e-hover-bar{border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 5px #0000001f;position:absolute}.w-e-toolbar{flex-wrap:wrap;position:relative}.w-e-bar-divider{background-color:var(--w-e-toolbar-border-color);display:inline-flex;height:40px;margin:0 5px;width:1px}.w-e-bar-item{display:flex;height:40px;padding:4px;position:relative;text-align:center}.w-e-bar-item,.w-e-bar-item button{align-items:center;justify-content:center}.w-e-bar-item button{background:transparent;border:none;color:var(--w-e-toolbar-color);cursor:pointer;display:inline-flex;height:32px;overflow:hidden;padding:0 8px;white-space:nowrap}.w-e-bar-item button:hover{background-color:var(--w-e-toolbar-active-bg-color);color:var(--w-e-toolbar-active-color)}.w-e-bar-item button .title{margin-left:5px}.w-e-bar-item .active{background-color:var(--w-e-toolbar-active-bg-color);color:var(--w-e-toolbar-active-color)}.w-e-bar-item .disabled{color:var(--w-e-toolbar-disabled-color);cursor:not-allowed}.w-e-bar-item .disabled svg{fill:var(--w-e-toolbar-disabled-color)}.w-e-bar-item .disabled:hover{background-color:var(--w-e-toolbar-bg-color);color:var(--w-e-toolbar-disabled-color)}.w-e-bar-item .disabled:hover svg{fill:var(--w-e-toolbar-disabled-color)}.w-e-menu-tooltip-v5:before{background-color:var(--w-e-toolbar-active-color);border-radius:5px;color:var(--w-e-toolbar-bg-color);content:attr(data-tooltip);font-size:.75em;opacity:0;padding:5px 10px;position:absolute;text-align:center;top:40px;transition:opacity .6s;visibility:hidden;white-space:pre;z-index:1}.w-e-menu-tooltip-v5:after{border:5px solid transparent;border-bottom:5px solid var(--w-e-toolbar-active-color);content:\"\";opacity:0;position:absolute;top:30px;transition:opacity .6s;visibility:hidden}.w-e-menu-tooltip-v5:hover:after,.w-e-menu-tooltip-v5:hover:before{opacity:1;visibility:visible}.w-e-menu-tooltip-v5.tooltip-right:before{left:100%;top:10px}.w-e-menu-tooltip-v5.tooltip-right:after{border-bottom-color:transparent;border-left-color:transparent;border-right-color:var(--w-e-toolbar-active-color);border-top-color:transparent;left:100%;margin-left:-10px;top:16px}.w-e-bar-item-group .w-e-bar-item-menus-container{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;display:none;left:0;margin-top:40px;position:absolute;top:0;z-index:1}.w-e-bar-item-group:hover .w-e-bar-item-menus-container{display:block}.w-e-select-list{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;left:0;margin-top:40px;max-height:350px;min-width:100px;overflow-y:auto;position:absolute;top:0;z-index:1}.w-e-select-list ul{line-height:1;list-style:none}.w-e-select-list ul .selected{background-color:var(--w-e-toolbar-active-bg-color)}.w-e-select-list ul li{cursor:pointer;padding:7px 0 7px 25px;position:relative;text-align:left;white-space:nowrap}.w-e-select-list ul li:hover{background-color:var(--w-e-toolbar-active-bg-color)}.w-e-select-list ul li svg{left:0;margin-left:5px;margin-top:-7px;position:absolute;top:50%}.w-e-bar-bottom .w-e-select-list{bottom:0;margin-bottom:40px;margin-top:0;top:inherit}.w-e-drop-panel{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;margin-top:40px;min-width:200px;padding:10px;position:absolute;top:0;z-index:1}.w-e-bar-bottom .w-e-drop-panel{bottom:0;margin-bottom:40px;margin-top:0;top:inherit}.w-e-modal{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;color:var(--w-e-toolbar-color);font-size:14px;min-height:40px;min-width:100px;padding:20px 15px 0;position:absolute;text-align:left;z-index:1}.w-e-modal .btn-close{cursor:pointer;line-height:1;padding:5px;position:absolute;right:8px;top:7px}.w-e-modal .btn-close svg{fill:var(--w-e-toolbar-color);height:10px;width:10px}.w-e-modal .babel-container{display:block;margin-bottom:15px}.w-e-modal .babel-container span{display:block;margin-bottom:10px}.w-e-modal .button-container{margin-bottom:15px}.w-e-modal button{background-color:var(--w-e-modal-button-bg-color);border:1px solid var(--w-e-modal-button-border-color);border-radius:4px;color:var(--w-e-toolbar-color);cursor:pointer;font-weight:400;height:32px;padding:4.5px 15px;text-align:center;touch-action:manipulation;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.w-e-modal input[type=number],.w-e-modal input[type=text],.w-e-modal textarea{font-feature-settings:\"tnum\";background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-modal-button-border-color);border-radius:4px;color:var(--w-e-toolbar-color);font-variant:tabular-nums;padding:4.5px 11px;transition:all .3s;width:100%}.w-e-modal textarea{min-height:60px}body .w-e-modal,body .w-e-modal *{box-sizing:border-box}.w-e-progress-bar{background-color:var(--w-e-textarea-handler-bg-color);height:1px;position:absolute;transition:width .3s;width:0}.w-e-full-screen-container{bottom:0!important;display:flex!important;flex-direction:column!important;height:100%!important;left:0!important;margin:0!important;padding:0!important;position:fixed;right:0!important;top:0!important;width:100%!important}.w-e-full-screen-container [data-w-e-textarea=true]{flex:1!important}\n.w-e-text-container [data-slate-editor] code{background-color:var(--w-e-textarea-slight-bg-color);border-radius:3px;font-family:monospace;padding:3px}.w-e-panel-content-color{list-style:none;text-align:left;width:230px}.w-e-panel-content-color li{border:1px solid var(--w-e-toolbar-bg-color);border-radius:3px 3px;cursor:pointer;display:inline-block;padding:2px}.w-e-panel-content-color li:hover{border-color:var(--w-e-toolbar-color)}.w-e-panel-content-color li .color-block{border:1px solid var(--w-e-toolbar-border-color);border-radius:3px 3px;height:17px;width:17px}.w-e-panel-content-color .active{border-color:var(--w-e-toolbar-color)}.w-e-panel-content-color .clear{line-height:1.5;margin-bottom:5px;width:100%}.w-e-panel-content-color .clear svg{height:16px;margin-bottom:-4px;width:16px}.w-e-text-container [data-slate-editor] blockquote{background-color:var(--w-e-textarea-slight-bg-color);border-left:8px solid var(--w-e-textarea-selected-border-color);display:block;font-size:100%;line-height:1.5;margin:10px 0;padding:10px}.w-e-panel-content-emotion{font-size:20px;list-style:none;text-align:left;width:300px}.w-e-panel-content-emotion li{border-radius:3px 3px;cursor:pointer;display:inline-block;padding:0 5px}.w-e-panel-content-emotion li:hover{background-color:var(--w-e-textarea-slight-bg-color)}.w-e-textarea-divider{border-radius:3px;margin:20px auto;padding:20px}.w-e-textarea-divider hr{background-color:var(--w-e-textarea-border-color);border:0;display:block;height:1px}.w-e-text-container [data-slate-editor] pre>code{background-color:var(--w-e-textarea-slight-bg-color);border:1px solid var(--w-e-textarea-slight-border-color);border-radius:4px 4px;display:block;font-size:14px;padding:10px;text-indent:0}.w-e-text-container [data-slate-editor] .w-e-image-container{display:inline-block;margin:0 3px}.w-e-text-container [data-slate-editor] .w-e-image-container:hover{box-shadow:0 0 0 2px var(--w-e-textarea-selected-border-color)}.w-e-text-container [data-slate-editor] .w-e-selected-image-container{overflow:hidden;position:relative}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .w-e-image-dragger{background-color:var(--w-e-textarea-handler-bg-color);height:7px;position:absolute;width:7px}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .left-top{cursor:nwse-resize;left:0;top:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .right-top{cursor:nesw-resize;right:0;top:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .left-bottom{bottom:0;cursor:nesw-resize;left:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .right-bottom{bottom:0;cursor:nwse-resize;right:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container:hover{box-shadow:none}.w-e-text-container [contenteditable=false] .w-e-image-container:hover{box-shadow:none}\n\n.w-e-text-container [data-slate-editor] .table-container{border:1px dashed var(--w-e-textarea-border-color);border-radius:5px;margin-top:10px;overflow-x:auto;padding:10px;width:100%}.w-e-text-container [data-slate-editor] table{border-collapse:collapse}.w-e-text-container [data-slate-editor] table td,.w-e-text-container [data-slate-editor] table th{border:1px solid var(--w-e-textarea-border-color);line-height:1.5;min-width:30px;padding:3px 5px;text-align:left}.w-e-text-container [data-slate-editor] table th{background-color:var(--w-e-textarea-slight-bg-color);font-weight:700;text-align:center}.w-e-panel-content-table{background-color:var(--w-e-toolbar-bg-color)}.w-e-panel-content-table table{border-collapse:collapse}.w-e-panel-content-table td{border:1px solid var(--w-e-toolbar-border-color);cursor:pointer;height:15px;padding:3px 5px;width:20px}.w-e-panel-content-table td.active{background-color:var(--w-e-toolbar-active-bg-color)}\n.w-e-textarea-video-container{background-image:linear-gradient(45deg,#eee 25%,transparent 0,transparent 75%,#eee 0,#eee),linear-gradient(45deg,#eee 25%,#fff 0,#fff 75%,#eee 0,#eee);background-position:0 0,10px 10px;background-size:20px 20px;border:1px dashed var(--w-e-textarea-border-color);border-radius:5px;margin:10px auto 0;padding:10px 0;text-align:center}\n\n.w-e-text-container [data-slate-editor] pre>code{word-wrap:normal;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;-webkit-hyphens:none;hyphens:none;line-height:1.5;margin:.5em 0;overflow:auto;padding:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;text-shadow:0 1px #fff;white-space:pre;word-break:normal;word-spacing:normal}.w-e-text-container [data-slate-editor] pre>code .token.cdata,.w-e-text-container [data-slate-editor] pre>code .token.comment,.w-e-text-container [data-slate-editor] pre>code .token.doctype,.w-e-text-container [data-slate-editor] pre>code .token.prolog{color:#708090}.w-e-text-container [data-slate-editor] pre>code .token.punctuation{color:#999}.w-e-text-container [data-slate-editor] pre>code .token.namespace{opacity:.7}.w-e-text-container [data-slate-editor] pre>code .token.boolean,.w-e-text-container [data-slate-editor] pre>code .token.constant,.w-e-text-container [data-slate-editor] pre>code .token.deleted,.w-e-text-container [data-slate-editor] pre>code .token.number,.w-e-text-container [data-slate-editor] pre>code .token.property,.w-e-text-container [data-slate-editor] pre>code .token.symbol,.w-e-text-container [data-slate-editor] pre>code .token.tag{color:#905}.w-e-text-container [data-slate-editor] pre>code .token.attr-name,.w-e-text-container [data-slate-editor] pre>code .token.builtin,.w-e-text-container [data-slate-editor] pre>code .token.char,.w-e-text-container [data-slate-editor] pre>code .token.inserted,.w-e-text-container [data-slate-editor] pre>code .token.selector,.w-e-text-container [data-slate-editor] pre>code .token.string{color:#690}.w-e-text-container [data-slate-editor] pre>code .language-css .token.string,.w-e-text-container [data-slate-editor] pre>code .style .token.string,.w-e-text-container [data-slate-editor] pre>code .token.entity,.w-e-text-container [data-slate-editor] pre>code .token.operator,.w-e-text-container [data-slate-editor] pre>code .token.url{color:#9a6e3a}.w-e-text-container [data-slate-editor] pre>code .token.atrule,.w-e-text-container [data-slate-editor] pre>code .token.attr-value,.w-e-text-container [data-slate-editor] pre>code .token.keyword{color:#07a}.w-e-text-container [data-slate-editor] pre>code .token.class-name,.w-e-text-container [data-slate-editor] pre>code .token.function{color:#dd4a68}.w-e-text-container [data-slate-editor] pre>code .token.important,.w-e-text-container [data-slate-editor] pre>code .token.regex,.w-e-text-container [data-slate-editor] pre>code .token.variable{color:#e90}.w-e-text-container [data-slate-editor] pre>code .token.bold,.w-e-text-container [data-slate-editor] pre>code .token.important{font-weight:700}.w-e-text-container [data-slate-editor] pre>code .token.italic{font-style:italic}.w-e-text-container [data-slate-editor] pre>code .token.entity{cursor:help}"
  },
  {
    "path": "static/default/assets/css/Projects-Horizontal.css",
    "content": ".projects-horizontal {\n  color: #313437;\n  background-color: #fff;\n}\n\n.projects-horizontal p {\n  color: #7d8285;\n}\n\n.projects-horizontal h2 {\n  font-weight: bold;\n  margin-bottom: 40px;\n  padding-top: 40px;\n  color: inherit;\n}\n\n@media (max-width:767px) {\n  .projects-horizontal h2 {\n    margin-bottom: 25px;\n    padding-top: 25px;\n    font-size: 24px;\n  }\n}\n\n.projects-horizontal .intro {\n  font-size: 16px;\n  max-width: 500px;\n  margin: 0 auto 10px;\n}\n\n.projects-horizontal .projects {\n  padding-bottom: 40px;\n}\n\n.projects-horizontal .item {\n  padding-top: 60px;\n  min-height: 160px;\n}\n\n@media (max-width:767px) {\n  .projects-horizontal .item {\n    padding-top: 40px;\n    min-height: 160px;\n  }\n}\n\n.projects-horizontal .item .name {\n  font-size: 18px;\n  font-weight: bold;\n  margin-top: 10px;\n  margin-bottom: 15px;\n  color: inherit;\n}\n\n@media (max-width:991px) {\n  .projects-horizontal .item .name {\n    margin-top: 22px;\n  }\n}\n\n.projects-horizontal .item .description {\n  font-size: 15px;\n  margin-bottom: 0;\n}\n\n"
  },
  {
    "path": "static/default/assets/css/css.css",
    "content": "/* cyrillic-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRxC7mw9c.woff2) format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRzS7mw9c.woff2) format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRxi7mw9c.woff2) format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRxy7mw9c.woff2) format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 400;\n  src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRyS7m.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 600;\n  src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz8fZwnCo.woff2) format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 600;\n  src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz-PZwnCo.woff2) format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 600;\n  src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz8_ZwnCo.woff2) format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 600;\n  src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz8vZwnCo.woff2) format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 600;\n  src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz_PZw.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz8fZwnCo.woff2) format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz-PZwnCo.woff2) format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz8_ZwnCo.woff2) format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz8vZwnCo.woff2) format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz_PZw.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2) format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2) format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2) format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2) format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 600;\n  src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3gTD_u50.woff2) format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 600;\n  src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3g3D_u50.woff2) format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 600;\n  src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3gbD_u50.woff2) format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 600;\n  src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3gfD_u50.woff2) format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 600;\n  src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3gnD_g.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gTD_u50.woff2) format('woff2');\n  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3g3D_u50.woff2) format('woff2');\n  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* vietnamese */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gbD_u50.woff2) format('woff2');\n  unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gfD_u50.woff2) format('woff2');\n  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Montserrat';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gnD_g.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n"
  },
  {
    "path": "static/default/assets/css/smoothproducts.css",
    "content": "html, body {\n  height: 100%;\n  width: 100%;\n}\n\n.sp-loading {\n  text-align: center;\n  max-width: 270px;\n  padding: 15px;\n  border: 5px solid #eee;\n  border-radius: 3px;\n  font-size: 12px;\n  color: #888;\n}\n\n.sp-wrap {\n  display: none;\n  line-height: 0;\n  font-size: 0;\n  background: #eee;\n  border: 5px solid #eee;\n  border-radius: 3px;\n  position: relative;\n  margin: 0 25px 15px 0;\n  float: left;\n  max-width: 300px;\n}\n\n.sp-thumbs {\n  text-align: left;\n  display: inline-block;\n}\n\n.sp-thumbs img {\n  min-height: 50px;\n  min-width: 50px;\n  max-width: 50px;\n}\n\n.sp-thumbs a:link, .sp-thumbs a:visited {\n  width: 50px;\n  height: 50px;\n  overflow: hidden;\n  opacity: .3;\n  display: inline-block;\n  background-size: cover;\n  background-position: center;\n  -webkit-transition: all .2s ease-out;\n  -moz-transition: all .2s ease-out;\n  -ms-transition: all .2s ease-out;\n  -o-transition: all .2s ease-out;\n  transition: all .2s ease-out;\n}\n\n.sp-thumbs a:hover {\n  opacity: 1;\n}\n\n.sp-thumbs a:active, .sp-current {\n  opacity: 1!important;\n  position: relative;\n}\n\n.sp-large {\n  position: relative;\n  overflow: hidden;\n  top: 0;\n  left: 0;\n}\n\n.sp-large a img {\n  max-width: 100%;\n  height: auto;\n}\n\n.sp-large a {\n  display: block;\n}\n\n.sp-zoom {\n  position: absolute;\n  left: -50%;\n  top: -50%;\n  cursor: -webkit-zoom-in;\n  cursor: -moz-zoom-in;\n  cursor: zoom-in;\n  display: none;\n}\n\n.sp-lightbox {\n  position: fixed;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  background: rgb(0, 0, 0);\n  background: rgba(0, 0, 0, .9);\n  z-index: 1031;\n  display: none;\n  cursor: pointer;\n}\n\n.sp-lightbox img {\n  position: absolute;\n  margin: auto;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  max-width: 90%;\n  max-height: 90%;\n  border: 2px solid #fff;\n}\n\n#sp-prev, #sp-next {\n  position: absolute;\n  top: 50%;\n  margin-top: -25px;\n  z-index: 501;\n  color: #fff;\n  padding: 14px;\n  text-decoration: none;\n  background: #000;\n  border-radius: 25px;\n  border: 2px solid #fff;\n  width: 50px;\n  height: 50px;\n  box-sizing: border-box;\n  transition: .2s;\n}\n\n#sp-prev {\n  left: 10px;\n}\n\n#sp-prev:before {\n  content: '';\n  border: 7px solid transparent;\n  border-right: 15px solid #fff;\n  position: absolute;\n  top: 16px;\n  left: 7px;\n}\n\n#sp-next {\n  right: 10px;\n}\n\n#sp-next:before {\n  content: '';\n  border: 7px solid transparent;\n  border-left: 15px solid white;\n  position: absolute;\n  top: 16px;\n  left: 18px;\n}\n\n#sp-prev:hover, #sp-next:hover {\n  background: #444;\n}\n\n@media screen and (max-width: 400px) {\n  .sp-wrap {\n    margin: 0 0 15px 0;\n  }\n}\n\n@media screen and (max-width: 400px) {\n  #sp-prev, #sp-next {\n    top: auto;\n    margin-top: 0;\n    bottom: 25px;\n  }\n}\n\n"
  },
  {
    "path": "static/default/assets/js/theme.js",
    "content": "// Custome theme code\n\nif ($('.clean-gallery').length > 0) {\n   baguetteBox.run('.clean-gallery', { animation: 'slideIn'});\n}\n\nif ($('.clean-product').length > 0) {\n    $(window).on(\"load\",function() {\n        $('.sp-wrap').smoothproducts();\n    });\n}\n\n"
  },
  {
    "path": "web.config",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <system.webServer>\n        <rewrite>\n            <rules>\n                <rule name=\"allow_rules\" enabled=\"true\" stopProcessing=\"true\">\n                    <match url=\"^(.*)$\" ignoreCase=\"false\" />\n                    <conditions logicalGrouping=\"MatchAll\" trackAllCaptures=\"false\">\n                        <add input=\"{REQUEST_FILENAME}\" matchType=\"IsDirectory\" ignoreCase=\"false\" negate=\"true\" />\n                        <add input=\"{REQUEST_FILENAME}\" matchType=\"IsFile\" ignoreCase=\"false\" negate=\"true\" />\n                    </conditions>\n                    <action type=\"Rewrite\" url=\"index.php/{R:1}\" appendQueryString=\"true\" />\n                </rule>\n            </rules>\n        </rewrite>\n    </system.webServer>\n</configuration>"
  }
]